Aprendizaje semi-supervisado se refiere a algoritmos que intentan hacer uso de datos de entrenamiento etiquetados y no etiquetados.
Los algoritmos de aprendizaje semi-supervisados son diferentes a los algoritmos de aprendizaje supervisados que solo pueden aprender a partir de datos de entrenamiento etiquetados.
Un enfoque popular para el aprendizaje semi-supervisado es crear un gráfico que conecte ejemplos en el conjunto de datos de entrenamiento y propague etiquetas conocidas a través de los bordes del gráfico para etiquetar ejemplos sin etiquetar. Un ejemplo de este enfoque del aprendizaje semi-supervisado es el algoritmo de difusión de etiquetas para modelado predictivo de clasificación.
En este tutorial, descubrirá cómo aplicar el algoritmo de difusión de etiquetas a un conjunto de datos de clasificación de aprendizaje semi-supervisado.
Después de completar este tutorial, sabrá:
- Una intuición de cómo funciona el algoritmo de aprendizaje semi-supervisado de difusión de etiquetas.
- Cómo desarrollar un conjunto de datos de clasificación semi-supervisado y establecer una línea de base en el desempeño con un algoritmo de aprendizaje supervisado.
- Cómo desarrollar y evaluar un algoritmo de difusión de etiquetas y utilizar la salida del modelo para entrenar un algoritmo de aprendizaje supervisado.
Empecemos.
Descripción general del tutorial
Este tutorial se divide en tres partes; son:
- Algoritmo de difusión de etiquetas
- Conjunto de datos de clasificación semi supervisado
- Difusión de etiquetas para el aprendizaje semi-supervisado
Algoritmo de difusión de etiquetas
Label Spreading es un algoritmo de aprendizaje semi-supervisado.
El algoritmo fue introducido por Dengyong Zhou, et al. en su artículo de 2003 titulado «Aprender con coherencia local y global».
La intuición del enfoque más amplio del aprendizaje semi-supervisado es que los puntos cercanos en el espacio de entrada deben tener la misma etiqueta, y los puntos en la misma estructura o variedad en el espacio de entrada deben tener la misma etiqueta.
La clave de los problemas de aprendizaje semi-supervisados es la suposición previa de consistencia, lo que significa: (1) es probable que los puntos cercanos tengan la misma etiqueta; y (2) es probable que los puntos de la misma estructura a los que normalmente se hace referencia como grupo o colector tengan la misma etiqueta.
– Aprendizaje con coherencia local y global, 2003.
La difusión de etiquetas está inspirada en una técnica de la psicología experimental llamada redes de activación de difusión.
Este algoritmo puede entenderse intuitivamente en términos de difundir redes de activación desde la psicología experimental.
– Aprendizaje con coherencia local y global, 2003.
Los puntos del conjunto de datos se conectan en un gráfico en función de sus distancias relativas en el espacio de entrada. La matriz de ponderaciones del gráfico se normaliza simétricamente, de forma muy similar a la agrupación espectral. La información se pasa a través del gráfico, que se adapta para capturar la estructura en el espacio de entrada.
El enfoque es muy similar al algoritmo de propagación de etiquetas para el aprendizaje semi-supervisado.
Zhou et al dieron otro algoritmo de propagación de etiquetas similar: en cada paso, un nodo i recibe una contribución de sus vecinos j (ponderada por el peso normalizado del borde (i, j)), y una pequeña contribución adicional dada por su valor inicial
– Página 196, Aprendizaje semi-supervisado, 2006.
Después de la convergencia, las etiquetas se aplican en función de los nodos que transmitieron la mayor cantidad de información.
Finalmente, la etiqueta de cada punto sin etiquetar se establece para que sea la clase de la que ha recibido más información durante el proceso de iteración.
– Aprendizaje con coherencia local y global, 2003.
Ahora que estamos familiarizados con el algoritmo de distribución de etiquetas, veamos cómo podríamos usarlo en un proyecto. Primero, debemos definir un conjunto de datos de clasificación semi-supervisado.
Conjunto de datos de clasificación semi supervisado
En esta sección, definiremos un conjunto de datos para el aprendizaje semi-supervisado y estableceremos una línea de base en el desempeño en el conjunto de datos.
Primero, podemos definir un conjunto de datos de clasificación sintético usando la función make_classification ().
Definiremos el conjunto de datos con dos clases (clasificación binaria) y dos variables de entrada y 1000 ejemplos.
... # definir conjunto de datos X, y = make_classification(n_samples=1000, n_features=2, n_informativo=2, n_redundante=0, estado_aleatorio=1) |
A continuación, dividiremos el conjunto de datos en conjuntos de datos de prueba y entrenamiento con una división igual al 50-50 (por ejemplo, 500 filas en cada uno).
... # dividir en entrenar y probar X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0,50, estado_aleatorio=1, estratificar=y) |
Finalmente, volveremos a dividir el conjunto de datos de entrenamiento a la mitad en una parte que tendrá etiquetas y una parte que fingiremos que no tiene etiqueta.
... # dividir el tren en etiquetado y sin etiquetar X_train_lab, X_test_unlab, y_train_lab, y_test_unlab = train_test_split(X_train, y_train, test_size=0,50, estado_aleatorio=1, estratificar=y_train) |
Al unir esto, el ejemplo completo de preparación del conjunto de datos de aprendizaje semi-supervisado se enumera a continuación.
# preparar un conjunto de datos de aprendizaje semi-supervisado desde sklearn.conjuntos de datos importar make_classification desde sklearn.model_selection importar prueba_entrenamiento_división # definir conjunto de datos X, y = make_classification(n_samples=1000, n_features=2, n_informativo=2, n_redundante=0, estado_aleatorio=1) # dividir en entrenar y probar X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0,50, estado_aleatorio=1, estratificar=y) # dividir el tren en etiquetado y sin etiquetar X_train_lab, X_test_unlab, y_train_lab, y_test_unlab = train_test_split(X_train, y_train, test_size=0,50, estado_aleatorio=1, estratificar=y_train) # resumir el tamaño del conjunto de entrenamiento impresión(‘Conjunto de tren etiquetado:’, X_train_lab.forma, y_train_lab.forma) impresión(‘Juego de trenes sin etiqueta:’, X_test_unlab.forma, y_test_unlab.forma) # resumir el tamaño del conjunto de prueba impresión(‘Equipo de prueba:’, X_test.forma, y_test.forma) |
La ejecución del ejemplo prepara el conjunto de datos y luego resume la forma de cada una de las tres porciones.
Los resultados confirman que tenemos un conjunto de datos de prueba de 500 filas, un conjunto de datos de entrenamiento etiquetado de 250 filas y 250 filas de datos sin etiquetar.
Conjunto de trenes etiquetado: (250, 2) (250,) Conjunto de trenes sin etiqueta: (250, 2) (250,) Equipo de prueba: (500, 2) (500,) |
Un algoritmo de aprendizaje supervisado solo tendrá 250 filas desde las que entrenar un modelo.
Un algoritmo de aprendizaje semi-supervisado tendrá las 250 filas etiquetadas, así como las 250 filas no etiquetadas que podrían usarse de numerosas formas para mejorar el conjunto de datos de entrenamiento etiquetados.
A continuación, podemos establecer una línea de base en el rendimiento en el conjunto de datos de aprendizaje semi-supervisado utilizando un algoritmo de aprendizaje supervisado que se ajusta solo a los datos de entrenamiento etiquetados.
Esto es importante porque esperaríamos que un algoritmo de aprendizaje semi-supervisado supere a un algoritmo de aprendizaje supervisado que se ajuste solo a los datos etiquetados. Si este no es el caso, entonces el algoritmo de aprendizaje semi-supervisado no tiene habilidad.
En este caso, utilizaremos un algoritmo de regresión logística que se ajuste a la parte etiquetada del conjunto de datos de entrenamiento.
... # definir modelo modelo = Regresión logística() # ajustar el modelo en un conjunto de datos etiquetado modelo.ajuste(X_train_lab, y_train_lab) |
Luego, el modelo puede usarse para hacer predicciones en todo el conjunto de datos de prueba de exclusión y evaluarse usando la precisión de clasificación.
... # hacer predicciones en el conjunto de prueba de espera yhat = modelo.predecir(X_test) # calcular la puntuación para el conjunto de prueba Puntuación = puntuación_de_precisión(y_test, yhat) # resumir puntuación impresión(‘Precisión:% .3f’ % (Puntuación*100)) |
Al unir esto, el ejemplo completo de evaluación de un algoritmo de aprendizaje supervisado en el conjunto de datos de aprendizaje semi-supervisado se enumera a continuación.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 17 18 19 20 21 |
# rendimiento de referencia en el conjunto de datos de aprendizaje semi-supervisado desde sklearn.conjuntos de datos importar make_classification desde sklearn.model_selection importar train_test_split desde sklearn.métrica importar puntuación_de_precisión desde sklearn.Modelo lineal importar Regresión logística # definir conjunto de datos X, y = make_classification(n_samples=1000, n_features=2, n_informativo=2, n_redundante=0, estado_aleatorio=1) # dividir en entrenar y probar X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0,50, estado_aleatorio=1, estratificar=y) # dividir el tren en etiquetado y sin etiquetar X_train_lab, X_test_unlab, y_train_lab, y_test_unlab = train_test_split(X_train, y_train, test_size=0,50, estado_aleatorio=1, estratificar=y_train) # definir modelo modelo = Regresión logística() # ajustar el modelo en un conjunto de datos etiquetado modelo.ajuste(X_train_lab, y_train_lab) # hacer predicciones en el conjunto de prueba de espera yhat = modelo.predecir(X_test) # calcular la puntuación para el conjunto de prueba Puntuación = puntuación_de_precisión(y_test, yhat) # resumir puntuación impresión(‘Precisión:% .3f’ % (Puntuación*100)) |
La ejecución del algoritmo ajusta el modelo en el conjunto de datos de entrenamiento etiquetado y lo evalúa en el conjunto de datos reservado e imprime la precisión de la clasificación.
Nota: Sus resultados pueden variar dada la naturaleza estocástica del algoritmo o procedimiento de evaluación, o las diferencias en la precisión numérica. Considere ejecutar el ejemplo varias veces y compare el resultado promedio.
En este caso, podemos ver que el algoritmo logró una precisión de clasificación de alrededor del 84,8 por ciento.
Esperaríamos que un algoritmo de aprendizaje semi-supervisado eficaz logre una precisión mejor que esta.
A continuación, exploremos cómo aplicar el algoritmo de difusión de etiquetas al conjunto de datos.
Difusión de etiquetas para el aprendizaje semi-supervisado
El algoritmo de difusión de etiquetas está disponible en la biblioteca de aprendizaje automático de Python de scikit-learn a través de la clase LabelSpreading.
El modelo se puede ajustar como cualquier otro modelo de clasificación llamando al ajuste() función y se utiliza para hacer predicciones de nuevos datos a través de la predecir() función.
... # definir modelo modelo = EtiquetaExpandiendo() # ajuste del modelo en el conjunto de datos de entrenamiento modelo.ajuste(..., ...) # hacer predicciones en el conjunto de prueba de espera yhat = modelo.predecir(...) |
Es importante destacar que el conjunto de datos de entrenamiento proporcionado al ajuste() La función debe incluir ejemplos etiquetados que estén codificados ordinalmente (como es normal) y ejemplos no etiquetados marcados con una etiqueta de -1.
A continuación, el modelo determinará una etiqueta para los ejemplos sin etiqueta como parte del ajuste del modelo.
Una vez que se ajusta el modelo, las etiquetas estimadas para los datos etiquetados y no etiquetados en el conjunto de datos de entrenamiento están disponibles a través de «transducción_«Atributo en el EtiquetaExpandiendo clase.
... # obtener etiquetas para todo el conjunto de datos de entrenamiento tran_labels = modelo.transducción_ |
Ahora que estamos familiarizados con cómo usar el algoritmo de difusión de etiquetas en scikit-learn, veamos cómo podríamos aplicarlo a nuestro conjunto de datos de aprendizaje semi-supervisado.
Primero, debemos preparar el conjunto de datos de entrenamiento.
Podemos concatenar los datos de entrada del conjunto de datos de entrenamiento en una sola matriz.
... # crear la entrada del conjunto de datos de entrenamiento X_train_mixed = concatenar((X_train_lab, X_test_unlab)) |
Luego, podemos crear una lista de valores -1 (sin etiquetar) para cada fila en la parte sin etiquetar del conjunto de datos de entrenamiento.
... # crear «sin etiqueta» para datos sin etiquetar sin etiqueta = [[–1 para _ en rango(len(y_test_unlab))] |
Luego, esta lista se puede concatenar con las etiquetas de la parte etiquetada del conjunto de datos de entrenamiento para que se corresponda con la matriz de entrada del conjunto de datos de entrenamiento.
... # recombinar etiquetas de conjuntos de datos de entrenamiento y_train_mixed = concatenar((y_train_lab, sin etiqueta)) |
Ahora podemos entrenar al EtiquetaExpandiendo modelo en todo el conjunto de datos de entrenamiento.
... # definir modelo modelo = EtiquetaExpandiendo() # ajuste del modelo en el conjunto de datos de entrenamiento modelo.ajuste(X_train_mixed, y_train_mixed) |
A continuación, podemos usar el modelo para hacer predicciones en el conjunto de datos reservado y evaluar el modelo utilizando la precisión de clasificación.
... # hacer predicciones en el conjunto de prueba de espera yhat = modelo.predecir(X_test) # calcular la puntuación para el conjunto de prueba Puntuación = puntuación_de_precisión(y_test, yhat) # resumir puntuación impresión(‘Precisión:% .3f’ % (Puntuación*100)) |
Al unir esto, el ejemplo completo de evaluación de la distribución de etiquetas en el conjunto de datos de aprendizaje semi-supervisado se enumera a continuación.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 17 18 19 20 21 22 23 24 25 26 27 28 |
# evaluar la distribución de etiquetas en el conjunto de datos de aprendizaje semi-supervisado desde numpy importar concatenar desde sklearn.conjuntos de datos importar make_classification desde sklearn.model_selection importar train_test_split desde sklearn.métrica importar puntuación_de_precisión desde sklearn.semi_supervisado importar EtiquetaExpandiendo # definir conjunto de datos X, y = make_classification(n_samples=1000, n_features=2, n_informativo=2, n_redundante=0, estado_aleatorio=1) # dividir en entrenar y probar X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0,50, estado_aleatorio=1, estratificar=y) # dividir el tren en etiquetado y sin etiquetar X_train_lab, X_test_unlab, y_train_lab, y_test_unlab = train_test_split(X_train, y_train, test_size=0,50, estado_aleatorio=1, estratificar=y_train) # crear la entrada del conjunto de datos de entrenamiento X_train_mixed = concatenar((X_train_lab, X_test_unlab)) # crear «sin etiqueta» para datos sin etiquetar sin etiqueta = [[–1 para _ en rango(len(y_test_unlab))] # recombinar etiquetas de conjuntos de datos de entrenamiento y_train_mixed = concatenar((y_train_lab, sin etiqueta)) # definir modelo modelo = EtiquetaExpandiendo() # ajuste del modelo en el conjunto de datos de entrenamiento modelo.ajuste(X_train_mixed, y_train_mixed) # hacer predicciones en el conjunto de prueba de espera yhat = modelo.predecir(X_test) # calcular la puntuación para el conjunto de prueba Puntuación = precisión_puntaje(y_test, yhat) # resumir puntuación impresión(‘Precisión:% .3f’ % (Puntuación*100)) |
La ejecución del algoritmo ajusta el modelo en todo el conjunto de datos de entrenamiento y lo evalúa en el conjunto de datos reservado e imprime la precisión de la clasificación.
Nota: Sus resultados pueden variar dada la naturaleza estocástica del algoritmo o procedimiento de evaluación, o las diferencias en la precisión numérica. Considere ejecutar el ejemplo varias veces y compare el resultado promedio.
En este caso, podemos ver que el modelo de distribución de etiquetas alcanza una precisión de clasificación de aproximadamente el 85,4 por ciento, que es un poco más alta que un ajuste de regresión logística solo en el conjunto de datos de entrenamiento etiquetado que logró una precisión de aproximadamente el 84,8 por ciento.
Hasta aquí todo bien.
Otro enfoque que podemos usar con el modelo semi-supervisado es tomar las etiquetas estimadas para el conjunto de datos de entrenamiento y ajustar un modelo de aprendizaje supervisado.
Recuerde que podemos recuperar las etiquetas para todo el conjunto de datos de entrenamiento del modelo de distribución de etiquetas de la siguiente manera:
... # obtener etiquetas para todo el conjunto de datos de entrenamiento tran_labels = modelo.transducción_ |
Luego, podemos usar estas etiquetas, junto con todos los datos de entrada, para entrenar y evaluar un algoritmo de aprendizaje supervisado, como un modelo de regresión logística.
La esperanza es que el modelo de aprendizaje supervisado que se ajuste a todo el conjunto de datos de entrenamiento logre un rendimiento aún mejor que el modelo de aprendizaje semi-supervisado solo.
... # definir el modelo de aprendizaje supervisado modelo2 = Regresión logística() # ajuste del modelo de aprendizaje supervisado en todo el conjunto de datos de entrenamiento modelo2.ajuste(X_train_mixed, tran_labels) # hacer predicciones en el conjunto de prueba de espera yhat = modelo2.predecir(X_test) # calcular la puntuación para el conjunto de prueba Puntuación = precisión_puntaje(y_test, yhat) # resumir puntuación impresión(‘Precisión:% .3f’ % (Puntuación*100)) |
Al unir esto, el ejemplo completo del uso de las etiquetas del conjunto de entrenamiento estimado para entrenar y evaluar un modelo de aprendizaje supervisado se enumera a continuación.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# evaluar el ajuste de la regresión logística en la distribución de etiquetas para el aprendizaje semi-supervisado desde numpy importar concatenar desde sklearn.conjuntos de datos importar make_classification desde sklearn.model_selection importar train_test_split desde sklearn.métrica importar precisión_puntaje desde sklearn.semi_supervisado importar EtiquetaExpandiendo desde sklearn.Modelo lineal importar Regresión logística # definir conjunto de datos X, y = make_classification(n_samples=1000, n_features=2, n_informativo=2, n_redundante=0, estado_aleatorio=1) # dividir en entrenar y probar X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0,50, estado_aleatorio=1, estratificar=y) # dividir el tren en etiquetado y sin etiquetar X_train_lab, X_test_unlab, y_train_lab, y_test_unlab = train_test_split(X_train, y_train, test_size=0,50, estado_aleatorio=1, estratificar=y_train) # crear la entrada del conjunto de datos de entrenamiento X_train_mixed = concatenar((X_train_lab, X_test_unlab)) # crear «sin etiqueta» para datos sin etiquetar sin etiqueta = [[–1 para _ en rango(len(y_test_unlab))] # recombine training dataset labels y_train_mixed = concatenate((y_train_lab, nolabel)) # define model model = LabelSpreading() # fit model on training dataset model.fit(X_train_mixed, y_train_mixed) # get labels for entire training dataset data tran_labels = model.transduction_ # define supervised learning model model2 = LogisticRegression() # fit supervised learning model on entire training dataset model2.fit(X_train_mixed, tran_labels) # make predictions on hold out test set yhat = model2.predict(X_test) # calculate score for test set score = accuracy_score(y_test, yhat) # summarize score impresión(‘Accuracy: %.3f’ % (score*100)) |
Running the algorithm fits the semi-supervised model on the entire training dataset, then fits a supervised learning model on the entire training dataset with inferred labels and evaluates it on the holdout dataset, printing the classification accuracy.
Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.
In this case, we can see that this hierarchical approach of semi-supervised model followed by supervised model achieves a classification accuracy of about 85.8 percent on the holdout dataset, slightly better than the semi-supervised learning algorithm used alone that achieved an accuracy of about 85.6 percent.
Can you achieve better results by tuning the hyperparameters of the LabelSpreading model?
Let me know what you discover in the comments below.
Further Reading
This section provides more resources on the topic if you are looking to go deeper.
Books
Papers
APIs
Articles
Resumen
In this tutorial, you discovered how to apply the label spreading algorithm to a semi-supervised learning classification dataset.
Specifically, you learned:
- An intuition for how the label spreading semi-supervised learning algorithm works.
- How to develop a semi-supervised classification dataset and establish a baseline in performance with a supervised learning algorithm.
- How to develop and evaluate a label spreading algorithm and use the model output to train a supervised learning algorithm.
Do you have any questions?
Ask your questions in the comments below and I will do my best to answer.