机器学习_第四篇_拟合前提和模型评估
拟合前提和模型评估
前言
台下R² 看着有 0.9 多,心里美滋滋,台上预测值和真实值差出十万八千里。
模型跑起来后,怎么知道它没在骗你呢。这就像你买了辆车,只会踩油门,从来没看过仪表盘,油耗高了、胎压低了、发动机报警了,你全不知道,直到车抛锚在高速上。
今天这篇,我就想跟你掰扯清楚两件事:第一,拟合之前,那些藏在教材脚注里的"前提假设",到底是干嘛的,不满足会怎样;第二,模型训完了,手里的那些评估指标,哪个能信,哪个是表面功夫。
一、"拟合"到底在干啥
很多教程一上来就甩公式,我当年也被晃过。其实线性回归想干的事特别朴素:你手里有一堆数据,比如房子的面积和房价,你隐隐觉得"面积越大,房价越高",这种关系大概能画成一条直线。线性回归干的事,就是替你找到"最合适"的那条直线,以后你拿到一个新面积,往这条直线上一靠,就能估出房价。
"最合适"这三个字是有严格定义的,不是你觉得顺眼就叫合适。它的意思是:这条直线,要让所有真实点到它的"竖直距离的平方和"最小。这个竖直距离,行话叫残差(residual),就是真实值减去预测值。平方是为了不让正负距离互相抵消,顺便让离谱的点罚得更狠。这套找直线的办法,叫最小二乘法(OLS)。数学上就是找一组参数,把下面这个式子压到最小:
\(\hat{y}_i\) 是模型预测值,\(y_i\) 是真实值,它们的差就是残差。这个求和最小,直线就最"贴"数据。
还记得我们之前提到的方差公式吗,因为后面整篇文章,全是在围着"残差长什么样"打转。我想告诉你的是:模型厉不厉害,不看它拟合得多漂亮,看它的残差干不干净。
二、拟合前提:六条假设
把数据喂进去,直线就自动靠谱了吗?非也。最小二乘法能给出"最优"的直线,是有前提的。这些前提在统计书上叫"经典线性模型假设"。最小二乘能在满足它们时拿到"最优线性无偏估计(BLUE)",这就是 Gauss-Markov 定理的由头。我给你翻译成六条。
2.1 线性关系:自变量和因变量,得真能拉成直线
这条最直白。线性回归拟合的是一条直线(或者一个线性组合的超平面),它默认你的数据趋势是线性的。如果你的真实规律是曲线,比如"温度低的时候销量平稳,温度一高销量飙升",你硬套直线,那条直线就会拧巴,两头都贴不上去。
怎么看出线性? 最笨也最管用的办法:画散点图。把自变量放横轴、因变量放纵轴,肉眼看点的走向像不像一条线。如果明显是个弯的,别倔,要么对变量做变换(比如取对数、开平方,把弯的掰直),要么换非线性模型。
对参数线性: 这里说的"线性",指的是"对参数线性",不是"对变量线性"。什么意思?\(y = a + b \cdot \ln(x)\) 这种,虽然 x 被取了对数,但参数 a、b 还是一次的,所以它依然是线性回归能搞定的。
2.2 独立性:残差之间不能互相影响。
残差之间不能互相影响。举个例子,你在做"广告投入 vs 销量"的模型,如果数据是按时间排的,周一打了广告销量涨,这股劲头周二还在延续,那周二的误差里就带着周一的影子。这种叫自相关(autocorrelation)。
自相关的影响 自相关不让你的最小二乘估计"变偏"(估计还是准的),但它会让你算出来的"标准误"偏小,于是以为某个变量特别显著,其实可能是假象。即模型看似准确,实则虚高。
怎么查? 画残差随时间(或按样本顺序)的散点图,如果残差像波浪一样有规律地上下上下,那就中招了。统计上还有个 Durbin-Watson 检验,值离 2 越远越可疑。
2.3 同方差:协调误差的幅度
同方差(homoscedasticity),这词拆开看就俩希腊词根:homo 是"相同",scedastic 跟"离散程度、散布"有关,合起来就是"散布相同",说人话就是所有数据点的误差,抖动的幅度都一样。反过来,hetero 是"不同",所以异方差(heteroscedasticity) 就是"误差的散布不均匀",有的区间抖得厉害、有的区间抖得小。数学上,同方差写成 \(Var(\varepsilon_i) = \sigma^2\)(所有点的误差方差都是同一个常数),异方差就是 \(Var(\varepsilon_i) = \sigma_i^2\)(每个点的方差不一定一样,跟着 x 走)。
换个更直白的视角:你拿自变量 x 取不同值,看每个 x 对应的那一撮残差,它们上下晃的幅度(统计上叫方差)应该处处相等。如果处处相等,就是同方差;如果 x 小的地方残差挤成一团、x 大的时候残差散得很开,像个喇叭口越往右越张开,那就是异方差。
我给你个生活里的例子就懂了:你用"收入"去预测"每月消费"。低收入的人,每个月花销就那么些,上下差不了几百块,残差挤得很紧;高收入的人,这个月旅游下个月省着,消费能差出好几万,残差散得很开。这时候误差的"胖瘦"是随收入变的,典型的异方差。要是用回归去拟合,普通最小二乘会以为所有点一样重要,其实高收入的那些"野点"正在悄悄带偏整条线。
所以同方差说的不是"没有误差",而是"误差的脾气处处一样"。这一点想通了,后面看残差图你就有直觉了。
危害: 这一段我得展开讲,因为它太容易被轻视。
普通最小二乘(OLS)在给你算系数时,默认了"每个数据点的误差方差都一样大"(就是同方差)。基于这个默认,它才能用一套统一公式算出每个系数的标准误(standard error,衡量"这个系数估计得稳不稳")。一旦异方差,方差随 x 变,那套公式的前提就破了,标准误会算歪。
关键是:此时你的系数估计本身还是无偏的(平均来看没偏,线没歪),歪的是"你对系数的信心"。具体歪法通常是这样:方差大的那一段(比如前面例子里高收入的野点)被 OLS 当成和别的点一样重要,于是标准误被低估,t 统计量被放大,p 值被压小。结果就是:你兴冲冲地"拒绝原假设",以为"面积对房价影响显著",其实那个显著性很可能是异方差变出来的海市蜃楼。反过来,某些结构下标准误被高估,又会让你漏掉真正重要的变量(该显著却不显著)。
更坑的是对"区间"的误导:你跟业务方拍胸脯说"房价预测有 95% 的把握落在某个区间",这个区间是用同方差假设算的。异方差下,这个区间的实际覆盖率根本不是 95%,高波动区间早漏出去了。
所以异方差骗的不是模型的"脑子"(预测还凑合),而是你对模型的"信心"(检验和区间都虚)。做预测可以勉强忍,做推断(显著性、置信区间、因果结论)就得出问题。
怎么治? 先看残差图:残差对预测值的散点图,长成喇叭形(越往右越张开)就是异方差。治它的招有几路:
- 对因变量取对数:很多业务里方差是跟着水平一起长的(越有钱波动越大),取对数能把这种"喇叭口"压平,方差就稳了。这是最省事的一招。
- 加权最小二乘(WLS):不给所有点一样权重,而是方差大的点给小权重。理想权重是 \(w_i = 1/\sigma_i^2\),也就是"你抖得越狠,我越不信你"。真实 \(\sigma_i^2\) 未知,实战里常用残差绝对值或 \(|\hat{y}_i|\) 去估,再喂给 WLS。
- 异方差稳健标准误(Huber-White,也叫 sandwich 估计):这是我最常用的。模型照旧用 OLS 不动,只把"标准误怎么算"换成一个对方差结构不敏感的公式。这样你不用改模型,照样能拿到靠谱的显著性检验。推断有问题就先上这招,性价比最高。
- 变量变换(Box-Cox)或上稳健回归:实在压不平,就换变换思路,或改用对离群点不敏感的稳健回归。
选哪招看场景:只想修检验就上稳健标准误;想让线本身更合理就 WLS 或变换。
2.4 正态性:误差本身,最好服从正态分布
这条说的是残差的分布形状,得大致像个钟形(中间多、两头少)。注意,是误差正态,不是自变量正态,也不是因变量正态,这点特别多人搞混。
说实话,这条是最"软"的一条。 如果你只是想做预测,样本量又够大,中心极限定理会兜底,正态性不满足也能凑合用。但如果你要做那些 fancy 的推断(比如算置信区间、做假设检验、说"这个系数有 95% 的把握不为零"),那正态性就很关键了。
怎么看? 画个 Q-Q 图(分位数-分位数图),点基本贴在对角线上就 OK;或者画直方图看像不像钟。正太性不对,可以试试对因变量做变换,或者上稳健回归。
2.5 无多重共线性:自变量之间,别太"撞脸"
多重共线性,指的是你的几个自变量之间高度相关。比如你同时拿"面积(平方米)"和"面积(平方英尺)"当特征,这俩本质上是一个东西,模型就懵了:到底是谁在影响房价?它俩抢着背锅,结果就是每个系数的估计都晃晃悠悠,标准差巨大,明明单个变量可能很重要,t 检验却说"不显著"。
怎么查? 看两个指标。一个是VIF(方差膨胀因子),算法是 \(VIF_j = \frac{1}{1-R_j^2}\),其中 \(R_j^2\) 是把第 j 个变量对其他所有变量回归得到的 R²。某个变量的 VIF 超过 5(严格点 10)就要警惕了;另一个是直接看自变量两两的相关性矩阵,相关系数飙到 0.9 以上基本就是撞脸。
怎么治? 删掉冗余变量、做主成分分析(PCA)把相关的特征揉成一个、或者用岭回归(Ridge)这种专门对付共线性的正则化方法。
2.6 外生性:误差,不能跟你的自变量"暗通款曲"
这条最容易被忽略,但我觉得它才是最要命的。外生性(exogeneity)的意思是:残差必须和自变量不相关。换句话说,不能有一个"你没放进模型、但它既影响 y 又影响 x"的隐藏因素在捣乱。
最经典的例子是"冰淇淋销量 vs 溺水人数"。你拟合出来发现这俩强相关,能说吃冰淇淋导致溺水吗?不能,因为有个隐藏变量"气温"同时在推高两者。这叫遗漏变量偏差(omitted variable bias)。一旦存在这种内生性,你的系数估计是有偏的,而且样本再大也救不回来。这跟前面几条"大了就好"完全不一样,这条是硬伤。
我给你一句狠话: 前面几条不满足,顶多是估计效率差点、或者推断不干净(而且大多还能靠大样本兜底);但外生性这一条不满足,系数估计是有偏的,样本再大也救不回来,你模型得出来的因果结论,从根上就是错的。所以当你跟老板说"投广告能带来销量增长 3%"的时候,先想清楚有没有漏掉什么混在里面的东西。
2.7 前提不满足,难道模型就废了?
别慌,不一定,首先要知道这六条分"软硬",自己踩的是哪种。
- 硬伤,会让预测本身出偏的:线性关系不成立(你拿直线去套曲线,预测从源头就拧了)、外生性不成立(有隐藏变量在捣乱,系数估计有偏,而且样本再大也救不回来)。这两条是根上的病,必须治。
- 软的,主要搞乱"推断"的:独立性不满足(自相关)、同方差不满足(异方差)。这两条下,你的系数估计还是准的,只是标准误算歪了,显著性检验会虚高,让你对自己模型的信心虚胖。
- 最软的:正态性不满足。只影响置信区间和检验的精确程度,对预测本身基本无害,样本够大时中心极限定理还能兜底。
- 特例:多重共线性。它不让你的估计变偏,但让单个系数抖得厉害、t 检验不显著,模型整体预测却可能还行,属于"能用的别扭模型"。
现实数据几乎不可能 100% 满足全部假设。架构师的工作不是追求教科书式的完美,而是清楚自己踩了哪条、这个妥协会带来多大风险、能不能跟业务方说清楚。这才是专业和业余的分水岭。
三、模型训完了,怎么判断它到底行不行
好,假设前提你心里有数了,模型也跑出来了。现在到了最关键的时刻:你怎么向自己、向老板证明这模型不是瞎蒙的?这就是"模型评估"。
不过在讲具体指标之前,有个更底层的概念我得先把你按在椅子上讲清楚,因为它贯穿了后面所有评估。就是这三兄弟:训练集、验证集、测试集。
很多人(包括当年的我)一上来就听到"在测试集上评估",但压根没想过这测试集哪来的、跟训练集啥关系。结果就是:测试集和训练集分得不干净,模型其实早把答案看过了,测出来的数字漂亮得虚假。我把这三个词一次给你捋平。
用一个考试的类比,你一下就懂:
- 训练集,就是平时做的练习题册。 模型从这堆题里总结规律、调整自己的参数。它在这上面对,是应该的,就像你做过的题当然会做。
- 验证集,是平时的模拟考。 你学完一轮,拿模拟考测一下,发现"哎呀这类型我还是不会",于是回头改学习方法、调重点。验证集就是干这个的:帮你选模型结构、调超参数(比如特征留几个、正则化系数取多大)。注意,模型在验证集上的表现,会反过来影响你怎么训它,所以验证集也算"见过的卷子"。
- 测试集,是高考。 真刀真枪那一回。它必须是一套模型从没见过、训练时连边都没沾过的卷子。而且规矩是:只能看一次成绩。看完发现分低,你回头改模型再测,那叫偷看答案,高考成绩作废。
区别一句话捋清:训练集用来"学",验证集用来"选和调",测试集用来"最后打分"。三者绝不能串台。
那怎么划?最经典的切法是把数据按 6:2:2 切成三份(训练 60%、验证 20%、测试 20%),样本充裕时也可以 7:1.5:1.5。但有几个坑我提前给你标出来,后面第四节还会再踩一遍:
一个最容易踩的:划分之前先把测试集锁死。一拿到数据,第一件事是把测试集单独切出来、锁进抽屉,训练和调参全程不许碰。很多人是训完才随手划个测试集,那其实测试集的信息早渗进训练过程了。
分类问题还有个坑,叫"分层"切。比如你的数据里 90% 是 A 类、10% 是 B 类,随机切可能切出一份全是 A 类的测试集,测出来准得离谱但没代表性。得保证每份里 A、B 的比例跟整体一致。
还有,时间序列不能随机切,这一点我第四节坑二会专门讲:带时间顺序的数据必须按时间切,拿前面的训、预测后面的,绝不能用随机打乱。随机打乱等于把明天的答案透给了今天的模型。
数据少的时候,别硬留三份。你总共就几百条,再切三份每边都不够看,这时候与其死留一份测试集,不如用 3.5 节要讲的交叉验证:不单独留验证集,靠 K 折轮流当测试,把每一条数据都既当过训练又当过测试,省着用。
最后补一个最阴的翻车点:别把测试集当验证集用。我见过太多人,训完拿测试集测一下,分不高,回头改模型再测,反复好几轮。这时候测试集已经成了"变相的验证集",模型早把它摸透了,最后报上来的那个分数,跟真实上线表现是两码事。记住铁律:测试集只看一次,看了就不能再改模型。
好,卷子分清了,咱接着看具体拿什么指标给模型打分。
3.1 R²(决定系数)
R²(决定系数),先把这词捋平:R² 是个 0 到 1 之间的数,行话叫"决定系数",它可以表达"模型把结果说清楚了多少"。比如咱们用面积去猜房价,房价本身上上下下波动很大,R² 就是衡量"这些波动里,有多大比例被你的模型解释掉了"。0.9 多,意思是它自称解释掉了九成。听着挺美对吧?但这正是坑的开始,它"自称"说清楚,不代表真说清楚,更不代表换一批新数据还能灵。
它说的是"因变量的波动里,有多大比例被你的模型解释了"。写成公式是:
分子是残差平方和,分母是总平方和。R² = 0.8,就是模型解释了 80% 的波动,剩下 20% 是残差里的随机噪声。
但这里有个大坑我必须点名: R² 有个臭毛病:你往模型里硬塞特征,它只会涨不会跌。你哪怕塞个完全无关的随机数列进去,R² 也会略微往上拱。所以 R² 高,不代表模型好,可能只是你特征堆得多、过拟合了。
这毛病到底是哪来的? 回头看公式就透了。分母 \(SS_{tot} = \sum(y_i-\bar{y})^2\) 只跟"真实值离均值有多远"有关,跟你塞了几个特征一毛钱关系没有,它是个死数。所以 R² 涨不涨,全看分子 \(SS_{res}\)(残差平方和)降不降。
而最小二乘的脾气是:你每多给一个特征,等于在"找最优线"这件事上多放了一寸自由活动的空间。新模型的参数空间里本来就包含了"旧特征 + 新特征系数设为 0"这种老模型,所以它至少能拟合得跟老模型一样好,\(SS_{res}\) 只会变小、不会变大。分母不动、分子不增,R² 自然只会涨不会跌。
再极端一点帮你建立直觉:只要你加的特征够多(多到特征数逼近样本数),普通最小二乘能把 \(SS_{res}\) 硬压到 0,R² 直接拉满到 1。但这种"满分"是死记硬背训练集换来的,换批新数据立刻现原形。说白了就是过拟合:它把训练数据里的噪声都当规律记下来了。
一个歪比喻收尾:R² 像考试分数,加特征等于考前多偷瞄了几页答案,你总能多蒙对几道,分只升不降,但那是刷出来的,不是真会。
于是有了调整 R²(Adjusted R²)。它在 R² 基础上惩罚了特征数量:加一个没用的特征,调整 R² 反而会掉。所以比较"特征数不同"的两个模型时,看调整 R² 才公平。我个人的习惯是:汇报永远带调整 R²,R² 单看没啥意思。
原理(它到底在算什么): R² 换个写法就是"模型解释的波动 ÷ 总波动",也就是回归平方和 SSR 除以总平方和 SST(因为 SST = SSR + SSE)。在一元回归里它干脆就是相关系数 r 的平方。调整 R² 没发明新东西,只是给 R² 乘了个随特征数变大的惩罚因子 \(\frac{n-1}{n-p-1}\)(n 是样本量、p 是特征数),特征越多这因子越压低分数,没用的特征一进来就被扣分。
优缺点:
- R² 优点:直观、无量纲、永远落在 0~1 之间,跟非技术的人沟通最顺。
- R² 缺点:只看比例不看绝对量;只会涨不会跌(过拟合的掩护伞);对离群点敏感;换批新数据就不灵;拿去比"因变量都不一样"的模型纯属瞎比。
- 调整 R² 优点:惩罚多余特征,特征数不同的模型能公平比。
- 调整 R² 缺点:惩罚力度是固定线性的,不够灵活,真要精细选模型还得靠 AIC/BIC;同样只能比同一因变量的模型。
3.2 误差指标:MSE、RMSE、MAE,别再傻傻分不清
R² 是个比例,看不出"错多大"。要看错多大,得用误差指标。三个最常用的:
- MAE(平均绝对误差):所有残差绝对值取平均。好懂,单位跟 y 一样。错 10 万就是错 10 万。
- MSE(均方误差):残差平方取平均。它偏爱惩罚大错误(平方嘛),但对离群点特别敏感。
- RMSE(均方根误差):MSE 开个根号,把量纲拉回跟 y 一样。工程上最爱用,因为它和 MAE 同单位,又好比较。
三个指标的公式摆在一起对比最清楚:\(MSE = \frac{1}{n}\sum(y_i-\hat{y}_i)^2\),\(RMSE = \sqrt{MSE}\),\(MAE = \frac{1}{n}\sum|y_i-\hat{y}_i|\)。你看,MSE 和 RMSE 都带了"平方",所以都对大错更狠;MAE 不平方,对所有错一视同仁。
我教你个判断直觉: 如果业务里"偶尔错得离谱"是致命的(比如医疗、金融风控),用 RMSE/MSE,让大错付出大代价;如果业务里"每次都错一点点"更烦人(比如日常排班),MAE 更贴近你的真实痛感。选哪个,取决于你怕哪种错。
还有个坑: 这些指标一定、一定、一定要在没见过的数据(测试集)上算。拿训练集算误差,那叫自欺欺人,模型早把答案背下来了。
顺带理清一个最常见的混淆: 很多人把"同方差/异方差"和"MSE/RMSE"当成一类东西,其实它们根本不是一回事。
同方差、异方差(第二节 2.3 讲过)说的是残差长什么样:误差的"脾气"处处一样吗?它是个结构性质,回答的是"误差的分布均不均匀",不是一个数字。
而 MSE、RMSE 说的是残差有多大:把所有残差平方一平均,给你一个具体的数字,量化"模型平均错多少"。
最关键的区别在这:就算你的数据严重异方差(左边误差挤成团、右边散成云),MSE 照样能算,照样吐出一个数字。但这个数字会骗你,它把"不同区间错得不一样"平均成了一锅粥,你根本看不出"高收入那一段错得离谱"。所以光盯 RMSE 是发现不了异方差的,必须画残差图(回到 2.3 看那个喇叭口)。反过来,同方差成立时,RMSE 才有"全局统一标准"的意义,可以放心拿去跟别的模型比。
记牢一句:同方差/异方差是"误差的形状",MSE/RMSE 是"误差的大小"。形状不对,那个大小数字的意义就打了折扣。
原理(它们凭什么能代表"错"): 三个都是"预测值和真实值差多少"的聚合。MAE 用绝对值(也叫 L1 距离),对大小错一视同仁;MSE/RMSE 用平方(L2 距离),错得越大平方后权重越高。为什么常用平方?因为在"误差服从正态分布"的假设下,最小化 MSE 刚好等价于最大似然估计,数学上最省事。RMSE 只是把平方开根号,把单位拉回跟 y 一样好懂。
优缺点:
- MAE 优点:量纲直观(错 10 万就是 10 万)、对离群点稳健、最好解释。
- MAE 缺点:在 0 处不可导,优化时不如 MSE 顺手;所有错平权,凸显不出"偶尔错得离谱"这种致命错。
- MSE 优点:处处可导好训练、放大惩罚大错。
- MSE 缺点:单位是 y 的平方(比如"万元²"),人话难讲;对离群点极度敏感,一个野点能把它顶上天。
- RMSE 优点:同量纲、放大惩罚大错、工程上最常用。
- RMSE 缺点:因为带平方,仍被离群点牵着走;一个数字掩盖了误差的分布形状。
3.3 残差图:我心中最重要的那张图
前面说了,模型行不行看残差。那残差图就是你的体检报告。我最常画两张:
- 残差 vs 预测值:理想状态是点随机撒在 0 这条线上下,看不出任何形状。如果出现喇叭口(异方差)、出现弯月形(线性假设不成立)、出现明显的弧(该加二次项了),那就说明模型哪里没吃透。
- 残差 Q-Q 图:看残差是不是正态分布,做推断前必看。
我见过太多人,模型跑完只看 R² 和 p 值就交差了,残差图一次没画过。我跟你说,残差图是能救命的,它能在你以为"模型挺好"的时候,冷冷地告诉你"你漏了一个重要的非线性关系"。
原理(它到底在验什么): 最小二乘在前提都满足时,残差应该近似"白噪声":均值贴着 0、方差处处一样、彼此独立、长得像正态。残差图就是把残差摊开,拿眼睛(和检验)核对这套假设。残差对拟合值的图,专查"线性没、同方差没";Q-Q 图专查"正态没"。哪条假设破了,图上就有形状。
优缺点:
- 优点:最直观地暴露结构问题(非线性、异方差、离群点);不依赖一个冷冰冰的数字;很多次它真能拦住要上线的烂模型。
- 缺点:靠人眼判断,多少带主观;小样本时残差自己噪声也大,容易误判;它只负责"诊断"不负责"打分",得配着检验一起看。
3.4 t 检验和 F 检验:别被"显著"俩字唬住
统计课本里会让你看系数的 p 值。t 检验管的是单个变量:在控制其他变量不变的前提下,这个变量的系数"显著不等于零"吗?p 值小(比如 < 0.05),说明这个变量大概率真有用,不是碰巧。
F 检验管的是整体:你这一堆变量凑一块,比"啥都不用、只用平均值去猜"强吗?F 检验显著,说明模型整体有用;不显著,那你的模型还不如直接拿均值糊弄。
但我得泼盆冷水:"显著"不等于"重要",更不等于"有用"。 样本量巨大时,一个微小的、没啥业务意义的影响也能显著;样本量小时,真正重要的东西也可能不显著。p 值是个参考,不是圣旨。别跟业务方说"这个特征显著所以必须留",要说"这个特征在统计上有信号,结合业务判断它值不值得留"。
原理(p 值到底从哪来): 在最小二乘那套假设下,系数估计 \(\hat\beta_j\) 本身服从正态分布,把它除以自己的标准误,就变成 t 分布,得到 t 统计量。F 检验换了个角度:比较"受限模型(去掉某批特征)"和"全模型"的残差平方和之差,这个比值服从 F 分布。p 值的本意是:假如这个特征真的没用(原假设成立),你观察到这么极端统计量的概率有多大。概率小,说明"纯属巧合"说不通,特征大概率真有信号。
优缺点:
- 优点:把"是不是纯偶然"量化成一个概率,能跨变量横向比;F 检验给模型整体把关。
- 缺点:前提是同方差、正态,破了 p 值就失真(回头看 2.2、2.3);样本大时啥都显著、样本小时真信号也可能不显著;显著不等于重要、更不等于该留;变量一多还有"多重比较"的坑,测 20 个总有一两个碰巧显著。
3.5 交叉验证:最实在的一招
前面说的测试集评估,前提是你的测试集得划得对(这个坑我在第四节细说)。更稳的办法是交叉验证(Cross-Validation)。你提到的 F-Fold 就是它,行内把折数记成 K 或 F 都行,fold 就是"折"或者"份"的意思。最常用的是 K 折:把数据切成 K 份(这 K 份就叫 K 个 fold),轮流拿 K-1 份训练、留 1 份当验证集,这么转 K 圈,每一份都轮着当一次"考生",最后看 K 次表现的平均。
为什么非得这么折腾(作用):
单次切一份测试集,就像只考了一次试,题目刚好戳中你复习到的点,分数就虚高;题目偏了,分数又虚低。交叉验证等于"把整本试卷拆成 K 套,每套都考一遍取平均分",有两个实在好处:
- 稳:单次划分撞大运的运气成分被摊平了,得出的误差更代表模型真实水平,更敢拿去跟老板拍胸脯。
- 省:每个样本既当过训练数据又被测过一次,数据利用率拉满。样本少的时候这点特别关键,你舍不得把 20% 永久锁进测试集浪费掉,交叉验证替你精打细算。
(顺带一提,分类问题切的时候要做分层抽样 Stratified K-Fold,保证每一折里各类别比例跟整体一致,不然某折全是同一类,测出来就是瞎扯。)
举个具体的例子: 假设你有 100 条样本,选 K=5(5 折)。先把 100 条打乱,均分成 5 份,每份 20 条,叫 Fold1 到 Fold5。
- 第 1 轮:用 Fold2~5(80 条)训练,拿 Fold1(20 条)测,得到误差 12.3。
- 第 2 轮:用 Fold1、3~5 训练,Fold2 测,误差 9.8。
- 第 3 轮:用 Fold1、2、4、5 训练,Fold3 测,误差 11.1。
- 第 4 轮:Fold4 当测试,误差 10.5。
- 第 5 轮:Fold5 当测试,误差 13.0。
五轮跑完,每份数据都被测过一次,最后把 12.3、9.8、11.1、10.5、13.0 取平均,得到 11.34 作为模型的最终评估误差。这一个数字,比随便切一刀得到的单个误差可靠得多。
我自己的底线:凡是要上线的模型,必须过交叉验证,单次 train/test 的漂亮数字我一个字都不信。
原理(它凭什么比单次划分稳): 核心就一句话,数据重用。每次留出一份当"从没见过的数据"算误差,转 K 圈把每份都测一遍,最后平均。这个平均值逼近的是"模型在独立新数据上的期望误差",比单次切一刀更接近真实泛化能力,因为它没把运气押在某一次划分上。
优缺点:
- 优点:摊平了单次划分的撞大运,误差更可信;每个样本既训练过又被测过一次,数据利用率高,样本少时尤其划算;过程可重复。
- 缺点:训练成本变 K 倍;K 取太大(比如留一法 LOO)方差反而大、还特别慢;它默认数据是随机独立的,时间序列不能这么随机切(见第四节坑二);分类问题还得手动做分层抽样;说到底它仍是估计值,不是上线后的真实表现。
3.6 过拟合与欠拟合:学习曲线一图看穿
- 欠拟合:模型太简单,连训练集都学不明白,训练和测试误差都高。病根常是特征没选好、或用了不合适的线性假设去套非线性关系。
- 过拟合:模型把训练集里的噪声都背下来了,训练误差极低,一换测试集就露馅,测试误差高高在上。病根常是特征太多、样本太少。
判别神器是学习曲线: 横轴是训练样本量,纵轴是误差。如果随着数据增多,训练误差和测试误差逐渐靠拢且都低,说明状态健康;如果两条线始终分得很开(训练低、测试高),就是过拟合;如果两条线都高,就是欠拟合。这张图我建议每个模型都画,一眼定性。
原理(两条线在讲什么故事): 训练误差随样本变多通常会往上爬(数据多了模型学不全噪声),测试误差会往下掉(学得越来越泛化),两条线的缝隙就是"泛化差距"。缝隙大等于方差大等于过拟合;两条都趴在高处等于偏差大等于欠拟合;缝隙闭合且都低等于刚刚好。
优缺点:
- 优点:一张图就把偏差/方差权衡定性了,直观告诉你"再加数据还有没有用"。
- 缺点:要反复训练多个模型,费算力;只给方向不给明确阈值;样本少时曲线抖,判断容易飘。
3.7 AIC 和 BIC:选模型时的"惩罚秤"
当你在好几个候选模型之间纠结(比如到底留 3 个特征还是 5 个),AIC 和 BIC 给你一个带惩罚的打分:误差小的模型分低(好),但用的参数多的模型会被扣分。BIC 比 AIC 对"参数多"罚得更狠。谁分低选谁。
它俩分别是什么?
AIC 是 Akaike Information Criterion(赤池信息量准则),1970 年代日本人赤池弘次搞出来的。它真正想回答的问题是:假如我用这个模型去预测一批新数据,平均会错多少?它用信息论的话翻译过来就是,衡量你的模型预测分布和真实数据分布之间的 KL 散度(差距)的期望。选 AIC 最小的,等价于选"预测误差期望最小"的模型。所以 AIC 本质上是个"预测能力"的代理指标,它关心的不是你这条线拟合得多漂亮,而是换批新数据还灵不灵。
BIC 是 Bayesian Information Criterion(贝叶斯信息准则),也叫 Schwarz 准则。它从贝叶斯视角出发,近似回答另一个问题:在这么多候选模型里,哪个最有可能是真实模型。所以它偏向"找到真相",比 AIC 更保守、更不想让你乱塞特征。
公式长啥样(别怕,只是长得好看)
通用的写法是:
其中 \(\hat{L}\) 是模型的最大似然值(拟合越好它越大),\(k\) 是参数个数,\(n\) 是样本量。在线性回归、且假设误差服从正态分布的前提下,可以化简成你更好记的形式:
这里的 \(\hat{\sigma}^2\) 是残差方差的估计(约等于 \(RSS/n\))。第一项 \(n\ln(\hat{\sigma}^2)\) 代表"拟合误差",越小越好;第二项就是"惩罚",参数越多罚得越重。 这就是"惩罚秤"名字的来历。
它俩到底差在哪
注意上面两个公式,第一项完全一样,差别只在惩罚项:AIC 罚 \(2k\),BIC 罚 \(k\ln(n)\)。只要样本量 \(n > 7\),就有 \(\ln(n) > 2\),而且 \(n\) 越大这个差距越夸张。所以:
- 想要预测准、不太在乎复杂:AIC 更友好,敢留稍复杂的模型。
- 想要简洁、可解释、逼近真相:BIC 更狠,倾向砍掉多余特征。
一句话记牢:AIC 管"预测准不准",BIC 管"是不是真模型",BIC 对复杂更零容忍。
举个数字例子你就懂了
假设有 100 条数据。模型 A 用 3 个特征,残差方差 \(\hat{\sigma}^2 = 4.0\);模型 B 用 6 个特征,残差方差 \(\hat{\sigma}^2 = 3.7\)(拟合略好一点)。
- \(AIC_A = 100 \times \ln(4.0) + 2 \times 3 = 138.6 + 6 = 144.6\)
- \(AIC_B = 100 \times \ln(3.7) + 2 \times 6 = 130.8 + 12 = 142.8\)
- \(BIC_A = 100 \times \ln(4.0) + 3 \times \ln(100) = 138.6 + 13.8 = 152.4\)
- \(BIC_B = 100 \times \ln(3.7) + 6 \times \ln(100) = 130.8 + 27.6 = 158.4\)
看出来没:AIC 觉得 B 略好(宁可复杂点换更好的拟合),BIC 觉得 A 更好(多 3 个特征换来的那点拟合提升,不值这个复杂度)。这就是它俩性格差异的实锤。
提醒一句: AIC/BIC 是"相对"指标,只用来比"这几个里哪个更优",分本身的绝对大小没意义,别拿去跟别人家的模型比。而且它俩都得基于同一批数据、同一个因变量才算数。
原理再补一刀(它俩的出身决定了性格): AIC 近似的是"用这个模型预测新数据时,预测分布和真实分布的 KL 散度期望",所以它是为"预测"生的;BIC 近似的是"在候选模型里选真模型"的贝叶斯后验概率(大样本下就是贝叶斯因子),所以它是为"找真相"生的。也正因为这个出身,BIC 在大样本下有个数论性质:选到真模型的概率趋近 1(统计学叫"一致"),AIC 没有这个保证,它可能为了预测宁可留点多余特征。
优缺点:
- AIC 优点:盯着预测准,小样本也稳,算起来简单,选出的模型泛化往往不差。
- AIC 缺点:不保证选到真模型,大样本也可能恋复杂;只能相对比,绝对值没意义;依赖似然假设成立。
- BIC 优点:大样本一致(选真概率趋近 1)、惩罚随样本加重天然防过拟合、偏简洁好解释。
- BIC 缺点:小样本可能砍太狠把有用特征删了;也只能相对比;模型设定本身错了它也救不回。
3.8 别忘了业务指标:模型再漂亮,老板只向“钱”看
说了这么多统计指标,我最后落一记重锤:真正决定模型生死的,是业务指标。 你 R² 0.95,但预测偏差导致公司一个月多花 50 万,这模型就是垃圾;你 R² 0.6,但刚好卡对了关键决策点,帮公司省了钱,这就是好模型。
所以我每次评估,都会额外问自己三个问题:预测错了代价多大?模型在业务关键区间(不是平均区间)准不准?它给出的结论,业务方敢不敢照着做决策?统计指标是体检,业务指标才是出院小结。
原理(它衡量的其实是"后果"): 统计指标回答"预测准不准",业务指标回答"准不准带来了什么"。做法就是把预测误差翻译成钱、风险、转化率、决策质量这些业务方能直接拍板的语言。同一个 RMSE,在 A 业务里错一次亏 5 块,在 B 业务里错一次亏 5 万,模型生死天差地别。
优缺点:
- 优点:直接对接决策,老板一眼懂,常常才是决定模型上不上的那把尺。
- 缺点:难量化、带主观、往往上线才见真章(滞后);口径随业务变,没法跨公司比;它不能替统计指标干活,统计是体检,业务是出院小结,缺哪个都不行。
3.9 这么多指标,到底先看哪个、怎么组合
到这儿,指标堆了一桌子:R²、调整 R²、MSE、RMSE、MAE、残差图、t 检验、F 检验、交叉验证、学习曲线、AIC/BIC,还有业务指标。你肯定想问:我是全用,还是挑几个,还是随便看一个?
我的答案很干脆:别全用,分层次、按目的组合。全甩出来有两个坏处:一是老板和业务方直接看晕,二是这些指标各有各的脾气,有的还会打架,你得知道听谁的。
我自己的评估顺序,是把它们分成五层,从"模型是不是在胡说"一路问到"业务赚不赚钱":
第一层:模型有没有在胡说(前提体检)。 先画残差图(3.3),再看第二章那六条前提。这一步不过关,后面所有数字都是空中楼阁。残差长成喇叭口、或者明显有弯弯绕,说明线本身就没找对,R² 再高也白搭。
第二层:到底错多大(误差指标)。 在测试集或交叉验证上算 RMSE 和 MAE(3.2)。RMSE 看"典型错多少、大错惩罚重",MAE 看"平均错多少、不被野点带偏",两个一起看才立体。它们和 R² 是互补的:R² 告诉你"解释了多大比例",RMSE 告诉你"实际错几块钱",光看比例不看绝对值,容易自我感动。
第三层:系数能不能信(推断)。 如果你要跟老板说"这个特征真的有用",就上 t 检验(单个特征)和 F 检验(整体)。但记住 2.2、2.3 的教训:异方差、自相关会骗这些检验,前提不满足时 p 值不可信。只做预测、不解释系数,这层可以跳过。
第四层:该选哪个模型(复杂度权衡)。 在多个候选模型里挑,看调整 R²(3.1)和 AIC/BIC(3.7);想验证泛化稳不稳,交叉验证(3.5)最实在。这层的指标专治"特征塞太多"的过拟合。
第五层:业务关(3.8)。 前面四层全过,最后还得回到业务指标:预测错代价多大、关键区间准不准、业务方敢不敢照做。统计指标是体检,业务指标才是出院小结。
给你一套实战最小组合:
- 日常回归建模,三个就够:残差图 + 测试集 RMSE + 调整 R²。残差图查胡说,RMSE 看错多大,调整 R² 防过拟合。
- 要汇报"哪个特征显著":加 t/F 检验,但先确认同方差。
- 要在好几个模型里挑:加交叉验证 + AIC/BIC 互相印证。
- 要给老板看:把上面翻译成业务指标。
最后点破一个坑: 这些指标会"打架"。R² 只会涨、最恋复杂;BIC 最恨复杂。所以你常会看到 R² 很高但 BIC 说"砍"。这时候听 BIC 的(它考虑了复杂度代价),别被 R² 的高分忽悠。指标不是越多越专业,是在正确的问题面前用正确的那一个。先问自己"我现在要回答什么":错多大、系数可信吗、选哪个模型、业务赚不赚,然后各取所需。
四、上线容易炸的坑
前面那些是统计层面的,下面这几条是我在一线被按在地上摩擦之后,一条条攒出来的工程教训。教材不会写,因为教材不负责上线。
坑一:数据泄漏(Data Leakage)。 最阴险的坑。你在特征里不小心混进了一个"作弊"变量,比如预测用户会不会流失,你用了"本月是否已注销"当特征。这变量当然强相关,模型 R² 爆表,但上线后根本拿不到这个未来才知道的数据,瞬间现原形。凡是"看着强得离谱"的特征,先怀疑它是不是偷看了答案。
坑二:时间序列瞎用普通线性回归。 很多业务数据是带时间顺序的(销量、股价、流量)。你用 sklearn 默认 train_test_split 随机打乱划分,等于把"未来的信息"泄给了训练集,测出来的误差好看到不真实。时间序列必须按时间切:拿前面的训,预测后面的。否则你测出来的"神模型",只是时间穿越了。
坑三:类别变量没编码。 你有个"城市"字段,值是"北京/上海/广州",线性回归不认文字,你得做独热编码(One-Hot)。但很多人顺手用了 1/2/3 的数值编码,模型会误以为"上海 = 北京的 2 倍",凭空造出虚假的序关系。类别就是类别,别拿数字硬塞。
坑四:标准化只在训练集做。 如果你的模型需要标准化(比如后面要上岭回归、逻辑回归),必须用训练集的均值和标准差去标准化测试集,绝不能拿全量数据先标准化再切分,那又是一次泄漏。测试集在训练时应该"不存在"。
坑五:拿训练集指标吹牛。 我开头说的那个 R² 0.9 的翻车,多半就是拿训练集算的。训练集上的好是应该的,模型见过答案。只认测试集 / 交叉验证的数字。
坑六:把相关当因果。 这条呼应第二节的外生性。线性回归告诉你"A 和 B 一起变",但没告诉你"A 导致 B"。老板要是问"我多投 10 万广告,销量涨多少",普通线性回归给不出干净的答案,因为广告和销量之间可能还有品牌、季节这些混进来。要做因果,得上实验设计(A/B 测试)或者更硬的方法。别让你的模型说出它没资格说的话。
五、写在最后
线性回归是 machine learning 里最老、最朴素、也最被低估的模型。越往后越敬畏它:它可解释、好调试、算得快、给的结论业务方能看懂。
当你真懂它的脾气。拟合之前,那六条假设不是教材里的摆设,是模型的地基;模型训完,那一堆指标不是用来发朋友圈炫耀的,是用来判断它到底能不能上战场的。
下次你再训完一个线性模型,别急着交差。先问自己一句:我的残差图干净吗?我的数字是在没见过的数据上算的吗?我的结论,有没有把相关说成了因果?
这三个问题答得上来,你就已经超过大多数只会调包的人了。
建议
- 拟合前的 6 条假设是模型的地基。线性关系和外生性是硬伤(预测/因果从根上歪),异方差和自相关主要搞乱推断,正态性最软,多重共线性是"能用的别扭模型"。
- 评估别只盯 R²,它在你堆特征时只会涨。认调整 R²、看测试集或交叉验证的 RMSE、画残差图,比任何一个单一数字都实在。
- 模型再漂亮,老板只认业务指标。残差图干净、数字在没见过的数据上算、结论没把相关说成因果,这三条过关,你才敢拍胸脯。
与君共鸣~

浙公网安备 33010602011771号