GraphViz可視化決策樹和隨機森林

構建決策樹


    決策樹能夠經過將特徵空間進行矩形劃分的方式來構建複雜的決策邊界。
node

    深度越大的決策樹,決策邊界也就越複雜,於是容易產生過擬合現象。
python

    Sklearn代碼爲:
算法

from sklearn.tree import DecisionTreeClassifierfrom sklearn.tree import export_graphvizfrom sklearn import datasets
iris = datasets.load_iris()X = iris.dataY = iris.targetfrom sklearn.model_selection import train_test_splitX_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=0.3)#建立基於信息熵的模型tree = DecisionTreeClassifier(criterion='entropy')tree.fit(X_train,Y_train)import graphvizgra_data= export_graphviz( tree, feature_names=['花萼長度','花萼寬度','花瓣長度','花瓣寬度'])#由於標籤是中文因此須要將參數設置成支持微軟雅黑的格式gra_data = gra_data.replace('helvetica','"Microsoft Yahei"')
grap = graphviz.Source(gra_data)grap.render('tree')

    

    DecisionTreeClassifier參數有:

  • criterion:決策樹啓發函數,默認gini(entropy, gini)bootstrap

  • splitter:默認爲best。best在特徵的全部劃分點中找出最優的劃分點,random隨機的在部分劃分點中找局部最優的劃分點。(best, random)

  • max_leaf_nodes:最大葉子節點數。默認爲None,(int, None)經過設置最大葉子節點數,能夠防止過擬合,默認狀況下是不設置最大葉子節點數。若是加了限制,算法會創建在最大葉子節點數內最優的決策樹。若是特徵很少,能夠不考慮這個值,可是若是特徵多,能夠加限制,具體的值能夠經過交叉驗證獲得。

  • max_depth:決策樹最大深度。默認爲None。通常數據比較少或者特徵少的時候能夠不用管這個值,若是模型樣本數量多,特徵也多時,推薦限制這個最大深度,具體取值取決於數據的分佈。經常使用的能夠取值10-100之間,經常使用來解決過擬合。

  • min_impurity_split:信息增益的閥值。決策樹在建立分支時,信息增益必須大於這個閥值,不然不分裂。

  • class_weight:類別權重。默認爲None,(dict, list of dicts, balanced)指定樣本各種別的權重,主要是爲了防止訓練集某些類別的樣本過多,致使訓練的決策樹過於偏向這些類別。balanced,算法本身計算權重,樣本量少的類別所對應的樣本權重會更高。若是樣本類別分佈沒有明顯的偏倚,則能夠無論這個參數。

    

    在電腦上安裝好Graphviz就可使用export_graphviz函數來可視化決策樹。微信

    經過觀察GraphViz建立的圖像,能夠很好的回溯決策樹在訓練數據集上對各節點進行劃分的過程。
dom

    最初,決策樹根節點包含105個樣本,以花瓣長度<=2.45爲界限,將其劃分爲分別包含33個和72個樣本的兩個子節點。第一次劃分後,能夠看到:左子樹上的樣本均來自於Iris-Setosa類,已經無需再劃分。在右子樹上進一步劃分,直到Versicolor和Virginica兩類分開。
編輯器


隨機森林


    直觀上,隨機森林能夠視爲多顆決策樹的集成。集成學習的基本理念就是將弱分類器即成爲魯棒性更強的模型,即一個能力更強的分類器,集成後具有更好的泛化偏差,不易產生過擬合現象。
函數

    隨機森林能夠概況爲四個步驟:
性能

  1. 使用bootstrap抽樣方法隨機選擇n個樣本用於訓練(從訓練集中隨機可重複選擇n個樣本。)學習

  2. 使用第1步選定的樣本構造一顆決策樹。節點劃分以下:(1)不重複地隨機選擇d個特徵。(2)根據目標函數,如最大化信息增益,使用選定的特徵對節點進行劃分。

  3. 重複上述過程1~2000次。

  4. 彙總每顆決策樹類表進行多數投票。


    在步驟2處,對於單決策樹的構建作了些許修改:在對節點進行最優化劃分的斷定時,並未使用全部的特徵,而只是隨機選擇了一個子集。


    雖然隨機森林沒有決策樹那樣良好的可解釋性,但其顯著的優點在於沒必要擔憂超參值的選擇。一般不須要對隨機森林進行剪枝,由於相對於單棵決策樹來講,集成模型對噪聲的魯棒性更好。在實踐中,真正須要關心的參數是爲構建隨機森林所需的決策樹數量(步驟 3))。一般狀況下,決策樹的數量越多,可是隨機森林總體的分類表現就越好,但這同時也相應地增長了計算成本。


    經過選擇bootstrap抽樣中樣本數量n,咱們能夠控制隨機森林的誤差與方差權衡的問題。若是n的值較大,就下降了隨機性,由此更可能致使隨機森林的過擬合。反之,咱們能夠基於模型的性能,經過選擇較小的n值來下降過擬合。

    包括sklearn中RandomForestClassifier在內的大多數對隨機森林的實現中,抽樣的數量通常與原始訓練集中樣本的數量相同,由於這樣在折中誤差與方差方面通常會有一個好的均衡結果。而對於在每次節點劃分中用到的特徵 數量m,咱們選擇一個比訓練集中特徵總量小的值,一般這個值默認爲,m爲特徵總量。

from sklearn import datasetsiris = datasets.load_iris()X = iris.dataY = iris.targetfrom sklearn.model_selection import train_test_splitX_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=0.3)from sklearn.ensemble import RandomForestClassifierforest = RandomForestClassifier( criterion='entropy', n_estimators=10, random_state=1,    n_jobs=2    )forest.fit(X_train,Y_train)import graphvizfrom sklearn.tree import export_graphviz#生成的多個隨機數trees = forest.estimators_[9]gra_data= export_graphviz( trees, feature_names=['花萼長度','花萼寬度','花瓣長度','花瓣寬度'])#由於標籤是中文因此須要將參數設置成支持微軟雅黑的格式gra_data = gra_data.replace('helvetica','"Microsoft Yahei"')grap = graphviz.Source(gra_data)grap.render('forest')


    上述代碼中,經過參數n_estimators使用了10課決策樹進行隨機森林的訓練。


你點的每一個在看,我都認真當成了喜歡




本文分享自微信公衆號 - 小啦的學習筆記(woshiguolala)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索