Méthode de notation OOB RandomForestClassifier

16

L'implémentation de forêt aléatoire dans scikit-learn utilise-t-elle la précision moyenne comme méthode de notation pour estimer l'erreur de généralisation avec des échantillons hors sac? Ceci n'est pas mentionné dans la documentation, mais la méthode score () rapporte la précision moyenne.

J'ai un ensemble de données très déséquilibré et j'utilise l'AUC de ROC comme métrique de notation dans la recherche dans la grille. Existe-t-il un moyen de dire au classificateur d'utiliser également la même méthode de notation sur les échantillons OOB?

darXider
la source
Le paramètre oob_score de la classe RandomForestClassifier ne fait pas ce que vous voulez?
Pierre
AFAIK, oob_scorerapportez l'exactitude. Je dois cependant regarder à nouveau le code source.
darXider
Quel paramètre estimez-vous avec votre recherche dans la grille?
JahKnows
^ Désolé, mais je ne m'en souviens vraiment pas maintenant! J'ai posé cette question il y a 1,5 an.
darXider

Réponses:

14

En général, les performances des classificateurs sont comparées en utilisant la précision, c'est une mesure du nombre d'instances correctement classées divisé par le nombre total d'instances. Cependant, à partir des données d'entraînement, nous pouvons obtenir une meilleure approximation de l'erreur attendue de notre classificateur lorsque nous utilisons des techniques d'apprentissage d'ensemble ou d'ensachage.

Erreur hors du sac

xi

Pour implémenter oob dans sklearn, vous devez le spécifier lors de la création de votre objet Forêts aléatoires en tant que

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

Ensuite, nous pouvons former le modèle

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

Résultat: 0,979921928817

Comme prévu, la précision du modèle lors de l'évaluation de l'ensemble d'apprentissage est très élevée. Cependant, cela n'a aucun sens car vous pouvez très bien sur-adapter vos données et donc votre modèle est un déchet. Cependant, nous pouvons utiliser le score hors sac comme

print(forest.oob_score_)

0,86453272101

Il s'agit de la précision lors de l'évaluation de nos instances dans l'ensemble de formation en utilisant uniquement les arbres pour lesquels elles ont été omises. Calculons maintenant le score sur l'ensemble de test comme

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

Résultat: 0,86517733935

On voit que la précision mesurée par oob est très similaire à celle obtenue avec l'ensemble de test. Il en résulte donc à travers la théorie que la précision de l'oob est une meilleure métrique pour évaluer les performances de votre modèle plutôt que juste le score. Ceci est une conséquence des modèles d'ensachage et ne peut pas être fait avec d'autres types de classificateurs.

Calcul de l'oob en utilisant différentes métriques

Oui, vous pouvez le faire! Cependant, cela dépend de la structure exacte de votre code. Je ne sais pas comment vous pouvez inclure l'oob et l'AUC tous ensemble avec la cross_val_scorefonction. Cependant, si vous effectuez manuellement les plis de validation croisée, vous pouvez effectuer les opérations suivantes, l'algorithme des forêts aléatoires dans sklearn vous fournit la fonction de décision de l'oob comme

print(forest.oob_decision_function_)

La classe peut ensuite être obtenue en utilisant

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

Ensuite, nous pouvons calculer l'AUC en utilisant ce qui suit

metrics.roc_auc_score(y_train, pred_train)

0,86217157846471204

JahKnows
la source
4
Merci! Je sais comment fonctionne le processus OOB dans des forêts aléatoires. Je demandais spécifiquement si RandomForestClassifierpeut retourner un score OOB qui n'est PAS exact, et la deuxième partie de votre réponse fournit une très bonne indication sur la façon d'aborder ce problème. Cependant, je dois souligner qu'il ne faut pas utiliser les étiquettes de classe pour calculer l'ASC de la courbe ROC; les probabilités de classe doivent plutôt être utilisées directement. Donc, la bonne définition serait pred_train = forest.oob_decision_function_[:, 1].
darXider
@darXider N'est-ce pas louche, car forest.oob_decision_function_.shape [0] == X_train.shape [0], alors que je m'attendrais à ce qu'il soit == nombre d'échantillons OOB, qui devrait être inférieur au nombre d'échantillons dans X_train? De plus, personnellement, j'étais intéressé par le calcul de la perte de journal, pour ceux qui veulent le faire aussi, je pense que pred_train devrait être = forest.oob_decision_function_ à la place.
Sander Vanden Hautte