[Python教學] Scikit-learn:監督學習-回歸模型入門

更新於 發佈於 閱讀時間約 12 分鐘

歡迎來到Scikit-learn教學系列的第四篇文章!在上一篇文章中,我們學習了分類模型,掌握了如何預測離散類別。這一篇將聚焦於回歸模型,這是監督學習的另一大分支,用於預測連續數值。我們將介紹回歸問題、Scikit-learn中常見的回歸演算法,並通過實作範例訓練模型、評估表現並視覺化結果。準備好預測房價、溫度或其他連續變量吧!


回歸問題概述

回歸問題的目標是根據特徵預測一個連續的數值。例如:

  • 預測房價(根據面積、位置等特徵)。
  • 預測氣溫(根據時間、地點等特徵)。
  • 預測銷售額(根據廣告投入、季節等特徵)。

與分類問題預測離散類別不同,回歸問題的輸出是連續的數值。Scikit-learn提供了多種回歸演算法,讓我們能輕鬆建模這些問題。


常用回歸演算法

以下是Scikit-learn中三種入門級回歸演算法:

  1. 線性回歸(Linear Regression):假設特徵與目標變量之間存在線性關係,簡單且易於解釋。
  2. 嶺回歸(Ridge Regression):線性回歸的正則化版本,適合處理多重共線性或過擬合。
  3. 隨機森林回歸(Random Forest Regressor):基於多棵決策樹的集成方法,適合非線性關係。


模型評估

回歸模型的表現通常通過以下指標評估:

  • 均方誤差(Mean Squared Error, MSE):預測值與真實值差異的平方平均,值越小越好。
  • 均方根誤差(Root Mean Squared Error, RMSE):MSE的平方根,與目標變量單位相同。
  • R²分數(Coefficient of Determination):衡量模型解釋變異的能力,範圍為0到1,值越接近1越好。

Scikit-learn的metrics模組提供了這些評估工具。

實作:預測房價

由於Scikit-learn的load_boston資料集已棄用,我們將使用一個替代資料集—來自Scikit-learn的fetch_california_housing,用於預測加州房價。該資料集包含多個特徵(如房屋面積、位置等)與房價(連續目標變量)。

程式碼範例

以下程式碼展示如何訓練回歸模型並評估表現:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, Ridge
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score

# 載入California Housing資料集
housing = fetch_california_housing()
X = housing.data
y = housing.target
feature_names = housing.feature_names

# 資料前處理
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 分割訓練集與測試集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3, random_state=42)

# 定義模型
models = {
'Linear Regression': LinearRegression(),
'Ridge Regression': Ridge(alpha=1.0),
'Random Forest': RandomForestRegressor(n_estimators=100, random_state=42)
}

# 訓練與評估
results = []
for name, model in models.items():
# 訓練模型
model.fit(X_train, y_train)

# 預測
y_pred = model.predict(X_test)

# 計算評估指標
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred)
results.append({'Model': name, 'MSE': mse, 'RMSE': rmse, 'R²': r2})

# 輸出結果
print(f"\n{name} Results:")
print(f"MSE: {mse:.4f}")
print(f"RMSE: {rmse:.4f}")
print(f"R² Score: {r2:.4f}")

# 視覺化預測結果
plt.figure(figsize=(6, 4))
plt.scatter(y_test, y_pred, alpha=0.5)
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2)
plt.xlabel('Actual Price')
plt.ylabel('Predicted Price')
plt.title(f'Actual vs Predicted Prices - {name}')
plt.savefig(f'california_housing_{name.lower().replace(" ", "_")}.png')
plt.show()

# 比較模型表現
results_df = pd.DataFrame(results)
plt.figure(figsize=(10, 6))
sns.barplot(x='R²', y='Model', data=results_df)
plt.title('Model R² Score Comparison')
plt.xlabel('R² Score')
plt.ylabel('Model')
plt.savefig('california_housing_model_comparison.png')
plt.show()

程式碼解釋

  1. 資料載入與前處理: 載入California Housing資料集,包含8個特徵與房價(單位:十萬美元)。 使用StandardScaler標準化特徵,確保模型不受不同尺度影響。
  2. 資料分割:將資料分為70%訓練集與30%測試集。
  3. 模型訓練與預測: 訓練三種模型:線性回歸、嶺回歸、隨機森林回歸。 使用predict對測試集進行預測。
  4. 模型評估: 計算MSE、RMSE和R²分數,評估模型表現。 繪製散點圖,比較實際房價與預測房價,紅色虛線表示完美預測。
  5. 視覺化:繪製柱狀圖,比較不同模型的R²分數。

運行程式碼後,你會看到每種模型的評估指標、實際與預測房價的散點圖,以及模型比較圖。

raw-image
raw-image
raw-image
raw-image
raw-image


練習:預測Diabetes資料集的目標值

請完成以下練習:

  1. 使用Scikit-learn的load_diabetes()載入Diabetes資料集,作為回歸問題。
  2. 對特徵進行標準化,並將資料分為訓練集與測試集(比例自選)。
  3. 訓練以下模型:線性回歸、嶺回歸(alpha=0.5)、隨機森林回歸(n_estimators=50)。
  4. 計算每種模型的MSE、RMSE和R²分數。
  5. 繪製實際值與預測值的散點圖,保存為diabetes_模型名稱.png。
  6. 繪製柱狀圖比較模型R²分數,保存為diabetes_model_comparison.png。

以下是起點程式碼:

from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, Ridge
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

# 載入Diabetes資料集
diabetes = load_diabetes()
X = diabetes.data
y = diabetes.target

# 你的程式碼從這裡開始...

總結

恭喜你掌握了回歸模型的基礎!本篇文章介紹了回歸問題、常見演算法(線性回歸、嶺回歸、隨機森林回歸)、評估指標(MSE、RMSE、R²),並通過California Housing資料集展示了完整流程。你現在能夠訓練回歸模型並視覺化預測結果。

在下一篇文章中,我們將學習模型選擇與超參數調優,探索如何選擇最佳模型並優化其參數。請完成練習,並在留言區分享你的Diabetes資料集模型比較圖!

資源與進階學習




留言
avatar-img
留言分享你的想法!
avatar-img
追極光的北極熊|軟體工程師的小天地
10會員
162內容數
歡迎來到我的部落格!這裡記錄了軟體工程師的日常生活點滴,並分享程式設計與演算法的實用教學。無論你是初學者還是有經驗的開發者,都能在這裡找到深入淺出的技術解析與實戰技巧。此外,我也會分享工作中的心路歷程與學習心得,讓你不僅學到技術,更能瞭解軟體開發的實際應用與挑戰。希望透過這個平台,能與你共同成長,激發對技術的熱情!
2025/06/04
歡迎來到Scikit-learn教學系列的第三篇文章!在前兩篇中,我們介紹了Scikit-learn的基礎、環境設置以及資料前處理。這一篇將進入監督學習的核心,聚焦於分類模型。我們將學習分類問題的基本概念、使用Scikit-learn實現常見分類演算法,並通過實作範例與評估方法來訓練和評估模型。
Thumbnail
2025/06/04
歡迎來到Scikit-learn教學系列的第三篇文章!在前兩篇中,我們介紹了Scikit-learn的基礎、環境設置以及資料前處理。這一篇將進入監督學習的核心,聚焦於分類模型。我們將學習分類問題的基本概念、使用Scikit-learn實現常見分類演算法,並通過實作範例與評估方法來訓練和評估模型。
Thumbnail
2025/05/30
歡迎來到Scikit-learn教學系列的第二篇文章!在上篇中,我們介紹了Scikit-learn與機器學習基礎,並探索了Iris資料集。這一篇將聚焦於資料預處理,我們將學習如何使用Scikit-learn清理資料、處理缺失值、進行特徵縮放與類別編碼,並以真實資料集進行實作。
Thumbnail
2025/05/30
歡迎來到Scikit-learn教學系列的第二篇文章!在上篇中,我們介紹了Scikit-learn與機器學習基礎,並探索了Iris資料集。這一篇將聚焦於資料預處理,我們將學習如何使用Scikit-learn清理資料、處理缺失值、進行特徵縮放與類別編碼,並以真實資料集進行實作。
Thumbnail
2025/05/24
歡迎來到Scikit-learn教學系列的第一篇文章!本篇將帶你認識Scikit-learn這個強大的機器學習工具,了解機器學習的基本概念,並完成開發環境的設置。我們還會通過一個簡單的範例,探索Scikit-learn的內建資料集,開啟你的機器學習之旅!
Thumbnail
2025/05/24
歡迎來到Scikit-learn教學系列的第一篇文章!本篇將帶你認識Scikit-learn這個強大的機器學習工具,了解機器學習的基本概念,並完成開發環境的設置。我們還會通過一個簡單的範例,探索Scikit-learn的內建資料集,開啟你的機器學習之旅!
Thumbnail
看更多
你可能也想看
Thumbnail
在資料分析過程中,透過衡量變數之間的線性或非線性關係,能有效探索數據集,篩選出重要特徵,並進行預測建模。本文介紹瞭如何理解數據、使用相關矩陣找出變數關聯性,以及利用互資訊評估變數之間的依賴程度,幫助資料科學家在建模過程中選擇適當的變數,提升模型效果。
Thumbnail
在資料分析過程中,透過衡量變數之間的線性或非線性關係,能有效探索數據集,篩選出重要特徵,並進行預測建模。本文介紹瞭如何理解數據、使用相關矩陣找出變數關聯性,以及利用互資訊評估變數之間的依賴程度,幫助資料科學家在建模過程中選擇適當的變數,提升模型效果。
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
資料前處理(Data Preprocessing)中的重要角色-缺失值處理。從檢查、刪除到填充缺失值,以及插值法和機器學習算法的應用方法。Pandas 缺失值處理基礎方法、進階填充缺失值、鐵達尼號存活預測資料集的示例和機器學習算法填補缺失值方法的介紹與使用。
Thumbnail
資料前處理(Data Preprocessing)中的重要角色-缺失值處理。從檢查、刪除到填充缺失值,以及插值法和機器學習算法的應用方法。Pandas 缺失值處理基礎方法、進階填充缺失值、鐵達尼號存活預測資料集的示例和機器學習算法填補缺失值方法的介紹與使用。
Thumbnail
本文提供了一個關於模擬法演算法的問題,介紹了操作指令的格式及其解析。透過程式碼模擬每條指令,找出回到根目錄所需的操作次數。本文詳細說明瞭模擬法的複雜度分析,能夠幫助讀者更好地理解這個問題。
Thumbnail
本文提供了一個關於模擬法演算法的問題,介紹了操作指令的格式及其解析。透過程式碼模擬每條指令,找出回到根目錄所需的操作次數。本文詳細說明瞭模擬法的複雜度分析,能夠幫助讀者更好地理解這個問題。
Thumbnail
本文介紹瞭如何使用 Excel VBA 解決規劃求解問題的實際案例,並展示了「回溯算法」(Backtracking) 的應用。通過此案例,專業人士可以更好地理解並利用數據,進而在商業環境中做出更精確的決策。
Thumbnail
本文介紹瞭如何使用 Excel VBA 解決規劃求解問題的實際案例,並展示了「回溯算法」(Backtracking) 的應用。通過此案例,專業人士可以更好地理解並利用數據,進而在商業環境中做出更精確的決策。
Thumbnail
最近有新的訂閱者加入, 想趁這個機會再分享一次學習心法與建議給第一次練習的讀者、同學們。 如果你本身已經很熟練演算法,那隨機挑題目練習ok,可以測試觀念是否正確,並且驗證寫code的效率與正確程度。 如果是剛畢業或還在學,以前沒有打過程式競賽。 想開始有系統地增強演算法&資料結構的能力
Thumbnail
最近有新的訂閱者加入, 想趁這個機會再分享一次學習心法與建議給第一次練習的讀者、同學們。 如果你本身已經很熟練演算法,那隨機挑題目練習ok,可以測試觀念是否正確,並且驗證寫code的效率與正確程度。 如果是剛畢業或還在學,以前沒有打過程式競賽。 想開始有系統地增強演算法&資料結構的能力
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News