Создавайте полноценные представления категорий с высокой мощностью

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

Фиксированной квитанции не существует, принятие одного метода вместо другого зависит от типа данных, имеющихся в нашем распоряжении, и объема нашего анализа. Например, one-hot сохраняет симметрию категорий, но требует много памяти. Целочисленное отображение более легкое, но создает бессмысленные отношения между классами. Целевая кодировка напрямую коррелирует с целевой, но имеет тенденцию к переопределению, если не применяется должным образом. Встраивание представлений - это новая тенденция, заключающаяся в выделении нейронной сети для создания чувственного векторного представления категорий.

В этом посте я рассмотрю проблему выявления мошенничества с кликами. Область нашего анализа - мобильные устройства, в нашем распоряжении только категориальные переменные. Наша цель - извлечь ценность из этой структуры данных, внедрив некоторые передовые методы векторизации для категориального кодирования. Используются три разных подхода: первые два управляют данными, применяя ручное создание векторных объектов с групповым подсчетом и другими преобразованиями; последняя представляет собой структуру чистой нейронной сети, созданную для создания глубокого представления категорий таким образом, что она имеет тенденцию сжимать данные, извлекающие значения из 'групп' (по этой причине имя Group2Vec ).

ДАННЫЕ

TalkingData AdTracking Fraud Detection - это задача, организованная Kaggle для TalkingData, крупнейшей в Китае независимой платформы обслуживания больших данных, которая покрывает более 70% активных мобильных устройств по всей стране. Они обрабатывают 3 миллиарда кликов в день, из которых 90% потенциально мошеннические. Их текущий подход к предотвращению мошенничества с кликами для разработчиков приложений состоит в том, чтобы измерить путь клика пользователя по их портфолио и отметить IP-адреса, которые производят много кликов, но никогда не устанавливают приложения. На основе этой информации они создали черный список IP-адресов и черный список устройств. Им требовалось создать алгоритм, который предсказывает, загрузит ли пользователь приложение после нажатия на рекламу мобильного приложения. Для этого они предоставили обширный набор данных, охватывающий примерно 200 миллионов кликов за 4 дня!

Доступная информация представлена ​​в виде записей о кликах со следующей структурой: IP-адрес, приложение, устройство, ОС, канал, время клика, время с атрибуцией, с атрибуцией (наша цель). Чтение и использование огромного количества данных - вне нашей цели. Мы извлекаем 3 временных образца: первый (200 000 кликов) для поезда и другие 2 (каждый из 50 000 кликов) для проверки и тестирования; мы также обеспечиваем временной промежуток между проверкой и тестированием, чтобы обеспечить большую надежность результатов.

В нашем распоряжении есть следующие важные переменные: ip, app, device, os, channel; все в категориальном формате. Большое количество классов для каждой функции - это положительный аспект, который мы хотим оценить. В этом смысле классические подходы кодирования не работают, нам нужно больше, и по этой причине мы создаем некоторые особенные и интересные. Группировка и Подсчет - два волшебных ингредиента для развития наших передовых методов кодирования, они вводятся с первых шагов нашего процесса ручной разработки функций. В конце концов, мы пытаемся обойтись без ручного проектирования и создать структуру нейронной сети, достаточно умную, чтобы дать ценный и сопоставимый результат, но давайте продолжим по порядку!

Счетчик групп + усеченный SVD

Первый метод, который мы представили, использует усеченный SVD (LSA), также LDA или аналогичные являются хорошими кандидатами. Как подчеркивалось ранее, наша цель - кодировать наши категориальные столбцы, создавая векторное представление каждого класса внутри них. Вот схематическая процедура:

  • groupby - поезд по каждой категориальной переменной (group_key);
  • для каждой оставшейся категориальной переменной по очереди (passive_key) мы вычисляем объединение доступных классов по группам, как если бы они были строками. Каждая пара group_key - passive_key представляет собой строку классов из домена passive_key;
  • строки извлекаются в числа, кодирующие их с помощью CountVectorizer;
  • полученные разреженные матрицы затем сокращаются с помощью усеченного SVD.

Таким образом, мы получаем векторные представления для каждого класса каждой категориальной переменной в виде конкатенации усеченных векторов SVD. Длины векторов зависят от количества сокращенных компонентов и количества конкатенаций, полученных всеми возможными комбинациями (n_comp * n_cat * (n_cat-1)). В нашем случае, когда число сокращенных компонентов равно 3, каждый класс в каждой переменной представляет собой вектор длиной 60 (3 * 5 * 5 (5–1)). Для пояснения, класс категорий, которые не появляются в наборе поездов, или NaN, в предыдущем коде закодирован как 0.

Созданные функции полезны для любого рода дальнейших задач. Мы используем их для создания модели прогнозов мошенничества с кликами. С помощью простого RandomForest, настроенного на проверку, мы достигаем 0,908 AUC для невидимых тестовых данных.

Количество групп + энтропия

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

  • groupby - поезд по каждой категориальной переменной (group_key);
  • для каждой оставшейся категориальной переменной по очереди (passive_key) вычислить матрицу подсчета без суммирования. В первом измерении у нас есть классы group_key, а во втором измерении - классы passive_key. Пересечение - это частоты группового счета;
  • примените энтропию к строкам, чтобы подвести итоги счетчикам.

Таким образом, мы получаем векторные представления для каждого класса каждой категориальной переменной в виде конкатенации значений энтропии. Поскольку энтропия - это одно скалярное значение, длины векторных представлений зависят от количества конкатенаций, полученных всеми возможными применимыми комбинациями (n_cat * (n_cat-1)). В нашем случае 20 (5 * 5 (5–1)).

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

Group2Vec

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

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

  • Инициализировать слои встраивания для каждого категориального входа;
  • Для каждой категории вычислите скалярные произведения среди других представлений внедрения. Это наши «группы» на категориальном уровне;
  • Подведите итоги каждой «группы», применяя средний пул;
  • Объедините средние значения «группы»;
  • Применяйте методы регуляризации, такие как BatchNormalization или Dropout;
  • Вероятности выхода.

Group2Vec, обученная нашей конкретной задаче, достигла 0,937 AUC на тестовых данных.

РЕЗЮМЕ

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

ПРОВЕРИТЬ РЕПО НА GITHUB

Оставайтесь на связи: Linkedin