plsregression能绕过$(x^tx)^{-1}$不可逆问题,因其不依赖矩阵求逆,而是通过迭代提取x与y协方差最大的潜变量方向(t和u),天然规避秩亏风险。

PLSRegression 为什么能绕过 (XᵀX)⁻¹ 不可逆问题
普通最小二乘法(LinearRegression)求解依赖于矩阵 X.T @ X 的逆。当样本数 n 小于变量数 p(即“宽数据”),或 X 列之间高度相关时,X.T @ X 秩亏、行列式为 0,直接报错 LinAlgError: Singular matrix。而 PLSRegression 根本不计算这个逆——它通过迭代提取 t = X @ w(X得分)和 u = Y @ c(Y得分),每次只找一个与 X 和 Y 协方差最大的方向,天然避开矩阵求逆步骤。
实操建议:
- 遇到
LinAlgError: Singular matrix时,不要急着加岭回归(Ridge),先试试PLSRegression(n_components= min(n-1, p)) -
n_components必须 ≤min(n_samples, n_features),否则fit()会抛ValueError - 若
X是稀疏矩阵(如基因表达计数),PLSRegression仍可运行,但需先转稠密(.toarray()),否则报TypeError: unsupported operand type
标准化不是可选项,而是强制前置条件
PLSRegression 内部默认对 X 和 Y 同时做中心化(减均值),但**不自动缩放**。如果变量量纲差异大(比如 pH 值在 0–14,基因表达量在 0–10⁴),未标准化会导致权重全被高方差变量主导,w 向量实际只反映尺度而非相关性。
正确做法是手动标准化:
- 用
StandardScaler分别处理X和Y,再传入PLSRegression - 不要只标准化
X而忽略Y:PLS 优化目标是协方差X.T @ Y,Y不缩放会使得分u失真 - 预测时,必须用训练集的
scaler_x和scaler_y分别 transform 新数据,不能重新 fit
选多少个成分(n_components)直接影响过拟合风险
n_components 不是越大越好。它本质是模型复杂度开关:设为 1 时只保留最强协方差方向,设为 min(n,p)-1 时几乎等价于 OLS(但依然稳定)。常见错误是盲目设成最大允许值,导致在小样本上严重过拟合。
推荐策略:
- 从 1 开始递增,用交叉验证看
mean_squared_error或r2_score是否持续改善 - 观察
pls.x_scores_的奇异值衰减——若第 3 个成分的得分标准差已降到第一个的 10% 以下,通常无需更多成分 - 对
n=50, p=2000这类数据,n_components=3~5往往比 10 更鲁棒;超过 8 就要警惕测试集性能跳崖
predict() 输出的是原始 Y 尺度,但 score() 默认用 R²
PLSRegression.predict(X_test) 返回的预测值单位、量级与原始 y_train 一致,这点和 LinearRegression 一样。但它的 score() 方法返回的是决定系数 R²,不是 MSE 或 MAE——容易误判模型好坏,尤其当 Y 均值接近 0 或方差极小时,R² 可能为负却仍被当作“可用”。
务必额外计算:
-
mean_squared_error(y_test, y_pred)看绝对误差水平 -
np.corrcoef(y_test, y_pred)[0,1]看预测与真实值的线性关联强度 - 对生物/化学数据,常看
RMSEP(预测残差标准差),即np.sqrt(mean_squared_error(...))
真正关键的不是 PLS 本身多神奇,而是你有没有在标准化、成分数、评估指标这三个地方踩准节奏——漏掉任何一个,它就退化成另一个黑箱工具。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











