Для сходимости некоторых решателей может потребоваться больше времени. Изображение из выступления Гаэля Вароко.

Лучшие алгоритмы позволяют лучше использовать то же оборудование. С более эффективным алгоритмом вы можете быстрее создать оптимальную модель. Один из способов сделать это — изменить алгоритм оптимизации (решатель). Например, логистическая регрессия scikit-learn позволяет вам выбирать между такими решателями, как newton-cg, lbfgs, liblinear, sag и saga.

Чтобы понять, как работают разные решатели, я рекомендую вам посмотреть выступление основного участника scikit-learn Gaël Varoquaux. Перефразируя часть его выступления, алгоритм полного градиента (liblinear) быстро сходится, но каждая итерация (обозначенная белым +) может быть чрезмерно дорогостоящей, поскольку требует использования всех данных. В подходе с подвыборкой каждая итерация обходится дешево, но она может сходиться гораздо медленнее. Некоторые алгоритмы, такие как сага, достигают лучшего из обоих миров. Каждая итерация дешева для вычислений, а алгоритм быстро сходится из-за метода уменьшения дисперсии. Важно отметить, что быстрая сходимость не всегда имеет значение на практике и разные решатели подходят для разных задач.

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

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

Различные методы оптимизации гиперпараметров (поиск по сетке, случайный поиск, ранняя остановка)

Чтобы добиться высокой производительности для большинства алгоритмов scikit-learn, вам необходимо настроить гиперпараметры модели. Гиперпараметры — это параметры модели, которые не обновляются во время обучения. Их можно использовать для настройки модели или функции обучения. Scikit-Learn изначально содержит пару методов настройки гиперпараметров, таких как поиск по сетке (GridSearchCV), который исчерпывающе рассматривает все комбинации параметров, и рандомизированный поиск (RandomizedSearchCV), который выбирает заданное количество кандидатов из пространства параметров с указанный дистрибутив. Недавно scikit-learn добавил экспериментальные оценщики поиска гиперпараметров, которые вдвое уменьшают поиск по сетке (HalvingGridSearchCV) и вдвое уменьшают случайный поиск (HalvingRandomSearch).

Последовательное деление пополам — это экспериментальная новая функция в версии scikit-learn 0.24.1 (январь 2021 г.). Изображение из документации.

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

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

Ранняя остановка в действии. Набор гиперпараметров 2 — это набор бесперспективных гиперпараметров, которые будут обнаружены механизмами ранней остановки Tune-sklearn и остановлены раньше, чтобы избежать пустой траты времени и ресурсов. Изображение из GridSearchCV 2.0.

Особенности Tune-sklearn включают в себя:

  • Согласованность с API scikit-learn: обычно вам нужно всего лишь изменить пару строк кода, чтобы использовать Tune-sklearn (пример).
  • Доступность современных методов настройки гиперпараметров: код легко изменить для использования таких методов, как байесовская оптимизация, ранняя остановка и распределенное выполнение.
  • Поддержка фреймворка: поддерживаются не только модели scikit-learn, но и другие оболочки scikit-learn, такие как Skorch (PyTorch), KerasClassifiers (Keras) и XGBoostClassifiers (XGBoost).
  • Масштабируемость: библиотека использует Ray Tune, библиотеку для распределенной настройки гиперпараметров, для эффективной и прозрачной параллелизации перекрестной проверки на нескольких ядрах и даже на нескольких машинах.

Возможно, наиболее важно то, что tune-sklearn работает быстро, как вы можете видеть на изображении ниже.

Вы можете увидеть значительные различия в производительности на среднем ноутбуке с помощью tune-sklearn. Изображение из GridSearchCV 2.0.

Если вы хотите узнать больше о tune-sklearn, прочтите эту запись в блоге.

Распараллеливайте или распределяйте обучение с помощью joblib и Ray

Ресурсы (темно-синие), которые scikit-learn может использовать для одноядерного (A), многоядерного (B) и многоузлового обучения (C)

Еще один способ увеличить скорость построения модели — распараллелить или распределить обучающие joblib и Ray. По умолчанию scikit-learn обучает модель, используя одно ядро. Важно отметить, что практически все современные компьютеры имеют несколько ядер.

Для целей этого блога вы можете думать о MacBook выше как об одном узле с 4 ядрами.

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

Случайный лес® — это модель, которую легко распараллелить, поскольку каждое дерево решений не зависит от других.

Scikit-Learn может распараллелить обучение на одном узле с помощью joblib, который по умолчанию использует бэкэнд «loky. Joblib позволяет вам выбирать между бэкэндами, такими как loky, multiprocessing, dask и ray. Это отличная функция, поскольку локальный бэкэнд оптимизирован не для узла или не для запуска распределенных (многоузловых) приложений. Запуск распределенных приложений может привести к множеству сложностей, таких как:

  • Планирование задач на нескольких машинах
  • Эффективная передача данных
  • Восстановление после сбоев машины

К счастью, лучевой бэкенд может справиться с этими деталями за вас, упростить работу и повысить производительность. На изображении ниже показано нормализованное ускорение с точки зрения времени выполнения Ray, Multiprocessing и Dask по сравнению с бэкендом по умолчанию loky.

Производительность измерялась на одном, пяти и десяти узлах m5.8xlarge с 32 ядрами на каждом. Производительность Loky и Multiprocessing не зависит от количества машин, поскольку они работают на одной машине. Источник изображения.

Если вы хотите узнать, как быстро распараллелить или распространить обучение scikit-learn, вы можете прочитать эту запись в блоге.

Заключение

В этом посте было рассмотрено несколько способов, с помощью которых вы можете построить лучшую модель scikit-learn за наименьшее количество времени. Есть несколько способов, присущих scikit-learn, таких как изменение функции оптимизации (решатель) или использование экспериментальных методов оптимизации гиперпараметров, таких как HalvingGridSearchCV или HalvingRandomSearch. Существуют также библиотеки, которые вы можете использовать в качестве плагинов, такие как Tune-sklearn и Ray, чтобы еще больше ускорить построение вашей модели. Если у вас есть какие-либо вопросы или мысли о Tune-sklearn и Ray, присоединяйтесь к нашему сообществу через Discourse или Slack. Если вы хотите узнать, как Луч используется в промышленности