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分数相关推荐

  1. 概率校准 Probability Calibration

    对于二分类分类器,除了得到AUC评价指标,常还需要了解分类器预测概率的准确性.比如分类器预测某个样本属于正类的概率是0.8,那么就应当说明有80%的把握认为该样本属于正类,或者100个概率为0.8的里 ...

  2. 几种经典概率校准方法(Platt scaling、 histogram binning、 isotonic regression、 temperature scaling)

    1. Platt scaling Platt scaling本质上是对模型sigmoid输出的分数做概率变化.在此基础上引入了两个参数a, b,假设输入样本为$X_i$,模型输出分数为$f(X_i)$ ...

  3. 【Scikit-Learn 中文文档】概率校准 - 监督学习 - 用户指南 | ApacheCN

    中文文档: http://sklearn.apachecn.org/cn/0.19.0/modules/calibration.html 英文文档: http://sklearn.apachecn.o ...

  4. 独家 | Python的“predict_prob”方法不能真实反映预测概率校准(如何实现校准)...

    作者:  Samuele Mazzanti 翻译:欧阳锦 校对:王可汗 本文约2300字,建议阅读8分钟 本文讨论了使用python中" predict_proba"的方法所生成的 ...

  5. 概率校准Probability Calibration

    在分类问题中,我们有时不仅仅需要给测试样本打上类别标签,也需要给出一个"置信度"来表示该样本属于此类别的可能性. 然而,有的分类器只能直接打上类别标签没法给出置信度.概率校准就是用 ...

  6. 概率校准calibration_curve,用Isotonic regression,得出calibration_curve的好坏,用交叉熵检验,和方差,及使用朴素贝叶斯方法

    calibration_curve 运行完得出的分类结果是不是满足独立同分布,分类概率prob,可以用最大似然假设?那么概率校准calibration_curve,用Isotonic regressi ...

  7. ML:机器学习模型提效之监督学习中概率校准的简介、案例应用之详细攻略

    ML:机器学习模型提效之监督学习中概率校准的简介.案例应用之详细攻略 目录 监督学习中概率校准的简介 监督学习中概率校准的概述 监督

  8. python 拟合sigmoid曲线_使用python+sklearn实现概率校准曲线

    注意:单击此处https://urlify.cn/muQBjy下载完整的示例代码,或通过Binder在浏览器中运行此示例 在进行分类时,人们经常不仅要预测分类标签,还要预测相关的概率.预测概率可以让人 ...

  9. 语言nomogram校准曲线图_预测模型的概率校准

    1.背景 机器学习分为:监督学习,无监督学习,半监督学习(也可以用hinton所说的强化学习)等.在这里,先简要介绍一下监督学习从给定的训练数据集中学习出一个函数(模型参数),当新的数据到来时,可以根 ...

最新文章

  1. linux服务器间文件夹拷贝
  2. 程序员修神之路--容器技术为什么会这么流行(记得去抽奖)
  3. 云在物联网中的惊人优势 | 技术头条
  4. c# datetime._C#| DateTime.GetHashCode()方法与示例
  5. 【教程】把PPT转WORD形式的方法
  6. 安装redis并开启_如何安装Redis,以及对Redis配置文件的更改和测试
  7. glut编译问题 (程序无法运行)
  8. hadoop的几个常用命令
  9. C语言比赛评分系统报告,c语言编程:本课题模拟一个简单的比赛评分系统,选手从1号开始连续编号,选手得分分为专业素质得分和综...
  10. Raspberry-Pi-PICO系列--第八篇 高级篇使用SWD接口下载和调试(第一章)
  11. 最大连续登录天数统计对应的用户数分布的三种实现方式(HQL+Spark Rdd)
  12. 解决绿C(C与C++程序设计学习与实验系统 2015)软件程序中文出现乱码问题
  13. linux 路由器 漏洞,多个Linksys EA系列路由器信息泄露漏洞(CVE-2014-8244)
  14. 商标注册流程和周期是什么
  15. 异地购房提取北京公积金说查不到贷款信息是怎么回事
  16. 大学计算机专业英语期末考试,河南大学计算机专业英语试题
  17. 对txt文件批量操作
  18. 3DMAX解析愤怒的小鸟
  19. 石正喜MySQL数据库使用教程_《21世纪高职高专系列规划教材:MySQL数据库实用教程》【摘要 书评 在线阅读】-苏宁易购图书...
  20. 【机器学习算法】神经网络和深度学习-4 重要的BP网络使用总结,了解BP神经网络的魅力

热门文章

  1. 2017年12月计算机一级c,2017年12月计算机二级C语言考试操作题冲刺卷(2)
  2. 声压级 matlab,语音信号处理教程(二)声音的声压级和响度
  3. mysql把select结果存到变量中_mysql实例 select into保存到变量的例子
  4. axure弹窗关闭_干货来袭,Axure插入图标的几种办法
  5. rds基于什么开发_java rds
  6. excel高级筛选怎么用_python中实现excel的高级筛选
  7. LeetCode 1769. 移动所有球到每个盒子所需的最小操作数(前缀和)
  8. LeetCode 网易-2. 古老的游戏机
  9. LeetCode 391. 完美矩形(set检查顶点+面积检查)
  10. LeetCode 881. 救生艇(贪心,双指针)