Comment faire pour calculer la précision, le rappel, la précision et la f1-score pour la multiclass cas avec scikit learn?
Je travaille dans un sentiment analyse du problème les données ressemble à ceci:
label instances
5 1190
4 838
3 239
1 204
2 127
Donc, mes données est déséquilibré depuis 1190 instances
sont étiquetés avec 5
. Pour la classification Im en utilisant scikit de SVC. Le problème est que je ne sais pas comment équilibrer mes données dans le droit chemin afin de calculer avec précision la précision, le rappel, la précision et la f1-score pour le cas multiclasse. J'ai donc essayé l'une des approches suivantes:
Première:
wclf = SVC(kernel='linear', C= 1, class_weight={1: 10})
wclf.fit(X, y)
weighted_prediction = wclf.predict(X_test)
print 'Accuracy:', accuracy_score(y_test, weighted_prediction)
print 'F1 score:', f1_score(y_test, weighted_prediction,average='weighted')
print 'Recall:', recall_score(y_test, weighted_prediction,
average='weighted')
print 'Precision:', precision_score(y_test, weighted_prediction,
average='weighted')
print '\n clasification report:\n', classification_report(y_test, weighted_prediction)
print '\n confussion matrix:\n',confusion_matrix(y_test, weighted_prediction)
Deuxième:
auto_wclf = SVC(kernel='linear', C= 1, class_weight='auto')
auto_wclf.fit(X, y)
auto_weighted_prediction = auto_wclf.predict(X_test)
print 'Accuracy:', accuracy_score(y_test, auto_weighted_prediction)
print 'F1 score:', f1_score(y_test, auto_weighted_prediction,
average='weighted')
print 'Recall:', recall_score(y_test, auto_weighted_prediction,
average='weighted')
print 'Precision:', precision_score(y_test, auto_weighted_prediction,
average='weighted')
print '\n clasification report:\n', classification_report(y_test,auto_weighted_prediction)
print '\n confussion matrix:\n',confusion_matrix(y_test, auto_weighted_prediction)
Troisième:
clf = SVC(kernel='linear', C= 1)
clf.fit(X, y)
prediction = clf.predict(X_test)
from sklearn.metrics import precision_score, \
recall_score, confusion_matrix, classification_report, \
accuracy_score, f1_score
print 'Accuracy:', accuracy_score(y_test, prediction)
print 'F1 score:', f1_score(y_test, prediction)
print 'Recall:', recall_score(y_test, prediction)
print 'Precision:', precision_score(y_test, prediction)
print '\n clasification report:\n', classification_report(y_test,prediction)
print '\n confussion matrix:\n',confusion_matrix(y_test, prediction)
F1 score:/usr/local/lib/python2.7/site-packages/sklearn/metrics/classification.py:676: DeprecationWarning: The default `weighted` averaging is deprecated, and from version 0.18, use of precision, recall or F-score with multiclass or multilabel data or pos_label=None will result in an exception. Please set an explicit value for `average`, one of (None, 'micro', 'macro', 'weighted', 'samples'). In cross validation use, for instance, scoring="f1_weighted" instead of scoring="f1".
sample_weight=sample_weight)
/usr/local/lib/python2.7/site-packages/sklearn/metrics/classification.py:1172: DeprecationWarning: The default `weighted` averaging is deprecated, and from version 0.18, use of precision, recall or F-score with multiclass or multilabel data or pos_label=None will result in an exception. Please set an explicit value for `average`, one of (None, 'micro', 'macro', 'weighted', 'samples'). In cross validation use, for instance, scoring="f1_weighted" instead of scoring="f1".
sample_weight=sample_weight)
/usr/local/lib/python2.7/site-packages/sklearn/metrics/classification.py:1082: DeprecationWarning: The default `weighted` averaging is deprecated, and from version 0.18, use of precision, recall or F-score with multiclass or multilabel data or pos_label=None will result in an exception. Please set an explicit value for `average`, one of (None, 'micro', 'macro', 'weighted', 'samples'). In cross validation use, for instance, scoring="f1_weighted" instead of scoring="f1".
sample_weight=sample_weight)
0.930416613529
Cependant, Im obtenir des avertissements comme ceci:
/usr/local/lib/python2.7/site-packages/sklearn/metrics/classification.py:1172:
DeprecationWarning: The default `weighted` averaging is deprecated,
and from version 0.18, use of precision, recall or F-score with
multiclass or multilabel data or pos_label=None will result in an
exception. Please set an explicit value for `average`, one of (None,
'micro', 'macro', 'weighted', 'samples'). In cross validation use, for
instance, scoring="f1_weighted" instead of scoring="f1"
Comment puis-je traiter correctement avec mon asymétrique de données afin de calculer dans le droit chemin classificateur de statistiques?
- Alors pourquoi ne pas ajouter
average
paramètre dans le troisième cas? - Je ne sais pas. Je viens de vérifier la documentation mais je n'ai pas understando comment utiliser correctement les paramètres pour les données déséquilibrées. Pourriez-vous donner quelques plus large explication et un exemple?. Merci!
Vous devez vous connecter pour publier un commentaire.
Je pense qu'il y a beaucoup de confusion au sujet de laquelle les poids sont utilisés pour quoi. Je ne suis pas sûr de savoir précisément ce qui vous dérange si je vais couvrir différents sujets, de garder avec moi ;).
Classe de poids
Le poids de la
class_weight
paramètre sont utilisés pour former le classificateur.Ils ne sont pas utilisés dans le calcul de l'une des statistiques que vous utilisez: avec classe différente, les poids, les nombres seront différents, simplement parce que le classificateur est différent.
Essentiellement dans chaque scikit-learn classificateur, la classe de poids sont utilisés pour raconter votre modèle de façon importante d'une classe. Cela signifie que lors de la formation, le classificateur va faire plus d'efforts pour classer correctement les classes avec des poids élevés.
Comment ils font qui est spécifiques à l'algorithme. Si vous voulez des détails sur la façon dont il fonctionne pour le SVC et le doc n'a pas de sens pour vous, n'hésitez pas à le mentionner.
Les mesures
Une fois que vous avez un classificateur, vous voulez savoir comment il fonctionne.
Ici, vous pouvez utiliser les paramètres que vous avez mentionné:
accuracy
,recall_score
,f1_score
...Habituellement, lorsque la distribution est asymétrique, la précision est considéré comme un mauvais choix, car il donne des scores élevés aux modèles qui vient de prédire les plus fréquentes de la classe.
Je ne vais pas détailler toutes ces mesures, mais note que, à l'exception de
accuracy
, ils sont naturellement appliqué au niveau de la classe: comme vous pouvez le voir dans cetteprint
d'un classement en rapport ils sont définis pour chaque classe. Ils s'appuient sur des concepts tels quetrue positives
oufalse negative
qui nécessitent la définition de la classe est le positif un.L'avertissement
Vous obtenez cet avertissement parce que vous êtes à l'aide de la f1-score, de rappel et de précision sans définir de la façon dont ils devraient être calculées!
La question pourrait être posée autrement: à partir de la classification ci-dessus rapport, comment pensez-vous de la sortie un nombre global pour la f1-score?
Vous pouvez:
avg /total
résultat ci-dessus. Il est aussi appelé macro calcul de la moyenne.'weighted'
dans scikit-learn peser la f1 score par le soutien de la classe: plus d'éléments d'une classe a, la plus importante de la f1-score pour cette classe dans le calcul.Ce sont 3 des options de scikit-learn, l'avertissement est là pour vous dire choisir un. Donc, vous devez spécifier un
average
argument pour le score de la méthode.Celui que vous choisissez est à la façon dont vous voulez mesurer la performance du classificateur: par exemple, la macro-moyenne ne prend pas de classe déséquilibre en compte et la f1-score de classe 1 sera tout aussi important que la f1-score de la classe 5. Si vous utilisez de la pondérée en moyenne cependant, vous obtiendrez plus d'importance pour la classe 5.
L'ensemble de l'argument de la spécification de ces mesures n'est pas super clair dans scikit-learn droit maintenant, ça va mieux dans la version 0.18 selon les docs. Ils sont la suppression de certains non-évident comportement standard et ils sont des avertissements afin que les développeurs avis.
Le calcul des scores
Dernière chose que je veux mentionner (n'hésitez pas à passer si vous êtes au courant), c'est que les scores ne sont significatives que si elles sont calculées sur les données que le classificateur n'a jamais vu.
Cela est extrêmement important que tout score que vous obtenez sur les données qui ont été utilisées dans le montage du classificateur est complètement hors de propos.
Voici un moyen de le faire à l'aide de
StratifiedShuffleSplit
, qui vous donne un hasard divise de vos données (après le brassage) qui permettent de préserver l'étiquette de distribution.Espère que cette aide.
class_weight={1:10}
moyenne pour les données qui dispose de 3 classes?ValueError: The least populated class in y has only 1 member, which is too few. The minimum number of labels for any class cannot be less than 2.
. Il fonctionne très bien avec le train-test de split, mais quelqu'un peut m'aider pourquoi je reçois cette erreur avec SSS? Merci.Beaucoup de réponses détaillées ici, mais je ne pense pas que vous répondez à poser les bonnes questions. Comme je comprends la question, il y a deux préoccupations:
1.
Vous pouvez utiliser la plupart des fonctions de scoring dans scikit-learn avec les deux multiclass problème qu'avec une seule classe de problèmes. Ex.:
De cette façon, vous vous retrouvez avec tangibles et interprétables chiffres pour chacune des classes.
Alors...
2.
... vous permet d'indiquer si les données déséquilibrées, c'est même un problème. Si le score pour les moins représentées classes (classe 1 et 2) sont plus faibles que pour les classes avec les plus de la formation des échantillons (classes 4 et 5), alors vous savez que le déséquilibre des données est en fait un problème, et vous pouvez agir en conséquence, comme décrit dans les autres réponses dans ce thread.
Toutefois, si la même classe de distribution est présent dans les données que vous voulez prévoir sur votre déséquilibré les données d'entraînement est un bon représentant de données, et par conséquent, le déséquilibre est une bonne chose.
precision_recall_fscore_support
? Sont les étiquettes imprimées par l'ordre?average=None
et de définir les étiquettes, puis vous obtenez la métrique que vous cherchez, pour chacun de vos étiquettes.Poser la question
De répondre à la question "quelle métrique doit être utilisé pour le multi-classe de la classification avec déséquilibre de données': Macro-F1-mesure.
Macro de la Précision et de la Macro Rappel peuvent être aussi utilisés, mais ils ne sont pas facilement interprétables comme pour les binaires classificaion, ils sont déjà intégrés dans la F-mesure, et l'excès de métriques de compliquer les méthodes de comparaison, les paramètres de réglage, et ainsi de suite.
Micro calcul de la moyenne sont sensibles à la classe de déséquilibre: si votre méthode, par exemple, fonctionne bien pour la plupart des étiquettes et totalement mess autres, de micro-moyenne statistiques montrent de bons résultats.
Pondération de la moyenne n'est pas bien adapté pour les déséquilibrés de données, car il pèse en compte des étiquettes. De plus, il est trop difficilement interprétables et impopulaires: par exemple, il n'y a aucune mention d'une telle moyenne dans la suite de très détaillées enquête je recommande fortement de regarder à travers:
Application spécifique à la question
Cependant, le retour à votre tâche, j'avais de la recherche 2 sujets:
comparez votre méthode avec les autres et de comprendre si vous faites quelque chose
mal, et (b) à ne pas explorer par vous-même et la réutilisation de quelqu'un
d'autre résultats;
exemple de cas d'utilisation de votre application peut s'appuyer sur de 4 et 5 étoiles
reviewes seulement - dans ce cas, la bonne métrique doit compter uniquement ces 2
les étiquettes.
Couramment utilisés métriques.
Comme je peux en déduire, après en regardant à travers la littérature, il existe 2 principaux d'évaluation indicateurs:
(lien) - à noter que les auteurs travaillent avec presque la même distribution des cotes, voir la Figure 5.
(lien)
(lien) - ils explorent à la fois la précision et le MSE, considérant que celle-ci soit mieux
(lien) - ils utiliser scikit-learn à des fins d'évaluation et de référence des approches et de l'état que leur code est disponible; cependant, je ne le trouve pas, donc si vous en avez besoin, d'écrire une lettre aux auteurs, le travail est assez nouveau et semble être écrit en Python.
Coût des différentes erreurs.
Si vous vous souciez plus d'éviter les grosses fautes, par exemple assinging 1 étoile à 5 étoiles d'examen ou quelque chose comme ça, regardez MSE;
si la différence de questions, mais pas tellement, essayez de MAE, puisqu'il n'a pas d'équerre diff;
sinon rester avec Précision.
Sur les approches, non métriques
Essayer la régression des approches, par exemple SVR, car ils sont généralement surpasse Multiclass classificateurs comme SVC ou d'OVULES SVM.
Tout d'abord, il est un peu plus difficile en utilisant un simple comptage des analyses pour savoir si vos données est déséquilibrée ou pas. Par exemple: 1 à 1000 observation positive est juste un bruit, d'erreur ou d'une percée dans la science? Vous ne savez jamais.
Il est donc toujours préférable d'utiliser toutes vos connaissances disponibles et le choix de son statut avec tous les sages.
D'accord, que si c'est vraiment déséquilibré?
Une fois de plus — regardez à vos données. Parfois, vous pouvez trouver un ou deux d'observation multiplié par des centaines de fois. Il est parfois utile de créer ce faux-classe d'observations.
Si toutes les données sont propres étape suivante consiste à utiliser la classe de poids dans le modèle de prédiction.
Alors que sur le multiclasse métriques?
Dans mon expérience, aucun de vos mesures est généralement utilisé. Il ya deux raisons principales.
D'abord: il est toujours préférable de travailler avec des probabilités de solides prédiction (parce que sinon, comment pourriez-vous des modèles distincts avec 0,9 et 0,6 prédiction si les deux de vous donner la même classe?)
Et deuxièmement: il est beaucoup plus facile de comparer vos modèles de prévision et d'en construire de nouveaux, selon une seule bonne mesure.
De mon expérience, je pourrais recommander logloss ou MSE (ou simplement de l'erreur quadratique moyenne).
Comment réparer sklearn mises en garde?
Tout simplement (comme yangjie remarqué) remplacer
average
paramètre avec l'un de cesvaleurs:
'micro'
(calculer des métriques dans le monde),'macro'
(calculer des métriques pour chaque étiquette) ou'weighted'
(même en macro mais avec des auto de poids).Toutes vos mises en garde est venu après l'appel de métriques fonctions par défaut
average
valeur'binary'
qui est inapproprié pour multiclass prédiction.Bonne chance et amusez-vous avec l'apprentissage de la machine!
Edit:
J'ai trouvé un autre répondeur recommandation pour passer à la régression des approches (par exemple, SVR) avec qui je ne partage pas. Aussi loin que je me souvienne il n'y a même pas une telle chose comme multiclass de régression. Oui, il est multilabel de régression qui est bien différent et oui c'est possible, dans certains cas, basculer entre régression et de classification (si les classes en quelque sorte triés) mais c'est assez rare.
Ce que je recommande (dans le champ d'application de scikit-learn), est d'essayer un autre très puissants outils de classification: gradient de stimuler, la forêt au hasard (mon préféré), KNeighbors et beaucoup plus.
Après cela, vous pouvez calculer l'arithmétique ou la moyenne géométrique entre les prévisions et la plupart du temps, vous aurez à obtenir encore de meilleurs résultats.