Learning Objectives
- 用 PolynomialFeatures 把線性模型變成曲線,說明它為什麼仍然是線性迴歸
- 從訓練與測試誤差的變化,判斷欠擬合與過擬合
- 說明 Ridge 與 Lasso 怎麼限制係數,以及 alpha 太小與太大各會怎樣
- 說明正則化前為什麼要標準化,以及 alpha 不能用測試資料挑
模型越有彈性,不一定越好
直線畫不出彎的關係。最直接的辦法是讓模型更有彈性:除了 x,也放進 x²、x³……。次數越高,曲線越能彎,訓練誤差一定只降不升。
那是不是越高越好?不是。訓練資料裡除了規律,還有雜訊。模型太有彈性時,會連雜訊也一起記住,碰到新資料就猜不準。這就是第 2 課看過的過擬合(overfitting);反過來,模型太簡單、連規律都學不到,是欠擬合(underfitting)。
這一課做兩件事:
- 用多項式特徵親眼看過擬合怎麼發生;
- 學一種不必降低次數也能控制模型的方法:正則化(regularization)。
逐步看:多項式特徵
這六個點中間高、兩邊低,直線畫不好。看 x2 多了一欄之後發生什麼事。
逐步看:次數越高,測試誤差先降後升
資料是程式產生的模擬資料:真正的規律是正弦曲線,加上一點雜訊。只有 16 筆訓練資料,其餘 44 筆當測試資料。看輸出的三欄:次數、訓練 MSE、測試 MSE,以及最後的圖。
正則化:把係數的大小也算進損失
過擬合的曲線要劇烈擺動,靠的是非常大的係數(下面的範例會印出來)。所以可以這樣想:除了要預測得準,也不准係數太大。把這個要求加進損失函數,就是正則化:
Ridge 的損失 = 預測誤差的平方和 + alpha × (w1² + w2² + …)
Lasso 的損失 = 預測誤差的平方和 ÷ (2 × 筆數) + alpha × (|w1| + |w2| + …)
- alpha 決定懲罰的強度:0 就是沒有正則化,越大係數被壓得越小。alpha 是超參數(hyperparameter):不是從資料學來的,要由你決定。
- 截距 b 不算在懲罰裡,否則預測值的平均會被拉往 0。
- 一定要先標準化。 懲罰看的是係數的大小,而係數大小和單位有關。同一個特徵用秒記、係數就小,用小時記、係數就大,懲罰的輕重不該取決於你選了哪個單位。
scikit-learn 的 Ridge 與 Lasso 用法和 LinearRegression 相同,預設都是 alpha=1.0。這兩個式子的誤差項寫法不同(Lasso 多除了 2 × 筆數),所以同樣的 alpha 在兩個模型裡強度不同,不能直接比。
逐步看:Ridge 的 alpha
同一份資料、固定 12 次多項式,只換 alpha。看輸出的四欄:alpha、訓練 MSE、測試 MSE、最大的係數。
逐步看:Lasso 會把係數變成 0
回到 students.csv 預測期末成績,這次放八個特徵,其中有些幾乎沒有關聯。看表格裡的係數隨 alpha 變大怎麼變,特別是哪些變成剛好 0。
Ridge 與 Lasso 怎麼選
| Ridge(L2) | Lasso(L1) | |
|---|---|---|
| 懲罰 | 係數的平方和 | 係數的絕對值和 |
| 係數會怎樣 | 全部變小,但通常不會剛好是 0 | 一部分變成剛好 0 |
| 適合 | 特徵都多少有點用、彼此相關 | 想知道哪些特徵可以不要 |
Lasso 把係數變成 0,等於自動挑選特徵,模型比較好解釋。但要注意:兩個特徵高度相關時,Lasso 常常只留其中一個,留下誰不代表另一個不重要;這和第 5 課「係數會隨放進去的特徵改變」是同一件事。
alpha 要怎麼選? 上面的範例為了示範,直接看了測試 MSE。實際做的時候不可以用測試資料挑 alpha:挑過之後,測試資料就不再是「沒看過的資料」,數字會偏樂觀。正確的做法是交叉驗證,第 14 課會教。
實作:用 numpy 解 Ridge
特徵與 y 都已經減掉平均,所以不需要截距。Ridge 有公式解,只比最小平方法多了 alpha 乘上單位矩陣:
w = (XᵀX + alpha × I)⁻¹ Xᵀy
完成 ridge_fit(X, y, alpha),回傳係數 w。看 alpha 變大時,係數怎麼變。
小測驗:過擬合
下面程式會印出什麼?
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=3, include_bias=False)
print(poly.fit_transform(np.array([[2.0]])))
次數從 5 調到 12,訓練 MSE 從 0.06 降到 0.004,測試 MSE 從 0.099 升到 0.603。這是?
用 x、x²、x³ 當特徵的模型,為什麼還可以用 LinearRegression 訓練?
小測驗:正則化
Ridge 的 alpha 從很小調到非常大,通常會發生什麼事?
想讓模型自動去掉不需要的特徵,比較適合用哪一個?
用 Ridge 前為什麼要先標準化?
試了好幾個 alpha,選測試 MSE 最低的那一個,然後回報這個數字。問題在哪裡?
重點整理
- 多項式特徵把 x 擴充成 x、x²、x³…,模型變成曲線,但對係數仍然是線性的,解法不變。
- 次數越高,訓練誤差只降不升,測試誤差先降後升。兩者都高是欠擬合,訓練低、測試高是過擬合。
- 正則化把係數大小加進損失。Ridge(平方)把係數全部變小;Lasso(絕對值)把一部分係數變成 0。
- alpha 太小等於沒有限制,太大變成欠擬合。
Ridge、Lasso預設alpha=1.0,用之前要先標準化。 - 不要用測試資料挑 alpha,第 14 課用交叉驗證解決。
- 下一課要預測的不再是分數,而是「及格或不及格」,把線性模型的輸出轉成機率:羅吉斯迴歸。