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.
J'ai fait référence à ce qui suit pour comprendre la courbe ROC et la courbe PR.
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.
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.
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.
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".
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.
\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 **.
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()
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.
\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()
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.
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()
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