机器学习之朴素贝叶斯(Naive Bayes)

news2024/12/24 2:10:49

1 朴素贝叶斯算法介绍

朴素贝叶斯是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法。朴素贝叶斯分类器(Naive Bayes Classifier 或 NBC)发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率,是应用最为广泛的分类算法之一。

朴素贝叶斯方法是在贝叶斯算法的基础上进行了相应的简化,即假定给定目标值时属性之间相互条件独立。虽然这个简化方式在一定程度上降低了贝叶斯分类算法的分类效果,但是在实际的应用场景中,极大地简化了贝叶斯方法的复杂性。

朴素贝叶斯对于给定的训练集,首先基于特征条件独立假设学习输入输出的联合概率分布;然后基于此模型,对给定的输入 x,利用贝叶斯定理求出后验概率最大的输出 y。

 

1.1 贝叶斯

贝叶斯是英国数学家。1702年出生于伦敦,贝叶斯在数学方面主要研究概率论。对于统计决策函数、统计推断、统计的估算等做出了贡献。他的统计学概率理论称为贝叶斯Thomas Bayes。在贝叶斯之前,人们已经能够计算“正向概率”,如“假设袋子里面有 N 个白球,M 个黑球,你伸手进去摸一把,摸出黑球的概率是M/(M+N)”。而一个自然而然的问题是反过来:“如果我们事先并不知道袋子里面黑白球的比例,而是闭着眼睛摸出一个(或好几个)球,观察这些取出来的球的颜色之后,那么我们可以就此对袋子里面的黑白球的比例作出什么样的推测”。这个问题,就是所谓的逆向概率问题。贝叶斯就是为解决这种逆向概率而生。

1.2 概率

(1)先验概率

通过经验判断事情发生的概率,P(A)是 A 的先验概率,之所以称为“先验”是因为它不考虑任何 B 方面的因素。

(2)后验概率

发生结果后,推测原因的概率。属于条件概率的一种,贝叶斯就是用来解决后验概率。
P(A|B)是已知 B 发生后 A 的条件概率,也由于得自 B 的取值而被称作 A 的后验概率。p(房地产|垃圾邮件)代表垃圾邮件中房地产出现的频率。

(3)条件概率

事件A在另一个事件B已经发生的条件下发生的概率,表示P(A|B)

1.3 贝叶斯公式

设有样本数据集D={d1,d2,...,dn},对应样本数据的特征属性集为X={x1,x2,...,xd}类变量为Y={y1,y2,...ym} ,即D可以分为ym类别。其中{x1,x2,...,xd} 相互独立且随机,则Y的先验概率P(Y) ,Y的后验概率P(Y|X) ,由朴素贝叶斯算法可得,后验概率可以由先验概率P(Y) ,证据P(X) ,类条件概率P(X|Y)计算出

 在分类算法里面应用,可以转换成下面的表达式

 朴素贝叶斯基于各特征之间相互独立,在给定类别为y的情况下,上式可以进一步表示为下式:

 由于P(X)的大小是固定不变的,因此在比较后验概率时,只比较上式的分子部分即可,因此可以得到一个样本数据属于类别yi的朴素贝叶斯计算:

 

2 朴素贝叶斯算法的优缺点

朴素贝叶斯算法是一种基于概率统计的分类算法,它假设特征之间相互独立,并利用贝叶斯定理进行分类。该算法具有以下优点和缺点:

2.1 朴素贝叶斯算法优点:

  • 简单高效:朴素贝叶斯算法的计算速度相对较快,训练和预测的时间复杂度较低。它的实现也相对简单,不需要大量的参数调整。

  • 处理高维数据:朴素贝叶斯算法在处理高维数据时表现良好。由于假设特征之间独立,算法能够处理大量特征的情况,并且不容易受到维度灾难的影响。

  • 对小样本数据有效:即使在小样本情况下,朴素贝叶斯算法也能够表现出较好的分类性能。由于它利用概率估计来进行分类,可以更好地利用有限的训练数据。

  • 处理分类和文本特征:朴素贝叶斯算法在处理分类问题和文本分类问题时具有优势。它能够对文本特征进行建模,并在文本分类、垃圾邮件过滤等任务中取得良好的效果。

2.2 朴素贝叶斯算法缺点:

  • 特征独立性假设:朴素贝叶斯算法假设特征之间相互独立,但在实际情况中,很多特征可能存在相关性。这种独立性假设可能导致模型的准确性下降。

  • 对数据分布的假设:朴素贝叶斯算法假设特征的概率分布为高斯分布或多项式分布等。如果数据的真实分布与这些假设不符,模型的表现可能会受到影响。

  • 欠拟合问题:由于特征独立性假设,朴素贝叶斯算法可能无法准确地捕捉特征之间的复杂关系。在某些情况下,它可能会出现欠拟合问题,导致分类性能不佳。

  • 缺乏调节参数的能力:朴素贝叶斯算法的参数通常是根据训练数据进行估计的,缺乏自适应调节的能力。这意味着它可能无法灵活地适应不同类型的数据和分类任务。

尽管朴素贝叶斯算法存在一些限制,但它在许多实际应用中仍然表现出色,特别是在文本分类和简单分类问题上。在特征独立性假设适用且数据量较小的情况下,朴素贝叶斯算法是一个简单而有效的选择。

3 朴素贝叶斯算法的应用场景

朴素贝叶斯算法在许多领域和应用中都有广泛的应用。以下是一些常见的应用场景:

  • 文本分类:朴素贝叶斯算法在文本分类任务中表现出色。它可以用于垃圾邮件过滤、情感分析、新闻分类等。通过对文本特征进行建模,可以将文本数据自动分类到不同的类别。

  • 电子商务推荐系统:朴素贝叶斯算法可以用于电子商务推荐系统中的商品分类和个性化推荐。通过对用户历史购买数据和商品特征进行建模,可以预测用户对新商品的喜好,并向其推荐相关的商品。

  • 垃圾邮件过滤:由于朴素贝叶斯算法在处理文本分类任务中的优秀表现,它被广泛应用于垃圾邮件过滤。通过训练模型,可以自动识别垃圾邮件,并将其过滤出来,提高用户的邮件使用体验。

  • 文本生成与自然语言处理:朴素贝叶斯算法可用于文本生成和自然语言处理任务,如语言模型和词性标注。通过对语料库中的文本进行学习,可以建立一个模型来生成新的文本或对文本进行标注。

  • 疾病诊断:朴素贝叶斯算法在医学领域中的应用也很广泛。它可以用于疾病诊断,通过对患者的症状和医学测试结果进行建模,预测患者可能患有的疾病,并辅助医生做出诊断决策。

  • 图像分类:尽管朴素贝叶斯算法在处理图像数据方面的表现不如其他深度学习方法,但它仍然可以用于简单的图像分类任务。通过对图像特征进行建模,可以将图像自动分类到不同的类别。

需要注意的是,朴素贝叶斯算法在处理复杂关系和高维数据上可能存在限制,适用于特征独立性假设适用的情况下。在现实应用中,通常会将朴素贝叶斯算法与其他算法和技术相结合,以提高分类的准确性和性能。

4 基于朴素贝叶斯对新闻数据进行分类

4.1 代码实现

# 朴素贝叶斯算法
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split


def nb_news():
    """
    用朴素贝叶斯算法对新闻进行分类
    """
    # 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.25)

    # 3.特征工程:文本特征抽取-tfidf
    transfer = TfidfVectorizer()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)

    # 4.朴素贝叶斯算法预估器流程
    estimator = MultinomialNB()
    estimator.fit(x_train, y_train)

    # 5.模型评估
    # 方法1:直接比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print(f"文章类型/预测类型:{y_test}/{y_predict}\n")

    # 方法2:计算准确率
    score = estimator.score(x_test, y_test)
    print(f"预测准确率为:{score}\n")

    return None


if __name__ == "__main__":
    # 用朴素贝叶斯算法对新闻进行分类
    nb_news()

4.2 结果展示

文章类型:2,预测类型:2
文章类型:12,预测类型:12
文章类型:0,预测类型:0
文章类型:2,预测类型:2
文章类型:14,预测类型:14
文章类型:4,预测类型:4
文章类型:3,预测类型:3
文章类型:12,预测类型:12
文章类型:15,预测类型:15
文章类型:2,预测类型:2
文章类型:16,预测类型:16
文章类型:6,预测类型:6
文章类型:11,预测类型:11
文章类型:2,预测类型:2
文章类型:7,预测类型:7
文章类型:3,预测类型:3
文章类型:5,预测类型:5
文章类型:4,预测类型:4
文章类型:14,预测类型:14
文章类型:8,预测类型:8
文章类型:14,预测类型:14
文章类型:1,预测类型:1
文章类型:11,预测类型:11
文章类型:13,预测类型:13
文章类型:8,预测类型:8
文章类型:4,预测类型:4
文章类型:7,预测类型:7
文章类型:17,预测类型:17
文章类型:7,预测类型:7
文章类型:5,预测类型:2
文章类型:7,预测类型:7
文章类型:0,预测类型:0
文章类型:13,预测类型:13
文章类型:12,预测类型:12

预测准确率为:0.8478353140916808

最终的预测准确率达到84.7%

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

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

相关文章

python发送邮件,超简单!

1、我的使用场景 最近有几个爬虫定时任务在运行,需要及时知道发生异常,以便于处理,于是,想到了邮件,记录一下。 2、邮箱服务设置 我是专门为这个脚本注册的,如果有,也可以不注册。 注册完&a…

Transformer(四)--实现验证:transformer 机器翻译实践

转载请注明出处:https://blog.csdn.net/nocml/article/details/125711025 本系列传送门: Transformer(一)–论文翻译:Attention Is All You Need 中文版 Transformer(二)–论文理解:transformer 结构详解 Transformer(三)–论文实…

sql server 触发器往链接服务器同步数据的坑

链接服务器无法启动分布式服务 检查数据库是否勾选了一下按钮,双方都要检查 链接服务器属性,需要检查这些地方是否已经设置为true 该伙伴事务管理器已经禁止了它对远程/网络事务的支持 双方启动MSDTC服务 (1)在windows控制面版–>windows 工具->…

Sourcetree: The host key is not cached for this server:

使用Sourcetree 出现提示:The host key is not cached for this server: 工具>选项>一般 确认完成,解决问题。

【嵌入式Qt开发入门】使用 UI 设计器开发程序

本文我们继续学习如何使用 Qt Designer 开发程序,Qt Designer 是属于 Qt Creator 的一个功能而已,大家不要搞混了。Qt Designer 也叫 UI 设计师或者 UI 设计器,这都是指的同一 个东西。下面简单介绍如何使用 UI 设计器开发程序,以…

webassembly如何在js侧使用注册的容器类型

需求&#xff1a;是有个C接口&#xff0c;参数是vector<string>类型&#xff0c;那么如何在js端调用这个接口呢&#xff1f; #include <emscripten/emscripten.h> #include <emscripten/bind.h> #include <vector> #include <string> #include …

Modbus Slave和Modbus Poll的使用说明

文章目录 1 软件说明2 本例目标3 Modbus Poll配置步骤4 Modbus Slave配置步骤5 各种测试5.1 正常显示5.2 Slave Id不一致5.3 Quantity不够5.4 测试IP Address 6 总结 1 软件说明 Modbus Poll&#xff1a;是Witte Software公司开发的的Modbus主机仿真器&#xff0c;用于测试和调…

2022年影响因子新鲜出炉!(附↓)

【SciencePub学术】6月28日,科睿唯安发布2023年度《期刊引证报告》&#xff08;Journal Citation Reports&#xff0c;简称 JCR&#xff09;。 本年度《引证报告》对Web of Science核心合集收录的所有期刊赋予期刊影响因子&#xff0c;同时&#xff0c;为鼓励用户在比较期刊时…

续篇-docker篇: 优势与安装方式 及基础指令整合

目录 1. 前言简介: 1.1 docker的优势: 1.2 docker的简易理解 2. 指令安装 2.1 安装yum的插件 ps: 提示没权限加上sudo即可 root用户不用 2.2 设置yum仓库地址 ps: 设置多个镜像仓库, 不设置可能会下载变慢 ps: 如图所示 2.3 更新缓存 2.4 安装docker 2.5 查看do…

Spring Boot 中的事务超时时间

Spring Boot 中的事务超时时间 在 Spring Boot 中&#xff0c;事务管理是一个非常重要的话题。当我们在数据库中执行一些复杂的操作时&#xff0c;需要确保这些操作能够在一定的时间内完成&#xff0c;否则可能会导致数据一致性问题。为了解决这个问题&#xff0c;Spring Boot…

Linux--12--Kernel panic – not syncing: Attempted to kill init! Redhat6.2故障修复

1、Linux环境 Redhat6.2&#xff0c; Linux version 2.6.32-220.el6.i686 (mockbuildx86-003.build.bos.redhat.com) (gccversion 4,4.5 20110214 (Red Hat 4.4.5-6) (GCC) ) #1 SMP Wed Nov 9 08:02:18 EST 2011 2、故障现象 修改TCP相关文件&#xff0c;重启完Linux系统之…

ModaHub魔搭社区:Milvus的工作原理和为什么选择Milvus?

目录 为什么选择 Milvus&#xff1f; Milvus 的工作原理是什么&#xff1f; Milvus 由存储层和计算层组成&#xff0c;为了增强弹性和灵活性&#xff0c;Milvus 中的所有组件都是无状态的。系统由四个层级组成&#xff1a; Milvus 用于什么&#xff1f; 如今&#xff0c;已…

java学习记录之struts2struts标签上传国际化

Strtus2 OGNL表达式的结合 描述: struts2为OGNL表达式准备了两个对象 ActionContext: 作为ognl表达式的Context valueStack: 作为ognl表达式的Root 以上两个对象的创建 都是strutsPrepareAndExecuteFilter中准备好. Ognl和Struts使用上的结合: 表单提交,其中提交的键可以看作…

iview切换Select时选项丢失,重置Seletc时选项丢失

分析原因 在旧版本的iview中如果和filterable一起使用时&#xff0c;当值清空选项或者使用重置按钮清空时选项会丢失。 解决方式一 把去掉filterable 解决方式二 使用ref&#xff0c;调用clearSingleSelect()方法清空 ref"perfSelect" this.$refs.perfSelect.c…

Nginx上游节点健康检测

Nginx默认是没有支持上游节点健康检测的。 可以使用Tengine 文档 - The Tengine Web Server 或者自行下载nginx然后自己安装nginx_upstream_check_module 模块 在linux下载nginx wget http://nginx.org/download/nginx-1.25.1.tar.gz 下载插件 GitHub - yaoweibin/nginx_u…

【Java高级编程】Java8的新特性

Java8的新特性 1、Java8的新特性概述2、Lambda表达式2.1、Lambda表达式使用前后的对比2.2、Lambda表达式的基本语法2.3、如何使用&#xff1a;分为六种情况 3、函数式接口3.1、函数式接口的使用说明3.2、Java8中关于Lambda表达式提供的4个基本的函数式接口3.3、总结 4、方法引用…

开源建站博客社区系统大放送

前言 软件开发成本非常高昂&#xff0c;写demo易&#xff0c;做产品难&#xff0c;难就难在无数细节需要精雕细琢。 学习博客、论坛、内容管理系统这些典型的、通用型的系统&#xff0c;能极大提升你的软件架构和开发能力。本文筛选了目前主流的开源项目&#xff0c;帮助大家入…

动手学深度学习v2 p1引言 监督学习与无监督学习

1.引言 1.2. 机器学习中的关键组件 首先介绍一些核心组件。无论什么类型的机器学习问题&#xff0c;都会遇到这些组件&#xff1a; 可以用来学习的数据&#xff08;data&#xff09;&#xff1b; 如何转换数据的模型&#xff08;model&#xff09;&#xff1b; 一个目标函数…

linux--用户相关

目录 一.要在云服务器官网重置root密码成功后才能登录xshell(重装系统后登录也不例外&#xff09; 二.添加普通用户&#xff1a; 三.查看root下有几个普通用户&#xff1a; 四.给用户设置密码&#xff1a; 五、用户登录​编辑 六、查看当前所在用户&#xff1a; 七、查看…

windows上phpstudy 在切换php7.0到7.2后项目404

项目从7.0切换到7.2.9一访问本地就报404&#xff0c;然后重启 重新配置nginx.conf也无效 然后取查看phpstudy 的 nginx/logs/error.log 发现一访问本地网站就报下面错 phpstudy报错 2023/06/28 11:36:28 [error] 14128#19616: *1 upstream prematurely closed connection whi…