J'utilise le package randomForest dans R (R version 2.13.1, randomForest version 4.6-2) pour la régression et j'ai remarqué un biais significatif dans mes résultats: l'erreur de prédiction dépend de la valeur de la variable de réponse. Les valeurs élevées sont sous-prédites et les valeurs faibles sont sur-prédites. Au début, je soupçonnais que c'était une conséquence de mes données, mais l'exemple simple suivant suggère que cela est inhérent à l'algorithme de forêt aléatoire:
n = 1000;
x1 = rnorm(n, mean = 0, sd = 1)
response = x1
predictors = data.frame(x1=x1)
rf = randomForest(x=predictors, y=response)
error = response-predict(rf, predictors)
plot(x1, error)
Je soupçonne que le biais dépend de la distribution de la réponse, par exemple, s'il x1
est uniformément distribué, il n'y a pas de biais; s'il x1
est distribué de façon exponentielle, le biais est unilatéral. Essentiellement, les valeurs de la réponse à la queue d'une distribution normale sont aberrantes. Il n'est pas surprenant qu'un modèle ait du mal à prévoir les valeurs aberrantes. Dans le cas de randomForest, une valeur de réponse d'une amplitude extrême de la queue d'une distribution est moins susceptible de se retrouver dans une feuille terminale et son effet sera éliminé dans la moyenne d'ensemble.
Notez que j'ai essayé de capturer cet effet dans un exemple précédent, "RandomForest in R linear regression tails mtry". C'était un mauvais exemple. Si le biais dans l'exemple ci-dessus est vraiment inhérent à l'algorithme, il s'ensuit qu'une correction de biais pourrait être formulée étant donné la distribution de réponse que l'on essaie de prédire, résultant en des prédictions plus précises.
Les méthodes basées sur les arbres, comme la forêt aléatoire, sont-elles sujettes à un biais de distribution de réponse? Si tel est le cas, cela est-il déjà connu de la communauté des statistiques et comment est-il généralement corrigé (par exemple, un deuxième modèle qui utilise les résidus du modèle biaisé en entrée)?
La correction d'un biais dépendant de la réponse est difficile car, par nature, la réponse n'est pas connue. Malheureusement, la réponse estimée / prédite ne partage pas souvent la même relation avec le biais.
la source
Réponses:
C'est parfaitement ce que vous pensez - le fait que les nœuds foliaires contiennent des moyens sur un ensemble d'objets rend tout modèle d'arbre de régression resserrer la distribution de réponse et rendre toute extrapolation impossible. Ensemble, bien sûr, n'aide pas à cela et aggrave en fait la situation.
La solution naïve (et dangereuse en raison du sur-ajustement) consiste à envelopper le modèle dans une sorte de régression classique qui redimensionnerait la réponse à sa distribution souhaitée.
La meilleure solution est l'un des modèles d'arbre de modèle en feuille, comme par exemple MOB dans le package de partie. L'idée ici est que le partitionnement de l'espace des fonctionnalités devrait se terminer lorsque le problème est simplifié non pas à une valeur simple (comme dans l'arbre normal) mais à une relation simple (par exemple linéaire) entre la réponse et certains prédicteurs. Une telle relation peut maintenant être résolue en ajustant un modèle simple qui ne perturbera pas la distribution ou ne réduira pas les valeurs extrêmes et pourrait extrapoler.
la source
J'ai eu exactement le même problème avec RF conditionnelle accessible via le paquet hochet. J'ai envoyé un courriel à Graham Williams (auteur de rattle) à ce sujet, qui a gentiment transmis ma requête aux auteurs de cforest, qui ont répondu et suggéré de jouer avec deux paramètres qui ne semblent en fait être référencés nulle part dans la documentation du CRF, mais qui semblaient néanmoins répondre le problème, à savoir minplit = 2 et minbucket = 1.
la source
minsplit
, Je suppose que vous voulez direVous devez estimer la valeur optimale de mtry et sampsize en minimisant l '"erreur de validation croisée" hors échantillon sur une grille de différents mtry, sampsize paramètres, pour toute variable de réponse correspondante pour un ensemble fixe de fonctionnalités, puis tirer des conclusions - en termes de résultats. Vous pouvez créer une combinaison des paramètres de grille à l'aide de expand.grid.
la source