Data-Visualization

可視化模型預測概率的校準

  • March 29, 2012

假設我有一個預測模型,它為每個實例生成每個類別的概率。現在我認識到,如果我想使用這些概率進行分類(精度、召回率等),有很多方法可以評估這樣的模型。我還認識到 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)

重複分析會生成此圖,其中的偏差很明顯:

圖 2

該模型往往過於樂觀(50% 到 90% 範圍內預測的平均結果太低)。在預測較低(低於 30%)的少數情況下,模型過於悲觀。

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

comments powered by Disqus