首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理贝努利朴素贝叶斯丢失的数据?

如何处理贝努利朴素贝叶斯丢失的数据?
EN

Data Science用户
提问于 2018-10-23 10:14:35
回答 2查看 2.6K关注 0票数 6

我正在处理一个分类数据集,如下所示:

代码语言:javascript
复制
    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的所有数据,因为我显然只对用户主动做出决定的数据点感兴趣。这提供了如下数据:

代码语言:javascript
复制
    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,在处理丢失的值时,本质上有三个选项:

  1. 如果任何类别包含NaN (即删除行),则忽略数据点。
  2. 计算其他占位符值(例如-1等)或
  3. 计算与整个数据集分布相对应的一些平均值。

然而,由于以下原因,这不是最好的选择:

  1. 每一行至少包含1 NaN。这意味着,在这种安排下,我将丢弃整个数据集。很明显是拒绝了。
  2. 我不希望missing value添加到概率计算中,如果我将Nan替换为-1,就会发生这种情况。我还使用了一个Bernoulli朴素贝叶斯,所以据我所知,这需要单个的0 or 1值。
  3. 因为这是分类数据,所以我这样做是没有意义的(不管是看到了还是没有看到,如果没有,就不需要了)。

回答这里指出,最好的方法是,在计算概率时,如果该类别是缺失值,则忽略它(本质上您是说:只根据我提供的不缺失值的特定类别计算概率)。

我不知道如何编码时,使用scikit-学习朴素贝叶斯模型,是否这样做作为一个缺失的值。

到目前为止,我的情况如下:

代码语言:javascript
复制
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的列呢?

我意识到这在股票模型中可能是不可能的,而回顾文档似乎表明了这一点。因此,这可能需要大量的编码,所以我要说的是:我并不要求有人去编写这个代码(我也不期望);我希望被指向正确的方向,例如,如果有人遇到了这个问题/他们如何处理它/相关的博客或教程文章(我的搜索没有发现任何结果)。

提前谢谢-感谢你的阅读。

EN

回答 2

Data Science用户

发布于 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_2content_3列的df_c2_c3,等等。

这些示例将使NaN值不存在于您所培训的每一个模型。以一种聪明的方式实现这个方法可能很麻烦,所以我建议从最简单的场景开始--例如两个示例,两个模型;您将逐步改进,并在代码中找到一个可靠的解决方案。

叠加贝叶斯模型

这被称为贝叶斯模型平均( Bayesian,BMA),作为一个概念,它被彻底解决了在本文中。在那里,贝叶斯模型预测的权重是它的后验概率。

内容可以是压倒性的吸收一次,要放心,如果其中的一些不坚持你。这里的要点是,您将把每个模型的预测概率乘以一个权重0 < w < 1,然后乘以和(和结果将在[0, 1]中)。一开始,你可以根据经验确定权重,看看它能给你带来什么。

编辑:

由于我提出的解决方案更复杂,正如这个(也是有用的)答案中所述,您可以选择用纯Python实现朴素的Bayes,因为它并不复杂(而且有很多教程可供参考)。这会让算法更容易适应你的需要。

票数 0
EN

Data Science用户

发布于 2021-07-24 20:51:20

一个选择是科学知识-学习的sklearn.impute.IterativeImputerinitial_strategy可以设置为"most_frequent“,这是对伯努利功能发布进行建模的一种有用方法。

票数 0
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/40084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档