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.