回归
回归是机器学习里最老实的一块:模型写得出来、系数看得懂、误差能分解成"偏了多少"和"抖了多少"。正因为它足够简单,过拟合、正则化、偏差—方差这些贯穿整个领域的概念,在这里能被完整地看见一遍。把这一页看懂,后面的分类、神经网络其实只是换了个模型形式。
本页实验台
LAB 01
最小二乘
拖动数据点,回归线实时跟随,残差平方和同步显示
拟合结果 y = a + b·x—
去掉离群点之后—
R²(含离群点 / 不含)—
离群点的杠杆值 h—
把离群点的 x 位置从 0.5 拖到 0.95,偏离量不变。同样"离谱"的一个点,放在数据中间几乎不影响直线,放到最右端却能把整条线撬起来。读数里的杠杆值 h 就是在量这件事:h 只跟这个点的 x 有关,跟它的 y 一点关系都没有,x 越远离样本均值,h 越大,它对拟合结果的话语权就越大。最小二乘对离群点不稳健,这不是实现问题,是目标函数决定的:误差被平方,偏离 10 倍的点贡献 100 倍的惩罚,于是直线被迫往它靠过去。真实工作里遇到重尾数据,可以换成绝对值损失(分位数回归)、Huber 损失或 RANSAC;但更值得做的第一步是把这个点画出来看看——它常常不是噪声,而是数据收集出了问题。
LAB 02
多项式阶数与过拟合
阶数从 1 加到 15,训练误差一路降、测试误差先降后升
训练 RMSE—
测试 RMSE—
测试误差最小的阶数—
最大系数的绝对值—
把阶数从 1 一路推到 15,盯着右下那两条曲线。训练误差是单调下降的——这是代数决定的,参数多一个,拟合能力只会变强不会变弱。测试误差却是先降后升,最低点一般落在真实函数的阶数附近。训练误差永远不能用来选模型,这一页就是那句话的现场证明。再看最后一个读数:随着阶数上升,系数的绝对值会暴涨到成千上万。高阶多项式靠的是几个巨大的系数相互抵消来穿过每一个点,这种"精巧的平衡"稍有扰动就崩掉——这正是它在新数据上表现很差的原因,也直接引出了下一个实验台:既然大系数是病根,那就在目标函数里罚它。
LAB 03
岭回归与 Lasso
正则化路径:系数随 λ 收缩,Lasso 把它们一个个压到零
非零系数个数—
测试 RMSE—
选对的 / 选错的特征数—
当前 λ—
两条正则化路径长得完全不一样。岭回归把所有系数一起按比例压小,但谁也压不到零;Lasso 则是一个一个地把系数压到零上去,路径图上能看到折线一条条撞到零轴然后贴着走。几何原因在教科书上是那张经典的图:L1 的约束区域是个菱形,有尖角落在坐标轴上,等高线最先碰到的往往就是尖角,于是某些坐标恰好为零;L2 的约束区域是个圆,没有尖角,也就没有稀疏性。所以选哪个,取决于你要什么。想做特征选择、想要一个能讲清楚的模型,用 Lasso;特征之间高度相关、只想稳住系数,用岭回归(Lasso 在相关特征里只会随机挑一个留下,这一点经常被忽略)。把 λ 拖到最右边:两种方法都会把所有系数压成零,模型退化成一条水平线。
LAB 04
偏差—方差分解
重复采样训练多条模型,看「平均偏差」与「抖动幅度」此消彼长
偏差²—
方差—
噪声(不可约误差)—
三者之和 / 实测总误差—
最后一个读数是这一页最值得看的地方。它把"偏差² + 方差 + 噪声"和直接测出来的期望平方误差并排放在一起,两个数应该一直相等——这不是巧合,是一个恒等式。这也说明偏差和方差不是比喻,是可以算出来的量。把阶数从 0 慢慢加到 12:0 阶时模型是一条水平线,偏差巨大而方差几乎为零(怎么采样都是那条线);阶数一高,平均模型反而更贴近真相(偏差降下来了),但每一次采样得到的曲线开始上下乱飞,方差飙升。总误差在中间某处取到最小——那就是"刚刚好"的复杂度。默认这组数据上:0 阶时偏差² 0.246、方差 0.033;3 阶时偏差² 掉到 0.007,方差却涨到 0.291;到 9 阶方差已经是 167,模型彻底失控。再把每次训练的点数从 14 加到 60(阶数固定在 6):方差从 3.38 降到 0.021,而偏差² 本来就只有 0.008,几乎没有下降空间。这就是"更多数据能治过拟合、但治不了欠拟合"的精确含义。
这一页想说的
这一页四个实验其实在回答同一个问题:模型该有多复杂?答案不能从训练误差里读出来,因为它永远随复杂度下降;也不能靠直觉,因为过拟合在训练集上看起来完美无缺。能用的办法只有两类:一是把数据留一部分出来诚实地测(下一页的交叉验证);二是在目标函数里给复杂度定个价(正则化)。两者通常一起用——先用正则化把模型族参数化,再用交叉验证挑那个参数。