[PYTHON] Courbe ROC et courbe PR-Comprendre comment évaluer les performances de classification ②-

introduction

Les tâches de classification d'apprentissage automatique ont plusieurs mesures de performances en fonction de leur objectif. La courbe ROC et la courbe PR, qui sont les principaux indices d'évaluation des performances de la classification binomiale, et leur AUC (zone inférieure de la courbe) sont résumées.

référence

J'ai fait référence à ce qui suit pour comprendre la courbe ROC et la courbe PR.

Tâche de classification

Nous expliquerons la méthode d'évaluation des performances avec des exemples spécifiques de tâches de classification de documents. Dans un premier temps, ce chapitre décrit brièvement comment effectuer la tâche de classification, mais comme il ne s'agit pas d'un article sur la tâche de classification elle-même, une explication détaillée du modèle est omise.

Bibliothèque utilisée

base de données

Cette fois, le jeu de données utilise le "corpus d'actualités liveoor". Pour plus de détails sur l'ensemble de données et comment analyser sa morphologie, reportez-vous à Publié dans un article publié précédemment.

Dans le cas du japonais, un prétraitement qui décompose les phrases en éléments morphologiques est nécessaire à l'avance, donc après avoir décomposé toutes les phrases en éléments morphologiques, elles sont déposées dans la trame de données suivante.

スクリーンショット 2020-01-13 21.07.38.png

La colonne la plus à droite est l'analyse morphologique de toutes les phrases et séparées par des espaces de demi-largeur. Utilisez ceci pour effectuer une tâche de classification.

Création et classification de modèles

Cette fois, nous classerons les articles de "Peachy" et les articles de "German News" (tous deux sont des articles pour femmes). Puisqu'il s'agit cette fois d'une classification binomiale, elle est synonyme de la tâche de classification pour déterminer s'il s'agit d'un article de «communication allemande». L'ensemble de données est divisé en 7: 3, 7 pour la formation et 3 pour l'évaluation.


import pandas as pd
import numpy as np
import pickle
from sklearn.feature_extraction.text import TfidfVectorizer

#On suppose que la trame de données après décomposition morphologique a déjà été décapée.
with open('df_wakati.pickle', 'rb') as f:
    df = pickle.load(f)

#Vérifiez si vous pouvez classer deux types d'articles cette fois
ddf = df[(df[1]=='peachy') | (df[1]=='dokujo-tsushin')].reset_index(drop = True)

vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(ddf[3])

def convert(x):
    if x == 'peachy':
        return 0
    elif x == 'dokujo-tsushin':
        return 1

target = ddf[1].apply(lambda x : convert(x))

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, target, train_size= 0.7, random_state = 0)

import lightgbm as lgb
from sklearn.metrics import classification_report

train_data = lgb.Dataset(X_train, label=y_train)
eval_data = lgb.Dataset(X_test, label=y_test)

params = {
    'boosting_type': 'gbdt',
    'objective': 'binary',
    'random_state':0
    }

gbm = lgb.train(
    params,
    train_data,
    valid_sets=eval_data,
)
y_preds = gbm.predict(X_test)

La prédiction est complète ici. y_preds contient la valeur de la probabilité que le document soit une "communication allemande".

Méthode d'évaluation des performances de classification

Avant de regarder la courbe ROC et la courbe PR, passons en revue la matrice de mélange qui la précède. La matrice mixte est une matrice qui résume les résultats de sortie de la tâche de classification binomiale et est exprimée comme suit.

Prédiction positive Prévu pour être négatif
Appartient en fait à la classe Positive TP(Vrai positif) FN(Faux négatif)
Appartient en fait à la classe Negative FP:(faux positif) TN(Vrai négatif)

Vous pouvez dessiner une courbe ROC en utilisant chaque valeur de la matrice mixte.

Courbe ROC

Vue d'ensemble de la courbe ROC


\text{FPR} = \frac{FP}{TN + FP}


\text{TPR(recall)} = \frac{TP}{TP + FN}

** La courbe ROC est un tracé de $ \ text {TPR} $ (taux de vrais positifs) par rapport à $ \ text {FPR} $ (taux de faux positifs) **. Parlons de ce que signifie ce tracé. Premièrement, appliquons les significations de $ \ text {FPR} $ et $ \ text {TPR (rappel)} $ à des exemples concrets.


{{\begin{eqnarray*}

\text{FPR} &=& \frac{Le modèle de classification est "\text{Peachy}Le nombre de cas dans lesquels il a été prédit à tort que l'article était un article de "communication allemande"}{L'actuel "\text{Peachy}Nombre total d'articles} \\

\end{eqnarray*}}}


{{\begin{eqnarray*}

\text{TPR(recall)} &=& \frac{Le nombre de cas où le résultat de la prédiction que le modèle de classification était un article de "communication allemande" était correct}{Nombre total d'articles actuels de "German News"} \\

\end{eqnarray*}}}

La signification de ceci peut être résumée comme suit.

En d'autres termes, idéalement, $ \ text {FPR} $ est faible mais $ \ text {TPR} $ est élevé.

Vous pouvez dessiner une courbe ROC en traçant $ \ text {FPR} $ et $ \ text {TPR} $ à différents seuils. Considérant que "idéalement, $ \ text {FPR} $ est faible mais $ \ text {TPR} $ est élevé", plus la forme de la courbe ROC est proche d'un angle droit, mieux c'est = Cela conduit à l'idée que ** plus l'AUC (aire inférieure de la courbe ROC) est grande, mieux c'est **.

Dessin de courbe ROC

Dessinons en fait la courbe ROC.


from sklearn import metrics
import matplotlib.pyplot as plt
fpr, tpr, thresholds = metrics.roc_curve(y_test, y_preds)
auc = metrics.auc(fpr, tpr)
print(auc)

plt.plot(fpr, tpr, label='ROC curve (area = %.2f)'%auc)
plt.plot(np.linspace(1, 0, len(fpr)), np.linspace(1, 0, len(fpr)), label='Random ROC curve (area = %.2f)'%0.5, linestyle = '--', color = 'gray')

plt.legend()
plt.title('ROC curve')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.grid(True)
plt.show()

download.png

J'ai dessiné la courbe ROC en utilisant le classificateur créé cette fois. Considérant que la courbe ROC est proche d'un angle droit et que l'AUC est de 0,98 $ (la valeur maximale est de 1 $), vous pouvez voir qu'elle est très précise. Dans le cas d'un classificateur aléatoire, l'AUC est fixée à 0,5 $, il est donc facile de comparer avec aléatoire.

Courbe PR

Vue d'ensemble de la courbe PR


\text{precision} = \frac{TP}{TP + FP}


\text{recall(TPR)} = \frac{TP}{TP + FN}

** La courbe PR est un tracé de $ \ text {precition} $ (reproductibilité) pour $ \ text {rappel} $ (taux de rappel) **. Parlons de ce que signifie ce tracé, mais appliquons d'abord les significations de $ \ text {precition} $ et $ \ text {rappel} $ à des exemples concrets.


{{\begin{eqnarray*}

\text{precision} &=& \frac{Le nombre de cas où le résultat de la prédiction que le modèle de classification était un article de "communication allemande" était correct}{Le nombre total de cas prédit que le modèle de classification est un article de "communication allemande"} \\

\end{eqnarray*}}}


{{\begin{eqnarray*}

\text{recall} &=& \frac{Le nombre de cas où le résultat de la prédiction que le modèle de classification était un article de "communication allemande" était correct}{Nombre total d'articles actuels de "German News"} \\

\end{eqnarray*}}}

En d'autres termes, idéalement, $ \ text {precision} $ est élevé (tout en garantissant la certitude), mais $ \ text {rappel} $ est également aussi élevé que possible (couvert).

Vous pouvez dessiner une courbe PR en traçant $ \ text {precision} $ et $ \ text {rappel} $ à différents seuils. Comme pour la courbe ROC, plus l'AUC (zone inférieure de la courbe PR) est grande, meilleure est la précision.


precision, recall, thresholds = metrics.precision_recall_curve(y_test, y_preds)

auc = metrics.auc(recall, precision)
print(auc)

plt.plot(recall, precision, label='PR curve (area = %.2f)'%auc)
plt.legend()
plt.title('PR curve')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.grid(True)
plt.show()

download-1.png

J'ai dessiné une courbe PR en utilisant le classificateur créé cette fois. Étant donné que l'AUC est de 0,98 $ (la valeur maximale est de 1 $), vous pouvez voir qu'elle est très précise du point de vue de la courbe PR. Cependant, contrairement à la courbe ROC, l'AUC n'est pas toujours de 0,5 $ pour un classificateur aléatoire.

Courbe ROC et courbe PR

Il s'agit d'utiliser la courbe ROC ou la courbe PR, mais en général ** Dans le cas de données déséquilibrées (le nombre de négatifs est extrêmement supérieur au nombre de positifs, etc.), la courbe PR est utilisée. En dehors de cela, il est préférable d'utiliser la courbe ROC **.

En tant qu'interprétation, la courbe ROC a à la fois le point de vue que positif peut être jugé comme positif et négatif peut être jugé comme négatif, mais la courbe PR se concentre uniquement sur le fait que positif peut être jugé comme positif. Faire. Par conséquent, il est préférable d'utiliser la courbe ROC qui considère l'équilibre des deux comme un indice de performance du classificateur, mais s'il y a beaucoup plus de négatifs, il est exact de juger la majorité des négatifs comme des négatifs. Sera jugé bon. (Même si le jugement de Positve est approprié.) Mon point de vue est donc d'utiliser la courbe PR pour voir si un petit nombre de positifs peut être jugé correctement.

À titre d'exemple extrême, supposons qu'il existe un modèle dans lequel Positive prédit de manière appropriée et Negative détermine définitivement Négatif dans 100 données positives et 99900 données négatives. Ensuite, la courbe ROC et la courbe PR sont les suivantes.


rand_predict = np.concatenate((np.random.rand(100) , 0.5*np.random.rand(99900)))
rand_test = np.concatenate((np.ones(100), np.zeros(99900)))

from sklearn import metrics
import matplotlib.pyplot as plt
fpr, tpr, thresholds = metrics.roc_curve(rand_test, rand_predict)
auc = metrics.auc(fpr, tpr)
print(auc)

#Courbe ROC
plt.plot(fpr, tpr, label='ROC curve (area = %.2f)'%auc)
plt.plot(np.linspace(1, 0, len(fpr)), np.linspace(1, 0, len(fpr)), label='Random ROC curve (area = %.2f)'%0.5, linestyle = '--', color = 'gray')

plt.legend()
plt.title('ROC curve')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.grid(True)
plt.show()

##Courbe PR
precision, recall, thresholds = metrics.precision_recall_curve(rand_test, rand_predict)

auc = metrics.auc(recall, precision)
print(auc)

plt.plot(recall, precision, label='PR curve (area = %.2f)'%auc)
plt.legend()
plt.title('PR curve')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.grid(True)
plt.show()

download-2.png

download-3.png

Voyez-vous une grande différence dans l'ASC (l'ASC de la courbe ROC est de 0,72 $, l'ASC de la courbe PR est de 0,47 $)? Même si les données sont les mêmes, le jugement de l'exactitude change considérablement en fonction de l'index que vous voyez. Fondamentalement, il est important d'utiliser correctement la courbe ROC et la courbe PR du point de vue ci-dessus et de faire des jugements individuels en fonction de la tâche.

Next Je voudrais résumer l'évaluation des performances de l'apprentissage automatique autre que la classification.

Recommended Posts

Courbe ROC et courbe PR-Comprendre comment évaluer les performances de classification ②-
Conformité et rappel - Comprendre comment évaluer les performances de classification ①-
Prise en compte de la différence entre la courbe ROC et la courbe PR
Courbe ROC pour la classification multi-classes
Essayez d'évaluer les performances du modèle d'apprentissage automatique / de classification
Comment installer et utiliser Tesseract-OCR
Comment installer et configurer Blackbird
Comment utiliser .bash_profile et .bashrc
Résoudre des puzzles et 15 puzzles
Comment empaqueter et distribuer des scripts Python
Comment diviser et enregistrer un DataFrame
Comment installer et utiliser pandas_datareader [Python]
python: Comment utiliser les locals () et globals ()
[Python] Comment calculer MAE et RMSE
Comment utiliser le zip Python et énumérer
Comment utiliser is et == en Python
Comment utiliser les pandas Timestamp et date_range
Comment installer le tissu et comment l'utiliser
Comment écrire des commentaires pydoc et multi-lignes