如何在sklearn.naive_bayes中使用(多个)分类特征?

我想为一个类别为布尔值的问题学习一个朴素贝叶斯模型。一些特征是布尔值,但其他特征是分类特征,可以取少量值(约5个)。

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

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

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

我不明白如何将我想做的事情与sklearn提供的朴素贝叶斯模型相匹配。

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

我的理解是,在多项式NB中,特征向量由在k个独立同分布样本中观察到的标记次数组成。

我的理解是,这适用于文档分类,其中存在文档的基本类别,然后假设文档中的每个单词都是从特定于该类的分类分布中抽取的。一个文档将有k个标记,特征向量的长度等于词汇量大小,特征计数的总和将是k

在我的情况下,我有一些布尔变量,再加上几个分类变量。但这里没有“计数”的概念。

示例:类别是喜欢或不喜欢数学的人。预测因素是大学专业(分类)和是否读过研究生(布尔)。

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


回答:

一些特征是布尔值,但其他特征是分类特征,可以取少量值(约5个)。

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

  1. 如何在NB中处理分类特征。
  2. 如何在NB中处理非同质特征(正如我接下来将指出的,即使是两个分类特征也是非同质的)。
  3. 如何在sklearn中做到这一点。

首先考虑一个单一分类特征。NB假设/简化了特征是独立的。您将此转换为多个二进制变量的想法正是虚拟变量的概念。显然,这些虚拟变量远非独立。您接下来在结果上运行Bernoulli NB的想法隐式假设了独立性。虽然在实践中已知NB面对依赖变量时不一定会崩溃,但没有理由试图将问题转换为NB的最差配置,尤其是因为多项式NB是一个非常简单的替代方案。

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

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

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

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


现在考虑您有一个由多个特征组成的数据集的情况:

  1. 分类
  2. 布尔
  3. 正态

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

  1. 为每个分类数据分别构建一个NB分类器,使用您的虚拟变量和一个多项式NB。
  2. 一次性为所有布尔数据构建一个NB分类器 – 这是因为sklearn的Bernoulli NB只是多个单特征Bernoulli NB的快捷方式。
  3. 对所有正态特征执行与2相同的操作。

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

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注