机器学习算法总结--决策树
簡介
定義:分類決策樹模型是一種描述對實例進行分類的樹形結構。決策樹由結點和有向邊組成。結點有兩種類型:內部結點和葉結點。內部結點表示一個特征或屬性,葉結點表示一個類。
決策樹學習通常包括3個步驟:特征選擇、決策樹的生成和決策樹的修剪。
決策樹學習本質上是從訓練數據集中歸納出一組分類規則,也可以說是由訓練數據集估計條件概率模型。它使用的損失函數通常是正則化的極大似然函數,其策略是以損失函數為目標函數的最小化。
決策樹學習的算法通常是一個遞歸地選擇最優特征,并根據該特征對訓練數據進行分割,使得對各個子數據集有一個最好的分類的過程。
決策樹的生成對應于模型的局部選擇,決策樹的剪枝對應于模型的全局選擇。決策樹的生成只考慮局部最優,相對地,決策樹的剪枝則考慮全局最優。
特征選擇
特征選擇的準則通常是信息增益或者信息增益比。
首先是給出信息熵的計算公式H(p)=?∑ni=1pilogpi,熵越大,隨機變量的不確定性就越大。公式中pi表示隨機變量X屬于類別i的概率,因此n表示類別的總數。
條件熵的定義為:H(Y|X)=∑ni=1piH(Y|X=xi)
已經有了熵作為衡量訓練樣例集合純度的標準,現在可以定義屬性分類訓練數據的效力的度量標準。這個標準被稱為“信息增益(information gain)”。簡單的說,一個屬性的信息增益就是由于使用這個屬性分割樣例而導致的期望熵降低(或者說,樣本按照某屬性劃分時造成熵減少的期望,個人結合前面理解,總結為用來衡量給定的屬性區分訓練樣例的能力)。更精確地講,一個屬性A相對樣例集合S的信息增益Gain(S,A)被定義為:
其中 Values(A)是屬性A所有可能值的集合,Sv是S中屬性A的值為v的子集,注意上式第一項就是原集合S的熵,第二項是用A分類S后的熵的期望值,第二項描述的期望熵就是每個子集的熵的加權和,權值為屬性Sv的樣例占原始樣例S的比例|Sv|/|S|,所以Gain(S,A)是由于知道屬性A的值而導致的期望熵減少,換句話來講,Gain(S,A)是由于給定屬性A的值而得到的關于目標函數值的信息。
信息增益的缺點是存在偏向于選擇取值較多的特征的問題。為了解決這個問題,可以使用信息增益比。
因此,特征A對訓練數據集D的信息增益比gR(D,A)的定義如下:
其中 g(D,A)是信息增益,而 HA(D)=?∑ni=1|Di||D|log2|Di||D|,其中 n是特征A取值的個數。
不過對于信息增益比,其也存在對可取值數目較少的屬性有所偏好的問題。
決策樹的生成
接下來會介紹決策樹生成的算法,包括ID3, C4.5算法。
ID3算法
ID3算法的核心是在決策樹各個結點上應用信息增益準則選擇特征,遞歸地構建決策樹。具體步驟如下所示:
ID3的算法思路總結如下:
1. 首先是針對當前的集合,計算每個特征的信息增益
2. 然后選擇信息增益最大的特征作為當前節點的決策決策特征
3. 根據特征不同的類別劃分到不同的子節點(比如年齡特征有青年,中年,老年,則劃分到3顆子樹)
4. 然后繼續對子節點進行遞歸,直到所有特征都被劃分
C4.5算法
C4.5算法繼承了ID3算法的優點,并在以下幾方面對ID3算法進行了改進:
- 用信息增益率來選擇屬性,克服了用信息增益選擇屬性時偏向選擇取值多的屬性的不足;
- 在樹構造過程中進行剪枝;
- 能夠完成對連續屬性的離散化處理;
- 能夠對不完整數據進行處理。
C4.5算法有如下優點:產生的分類規則易于理解,準確率較高。
其缺點是:在構造樹的過程中,需要對數據集進行多次的順序掃描和排序,因而導致算法的低效。此外,C4.5只適合于能夠駐留于內存的數據集,當訓練集大得無法在內存容納時程序無法運行。
算法的實現過程如下:
實際上由于信息增益比的缺點,C4.5算法并沒有直接選擇信息增益比最大的候選劃分屬性,而是先從候選劃分屬性中找出信息增益高于平均水平的屬性,再從中選擇信息增益比最高的。
剪枝
在生成樹的過程中,如果沒有剪枝的操作的話,就會長成每一個葉都是單獨的一類的樣子。這樣對我們的訓練集是完全擬合的,但是對測試集則是非常不友好的,泛化能力不行。因此,我們要減掉一些枝葉,使得模型泛化能力更強。
根據剪枝所出現的時間點不同,分為預剪枝和后剪枝。預剪枝是在決策樹的生成過程中進行的;后剪枝是在決策樹生成之后進行的。
決策樹的剪枝往往是通過極小化決策樹整體的損失函數或代價函數來實現的。簡單來說,就是對比剪枝前后整體樹的損失函數或者是準確率大小來判斷是否需要進行剪枝。
決策樹剪枝算法有多種,具體參考決策樹剪枝算法這篇文章。
CART
分類回歸樹(Classification And Regression Tree)是一個決策二叉樹,在通過遞歸的方式建立,每個節點在分裂的時候都是希望通過最好的方式將剩余的樣本劃分成兩類,這里的分類指標:
分類樹的生成步驟如下所示:
簡單總結如下:
基尼指數的計算公式為Gini(p)=1?∑Kk=1p2k。K是類別的數目, pk表示樣本屬于第k類的概率值。它可以用來度量分布不均勻性(或者說不純),總體的類別越雜亂,GINI指數就越大(跟熵的概念很相似)。
給定一個數據集D,在特征A的條件下,其基尼指數定義為Gini(D,A)=∑ni=1|Di||D|Gini(Di)。
回歸樹:
回歸樹是以平方誤差最小化的準則劃分為兩塊區域
遍歷特征計算最優的劃分點s,
使其最小化的平方誤差是:min{min(∑R1i((yi?c1)2))+min(∑R2i((yi?c2)2))}
計算根據s劃分到左側和右側子樹的目標值與預測值之差的平方和最小,這里的預測值是兩個子樹上輸入xi樣本對應yi的均值
找到最小的劃分特征j以及其最優的劃分點s,根據特征j以及劃分點s將現有的樣本劃分為兩個區域,一個是在特征j上小于等于s,另一個在在特征j上大于s
進入兩個子區域按上述方法繼續劃分,直到到達停止條件
關于CART剪枝的方法可以參考決策樹系列(五)——CART。
停止條件
關于特征與目標值
決策樹的分類與回歸
- 分類樹
輸出葉子節點中所屬類別最多的那一類 - 回歸樹
輸出葉子節點中各個樣本值的平均值
理想的決策樹
解決決策樹的過擬合
優缺點
優點:
缺點:
代碼實現
使用sklearn中決策樹函數的簡單代碼例子如下所示:
#Import Library #Import other necessary libraries like pandas, numpy...from sklearn import tree #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset# Create tree object model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini # model = tree.DecisionTreeRegressor() for regression# Train the model using the training sets and check score model.fit(X, y) model.score(X, y)#Predict Output predicted= model.predict(x_test)決策樹的代碼在開源庫OpenCV中有實現,具體的源碼分析可以參考Opencv2.4.9源碼分析——Decision Trees,這篇文章也比較詳細總結了決策樹的知識點以及對OpenCV中決策樹部分的源碼進行了分析。
總結
以上是生活随笔為你收集整理的机器学习算法总结--决策树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员获取编程灵感的10 种方式
- 下一篇: 借助ZFBrowser插件实现Unity