Популярные библиотеки Python для моделей GBM в основном используют свои API, но они не идентичны. В этой статье я сосредоточусь на методах, используемых для извлечения отдельных деревьев решений из этих моделей. Сначала я представляю нативные, специфичные для пакетов решения для этого. В конце я представляю новый общий интерфейс, который позволяет нам экспортировать древовидные структуры из произвольных древовидных моделей GBM.

СветGBM

Я начинаю с LightGBM, который предоставляет удобный trees_to_dataframeметод. Давайте подгоним модель, чтобы представить, как это выглядит.

from lightgbm import LGBMRegressor
from sklearn.datasets import make_regression

# Fitting a model
X, y = make_regression()
lgb_reg = LGBMRegressor().fit(X, y)

# Extracting trees
lgb_reg.booster_.trees_to_dataframe()

Когда я начал работать над общим интерфейсом для извлечения дерева, я решил более или менее следовать этой схеме фрейма данных.

XGBoost

К счастью, XGBoost имеет такой же метод в своем API. Я предполагаю, что идея этой функциональности была скопирована в LightGBM, потому что XGBoost — более ранний проект. Как мы видим, он имеет 11 столбцов, то есть меньше, чем его аналог LightGBM.

from xgboost import XGBRegressor

# Fitting a model
X, y = make_regression()
xgb_reg = XGBRegressor().fit(X, y)

# Extracting trees
xgb_reg.get_booster().trees_to_dataframe()

CatBoost

У CatBoost нет собственной версии trees_to_dataframe, но это не должно нас сильно удивлять. Это потому, что CatBoost обычно использует так называемые деревья забывчивости. Они симметричны и применяют один общий порог разделения для каждого уровня дерева. Возвращаемые параметры каждого отдельного узла тогда сильно избыточны. Лучший способ добраться до деревьев CatBoost — экспортировать модель с помощью метода thesave_mode. Кроме того, мы можем вызвать один из методов _get_tree_*, чтобы получить определенную информацию непосредственно из модели.

from catboost import CatBoostRegressor

# Fitting a model
X, y = make_regression()
cb_reg = CatBoostRegressor().fit(X, y, verbose=False)

# Saving model
cb_reg.save_model('cb.dump', 'json')

# Alternative - "private" methods
obj = cb_reg._object

# CatBoost general tree stats
obj._get_tree_count()
obj._get_tree_leaf_counts()

# Node values
obj._get_tree_leaf_values()
obj._get_tree_node_to_leaf()
obj._get_tree_splits()
obj._get_tree_step_nodes(0)

# Drawing an example of a CatBoost symmetrical tree
# We intentionally limit the maximum tree depth to have a clearer graph
cb_reg = CatBoostRegressor(depth=3).fit(X, y, verbose=False)
cb_reg.plot_tree(
    tree_idx=0
).render(filename='cb_tree', format='png')

научное обучение

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

from sklearn.ensemble import GradientBoostingRegressor

# Fitting a model
X, y = make_regression()
gb_reg = GradientBoostingRegressor().fit(X, y)

# Extracting trees
gb_reg.estimators_

Общий интерфейс

Пакет scikit-gbm предлагает унифицированный интерфейс для извлечения деревьев в виде фрейма данных из следующих моделей GBM:

  • XGBoost
  • СветGBM
  • CatBoost
  • GradientBoosting* (научное обучение)

Имена столбцов сохраняются во всех реализациях, специфичных для модели, но не все характеристики доступны для каждой реализации на данный момент. Они четко перечислены в документации scikit-gbm.

Как это использовать? Сначала установите новейшую версию scikit-gbm с помощью приведенной ниже команды.

pip install scikit-gbm -U

Затем импортируйте функцию trees_to_dataframe и используйте ее, как показано ниже.

from skgbm.tools import trees_to_dataframe

# Creating data
X, y = make_regression()

# Regressors
xgb_reg = XGBRegressor().fit(X, y)
lgb_reg = LGBMRegressor().fit(X, y)
cb_reg = CatBoostRegressor().fit(X, y, verbose=False)
gb_reg = GradientBoostingRegressor().fit(X, y)

# Getting trees as dataframe
xgb_df = trees_to_dataframe(xgb_reg)
lgb_df = trees_to_dataframe(lgb_reg)
cb_df = trees_to_dataframe(cb_reg)
gb_df = trees_to_dataframe(gb_reg)

# Example
gb_df

Смотрите также

Создание признаков с помощью градиентных деревьев решений