xgboost 回归树的叶值如何与预测相关
how are the leaf values of xgboost regression trees relate to the prediction
似乎每棵树对应的叶子值之和不等于预测值。这是一个示例代码:
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.90277791
和2.65277767
,尽管观察到的分裂点正好在0.
- 叶值如何与预测相关?
- 如果输入是对称的,为什么第一棵树中的叶值不对称?
在拟合第一棵树之前,xgboost 进行初始预测。这由参数 base_score
控制,默认为 0.5。事实上,-2.902777 + 0.5 ~=-2.4028
和 2.652777 + 0.5 ~= 3.1528
.
这也解释了您的第二个问题:与最初预测的差异不 对称。如果你设置 learning_rate=1
你可能会在一轮后得到对称的预测,或者你可以只设置 base_score=0
.
似乎每棵树对应的叶子值之和不等于预测值。这是一个示例代码:
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.90277791
和2.65277767
,尽管观察到的分裂点正好在0.
- 叶值如何与预测相关?
- 如果输入是对称的,为什么第一棵树中的叶值不对称?
在拟合第一棵树之前,xgboost 进行初始预测。这由参数 base_score
控制,默认为 0.5。事实上,-2.902777 + 0.5 ~=-2.4028
和 2.652777 + 0.5 ~= 3.1528
.
这也解释了您的第二个问题:与最初预测的差异不 对称。如果你设置 learning_rate=1
你可能会在一轮后得到对称的预测,或者你可以只设置 base_score=0
.