Python3機器學習實踐:決策樹CART

treeq.png
決策樹主要包括ID3,C4.5以及CART。下面給出三種演算法的說明:

image

image
CART
首先看下面表格中的示例資料(隨機生成,僅供參考)。其中年齡,身高,月收入為連續變數,學歷,工作為離散變數。
- 如果把 動心 視為目標變數,此問題為 分類問題 。
- 如果把 動心度 視為目標變數,此問題為 迴歸問題 。

image
CART的目的是生成一個類似下面這樣的樹:分類樹或者回歸樹。

image
葉子節點若為Y或者N,是分類樹;若是數字,則為迴歸樹。下面分別講述迴歸樹和分類樹的生成方式。

image
分類樹
D3演算法使用 資訊增益 來選擇特徵,資訊增益大的優先選擇,這種方式會使得特徵值較多的特徵容易被選擇【 示例資料中的學歷可能會比工作優先選擇,因為學歷有3個值,而工作有2個值 】。
在C4.5演算法中,採用了 資訊增益比 來選擇特徵,改進了ID3容易選擇特徵值多的特徵的問題。C4.5也是優先選擇較大的。
上述2者都是基於資訊理論的 熵 模型的,這裡面會涉及對數運算,因此計算成本較大。
CART分類樹演算法使用 基尼係數 ,既減少了計算成本,又保留了熵這種運算形式的優點。基尼係數代表了模型的不純度,基尼係數越小,則不純度越低,特徵越好。
- 基尼係數
對於一個樣本集合 S ,假設其包含 m 個不同的值,這 m 個值可看作 m 個不同的類。其中由 類i 組成的集合為 Si ,那麼對於屬於 類i 的樣本點 k 而言,其概率為 P(k)=集合Si的樣本個數除去集合S的樣本個數 。則基於概率分佈的基尼指數定義如下:

image
其中符號 “||” 為計算集合內元素個數的符號,對於m等於2的情況,上面的式子等價與

image
如果樣本集合 S ,被某個規則R劃分為n個數據子集,分別為S1, S2,……, Sn,則此時的計算基尼係數公示如下:

image
在CART演算法中,上述n的值一定為2。因為每一次分裂,都是把資料集合一分為二。 Python3/tree/master/Decision%20Tree" target="_blank" rel="nofollow,noindex">示例計算說明可點選 。
- 樹的結果
葉子節點資料集中,目標變數中佔多數的類別,為這個葉子節點的輸出類別。如果把上面給定的示例資料集看作一個葉子節點的話,如果某條資料正好落在這個資料集內,則這個資料的分類為N,因為這個資料集中有6條資料為N,多於為Y的資料條數。

image
迴歸樹
以上面給出的示例資料為例,下面說明生成迴歸樹的方式。將資料集合定義為 D 。
- 離散變數:以學歷為例
將資料集合D分為 Dsp1=D(學歷=專科) 以及 Dsp2=D(學歷!=專科) ,其中Dsp1中動心度構成的集合為 Msp1 ,均值為 asp1 ;Dsp2中動心度構成的集合為 Msp2 ,均值為 asp2 ;計算2個數據子集合的誤差序列方差的和值:

image
類似於MSE(sp),遍歷所有學歷中的值,得到下面的MSE(ms),MSE(dr)。

image
其中
資料集 Dms1=D(學歷=碩士) 以及 Dms2=D(學歷!=碩士) ,Dms1中動心度構成的集合為 Mms1 ,均值為 ams1 ;Dms2中動心度構成的集合為 Mms2 ,均值為 ams2 ;
Ddr1=D(學歷=博士)以及 Ddr2=D(學歷!=博士) ,Ddr1中動心度構成的集合為 Mdr1 ,均值為 adr1 ;Ddr2中動心度構成的集合為 Mdr2 ,均值為 adr2。
- 連續變數:以身高為例
將身高的所有值 去重 後按照 從小到大 的順序排列,得到集合H=[166,173,175,180], 取 相鄰兩個數的中間值 得到集合MH=[169.5,174,177.5],接下來的計算就類似於離散變數的情況,挨個遍歷,把資料分為小於、大於這2個數據子集。以169.5為例,把資料集分為 Dn169.5=D(身高<169.5)和Dm169.5=D(身高>169.5) ,資料子集相應的動心度組成的集合分別為 Mn169.5,Mm169.5 ,集合相應的均值為 an169.5, am169.5 。 詳細計算過程可點選 。
樹的輸出
樹是通過一個個葉子節點決定輸出的。輸出的方式也包括2種:
迴歸樹:葉子節點代表的資料子集中目標變數的均值,就作為輸出值。例如示例中的葉子節點,其輸出值為0.56+0.52=0.54。當要預測的某條資料恰好屬於這個資料子集,則針對這條資料的動心度的預測值就是0.54。
模型樹:對於一個葉子節點來說,有輸入,也有對應的輸出。根據輸入和輸出的關係,建立模型,這個模型可以是線性迴歸,也可以通過神經網路來建立。這個葉子節點的輸出值是所建立的模型的輸出值。當要預測的某條資料恰好屬於這個資料子集,則針對這條資料的動心度的預測值就是將資料帶入建立的模型中得到的值。

image
樹到了這裡還沒有完, 關於樹的剪枝演算法以及例項程式碼可點選 。下面給出結果圖展示:
分類樹:成年人收入資料集

image
分類樹:鳶尾花資料集

image
迴歸樹:結果對比曲線

image
例項程式碼: 迴歸樹 , 分類樹 ,掃描下方二維碼或者微信公眾號直接搜尋” Python範兒 “,關注微信公眾號pythonfan, 獲取更多例項和程式碼。

pythonfan.jpg