原文地址:朴素贝叶斯分类
本文讨论朴素贝叶斯分类naivebayesclassifiers )背后的理论及其实现。
朴素贝叶斯分类器是分类算法集合中基于贝叶斯理论的算法。 不是单一的存在,而是算法家族,这个算法家族有共同的规则。 例如,每个分类的特征对可以相对于其它特征对而独立。
开始之前,请查看数据集。
这是一个虚构的数据集,表明天气是否适合打高尔夫球。 天气状况按元组分为合适“是”)或不合适“是”)进行高尔夫。
以下屏幕捕获显示的数据集表。
数据集分为两部分:特征矩阵(feature matrix)和响应向量(response vector)。
特征矩阵包含数据集中的所有向量行),每个向量由从属特征组成。 上面的数据集以“天气”、“温度”、“湿度”和“风”为特征。 响应向量包含特征矩阵中每行的类变量预测或输出)值。 在上述数据集中,类变量名为“Play golf”。假设
朴素贝叶斯的基本前提是所有特征都是:
为了支持输出结果而独立。
与我们的数据集相关联,我们可以这样理解这个概念:
假设特征对不相互依赖。 温度热不热与湿度无关,是否下雨也不影响是否刮风。 因此,它们的特征彼此具有独立,其次每个特征具有相同的权重或重要性)。 例如,如果只知道温度和湿度,就无法正确推测结果。 所有属性都与结果有关,影响程度为相同。 注意:在现实中,这个假设通常不能使朴素贝叶斯正确。 实际上独立的假设完全不成立,但在实践中往往可以方便地计算。
在进入朴素贝叶斯方程之前,了解贝叶斯理论很重要。
贝叶斯理论
贝叶斯理论是根据一个事件发生的概率计算另一个事件的发生概率。 贝叶斯理论的数学表达可以写如下。
pa|b )=p ) b|p ) a ) p ) b ),这里a和b都是事件,p ) b )不是0。 基本上,如果事件b显示为真,就可以计算出事件a发生的概率,事件b也称为证据。 pa )是事件a的先验先验概率,例如,证据之前发生的概率)。 证据是未知事件的属性值在此为事件b )。 PA|B )是b的后验概率,例如证据后发生的概率。
想想数据集吧。 我们可以这样使用贝叶斯理论:
py|x ) py ) py ) x ) ) ) ) ) ) ) )
其中,y是类变量,x是依存特征向量大小n ) :
x=x1,x2,x3,xn ) ) ) )。
为了更清楚,该示例中的特征向量和相关类变量是数据集的第一行) :
x=rainy,Hot,High,False ) y=No,因此p ) x|y表示已知的“Rainy outlook”、“Temperature is hot”、“high humidity”
朴素假设现在正是向贝叶斯理论添加假设的时候,也就是说各特征之间是相互独立的。 所以我们可以把证据分成各自独立的部分。
两个事件a和b是如何相互独立的,那么
pab )=p a ) pab ) ) )。
结果,可以得到以下结果。
py|x1,xn )=p ) x1|y ) Px2|y ) . Px2|y ) p p ) x1) p )…pxn ) ) ) )
所以可以写如下。
py|x1,xn )=p )ni=1p ) Xi|y ) p ) x1 ) x2)…p xn ) ) ) ) ) ) )
分母与输入数据和常数有关,所以可以删除该项。
py|x1,xn ) p ) y )Ni=1pXi|y ) ) ) ) ) ) 652
我们需要在这里建立分类模型。 使用已知类变量y的所有可能值计算概率,并选择输出概率为最大结果。 公式可以写如下。
y^=argmaxypy )Ni=1p ) Xi|y ) )。
所以最后剩下的只有py )和p ) Pxi|y )的计算。
注意: py )也称为类概率,pXi|y )也称为条件概率。
朴素贝叶斯分类器的区别主要在于
Pxi|y) 分布的假设。
我们试着将上面的式子用在天气数据集上。这样,我们先对数据集做一些预处理。
我们得求出每一个 X 中的xi, y 中的yi。所有这些计算都被列在了下面的表格中:
所以在上图中,我们已经在表格1-4中手工计算了每一个 X 中的xi, y 中的yi。例如打高尔夫的概率已知的是温度是cool,例如 Ptemp=cool|playgolf=Yes)=3/9 。
我们也需要求出类概率( Py) ),这个在表格5中已经计算出来了。例如 Pplaygolf=Yes)=9/14 。
直到现在我们已经完成了预处理工作,分类器也准备好了。
today = 甜美的衬衫, Hot, Normal, False)
所以玩高尔夫的概率是:
PYes|today)=P甜美的衬衫Outlook|Yes)PHotTemperature|Yes)PNormalHumidity|Yes)PNoWind|Yes)PYes)Ptoday)
不打高尔夫的概率是:
PNo|today)=P甜美的衬衫Outlook|No)PHotTemperature|No)PNormalHumidity|No)PNoWind|No)PNo)Ptoday)
因为 Ptoday) 在两个概率中都用到了,我们可以忽略 Ptoday) ,然后再找到等比例的概率:
PYes|today)∝29⋅29⋅69⋅69⋅914≈0.0141
PNo|today)∝35⋅25⋅15⋅25⋅514≈0.0068
因为
PYes|today)+PNo|today)=1
所以这些数字可以做一下归一化:
PYes|today)=0.01410.0141+0.0068=0.67
PNo|today)=0.00680.0141+0.0068=0.33
因为
Yes|today)>PNo|today)
所以预测结果应该是“Yes”。
上述讨论的方法只能应用在离散数据上。如果是连续数据的话,我们需要对每个特征数据的分布做一些假设。不同的朴素贝叶斯分类器差异主要在 Pxi|y) 分布的假设。
下面我们讨论一个这样的分类器:
sxddy朴素贝叶斯分类器
在sxddy朴素贝叶斯中,每个特征都是连续的,并且都呈sxddy分布。sxddy分布又称为正态分布。图画出来以后像一个倒挂的钟,以均值为轴对称,如下图所示:
特征的似然被假设为sxddy分布了,那么条件概率函数可以写为:
Pxi|y)=12πσ2−−−−√exp−xi−μy)22σ2y)
现在我们看一下用scikit-learn实现的sxddy朴素贝叶斯。
# load the iris datasetfrom sklearn.datasets import load_irisiris = load_iris)# store the feature matrix X) and response vector y)X = iris.datay = iris.target# splitting X and y into training and testing setsfrom sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_splitX, y, test_size=0.4, random_state=1)# training the model on training setfrom sklearn.naive_bayes import GaussianNBgnb = GaussianNB)gnb.fitX_train, y_train)# making predictions on the testing sety_pred = gnb.predictX_test)# comparing actual response values y_test) with predicted response values y_pred)from sklearn import metricsprint”Gaussian Naive Bayes model accuracyin %):”, metrics.accuracy_scorey_test, y_pred)*100)
输出:
Gaussian Naive Bayes model accuracyin %): 95.0
其他比较流行的朴素贝叶斯分类器:
多项式朴素贝叶斯:特征向量表示由多项式分布生成的特定事件的频率。这是用于文件分类的典型的事件模型。伯努利朴素贝叶斯:在多变量的伯努利事件模型中,特征是独立的布尔(二进制变量)类型来描述输入。跟多项式模型类似,这个模型在文件分类中也很流行,在这里用的是二进制项的出现(一个词是否出现在文件中),而不是词频(一个文件中出现某个单词的次数)。
在文章的最后,有一些要点需要考虑下:
尽管他们貌似过度简化了假设,朴素贝叶斯分类器在真实世界中的应用还是很不错的,其中著名的文件分类和垃圾邮件过滤就是例子。它只要少量的训练数据就能估计出关键的参数。与其他的复杂方法相比,朴素贝叶斯学习和分类的速度非常快。类条件特征分布的波动意思就是每个分布可以独立地被一个尺寸分布估计出来。这就减轻了维度带来的问题。
参考文献:
https://en.wikipedia.org/wiki/Naive_Bayes_classifierhttp://gerardnico.com/wiki/data_mining/naive_bayeshttp://scikit-learn.org/stable/modules/naive_bayes.html