验证指标

semantic segmentation

Posted by DYC on September 26, 2023

指标

二分类指标

True Positives,TP:预测为正,实际为正,预测为正样本是对的

False Positives,FP:预测为正,实际为负,预测为正样本是错的

True Negatives,TN:预测为负,实际为负,预测为负样本是对的

False Negatives,FN:预测为负,实际为正,预测为负样本是错的

Accuracy

即对于给定的数据,分类正确的样本数占总样本数的比例

image-20230926141312261

1
2
3
4
5
6
def calculate_accuracy(y_true, y_pred):
    correct = np.sum(y_true == y_pred)
    total = len(y_true)
    accuracy = correct / total
    return accuracy

y_true 是真实类别标签的数组,y_pred 是预测的类别标签的数组。函数 calculate_accuracy 统计了预测正确的样本数量,并将其除以总样本数,以得到准确率

Recall

分类正确的正样本个数占实际正样本个数的比例。以真实为正例作为基准:真实值的正例中,被判断出来为正例的概率是多少

image-20230926142226473

1
2
3
4
5
6
def calculate_recall(y_true, y_pred):
    true_positives = np.sum(np.logical_and(y_true == 1, y_pred == 1))
    false_negatives = np.sum(np.logical_and(y_true == 1, y_pred == 0))
    recall = true_positives / (true_positives + false_negatives)
    return recall

F1

F1指标是一个综合考虑精确率和召回率的评估指标,主要用于评估二分类任务的模型性能。它结合了精确率和召回率,能够更全面地评估模型在正样本和负样本上的分类能力

F1指标通过将精确率和召回率综合考虑,达到了平衡的效果。F1值的计算公式如下: F1 = 2 * (Precision * Recall) / (Precision + Recall)

F1值的取值范围在0到1之间,数值越高表示模型性能越好。当精确率和召回率同时较高时,F1值也会相对较高。

需要注意的是,F1指标在数据不平衡的情况下更加稳健,因为它将精确率和召回率进行综合考虑,而不仅仅依赖于其中之一。对于具有不平衡类别的数据集,F1指标是一个更合适的评估指标。

1
2
3
4
5
6
def calculate_f1_score(y_true, y_pred):
    precision = calculate_precision(y_true, y_pred)
    recall = calculate_recall(y_true, y_pred)
    f1_score = 2 * (precision * recall) / (precision + recall)
    return f1_score

ROC

ROC曲线(Receiver Operating Characteristic Curve)是一种用于评估分类模型性能的指标,特别适用于二分类问题。ROC曲线通过绘制不同阈值下的真阳性率(True Positive Rate,TPR)和假阳性率(False Positive Rate,FPR),来展示模型在不同阈值下的分类能力和抗干扰能力。

在理解ROC曲线之前,先了解以下几个概念:

  • 真阳性率(TPR):也称为召回率、灵敏度(Sensitivity),表示被正确预测为正样本的比例。计算公式为 TPR = TP / (TP + FN),其中 TP 表示真正样本数量,FN 表示假负样本数量。
  • 假阳性率(FPR):表示被错误预测为正样本的比例。计算公式为 FPR = FP / (FP + TN),其中 FP 表示假正样本数量,TN 表示真负样本数量。
  • 阈值(Threshold):分类模型根据某一概率值或得分值决定样本的分类标签时,设置的一个判断边界。

ROC曲线是将真阳性率(TPR)作为纵轴,假阳性率(FPR)作为横轴,绘制得到的曲线。对于一个完美的分类器,ROC曲线会经过左上角(0, 1),表示在任何阈值下都能实现100%的真阳性率和0%的假阳性率。

在绘制ROC曲线时,有四个关键点需要特别关注:

  1. 左上角(0,1)点:该点表示模型在所有阈值下都能实现100%的真阳性率和0%的假阳性率,即完美分类器的状态。
  2. 右上角(1,1)点:该点表示模型在所有阈值下都将所有样本都预测为正样本,即将所有负样本都错误地预测为正样本。
  3. 左下角(0,0)点:该点表示模型在所有阈值下都将所有样本都预测为负样本,即将所有正样本都错误地预测为负样本。
  4. ROC曲线上的每个点:这些点代表了不同阈值下模型的真阳性率和假阳性率。通过绘制这些点并连接它们,形成了ROC曲线。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc

# 假设有真实标签和预测概率
y_true = np.array([0, 0, 1, 1, 1])
y_score = np.array([0.1, 0.4, 0.35, 0.8, 0.9])

# 计算真阳性率(TPR)、假阳性率(FPR)和阈值
fpr, tpr, thresholds = roc_curve(y_true, y_score)

# 计算AUC
roc_auc = auc(fpr, tpr)

# 绘制ROC曲线
plt.figure()
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic')
plt.legend(loc="lower right")
plt.show()

假设有真实标签 y_true 和对应的预测概率 y_score。通过调用 roc_curve 函数计算真阳性率、假阳性率和阈值,然后使用 auc 函数计算AUC值。最后,使用Matplotlib库绘制ROC曲线,使用自己的数据替换 y_truey_score,然后运行代码来绘制相应的ROC曲线

AUC

AUC(Area Under the Curve)是ROC曲线下的面积,常用于评估分类模型的性能。AUC值的范围在0到1之间,越接近1表示模型的性能越好。

AUC的解释如下:

  • AUC为0.5时,表示模型的分类性能等同于随机猜测,即模型没有区分能力。
  • AUC大于0.5且接近1时,表示模型具有较好的分类能力,能够有效地区分正例和负例。
  • AUC等于1时,表示模型完美地进行了分类,没有任何错误。

通常情况下,AUC值越大,模型的分类能力越强。因此,AUC是一种常用的模型评估指标,它对分类器的性能进行了综合考量,不受阈值选择的影响。

需要注意的是,AUC只适用于二分类问题,无法直接应用于多分类问题。对于多分类问题,可以使用One-vs-Rest或One-vs-One策略来计算每个类别的AUC值,并进行综合评估。

1
2
3
4
5
6
7
8
9
10
11
12
import numpy as np
from sklearn.metrics import roc_auc_score

# 假设有真实标签和预测概率
y_true = np.array([0, 0, 1, 1, 1])
y_score = np.array([0.1, 0.4, 0.35, 0.8, 0.9])

# 计算AUC
auc = roc_auc_score(y_true, y_score)

print("AUC:", auc)

P-R曲线

通常用于不平衡数据集的二分类问题。

P-R曲线描述了模型在不同阈值下的精度(Precision)和召回率(Recall)之间的关系。其中,精度表示被模型预测为正样本的数据中有多少是真正的正样本;召回率表示实际为正样本的数据中有多少被模型正确地预测为正样本。

与ROC曲线类似,P-R曲线上的点对应于分类器在不同阈值下的性能,但是,P-R曲线在不平衡数据集上更具有代表性。

与AUC类似,P-R曲线也可以通过计算曲线下的面积来评估分类器的性能,即平均精度均值(Average Precision, AP)。AP值越大,模型的性能越好。

在绘制P-R曲线时,需要先计算不同阈值下的精度和召回率,并按照召回率从高到低排序。然后,将精度和召回率分别作为横纵坐标绘制曲线。

需要注意的是,当正例样本数量很少时,P-R曲线更容易受到噪声的影响,因此需要谨慎评估模型性能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import precision_recall_curve

# 假设有真实标签和预测概率
y_true = np.array([0, 0, 1, 1, 1])
y_score = np.array([0.1, 0.4, 0.35, 0.8, 0.9])

# 计算精度、召回率和阈值
precision, recall, thresholds = precision_recall_curve(y_true, y_score)

# 绘制P-R曲线
plt.plot(recall, precision)
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('P-R Curve')
plt.show()

上面代码假设有真实标签 y_true 和对应的预测概率 y_score。通过调用 precision_recall_curve 函数,传入真实标签和预测概率,即可计算得到不同阈值下的精度和召回率

AP

AP(Average Precision)是用于评估分类模型在不同阈值下的精确度-召回率表现的指标,常用于不平衡数据集和信息检索领域。

AP通过计算精确度(Precision)和召回率(Recall)之间的曲线下的面积来衡量模型的性能。具体而言,对于每个召回率值,找到对应的最大精确度值,并将这些点的面积进行累加,得到AP值。

AP值越大,表示分类模型在不同阈值下的性能越好。一般而言,AP的范围在0到1之间,越接近1表示模型性能越好。

在计算AP之前,需要先计算出精确度和召回率的值。可以使用precision_recall_curve函数计算精确度和召回率,然后使用average_precision_score函数计算AP值。

1
2
3
4
5
6
7
8
9
10
11
12
import numpy as np
from sklearn.metrics import average_precision_score

# 假设有真实标签和预测概率
y_true = np.array([0, 0, 1, 1, 1])
y_score = np.array([0.1, 0.4, 0.35, 0.8, 0.9])

# 计算AP
ap = average_precision_score(y_true, y_score)

print("AP:", ap)

多分类指标

混淆矩阵

如果我们想知道类别之间相互误分的情况,查看是否有特定的类别相互混淆,就可以用混淆矩阵画出分类的详细预测结果。对于包含多个类别的任务,混淆矩阵很清晰地反映了各类别之间的错分概率。

1
2
3
4
5
6
7
8
9
10
11
12
import numpy as np
from sklearn.metrics import confusion_matrix

# 假设有真实标签和预测标签
y_true = np.array([0, 1, 2, 0, 1, 2])
y_pred = np.array([0, 0, 2, 0, 2, 1])

# 计算混淆矩阵
cm = confusion_matrix(y_true, y_pred)
print("Confusion Matrix:")
print(cm)

macro 指标

它基于每个类别的评估指标,对所有类别计算平均值。

具体来说,对于每个类别,我们计算出精确度、召回率和 F1 值(或其他分类指标),然后对所有类别的指标进行求平均。每个类别的权重都是一样的,无论该类别的样本数量多少。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from sklearn.metrics import precision_score, recall_score, f1_score

# 假设有真实标签和预测标签
y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 0, 2, 0, 2, 1]

# 计算每个类别的精确度、召回率和 F1 值
precision = precision_score(y_true, y_pred, average='macro')
recall = recall_score(y_true, y_pred, average='macro')
f1 = f1_score(y_true, y_pred, average='macro')

print("Precision:", precision)
print("Recall:", recall)
print("F1 score:", f1)

miou

一种用于评估图像分割任务性能的指标,也称为 Jaccard 系数。而 mIoU(mean Intersection over Union)则是计算多个类别的 IoU 并取平均值得到的结果。

在图像分割任务中,我们通常将预测结果与真实标签进行比较。IoU 衡量的是预测结果和真实标签之间的重叠程度。它通过计算预测结果和真实标签的交集面积与并集面积的比值来进行度量。计算公式如下:

IoU = 交集面积 / 并集面积

其中,交集面积表示预测结果和真实标签重叠的区域的面积,而并集面积表示预测结果和真实标签的总区域的面积。

iou是二分类时调用,miou是多分类时调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def calculate_iou(pred_mask, true_mask):
    intersection = np.logical_and(pred_mask, true_mask)
    union = np.logical_or(pred_mask, true_mask)
    iou = np.sum(intersection) / np.sum(union)
    return iou

def calculate_miou(pred_masks, true_masks):
    num_classes = len(pred_masks)
    miou_sum = 0.0

    for class_idx in range(num_classes):
        pred_mask = pred_masks[class_idx]
        true_mask = true_masks[class_idx]
        iou = calculate_iou(pred_mask, true_mask)
        miou_sum += iou

    miou = miou_sum / num_classes
    return miou

参考