Skip to content

训练与预测

本章目标

  1. 理解 SVR 流水线的完整执行顺序——从数据加载到残差图和学习曲线输出。
  2. 理解 SVR 的训练过程——SMO 迭代求解对偶问题,不可见但关键。
  3. 理解 SVR 的预测方式——支持向量与测试点的核函数加权求和,而非矩阵乘法。

重点方法与概念速览

名称类型作用
loadSvrDataset()方法生成 Friedman1 非线性数据——返回 (200, 11) DataFrame
StandardScaler预处理Z-score 标准化——RBF 核距离计算的前置条件
trainSvrRegressionModel(...)函数构建并 fit SVR 模型——SMO 迭代求解
model.predict(X_test_s)方法支持向量与测试点的核函数加权求和预测
plot_residuals(...)函数残差诊断图
plot_learning_curve(...)函数学习曲线——使用新 SVR(...) 实例

1. 完整流水线流程

流程概述

loadSvrDataset()

    ├─ ① X = data.drop(columns=["price"]), y = data["price"]
    ├─ ② X_train, X_test, y_train, y_test = train_test_split(test_size=0.2)
    ├─ ③ scaler = StandardScaler(); X_train_s = scaler.fit_transform(X_train)
    ├─ ④ X_test_s = scaler.transform(X_test)
    ├─ ⑤ model = trainSvrRegressionModel(X_train_s, y_train)
    ├─ ⑥ y_pred = model.predict(X_test_s)
    ├─ ⑦ plot_residuals(y_test, y_pred)
    └─ ⑧ plot_learning_curve(SVR(C=10.0, epsilon=0.1, kernel='rbf', gamma='scale'), X_train_s, y_train, scoring='r2')

参数速览

步骤操作输入输出说明
加载数据loadSvrDatasetDataFrame(200, 11)Friedman1 非线性数据
特征标签拆分drop + 列选择DataFrameX(200,10), y(200,)标签列 price
数据切分train_test_splitX, yX_train(160,10), X_test(40,10)test_size=0.2
标准化StandardScalerX_train, X_testX_train_s, X_test_sSVR(RBF 核)必需
训练trainSvrRegressionModelX_train_s, y_trainSVR 模型SMO 迭代求解
预测model.predictX_test_sy_pred(40,)核函数加权求和
残差图plot_residualsy_test, y_predPNG 图像误差分布诊断
学习曲线plot_learning_curveSVR(...), X_train_s, y_trainPNG 图像样本量-得分趋势

理解重点

  • SVR 流水线为 8 步——与线性回归(6 步)相比多了标准化(③④),与正则化回归(8 步)步骤数相同但无多模型循环。
  • 标准化必须在切分之后——与正则化回归一致。
  • SVR 没有特征重要性可视化——PipelineSpec 中训练后诊断列表为 []。RBF 核的权重在对偶空间无法映射回原始特征。

2. 标准化:RBF 核训练的关键前置

参数速览

参数名类型说明示例取值
X_trainndarray(160, 10)未标准化的训练特征原始 Friedman1 各列
X_train_sndarray(160, 10)标准化后——每列 μ=0, σ=1
X_test_sndarray(40, 10)使用训练集统计量标准化

理解重点

  • RBF 核计算 exp(γxixj2)——欧氏距离对尺度极敏感。若某特征量级为 100 而其他为 0.1,该特征将完全主导核计算。
  • 标准化使所有特征在核距离中平等——这是 RBF 核 SVR 必须标准化的数学原因。
  • fit_transform 仅用于训练集,transform 用于测试集——这是数据泄露的基本防护。

3. 训练细节:SMO 迭代求解

参数速览

参数名类型说明示例取值
优化算法SMO(Sequential Minimal Optimization)scikit-learn 内部实现
优化变量αi,αi——共 2×160=320 个变量
目标最大化对偶问题——凸二次规划
终止条件对偶间隙 < tol(默认 1e-3)tol=1e-3

理解重点

  • SVR 的训练是不可见的迭代过程——不像决策树那样可以观察分裂步骤,也不像线性回归的一步到位。
  • 训练复杂度约 O(N2d)O(N3)——在 160 样本上毫秒级完成。
  • 训练过程是确定性的——对偶问题为凸优化,给定相同数据必然收敛到相同解。因此 SVR 无需 random_state 参数。
  • 训练完成后,大部分样本的 αiαi=0——它们被 ε-管道"忽视",不参与预测。

4. 预测细节:核函数加权求和

参数速览

参数名类型说明示例取值
X_test_sndarray(40, 10)标准化后的测试特征
model.support_ndarray(nSV,)支持向量索引——仅这些样本参与预测
model.dual_coef_ndarray(1, nSV)αiαi 的值——支持向量的权重
y_predndarray(40,)预测值
f(x)=iSV(αiαi)K(xi,x)+b

理解重点

  • 预测不是 Xw+b 的矩阵乘法——而是与支持向量逐一计算核函数再加权求和。
  • 预测复杂度 O(nSVNtestd)——支持向量越多预测越慢。
  • 支持向量占比(nSV / N_train)直接决定了预测成本——通常为 30%~60%。
  • 这与线性回归形成鲜明对比——线性回归的预测是固定 O(Ntestd),与训练集大小无关。

5. SVR 预测 vs 线性回归预测 对比

预测维度线性回归SVR(RBF 核)
公式y^=Xw+by^=(αiαi)K(xi,x)+b
复杂度O(Ntestd)O(nSVNtestd)
依赖训练集否——参数已固化为 w是——需要存储支持向量集
参与计算的样本无——仅用参数仅支持向量——管道内样本被忽略
内存占用O(d)——仅存储系数O(nSVd)——存储支持向量

6. SVR vs 线性回归 vs 正则化回归 训练对比

训练维度线性回归正则化回归SVR
数据合成 (200, 3)真实+构造 (442, 21)合成非线性 (200, 10)
标准化StandardScalerStandardScaler
训练算法SVD 闭式解坐标下降(Lasso/EN)+ 闭式解(Ridge)SMO——序列最小优化
训练模型数13(并行)1
收敛判断不需要max_iter(Lasso/EN)对偶间隙 < tol
预测Xw+bXw+b(αiαi)K(xi,x)+b
评估可视化残差图 + 学习曲线残差图 + 特征重要性残差图 + 学习曲线
独有诊断coef_ 对照真实公式近零系数计数支持向量数量 + 占比

常见坑

  1. 期待 SVR(RBF 核)输出 coef_——线性核才有 coef_,RBF 核的权重在 dual_coef_ 中,不可直接解释。
  2. 预测时传未标准化的 X_test——RBF 核的欧氏距离对尺度敏感,未标准化会导致预测结果严重偏离。
  3. 忽略支持向量数量——如果 nSV 接近 N_train(如 > 90%),说明模型近乎"记住"了所有训练样本,可能严重过拟合。
  4. 认为 SVR 也是一步到位——训练过程是 SMO 迭代,虽然对 160 样本几乎瞬时,但对大规模数据会显著变慢。

小结

  • SVR 流水线为 8 步:加载 → 拆分 → 切分 → 标准化 → 训练 → 预测 → 残差图 → 学习曲线。无特征重要性。
  • 标准化是 SVR(RBF 核)的硬性要求——欧氏距离对特征尺度敏感。
  • 训练使用 SMO 迭代求解凸二次规划——确定性过程,220 个变量(2N)在小样本上瞬时完成。
  • 预测是支持向量与测试点的核函数加权求和——与线性回归的矩阵乘法本质不同,复杂度依赖支持向量数量。