[]PART (recursive partitioning and regression trees、再帰分割回帰木)

PARTは決定木の代表的な方法。

閾値を決めて直線で分けていくので予測性能はSVM等の機械学習よりは良くないが、結果を解釈しやすいのが利点。

機械学習を全体的に勉強したい場合はHastieの本がお勧め。



決定木は基本的に回帰をやっていると思うので、標準化などの線形変換を行っても結果は変わらない。

またrpartとmvpartでは木の大きさを決めるパラメータが異なっていて、cpとsizeで指定するみたい。

sizeで指定出来た方が結果を制御出来ている感じがする。

出る結果はこんな感じ。

f:id:isseing333:20100508204609j:image

f:id:isseing333:20100508204608j:image


Rでのサンプルコードは以下に。

library(mvpart)

#------3クラスに関連する変数(var1)と関連しない変数(var2)の作成
class <- as.character(rep(1:3, 100))
set.seed(1)
norm <- rnorm(600)
Data <- data.frame(class, var1=round( (norm[1:300]+as.numeric(class))*100, digits=0), var2=round(norm[301:600]*100, digits=0))
DataR <- rpart(class~var1 + var2, data=Data, cp=0.01)
plot(DataR, margin=0.1)
text(DataR, use.n=T)

#---他のパッケージでも同じ結果
DataMV <- mvpart(class~var1 + var2, data=Data, size=5)

library(maptree)
draw.tree (clip.rpart (DataR, best=5), 
       nodeinfo=T, units="species", cases="n", digits=0)


#---分類結果を確認
library(pinktoe)
splits.rpart(DataMV)

library(ggplot2)
p <- ggplot(Data, aes(var1, var2, col=class)) + geom_point()
p + geom_vline(xintercept=121, col=2, lty=2) + geom_vline(xintercept=253, col=3, lty=2)



#------Dataを標準化して決定木
DataScale <- data.frame(apply(Data[, 2:3], 2, scale))
DataScale <- data.frame(class, DataScale)
DataScaleR <- rpart(as.character(class)~var1 + var2, data=DataScale, cp=0.01)
plot(DataScaleR, margin=0.05)
text(DataScaleR, use.n=T)	#maptreeを読み込んだ後だとエラーが出る

ページTOPへ