from scipy.misc import derivative
def focal_loss(ytrue, ypred, gamma=2.0):
p = 1 / (1 + np.exp(-ypred))
loss = -(1 - ytrue) * p**gamma * np.log(1 - p) - ytrue * (1 - p)**gamma * np.log(p)
return loss
def focal_loss_metric(ytrue, ypred):
return 'focal_loss_metric', np.mean(focal_loss(ytrue, ypred)), False
def focal_loss_objective(ytrue, ypred):
func = lambda z: focal_loss(ytrue, z)
grad = derivative(func, ypred, n=1, dx=1e-6)
hess = derivative(func, ypred, n=2, dx=1e-6)
return grad, hess
gbm_focal_loss = LGBMClassifier(objective=focal_loss_objective, learning_rate=0.25, n_estimators=20, max_depth=1)
gbm_focal_loss.fit(Xtrn, ytrn, eval_set=[(Xval, yval)], eval_metric=focal_loss_metric)