概率校准与Brier分数
?
1.再提邏輯回歸
? ?前面已經講過了邏輯回歸,這里不再細講,只是簡單的說一個函數,主要是方便大家更好的理解概率校準。
? 在邏輯回歸中,用的最多的就是sigmod函數,這個函數的作用就是把無限大或者無限小的數據壓縮到[0,1]之間,用來估計概率。圖像大致為:
基本上是以0.5分界,0.5以上為1,0.5以下為0。但是這個分界值可以自己設定。
2.分類函數的原理
? ? ? ?在進行分類時,基本上和邏輯回歸的原理一樣,計算出某個數據屬于各分類的概率,然后取概率最大的那個作為最終的分類標簽。
? ? ? ?但是假設我們考慮這樣的一種情況:在二分類中,屬于類別0的概率為0.500001,屬于類別1的概率為0.499999。假若按照0.5作為判別標準,那么毋庸置疑應該劃分到類別0里面,但是這個真正的分類卻應該是1。如果我們不再做其他處理,那么這個就屬于錯誤分類,降低了算法的準確性。
? ? ? ?如果在不改變整體算法的情況下,我們是否能夠做一些補救呢?或者說驗證下當前算法已經是最優的了呢?
? ? ? ?這個時候就用到了概率校準。
3.Brier分數
? ? ? ?在說概率校準前,先說下Brier分數,因為它是衡量概率校準的一個參數。
? ? ? ?簡單來說,Brier分數可以被認為是對一組概率預測的“校準”的量度,或者稱為“ 成本函數 ”,這一組概率對應的情況必須互斥,并且概率之和必須為1.
? ? ? ?Brier分數對于一組預測值越低,預測校準越好。
? ? ? ?其求解公式如下:(此公式只適合二分類情況,還有原始定義公式)
? ? ? ?
? ? ?其中??是預測的概率,是事件t的實際概率(如果不發生則為0),而N是預測事件數量。
? ? ?引用維基百科的一個例子說明?Brier分數的計算方式:? ?
? ? ?假設一個人預測在某一天會下雨的概率P,則Brier分數計算如下:
? ? ? ? ? 如果預測為100%(P = 1),并且下雨,則Brier Score為0,可達到最佳分數。
? ? ? ? ? 如果預測為100%(P = 1),但是不下雨,則Brier Score為1,可達到最差分數。
? ? ? ? ? 如果預測為70%(P = 0.70),并且下雨,則Brier評分為(0.70-1)2?= 0.09。
? ? ? ? ? 如果預測為30%(P = 0.30),并且下雨,則Brier評分為(0.30-1)2?= 0.49。
? ? ? ? ? 如果預測為50%(P = 0.50),則Brier分數為(0.50-1)2?=(0.50-0)2?= 0.25,無論是否下雨。
4.概率校準
? ? ? ? ? 概率校準就是對分類函數做出的分類預測概率重新進行計算,并且計算Brier分數,然后依據Brier分數的大小判斷對初始預測結果是支持還是反對。
5.舉例說明
? 1)核心函數
? ? ? ? a)sklearn.calibration.CalibratedClassifierCV
? ? ? ? b)主要參數:
? ? ? ? ? ? ?base_estimator :初始分類函數
? ? ? ? ? ? ?method :校準采用的方法。取值‘sigmoid’ 或者 ‘isotonic’
? ? ? ? ? ? ?cv :交叉驗證的折疊次數。
? ? ? ? ?c)詳細代碼及說明? ? ? ? ? ??
from sklearn.naive_bayes import GaussianNB import numpy as np from sklearn.calibration import CalibratedClassifierCV from sklearn.metrics import brier_score_lossx_train = np.array([[1,2,3],[1,3,4],[2,1,2],[4,5,6],[3,5,3],[1,7,2]]) y_train = np.array([0, 0, 0, 1, 1, 1]) x_test = np.array([[2,2,2],[3,2,6],[1,7,4],[2,5,1]])# y_test = np.array([0, 1, 1, 1]) #clf = GaussianNB() clf.fit(x_train, y_train)##返回預測標簽 y_pred = clf.predict(x_test) print("******預測的分類值***************************") print(y_pred)##返回預測屬于某標簽的概率 prob_pos_clf = clf.predict_proba(x_test) print("******屬于某個類的概率*************************") print(prob_pos_clf) print("******Brier scores*************************") clf_score = brier_score_loss(y_test, y_pred) print(clf_score)##進行概論校準 clf_isotonic = CalibratedClassifierCV(clf, cv=2, method='isotonic') clf_isotonic.fit(x_train, y_train)##校準后的預測值 print("******第一次概率校準后的預測分類*************************") y_pred1 = clf_isotonic.predict(x_test) print(y_pred1)##校準后屬于某個分類的概率 print("******第一次概率校準后屬于某個類的概率******************") prob_pos_isotonic = clf_isotonic.predict_proba(x_test) print(prob_pos_isotonic)print("******Brier scores*************************") clf_isotonic_score = brier_score_loss(y_test, y_pred1, pos_label = 0) print(clf_isotonic_score)##進行概論校準 clf_sigmoid = CalibratedClassifierCV(clf, cv=2, method='sigmoid') clf_sigmoid.fit(x_train, y_train)##校準后的預測值 print("*******第二次概率校準后的預測分類*************************") y_pred2 = clf_sigmoid.predict(x_test) print(y_pred2)##校準后屬于某個分類的概率 print("*******第二次概率校準后屬于某個類的概率**************************") prob_pos_sigmoid = clf_sigmoid.predict_proba(x_test) print(prob_pos_sigmoid) print("******Brier scores*************************") clf_sigmoid_score = brier_score_loss(y_test, y_pred2, pos_label = 1) print(clf_sigmoid_score)? ? ? ? ?d)代碼輸出及說明
? ? ? ? 舉這個例子只是為了說明概率校準,所以有些地方可能不是很嚴謹。
******預測的分類值*************************** [0 1 1 1] ******屬于某個類的概率************************* [[ 9.99748066e-01 2.51934113e-04][ 6.85286666e-02 9.31471333e-01][ 1.13899717e-07 9.99999886e-01][ 6.91186866e-04 9.99308813e-01]] ******Brier scores************************* 0.0 ******第一次概率校準后的預測分類************************* [0 0 1 1] ******第一次概率校準后屬于某個類的概率****************** [[ 0.75 0.25][ 0.75 0.25][ 0.25 0.75][ 0.25 0.75]] ******Brier scores************************* 0.75 *******第二次概率校準后的預測分類************************* [0 0 1 1] *******第二次概率校準后屬于某個類的概率************************** [[ 0.62500028 0.37499972][ 0.62500028 0.37499972][ 0.37500027 0.62499973][ 0.37500027 0.62499973]] ******Brier scores************************* 0.25? ? ?首先,說下概率校準,通過上面的輸出可以看出,對于第二個數[3,2,6],第一次預測結果的概率為[ ?6.85286666e-02 ? 9.31471333e-01],第一次校準后的概率變成了[ 0.75 ?0.25],因為0.75>0.25,所以又被劃分到了類別0,第二次校準后的概率變成了[ 0.62500028 ?0.37499972],所以也被劃分到了類別0.雖然校準后的分類錯了,但是也可以很好說明概率校準的作用。
? ? ?其次,說下Brier scores,三次依次為0.0,0.75,0.25,根據越小越好的原則,初始分類函數已經是最優解了。
? ? ?第三,說下Brier scores中的0.75跟0.25,在代碼中會發現brier_score_loss(y_test, y_pred2, pos_label = 1)中參數pos_label的值是不一樣的,一個是0,一個是1,當pos_label取值為1或者默認時,Brier scores中的0.75也會變成0.25,官方對pos_label的解釋為:Label of the positive class. If None, the maximum label is used as positive class,怎么翻譯都不好理解,所以這里就不翻譯了。但是經過我的多次實驗發現,在二分類中,pos_label取值為1或者默認時,表示的應該是分類錯誤的百分比,pos_label=0則表示分類正確的百分比
轉載于:https://www.cnblogs.com/sddai/p/9581142.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的概率校准与Brier分数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c#之using关键字
- 下一篇: day2-元组 列表-赋值和深浅拷贝