如何将 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.BernoulliNBsklearn.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几种朴素贝叶斯分类器

sklearn 高斯朴素贝叶斯 - 为啥是“高斯”?

sklearn GaussianNB(高斯朴素贝叶斯)模型使用RandomSearchCV获取最优参数及可视化

python分类预测模型的特点