本文鏈接:個(gè)人站 | 簡(jiǎn)書(shū) | CSDN
版權(quán)聲明:除特別聲明外,本博客文章均采用 BY-NC-SA 許可協(xié)議。轉(zhuǎn)載請(qǐng)注明出處。
概率預(yù)測(cè)的目標(biāo)是在滿(mǎn)足 calibration 的前提下盡可能提高預(yù)測(cè)的 sharpness。所謂的 calibration 指的是預(yù)測(cè)分布和觀測(cè)值在統(tǒng)計(jì)上的一致性,而 sharpness 則是指預(yù)測(cè)分布的集中程度。下面介紹一些常見(jiàn)的概率預(yù)測(cè)的評(píng)估方法。
1. 概率積分變換(Probability Integral Transform,PIT)
對(duì)于觀測(cè)值 ,假設(shè)模型預(yù)測(cè)的累積分布函數(shù)分別為
。如果模型預(yù)測(cè)準(zhǔn)確,則概率積分變換
應(yīng)當(dāng)服從標(biāo)準(zhǔn)的均勻分布
。
PIT 的優(yōu)勢(shì)之一是便于可視化。最簡(jiǎn)單的做法是畫(huà)直方圖。 形的直方圖意味著預(yù)測(cè)的分布過(guò)于集中;
形的直方圖意味著預(yù)測(cè)的分布過(guò)于分散;明顯不對(duì)稱(chēng)的直方圖則意味著預(yù)測(cè)的分布整體偏離真實(shí)值。
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import norm
sns.set()
obs = np.random.normal(loc=0, scale=1, size=1000) # 觀測(cè)值
pit_1 = norm.cdf(x=obs, loc=0, scale=1) # 準(zhǔn)確的預(yù)測(cè)
pit_2 = norm.cdf(x=obs, loc=0, scale=0.5) # 預(yù)測(cè)過(guò)于集中
pit_3 = norm.cdf(x=obs, loc=0, scale=2) # 預(yù)測(cè)過(guò)于分散
pit_4 = norm.cdf(x=obs, loc=1, scale=1) # 均值偏離
plt.figure(figsize=(10, 8))
ax1 = plt.subplot(221)
sns.distplot(pit_1, bins=20, kde=False, color='g')
ax1.set_title('Histogram of PIT_1')
ax2 = plt.subplot(222)
sns.distplot(pit_2, bins=20, kde=False, color='g')
ax2.set_title('Histogram of PIT_2')
ax3 = plt.subplot(223)
sns.distplot(pit_3, bins=20, kde=False, color='g')
ax3.set_title('Histogram of PIT_3')
ax4 = plt.subplot(224)
sns.distplot(pit_4, bins=20, kde=False, color='g')
ax4.set_title('Histogram of PIT_4')
plt.tight_layout()
plt.show()

PIT 還可以用 P-P 圖來(lái)展示。簡(jiǎn)單地說(shuō),就是畫(huà)出 PIT 的 CDF 與標(biāo)準(zhǔn)均勻分布的 CDF 的關(guān)系圖。如果預(yù)測(cè)準(zhǔn)確,得到的應(yīng)該是一條直線。反 sigmoid 曲線意味著預(yù)測(cè)的分布過(guò)于集中;sigmoid 曲線意味著預(yù)測(cè)的分布過(guò)于分散;其它曲線則意味著預(yù)測(cè)的分布可能已經(jīng)整體偏離真實(shí)值了。
from scipy.stats import uniform
def get_pp(pit, bins):
hist, edges = np.histogram(pit, bins, range=(0,1))
cdf = np.cumsum(hist) / np.sum(hist)
cdf_u = uniform.cdf(x=edges[1:])
return cdf_u, cdf
plt.figure(figsize=(10, 8))
ax1 = plt.subplot(221)
plt.plot(*get_pp(pit_1, 20), '-o')
ax1.set_title('PP plot of PIT_1')
ax2= plt.subplot(222)
plt.plot(*get_pp(pit_2, 20), '-o')
ax2.set_title('PP plot of PIT_2')
ax3 = plt.subplot(223)
plt.plot(*get_pp(pit_3, 20), '-o')
ax3.set_title('PP plot of PIT_3')
ax4 = plt.subplot(224)
plt.plot(*get_pp(pit_4, 20), '-o')
ax4.set_title('PP plot of PIT_4')
plt.tight_layout()
plt.show()

2. 數(shù)值評(píng)分規(guī)則
2.1 連續(xù)概率排位分?jǐn)?shù)(Continuous Ranked Probability Score,CRPS)
CRPS 是在概率預(yù)測(cè)領(lǐng)域使用最廣泛的準(zhǔn)確度指標(biāo)之一。它的定義如下:
其中 是預(yù)測(cè)分布的 CDF,
是觀測(cè)值的 CDF。注意是平方的積分,千萬(wàn)不要誤解為等于下圖兩條曲線之間的面積!?。?/strong>

由定義可知,CRPS 衡量的是預(yù)測(cè)分布和真實(shí)分布的差異,當(dāng)預(yù)測(cè)分布與真實(shí)分布完全一致時(shí),CRPS 為零。預(yù)測(cè)分布過(guò)于集中、過(guò)于分散,亦或是偏離觀測(cè)值太遠(yuǎn)都會(huì)導(dǎo)致 CRPS 增大。
多數(shù)情況下,真實(shí)分布是未知的。如果對(duì)一系列的觀測(cè)值 有各自對(duì)應(yīng)的概率預(yù)測(cè)
,則可以用下式來(lái)估計(jì) CRPS:
其中
為單位階躍函數(shù),如下圖所示。

2.2 交叉熵(Cross Entropy)和對(duì)數(shù)分?jǐn)?shù)(Logarithmic Score)
如前所述,CRPS 衡量的是預(yù)測(cè)分布與真實(shí)分布之間的差異。我們知道,機(jī)器學(xué)習(xí)分類(lèi)問(wèn)題中常用的損失函數(shù)交叉熵也是用來(lái)比較兩個(gè)概率分布之間的差異的。
概率分布 和
的交叉熵定義為
其中 為真實(shí)分布,
為預(yù)測(cè)分布。
若 和
是離散的,則
在真實(shí)分布未知的情況下,可以用下式來(lái)估計(jì)交叉熵:
其中 為觀測(cè)值。
如果對(duì)一系列的觀測(cè)值 有各自對(duì)應(yīng)的概率預(yù)測(cè)
,則對(duì)數(shù)分?jǐn)?shù)(Logarithmic Score)定義為
其中 為
對(duì)應(yīng)的 PDF??梢钥吹綄?duì)數(shù)分?jǐn)?shù)與交叉熵的估計(jì)式(6)形式上是相近的。
2.3 Brier Score
Brier Score 通常用于分類(lèi)問(wèn)題中,其定義為
其中 n 是樣本數(shù)量,r 是類(lèi)目數(shù)量, 是模型預(yù)測(cè)第 t 個(gè)樣本的類(lèi)目為 i 的概率,
是第 t 個(gè)樣本的真實(shí)狀態(tài)(類(lèi)目為 i 則取 1,否則取 0)。
3. 需要注意的問(wèn)題
如前所述,真實(shí)分布已知的情況下,CRPS 可以直接計(jì)算。根據(jù)定義(1),預(yù)測(cè)準(zhǔn)確(即預(yù)測(cè)分布與真實(shí)分布完全一致)時(shí) CRPS 為零。但真實(shí)分布未知的情況下,CRPS 只能通過(guò)(2)估算。此時(shí)就算預(yù)測(cè)準(zhǔn)確,CRPS 也不為零。且不同的真實(shí)分布,在同樣預(yù)測(cè)準(zhǔn)確的時(shí)候,對(duì)應(yīng)的 CRPS 也不一樣。下面給出一個(gè)簡(jiǎn)單的例子:
>>> import numpy as np
>>> import properscoring as ps
>>> obs1 = np.random.normal(loc=0, scale=1, size=1000) # 從均值為0,方差為1的正態(tài)分布中采樣作為觀測(cè)值
>>> crps1 = np.mean(ps.crps_gaussian(x=obs1, mu=0, sig=1)) # 預(yù)測(cè)分布同樣是均值為0,方差為1的正態(tài)分布,估算 CRPS 值
>>> crps1
0.5795829266550281
>>> obs2 = np.random.normal(loc=0, scale=10, size=1000) # 從均值為0,方差為10的正態(tài)分布中采樣作為觀測(cè)值
>>> crps2 = np.mean(ps.crps_gaussian(x=obs2, mu=0, sig=10)) # 預(yù)測(cè)分布同樣是均值為0,方差為10的正態(tài)分布,估算 CRPS 值
>>> crps2
5.326040950564251
>>>
不能因?yàn)?crps1 比 crps2 小,就認(rèn)為前者的預(yù)測(cè)更好,事實(shí)上它們都是對(duì)各自觀測(cè)值真實(shí)分布的準(zhǔn)確預(yù)測(cè),因此是一樣好的。在真實(shí)分布未知的情況下,CRPS 只適合用來(lái)衡量對(duì)同一個(gè)分布的不同預(yù)測(cè)之間的相對(duì)好壞,而不能衡量絕對(duì)的好壞。不難驗(yàn)證交叉熵也是如此。這與點(diǎn)估計(jì)中用到的各種準(zhǔn)確率指標(biāo)是不一樣的。
怎樣才能評(píng)估絕對(duì)的好壞呢?前面說(shuō)過(guò),預(yù)測(cè)準(zhǔn)確的情況下,PIT 服從標(biāo)準(zhǔn)的均勻分布。如果計(jì)算 PIT 與標(biāo)準(zhǔn)均勻分布之間的 CRPS 或交叉熵,無(wú)論真實(shí)分布是怎樣的,只要預(yù)測(cè)準(zhǔn)確,結(jié)果都應(yīng)該是接近的。
但 PIT 本身就沒(méi)有問(wèn)題了嗎?如下圖所示。左邊兩圖中的紅色實(shí)線表示真實(shí)值,綠色陰影表示預(yù)測(cè)的分布(采用均勻分布)。右邊兩圖是對(duì)應(yīng)的 PIT。從 PIT 得出的結(jié)論應(yīng)該是上面的預(yù)測(cè)好,但上面這個(gè)真的是你需要的預(yù)測(cè)嗎?

參考文獻(xiàn)
[1] Gneiting, T., & Raftery, A. E. (2007). Strictly proper scoring rules, prediction, and estimation. Journal of the American Statistical Association, 102(477), 359–378. https://doi.org/10.1198/016214506000001437
[2] Friederichs, P., & Thorarinsdottir, T. L. (2012). Forecast verification for extreme value distributions with an application to probabilistic peak wind prediction. Environmetrics, 23(7), 579–594. https://doi.org/10.1002/env.2176
[3] Benedetti, R. (2010). Scoring Rules for Forecast Verification. Monthly Weather Review, 138(1), 203–211. https://doi.org/10.1175/2009MWR2945.1
[4] Cross entropy - Wikipedia https://en.wikipedia.org/wiki/Cross_entropy
[5] Barier score - Wikipedia https://en.wikipedia.org/wiki/Brier_score