本章为原创自学扩写,不是官方试题、评分标准或考试权重。先在纸上理解每一步,再使用程序核对。
1. 看清输入、未知数和输出
一条样本是一条已观测记录。样本数记为 n;每条记录的原始特征数记为 d。第 i 条记录的第 j 个特征写 xᵢⱼ,响应写 yᵢ。下标只是编号,不是相乘。我们希望输入新特征后输出预测 ŷ,而不是直接输出一个误差分数。
普通仿射模型为 ŷᵢ=a+Σⱼbⱼxᵢⱼ。a 是截距:所有特征为零时的模型输出;bⱼ是保持其他特征不变时,第 j 个输入增加一单位所导致的预测改变量。这里的“保持不变”很重要;两个特征一同改变时,不能只看一个系数。
设计矩阵 M 把每条记录变成一行,把每个模型项变成一列。参数向量 c 按相同顺序装入系数。若模型是 a+bx,行是 [1,x],c=[a,b]ᵀ;若模型是 a+bx+qx²,行是 [1,x,x²]。设计列数记 p,所以 M 是 n×p,c 是 p×1,Mc 是 n×1。只有包含截距和全部原始特征的普通仿射模型才有 p=d+1;一个原始特征的二次模型已有三列。
残差 r=y−Mc,是观测减预测。平方损失 RSS=Σᵢrᵢ²=‖y−Mc‖₂²。平方让正负误差不能抵消,并使较大的误差付出更高代价。argmin 返回令目标最小的参数,不是最小损失数值。
2. 先真正拟合一次,不跳过消元
取三个点 (0,1),(1,2),(2,4)。模型 ŷ=a+bx 的设计矩阵三行为 [1,0]、[1,1]、[1,2],响应向量为 [1,2,4]ᵀ。
RSS=(1−a)²+(2−a−b)²+(4−a−2b)²。
对 a 求导并令其为零:−2[(1−a)+(2−a−b)+(4−a−2b)]=0,化为 3a+3b=7。
对 b 求导:−2[(2−a−b)+2(4−a−2b)]=0,化为 3a+5b=10。第二式减第一式得到 2b=3,所以 b=3/2;代回第一式,3a=7−9/2=5/2,因此 a=5/6。
最终拟合模型是 ŷ=5/6+(3/2)x。在三个训练输入上的预测是 5/6,7/3,23/6,残差为 1/6,−1/3,1/6。平方求和得 RSS=1/36+1/9+1/36=1/6。
检查不是再背一遍答案:残差之和 1/6−1/3+1/6=0;输入与残差的内积 0(1/6)+1(−1/3)+2(1/6)=0。这两条分别对应截距列和特征列与残差正交。
矩阵写法是 MᵀMc=Mᵀy。它只是刚才两条方程的简写,不是另一种拟合原则。只有 M 满列秩才能直接写 c=(MᵀM)⁻¹Mᵀy。反例:若两列完全相同,改变两列系数但保持其和不变,预测不变,参数便不唯一。实践中可用 QR 或 SVD 求解,不必显式求逆。
3. LOOCV:每一折先删点,再重新训练
现在要在“常数模型 ŷ=a”和“直线模型 ŷ=a+bx”之间选择。用全体数据拟合后再轮流计算各点误差,是训练误差,不是留一交叉验证。
LOOCV 的输入是开发数据、候选模型和损失定义。本例每次留出一个点验证,其余两点拟合。三个留出平方误差取平均;越小越好。留出点的响应只能在评分时使用,不能参与本折拟合。
为什么常数预测取训练均值?对m个训练响应,用同一个实数a预测,最小化它们到a的偏差平方和。对求和逐项求导,令导数为零,再除以正的样本数m。二阶导数为正,所以这不仅是驻点,更是唯一最小点。每折均值都由该折训练响应重新计算,不能加入被留出响应。
第一折:留出 (0,1)
训练点是 (1,2),(2,4)。常数最小二乘取训练响应均值 (2+4)/2=3,在 x=0 预测3,平方误差 (1−3)²=4。
直线斜率为 (4−2)/(2−1)=2,截距由 2=a+2×1 得 a=0。所以本折直线 ŷ=2x,在 x=0 预测0,平方误差 (1−0)²=1。
第二折:留出 (1,2)
训练点是 (0,1),(2,4)。常数为 (1+4)/2=5/2,平方误差 (2−5/2)²=1/4。
直线斜率 (4−1)/(2−0)=3/2,截距1。本折在 x=1 预测 1+3/2=5/2,平方误差同样为1/4。
第三折:留出 (2,4)
训练点是 (0,1),(1,2)。常数为3/2,平方误差 (4−3/2)²=25/4。直线为 ŷ=1+x,在 x=2 预测3,平方误差 (4−3)²=1。
| 留出的 x | 常数预测 | 常数平方误差 | 直线预测 | 直线平方误差 |
|---|---|---|---|---|
| 0 | 3 | 4 | 0 | 1 |
| 1 | 5/2 | 1/4 | 5/2 | 1/4 |
| 2 | 3/2 | 25/4 | 3 | 1 |
常数 LOOCV=(4+1/4+25/4)/3=7/2=3.5。直线 LOOCV=(1+1/4+1)/3=3/4=0.75。因此本次比较选择直线模型族,而不是宣布某一折的系数获胜。
选择后,用全部三个开发样本重新拟合,得到前节的 ŷ=5/6+(3/2)x。这一步称 refit。不能任选 2x、1+1.5x 或 1+x 当最终模型。对新输入 x=3,最终预测为 5/6+9/2=16/3。它是预测值,不是已知真实响应;没有新点真实 y,就不能算该点预测误差。
如果另外有最终测试集,它在选择模型、选择 λ、改特征时都不能被用来调参。选择结束后评一次的测试成绩与反复查看后调出来的成绩含义不同。仅有本例三点时,没有独立测试集,LOOCV不能伪装成最终独立测试结果。
4. 评分、折大小和泄漏
训练响应均值为 7/3。TSS=(1−7/3)²+(2−7/3)²+(4−7/3)²=(16+1+25)/9=14/3。全数据重拟合的训练 R²=1−(1/6)/(14/3)=27/28。这个很高的训练分数与 LOOCV 的0.75不是同一种量:一个是相对训练均值的无量纲解释比例,一个是留出预测的平均平方误差。
MSE=RSS/m,其中 m 是正在评分的数据集大小;RMSE=√MSE,单位与 y 相同;MAE=Σ|rᵢ|/m。本例训练 MSE=1/18,MAE=2/9。单点验证折的 TSS 为0,不能逐折计算普通 R²再平均。测试 R²可以为负;例如真实值[2,4]却都预测6,RSS=20,TSS=2,R²=−9。
不等大小的折若要计算每个验证样本等权的MSE,应汇总全部平方误差除以全部验证样本数。例:第一折1点、MSE=9,第二折3点、MSE=1,则合并MSE=(1×9+3×1)/4=3,不是(9+1)/2=5。折平均和样本平均回答不同问题,不能悄悄替换。
任何从数据学习的预处理都属于训练流程。每折只用本折训练部分计算均值、标准差、缺失值填补规则和特征选择规则,再原样应用到验证折。最终 refit 才可用全部开发数据重算这些量。反例:先用全体样本算均值、再分折,留出点已影响坐标系统,形成信息泄漏,即使没有直接拿它的 y 拟合也不对。
为什么k折每轮训练样本数是n(k−1)/k
这里n数开发样本,k数折数,不是特征数或参数数。把观测分成k个互不重叠、尽量等大的验证组。每轮恰留一组验证,其补集就是训练部分。若n能被k整除,留出组有n/k个观测,从总数n减去它便得到训练数。例如n=100、k=5,每轮留20个验证、80个训练;共跑五轮,每个观测恰被验证一次。若n=103、k=5,均衡折大小可为21、21、21、20、20,对应训练数82、82、82、83、83;公式给出的82.4只是平均或近似,不存在0.4个样本。LOOCV是k=n的特例,每轮用n−1个观测训练。
Monte Carlo验证:反复随机划分,不是输入敏感性
先确定候选模型或λ值、损失、训练/验证比例和重复次数,再看结果。每次从开发数据重新随机划分,例如从n=100中取80个训练、20个验证。不同次可重复用到同一观测,所以它们不是k折那样互不重叠的组;同一次的各候选应共享同一划分,才公平比较。普通随机划分假定观测可交换;时间序列或分组数据应采用尊重时间或组别的划分,不能打乱后假装独立。
每次按四步执行:(1)只用当次80个训练观测估计均值、尺度及其他会从数据学习的预处理;(2)固定这些规则,应用到训练与验证两部分;(3)只用这80个观测拟合各候选;(4)预测20个验证响应,计算规定的验证损失。每个候选、每次划分都记录一个损失,再对每个候选跨次取平均,按平均损失较小者选择。不能挑最幸运的一次划分,也不能把那一次的拟合系数直接当最终模型。
一个小型记账例子:三次验证中,λ=0的MSE为4、9、5,λ=2的MSE为6、5、4。平均分别是6和5,所以选λ=2,即使λ=0在第一次曾取得4。这些是说明如何汇总的假设损失,不是声称新跑出的实验。选定后,在全部100个开发观测上重估预处理并重新拟合λ=2模型。若另有最终测试集,只有选择固定后才作最后评价;它的观测或响应不能参与选划分、选λ或估计预处理。
Monte Carlo验证重新抽取训练/验证划分,用样本外损失选模型;Monte Carlo输入敏感性则扰动输入或不确定量,观察模型输出如何改变,后文讨论的是后一问题,二者不能混为一谈。LOOCV或重复划分得分较低,只表示在这些数据、这些候选及该比较程序中更好;不保证真实总体模型最优、不保证胜过没试过的候选,也不保证未来误差最小。反复用同一验证证据作很多选择,本身也可能对验证证据过拟合。
5. 反标准化:先还原响应,再展开输入
定义 zⱼ=(xⱼ−μⱼ)/sⱼ,其中 μⱼ和 sⱼ是训练特征的均值和非零标准差。若响应也变换为 t=(y−μᵧ)/sᵧ,拟合的是 t̂=β₀+Σβⱼzⱼ,则先还原响应:ŷ=μᵧ+sᵧt̂。
代入 z 得 ŷ=μᵧ+sᵧβ₀+Σ(sᵧβⱼ/sⱼ)(xⱼ−μⱼ)。把含 x 的项和常数项分开,原单位斜率 bⱼ=sᵧβⱼ/sⱼ,截距 a=μᵧ+sᵧβ₀−Σbⱼμⱼ。若 y 没有标准化,用 μᵧ=0,sᵧ=1;不能多乘一个并不存在的响应标准差。
例:μₓ=4,sₓ=2,μᵧ=10,sᵧ=5,β₀=0,β₁=2。斜率 b=5×2/2=5;截距 a=10−5×4=−10。因此 ŷ=−10+5x。检查 x=6:原式给20;标准化路线 z=(6−4)/2=1,t̂=2,再还原10+5×2=20。两条路线一致才是完整检查。
错误反例:把截距直接当10会得到10+5×6=40;错在没有减去输入中心化已经贡献的20。零方差列 sⱼ=0不能相除,应删除冗余常数特征或制定明确常数列处理规则。标准化不等于单位范数:总体方差约定下,n个标准化值平方和为n,而不是1。
6. Ridge:先写完整目标,再求导
Ridge用平方系数惩罚。这里明确规定 J(c)=‖y−Mc‖²+λcᵀDc,λ≥0,D是对角的惩罚指示矩阵。全部系数都罚时 D=I;第一个系数为不惩罚的截距时 D=diag(0,1,…,1)。λ不是默认1,更不能在缺少原矩阵时猜数值答案。
展开损失后求梯度:2Mᵀ(Mc−y)+2λDc=0,故 (MᵀM+λD)c=Mᵀy。只有左侧可逆时才能写逆式。对λ>0,其二次型为 ‖Mv‖²+λvᵀDv。D半正定时唯一性条件是 Null(M) 与 Null(D) 只有零向量相交。全惩罚自动满足;不罚截距时要检查未罚方向是否仍被数据识别。
一个数据齐全的新例:x=[−1,0,1], y=[0,1,2],拟合 a+bx,RSS+2b²,不罚截距。设计列正交,MᵀM=diag(3,2),Mᵀy=[3,2]ᵀ,所以3a=3,(2+2)b=2,得到 a=1,b=1/2。预测[1/2,1,3/2],RSS=1/2,惩罚2(1/2)²=1/2,总目标1。OLS是a=1,b=1,RSS=0,但同一ridge目标为2,因此ridge牺牲部分拟合换取较小惩罚,计算并未出错。
若把截距也罚,第一条方程变为5a=3,a=3/5,已是另一个问题。若使用RSS/n+α‖c‖²,乘n后对应λ=nα;不能把不同归一化下相同数字的λ视为同一强度。列正交且列平方范数dⱼ时,系数缩放因子为dⱼ/(dⱼ+λ);只有各dⱼ相同才是同一比例。相关列不能逐坐标套这个公式。
7. Lasso:零点不能漏掉
目标 F(c)=(c−3)²+λ|c|,λ≥0。c>0时导数2(c−3)+λ,候选 c=3−λ/2,只在λ<6时为正。c<0时导数2(c−3)−λ,候选 c=3+λ/2总为正,不符合该分支,因此负半轴没有内部最小点。
当λ>0时,零点不存在普通导数。当λ=0时,惩罚项消失,最优解为c=3。左导数−6−λ≤0;右导数−6+λ≥0恰好要求λ≥6。于是完整解 c*=max(3−λ/2,0)。λ=0,2,6,8分别给3,2,0,0;边界6属于零分支。凸性保证这些条件找到全局最小值。
同样以3为目标,ridge的(c−3)²+λc²给 c*=3/(1+λ),有限λ下不为零,而lasso在λ达到6后精确为零。不能把“ridge通常连续收缩”误说成任何数据中任何ridge系数永不等于零。
若损失改成(1/2)(c−3)²+λ|c|,正分支变成c=3−λ,归零阈值是3。两个目标只改变了平方项因子而没有同比例调整惩罚,因此解不同。一般非零列m、残差目标r的子问题 ‖r−mc‖²+λ|c|,令d=mᵀm>0,z=mᵀr,则解为S(z,λ/2)/d;S(z,t)=sign(z)max(|z|−t,0)。列不正交时,这是坐标子问题,不是对所有原始相关性独立阈值后就完成全局求解。
8. 敏感性:说明改变谁、固定谁
固定最终模型 ŷ=5/6+1.5x,只改变预测输入x,扰动Δx带来精确预测变化Δŷ=1.5Δx。例如x从3变为3.1,预测从16/3变为329/60,增加0.15。这是输入敏感性,不涉及重新拟合。
若改变训练响应并重新拟合,讨论的是参数敏感性。对本例固定设计矩阵,只把第三个训练响应4改为4+ε。因为x均值1,斜率分子增加ε、分母2,所以新斜率 b=3/2+ε/2;响应均值增加ε/3,新截距 a=5/6−ε/6。因此x=3的新预测为16/3+4ε/3。一个训练观测改变ε,新预测可能改变超过ε,尤其在外推位置;不能用原斜率1.5代替这一影响。
近共线的特征可能让系数对微小扰动非常敏感,即使训练预测相对稳定。Ridge常改善受罚方向的稳定性,但不保证测试误差一定下降。报告敏感性必须写明扰动对象、幅度、是否重训、观察的是系数还是预测。
9. 自检练习与完整答案
思考检查
用第5节的标准化模型及还原模型分别预测x=8。
解答 · 解答 1
练习:在第5节例中x=8时预测多少?答案:z=2,t̂=4,ŷ=30;原式−10+5×8=30。
思考检查
求(c−3)²+4|c|的最优解,并与零点目标值比较。
解答 · 解答 2
练习:lasso目标(c−3)²+4|c|的最优解及目标值?答案:阈值2,c=1;目标(1−3)²+4=8。零点目标9更大。
思考检查
第6节中λ=0时拟合如何变化?这能保证未来预测准确吗?
解答 · 解答 3
练习:第6节ridge若λ改为0,输出如何变化?答案:a=1,b=1,预测[0,1,2],RSS=0;这只说明该训练集拟合完全,不保证未知数据无误差。
思考检查
比较新输入由3降至2.8与第三条训练响应减少0.2后重新拟合。
解答 · 解答 4
练习:最终模型输入从3变为2.8,且不重训,预测变化多少?答案:Δx=−0.2,Δŷ=−0.3。若题目改为第三条训练响应减少0.2并重新拟合,在x=3的变化是(4/3)(−0.2)=−4/15,两问不能混用。
fx-50FH II:用普通运算核对,不跳过数学判断
本节仅用fx-50FH II的普通标量运算;先写完整算式,再执行。常数LOOCV输入(4+1/4+25/4)/3,应得3.5;直线LOOCV输入(1+1/4+1)/3,应得0.75。最终预测输入5/6+(3/2)*3,应得16/3(约5.333333333);训练R²输入1-(1/6)/(14/3),应得27/28(约0.9642857143)。其中*表示乘法,分母括号必须完整。
算出0.75并不能替你证明每折确实只用了两个训练点;计算器也不能判断是否泄漏。先在纸上求系数、写残差,再让机器做标量运算。不要把一般一元REG输出当作ridge、lasso或多元回归答案。这些核对不依赖CAS或完整矩阵功能。