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)
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())
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)
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]
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)
from sklearn.metrics import mean_absolute_error
mae = mean_absolute_error(boston_y, boston_y_pred)
print(mae)
3.2708628109003115
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
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.
--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]]
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 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
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)
from sklearn.metrics import matthews_corrcoef
mcc = matthews_corrcoef(cancer_y, cancer_y_pred)
print(mcc)
0.9132886202215396
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
logloss
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