Calculer sklearn.roc_auc_score pour le multi-classe
Je voudrais calculer l'ASC, de la précision, de l'exactitude de mon classificateur.
Je suis en train de faire l'apprentissage supervisé:
Voici mon code de travail.
Ce code fonctionne très bien pour les binaires de la classe, mais pas pour le multi de classe.
Veuillez supposons que vous disposez d'un dataframe binaire classes:
sample_features_dataframe = self._get_sample_features_dataframe()
labeled_sample_features_dataframe = retrieve_labeled_sample_dataframe(sample_features_dataframe)
labeled_sample_features_dataframe, binary_class_series, multi_class_series = self._prepare_dataframe_for_learning(labeled_sample_features_dataframe)
k = 10
k_folds = StratifiedKFold(binary_class_series, k)
for train_indexes, test_indexes in k_folds:
train_set_dataframe = labeled_sample_features_dataframe.loc[train_indexes.tolist()]
test_set_dataframe = labeled_sample_features_dataframe.loc[test_indexes.tolist()]
train_class = binary_class_series[train_indexes]
test_class = binary_class_series[test_indexes]
selected_classifier = RandomForestClassifier(n_estimators=100)
selected_classifier.fit(train_set_dataframe, train_class)
predictions = selected_classifier.predict(test_set_dataframe)
predictions_proba = selected_classifier.predict_proba(test_set_dataframe)
roc += roc_auc_score(test_class, predictions_proba[:,1])
accuracy += accuracy_score(test_class, predictions)
recall += recall_score(test_class, predictions)
precision += precision_score(test_class, predictions)
À la fin, j'ai divisé les résultats en K de cours pour l'obtention de la moyenne de l'ASC, de la précision, etc.
Ce code fonctionne bien.
Cependant, je ne peut pas calculer de même pour le multi classe:
train_class = multi_class_series[train_indexes]
test_class = multi_class_series[test_indexes]
selected_classifier = RandomForestClassifier(n_estimators=100)
selected_classifier.fit(train_set_dataframe, train_class)
predictions = selected_classifier.predict(test_set_dataframe)
predictions_proba = selected_classifier.predict_proba(test_set_dataframe)
J'ai trouvé que pour le multi de classe I d'ajouter le paramètre "pondérée" pour la moyenne.
roc += roc_auc_score(test_class, predictions_proba[:,1], average="weighted")
J'ai une erreur: raise ValueError("{0} format n'est pas pris en charge".format(y_type))
ValueError: multiclass format n'est pas pris en charge
OriginalL'auteur Aviade | 2016-09-25
Vous devez vous connecter pour publier un commentaire.
La
average
option deroc_auc_score
est définie uniquement pour les multilabel problèmes.Vous pouvez prendre un coup d'oeil à l'exemple suivant de la scikit-learn de la documentation pour vous définir de micro - ou de macro-moyenne des scores pour multiclass problèmes:
http://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html#multiclass-settings
Modifier: il y a un problème sur le scikit-learn dispositif de suivi pour mettre en œuvre ROC de l'ASC pour les multiclass problèmes: https://github.com/scikit-learn/scikit-learn/issues/3298
OriginalL'auteur ogrisel
Vous ne pouvez pas utiliser
roc_auc
comme un simple résumé de la mesure de la multiclass modèles. Si vous le souhaitez, vous pouvez calculer par classeroc_auc
, commeMais il est plus habituel d'utiliser
sklearn.metrics.confusion_matrix
pour évaluer la performance d'un multiclass modèle.OriginalL'auteur maxymoo
Comme mentionné ici, au meilleur de ma connaissance, il n'existe pas encore une façon de calculer facilement roc de l'asc pour les multiples paramètres de la classe de façon native dans sklearn.
Toutefois, si vous êtes familier avec
classification_report
vous aimerez cette simple mise en œuvre qui renvoie le même résultat queclassification_report
comme unpandas.DataFrame
que j'ai personnellement trouvé très pratique!:Voici quelques exemple:
Régulière
classification_report
::
Personnalisé classification_report:
:
OriginalL'auteur Raul
Si vous êtes à la recherche de quelque chose de relativement simple qui prend dans le réel et prédit les listes et retourne un dictionnaire avec toutes les classes comme des clés et de ses roc_auc_score que les valeurs, vous pouvez utiliser la méthode suivante:
Oui! C'est ce qui est fait après le commentaire
#marking the current class as 1 and all other classes as 0
OriginalL'auteur Afsan Abdulali Gujarati
Mise à jour sur maxymoo de réponse.
roc[label] += roc_auc_score(test_class, predictions_proba[:,label])
ou reportez-vous à classifier.classes_ attribut de décider de la colonne de droite pour les intéressés étiquette.
OriginalL'auteur Long