多重共線性怎麼解?選哪個模型?
在房價預測任務中,若發現特徵如「房間數」與「坪數」存在高度多重共線性(Multicollinearity),為降低共線性對模型參數估計的負面影響,應優先選擇下列哪種模型?
你在預測房價,用了兩個特徵:「房間數」和「坪數」。但這兩個特徵高度相關,房間越多坪數通常也越大,這叫「多重共線性」(Multicollinearity)。
多重共線性會讓模型的「參數估計」出問題:不知道該把房價的貢獻歸給「房間數」還是「坪數」,導致係數不穩定、可解釋性差。
問你:哪個模型最能降低多重共線性對參數估計的負面影響?
一句話總結
面對多重共線性,應該選含 L1 正則化的 LASSO 迴歸:LASSO 的 L1 懲罰會強制把高度相關特徵中「貢獻較小」的那個係數壓到零,自動做特徵選擇,解決係數不穩定的問題。
先感受問題:兩個特徵說的是同一件事
假設你在「好房網」建立房價預測模型,訓練資料有 10,000 筆,特徵包括:房間數、坪數、樓層、屋齡、地段。
你做了個相關係數分析,發現問題:
1 房通常 20~30 坪,3 房通常 50~70 坪,5 房通常 80~120 坪
→ 這兩個特徵幾乎在說同一件事
你用普通線性迴歸來訓練,結果係數跑出來:
坪數的係數:−3 萬(負的?越大越便宜?)
這不合常識。問題出在:兩個特徵高度相關時,模型不知道該怎麼「分配功勞」,結果係數互相抵消,甚至出現方向錯誤(負號)。
這就是多重共線性造成的「參數估計不穩定」問題。
普通線性迴歸遇到共線性,為什麼會崩潰
普通線性迴歸(OLS,最小平方法)的目標是找到一組係數,讓預測誤差最小。遇到共線性時的五個問題:
- 係數方差爆炸:當兩個特徵高度相關,OLS 的解析解涉及矩陣求逆,但相關係數接近 1 時矩陣接近奇異(不可逆),數值不穩定,係數方差可以飆到幾百倍。
- 係數符號錯誤:如上面例子,坪數的係數出現負號。這讓模型完全不可解釋。
- 係數隨樣本大幅波動:換一批訓練資料,係數可能從 +150 萬變成 −30 萬,模型極度不穩定。
- 無法做特徵重要性分析:係數不穩定,你不能靠係數大小判斷「房間數重要還是坪數重要」。
- 預測能力反而還好(但不能信任係數):奇怪的是,OLS 在共線性情況下,預測的 RMSE 不一定很差(因為兩個特徵合起來還是包含了資訊),但係數完全不可信。這讓問題更難被察覺。
LASSO 的 L1 正則化:強制選一個,丟掉另一個
LASSO(Least Absolute Shrinkage and Selection Operator)的核心機制:在損失函數裡加入一個懲罰項,讓模型不能隨意把係數設很大。
回到好房網的例子。LASSO 訓練後的係數:
坪數的係數:+6.8 萬(每增加 1 坪,房價增加 6.8 萬)
樓層、屋齡、地段:正常的係數
LASSO 做了一個決定:在「房間數」和「坪數」這兩個高度相關的特徵中,它自動選了「坪數」(解釋力更連續、更精確),把「房間數」的係數壓成了零,等同於丟掉了這個特徵。
這就是 L1 正則化的「稀疏特性(sparsity)」:會讓部分係數精確等於零,自動做特徵選擇(Feature Selection)。普通的 L2 正則化(Ridge 迴歸)只會把係數壓小,不會壓成零。
這就是選項 D 講的:含 L1 正則化的 LASSO 迴歸模型。
技術版:LASSO 的公式與 L1 vs L2 的幾何直覺
中級考試大概率會考程式碼跟公式,所以這部分你還是要學。但如果現在學起來很痛苦,可以先跳過,等讀完其他題目回頭再來。
LASSO 的目標函數:
# OLS(普通線性迴歸)
minimize: Σ (y_i - ŷ_i)²
# LASSO(L1 正則化)
minimize: Σ (y_i - ŷ_i)² + λ × Σ |β_j|
# λ(lambda):正則化強度,越大代表懲罰越重,係數越小(越多零)
- OLS 說:「只要預測誤差最小就好,係數要多大給多大」
- LASSO 說:「預測誤差要小,但係數的絕對值加起來不能太大(L1 懲罰)」
- 面對兩個高度相關的特徵,LASSO 發現「只留一個也能預測得一樣準」,就把另一個係數壓成零
- 結果:特徵自動選擇,多重共線性問題被解決
| 故事 | 程式碼 |
|---|---|
| 建立 LASSO 模型 | from sklearn.linear_model import Lasso |
| 設定正則化強度 | model = Lasso(alpha=0.1) |
| 訓練 | model.fit(X_train, y_train) |
| 查看係數(有些會是 0) | print(model.coef_) |
| 比較:Ridge(L2 正則化) | from sklearn.linear_model import Ridge |
- β_j(beta j)
- 第 j 個特徵的係數。LASSO 的目標是讓一些 β_j 精確等於 0。
- λ(lambda)
- 正則化強度超參數。λ 越大,懲罰越重,更多係數被壓成 0,特徵選擇越激進;λ 太大會讓模型欠擬合。
- L1 懲罰:Σ |β_j|
- 所有係數絕對值的總和。L1 的「絕對值」幾何形狀是菱形,最佳解容易落在菱形的「角」上,即某個係數恰好等於 0。這就是為什麼 L1 會產生稀疏解(有零)。
- L2 懲罰:Σ β_j²(Ridge 用這個)
- 所有係數平方的總和。L2 的幾何形狀是圓形,最佳解不容易落在坐標軸上,係數只會趨近於零但不等於零。Ridge 不做特徵選擇。
L1 和 L2 的直覺比較:
# 有兩個相關特徵 x1(房間數)和 x2(坪數)
# OLS:可能給出 β1 = 150, β2 = -3(不穩定)
# Ridge(L2):可能給出 β1 = 45, β2 = 40(兩個都縮小,但都不為零)
# LASSO(L1):可能給出 β1 = 0, β2 = 68(直接丟掉房間數)
# 什麼時候用哪個?
# LASSO:有很多特徵,想自動選特徵,要稀疏解
# Ridge:相信每個特徵都有貢獻,只是想穩定係數,不要稀疏
# Elastic Net:兩個都要(α × L1 + (1-α) × L2)
蓋住公式,說出 LASSO 解決多重共線性的機制:
- 多重共線性讓 OLS 的係數不穩定、可能出錯方向
- LASSO 在損失函數加 L1 懲罰(係數絕對值總和)
- L1 懲罰的幾何特性讓最佳解容易出現在「某係數 = 0」的位置
- 相關特徵中,LASSO 自動選一個留下,把其他壓成零
- 結果:稀疏係數、特徵選擇、係數穩定
為什麼其他選項不是最佳答案
A不受多重共線性影響的決策樹模型
決策樹在分裂時每次只選一個特徵,不同時使用多個特徵,所以不存在「參數估計因為共線性而不穩定」的問題。
決策樹確實對多重共線性不敏感,但題目問的是「降低共線性對參數估計的負面影響」。決策樹的「分裂規則」不是「參數估計」,而是選擇最佳分裂特徵和閾值。如果你需要一個線性可解釋的係數(「每增加 1 坪,房價增加多少元」),決策樹根本沒有這種輸出。題目的背景是「參數估計」問題,決策樹迴避了問題而不是解決了問題。
知道「決策樹不怕共線性」但沒注意題目問的是「參數估計」的考生。注意:題目的核心是線性模型的參數估計問題,決策樹換了問題框架,不在討論範疇內。
B傳統線性迴歸模型,不含正則化項
直接用普通最小平方法(OLS)做線性迴歸,不加任何正則化。
這是多重共線性問題最糟糕的選擇。普通線性迴歸在遇到高度共線的特徵時,係數方差爆炸、係數可能出現錯誤方向、不同訓練集給出截然不同的係數。OLS 沒有任何機制來處理共線性,它會如實「承受」所有數值不穩定的後果。題目說「降低共線性對參數估計的負面影響」,OLS 完全反其道而行。
只知道「線性迴歸可以估計參數」但不清楚「共線性對 OLS 的破壞」的考生。這是最應該被排除的選項。
C支持向量機搭配線性核函數
用 SVM(Support Vector Machine)的線性版本來做迴歸,尋找最大間隔的超平面。
線性 SVM 確實有正則化機制(C 參數控制間隔大小),能一定程度穩定係數。但線性 SVM 使用的是 L2 類型的懲罰,不會把係數壓成零,不做特徵選擇。面對「房間數」和「坪數」高度相關時,SVM 可能給兩個特徵都分配一些係數(類似 Ridge),不會解決「哪個特徵是真正主力」的問題。此外 SVM 迴歸(SVR)的係數可解釋性比 LASSO 差,不適合需要解釋「每坪增加多少元」的商業場景。
知道 SVM 有正則化、比 OLS 穩定,就選它的考生。記住:處理多重共線性「最有效」的線性模型是 LASSO,因為它的 L1 特性直接解決共線特徵的分配問題(壓成零),SVM 的穩定性不如 LASSO 針對這個問題有效。
同個考點下次怎麼變形
LASSO 把「房間數」係數壓成零,是不是代表房間數完全不重要?
係數為零就代表這個特徵沒用?
不一定。當兩個特徵高度相關時,LASSO 選擇其中一個的邏輯是:在相同解釋力下,只保留一個特徵就夠了。被壓成零的特徵(房間數)不是「沒有資訊」,而是「它的資訊已經被另一個特徵(坪數)涵蓋了」。如果你移除坪數只保留房間數,房間數的係數就會是非零的。這是「多重共線性」的本質:兩個特徵互相代理,選任一個都能解釋大部分變異。
如果不想丟掉任何特徵,但又想穩定係數,應該選哪個模型?
LASSO 太激進了,我想保留所有特徵但讓係數穩定一點,怎麼辦?
用 Ridge 迴歸(L2 正則化)。Ridge 的懲罰項是係數的平方和(不是絕對值),幾何上是圓形約束,最佳解不在坐標軸上,所以所有係數都會縮小但不為零。Ridge 能穩定 OLS 的數值問題(降低係數方差),但不做特徵選擇,兩個相關特徵都保留(係數各自縮小)。如果你想兩個都保留(例如商業上需要解釋「每增加一個房間」的貢獻),Ridge 比 LASSO 適合。
Elastic Net 是什麼?什麼時候用它而不是 LASSO?
L1 和 L2 有各自的優缺點,有沒有兩個都要的?
Elastic Net = α × L1 + (1-α) × L2,用一個 α 參數控制兩者比例。適合用在:(1) 特徵數量遠多於樣本數(p >> n)的高維問題;(2) 有很多特徵組成「群組」,群組內高度相關(LASSO 只選一個,但你可能想每個群組各選幾個);(3) LASSO 選出的特徵太少或太不穩定(LASSO 在高度相關特徵間的選擇可能不穩定,Elastic Net 更穩定)。房價預測這種特徵數量適中的場景,LASSO 已經夠用。
多重共線性在醫療預測模型中有什麼特別的問題?
醫療特徵也會高度相關?例如血壓和心跳?
是的,而且影響更嚴重。醫療模型的係數常被用來做「臨床解釋」(「血壓每高 10 mmHg,風險增加多少倍」)。如果共線性讓係數不穩定甚至符號錯誤,醫生可能做出錯誤的臨床解讀。醫療場景特別常見的共線性來源:BMI 和體重、年齡和各種慢性病標誌物、不同但相關的血液指標(如不同形式的膽固醇)。LASSO 在醫療基因組學(genomics)非常常見,因為基因數量遠多於樣本數,且基因之間高度相關。
怎麼偵測資料集裡是否存在多重共線性?
感覺「房間數和坪數很相關」不夠,要怎麼量化?
最常用的指標是 VIF(Variance Inflation Factor,方差膨脹因子):對每個特徵 x_j,用其他所有特徵迴歸預測它,計算 R²,VIF = 1 / (1 - R²)。VIF > 5 就要注意,VIF > 10 是嚴重共線性。房間數的 VIF 如果是 25,代表係數的方差因為共線性膨脹了 25 倍。其他方法:(1) 相關係數矩陣熱圖(看哪些特徵對的顏色深);(2) 條件數(Condition Number):矩陣最大最小特徵值的比,> 30 代表有共線性問題。
想再往下看,這 5 個
- L1 正則化(L1 Regularization (Lasso))LASSO 的懲罰項,幾何特性使係數自動歸零,同時做特徵選擇並緩解多重共線性,是本題正解的核心機制。
- L2 正則化(L2 Regularization (Ridge))Ridge 迴歸的懲罰項,讓係數縮小但不為零,同樣能穩定共線性特徵的係數,但無法做特徵選擇,常與 L1 混淆。
- 線性迴歸法(Linear Regression)不含正則化的傳統線性模型,遇到多重共線性時係數方差爆炸,是本題選項 B 的陷阱。
- 特徵選擇法(Feature Selection)LASSO 是嵌入式特徵選擇的代表,在訓練時自動將共線性特徵之一的係數歸零,無需額外選擇步驟。
- 主成分分析(Principal Component Analysis)透過降維消除多重共線性的另一種方法,把高度相關的特徵轉換成正交主成分,但會喪失原始特徵的可解釋性。