朴素贝叶斯分类——大道至简

分类问题

已知m个样本 ( x 1 , y 1 ) , . . . . . . ( x m , y m ) (x^1,y^1), ...... (x^m,y^m) (x1,y1),......(xm,ym),x是特征变量,y是对应的类别。
要求一个模型函数h,对于新的样本 x t x^t xt,能够尽量准确的预测出 y t = h ( x t ) y^t = h(x^t) yt=h(xt)

概率角度

很多机器学习算法从误差角度来构建模型函数h,也就是先假设一个h,然后定义一个h(x)与y的误差,通过逐步减少h(x)与y的误差来获得一个拟合的模型h。

现在我们从概率的角度来考虑一下。
假设y有m个类别,即 y 1 , . . . . . . y n ∈ { C 1 , . . . . . . C m } y_1,......y_n ∈ \{C_1,......C_m\} y1,......yn{C1,......Cm}
对于样本 x t x^t xt,如果能计算出每个类别的条件概率 P ( C 1 ∣ x t ) , . . . . . . P ( C m ∣ x t ) P(C_1|x^t),......P(C_m|x^t) P(C1xt),......P(Cmxt),那么可以认为概率最大的那个类别就是 x t x^t xt 所属的类别。(关于条件概率和贝叶斯定理请参考 理解贝叶斯定理)。即
KaTeX parse error: Limit controls must follow a math operator at position 37: …orname{argmax} \̲l̲i̲m̲i̲t̲s̲_{k \in \{1,2,.…

朴素贝叶斯分类器

已知m个样本 ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . . . . ( x m , y m ) (x^1,y^1),(x^2,y^2), ...... (x^m,y^m) (x1,y1),(x2,y2),......(xm,ym)
x是n维特征变量,即 x = ( x 1 , x 2 , . . . . . . x n ) x=(x_1,x_2,......x_n) x=(x1,x2,......xn)
y是对应的类别,设有K个类别,即 y 1 , y 2 , . . . . . . y m ∈ { C 1 , C 2 , . . . . . . C K } y^1,y^2,......y^m ∈ \{C_1,C_2,......C_K\} y1,y2,......ym{C1,C2,......CK}

对任一给定的x,我们需要分别计算出x属于各分类的概率 P ( C 1 ∣ x ) , P ( C 2 ∣ x ) , . . . . . . P ( C K ∣ x ) P(C_1|x),P(C_2|x),......P(C_K|x) P(C1x),P(C2x),......P(CKx),其中有最大值的 P ( C k ∣ x ) P(C_k|x) P(Ckx),x即属于该分类 C k C_k Ck,即样本x属于分类
KaTeX parse error: Limit controls must follow a math operator at position 30: …orname{argmax} \̲l̲i̲m̲i̲t̲s̲_{k \in \{1,2,.…

现在需要计算 P ( C k ∣ x ) P(C_k|x) P(Ckx),应用贝叶斯定理:
P ( C k ∣ x ) = P ( C k ) P ( x ) P ( x ∣ C k ) ( 3 ) = P ( C k ) P ( x ) P ( x 1 , x 2 , . . . . . . x n ∣ C k ) ( 4 ) P(C_k|x) = \frac{P(C_k)}{P(x)} P(x|C_k) \quad(3) \\ = \frac{P(C_k)}{P(x)} P(x_1,x_2,......x_n|C_k) \quad(4) P(Ckx)=P(x)P(Ck)P(xCk)(3)=P(x)P(Ck)P(x1,x2,......xnCk)(4)

这里 P ( x 1 , x 2 , . . . . . . x n ∣ C k ) P(x_1,x_2,......x_n|C_k) P(x1,x2,......xnCk) 是一个条件联合概率,意思是在分类 C k C_k Ck 中,特征 ( x 1 , x 2 , . . . . . . x n ) (x_1,x_2,......x_n) (x1,x2,......xn) 取一组特定值(也就是需要预测的样本x的各特征的值)的概率。这个概率不容易计算,为了方便,于是朴素贝叶斯(Naive Bayes) 隆重登场。在这里朴素的意思是,假定 x 的各特征 x 1 , x 2 , . . . . . . x n x_1,x_2,......x_n x1,x2,......xn 是条件独立的。(参考维基百科 - 条件独立)。因此
P ( x 1 , x 2 , . . . . . . x n ∣ C k ) = P ( x 1 ∣ C k ) P ( x 2 ∣ C k ) . . . . . . P ( x n ∣ C k ) ( 5 ) P(x_1,x_2,......x_n|C_k) = P(x_1|C_k)P(x_2|C_k)......P(x_n|C_k) \quad(5) P(x1,x2,......xnCk)=P(x1Ck)P(x2Ck)......P(xnCk)(5)
这个转换其实就是 独立变量的联合分布 = 各变量先验分布的乘积(参考 维基百科 - 联合分布),只不过这里是条件概率,但是因为变换前后都有同样的条件 C k C_k Ck,从样本空间 C k C_k Ck 的角度看,其实就是联合分布转换成先验分布的乘积。(对样本空间的理解请参考 理解贝叶斯定理)。

将(5)带回(4)得
P ( C k ∣ x ) = P ( C k ) P ( x ) P ( x 1 ∣ C k ) P ( x 2 ∣ C k ) . . . . . . P ( x n ∣ C k ) = P ( C k ) P ( x ) ∏ j = 1 n P ( x j ∣ C k ) ( 6 ) P(C_k|x) = \frac{P(C_k)}{P(x)} P(x_1|C_k)P(x_2|C_k)......P(x_n|C_k) \\ = \frac{P(C_k)}{P(x)} \prod_{j=1}^{n}P(x_j|C_k) \quad(6) P(Ckx)=P(x)P(Ck)P(x1Ck)P(x2Ck)......P(xnCk)=P(x)P(Ck)j=1nP(xjCk)(6)

对任一给定的样本x的值是确定的,且x不依赖于C,所以P(x)可以看作常量。所以可以忽略 P ( x ) P(x) P(x)
KaTeX parse error: Limit controls must follow a math operator at position 84: …orname{argmax} \̲l̲i̲m̲i̲t̲s̲_{k \in \{1,2,.…
这就是朴素贝叶斯分类的模型函数。

参数估计

上述公式中主要有两项,分别考察一下如何计算。

参数1: P ( C k ) P(C_k) P(Ck)

上式中 P ( C k ) P(C_k) P(Ck) 比较容易计算,用频率来估算概率,统计m个样本中属于 C k C_k Ck 的样本的频率即可。设m个样本中有 m k m_k mk 个样本的类别是 C k C_k Ck,则
P ( C k ) = m k / m ( 8 ) P(C_k) = m_k / m \quad(8) P(Ck)=mk/m(8)

参数2: P ( x j ∣ C k ) P(x_j|C_k) P(xjCk)

P ( x j ∣ C k ) P(x_j|C_k) P(xjCk)的计算需要事先假设样本特征 x j x_j xj的数据分布情况。对特征分布的假设,我们称之为事件模型,通常会采用以下三种假设。

  1. 多项式分布
    如果特征 x j x_j xj是离散值,可以假设它符合 多项式分布。可以统计 x j x_j xj的某个特征在样本中的频率来估算其概率。
    假设 特征 x j x_j xj S j S_j Sj 个可能的取值(比如天气有阴、晴、雨三种状态,则 S j = 3 S_j=3 Sj=3),并且在n个样本中,类别为 C k C_k Ck、特征 x j x_j xj 取值为 s 的样本有 m k j s m_{kjs} mkjs 个。则

P ( x j s ∣ C k ) = m k j s / m k ( 9 ) P(x_{js}|C_k) = m_{kjs} / m_k \quad(9) P(xjsCk)=mkjs/mk(9)
有时候样本中某个特征的特定取值的样本数 m k j s = 0 m_{kjs} = 0 mkjs=0,这将导致整个 P ( C k ) ∏ j = 1 n P ( x j ∣ C k ) = 0 P(C_k) \prod_{j=1}^{n}P(x_j|C_k) = 0 P(Ck)j=1nP(xjCk)=0,严重扭曲了该特征的概率分布。因此,通常可以采用拉普拉斯平滑来避免这种情况发生。即
P ( x j s ∣ C k ) = ( m k j s + λ ) / ( m k + S j λ ) ( 10 ) P(x_{js}|C_k) = (m_{kjs} + \lambda) \big/ (m_k + S_j \lambda) \quad(10) P(xjsCk)=(mkjs+λ)/(mk+Sjλ)(10)
通常取 λ = 1 \lambda = 1 λ=1
将(8)和(10)带入贝叶斯分类器(7),得到

KaTeX parse error: Limit controls must follow a math operator at position 30: …orname{argmax} \̲l̲i̲m̲i̲t̲s̲_{k \in \{1,2,.…

用一个粗略的示意图来理解一下特征为离散值时,条件概率 P ( x j s ∣ C k ) P(x_{js}|C_k) P(xjsCk)如何根据样本集来进行估算:

特征为离散值
图中表示整个样本空间,有两个类别 C 1 , C 2 C_1, C_2 C1,C2,每个样本有两个特征 x 1 , x 2 x_1, x_2 x1,x2,其中 x 1 x_1 x1 有3个可取的离散值 S 11 , S 12 , S 13 S_{11}, S_{12}, S_{13} S11,S12,S13 x 2 x_2 x2 有4个可取的离散值 S 21 , S 22 , S 23 , S 24 S_{21}, S_{22}, S_{23}, S_{24} S21,S22,S23,S24。图中橙色部分就是 m 111 m_{111} m111,即 类别= C 1 C_1 C1,特征= x 1 x_1 x1,特征值= S 11 S_{11} S11时(k=1,j=1,s=1)的样本数,蓝色部分就是 m 123 m_{123} m123,即 类别= C 1 C_1 C1,特征= x 2 x_2 x2,特征值= S 23 S_{23} S23时(k=1,j=2,s=3)的样本数。整个灰色部分是 m 1 m_1 m1,即类别为 C 1 C_1 C1的样本数。

举例:根据天气情况决定是否打网球
本案例来自 朴素贝叶斯分类器

打网球样本

上面表格是某同学在不同天气情况下的打网球决策数据。
假设今天天气状况是:Outlook=sunny, Temperature=cool,Humidity=high,Wind=strong,该同学是否会去打网球呢?
这里的几个特征,天气、温度、湿度、风速都是离散型变量,适合采用上面的多项式贝叶斯分类方法。将上面的公式写在这里便于查看。
KaTeX parse error: Limit controls must follow a math operator at position 28: …orname{argmax} \̲l̲i̲m̲i̲t̲s̲_{k \in \{1,2,.…

我们需要计算 k = { y e s , n o } k=\{yes, no\} k={yes,no} 两种情况下, x = ( s u n n y , c o o l , h i g h , s t r o n g ) x=(sunny,cool,high,strong) x=(sunny,cool,high,strong) 的估算概率。
统计上表中各种情况下的样本数量可知:
总样本数 m=14

打球(k=yes)的样本数 m y e s m_{yes} myes = 9
不打球(k=no)的样本数 m n o m_{no} mno = 5

天气的取值 S O u t l o o k = 3 S_{Outlook}=3 SOutlook=3(Sunny/Overcast/Rain)
晴天打球(k=yes,j=Outlook,s=sunny)的样本数 m k j s = 2 m_{kjs}=2 mkjs=2
晴天不打球(k=no,j=Outlook,s=sunny)的样本数 m k j s = 3 m_{kjs}=3 mkjs=3

温度的取值 S T e m p e r a t u r e = 3 S_{Temperature}=3 STemperature=3(Hot/Mild/Cool)
冷天打球(k=yes,j=Temperature,s=cool)的样本数 m k j s = 3 m_{kjs}=3 mkjs=3
冷天不打球(k=no,j=Temperature,s=cool)的样本数 m k j s = 1 m_{kjs}=1 mkjs=1

湿度的取值 S H u m i d i t y = 2 S_{Humidity}=2 SHumidity=2(High/Normal)
潮湿天打球(k=yes,j=Humidity,s=high)的样本数 m k j s = 3 m_{kjs}=3 mkjs=3
潮湿天不打球(k=no,j=Humidity,s=high)的样本数 m k j s = 4 m_{kjs}=4 mkjs=4

风力的取值 S W i n d = 2 S_{Wind}=2 SWind=2(Strong/Weak)
大风天打球(k=yes,j=Wind,s=strong)的样本数 m k j s = 3 m_{kjs}=3 mkjs=3
大风天不打球(k=no,j=Wind,s=strong)的样本数 m k j s = 3 m_{kjs}=3 mkjs=3

将上述数据代入公式(11),对于样本 x = ( s u n n y , c o o l , h i g h , s t r o n g ) x=(sunny,cool,high,strong) x=(sunny,cool,high,strong) ,打球(k=yes)的概率
k = y e s m k m ∏ j = 1 n m k j s + λ m k + S j λ = 9 14 ( 2 + 1 9 + 3 ) ( 3 + 1 9 + 3 ) ( 3 + 1 9 + 2 ) ( 3 + 1 9 + 2 ) = 0.007084 k=yes \\ \frac{m_k}{m} \prod_{j=1}^{n} \frac{m_{kjs} + \lambda}{m_k + S_j \lambda} \\ = \frac{9}{14} \Big( \frac{2 + 1}{9 + 3} \Big) \Big( \frac{3 + 1}{9 + 3} \Big) \Big( \frac{3 + 1}{9 + 2} \Big) \Big( \frac{3 + 1}{9 + 2} \Big) \\ = 0.007084 k=yesmmkj=1nmk+Sjλmkjs+λ=149(9+32+1)(9+33+1)(9+23+1)(9+23+1)=0.007084
不打球(k=nos)的概率
k = n o m k m ∏ j = 1 n m k j s + λ m k + S j λ = 5 14 ( 3 + 1 5 + 3 ) ( 1 + 1 5 + 3 ) ( 4 + 1 5 + 2 ) ( 3 + 1 5 + 2 ) = 0.01822 k=no \\ \frac{m_k}{m} \prod_{j=1}^{n} \frac{m_{kjs} + \lambda}{m_k + S_j \lambda} \\ = \frac{5}{14} \Big( \frac{3 + 1}{5 + 3} \Big) \Big( \frac{1 + 1}{5 + 3} \Big) \Big( \frac{4 + 1}{5 + 2} \Big) \Big( \frac{3 + 1}{5 + 2} \Big) \\ = 0.01822 k=nommkj=1nmk+Sjλmkjs+λ=145(5+33+1)(5+31+1)(5+24+1)(5+23+1)=0.01822

这里 0.01822 > 0.007084,所以该同学可能不会去打球。经过归一化,
不打球的概率 = 0.01822 / (0.01822 + 0.007084) = 72%
(注:这里计算结果与原案例中的数值不同,因为这里有做拉普拉斯平滑,原案例中没有。本案例中其实没有出现特定特征的样本数为0的情况,可以不用做拉普拉斯平滑,不过这里是按照公式写下来的,就按公式计算了)

  1. 伯努利分布
    如果特征 x j x_j xj是稀疏二项离散值,可以假设它符合 伯努利分布。上面打网球的案例中,湿度取值是 {high,normal},风力取值是 {strong,weak},这两个特征都是二项离散值。
    伯努利分布只有两种可能的取值,我们将其编码为 {0,1},则
    P ( x j s ∣ C k ) = { P ( x j s = 1 ∣ C k ) P ( x j s = 0 ∣ C k ) = 1 − P ( x j s = 1 ∣ C k ) ( 12 ) P(x_{js}|C_k) = \begin{cases} P(x_{js}=1|C_k) \\ P(x_{js}=0|C_k) = 1 - P(x_{js}=1|C_k) \end{cases} \quad(12) P(xjsCk)={P(xjs=1Ck)P(xjs=0Ck)=1P(xjs=1Ck)(12)

另外注意到伯努利分布其实是多项式分布的特例,所以我们可以用上面公式(12)计算,也可以用之前多项式分布公式(11)计算。

垃圾邮件分类等涉及文本的任务中可以采用伯努利分布,比如构造一个5000个不同单词的向量作为输入特征x,对于一段文本,其中有出现的单词,在x中对应单词的位置设为1,其它位置为0,这样x中的每个特征(单词)的取值为1或0,符合伯努利分布。

  1. 高斯分布
    如果特征 x j x_j xj是连续变量,可以假设它符合 高斯分布(正态分布)。准确点说,是假设每个类别 C k C_k Ck 下的 x k j x_{kj} xkj 符合高斯分布。这样,我们可以通过高斯分布的概率密度函数来计算样本中 x j x_j xj 某个特定值的条件概率 P ( x j s ∣ C k ) P(x_{js}|C_k) P(xjsCk)。高斯分布的概率密度函数为:
    f ( x ; μ , σ ) = 1 σ 2 π e x p ( − ( x − μ ) 2 2 σ 2 ) f(x;\mu,\sigma) = \frac{1}{\sigma \sqrt{2 \pi}} exp \Big( - \frac{(x-\mu)^2}{2 \sigma ^2} \Big) f(x;μ,σ)=σ2π 1exp(2σ2(xμ)2)
    其中 μ \mu μ 是均值, σ 2 \sigma^2 σ2是方差。
    假设在类别 C k C_k Ck 中,特征 x j x_j xj 的均值为 μ k j \mu_{kj} μkj,方差为 σ k j 2 \sigma_{kj}^2 σkj2(这两项可以通过样本数据统计出来)。则
    P ( x j ∣ C k ) = 1 σ k j 2 π e x p ( − ( x j − μ k j ) 2 2 σ k j 2 ) P(x_{j}|C_k) = \frac{1}{\sigma_{kj} \sqrt{2 \pi}} exp \Big( - \frac{(x_j-\mu_{kj})^2}{2 \sigma_{kj} ^2} \Big) P(xjCk)=σkj2π 1exp(2σkj2(xjμkj)2)

案例请参考 维基百科 - 案例 - 性别分类

处理连续数值问题的另一种常用的技术是通过离散化连续数值的方法。通常,当训练样本数量较少或者是精确的分布已知时,通过概率分布的方法是一种更好的选择。
而在大量样本的情形下离散化的方法表现更优,因为大量的样本可以学习到数据的实际分布,而不用“朴素”的假设其分布。典型情况下很多任务都会提供大量的样本,所以这时选择离散化方法会比概率分布估计的方法更好。

题外话

顺便说一句,每次看到朴素这个词,我就仿佛看到贝叶斯穿着一身打满补丁衣服的样子。而naive意思是缺乏经验的;幼稚的;无知的;轻信的。从公式推导过程来看,朴素贝叶斯分类器采用了一些简化条件的假设,比如假设 x 的各特征 x 1 , x 2 , . . . . . . x n x_1,x_2,......x_n x1,x2,......xn 是条件独立的,假设样本特征数据符合多项式分布、伯努利分布、高斯分布等,这些假设都可能不完全符合实际情况,因为对险恶的现实世界的无知从而采用了一些天真的假设。
不过,朴素还有一层含义是专一、纯粹,在这个意义上,贝叶斯分类也算大道至简,大智若愚了。

优缺点

朴素贝叶斯的主要优点有:

1)算法简单,有稳定的分类效率。
2)对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。
3)对缺失数据不太敏感。

朴素贝叶斯的主要缺点有:   
1)“朴素”的假设如果与实际情况不符,会影响模型效果。
2)输入特征数据的表现形式,比如是连续特征,离散特征还是二元特征,会影响概率计算和模型的分类效果。

参考

朴素贝叶斯算法原理小结
朴素贝叶斯分类器
维基百科 - Naive Bayes classifier
理解贝叶斯定理

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我知道了。针对你的问题,我可以为你提供一个简单的朴素贝叶斯算法的实现示例,用于新闻分类。以下是使用Scikit-learn库实现朴素贝叶斯分类器的示例代码: ```python import numpy as np from sklearn.datasets import fetch_20newsgroups from sklearn.feature_extraction.text import CountVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.pipeline import Pipeline # 加载20个新闻组数据集 newsgroups_train = fetch_20newsgroups(subset='train', categories=None) newsgroups_test = fetch_20newsgroups(subset='test', categories=None) # 定义朴素贝叶斯分类器的管道 text_clf = Pipeline([ ('vect', CountVectorizer()), # 特征提取器 ('clf', MultinomialNB()), # 分类器 ]) # 训练并预测 text_clf.fit(newsgroups_train.data, newsgroups_train.target) predicted = text_clf.predict(newsgroups_test.data) # 输出分类结果 print("分类准确率:", np.mean(predicted == newsgroups_test.target)) ``` 这个示例代码首先加载了20个新闻组数据集,然后使用管道定义了一个朴素贝叶斯分类器。管道中包含一个特征提取器(CountVectorizer)和一个分类器(MultinomialNB)。特征提取器将文本数据转换为一组特征向量,而分类器则使用这些特征向量进行分类。 最后,我们使用训练集训练分类器,并在测试集上进行预测。输出分类准确率。这个示例代码可以帮助你了解如何使用Scikit-learn库实现朴素贝叶斯分类器来进行新闻分类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值