決策樹分類算法剖析

面試中,大家不僅要懂得目前比較流行的深度學習算法,對於傳統的分類和聚類算法也要了解一些。在實際應用中也不是所有的深度學習算法就是萬能的,訓練時間久、可解釋性差都可能會阻礙在工業界的使用,很多情況下還是需要用到傳統的分類和聚類算法。

十二年前就接觸到LR和Bayes,然後是K-mean、KNN、決策樹、隨機森林、SVM、adaboost、xgboost等各種各樣的分類和聚類算法,不過當時只是做項目或者競賽直接應用了,沒有把自己的理解寫下來,也是忘了的差不多,發現還是需要寫下來整理一下,方便後面回顧。

監督學習和無監督學習

監督學習(Supervised Learning)和無監督學習(Unsupervised Learning)是數據挖掘和機器學習必須要了解的兩個概念,這兩個概念不瞭解,那真的是無輪之車走不遠。除了監督學習和無監督學習,又延伸出了半監督學習(Semi-supervised Learning)。

監督學習是給定了標註好的訓練數據,根據標註好的數據進行模式識別的過程,一般分類分析會用到監督學習比較多。要求必須事先知道各個類別的信息,並且斷言所有待分類的項都有一個類別,但是這種假設在很多時候不一定成立,特別是當數據量比較大的時候,需要通過預處理才能滿足分類算法的要求,代價會比較大,就要考慮無監督學習或者半監督學習。常見的分類算法有決策樹分類、樸素貝葉斯分類、基於支持向量的分類器、神經網絡分類、KNN(K近鄰)分類、模糊分類。這裏需要注意一點,分類是一種監督學習,但是並不是監督學習就是要做分類,也有些監督學習不是做分類的,比如相似性學習、特徵學習等也是監督學習,但是不是進行分類。

而無監督學習則是訓練數據是未標註,不需要對於數據事先打上標籤。我們所說的聚類算法屬於無監督學習,聚類的時候,我們並不關心具體的類是什麼,只是把相似的東西聚在一起。所以聚類分析,一般我們只要知道怎麼計算要聚類個人的相似就可以開始工作了。常見的聚類方法有:K-MEANS(K均值)聚類,屬於劃分法的K-MEDOIDS和CLARANS算法,屬於層次法的BIRCH算法、CURE算法、CHAMELEON算法等,基於密度的DSCAN算法、OPTICS算法、DENCLUE算法等,基於網格的STING算法、CLIQUE算法、WAVE-CLUSTER算法等,基於模型的方法等。

而半監督學習是介於監督學習和無監督學習之間,採用大量未標註的數據,並同時使用標註數據進行模式識別。半監督學習使用盡量少的人員投入且能夠獲得比較高的準備性,因此半監督學習也越來越受人重視。

下面着重介紹幾種算法。

1. 什麼是決策樹

決策樹就是依託於策略抉擇而建立起來的一棵樹,代表着對象屬性與對象值之間的一種映射關係,樹的每個葉子節點代表一個對象,樹的分叉節點代表某個屬性值。決策樹僅有單一的輸出。從數據到決策樹的學習稱爲決策樹學習,又直接被稱爲決策樹,其實就是基於分類和訓練的預測樹。

舉個簡單的例子,看下Tom M.Mitchell的機器學習力比較經典的例子,根據天氣情況明天是否去打球,可以把其中的數字認爲是想去和不想去打球的心理指數。

不考慮天氣的情況下,想去打球的佔9點,不想去的佔5點;如果明天晴天(太陽比較大),想打的佔2點,不想打佔3點;如果明天晴天的情況下,溼度小於等於70則去打球,但是心理指數只有2點;如果明天晴天而且溼度大於70,那麼肯定不想去打球了,不想去打球的心理指數佔3點。同樣的,如果明天陰天,就去打球,心理指數佔4點。如果明天下雨,則想打和不想打的心理指數佔3和2點;然後會考慮是否有風,如果有風,則不去打球,心理指數爲2;如果沒有風,則去打球,心理指數爲3。

我們發現決策樹的每一層的想打綜合等於上一層的想打的指數;不想打的總和也同樣等於上層的不想打的指數。上面決策樹的表達式可以寫爲:

Outlook = (Sunny ^ ( Humidity<=70 )) V ( Overcast )V ( Rain ^ Wind=FALSE )

對於上面的例子,我們選擇了幾個準則進行一步步的判斷,然後得到最終的接口,但是爲什麼選擇天氣、溼度、風這三個規則呢?爲什麼要先考慮天氣,然後考慮溼度呢?

舉個簡單的例子,你收集到了一批照片,想快速的通過照片上的特徵判斷是男孩還是女孩。有人說根據頭髮長短判斷就可以了,女孩頭髮長,男孩頭髮短;也有人說,根據穿衣打扮,女孩穿裙子,男孩穿長褲;當然也有人看的比較細緻,可以根據是否打耳洞判斷,女孩有耳洞,男孩沒有耳洞。我們發現可以簡單用頭髮長短劃分生成一個比較簡單的決策樹,劃分的依據就是頭髮長短。當然也可以根據其他規則生成一個決策樹,但是我們發現這些規則都沒有辦法一下子決定是男孩還是女孩,這個時候就要考慮對於決策樹的生成規則,我們不能保證生成的決策樹就是萬能的且100%準確的,只能說越接近100%的分類準確率越好。那怎麼選擇指標,優選使用哪個?就需要一個評價標準來衡量分類效果。

量化分類效果的方式比較多,常用的有信息增益(在ID3中應用)、信息增益率(在C4.5中應用)、基尼係數(在CART中應用)等。

對於信息增益及信息增益率的計算離不開熵的概念,可以參考熵的計算方法:簡單理解熵的概念

下面簡單介紹一下ID3、C4.5、CART

2. 決策樹 - ID3算法

ID3是決策樹的一種經典算法,ID3的思想來自於:奧卡姆剃刀,可以先了解一下奧卡姆剃刀。

奧卡姆剃刀(Occam's Razor, Ockham's Razor),又稱爲“奧坎的剃刀”,意思是簡約之法則,是由14世紀的邏輯學家、聖方濟各會修士奧卡姆的威廉提出的一個解決問題的法則:切勿浪費較多東西,去做‘用較少的東西,同樣可以做好的事情’。換一種說法,如果關於同一個問題有許多種理論,每一種都能作出準去的預言,那麼應該挑選其中使用假定最少的。儘管越複雜的方法通常能夠作出的越好的預言,但是在不考慮預言能力(即結果大致相同)的情況下,假設越少越好。

ID3算法(Iterative Dichotomiser 3, 迭代二叉樹3代)是又Ross Quinlan發明的一種用於決策樹的算法,這個算法便是建立在奧卡姆剃刀的基礎上:決策樹越小越好。當然這個算法也不是總能夠生成最小的樹形結構,而是一種啓發式算法。從信息論的角度講,期望信息越小,信息的增益越大,從而純度越高,熵就會越低。ID3算法的核心就是信息增益度量屬性的選擇,選擇分裂後信息增益最大的屬性進行分裂,採用自頂向下的貪婪搜索遍歷可能的決策樹空間。

ID3算法的僞代碼如下:

主要思想如下:

1. 自頂向下的貪婪搜索遍歷可能的決策樹空間構造決策樹(這是ID3和C4.5)算法的基礎

2. 從“哪一個屬性將在樹的根節點被測試”開始

3. 使用統計測試來確定每個實例屬性單獨分類訓練樣例的能力,分類能力最好的屬性作爲樹的根節點測試(評判屬性分類能力好壞通過信息增益或則信息增益率)

4. 爲根節點屬性的每個可能的值產生一個分支,並把訓練樣例按照對應的屬性值排列到適當的分支之下

5. 把每個分支再次作爲根分支,重複上述步驟,用每個分支下關聯的的訓練樣例選取在該節點被測試的最近屬性

經過上面的步驟,就完成了對於決策樹貪婪搜索,算法從不回溯重新考慮之前已經做過的選擇。

我們看到上面的過程就是選擇一個最好的屬性作爲測試節點,那麼哪個屬性纔是最好的呢?這裏引入信息增益,而信息增益的度量標準就是:熵。

簡單理解熵

通常我們爲了量化分類效果的好壞,會引入信息增益(ID3)、信息增益率(C4.5)、基尼係數(CART)等。一般採用熵(Entropy)來度量信息增益。

ID3算法的核心思想就是以信息增益度量屬性的選擇,選擇分裂後能夠獲得最大信息增益的屬性進行分裂。信息增益(Information Gain)是用來衡量給定的屬性區分訓練樣例的能力。先了解一下信息增益相關聯的一個名詞“熵”(entropy),熵是信息論中廣泛使用的一個名詞,刻畫任意數據集的純度。假設一個二分類的問題,正反樣例集爲S,那麼這個數據集S相對於這個二分類的熵爲:

Entropy(S)\equiv -p_{\oplus}log_{2}p_{\oplus}-p_{\ominus}log_{2}p_{\ominus}\equiv -p_{\oplus}log_{2}p_{\oplus}-(1-p_{\oplus})log_{2}(1-p_{\oplus})

其中p_{\oplus}代表正樣例的先驗概率(統計概率,佔比),p_{\ominus}代表負樣例的先驗概率,在熵的計算中任務0log_{2}0= 0。

舉個例子對於人臉特徵區分男女的例子,樣本集S一共15個樣本,其中包括7個男生、8個女生,我們把樣本集S記爲:

S=[7_{\oplus}, 8_{\ominus}],那麼熵爲:

Entropy(S)=Entropy([7_{\oplus}, 8_{\ominus}]) \\\\=-\frac{7}{15}log_{2}\frac{7}{15}-\frac{8}{15}log_{2}\frac{8}{15} \\\\=-\frac{7}{15}log_{2}\frac{7}{15}-(1-\frac{7}{15})log_{2}(1-\frac{7}{15}) \\\\=0.9967

根據上面公式可以很容易得到如下結論:

1. 如果S所有的成員都屬於一類,那麼Entrop(S)=0

2. 如果S所有成員的正負例個數相等,那麼Entrop(S)=1

3. 如果S的正反例數量不等,那麼0 < Entropy(S) < 1

可以根據上面公式的正例和entropy的關係簡單畫出示意圖。

泛化一下,如果目標屬性包含n個不同的值,那麼S相對於n個狀態的分類熵定義爲:

Entropy(S)=\sum_{i=1}^{n}-p_{i}log_{2}p_{i},其中p_{i}爲第i個狀態的比率(統計概率)

信息增益Gain(S,A)

已知熵是衡量訓練樣例集合純度的標準,那麼我們就可以定義出屬性分類訓練數據的效力的度量標準:信息增益(Information Gain)。一個屬性的信息增益就是由於使用這個屬性分割樣例而導致的期望熵降低,或者說是按照某個屬性劃分時造成的熵減少的期望。屬性A相對於集合S的信息增益Gain(S,A)定義爲:

Gain(S,A)=Entropy(S)-\sum_{v\in V(A)}\frac{|S_{v}|}{|S|}Entropy(S_{v})

  • V(A)是屬性A的值域
  • S是樣本集合
  • S_{v}S中在屬性A上值等於v的樣本集合

通過上面的公式可知Gain(S,A)是由給定屬性A的值而得到的關於目標函數值的信息,當對於S的任意一個成員的目標值編碼時,Gain(S,A)的值是知道屬性A的值後可以節省的二進制位數。

結合熵裏面描述例子看看怎麼來計算這個信息增益,假設S包含15個樣本,其中7個男生,8個女生,記爲;其中男生中有2個高鼻子和女生中有4個高鼻子,其他均爲扁鼻子。按照屬性鼻子特徵分類15個樣本得到的信息增益計算如下:

Values(Nose)=High,Flat\\\\ S=[7_{\oplus},8_{\ominus}]\\\\ S_{Hight}\leftarrow [2_{\oplus},4_{\ominus}]\\\\ S_{Flat}\leftarrow [5_{\oplus},4_{\ominus}]\\\\ Gain(S,Nose)=Entropy(S)-\sum_{v\in{\left \{ High,Flat \right \}}}\frac{S_{v}}{S}Entropy(S_{v})\\\\ =Entropy(S)-(\frac{6}{15})Entrop(S_{High})-(\frac{9}{15})Entropy(S_{Flat})\\\\ =0.9967-(\frac{6}{15})0.9183-(\frac{9}{15})0.9911\\\\ =0.0347

同理,通過其他特徵臉型也會計算出來不同的信息增益,比如Gain(S,B)=0.0252,依次類推。我們發現Gain(S,A)>Gain(S,B),那麼在這一輪選擇中,我們會選擇信息增益最大的那個作爲分類,比如選擇的是A,那麼我們就根據A的{High, Flat}兩個特徵把樣本分成兩組,把這個特徵從特徵列表中去除,依次往下迭代。最終會形成一棵樹,即基於ID3的決策樹。

3. C4.5算法

C4.5算法其實是ID3算法的改進,是另一種比較經典的分類決策樹算法。理論和ID3差不多,基本構造方法依然是每次選擇一個好的特徵以及分裂點作爲當前節點的分類條件。那麼C4.5到底比ID3改進了哪些方面呢?

1. 用信息增益率來選擇屬性。ID3是採用的子樹的信息增益選擇的屬性,也就是熵的變化值,而C4.5用的是信息增益率;區別在於一個是信息增益,一個是信息增益率

2. 在樹構造過程中進行剪枝。在構造決策樹的時候,那些掛着比較少元素的節點,不考慮最好,不然容易導致overfitting

3. 對非離散數據也能處理

4. 能夠對不完整數據進行處理

那麼爲什麼用增益率呢?我們一般知道“率”是指一個相對值,比如概率、增長率、斜率等等都是基於某個值基礎上的一個比率。比如說北京高考總分是750分,江蘇高考總分是480分(只是以分數爲例,具體高考總分可以參考官方文檔),北京學生A考了600分,而江蘇學生B考慮450分,如果按考取分數計算,北京的考生肯定要比江蘇的考生考的好,但是江蘇的考生肯定覺得不公平。如果按照考試的總分比北京學生考的成績效果應該是P1= 600/750=0.8,而那位江蘇的同學成績效果應該是P2=450/580=0.9375,很明顯江蘇的那個同學考的好一點。同理,C4.5克服了ID3採用信息增益選擇屬性時偏向選擇取值多的屬性的不足。

信息增益率

下面看下信息增益率的計算,信息增益率是基於前面的信息增益量Gain(S,A)和分裂信息度量SplitInformation(S,A)共同定義:

GainRatio(S,A)=\frac{Gain(S,A))}{SplitInformation(S,A)}

Gain(S,A)可以通過前面介紹的公式獲得,那麼SplitInformation(S,A)的計算公式如下:

SplitInformation(S,A)=-\sum_{i=1}^{c}\frac{|S_{i}|}{|S|}log_{2}\frac{|S_{i}|}{|S|}

其中S_{1}S_{c}是根據屬性A的c個值域(屬性A的值值域空間大小爲c)分隔的樣本子集,這裏分裂信息是S關於屬性A的各個值的熵。

分裂信息會阻礙把樣本集分的更細的屬性被選擇。舉個例子,有一個含有n個樣本的集合被屬性A徹底分隔,剛好每個樣本是一組,這時分裂信息的值爲log_{2}n;如果屬性B把樣本集剛好分成兩類,那麼分裂信息值爲1;如果屬性C把樣本集僅分成一類,那麼分裂信息值就是0,此屬性對於分類並沒有作用,是不可取的。也就是說這裏要求選擇至少分爲2類的屬性,如果屬性A和屬性B產生同樣的信息增益,根據增益比率度量,則B屬性會分的更好點。

通過上面例子我們發現,當選擇屬性的時候S_{i}越接近於S,分裂信息越小,而GainRatio越大,當屬性A對於S的所有樣例都取幾乎同樣的值得話,那麼可能會到導致GainRatio未定義或者GainRatio非常大。爲了避免選擇這種屬性,可以採用一些啓發式規則,比如可以先計算每個屬性的增益,僅對那些增益高於平均值得屬性應用增益比率測試。

當然除了信息增益和信息增益率來度量分類效果外,也可以採用基於距離的度量,即定義一個數據劃分的距離尺度。

4. CART算法

CART算法全稱是Classification And Regression Tree,翻譯爲分類與迴歸樹。CART算法採用二分遞歸分割技術將當前樣本集分爲兩個子樣本集,使得生成的每個非葉子節點都有兩個分支。非葉子節點的特徵取值爲TRUE和FALSE,左分支取值爲TRUE,右分支取值爲FALSE,因此CART算法生成的決策樹是結構簡潔的二叉樹。

CART可以處理聯繫變量和離散型變量,利用訓練數據遞歸的劃分特徵空間進行建樹,用驗證數據進行剪枝。

  • 待預測的分類是離散性數據,則CART生成分類決策樹
  • 待預測的分類是連續性數據,則CART生成迴歸決策樹

CART分類決策樹算法

CART分類樹預測分類離散型數據,採用的Gini指數(選Gini指數最小的特徵s)作爲分裂的標準,同時也是包含後剪枝操作。ID3算法和C4.5算法雖然在對訓練樣本集的學習中可以儘可能多地挖掘信息,但其生成的決策樹分支較大。爲了簡化決策樹的規模,提高生成決策樹的效率,就出現了根據GINI係數來選擇測試屬性的決策樹算法CART。

基尼指數(Gini指數):又稱爲基尼不存度,表示在樣本集合中一個隨機選中的樣本被分錯的概率。

注意Gini指數越小表示集合被選中的樣本被分錯的概率越小,也就是說集合的純度越高;反之,集合越不純。

基尼指數(基尼不存度)= 樣本被選中的概率 * 樣本被分錯的概率

假設有K個分類,樣本點屬於第k個類的概率爲p_{k},則概率分佈的基尼指數定義爲:

Gini(p)=\sum_{k=1}^{K}p_{k}(1-p_{k})=1-\sum_{k=1}^{K}p_{k}^{2}

根據基尼指數的定義,假設樣本集合爲D,有K個分類,D_{k}表示數據集D中屬於第k類的樣本子集,則樣本集合D的基尼指數爲:

Gini(D)=1-\sum_{k=1}^{K}\left (\frac{|D_{k}|}{|D|}\right )^2

如果數據集D根據特徵A在某一取值a上進行分割,得到了集合D_{1}D_{2}兩部分,那麼在特徵A下,集合D的基尼係數如下:

Gain\_Gini(D,A)=\frac{|D_{1}|}{|D|}Gini(D_{1})+\frac{|D_{2}|}{|D|}Gini(D_{2}),其中:

基尼係數Gini(D)表示集合D的不確定,基尼係數Gini(D, A)表示特徵A=a分割後集合的不確定性。基尼係數越大,樣本集合的不確定越大。

對於屬性A,分別計算所有屬性值將數據集劃分爲兩部分之後的Gain_Gini,選取其中的最小值,作爲屬性A得到的最優二分方案。然後對訓練集D,再計算所有屬性的最優二分方案,選取其中最小值,作爲樣本及D的最優方案。

\underset{A\in Attribute}{min}(\underset{a\in Value(A)}{min}Gain\_Gini(D,A))

舉個例子:

名稱 體溫 胎生 水生 類標記
恆溫 哺乳類
巨蟒 冷血 爬行類
鮭魚 冷血 魚類
恆溫 哺乳類
冷血 有時 魚類
巨蜥 冷血 爬行類
蝙蝠 恆溫 哺乳類
恆溫 哺乳類
豹紋鯊 冷血 魚類
海龜 冷血 有時 爬行類
豪豬 恆溫 哺乳類
冷血 魚類
蠑螈 冷血 有時 兩棲類

針對上面的離散型數據,按照體溫特徵爲恆溫和非恆溫劃分。其中恆溫物種中包含5個哺乳類,2個鳥類;非恆溫的物種中包含3個爬行類、3個魚類、2個兩棲類,則D_{1}D_{2}的基尼係數爲:

Gini(D1)=1-[(\frac{5}{7})^2 + (\frac{2}{7})^2]=\frac{20}{49}=0.4082

Gini(D2)=1-[(\frac{3}{8})^2+(\frac{3}{8})^2+(\frac{2}{8})^2]=\frac{42}{64}=0.6463

我們可以進一步計算得出在體溫特徵下數據集的Gini係數:

Gain_Gini(D,temp)=\frac{7}{15}*0.4082+\frac{8}{15}*0.6463=0.1905+0.3447=0.5352

我們計算所有的特徵,選擇Gini最小的特徵。

5. 問題參考

1. 決策樹一般被應用於取值離散的場景,連續的特徵一般要處理成離散的然後英語與決策樹

2. 實際的應用中決策樹很容易出現overfitting的情況,一般會做boosting

3. 分類器的性能不好,很可能是選擇的特徵鑑別性不足,好的特徵纔能有好的分類效果,和分類器只是弱相關。那麼如何提到特徵的鑑別性呢?第一、可以在設計特徵向量時儘量引入domain knowledge;第二、對於提取出來的特徵做選擇、變換和再學習。當然這些不屬於機器學習算法要管的部分,而是數據預處理的部分。

參考:

https://blog.csdn.net/v_july_v/article/details/7577684

https://github.com/yingzk/MyML/blob/master/A-Decision%20Tree/ppt/hbchap9.pdf

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章