gpt4 book ai didi

machine-learning - 如何在 LightGBM 中实现与二进制目标相同行为的自定义对数损失?

转载 作者:行者123 更新时间:2023-11-30 09:03:39 25 4
gpt4 key购买 nike

我正在尝试实现我自己的二元分类损失函数。首先,我想重现二元目标的确切行为。我特别希望:

  • 两个函数的损失具有相同的规模
  • 训练和验证斜率相似
  • 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_)

目标=“二进制”:

enter image description here

当 Objective=loglikelihood 时,斜率甚至不平滑:

enter image description here

此外,必须将 sigmoid 应用于 model.predict_proba(X) 才能获得对数似然的概率(正如我从 https://github.com/Microsoft/LightGBM/issues/2136 中得出的那样)。

是否可以使用自定义损失函数获得相同的行为?有人知道所有这些差异从何而来吗?

最佳答案

查看每种情况下model.predict_proba(X)的输出,我们可以看到内置的binary_logloss模型返回概率,而自定义模型返回logits。

内置评估函数以概率作为输入。为了满足自定义目标,我们需要一个自定义评估函数,它将 logits 作为输入。

以下是您可以如何编写此内容。我更改了 sigmoid 计算,以便在 logit 为大负数时不会溢出。

def loglikelihood(labels, logits):
#numerically stable sigmoid:
preds = np.where(logits >= 0,
1. / (1. + np.exp(-logits)),
np.exp(logits) / (1. + np.exp(logits)))
grad = preds - labels
hess = preds * (1. - preds)
return grad, hess

def my_eval(labels, logits):
#numerically stable logsigmoid:
logsigmoid = np.where(logits >= 0,
-np.log(1 + np.exp(-logits)),
logits - np.log(1 + np.exp(logits)))
loss = (-logsigmoid + logits * (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)

现在结果是一样的。

关于machine-learning - 如何在 LightGBM 中实现与二进制目标相同行为的自定义对数损失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58572495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com