news 2025/12/30 5:27:34

sklearn函数总结九— 朴素贝叶斯

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
sklearn函数总结九— 朴素贝叶斯

纯手打,代码整理中,持续更新中^-^

序号延用总结八

目录

16、朴素贝叶斯

16.1 什么是贝叶斯公式?

这些符号是什么意思?

我们来推导一下贝叶斯公式

16.2 贝叶斯公式经典实例:疾病的检测

场景:

问题:

结论:

16.3 什么是朴素贝叶斯算法?

16.4 朴素贝叶斯的优缺点

优点:

缺点:

16.5 代码示例-新闻文本分类预测

16.6 参数详解

参数详解:

1. alpha : float, 默认=1.0

2. fit_prior : bool, 默认=True

3. class_prior : array-like of shape (n_classes,), 默认=None


16、朴素贝叶斯

16.1 什么是贝叶斯公式?

在学习朴素贝叶斯之前,我们必须要先掌握贝叶斯公式:

这个公式乍一看,你肯定很懵逼,不过不用怕,我们来解释和分解下,你就懂了。

这些符号是什么意思?
  • P(A|B):在 B 已经发生的情况下,A 发生的概率。这是我们要找的,叫做后验概率(更新后的信念)。

  • P(B|A):在 A 已经发生的情况下,B 发生的概率。这个通常我们从数据中能得到,叫做似然概率

  • P(A):在不知道任何证据(B)的情况下,A 发生的概率。这是我们最初的看法,叫做先验概率

  • P(B):B 发生的总概率,叫做证据或标准化常量。

我们来推导一下贝叶斯公式

1.P(AB) = P(A) * P(B|A)

A 和 B 同时发生的概率等于 P(A) 乘以 P(B|A),这个大家应该能理解。

2、同理P(AB) = P(B) * P(A|B)

A 和 B 同时发生的概率也等于 P(B) 乘以 P(A|B),相信这个大家也应该能理解。

3、 所以我们能推导出:

P(A) * P(B|A) = P(B) * P(A|B)

把右边的 P(B) 放到左边去,就推导出了贝叶斯公式。相当大家彻底理解了贝叶斯公式。

16.2 贝叶斯公式经典实例:疾病的检测

这是一个非常著名且反直觉的例子,能完美展示贝叶斯思想的威力。

场景:

假设某种疾病在人群中的发病率是 1%(先验知识)。现在有一种检测方法:

  • 如果你确实有病,检测结果呈阳性(True Positive)的概率是 99%(非常准)。

  • 如果你没有病,检测结果呈阳性(False Positive)的概率是 5%(有5%的误诊率)。

问题:

如果一个人去做了检测,结果是阳性,那么他真正患病的概率到底是多少?


很多人会直觉地认为是 99% 或者 95%,但贝叶斯定理会给我们一个出乎意料的答案。

首先,定义事件:

  • A:真正患病

  • B:检测结果为阳性

我们要求的是:在检测结果为阳性的情况下,真正患病的概率,即 P(患病 | 阳性),也就是 P(A|B)。

根据公式,我们需要知道:

  1. P(A) - 先验概率:在不知道检测结果时,一个人患病的概率 = 发病率 = 1% = 0.01

  2. P(B|A) - 似然概率:如果一个人真有病,检测为阳性的概率 = 99% = 0.99

  3. P(B) - 证据:检测结果为阳性的总概率。这个需要计算一下。

计算 P(B):一个人检测为阳性有两种可能:

  • 他真有病,并且检测对了:(0.01 * 0.99)

  • 他其实没病,但被误诊了:((1 - 0.01) * 0.05)

所以,

P(B) = (真有病且测出阳性)+ (真没病但误诊为阳性)

P(B) = (0.01 * 0.99) + (0.99 * 0.05)

P(B) = 0.0099 + 0.0495

P(B) = 0.0594

现在,将所有值代入贝叶斯公式:

结论:

即使检测结果是阳性,你真正患病的概率也只有大约 16.67%!

16.3 什么是朴素贝叶斯算法?

朴素贝叶斯(Naive Bayes)算法 是一种基于贝叶斯定理的分类方法,广泛应用于文本分类(如垃圾邮件识别、情感分析等)和其他机器学习领域。

它的核心假设是:

特征与特征之间条件相互独立,即在给定类别的条件下,特征之间没有任何关系或依赖

公式数学推导略

16.4 朴素贝叶斯的优缺点

优点:
  1. 简洁高效:朴素贝叶斯方法实现简单,训练和预测速度都非常快。

  2. 适合高维数据:对于特征维度很高的数据(如文本分类),朴素贝叶斯特别适用,因为它能有效处理大量的特征。

  3. 良好的性能:在许多实际问题中,朴素贝叶斯能够取得不错的分类效果,特别是在数据特征间独立性假设基本成立的情况下。

缺点:
  1. 条件独立假设过于简单:实际数据中,特征之间往往存在依赖关系,而朴素贝叶斯假设特征之间完全独立,这可能会影响其性能。

  2. 对稀疏数据敏感:如果某个类别中某个特征从未出现过,朴素贝叶斯会计算出零概率,导致预测失败。为了解决这个问题,通常采用平滑技术(如拉普拉斯平滑)来避免零概率的问题。

16.5 代码示例-新闻文本分类预测

from sklearn.datasets import fetch_20newsgroups from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics import accuracy_score, classification_report from sklearn.model_selection import train_test_split from sklearn.naive_bayes import MultinomialNB # 1, 加载数据 news = fetch_20newsgroups(subset='all') # 2, 数据预处理 X_train, X_test, y_train, y_test = train_test_split( news.data, news.target, test_size=0.2 ) # 划分训练集和测试集 tfidfvectorizer = TfidfVectorizer() # 特征抽取 TF-IDF X_train_scaled = tfidfvectorizer.fit_transform(X_train) # fit计算生成模型 X_test_scaled = tfidfvectorizer.transform(X_test) # 使用训练集的参数转换测试集 # 3, 创建和训练 LogisticRegression 模型 model = MultinomialNB() model.fit(X_train_scaled, y_train) # 使用训练数据拟合(训练)模型 # 4, 进行预测并评估模型 y_pred = model.predict(X_test_scaled) # 在测试集上进行预测 print('模型预测值: ', y_pred) print('正确值 : ', y_test) accuracy = accuracy_score(y_test, y_pred) # 计算准确率 print(f'测试集准确率: {accuracy:.2f}') print('分类报告: \n', classification_report(y_test, y_pred, target_names=news.target_names))

输出

16.6 参数详解

MultinomialNB 是 Scikit-learn 中用于多项式分布数据的朴素贝叶斯分类器,特别适合文本分类等离散特征计数的场景。下面详细解释其构造方法、参数、属性和方法。

MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)
参数详解:
1.alpha: float, 默认=1.0
  • 含义:平滑参数(拉普拉斯平滑/Lidstone平滑)

  • 作用:防止概率计算中出现零值的问题

  • 详细解释:

    • 当某个特征在某个类别中从未出现时,概率会变为0,导致整个后验概率为0

    • alpha=1是拉普拉斯平滑(加1平滑)

    • 0 < alpha < 1是 Lidstone 平滑

    • alpha=0表示不使用平滑(可能导致过拟合和零概率问题)

  • 数学公式:

    • 平滑后的条件概率:P(xiy)=Ny+α×nN⋅{i}+α

    • 其中N⋅{i} 是特征i在类别y中的出现次数,Ny是类别y中所有特征的出现次数,n是特征数量

  • 建议值:通常使用1.0,可以通过交叉验证调整


2.fit_prior: bool, 默认=True
  • 含义:是否学习类别先验概率

  • 作用:控制是否使用训练数据中的类别分布

  • 详细解释:

    • fit_prior=True:使用训练数据中的类别频率作为先验概率

    • fit_prior=False:使用均匀先验概率(所有类别概率相等)

  • 数学公式:

    • fit_prior=TrueP(y)=NNy

    • fit_prior=FalseP(y)=k1 (k为类别数)

  • 适用场景:

    • 当训练集类别分布能代表真实分布时,使用True

    • 当训练集类别不平衡或不能代表真实分布时,可考虑使用False


3.class_prior: array-like of shape (n_classes,), 默认=None
  • 含义:类别的先验概率

  • 作用:手动指定各类别的先验概率

  • 详细解释:

    • 如果指定了此参数,fit_prior参数将被忽略

    • 数组长度必须等于类别数量

    • 概率值应该总和为1(但算法会自动归一化)

  • 示例:对于二分类问题,可以设置class_prior=[0.7, 0.3]

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/14 15:34:33

35、RAID 系统迁移与管理全攻略

RAID 系统迁移与管理全攻略 1. RAID 基础管理 在 RAID 系统中,如果需要更换磁盘,可按以下步骤操作: - 用新磁盘替换旧磁盘,并对新磁盘进行分区。要确保新分区的大小等于或大于 RAID 阵列中其他分区。 - 新分区准备好后,使用 --add 命令将其添加到阵列: $ sudo md…

作者头像 李华
网站建设 2025/12/14 15:34:23

37、构建高可用Linux集群:Heartbeat实战指南

构建高可用Linux集群:Heartbeat实战指南 在服务器运行过程中,即使主机配备了RAID和以太网绑定,仍有许多组件可能出现故障,从CPU到主机上的软件都有可能。若要确保服务在主机故障时仍能正常运行,就需要构建集群。本文将介绍基本Linux集群中常用的工具Heartbeat,并详细说明…

作者头像 李华
网站建设 2025/12/14 15:34:19

38、构建高可用集群:Heartbeat与DRBD实战指南

构建高可用集群:Heartbeat与DRBD实战指南 1. 集群准备与Heartbeat简介 在集群搭建过程中,当完成故障转移(fail back)相关操作后,集群就可以进行剩余的测试,适当调整超时设置,随后便可投入实际使用。之前的示例为搭建自己的集群服务提供了一个良好的开端,但它并未涵盖…

作者头像 李华
网站建设 2025/12/15 23:09:20

46、Linux 实用命令与技巧大揭秘

Linux 实用命令与技巧大揭秘 在 Linux 系统的使用过程中,掌握一些实用的命令和技巧能让我们的工作更加高效。下面将为大家详细介绍一系列实用的 Linux 命令及操作方法。 命令路径快捷查找 有时候,我们想查看二进制路径下的某个 shell 脚本,但却记不清它具体位于 /bin 、…

作者头像 李华
网站建设 2025/12/14 15:29:46

25、Ubuntu 网络应用全攻略

Ubuntu 网络应用全攻略 1. Firefox 浏览器使用技巧 Firefox 支持标签式窗口,提供了多种打开新标签的方式: - 点击“New Tab”按钮(现有标签右侧的“+”符号)。 - 按住“Ctrl”键并点击链接,可在新标签中打开。 - 按下“Ctrl - T”组合键。 - 若鼠标有中键,有时点击…

作者头像 李华
网站建设 2025/12/14 15:29:40

26、开启Ubuntu系统下OpenOffice.org的高效办公之旅

开启Ubuntu系统下OpenOffice.org的高效办公之旅 在Ubuntu系统中,我们可以借助网络完成许多操作。若想使用的程序或功能未被提及,可通过Synaptic软件包管理器或Ubuntu软件中心进行搜索,大概率能找到所需的程序或具有类似功能的替代程序。 而开源软件强大功能与能力的一个绝…

作者头像 李华