0

我在 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 符合预期。问题是概率字段只包含两个值:我期待四个值(每个叶子一个)。

在此处输入图像描述

这是为什么?我希望为每个叶子分配一个且唯一的概率。

我怎样才能弄清楚算法选择为每个记录分配叶子的分段是什么?我在哪里可以找到实际的细分?以及如何在包含正确叶子的火车数据框中创建一列?

4

0 回答 0