Если изображение говорит тысячу слов, ваши данные, вероятно, говорят намного больше! Вам просто нужно слушать.
Несколько месяцев назад, работая над курсовой работой, мы столкнулись с проблемой: разработать аналитическую модель, способную обнаруживать вредоносные или мошеннические транзакции из журналов данных кредитных карт. Воодушевленные, мы подошли к чертежной доске, чтобы начать строить нашу классификационную модель. То, что начиналось как задание «оценки в сумке», быстро превратилось в «не такой уж простой» проект. Сложности заключались в некоторых артефактах предоставленного набора данных, которые если не что-то, то, по крайней мере, заставили нас усомниться в нашей наивности!
Дело в том, что с данными типа обнаружения мошенничества задача усложняется из-за определенных характеристик данных и того, как они становятся доступными, а именно:
- Большой дисбаланс классов (как правило, в сторону благоприятных точек данных).
- Проблемы, связанные с конфиденциальностью (из-за наличия конфиденциальных данных).
- Степень динамизма в том, что Злоумышленник всегда пытается замести следы, т. е. изо всех сил пытается обмануть нашу систему.
- Доступные данные огромны и часто немаркированы.
Сегодня мы поднимем и постараемся решить первую из этих проблем, перечисленных выше: обработка большого дисбаланса классов.
Во многих реальных сценариях данные страдают от очень неравномерного или несбалансированного распределения, что затрудняет моделирование нечастого класса. Рассматривая сценарий с двумя случаями (скажем, наши данные о мошеннических транзакциях), обычно нечастый класс — это положительный класс (т. е. мошенническая транзакция), тогда как частый класс — отрицательный (т. е. доброкачественные транзакции). Помня об этом недостатке, проблема моделирования таких данных заключается в том, что этот нечастый класс, находящийся в меньшинстве (скажем, 1% всех точек данных), не обладает достаточной описательной силой или представлением, чтобы быть значимым. Другими словами, модель может отнести все точки данных к отрицательному классу (а это большинство) и достичь приемлемо высокой точности! Это приводит к чрезвычайно низкой производительности в задаче классификации для класса меньшинства и является серьезной ловушкой, в которой нельзя винить нашу плохую модель.
Хм… это ставит нас в аккуратный рассол. К счастью, пересмотр нашего понимания этой проблемы дисбаланса классов (хотя бы немного) помогает взглянуть на вещи в более выгодном свете. Основная проблема заключается в плохом представлении класса меньшинства в нашем наборе данных. Доступные данные не имеют достаточно большого размера выборки (с точки зрения класса меньшинства), чтобы наша модель могла узнать что-нибудь полезное о характеристиках редко встречающегося класса, что уговаривает нашу модель достичь разумной точности путем классификации всех данных. как более частый т.е. большинство класс!
Учитывая, что теперь мы знаем основную причину этой досадной проблемы, что, если бы мы могли помочь нашей модели, предоставив ей достаточно информации (которая может понадобиться) о редко встречающемся классе? Если бы мы могли во время обучения снабдить модель определенными искусственно или синтетически сгенерированными точками данных, которые, как мы говорим, взяты из распределения меньшинства классов, могли бы мы каким-то образом улучшить описательную способность модели с точки зрения правильной классификации класс меньшинства? На самом деле, это действительно возможно сделать, и процесс, который используется для реализации этой интуиции, которую мы только что построили, называется Sсинтетическим Mменьшинством Oперевыборка Teметодика или SMOTE; что довольно открыто, является темой этой статьи!
Давайте попробуем понять технику SMOTE, основанную на логике кластеризации через реализацию Python. Пора пачкать руки!
Здесь мы передаем определенные аргументы функции SMOTE, которые описаны во фрагменте кода:
T: Number of minority samples available. N: Number of synthetic samples we intend to generate per data point. k: Number of nearest neighbours to be considered while applying SMOTE.
Определив вышеуказанные управляющие переменные, реализация становится довольно простой. Для каждой из наших выборок класса меньшинства T мы сначала получаем список ближайших точек данных k ( обычно в терминах евклидова пространства признаков) с использованием подхода k ближайших соседей. Во фрагменте кода это переменная nn-list. Затем мы случайным образом выбираем соседа из этого списка, который действует как эталон (относительно рассматриваемой точки данных) для создания нашей синтетической выборки. Для каждого признака или атрибута наших данных мы вычисляем разницу, то есть дельту между значением атрибута рассматриваемой точки данных и выбранного соседа. Мы используем эту разность дельты для создания синтетического образца.
На данный момент существует несколько способов использования этой дельты; добавление его обратно к нашей точке данных не имеет особого смысла, поскольку мы всегда получим ближайшего соседа, поэтому нам нужно проявить творческий подход. Один из способов добиться этого — добавить некоторую случайность. Например, это можно сделать, просто выбрав значение из случайного распределения, скажем, однородного: [0,1] и взяв его произведение с дельтой, полученной на предыдущем шаге. Затем мы можем добавить его к значению атрибута рассматриваемой точки данных, чтобы создать нашу синтетическую выборку. Видеть! прямо, как и обещал. Этот шаг можно выполнить разными способами, и он действительно зависит от типа данных или ограничений моделирования, которые у вас могут быть или не быть. Но это все, что нужно для создания N синтетических семплов и достижения требуемой передискретизации.
Отличный совет при работе с многомерными данными — визуализировать их.
Визуализация помогает нам понять, что происходит с данными, когда мы применяем нашу функцию SMOTE. Слева представлены исходные данные, которые были предоставлены нам, где мы можем видеть, что класс меньшинства (желтые точки) имеет очень мало выборок, в то время как график справа является результатом применения SMOTE к данным и последующей недостаточной выборки класса большинства ( фиолетовые точки), чтобы усилить эффект передискретизации, который мы применили. Полный код можно найти на Github:
Чтобы рассеять любые опасения по поводу бесполезности всего этого упражнения с SMOTE, я добавляю график матриц путаницы, подтверждающий улучшение производительности, которое мы наблюдали после помощи наивной байесовской модели с нашими данными SMOTE в задаче обнаружения мошенничества. Но мы еще не закончили. Есть еще пара вещей, которые могут быть полезны в этом сценарии.
Заниженная выборка класса большинства.Чтобы получить более эффективное моделирование на основе данных SMOTE, мы можем дополнительно занижать выборку класса большинства, т. е. отбросить некоторые выборки (на определенный процент). Обычно это делается вместе с SMOTE, чтобы еще больше повысить производительность нашей модели в классе меньшинства, но опять же, и я не могу не подчеркнуть этого достаточно, его следует применять, когда вы знаете, что делаете, поскольку это может полностью изменить ваше распределение данных, что приведет к худшему обобщению, чем то, что у нас было раньше.
Удаление ссылок Tomek.В качестве побочного эффекта применения SMOTE путем создания синтетических точек данных мы могли бы в конечном итоге ввести определенное перекрытие между классом меньшинства и классом большинства, делая классификация сложнее. Два экземпляра данных образуют связи Tomek, если экземпляры, т. е. точки, находятся очень близко к границе решения (или по обе стороны от нее). Эти ссылки Tomek можно использовать для поиска и потенциального удаления тех точек, которые действуют либо как шум, либо размывают границу классификации, тем самым повышая производительность классификации. Как правило, значение минимального расстояния используется в качестве управляющей переменной или порогового значения для идентификации связей Tomek.
На этом мы завершаем рассказ о том, как можно справиться с проблемой большого дисбаланса классов, используя в качестве примера сценарий обнаружения мошенничества. Несмотря на общепринятый подход, синтетическая избыточная выборка класса Minority с использованием SMOTE для улучшения его представления с точки зрения моделирования ни в коем случае не является единственным способом достижения желаемого результата. Тем не менее, я решил поделиться своим опытом работы со SMOTE, так как смог применить его с минимальными усилиями, учитывая быстрое понимание базовой логики, что привело к значительному улучшению производительности. Продолжаем строить!
Спасибо за ваше время и следите за новостями о других проблемах, которые мы перечислили в начале, в следующих статьях. P.S. Я хотел бы упомянуть Адитью Кунара, однокурсника, который был партнером по курсовой работе в этом задании.
ПРИМЕЧАНИЕ.Важным нюансом применения любого улучшения ваших данных является понимание того, что это обычно делается, чтобы помочь или поддержать модель в лучшем описании редкого класса путем улучшения его представления в данные. Следовательно, такое улучшение следует применять только к обучающим данным, а не к тестовым данным. Например, в этом случае производительность модели оптимизирована (и всегда должна быть) оптимизирована и проверена на данных UnSMOTEd, чтобы предотвратить ложные результаты.