熱線電話:13121318867

登錄
首頁精彩閱讀數據挖掘之決策樹分類
數據挖掘之決策樹分類
2016-05-19
收藏

數據挖掘決策樹分類

1. 理論知識

決策樹分類算法的一般流程如下:一開始,所有的實例均位于根節點,所有參數的取值均離散化;根據啟發規則選擇一個參數,根據參數取值的不同對實例集進行分割;對分割后得到的節點進行同樣的啟發式參數選擇分割過程,如此往復,直到(a)分割得到的實例集合屬于同一類;(b)參數用完,以子集中絕大多數的實例類別作為該葉節點的類別。

核心問題:參數選擇規則
   在每一個節點進行參數選擇時,由于有眾多的選項,需要一個選擇規則?;镜脑瓌t是使最后構造出的決策樹規模最小?;谶@個基本原則,我們啟發式地定義規則為使分割后得到的子節點純度最大。于是參數選擇規則問題就轉化為了純度定義的問題。
   我們利用熵(Entropy)的概念去描述“不純度”,熵值越大,說明這個節點的純度越低:當節點的類別均勻分布時,熵值為1;當只包含一類時,熵值為0.熵的計算公式如下圖,以2為底的概率對數與概率乘積之和的相反數。

   基于熵的概念,我們可以得到參數選擇的第一個規則:信息增益(Info Gain).信息增益的定義是分裂前的節點熵減去分裂后子節點熵的加權和,即不純度的減少量,也就是純度的增加量。參數選擇的規則是:選擇使信息增益最大的參數分割該節點。信息增益計算的算例如下圖。

   信息增益存在的問題時:總是傾向于選擇包含多取值的參數,因為參數的取值越多,其分割后的子節點純度可能越高。為了避免這個問題,我們引入了增益比例(Gain Ratio)的選擇指標,其定義如下圖所示。

   增益比例存在的問題是:傾向于選擇分割不均勻的分裂方法,舉例而言,即一個拆分若分為兩個節點,一個節點特別多的實例,一個節點特別少的實例,那么這種拆分有利于被選擇。

   為了克服信息增益和增益比例各自的問題,標準的解決方案如下:首先利用信息增益概念,計算每一個參數分割的信息增益,獲得平均信息增益;選出信息增益大于平均值的所有參數集合,對該集合計算增益比例,選擇其中增益比例最大的參數進行決策樹分裂。 

   上面介紹的是基于熵概念的參數選擇規則,另一種流行的規則稱為基尼指數(Gini Index),其定義如下圖?;嵯禂翟诠濣c類別分布均勻時取最大值1-1/n,在只包含一個類別時取最小值0. 所以與熵類似,也是一個描述不純度的指標。

   基于基尼系數的規則是:選擇不純度減少量(Reduction in impurity)最大的參數。不純度減少量是分割前的Gini index減去分割后的Gini index?;嵯禂档奶攸c與信息增益的特點類似。

過度擬合問題(Overfitting)

  過度擬合問題是對訓練數據完全擬合的決策樹對新數據的預測能力較低。為了解決這個問題,有兩種解決方法。第一種方法是前剪枝(prepruning),即事先設定一個分裂閾值,若分裂得到的信息增益不大于這個閾值,則停止分裂。第二種方法是后剪枝(postpruning),首先生成與訓練集完全擬合的決策樹,然后自下而上地逐層剪枝,如果一個節點的子節點被刪除后,決策樹的準確度沒有降低,那么就將該節點設置為葉節點(基于的原則是Occam剪刀:具有相似效果的兩個模型選擇較簡單的那個)。

Scalable決策樹分類算法

   這里介紹兩個算法,一個是RainForest,其主要的貢獻是引入了一個稱為AVC的數據結構,其示意圖如下。主要的作用是加速參數選擇過程的計算。

   另一個算法稱為BOAT,其采用了稱為bootstrap的統計技術對數據集進行分割,在分割的子數據集上分別構造決策樹,再基于這些決策樹構造一個新的決策樹,文章證明這棵新樹與基于全局數據集構造的決策樹非常相近。這種方法的主要優勢在于支持增量更新。

2. R語言實現
   本文采用rpart和rpart.plot包進行決策樹分類的案例講解。
函數說明
   rpart包主要有兩個函數組成,分別介紹如下:

rpart(formula, data, weight s, subset, na. action = na. rpart, method, model= FALSE, x= FALSE,y= TRUE, parms, control, cost, . . . )

fomula 回歸方程形式: 例如 y~ x 1+ x2+ x3。

data 數據: 包含前面方程中變量的數據框( data frame) 。

na.action 缺失數據的處理辦法: 默認辦法是刪除因變量缺失的觀測而保留自變量缺失的觀測。

method 根據樹末端的數據類型選擇相應變量分割方法,本參數有四種取值: 連續型>anova; 離散型>class; 計數型( 泊松過程)>poisson; 生存分析型>exp。程序會根據因變量的類型自動選擇方法, 但一般情況下最好還是指明本參數, 以便讓程序清楚做哪一種樹模型。

parms 用來設置三個參數:先驗概率、損失矩陣、分類純度的度量方法。anova沒有參數;poisson分割有一個參數,先驗分布變異系數的比率,默認為1;生存分布的參數和poisson一致;對離散型,可以設置先驗分布的分布的概率(prior),損失矩陣(loss),分類純度(split);priors必須為正值且和為1,loss必須對角為0且非對角為正數,split可以是gini(基尼系數)或者information(信息增益);

control 控制每個節點上的最小樣本量、交叉驗證的次數、復雜性參量: 即cp: complexity pamemeter, 這個參數意味著對每一步拆分, 模型的擬合優度必須提高的程度, 等等。

PS:交叉驗證指,比如xval是10折交叉驗證:將數據集分為10組,進行10次擬合,第i次擬合用除了第i組以外的數據訓練,用第i組進行預測;目的是減少misclaassification rate。  

prune(tree, cp, . . . )

tree 一個回歸樹對象, 常是rpart()的結果對象。

cp 復雜性參量, 指定剪枝采用的閾值。

建模方法概述
   通常分為兩步建立回歸樹,最初生成一顆較大的樹,然后通過統計估量刪除底部的一些節點來對樹進行修剪。這個過程的目的是防止過度擬合。
   使用rpart函數構建樹的過程中,當給定條件滿足時構建過程就停止。偏差的減少小于某一個給定界限值、節點中的樣本數量小于某個給定界限、樹的深度大于一個給定的界限,上面三個界限分別由rpart()函數的三個參數(cp、minsplit、maxdepth)確定,默認值是0.01、20和30。如果要避免樹的過度擬合問題,就要經常檢查這些默認值的有效性,這可以通過對得到的樹采取事后修剪的過程來實現。
   選擇樹的方法一般有兩種,一種是最小化交叉驗證的相對方差(xerror)。另外一種是在剪枝理論中,比較著名的規則就是1-SE(1標準差) 規則, 其意思是: 首先要保證預測誤差( 通過交叉驗證獲得, 在程序中表示為xerror) 盡量小,但不一定要取最小值, 而是允許它在“最小的誤差”一個相應標準差的范圍內, 然后在此范圍內選取盡量小的復雜性參量,進而以它為依據進行剪枝。這個規則體現了兼顧樹的規模( 復雜性) 和誤差大小的思想, 因為一般說來, 隨著拆分的增多, 復雜性參量會單調下降(純度越來越高) , 但是預測誤差則會先降后升, 這樣, 就無法使復雜性和誤差同時降到最低,因此允許誤差可以在一個標準差內波動。
案例

rpart包自帶數據集stagec,包含了146位患了stage c前列腺(prostate)癌的病人。變量介紹如下:

pgtime: 出現癥狀或復發時間,單位年;

pgstat:狀態變量,1為復發,0為刪減;

age:年齡;

eet:是否內分泌治療,1為no,2為yes;

g2:g2階段腫瘤細胞百分比;

grade:腫瘤等級,farrow體系;

gleason:腫瘤等級,gleason體系;

ploidy:腫瘤的倍體狀態。

代碼:
library(rpart);  
## rpart.control對樹進行一些設置  
## xval是10折交叉驗證:將數據集分為10組,進行10次擬合,第i次擬合用除了第i組以外的數據訓練,用第i組進行預測;目的是減少misclaassification rate  
## minsplit是最小分支節點數,這里指大于等于20,那么該節點會繼續分劃下去,否則停止  
## cp全稱為complexity parameter,指某個點的復雜度,對每一步拆分,模型的擬合優度必須提高的程度  
ct <- rpart.control(xval=10, minsplit=20, cp=0.01)  
## method:樹的末端數據類型選擇相應的變量分割方法:  
## 連續性method=“anova”,離散型method=“class”,計數型method=“poisson”,生存分析型method=“exp”  
## parms用來設置三個參數:先驗概率、損失矩陣、分類純度的度量方法(gini和information)
## parms的解釋:For classification splitting, the list can contain any of: the vector of prior probabilities (component prior), the loss matrix (component loss) or the splitting index (component split). The priors must be positive and sum to 1. The loss matrix must have zeros on the diagonal and positive off-diagonal elements. The splitting index can be gini or information. The default priors are proportional to the data counts, the losses default to 1, and the split defaults to gini.
## cost:給每個變量一個成本,選擇某個變量進行split時,split改進量/成本作為評價標準,默認都為1
str(stagec)
progstat <- factor(stagec$pgstat, levels=0:1, labels=c("No", "Prog"))
cfit <- rpart(progstat~age + eet + g2 + grade + gleason + ploidy,
              data=stagec, method="class", control=ct,
              parms=list(split="gini")
              );
print(cfit)
# 繪制決策樹
library(rpart.plot);  
rpart.plot(cfit, branch=1, branch.type=2, type=1, extra=102,  
           shadow.col="gray", box.col="green",  
           border.col="blue", split.col="red",  
           split.cex=1.2, main="Stage C決策樹");  
## rpart包提供了復雜度損失修剪的修剪方法,printcp會告訴分裂到每一層,cp是多少,平均相對誤差是多少  
## 交叉驗證的估計誤差(“xerror”列),以及標準誤差(“xstd”列),平均相對誤差=xerror±xstd  
printcp(cfit);  
## 使用1-SE法則選出最優cp值:找到xerror最小的行,得到誤差閾值為該行的xerror+xstd
## 找到所有xerror小于這個閾值的行,取其中最大值的上限為prune的閾值
cfit2 <- prune(cfit, cp=0.03);  
rpart.plot(cfit2, branch=1, branch.type=2, type=1, extra=102,  
           shadow.col="gray", box.col="green",  
           border.col="blue", split.col="red",  
           split.cex=1.2, main="Kyphosis決策樹");  
附:cp表
        CP nsplit rel error  xerror    xstd
1 0.104938      0   1.00000 1.00000 0.10802
2 0.055556      3   0.68519 1.00000 0.10802
3 0.027778      4   0.62963 0.88889 0.10511
4 0.018519      6   0.57407 0.92593 0.10618
5 0.010000      7   0.55556 0.92593 0.10618


數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢