lightGBM自定义损失函数loss和metric
转载于:https://www.cnblogs.com/kayy/p/10824392.html
def self_loss(preds, train_data):
labels = train_data.get_label()
k = labels - preds
#对labels求导
grad = np.where(k>0, 2np.abs(preds)/(np.power(np.abs(labels)+np.abs(preds), 2)+0.1), -2np.abs(preds)/(np.power(np.abs(labels)+np.abs(preds), 2)+0.1))
hess = np.where(k>0, -4np.abs(preds)/(np.power(np.abs(labels)+np.abs(preds), 3)+0.1), 4np.abs(preds)/(np.power(np.abs(labels)+np.abs(preds), 3)+0.1))
#返回一阶导、二阶导
return grad, hess
def self_metric(preds, train_data):
labels= train_data.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,
gb_train,
num_boost_round=3000,
valid_sets=lgb_eval,
fobj = self_loss,
feval = self_metric,
early_stopping_rounds=30)
多分类metric
def self_metric(preds, train_data):
y_label = train_data.get_label()
preds = preds.reshape(4, -1).T # 4 分类
y_pred = np.argmax(preds, axis=-1)
。。。
return ‘self_metric’, macro_F1, True