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

How can I use sklearn.naive_bayes with (multiple) categorical features?

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

如果我所有的特征都是布尔值,那么我会想使用 sklearn.naive_bayes.BernoulliNBsklearn.naive_bayes.MultinomialNB 显然 不是 我想要的。

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

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

我不明白如何将我正在尝试做的事情融入 sklearn 给我的朴素贝叶斯模型中。

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

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

我的理解是,这适合 class化的文档,其中有一个潜在的 class 文档,然后假定文档中的每个词都来自分类特定于 class 的分布。一个文档将有 k 个标记,特征向量的长度将等于词汇表的大小,并且特征计数的总和将是 k.

就我而言,我有许多伯努利变量,外加几个分类变量。但是这里没有“计数”的概念。

示例:classes 是喜欢或不喜欢数学的人。预测变量是大学专业(分类)和他们是否上过研究生(布尔)。

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

Some of the features are boolean, but other features are categorical and can take on a small number of values (~5).

这个问题很有意思,但其实不止一个:

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

首先考虑一个单一分类特征。注意 assumes/simplifies 这些功能是独立的。你把它转化成几个二进制变量的想法正是dummy variables的想法。显然,这些虚拟变量绝非独立的。然后,您对结果的 运行 伯努利 NB 的想法隐含地假定了独立性。虽然众所周知,在实践中,NB 在面对因变量时不一定会崩溃,但没有理由试图将问题转化为 NB 的最坏配置,尤其是多项式 NB 是一个非常简单的替代方案。

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

With a multinomial event model, samples (feature vectors) represent the frequencies with which certain events have been generated by a multinomial ... where p i is the probability that event i occurs. A feature vector ... is then a histogram, with x i {\displaystyle x_{i}} x_{i} counting the number of times event i was observed in a particular instance. This is the event model typically used for document classification, with events representing the occurrence of a word in a single document (see bag of words assumption).

因此,在这里,单个分类变量的每个实例都是一个 "length-1 paragraph",并且分布完全是多项式的。具体来说,每一行有一个位置为 1,其余位置为 0,因为长度为 1 的段落必须恰好有一个单词,因此这些将是频率。

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


现在考虑您的数据集包含多个特征的情况:

  1. 分类
  2. 伯努利
  3. 正常

在使用NB的假设下,这些变量是独立的。因此,您可以执行以下操作:

  1. 使用虚拟变量和多项式 NB,分别为 每个 分类数据构建 NB 分类器。
  2. 一次为所有的伯努利数据建立一个NB分类器——这是因为sklearn的伯努利NB只是几个单特征伯努利的捷径注意事项
  3. 所有正常功能与 2 相同。

根据独立性的定义,一个实例的概率是这些分类器的实例概率的乘积。

    scikit-learn 的
  1. CategoricalNB 是要添加到 naive_bayes 模块中的新 class。它在夜间构建 here.

  2. 混合朴素贝叶斯 (https://github.com/remykarem/mixed-naive-bayes)。它可以假定训练数据特征的高斯分布和分类(multinoulli)分布的混合。该库的编写使得 API 类似于 scikit-learn 的 API。

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)

在此处查看我在类似问题中的回复 。