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

算法特点

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

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

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

相关推荐
会飞的老朱28 分钟前
医药集团数智化转型,智能综合管理平台激活集团管理新效能
大数据·人工智能·oa协同办公
聆风吟º2 小时前
CANN runtime 实战指南:异构计算场景中运行时组件的部署、调优与扩展技巧
人工智能·神经网络·cann·异构计算
寻星探路2 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
Codebee4 小时前
能力中心 (Agent SkillCenter):开启AI技能管理新时代
人工智能
聆风吟º5 小时前
CANN runtime 全链路拆解:AI 异构计算运行时的任务管理与功能适配技术路径
人工智能·深度学习·神经网络·cann
uesowys5 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
AI_56785 小时前
AWS EC2新手入门:6步带你从零启动实例
大数据·数据库·人工智能·机器学习·aws
User_芊芊君子5 小时前
CANN大模型推理加速引擎ascend-transformer-boost深度解析:毫秒级响应的Transformer优化方案
人工智能·深度学习·transformer
ValhallaCoder5 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
智驱力人工智能5 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算