RandomForestClassifier OOB-Bewertungsmethode

14

Wird die zufällige Gesamtstrukturimplementierung in scikit-learn unter Verwendung der mittleren Genauigkeit als Bewertungsmethode zum Schätzen des Generalisierungsfehlers mit Out-of-Bag-Stichproben verwendet? Dies wird in der Dokumentation nicht erwähnt, aber die score () -Methode gibt die mittlere Genauigkeit an.

Ich habe einen stark unausgeglichenen Datensatz und verwende AUC of ROC als Scoring-Metrik für die Rastersuche. Gibt es eine Möglichkeit, den Klassifizierer anzuweisen, dieselbe Bewertungsmethode auch für die OOB-Beispiele zu verwenden?

darXider
quelle
Der Parameter oob_score der RandomForestClassifier- Klasse macht nicht das, was Sie wollen?
Pierre
AFAIK, oob_scoremelden Sie die Genauigkeit. Ich muss mir den Quellcode noch einmal ansehen.
DarXider
Welchen Parameter schätzen Sie mit Ihrer Rastersuche ein?
JahKnows
^ Sorry, aber ich erinnere mich jetzt wirklich nicht! Ich habe diese Frage vor 1,5 Jahren gestellt.
darXider

Antworten:

14

Im Allgemeinen wird die Leistung von Klassifizierern anhand der Genauigkeit verglichen. Dies ist ein Maß für die Anzahl der korrekt klassifizierten Instanzen geteilt durch die Gesamtanzahl der Instanzen. Aus den Trainingsdaten können wir jedoch eine bessere Annäherung des erwarteten Fehlers von unserem Klassifikator erhalten, wenn wir Ensemble-Lern- oder Bagging-Techniken verwenden.

Out-of-Bag-Fehler

xich

Um oob in sklearn zu implementieren, müssen Sie es beim Erstellen Ihres Random Forests-Objekts als angeben

from sklearn.ensemble import RandomForestClassifier 
forest = RandomForestClassifier(n_estimators = 100, oob_score = True)

Dann können wir das Modell trainieren

forest.fit(X_train, y_train)
print('Score: ', forest.score(X_train, y_train))

Ergebnis: 0.979921928817

Wie erwartet ist die Genauigkeit des Modells bei der Bewertung des Trainingssatzes sehr hoch. Dies ist jedoch bedeutungslos, da Sie Ihre Daten sehr gut überarbeiten können und Ihr Modell somit Müll ist. Wir können jedoch die Out-of-Bag-Bewertung als verwenden

print(forest.oob_score_)

0,86453272101

Dies ist die Genauigkeit bei der Bewertung unserer Instanzen im Trainingssatz, wobei nur die Bäume verwendet werden, für die sie ausgelassen wurden. Berechnen wir nun die Punktzahl auf dem Testset als

print('Score: ', forest.score(X_test, y_test))

Ergebnis: 0.86517733935

Wir sehen, dass die von oob gemessene Genauigkeit der mit dem Testgerät erhaltenen sehr ähnlich ist. Aus dieser Theorie folgt, dass die OOB-Genauigkeit eine bessere Metrik ist, um die Leistung Ihres Modells zu bewerten, als nur die Punktzahl. Dies ist eine Konsequenz von Absackmodellen und kann nicht mit anderen Arten von Klassifikatoren durchgeführt werden.

Berechnung des OOB mit verschiedenen Metriken

Ja, das kannst du! Es kommt jedoch darauf an, wie genau Ihr Code aufgebaut ist. Ich bin nicht sicher, wie Sie die OOB und AUC alle zusammen mit der cross_val_scoreFunktion einschließen können. Wenn Sie die Kreuzvalidierung jedoch manuell durchführen, können Sie Folgendes tun: Der Algorithmus für zufällige Gesamtstrukturen in sklearn stellt Ihnen die Entscheidungsfunktion des OOB as zur Verfügung

print(forest.oob_decision_function_)

Die Klasse kann dann mit erhalten werden

from sklearn import metrics
pred_train = np.argmax(forest.oob_decision_function_,axis=1)

Dann können wir die AUC wie folgt berechnen

metrics.roc_auc_score(y_train, pred_train)

0.86217157846471204

JahKnows
quelle
3
Vielen Dank! Mir ist bekannt, wie der OOB-Prozess in zufälligen Gesamtstrukturen funktioniert. Ich habe speziell gefragt, ob RandomForestClassifierein OOB-Score zurückgegeben werden kann, der NICHT genau ist , und der zweite Teil Ihrer Antwort enthält einen sehr guten Hinweis, wie Sie dieses Problem angehen können. Ich muss jedoch betonen, dass man die Klassenbeschriftungen nicht verwenden sollte, um die AUC der ROC-Kurve zu berechnen. Vielmehr sollten die Klassenwahrscheinlichkeiten direkt verwendet werden. Die richtige Definition wäre also pred_train = forest.oob_decision_function_[:, 1].
DarXider
@darXider Ist dies nicht zwielichtig, da forest.oob_decision_function_.shape [0] == X_train.shape [0] ist, während ich davon ausgehen würde, dass die Anzahl der OOB-Samples geringer ist als die Anzahl der Samples in X_train? Außerdem war ich persönlich daran interessiert, den log-Verlust zu berechnen. Für andere, die dies ebenfalls tun möchten, sollte pred_train stattdessen = forest.oob_decision_function_ lauten.
Sander Vanden Hautte