用 Python 测算气象预报的空报率与漏报率

空报率与漏报率是气象行业中常用来评估预报模型性能的指标。评估指标的不同实质上反映了任务需求的不同,因此不同的指标在对同一预报模型进行评估时将会得到不同的结果。这就意味着预报模型的‘好坏’往往是相对的,好的模型不仅取决于数据和算法本身,还取决于是否契合实际问题需要。那么何时使用空报率,又何时使用漏报率呢?
本篇将通过混淆矩阵逐步带大家了解精准度、查准率等多种评估指标,以此深入认识空报率与漏报率的含义,并提供场景实例让读者体会评估指标如何反映实际任务需求。

一、混淆矩阵
混淆矩阵也称误差矩阵,经常被用来对分类问题进行误差分析。 为便于理解,我们以二分类预报——晴雨预报为例,将其所有可能出现的预报情形与实况结果两两进行交叉组合,得到如下四个基础项。
混淆矩阵的四个基础项
真正例(True Positive):预报有雨 实况有雨	
真反例(True Negative):预报无雨 实况无雨	
假正例(False Positive):预报有雨 实况无雨(纳伪,第二类错误)	
假反例(False Negative):预报无雨 实况有雨(弃真,第一类错误)
将上述各项的计数以矩阵的方式呈现(其实就是一张表格啦),就得到了该预报模型的混淆矩阵。矩阵中的每一列代表预测类别,每列的数值和代表预报该类别的总次数;而每一行代表实况观测的类别,每行的数值和代表了该类别实况中出现的总次数。

晴雨预报的混淆矩阵

640?wx_fmt=png

直观可见,当混淆矩阵对角线数值越大时,模型总体性能越好。将其定量化,将矩阵中TP与TN的代数和除以矩阵所有元素的代数和称之为精准率(Accuracy)。

640?wx_fmt=png

将FN与FP的代数和除以矩阵所有元素的代数和称之为错误率(Error Rate)。

640?wx_fmt=png

二、细分评价指标

从定义式可知,精准率和错误率的大小受到多个变量的约束,难以精准契合实际问题需要,需要引入细分指标。

1.查准率与空报率

查准率又可称为击中率、准确率(Precision,为了方便记忆可记英文,以免与精准率混淆),其定义为真正例在预报正例中所在的占比。查准率是相对预报而言的,数值越大表示正例出现的可能性越大,预报可信度越高。(文末降水查准率为259/(259+235)=0.524)

640?wx_fmt=png

空报率与查准率有关联,被定义为假正例在所有预报正例中所在的占比,数值越大表示狼来了的可能性越大,由定义可知,空报率=1-击中率。

2.查全率与漏报率
查全率又可称为召回率(recall),其定义为真正例在所有实况为正例中的所在占比。 查全率是相对实况而言的,数值越大表示越疏而不漏,出现漏网之鱼的可能性越小。(文末降水查全率为259/(259+242)=0.517)

640?wx_fmt=png

漏报率与查全率有关联,被定义为假反例在所有实况为正例中的所在占比,可推知,漏报率=1-查全率。

三、 场景实例

640?wx_fmt=png


查准率和查全率针对同一个模型时往往是一对矛盾的评价指标。查准率高时,查全率往往偏低;而查全率高时,查准率往往偏低。可以想象,在晴雨预报中为了使得查全率偏高,可以通过增加预报有雨的次数来实现,极端的,预报未来每天都有雨,查全率为100%,但空报率极高,查准率极低;而为了使查准率偏高,可以通过只预报有把握的降水,诸如信号明显的系统性大雨过程,这么做势必会减少预报次数,极端的,当只预报了一次降水且正确时,查准率为100%,但查全率则极低,许多小雨和中雨过程都漏报了。

附、混淆矩阵的可视化
import random
import numpy as np
from sklearn.metrics import confusion_matrix #导入混淆矩阵模块
import matplotlib.pyplot as plt #导入作图模块
label_list=['rain','sun']
ob=random.choices(label_list,k=1000)  #随机生成K个观测值
fct=random.choices(label_list,k=1000)  #随机生成K个预测值
cm = confusion_matrix(ob, fct) #混淆矩阵
plt.matshow(cm, cmap=plt.cm.Blues) #画混淆矩阵图
plt.colorbar() #颜色标签
for x in range(len(cm)): #数据标签 每个击中点中的数值
  for y in range(len(cm)):
    plt.annotate(cm[x,y], xy=(x, y), horizontalalignment='center', verticalalignment='center')#水平和垂直都以中心对齐
xlocations = np.array(range(len(label_list)))
plt.xticks(xlocations, label_list) #添加类别标注
plt.yticks(xlocations, label_list) #添加类别标注
plt.ylabel('True label') #添加坐标轴标签
plt.xlabel('Predicted label') #添加坐标轴标签
plt.show() #执行可视化

代码生成图片

640?wx_fmt=jpeg

640?wx_fmt=jpeg

▼ 点击成为社区注册会员          「在看」一下,一起PY

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值