如何将 sklearn.naive_bayes 与(多个)分类特征一起使用?
How can I use sklearn.naive_bayes with (multiple) categorical features?
我想学习朴素贝叶斯模型来解决 class 是布尔值的问题。一些特征是布尔值,但其他特征是分类的,可以采用少量值 (~5)。
如果我所有的特征都是布尔值,那么我会想使用 sklearn.naive_bayes.BernoulliNB
。 sklearn.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).
这个问题很有意思,但其实不止一个:
- 如何在NB中处理分类特征。
- 如何处理 NB 中的非同质特征(并且,正如我将在下文中指出的,即使是两个分类特征也是非同质的)。
- 如何在
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 列的事实现在并不意味着独立性假设。
现在考虑您的数据集包含多个特征的情况:
- 分类
- 伯努利
- 正常
在使用NB的假设下,这些变量是独立的。因此,您可以执行以下操作:
- 使用虚拟变量和多项式 NB,分别为 每个 分类数据构建 NB 分类器。
- 一次为所有的伯努利数据建立一个NB分类器——这是因为
sklearn
的伯努利NB只是几个单特征伯努利的捷径注意事项
- 所有正常功能与 2 相同。
根据独立性的定义,一个实例的概率是这些分类器的实例概率的乘积。
scikit-learn 的 CategoricalNB
是要添加到 naive_bayes 模块中的新 class。它在夜间构建 here.
混合朴素贝叶斯 (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)
在此处查看我在类似问题中的回复 。
我想学习朴素贝叶斯模型来解决 class 是布尔值的问题。一些特征是布尔值,但其他特征是分类的,可以采用少量值 (~5)。
如果我所有的特征都是布尔值,那么我会想使用 sklearn.naive_bayes.BernoulliNB
。 sklearn.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).
这个问题很有意思,但其实不止一个:
- 如何在NB中处理分类特征。
- 如何处理 NB 中的非同质特征(并且,正如我将在下文中指出的,即使是两个分类特征也是非同质的)。
- 如何在
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 列的事实现在并不意味着独立性假设。
现在考虑您的数据集包含多个特征的情况:
- 分类
- 伯努利
- 正常
在使用NB的假设下,这些变量是独立的。因此,您可以执行以下操作:
- 使用虚拟变量和多项式 NB,分别为 每个 分类数据构建 NB 分类器。
- 一次为所有的伯努利数据建立一个NB分类器——这是因为
sklearn
的伯努利NB只是几个单特征伯努利的捷径注意事项 - 所有正常功能与 2 相同。
根据独立性的定义,一个实例的概率是这些分类器的实例概率的乘积。
-
scikit-learn 的
CategoricalNB
是要添加到 naive_bayes 模块中的新 class。它在夜间构建 here.混合朴素贝叶斯 (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)
在此处查看我在类似问题中的回复 。