【scikit-learn基础】--『监督学习』之 决策树回归
決策樹算法是一種既可以用于分類,也可以用于回歸的算法。
決策樹回歸是通過對輸入特征的不斷劃分來建立一棵決策樹,每一步劃分都基于當前數(shù)據(jù)集的最優(yōu)劃分特征。
它的目標是最小化總體誤差或最大化預測精度,其構(gòu)建通常采用自上而下的貪心搜索方式,通過比較不同劃分標準來選擇最優(yōu)劃分。
決策樹回歸廣泛應用于各種回歸問題,如預測房價、股票價格、客戶流失等。
1. 算法概述
決策樹相關(guān)的諸多算法之中,有一種CART算法,全稱是 classification and regression tree(分類與回歸樹)。
顧名思義,這個算法既可以用來分類,也可以用來回歸,本篇主要介紹其在回歸問題上的應用。
決策樹算法的核心在于生成一棵決策樹過程中,如何劃分各個特征到樹的不同分支上去。
CART算法是根據(jù)基尼系數(shù)(Gini)來劃分特征的,每次選擇基尼系數(shù)最小的特征作為最優(yōu)切分點。
其中基尼系數(shù)的計算方法:\(gini(p) = \sum_{i=1}^n p_i(1-p_i)=1-\sum_{i=1}^n p_i^2\)
2. 創(chuàng)建樣本數(shù)據(jù)
這次的回歸樣本數(shù)據(jù),我們用 scikit-learn 自帶的玩具數(shù)據(jù)集中的糖尿病數(shù)據(jù)集。
關(guān)于玩具數(shù)據(jù)集的內(nèi)容,可以參考:TODO
from sklearn.datasets import load_diabetes
# 糖尿病數(shù)據(jù)集
diabetes = load_diabetes()
X = diabetes.data
y = diabetes.target
這個數(shù)據(jù)集中大約有400多條數(shù)據(jù)。
3. 模型訓練
訓練之前,為了減少算法誤差,先對數(shù)據(jù)進行標準化處理。
from sklearn import preprocessing as pp
# 數(shù)據(jù)標準化
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的主要參數(shù)包括:
- criterion:用于衡量節(jié)點劃分質(zhì)量的指標??梢赃x擇的值有'mse'(均方誤差)或'mae'(平均絕對誤差)。默認值為'mse',適用于大多數(shù)情況。
- splitter:用于決定節(jié)點如何進行劃分的策略??梢赃x擇的值有'best'(選擇最佳劃分)或'random'(隨機劃分)。默認值為'best'。
- max_depth:決策樹的最大深度。默認值為None,表示不限制最大深度。增加最大深度有助于更好地擬合訓練數(shù)據(jù),但可能導致過擬合。
- random_state:用于設(shè)置隨機數(shù)生成器的種子。默認值為None,表示使用隨機數(shù)生成器。
- ccp_alpha:用于控制正則化強度的參數(shù)。默認值為None,表示不進行正則化。
- max_samples:用于控制每個節(jié)點最少需要多少樣本才能進行分裂。默認值為None,表示使用整個數(shù)據(jù)集。
- min_samples_split:用于控制每個節(jié)點最少需要多少樣本才能進行分裂。默認值為2,表示每個節(jié)點至少需要2個樣本才能進行分裂。
- min_samples_leaf:用于控制每個葉子節(jié)點最少需要多少樣本才能停止分裂。默認值為1,表示每個葉子節(jié)點至少需要1個樣本才能停止分裂。
- min_weight_fraction_leaf:用于控制每個葉子節(jié)點最少需要多少樣本的權(quán)重才能停止分裂。默認值為0.0,表示每個葉子節(jié)點至少需要0個樣本的權(quán)重才能停止分裂。
- max_features:用于控制每個節(jié)點最多需要考慮多少個特征進行分裂。默認值為None,表示使用所有特征。
- max_leaf_nodes:用于控制決策樹最多有多少個葉子節(jié)點。默認值為None,表示不限制葉子節(jié)點的數(shù)量。
- min_impurity_decrease:用于控制每個節(jié)點最少需要減少多少不純度才能進行分裂。默認值為0.0,表示每個節(jié)點至少需要減少0個不純度才能進行分裂。
- min_impurity_split:用于控制每個葉子節(jié)點最少需要減少多少不純度才能停止分裂。默認值為None,表示使用min_impurity_decrease參數(shù)。
- class_weight:用于設(shè)置類別權(quán)重的字典或方法。默認值為None,表示使用均勻權(quán)重。
最后驗證模型的訓練效果:
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("復相關(guān)系數(shù):{}".format(r2))
print("中位數(shù)絕對誤差:{}".format(m_error))
# 運行結(jié)果
均方誤差:0.5973573097746598
復相關(guān)系數(shù):0.5153160857515913
中位數(shù)絕對誤差:0.5496418600646286
從預測的誤差來看,訓練的效果還不錯。
這里用DecisionTreeRegressor訓練模型時使用了參數(shù)max_depth=2,
我從max_depth=1逐個嘗試到了max_depth=10,發(fā)現(xiàn)max_depth=2時誤差最小。
4. 總結(jié)
決策樹回歸具有直觀、易于理解、易于實現(xiàn)等優(yōu)點。
生成的決策樹可以直觀地展示出輸入特征與輸出結(jié)果之間的關(guān)系,因此對于非專業(yè)人士來說也易于理解。
此外,決策樹回歸算法相對簡單,易于實現(xiàn),且對數(shù)據(jù)的預處理要求較低。
然而,決策樹回歸也存在一些缺點。
首先,它容易過擬合訓練數(shù)據(jù),特別是當訓練數(shù)據(jù)量較小時;
其次,決策樹的性能受劃分標準選擇的影響較大,不同的劃分標準可能會導致生成的決策樹性能差異較大;
此外,決策樹回歸在處理大規(guī)模數(shù)據(jù)時可能會比較耗時,因為需要遍歷整個數(shù)據(jù)集進行訓練和預測。
總結(jié)
以上是生活随笔為你收集整理的【scikit-learn基础】--『监督学习』之 决策树回归的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 5 款开源热搜项目「GitHub 热点速
- 下一篇: 实现一个事件总线