一、樹(shù)算法介紹
當(dāng)前數(shù)據(jù)挖掘領(lǐng)域中存在10個(gè)火熱的算法、它們涉及到數(shù)據(jù)的聚類(lèi)、分類(lèi)、關(guān)聯(lián)規(guī)則、排序等方面。今天就跟大家說(shuō)說(shuō)基于樹(shù)的分類(lèi)算法--決策樹(shù),決策樹(shù)有非常良好的優(yōu)點(diǎn):
1)決策樹(shù)的夠造不需要任何領(lǐng)域知識(shí),就是簡(jiǎn)單的IF...THEN...思想 ;
2)決策樹(shù)能夠很好的處理高維數(shù)據(jù),并且能夠篩選出重要的變量;
3)由決策樹(shù)產(chǎn)生的結(jié)果是易于理解和掌握的;
4)決策樹(shù)在運(yùn)算過(guò)程中也是非常迅速的;
5)一般而言,決策樹(shù)還具有比較理想的預(yù)測(cè)準(zhǔn)確率。
CART決策樹(shù)又稱(chēng)分類(lèi)回歸樹(shù),當(dāng)數(shù)據(jù)集的因變量為連續(xù)性數(shù)值時(shí),該樹(shù)算法就是一個(gè)回歸樹(shù),可以用葉節(jié)點(diǎn)觀察的均值作為預(yù)測(cè)值;當(dāng)數(shù)據(jù)集的因變量為離散型數(shù)值時(shí),該樹(shù)算法就是一個(gè)分類(lèi)樹(shù),可以很好的解決分類(lèi)問(wèn)題。但需要注意的是,該算法是一個(gè)二叉樹(shù),即每一個(gè)非葉節(jié)點(diǎn)只能引伸出兩個(gè)分支,所以當(dāng)某個(gè)非葉節(jié)點(diǎn)是多水平(2個(gè)以上)的離散變量時(shí),該變量就有可能被多次使用。
決策樹(shù)算法中包含最核心的兩個(gè)問(wèn)題,即特征選擇和剪枝:
關(guān)于特征選擇目前比較流行的方法是信息增益、增益率、基尼系數(shù)和卡方檢驗(yàn),下文就先介紹基于基尼系數(shù)的特征選擇,因?yàn)楸疚?span>所描述的CART決策樹(shù)就是基于基尼系數(shù)選擇特征的;
關(guān)于剪枝問(wèn)題,主要分預(yù)剪枝和后剪枝,預(yù)剪枝是在樹(shù)還沒(méi)有生長(zhǎng)之前就限定了樹(shù)的層數(shù)、葉節(jié)點(diǎn)觀測(cè)數(shù)量等,而后剪枝是在樹(shù)得到充分生長(zhǎng)后,基于損失矩陣或復(fù)雜度方法實(shí)施剪枝,下文將采用后剪枝的方法對(duì)樹(shù)進(jìn)行修正。
二、特征選擇
CART算法的特征選擇就是基于基尼系數(shù)得以實(shí)現(xiàn)的,其選擇的標(biāo)準(zhǔn)就是每個(gè)子節(jié)點(diǎn)達(dá)到最高的純度,即落在子節(jié)點(diǎn)中的所有觀察都屬于同一個(gè)分類(lèi)。下面簡(jiǎn)單介紹一下有關(guān)基尼系數(shù)的計(jì)算問(wèn)題:
假設(shè)數(shù)據(jù)集D中的因變量有m個(gè)水平,即數(shù)據(jù)集可以分成m類(lèi)群體,則數(shù)據(jù)集D的基尼系數(shù)可以表示為:
由于CART算法是二叉樹(shù)形式,所以一個(gè)多水平(m個(gè)水平)的離散變量(自變量)可以把數(shù)據(jù)集D劃分為2^m-2種可能。舉個(gè)例子也許能夠明白:如果年齡段可分為{青年,中年,老年},則其子集可以是{青年,中年,老年}、{青年,中年}、{青年,老年}、{中年,老年}、{青年}、{中年}、{老年}、{}。其中{青年,中年,老年}和空集{}為無(wú)意義的Split,所以6=2^3-2。
對(duì)于一個(gè)離散變量來(lái)說(shuō),需要計(jì)算每個(gè)分區(qū)不純度的加權(quán)和,即對(duì)于變量A來(lái)說(shuō),D的基尼系數(shù)為:
對(duì)于一個(gè)連續(xù)變量來(lái)說(shuō),需要將排序后的相鄰值的中點(diǎn)作為閾值(分裂點(diǎn)),同樣使用上面的公式計(jì)算每一個(gè)分區(qū)不純度的加權(quán)和。
根據(jù)特征選擇的標(biāo)準(zhǔn),只有使每個(gè)變量的每種分區(qū)的基尼系數(shù)達(dá)到最小,就可以確定該變量下的閾值作為分裂變量和分裂點(diǎn)。如果這部分讀的不易理解的話,可參考《數(shù)據(jù)挖掘:概念與技術(shù)》一書(shū),書(shū)中有關(guān)于計(jì)算的案例。
三、剪枝
剪枝是為了防止模型過(guò)擬合,而更加適合樣本外的預(yù)測(cè)。一般決策樹(shù)中的剪枝有兩種方式,即預(yù)剪枝和后剪枝,而后剪枝是運(yùn)用最為頻繁的方法。后剪枝中又分為損失矩陣剪枝法和復(fù)雜度剪枝法,對(duì)于損失矩陣剪枝法而言,是為了給錯(cuò)誤預(yù)測(cè)一個(gè)懲罰系數(shù),使其在一定程度上減少預(yù)測(cè)錯(cuò)誤的情況;對(duì)于復(fù)雜度剪枝法而言,就是把樹(shù)的復(fù)雜度看作葉節(jié)點(diǎn)的個(gè)數(shù)和樹(shù)的錯(cuò)誤率(錯(cuò)誤分類(lèi)觀察數(shù)的比例)的函數(shù)。這里講解的有點(diǎn)抽象,下面我們通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明后剪枝的作用。
四、案例分享
以“知識(shí)的掌握程度”數(shù)據(jù)為例,說(shuō)說(shuō)決策樹(shù)是如何實(shí)現(xiàn)數(shù)據(jù)的分類(lèi)的(數(shù)據(jù)來(lái)源
:http://archive.ics.uci.edu/ml/datasets/User+Knowledge+Modeling)。
該數(shù)據(jù)集通過(guò)5個(gè)維度來(lái)衡量知識(shí)的掌握程度,它們分別是:
STG:目標(biāo)科目的學(xué)習(xí)時(shí)長(zhǎng)程度;
SCG:對(duì)目標(biāo)科目的重復(fù)學(xué)習(xí)程度;
STR:其他相關(guān)科目的學(xué)習(xí)時(shí)長(zhǎng)程度;
LPR:其他相關(guān)科目的考試成績(jī);
PEG:目標(biāo)科目的考試成績(jī)。
知識(shí)的掌握程度用UNS表示,它有4個(gè)水平,即Very Low、Low、Middle、High。
#讀取外部文件
Train <- read.csv(file="">->
Test <- read.csv(file="">->
#加載CART算法所需的擴(kuò)展包,并構(gòu)建模型
library(rpart)
fit <- rpart(uns="" ~="" .,="" data="">->
#查看模型輸出的規(guī)則
fit
上面的輸出規(guī)則看起來(lái)有點(diǎn)眼花繚亂,我們嘗試用決策樹(shù)圖來(lái)描述產(chǎn)生的具體規(guī)則。由于rpart包中有plot函數(shù)實(shí)現(xiàn)決策樹(shù)圖的繪制,但其顯得很難看,我們下面使用rpart.plot包來(lái)繪制比較好看的決策樹(shù)圖:
#加載并繪制決策樹(shù)圖
library(rpart.plot)
rpart.plot(fit, branch = 1, branch.type = 1, type = 2, extra = 102,shadow.col='gray', box.col='green',border.col='blue', split.col='red',main='CART決策樹(shù)')
#將模型用于預(yù)測(cè)
Pred <- predict(object="fit," newdata="Test[,-6]," type='class'>->
#構(gòu)建混淆矩陣
CM <- table(test[,6],="">->
CM
Accuracy <->->
Accuracy
根據(jù)混淆矩陣的顯示結(jié)果,發(fā)現(xiàn)High的預(yù)測(cè)率達(dá)100%(39/39),Low的預(yù)測(cè)率達(dá)91.3%(42/46),Middle的預(yù)測(cè)率達(dá)88.2%(30/34),very_low的預(yù)測(cè)率達(dá)80.8(21/26)。如果希望提升very_low的預(yù)測(cè)準(zhǔn)確率的話就需要將其懲罰值提高,經(jīng)嘗試調(diào)整,構(gòu)建如下損失矩陣:
vec = c(0,1,1,1,1,0,1,1,1,2,0,1,1,3.3,1,0)
cost = matrix(vec, nrow = 4, byrow = TRUE)
cost
Pred2 = predict(fit2, Test[,-6], type = 'class')
CM2 <- table(test[,6],="">->
CM2
Accuracy2
下面再采用復(fù)雜度方法進(jìn)行剪枝,先來(lái)看看原模型的CP值:
printcp(fit)
復(fù)雜度剪枝法滿足的條件是,在預(yù)測(cè)誤差(xerror)盡量小的情況下(不一定是最小值,而是允許最小誤差的一個(gè)標(biāo)準(zhǔn)差(xstd)之內(nèi)),選擇盡量小的cp值。這里選擇cp=0.01。
fit3 = prune(fit, cp = 0.01)
Pred3 = predict(fit3, Test[,-6], type = 'class')
CM3 <- table(test[,6],="">->
CM3
Accuracy3
經(jīng)過(guò)上面的學(xué)習(xí)和實(shí)戰(zhàn),大家明白了分類(lèi)回歸樹(shù)CART的運(yùn)作思路和方法了嗎?動(dòng)手做一做,對(duì)你的理解會(huì)更有幫助!
腳本及數(shù)據(jù)集可至下方鏈接下載:
http://yunpan.cn/c68YsUUFNS284 訪問(wèn)密碼 bde1
最后說(shuō)一點(diǎn),由于前段時(shí)間身體不適,導(dǎo)致公眾號(hào)一直沒(méi)有及時(shí)更新,同時(shí),在這里也感謝網(wǎng)友及朋友們對(duì)我的關(guān)心和支持。后期我將繼續(xù)分享所學(xué)和所用,希望大家繼續(xù)支持和關(guān)注。
每天進(jìn)步一點(diǎn)點(diǎn)2015
學(xué)習(xí)與分享,取長(zhǎng)補(bǔ)短,關(guān)注小號(hào)!
聯(lián)系客服