真正例(True Positive):预报有雨 实况有雨
真反例(True Negative):预报无雨 实况无雨
假正例(False Positive):预报有雨 实况无雨(纳伪,第二类错误)
假反例(False Negative):预报无雨 实况有雨(弃真,第一类错误)
晴雨预报的混淆矩阵
直观可见,当混淆矩阵对角线数值越大时,模型总体性能越好。将其定量化,将矩阵中TP与TN的代数和除以矩阵所有元素的代数和称之为精准率(Accuracy)。
将FN与FP的代数和除以矩阵所有元素的代数和称之为错误率(Error Rate)。
从定义式可知,精准率和错误率的大小受到多个变量的约束,难以精准契合实际问题需要,需要引入细分指标。
1.查准率与空报率
查准率又可称为击中率、准确率(Precision,为了方便记忆可记英文,以免与精准率混淆),其定义为真正例在预报正例中所在的占比。查准率是相对预报而言的,数值越大表示正例出现的可能性越大,预报可信度越高。(文末降水查准率为259/(259+235)=0.524)
空报率与查准率有关联,被定义为假正例在所有预报正例中所在的占比,数值越大表示狼来了的可能性越大,由定义可知,空报率=1-击中率。
漏报率与查全率有关联,被定义为假反例在所有实况为正例中的所在占比,可推知,漏报率=1-查全率。
查准率和查全率针对同一个模型时往往是一对矛盾的评价指标。查准率高时,查全率往往偏低;而查全率高时,查准率往往偏低。可以想象,在晴雨预报中为了使得查全率偏高,可以通过增加预报有雨的次数来实现,极端的,预报未来每天都有雨,查全率为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() #执行可视化
▼ 点击成为社区注册会员 「在看」一下,一起PY