Tracer la classification NCA

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

Ce laboratoire montrera comment comparer la classification par plus proches voisins avec et sans Analyse des Composantes du Voisinage (NCA). Nous tracerons les limites de décision de classe données par un classifieur des plus proches voisins lorsqu'on utilise la distance euclidienne sur les caractéristiques d'origine, par rapport à l'utilisation de la distance euclidienne après la transformation apprise par l'Analyse des Composantes du Voisinage. Ce dernier vise à trouver une transformation linéaire qui maximise la précision de classification par plus proches voisins (stochastique) sur l'ensemble d'entraînement. Nous utiliserons le jeu de données Iris qui contient 3 classes de 50 instances chacune.

Conseils sur la VM

Une fois le démarrage de la VM terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Carnet de notes pour accéder au carnet Jupyter pour la pratique.

Parfois, vous devrez attendre quelques secondes pour que le carnet Jupyter ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limites du carnet Jupyter.

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/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/DataPreprocessingandFeatureEngineeringGroup(["Data Preprocessing and Feature Engineering"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/neighbors("Nearest Neighbors") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/preprocessing("Preprocessing and Normalization") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/pipeline("Pipeline") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/inspection("Inspection") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/neighbors -.-> lab-49223{{"Tracer la classification NCA"}} sklearn/preprocessing -.-> lab-49223{{"Tracer la classification NCA"}} sklearn/pipeline -.-> lab-49223{{"Tracer la classification NCA"}} sklearn/model_selection -.-> lab-49223{{"Tracer la classification NCA"}} sklearn/inspection -.-> lab-49223{{"Tracer la classification NCA"}} ml/sklearn -.-> lab-49223{{"Tracer la classification NCA"}} end

Importation des bibliothèques

Nous commencerons par importer les bibliothèques nécessaires. Nous utiliserons scikit-learn pour effectuer la classification par plus proches voisins et l'analyse NCA. Nous utiliserons matplotlib pour tracer les limites de décision de classe.

import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier, NeighborhoodComponentsAnalysis
from sklearn.pipeline import Pipeline
from sklearn.inspection import DecisionBoundaryDisplay

Charger et préparer les données

Ensuite, nous allons charger et préparer les données. Nous chargerons le jeu de données Iris à l'aide de scikit-learn et ne sélectionnerons que deux caractéristiques. Nous diviserons ensuite les données en un ensemble d'entraînement et un ensemble de test.

n_neighbors = 1

dataset = datasets.load_iris()
X, y = dataset.data, dataset.target

## we only take two features. We could avoid this ugly
## slicing by using a two-dim dataset
X = X[:, [0, 2]]

X_train, X_test, y_train, y_test = train_test_split(
    X, y, stratify=y, test_size=0.7, random_state=42
)

Créer des cartes de couleurs

Nous allons maintenant créer des cartes de couleurs pour tracer les limites de décision de classe. Nous utiliserons des couleurs claires pour l'arrière-plan et des couleurs vives pour les couleurs des classes.

h = 0.05  ## pas dans la grille

## Créer des cartes de couleurs
cmap_light = ListedColormap(["#FFAAAA", "#AAFFAA", "#AAAAFF"])
cmap_bold = ListedColormap(["#FF0000", "#00FF00", "#0000FF"])

Définir des classifieurs

Nous allons définir deux classifieurs : l'un utilisant le KNN et l'autre utilisant l'NCA et le KNN. Nous utiliserons des pipelines pour mettre à l'échelle les données et appliquer les classifieurs.

names = ["KNN", "NCA, KNN"]

classifiers = [
    Pipeline(
        [
            ("scaler", StandardScaler()),
            ("knn", KNeighborsClassifier(n_neighbors=n_neighbors)),
        ]
    ),
    Pipeline(
        [
            ("scaler", StandardScaler()),
            ("nca", NeighborhoodComponentsAnalysis()),
            ("knn", KNeighborsClassifier(n_neighbors=n_neighbors)),
        ]
    ),
]

Entraîner et tester les classifieurs

Nous allons maintenant entraîner et tester les classifieurs. Nous allons parcourir les classifieurs et les ajuster aux données d'entraînement. Nous tracerons ensuite les limites de décision de classe et calculerons le score sur les données de test.

for name, clf in zip(names, classifiers):
    clf.fit(X_train, y_train)
    score = clf.score(X_test, y_test)

    _, ax = plt.subplots()
    DecisionBoundaryDisplay.from_estimator(
        clf,
        X,
        cmap=cmap_light,
        alpha=0.8,
        ax=ax,
        response_method="predict",
        plot_method="pcolormesh",
        shading="auto",
    )

    ## Plot also the training and testing points
    plt.scatter(X[:, 0], X[:, 1], c=y, cmap=cmap_bold, edgecolor="k", s=20)
    plt.title("{} (k = {})".format(name, n_neighbors))
    plt.text(
        0.9,
        0.1,
        "{:.2f}".format(score),
        size=15,
        ha="center",
        va="center",
        transform=plt.gca().transAxes,
    )

plt.show()

Sommaire

Dans ce laboratoire, nous avons comparé la classification par plus proches voisins avec et sans Analyse des Composantes du Voisinage (NCA en anglais). Nous avons utilisé le jeu de données Iris pour tracer les limites de décision de classe données par un classifieur de plus proches voisins lorsqu'on utilise la distance euclidienne sur les caractéristiques d'origine, par rapport à l'utilisation de la distance euclidienne après la transformation apprise par l'NCA. Nous avons utilisé scikit-learn pour effectuer la classification par plus proches voisins et l'NCA. Nous avons également utilisé matplotlib pour tracer les limites de décision de classe. Nous avons constaté que l'NCA a amélioré la précision de classification.