Выбор между моделями ML с использованием конвейеров для повторного использования кода

Просматривая сообщения, мы можем найти много рецептов о том, как начать проект машинного обучения, популярное "Hello World!".

Обычно эти рецепты включают следующие этапы:
1. Сбор данных
2. Подготовка данных
3. Обучение модели
4. Оценка ее
5. Улучшение…

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

Мы говорим себе «Давай поиграем с этим», следуя «рецепту».
Через час мы получим, так сказать, большой ком грязи, известный спагетти-код. Наш эксперимент завершится отсутствием воспроизводимости, подверженностью ошибкам и, если честно, нечем гордиться.

Кроме того, в нашем потоке есть много скрытых шагов, таких как выбор модели и настройка гиперпараметров, которые не будут отображаться в модели развертывания (они также важны).

Итак, как нам сделать наш код упорядоченным, воспроизводимым и гибким? Можем ли мы получить модульное решение? Как?

Мы можем решить такие проблемы, используя утилиты конвейера sklearn.

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

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

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

Проблема: накачайте, анализ данных о грунтовых водах

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

1. Анализ набора данных

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

В общих чертах и ​​в первом приближении мы отбросим некоторые признаки, которые кажутся похожими по информации.

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

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

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

В нашем наборе данных мы в конечном итоге удаляем следующее: «pay_type», «extraction_type_group», «management_group», «quantity_group», «source_type», «waterpoint_type_group».

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

2. Склонность к мышлению? Быстро создайте свою первую систему, а затем повторите ее.

По сути, это применение гибкой методологии.

Обобщенная концепция:

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

3. Автоматизируйте рабочий процесс: конвейеры!

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

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

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

  • sklearn.pipeline.Pipeline: для создания каналов мы также можем использовать метод make_pipeline.
  • sklearn.pipeline.FeatureUnion: объединение каналов.
  • sklearn.preprocessing.FunctionTransformer: чтобы создать преобразователь из нашего кода и сделать наши каналы более гибкими.

FunctionTransformer используется для создания селекторов столбцов:

В следующем коде показано, как создать конвейер предварительной обработки.

OrdinalEncoder в текстовом канале взят из *category_encoders*. Он более мощный, чем LabelEncoder, когда у нас есть невидимые метки.

Наш конвейер предварительной обработки разделен еще на 3 канала: дата, числовая и текстовая предварительная обработка! Его легко воспроизвести, протестировать и построить на его основе больше труб.

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

Приведенный выше метод позволяет нам построить множество конвейеров со многими классификаторами! Это немного чище, чем разреженное кодирование во многих ячейках.

4. Краткий обзор модели

Теперь, когда наш конвейер запущен и работает, нам нужно выбрать модель, которая лучше всего соответствует нашим данным, чтобы затем иметь возможность прогнозировать новые случаи. Чтобы получить нашу первую модель, мы будем использовать cross_val_score от sklearn:

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

Но подождите, Почему мы используем конвейер для каждого классификатора? Преобразователи как оценщики должны быть изучены на обучающем наборе и применены к тестовому набору (протянутому) для предсказания. ; Конвейеры упрощают эту задачу! Каждый раз, когда вы вписываете полную трубу, вы будете тренировать трансформеров и оценщика!

Помните: легкость воспроизведения — это ключ

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

Выполнение кода выше было:

********** Start **********
XGBClassifier : 0.7336868686868687 +/- 0.0029033449613791182
Time spent : 0:00:26.835271
********** End **********
********** Start **********
LGBMClassifier : 0.7723063973063974 +/- 0.0009899791533999399
Time spent : 0:00:10.892493
********** End **********
********** Start **********
RandomForestClassifier : 0.8024242424242424 +/- 0.0021431445901952087
Time spent : 0:00:18.336419
********** End **********
********** Start **********
CatBoostClassifier : 0.7148653198653198 +/- 0.0023408544566768295
Time spent : 0:00:07.668704
********** End **********

Как мы видим, RandomForest имеет лучшую точность, но он очень медленно обучается. Несмотря на это, мы выберем его.

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