機器學習筆記(三):決策樹
決策樹(decision tree)是機器學習中最常見的方法之一,本文主要對決策樹的定義,生成與修剪以及經典的決策樹生成演算法進行簡要介紹。目錄如下
一、什麼是決策樹
二、決策樹的生成
三、決策樹的修剪
四、一些經典的決策樹生成演算法
一、什麼是決策樹
顧名思義,決策樹是基於樹結構來進行決策的。它每次從訓練樣本的若干屬性中選擇一項出來進行判定,並根據樣本在該屬性上的取值將樣本劃入不同的集合,之後進行下一輪決策,直到同一集合中的樣本都屬於相同類別為止。為便於理解,我們可以想象生活中的如下場景:一家企業準備招聘一名軟體工程師,但是卻收到了100份簡歷,那麼如何從這100份簡歷中篩選出進入面試的人選呢?這家公司的HR想出了一種方法:
第一輪篩選
首先看應聘者的學歷,本科以上直接通過,本科以下直接拒絕,剩下的本科學歷的應聘者待定進入第二輪篩選。
第二輪篩選
應聘者的本科院校是否為985/211重點高校?是的話則pass,不是的話再進入第三輪篩選。
第三輪篩選
應聘者專案經驗是否豐富?是的話pass,不是的話淘汰。
就這樣,通過三輪篩選HR成功地從100位應聘者中篩選出了進入面試的人選。這個過程中HR用到的方法就是決策樹,我們可以將這種方法表示成下面的圖片以更直觀地瞭解。
二、決策樹的生成
在上一節的定義中我們可以發現決策樹主要由“用來判別的特徵(屬性)”和“不同的分類集合”構成。因此決策樹的構成通常是一個遞迴地選擇特徵,並根據該特徵對訓練資料進行分割,使得各個子資料集有一個最好的分類的過程。這一過程對應著對特徵空間的劃分,也對應著決策樹的構建。由於不同的特徵對訓練資料的劃分能力不同,有時將劃分能力強的特徵先應用可以大大縮減決策樹的高度與計算複雜度,比如在上面的例子中如果HR將畢業院校作為第一輪篩選的特徵,那麼後面的篩選也許就不需要“學歷”這一特徵了(考慮到絕大多數本科以上學歷的應聘者都畢業於985/211高校),這樣原本三輪的篩選,只需要兩輪就能完成,因此我們構造決策樹進行特徵選址時應該選擇最優的特徵。
更具體地我們可以把決策樹的生成過程概括為以下四個步驟:
1) 開始:構建根節點,將所有訓練資料都放在根節點,選擇一個最優特徵,按著這一特徵將訓練資料集分割成子集,使得各個子集有一個在當前條件下最好的分類。
2) 如果這些子集已經能夠被基本正確分類,那麼構建葉節點,並將這些子集分到所對應的葉節點去。
3)如果還有子集不能夠被正確的分類,那麼就對這些子集選擇新的最優特徵,繼續對其進行分割,構建相應的節點,如果遞迴進行,直至所有訓練資料子集被基本正確的分類,或者沒有合適的特徵為止。
4)每個子集都被分到葉節點上,即都有了明確的類,這樣就生成了一顆決策樹。
從上面的過程中不難看出,在決策樹的生成中最核心的是選擇最優特徵,那麼怎樣的特徵才算是最優特徵呢?一般而言,我們希望經過每一次劃分後,決策樹的分支節點所包含的樣本儘可能屬於同一類別,即結點的“純度”越來越高。所以最優特徵是使劃分後的結點純度最高的特徵。那麼如何衡量“純度”?這裡便涉及到了“資訊熵”的相關理論與知識。
“資訊熵”是度量樣本集合純度最常用的一種指標。假設當前樣本集合D中第k類樣本所佔比例為pk(i=1,2,…,|y|),則D的資訊熵定義為
H(X)的值越小,則X的純度越高。
知道了資訊熵的概念後,我們解決了衡量集合“純度”的問題,但是一個特徵往往會劃分出好幾個集合,如果這些集合的“純度”各不相同,我們又該如何判斷這個特徵是最優還是其他特徵是最優呢?對於這個問題我們很容易想到的辦法就是,對不同集合的純度進行加權平均,樣本多的集合權重大,樣本少的集合權重小。沒錯!這種思想正是決策樹中“資訊增益”的源頭。
假定離散屬性a有V個可能的取值{a1,a2,…,av},若使用a來對樣本集合D進行劃分,則會產生V個分支節點,其中第v個分支點包含了D中所有在屬性a上取值為av的樣本,記為D(v)。我們可根據上面計算資訊熵的式子計算出各個結點的資訊熵,然後按照不同分支結點所包含的樣本數,給結點賦予權重|D(v)|/|D|,即樣本數越多的分支結點的影響越大,於是可以計算出用屬性a對樣本集D進行劃分所獲得的“資訊增益”(information gain)。
一般而言,資訊增益越大,則意味著使用屬性a來進行劃分所獲得的“純度提升”越大。因此,我們可用資訊增益來進行決策樹的劃分屬性選擇。
三、決策樹的修剪
剪枝(pruning)是決策樹學習演算法對付”過擬合“的主要手段。在決策樹學習中,為了儘可能正確分類訓練樣本,有時會產生特徵選擇太多、決策樹分支過多的情況,這不僅降低了決策樹的效率,還存在過擬合的風險,使得訓練出的模型泛化效能不高。為了解決這個問題,我們可以主動去掉決策樹的一些分支來降低過擬合的風險。
決策樹剪枝的基本策略有”預剪枝“(prepruning)和”後剪枝“(post-pruning)。
預剪枝是指在決策樹生成過程中,對每個節點在劃分前進行估計,若當前的劃分不能帶來決策樹泛化效能提升,則停止劃分並將當前節點標記為葉節點;
後剪枝是先從訓練集生成一顆完整的決策樹,然後自底向上的對非葉節點進行考察,若將該節點對應的子樹替換為葉節點能帶來決策樹泛化效能提升,則將該子樹替換為葉節點。
剪枝處理降低了”過擬合“風險,但也帶來了”欠擬合“的風險。
一般情形下,後剪枝決策樹欠擬合風險較小,泛化效能往往優於預剪枝決策樹。但後剪枝訓練開銷比未剪枝決策樹和預剪枝決策樹都要大很多。
四、一些經典的決策樹生成演算法
1、ID3
ID3演算法的核心是在決策樹各個結點上對應資訊增益準則選擇特徵,遞迴地構建決策樹。
具體方法是:
1)從根結點(root node)開始,對結點計算所有可能的特徵的資訊增益,選擇資訊增益最大的特徵作為結點的特徵。
2)由該特徵的不同取值建立子節點,再對子結點遞迴地呼叫以上方法,構建決策樹;直到所有特徵的資訊增益均很小或沒有特徵可以選擇為止;
3)最後得到一個決策樹。
ID3相當於用極大似然法進行概率模型的選擇
2、C4.5
4.5是對ID3演算法的一個改進,主要改進點就是解決了ID3的幾個缺點。首先C4.5演算法用的是資訊增益率來代替ID3中的資訊增益。這麼做其實就是弱化那些偏向,讓選擇最優特徵時更加公平。另外C4.5的改進就是可以處理連續值(這個方法其實和上面我提到的連續值離散化很類似,可以理解為單點逐一離散化),具體步驟如下:
1)首先對於連續值屬性的值進行排序(A1,A2......An);
2)我們可以在每兩個值之間取一個點,用這個點就可以把該組連續值分為兩部分,比如我們去一個點a1($A1<a1<A2$),則小於a1的部分(A1)大於a1的部分(A2......An)。但是這個a1好嗎?不知道呀!那我們loop一下所有這樣的a(共有n-1個),每一個ai我們可以算出分裂前後的資訊增益率,然後我們求一個max即可。很簡單吧!思路很好,但是呀很顯然有個問題,時間開銷有點大。
3)缺失值的處理,ID3不能直接處理(需要我們人工處理,比如單獨賦值或賦一個平均值),C4.5給出了一個很優雅的方式,為什麼說優雅,這樣講吧!我們每一個特徵的取值都有若干個,根據訓練集每個可能的取值都有一個概率,我們用這個概率來表示這個確實值得可能取值。這樣就顯得很合理了。
C4.5各方面完勝ID3,所以C4.5一出現就被廣泛應用,後面為了解決這個演算法的時間開銷問題,推出了這個演算法的改進版C5.0,大體上C5.0的速度是C4.5的10倍以上。
參考文獻
- 周志華《機器學習》
- OverFitting,https://www.cnblogs.com/wenyi1992/p/7685131.html