机器学习:几率校准

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则表示分类正确的百分比。

相关文章
相关标签/搜索