关键词:
目录
1 朴素贝叶斯算法简介
朴素贝叶斯法(Naive Bayes model)是基于贝叶斯定理与特征条件独立假设的分类方法。
最为广泛的两种分类模型是决策树模型(Decision Tree Model)和朴素贝叶斯模型(Naive Bayesian Model,NBM)。和决策树模型相比,朴素贝叶斯分类器(Naive Bayes Classifier 或 NBC)发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率。同时,NBC模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单。理论上,NBC模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为NBC模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,这给NBC模型的正确分类带来了一定影响。
2 概率基础复习
2.1 概率定义
- 概率定义为一件事情发生的可能性
- 扔出一个硬币,结果头像朝上
- P(X) : 取值在[0, 1]
2.2 案例:判断女神对你的喜欢情况
在讲这两个概率之前我们通过一个例子,来计算一些结果:
问题如下:
- 女神喜欢的概率?
- 职业是程序员并且体型匀称的概率?
- 在女神喜欢的条件下,职业是程序员的概率?
- 在女神喜欢的条件下,职业是程序员、体重超重的概率?
计算结果为:
P(喜欢) = 4/7
P(程序员, 匀称) = 1/7(联合概率)
P(程序员|喜欢) = 2/4 = 1/2(条件概率)
P(程序员, 超重|喜欢) = 1/4
思考题:在小明是产品经理并且体重超重的情况下,如何计算小明被女神喜欢的概率?
即P(喜欢|产品, 超重) = ?
此时我们需要用到朴素贝叶斯进行求解,在讲解贝叶斯公式之前,首先复习一下联合概率、条件概率和相互独立的概念。
2.3 联合概率、条件概率与相互独立
- 联合概率:包含多个条件,且所有条件同时成立的概率
- 记作:P(A,B)
- 条件概率:就是事件A在另外一个事件B已经发生条件下的发生概率
- 记作:P(A|B)
- 相互独立:如果P(A, B) = P(A)P(B),则称事件A与事件B相互独立。
2.4 贝叶斯公式
2.4.1 公式介绍
2.4.2 案例计算
那么思考题就可以套用贝叶斯公式这样来解决:
P(喜欢|产品, 超重) = P(产品, 超重|喜欢)P(喜欢)/P(产品, 超重)
上式中,
- **P(产品, 超重|喜欢)和P(产品, 超重)的结果均为0,导致无法计算结果。**这是因为我们的样本量太少了,不具有代表性。
- 本来现实生活中,肯定是存在职业是产品经理并且体重超重的人的,P(产品, 超重)不可能为0;
- 而且事件“职业是产品经理”和事件“体重超重”通常被认为是相互独立的事件,但是,根据我们有限的7个样本计算“P(产品, 超重) = P(产品)P(超重)”不成立。
而朴素贝叶斯可以帮助我们解决这个问题。
- 朴素贝叶斯,简单理解,就是假定了特征与特征之间相互独立的贝叶斯公式。
- 也就是说,朴素贝叶斯,之所以朴素,就在于假定了特征与特征相互独立。
所以,思考题如果按照朴素贝叶斯的思路来解决,就可以是
P(产品, 超重) = P(产品) * P(超重) = 2/7 * 3/7 = 6/49
p(产品, 超重|喜欢) = P(产品|喜欢) * P(超重|喜欢) = 1/2 * 1/4 = 1/8
P(喜欢|产品, 超重) = P(产品, 超重|喜欢)P(喜欢)/P(产品, 超重) = 1/8 * 4/7 / 6/49 = 7/12
那么这个公式如果应用在文章分类的场景当中,我们可以这样看:
公式分为三个部分:
- P©:每个文档类别的概率(某文档类别数/总文档数量)
- P(W│C):给定类别下特征(被预测文档中出现的词)的概率
- 计算方法:P(F1│C)=Ni/N (训练文档中去计算)
- Ni为该F1词在C类别所有文档中出现的次数
- N为所属类别C下的文档所有词出现的次数和
- 计算方法:P(F1│C)=Ni/N (训练文档中去计算)
- P(F1,F2,…) 预测文档中每个词的概率
如果计算两个类别概率比较:
所以我们只要比较前面的大小就可以,得出谁的概率大
2.4.3 文章分类计算
需求:通过前四个训练样本(文章),判断第五篇文章,是否属于China类
- 计算结果
P(C|Chinese, Chinese, Chinese, Tokyo, Japan) -->
P(Chinese, Chinese, Chinese, Tokyo, Japan|C) * P(C) / P(Chinese, Chinese, Chinese, Tokyo, Japan)
=
P(Chinese|C)^3 * P(Tokyo|C) * P(Japan|C) * P(C) / [P(Chinese)^3 * P(Tokyo) * P(Japan)]
# 这个文章是需要计算是不是China类,是或者不是最后的分母值都相同:
# 首先计算是China类的概率:
P(Chinese|C) = 5/8
P(Tokyo|C) = 0/8
P(Japan|C) = 0/8
# 接着计算不是China类的概率:
P(Chinese|C`) = 1/3
P(Tokyo|C`) = 1/3
P(Japan|C`) = 1/3
- 问题:从上面的例子我们得到P(Tokyo|C)和P(Japan|C)都为0,这是不合理的,如果词频列表里面有很多出现次数都为0,很可能计算结果都为0.
-
解决方法:P(F1|C)=\\fracNi+\\alphaN+\\alphamP(F1∣C*)=N+α∗mNi+α
-
α为指定的系数,一般为1;
m为训练文档中统计出的特征词个数
-
# 这个文章是需要计算是不是China类:
首先计算是China类的概率: 0.0003
P(Chinese|C) = 5/8 --> 6/14
P(Tokyo|C) = 0/8 --> 1/14
P(Japan|C) = 0/8 --> 1/14
接着计算不是China类的概率: 0.0001
P(Chinese|C`) = 1/3 -->(经过拉普拉斯平滑系数处理) 2/9
P(Tokyo|C`) = 1/3 --> 2/9
P(Japan|C`) = 1/3 --> 2/9
2.5 小结
- 概率【了解】
- 一件事情发生的可能性
- 联合概率【知道】
- 包含多个条件,且所有条件同时成立的概率
- 条件概率【知道】
- 事件A在另外一个事件B已经发生条件下的发生概率
- 贝叶斯公式【掌握】
3 案例:商品评论情感分析
2.1 api介绍
- sklearn.naive_bayes.MultinomialNB(alpha = 1.0)
- 朴素贝叶斯分类
- alpha:拉普拉斯平滑系数
3.2 商品评论情感分析
3.2.1 步骤分析
- 1)获取数据
- 2)数据基本处理
- 2.1) 取出内容列,对数据进行分析
- 2.2) 判定评判标准
- 2.3) 选择停用词
- 2.4) 把内容处理,转化成标准格式
- 2.5) 统计词的个数
- 2.6)准备训练集和测试集
- 3)模型训练
- 4)模型评估
3.2.2 代码实现
import pandas as pd
import numpy as np
import jieba
import matplotlib.pyplot as plt
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
- 1)获取数据
# 加载数据
data = pd.read_csv("./data/书籍评价.csv", encoding="gbk")
data
- 2)数据基本处理
# 2.1) 取出内容列,对数据进行分析
content = data["内容"]
content.head()
# 2.2) 判定评判标准 -- 1好评;0差评
data.loc[data.loc[:, '评价'] == "好评", "评论标号"] = 1 # 把好评修改为1
data.loc[data.loc[:, '评价'] == '差评', '评论标号'] = 0
# data.head()
good_or_bad = data['评价'].values # 获取数据
print(good_or_bad)
# ['好评' '好评' '好评' '好评' '差评' '差评' '差评' '差评' '差评' '好评' '差评' '差评' '差评']
# 2.3) 选择停用词
# 加载停用词
stopwords=[]
with open('./data/stopwords.txt','r',encoding='utf-8') as f:
lines=f.readlines()
print(lines)
for tmp in lines:
line=tmp.strip()
print(line)
stopwords.append(line)
# stopwords # 查看新产生列表
#对停用词表进行去重
stopwords=list(set(stopwords))#去重 列表形式
print(stopwords)
# 2.4) 把“内容”处理,转化成标准格式
comment_list = []
for tmp in content:
print(tmp)
# 对文本数据进行切割
# cut_all 参数默认为 False,所有使用 cut 方法时默认为精确模式
seg_list = jieba.cut(tmp, cut_all=False)
print(seg_list) # <generator object Tokenizer.cut at 0x0000000007CF7DB0>
seg_str = ','.join(seg_list) # 拼接字符串
print(seg_str)
comment_list.append(seg_str) # 目的是转化成列表形式
# print(comment_list) # 查看comment_list列表。
# 2.5) 统计词的个数
# 进行统计词个数
# 实例化对象
# CountVectorizer 类会将文本中的词语转换为词频矩阵
con = CountVectorizer(stop_words=stopwords)
# 进行词数统计
X = con.fit_transform(comment_list) # 它通过 fit_transform 函数计算各个词语出现的次数
name = con.get_feature_names() # 通过 get_feature_names()可获取词袋中所有文本的关键字
print(X.toarray()) # 通过 toarray()可看到词频矩阵的结果
print(name)
# 2.6)准备训练集和测试集
# 准备训练集 这里将文本前10行当做训练集 后3行当做测试集
x_train = X.toarray()[:10, :]
y_train = good_or_bad[:10]
# 准备测试集
x_text = X.toarray()[10:, :]
y_text = good_or_bad[10:]
- 3)模型训练
# 构建贝叶斯算法分类器
mb = MultinomialNB(alpha=1) # alpha 为可选项,默认 1.0,添加拉普拉修/Lidstone 平滑参数
# 训练数据
mb.fit(x_train, y_train)
# 预测数据
y_predict = mb.predict(x_text)
#预测值与真实值展示
print('预测值:',y_predict)
print('真实值:',y_text)
- 4)模型评估
mb.score(x_text, y_text)
应用说明:百度AI情感倾向分析
3.3 总结
- API:sklearn.naive_bayes.MultinomialNB(alpha = 1.0)
- 朴素贝叶斯分类
- alpha:拉普拉斯平滑系数
- 朴素贝叶斯分类
4 朴素贝叶斯算法总结
4.1 朴素贝叶斯优缺点
- 优点:
- 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率
- 对缺失数据不太敏感,算法也比较简单,常用于文本分类
- 分类准确度高,速度快
- 缺点:
- 由于使用了样本属性独立性的假设,所以如果特征属性有关联时其效果不好
- 需要计算先验概率,而先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳;
4.2 朴素贝叶斯内容汇总
4.2.1 NB的原理
朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。
- 对于给定的待分类项x,通过学习到的模型计算后验概率分布,
- 即:在此项出现的条件下各个目标类别出现的概率,将后验概率最大的类作为x所属的类别。
4.2.2 朴素贝叶斯朴素在哪里?
在计算条件概率分布P(X=x∣Y=c_k)时,NB引入了一个很强的条件独立假设,即,当Y确定时,X的各个特征分量取值之间相互独立。
4.2.3 为什么引入条件独立性假设?
为了避免贝叶斯定理求解时面临的组合爆炸、样本稀疏问题。
假设条件概率分为
4.2.4 在估计条件概率P(X∣Y)时出现概率为0的情况怎么办?
解决这一问题的方法是采用贝叶斯估计。
简单来说,引入λ,
- 当λ=0时,就是普通的极大似然估计;
- 当λ=1时称为拉普拉斯平滑。
4.2.5 为什么属性独立性假设在实际情况中很难成立,但朴素贝叶斯仍能取得较好的效果?
- 人们在使用分类器之前,首先做的第一步(也是最重要的一步)往往是特征选择,这个过程的目的就是为了排除特征之间的共线性、选择相对较为独立的特征;
- 对于分类任务来说,只要各类别的条件概率排序正确,无需精准概率值就可以得出正确分类;
- 如果**属性间依赖对所有类别影响相同,或依赖关系的影响能相互抵消,**则属性条件独立性假设在降低计算复杂度的同时不会对性能产生负面影响。
4.2.6 朴素贝叶斯与LR的区别?
4.2.6.1 简单说明
- 区别一:
- 朴素贝叶斯是生成模型,
- 根据已有样本进行贝叶斯估计学习出先验概率P(Y)和条件概率P(X|Y),
- 进而求出联合分布概率P(XY),
- 最后利用贝叶斯定理求解P(Y|X),
- 而LR是判别模型,
- 根据极大化对数似然函数直接求出条件概率P(Y|X);
- 朴素贝叶斯是生成模型,
- 区别二:
- 朴素贝叶斯是基于很强的条件独立假设(在已知分类Y的条件下,各个特征变量取值是相互独立的),
- 而LR则对此没有要求;
- 区别三:
- 朴素贝叶斯适用于数据集少的情景,
- 而LR适用于大规模数据集。
补充知识点:
从概率框架的角度来理解机器学习;主要有两种策略:
第一种:给定 x, 可通过直接建模 P(c |x) 来预测 c,这样得到的是"判别式模型" (discriminative models);
第二种:也可先对联合概率分布 P(x,c) 建模,然后再由此获得 P(c |x), 这样得到的是"生成式模型" (generative models) ;
显然,前面介绍的逻辑回归、决策树、都可归入判别式模型的范畴,还有后面学到的BP神经网络支持向量机等;
对生成式模型来说,必然需要考虑
4.2.6.2 进一步说明
前者是生成式模型,后者是判别式模型,二者的区别就是生成式模型与判别式模型的区别。
- 首先,Navie Bayes通过已知样本求得先验概率P(Y), 及条件概率P(X|Y), 对于给定的实例,计算联合概率,进而求出后验概率。也就是说,它尝试去找到底这个数据是怎么生成的(产生的),然后再进行分类。哪个类别最有可能产生这个信号,就属于那个类别。
- 优点: 样本容量增加时,收敛更快;隐变量存在时也可适用。
- 缺点:时间长;需要样本多;浪费计算资源
- 相比之下,Logistic回归不关心样本中类别的比例及类别下出现特征的概率,它直接给出预测模型的式子。设每个特征都有一个权重,训练样本数据更新权重w,得出最终表达式。
- 优点:
- 直接预测往往准确率更高;
- 简化问题;
- 可以反应数据的分布情况,类别的差异特征;
- 适用于较多类别的识别。
- 缺点
- 收敛慢;
- 不适用于有隐变量的情况。
- 优点:
机器学习朴素贝叶斯应用实例(代码片段)
朴素贝叶斯概述贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。本章首先介绍贝叶斯分类算法的基础——贝叶斯定理。最后,我们通过实例来讨论贝叶斯分类的中最简单的一种:... 查看详情
机器学习朴素贝叶斯(代码片段)
目录1朴素贝叶斯算法简介2概率基础复习2.1概率定义2.2案例:判断女神对你的喜欢情况2.3联合概率、条件概率与相互独立2.4贝叶斯公式2.4.1公式介绍2.4.2案例计算2.4.3文章分类计算2.5小结3案例:商品评论情感分析2.1api介绍3.... 查看详情
机器学习——朴素贝叶斯(代码片段)
在考虑一个结果的概率时候,要考虑众多的属性,贝叶斯算法利用所有可能的数据来进行修正预测,如果大量的特征产生的影响较小,放在一起,组合的影响较大,适合于朴素贝叶斯分类导入类库1fromsklearn.datasetsimportfetch_20n... 查看详情
机器学习面试题——朴素贝叶斯(代码片段)
机器学习面试题——朴素贝叶斯提示:这些知识点也是大厂笔试经常考的题目,我记得阿里和京东就考!!!想必在互联网大厂就会用这些知识解决实际问题朴素贝叶斯介绍一下朴素贝叶斯优缺点贝叶斯公式... 查看详情
机器学习:贝叶斯分类器——高斯朴素贝叶斯分类器代码实现(代码片段)
一高斯朴素贝叶斯分类器代码实现网上搜索不调用sklearn实现的朴素贝叶斯分类器基本很少,即使有也是结合文本分类的多项式或伯努利类型,因此自己写了一遍能直接封装的高斯类型NB分类器,当然与真正的源码相比少了很多属... 查看详情
机器学习——朴素贝叶斯分类器(代码片段)
贝叶斯分类是一类分类算法的总称,这类算法均已贝叶斯定理为基础,因此统称为贝叶斯分类。在贝叶斯分类器中,常用朴素贝叶斯,就类似于看见黑人,大多会认为来自非洲。事件A在事件B(发生)的条件下的概率,与事件B在... 查看详情
机器学习--实验三(代码片段)
博客班级AHPU机器学习作业要求K-近邻算法及应用作业目标理解K-近邻算法原理,能实现算法K近邻算法学号3180701118目录实验目的】【实验内容】实验报告要求】高斯朴素贝叶斯算法基本思想:python程序:scikit-learn实例朴素贝叶斯算... 查看详情
机器学习:基于朴素贝叶斯实现单词拼写修正器(附python代码)(代码片段)
...2.2语言模型建模2.3误差模型建模3单词修正测试0写在前面机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型:决策树... 查看详情
机器学习实战朴素贝叶斯(代码片段)
朴素贝叶斯朴素贝叶斯概述文本分类准备数据:从文-本中构建词向量-训练算法:从词向量计算概率-贝叶斯分类函数importnumpyasnpimportmatplotlib.pyplotaspltfromnumpyimport*"""function:创建数据集parameters:无returns:postingList-数据集class... 查看详情
机器学习sklearn监督学习分类算法朴素贝叶斯naivebayesianmodel(代码片段)
importnumpyasnpfromsklearn.naive_bayesimportGaussianNBX=np.array([[-1,-1],[-2,-1],[-3,-2],[1,1],[2,1],[3,2]])Y=np.array([1,1,1,2,2,2])#使用默认参数,创建一个高斯朴素贝叶斯分类器,并将该分类器赋给变量clfclf= 查看详情
机器学习sklearn监督学习分类算法朴素贝叶斯naivebayesianmodel(代码片段)
importnumpyasnpfromsklearn.naive_bayesimportGaussianNBX=np.array([[-1,-1],[-2,-1],[-3,-2],[1,1],[2,1],[3,2]])Y=np.array([1,1,1,2,2,2])#使用默认参数,创建一个高斯朴素贝叶斯分类器,并将该分类器赋给变量clfclf= 查看详情
机器学习100天(三十九):039朴素贝叶斯-处理连续数据(代码片段)
《机器学习100天》完整目录:目录机器学习100天,今天讲的是:朴素贝叶斯-处理连续数据!打开spyder,新建一个naive_bayes_gauss.py脚本。首先导入标准库。然后导入数据集,这里我们选择鸢尾花数据集。数据集的下载地址:数据集... 查看详情
机器学习之路--朴素贝叶斯(代码片段)
一,引言 前两章的KNN分类算法和决策树分类算法最终都是预测出实例的确定的分类结果,但是,有时候分类器会产生错误结果;本章要学的朴素贝叶斯分类算法则是给出一个最优的猜测结果,同时给出猜测的概率估计值... 查看详情
《机器学习》贝叶斯定理的运用(代码片段)
Introduction朴素贝叶斯是一种基于贝叶斯定理的分类算法。贝叶斯定理是指对于两个事件A和B,可以表示为P(A|B)=P(B|A)P(A)/P(B)。朴素贝叶斯算法假设所有输入特征之间相互独立,这样可以将多个特征的贡献组合起来,... 查看详情
机器学习——朴素贝叶斯算法
机器学习——朴素贝叶斯算法贝叶斯定理正向概率和逆向概率条件概率与全概率贝叶斯公式推导极大似然估计朴素贝叶斯分类器朴素可能性函数的作用拉普拉斯修正防溢出策略样例解释代码——使用拉普拉斯进行垃圾邮件分类构... 查看详情
机器学习11-分类与监督学习,朴素贝叶斯分类算法(代码片段)
1.理解分类与监督学习、聚类与无监督学习。简述分类与聚类的联系与区别。简述什么是监督学习与无监督学习。分类与聚类的区别:是否有已知分类的条件。分类没有,聚类有。监督学习:已知某些类别的情况下,即具有事先... 查看详情
机器学习sklearn监督学习分类算法朴素贝叶斯naivebayesianmodel(代码片段)
importnumpyasnpfromsklearn.naive_bayesimportGaussianNBX=np.array([[-1,-1],[-2,-1],[-3,-2],[1,1],[2,1],[3,2]])Y=np.array([1,1,1,2,2,2])#使用默认参数,创建一个高斯朴素贝叶斯分类器,并将该分类器赋给变量clfclf=GaussianNB(priors=None)clf.fit(X,Y)p... 查看详情
朴素贝叶斯(naivebayes)(代码片段)
朴素贝叶斯(naivebayes)主要參考资料:《机器学习实战》《统计学习方法》1.朴素贝叶斯分类原理朴素贝叶斯法是基于贝叶斯定理和特征条件独立假设(称为朴素的原因)的分类方法。先看看维基百科中贝叶斯定理的描写叙述:贝叶... 查看详情