1. 程式人生 > >決策樹及MATLAB函式使用

決策樹及MATLAB函式使用

基本流程 決策樹是一種常見的機器學習方法,以二分任務為例,我們希望從給定訓練資料集學得一個模型用以對新示例進行分類,顧名思義,這個分類的任務是基於樹的結構來決策的,這恰是人類在面臨決策問題時一種很自然的處理機制。例如下圖為對西瓜分類好壞瓜的決策樹。 一般一棵決策樹包含一個根結點,若干內部結點和若干個葉結點,如下是決策樹基本學習演算法。 決策樹的生成是一個遞迴的過程,在決策樹演算法中,有三種情況會導致遞迴返回: (1)當前結點包含的樣本全屬於同一類別,無需劃分。例如當前結點所有資料都是好瓜,自然不用再劃分。 (2)當前屬性集為空,或是所有樣本在所有屬性上取值相同,無法劃分。例如當前樣本有好瓜和壞瓜,但其顏色是相同的,自然無法在顏色屬性進行劃分。此時把顏色定為葉結點,類別設為包含樣本數量多的類別。
(3)當前結點包含的樣本集合為空,不能劃分。例如對顏色(青綠、烏黑、淺白)劃分,但是剩餘樣本中不含青綠色西瓜,因此在青綠色屬性上不能繼續劃分。此時把青綠色定為葉結點,類別設為其父結點(顏色屬性)中所含樣本最多的類別。 劃分選擇 決策樹的劃分過程還是比較簡單的,原則是隨著劃分過程不斷進行,希望決策樹的分支結點所包含的樣本儘可能屬於同一類別,即結點的“純度”越來越高。
資訊增益 採用資訊熵來描述純度,很顯然資訊熵越低(資訊更加確定),純度越高。 用“資訊增益”來描述對某一屬性進行劃分所獲得純度提升的多少: 例如對於西瓜問題,計算出的各屬性資訊增益如下: Gain(D,顏色)=0.109,Gain(D,根蒂)=0.143,Gain(D,敲聲)=0.141
Gain(D,紋理)=0.381,Gain(D,臍部)=0.289,Gain(D,觸感)=0.006。 因此首先對紋理進行劃分,然後,決策樹演算法將對每個分支結點做進一步劃分,最終得到如下決策樹。 基尼係數                                  基尼係數越小,說明純度越高(pk均相等時,達到基尼係數最小值)。因此劃分時選擇基尼係數最小的屬性。
剪枝處理 剪枝是決策樹演算法對付“過擬合”的主要手段,分支過多,對訓練資料的擬合很完美,但對測試資料則不一定,且效率較低。因此可主動去掉一些分支來降低過擬合的風險。剪枝處理包括預剪枝和後剪枝,分別對應著在決策樹生成過程中/決策叔生成完畢後進行剪枝處理。
對某一結點是否進行剪枝處理的依據是劃分前後驗證集精度是否提高。 例如樣本中4個好瓜,3個壞瓜,若不按某一屬性(臍部)劃分,則由於好瓜數量多,將此結點標記為好瓜,驗證精度為4/7。若按臍部劃分(凹陷:好瓜、稍凹:好瓜、平坦:壞瓜)後,求得驗證精度提高(大於4/7),則認為此處劃分合理,不需要剪枝條,反之則剪。 預剪枝使得決策樹很多分枝都沒有“展開”,不僅降低了過擬合風險,還顯著減少了決策樹訓練時間和開銷。但另一方面,有些分支當前劃分雖不能提升泛化效能,甚至降低泛化效能,但在其基礎上的後續劃分可能導致效能顯著提高,給決策樹帶來欠擬合風險。後剪枝通常比預剪枝保留更多分支,欠擬合風險小,泛化效能優於預剪枝決策樹,但其時間開銷要大得多。 連續值處理 連續值處理方法很簡單,在已有屬性的取值範圍內定義多個劃分點。 尋找最優劃分點,同樣是基於純度。再將樣本根據此點一分為2,即完成劃分。 此外,還可能出現樣本中某一屬性值缺失的情況,需要解決兩個個問題: (1)如何在屬性值缺失的情況下進行劃分屬性選擇 引入權值ro,代表無缺失資料比重,例如若樣本對於某一屬性值有40%資料丟失,則ro=0.6,利用無缺失屬性值資料計算出的資訊增益後需要乘上ro,作為真實資訊增益。 (2)若樣本在該屬性上的值缺失,如何劃分該樣本 將樣本同時投入所有分支,但在不同分支權重不同,權重由不同分支中的資料量決定 多變數決策樹 之前所述決策樹劃分條件都是單一變數,使用多變數作為劃分條件可以使得決策樹變得更復雜,劃分更加精確,但是邊界尋找比較困難。如下圖是一個多變數決策樹。       

MATLAB函式使用 1.建立分類決策樹或迴歸決策樹
load carsmall % contains Horsepower, Weight, MPG
X = [Horsepower Weight];
rtree = fitrtree(X,MPG);% create regression tree

load fisheriris % load the sample data
ctree = fitctree(meas,species); % create classification tree
view(ctree) % text description

順便提一下,MATLAB中預設的劃分方法是基於基尼係數的。 2.用訓練好的決策樹做資料分類
load ionosphere % contains X and Y variables
ctree = fitctree(X,Y);
Ynew = predict(ctree,mean(X))
3.檢驗決策樹效能並修正 最簡單的效能檢測就是生成一顆決策樹後,輸入所有資料樣本,進行誤差檢驗。這種檢測方法輸入資料樣本中包含了訓練資料,因此得到結果比實際結果要好的多,泛化能力差,過於樂觀。
load fisheriris
ctree = fitctree(meas,species);
resuberror = resubLoss(ctree)
因此常常採用交叉檢驗法,因為交叉檢驗法使用的測試資料不同於訓練資料,且是一個多次平均的結果,因此其對效能的估計比較準確。並根據交叉檢驗法進行決策樹的修改,使得其效能表現更好。 (1)限定每個葉節點包含的最少資料量 如果不進行限定,每個葉節點包含的最小資料量為1,過多的葉子結點必然造成決策樹泛化能力的降低,因此應該求得一個Leaf(min),從而使得計算出交叉誤差最小。
leafs = logspace(1,2,10);
rng('default')
N = numel(leafs);
err = zeros(N,1);
for n=1:N
    t = fitctree(X,Y,'CrossVal','On',...
        'MinLeaf',leafs(n));
    err(n) = kfoldLoss(t);
end
plot(leafs,err);
xlabel('Min Leaf Size');
ylabel('cross-validated error');
得到最小的葉子尺寸,再進行決策樹生成
OptimalTree = fitctree(X,Y,'minleaf',40);
(2)剪枝 與上面類似,計算不同剪枝下的交叉檢測誤差,選擇最小誤差處剪枝。
[~,~,~,bestlevel] = cvLoss(tree,...
    'SubTrees','All','TreeSize','min')
tree = prune(tree,'Level',bestlevel);