使用XGBoost包时,我们可以设置' objective'在param dict中(例如:' objective':' binary:logistic')并将dict传递给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]
如果我跳过' objective':' binary:logistic'并且只设置了列车中的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)
答案 0 :(得分:0)
最初objective
构造函数参数仅支持定义已知目标的string
值,例如示例中的目标。另一方面,obj
参数需要具有签名objective(y_true, y_pred) -> grad, hess
现在虽然(至少在v0.7中)两者都可以是自定义可调用的。对于用户而言,这意味着您可以使用任一方式定义目标,传递给train的那个将覆盖构造函数中定义的目标。我最好的猜测是,两种定义它的方法仍然存在以便向后兼容。