National Central University
Uedu Main Site
Explore Uedu
Student Console
Register as Member/Login
Research Informed Consent Center
Survey Center
Educational Big Data Challenge
Claim or create a course
Try an AI Scenario Task
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

3

Local AI

--

Uedu Code

--

中央大學 AQI 78 24°C PM2.5 18
AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

Unit 06

過擬合與正則化

多項式特徵、Ridge 與 Lasso
Interaction實作 30 minute(s)

Learning Objectives

  • 用 PolynomialFeatures 把線性模型變成曲線,說明它為什麼仍然是線性迴歸
  • 從訓練與測試誤差的變化,判斷欠擬合與過擬合
  • 說明 Ridge 與 Lasso 怎麼限制係數,以及 alpha 太小與太大各會怎樣
  • 說明正則化前為什麼要標準化,以及 alpha 不能用測試資料挑

模型越有彈性,不一定越好

直線畫不出彎的關係。最直接的辦法是讓模型更有彈性:除了 x,也放進 x²、x³……。次數越高,曲線越能彎,訓練誤差一定只降不升。

那是不是越高越好?不是。訓練資料裡除了規律,還有雜訊。模型太有彈性時,會連雜訊也一起記住,碰到新資料就猜不準。這就是第 2 課看過的過擬合(overfitting);反過來,模型太簡單、連規律都學不到,是欠擬合(underfitting)。

這一課做兩件事:

  1. 用多項式特徵親眼看過擬合怎麼發生;
  2. 學一種不必降低次數也能控制模型的方法:正則化(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、最大的係數。

互動練習:拖次數與 alpha

同樣是正弦曲線加雜訊的模擬資料(這裡在瀏覽器裡產生,數字和上面的範例不同)。藍點是訓練資料,模型只看得到它們;橘色空心點是測試資料。前四個任務先把 alpha 留在 0,看過擬合;後面才用 alpha 把它拉回來。

逐步看: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 變大時,係數怎麼變。

你的輸出
預期輸出

小測驗:過擬合

1.

下面程式會印出什麼?

import numpy as np
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=3, include_bias=False)
print(poly.fit_transform(np.array([[2.0]])))
2.

次數從 5 調到 12,訓練 MSE 從 0.06 降到 0.004,測試 MSE 從 0.099 升到 0.603。這是?

3.

用 x、x²、x³ 當特徵的模型,為什麼還可以用 LinearRegression 訓練?

第 1 次作答

小測驗:正則化

1.

Ridge 的 alpha 從很小調到非常大,通常會發生什麼事?

2.

想讓模型自動去掉不需要的特徵,比較適合用哪一個?

3.

用 Ridge 前為什麼要先標準化?

4.

試了好幾個 alpha,選測試 MSE 最低的那一個,然後回報這個數字。問題在哪裡?

第 1 次作答

重點整理

  • 多項式特徵把 x 擴充成 x、x²、x³…,模型變成曲線,但對係數仍然是線性的,解法不變。
  • 次數越高,訓練誤差只降不升,測試誤差先降後升。兩者都高是欠擬合,訓練低、測試高是過擬合。
  • 正則化把係數大小加進損失。Ridge(平方)把係數全部變小;Lasso(絕對值)把一部分係數變成 0。
  • alpha 太小等於沒有限制,太大變成欠擬合。Ridge、Lasso 預設 alpha=1.0,用之前要先標準化。
  • 不要用測試資料挑 alpha,第 14 課用交叉驗證解決。
  • 下一課要預測的不再是分數,而是「及格或不及格」,把線性模型的輸出轉成機率:羅吉斯迴歸。
這一課完成了!
Next lesson:羅吉斯迴歸
你目前沒有登入,學習進度只存在這個瀏覽器。 Login 後,進度會跟著帳號,換電腦也看得到。