歡迎來到Scikit-learn教學系列的第四篇文章!在上一篇文章中,我們學習了分類模型,掌握了如何預測離散類別。這一篇將聚焦於回歸模型,這是監督學習的另一大分支,用於預測連續數值。我們將介紹回歸問題、Scikit-learn中常見的回歸演算法,並通過實作範例訓練模型、評估表現並視覺化結果。準備好預測房價、溫度或其他連續變量吧!
回歸問題概述
回歸問題的目標是根據特徵預測一個連續的數值。例如:- 預測房價(根據面積、位置等特徵)。
- 預測氣溫(根據時間、地點等特徵)。
- 預測銷售額(根據廣告投入、季節等特徵)。
與分類問題預測離散類別不同,回歸問題的輸出是連續的數值。Scikit-learn提供了多種回歸演算法,讓我們能輕鬆建模這些問題。
常用回歸演算法
以下是Scikit-learn中三種入門級回歸演算法:
- 線性回歸(Linear Regression):假設特徵與目標變量之間存在線性關係,簡單且易於解釋。
- 嶺回歸(Ridge Regression):線性回歸的正則化版本,適合處理多重共線性或過擬合。
- 隨機森林回歸(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()
程式碼解釋
- 資料載入與前處理: 載入California Housing資料集,包含8個特徵與房價(單位:十萬美元)。 使用StandardScaler標準化特徵,確保模型不受不同尺度影響。
- 資料分割:將資料分為70%訓練集與30%測試集。
- 模型訓練與預測: 訓練三種模型:線性回歸、嶺回歸、隨機森林回歸。 使用predict對測試集進行預測。
- 模型評估: 計算MSE、RMSE和R²分數,評估模型表現。 繪製散點圖,比較實際房價與預測房價,紅色虛線表示完美預測。
- 視覺化:繪製柱狀圖,比較不同模型的R²分數。
運行程式碼後,你會看到每種模型的評估指標、實際與預測房價的散點圖,以及模型比較圖。





練習:預測Diabetes資料集的目標值
請完成以下練習:
- 使用Scikit-learn的load_diabetes()載入Diabetes資料集,作為回歸問題。
- 對特徵進行標準化,並將資料分為訓練集與測試集(比例自選)。
- 訓練以下模型:線性回歸、嶺回歸(alpha=0.5)、隨機森林回歸(n_estimators=50)。
- 計算每種模型的MSE、RMSE和R²分數。
- 繪製實際值與預測值的散點圖,保存為diabetes_模型名稱.png。
- 繪製柱狀圖比較模型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資料集模型比較圖!
資源與進階學習
- Scikit-learn回歸文件:https://scikit-learn.org/stable/supervised_learning.html
- 回歸實務:《Introduction to Machine Learning with Python》
- 練習平台:Kaggle回歸競賽(https://www.kaggle.com/competitions)