跳转到内容

E.C.3 朴素贝叶斯

朴素贝叶斯证据累积图

朴素贝叶斯会比较“哪个类别更可能生成这些证据”。在文本任务里,词频常常已经足够构建一个便宜又有用的 baseline。

  • Python 3.10+
  • 当前稳定版 scikit-learn
Terminal window
python -m pip install -U scikit-learn
  • Bag of words(词袋):用词频表示文本。
  • Conditional probability(条件概率):给定类别时,某个证据出现的概率。
  • 朴素假设:给定类别后,各特征之间近似独立。
  • Smoothing(平滑):避免没见过的词直接变成不可能。
  • alphaMultinomialNB 里的平滑强度。

创建 naive_bayes_text.py

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import make_pipeline
texts = [
"How long does a refund take?",
"How do I apply for a refund?",
"When can I issue an invoice?",
"Where is the e-invoice sent?",
"What should I do if I forget my password?",
"Where is the password reset entry?",
]
labels = [
"refund",
"refund",
"invoice",
"invoice",
"password",
"password",
]
model = make_pipeline(
CountVectorizer(),
MultinomialNB(alpha=1.0),
)
model.fit(texts, labels)
pred = model.predict([
"How do I handle a refund?",
"When can I issue an e-invoice?",
])
print("predictions:", pred.tolist())

运行:

Terminal window
python naive_bayes_text.py

预期输出:

Terminal window
predictions: ['refund', 'invoice']

这是一个完整 baseline:文本转词频,词频转概率,概率转标签。

alpha=1.0 改成 0.12.0。在小数据集里,平滑会明显影响模型对罕见词的信任程度。

适合尝试朴素贝叶斯:

  1. 任务是文本分类。
  2. 需要快速 baseline。
  3. 数据少,标签相对简单。
  4. 需要一定可解释性。

当语义、上下文或词序很重要时,再换更强模型。

复盘朴素贝叶斯时,要保留推动预测的证据词或计数。关键问题不只是“分到了哪个标签”,而是哪些词把概率推向了这个标签。

这个模型适合证据简单、解释性重要的任务。若特征强相关、稀有词支配结果,或者类别样本太少,就把失败案例保留下来,让它成为后续模型的对照点。

交付检查时,给每个类别至少保留一条命中的关键词说明。若一个新样本被分错,先看词表是否覆盖了关键证据,再看平滑参数。不要只报准确率,因为朴素贝叶斯的价值就在于能解释证据来源。

如果类别样本很少,也要在结论里写出来。样本覆盖不足时,预测看起来合理,并不代表模型已经学到了稳定规律。

学完这一页,至少保留这张证据卡:

模型家族
SVM、KNN、朴素贝叶斯、LDA 或其他传统基线
数据视图
特征缩放、类别平衡、决策边界和训练/测试划分
指标
准确率/F1、混淆矩阵、边距、邻近行为或投影质量
失败检查
缩放、高维度、假设薄弱、泄漏或基线拟合差
期望产出
经典机器学习基线结果,以及一条局限性说明
  • 以为“朴素”就等于没用。
  • 忘记特征表达仍然很重要。
  • 只拿它和大模型比,而不是把它当便宜 baseline。

添加一个 certificate 类别和两个样本。再测试一个证书问题是否能被分到新标签。

参考实现与讲解

合理更新是加入两个 certificate 标签样本,文本里可以包含 certificateproofcompletion 等词,然后预测一个新的证书相关问题。如果模型返回 certificate,说明新类别至少已经能被模型识别。

如果没有返回,不要立刻认为模型坏了,而要检查词表和平滑参数。只有两个样本时,朴素贝叶斯会很受用词影响,所以讲解里要提到数据覆盖,而不只是报告预测标签。