學習機器學習童鞋們應該都知道決策樹是一個非常好用的算法审葬,因為它的運算速度快,準確性高痴荐,方便理解官册,可以處理連續(xù)或種類的字段,并且適合高維的數據而被人們喜愛膝宁,而Sklearn也是學習Python實現機器學習的一個非常好用的庫,也是被廣大學習機器學習們的童鞋們所喜愛的合蔽,那么一個被人們喜愛的算法和一個被人們喜愛的庫結合到一起會是什么樣子的呢介返,下面就是在Sklearn庫中的分類決策樹的算法函數以及所包含的參數。
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)
為什么會變成這樣呢……第一次有了喜歡的算法刃宵,又有了支持這個算法的一個非常好的庫捅彻。兩件快樂事情重合在一起。而這兩份快樂从隆,又給我?guī)砀嗟目鞓风择伞5玫降模驹撌窍駢艟骋话阈腋5慕Y合……但是辛燥,為什么,會變成這樣呢挎塌。為什么會變得這么復雜呢。
是不是感覺兩個結合起來的算法的參數有好多待锈,不知道每個參數應該怎么使用嘴高,那么下面我們就對算法的一些關鍵參數進行分析,相信看完這些參數春瞬,你應該會明白如何使用Sklearn中的分類決策樹套啤。
1. 重要參數:criterion
為了要將表格轉化為一棵樹,決策樹需要找出最佳節(jié)點和最佳的分枝方法抹竹,對分類樹來說止潮,衡量這個“最佳”的指標叫做“不純度”钞楼。通常來說,不純度越低燃乍,決策樹對訓練集的擬合越好⊥鹄牛現在使用的決策樹算法在分枝方法上的核心大多是圍繞在對某個不純度相關指標的最優(yōu)化上。
不純度基于節(jié)點來計算嘿辟,樹中的每個節(jié)點都會有一個不純度,并且子節(jié)點的不純度一定是低于父節(jié)點的英古,也就是說昙读,在同一棵決策樹上,葉子節(jié)點的不純度一定是最低的唠叛。
Criterion這個參數正是用來決定不純度的計算方法的。sklearn提供了兩種選擇:
1)輸入”entropy“册舞,使用信息熵(Entropy)
2)輸入”gini“澳厢,使用基尼系數(Gini Impurity)
公式:
其中t代表給定的節(jié)點,i代表標簽的任意分類线得,代表標簽分類i在節(jié)點t上所占的比例徐伐。注意,當使用信息熵時角雷,sklearn實際計算的是基于信息熵的信息增益(Information Gain)性穿,即父節(jié)點的信息熵和子節(jié)點的信息熵之差。
比起基尼系數需曾,信息熵對不純度更加敏感呆万,對不純度的懲罰最強。但是在實際使用中谋减,信息熵和基尼系數的效果基本相同。信息熵的計算比基尼系數緩慢一些庄吼,因為基尼系數的計算不涉及對數严就。另外,因為信息熵對不純度更加敏感废菱,所以信息熵作為指標時,決策樹的生長會更加“精細”殊轴,因此對于高維數據或者噪音很多的數據旁理,信息熵很容易過擬合,基尼系數在這種情況下效果往往比較好孽文。當然,這不是絕對的沉衣。
參數 | criterion |
---|---|
如何影響模型? | 確定不純度的計算方法减牺,幫忙找出最佳節(jié)點和最佳分枝,不純度越低肥隆,決策樹對訓練集的擬合越好 |
可能的輸入有哪些稚失? | 不填默認基尼系數,填寫gini使用基尼系數嘱巾,填寫entropy使用信息增益 |
怎樣選取參數诫钓? | 通常就使用基尼系數 數據維度很大篙螟,噪音很大時使用基尼系數 維度低,數據比較清晰的時候惧所,信息熵和基尼系數沒區(qū)別 當決策樹的擬合程度不夠的時候绪杏,使用信息熵 兩個都試試,不好就換另外一個 |
到這里势似,決策樹的基本流程其實可以簡單概括如下:
直到沒有更多的特征可用履因,或整體的不純度指標已經最優(yōu),決策樹就會停止生長栅迄。
但是如果僅僅根據這些就生成樹的話,那每個人畫出來的每一棵樹可能都不一樣西篓。它為什么會不穩(wěn)定呢憋活?如果使用其他數據集,它還會不穩(wěn)定嗎寸爆?
其實盐欺,無論決策樹模型如何進化,在分枝上的本質都還是追求某個不純度相關的指標的優(yōu)化魔种,而正如我們提到的粉洼,不純度是基于節(jié)點來計算的,也就是說安拟,決策樹在建樹時宵喂,是靠優(yōu)化節(jié)點來追求一棵優(yōu)化的樹,但最優(yōu)的節(jié)點能夠保證最優(yōu)的樹嗎拙泽?集成算法被用來解決這個問題:sklearn表示裸燎,既然一棵樹不能保證最優(yōu),那就建更多的不同的樹荷荤,然后從中取最好的。怎樣從一組數據集中建不同的樹梅猿?在每次分枝時,不從使用全部特征钞啸,而是隨機選取一部分特征喇潘,從中選取不純度相關指標最優(yōu)的作為分枝用的節(jié)點。這樣絮吵,每次生成的樹也就不同了忱屑。
2. 重要參數: random_state & splitter
random_state用來設置分枝中的隨機模式的參數莺戒,默認None,在高維度時隨機性會表現更明顯从铲,低維度的數據(比如鳶尾花數據集),隨機性幾乎不會顯現阱扬。輸入任意整數伸辟,會一直長出同一棵樹,讓模型穩(wěn)定下來窃蹋。
splitter也是用來控制決策樹中的隨機選項的忙迁,有兩種輸入值碎乃,輸入”best"梅誓,決策樹在分枝時雖然隨機佛南,但是還是會優(yōu)先選擇更重要的特征進行分枝(重要性可以通過屬性feature_importances_查看)紊遵,輸入“random"肝箱,決策樹在分枝時會更加隨機绵载,樹會因為含有更多的不必要信息而更深更大苛白,并因這些不必要信息而降低對訓練集的擬合。這也是防止過擬合的一種方式懂版。當你預測到你的模型會過擬合躏率,用這兩個參數來幫助你降低樹建成之后過擬合的可能性。當然蓬抄,樹一旦建成恩掷,我們依然是使用剪枝參數來防止過擬合。
3. 剪枝參數
在不加限制的情況下峭状,一棵決策樹會生長到衡量不純度的指標最優(yōu)逼争,或者沒有更多的特征可用為止。這樣的決策樹往往會過擬合胆敞,這就是說杂伟,它會在訓練集上表現很好,在測試集上卻表現糟糕观话。我們收集的樣本數據不可能和整體的狀況完全一致越平,因此當一棵決策樹對訓練數據有了過于優(yōu)秀的解釋性灵迫,它找出的規(guī)則必然包含了訓練樣本中的噪聲瀑粥,并使它對未知數據的擬合程度不足三圆。
為了讓決策樹有更好的泛化性,我們要對決策樹進行剪枝哀澈。剪枝策略對決策樹的影響巨大度气,正確的剪枝策略是優(yōu)化決策樹算法的核心。sklearn為我們提供了不同的剪枝策略:
3.1 max_depth
限制樹的最大深度适荣,超過設定深度的樹枝全部剪掉
這是用得最廣泛的剪枝參數院领,在高維度低樣本量時非常有效。決策樹多生長一層丈氓,對樣本量的需求會增加一倍强法,所以限制樹深度能夠有效地限制過擬合。在集成算法中也非常實用闰歪。實際使用時蓖墅,建議從=3開始嘗試,看看擬合的效果再決定是否增加設定深度教翩。
3.2 min_samples_leaf
min_samples_leaf 限定贪壳,一個節(jié)點在分枝后的每個子節(jié)點都必須包含至少min_samples_leaf個訓練樣本,否則分枝就不會發(fā)生路捧,或者传黄,分枝會朝著滿足每個子節(jié)點都包含min_samples_leaf個樣本的方向去發(fā)生
一般搭配max_depth使用膘掰,在回歸樹中有神奇的效果,可以讓模型變得更加平滑凡伊。這個參數的數量設置得太小會引起過擬合,設置得太大就會阻止模型學習數據窒舟。一般來說,建議從=5開始使用惠豺。如果葉節(jié)點中含有的樣本量變化很大,建議輸入浮點數作為樣本量的百分比來使用蛹疯。同時热监,這個參數可以保證每個葉子的最小尺寸孝扛,可以在回歸問題中避免低方差,過擬合的葉子節(jié)點出現疗琉。對于類別不多的分類問題盈简,=1通常就是最佳選擇。
3.3 min_samples_split
min_samples_split限定香浩,一個節(jié)點必須要包含至少min_samples_split個訓練樣本臼勉,這個節(jié)點才允許被分枝,否則分枝就不會發(fā)生囱晴。
3.4 max_features
一般max_depth使用,用作樹的”精修“
max_features限制分枝時考慮的特征個數驮瞧,超過限制個數的特征都會被舍棄枯芬。和max_depth異曲同工,max_features是用來限制高維度數據的過擬合的剪枝參數狂魔,但其方法比較暴力淫痰,是直接限制可以使用的特征數量而強行使決策樹停下的參數待错,在不知道決策樹中的各個特征的重要性的情況下,強行設定這個參數可能會導致模型學習不足蚯撩。如果希望通過降維的方式防止過擬合烛占,建議使用PCA,ICA或者特征選擇模塊中的降維算法犹菇。
3.5 min_impurity_decrease
min_impurity_decrease限制信息增益的大小芽卿,信息增益小于設定數值的分枝不會發(fā)生卸例。這是在0.19版本種更新的功能,在0.19版本之前時使用min_impurity_split筷转。
4. 確認最優(yōu)的剪枝參數
那具體怎么來確定每個參數填寫什么值呢呜舒?這時候,我們就要使用確定超參數的曲線來進行判斷了,繼續(xù)使用我們已經訓練好的決策樹模型clf般婆。超參數的學習曲線腺兴,是一條以超參數的取值為橫坐標廉侧,模型的度量指標為縱坐標的曲線篓足,它是用來衡量不同超參數取值下模型的表現的線。在我們建好的決策樹里连舍,我們的模型度量指標就是score索赏。
思考:
剪枝參數一定能夠提升模型在測試集上的表現嗎贴彼? - 調參沒有絕對的答案,一切都是看數據本身器仗。
這么多參數融涣,一個個畫學習曲線?
無論如何精钮,剪枝參數的默認值會讓樹無盡地生長威鹿,這些樹在某些數據集上可能非常巨大,對內存的消耗轨香。所以如果你手中的數據集非常大忽你,你已經預測到無論如何你都是要剪枝的,那提前設定這些參數來控制樹的復雜性和大小會比較好臂容。
5. 目標權重參數
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)更少偏向主導類。如果樣本是加權的细卧,則使用基于權重的預修剪標準來更容易優(yōu)化樹結構尉桩,這確保葉節(jié)點至少包含樣本權重的總和的一小部分。
6. 重要屬性和接口
屬性是在模型訓練之后贪庙,能夠調用查看的模型的各種性質蜘犁。對決策樹來說,最重要的是feature_importances_止邮,能夠查看各個特征對模型的重要性沽瘦。
sklearn中許多算法的接口都是相似的,比如說我們之前已經用到的fit和score农尖,幾乎對每個算法都可以使用析恋。除了這兩個接口之外,決策樹最常用的接口還有apply和predict盛卡。apply中輸入測試集返回每個測試樣本所在的葉子節(jié)點的索引助隧,predict輸入測試集返回每個測試樣本的標簽。返回的內容一目了然并且非常容易滑沧,大家感興趣可以自己下去試試看并村。
總結:
七個參數:Criterion,兩個隨機性相關的參數(random_state滓技,splitter)哩牍,四個剪枝參數(max_depth, ,min_sample_leaf令漂,max_feature膝昆,min_impurity_decrease)
一個屬性:feature_importances_
四個接口:fit丸边,score,apply荚孵,predict
有了這些知識妹窖,基本上分類樹的使用大家都能夠掌握了,接下來再到實例中去磨練就好收叶。