目录
4.1 朴素贝叶斯的简介
朴素贝叶斯是一种基于贝叶斯定理与特征条件独立假设的分类算法(其中比贝叶斯多出来的“朴素”就是指各个特征条件独立),其核心思想是通过考虑各个特征的概率来预测分类(即对于给出的待分类样本,计算该样本在每个类别下出现的概率,最大的就被认为是该分类样本所属于的类别
4.1.1 朴素贝叶斯的一般流程
1. 收集数据:可以使用任何方法收集数据,其中这些数据通常被分成训练集和测试集
(训练集用于创建模型,测试集用于评估模型的性能)
2. 准备数据:需要数值型或者布尔型数据
3. 分析数据:对准备好的数据进行分析,确保数据的准确性和完整性
4. 训练模型:计算不同的独立特征的条件概率
5. 测试算法:计算错误率
6. 使用算法:常见的朴素贝叶斯应用是文档分类
4.1.2 朴素贝叶斯的优缺点
优点:
1. 具有稳定的分类效率
2. 在数据较少时仍然有效,可以处理多类别的问题
3. 对缺失数据不太敏感
4. 进行分类时对时间和空间的开销都比较小
缺点:
1. 对于输入数据的准备方式比较敏感,需要对数据进行适当的预处理
2. 需要假设属性之间相互独立,这在实际情况中往往不太现实
3. 需要知道先验概率,但是由于先验概率大多取决于假设,故很容易因此导致预测效果不佳
4.1.3 朴素贝叶斯的应用场合
朴素贝叶斯主要被广泛地应用在文本分类、垃圾邮件过滤、情感分析等场合
4.2 贝叶斯公式
主要思想:
通过已知的先验概率和新的证据(条件概率)来求解后验概率
(其中可将A看成类别,B看成属性 )
【注】
𝑃(𝐴𝐵):表示事件A和事件B同时发生的概率,即联合概率
𝑃(𝐴|𝐵):表示在已知事件B发生的情况下,事件A发生的后验概率 (A的概率更新)
𝑃(𝐵|𝐴):表示在事件A发生的情况下,事件B的条件概率
𝑃(𝐴):事件A的边缘概率,此处也称为先验概率 (此时不考虑B)
𝑃(𝐵):事件B发生的边缘概率
公式所涉及的几个概率:
先验概率:根据以往的经验和分析得出的,对某个事件发生概率的初始假设估计
条件概率:指在某个事件A已经发生的条件下,另一个事件B发生的概率
后验概率:指在考虑了新的证据或数据之后,我们对某个事件发生的概率的更新估计
边缘概率:指不考虑其他事件的情况下,某个事件发生的概率
联合概率:指两个或多个事件同时发生的概率
4.3 实例:判断西瓜好坏
相关数据集如下图所示:
现在我们需要对下图的测试例进行判断看为好瓜还是坏瓜:
求解步骤如下:
由数据集可知:总共有17个样例,其中好瓜有8个,坏瓜有9个
所以得:
(1)
(2)估算先验概率:
(3)再计算每个属性的条件概率:
(4)
4.4 实例(python实现)
问题:
根据五个属性(果肉质地,橘子皮厚度,橘子皮颜色,橘子皮质地,橘子大小)判断橘子是否甜
数据集如下图:
过程思路:
首先将数据集转换一下,如下图所示:
【注】其中:
柔软多汁 1 紧实干燥0
薄 1 厚 0
黄 1 青 0
光滑 1 粗糙 0
小 1 中 0 大 2
是 1 否 0
(1)收集数据:使用pd.read_csv()
函数从"orange_data.csv"文件中读取数据,并将数据存储在data中
(2)准备数据:将字符串类型的数据转换为数值类型
(3)分析数据
(4)训练模型:
(5)测试算法:定义测试样本,然后使用predict方法得到预测结果,使用predict_proba方法得到预测概率
(6)使用算法:输出预测结果和概率,以及计算每个属性的标准差
完整的代码:
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.preprocessing import LabelEncoder
# 读取数据
data = pd.read_csv('orange_data.csv')
# 将字符串类型的数据转换为数值类型
le = LabelEncoder()
data['果肉质地'] = le.fit_transform(data['果肉质地'])
data['橘子皮厚度'] = le.fit_transform(data['橘子皮厚度'])
data['橘子皮颜色'] = le.fit_transform(data['橘子皮颜色'])
data['橘子皮质地'] = le.fit_transform(data['橘子皮质地'])
data['橘子大小'] = le.fit_transform(data['橘子大小'])
data['甜度'] = le.fit_transform(data['甜度'])
# 划分训练集和测试集
X = data[['果肉质地', '橘子皮厚度', '橘子皮颜色', '橘子皮质地', '橘子大小']]
y = data['甜度']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 训练朴素贝叶斯分类器
gnb = MultinomialNB()
gnb.fit(X_train, y_train)
# 测试样本
test_sample = pd.DataFrame({'果肉质地': [1],
'橘子皮厚度': [1],
'橘子皮颜色': [1],
'橘子皮质地': [1],
'橘子大小': [1]})
# 预测测试样本的甜度和概率
y_pred, y_pred_proba = gnb.predict(test_sample), gnb.predict_proba(test_sample)
# 输出预测结果和概率
print("测试样本预测结果:", y_pred)
print("测试样本预测概率:", y_pred_proba)
# 计算每个属性的概率
attribute_proba = gnb.feature_log_prob_
# 将负数概率转换为正数概率
attribute_proba_positive = np.exp(attribute_proba)
print("每个属性的概率(正数):", attribute_proba_positive)
结果展示:
结果分析:
(使用的是多项式朴素贝叶斯分类器(MultinomialNB)
a. 预测结果是[1],表示该测试样本被判别为”甜“
b. 预测概率是[[0.14351227 0.85648773]],这表明模型预测该样本属于类别1的概率为0.85648773,属于类别0的概率为0.14351227。由于类别1的概率更高,因此模型选择了类别1作为预测结果。
c. 对应于类别1的属性概率
[0.05263158 0.05263158 0.26315789 0.21052632 0.42105263]
d. 对应于类别0的属性概率
[0.23809524 0.23809524 0.16666667 0.16666667 0.19047619]
其他不同模型与其对比:
(1)高斯朴素贝叶斯分类器(GaussianNB)
(使用该分类器时,发现不能直接给出属性的概率信息,故转换成求其属性的标准差来估计概率)
(2)伯努利朴素贝叶斯分类器(BernoulliNB)
4.5 【补充】适用于朴素贝叶斯的几种分类器
(1)多项式朴素贝叶斯分类器(MultinomialNB)
· 假设特征服从多项式分布,即每个特征的取值为非负整数
· 通过计算每个类别下特征的频次来估计条件概率
· 适合处理特征为离散型变量的情况,例如文本分类任务
· 计算过程:
a. 计算每个属性的先验概率
b. 计算每个属性在每个类别下的条件概率 (其中A是属性,B是类别)
b. 根据贝叶斯定理计算后验概率
(2)高斯朴素贝叶斯分类器(GaussianNB)
· 假设特征服从高斯分布(正态分布),即每个特征的取值都符合正态分布
· 通过计算每个类别下特征的均值和标准差来估计条件概率
· 适合处理特征为连续型的数据,例如身高、体重等
· 计算过程:
a. 计算每个属性在每个类别下的高斯分布参数:均值(μ)和方差(σ²)
b. 计算每个属性的先验概率
c. 计算每个属性在每个类别下的条件概率
d. 根据贝叶斯定理计算后验概率
e. 对于每个属性值,使用高斯概率密度函数计算其在给定类别下的概率
(注):
: 这表示变量 x在给定均值 μ和方差 σ^2的条件下的概率密度函数值
: 这是归一化因子,确保概率密度函数在整个定义域上的积分为1,即所有可能取值的 x 的概率总和为1,2π是正态分布的形状参数,而σ是尺度参数,反映了分布的宽度
exp: 指数函数,其公式为,其中e^x是自然对数的底数,约等于2.71828
: 这是指数函数的指数部分,它决定了概率密度在均值附近如何快速下降。(x−μ) 表示随机变量 x 与其均值 μ 的差值,平方后除以两倍的方差 σ^2,这样当x=μ 时,指数部分为0,概率密度达到最大值;当 x 远离 μ 时,指数部分变得非常小,导致概率密度迅速减小。
(3)伯努利朴素贝叶斯分类器(BernoulliNB)
· 假设属性服从二项分布,即每个属性的取值为0或1
· 通过计算每个类别下属性为1的概率来估计条件概率
· 适合处理特征为二元特征的分类问题
· 计算过程:
a. 将输入数据转换为二元特征向量
b. 计算每个属性的先验概率
c. 计算每个属性在每个类别下的条件概率
d. 根据贝叶斯定理计算后验概率
4.6 总结
借此机会,我更加深入的学习到了朴素贝叶斯的相关知识,了解到了相关的计算方式,算法以及适用的几种模型,同时我也更加了解到了前面提到的关于朴素贝叶斯的其中一个缺点:对于输入数据的准备方式比较敏感,需要对数据进行适当的预处理。一开始看到这时,并没有太深入去思考,后面做实验进行代码实现时发现这一点格外重要,一定要对实验数据进行预处理,不然很容易出错。总而言之,很感谢本次实验,让我在一定程度上得到了更进一步的提升,对于机器学习后续的学习有很大的帮助。