2017-09-27 8 views
1

J'ai simulé des données pour créer un arbre de régression avec 3 noeuds terminaux:Arbre de régression avec des données simulées - paquet rpart

set.seed(1988) 
n=1000 
X1<-rnorm(n,mean=0,sd=2) 
X2<-rnorm(n,mean=0,sd=2) 
e<-rnorm(n) 
Y=5*I(X1<1)*I(X2<0.2)+4*I(X1<1)*I(X2>=0.2)+3*I(X1>=1)+e 
mydat=as.data.frame(cbind(Y,X1,X2)) 

Donc, je veux d'abord diviser par X1 < 1, et pour X1 < 1 Je veux diviser par X2 < 0,2. Les valeurs de Y dans les feuilles sont le coefficient de l'indicateur.

Si j'exécute la procédure implémentée dans le paquet RPART tout va bien dans le cas ci-dessus.

mytree<-rpart(Y~.,data=mydat) 
mytree 

Sortie:

node), split, n, deviance, yval 
     * denotes terminal node 

1) root 1000 1627.0670 4.043696 
    2) X1>=0.9490461 326 373.8485 3.124825 * 
    3) X1< 0.9490461 674 844.8367 4.488135 
    6) X2>=0.2488142 327 312.7506 3.970742 * 
    7) X2< 0.2488142 347 362.0582 4.975708 * 

Il fonctionne aussi si je tente avec un coefficient négatif. Mais quand j'essaie de générer des valeurs négatives et des valeurs positives dans les termes finaux (cela signifie dans "l'interaction" de l'arbre, donc où la division est divisée à un second niveau), RPART change l'ordre de la division et valeur dans les feuilles ne sont pas correctes:

Y=-5*I(X1<1)*I(X2<0.2)+4*I(X1<1)*I(X2>=0.2)+3*I(X1>=1)+e 
mydat=as.data.frame(cbind(Y,X1,X2)) 

mytree<-rpart(Y~.,data=mydat) 
mytree 

sortie:

node), split, n, deviance, yval 
     * denotes terminal node 

1) root 1000 17811.4000 0.6136962 
    2) X2< 0.1974489 515 8116.5350 -2.3192910 
    4) X1< 1.002815 343 359.7394 -5.0305350 * 
    5) X1>=1.002815 172 207.4313 3.0874360 * 
    3) X2>=0.1974489 485 560.3419 3.7281050 * 

Quelqu'un at-il une idée de ce problème?

Merci

Répondre

0

Vous devez régler le paramètre de complexité cp. Voir le code ci-dessous.

# Data Generating Process 
set.seed(1988) 
n=1000 
X1<-rnorm(n,mean=0,sd=2) 
X2<-rnorm(n,mean=0,sd=2) 
e<-rnorm(n) 
Y=-5*I(X1<1)*I(X2<0.2)+4*I(X1<1)*I(X2>=0.2)+3*I(X1>=1)+e 
mydat=as.data.frame(cbind(Y,X1,X2)) 

library(rpart) 
mytree<-rpart(Y~.,data=mydat, cp=0.0001) 

# Plot the cross-validation error vs the complexity parameter 
plotcp(mytree) 

enter image description here

# Find the optimal value of the complexity parameter cp 
optcp <- mytree$cptable[which.min(mytree$cptable[,4]),1] 

# Prune the tree using the optial complexity parameter 
mytree <- prune(mytree,optcp) 

L'arbre élagué représente correctement le processus de génération de données sous-jacentes

library(rattle) 
fancyRpartPlot(mytree) 

enter image description here

+0

Merci, maintenant il fonctionne! –