Я знаю, что в Керасе есть возможность при подборе class_weights
словаря параметров, но я не смог найти ни одного примера. Будет ли кто-то так любезно предоставить?
Кстати, в этом случае подходящей практикой является просто взвесить класс меньшинства пропорционально его недопредставленности?
classification
keras
weighted-data
Хендрик
источник
источник
Ответы:
Если вы говорите о обычном случае, когда ваша сеть производит только один вывод, то ваше предположение верно. Чтобы заставить ваш алгоритм обрабатывать каждый экземпляр класса 1 как 50 экземпляров класса 0, вы должны:
Определите словарь с вашими ярлыками и их весом
Подать словарь в качестве параметра:
РЕДАКТИРОВАТЬ: «обрабатывать каждый экземпляр класса 1 как 50 экземпляров класса 0 » означает, что в вашей функции потерь вы присваиваете этим значениям более высокое значение. Следовательно, потеря становится средневзвешенной величиной , где вес каждой выборки определяется class_weight и соответствующим классом.
От Keras docs: class_weight : Необязательный словарь, отображающий индексы класса (целые числа) в значение веса (с плавающей запятой), используемое для взвешивания функции потерь (только во время обучения).
источник
Вы можете просто реализовать
class_weight
изsklearn
:Давайте сначала импортируем модуль
Чтобы рассчитать вес класса, сделайте следующее
В-третьих, и, наконец, добавьте его в примерку модели.
Внимание : я отредактировал этот пост и изменил имя переменной с class_weight на class_weight s , чтобы не перезаписывать импортированный модуль. Отрегулируйте соответственно при копировании кода из комментариев.
источник
class_weight.compute_class_weight
производит массив, мне нужно изменить его на dict, чтобы работать с Keras. Более конкретно, после шага 2 используйтеclass_weight_dict = dict(enumerate(class_weight))
y_train
есть(300096, 3)
массив numy. Таким образом,class_weight=
строка дает мне TypeError: unhashable type: 'numpy.ndarray'y_ints = [y.argmax() for y in y_train]
.Я использую это правило для
class_weight
:math.log
сглаживает веса для очень несбалансированных классов! Это возвращает:источник
n_total_samples / n_class_samples
для каждого класса.ПРИМЕЧАНИЕ: см. Комментарии, этот ответ устарел.
Чтобы одинаково взвешивать все классы, теперь вы можете просто установить class_weight в "auto" следующим образом:
источник
class_weight='auto'
ни в документации Keras, ни в исходном коде. Можете ли вы показать нам, где вы нашли это?class_weight
и это не будет иметь никакого эффекта. Поэтому этот ответ не является правильным.class_weight это хорошо, но, как сказал @Aalok, это не сработает, если вы используете горячее кодирование многослойных классов. В этом случае используйте sample_weight :
sample_weights используется для предоставления веса для каждого обучающего образца . Это означает, что вы должны передать одномерный массив с тем же количеством элементов, что и у ваших тренировочных выборок (с указанием веса для каждой из этих выборок).
class_weights используется для предоставления веса или смещения для каждого выходного класса . Это означает, что вы должны передать вес для каждого класса, который вы пытаетесь классифицировать.
sample_weight должен содержать массив numpy, так как его форма будет оценена.
Смотрите также этот ответ: https://stackoverflow.com/questions/48315094/using-sample-weight-in-keras-for-sequence-labelling
источник
Добавление к решению на https://github.com/keras-team/keras/issues/2115 . Если вам нужно больше, чем взвешивание класса, где вы хотите разные затраты для ложных срабатываний и ложных отрицаний. С новой версией keras теперь вы можете просто переопределить соответствующую функцию потерь, как указано ниже. Обратите внимание, что
weights
это квадратная матрица.источник
Я нашел следующий пример кодирования весов классов в функции потерь с использованием набора данных minist. Смотрите ссылку здесь: https://github.com/keras-team/keras/issues/2115
источник
Это работает с генератором или стандартом. Ваш самый большой класс будет иметь вес 1, в то время как другие будут иметь значения больше 1 относительно самого большого класса.
Вес класса принимает входные данные типа словаря
источник