kelijah

Categories:

Черновое сравнение XGBoost, LightGBM и CatBoost на классификации MNIST

Задача - классическая многоклассовая классификация изображений рукописных цифр MNIST. Для этой задачи не только хорошо известны результаты для самых разных матмоделей (включая бустинг поверх разных способов получения фич), но и датасет легко доступен, компактен и удобен. На такой задаче очень удобно посмотреть на достоинства и недостатки трех реализаций градиентного бустинга.

Снижение размерности

Датасет представляет из себя набор из нескольких десятков черно-белых картинок размером 28*28 пикселей с 256 градациями. Развернув картинку в вектор, получаем 784 признака на сэмпл. Многовато. XBGoost на таких сэмплах учится более часа на моем железе, и это сильно снижает возможности пройтись по пространству гиперпараметров и получить оптимальный набор настроек. То есть эксперименты затруднены.

Поэтому я решил сжать каждое изображение с помощью Variational AutoEncoder до 64 параметров. Реализацию VAE я взял прямо из репозитория Keras  https://github.com/fchollet/keras/blob/master/examples/variational_autoencoder.py.

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

Исходный текст моделей

Лежит тут: https://github.com/Koziev/MNIST_Boosting

Простой запуск модели с XGBoost: https://github.com/Koziev/MNIST_Boosting/blob/master/xgb_solver.py

Модель для XGBoost с автоподбором оптимальных гиперпараметров: https://github.com/Koziev/MNIST_Boosting/blob/master/xgb_hyperopt_solver.py

Простой запуск модели с CatBoost: https://github.com/Koziev/MNIST_Boosting/blob/master/catboost_solver.py

Модель на базе CatBoost с автоподбором гиперпараметров: https://github.com/Koziev/MNIST_Boosting/blob/master/catboost_hyperopt_solver.py

Простой запуск модели с LightGBM: https://github.com/Koziev/MNIST_Boosting/blob/master/lgb_solver.py

LightGBM+hyperopt: https://github.com/Koziev/MNIST_Boosting/blob/master/lgb_hyperopt_solver.py

Результаты

Модели оценивались по значению logloss для тестовой выборки, и по значению точности на этой выборки.

Оптимум для XGBoost: loss=0.07388 accuracy=0.9771

Сложность модели nb_trees=2110

Параметры:

colsample_bylevel=0.79407015729

colsample_bytree=0.774391443402

eta=0.0365253500815

gamma=0.271712091643

max_depth=5

min_child_weight=3

subsample=0.789639281187


Оптимум для CatBoost: loss=0.06604 acc=0.9795

Сложность модели nb_trees=5000

Параметры:

depth=5

l2_leaf_reg=3.9929584522

learning_rate=0.074145102527

rsm=0.886509605881


Оптимум для LightGBM: loss=0.07778 acc=0.9746

Сложность модели nb_trees=1524

Параметры:

bagging_fraction=0.833101831133

bagging_freq=1

feature_fraction=0.751239261223

lambda_l1=0.110106345011

lambda_l2=7.95206521096

learning_rate=0.0781161945654

max_bin=505

min_data_in_leaf=190

min_sum_hessian_in_leaf=2.95811347679

num_leaves=128

Предварительные выводы

1) В целом, CatBoost вполне может соперничать с XGBoost, по крайней мере на некоторых задачах. Например, на задаче https://www.kaggle.com/c/msk-redefining-cancer-treatment у меня XGBoost рвет CatBoost как тузик грелку.

2) Подбор правильных гиперпараметров очень важен.

3) Скорость обучения для CatBoost надо задавать больше, чем аналогичный параметр для XGBoost и LightGBM.

Error

Anonymous comments are disabled in this journal

default userpic

Your reply will be screened