机器学习(六)——贝叶斯分类器(贝叶斯定理、极大似然估计、朴素贝叶斯、半朴素贝叶斯、贝叶斯网、Python源码)


关于

  • 本文是基于西瓜书(第七章)的学习记录。内容包括贝叶斯定理、极大似然估计、朴素贝叶斯、半朴素贝叶斯、贝叶斯网、Python源码等。
  • 西瓜书电子版:百度网盘分享链接

1 贝叶斯决策论

贝叶斯决策论是在概率框架下实施决策的基本方法。对于分类任务,它考虑如何基于相关概率和误判损失来选择最优的类别标记。

  • 基本原理:在所有相关概率都已知的理想情形下,贝叶斯决策论通过后验概率来获得样本的“条件风险”,并寻找一个判定准则来最小化总体风险。
  • 贝叶斯判定准则:为最小化总体风险,选择能使条件风险最小的类别标记。
  • 贝叶斯最优分类器:与贝叶斯判定准则对应的分类器,其总体风险称为贝叶斯风险,反映了分类器所能达到的最好性能。
  • 条件风险与后验概率的关系:条件风险 R ( c ∣ x ) R(c|x) R(cx)可以表示为 R ( c ∣ x ) = 1 − P ( c ∣ x ) R(c\mid x)=1-P(c\mid\boldsymbol{x}) R(cx)=1P(cx)为了最小化风险,就要最大化 P ( c ∣ x ) P(c|x) P(cx)
  • 基于有限的训练样本估计后验概率 P ( c ∣ x ) P(c|x) P(cx)的策略:
    • 判别式模型:直接建模 P ( c ∣ x ) P(c|x) P(cx)来预测c,如决策树、神经网络、支持向量机
    • 生成式模型:先对联合概率分布 P ( x , c ) P(x,c) P(x,c)建模,然后由此获得 P ( c ∣ x ) P(c|x) P(cx)
  • 基于贝叶斯定理,后验概率 P ( c ∣ x ) P(c|x) P(cx)可写为: P ( c ∣ x ) = P ( c ) P ( x ∣ c ) P ( x ) P(c\mid\boldsymbol{x})=\frac{P(c) P(\boldsymbol{x}\mid c)}{P(\boldsymbol{x})} P(cx)=P(x)P(c)P(xc)
    • P ( c ) P(c) P(c)是先验概率
    • P ( x ∣ c ) P(x|c) P(xc)是样本x相对于类标记c的类条件概率,可称为似然
    • P ( x ) P(x) P(x)与类标记无关
      • 故重点在于基于训练数据来估计先验概率和似然
        • 根据大数定理,先验概率 P ( c ) P(c) P(c)可通过各类样本的出现频率来估计
          • 而按照频率估计似然不可行,所以重点是似然的计算。
            在这里插入图片描述

2 极大似然估计

极大似然估计(MLE)是估计概率分布参数的经典方法,它试图在参数的所有可能取值中找到一个能使数据出现的“可能性”最大的值。

  • 参数估计:概率模型的训练过程就是参数估计过程,极大似然估计是根据数据采样来估计概率分布参数的方法。
  • 连续属性和离散属性:在连续属性情形下,假设概率密度函数;在离散属性情形下,通过类似的方式估计类条件概率。

3 朴素贝叶斯分类器

朴素贝叶斯分类器基于贝叶斯公式来估计后验概率,主要困难在于类条件概率 P ( x ∣ c ) P(x|c) P(xc)是所有属性上的联合概率,难以从有限的训练样本直接估计。

  • 属性条件独立性假设:朴素贝叶斯假设所有属性相互独立,即每个属性独立地对分类结果发生影响,则后验概率的计算可以改写: P ( c ∣ x ) = P ( c ) P ( x ∣ c ) P ( x ) = P ( c ) P ( x ) ∏ i = 1 d P ( x i ∣ c ) P(c\mid\boldsymbol{x})=\frac{P(c)P(x | c)}{P(\boldsymbol{x})}=\frac{P(c)}{P(\boldsymbol{x})}\prod_{i=1}^dP(x_i\mid c) P(cx)=P(x)P(c)P(xc)=P(x)P(c)i=1dP(xic)其中 d d d为属性数目, x i xi xi x x x在第 i i i个属性上的取值.
    在这里插入图片描述

  • 训练过程举例
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 概率估计问题:若某个属性值在训练集中没有与某个类同时出现过,则直接基于概率估计将出现问题

    • 解决方法:拉普拉斯修正
      在这里插入图片描述

4 半朴素贝叶斯分类器

在这里插入图片描述

  • 朴素贝叶斯分类器采用了属性条件独立性假设,在现实任务中这个假设往往很难成立
  • 半朴素贝叶斯分类器适当考虑属性间的相互依赖信息,既不需进行完全联合概率计算,又不至于彻底忽略了比较强的属性依赖关系。
  • 独依赖估计(ODE):假设每个属性在类别之外最多仅依赖于一个其他属性,称为父属性。
  • 则问题的关键转换为:如何确定某个属性的父属性。
    • SPODE:假设所有属性都依赖于一个共同的属性:超父,然后通过交叉验证来确定超父属性。
    • TAN:通过最大带权生成树算法保留强相关属性之间的依赖性,将属性间的依赖关系约简为树形结构。
      在这里插入图片描述
    • AODE:基于集成学习机制,尝试将每个属性作为超父来构建SPODE,然后将那些具有足够训练数据支撑的SPODE集成起来作为最终结果。

5 贝叶斯网

  • 贝叶斯网借助有向无环图来刻画属性之间的依赖关系,并使用条件概率表来描述属性的联合概率分布。

  • 结构和参数:贝叶斯网由结构和参数两部分构成,结构表达属性间的条件独立性,参数定量描述这种依赖关系。
    在这里插入图片描述

  • 学习:若网络结构已知,则学习过程相对简单,只需估计出每个结点的条件概率表即可。若网络结构未知,则需要根据训练数据集来找出结构最“恰当”的贝叶斯网。

  • 寻找最优网结构:评分搜索:我们先定义一个评分函数,以此来评估贝叶斯网与训练数据的契合程度,然后基于这个评分函数来寻找结构最优的贝叶斯网。显然,评分函数引入了关于我们希望获得什么样的贝叶斯网的归纳偏好。

  • 常用评分函数通常基于信息论准则,此类准则将学习问题看作一个数据压缩任务,学习的目标是找到一个能以最短编码长度描述训练数据的模型,此时编码的长度包括了描述模型自身所需的字节长度和使用该模型描述数据所需的字节长度

  • 贝叶斯网训练好之后就能用来回答“查询”(query),即通过一些属性变量,的观测值来推测其他属性变量的取值

  • 最理想的是直接根据贝叶斯网定义的联合概率分布来精确计算后验概率,不幸的是,这样的“精确推断”已被证明是N P难的

6 EM算法

  • 我们一直假设训练样本所有属性变量的值都已被观测到,即训练样本是“完整”的.但在现实应用中往往会遇到“不完整”的训练样本
  • EM算法是一种常用的估计参数隐变量的方法,它是一种迭代式的方法,其基本想法是:若参数已知,则可根据训练数据推断出最优隐变量的值;反之,若隐变量的值已知,则可对参数做极大似然估计。
  • EM算法使用两个步骤交替计算:第一步是期望(E)步,利用当前估计的参数值来计算对数似然的期望值;第二步是最大化(M)步,寻找能使E 步产生的似然期望最大化的参数值.然后,新得到的参数值重新被用于E 步……直至收敛到局部最优解.
  • 隐变量估计问题也可通过梯度下降等优化算法求解,但由于求和的项数将随着隐变量的数目以指数级上升,会给梯度计算带来麻烦;而 EM算法则可看作一种非梯度优化方法.

X 案例代码

X.1 分类任务

X.1.1 源码

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import confusion_matrix, accuracy_score, classification_report
import seaborn as sns

# 1. 加载数据集
iris = load_iris()
X, y = iris.data, iris.target
print("此时X,y的数据类型为:", type(X), type(y), '\n')

# 2. 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print("此时X_train,y_train的数据类型为:", type(X_train), type(y_train), '\n')
print("X_train的前10条数据展示:")
print(pd.DataFrame(X_train).head(10).to_string(index=False, justify='left'), '\n')

# 3. 构建并训练朴素贝叶斯分类模型
model = GaussianNB()
model.fit(X_train, y_train)

# 4. 预测测试集上的目标变量
y_pred = model.predict(X_test)

# 5. 评估模型性能
accuracy = accuracy_score(y_test, y_pred)
print("模型准确率:", accuracy)

print("分类报告:")
print(classification_report(y_test, y_pred))

# 6. 绘制混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=iris.target_names, yticklabels=iris.target_names)
plt.xlabel('Predicted Labels')
plt.ylabel('True Labels')
plt.title('Confusion Matrix for Iris Dataset')
plt.tight_layout()
plt.show()

# 可选:将结果保存到DataFrame中以便进一步分析
results = pd.DataFrame({
    
    
    'Actual': y_test,
    'Predicted': y_pred
})
print("模型预测结果:")
print(results.head())

X.1.2 数据集(鸢尾花数据集)

  • 鸢尾花数据集是机器学习领域中最著名的数据集之一,常被用于分类算法的测试和演示。

  • 概览

    • 样本数量:150个样本
    • 特征数量:4个特征
    • 标签种类数量:3个类别,每个类别有50个样本
  • 特征描述

    • 萼片长度 (sepal length):花萼的长度,单位为厘米。
    • 萼片宽度 (sepal width):花萼的宽度,单位为厘米。
    • 花瓣长度 (petal length):花瓣的长度,单位为厘米。
    • 花瓣宽度 (petal width):花瓣的宽度,单位为厘米。
  • 目标变量是鸢尾花的种类,共有三种:

    1. Iris setosa
    2. Iris versicolor
    3. Iris virginica
  • 使用

    • 可以使用 sklearn.datasets.load_iris() 函数来加载这个数据集,并查看其详细信息。

X.1.3 模型效果

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_62888264/article/details/143638169
今日推荐