博客專欄

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

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

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

        作者:  Samuele Mazzanti

        翻譯:歐陽錦    

        校對(duì):王可汗

        1.png

        圖源自作者

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

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

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

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

        2.png

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

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

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

        但是,根據(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ù)測(cè)概率,“predict_proba”并不能完全預(yù)測(cè)概率。實(shí)際上,不同的研究(尤其是這個(gè)研究和這個(gè)研究)表明,最為常見的預(yù)測(cè)模型并沒有進(jìn)行校準(zhǔn)。

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

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

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

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

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

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

        校準(zhǔn)曲線

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

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

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

        3.png

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

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

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

        4.png

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

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

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

        5.png

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

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

        6.png

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

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

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

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

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

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

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

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

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

        7.png

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

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

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

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

        • 邏輯回歸。

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

        8.png

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

        9.png

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

        保序回歸

        10.png

        邏輯回歸

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

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

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

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

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

        量化校準(zhǔn)錯(cuò)誤

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

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

        以一個(gè)分類器為例:

        11.png

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

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

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

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

        12.png

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

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

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

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

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

        13.png

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

        14.png

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

        正如上圖所示,如果你認(rèn)為普通隨機(jī)森林的ECE為7%,那么保序回歸在校準(zhǔn)方面則提供了最好的結(jié)果,這可以看作是一個(gè)巨大的進(jìn)步,因?yàn)槠骄鶃砜?,使用保序回歸的模型,其預(yù)測(cè)概率距離真實(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)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。

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


        關(guān)鍵詞: Python

        相關(guān)推薦

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

        關(guān)閉
        主站蜘蛛池模板: 屏东市| 依安县| 来安县| 玉树县| 凌源市| 碌曲县| 万宁市| 卓尼县| 泌阳县| 芒康县| 定西市| 建始县| 宾川县| 伊宁市| 高台县| 广河县| 曲麻莱县| 固阳县| 乌兰察布市| 岳阳市| 上杭县| 东平县| 宝应县| 同心县| 大埔县| 淮南市| 棋牌| 芒康县| 宁阳县| 临夏县| 哈尔滨市| 时尚| 即墨市| 和田县| 溧阳市| 定安县| 尼勒克县| 古交市| 丰城市| 龙门县| 永川市|