決策樹:從特徵的重要程度說起

開始陸續介紹決策樹與隨機森林,理解原理與會用來做分類算法是其一,更重要的是要理解決策樹構造的精髓並加以推廣應用纔是算融會貫通。

先來看看所謂的樹結構,其實很簡單,就是從一個節點往下依次不斷分裂節點的一種結構,比如下面這個圖描述的是根據一個人的信息(包括職業、年齡、收入、學歷)去判斷他是否有貸款的意向的樹結構圖:

在這裏插入圖片描述

可以看到,所謂的樹結構其實就是一大堆有順序的if-else條件判斷語句的組合,如果職業是什麼,走向對應分支,再如果年齡是什麼,走向一條分支,一直到沒有分支了爲止。而我們的決策樹就是想建立這樣的一個組合條件的樹結構,樹的最底層給出分類的結果,這樣給定一組(職業、年齡、收入、學歷)的特徵,在這個樹結構中過一遍就能得到結果了。有一個宏觀的認識我們再來細說決策樹的構造過程。

第一步,從我們擁有的數據說起。

上面的樹結構是最終的結果,而最開始我們並不知道這個結構, 大多數時候我們所擁有的只是訓練樣本,也就是特徵以及標籤,比如下面這樣:

在這裏插入圖片描述
在實際情況中,所有的屬性都可以數值化表示,比如職業屬性的這一欄,可以用1,2,3,4代表不同的職業(工人,白領等),依次類推,非數值化屬性的數值化表示是一個非常常見的操作。

第二步,如何選擇根部屬性節點。

也許你已經注意到,上面的決策樹根節點是職業,爲什麼是職業不是年齡也不是收入?不是因爲它們不可以當根節點,而是有一套算法指導選擇“職業”這一屬性時是最優選擇,這也是決策樹構造中最爲核心的步驟與思想:屬性選擇。那麼究竟如何選擇不同屬性的?

首先我們需要有一個非常重要的認識:如何評判一個屬性的好壞,很簡單,就是這一維度的屬性和分類標籤的相關程度到底大不大。比如說上面這個例子,假如我們單看“收入”屬性,如果說恰好收入>5000的對應的標籤全是1,收入<=5000的標籤全是0,那麼我們可以說收入是一個非常好用且適合的維度特徵,甚至可以不需要其他屬性,單靠“收入”就可以做到完美的分類了。而實際情況下通常不是這樣,單一的“收入”屬性不管怎麼劃分,都無法實現完全的分類。同理,單一的“職業”屬性,“年齡”屬性等屬性都無法做到這個事。這個時候我們只能在這幾個屬性裏面找一個儘可能好的屬性。那麼怎麼數學化的定義這個好呢?數學上一種方法就是信息熵。

先來看一下熵,所謂熵簡單理解就是代表着信息量的多少,描述的就是一個系統的混亂程度,不確定度。舉個例子,假如我們用p表示明天會不會下雨的概率,那麼什麼情況下不確定度最大呢?當然是p=0.5的時候,這個時候就是可能下雨也可能不下,概率是一樣的,假如p=0,那就是不下雨,非常確定,可以理解爲沒什麼混亂,太確定了。假如p=1,那就是下雨,也非常確定,也沒有什麼混亂。這兩種情況因爲太確定了就沒什麼信息量。用一個數學公式來表示這個確定與不確定的大小就是:H = -p * log§ 。我們畫出p在0-1之間變化的時候H的值的變化關係圖如圖所示:

在這裏插入圖片描述
這是一個變量,假如一件事情發不發生和很多變量有關,每個變量都有一個p,那麼整體的信息量就可以表示:

H(X)=−∑p(xi)log(p(xi)) (i=1,2,…,n)

有了這樣一個不確定度的衡量標準,我們再來看看決策樹裏面如何根據這個東西來選擇屬性的。這裏選擇的標準就是選擇某個屬性對結果混亂程度的影響大小來決定。

首先我們來看一下誰都不選,系統的混亂程度是多少,也就是信息熵是多少,怎麼計算呢?以上述例子中的貸款作爲標籤,假設能貸款是標籤1,不能是0,那麼上面的表裏面有5個1,2個0,這樣1的概率是p(1) = 5/7,而0的概率是p(0) = 2/7,這樣可以計算出一個基於標籤的信息熵:h = -5/7 * log(-5/7) - 2/7 * log(2/7) = 0.863

其次我們來看一下假如選了“收入=5000”作爲分割節點,那麼想評價一下這麼分割的好壞,就可以先計算一下按照這麼分以後系統的信息熵(不確定度)是多少,然後和原來的比一下看不確定度下降了多少,假如降的多那麼就可以說“收入=5000”作爲分割點比較好。

具體什麼意思呢?舉個極端的例子(只是舉例子,不是上表的實際情況),假設“收入=5000”非常好,恰好可以把上面標籤0和1完全分開,這樣按照“收入>5000”分到的子集合1就是(1,1,1,1,1),而“收入<5000”分到的子集2就是(0,0),這個時候我們再去計算子集合1的信息熵h1,發現裏面p(1)=5/5=1,p(0) = 0/5=0,信息熵h1=0;而對於子集合2的信息熵,p(1)=0/2=0,p(0) = 2/2=0,信息熵h2=0,按此條件劃分下的整個信息熵h’=h1+h2=0。那麼可以看到,“收入=5000”的劃分可以使得系統的信息熵降爲0,相比之前降低了(h-h’)=0.863。

重新整理一下,其實上面的h’在數學上定義就是一種條件熵,也就是給定條件下的信息熵,對應到上面也就是“收入=5000”分割條件下的系統信息熵。而(h-h’)就可以表示爲信息增益,數學表示就是ent_prap = H(Y) - H(Y|X),爲什麼叫信息增益而不是信息減益呢?直觀的理解,就是這一維特徵能給系統帶來多大的信息,帶來的信息越多越重要,可能最開始是從帶來信息量大小角度來考慮的,所以叫增,其實減的多的反面不就是增的多嗎。

上面說的“收入=5000”恰好可分比較極端,即使不恰好可能,也能同理計算出一個條件熵吧,只是不爲0,同理也能計算一個信息增益。

這是我們以“收入”作爲分割屬性,那麼以“職業”、“學歷”等任何一個維度進行分割是不是也能得到各自的信息增益呢,沒錯,所以決策樹在第一層選擇特徵的時候是會遍歷所有的特徵維度的,然後選擇信息增益最大的那一維作爲分裂屬性。

一旦第一層節點找到劃分的維度以後,就可以得到劃分後的結果,而每一種劃分結果有可以重複上述劃分的過程,不同的是第二層的劃分屬性裏面已經沒有第一層的屬性維度了,也就是屬性維度減1,一直這樣下去最終就可以建立起文章開頭我們看到的那個決策樹了。

決策樹的構造思路大概就是這樣,當然具體的實現細節還有很多需要探討的。比如:(1)上述我們以“收入=5000”作爲分割,那麼你怎麼知道是5000這個分割點呢?(2)“收入=5000”進行分割可以分割成兩半,大於5000的一條路,小於等於5000的一條路,這也只是兩條路,爲什麼非要是兩條路呢,咋不是3條路?4條路?比如“收入<5000”,“8000<收入<5000”,“10000<收入<8000”,“收入>10000”,那麼具體幾條路怎麼規定也是需要探討的。(3)再有分裂節點不可能一直往下分吧,也就是樹的深度需要合理的控制,樹的深度可能直接影響模型的擬合程度,也是需要考慮的。(4)再有,屬性選擇只有信息熵一種方法嗎?其實不是,信息熵是最早出來並使用的,比較經典,其實還有基尼係數等,但是它們都有一個共性,那就是曲線符合上面給的一個圖,當p=0.5的時候不確定度最大。等等。上面的探討,後面會再介紹。


關注公號【AInewworld】,第一時間獲取精彩內容
在這裏插入圖片描述

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