Ned*_*eri 19 statistics machine-learning scikit-learn naivebayes
我想学习Naive Bayes模型,解决类是布尔值的问题(取两个值中的一个).某些功能是布尔值,但其他功能是分类的,可以采用少量值(~5).
如果我的所有功能都是布尔值,那么我想使用sklearn.naive_bayes.BernoulliNB
.似乎很清楚,sklearn.naive_bayes.MultinomialNB
是不是我想要的.
一种解决方案是将我的分类特征拆分为布尔特征.例如,如果变量"X"取值"红色","绿色","蓝色",我可以有三个变量:"X是红色","X是绿色","X是蓝色".这违反了给予类的变量的条件独立性假设,因此它似乎完全不合适.
另一种可能性是将变量编码为实值变量,其中0.0表示红色,1.0表示绿色,2.0表示蓝色.这似乎完全不适合使用GaussianNB(出于显而易见的原因).
我想要做的事情似乎并不奇怪,但我不明白如何将它融入sklearn给我的Naive Bayes模型中.我自己编写代码很容易,但是如果可能的话,我更喜欢使用sklearn,原因很明显(大多数:避免错误).
[编辑解释为什么我不认为多项式NB是我想要的]:
我的理解是,在多项式NB中,特征向量包括在k
iid样本中观察到令牌的次数.
我的理解是,这适用于分类文档,其中存在基础类文档,然后假定文档中的每个单词都是从特定于该类的分类分布中提取的.文档将具有k
令牌,特征向量的长度将等于词汇量大小,并且特征计数的总和将是k
.
就我而言,我有一些bernoulli变量,加上几个分类变量.但这里没有"计数"的概念.
示例:课程是喜欢或不喜欢数学的人.预测因子是大学专业(分类)以及他们是否进入研究生院(布尔).
我认为这不符合多项式,因为这里没有任何重要性.
Ami*_*ory 18
某些功能是布尔值,但其他功能是分类的,可以采用少量值(~5).
这是一个有趣的问题,但它实际上不止一个:
sklearn
.首先考虑一个分类特征.NB假定/简化功能是独立的.您将其转换为多个二元变量的想法正是虚拟变量的想法.显然,这些虚拟变量不是独立的.你在结果上运行伯努利NB的想法隐含地假设独立.虽然众所周知,在实践中,NB在面对因变量时并不一定会破坏,但没有理由尝试将问题转化为NB的最差配置,特别是因为多项NB是一种非常简单的选择.
相反,假设在使用虚拟变量将单个分类变量转换为多列数据集后,您将使用多项NB.多项NB 状态理论:
使用多项事件模型,样本(特征向量)表示由多项式生成某些事件的频率...其中pi是事件i发生的概率.然后,特征向量...是直方图,其中xi {\ displaystyle x_ {i}} x_ {i}计算在特定实例中观察到事件i的次数.这是通常用于文档分类的事件模型,其中事件表示单个文档中单词的出现(参见词袋假设).
因此,在这里,您的单个分类变量的每个实例都是"长度为1的段落",并且分布完全是多项式的.具体来说,每一行在一个位置都有1个,在所有其他位置都有0,因为长度为1的段落必须只有一个字,因此这些将是频率.
请注意,从sklearn
多项式NB 的角度来看,数据集为5列的事实现在并不意味着假设独立性.
现在考虑一下你有一个由几个特征组成的数据集的情况:
在使用NB的假设下,这些变量是独立的.因此,您可以执行以下操作:
sklearn
伯努利NB只是几个单功能伯努利NB的捷径.通过独立性的定义,实例的概率是这些分类器的实例概率的乘积.