Ленивый прогноз: подбирайте и оценивайте все модели из scikit-learn с помощью одной строчки кода

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

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

«Те, кто рано встает, не добиваются прогресса. Его создали ленивые люди, пытающиеся найти более простые способы что-то сделать ».
- Роберт Хайнлайн

Скорее всего, в какой-то момент вы также подумали о том, чтобы бросить ВСЕ модели в набор данных и просто посмотреть, что произойдет. Однако это было не так просто кодировать (или, скорее, это было довольно утомительно), поэтому, вероятно, вы отказались от этой идеи и просто попробовали несколько моделей, с которыми вы работали в прошлом. Но теперь есть удобная библиотека под названием lazypredict, с помощью которой вы можете обучать все модели, доступные в scikit-learn (и многие другие, такие как XGBoost и LightGBM), с помощью одной строчки кода. Звучит здорово, правда? Посмотрим, как это работает на практике!

Практические примеры

Во-первых, вам нужно установить библиотеку, запустив:

pip install lazypredict

Скорее всего, вы столкнетесь с ошибками по поводу отсутствующих библиотек, поэтому просто установите их отдельно, используя pip или conda. Я упоминаю об этом позже как о возможном улучшении. Затем загружаем необходимые библиотеки:

from lazypredict.Supervised import LazyClassifier, LazyRegressor
from sklearn.model_selection import train_test_split
from sklearn import datasets

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

Классификационная задача

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

# load data
data = datasets.load_breast_cancer()
X, y = data.data, data.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.2, random_state=42)
# fit all models
clf = LazyClassifier(predictions=True)
models, predictions = clf.fit(X_train, X_test, y_train, y_test)

Использование lazypredict очень просто и интуитивно понятно для всех, кто знаком с scikit-learn. Сначала мы создаем экземпляр оценщика, в данном случае LazyClassifier, а затем подгоняем его к данным с помощью метода fit. Указав predictions=True при создании экземпляра LazyClassifier, мы также будем получать прогнозы всех моделей для каждого наблюдения. На всякий случай, когда мы захотим использовать их для чего-то еще. Кроме того, мы можем использовать аргумент custom_metric для передачи настраиваемой метрики, которую мы хотели бы использовать для оценки производительности моделей.

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

Еще одна важная вещь, которая довольно скрыта от пользователя, - это то, что библиотека автоматически применяет предварительную обработку к набору данных. Во-первых, он вменяет пропущенные значения с использованием SimpleImputer (используя среднее значение для числовых функций и постоянное значение ‘missing’ для категориальных). Затем он использует StandardScaler для числовых характеристик и OneHotEncoder или OrdinalEncoder для категориальных характеристик (в зависимости от количества элементов - количества уникальных значений). Хотя это удобно и гарантирует, что модели действительно будут работать, некоторые пользователи могут предпочесть другие подходы к предварительной обработке набора данных. Поэтому, на мой взгляд, это должно быть добровольной функцией библиотеки, а не обязательной.

Примечание. Чтобы функция считалась категориальной, она должна быть выражена как object тип в базовом фрейме данных. Хотя это не относится к этому набору данных, это важно для проблемы регрессии, описанной ниже. Там набор данных содержит некоторые категориальные функции (например, CHAS и RAD функции). Без преобразования типов в object библиотека будет рассматривать их как числовые функции и применять некорректную предварительную обработку!

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

Задача регрессии

Как упоминалось ранее, задача регрессии очень похожа на задачу классификации. Я использую набор данных Boston Housing и создаю экземпляр другого класса - LazyRegressor. В остальном аналогично.

# load data
boston = datasets.load_boston()
X, y = boston.data, boston.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.2, random_state=42)
# fit all models
reg = LazyRegressor(predictions=True)
models, predictions = reg.fit(X_train, X_test, y_train, y_test)

Естественно, таблица, содержащая характеристики моделей, имеет разные показатели для задачи регрессии, а именно R-Squared и RMSE. Мы могли бы добавить больше (например, MAPE), используя аргумент custom_metric. Таблица ниже усечена для краткости статьи, но список доступных регрессоров намного длиннее.

Возможные улучшения

После короткого знакомства с библиотекой lazypredict есть несколько вещей, которые, по моему мнению, могут быть значительно улучшены:

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

Выводы

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

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

Эта статья показалась интересной? Станьте участником среднего уровня, чтобы продолжить обучение, читая без ограничений. Если вы воспользуетесь этой ссылкой, чтобы стать участником, вы поддержите меня без каких-либо дополнительных затрат для вас. Заранее спасибо и до встречи!

Если вам понравилась эта статья, возможно, вас заинтересует одно из следующего:







использованная литература