Вопрос или проблема
Я пытаюсь сделать простой проект на Keras с полносвязными слоями для бинарной классификации. Примерно 300000 строк данных, метки такие
training_set['TARGET'].value_counts()
0 282686
1 24825
Моя модель выглядит следующим образом
def build_model():
model = models.Sequential()
model.add(layers.Dense(64, activation='relu', kernel_regularizer=regularizers.l2(0.001),
input_shape=(train_data.shape[1],)))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(32, kernel_regularizer=regularizers.l2(0.001), activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(optimizer="rmsprop",
loss="binary_crossentropy",
metrics=['accuracy'])
return model
Это бинарная классификация, которая заканчивается сигмоидой. Я понимаю, что должен получать значения, близкие к 0 или близкие к 1? Я пробовал разные архитектуры модели, гиперпараметры, эпохи, размеры батчей и т. д., но когда я запускаю model.predict на своем валидационном наборе, мои значения никогда не превышают 0.5. Вот несколько примеров.
20 эпох, размер батча 16384
макс 0.458850622177124, мин 0.1022530049085617
макс 0.47131556272506714, мин 0.057787925004959106
20 эпох, размер батча 8192
макс 0.42957592010498047, мин 0.060324762016534805
макс 0.3811708390712738, мин 0.022215187549591064
20 эпох, размер батча 4096
макс 0.3163970410823822, мин 0.0657803937792778
20 эпох, размер батча 2048
макс 0.21799422800540924, мин 0.03832605481147766
Является ли это показателем того, что я делаю что-то неправильно?
Я думаю, что дропаут немного высок, и если это бинарная классификация, то почему в конце один единственный узел?
Использовать сигмоиду для бинарной классификации абсолютно нормально. Так что ответ, предоставленный ниже, неуместен.
Убедитесь, что ваша целевая переменная имеет правильную форму в случае softmax…(one hot/ to_categorical()
)
def build_model():
model = models.Sequential()
model.add(layers.Dense(64, activation='relu', kernel_regularizer=regularizers.l2(0.001),
input_shape=(train_data.shape[1],)))
model.add(layers.Dropout(0.3))
model.add(layers.Dense(32, kernel_regularizer=regularizers.l2(0.001), activation='relu'))
model.add(layers.Dropout(0.3))
model.add(layers.Dense(**num_classes**, activation='softmax'))
model.compile(optimizer="rmsprop",
loss="binary_crossentropy",
metrics=['accuracy'])
return model
Чтобы улучшить это дальше, вам нужно использовать некоторые техники, такие как кросс-валидация, нормализация батчей и увеличение количества эпох (возможно).
Напротив предыдущего ответа, я бы сказал, что ваша конфигурация выходного слоя правильная, хотя я согласен с предыдущим ответом относительно того, что ваш дропаут слишком высок. Дропаута в 0.5 означает, что 50% ваших нейронов будут отброшены, так что по сути вы отбрасываете половину своих нейронов в слое, что, в свою очередь, значит, что ваша модель не сможет многому научиться.
Другой момент, который я хотел бы упомянуть, заключается в том, что вам следует использовать adam
в качестве оптимизатора, так как он чаще дает лучшие результаты.
В кратце, чтобы улучшить свою точность, проведите настройку гиперпараметров для таких вещей, как количество слоев, количество нейронов, оптимизатор, скорость обучения, активационная функция, размер батча, эпохи и т. д. Используйте RandomizedSearchCV
для этой цели.
Ответ или решение
Если ваш DNN (глубокая нейронная сеть) в Keras для бинарной классификации, использующий сигмоидальную активацию на выходном слое, производит предсказания, которые находятся в диапазоне ниже 0.5, это может указывать на несколько проблем, которые следует учитывать:
-
Несбалансированные данные: Из вашего описания видно, что классы в вашем наборе данных несбалансированы (примерно 282686 экземпляров класса 0 и 24825 экземпляров класса 1). Это может привести к тому, что модель будет иметь предвзятость к более частому классу (классу 0). Это может быть одной из причин, по которой модель предсказывает значения, которые в большинстве своем ближе к 0. Вы можете рассмотреть возможность применения методов уравновешивания, таких как увеличение выборки для меньшего класса или уменьшение выборки для более частого класса.
-
Параметры модели: Вы используете высокий уровень дропаута (0.5), что может привести к потере значительного количества информации. Это может мешать модели обучаться эффективно. Рекомендуется попробовать уменьшить уровень дропаута до 0.3 или даже 0.2 и посмотреть на результаты.
-
Оптимизатор и настройки гиперпараметров: Вы используете оптимизатор RMSprop, который может не быть самым эффективным для вашей задачи. Попробуйте использовать оптимизатор Adam, который обычно дает лучшие результаты в большинстве задач, связанных с обучением нейронных сетей. Также важно провести настройку гиперпараметров, таких как скорость обучения, количество эпох, размер мини-батча и архитектура сети.
-
Обработка целевых переменных: Убедитесь, что ваши целевые переменные правильно закодированы (например, 0 и 1 для бинарной классификации). Если вы по ошибке используете бинарную кросс-энтропию и однослойный выход (как вы и делаете), это должно быть корректно. Однако, если вы меняете архитектуру для мультиклассовой классификации, используйте функцию потерь categorical_crossentropy с соответствующим количеством выходных нейронов и активацией softmax.
-
Дополнительные методы: Рассмотрите возможность применения таких методов, как кросс-валидация, нормализация батчей и увеличение количества эпох. Эти методы могут также помочь улучшить обобщающую способность и стабильность вашей модели.
Важно также постоянно отслеживать метрики обучения и валидации. Если модель начинает переобучаться, это может быть признаком того, что увеличивать количество эпох нецелесообразно.
Соответственно, для улучшения качества предсказаний вашей модели, вы можете рассмотреть следующий подход:
- Уменьшите дроп-аут до 0.3 или 0.2.
- Измените оптимизатор на Adam.
- Введите методы обработки несбалансированных данных.
- Проведите настройку гиперпараметров с помощью RandomizedSearchCV или GridSearchCV.
- Убедитесь в правильности обработки целевых переменных.
Попробуйте применить эти рекомендации и протестируйте модель на валидационном наборе данных, чтобы посмотреть, улучшились ли ваши результаты.