本章是原創自學擴寫,不是官方試題、評分標準或考試權重預測。先在紙上理解每一步,再用程式核對。
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。
不同大小的折若要令每個驗證樣本等權,應匯總平方誤差再除以總樣本數。第一折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̂。
代入後得ŷ=μᵧ+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:先寫完整目標,再求導
明確規定J(c)=‖y−Mc‖²+λcᵀDc,λ≥0,D是對角懲罰矩陣。全部係數都罰時D=I;第一個係數是未受懲罰的截距時D=diag(0,1,…,1)。λ不是預設1;缺少原矩陣也不能猜數值答案。
梯度為2Mᵀ(Mc−y)+2λDc,令其為零得到(MᵀM+λD)c=Mᵀy。左邊矩陣可逆才能寫逆式。當λ>0、D半正定,二次型為‖Mv‖²+λvᵀDv。唯一性條件是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歸入零分支。目標凸,因此這些條件足以找到全局最小值。
相較之下,ridge目標(c−3)²+λc²的解為3/(1+λ),本例任何有限λ都不為零,而lasso在λ達到6後精確歸零。這不代表所有數據的每個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,精確預測變化為Δŷ=1.5Δx。例如x由3變3.1,預測由16/3變329/60,增加0.15,沒有重新擬合。
若改變訓練反應再重訓,則是另一實驗。固定設計矩陣,只把第三個反應4改為4+ε。輸入均值仍為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
目標(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,Δŷ=1.5(−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或完整矩陣功能。