我想为一个类别为布尔值的问题学习一个朴素贝叶斯模型。一些特征是布尔值,但其他特征是分类特征,可以取少量值(约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个)。
这是一个有趣的问题,但实际上不止一个问题:
- 如何在NB中处理分类特征。
- 如何在NB中处理非同质特征(正如我接下来将指出的,即使是两个分类特征也是非同质的)。
- 如何在
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列,并不意味着现在假设了独立性。
现在考虑您有一个由多个特征组成的数据集的情况:
- 分类
- 布尔
- 正态
在使用NB的假设下,这些变量是独立的。因此,您可以执行以下操作:
- 为每个分类数据分别构建一个NB分类器,使用您的虚拟变量和一个多项式NB。
- 一次性为所有布尔数据构建一个NB分类器 – 这是因为
sklearn
的Bernoulli NB只是多个单特征Bernoulli NB的快捷方式。 - 对所有正态特征执行与2相同的操作。
根据独立性的定义,一个实例的概率是这些分类器实例概率的乘积。