Кодовый подход

Этот блог был впервые опубликован в блоге Dataiku здесь.

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

Этим интересам хорошо соответствуют два предложения Snowflake:

  • Snowpark Python может повысить производительность — уменьшить перемещение данных и распараллелить вычисления (для определенных API-интерфейсов Snowpark, например, DataFrames).
  • Snowpark ML, новый набор инструментов машинного обучения Snowflake, делает обучение моделей машинного обучения проще и доступнее.

Мы особенно рады новому пакету snowflake-ml-python, который выигрывает от запуска кода Python в Snowpark, отражая знакомый синтаксис scikit-learn, XGBoost и LightGBM, который знают и любят специалисты по данным.

В этом блоге мы рассмотрим полностью написанное на Python решение для обучения моделей с использованием Dataiku и Snowpark ML.

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

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

Вот наш окончательный поток проекта:

Шаги высокого уровня в этом проекте:

Очистка данных + разработка функций (Snowflake SQL + Snowpark Python)

  • Подключиться к данным о прошлых запросах на кредит и данным о клиентах в S3
  • Синхронизация со Snowflake через быстрый путь (COPY INTO)
  • Очистите беспорядочные значения с помощью визуального рецепта подготовки и пользовательского кода SQL.
  • Объединение таблиц вместе в общем поле «CUSTOMER_ID»
  • Разрабатывайте новые функции с помощью пользовательских функций Snowpark.

Обучение моделей (Snowpark ML)

  • Функции процесса — изменение масштаба, кодирование, вменение отсутствующих значений
  • Настройте гиперпараметры для нескольких алгоритмов с помощью RandomizedSearch.
  • Разверните наиболее обученную модель в качестве сохраненной модели Dataiku (зеленый ромб).
  • Вывод артефактов обученной модели, обучение, тестовые наборы для прозрачности

На этот раз мы собираемся пропустить раздел очистка данных + разработка функций. (Если вы хотите узнать больше о возможностях Dataiku по очистке данных и разработке функций, специфичных для Snowflake и Snowpark, посмотрите это видео).

Читайте полное пошаговое руководство (с кодом!) по обучению модели машинного обучения с помощью Snowpark ML и Dataiku.

0 — Настройка среды Python 3.8 и рецепт кода Python

Во-первых, мы создадим среду кода Python 3.8 в Dataiku. Мы назвали его «py_38_snowpark». Измените версии основных пакетов на Pandas 1.3, вставьте пакеты из списка ниже и нажмите «Обновить».

Вот полный список пакетов:

Вернемся к потоку нашего проекта. Мы начнем с очищенного набора входных данных с помеченными целевыми значениями для всех заявок на получение кредита (по умолчанию или нет). Затем мы создаем рецепт Python с тремя выходами:

  • Набор данных поезда (Снежинка)
  • Тестовый набор данных (Снежинка)
  • Папка обученной модели (S3)

Теперь переходим к коду. Мы рассмотрим 11 блоков кода, описывая, что делает каждый из них. Все они должны быть объединены в один рецепт Python.

1 — Импорт пакетов Python

Начнем с импорта пакетов — вы заметите новый импорт Snowpark ML внизу. Синтаксис здесь такой же, как у их эквивалентных классов/функций в scikit-learn, XGBoost и LightGBM.

2 - Определите входные данные рецепта, выходные данные и другие параметры обучения

В следующем блоке кода мы укажем на наш входной набор данных, два набора выходных данных обучения/тестирования и папку для хранения обученных моделей. Мы можем назвать нашу окончательную модель, выбрать целевой столбец (в нашем случае «ПО УМОЛЧАНИЮ»), выбрать соотношение обучения/тестирования, метрику подсчета очков, использовать ли веса классов и другие параметры.

Затем мы выбираем входные объекты для ввода в модель. Обратите внимание на структуру этого списка словарей. Каждый словарь содержит имя объекта, метод масштабирования/кодирования и метод вменения отсутствующих данных.

3 — Настройка отслеживания экспериментов MLflow

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

Мы будем использовать API-интерфейсы Dataiku и MLflow для создания нового эксперимента для отслеживания процесса обучения нашей модели.

4 — Настройка сеанса в сноупарке

Код обучения нашей модели будет работать в Snowpark, средах выполнения Snowflake и библиотеках, которые развертывают и обрабатывают код, отличный от SQL, в Snowflake. Интеграция Dataiku Snowpark позволяет нам создать сеанс Snowpark, используя те же учетные данные, которые мы используем для подключения к входной таблице Snowflake.

5 - Добавьте столбец весов целевого класса и разделите на наборы поездов / тестов.

Сначала мы сопоставляем тип данных целевого столбца с более общим типом, поддерживаемым различными алгоритмами ML.

Затем мы добавляем новый столбец SAMPLE_WEIGHTS, равный весам классов нашего целевого столбца. Это поможет смягчить проблемы дисбаланса целевых классов. Analytics Vidhya имеет отличное объяснение темы здесь.

Со стандартными классами алгоритмов scikit-learn, XGBoost и LightGBM вы можете просто передать аргумент class_weights = balance, чтобы решить эту проблему. Snowpark ML не позволяет использовать этот аргумент, вместо этого требуется явный столбец «SAMPLE_WEIGHTS» для всех строк. В приведенном ниже блоке кода показано, как вы можете это сделать.

Наконец, мы записываем фреймы данных Snowpark для обучения/тестирования в виде постоянных таблиц в Snowflake.

6 - Создайте конвейер преобразования функций

Основываясь на функциях и параметрах предварительной обработки, которые мы выбрали ранее, мы теперь переводим их в соответствующие классы Scaler, Encoder и Imputer, а затем объединяем их в конвейер.

Вы заметите, что синтаксис этих классов Snowpark ML такой же, как у их эквивалентов в scikit-learn.

7 — Инициализируйте алгоритмы и пространства гиперпараметров для рандомизированного поиска

Мы собираемся попробовать четыре разных алгоритма: логистическая регрессия, случайный лес, XGBoost и LightGBM.

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

Например, для параметра n_estimators мы добавляем префикс clf__, а затем передаем случайное целочисленное распределение от X до Y. Алгоритм RandomizedSearch будет случайным образом пробовать целые числа между X и Y.

Если вы хотите попробовать непрерывное распространение, вы можете использовать что-то вроде scipy uniform или loguniform (см. clf__learning_rate).

Параметр n_iter определяет, сколько комбинаций гиперпараметров нужно попробовать для каждого алгоритма.

8 — Обучайте модели, запускайте рандомизированный поиск

Этот код запускает обучение нашей модели и процесс настройки гиперпараметров.

Обратите внимание на аргументы, которые мы передаем в объект RandomizedSearchCV: input_cols, label_cols, output_cols, sample_weight_col. Они немного отличаются от эквивалента scikit-learn и являются фундаментальными для всех классов алгоритмов машинного обучения в библиотеке машинного обучения Snowpark. Snowflake объясняет эти различия в своей документации здесь.

9. Регистрируйте гиперпараметры, показатели производительности и объекты обученной модели в MLflow.

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

Этот код будет регистрировать тип алгоритма, гиперпараметры, показатели производительности перекрестной проверки и объекты обученной модели (в папку S3, которую мы выбрали ранее).

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

10 — Сохраните лучшую обученную модель как сохраненную модель Dataiku (зеленый ромб)

Этот блок кода возьмет лучшую обученную модель (в соответствии с выбранной вами метрикой производительности, в нашем случае ROC AUC) и развернет ее как сохраненную модель Dataiku (зеленый ромб в нашем потоке).

Последняя строка…

mlflow_version.evaluate(output_test_dataset_name, container_exec_config_name='NONE')

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

Эта строка также генерирует готовые диаграммы производительности модели Dataiku и диаграммы объяснимости, такие как эта диаграмма эффектов функций Shapley:

Эта таблица анализа субпопуляций:

И эта матрица путаницы:

11 - Добавьте сохраненную модель Dataiku в качестве вывода в рецепт Python

Примечание. Вы должны запускать этот последний блок кода только в самом рецепте Python — не запускайте его в блокноте Jupyter.

Этот код добавит недавно созданную сохраненную модель Dataiku (зеленый ромб) в качестве выходных данных рецепта Python (вместо того, чтобы плавать в потоке без ввода).

Что дальше

Поздравляю! Вы справились с этой объемной, насыщенной кодом статьей.

Отсюда мы можем:

  • Создайте еще один рецепт Python, используя Snowpark ML для пакетного вывода новых заявок на получение кредита.
  • Разверните обученную модель в качестве конечной точки RESTful API для логического вывода в реальном времени в Snowpark Container Services, доступной в режиме Private Preview (видео здесь).
  • Используйте узел управления Dataiku для контроля и мониторинга наших развернутых моделей (подробнее об управлении здесь).

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

Нижний призыв к действию Перейти дальше на страницу управления Dataiku: https://www.dataiku.com/product/key-capabilities/governance/