Когда количество наблюдений в одном классе намного больше, чем в другом, трудно обучить обычный классификатор CNN. Классификатор CNN может считать, что все наблюдения относятся к основному классу для достижения высокой точности.

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

Однако использование вышеупомянутых методов может иногда вызывать переоснащение модели, когда данные чрезвычайно несбалансированы. Поэтому мы рассмотрим другой метод, который называется обнаружением аномалий, чтобы справиться с этим случаем.

Мы примем наблюдения в основном классе как обычные данные и будем использовать только эти данные для обучения нашей модели. Затем мы можем предсказать, является ли новое наблюдение нормальным. Вы можете спросить, как обнаружить аномальные данные, если модель не обучалась на этих данных. Ниже приводится простой пример, показывающий, как работает обнаружение аномалий.

- Реализация -

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

Сначала импортируйте библиотеки для построения модели. Эти четыре библиотеки - все, что нам нужно.

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

Мы используем Keras, чтобы получить модель VGG16, предварительно обученную в ImageNet, и получить результат выбранного слоя. Затем мы пропускаем выходные данные через уровень глобального среднего пула, чтобы уменьшить размеры.

Для реализации одного классификатора классов мы используем модель кластеризации, модель смеси Гаусса (GMM), от Scikit Learn. Итак, создайте GMM из одного компонента.

Как показано на рисунке 2, данные, расположенные ближе к центру распределения Гаусса, с большей вероятностью будут нормальными. Выбирая диапазон распределения, мы можем определить, является ли наблюдение нормальным или нет.

Пришло время импортировать набор данных, чтобы увидеть, как работает модель. Мы используем набор данных MNIST от Keras. Мы принимаем «1» за нормальные данные и «7» за ненормальные данные. Таким образом, мы используем только «1» в качестве обучающих данных и используем как «1», так и «7» в качестве тестовых данных.

Для обучения нашей модели осталось всего две линии. Во-первых, используйте модель VGG для извлечения функций из обучающих данных. Затем используйте результаты в качестве входных данных для GMM.

- Результат -

Используя функцию GMM score_samples, мы можем легко вычислить вероятность данных. Принимая порог как среднюю вероятность обучающих данных плюс трехкратное стандартное отклонение, мы можем предсказать наши данные тестирования.

Мы используем модель VGG для извлечения функций из данных тестирования. Затем мы используем обученный GMM для вычисления вероятности результатов. Наконец, мы можем обнаружить аномалию, если вероятность наблюдения меньше порогового значения.

Давайте визуализируем наши результаты! Мы рисуем диаграмму рассеяния, а по оси абсцисс отложены данные, а по оси ординат - оценка. Мы наносим «1» как синие точки, а «7» - как розовые точки, а порог наносим черной линией. Мы видим, что большинство точек может быть разделено порогом. Вот как мы обнаруживаем ненормальные данные.

Мы также можем проверить случаи отказа. На рисунке ниже показано, что модель с большей вероятностью сделает ошибки, когда «1» сложнее, а когда «7» слишком тонко.

Чтобы добиться большей точности, мы можем заменить предварительно обученную модель автокодировщиком, чтобы получить лучшее представление функций. Хотя модели, предварительно обученные в ImageNet, могут извлекать отличные особенности из изображений, изображения в MNIST сильно отличаются от изображений в ImageNet. Мы можем получить худший результат, если будем использовать набор данных, который сильно отличается от ImageNet. Кроме того, существует множество способов реализовать обнаружение аномалий, попробуйте другой.

- Справочная информация—

[1] Документ ICML 2018 Глубокая одноклассовая классификация

[3] Документация Scikit Learn