Les posteurs les plus actifs de la semaine
Aucun utilisateur |
Sujets les plus vus
Noeud Arbre de Régression
Page 1 sur 1
Noeud Arbre de Régression
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 )
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!
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 )
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!
Bonjour Atous- Nombre de messages : 2
Date d'inscription : 16/05/2018
Re: Noeud Arbre de Régression
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 )
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à
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 )
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
Sujets similaires
» Arbre de régression
» Arbre de décision (?) pour profil clients?
» Elagage d'un arbre de décision
» Comment créer un arbre de décision - méthode des graphs ?
» aide compréhension arbre de classification
» Arbre de décision (?) pour profil clients?
» Elagage d'un arbre de décision
» Comment créer un arbre de décision - méthode des graphs ?
» aide compréhension arbre de classification
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum