目录
一、贝叶斯算法
1、简介
贝叶斯算法是一种基于贝叶斯定理的统计学习方法。在机器学习中,贝叶斯算法用于推断模型参数或预测未知数据的概率分布。
贝叶斯定理是概率论中的一个基本定理,用于描述在已知某些条件下,另一事件发生的概率。贝叶斯算法利用该定理在训练阶段根据样本数据和先验知识估计参数的后验分布,然后在预测阶段根据后验分布计算未知数据的概率分布。
贝叶斯算法的基本思想是将概率视为对不确定性的衡量,并通过不断更新先验概率来得到后验概率。
2、贝叶斯算法具有以下特点:
1)能够从少量的样本数据中进行学习,因为贝叶斯算法利用了先验分布的知识;
2)能够处理多模态数据,即对于不同的预测结果,贝叶斯算法可以给出概率分布而不仅仅是一个确定的结果;
3)能够逐步学习和更新模型,因为贝叶斯算法可以通过后续样本数据来更新模型的参数和概率分布。
二、贝叶斯原理
1、正向概率(先验概率)
正向概率指的是在给定模型参数或假设的情况下,计算观测数据的概率。换句话说,正向概率是从模型或假设到观测数据的概率。
例如:
假设袋子里有10个白球,90个黑球,然后从袋子里拿出一个球,拿出的白球的概率是多少?
p(摸出白球)= 10/100 = 1/10
2、逆向概率(后验概率)
逆向概率(也称为后验概率)则是在给定观测数据的情况下,计算模型参数或假设的概率。逆向概率是指从观测数据到模型或假设的概率。
3、公式
即求B的条件下A的概率
1)实例1
已知在所有男子中有5%患色盲,在所有女子中有0.25%患色盲,随机抽取一个人是色盲,其为男子的概率是多大?(男女人数相等)
A:抽到男生 B:抽到女生 C:抽到色盲
p(A|C)= P(C|A) * P(A) / P(C) = 5% * 0.5 / ( 0.5 * 5% + 0.5 * 0.25%) = 95%
2)实例2
贝叶斯如何进行样本数据进行计算实现预测的?
实例:一个包含3个特征(A、B、C)和一个类别标签的简单数据集如下:
• 目标:
使用朴素贝叶斯分类器来预测一个新的样本(特征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=1 | A=1,B=1,C=0)概率
P(D=0 | A=1,B=1,C=0) = P( A=1,B=1,C=0 | D=0) * P(D=0) / P(A=1,B=1,C=0)
= P(A=1| D=0) * P(B=1| D=0) * P(C=0| D=0) * P(D=0) / P(A=1,B=1,C=0)
P(D=1 | A=1,B=1,C=0) = P( A=1,B=1,C=0 | D=1) * P(D=1) / P(A=1,B=1,C=0)
= P(A=1| D=1) * P(B=1| D=1) * P(C=0| D=1) * P(D=1) / P(A=1,B=1,C=0)
有了上述公式,即可计算类别的先验概率:
P(D=0) = 3/6 = 0.5
P(D=1) = 3/6 = 0.5
然后计算每个特征在每个类别下的条件概率:
此时即可计算给定特征值下每个类别的后验概率,得到如下结果:
三、参数讲解
1、用法
class sklearn.native_bayes.MulitnomialNB(alpha=1.0,fit_prior=True,class_prior=None)
MultinaomialNB 表示多项式分布的朴素贝叶斯
2、参数
1)alpha 控制模型合成时的平滑度
alpha是一个浮点数,用于解决在训练数据中出现零概率问题。
作用:平滑是一种防止过拟合的技术,特别是在处理稀疏数据集或者未出现在训练集中的特征时。
影响:alpha值过大会影响模型模型复杂度,过大则导致预测概率减少,可能导致分类器更稳定,但是准确率降低,反之则导致过拟合现象。
2)fit_prior 是否学习类的先验概率
当为True时,模型会根据训练集计算每个类的先验概率,如果训练集的某个类的样本数较少,则可能导致计算出的先验概率非常小,从而导致该类样本在分类时被忽略,影响模型分类效果。(有样本不均衡情况下,少用fit_prior)
3)class_prior 各个类别的先验概率
如果没有指定,则模型会根据数据自动学习
四、代码实现
1、文件内容
一共100条数据,第一列为序号,最后一列为类别
2、完整代码
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
# 导入数据,设置参数header,表示没有标题行
data = pd.read_csv("iris.csv",header=None)
# data = data.drop(0,axis=1)
# 取出除去第一列的所有数据,再赋值给data
data = data.iloc[:,1:]
x = data.iloc[:,:-1] # 取出所有的行,列为除去最后一列的所有特征
y = data.iloc[:,-1] # 取出所有行,以及最后一列的数据
from sklearn.model_selection import train_test_split # 对原始数据进行随机切分,得到测试集和训练集数据
x_train_w,x_test_w,y_train_w,y_test_w = train_test_split(x,y,test_size=0.2,random_state=0)
from sklearn.naive_bayes import MultinomialNB # 导入贝叶斯类
classifier = MultinomialNB(alpha=1) # 建立贝叶斯模型
classifier.fit(x_test_w,y_test_w) # 导入训练集数据对其进行训练
train_predicted = classifier.predict(x_train_w) # 输入测试集进行测试
cm_plot(y_train_w,train_predicted) # 可视化,绘制混淆矩阵
test_predicted = classifier.predict(x_test_w)
cm_plot(y_test_w,test_predicted)
from sklearn import metrics
print(metrics.classification_report(y_train_w, train_predicted)) # 分别打印分类报告
print(metrics.classification_report(y_test_w, test_predicted))