Функция потерь для несбалансированного мультиклассового классификатора в Керасе - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь применить глубокое обучение к проблеме классификации нескольких классов с высоким дисбалансом класса между целевыми классами (10K, 500K, 90K, 30K).Я хочу написать пользовательскую функцию потерь.Это моя текущая модель:

model = Sequential()

model.add(LSTM(
                units=10, # number of units returned by LSTM
                return_sequences=True, 
                input_shape=(timestamps,nb_features),
                dropout=0.2, 
                recurrent_dropout=0.2
              )
         )

model.add(TimeDistributed(Dense(1)))

model.add(Dropout(0.2))

model.add(Flatten())

model.add(Dense(units=nb_classes,
               activation='softmax'))

model.compile(loss="categorical_crossentropy",
              metrics = ['accuracy'],
              optimizer='adadelta')

К сожалению, все прогнозы относятся к 1 классу !!!Модель всегда предсказывает 1 для любого ввода ...

Оцените любые указания на то, как я могу решить эту задачу.

Обновление:

Размерывходные данные:

94981 train sequences
29494 test sequences
X_train shape: (94981, 20, 18)
X_test shape: (29494, 20, 18)
y_train shape: (94981, 4)
y_test shape: (29494, 4)

В основном в данных поезда у меня 94981 выборка.Каждый образец содержит последовательность из 20 временных меток.Есть 18 функций.

Дисбаланс между целевыми классами (10К, 500К, 90К, 30К) является лишь примером.У меня схожие пропорции в моем реальном наборе данных.

enter image description here

enter image description here

1 Ответ

0 голосов
/ 07 февраля 2019

Прежде всего, у вас есть ~ 100 тыс. Образцов.Начните с чего-то меньшего, например со 100 выборок и нескольких эпох, и посмотрите, подходит ли ваша модель к этому меньшему набору обучающих данных (если это невозможно, у вас либо ошибка в коде, либо модель не способна моделировать зависимости [я быперейти ко второму случаю]).Серьезно, начни с этого.И помните о представлении всех ваших классов в этом небольшом наборе данных.

Во-вторых, скрытый размер LSTM может быть слишком мал, у вас есть 18 функций для каждой последовательности, а последовательности имеют длину 20, а скрытые - только 10И вы применяете dropout, чтобы завершить его и еще более упорядочить сеть.

Кроме того, вы можете добавить несколько плотных выходных единиц вместо простого возврата линейного слоя размера 10 x 1 для каждой временной отметки.

И последнее, но не менее важное: вы можете увеличить выборку недостаточно представленных данных.0 class нужно будет повторить, скажем, 50 раз (или, может быть, 25), class 2 что-то около 4 раз, а ваше - около 10-15 раз, поэтому сеть обучается им.

О, ииспользуйте перекрестную проверку для ваших гиперпараметров, таких как скрытый размер, количество плотных единиц и т. д.

Кроме того, я не знаю, сколько эпох вы обучали этой сети, каков ваш набор тестовых данных (этоВполне возможно, что это только первый класс, если вы не сделали стратификацию).

Я думаю, что это поможет вам начать, заставьте меня сомневаться в комментариях.

РЕДАКТИРОВАТЬ: Когда дело доходит до метрик, вы можете проверить что-то другое, чем просто точность;может быть, оценка F1 и ваш мониторинг потерь + точность, чтобы увидеть, как это работает.Есть и другие доступные варианты, для вдохновения вы можете проверить документацию sklearn , поскольку они предоставляют довольно много вариантов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...