決策樹雖然有很多種算法,但是我們基本使用的是CART算法,所以對於決策樹,我建議主要深究CART算法就可以 了
一、CART算法介紹
CART(Classification And Regression Tree),看英文名字分類和回歸樹,就知道該算法既可以用作分類也可以用作回歸,我們sklearn中的決策樹就是使用CART算法構建的,還有GDBT算法也是。
CART是在給定輸入隨機變量X條件下輸出隨機變量Y的條件概率分布的學習方法。CART構建決策樹用的是二叉樹結構,在每個葉節點上預測的是概率分布,也就是在輸入給定的條件下輸出的條件概率分布。
什么是二叉樹,就是每個判斷條件只有yes和no這個選擇
CART算法由以下兩步組成:
(1)決策樹生成:基於訓練數據集生成決策樹,生成的決策樹要盡量大;
(2)決策樹剪枝:用驗證集對已生成的樹進行剪枝並選擇最優子樹,這時用損失函數最小作為剪枝的標准。
CART決策樹的生成就是遞歸的調用二叉樹的過程。對回歸樹用平方誤差最小化准則(mse)或絕對誤差最小化准則(mae),對分類樹用基尼指數最小化准則,進行特征選擇,生成二叉樹。
二、回歸樹生成(均分誤差)
輸入:訓練數據集D
輸出:回歸樹
(1)選擇最優切分變量j與切分點s,求解:
遍歷變量j,對固定的切分變量j掃描切分點s,選擇使上式達到最小值的對;
CART回歸樹的度量目標是,對於任意划分特征A,對應的任意划分點s兩邊划分成的數據集D1和D2,求出使D1和D2各自集合的均方差最小,同時D1和D2的均方差之和最小所對應的特征和特征值划分點,其中,c1為D1數據集的樣本輸出均值,c2為D2數據集的樣本輸出均值。
(2)用選定的對(j,s)划分區域並決定相應的輸出值:
其中,由式子可以看出,為節點m中樣本的平均值。就是輸出值其實就是每個區域的真實值得均值,我們看下面這個例子就很清楚了
(3)繼續對兩個子區域調用步驟(1),(2),直到滿足停止條件;
(4)將輸入空間划分為M個區域,生成決策樹:
即,當使用樣本進行預測時,樣本最終落入的葉節點的均值作為最終的預測值。
三、分類樹(基尼系數)
對於離散型數據使用分類樹進行預測。分類樹基尼指數選擇最優的特征,同時決定該特征的最優二值切分點。
基尼系數介紹:
在分類問題中,假設有K個類,樣本點屬於第k類的概率為,則概率分布的基尼系數定義為:
對於給定樣本集合D,其基尼系數為:
其中,是D中屬於第k類的樣本子集,K是類別的個數。
如果,樣本集合D根據特征A是否取某一可能值a被分割成D1,D2兩部分,即:
則在特征A的條件下,集合D的基尼系數為:
數值越大代表分的越不純
分類樹算法介紹
輸入:訓練數據集D,停止計算條件;
輸出:CART決策樹;
根據訓練數據集,從根節點開始,遞歸地對每個節點進行以下操作,構建二叉決策樹
(1)計算節點內特征對數據集的基尼系數。此時對每一個特征A,對其可能取的每個值a,根據樣本點對A=a的測試為“是”或”否“將D分割成和兩個部分,計算A=a時的基尼系數;
(2)在所有可能的特征A以及它們所有可能的切分點a中,選擇基尼系數最小的特征及其對應的切分點作為最優特征與最優切分點。依最優特征與最優切分點,從現節點生成兩個子節點,將訓練數據集依特征分配到兩個子節點中去;
(3)對兩個子節點遞歸地調用(1),(2),直到滿足停止條件(停止計算的條件是節點中的樣本個數小於預定閾值,或樣本集的基尼系數小於預定閾值,即樣本基本屬於同一類,或者沒有更多特征);
(4)生成CART決策樹。
四、CART樹剪枝
由於決策樹算法很容易對訓練集過擬合,從而導致泛化能力差,為了解決這個問題,我們需要對CART樹進行剪枝,即類似於線性回歸的正則化,來增加決策樹的泛化能力。CART采用的辦法是后剪枝法,即先生成決策樹,然后產生所有可能的剪枝后的CART樹,最后使用交叉驗證來檢驗各種剪枝的效果,選擇泛化能力最好的剪枝策略。
也就是說,CART樹的剪枝算法可以概括為兩步,第一步是從原始決策樹生成各種剪枝效果的決策樹,第二部是用交叉驗證來檢驗剪枝后的預測能力,選擇泛化預測能力最好的剪枝后的樹作為最終的CART樹。
首先我們看看剪枝的損失函數度量,在剪枝的過程中,對於任意的一刻子樹T,其損失函數為:
其中,為正則化參數,這和線性回歸的正則化一樣。
為訓練數據的預測誤差,分類樹是用基尼系數度量,回歸樹是均方差度量。
是子樹T的葉子節點的數量。
當時,即沒有正則化,原始的生成的CART樹即為最優子樹。當時,即正則化強度達到最大,此時由原始的生成的CART樹的根節點組成的單節點樹為最優子樹。當然,這是兩種極端情況。一般來說,越大,則剪枝剪的越厲害,生成的最優子樹相比原生決策樹就越偏小。對於固定的,一定存在使損失函數最小的唯一子樹。
看過剪枝的損失函數度量后,我們再來看看剪枝的思路,對於位於節點t的任意一顆子樹,如果沒有剪枝,它的損失是:
如果將其剪掉,僅僅保留根節點,(也即是1,所以后面的等於a)則損失是:
當或者
很小時,
,當
增大到一定的程度時:
當繼續增大時不等式反向,也就是說,如果滿足下式:
和
有相同的損失函數,但是
節點更少,因此可以對子樹
進行剪枝,也就是將它的子節點全部剪掉,變為一個葉子節點
。
最后我們看看CART樹的交叉驗證策略。上面我們講到,可以計算出每個子樹是否剪枝的閾值,如果我們把所有的節點是否剪枝的值
都計算出來,然后分別針對不同的
所對應的剪枝后的最優子樹做交叉驗證。這樣就可以選擇一個最好的
,有了這個
,我們就可以用對應的最優子樹作為最終結果。
好了,有了上面的思路,我們現在來看看CART樹的剪枝算法。
輸入:CART樹建立算法得到的原始決策樹。
輸出:最優決策子樹。
算法過程如下:
(1)初始化, 最優子樹集合;
(2)從葉子節點開始自下而上計算各內部節點t的訓練誤差損失函數(回歸樹為均方差,分類樹為基尼系數), 葉子節點數,以及正則化閾值,更新
(3)得到所有節點的值的集合M。
(4)從M中選擇最大的值,自上而下的訪問子樹t的內部節點,如果時,進行剪枝。並決定葉節點t的值。如果是分類樹,則是概率最高的類別,如果是回歸樹,則是所有樣本輸出的均值。這樣得到對應的最優子樹
(5)最優子樹集合,;
(6)如果M不為空,則回到步驟4。否則就已經得到了所有的可選最優子樹集合;
(7)采用交叉驗證在選擇最優子樹.
求的是a的最小值。
五、決策樹算法的優缺點
優點:
(1)決策樹很容易理解和解釋,而且決策樹也容易可視化(在sklearn中可以使用export_graphviz包進行決策樹可視化);
(2)基本不需要預處理,不需要提前歸一化,處理缺失值;
(3)決策樹在預測時的時間代價是O(logN),其中N是預測的樣本集大小;
(4)能夠處理數值型(連續型)和類別型(離散型)的數據。很多其他技術通常在分析數據集的時候只專注於其中一點,即要么是數值型,要么是類別型;
(5)能夠處理多維度輸出的分類問題,即我們的預測值有多個維度,且多維度是相關的;
(6)決策樹使用是作為一個白盒,相較於黑盒的神經網絡,決策樹在邏輯上可以得到很好的解釋;
(7)可以交叉驗證的剪枝來選擇模型,從而提高泛化能力;
(8)對異常點的容錯能力好,健壯性強。
缺點:
(1)決策樹容易過擬合,導致模型的泛化能力很差。可以通過剪枝(目前sklearn中的決策樹不支持剪枝,所以需要我們自己設置,如葉節點最小值,樹的最大深度等),設置每個葉子節點的最小樣本數和樹的最大深度來避免這個問題;
(2)決策樹不穩定,一些很小的變化可能會導致完全不同的決策樹生成。這個問題可以通過集成方法來緩解(如:隨機森林);
(3)學習一棵最優化的決策樹是NPC問題(就是屬於這個的概率p=屬於另外類的概率np),因此實際中的決策樹學習算法是基於啟發式的算法,例如貪心算法在局部做到最優化決策樹的每個節點,這樣的方法並不能保證能得到一個全局最優的決策樹。這個問題可以通過集成的方法來得到改善;
(4)一些復雜的關系決策樹很難去學,因為決策樹並不能清楚的表達它們,比如,異或問題,多路復用問題等。一般這種關系可以換神經網絡分類方法來解決;
(5)如果某些類別的樣本比例過大,生成決策樹容易偏向於這些類別。因此建議在創建決策樹之前要平衡數據集。
六、決策樹在sklearn中的一些建議
(1)當數據的特征維度很高而數據量又很少的時候,這樣的數據在構建決策樹的時候往往會過擬合。所以我們要控制樣本數量和特征的之間正確的比率;
(2)在構建決策樹之前,可以考慮預先執行降維技術(如PCA,ICA或特征選擇),以使我們生成的樹更有可能找到具有辨別力的特征;
(3)在訓練一棵樹的時候,可以先設置max_depth=3來將樹可視化出來,以便我們找到樹是怎樣擬合我們數據的感覺,然后在增加我們樹的深度;
(4)樹每增加一層,填充所需的樣本數量是原來的2倍,比如我們設置了最小葉節點的樣本數量,當我們的樹層數增加一層的時候,所需的樣本數量就會翻倍,所以我們要控制好樹的最大深度,防止過擬合;
(5)使用min_samples_split(節點可以切分時擁有的最小樣本數) 和 min_samples_leaf(最小葉節點數)來控制葉節點的樣本數量。這兩個值設置的很小通常意味着我們的樹過擬合了,而設置的很大意味着我們樹預測的精度又會降低。通常設置min_samples_leaf=5;
(6)當樹的類比不平衡的時候,在訓練之前一定要先平很數據集,防止一些類別大的類主宰了決策樹。可以通過采樣的方法將各個類別的樣本數量到大致相等,或者最好是將每個類的樣本權重之和(sample_weight)規范化為相同的值。另請注意,基於權重的預剪枝標准(如min_weight_fraction_leaf)將比不知道樣本權重的標准(如min_samples_leaf)更少偏向主導類別。
(7)如果樣本是帶權重的,使用基於權重的預剪枝標准將更簡單的去優化樹結構,如mn_weight_fraction_leaf,這確保了葉節點至少包含了樣本權值總體總和的一小部分;
(8)在sklearn中所有決策樹使用的數據都是np.float32類型的內部數組。如果訓練數據不是這種格式,則將復制數據集,這樣會浪費計算機資源。
(9)如果輸入矩陣X非常稀疏,建議在調用fit函數和稀疏csr_matrix之前轉換為稀疏csc_matrix,然后再調用predict。 當特征在大多數樣本中具有零值時,與密集矩陣相比,稀疏矩陣輸入的訓練時間可以快幾個數量級。
文章轉載:https://blog.csdn.net/qq_24519677/article/details/82084718?spm=1001.2014.3001.5501