系列文章目录
第一章 先验概率和后验概率的通俗解释(贝叶斯分类) 第二章 贝叶斯公式证明及Bayesain在机器学习重要地位的理解 第三章 【机器学习】贝叶斯分类器
文章目录
- 系列文章目录
- 前沿
- 一、贝叶斯决策论
- 二、极大似然估计
- 三、朴素贝叶斯
- 四、拉普拉斯修正
- 五、朴素贝叶斯分类实践
- 总结
前沿
贝叶斯分类器作为“生成式模型”可处理多分类问题,在数据较少的情况下依然有效,本文介绍了算法原理推导及基于算法原理的代码实现与基于sklearn包的代码实现。
一、贝叶斯决策论
贝叶斯决策论是概率框架下实施决策的基本方法,对于分类任务,在所有相关概率都已知的理想情形下,该方法考虑如何基于这些概率和误判损失来选择最优的类别标记。
假设有 N 中可能的类别标记,即 是将一个真实标记为的样本误分类为所产生的损失。基于后验概率可获得将样本分类为所产生的期望损失,即在样本上的“条件风险”
在一次分类过程中我们希望分类结果尽可能接近真实值,即要求总体的期望损失最小,这就产生了贝叶斯判别准则:为最小化总体风险,只需在每个样本上选择那个能使条件风险最小的类别标记,即
此时,称为贝叶斯最优分类器,与之对应的总体风险称为贝叶斯风险。反映了分类器所能达到的最好性能,即通过机器学习所能产生的模型精度的理论上限。其中,贝叶斯风险为
若目标是最小化分类错误率,则误判损失可写为
此时的条件风险于是,最小化分类错误率的贝叶斯最优分类器为 对于分类器的构建关键在于对当前样本后验概率的确定。即对每个样本,选择能使后验概率最大的类别标记。对生成式模型来说,必然考虑联合概率分布:
基于贝叶斯定理,可写为
对给定的样本,证据因子与类标记无关,因此估计的问题就转化为如何基于训练数据来估计先验和类条件(似然)
类先验概率代表了样本空间中各类样本所占的比例,根据大数定律,当训练集包含充足的独立同分布样本时,可通过各类样本出现的频率来进行估计。
对于类条件概率来说,由于它涉及关于所有属性的联合概率,直接根据样本出现的概率来估计将会遇到严重的困难。即分子很多情况下在训练集中根本没有出现,直接使用频率来估计显然不可行,因为“未被观测到”与“出现概率为零”通常不同。
二、极大似然估计
的类条件概率为,假设具有确定的形式并且被参数向量唯一确定,则我们的任务就是利用训练集估计参数.为明确起见,将记为.
令表示训练集中第样本组成的集合,假设这些样本是独立同分布的,则参数对于数据集的似然是
对进行极大似然估计,就是去寻找能最大化似然的参数值直观上看,极大似然估计是试图在所有可能的取值中,找到一个能使数据出现的“可能性”最大的值。
三、朴素贝叶斯
的主要困难在于:类条件概率是所有属性上的联合概率,难以从有限的训练样本直接估计而得。为避开这个障碍,朴素贝叶斯分类器采用了“属性条件独立性假设”:对已知类别,假设所有属性相互独立。换言之,假设每个属性独立地对分类结果产生影响。
基于属性条件独立性假设,后验概率可重写为:
其中为属性数目,为在第个属性上的取值。
由于对所有类别来说相同,因此基于贝叶斯判定准则有
这就是朴素贝叶斯分类器的表达式。
显然,朴素贝叶斯分类器的训练过程就是基于训练集来估计类先验概率,并为每个属性来估计条件概率.
令表示训练集中第类样本组成的集合,若有充足的独立同分布样本,则可容易地估计出类先验概率
对离散属性而言,令表示中在第各属性上取值为的样本组成的集合,则条件概率可估计为
对连续属性可考虑概率密度函数,假定,其中和分别是第类样本在第各属性上取值的均值和方差,则有
四、拉普拉斯修正
时,会出现样本的属性值在训练集中未出现,导致条件概率相乘时最终值为0,为避免其他属性携带的信息被训练集中出现的属性值“抹去”,在估计概率值时通常要进行“平滑”,常用“拉普拉斯修正”,即令表示训练集中可能的类别数,表示第个属性可能的取值数,则其修正为:
五、朴素贝叶斯分类实践
数据集描述:
文件名称:data_bayesian.xlsx
sheet名称及描述:X_test (718,64);X_train (1079,64);y_test(718,1),10种类别;y_train(1079,1),10种类别。
问题描述:结合上述数据,构建贝叶斯分类器,评估模型性能,给出训练精度和测试精度。
基于理论算法的模型搭建
import scipy.stats as st
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
X_test = pd.read_excel("...\data_bayesian.xlsx",sheet_name="X_test",header=None)
X_train = pd.read_excel("...\data_bayesian.xlsx",sheet_name="X_train",header=None)
y_test = pd.read_excel("...\data_bayesian.xlsx",sheet_name="y_test",header=None)
y_train = pd.read_excel("...\data_bayesian.xlsx",sheet_name="y_train",header=None)
# 创建10*64未初始化的矩阵,存储每列不同类型的均值
x_mean = np.empty([10, 64], dtype=float)
# 取出不同类别下的数据 求出求出均值
for i in range(10):
x_mean[i][:] = X_train.loc[(y_train == i).values].mean()
# 创建10*64未初始化的矩阵,存储每列不同类型的方差
x_std = np.empty([10, 64], dtype=float)
# 取出不同类别下的数据 求出求出方差
for j in range(10):
x_std[j][:] = X_train.loc[(y_train == j).values].std()
# 创建10*64*718未初始化矩阵,存储 X_train 单个样本各维度在不同类别下的概率;
## np.empty()
x_pro = np.empty([718, 10, 64], dtype=float)
# 循环所有样本
for m in range(718):
# 循环所有维度
for n in range(64):
# 循环所有类别
for q in range(10):
# 计算当前概率
x_pro[m][q][n] = float(np.exp(-(float(X_test.loc[m,n])-x_mean[q][n])**2/(2*(x_std[q][n]**2)+0.001)/(np.sqrt(2*np.pi)*x_std[q][n]+0.001)))
def get_predict(x_pro):
y_pre = np.empty([x_pro.shape[0],1], dtype= float)
for i in range(x_pro.shape[0]):
y_pre[i] = np.argmax(np.prod(x_pro[i], axis= 1))
return y_pre
def predict_score(y_test, y_pre):
predict_score = (get_predict(x_pro) == y_test.values).sum()/y_test.size
return predict_score
y_pre = get_predict(x_pro)
print(f"朴素贝叶斯模型预测得分:{predict_score(y_test, y_pre)}")
朴素贝叶斯模型预测得分:0.8927576601671309
基于Sklearn包的模型搭建
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score
# 构建朴素贝叶斯分类器(默认高斯分布)
clf = GaussianNB()
clf.fit(X_train, np.hstack(y_train.values))
#计算模型得分
clf.score(X_train, np.hstack(y_train.values))
0.8841519925857275
#计算预测得分
y_pre = clf.predict(X_test)
accuracy_score(y_test, y_pre)
0.8523676880222841
总结
贝叶斯分类器作为“生成式模型”可处理多分类问题,在数据较少的情况下依然有效,但其有几个特别需要注意的点,后续学习研究可往这方面探索。
- 朴素贝叶斯的前提条件是各属性独立同分布,但在现实中很多数据存在关联性;
- 属性不一定符合正态分布,需要对数据的分布进行探索 ;