朴素贝叶斯 · 深度手册
分类:机器学习 | 难度:★☆☆ 入门 | 编号:
nb
一、这是什么(一句话用途)
文本分类 / 垃圾邮件 / 疾病诊断(高维稀疏特征、小样本友好)
二、核心思想
朴素贝叶斯是最经典的概率生成式分类器。它的"朴素"在于一个强假设:给定类别后,各特征相互独立。现实中这几乎不成立,但神奇的是即便假设被违反,分类效果往往依然不错,且训练极快、需要的样本很少,在文本分类(词袋特征高维稀疏)上尤其好用。它先由训练集估计"类先验概率" 和"每类下各特征取值的概率" ,预测时对新样本算每类的后验,取最大者。本质上它把"联合分布"拆解为易估计的小块,是典型的"以算代存"。
三、数学原理与推导
由贝叶斯定理,类别后验
条件独立假设下 ,于是
分母 与 无关可省。离散特征用频率估计 (拉普拉斯平滑 防 0)。连续特征常假设高斯:
取对数避免下溢:。
四、建模 / 求解步骤
- 估计类先验 P(c)
- 估计各类条件概率 P(x_i|c)(平滑/高斯)
- 新样本算各类对数后验
- 取最大后验类别
- 输出概率与置信
五、关键公式速查
ĉ = argmax_c P(c)·∏ P(x_i|c);连续特征用高斯;离散用拉普拉斯平滑
六、典型示例
邮件词频 → 算'垃圾/正常'两类后验 → 判为概率更高的一类。
完整算例(数字演示,照着算一遍)
场景:邮件分类,特征 含'免费'(是/否)、含'发票'(是/否)。训练得 P(垃圾|免费)=0.8, P(正常|免费)=0.2 等。
某邮件:含'免费'不含'发票' → P(垃圾)∝0.8·(1−0.1)=0.72 > P(正常)∝0.2·0.9=0.18。
结论:判为垃圾邮件。
七、Python 实现示例
import os, numpy as np
import pandas as pd
HERE = os.path.dirname(os.path.abspath(__file__))
df = pd.read_csv(os.path.join(HERE,"..","datasets","nb.csv"))
X = df[["x1","x2"]].to_numpy(dtype=float); y = df["label"].to_numpy(dtype=float)
X = (X-X.mean(0))/X.std(0)
classes = np.unique(y)
stats = {c:(X[y==c].mean(0), X[y==c].var(0)+1e-6) for c in classes}
priors = {c:(y==c).mean() for c in classes}
def gauss(x, mu, var): return 1/np.sqrt(2*np.pi*var)*np.exp(-(x-mu)**2/(2*var))
acc = 0
for xi, yi in zip(X, y):
s = {c: np.log(priors[c]) + sum(np.log(gauss(xi[j], stats[c][0][j], stats[c][1][j])) for j in range(2)) for c in classes}
acc += (max(s, key=s.get) == yi)
print("朴素贝叶斯分类准确率=%.3f" % (acc/len(y)))
配套文件:
py_nb.py(需 numpy / pandas;与下方数据集配套练习)
八、MATLAB 实现示例
%% 朴素贝叶斯(高斯)示例(MATLAB/Octave)
df = readtable('..\datasets\nb.csv');
X = table2array(df(:,1:2)); y = table2array(df(:,3));
X = (X-mean(X,1))./std(X,1);
classes = unique(y); acc = 0;
gauss = @(x,mu,sg) (1./sqrt(2*pi*sg)).*exp(-(x-mu).^2./(2*sg));
for i=1:height(X)
sc = zeros(size(classes));
for k=1:length(classes)
c=classes(k); idx=(y==c);
mu=mean(X(idx,:),1); sg=var(X(idx,:),1)+1e-6; pri=mean(y==c);
sc(k)=log(pri)+sum(log(gauss(X(i,:),mu,sg)));
end
pred=classes(sc==max(sc)); acc=acc+(pred==y(i));
end
fprintf('朴素贝叶斯分类准确率=%.3f\n', acc/height(X));
配套文件:
m_nb.m(基础 MATLAB / Octave 即可运行)
九、练手数据集(可下载)
两维特征 + 二分类标签(两类近似高斯可分)。用于高斯朴素贝叶斯:估计各类每维均值/方差与先验,算后验概率分类。
- 字段:x1, x2, label
- 行数:40 行
- 下载:
nb.csv
十、常见误区与避坑清单
- 特征强相关时假设偏
- 需平滑防零概率
- 类别不平衡看先验
十一、结果怎么解读
输出各类概率,最大者即预测类。
十二、常与谁搭配
与逻辑回归、决策树、支持向量机互为分类基线;可用主成分分析降维预处理。
十三、论文写作技巧(怎么把它写进论文)
把 朴素贝叶斯 写进论文,核心不是堆公式,而是讲清「为什么用它、结果怎么呈现、如何对比」三件事。
1. 动机怎么写(为什么用它而不是别的)
开篇说明是数据驱动预测,给出特征工程与样本规模。对比传统统计模型,点出 朴素贝叶斯 能自动捕捉非线性 / 交互效应,但也要诚实说明需要调参与防过拟合。
2. 结果怎么写(图表与指标)
给学习曲线(样本量 vs 性能)、交叉验证平均 ± 标准差表、特征重要性排序图。多个模型横向对比误差。
3. 可直接套用的写作话术
- 中文模板:针对<问题>,本文采用 朴素贝叶斯 进行文本分类 / 垃圾邮件 / 疾病诊断(高维稀疏特征、小样本友好)。该方法能够自动刻画<优势>,在处理<场景>时相较<对比方法>更具<特点>。
- 英文模板:To address
, we adopt 朴素贝叶斯 to 文本分类 / 垃圾邮件 / 疾病诊断(高维稀疏特征、小样本友好). Benefiting from its ability to , it outperforms on .
4. 同类易踩的写作坑
必须做交叉验证而非单次划分;报告方差而不仅是均值;说明超参搜索范围,避免「炼丹」嫌疑。
5. 典型论文段落范例(可直接参考 / 改写)
下面是一段可直接套用的论文表述,已按本算法定制,填空处(…)替换成你的真实数值即可。
针对信贷违约预测,本文采用 朴素贝叶斯,经 5 折交叉验证平均 AUC=0.91±0.02,特征重要性显示收入稳定性与负债比为关键因子,模型在独立测试集上保持稳健。
For credit default prediction, we adopt 朴素贝叶斯 and obtain AUC=0.91±0.02 under 5-fold cross-validation; feature importance highlights income stability and debt ratio as key drivers, with stable performance on a held-out test set.
十四、相关手册(延伸阅读)
- 主成分分析(评价 / 降维) · 评价类
- 逻辑回归 · 预测类
- 决策树 · 聚类分类
- 支持向量机 SVM · 聚类分类
十五、本手册导航
- 上一篇:K-Means 聚类 · 聚类分类
- 下一篇:K 近邻 · 机器学习
- 返回:算法深度手册库 | 资料站首页
本手册由「算法深度手册生成器」自动产出,配套提供 Python / MATLAB 双版本示例与可下载练手数据集。