Classification

如何計算兩個以上類別的 Brier 分數

  • April 17, 2019

tl;博士

如何正確計算兩個以上班級的 Brier 分數?我用不同的方法得到了令人困惑的結果。詳情如下。


正如在對這個問題的評論中向我建議的那樣,我想評估我用 Brier 分數訓練的一組分類器的質量。這些分類器是多類分類器,並且類是不平衡的。Brier 分數應該能夠處理這些情況。但是,我對如何應用 Brier 分數測試不太有信心。假設我有 10 個數據點和 5 個類:

一個熱向量表示給定數據項中存在哪個類:

targets = array([[0, 0, 0, 0, 1],
                [0, 0, 0, 0, 1],
                [0, 0, 0, 0, 1],
                [0, 1, 0, 0, 0],
                [0, 0, 0, 0, 1],
                [0, 0, 1, 0, 0],
                [1, 0, 0, 0, 0],
                [0, 1, 0, 0, 0],
                [1, 0, 0, 0, 0],
                [1, 0, 0, 0, 0]])

概率向量代表我的分類器的輸出,為每個類分配一個概率

probs = array([[0.14, 0.38, 0.4 , 0.04, 0.05],
              [0.55, 0.05, 0.34, 0.04, 0.01],
              [0.3 , 0.35, 0.18, 0.09, 0.08],
              [0.23, 0.22, 0.04, 0.05, 0.46],
              [0.  , 0.15, 0.47, 0.28, 0.09],
              [0.23, 0.13, 0.34, 0.27, 0.03],
              [0.32, 0.06, 0.59, 0.02, 0.01],
              [0.01, 0.19, 0.01, 0.03, 0.75],
              [0.27, 0.38, 0.03, 0.12, 0.2 ],
              [0.17, 0.45, 0.11, 0.25, 0.01]])

這些矩陣是共同索引的,probs[i, j]類別的概率也是如此targets[i, j]

現在,根據維基百科,多個類別的 Brier 分數的定義是

$$ \frac{1}{N} \sum_{t=1}^{N} \sum_{i=1}^{R} (f_{ti} - o_{ti})^2 $$

當我用 Python 編程並在上面的矩陣上運行它時targetsprobs我得到了一個結果 $ 1.0069 $

>>> def brier_multi(targets, probs):
...     return np.mean(np.sum((probs - targets)**2, axis=1))
... 
>>> brier_multi(targets, probs)
1.0068899999999998

但我不確定我是否正確解釋了定義。

對於 Python,sklearn 庫提供sklearn.metrics.brier_score_loss. 雖然文檔指出

Brier 分數適用於可以構造為真或假的二元和分類結果

該函數實際上所做的是選擇一個(或獲取一個作為參數傳遞) $ n > 2 $ 類並將該類視為類 $ 1 $ 和所有其他類作為類 $ 0 $ .

例如,如果我們選擇類 3(索引 2)作為 $ 1 $ 類,因此所有其他類作為類 $ 0 $ ,我們得到:

>>> # get true classes by argmax over binary arrays
... true_classes = np.argmax(targets, axis=1)
>>> 
>>> brier_score_loss(true_classes, probs[:,2], pos_label=2)
0.13272999999999996

或者:

>>> brier_score_loss(targets[:,2], probs[:,2])
0.13272999999999996

這確實是Brier score 的二進製版本,可以通過手動定義和運行它來顯示:

>>> def brier_bin_(targets, probs):
...     return np.mean((targets - probs) ** 2)
>>> brier_bin(targets[:,2], probs[:,2])
0.13272999999999996

如您所見,這與使用 sklearn 的結果相同brier_score_loss

維基百科關於二進製版本的狀態:

此公式主要用於二元事件(例如“下雨”或“不下雨”)。上述等式是僅適用於二元事件的正確評分規則;

所以……現在我很困惑,有以下問題:

1)如果 sklearn 將多類 Brier 分數計算為 One vs. All 二元分數,這是計算多類 Brier 分數的唯一且正確的方法嗎?

這導致我

2)如果是這樣,我的brier_multi代碼一定是基於一個誤解。我對多類 Brier 分數的定義有什麼誤解?

3)也許我完全走錯了路。在這種情況下,請向我解釋,我如何正確計算 Brier 分數?

維基百科對多個類別的 Brier 分數版本是正確的。比較Brier (1950) 的原始出版物或任何數量的學術出版物,例如Czado 等人。(2009 年)(等式(6),儘管您需要做一些簡單的算術並去掉一個常數 1 才能得出 Brier 的公式)。

  1. 如果 sklearn 計算二進制“一對多”的 Brier 分數並對焦點類的所有選擇進行平均,那麼它當然可以這樣做。然而,這根本不是 Brier 分數。如此傳遞它是誤導和錯誤的。
  2. 誤解完全在於sklearn。
  3. 只需使用 your brier_multi,它是完全正確的。

引用自:https://stats.stackexchange.com/questions/403544

comments powered by Disqus