首先,我运行一个非常简单的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个问题:
树预测“ -0.0150845”和“ -0.013578”如何与最终输出“ 0.48491547”和“ 0.48491547”相关?显然,这里正在进行一些转换。
如果树上只有一片叶子,为了最小化平方误差(XGBRegressor的默认目标),第一棵树不应该仅预测y的样本均值〜0.3吗?
编辑: 我发现了第一个问题:XGBRegressor中有一个默认参数 base_score = 0.5 ,该默认参数会改变预测(仅在二进制分类问题中才有意义)。 但是对于第二个问题,在我设置base_score = 0之后,第一片叶子给出的值接近y个样本均值,但不精确。因此,这里仍然缺少一些东西。
答案 0 :(得分:0)
此行为是“梯度增强”树的特征。第一棵树包含数据的基本预测。因此,删除第一棵树将大大降低模型的性能。这是梯度提升的算法:
1. y_pred = 0,learning_rate = 0.x
2.在火车时间重复:
一世。残差=残差+学习率*(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 link
Youtube video指导了GDBT算法。
我希望这会有所帮助!