python决策树怎么选择_【机器学习+python(8)】分类决策树的介绍与实现
之前我們介紹過用邏輯回歸根據鳶尾花萼片、花瓣的長度和寬度進行鳶尾花類別的判定;也通過樸素貝葉斯模型分享了如何根據男生專業和身高兩大屬性,判斷其是否有女朋友。而本期我們將介紹另外一種有監督的機器學習分類模型----決策樹(也可以實現基本的回歸),重點介紹決策樹的基本原理和實現,并且借助python的sklearn庫中的決策樹算法實現上述兩類數據分類展示。
決策樹的基本原理
想必大家都有疑問,好多機器學習算法均可實現分類,那不同之處是什么呢?
對于邏輯回歸,我們已知它是基于線性模型,通過對數據特征給予權重相加得到新的一個回歸值,再進行Sigmoid變換將回歸值約束在(0,1)之間,進而通過值的大小判斷所屬的類型(一般情況實現的是線性分割,輸入特征x與logit之間是線性的,除非對x進行多維映射)。
而樸素貝葉斯模型則是基于貝葉斯定理、條件概率、特征獨立分布的,根據樣本特征計算其屬于特定類別的概率,然后根據概率大小確定其最終的分類結果。
決策樹算法簡單來說就是帶有判斷規則(if-then)的一種樹,可以依據樹中的決策規則來預測未知樣本的類別或數值(分類和回歸)。其核心是對數據進行一個一個特征的篩選和處理,并且對特征閾值實現非線性分割,根據得出的抉擇結果依次建立樹模型。其主要優點是樹形模型更接近人的思維方式,分類速度快,易于理解,可產生可視化、可解釋的的分類規則。
比如:當我們想要出門時,會根據降雨、霧霾、氣溫、活動范圍是室內還是室外等等特征綜合進行考慮和判斷,做出最后決定。下圖是一個簡單判斷是否出門的4層決策樹分類結果。結果表明,下雨時,一定不出門;而如果不下雨卻有霧霾也不會出門。。。。。。
image.png
整個分類結果 一目了然,而且結構像一棵樹,有分叉的節點(數據特征)和樹葉(判定結果)。其中根節點(圖中降雨屬性)表示在此次分類中篩選出的最重要的特征;分叉處的父節點和子節點表示目標的某一個特征或屬性,而結果節點也稱為葉子節點,是完成判斷后產生的最終決策結果(出門or不出門)。
看到這里可能會有疑問,為什么要選擇降雨作為決策樹的根節點,而不是霧霾情況或氣溫等?****而對于時間屬性(連續型)的分割,為何是以18°,30°,35°為臨界?這就是實現決策樹過程要解決的核心問題:如何依次選擇數據的屬性;如何計算每個屬性的決策規則(完成數據的分裂);什么時候可以停止分裂(防止過擬合)。下面詳細通過決策樹算法來解決這些疑問,并通過實例完成建樹和剪枝。
決策樹算法
決策樹算法簡介
決策樹算法通常是遞歸地選擇最優特征,也就是會把每個特征都計算一遍,選取能夠使分類分的最好的一個特征,然后用這個最優特征構建根結點,依次對數據集進行分割。
比如該特征為離散型有幾種值就分割為幾個子集;而如果特征是連續型的則通過離散化處理后得到分割閾值后再分割子集;每個子集再分別遞歸調用特征選擇方法,依次返回結點,返回的結點也就是上一層的子結點;直到所有特征都已經用完,或者數據集只有一維特征時停止。
為了防止過擬合問題,計算每個節點的分類錯誤,進行剪枝處理。(先剪枝,在構造過程中,當某個節點滿足剪枝條件,則直接停止此分支的構造;后剪枝,先構造完成完整的決策樹,再通過某些條件遍歷樹進行剪枝。)
一般而言,隨著劃分過程不斷進行,我們希望決策樹的分支節點所包含的樣本盡可能屬于同一類別(也就是當下雨時得出的分類結果都是不出門),即節點的“純度”越來越高。就是保證目標變量要分得足夠開(將y=出門和y=不出門兩種情況按照不同天氣特征判定盡可能分離)。
此時我們將尋找最純凈的劃分方法,決策樹中常用的方法有ID3、C4.5、和CART,其中ID3算法使用信息增益作為不純度;C4.5算法使用信息增益率作為不純度;CART算法對回歸樹用平方誤差最小化準則,對分類樹用基尼指數(Gini index)最小化準則,進行特征選擇,生成決策樹。
**來,咱繼續嘮~~~**
鑒于ID3算法要求數據特征為離散值,而且特征中的類型數量會影響信息增益值;而c4.5算法生成的多叉樹,運算強度較高;因此我們直接以CART算法實現二叉分類樹為例,進行完整介紹:
假設有K個類的樣本D(A屬性,Y類別)屬于第i類的概率為:pi,則分類后的基尼指數為:
image
它表示訓練數據的不確定性,值越大表明特征所對應的類型越不確定。
如二分類問題中,假設樣本x屬于類別1的概率為p,則基尼指數為:
Gini(x)=2p(1-p),
當兩類情況的可能均為1/2時,其不確定性最大為1/2。
對于個給定的樣本D,假設有K個類別, 第k個類別的數量為Ck,則樣本D的基尼系數為:

根據數據特征A將樣本D的空間分為兩塊y1,y2。兩塊樣本數據大小分別為:D1,D2。
則在特征A的條件下,基尼系數為:

選擇使該基尼系數最小的屬性A,作為父節點,得出對應的子節點或葉子節點。然后依次遞歸其他所有屬性,依次選擇基尼系數最下的屬性,作為優先判斷的屬性。
其中如果屬性是連續的數據,將對這些數據進行離散化處理,處理的基本思路是:
(1)選取該屬性的所有n個數值,取相鄰兩樣本值的中位數,一共取得n-1個劃分點,對于這n-1個點,分別計算以該點作為二元分類點時的基尼系數
(2)選擇基尼系數最小的點作為該連續特征的二元離散分類點。
比如取到的基尼系數最小的點為at,則小于at的值為類別1,大于at的值為類別2,這樣我們就做到了連續特征的離散化。其中這些屬性后面還可以參與子節點的產生選擇過程。
關于建樹和剪枝
建樹具體流程為:
輸入:訓練集D,基尼系數的閾值,樣本個數閾值。
輸出:分類決策樹T。
流程:(根節點依次往下)
對于當前節點的數據集為D,如果樣本個數小于閾值或者沒有特征,則返回決策子樹,當前節點停止遞歸。
計算樣本集D的基尼系數,如果基尼系數小于閾值,則返回決策樹子樹,當前節點停止遞歸。
3)計算當前節點現有的各個特征值對數據集D的基尼系數。
4)選擇基尼系數最小的特征A和對應的特征值a。根據這個最優特征和最優特征值,把數據集劃分成兩部分D1和D2,同時建立當前節點的左右節點,做節點的數據集D為D1,右節點的數據集D為D2.
對左右的子節點遞歸的調用1-4步,生成決策樹。
對于生成的決策樹做預測的時候,假如測試集里的樣本A落到了某個葉子節點,而節點里有多個訓練樣本。則對于A的類別預測采用的是這個葉子節點里概率最大的類別。
停止分裂的條件
(1)最小節點數
當節點的數據量小于一個指定的數量時,不繼續分裂。兩個原因:一是數據量較少時,再做分裂容易強化噪聲數據的作用;二是降低樹生長的復雜性。提前結束分裂一定程度上有利于降低過擬合的影響。
(2)基尼值(信息熵)小于閥值
基尼值大小表示數據的復雜程度,當熵或者基尼值過小時,表示數據的純度比較大,如果熵或者基尼值小于一定程度時,節點停止分裂。
(3)決策樹的深度達到指定的條件
節點的深度可以理解為節點與決策樹跟節點的距離,如根節點的子節點的深度為1,因為這些節點與跟節點的距離為1,子節點的深度要比父節點的深度大1。決策樹的深度是所有葉子節點的最大深度,當深度到達指定的上限大小時,停止分裂。
(4)所有特征已經使用完畢,不能繼續進行分裂
被動式停止分裂的條件,當已經沒有可分的屬性時,直接將當前節點設置為葉子節點。
決策數的Python實現
# 構建模型def tree_module(trainData,labels): decision_tree = tree.DecisionTreeClassifier(max_depth=4) decision_tree_one = decision_tree.fit(trainData, labels) return decision_tree_one# 繪制決策樹圖def pic_tree(decision_tree,filename,columns,theclass,save_path): # 保存模型 with open (filename, 'w') as f: f = tree.export_graphviz (decision_tree, out_file=f) dot_data = tree.export_graphviz (decision_tree, out_file=None, feature_names=columns, class_names=theclass, filled=True, rounded=True, special_characters=True) graph = pydotplus.graph_from_dot_data (dot_data)
分類結果
鳶尾花分類結果:
image
"能找到對象的男生"特征分類結果:
image
結果說明:
從決策樹的結果分類來看:對于區分鳶尾花類型,花瓣的寬度是最核心屬性。而且在決策樹深度為4的條件下:僅有3個樣本未完全區分開,其余的gini指數都為0,保證了完全區分。
而在根據男生特征對是否有女朋友的判斷中,不同于我們上次貝葉斯分類得出的判斷,只要是數學專業的男生無論身高特征幾乎都是有女朋友的,而在分類樹中身高的高低是最重要的判定因素,更加符合我們的常識判斷。
總結
以上是生活随笔為你收集整理的python决策树怎么选择_【机器学习+python(8)】分类决策树的介绍与实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 史上仅发行了两次!2020年特别国债再度
- 下一篇: 支付宝商家收款码怎么申请