概率校准与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分数对于一组预测值越低,预测校准越好。

       其求解公式如下:(此公式只适合二分类情况,还有原始定义公式)

       

     其中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_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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/485199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【剑指offer】面试题66:构建乘积数组(Java)

给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B 中的元素 B[i]A[0]A[1]…A[i-1]A[i1]…A[n-1]。不能使用除法。 示例: 输入: [1,2,3,4,5] 输出: [120,60,40,30,24] 提示: 所有元素乘积之和不会溢出 32 位整数 a.lengt…

费曼:所有科学知识都是不确定的

来源 : 网络作为科学家,我们知道伟大的进展都源于承认无知,源于思想的自由。那么这是我们的责任——宣扬思想自由的价值,教育人们不要惧怕质疑而应该欢迎它、讨论它,而且毫不妥协地坚持拥有这种自由——这是我们对未来…

遍历性能

iOS开发中数组常用的五种遍历方式 随着iOS的不断发展,apple也不断推出性能更高的数组遍历方式,下面将对熟悉的五种遍历方式进行列举。 首先定义一个数组,并获取数组长度 一、for循环 二、forin 快速枚举 三、NSEnumerator 四、快速遍历 五、快…

【剑指offer】面试题68 - I:二叉树的最近公共祖先(Java)

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自…

工业传感器:工业互联网的第一道门

来源:北京物联网智能技术应用协会作者:刘沁沈阳仪表科学研究院副总工程师、传感器国家工程研究中心常务副主任工业的发展离不开众多感知技术的加持,其中最为关键的技术之一便是传感器。可以说,工业传感器让自动化智能设备有了感知…

数学:二项式定理

先贴一张网图来弥补一下知识点,回顾NOIP2011计算系数 既然我们要求的是展开式中某一项的系数,那么就直接求出其对应的组合数就好了,但是要注意x和y都是有系数a和b的 x,y换成ax,by,得到x^ny^m的系数是a^n*b^m*C(k,n) 这样就可以了 …

【剑指offer】面试题03:数组中重复的数字(java)

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 示例 1: 输入: [2, 3, 1, 0, 2, …

城市大脑全球标准研究2:如何理解和定义城市大脑?

作者:刘锋城市大脑作为一个新生事物,如何理解和定义反映了人们对这个新事物的理解程度,同时由于城市大脑是一个复杂的智能巨系统,如何理解和定义它对于后续的建设和发展也将产生重大和深远的影响。目前对城市大脑的定义有如下几种…

1036 跟奥巴马一起编程(15 分)

美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。2014 年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在…

【剑指offer】面试题04:二维数组中的查找(java)

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 示例: 现有矩阵 matrix 如下: …

Bengio、Hinton的不懈追求——深度学习算法揭示大脑如何学习

来源:AI科技评论编译:Don校对:青暮“如果我们能够揭示大脑的某些学习机制或学习方法,那么人工智能将能迎来进一步的发展,”Bengio如是说。深度学习依赖于精妙设计的算法,一行行精妙绝伦的公式让冰冷的计算机…

linux下的idea的界面问题,错位以及各种...

问题 ’ 方法 主题设置为GTK,多余的点会消失,而且字体也会好很多 转载于:https://www.cnblogs.com/ydymz/p/9595229.html

【剑指offer】面试题05:替换空格(java)

请实现一个函数&#xff0c;把字符串 s 中的每个空格替换成"%20"。 示例 1&#xff1a; 输入&#xff1a;s "We are happy." 输出&#xff1a;"We%20are%20happy." 限制&#xff1a; 0 < s 的长度 < 10000 思路&#xff1a;Java中S…

我们死去后,宇宙还能记住我们吗?

图片来源&#xff1a;Pixabay撰文&#xff1a;约翰霍根&#xff08;John Horgan&#xff09;翻译&#xff1a;常灏杰审校&#xff1a;曾小欢 吴非一些物理学家坚信信息不会消失&#xff0c;甚至在黑洞中也不会消失&#xff0c;但是这一“规律”也许只是一厢情愿而已。我是个强迫…

DataPipeline | PayPal庞姬桦:大数据在小微企业贷款上的运用

庞姬桦女士毕业于北京大学和美国哥伦比亚大学&#xff0c;目前担任PayPal公司消费者风险管理总监&#xff0c;负责通过大数据实现对互联网金融风险的侦测、跟踪、管控和防范。在加入PayPal之前&#xff0c;曾任职于渣打银行&#xff08;中国&#xff09;和美国运通公司&#xf…

【剑指offer】面试题6:从尾到头打印链表(Java)

输入一个链表的头节点&#xff0c;从尾到头反过来返回每个节点的值&#xff08;用数组返回&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,3,2] 输出&#xff1a;[2,3,1] 限制&#xff1a; 0 < 链表长度 < 10000 思路&#xff1a;利用栈 /** * Defi…

H5 与 IOS的爱恨情仇(兼容问题)

1 input 框在ios上存在阴影的问题 input{resize: none;-webkit-appearance: none;box-sizing: border-box;} 2 H5 在ios端滚动的时候卡顿问题&#xff08;在另一人的博客写的&#xff0c;我直接用了方法1&#xff0c;挺好&#xff09; -webkit-overflow-scrolling : touch 但这…

贝尔实验室发布6G通信白皮书

来源&#xff1a;5G重要信息随着5G的广泛部署和落地无线通信网络演进的风向标转向6G合理地预测和构建下一代无线网络的全景是准确把握和引导6G研究方向的前提2021 MWCS期间贝尔实验室发布了《6G通信白皮书》分析生活和工作中&#xff0c;未来的通信演进方向探讨移动通信的变革大…

【剑指offer】面试题09:用两个栈实现队列(Java)

用两个栈实现一个队列。队列的声明如下&#xff0c;请实现它的两个函数 appendTail 和 deleteHead &#xff0c;分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素&#xff0c;deleteHead 操作返回 -1 ) 示例 1&#xff1a; 输入&#xff1a; ["…

GLSL中 Billboard和Point的顶点空间变换

请见我的文章: https://blog.csdn.net/vily_lei/article/details/82459551 转载于:https://www.cnblogs.com/vilyLei/articles/9597742.html