如何将sklearn.naive_bayes与(多个)分类功能一起使用?

时间:2016-07-27 18:54:52

标签: machine-learning statistics scikit-learn naivebayes

我想学习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变量,加上几个分类变量。但这里没有“计数”的概念。

示例:课程是喜欢或不喜欢数学的人。预测者是大学专业(分类),他们是否去研究生院(布尔)。

我不认为这适合多项式,因为这里没有任何重要性。

2 个答案:

答案 0 :(得分:15)

  

某些功能是布尔值,但其他功能是分类的,可以采用少量值(~5)。

这是一个有趣的问题,但它实际上不止一个:

  1. 如何处理NB中的分类功能。
  2. 如何处理NB中的非同类特征(并且,正如我在下文中指出的,即使两个分类特征也是非同质的)。
  3. 如何在sklearn
  4. 中执行此操作

    首先考虑单个分类功能。 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列的事实现在并不意味着假设独立。

    现在考虑一下你有一个由几个特征组成的数据集的情况:

    1. 范畴
    2. 伯努利
    3. 正常
    4. 在使用NB的假设下,这些变量是独立的。因此,您可以执行以下操作:

      1. 使用虚拟变量和多项NB,分别为每个分类数据构建一个NB分类器。
      2. 一次为所有伯努利数据构建一个NB分类器 - 这是因为sklearn的伯努利NB只是几个单功能伯努利NB的捷径。
      3. 与所有正常功能相同。
      4. 通过定义独立性,实例的概率是这些分类器的实例概率的乘积。

答案 1 :(得分:0)

    scikit-learn的
  1. CategoricalNB是要在naive_bayes模块中添加的新类。它在每晚的here版本中。

  2. 混合的朴素贝叶斯(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处以类似的问题查看我的回答。