Получите более высокую скорость обучения с CatBoost, даже если у вас нет отдельного графического процессора

Я не связан ни с одной из этих компаний. Это независимая проверка.

Эта статья предназначена для тех, у кого нет ПК или ноутбука с отдельным (дискретным) графическим процессором NVIDIA (видеокартой) и кто хочет запускать модели CatBoost со значительным ускорением.

Если у вас уже есть ПК или ноутбук с отдельным графическим процессором NVIDIA, пропустите этот контент и перейдите к следующей статье, написанной мной.



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

Однако есть некоторые приемы, которые можно использовать при обучении ЦП CatBoost для достижения значительного ускорения. Большинство из них можно реализовать, изменив значения параметров, в то время как другие требуют некоторых манипуляций с данными.

Давайте изучим их.

Уменьшите количество итераций

Количество раундов или итераций бустинга определяется параметром iterations в моделях CatBoost. Значение по умолчанию — 1000. Мы можем уменьшить это значение, чтобы ускорить обучение.

cb = CatBoostClassifier(iterations=100)
cb = CatBoostRegressor(iterations=100)

Я проверил это с набором данных из 10 миллионов строк для 100 и 1000 итераций:

  • 100 итераций: время обучения 95,5 с, показатель точности 0,72.
  • 1000 итераций: время обучения 878 секунд, показатель точности 0,74.

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

Примечание. Скорость обучения в моделях CatBoost обратно пропорциональна количеству итераций. Если вы уменьшите количество итераций, вам также необходимо увеличить скорость обучения и наоборот. Однако алгоритм автоматически регулирует скорость обучения в зависимости от количества итераций. Скорость обучения также зависит от размера набора данных. Просто установите learning_rate=None (по умолчанию) в моделях CatBoost.

Используйте все ядра ЦП

Не у всех есть отдельный GPU. Однако у вас может быть хороший процессор с большим количеством ядер. Параметр thread_count определяет, сколько ядер ЦП должен использовать при обучении модели Catboost. По умолчанию все ядра используются процессором. Это обозначается -1.

cb = CatBoostClassifier(thread_count=-1)
cb = CatBoostRegressor(thread_count=-1)

Я проверил это с набором данных из 10 миллионов строк для 3 ядер против 6 (всеядрав моем случае) ядер:

  • 3 ядра: время обучения 119 секунд, показатель точности 0,72.
  • 6 ядер:время обучения 95,5с, показатель точности 0,72

На показатель точности не влияет количество ядер ЦП, используемых в процессе обучения. Вы можете сократить время обучения примерно на 25%, если в этом случае будете использовать все (по умолчанию) ядра ЦП.

Уменьшить глубину дерева

Вы можете определить глубину каждого нового дерева, добавляемого в ансамбль в каждом раунде бустинга. Это значение можно контролировать с помощью параметра depth в моделях CatBoost. Значение по умолчанию — 6. Мы можем уменьшить это значение, чтобы ускорить обучение.

cb = CatBoostClassifier(depth=3)
cb = CatBoostRegressor(depth=3)

Я проверил это с набором данных из 10 миллионов строк для глубины дерева 3 против 6.

  • глубина-3: время обучения 95,5 с, показатель точности 0,72.
  • глубина-6: время обучения 127 секунд, показатель точности 0,74.

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

Преобразование типов данных объектов в категориальные типы данных

Вы можете использовать категориальные функции непосредственно с CatBoost. Вот как. По умолчанию Pandas хранит категориальные значения в типе данных объекта, которые нельзя использовать напрямую с CatBoost. У вас есть два варианта преодоления этого:

  • Вы можете преобразовать весь набор данных в специальный тип данных CatBoost Pool с помощью класса Pool().
  • Вы можете преобразовать тип данных object в тип данных category.
for col in data.select_dtypes(include=['object']):
  data[col] = data[col].astype('category')

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

Используйте массивы Numpy вместо фреймов данных Pandas

Как массивы Numpy, так и фреймы данных Pandas могут использоваться в качестве входных данных для алгоритмов CatBoost. Однако использование массивов Numpy для больших наборов данных значительно ускорит процесс обучения CatBoost.

Краткое содержание

Обучение CatBoost GPU можно использовать только в том случае, если на вашем ПК установлен графический процессор NVIDIA. Также обратите внимание, что вы не получите большой разницы между временем обучения ЦП и ГП, если ваш набор данных недостаточно велик.

Поэтому уловки, которые мы сегодня обсудили, очень полезны для ускорения в сценариях, где нам нужно использовать только ЦП для обучения CatBoost.

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

Читать далее (рекомендуется):

Обучайте модели CatBoost в 10 раз быстрее с графическим процессором NVIDIA!



Читать дальше (необязательно):

Выберите подходящий ноутбук для задач обработки данных и машинного обучения!



Это конец сегодняшнего поста.

Пожалуйста, дайте мне знать, если у вас есть какие-либо отзывы.

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

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

Особая заслуга принадлежит cebbiна Pixabay,который предоставил мне красивую обложку для этого поста.

Рукшан Прамодита
2021–11–21