【机器学习】朴素贝叶斯分类#1基于Scikit-Learn的简单实现

主要参考学习资料:

《机器学习算法的数学解析与Python实现》莫凡 著

前置知识:概率论与数理统计-Python

博主采用了由浅入深、循序渐进的学习过程,因此本系列不会将内容一次性吃透,而是先整体后细节,后续再探索每个模型更深入的数学知识和具体实现。

目录

数学模型

贝叶斯公式

朴素贝叶斯分类 的核心思想来源于贝叶斯公式

P ( B ∣ A ) = P ( B ) P ( A ∣ B ) P ( A ) P(B|A)=\displaystyle\frac{P(B)P(A|B)}{P(A)} P(B∣A)=P(A)P(B)P(A∣B)

其由条件概率的公式证得:

P ( B ∣ A ) = P ( A B ) P ( A ) = P ( B ) P ( A ∣ B ) P ( A ) P(B|A)=\displaystyle\frac{P(AB)}{P(A)}=\frac{P(B)P(A|B)}{P(A)} P(B∣A)=P(A)P(AB)=P(A)P(B)P(A∣B)

贝叶斯公式给出了两个事件条件概率间的关系,其实际内涵为支持某项属性的事件发生得愈多,则该属性成立的可能性就愈大。朴素贝叶斯分类利用这一内涵建立了数据的特征与类别之间的关系。

将 B B B看作类别 y y y, A A A看作特征 x x x,相应的贝叶斯公式为:

P ( y ∣ x 1 , ⋯   , x n ) = P ( y ) P ( x 1 , ⋯   , x n ∣ y ) P ( x 1 , ⋯   , x n ) P(y|x_1,\cdots,x_n)=\displaystyle\frac{P(y)P(x_1,\cdots,x_n|y)}{P(x_1,\cdots,x_n)} P(y∣x1,⋯,xn)=P(x1,⋯,xn)P(y)P(x1,⋯,xn∣y)

其中 x 1 , ⋯   , x n x_1,\cdots,x_n x1,⋯,xn表示所有特征同时出现。

由于数据采集总是不完全,且特征 x x x越多问题越明显,要统计所有特征同时出现的概率很难,于是朴素贝叶斯作出了"朴素"的假设,即不同特征之间相互独立,某个特征的似然度就可化简为:

P ( x i ∣ y , x 1 , ⋯   , x i − 1 , x i + 1 , ⋯   , x n ) = P ( x i ∣ y ) P(x_i|y,x_1,\cdots,x_{i-1},x_{i+1},\cdots,x_n)=P(x_i|y) P(xi∣y,x1,⋯,xi−1,xi+1,⋯,xn)=P(xi∣y)

于是求后验概率的方法也简化为:

P ( y ∣ x 1 , ⋯   , x n ) ∝ P ( y ) ∏ i = 1 n P ( x i ∣ y ) P(y|x_1,\cdots,x_n)\propto P(y)\displaystyle\prod^n_{i=1}P(x_i|y) P(y∣x1,⋯,xn)∝P(y)i=1∏nP(xi∣y)

采用"正比于"的原因和朴素贝叶斯算法的学习目标有关。朴素贝叶斯算法学习的过程就是不断提高正确类别的似然度的过程,自然达到了提高正确类别后验概率的目的,也无需再统计原式分母特征共同出现的概率。

优化方法

朴素贝叶斯算法的输出结果为:

y ^ = a r g m a x y P ( y ) ∏ i = 1 n P ( x i ∣ y ) \hat y=\underset{y}{\mathrm{argmax}}P(y)\displaystyle\prod^n_{i=1}P(x_i|y) y^=yargmaxP(y)i=1∏nP(xi∣y)

a r g m a x \mathrm{argmax} argmax返回使得其后函数取得最大值的相应参数。

由此可知,朴素贝叶斯算法并不需要以假设函数和损失函数为基础的优化方法,其学习过程就是查表统计。

算法步骤

①统计样本数据的先验概率 P ( y ) P(y) P(y)和似然度 P ( x ∣ y ) P(x|y) P(x∣y)。

②根据待预测样本所包含的特征,对不同类分别进行后验概率计算。

③比较 y 1 , ⋯   , y n y_1,\cdots,y_n y1,⋯,yn的后验概率,将概率值最大的 y y y作为预测值输出。

代码实现

python 复制代码
from sklearn.datasets import load_iris 
#导入朴素贝叶斯模型中的多项式朴素贝叶斯分类算法 
from sklearn.naive_bayes import MultinomialNB  
import numpy as np  
import matplotlib.pyplot as plt  
iris = load_iris()  
X = iris.data[:, :2]  
y = iris.target  
clf = MultinomialNB().fit(X, y)  
def plot_decision_boundary(X, y, model):  
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1  
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1  
    xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.01), np.arange(y_min, y_max, 0.01))  
    Z = model.predict(np.c_[xx.ravel(), yy.ravel()])  
    Z = Z.reshape(xx.shape)  
    plt.contourf(xx, yy, Z, alpha=0.8, cmap=plt.cm.coolwarm)  
    plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o', cmap=plt.cm.coolwarm)  
    plt.xlabel('Feature 1')  
    plt.ylabel('Feature 2')  
    plt.title('NBC Decision Boundary')  
    plt.show()  
plot_decision_boundary(X, y, clf)

算法特点

优点:运用统计学成熟理论,可解释性强,对大规模数据集训练效率较高。

缺点:对数据样本的特征维度作了"彼此独立"的假设,如果实际情况并非如此则可能导致预测偏差增加。

应用领域:垃圾邮件等文本分类。

相关推荐
vortex55 分钟前
在Kali中使用虚拟环境安装python工具的最佳实践:以 pwncat 为例
linux·python·网络安全·渗透测试·pip·kali
AAA顶置摸鱼6 分钟前
机器学习·NLP中的文本分类
机器学习·自然语言处理·分类
源码姑娘6 分钟前
基于DeepSeek的智慧医药系统(源码+部署教程)
java·人工智能·程序人生·毕业设计·springboot·健康医疗·课程设计
AIGC_ZY6 分钟前
扩散模型中三种加入条件的方式:Vanilla Guidance,Classifier Guidance 以及 Classifier-Free Guidance
深度学习·机器学习·计算机视觉
☞黑心萝卜三条杠☜40 分钟前
后门攻击仓库 backdoor attack
论文阅读·人工智能
AntBlack1 小时前
Python 打包笔记 : 你别说 ,PyStand 确实简单易上手
后端·python·创业
三三木木七1 小时前
BERT、T5、GPTs,Llama
人工智能·深度学习·bert
Pocker_Spades_A2 小时前
Python刷题:Python基础
开发语言·python
problc2 小时前
Manus AI 全球首款通用型 Agent,中国制造
大数据·人工智能·制造
xiangzhihong82 小时前
GitHub神秘组织3小时极速复刻Manus
人工智能·深度学习·机器学习