朴素贝叶斯
朴素贝叶斯原理
朴素贝叶斯:条件分布+条件独立+全概率
算法原理
条件分布
贝叶斯可以概括为:先验概率+数据=后验概率。
如果X和Y相互独立,那么
条件概率表示为:
或者写为
全概率公式表示为
从以上公式推导得到
朴素贝叶斯模型
假设有m个样本,每个样本有n个特征,输出K个类别记为(C_1,C_2,...,C_k)。
样本的先验概率表示为(P(Y=C_k)(k=1,2,...,K)),条件概率分布表示为:
使用贝叶斯公式和,求得联合分布为
从上式可以看出(P(Y=C_k))比较容易通过最大似然求出,得到的(P(Y=C_k))就是类别(C_k)在训练集里出现的频数,但是(P(X_1=x_1,X_2=x_2,...,X_n=x_n|Y=C_k))是一个有n个维度的条件分布,比较能求出。朴素贝叶斯做了一个很强的假设,X的n个维度是相互独立的,这样可以得出:
从上式可以看出,条件概率极大简化,但如果两个维度不独立,建议不要使用朴素贝叶斯模型。
预测时,只要计算出(P(Y=C_k|X=X^{(test)}))然后找出概率最大的类别即可。
推导过程
我们预测(C_{result})是使(P(Y=C_k|X=X^{(test)}))最大化的类别,数表示为
由于对所有类别计算(P(Y=C_k|X=X^{(test)}))时分母都是一样的,都是(P(X=X^{(test)})),因此预测公式可以简化为
接着,我们使用条件独立性假设,可以得到:
这就是朴素贝叶斯公式。
参数估计
由上可知,只要求出(P(Y=C_k))和(P(X_j=X_j^{(test)}|Y=C_k)(j=1,2,...,n))就可以得到贝叶斯结果。(P(Y=C_k))可以通过样本类别是出现的次数除以总数得到,即计算样本类别的频率。对于(P(X_j=X_j^{(test)}|Y=C_k)(j=1,2,...,n))这个取决于先验条件。
a)如果(X_j)是离散的,假设(X_j)符合多项式分布,这样得到(P(X_j=X_j^{(test)}|Y=C_k)(j=1,2,...,n))是在样本类别(C_k)中,特征(X_j^{(test)})出现的频率,即:
其中(m_k)为样本类别(C_k)总特征计数,而(m_{kj^{test}})为类别为(C_k)的样本中,第j维度特征(X_j^{(test)})出现的计数。
为解决某些特征未出现导致计数为0的情况,加入拉普拉斯平滑,从而有:
其中,(lambda)为大于0的常数,(O_j)为第j个特征取值个数。
b)如果我们的特征(X_j)是非常稀疏的离散值,即各个特征出现频率概率很低,我们可以假设(X_j)符合伯努利分布,即特征(X_j)出现记为1,不出现记为0,此时有
其中,(X_j^{(test)})取值为0和1。
c)如果(X_j)是连续值,我们常取(X_j)的先验概率为正态分布,即在样本类别(C_k)中,(X_j)的值符合正态分布,这样的概率分布是:
其中,(mu_k)和(sigma_k^2)是正态分布的期望和方差,可以通过极大自然估计求得。(mu_k)为在样本类别(C_k)中,所有(X_j)的平均值。(sigma_k^2)为样本类别(C_k)中,所有(X_j)的方差。对于一个连续的样本值,带入正态分布就可以求出概率了。
朴素贝叶斯算法过程
假设有m个样本,每个样本有n个维度,共有K个分类,分类(C_1,C_2,...,C_k),每个特征输出类别样本个数为(m_1,m_2,...,m_k),在第k个类别中,如果是离散的则特征(X_j)各类别取值为(m_{kjl}),其中取值为(1,2,...,S_j)为特征j不同的取值数。
输入实例(X^{(test)})的分类过程如下:
-
计算先验概率
如果没有Y的先验概率,则计算Y的K个先验概率:(P(Y=C_k)=frac{m_k+lambda}{m+Klambda}),否则计算(P(Y=C_k))为输入的先验概率
-
分别计算第k个类别的第j维度的第l个取值的条件概率(P(X_j=x_{jl}|Y=C_k))
使用在上面参数估计时,分三种情况计算(P(X_j=X_j^{(test)}|Y=C_k))
-
离散值
[P(X_j=x_{jl}|Y=C_k)=frac{m_{kjl}+lambda}{m_k+S_jlambda} ] -
稀疏二项离散值
[P(X_j=x_{jl}|Y=C_k)=P(j|Y=C_k)x_{jl}+(1-P(j|Y=C_k))(1-x_{jl}) ] -
连续值
[P(X_j=x_j|Y=C_k)=frac{1}{sqrt{2pisigma_k^2}}exp(-frac{(x_j-mu_k)^2}{2sigma_k^2}) ]
-
-
对于实例(X^{(test)})分别计算:
[P(Y=C_k)prod_{j=1}^{n}P(X_j=x_j^{(test)}|Y=C_k) ]这里是根据独立性假设得来的,假设各维度相互独立,则概率等于各维度概率乘积。前面用到了条件概率公式或者贝叶斯公式,将(P(X=x|Y=C_k))转化为求(P(Y=C_k|X=x)P(Y=C_k))来解决问题。
-
确定实例(X^{(test)})分类(C_{result})
[C_{result}=underbrace{argmax}_{C_k}P(Y=C_k)prod_{j=1}^nP(X_j=X_j^{(test)}|Y=C_k) ]
朴素贝叶斯算法小结
-
主要优点
1)有稳定的分类效率
2)可以对数据分批计算
3)对数据缺失不敏感,常用于文本分类
-
主要缺点
1)强假设:各属性之间相互独立
2)需要先验概率
3)分类信赖于先验概率,有一定的错误
4)对输入数据表达形式敏感
朴素贝叶斯使用
主要类库
scikit-learn主要有三个类GaussianNB、MultinomialNB、BernoulliNB,分虽对就先验概率为高斯、多项式和伯努利分布的朴素贝叶斯分布。
GaussianNB
高斯分布即正态分布的表达式如下:
GaussianNB参数只有一个,即先验概率priors,对应Y的各个类别先验概率(P(Y=C_k)),默认不给出,默认使用(P(Y=C_k)=frac{m_k}{m}),其中(m_k)为输出第k类别的训练集样本数。
使用fit训练模型,预测模型有三个函数,分别为predict、predict_log_proba和predict_proba。
predict:直接给出预测类别
predict_proba:给出在各类别上预测的概率
predict_log_proba:将概率转化为对数
from sklearn.naive_bayes import GaussianNB
clf = GaussianNB()
clf.fit(X, Y)
clf.predict(test)
clf.predict_proba(test)
clf.predict_log_proba(test)
MultinomialNB
多项式分布先验概率表示如下:
其中(P(X_j=x_{jl}|Y=C_k))是第k个类别的第j维特征的第l个取值条件概率,(m_k)是训练集第k类样本个数,(lambda)是大于0的常数。使用时参数如下:
1)(lambda)拉普拉斯平滑常数,默认值为1,如需要调优,选择1附近的值。
2)class_prior是否考虑先验概率,如果是false则认为所有样本类别输出都有相同的先验概率
3)如class_prior为true,是输入先验概率
函数使用方法,与GaussianNB相同。
BernoulliNB
伯努利分布,先验概率表示为:
前3个参数与MultinomialNB相同,增加的一个是binarize,用来处理二项式分布,如不输入则诊断每个数据特征都是二元的,否则,小于binarize的会归为一类,大于binarize的归为另一类。