【问题标题】:Why are there discrepancies in xgboost regression prediction from individual trees?为什么单个树的 xgboost 回归预测存在差异?
【发布时间】:2019-10-30 11:23:24
【问题描述】:

首先我运行一个非常简单的 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)

绘制树,我们看到 2 棵树给出的预测值为 -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. 如果树只有一片叶子,为了最小化平方误差(XGBRegressor 的默认目标),第一棵树不应该只预测约 0.3 的 y 样本均值吗?

更新: 我发现 Q1:XGBRegressor 中有一个 base_score=0.5 默认参数,它改变了预测(这仅在二进制分类问题中才有意义)。 但是对于 Q2,即使在我设置 base_score=0 之后,第一片叶子的值也接近 y 样本均值,但并不准确。所以这里仍然缺少一些东西。

【问题讨论】:

    标签: python machine-learning regression prediction xgboost


    【解决方案1】:

    这种行为是梯度提升树的特征。第一棵树包含数据的基本预测。因此,删除第一棵树会显着降低模型的性能。这是梯度提升的算法:
    1. y_pred = 0, learning_rate = 0.x
    2. 在火车时间重复:
    一世。残差 = 残差 + learning_rate*(y - y_pred)
    ii.第 i 棵树 = XGBRegressor(X, 残差)
    三。 y_pred = i'th tree.predict(X)
    3. 在测试时重复:
    一世。预测 += learning_rate*i'th tree.predict(X_test)

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

    【讨论】:

    • 感谢您的链接。我的问题非常具体,尽管 xgboost 对此数据集的行为。对于第二个问题,正如我所提到的,目标是最小化平方误差,但我看到预测值接近均值,但不准确(顺便说一句,它远不及 0)
    • @iwbabn XGBoost 使用许多数值近似来加速训练。不太确定是不是这样,但很可能是这样。
    • 对于问题 2,我不确定什么“近似”比仅取平均值更快
    猜你喜欢
    • 2021-11-27
    • 2019-08-17
    • 2022-08-11
    • 2021-09-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 2021-05-18
    相关资源
    最近更新 更多