在XGBoost中,'目标'之间的区别是什么?在param中设置和列车功能中的obj参数?

时间:2018-03-15 13:47:37

标签: python machine-learning xgboost

使用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)

1 个答案:

答案 0 :(得分:0)

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

的可调用对象

现在虽然(至少在v0.7中)两者都可以是自定义可调用的。对于用户而言,这意味着您可以使用任一方式定义目标,传递给train的那个将覆盖构造函数中定义的目标。我最好的猜测是,两种定义它的方法仍然存在以便向后兼容。