如何計算兩個以上類別的 Brier 分數
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 編程並在上面的矩陣上運行它時
targets
,probs
我得到了一個結果 $ 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 的公式)。
- 如果 sklearn 計算二進制“一對多”的 Brier 分數並對焦點類的所有選擇進行平均,那麼它當然可以這樣做。然而,這根本不是 Brier 分數。如此傳遞它是誤導和錯誤的。
- 誤解完全在於sklearn。
- 只需使用 your
brier_multi
,它是完全正確的。