【机器学习基础】机器学习入门核心算法:朴素贝叶斯(Naive Bayes)

发布于:2025-05-29 ⋅ 阅读:(34) ⋅ 点赞:(0)

在这里插入图片描述

一、算法逻辑

1.1 基本概念

朴素贝叶斯是一种基于贝叶斯定理特征条件独立假设的分类算法。其核心思想是:通过已知类别的训练数据集,计算先验概率和条件概率,然后利用贝叶斯定理计算后验概率,最后选择后验概率最大的类别作为预测结果。

核心特点

  • 简单高效,训练速度快
  • 对小规模数据表现良好
  • 对缺失数据不敏感
  • 天然支持多分类任务

适用场景

  • 文本分类(如垃圾邮件识别)
  • 情感分析
  • 推荐系统
  • 实时分类系统

1.2 基本流程

  1. 计算每个类别的先验概率
  2. 计算每个特征在每个类别下的条件概率
  3. 对于新样本,计算其属于每个类别的后验概率
  4. 选择后验概率最大的类别作为预测结果

二、算法原理与数学推导

2.1 贝叶斯定理

贝叶斯定理是朴素贝叶斯算法的理论基础:
P ( Y ∣ X ) = P ( X ∣ Y ) P ( Y ) P ( X ) P(Y|X) = \frac{P(X|Y)P(Y)}{P(X)} P(YX)=P(X)P(XY)P(Y)
其中:

  • P ( Y ∣ X ) P(Y|X) P(YX):后验概率(在已知特征X的条件下,类别Y的概率)
  • P ( X ∣ Y ) P(X|Y) P(XY):似然概率(在已知类别Y的条件下,特征X出现的概率)
  • P ( Y ) P(Y) P(Y):先验概率(类别Y出现的概率)
  • P ( X ) P(X) P(X):证据因子(特征X出现的概率)

2.2 朴素贝叶斯分类器

朴素贝叶斯假设所有特征相互独立(条件独立性假设),即:
P ( X ∣ Y ) = P ( x 1 , x 2 , . . . , x n ∣ Y ) = ∏ i = 1 n P ( x i ∣ Y ) P(X|Y) = P(x_1,x_2,...,x_n|Y) = \prod_{i=1}^n P(x_i|Y) P(XY)=P(x1,x2,...,xnY)=i=1nP(xiY)
则后验概率可表示为:
P ( Y ∣ X ) = P ( Y ) ∏ i = 1 n P ( x i ∣ Y ) P ( X ) P(Y|X) = \frac{P(Y) \prod_{i=1}^n P(x_i|Y)}{P(X)} P(YX)=P(X)P(Y)i=1nP(xiY)

由于 P ( X ) P(X) P(X)对于所有类别都是相同的,因此只需比较分子部分:
y ^ = arg ⁡ max ⁡ Y P ( Y ) ∏ i = 1 n P ( x i ∣ Y ) \hat{y} = \arg\max_{Y} P(Y) \prod_{i=1}^n P(x_i|Y) y^=argYmaxP(Y)i=1nP(xiY)

2.3 不同分布假设下的概率计算

2.3.1 高斯朴素贝叶斯(连续特征)

假设特征服从正态分布:
P ( x i ∣ Y ) = 1 2 π σ y 2 exp ⁡ ( − ( x i − μ y ) 2 2 σ y 2 ) P(x_i|Y) = \frac{1}{\sqrt{2\pi\sigma_y^2}} \exp\left(-\frac{(x_i - \mu_y)^2}{2\sigma_y^2}\right) P(xiY)=2πσy2 1exp(2σy2(xiμy)2)
其中 μ y \mu_y μy σ y \sigma_y σy分别为类别Y下特征 x i x_i xi的均值和标准差。

2.3.2 多项式朴素贝叶斯(离散特征)

使用特征频率估计概率:
P ( x i ∣ Y ) = N y i + α N y + α n P(x_i|Y) = \frac{N_{yi} + \alpha}{N_y + \alpha n} P(xiY)=Ny+αnNyi+α
其中:

  • N y i N_{yi} Nyi:类别Y中特征 x i x_i xi出现的次数
  • N y N_y Ny:类别Y中所有特征出现的总次数
  • n n n:特征总数
  • α \alpha α:平滑参数(拉普拉斯平滑)
2.3.3 伯努利朴素贝叶斯(二值特征)

适用于特征取值为二值的情况:
P ( x i ∣ Y ) = P ( i ∣ Y ) x i + ( 1 − P ( i ∣ Y ) ) ( 1 − x i ) P(x_i|Y) = P(i|Y)x_i + (1 - P(i|Y))(1 - x_i) P(xiY)=P(iY)xi+(1P(iY))(1xi)

三、模型评估

3.1 评估指标

指标 计算公式 适用场景
准确率 T P + T N T P + T N + F P + F N \frac{TP+TN}{TP+TN+FP+FN} TP+TN+FP+FNTP+TN 类别平衡时
精确率 T P T P + F P \frac{TP}{TP+FP} TP+FPTP 关注预测的准确性
召回率 T P T P + F N \frac{TP}{TP+FN} TP+FNTP 关注正类的检出率
F1 Score 2 ⋅ P r e c i s i o n ⋅ R e c a l l P r e c i s i o n + R e c a l l 2 \cdot \frac{Precision \cdot Recall}{Precision + Recall} 2Precision+RecallPrecisionRecall 综合精确率和召回率
对数损失 − 1 N ∑ i = 1 N ∑ j = 1 M y i j log ⁡ ( p i j ) -\frac{1}{N}\sum_{i=1}^N\sum_{j=1}^M y_{ij}\log(p_{ij}) N1i=1Nj=1Myijlog(pij) 评估概率预测质量

3.2 学习曲线分析

高偏差场景(欠拟合):

  • 训练集和验证集准确率都较低
  • 增加数据量不会改善效果

高方差场景(过拟合):

  • 训练集准确率高,验证集准确率低
  • 增加数据量可能改善效果

四、应用案例

4.1 文本分类:垃圾邮件识别

数据集:Enron-Spam数据集(33,716封邮件)
特征工程

  1. 文本预处理:分词、去停用词、词干提取
  2. 构建词袋模型(Bag-of-Words)
  3. TF-IDF特征加权

模型配置

from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import TfidfVectorizer

vectorizer = TfidfVectorizer(max_features=5000)
X_train = vectorizer.fit_transform(train_emails)
clf = MultinomialNB(alpha=1.0)
clf.fit(X_train, train_labels)

性能结果

  • 准确率:98.2%
  • 召回率:96.5%
  • F1值:97.3%

4.2 医疗诊断:糖尿病预测

数据集:Pima Indians Diabetes Database
特征说明:8个医学特征(如血糖、BMI等)
模型选择:高斯朴素贝叶斯
关键处理

  • 特征标准化(Z-Score)
  • 缺失值用同类样本均值填充

评估结果

  • AUC:0.85
  • 敏感度(召回率):0.78
  • 特异性:0.87

五、经典面试题

问题1:为什么称为"朴素"?

关键点解析

  • 算法基于一个强假设:所有特征条件独立
  • 这个假设在现实中很少成立(例如,文本中相邻词语通常相关)
  • 尽管假设简单,但实际效果往往出乎意料的好

问题2:如何处理连续特征?

解决方案

  1. 离散化(分箱):将连续特征转换为离散区间
  2. 使用高斯朴素贝叶斯:假设特征服从正态分布
  3. 核密度估计(KDE):非参数化估计概率分布

问题3:拉普拉斯平滑的作用?

数学解释

  • 解决零概率问题:当某个特征值在训练集中未出现时,会导致整个概率乘积为0
  • 平滑公式: P ( x i ∣ Y ) = N y i + α N y + α n P(x_i|Y) = \frac{N_{yi} + \alpha}{N_y + \alpha n} P(xiY)=Ny+αnNyi+α
  • 其中 α > 0 \alpha>0 α>0(通常取1), n n n为特征可能取值数

问题4:朴素贝叶斯的优缺点?

优点

  • 训练速度快,计算量小
  • 对小规模数据表现好
  • 对缺失数据不敏感

缺点

  • 特征独立性假设通常不成立
  • 概率估计可能不准确(特别是小样本时)
  • 对输入数据的表达形式敏感

六、高级优化技术

6.1 特征选择

提升独立性假设的有效性

  • 互信息(Mutual Information)筛选特征
  • 卡方检验(Chi-Square Test)
  • 递归特征消除(RFE)

6.2 半朴素贝叶斯

放松独立性假设

  • TAN(Tree-Augmented Naive Bayes):允许特征间形成树形依赖
  • AODE(Averaged One-Dependence Estimators):集成多个超父特征模型

6.3 贝叶斯网络

完全图模型

  • 使用有向无环图表示特征依赖关系
  • 需要专家知识或结构学习确定网络拓扑

七、最佳实践指南

7.1 参数调优建议

参数 推荐值 作用说明
alpha 0.5-1.5 平滑参数,防止零概率
fit_prior True 学习类别先验概率
class_prior None 自动从数据学习

7.2 特征处理要点

  • 文本数据:优先使用TF-IDF而非词频统计
  • 连续特征:使用分箱或高斯分布假设
  • 类别不平衡:设置class_prior参数或使用过采样

7.3 实时分类系统实现

import pickle
from sklearn.pipeline import make_pipeline

# 训练模型
model = make_pipeline(TfidfVectorizer(), MultinomialNB())
model.fit(X_train, y_train)

# 保存模型
with open('nb_classifier.pkl', 'wb') as f:
    pickle.dump(model, f)

# 实时预测(单次预测<1ms)
def predict(text):
    with open('nb_classifier.pkl', 'rb') as f:
        model = pickle.load(f)
    return model.predict([text])[0]

总结与展望

朴素贝叶斯算法因其简单高效的特点,在文本分类、实时系统等场景中持续发挥重要作用。未来发展方向包括:

  1. 与深度学习结合(如贝叶斯神经网络)
  2. 改进特征依赖建模(图结构学习)
  3. 在线学习与增量训练

网站公告

今日签到

点亮在社区的每一天
去签到