可視化模型預測概率的校準
假設我有一個預測模型,它為每個實例生成每個類別的概率。現在我認識到,如果我想使用這些概率進行分類(精度、召回率等),有很多方法可以評估這樣的模型。我還認識到 ROC 曲線及其下方的面積可用於確定模型在類別之間的區分程度。這些不是我要問的。
我有興趣評估模型的校準。 我知道像Brier 分數這樣的評分規則對這項任務很有用。沒關係,我可能會在這些方面加入一些東西,但我不確定這些指標對於外行來說有多直觀。我正在尋找更直觀的東西。我希望解釋結果的人能夠看到當模型預測某事有 70% 的可能性發生時,它實際發生的概率約為 70%,等等。
我聽說過(但沒用過)QQ地塊,一開始我以為這就是我要找的。但是,這似乎真的是為了比較兩個概率分佈。那不是我直接擁有的。對於一堆實例,我有我的預測概率以及事件是否實際發生:
Index P(Heads) Actual Result 1 .4 Heads 2 .3 Tails 3 .7 Heads 4 .65 Tails ... ... ...
那麼QQ情節真的是我想要的,還是我在尋找別的東西?如果我應該使用 QQ 圖,將我的數據轉換為概率分佈的正確方法是什麼?
我想我可以按預測概率對兩列進行排序,然後創建一些箱。這是我應該做的事情,還是我在想什麼地方?我熟悉各種離散化技術,但是有沒有一種特定的方法可以將這種離散化為標準的箱?
你的想法很好。
John Tukey 建議將數據分成兩半:將數據分成上下兩半,然後拆分這些兩半,然後遞歸地拆分極端的兩半。與等寬分箱相比,這允許對尾部行為進行視覺檢查,而無需將太多圖形元素用於大量數據(中間)。
這是 Tukey 方法的一個示例(使用 R)。(這並不完全相同:他的實現
mletter
方式略有不同。)首先,讓我們創建一些預測和一些符合這些預測的結果:
set.seed(17) prediction <- rbeta(500, 3/2, 5/2) actual <- rbinom(length(prediction), 1, prediction) plot(prediction, actual, col="Gray", cex=0.8)
該圖的信息量不是很大,因為
actual
當然,所有值都是(沒有發生)或(確實發生了)。(它在下圖的第一張圖中顯示為灰色空心圓圈的背景。)該圖需要平滑處理。為此,我們對數據進行分類。函數mletter
將其分成兩半。它的第一個參數是一個介於 1 和(第二個參數)r
之間的秩數組。n
它為每個 bin 返回唯一(數字)標識符:mletter <- function(r,n) { lower <- 2 + floor(log(r/(n+1))/log(2)) upper <- -1 - floor(log((n+1-r)/(n+1))/log(2)) i <- 2*r > n lower[i] <- upper[i] lower }
使用它,我們將預測和結果都分箱,並在每個箱內平均。在此過程中,我們計算 bin 種群:
classes <- mletter(rank(prediction), length(prediction)) pgroups <- split(prediction, classes) agroups <- split(actual, classes) bincounts <- unlist(lapply(pgroups, length)) # Bin populations x <- unlist(lapply(pgroups, mean)) # Mean predicted values by bin y <- unlist(lapply(agroups, mean)) # Mean outcome by bin
為了有效地對繪圖進行符號化,我們應該使符號區域與 bin 計數成比例。稍微改變符號顏色也會有所幫助,其中:
binprop <- bincounts / max(bincounts) colors <- -log(binprop)/log(2) colors <- colors - min(colors) colors <- hsv(colors / (max(colors)+1))
有了這些,我們現在增強了前面的情節:
abline(0,1, lty=1, col="Gray") # Reference curve points(x,y, pch=19, cex = 3 * sqrt(binprop), col=colors) # Solid colored circles points(x,y, pch=1, cex = 3 * sqrt(binprop)) # Circle outlines
作為預測不佳的示例,讓我們更改數據:
set.seed(17) prediction <- rbeta(500, 5/2, 1) actual <- rbinom(length(prediction), 1, 1/2 + 4*(prediction-1/2)^3)
重複分析會生成此圖,其中的偏差很明顯:
該模型往往過於樂觀(50% 到 90% 範圍內預測的平均結果太低)。在預測較低(低於 30%)的少數情況下,模型過於悲觀。