ACT2040: de la robustesse des arbres
By arthur charpentier on Tuesday, December 6 2011, 14:44 - ACT2040-2011 - Permalink
Pour répondre à une question rapide, la robustesse des arbres dépend de deux choses: du nombre d'observations (plus il y a d'observations, plus les nœuds seront stables), et de l'hétérogénéité entre les classes (plus les classes sont différentes, plus il sera facile de les distinguer). Pour faire simple, considérons un petit modèle binomial à trois classes (avec une unique variable explicative), par exemple si on simule 1000 valeurs,
m=c(.2,.5,.3) moyenne=function(x){ return(m[1]*(x<3)+m[2]*((x>=3)&(x<=7))+m[3]*(x>7)) } MY=Vectorize(moyenne) set.seed(1) n=1000 U=runif(n)*10 Y=rbinom(n,size=1,prob=MY(U)) plot(U,Y,ylim=c(-.1,1.1)) library(splines) base=data.frame(Y,U) reg=glm(Y~bs(U,10),data=base,family=binomial) u=seq(0,10,by=.01) y=predict(reg,newdata=data.frame(U=u),type="response") lines(u,y,lwd=2,col="blue") lines(u,MY(u),lwd=2,col="red",type="s")

Si on simule quelques milliers d'échantillons, on peut regarder la distribution de mes nœuds (si le découpage par arbre converge), en gardant - au mieux - que deux nœuds,
set.seed(1) N=matrix(NA,10000,2) n=1000 for(s in 1:1000){ U=runif(n)*10 Y=rbinom(n,size=1,prob=MY(U)) T=tree(Y~U) noeud=T$frame$splits[,1] noeud=noeud[noeud!=""] NOEUD=as.numeric(substr(noeud,2,nchar(noeud))) N[s,]=NOEUD[1:2] } vn=as.vector(N) vn=vn[is.na(vn)==FALSE] plot(density(vn,bw=.2),col="blue",lwd=2,xlim=c(0,10)) abline(v=c(3,7),col="red")

Rappelons que l'on a ici 1000 observations pour faire notre régression, avec trois classes, dont les valeurs moyennes par classe sont respectivement 20%, 50% et 30%. On note que l'on coupe bien entre les deux premières classes, un peu moins bien entre les deux dernières.
Si on suppose que les classes sont moins différentes, par exemple avec des valeurs moyennes à 30%, 50% et 40%, on obtient visuellement la distribution suivante pour les nœuds,

En l’occurrence, on a beaucoup de mal à distinguer entre les deux dernières classes.
Si on change la taille de notre échantillon, en passant de 1000 à 200, on s'aperçoit (en revenant aux valeurs précédentes des taux par classes) que l'on a beaucoup de mal à estimer correctement les nœuds,

De manière assez surprenante, il va prendre des nœuds proches des bords (proches de 0 et de 10).
Moralité, les classes obtenues par arbre ne sont robustes qu'à condition d'avoir suffisamment d'observations, et d'avoir des classes réellement différentes.







Comments
Je pense alors qu'il faudrait créer une fonction avec comme critère la taille minimale des segments et l'hétérogénéité dans des classes en tant qu'entité. mais bon, je crois que l'homogénéité est fonction de la taille.
Ceci reste plus ou moins relativement facile à faire. Le seul problème c'est quand j'essayais de mettre comme critère l’homogénéité dans la classe.
Par cet exemple, je viens de voir que le meilleur critère est l'hétérogénéité entre les segments.