我正在处理一个如下所示的分类数据数据集:
content_1 content_2 content_4 content_5 content_6
0 NaN 0.0 0.0 0.0 NaN
1 NaN 0.0 0.0 0.0 NaN
2 NaN NaN NaN NaN NaN
3 0.0 NaN 0.0 NaN 0.0
这些代表用户从 Intranet 下载,其中向用户展示了下载特定内容的机会。1表示用户看到内容并下载它,0表示用户看到内容但没有下载它,并且NaN表示用户没有看到/没有显示那条内容。
我正在尝试使用 scikit-learn Bernoulli Naive Bayes 模型来预测用户下载的概率content_1,假设他们已经看到下载/未下载content_2-7。
我已经删除了所有content_1等于的数据,NaN因为我显然只对用户主动做出决定的数据点感兴趣。这给出的数据如下:
content_1 content_2 content_3 content_4 content_5 content_6
0 1.0 NaN 1.0 NaN NaN 1.0
1 0.0 NaN NaN 0.0 1.0 0.0
2 1.0 0.0 NaN NaN NaN 1.0
在上述框架中,NaN, 是一个缺失值。对于Nan存在 a 的数据点,我希望算法忽略该类别,并仅使用计算中存在的那些类别。
我从这些问题中知道:1,在处理缺失值时基本上有 3 个选项:
- 如果任何类别包含a,则忽略数据点
NaN(即删除该行) - 插补一些其他占位符值(例如 -1 等)或
- 估算与整个数据集分布相对应的一些平均值。
但是,由于以下原因,这些都不是最佳选择:
- 每行至少包含 1 个 NaN。这意味着,在这种安排下,我将丢弃整个数据集。显然不行。
- 我不希望
missing value添加到概率计算中,如果我Nan用 -1 替换就会发生这种情况。我也在使用伯努利朴素贝叶斯,所以据我所知,这需要单独的0 or 1值。 - 由于这是分类数据,因此以这种方式这样做对我来说没有意义(它要么被看到,要么没有,如果没有,则不需要)。
这里的答案表明,做到这一点的最佳方法是,在计算概率时,如果它是一个缺失值,则忽略该类别(基本上你是在说:仅根据我提供的具有非缺失值的特定类别计算概率)。
我不知道在使用 scikit-learn 朴素贝叶斯模型时如何对此进行编码,是否将其作为缺失值进行编码。
这是我到目前为止所拥有的:
df=pd.read_clipboard()
from sklearn import datasets
from sklearn.naive_bayes import BernoulliNB
# Create train input / output data
y_train = df['content_1'].values
X_train = df.drop('content_1', axis=1).values
# Loud Bernoulli Naive Bayes model
clf = BernoulliNB()
clf.fit(X_train, y_train)
显然,由于 present ,这会返回一个错误NaNs。那么如何调整 scikit-learn Bernoulli 模型以自动忽略带有 的列NaNs,而只选择带有 0 或 1 的列?
我知道这对于库存模型可能是不可能的,并且查看文档似乎表明了这一点。因此,这可能需要大量编码,所以我会这样说:我不是要求某人去编码(我也不期望它);我希望被指出正确的方向,例如,如果有人遇到过这个问题/他们如何解决这个问题/相关的博客或教程帖子(我的搜索结果一无所获)。
在此先感谢-感谢您的阅读。