Datos desequilibrados y entropía cruzada ponderada


Estoy tratando de entrenar una red con datos desequilibrados. Tengo A (198 muestras), B (436 muestras), C (710 muestras), D (272 muestras) y he leído sobre el "weighted_cross_entropy_with_logits", pero todos los ejemplos que encontré son para la clasificación binaria, así que no estoy muy seguro de cómo establecer esos pesos.

Muestras totales: 1616

A_weight: 198/1616 = 0.12?

La idea detrás, si he entendido, es penalizar los errores de la clase mayoritaria y valorar más positivamente los éxitos en la minoría, ¿verdad?

Mi pieza de código:

weights = tf.constant([0.12, 0.26, 0.43, 0.17])
cost = tf.reduce_mean(tf.nn.weighted_cross_entropy_with_logits(logits=pred, targets=y, pos_weight=weights))

He leído este y otros ejemplos con clasificación binaria pero todavía no muy claro.

Gracias de antemano.

Author: P-Gn, 2017-06-15

1 answers

Tenga en cuenta que weighted_cross_entropy_with_logits es la variante ponderada de sigmoid_cross_entropy_with_logits. La entropía cruzada sigmoide se usa típicamente para la clasificación binaria. Sí, puede manejar múltiples etiquetas, pero la entropía cruzada sigmoide básicamente toma una decisión (binaria) sobre cada una de ellas?por ejemplo, para una red de reconocimiento facial, esas etiquetas (no mutuamente excluyentes) podrían ser " ¿El sujeto usa gafas?", "¿El sujeto es femenino?", etc.

En la(s) clasificación (es) binaria (s), cada canal de salida corresponde a una decisión binaria (suave). Por lo tanto, la ponderación debe ocurrir dentro del cálculo de la pérdida. Esto es lo que hace weighted_cross_entropy_with_logits, al ponderar un término de la entropía cruzada sobre el otro.

En la clasificación multilabel mutuamente excluyente, usamos softmax_cross_entropy_with_logits, que se comporta de manera diferente: cada canal de salida corresponde a la puntuación de un candidato de clase. La decisión viene después de, comparando las salidas respectivas de cada canal.

Ponderación en antes la decisión final es, por lo tanto, una simple cuestión de modificar las puntuaciones antes de compararlas, típicamente por multiplicación con pesos. Por ejemplo, para una tarea de clasificación ternaria,

# your class weights
class_weights = tf.constant([[1.0, 2.0, 3.0]])
# deduce weights for batch samples based on their true label
weights = tf.reduce_sum(class_weights * onehot_labels, axis=1)
# compute your (unweighted) softmax cross entropy loss
unweighted_losses = tf.nn.softmax_cross_entropy_with_logits(onehot_labels, logits)
# apply the weights, relying on broadcasting of the multiplication
weighted_losses = unweighted_losses * weights
# reduce the result to get your final loss
loss = tf.reduce_mean(weighted_losses)

También puede confiar en tf.losses.softmax_cross_entropy para manejar los últimos tres pasos.

En su caso, cuando necesite abordar el desequilibrio de datos, los pesos de clase podrían ser inversamente proporcionales a su frecuencia en sus datos de tren. Normalizarlos para que sumen a uno o al número de las clases también tienen sentido.

Tenga en cuenta que en lo anterior, penalizamos la pérdida basada en la etiqueta verdadera de las muestras. También podríamos haber penalizado la pérdida basada en las etiquetas estimadas simplemente definiendo

weights = class_weights

Y el resto del código no necesita cambiar gracias a broadcasting magic.

En el caso general, querrías pesos que dependan del tipo de error que cometas. En otras palabras, para cada par de etiquetas X y Y, puede elegir cómo penaliza la elección de etiqueta X cuando la etiqueta verdadera es Y. Terminas con una matriz de peso anterior completa, lo que resulta en weights anterior siendo un tensor completo (num_samples, num_classes). Esto va un poco más allá de lo que desea, pero podría ser útil saber, sin embargo, que solo su definición del tensor de peso necesita cambiar en el código anterior.

 43
Author: P-Gn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-15 09:53:29