机器学习 - 朴素贝叶斯

朴素贝叶斯是基于贝叶斯定理的一种简单且高效的分类方法,特别适用于文本分类和情感分析等任务。

1. 贝叶斯定理简介

贝叶斯定理描述了后验概率(即在已知某些证据后某事件发生的概率)如何通过先验概率(即事件在未观测到任何证据前的概率)和似然(即在事件发生时观测到某些证据的概率)来计算。其公式如下:

P ( A ∣ B ) = P ( B ∣ A ) ⋅ P ( A ) P ( B ) P(A|B) = \frac{P(B|A) \cdot P(A)}{P(B)} P(AB)=P(B)P(BA)P(A)

其中:

  • P(A|B) 是给定证据 B 后事件 A 发生的后验概率。
  • P(B|A) 是在事件 A 发生时证据 B 出现的似然。
  • P(A) 是事件 A 的先验概率。
  • P(B) 是证据 B 的先验概率。

2. 朴素贝叶斯分类器原理

朴素贝叶斯分类器假设特征之间相互独立,且每个特征对分类结果的贡献是相同的。这一假设简化了计算过程,尽管在实际应用中,这一假设可能并不完全成立。

假设我们有一个包含 n 个特征的样本 x = ( x 1 , x 2 , . . . , x n ) x = (x_1, x_2, ..., x_n) x=(x1,x2,...,xn) 我们需要计算样本属于某个类别 Ck 的概率,即 P(Ck|x)。根据贝叶斯定理,我们有:

P ( C k ∣ x ) = P ( x ∣ C k ) ⋅ P ( C k ) P ( x ) P(C_k|x) = \frac{P(x|C_k) \cdot P(C_k)}{P(x)} P(Ckx)=P(x)P(xCk)P(Ck)

由于我们只关注相对大小,因此分母 P(x) 可以忽略。我们需要最大化 P(Ck|x),即最大化 P ( x ∣ C k ) ⋅ P ( C k ) P(x|C_k) \cdot P(C_k) P(xCk)P(Ck)

根据朴素假设,特征之间相互独立:

P ( x ∣ C k ) = P ( x 1 ∣ C k ) ⋅ P ( x 2 ∣ C k ) ⋅ . . . ⋅ P ( x n ∣ C k ) P(x|C_k) = P(x_1|C_k) \cdot P(x_2|C_k) \cdot ... \cdot P(x_n|C_k) P(xCk)=P(x1Ck)P(x2Ck)...P(xnCk)

因此,我们可以得到:

P ( C k ∣ x ) ∝ P ( C k ) ⋅ ∏ i = 1 n P ( x i ∣ C k ) P(C_k|x) \propto P(C_k) \cdot \prod_{i=1}^{n} P(x_i|C_k) P(Ckx)P(Ck)i=1nP(xiCk)

3. 案例:垃圾邮件分类

数据集介绍

假设我们有一个电子邮件数据集,其中每封邮件被标记为“垃圾邮件”或“正常邮件”。我们的任务是基于邮件内容预测其类别。假设我们的数据集如下:

邮件内容类别
“免费 赢得 奖品”垃圾邮件
“会议 记录”正常邮件
“优惠券 打折 免费”垃圾邮件
“项目 更新 会议”正常邮件
“赢得 现金 奖品”垃圾邮件

步骤 1:计算先验概率

先验概率是类别在训练数据中出现的频率:

P ( 垃圾邮件 ) = 3 5 = 0.6 P(\text{垃圾邮件}) = \frac{3}{5} = 0.6 P(垃圾邮件)=53=0.6
P ( 正常邮件 ) = 2 5 = 0.4 P(\text{正常邮件}) = \frac{2}{5} = 0.4 P(正常邮件)=52=0.4

步骤 2:计算条件概率

我们需要计算给定类别下各个单词出现的概率。例如,计算“免费”在“垃圾邮件”和“正常邮件”中的条件概率:

P ( 免费 ∣ 垃圾邮件 ) = “免费”出现在垃圾邮件中的次数 + 1 垃圾邮件中的单词总数 + 词汇表大小 = 2 + 1 9 + 10 = 3 19 P(\text{免费}|\text{垃圾邮件}) = \frac{\text{“免费”出现在垃圾邮件中的次数 + 1}}{\text{垃圾邮件中的单词总数 + 词汇表大小}} = \frac{2+1}{9+10} = \frac{3}{19} P(免费垃圾邮件)=垃圾邮件中的单词总数 + 词汇表大小免费出现在垃圾邮件中的次数 + 1=9+102+1=193

使用拉普拉斯平滑(加 1 平滑),假设我们的词汇表大小为 10。

类似地,我们计算其他单词的条件概率。

步骤 3:计算后验概率

假设我们有一封新邮件“免费 会议”,我们需要计算其属于“垃圾邮件”和“正常邮件”的后验概率:

P ( 垃圾邮件 ∣ 免费 会议 ) ∝ P ( 垃圾邮件 ) ⋅ P ( 免费 ∣ 垃圾邮件 ) ⋅ P ( 会议 ∣ 垃圾邮件 ) P(\text{垃圾邮件}|\text{免费 会议}) \propto P(\text{垃圾邮件}) \cdot P(\text{免费}|\text{垃圾邮件}) \cdot P(\text{会议}|\text{垃圾邮件}) P(垃圾邮件免费 会议)P(垃圾邮件)P(免费垃圾邮件)P(会议垃圾邮件)

根据我们之前计算的条件概率和先验概率,可以计算出:

P ( 垃圾邮件 ∣ 免费 会议 ) ∝ 0.6 ⋅ 3 19 ⋅ 1 19 P(\text{垃圾邮件}|\text{免费 会议}) \propto 0.6 \cdot \frac{3}{19} \cdot \frac{1}{19} P(垃圾邮件免费 会议)0.6193191

同样地,计算 P ( 正常邮件 ∣ 免费 会议 ) P(\text{正常邮件}|\text{免费 会议}) P(正常邮件免费 会议)

最终比较两个后验概率的大小,选择较大的那个类别作为预测结果。

好的,我们使用Python中的scikit-learn库来实现朴素贝叶斯分类器,并列出常见问题及其解决方案。我们将使用一个简单的文本分类任务作为案例。

4. 朴素贝叶斯API

我们将使用scikit-learn中的朴素贝叶斯分类器来构建一个垃圾邮件分类器。

数据准备

首先,我们创建一个简单的数据集,包含一些邮件内容及其标签(垃圾邮件或正常邮件)。

import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, classification_report# 创建数据集
data = {'text': ["免费 赢得 奖品","会议 记录","优惠券 打折 免费","项目 更新 会议","赢得 现金 奖品"],'label': ['spam', 'ham', 'spam', 'ham', 'spam']
}
df = pd.DataFrame(data)# 特征提取
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(df['text'])# 标签编码
y = df['label']# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 训练朴素贝叶斯分类器
model = MultinomialNB()
model.fit(X_train, y_train)# 预测
y_pred = model.predict(X_test)# 评估
accuracy = accuracy_score(y_test, y_pred)
report = classification_report(y_test, y_pred)print(f"Accuracy: {accuracy}")
print("Classification Report:")
print(report)
常见问题及解决方案

问题1:数据不平衡

  • 问题描述:训练数据中某些类别的样本数量远多于其他类别,导致分类器对少数类别的预测效果较差。

  • 解决方案

    • 使用过采样(如SMOTE)或欠采样技术来平衡数据。
    • 使用加权损失函数来惩罚分类错误的少数类别样本。

问题2:文本特征稀疏

  • 问题描述:文本数据在转化为特征向量时,特征向量非常稀疏,影响分类效果。

  • 解决方案

    • 使用TF-IDF(Term Frequency-Inverse Document Frequency)代替词频向量,可以减小常见但无意义的词对分类的影响。
    • 进行特征选择,去除低频或高频词。
from sklearn.feature_extraction.text import TfidfVectorizer# 使用TF-IDF特征提取
tfidf_vectorizer = TfidfVectorizer()
X_tfidf = tfidf_vectorizer.fit_transform(df['text'])# 拆分数据集
X_train_tfidf, X_test_tfidf, y_train, y_test = train_test_split(X_tfidf, y, test_size=0.2, random_state=42)# 训练朴素贝叶斯分类器
model.fit(X_train_tfidf, y_train)# 预测
y_pred_tfidf = model.predict(X_test_tfidf)# 评估
accuracy_tfidf = accuracy_score(y_test, y_pred_tfidf)
report_tfidf = classification_report(y_test, y_pred_tfidf)print(f"Accuracy with TF-IDF: {accuracy_tfidf}")
print("Classification Report with TF-IDF:")
print(report_tfidf)
  • 问题3:高维特征

  • 问题描述:文本特征向量通常非常高维,可能导致模型训练时间过长。

  • 解决方案

    • 使用降维技术,如PCA(主成分分析)或LDA(线性判别分析)来减少特征维度。
    • 进行特征选择,保留重要特征。
  • 问题4:模型过拟合

  • 问题描述:模型在训练数据上表现良好,但在测试数据上表现不佳。

  • 解决方案

    • 使用交叉验证来调优模型参数。
    • 增加正则化项,控制模型复杂度。

问题5:处理未见过的词汇

  • 问题描述:在测试数据中出现的词汇在训练数据中未出现,导致模型无法处理。

  • 解决方案

    • 使用拉普拉斯平滑(加1平滑)来处理未见过的词汇,避免概率为零的情况。
    • 增加训练数据,尽量覆盖更多的词汇。
# 拉普拉斯平滑已经在MultinomialNB中默认处理,无需额外操作

总结

朴素贝叶斯分类器由于其简单和高效,广泛应用于文本分类、情感分析等领域。尽管其假设特征独立性可能在实际应用中不完全成立,但在许多情况下依然表现良好。通过案例可以看到,朴素贝叶斯利用贝叶斯定理和特征独立假设,实现了高效的分类。

更多问题咨询

Cos机器人

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

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

相关文章

消防设施操作员证的含金量

100分题库提供安全员考试试题、建筑安全员考试预测题、建筑安全员ABC考试真题、安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关 依据《中华人民共和国消防法》,所有从事建筑物、构筑物消防安全管理、消防安全…

一个简单的线下转盘活动,指定记录,有增速度和减速

代码在此&#xff0c;请品尝 在线地址&#xff1a;JS Bin - Collaborative JavaScript Debugging <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"I…

git 合并commit

操作步骤 合并commit cd xxx/ git checkout a8c0efegfwgtw # 最新commit git reset rhgertheryhg --soft # 最初的commit git status git checkout -b test1 git commit -m "test1" git branch git push origin test1 git tag test1_v0.0.1 git push origin test1_…

Tomcat无法连通的调试方法1-service方式无法连通

作者&#xff1a;私语茶馆 1.局域网Tomcat服务不通 组网如下&#xff1a; 问题&#xff1a; Tomcat Server 服务方式启动后&#xff0c;无法访问&#xff0c;但命令行方式启动可以。IP地址都在同网段或不同网段现象都一样。 2.Tomcat 服务安装与调试 在Windows下&#xff0c;…

计算机系列之排序算法

20、排序算法 1、直接插入排序&#xff08;这里以从小到大排序为例&#xff09; ◆要注意的是&#xff0c;前提条件是前i-1个元素是有序的&#xff0c;第i个元素依次从第i-1个元素往前比较&#xff0c;直到找到一个比第i个元素值小的元素&#xff0c;而后插入&#xff0c;插入…

软件工程课程设计之酒店管理系统的设计与实现

这是一个简化的酒店管理系统的需求分析文档、系统设计文档、测试文档的结构概述&#xff0c;以及部分实现阶段的代码示例。详细设计阶段的数据字典、ER图、模块分类图将以文字描述形式给出&#xff0c;而完整的代码未完全实现。这里只做软件工程部分的设计需求说明哈&#xff5…

表现层设计模式_1.MVC模式

1.MVC模式三个核心模块 MVC是一种目前广泛流行的软件设计模式。近年来&#xff0c;随着Java EE的成熟&#xff0c;MVC成为了Java EE平台上推荐的一种设计模式。MVC强制性地把一个应用的输入、处理、输出流程按照视图、控制、模型的方式进行分离&#xff0c;形成了控制器…

有关登录安全,测试人该知道些什么?

作为测试&#xff0c;给我们一个关键词“登录”&#xff0c;我们可能想到的用例设计更多的是什么用户名、密码校验是否合法、是否为空、是否正确等等之类的场景。 但在如今信息化的时代&#xff0c;“登录安全”已经是一个很热门且普遍的的话题了&#xff0c;今天给大家简单分…

Java设计模式——装饰者模式

Java设计模式——装饰者模式 1.简介 装饰者模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许用户通过在一个对象上动态地添加职责或行为来增强其功能。这种类型的设计模式属于对象结构型模式&#xff0c;在不需要改变一个对象的内部结构…

基于国产LoRa的智慧农业解决方案--ASR6601、SX1278

我国《数字乡村发展战略纲要》明确指出“要推进农业数字化转型”&#xff0c;加快推广云计算、大数据、物联网、人工智能在农业生产经营管理中的运用。 然而&#xff0c;目前我国的农业数字化转型还面临着诸多挑战。我国整体农业机械化程度和自动化控制水平仍然较低。由于农田面…

Golang RPC实现-day02

导航 Golang RPC实现一、客户端异步并发多个请求1、 客户端结构体2、 一个客户端&#xff0c;异步发送多个请求&#xff0c;使用call结构体代表客户端的每次请求3、客户端并发多个请求4、客户端接收请求 Golang RPC实现 day01 我们实现了简单的服务端和客户端。我们简单总结一…

蓝桥杯-外卖店优先级(简单写法)

“饱了么”外卖系统中维护着 N 家外卖店&#xff0c;编号 1∼N。 每家外卖店都有一个优先级&#xff0c;初始时 (0 时刻) 优先级都为 0。 每经过 1 个时间单位&#xff0c;如果外卖店没有订单&#xff0c;则优先级会减少 1&#xff0c;最低减到 0&#xff1b;而如果外卖店有订…

【数据结构】双向循环链表专题解析

实现自己既定的目标&#xff0c;必须能耐得住寂寞单干。&#x1f493;&#x1f493;&#x1f493; 目录 •✨说在前面 &#x1f34b;知识点一&#xff1a;双向链表的结构 • &#x1f330;1."哨兵位"节点 • &#x1f330;2.双向带头循环链表的结构 &#x1f34b;…

基于java的超级玛丽游戏的设计与实现(论文 + 源码)

Java的超级玛丽游戏.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89313347 基于java的超级玛丽游戏的设计与实现 摘要 近年来&#xff0c;Java作为一种新的编程语言&#xff0c;以其简单性、可移植性和平台无关性等优点&#xff0c;得到了广泛地应用。J2SE称…

(程序设计语言)传值、传引用

1、传值&#xff08;传递值&#xff09;&#xff1a; 在传值的情况下&#xff0c;函数接收到的是参数的一个副本&#xff0c;而不是参数本身。这意味着函数内部对参数的修改不会影响到原始值。传值通常用于基本数据类型&#xff08;如整数、浮点数、布尔值等&#xff09;的传递…

微信小程序原生全局状态管理——wxminishareddata

一个基于原生小程序的 mini 轻量全局状态管理库&#xff0c;跨页面/组件数据共享渲染。 全局状态 data 支持所有 Page 和 Component。类似 Vuex 的使用适合原生小程序&#xff0c;即使后期引入&#xff0c;也只需增加几行代码。目前为第一版&#xff0c;很粗糙&#xff0c;但也…

前端 CSS 经典:CSS 包含块

前言&#xff1a;CSS 总的来说就两块&#xff0c;样式计算和视觉格式化模型&#xff0c;而包含块就是视觉格式化模型的重要内容&#xff0c;理解包含块的定义&#xff0c;对于 CSS 布局有更好的帮助。 1. 概念 什么叫包含块&#xff0c;指的是一个区域&#xff0c;某一个元素在…

华焰天下晋升质量管理三大体系和产品3C认证实力级

华焰天下&#xff0c;作为业界领先的新能源灶具企业&#xff0c;一直以来都致力于追求卓越的质量管理和产品创新。近日&#xff0c;华焰天下成功晋升为质量管理三大体系先进管理&#xff0c;并成功获得了产品3C认证&#xff0c;这标志着我们在质量管理和产品安全方面迈出了坚实…

ThreadLocal,一次到位

一、定义 ThreadLocal是线程私有变量&#xff0c;用于保存每个线程的私有数据。 那么什么情况下需要进行线程隔离 二、源码分析 public class ThreadLocalTest01 {ThreadLocal<Integer> t new ThreadLocal<>();public void test() {t.set(1);Integer integer…

传输层协议——TCP协议

TCP协议又叫传输控制协议&#xff0c;TCP/IP协议是计算机通信网络中目前使用最多的协议&#xff0c;同时也融入了生活的方方面面&#xff0c;不管是浏览网页使用的http/https协议、物联网设备使用的MQTT/MQTTS协议与下载文件使用的ftp协议、工业以太网中使用的Modbus TCP协议等…