Machine learning 如何将sklearn.naive_bayes与(多个)分类功能结合使用?

Machine learning 如何将sklearn.naive_bayes与(多个)分类功能结合使用?,machine-learning,statistics,scikit-learn,naivebayes,Machine Learning,Statistics,Scikit Learn,Naivebayes,我想学习一个朴素的贝叶斯模型来解决一个问题,其中类是布尔型的(采用两个值中的一个)。其中一些功能是布尔型的,但其他功能是分类的,可以使用少量值(~5) 如果我所有的特性都是布尔型的,那么我想使用sklearn.naive\u bayes.BernoulliNB。显然,sklearn.naiver_bayes.MultinomialNB不是我想要的 一种解决方案是将我的分类特征拆分为布尔特征。例如,如果变量“X”的值为“red”、“green”、“blue”,那么我可以有三个变量:“X是红色的”、

我想学习一个朴素的贝叶斯模型来解决一个问题,其中类是布尔型的(采用两个值中的一个)。其中一些功能是布尔型的,但其他功能是分类的,可以使用少量值(~5)

如果我所有的特性都是布尔型的,那么我想使用
sklearn.naive\u bayes.BernoulliNB
。显然,
sklearn.naiver_bayes.MultinomialNB
不是我想要的

一种解决方案是将我的分类特征拆分为布尔特征。例如,如果变量“X”的值为“red”、“green”、“blue”,那么我可以有三个变量:“X是红色的”、“X是绿色的”、“X是蓝色的”。这违反了给定类的变量的条件独立性假设,因此它似乎完全不合适

另一种可能是将变量编码为实值变量,其中0.0表示红色,1.0表示绿色,2.0表示蓝色。这似乎也完全不适合使用GaussianNB(出于明显的原因)

我试图做的事情看起来并不奇怪,但我不知道如何将其应用到sklearn给我的朴素贝叶斯模型中。我自己编写代码很容易,但出于明显的原因(大多数:为了避免bug),如果可能的话,我更喜欢使用sklearn

[编辑以解释为什么我不认为多项式NB是我想要的]:

我的理解是,在多项式NB中,特征向量由在
k
iid样本中观察到标记的次数组成

我的理解是,这是一个适合分类的文档,其中有一个底层文档类,然后假设文档中的每个单词都是从特定于该类的分类分布中提取的。文档将具有
k
标记,特征向量的长度将等于词汇表大小,特征计数的总和将为
k

在我的例子中,我有很多贝努利变量,加上一些分类变量。但这里并没有“计数”的概念

班级是指喜欢或不喜欢数学的人。预测因素是大学专业(分类)和他们是否上过研究生院(布尔值)

我不认为这符合多项式,因为这里没有计数

其中一些功能是布尔型的,但其他功能是分类的,可以使用少量值(~5)

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

  • 如何处理NB中的分类特征
  • 如何处理NB中的非同质特征(并且,正如我将在下面指出的,即使是两个分类特征也是非同质的)
  • 如何在
    sklearn
    中执行此操作

  • 首先考虑一个单一的分类特征。NB假设/简化了特征是独立的。您将其转换为几个二进制变量的想法正是。显然,这些虚拟变量不是独立的。然后对结果运行Bernoulli NB的想法隐含地假设了独立性。虽然众所周知,在实践中,面对因变量时,NB不一定会破裂,但没有理由尝试将问题转化为NB的最差配置,特别是因为多项式NB是一个非常容易的选择

    相反,假设使用虚拟变量将单个分类变量转换为多列数据集后,使用多项式NB。多项式NB的理论:

    对于多项式事件模型,样本(特征向量)表示多项式事件生成的特定事件的频率。。。式中,pi是事件i发生的概率。特征向量。。。然后是一个直方图,其中xi{\displaystyle x{i}}x{i}计算在特定实例中观察到事件i的次数。这是通常用于文档分类的事件模型,事件表示单个文档中某个单词的出现(请参见单词袋假设)

    因此,在这里,单个分类变量的每个实例都是一个“长度为1的段落”,并且分布是多项式的。具体来说,每一行在一个位置上有1个,在所有其他位置上有0个,因为长度为1的段落必须正好有一个单词,因此这些就是频率

    请注意,从
    sklearn
    的多项式NB的角度来看,数据集是5列的事实现在并不意味着独立性假设


    现在考虑这样一种情况,即您有一个由几个特性组成的数据集:

  • 分类的
  • 伯努利
  • 正常的
  • 在使用NB的假设下,这些变量是独立的。因此,您可以执行以下操作:

  • 使用虚拟变量和多项式NB分别为每个分类数据构建NB分类器
  • 一次为所有贝努利数据构建一个NB分类器-这是因为
    sklearn
    的贝努利NB只是几个单一特征贝努利NB的快捷方式
  • 对于所有正常特征,与2相同
  • 根据独立性的定义,实例的概率是这些分类器的实例概率的乘积

  • scikit学习的
    CategoricalNB
    是要添加到naive_bayes模块中的一个新类。它是夜间建造的

  • 混合朴素贝叶斯()。它可以在训练数据特征上假设高斯分布和分类(multinoulli)分布的混合。该库的编写使得API类似于scikit learn

  • 从mixed_naive_bayes导入MixedNB
    X=[[0,0],
    [1, 1],
    [2, 1],
    [1, 1],
    [0, 2]]
    y=[0,0,1,1,0]
    clf=MixedNB(分类特征='all')
    clf.配合(X,y)
    clf.predict(X)
    
    请看我在类似问题中的回答。

    您能详细说明原因吗