如何从 GridSearchCV 输出可视化 XGBoost 树?

Posted

技术标签:

【中文标题】如何从 GridSearchCV 输出可视化 XGBoost 树?【英文标题】:How to visualize an XGBoost tree from GridSearchCV output? 【发布时间】:2020-09-22 08:50:39 【问题描述】:

我正在使用XGBRegressor 来拟合使用gridsearchcv 的模型。我想对树木进行可视化。

这是我关注的链接(如果重复)how to plot a decision tree from gridsearchcv?

xgb = XGBRegressor(learning_rate=0.02, n_estimators=600,silent=True, nthread=1)
folds = 5
grid = GridSearchCV(estimator=xgb, param_grid=params, scoring='neg_mean_squared_error', n_jobs=4, verbose=3 )
model=grid.fit(X_train, y_train)

方法一:

 dot_data = tree.export_graphviz(model.best_estimator_, out_file=None, 
        filled=True, rounded=True, feature_names=X_train.columns)
 dot_data

 Error: NotFittedError: This XGBRegressor instance is not fitted yet. Call 'fit' with appropriate arguments before using this estimator.

方法二:

tree.export_graphviz(best_clf, out_file='tree.dot',feature_names=X_train.columns,leaves_parallel=True)
subprocess.call(['dot', '-Tpdf', 'tree.dot', '-o' 'tree.pdf'])

同样的错误。

【问题讨论】:

【参考方案1】:

scikit-learn 的 tree.export_graphviz 在这里不起作用,因为您的 best_estimator_ 不是一棵树,而是一整棵树。

使用 XGBoost 自己的 plot_tree 和波士顿住房数据可以做到这一点:

from xgboost import XGBRegressor, plot_tree
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_boston
import matplotlib.pyplot as plt

X, y = load_boston(return_X_y=True)

params = 'learning_rate':[0.1, 0.5], 'n_estimators':[5, 10] # dummy, for demonstration only

xgb = XGBRegressor(learning_rate=0.02, n_estimators=600,silent=True, nthread=1)
grid = GridSearchCV(estimator=xgb, param_grid=params, scoring='neg_mean_squared_error', n_jobs=4)

grid.fit(X, y)

我们最好的估算器是:

grid.best_estimator_
# result (details may be different due to randomness):
XGBRegressor(base_score=0.5, booster='gbtree', colsample_bylevel=1,
             colsample_bynode=1, colsample_bytree=1, gamma=0,
             importance_type='gain', learning_rate=0.5, max_delta_step=0,
             max_depth=3, min_child_weight=1, missing=None, n_estimators=10,
             n_jobs=1, nthread=1, objective='reg:linear', random_state=0,
             reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None,
             silent=True, subsample=1, verbosity=1)

做完之后,利用this SO thread 的答案来绘制,比如说,树#4:

fig, ax = plt.subplots(figsize=(30, 30))
plot_tree(grid.best_estimator_, num_trees=4, ax=ax)
plt.show()

同样,对于树 #1:

fig, ax = plt.subplots(figsize=(30, 30))
plot_tree(grid.best_estimator_, num_trees=1, ax=ax)
plt.show()

【讨论】:

谢谢.. 当我看到树时。我注意到我的二进制变量像 A_flag < 0.5 一样拆分,但它只包含 0, 1。如何纠正这一点。有任何想法吗。 ? @MAC 实际上没有什么可纠正的;它实际上意味着A_flag != 1 - 这只是规则树在内部表示的方式,这是这种变量的普遍问题。 请不要在 cmets 中发布代码(我真的不可读)并且不要使用 cmets 来解决此类后续问题。改为打开一个问题(如有必要,您可以添加指向该问题的链接)。 在上面的回归图中,yes, missing 是什么意思?这是否意味着它满足条件? @MAC 满足条件,或者缺少值 - 树以能够处理缺失值而闻名

以上是关于如何从 GridSearchCV 输出可视化 XGBoost 树?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 gridSearchCV 的输出中获取特征名称

如何从 Scikit-Learn 的详细输出中估计 GridSearchCV 的进度?

如何从 gridsearchcv 绘制决策树?

ASP 如何输出

sklearn - 如何从传递给 GridSearchCV 的管道中检索 PCA 组件和解释方差

如何从 GridsearchCV 获取 feature_importances_