Получите более высокую скорость обучения с 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