決策樹
什麼是決策樹?
決策樹能夠當作一系列if-then的規則,這個很好理解
也能夠當作是條件機率分佈,
X爲特徵,x1,x2
Y爲分類,1,-1
那麼對於每一個葉節點,至關於對於每一個通過的中間結點的條件機率
當x1=a,x2=b的時候爲1分類的機率>0.5,則認爲是1分類算法
決策樹學習
決策樹學習的本質是從訓練數據集上概括出一組分類規則
但與訓練集不相矛盾的決策樹可能有多個,也可能一個都沒有
咱們的目標是找到一個和訓練集矛盾較小,且具備很好的泛化能力的決策樹(注意不要求沒有矛盾,要防止overfit)
決策樹學習的損失函數一般是正則化的極大似然函數,可是基於損失函數找到全局最優決策樹是NP徹底問題
因此實際使用的算法一般採用啓發式的方法,即局部最優
具體作法就是,每次選擇feature時,都挑選擇當前條件下最優的那個feature做爲劃分規則,即局部最優的feature函數
決策樹學習一般分爲3個步驟:特徵選擇,決策樹生成和決策樹的修剪學習
特徵選擇
前面已經說了,選擇特徵的標準是找出局部最優的特徵
那麼問題是若是判斷一個特徵對於當前數據集的分類效果?即以這個特徵進行分類後,數據集是否更近有序(不一樣分類的數據被儘可能分開),仍是仍然很混亂?
這裏要使用熵(entropy)和信息增益編碼
參考http://zh.wikipedia.org/wiki/%E7%86%B5_%28%E4%BF%A1%E6%81%AF%E8%AE%BA%293d
信息量
信息量有這個事件發生的機率所決定,常常發生的事件是沒有什麼信息量的,好比你每天要吃飯,這個你們都知道。
只有小几率事件纔有信息量,好比馬航失蹤這種突發新聞,因此信息量的定義以下
以2爲底,單位是bit,以e爲底,單位是nat,以10爲底,單位是dit![]()
好比下面的例子,能夠看出漢字的信息量要遠遠大於英文字母的(固然現實中,不可能全部字出現的機率同樣,這裏只是爲了簡單處理說明問題)
這就意味着寫同一篇文章,漢字會更加簡短,固然學習門檻也會更高blog
信息熵
熵,就是信息量的指望![]()
熵起源於物理熱力學系統,表示無序程度,一樣在信息論中,熵表示對不肯定性的測量
若是有一枚理想的硬幣,其出現正面和反面的機會相等,則拋硬幣事件的熵等於其可以達到的最大值,這時候這個事件的熵爲1bit,而當拋出正面的機率變大或變小時不肯定性都會下降,極限狀況必定爲正或負時,沒有任何不肯定性,熵爲0![]()
數據壓縮也是基於熵理論,普通的編碼方式每一個字符都是8bit,很浪費,由於英文字母的熵在4.7bit左右,這個表示編碼的最小平均長度,好的無損壓縮算法應該能夠接近這個編碼長度事件
信息增益
表示得知特徵X的信息而使得類Y的信息的不肯定性減小的程度
分類前,數據中可能出現各類類的狀況,比較混亂,不肯定性強,熵比較高
分類後,不一樣類的數據獲得比較好的劃分,那麼在一個劃分中大部分是同一類的數據,比較有序,不肯定性下降,熵比較低
而信息增益用於描述這種熵的變化 get
下面給出計算信息增益的具體的公式,
H(D),直接根據公司計算
而H(D|A),D根據A分爲n份D1…Dn,那麼H(D|A)就是全部H(Di)的指望(平均值)it
用書中的例子來解釋一下,貸款申請訓練集,想建決策樹來輔助判斷是否能夠貸款
首先用哪一個特徵來劃分了是」年齡」,仍是」有工做」?
直接用上面的公式來計算信息增益來判斷
首先算下爲分類時的經驗熵,所謂經驗熵就是根據訓練數據算出的熵
這裏分別以A1,A2表示」年齡」」有工做」兩個特性,這裏爲了說明問題只考慮兩個特性
關於年齡的信息增益計算,樣本中青年,中年,老年各5個,而後每一個劃分中是否貸款比例分別爲,2:3,3:2,4:1。能夠直觀的看出劃分效果不明顯,因此算出的信息增益也確實很小
而對於有工做的,算出的信息增益要大不少,這也是符合直觀的判斷
因此若是要在這兩個特徵裏面選擇的話,應該選「有工做」
信息增益比
單純的信息增益只是個相對值,由於這依賴於H(D)的大小
因此定義信息增益比做爲更加客觀的度量
決策樹生成
先介紹ID3生成算法,這是最基本的算法
而C4.5只是把其中的信息增益換成信息增益比
算法很簡單,只是在每一個節點上選出信息增益最大的那個特徵進行劃分
直到信息增益小於闕值時中止
由於信息增益是相對值,因此這裏使用信息增益來比較闕值不合理
在C4.5中使用信息增益比來替代
決策樹的剪枝(pruning)
決策樹生成算法對於訓練集是很準確的,可是這樣會過擬合,因此須要經過剪枝(簡化過程)來提升泛化能力
剪枝的思路也很簡單,就是在決策樹對訓練數據的預測偏差和樹複雜度之間找到一個balance
預測偏差表示爲,即全部葉節點的經驗熵的和,其中Nt表示該葉節點的樣本點個數,而Ht(T)表示該葉節點的經驗熵
樹複雜度,由葉節點個數來表示,|T|
因此決策樹的學習損失函數定義爲,剪枝的標準就是極小化該損失函數
是調節參數,越大表示選擇更簡單的樹,而越小表示選擇複雜的對訓練集擬合度高的樹
剪枝的算法
很簡單,從葉節點往上回溯,比較剪掉該葉節點先後的損失函數的值,若是剪掉後,損失函數更小就剪掉
CART算法
這裏只看分類樹的相關算法,迴歸樹即輸出連續的case,參考原書
生成算法
和ID3兩點不一樣,
首先是二叉樹,好比對於年齡不是分爲青年,中年,老年,而是選一個子特性進行二分,好比青年,不是青年
再者,基於基尼指數,也是用於表示不肯定性,和熵相似
具體生成算法,仍是看前面那個例子,
對於年齡的每一個子特徵的gini指數
A2和A3都只有一個切分點
最後是A4的
最後,發現最優的切分點是
剪枝算法
CART的剪枝算法比較特別
首先樹上任意一個節點t,若是以t爲單節點樹(即意味着把t的子樹剪掉)的損失函數爲
以t爲根節點的子樹Tt的損失函數是
若是,不考慮樹複雜度,那麼必定是
,即不剪枝的狀況下,損失函數更小
可是隨着 不斷增大,必定會出現
,即剪不剪枝,損失函數相等,那麼還不如剪了讓樹簡單一點
此時,
固然若是過於大就沒有意義了,由於咱們須要balance對訓練集的擬合度以及樹的複雜度
因此算法是,
具體的說,對整個樹T0的每一個節點計算g(t),
先將g(t)最小的節點進行剪枝,產生子樹T1
而後再T1上再找到g(t)最小的節點進行剪枝。。。在這個過程當中g(t)是不斷變大的,最終剪到根節點Tn(單節點樹)
最終,