Aprendizaje activo con propagación de etiquetas

Beginner

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

Introducción

Esta práctica demuestra una técnica de aprendizaje activo para aprender dígitos escritos a mano utilizando propagación de etiquetas. La Propagación de Etiquetas es un método de aprendizaje semi-supervisado que utiliza un enfoque basado en grafos para propagar etiquetas a través de puntos de datos. El aprendizaje activo es un proceso que nos permite iterativamente seleccionar puntos de datos para etiquetar y utilizar estos puntos etiquetados para volver a entrenar el modelo.

Consejos sobre la VM

Una vez finalizada la inicialización de la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje su retroalimentación después de la sesión y resolveremos rápidamente el problema para usted.

Cargar el conjunto de datos de dígitos

Comenzaremos cargando el conjunto de datos de dígitos desde la biblioteca scikit-learn.

from sklearn import datasets

digits = datasets.load_digits()

Mezclar y dividir los datos

A continuación, mezclaremos y dividiremos el conjunto de datos en partes etiquetadas y no etiquetadas. Comenzaremos con solo 10 puntos etiquetados.

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:]

Entrenar el modelo de propagación de etiquetas

Ahora entrenaremos un modelo de propagación de etiquetas con los puntos de datos etiquetados y lo utilizaremos para predecir las etiquetas de los puntos de datos no etiquetados restantes.

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]

Seleccionar los puntos más inciertos

Seleccionaremos los cinco puntos más inciertos basados en sus distribuciones de etiquetas predichas y solicitaremos sus etiquetas manuales.

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]

Etiquetar los puntos más inciertos

Agregaremos las etiquetas manuales a los puntos de datos etiquetados y entrenaremos el modelo con ellos.

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

Repetir

Repetiremos el proceso de seleccionar los cinco puntos más inciertos, agregar sus etiquetas a los puntos de datos etiquetados y entrenar el modelo hasta que tengamos 30 puntos de datos etiquetados.

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)

Resumen

En resumen, esta práctica mostró una técnica de aprendizaje activo que utiliza la propagación de etiquetas para aprender dígitos escritos a mano. Comenzamos entrenando un modelo de propagación de etiquetas con solo 10 puntos etiquetados y seleccionamos iterativamente los cinco puntos más inciertos para etiquetar hasta que tuvimos 30 puntos de datos etiquetados. Esta técnica de aprendizaje activo puede ser útil para minimizar el número de puntos de datos etiquetados necesarios para entrenar un modelo mientras se maximiza su rendimiento.