Создавайте чрезвычайно настраиваемые и организованные конвейеры предварительной обработки с помощью ColumnTransformer от Sklearn.

Введение

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

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

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

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

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

Конвейеры Sklearn с ColumnTransformer — это простой способ стандартного применения правил преобразования, создавая более организованный и чистый код.

Знание ColumnTransformer

Если вы уже знакомы с модулем ColumnTransformer из sklearn, вы можете пропустить этот раздел.

При работе с табличными данными обычно выполняется несколько шагов очистки для разных столбцов данных.

Например, для числового признака «цена» может потребоваться операция по замене значений NULL средним значением данных. Как вы, наверное, уже знаете, Sklearn предоставляет преобразователь для этого, SimpleImputer.

Что позволяет ColumnTransformer, так это применять Transformer Sklearn только в группе столбцов.

Давайте посмотрим, как это работает в коде.

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

На изображении ниже показан вывод кода.

Операция замены произошла только в указанном столбце, а оставшийся остался нетронутым (как указано в remainder=“passthrough” ). DataFrame pandas также был заменен массивом Numpy, так как это поведение по умолчанию для преобразователей Sklearn.

Давайте рассмотрим более сложный пример.

В приведенном выше случае нулевые значения столбца «Цена» заменяются средним значением, нулевые значения столбца «А» — медианой, а нулевые значения всех других столбцов — значением -1. На изображении ниже показан результат.

Совет: если вы работаете с блокнотом Jupyter, можно очень легко отобразить оценщики на интерактивной диаграмме, установив display="diagram" в конфигурации Sklearn.

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

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

Использование ColumnTransformers с конвейерами

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

Например, для числового признака «цена» может потребоваться операция по замене значений NULL средним значением данных, логарифмическое преобразование для более симметричного распределения данных и стандартизация для приближения значений к интервалу [-1, 1].

К сожалению, в sklearn нет преобразователя для выполнения всей этой работы, и здесь на помощь приходят конвейеры.

С помощью конвейеров мы можем объединить несколько преобразователей в цепочку для создания сложного процесса. Поскольку объект конвейера эквивалентен простому преобразователю (например, он имеет те же методы .fit() и .transform()), его можно вставить в объект ColumnTransformer. .

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

В этом одна из прелестей архитектуры Sklearn: все модули Transformers используют один и тот же интерфейс, поэтому они могут легко работать вместе.

Давайте посмотрим, как это работает в коде.

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

На изображении ниже показан созданный ранее преобразователь.

Работа над примером

Давайте быстро рассмотрим, как этот метод может помочь в «реальном случае», создав конвейер классификатора для набора данных классификации вин[4], доступного на Sklearn.

Этот набор данных содержит 13 числовых характеристик химических свойств вина, которые подразделяются на 3 категории. Код ниже импортирует данные.

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

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

  • malic_acid: мин.-макс. масштабирование
  • магний: журналпреобразования, дискретизация значений в 4 интервалах
  • ash: функция падения
  • нефлаваноидные_фенолы: нет.
  • любой другой: стандартный масштабатор

После этого данные должны пройти через PCA, чтобы уменьшить размерность, а затем достичь RandomForestClassifier.

В приведенном ниже коде показано, как можно построить этот конвейер.

И конвейер выглядит так:

Затем мы можем использовать этот объект как обычный классификатор:

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

Например, можно выполнить поиск по сетке, который изменяет гиперпараметры от этапа предварительной обработки до самого классификатора. Из-за архитектуры sklearn довольно легко создавать новые модули (преобразователи, классификаторы, регрессоры и т. д.), поэтому, если вам нужна очень конкретная задача, очень легко создать новый класс и сделать его совместимым с конвейерами. Архитектура оценщика также легко сериализуема, поэтому ее можно хранить в различных форматах, таких как JSON и XML.

Наконец, код чистый и стандартизированный, что облегчает его обновление и поддержку.

Заключение

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

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

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

Несмотря на то, что в этом посте рассматривается конкретно класс ColumnTransformer, логика распространяется и на другие модули sklearn, поскольку основная цель этого поста — показать, как сделать более надежный код. Архитектура Sklearn очень организована, и понимание более продвинутых возможностей может сделать вашу жизнь намного проще. Итак, я надеюсь, что этот короткий пост поможет вам в этом.

Спасибо за прочтение! :)

Рекомендации

[1] Scikit-Learn, Официальная документация по ColumnTransformer
[2] Scikit-Learn, Официальная документация по конвейерам
[3] Герон, А. (2019). Практическое машинное обучение с помощью Scikit-Learn, Keras и TensorFlow: концепции, инструменты и методы создания интеллектуальных систем. O’Reilly Media, Inc..
[4] UCI: Wine Data Set. Лицензия Creative Commons Attribution 4.0 International (CC BY 4.0)