Estimation de densité par noyau

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

L'estimation de densité par noyau (Kernel Density Estimation - KDE) est une technique d'estimation de densité non paramétrique. Dans ce laboratoire, nous allons apprendre à utiliser la KDE pour générer de nouveaux échantillons de données. Nous utiliserons la bibliothèque scikit-learn pour implémenter cette technique.

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 au Notebook Jupyter pour la pratique.

Parfois, vous devrez peut-être attendre quelques secondes pour que le Notebook Jupyter ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limites du Notebook 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/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/neighbors("Nearest Neighbors") 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/neighbors -.-> lab-49109{{"Estimation de densité par noyau"}} sklearn/model_selection -.-> lab-49109{{"Estimation de densité par noyau"}} sklearn/decomposition -.-> lab-49109{{"Estimation de densité par noyau"}} sklearn/datasets -.-> lab-49109{{"Estimation de densité par noyau"}} ml/sklearn -.-> lab-49109{{"Estimation de densité par noyau"}} end

Charger les données

Tout d'abord, nous chargeons l'ensemble de données des chiffres (digits dataset) de scikit-learn. Cet ensemble de données contient des images 8x8 de chiffres allant de 0 à 9. Nous utiliserons l'Analyse en Composantes Principales (Principal Component Analysis - PCA) pour réduire la dimension de l'ensemble de données à 15.

from sklearn.datasets import load_digits
from sklearn.decomposition import PCA

## charger l'ensemble de données des chiffres
digits = load_digits()

## réduire la dimension de l'ensemble de données à 15 en utilisant la PCA
pca = PCA(n_components=15, whiten=False)
data = pca.fit_transform(digits.data)

Optimiser la largeur de bande

Nous utilisons la validation croisée par recherche sur grille pour optimiser le paramètre de largeur de bande de la KDE. Le paramètre de largeur de bande contrôle la lissité de l'estimation de densité.

from sklearn.neighbors import KernelDensity
from sklearn.model_selection import GridSearchCV
import numpy as np

## utiliser la validation croisée par recherche sur grille pour optimiser la largeur de bande
params = {"bandwidth": np.logspace(-1, 1, 20)}
grid = GridSearchCV(KernelDensity(), params)
grid.fit(data)

print("meilleure largeur de bande : {0}".format(grid.best_estimator_.bandwidth))

## utiliser le meilleur estimateur pour calculer l'estimation de densité par noyau
kde = grid.best_estimator_

Générer de nouveaux échantillons

Nous utilisons le meilleur estimateur pour échantillonner 44 nouveaux points à partir des données. Nous transformons ensuite les nouvelles données en retournant à sa dimension d'origine de 64 en utilisant l'inverse de la PCA.

## échantillonner 44 nouveaux points à partir des données
new_data = kde.sample(44, random_state=0)
new_data = pca.inverse_transform(new_data)

Tracer les résultats

Nous traçons les chiffres originaux et les chiffres redéchantillonnés côte à côte dans une grille 4x11.

import matplotlib.pyplot as plt

## transformer les données en une grille 4x11
new_data = new_data.reshape((4, 11, -1))
real_data = digits.data[:44].reshape((4, 11, -1))

## tracer les chiffres réels et les chiffres redéchantillonnés
fig, ax = plt.subplots(9, 11, subplot_kw=dict(xticks=[], yticks=[]))
for j in range(11):
    ax[4, j].set_visible(False)
    for i in range(4):
        im = ax[i, j].imshow(
            real_data[i, j].reshape((8, 8)), cmap=plt.cm.binary, interpolation="nearest"
        )
        im.set_clim(0, 16)
        im = ax[i + 5, j].imshow(
            new_data[i, j].reshape((8, 8)), cmap=plt.cm.binary, interpolation="nearest"
        )
        im.set_clim(0, 16)

ax[0, 5].set_title("Sélection des données d'entrée")
ax[5, 5].set_title('Chiffres "nouveaux" tirés du modèle de densité par noyau')

plt.show()

Récapitulatif

Dans ce laboratoire, nous avons appris à utiliser l'estimation de densité par noyau (Kernel Density Estimation - KDE) pour générer de nouveaux échantillons de données. Nous avons utilisé la bibliothèque scikit-learn pour implémenter cette technique. Nous avons optimisé le paramètre de largeur de bande de la KDE en utilisant la validation croisée par recherche sur grille. Nous avons ensuite échantillonné de nouveaux points de données et les avons transformés de retour à leur dimension d'origine en utilisant la PCA. Enfin, nous avons tracé les chiffres originaux et les chiffres redéchantillonnés côte à côte dans une grille 4x11.