跳到主要内容

支持向量回归

一、直观理解:允许一条“误差管道”,管道外的点才施压​

支持向量回归(SVR)寻找函数 f(x)=w⊤ϕ(x)+bf(x)=w^\top\phi(x)+b,使得尽可能多的样本落在宽度为 2ε2\varepsilon 的管道内;只有超出管道的残差才计入损失,并通过 CC 惩罚:

min⁡w,b,ξ,ξ∗ 12∥w∥2+C∑i(ξi+ξi∗)\min_{w,b,\xi,\xi^*}\ \frac12\|w\|^2+C\sum_i(\xi_i+\xi_i^*)

约束大致为 yi−f(xi)≤ε+ξiy_i-f(x_i)\le\varepsilon+\xi_i 等。ε\varepsilon 管道内的误差被“忽略”,模型更关注整体边界形状;核函数 ϕ\phi 把非线性关系变成高维线性。

相对随机森林,SVR 在中小样本、特征已较好构造、需要光滑决策面时有时更优,但对尺度与超参更敏感,所以竞赛里通常先 RF,再视情况尝试 SVR。

二、适用场景与优缺点​

类型说明
适用场景中小样本;特征维度中等;噪声中需一定鲁棒;核技巧可捕捉光滑非线性;已标准化特征。
核心优点有清晰的间隔/管道思想;核灵活;凸优化,解全局最优(对偶意义);支持向量稀疏。
局限与缺点C,ε,γC,\varepsilon,\gamma 敏感;大数据慢;解释性弱;特征尺度影响大;时间序列仍需人工滞后与时间切分。

三、核心原理​

1. ε\varepsilon-不敏感损失​

Lε(r)={0,∣r∣≤ε∣r∣−ε,∣r∣>εL_\varepsilon(r)=\begin{cases} 0,&|r|\le\varepsilon\\ |r|-\varepsilon,&|r|>\varepsilon \end{cases}

与平方损失相比,对小误差不敏感,对大误差线性增长(相对平方更抗部分异常)。

2. 核技巧​

常见 RBF 核:

K(x,x′)=exp⁡(−γ∥x−x′∥2)K(x,x')=\exp(-\gamma\|x-x'\|^2)

γ\gamma 大 → 局部剧烈,易过拟合;γ\gamma 小 → 过于平滑。线性核适合近似线性问题,更快。

3. 支持向量​

落在管道边界或之外的样本成为支持向量,决定 ff。支持向量很少时模型更省。

四、实战要点​

  1. 必须标准化(zscore 仅用训练集参数);
  2. 网格/贝叶斯优化 C,ε,γC,\varepsilon,\gamma;
  3. 时间数据禁止随机打乱;
  4. 先试线性 SVR,再 RBF;
  5. 与 fitlm、随机森林对比;
  6. 样本很大时考虑 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 与文献 γ\gamma 对应让人困惑,竞赛中可统一:

Mdl = fitrsvm(Xtr, ytr, "KernelFunction","rbf", "Standardize",true, ...
"BoxConstraint",10, "Epsilon",0.1, "KernelScale","auto");

六、如何解释结果​

报告:

  1. 是否标准化、特征列表;
  2. 核类型与超参选择协议(网格/优化目标);
  3. 支持向量数量与占比;
  4. 测试 RMSE/MAE,对比线性回归与随机森林;
  5. 残差图;
  6. 说明 SVR 系数在 RBF 下不可直接当边际效应,解释改用部分依赖或 SHAP。

七、常见误区​

1. 不标准化就上 RBF​

某一维范围大会主导距离。

2. 超参拍脑袋​

CC 与 γ\gamma 差一个数量级,结果天壤之别。

3. 大数据硬上全核 SVR​

训练 O(n2∼n3)O(n^2\sim n^3) 难承受,改森林/提升/核近似。

4. 时间序列随机交叉验证​

泄漏问题与其他 ML 相同。

5. 只看训练拟合​

SVR 同样会过拟合高 γ\gamma。

八、小结​

支持向量回归的核心是:

在 ε\varepsilon 管道内容忍误差,用(核)间隔思想学习光滑回归函数,并通过 CC 平衡平整与拟合。

它是中小样本非线性回归的重要选项,但超参与尺度敏感。MATLAB 使用 fitrsvm。建议流程:标准化 → 时间/折外验证调参 → 与随机森林和线性基线比较。最终以训练期外误差为准,不要只看 R2R^2。