【机器学习】朴素贝叶斯分类#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)

算法特点

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

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

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

相关推荐
深度学习lover6 分钟前
<项目代码>yolo遥感航拍船舶识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·遥感船舶识别
FL162386312910 分钟前
无人机方面数据集目标检测分割分类数据集汇总介绍
目标检测·分类·无人机
Coovally AI模型快速验证10 分钟前
基于SimCLR的自监督 YOLO:YOLOv5/8也能在低标注场景目标检测性能飙升
人工智能·科技·yolo·目标检测·机器学习·计算机视觉
不老刘27 分钟前
新一代图像生成工具:Nano Banana Pro 带来更自然的创作体验
人工智能·google·gemini·nano banana pro
zhou_gai29 分钟前
供应链计划 - 物料分类
大数据·分类·制造
MapGIS技术支持31 分钟前
MapGIS遥感地物分类实战:(四)分类后处理
分类·遥感·制图·桌面·地物分类·mapgis
袁庭新38 分钟前
人人都能学AI,人人都要学AI
人工智能·aigc
Tzarevich40 分钟前
前端调用大语言模型:基于 Vite 的工程化实践与 HTTP 请求详解
人工智能
8***B1 小时前
Python机器学习库Scikit-learn使用
python·机器学习·scikit-learn
Soonyang Zhang1 小时前
MoeDistributeDispatch算子代码阅读
人工智能·算子·ascendc