《Python數據分析與機器學習實戰-唐宇迪》讀書筆記第7章--決策樹

python數據分析個人學習讀書筆記-目錄索引

第7章決策樹

   決策樹算法是機器學習中最經典的算法之一。大家可能聽過一些高深的算法,例如在競賽中大殺四方的Xgboost、各種集成策略等,其實它們都是基於樹模型來建立的,掌握基本的樹模型後,再去理解集成算法就容易多了,本章介紹樹模型的構造方法以及其中涉及的剪枝策略。

7.1決策樹原理

   先來看一下決策樹能完成什麼樣的任務。假設一個家庭中有5名成員:爺爺、奶奶、媽媽、小男孩和小女孩。現在想做一個調查:這5個人中誰喜歡玩遊戲,這裏使用決策樹演示這個過程,如圖7-1所示。

   邀月工作室

  圖7-1 決策樹分類方法

  開始的時候,所有人都屬於一個集合。第一步,依據年齡確定哪些人喜歡玩遊戲,可以設定一個條件,如果年齡大於15歲,就不喜歡玩遊戲;如果年齡小於15歲,則可能喜歡玩遊戲。這樣就把5個成員分成兩部分,一部分是右邊分支,包含爺爺、奶奶和媽媽;另一部分是左邊分支,包含小男孩和小女孩。此時可以認爲左邊分支的人喜歡玩遊戲,還有待挖掘。右邊分支的人不喜歡玩遊戲,已經淘汰出局。

  對於左邊這個分支,可以再進行細分,也就是進行第二步劃分,這次劃分的條件是性別。如果是男性,就喜歡玩遊戲;如果是女性,則不喜歡玩遊戲。這樣就把小男孩和小女孩這個集合再次分成左右兩部分。左邊爲喜歡玩遊戲的小男孩,右邊爲不喜歡玩遊戲的小女孩。這樣就完成了一個決策任務,劃分過程看起來就像是一棵大樹,輸入數據後,從樹的根節點開始一步步往下劃分,最後肯定能達到一個不再分裂的位置,也就是最終的結果。

  下面請大家思考一個問題:在用決策樹的時候,算法是先把數據按照年齡進行劃分,然後再按照性別劃分,這個順序可以顛倒嗎?爲什麼要有一個先後的順序呢?這個答案其實也就是決策樹構造的核心。

7.1.1決策樹的基本概念

   熟悉決策樹分類過程之後,再來解釋一下其中涉及的基本概念。首先就是樹模型的組成,開始時所有數據都聚集在根節點,也就是起始位置,然後通過各種條件判斷合適的前進方向,最終到達不可再分的節點,因而完成整個生命週期。決策樹的組成如圖7-2所示。

   邀月工作室

  圖7-2 決策樹組成

  • 根節點:數據的聚集地,第一次劃分數據集的地方。
  • 非葉子節點與分支:代表中間過程的各個節點。
  • 葉子節點:數據最終的決策結果。

  剛纔完成的決策過程其實是已經創建好了一個樹模型,只需要把數據傳進去,通過決策樹得到預測結果,也就是測試階段,這步非常簡單。決策樹的核心還是在訓練階段,需要一步步把一個完美的決策樹構建出來。那麼問題來了,怎樣的決策樹纔是完美的呢?訓練階段需要考慮的問題比較多,例如根節點選擇什麼特徵來劃分?如果按照年齡劃分,年齡的判斷閾值應該設置成多少?下一個節點按照什麼特徵來劃分?一旦解決這些問題,一個完美的樹模型就構建出來了。

7.1.2衡量標準

   總結上面所提到的問題,歸根到底就是什麼特徵能夠把數據集劃分得更好,也就是哪個特徵最好用,就把它放到最前面,因爲它的效果最好,當然應該先把最厲害的拿出來。就像是參加比賽,肯定先上最厲害的隊員(決策樹中可沒有田忌賽馬的故事)。那麼數據中有那麼多特徵,怎麼分辨其能力呢?這就需要給出一個合理的判斷標準,對每個特徵進行評估,得到一個合適的能力值。

  這裏要介紹的衡量標準就是熵值,大家可能對熵有點陌生,先來解釋一下熵的含義,然後再去研究其數學公式吧。

  熵指物體內部的混亂程度,怎麼理解混亂程度呢?可以分別想象兩個場景:第一個場景是,當你來到義烏小商品批發市場,市場裏有很多商品,看得人眼花繚亂,這麼多商品,好像哪個都想買,但是又比較糾結買哪個,因爲可以選擇的商品實在太多。

  根據熵的定義,熵值越高,混亂程度越高。這個雜貨市場夠混亂吧,那麼在這個場景中熵值就較高。但是,模型是希望同一類別的數據放在一起,不同類別的數據分開。那麼,如果各種類別數據都混在一起,劃分效果肯定就不好,所以熵值高意味着數據沒有分開,還是混雜在一起,這可不是模型想要的。

  第二個場景是當你來到一個蘋果手機專賣店,這一進去,好像沒得選,只能買蘋果手機。這個時候熵值就很低,因爲這裏沒有三星、華爲等,選擇的不確定性就很低,混亂程度也很低。

  如果數據劃分後也能像蘋果專賣店一樣,同一類別的都聚集在一起,就達到了分類的目的,解釋過後,來看一下熵的公式:

 邀月工作室

  對於一個多分類問題,需要考慮其中每一個類別。式中,n爲總共的類別數量,也就是整體的熵值是由全部類別所共同決定的;pi爲屬於每一類的概率。式(7.1)引入了對數函數,它的作用是什麼呢?先來觀察一下圖7-3。

  如果一個節點中所有數據都屬於同一類別,此時概率pi值就爲1。在對數圖中,當x=1時對應的輸出值恰好爲0,此時熵值也就爲0。因爲數據都是一個類別的,沒有任何混亂程度,熵值就爲最低,也就是0。

   邀月工作室

  圖7-3 對數函數

  再舉一個極端的例子,如果一個節點裏面的數據都分屬於不同的類別,例如10個數據屬於各自的類別,這時候概率pi值就很低,因爲每一個類別取到的概率都很小,觀察圖7-3可以發現,當x取值越接近於0點,其函數值的絕對值就越大。

  由於概率值只對應對數函數中[0,1]這一部分,恰好其值也都是負數,所以還需在熵的公式最前面加上一個負號,目的就是負負得正,將熵值轉換成正的。並且隨着概率值的增大,對數函數結果越來越接近於0,可以用其表示數據分類的效果。

  下面再通過一個數據例子理解一下熵的概念:假設A集合爲[1,1,1,1,1,1,1,1,2,2]、B集合爲[1,2,3,4,5,6,7,8,9,10]。在分類任務中,A集合裏面的數據相對更純,取到各自類別的概率值相對較大,此時熵值就偏低,意味着通過這次劃分的結果還不錯。反觀B集合,由於裏面什麼類別都有,魚龍混雜,取到各自類別的概率值都較低,由於對數函數的作用,其熵值必然偏高,也就是這次劃分做得並不好。

  再來說一說拋硬幣的事,把硬幣扔向天空後落地的時候,結果基本就是對半開,正反各佔50%,這也是一個二分類任務最不確定的時候,由於無法確定結果,其熵值必然最大。但是,如果非常確定一件事發生或者不發生時,熵值就很小,熵值變化情況如圖7-4所示。

   邀月工作室

  圖7-4 熵值變化情況

  • 當p=0或p=1時,H(p)=0,隨機變量完全沒有不確定性。
  • 當p=0.5時,H(p)=1(式(7.1)中的對數以2爲底),此時隨機變量的不確定性最大。

在構建分類決策樹時,不僅可以使用熵值作爲衡量標準,還可以使用Gini係數,原理基本一致,公式如下:

 邀月工作室

7.1.3信息增益

   既然熵值可以衡量數據劃分的效果,那麼,在構建決策樹的過程中,如何利用熵值呢?這就要說到信息增益了,明確這個指標後,決策樹就可以動工了。

數據沒有進行劃分前,可以得到其本身的熵值,在劃分成左右節點之後,照樣能分別對其節點求熵值。比較數據劃分前後的熵值,目標就是希望熵值能夠降低,如果劃分之後的熵值比之前小,就說明這次劃分是有價值的,信息增益公式如下:

 邀月工作室

  這裏計算了劃分前後熵值的變化,右項中的具體解釋留到下節的計算實例中更容易理解。

  總結一下,目前已經可以計算經過劃分後數據集的熵值變換情況,回想一下最初的問題,就是要找到最合適的特徵。那麼在創建決策樹時,基本出發點就是去遍歷數據集中的所有特徵,看看到底哪個特徵能夠使得熵值下降最多,信息增益最大的就是要找的根節點。接下來就要在剩下的特徵中再找到使得信息增益最大的特徵,以此類推,直到構建完成整個樹模型。

7.1.4決策樹構造實例

   下面通過一個實例來看一下決策樹的構建過程,這裏有14條數據,表示在各種天氣狀況下是否去打球。數據中有4個特徵,用來描述當天的天氣狀況,最後一列的結果就是分類的標籤,如表7-1所示。

  表7-1 天氣數據集

   邀月工作室

  數據集包括14天的打球情況(用yes或者no表示),所給的數據特徵有4種天氣狀況(outlook、temperature、humidity、windy):

  • outlook表示天氣狀況,有3種取值,分別是sunny、rainy、overcast。
  • temperature表示氣溫,有3種取值,分別是hot、cool、mild。
  • humidity表示潮溼度,有2種取值,分別是high、normal。
  • windy表示是否有風,有2種取值,分別是TRUE、FALSE。

  目標就是構建一個決策樹模型,現在數據集中有4個特徵,所以要考慮的第一個問題就是,究竟用哪一個特徵當作決策樹的根節點,可以有4種劃分方式(見圖7-5)。

   邀月工作室

  圖7-5 4種特徵劃分

  根據上圖的劃分情況,需要從中選擇一種劃分當作根節點,如何選擇呢?這就要用到前面介紹的信息增益。

  在歷史數據中,迪哥有9天打球,5天不打球,所以此時還未經過劃分的數據集熵值應爲:

 邀月工作室

  爲了找到最好的根節點,需要對4個特徵逐一分析,先從outlook特徵開始。

  • 當outlook=sunny時,總共對應5條數據,其中有2天出去打球,3天不打球,則熵值爲0.971(計算方法同上)。
  • 當outlook=overcast時,總共對應4條數據,其中4天出去打球,此時打球的可能性就爲100%,所以其熵值爲0。
  • 當outlook=rainy時,總共對應5條數據,其中有3天出去打球,2天不打球,則熵值爲0.971。

  Outlook取值爲sunny、overcast、rainy的概率分別爲5/14、4/14、5/14,最終經過outlook節點劃分後,熵值計算如下(相當於加權平均):

  5/14×0.971+4/14×0+5/14×0.971=0.693

  以outlook作爲根節點,系統的熵值從初始的0.940下降到0.693,增益爲0.247。用同樣的方式可以計算出其他特徵的信息增益,以temperature、humidity、windy分別作爲根節點的信息增益爲gain(temperature)=0.029,gain(humidity)=0.152,gain(windy)=0.048。這相當於遍歷所有特徵,接下來只需選擇信息增益最大的特徵,把它當作根節點拿出即可。

  根節點確定後,還需按順序繼續構建決策樹,接下來的方法也是類似的,在剩下的3個特徵中繼續尋找信息增益最大的即可。所以,決策樹的構建過程就是不斷地尋找當前的最優特徵的過程,如果不做限制,會遍歷所有特徵。

7.1.5連續值問題

   上一小節使用的是離散屬性的特徵,如果數據是連續的特徵該怎麼辦呢?例如對於身高、體重等指標,這個時候不僅需要找到最合適的特徵,還需要找到最合適的特徵切分點。在圖7-1所示例子中,也可以按照年齡30歲進行劃分,這個30也是需要給定的指標,因爲不同的數值也會對結果產生影響。

  如何用連續特徵x=[60,70,75,85,90,95,100,120,125,220]選擇最合適的切分點呢?需要不斷進行嘗試,也就是不斷二分的過程,如圖7-6所示。

   邀月工作室

  圖7-6 連續值切分

  數據x一共有9個可以切分的點,需要都計算一遍,這一過程也是連續值的離散化過程。對於每一個切分點的選擇,都去計算當前信息增益值的大小,最終選擇信息增益最大的那個切分點,當作實際構建決策樹時選擇的切分點。

  在這樣一份數據中,看起來一一嘗試是可以的,但是,如果連續值數據過於龐大怎麼辦呢?也可以人爲地選擇合適的切分點,並不是非要遍歷所有的數據點。例如,將數據集劃分成N塊,這就需要遍歷N次,其實無非就是效率問題,如果想做得更完美,肯定需要更多的嘗試,這些都是可以控制的。

7.1.6信息增益率

   在決策樹算法中,經常會看到一些有意思的編號,例如ID3、C4.5,相當於對決策樹算法進行了升級。基於信息增益的構建方法就是ID3,那麼還有哪些問題需要改進呢?可以想象這樣一種特徵,樣本編號爲ID,由於每一個樣本的編號都是唯一的,如果用該特徵來計算信息增益,可能得到的結果就是它能把所有樣本都分開,因爲每一個節點裏面只有一個樣本,此時信息增益最大。但是類似ID這樣的特徵卻沒有任何實際價值,所以需要對信息增益的計算方法進行改進,使其能夠更好地應對屬性值比較分散的類似ID特徵。

  爲了避免這個不足,科學家們提出了升級版算法,俗稱C4.5,使用信息增益比率(gain ratio)作爲選擇分支的準則去解決屬性值比較分散的特徵。“率”這個詞一看就是要做除法,再來看看ID這樣的特徵,由於取值可能性太多,自身熵值已經足夠大,如果將此項作爲分母,將信息增益作爲分子,此時即便信息增益比較大,但由於其自身熵值更大,那麼整體的信息增益率就會變得很小。

7.1.7迴歸問題求解

   熵值可以用來評估分類問題,那麼決策樹是不是隻能做分類任務呢?當然不止如此,迴歸任務照樣能解決,只需要將衡量標準轉換成其他方法即可。

在劃分數據集時,迴歸任務跟分類任務的目標相同,肯定還是希望類似的數值劃分在一起,例如,有一批遊戲玩家的充值數據[100,150,130,120,90,15000,16000,14500,13800],有的玩家充得多,有的玩家充得少。決策樹在劃分時肯定希望區別對待這兩類玩家,用來衡量不同樣本之間差異最好的方法就是方差。在選擇根節點時,分類任務要使得熵值下降最多,迴歸任務只需找方差最小的即可。

  最終的預測結果也是類似,分類任務中,某一葉子節點取衆數(哪種類別多,該葉子節點的最終預測類別就是多數類別的);迴歸任務中,只需取平均值當作最後的預測結果即可。

  分類任務關注的是類別,可以用熵值表示劃分後的混亂程度;迴歸任務關注的則是具體的數值,劃分後的集合方差越小,把同類歸納在一起的可能性越大。

 

7.2決策樹剪枝策略

   討論瞭如何建立決策樹,下面再來考慮另一個問題:如果不限制樹的規模,決策樹是不是可以無限地分裂下去,直到每個葉子節點只有一個樣本才停止?在理想情況下,這樣做能夠把訓練集中所有樣本完全分開。此時每個樣本各自佔領一個葉子節點,但是這樣的決策樹是沒有意義的,因爲完全過擬合,在實際測試集中效果會很差。

所以,需要額外注意限制樹模型的規模,不能讓它無限制地分裂下去,這就需要對決策樹剪枝。試想,小區中的樹木是不是經常修剪才能更美觀?決策樹算法也是一樣,目的是爲了建模預測的效果更好,那麼如何進行剪枝呢?還是需要一些策略。

7.2.1剪枝策略

   通常情況下,剪枝方案有兩種,分別是預剪枝(Pre-Pruning)和後剪枝(Post-Pruning)。雖然這兩種剪枝方案的目標相同,但在做法上還是有區別。預剪枝是在決策樹建立的過程中進行,一邊構建決策樹一邊限制其規模。後剪枝是在決策樹生成之後纔開始,先一口氣把決策樹構建完成,然後再慢慢收拾它。

  (1)預剪枝。在構造決策樹的同時進行剪枝,目的是限制決策樹的複雜程度,常用的停止條件有樹的層數、葉子節點的個數、信息增益閾值等指標,這些都是決策樹算法的輸入參數,當決策樹的構建達到停止條件後就會自動停止。

  (2)後剪枝。決策樹構建完成之後,通過一定的標準對其中的節點進行判斷,可以自己定義標準,例如常見的衡量標準:

 邀月工作室

  式(7.4)與正則化懲罰相似,只不過這裏懲罰的是樹模型中葉子節點的個數。式中,C(T)爲當前的熵值;Tleaf爲葉子節點個數,要綜合考慮熵值與葉子節點個數。分裂的次數越多,樹模型越複雜,葉子節點也就越多,熵值也會越小;分裂的次數越少,樹模型越簡單,葉子節點個數也就越少,但是熵值就會偏高。最終的平衡點還在於係數(它的作用與正則化懲罰中的係數相同),其值的大小決定了模型的趨勢傾向於哪一邊。對於任何一個節點,都可以通過比較其經過剪枝後值與未剪枝前值的大小,以決定是否進行剪枝操作。

後剪枝做起來較麻煩,因爲首先需要構建出完整的決策樹模型,然後再一點一點比對。相對而言,預剪枝就方便多了,直接用各種指標限制決策樹的生長,也是當下最流行的一種決策樹剪枝方法。

  現階段在建立決策樹時,預剪枝操作都是必不可少的,其中涉及的參數也較多,需要大量的實驗來選擇一組最合適的參數,對於後剪枝操作來說,簡單瞭解即可。

7.2.2決策樹算法涉及參數

  決策樹模型建立的時候,需要的參數非常多,它不像邏輯迴歸那樣可以直接拿過來用。絕大多數參數都是用來控制樹模型的規模的,目的就是儘可能降低過擬合風險,下面以Sklearn工具包中的參數爲例進行闡述(見表7-2)。

  表7-2 Sklearn工具包中的參數

  邀月工作室

 

  針對sklearn工具包中的樹模型,介紹了一下其參數的含義,後續任務中,就要使用這些參數來建立模型,只不過不僅可以建立一棵“樹”,還可以使用一片“森林”,等弄明白集成算法之後再繼續實戰。

 

本章小結:本章介紹了決策樹算法的構建方法,在分類任務中,以熵值爲衡量標準來選擇合適的特徵,從根節點開始創建樹模型;在迴歸任務中,以方差爲標準進行特徵選擇。還需注意樹模型的複雜程度,通常使用預剪枝策略來控制其規模。決策樹算法現階段已經融入各種集成算法中,後續章節還會以樹模型爲基礎,繼續提升整體算法的效果。

 

第7章完。

python數據分析個人學習讀書筆記-目錄索引

 

該書資源下載,請至異步社區:https://www.epubit.com

 

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