【Sklearn】基于朴素贝叶斯算法的数据分类预测(Excel可直接替换数据)

news2024/12/25 10:16:49

【Sklearn】基于朴素贝叶斯算法的数据分类预测(Excel可直接替换数据)

  • 1.模型原理
  • 2.模型参数
  • 3.文件结构
  • 4.Excel数据
  • 5.下载地址
  • 6.完整代码
  • 7.运行结果

1.模型原理

模型原理:

朴素贝叶斯分类是基于贝叶斯定理的一种分类方法。它假设特征之间相互独立(朴素性),从而简化计算过程。朴素贝叶斯分类器适用于文本分类、垃圾邮件过滤、情感分析等多种应用场景。

贝叶斯定理:

在朴素贝叶斯分类中,我们使用贝叶斯定理来计算后验概率。对于一个待分类的数据点,假设其特征向量为 x \mathbf{x} x,类别为 y y y,贝叶斯定理表示为:

P ( y ∣ x ) = P ( x ∣ y ) ⋅ P ( y ) P ( x ) P(y|\mathbf{x}) = \frac{P(\mathbf{x}|y) \cdot P(y)}{P(\mathbf{x})} P(yx)=P(x)P(xy)P(y)

其中,

  • P ( y ∣ x ) P(y|\mathbf{x}) P(yx):给定特征 x \mathbf{x} x 的情况下,类别 y y y 的后验概率。
  • P ( x ∣ y ) P(\mathbf{x}|y) P(xy):在类别 y y y 下,特征 x \mathbf{x} x 的条件概率。
  • P ( y ) P(y) P(y):类别 y y y 的先验概率。
  • P ( x ) P(\mathbf{x}) P(x):特征 x \mathbf{x} x 的边缘概率。

朴素性假设:

朴素贝叶斯分类器假设特征之间相互独立,即给定类别的情况下,特征之间没有关联。这个假设大大简化了计算过程,尽管在实际情况中很少有特征完全独立的情况。尽管如此,朴素贝叶斯分类器在实际应用中表现良好。

数学模型:

在朴素贝叶斯分类中,我们需要计算条件概率,主要有两种类型:离散型特征和连续型特征。

离散型特征:

对于离散型特征,我们可以计算每个特征值在给定类别下的条件概率:

P ( x i ∣ y ) = Count ( x i , y ) + 1 Count ( y ) + ∣ X i ∣ P(x_i|y) = \frac{{\text{Count}(x_i, y) + 1}}{{\text{Count}(y) + |X_i|}} P(xiy)=Count(y)+XiCount(xi,y)+1

其中,

  • Count ( x i , y ) \text{Count}(x_i, y) Count(xi,y):在类别 y y y 下,特征 x i x_i xi 出现的次数。
  • Count ( y ) \text{Count}(y) Count(y):类别 y y y 的样本总数。
  • ∣ X i ∣ |X_i| Xi:特征 x i x_i xi 可能的取值数量。

连续型特征:

对于连续型特征,我们通常假设特征的分布是高斯分布(正态分布),然后计算每个特征在给定类别下的均值和方差,然后使用高斯分布的概率密度函数计算条件概率:

P ( x i ∣ y ) = 1 2 π ⋅ σ y ⋅ exp ⁡ ( − ( x i − μ y ) 2 2 σ y 2 ) P(x_i|y) = \frac{1}{{\sqrt{2 \pi} \cdot \sigma_y}} \cdot \exp\left(-\frac{(x_i - \mu_y)^2}{2 \sigma_y^2}\right) P(xiy)=2π σy1exp(2σy2(xiμy)2)

其中,

  • μ y \mu_y μy:在类别 y y y 下,特征 x i x_i xi 的均值。
  • σ y \sigma_y σy:在类别 y y y 下,特征 x i x_i xi 的标准差。

朴素贝叶斯分类器通过计算每个类别的后验概率来进行分类决策,选择具有最大后验概率的类别作为预测结果。虽然朴素贝叶斯分类器假设特征之间相互独立,在实际应用中仍然表现良好,并且具有较快的训练和预测速度。

2.模型参数

GaussianNB类是朴素贝叶斯分类器的一种实现,用于处理连续型特征。以下是GaussianNB类的主要参数列表:

  1. priors: 先验概率,可以为None(默认)或array-like。如果为None,使用数据中的样本数来估计先验概率;如果为array-like,则指定每个类别的先验概率。

  2. var_smoothing: 方差平滑项,一个非负数。默认为1e-9。用于稳定计算,避免概率为零的情况。

3.文件结构

在这里插入图片描述

iris.xlsx						% 可替换数据集
Main.py							% 主函数

4.Excel数据

在这里插入图片描述

5.下载地址

- 资源下载地址

6.完整代码

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns

def naive_bayes_classification(data_path, test_size=0.2, random_state=42):
    # 加载数据
    data = pd.read_excel(data_path)

    # 分割特征和标签
    X = data.iloc[:, :-1]  # 所有列除了最后一列
    y = data.iloc[:, -1]   # 最后一列

    # 划分训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=random_state)

    # 创建朴素贝叶斯分类器
    # 1. ** priors: ** 先验概率,可以为None(默认)或array - like。如果为None,使用数据中的样本数来估计先验概率;如果为array - like,则指定每个类别的先验概率。
    # 2. ** var_smoothing: ** 方差平滑项,一个非负数。默认为1e - 9。用于稳定计算,避免概率为零的情况。
    # 在你提供的示例中,`model = GaussianNB(priors=[0.2, 0.3, 0.5], var_smoothing=1e-8)`
    # 意味着你在创建朴素贝叶斯分类器时,显式地指定了三个类别的先验概率为0.2、0.3和0.5,
    # 并设置了方差平滑项为`1e-8`,以确保概率计算的稳定性。
    model = GaussianNB(priors=[0.2, 0.3, 0.5], var_smoothing=1e-8)

    # 在训练集上训练模型
    model.fit(X_train, y_train)

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

    # 计算准确率
    accuracy = accuracy_score(y_test, y_pred)
    return confusion_matrix(y_test, y_pred), y_test.values, y_pred, accuracy

if __name__ == "__main__":
    # 使用函数进行分类任务
    data_path = "iris.xlsx"
    confusion_mat, true_labels, predicted_labels, accuracy = naive_bayes_classification(data_path)

    print("真实值:", true_labels)
    print("预测值:", predicted_labels)
    print("准确率:{:.2%}".format(accuracy))

    # 绘制混淆矩阵
    plt.figure(figsize=(8, 6))
    sns.heatmap(confusion_mat, annot=True, fmt="d", cmap="Blues")
    plt.title("Confusion Matrix")
    plt.xlabel("Predicted Labels")
    plt.ylabel("True Labels")
    plt.show()

    # 用圆圈表示真实值,用叉叉表示预测值
    # 绘制真实值与预测值的对比结果
    plt.figure(figsize=(10, 6))
    plt.plot(true_labels, 'o', label="True Labels")
    plt.plot(predicted_labels, 'x', label="Predicted Labels")

    plt.title("True Labels vs Predicted Labels")
    plt.xlabel("Sample Index")
    plt.ylabel("Label")
    plt.legend()
    plt.show()


7.运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/877100.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【一定要会】为ChatGPT插上翅膀的5个常用插件!

自从ChatGPT接入插件功能后,便不再受限于预训练数据中的知识,第三方开发者也可以基于ChatGPT增强自家应用程序的功能。自此 ChatGPT更像是一个开放的平台甚至是生态了。 截止的今年的7月20日,ChatGPT已经接入了700多个插件(当然&…

智能驾驶系列报告之一:智能驾驶 ChatGPT时刻有望来临

原创 | 文 BFT机器人 L3 功能加速落地,政策标准有望明确 L2 发展日益成熟,L3 功能加速落地。根据市场监管总局发布的《汽车驾驶自动化分级》与 SAE发布的自动驾驶分级标准,自动驾驶主要分为 6 个级别(0 级到 5 级,L0 …

五、linux系统下创建新目录的mkdir命令

mkdir命令 在Linux系统中,如果想要创建一个新目录,即文件夹,可以使用mkdir命令: 1、语法:mkdir [-p](可以不存在) Linux路径(必须存在) 2、基础操作:mkdir 目录名 (1)方法一&…

pytest数据驱动(最简单)

目录 第一种:通过yaml文件获取数据(一维列表) 第二种:通过yaml文件获取数据(二维列表) 第三种:通过yaml文件获取数据(pytest.fixture) 资料获取方法 第一种&#xff…

【Vue-Router】别名

后台返回来的路径名不合理&#xff0c;但多个项目在使用中了&#xff0c;不方便改时可以使用别名。可以有多个或一个。 First.vue <template><h1>First Seciton</h1> </template>Second.vue&#xff0c;Third.vue代码同理 UserSettings.vue <tem…

【需求输出】流程图输出

文章目录 1、什么是流程图2、绘制流程图的工具和基本要素3、流程图的分类和应用场景4、如何根据具体场景输出流程图 1、什么是流程图 2、绘制流程图的工具和基本要素 3、流程图的分类和应用场景 4、如何根据具体场景输出流程图

ARTS 挑战打卡的第9天 --- 如何知道一个数是否为2的若干次幂(Algorithm)

前言 &#xff08;1&#xff09;今天看到一个有意思的问题&#xff0c;如何判断一个数字是否为2的若干次幂。这个问题并不难&#xff0c;但是对于我们的C语言功底还是有一点点的考验的。 &#xff08;2&#xff09;希望各位可以先自行思考&#xff0c;实在想不出来再看后面的讲…

WPF 本地化的最佳做法

WPF 本地化的最佳做法 资源文件英文资源文件 en-US.xaml中文资源文件 zh-CN.xaml 资源使用App.xaml主界面布局cs代码 App.config辅助类语言切换操作类资源 binding 解析类 实现效果 应用程序本地化有很多种方式&#xff0c;选择合适的才是最好的。这里只讨论一种方式&#xff0…

Sencha Ext.NET Crack,构建Blazing快速应用

Sencha Ext.NET Crack,构建Blazing快速应用 Sencha Ext.NET是一个高级的ASP.NET核心组件框架&#xff0c;它包含了强大的跨浏览器Sencha Ext JS库。通过140多个预构建和专业测试的UI组件实现企业级性能和生产效率。Sencha Ext.NET使用尖端的Web技术创建功能强大的Web应用程序&a…

【Spring专题】Bean的生命周期流程图

目录 前言阅读指引 流程图一、之前推测的简单流程图&#xff08;一点点参考&#xff09;*二、Bean生命周期流程图&#xff08;根据Spring源码自结&#xff09;*三、阶段源码流程图&#xff08;不断更新&#xff09; 前言 我向来不主张【通过源码】理解业务&#xff0c;因为每个…

Ubuntu18.04 GitHub提交代码

一、准备工作 1.1安装 git sudo apt-get install git安装完成后&#xff0c;检查git版本&#xff0c;一般自带2.17.1版本 git --version 1.2 注册github SSH keys 1.2.1 github 进入注册github SSH keys 如图&#xff0c;到GitHub上右上角圆形图标进入Settings 左侧点击S…

Vue.js快速入门指南:零基础也能轻松上手,开启前端开发之旅!

目录 MVC设计模式与MVVM设计模式选项式API的编程风格与优势声明式渲染及响应式数据实现原理指令系统与事件方法及传参处理计算属性与侦听器区别与原理条件渲染与列表渲染及注意点class样式与style样式的三种形态表单处理与双向数据绑定原理生命周期钩子函数及原理分析 MVC设计模…

从零实战SLAM-第六课(视觉里程计I)

在七月算法报的班&#xff0c;老师讲的蛮好。好记性不如烂笔头&#xff0c;关键内容还是记录一下吧&#xff0c;课程入口&#xff0c;感兴趣的同学可以学习一下。 --------------------------------------------------------------------------------------------------------…

解决echarts和v-show一起使用canvas宽高改变

本来是想没有数据显示暂无数据的&#xff0c;结果显示成了这样 1.把V-show改成v-if <template><divclass"chart1"ref"chart1"v-if"!nodata"style"width: 100%; height: 100%"></div><el-empty description&quo…

生信豆芽菜-单基因与基因集的关系

网址&#xff1a;http://www.sxdyc.com/panCancerGeneSet 该工具主要用于查看单基因在泛癌中与各个不同基因集的相关性 提交后等待运行成功即可&#xff0c;还可以关注公众号&#xff1a;豆芽数据分析

LeetCode150道面试经典题-- 存在重复元素 II(简单)

1.题目 给你一个整数数组 nums 和一个整数 k &#xff0c;判断数组中是否存在两个 不同的索引 i 和 j &#xff0c;满足 nums[i] nums[j] 且 abs(i - j) < k 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 2.示例 示例 1&#xff1a; 输…

mybatis-plus 根据指定字段 批量 删除/修改

mybatis-plus 提供了根据id批量更新和修改的方法,这个大家都不陌生 但是当表没有id的时候怎么办 方案一: 手写SQL方案二: 手动获取SqlSessionTemplate 就是把mybatis plus 干的事自己干了方案三 : 重写 executeBatch 方法结论: mybatis-plus 提供了根据id批量更新和修改的方法,…

创建百度百科需要什么条件?

随着互联网的发展&#xff0c;人们越来越依赖于搜索引擎获取信息。百度作为中国最大的搜索引擎之一&#xff0c;旗下的百科词条已成为人们获取知识的重要来源。创建百度百科需要什么条件呢&#xff1f;接下来伯乐网络传媒就来给大家讲一讲。 首先&#xff0c;你需要有一个百度…

最小生成树(Kruskal)克鲁斯卡尔算法

算法步骤总共分为两步&#xff0c;由并查集实现 第一步&#xff08;把所有的边按边长的大小进行排序&#xff09; 第二步&#xff08;如果两个点不连通就把两点之间的边加上再把两个点连通&#xff09; 当放入的边数为点数减去一时就代表已经全部连通 例题一&#xff08;859. …

五、Dubbo 启停原理解析

五、Dubbo 启停原理解析 5.1 配置解析 5.1.1 基于 schema 设计解析 Dubbo 配置约束文件在 dubbo-config/dubbo-config-spring/src/main/resources/dubbo.xsd 中&#xff0c;dubbo.xsd 文件用来约束使用 XML 配置时的标签和对应的属性 5.1.2 基于 XML 配置原理解析 主要解…