У меня есть несбалансированный набор данных в задаче двоичной классификации, где количество положительных и отрицательных значений составляет 0,3% против 99,7%. Разрыв между позитивами и негативами огромен. Когда я тренирую CNN со структурой, используемой в задаче MNIST, результат тестирования показывает высокий уровень ложных отрицательных результатов. Кроме того, кривая ошибок обучения быстро снижается в начале нескольких эпох, но остается такой же величиной в следующих эпохах.
Не могли бы вы посоветовать мне, как решить эту проблему? Спасибо!
Почему вы хотите использовать CNN здесь? Рассматривали ли вы другие модели, которые на самом деле обрабатывают несбалансированные данные?
Например, я обнаружил, что следующие два метода очень хорошо работают для меня:
Случайные леса с SMOTE Boosting : используйте гибрид,
SMOTE
который занизит выборку класса большинства и переделит выборку класса меньшинства на регулируемые проценты. Выберите эти проценты в зависимости от распределения вашей переменной ответа в обучающем наборе. Подайте эти данные в вашу модель RF. Всегда перекрестно проверяйте / выполняйте поиск по сетке, чтобы найти лучшие настройки параметров для ваших RF.XGBoost с оптимизацией гиперпараметров : снова проведите перекрестную проверку или выполните поиск в гирде, чтобы найти наилучшие настройки параметров для модели. Кроме того,
xgboost
позволяет балансировать положительные и отрицательные веса классов с помощьюscale_pos_weight
. См. Документацию параметров для полного списка.Я также должен добавить, что набор данных, над которым я работал, имел одинаковый процент перекоса, и я смог получить показатель чувствительности 0,941 и специфичность 0,71 с
xgboost
, что означает, что модель довольно точно предсказывает истинные положительные результаты, и это свидетельствует о том, что хорошо для меня.(Извините, я не могу оставить комментарий, недостаточно репутации, и я действительно хотел знать, почему вы выбрали CNN)
источник
Несбалансированный набор данных является распространенной проблемой во всех областях и не касается конкретно компьютерного зрения и проблем, с которыми сталкиваются сверточные нейронные сети (CNN).
Чтобы решить эту проблему, вы должны попытаться сбалансировать свой набор данных, либо с помощью выборки классов меньшинства, либо выборки классов большинства (или обоих). Можно утверждать, что хорошим выбором будет алгоритм SMOTE (методика синтетической избыточной выборки меньшинств), как упомянуто выше. Здесь вы можете найти сравнение различных алгоритмов передискретизации. Если вы пользователь Python, imbalanced-learn - это хорошая библиотека, которая реализует множество полезных методов для балансировки наборов данных.
С другой стороны, если вы пытаетесь классифицировать изображения, хороший способ увеличить размер набора данных - увеличить его (т. Е. Создать разумные синтетические примеры, например, похожие изображения, но немного повернутые / сдвинутые относительно исходных). Иногда вам может быть полезно расширить классы меньшинства для достижения лучшего баланса. Класс Keras ImageDataGenerator - хороший инструмент для этой цели.
источник