我正在处理一个分类数据集,如下所示:
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-学习Bernoulli朴素贝叶斯模型来预测用户下载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的数据点,我希望算法忽略该类别,并且只使用计算中显示的那些类别。
我从以下问题中了解到:1,在处理丢失的值时,本质上有三个选项:
NaN (即删除行),则忽略数据点。然而,由于以下原因,这不是最好的选择:
missing value添加到概率计算中,如果我将Nan替换为-1,就会发生这种情况。我还使用了一个Bernoulli朴素贝叶斯,所以据我所知,这需要单个的0 or 1值。回答这里指出,最好的方法是,在计算概率时,如果该类别是缺失值,则忽略它(本质上您是说:只根据我提供的不缺失值的特定类别计算概率)。
我不知道如何编码时,使用scikit-学习朴素贝叶斯模型,是否这样做作为一个缺失的值。
到目前为止,我的情况如下:
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)显然,由于当前的NaNs,这将返回一个错误。那么,我如何调整scikit-学习Bernoulli模型,以自动忽略NaNs的列,而只使用0或1的列呢?
我意识到这在股票模型中可能是不可能的,而回顾文档似乎表明了这一点。因此,这可能需要大量的编码,所以我要说的是:我并不要求有人去编写这个代码(我也不期望);我希望被指向正确的方向,例如,如果有人遇到了这个问题/他们如何处理它/相关的博客或教程文章(我的搜索没有发现任何结果)。
提前谢谢-感谢你的阅读。
发布于 2019-04-19 05:38:07
您的搜索结果很重要:如果不删除或计算数据,就没有内置的方式来使用BernoulliNB来做您想做的事情。
然而,有一条出路:从你的数据中对过滤过的样本分别进行贝叶斯模型的训练,然后通过堆叠它们来组合它们的预测。
这里的过滤意味着:
df中分离样本,每个样本都只有一个df.columns子集。这样,您将只有一个DataFrame用于content_2,一个用于content_2, content_3,在某种程度上是对列的阶乘组合。NaN**s的行组成。在您的例子中,这个部分有点简单,但是有点冗长:您将有n! (n阶乘)列的组合,每个列都会产生一个单独的示例。例如,您可以有一个名为df_c2的示例,它只包含值为0或1的content_2行,只填充了content_2和content_3列的df_c2_c3,等等。
这些示例将使NaN值不存在于您所培训的每一个模型。以一种聪明的方式实现这个方法可能很麻烦,所以我建议从最简单的场景开始--例如两个示例,两个模型;您将逐步改进,并在代码中找到一个可靠的解决方案。
这被称为贝叶斯模型平均( Bayesian,BMA),作为一个概念,它被彻底解决了在本文中。在那里,贝叶斯模型预测的权重是它的后验概率。
内容可以是压倒性的吸收一次,要放心,如果其中的一些不坚持你。这里的要点是,您将把每个模型的预测概率乘以一个权重0 < w < 1,然后乘以和(和结果将在[0, 1]中)。一开始,你可以根据经验确定权重,看看它能给你带来什么。
由于我提出的解决方案更复杂,正如这个(也是有用的)答案中所述,您可以选择用纯Python实现朴素的Bayes,因为它并不复杂(而且有很多教程可供参考)。这会让算法更容易适应你的需要。
发布于 2021-07-24 20:51:20
一个选择是科学知识-学习的sklearn.impute.IterativeImputer。initial_strategy可以设置为"most_frequent“,这是对伯努利功能发布进行建模的一种有用方法。
https://datascience.stackexchange.com/questions/40084
复制相似问题