内容摘要:
本文聚焦偏最小二乘回归(PLS)中的交叉有效性检验方法,详解其原理与实现流程。通过预测误差平方和(PRESS)与误差平方和(SS)的计算,结合交叉有效性指标
Q
h
2
Q_h^2
Qh2的阈值判断,系统阐述如何科学选择PLS成分数量以避免过拟合。结合化学分析与经济预测案例,展示Matlab代码实现步骤,为高维数据建模提供可靠性保障。
关键词:偏最小二乘回归 交叉验证 预测误差 PRESS 成分选择
1. PLS交叉验证的核心意义
在偏最小二乘回归(PLS)建模中,成分数量的选取直接影响模型性能:
- 成分过少:模型欠拟合,无法捕捉数据关键特征。
- 成分过多:模型过拟合,泛化能力下降。
交叉有效性检验(Cross-Validation)通过量化预测误差,为成分数量提供客观选择依据,尤其在小样本、高维数据场景中至关重要。
2. 交叉有效性检验原理与公式推导
2.1 预测误差平方和(PRESS)
定义:在剔除第
i
i
i个样本后,利用剩余样本建立PLS模型,计算第
i
i
i个样本的预测误差平方和。
对于
h
h
h个成分的模型,总PRESS值计算公式为:
PRESS
(
h
)
=
∑
i
=
1
n
(
y
i
−
y
^
i
(
−
i
)
(
h
)
)
2
\text{PRESS}(h) = \sum_{i=1}^n \left( y_i - \hat{y}_{i(-i)}^{(h)} \right)^2
PRESS(h)=i=1∑n(yi−y^i(−i)(h))2
其中:
- y i y_i yi:第 i i i个样本的真实因变量值
- y ^ i ( − i ) ( h ) \hat{y}_{i(-i)}^{(h)} y^i(−i)(h):使用 h h h个成分且剔除第 i i i个样本后的模型预测值
2.2 误差平方和(SS)
定义:全样本建模时的误差平方和,反映模型拟合优度:
SS
(
h
)
=
∑
i
=
1
n
(
y
i
−
y
^
i
(
h
)
)
2
\text{SS}(h) = \sum_{i=1}^n \left( y_i - \hat{y}_i^{(h)} \right)^2
SS(h)=i=1∑n(yi−y^i(h))2
2.3 交叉有效性指标 Q h 2 Q_h^2 Qh2
通过比较PRESS与SS的变化,定义交叉有效性指标:
Q
h
2
=
1
−
PRESS
(
h
)
SS
(
h
−
1
)
Q_h^2 = 1 - \frac{\text{PRESS}(h)}{\text{SS}(h-1)}
Qh2=1−SS(h−1)PRESS(h)
判断规则:
- 若 Q h 2 ≥ 0.0975 Q_h^2 \geq 0.0975 Qh2≥0.0975,继续提取第 h h h个成分。
- 若 Q h 2 < 0.0975 Q_h^2 < 0.0975 Qh2<0.0975,停止提取成分,最终模型成分数为 h − 1 h-1 h−1。
3. 交叉验证实现步骤详解
3.1 数据准备与分块
将数据集分为 k k k个子集(通常 k = 5 k=5 k=5或 10 10 10),依次将每个子集作为验证集,其余作为训练集。
示例:5折交叉验证
数据集
=
D
1
∪
D
2
∪
D
3
∪
D
4
∪
D
5
\text{数据集} = D_1 \cup D_2 \cup D_3 \cup D_4 \cup D_5
数据集=D1∪D2∪D3∪D4∪D5
每次选择
D
i
D_i
Di为验证集,其余4个子集合并为训练集。
3.2 迭代计算PRESS与SS
对于每个候选成分数 h h h:
- 训练阶段:用训练集数据拟合 h h h个成分的PLS模型。
- 预测阶段:计算验证集样本的预测值 y ^ i ( h ) \hat{y}_i^{(h)} y^i(h)。
- 误差累积:累加所有验证集的预测误差,得到 PRESS ( h ) \text{PRESS}(h) PRESS(h)。
3.3 确定最优成分数
绘制 Q h 2 Q_h^2 Qh2随成分数变化的曲线,选择 Q h 2 Q_h^2 Qh2首次低于阈值时的前一个成分数。
示例曲线分析:
成分数 h h h | 1 | 2 | 3 | 4 |
---|---|---|---|---|
Q h 2 Q_h^2 Qh2 | 0.85 | 0.65 | 0.25 | 0.05 |
根据阈值0.0975,最优成分数为 h = 2 h=2 h=2。
4. Matlab代码实现
4.1 数据标准化与分块
% 数据标准化
X = zscore(original_X);
Y = zscore(original_Y);
% 5折交叉验证分块
cv = cvpartition(size(X,1), 'KFold', 5);
4.2 PRESS与SS计算核心代码
max_components = 10;
PRESS = zeros(max_components, 1);
SS = zeros(max_components, 1);
for h = 1:max_components
for fold = 1:cv.NumTestSets
train_idx = cv.training(fold);
test_idx = cv.test(fold);
% 提取h个成分的PLS模型
[XL, YL, XS, YS, BETA] = plsregress(X(train_idx,:), Y(train_idx,:), h);
% 预测验证集
Y_pred = [ones(sum(test_idx),1), X(test_idx,:)] * BETA;
% 累加PRESS
PRESS(h) = PRESS(h) + sum((Y(test_idx,:) - Y_pred).^2);
end
% 全样本建模计算SS
[~, ~, ~, ~, BETA_full] = plsregress(X, Y, h);
Y_pred_full = [ones(size(X,1),1), X] * BETA_full;
SS(h) = sum((Y - Y_pred_full).^2);
end
4.3 交叉有效性指标计算
Q_h_sq = 1 - PRESS(2:end) ./ SS(1:end-1);
optimal_h = find(Q_h_sq >= 0.0975, 1, 'last') + 1;
5. 实战案例:汽油辛烷值预测
5.1 数据集与问题描述
- 数据来源:60组汽油样本的近红外光谱数据(401个波长自变量)
- 目标:预测辛烷值(因变量)
- 挑战:自变量维度高(401维),样本量少(60个),存在多重共线性
5.2 交叉验证结果分析
成分数 h h h | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
Q h 2 Q_h^2 Qh2 | 0.92 | 0.81 | 0.43 | 0.12 | 0.03 |
结论:选择 h = 2 h=2 h=2个成分时, Q h 2 = 0.81 > 0.0975 Q_h^2=0.81 > 0.0975 Qh2=0.81>0.0975;当 h = 3 h=3 h=3时, Q h 2 = 0.43 Q_h^2=0.43 Qh2=0.43仍满足条件,但 h = 4 h=4 h=4时 Q h 2 = 0.12 < 0.0975 Q_h^2=0.12 < 0.0975 Qh2=0.12<0.0975,因此最优成分数为 h = 3 h=3 h=3。
5.3 模型性能对比
成分数 | RMSE(训练) | RMSE(测试) |
---|---|---|
2 | 0.32 | 0.48 |
3 | 0.18 | 0.35 |
4 | 0.09 | 0.52 |
结果表明:选择 h = 3 h=3 h=3时,模型在测试集上误差最小,验证了交叉有效性检验的可靠性。
6. 注意事项与优化策略
- 数据标准化:PLS对变量尺度敏感,必须对数据进行中心化或标准化处理。
- 分块策略:小样本数据建议使用留一法(LOO-CV),大样本可使用k折交叉验证。
- 阈值调整:0.0975为经验阈值,可根据实际需求微调。
- 可视化辅助:绘制 Q h 2 Q_h^2 Qh2曲线和预测误差趋势图,辅助决策。
7. 结语
交叉有效性检验是PLS建模中平衡模型复杂度与泛化能力的关键步骤。通过PRESS与SS的动态评估,结合清晰的阈值规则,可避免主观经验导致的过拟合风险。在实际应用中,需灵活调整分块策略与阈值参数,结合业务场景优化模型性能。