博客專欄

EEPW首頁 > 博客 > 獨(dú)家 | Python的“predict_prob”方法不能真實(shí)反映預(yù)測概率校準(zhǔn)(如何實(shí)現(xiàn)校準(zhǔn))

獨(dú)家 | Python的“predict_prob”方法不能真實(shí)反映預(yù)測概率校準(zhǔn)(如何實(shí)現(xiàn)校準(zhǔn))

發(fā)布人:數(shù)據(jù)派THU 時間:2021-05-26 來源:工程師 發(fā)布文章

作者:  Samuele Mazzanti

翻譯:歐陽錦    

校對:王可汗

1.png

圖源自作者

數(shù)據(jù)科學(xué)家通常根據(jù)準(zhǔn)確性或準(zhǔn)確性來評估其預(yù)測模型,但幾乎不會問自己:

“我的模型能夠預(yù)測實(shí)際概率嗎?”

但是,從商業(yè)的角度來看,準(zhǔn)確的概率估計(jì)是非常有價值的(準(zhǔn)確的概率估計(jì)有時甚至比好的精度更有價值)。來看一個例子。

想象一下,你的公司正在出售2個杯子,一個是普通的白色杯子,而另一個則上面印有小貓的照片。你必須決定向這位給定的客戶展示哪個杯子。為此,你需要預(yù)測給定的用戶購買每個杯子的可能性。因此,你訓(xùn)練了幾個不同的模型,你會得到以下結(jié)果:

2.png

具有相同ROC(receiver operating characteristic)但校準(zhǔn)不同的模型。[圖源自作者]

現(xiàn)在,你會向該用戶推薦哪個杯子?

以上兩種模型都認(rèn)為用戶更有可能購買普通馬克杯(因此,模型A和模型B在ROC曲線下具有相同的面積,因?yàn)檫@個指標(biāo)僅僅對分類進(jìn)行評估)。

但是,根據(jù)模型A,你可以通過推薦普通馬克杯來最大化預(yù)期的利潤,然而根據(jù)模型B,小貓馬克杯可以最大化預(yù)期的利潤。

在像這樣的現(xiàn)實(shí)應(yīng)用中,搞清楚哪種模型能夠估算出更好的概率是至關(guān)重要的事情。

在本文中,我們將了解如何度量概率的校準(zhǔn)(包括視覺和數(shù)字),以及如何“糾正”現(xiàn)有模型以獲得更好的概率。

“predict_proba”的問題

Python中所有最流行的機(jī)器學(xué)習(xí)庫都有一種稱為“ predict_proba”的方法:Scikit-learn(例如LogisticRegression,SVC,RandomForest等),XGBoost,LightGBM,CatBoost,Keras…

但是,盡管它的名字是預(yù)測概率,“predict_proba”并不能完全預(yù)測概率。實(shí)際上,不同的研究(尤其是這個研究和這個研究)表明,最為常見的預(yù)測模型并沒有進(jìn)行校準(zhǔn)。

數(shù)值在0與1之間不代表它就是概率!

但是,什么時候可以說一個數(shù)值實(shí)際上代表概率呢?

想象一下,你已經(jīng)訓(xùn)練了一種預(yù)測模型來預(yù)測患者是否會患上癌癥。如果對于給定的患者,模型預(yù)測的概率為5%。原則上,我們應(yīng)該在多個平行宇宙中觀察同一位患者,并查看其實(shí)際上患上癌癥的頻率是否為5%。

但是這種觀察條件這是不可能發(fā)生的事,所以最好的替代方法是將所有概率在5%附近的患者都接受治療,并計(jì)算其中有多少人真的患了癌癥。如果觀察到的患癌百分比實(shí)際上接近5%,則可以說該模型提供的概率是“已校準(zhǔn)”的。

當(dāng)預(yù)測的概率反映了真實(shí)情況的潛在概率時,這些預(yù)測概率被稱為“已校準(zhǔn)”。

那么,如何檢查一個模型是否已校準(zhǔn)?

校準(zhǔn)曲線

評估一個模型校準(zhǔn)的最簡單的方法是通過一個稱為“校準(zhǔn)曲線”的圖(也稱為“可靠性圖”,reliability diagram)。

這個方法主要是將觀察到的結(jié)果通過概率劃分為幾類(bin)。因此,屬于同一類的觀測值具有相近的概率。在這一點(diǎn)上,對于每個類,校準(zhǔn)曲線將預(yù)測這個類的平均值(即預(yù)測概率的平均值),然后將預(yù)測概率的平均值與理論平均值(即觀察到的目標(biāo)變量的平均值)進(jìn)行比較。

Scikit-learn通過“ calibration_curve”函數(shù)可以完成所有這些工作:

3.png

你只需要確定類的數(shù)量和以下兩者之間的分類策略(可選)即可:

  • “uniform”,一個0-1的間隔被分為n_bins個類,它們都具有相同的寬度;

  • “quantile”,類的邊緣被定義,從而使得每個類都具有相同數(shù)量的觀測值。

4.png

 分類策略,分類數(shù)量為7。[圖源自作者]

出于繪圖目的,本人更喜歡“quantile”的分類策略。實(shí)際上,“uniform”分類可能會引起誤導(dǎo),因?yàn)橛行╊愔锌赡苤话苌俚挠^察結(jié)果。

Numpy函數(shù)給每個分類返回兩個數(shù)組,每個數(shù)組包含平均概率和目標(biāo)變量的平均值。因此,接下來要做的就是繪制它們:

5.png

假設(shè)你的模型具有良好的精度,則校準(zhǔn)曲線將單調(diào)增加。但這并不意味著模型已被正確校準(zhǔn)。實(shí)際上,只有在校準(zhǔn)曲線非常接近等分線時(即下圖中的灰色虛線),您的模型才能得到很好的校準(zhǔn),因?yàn)檫@將意味著預(yù)測概率基本上接近理論概率。

讓我們看一些校準(zhǔn)曲線的常見類型的例子,它們表明了模型的校準(zhǔn)錯誤:

6.png

錯誤校準(zhǔn)的常見示例。 [圖源自作者]

最常見的錯誤校準(zhǔn)類型為:

  • 系統(tǒng)高估。與真實(shí)分布相比,預(yù)測概率的分布整體偏右。當(dāng)您在正數(shù)極少的不平衡數(shù)據(jù)集上訓(xùn)練模型時,這種錯誤校準(zhǔn)很常見。(如紅線)

  • 系統(tǒng)低估。與真實(shí)分布相比,預(yù)測概率的分布整體偏左。(如藍(lán)線)

  • 分布中心太重。當(dāng)“支持向量機(jī)和提升樹之類的算法趨向于將預(yù)測概率推離0和1”(引自《Predicting good probabilities with supervised learning》)時,就會發(fā)生這類錯誤校準(zhǔn)。(如綠線)

  • 分布的尾巴太重。例如,“其他方法(如樸素貝葉斯)具有相反的偏差(bias),并且傾向于將預(yù)測概率趨近于0和1”(引自《Predicting good probabilities with supervised learning》)。(如黑線)

如何解決校準(zhǔn)錯誤(Python)

假設(shè)你已經(jīng)訓(xùn)練了一個分類器,該分類器會產(chǎn)生準(zhǔn)確但未經(jīng)校準(zhǔn)的概率。概率校準(zhǔn)的思想是建立第二個模型(稱為校準(zhǔn)器),校準(zhǔn)器模型能夠?qū)⒛阌?xùn)練的分類器“校準(zhǔn)”為實(shí)際概率。

請注意,用于訓(xùn)練的第一個分類器的數(shù)據(jù)不能被用于校準(zhǔn)。

7.png

通過兩步法進(jìn)行概率校準(zhǔn)。 [圖源自作者]

因此,校準(zhǔn)包括了將一個一維矢量(未校準(zhǔn)概率)轉(zhuǎn)換為另一個一維矢量(已校準(zhǔn)概率)的功能。

兩種常被用作校準(zhǔn)器的方法:

  • 保序回歸。一種非參數(shù)算法,這種非參數(shù)算法將非遞減的自由格式行擬合到數(shù)據(jù)中。行不會減少這一事實(shí)是很重要的,因?yàn)樗駨脑寂判颉?/p>

  • 邏輯回歸。

看看使用Python如何在玩具數(shù)據(jù)集中實(shí)際應(yīng)用校準(zhǔn)器:

8.png

首先,需要擬合一個分類器。這里使用隨機(jī)森林(或者任何具有“predict_proba”方法的模型都可以)。

9.png

然后,使用分類器的輸出(在驗(yàn)證數(shù)據(jù)集上)來擬合校準(zhǔn)器,并最終預(yù)測測試數(shù)據(jù)集的概率。

保序回歸

10.png

邏輯回歸

現(xiàn)在有三種選擇來預(yù)測概率:

1. 普通隨機(jī)森林,

2. 隨機(jī)森林 + 保序回歸,

3. 隨機(jī)森林 + 邏輯回歸。

但是,我們?nèi)绾卧u估最校準(zhǔn)的是哪一個呢?

量化校準(zhǔn)錯誤

每個人都喜歡圖片展示的量化效果。但是除了校準(zhǔn)圖外,我們還需要一種定量的方法來測量校準(zhǔn)。最常用的方法稱為“預(yù)期校準(zhǔn)誤差(Expected Calibration Error)”,這個方法回答了下面的問題:

我們模型的預(yù)測概率與真實(shí)概率平均相距多遠(yuǎn)?

以一個分類器為例:

11.png

對單個類別(bin)的校準(zhǔn)。[圖源自作者]

定義單個類別(bin)的校準(zhǔn)誤差很容易:即為預(yù)測概率的平均值與同一類別(bin)內(nèi)的正數(shù)所占百分比的絕對差值。

如果考慮一下這個定義,它非常直觀且符合邏輯。取一個類別(bin),并假設(shè)其預(yù)測概率的平均值為25%。因此,我們預(yù)計(jì)該類別中的正數(shù)所占百分比大約等于25%。如果這個百分比離25%越遠(yuǎn),意味著這個類別(bin)的校準(zhǔn)就越差。

因此,預(yù)期校準(zhǔn)誤差(Expected Calibration Error, ECE)是單個類別的校準(zhǔn)誤差的加權(quán)平均值,其中每個類別的權(quán)重與它包含的觀測值的數(shù)量成正比:

12.png

預(yù)期校準(zhǔn)誤差(ECE)[圖源自作者]

其中b標(biāo)識一個類別(bin),B是類別(bin)的數(shù)量。注意,分母只是樣本總數(shù)。

但是這個公式給我們留下了定義B值(即,類別數(shù)量)的問題。為了找到盡可能中性的指標(biāo),我建議根據(jù)Freedman-Diaconis rule(這是一個統(tǒng)計(jì)規(guī)則,旨在找到使直方圖盡可能接近理論概率分布的B值。)

在Python中使用Freedman-Diaconis rule非常簡單,因?yàn)樗呀?jīng)在numpy的直方圖函數(shù)中被實(shí)現(xiàn)(足以將字符串“ fd”傳遞給參數(shù)“ bins”)。

以下是預(yù)期校準(zhǔn)錯誤(ECE)的Python實(shí)現(xiàn),默認(rèn)情況下采用Freedman-Diaconis rule:

13.png

現(xiàn)在,我們有了一個校準(zhǔn)方法,讓我們比較上面獲得的三個預(yù)測概率的模型(在測試集上)的校準(zhǔn)情況:

14.png

三個模型的ECE比較。 [圖源自作者]

正如上圖所示,如果你認(rèn)為普通隨機(jī)森林的ECE為7%,那么保序回歸在校準(zhǔn)方面則提供了最好的結(jié)果,這可以看作是一個巨大的進(jìn)步,因?yàn)槠骄鶃砜?,使用保序回歸的模型,其預(yù)測概率距離真實(shí)概率只有1.2%。

引用

如果你想了解更多概率校準(zhǔn)的主題,以下是一些有趣的文章(本文的基石):

  • ?Predicting good probabilities with supervised learning? (2005) by Caruana and Niculescu-Mizil.

  • ?On Calibration of Modern Neural Networks? (2017) by Guo et al.

  • ?Obtaining Well Calibrated Probabilities Using Bayesian Binning? (2015) by Naeini et al.

原文標(biāo)題:

Python’s ?predict_proba? Doesn’t Actually Predict Probabilities (and How to Fix It)

原文鏈接:

https://towardsdatascience.com/pythons-predict-proba-doesn-t-actually-predict-probabilities-and-how-to-fix-it-f582c21d63fc

*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。

加速度計(jì)相關(guān)文章:加速度計(jì)原理


關(guān)鍵詞: Python

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉