支持向量回归
一、直观理解:允许一条“误差管道”,管道外的点才施压
支持向量回归(SVR)寻找函数 ,使得尽可能多的样本落在宽度为 的管道内;只有超出管道的残差才计入损失,并通过 惩罚:
约束大致为 等。 管道内的误差被“忽略”,模型更关注整体边界形状;核函数 把非线性关系变成高维线性。
相对随机森林,SVR 在中小样本、特征已较好构造、需要光滑决策面时有时更优,但对尺度与超参更敏感,所以竞赛里通常先 RF,再视情况尝试 SVR。
二、适用场景与优缺点
| 类型 | 说明 |
|---|---|
| 适用场景 | 中小样本;特征维度中等;噪声中需一定鲁棒;核技巧可捕捉光滑非线性;已标准化特征。 |
| 核心优点 | 有清晰的间隔/管道思想;核灵活;凸优化,解全局最优(对偶意义);支持向量稀疏。 |
| 局限与缺点 | 敏感;大数据慢;解释性弱;特征尺度影响大;时间序列仍需人工滞后与时间切分。 |
三、核心原理
1. -不敏感损失
与平方损失相比,对小误差不敏感,对大误差线性增长(相对平方更抗部分异常)。
2. 核技巧
常见 RBF 核:
大 → 局部剧烈,易过拟合; 小 → 过于平滑。线性核适合近似线性问题,更快。
3. 支持向量
落在管道边界或之外的样本成为支持向量,决定 。支持向量很少时模型更省。
四、实战要点
- 必须标准化(
zscore仅用训练集参数); - 网格/贝叶斯优化 ;
- 时间数据禁止随机打乱;
- 先试线性 SVR,再 RBF;
- 与
fitlm、随机森林对比; - 样本很大时考虑
fitrkernel近似或改树模型。
五、MATLAB 示例
rng(15);
n = 300;
x = linspace(-3,3,n)';
y = sin(x) + 0.1*x.^2 + 0.2*randn(n,1);
X = [x, x.^2]; % 也可只给 x 让 RBF 自己学
T0 = 220;
Xtr = X(1:T0,:); ytr = y(1:T0);
Xte = X(T0+1:end,:); yte = y(T0+1:end);
% 标准化
mu = mean(Xtr); sd = std(Xtr); sd(sd==0)=1;
XtrZ = (Xtr-mu)./sd; XteZ = (Xte-mu)./sd;
% 线性 SVR
MdlL = fitrsvm(XtrZ, ytr, "KernelFunction","linear", ...
"BoxConstraint",1, "Epsilon",0.1, "Standardize",false);
yL = predict(MdlL, XteZ);
% RBF SVR + 粗网格
Cs = [0.1 1 10 100];
Gs = [0.1 1 10];
Es = [0.05 0.1 0.2];
best = struct("rmse",Inf);
for C = Cs
for g = Gs
for ep = Es
Mdl = fitrsvm(XtrZ, ytr, "KernelFunction","rbf", ...
"BoxConstraint",C, "KernelScale",1/sqrt(g), ...
"Epsilon",ep, "Standardize",false);
% 注意:KernelScale 与 gamma 定义因版本而异,也可用 'auto'
yp = predict(Mdl, XteZ);
rmse = sqrt(mean((yte-yp).^2));
if rmse < best.rmse
best = struct("rmse",rmse,"C",C,"g",g,"ep",ep,"Mdl",Mdl,"yp",yp);
end
end
end
end
fprintf("线性测试 RMSE=%.4f\n", sqrt(mean((yte-yL).^2)));
fprintf("RBF 最优 RMSE=%.4f (C=%.2g, ep=%.2g)\n", best.rmse, best.C, best.ep);
% 更省事:自动核尺度 + 贝叶斯优化(耗时)
% MdlB = fitrsvm(XtrZ,ytr,"KernelFunction","rbf", ...
% "OptimizeHyperparameters","auto", ...
% "HyperparameterOptimizationOptions",struct("ShowPlots",false));
figure;
plot(x(T0+1:end), yte, "k"); hold on;
plot(x(T0+1:end), best.yp, "r","LineWidth",1.2);
legend("真实","SVR"); title("支持向量回归测试段");
fprintf("支持向量占比=%.2f%%\n", 100*numel(best.Mdl.SupportVectors)/T0);
若 KernelScale 与文献 对应让人困惑,竞赛中可统一:
Mdl = fitrsvm(Xtr, ytr, "KernelFunction","rbf", "Standardize",true, ...
"BoxConstraint",10, "Epsilon",0.1, "KernelScale","auto");
六、如何解释结果
报告:
- 是否标准化、特征列表;
- 核类型与超参选择协议(网格/优化目标);
- 支持向量数量与占比;
- 测试 RMSE/MAE,对比线性回归与随机森林;
- 残差图;
- 说明 SVR 系数在 RBF 下不可直接当边际效应,解释改用部分依赖或 SHAP。
七、常见误区
1. 不标准化就上 RBF
某一维范围大会主导距离。
2. 超参拍脑袋
与 差一个数量级,结果天壤之别。
3. 大数据硬上全核 SVR
训练 难承受,改森林/提升/核近似。
4. 时间序列随机交叉验证
泄漏问题与其他 ML 相同。
5. 只看训练拟合
SVR 同样会过拟合高 。
八、小结
支持向量回归的核心是:
在 管道内容忍误差,用(核)间隔思想学习光滑回归函数,并通过 平衡平整与拟合。
它是中小样本非线性回归的重要选项,但超参与尺度敏感。MATLAB 使用 fitrsvm。建议流程:标准化 → 时间/折外验证调参 → 与随机森林和线性基线比较。最终以训练期外误差为准,不要只看 。