Недавно я имел удовольствие иметь дело с набором данных, который был больше, чем самый большой экземпляр, который мог предоставить AWS SageMaker (то есть 384 ГБ ОЗУ). Не уверен, что это был за тип экземпляра, но это не имеет значения.

Так или иначе, при использовании LightGBM обучение OOM было убито. Поскольку обучающая выборка будет увеличиваться, станет очевидным, что необходимо найти решение, более масштабируемое, чем обучение на одном экземпляре. Ниже я просто изложу свои выводы, которые я получил, изучая доступные варианты.

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

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

Но хорошо, без вопроса масштабируемости, на что мы могли бы пойти, если бы мы хотели обучить модель дерева решений (модели RF или GB)? Ну, вот наши самые основные варианты:

  1. ЛайтГБМ
  2. XGBoost (о различиях между двумя последними см. этот потрясающий пост в блоге)
  3. Catboost.ai
  4. SparkML — разумеется, это масштабируемое решение, но здесь есть свои нюансы.
  5. Естественно, вы можете пойти sklearn.
  6. Вы называете это.

Очевидно, что sklearn, XGBoost, LightGBM и CatBoost довольно просты. Хороший чистый API Python делает их простыми в использовании.

Теперь, когда дело доходит до конкретной реализации SparkML, становится немного смешно. У вас там реализованы и подходы ДТ РФ и ГБ. Однако, несмотря на то, что оба подхода по сути делают одно и то же, с точки зрения обоих классификаторов поездов, у них есть некоторые забавные различия в их интерфейсах после обучения.

В частности, естественно, что вы можете захотеть построить кривые PR/ROC для задач бинарной классификации. Ну, а для классификатора Random Forest это вполне можно сделать: вот оно, если хотите, можете получить его там.

Насколько я понимаю, нет никакого способа получить то же самое для классификатора GBT — API для этого просто не существует. На той же странице нет ничего похожего, несмотря на наличие аналогичных API для других методов классификации. В любом случае, с SparkML, несмотря на то, что он хорошо работает с любыми большими наборами данных, вам в основном придется выполнить некоторую домашнюю работу по оценке модели GBT. Кроме того, у вас возникнут проблемы с удобным HPO, и у вас не будет такого тонкого контроля над параметрами, как при использовании более классических библиотек.

Тем не менее, часто можно увидеть заявления о том, что LightGBM или XGBoost на самом деле превосходят реализацию SparkML, по крайней мере, с точки зрения показателя AUC.

Что нам делать, если мы хотим масштабировать эти библиотеки?

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

Давайте посмотрим на этот пример: есть классная библиотека под названием Dask. Таким образом, XGBoost может использовать Dask в качестве бэкэнда, что-то вроде этого должно произойти.

Теперь нам просто нужно найти тех, кто уже приложил усилия для расширения библиотек машинного обучения. Итак, у нас есть:

  1. DaskML — это одна интеграция с XGBoost и LightGBM.
  2. Другим отличным примером интеграции является SynapseML — он в основном исходит от самих Microsoft, изначально интегрирует Spark и LightGBM и предоставляет тот же интерфейс для LightGBM, что и у вас обычно.

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

Надеюсь, это поможет!