def self_loss(labels, preds):
preds = preds.get_label()
k = labels - preds
# 对labels求导
grad = np.where(k>0, 2*np.abs(preds)/(np.power(np.abs(labels)+np.abs(preds), 2)+0.1), -2*np.abs(preds)/(np.power(np.abs(labels)+np.abs(preds), 2)+0.1))
hess = np.where(k>0, -4*np.abs(preds)/(np.power(np.abs(labels)+np.abs(preds), 3)+0.1), 4*np.abs(preds)/(np.power(np.abs(labels)+np.abs(preds), 3)+0.1))
return grad, hess
def self_metric(labels, preds):
preds = preds.get_label()
score = 1-np.mean(np.abs(labels-preds)/(np.abs(labels)+np.abs(preds)+0.1))
return 'self_metric', score, True
gbm = lgb.train(params,
lgb_train,
num_boost_round=3000,
valid_sets=lgb_eval,
fobj = self_loss,
feval = self_metric,
early_stopping_rounds=30)