[PYTHON] ROC-Kurve und PR-Kurve - Verstehen, wie die Klassifizierungsleistung bewertet wird ②-

Einführung

Aufgaben zur Klassifizierung des maschinellen Lernens weisen je nach Zweck mehrere Leistungsmetriken auf. Die ROC-Kurve und die PR-Kurve, die die wichtigsten Leistungsbewertungsindizes der Binomialklassifizierung darstellen, und ihre AUC (unterer Bereich der Kurve) werden zusammengefasst.

Referenz

Ich habe mich beim Verständnis der ROC-Kurve und der PR-Kurve auf Folgendes bezogen.

Klassifizierungsaufgabe

Wir werden die Leistungsbewertungsmethode anhand spezifischer Beispiele für Dokumentklassifizierungsaufgaben erläutern. In einem ersten Schritt wird in diesem Kapitel kurz beschrieben, wie die Klassifizierungsaufgabe ausgeführt wird. Da es sich jedoch nicht um einen Artikel über die Klassifizierungsaufgabe selbst handelt, wird eine ausführliche Erläuterung des Modells weggelassen.

Bibliothek verwendet

Datensatz

Dieses Mal verwendet der Datensatz "Livedoor News Corpus". Ausführliche Informationen zum Datensatz und zur Analyse seiner Morphologie finden Sie unter In einem zuvor veröffentlichten Artikel veröffentlicht.

Im Fall von Japanisch ist eine Vorverarbeitung erforderlich, bei der Sätze in morphologische Elemente zerlegt werden. Nachdem alle Sätze in morphologische Elemente zerlegt wurden, werden sie in den folgenden Datenrahmen verschoben.

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

Die Spalte ganz rechts ist die morphologische Analyse aller Sätze und durch Leerzeichen halber Breite getrennt. Verwenden Sie diese Option, um eine Klassifizierungsaufgabe auszuführen.

Modellerstellung und Klassifizierung

Dieses Mal werden wir die Artikel von "Peachy" und die Artikel von "German News" klassifizieren (beide sind Artikel für Frauen). Da es sich diesmal um eine binäre Klassifikation handelt, ist es gleichbedeutend mit der Klassifikationsaufgabe, festzustellen, ob es sich um einen Artikel der "deutschen Kommunikation" handelt. Der Datensatz ist in 7: 3, 7 für das Training und 3 für die Auswertung unterteilt.


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

#Es wird angenommen, dass der Datenrahmen nach der morphologischen Zersetzung bereits gebeizt wurde.
with open('df_wakati.pickle', 'rb') as f:
    df = pickle.load(f)

#Überprüfen Sie, ob Sie diesmal zwei Arten von Artikeln klassifizieren können
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)

Die Vorhersage ist hier vollständig. y_preds enthält den Wert der Wahrscheinlichkeit, dass das Dokument "deutsche Kommunikation" ist.

Bewertungsmethode für die Klassifizierungsleistung

Bevor wir uns die ROC-Kurve und die PR-Kurve ansehen, überprüfen wir die vorhergehende Mischmatrix. Die gemischte Matrix ist eine Matrix, die die Ausgabeergebnisse der Binomialklassifizierungsaufgabe zusammenfasst und wie folgt ausgedrückt wird.

Positiv vorhergesagt Voraussichtlich negativ
Gehört eigentlich zur Positiven Klasse TP(Richtig positiv) FN(Falsch negativ)
Gehört eigentlich zur Negativklasse FP:(falsch positiv) TN(Richtig negativ)

Sie können mit jedem Wert in der gemischten Matrix eine ROC-Kurve zeichnen.

ROC-Kurve

ROC-Kurvenübersicht


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


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

** Die ROC-Kurve ist eine Darstellung von $ \ text {TPR} $ (wahre positive Rate) gegen $ \ text {FPR} $ (falsche positive Rate) **. Lassen Sie uns darüber sprechen, was dieses Diagramm bedeutet. Wenden wir zunächst die Bedeutungen von $ \ text {FPR} $ und $ \ text {TPR (Rückruf)} $ auf konkrete Beispiele an.


{{\begin{eqnarray*}

\text{FPR} &=& \frac{Das Klassifizierungsmodell lautet "\text{Peachy}Anzahl der Fälle, die fälschlicherweise vorausgesagt haben, dass der Artikel ein Artikel der "deutschen Kommunikation" ist}{Das eigentliche "\text{Peachy}Gesamtzahl der Artikel} \\

\end{eqnarray*}}}


{{\begin{eqnarray*}

\text{TPR(recall)} &=& \frac{Die Anzahl der Fälle, in denen das Ergebnis der Vorhersage, dass das Klassifizierungsmodell ein Artikel der "deutschen Kommunikation" war, korrekt war}{Gesamtzahl der aktuellen "German News" -Artikel} \\

\end{eqnarray*}}}

Die Bedeutung davon kann wie folgt zusammengefasst werden.

Mit anderen Worten, im Idealfall ist $ \ text {FPR} $ niedrig, während $ \ text {TPR} $ hoch ist.

Sie können eine ROC-Kurve zeichnen, indem Sie $ \ text {FPR} $ und $ \ text {TPR} $ an verschiedenen Schwellenwerten zeichnen. Wenn man bedenkt, dass "im Idealfall $ \ text {FPR} $ niedrig ist, aber $ \ text {TPR} $ hoch", ist es umso besser, je näher die Form der ROC-Kurve an einem rechten Winkel liegt Dies führt zu der Idee, dass ** je größer die AUC (unterer Bereich der ROC-Kurve) ist, desto besser **.

ROC-Kurvenzeichnung

Zeichnen wir tatsächlich die ROC-Kurve.


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

Ich habe die ROC-Kurve mit dem diesmal erstellten Klassifikator gezeichnet. Wenn man bedenkt, dass die ROC-Kurve nahe an einem rechten Winkel liegt und die AUC 0,98 $ (Maximalwert 1 $) beträgt, kann man sehen, dass sie sehr genau ist. Im Fall eines zufälligen Klassifikators ist die AUC auf $ 0,5 $ festgelegt, so dass es einfach ist, sie mit zufälligen zu vergleichen.

PR-Kurve

Übersicht der PR-Kurve


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


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

** Die PR-Kurve ist eine Darstellung von $ \ text {Präzision} $ (Reproduzierbarkeit) für $ \ text {Rückruf} $ (Rückrufrate) **. Lassen Sie uns darüber sprechen, was diese Darstellung bedeutet, aber zuerst wenden wir die Bedeutungen von $ \ text {Precision} $ und $ \ text {Recall} $ auf konkrete Beispiele an.


{{\begin{eqnarray*}

\text{precision} &=& \frac{Die Anzahl der Fälle, in denen das Ergebnis der Vorhersage, dass das Klassifizierungsmodell ein Artikel der "deutschen Kommunikation" war, korrekt war}{Die Gesamtzahl der Fälle sagte voraus, dass das Klassifizierungsmodell ein Artikel der "German News" ist.} \\

\end{eqnarray*}}}


{{\begin{eqnarray*}

\text{recall} &=& \frac{Die Anzahl der Fälle, in denen das Ergebnis der Vorhersage, dass das Klassifizierungsmodell ein Artikel der "deutschen Kommunikation" war, korrekt war}{Gesamtzahl der aktuellen "German News" -Artikel} \\

\end{eqnarray*}}}

Mit anderen Worten, im Idealfall ist $ \ text {Genauigkeit} $ hoch (unter Gewährleistung der Sicherheit), aber $ \ text {Rückruf} $ ist auch so hoch wie möglich (abgedeckt).

Sie können eine PR-Kurve zeichnen, indem Sie $ \ text {Genauigkeit} $ und $ \ text {Rückruf} $ an verschiedenen Schwellenwerten zeichnen. Wie bei der ROC-Kurve ist die Genauigkeit umso besser, je größer die AUC (unterer Bereich der PR-Kurve) ist.


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

Ich habe mit dem diesmal erstellten Klassifikator eine PR-Kurve gezeichnet. Angesichts der Tatsache, dass die AUC 0,98 USD beträgt (Maximalwert 1 USD), können Sie sehen, dass sie aus Sicht der PR-Kurve sehr genau ist. Im Gegensatz zur ROC-Kurve beträgt die AUC für einen zufälligen Klassifikator jedoch nicht immer $ 0,5 $.

ROC-Kurve und PR-Kurve

Es ist eine Frage der Verwendung der ROC-Kurve oder der PR-Kurve, aber im Allgemeinen ** Bei unausgeglichenen Daten (die Anzahl der Negative ist überwiegend größer als die Anzahl der Positiven usw.) wird die PR-Kurve verwendet. Ansonsten ist es besser, die ROC-Kurve ** zu verwenden.

Als Interpretation hat die ROC-Kurve sowohl den Standpunkt, dass Positiv als Positiv als auch Negativ als Negativ beurteilt werden kann, aber die PR-Kurve konzentriert sich nur auf die Tatsache, dass Positiv als Positiv beurteilt werden kann. tun. Daher ist es besser, die ROC-Kurve, die das Gleichgewicht von beiden betrachtet, als Leistungsindex des Klassifikators zu verwenden. Wenn jedoch überwiegend viele Negative vorhanden sind, ist es richtig, die Mehrheit der Negative als Negative zu beurteilen. Wird als gut beurteilt. (Auch wenn das Urteil von Positve angemessen ist.) Ich bin daher der Ansicht, anhand der PR-Kurve zu prüfen, ob eine kleine Anzahl von Positiven richtig beurteilt werden kann.

Nehmen wir als extremes Beispiel an, dass es ein Modell gibt, in dem Positiv angemessen vorhersagt und Negativ definitiv Negativ in 100 positiven Daten und 99900 negativen Daten bestimmt. Dann sind die ROC-Kurve und die PR-Kurve wie folgt.


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)

#ROC-Kurve
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()

##PR-Kurve
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

Können Sie den großen Unterschied in der AUC erkennen (die ROC-Kurve AUC beträgt 0,72 USD, die PR-Kurve AUC beträgt 0,47 USD)? Obwohl die Daten identisch sind, ändert sich die Beurteilung der Genauigkeit in Abhängigkeit vom angezeigten Index erheblich. Grundsätzlich ist es wichtig, die ROC-Kurve und die PR-Kurve unter dem oben genannten Gesichtspunkt richtig zu verwenden und individuelle Beurteilungen entsprechend der Aufgabe vorzunehmen.

Next Ich möchte die Leistungsbewertung des maschinellen Lernens außer der Klassifizierung zusammenfassen.

Recommended Posts

ROC-Kurve und PR-Kurve - Verstehen, wie die Klassifizierungsleistung bewertet wird ②-
Konformität und Rückruf-Verständnis zur Bewertung der Klassifizierungsleistung ①-
Berücksichtigung des Unterschieds zwischen ROC-Kurve und PR-Kurve
ROC-Kurve für die Klassifizierung mehrerer Klassen
Versuchen Sie, die Leistung des Modells für maschinelles Lernen / Klassifizierung zu bewerten
So installieren und verwenden Sie Tesseract-OCR
So installieren und konfigurieren Sie Amsel
Verwendung von .bash_profile und .bashrc
Lösen von Folienrätseln und 15 Rätseln
So verpacken und verteilen Sie Python-Skripte
So teilen und speichern Sie einen DataFrame
So installieren und verwenden Sie pandas_datareader [Python]
Python: Verwendung von Einheimischen () und Globalen ()
[Python] Berechnen von MAE und RMSE
Verwendung von Python zip und Aufzählung
Verwendung ist und == in Python
Verwendung von pandas Timestamp und date_range
Wie man Fabric installiert und wie man es benutzt
Wie schreibe ich pydoc und mehrzeilige Kommentare