(Day 2) 線性迴歸 (Linear Regression)
線性迴歸 (Linear Regression) 是統計學中的一種預測方法,主要分為簡單線性迴歸 (Simple Linear Regression) 與多元線性迴歸 (Multiple Linear Regression),又稱複迴歸,以及其他變形的迴歸等,但在線性迴歸中,通常會有 1~N 個自變數 (Independent Variable) X,也可以稱作特徵 (Feature);和 1 個因變數 (Dependent Variable) Y,也可以稱作目標 (Target)。而最終目的就是找出一條最佳迴歸線,來擬合這些數據點,便可以用來預測未來的數據點。
模型介紹
模型邏輯與核心概念
線性迴歸假設
統計學線性迴歸的經典的五大假設:
- 線性關係: 自變數與因變數之間存在線性關係
- 誤差項獨立 (Independence): 誤差項之間沒有相互關係
- 同標準差性 (Homoscedasticity): 對於所有的自變數,誤差項具有相同的標準差
- 誤差項常態性 (Normality of Errors): 誤差項應該成常態分佈
- 高度共線性 (Multicollinearity): 自變數間高度線性相關
看到這邊會想說,為什麼要特別註明統計學? 跟機器學習無關? 先記住一句話「統計學重推論,機器學習重預測」,很多假設跟機器學習中的線性迴歸模型還真的沒有太大的關係,但是也不代表,機器學習模型完全沒有假設,但是相對比較不重要,這也是為什麼很多仿間的機器學習教材都會忽略假設這塊。
總而言之,機器學習模型不像統計學模型需要那麼嚴謹的假設,但是若違反某些假設,也是會影響機器學習模型的表現,也會使得模型只能用於預測,無法用於推論,以下簡單整理假設對統計模型與機器學習模型的影響:
假設 | 對傳統統計模型影響 | 對機器學習影響 | 建議處理方式 |
---|---|---|---|
線性關係 | ✅ 極高 (核心假設) | ❌ 可忽略 (可透過特徵轉換處理) | 用非線性模型 / 特徵轉換 |
誤差獨立性 | ✅ 高 (推論與解釋需此條件支持) | ✅ 高 (對 generalization 有直接影響) | 使用適當資料分割策略 |
同變異性 | ✅ 中高 (影響參數估計的信度) | ❌ 可忽略 (模型的估計值仍然準,但 p-value、CI 失真) | 變數轉換、加權最小平方法 |
誤差常態性 | ✅ 中高 (特定推論工具須常態性支持) | ❌ 可忽略 | 若僅做預測可忽略 |
共線性 | ✅ 高 (嚴重影響模型可解釋性與推論) | ❌ 可忽略 (但建議修正以利解釋) | VIF、降維、正則化 |
運作原理
我們先回到線性迴歸的用途與目的,簡單來說就是「找出一條最佳直線,來擬合這些數據點,便可以用來預測未來的數據點」,如何找出最佳直線? 本文會簡單的介紹一下,詳細過程與原理,再請讀者自行尋找其他資源暸解。
- 假設方程式: $\hat{y} = \beta_0 + \mathbf{x}^\top \boldsymbol{\beta}$。
- 統計學模型
- 假設誤差項 $\varepsilon_i$ 滿足期望值為 0、常態分布、同變異等條件。
- 根據 Gauss-Markov 定理,最小化殘差平方和 (RSS) 可得到 BLUE (最佳線性無偏估計量),這就是 Ordinary Least Squares (OLS) 方法,使用最小二乘法的封閉解來最小化損失函數,該方法找到使誤差平方和最小的係數。
- 機器學習模型
- 假設損失函數 (Cost Function): $MSE = \frac{1}{2n} \sum\limits_{i=1}^{n} (y_{i} - \hat{y}_{i})^{2}$。
- 使用梯度下降 (Batch Gradient Descent) 來最小化損失函數,最符合機器學習的原理,但是通常只用於大數據 (而 sklearn 仍然是透過 OLS 來實現)。
所以不論是統計學還是機器學習的線性迴歸模型,就是要找出最佳的迴歸線,只是方式不同而已。
模型評估指標
- R-squared ($R^2$): 衡量解釋能力 (總體績效)
- Adjusted R-squared
- Mean Squared Error (MSE)
- Root Mean Squared Error (RMSE)
- Mean Absolute Error (MAE)
- Residual Analysis: 檢查模型假設、異常、偏誤
適用情境
線性迴歸的適用場景通常滿足以下條件:
- 特徵與標籤之間關係接近線性 (可透過散佈圖觀察)。
- 預測任務對解釋能力有高度需求 (例如需要明確了解每個變數如何影響結果)。
- 需求偏向建構基準線 (baseline) 或快速估算。
限制條件
線性迴歸雖然簡潔,但在多數真實場景下可能面臨以下困境:
- 資料非線性: 大多數實務資料都包含非線性結構,線性模型難以捕捉 (可以搭配 Polynomial Features 處理)。
- 高維資料與多重共線性: 特徵太多或高度相關,可能導致不穩定或過擬合。
- 不具備交互作用建模能力: 無法處理變數之間的聯合影響 (除非顯式創造交互項)。
- 差異質性與異常值敏感: 若誤差分布異常或出現極端值,模型容易偏誤。
與其他模型的比較
與其他模型相比,線性迴歸具備明確的比較基準:
模型 | 解釋性 | 應變能力 | 計算成本 | 擬合彈性 |
---|---|---|---|---|
線性迴歸 | ✅ 高 | ❌ 低 | ✅ 低 | ❌ 低 |
決策樹 / 隨機森林 | ❌ 低 | ✅ 高 | ❌ 中 | ✅ 中 |
支持向量機 | ❌ 中 | ✅ 高 | ❌ 高 | ✅ 中 |
神經網路 | ❌ 極低 | ✅ 極高 | ❌ 極高 | ✅ 高 |
(其他模型後續會慢慢介紹 … )
線性迴歸的最大價值在於它是所有模型的基線模型 (baseline)。若一個任務連線性迴歸都無法擊敗,則其他模型的表現很可能也是不穩定或過擬合的。
模型實作
資料集介紹
將使用經典的 Boston Housing Dataset 為例。由於 scikit-learn 已移除該資料集,我們改採自 Carnegie Mellon University 所提供的公開版本。樣本內容如下:
欄位說明:
- CRIM: 每人平均犯罪率
- ZN: 區域住宅用地比例
- INDUS: 區域非零售商業用地比例
- CHAS: 查爾斯河虛擬變數 (1 = 河流旁, 0 = 其他)
- NOX: 一氧化氮濃度 (parts per 10 million)
- RM: 每個住宅的平均房間數
- AGE: 1940 年之前建造的自用住宅比例
- DIS: 到波士頓五個中心區域的加權距離
- RAD: 公路接近指數 (1 = 最接近, 24 = 最遠)
- TAX: 每 $10,000 的財產稅率
- PTRATIO: 學生與教師比例
- B: 1000(Bk - 0.63)^2, Bk = 區域黑人比例
- LSTAT: 區域人口中低收入者的比例
- MEDV: 自用住宅的中位數價格 (單位: $1000s)
程式實例
import requests
import pandas as pd
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
def get_boston_housing_data() -> pd.DataFrame:
url = "http://lib.stat.cmu.edu/datasets/boston" # Boston Housing Dataset from Carnegie Mellon University
raw_data = requests.get(url).text.splitlines()[22:] # 從第 23 行開始
# 每筆資料分為 2 行 → 共 506 筆 → 總共 1012 行
data = []
for i in range(0, len(raw_data), 2):
line_1 = list(map(float, raw_data[i].strip().split()))
line_2 = list(map(float, raw_data[i + 1].strip().split()))
data.append(line_1 + line_2)
column_names = [
"CRIM", # 每人平均犯罪率
"ZN", # 區域住宅用地比例
"INDUS", # 區域非零售商業用地比例
"CHAS", # 查爾斯河虛擬變數 (1 = 河流旁, 0 = 其他)
"NOX", # 一氧化氮濃度 (parts per 10 million)
"RM", # 每個住宅的平均房間數
"AGE", # 1940 年之前建造的自用住宅比例
"DIS", # 到波士頓五個中心區域的加權距離
"RAD", # 公路接近指數 (1 = 最接近, 24 = 最遠)
"TAX", # 每 $10,000 的財產稅率
"PTRATIO", # 學生與教師比例
"B", # 1000(Bk - 0.63)^2, Bk = 區域黑人比例
"LSTAT", # 區域人口中低收入者的比例
"MEDV", # 自用住宅的中位數價格 (單位: $1000s)
]
df = pd.DataFrame(data, columns=column_names)
return df
def main():
# ----- 讀取資料 -----
original_data = get_boston_housing_data() # 讀取資料
# ----- 資料前處理 -----
cleaned_data = original_data.copy()
## 因透過 print(cleaned_data.isnull().sum()) 檢查缺失值 (0 筆)
## 且 Pearson 相關係數檢查,相關係數 >= 0.8 (0 筆)
### correlation_matrix = cleaned_data.corr()
### target_corr = correlation_matrix['MEDV']
### high_corr_features = target_corr[target_corr > 0.8].drop('MEDV')
### print(f"與 target 高度正相關的欄位:", high_corr_features)
## 故不做資料前處理
# ----- 模型訓練 -----
## 資料分割
X = cleaned_data.drop(columns=["MEDV"])
y = cleaned_data["MEDV"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
## 建立模型
model = Pipeline([
("lr", LinearRegression())
])
model.fit(X_train, y_train)
## 預測
y_train_pred = model.predict(X_train)
y_test_pred = model.predict(X_test)
## 評估
train_mse = mean_squared_error(y_train, y_train_pred)
train_r2 = r2_score(y_train, y_train_pred)
print(f"train data 均方誤差 (MSE): {train_mse:.4f}")
print(f"train data 決定係數 R²: {train_r2:.4f}")
test_mse = mean_squared_error(y_test, y_test_pred)
test_r2 = r2_score(y_test, y_test_pred)
print(f"test data 均方誤差 (MSE): {test_mse:.4f}")
print(f"test data 決定係數 R²: {test_r2:.4f}")
if __name__ == '__main__':
main()
執行結果
- train data 均方誤差 (MSE): 21.6414
- train data 決定係數 R²: 0.7509
- test data 均方誤差 (MSE): 24.2911
- test data 決定係數 R²: 0.6688
結果評估
進行執行結果評估前,先來回顧評估指標的含義:
指標 | 意義 | 解釋方式 |
---|---|---|
MSE (Mean Squared Error) | 預測值與實際值之間的平方差平均值 | 越小越好,越接近 0 表示預測誤差越小 |
R² (決定係數) | 模型能解釋的變異比例 (總變異中有多少被模型解釋) | 越接近 1 越好;0 表示無解釋力;<0 表示比常數預測還差 |
接下來看一下訓練資料與測試資料的表現:
- 訓練資料 (Train Data) 的表現
- R² = 0.7509: 表示模型可以解釋訓練資料中 約 75% 的變異
- MSE = 21.64: 對應房價誤差約為 $\sqrt{21.64} \approx 4.65$ 千美元 ($4,650)
- 測試資料 (Test Data) 表現
- R² = 0.6688: 模型在未見過的資料上仍解釋了 約 66.9% 的變異
- MSE = 24.29: 誤差略升,對應 RMSE 約 $\sqrt{24.29} \approx 4.93$ 千美元
以上的結果表現,都相當合理,表示模型在訓練資料上有不錯的擬合力,沒有明顯欠擬合 (underfitting),測試資料預測略為劣化,但整體表現尚稱穩定,總結如下:
指標 | 判斷 | 解釋 |
---|---|---|
Train R² 明顯 > Test R² | 輕微的 overfitting 傾向 | 差距不大,可接受 |
MSE 增加幅度有限 (+2.65) | 模型泛化能力尚可 | 尚無高變異問題 |
下一步建議
方向 | 建議方法 |
---|---|
增強模型 | 使用 PolynomialFeatures 擴展非線性項 |
加強泛化能力 | 使用 Ridge 或 Lasso 進行正則化 |
改用非線性模型 | 嘗試 RandomForestRegressor、XGBoostRegressor |
模型比較 | 建立 baseline vs 進階模型比較報告 (MSE / R² / 殘差圖) |
誤差分析 | 畫出 Residual Plot 檢查異常值與變異不一致性 (heteroscedasticity) |
結語
線性迴歸的價值不在於它能解決所有問題,而在於它讓我們對「資料與結果的關係」建立第一個清晰的架構。這種清晰,是日後面對複雜資料時,所有模型選擇的比較基準。當你真正理解一個模型的假設、信念、行為邏輯與表現訊號時,你不再是依賴工具,而是在與資料進行對話。