偏最小二乘回归
一、直观理解:在共线的一堆 里,找出最能预测 的综合方向
普通最小二乘在以下情况会难受:
- 变量很多,甚至 或 ;
- 变量之间高度相关(多重共线);
- 直接删变量又怕丢掉有用信息。
偏最小二乘回归(PLS, Partial Least Squares)不直接在原始 上硬回归,而是抽取少数几个潜变量(成分) ,这些方向既反映 的变异,又尽量与 (或 )相关,然后在潜变量空间做回归。
与 PCA 回归(PCR)对比:
- PCA:只看 方差最大方向,可能对 无用;
- PLS:有监督,优先保留对 有预测力的方向。
二、适用场景与优缺点
| 类型 | 说明 |
|---|---|
| 适用场景 | 光谱、问卷多指标、经济多指标等高维共线数据; 较大、 中等;需要比岭回归更偏“成分解释”的方案;多因变量 也可。 |
| 核心优点 | 能在共线下稳定预测;成分数可用 CV 选择;可输出 权重/载荷与 VIP 重要性;对 仍可算。 |
| 局限与缺点 | 成分解释不如原始变量直观;非线性关系需核 PLS 等扩展;仍可能过拟合(成分过多);不是因果模型;极端非线性时树模型可能更好。 |
三、核心原理
对中心化(常再标准化)的 、,NIPALS/SIMPLS 等算法迭代地寻找权重 ,使得分 与 的协方差最大:
抽出 后,从 中剥离其解释部分,再提下一个成分。 个成分后:
并可把系数映射回原始变量,得到与 OLS 类似的 ,便于报告。
成分数 是关键超参数: 太小欠拟合,太大接近普通最小二乘并失去正则效果。
四、成分数选择与评价
- 仅在训练集上标准化;
- 用 K 折交叉验证或时间序列滚动验证画 RMSE();
- 选最小 CV 误差附近更小的 (简约);
- 在独立测试集报告最终 RMSE/MAE;
- 与 OLS(若可算)、岭回归、主成分回归、随机森林对比。
VIP(Variable Importance in Projection)可辅助解释变量贡献,但不要把它当成严格 p 值。
五、MATLAB 示例
%% 共线高维回归:PLS vs OLS
rng(21);
n = 80; p = 30;
W = randn(n,5);
X = W * randn(5,p) + 0.1*randn(n,p); % 低秩共线结构
betaTrue = zeros(p,1); betaTrue(1:5) = [2;-1;1.5;0;-0.8];
y = X*betaTrue + 0.5*randn(n,1);
% 划分
tr = 1:60; te = 61:n;
Xtr = X(tr,:); ytr = y(tr);
Xte = X(te,:); yte = y(te);
% 标准化(只用训练集参数)
muX = mean(Xtr); sdX = std(Xtr); sdX(sdX==0)=1;
XtrZ = (Xtr - muX)./sdX;
XteZ = (Xte - muX)./sdX;
muY = mean(ytr); ytrC = ytr - muY;
% CV 选成分数
maxK = 10;
cvRMSE = zeros(maxK,1);
Kfold = 5;
idx = crossvalind("Kfold", numel(ytr), Kfold);
for k = 1:maxK
se = 0; cnt = 0;
for f = 1:Kfold
val = (idx==f); cal = ~val;
[~,~,~,~,beta] = plsregress(XtrZ(cal,:), ytrC(cal), k);
yhat = [ones(sum(val),1) XtrZ(val,:)] * beta;
se = se + sum((ytrC(val) - yhat).^2);
cnt = cnt + sum(val);
end
cvRMSE(k) = sqrt(se/cnt);
end
[~,kBest] = min(cvRMSE);
fprintf("CV 选择成分数 k=%d\n", kBest);
figure; plot(1:maxK, cvRMSE, "-o");
xlabel("成分数 k"); ylabel("CV RMSE"); title("PLS 成分数选择");
grid on;
% 最终模型
[XL,YL,XS,YS,beta,PCTVAR,MSE,stats] = plsregress(XtrZ, ytrC, kBest);
yhat_te = muY + [ones(numel(te),1) XteZ] * beta;
rmse = sqrt(mean((yte - yhat_te).^2));
fprintf("测试 RMSE (PLS)=%.4f\n", rmse);
% OLS 对照(p < n 时可算)
mdl = fitlm(Xtr, ytr);
yols = predict(mdl, Xte);
rmseOLS = sqrt(mean((yte - yols).^2));
fprintf("测试 RMSE (OLS)=%.4f\n", rmseOLS);
% 回归系数(原标准化尺度)与 VIP 近似
b = beta(2:end);
figure; bar(b); title("PLS 系数(标准化 X)"); xlabel("变量");
% 简单 VIP
% weights W from stats.W
W = stats.W;
T = XS;
pveY = zeros(kBest,1);
for k = 1:kBest
pveY(k) = corr(T(:,k), ytrC)^2;
end
vip = zeros(p,1);
for j = 1:p
vip(j) = sqrt(p * sum((W(j,:).^2(:)).*pveY(:)) / sum(pveY));
end
figure; bar(vip); yline(1,"r--"); title("VIP(>1 常视为重要)");
plsregress 的 beta 第一行是截距(对已中心化 时截距为 0,上式我们外部加了 muY)。
六、如何解释结果
报告要点:
- 为何不用普通 OLS(共线、 大、VIF);
- 标准化方式;
- CV 曲线与选定 ,及 / 方差解释比例
PCTVAR; - 测试集误差与 OLS/岭/PCR 对比;
- 载荷/权重:前几个成分主要由哪些变量构成;
- VIP 或 排序(谨慎解释);
- 局限:线性潜结构假设、成分命名的主观性。
七、常见误区
1. 用全样本标准化再划分
泄漏。均值方差必须来自训练折。
2. 成分数直接取很大
CV 误差转而上升时要停下,不要追求训练 。
3. 把 PLS 系数当成精确因果效应
仍是观测相关结构下的预测模型。
4. 与 PCA 混淆
PCA 无监督;PLS 盯着 。做预测时 PLS 通常更相关。
5. 非线性问题硬上线性 PLS
可先做变换,或改用树模型/核方法。
八、小结
偏最小二乘回归的核心是:
提取与响应相关的潜变量,在共线甚至高维情形下给出稳定的线性预测,并用交叉验证选择成分数。
它是“变量很多且相关”时的首选经典工具之一,MATLAB 中 plsregress 即可完成。验收标准仍是:交叉验证与独立测试误差、与基线对比、以及可复现的预处理流程,而不是单一的训练 。