J'ai un problème de classification avec des données très déséquilibrées. J'ai lu que le suréchantillonnage et le sous-échantillonnage ainsi que la modification du coût des extrants catégoriels sous-représentés conduiront à un meilleur ajustement. Avant cela, tensorflow catégoriserait chaque entrée comme le groupe majoritaire (et gagnerait plus de 90% de précision, aussi insignifiant que cela soit).
J'ai remarqué que le logarithme du pourcentage inverse de chaque groupe a fait le meilleur multiplicateur que j'ai essayé. Existe-t-il une manipulation plus standard pour la fonction de coût? Est-ce mis en œuvre correctement?
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)