机器学习-分类-朴素贝叶斯算法

三、朴素贝叶斯算法

朴素贝叶斯算法是基于贝叶斯定理与特征条件独立性假设的分类方法

1.原理

(1)贝叶斯定理

P(B|A)=\frac{P(B)P(A|B)}{P(A)}

P(A)=\sum_{i=1}^{n}P(B_i)P(A|B_i)

(2)特征条件独立性假设

给定一个数据集(x,y),每个样本x包含n维特征,类标签集合y包含N个类别y\subseteq (y_1,y_2,...y_k)

现给定一个新样本x,需要判断它属于哪一类。在这里,我们取概率最大的类别作为其类标签,即问题转化为:找到P(y_1|x),P(y_2|x),...P(y_k|x)最大值对应的类标签。即argmax_y_{k}P(y_k|x)

利用贝叶斯定理可以得到:P(y_k|x)=\frac{P(x|y_k)P(y_k)}{\sum_{i=1}^{k}P(x|y_i)P(y_i)}

先验概率可以根据训练集简单的估计出来。

为了简化计算,在计算条件概率时做了独立性假设。即假设各个维度的特征之间相互独立:

P(x|y_k)=P(x_1,x_2...x_n|y_k)=\prod_{i=1}^{n}P(x_i|y_k)

最后的表达式变为:P(y_k|x)=\frac{\prod_{i=1}^{n}P(x_i|y_k)P(y_k)}{\sum_{j=1}^{k}\prod_{i=1}^{n}P(x_i|y_k)P(y_j)}

由于各个概率之间分母都相同,故可以忽略分母,故朴素贝叶斯可以表示为:

f(x)=argmax_y_{k}P(y_k)\prod_{i=1}^{n}P(x_i|y_k)

(3)三种常见的模型

1)多项式模型

如果特征值是离散值,可以使用多项式模型。N表示整个训练集,N_y_{k}为训练集中第y_k类样本组成的集合,若有充分的独立同分布样本,则可以计算出先验概率为:P(y_k)=\frac{|N_y_k|}{|N|}

对于离散属性,令N_{y_{k}x_i}N_y_k中第i个属性取值为x_i的集合。则条件概率可以估计为:

P(x_i|y_k)=\frac{|N_y_kx_i|}{|N_y_k|}

但会出现某一类的样本中没有出现某个取值的情况,这时条件概率为0,会导致计算式分母为0。所以在估计时会加入一个平滑因子,修改计算公式为:

P(y_k)=\frac{|N_y_k|+\alpha }{|N|+n\alpha},

P(x_i|y_k)=\frac{|N_y_kx_i|+\alpha}{|N_y_k|+n\alpha}

当α=1时称为Laplace平滑;当0<α<1时称为Lidstone平滑; 

2)高斯模型

当特征值为连续取值时,采用高斯模型。

高斯模型假设每一维特征都服从正态分布,P(x_i|y_k)-N(\mu_{y_k,i},\sigma^2_{y_k,i})\mu_{y_k,i},\sigma^2_{y_k,i}表示类别为y_k的样本中,第i维特征的均值和方差;

故:P(x_i|y_k)=\frac{1}{(2\pi\sigma^2_{y_k,i})^{1/2}}exp(-\frac{(x-\mu_{y_k,i})^2}{2\sigma^2_{y_k,i}})

3)伯努利模型

伯努利模型适用于离散特征的情况,并且离散特征的取值只能是0或1:

当特征值取值为1时,P(x_i|y_k)=P(x_i=1|y_k)

当特征值取值为0时,P(x_i|y_k)=1-P(x_i=1|y_k)

2.python代码

from sklearn.naive_bayes import GaussianNB#高斯模型
from sklearn.naive_bayes import MultinomialNB#多项式模型
from sklearn.naive_bayes import BernoulliNB#伯努利模型
from sklearn import metrics#构建文本报告
from sklearn.model_selection import train_test_split#划分数据集

#高斯模型
clf=GaussianNB().fit(x_train,y_train)
predicts=clf.predict(x_test)
score=clf.score(x_test,y_test)
print(metrics.classification_report(y_test, predicts))#打印预测报告

#多项式模型
clf=MultinomialNB(alpha=0.1).fit(x_train,y_train)#alpha为平滑因子
predicts=clf.predict(x_test)
score=clf.score(x_test,y_test)
print(metrics.classification_report(y_test,predicts))

#伯努利模型
clf=BernoulliNB(alpha=0.1).fit(x_train,y_train)
predicts=clf.predict(x_test)
score=clf.score(x_test,y_test)
print(metrics.classification_report(y_test,predicts))

你可能感兴趣的:(机器学习,机器学习,分类,朴素贝叶斯算法,python)