二-----決策樹的剪枝、連續值和預設值處理、類別不平衡處理、多分類問題

1.決策樹的剪枝

之所以會涉及到剪枝的問題是因為決策樹很容易出現過擬合的現象,我對過擬合的理解是在訓練集中訓練樣本的一些個性被當成了所有樣本的共性進行了學習,導致模型泛化能力減弱。因此,為了減少過擬合的影響,可以通過去掉一些決策樹分支(剪枝)的方式進行處理。

1.1 預剪枝

顧名思義,預剪枝的核心思想是在對每一個節點劃分之前先進行計算,如果當前節點的劃分並不能夠帶來模型泛化能力的提升就不再進行劃分,對於未能夠區分的樣本種類(此時可能存在不同的樣本類別同時存在於節點中),按照投票(少數服從多數)的原則進行判斷。

簡單一點的方法可以通過測試集判斷劃分過後的測試集準確度能否得到提升進行確定,如果準確率不提升變不再進行節點劃分。

這樣做的好處是在降低過擬合風險的同時減少了訓練時間的開銷,但是可能會出現欠擬合的風險:雖然一次劃分可能會導致準確率的降低,但是再進行幾次劃分後,可能會使得準確率顯著提升。

1.2 後剪枝

後剪枝的核心思想是讓演算法生成一個完全決策樹,然後從最低層向上計算決定是否剪枝。

同樣的,方法可以通過在測試集上的準確率進行判斷,如果剪枝後準確率有所提升,則進行剪枝。

後剪枝的泛化能力往往高於預剪枝,但是時間花銷相對較大。

1.3 總結

無論是預剪枝還是後剪枝都是為了減少決策樹過擬合的情況,在實際運用中,我使用了python中的sklearn庫中的函數。

函數中的max_depth參數可以控制樹的最大深度,即最多產生幾層節點

函數中的min_samples_split參數可以控制最小劃分樣本,即當節點樣本數大於閾值時才進行下一步劃分。

函數中min_samples_leaf參數可以控制最後的葉子中最小的樣本數量,即最後的分類中的樣本需要高於閾值

上述幾個參數的設置均可以從控制過擬合的方面進行理解,通過控制樹的層數、節點劃分樣本數量以及每一個分類的樣本數可以在一定程度上減少對於樣本個性的關注。具體設置需要根據實際情況進行設置

2. 連續值和預設值處理

2.1 連續值的處理

決策樹對於連續值的特徵進行處理的方法主要是將連續性數值特徵劃分為不同的區間,從而變成離散的數值。C4.5中採用了二分法對連續值進行處理。

二分法的思想為:對於某個屬性出現的連續值從小到大排列,取每兩個點的中點進行劃分(任取兩點之間的任意一點不影響劃分結果),選取其中信息增益最大的點作為最終劃分節點的依據。

2.2 缺失值的處理

在實際中數據往往存在預設值,而對於預設值的處理方法多種多樣,我了解的處理方法主要分為以下幾個方面,具體如何處理需要根據實際問題進行分析

2.2.1 填充

如果預設的屬性是連續的數值,並且每個樣本之間存在一定的關係(時間序列):可以通過上一個時間的數據或者上一個數據和下一個數據的平均值進行填充,這種做法可以保證時間序列的連續性。或者使用平均數、中位數等進行填充

如果預設的屬性是連續的數值並且和其他的特徵具有一定的關係,可以通過其他屬性近似推導出缺失數值。

如果預設數據是離散屬性,並且數量較多,可以選擇將預設的數據單獨分為一類進行訓練。

2.2.2 刪除

如果包含預設數據的樣本點較少,可以直接刪除缺失數據。如果大多數樣本點均不包含此缺失數據,可以考慮放棄這一特徵。

2.2.3 模型訓練中對於缺測數據的處理

如果上述的方法都無法很好的使用,同樣可以在訓練模型的過程中對缺測數據進行處理。

其核心思想是:對於缺測的數據,分別用該屬性的其他數值進行填充。並且給予每一個填充出來的樣本不同的權重,權重根據每一個種類的樣本數量進行計算(例如:樣本顏色未知,已知的顏色分類有紅、黃、藍,三種分類樣本數量分別為2、3、5,則填充出來的樣本一共有三個,權重分別為2/10,3/10,5/10)。

這種思想能夠在一定程度上忽略缺測數據並且合理利用已知數據,權重的存在是為了使劃分後樣本的重要性和劃分前一致。

2.2.4 模型使用中對於缺測數據的處理

如果測試樣本中同樣存在缺測數據,可以根據上面相似的方法進行處理,給予樣本不同的權重,最後再預測結束後取權重最高的類別作為最後的結果。

3.類別不平衡的處理

實際問題中,常常會存在類別不平衡的問題,如果不進行處理,會使得模型的效果受到極大的影響 (正負樣本為1000:1時,全部預測為正樣本時,模型準確率為99.99%,喪失了對負樣本的預測能力,此時,正樣本過擬合,負樣本欠擬合)。

3.1 更換評價指標

通常,在訓練中採用準確率作為模型好壞的評價指標,但是當樣本類別不平衡的時候,可以考慮其他的指標,不同的指標反映了關注的不同重點,也反映了實際中不同問題的不同需求。

3.1.1 準確率、召回率、P-R曲線、F

混淆矩陣:反映預測結果和真實情況的矩陣

準確率P定義為frac{TP}{TP+FP} ,表示預測為正例的樣本中實際為正例的比例

召回率R(真正例率)定義為frac{TP}{TP+FN} ,表示在全體正例中預測正確的比例

準確率和召回率可以從不同的方面評價模型的好壞,準確率關注判斷結果正確的比率,召回率關注能否判斷出所有樣本中的正樣本,兩者往往不可兼得。因此為了平衡準確率和召回率,引入P-R曲線和F1分數

P-R曲線:將預測的結果進行根據正例的可能性(1到-1)進行排序,從左至右對每個樣本點作為正例進行預測,依次計算當前準確率和召回率,並以召回率和準確率作為橫縱坐標做圖。(在第一個點時,此時為正樣本的概率最大(假定的確為正樣本),作為正例預測,此時準確率為1,召回率為1/樣本數,…,在最後一個點時,把所有樣本都視為正樣本,此時準確率為所有樣本中正樣本所佔比例,召回率為1。)

計算P-R曲線包圍的面積可以得到一種衡量方式,計算P=R時候的平衡點,可以得到另外一種衡量方式。平衡點越大,表明模型效果越好。P-R曲線反映了模型兼顧準確率和召回率的能力。

F值:frac{left( 1+eta ^{2}  
ight)	imes  R	imes P}{ left( eta ^{2}	imes P  
ight)+ R} ,衡量了準確率和召回率的相對重要程度,默認eta >0,當eta >1時,表明準確率更重要,反之,召回率更重要

3.1.2 ROC和AUC

和召回率(真正例率)相對,定義假正例率:FPR = frac{FP}{TN+FP}

ROC曲線:和P-R相似,按照預測的結果進行根據正例的可能性(1到-1)進行排序,從左至右選取每一個樣本點之前的樣本作為正樣本預測,之後的樣本作為負樣本預測,得到橫坐標為假正例率,縱坐標為真正例率的曲線,稱為ROC曲線,曲線包圍的面積稱為AUC。AUC越大,表明模型結果越好。AUC反映了排序結果的好壞,當隨機挑選一個正樣本以及負樣本,AUC表示模型將這個正樣本排在負樣本前面的概率。

3.2 重新採樣

當樣本數量不均衡的時候,可以人為改變樣本結構使得樣本均勻。

3.2.1 過採樣

當負樣本數量過於少的時候,可以考慮過採樣(增加負樣本數量)

比如可以選擇對於負樣本反覆採樣(複製多次),使得類別平衡。但是,由於對負樣本的反覆採樣並沒有包含更多的負樣本信息,可能會導致模型對負樣本的過擬合。

此外,可以根據兩個負樣本之間的距離,人工生成新的負樣本,增加負樣本的數量。 但是,這樣的做法不能夠保證生成的負樣本的準確性。

3.2.2 欠採樣

當負樣本數量比較多但相比於正樣本較少的時候,可以選擇對正樣本進行欠採樣(如果負樣本本身數量較少欠採樣會導致訓練數據過少,模型欠擬合)

最簡單的方法是從正樣本中隨機選取一些樣本,和負樣本構成新的樣本集,消除類別不平衡的問題。

此外,可以同過在正樣本上K-means聚類的方式,得到新的樣本。

3.3 更改權重

對於樣本數量少的負樣本,賦予更高的權重,即對於負樣本的錯分會受到更大的懲罰。使得模型更加傾向於正確識別負樣本

3.4 多模型融合

將正樣本隨機分成多份,分別和負樣本組成新的數據集進行訓練,最後再將多個模型的結果進行投票打分,得到最後的結果。這種做法的好處是不會丟失數據,但是可能會花費更多的時間。

4.多分類問題

在實際問題中,往往存在多分類的問題,,即最後的類別數大於兩個。對於多分類問題的解決方法有如下幾種:

4.1 一對一

一對一的主要思路是把所有的類別兩兩配對進行訓練(訓練樣本為該兩個類別的樣本),對於n個類別一共可以得到frac{n	imes left( n-1 
ight) }{2} 個分類器,使用時將樣本放到所有的分類器中進行訓練,最後的結果為所有分類器結果中最多的類別。

4.2 一對多

一對多的主要思路是把所有的類別分別和其餘的類別組合進行訓練(訓練樣本為全體樣本,判斷樣本是否屬於這個類別),對於n個類別一共可以得到n個分類器,使用時將樣本放到所有分類器中進行訓練,若結果只有一個為正,則認為樣本屬於該類別,否則,選取置信度比較高的分類器的結果。

和一對一相比,一對多訓練的分類器較少,訓練使用的樣本較多。

4.3 多對多(糾錯輸入碼)

多對多是把若干個類別作為正類,其餘的作為反類,通過糾錯輸入碼的思想進行類別劃分。

首先,對於n個類別進行M次不同的劃分,選取不同的正反類,得到M個訓練集,得到M個分類器。然後,對於測試樣本進行判斷,得到M維的編碼,計算和各個類別編碼的距離,最後的結果為距離最短的類別,距離的定義可以通過歐氏距離等。

例如:一共有5個類別(ABCDE),M進行了3次劃分。(例子不合理)

第一次劃分為ABC為正,DE為負

第二次劃分BD為正,ACE為負

第三次劃分AD為正,BCE為負

則A類的編碼為101,B類編碼為110,C類編碼為100,D類編碼為011,E類編碼為000

測試編碼為000則認為測試樣本屬於E類

可以看出,如果適當的劃分M使得不同類別之間的距離盡量遠的話,模型就有一定的糾錯能力,但是增加劃分的次數會增加需要訓練的分類器,並且設計劃分的方法也需要優化。同時,根據實際問題的不同,如何選擇上述的參數,也需要考慮。(比如有3個種類,特徵的取值為1,1.2,100,那麼,取值為1和1.2類別可以很容易和取值為100的類別區分開,但是1和1.2類別相互的劃分就比較困難)

5. 總結

感覺寫了好久,又重新梳理了一邊原來學習的東西

發現了自己對於有些知識點還不是特別熟悉

由於實際接觸的項目較少,可能不能夠和實際運用相聯繫起來

這是需要提高的地方

接下來總結加強版決策樹, GBDT、隨機森林等

加油~

推薦閱讀:

機器學習入門筆記2
Capsule network--《Dynamic Routing Between Capsules》
這些是 Python 官方推薦的最好書籍(推薦)
看得見的資訊理論-為什麼用交叉熵作為邏輯回歸的代價函數
交叉驗證、模型評估

TAG:機器學習 | 決策樹 |