gpt4 book ai didi

python - 为什么各个树的 xgboost 回归预测存在差异?

转载 作者:行者123 更新时间:2023-11-30 08:48:11 30 4
gpt4 key购买 nike

首先,我运行一个非常简单的 xgb 回归模型,其中仅包含 2 棵树,每棵树有 1 个叶子。可用数据here 。 (我知道这是一个分类数据集,但我只是强制回归来演示这里的问题):

import numpy as np
from numpy import loadtxt
from xgboost import XGBClassifier,XGBRegressor
from xgboost import plot_tree
import matplotlib.pyplot as plt

plt.rc('figure', figsize=[10,7])


# load data
dataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")
# split data into X and y
X = dataset[:,0:8]
y = dataset[:,8]
# fit model no training data
model = XGBRegressor(max_depth=0, learning_rate=0.1, n_estimators=2,random_state=123)
model.fit(X, y)

绘制树,我们看到两棵树的预测值为 -0.0150845-0.013578

plot_tree(model, num_trees=0) # 1ST tree, gives -0.0150845
plot_tree(model, num_trees=1) # 2ND tree, gives -0.013578

但是如果我们对第一棵树和两棵树进行预测,它们会给出合理的值:

print(X[0])
print(model.predict(X[0,None],ntree_limit=1)) # 1st tree only
print(model.predict(X[0,None],ntree_limit=0)) # ntree_limit=0: use all trees

# output:
#[ 6. 148. 72. 35. 0. 33.6 0.627 50. ]
#[0.48491547]
#[0.47133744]

这里有两个问题:

  1. 树的预测“-0.0150845”和“-0.013578”与最终输出“0.48491547”和“0.48491547”有何关系?显然这里正在发生一些转变。
  2. 如果树只有 1 个叶子,为了最小化平方误差(XGBRegressor 的默认目标),第一棵树不应该只预测 y 的样本平均值(约 0.3)吗?

更新:我发现问题 1:XGBRegressor 中有一个 base_score=0.5 默认参数,它会改变预测(仅在二元分类问题中有意义)。但对于 Q2,即使在我设置了 base_score=0 之后,第一个叶子给出的值接近 y 样本平均值,但并不精确。所以这里还缺少一些东西。

最佳答案

这种行为是梯度提升树的一个特征。第一棵树包含数据的基本预测。因此,删除第一棵树将极大地降低模型的性能。下面是梯度提升的算法:
1. y_pred = 0,学习率 = 0.x
2. 在火车时间重复:
我。残差=残差+学习率*(y - y_pred)
二.第 i 棵树 = XGBRegressor(X, 残差)
三. y_pred = 第 i 棵树.predict(X)
3. 在测试时重复:
我。预测+=学习率*第i棵树.预测(X_test)

回答你的第一个问题:因此,第一棵树预测了大部分数据,而所有其他树都试图减少前一棵树的误差。这就是您仅使用第一棵树观察到良好预测而使用第二棵树观察到不良预测的原因。您观察到的是两棵树之间的错误。
回答你的第二个问题:并非所有框架都使用目标值的平均值来初始化残差值。许多框架只是将其初始化为 0。
如果你想可视化梯度提升,这里有一个 good link
Youtube video通过GDBT算法进行指导。
我希望这有帮助!

关于python - 为什么各个树的 xgboost 回归预测存在差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56621607/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com