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".
J'ai fait référence à ce qui suit pour comprendre le taux de précision et le taux de rappel.
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".
Ci-dessous, nous résumerons les idées importantes dans l'évaluation des performances des tâches de classification binomiale.
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) |
\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)
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.
\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)
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.
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