Introduction
En apprentissage automatique, nous évaluons souvent les performances d'un modèle de classification en utilisant un score. Cependant, nous devons également tester la significativité du score pour nous assurer que les performances du modèle ne sont pas dues au hasard. C'est là que le test de permutation du score s'avère pratique. Il génère une distribution nulle en calculant la précision du classifieur sur 1000 permutations différentes du jeu de données. Une valeur p empirique est ensuite calculée comme le pourcentage de permutations pour lesquelles le score obtenu est supérieur au score obtenu en utilisant les données originales. Dans ce laboratoire, nous utiliserons la fonction permutation_test_score de sklearn.model_selection pour évaluer la significativité d'un score validé croisé en utilisant des permutations.
Conseils sur la machine virtuelle
Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Notebook pour accéder à Jupyter Notebook pour la pratique.
Parfois, vous devrez peut-être attendre quelques secondes pour que Jupyter Notebook ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limites de Jupyter Notebook.
Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez votre feedback après la session, et nous résoudrons rapidement le problème pour vous.
Charger le jeu de données et générer des fonctionnalités aléatoires
Nous utiliserons le jeu de données iris, qui est composé de mesures prises sur 3 types d'iris, et générer des données de fonctionnalités aléatoires (c'est-à-dire 20 fonctionnalités), non corrélées avec les étiquettes de classe dans le jeu de données iris.
from sklearn.datasets import load_iris
import numpy as np
iris = load_iris()
X = iris.data
y = iris.target
n_uncorrelated_features = 20
rng = np.random.RandomState(seed=0)
X_rand = rng.normal(size=(X.shape[0], n_uncorrelated_features))
Test de permutation du score sur les données originales
Ensuite, nous calculons le permutation_test_score en utilisant le jeu de données iris original et le classifieur SVC avec le score accuracy pour évaluer le modèle à chaque itération.
from sklearn.svm import SVC
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import permutation_test_score
clf = SVC(kernel="linear", random_state=7)
cv = StratifiedKFold(2, shuffle=True, random_state=0)
score_iris, perm_scores_iris, pvalue_iris = permutation_test_score(
clf, X, y, scoring="accuracy", cv=cv, n_permutations=1000
)
Test de permutation du score sur les données aléatoires
Ensuite, nous calculons le permutation_test_score en utilisant les fonctionnalités générées aléatoirement et les étiquettes iris, qui ne devraient pas avoir de dépendance entre les fonctionnalités et les étiquettes.
score_rand, perm_scores_rand, pvalue_rand = permutation_test_score(
clf, X_rand, y, scoring="accuracy", cv=cv, n_permutations=1000
)
Tracer les résultats
Nous traçons un histogramme des scores de permutation (la distribution nulle) pour le jeu de données iris original et les données aléatorisées. Nous indiquons également le score obtenu par le classifieur sur les données originales en utilisant une ligne rouge. La valeur p est affichée sur chaque graphique.
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
## Données originales
ax.hist(perm_scores_iris, bins=20, density=True)
ax.axvline(score_iris, ls="--", color="r")
score_label = f"Score sur les données originales : {score_iris:.2f}\n(p-valeur : {pvalue_iris:.3f})"
ax.text(0.7, 10, score_label, fontsize=12)
ax.set_xlabel("Score de précision")
_ = ax.set_ylabel("Densité de probabilité")
plt.show()
fig, ax = plt.subplots()
## Données aléatoires
ax.hist(perm_scores_rand, bins=20, density=True)
ax.set_xlim(0.13)
ax.axvline(score_rand, ls="--", color="r")
score_label = f"Score sur les données originales : {score_rand:.2f}\n(p-valeur : {pvalue_rand:.3f})"
ax.text(0.14, 7.5, score_label, fontsize=12)
ax.set_xlabel("Score de précision")
ax.set_ylabel("Densité de probabilité")
plt.show()
Sommaire
Dans ce laboratoire, nous avons appris à utiliser la fonction permutation_test_score de sklearn.model_selection pour évaluer la signification d'un score validé croisé en utilisant des permutations. Nous avons généré une distribution nulle en calculant la précision du classifieur sur 1000 permutations différentes du jeu de données, et avons calculé une valeur p empirique comme le pourcentage de permutations pour lesquelles le score obtenu est supérieur au score obtenu en utilisant les données originales. Nous avons également tracé les résultats pour visualiser la distribution nulle et le score obtenu sur les données originales.