文章插圖

文章插圖
本教程介紹了用于分類的決策樹,即分類樹,包括分類樹的結構,分類樹如何進行預測,使用scikit-learn構造分類樹,以及超參數的調整 。
由于各種原因,決策樹一種流行的監督學習方法 。決策樹的優點包括,它既可以用于回歸,也可用于分類,易于解釋并且不需要特征縮放 。它也有一些缺點,比如容易過擬合 。本教程介紹了用于分類的決策樹,也被稱為分類樹 。
除此之外,本教程還將涵蓋:
分類樹的結構(樹的深度,根節點,決策節點,葉節點/終端節點)分類樹如何進行預測如何通過Python中的scikit-learn構造決策樹超參數調整
與往常一樣,本教程中用到的代碼可以在我的github(結構,預測)中找到,我們開始吧!
什么是分類樹?
分類和回歸樹(CART)是由Leo Breiman引入的,用一種于解決分類或回歸預測建模問題的決策樹算法 。本文只介紹分類樹 。
分類樹
從本質上講,分類樹將分類轉化為一系列問題 。下圖是在IRIS數據集(花卉種類)上訓練的一個分類樹 。根節點(棕色)和決策節點(藍色)中包含了用于分裂子節點的問題 。根節點即為最頂端的決策節點 。換句話說,它就是你遍歷分類樹的起點 。葉子節點(綠色),也叫做終端節點,它們不再分裂成更多節點 。在葉節點處,通過多數投票決定分類 。
如何使用分類樹
使用分類樹,要從根節點(棕色)開始,逐層遍歷整棵樹,直到到達葉節點(終端節點) 。如下圖所示的分類樹,假設你有一朵花瓣長度為4.5cm的花,想對它進行分類 。首先從根節點開始,先回答“花瓣長度(單位:cm)≤ 2.45嗎?”因為寬度大于2.45,所以回答否 。然后進入下一個決策節點,回答“花瓣長度(單位:cm)≤ 4.95嗎?” 。答案為是,所以你可以預測這朵花的品種為變色鳶尾(versicolor) 。這就是一個簡單的例子 。
分類樹從數據中學到了一系列“如果…那么…”的問題,其中每個問題都涉及到一個特征和一個分割節點 。從下圖的局部樹(A)可看出,問題“花瓣長度(單位:cm)≤ 2.45”將數據基于某個值(本例中為2.45)分成兩個部分 。這個數值叫做分割點 。對分割點而言,一個好的值(使得信息增益最大)可將類與類之間分離開 。觀察下圖中的B部分可知,位于分割點左側的所有點都被歸為山鳶尾類(setosa),右側的所有點則被歸為變色鳶尾類(versicolor) 。
在本節,你可以了解到什么是分類樹中根節點/決策節點的最佳分割點 。決策樹在某個特征和相對應的分割點上進行分裂,從而根據給定的準則(本例中為基尼指數或熵)產生最大的信息增益(IG) ??梢詫⑿畔⒃鲆婧唵味x為:
IG = 分裂前的信息(父) – 分裂后的信息(子)
通過下圖的決策樹,我們可以更清晰的理解父與子 。
在結束本節之前,我應注明,各種決策樹算法彼此不同 。比較流行的算法有ID3,C4.5和CART 。Scikit-learn使用了CART算法的優化版本 。你可以點擊此處了解它的時間復雜度 。
使用Python實現分類樹
我們在上節介紹了分類樹的理論 。之所以需要學習如何使用某個編程語言來實現決策樹,是因為處理數據可以幫助我們來理解算法 。
加載數據
Iris數據集是scikit-learn自帶的數據集之一,不需要從外部網站下載 。通過下列代碼載入數據 。
import pandas as pdfrom sklearn.datasets import load_irisdata = http://www.mnbkw.com/jxjc/167553/load_iris()df = pd.DataFrame(data.data, columns=data.feature_names)df['target'] = data.target
將數據劃分為訓練集和測試集
下述代碼將75%的數據劃分到為訓練集,25%的數據劃分到測試集合 。
X_train, X_test, Y_train, Y_test = train_test_split(df[data.feature_names], df['target'], random_state=0)
注意,決策樹的優點之一是,你不需要標準化你的數據,這與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和決策樹的深度并不是一回事 。Max_depth是對決策樹進行預剪枝的一個方法 。換而言之,如果一棵樹在某個深度純度已經足夠高,將會停止分裂 。下圖分別展示了當max_depth的值為3,4,5時的決策樹 。由下圖可知,max_depth為4和5時的決策樹是一模一樣的 。它們的深度相同 。
如果想知道你訓練的決策樹的深度是多少,可以使用get_depth方法 。除此之外,可以通過get_n_leaves方法得到葉子節點的數量 。
盡管本教程已經介紹了一些選擇準則(基尼指數,熵等)和樹的max_depth,請記住你也可以調整要分裂的節點的最小樣本(min_samples_leaf),最大葉子節點數量(max_leaf_nodes)等 。
特征重要性
分類樹的優點之一是,它們相對易于解釋 。基于scikit-learn的分類樹可以計算出特征的重要性,即在給定特征上分裂而導致基尼指數或熵減小的總量 。Scikit-learn對每個特征輸出一個0和1之間的數值 。所有特征的重要性之和為1 。下列代碼展示了在決策樹模型中每個特征的重要性 。
importances = pd.DataFrame({'feature':X_train.columns,'importance':np.round(clf.feature_importances_,3)})importances = importances.sort_values('importance',ascending=False)
【決策樹分類算法代碼 決策樹CSDN】請注意,如果一個特征的重要性分值較低,也并不意味著這個特征對預測而言不重要,只是說明在樹的較早階段,它未被選擇到 。該特征也可能與另一個信息量較高的特征完全相同或高度相關 。特征重要性值不能說明它們對哪個類別具有很好的預測性,也不會說明可能影響預測的特征之間的關系 。要注意的是,在進行交叉驗證或類似的驗證時,可以使用來自不同訓練集測試集劃分的特征重要性值的平均值 。
- ios數據加密的幾種方式 iOS加密算法
- rsa加密解密算法原理 rsa的加密和解密原理
- 垃圾分類 燈泡屬于什么垃圾
- 垃圾分類 牛奶盒屬于什么垃圾
- 垃圾分類 塑料瓶屬于什么垃圾
- 垃圾分類 頭發屬于什么垃圾
- 雅思聽力真題場景分類 雅思口語場景詞匯
- 英語四級單詞分類記憶 英語四級單詞怎么記
- 雅思寫作思路 雅思大作文話題分類
- 買東西時打折怎么個算法 買東西時打折怎么個算法
