一、朴素贝叶斯核心思想

首先我将举个例子以便理解。假设我收到一封邮件,内容描述如下:您提交的3215号工单:来自李先生的留言。请点击链接查看工单处理进度:https://tingyun.kf5.com/hc/request……

已知在垃圾邮件中经常出现“链接”,“点击”这种单词,我收到的该邮件中包含了这些单词,这个邮件很可能是垃圾邮件。垃圾邮件分类属于监督学习范畴,监督学习指给定一个数据和标签,前提是手中有大量邮件数据,即知道哪些是垃圾邮件哪些不是。

分别计算出邮件中的单词在正常邮件和垃圾邮件中的概率:

P(垃圾|邮件内容) =  一封邮件为垃圾的概率

P(正常|邮件内容) =  一封邮件为正常的概率

如果 P(垃圾|邮件内容) > P(正常|邮件内容),则推测此邮件为垃圾邮件;如果 P(垃圾|邮件内容) < P(正常|邮件内容),则推测此邮件为正常邮件。

二、贝叶斯定理

现有一封邮件内容为:“购买 物品, 不是 广告”,如何判断是正常邮件还是垃圾邮件呢?

推导过程如下,需要使用条件独立假设简化

:P(正常|邮件内容) = P(邮件内容|正常)*P(正常)/P(邮件内容)

=P("购买",“物品”,“不是”,“广告”|正常)*P(正常)/P(邮件内容)

=P(“购买”|正常)*P(“物品”|正常)*P(“不是”|正常)*P(“广告”|正常)*P(正常)/P(邮件内容)

=(1/80*1/60*1/60*1/48*2/3 )/P(邮件内容)

P(垃圾|邮件内容) = P(邮件内容|垃圾)*P(垃圾)/P(邮件内容)

=(7/120*1/30*1/40*1/30*1/3 )/P(邮件内容)

垃圾邮件和正常邮件概率的分母均为P(邮件内容),可忽略此项。

如何处理概率为零的情况,样本在测试数据中未出现的状况可能发生,处理方法是使用平滑(smoothy)的思想,例如Add-one smoothy,即在分子加一分母加上词库大小。

应用实例:

# 读取spam.csv文件
import pandas as pd
df = pd.read_csv("data_spam/spam.csv", encoding='latin')
df.head()


# 重命名数据中的v1和v2列,使得拥有更好的可读性
df.rename(columns={'v1':'Label', 'v2':'Text'}, inplace=True)
df.head()

# 把'ham'和'spam'标签重新命名为数字0和1
df['numLabel'] = df['Label'].map({'ham':0, 'spam':1})
df.head()

# 统计有多少个ham,有多少个spam
print ("# of ham : ", len(df[df.numLabel == 0]), " # of spam: ", len(df[df.numLabel == 1]))
print ("# of total samples: ", len(df))

# of ham : 4825 # of spam: 747 # of total samples: 5572

# 统计文本的长度信息
text_lengths = [len(df.loc[i,'Text']) for i in range(len(df))]
print ("the minimum length is: ", min(text_lengths))import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as pltplt.hist(text_lengths, 100, facecolor='blue', alpha=0.5)
plt.xlim([0,200])
plt.show()

# 导入英文呢的停用词库
from nltk.corpus import stopwords
from sklearn.feature_extraction.text import CountVectorizer
# what is stop wordS? he she the an a that this ...
stopset = set(stopwords.words("english"))# 构建文本的向量 (基于词频的表示)
#vectorizer = CountVectorizer(stop_words=stopset,binary=True)
vectorizer = CountVectorizer()# sparse matrix
X = vectorizer.fit_transform(df.Text)
y = df.numLabel
# 把数据分成训练数据和测试数据
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=100)
print ("训练数据中的样本个数: ", X_train.shape[0], "测试数据中的样本个数: ", X_test.shape[0])
训练数据中的样本个数:  4457 测试数据中的样本个数:  1115

# 利用朴素贝叶斯做训练
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_scoreclf = MultinomialNB(alpha=1.0, fit_prior=True)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print("accuracy on test data: ", accuracy_score(y_test, y_pred))# 打印混淆矩阵
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, y_pred, labels=[0, 1])
accuracy on test data:  0.97847533632287

array([[956, 14],

[ 10, 135]])

——《贪心学院特训营》第四期学习笔记

朴素贝叶斯——最适合简单的文本分析算法相关推荐

  1. 几句话搞懂朴素贝叶斯法(简单理解和应用)

    几句话搞懂朴素贝叶斯法(简单理解和应用) 适合如我这般完全忘记数学知识的小白,大佬可绕行 贝叶斯定理 先验概率 条件概率 极大似然估计 贝叶斯估计 公式解读:贝叶斯公式.极大似然估计.贝叶斯公式变形 ...

  2. 【机器学习】朴素贝叶斯、SVM和数据分布检验分析

    [机器学习]朴素贝叶斯.SVM和数据分布检验分析 文章目录 1 朴素贝叶斯 2 SVM2.1 线性可分2.2 最大间隔超平面2.3 SVM 最优化问题 3 数据分布检验方法3.1 数据分布检验3.2 ...

  3. 朴素贝叶斯模型的简单应用

    朴素贝叶斯模型是贝叶斯理论中最简单的一类,基本假设有两个,一是特征相互独立,二是特征同等重要,这样可以大大简化计算,虽然在实际中属性之间未必是相互独立的,甚至存在严重的依赖性(此时会用到半朴素贝叶斯模 ...

  4. 判断喜欢的电影类型——朴素贝叶斯模型的简单应用(1)

    之前我做了一个豆瓣电影信息的爬取 https://blog.csdn.net/weixin_43374551/article/details/84029439 ,共获得了8608部电影的概要信息.现在 ...

  5. 朴素贝叶斯 半朴素贝叶斯_使用朴素贝叶斯和N-Gram的Twitter情绪分析

    朴素贝叶斯 半朴素贝叶斯 In this article, we'll show you how to classify a tweet into either positive or negativ ...

  6. 朴素贝叶斯详解及中文舆情分析(附代码实践)

    作者|杨秀璋  整理|AI科技大本营 本文主要讲述朴素贝叶斯分类算法并实现中文数据集的舆情分析案例,希望这篇文章对大家有所帮助,提供些思路.内容包括: 1.朴素贝叶斯数学原理知识 2.naive_ba ...

  7. 利用朴素贝叶斯原理过滤垃圾邮件(TF-IDF算法)

    本人是新手,为了还原该过程用了自己的方法,可能时间复杂度较高,并且在训练数据时也没有用到SKlearn模块中的贝叶斯分类器,是为了尝试自己去还原求后验条件概率这个过程. 目录 一.简述朴素贝叶斯原理 ...

  8. 朴素贝叶斯应用案例 —— 商品评论情感分析

    商品评论情感分析 1 案例介绍 2 流程实现 2.1 获取数据集 2.2 数据基本处理 2.3 模型训练 2.4 模型评估 1 案例介绍 本案例提供了一个13条商品评价的小型数据集,通过对商品评价内容 ...

  9. #第26篇分享:一个文本分类的数据挖掘(python语言:sklearn 朴素贝叶斯NB)(2)

    #sklearn 朴素贝叶斯NB算法常用于文本分类,尤其是对于英文等语言来说,分类效果很好:它常用于垃圾文本过滤.情感预测.推荐系统等:是基于概率进行预测的模型,可以做二分类及多分类( 朴素贝叶斯是个 ...

最新文章

  1. 山西对口升学计算机分数线,2020年山西对口升学本科一批录取分数线是多少
  2. MySQL基于时间字段进行分区的方案总结
  3. php 回调通知 连连支付_php怎么写连连支付退款
  4. 高德地图和百度地图接口封装遇到的问题(二):绘制带有方向箭头的折线
  5. hdu_2243_考研路茫茫——单词情结(AC自动机+矩阵)
  6. GIS Portal的一个例子(http://www.geodata.gov/gos)
  7. mysql配置文件完全_MySQL配置文件my.cnf详解
  8. mybatis plus 日志打印_Mybatis-plus常用API全套教程,看完没有不懂的
  9. android js交互 数组,Android WebView —— Java 与 JavaScript 交互总结
  10. bzoj 1800: [Ahoi2009]fly 飞行棋
  11. TP框架log日志使用方法
  12. 基于FPGA的数字视频信号处理器设计(上)
  13. 自己的域名邮箱用GMAIL:申请注册GMAIL的免费企业邮箱
  14. 从零实现加密隧道(二):socks5 协议详解
  15. java文档生成器_最好用的数据库文档生成工具
  16. 双击桌面计算机打不开硬盘,双击硬盘盘符打不开只能右键打开的解决方法 -电脑资料...
  17. CCNA实验前准备(转)
  18. sublimeText3汉化教程-自带插件汉化
  19. Java--配置环境变量
  20. Code-server阿里云ECS服务器部署

热门文章

  1. 设计模式——代理模式(C++)——为别人做嫁衣
  2. 周立齐出任电动车联合创始人:网红经济背后的病态消费心理
  3. matlab 太阳黑子周期,太阳黑子周期分析
  4. 城市名称按首字母分组排序,并实现多音字处理
  5. 现代教育理念中的机器人管理
  6. android开发:小米手机开发时非要sim卡才能调试怎么办?
  7. 【七夕不准备 光棍节掉泪】15款实用的取证相关工具,效率源陪你过七夕
  8. 随意休假,不讲绩效,这个公司怎么做到市值万亿的?
  9. React教程之使用create-react-app构建你的第一个react应用
  10. 书单推荐之Docker容器