Graficar la clasificación Nca

Machine LearningMachine LearningBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Esta práctica mostrará cómo comparar la clasificación de vecinos más cercanos con y sin Análisis de Componentes Vecinales (NCA, Neighborhood Components Analysis). Graficaremos los límites de decisión de clase dados por un clasificador de vecinos más cercanos cuando se utiliza la distancia euclidiana en las características originales, en comparación con el uso de la distancia euclidiana después de la transformación aprendida por Análisis de Componentes Vecinales. Este último tiene como objetivo encontrar una transformación lineal que maximice la precisión de clasificación de vecinos más cercanos (estocástica) en el conjunto de entrenamiento. Utilizaremos el conjunto de datos Iris que contiene 3 clases de 50 instancias cada una.

Consejos sobre la VM

Una vez finalizada la inicialización de la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno para acceder a Jupyter Notebook y practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no puede automatizarse debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y resolveremos rápidamente el problema para usted.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) 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"]) 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{{"Graficar la clasificación Nca"}} sklearn/preprocessing -.-> lab-49223{{"Graficar la clasificación Nca"}} sklearn/pipeline -.-> lab-49223{{"Graficar la clasificación Nca"}} sklearn/model_selection -.-> lab-49223{{"Graficar la clasificación Nca"}} sklearn/inspection -.-> lab-49223{{"Graficar la clasificación Nca"}} ml/sklearn -.-> lab-49223{{"Graficar la clasificación Nca"}} end

Importar bibliotecas

Comenzaremos importando las bibliotecas necesarias. Utilizaremos scikit-learn para realizar la clasificación de vecinos más cercanos y el NCA. Utilizaremos matplotlib para graficar los límites de decisión de clase.

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

Cargar y preparar los datos

A continuación, cargaremos y prepararemos los datos. Cargaremos el conjunto de datos Iris utilizando scikit-learn y seleccionaremos solo dos características. Luego dividiremos los datos en un conjunto de entrenamiento y un conjunto de prueba.

n_neighbors = 1

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

## solo tomamos dos características. Podríamos evitar este feo
## rebanado utilizando un conjunto de datos bidimensional
X = X[:, [0, 2]]

X_train, X_test, y_train, y_test = train_test_split(
    X, y, estratificar=y, tamaño_prueba=0.7, estado_aleatorio=42
)

Crear mapas de colores

Ahora crearemos mapas de colores para graficar los límites de decisión de clase. Usaremos colores claros para el fondo y colores en negrita para los colores de las clases.

h = 0.05  ## tamaño del paso en la malla

## Crear mapas de colores
cmap_light = ListedColormap(["#FFAAAA", "#AAFFAA", "#AAAAFF"])
cmap_bold = ListedColormap(["#FF0000", "#00FF00", "#0000FF"])

Definir clasificadores

Definiremos dos clasificadores: uno que utiliza KNN y otro que utiliza NCA y KNN. Utilizaremos tuberías para escalar los datos y aplicar los clasificadores.

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

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

Entrenar y probar los clasificadores

Ahora entrenaremos y probaremos los clasificadores. Recorreremos los clasificadores y los ajustaremos a los datos de entrenamiento. Luego graficaremos los límites de decisión de clase y calcularemos la puntuación en los datos de prueba.

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",
    )

    ## Graficar también los puntos de entrenamiento y prueba
    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()

Resumen

En este laboratorio, comparamos la clasificación de vecinos más cercanos con y sin Análisis de Componentes Vecinos (NCA, por sus siglas en inglés). Utilizamos el conjunto de datos Iris para graficar los límites de decisión de clase dados por un clasificador de Vecinos más Cercanos cuando se utiliza la distancia Euclidiana en las características originales, en comparación con el uso de la distancia Euclidiana después de la transformación aprendida por NCA. Utilizamos scikit-learn para realizar la clasificación de vecinos más cercanos y NCA. También utilizamos matplotlib para graficar los límites de decisión de clase. Encontramos que NCA mejoró la precisión de clasificación.