您好,欢迎来到外链网!
当前位置:外链网 » 站长资讯 » 专业问答 » 文章详细 订阅RssFeed

混淆矩阵分类精度评价与提高,误差矩阵和混淆矩阵

来源:互联网 浏览:65次 时间:2023-04-08

主要运用在图像分割当中的miou指标–(unet网络)
混淆矩阵
在图像精度评价中,主要用于比较分类结果和实际测得值,可以把分类结果的精度显示在一个混淆矩阵里面,如下,对角线为正确分类的点。

这里顺便讲下ROC与PRC、F1

以上两个评估指标也用于验证集的评估,且两者比较相似,可以进行转换
ROC曲线

纵坐标为TPR(召回率),横坐标为FPR
AUC面积
为了计算 ROC 曲线上的点,我们可以使用不同的分类阈值多次评估逻辑回归模型,但这样做效率非常低。幸运的是,有一种基于排序的高效算法可以为我们提供此类信息,这种算法称为曲线下面积(Area Under Curve)。

比较有意思的是,如果我们连接对角线,它的面积正好是 0.5。对角线的实际含义是:随机判断响应与不响应,正负样本覆盖率应该都是 50%,表示随机效果。 ROC 曲线越陡越好,所以理想值就是 1,一个正方形,而最差的随机判断都有 0.5,所以一般 AUC 的值是介于 0.5 到 1 之间的。

AUC 的一般判断标准

0.5 - 0.7: 效果较低,但用于预测股票已经很不错了

0.7 - 0.85: 效果一般

0.85 - 0.95: 效果很好

0.95 - 1: 效果非常好,但一般不太可能
原文链接:https://blog.csdn.net/weixin_43612023/article/details/103191708
如何判断 ROC 曲线的好坏?

TPR 越高,同时 FPR 越低(即 ROC 曲线越陡)即左上角越凸越好,那么模型的性能就越好。

PRC曲线

prc曲线是右上越凸越好
ROC曲线的PRC曲线的区别和联系
ROC适用于正负样本不太平衡的数据集,因为它的变化不大,比较稳定,作为评估的比较多,因为正常数据集基本都不平衡。PRC曲线主要当ROC曲线下面积差不多时,用来比较不同分类器的好坏。
各指标之间的关系为


言归正传,对于混淆矩阵对角线越大对应召回率越大
代码为:

# 设标签宽W,长Hdef fast_hist(a, b, n): #--------------------------------------------------------------------------------# # a是转化成一维数组的标签,形状(H×W,);b是转化成一维数组的预测结果,形状(H×W,) #--------------------------------------------------------------------------------# k = (a >= 0) & (a < n) #--------------------------------------------------------------------------------# # np.bincount计算了从0到n**2-1这n**2个数中每个数出现的次数,返回值形状(n, n) # 返回中,写对角线上的为分类正确的像素点 #--------------------------------------------------------------------------------# return np.bincount(n * a[k].astype(int) + b[k], minlength=n ** 2).reshape(n, n) def per_class_iu(hist): return np.diag(hist) / np.maximum((hist.sum(1) + hist.sum(0) - np.diag(hist)), 1) def per_class_PA(hist): return np.diag(hist) / np.maximum(hist.sum(1), 1) def compute_mIoU(gt_dir, pred_dir, png_name_list, num_classes, name_classes): print('Num classes', num_classes) #-----------------------------------------# # 创建一个全是0的矩阵,是一个混淆矩阵 #-----------------------------------------# hist = np.zeros((num_classes, num_classes)) #------------------------------------------------# # 获得验证集标签路径列表,方便直接读取 # 获得验证集图像分割结果路径列表,方便直接读取 #------------------------------------------------# gt_imgs = [join(gt_dir, x + ".png") for x in png_name_list] pred_imgs = [join(pred_dir, x + ".png") for x in png_name_list] #------------------------------------------------# # 读取每一个(图片-标签)对 #------------------------------------------------# for ind in range(len(gt_imgs)): #------------------------------------------------# # 读取一张图像分割结果,转化成numpy数组 #------------------------------------------------# pred = np.array(Image.open(pred_imgs[ind])) #------------------------------------------------# # 读取一张对应的标签,转化成numpy数组 #------------------------------------------------# label = np.array(Image.open(gt_imgs[ind])) # 如果图像分割结果与标签的大小不一样,这张图片就不计算 if len(label.flatten()) != len(pred.flatten()): print( 'Skipping: len(gt) = {:d}, len(pred) = {:d}, {:s}, {:s}'.format( 香港vps len(label.flatten()), len(pred.flatten()), gt_imgs[ind], pred_imgs[ind])) continue #------------------------------------------------# # 对一张图片计算21×21的hist矩阵,并累加 #------------------------------------------------# hist += fast_hist(label.flatten(), pred.flatten(),num_classes) # 每计算10张就输出一下目前已计算的图片中所有类别平均的mIoU值 if ind > 0 and ind % 10 == 0: print('{:d} / {:d}: mIou-{:0.2f}; mPA-{:0.2f}'.format(ind, len(gt_imgs), 100 * np.nanmean(per_class_iu(hist)), 100 * np.nanmean(per_class_PA(hist)))) #------------------------------------------------# # 计算所有验证集图片的逐类别mIoU值 #------------------------------------------------# mIoUs = per_class_iu(hist) mPA = per_class_PA(hist) #------------------------------------------------# # 逐类别输出一下mIoU值 #------------------------------------------------# for ind_class in range(num_classes): print('===>' + name_classes[ind_class] + ':\tmIou-' + str(round(mIoUs[ind_class] * 100, 2)) + '; mPA-' + str(round(mPA[ind_class] * 100, 2))) #-----------------------------------------------------------------# # 在所有验证集图像上求所有类别平均的mIoU值,计算时忽略NaN值 #-----------------------------------------------------------------# print('===> mIoU: ' + str(round(np.nanmean(mIoUs) * 100, 2)) + '; mPA: ' + str(round(np.nanmean(mPA) * 100, 2))) return mIoUs