Machine-Learning

做出決定時的正確評分規則(例如垃圾郵件與非正常電子郵件)

  • May 5, 2020

在這裡,Frank Harrell 堅持使用適當的評分規則來評估分類器。這是有道理的。如果我們有 500 $ 0 $ 與 $ P(1)\in[0.45, 0.49] $ 和 500 $ 1 $ 與 $ P(1)\in[0.51, 0.55] $ ,我們可以通過將閾值設置為 $ 0.50 $ . 然而,這真的是一個比給出的分類器更好的分類器嗎? $ 0 $ 全部 $ P(1)\in[0.05, 0.07] $ 和 $ 1 $ 全部 $ P(1)\in[0.93,0.95] $ , 除了一個有 $ P(1)=0.04? $

Brier score 表示第二個分類器粉碎了第一個分類器,即使第二個分類器無法達到完美的準確度。

set.seed(2020)
N <- 500
spam_1 <- runif(N, 0.45, 0.49) # category 0
ham_1 <- runif(N, 0.51, 0.55) # category 1
brier_score_1 <- sum((spam_1)^2) + sum((ham_1-1)^2)
spam_2 <- runif(N, 0.05, 0.07) # category 0 
ham_2 <- c(0.04, runif(N-1, 0.93, 0.95)) # category 1
brier_score_2 <- sum((spam_2)^2) + sum((ham_2-1)^2)
brier_score_1 # turns out to be 221.3765
brier_score_2 # turns out to be 4.550592

但是,如果我們使用第二個分類器,我們最終會將“火腿”電子郵件稱為“垃圾郵件”並將其發送到垃圾郵件文件夾。根據電子郵件的內容,這可能是個壞消息。對於第一個分類器,如果我們使用閾值 $ 0.50 $ ,我們總是將垃圾郵件分類為垃圾郵件,將火腿分類為火腿。第二個分類器沒有閾值可以提供完美的分類準確度,這對於電子郵件過濾來說非常棒。

我承認我不知道垃圾郵件過濾器的內部工作原理,但我懷疑將電子郵件發送到垃圾郵件文件夾或讓它通過收件箱是一個艱難的決定。 $ ^{\dagger} $ 即使這不是電子郵件過濾的特定示例的工作方式,也存在必須做出決定的情況。

作為必須做出決定的分類器的用戶,與找到最佳閾值然後根據該閾值進行分類時評估性能相比,使用適當的評分規則有什麼好處?當然,我們可能會重視敏感性或特異性而不僅僅是準確性,但我們無法從適當的評分規則中獲得任何這些。我可以想像以下與經理的對話。

:“所以我建議我們使用第二種模型,因為它的 Brier 分數要低得多。”

老闆:“所以你想用更經常[傻瓜]的模型去?安全!”

我可以看到一個論點,即從長遠來看,具有較低 Brier 分數(好)但準確性較低(壞)的模型可能會表現得更好(在分類準確性方面),並且不應該因為僥倖而受到如此嚴厲的懲罰指出另一個模型儘管性能普遍較差,但如果我們正在進行樣本外測試並查看這些模型如何處理它們在期間未暴露的數據,那麼給經理提供的答案仍然令人不滿意訓練。

$ ^{\dagger} $ 另一種方法是根據分類器確定的概率進行某種擲骰子。說我們得到 $ P(spam)=0.23 $ . 然後畫一個觀察 $ X $ 從 $ \text{Bernoulli}(0.23) $ 並將其發送到垃圾郵件文件夾 $ X=1 $ . 然而,在某些時候,會決定將電子郵件發送到何處,沒有“23% 將其發送到垃圾郵件文件夾,77% 將其發送到收件箱”。

我想我是“其中之一”,所以我會插話。

簡短版本:恐怕你的例子有點像稻草人,我認為我們不能從中學到很多東西。

在第一種情況下,是的,您可以將預測閾值設置為 0.50 以獲得完美的分類。真的。但我們也看到你的模型實際上很差。取垃圾郵件組中的第 127 項,並將其與火腿組中的第 484 項進行比較。他們預測成為垃圾郵件的概率為 0.49 和 0.51。(那是因為我選擇了垃圾郵件中最大的預測和火腿組中的最小預測。)

也就是說,對於該模型,它們在成為垃圾郵件的可能性方面幾乎無法區分。但他們不是!我們知道第一個肯定是垃圾郵件,第二個肯定是火腿。“幾乎可以肯定”,如“我們觀察了 1000 個實例,並且截止總是有效”。說這兩個實例實際上同樣可能是垃圾郵件,這清楚地表明我們的模型並不真正知道它在做什麼。

因此,在目前的情況下,對話不應該是我們應該使用模型 1 還是使用模型 2,或者我們是否應該根據準確性或 Brier 分數在兩個模型之間做出決定。相反,我們應該將兩個模型的預測都提供給任何標準的第三種模型,例如標準邏輯回歸。這會將模型 1 的預測轉換為非常自信的預測,本質上是 0 和 1,從而更好地反映數據中的結構。這個布賴爾分數元模型會低得多,大約為零。同樣,來自模型 2 的預測將被轉換為幾乎一樣好但稍差的預測 - Brier 分數略高一些。現在,兩個元模型的 Brier 分數將正確地反映應該首選基於(元)模型 1 的模型。


當然,最終決定可能需要使用某種閾值。根據類型 I 和 II 錯誤的成本,成本最優閾值可能與 0.5 不同(當然,在本示例中除外)。畢竟,正如您所寫,將火腿誤分類為垃圾郵件可能比反之亦然的代價高得多。但正如我在別處寫的,成本最優決策也可能包括多個閾值!很有可能,一個非常低的預測垃圾郵件概率可能會將郵件直接發送到您的收件箱,而一個非常高的預測概率可能會在您從未看到它的情況下在郵件服務器上過濾它 - 但介於兩者之間的概率可能意味著 [SUSPECTED SPAM ] 可能會插入主題中,郵件仍會發送到您的收件箱。準確性作為評估措施在這裡失敗了,除非我們開始查看多個存儲桶的單獨準確性,但最終,所有“中間”郵件將被歸類為一個或另一個,它們不應該被發送到首先正確的桶?另一方面,適當的評分規則可以幫助您校準概率預測。


老實說,我不認為像你在這裡給出的那樣的確定性例子很有用。如果我們知道發生了什麼,那麼我們一開始就不會進行概率分類/預測,畢竟。所以我會爭論概率的例子。這是一個這樣的。我將生成 1,000 個真實的潛在概率,這些概率均勻分佈在 $ [0,1] $ ,然後根據這個概率生成實際值。現在我們沒有完美的分離,我認為上面的例子模糊了。

set.seed(2020)
nn <- 1000
true_probabilities <- runif(nn)
actuals <- runif(nn)<true_probabilities

library(beanplot)
beanplot(true_probabilities~actuals, 
   horizontal=TRUE,what=c(0,1,0,0),border=NA,col="lightgray",las=1,
   xlab="True probability")
points(true_probabilities,actuals+1+runif(nn,-0.3,0.3),pch=19,cex=0.6)

豆圖

現在,如果我們有真實的概率,我們可以使用上述基於成本的閾值。但通常情況下,我們不會知道這些真實概率,但我們可能需要在每個輸出此類概率的競爭模型之間做出決定。我認為尋找一個盡可能接近這些真實概率的模型是值得的,因為例如,如果我們對真實概率有偏見的理解,那麼我們在改變過程中投入的任何資源(例如,在醫學應用:篩查、接種、傳播生活方式的改變……)或更好地理解它可能會被錯誤分配。換句話說:使用準確性和閾值意味著我們根本不在乎我們是否預測概率 $ \hat{p}_1 $ 或者 $ \hat{p}_2 $ 只要超過閾值, $ \hat{p}_i>t $ (反之亦然 $ t $ ),所以我們在理解和調查我們不確定的實例方面的動機為零,只要我們讓它們到達閾值的正確一側。

讓我們看幾個校準錯誤的預測概率。具體來說,對於真實概率 $ p $ ,我們可以看一下冪變換 $ \hat{p}_x:=p^x $ 對於某個指數 $ x>0 $ . 這是一個單調變換,所以我們想使用的任何閾值都基於 $ p $ 也可以轉換為使用 $ \hat{p}_x $ . 或者,從 $ \hat{p}_x $ 並且不知道 $ p $ ,我們可以優化閾值 $ \hat{t}_x $ 獲得完全相同的精度 $ (\hat{p}_x,\hat{t}_x) $ 至於 $ (\hat{p}_y,\hat{t}_y) $ ,因為單調性。這意味著準確性在我們尋找真實概率時毫無用處,它對應於 $ x=1 $ !但是(鼓聲),正確的評分規則(例如 Brier 或對數評分)確實會在正確的預期中得到優化 $ x=1 $ .

brier_score <- function(probs,actuals) mean(c((1-probs)[actuals]^2,probs[!actuals]^2))
log_score <- function(probs,actuals) mean(c(-log(probs[actuals]),-log((1-probs)[!actuals])))

exponents <- 10^seq(-1,1,by=0.1)
brier_scores <- log_scores <- rep(NA,length(exponents))
for ( ii in seq_along(exponents) ) {
   brier_scores[ii] <- brier_score(true_probabilities^exponents[ii],actuals)
   log_scores[ii] <- log_score(true_probabilities^exponents[ii],actuals)
}
plot(exponents,brier_scores,log="x",type="o",xlab="Exponent",main="Brier score",ylab="")
plot(exponents,log_scores,log="x",type="o",xlab="Exponent",main="Log score",ylab="")

分數

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

comments powered by Disqus