Глубокое обучение структурированных данных с использованием служебной библиотеки embedder для изучения представлений категориальных переменных.

Глубокое обучение захватывает мир и позволяет достигать результатов человеческого уровня в разнообразных задачах, которые мы раньше считали очень сложными для компьютеров, таких как распознавание изображений, машинный перевод или создание языков. Многое было сказано по этой теме людьми с гораздо более глубокими знаниями, чем я. Я хотел устранить меньшее, но, тем не менее, важное заблуждение о нейронных сетях - что они не особенно полезны для задач машинного обучения на структурированных данных [1] по сравнению с более традиционными подходами, такими как ансамбли деревьев решений.

Есть одна область, в которой нейронные сети могут превосходить или, фактически, дополнять машины с градиентным бустом [2], - представления функций обучения для категориальных переменных, которые обычно наблюдаются в структурированных данных. В качестве примера представьте себе задачу прогнозирования заработной платы нового выпускника на основе набора характеристик, включая ее университет. Ясно, что университет - это категориальная переменная - конкретный студент в данных будет иметь одну из сотен категорий, например «Стэнфордский университет». Перед обучением модели нам нужно будет найти числовое представление для этой переменной. [3]

Прелесть нейронных сетей в том, что, изучая отображение входов и выходов, они также изучают представления данных. Эти представления являются скрытыми слоями в сети. Хорошо известные примеры включают сверточные слои ConvNets или вложения слов, изученные алгоритмом word2vec. Точно так же мы можем изучить представления категориальных переменных, которые имеют отношение к конкретной задаче, встраивая их горячие кодировки в векторное пространство меньшей размерности. Это то, что стремится упростить embedder.

Мотивация

Вложения сущностей - это непрерывные векторы фиксированного размера, которые численно представляют категориальную переменную. В переменной существует уникальный вектор для каждой категории (например, для каждого университета), и стек этих векторов называется матрицей вложения. В частности, мы сосредоточимся на вложениях, которые нейронная сеть извлекает из данных. Лучшее введение в идеи, лежащие в основе этой концепции, - это Guo and Berkhahn (2016); для ознакомления с новичками ознакомьтесь с этим постом.

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

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

  1. Они обеспечивают непрерывное представление категориальных переменных, позволяя обучать более мощные нейронные сети.
  2. Они предоставляют способ добавлять метаданные к глубокому обучению неструктурированным данным, включая изображения, видео, естественный язык или данные временных рядов.
  3. Они могут улучшить производительность других алгоритмов машинного обучения, включая XGBoost и Random Forest.
  4. Используя трансферное обучение, можно обучать вложения на большом наборе данных и впоследствии использовать их для задач с гораздо меньшими данными обучения. Это может быть очень полезно в промышленности.
  5. Поскольку мы изучаем векторы для категориальных переменных в евклидовом пространстве, становится просто кластеризовать наблюдения этих переменных.
  6. Для поиска информации и рекомендательных системных проблем обычно используются вложения.

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

Вложения для обучения

В демонстрационных целях я буду использовать библиотеку для встраивания и набор данных, исследованный в Guo and Berkhahn (2016), данные аптек Rossman. Набор данных содержит исторические данные о продажах для 1115 магазинов Rossman, каждый из которых находится в определенном штате Германии. Изучение внедрения этого набора данных с помощью средства внедрения может быть выполнено с помощью 5 строк кода (не считая загрузки данных).

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

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

Преобразование данных

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

Предположим, цель обучения нейронной сети состоит только в том, чтобы выучить хорошие представления функций. То есть заменить строки типа «Стэнфордский университет» числовым вектором, полученным методом градиентного спуска. Впоследствии пользователь подгоняет к преобразованным данным совершенно другую модель - например, линейную модель. Причины этого могут быть в том, что бизнес предпочитает легкую интерпретируемость коэффициентов других некатегориальных переменных, но линейная модель может легко переоцениться, когда однократное кодирование резко увеличивает размерность пространства признаков. Гуо и Берхан (2016) также предоставляют доказательства того, что производительность машин повышения градиента и случайных лесов может быть улучшена за счет использования встраиваний.

С помощью embedder этап преобразования очень прост и интуитивно понятен для всех, кто использовал предварительную обработку функций в scikit-learn.

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

Извлечение и изучение вложений

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

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

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

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

Заключение

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

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

Большое спасибо Туан Ань Ле за отзывы и обсуждения по этой теме.

Ссылки

Го, С. и Беркхан, Ф., 2016. Вложения категориальных переменных в сущности. Препринт arXiv arXiv: 1604.06737.

Сноски

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

[2] Беглый взгляд на соревнования Kaggle показывает, что, столкнувшись с задачей контролируемого обучения на структурированных данных, доминирующим подходом будет использование машины повышения градиента, особенно ее высокоэффективных реализаций, таких как XGBoost или LightGBM. По моему опыту, превзойти XGBoost даже в готовом виде с очень небольшой предварительной обработкой функций и настройкой параметров - это трудоемкая и сложная задача для полностью подключенной нейронной сети с прямой связью, которая обычно является архитектурой выбора. для структурированных данных без последовательного измерения. Я оставлю более глубокую причину для другого поста.

[3] Два наиболее распространенных подхода - одноразовое кодирование и целочисленное кодирование. Оба имеют принципиальные недостатки. В частности, одноразовое кодирование не способствует обучению нейронных сетей, поскольку они являются двоичными функциями. См. Guo and Berkhahn (2016).

[4] Если вы хотите скомпилировать модель, чтобы минимизировать различные потери с другой архитектурой, все, что вам нужно сделать, это унаследовать от базового класса и переопределить метод подгонки.