И XGBoost, и TensorFlow - очень эффективные фреймворки для машинного обучения, но как узнать, какой из них вам нужен? Или, может быть, вам нужны оба?

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

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

В 2012 году Алекс Крижевский и его коллеги изумили мир вычислительной моделью, которая могла не только научиться определять, какой объект присутствует на данном изображении по признакам, но и выполнять само извлечение признаков - задача, которая, как считалось, была сложна даже для опытных инженеров-людей.

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

Хотя Cloud Machine Learning Engine предлагает обе платформы сейчас, не всегда ясно, какой алгоритм следует изучить в первую очередь. После решения многих задач машинного обучения, в которых используются оба метода, я собрал некоторые из своих мыслей о том, как выбирать между различными подходами.

Случай 1: Трудно разбить на функции?

Если мы узнали что-нибудь из 2012 года, так это то, что нейронные сети очень эффективны для работы с необработанными данными большого размера. Изображение, видео, текст и аудио - все это примеры необработанных данных большого размера, которые очень сложно предварительно обработать и представить в виде функций. В этих случаях использование встроенных в NN блоков извлечения признаков (CNN, LSTM, Embedding Layers) позволяет получить феноменальные результаты за долю времени, затрачиваемого на разработку классических инженерных подходов.

Случай 2: Работа с отсутствующими значениями?

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

XGBoost, с другой стороны, имеет собственный способ работы с отсутствующими данными. Во время обучения XGBoost выполняет подзадачу обучения условному исчислению данных для каждой функции. Во многих реальных проблемах отсутствуют данные, которые сами по себе содержат ценную информацию о цели. Так что для «бесплатной» обработки пропущенных значений - XGBoost выигрывает.

Случай 3: насколько глубоко у вас карманы?

Обучение нейронных сетей происходит «до неприличия параллельно», что делает их отличными для параллельного и распределенного обучения. То есть, если ваш бюджет может покрыть часы обучения на дорогих машинах с TPU или GPU.

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

Случай 4: Сколько у вас данных?

Предыдущий случай подводит нас к вопросу о том, сколько данных у вас есть. Из-за своей базовой структуры данных XGBoost ограничен в способах распараллеливания, что сокращает объем данных, которые он может обработать. Один из способов обработки массивных наборов данных - это разделение данных на сегменты и модели стекирования, что позволяет эффективно умножать количество параметров, используемых для соответствия данным.

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

Случай 5: Насколько сложны формы ввода / вывода?

XGBoost имеет больше ограничений, чем NN, в отношении формы данных, с которыми он может работать. Он обычно принимает одномерные массивы в качестве входных данных и выводит одно число (регрессия) или вектор вероятностей (классификация). По этой причине проще настроить конвейер XGBoost. В XGBoost нет необходимости беспокоиться о формах данных - просто предоставьте pandas datafame, который выглядит как таблица, установите столбец метки, и все готово.

С другой стороны, нейронные сети предназначены для работы с тензорами - матрицами большой размерности. Форма вывода и ввода NN может варьироваться в зависимости от чисел, последовательностей (векторов), изображений и даже видео. Так что для классических задач, таких как прогнозирование количества кликов на основе структурированных данных, могут хорошо работать и те, и другие. с точки зрения формы данных. Но когда дело доходит до создания более сложных преобразований данных, сетевые сети могут быть вашим единственным правильным выбором!

Случай 6: можно и то, и другое?

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

Я хотел бы поблагодарить Филипа Таннора за его проницательные замечания.

Хотите больше историй? Загляните в наш блог на Medium или подпишитесь на Gad в Twitter.