Forum de Statistiques
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Les posteurs les plus actifs de la semaine
Aucun utilisateur

Le Deal du moment :
TCL C74 Series 55C743 – TV 55” 4K QLED 144 ...
Voir le deal
499 €

Noeud Arbre de Régression

Aller en bas

arbre - Noeud Arbre de Régression Empty Noeud Arbre de Régression

Message par Bonjour Atous 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

Revenir en haut Aller en bas

arbre - Noeud Arbre de Régression Empty Re: Noeud Arbre de Régression

Message par Bonjour Atous 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

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