热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

白话贝叶斯公式_白话ML(10):NaveBayes分类模型,幼稚or优质?

本文适合人群:对机器学习MachineLearning与数据感兴趣的学习者温馨提示:阅读本文之前,需对以下内容进行了解并掌握白话ML&#x

da31062ab575657f985c5059b18ed320.png

本文适合人群:对机器学习Machine Learning与数据感兴趣的学习者

温馨提示:阅读本文之前,需对以下内容进行了解并掌握

白话ML:什么是机器学习模型?ML Model

白话ML(7):人类最好理解的预测模型-决策树Decision Tree

白话ML(3):理解机器学习中的Bias与Variance

本文白话什么:

用户精细化管理用的K-means聚类分析

本文提纲:

  • Naive Bayes的元素

  • Naive Bayes的分类判断过程

  • 弥补贝叶斯分类模型的缺陷

  • 优质or幼稚的模型?

注:全文无编程,只含有少量计算,文章内容全部尽量通俗易懂化,请尽情享用。

写在前面

在之前的白话ML系列,介绍了一些Tree-based model,不仅预测效果出色,而且还可能够做到explainable。这一期我们回归本真,介绍一些在机器学习课程中教授们会在最开始就介绍的模型:naïve Bayes,幼稚的贝叶斯模型。

Naive Bayes的元素

建立贝叶斯模型的几个重要元素,这些重要因素解释起来会比较的生涩我之后会在一个例子中进行讲解,他们分别是Posterior、evidence、likelihood以及prior下图是贝叶斯的核心思想,上述的四个元素分别对应下面的部分。贝叶斯统计与传统统计学的思想完全不一样,有兴趣大家可以自行学习,我会用一个例子来解释上述公式在naïve bayes应用中的作用。

d14e3f9837cede6838f800e968aa4308.png

Naive Bayes的分类判断过程

进入一个典型的例子来进行解释:我们希望使用贝叶斯模型对于垃圾邮件spam mail与正常邮件进行分类。在建立模型之前,我们首先先会拥有一个对于邮件分类的训练集模型,即变量是每封邮件中的单词,target value是邮件的属性(spam or normal)。那么注意了,在这里每封邮件的变量单词就是贝叶斯公式中的x即证据(evidence),target value就是我们公式中的C也叫做参数,参数是分布的属性,也就是spam or normal。

cac87b0d4743a3b03ee2eda93fac2ab6.png

下一步,我们要计算likelihoods,什么是likelihoods?就是在每一种参数(邮件类别)中,不同证据evidence(单词)出现的概率是多少。例如下图,我们将所有的normal email全部挑选出来,并且将所有email中的单词进行统计,假设我们所有的normal email只有4个单词(Dear、Friend、Lunch、Money),每个单词出现的频率如下图所示,那么我们可以根据条件概率算出下图中每一个单词在两个类别邮件中的likelihood。

2932b936e5b15cd6efda96a2b79b5807.png

730e4e5436b3b252e21a4b8e84b8702e.png

在全部的8封普通normal邮件中,总共有17个词出现,每一个单个单词出现的频率不同,用单个出现频率除以总单词量得到每一个变量的likelihood。在spam的4封邮件里以此类推。

在得到likelihood之后,我们开始计算prior,英文中prior是“先前”的意思,也就是在没有看到evidence之前,我们能够判断的normal以及spam邮件的概率,这个概率直接通过两种邮件的数量以及总邮件数构成。

77f06d2a25a8b393c2b771613d70c9c8.png

7b13bc8f674bd6e063b0bdb993695241.png

总共有12封邮件(作为训练集),普通的normal邮件有9封,spam垃圾邮件有4封,所以不同参数(属性)的Prior就是0.67和0.33.

在通过训练数据集得到了likelihood、prior之后,我们就要开始探究贝叶斯分类模型究竟是如何进行分类的。加入我们收到一封邮件里面的文字是Dear和Friend。那么对于这条record来说,模型将如何分类呢?这就需要回到我们最上边的贝叶斯公式

d14e3f9837cede6838f800e968aa4308.png

我们需要做的就是将两个邮箱类型下的分子进行计算,然后进行对比即可,因为evidence(邮箱里出现的文字)都是一样的,所以分母可以忽略。通过计算得到以下的两个数字。

303e7adcb8bb1c6c34d161972561d361.png

得到的两个数字其实就可以表示P(C|X),即在有一定的证据evidence(单词)出现的条件下,是正常邮件的概率,以及是垃圾邮件的概率。两个数值谁大,模型就选谁。最终,在这个例子下,模型会选择将这个邮件分类为正常邮件。

弥补贝叶斯模型缺陷

以上就是贝叶斯分类模型进行分类的过程,但是文章到这里还并没有结束,上述的分类过程会有一个很大的缺陷,比如当所收到邮件内容为Lunch,Money,Money,Money,Money时,我们通过直接很容易能够判断出这封邮件应该为Spam垃圾邮件,因为邮件中的Money非常多,而在垃圾邮件中P(Money | S)这个likelihood又特别大,所以模型应该将其分类成Spam。

2ec9cd518f85b6c60e132276abf25eee.png

但是问题来了,通过上面这幅图的计算,我们可以看到因为在Spam垃圾邮件中,P(Lunch | S)这个likelihood为0,所以只要邮件中“Lunch”这个单词出现,那么得到的P(Spam|X)的去分母数值就会为0,这个分数一定是会比P(Normal |X)小,那么模型就不会将邮件分类为垃圾邮件,这是个大大的Bug啊!

如何消除这个Bug进而优化模型呢?这里我们引入模型参数alpha(α)。如下图所示,我们设置为α=1就是将每一个单词的数量都增加1,来保证P(Lunch | S)这个likelihood不为0。如下图所示,将每个单词数量增加1,并重新对likelihood进行计算。

b051abb7988bb6bf97a4dc43a970fd92.png

接着,我们可以通过更新后的likelihood来计算最终的得分,很显然,在调整了α=1之后,贝叶斯模型很好的将Lunch,Money,Money,Money,Money识别为了spam垃圾邮件。

424c994ca25e72f246f3e2667af44253.png

幼稚还是优质?

Naive Bayes在上述的分析过程中看起来确实非常幼稚,它无视了单词的顺序以及关系问题,也不会像NLP一样探究每个单词的情感倾向,它只是通过最简单的贝叶斯统计的原理,对于训练数据进行公式中参数的计算,然后将这些参数应用于新的数据中进行分类。

但是正是因为他的优质,贝叶斯分类会能够很好的应用于实践中,因为贝叶斯模型的表现具有很低的variance。保证应用场景之间没有太大偏差。所以从这个角度来说,Naive Bayes还是个相对优质的模型

本文参考信息来源:

SateQuest

---------------------

PS:有任何疑问欢迎留言,本文完全个人浅薄理解,如有不足欢迎评论区指正。

我是杜吉普,致力于 数据+数据技术+商业场景=商业价值

欢迎关注我,让我们共同持续成长。

e043c66731dc91f25b18be73dd8d77d8.png




推荐阅读
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 数据库多表联合查询:内连接与外连接详解
    在数据库的多表查询中,内连接和外连接是两种常用的技术手段。内连接用于检索多个表中相互匹配的记录,即只有当两个表中的记录满足特定的连接条件时,这些记录才会被包含在查询结果中。相比之下,外连接则不仅返回匹配的记录,还可以选择性地返回不匹配的记录,具体取决于左外连接、右外连接或全外连接的选择。本文将详细解析这两种连接方式的使用场景及其语法结构,帮助读者更好地理解和应用多表查询技术。 ... [详细]
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
  • 本文深入探讨了 hCalendar 微格式在事件与时间、地点相关活动标记中的应用。作为微格式系列文章的第四篇,前文已分别介绍了 rel 属性用于定义链接关系、XFN 微格式增强链接的人际关系描述以及 hCard 微格式对个人和组织信息的描述。本次将重点解析 hCalendar 如何通过结构化数据标记,提高事件信息的可读性和互操作性。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 在Ubuntu上安装MySQL时解决缺少libaio.so.1错误及libaio在MySQL中的重要性分析
    在Ubuntu系统上安装MySQL时,遇到了缺少libaio.so.1的错误。本文详细介绍了如何解决这一问题,并深入探讨了libaio库在MySQL性能优化中的重要作用。对于初学者而言,理解这些依赖关系和配置步骤是成功安装和运行MySQL的关键。通过本文的指导,读者可以顺利解决相关问题,并更好地掌握MySQL在Linux环境下的部署与管理。 ... [详细]
  • 在Django中提交表单时遇到值错误问题如何解决?
    在Django项目中,当用户提交包含多个选择目标的表单时,可能会遇到值错误问题。本文将探讨如何通过优化表单处理逻辑和验证机制来有效解决这一问题,确保表单数据的准确性和完整性。 ... [详细]
  • Java能否直接通过HTTP将字节流绕过HEAP写入SD卡? ... [详细]
  • 本文探讨了如何在C#应用程序中通过选择ComboBox项从MySQL数据库中检索数据值。具体介绍了在事件处理方法 `comboBox2_SelectedIndexChanged` 中可能出现的常见错误,并提供了详细的解决方案和优化建议,以确保数据能够正确且高效地从数据库中读取并显示在界面上。此外,还讨论了连接字符串的配置、SQL查询语句的编写以及异常处理的最佳实践,帮助开发者避免常见的陷阱并提高代码的健壮性。 ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • 投融资周报 | Circle 达成 4 亿美元融资协议,唯一艺术平台 A 轮融资超千万美元 ... [详细]
  • 揭秘腾讯云CynosDB计算层设计优化背后的不为人知的故事与技术细节
    揭秘腾讯云CynosDB计算层设计优化背后的不为人知的故事与技术细节 ... [详细]
  • 公司计划部署邮件服务器,考虑到已有域名,决定自行搭建内部邮件服务器。经过综合考量,最终选择在Linux环境中进行搭建,并记录了相关配置和实践过程。本文将详细介绍Postfix的基本设置步骤和实践经验,帮助读者快速掌握邮件服务器的搭建方法。 ... [详细]
  • Eclipse JFace Text框架中IDocument接口的getNumberOfLines方法详解与编程实例 ... [详细]
author-avatar
曾经沧海难为水95531837155423
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有