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.