[PYTHON] [Scikit-learn] J'ai joué avec la courbe ROC

0. Introduction

En apprentissage automatique, la ** courbe ROC ** et la ** AUC (Area Under the Curve) de la courbe ROC sont utilisées comme indicateurs de la qualité du classificateur lorsque deux classes sont classées à l'aide d'un certain classificateur. Area) ** est utilisé.

Grosso modo La courbe ROC montre "combien les deux distributions pourraient être séparées en utilisant le classificateur". Vous pouvez également comparer plusieurs courbes ROC en utilisant le montant AUC.

Selon le modèle utilisé pour l'entraînement, certaines courbes ROC peuvent être dessinées et d'autres non. Un modèle dans lequel la sortie (valeur de retour) est donnée avec une probabilité lors de l'utilisation de model.predict () etc. peut dessiner une courbe ROC, mais un modèle dans lequel la sortie est binaire ne peut pas dessiner une courbe ROC.

Cette fois, je vais jouer avec cette courbe ROC en utilisant scicit-learn.

1. Essayez de préparer les données pour le moment

Comme mentionné au début, la courbe ROC ne peut être dessinée que si la sortie est probabiliste, nous supposons donc une telle sortie. Ensuite, vous aurez y_true et y_pred comme ceux ci-dessous.

In[1]


%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn import metrics

In[2]


y_true = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
          1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

y_pred = [0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.5, 0.65, 0.7,
         0.35, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.9]

df = pd.DataFrame({'y_true':y_true, 'y_pred':y_pred})
df

image.png

Le bloc de données ressemble à ce qui précède.

Visualisons la distribution de ceci.

In[3]


x0 = df[df['y_true']==0]['y_pred']
x1 = df[df['y_true']==1]['y_pred']

fig = plt.figure(figsize=(6,5)) #
ax = fig.add_subplot(1, 1, 1)
ax.hist([x0, x1], bins=10, stacked=True)

plt.xticks(np.arange(0, 1.1, 0.1), fontsize = 13) #Les étiquettes d'axe sont plus faciles à écrire avec arange
plt.yticks(np.arange(0, 6, 1), fontsize = 13)

plt.ylim(0, 4)
plt.show()

image.png

C'est comme ça. C'est un exemple de distribution partiellement quantifiée, comme c'est souvent le cas.

2. Dessinez une courbe ROC

ROC La documentation de roc_curve () est ici (https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_curve.html). Il existe trois valeurs de retour.

  1. fpr (taux de faux positifs)
  2. tpr (taux vraiment positif)
  3. thres (seuils)

Si vous décidez d'un seuil et déterminez s'il est positif ou négatif en fonction de celui-ci, vous pouvez trouver le taux de faux positifs et le taux de vrais positifs. Les trois valeurs de retour ci-dessus en sont une liste.

AUC auc représente la zone courbe de la courbe ROC obtenue ci-dessus. Renvoie une valeur comprise entre 0 et 1.

In[4]


fpr, tpr, thres = metrics.roc_curve(y_true, y_pred)
auc = metrics.auc(fpr, tpr)
print('auc:', auc)

Out[4]


auc: 0.8400000000000001

In[5]


plt.figure(figsize = (5, 5)) #Comment donner le rapport de taille pour un seul graphique
plt.plot(fpr, tpr, marker='o')
plt.xlabel('FPR: False Positive Rete', fontsize = 13)
plt.ylabel('TPR: True Positive Rete', fontsize = 13)
plt.grid()
plt.show()

image.png

Vous pouvez maintenant dessiner la courbe ROC.

3. Essayez différentes distributions

Maintenant, dessinons une courbe ROC avec différentes distributions.

3.1. Distribution entièrement séparable (AUC = 1,0)

Dessinons une courbe ROC avec une distribution qui peut être complètement séparée en définissant un certain seuil.

In[6]


y_pred = [0, 0.15, 0.2, 0.2, 0.25,
          0.3, 0.35, 0.4, 0.4, 0.45,
          0.5, 0.55, 0.55, 0.65, 0.7,
          0.75, 0.8, 0.85, 0.9, 0.95]
          
y_true = [0, 0, 0, 0, 0,
          0, 0, 0, 0, 0,
          1, 1, 1, 1, 1,
          1, 1, 1, 1, 1]

df = pd.DataFrame({'y_true':y_true, 'y_pred':y_pred})
x0 = df[df['y_true']==0]['y_pred']
x1 = df[df['y_true']==1]['y_pred']

In[7]


#Calculez AUC etc.
fpr, tpr, thres = metrics.roc_curve(y_true, y_pred)
auc = metrics.auc(fpr, tpr)

#Monter(fig)Création
fig = plt.figure(figsize = (12, 4))
fig.suptitle(' AUC = ' + str(auc), fontsize = 16)
fig.subplots_adjust(wspace=0.5, hspace=0.6) #Ajuster l'espacement entre les graphiques

#Graphique à gauche(ax1)Création
ax1 = fig.add_subplot(1, 2, 1)
ax1.hist([x0, x1], bins=10, stacked = True)
ax1.set_xlim(0, 1)
ax1.set_ylim(0, 5)

#Graphique à droite(ax2)Création
ax2 = fig.add_subplot(1, 2, 2)
ax2.plot(fpr, tpr, marker='o')
ax2.set_xlabel('FPR: False Positive Rete', fontsize = 13)
ax2.set_ylabel('TPR: True Positive Rete', fontsize = 13)
ax2.set_aspect('equal')
ax2.grid()

plt.show();

#Monter
## fig, ax = plt.subplots(2, 2, figsize=(6, 4))
## ...

#la gauche
## ax[0].set_
## ...

#Côté droit
## ax[1].set_
## ...  #Mais possible

image.png

C'est devenu une telle courbe ROC.

3.2. Distribution très difficile à séparer (ASC ≒ 0,5)

Ensuite, dessinons la courbe ROC de la distribution difficile à séparer.

In[8]


y_pred = [0, 0.15, 0.2, 0.2, 0.25,
          0.3, 0.35, 0.4, 0.4, 0.45,
          0.5, 0.55, 0.55, 0.65, 0.7,
          0.75, 0.8, 0.85, 0.9, 0.95]
          
y_true = [0, 1, 0, 1, 0,
          1, 0, 1, 0, 1,
          0, 1, 0, 1, 0,
          1, 0, 1, 0, 1]

df = pd.DataFrame({'y_true':y_true, 'y_pred':y_pred})
x0 = df[df['y_true']==0]['y_pred']
x1 = df[df['y_true']==1]['y_pred']

In[9]


#Calculez AUC etc.
fpr, tpr, thres = metrics.roc_curve(y_true, y_pred)
auc = metrics.auc(fpr, tpr)

#Monter(fig)Création
fig = plt.figure(figsize = (12, 4))
fig.suptitle(' AUC = ' + str(auc), fontsize = 16)
fig.subplots_adjust(wspace=0.5, hspace=0.6) #Ajuster l'espacement entre les graphiques

#Graphique à gauche(ax1)Création
ax1 = fig.add_subplot(1, 2, 1)
ax1.hist([x0, x1], bins=10, stacked = True)
ax1.set_xlim(0, 1)
ax1.set_ylim(0, 5)

#Graphique à droite(ax2)Création
ax2 = fig.add_subplot(1, 2, 2)
ax2.plot(fpr, tpr, marker='o')
ax2.set_xlabel('FPR: False Positive Rete', fontsize = 13)
ax2.set_ylabel('TPR: True Positive Rete', fontsize = 13)
ax2.set_aspect('equal')
ax2.grid()

plt.show();

image.png

C'est devenu une telle courbe ROC.

4. Examinez la valeur de retour de la fonction roc_curve ()

Examinons le contenu de la fonction roc_curve (). Vous pouvez voir qu'il s'agit de seuils fpr, tpr, comme expliqué précédemment. Le 0e seuil s est 1,95, qui est le premier seuil plus 1 et semble être conçu pour inclure une paire où fpr et tpr sont tous deux égaux à 0.

In[10]


print(fpr.shape, tpr.shape, thres.shape)
ROC_df = pd.DataFrame({'fpr':fpr, 'tpr':tpr, 'thresholds':thres})
ROC_df

image.png

Dans le premier exemple, examinons l'argument drop_intermeditate. C'est False par défaut, mais vous pouvez le définir sur True pour supprimer les points qui ne sont pas liés à la forme de la courbe ROC.

In[11]


y_pred = [0, 0.15, 0.2, 0.2, 0.25,
          0.3, 0.35, 0.4, 0.4, 0.45,
          0.5, 0.55, 0.55, 0.65, 0.7,
          0.75, 0.8, 0.85, 0.9, 0.95]
          
y_true = [0, 0, 0, 0, 0,
          0, 0, 0, 0, 0,
          1, 1, 1, 1, 1,
          1, 1, 1, 1, 1]

fpr, tpr, thres = metrics.roc_curve(y_true, y_pred, drop_intermediate =True)
print(fpr.shape, tpr.shape, thres.shape)

Out[11]


(10,) (10,) (10,)

Par conséquent, le nombre réel de points est également réduit.

5. Résumé

Cette fois, j'ai résumé la courbe ROC lors de la visualisation du résultat de l'apprentissage automatique.

Nous recherchons des questions et des articles!

Recommended Posts

[Scikit-learn] J'ai joué avec la courbe ROC
J'ai joué avec wordcloud!
Je voulais jouer avec la courbe de Bézier
J'ai joué avec Floydhub pour le moment
J'ai aimé le tweet avec python. ..
J'ai joué avec PyQt5 et Python3
J'ai joué avec Mecab (analyse morphologique)!
J'ai essayé la validation croisée basée sur le résultat de la recherche de grille avec scikit-learn
[Introduction à StyleGAN] J'ai joué avec "The Life of a Man" ♬
[Introduction à sinGAN-Tensorflow] J'ai joué avec la super-résolution "Challenge Big Imayuyu" ♬
L'analyse de clustering la plus basique avec scikit-learn
J'ai joué avec DragonRuby GTK (Game Toolkit)
Affinons les hyper paramètres du modèle avec scikit-learn!
[Introduction à Pytorch] J'ai joué avec sinGAN ♬
J'ai essayé de jouer avec l'image avec Pillow
Je ne peux pas installer le package avec pip.
J'ai essayé la reconnaissance manuscrite des caractères des runes avec scikit-learn
J'ai essayé de "lisser" l'image avec Python + OpenCV
Isomap avec Scikit-learn
J'ai essayé de "différencier" l'image avec Python + OpenCV
Tracer la courbe ROC pour la classification binaire avec Matplotlib
J'ai essayé de sauvegarder les données avec discorde
[Python] J'ai joué avec le traitement du langage naturel ~ transformers ~
DBSCAN avec scikit-learn
J'ai essayé de "binariser" l'image avec Python + OpenCV
Clustering avec scikit-learn (1)
Prédisez le deuxième tour de l'été 2016 avec scikit-learn
Clustering avec scikit-learn (2)
PCA avec Scikit-learn
J'ai joué avec Diamond, un outil de collecte de métriques
kmeans ++ avec scikit-learn
J'ai essayé de jouer avec la calculatrice avec tkinter
Lorsque j'explore la webapi qui apparaît pendant le rendu, elle a été lue avec CORS
Prise en compte de la différence entre la courbe ROC et la courbe PR
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de résoudre Soma Cube avec python
Je veux hériter de l'arrière avec la classe de données python
J'ai mesuré les performances d'un million de documents avec mongoDB
Un mémo que j'ai touché au magasin de données avec python
Résolution du problème de l'iris avec scikit-learn ver1.0 (régression logistique)
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai essayé de frapper l'API avec le client python d'echonest
Je t'ai écrit pour regarder le signal avec Go
Validation croisée avec scikit-learn
SVM multi-classes avec scikit-learn
Clustering avec scikit-learn + DBSCAN
Apprentissage Scikit-Learn avec la chimioinfomatique
DBSCAN (clustering) avec scikit-learn
J'ai compté les grains
J'ai appris les bases de l'apprentissage intensif et joué avec Cart Pole (implémentation simple de Q Learning)
Installez scikit.learn avec pip
Calculer tf-idf avec scikit-learn
J'ai essayé de trouver l'entropie de l'image avec python
J'ai remplacé le livre de recettes Windows PowerShell par un script python.
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé d'analyser les émotions de tout le roman "Weather Child" ☔️
J'étais accro au débogueur Python pdb pendant 2 minutes
J'ai écrit le code pour la génération de phrases japonaises avec DeZero