Mam problem z klasyfikacją bardzo niezrównoważonych danych. Przeczytałem, że nadmierne i niepełne próbkowanie, a także zmiana kosztu niedostatecznie reprezentowanych wyników kategorycznych doprowadzą do lepszego dopasowania. Zanim to nastąpi, tensorflow klasyfikuje każde wejście jako grupę większościową (i zyskuje ponad 90% dokładności, jakkolwiek to bez znaczenia).
Zauważyłem, że log odwrotnej wartości procentowej każdej grupy jest najlepszym mnożnikiem, jakiego próbowałem. Czy istnieje bardziej standardowa manipulacja dla funkcji kosztu? Czy to jest poprawnie zaimplementowane?
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)