Ho un problema di classificazione con dati altamente squilibrati. Ho letto che il sovracampionamento, il sottocampionamento e la modifica dei costi per risultati categorici sottorappresentati porteranno a un adattamento migliore. Prima che ciò avvenisse, Tensorflow avrebbe classificato ogni input come gruppo di maggioranza (e avrebbe ottenuto una precisione superiore al 90%, per quanto insignificante).
Ho notato che il registro della percentuale inversa di ciascun gruppo ha creato il miglior moltiplicatore che ho provato. Esiste una manipolazione più standard per la funzione di costo? Questo è implementato correttamente?
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)