如何将 sklearn.naive_bayes 与(多个)分类特征一起使用? [关闭]
Posted
技术标签:
【中文标题】如何将 sklearn.naive_bayes 与(多个)分类特征一起使用? [关闭]【英文标题】:How can I use sklearn.naive_bayes with (multiple) categorical features? [closed] 【发布时间】:2016-12-01 22:36:18 【问题描述】:我想为类为布尔值的问题学习朴素贝叶斯模型。其中一些特征是布尔值,但其他特征是分类特征,可以采用少量值 (~5)。
如果我的所有功能都是布尔值,那么我想使用sklearn.naive_bayes.BernoulliNB
。 sklearn.naive_bayes.MultinomialNB
似乎很明显不是我想要的。
一种解决方案是将我的分类特征拆分为布尔特征。例如,如果变量“X”取值“红色”、“绿色”、“蓝色”,我可以有三个变量:“X 是红色”、“X 是绿色”、“X 是蓝色”。这违反了给定类的变量条件独立的假设,因此看起来完全不合适。
另一种可能性是将变量编码为实值变量,其中 0.0 表示红色,1.0 表示绿色,2.0 表示蓝色。这似乎也完全不适合使用 GaussianNB(原因很明显)。
我不明白如何将我正在尝试做的事情融入 sklearn 提供给我的朴素贝叶斯模型。
[编辑解释为什么我不认为多项式 NB 是我想要的]:
我的理解是,在多项式 NB 中,特征向量由在k
iid 样本中观察到令牌的次数组成。
我的理解是,这适用于分类文档,其中存在一个基础文档类,然后假定文档中的每个单词都是从特定于该类的分类分布中提取的。一个文档会有k
标记,特征向量的长度等于词汇量大小,特征计数的总和是k
。
就我而言,我有许多伯努利变量,以及几个分类变量。但是这里没有“计数”的概念。
示例:班级是喜欢或不喜欢数学的人。预测变量是大学专业(分类)和他们是否读过研究生(布尔值)。
我认为这不适合多项式,因为这里没有计数。
【问题讨论】:
您能否详细说明为什么多项式朴素贝叶斯对您不利? 我投票结束这个问题,因为它与 help center 中定义的编程无关,而是关于 ML 理论和/或方法 - 请参阅machine-learning
@ 中的介绍和注意事项987654322@.
【参考方案1】:
一些特征是布尔值,但其他特征是分类的,可以采用少量值 (~5)。
这是一个有趣的问题,但实际上不止一个问题:
-
如何在 NB 中处理分类特征。
如何处理 NB 中的非同质特征(而且,正如我将在下文中指出的那样,即使是两个分类特征也是非同质的)。
如何在
sklearn
中执行此操作。
首先考虑一个单一分类特征。 NB 假设/简化特征是独立的。您将其转换为几个二进制变量的想法正是dummy variables 的想法。显然,这些虚拟变量绝不是独立的。然后对结果运行伯努利 NB 的想法隐含地假设了独立性。虽然众所周知,在实践中,NB 在面对因变量时不一定会崩溃,但没有理由尝试将问题转化为 NB 的最差配置,尤其是多项式 NB 是一种非常简单的替代方案。
相反,假设在使用虚拟变量将单个分类变量转换为多列数据集后,您使用多项式 NB。多项式理论NBstates:
对于多项式事件模型,样本(特征向量)表示多项式生成某些事件的频率......其中 p i 是事件 i 发生的概率。特征向量 ... 然后是一个直方图,其中 x i \displaystyle x_i x_i 计算在特定实例中观察到事件 i 的次数。这是通常用于文档分类的事件模型,事件表示单个文档中单词的出现(参见词袋假设)。
因此,在这里,您的单个分类变量的每个实例都是“长度为 1 的段落”,并且分布完全是多项式的。具体来说,每一行在一个位置有 1,在所有其他位置有 0,因为长度为 1 的段落必须正好有一个单词,所以这些就是频率。
请注意,从sklearn
的多项式 NB 的角度来看,数据集是 5 列的事实现在并不意味着独立性假设。
现在考虑一个由多个特征组成的数据集的情况:
-
分类
伯努利
正常
在使用 NB 的假设下,这些变量是独立的。因此,您可以执行以下操作:
-
使用虚拟变量和多项式 NB 分别为每个分类数据构建一个 NB 分类器。
一次为所有伯努利数据构建一个 NB 分类器 - 这是因为
sklearn
的伯努利 NB 只是几个单一特征伯努利 NB 的捷径。
对于所有正常功能都与 2 相同。
根据独立性的定义,实例的概率是这些分类器的实例概率的乘积。
【讨论】:
【参考方案2】:CategoricalNB
by scikit-learn 是要添加到 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://***.com/a/58428035/4570466查看我对类似问题的回复。
【讨论】:
以上是关于如何将 sklearn.naive_bayes 与(多个)分类特征一起使用? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
使用 Sklearn.naive_bayes.Bernoulli 的朴素贝叶斯分类器;如何使用模型进行预测?
sklearn.naive_bayes.GaussianNB 中的 ValueError
sklearn.naive_bayes中Bernoulli NB几种朴素贝叶斯分类器