決策樹算法是一種既可以用于分類,也可以用于回歸的算法。
決策樹回歸是通過對輸入特征的不斷劃分來建立一棵決策樹,每一步劃分都基于當前數據集的最優劃分特征。
它的目標是最小化總體誤差或最大化預測精度,其構建通常采用自上而下的貪心搜索方式,通過比較不同劃分標準來選擇最優劃分。
決策樹回歸廣泛應用于各種回歸問題,如預測房價、股票價格、客戶流失等。
1. 算法概述
決策樹相關的諸多算法之中,有一種CART算法,全稱是?classification and regression tree
(分類與回歸樹)。
顧名思義,這個算法既可以用來分類,也可以用來回歸,本篇主要介紹其在回歸問題上的應用。
決策樹算法的核心在于生成一棵決策樹過程中,如何劃分各個特征到樹的不同分支上去。
CART算法是根據基尼系數(Gini)來劃分特征的,每次選擇基尼系數最小的特征作為最優切分點。
其中基尼系數的計算方法:gini(p)=∑ni=1pi(1?pi)=1?∑ni=1p2igini(p)=∑i=1npi(1?pi)=1?∑i=1npi2
2. 創建樣本數據
這次的回歸樣本數據,我們用?scikit-learn
?自帶的玩具數據集中的糖尿病數據集。
關于玩具數據集的內容,可以參考:TODO
from sklearn.datasets import load_diabetes# 糖尿病數據集
diabetes = load_diabetes()
X = diabetes.data
y = diabetes.target
這個數據集中大約有400多條數據。
3. 模型訓練
訓練之前,為了減少算法誤差,先對數據進行標準化處理。
from sklearn import preprocessing as pp# 數據標準化
X = pp.scale(X)
y = pp.scale(y)
接下來分割訓練集和測試集。
from sklearn.model_selection import train_test_split# 分割訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)
然后用scikit-learn
中的DecisionTreeRegressor
模型來訓練:
from sklearn.tree import DecisionTreeRegressor# 定義決策樹回歸模型
reg = DecisionTreeRegressor(max_depth=2)# 訓練模型
reg.fit(X_train, y_train)# 在測試集上進行預測
y_pred = reg.predict(X_test)
DecisionTreeRegressor
的主要參數包括:
- criterion:用于衡量節點劃分質量的指標。可以選擇的值有'mse'(均方誤差)或'mae'(平均絕對誤差)。默認值為'mse',適用于大多數情況。
- splitter:用于決定節點如何進行劃分的策略。可以選擇的值有'best'(選擇最佳劃分)或'random'(隨機劃分)。默認值為'best'。
- max_depth:決策樹的最大深度。默認值為None,表示不限制最大深度。增加最大深度有助于更好地擬合訓練數據,但可能導致過擬合。
- random_state:用于設置隨機數生成器的種子。默認值為None,表示使用隨機數生成器。
- ccp_alpha:用于控制正則化強度的參數。默認值為None,表示不進行正則化。
- max_samples:用于控制每個節點最少需要多少樣本才能進行分裂。默認值為None,表示使用整個數據集。
- min_samples_split:用于控制每個節點最少需要多少樣本才能進行分裂。默認值為2,表示每個節點至少需要2個樣本才能進行分裂。
- min_samples_leaf:用于控制每個葉子節點最少需要多少樣本才能停止分裂。默認值為1,表示每個葉子節點至少需要1個樣本才能停止分裂。
- min_weight_fraction_leaf:用于控制每個葉子節點最少需要多少樣本的權重才能停止分裂。默認值為0.0,表示每個葉子節點至少需要0個樣本的權重才能停止分裂。
- max_features:用于控制每個節點最多需要考慮多少個特征進行分裂。默認值為None,表示使用所有特征。
- max_leaf_nodes:用于控制決策樹最多有多少個葉子節點。默認值為None,表示不限制葉子節點的數量。
- min_impurity_decrease:用于控制每個節點最少需要減少多少不純度才能進行分裂。默認值為0.0,表示每個節點至少需要減少0個不純度才能進行分裂。
- min_impurity_split:用于控制每個葉子節點最少需要減少多少不純度才能停止分裂。默認值為None,表示使用min_impurity_decrease參數。
- class_weight:用于設置類別權重的字典或方法。默認值為None,表示使用均勻權重。
最后驗證模型的訓練效果:
from sklearn import metrics# 在測試集上進行預測
y_pred = reg.predict(X_test)mse, r2, m_error = 0.0, 0.0, 0.0
y_pred = reg.predict(X_test)
mse = metrics.mean_squared_error(y_test, y_pred)
r2 = metrics.r2_score(y_test, y_pred)
m_error = metrics.median_absolute_error(y_test, y_pred)print("均方誤差:{}".format(mse))
print("復相關系數:{}".format(r2))
print("中位數絕對誤差:{}".format(m_error))# 運行結果
均方誤差:0.5973573097746598
復相關系數:0.5153160857515913
中位數絕對誤差:0.5496418600646286
從預測的誤差來看,訓練的效果還不錯。
這里用DecisionTreeRegressor
訓練模型時使用了參數max_depth=2
,
我從max_depth=1
逐個嘗試到了max_depth=10
,發現max_depth=2
時誤差最小。
4. 總結
決策樹回歸具有直觀、易于理解、易于實現等優點。
生成的決策樹可以直觀地展示出輸入特征與輸出結果之間的關系,因此對于非專業人士來說也易于理解。
此外,決策樹回歸算法相對簡單,易于實現,且對數據的預處理要求較低。
然而,決策樹回歸也存在一些缺點。
首先,它容易過擬合訓練數據,特別是當訓練數據量較小時;
其次,決策樹的性能受劃分標準選擇的影響較大,不同的劃分標準可能會導致生成的決策樹性能差異較大;
此外,決策樹回歸在處理大規模數據時可能會比較耗時,因為需要遍歷整個數據集進行訓練和預測。
關注靈活就業新業態,了解更多程序員兼職項目,關注公賬號:賢才寶(賢才寶https://www.51xcbw.com)?