评估与陷阱
模型做错了,通常还能补救;模型评估做错了,你根本不知道自己做错了。这一页的四个实验都不教你怎么把准确率做高,它们只做一件事:展示那些让准确率看起来很高、实际却站不住的常见陷阱。如果整个模块只看一页,建议看这一页。
本页实验台
LAB 01
交叉验证
K 折怎么切、为什么留一法方差大
本次 CV 的误差估计—
真实的样本外误差—
偏差(CV − 真值)—
重复 30 次的标准差—
K 折交叉验证有两个相反的毛病,它们随 K 反向变化。偏差:K 小的时候每轮只用 (K−1)/K 的数据训练,模型见得少、表现偏差,于是 CV 会高估真实误差。方差:K 大的时候各折的训练集几乎完全重叠(留一法里任意两折的训练集只差两个样本),K 个估计高度相关,平均起来并不能有效降低方差。默认参数(60 个点、3 阶)下模型很稳,K 从 2 拉到 60,估计值都在 0.15 到 0.18 之间,标准差从 0.039 缓慢降到 0.031——这时候 K 选几折几乎无所谓。把样本数调到 40、阶数调到 6 再看一遍,差别立刻就出来了:K=2 时 CV 估计是 1.08(真值 0.199),高估了五倍,重复 30 次的标准差高达 1.49;K=5 就回到 0.198、标准差 0.058;再往上基本不动。模型越不稳定、样本越少,小 K 的偏差越致命。而留一法要训练 n 次,买到的那点改进(标准差 0.058 → 0.046)通常不值这个价——这就是"默认用 5 折或 10 折"这条经验法则的来源,它不是随便定的。
LAB 02
ROC 与 PR 曲线
调阈值看两条曲线上的点怎么移动;类别不平衡时哪条更诚实
ROC 曲线下面积 AUC—
PR 曲线下面积(平均精确率)—
当前阈值:TPR / FPR—
当前阈值:精确率 / 召回率—
把正类占比从 50% 拖到 2%,其他都不动,然后对比两条曲线。ROC 几乎没变,AUC 还是那个漂亮的数字;而 PR 曲线会整条塌下去,平均精确率跌得很惨。原因在分母上:FPR 的分母是全部负样本,负样本一多,几百个假阳性摊进去也只是一点点 FPR;而精确率的分母是"你判为正的那些",几百个假阳性会直接把它压垮。所以在正类稀少的场景里(欺诈、故障、罕见病),ROC-AUC 是那个会骗人的指标,PR 才是诚实的那个。再看阈值:拖动它,两条曲线上的点会同步移动。这提醒一件常被忽略的事——AUC 评价的是"排序能力",和你最终用哪个阈值无关;而上线时你必须挑一个阈值,那一步需要的是业务上的代价权衡,不是再看一眼 AUC。
LAB 03
数据泄漏
先标准化再切分 vs 先切分再标准化,成绩差多少
先选特征再交叉验证(泄漏)—
在每个训练折内部选特征(正确)—
真实水平—
被凭空造出来的准确率—
这个实验里的标签和特征完全无关——全部是随机数。任何诚实的评估都应该给出 50% 左右,也就是抛硬币。但只要你先用全部数据挑出"和标签最相关"的几个特征,再做交叉验证,准确率就会跳到 70%~90%。这些"信号"是从几百个纯噪声特征里挑剩下的幸存者:特征越多,总有几个碰巧和标签对得上。把特征数从 50 拉到 2000,看这个假成绩怎么一路涨上去。问题出在"挑特征"这一步也用到了验证集的标签。正确做法是把特征选择放进交叉验证的循环里——每一折只用该折的训练数据挑特征。读数里第二行就是这么做的结果:稳稳地停在 50%。这个陷阱在真实工作里极其常见,而且非常隐蔽,因为出错的不是模型,是流程。一条能救命的检查:把标签随机打乱再跑一遍整个流程,如果成绩还是很好,那你的流程一定漏了。
LAB 04
混淆矩阵
四个格子与各项指标的换算关系
准确率—
全预测为负类的准确率—
精确率 / 召回率—
F1 分数—
正类占比 8%,一个什么都不学、永远预测"负类"的模型,准确率是 90.5%。这个数字写进报告里毫无问题,看起来还挺体面——这就是为什么在不平衡数据上单独汇报准确率几乎等同于误导。读数第二行专门放了这个"什么都不做"的基准,你的模型必须明显超过它才说明学到了东西。拖动阈值看右下那张图:准确率是一路单调上升的,在阈值接近 1 时达到最大(91.0%),而那时模型几乎不再把任何样本判为正,已经退化成那条"全预测为负"的基准线(90.5%)。换句话说,如果你拿准确率去调阈值,它会一路把你推向那个什么都不做的解。相反,精确率和召回率一个升一个降,F1 在中间取到峰值——那才是一个有意义的折中点。这三条曲线的形状差异,正是"挑指标"这件事的全部意义。实际选哪一个取决于两类错误的代价:漏诊一个癌症病人和多做一次活检,代价完全不同;拦截一笔正常交易和放过一笔欺诈,代价也完全不同。先把这两个代价写出来,再回头挑指标和阈值——顺序反过来就会变成用指标去合理化已经做好的决定。
这一页想说的
这一页的四个陷阱有一个共同点:它们都不会让程序报错,只会让数字变好看。所以能救你的不是更强的模型,而是几条固定的流程习惯:一、先划出测试集,在所有分析开始之前,并且只用一次;二、所有涉及数据的处理(标准化、特征选择、缺失值填补、重采样)都必须放进交叉验证的循环里;三、永远报一个基准——朴素模型、多数类、上一版模型;四、把标签打乱跑一遍,看看成绩会不会掉到随机水平。这四条做到了,你的结论才配得上"实验证明"四个字。