Wiem, że w Keras istnieje możliwość class_weights
dopasowania słownika parametrów, ale nie znalazłem żadnego przykładu. Czy ktoś byłby tak miły, aby go zapewnić?
Nawiasem mówiąc, w tym przypadku właściwą praktyką jest po prostu ważenie klasy mniejszości proporcjonalnie do jej niedostatecznej reprezentacji?
classification
keras
weighted-data
Hendrik
źródło
źródło
Odpowiedzi:
Jeśli mówisz o zwykłym przypadku, w którym twoja sieć wytwarza tylko jeden wynik, twoje założenie jest prawidłowe. Aby zmusić algorytm do traktowania każdej instancji klasy 1 jako 50 instancji klasy 0 , musisz:
Zdefiniuj słownik za pomocą etykiet i powiązanych z nimi wag
Podaj słownik jako parametr:
EDYCJA: „traktuj każdą instancję klasy 1 jako 50 instancji klasy 0 ” oznacza, że w funkcji straty przypisujesz wyższą wartość do tych instancji. Stąd utrata staje się średnią ważoną, gdzie waga każdej próbki jest określona przez class_weight i odpowiadającą jej klasę.
Z dokumentacji Keras: class_weight : Opcjonalne słownikowe mapowanie indeksów klas (liczb całkowitych) na wartość wagi (liczby zmiennoprzecinkowej), używane do ważenia funkcji straty (tylko podczas treningu).
źródło
Można po prostu wdrożyć
class_weight
odsklearn
:Najpierw zaimportujmy moduł
Aby obliczyć masę klasy, wykonaj następujące czynności
Po trzecie i na koniec dodaj go do dopasowania modelu
Uwaga : Zredagowałem ten post i zmieniłem nazwę zmiennej z class_weight na class_weight s , aby nie zastępować importowanego modułu. Dostosuj odpowiednio podczas kopiowania kodu z komentarzy.
źródło
class_weight.compute_class_weight
tworzy tablicę, muszę zmienić ją na dyktę, aby móc pracować z Keras. Mówiąc dokładniej, po kroku 2 użyjclass_weight_dict = dict(enumerate(class_weight))
y_train
jest(300096, 3)
tablica numpy. Więcclass_weight=
wiersz daje mi TypeError: unhashable type: 'numpy.ndarray'y_ints = [y.argmax() for y in y_train]
.Używam tego rodzaju reguły do
class_weight
:math.log
wygładza ciężary dla bardzo niezrównoważonych klas! Zwraca to:źródło
n_total_samples / n_class_samples
dla każdej klasy.UWAGA: patrz komentarze, ta odpowiedź jest nieaktualna.
Aby zrównoważyć wszystkie klasy, możesz teraz po prostu ustawić class_weight na „auto” w następujący sposób:
źródło
class_weight='auto'
w dokumentacji Keras ani w kodzie źródłowym. Czy możesz nam pokazać, gdzie to znalazłeś?class_weight
i nie będzie to miało żadnego efektu. Ta odpowiedź jest zatem nieprawidłowa.class_weight jest w porządku, ale jak powiedział @Aalok, to nie zadziała, jeśli jesteś klasą z kilkoma znakami. W takim przypadku użyj sample_weight :
sample_weights służy do podania masy każdej próbki treningowej . Oznacza to, że powinieneś przekazać tablicę 1D z taką samą liczbą elementów jak twoje próbki treningowe (wskazując wagę każdej z tych próbek).
class_weights służy do zapewnienia wagi lub odchylenia dla każdej klasy wyjściowej . Oznacza to, że powinieneś przekazać wagę każdej klasie, którą próbujesz sklasyfikować.
sample_weight musi otrzymać tablicę numpy, ponieważ jego kształt zostanie oceniony.
Zobacz także tę odpowiedź: https://stackoverflow.com/questions/48315094/using-sample-weight-in-keras-for-sequence-labelling
źródło
Dodanie do rozwiązania na https://github.com/keras-team/keras/issues/2115 . Jeśli potrzebujesz więcej niż ważenia klasowego, w którym potrzebujesz różnych kosztów dla fałszywie dodatnich i fałszywych negatywów. Dzięki nowej wersji keras możesz teraz zastąpić odpowiednią funkcję utraty, jak podano poniżej. Zauważ, że
weights
jest to macierz kwadratowa.źródło
Znalazłem następujący przykład kodowania wag klas w funkcji straty przy użyciu zestawu danych minist. Zobacz link tutaj: https://github.com/keras-team/keras/issues/2115
źródło
Działa to z generatorem lub standardem. Twoja największa klasa będzie miała wagę 1, podczas gdy inne będą miały wartości większe niż 1 w stosunku do największej klasy.
klasy wag akceptuje dane wejściowe typu słownikowego
źródło