[学生党学习笔记,如有错误谢谢各位大佬指出]
所用书籍:《统计学习方法》-李航
朴素贝叶斯模型首先基于特征条件独立假设,学习输入的联合概率分布;然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y。
同时这也表明了朴素贝叶斯是一种生成式模型,是基于概率进行学习并分类的。
关于生成式模型与判别式模型,大家可以点链接看看这篇文章[戳这里]
相对于其它分类算法,朴素贝叶斯分类依赖于贝叶斯概率定理来预测未知数据集的类别,它的速度是非常快的。
贝叶斯定理实际上就是计算”条件概率”的公式。
条件概率:
P ( A ∣ B ) = P ( B ∣ A ) ∗ P ( A ) P ( B ) P(A|B)=\frac{P(B|A)*P(A)}{P(B)} P(A∣B)=P(B)P(B∣A)∗P(A)
在朴素贝叶斯分类器中,上式分别表示:
朴素贝叶斯分类器假设类中特定特征和其它特征的存在无关,因为前提条件便是基于特征独立的。这也是这个算法被称为“朴素”的原因。
这部分我建议大家去看李航老师的《统计学习方法》,我觉得写得很清楚,我这里就不过多赘述(也可能是我懒得打那些复杂的推导公式,我个人习惯在例子中搞明白)。
这里直接上例题(例子来源于上书):
例:由下表中的训练数据学习一个NB分类器并确定 x = ( 2 , S ) T x=(2,S)^T x=(2,S)T的类标记y,表中 x ( 1 ) x^{(1)} x(1), x ( 2 ) x^{(2)} x(2)为特征,取值的集合分别为 A 1 A_1 A1={1,2,3}, A 2 A_2 A2={S,M,L},Y为类标记,Y ∈ \in ∈C={1,-1}.
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
x ( 1 ) x^{(1)} x(1) | 1 | 1 | 1 | 1 | 1 | 2 | 2 | 2 | 2 | 2 | 3 | 3 | 3 | 3 | 3 |
x ( 2 ) x^{(2)} x(2) | S | M | M | S | S | S | M | M | L | L | L | M | M | L | L |
Y Y Y | -1 | -1 | 1 | 1 | -1 | -1 | -1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -1 |
首先我们分析目标变量(Target)Y:
P ( Y = 1 ) = 9 15 , P ( Y = − 1 ) = 6 15 P(Y=1)=\frac{9}{15},P(Y=-1)=\frac{6}{15} P(Y=1)=159,P(Y=−1)=156
再看各特征的条件概率:
P ( x ( 1 ) = 1 ∣ Y = 1 ) = 2 9 , P ( x ( 1 ) = 2 ∣ Y = 1 ) = 3 9 , P ( x ( 1 ) = 3 ∣ Y = 1 ) = 4 9 P(x^{(1)}=1|Y=1)=\frac{2}{9},P(x^{(1)}=2|Y=1)=\frac{3}{9},P(x^{(1)}=3|Y=1)=\frac{4}{9} P(x(1)=1∣Y=1)=92,P(x(1)=2∣Y=1)=93,P(x(1)=3∣Y=1)=94
P ( x ( 2 ) = S ∣ Y = 1 ) = 1 9 , P ( x ( 2 ) = M ∣ Y = 1 ) = 4 9 , P ( x ( 2 ) = L ∣ Y = 1 ) = 4 9 P(x^{(2)}=S|Y=1)=\frac{1}{9},P(x^{(2)}=M|Y=1)=\frac{4}{9},P(x^{(2)}=L|Y=1)=\frac{4}{9} P(x(2)=S∣Y=1)=91,P(x(2)=M∣Y=1)=94,P(x(2)=L∣Y=1)=94
P ( x ( 1 ) = 1 ∣ Y = − 1 ) = 3 6 , P ( x ( 1 ) = 2 ∣ Y = − 1 ) = 2 6 , P ( x ( 1 ) = 3 ∣ Y = − 1 ) = 1 6 P(x^{(1)}=1|Y=-1)=\frac{3}{6},P(x^{(1)}=2|Y=-1)=\frac{2}{6},P(x^{(1)}=3|Y=-1)=\frac{1}{6} P(x(1)=1∣Y=−1)=63,P(x(1)=2∣Y=−1)=62,P(x(1)=3∣Y=−1)=61
P ( x ( 2 ) = S ∣ Y = − 1 ) = 3 6 , P ( x ( 2 ) = M ∣ Y = − 1 ) = 2 6 , P ( x ( 2 ) = L ∣ Y = − 1 ) = 1 6 P(x^{(2)}=S|Y=-1)=\frac{3}{6},P(x^{(2)}=M|Y=-1)=\frac{2}{6},P(x^{(2)}=L|Y=-1)=\frac{1}{6} P(x(2)=S∣Y=−1)=63,P(x(2)=M∣Y=−1)=62,P(x(2)=L∣Y=−1)=61
再对于给定的 x = ( 2 , S ) T x=(2,S)^T x=(2,S)T:
P ( Y = 1 ) P ( X ( 1 ) = 2 ∣ Y = 1 ) P ( X ( 2 ) = S ∣ Y = 1 ) = 9 15 ∗ 3 9 ∗ 1 9 = 1 45 P(Y=1)P(X^{(1)}=2|Y=1)P(X^{(2)}=S|Y=1)=\frac{9}{15}*\frac{3}{9}*\frac{1}{9}=\frac{1}{45} P(Y=1)P(X(1)=2∣Y=1)P(X(2)=S∣Y=1)=159∗93∗91=451
P ( Y = − 1 ) P ( X ( 1 ) = 2 ∣ Y = − 1 ) P ( X ( 2 ) = S ∣ Y = − 1 ) = 6 15 ∗ 2 6 ∗ 3 6 = 1 15 P(Y=-1)P(X^{(1)}=2|Y=-1)P(X^{(2)}=S|Y=-1)=\frac{6}{15}*\frac{2}{6}*\frac{3}{6}=\frac{1}{15} P(Y=−1)P(X(1)=2∣Y=−1)P(X(2)=S∣Y=−1)=156∗62∗63=151
从这里便可以得出结果,下式概率大于上式,所以预测y=-1。
如果我们要估计的概率值有为0的情况,这时会影响到后验概率的计算,使模型产生偏差,这时我们便需要进行贝叶斯估计,条件概率的贝叶斯估计式如下:
P λ = Σ i = 1 N I ( y i = c k ) + λ N + K λ P_{\lambda}=\frac{\Sigma_{i=1}^N{I(y_i=c_k)}+\lambda}{N+K\lambda} Pλ=N+KλΣi=1NI(yi=ck)+λ
P λ ( X ( j ) = a j i ∣ Y = c k ) = Σ i = 1 N I ( x i ( j ) = a i j , y i = c k ) + λ Σ i = 1 N I ( y i = c k ) + S i λ P_{\lambda}(X^{(j)}=a_{ji}|Y=c_k)=\frac{\Sigma_{i=1}^N{I(x_i^{(j)}=a_{ij},y_i=c_k)}+\lambda}{\Sigma_{i=1}^N{I(y_i=c_k)}+S_i\lambda} Pλ(X(j)=aji∣Y=ck)=Σi=1NI(yi=ck)+SiλΣi=1NI(xi(j)=aij,yi=ck)+λ
则同样以例题形式,数据同上表,按照拉普拉斯平滑估计概率,即取 λ = 1 \lambda=1 λ=1。
公式推导我就不多说了,贝叶斯参数估计的公式其实就是在条件概率公式的分子加一个 λ \lambda λ,分母加一个 K λ K\lambda Kλ或 S i λ S_{i}\lambda Siλ,其中K为y的种类, S i S_i Si为某特征的种类,本题中y=1或-1,所以K=2, x ( 1 ) x^{(1)} x(1)有1,2,3这三种,即 S 1 S_1 S1=3。
接下来我们来进行计算,同样先计算目标函数y:
P ( Y = 1 ) = 9 + 1 15 + 2 ∗ 1 = 10 17 , P ( Y = − 1 ) = 6 + 1 15 + 2 ∗ 1 = 7 17 P(Y=1)=\frac{9+1}{15+2*1}=\frac{10}{17},P(Y=-1)=\frac{6+1}{15+2*1}=\frac{7}{17} P(Y=1)=15+2∗19+1=1710,P(Y=−1)=15+2∗16+1=177
再看各特征的条件概率:
P ( x ( 1 ) = 1 ∣ Y = 1 ) = 2 + 1 9 + 3 = 3 12 P(x^{(1)}=1|Y=1)=\frac{2+1}{9+3}=\frac{3}{12} P(x(1)=1∣Y=1)=9+32+1=123
这里分母为什么加3呢,因为这是特征 x ( 1 ) x^{(1)} x(1)有1,2,3这三种,即 S 1 S_1 S1=3,同理 x ( 2 ) x^{(2)} x(2)也有S,M,L三种,因此下面的 S 2 S_2 S2=3.
计算结果如下:
P ( x ( 1 ) = 2 ∣ Y = 1 ) = 4 12 , P ( x ( 1 ) = 3 ∣ Y = 1 ) = 5 12 P(x^{(1)}=2|Y=1)=\frac{4}{12},P(x^{(1)}=3|Y=1)=\frac{5}{12} P(x(1)=2∣Y=1)=124,P(x(1)=3∣Y=1)=125
P ( x ( 2 ) = S ∣ Y = 1 ) = 2 12 , P ( x ( 2 ) = M ∣ Y = 1 ) = 5 12 , P ( x ( 2 ) = L ∣ Y = 1 ) = 5 12 P(x^{(2)}=S|Y=1)=\frac{2}{12},P(x^{(2)}=M|Y=1)=\frac{5}{12},P(x^{(2)}=L|Y=1)=\frac{5}{12} P(x(2)=S∣Y=1)=122,P(x(2)=M∣Y=1)=125,P(x(2)=L∣Y=1)=125
P ( x ( 1 ) = 1 ∣ Y = − 1 ) = 4 9 , P ( x ( 1 ) = 2 ∣ Y = − 1 ) = 3 9 , P ( x ( 1 ) = 3 ∣ Y = − 1 ) = 2 9 P(x^{(1)}=1|Y=-1)=\frac{4}{9},P(x^{(1)}=2|Y=-1)=\frac{3}{9},P(x^{(1)}=3|Y=-1)=\frac{2}{9} P(x(1)=1∣Y=−1)=94,P(x(1)=2∣Y=−1)=93,P(x(1)=3∣Y=−1)=92
P ( x ( 2 ) = S ∣ Y = − 1 ) = 4 9 , P ( x ( 2 ) = M ∣ Y = − 1 ) = 3 9 , P ( x ( 2 ) = L ∣ Y = − 1 ) = 2 9 P(x^{(2)}=S|Y=-1)=\frac{4}{9},P(x^{(2)}=M|Y=-1)=\frac{3}{9},P(x^{(2)}=L|Y=-1)=\frac{2}{9} P(x(2)=S∣Y=−1)=94,P(x(2)=M∣Y=−1)=93,P(x(2)=L∣Y=−1)=92
再对于给定的 x = ( 2 , S ) T x=(2,S)^T x=(2,S)T:
P ( Y = 1 ) P ( X ( 1 ) = 2 ∣ Y = 1 ) P ( X ( 2 ) = S ∣ Y = 1 ) = 10 17 ∗ 4 12 ∗ 2 12 = 5 153 = 0.0327 P(Y=1)P(X^{(1)}=2|Y=1)P(X^{(2)}=S|Y=1)=\frac{10}{17}*\frac{4}{12}*\frac{2}{12}=\frac{5}{153}=0.0327 P(Y=1)P(X(1)=2∣Y=1)P(X(2)=S∣Y=1)=1710∗124∗122=1535=0.0327
P ( Y = − 1 ) P ( X ( 1 ) = 2 ∣ Y = − 1 ) P ( X ( 2 ) = S ∣ Y = − 1 ) = 7 17 ∗ 3 9 ∗ 4 9 = 28 459 = 0.0610 P(Y=-1)P(X^{(1)}=2|Y=-1)P(X^{(2)}=S|Y=-1)=\frac{7}{17}*\frac{3}{9}*\frac{4}{9}=\frac{28}{459}=0.0610 P(Y=−1)P(X(1)=2∣Y=−1)P(X(2)=S∣Y=−1)=177∗93∗94=45928=0.0610
因此,预测y=-1。
优点:
缺点:
实时预测:该模型速度很快。 因此,它可以用于实时预测。
多分类器:由贝叶斯公式可知,这种算法也是一个多分类器。因此我们可以预测多个目标变量类别的概率。
文本分类/垃圾邮件过滤/情感分析:该模型被广泛用于垃圾邮件过滤识别和情感分析。可以用于文本分类,成功率很高。
推荐系统:朴素贝叶斯分类器和协作过滤一起构建推荐系统,该系统使用机器学习和数据挖掘技术来过滤看不见的信息并预测用户是否喜欢给定的资源。
sklearn库中有三种类型的朴素贝叶斯模型:
高斯(Gaussian):它用于分类,它假设特征遵循正态分布,意思就是对连续型数据进行处理。
多项式(Multinomial):用于离散计数。计算数据的条件概率(使用拉普拉斯估计器进行平滑的一个模型)。
伯努利(Bernoulli):取值特征是布尔型,即ture或false,在进行文档分类时,就是一个单词有没有在一个文档中出现过。
以下是提高Naive Bayes模型功能的一些建议:
直接在下一篇博客中,写之前kaggle竞赛的项目,项目中会用到NB,实现的话用sklearn是很简单的。稍微写一下核心(没有前后文,单独运行肯定是不行的)
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score
model = GaussianNB()
# 用训练数据拟合
model.fit(X_train,y_train)
# 预测
predict_train = model.predict(X_train)
trainaccuracy = accuracy_score(y_train,predict_train)
print('accuracy_score on train dataset : ', trainaccuracy)
用sklearn库基本上这些机器学习代码就这么多,我只能说开发sklearn的是神。