Qu'est-ce qu'un bon score OOB pour les forêts aléatoires avec Sklearn, classification à trois classes? [dupliquer]

8

J'ai des données d'apprentissage composées de ~ 45k échantillons, chacun a 21 fonctionnalités. J'essaie de former un classificateur de forêt aléatoire sur ces données, qui sont étiquetées en 3 classes (-1, 0 et 1). Les classes sont plus ou moins égales dans leurs tailles.

Mon modèle de classificateur de forêt aléatoire utilise ginicomme critère de qualité divisé, le nombre d'arbres est de 10 et je n'ai pas limité la profondeur d'un arbre.

La plupart des caractéristiques ont montré une importance négligeable - la moyenne est d'environ 5%, un tiers d'entre elles est d'importance 0, un tiers d'entre elles a une importance supérieure à la moyenne.

Cependant, le fait le plus frappant est peut-être le score d'oob (out-of-bag): un peu moins de 1%. Cela m'a fait penser que le modèle échoue, et en effet, en testant le modèle sur un nouvel ensemble indépendant de taille ~ 40k, j'ai obtenu un score de 63% (ça sonne bien jusqu'à présent), mais une inspection plus approfondie de la matrice de confusion m'a montré que le le modèle ne réussit que pour la classe 0 et échoue dans environ 50% des cas lorsqu'il s'agit de décider entre 1 et -1.

La sortie de Python jointe:

array([[ 7732,   185,  6259],
       [  390, 11506,   256],
       [ 7442,   161,  6378]])

C'est naturellement parce que la classe 0 a des propriétés spéciales qui la rendent beaucoup plus facile à prévoir. Cependant, est-il vrai que le score OOB que j'ai trouvé est déjà un signe que le modèle n'est pas bon? Qu'est-ce qu'un bon score OOB pour les forêts aléatoires ? Existe-t-il une loi empirique qui aide à déterminer si un modèle est «bon», en utilisant le score oob seul ou en combinaison avec d'autres résultats du modèle?


Modifier: après avoir supprimé les mauvaises données (environ le tiers des données), les étiquettes étaient plus ou moins 2% pour 0 et 49% pour chacun de -1 / + 1. Le score OOB était de 0,011 et le score sur les données de test était de 0,49, avec une matrice de confusion à peine biaisée vers la classe 1 (environ 3/4 des prédictions).

Bach
la source
2
Clarifier. Vous utilisez scikit learn ? Et il signale un score OOB <.001? Ensuite, en utilisant la fonction .score sur les nouvelles données que vous obtenez .63? En général, j'ai trouvé des scores OOB pour refléter ou légèrement sous-estimer les scores de validation croisée. Je pense que les scores dans la classification Scikit Learn sont la précision moyenne dans toutes les classes (si je lis les documents, n'est-ce pas?), Ils ne devraient donc pas être directement comparés à la précision globale / non moyenne, mais cela dépend de la mise en œuvre et ne devrait pas provoquer cela grand écart.
Ryan Bressler
Oui, j'utilise scikit learn, le score oob était un peu inférieur à 0,01 et le score sur les données de test était d'environ 0,63.
Bach
Vos lignes sont-elles indépendantes ou avez-vous des mesures répétées du même cas (ou autrement des données hiérarchiques / groupées)? Aussi: veuillez clarifier: votre "score" est-il une mesure d'erreur ou une mesure d'accord?
cbeleites mécontents de SX
Mes lignes ne se répètent pas mais elles peuvent être dépendantes. Je crois que scikitl » oob_scoreest une partition, qui est une mesure d' un accord. Je n'ai cependant pas pu le trouver documenté.
Bach
Une recherche rapide m'a amené à la page de manuel de la forêt aléatoire, où il est dit "oob_score: bool s'il faut utiliser des échantillons hors du sac pour estimer l'erreur de généralisation", donc cela ressemble à une mesure d'erreur pour moi. Si cela est vrai, votre estimation de la valeur hors bilan est largement trop optimiste - ce qui serait un "symptôme" attendu des lignes dépendantes.
cbeleites mécontents de SX

Réponses:

4

Le RF de sklearn oob_score_(notez le trait de soulignement de fin) n'est pas vraiment très intelligible par rapport aux R, après avoir lu la doc et le code source de sklearn. Mon conseil pour améliorer votre modèle est le suivant:

  1. Le RF de sklearn utilisait la terrible valeur par défaut de max_features=1(comme dans "essayer toutes les fonctionnalités sur tous les nœuds"). Ensuite, il ne fait plus de sélection aléatoire de colonne (/ fonctionnalité) comme une forêt aléatoire. Changez ceci par exemple max_features=0.33(comme R mtry) et relancez. Dites-nous les nouveaux scores.

  2. "La plupart des fonctionnalités ont montré une importance négligeable" . Ensuite, vous devez faire la sélection des fonctionnalités, conformément au document - pour la classification. Voir le doc et d'autres articles ici sur CrossValidated.SE. Faites le FS sur un ensemble d'exclusion (disons 20-30%) différent du reste de la formation, en utilisant par exemple sklearn.cross_validation.train_test_split()(oui, le nom est un peu trompeur). Maintenant, dites-nous les scores que vous obtenez après FS?

  3. Vous avez dit "après avoir supprimé les mauvaises données (environ le tiers des données), les étiquettes étaient plus ou moins 2% pour 0 et 49% pour chacun de -1 / + 1" ; alors vous avez un grave déséquilibre de classe . Aussi: "la matrice de confusion montre que le modèle ne réussit que pour la classe 0, et échoue dans environ 50% des cas entre +1 et -1" . C'est un symptôme du déséquilibre de classe. Soit vous utilisez l'échantillonnage stratifié, soit vous formez un classificateur avec des exemples pour les classes +1 et -1. Vous pouvez soit faire un classificateur OAA (One-Against-All) ou OAO (One-Against-One). Essayez trois classificateurs OAA, un pour chaque classe. Enfin, dites-nous ces scores?

smci
la source
6
Juste pour info , dans scikit 0.16.1, la valeur par défaut pour max_features est "auto" et non 1 où "auto" se traduit par sqrt (number_features).
firefly2442
1

Le bon oob_score n'existe pas, c'est la différence entre valid_score et oob_score qui compte.

Considérez oob_score comme un score pour un sous-ensemble (disons, oob_set) d'ensemble d'entraînement. Pour savoir comment sa création se réfère à cela .

oob_set est extrait de votre ensemble d'entraînement. Et vous avez déjà votre ensemble de validation (par exemple, valid_set).

Supposons un scénario où votre validation_score est 0,7365 et oob_score est 0,8329

Dans ce scénario, votre modèle fonctionne mieux sur oob_set, qui provient directement de votre jeu de données de formation. Indiquant, validation_set est pour une période de temps différente. (par exemple, training_set a des enregistrements pour le mois de "janvier" et validation_set a des enregistrements pour le mois de "juillet"). Ainsi, plus qu'un test pour les performances du modèle, oob_score est un test pour "la représentativité de votre Validation_set".

Vous devez toujours vous assurer que vous disposez d'un bon ensemble validation_set représentatif, car son score est utilisé comme indicateur des performances de notre modèle. Votre objectif devrait donc être de faire le moins de différence possible entre oob_score et valid_score.

J'utilise généralement oob_score avec validation_score pour voir à quel point mon validation_set est bon. J'ai appris cette technique de Jeremy Howard .

Ankur Singh
la source
0

Q: Qu'est-ce qu'un bon score OOB pour les forêts aléatoires avec Sklearn, classification à trois classes?

R: Ça dépend. À mon avis, si les échantillons d'apprentissage et de test sont tirés de la même distribution, alors - à mon avis - OOB est égal à environ 3 fois la validation croisée. Donc, si nous répétons la même question mais avec une "validation croisée 3 fois", la réponse serait la même, qui est "généralement, la plus élevée est la précision le plus joyeux, à moins que vous ne craigniez d'ajuster votre ensemble d'apprentissage parce que quelqu'un vous a dit que les vrais échantillons de test sont d'une distribution différente ".

Pouvez-vous me donner votre jeu de données? Je peux m'amuser un peu et vous dire ce que j'arrive à en faire gratuitement.

Homme des cavernes
la source
0

une approche différente de la question: pour commencer, vous devez associer une perte à chaque mauvaise classification que vous faites. Ce prix / perte / pénalité pour mauvaise classification serait (probablement) différent pour les faux positifs (FP) et les faux négatifs (FN). Certaines classifications, par exemple la détection du cancer, préfèrent avoir plus de PF que de FN. Certains autres, comme le filtre anti-spam, préfèrent autoriser certains spams (FN) plutôt que bloquer les e-mails (FP) de votre ami. En s'appuyant sur cette logique, vous pouvez utiliser le score F1 ou la précision, selon ce qui convient à votre objectif. . D'un autre côté, quelqu'un d'autre pourrait être mécontent même avec 0,9 (filtrage à 90% des spams). Quel serait alors un bon score?)

Anurag Priyadarshi
la source