Scikit二项式偏差损失函数


11

这是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))

vs 0级

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

这两个图在成本上并不相似。谁能帮我理解。

Answers:


17

需要两个观察才能理解此实现。

第一,pred不是一个概率,它是一个数比值。

第二个是二项式偏差的标准代数运算,就像这样。设是数比值,有什么要求。则观测值的二项式偏差的定义为(高达)Psklearnpred2

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

现在观察和(快速检查是对它们求和在你的头上,你会得到)。所以p=eP1+eP1p=11+eP1

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

log(p1p)=log(eP)=P

因此,二项式偏差等于

yPlog(1+eP)

等式sklearn正在使用哪个。


谢谢。如果我用pred对数赔率代替,则损失函数对于两个类别都是统一的。
库马兰2015年

最近我也遇到了同样的问题。我一直在寻找gradientboostedmodels.googlecode.com/git/gbm/inst/doc/gbm.pdf其中偏差的梯度列第10页。但是似乎它们显示的梯度是对数似味而不是负对数味。这是正确的-似乎与您的解释相符吗?
B_Miner

1
@B_Miner链接被打破
GENEX

非常感谢@Matthew Drury
Catbuilts
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.