机器学习Sklearn系列:(四)朴素贝叶斯

3--朴素贝叶斯

原理

朴素贝叶斯本质上就是通过贝叶斯公式来对得到类别概率,但区别于通常的贝叶斯公式,朴素贝叶斯有一个默认条件,就是特征之间条件独立。

条件概率公式:

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

贝叶斯公式可以写成:

\[p(y_i|x) = \frac{p(x|y_i)p(y_i)}{p(x)} \]

如果A和B相对于C是条件独立的,那么满足\(P(A|C) = P(A|B,C)\)。 如果样本的两个特征\(x_1\)\(x_2\)相对于y条件独立,那么可以得到\(p(x_1,x_2|y) = p(x_1|y)p(x_2|y)\)

通过条件独立公式,上述贝叶斯公式中,\(p(x|y_i)\)的计算则可以简化成如下公式:

\[p(x|y_i) = p(x_1|yi)p(x_2|yi)p(x_3|yi)...p(x_n|yi) \]

实现细节

对于离散类型数据, \(p(x_i|y)\)可以通过计算特征的数量得到概率。

\[p(x_i|y) = \frac{N_{yi}}{N_y} \]

唯一需要注意的就是拉普拉斯修正(Laplacian Correction),如果莫一个新的特征x从来没有出现过,那么分母就有可能为0,为了避免这种情况,可以做如下操作:

\[p(x_i|y)= \frac{N_{yi}+\alpha}{N_y+an} \]

而对于连续型数据,计算方法则不太相同,高斯贝叶斯认为数据服从高斯分布,所以默认为某一列特征服从高斯分布,然后通过高斯概率密度函数,就可以得到相应的概率。

假设某一列特征服从整体分布

\[p(x_i|y)\sim N(\mu_{y,i},\sigma_{y,i}^2) \]

其中\(\mu\)\(\sigma\)为y类样本在样本x第i个属性的均值和方差,那么其计算方法如下:

首先计算出标签y在特征\(x_i\)上的均值和方差,然后就可以得到其概率的计算公式了:

\[p(x_i|y) = \frac{1}{\sqrt{2\pi}\sigma_{y,i}}exp(-\frac{(x_i-\mu_{y,i})^2}{2\sigma^2_{y,i}}) \]

当具体计算的时候,可以直接对区间进行积分,然后进行化简,可以得到最终的概率值:

\(P(x_i<x<x_i+\epsilon) = \int_{x_i}^{x_i+\epsilon}f(x)dx \approx f(x_i)*\epsilon\)

这里就是使用高斯概率密度函数对概率进行估计的朴素贝叶斯计算方法,对于sklearn中的GaussionNB函数。

sklearn中的朴素贝叶斯方法

sklearn中的朴素贝叶斯有几种方法:

描述
naive_bayes.BernoullNB 伯努利分布下的朴素贝叶斯
naive_bayes.GaussianNB 高斯分布下的朴素贝叶斯
naive_bayes.MultinomialNB 多项式分布下的朴素贝叶斯
naive_bayes.ComplementNB 补集朴素贝叶斯
linear_model.BayesianRidge 贝叶斯岭回归,在参数估计过程中使用贝叶斯回归技术来包括正则化参数

sklearn中的朴素贝叶斯算法,就如上述所提到的,对于连续型变量,可以使用高斯正太分布进行概率估计(这里对应高斯朴素贝叶斯),当然可以使用其他不同的分布进行概率估计,比如使用伯努利分布估计的话,则对应下表中的伯努利朴素贝叶斯算法。也就是说,其差别主要在于使用不同的方法来估计概率。

使用示例:

from sklearn import naive_bayes as nb

from sklearn.preprocessing import LabelEncoder

#由于sklearn中的朴素贝叶斯默认不支持字符串形式的特征,需要将字符串编码成数字特征,
所以这里可以使用LabelEncoder,例如下面所示,会自动将字符串从0到N进行编码

X[:,1] = LabelEncoder().fit_transform(X[:,1]))

使用朴素贝叶斯:
model = nb.GaussianNB()

model.fit(X,y) 
posted @ 2021-07-18 22:37  Neo0oeN  阅读(506)  评论(2编辑  收藏  举报