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".
Ich habe mich auf Folgendes bezogen, um die Präzisionsrate und die Rückrufrate zu verstehen.
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.
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.
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.
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.
Im Folgenden werden die wichtigen Ideen für die Leistungsbewertung von Binomialklassifizierungsaufgaben zusammengefasst.
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) |
\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)
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.
\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)
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.
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