一、朴素贝叶斯算法的介绍
1.什么是朴素贝叶斯算法?
朴素贝叶斯算法(Naive Bayes Algorithm)是一种基于贝叶斯定理和特征独立性假设的概率分类算法。它被广泛应用于文本分类、垃圾邮件过滤、情感分析等任务。
朴素贝叶斯算法的基本思想是基于训练数据中的特征和标签之间的概率关系,通过计算后验概率来进行分类预测。
2.朴素贝叶斯算法的应用场景
朴素贝叶斯算法在许多应用场景中都有广泛的应用,特别适合以下情况:
-
文本分类:朴素贝叶斯算法在文本分类任务中表现出色,例如垃圾邮件过滤、情感分析、新闻分类等。它可以根据文本中出现的词语频率或TF-IDF值进行分类。
-
多类别分类:朴素贝叶斯算法适用于多类别分类问题,可以处理多个离散类别或标签。
-
实时分类:朴素贝叶斯算法具有快速的训练和预测速度,适合实时分类任务,如实时推荐系统、实时广告点击率预测等。
-
高维数据:朴素贝叶斯算法在高维数据集上表现良好,对于特征维度较大的问题,它的计算复杂度较低,能够高效地进行分类。
-
弱相关特征:朴素贝叶斯算法的特征独立性假设使得它对于特征之间的相关性较弱的问题表现良好,当特征之间的相关性较弱或可以近似为独立时,朴素贝叶斯算法能够提供较好的分类效果。
-
数据稀疏性:朴素贝叶斯算法对于数据的稀疏性具有较好的鲁棒性,在训练数据中存在大量缺失值或零值的情况下仍能有效工作。
3.贝叶斯公式和朴素贝叶斯公式
-
贝叶斯公式:
贝叶斯公式(Bayes’ theorem)是概率论中的一个重要公式,用于计算在给定一些观察到的证据的情况下,某个事件的后验概率。贝叶斯公式如下:
P ( A ∣ B ) = ( P ( B ∣ A ) ∗ P ( A ) ) / P ( B ) P(A|B) = (P(B|A) * P(A)) / P(B) P(A∣B)=(P(B∣A)∗P(A))/P(B)
其中,P(A|B) 表示在观察到事件 B 发生的情况下,事件 A 发生的概率;P(B|A) 表示在事件 A 发生的情况下,事件 B 发生的概率;P(A) 表示事件 A 发生的先验概率;P(B) 表示事件 B 发生的先验概率。 -
朴素贝叶斯公式:
朴素贝叶斯公式是在贝叶斯公式的基础上,引入了"朴素"假设,假设特征之间相互独立。根据朴素贝叶斯公式,可以计算在给定一组特征的条件下,某个类别的后验概率。朴素贝叶斯公式如下:
P ( y ∣ x 1 , x 2 , . . . , x n ) = ( P ( x 1 ∣ y ) ∗ P ( x 2 ∣ y ) ∗ . . . ∗ P ( x n ∣ y ) ∗ P ( y ) ) / P ( x 1 , x 2 , . . . , x n ) P(y|x1, x2, ..., xn) = (P(x1|y) * P(x2|y) * ... * P(xn|y) * P(y)) / P(x1, x2, ..., xn) P(y∣x1,x2,...,xn)=(P(x1∣y)∗P(x2∣y)∗...∗P(xn∣y)∗P(y))/P(x1,x2,...,xn)
其中,P(y|x1, x2, …, xn) 表示在给定特征 x1, x2, …, xn 的条件下,类别 y 的后验概率;P(x1|y), P(x2|y), …, P(xn|y) 表示在类别 y 的条件下,特征 x1, x2, …, xn 出现的概率;P(y) 表示类别 y 的先验概率;P(x1, x2, …, xn) 表示特征 x1, x2, …, xn 的联合概率。
4.朴素贝叶斯算法的计算步骤
- 数据预处理:首先对输入数据进行预处理,包括特征选择、特征缩放、处理缺失值等操作。
- 计算类别的先验概率:根据训练数据,计算每个类别出现的先验概率。先验概率可以通过简单地计算每个类别在训练数据中的样本数量与总样本数量的比例得到。
- 计算特征的条件概率:对于每个特征,计算在给定类别下的条件概率。这需要计算每个特征在每个类别下的频率或概率。
- 应用贝叶斯定理:根据贝叶斯定理,利用先验概率和条件概率计算后验概率,即在给定特征条件下每个类别的概率。
- 预测分类结果:对于新的未知样本,根据计算得到的后验概率,选择具有最高概率的类别作为预测结果。
朴素贝叶斯算法中的"朴素"指的是特征之间的独立性假设,即假设每个特征在给定类别下是相互独立的。这个假设简化了计算过程,但在实际应用中可能与实际情况不符。
以上是朴素贝叶斯算法的一般计算步骤,具体实现时可能还会包括平滑处理、处理连续特征、处理离散特征等额外的步骤,以适应具体的问题和数据。
5.朴素贝叶斯算法的优缺点
优点:
- 算法简单高效:朴素贝叶斯算法的计算速度较快,适用于处理大规模数据集。
- 对小规模数据表现良好:即使在小样本情况下,朴素贝叶斯算法仍然能够提供合理的分类结果。
- 可解释性强:朴素贝叶斯算法基于简单的概率模型,分类过程可解释性强,能够提供关于特征对分类结果的影响程度的信息。
- 处理多类别问题:朴素贝叶斯算法能够处理多类别分类问题,且在类别数量较多的情况下也能保持较好的性能。
- 对缺失数据鲁棒性强:朴素贝叶斯算法对于缺失数据具有较好的鲁棒性,在训练数据中存在缺失值或零值的情况下仍能有效工作。
缺点:
- 特征独立性假设限制:朴素贝叶斯算法假设各个特征之间相互独立,但在实际应用中,很多特征之间存在相关性,这种假设可能不符合实际情况,导致分类性能下降。
- 对输入数据的分布假设:朴素贝叶斯算法通常假设输入数据符合特定的分布,如高斯分布,如果数据的分布与该假设不符,则可能导致分类结果不准确。
- 对数量较大的特征空间表现不佳:当特征空间较大时,朴素贝叶斯算法需要估计大量的参数,可能会导致参数估计不准确,影响分类结果。
- 类别之间的类别概率估计不准确:当某个类别在训练集中没有样本出现时,朴素贝叶斯算法会给出概率为零的预测结果,这可能导致误分类。
6.朴素贝叶斯算法和逻辑回归算法的区别
朴素贝叶斯算法和逻辑回归算法是两种常见的分类算法,它们在一些方面有一些区别:
- 假设不同:朴素贝叶斯算法基于朴素贝叶斯公式,假设特征之间相互独立,而逻辑回归算法没有明确的假设。逻辑回归通过学习权重参数来建立特征与目标变量之间的关系。
- 模型类型:朴素贝叶斯算法是生成模型,它通过学习类别的先验概率和特征的条件概率来建模,从而得到每个类别的后验概率。逻辑回归算法是判别模型,它直接建立特征与目标变量之间的条件概率,通过将输入特征映射到一个概率空间进行分类。
- 数据假设:朴素贝叶斯算法假设特征之间相互独立,这在处理文本分类等问题时可能不符合实际情况。逻辑回归算法没有这个假设,可以更灵活地处理特征之间的相关性。
- 参数估计:朴素贝叶斯算法通过计算先验概率和条件概率来估计模型参数,可以直接使用最大似然估计或贝叶斯估计等方法。逻辑回归算法通过最大似然估计或梯度下降等方法来估计模型参数。
- 处理连续特征:朴素贝叶斯算法可以处理连续特征,常用的方法有高斯朴素贝叶斯、多项式朴素贝叶斯等。逻辑回归算法也可以处理连续特征,但需要进行适当的特征缩放或转换。
总体而言,朴素贝叶斯算法在处理大规模文本分类等问题时具有较好的效果,而逻辑回归算法更适用于建模特征与目标变量之间的直接关系,并且对特征相关性的建模更加灵活。
二、朴素贝叶斯的计算案例
1.案例一
联合概率、条件概率与相互独立
- 联合概率:包含多个条件,且所有条件同时成立的概率
- 记作:P(A,B)
- 条件概率(用贝叶斯公式计算):就是事件A在另外一个事件B已经发生条件下的发生概率
- 记作:P(A|B)
- 相互独立:如果P(A,B) = P(A)*P(B),则称事件A与事件B相互独立
先计算几个简单的概率:
-
女神喜欢的概率:
P(喜欢)=4/7
-
职业是程序员并且体型匀称的概率
P(程序员,匀称) = 1/7
-
在女神喜欢的条件下,职业是程序员的概率
P(程序员|喜欢) = 2/4 = 1/2
-
在女神喜欢的条件下,职业是程序员、体重超重的概率
P((程序员,超重)|喜欢) = 1/4
下面计算:在小明是产品经理并且体重超重的情况下,如何计算小明被女神喜欢的概率?
-
贝叶斯公式计算:
P(喜欢|(产品,超重)) = {P((产品,超重)|喜欢) * P(喜欢)}/P(产品,超重)
上式中,
- P((产品,超重)|喜欢) 和P(产品,超重) 都是0,导致无法计算结果。这是因为样本量太少了,不具有代表性。
- 但在现实中,肯定存在职业是产品经理并且体重超重的人,所以P(产品,超重)不可能为0。
-
这时候,就需要引入朴素贝叶斯公式来进行计算
-
朴素贝叶斯,就是假定特征与特征之间相互独立,即职业与体型两个特征相互独立。
-
则按照朴素贝叶斯公式计算如下:
则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
-
由上述朴素贝叶斯公式计算可得,在小明是产品经理并且体重超重的情况下,小明被女神喜欢的概率为7/12。
2.案例二(文本分类计算)
通过前四个训练样本,判断第五个样本,属于China类的概率
-
计算过程
P ( Y e s ∣ ( C h i n e s e , C h i n e s e , C h i n e s e , T o k y o , J a p a n ) ) = [ P ( ( C h i n e s e , C h i n e s e , C h i n e s e , T o k y o , J a p a n ) ∣ Y e s ) ∗ P ( Y e s ) ] / P ( C h i n e s e , C h i n e s e , C h i n e s e , T o k y o , J a p a n ) = [ P ( C h i n e s e ∣ Y e s ) 3 ∗ P ( T o k y o ∣ Y e s ) ∗ P ( J a p a n ∣ Y e s ) ] ∗ P ( Y e s ) / [ P ( C h i n e s e ) 3 ∗ P ( T o k y o ) ∗ P ( J a p a n ) ] P(Yes|(Chinese,Chinese,Chinese,Tokyo,Japan)) = [P((Chinese,Chinese,Chinese,Tokyo,Japan)|Yes) * P(Yes)]/P(Chinese,Chinese,Chinese,Tokyo,Japan) = [P(Chinese|Yes)^3*P(Tokyo|Yes)*P(Japan|Yes)]*P(Yes)/[P(Chinese)^3*P(Tokyo)*P(Japan)] P(Yes∣(Chinese,Chinese,Chinese,Tokyo,Japan))=[P((Chinese,Chinese,Chinese,Tokyo,Japan)∣Yes)∗P(Yes)]/P(Chinese,Chinese,Chinese,Tokyo,Japan)=[P(Chinese∣Yes)3∗P(Tokyo∣Yes)∗P(Japan∣Yes)]∗P(Yes)/[P(Chinese)3∗P(Tokyo)∗P(Japan)]
而# 属于China类总共有8个词,其中Chinese占5个 P(Chinese|Yes)=5/8 # 属于China类总共有8个词,其中Tokyo占0个 P(Tokyo|Yes)=0/8 # 属于China类总共有8个词,其中Japan占0个 P(Japan|Yes)=0/8
从上面例子可以得到 P(Tokyo|Yes) 和 P(Japan|Yes) 都为0,这是不合理的,如果词频列表中有很多出现次数都是0,很可能计算结果都为0。
-
解决方法:引入拉普拉斯平滑系数
-
拉普拉斯公式:
P ( x ) = ( c o u n t ( x ) + λ ) / ( N + λ ∗ V ) P(x) = (count(x) + λ) / (N + λ * V) P(x)=(count(x)+λ)/(N+λ∗V)
其中:- count(x) 是事件x出现的次数(观察到的频数);
- N 是总的事件数(总的样本数或观察数);
- V 是事件的可能取值的总数(唯一的事件数量);
- λ 是拉普拉斯平滑系数,一般取1。
-
经过平滑处理后的值:文章来源:https://www.toymoban.com/news/detail-467707.html
# 这里count(x)=5,N=8,λ=1。V指的是"文档中的词"这一特征总共有几种值(6种值:Chinese、Beijing、Shanghai、Macao、Tokyo、Japan) # 则经过平滑处理后的值如下 P(Chinese|Yes)=5/8=(5+1)/(8+6)=6/14=3/7 P(Tokyo|Yes)=0/8=(0+1)/(8+6)=1/14 P(Japan|Yes)=0/8=(0+1)/(8+6)=1/14 # 然后再代入公式计算最终结果即可
-
三、朴素贝叶斯的代码实现案例
1.API介绍
- sklearn.naive_bayes.MultinomialNB(alpha=1.0)
- 朴素贝叶斯分类算法
- alpha:拉普拉斯平滑系数
2.案例:商品评论分析
文章来源地址https://www.toymoban.com/news/detail-467707.html
2.1步骤分析
- 获取数据
- 数据基本处理
- 取出内容列,对数据进行分析
- 判定评判标准
- 选择停用词
- 把内容处理,转换成标准格式
- 统计词的个数
- 准备训练集和测试集
- 模型训练
- 模型评估
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")
# 2.数据基本处理
# 2.1 取出内容列,对数据进行分析
content = data["内容"]
# 2.2 判定评判标准
data.loc[:,"评价"]
# 添加一列“评价标号”,值为1代表这一评论是好评
data.loc[data.loc[:,"评价"]=="好评","评价标号"]=1
# 添加一列“评价标号”,值为0代表这一评论是差评
data.loc[data.loc[:,"评价"]=="差评","评价标号"]=0
# 2.3 选择停用词
stopwords=[]
with open("./data/stopwords.txt",mode="r",encoding="utf-8") as f:
lines = f.readlines()
for tmp in lines:
line = tmp.strip()
stopwords.append(line)
# 对停用词进行去重
stopwords = list(set(stopwords))
# 2.4 把内容处理,转换成标准格式
comment_list = []
for tmp in content:
# 把一句句话分割成一个个词:需要用jieba
seg_list = jieba.cut(tmp,cut_all=False)
seg_str = ",".join(seg_list)
comment_list.append(seg_str)
# 2.5 统计词的个数
con = CountVectorizer(stop_words=stopwords)
X = con.fit_transform(comment_list)
# 2.6 准备训练集和测试集
# 取前十行作为训练集
x_train = X.toarray()[:10,:]
y_train = data["评价"][:10]
# 取第十行以后的作为训练集
x_test = X.toarray()[10:,:]
y_test = data["评价"][10:]
# 3.模型训练,朴素贝叶斯算法,拉普拉斯系数为1
estimator = MultinomialNB(alpha=1)
estimator.fit(x_train,y_train)
y_pre = estimator.predict(x_test)
print("预测值为:\n",y_pre)
print("真实值为:\n",y_test)
# 4.模型评估
estimator.score(x_test,y_test)
到了这里,关于朴素贝叶斯算法的介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!