Estimation d'erreur hors du sac pour augmenter?


9

Dans Random Forest, chaque arbre est cultivé en parallèle sur un échantillon boostrap unique des données. Étant donné que chaque échantillon boostrap devrait contenir environ 63% d'observations uniques, cela laisse environ 37% d'observations, qui peuvent être utilisées pour tester l'arbre.

Maintenant, il semble que dans le boosting de gradient stochastique, il existe également une similaire à celle de RF:OOBerror

Si bag.fraction est défini pour être supérieur à 0 (0,5 est recommandé), gbm calcule une estimation hors sac de l'amélioration des performances prédictives. Il évalue la réduction de l'écart par rapport aux observations non utilisées pour sélectionner le prochain arbre de régression.

Source: Ridgeway (2007) , section 3.3 (page 8).

J'ai du mal à comprendre comment cela fonctionne / est valide. Disons que j'ajoute un arbre dans la séquence. Je fais pousser cet arbre sur un sous-échantillon aléatoire de l'ensemble de données d'origine. J'ai pu tester cet arbre unique sur les observations qui n'ont pas été utilisées pour le faire pousser. D'accord. MAIS , puisque Boosting est séquentiel, j'utilise plutôt toute la séquence d'arbres construits jusqu'à présent pour fournir une prédiction pour ces observations laissées de côté. Et, il y a de fortes chances que bon nombre des arbres précédents aient déjà vu ces observations. Donc, le modèle n'est pas vraiment testé à chaque tour sur des observations invisibles comme avec RF, non?

Alors, comment se fait-il que cela s'appelle une estimation d'erreur "hors du sac"? Pour moi, il ne semble pas être "sorti" de tout sac puisque les observations ont déjà été vues?


1
Voir la discussion ici github.com/scikit-learn/scikit-learn/pull/1806 . Vous n'êtes pas le seul à exprimer vos inquiétudes quant au calcul des estimations OOB.
mpiktas

merci pour le lien, mais malheureusement tous les contributeurs au fil semblent aussi perdus que moi!
Antoine

1
En fait non. Voir github.com/scikit-learn/scikit-learn/pull/2188 . Dans ce commit, le score OOB est changé en amélioration OOB comme le fait gbm. Je ne sais pas comment cette idée fonctionne avec précision, mais d'après ce que j'ai rassemblé, l'échantillon oob pour l'arbre actuel est utilisé pour calculer l'amélioration OOB. Je n'ai pas réussi à trouver les formules mathématiques, il est donc nécessaire de creuser dans le code gbm pour voir comment précisément cette amélioration est calculée.
mpiktas

@Antoine Question vraiment excitante! a-t-on trouvé une réponse définitive?
Soren Havelund Welling du

1
Non, malheureusement. Quelques conseils sont donnés par les liens ci-dessus (dans les commentaires), ce fil et cet autre fil . Cela me rend complètement fou. Un jour, quelqu'un devrait envoyer un e-mail au Dr Friedman / Hastie ... Merci pour votre attention.
Antoine

Réponses:


2

Répondre en partie seulement (et ajouter une nouvelle question à votre question).

L'implémentation de gbm dans R http://www.rdocumentation.org/packages/gbm/functions/gbm a deux paramètres pour ajuster certains hors-bagness.

a) train.fractiondéfinira une proportion des données qui sont utilisées pour former tous les arbres et donc 1- train.fractionseront de vraies données OOB (hors sac).

b) bag.fractiondéfinira la proportion de données d'entraînement à utiliser dans la création de l'arbre suivant du boost. Ainsi, il peut y avoir des données qui ne sont jamais utilisées pour la création d'un arbre et elles peuvent vraiment être utilisées comme données OOB (mais c'est peu probable, voir la question ci-dessous)

Ce qui m'amène à la question. Votre analyse de 37% des données comme étant OOB est vraie pour un seul arbre. Mais la chance qu'il y ait des données qui ne sont pas utilisées dans N'IMPORTE QUEL arbre est beaucoup plus petite - (elle doit être dans l'OOB pour tous les arbres - ma compréhension est que chaque arbre fait son propre bootstrap). Donc, dans RandomForests, il devrait être très peu probable qu'il y ait un OOB pour tester la forêt. Et pourtant, l'implémentation randomForest dans R (basée sur le code original de Breiman) parle beaucoup d'OOB (par exemple les données de résultat et voir http://www.rdocumentation.org/packages/randomForest/functions/randomForest ) n t r e e0.37ntreesntreeerr.rateconfusion

Je ne sais pas comment répondre à cela (et je vous remercie (+1) d'avoir posé la question et de m'avoir fait réaliser que je ne comprenais pas cet aspect de randomForests). La solution possible est qu'il n'y a qu'un seul bootstrap - et tous les arbres sont construits à partir de celui-ci - mais pour autant que je sache, ce n'est pas le cas.


Pour RF / Bagging, il n'y a pas de problème: à n'importe quelle étape du processus de construction d'ensemble, toute observation dans l'ensemble de données d'origine peut être transmise à tous les arbres qui ont été formés sur des échantillons boostrap dépourvus de cette observation. Environ un tiers (~ 37%) du nombre total d'arbres remplira cette condition. De plus, en laissant ces arbres voter et en prenant la classe la plus populaire, une prédiction peut être obtenue pour l'observation. Le nombre de fois où la prévision diffère de la véritable étiquette de l'observation moyenne pour toutes les classes, donne l'estimation d'erreur hors du sac
Antoine

1
aussi, il semble que ce qui donne la capacité d'estimation d'erreur OOB dans Boosting ne vient pas du train.fractionparamètre (qui est juste une caractéristique de la fonction gbm mais n'est pas présent dans l'algorithme d'origine) mais vraiment du fait que seul un sous-échantillon du les données sont utilisées pour former chaque arbre dans la séquence, en laissant de côté les observations (qui peuvent être utilisées pour les tests). Ce qui revient à ma question initiale. Comment ces observations peuvent-elles être utilisées pour les tests, car elles ont probablement été vues plusieurs fois par de nombreux arbres précédents dans la séquence?
Antoine

oublié de mentionner que chaque arbre dans RF est en effet construit à partir de son propre échantillon bootstrap unique des données originales
Antoine

@ user2835597 merci pour vos explications concernant les RF. Ainsi, une erreur OOB d'un RF n'évalue vraiment que 1/3 des arbres de la forêt (cela ne me semble pas très utile). Eh bien, apprendre quelque chose tous les jours.
Jacques Wainer

Quoi qu'il en soit, le paramètre train.fraction semble être la réponse à votre question. L'implémentation sklearn a également un paramètre similaire, le sous-échantillon (voir scikit-learn.org/stable/modules/generated/…
Jacques Wainer

-2

Je crois qu'ils font une estimation hors sac à chaque étape. Étant donné que les résultats de toutes les étapes sont ajoutés (avec des coefficients), les erreurs OOB peuvent également être ajoutées avec les mêmes coefficients.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.