直接打开MATLAB干就完了。今天这篇不整虚的,就讲一件事:怎么用二十来行代码,把多元线性回归从数据读取到模型训练再到预测评估,一条龙跑完。你手里只要有一份Excel表格,哪怕之前没碰过MATLAB,照着抄也能出结果。
我在实际项目里发现一个规律:很多同学学机器学习,一上来就上Python、上深度学习,结果被环境配置、依赖安装、CUDA版本搞得头破血流。但遇到业务里最常见的那类问题——比如根据温度、湿度、风速预测用电量,根据广告投放金额、渠道、频次预测销售额——这种典型的多元线性回归场景,MATLAB反而是最顺手的工具。它不需要你额外装什么包,自带工具箱就把数据读取、模型训练、结果可视化全包了,尤其适合毕业设计、课程实验、日常数据分析这种“我要结果但不是来写框架”的需求。
这篇文章适合三类人:一是正在做课程设计或毕业论文、需要快速出一个回归模型的学生;二是工作里经常处理Excel报表、想给数据加一层预测能力的业务分析岗;三是在Python和MATLAB之间反复横跳、想找个更省事的回归方案的研究者。我会把数据格式要求、代码逐行含义、结果怎么解读、踩过的坑全部写清楚,你跟着跑一遍,基本就能自己上手了。
1. 为什么选MATLAB做多元线性回归:思路与方案解读
1.1 多元线性回归到底在解决什么问题
先对齐一下概念。多元线性回归(Multiple Linear Regression)描述的是因变量y和多个自变量x1、x2、……、xn之间的线性关系,数学形式是:
y = b0 + b1x1 + b2x2 + …… + bn*xn + ε
这里面b0是截距,b1到bn是各个自变量的回归系数,ε是误差项。你要做的事情,就是根据已有的历史数据,估计出这一组b值,让预测值和真实值之间的误差尽可能小。估计的方法叫最小二乘法(OLS),它的思路很直白:找到一组系数,让所有样本的残差平方和最小。
很多同学第一次接触这个概念觉得抽象,我打个比方。你请客吃饭,想知道最终账单金额能被什么因素解释。你记录每次聚餐的人数、菜品数量、酒水档次、餐厅等级,然后把账单金额也记下来。回归模型做的事情,就是告诉你“人数每增加一个,账单平均上涨55块”“酒水档次升一级,账单平均上涨120块”,这些东西组合起来就能比较准确地估算一顿饭大概花多少钱。预测,本质上就是把已知的规律外推到新样本上。
使用场景在我接触过的项目里非常广。电商公司用点击量、转化率、客单价预测GMV;制造企业用温度、压力、转速预测设备寿命;金融机构用收入、负债、征信评分预测违约概率;气象领域用湿度、气压、云量预测降雨量。这些场景的数据结构高度统一:一张表,若干列特征,一列目标值。只要符合这个结构,下面这套代码就能直接套用。
1.2 对比Python、SPSS、Excel自带分析工具,优势在哪
做回归分析不是只有MATLAB一条路,我三个主流方案都深度用过,说说我的真实感受。
Python(sklearn)路子最野,生态最丰富,但代价是你得先过几道坎:装Anaconda或者Python环境、处理依赖版本冲突、手写数据预处理流水线、还得自己写绘图代码。有个CSDN热榜问题叫“matlab编程csdn”,下面大量回复都是在吐槽环境安装的,人在配置文件面前跪了一晚上,模型代码反而半小时就写完了,这种亏我吃过不止一次。
SPSS是老牌统计分析软件,菜单操作确实省心,点两下就能出回归结果,适合纯分析场景。但它的短板在于自动化能力差:你想批量处理10个Excel文件就傻眼了,想把这个流程固化下来做成一个可复用的工具,菜单操作根本做不到。另一个问题是它对数据格式要求比较死,稍微复杂一点的清整逻辑就得借助语法窗口,那就绕回编程路了。
Excel自带的数据分析工具库估计大家更熟悉,加载分析工具库之后可以做回归,但它的问题更明显:最多能处理15个自变量(再往上会报错),且不区分训练集和测试集,无法评估模型在未知数据上的泛化表现。换句话说,你用Excel算回归,更多是“拟合历史数据”,而不是“预测未来”,这俩概念有本质区别。
MATLAB在这三者里的定位很讨巧:它保留了一部分菜单式操作(用table、fitlm这类高层函数),又有完整的编程能力做批量化和自动化;既是计算引擎,又是数据分析平台。更重要的是,fitlm这个函数本身就是为回归统计设计的,输出结果里包含了T检验、F检验、p值、置信区间、残差统计这些做统计分析必需的内容,什么都有。Python sklearn的LinearRegression返回的对象里你要手动算这些指标,代码量又上去了。
1.3 20行代码“足够用”的边界在哪里
先说清楚,我这里说的20行,指的是“最小可用版本”:读取Excel、准备数据、划分集、训练模型、预测、输出评估指标。这确实是够用的,能覆盖日常80%的回归预测需求。
但如果你想做严格意义上的模型上线、部署到生产环境,那还需要额外的东西:特征工程的反复迭代、交叉验证寻参、多重共线性诊断、残差正态性检验、异常值稳健处理。这些我在后面的“常见问题”和“精进方向”里都会提到,你可以按需加码。
20行这个数字背后其实是一个工程原则:先跑通,再优化。我见过太多人一开始就想着把模型做得很复杂,结果数据还没读进来卡在环境上,最后放弃。先把全流程通起来,看到预测结果,建立正反馈,再逐步加东西,这才是学习曲线最平滑的路径。
2. 动手前的准备:Excel数据格式与预处理
2.1 Excel数据该长什么样
在你的Excel表格中,数据格式要求非常简单:第一行是变量名,从第二行开始是数据,每一列是一个变量,其中一列是因变量(你要预测的目标),其余列是自变量(用来预测的特征)。我建议的摆放方式是:自变量连续放在左边的若干列,因变量单独放最后一列。这样代码里可以用data{:, 1:end-1}取全部自变量,用data{:, end}取因变量,写得干净又不容易出错。
拿一个我实际用过的场景举例。某水果批发商想预测每日销售额,采集了以下字段:当日气温(℃)、降雨量(mm)、客流人数(人)、打折商品数量(个)、进货成本(元)、销售额(元)。这个表放到Excel里就是一个6列的表格,前5列是影响因子,最后一列是销售额。表头分别命名为temperature、rain、traffic、discount、cost、sales这种英文字段。
有一点要特别留意:Excel里同一列不要混存文本和数字。比如客流人数这一列,如果某几天你写的是“约300人”这种文本,readtable读取的时候整列会变成cell类型,后面的数值运算直接崩掉。数据里出现这种情况,在Excel里先清理成纯数字再导入,这是老手才懂的坑。另外,空单元格会被解析为NaN,少量空值模型还能勉强跑,但如果空值很多,建议先用Excel的筛选功能或者MATLAB里的rmmissing函数处理。
2.2 MATLAB读取Excel的方法与路径问题
如果你用的是R2019a及之后的版本,读Excel最推荐readtable函数:
data = readtable('sales_data.xlsx');这行命令会自动识别表头、各列数据类型,把Excel内容读成一个表格(table)对象。table是MATLAB里处理表格型数据的最佳结构,它的好处在于每列可以保持自己的数据类型,数字是数字、文本是文本,还自带变量名,不会像普通矩阵那样强制统一类型。
文件路径是新手踩坑重灾区。readtable的默认查找路径是MATLAB的当前工作目录(Current Folder)。如果你的xlsx文件放在桌面或下载文件夹,最好把文件复制到MATLAB当前文件夹里,或者直接用完整路径。比如:
data = readtable('C:\Users\myname\Desktop\sales_data.xlsx');注意Windows路径里的反斜杠要么写成两个反斜杠\,要么把单反斜杠改成/正斜杠,两种写法都能识别:
data = readtable('C:/Users/myname/Desktop/sales_data.xlsx');我在CSDN上经常看到有人问“matlab movefile”怎么用,实际遇到的问题是文件路径找不到。这里给一个非常实用的自查技巧:在运行之前先执行这个命令,确认当前文件夹和目标文件是否匹配:
pwd % 查看当前工作目录 dir('*.xlsx') % 列出当前目录下所有的Excel文件如果命令窗口显示的路径和文件实际位置不一致,用cd命令切换目录,或者用上边讲的全路径读取,问题立刻解决。
2.3 关于数据标准化的一个关键取舍
在多元回归里,如果各个自变量的量纲差异很大(比如气温是两位数,客流量是几千人,打折商品是个位数),要不要做标准化,这是一个绕不开的问题。
先澄清一个误解。很多人以为必须标准化之后才能做回归,其实不是。线性回归的系数本身就能解释量纲差异——客流量的系数会很小,气温的系数会大一些,数学上完全能处理。不做标准化,系数直接反映“自变量每变化一个单位,因变量变化多少”,这种解释性反而更强。
但做标准化有一个实打实的好处:当自变量之间相关性很强的时候,量纲差异会放大数值稳定性问题,导致系数估计波动剧烈。另外,如果你后续要加正则化项(岭回归、Lasso),那标准化就是必须的。还有,你想对比各特征对因变量的相对重要性时,标准化后的系数大小才有横向可比性。
我的建议是:如果你的目的就是一般的预测,且打算保持可解释性,可以不做标准化;如果你担心多重共线性或者要对比特征重要性,就做标准化。在MATLAB里标准化一行搞定:
X = normalize(X, 'zscore'); % 把X的每一列转成均值0、标准差1的分布更保守一点的做法是先用corrcoef(data{:,:})看一下相关矩阵,判断自变量之间的相关性,再决定是否标准化。别盲目操作,先看清数据再说。
3. 核心代码逐行拆解:从Excel到预测结果
3.1 先看全貌:完整代码就在这
下面是完整代码,我保证在最新的MATLAB版本(R2021a及之后)里直接复制粘贴就能运行。如果你用的是旧版本,个别函数可能需要替换,我在后面会专门讲。
% 20行代码搞定多元线性回归预测 clear; clc; data = readtable('sales_data.xlsx'); % 第1行数据读取 X = data{:, 1:end-1}; % 第2行提取自变量 y = data{:, end}; % 第3行提取因变量 rng(42); % 第4行固定随机种子 cv = cvpartition(height(data), 'HoldOut', 0.3); % 第5行划分训练测试集 X_train = X(training(cv), :); % 第6行训练集自变量 X_test = X(test(cv), :); % 第7行测试集自变量 y_train = y(training(cv)); % 第8行训练集因变量 y_test = y(test(cv)); % 第9行测试集因变量 mdl = fitlm(X_train, y_train); % 第10行训练回归模型 y_pred = predict(mdl, X_test); % 第11行对测试集预测 RMSE = sqrt(mean((y_test - y_pred).^2)); % 第12行计算均方根误差 SSE = sum((y_test - y_pred).^2); % 第13行计算残差平方和 SST = sum((y_test - mean(y_test)).^2); % 第14行计算总平方和 R2 = 1 - SSE / SST; % 第15行计算R方 fprintf('R2 = %.4f\nRMSE = %.4f\n', R2, RMSE); % 第16行打印评估结果 disp(mdl); % 第17行显示完整回归结果数一数,正好17行核心代码,加上几个空行也就20行左右,跟标题对得上。这段代码执行完,你会得到两个关键输出:一个是模型摘要表,包含所有自变量的系数、p值、统计显著性;另一个是测试集上的R2和RMSE,这两个数直接告诉你模型“预测未知数据”到底靠不靠谱。
3.2 每一段代码在做什么
前三行是数据入口。在第1行,readtable读取Excel时,我建议你观察一下命令窗口有没有警告信息,特别是“将文本数据转换为数值”之类的提示。如果出现,说明你的Excel里有些列并不是纯数值,这是隐患。第2行、第3行用花括号{ }对table取数,得到的是普通的数值矩阵,方便后续交给矩阵运算函数处理。table的取数逻辑初学者容易懵,记住一个规则:用花括号取出来的是数值,用圆括号取出来的是table子集,这俩差别巨大。
第4行rng(42)是设置随机数种子。为什么要这么做?因为后面划分训练测试集是用随机抽样完成的,没有这行,你每次运行划出来的结果都不一样,模型评估指标会上下波动。加了这行,每次跑代码结果完全一致,方便你复现和调试。数字42随便选,42是“银河系漫游指南”里的生命、宇宙以及一切的答案,我用习惯了。
第5行cvpartition是划分数据集的核心。'HoldOut', 0.3的含义是随机抽30%的数据作为测试集,剩下70%作为训练集。这个比例是比较常见的默认配置,数据量在100左右的时候训练集70个样本足够拟合出稳定的回归系数。如果你的数据量很大(1000+),可以考虑把比例调整为0.2,让训练集占比更大;如果数据很少(50以下),建议改成0.2,否则测试集样本太少,评估指标波动很大。
第10行是整段代码的灵魂。fitlm(X_train, y_train)会在训练数据上做最小二乘拟合,函数内部完成了矩阵求解、假设检验、以及回归统计量的计算。fitlm的全称是fit linear model,它虽然是高层函数,但并不意味着精度打折,底层用的还是经典的\运算和正规方程求解,结果跟手动计算完全一致。
第11行之后是评估。先predict出测试集的预测值,然后手写RMSE、R2的计算公式,这样做比直接用mse(Model, X_test, y_test)这种封装函数更直观,你看到的是原汁原味的数学定义。RMSE的含义是预测值和真实值的平均偏差幅度,单位跟因变量一致;R2的含义是模型解释了因变量变异的百分比,0.9以上说明模型的解释能力很强。
3.3 fitlm输出的那张表怎么看
disp(mdl)输出的是一个回归摘要表格,这是整个分析里信息密度最高的地方,也是很多新手懵掉的地方。我挑重点讲。
表格中间是“Coefficients(系数)”部分,四列分别是:Estimate(系数估计值)、SE(标准误)、tStat(t统计量)、pValue(p值)。系数估计值就是b0、b1、b2这一串,表示了每个自变量对因变量的边际影响。比如sales = 2000 + 8.5temperature + 32traffic,意思是气温每升1度销售额平均涨8.5元,客流量每多1人销售额平均涨32元。
p值是你判断这个变量“到底有没有用”的关键依据。以0.05为阈值:p值小于0.05说明该特征对因变量有统计学上显著的影响,保留它是合理的;p值大于0.05说明这个变量提供的信息有限,可以考虑剔除后重新建模。但要注意,p值受样本量影响很大,样本多的时候很小的无关变量也会显著,样本少的时候真正有用的变量也可能不显著,所以它是参考不是裁决。
表格下方“Number of observations”是样本数量,“Error degrees of freedom”是残差自由度,等于观测数减去参数个数。右下角“Root Mean Squared Error”是训练集上的RMSE,这个值跟后面你在测试集上算的RMSE通常不一样——训练集RMSE一般偏小,这是正常的,不是代码写错了。
我还建议你顺带看一眼“R-squared”和“Adjusted R-squared”,这两个数通常在表格右上方。调整后的R2会惩罚多余的自变量,所以如果加了无用特征,Adjusted R2会明显低于R2。看到这种情况,就该考虑删特征了。
4. 实操全流程记录:从零到预测结果
4.1 完整操作步骤(新手照做版)
我按一个从没接触过MATLAB的小白视角,把整个操作流程梳理一遍,你跟着走就行。
第一步,准备Excel数据。把它命名为sales_data.xlsx,放在一个你记得住的目录下,推荐直接放MATLAB当前文件夹。Excel列顺序:前面放自变量,最后一列放因变量,第一行写英文变量名。
第二步,打开MATLAB。界面就一个命令行窗口,这个窗口叫Command Window,你之后输入的代码都会在这里执行。左上角的“当前文件夹”面板(Current Folder)会显示工作目录,鼠标能直接看到文件是否在这个目录里。
第三步,在命令行里输入下面这行检查数据文件是否被识别:
dir('*.xlsx')如果列出了你的Excel文件名,说明路径没问题,可以进入下一步;如果什么都没有,尝试用cd命令切换目录,比如cd('C:/Users/你的用户名/Desktop/')。
第四步,把核心代码逐行输入或者直接粘贴到命令行。也可以点击“新建脚本”按钮,把代码写在一个.m文件里,点“运行”按钮一次跑完。脚本方式更方便,因为以后改参数、重复运行不用重新输入。
第五步,观察输出。命令窗口会打印R2和RMSE,然后弹出完整的回归摘要表格。看到这些,整个流程就成功了。
4.2 用真实数据演示一遍效果
我模拟一组数据让大家直观感受输出长什么样。假设有300个样本,特征包含:广告费用(X1)、客流量(X2)、促销折扣(X3),因变量是日销售额(Y)。用上面代码训练后,典型的输出是:
R2 = 0.8735 RMSE = 452.1837然后disp(mdl)的那个表大致这样:
| 变量 | Estimate | SE | tStat | pValue |
|---|---|---|---|---|
| 截距 | 128.54 | 75.21 | 1.71 | 0.088 |
| X1 | 12.84 | 2.51 | 5.06 | 0.001 |
| X2 | 3.82 | 1.13 | 3.38 | 0.004 |
| X3 | -25.67 | 8.42 | -3.05 | 0.013 |
怎么解读?截距的p值0.088大于0.05,说明常数项在统计上不显著,但这不影响模型整体使用,一般也不建议随便去掉截距。X1系数12.84意味着每多投1元广告,销售额平均多12.84元;X3系数为负,说明折扣力度加大反而可能压低销售额——这在某些品牌定位偏高端的产品里是真实的现象,折扣多了消费者会怀疑品质。R2为0.87,说明这三个因素能解释87%的销售额波动,预测精度RMSE约452元,看你的业务体量决定这个误差能不能接受。
- 一定要区分“训练集效果”和“测试集效果”。只有测试集上算出来的R2、RMSE才是模型真实预测能力的反映,训练集上的数值再好看都有自欺欺人的成分。
- 变量的量纲直接影响系数大小,别拿系数直接比重要性。广告费用的系数看起来比客流量小,但广告费用本身数值就大,标准化之后才是可比口径。
- 因变量和自变量的关系如果不是线性的,拟合效果会远差于预期。先用scatter画出每个自变量和因变量的散点图,看到曲线关系要加平方项或做变换。
4.3 对新数据做预测的扩展操作
模型训练好了,怎么用来预测新一批数据?这是“预测”这两个字的落点。假设你拿到下个月的天气预测和广告排期,想知道销售额大概多少,你只需要把新数据整理成跟训练数据同样的列结构,然后调用predict函数。
new_data = readtable('new_data.xlsx'); % 新数据,同样结构 X_new = new_data{:, 1:end-1}; % 提取自变量 y_hat = predict(mdl, X_new); % 输出预测值predict会把你新样本的自变量代入模型公式,自动算出预测值。这个操作非常简单,但有一个细节必须注意:训练模型时做过的任何预处理,比如标准化、缺失值填充,新数据也要走一模一样的流程。比如你在训练前对X做了normalize,那新数据的X也要用训练集计算出的均值和标准差去做标准化,不能直接对整个新数据重新normalize——否则两个数据不在同一分布空间里,预测就是错的。
如果想把预测结果写回Excel,用writetable就行:
result = table(y_hat); writetable(result, 'prediction_result.xlsx');这样一个完整的数据导入、训练、预测、导出的闭环就形成了。你完全可以把它封装成一个只有参数输入输出的脚本,以后换一份数据就能直接跑。
5. 常见问题与排查技巧实录
5.1 模型效果差、R2等于甚至小于0,怎么回事
这几乎是我被问得最多的问题。先说一个最容易被忽视的细节:R2的定义是1减去SSE除以SST,如果你的预测结果比直接用测试集平均值还离谱(SSE大于SST),R2就是负数。这种情况出现通常不是代码坏了,而是模型的线性假设跟数据的实际分布根本不匹配。我建议先画图看看:scatter(y_test, y_pred)然后把y=x这条参考线画上去,如果点不是沿着对角线分布而是乱七八糟或者呈弧线分布,说明要么漏了关键自变量,要么关系是非线性的。
处理办法有两种。第一种是加交互项和多项式项,把模型升级为带二次项的回归,fitlm支持用公式语法表示:
mdl2 = fitlm(X_train, y_train, 'y ~ x1 + x2 + x3 + x1:x2 + x2^2');这里的x1:x2表示x1和x2的交互作用,x2^2表示x2的二次项。这种扩展能让模型捕捉一些弯曲关系,但注意别加太多项,否则会过拟合。
第二种是干脆换模型,比如决策树、随机森林、高斯过程回归,MATLAB里都有现成函数,比如fitrtree、fitrensemble。这些模型能自动捕捉非线性关系,但可解释性比线性回归差很多,属于取舍问题。
5.2 readtable读Excel报错、列名乱码怎么办
读Excel失败是高频问题。最常见的一种情况是readtable读出来之后,中文列名在命令窗口显示乱码,或者部分文本列读出来是“????”。这通常是编码问题,Excel文件保存时用了不同的字符编码,MATLAB的默认读取设置没对齐。
老一点的MATLAB版本(比如R2023a之前)对UTF-8的支持不够好,中文变量名读出来会乱码。解决办法很粗暴但有效:把Excel另存为CSV文件(UTF-8编码),然后用readmatrix或者readtable读CSV:
data = readtable('sales_data.csv', 'PreserveVariableNames', true);如果你不想转CSV,另一个办法是干脆避免表头用中文,Excel第一行全部改成英文字段名或者拼音字段名。这个土办法我在很多项目里都用了,省事且兼容性最好。
另外,readtable遇到Excel里某个单元格是数字和文本混合的,会自动把整列识别为文本类型,这在计算时是灾难。排查方法很直接:readtable之后,在命令行输入:
summary(data)这个命令会告诉你每一列的类型(double、cell、string等)。发现哪一列类型不对,回到Excel里把那列的文本单元格改成数值格式再重新读,这是最保险的做法。
5.3 老版本MATLAB没有normalize、cvpartition怎么办
版本兼容性是个现实问题。如果你用的是R2017a或者更早的版本,normalize函数可能不存在。替代方案是手写标准化逻辑,就三行:
mu_x = mean(X, 1); sigma_x = std(X, 0, 1); X = (X - mu_x) ./ sigma_x;cvpartition虽然很早就有了(R2008a之前的版本也有),但旧版本的参数名可能略有差异。如果你发现cvpartition用不了,就用randperm手写划分逻辑:
rng(42); idx = randperm(size(X,1)); train_idx = idx(1:round(0.7*size(X,1))); test_idx = idx(round(0.7*size(X,1))+1:end); X_train = X(train_idx, :); X_test = X(test_idx, :); y_train = y(train_idx); y_test = y(test_idx);这个手写版本的思路和cvpartition完全一样:随机打乱索引,取前70%做训练集,后30%做测试集。写法还显得更透明,我更推荐初学者先理解这个版本,再跳回封装的函数。
如果你下载的是别人打包的所谓“matlab安装包”,又装不上,我这里给个折中建议:MATLAB的在线网页版(官方提供的基础版)对于跑这种回归绰绰有余,不需要本地安装。但企业项目涉及敏感数据的时候,还是老老实实用本地版。
5.4 特征太多,模型“失效”了怎么办
当自变量数量很多(比如几十个、上百个)时,直接上fitlm常常会出两个问题:一是多重共线性导致某些系数估计的符号和直觉相反,二是模型把噪音也学进去,测试集表现崩溃。这里的核心是特征选择问题。
先用一个快速的诊断方法:检查各特征之间的相关系数矩阵。
C = corrcoef(X); % 找出相关系数绝对值大于0.7的特征对 [row, col] = find(abs(C) > 0.7 & abs(C) < 1);如果发现有高度相关的特征对,建议删掉其中一个,保留那个和你业务理解关系更紧密的。比如温度和体感温度高度相关,那留哪个,取决于你更容易拿到哪个数据。
其次是考虑用逐步回归,MATLAB的stepwiselm函数就是专门做这个的,它会自动从零开始加变量,每次加入一个对模型贡献最大的变量,去掉一个不显著的变量:
mdl_step = stepwiselm(X_train, y_train);这个函数输出里会显示每一步是“加入”还是“移除”哪个变量,全部跑完你就得到一个人工智能帮你选完特征的最优模型。业务上如果实在不想纠结特征取舍,可以直接用这个方案,它能帮你节省大量时间。
最后,如果特征数量爆炸性多,就该考虑正则化回归了,MATLAB里用lassoglm或者ridge函数。这是我目前处理大数据量特征时最常用的手段,原理是牺牲一点训练集精度来换取更稳定的系数估计和更好的泛化效果。这一块如果需要我单独写一篇,后续的呼声高我就展开。
6. 踩坑总结与个人经验谈
6.1 我测试了几百份数据之后得出的三个血泪经验
第一个经验:永远要检查测试结果里有没有异常点。有一回我拿到一份广告投放数据,回归模型跑出来R2高达0.98,开心得不行,后来画残差图发现有一个样本点的残差比其他点大了两个数量级。一查,原来是那份Excel里有一行数据录入错误,销售额少写了一个零。这一条异常样本把整个回归系数都给拉偏了,我要是没检查图就直接用系数去决策,后果不堪设想。所以规范流程是:训练完之后,马上画残差图:
plotResiduals(mdl, 'fitted');如果残差分布呈现喇叭状(左边小右边大),说明方差非齐性,线性模型的基本假设被破坏,结果不可靠。
第二个经验:数据预处理的时间通常是建模时间的十倍以上。很多初学者恨不得把20%的精力花在调模型上,但真实项目的瓶颈全在数据上。缺值、异常值、量纲不统一、单位错误,每一关都得过。我在做数据导入之前一定会先执行一次summary(data)和corrcoef,这两步看清楚数据质量再建模,基本能避开80%的坑。
第三个经验:模型的可解释性永远是第一位的。学术界喜欢看谁预测得更准,但业务上往往更看重“我该往哪个方向使劲”。线性回归能告诉你“客流量每增加100人,销售额增加300元”,随机森林不能。所以即便我有各种花哨的算法工具,只要是给业务方做决策支持,我首选还是多元线性回归。这也是为什么我强烈建议你从线性回归入门机器学习。
6.2 顺着这篇文章,你还可以做哪些延伸
文章里的代码是个起点,顺着它你可以往很多方向延展。如果你想深化统计知识,可以研究一下fitlm输出的全部字段,比如置信区间(coefCI)、预测区间(predict函数可以返回PredictionBounds),这些能让你对不确定性有一个量化认知。如果你想把代码整理成可以复用的工具,可以把读Excel、训练、评估三个环节打包成一个函数:
function [mdl, metrics] = myRegression(xlsxFile, targetCol) data = readtable(xlsxFile); X = data{:, [1:targetCol-1, targetCol+1:end]}; y = data{:, targetCol}; % ... 后面训练和评估的逻辑 end然后调用一次就出结果,以后处理同类问题连代码都不用改,只换文件名。如果你还想把模型部署成给别人用的工具,MATLAB Compiler可以把脚本打包成独立程序,对方电脑上不用装MATLAB也能运行,暑假实习的时候这个技能点非常加分。
我个人在实际操作中的体会是:多元线性回归这件事,难点从来不在模型本身,而在于你愿不愿意花时间把数据整理干净、把结果放在业务语境里去解读。你把这套流程跑通、跑熟,往后学任何更复杂的模型,都只是在这个基础上换个函数名、加几行参数的事。赶紧开MATLAB吧,代码在上边摆着,跑起来就赢了。