【发布时间】:2020-11-22 03:07:42
【问题描述】:
我正在尝试实现我自己的二元分类损失函数。首先,我想重现二元目标的确切行为。我特别希望:
- 两个函数的损失具有相同的规模
- 训练和验证斜率相似
- predict_proba(X) 返回概率
以下代码都不是这种情况:
import sklearn.datasets
import lightgbm as lgb
import numpy as np
X, y = sklearn.datasets.load_iris(return_X_y=True)
X, y = X[y <= 1], y[y <= 1]
def loglikelihood(labels, preds):
preds = 1. / (1. + np.exp(-preds))
grad = preds - labels
hess = preds * (1. - preds)
return grad, hess
model = lgb.LGBMClassifier(objective=loglikelihood) # or "binary"
model.fit(X, y, eval_set=[(X, y)], eval_metric="binary_logloss")
lgb.plot_metric(model.evals_result_)
使用objective="binary":
使用objective=loglikelihood,坡度甚至都不是平滑的:
此外,必须将 sigmoid 应用于 model.predict_proba(X) 以获得对数似然的概率(正如我从 https://github.com/Microsoft/LightGBM/issues/2136 得出的那样)。
是否可以使用自定义损失函数获得相同的行为?有人了解所有这些差异的来源吗?
【问题讨论】: