
老實說,線性迴歸雖然是「幼兒園」等級的算法,但要把它「用好」,其實非常考驗一個資料科學家的基本功。
今天我不打算跟你講那些硬核的數學公式,我想以一個實作者的角度,跟你分享我是如何從數據處理、特徵工程到模型評估,一步步榨出線性迴歸的最大潛力。
如果你發現你的模型準確度卡住了,這篇文章應該能幫你找到出口。
第一階段:數據處理——別讓垃圾進,垃圾出
在工程師的世界裡有一句話叫 “Garbage In, Garbage Out”。如果你的原始數據是一團亂,換什麼高端模型都沒用。
1. 處理缺失值:別急著按 Delete
很多人看到 NaN 或 Null 的直覺就是「刪掉」。但如果你的數據量本來就不多,每刪掉一列都是在浪費資產。
我的做法:
我會先看缺失的比例。
如果少於 5%,直接刪除通常沒問題;但如果比例較高,我會優先考慮「中位數填補」(對抗離群值較穩健)或是用「隨機森林插補」(考慮到變量間的關係)。
核心邏輯:
填補的目的是為了維持數據的分布,而不是創造假數據。
2. 離群值(Outliers):它是驚喜還是雜訊?
離群值對線性迴歸的打擊是毀滅性的,因為它是基於「最小平方法」,會過度放大那些偏離太遠的誤差。
實戰經驗:
處理前我一定會先畫個散佈圖或箱形圖。
如果那個離群值是因為輸入錯誤(例如年齡寫 200 歲),就刪掉或修正;如果是極端的真實數據(例如雙 11 的銷量),我可能會考慮做 Log 轉換,把它的影響力「壓」下來。
3. 數據標準化:給不同單位一個公平競爭的機會
如果你的特徵一個是「身高(公分)」,另一個是「體重(公克)」,數值的差距會讓模型誤以為「體重」比較重要。
實務建議:
當你打算使用有「正則化」的模型(如 Ridge 或 LASSO)時,一定要做 Z-score 標準化。
這能讓所有特徵都在同一個起跑線上,模型收斂的速度也會快很多。
第二階段:特徵工程——這才是拉開差距的地方
我常說,模型決定了上限,而特徵工程決定了你離上限有多近。
線性迴歸最怕的就是「餵錯東西」。
1. 選擇相關特徵:Less is More
不要覺得特徵越多越好。
當你塞進一堆無關的變量(比如用「當天天氣」去預測「伺服器負載」),只會增加模型的噪音。
我的工具箱:
我常用相關性矩陣(Heatmap)來做初步篩選,或是直接上 LASSO 迴歸。
LASSO 有一個超能力,它會自動把沒用的特徵係數變成 0,直接幫你做特徵選擇。
這對懶人(像我)來說非常好用。
2. 創造新特徵:1 + 1 > 2
線性迴歸預設特徵之間是獨立的,但現實往往不是這樣。
舉個例子:
預測房價時,「房間數」和「衛浴數」分開看可能還好,但如果把它們相乘做成一個「空間密度」的交互項(Interaction Term),往往能捕捉到更深層的訊息。
多項式擴展(Polynomial Features)也是一個大招,能讓原本「直」的模型學會彎曲。
3. 降維處理(PCA):對付過度複雜的數據
如果你手上有幾百個特徵,模型很容易過擬合(Overfitting)。
這時候我會考慮用 PCA 把特徵壓縮成幾個「主成分」。
雖然這樣會讓模型變得難以解釋(你不知道主成分代表什麼),但在提升預測準確度上,這招通常很管用。
第三階段:模型選擇與訓練,別只會跑 .fit()
如果數據處理好了,特徵也選對了,接下來就是訓練的策略問題。
1. 別只盯著「普通線性迴歸」
當你的數據特徵很多,或者特徵之間有高度相關性(共線性)時,普通的 OLS(普通最小平方法)會變得很不穩定。
升級路徑:
- 怕過擬合?改用 Ridge Regression。
- 特徵太多想自動篩選?改用 LASSO Regression。
- 兩個都想要?那就用 ElasticNet。
2. 交叉驗證(K-fold Cross-Validation):拒絕自我感覺良好
我們最怕的就是模型在訓練集考 100 分,拿到實際環境只考 50 分。
我的習慣:
我一定會跑 5-fold 或 10-fold 的交叉驗證。
這就像是把考卷拆成五份,輪流當練習題和測驗題。
只有在五次測試中表現都穩定的模型,才是我敢上線的模型。
3. 自動化調參(Grid Search / Random Search)
模型裡面的那些 alpha(懲罰係數)要設多少?別用猜的。
實作建議:
我會丟給 GridSearchCV 讓它去跑。
雖然會花點時間,但找到最佳超參數組合的那一刻,準確度往往能再提升 2-5%。
第四階段:評估與診斷(高手看殘差)
很多人模型跑完看個 R2 = 0.8 就覺得自己已經很厲害了。
但我通常會先去看「殘差圖」(Residual Plot)。
1. 殘差分析:聽聽模型在說什麼
如果你的模型是完美的,那殘差應該是雜亂無章的隨機分佈。
- 如果殘差有規律(例如像一個漏斗): 說明你的數據存在「異方差性」,你可能需要對目標變量做 Log 轉換。
- 如果殘差像一條曲線: 說明你漏掉了非線性的特徵,該去加個平方項或交互項了。
2. 評估指標的取捨
- R2: 告訴你模型解釋了多少變異,但它會隨著特徵增加而虛高,所以我更看重「調整後 R2」。
- MAE vs RMSE: 我自己比較偏好 RMSE,因為它對巨大的誤差特別敏感。在某些場景下(如預測庫存),猜錯很大比猜錯很多次更危險,這時候 RMSE 的參考價值更高。
3. 終極殺招:集成方法(Ensemble Regression)
如果你已經把線性迴歸優化到極致了,準確度還是差強人意,那試著「組隊」吧。
把線性迴歸、隨機森林、XGBoost 的結果取權重平均。
雖然這讓模型變得沉重,但在競賽或高要求的預測場景中,這往往是通往頂尖表現的最後一哩路。
麥特的實戰小撇步:接下來你可以怎麼做?
看完這麼多,你可能覺得有點頭暈。
別擔心,我不建議你一次把所有招式都用上。
我建議你現在就可以做的三個小行動:
- 畫一張殘差圖: 去看看你目前模型的殘差有沒有規律,這會告訴你下一步該改數據還是改特徵。
- 試試 LASSO: 如果你的特徵超過 10 個,改用
Lasso跑跑看,觀察哪些特徵的係數變成了 0。 - 做一次 Log 轉換: 如果你的預測目標(y)分佈很不均勻(長尾),先對它取 Log 再跑模型,驚喜往往就在這裡。
線性迴歸不是過時的工具,它是一個結構清晰、可解釋性強的強大武器。只要你學會溫柔地對待數據,它能給你的回報絕對超出想像。
電子報
Subject: 為什麼你的線性迴歸總是不準?(附上我的私藏優化清單)
嘿,我是麥特。
你剛開始學機器學習時,第一個接觸的是不是也是「線性迴歸」(Linear Regression)?
老實說,我以前覺得這東西超無聊。不就是畫一條線穿過一堆點嗎?在 Scikit-learn 裡 model.fit(X, y) 一行程式碼就收工了,簡直是幼兒園等級。
但等到我真的把它拿到實戰場景——不管是預測公司的電商銷量,還是分析產品的轉化率——我才發現,現實世界的數據根本不聽話。你的 $R^2$ 可能慘不忍睹,或者在訓練集表現很好,一拿到新數據就翻車。
我後來才意識到:線性迴歸雖然簡單,但它其實是資料科學家的「基本功」測試儀。
如果你的模型跑不準,通常不是算法太弱,而是你對數據的理解還不夠深。今天我不談硬核公式,想跟你分享我現在做模型時的三個「實戰體悟」:
1. 別讓垃圾進,垃圾出
工程師常說 “Garbage In, Garbage Out”。
如果你的數據裡有 200 歲的人,或是把「身高(公分)」跟「體重(公克)」放在一起跑,模型會直接崩潰。我現在的做法是,不管多趕,一定會先做 Z-score 標準化。這不是為了美觀,而是為了給不同單位的特徵一個公平競爭的起跑線,尤其是當你要用 Ridge 或 LASSO 的時候。
2. 特徵工程才是拉開差距的地方
模型決定了上限,而特徵工程決定了你離上限有多近。
我以前總覺得特徵越多越好,後來發現這只會增加噪音。現在我更喜歡用 LASSO 迴歸,它有一種「自動斷捨離」的超能力,會直接把沒用的特徵係數變成 0。這對我們這種不想手動篩選特徵的懶人(笑)來說,非常有感。
3. 聽聽模型在說什麼:看殘差,別只看 R²
很多人模型跑完看到 $R^2 = 0.8$ 就覺得自己是神了。但我現在一定會先去看「殘差圖」。
如果殘差圖看起來像亂掉的雜訊,那很好;但如果它呈現一種「規律的曲線」,那就是模型在對你求救,告訴你:「嘿,你漏掉了一些重要的非線性關係(比如平方項)!」
【你可以立刻做的行動】
線性迴歸不是過時的工具,它是一個結構清晰、可解釋性極強的武器。
如果你手邊剛好有個模型準確度卡住了,我建議你現在就做一件事:花一分鐘畫一張「殘差圖(Residual Plot)」。它會告訴你下一步該改數據,還是該加新特徵。
我把這篇文章提到的優化步驟,整理成了一份「模型進化實戰 Checklist」,裡面包含了我常用的數據處理邏輯跟程式碼片段。
如果你最近也在煩惱模型準不準的問題,直接回覆這封信:「我要清單」,我會把這份 PDF 私訊寄給你!
一起在資料的海洋裡探險吧。
麥特
