文章目录

  • 分类器的不确定度估计
    • 决策函数(decision_function)
      • 示例
      • 决策函数置信度与预测结果的关系(图像)
    • 预测概率(predict_proba)
      • 示例
      • 预测概率与预测结果的关系(图像)
    • 多分类问题的不确定度
      • 决策函数多分类问题的不确定度
      • 预测概率多分类问题的不确定度

分类器的不确定度估计

不确定度估计,即置信程度

通俗地讲,就是目前模型预测结果正确的概率。

sklearn中有两个函数可以用于获取分类器的不确定度估计,分别为 decision_functionpredict_proba 两个函数。

决策函数(decision_function)

decision_function,即为决策函数。

对于二分类的情况,decision_function返回值的形状为(n_samples,),它只可以估计正类的概率(对于二分类情况来说,‘反’类始终是classes_属性的第一个元素,‘正’类是classes_属性的第二个元素),如果是正值,越大表示对‘’类的置信度越高,如果为‘’值,其绝对值越大表示对‘’类的置信度越高。

示例

以下是简单的示例:

import numpy as np
from sklearn.ensemble import GradientBoostingClassifier                  #梯度提升决策树分类器
from sklearn.datasets import make_circles                                #引入数据集
from sklearn.model_selection import train_test_split                     #引入数据集分割函数X, y = make_circles(noise=0.25, factor=0.5, random_state=1)               #获取数据集#为了便于说明,将两个类别重命名为'blue'、'red'
y_named = np.array(['blue','red'])[y]                                     #使用numpy的方式直接进行重命名#我们可以对任意个数组调用train_test_split
#所有数组的划分方式都是一致的
X_train, X_test, y_train_named, y_test_named, y_train, y_test = \train_test_split(X, y_named, y, random_state=0)#构建梯度提升模型
gbrt = GradientBoostingClassifier(random_state=0)
gbrt.fit(X_train, y_train_named)                                           #训练数据print('X_test.shape:{}'.format(X_test.shape))                                            #输出X_test测试集的形状
print('Decision function shape:{}'.format(grbt.decision_function(X_test).shape))         #输出决策函数进行预测的情况print('Decision function data:{}'.format(grbt.decision_function(X_test)))                #输出每个预测值的置信度
print('Predict result:{}'.format(grbt.predict(X_test)))                                  #输出每个样本的预测结果
X_test.shape:(25, 2)
Decision function shape:(25,)
Decision function data:[ 4.13592603 -1.70169917 -3.95106099 -3.62609552  4.28986642  3.66166081-7.69097179  4.11001686  1.10753937  3.40782222 -6.46255955  4.289866423.90156346 -1.20031247  3.66166081 -4.17231157 -1.23010079 -3.915762234.03602783  4.11001686  4.11001686  0.65709014  2.69826265 -2.65673274-1.86776596]
Predict result:['red' 'blue' 'blue' 'blue' 'red' 'red' 'blue' 'red' 'red' 'red' 'blue''red' 'red' 'blue' 'red' 'blue' 'blue' 'blue' 'red' 'red' 'red' 'red''red' 'blue' 'blue']

我们可以对比一下置信度预测结果的对照是否一致

#先将所有置信度转化为布尔类型数据
gbrt.decision_function(X_test) > 0                      #置信结果大于0,即为正类,否则为负类
array([ True, False, False, False,  True,  True, False,  True,  True,True, False,  True,  True, False,  True, False, False, False,True,  True,  True,  True,  True, False, False])

如果返回 True,代表的是正类(red);返回的是False,代表的是负类(blue)。下面将这些布尔值转化为0或1。

greater_zero = (gbrt.decision_function(X_test)>0).astype(int)              #将布尔值True/False转化为1或0
pred = gbrt.classes_[greater_zero]                                         #利用0和1作为classes的索引print(pred)                                                                #输出由决策边界置信度得到的结果
print(gbrt.predict(X_test))                                               #输出结果print('pred is equal to predictions:{}'.\format(np.all(pred == gbrt.predict(X_test))))                        #pred与gbrt.predict的输出完全相同
['red' 'blue' 'blue' 'blue' 'red' 'red' 'blue' 'red' 'red' 'red' 'blue''red' 'red' 'blue' 'red' 'blue' 'blue' 'blue' 'red' 'red' 'red' 'red''red' 'blue' 'blue']
['red' 'blue' 'blue' 'blue' 'red' 'red' 'blue' 'red' 'red' 'red' 'blue''red' 'red' 'blue' 'red' 'blue' 'blue' 'blue' 'red' 'red' 'red' 'red''red' 'blue' 'blue']
pred is equal to predictions:True

决策函数置信度与预测结果的关系(图像)

在下面的例子中,我们利用颜色编码在二维平面中画出所有点的decision_function, 还有决策边界。

其中训练点为圆点,测试数据为三角形。

import matplotlib.pyplot as plt                               #引入绘图库
import mglearn                                                #引入mglearn库fig, axes = plt.subplots(1, 2, figsize=(13,5))                 #定义绘图面板mglearn.tools.plot_2d_separator(gbrt, X, ax=axes[0],                          #绘制决策函数分界线alpha=.4, fill=True, cm=mglearn.cm2)
scores_image = mglearn.tools.plot_2d_scores(gbrt, X, ax=axes[1],alpha=.4, cm=mglearn.ReBl)         #绘制置信值图形#绘制所有的数据样本
for ax in axes:mglearn.discrete_scatter(X_test[:,0], X_test[:,1], y_test,markers='^', ax=ax)                               #绘制测试集的数据点mglearn.discrete_scatter(X_train[:,0], X_train[:,1], y_train,markers='o', ax=ax)                               #绘制训练集的数据点ax.set_xlabel('Feature 0')ax.set_ylabel('Feature 1')                                 #添加特征名称cbar = plt.colorbar(scores_image, ax=axes.tolist())            #绘制颜色bar
axes[0].legend(['Test class 0', 'Test class 1','Train class 0', 'Train class1'], ncol=4, loc=(.1, 1.1))       #添加标签
<matplotlib.legend.Legend at 0x21e633012e8>

预测概率(predict_proba)

predict_proba的输出是每个类别的概率,往往更容易理解。

对于二分类问题,它的形状往往为(n_samples, 2)。现在试着输出一下上例每类别的概率:

示例

import numpy as np
from sklearn.ensemble import GradientBoostingClassifier                  #梯度提升决策树分类器
from sklearn.datasets import make_circles                                #引入数据集
from sklearn.model_selection import train_test_split                     #引入数据集分割函数X, y = make_circles(noise=0.25, factor=0.5, random_state=1)               #获取数据集#为了便于说明,将两个类别重命名为'blue'、'red'
y_named = np.array(['blue','red'])[y]                                     #使用numpy的方式直接进行重命名#我们可以对任意个数组调用train_test_split
#所有数组的划分方式都是一致的
X_train, X_test, y_train_named, y_test_named, y_train, y_test = \train_test_split(X, y_named, y, random_state=0)#构建梯度提升模型
gbrt = GradientBoostingClassifier(random_state=0)
gbrt.fit(X_train, y_train_named)                                           #训练数据print('X_test.shape:{}'.format(X_test.shape))                                            #输出X_test测试集的形状
print('Predict_proba shape:{}'.format(grbt.predict_proba(X_test).shape))                 #输出置信度预测概率的情况print('Predict_proba data:\n',grbt.predict_proba(X_test))                                #输出每个预测值的置信度
print('Predict result:{}'.format(grbt.predict(X_test)))                                  #输出每个样本的预测结果
X_test.shape:(25, 2)
Predict_proba shape:(25, 2)
Predict_proba data:[[1.57362639e-02 9.84263736e-01][8.45756526e-01 1.54243474e-01][9.81128693e-01 1.88713075e-02][9.74070327e-01 2.59296728e-02][1.35214212e-02 9.86478579e-01][2.50463747e-02 9.74953625e-01][9.99543275e-01 4.56725221e-04][1.61426376e-02 9.83857362e-01][2.48329911e-01 7.51670089e-01][3.20518935e-02 9.67948107e-01][9.98441637e-01 1.55836338e-03][1.35214212e-02 9.86478579e-01][1.98099245e-02 9.80190075e-01][7.68580365e-01 2.31419635e-01][2.50463747e-02 9.74953625e-01][9.84817480e-01 1.51825198e-02][7.73836215e-01 2.26163785e-01][9.80463909e-01 1.95360915e-02][1.73607896e-02 9.82639210e-01][1.61426376e-02 9.83857362e-01][1.61426376e-02 9.83857362e-01][3.41393574e-01 6.58606426e-01][6.30759509e-02 9.36924049e-01][9.34424749e-01 6.55752512e-02][8.66199569e-01 1.33800431e-01]]
Predict result:['red' 'blue' 'blue' 'blue' 'red' 'red' 'blue' 'red' 'red' 'red' 'blue''red' 'red' 'blue' 'red' 'blue' 'blue' 'blue' 'red' 'red' 'red' 'red''red' 'blue' 'blue']

其中,每行的第一个元素是第一个类别的估计概率,第二个元素是第二个类别的估计概率。

由于predict_proba的输出是一个概率,因此总是在0和1之间,这两个类别元素之和始终为1,当有一个类别的概率超50%,该类别即模型的预测结果。

预测概率与预测结果的关系(图像)

同样的,再次给出该数据集的决策边界,以及类别1的类别概率

import matplotlib.pyplot as plt                               #引入绘图库
import mglearn                                                #引入mglearn库fig, axes = plt.subplots(1, 2, figsize=(13,5))                 #定义绘图面板mglearn.tools.plot_2d_separator(gbrt, X, ax=axes[0],                          #绘制决策函数分界线alpha=.4, fill=True, cm=mglearn.cm2)
scores_image = mglearn.tools.plot_2d_scores(gbrt, X, ax=axes[1],alpha=.5, cm=mglearn.ReBl,function='predict_proba')          #绘制置信值图形#绘制所有的数据样本
for ax in axes:mglearn.discrete_scatter(X_test[:,0], X_test[:,1], y_test,markers='^', ax=ax)                               #绘制测试集的数据点mglearn.discrete_scatter(X_train[:,0], X_train[:,1], y_train,markers='o', ax=ax)                               #绘制训练集的数据点ax.set_xlabel('Feature 0')ax.set_ylabel('Feature 1')                                 #添加特征名称cbar = plt.colorbar(scores_image, ax=axes.tolist())            #绘制颜色bar
axes[0].legend(['Test class 0', 'Test class 1','Train class 0', 'Train class1'], ncol=4, loc=(.1, 1.1))       #添加标签
<matplotlib.legend.Legend at 0x21e635772b0>

多分类问题的不确定度

之前仅讨论了二分类问题中的不确定度估计,但decision_function和predict_proba也适用于多分类问题

现在将这两个函数应用于鸢尾花数据集,该数据集是一个三分类数据集

决策函数多分类问题的不确定度

先看下面的例子:

from sklearn.datasets import load_iris              #引入鸢尾花数据集iris = load_iris()                                   #加载鸢尾花数据集
X_train, X_test, y_train, y_test = \train_test_split(iris.data, iris.target,random_state=42)                #切分数据集#构造梯度提升决策树
gbrt = GradientBoostingClassifier(learning_rate=0.01,random_state=0)gbrt.fit(X_train, y_train)                           #训练数据集#输出决策函数预测后的形状
print('Decision function shape:{}'.format(gbrt.decision_function(X_test).shape))
print('Decision function:\n{}'.format(gbrt.decision_function(X_test)[:6,:]))             #输出前6挑数据
Decision function shape:(38, 3)
Decision function:
[[-1.995715    0.04758267 -1.92720695][ 0.06146394 -1.90755736 -1.92793758][-1.99058203 -1.87637861  0.09686725][-1.995715    0.04758267 -1.92720695][-1.99730159 -0.13469108 -1.20341483][ 0.06146394 -1.90755736 -1.92793758]]

对于多分类的情况,decision_function的形状为(n_samples, n_classes),每一列对应每个类别的 “确定度分数” 。

分数较高的类别可能性更大,分数较低的类别可能性较小。 可以找出每个数据点的最大元素,利用最大元素来再现预测结果:

print('Argmax of decision function:\n{}'.format(np.argmax(gbrt.decision_function(X_test), axis=1)))                          #取出每一行的最大元素对应的下标
print('Prediciton:\n{}'.format(gbrt.predict(X_test)))                   #输出预测结果
Argmax of decision function:
[1 0 2 1 1 0 1 2 1 1 2 0 0 0 0 1 2 1 1 2 0 2 0 2 2 2 2 2 0 0 0 0 1 0 0 2 10]
Prediciton:
[1 0 2 1 1 0 1 2 1 1 2 0 0 0 0 1 2 1 1 2 0 2 0 2 2 2 2 2 0 0 0 0 1 0 0 2 10]

预测概率多分类问题的不确定度

先看如下例子:

from sklearn.datasets import load_iris              #引入鸢尾花数据集iris = load_iris()                                   #加载鸢尾花数据集
X_train, X_test, y_train, y_test = \train_test_split(iris.data, iris.target,random_state=42)                #切分数据集#构造梯度提升决策树
gbrt = GradientBoostingClassifier(learning_rate=0.01,random_state=0)gbrt.fit(X_train, y_train)                           #训练数据集#输出决策函数预测后的形状
print('predict_proba shape:{}'.format(gbrt.predict_proba(X_test).shape))
print('predict_proba:\n{}'.format(gbrt.predict_proba(X_test)[:6,:]))             #输出前6挑数据
predict_proba shape:(38, 3)
predict_proba:
[[0.10217718 0.78840034 0.10942248][0.78347147 0.10936745 0.10716108][0.09818072 0.11005864 0.79176065][0.10217718 0.78840034 0.10942248][0.10360005 0.66723901 0.22916094][0.78347147 0.10936745 0.10716108]]

可以发现,多分类问题下预测概率函数predict_proba的置信度同二分类问题一致的。

形状为(n_samples, n_classes)。 其中每个数据点的所有可能类别的概率之和为 1。

同样的,也可以采用这种方式来预测结果:

print('Argmax of predict_proba:\n{}'.format(np.argmax(gbrt.decision_function(X_test), axis=1)))                          #取出每一行的最大元素对应的下标
print('Prediciton:\n{}'.format(gbrt.predict(X_test)))                   #输出预测结果
Argmax of predict_proba:
[1 0 2 1 1 0 1 2 1 1 2 0 0 0 0 1 2 1 1 2 0 2 0 2 2 2 2 2 0 0 0 0 1 0 0 2 10]
Prediciton:
[1 0 2 1 1 0 1 2 1 1 2 0 0 0 0 1 2 1 1 2 0 2 0 2 2 2 2 2 0 0 0 0 1 0 0 2 10]

这里一定要注意,如果类别为字符串或者其它整数时,必须使用分类器classes_属性获取真实属性名称才可进行对比。

分类器的不确定度估计相关推荐

  1. python基础教程免费下载-《Python机器学习基础教程》高清版免费PDF下载

    Python机器学习基础教程-[德] 安德里亚斯·穆勒(Andreas C.Müller)[美]莎拉·吉多(Sarah Guido) 著,张亮(hysic) 译 下载地址1:网盘下载 下载地址2:网盘 ...

  2. Python机器学习基础篇二《监督学习》

    前言 前期回顾: Python机器学习基础篇一<为什么用Python进行机器学习> 前面说过,监督学习是最常用也是最成功的机器学习类型之一.本章将会详细介绍监督学 习,并解释几种常用的监督 ...

  3. python 不确定度_python机器学习-chapter2_16

    •分类器的不确定度 决策函数(decision_function): 二分类:返回类型为(n_samples, ),为每个样本返回一个浮点数,这个浮点数的正负号代表了预测的分类,值的大小代表了置信度. ...

  4. AI医疗 | 新开源计算机视觉技术用于新生儿胎龄估计

    关注我爱计算机视觉,一个有价值有深度的公众号 计算机视觉是应用性极强的学科,医学图像处理是其中重要的方向. 几天前,最新一期的生物光学顶级期刊<Biomedical Optics Express ...

  5. 极大似然原理和贝叶斯分类器

    贝叶斯分类器: 分类原理:通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类. 经典的贝叶斯公式: 其中:x:为属性或特征,w: ...

  6. 【转载】极大似然估计

    原文链接:知行流浪 https://blog.csdn.net/zengxiantao1994/article/details/72787849 以前多次接触过极大似然估计,但一直都不太明白到底什么原 ...

  7. 西瓜书笔记7:贝叶斯分类器

    目录 相关概率知识 贝叶斯-全概率公式 先验概率.后验概率.似然概率 7.1 贝叶斯决策论 7.2 极大似然估计 极大似然估计公式 均值方差估计公式推导 概率知识复习 高斯分布 最大似然估计 7.3 ...

  8. CVPR2022目标检测文章汇总+创新点简要分析

    大概总结了一下CVPR2022目标检测领域的文章,并未包括跨域和3D目标检测. 个人总结,难免有疏漏,大家参考一下就好. CVPR 2022 一.常规目标检测 1. MViTv2: Improved ...

  9. 【论文总结】Towards Open World Object Detection(附翻译)

    Towards Open World Object Detection 开放世界的目标检测 论文地址:https://arxiv.org/abs/2103.02603 代码地址:GitHub - Jo ...

最新文章

  1. 2019春第一次课程设计实验报告
  2. java 数组练习题,Java练习题 - 数组01
  3. TensorFlow与主流深度学习框架对比
  4. css3 如何动态画一条直线_素描基础学习课:素描长直线的画法!把直线画直的关键!...
  5. caffe+opencv3.3.1
  6. air写文件 SecurityError: fileWriteResource 时报错的解决方法
  7. MyBatis快速将MySQL转换成Oracle语句
  8. memcached php 测试,php一致性hash性能测试(flexihash/memcache/memcached)
  9. varnish4.0简介
  10. html实现开关,使用纯css实现开关效果
  11. 虚函数、C++类、结构体、父类与子类的继承性
  12. AudioTrack播放acc格式音频
  13. Clone 1. 肿瘤克隆进化之前世今生
  14. DNS解析超时排查/etc/resolv.conf single-request-reopen参数说明
  15. python爬虫爬取今日头条_爬取今日头条头条号文章数据
  16. WSTMart 1.4.2 发布,让 bug 不再飞
  17. HDLBITS笔记五加法器减法器
  18. 怎么获取api key?
  19. 字符串库函数(1)Strlen,strcpy,strcat,strcmp
  20. 解密AI芯片的加速原理

热门文章

  1. NEC Topaz电话交换机简单管理
  2. LeetCode - 1109 - 航班预定统计
  3. 树莓派3+python+wiringpi 生成PWM 驱动电调
  4. FireFox允许复制粘贴
  5. 项目管理之年度总结:不会写项目总结的项目管理不是好的管理,附带模板(比较简洁)
  6. SoC设计内容和SoC设计流程总结
  7. 西南交大信息学院计算机,和红杰 - 信息学院 - 西南交通大学
  8. Paper Reading:A Survey of Deep Learning-based Object Detection
  9. Python自动化办公 - 对Excel表格的操作(openpyxl的基本使用)
  10. Aspose工具实现word和ppt转pdf功能及遇到的一些问题