我想学习Naive Bayes模型,解决类是布尔值的问题(取两个值中的一个)。一些功能是布尔值,但其他功能是分类的,可以采用少量值(~5)。
如果我的所有功能都是布尔值,那么我想使用sklearn.naive_bayes.BernoulliNB
。很明显,sklearn.naive_bayes.MultinomialNB
不是我想要的东西。
一种解决方案是将我的分类功能拆分为布尔功能。例如,如果变量“X”取值“红色”,“绿色”,“蓝色”,我可以有三个变量:“X是红色”,“X是绿色”,“X是蓝色”。这违反了给予班级变量的条件独立性假设,因此看起来完全不合适。
另一种可能性是将变量编码为实值变量,其中0.0表示红色,1.0表示绿色,2.0表示蓝色。使用GaussianNB似乎完全不合适(原因很明显)。
我想做的事情似乎并不奇怪,但我不明白如何将它融入sklearn给我的Naive Bayes模型中。我自己编写代码很容易,但是如果可能的话,我更喜欢使用sklearn,原因很明显(大多数:避免错误)。
[编辑解释为什么我不认为多项式NB是我想要的]:
我的理解是,在多项NB中,特征向量包含在k
iid样本中观察到令牌的次数。
我的理解是,这适用于分类文档,其中存在基础类文档,然后假定文档中的每个单词都是从特定于该类的分类分布中提取的。文档将具有k
个标记,特征向量的长度将等于词汇量大小,并且要素计数的总和将为k
。
在我的情况下,我有一些bernoulli变量,加上几个分类变量。但这里没有“计数”的概念。
示例:课程是喜欢或不喜欢数学的人。预测者是大学专业(分类),他们是否去研究生院(布尔)。
我不认为这适合多项式,因为这里没有任何重要性。
答案 0 :(得分:15)
某些功能是布尔值,但其他功能是分类的,可以采用少量值(~5)。
这是一个有趣的问题,但它实际上不止一个:
sklearn
。首先考虑单个分类功能。 NB假定/简化功能是独立的。您将此转换为几个二进制变量的想法正是dummy variables的想法。显然,这些虚拟变量不是独立的。你在结果上运行伯努利NB的想法隐含地假设独立。虽然众所周知,在实践中,NB在面对因变量时并不一定会破坏,但没有理由尝试将问题转换为NB的最差配置,尤其是多项式NB是一种非常简单的替代方案。
相反,假设在使用虚拟变量将单个分类变量转换为多列数据集之后,您使用多项NB。多项式NB的理论states:
对于多项事件模型,样本(特征向量)表示由多项式生成某些事件的频率...其中p i是事件i发生的概率。然后,特征向量...是直方图,其中x i {\ displaystyle x_ {i}} x_ {i}计算在特定实例中观察到事件i的次数。这是通常用于文档分类的事件模型,其中事件表示单个文档中单词的出现(参见词袋假设)。
因此,在这里,您的单个分类变量的每个实例都是“长度为1的段落”,并且分布完全是多项式的。具体来说,每一行在一个位置都有1个,在所有其他位置都是0,因为长度为1的段落必须只有一个单词,所以这些就是频率。
请注意,从sklearn
多项式NB的角度来看,数据集为5列的事实现在并不意味着假设独立。
现在考虑一下你有一个由几个特征组成的数据集的情况:
在使用NB的假设下,这些变量是独立的。因此,您可以执行以下操作:
sklearn
的伯努利NB只是几个单功能伯努利NB的捷径。通过定义独立性,实例的概率是这些分类器的实例概率的乘积。
答案 1 :(得分:0)
CategoricalNB
是要在naive_bayes模块中添加的新类。它在每晚的here版本中。
混合的朴素贝叶斯(https://github.com/remykarem/mixed-naive-bayes)。可以在训练数据特征上假设混合了高斯分布和分类(multinoulli)分布。该库的编写使API与scikit-learn相似。
from mixed_naive_bayes import MixedNB
X = [[0, 0],
[1, 1],
[2, 1],
[1, 1],
[0, 2]]
y = [0, 0, 1, 1, 0]
clf = MixedNB(categorical_features='all')
clf.fit(X,y)
clf.predict(X)
在https://stackoverflow.com/a/58428035/4570466处以类似的问题查看我的回答。