本文中將決策樹模型、隨機森林和梯度提升樹分別應用于Iris數據集(詳見)對鳶尾花進行分類決策樹模型的應用特點,并展示如何簡潔地實現上述樹模型的訓練和預測。Iris數據集包含了150個樣本(三種鳶尾花各50個樣本)和4個特征(萼片長度、萼片寬度、花瓣長度、花瓣寬度)。關于樹模型在金融領域的應用詳見《機器學習在量化金融中的應用》一書第9章的金融案例研究。
01決策樹的實現
-Learn提供了實現決策樹分類器的?er()類。代碼列表1調用函數?t()訓練決策樹,并調用函數()在測試集上進行預測,最后輸出混淆矩陣和特征重要性。
代碼列表1 使用決策樹對Iris數據集進行分類
import?pandas as?pd
from?sklearn.datasets import?load_iris
from?sklearn.model_selection import?train_test_split
from?sklearn.tree import?DecisionTreeClassifier
#加載Iris數據集
iris=load_iris()
#劃分訓練集和測試集
X_train, X_test, y_train, y_test=train_test_split(iris.data, iris.target, test_size=0.33, random_state=0)
#構建決策樹分類器
clf_dt=DecisionTreeClassifier(max_depth=3, criterion='gini', random_state=0)
clf_dt=clf_dt.fit(X_train, y_train)
y_test_est=clf_dt.predict(X_test)
#輸出混淆矩陣
pd.crosstab(y_test, y_test_est, rownames=['Actual Species'], colnames=['Predicted Species'])
#查看特征重要性
print(clf_dt.feature_importances_)
(詳見)是一個開源的圖形可視化軟件。圖形可視化是表示結構信息的一種常用方法。如代碼列表2所示,可以方便地實現決策樹的可視化。相應的樹模型見圖1。
代碼列表2 使用可視化決策樹模型
#安裝Graphviz
pip install graphviz
#加載Graphviz
import?graphviz
from?sklearn import?tree
dot_data=tree.export_graphviz(clf_dt, out_file=None, feature_names=iris.feature_names, class_names=iris.target_names, filled=True, rounded=True, special_characters=True)
graph=graphviz.Source(dot_data)
graph.render("iris")
圖1 Iris數據集上擬合的決策樹模型
02隨機森林的實現
現在繼續將隨機森林應用于Iris數據集,使用?er()類實現隨機森林。這里需要指定森林中樹的數量(n )、樹的最大深度(max depth)和不純度指標()。在本例中,選擇n = 20, max depth = 3, ='gini', 如代碼列表3所示。
代碼列表3 使用隨機森林對 Iris數據集進行分類
import?numpy as?np
from?sklearn.ensemble import?RandomForestClassifier
#構建隨機森林
clf_rf=RandomForestClassifier(n_estimators=20, max_depth=3, criterion='gini', n_jobs=2,random_state=0)5clf_rf=clf_rf.fit(X_train, y_train)
y_test_est_rf=clf_rf.predict(X_test)
#輸出混淆矩陣
pd.crosstab(y_test, y_test_est_rf, rownames=['Actual Species'], colnames=['Pred icted Species'])
#查看特征重要性
print(clf_rf.feature_importances_)
03梯度提升樹的實現
與決策樹和隨機森林類似,使用si?er()類可以實現梯度提升樹。代碼列表4展示了使用梯度提升樹對Iris數據集進行分類。
代碼列表4 使用梯度提升樹對Iris數據集進行分類
from?sklearn.ensemble import?GradientBoostingClassifier
#構建梯度提升樹
clf_gbt=GradientBoostingClassifier(random_state=0)
clf_gbt.fit(X_train, y_train)
y_test_est_gbt=clf_rf.predict(X_test)
#輸出混淆矩陣
pd.crosstab(y_test, y_test_est_gbt, rownames=['ActualSpecies'], colnames=['Pred icted Species'])
#查看特征重要性
print(clf_gbt.feature_importances_)
04三種樹模型的比較
如圖2所示,在這個例子中,三種樹模型在測試集上的混淆矩陣相同。圖2(a)、圖2(c)和圖2(e)對應的是沒有歸一化的混淆矩陣,圖2(b)、圖2(d)和圖2(f)對應的是歸一化的混淆矩陣。但在使用其他數據集時三種樹模型的數值結果可能會有明顯的變化。
圖2 三種樹模型在Iris數據集上的混淆矩陣
接下來看看特征重要性。從表1和圖3中可以看到三種樹模型中最重要的特征都是花瓣寬度。在決策樹模型中花瓣寬度起著決定性的作用萼片長度和萼片寬度與預測無關。但是在隨機森林中花瓣長度和花瓣寬度幾乎一樣重要。隨機森林和梯度提升樹的萼片長度和萼片寬度并不是無關特征這可以理解為集成方法帶來的影響。
表1 三種樹模型在Iris數據集上的特征重要性
圖3 圖形化展示三種樹模型在Iris數據集上的特征重要性
本文節選自《機器學習在量化金融中的應用》
掃碼決策樹模型的應用特點,優惠購書