Skip to content

训练与预测

本章目标

  1. 按源码顺序看清当前 Naive Bayes 流水线从数据复制到概率输出的完整步骤。
  2. 理解主模型 (model)、二维可视化模型 (model_2d) 和学习曲线实例三者的职责边界。
  3. 理解 predict(...)predict_proba(...) 在 Naive Bayes 中分别对应什么数学计算。

重点方法与概念速览

名称类型作用
naive_bayes_data.copy()方法复制原始数据,避免后续处理修改源对象
train_test_split(...)函数stratify=y 划分训练/测试集
StandardScaler对特征做一致性标准化——训练集 fit_transform,测试集 transform
train_model(...)函数训练主 GaussianNB 模型,返回含 theta_var_ 的模型对象
model.predict(X_test_s)方法输出测试集类别预测——选择后验概率最大的类别
model.predict_proba(X_test_s)方法输出测试集各类别的后验概率 P(Y=ck|x)
PCA(n_components=2)将 4 维特征投影到 2 维,为决策边界可视化提供服务
model_2d模型在 PCA 2D 空间单独训练的 GaussianNB,专用于决策边界绘图

1. 流水线起点:复制数据并拆出特征/标签

示例代码

python
data = naive_bayes_data.copy()
X = data.drop(columns=["label"])
y = data["label"]

理解重点

  • .copy() 确保后续处理不修改在模块导入时已经加载的全局 naive_bayes_data
  • 当前任务是有监督多分类,因此 y 既参与训练 fit(X_train_s, y_train),也参与评估(混淆矩阵、ROC)。
  • 这一步只是数据准备,不涉及任何算法逻辑。

2. 训练/测试集切分

参数速览

适用函数:train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)

参数名类型说明示例取值
XDataFrame特征矩阵,形状 (150,4)X
ySeries标签向量,取值 yi{0,1,2}y
test_sizefloat测试集占比。150 × 0.2 = 30 测试样本,120 训练样本0.2
random_stateint随机种子,保证切分可复现42
stratifyarray_like传入 y 使训练/测试集类别比例与原始数据一致y

示例代码

python
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

理解重点

  • stratify=y 在小样本(150 条)多分类(3 类)场景下尤其重要——确保训练集和测试集都包含三类样本。
  • 切分必须在标准化之前执行,否则测试集信息会通过均值和标准差泄露到训练流程中。

3. 标准化

参数速览

适用 API:StandardScaler().fit_transform(X_train) / StandardScaler().transform(X_test)

参数名类型说明示例取值
X_trainarray_like,形状 (120,4)训练特征矩阵,用于计算 μj,σj 并原地标准化X_train
X_testarray_like,形状 (30,4)测试特征矩阵,使用训练集统计量进行标准化变换X_test
输出ndarrayzij=(xijμj)/σj,每个特征化为均值 0 标准差 1X_train_sX_test_s

示例代码

python
scaler = StandardScaler()
X_train_s = scaler.fit_transform(X_train)
X_test_s = scaler.transform(X_test)

理解重点

  • 标准化后每个特征的尺度统一,使得方差估计不受原始量纲(如萼片长度以 cm 为单位)的影响。
  • 虽然 GaussianNB 不依赖梯度优化,但标准化有利于 PCA 可视化和跨特征方差比较。
  • 当前仓库在所有分类流水线中统一保留标准化步骤——这是工程一致性设计,而非 GaussianNB 的硬性要求。

4. 主模型训练与硬分类预测

参数速览

适用 API:train_model(X_train_s, y_train)model.predict(X_test_s)

参数名类型说明示例取值
X_train_sndarray,形状 (120,4)标准化后的训练特征,传入 GaussianNB.fit()X_train_s
y_trainarray_like训练标签,用于统计各类别样本数及各类别下各特征的 μkjσkj2y_train
X_test_sndarray,形状 (30,4)标准化后的测试特征,传入 model.predict()X_test_s
返回值 (y_pred)ndarray,形状 (30,)硬分类预测标签,来自 MAP 决策 y^=argmaxc[lnP(c)+lnP(xj|c)]y_pred

示例代码

python
model = train_model(X_train_s, y_train)
y_pred = model.predict(X_test_s)

理解重点

  • train_model(...)fit() 内部:扫描数据 → 统计 nk → 估计 P(Y=ck) → 每类每特征计算 μkjσkj2 → 应用 var_smoothing。不涉及任何迭代。
  • predict(...) 内部:对每个测试样本计算所有类别的后验概率(对数形式),选最大值——这是纯粹的代数运算。
  • y_pred 是后续混淆矩阵的直接输入。

5. 概率输出

参数速览

适用 API:model.predict_proba(X_test_s)

参数名类型说明示例取值
X_test_sndarray,形状 (30,4)标准化后的测试特征X_test_s
返回值 (y_scores)ndarray,形状 (30,3)每个测试样本属于各类别的后验概率 P(Y=ck|x),每行和为 1y_scores

示例代码

python
y_scores = model.predict_proba(X_test_s)

理解重点

  • GaussianNB 的概率输出来自贝叶斯公式:P(ck|x)P(ck)jN(xj|μkj,σkj2)
  • 这些概率是连续的,因为高斯似然是连续分布——这与 KNN 的离散邻域频率概率输出本质不同。
  • y_scores 直接支撑多分类 One-vs-Rest ROC 曲线:三分类任务会对每个类别各画一条 ROC。

6. 决策边界需要单独训练 model_2d

参数速览

参数名类型说明示例取值
pcaPCA(n_components=2, random_state=42)将 4 维标准化特征投影到 2 维主成分空间pca
X_all_sndarray,形状 (150,4)全量标准化特征,用于 PCA 拟合scaler.transform(X)
X_2dndarray,形状 (150,2)PCA 二维投影后的全量特征,用于画散点pca.fit_transform(X_all_s)
model_2dGaussianNB()在 PCA 二维空间单独训练的高斯朴素贝叶斯,专用于决策边界绘图model_2d

示例代码

python
pca = PCA(n_components=2, random_state=42)
X_all_s = scaler.transform(X)
X_2d = pca.fit_transform(X_all_s)
model_2d = GaussianNB()
model_2d.fit(pca.transform(X_train_s), y_train)

理解重点

  • model_2d 不是主评估模型——它的唯一目的是在二维空间提供可绘制的决策边界。
  • 主模型 model 训练在原始 4 维标准化空间,model_2d 训练在 PCA 2 维空间——两者是独立的对象,职责完全不同。
  • PCA 降维会损失信息,因此 model_2d 的边界只是原始高维分类面的近似投影展示。

7. 学习曲线使用新的模型实例

参数速览

适用函数:plot_learning_curve(GaussianNB(), X_train_s, y_train, ...)

参数名类型说明示例取值
estimatorGaussianNB新创建的 GaussianNB() 实例,学习曲线内部会克隆和重复训练GaussianNB()
Xndarray,形状 (120,4)标准化后的训练特征矩阵X_train_s
yarray_like训练标签向量y_train
scoringstr评分类指标,当前取 "accuracy""accuracy"
cvint交叉验证折数,默认 55

示例代码

python
plot_learning_curve(
    GaussianNB(),
    X_train_s,
    y_train,
    title="朴素贝叶斯 学习曲线",
    dataset_name=DATASET,
    model_name=MODEL,
)

理解重点

  • 传入的是 GaussianNB() 新实例而非 model——因为 plot_learning_curve 内部会通过 learning_curve() 函数多次克隆和训练模型。
  • 学习曲线函数会按不同训练样本量(如 10%、33%、55%、78%、100%)做交叉验证,绘制训练得分和验证得分的变化趋势。

训练诊断可视化

学习曲线

常见坑

  1. predict(...)predict_proba(...) 混为一谈——前者用于混淆矩阵(硬分类标签),后者用于 ROC 曲线(概率输出)。
  2. model_2d 误认为正式预测模型——它只在 PCA 2D 空间训练,仅服务于决策边界可视化。
  3. 忘记标准化必须在训练集上 fit_transform、测试集上 transform——在切分之前标准化是数据泄露。
  4. 混淆主模型(4 维空间正式预测)、二维可视化模型(PCA 空间画边界)和学习曲线模型(CV 循环克隆)的三者职责。

小结

  • 当前 Naive Bayes 流水线的训练过程:复制数据 → 特征/标签拆分 → 切分(stratify=y)→ 标准化 → 训练主模型 → 硬分类预测 → 概率输出。
  • 三个模型实例各司其职:model(4 维主评估)、model_2d(PCA 2D 可视化)、GaussianNB()(学习曲线克隆)。
  • GaussianNB 的训练(fit)和预测(predict/predict_proba)都是纯代数运算,不涉及迭代——这是它在工程上区别于逻辑回归的最显著特征。