Cómo implementar el aprendizaje sensible al costo en TensorFlow para penalizar la clasificación errónea en clases minoritarias (los datos tienen un problema de desequilibrio de clase)

Para ajustar su pérdida con respecto a cada clase de salida, puede multiplicar los logits con un vector de peso que representa el factor de escala para cada clase. Digamos que sus datos tienen 40% de muestras para cada una de las dos clases mayoritarias y 10% de muestras para cada una de las dos clases minoritarias. Luego puede configurar su vector de peso de la clase de la siguiente manera:

class_weight = tf.constant ([0.1, 0.1, 0.4, 0.4])

Ahora necesita simplemente multiplicar los logits con los pesos de las clases para escalar las predicciones para cada clase. Es decir, disminuirá la pérdida para las clases mayoritarias y aumentará la pérdida para las clases minoritarias.

logits = … # forma: [lote_tamaño, 4]
scaled_logits = tf.mul (logits, class_weight) # forma [lote_tamaño, 4]
pérdida = tf.nn.softmax_cross_entropy_with_logits (weighted_logits, etiquetas)

También puede usar la función estándar de un TF que le permite ajustar su pérdida con respecto a cada muestra en su lote. Tenga en cuenta que para esta función, en lugar de definir el vector de peso para cada clase, debe definirlo para cada muestra de su lote.
tf.losses.softmax_cross_entropy | TensorFlow

Si está particularmente preocupado por penalizar las clasificaciones erróneas, consulte esta respuesta sobre un problema pertinente de Keras:
¿Hay alguna forma en Keras de aplicar diferentes pesos a una función de costo? · Edición # 2115 · fchollet / keras