Scikit二項偏差損失関数


11

これはscikit GradientBoostingの2項偏差偏差関数です。

   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のクラスの間で類似していません。これがどのようにOKと見なされるかを誰かが説明できますか

たとえば、サンプルの重さがなければ、クラス1の損失関数は次のようになります。

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

クラス0の場合

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

これら2つのプロットは、コストの点で似ていません。誰かが私を理解するのを手伝ってくれる?

回答:


17

この実装を理解するには、2つの観察が必要です。

最初は確率でpredなく、対数オッズです。

2つ目は、このような二項偏差の標準代数的操作です。してみましょう対数オッズも、何が呼び出されます。次に、観測値の二項逸脱度の定義は次のとおりです(最大因数)Psklearnpred2

yログp+1yログ1p=ログ1p+yログp1p

ここで、および確認し(簡単なチェックは、それらを合計することですあなたの頭の中で、あなたは得るでしょう)。そうp=eP1+eP1p=11+eP1

ログ1p=ログ11+eP=ログ1+eP

そして

ログp1p=ログeP=P

つまり、二項偏差は

yPログ1+eP

これは方程式sklearnが使用しています。


ありがとうございます。pred対数オッズで置き換えると、損失関数は両方のクラスで均一になります。
クマラン

この同じ質問が最近私に起こりました。私は見ていたgradientboostedmodels.googlecode.com/git/gbm/inst/doc/gbm.pdfの逸脱の勾配が表示されている10ページ。しかし、彼らが示す勾配は、負の対数ではなく対数であるように見えます。これは正しいですか。ここでの説明と一致しているようです。
B_Miner 2016年

1
@B_Minerリンクが壊れている
GeneX

本当にありがとう@Matthew Drury
Catbuilts
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.