[PYTHON] Memorandum über Metriken für Regression und Binomialklassifikation

Ich werde den Bewertungsindex für jede Aufgabe zu sehr vergessen, daher werde ich die minimalen Dinge zusammenfassen, an die ich mich erinnern muss. Dieser Artikel befasst sich mit den wichtigsten Metriken für die Regression und die Binomialklassifizierung. Referenzen: [Kaggle-Buch](https://www.amazon.co.jp/Kaggle%E3%81%A7%E5%8B%9D%E3%81%A4%E3%83%87%E3%83% BC% E3% 82% BF% E5% 88% 86% E6% 9E% 90% E3% 81% AE% E6% 8A% 80% E8% A1% 93-% E9% 96% 80% E8% 84% 87 -% E5% A4% A7% E8% BC% 94 / dp / 4297108437 / ref = sr_1_1_sspa? __Mk_ja_JP =% E3% 82% AB% E3% 82% BF% E3% 82% AB% E3% 83% 8A & Schlüsselwörter = Kaggle % E3% 81% A7% E5% 8B% 9D% E3% 81% A4% E3% 83% 87% E3% 83% BC% E3% 82% BF% E5% 88% 86% E6% 9E% 90% E3 81%% AE% E6% 8A% 80% E8% A1% 93 & qid = 1583042364 & sr = 8-1-spons & PSC = 1 & sPLA = ZW5jcnlwdGVkUXVhbGlmaWVyPUExTkhDNkExUTRFMzQ2JmVuY3J5cHRlZElkPUEwMzc3MjMyMzFUQ0g5SERIQ1BDSiZlbmNyeXB0ZWRBZElkPUFMT0hMWThLWFhJNDUmd2lkZ2V0TmFtZT1zcF9hdGYmYWN0aW9uPWNsaWNrUmVkaXJlY3QmZG9Ob3RMb2dDbGljaz10cnVl)

1. Vorbereitung

1-1. Umgebung

Es wurde bestätigt, dass der Code im Artikel unter Windows-10, Python 3.7.3 funktioniert.

import platform

print(platform.platform())
print(platform.python_version())

1-2. Datensatz

Lesen Sie Regressions- und binäre Klassifizierungsdatensätze aus sklearn.datasets.

from sklearn import datasets
import numpy as np
import pandas as pd

#Datensatz für die Regression
boston = datasets.load_boston()
boston_X = pd.DataFrame(boston.data, columns=boston.feature_names)
boston_y = pd.Series(boston.target)

#Binar-Klassifizierungsdatensatz
cancer = datasets.load_breast_cancer()
cancer_X = pd.DataFrame(cancer.data, columns=cancer.feature_names)
cancer_y = pd.Series(cancer.target)

1-3. Modellierung

Um einen Bewertungsindex zu erhalten, wird dieser in einem Lehrbuch modelliert und der vorhergesagte Wert ausgegeben. Ich habe noch nicht einmal die EDA- oder Feature-Erstellung validiert, da es wirklich nur darum geht, einen Bewertungsindex zu erhalten. Ich fühle mich schuldig.

from sklearn.linear_model import LinearRegression, LogisticRegression

#Rückkehr
slr = LinearRegression()
slr.fit(boston_X, boston_y)
boston_y_pred = slr.predict(boston_X)

#Binäre Klassifizierung
lr = LogisticRegression(solver='liblinear')
lr.fit(cancer_X, cancer_y)
cancer_y_pred = lr.predict(cancer_X)
cancer_y_pred_prob = lr.predict_proba(cancer_X)[:, 1]

2. Bewertungsindex der Regressionsaufgabe

RMSE (Root Mean Squared Error)

\mathrm{RMSE}=\displaystyle\sqrt{\dfrac{1}{N}\sum_{i=1}^N(y_i-\hat{y}_i)^2}

Ich benutze es oft in der Praxis, weil ich intuitiv verstehen kann, wie sehr der vorhergesagte Wert vom wahren Wert abweicht. Obwohl sklearn eine wichtige Metrik ist, unterstützt es nur MSE. Ich wünschte, ich könnte es nach np.sqrt zurückgeben.

from sklearn.metrics import mean_squared_error

rmse = np.sqrt(mean_squared_error(boston_y, boston_y_pred))
print(rmse)

4.679191295697281

MAE (Mean Absolute Error) $ \mathrm{MAE}=\dfrac{1}{N}\displaystyle\sum_{i=1}^N|y_i-\hat{y}_i| $ Das nächste Team verwendete dies als Bewertungsindex. Ich habe es nie benutzt. Im Vergleich zu RMSE ist der Effekt von Ausreißern gering. Wenn RMSE durchschnittlich ist, ist MAE der Medianwert.

from sklearn.metrics import mean_absolute_error

mae = mean_absolute_error(boston_y, boston_y_pred)
print(mae)

3.2708628109003115

Entscheidungskoeffizient

    R^2=1-\dfrac{\sum_{i=1}^N(y_i-\hat{y}_i)^2}{\sum_{i=1}^N(y_i-\bar{y})^2}

Je näher es an 1 liegt, desto höher ist die Genauigkeit. Dies ist ein Index, der genau für das literarische System gilt. Deshalb habe ich es immer geliebt, aber als ich sah, dass es in der Praxis weh tat, vertraute ich ihm nicht wirklich. Da der Nenner des Bestimmungskoeffizienten diversifiziert ist, ist selbst ein technisches Modell relativ hoch, wenn die Daten eine große Variation aufweisen. Mit Blick auf das Referenzniveau ist es sicherer, den tatsächlichen Trefferzustand anhand von RMSE zu beurteilen.

from sklearn.metrics import r2_score

r2 = r2_score(boston_y, boston_y_pred)
print(r2)

0.7406426641094095

3. Bewertungsindex der binären Klassifizierungsaufgabe

Die binäre Klassifizierungsaufgabe wird separat behandelt, da es Fälle gibt, in denen das Klassifizierungsergebnis von positiven oder negativen Beispielen als vorhergesagter Wert verwendet wird, und Fälle, in denen die Wahrscheinlichkeit, positiv zu sein, als vorhergesagter Wert verwendet wird.

3-1. Wenn das Klassifizierungsergebnis als vorhergesagter Wert verwendet wird

Verwirrung Matrix

--TP (True Positive): Wenn der vorhergesagte Wert ein positives Beispiel ist und die Vorhersage korrekt ist --TN (True Negative): Wenn der vorhergesagte Wert ein negatives Beispiel ist und die Vorhersage korrekt ist --FP (False Positive): Wenn der vorhergesagte Wert ein positives Beispiel ist und die Vorhersage falsch ist --FN (False Negative): Wenn der vorhergesagte Wert ein negatives Beispiel ist und die Vorhersage falsch ist

Es ist nur eine Bilanz, aber ich denke, es ist die wichtigste. Angenommen, ein Virus, das nur 1 von 100 Personen infiziert, hat sich verbreitet und wird getestet. Wenn zu diesem Zeitpunkt alle negativ sind, scheint die Genauigkeit auf den ersten Blick 99% zu betragen. Sie müssen sich an die Verwirrungsmatrix erinnern, damit Sie nicht durch solche Tricks verwirrt werden. Ich verstehe jedoch nicht, warum es TP oder FN ist.

from sklearn.metrics import confusion_matrix

cm = confusion_matrix(cancer_y, cancer_y_pred)
tn, fp, fn, tp = cm.flatten()
print(cm)

[[198 14] [ 9 348]]

Genauigkeit (korrekte Antwortrate)

accuracy = \frac{TP+TN}{TP+TN+FP+FN}

Fehlerrate

error \; rate = 1-accuracy

Im vorherigen Beispiel wäre die korrekte Antwortrate 0,99, wenn alle negativ wären. Bei binären Klassifizierungsaufgaben ist leicht zu erkennen, dass nichts beginnt, ohne vorher zu prüfen, ob die Daten unausgewogen sind.

from sklearn.metrics import accuracy_score

accuracy = accuracy_score(cancer_y, cancer_y_pred)
print(accuracy)

0.9595782073813708

Präzision

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

erinnern

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

Präzision ist das Verhältnis des als positives Beispiel vorhergesagten wahren Werts, und Rückruf ist das Verhältnis des als positives Beispiel vorhergesagten wahren Wertes. Die beiden stehen in einer Kompromissbeziehung. Da Präzision die Rate von Fehlalarmen und Rückruf die Rate von Versehen ist, entscheiden Sie, welche Sie entsprechend dem Zweck priorisieren möchten. Das vorherige Beispiel für Virustests wird den Rückruf hervorheben, und Präzision wird im Marketingkontext wichtig sein.

from sklearn.metrics import precision_score, recall_score

precision = precision_score(cancer_y, cancer_y_pred)
recall = recall_score(cancer_y, cancer_y_pred)
print(precision)
print(recall)

0.9613259668508287 0.9747899159663865

F1-score $ F_1 = \dfrac{2}{\dfrac{1}{recall}+\dfrac{1}{precision}} $ Fβ-score $ F_\beta = \dfrac{(1+\beta^2)}{\dfrac{\beta^2}{recall}+\dfrac{1}{precision}} $ Der F1-Score ist ein harmonisierter Durchschnitt aus Präzision und Rückruf, und der Fβ-Score ist ein Index, der durch einen Koeffizienten β angepasst wird, der angibt, wie viel Wert auf den Rückruf gelegt wird. Es scheint einfach zu bedienen zu sein, weil es gut ausbalanciert ist, aber ich habe es in der Praxis nicht verwendet, daher kann ich es mir nicht vorstellen.

from sklearn.metrics import f1_score, fbeta_score

f1 = f1_score(cancer_y, cancer_y_pred)
fbeta = fbeta_score(cancer_y, cancer_y_pred, beta=0.5)
print(f1)
print(fbeta)

0.968011126564673 0.96398891966759

MCC (Matthews Correlation Coefficient) $ MCC = \dfrac{TP \times TN - FP \times FN}{\sqrt{(TP+FP)(TP+FN)(TN+FP)(TN+FN)}} $ Davon habe ich noch nie gehört. Es nimmt einen Wert von -1 bis 1 an und es scheint zu interpretieren, dass eine perfekte Vorhersage gemacht wird, wenn es 1 ist, eine zufällige Vorhersage, wenn es 0 ist, und eine völlig entgegengesetzte Vorhersage, wenn es -1 ist. Es ist einfach, auch unausgeglichene Daten richtig auszuwerten, daher möchte ich sie verwenden können.

from sklearn.metrics import matthews_corrcoef

mcc = matthews_corrcoef(cancer_y, cancer_y_pred)
print(mcc)

0.9132886202215396

3-2. Wenn die Wahrscheinlichkeit der vorhergesagte Wert ist

AUC (Area Under the ROC Curve) Der Bereich am unteren Rand der ROC-Kurve mit der falsch positiven Rate auf der horizontalen Achse und der wahr positiven Rate auf der vertikalen Achse. Ordnen Sie die Datensätze mit den höchsten vorhergesagten Werten in der Reihenfolge von links an und betrachten Sie sie als eine Darstellung, die sich tatsächlich nach oben bewegt, wenn es sich um ein positives Beispiel handelt, und horizontal, wenn es sich um ein negatives Beispiel handelt. Daher springt zum Zeitpunkt der perfekten Vorhersage die ROC-Gerade bis zur oberen linken Decke, und die AUC wird 1. Für zufällige Vorhersagen diagonal verfolgen. Der berühmte Gini-Koeffizient wird als "Gini = 2AUC -1" ausgedrückt und ist daher linear zur AUC.

import japanize_matplotlib
import matplotlib.pyplot as plt
from sklearn.metrics import roc_auc_score, roc_curve
%matplotlib inline

auc = roc_auc_score(cancer_y, cancer_y_pred_prob)
print(auc)

fpr, tpr, thresholds = roc_curve(cancer_y, cancer_y_pred_prob)
plt.plot(fpr, tpr, label='AUC={:.2f}'.format(auc))
plt.legend()
plt.xlabel('Falsch positive Rate')
plt.ylabel('Echte positive Rate')
plt.title('ROC-Kurve')
plt.show()

0.9946488029173934 hoge.png

logloss $ logloss = -\frac{1}{N} \sum_{i=1}^N(y_i {\log} p_i+(1-y_i){\log}(1-p_i)) $ Dies ist auch zusammen mit AUC berühmt. Wird auch als Kreuzentropie bezeichnet. Es wird das Protokoll der Wahrscheinlichkeit der Vorhersage des wahren Werts erstellt, und das Vorzeichen wird invertiert, sodass es besser ist, niedrig zu sein (wie es scheint). Die Idee ist, eine Strafe zu verhängen, wenn die Wahrscheinlichkeit, ein positives Beispiel zu sein, unterschätzt, aber positiv ist, oder wenn die Wahrscheinlichkeit, hoch zu sein, unterschätzt, aber negativ ist.

from sklearn.metrics import log_loss

logloss = log_loss(cancer_y, cancer_y_pred_prob)
print(logloss)

0.09214591499092101

Ich habe keine praktischen Erfahrungen mit der Klassifizierung und den Empfehlungen für mehrere Klassen, und es schien, als würde ich sie einfach kopieren, damit ich sie der nächsten Gelegenheit geben kann. Ich möchte eines Tages schreiben können.

Recommended Posts

Memorandum über Metriken für Regression und Binomialklassifikation
Unterschied zwischen Regression und Klassifikation
Klassifikation und Regression beim maschinellen Lernen
Über _ und __
Grundlegendes zur logistischen Regression (1) _ Informationen zu Gewinnchancen und logistischer Transformation
Memorandum über die Validierung
Über Klasse und Instanz
Ein Memorandum über Nan.
Über Cumprod und Cummax
Über Kreuzvalidierung und F-Wert