Scikit 二项式偏差损失函数

机器算法验证 机器学习 scikit-学习 助推 损失函数
2022-03-09 01:12:23

这是 scikit GradientBoosting 的二项式偏差损失函数,

   def __call__(self, y, pred, sample_weight=None):
        """Compute the deviance (= 2 * negative log-likelihood). """
        # logaddexp(0, v) == log(1.0 + exp(v))
        pred = pred.ravel()
        if sample_weight is None:
            return -2.0 * np.mean((y * pred) - np.logaddexp(0.0, pred))
        else:
            return (-2.0 / sample_weight.sum() *
                    np.sum(sample_weight * ((y * pred) - np.logaddexp(0.0, pred))))

这种损失函数在 0 类和 1 类之间是不相似的。任何人都可以解释这如何被认为是好的。

例如,在没有样本权重的情况下,第 1 类的损失函数为

-2(pred - log(1 + exp(pred))

与 0 级相比

-2(-log(1+exp(pred))

这两者的情节在成本方面并不相似。谁能帮我理解。

1个回答

理解这个实现需要两个观察。

首先,这不是pred概率,而是对数赔率。

第二个是对二项式偏差的标准代数操作,就像这样。P是对数赔率,什么sklearnpred. 那么观察的二项式偏差的定义是(高达一个因子2)

ylog(p)+(1y)log(1p)=log(1p)+ylog(p1p)

现在观察p=eP1+eP1p=11+eP(快速检查是将它们总结在你的脑海中,你会得到1)。所以

log(1p)=log(11+eP)=log(1+eP)

log(p1p)=log(eP)=P

所以总的来说,二项式偏差等于

yPlog(1+eP)

这是使用的方程sklearn