我在 Pandas 中训练了以下 XGBClassifier:
model = XGBClassifier(
objective='binary:logistic',
base_score=0.5,
booster='gbtree',
colsample_bylevel=1,
colsample_bynode=1,
colsample_bytree=1,
enable_categorical=False,
gamma=2,
gpu_id=-1,
importance_type=None,
interaction_constraints='',
learning_rate=0.1,
max_delta_step=0,
max_depth=3,
min_child_weight=7,
monotone_constraints='(1,1,1,1,1)',
n_estimators=3,
n_jobs=1,
nthread=1,
num_parallel_tree=1,
predictor='auto',
random_state=0,
reg_alpha=0,
reg_lambda=1,
scale_pos_weight=1,
silent=True,
subsample=0.8,
tree_method='exact',
validate_parameters=1,
pred_contribs=True,
verbosity=None)
model.fit(X, Y)
生成的树如下所示:
如您所见,有 4 片叶子:
Leaf3 -> Log odds = -0.13381
Leaf4 -> Log odds = -0.05526
Leaf5 -> Log odds = -0.04303
Leaf6 -> Log odds = 0.00275
我的假设是我们在图片中看到的数字是对数赔率。
然后我使用该apply
方法检查每个样本的每棵树的预测叶子:
model.fit(X, Y)
x = pd.DataFrame((model.apply(X)))
x.to_csv('x.csv')
print(x)
打印输出如下所示:
0 1 2
0 6.0 6.0 6.0
1 3.0 3.0 6.0
2 3.0 4.0 3.0
3 6.0 6.0 6.0
4 5.0 5.0 4.0
.. ... ... ...
457 4.0 4.0 6.0
458 6.0 6.0 6.0
459 5.0 5.0 4.0
460 6.0 6.0 5.0
461 3.0 4.0 5.0
树的总数是 3(从 0 到 2),因为我设置了n_estimators=3
. 我的理解正确吗?
问题:上面这三棵树中哪一棵对应上图中显示的树(地块)?
我已经倾倒了树:
df = model.get_booster().trees_to_dataframe()
print(df)
看起来像这样:
我用橙色突出显示了与上图相对应的叶子和增益。因此,我假设树 0是算法选择的用于分割数据集的树。
现在,当我通过仅选择 tree 将用于训练 XGBClassifier 的数据帧与包含apply
结果的数据帧合并时0
,我获得了一个数据帧,其中包含我使用该model.predict_proba(X)
方法预测的概率和一个名为Leaf
包含叶子的列3,4,5,6 符合预期。问题是概率字段只包含两个值:我期待四个值(每个叶子一个)。
这是为什么?我希望为每个叶子分配一个且唯一的概率。
我怎样才能弄清楚算法选择为每个记录分配叶子的分段是什么?我在哪里可以找到实际的细分?以及如何在包含正确叶子的火车数据框中创建一列?