xgboost 回归树的叶值与预测有何关系

Posted

技术标签:

【中文标题】xgboost 回归树的叶值与预测有何关系【英文标题】:how are the leaf values of xgboost regression trees relate to the prediction 【发布时间】:2021-09-01 02:49:11 【问题描述】:

似乎每棵树的对应叶子值之和不等于预测。这是一个示例代码:

X = pd.DataFrame('x': np.linspace(-10, 10, 10))
y = X['x'] * 2
model = xgb.XGBRegressor(booster='gbtree', tree_method='exact', n_estimators=100, max_depth=1).fit(X, y)
Xtest = pd.DataFrame('x': np.linspace(-20, 20, 101))
Ytest = model.predict(Xtest)
plt.plot(X['x'], y, 'b.-')
plt.plot(Xtest['x'], Ytest, 'r.')

树转储内容如下:

model.get_booster().get_dump()[:2]

['0:[x<0] yes=1,no=2,missing=1\n\t1:leaf=-2.90277791\n\t2:leaf=2.65277767\n',
 '0:[x<2.22222233] yes=1,no=2,missing=1\n\t1:leaf=-1.90595233\n\t2:leaf=2.44333339\n']

如果我只用一棵树做预测:

Ytest2 = model.predict(Xtest, ntree_limit=1)
plt.plot(XX1['x'], Ytest2, '.')
np.unique(Ytest2)  # array([-2.4028,  3.1528], dtype=float32)

显然,Ytest2 的唯一值不对应于第一棵树的叶值,即-2.902777912.65277767,尽管观察到的分裂点正好在 0。

    叶值与预测有何关系? 如果输入是对称的,为什么第一棵树中的叶值不对称?

【问题讨论】:

【参考方案1】:

拟合第一棵树之前,xgboost 会进行初始预测。这由参数base_score 控制,默认为0.5。事实上,-2.902777 + 0.5 ~=-2.40282.652777 + 0.5 ~= 3.1528

这也解释了您的第二个问题:与初始预测的差异不是对称的。如果你设置learning_rate=1,你可能会在一轮之后得到对称的预测,或者你可以设置base_score=0

【讨论】:

我实际上测试了model.base_score,它返回None。如何使用base_score xgb 在将 python 默认值始终设置为 None 时有点奇怪,然后在其较低级别的代码中设置真正的默认值。我还没有找到它在哪里这样做,但是文档确实将默认值宣传为 0.5,并且在您的情况下算术检查。 (你能用n_tree_limit=0 打电话给predict 吗?)

以上是关于xgboost 回归树的叶值与预测有何关系的主要内容,如果未能解决你的问题,请参考以下文章

再谈XGBoost原理

xgboost原理

如何在 R 中绘制回归树的预测值与实际值? [关闭]

随机森林、GBDT、Xgboost

模型树——就是回归树的分段常数预测修改为线性回归 对于非线性回归有较好的预测效果

xgboost 包和随机森林回归