Apprentissage actif avec propagation de labels

Beginner

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

Introduction

Ce laboratoire démontre une technique d'apprentissage actif pour apprendre les chiffres écrits à la main en utilisant la propagation de labels. La propagation de labels est une méthode d'apprentissage semi-supervisé qui utilise une approche basée sur un graphe pour propager les labels entre les points de données. L'apprentissage actif est un processus qui nous permet de sélectionner itérativement des points de données à étiqueter, et d'utiliser ces points étiquetés pour retraiter le modèle.

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 Carnet de notes pour accéder au carnet Jupyter Notebook pour pratiquer.

Parfois, vous devrez peut-être attendre quelques secondes pour que le carnet Jupyter Notebook ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations du carnet 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ésoudrons rapidement le problème pour vous.

Charger l'ensemble de données des chiffres

Nous allons commencer par charger l'ensemble de données des chiffres à partir de la bibliothèque scikit-learn.

from sklearn import datasets

digits = datasets.load_digits()

Mélanger et diviser les données

Ensuite, nous allons mélanger et diviser l'ensemble de données en parties étiquetées et non étiquetées. Nous commencerons avec seulement 10 points étiquetés.

import numpy as np

rng = np.random.RandomState(0)
indices = np.arange(len(digits.data))
rng.shuffle(indices)

X = digits.data[indices[:330]]
y = digits.target[indices[:330]]
images = digits.images[indices[:330]]

n_total_samples = len(y)
n_labeled_points = 10
unlabeled_indices = np.arange(n_total_samples)[n_labeled_points:]

Entraîner le modèle de propagation de labels

Nous allons maintenant entraîner un modèle de propagation de labels avec les points de données étiquetés et l'utiliser pour prédire les étiquettes des points de données non étiquetés restants.

from sklearn.semi_supervised import LabelSpreading

lp_model = LabelSpreading(gamma=0.25, max_iter=20)
lp_model.fit(X, y_train)
predicted_labels = lp_model.transduction_[unlabeled_indices]

Sélectionner les points les plus incertains

Nous allons sélectionner les cinq points les plus incertains en fonction de leurs distributions de prédiction d'étiquette et demander des étiquettes humaines pour eux.

from scipy import stats

pred_entropies = stats.distributions.entropy(lp_model.label_distributions_.T)
uncertainty_index = np.argsort(pred_entropies)[::-1]
uncertainty_index = uncertainty_index[np.in1d(uncertainty_index, unlabeled_indices)][:5]

Étiqueter les points les plus incertains

Nous allons ajouter les étiquettes humaines aux points de données étiquetés et entraîner le modèle avec elles.

y_train[uncertainty_index] = y[uncertainty_index]
lp_model.fit(X, y_train)

Répéter

Nous allons répéter le processus de sélection des cinq points les plus incertains, d'ajout de leurs étiquettes aux points de données étiquetés et d'entraînement du modèle jusqu'à ce que nous ayons 30 points de données étiquetés.

max_iterations = 3

for i in range(max_iterations):
    if len(unlabeled_indices) == 0:
        print("No unlabeled items left to label.")
        break

    ## select top five uncertain points
    pred_entropies = stats.distributions.entropy(lp_model.label_distributions_.T)
    uncertainty_index = np.argsort(pred_entropies)[::-1]
    uncertainty_index = uncertainty_index[np.in1d(uncertainty_index, unlabeled_indices)][:5]

    ## add labels to labeled data points
    y_train[uncertainty_index] = y[uncertainty_index]

    ## train the model
    lp_model.fit(X, y_train)

    ## remove labeled data points from the unlabeled set
    delete_indices = np.array([], dtype=int)
    for index, image_index in enumerate(uncertainty_index):
        (delete_index,) = np.where(unlabeled_indices == image_index)
        delete_indices = np.concatenate((delete_indices, delete_index))
    unlabeled_indices = np.delete(unlabeled_indices, delete_indices)
    n_labeled_points += len(uncertainty_index)

Sommaire

En résumé, ce laboratoire a démontré une technique d'apprentissage actif utilisant la propagation de labels pour apprendre les chiffres manuscrits. Nous avons commencé par entraîner un modèle de propagation de labels avec seulement 10 points étiquetés, et sélectionné itérativement les cinq points les plus incertains à étiqueter jusqu'à ce que nous ayons 30 points de données étiquetés. Cette technique d'apprentissage actif peut être utile pour minimiser le nombre de points de données étiquetés nécessaires pour entraîner un modèle tout en maximisant ses performances.