Пандемия Covid-19, с которой мы боролись около 2 лет, также изменила наши покупательские привычки. В то время как привычка ходить в магазин почти исчезла, количество покупок в Интернете стало быстро расти. Потребителя, который покупает все в Интернете, от мебели до одежды, от продуктов питания до косметики, подстерегают большие опасности. Мошенничество с кредитными картами!

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

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

В этой статье мы обучим модель машинного обучения с набором данных Kaggle. Набор данных принадлежит соревнованию Kaggle.

- Соревнование проводилось 2 года назад, в нем приняли участие 6351 команда.
- Первое место было присуждено 10 000 долларов США, второе место - 7 000 долларов США. , а третий приз - 3.000 долларов.
- Конкурс начался 15 июля 2019 г. и закончился 3 октября 2019 г. , длительностью 50 дней.

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

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

Обработка и понимание данных
Во-первых, мы загружаем библиотеки, которые могут понадобиться. Наборы данных для обучения и тестирования представлены в 2 частях. Мы импортируем данные в формате CSV с помощью панд и объединяем их в общий столбец.

Возможности

  • isFraud: двоичный, целевой
  • TransactionID: все уникальное. Сейчас это чистый шум. Поскольку почти все значения TransactionID уникальны, он отбрасывается.
  • TransactionDT: временной ряд. Время от контрольной точки времени. ОЧЕНЬ ценная колонка
  • TransactionAmt: непрерывно. Он имеет много уникальных значений и должен быть объединен с другими столбцами. Лучшее повышение баллов должно происходить от комбинации TransactionDT- ›TransactionAmt.
  • P_emaildomain: категориальный, 56 уникальных. Из нее можно сделать подгруппу или общую группу
  • R_emaildomain: категориальный, 59 уникальных. Из нее можно сделать подгруппу или общую группу
  • DeviceType: категориальный, 2 уникальных
  • DeviceInfo: категориальный, 700 уникальных
  • ProductCD: категориальный, 5 уникальных элементов
    100% категориальных вариантов функций для использования: частотное кодирование / целевая кодировка / комбинации с другими столбцами / категориальная функция модели
  • card1-6: категориальный, числовой. Категориальные особенности с информацией о клиенте
  • addr1-2: addr1 - подзона / add2 - Страна
  • dist1-2: числовой. dist1 - местное расстояние от продавца / dist2 - расстояние до страны
  • D1-15: числовой. разница во времени, например количество дней между предыдущими транзакциями и т. д. Минимальное значение будет одинаковым для каждого месяца и дня, но максимальное и среднее значения со временем будут расти.
  • C1-14: числовой
  • M1-9: категориальный
  • V1-339: числовой, категориальный
  • id_01_38: числовой, категориальный

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

3,5% транзакций - мошенничество. Обратите внимание, насколько несбалансирован наш исходный набор данных! Большинство транзакций не являются мошенничеством. Если мы будем использовать этот фрейм данных в качестве основы для наших прогнозных моделей и анализа, мы можем получить много ошибок, и наши алгоритмы, вероятно, переоснащаются, поскольку он «предполагает», что большинство транзакции не являются мошенническими. Но мы не хотим, чтобы наша модель предполагала, мы хотим, чтобы наша модель выявляла закономерности, которые указывают на мошенничество! Дисбаланс означает, что количество точек данных, доступных для разных классов, разное.

Уменьшение памяти

Работа с большими данными при обучении моделей машинного обучения требует большого объема оперативной памяти. Чтобы преодолеть это ограничение, мы использовали функцию для уменьшения объема памяти, занимаемой данными. Общий подход заключается в преобразовании dtype каждой функции («int16», «int32», «int64», «float16», «float32», «float64») в минимально возможный dtype.

Объекты, созданные в RunTime, удаляются из памяти, когда они не нужны приложению или когда объект, созданный в программе, завершается. «Сборщик мусора» (gc.collect()) используется для этого процесса.

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

В то время как наборы данных поездов имеют наблюдения в течение 182 дней, тестовые наборы данных имеют наблюдения в течение 183 дней. Между двумя наборами данных существует разрыв в 30 дней. Мы можем сгенерировать некоторые полезные временные характеристики из TransactionDT, t времени от контрольной точки времени. Это очень ценная колонка.

Разработка функций

Согласно Википедии, разработка функций относится к процессу использования знаний предметной области для извлечения функций из необработанных данных с помощью методов интеллектуального анализа данных. Затем эти функции можно использовать для повышения производительности алгоритмов машинного обучения. Разработка функций не обязательно должна быть изысканной. Один простой, но распространенный вариант использования разработки функций - это данные временных рядов. Важность разработки функций в этой области обусловлена ​​тем фактом, что (необработанные) данные временных рядов обычно содержат только один столбец для представления атрибута времени, а именно date- время (или отметку времени). Что касается этих данных даты и времени, проектирование функций можно рассматривать как извлечение полезной информации из таких данных как отдельные (отдельные) функции. Например, из данных даты и времени «2020–07–01 10:21:05» мы можем извлечь из них следующие функции:

Месяц: 7

День месяца: 1

Название дня: среда (2020-07-01 была среда)

Часов: 10

Минимальное значение в столбцах D должно равняться минимальному значению для каждого месяца и первого дня месяца. Чтобы соответствовать этому условию, START_DATE был определен как 2017–11–30. (Справка)

Мы сгенерировали 8 различных временных характеристик из одной функции, которая включает эталонное время.

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

  • Уровень мошенничества имеет тенденцию увеличиваться с начала недели, имеет тенденцию к снижению в пятницу и воскресенье. Подобно еженедельному распределению, существует аналогичное распределение в течение месяца. Хотя в начале месяца уровень мошенничества невелик, к концу месяца он увеличивается.
  • В то время как в дни государственных праздников в США уровень мошенничества невелик, в другие дни уровень мошенничества пропорционально выше.

После этого этапа давайте перечислим действия, которые мы сделали, и идеи, которые мы извлекли в проекте.

  1. Нет существенной разницы между средними значениями TransactionAmt для наборов данных поезда и тестовых данных. Среднее количество мошеннических транзакций (149,24) больше, чем среднее значение не мошеннических операций (134,26).
  2. В тестовом наборе данных есть новая версия программного обеспечения и устройство, которых нет в наборе данных для обучения. А также в наборе данных поездов есть версия программного обеспечения и устройство, которых нет в тестовом наборе данных. Заменим их значением Nan.
  3. id_28 и id_29 имеют категориальные данные и имеют высокую корреляцию. (Порог = 0,9). Поэтому мы отказались от id_29.. Нажмите на ссылку для получения подробной информации о соотношении категориальных данных.

4. Сгенерировали 2 новых столбца с почтовым сервером и доменом.

5. addr1 и addr2 относятся к адресации. add2 - Страна / addr1 - подзона. Объединяя их, мы создаем новый столбец.

Столбцы V кажутся излишними и взаимосвязанными. Кроме того, многие подмножества имеют похожие структуры NAN. Мы определили столбцы с корреляцией (r ›0,75) в столбцах V и удалили один из них, оставив только независимые столбцы. После отбрасывания коррелированных столбцов V у нас остается только 62 столбца В.

PCA для V-столбцов

При таком большом количестве функций производительность вашего алгоритма резко снизится. PCA ( Анализ главных компонентов ) - очень распространенный способ ускорить алгоритм машинного обучения, избавившись от коррелированных переменных, которые не влияют к принятию любого решения. Время обучения алгоритмов значительно сокращается с меньшим количеством функций. Кроме того, переобучение в основном происходит, когда в наборе данных слишком много переменных. Итак, PCA помогает преодолеть проблему переобучения за счет уменьшения количества функций.

Итак, если входные размеры слишком велики, разумным выбором будет использование PCA для ускорения алгоритма. Теперь применим PCA к V-столбцам 62 функций. Но сначала мы должны нормализовать столбцы V. Мы ищем требование, чтобы он представлял более 90% данных. Мы достигли 92% представления V-столбцов с 3 переменными PCA. Очень хороший!

Кодирование частоты

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

Обработка выбросов

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

Обработка отсутствующих значений

LightGBM и XGBoost Библиотеки могут обрабатывать отсутствующие значения

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

Это НЕ является общим свойством алгоритмов градиентного спуска или древовидных алгоритмов. Только определенные реализации этих алгоритмов обладают этим свойством. В этом проекте мы оставили недостающие значения для оценки модели и не выполняли никаких назначений.

Моделирование с помощью LightGBM

Алгоритмы Gradient Boosting Decision Trees (GBDT) оказались одними из лучших в машинном обучении. XGBoost, самый популярный алгоритм GBDT, выигрывал множество конкурсов на таких сайтах, как Kaggle. Однако XGBoost - не единственный алгоритм GBDT с самой современной производительностью. Существуют и другие алгоритмы GBDT, которые имеют больше преимуществ, чем XGBoost, и даже более эффективны, например, LightGBM и CatBoost.

Хотя стандартизация данных для линейных моделей требуется, для древовидных моделей она в основном бесполезна. Древовидные модели разделяют значения переменных, поэтому точные значения не имеют большого значения. Разница может быть, если мы ограничим количество бинов для анализа. То же и с корреляцией. Его важно анализировать для линейных моделей, но для древовидных моделей важно взаимодействие функций. Хотя функция может иметь небольшую корреляцию с целью, она может иметь серьезный эффект в сочетании с какой-либо другой переменной. В этом проекте мы сначала обучим нашу модель с помощью LightGBM, а затем с помощью XGBoost Classifier. Итак, мы не нормализовали данные.

При разделении обучающих и тестовых данных важно, чтобы частота целевого столбца составляла 3,5% в обучении и тестировании. Он был предоставлен с параметром stratify = y.

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

Как видно слева, LightGBM работает намного лучше, чем XGBoost. Он также более успешен, чем XGBoost, с точки зрения времени обучения и меньшего использования памяти.

Оценка показателей

Точность - это показатель, который широко используется для измерения успешности модели для сбалансированных наборов данных, но наш набор данных крайне несбалансирован. Итак, мы не учитываем показатель точности.

Точность показывает, сколько значений, которые мы оценили как положительные, действительно положительны.

Напомнить - это показатель, который показывает, сколько операций нам нужно оценить как положительные, а мы - как положительные. Это очень важный результат.

Значение F1 Score показывает гармоническое среднее значений точности и повторного использования. Это важный показатель для любого сбалансированного или несбалансированного набора данных.

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

ROC - это вероятностная кривая для разных классов. Типичная кривая ROC имеет ложноположительный показатель (FPR) по оси X и Истинно положительный коэффициент (TPR) по оси Y.

Вот несколько преимуществ использования кривой ROC:

1. Кривые разных моделей можно напрямую сравнивать в целом или для разных пороговых значений.

2. Площадь под кривой (AUC) можно рассматривать как сводку навыков модели, другими словами, ее эффективность.

3. Обычно успешные модели представлены кривыми, которые изгибаются в верхнем левом углу графика.

В соответствующем соревновании Kaggle оценочная оценка - это оценка AUC. Мы получили оценку AUC 0,9535 с LightGBM и 0,8820 с помощью XGBoost.

Важные параметры LightGBM:

num_leaves: количество используемых листовых узлов. Большое количество створок повысит точность, но также приведет к переоснащению.

min_child_samples: минимальное количество выборок (данных) для группировки в лист. Параметр может значительно помочь при переобучении: большие размеры выборки на лист уменьшат переобучение (но могут привести к недоподборке).

max_depth: явно контролирует глубину дерева. Более мелкие деревья уменьшают переоснащение.

Настройка на несбалансированные данные

Самый простой способ учесть несбалансированные или искаженные данные - это добавить веса к положительным примерам классов:

scale_pos_weight: вес можно рассчитать на основе количества отрицательных и положительных примеров: sample_pos_weight = количество отрицательных образцов / количество положительных образцов.

Настройка на переоснащение

В дополнение к параметрам, упомянутым выше, для контроля переобучения могут использоваться следующие параметры:

max_bin: максимальное количество ячеек, в которые помещаются значения функций. Меньшее значение max_bin уменьшает переобучение.

min_child_weight: минимальная сумма гессиана за лист. В сочетании с min_child_samples большие значения уменьшают переобучение. bagging_fraction.

bagging_freq: включает пакетирование (подвыборку) обучающих данных. Для использования упаковки в мешки необходимо установить оба значения. Частота определяет, как часто (итерация) используется упаковка. Меньшие фракции и частоты уменьшают переоснащение.

feature_fraction: управляет подвыборкой функций, используемых для обучения (в отличие от подвыборки фактических данных обучения в случае упаковки). Меньшие фракции уменьшают переобучение. lambda_l1 и lambda_l2: контролирует регуляризацию L1 и L2.

Настройка на точность

Точность можно повысить, настроив следующие параметры:

max_bin: чем больше max_bin, тем выше точность.

learning_rate: использование меньшей скорости обучения и увеличение количества итераций может повысить точность.

num_leaves: увеличение количества створок увеличивает точность с высоким риском переобучения.

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

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

Вы можете найти весь этот проект в учетной записи my Kaggle и Github.

Демо-приложение: https://cc-fraud-detection.herokuapp.com/