为什么从单个树的xgboost回归预测中有差异?

问题描述 投票:2回答:1

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

所以这里有2个问题:

  1. 树木预测“ -0.0150845”和“ -0.013578”如何与最终输出“ 0.48491547”和“ 0.48491547”相关?显然,这里正在进行一些转换。

  2. 如果树只有一片叶子,为了最小化平方误差(XGBRegressor的默认目标),第一棵树难道不应该仅预测y的样本均值〜0.3吗?

编辑:我想出了第一个问题:XGBRegressor中有一个base_score = 0.5默认参数,它会改变预测(仅在二进制分类问题中才有意义)。但是对于第二个问题,在我设置base_score = 0之后,第一片叶子给出的值接近y个样本均值,但不精确。因此,这里仍然缺少一些东西。

python machine-learning prediction xgboost
1个回答
0
投票

此行为是梯度增强树的特征。第一棵树包含数据的基本预测。因此,删除第一棵树将大大降低模型的性能。这是梯度提升的算法:1. y_pred = 0,learning_rate = 0.x2.在火车时间重复:一世。残差=残差+学习率*(y-y_pred)ii。第i个树= XGBRegressor(X,残差)iii。 y_pred =第i个tree.predict(X)3.在测试时间重复:一世。预测+ = learning_rate *第i个tree.predict(X_test)回答第一个问题:因此,第一棵树可以预测大部分数据,而其他所有树都试图减少前一棵树的错误。这就是为什么您仅使用第一棵树观察到好的预测,而使用第二棵树观察到不好的预测的原因。您正在观察的是两棵树之间的错误。回答第二个问题:并非所有框架都使用目标值的平均值来初始化残差的值。许多框架只是将其初始化为0。如果您想可视化Gradient Boosting,这里是good linkYoutube video指导GDBT算法。希望对您有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.