理解CART決策樹

CART算法html

原理

CART全稱爲Classification and Regression Tree。node

迴歸樹

相比ID3,CART遍歷全部的特徵和特徵值,而後使用二元切分法劃分數據子集,也就是每一個節點都只會分裂2個分支。接着計算數據子集的總方差來度量數據子集的混亂程度,總方差越小數據子集越純,最後選擇總方差最小的劃分方式對應的特徵和特徵值,而二元切分的依據就是將小於等於這個特徵值和大於這個特徵值的數據劃分爲兩塊。這裏說的總方差通常就是經過數據子集的樣本輸出值的均方差 * 數據子集的樣本個數來計算。最後的輸出結果是取各葉子節點數據的中位數或均值。python

分類樹

相比ID3,CART通常選擇基尼不純度來代替信息增益的方式度量數據子集的不純度。基尼不純度越小,數據純度越高。相比迴歸樹,分類樹對於離散或者連續特徵的處理都是採用二元切分的方式,可是在數據子集的混亂程度的計算上,是用基尼不純度替代總方差的方式。git

基尼不純度的定義:從一個數據集中隨機選取子項,度量其被錯誤的劃分到其餘組裏的機率。github

先不着急理解這句話,先看下面對基尼不純度的表達式的解釋。算法

  • 假設一個數據集中有K個類別,第k個類別的機率爲p_k, 則基尼係數的表達式爲:

    上面的公式中,p_k表示第k個類別出現的機率,那麼1-p_k顯然就是當前數據集中,除了第k個類別之外的其餘全部類別出現的機率,因此二者相乘就是當前數據集中,第k個類別和其餘全部類別都出現的機率,這個機率越高,數據集越不純。
    如今再看上面的定義,應該就好理解了吧。
  • 對於個給定的樣本D,假設有K個類別, 第k個類別的數量爲CkCk,則樣本D的基尼係數表達式爲:
  • 對於樣本D,若是根據特徵A的某個值a,把D分紅D1和D2兩部分,則在特徵A的條件下,D的基尼係數表達式爲:

算法庫調用

在scikit-learn庫中的決策樹算法是使用了調優過的CART算法,既能夠作分類,又能夠作迴歸。windows

代碼

分類樹對應DecisionTreeClassifier,迴歸樹對應DecisionTreeRegressor。代碼示例和參數說明以下:dom

from sklearn.tree import DecisionTreeClassifier
clf_dt = DecisionTreeClassifier()
clf_dt.fit(train_X, train_y)
predictions_dt = clf_dt.predict(test_X)[:,None]

參數

參數 DecisionTreeClassifier DecisionTreeRegressor
criterion 特徵選擇標準。可使用"gini"或者"entropy",前者表明基尼係數,後者表明信息增益。通常說使用默認的基尼係數"gini"就能夠了,即CART算法。除非你更喜歡相似ID3, C4.5的最優特徵選擇方法。  可使用"mse"或者"mae",前者是均方差,後者是和均值之差的絕對值之和。推薦使用默認的"mse"。通常來講"mse"比"mae"更加精確。除非你想比較二個參數的效果的不一樣之處。
splitter 特徵劃分點選擇標準。可使用"best"或者"random"。前者在特徵的全部劃分點中找出最優的劃分點。後者是隨機的在部分劃分點中找局部最優的劃分點。默認的"best"適合樣本量不大的時候,而若是樣本數據量很是大,此時決策樹構建推薦"random"  同左。
max_features 劃分時考慮的最大特徵數。 可使用不少種類型的值,默認是"None",意味着劃分時考慮全部的特徵數;若是是"log2"意味着劃分時最多考慮log2Nlog2N個特徵;若是是"sqrt"或者"auto"意味着劃分時最多考慮N−−√N個特徵。若是是整數,表明考慮的特徵絕對數。若是是浮點數,表明考慮特徵百分比,即考慮(百分比xN)取整後的特徵數。其中N爲樣本總特徵數。通常來講,若是樣本特徵數很少,好比小於50,咱們用默認的"None"就能夠了,若是特徵數很是多,咱們能夠靈活使用剛纔描述的其餘取值來控制劃分時考慮的最大特徵數,以控制決策樹的生成時間。 同左。
max_depth  決策樹的最大深度。默承認以不輸入,若是不輸入的話,決策樹在創建子樹的時候不會限制子樹的深度。通常來講,數據少或者特徵少的時候能夠無論這個值。若是模型樣本量多,特徵也多的狀況下,推薦限制這個最大深度,具體的取值取決於數據的分佈。經常使用的能夠取值10-100之間。 同左。
min_samples_split 內部節點再劃分所需最小樣本數。這個值限制了子樹繼續劃分的條件,若是某節點的樣本數少於min_samples_split,則不會繼續再嘗試選擇最優特徵來進行劃分。 默認是2.若是樣本量不大,不須要管這個值。若是樣本量數量級很是大,則推薦增大這個值。我以前的一個項目例子,有大概10萬樣本,創建決策樹時,我選擇了min_samples_split=10。能夠做爲參考。 同左。
min_samples_leaf 葉子節點最少樣本數。 這個值限制了葉子節點最少的樣本數,若是某葉子節點數目小於樣本數,則會和兄弟節點一塊兒被剪枝。 默認是1,能夠輸入最少的樣本數的整數,或者最少樣本數佔樣本總數的百分比。若是樣本量不大,不須要管這個值。若是樣本量數量級很是大,則推薦增大這個值。以前的10萬樣本項目使用min_samples_leaf的值爲5,僅供參考。
min_weight_fraction_leaf 葉子節點最小的樣本權重和。這個值限制了葉子節點全部樣本權重和的最小值,若是小於這個值,則會和兄弟節點一塊兒被剪枝。 默認是0,就是不考慮權重問題。通常來講,若是咱們有較多樣本有缺失值,或者分類樹樣本的分佈類別誤差很大,就會引入樣本權重,這時咱們就要注意這個值了。 同左。
max_leaf_nodes 最大葉子節點數。經過限制最大葉子節點數,能夠防止過擬合,默認是"None」,即不限制最大的葉子節點數。若是加了限制,算法會創建在最大葉子節點數內最優的決策樹。若是特徵很少,能夠不考慮這個值,可是若是特徵分紅多的話,能夠加以限制,具體的值能夠經過交叉驗證獲得。 同左。
class_weight 指定樣本各種別的的權重,主要是爲了防止訓練集某些類別的樣本過多,致使訓練的決策樹過於偏向這些類別。這裏能夠本身指定各個樣本的權重,或者用「balanced」,若是使用「balanced」,則算法會本身計算權重,樣本量少的類別所對應的樣本權重會高。固然,若是你的樣本類別分佈沒有明顯的偏倚,則能夠無論這個參數,選擇默認的"None" 不適用於迴歸樹。
min_impurity_split 節點劃分最小不純度。這個值限制了決策樹的增加,若是某節點的不純度(基尼係數,信息增益,均方差,絕對差)小於這個閾值,則該節點再也不生成子節點。即爲葉子節點 。 同左。
presort 數據是否預排序。這個值是布爾值,默認是False不排序。通常來講,若是樣本量少或者限制了一個深度很小的決策樹,設置爲true可讓劃分點選擇更加快,決策樹創建的更加快。若是樣本量太大的話,反而沒有什麼好處。問題是樣本量少的時候,我速度原本就不慢。因此這個值通常懶得理它就能夠了。 同左。

決策樹可視化

安裝graphviz

可視化須要先安裝graphviz,這是一個開源的圖形可視化軟件,官網:https://graphviz.gitlab.io,下載適合本身操做系統的文件便可。gitlab

若是是windows操做系統,能夠點此下載安裝包。安裝完成記得設置一下環境變量將 xxx/Graphviz2.38/bin/加入PATH操作系統

安裝python插件:

pip install graphviz
pip install pydotplus

代碼示例

from sklearn.datasets import load_iris
from sklearn import tree
import pydotplus
import os
# 若是執行程序老是找不到Graphviz命令,能夠加入下面這行代碼,注意修改路徑爲你的正確的Graphviz/bin目錄的路徑
os.environ["PATH"] += os.pathsep + 'H:/program_files/Graphviz2.38/bin'
# 訓練模型
iris = load_iris()
clf = tree.DecisionTreeClassifier()
clf = clf.fit(iris.data, iris.target)
# 用pydotplus生成iris.pdf
dot_data = tree.export_graphviz(clf, out_file=None,
                                feature_names=iris.feature_names,
                                class_names=iris.target_names,
                                filled=True, rounded=True,
                                special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data)
graph.write_pdf("iris.pdf")

查看pdf文件

參考資料

http://www.javashuo.com/article/p-eurjgjkq-cg.html

http://www.javashuo.com/article/p-zbtuyagj-eq.html

https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/tree/_tree.pyx

ok,本篇就這麼多內容啦~,感謝閱讀O(∩_∩)O。

相關文章
相關標籤/搜索