AI時代系列(1) 機器學習三部曲: 🔹 第一部:《機器學習 —— AI 智慧的啟航》
25/100 第三週:監督學習(回歸)
25. 決策樹回歸 🌳 像問問題一樣,透過條件分割找出最佳結果!
🌳 決策樹回歸(Decision Tree Regression)
像問問題一樣,透過條件分割找出最佳結果!
________________________________________
📌 1️⃣ 什麼是決策樹回歸?
決策樹回歸是一種 非線性回歸模型,它的核心概念是:
• 像問問題一樣,把數據依條件不斷分割
• 在每個區間內使用平均值(或其他統計方法)來預測
• 適合處理非線性、複雜關係的數據集
📌 與線性回歸的比較
線性回歸假設數據之間具有線性關係,透過數學公式擬合一條直線來預測結果,具有良好的可解釋性,但在面對複雜或非線性數據時,準確度可能有限;相較之下,決策樹回歸適用於非線性數據,透過條件判斷逐步分割數據空間,雖然同樣具備可解釋性,但模型容易出現過擬合現象,對於複雜結構能更好擬合,但需要注意模型的泛化能力。
✅ 決策樹回歸適用於複雜的數據關係,不需要假設數據是線性分佈的!
________________________________________
📌 2️⃣ 決策樹回歸的工作原理
🎯 如何建構決策樹?
(1) 選擇最佳分割點(Feature & Threshold)
(2) 根據該分割點將數據拆分成兩組(子節點)
(3) 對每個子節點繼續重複以上步驟,直到滿足停止條件
(4) 最終,每個終端節點的值是該區間內樣本的「平均值」
📊 例子:房價預測
假設我們想要根據「房屋面積(平方公尺)」來預測「房價(萬元)」。
房屋面積(平方公尺) 房價(萬元)
30 50
50 80
70 110
90 150
110 180
決策樹可能會這樣分割:
• 房屋面積 ≤ 60 → 平均房價 65 萬
• 60 < 房屋面積 ≤ 100 → 平均房價 130 萬
• 房屋面積 > 100 → 平均房價 180 萬
這樣,新來的房屋就可以依條件進行分類並得到預測房價!
________________________________________
📌 3️⃣ Python 實作:決策樹回歸
我們將比較:
1. 線性回歸
2. 決策樹回歸
3. 決策樹的深度影響
________________________________________
✅ (1) 產生數據
python
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.tree import DecisionTreeRegressor
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
# 產生非線性數據(房屋面積 vs. 房價)
np.random.seed(42)
X = np.random.randint(20, 200, size=(50, 1)) # 房屋面積
y = 3000 * np.sqrt(X) + np.random.randint(-50000, 50000, size=(50, 1)) # 非線性房價
# 繪製散點圖
plt.scatter(X, y, color='blue', alpha=0.5, label="真實數據")
plt.xlabel("房屋面積(平方公尺)")
plt.ylabel("房價(萬元)")
plt.title("房價 vs. 房屋面積")
plt.legend()
plt.show()
📌 房價與房屋面積的關係呈現非線性曲線,線性回歸將難以擬合。
________________________________________
✅ (2) 訓練線性回歸與決策樹回歸
python
# 分割訓練集與測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 創建線性回歸模型
lin_reg = LinearRegression()
lin_reg.fit(X_train, y_train)
# 創建決策樹回歸(預設 max_depth=None,即完全展開)
tree_reg = DecisionTreeRegressor(random_state=42)
tree_reg.fit(X_train, y_train)
________________________________________
✅ (3) 預測與比較結果
python
# 預測
y_pred_lin = lin_reg.predict(X_test)
y_pred_tree = tree_reg.predict(X_test)
# 計算 MSE 和 R²
mse_lin = mean_squared_error(y_test, y_pred_lin)
r2_lin = r2_score(y_test, y_pred_lin)
mse_tree = mean_squared_error(y_test, y_pred_tree)
r2_tree = r2_score(y_test, y_pred_tree)
print(f"線性回歸 - MSE: {mse_lin:.2f}, R²: {r2_lin:.4f}")
print(f"決策樹回歸 - MSE: {mse_tree:.2f}, R²: {r2_tree:.4f}")
📌 結果示例:
線性回歸 - MSE: 4.5e+10, R²: 0.52
決策樹回歸 - MSE: 1.2e+9, R²: 0.91
📌 解讀
• 決策樹回歸的 MSE(誤差)比線性回歸小很多
• R² 接近 1,代表模型擬合度更高
________________________________________
✅ (4) 視覺化回歸曲線
python
# 生成更多測試點來畫曲線
X_grid = np.linspace(min(X), max(X), 100).reshape(-1, 1)
y_pred_tree_curve = tree_reg.predict(X_grid)
# 繪製比較圖
plt.scatter(X, y, color='blue', alpha=0.5, label="真實數據")
plt.plot(X, lin_reg.predict(X), color='red', linewidth=2, label="線性回歸")
plt.plot(X_grid, y_pred_tree_curve, color='green', linewidth=2, label="決策樹回歸")
plt.xlabel("房屋面積(平方公尺)")
plt.ylabel("房價(萬元)")
plt.title("線性 vs. 決策樹回歸")
plt.legend()
plt.show()
📌 結果:
• 線性回歸(紅色):直線擬合效果差
• 決策樹回歸(綠色):更靈活地擬合非線性數據
________________________________________
📌 4️⃣ 如何選擇決策樹的深度?
如果決策樹太深,它可能會「記住訓練數據」,導致過擬合(Overfitting)。
我們可以透過 max_depth 控制樹的深度:
python
# 設定不同的樹深度
tree_reg_3 = DecisionTreeRegressor(max_depth=3, random_state=42)
tree_reg_3.fit(X_train, y_train)
tree_reg_5 = DecisionTreeRegressor(max_depth=5, random_state=42)
tree_reg_5.fit(X_train, y_train)
tree_reg_full = DecisionTreeRegressor(random_state=42)
tree_reg_full.fit(X_train, y_train)
📌 一般建議
• max_depth=3~5:適合大部分情境,平衡準確度與泛化能力
• 完全展開(max_depth=None):可能會過擬合,須使用交叉驗證來調整
________________________________________
🎯 總結
✅ 決策樹回歸適合非線性數據,能比線性回歸更準確!
✅ 可以調整 max_depth 來避免過擬合
✅ 決策樹可以擴展為隨機森林回歸,效果更好!
🚀 下一步:探索「隨機森林回歸」來提升預測準確度! 🌲🔥