Équilibrer la complexité du modèle et le score de validation croisée

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

Dans ce laboratoire, nous allons apprendre à équilibrer la complexité du modèle et le score de validation croisée en trouvant une précision correcte à l'intérieur de 1 écart-type du meilleur score de précision tout en minimisant le nombre de composants PCA. Nous utiliserons le jeu de données digits de scikit-learn et un pipeline composé de PCA et de LinearSVC.

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 limitations 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églerons rapidement le problème pour vous.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/DataPreprocessingandFeatureEngineeringGroup(["Data Preprocessing and Feature Engineering"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn(("Sklearn")) -.-> sklearn/AdvancedDataAnalysisandDimensionalityReductionGroup(["Advanced Data Analysis and Dimensionality Reduction"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/svm("Support Vector Machines") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/pipeline("Pipeline") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/AdvancedDataAnalysisandDimensionalityReductionGroup -.-> sklearn/decomposition("Matrix Decomposition") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/svm -.-> lab-49156{{"Équilibrer la complexité du modèle et le score de validation croisée"}} sklearn/pipeline -.-> lab-49156{{"Équilibrer la complexité du modèle et le score de validation croisée"}} sklearn/model_selection -.-> lab-49156{{"Équilibrer la complexité du modèle et le score de validation croisée"}} sklearn/decomposition -.-> lab-49156{{"Équilibrer la complexité du modèle et le score de validation croisée"}} sklearn/datasets -.-> lab-49156{{"Équilibrer la complexité du modèle et le score de validation croisée"}} ml/sklearn -.-> lab-49156{{"Équilibrer la complexité du modèle et le score de validation croisée"}} end

Importation des bibliothèques

Nous allons commencer par importer les bibliothèques nécessaires pour ce laboratoire.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.svm import LinearSVC

Définition de fonctions

Nous allons définir deux fonctions qui seront utilisées plus tard dans le laboratoire.

def lower_bound(cv_results):
    """
    Calculer la borne inférieure à l'intérieur d'un écart-type
    du meilleur `mean_test_scores`.

    Paramètres
    ----------
    cv_results : dict de ndarrays numpy(masked)
        Voir l'attribut cv_results_ de `GridSearchCV`

    Retours
    -------
    float
        Borne inférieure à l'intérieur d'un écart-type du
        meilleur `mean_test_score`.
    """
    best_score_idx = np.argmax(cv_results["mean_test_score"])

    return (
        cv_results["mean_test_score"][best_score_idx]
        - cv_results["std_test_score"][best_score_idx]
    )


def best_low_complexity(cv_results):
    """
    Équilibrer la complexité du modèle avec le score de validation croisée.

    Paramètres
    ----------
    cv_results : dict de ndarrays numpy(masked)
        Voir l'attribut cv_results_ de `GridSearchCV`.

    Retour
    ------
    int
        Index d'un modèle qui a le nombre minimum de composants PCA
        tout en ayant son score de test à l'intérieur d'un écart-type du meilleur
        `mean_test_score`.
    """
    threshold = lower_bound(cv_results)
    candidate_idx = np.flatnonzero(cv_results["mean_test_score"] >= threshold)
    best_idx = candidate_idx[
        cv_results["param_reduce_dim__n_components"][candidate_idx].argmin()
    ]
    return best_idx

Charger les données et définir le pipeline

Nous allons charger le jeu de données digits de scikit-learn et définir un pipeline composé de PCA et de LinearSVC.

pipe = Pipeline(
    [
        ("reduce_dim", PCA(random_state=42)),
        ("classify", LinearSVC(random_state=42, C=0.01, dual="auto")),
    ]
)

X, y = load_digits(return_X_y=True)

Définir les paramètres pour GridSearchCV

Nous allons définir les paramètres pour GridSearchCV.

param_grid = {"reduce_dim__n_components": [6, 8, 10, 12, 14]}

Définir l'objet GridSearchCV

Nous allons définir l'objet GridSearchCV et ajuster le modèle.

grid = GridSearchCV(
    pipe,
    cv=10,
    n_jobs=1,
    param_grid=param_grid,
    scoring="accuracy",
    refit=best_low_complexity,
)

grid.fit(X, y)

Visualiser les résultats

Nous allons visualiser les résultats en traçant la précision en fonction du nombre de composants PCA.

n_components = grid.cv_results_["param_reduce_dim__n_components"]
test_scores = grid.cv_results_["mean_test_score"]

plt.figure()
plt.bar(n_components, test_scores, width=1.3, color="b")

lower = lower_bound(grid.cv_results_)
plt.axhline(np.max(test_scores), linestyle="--", color="y", label="Meilleur score")
plt.axhline(lower, linestyle="--", color=".5", label="Meilleur score - 1 écart-type")

plt.title("Équilibrer la complexité du modèle et le score de validation croisée")
plt.xlabel("Nombre de composants PCA utilisés")
plt.ylabel("Précision de classification des chiffres")
plt.xticks(n_components.tolist())
plt.ylim((0, 1.0))
plt.legend(loc="upper left")

best_index_ = grid.best_index_

print("Le best_index_ est %d" % best_index_)
print("Le nombre de composants PCA sélectionnés est %d" % n_components[best_index_])
print(
    "Le score de précision correspondant est %.2f"
    % grid.cv_results_["mean_test_score"][best_index_]
)
plt.show()

Sommaire

Dans ce laboratoire, nous avons appris à équilibrer la complexité du modèle et le score de validation croisée en utilisant la PCA et la LinearSVC. Nous avons utilisé GridSearchCV pour trouver le meilleur nombre de composants PCA tout en maximisant le score de précision dans un écart-type du meilleur score. Nous avons également visualisé les résultats pour mieux comprendre le compromis entre la complexité du modèle et la précision.