Как классифицировать несбалансированный набор данных по сверточным нейронным сетям (CNN)?

10

У меня есть несбалансированный набор данных в задаче двоичной классификации, где количество положительных и отрицательных значений составляет 0,3% против 99,7%. Разрыв между позитивами и негативами огромен. Когда я тренирую CNN со структурой, используемой в задаче MNIST, результат тестирования показывает высокий уровень ложных отрицательных результатов. Кроме того, кривая ошибок обучения быстро снижается в начале нескольких эпох, но остается такой же величиной в следующих эпохах.

Не могли бы вы посоветовать мне, как решить эту проблему? Спасибо!

Чжи Лу
источник

Ответы:

10

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

Есть два возможных способа справиться с такой ситуацией.

  1. Учитывая пропорции от 0,3% до 99,7%, это очень искаженный набор данных. У вас вряд ли есть 3 образца положительных классов на каждые 1000 образцов. Я бы сказал, что вы должны взглянуть на балансирование набора данных, получив больше позитивных классов. Иди и получи как можно больше положительных образцов. Затем вы можете использовать более сбалансированный набор данных. Например, вы можете получить 1000 положительных образцов, а затем выбрать случайный набор из 1000 отрицательных образцов и построить классификатор. Теперь он должен быть в состоянии выучить оба класса.

  2. Используйте взвешенную меру ошибки при обновлении весов после мини-партии. Веса обновляются пропорционально количеству выборок положительного и отрицательного классов в любой мини-партии. Теперь, в текущей ситуации, учитывая пропорции 3: 1000, даже этот трюк может не сработать. Таким образом, вы можете попытаться получить пропорции примерно 300: 1000, получив еще 297 положительных образцов и объединив их с 1000 отрицательных образцов. Затем с соотношением 300: 1000 вы должны взвешивать погрешность во время мини-партий на основе количества выборок в каждом из классов. Это должно работать.

Лондонский парень
источник
Вы знаете, какая здесь оптимальная пропорция? это 3:10 или что-то еще?
Донлан
4

Почему вы хотите использовать CNN здесь? Рассматривали ли вы другие модели, которые на самом деле обрабатывают несбалансированные данные?

Например, я обнаружил, что следующие два метода очень хорошо работают для меня:

  • Случайные леса с SMOTE Boosting : используйте гибрид, SMOTEкоторый занизит выборку класса большинства и переделит выборку класса меньшинства на регулируемые проценты. Выберите эти проценты в зависимости от распределения вашей переменной ответа в обучающем наборе. Подайте эти данные в вашу модель RF. Всегда перекрестно проверяйте / выполняйте поиск по сетке, чтобы найти лучшие настройки параметров для ваших RF.

  • XGBoost с оптимизацией гиперпараметров : снова проведите перекрестную проверку или выполните поиск в гирде, чтобы найти наилучшие настройки параметров для модели. Кроме того, xgboostпозволяет балансировать положительные и отрицательные веса классов с помощью scale_pos_weight. См. Документацию параметров для полного списка.

Я также должен добавить, что набор данных, над которым я работал, имел одинаковый процент перекоса, и я смог получить показатель чувствительности 0,941 и специфичность 0,71 с xgboost, что означает, что модель довольно точно предсказывает истинные положительные результаты, и это свидетельствует о том, что хорошо для меня.

(Извините, я не могу оставить комментарий, недостаточно репутации, и я действительно хотел знать, почему вы выбрали CNN)

119631
источник
1

Несбалансированный набор данных является распространенной проблемой во всех областях и не касается конкретно компьютерного зрения и проблем, с которыми сталкиваются сверточные нейронные сети (CNN).

Чтобы решить эту проблему, вы должны попытаться сбалансировать свой набор данных, либо с помощью выборки классов меньшинства, либо выборки классов большинства (или обоих). Можно утверждать, что хорошим выбором будет алгоритм SMOTE (методика синтетической избыточной выборки меньшинств), как упомянуто выше. Здесь вы можете найти сравнение различных алгоритмов передискретизации. Если вы пользователь Python, imbalanced-learn - это хорошая библиотека, которая реализует множество полезных методов для балансировки наборов данных.

С другой стороны, если вы пытаетесь классифицировать изображения, хороший способ увеличить размер набора данных - увеличить его (т. Е. Создать разумные синтетические примеры, например, похожие изображения, но немного повернутые / сдвинутые относительно исходных). Иногда вам может быть полезно расширить классы меньшинства для достижения лучшего баланса. Класс Keras ImageDataGenerator - хороший инструмент для этой цели.

Томаш Бартковяк
источник