系列文章目录

第一章 先验概率和后验概率的通俗解释(贝叶斯分类) 第二章 贝叶斯公式证明及Bayesain在机器学习重要地位的理解 第三章 【机器学习】贝叶斯分类器



文章目录

  • 系列文章目录
  • 前沿
  • 一、贝叶斯决策论
  • 二、极大似然估计
  • 三、朴素贝叶斯
  • 四、拉普拉斯修正
  • 五、朴素贝叶斯分类实践
  • 总结



前沿

  贝叶斯分类器作为“生成式模型”可处理多分类问题,在数据较少的情况下依然有效,本文介绍了算法原理推导及基于算法原理的代码实现与基于sklearn包的代码实现。

一、贝叶斯决策论

  贝叶斯决策论是概率框架下实施决策的基本方法,对于分类任务,在所有相关概率都已知的理想情形下,该方法考虑如何基于这些概率和误判损失来选择最优的类别标记。
  假设有 N 中可能的类别标记,即 贝叶斯分类器iris数据集分类 贝叶斯分类器实现_sklearn是将一个真实标记为贝叶斯分类器iris数据集分类 贝叶斯分类器实现_算法_02的样本误分类为贝叶斯分类器iris数据集分类 贝叶斯分类器实现_机器学习_03所产生的损失。基于后验概率贝叶斯分类器iris数据集分类 贝叶斯分类器实现_贝叶斯分类器iris数据集分类_04可获得将样本贝叶斯分类器iris数据集分类 贝叶斯分类器实现_算法_05分类为贝叶斯分类器iris数据集分类 贝叶斯分类器实现_机器学习_03所产生的期望损失,即在样本贝叶斯分类器iris数据集分类 贝叶斯分类器实现_算法_05上的“条件风险”
贝叶斯分类器iris数据集分类 贝叶斯分类器实现_ci_08  在一次分类过程中我们希望分类结果尽可能接近真实值,即要求总体的期望损失最小,这就产生了贝叶斯判别准则:为最小化总体风险,只需在每个样本上选择那个能使条件风险贝叶斯分类器iris数据集分类 贝叶斯分类器实现_机器学习_09最小的类别标记,即
贝叶斯分类器iris数据集分类 贝叶斯分类器实现_机器学习_10  此时,贝叶斯分类器iris数据集分类 贝叶斯分类器实现_ci_11称为贝叶斯最优分类器,与之对应的总体风险贝叶斯分类器iris数据集分类 贝叶斯分类器实现_机器学习_12称为贝叶斯风险。贝叶斯分类器iris数据集分类 贝叶斯分类器实现_sklearn_13反映了分类器所能达到的最好性能,即通过机器学习所能产生的模型精度的理论上限。其中,贝叶斯风险贝叶斯分类器iris数据集分类 贝叶斯分类器实现_算法_14
贝叶斯分类器iris数据集分类 贝叶斯分类器实现_贝叶斯分类器iris数据集分类_15若目标是最小化分类错误率,则误判损失贝叶斯分类器iris数据集分类 贝叶斯分类器实现_sklearn_16可写为
贝叶斯分类器iris数据集分类 贝叶斯分类器实现_贝叶斯分类器iris数据集分类_17此时的条件风险贝叶斯分类器iris数据集分类 贝叶斯分类器实现_sklearn_18于是,最小化分类错误率的贝叶斯最优分类器为贝叶斯分类器iris数据集分类 贝叶斯分类器实现_sklearn_19  对于分类器的构建关键在于对当前样本后验概率的确定。即对每个样本贝叶斯分类器iris数据集分类 贝叶斯分类器实现_算法_05,选择能使后验概率贝叶斯分类器iris数据集分类 贝叶斯分类器实现_贝叶斯分类器iris数据集分类_21最大的类别标记。对生成式模型来说,必然考虑联合概率分布贝叶斯分类器iris数据集分类 贝叶斯分类器实现_机器学习_22
贝叶斯分类器iris数据集分类 贝叶斯分类器实现_算法_23  基于贝叶斯定理贝叶斯分类器iris数据集分类 贝叶斯分类器实现_贝叶斯分类器iris数据集分类_21可写为
贝叶斯分类器iris数据集分类 贝叶斯分类器实现_机器学习_25  对给定的样本贝叶斯分类器iris数据集分类 贝叶斯分类器实现_算法_05,证据因子贝叶斯分类器iris数据集分类 贝叶斯分类器实现_ci_27与类标记无关,因此估计贝叶斯分类器iris数据集分类 贝叶斯分类器实现_贝叶斯分类器iris数据集分类_21的问题就转化为如何基于训练数据贝叶斯分类器iris数据集分类 贝叶斯分类器实现_sklearn_29来估计先验贝叶斯分类器iris数据集分类 贝叶斯分类器实现_机器学习_30和类条件(似然)贝叶斯分类器iris数据集分类 贝叶斯分类器实现_贝叶斯分类器iris数据集分类_31
  类先验概率贝叶斯分类器iris数据集分类 贝叶斯分类器实现_机器学习_30代表了样本空间中各类样本所占的比例,根据大数定律,当训练集包含充足的独立同分布样本时,贝叶斯分类器iris数据集分类 贝叶斯分类器实现_机器学习_30可通过各类样本出现的频率来进行估计。
  对于类条件概率贝叶斯分类器iris数据集分类 贝叶斯分类器实现_贝叶斯分类器iris数据集分类_31来说,由于它涉及关于贝叶斯分类器iris数据集分类 贝叶斯分类器实现_算法_05所有属性的联合概率,直接根据样本出现的概率来估计将会遇到严重的困难。即贝叶斯分类器iris数据集分类 贝叶斯分类器实现_ci_36分子很多情况下在训练集中根本没有出现,直接使用频率来估计贝叶斯分类器iris数据集分类 贝叶斯分类器实现_贝叶斯分类器iris数据集分类_31显然不可行,因为“未被观测到”与“出现概率为零”通常不同。

二、极大似然估计

贝叶斯分类器iris数据集分类 贝叶斯分类器实现_ci_38的类条件概率为贝叶斯分类器iris数据集分类 贝叶斯分类器实现_贝叶斯分类器iris数据集分类_31,假设贝叶斯分类器iris数据集分类 贝叶斯分类器实现_贝叶斯分类器iris数据集分类_31具有确定的形式并且被参数向量贝叶斯分类器iris数据集分类 贝叶斯分类器实现_sklearn_41唯一确定,则我们的任务就是利用训练集贝叶斯分类器iris数据集分类 贝叶斯分类器实现_sklearn_29估计参数贝叶斯分类器iris数据集分类 贝叶斯分类器实现_sklearn_41.为明确起见,将贝叶斯分类器iris数据集分类 贝叶斯分类器实现_贝叶斯分类器iris数据集分类_31记为贝叶斯分类器iris数据集分类 贝叶斯分类器实现_机器学习_45.
  令贝叶斯分类器iris数据集分类 贝叶斯分类器实现_贝叶斯分类器iris数据集分类_46表示训练集贝叶斯分类器iris数据集分类 贝叶斯分类器实现_sklearn_29中第贝叶斯分类器iris数据集分类 贝叶斯分类器实现_ci_38样本组成的集合,假设这些样本是独立同分布的,则参数贝叶斯分类器iris数据集分类 贝叶斯分类器实现_sklearn_41对于数据集贝叶斯分类器iris数据集分类 贝叶斯分类器实现_贝叶斯分类器iris数据集分类_46的似然是
贝叶斯分类器iris数据集分类 贝叶斯分类器实现_算法_51  对贝叶斯分类器iris数据集分类 贝叶斯分类器实现_sklearn_41进行极大似然估计,就是去寻找能最大化似然贝叶斯分类器iris数据集分类 贝叶斯分类器实现_sklearn_53的参数值贝叶斯分类器iris数据集分类 贝叶斯分类器实现_机器学习_54直观上看,极大似然估计是试图在贝叶斯分类器iris数据集分类 贝叶斯分类器实现_sklearn_41所有可能的取值中,找到一个能使数据出现的“可能性”最大的值。

三、朴素贝叶斯

贝叶斯分类器iris数据集分类 贝叶斯分类器实现_贝叶斯分类器iris数据集分类_21的主要困难在于:类条件概率贝叶斯分类器iris数据集分类 贝叶斯分类器实现_贝叶斯分类器iris数据集分类_31是所有属性上的联合概率,难以从有限的训练样本直接估计而得。为避开这个障碍,朴素贝叶斯分类器采用了“属性条件独立性假设”:对已知类别,假设所有属性相互独立。换言之,假设每个属性独立地对分类结果产生影响。
  基于属性条件独立性假设,后验概率贝叶斯分类器iris数据集分类 贝叶斯分类器实现_贝叶斯分类器iris数据集分类_21可重写为:
贝叶斯分类器iris数据集分类 贝叶斯分类器实现_机器学习_59其中贝叶斯分类器iris数据集分类 贝叶斯分类器实现_算法_60为属性数目,贝叶斯分类器iris数据集分类 贝叶斯分类器实现_算法_61贝叶斯分类器iris数据集分类 贝叶斯分类器实现_算法_05在第贝叶斯分类器iris数据集分类 贝叶斯分类器实现_贝叶斯分类器iris数据集分类_63个属性上的取值。
  由于对所有类别来说贝叶斯分类器iris数据集分类 贝叶斯分类器实现_ci_27相同,因此基于贝叶斯判定准则有
贝叶斯分类器iris数据集分类 贝叶斯分类器实现_ci_65这就是朴素贝叶斯分类器的表达式。
  显然,朴素贝叶斯分类器的训练过程就是基于训练集贝叶斯分类器iris数据集分类 贝叶斯分类器实现_sklearn_29来估计类先验概率贝叶斯分类器iris数据集分类 贝叶斯分类器实现_机器学习_30,并为每个属性来估计条件概率贝叶斯分类器iris数据集分类 贝叶斯分类器实现_ci_68.
  令贝叶斯分类器iris数据集分类 贝叶斯分类器实现_贝叶斯分类器iris数据集分类_46表示训练集贝叶斯分类器iris数据集分类 贝叶斯分类器实现_sklearn_29中第贝叶斯分类器iris数据集分类 贝叶斯分类器实现_ci_38类样本组成的集合,若有充足的独立同分布样本,则可容易地估计出类先验概率
贝叶斯分类器iris数据集分类 贝叶斯分类器实现_ci_72对离散属性而言,令贝叶斯分类器iris数据集分类 贝叶斯分类器实现_算法_73表示贝叶斯分类器iris数据集分类 贝叶斯分类器实现_贝叶斯分类器iris数据集分类_46中在第贝叶斯分类器iris数据集分类 贝叶斯分类器实现_贝叶斯分类器iris数据集分类_63各属性上取值为贝叶斯分类器iris数据集分类 贝叶斯分类器实现_算法_61的样本组成的集合,则条件概率贝叶斯分类器iris数据集分类 贝叶斯分类器实现_ci_68可估计为
贝叶斯分类器iris数据集分类 贝叶斯分类器实现_机器学习_78对连续属性可考虑概率密度函数,假定贝叶斯分类器iris数据集分类 贝叶斯分类器实现_sklearn_79,其中贝叶斯分类器iris数据集分类 贝叶斯分类器实现_机器学习_80贝叶斯分类器iris数据集分类 贝叶斯分类器实现_机器学习_81分别是第贝叶斯分类器iris数据集分类 贝叶斯分类器实现_ci_38类样本在第贝叶斯分类器iris数据集分类 贝叶斯分类器实现_贝叶斯分类器iris数据集分类_63各属性上取值的均值和方差,则有
贝叶斯分类器iris数据集分类 贝叶斯分类器实现_ci_84

四、拉普拉斯修正

贝叶斯分类器iris数据集分类 贝叶斯分类器实现_ci_85时,会出现样本的属性值在训练集中未出现,导致条件概率相乘时最终值为0,为避免其他属性携带的信息被训练集中出现的属性值“抹去”,在估计概率值时通常要进行“平滑”,常用“拉普拉斯修正”,即令贝叶斯分类器iris数据集分类 贝叶斯分类器实现_ci_86表示训练集贝叶斯分类器iris数据集分类 贝叶斯分类器实现_sklearn_29中可能的类别数,贝叶斯分类器iris数据集分类 贝叶斯分类器实现_ci_88表示第贝叶斯分类器iris数据集分类 贝叶斯分类器实现_贝叶斯分类器iris数据集分类_63个属性可能的取值数,则其修正为:
贝叶斯分类器iris数据集分类 贝叶斯分类器实现_sklearn_90

五、朴素贝叶斯分类实践

数据集描述:
文件名称: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

总结

  贝叶斯分类器作为“生成式模型”可处理多分类问题,在数据较少的情况下依然有效,但其有几个特别需要注意的点,后续学习研究可往这方面探索。

  1. 朴素贝叶斯的前提条件是各属性独立同分布,但在现实中很多数据存在关联性;
  2. 属性不一定符合正态分布,需要对数据的分布进行探索 ;