[PYTHON] Konformität und Rückruf-Verständnis zur Bewertung der Klassifizierungsleistung ①-

Einführung

Aufgaben zur Klassifizierung des maschinellen Lernens weisen je nach Zweck mehrere Leistungsmetriken auf. Die AUC (unterer Bereich der Luftkurve) der ROC-Kurve und der PR-Kurve dient als Hauptmethode als Bewertungsindex für die Binomialklassifizierung, aber als erster Schritt zum Verständnis dieser in diesem Artikel beschriebenen "Rückrufrate" Und "Präzisionsrate".

Referenz

Ich habe mich auf Folgendes bezogen, um die Präzisionsrate und die Rückrufrate zu verstehen.

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

Diesmal 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, sodass alle Sätze in morphologische Elemente zerlegt und dann in den folgenden Datenrahmen verschoben werden.

スクリーンショット 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 Binomialklassifikation 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

Im Folgenden werden die wichtigen Ideen für die Leistungsbewertung von Binomialklassifizierungsaufgaben zusammengefasst.

Gemischte Matrix

Eine gemischte Matrix ist eine Matrix, die die Ausgabeergebnisse einer Binomialklassifizierungsaufgabe zusammenfasst und zur Bewertung der Leistung der Binomialklassifizierung verwendet 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)

** "TP / FP / FN / TN" ** Das Folgende ist eine verbale Erklärung von jedem. ** Dies ist sehr wichtig, da wir die Leistung anhand dieser vier Werte bewerten. ** **.

--TP (wahr positiv): Tatsächlich positiv, und das Klassifizierungsmodell wurde als positiv vorhergesagt --FP (falsch positiv): Eigentlich negativ, aber das Klassifizierungsmodell sagte Positiv voraus --FN (falsch negativ): Eigentlich positiv, aber das Klassifizierungsmodell hat Negativ vorhergesagt --TN (wahr negativ): Tatsächlich negativ und vorhergesagt, dass das Klassifizierungsmodell negativ ist

Bei Anwendung auf die diesmal ausgeführte Klassifizierungsaufgabe ist dies wie folgt.

Voraussichtlich ein Artikel in "German News" Es wurde vorausgesagt, dass es sich nicht um einen Artikel der "German News" handelte (=Voraussichtlich ein "Peachy" -Artikel)
Es ist eigentlich ein Artikel der "deutschen Kommunikation" TP(Richtig positiv) FN(Falsch negativ)
Es ist eigentlich kein Artikel über "German News"(=Es ist eigentlich ein "Peachy" Artikel) FP:(falsch positiv) TN(Richtig negativ)

Diese Matrix lässt sich einfach mit sklearn erstellen. Da das Vorhersageergebnis des maschinellen Lernmodells als Wahrscheinlichkeitswert ausgegeben wird, wird angenommen, dass der Artikel mit einem Wert von 0,5 $ oder mehr einmal als Artikel der "deutschen Kommunikation" vorhergesagt wird.


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

Klicken Sie hier für die Ausgabeergebnisse

[[237  11]
 [ 15 251]]

Wenn Sie es auf die obige Tabelle anwenden, sieht es so aus. Da es viele TPs und TNs gibt, verstehe ich, dass die Leistung gut zu sein scheint. Verwenden wir diesen Wert, um den Rückruf und die Genauigkeit zu betrachten.

Voraussichtlich ein Artikel in "German News" Es wurde vorausgesagt, dass es sich nicht um einen Artikel der "German News" handelte (=Voraussichtlich "Peachy")
Es ist eigentlich ein Artikel der "deutschen Kommunikation" 237(TP) 11(FN)
Es ist eigentlich kein Artikel über "German News"(=Es ist eigentlich ein "Peachy" Artikel) 15(FP) 251(TN)

Erinnern


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

Die obige Formel ist die Formel zur Berechnung des Rückrufs. Auch bekannt als ** Empfindlichkeit ** oder ** True Positive Rate (TPR) **. Anhand dieses konkreten Beispiels wird es wie folgt aussehen.


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

\end{eqnarray*}}}

Die Rückrufrate gibt an, wie viele der Daten, die Sie finden möchten (in diesem Fall der Artikel in "German News"), den Klassifikator finden kann. Mit anderen Worten, es ist ein Index, der die Vollständigkeit misst **.

Andererseits besteht die Schwäche dieses ** Index darin, dass wir nicht wissen, wie viel Fehlklassifizierung vorgenommen wird **. Um ein extremes Beispiel zu nennen: Wenn dieses Klassifizierungsmodell vorhersagt, dass alle Sätze Artikel der "deutschen Kommunikation" sind, beträgt die Rückrufquote 100 $ % $. ** Dies ermöglicht es, alle Artikel in "German News" ** zu behandeln. Um die Leistung zu messen, ist es daher wichtig, sie zusammen mit der unten eingeführten Genauigkeitsrate zu betrachten **.

Auch dieses Mal wurde das Ausgabeergebnis des Klassifizierungsmodells von 0,5 USD oder mehr als Artikel der "deutschen Kommunikation" klassifiziert, aber der Schwellenwert von 0,5 USD ist nicht unveränderlich. Manchmal ist es notwendig, es auf das entsprechende zu ändern.

Überprüfen Sie das Diagramm mit dem Rückruf auf der y-Achse und dem Schwellenwert auf der x-Achse.


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

Ich denke, es ist klar, dass die Rückrufrate umso höher ist, je höher der Schwellenwert eingestellt ist. Andererseits nimmt die Fehlklassifizierung zu, so dass es notwendig ist, einen geeigneten Schwellenwert festzulegen, während die Beziehung zu der unten eingeführten Präzisionsrate beobachtet wird.

Präzision


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

Das Obige ist die Formel zur Berechnung der ** Präzision **. Bei Anwendung dieses speziellen Beispiels wird es wie folgt aussehen.


{{\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}{Die Gesamtzahl der Fälle sagte voraus, dass das Klassifizierungsmodell ein Artikel der "German News" ist.} \\
&=& \frac{237}{237+15} \\
&\simeq& 94\%

\end{eqnarray*}}}

Die Genauigkeitsrate gibt den Prozentsatz der Daten an, den der Klassifizierer wirklich aus den Daten herausfinden möchte, die der Klassifizierer als "Dies sind die Daten, die Sie finden möchten (in diesem Fall der" Artikel der deutschen Kommunikation ")" ermittelt hat. Mit anderen Worten, es stellt die Gewissheit des Urteils dar, wenn der Klassifikator es als positiv beurteilt ** (Beachten Sie, dass die Gewissheit, wenn es als negativ beurteilt wird, ignoriert wird).

Andererseits ** ist die Schwäche dieses Indikators, dass wir keine Ahnung haben, wie falsch das Urteil des Negativs ist **. Dieser Klassifizierer sagt beispielsweise voraus, dass nur ein Artikel ein "German News" -Artikel ist, und wenn er korrekt ist, beträgt die Genauigkeitsrate $ 100 % $. In diesem Fall handelt es sich bei vielen Artikeln, die als nicht "deutsche Nachrichten" eingestuft werden, tatsächlich um "deutsche Nachrichten".

Daher ist es wichtig, diese Genauigkeitsrate zusammen mit der Rückrufrate zu betrachten. ** Rückruf und Präzision stehen jedoch in einem Kompromissverhältnis. ** Überprüfen Sie das Genauigkeitsverhältnis-Diagramm über dem Schwellenwert und rufen Sie das Diagramm ab.

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

Die Beziehung besteht darin, dass wenn der Schwellenwert klein und der Rückruf hoch ist, die Genauigkeit niedrig ist und wenn der Schwellenwert groß und der Rückruf hoch ist, der Rückruf niedrig ist. Es ist notwendig zu überlegen, welches wichtiger ist, und den Schwellenwert unter Berücksichtigung des Zwecks der Aufgabe festzulegen.

F-Wert (F1-Punktzahl)

Es gibt den ** F-Wert (F1-Score) ** als Methode zur Messung der Leistung durch Kombination der Rückrufrate und der Präzisionsrate. Der F-Wert ist der harmonisierte Durchschnitt von Rückruf und Genauigkeit und wird durch die folgende Formel ausgedrückt.


{{\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*}}}

Der F-Wert dieser Klassifizierungsaufgabe (Schwellenwert ist $ 0,5 $) ist wie folgt.


{{\begin{eqnarray*}

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

Man kann sagen, dass die Klassifizierung sehr genau ist. Der F-Wert schätzt Klassifizierer, die die gleiche hohe Präzision und den gleichen Rückruf aufweisen, aber dies ist nicht immer wünschenswert. In einigen Fällen ist die Präzisionsrate wichtiger, und in einigen Fällen ist die Rückrufrate wichtiger. Daher müssen je nach Klassifizierungszweck unterschiedliche Leistungsbewertungsindizes verwendet werden.

Next Das nächste Mal möchte ich die ROC-Kurve und die PR-Kurve zusammenfassen.

Recommended Posts

Konformität und Rückruf-Verständnis zur Bewertung der Klassifizierungsleistung ①-
ROC-Kurve und PR-Kurve - Verstehen, wie die Klassifizierungsleistung bewertet wird ②-
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
So installieren und verwenden Sie Graphviz
Lösen von Folienrätseln und 15 Rätseln
[Linux] Unterteilen von Dateien und Ordnern
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
Einführung des Sinatra-Frameworks und dessen Verwendung
So generieren Sie eine Sequenz in Python und C ++
So erstellen Sie erklärende Variablen und Zielfunktionen
[Python] Lesen von Daten aus CIFAR-10 und CIFAR-100
So wechseln Sie zwischen Linux- und Mac-Shells
[Python] Verwendung von Hash-Funktion und Taple.
Datenbereinigung Umgang mit fehlenden und Ausreißern
So installieren Sie den Cascade-Detektor und wie verwenden Sie ihn
Wie man Autokorrelation und partielle Autokorrelation mit Python zeichnet
[Python] [Django] Verwendung des Auswahlfelds und Hinzufügen von Optionen
Verwendung von xgboost: Mehrklassenklassifizierung mit Irisdaten
Anfänger! Grundlegende Linux-Befehle und Verwendung!
So definieren Sie Decorator und Decomaker mit einer Funktion
So installieren Sie Git GUI und Gitk unter CentOS
Freigeben von Ordnern für Docker und Windows mit Tensorflow
So extrahieren Sie Nullwerte und Nicht-Nullwerte mit Pandas
Verwendung des Befehls grep und häufiger Samples
[Python] So sortieren Sie Diktate in Listen und Instanzen in Listen
So schleifen und spielen Sie ein GIF-Video mit openCV ab
Julia Quick Look Note [01] Verwendung von Variablen und Konstanten
[Python] So teilen und modularisieren Sie Dateien (einfach, Beispiel)
[Python] So erstellen Sie eine Korrelationsmatrix und eine Heatmap
Wie man Argparse benutzt und den Unterschied zwischen Optparse
Wie man Decorator in Django benutzt und wie man es macht
Python # So überprüfen Sie Typ und Typ für Super-Anfänger
So richten Sie die Cython-Umgebung ein und kompilieren sie
[How to!] Lerne und spiele Super Mario mit Tensorflow !!
[TF] Speichern und Laden von Tensorflow-Trainingsparametern
So erhalten Sie RGB- und HSV-Histogramme mit OpenCV