如何确定和可视化具有代表性的 XGBoost 决策树?

问题描述 投票:0回答:2

dtreeviz 有一种简单且相当直观的方式来可视化决策树。当我们使用 XGBoost 模型进行训练时,通常会创建许多树。测试数据的预测将涉及所有树的值的累积相加,以得出测试目标值。我们如何从这些树中可视化出具有代表性的树?

在尝试回答这个问题时,我使用了 sklearn 加州住房数据并使用 XGBoost 进行了训练。这是代码:

from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
import xgboost as xgb

housing = fetch_california_housing()
X_train, X_valid, y_train, y_valid = train_test_split(housing.data, housing.target, 
                                                   test_size = 0.33, random_state = 11)
dtrain = xgb.DMatrix(data=X_train, label=y_train)
dvalid= xgb.DMatrix(data=X_valid, label=y_valid)

# specify xgboost parameters and train the model
params_reg = {"max_depth":4, "eta":0.3, "objective":"reg:squarederror", "subsample":1}
xgb_model_reg = xgb.train(params=params_reg, dtrain=dtrain, num_boost_round=1000, \
      early_stopping_rounds=50, evals=[(dtrain, "train"),(dvalid, "valid")], verbose_eval=True)

当我使用

early_stopping_rounds
时,它在以下迭代处停止:

[0] train-rmse:1.46031  valid-rmse:1.47189
[1] train-rmse:1.14333  valid-rmse:1.15873
[2] train-rmse:0.93840  valid-rmse:0.95947
[3] train-rmse:0.80224  valid-rmse:0.82699
...
[308]   train-rmse:0.28237  valid-rmse:0.47431
[309]   train-rmse:0.28231  valid-rmse:0.47429

xgb_model_reg.best_iteration
是 260。

使用这棵最好的树,我绘制了一个 dtreeviz 树,如下所示:

from dtreeviz import trees
from dtreeviz.models.xgb_decision_tree import ShadowXGBDTree

best_tree = xgb_model_reg.best_iteration
xgb_shadow_reg = ShadowXGBDTree(xgb_model_reg, best_tree, housing.data, housing.target, \
                                housing.feature_names, housing.target_names)
trees.dtreeviz(xgb_shadow_reg)

我们得到这样的视觉效果:

如果我使用此

ShadowXGBDTree
为验证行绘制通过此树的预测路径,它会返回与模型预测的值不同的值。为了便于说明,我随机选择了
X_valid[50]
并绘制了它的预测路径,如下所示:

# predict
y_pred = xgb_model_reg.predict(dvalid)
# select a sample row and visualize path
X_sample = X_valid[50]
viz = trees.dtreeviz(xgb_shadow_reg,
                    X_valid, 
                    y_valid, 
                    target_name='MedHouseVal', 
                    orientation ='LR',  # left-right orientation
                    feature_names=housing.feature_names,
                    class_names=list(housing.target_names),
                    X=X_sample)            
viz

预测目标值为2.13,如图:

但是,

y_valid[50]
是 1.741,甚至
y_pred[50]
是 1.5196749,两者都不符合图中所示的值。我想这是预料之中的,因为我只使用这个特定的树进行路径预测。那么应该如何选择代表性树呢?

有什么想法可以最好地解决这个问题吗?谢谢你。

python xgboost decision-tree graph-visualization dtreeviz
2个回答
2
投票

在探索这个问题几个月后,我决定以我选择的前进方向来回应,因为其他人似乎也处于类似的情况。我提出这个问题的主要目的是弄清楚是否有办法解释 XGBoost 模型的预测。然而,由于 XGBoost 的理论上定义方式,获得单个代表性决策树看起来并不可行。相反,我决定执行SHAP分析来解释其预测。

继续问题中给出的代码,以下是执行 SHAP 分析的代码要点:

import shap

# Create a tree explainer
xgb_explainer = shap.TreeExplainer(
    xgb_model_reg, X_train, feature_names=list(housing.feature_names)
)
data_dmatrix = xgb.DMatrix(data=X_valid,label=y_valid)
y_pred = xgb_model_reg.predict(data_dmatrix)

shap_explainer_values = xgb_explainer(X_valid, y_pred)

为了说明,如果我们想解释为什么 y_pred[50] 有 1.5196749,例如,我们可以用这一行生成瀑布图:

shap.waterfall_plot(shap_explainer_values[50])

这是生成的瀑布图:

从该图中,特征经度和纬度对相反方向的预测影响最大。房屋的纬度比批次基值

E[f(x)]
正增加了2,但其经度使该值下降了-2.19。这种表示很容易有助于解释模型预测。


0
投票

在“dtreeviz”库中,该方法是识别 XGBOOST 模型中树集合中最重要的决策树。他们希望您提供最关键的树(单个决策树),这在上面的示例中被定义为“best_tree”变量。因此,虽然这种可视化方法并不是最糟糕的,但我们必须记住,还有数百棵其他树影响我们的决策。

Shapley 值是解释输入对机器学习模型影响的最常用方法之一,无论是针对特定样本还是整个数据集。然而,它是一个通用模型,这意味着它不仅仅适合决策树模型。它提供了一种更可靠的方法来理解复杂模型中每个数据点的贡献,但它只为我们提供了一个广泛的概述。

© www.soinside.com 2019 - 2024. All rights reserved.