你的想法很好。
约翰·图基(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
值当然都是(未发生)或(已发生)。(在下面的第一个图中,它显示为灰色空心圆圈的背景。)此图需要平滑。为此,我们对数据进行bin。函数进行一半拆分。它的第一个参数是介于1和(第二个参数)之间的等级数组。它为每个容器返回唯一的(数字)标识符:01个mletter
r
n
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
}
使用此方法,我们将预测和结果进行分箱,并在每个分箱内取平均值。在此过程中,我们计算箱体总数:
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
为了有效地对图形进行符号化,我们应使符号面积与箱数成正比。稍微改变一下符号颜色也可能会有所帮助:
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%)时,该模型过于悲观。