Approximation du noyau polynomial avec Scikit-Learn

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 démontrera comment utiliser l'approximation du noyau polynomial dans scikit-learn pour générer efficacement des approximations d'espace de caractéristiques de noyau polynomial. Cela est utilisé pour entraîner des classifieurs linéaires qui approchent la précision des classifieurs à noyau. Nous utiliserons le jeu de données Covtype, qui contient 581 012 échantillons avec 54 caractéristiques chacun, répartis entre 6 classes. Le but de ce jeu de données est de prédire le type de couvert forestier à partir de variables cartographiques seulement (aucune donnée de télédétection). Après le chargement, nous le transformons en un problème de classification binaire pour correspondre à la version du jeu de données sur la page web de LIBSVM, qui était celle utilisée dans l'article original.

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 des commentaires 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"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/svm("Support Vector Machines") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/preprocessing("Preprocessing and Normalization") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/kernel_approximation("Kernel Approximation") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/svm -.-> lab-49276{{"Approximation du noyau polynomial avec Scikit-Learn"}} sklearn/preprocessing -.-> lab-49276{{"Approximation du noyau polynomial avec Scikit-Learn"}} sklearn/kernel_approximation -.-> lab-49276{{"Approximation du noyau polynomial avec Scikit-Learn"}} sklearn/model_selection -.-> lab-49276{{"Approximation du noyau polynomial avec Scikit-Learn"}} sklearn/datasets -.-> lab-49276{{"Approximation du noyau polynomial avec Scikit-Learn"}} ml/sklearn -.-> lab-49276{{"Approximation du noyau polynomial avec Scikit-Learn"}} end

Charger et préparer les données

Nous allons tout d'abord charger le jeu de données Covtype et le transformer en un problème de classification binaire en sélectionnant seulement une classe. Ensuite, nous allons diviser les données en un ensemble d'entraînement et un ensemble de test, et normaliser les caractéristiques.

from sklearn.datasets import fetch_covtype
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler, Normalizer

## Charger le jeu de données Covtype, en sélectionnant seulement une classe
X, y = fetch_covtype(return_X_y=True)
y[y!= 2] = 0
y[y == 2] = 1

## Diviser les données en un ensemble d'entraînement et un ensemble de test
X_train, X_test, y_train, y_test = train_test_split(
    X, y, train_size=5000, test_size=10000, random_state=42
)

## Normaliser les caractéristiques
mm = make_pipeline(MinMaxScaler(), Normalizer())
X_train = mm.fit_transform(X_train)
X_test = mm.transform(X_test)

Établir un modèle de base

Nous allons entraîner un SVM linéaire sur les caractéristiques d'origine pour établir un modèle de base et afficher sa précision.

from sklearn.svm import LinearSVC

## Entraîner un SVM linéaire sur les caractéristiques d'origine
lsvm = LinearSVC(dual="auto")
lsvm.fit(X_train, y_train)
lsvm_score = 100 * lsvm.score(X_test, y_test)

## Afficher la précision du modèle de base
print(f"Linear SVM score on raw features: {lsvm_score:.2f}%")

Établir le modèle d'approximation du noyau

Nous allons maintenant entraîner des SVM linéaires sur les caractéristiques générées par PolynomialCountSketch avec différentes valeurs pour n_components. Nous utiliserons une boucle pour itérer sur différentes valeurs de n_components et afficher la précision de chaque modèle.

from sklearn.kernel_approximation import PolynomialCountSketch

n_runs = 1
N_COMPONENTS = [250, 500, 1000, 2000]

for n_components in N_COMPONENTS:
    ps_lsvm_score = 0
    for _ in range(n_runs):
        ## Entraîner un SVM linéaire sur les caractéristiques générées par PolynomialCountSketch
        pipeline = make_pipeline(
            PolynomialCountSketch(n_components=n_components, degree=4),
            LinearSVC(dual="auto"),
        )
        pipeline.fit(X_train, y_train)
        ps_lsvm_score += 100 * pipeline.score(X_test, y_test)

    ps_lsvm_score /= n_runs

    ## Afficher la précision du modèle
    print(f"Linear SVM score on {n_components} PolynomialCountSketch features: {ps_lsvm_score:.2f}%")

Établir le modèle SVM à noyau

Nous allons entraîner un SVM à noyau pour voir à quel point PolynomialCountSketch approche les performances du noyau.

from sklearn.svm import SVC

## Entraîner un SVM à noyau
ksvm = SVC(C=500.0, kernel="poly", degree=4, coef0=0, gamma=1.0)
ksvm.fit(X_train, y_train)
ksvm_score = 100 * ksvm.score(X_test, y_test)

## Afficher la précision du SVM à noyau
print(f"Kernel-SVM score on raw features: {ksvm_score:.2f}%")

Comparer les résultats

Nous allons tracer les résultats des différentes méthodes en fonction de leurs temps d'entraînement pour comparer leurs performances.

import matplotlib.pyplot as plt

## Tracer les résultats des différentes méthodes
fig, ax = plt.subplots(figsize=(7, 7))
ax.scatter(
    [
        lsvm_time,
    ],
    [
        lsvm_score,
    ],
    label="Linear SVM",
    c="green",
    marker="^",
)

for n_components in N_COMPONENTS:
    ax.scatter(
        [
            results[f"LSVM + PS({n_components})"]["time"],
        ],
        [
            results[f"LSVM + PS({n_components})"]["score"],
        ],
        c="blue",
    )
    ax.annotate(
        f"n_comp.={n_components}",
        (
            results[f"LSVM + PS({n_components})"]["time"],
            results[f"LSVM + PS({n_components})"]["score"],
        ),
        xytext=(-30, 10),
        textcoords="offset pixels",
    )

ax.scatter(
    [
        ksvm_time,
    ],
    [
        ksvm_score,
    ],
    label="Kernel SVM",
    c="red",
    marker="x",
)

ax.set_xlabel("Temps d'entraînement (s)")
ax.set_ylabel("Précision (%)")
ax.legend()
plt.show()

Sommaire

Ce laboratoire a démontré comment utiliser l'approximation du noyau polynomial dans scikit-learn pour générer efficacement des approximations d'espace de caractéristiques de noyau polynomial. Nous avons appliqué cette technique au jeu de données Covtype, en le transformant en un problème de classification binaire et en entraînant des classifieurs linéaires qui approchent la précision des classifieurs à noyau. Nous avons également comparé les performances des différentes méthodes et tracé les résultats en fonction de leurs temps d'entraînement.