Создавайте управляемые и масштабируемые рабочие процессы машинного обучения с помощью skdag

Scikit-learn предоставляет нам гибкую структуру для определения задач машинного обучения (ML), но его поддержка для объединения этих задач в более крупный рабочий процесс часто слишком ограничена для беспорядочного производственного мира. skdag предлагает более мощный подход к составлению задач, который позволяет вам получить гораздо больше от ваших инструментов машинного обучения.

Подход Scikit-Learn к машинному обучению популярен не просто так. Он предоставляет специалистам по машинному обучению общий язык для описания и реализации многих задач. Давайте кратко рассмотрим некоторые ключевые части этого языка:

  1. Эстиматор – это объект, который получает данные и извлекает из них что-то в своем fit()методе.
  2. Преобразователь — тип оценщика, который каким-то образом фильтрует или модифицирует входные данные с помощью своего метода transform().
  3. Прогноз — тип оценщика, который делает выводы из входных данных с помощью метода predict().
  4. Метаоценщик — оценщик, который принимает один или несколько оценщиков в качестве входных параметров и что-то с ними делает. Метаоценщики можно использовать для ряда задач, включая оптимизацию гиперпараметров (например, GridSearchCV), сборку моделей (например, StackingClassifier) или композицию рабочего процесса (Pipeline).

Метаоценщики для композиции рабочего процесса сосредоточены на простоте: простоте как интерфейса композиции, так и самой композиции. Вот краткий пример создания небольшого пайплайна:

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

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

…возраст, пол, индекс массы тела, среднее кровяное давление и шесть измерений сыворотки крови

Эти характеристики весьма разнообразны. Имеет ли смысл выполнять одинаковую предварительную обработку для всех из них? Возможно нет. Вот как мы можем по-другому обрабатывать некоторые функции, используя только то, что дает нам sklearn:

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

Замена пайплайнов графами

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

Многие производственные платформы, используемые в отрасли, определяют рабочие процессы машинного обучения как DAG именно по этим причинам, но им не хватает тесной интеграции с API-интерфейсом scikit-learn, который может сделать конвейеры настолько простыми в использовании, а также сопряжен с большим количеством дополнительных накладных расходов, необходимых для других целей. например, отложенные зависимости и распределенная обработка. Эти функции не нужны для многих вариантов использования, в которых преуспевает scikit-learn, таких как мелкомасштабные эксперименты и определение архитектур моделей (которые затем можно запускать в некоторых из вышеупомянутых фреймворков). Здесь на помощь приходит skdag (pip install skdag). skdag — это небольшое расширение для scikit-learn, реализующее метаоценки DAG. Это позволяет выйти за рамки трубопроводов и столбчатых трансформаторов несколькими способами. Давайте продемонстрируем, воссоздав наш предыдущий рабочий процесс в skdag:

С подходом DAG, независимо от сложности нашего рабочего процесса, код всегда будет представлять собой простой список шагов, каждый из которых определяет, каковы его зависимости. Зависимости могут быть просто списком имен шагов, или, если мы хотим взять только определенные столбцы из выходных данных шага, мы можем предоставить словарь имен шагов для столбцов. Еще одним преимуществом использования skdag является то, что он позволяет легко визуализировать рабочий процесс с помощью dag.show(), что может быть очень полезно для проверки того, что сложные рабочие процессы выполняют то, что мы ожидаем:

Еще одним преимуществом использования DAG является возможность лучше понять зависимости. В приведенном выше DAG мы видим, что mean, ohe, ref и median не зависят друг от друга, поэтому теоретически нет причин, по которым мы не могли бы выполнять их все одновременно. Одно небольшое изменение в нашем создании DAG позволяет нам сделать это на практике. Замена make_dag() на make_dag(n_jobs=-1) заставит DAG выполнять шаги параллельно, где это возможно.

Стекирование моделей

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

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

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

Надеемся, что эта небольшая демонстрация продемонстрирует вам преимущества использования DAG вместо конвейеров для создания управляемых и поддерживаемых рабочих процессов машинного обучения — и этот skdag станет еще одним полезным элементом вашего набора инструментов!