Introduction
Ce laboratoire montre comment effectuer l'apprentissage semi-supervisé à l'aide de l'algorithme Label Spreading. Nous utiliserons un sous-ensemble de l'ensemble de données de chiffres manuscrits et seulement 40 de ces échantillons seront étiquetés. Nous utiliserons ensuite Label Spreading pour prédire les 300 échantillons restants.
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 à 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 votre feedback après la session et nous réglerons rapidement le problème pour vous.
Charger et mélanger les données
Nous commençons par charger l'ensemble de données de chiffres et mélangeons aléatoirement les données.
digits = datasets.load_digits()
rng = np.random.RandomState(2)
indices = np.arange(len(digits.data))
rng.shuffle(indices)
Préparer les données pour l'apprentissage semi-supervisé
Nous sélectionnons 340 échantillons et seulement 40 de ces échantillons sont associés à une étiquette connue. Nous stockons les indices des 300 autres échantillons pour lesquels nous ne sommes pas supposés connaître leurs étiquettes. Nous mélangeons ensuite les étiquettes de sorte que les échantillons non étiquetés soient marqués avec -1.
X = digits.data[indices[:340]]
y = digits.target[indices[:340]]
n_total_samples = len(y)
n_labeled_points = 40
indices = np.arange(n_total_samples)
unlabeled_set = indices[n_labeled_points:]
y_train = np.copy(y)
y_train[unlabeled_set] = -1
Entraîner le modèle Label Spreading
Nous entraînons le modèle Label Spreading avec gamma=0,25 et max_iter=20.
lp_model = LabelSpreading(gamma=0.25, max_iter=20)
lp_model.fit(X, y_train)
Évaluer les performances du modèle
Nous évaluons les performances du modèle en générant un rapport de classification et une matrice de confusion.
predicted_labels = lp_model.transduction_[unlabeled_set]
true_labels = y[unlabeled_set]
print(
"Label Spreading model: %d labeled & %d unlabeled points (%d total)"
% (n_labeled_points, n_total_samples - n_labeled_points, n_total_samples)
)
print(classification_report(true_labels, predicted_labels))
ConfusionMatrixDisplay.from_predictions(
true_labels, predicted_labels, labels=lp_model.classes_
)
Tracer les prédictions les plus incertaines
Nous sélectionnons et montrons les 10 prédictions les plus incertaines.
pred_entropies = stats.distributions.entropy(lp_model.label_distributions_.T)
uncertainty_index = np.argsort(pred_entropies)[-10:]
f = plt.figure(figsize=(7, 5))
for index, image_index in enumerate(uncertainty_index):
image = images[image_index]
sub = f.add_subplot(2, 5, index + 1)
sub.imshow(image, cmap=plt.cm.gray_r)
plt.xticks([])
plt.yticks([])
sub.set_title(
"predict: %i\ntrue: %i" % (lp_model.transduction_[image_index], y[image_index])
)
f.suptitle("Apprentissage avec un faible nombre de données étiquetées")
plt.show()
Sommaire
Dans ce laboratoire, nous avons démontré comment effectuer un apprentissage semi-supervisé à l'aide de l'algorithme Label Spreading. Nous avons entraîné le modèle avec un faible nombre de données étiquetées et l'avons utilisé pour prédire les étiquettes des échantillons restants. Le modèle a bien fonctionné et a correctement prédit les étiquettes de la plupart des échantillons.