Tengo un problema de clasificación con datos altamente desequilibrados. He leído que sobremuestrear y submuestrear, así como cambiar el costo de resultados categóricos subrepresentados, conducirá a una mejor adaptación. Antes de que esto se hiciera, tensorflow clasificaría cada entrada como el grupo mayoritario (y obtendría más del 90% de precisión, por insignificante que sea).
He notado que el registro del porcentaje inverso de cada grupo ha hecho el mejor multiplicador que he probado. ¿Existe una manipulación más estándar para la función de costo? ¿Se implementa esto correctamente?
from collections import Counter
counts = Counter(category_train)
weightsArray =[]
for i in range(n_classes):
weightsArray.append(math.log(category_train.shape[0]/max(counts[i],1))+1)
class_weight = tf.constant(weightsArray)
weighted_logits = tf.mul(pred, class_weight)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(weighted_logits, y))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)