Если вы посмотрите, что model.predict_proba(X)
возвращает в каждом случае, вы увидите, что встроенная модель binary_logloss возвращает вероятности, а пользовательская модель возвращает логиты.
Таким образом, их функция оценки не соответствует нашей пользовательской цели, и нам нужна пользовательская функция оценки, чтобы соответствовать нашей пользовательской цели.
Во-первых, давайте воспользуемся численно устойчивой сигмоидой:
def sigmoid(x):
answer = np.where(x >= 0,
1. / (1. + np.exp(-x)),
np.exp(x) / (1. + np.exp(x)))
return answer
def loglikelihood(labels, preds):
preds = sigmoid(preds)
grad = preds - labels
hess = preds * (1. - preds)
return grad, hess
def my_eval(labels, preds):
preds = sigmoid(preds)
loss = (- np.log(preds) * labels - np.log(1 - preds) * (1 - labels)).mean()
return "error", loss, False
model1 = lgb.LGBMClassifier(objective='binary')
model1.fit(X, y, eval_set=[(X, y)], eval_metric="binary_logloss")
model2 = lgb.LGBMClassifier(objective=loglikelihood)
model2.fit(X, y, eval_set=[(X, y)], eval_metric=my_eval)
Теперь результаты совпадают.