机器学习笔记 - IOU、准确率、召回率、F分数

一、什么是交并比?

1、交并比(IOU)概述

        交并比(Intersection over Union) 是一种评估指标,用于衡量目标检测器在特定数据集上的准确性。任何提供预测边界框作为输出的算法都可以使用 IoU 进行评估。

        只要有测试集手工标记的边界框和我们模型预测的边界框。就可以计算交并比。

  • R1:真实的边界框矩形的范围;
  • R2:预测出来的矩形的范围;
  • Rol:R1和R2重合的范围。

        如下图所示

        IOU值体现了单个对象预测的准确性。 一般来说,如果 IOU 分数 > 0.5,则认为它是一个很好的注释。不过,这还是因项目而异。

2、计算交并比(IOU)

        参考代码

import numpy as np

# get IoU overlap ratio
def iou(a, b):
	# get area of a
    area_a = (a[2] - a[0]) * (a[3] - a[1])
	# get area of b
    area_b = (b[2] - b[0]) * (b[3] - b[1])

	# get left top x of IoU
    iou_x1 = np.maximum(a[0], b[0])
	# get left top y of IoU
    iou_y1 = np.maximum(a[1], b[1])
	# get right bottom of IoU
    iou_x2 = np.minimum(a[2], b[2])
	# get right bottom of IoU
    iou_y2 = np.minimum(a[3], b[3])

	# get width of IoU
    iou_w = iou_x2 - iou_x1
	# get height of IoU
    iou_h = iou_y2 - iou_y1

	# get area of IoU
    area_iou = iou_w * iou_h
	# get overlap ratio between IoU and all area
    iou = area_iou / (area_a + area_b - area_iou)

    return iou

# [x1, y1, x2, y2]
a = np.array((50, 50, 150, 150), dtype=np.float32)

b = np.array((60, 60, 170, 160), dtype=np.float32)

print(iou(a, b))

        计算如下两个矩形的交并比

a = np.array((50, 50, 150, 150), dtype=np.float32)
b = np.array((60, 60, 170, 160), dtype=np.float32)

        输出

0.627907

        可视化 

 二、评估模型整体的准确性

        上面说IOU是单个对象预测的准确性评价,但是对于整体模型或者说任务,怎么评价其识别的好坏呢?这就引出了下面的F1分数/F2分数/F3分数等。

1、基础概念

(1)TP/TN/FN/FP

        在评估模型在指定数据集上的得分之前,让我们先了解一些术语:

        True Positive (TP):正确绘制的 IOU 分数 > 0.5 的注释。

        True Negative (TN): 当不需要注释时,不绘制注释。

        False Negative (FN): 当需要注释时,不绘制注释。

        False Positive (FP): 这些是错误绘制的注释,其 IOU 分数 <0.5。

        可以从分类的角度来对比理解下:

  • TP:被模型预测为好瓜的好瓜(是真正的好瓜,而且也被模型预测为好瓜)
  • TN:被模型预测为坏瓜的坏瓜(是真正的坏瓜,而且也被模型预测为坏瓜)
  • FN:被模型预测为坏瓜的好瓜(瓜是真正的好瓜,但是被模型预测为了坏瓜)
  • FP:被模型预测为好瓜的坏瓜(瓜是真正的坏瓜,但是被模型预测为了好瓜)

(2)准确率(Accuary)

        使用准确度方法来衡量我们的模型的性能。准确性是衡量任务性能最直观的方法,因为它只是正确绘制的注释与总预期注释的比率。

        虽然准确性很直观也简单,但它也是最缺乏洞察力的。在大多数现实生活中,存在严重的类不平衡,并且没有考虑 FN 和 FP,这可能导致偏见或错误结论。 

(3)精确度(Precision)

        精度是正确绘制的注释与绘制的注释总数的比率。

(4)召回率(Recall

        召回率是正确绘制的注释与注释总数的比率。

 2、什么是F-score?

(1)F分数概述

        F-score(也叫F-measure)常用于信息检索领域,用于衡量搜索、文档分类和查询分类性能。F-score 也用于机器学习。F-score 已广泛用于自然语言处理文献,例如命名实体识别和分词的评估。

        F分数使用精度和召回率来衡量测试的准确性。

        F-score的一般公式如下:

        对于F1分数,β=1;对于F2分数, β=2;依此类推。

        sklearn.metrics提供了测量fbeta_score分数的函数。

(2)F1分数

        F1分数是 Precision 和 Recall 的调和平均值,可以更好地衡量不正确的注释情况。

# calculate the f1-measure
from sklearn.metrics import fbeta_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
# perfect precision, 50% recall
y_true = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
y_pred = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
p = precision_score(y_true, y_pred)
r = recall_score(y_true, y_pred)
f = fbeta_score(y_true, y_pred, beta=1.0)
print('Result: p=%.3f, r=%.3f, f=%.3f' % (p, r, f))

(3)F2分数

        F2分数背后的直觉是它对召回率的权重高于精度。

# calculate the f2-measure
from sklearn.metrics import fbeta_score
from sklearn.metrics import f1_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
# perfect precision, 50% recall
y_true = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
y_pred = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
p = precision_score(y_true, y_pred)
r = recall_score(y_true, y_pred)
f = fbeta_score(y_true, y_pred, beta=2.0)
print('Result: p=%.3f, r=%.3f, f=%.3f' % (p, r, f))

猜你喜欢

转载自blog.csdn.net/bashendixie5/article/details/123738525
今日推荐