Validation croisée imbriquée pour la sélection de modèle

Machine LearningMachine LearningBeginner
Pratiquer maintenant

This tutorial is from open-source community. Access the source code

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

La validation croisée imbriquée (nested cross-validation) est une technique utilisée pour estimer l'erreur de généralisation d'un modèle et de ses hyperparamètres. Elle est particulièrement utile lors du choix entre différents modèles ou lorsque les hyperparamètres doivent être optimisés. Dans ce tutoriel, nous comparerons la validation croisée non imbriquée et la validation croisée imbriquée sur un modèle de classifieur à vecteurs de support (support vector classifier) en utilisant le jeu de données iris. Nous visualiserons également la différence de performance entre les deux méthodes.

Conseils pour la machine virtuelle (VM)

Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer sur l'onglet Notebook afin d'accéder à Jupyter Notebook pour pratiquer.

Parfois, vous devrez peut-être attendre quelques secondes que Jupyter Notebook ait terminé de charger. La validation des opérations ne peut pas être automatisée en raison des limitations de Jupyter Notebook.

Si vous rencontrez des problèmes lors de votre apprentissage, n'hésitez pas à poser vos questions à Labby. Donnez votre feedback après la session, et nous résoudrons rapidement le problème pour vous.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/svm("Support Vector Machines") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/svm -.-> lab-49227{{"Validation croisée imbriquée pour la sélection de modèle"}} sklearn/model_selection -.-> lab-49227{{"Validation croisée imbriquée pour la sélection de modèle"}} sklearn/datasets -.-> lab-49227{{"Validation croisée imbriquée pour la sélection de modèle"}} ml/sklearn -.-> lab-49227{{"Validation croisée imbriquée pour la sélection de modèle"}} end

Charger le jeu de données

La première étape consiste à charger le jeu de données iris à partir de scikit-learn.

from sklearn.datasets import load_iris

## Charger le jeu de données
iris = load_iris()
X_iris = iris.data
y_iris = iris.target

Définir les hyperparamètres

Ensuite, nous définissons les hyperparamètres à optimiser pour le classifieur à vecteurs de support (support vector classifier). Dans ce cas, nous optimisons le paramètre de coût C et le coefficient du noyau gamma.

## Set up possible values of parameters to optimize over
p_grid = {"C": [1, 10, 100], "gamma": [0.01, 0.1]}

Définir le modèle

Nous utilisons un classifieur à vecteurs de support (Support Vector Classifier) avec un noyau de fonction de base radiale (radial basis function kernel).

from sklearn.svm import SVC

## We will use a Support Vector Classifier with "rbf" kernel
svm = SVC(kernel="rbf")

Validation croisée non imbriquée (Non-Nested Cross-Validation)

Nous utilisons la validation croisée non imbriquée pour ajuster les hyperparamètres et évaluer les performances du modèle. La fonction GridSearchCV effectue une recherche exhaustive sur les valeurs de paramètres spécifiées pour un estimateur. Nous utilisons une validation croisée en 4 plis (4-fold cross-validation).

from sklearn.model_selection import GridSearchCV

## Non_nested parameter search and scoring
clf = GridSearchCV(estimator=svm, param_grid=p_grid, cv=4)
clf.fit(X_iris, y_iris)
non_nested_score = clf.best_score_

Validation croisée imbriquée (Nested Cross-Validation)

Nous utilisons la validation croisée imbriquée pour estimer l'erreur de généralisation du modèle et de ses hyperparamètres. Dans la boucle interne, nous effectuons une recherche sur grille (grid search) pour trouver les meilleurs hyperparamètres pour chaque ensemble d'entraînement. Dans la boucle externe, nous évaluons les performances du modèle sur l'ensemble de test.

from sklearn.model_selection import KFold, cross_val_score

## Number of random trials
NUM_TRIALS = 30

## Arrays to store scores
non_nested_scores = np.zeros(NUM_TRIALS)
nested_scores = np.zeros(NUM_TRIALS)

## Loop for each trial
for i in range(NUM_TRIALS):
    ## Choose cross-validation techniques for the inner and outer loops,
    ## independently of the dataset.
    inner_cv = KFold(n_splits=4, shuffle=True, random_state=i)
    outer_cv = KFold(n_splits=4, shuffle=True, random_state=i)

    ## Nested CV with parameter optimization
    clf = GridSearchCV(estimator=svm, param_grid=p_grid, cv=inner_cv)
    nested_score = cross_val_score(clf, X=X_iris, y=y_iris, cv=outer_cv)
    nested_scores[i] = nested_score.mean()

score_difference = non_nested_score - nested_scores.mean()

Visualiser les résultats

Nous visualisons les résultats de la validation croisée non imbriquée et imbriquée à l'aide d'un diagramme à barres.

from matplotlib import pyplot as plt

## Plot bar chart of the difference.
plt.bar(["Non-Nested", "Nested"], [non_nested_score, nested_scores.mean()])
plt.ylim([0.9, 1.0])
plt.ylabel("Score")
plt.title("Non-Nested and Nested Cross-Validation Scores")
plt.show()

Résumé

La validation croisée imbriquée (nested cross-validation) est une technique puissante pour estimer l'erreur de généralisation d'un modèle et de ses hyperparamètres. Elle peut aider à prévenir le surapprentissage (overfitting) et à s'assurer que le modèle fonctionne bien sur de nouvelles données. Dans ce tutoriel, nous avons comparé la validation croisée non imbriquée et imbriquée sur un modèle de classifieur à vecteurs de support (support vector classifier) en utilisant le jeu de données iris. Nous avons visualisé la différence de performance entre les deux méthodes à l'aide d'un diagramme à barres.