[PYTHON] Conformité et rappel - 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. L'AUC (zone inférieure de la courbe d'air) de la courbe ROC et de la courbe PR existe comme méthode principale en tant qu'indice d'évaluation pour la classification binomiale, mais comme première étape pour comprendre cela, dans cet article, "Taux de rappel" Et "taux de précision".

référence

J'ai fait référence à ce qui suit pour comprendre le taux de précision et le taux de rappel.

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

Ci-dessous, nous résumerons les idées importantes dans l'évaluation des performances des tâches de classification binomiale.

Matrice mixte

Une matrice mixte est une matrice qui résume les résultats de sortie d'une tâche de classification binomiale et est utilisée pour évaluer les performances de la classification binomiale.

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)

** "TP / FP / FN / TN" ** Ce qui suit est une explication verbale de chacun. ** C'est très important car nous évaluerons les performances en utilisant ces quatre valeurs. ** **

--TP (vrai positif): en fait Positvie, et le modèle de classification était prédit positif --FP (faux positif): en fait négatif, mais le modèle de classification prédisait positif --FN (faux négatif): en fait positif, mais le modèle de classification prédisait négatif --TN (vrai négatif): en fait négatif, et prédit que le modèle de classification est négatif

Lorsqu'il est appliqué à la tâche de classification effectuée cette fois, ce sera comme suit.

Prévu pour être un article dans "German News" Il a été prédit qu'il ne s'agissait pas d'un article de "German News" (=Prévu pour être un article "Peachy")
C'est en fait un article de "communication allemande" TP(Vrai positif) FN(Faux négatif)
Ce n'est pas en fait un article sur "German News"(=C'est en fait un article "Peachy") FP:(faux positif) TN(Vrai négatif)

Cette matrice est facile à créer avec sklearn. Étant donné que le résultat de la prédiction du modèle d'apprentissage automatique est émis sous forme de valeur de probabilité, on considère que l'article d'une valeur de 0,5 $ ou plus est une fois prédit comme un article de "communication allemande".


from sklearn.metrics import confusion_matrix
print(confusion_matrix(y_test, y_preds>0.5))

Cliquez ici pour les résultats de sortie

[[237  11]
 [ 15 251]]

En l'appliquant au tableau ci-dessus, cela ressemble à ceci. Puisqu'il existe de nombreux TP et TN, je comprends que les performances semblent bonnes. Utilisons cette valeur pour examiner le rappel et la précision.

Prévu pour être un article dans "German News" Il a été prédit qu'il ne s'agissait pas d'un article de "German News" (=Prévu pour être "Peachy")
C'est en fait un article de "communication allemande" 237(TP) 11(FN)
Ce n'est pas en fait un article sur "German News"(=C'est en fait un article "Peachy") 15(FP) 251(TN)

Rappel


\text{recall} = \frac{TP}{TP + FN}

La formule ci-dessus est la formule de calcul du ** rappel **. Aussi connu sous le nom de ** sensibilité ** ou de ** taux de vrais positifs (TPR) **. En appliquant cet exemple concret, ce sera comme suit.


{{\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"} \\
&=& \frac{237}{237+11} \\
&\simeq& 96\%

\end{eqnarray*}}}

Le taux de rappel indique la quantité de données que vous voulez trouver (dans ce cas, l'article dans "German News") que le classificateur peut trouver. En d'autres termes, il s'agit d'un ** indice qui mesure l'exhaustivité **.

En revanche, la faiblesse de cet ** indice est que nous ne savons pas à quel point les erreurs de classification sont commises **. Pour donner un exemple extrême, si ce modèle de classification prédit que toutes les phrases sont des articles de "communication allemande", le taux de rappel sera de 100 $ % $. ** Cela permet de couvrir tous les articles de "German News" **. Par conséquent, afin de mesurer la performance, il est essentiel de la regarder avec le taux de précision introduit ci-dessous **.

De plus, cette fois, le résultat de sortie du modèle de classification de 0,5 $ ou plus a été classé comme un article de «communication allemande», mais le seuil de 0,5 $ n'est pas invariant. Parfois, il est nécessaire de le changer pour celui qui convient.

Vérifiez le graphique avec le rappel sur l'axe y et le seuil sur l'axe x.


import matplotlib.pyplot as plt
from sklearn import metrics
precision, recall, thresholds = metrics.precision_recall_curve(y_test, y_preds)

plt.plot(np.append(thresholds, 1), recall)
plt.legend()
plt.xlabel('Thresholds')
plt.ylabel('Recall')
plt.grid(True)

ダウンロード (6).png

Je pense qu'il est clair que plus le seuil est élevé, plus le taux de rappel est élevé. D'autre part, les erreurs de classification augmenteront, il est donc nécessaire de fixer un seuil approprié tout en observant la relation avec le taux de précision introduit ci-dessous.

Précision


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

Ce qui précède est la formule pour calculer la ** précision **. En appliquant cet exemple spécifique, ce sera comme suit.


{{\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}{Le nombre total de cas prédit que le modèle de classification est un article de "German News"} \\
&=& \frac{237}{237+15} \\
&\simeq& 94\%

\end{eqnarray*}}}

Le taux de précision indique le pourcentage des données que le classificateur veut vraiment trouver parmi les données que le classificateur a déterminé comme étant "ce sont les données que vous voulez trouver (dans ce cas, l '" article de communication allemande ")". ** En d'autres termes, il représente la certitude du jugement lorsque le classificateur le juge positif ** (notez que la certitude lorsqu'elle est jugée négative est ignorée).

D'un autre côté, ** la faiblesse de cet indicateur est que nous n'avons aucune idée à quel point le jugement de Negative est erroné **. Par exemple, ce classificateur prédit qu'un seul article est un article "German News", et s'il est correct, le taux de précision sera de 100 $ % $. Dans ce cas, la plupart des articles jugés ne pas être des "nouvelles allemandes" seront inclus dans les articles qui sont réellement des "nouvelles allemandes".

Par conséquent, il est essentiel de regarder ce taux de précision avec le taux de rappel. Cependant, ** rappel et précision sont dans une relation de compromis. ** Vérifiez le graphique du rapport de précision en haut du graphique de seuil et rappelez-le.

import matplotlib.pyplot as plt
from sklearn import metrics
precision, recall, thresholds = metrics.precision_recall_curve(y_test, y_preds)

plt.plot(np.append(thresholds, 1), recall, label = 'Recall')
plt.plot(np.append(thresholds, 1), precision, label = 'Precision')
plt.legend()
plt.xlabel('Thresholds')
plt.ylabel('Rate')
plt.grid(True)

ダウンロード (7).png

Lorsque le seuil est petit et que le rappel est élevé, la précision est faible, et lorsque le seuil est grand et le rappel est élevé, le rappel est faible. Il est nécessaire de déterminer lequel est le plus important et de fixer le seuil, en tenant compte du but de la tâche.

Valeur F (score F1)

Il existe une ** valeur F (score F1) ** comme méthode pour mesurer la performance en combinant le taux de rappel et le taux de précision. La valeur F est la moyenne harmonisée du rappel et de la précision, et est exprimée par la formule suivante.


{{\begin{eqnarray*}

F_{1} &=& \frac{2}{\frac{1}{\text{recall}} + \frac{1}{\text{precision}}} \\
&=& 2\times\frac{\text{recall}\times\text{precision}}{\text{recall}+\text{precision}}
\end{eqnarray*}}}

La valeur F de cette tâche de classification (le seuil est de 0,5 $) est la suivante.


{{\begin{eqnarray*}

F_{1} &=& \frac{2}{\frac{1}{0.96} + \frac{1}{0.94}} \\
&\simeq& 0.95
\end{eqnarray*}}}

On peut dire que la classification est très précise. La valeur F apprécie les classificateurs qui ont la même précision et le même rappel, mais ce n'est pas toujours souhaitable. Dans certains cas, le taux de précision est plus important et dans certains cas, le taux de rappel est plus important, il est donc nécessaire d'utiliser différents indices d'évaluation des performances en fonction de l'objectif de la classification.

Next La prochaine fois, j'aimerais résumer la courbe ROC et la courbe PR.

Recommended Posts

Conformité et rappel - Comprendre comment évaluer les performances de classification ①-
Courbe ROC et courbe PR-Comprendre comment évaluer les performances de classification ②-
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
Comment installer et utiliser Graphviz
Résoudre des puzzles et 15 puzzles
[Linux] Comment subdiviser des fichiers et des dossiers
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
Introduction du cadre de style Sinatra et comment l'utiliser
Comment générer une séquence en Python et C ++
Comment créer des variables explicatives et des fonctions objectives
[Python] Comment lire les données de CIFAR-10 et CIFAR-100
Comment basculer entre les shells Linux et Mac
[Python] Comment utiliser la fonction de hachage et taple.
Nettoyage des données Comment gérer les valeurs manquantes et aberrantes
Comment installer le détecteur Cascade et comment l'utiliser
Comment tracer l'autocorrélation et l'autocorrélation partielle avec Python
[Python] [Django] Comment utiliser le champ de choix et comment ajouter des options
Comment utiliser xgboost: classification multi-classes avec des données d'iris
Débutants! Commandes et utilisation de base de Linux!
Comment définir Decorator et Decomaker avec une seule fonction
Comment installer Git GUI et Gitk sur CentOS
Comment partager des dossiers avec Docker et Windows avec tensorflow
Comment extraire des valeurs Null et des valeurs non Null avec des pandas
Comment utiliser la commande grep et des exemples fréquents
[Python] Comment trier un dict dans une liste et une instance dans une liste
Comment boucler et lire une vidéo gif avec openCV
Julia Quick Look Note [01] Comment utiliser les variables et les constantes
[Python] Comment fractionner et modulariser des fichiers (simple, exemple)
[Python] Comment créer une matrice de corrélation et une carte thermique
Comment utiliser argparse et la différence entre optparse
Comment utiliser Decorator dans Django et comment le créer
Python # Comment vérifier le type et le type pour les super débutants
Comment configurer et compiler l'environnement Cython
[Comment!] Apprenez et jouez à Super Mario avec Tensorflow !!
[TF] Comment enregistrer et charger les paramètres d'entraînement Tensorflow
Comment obtenir des histogrammes RVB et HSV avec OpenCV