python决策树怎么选择_机器学习|决策树分类与python实现
目錄:
1.決策樹簡介
2.決策樹生成
a) 選擇標準——熵
b) 信息增益——ID3算法
c) 信息增益率——C4.5算法
d) Gini系數——CART算法
e) 評價標準——評價函數
3.剪枝操作
a) 預剪枝
b) 后剪枝
4.決策樹的集成——隨機森林
5.Sklearn構造決策樹
a) 數據包介紹
b) 5行代碼構造決策樹
c) 參數簡介
1.決策樹簡介
決策樹概念:決策樹(Decision Trees)是一種非參監督學習方法,即沒有固定的參數,對數據進行分類或回歸學習。決策樹的目標是從已知數據中學習得到一套規則,能夠通過簡單的規則判斷,對未知數據進行預測。這里我們只討論決策樹分類的功能。
決策樹組成:根節點、非葉子節點(也叫決策點、子節點、內部節點)、分支(有向邊)、葉子節點(葉節點)。其中非葉子節點是一個分支的終點,無法繼續分離。
決策流程:所有的數據,從根節點開始,根據某一特征的條件進行分配,進入不同的子節點,不斷遞歸,最終到達葉子節點停止。例如下圖是一個判斷一家人誰愛玩游戲的決策樹。
2.決策樹的生成
a.選擇標準——熵
決策樹很重要的一個問題是選擇什么條件和特征來進行分類。舉個相親的例子:當決定是否要與一個相親的對象見面時,會有一些硬性的標準,比如年齡、長相等,也有一些次要的條件,比如是否是公務員等。和這些標準一樣,決策樹中也要選擇重要的條件和特征進行分類,這種重要性用熵來表示。
熵(entropy):在高中化學中表示物體內部的混亂程度。在概率統計中,表示隨機變量不確定性的程度。熵越大,越不確定;熵越接近于0,越確定。舉個數組的例子。現在有AB兩個數組:
A=[1,2,3,4,2,3,5]
B=[1,1,1,1,2,1,2]
A中數字多,且混亂,而B中主要都是1,偶爾出現2,那么就說A比較混亂,不確定性大,B比較整潔,比較確定。那么A的熵值高,B的熵低。在決策樹中,我們希望數據經過一個分支分類后,盡量被分離得清晰整潔,像B一樣。熵用數學公式來表達如下:
它表示選用某個特征條件進行分類后,分類結果的混亂程度。其中P代表一個條件下發生的概率。P=0時,定義熵H=0。所以無論P接近0或者1,H都接近0,此時數據結論趨向一致,混亂度低。例如將B數組進行分類,得到[1,1,1,1,1]和[2,2]兩個葉子節點,那么根節點的熵為:
有了衡量標準,那么構造決策樹的思路也就有了:隨著樹深度的增加,讓節點熵迅速降低。省略掉一些沒有實際意義的特征,最終得到一棵最矮的決策樹。那么就產生了ID3算法。
b.信息增益——ID3算法
舉個分類的例子
在outlook中,一共有14種情況,9個yes和5個no,那么根節點的信息熵為:
經過分類后,形成了三個葉子節點,此時相當于已知兩個隨機變量X,Y,求聯合概率分布下的熵:
根據此公式,先計算各葉子節點中的熵:
Outlook=sunny時,H1=0.971
Outlook=overcast時,H2=0
Outlook=rainy時,H3=0.971
再計算分類后的熵:5/140.971+4/140+5/14*0.971=0.693
這樣熵下降了:0.940-0.693=0.247
分類前與分類后,熵的差值,叫做信息增益:
**
**
它表示特征A對訓練集D的信息增益。因此,我們計算各個分類方法的信息增益,選出最gain(D,A)最大的作為分類條件,即可讓總體的熵下降最快。這也是ID3算法的核心思想。
c.信息增益率——C4.5算法
但是信息增益也有行不通的時候。舉一個極端的反例。假設每個樣本都帶有一個不重復的ID,用這些ID作為分類條件,可以一步就完成分類,這種分類方法的熵為0,信息增益很大。但是用這種條件進行分類顯然是不靠譜的。因此,可能存在某個條件,分出的種類非常多,每個種類的樣本非常少。為了解決這個問題,提出了信息增益率(也叫信息增益比),它等于信息增益除以自身熵:
**
**
如果分類很快,分布很廣的情況發生,雖然方法的信息增益較大,但是自身的熵也會很大,信息增益與自身熵的比就會很小。因此,使用信息增益率來作決策,能夠有效地排除上述這種特殊情況。
d.Gini系數——CART算法
同樣,Gini系數也是越小,總體越穩定。基于Gini系數最小的原則,產生了CART算法。
e.評價標準——評價函數
在決策樹構建完成后,需要評價構建的效果。這個評價效果是由決策樹每個葉子節點決定的。
H(t):每個葉子節點的熵值。
Nt:葉子節點上總共的樣本數。
3.剪枝操作
當決策樹訓練完成后,并不是分完就完成了。如果分的太細,可能會出現過擬合的情況。當對未知數據進行分類時,效果可能不好。這時就需要剪枝操作。剪枝操作分兩種,分別是預剪枝(前置剪枝)和后剪枝(后置剪枝)。
a.預剪枝
在構建時,加入一些條件,在訓練過程中控制決策樹的大小。此方法用的較多。預剪枝方法如下:
指定最大深度。當達到設定深度后,停止剪枝。
指定節點最小樣本數量,當小于某個值時,停止剪枝。
b.后剪枝
在決策樹構建完成后,對樹進行剪枝操作。此方法使用較少。某個節點如果不進行分割時,損失值為:
Cα(T)=C(T)1+α
進行分割后,損失值為:
Cα(T)=C(T)2+α|Tleaf|
哪個損失值低,就采用哪個方法。參數α比較大時,限制比較嚴,α比較小時,限制較弱。
4.決策樹的集成——隨機森林
只構造一棵樹的時候,可能因為部分錯誤數據,或某些不重要的特征,造成樹過擬合或出現誤差。因此可以通過構造很多樹,共同來進行決策,降低錯誤發生的概率。這種集成的算法叫做隨機森林。
隨機有兩層含義。第一,有放回的隨機采樣。假設有100個數據,隨機有放回采樣60個進行訓練。這樣能減少離譜數據和錯誤數據對樹造成影響。第二,在特征上也進行隨機選擇,假設共有10個特征,每棵樹隨機選5個特征進行分類,降低不重要的特征對樹造成影響。
森林:訓練許多棵樹,例如訓練20棵。把新的數據分別用這20棵樹進行預測,結果遵循少數服從多數的原則,采用20棵樹中結果概率最大的分類。
5.sklearn建立決策樹:
在sklearn庫中,提供了決策樹分類方法。大致的步驟是:導入數據→訓練模型→預測數據。
a.自帶數據包介紹
Sklearn中自帶了一些基礎的數據集,可供大家練手。例如iris鳶尾花數據集、digits手寫數字數據集、boston波士頓房價數據集。它們存放在sklearn.datasets中,只要導入,就可以使用了。
from sklearn import datasets
iris = datasets.load_iris()
boston = datasets.load_boston()
這些數據集有點類似于字典,存儲了所有的,包括樣本、標簽、元數據等信息。樣本數據存儲在.data中,它是一個二維數組,兩個維度分別是各樣本和各樣本的特征,大小為[n_samples, n_features]。對應標簽存儲在.target中,大小為[n_samples]。因此,可以使用.data和.target可以查看樣本和標簽。
print (iris.data)
print (iris.target)
b.五行代碼構造決策樹
以iris數據集為例,鳶尾花數據集中包括了3個品種的150朵鳶尾花的數據,數據有4個特征,分別是花瓣和花萼的長度和寬度。以這組數據為例,使用sklearn對150個數據進行分類。我們要設置一個決策樹的學習器,并根據需要設置參數。學習器也可以是其他類型,例如支持向量機、線性回歸等。
from sklearn import tree
clf = tree.DecisionTreeClassifier()
學習器設置完畢后,依次對模型進行擬合與預測。讓學習器對數據進行擬合使用.fit函數,預測使用.predict函數。
clf = clf.fit (iris.data[:-2],iris.target[:-2])
clf.predict (iris.data[-2:])
以上代碼將數據集分成了兩部分,從頭開始到倒數第二個值作為訓練樣本,訓練完畢后,將最后兩個值作為未知樣本,進行預測。其中[:-2]表示從頭到倒數第二個值,[-2:]最后兩個值。完整代碼如下:
from sklearn import datasets,tree
iris = datasets.load_iris()
clf = tree.DecisionTreeClassifier()
clf = clf.fit(iris.data[:-2],iris.target[:-2])
print (clf.predict(iris.data[-2:]))
同樣的,對于隨機森林,一段簡單的操作代碼如下:
from sklearn.ensemble import RandomForestClassifier
from sklearn import datasets
iris =datasets.load_iris()
clf=RandomForestClassifier(n_estimators=5)
clf =clf.fit(iris.data[:-2],iris.target[:-2])
print (clf.predict(iris.data[-2:]))
c.參數簡介
以上是使用sklearn構造的簡單的模型。而sklearn.tree.DecisionTreeClassifier()這個類的構造代碼如下:
class sklearn.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_split=1e-07, class_weight=None, presort=False)
以下是一些參數簡介。
criterion:建立劃分標準:例如gini系數、熵值劃分等
splitter:best或random,best是找到最好的切分點,random進行隨機的選擇。
max_features:最多選多少個特征。特征少的時候不用設置。
max_depth:指定樹最大深度是多少。避免數據太多時太龐大。
min_samples_split:樹進行節點切分時,某個節點樣本個數少于此數值,就不再向下切分了。因為切的越多,越準確,但是過擬合的可能越大。
min_samples_leaf:限制葉子節點最少的樣本數。如果葉子節點數目小于樣本數,則會和兄弟節點一起被剪枝。
min_weitht_fraction_leaf:權重項。每個葉子節點加一個權重。當權重乘以葉子節點樣本個數太小,則被剪枝。
max_leaf_nodes:最大的葉子節點數。
class_weight:樣本的權重項。處理不均衡的數據時,可以對這些數據進行權重預處理。
min_impurity_split:限制決策樹的生成。切分后,如果gini系數等參考標準變化小于此值,停止切分。
還有一些優化問題和準確度計算等方面的內容,以后再和大家討論。
總結
以上是生活随笔為你收集整理的python决策树怎么选择_机器学习|决策树分类与python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 连云港美食排行榜有哪些?
- 下一篇: escplise使用教程_eclipse