朴素贝叶斯算法

朴素贝叶斯算法(Naive Bayes Algorithm)是一种基于贝叶斯定理特征条件独立假设的经典分类算法。尽管其假设在现实中往往过于“朴素”(即假设所有特征之间相互独立),但它在许多实际应用场景中(尤其是文本分类)表现优异,且计算效率极高。

核心原理

朴素贝叶斯的理论基础是贝叶斯定理,公式如下:

P(Y∣X)=P(X∣Y)⋅P(Y)P(X)P(Y|X) = \frac{P(X|Y) \cdot P(Y)}{P(X)}P(YX)=P(X)P(XY)P(Y)

其中:

  • P(Y∣X)P(Y|X)P(YX)后验概率,即在给定特征 XXX 的情况下,样本属于类别 YYY 的概率(我们要计算的目标)。
  • P(X∣Y)P(X|Y)P(XY)似然概率,即在类别 YYY 已知的情况下,特征 XXX 出现的概率。
  • P(Y)P(Y)P(Y)先验概率,即类别 YYY 在总体中出现的概率。
  • P(X)P(X)P(X)证据因子,即特征 XXX 出现的总概率(对于所有类别来说通常是常数,因此在比较时可以忽略)。
“朴素”在哪里?

算法假设所有特征 X1,X2,...,XnX_1, X_2, ..., X_nX1,X2,...,Xn 在给定类别 YYY 的条件下是相互独立的。这使得联合概率可以简化为单个概率的乘积:

P(X∣Y)=P(X1∣Y)⋅P(X2∣Y)⋅...⋅P(Xn∣Y)P(X|Y) = P(X_1|Y) \cdot P(X_2|Y) \cdot ... \cdot P(X_n|Y)P(XY)=P(X1Y)P(X2Y)...P(XnY)

这一假设极大地降低了计算复杂度,避免了需要估计复杂的联合概率分布。

拉普拉斯平滑系数 (Laplace Smoothing)

在朴素贝叶斯算法中,如果某个特征值 XiX_iXi 在训练集中从未与某个类别 YYY 同时出现,那么计算出的条件概率 P(Xi∣Y)P(X_i|Y)P(XiY) 将为 0。由于朴素贝叶斯是将所有特征概率相乘,只要有一个为 0,整个后验概率就会变成 0,导致分类失效。这就是著名的零概率问题

为了解决这个问题,法国数学家拉普拉斯提出了拉普拉斯平滑(也称为加一平滑)。

核心思想

通过在分子和分母上分别加上一个常数,确保即使某个特征未在训练集中出现,其概率也不会为 0,而是一个较小的正值。

数学公式

假设我们要计算在类别 Y=ckY=c_kY=ck 下,特征 X(j)X^{(j)}X(j) 取值为 ajla_{jl}ajl 的条件概率。

未平滑前(极大似然估计):
P(X(j)=ajl∣Y=ck)=∑i=1NI(xi(j)=ajl,yi=ck)∑i=1NI(yi=ck)P(X^{(j)} = a_{jl} | Y = c_k) = \frac{\sum_{i=1}^{N} I(x_i^{(j)} = a_{jl}, y_i = c_k)}{\sum_{i=1}^{N} I(y_i = c_k)}P(X(j)=ajlY=ck)=i=1NI(yi=ck)i=1NI(xi(j)=ajl,yi=ck)

引入拉普拉斯平滑后:
Pλ(X(j)=ajl∣Y=ck)=∑i=1NI(xi(j)=ajl,yi=ck)+λ∑i=1NI(yi=ck)+Sj⋅λP_{\lambda}(X^{(j)} = a_{jl} | Y = c_k) = \frac{\sum_{i=1}^{N} I(x_i^{(j)} = a_{jl}, y_i = c_k) + \lambda}{\sum_{i=1}^{N} I(y_i = c_k) + S_j \cdot \lambda}Pλ(X(j)=ajlY=ck)=i=1NI(yi=ck)+Sjλi=1NI(xi(j)=ajl,yi=ck)+λ

其中:

  • λ\lambdaλ (Lambda):平滑系数
    • λ=1\lambda = 1λ=1 时,称为拉普拉斯平滑(加一平滑)。
    • 0<λ<10 < \lambda < 10<λ<1 时,称为利德斯通平滑(Lidstone Smoothing)。
    • λ=0\lambda = 0λ=0 时,即为未平滑的极大似然估计。
  • SjS_jSj:第 jjj 个特征可能取值的个数(即该特征的类别数或词汇表大小)。
  • NNN:训练样本总数。
  • I(⋅)I(\cdot)I():指示函数,条件满足为 1,否则为 0。
直观理解
  • 分子加 λ\lambdaλ:相当于假设每个特征值在每种类别下都额外出现了 λ\lambdaλ 次。
  • 分母加 Sj⋅λS_j \cdot \lambdaSjλ:为了保持概率之和为 1,分母需要加上所有可能取值增加的总数(即 SjS_jSj 个取值,每个加 λ\lambdaλ)。
作用
  1. 避免零概率:确保模型不会因为遇到未见过的特征而直接输出概率 0。
  2. 缓解过拟合:平滑操作相当于引入了一个均匀分布的先验,使模型对训练数据中的噪声不那么敏感,提高了泛化能力。
  3. 处理稀疏数据:在文本分类等高维稀疏数据场景中效果尤为显著。

主要模型类型

根据数据特征分布的不同,朴素贝叶斯主要分为三种常见模型:

模型类型 适用场景 特点
高斯朴素贝叶斯 (Gaussian NB) 特征是连续数值型数据 假设特征服从高斯分布(正态分布),常用于如身高、体重等连续变量的分类。
多项式朴素贝叶斯 (Multinomial NB) 特征是离散计数型数据 常用于文本分类,特征通常是词频(某个词在文档中出现的次数)。
伯努利朴素贝叶斯 (Bernoulli NB) 特征是二值型数据 (0/1) 关注特征是否出现(例如:某个词是否在文档中出现过,而不关心出现次数)。

优缺点分析

优点
  1. 简单高效:算法逻辑清晰,易于实现,训练和预测速度极快。
  2. 小样本表现好:即使在训练数据较少的情况下,也能表现出不错的稳定性。
  3. 适合高维数据:特别适合特征数量巨大的场景(如文本分类中成千上万个词汇),且不易过拟合。
  4. 对缺失数据不敏感:部分特征缺失通常不会严重影响整体分类结果。
  5. 可解释性强:能够直接输出属于各个类别的概率,便于理解决策依据。
缺点
  1. 独立性假设过强:现实中特征之间往往存在相关性(例如,“天气”和“温度”可能相关),这会导致概率估计不准确,从而影响分类精度。
  2. 依赖先验概率:如果训练数据的类别分布与真实世界分布偏差较大,效果会受影响。
  3. 零概率问题:如果某个特征值在训练集中从未与某个类别同时出现,计算出的概率为0,会导致整个后验概率为0。
    • 解决方案:使用拉普拉斯平滑(Laplace Smoothing),给所有计数加一个小常数。

典型应用场景

由于其特性,朴素贝叶斯在以下领域应用极为广泛:

  • 垃圾邮件过滤:判断一封邮件是否为垃圾邮件(基于关键词出现的概率)。
  • 文本分类:新闻分类(体育、政治、娱乐等)、主题识别。
  • 情感分析:判断评论是正面还是负面。
  • 推荐系统:基于用户历史行为的简单概率推荐。
  • 医疗诊断:根据症状预测疾病概率。

Python 代码示例

以下是一个使用 scikit-learn 库进行多项式朴素贝叶斯文本分类的简单示例:

from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.pipeline import Pipeline

# 模拟训练数据
documents = [
    "这个电影非常好看,剧情精彩",
    "这是一部烂片,浪费了我的时间",
    "演员演技在线,值得推荐",
    "情节混乱,完全看不懂"
]
labels = ["positive", "negative", "positive", "negative"]

# 构建管道:先将文本转换为词频矩阵,再训练朴素贝叶斯模型
model = Pipeline([
    ('vectorizer', CountVectorizer()), # 文本向量化
    ('classifier', MultinomialNB())    # 多项式朴素贝叶斯分类器
])

# 训练模型
model.fit(documents, labels)

# 预测新数据
new_texts = ["剧情很棒,非常喜欢", "太差劲了,不想再看"]
predictions = model.predict(new_texts)

for text, label in zip(new_texts, predictions):
    print(f"文本: '{text}' -> 预测类别: {label}")
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐