Out-of-Bag-Fehlerschätzung zum Boosten?

9

In Random Forest wird jeder Baum parallel auf einer eindeutigen Boostrap-Stichprobe der Daten gezüchtet. Da erwartet wird, dass jede Boostrap-Probe ungefähr 63% der eindeutigen Beobachtungen enthält, bleiben ungefähr 37% der Beobachtungen aus, die zum Testen des Baums verwendet werden können.

Nun scheint es bei Stochastic Gradient Boosting auch eine -Schätzung zu geben, die der in RF ähnlich ist:OOBerror

Wenn bag.fraction auf größer als 0 eingestellt ist (0,5 wird empfohlen), berechnet gbm eine Out-of-Bag-Schätzung der Verbesserung der Vorhersageleistung. Es bewertet die Verringerung der Abweichung von den Beobachtungen, die bei der Auswahl des nächsten Regressionsbaums nicht verwendet wurden.

Quelle: Ridgeway (2007) , Abschnitt 3.3 (Seite 8).

Ich habe Probleme zu verstehen, wie es funktioniert / gültig ist. Angenommen, ich füge der Sequenz einen Baum hinzu. Ich züchte diesen Baum auf einer zufälligen Teilstichprobe des Originaldatensatzes. Ich konnte diesen einzelnen Baum an den Beobachtungen testen, die nicht zum Wachsen verwendet wurden. Einverstanden. ABER da Boosting sequentiell ist, verwende ich eher die gesamte bisher gebaute Baumsequenz, um eine Vorhersage für diese ausgelassenen Beobachtungen zu liefern. Und es besteht eine hohe Wahrscheinlichkeit, dass viele der vorhergehenden Bäume diese Beobachtungen bereits gesehen haben. Das Modell wird also nicht in jeder Runde auf unsichtbare Beobachtungen wie bei RF getestet, oder?

Wie kommt es also, dass dies als "Out-of-Bag" -Fehlerschätzung bezeichnet wird? Für mich scheint es nicht "aus" jeder Tasche zu sein, da die Beobachtungen bereits gesehen wurden?

Antoine
quelle
1
Siehe die Diskussion hier github.com/scikit-learn/scikit-learn/pull/1806 . Sie sind nicht allein, wenn Sie Bedenken hinsichtlich der Berechnung von OOB-Schätzungen äußern.
mpiktas
danke für den Link, aber leider scheinen alle Thread-Mitwirkenden so verloren zu sein wie ich!
Antoine
1
Nicht wirklich. Siehe github.com/scikit-learn/scikit-learn/pull/2188 . Bei diesem Commit wird der OOB-Score wie bei gbm in OOB-Verbesserung geändert. Ich weiß nicht genau, wie diese Idee funktioniert, aber nach dem, was ich gesammelt habe, wird die OOB-Stichprobe für den aktuellen Baum verwendet, um die OOB-Verbesserung zu berechnen. Ich habe es nicht geschafft, die mathematischen Formeln zu finden, daher ist es notwendig, in GBM-Code zu graben, um zu sehen, wie genau diese Verbesserung berechnet wird.
mpiktas
@Antoine Wirklich spannende Frage! Wurde eine endgültige Antwort gefunden?
Soren Havelund Welling
1
Nein, leider. Einige Hinweise geben die obigen Links (in den Kommentaren), dieser Thread und dieser andere Thread . Das macht mich total verrückt. Eines Tages sollte jemand eine E-Mail an Dr. Friedman / Hastie schreiben ... Vielen Dank für Ihre Aufmerksamkeit.
Antoine

Antworten:

2

Nur teilweise beantworten (und Ihrer Frage eine neue Frage hinzufügen).

Die gbm-Implementierung in R http://www.rdocumentation.org/packages/gbm/functions/gbm verfügt über zwei Parameter zum Anpassen von Out-of-Bagness.

a) train.fractiondefiniert einen Teil der Daten, die zum Trainieren aller Bäume verwendet werden, und 1- train.fractionsind somit echte OOB-Daten (Out-of-Bag).

b) bag.fractiondefiniert den Anteil der Trainingsdaten, die bei der Erstellung des nächsten Baums im Boost verwendet werden sollen. Daher kann es einige Daten geben, die niemals für die Erstellung eines Baums verwendet werden, und sie können wirklich als OOB-Daten verwendet werden (dies ist jedoch unwahrscheinlich, siehe die folgende Frage).

Was mich zu der Frage bringt. Ihre Analyse von 37% der Daten als OOB gilt nur für EINEN Baum. Aber die Wahrscheinlichkeit, dass es Daten gibt, die in keinem Baum verwendet werden, ist viel kleiner - (es muss für alle Bäume im OOB sein - ich verstehe, dass jeder Baum seinen eigenen Bootstrap macht). In RandomForests sollte es daher sehr unwahrscheinlich sein, dass ein OOB den Wald testet. Und doch spricht die randomForest-Implementierung in R (basierend auf Breimans Originalcode) viel über OOB (zum Beispiel die Ergebnisdaten und siehe http://www.rdocumentation.org/packages/randomForest/functions/randomForest ). n t r e e0.37ntreesntreeerr.rateconfusion

Ich weiß nicht, wie ich das beantworten soll (und ich danke Ihnen (+1), dass Sie die Frage gestellt und mir klar gemacht haben, dass ich diesen Aspekt von randomForests nicht verstehe). Die mögliche Lösung ist, dass es nur einen Bootstrap gibt - und alle Bäume daraus aufgebaut sind -, aber soweit ich weiß, ist dies nicht der Fall.

Jacques Wainer
quelle
Für RF / Bagging gibt es kein Problem: In jedem Schritt des Ensemble-Erstellungsprozesses kann jede Beobachtung im Originaldatensatz allen Bäumen zugeführt werden, die an Boostrap-Proben ohne diese Beobachtung trainiert wurden. Ungefähr ein Drittel (~ 37%) der Gesamtzahl der Bäume erfüllt diese Bedingung. Indem diese Bäume abstimmen gelassen werden und die beliebteste Klasse gewählt wird, kann eine Vorhersage für die Beobachtung erhalten werden. Die Häufigkeit, mit der sich die Vorhersage von der über alle Klassen gemittelten tatsächlichen Bezeichnung der Beobachtung unterscheidet, ergibt die Schätzung des Out-of-Bag-Fehlers
Antoine,
1
Es scheint auch, dass das, was die Fähigkeit zur OOB-Fehlerschätzung in Boosting ergibt, nicht von dem train.fractionParameter stammt (der nur ein Merkmal der gbm-Funktion ist, aber im ursprünglichen Algorithmus nicht vorhanden ist), sondern tatsächlich von der Tatsache, dass nur eine Teilstichprobe der Daten werden verwendet, um jeden Baum in der Sequenz zu trainieren, wobei Beobachtungen weggelassen werden (die zum Testen verwendet werden können). Was auf meine ursprüngliche Frage zurückgeht. Wie können diese Beobachtungen zum Testen verwendet werden, da sie wahrscheinlich von vielen vorhergehenden Bäumen in der Sequenz oft gesehen wurden?
Antoine
Ich habe vergessen zu erwähnen, dass jeder Baum in RF tatsächlich aus einem eigenen, einzigartigen Bootstrap-Beispiel der Originaldaten erstellt wurde
Antoine,
@ user2835597 danke für deine erklärungen zu RF. Ein OOB-Fehler eines RF wertet also wirklich nur 1/3 der Bäume im Wald aus (das erscheint mir nicht sehr nützlich). Jeden Tag etwas lernen.
Jacques Wainer
Auf jeden Fall scheint der Parameter train.fraction die Antwort auf Ihre Frage zu sein. Die sklearn-Implementierung hat auch einen ähnlichen Parameter, das Teilbeispiel
Jacques Wainer,
-2

Ich glaube, dass sie bei jedem Schritt eine Schätzung aus der Tasche machen. Da die Ergebnisse aller Schritte (mit Koeffizienten) addiert werden, können OOB-Fehler auch mit denselben Koeffizienten addiert werden.

user2225548
quelle