Última actualización el 31 de agosto de 2020
La clasificación de varias etiquetas implica predecir cero o más etiquetas de clase.
A diferencia de las tareas de clasificación normales en las que las etiquetas de clase son mutuamente exclusivas, la clasificación de etiquetas múltiples requiere algoritmos de aprendizaje automático especializados que admitan la predicción de varias clases o etiquetas no mutuamente exclusivas.»
Las redes neuronales de aprendizaje profundo son un ejemplo de algoritmo que admite de forma nativa problemas de clasificación de etiquetas múltiples. Los modelos de redes neuronales para tareas de clasificación de etiquetas múltiples se pueden definir y evaluar fácilmente con la biblioteca de aprendizaje profundo de Keras.
En este tutorial, descubrirá cómo desarrollar modelos de aprendizaje profundo para la clasificación de etiquetas múltiples.
Después de completar este tutorial, sabrá:
- La clasificación de etiquetas múltiples es una tarea de modelado predictivo que implica predecir cero o más etiquetas de clase no exclusivas entre sí.
- Los modelos de redes neuronales se pueden configurar para tareas de clasificación de etiquetas múltiples.
- Cómo evaluar una red neuronal para la clasificación de etiquetas múltiples y hacer una predicción de nuevos datos.
Comencemos.
Clasificación de etiquetas múltiples con Aprendizaje profundo
Foto de Trevor Marron, algunos derechos reservados.
- Descripción general del tutorial
- Clasificación de etiquetas múltiples
- Redes neuronales para etiquetas múltiples
- Red neuronal para Clasificación de etiquetas múltiples
- Leer más
- Resumen
- ¡Desarrolla Proyectos de Aprendizaje Profundo con Python!
- Qué Pasaría Si Pudiera Desarrollar una Red en Minutos
- Finalmente, Lleve el Aprendizaje Profundo A Sus Propios Proyectos
Descripción general del tutorial
Este tutorial se divide en tres partes::
- Clasificación de etiquetas múltiples
- Redes Neuronales para Etiquetas múltiples
- Red Neuronal para Clasificación de etiquetas múltiples
Clasificación de etiquetas múltiples
La clasificación es un problema de modelado predictivo que implica la salida de una etiqueta de clase dada cierta entrada
predecir un valor numérico.
Normalmente, una tarea de clasificación implica predecir una sola etiqueta. Alternativamente, puede implicar predecir la probabilidad a través de dos o más etiquetas de clase. En estos casos, las clases son mutuamente excluyentes, lo que significa que la tarea de clasificación asume que la entrada pertenece a una sola clase.
Algunas tareas de clasificación requieren predecir más de una etiqueta de clase. Esto significa que las etiquetas de clase o la pertenencia a clase no son mutuamente excluyentes. Estas tareas se conocen como clasificación de etiquetas múltiples, o clasificación de etiquetas múltiples para abreviar.
En la clasificación de etiquetas múltiples, se requieren cero o más etiquetas como salida para cada muestra de entrada, y las salidas se requieren simultáneamente. La suposición es que las etiquetas de salida son una función de las entradas.
Podemos crear un conjunto de datos de clasificación de etiquetas múltiples sintético usando la función make_multilabel_classification () en la biblioteca scikit-learn.
Nuestro conjunto de datos tendrá 1000 muestras con 10 funciones de entrada. El conjunto de datos tendrá tres salidas de etiquetas de clase para cada muestra y cada clase tendrá uno o dos valores (0 o 1, por ejemplo, presente o no presente).
El ejemplo completo de creación y resumen del conjunto de datos de clasificación de etiquetas múltiples sintéticas se muestra a continuación.
1
2
3
4
5
6
7
8
9
|
# ejemplo de un multi-etiqueta de clasificación de la tarea
de sklearn.importar conjuntos de datos make_multilabel_classification
# definir conjunto de datos
X, y = make_multilabel_classification(n_samples=1000, n_features=10, n_classes=3, n_labels=2, random_state=1)
# resumir la forma del conjunto de datos
imprimir (X. forma, y.forma)
# resumir los primeros ejemplos
para i en rango(10):
impresión (X, y)
|
La ejecución del ejemplo crea el conjunto de datos y resume la forma de los elementos de entrada y salida.
Podemos ver que, como se esperaba, hay 1000 muestras, cada una con 10 funciones de entrada y tres funciones de salida.
Las primeras 10 filas de entradas y salidas se resumen y podemos ver que todas las entradas para este conjunto de datos son numéricas y que las etiquetas de clase de salida tienen 0 o 1 valores para cada una de las tres etiquetas de clase.
1
2
3
4
5
6
7
8
9
10
11
12
|
(1000, 10) (1000, 3)
|
a continuación, vamos a ver cómo podemos desarrollar modelos de red neuronal para multi-etiqueta de clasificación de las tareas.
Redes neuronales para etiquetas múltiples
Algunos algoritmos de aprendizaje automático admiten la clasificación de etiquetas múltiples de forma nativa.
Los modelos de redes neuronales se pueden configurar para admitir la clasificación de varias etiquetas y pueden funcionar bien, según las especificaciones de la tarea de clasificación.
Las redes neuronales pueden admitir la clasificación de etiquetas múltiples directamente simplemente especificando el número de etiquetas de destino que hay en el problema como el número de nodos en la capa de salida. Por ejemplo, una tarea que tiene tres etiquetas de salida (clases) requerirá una capa de salida de red neuronal con tres nodos en la capa de salida.
Cada nodo de la capa de salida debe usar la activación sigmoide. Esto predecirá una probabilidad de pertenencia a clase para la etiqueta, un valor entre 0 y 1. Finalmente, el modelo debe ajustarse a la función de pérdida de entropía cruzada binaria.
En resumen, para configurar un modelo de red neuronal para la clasificación de etiquetas múltiples, las especificaciones son:
- El número de nodos de la capa de salida coincide con el número de etiquetas.
- Activación Sigmoide para cada nodo de la capa de salida.
- Función de pérdida de entropía cruzada binaria.
Podemos demostrarlo utilizando la biblioteca de aprendizaje profundo de Keras.
Definiremos un modelo de Perceptrón Multicapa (MLP) para la tarea de clasificación de etiquetas múltiples definida en la sección anterior.
Cada muestra tiene 10 entradas y tres salidas; por lo tanto, la red requiere una capa de entrada que espere 10 entradas especificadas a través del argumento «input_dim» en la primera capa oculta y tres nodos en la capa de salida.
Usaremos la popular función de activación ReLU en la capa oculta. La capa oculta tiene 20 nodos que se eligieron después de un ensayo y error. Ajustaremos el modelo utilizando la pérdida de entropía cruzada binaria y la versión Adam del descenso de gradiente estocástico.
La definición de la red para la tarea de clasificación de etiquetas múltiples se muestra a continuación.
1
2
3
4
5
|
# definir el modelo de
modelo = Secuencial()
modelo.add(Dense (20, input_dim=n_inputs, kernel_initializer=’he_uniforme’, activation=’relu’))
modelo.modelo add (Dense (n_outputs, activation=’sigmoid’))
.compile (loss = ‘binary_crossentropy’, optimizer = ‘adam’)
|
Es posible que desee adaptar este modelo para su propia tarea de clasificación de etiquetas múltiples; por lo tanto, podemos crear una función para definir y devolver el modelo donde se proporciona el número de variables de entrada y salida como argumentos.
1
2
3
4
5
6
7
|
# obtener el modelo de
def get_model(n_inputs, n_outputs):
modelo = Secuencial()
modelo.add(Dense (20, input_dim=n_inputs, kernel_initializer=’he_uniforme’, activation=’relu’))
modelo.modelo add (Dense (n_outputs, activation=’sigmoid’))
.compile (loss = ‘binary_crossentropy’, optimizer = ‘adam’)
modelo de retorno
|
Ahora que estamos familiarizados con cómo definir un MLP para la clasificación de etiquetas múltiples, exploremos cómo se puede evaluar este modelo.
Red neuronal para Clasificación de etiquetas múltiples
Si el conjunto de datos es pequeño, es una buena práctica evaluar repetidamente los modelos de redes neuronales en el mismo conjunto de datos e informar el rendimiento medio en las repeticiones.
Esto se debe a la naturaleza estocástica del algoritmo de aprendizaje.
Además, es una buena práctica utilizar la validación cruzada k-fold en lugar de las divisiones de tren/prueba de un conjunto de datos para obtener una estimación imparcial del rendimiento del modelo al hacer predicciones sobre datos nuevos. Una vez más, solo si no hay demasiados datos que el proceso se puede completar en un tiempo razonable.
Teniendo esto en cuenta, evaluaremos el modelo MLP en la tarea de regresión de salida múltiple utilizando validación cruzada repetida de k-fold con 10 pliegues y tres repeticiones.
El modelo MLP predecirá la probabilidad para cada etiqueta de clase de forma predeterminada. Esto significa que predicen tres probabilidades para cada muestra. Estos se pueden convertir en etiquetas de clase nítidas redondeando los valores a 0 o 1. A continuación, podemos calcular la precisión de clasificación de las etiquetas de clase nítidas.
1
2
3
4
5
6
7
|
…
# haga una predicción en el conjunto de pruebas
yhat = modelo.predecir (X_test)
# probabilidades redondas a etiquetas de clase
yhat = yhat.round ()
# calcular precisión
acc = accuracy_score(y_test, yhat)
|
Los puntajes se recopilan y se pueden resumir reportando la media y la desviación estándar en todas las repeticiones y pliegues de validación cruzada.
La función evaluate_model () a continuación toma el conjunto de datos, evalúa el modelo y devuelve una lista de puntuaciones de evaluación, en este caso, puntuaciones de precisión.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
# evaluar un modelo de uso repetido k-fold cross-validation
def evaluate_model(X, y):
results = list()
n_inputs, n_outputs = X. shape, y. shape
# definir procedimiento de evaluación
cv = RepeatedKFold (n_splits = 10, n_repeats=3, random_state=1)
# enumerar pliegues
para train_ix, test_ix en cv.split(X):
# preparar los datos
X_train, X_test = X, X
y_train, y_test = y, y
# define modelo
modelo = get_model(n_inputs, n_outputs)
# modelo de ajuste
modelo.fit (X_train, y_train, verbose = 0, épocas=100)
# haga una predicción en el conjunto de pruebas
yhat = modelo.predecir (X_test)
# probabilidades redondas a etiquetas de clase
yhat = yhat.round ()
# calcular precisión
acc = accuracy_score (y_test, yhat)
# resultado de la tienda
imprimir (‘>%.3f ‘ % acc)
resultados.anexar (acc)
devuelve resultados
|
Luego podemos cargar nuestro conjunto de datos y evaluar el modelo e informar el rendimiento medio.
Uniendo esto, el ejemplo completo se muestra a continuación.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
# mlp para multi-etiqueta de clasificación
from numpy import media
from numpy import std
de sklearn.los conjuntos de datos importan make_multilabel_classification
desde sklearn.model_selection importar pliegos repetidos
de keras.los modelos importan secuenciales
desde keras.las capas importan densas
desde sklearn.métricas de importación accuracy_score
# obtener el conjunto de datos
def get_dataset():
X, y = make_multilabel_classification(n_samples=1000, n_features=10, n_classes=3, n_labels=2, random_state=1)
return X, y
# obtener el modelo de
def get_model(n_inputs, n_outputs):
modelo = Secuencial()
modelo.add(Dense (20, input_dim=n_inputs, kernel_initializer=’he_uniforme’, activation=’relu’))
modelo.modelo add (Dense (n_outputs, activation=’sigmoid’))
.compile(loss=’binary_crossentropy’, optimizer=’adam’)
modelo de retorno
# evaluar un modelo usando validación cruzada repetida de k-fold
def evaluate_model(X, y):
results = list()
n_inputs, n_outputs = X. forma, y.forma
# definir procedimiento de evaluación
cv = repetición de pliegues (n_splits = 10, n_repeats = 3, random_state=1)
# enumerar pliegues
para train_ix, test_ix en cv.split(X):
# preparar los datos
X_train, X_test = X, X
y_train, y_test = y, y
# define modelo
modelo = get_model(n_inputs, n_outputs)
# modelo de ajuste
modelo.fit (X_train, y_train, verbose = 0, épocas=100)
# haga una predicción en el conjunto de pruebas
yhat = modelo.predecir (X_test)
# probabilidades redondas a etiquetas de clase
yhat = yhat.round ()
# calcular precisión
acc = accuracy_score (y_test, yhat)
# resultado de la tienda
imprimir (‘>%.3f ‘ % acc)
resultados.append(acc)
devolver resultados
# cargar conjunto de datos
X, y = get_dataset()
# evaluar el modelo de
resultados = evaluate_model(X, y)
# resumir el rendimiento
print(‘Precisión: %.3f (%.3f) ‘ % (media (resultados), ets (resultados)))
|
Al ejecutar el ejemplo, se informa de la precisión de clasificación para cada pliegue y cada repetición, para dar una idea del progreso de la evaluació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.
Al final, se reporta la exactitud de la media y la desviación estándar. En este caso, se demuestra que el modelo alcanza una precisión de aproximadamente el 81,2 por ciento.
Puede usar este código como plantilla para evaluar modelos MLP en sus propias tareas de clasificación de etiquetas múltiples. El número de nodos y capas del modelo se puede adaptar y adaptar fácilmente a la complejidad de su conjunto de datos.
1
2
3
4
5
6
7
|
…
>0.780
>0.820
>0.790
>0.810
>0.840
Precisión: 0.812 (0.032)
|
Una vez que se elige una configuración de modelo, podemos usarla para ajustar un modelo final a todos los datos disponibles y hacer una predicción de nuevos datos.
El ejemplo siguiente demuestra esto ajustando primero el modelo MLP en todo el conjunto de datos de clasificación de etiquetas múltiples y, a continuación, llamando a la función predict() en el modelo guardado para hacer una predicción para una nueva fila de datos.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
# el uso de mlp para la predicción en la clasificación de etiquetas múltiples
de numpy import asarray
de sklearn.los conjuntos de datos importan make_multilabel_classification
de keras.los modelos importan secuenciales
desde keras.capas de importación Denso
# obtener el conjunto de datos
def get_dataset():
X, y = make_multilabel_classification(n_samples=1000, n_features=10, n_classes=3, n_labels=2, random_state=1)
return X, y
# obtener el modelo de
def get_model(n_inputs, n_outputs):
modelo = Secuencial()
modelo.add(Dense (20, input_dim=n_inputs, kernel_initializer=’he_uniforme’, activation=’relu’))
modelo.modelo add (Dense (n_outputs, activation=’sigmoid’))
.compile (loss=’binary_crossentropy’, optimizer=’adam’)
return model
# load dataset
X, y = get_dataset ()
n_inputs, n_outputs = X. shape, y.shape
# get model
model = get_model (n_inputs, n_outputs)
# ajustar el modelo a todos los datos
modelo.ajuste (X,y, detallado = 0, épocas=100)
# haga una predicción de nuevos datos
row =
newX = asarray ()
yhat = model.predecir(newX)
print(‘Pronosticado: %s’ % yhat)
|
la Ejecución del ejemplo se ajusta al modelo y hace una predicción para una nueva fila. Como era de esperar, la predicción contiene tres variables de salida necesarias para la tarea de clasificación de etiquetas múltiples: las probabilidades de cada etiqueta de clase.
1
|
Predijo:
|
Leer más
Esta sección proporciona más recursos sobre el tema si usted está buscando para ir más profundo.
- Clasificación de etiquetas múltiples, Wikipedia.
- sklearn.DataSet.API make_multilabel_classification.
- Página de inicio de Keras.
- sklearn.selección de modelo.API de plegado reforzado repetido.
Resumen
En este tutorial, descubriste cómo desarrollar modelos de aprendizaje profundo para la clasificación de etiquetas múltiples.
Específicamente, aprendiste:
- La clasificación de etiquetas múltiples es una tarea de modelado predictivo que implica predecir cero o más etiquetas de clase no exclusivas entre sí.
- Los modelos de redes neuronales se pueden configurar para tareas de clasificación de etiquetas múltiples.
- Cómo evaluar una red neuronal para la clasificación de etiquetas múltiples y hacer una predicción de nuevos datos.
¿tiene alguna pregunta?
Haga sus preguntas en los comentarios a continuación y haré todo lo posible para responder.
¡Desarrolla Proyectos de Aprendizaje Profundo con Python!
Qué Pasaría Si Pudiera Desarrollar una Red en Minutos
…con solo unas pocas líneas de Python
Descubra cómo en mi nuevo libro electrónico:
Aprendizaje profundo con Python
Cubre proyectos de extremo a extremo sobre temas como:
Perceptrones Multicapa, Redes Convolucionales y Redes Neuronales Recurrentes, y más…
Finalmente, Lleve el Aprendizaje Profundo A
Sus Propios Proyectos
Omita los Aspectos Académicos. Sólo Resultados.
Ver Lo que hay Dentro