機器學習:機率校準

1.再提邏輯迴歸html

   前面已經講過了邏輯迴歸,這裏再也不細講,只是簡單的說一個函數,主要是方便你們更好的理解機率校準。算法

  在邏輯迴歸中,用的最多的就是sigmod函數,這個函數的做用就是把無限大或者無限小的數據壓縮到[0,1]之間,用來估計機率。圖像大體爲:ide

基本上是以0.5分界,0.5以上爲1,0.5如下爲0。可是這個分界值能夠本身設定。函數

2.分類函數的原理spa

       在進行分類時,基本上和邏輯迴歸的原理同樣,計算出某個數據屬於各分類的機率,而後取機率最大的那個做爲最終的分類標籤。翻譯

       可是假設咱們考慮這樣的一種狀況:在二分類中,屬於類別0的機率爲0.500001,屬於類別1的機率爲0.499999。倘若按照0.5做爲判別標準,那麼毋庸置疑應該劃分到類別0裏面,可是這個真正的分類卻應該是1。若是咱們再也不作其餘處理,那麼這個就屬於錯誤分類,下降了算法的準確性。code

       若是在不改變總體算法的狀況下,咱們是否可以作一些補救呢?或者說驗證下當前算法已是最優的了呢?htm

       這個時候就用到了機率校準。blog

3.Brier分數事件

       在說機率校準前,先說下Brier分數,由於它是衡量機率校準的一個參數。

       簡單來講,Brier分數能夠被認爲是對一組機率預測的「校準」的量度,或者稱爲「 成本函數 」,這一組機率對應的狀況必須互斥,而且機率之和必須爲1.

       Brier分數對於一組預測值越低,預測校準越好。

       其求解公式以下:(此公式只適合二分類狀況,還有原始定義公式)

       

     其中F_ {噸}  是預測的機率,事件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_loss

x_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)
View Code

         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則表示分類正確的百分比。

相關文章
相關標籤/搜索