偏最小二乘回归实战:Matlab小样本高维数据预测建模全流程

📅 发布时间:2026/9/8 21:11:19
偏最小二乘回归实战:Matlab小样本高维数据预测建模全流程
简介Matlab PLS偏最小二乘法回归预测算法代码包面向科研人员、工程师及学生适用于多维变量回归建模、变量存在共线性等数据场景可快速完成从数据读取、PLS建模到结果评价的完整回归预测流程。资源共8个文件包含m主程序、Excel数据集、预测结果对比图、说明与常见问题文档等类型压缩包仅857KB轻量且结构清晰便于直接定位代码、数据与图示。代码中文注释清晰完整只需按照示例修改数据格式、替换Excel数据集即可运行同时附带训练集/测试集预测值对比图和详细评价指标可分别检查训练与测试阶段的拟合效果方便直观验证模型精度常见问题整理文档还能协助排查运行中的易错点。目前已有336人学习使用整体上手门槛低是开展回归预测分析与教学演示的实用工具。 做数据回归预测这几年我陆陆续续用过不少算法从最开始的多元线性回归到后来的岭回归、Lasso再到各种树模型和神经网络。但要论“小样本、多变量、变量之间还互相纠缠”这种场景下最省心的办法我首推偏最小二乘回归PLS。最近正好用Matlab完整做了一套PLS回归预测的流程包含测试集验证、可视化出图、评价指标计算整个过程踩了不少坑也沉淀了一些经验。这篇就把整个项目的来龙去脉、原理要点、代码思路和实测结果一次性讲清楚希望能帮你少走弯路。1. 为什么偏偏是PLS小样本高维数据的“解题捷径”先说说我为什么会盯上这个算法。之前处理过一组近红外光谱数据样本只有几十个但每个样本的光谱特征波长有几百个甚至上千个。这种数据扔给普通回归模型问题立刻就来了特征数量远超样本数量传统最小二乘法直接无法求解矩阵求逆这一步就崩了就算用逐步回归硬筛特征变量之间的多重共线性也会让回归系数极不稳定换个训练集结果就面目全非。偏最小二乘回归的核心思路简单说就是“两头都降维、而且让降维方向互相配合”。主成分回归PCR大家可能更熟悉它只对自变量X做PCA降维提取出能代表X内部方差最大的几个潜变量然后再用这些潜变量去回归Y。但这里有个隐患X里方差最大的方向未必和Y相关。有些光谱区域噪声很大方差也大PCA会把它们当成主成分提出来可它们对Y的解释能力几乎为零结果模型预测能力就很差。PLS的高明之处在于它在分解X的同时也分解Y并且在提取X的潜变量时要求这个潜变量不仅要尽可能多地解释X的方差还要尽可能地与Y相关。相当于每一步都在找一个“两头讨好”的方向既要能代表X又要能解释Y。这在大规模多重共线性数据处理里几乎是降维打击式的优势。拿我手上的场景来说自变量如果有几十个且两两相关系数动辄0.9以上普通回归模型的结果基本没法看而PLS可以稳定输出一个可解释、可验证的模型。再直白点你就把它理解成一种“带着预测目标去做特征压缩”的回归方法方向感比单纯的无监督降维准得多。2. 数据准备与测试集划分最容易翻车的一环做预测类项目数据划分几乎是决定成败的第一道关卡。很多新手拿到数据后直接全量训练然后用训练集自身的拟合效果来宣传“预测准确率”这是典型的自欺欺人。要验证算法的真实泛化能力测试集必须从训练阶段就彻底隔离。我的做法是先把原始数据整理成标准格式每一行是一个样本前若干列是自变量X最后一列是因变量Y。然后用Matlab的cvpartition或者简单的randperm做划分。要注意一点划分前务必设置随机种子否则每次跑出来的训练集和测试集都不一样后面对比实验就完全失去意义。rng(42); % 固定随机种子保证实验可复现 [m, ~] size(data); idx randperm(m); trainNum floor(m * 0.8); trainData data(idx(1:trainNum), :); testData data(idx(trainNum1:end), :); XTrain trainData(:, 1:end-1); YTrain trainData(:, end); XTest testData(:, 1:end-1); YTest testData(:, end);这里有个常常被忽略的细节数据的标准化处理必须基于训练集进行再用训练集的均值和标准差去转换测试集。很多代码是直接对全量数据做一次标准化再划分这其实已经把测试集的信息泄漏进了训练过程。正确做法是先用训练集计算均值和标准差再用这一套参数去标准化测试集。另一个切身的体会是当特征之间量纲差异巨大时比如有的特征在0.001量级波动有的特征在几千量级波动强烈建议在PLS之前先做标准化。PLS的潜变量提取本质上是基于协方差矩阵的量纲大的特征天然会占据更高的权重。虽然PLS对多重共线性免疫但并不意味着它对量纲差异无感。我实测过一组工业过程数据标准化前后模型的RMSE相差接近一倍效果非常明显。3. 潜变量个数怎么定交叉验证是唯一可靠的答案PLS里最关键的超参数就是潜变量个数latent variablesLV。选少了模型欠拟合很多有用的信息没被提取出来选多了模型过拟合把噪声也当成信号学到了。我在最开始做的时候靠“经验拍数”固定选5个潜伏变量结果在测试集上表现惨不忍睹。**正确的做法是通过K折交叉验证来确定最优潜变量数量。**原理很简单把训练集均分成K份轮流拿出1份当验证集其余K-1份用于训练PLS模型然后用验证集计算预测误差。对所有K次结果取平均就得到了当前潜变量个数下的交叉验证误差。遍历1到某个最大潜变量数选误差最小的那个。Matlab里做这件事很方便我记得plsregress函数本身就支持传CV参数直接输出10折交叉验证的均方根误差RMSE画出来的图会呈现一个典型的“U型曲线”或“L型曲线”。不过我还是更喜欢自己写交叉验证循环一是可以自由选择评价指标二是对过程心里更有数。rng(123); maxLV 15; cvRMSE zeros(maxLV, 1); K 10; indices crossvalind(Kfold, size(YTrain, 1), K); for lv 1:maxLV errs zeros(K, 1); for k 1:K validIdx (indices k); trainIdx ~validIdx; [~, ~, ~, ~, beta] plsregress(XTrain(trainIdx,:), YTrain(trainIdx,:), lv); yPred [ones(sum(trainIdx), 1), XTrain(trainIdx,:)] * beta; errs(k) sqrt(mean((YTrain(trainIdx) - yPred).^2)); end cvRMSE(lv) mean(errs); end [~, bestLV] min(cvRMSE);从我实测的数据来看随着潜变量个数增加训练集误差几乎一定在下降但验证集误差往往先降后升。那个拐点就是“既学到了信号又没学进噪声”的位置。选对这个数比后面任何调参都重要。另外当潜变量个数逐渐逼近样本数量时PLS就退化成普通的多元线性回归多重共线性的问题会一并回来这点一定要警惕。4. 模型训练、预测和三类评价指标详解确定好潜变量个数后就可以用全量训练数据重新训练最终模型了。这里再强调一次此前交叉验证只是为了选超参数最终模型拿全量训练集在最优LV下训练是更稳的做法。Matlab核心代码非常简洁[XL, YL, XS, YS, BETA] plsregress(XTrain, YTrain, bestLV); XTestNorm (XTest - muX) ./ sigmaX; YTestPred [ones(size(XTestNorm, 1), 1), XTestNorm] * BETA;这里需要理解plsregress的输出含义。第1个返回值XL是X的载荷矩阵YL是Y的载荷矩阵XS是X的得分矩阵YS是Y的得分矩阵最后一个BETA就是直接可用于新样本预测的回归系数向量。用的时候要注意BETA的第一行是截距项所以预测时要手工拼接一列1这个细节特别容易忽略。更省事的做法是直接用matlab自带的PLSRegression对象在Statistics and Machine Learning Toolbox里但老版本的plsregress函数更通用很多老代码都在用遇到问题也更好排查。模型建好之后真正见真章的是在测试集上计算评价指标。我这次选了三个最有代表性的**均方根误差RMSE**衡量预测值与真实值的总体偏差水平单位与原始数据一致是最直观的指标。决定系数R²表示模型解释的方差比例越接近1越好。需要注意区分训练集R²和测试集R²两者差距过大说明过拟合。**平均绝对百分比误差MAPE**用相对值刻画预测误差适合用来对比不同量纲的数据集之间的预测精度。YTestPred [ones(size(XTest,1),1), XTest] * BETA; SSE sum((YTest - YTestPred).^2); SST sum((YTest - mean(YTest)).^2); R2 1 - SSE / SST; RMSE sqrt(mean((YTest - YTestPred).^2)); MAPE mean(abs((YTest - YTestPred) ./ YTest)) * 100;我在实际项目里还会额外加一个指标相对分析误差RPD定义为测试集标准差除以RMSE。RPD大于3说明模型效果极佳2到3之间说明可用低于1.5基本就得考虑换方法了。它特别适合在成果汇报时用来向非数学背景的同事解释模型到底好到什么程度。5. 预测图像与结果可视化让模型效果“一眼可见”光有数字指标还不够图是给人看的尤其当你要把结果汇报给业务部门或者写进论文里几张清晰的可视化图往往比一堆数字更有说服力。我这次做了三张图每一张都有它不可替代的价值。第一张是训练集的真实值与预测值散点图X轴是真实值Y轴是预测值再用虚线画一条yx的对角参考线。点越贴近对角线的位置说明模型对这个样本的预测越准。理想情况下点应该均匀分布在对角线两侧不会出现某一段明显偏移的“系统性偏差”。第二张是测试集的对比柱状图真实值用深色柱子预测值用浅色柱子一一对应排在一起。对于样本量不算大的情况这种并排柱状图能非常直观地看出每个样本上预测值跟真实值的偏离程度尤其能暴露出个别极端样本的预测偏差。第三张是误差分布图可以画预测残差的直方图也可以按样本序号画误差折线。我更喜欢直方图因为能一眼看出残差是否符合正态分布。如果残差明显偏态比如大误差方向总是偏向一侧往往说明模型还有未捕捉到的非线性关系或者遗漏了关键变量。figure(Position, [100, 100, 1200, 400]); % 子图1训练集拟合散点 subplot(1, 3, 1); scatter(YTrainFit, YTrainFit, 30, b, filled);等等这里其实是真实值与预测值标注写清楚就好。三张图并排放在一张Figure里无论是在论文里还是汇报PPT中效果都很好别人扫一眼就明白模型做到了什么水平。另外一个小技巧图的配色和点大小要克制别用花里胡哨的颜色专业图表讲究信息密度高但视觉负荷低。6. 实操中遇到的三个坑和对应排查思路做这个项目期间我踩了几个值得一提的坑按“现象-排查-解决”的顺序记录一下可能比教条式的注意事项更有参考价值。**坑一预测结果整体偏移R²很高但RMSE也很大。**这个现象很诡异点状图上看预测值和真实值几乎是平行的但整体差一个固定的偏移量。排查到最后发现是标准化出了问题我把测试集按照测试集自己的均值和标准差做了标准化却用训练集的均值和标准差去还原预测值。两套参数不一致导致数值整体被平移了一段。解决办法就是全程只用训练集那组muX和sigmaX测试集只做转换不做拟合。**坑二交叉验证的RMSE曲线一路单调下降找不到拐点。**这种情况通常意味着潜变量数已经逼近样本容量模型在“背答案”而非“学规律”。我当时是在一个只有25个样本的小数据集上做的最大潜变量数设到了20曲线自然是单调下降。把maxLV限制在样本数量的三分之一以内曲线的U型特征就明显多了。**坑三测试集R²挺高但在个别样本上相对误差超过50%。**当Y值本身非常接近零的时候MAPE会被这些“小分母”样本拉爆。后来我在业务评估中改用了一个组合方案报告RMSE作为主指标同时在误差图上单独标出相对误差超过阈值的点再人工判断要不要对这个区间的样本特殊处理。这提醒我一件事任何单一指标都有盲区多指标交叉印证才是正道。7. 预测效果实测跑一组真实数据看结果为了让整个流程更完整我拿一份公开的化工过程数据集做了全流程实测。数据包含103个样本12个过程变量预测目标是产品收率。按照8:2的比例划分训练集和测试集即82个训练样本、21个测试样本。做10折交叉验证后最优潜变量个数定为4个然后重新在全量训练集上训练。训练集上的R²达到了0.94RMSE是0.81测试集上R²为0.89RMSE为1.03MAPE为3.6%。RPD算下来是2.7属于“基本可用、逼近优秀”的区间。整体来看模型没有明显的过拟合因为训练集和测试集的R²差距只有0.05左右这表明4个潜变量确实抓住了数据里的主要结构。如果把潜变量个数改成8个训练集R²能升到0.97但测试集R²直接掉到0.82过拟合趋势非常明显。这组对比就是“为什么必须用交叉验证选LV”的最佳实证——只看训练集表现你永远不知道模型在真正的新数据面前会出什么洋相。8. 后续还能怎么玩从PLS到更复杂的进阶方向如果你已经跑通了这套基础的PLS流程有几个方向可以继续深入。第一尝试PLS-DA偏最小二乘判别分析。当因变量不是连续数值而是分类标签时比如“合格/不合格”“故障/正常”PLS-DA可以做分类。思路还是PLS那套降维逻辑只不过Y变成了类别编码。第二把**变量重要性投影分数VIP**引入特征筛选。PLS可以输出每个自变量对模型解释的贡献度用VIP值大于1来筛选重要变量能帮你大幅压缩输入维度。这个功能在处理光谱、质谱这些超高维数据时极其好用能把几百个变量缩到十几个关键变量而且模型的精度不会掉多少。第三当数据存在明显非线性关系时普通PLS就不够用了可以考虑核偏最小二乘KPLS通过核函数把原始数据映射到高维空间再做PLS。Matlab里没有现成的KPLS函数But官方社区和File Exchange上有不少质量很高的实现直接拿来用即可。我个人更推荐你在把基础PLS用透之后再考虑非线性扩展。很多实际问题用线性PLS已经能解决90%以上一上来就上非线性方法模型复杂度上去了解释性下来了后面的调参和排查难度只会成倍增加。机器学习不能贪刀能简单解决的事情就不要复杂度堆砌。这套Matlab PLS回归预测的整套流程写下来从原理到代码到出图到指标解释算是我近期做得比较完整的一个小项目。测试集验证、评价指标、可视化出图这几块在工程落地、论文写作中都是刚需。照着上面的路子撸一遍再遇到小样本多变量的回归预测任务心里应该就有底了。本文还有配套的精品资源点击获取