[PYTHON] Mémorandum sur les paramètres de régression et de classification binomiale

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)

1. Préparation

1-1. Environnement

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())

1-2. Ensemble de données

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)

1-3. Modélisation

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]

2. Indice d'évaluation de la tâche de régression

RMSE (erreur quadratique moyenne)

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

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) $ \mathrm{MAE}=\dfrac{1}{N}\displaystyle\sum_{i=1}^N|y_i-\hat{y}_i| $ L'équipe suivante l'a utilisé comme indice d'évaluation. Je ne l'ai jamais utilisé. Comparé à RMSE, l'effet des valeurs aberrantes est faible. Si RMSE est moyen, MAE est la valeur médiane.

from sklearn.metrics import mean_absolute_error

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

3.2708628109003115

Coefficient de décision

    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

3. Indice d'évaluation de la tâche de classification binaire

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.

3-1. Lorsque le résultat de la classification est utilisé comme valeur prédite

Matrice de confusion

--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]]

précision (taux de réponse correct)

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

taux d'erreur

error \; rate = 1-accuracy

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

précision

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

rappel

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

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 $ 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}} $ Le score F1 est une moyenne harmonisée de précision et de rappel, et le score Fβ est un indice ajusté par un coefficient β qui indique à quel point l'accent est mis sur le rappel. Il semble facile à utiliser car il est bien équilibré, mais je ne l'ai pas utilisé dans la pratique, donc je ne peux pas l'imaginer.

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)}} $ Je n'en ai jamais entendu parler. Il prend une valeur de -1 à 1, et il semble interpréter qu'une prédiction parfaite est faite quand il est 1, une prédiction aléatoire quand il est 0 et une prédiction complètement opposée quand il est -1. Il est facile d'évaluer correctement les données, même déséquilibrées, donc j'aimerais pouvoir les utiliser.

from sklearn.metrics import matthews_corrcoef

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

0.9132886202215396

3-2. Lorsque la probabilité est la valeur prédite

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 hoge.png

logloss $ logloss = -\frac{1}{N} \sum_{i=1}^N(y_i {\log} p_i+(1-y_i){\log}(1-p_i)) $ Ceci est également célèbre avec AUC. Aussi appelé entropie croisée. Il prend le log de la probabilité de prédire la vraie valeur, et le signe est inversé, il vaut donc mieux être faible (il semble) L'idée est de donner une pénalité lorsque la probabilité d'être un exemple positif est sous-estimée mais positive, ou lorsque la probabilité d'être élevé est sous-estimée mais négative.

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

Mémorandum sur les paramètres de régression et de classification binomiale
Différence entre régression et classification
Classification et régression dans l'apprentissage automatique
À propos de _ et __
Comprendre la régression logistique (1) _ À propos des cotes et de la transformation logistique
Mémorandum sur la validation
À propos de la classe et de l'instance
Un mémorandum sur Nan.
À propos de cumprod et cummax
À propos de la validation croisée et de la valeur F