Chefboost - альтернативная библиотека Python для древовидных моделей

Обзор основных отличий от scikit-learn

Я случайно наткнулся на chefboost в своей ленте Twitter и, учитывая, что никогда не слышал об этом раньше, я решил быстро изучить его и проверить. В этой статье я кратко представлю библиотеку, упомяну ключевые отличия от стандартной библиотеки scikit-learn и покажу быстрый пример chefboost на практике.

Краткое введение в chefboost

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

По сравнению с scikit-learn, это три особенности chefboost, которые выделяются:

  • поддержка категориальных функций, то есть нам не нужно предварительно обрабатывать их, используя, например, одноразовое кодирование.
  • деревья решений, обученные с использованием chefboost, сохраняются как операторы if-else в специальном файле Python. Таким образом, мы можем легко увидеть, какие решения принимает дерево, чтобы прийти к заданному прогнозу.
  • мы можем выбрать один из нескольких алгоритмов для обучения деревьев решений.

Следуя последнему пункту, chefboost предоставляет три алгоритма для деревьев классификации (ID3, C4.5 и CART) и один алгоритм для деревьев регрессии. Честно говоря, я не был полностью уверен, какой из них в настоящее время реализован в scikit-learn, поэтому я проверил документацию (которая также предоставляет красивое и краткое изложение алгоритмов). Оказывается, scikit-learn использует оптимизированную версию алгоритма CART без поддержки категориальных функций.

Вдобавок к тому, что мы уже рассмотрели, chefboost также предлагает несколько более продвинутых древовидных методов, таких как Random Forest, Gradient Boosting и Adaboost.

Пример на Python

Как всегда, мы начинаем с импорта библиотек.

В этом примере мы будем использовать набор данных Adult. Вы, вероятно, уже сталкивались с этим раньше, но вкратце цель состоит в том, чтобы предсказать, будет ли годовой доход взрослого человека выше или ниже 50 000 долларов США. И для этого мы используем набор числовых и категориальных признаков из базы данных переписи 1994 года. Вы можете найти исходный набор данных здесь.

Одна особенность chefboost - это подход к целевой переменной - она ​​должна храниться в том же фрейме данных, что и функции, должна называться Decision и должна быть самым последним столбцом фрейма данных. Довольно странно, но, вероятно, на то есть веская причина.

Мы также разделим данные на обучающие и тестовые наборы. Однако эта нестандартная структура данных требует немного другого использования функции scikit-learn train_test_split. Несмотря на то, что набор данных не сильно разбалансирован, мы использовали стратифицированное разделение по целевому столбцу.

Обычно мы также кодируем категориальные функции как логические пустышки, но chefboost может обрабатывать их напрямую. Поэтому приступаем к обучению модели.

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

Учитывая, что наши данные содержат как категориальные, так и числовые характеристики, мы могли бы также использовать алгоритм C4.5, но не ID3, поскольку он не может справиться с числовыми функциями.

После завершения обучения мы получаем следующее резюме.

Приятно видеть столько показателей из коробки, но что сразу бросается в глаза, так это время обучения. На тренировку этого единственного дерева ушло более 10 минут! Можно распараллелить обучение, установив enableParallelism на True в config словаре. Таким образом, ветви дерева обучаются параллельно. Однако это не привело к реальному увеличению скорости тренировки, по крайней мере, на моем тренажере.

Кстати, еще одно отличие от scikit-learn состоит в том, что chefboost в основном использует функции вместо классов.

В результате обучения модели был создан новый файл - ›rules.py. Как упоминалось во введении, он содержит всю структуру дерева решений в виде вложенных операторов if-elif-else.

Ниже вы можете увидеть часть скрипта, общая длина которой составляет 20,5 тыс. Строк. С одной стороны, логика принятия решений достаточно ясна, чтобы следовать такой вложенной структуре. Но с другой стороны, без ограничения максимальной глубины дерева (что я не думаю, что это возможно для деревьев решений в chefboost), вообще нелегко проследить путь принятия решения.

Обучив модель, мы можем сохранить ее в файле pickle или загрузить прямо из файла rules.py с помощью функции restoreTree.

Чтобы получить прогноз, мы используем функцию predict.

И, как вы могли заметить, мы передали в функцию только одну строку данных. К сожалению, это единственный способ chefboost делать прогнозы. Мы можем, естественно, перебрать весь фрейм данных, но это не так удобно, как метод прогнозирования scikit-learn.

Вместо этого мы можем выполнить оценку с помощью функции evaluate.

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

Еще одна функция, предоставляемая библиотекой, - это анализ важности функций. Я не буду вдаваться в подробности того, как он рассчитывается (вы можете найти их здесь). Чтобы получить значения, нам нужно использовать функцию feature_importance и указать путь к файлу rules.py в качестве аргумента.

Результаты показывают, что возраст является наиболее важной характеристикой для прогнозирования того, зарабатывает ли кто-то более 50 тысяч долларов в год.

В последнюю очередь я хотел сравнить скорость chefboost с scikit-learn. Естественно, деревья решений в последней библиотеке требуют данных в другом формате, поэтому мы готовим их соответствующим образом.

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

CPU times: user 1e+03 ns, sys: 0 ns, total: 1e+03 ns 
Wall time: 3.1 µs

Это большая разница ... Я не уверен, в чем причина этого, я бы сделал ставку на создание представления дерева if-else.

Выводы

  • chefboost - альтернативная библиотека для обучения древовидных моделей,
  • главные особенности, которые выделяются, - это поддержка категориальных функций и вывод моделей в виде вложенных операторов if-else,
  • обучение происходит намного медленнее по сравнению с scikit-learn, и выбор гиперпараметров для настройки очень ограничен.

Вы можете найти код, использованный для этой статьи, на моем GitHub. Также приветствуются любые конструктивные отзывы. Вы можете связаться со мной в Твиттере или в комментариях.

Если вам понравилась эта статья, возможно, вас заинтересует одно из следующего: