Les posteurs les plus actifs de la semaine
Nik
 
Aymeen
 
Florent Aubry
 
FMarwen
 
clemm
 
AdrienC
 
zezima
 
NOUSRA
 
atm
 
droopy
 


Noeud Arbre de Régression

Aller en bas

Noeud Arbre de Régression

Message par Bonjour Atous le Mer 16 Mai 2018 - 8:43

Bonjour,

J'essaye de comprendre comment fonction un arbre de régression. Je sais qu'à chaque noeud, une séparation binaire est effectuée (on sépare les données en deux groupes), de façon à minimiser un critère.

Avec l'arbre de régression, le plus utilisé est celui des MSE.

On a des données (x,y), que l'on sépare en deux groupes G1 et G2. Pour faire une prédiction sur un certain x (appartenant ou non au jeu de données initiale), on regarde si ce x est inférieur ou non à un x_lim, si il est inférieur, on lui attribue la valeur y1 = moyenne( y appartenant à G1), sinon on lui attribue y2 = moyenne( y appartenant à G2).

Le critère MSE que l'on cherche à minimiser est donc, trouver un x_lim (qui est dans les données donc), telle que l'on minimise la quntité suivante:

MSE = somme( ( y dans G1  -  y1 )^2  )  / nombre d'éléments dans G1      +    somme( ( y dans G2  -  y2 )^2  )  / nombre d'éléments dans G2


Sauf que j'ai essayé avec R, de faire un arbre simple (un seul noeud...), et je regarde la séparation. (bon rpart de R utilise la critère de Gini, mais c'est quasi le même que les MSE, de plus j'ai essayé avec Python, qui lui utilise les MSE, et j'ai les mêmes problèmes...)

En effet, je regarde la séparation pour le noeud de l'arbre, puis j'ai calculé (avec la fonction my_mse), les mse pour chaque x de mon vecteur x de données.
Et je ne touve pas que la séparation de l'arbre est pour le x avec le mse minimal.

Voici mon code (si vous voulez python aussi, je le mettrai Smile )


library(rpart)
library(rpart.plot)

n = 100
x = seq(-2, 2, length=n)
y = x ^ 2
D = data.frame(x,y)

Tmax=rpart(y~.,data=D, parms = list(split = "gini"), control=rpart.control(minsplit=2, cp=10^(-10), maxdepth = 1) )
summary( Tmax )


my_mse = function(x, y)
{
n = length(x)
mse = c()

for (i in 2:(n-1))
{
indices1 = which( x < x[i])
m1 = sum( ( y[indices1] - mean(y[indices1]) )^2 ) / length(indices1)

indices2 = c( (indices1[length(indices1)]+1):n )
m2 = sum( ( y[indices2] - mean(y[indices2]) )^2 ) / length(indices2)

mse = c(mse, m1+m2)
}

return (mse)
}



mse = my_mse(x, y)
new_x = x[ c( 2:(n-1) ) ]

plot(new_x, mse, col='red')
lines( c(1.414, 1.414), c(1.2, 3), type='l', col='green')






Merci d'avance pour vos liens/conseils!  Smile

Bonjour Atous

Nombre de messages : 2
Date d'inscription : 16/05/2018

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Noeud Arbre de Régression

Message par Bonjour Atous le Mer 16 Mai 2018 - 12:41

Je réponds à ma question si cela peut aider certains.

Contrairement à ce qui est marqué dans nombre de forums/articles, le critère retenu n'est pas la minimisation de la quantité que j'avais définie dans mon post précédent (où l'on divise les erreurs de chaque groupe par le cardinal du même groupe), mais la somme des erreurs pour les deux groupes, que l'on divise par le nombre total de données.

Et bizarrement, dans quand même beaucoup de forum et autres, le critère indiqué est souvent faux... Dans l'idée ça reste une certaine minimisation des MSE, mais en pratique on a des résultats différents.

(bon sinon c'est probablement moi qui suis aussi un peu crétin Rolling Eyes)

Bref, pour avoir le bon noeud avec mon petit code R, dans la fonction my_mse, on doit diviser par n, et non pas pas length(indice1) ou length(indices2) .


Voilà voilà

Bonjour Atous

Nombre de messages : 2
Date d'inscription : 16/05/2018

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum