朴素贝叶斯(naive bayes)原理小结

  • 1. 朴素贝叶斯的学习
    • 1.1 基本假设:条件独立性
    • 1.2 朴素贝叶斯分类器
    • 1.3 后验概率的含义
  • 2. 参数估计
    • 2.1 极大似然估计
    • 2.2 贝叶斯估计:极大似然估计+平滑机制
    • 2.3 分类算法
  • 3. 代码示例:朴素贝叶斯 文本分类
    • (1)加载数据
    • (2)文本预处理(清洗文本,分词,去除停用词)
    • (3)抽取文本特征:使用词袋模型
    • (4)训练贝叶斯模型(多项式贝叶斯)
    • (5)评价指标&测试
  • 4. 模型评价
  • 完整代码地址
  • 参考

本博客中使用到的完整代码请移步至: 我的github:https://github.com/qingyujean/Magic-NLPer,求赞求星求鼓励~~~


朴素贝叶斯,基于贝叶斯定理特征条件独立假设

条件概率公式: P ( A ∣ B ) = P ( A B ) P ( B ) P(A|B)=\frac{P(AB)}{P(B)} P(A∣B)=P(B)P(AB)​

全概率公式: P ( A ) = ∑ i = 1 n P ( A B i ) = ∑ i = 1 n P ( B i ) P ( A ∣ B i ) P(A)=\sum\limits_{i=1}^n P(AB_i)=\sum\limits_{i=1}^n P(B_i)P(A|B_i) P(A)=i=1∑n​P(ABi​)=i=1∑n​P(Bi​)P(A∣Bi​)

适用问题:多类分类

模型特点:特征与类别的联合概率分布,特征条件独立性

模型类型:生成模型

损失函数:对数似然损失

学习策略:极大似然估计,最大后验概率估计

学习算法:概率计算公式

1. 朴素贝叶斯的学习

1.1 基本假设:条件独立性

设输入空间 X ∈ R n \mathcal{X}\in \mathbf{R}^n X∈Rn,输出为类标记,输出空间为 Y ∈ c 1 , c 2 , . . . , c K \mathcal{Y}\in{c_1,c_2,...,c_K} Y∈c1​,c2​,...,cK​,设训练集
T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),...,{(x_N,y_N)}\} T={(x1​,y1​),(x2​,y2​),...,(xN​,yN​)}由 联合概率分布 P ( X , Y ) P(X,Y) P(X,Y) 独立同分布 产生。

朴素贝叶斯,就是基于给定的训练集,在基于 特征条件独立的假设 下,学习联合概率分布 P ( X , Y ) P(X,Y) P(X,Y)。 P ( X , Y ) P(X,Y) P(X,Y)就是学得的模型,然后用于预测,预测时要使用到贝叶斯定理。

先验概率分布: P ( Y = c k ) P(Y=c_k) P(Y=ck​)

条件概率分布: P ( X = x ∣ Y = c k ) = P ( X ( 1 ) = x ( 1 ) , . . . , X ( n ) = x ( n ) ∣ Y = c k ) P(X=x|Y=c_k)=P(X^{(1)}=x^{(1)},...\,,X^{(n)}=x^{(n)}|Y=c_k) P(X=x∣Y=ck​)=P(X(1)=x(1),...,X(n)=x(n)∣Y=ck​)

后验概率分布: P ( Y = c k ∣ X = x ) P(Y=c_k|X=x) P(Y=ck​∣X=x)

朴素贝叶斯法对如上条件概率作了“特征条件独立假设”
P ( X = x ∣ Y = c k ) = ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) P(X=x|Y=c_k)=\prod\limits_{j=1}^nP(X^{(j)}=x^{(j)}|Y=c_k) P(X=x∣Y=ck​)=j=1∏n​P(X(j)=x(j)∣Y=ck​)
这是一个较强的假设,它使得朴素贝叶斯法实现简单,高效,易于实现,但有时会牺牲一定的分类准确率。不过在实际应用中,朴素贝叶斯也有work的很好的时候,比如垃圾邮件分类,文本分类。

条件概率分布 P ( X = x ∣ Y = c k ) P(X=x|Y=c_k) P(X=x∣Y=ck​)的参数数量是指数级的。假设 x ( j ) x^{(j)} x(j)的取值有 S j S_j Sj​个, Y Y Y的取值有 K K K个,则参数总个数为: K ∏ j = 1 n S j K\prod\limits_{j=1}^nS_j Kj=1∏n​Sj​

1.2 朴素贝叶斯分类器

在给定训练集学习到联合概率分布 P ( X , Y ) P(X,Y) P(X,Y)后,就可以对给定的输入 x x x 做类别预测了,即计算后验概率 P ( Y = c k ∣ X = x ) P(Y=c_k|X=x) P(Y=ck​∣X=x),后验概率最大的类作为预测结果。计算时使用 贝叶斯定理

P ( Y = c k ∣ X = x ) = P ( X = x , Y = c k ) P ( X = x ) = P ( X = x ∣ Y = c k ) P ( Y = c k ) ∑ k P ( X = x ∣ Y = c k ) P ( Y = c k ) = P ( Y = c k ) ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) ∑ k P ( Y = c k ) ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) \begin{aligned}P(Y=c_k|X=x)&=\frac{P(X=x,Y=c_k)}{P(X=x)}\\&=\frac{P(X=x|Y=c_k)P(Y=c_k)}{\sum\limits_k P(X=x|Y=c_k)P(Y=c_k)}\\&=\frac{P(Y=c_k)\prod\limits_{j=1}^nP(X^{(j)}=x^{(j)}|Y=c_k)}{\sum\limits_k P(Y=c_k)\prod\limits_{j=1}^nP(X^{(j)}=x^{(j)}|Y=c_k)}\end{aligned} P(Y=ck​∣X=x)​=P(X=x)P(X=x,Y=ck​)​=k∑​P(X=x∣Y=ck​)P(Y=ck​)P(X=x∣Y=ck​)P(Y=ck​)​=k∑​P(Y=ck​)j=1∏n​P(X(j)=x(j)∣Y=ck​)P(Y=ck​)j=1∏n​P(X(j)=x(j)∣Y=ck​)​​

所以,朴素贝叶斯分类器可表示为:

y = f ( x ) = arg max ⁡ c k P ( Y = c k ∣ X = x ) = arg max ⁡ c k P ( Y = c k ) ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) ∑ k P ( Y = c k ) ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) \begin{aligned}y=f(x)&=\argmax\limits_{c_k}P(Y=c_k|X=x)\\&=\argmax\limits_{c_k}\frac{P(Y=c_k)\prod\limits_{j=1}^nP(X^{(j)}=x^{(j)}|Y=c_k)}{\sum\limits_k P(Y=c_k)\prod\limits_{j=1}^nP(X^{(j)}=x^{(j)}|Y=c_k)}\end{aligned} y=f(x)​=ck​argmax​P(Y=ck​∣X=x)=ck​argmax​k∑​P(Y=ck​)j=1∏n​P(X(j)=x(j)∣Y=ck​)P(Y=ck​)j=1∏n​P(X(j)=x(j)∣Y=ck​)​​

分母对所有 c k c_k ck​都一样,所以朴素贝叶斯分类器可简化为:

y = arg max ⁡ c k P ( Y = c k ) ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) y=\argmax\limits_{c_k}P(Y=c_k)\prod\limits_{j=1}^nP(X^{(j)}=x^{(j)}|Y=c_k) y=ck​argmax​P(Y=ck​)j=1∏n​P(X(j)=x(j)∣Y=ck​)

1.3 后验概率的含义

后验概率最大化等价于0-1损失的期望风险最小化。

基于后验概率 P ( Y = c k ∣ X = x ) P(Y=c_k|X=x) P(Y=ck​∣X=x)可知样本 x x x分类为 c k c_k ck​所产生的期望损失,即在样本 x x x上的条件风险为:
R ( c k ∣ X = x ) = ∑ k = 1 K L ( c k , f ( x ) ) P ( c k ∣ X = x ) R(c_k|X=x)=\sum\limits_{k=1}^K L(c_k,f(x))P(c_k|X=x) R(ck​∣X=x)=k=1∑K​L(ck​,f(x))P(ck​∣X=x)

其中 L ( Y , f ( X ) ) L(Y,f(X)) L(Y,f(X))为0-1损失函数: L ( Y , f ( X ) ) = { 1 Y ≠ f ( X ) 0 Y = f ( X ) L(Y,f(X))=\begin{cases}1&\;Y\ne f(X)\\ 0&\;Y=f(X)\\ \end{cases} L(Y,f(X))={10​Y​=f(X)Y=f(X)​

那么总体风险(期望风险函数)则为:

R e x p ( f ) = E X R ( c k ∣ X = x ) = E X ∑ k = 1 K [ L ( c k , f ( X ) ) ] P ( c k ∣ X ) R_{exp}(f)=E_XR(c_k|X=x)=E_X\sum\limits_{k=1}^K[L(c_k,f(X))]P(c_k|X) Rexp​(f)=EX​R(ck​∣X=x)=EX​k=1∑K​[L(ck​,f(X))]P(ck​∣X)

显然,对每个样本 x x x若能使得其相应的条件风险 R ( c k ∣ X = x ) R(c_k|X=x) R(ck​∣X=x)最小化,则总体风险 R e x p ( f ) R_{exp}(f) Rexp​(f)也将被最小化。这样就产生了 贝叶斯判定准则为最小化总体风险,只需在每个样本上选择那个能使条件风险 R ( c k ∣ X = x ) R(c_k|X=x) R(ck​∣X=x)最小的类别标记,即:
f ∗ ( x ) = arg min ⁡ c k R ( c k ∣ X = x ) f^*(x)=\argmin\limits_{c_k}R(c_k|X=x) f∗(x)=ck​argmin​R(ck​∣X=x)

期望风险最小化:

f ( x ) = arg min ⁡ y ∈ Y ∑ k = 1 K L ( c k , y ) P ( c k ∣ X = x ) = arg min ⁡ y ∈ Y P ( y ≠ c k ∣ X = x ) = arg min ⁡ y ∈ Y 1 − P ( y = c k ∣ X = x ) = arg max ⁡ y ∈ Y P ( y = c k ∣ X = x ) \begin{aligned}f(x)&=\argmin\limits_{y\in\mathcal{Y}}\sum\limits_{k=1}^KL(c_k,y)P(c_k|X=x)\\&=\argmin\limits_{y\in\mathcal{Y}}P(y\ne c_k|X=x)\\&=\argmin\limits_{y\in\mathcal{Y}}1-P(y= c_k|X=x)\\&=\argmax\limits_{y\in\mathcal{Y}}P(y= c_k|X=x)\end{aligned} f(x)​=y∈Yargmin​k=1∑K​L(ck​,y)P(ck​∣X=x)=y∈Yargmin​P(y​=ck​∣X=x)=y∈Yargmin​1−P(y=ck​∣X=x)=y∈Yargmax​P(y=ck​∣X=x)​

如此,根据期望最小化准则,就得到了后验概率最大化准则:

f ∗ ( x ) = arg max ⁡ c k P ( c k ∣ X = x ) f^*(x)=\argmax\limits_{c_k}P(c_k|X=x) f∗(x)=ck​argmax​P(ck​∣X=x)

即对每个样本 x x x,应选择能使后验概率 P ( c k ∣ X = x ) P(c_k|X=x) P(ck​∣X=x)最大的类别标记。

此时, f ∗ f^* f∗成为贝叶斯最优分类器,与之对应的总体风险 R ( f ∗ ) R(f^*) R(f∗)称为贝叶斯风险。 1 − R ( f ∗ ) 1-R(f^*) 1−R(f∗)反映了分类器所能达到的最好性能,即通过机器学习所能产生的模型精度的理论上限。

2. 参数估计

朴素贝叶斯法中,学习就意味着估计先验概率 P ( Y = c k ) P(Y=c_k) P(Y=ck​)和条件概率 P ( X ( j ) = x ( j ) ∣ Y = c k ) P(X^{(j)}=x^{(j)}|Y=c_k) P(X(j)=x(j)∣Y=ck​)。

2.1 极大似然估计

先验概率表达了特征空间中各类样本所占比例,根据大数定律,当训练集包含充足的独立同分布的样本时, P ( Y = c k ) P(Y=c_k) P(Y=ck​)可通过各类样本出现的频率来进行估计。

先验概率的极大似然估计

P ( Y = c k ) = ∑ i = 1 N I ( y i = c k ) N , k = 1 , 2 , . . . , K P(Y=c_k)=\frac{\sum\limits_{i=1}^NI(y_i=c_k)}{N},\;\;k=1,2,...,K P(Y=ck​)=Ni=1∑N​I(yi​=ck​)​,k=1,2,...,K

对于条件概率 P ( X = x ∣ Y = c k ) = P ( X ( 1 ) = x ( 1 ) , . . . , X ( n ) = x ( n ) ∣ Y = c k ) P(X=x|Y=c_k)=P(X^{(1)}=x^{(1)},...\,,X^{(n)}=x^{(n)}|Y=c_k) P(X=x∣Y=ck​)=P(X(1)=x(1),...,X(n)=x(n)∣Y=ck​)来说,由于它涉及 x x x所有属性的联合概率,直接根据样本的频率估计将会遇到严重的困难,显然直接使用频率来估计是不可行的。朴素贝叶斯采用了“特征/属性条件独立性”:对已知类别,假设所有属性相互独立。即:

P ( X = x ∣ Y = c k ) = ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) P(X=x|Y=c_k)=\prod\limits_{j=1}^nP(X^{(j)}=x^{(j)}|Y=c_k) P(X=x∣Y=ck​)=j=1∏n​P(X(j)=x(j)∣Y=ck​)

此时,便可以使用频率来估计各类样本的某个属性出现的条件概率 P ( X ( j ) = a j l ∣ Y = c k ) P(X^{(j)}=a_{jl}|Y=c_k) P(X(j)=ajl​∣Y=ck​),即为每个属性来估计条件概率

条件概率的极大似然估计

P ( X ( j ) = a j l ∣ Y = c k ) = ∑ i = 1 N I ( x i ( j ) = a j l , y i = c k ) ∑ i = 1 N I ( y i = c k ) , j = 1 , 2 , . . . , n 表 示 第 i 个 样 本 的 第 j 个 特 征 ; l = 1 , 2 , . . . , S j 表 示 第 j 个 特 征 的 第 l 个 取 值 ; k = 1 , 2 , 3... , K \begin{aligned}P(X^{(j)}=&a_{jl}|Y=c_k)=\frac{\sum\limits_{i=1}^NI(x_i^{(j)}=a_{jl},y_i=c_k)}{\sum\limits_{i=1}^NI(y_i=c_k)}\;,\\&j=1,2,...,n\; 表示第i个样本的第j个特征;\\&l=1,2,...,S_j\;表示第j个特征的第l个取值;\\&k=1,2,3...,K\end{aligned} P(X(j)=​ajl​∣Y=ck​)=i=1∑N​I(yi​=ck​)i=1∑N​I(xi(j)​=ajl​,yi​=ck​)​,j=1,2,...,n表示第i个样本的第j个特征;l=1,2,...,Sj​表示第j个特征的第l个取值;k=1,2,3...,K​

其中N和K分别表示共有N个样本和K个类别, I I I为指示函数

【注意】
如果 x ( j ) x^{(j)} x(j)是连续属性,则假定 P ( X ( j ) ∣ Y = c k ) ∼ N ( μ j k , σ j k 2 ) P(X^{(j)}|Y=c_k)\sim\mathcal{N}(\mu_{jk},\sigma^2_{jk}) P(X(j)∣Y=ck​)∼N(μjk​,σjk2​),其中 μ j k \mu_{jk} μjk​和 σ j k 2 \sigma^2_{jk} σjk2​分别是第 c k c_k ck​类样本在第 j j j个属性上取值的均值方差,则有 P ( X ( j ) ∣ Y = c k ) = 1 2 π σ exp ⁡ ( − ( x ( j ) − μ j k ) 2 2 σ j k 2 ) P(X^{(j)}|Y=c_k)=\frac{1}{\sqrt{2\pi}\sigma}\exp\big(-\frac{(x^{(j)}-\mu_{jk})^2}{2\sigma_{jk}^2} \big) P(X(j)∣Y=ck​)=2π ​σ1​exp(−2σjk2​(x(j)−μjk​)2​)。

2.2 贝叶斯估计:极大似然估计+平滑机制

极大似然估计的计算式中有连乘运算 ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) \prod\limits_{j=1}^nP(X^{(j)}=x^{(j)}|Y=c_k) j=1∏n​P(X(j)=x(j)∣Y=ck​),如果其中一个概率值为0,就会影响后验概率 P ( Y = c k ∣ X = x ) P(Y=c_k|X=x) P(Y=ck​∣X=x)的计算,使分类结果产生偏差。很多样本的取值在训练集中可能没有出现,但这不代表概率就为0。

此时可在计算中引入一个平滑因子 λ ⩾ 0 \lambda\geqslant0 λ⩾0, λ = 0 \lambda=0 λ=0时就是极大似然估计。取 λ > 0 \lambda \gt0 λ>0时等价于在随机变量各个取值的频数上都赋予一个正数。 λ = 1 \lambda=1 λ=1时称为 拉普拉斯平滑

先验概率的贝叶斯估计

P λ ( Y = c k ) = ∑ i = 1 N I ( y i = c k ) + λ N + K λ , k = 1 , 2 , . . . , K P_\lambda(Y=c_k)=\frac{\sum\limits_{i=1}^NI(y_i=c_k)+\lambda}{N+K\lambda},\;\;k=1,2,...,K Pλ​(Y=ck​)=N+Kλi=1∑N​I(yi​=ck​)+λ​,k=1,2,...,K

条件概率的贝叶斯估计

P λ ( X ( j ) = a j l ∣ Y = c k ) = ∑ i = 1 N I ( x i ( j ) = a j l , y i = c k ) + λ ∑ i = 1 N I ( y i = c k ) + S j λ , j = 1 , 2 , . . . , n 表 示 第 i 个 样 本 的 第 j 个 特 征 ; l = 1 , 2 , . . . , S j 表 示 第 j 个 特 征 的 第 l 个 取 值 ; k = 1 , 2 , 3... , K \begin{aligned}P_\lambda(X^{(j)}=&a_{jl}|Y=c_k)=\frac{\sum\limits_{i=1}^NI(x_i^{(j)}=a_{jl},y_i=c_k)+\lambda}{\sum\limits_{i=1}^NI(y_i=c_k)+S_j\lambda}\;,\\&j=1,2,...,n\; 表示第i个样本的第j个特征;\\&l=1,2,...,S_j\;表示第j个特征的第l个取值;\\&k=1,2,3...,K\end{aligned} Pλ​(X(j)=​ajl​∣Y=ck​)=i=1∑N​I(yi​=ck​)+Sj​λi=1∑N​I(xi(j)​=ajl​,yi​=ck​)+λ​,j=1,2,...,n表示第i个样本的第j个特征;l=1,2,...,Sj​表示第j个特征的第l个取值;k=1,2,3...,K​

引入平滑因子后, P λ ( X ( j ) = a j l ∣ Y = c k ) P_\lambda(X^{(j)}=a_{jl}|Y=c_k) Pλ​(X(j)=ajl​∣Y=ck​)仍然具有概率性质,因为有:

P λ ( X ( j ) = a j l ∣ Y = c k ) > 0 ∑ l = 1 S j P λ ( X ( j ) = a j l ∣ Y = c k ) = 1 \begin{aligned}&P_\lambda(X^{(j)}=a_{jl}|Y=c_k) \gt0\\&\sum\limits_{l=1}^{S_j}P_\lambda(X^{(j)}=a_{jl}|Y=c_k)=1\end{aligned} ​Pλ​(X(j)=ajl​∣Y=ck​)>0l=1∑Sj​​Pλ​(X(j)=ajl​∣Y=ck​)=1​

表明 P λ ( X ( j ) = a j l ∣ Y = c k ) P_\lambda(X^{(j)}=a_{jl}|Y=c_k) Pλ​(X(j)=ajl​∣Y=ck​) 确为一种概率分布。

拉普拉斯修正避免了因训练集样本不充分而导致的概率估值为0的问题,并且在训练集变大时,修正所引入的先验影响(拉普拉斯修正实质上假设了属性值与类别均匀分布)也会逐渐变得可忽略,使得估值逐渐趋向于实际概率值。

2.3 分类算法

基于极大似然估计的朴素贝叶斯算法:


scikit-learn中,一共有3个朴素贝叶斯的分类算法类:分别是GaussianNBMultinomialNBBernoulliNB。其中GaussianNB就是先验为高斯分布的朴素贝叶斯,MultinomialNB就是先验为多项式分布的朴素贝叶斯,而BernoulliNB就是先验为伯努利分布的朴素贝叶斯。

这三个类适用的分类场景各不相同,一般来说,如果样本特征的分布大部分是连续值,使用GaussianNB会比较好。如果如果样本特征的分布大部分是多元离散值,使用MultinomialNB比较合适。而如果样本特征是二元离散值或者很稀疏的多元离散值,应该使用BernoulliNB

3. 代码示例:朴素贝叶斯 文本分类

下面使用朴素贝叶斯,来实现一个中文文本分类的任务,数据是二分类:

  • 数据说明:文本二分类,1和0,判断是否属于政治上的出访类事件
  • 数据来源:https://github.com/ares5221/ALBERT_text_classification

(1)加载数据

df_train = pd.read_csv(data_dir+'train.txt', encoding='UTF-8', sep='\s', header=None,names=['label', 'content'], index_col=False)
df_train = df_train.dropna() # 过滤含有NaN的数据df_test = pd.read_csv(data_dir+'test.txt', encoding='UTF-8', sep='\s', header=None,names=['label', 'content'], index_col=False)
df_test = df_test.dropna() # 过滤含有NaN的数据print(df_train.head())
print()
print(df_train['label'].value_counts())

输出:

   label                                            content
0      1  当地时间2月10日,白宫发表声明称,美国总统特朗普及夫人梅拉尼娅将于2月24日至25日访问印...
1      0  俄罗斯卫星通讯社11日最新消息,菲律宾总统杜特尔特已下令终止与美国间的《访问部队协定》(VFA)。
2      1  据俄罗斯卫星网6日报道,土耳其总统发言人卡林表示,俄罗斯军事代表团将于近日访问安卡拉,讨论叙...
3      0  先来说说什么是LPDDR5:要知道,手机中有两种内存颗粒,一种就是DRAM也就是大家常说的“...
4      1  在疫情的关键时刻,出现了一件令人感动的事情,让我们明白这才是真正的好朋友,不惧疫情访问我国,...0    151
1    149
Name: label, dtype: int64

查看训练集,测试集各多少条样本:

print(df_train.shape, df_test.shape)

输出:

(300, 2) (80, 2)

(2)文本预处理(清洗文本,分词,去除停用词)

# 保留文本中文、数字、英文、短横线
def clear_text(text):p = re.compile(r"[^\u4e00-\u9fa5^0-9^a-z^A-Z\-、,。!?:;()《》【】,!\?:;[\]()]")  # 匹配不是中文、数字、字母、短横线的部分字符return p.sub('', text)  # 将text中匹配到的字符替换成空字符# 加载停用词表
def load_stopwords_file(filename):print('加载停用词...')stopwords=pd.read_csv(filename, index_col=False, quoting=3, sep="\t", names=['stopword'], encoding='utf-8')#quoting:控制引用字符引用行为,QUOTE_MINIMAL (0), QUOTE_ALL (1), QUOTE_NONNUMERIC (2) or QUOTE_NONE (3).stopwords = set(stopwords['stopword'].values)print('停用词表大小:', len(stopwords))return stopwords# 文本预处理:清洗,分词,并去除停用词
def preprocess_text(df_content):stopwords_set = load_stopwords_file(stopwords_file) # 加载停用词表content_seg = []#分词后的contentfor i,text in enumerate(df_content):text = clear_text(text.strip())segs = jieba.lcut(text, cut_all=False)  # cut_all=False是精确模式,True是全模式;默认模式是False 返回分词后的列表segs = filter(lambda x: len(x.strip())>1, segs)  # 词长度要>1,没有保留标点符号segs = filter(lambda x: x not in stopwords_set, segs)# print(segs) # segs是一个filter object# segs = list(segs) # segs需要一次类似“持久化”的操作,否则每次被操作一次后segs就为空了content_seg.append(" ".join(segs))return content_segdf_train['content_seg'] = preprocess_text(df_train['content'])
df_test['content_seg'] = preprocess_text(df_test['content'])
print(df_train.head())  #
print(df_train.shape)

输出:

加载停用词...
停用词表大小: 2613
加载停用词...
停用词表大小: 2613label                                            content  \
0      1  当地时间2月10日,白宫发表声明称,美国总统特朗普及夫人梅拉尼娅将于2月24日至25日访问印...
1      0  俄罗斯卫星通讯社11日最新消息,菲律宾总统杜特尔特已下令终止与美国间的《访问部队协定》(VFA)。
2      1  据俄罗斯卫星网6日报道,土耳其总统发言人卡林表示,俄罗斯军事代表团将于近日访问安卡拉,讨论叙...
3      0  先来说说什么是LPDDR5:要知道,手机中有两种内存颗粒,一种就是DRAM也就是大家常说的“...
4      1  在疫情的关键时刻,出现了一件令人感动的事情,让我们明白这才是真正的好朋友,不惧疫情访问我国,...   content_seg
0  时间 白宫 发表声明 美国 总统 特朗普 夫人 拉尼 日至 访问 印度 特朗普 上任 首次 ...
1  俄罗斯 卫星 通讯社 最新消息 菲律宾 总统 杜特 尔特 下令 终止 美国 访问 部队 协定...
2  俄罗斯 卫星 报道 土耳其 总统 发言人 卡林 俄罗斯 军事 代表团 近日 访问 安卡拉 讨...
3  LPDDR5 手机 中有 两种 内存 颗粒 一种 DRAM 常说 运行 内存 提到 LPDD...
4      疫情 关键时刻 一件 令人感动 事情 明白 这才 朋友 疫情 访问 我国 王毅 机场 迎接
(300, 3)

(3)抽取文本特征:使用词袋模型

vectorizer = CountVectorizer(analyzer='word', # 以词为粒度做ngrammax_features=4000, # 保留最常见的4000个词)
vectorizer.fit(df_train['content_seg'].tolist())
print('CountVectorizer train finished!')
train_features = vectorizer.transform(df_train['content_seg'])

输出:

CountVectorizer train finished!

(4)训练贝叶斯模型(多项式贝叶斯)

bayes_classifier = MultinomialNB() # 使用多项式贝叶斯
bayes_classifier.fit(train_features, df_train['label'])
print('MultinomialNB train finished!')

输出:

MultinomialNB train finished!

(5)评价指标&测试

查看准确率accuracy:

test_features = vectorizer.transform(df_test['content_seg'])
bayes_classifier.score(test_features, df_test['label']) # Return the mean accuracy

输出:

0.9375

进一步查看精准率precision、召回率recall、f1值:

from sklearn.metrics import precision_score, recall_score, f1_score
y_pred = bayes_classifier.predict(test_features)
print('precision_score: %.3f' % precision_score(y_pred, df_test['label']))
print('recall_score: %.3f' % recall_score(y_pred, df_test['label']))
print('f1_score: %.3f' % f1_score(y_pred, df_test['label']))

输出:

precision_score: 0.952
recall_score: 0.930
f1_score: 0.941

分类结果还不错!

4. 模型评价

朴素贝叶斯法实现简单,高效,易于实现,但由于特征条件独立的假设太强,有时会牺牲一定的分类准确率。不过在实际应用中,朴素贝叶斯也有work的很好的时候,比如垃圾邮件分类,文本分类。

下面对该模型做一个评价总结。评价内容摘自刘建平老师的朴素贝叶斯算法原理小结:

优点

  • 1)朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
  • 2)对小规模的数据表现很好,能够处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。
  • 3)对缺失数据不太敏感,算法也比较简单,常用于文本分类

缺点

  • 1)理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型在给定输出类别的情况下,假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
  • 2)需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
  • 3)由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。
  • 4)对输入数据的表达形式很敏感。

完整代码地址

完整代码请移步至: 我的github:https://github.com/qingyujean/Magic-NLPer,求赞求星求鼓励~~~

最后:如果本文中出现任何错误,请您一定要帮忙指正,感激~

参考

[1] 统计学习方法(第2版) 李航
[2] 西瓜书-机器学习   周志华
[3] 朴素贝叶斯算法原理小结  刘建平

朴素贝叶斯(naive bayes)原理小结相关推荐

  1. 朴素贝叶斯(naive bayes)

    朴素贝叶斯(naive bayes) 标签: Python 机器学习 主要參考资料:<机器学习实战><统计学习方法> 1.朴素贝叶斯分类原理 朴素贝叶斯法是基于贝叶斯定理和特征 ...

  2. 机器学习:基于朴素贝叶斯(Naive Bayes)的分类预测

    目录 一.简介和环境准备 简介: 环境: 二.实战演练 2.1使用葡萄(Wine)数据集,进行贝叶斯分类 1.数据导入 2.模型训练 3.模型预测 2.2模拟离散数据集–贝叶斯分类 1.数据导入.分析 ...

  3. 机器学习一:朴素贝叶斯(Naive Bayes)

    朴素贝叶斯 Naive Bayes 1. Introduction 1.1 离散属性 1.2 连续属性 1.2.1 Gaussian Naive Bayes 1.2.2 Multinomial Nai ...

  4. 【手写算法实现】 之 朴素贝叶斯 Naive Bayes 篇

    [手写算法实现] 之 朴素贝叶斯 Naive Bayes 篇 朴素贝叶斯模型(naive bayes)属于分类模型,也是最为简单的概率图模型,对于之后理解HMM.CRF等模型,大有裨益.这里手写算法介 ...

  5. 机器学习笔记——朴素贝叶斯(Naive Bayes)

    1贝叶斯算法简介 贝叶斯分类算法是统计学的一种分类方法,它是一类利用概率统计知识进行分类的算法.在许多场合,朴素贝叶斯(Naïve Bayes,NB)分类算法可以与决策树和神经网络分类算法相媲美,该算 ...

  6. 朴素贝叶斯(Naive Bayes),“Naive”在何处?

    加上条件独立假设的贝叶斯方法就是朴素贝叶斯方法(Naive Bayes). Naive的发音是"乃一污",意思是"朴素的"."幼稚的".&q ...

  7. 【机器学习】朴素贝叶斯(Naive Bayes)

    在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同.对于大多数的分类算法,比如决策树,KNN,逻辑回归,支持向量机等,他们都是判别方法,也就是直接学习出特征输出Y和特征X之间的关系, ...

  8. 西瓜书+实战+吴恩达机器学习(八)监督学习之朴素贝叶斯 Naive Bayes

    文章目录 0. 前言 1. 朴素贝叶斯算法 2. 半朴素贝叶斯算法 2.1. ODE 2.2. SPODE 2.3. TAN 2.4. AODE 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔 ...

  9. 机器学习算法: 朴素贝叶斯(Naive Bayes)

    朴素贝叶斯的介绍 朴素贝叶斯算法(Naive Bayes, NB) 是应用最为广泛的分类算法之一.它是基于贝叶斯定义和特征条件独立假设的分类器方法.由于朴素贝叶斯法基于贝叶斯公式计算得到,有着坚实的数 ...

  10. 机器学习(十)分类算法之朴素贝叶斯(Naive Bayes)算法

    贝叶斯定理 首先我们来了解一下贝叶斯定理: 贝叶斯定理是用来做什么的?简单说,概率预测:某个条件下,一件事发生的概率是多大? 了解一下公式 事件B发生的条件下,事件A发生的概率为: 这里写图片描述 同 ...

最新文章

  1. PCL工程的CMakeList.txt文件书写规范
  2. Scala入门与进阶(五)- Scala数组
  3. javascript中replace使用方法总结
  4. 【BZOJ5102】[POI2018]Prawnicy 堆
  5. android edittext 光标监听,Android EditText监听器,用于光标位置更改
  6. python教程:利用while求100内的整数和
  7. Spring-bean的生命周期
  8. Android中调用webservice的工具类
  9. 计算机公开课教学反思,语文公开课教学反思
  10. Linux物理内存初始化
  11. 实现服务器负载均衡常见的四种技术
  12. python统计行号_用Python实现两个文件的不同行的编号
  13. python列表迭代器_python迭代器生成器-迭代器和list区别
  14. python怎么读写文件-怎么用python读取和写入TIFF文件1
  15. sencha touch 2.0 学习记录
  16. 网站颜色搭配[收藏]
  17. Windows下使用c++编译hiredis.lib,Win32_Interop.lib
  18. 智能安全帽-4G记录仪等移动视频图传系统里面的RTSP流输出的实现机制
  19. HDU6638 Snowy Smile
  20. Python3 面向对象编程进阶

热门文章

  1. 当你凝视深渊时,深渊也在凝视着你。
  2. android电量优化方法,Android性能优化——电池使用优化
  3. 一.stm32的内部flash操作笔记
  4. 介绍几种在线文档编辑器
  5. 仿网易云音乐网站(加入个人社区)
  6. psn请验证您不是机器人_PS4无法登陆PSN的解决办法
  7. CSS 单词换行 word-break属性
  8. Android apps 拍立知-功能实现2(相机/选择相册及图像识别调用)
  9. 阿里巴巴 淘特技术部 内推
  10. 膨胀卷积的缺点_卷积、反卷积与膨胀卷积