モデルの予測確率のキャリブレーションを視覚化する


23

各インスタンスについて、各クラスの確率を生成する予測モデルがあるとします。現在、これらの確率を分類(精度、リコールなど)に使用する場合、そのようなモデルを評価する方法はたくさんあることを認識しています。また、ROC曲線とその下の領域を使用して、モデルがクラスをどれだけ区別できるかを判断できることも認識しています。それらは私が尋ねているものではありません。

モデルのキャリブレーションを評価することに興味がありますブリアスコアのようなスコアリングルールは、このタスクに役立つことがわかっています。それは大丈夫です、そして、私はそれらの線に沿って何かを組み込む可能性が高いですが、私はそのようなメトリックが素人にとってどれほど直感的であるかわかりません。もっと視覚的なものを探しています。結果を解釈する人に、モデルが何かを予測したときに、実際に70%の確率で70%が発生する可能性があるかどうかを確認できるようにしてほしい

QQプロットのことを聞いたことがありますが(使用したことはありません)、最初はこれが私が探しているものだと思いました。ただし、実際には2つの確率分布を比較することを目的としているようです。それは直接私が持っているものではありません。多数のインスタンスについて、予測された確率と、イベントが実際に発生したかどうかがわかります。

Index    P(Heads)    Actual Result
    1          .4            Heads
    2          .3            Tails
    3          .7            Heads
    4         .65            Tails
  ...         ...              ...

QQプロットは本当に欲しいものですか、それとも何か他のものを探していますか?QQプロットを使用する必要がある場合、データを確率分布に変換する正しい方法は何ですか?

予測された確率で両方の列を並べ替えて、いくつかのビンを作成できると思います。それは私がやるべきことのタイプですか、それとも私はどこかで考えていますか?私はさまざまな離散化手法に精通していますが、この種の標準的なビンに離散化する特定の方法はありますか?

回答:


19

あなたの思考は良いです。

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)

actual01mletterrn

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)

分析を繰り返すと、偏差が明確なこのプロットが生成されます。

図2

このモデルは楽観的すぎる傾向があります(50%から90%の範囲の予測の平均結果は低すぎます)。予測が低い場合(30%未満)、モデルは悲観的すぎます。


(+1)とてもいいですね、ありがとう。私は色が目的から少し気を散らすかもしれないと思うが、残りは素晴らしいアイデアと非常に良い説明でした。
マイケル

マイケル、どちらかの端に現れる非常に小さな円を見るのを助けるために、いくらかの色が必要であることがわかりました。もちろん、一定の色でこれを実現できます。のcol=colorsように、必要な色に置き換えるだけですcol="Red"
whuber

+1、これはとてもいいです。しかし、なぜ基準線が適切なロジスティック回帰線または黄土ではなく、単純な直線の45度線であるのか、私はまったく直観しませんか?これらは、予測の質を判断するためのより適切な参照になると思います。
グング-モニカを復活

pp±[01]×[01]
whuber

@gung(Take 2)考えていることは、残差の予想される変動を考慮して視覚化を改善することです。その変動はに比例するはずですp1p/npn

4

別のオプションは等張回帰です。wbinerの答えに似ていますが、ビンは半分に分割するのではなく動的に生成され、出力は厳密に増加する必要があります。

等張回帰のこの主な使用法は、キャリブレーションが不十分であることが示された場合に確率を再調整することですが、可視化にも使用できます。基本的に、等張性回帰線がY = X線にほぼ沿っている場合、確率は適切に調整されます。

確率の等張回帰

これは、Whuberが示す問題に適用される等張回帰です。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.isotonic import IsotonicRegression

prediction = np.random.beta(3.0/2.0, 5.0/2.0, size=500)
actual = np.random.binomial(1,prediction, len(prediction))
plt.scatter(prediction, actual,  facecolors='none', edgecolors=[0.3,0.3,0.3], label='Data')

ir = IsotonicRegression()
isotonic = ir.fit_transform(prediction, actual)
plt.plot(prediction, isotonic,'ok', label='Isotonic Fit')

plt.xlabel('Prediction')
plt.ylabel('Actual')
plt.plot([0,1],[0,1], '--k', label='y=x line')
plt.legend(loc = 'center left')

http://fa.bianp.net/blog/2013/isotonic-regression/

http://stat.wikia.com/wiki/Isotonic_regression


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.