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)
tensorflow
loss-function
Kapusta
źródło
źródło
Odpowiedzi:
To wydaje się dobrym rozwiązaniem dla funkcji straty. Miałem ostatnio sukces z podobnym podejściem, ale myślę, że chcesz zmienić kolejność w miejscu, w którym się pomnażasz
class_weight
.Myśląc logicznie,
class_weight
będzie to ciągła wartość wyjściowa, więc będzie przenoszona i stosowana do gradientu w ten sam sposób, w jaki jest stosowana do funkcji kosztu. Jest jednak jeden problem.Twój sposób
class_weight
wpłynie na wartość prognozy. Ale chcesz, aby wpłynęło to na skalę gradientu. Jeśli się nie mylę, myślę, że chcesz odwrócić kolejność operacji:Byłbym bardzo zainteresowany, aby dowiedzieć się, jak to działa w porównaniu do zwykłego nadpróbkowania niedostatecznie reprezentowanej klasy, co jest bardziej typowe. Więc jeśli zdobędziesz trochę wglądu, opublikuj post na ten temat! :)
Co ciekawe niedawno z powodzeniem zastosowałem bardzo podobną technikę w innej dziedzinie problemowej (co doprowadziło mnie do tego postu):
Uczenie się wielozadaniowe, znajdowanie funkcji straty, która „ignoruje” niektóre próbki
źródło
Zamówienie
tf.nn.weighted_cross_entropy_with_logits()
:To powinno pozwolić ci robić, co chcesz.
źródło
Mam 2 różne implementacje:
Tam, gdzie klasa_waga jest symbolem zastępczym, wypełniam każdą iterację każdej partii.
Tam, gdzie używam zaimplementowanej funkcji tensorflow, ale muszę obliczyć wagi dla partii. Dokumenty są nieco zagmatwane. Są dwa sposoby, aby to zrobić za pomocą tf.gather lub w ten sposób:
tutaj jest miła dyskusja na ten temat
I w końcu, ponieważ nie chciałem żenić się z żadną z implemetnacji na stałe, dodałem trochę tf.case i przekazuję czas szkolenia na strategię, której chcę użyć.
źródło