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 gini
comme 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).
scikit
l »oob_score
est une partition, qui est une mesure d' un accord. Je n'ai cependant pas pu le trouver documenté.Réponses:
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: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 exemplemax_features=0.33
(comme Rmtry
) et relancez. Dites-nous les nouveaux scores."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?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?
la source
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 .
la source
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.
la source
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?)
la source