獨家 | 使用Python了解分類決策樹(附代碼)

2021-02-19 數據派THU

作者:Michael Galarnyk

翻譯:李潤嘉

校對:和中華

本文約3600字,建議閱讀15分鐘。

本教程介紹了用於分類的決策樹,即分類樹,包括分類樹的結構,分類樹如何進行預測,使用scikit-learn構造分類樹,以及超參數的調整。

由於各種原因,決策樹一種流行的監督學習方法。決策樹的優點包括,它既可以用於回歸,也可用於分類,易於解釋並且不需要特徵縮放。它也有一些缺點,比如容易過擬合。本教程介紹了用於分類的決策樹,也被稱為分類樹。與往常一樣,本教程中用到的代碼可以在我的github(結構,預測)中找到,我們開始吧!分類和回歸樹(CART)是由Leo Breiman引入的,用一種於解決分類或回歸預測建模問題的決策樹算法。本文只介紹分類樹。從本質上講,分類樹將分類轉化為一系列問題。下圖是在IRIS數據集(花卉種類)上訓練的一個分類樹。根節點(棕色)和決策節點(藍色)中包含了用於分裂子節點的問題。根節點即為最頂端的決策節點。換句話說,它就是你遍歷分類樹的起點。葉子節點(綠色),也叫做終端節點,它們不再分裂成更多節點。在葉節點處,通過多數投票決定分類。

將三個花卉品種(IRIS數據集)一一進行分類的分類樹

使用分類樹,要從根節點(棕色)開始,逐層遍歷整棵樹,直到到達葉節點(終端節點)。如下圖所示的分類樹,假設你有一朵花瓣長度為4.5cm的花,想對它進行分類。首先從根節點開始,先回答「花瓣長度(單位:cm)≤ 2.45嗎?」因為寬度大於2.45,所以回答否。然後進入下一個決策節點,回答「花瓣長度(單位:cm)≤ 4.95嗎?」。答案為是,所以你可以預測這朵花的品種為變色鳶尾(versicolor)。這就是一個簡單的例子。

分類樹從數據中學到了一系列「如果…那麼…」的問題,其中每個問題都涉及到一個特徵和一個分割節點。從下圖的局部樹(A)可看出,問題「花瓣長度(單位:cm)≤ 2.45」將數據基於某個值(本例中為2.45)分成兩個部分。這個數值叫做分割點。對分割點而言,一個好的值(使得信息增益最大)可將類與類之間分離開。觀察下圖中的B部分可知,位於分割點左側的所有點都被歸為山鳶尾類(setosa),右側的所有點則被歸為變色鳶尾類(versicolor)。

從圖中可看出,山鳶尾類(setosa)中所有的38個點都已被正確分類。它是一個純節點。分類樹在純節點上不會分裂。它不再產生信息增益。但是不純節點可以進一步分裂。觀察圖B的右側可知,許多點被錯誤歸類到了變色鳶尾類(versicolor)。換而言之,它包含了分屬於兩個不同類(setosa和versicolor)的點。分類樹是個貪婪算法,這意味著它會默認一直分裂直到得到純節點。而且,該算法會為不純節點選擇最佳分割點(我們會在下節介紹數學方法)。

在上圖中,樹的最大深度為2。樹的深度是對一棵樹在進行預測之前可分裂次數的度量。樹可進行多次分裂,直到樹的純度越來越高。多次重複此過程,會導致樹的深度越來越大,節點越來越多。這會引起對訓練數據的過擬合。幸運的是, 大多數分類樹的實現都允許控制樹的最大深度,從而減少過擬合。換而言之,可以通過設置決策樹的最大深度從而阻止樹的生長超過某個特定深度。可通過下圖直觀地了解最大深度。

本節解答了信息增益、基尼指數和熵是如何計算出來的。
在本節,你可以了解到什麼是分類樹中根節點/決策節點的最佳分割點。決策樹在某個特徵和相對應的分割點上進行分裂,從而根據給定的準則(本例中為基尼指數或熵)產生最大的信息增益(IG)。可以將信息增益簡單定義為:IG = 分裂前的信息(父) – 分裂後的信息(子)

因為分類樹是二元分裂,上述公式可以簡化為以下公式。

為了更好的理解這些公式,下圖展示了如何使用基尼指數準則計算決策樹的信息增益。

我不打算對細節進行過多的闡述,但是你應當知道,不同的不純度度量(基尼指數和熵)通常會產生相似的結果。下圖就展示了基尼指數和熵是極其相似的不純度度量。我猜測,基尼指數之所以是scikit-learn的默認值,是因為熵的計算過程略慢一些(因為它使用了對數)。

不同的不純度度量(基尼指數和熵)通常會產生相似的結果。感謝Data Science StackExchange 和 Sebastian Raschka為本圖提供的靈感。

在結束本節之前,我應註明,各種決策樹算法彼此不同。比較流行的算法有ID3,C4.5和CART。Scikit-learn使用了CART算法的優化版本。你可以點擊此處了解它的時間複雜度。我們在上節介紹了分類樹的理論。之所以需要學習如何使用某個程式語言來實現決策樹,是因為處理數據可以幫助我們來理解算法。Iris數據集是scikit-learn自帶的數據集之一,不需要從外部網站下載。通過下列代碼載入數據。

import pandas as pd

from sklearn.datasets import load_iris

data = 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中,所有的機器學習模型都被封裝為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 observation

clf.predict(X_test.iloc[0].values.reshape(1, -1))

# Predict for multiple observations

clf.predict(X_test[0:10])

儘管有許多評估模型性能的方式(精度,召回率,F1得分,ROC曲線等),我們還是保持簡單的基調,使用準確率作為評估的標準。準確率的定義為:(正確預測的比例):正確預測的數量/總數據量

# The score method returns the accuracy of the model

score = 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)等。分類樹的優點之一是,它們相對易於解釋。基於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)

 

在上述例子中(iris的某個特定的訓練集測試集劃分),花瓣寬度的特徵重要性權重最高。我們可以通過察看相應的決策樹來確認。
這個決策樹僅基於兩個特徵進行分裂,分別是花瓣寬度(單位:cm)和花瓣長度(單位:cm)請注意,如果一個特徵的重要性分值較低,也並不意味著這個特徵對預測而言不重要,只是說明在樹的較早階段,它未被選擇到。該特徵也可能與另一個信息量較高的特徵完全相同或高度相關。特徵重要性值不能說明它們對哪個類別具有很好的預測性,也不會說明可能影響預測的特徵之間的關係。要注意的是,在進行交叉驗證或類似的驗證時,可以使用來自不同訓練集測試集劃分的特徵重要性值的平均值。雖然這篇文章只介紹了用於分類的決策樹,但請隨意閱讀我的其他文章用於回歸的決策樹(Python)》。分類和回歸樹(CART)是一個相對較老的技術(1984),是更複雜的技術的基礎。決策樹的主要缺點之一是它們通常不是最準確的算法。部分原因是決策樹是一種高方差算法,這意味著訓練數據中的不同劃分會導致非常不同的樹。如果您對本教程有任何疑問或想法,請隨時通過以下評論或通過Twitter與我們聯繫。Michael Galarnyk是一名數據科學家和企業培訓師。他目前在Scripps翻譯研究所工作。

您可以在:

Twitter(https://twitter.com/GalarnykMichael)Medium(https://medium.com/@GalarnykMichael)GitHub(https://github.com/mGalarnyk)上找到他。

 

原文標題:

Understanding Decision Trees for Classification in Python

原文連結:

https://www.kdnuggets.com/2019/08/understanding-decision-trees-classification-python.htm

編輯:於騰凱

校對:林亦霖

李潤嘉,首都師範大學應用統計碩士在讀。對數據科學和機器學習興趣濃厚,語言學習愛好者。立志做一個有趣的人,學想學的知識,去想去的地方,敢想敢做,不枉歲月。

工作內容:需要一顆細緻的心,將選取好的外文文章翻譯成流暢的中文。如果你是數據科學/統計學/計算機類的留學生,或在海外從事相關工作,或對自己外語水平有信心的朋友歡迎加入翻譯小組。

你能得到:定期的翻譯培訓提高志願者的翻譯水平,提高對於數據科學前沿的認知,海外的朋友可以和國內技術應用發展保持聯繫,THU數據派產學研的背景為志願者帶來好的發展機遇。

其他福利:來自於名企的數據科學工作者,北大清華以及海外等名校學生他們都將成為你在翻譯小組的夥伴。

點擊文末「閱讀原文」加入數據派團隊~

轉載須知

如需轉載,請在開篇顯著位置註明作者和出處(轉自:數據派ID:datapi),並在文章結尾放置數據派醒目二維碼。有原創標識文章,請發送【文章名稱-待授權公眾號名稱及ID】至聯繫郵箱,申請白名單授權並按要求編輯。

發布後請將連結反饋至聯繫郵箱(見下方)。未經許可的轉載以及改編者,我們將依法追究其法律責任。

點擊「閱讀原文」擁抱組織

相關焦點

  • Scikit-Learn決策樹算法類庫使用小結
    scikit-learn決策樹算法類庫內部實現是使用了調優過的CART樹算法,既可以做分類,又可以做回歸。
  • 獨家 | 一文讀懂隨機森林的解釋和實現(附python代碼)
    雖然沒必要了解所有細節,但了解某個機器學習模型大致是如何工作的仍然有幫助。這使得我們可以在模型表現不佳時進行診斷,或者解釋模型是如何做決策的,這一點至關重要,尤其當我們想要說服別人相信我們的模型時。  在本文中,我們將介紹如何在Python中構建和使用隨機森林(Random Forest)。除了查看代碼之外,我們還將嘗試了解此模型的工作原理。
  • 文本分類實戰--從TFIDF到深度學習CNN系列效果對比(附代碼)
    ,其中涉及CHI選擇特徵詞,TFIDF計算權重,樸素貝葉斯、決策樹、SVM、XGBoost等算法,實現傳統的文本分類並取得了不錯的效果。了解完數據集,接下來我們開始進行文本分類,開始提交結果。2, 樸素貝葉斯分類法在這裡插句題外話,往往這種競賽大家喜歡一上來什麼都不做先提交一個結果站站場面==也就是提交一個隨機結果、均值等。
  • Python+sklearn決策樹算法使用入門
    決策樹屬於有監督學習算法,需要根據已知樣本來訓練並得到一個可以工作的模型,然後再使用該模型對未知樣本進行分類。在決策樹算法中,構造一棵完整的樹並用來分類的計算量和空間複雜度都非常高,可以採用剪枝算法在保證模型性能的前提下刪除不必要的分支。
  • 獨家 | 決策樹VS隨機森林——應該使用哪種算法?(附代碼&連結)
    決策樹簡介隨機森林概覽隨機森林和決策樹的衝突(代碼)為什麼隨機森林優於決策樹?決策樹vs隨機森林——你應該在何時選擇何種算法?決策樹是一種有監督的機器學習算法,該方法可以用於解決分類和回歸問題。決策樹可以簡單地理解為達到某一特定結果的一系列決策。這裡是一幅決策樹的闡述圖(使用我們上面的案例):
  • 【每天學點應用軟體]決策樹的python實現方法
  • 隨機森林的原理及Python代碼實現
    在對預測輸出進行結合時,Bagging通常對分類任務使用簡單投票法,對回歸任務使用簡單平均法。隨機森林是Bagging的一個擴展。隨機森林在以決策樹為基學習器構建Bagging集成的基礎上,進一步在決策樹的訓練過程中引入了隨機屬性選擇(即引入隨機特徵選擇)。
  • python分類-決策樹
    嘿嘿,這禮拜隨便研究了個入門的知識點,python決策樹。這次學會的只是一個入門級別的python決策樹案例,還是給大家分享下吧。
  • 獨家 | 機器學習中的四種分類任務(附代碼)
    分別是二分類、多類別分類、多標籤分類、不平衡分類,並提供了實戰代碼。 標籤:機器學習機器學習是一個研究領域,其涉及到從示例中學習的算法。分類是一項需要使用機器學習算法去學習如何根據問題域為示例分配類標籤的任務。一個簡單易懂的例子是將電子郵件分為「垃圾郵件」或「非垃圾郵件」。在機器學習中,你可能會遇到許多不同類型的分類任務,並且每種模型都會使用專門的建模方法。
  • 【乾貨】Python機器學習機器學習項目實戰3——模型解釋與結果分析(附代碼)
    第二部分【2】討論了不同機器學習模型的比較,使用了交叉驗證進行隨機搜索的超參數優化,並對模型進行了評估。項目的所有代碼都在Github【3】上。對應的Jupyter文本連結可跳轉查看【4】,希望大家能夠分享、使用和構建這一系列代碼。注意,我們正在研究的是一個有監督的機器學習回歸問題。利用紐約市建築能源數據【5】,構建了一個模型,預測建築物的能源星級得分。
  • 決策樹算法——選擇困難症的「良藥」
    實際上,在人工智慧領域,就有一種預測算法,利用樹杈的形狀,非常形象地來解決這種選擇問題,這就是決策樹算法,它是一個非常廣泛應用的算法,其原理是通過對一系列問題進行「是/否」的推導,最終實現決策。在機器學習發展到如今,決策樹算法越來越得到更多的應用,我們也可以說它是解決「選擇困難症」的良藥。本文為了讓讀者朋友較好理解該算法,用python編程進行一個實際應用的示範。
  • Tensorflow實戰系列:手把手教你使用LSTM進行文本分類(附完整代碼)
    本教程旨在手把手教大家使用Tensorflow構建LSTM進行文本分類。教程使用了偽造的文本數據進行情感分類,有正面情感數據和負面情感數據。並且教程代碼包含了配置信息,將數據處理為LSTM的輸入格式,以及定義和訓練相關代碼,因此希望在日常項目中使用Tensorflow的朋友可以參考這篇教程。
  • 機器學習算法基礎(使用Python代碼)
    決策樹是一種監督學習算法,主要用於分類問題。讓人驚喜的是,它適用於分類因變量和連續因變量。在該算法中,我們將總體分成兩個或更多個同類集。這是基於最重要的屬性/獨立變量來完成的,以儘可能地形成不同的群體。在上圖中,您可以看到人群根據多個屬性分為四個不同的群體,以識別「他們是否會出去玩」。
  • 以鳶尾花數據集為例,用Python對決策樹進行分類
    幸運的是,實現大多數分類樹支持預剪枝來控制樹的最大深度,從而減少過度擬合。例如,Python的scikit-learn就支持預剪枝。換句話說,你可以設置最大深度以防止決策樹過深。為直觀了解最大深度,可以查看下圖。鳶尾花數據集適合的不同深度分類樹。
  • Python簡化代碼機器學習庫PyCaret 2.0發布
    我們強烈建議使用虛擬環境,以避免和其他庫的潛在衝突。點擊這裡 Click here 了解PyCaret更多的預處理能力。, target = 'name-of-target')# 訓練一個決策樹模型dt = create_model('dt')# 調優決策樹的一個超參數tuned_dt = tune_model(dt)#
  • 獨家|使用Python進行機器學習的假設檢驗(附連結&代碼)
    我把所有這些概念放在一起,並使用python進行示例。什麼是假設檢驗?我們為什麼用它?什麼是假設的基本條件?什麼是假設檢驗的重要參數?假設檢驗是一種統計方法,用於使用實驗數據進行統計決策。假設檢驗基本上是我們對人口參數做出的假設。
  • Stacking 模型融合詳解(附python代碼)
    Stacking 的基本思想  將個體學習器結合在一起的時候使用的方法叫做結合策略。對於分類問題,我們可以使用投票法來選擇輸出最多的類。對於回歸問題,我們可以將分類器輸出的結果求平均值。然後我們看一段stacking的代碼:
  • 文本分類的14種算法
    3)集成學習是指通過將多個弱分類器的分類結果進行整合,獲得比單個弱分類器更好效果的機器學習方法。集成學習和深度學習屬於機器學習。2.集成學習的bagging和boosting思想:bagging中的各個弱分類器取值是相互獨立的、無關的,常使用有放回抽樣實現。
  • 通過Python在Excel中使用機器學習
    本文將演示如何在Excel中利用Python構建的機器學習模型對動物進行分類。本文所使用的所有代碼和數據都可以通過名為pyxll-examples的github倉庫獲取,連結:https://github.com/pyxll/pyxll-examples/tree/master/machine-learning 。
  • 從零開始實現穿衣圖像分割完整教程(附python代碼演練)
    我們使用 OpenCV 提供的 GrubCut 算法。 該算法利用高斯混合模型分離前景和背景。 通過它可以幫助我們找到圖像中的人物。我們只實現了簡單的功能。 假設感興趣的人站在圖像的中間。python def cut(img): img = cv.resize(img,(224,224)) ¨K5K