R語(yǔ)言中自編基尼系數(shù)的CART回歸決策樹(shù)的實(shí)現(xiàn)
原文鏈接?
http://tecdat.cn/?p=14056
?

?
?
?本文為了說(shuō)明回歸樹(shù)的構(gòu)造(使用CART方法),考慮以下模擬數(shù)據(jù)集,
?
> set.seed(1)
> n=200
> X1=runif(n)
> X2=runif(n)
> P=.8*(X1<.3)*(X2<.5)+
+ ? .2*(X1<.3)*(X2>.5)+
+ ? .8*(X1>.3)*(X1<.85)*(X2<.3)+
+ ? .2*(X1>.3)*(X1<.85)*(X2>.3)+
+ ? .8*(X1>.85)*(X2<.7)+
+ ? .2*(X1>.85)*(X2>.7)
> Y=rbinom(n,size=1,P)
> B=data.frame(Y,X1,X2)
具有一個(gè)因變量(感興趣的變量)和兩個(gè)連續(xù)的自變量( 變量
?和
)。
> tail(B)
Y ? ? ? ?X1 ? ? ? ?X2
195 0 0.2832325 0.1548510
196 0 0.5905732 0.3483021
197 0 0.1103606 0.6598210
198 0 0.8405070 0.3117724
199 0 0.3179637 0.3515734
200 1 0.7828513 0.1478457
理論分區(qū)如下

?
在這里,可以將樣本繪制在下方(請(qǐng)注意,第一個(gè)變量在上方的y軸上,在下方的x軸上),藍(lán)色點(diǎn)???等于1,紅色點(diǎn)等于0,
> plot(X1,X2,col="white")
> points(X1[Y=="1"],X2[Y=="1"],col="blue",pch=19)
> points(X1[Y=="0"],X2[Y=="0"],col="red",pch=19)

?
為了構(gòu)造樹(shù),我們需要一個(gè)分區(qū)critera。最標(biāo)準(zhǔn)的可能是Gini的索引,當(dāng)將s分為兩類時(shí),可以寫(xiě)出該索引,??在此表示?
?
或??將分為三類時(shí),表示為?
等等,這里
?只是屬于分區(qū)的觀測(cè)值的計(jì)數(shù),??
?其???取值為

。但是可以考慮其他標(biāo)準(zhǔn),例如卡方距離,
?
在傳統(tǒng)上,當(dāng)我們考慮兩個(gè)等級(jí)時(shí),或者在三個(gè)等級(jí)的情況下。
同樣,這里的想法是使距離最大化:想法是區(qū)分,所以我們希望樣本盡可能不獨(dú)立。要計(jì)算基尼系數(shù)
我們只需構(gòu)造列聯(lián)表,然后計(jì)算上面給出的數(shù)量。首先,假設(shè)只有一個(gè)解釋變量。我們將樣本一分為二,并使用所有可能的分割值
,即
然后,我們?yōu)樗羞@些值計(jì)算基尼系數(shù)。結(jié)是使基尼系數(shù)最大化的值。有了第一個(gè)節(jié)點(diǎn)后,我們將繼續(xù)保留(從現(xiàn)在開(kāi)始將其稱為
)。我們通過(guò)尋找最佳第二選擇來(lái)重申:給定一個(gè)根節(jié)點(diǎn),考慮將樣本一分為三的值,并給出最高的基尼系數(shù),因此,我們考慮以下分區(qū)
或這個(gè)
也就是說(shuō),我們?cè)谏弦粋€(gè)結(jié)的下方或上方分割。然后我們進(jìn)行迭代。代碼可以是這樣的,
> for(s in 1:4){
+ for(i in 1:length(u)){
+ vgini[i]=GINI(Y,I)
+ }
+
+
+ cat("knot",k,u[k],"\n")
+
+
+ }
knot 69 0.3025479
knot 133 0.5846202
knot 72 0.3148172
knot 111 0.4811517
第一步,基尼系數(shù)的值如下:

?
最高約為0.3。然后,我們嘗試分三部分構(gòu)造一個(gè)分區(qū)(拆分為0.3以下或以上)。我們得到以下基尼系數(shù)圖(作為第二個(gè)節(jié)點(diǎn)的函數(shù))

?當(dāng)樣本在0.6左右分裂(這成為我們的第二個(gè)節(jié)點(diǎn))時(shí)最大。等,現(xiàn)在,讓我們將代碼與標(biāo)準(zhǔn)R函數(shù)進(jìn)行比較,
node), split, n, deviance, yval
* denotes terminal node
1) root 200 49.8800 0.4750
2) X2 < 0.302548 69 12.8100 0.7536 *
3) X2 > 0.302548 131 28.8900 0.3282
6) X2 < 0.58462 65 16.1500 0.4615
12) X2 < 0.324591 7 ?0.8571 0.1429 *
13) X2 > 0.324591 58 14.5000 0.5000 *
7) X2 > 0.58462 66 10.4400 0.1970 *
我們確實(shí)獲得了類似的結(jié):第一個(gè)為0.302,第二個(gè)為0.584。因此,構(gòu)造樹(shù)并不難...
現(xiàn)在,如果我們考慮兩個(gè)解釋變量,該怎么辦?保持不變,除了分區(qū)的編寫(xiě)現(xiàn)在變得更加復(fù)雜。為了找到第一個(gè)節(jié)點(diǎn),我們考慮了兩個(gè)分量的所有值,然后再次保持最大化基尼指數(shù)的值,
> plot(u1,gini[,1],ylim=range(gini),col="green",type="b",xlab="X1",ylab="Gini index")
> abline(h=mg,lty=2,col="red")
> if(i==1){points(u1[which.max(gini[,1])],mg,pch=19,col="red")
+ ? ? ? ? ?segments(u1[which.max(gini[,1])],mg,u1[which.max(gini[,1])],-100000)}
> u2[which.max(gini[,2])]
[1] 0.3025479
這些圖如下所示并獲得了右側(cè)的分區(qū),

?
或者我們分割第二個(gè)分區(qū)(然后得到以下分區(qū)),

?
在這里,最好先分割第二個(gè)變量。實(shí)際上,我們回到了前面討論的一維情況:正如預(yù)期的那樣,最好在0.3左右進(jìn)行分割。以下代碼已確認(rèn)這一點(diǎn),
var ? n ? ? ? dev ? ? ?yval splits.cutleft splits.cutright
1 ? ? X2 200 49.875000 0.4750000 ? ? ?<0.302548 ? ? ? >0.302548
2 ? ? X1 ?69 12.811594 0.7536232 ? ? ?<0.800113 ? ? ? >0.800113
4 <leaf> ?57 ?8.877193 0.8070175
5 <leaf> ?12 ?3.000000 0.5000000
對(duì)于第二個(gè)結(jié),應(yīng)考慮四種情況:在第二個(gè)變量上再次分裂(再次),在上一個(gè)結(jié)之上或之下(請(qǐng)參見(jiàn)左下方)或在第一個(gè)變量上分裂。然后在上一個(gè)結(jié)的下方或上方設(shè)置一個(gè)分區(qū)(請(qǐng)參見(jiàn)右下方),

?
為了使樹(shù)可視化,代碼如下
?
注意,我們也可以可視化該分區(qū)。
?
參考文獻(xiàn)
?
1.從決策樹(shù)模型看員工為什么離職
?
2.R語(yǔ)言基于樹(shù)的方法:決策樹(shù),隨機(jī)森林,套袋Bagging,增強(qiáng)樹(shù)數(shù)據(jù)分析
?
3.python中使用scikit-learn和pandas決策樹(shù)進(jìn)行鳶尾花數(shù)據(jù)分類
?
4.R語(yǔ)言對(duì)用電負(fù)荷時(shí)間序列數(shù)據(jù)進(jìn)行K-medoids聚類建模和GAM回歸
?
5.R語(yǔ)言k-Shape算法股票價(jià)格時(shí)間序列聚類
?
6.r語(yǔ)言鳶尾花iris數(shù)據(jù)集的層次聚類
?
7.Python Monte Carlo K-Means聚類實(shí)戰(zhàn)研究
?
8.用R進(jìn)行網(wǎng)站評(píng)論文本挖掘聚類
?
9.Python中的Apriori關(guān)聯(lián)算法市場(chǎng)購(gòu)物籃分析
?
10.通過(guò)Python中的Apriori算法進(jìn)行關(guān)聯(lián)規(guī)則挖掘
?
11.使用LSTM神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)愛(ài)爾蘭的電力消耗
?
12.用R語(yǔ)言實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)股票實(shí)例
?