贝叶斯算法的定义
贝叶斯算法是基于贝叶斯定理的概率统计方法,用于在已知某些条件下更新事件的概率。其核心思想是通过先验概率和新的观测数据计算后验概率,从而进行预测或分类。
贝叶斯定理

贝叶斯定理是用来解决逆概率问题
那什么又是正概率什么是逆概率呢?
正向概率:
假设袋子里有10个白球,90个黑球,然后从袋子里面拿出1个球,拿出的球是白球的概率是多少?
显然,白球的概率是1/10
逆向概率:
如果我们事先并不知道袋子里白球、黑球的比例,然后通过多次试验,根据拿出来的球的颜色推测袋子里白球、黑球的比例
推导贝叶斯
在一个学校里面,男生占60%,女生占40%;
男生:100%穿长裤,女生:50%穿长裤,50%穿裙子;
此时迎面走来一个穿长裤的学生,刚好你是高度近视,
那么要判断一下这个穿长裤的学生是女生的概率该怎么计算?
实质:
穿长裤的是女生的概率=女生中穿长裤的人数/穿长裤的总人数
假设:
全校人数(U):1000人。
男生中穿长裤的人数:
U×P(男生)×P(穿长裤|男生) = 1000×60%×100%=600(人)
女生中穿长裤的人数:
U×P(女生)×P(穿长裤|女生) = 1000×40%×50%=200(人)
穿长裤且是女生的概率:
200/(200+600) = 25%
实质:
穿长裤的是女生的概率=女生中穿长裤的人数/穿长裤的总人数
定义:
A---男生 B---女生 C---穿长裤
那么:
P(B|C)=[U×P(B)×P(C|B)] / [U×P(A)×P(C|A) + U×P(B)×P(C|B)]
=[P(B) × P(C|B)] / P(C)
=(40% × 50%) / (60% + 40%×50%)
=25%
P(B|C)=[P(B) × P(C|B)] / P(C)
贝叶斯如何将样本数据进行计算实现预测的?
例如:一个包含3个特征(A、B和C)和一个类别标签(D)的简单数据集:
|-------------|-------------|-------------|-------------|
| 特征A | 特征B | 特征C | 类别D |
| 1 | 0 | 1 | 0 |
| 0 | 1 | 1 | 1 |
| 0 | 1 | 0 | 0 |
| 1 | 0 | 0 | 1 |
| 1 | 0 | 0 | 0 |
| 0 | 1 | 1 | 1 |
目标是:使用朴素贝叶斯分类器来预测一个新的样本(特征A=1,特征B=1,特征C=0)的类别?。 特征 A= 0 ,特征B= 0, 特征C= 1 属于?
核心:把输入当作条件,结果为0的概率是多大?结果为1的概率是多大?
P(D=0|A=1, B=1, C=0) = P(D=0) * P(A=1|D=0) * P(B=1|D=0) * P(C=0|D=0) /P(A=1, B=1, C=0)
P(D=1|A=1, B=1, C=0) = P(D=1) * P(A=1|D=1) * P(B=1|D=1) * P(C=0|D=1) /P(A=1, B=1, C=0)
首先,我们计算类别的先验概率:
P(D=0) = 3/6 = 0.5
P(D=1) = 3/6 = 0.5
然后,我们计算每个特征在每个类别下的条件概率:
P(A=1|D=0) = 2/3 = 0.667
P(A=0|D=0) = 1/3 = 0.333
P(B=1|D=0) = 1/3 = 0.333
P(B=0|D=0) = 2/3 = 0.667
P(C=1|D=0) = 2/3 = 0.667
P(C=0|D=0) = 2/3 = 0.667
P(A=1|D=1) = 1/3 = 0.333
P(A=0|D=1) = 2/3 = 0.667
P(B=1|D=1) = 2/3 = 0.667
P(B=0|D=1) = 1/3 = 0.333
P(C=1|D=1) = 2/3 = 0.667
P(C=0|D=1) = 1/3 = 0.333
现在,我们使用朴素贝叶斯分类器来计算给定特征值下每个类别的后验概率:
P(D=0|A=1, B=1, C=0) = P(D=0) * P(A=1|D=0) * P(B=1|D=0) * P(C=0|D=0) = 0.5 * 0.667 * 0.333 * 0.667 = 0.08335583549429845
P(D=1|A=1, B=1, C=0) = P(D=1) * P(A=1|D=1) * P(B=1|D=1) * P(C=0|D=1) = 0.5 * 0.333 * 0.667 * 0.333 = 0.037499999999999996
根据后验概率,我们选择后验概率较大的类别作为预测结果,因此预测该样本的类别为D=0。
贝叶斯是用于分类还是回归?
贝叶斯方法既可以用于分类问题,也可以用于回归问题,具体取决于模型的设计和目标。以下是两类问题的典型应用场景:
分类问题
贝叶斯分类器是监督学习中的常见方法,通过计算后验概率将样本分配到最可能的类别。典型的模型包括:
- 朴素贝叶斯分类器:假设特征之间条件独立,适用于文本分类(如垃圾邮件识别)和高维数据。
- 贝叶斯网络:通过有向无环图表示变量间的依赖关系,可用于复杂分类任务(如医疗诊断)。
回归问题
贝叶斯回归通过概率分布描述参数的不确定性,输出连续值。常见模型包括:
- 贝叶斯线性回归:假设参数服从先验分布(如高斯分布),通过数据更新后验分布。
- 高斯过程回归:一种非参数贝叶斯方法,直接对函数空间建模。
贝叶斯API介绍
贝叶斯分类器的代码使用: 朴素贝叶斯算法,中文处理
class sklearn.naive_bayes.MultinomialNB (alpha=1.0 , fit_prior=True , class_prior=None )
参数:
1. MultinomialNB: 多项式分布的朴素贝叶斯。
2. alpha: 控制模型拟合时的平滑度.
定义:alpha是一个浮点数,表示添加剂(拉普拉斯/Lidstone)平滑参数。它控制了模型估计概率中的平滑程度。
作用:平滑是一种防止过拟合的技术,特别是在处理稀疏数据集或未出现在训练集中的特征时。当alpha设置为0时,表示不进行平滑;alpha设置为1时,称为Laplace平滑;当0<alpha<1时,称为Lidstone平滑。
影响:alpha值的大小会影响模型的复杂度。如果alpha值过大,模型估计出来的概率会减少,可能导致分类器更加稳定但准确率降低;反之,如果alpha值被设置的过低,会导致准确率提升,但可能会引起模型的过拟合问题。
3. fit_prior: 是否去学习类的先验概率。当fit_prior设置为True时,模型会根据训练数据集计算出每个类的先验概率。如果训练数据集中某个类的样本数量较少,计算出的先验概率可能非常小,这可能导致该类样本在分类时被忽略,从而影响模型的分类效果。
使用建议:在有样本不均衡的情况下,建议谨慎使用fit_prior参数,以避免分类效果变差。
4. class_prior: 各个类别的先验概率,如果没有指定,则模型会根据数据自动学习, 每个类别的先验概率相同,等于类标记总个数N分之一。
作用:通过手动设置类的先验概率,可以调整模型对于不同类别的偏好。这在处理不平衡数据集时特别有用,可以通过提高少数类的先验概率来改进分类效果。
注意事项:如果使用class_prior参数,那么这些指定的先验概率将不会被模型根据数据进行调整。因此,在使用时需要确保提供的先验概率是准确和合理的。
属性:
1.class_log_prior_: 每个类别平滑后的先验概率
2.intercept_: 是朴素贝叶斯对应的线性模型,其值和class_log_prior_相同
3.feature_log_prob_: 给定特征类别的对数概率(条件概率)。 特征的条件概率=(指定类下指定特征出现的次数+alpha)/(指定类下所有特征出现次数之和+类的可能取值个数*alpha)
4.coef_: 是朴素贝叶斯对应的线性模型,其值和feature_log_prob相同
5.class_count_: 训练样本中各类别*-对应的样本数
6.feature_count_: 每个类别中各个特征出现的次数
贝叶斯算法的优缺点
优点
理论基础坚实:贝叶斯算法基于贝叶斯定理,它为概率模型的学习和推理提供了明确的理论框架。
易于实现:贝叶斯算法的逻辑简单,只要使用贝叶斯公式转化即可,因此易于实现。
分类过程中时空开销小:贝叶斯算法假设特征之间相互独立,因此在分类过程中,只会涉及到二维存储,大大降低了时空开销。
易于并行化:贝叶斯算法可以很方便地进行并行化处理,提高计算效率。
缺点
假设前提:贝叶斯算法假设样本特征彼此独立,这个假设在实际应用中往往是不成立的,尤其在属性个数比较多或者属性之间相关性较大时,分类效果不好。
对噪声敏感:如果数据中存在大量噪声,贝叶斯算法可能会表现不佳。
模型选择:贝叶斯算法需要对模型进行正确的选择,如果模型选择不当,可能会导致算法性能下降。
高维特征空间的应用限制:贝叶斯算法在处理高维特征空间时可能会遇到困难,因为高维空间中的数据通常具有稀疏性,这会导致贝叶斯网络的学习和推理变得非常困难。
案例
python
import pandas as pd
#可视化混淆矩阵
def cm_plot(y,yp):
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
cm = confusion_matrix(y, yp)
plt.matshow(cm, cmap=plt.cm.Blues)
plt.colorbar()
for x in range(len(cm)):
for y in range(len(cm)):
plt.annotate(cm[x,y],xy=(y,x),horizontalalignment='center',
verticalalignment='center')
plt.ylabel('True label')
plt.xlabel('Predicted label')
return plt
"""
数据预处理
"""
data = pd.read_csv(r"C:\Users\LEGION\AppData\Local\Temp\6307f0d2-c3fb-4289-acef-bd0c45a9640f_机器学习课件.zip.40f\6、贝叶斯\iris.csv",header=None)#header=None代表读取的csv文件是没有表头
data = data.drop(0, axis=1)#把第1列删除,
#对原始数据集进行切分,
X_whole = data.drop(5, axis=1)#
y_whole = data[5]#
"""切分数据集"""
from sklearn.model_selection import train_test_split
x_train_w, x_test_w, y_train_w, y_test_w = \
train_test_split(X_whole, y_whole, test_size = 0.2, random_state = 0)
from sklearn.naive_bayes import MultinomialNB#导入朴素贝叶斯分类器
#实例化贝叶斯分类器 分类, 中文识别分类。
classifier = MultinomialNB(alpha=1)
classifier.fit(x_train_w, y_train_w)#传入训练集数据
"""训练集预测"""
#绘制训练集混淆矩阵
train_pred = classifier.predict(x_train_w)#自测
cm_plot(y_train_w, train_pred).show()
"""测试集预测"""
test_pred = classifier.predict(x_test_w)
cm_plot(y_test_w, test_pred).show()
结果如下图:

