機器學習實戰 決策樹

2021-08-31 07:15:45 字數 3966 閱讀 9585

一.決策樹簡介

決策樹(decision tree)是一種基本的分類與回歸方法。舉個通俗易懂的例子,如下圖所示的流程圖就是乙個決策樹,長方形代表判斷模組(decision block),橢圓形成代表終止模組(terminating block),表示已經得出結論,可以終止執行。從判斷模組引出的左右箭頭稱作為分支(branch),它可以達到另乙個判斷模組或者終止模組。

決策樹(decision tree)的乙個重要任務就是為了理解資料中所蘊含的知識資訊,因此決策樹可以使用不熟悉的資料集合,並從中提取出一系列規則,這些機器根據資料集建立規則的過程,就是機器學習過程。

決策樹是一種基本的分類與回歸方法。決策樹模型呈樹形結構,在分類問題中,表示基於特徵對例項進行分類的過程。它可以認為是if-then規則的集合,路徑上內部結點的特徵對應著規則的條件,而葉結點的類對應著規則的結論;也可以認為是定義在特徵空間與類空間上的條件概率分布。決策樹的路徑或其對應的if-then規則集合具有乙個重要的性質:互斥並且完備。這就是說,每乙個例項都被一條路徑或一條規則所覆蓋,而且只被一條路徑或一條規則所覆蓋。這裡所覆蓋是指例項的特徵與路徑上的特徵一致或例項滿足規則的條件。

決策樹學習通常包括3個步驟:特徵選擇、決策樹的生成和決策樹的修剪。

適用資料型別:數值型和標稱型,但樹構造演算法只適用於標稱型資料,因此數值型資料必須離散化使用決策樹做**需要以下過程:

1.收集資料:可以使用任何方法。

2.準備資料:收集完的資料,我們要進行整理,將這些所有收集的資訊按照一定規則整理出來,並排版,方便我們進行後續處理。參見上面的適用資料型別進行整理。

3.分析資料:可以使用任何方法,決策樹構造完成之後,我們可以檢查決策樹圖形是否符合預期。

4.訓練演算法:構造乙個決策樹的資料結構。

5.測試演算法:使用經驗樹計算錯誤率。

6.使用演算法:此步驟可以使用適用於任何監督學習演算法,而使用決策樹可以更好地理解資料的內在含義。

二.特徵選擇

為了找到決定性的特徵,劃分出最好的結果,必須評估每乙個特徵。特徵選擇在於選取對訓練資料具有分類能力的特徵。這樣可以提高決策樹學習的效率,如果利用乙個特徵進行分類的結果與隨機分類的結果沒有很大差別,則稱這個特徵是沒有分類能力的。經驗上扔掉這樣的特徵對決策樹學習的精度影響不大。在劃分資料集之前之後資訊發生的變化成為資訊增益,知道如何計算資訊增益,我們就可以計算每個特徵值劃分資料集獲得的資訊增益,獲得資訊增益最高的特徵就是最好的選擇。

決策樹的典型演算法有id3,c4.5,cart等。id3演算法是一種貪心演算法,用來構造決策樹。id3演算法以資訊熵的下降速度為選取測試屬性的標準,即在每個節點擊取還尚未被用來劃分的具有最高資訊增益的屬性作為劃分標準,然後繼續這個過程,直到生成的決策樹能完美分類訓練樣例,此演算法的目的在於減少樹的深度,但是忽略了葉子數目的研究。c4.5演算法在id3演算法的基礎上進行了改進,對於**變數的缺值處理、剪枝技術、派生規則等方面作了較大改進,既適合於分類問題,又適合於回歸問題。(以後補充)。

劃分資料集的大原則是:將無序的資料變得更加有序。

度量集合無序程度的兩種方法:(有興趣的可以看數學之美這本書)

使用資訊理論度量資訊:在劃分資料集之前之後資訊發生的變化成為資訊增益,通過計算每個特徵值劃分資料集獲得的資訊增益,選出獲得資訊增益最高的特徵作為劃分資料集的參考屬性。

基尼不純度:簡單說就是從乙個資料集中隨機選取子項,度量其被錯誤分類到其他分組裡的概率

本文選用第一種方法,那麼就要計算資訊增益。

集合資訊的度量方式稱為夏農熵或簡稱熵。為什麼熵可以用來表示資料集的混亂程度?(古人說的記住就好)

熵定義為資訊的期望值。在資訊理論與概率統計中,熵是表示隨機變數不確定性的度量。如果待分類的事務可能劃分在多個分類之中,則符號xi的資訊定義為 

l(xi)=−log2p(xi)

l(xi)=−log2p(xi)

其中,p(x_i) 是選擇該分類的概率。

將概率在[0,1]之間的資訊轉換為0到正無窮之間的數,那麼在接下來計算資訊熵時,拉開了資料間距,更能反映出資料的混亂程度。熵越高,表示資料的混亂資料越多。熵的計算公式如下:

h=−∑(i=1,n)p(xi)log2p(xi)

也就是說,在資料集中去掉某個特徵前後,熵的變化越大,資訊增益越大,表明被去掉的這個特徵越能更好地劃分當前資料集。

**裡面部分會涉及到條件熵,經驗熵的問題,但是書上沒有具體講,有興趣的可以檢視具體的知識

三.決策樹的構造

一般採用遞迴原則構造決策樹。遞迴結束的條件有兩個:

1.程式遍歷完所有劃分資料集的屬性:如果資料集已經處理了所有屬性,但是類標籤依然不是唯一的,此時通常會採用多數表決的方法決定該葉子節點的分類,即選擇出現次數最多的那個標籤。

2.每個分支下的所有例項都具有相同的分類:如果所有例項具有相同的分類,則得到乙個葉子節點或者終止塊。任何達到葉子節點的資料必然屬於葉子節點的分類。

四.決策樹的修剪

決策樹是充分考慮了所有的資料點而生成的複雜樹,有可能出現過擬合的情況,決策樹越複雜,過擬合的程度會越高。 考慮極端的情況,如果我們令所有的葉子節點都只含有乙個資料點,那麼我們能夠保證所有的訓練資料都能準確分類,但是很有可能得到高的**誤差,原因是將訓練資料中所有的雜訊資料都」準確劃分」了,強化了雜訊資料的作用。剪枝修剪**前後分類誤差相差不大的子樹,能夠降低決策樹的複雜度,降低過擬合出現的概率。 這裡不再詳細說明。

由於特徵數目並不是每次劃分資料分組時都減少,因此這些演算法在實際使用時可能引起一定的問題。目前我們並不需要考慮這個問題,只需要在演算法開始執行前計算列的數目,檢視演算法是否使用了所有屬性即可。

決策樹生成演算法遞迴地產生決策樹,直到不能繼續下去未為止。這樣產生的樹往往對訓練資料的分類很準確,但對未知的測試資料的分類卻沒有那麼準確,即出現過擬合現象。過擬合的原因在於學習時過多地考慮如何提高對訓練資料的正確分類,從而構建出過於複雜的決策樹。解決這個問題的辦法是考慮決策樹的複雜度,對已生成的決策樹進行簡化。

五.決策樹的視覺化

使用字典儲存的決策樹不好直觀的感受,使用python中的matplotlib註解繪製樹形圖方便直觀。

六.測試和儲存分類器,,使用決策樹****眼鏡型別

決策樹生成之後可以儲存用在下次需要的時候,這樣會節約時間,運用生成之後的決策樹可以快速的將測試例項進行分類,**眼鏡是乙個具體的應用,很簡單,自己手動模擬就好。

七.**遇到的問題

1.繪製決策樹時漢字亂碼的問題

from pylab import *

mpl.rcparams['font.sans-serif'] = ['simhei']

2.圖形中新增注釋(annotate)

3.熟悉使用matplotlib(稍後會專門學習matplotlib的使用)

4.python中list,tuple,dict,set的區別和用法(基礎~~~~~~~~)

八.總結

決策樹的一些優點:

1.易於理解和解釋,決策樹可以視覺化。

2.幾乎不需要資料預處理。

3.使用樹的花費(例如**資料)是訓練資料點(data points)數量的對數。

4.可以同時處理數值變數和分類變數。

5.可以處理多值輸出變數問題。

6.使用白盒模型。如果乙個情況被觀察到,使用邏輯判斷容易表示這種規則。

決策樹的一些缺點:

1.決策樹學習可能建立乙個過於複雜的樹,並不能很好的**資料。也就是過擬合。修剪機制(現在不支援),設定乙個葉子節點需要的最小樣本數量,或者數的最大深度,可以避免過擬合。

2.決策樹可能是不穩定的,因為即使非常小的變異,可能會產生一顆完全不同的樹。

3.學習一顆最優的決策樹是乙個np-完全問題.因此,傳統決策樹演算法基於啟發式演算法,例如貪婪演算法,即每個節點建立最優決策。這些演算法不能產生乙個全家最優的決策樹。對樣本和特徵隨機抽樣可以降低整體效果偏差。

4.概念難以學習,因為決策樹沒有很好的解釋他們。如果某些分類佔優勢,決策樹將會建立一棵有偏差的樹。因此,建議在訓練之前,先抽樣使樣本均衡。

**~稍後補上

機器學習實戰 決策樹

決策樹 2 python語言在函式中傳遞的是列表的引用,在函式內部對列表物件的修改,將會影響該列表物件的整個生存週期。為了消除這個不良影響,我們需要在函式的開始宣告乙個新列表物件。在本節中,指的是在劃分資料集函式中,傳遞的引數dataset列表的引用,為了不影響dataset我們重新宣告了乙個ret...

機器學習實戰決策樹

這幾天一直在學習機器學習實戰python 實現,在程式清單的3 6 獲取及誒單數程式,書上的程式是這樣的 def getnumleafs mytree numleafs 0.0 firststr list dict.keys mytree 0 seconddict mytree firststr p...

機器學習實戰 決策樹

class sklearn.tree.decisiontreeclassifier criterion gini splitter best max depth none,min samples split 2,min samples leaf 1,min weight fraction leaf ...