學習機器學習童鞋們應該都知道決策樹是一個很是好用的算法,由於它的運算速度快,準確性高,方便理解,能夠處理連續或種類的字段,而且適合高維的數據而被人們喜好,而Sklearn也是學習Python實現機器學習的一個很是好用的庫,也是被廣大學習機器學習們的童鞋們所喜好的,那麼一個被人們喜好的算法和一個被人們喜好的庫結合到一塊兒會是什麼樣子的呢,下面就是在Sklearn庫中的分類決策樹的函數以及所包含的參數。node
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)
算法
是否是感受兩個結合起來的算法的參數有好多,不知道每一個參數應該怎麼使用,那麼下面咱們就對算法的一些關鍵參數進行分析,相信看完這些參數,你應該會明白如何使用Sklearn中的分類決策樹。app
爲了要將表格轉化爲一棵樹,決策樹須要找出最佳節點和最佳的分枝方法,對分類樹來講,衡量這個「最佳」的指標叫作「不純度」。一般來講,不純度越低,決策樹對訓練集的擬合越好。如今使用的決策樹算法在分枝方法上的核心大可能是圍繞在對某個不純度相關指標的最優化上。dom
不純度基於節點來計算,樹中的每一個節點都會有一個不純度,而且子節點的不純度必定是低於父節點的,也就是說,在同一棵決策樹上,葉子節點的不純度必定是最低的。機器學習
Criterion這個參數正是用來決定不純度的計算方法的。sklearn提供了兩種選擇:函數
1)輸入」entropy「,使用信息熵(Entropy)學習
2)輸入」gini「,使用基尼係數(Gini Impurity)測試
其中t表明給定的節點,i表明標籤的任意分類,$p(i|t)$表明標籤分類i在節點t上所佔的比例。注意,當使用信息熵時,sklearn實際計算的是基於信息熵的信息增益(Information Gain),即父節點的信息熵和子節點的信息熵之差。優化
比起基尼係數,信息熵對不純度更加敏感,對不純度的懲罰最強。可是在實際使用中,信息熵和基尼係數的效果基本相同。信息熵的計算比基尼係數緩慢一些,由於基尼係數的計算不涉及對數。另外,由於信息熵對不純度更加敏感,因此信息熵做爲指標時,決策樹的生長會更加「精細」,所以對於高維數據或者噪音不少的數據,信息熵很容易過擬合,基尼係數在這種狀況下效果每每比較好。固然,這不是絕對的。spa
參數 | criterion |
---|---|
如何影響模型? | 肯定不純度的計算方法,幫忙找出最佳節點和最佳分枝,不純度越低,決策樹對訓練集的擬合越好 |
可能的輸入有哪些? | 不填默認基尼係數,填寫gini使用基尼係數,填寫entropy使用信息增益 |
怎樣選取參數? | 一般就使用基尼係數、數據維度很大,噪音很大時使用基尼係數 維度低,數據比較清晰的時候,信息熵和基尼係數沒區別 當決策樹的擬合程度不夠的時候,使用信息熵 兩個都試試,很差就換另一個 |
到這裏,決策樹的基本流程其實能夠簡單歸納以下:
直到沒有更多的特徵可用,或整
可是若是僅僅根據這些就生成樹的話,那每一個人畫出來的每一棵樹可能都不同。它爲何會不穩定呢?若是使用其餘數據集,它還會不穩定嗎?
其實,不管決策樹模型如何進化,在分枝上的本質都仍是追求某個不純度相關的指標的優化,而正如咱們提到的,不純度是基於節點來計算的,也就是說,決策樹在建樹時,是靠優化節點來追求一棵優化的樹,但最優的節點可以保證最優的樹嗎?集成算法被用來解決這個問題:sklearn表示,既然一棵樹不能保證最優,那就建更多的不一樣的樹,而後從中取最好的。怎樣從一組數據集中建不一樣的樹?在每次分枝時,不從使用所有特徵,而是隨機選取一部分特徵,從中選取不純度相關指標最優的做爲分枝用的節點。這樣,每次生成的樹也就不一樣了。
random_state用來設置分枝中的隨機模式的參數,默認None,在高維度時隨機性會表現更明顯,低維度的數據(好比鳶尾花數據集),隨機性幾乎不會顯現。輸入任意整數,會一直長出同一棵樹,讓模型穩定下來。
splitter也是用來控制決策樹中的隨機選項的,有兩種輸入值,輸入」best",決策樹在分枝時雖然隨機,可是仍是會優先選擇更重要的特徵進行分枝(重要性能夠經過屬性feature_importances_查看),輸入「random",決策樹在分枝時會更加隨機,樹會由於含有更多的沒必要要信息而更深更大,並因這些沒必要要信息而下降對訓練集的擬合。這也是防止過擬合的一種方式。當你預測到你的模型會過擬合,用這兩個參數來幫助你下降樹建成以後過擬合的可能性。固然,樹一旦建成,咱們依然是使用剪枝參數來防止過擬合。
在不加限制的狀況下,一棵決策樹會生長到衡量不純度的指標最優,或者沒有更多的特徵可用爲止。這樣的決策樹每每會過擬合,這就是說,它會在訓練集上表現很好,在測試集上卻表現糟糕。咱們收集的樣本數據不可能和總體的情況徹底一致,所以當一棵決策樹對訓練數據有了過於優秀的解釋性,它找出的規則必然包含了訓練樣本中的噪聲,並使它對未知數據的擬合程度不足。
爲了讓決策樹有更好的泛化性,咱們要對決策樹進行剪枝。剪枝策略對決策樹的影響巨大,正確的剪枝策略是優化決策樹算法的核心。sklearn爲咱們提供了不一樣的剪枝策略:
限制樹的最大深度,超過設定深度的樹枝所有剪掉
這是用得最普遍的剪枝參數,在高維度低樣本量時很是有效。決策樹多生長一層,對樣本量的需求會增長一倍,因此限制樹深度可以有效地限制過擬合。在集成算法中也很是實用。實際使用時,建議從=3開始嘗試,看看擬合的效果再決定是否增長設定深度。
min_samples_leaf 限定,一個節點在分枝後的每一個子節點都必須包含至少min_samples_leaf個訓練樣本,不然分枝就不會發生,或者,分枝會朝着知足每一個子節點都包含min_samples_leaf個樣本的方向去發生
通常搭配max_depth使用,在迴歸樹中有神奇的效果,可讓模型變得更加平滑。這個參數的數量設置得過小會引發過擬合,設置得太大就會阻止模型學習數據。通常來講,建議從=5開始使用。若是葉節點中含有的樣本量變化很大,建議輸入浮點數做爲樣本量的百分比來使用。同時,這個參數能夠保證每一個葉子的最小尺寸,能夠在迴歸問題中避免低方差,過擬合的葉子節點出現。對於類別很少的分類問題,=1一般就是最佳選擇。
min_samples_split限定,一個節點必需要包含至少min_samples_split個訓練樣本,這個節點才容許被分枝,不然分枝就不會發生。
通常max_depth使用,用做樹的」精修「
max_features限制分枝時考慮的特徵個數,超過限制個數的特徵都會被捨棄。和max_depth殊途同歸,max_features是用來限制高維度數據的過擬合的剪枝參數,但其方法比較暴力,是直接限制可使用的特徵數量而強行使決策樹停下的參數,在不知道決策樹中的各個特徵的重要性的狀況下,強行設定這個參數可能會致使模型學習不足。若是但願經過降維的方式防止過擬合,建議使用PCA,ICA或者特徵選擇模塊中的降維算法。
min_impurity_decrease限制信息增益的大小,信息增益小於設定數值的分枝不會發生。這是在0.19版本種更新的功能,在0.19版本以前時使用min_impurity_split。
那具體怎麼來肯定每一個參數填寫什麼值呢?這時候,咱們就要使用肯定超參數的曲線來進行判斷了,繼續使用咱們已經訓練好的決策樹模型clf。超參數的學習曲線,是一條以超參數的取值爲橫座標,模型的度量指標爲縱座標的曲線,它是用來衡量不一樣超參數取值下模型的表現的線。在咱們建好的決策樹裏,咱們的模型度量指標就是score。
思考:
剪枝參數必定可以提高模型在測試集上的表現嗎? - 調參沒有絕對的答案,一切都是看數據自己。
這麼多參數,一個個畫學習曲線?
不管如何,剪枝參數的默認值會讓樹無盡地生長,這些樹在某些數據集上可能很是巨大,對內存的消耗。因此若是你手中的數據集很是大,你已經預測到不管如何你都是要剪枝的,那提早設定這些參數來控制樹的複雜性和大小會比較好。
完成樣本標籤平衡的參數。樣本不平衡是指在一組數據集中,標籤的一類天生佔有很大的比例。好比說,在銀行要判斷「一個辦了信用卡的人是否會違約」,就是是vs否(1%:99%)的比例。這種分類情況下,即使模型什麼也不作,全把結果預測成「否」,正確率也能有99%。所以咱們要使用class_weight參數對樣本標籤進行必定的均衡,給少許的標籤更多的權重,讓模型更偏向少數類,向捕獲少數類的方向建模。該參數默認None,此模式表示自動給與數據集中的全部標籤相同的權重。
有了權重以後,樣本量就再也不是單純地記錄數目,而是受輸入的權重影響了,所以這時候剪枝,就須要搭配min_ weight_fraction_leaf這個基於權重的剪枝參數來使用。另請注意,基於權重的剪枝參數(例如min_weight_ fraction_leaf)將比不知道樣本權重的標準(好比min_samples_leaf)更少偏向主導類。若是樣本是加權的,則使用基於權重的預修剪標準來更容易優化樹結構,這確保葉節點至少包含樣本權重的總和的一小部分。
屬性是在模型訓練以後,可以調用查看的模型的各類性質。對決策樹來講,最重要的是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
有了這些知識,基本上分類樹的使用你們都可以掌握了,接下來再到實例中去磨練就好。