Популярные библиотеки 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