在 XGBoost 中,参数中设置的"目标"和训练函数中的 obj 参数有什么区别?



使用 XGBoost 包时,我们可以在参数字典中设置 'objective'(例如:'objective': 'binary:logistic' (,并将字典传递给 train 函数。同时,训练函数中有一个 obj 参数。据我所知,它们都是客观函数。那么它们有什么区别呢?如果它们都设置好了,哪一个会生效?

param = {'max_depth': 3, 'eta': 1, 'silent': 1, 'objective': 'binary:logistic'} 
bst = xgb.train(param, data_train, num_boost_round=n_round, obj=g_h, feval=error_rate)

其中g_h是一个自定义的目标函数。

奇怪的是,我发现如果同时设置了"目标":"二进制:逻辑"和 obj,y_hat

y_hat: [6.0993789e-06 9.8472750e-01 6.0993789e-06 ... 9.9993265e-01 4.4560062e-07
 9.9993265e-01]

如果我跳过"目标":"二进制:物流"并且只设置了火车中的 obj,y_hat

y_hat: [-5.6174016  5.2989674 -5.6174016 ...  7.6525593 -6.4794073  6.7979865]

因此,训练函数中的 obj 不会覆盖"目标":"二进制:逻辑"!

这是代码:

import xgboost as xgb
def g_h(y_hat, y):
    p = 1.0 / (1.0 + np.exp(-y_hat))
    g = p - y.get_label()
    h = p * (1.0-p)
    return g, h
# read in data
dtrain = xgb.DMatrix('demo/data/agaricus.txt.train')
dtest = xgb.DMatrix('demo/data/agaricus.txt.test')
# specify parameters via map
param = {'max_depth':3, 'eta':1, 'silent':1, 'objective':'binary:logistic' }
num_round = 7
bst = xgb.train(param, dtrain, num_round)
# make prediction
y_hat = bst.predict(dtest)
print(y_hat)

最初,objective构造函数参数仅支持定义已知目标(如示例中的目标(的string值。另一方面,obj参数期望具有签名的可调用对象objective(y_true, y_pred) -> grad, hess

如今(至少在 v0.7 中(,两者都可以是自定义可调用对象。对于用户来说,这意味着您可以使用任一方式来定义目标,传递给训练的目标将覆盖构造函数中定义的目标。我最好的猜测是,为了向后兼容,定义它的两种方法仍然存在。

相关内容

最新更新