45 votos

¿Cómo configurar una red neuronal para obtener datos ordinales?

Tengo una red neuronal configurada para predecir algo donde la variable de salida es ordinal. Voy a describir a continuación utilizando tres posibles salidas A < B < C.

Es bastante obvio cómo utilizar una red neuronal para dar salida a datos categóricos: la salida es simplemente un softmax de la última capa (normalmente totalmente conectada), una por categoría, y la categoría predicha es la que tiene el mayor valor de salida (este es el valor por defecto en muchos modelos populares). He utilizado la misma configuración para los valores ordinales. Sin embargo, en este caso las salidas a menudo no tienen sentido, por ejemplo las salidas de la red para A y C son altas pero B es baja: esto no es plausible para los valores ordinales.

Tengo una idea para esto, que es calcular la pérdida basada en la comparación de las salidas con 1 0 0 para A, 1 1 0 para B, y 1 1 1 para C. Los umbrales exactos se pueden ajustar más tarde utilizando otro clasificador (por ejemplo, bayesiano), pero esto parece capturar la idea esencial de un ordenamiento de las entradas, sin prescribir ninguna escala de intervalo específico.

¿Cuál es la forma estándar de resolver este problema? ¿Hay alguna investigación o referencia que describa los pros y los contras de los diferentes enfoques?

32voto

Paul Hinett Puntos 630

Creo que lo que hace la mayoría de la gente es tratar simplemente la clasificación ordinal como una clasificación genérica de varias clases. Así, si tienen $K$ clases, tendrán $K$ salidas, y simplemente utilizar la entropía cruzada como pérdida.

Pero algunas personas han logrado inventar una codificación inteligente para sus clases ordinales (ver esto respuesta de stackoverflow ). Es una especie de codificación de una sola vez,

  • la clase 1 se representa como [0 0 0 0 ...]

  • la clase 2 se representa como [1 0 0 0 ...]

  • la clase 3 se representa como [1 1 0 0 ...]

es decir, cada neurona predice la probabilidad $P(\hat y < k)$ . Todavía tienes que usar una sigmoide como función de activación, pero creo que esto ayuda a la red a entender cierta continuidad entre las clases, no lo sé. Después, se hace un post-procesamiento ( np.sum ) para convertir la salida binaria en sus clases.

Esta estrategia se asemeja al conjunto de Frank y Hall y creo que esto es la primera publicación de los mismos.

13voto

thijsvdp Puntos 21

Creo que el enfoque de codificar sólo las etiquetas ordinales como

  • la clase 1 se representa como [0 0 0 0 ...]

  • la clase 2 se representa como [1 0 0 0 ...]

  • la clase 3 se representa como [1 1 0 0 ...]

y utilizar la entropía cruzada binaria como función de pérdida es subóptima. Como se menciona en los comentarios, puede ocurrir que el vector predicho sea, por ejemplo, [1 0 1 0 ...]. Esto no es deseable para hacer predicciones.

El papel Regresión ordinal coherente con el rango para redes neuronales describe cómo restringir la red neuronal para que haga predicciones coherentes con el rango. Tienes que asegurarte de que la última capa comparte sus pesos, pero debe tener diferentes sesgos. Puedes implementar esto en Tensorflow añadiendo lo siguiente como la última parte de la red (créditos para https://stackoverflow.com/questions/59656313/how-to-share-weights-and-not-biases-in-keras-dense-layers ):

class BiasLayer(tf.keras.layers.Layer):
    def __init__(self, units, *args, **kwargs):
        super(BiasLayer, self).__init__(*args, **kwargs)
        self.bias = self.add_weight('bias',
                                    shape=[units],
                                    initializer='zeros',
                                    trainable=True)

    def call(self, x):
        return x + self.bias

# Add the following as the output of the Sequential model
model.add(keras.layers.Dense(1, use_bias=False))
model.add(BiasLayer(4))
model.add(keras.layers.Activation("sigmoid"))

Obsérvese que el número de clases ordinales aquí es de 5, de ahí que el $K-1$ sesgos.

He comprobado la diferencia de rendimiento con datos reales y la precisión de la predicción ha mejorado sustancialmente. Espero que esto ayude.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X