owned this note
owned this note
Published
Linked with GitHub
# 線性回歸模型與評估
## Source
- 成為python數據分析達人的第一堂課 6
(成為python數據分析達人的第一堂課 7: SVM, Kmeans)
- 大數據分析與資料探勘 W6
- 應⽤機器學習於Python C2-1~2-2
## 課堂投影片與練習
- [ ] **Python機器學習:監督式學習模型簡介**
* **嗨,大家好!** 今天我們將進入機器學習中非常重要的一個領域:**監督式學習 (Supervised Learning)**。
* 在監督式學習中,我們的資料是帶有**「標籤」**的,這就像我們在訓練一個學生,同時給他問題和正確答案。模型會從這些「問題-答案」對中學習,以便未來能對新問題做出正確的預測。
* 今天的課程將涵蓋兩種經典的監督式學習模型:
1. **線性迴歸 (Linear Regression)**
2. **羅吉斯迴歸 (Logistic Regression)**
* 我們將透過不同的資料集,來實際操作這些演算法在Python中如何實作。
---
- [ ] **線性迴歸 (Linear Regression) 原理介紹**
* **線性迴歸** 是一種常被用來處理**連續變數 (Continuous Variable)** 的迴歸模型。
* 它的主要目的是**探討自變數 (Independent Variable) 與應變數 (Dependent Variable) 之間的關係**。
* **什麼是自變數?**
* 在學理上稱為 **Independent Variable**,意味著它**不會被其他變數影響**,它只會去影響別人,常被認為是「因」。
* 在圖表中,通常以 **X軸** 代表自變數。
* 在機器學習中,我們通常將**自變數**稱為 **「特徵 (Features)」**。
* **什麼是應變數?**
* 在學理上稱為 **Dependent Variable**,意味著它**會被其他變數所影響**,常被認為是「果」。
* 在圖表中,通常以 **Y軸** 代表應變數.
* **應變數**則稱為 **「目標 (Target)」**。
---
- [ ] **線性迴歸 (Linear Regression) 的類型**
* 依據特徵數目與模型的維度不同,線性迴歸通常可歸納為以下幾類:
* **簡單線性迴歸 (Simple Linear Regression)**:
* **一個自變數** 影響 **一個應變數**。
* 例如:**房子大小 (自變數)** 影響 **房價 (應變數)**。
* **多元線性迴歸 (Multiple Linear Regression) / 複迴歸**:
* **多個自變數** 影響 **一個應變數**。
* 例如:**房子大小、地點、屋齡 (多個自變數)** 共同影響 **房價 (應變數)**。
* **多項式迴歸 (Polynomial Regression)**:
* 當特徵與目標之間的關係**並非單純的線性**時使用。
* 透過**高維度的多項式**來建構模型,例如自變數可能會出現**高次方 (X², X³等)**。
* 模型結果會呈現**曲線**,而非直線.
---
- [ ] **線性迴歸的「因果關係」迷思**
* 雖然我們常用「因果」來描述自變數和應變數,但請特別注意:
* **線性迴歸並非一個因果關係的分析**。
* 它只告訴我們**兩個變數之間的統計關係**。
* 舉例來說,我們可以用體重預測身高,也可以用身高預測體重。這兩個變數之間存在關係,但我們不能說體重是身高的「因」,或身高是體重的「因」。
* 因此,線性迴歸是一種**統計估計**,而非真正意義上的因果關係。
---
- [ ] **線性迴歸的目標與核心概念**
* 在線性迴歸中,我們會有一個:
* **目標式 (Target Formula)**:這是**理想中存在於兩個變數之間的關係**,但通常是我們觀測不到的。
* **預測式 (Prediction Formula)**:這是我們透過模型來**估計和逼近目標式**的公式。
* **我們的目標就是找到一個「最好的線性迴歸預測式」**,來盡可能地接近真實的目標式。
* **如何找到這個「最好」的預測式?**
* 我們會透過觀察 **誤差 (Error)** 或 **殘差 (Residual)** 來決定。
* **誤差 (Error)**:是**觀測值與真實值之間的差**。由於真實值通常觀測不到,所以很難計算誤差。
* **殘差 (Residual)**:是 **觀測值與預測值之間的差**。殘差會根據我們建立的模型而有所改變。
* 我們常常會使用**最小化平均絕對誤差 (MAE)**、**平均平方誤差 (MSE)**、**均方根誤差 (RMSE)** 等衡量方式,來評估哪個迴歸模型是最適合的。
---
- [ ] **線性迴歸的公式 (簡單線性迴歸)**
* 簡單線性迴歸的**預測式 (Hypothesis)** 通常表示為:
$$ \hat{Y} = \beta_0 + \beta_1X_1 $$
* $\hat{Y}$:是**預測的應變數 (目標) 值**。
* $X_1$:是**自變數 (特徵) 值**。
* $\beta_0$ (Beta Zero):稱為**截距項 (Intercept)**。
* 它代表當 $X$ 為 $0$ 時,$Y$ 的預測值。
* $\beta_1$ (Beta One):稱為**係數項 (Coefficient)** 或**斜率 (Slope)**。
* 它代表當 $X$ 變動**一個單位**時,$Y$ 會變動多少。
* **複迴歸 (Multiple Regression) 公式**:
* 當我們有多個自變數時,公式會擴展為:
$$ \hat{Y} = \beta_0 + \beta_1X_1 + \beta_2X_2 + \dots + \beta_mX_m $$
* 其中 $\beta_1, \beta_2, \dots, \beta_m$ 分別是各個自變數的係數,它們代表在其他自變數保持不變的情況下,該自變數每增加一個單位,應變數的變動量。
---
- [ ] **如何找出「最好」的係數?:最小平方估計法**
* 我們的目標是找到最佳的 $\beta_0$ 和 $\beta_1$ 值,讓預測線盡可能地**貼近資料點**。
* **最小平方估計法 (Least Squares Estimate Method)** 是最常用的方法之一。
* 它的核心思想是:**最小化殘差平方和 (Sum of Squared Error, SSE)**。
* **殘差 (e)** 是觀測值 (Y) 與預測值 ($\hat{Y}$) 之間的差異。
* **殘差平方和 (SSE)** 的公式為:
$$ SSE = \sum_{i=1}^{n} e_i^2 = \sum_{i=1}^{n} (Y_i - \hat{Y}_i)^2 = \sum_{i=1}^{n} (Y_i - \hat{\beta}_0 - \hat{\beta}_1X_i)^2 $$
* **SSE 越小,表示模型對資料的擬合 (Fit) 越好**。
* 在Python中,我們不需要手動計算這些,Scikit-Learn套件會自動幫我們完成。
---
- [ ] **線性迴歸的優點與缺點**
* **優點 (Advantages)**:
* **易於實作 (Easy to implement)**:概念相對直觀。
* **計算速度快 (Fast computation)**:尤其對於大型資料集,效率很高。
* **解釋性高 (High interpretability)**:我們可以透過係數項 ($\beta$ 值) 的大小和正負,直接了解自變數與應變數之間的關係和影響方向。例如,如果房價與房屋大小的係數是正數,且數值越大,代表房屋越大,房價越高。
* **缺點 (Disadvantages)**:
* **適用於線性關係 (Suitable for linear relationships)**:線性迴歸模型假設自變數和應變數之間存在線性關係。如果資料本質上是非線性的,線性迴歸的效果會不佳。
* **不適用於非線性資料 (Not suitable for non-linear data)**:當資料點呈現曲線分佈時,單純的直線無法很好地擬合資料。這時候可能需要考慮多項式迴歸或其他非線性模型。
* **易受共線性影響 (Susceptible to multicollinearity)**:如果自變數之間存在高度相關性,模型的係數估計可能會出現偏差或不顯著,使得結果難以解釋。
---
- [ ] **課中練習一:線性迴歸概念釐清**
1. **任務:** 請解釋在線性迴歸中,「自變數」和「應變數」分別代表什麼?它們在機器學習中還有什麼常見的名稱?
2. **任務:** 為什麼說線性迴歸是一種「統計估計」,而非真正的「因果關係」分析?請舉例說明。
3. **任務:** 當我們說要找到「最好的線性迴歸預測式」時,這個「最好」是透過什麼方式來衡量的?請簡單解釋「殘差平方和」在其中扮演的角色。
---
- [ ] **線性迴歸實作:Python程式碼流程**
* 在Python中實作監督式學習模型,我們通常會遵循以下步驟:
1. **載入常用套件 (Load Libraries)**:
* `NumPy`:用於數值計算。
* `Pandas`:用於資料處理和分析。
* `Matplotlib` 和 `Seaborn`:用於資料視覺化。
2. **匯入資料集 (Load Dataset)**:
* 通常會從 `scikit-learn` 內建的資料集或外部檔案(如CSV)載入。
3. **切割資料集 (Split Dataset)**:
* 將資料分成 **訓練資料 (Training Data)** 和 **測試資料 (Testing Data)**。
* 訓練資料用於讓模型學習,測試資料用於評估模型的表現。
* 常見的比例是 **訓練集 70%,測試集 30%**。
4. **建立模型 (Build Model)**:
* 從 `scikit-learn` 中匯入對應的模型(例如 `LinearRegression`)。
* 使用訓練資料來 **「訓練 (Fit)」** 模型。
5. **進行預測 (Make Predictions)**:
* 使用訓練好的模型對測試資料進行預測。
6. **評估模型績效 (Evaluate Model Performance)**:
* 比較模型的預測結果與真實值,計算各種衡量指標來評估模型的好壞。
---
- [ ] **線性迴歸實作:波士頓房價範例 (1/3) - 資料準備**
* 我們將使用 `scikit-learn` 中的**波士頓房價資料集 (Load Boston)** 來示範線性迴歸。
* **載入常用套件**
```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split # 用於切割資料集
from sklearn.linear_model import LinearRegression # 線性迴歸模型
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score # 評估指標
```
* **匯入波士頓房價資料集**
```python
from sklearn.datasets import fetch_openml
boston = fetch_openml(name='boston', version=1, as_frame=True)
df = boston.frame
df.head()
```
---
* **資料前處理**
```python
# 查看完整資料資訊(欄位型別、是否有缺值等
print("資料集基本資訊:")
df.info()
# 處理類別型欄位(CHAS, RAD)
# One-Hot Encoding:將類別型欄位轉為數值欄位(0/1)
df_processed = pd.get_dummies(df, drop_first=True)
# 顯示轉換後的欄位名稱(確認是否處理成功)
print("\n🧾 One-Hot Encoding後的欄位:")
print(df_processed.columns)
```
---
* **切割資料集**
* 定義 **X (特徵)** 和 **Y (目標)**:
* `X = df_boston.drop('PRICE', axis=1)` # 移除目標欄位,其餘為特徵
* `Y = df_boston['PRICE']` # 目標為房價
* 使用 `train_test_split` 切割資料:
```python
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=42)
# test_size=0.3 表示 30% 用於測試,70% 用於訓練
# random_state=42 確保每次執行結果一致
print(f"訓練集特徵數量: {X_train.shape}")
print(f"測試集特徵數量: {X_test.shape}")
```
---
- [ ] **模型訓練與預測**
* **建立線性迴歸模型**
```python
# 建立一個線性迴歸模型物件
model = LinearRegression()
# 使用訓練資料 (X_train, Y_train) 來訓練模型
model.fit(X_train, Y_train)
print("模型訓練完成!")
```
* **步驟五:進行預測**
```python
# 使用訓練好的模型對測試資料 (X_test) 進行預測
Y_pred = model.predict(X_test)
# 查看部分預測結果與真實值比較
results_df = pd.DataFrame({'真實房價 (Y_test)': Y_test, '預測房價 (Y_pred)': Y_pred})
print(results_df.head()) # 列印前幾筆比較結果
# 查看模型學到的係數 (Coefficients) 和截距 (Intercept)
print("\n模型的截距項 (Intercept_):", model.intercept_)
print("模型的係數項 (Coefficients_):", model.coef_)
```
---
- [ ] **線性迴歸實作:波士頓房價範例 (3/3) - 模型評估**
* **步驟六:評估模型表現**
* **R-squared (R平方)**:
* `model.score()` 方法可以直接計算 R 平方值。
* R 平方值介於 0 到 1 之間,越接近 1 表示模型解釋應變數變異的能力越強,擬合度越好。
* **均方誤差 (Mean Squared Error, MSE)**:
* 計算預測值與實際值之間差異的平均平方值。
* **MSE 越大,表示模型越不合適**。
* **均方根誤差 (Root Mean Squared Error, RMSE)** 是 MSE 的平方根,單位與應變數一致,更具可解釋性。
* **平均絕對誤差 (Mean Absolute Error, MAE)**:
* 計算預測值與實際值之間絕對差異的平均值。
* 對離群值不如 MSE 敏感。
```python
# 計算 R 平方值
r2 = model.score(X_test, Y_test) # 可以直接用 model.score 評估 R 平方
print(f"\n模型的 R 平方 (R-squared): {r2:.4f}")
# 計算均方誤差 (MSE)
mse = mean_squared_error(Y_test, Y_pred) # 從 sklearn.metrics 匯入
print(f"模型的均方誤差 (MSE): {mse:.4f}")
# 計算均方根誤差 (RMSE)
rmse = np.sqrt(mse) # RMSE 是 MSE 的平方根
print(f"模型的均方根誤差 (RMSE): {rmse:.4f}")
# 計算平均絕對誤差 (MAE)
mae = mean_absolute_error(Y_test, Y_pred) # 從 sklearn.metrics 匯入
print(f"模型的平均絕對誤差 (MAE): {mae:.4f}")
```
---
* [ ] **機器學習模型評估指標**
* **MAE(平均絕對誤差)**
- **全名:** Mean Absolute Error
- **定義:** 將每一筆預測值與實際值之間的差取絕對值後,求其平均。
- **公式:** MAE = (1/n) × Σ|yᵢ − ŷᵢ|
* 其中 n 為樣本數,yᵢ 為實際值,ŷᵢ 為預測值
- **特點:**
* 易於理解與解釋
* 對異常值(outliers)不敏感
* 單位與原始資料相同
---
* [ ] **MSE(均方誤差)**
- **全名:** Mean Squared Error
- **定義:** 將預測值與實際值之間的差平方後求平均。
- **公式:** MSE = (1/n) × Σ(yᵢ − ŷᵢ)²
- **特點:**
* 總是非負的,越接近 0 表示模型越準確
* 對較大的誤差更敏感(平方效果放大差異)
* 單位是原始資料單位的平方,較難直觀解釋
---
* [ ] **RMSE(均方根誤差)**
- **全名:** Root Mean Squared Error
- **定義:** MSE 的平方根
- **公式:** RMSE = √\[(1/n) × Σ(yᵢ − ŷᵢ)²]
- **特點:**
* 結合了 MSE 的特性,對誤差大小變化敏感
* 單位與原始數據相同,便於解釋
* 常用於比較不同模型之間的預測表現
---
* [ ] **三種評估指標的比較**
- **MAE:**
* 優點:直觀、穩定,適合對異常值不敏感的情境
* 缺點:無法反映誤差的變異程度
* 適合需要簡單直觀結果的應用,如房價、銷售量預測。
- **MSE:**
* 優點:能強調大的預測誤差,對模型調整更有指引性
* 缺點:單位是平方,不易直接解釋
* 適用於希望強調大誤差的場景,如品質控制或金融風險評估。
- **RMSE:**
* 優點:結合 MAE 與 MSE 的優點,單位可解釋
* 缺點:相較 MAE 計算略為複雜
* 廣泛用於許多回歸問題,如天氣預報、能源預測等。
---
* [ ] **課堂練習:計算評估指標**
1. **任務:用 Python 實作 MAE、MSE、RMSE 的函數**
```python
import numpy as np
def calculate_mae(y_true, y_pred):
return np.mean(np.abs(y_true - y_pred))
def calculate_mse(y_true, y_pred):
return np.mean((y_true - y_pred)**2)
def calculate_rmse(y_true, y_pred):
return np.sqrt(calculate_mse(y_true, y_pred))
# 測試資料
y_true = np.array([3, -0.5, 2, 7])
y_pred = np.array([2.5, 0.0, 2, 8])
print("MAE:", calculate_mae(y_true, y_pred))
print("MSE:", calculate_mse(y_true, y_pred))
print("RMSE:", calculate_rmse(y_true, y_pred))
```
---
- [ ] **課中練習二:線性迴歸實作**
1. **任務:** 修改上述波士頓房價範例程式碼中的 `test_size` 參數,將其改為 `0.2` (即 80% 訓練資料,20% 測試資料),並觀察 `R-squared`、`MSE`、`RMSE`、`MAE` 的變化。請問這些指標的變化代表什麼?
* **提示:** 數值越高越好還是越低越好?
2. **任務:** 嘗試僅使用 `RM` (每戶平均房間數) 作為單一特徵來預測房價。
* **提示:** 在切割資料集時,將 `X` 定義為 `df_boston[['RM']]`。
* 訓練模型並評估其 R 平方值,與使用所有特徵的模型進行比較,說明你的觀察。
3. **任務:** 思考一下,如果你的模型在訓練集上的 R 平方很高,但在測試集上的 R 平方很低,這可能代表什麼問題?