首页 > 其他分享 >数学建模学习-朴素贝叶斯分类器(Naive Bayes Classifier)教程(31)

数学建模学习-朴素贝叶斯分类器(Naive Bayes Classifier)教程(31)

时间:2025-01-22 12:31:04浏览次数:3  
标签:plt 特征 Naive 贝叶斯 分类器 可视化 Bayes 类别

数学建模学习-朴素贝叶斯分类器(Naive Bayes Classifier)教程(31)

写在最前

注意本文的相关代码及例子为同学们提供参考,借鉴相关结构,在这里举一些通俗易懂的例子,方便同学们根据实际情况修改代码,很多同学私信反映能否添加一些可视化,这里每篇教程都尽可能增加一些可视化方便同学理解,但具体使用时,同学们要根据实际情况选择是否在论文中添加可视化图片。

系列教程计划持续更新,同学们可以免费订阅专栏,内容充足后专栏可能付费,提前订阅的同学可以免费阅读,同时相关代码获取可以关注博主评论或私信。

目录

  1. 算法简介
  2. 算法特点
  3. 数学原理
  4. 代码实现
  5. 实验结果分析
  6. 应用场景
  7. 注意事项

算法简介

朴素贝叶斯分类器是一种基于贝叶斯定理的简单但有效的分类算法。它是一种概率分类器,基于特征之间条件独立的假设(这就是"朴素"的由来)。尽管这个假设在实际应用中往往不成立,但朴素贝叶斯分类器在许多实际问题中仍然表现出色,特别是在文本分类和垃圾邮件过滤等领域。

算法特点

  1. 计算效率高:训练和预测过程都非常快速。
  2. 易于实现:算法原理简单,容易理解和实现。
  3. 对小数据集效果好:即使在较小的训练集上也能获得不错的效果。
  4. 对缺失值不敏感:能够很好地处理缺失值。
  5. 可扩展性强:可以处理多分类问题,且易于在线更新。

数学原理

朴素贝叶斯分类器基于贝叶斯定理:

P ( y ∣ x ) = P ( x ∣ y ) P ( y ) P ( x ) P(y|x) = \frac{P(x|y)P(y)}{P(x)} P(y∣x)=P(x)P(x∣y)P(y)​

其中:

  • P ( y ∣ x ) P(y|x) P(y∣x) 是给定特征 x 时类别 y 的后验概率
  • P ( x ∣ y ) P(x|y) P(x∣y) 是给定类别 y 时特征 x 的似然概率
  • P ( y ) P(y) P(y) 是类别 y 的先验概率
  • P ( x ) P(x) P(x) 是特征 x 的边缘概率

在朴素贝叶斯中,我们假设特征之间相互独立,因此:

P ( x ∣ y ) = ∏ i = 1 n P ( x i ∣ y ) P(x|y) = \prod_{i=1}^n P(x_i|y) P(x∣y)=∏i=1n​P(xi​∣y)

最终的分类决策规则为:

y = arg ⁡ max ⁡ y P ( y ) ∏ i = 1 n P ( x i ∣ y ) y = \arg\max_y P(y) \prod_{i=1}^n P(x_i|y) y=argmaxy​P(y)∏i=1n​P(xi​∣y)

代码实现

环境准备

首先需要安装必要的Python库:

# requirements.txt
numpy>=1.19.2        # 用于数值计算和数组操作
matplotlib>=3.3.2    # 用于数据可视化
scikit-learn>=0.23.2 # 提供机器学习算法和工具
seaborn>=0.11.0      # 提供高级数据可视化功能

代码结构详解

1. 导入必要的库和配置
import numpy as np
import matplotlib.pyplot as plt
from sklearn.naive_bayes import GaussianNB
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, classification_report
import seaborn as sns
import os

# 创建images目录
os.makedirs('images', exist_ok=True)

# 设置matplotlib中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

这段代码完成了以下工作:

  • 导入必要的科学计算和机器学习库
  • 创建保存可视化结果的目录
  • 配置matplotlib以正确显示中文和负号
2. 数据生成与预处理
# 生成示例数据
X, y = make_classification(n_samples=1000,    # 样本数量
                         n_features=2,         # 特征数量
                         n_redundant=0,        # 冗余特征数量
                         n_informative=2,      # 信息特征数量
                         random_state=1,       # 随机种子
                         n_clusters_per_class=1) # 每个类别的簇数

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, 
    test_size=0.3,     # 测试集占30%
    random_state=42    # 随机种子
)

数据生成过程说明:

  • 使用make_classification生成二分类问题的模拟数据
  • 生成1000个样本,每个样本有2个特征
  • 设置n_redundant=0确保没有冗余特征
  • 使用train_test_split将数据集按7:3的比例划分为训练集和测试集
  • 设置随机种子确保结果可复现
3. 模型训练与预测
# 创建并训练朴素贝叶斯分类器
nb_classifier = GaussianNB()  # 创建高斯朴素贝叶斯分类器实例
nb_classifier.fit(X_train, y_train)  # 使用训练数据拟合模型

# 在测试集上进行预测
y_pred = nb_classifier.predict(X_test)

模型训练过程解析:

  1. 创建分类器

    • 使用GaussianNB()创建高斯朴素贝叶斯分类器
    • 高斯朴素贝叶斯假设每个特征都服从正态分布
  2. 模型训练

    • fit方法执行以下操作:
      • 计算每个类别的先验概率 P(y)
      • 对每个特征计算均值和方差
      • 构建类条件概率密度函数
  3. 预测过程

    • 对每个测试样本,计算其属于各个类别的后验概率
    • 选择后验概率最大的类别作为预测结果
4. 决策边界可视化实现
def plot_decision_boundary(X, y, model, title):
    h = 0.02  # 网格中的步长
    # 计算特征空间的范围
    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, h),
                        np.arange(y_min, y_max, h))
    
    # 预测网格中每个点的类别
    Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    
    # 绘制决策边界和数据点
    plt.figure(figsize=(10, 8))
    plt.contourf(xx, yy, Z, cmap=plt.cm.RdYlBu, alpha=0.3)
    plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.RdYlBu, alpha=0.8)
    plt.title(title)
    plt.xlabel('特征 1')
    plt.ylabel('特征 2')
    plt.colorbar(label='类别')
    plt.savefig('images/decision_boundary.png', bbox_inches='tight', dpi=300)
    plt.close()

决策边界可视化原理:

  1. 网格创建

    • 在特征空间中创建均匀分布的网格点
    • 步长h=0.02控制网格的精细程度
  2. 边界计算

    • 对网格中的每个点进行类别预测
    • 使用不同颜色表示不同的预测类别
    • 通过contourf绘制填充等高线图显示决策边界
  3. 数据可视化

    • 使用散点图展示原始数据点
    • 点的颜色表示真实类别
    • 通过透明度调节(alpha)提高可视化效果
5. 混淆矩阵可视化
# 计算混淆矩阵
cm = confusion_matrix(y_test, y_pred)

# 绘制混淆矩阵热图
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
plt.title('混淆矩阵')
plt.xlabel('预测类别')
plt.ylabel('真实类别')
plt.savefig('images/confusion_matrix.png', bbox_inches='tight', dpi=300)
plt.close()

混淆矩阵解析:

  1. 矩阵计算

    • 行表示真实类别
    • 列表示预测类别
    • 对角线元素表示正确分类的样本数
    • 非对角线元素表示错误分类的样本数
  2. 可视化设计

    • 使用热图展示混淆矩阵
    • 颜色深浅表示数值大小
    • 在每个单元格中显示具体数值
6. 类条件概率密度可视化
def plot_class_densities():
    plt.figure(figsize=(12, 5))
    
    # 分别获取两个类别的数据
    X_class0 = X[y == 0]
    X_class1 = X[y == 1]
    
    # 为两个特征分别绘制概率密度图
    for i in range(2):
        plt.subplot(1, 2, i+1)
        sns.kdeplot(data=X_class0[:, i], label='类别 0', color='blue')
        sns.kdeplot(data=X_class1[:, i], label='类别 1', color='red')
        plt.title(f'特征 {i+1} 的类条件概率密度')
        plt.xlabel('特征值')
        plt.ylabel('概率密度')
        plt.legend()
    
    plt.tight_layout()
    plt.savefig('images/class_densities.png', bbox_inches='tight', dpi=300)
    plt.close()

概率密度可视化原理:

  1. 数据分离

    • 将数据按类别分开
    • 分别分析每个类别的特征分布
  2. 密度估计

    • 使用核密度估计(KDE)方法
    • 为每个特征绘制概率密度曲线
    • 不同颜色区分不同类别
  3. 可视化布局

    • 使用子图展示每个特征的分布
    • 添加图例和标签
    • 调整布局确保图形美观请添加图片描述
      请添加图片描述
      请添加图片描述

实验结果详细分析

1. 分类性能指标
分类报告:
              precision    recall  f1-score   support

           0       0.90      0.95      0.93       155
           1       0.95      0.89      0.92       145

    accuracy                           0.92       300
   macro avg       0.93      0.92      0.92       300
weighted avg       0.92      0.92      0.92       300

性能指标解读:

  1. 精确率(Precision)

    • 类别0:0.90,表示预测为类别0的样本中90%是真正的类别0
    • 类别1:0.95,表示预测为类别1的样本中95%是真正的类别1
  2. 召回率(Recall)

    • 类别0:0.95,表示真实的类别0样本中95%被正确识别
    • 类别1:0.89,表示真实的类别1样本中89%被正确识别
  3. F1分数

    • 类别0:0.93,精确率和召回率的调和平均
    • 类别1:0.92,表明模型在两个类别上的表现都很平衡
  4. 整体准确率

    • 0.92,说明模型在所有测试样本中有92%的预测是正确的
2. 可视化结果分析
  1. 决策边界特征

    • 边界形状平滑,反映了高斯分布假设
    • 边界区域的渐变表示分类的不确定性
    • 大部分数据点都落在其对应类别区域内
  2. 混淆矩阵特点

    • 对角线元素占主导,表示分类准确率高
    • 误分类样本较少,且在两个类别间分布相对均匀
  3. 概率密度分布
    4 - 两个类别在特征空间中有部分重叠

    • 特征1和特征2都表现出良好的区分能力
    • 密度曲线的形状近似正态分布,符合高斯朴素贝叶斯的假设

实验结果分析

通过上述可视化结果,我们可以得出以下分析:

  1. 决策边界分析

    • 从决策边界图可以看出,朴素贝叶斯分类器在二维特征空间中划分出了相对清晰的决策边界
    • 决策边界呈现出平滑的曲线形状,这反映了高斯朴素贝叶斯对特征分布的假设
    • 大部分数据点都被正确分类,只有少数点位于边界附近可能被错误分类
  2. 混淆矩阵分析

    • 混淆矩阵显示了模型在测试集上的分类性能
    • 对角线上的数值较大,表明模型的预测准确率较高
    • 非对角线上的数值较小,说明误分类的情况较少
  3. 类条件概率密度分析

    • 概率密度图显示了两个类别在各个特征维度上的分布情况
    • 两个类别在特征空间中有一定的重叠,这解释了为什么会有一些误分类的情况
    • 特征1和特征2都表现出了较好的区分能力,这有助于分类器做出准确的预测

应用场景

朴素贝叶斯分类器在以下场景中特别有效:

  1. 文本分类

    • 垃圾邮件过滤
    • 新闻分类
    • 情感分析
  2. 医疗诊断

    • 基于症状的疾病诊断
    • 医学图像分类
  3. 实时预测

    • 由于计算速度快,适合需要实时响应的场景
    • 在线学习和更新
  4. 多分类问题

    • 自然语言处理中的词性标注
    • 图像识别中的多类别分类

注意事项

在使用朴素贝叶斯分类器时,需要注意以下几点:

  1. 特征独立性假设

    • 朴素贝叶斯假设特征之间相互独立
    • 在实际应用中,如果特征之间存在强相关性,可能会影响模型性能
    • 可以通过特征选择或降维来减少特征间的相关性
  2. 数据预处理

    • 对于连续型特征,通常假设服从高斯分布
    • 如果数据分布严重偏离高斯分布,可能需要进行数据转换
    • 处理缺失值和异常值很重要
  3. 样本均衡性

    • 类别不平衡可能影响模型性能
    • 可以通过采样技术或调整类别权重来处理
  4. 模型选择

    • 根据数据特点选择合适的朴素贝叶斯变体
    • 高斯朴素贝叶斯适用于连续特征
    • 多项式朴素贝叶斯适用于离散特征
    • 伯努利朴素贝叶斯适用于二值特征
  5. 模型评估

    • 使用交叉验证评估模型性能
    • 考虑多个评估指标(准确率、召回率、F1分数等)
    • 分析混淆矩阵了解具体的分类错误情况
  6. 参数调优

    • 朴素贝叶斯的参数相对较少
    • 主要关注平滑参数的调整
    • 可以通过网格搜索等方法找到最优参数
  7. 模型解释性

    • 朴素贝叶斯模型具有良好的可解释性
    • 可以分析特征的条件概率来理解模型决策
    • 通过可视化帮助理解模型行为

同学们如果有疑问可以私信答疑,如果有讲的不好的地方或可以改善的地方可以一起交流,谢谢大家。

标签:plt,特征,Naive,贝叶斯,分类器,可视化,Bayes,类别
From: https://blog.csdn.net/FFMXjy/article/details/145255053

相关文章

  • 高斯贝叶斯分类器实战
    目录前言实战前言面部皮肤区分数据集来自于UCI网站,该数据集含有两个部分,一部分为人类面部皮肤数据,该部分数据是由不同种族、年龄和性别人群的图片转换而成的;另一部分为非人类面部皮肤数据。两个部分的数据集一共包含245057条样本和4个变量,其中用于识别样本是否为人......
  • Python实现贝叶斯优化器(Bayes_opt)优化ESN回声状态网络模型项目实战
    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后关注获取。1.项目背景本项目的目标是利用贝叶斯优化技术来优化回声状态网络(EchoStateNetwork,ESN)模型的超参数,以提高其在特定任务上的性能。ESN是一种特殊的递归......
  • 机器学习基础算法 (七)-朴素贝叶斯(Naive Bayes)
    介绍朴素贝叶斯(NaiveBayes)算法是一种基于贝叶斯定理的简单概率分类算法,通常用于文本分类、垃圾邮件过滤、情感分析等任务。尽管其“朴素”之名可能让人觉得它不够复杂,但实际应用中,朴素贝叶斯算法以其高效性和简单性,尤其适用于特征之间条件独立的假设下,表现出色。本文将......
  • 毕业设计:python电商评论数据采集分析可视化系统 Flask框架 NLP情感分析 LDA主题分析 B
    毕业设计:python电商评论数据采集分析可视化系统Flask框架NLP情感分析LDA主题分析Bayes评论分类(源码)✅1、项目介绍项目技术说明:python语言、Flask框架、MySQL数据库、Echarts可视化、评论多维度分析、NLP情感分析、LDA主题分析、Bayes评论分类2、项目界面(1)评论数......
  • 最强分类器调优秘诀!AdaBoost让性能飙升!
    本文已收录在Github,关注我,紧跟本系列专栏文章,咱们下篇再续!作者简介:魔都架构师,多家大厂后端一线研发经验,在分布式系统设计、数据平台架构和AI应用开发等领域都有丰富实践经验。各大技术社区头部专家博主。具有丰富的引领团队经验,深厚业务架构和解决方案的积累。负责:中央/分销......
  • 《机器学习》3.7-4.3end if 启发式 uci数据集klda方法——非线性可分的分类器
    目录uci数据集klda方法——非线性可分的分类器计算步骤1:选择核函数步骤2:计算核矩阵步骤4:解广义特征值问题 と支持向量机(svm)目标:方法:核技巧的应用:区别:使用OvRMvM将多分类任务分解为二分类任务求解时,试述为何无需专门针对类别不平衡性进行处理  end......
  • SpringBoot3+Vue3+NaiveUI后台搭建详细教程 | 小蚂蚁云
     项目介绍基于SpringBoot3、SpringSecurity、MybatisPlus、Vue3、TypeScript、Vite、NaiveUI、MySQL等技术栈实现的单体前后端分离后台管理系统;后端基于Java语言采用SpringBoot3、SpringSecurity、MybatisPlus、MySQL等主流技术栈,前端基于Vue3、TypeScript、Vite等技术栈实现......
  • SpringBoot3+Vue3+NaiveUI搭建后台系统脚手架 | 小蚂蚁云
     项目介绍基于SpringBoot3、SpringSecurity、MybatisPlus、Vue3、TypeScript、Vite、NaiveUI、MySQL等技术栈实现的单体前后端分离后台管理系统;后端基于Java语言采用SpringBoot3、SpringSecurity、MybatisPlus、MySQL等主流技术栈,前端基于Vue3、TypeScript、Vite等技术栈实现......
  • SpringBoot3+Vue3+NaiveUI主流前端分离开发框架 | 小蚂蚁云
     项目介绍基于SpringBoot3、SpringSecurity、MybatisPlus、Vue3、TypeScript、Vite、NaiveUI、MySQL等技术栈实现的单体前后端分离后台管理系统;后端基于Java语言采用SpringBoot3、SpringSecurity、MybatisPlus、MySQL等主流技术栈,前端基于Vue3、TypeScript、Vite等技术栈实现......
  • SpringBoot3+Vue3+NaiveUI项目实例源码 | 小蚂蚁云
     项目介绍基于SpringBoot3、SpringSecurity、MybatisPlus、Vue3、TypeScript、Vite、NaiveUI、MySQL等技术栈实现的单体前后端分离后台管理系统;后端基于Java语言采用SpringBoot3、SpringSecurity、MybatisPlus、MySQL等主流技术栈,前端基于Vue3、TypeScript、Vite等技术栈实现......