SKlearn中分類決策樹的重要引數詳解

CDA 資料分析師發表於2019-03-08

classsklearn.tree.DecisionTreeClassifier(criterion=’gini’, splitter=’best’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, class_weight=None, presort=False)

  1. 重要引數:criterion
    為了要將表格轉化為一棵樹,決策樹需要找出最佳節點和最佳的分枝方法,對分類樹來說,衡量這個“最佳”的指標叫做“不純度”。通常來說,不純度越低,決策樹對訓練集的擬合越好。現在使用的決策樹演算法在分枝方法上的核心大多是圍繞在對某個不純度相關指標的最優化上。

不純度基於節點來計算,樹中的每個節點都會有一個不純度,並且子節點的不純度一定是低於父節點的,也就是說,在同一棵決策樹上,葉子節點的不純度一定是最低的。

Criterion這個引數正是用來決定不純度的計算方法的。sklearn提供了兩種選擇:

1)輸入”entropy“,使用資訊熵(Entropy)

2)輸入”gini“,使用基尼係數(Gini Impurity)

其中t代表給定的節點,i代表標籤的任意分類,p(i|t)代表標籤分類i在節點t上所佔的比例。注意,當使用資訊熵時,sklearn實際計算的是基於資訊熵的資訊增益(Information Gain),即父節點的資訊熵和子節點的資訊熵之差。

比起基尼係數,資訊熵對不純度更加敏感,對不純度的懲罰最強。但是在實際使用中,資訊熵和基尼係數的效果基本相同。資訊熵的計算比基尼係數緩慢一些,因為基尼係數的計算不涉及對數。另外,因為資訊熵對不純度更加敏感,所以資訊熵作為指標時,決策樹的生長會更加“精細”,因此對於高維資料或者噪音很多的資料,資訊熵很容易過擬合,基尼係數在這種情況下效果往往比較好。當然,這不是絕對的。

引數 criterion
如何影響模型? 確定不純度的計算方法,幫忙找出最佳節點和最佳分枝,不純度越低,決策樹對訓練集的擬合越好
可能的輸入有哪些? 不填預設基尼係數,填寫gini使用基尼係數,填寫entropy使用資訊增益
怎樣選取引數? 通常就使用基尼係數 資料維度很大,噪音很大時使用基尼係數 維度低,資料比較清晰的時候,資訊熵和基尼係數沒區別 當決策樹的擬合程度不夠的時候,使用資訊熵 兩個都試試,不好就換另外一個
到這裡,決策樹的基本流程其實可以簡單概括如下:

直到沒有更多的特徵可用,或整體的不純度指標已經最優,決策樹就會停止生長。

但是如果僅僅根據這些就生成樹的話,那每個人畫出來的每一棵樹可能都不一樣。它為什麼會不穩定呢?如果使用其他資料集,它還會不穩定嗎?

其實,無論決策樹模型如何進化,在分枝上的本質都還是追求某個不純度相關的指標的優化,而正如我們提到的,不純度是基於節點來計算的,也就是說,決策樹在建樹時,是靠優化節點來追求一棵優化的樹,但最優的節點能夠保證最優的樹嗎?整合演算法被用來解決這個問題:sklearn表示,既然一棵樹不能保證最優,那就建更多的不同的樹,然後從中取最好的。怎樣從一組資料集中建不同的樹?在每次分枝時,不從使用全部特徵,而是隨機選取一部分特徵,從中選取不純度相關指標最優的作為分枝用的節點。這樣,每次生成的樹也就不同了。

  1. 重要引數: random_state & splitter
    random_state用來設定分枝中的隨機模式的引數,預設None,在高維度時隨機性會表現更明顯,低維度的資料(比如鳶尾花資料集),隨機性幾乎不會顯現。輸入任意整數,會一直長出同一棵樹,讓模型穩定下來。

splitter也是用來控制決策樹中的隨機選項的,有兩種輸入值,輸入”best",決策樹在分枝時雖然隨機,但是還是會優先選擇更重要的特徵進行分枝(重要性可以通過屬性feature_importances_檢視),輸入“random",決策樹在分枝時會更加隨機,樹會因為含有更多的不必要資訊而更深更大,並因這些不必要資訊而降低對訓練集的擬合。這也是防止過擬合的一種方式。當你預測到你的模型會過擬合,用這兩個引數來幫助你降低樹建成之後過擬合的可能性。當然,樹一旦建成,我們依然是使用剪枝引數來防止過擬合。

  1. 剪枝引數
    在不加限制的情況下,一棵決策樹會生長到衡量不純度的指標最優,或者沒有更多的特徵可用為止。這樣的決策樹往往會過擬合,這就是說,它會在訓練集上表現很好,在測試集上卻表現糟糕。我們收集的樣本資料不可能和整體的狀況完全一致,因此當一棵決策樹對訓練資料有了過於優秀的解釋性,它找出的規則必然包含了訓練樣本中的噪聲,並使它對未知資料的擬合程度不足。

為了讓決策樹有更好的泛化性,我們要對決策樹進行剪枝。剪枝策略對決策樹的影響巨大,正確的剪枝策略是優化決策樹演算法的核心。sklearn為我們提供了不同的剪枝策略:

3.1 max_depth
限制樹的最大深度,超過設定深度的樹枝全部剪掉

這是用得最廣泛的剪枝引數,在高維度低樣本量時非常有效。決策樹多生長一層,對樣本量的需求會增加一倍,所以限制樹深度能夠有效地限制過擬合。在整合演算法中也非常實用。實際使用時,建議從=3開始嘗試,看看擬合的效果再決定是否增加設定深度。

3.2 min_samples_leaf
min_samples_leaf 限定,一個節點在分枝後的每個子節點都必須包含至少min_samples_leaf個訓練樣本,否則分枝就不會發生,或者,分枝會朝著滿足每個子節點都包含min_samples_leaf個樣本的方向去發生

一般搭配max_depth使用,在迴歸樹中有神奇的效果,可以讓模型變得更加平滑。這個引數的數量設定得太小會引起過擬合,設定得太大就會阻止模型學習資料。一般來說,建議從=5開始使用。如果葉節點中含有的樣本量變化很大,建議輸入浮點數作為樣本量的百分比來使用。同時,這個引數可以保證每個葉子的最小尺寸,可以在迴歸問題中避免低方差,過擬合的葉子節點出現。對於類別不多的分類問題,=1通常就是最佳選擇。

3.3 min_samples_split
min_samples_split限定,一個節點必須要包含至少min_samples_split個訓練樣本,這個節點才允許被分枝,否則分枝就不會發生。

3.4 max_features
一般max_depth使用,用作樹的”精修“

max_features限制分枝時考慮的特徵個數,超過限制個數的特徵都會被捨棄。和max_depth異曲同工,max_features是用來限制高維度資料的過擬合的剪枝引數,但其方法比較暴力,是直接限制可以使用的特徵數量而強行使決策樹停下的引數,在不知道決策樹中的各個特徵的重要性的情況下,強行設定這個引數可能會導致模型學習不足。如果希望通過降維的方式防止過擬合,建議使用PCA,ICA或者特徵選擇模組中的降維演算法。

3.5 min_impurity_decrease
min_impurity_decrease限制資訊增益的大小,資訊增益小於設定數值的分枝不會發生。這是在0.19版本種更新的功能,在0.19版本之前時使用min_impurity_split。

  1. 確認最優的剪枝引數
    那具體怎麼來確定每個引數填寫什麼值呢?這時候,我們就要使用確定超引數的曲線來進行判斷了,繼續使用我們已經訓練好的決策樹模型clf。超引數的學習曲線,是一條以超引數的取值為橫座標,模型的度量指標為縱座標的曲線,它是用來衡量不同超引數取值下模型的表現的線。在我們建好的決策樹裡,我們的模型度量指標就是score。

思考:

剪枝引數一定能夠提升模型在測試集上的表現嗎? - 調參沒有絕對的答案,一切都是看資料本身。

這麼多引數,一個個畫學習曲線?

無論如何,剪枝引數的預設值會讓樹無盡地生長,這些樹在某些資料集上可能非常巨大,對記憶體的消耗。所以如果你手中的資料集非常大,你已經預測到無論如何你都是要剪枝的,那提前設定這些引數來控制樹的複雜性和大小會比較好。

  1. 目標權重引數
    5.1 class_weight
    完成樣本標籤平衡的引數。樣本不平衡是指在一組資料集中,標籤的一類天生佔有很大的比例。比如說,在銀行要判斷“一個辦了信用卡的人是否會違約”,就是是vs否(1%:99%)的比例。這種分類狀況下,即便模型什麼也不做,全把結果預測成“否”,正確率也能有99%。因此我們要使用class_weight引數對樣本標籤進行一定的均衡,給少量的標籤更多的權重,讓模型更偏向少數類,向捕獲少數類的方向建模。該引數預設None,此模式表示自動給與資料集中的所有標籤相同的權重。

5.2 min_weight_fraction_leaf
有了權重之後,樣本量就不再是單純地記錄數目,而是受輸入的權重影響了,因此這時候剪枝,就需要搭配min_ weight_fraction_leaf這個基於權重的剪枝引數來使用。另請注意,基於權重的剪枝引數(例如min_weight_ fraction_leaf)將比不知道樣本權重的標準(比如min_samples_leaf)更少偏向主導類。如果樣本是加權的,則使用基於權重的預修剪標準來更容易優化樹結構,這確保葉節點至少包含樣本權重的總和的一小部分。

  1. 重要屬性和介面
    屬性是在模型訓練之後,能夠呼叫檢視的模型的各種性質。對決策樹來說,最重要的是feature_importances_,能夠檢視各個特徵對模型的重要性。

sklearn中許多演算法的介面都是相似的,比如說我們之前已經用到的fit和score,幾乎對每個演算法都可以使用。除了這兩個介面之外,決策樹最常用的介面還有apply和predict。apply中輸入測試集返回每個測試樣本所在的葉子節點的索引,predict輸入測試集返回每個測試樣本的標籤。返回的內容一目瞭然並且非常容易,大家感興趣可以自己下去試試看。

總結:

七個引數:Criterion,兩個隨機性相關的引數(random_state,splitter),四個剪枝引數(max_depth, ,min_sample_leaf,max_feature,min_impurity_decrease)

一個屬性:feature_importances_

四個介面:fit,score,apply,predict

有了這些知識,基本上分類樹的使用大家都能夠掌握了,接下來再到例項中去磨練就好。

相關文章