(Day 2) 線性迴歸 (Linear Regression)

(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 所提供的公開版本。樣本內容如下:

Image_2025-08-01_22-34-54.png

欄位說明:

  • 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)

結語

線性迴歸的價值不在於它能解決所有問題,而在於它讓我們對「資料與結果的關係」建立第一個清晰的架構。這種清晰,是日後面對複雜資料時,所有模型選擇的比較基準。當你真正理解一個模型的假設、信念、行為邏輯與表現訊號時,你不再是依賴工具,而是在與資料進行對話。

備註