決策樹算法測試代碼 決策樹代碼實現( 二 )


為了更好的領會那些公式,下圖展現了怎樣運用基尼指數規則計劃計劃樹的消息增值 。
下圖展現了怎樣運用熵來計劃計劃樹的消息增值 。
【決策樹算法測試代碼決策樹代碼實現】我不安排對詳細舉行過多的闡明,然而你該當領會,各別的不純度襟懷(基尼指數和熵)常常會爆發一致的截止 。下圖就展現了基尼指數和熵是極端一致的不純度襟懷 。我探求,基尼指數之以是是scikit-learn的默許值,是由于熵的計劃進程略慢少許(由于它運用了對數) 。
各別的不純度襟懷(基尼指數和熵)常常會爆發一致的截止 。感動Data Science StackExchange 和 Sebastian Raschka為本圖供給的靈感 。
在中斷本節之前,我應證明,百般計劃樹算法相互各別 。比擬時髦的算法有ID3,C4.5和CART 。Scikit-learn運用了CART算法的優化本子 。你不妨點擊此處領會它的功夫攙雜度 。
運用Python實行分門別類樹
咱們在上節引見了分門別類樹的表面 。之以是須要進修怎樣運用某個編制程序談話來實行計劃樹,是由于處置數據不妨扶助咱們來領會算法 。
加載數據
Iris數據集是scikit-learn自帶的數據集之一,不須要從外部網站載入 。經過下列代碼載入數據 。
import pandas as pdfrom sklearn.datasets import load_irisdata = https://www.juguize.com/b/load_iris()df = pd.DataFrame(data.data, columns=data.feature_names)df['target'] = data.target原始Pandas df(特性和目的)
將數據分別為演練集和嘗試集
下述代碼將75%的數據分別到為演練集,25%的數據分別到嘗試匯合 。
X_train, X_test, Y_train, Y_test = train_test_split(df[data.feature_names], df['target'], random_state=0)圖中的臉色標明了數據框df中的數據分別到了哪類(X_train, X_test, Y_train, Y_test)變量
提防,計劃樹的便宜之一是,你不須要規范化你的數據,這與PCA和論理回歸各別,沒有規范化的數據對它們的感化特殊大 。
Scikit-learn建立模型的四個辦法
之一步:導出你想運用的模子
在scikit-learn中,一切的呆板進修模子都被封裝為Python中的類 。
from sklearn.tree import DecisionTreeClassifier第二步:結構模子的范例
鄙人列代碼中,我經過設定max_depth=2來預剪枝我的樹,進而保證它的深度不會勝過2 。請提防,這個教程的下一節將引見怎樣為你的樹采用適合的max_depth值 。
還需提防,鄙人列代碼中,我設定random_state=0,以是你也不妨獲得和我一律的截止 。
clf = DecisionTreeClassifier(max_depth = 2, random_state = 0)第三步:鑒于數據演練模子
該模子將進修X (sepal length, sepal width, petal length, and petal width) 和 Y(species of iris)之間的聯系 。
clf.fit(X_train, Y_train)第四步:猜測未知(嘗試)數據的標簽
# Predict for 1 observationclf.predict(X_test.iloc[0].values.reshape(1, -1))# Predict for multiple observationsclf.predict(X_test[0:10])請記取,猜測不過葉節點中范例的普遍類 。
評價模子本能
縱然有很多評價模子本能的辦法(精度,調回率,F1得分,ROC弧線等),咱們仍舊維持大略的基調,運用精確率動作評價的規范 。
精確率的設置為:(精確猜測的比率):精確猜測的數目/總額據量
# The score method returns the accuracy of the modelscore = clf.score(X_test, Y_test)print(score)安排樹的深度
探求max_depth更優值的進程即是安排模子的進程 。下列代碼輸入了各別max_depth值所對應的計劃樹的精確率 。
# List of values to try for max_depth:max_depth_range = list(range(1, 6))# List to store the accuracy for each value of max_depth:accuracy = []for depth in max_depth_range:clf = DecisionTreeClassifier(max_depth = depth, random_state = 0)clf.fit(X_train, Y_train) score = clf.score(X_test, Y_test) accuracy.append(score)由下圖可看出,當max_depth的值大于或即是3時,模子的精確率更高,以是采用max_depth=3,在精確率同樣高的情景下,模子的攙雜度更低 。
采用max_depth=3由于此時模子的透徹率高且攙雜度較低 。
你須要牢記,max_depth和計劃樹的深度并不是一回事 。Max_depth是對計劃樹舉行預剪枝的一個本領 。換而言之,即使一棵樹在某個深度純度仍舊充滿高,將會遏止分割 。下圖辨別展現了當max_depth的值為3,4,5時的計劃樹 。由下圖可知,max_depth為4和5時的計劃樹是如出一轍的 。它們的深度溝通 。
請查看咱們是怎樣獲得兩棵如出一轍的樹
即使想領會你演練的計劃樹的深度是幾何,不妨運用get_depth本領 。除此除外,不妨經過get_n_leaves本領獲得葉子節點的數目 。
縱然本教程仍舊引見了少許采用規則(基尼指數,熵等)和樹的max_depth,請記取你也不妨安排要分割的節點的最小樣品(min_samples_leaf),更大葉子節點數目(max_leaf_nodes)等 。

推薦閱讀