J'oublierai trop l'indice d'évaluation de chaque tâche, je vais donc résumer le minimum de choses à retenir. Cet article traite des principales métriques de régression et de classification binomiale. Références: [Kaggle book](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 & mots-clés = 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 & APLS = ZW5jcnlwdGVkUXVhbGlmaWVyPUExTkhDNkExUTRFMzQ2JmVuY3J5cHRlZElkPUEwMzc3MjMyMzFUQ0g5SERIQ1BDSiZlbmNyeXB0ZWRBZElkPUFMT0hMWThLWFhJNDUmd2lkZ2V0TmFtZT1zcF9hdGYmYWN0aW9uPWNsaWNrUmVkaXJlY3QmZG9Ob3RMb2dDbGljaz10cnVl)
Le code de l'article a été confirmé pour fonctionner sur Windows-10, Python 3.7.3.
import platform
print(platform.platform())
print(platform.python_version())
Lisez les ensembles de données de régression et de classification binaire à partir de sklearn.datasets.
from sklearn import datasets
import numpy as np
import pandas as pd
#Ensemble de données pour la régression
boston = datasets.load_boston()
boston_X = pd.DataFrame(boston.data, columns=boston.feature_names)
boston_y = pd.Series(boston.target)
#Jeu de données de classification binar
cancer = datasets.load_breast_cancer()
cancer_X = pd.DataFrame(cancer.data, columns=cancer.feature_names)
cancer_y = pd.Series(cancer.target)
Afin d'obtenir un indice d'évaluation, il est modélisé dans un manuel et la valeur prédite est sortie. Je n'ai même pas validé l'EDA ou la création de fonctionnalités parce que c'est vraiment juste pour obtenir un index d'évaluation. Je me sens coupable.
from sklearn.linear_model import LinearRegression, LogisticRegression
#Revenir
slr = LinearRegression()
slr.fit(boston_X, boston_y)
boston_y_pred = slr.predict(boston_X)
#Classification binaire
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]
Je l'utilise souvent dans la pratique car je peux comprendre intuitivement à quel point la valeur prédite s'écarte de la valeur réelle. Bien qu'il s'agisse d'une métrique majeure, sklearn ne prend en charge que MSE. J'aurais aimé pouvoir le retourner après np.sqrt.
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}
Plus il est proche de 1, plus la précision est élevée, qui est un indice qui correspond exactement au système littéraire. C'est pourquoi j'aimais ça, mais une fois que je l'ai vu faire mal en pratique, je ne lui faisais pas vraiment confiance. Puisque le dénominateur du coefficient de détermination est distribué, si les données ont une grande variation, même un modèle technicien sera relativement élevé. En regardant le niveau de référence, il est plus sûr de juger la condition de succès réelle par RMSE.
from sklearn.metrics import r2_score
r2 = r2_score(boston_y, boston_y_pred)
print(r2)
0.7406426641094095
La tâche de classification binaire est traitée séparément car il existe des cas où le résultat de classification d'exemples positifs ou négatifs est utilisé comme valeur prédite et des cas où la probabilité d'être positif est utilisée comme valeur prédite.
--TP (True Positive): lorsque la valeur prédite est un exemple positif et que la prédiction est correcte --TN (True Negative): lorsque la valeur prédite est un exemple négatif et que la prédiction est correcte --FP (False Positive): lorsque la valeur prédite est un exemple positif et que la prédiction est incorrecte --FN (False Negative): lorsque la valeur prédite est un exemple négatif et que la prédiction est incorrecte
C'est juste un décompte, mais je pense que c'est le plus important. Par exemple, disons qu'un virus qui infecte seulement 1 personne sur 100 s'est propagé, nous l'avons donc testé. A ce moment, si tout le monde est de toute façon négatif, la précision semble être de 99% à première vue .... Il faut se souvenir fermement de la matrice de confusion pour ne pas être dérouté par de telles astuces. Cependant, je ne comprends pas pourquoi c'est TP ou FN.
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]]
Dans l'exemple précédent, le taux de réponse correct serait de 0,99 si tout le monde était négatif. Pour les tâches de classification binaire, il est facile de voir que rien ne commence sans d'abord vérifier si les données sont déséquilibrées.
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(cancer_y, cancer_y_pred)
print(accuracy)
0.9595782073813708
la précision est le rapport de la valeur vraie prédite comme étant l'exemple positif, et le rappel est le rapport de la valeur vraie prédite comme étant l'exemple positif. Les deux sont dans une relation de compromis. Étant donné que la précision est le taux de faux positifs et que le rappel est le taux d'oubli, décidez lequel prioriser en fonction de l'objectif. L'exemple des tests de virus précédents mettra l'accent sur le rappel et la précision sera importante dans le contexte du marketing.
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) La zone en bas de la courbe ROC avec le taux de faux positifs tracé sur l'axe horizontal et le taux de vrai positif tracé sur l'axe vertical. Organisez les enregistrements avec les valeurs prédites les plus élevées dans l'ordre à partir de la gauche, et considérez-le comme un tracé qui monte réellement s'il s'agit d'un exemple positif et horizontalement s'il s'agit d'un exemple négatif. Par conséquent, au moment de la prédiction parfaite, la ligne droite ROC saute jusqu'au plafond supérieur gauche et l'AUC devient 1. Pour les prédictions aléatoires, tracez en diagonale. Le fameux coefficient de Gini est exprimé par «Gini = 2AUC -1», il est donc linéaire avec 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('Taux de faux positifs')
plt.ylabel('Vrai taux positif')
plt.title('Courbe ROC')
plt.show()
0.9946488029173934
logloss
from sklearn.metrics import log_loss
logloss = log_loss(cancer_y, cancer_y_pred_prob)
print(logloss)
0.09214591499092101
Je n'ai aucune expérience pratique de la classification et des recommandations multi-classes, et il me semblait que je ne ferais que les copier, alors je la donnerai à la prochaine occasion. Je veux pouvoir écrire un jour.
Recommended Posts