迴歸樹模型 0基礎小白也能懂(附程式碼)
啥是迴歸樹模型
大家在前面的部分學習到了使用決策樹進行分類,實際決策樹也可以用作迴歸任務,我們叫作迴歸樹。而回歸樹的結構還是樹形結構,但是屬性選擇與生長方式和分類的決策樹有不同。
要講迴歸樹,我們一定會提到CART樹,CART樹全稱Classification And Regression Trees,包括分類樹與迴歸樹。
CART的特點是:假設決策樹是二叉樹,內部結點特徵的取值為「是」和「否」,右分支是取值為「是」的分支,左分支是取值為「否」的分支。這樣的決策樹等價於「遞迴地二分每個特徵」,將輸入空間(特徵空間)劃分為有限個單元,並在這些單元上確定預測的機率分佈,也就是在輸入給定的條件下輸出的條件機率分佈。
這是人話嗎......看半天沒看懂,迴歸樹相對於決策樹來說用於處理連續型數值的目標變數。也就是說,迴歸樹的預測輸出是一個連續的實數值,例如預測房價、溫度等,之前學的決策樹都是處理離散的,看下面的圖吧
設有資料集\(D\),構建迴歸樹的大體思路如下:
- ① 考慮資料集上所有特徵\(j\),遍歷每一個特徵下可能的取值或者切分點(怎麼選取的後面會說),將資料集劃分為兩部分\(D_1,D_2\)
- ② 分別計算\(D_1,D_2\)的平方誤差和,選擇最小的平方誤差對應的特徵與分割點,生成兩個子節點(將資料劃分為兩部分)。
- ③ 對上述兩個子節點遞迴呼叫步驟 ① ②,直到滿足停止條件(比如最小樣本數,最大數深度之類的)。
迴歸樹構建完成後,就完成了對整個輸入空間的劃分(即完成了迴歸樹的建立)。將整個輸入空間劃分為多個子區域,每個子區域輸出為該區域內所有訓練樣本的平均值。我們知道了迴歸樹其實是將輸入空間劃分為\(M\)個單元,每個區域的輸出值是該區域內所有點\(y\)值的平均數。但我們希望構建最有效的迴歸樹:預測值與真實值差異度最小。下面部分我們展開講講,迴歸樹是如何生長的。
2.啟發式切分與最優屬性選擇
又是最優屬性選擇,決策樹中是資訊增益和基尼係數之類的,那這裡會是什麼呢?
下面是我們基礎的劃分思路
RSS(殘差平方和,Residual Sum of Squares)是用於衡量分裂質量的一個標準
- \(y\)為每個訓練樣本的標籤構成的標籤向量,向量中的每個元素\(y_i\)對應的是每個樣本的標籤。
- \(X\)為特徵的集合,\(x_1,x_2,...,x_p\)為第一個特徵到第p個特徵
- \(R_1,R_2,...,R_j\)為整個特徵空間劃分得來的J個不重疊的區域
- \(\widetilde{y}_{R_j}\) 為劃分到第\(j\)個區域\(R_j\)的樣本的平均標籤值,用這個值作為該區域的預測值,即如果有一個測試樣本在測試時落入到該區域,就將該樣本的標籤值預測為\(\widetilde{y}_{R_j}\)
但是這個最小化和探索的過程,計算量是非常非常大的。我們採用「探索式的遞迴二分」來嘗試解決這個問題。
遞迴二分
迴歸樹採用的是「自頂向下的貪婪式遞迴方案」。這裡的貪婪,指的是每一次的劃分,只考慮當前最優,而不回頭考慮之前的劃分。
我們再來看看「遞迴切分」。下方有兩個對比圖,其中左圖是非遞迴方式切分得到的,而右圖是二分遞迴的方式切分得到的空間劃分結果(下一次劃分一定是在之前的劃分基礎上將某個區域一份為二)。
(感覺思路就是不一次性劃分完,根據當前現狀一步一步來)
迴歸樹總體流程類似於分類樹:分枝時窮舉每一個特徵可能的劃分閾值,來尋找最優切分特徵和最優切分點閾值,衡量的方法是平方誤差最小化。分枝直到達到預設的終止條件(如葉子個數上限)就停止。
但通常在處理具體問題時,單一的迴歸樹模型能力有限且有可能陷入過擬合,我們經常會利用整合學習中的Boosting思想,對迴歸樹進行增強,得到的新模型就是提升樹(Boosting Decision Tree),進一步,可以得到梯度提升樹(Gradient Boosting Decision Tree,GBDT),再進一步可以升級到XGBoost。透過多棵迴歸樹擬合殘差,不斷減小預測值與標籤值的偏差,從而達到精準預測的目的,會在後面介紹這些高階演算法。
過擬合與正則化
過擬合問題處理
(1)約束控制樹的過度生長
限制樹的深度:當達到設定好的最大深度時結束樹的生長。
分類誤差法:當樹繼續生長無法得到客觀的分類誤差減小,就停止生長。
葉子節點最小資料量限制:一個葉子節點的資料量過小,樹停止生長。
(2)剪枝
約束樹生長的缺點就是提前扼殺了其他可能性,過早地終止了樹的生長,我們也可以等待樹生長完成以後再進行剪枝,即所謂的後剪枝,而後剪枝演算法主要有以下幾種:
Reduced-Error Pruning(REP,錯誤率降低剪枝)。
Pesimistic-Error Pruning(PEP,悲觀錯誤剪枝)。
Cost-Complexity Pruning(CCP,代價複雜度剪枝)。
Error-Based Pruning(EBP,基於錯誤的剪枝)。
正則化
剪枝的目標是找到使得以下表示式最小的子樹\(T_a\)
\(T_a=RSS+\alpha|T|\)
- 其中\(\alpha\)是正則化項的係數,可以透過交叉驗證去選擇。
- \(|T|\)是迴歸樹葉子節點的個數(即樹的複雜度)
程式碼實現
# 匯入必要的庫
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing # 載入加州房價資料集
from sklearn.model_selection import train_test_split # 用於劃分訓練集和測試集
from sklearn.tree import DecisionTreeRegressor # 使用迴歸樹
from sklearn.metrics import mean_squared_error, r2_score # 用於評估模型效能
# 1. 載入加州房價資料集
data = fetch_california_housing() # 載入加州房價資料
X = data.data # 特徵矩陣(包含了多個影響房價的因素,如人口密度、緯度、經度等)
y = data.target # 目標變數(房價,單位為千美元)
# 2. 劃分訓練集和測試集
# 我們將資料集分為訓練集和測試集,70%用於訓練模型,30%用於測試模型的表現
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 3. 建立迴歸樹模型
# max_depth=5 限制了樹的最大深度為5,防止過擬合
# random_state=42 確保每次執行程式碼時模型的結果是可重複的
regressor = DecisionTreeRegressor(max_depth=5, random_state=42)
# 4. 訓練模型
# fit() 函式用於訓練模型,使其學習訓練集中的特徵與房價之間的關係
regressor.fit(X_train, y_train)
# 5. 進行預測
# 使用訓練好的模型對訓練集和測試集進行預測
y_pred_train = regressor.predict(X_train) # 對訓練集的預測結果
y_pred_test = regressor.predict(X_test) # 對測試集的預測結果
# 6. 評估模型
# 計算測試集的均方誤差(MSE)
# MSE 衡量模型預測值與實際值之間的平均誤差,數值越小表示預測越準確
mse_test = mean_squared_error(y_test, y_pred_test)
print(f"Mean Squared Error (Test): {mse_test:.2f}")
# 計算訓練集的均方誤差(MSE)
# 可以用來評估模型是否在訓練集上過擬合
mse_train = mean_squared_error(y_train, y_pred_train)
print(f"Mean Squared Error (Train): {mse_train:.2f}")
# 計算R²得分
# R² 是決定係數,衡量模型對資料的擬合程度,1.0表示完全擬合,0表示無法擬合
r2_test = r2_score(y_test, y_pred_test)
r2_train = r2_score(y_train, y_pred_train)
print(f"R² Score (Test): {r2_test:.2f}")
print(f"R² Score (Train): {r2_train:.2f}")
# 7. 視覺化迴歸樹的預測結果(實際值 vs. 預測值)
# 我們繪製散點圖來展示測試集上的實際房價與預測房價的對比
plt.scatter(y_test, y_pred_test)
plt.xlabel('Actual Prices') # 橫軸是實際的房價
plt.ylabel('Predicted Prices') # 縱軸是模型預測的房價
plt.title('Actual vs Predicted Prices') # 圖表標題
plt.show()
結果如下
看下對角線發現很多店落在右下角,看來預測的結果還是低估了房價。
Mean Squared Error (Test): 0.52
Mean Squared Error (Train): 0.49
R² Score (Test): 0.60
R² Score (Train): 0.63
emm準度一般,也在情理之中,R²得分越接近1,模型的預測效果越好。