Eu tenho um problema de classificação com dados altamente desequilibrados. Li que a sobredimensionagem e a subamostragem, bem como a alteração do custo de resultados categóricos sub-representados, levarão a um melhor ajuste. Antes disso, o tensorflow categorizava cada entrada como o grupo majoritário (e ganha mais de 90% de precisão, por menos que seja isso).
Percebi que o log da porcentagem inversa de cada grupo foi o melhor multiplicador que tentei. Existe uma manipulação mais padrão para a função de custo? Isso foi implementado corretamente?
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)