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

算法特点

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

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

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

相关推荐
财富自由且长命百岁1 天前
移动端老兵转型端侧 AI:第一周,我跑通了 ResNet50 推理
机器学习
美酒没故事°1 天前
Open WebUI安装指南。搭建自己的自托管 AI 平台
人工智能·windows·ai
云烟成雨TD1 天前
Spring AI Alibaba 1.x 系列【6】ReactAgent 同步执行 & 流式执行
java·人工智能·spring
Csvn1 天前
🌟 LangChain 30 天保姆级教程 · Day 13|OutputParser 进阶!让 AI 输出自动转为结构化对象,并支持自动重试!
python·langchain
AI攻城狮1 天前
用 Obsidian CLI + LLM 构建本地 RAG:让你的笔记真正「活」起来
人工智能·云原生·aigc
鸿乃江边鸟1 天前
Nanobot 从onboard启动命令来看个人助理Agent的实现
人工智能·ai
lpfasd1231 天前
基于Cloudflare生态的应用部署与开发全解
人工智能·agent·cloudflare
俞凡1 天前
DevOps 2.0:智能体如何接管故障修复和基础设施维护
人工智能
comedate1 天前
[OpenClaw] GLM 5 关于电影 - 人工智能 - 的思考
人工智能·电影评价
财迅通Ai1 天前
6000万吨产能承压 卫星化学迎来战略窗口期
大数据·人工智能·物联网·卫星化学