【图像分类】【深度学习】图像分类评价指标

news2025/5/15 23:54:01

【图像分类】【深度学习】图像分类评价指标

文章目录

  • 【图像分类】【深度学习】图像分类评价指标
  • 前言
  • 二分类评价指标
    • Accuracy(准确率/精度)
    • Precision(精确率/查准率)
    • Recall(召回率/查全率)
    • F1-Score
    • AUC-ROC曲线(Area Under the Curv-Receiver Operating Characteristic Curve)
    • 二分类的案例
  • 多分类评价指标
    • Accuracy(准确率/精度)
    • macro指标
    • micro指标
    • Kappa指标(科恩的卡帕系数)
    • 多分类的案例
  • 总结


前言

随着深度学习的发展,特别是卷积神经网络(CNNs)在图像领域的成功应用,开发出了许多用于图像分类的复杂模型。然而,为了确保这些模型能够在实际应用中有效工作,并能与其它模型进行比较,需要一套标准的评价指标来衡量模型性能,了解模型的表现,并且根据具体的应用指导模型改进。

评价指标通常涵盖多个方面,从不同维度评估模型的优劣,从而让模型构建者能够全面了解模型的性能。同时,依据任务的具体偏向和要求,按照重点关注的指标支持对模型进行有效的取舍和优化,对于提升模型性能和适用性具有重要意义。

常用的分类模型评价指标包括准确率(Accuracy)、精确率(Precision)、召回率(Recall)以及F1分数(F1-Score)。通过综合分析这些指标,不仅可以更精确地衡量模型的表现,还能根据实际应用场景的需求,做出更加明智的决策。这样无论是提升模型的整体性能,还是针对特定需求优化模型,都变得更加有据可依。

【图像分类】【深度学习】系列学习文章目录


二分类评价指标

在探究不同评价指标前,先定义计算指标的基本值:

  • True Positives,TP: 实际为正例,且被预测为正例的样本数;
  • False Positives,FP: 实际为负例,但被预测为正例的样本数;
  • True Negatives,TN: 实际为正例,但被预测为反例的样本数;
  • False Negatives,FN: 实际为负例,但被预测为反例的样本数。

这些基本值有点难理解,其实这里分开理解就好了:第二项Positives/Negatives预测器对样本的预测,即我觉得是正例还是反例;第一项True/False是根据真实标签对预测结果作出的判断,预测对了还是错了。

Accuracy(准确率/精度)

对于给定的数据,预测正确的样本数占总样本数的比例:
A c c u r a c y = T P + T N T P + T N + F P + F N Accuracy = \frac{{TP + TN}}{{TP + TN + FP + FN}} Accuracy=TP+TN+FP+FNTP+TN
博主感觉很多分类网络几乎主要关注Accuracy这个指标。

缺点:在数据集极其不平衡时,如正负样本数目差别很大,正样本999个,负样本1个,直接把所有的样本都预测为正, 准确率为99.9 %,但是此分类模型完全无意义。

Precision(精确率/查准率)

分类正确的正样本个数占所有预测判定为正样本个数的比例:
P r e c i s i o n = T P T P + F P Precision = \frac{{TP}}{{TP + FP}} Precision=TP+FPTP
通俗来讲,就是在预测器判定为正样本的结果中有多少真正的正样本。

Recall(召回率/查全率)

分类正确的正样本个数占实际正样本个数的比例:
R e c a l l = T P T P + F N Recall= \frac{{TP}}{{TP + FN}} Recall=TP+FNTP
通俗的讲,就是在所有样本中有多少正样本被找到。

F1-Score

精确率Precision和召回率Recall的调和平均数,是综合考虑精确率与召回率的一种指标:
F 1 _ S c o r e = 2 1 P r e c i s i o n + 1 R e c a l l = 2 × P r e c i s i o n × R e c a l l P r e c i s i o n + R e c a l l = 2 T P 2 T P + F P + F N F1\_Score = \frac{2}{{\frac{1}{{Precision}} + \frac{1}{{Recall}}}} = \frac{{2 \times Precision \times Recall}}{{Precision + Recall}} = \frac{{2TP}}{{2TP + FP + FN}} F1_Score=Precision1+Recall12=Precision+Recall2×Precision×Recall=2TP+FP+FN2TP
认为召回率和精度同等重要,最大为 1,最小为 0。

当类别不均衡,F1-Score是比Accuracy更好的指标。

AUC-ROC曲线(Area Under the Curv-Receiver Operating Characteristic Curve)

ROC曲线以假正率(False Positive Rate, FPR)为横轴,真正率(True Positive Rate, TPR)为纵轴。通过绘制TPR与FPR在不同阈值下的变化来实现这一点。

FPR: 指在所有实际为负类的样本中,被错误地识别为正类的比例:
F P R = F P N = F P F P + T N FPR = \frac{{FP}}{N} = \frac{{FP}}{{FP + TN}} FPR=NFP=FP+TNFP
TPR: 即召回率,指在所有实际为正类的样本中,被正确识别出来的比例:
T P R = T P P = T P T P + F N TPR = \frac{{TP}}{P} = \frac{{TP}}{{TP+ FN}} TPR=PTP=TP+FNTP
ROC 曲线有四个关键点:

  • (0,0)点:FPR=TPR=0,表示分类器预测所有的样本都为负样本;
  • (1,1)点:FPR=TPR=1,表示分类器预测所有的样本都为正样本;
  • (0,1)点:FPR=0,TPR=1,此时FN=0且FP=0,表示最优分类器,所有的样本都被正确分类;
  • (1,0)点:FPR=1,TPR=0,此时TP=0且TN=0,表示最差分类器,有所得样本都被错误分类。

ROC 曲线越接近左上角,表示该分类器的性能越好:若一个分类器的ROC曲线被另一个分类器的曲线完全“包住”,则可断言后者的性能优于前者;若两个学习器的 ROC 曲线发生交叉,则难以断言两者孰优孰劣,此时需要比较ROC曲线下的面积AUC(Area Under ROC Curve)。
AUC 的意义: 分类器将正样本预测为正例的概率TPR大于将负样本预测为正例的概率FPR。

当一个分类器倾向于给予正样本比负样本更高的预测概率时,说明模型在某种程度上捕捉到了数据中正样本和负样本之间的差异特征。这种特性使得模型在进行二分类任务时更为有效。

根据AUC的意义推导出其计算公式:
A U C = ∑ i = 0 P ∑ j = 0 N I ( P i , N j ) P × N AUC = \frac{{\sum\limits_{{\rm{i = 0}}}^P {\sum\limits_{j = 0}^N {I\left( {{P_i},{N_j}} \right)} } }}{{P \times N}} AUC=P×Ni=0Pj=0NI(Pi,Nj)
P P P为正样本数量, N N N为负样本数量。 P i P_i Pi为正样本预测得分,即将正样本预测为正例的概率; N j N_j Nj为负样本预测得分,即将负样本预测为正例的概率。其中:
I ( P i , N j ) = { 1 0.5 0 P i > N j P i = N j P i < N j } I\left( {{P_i},{N_j}} \right) = \left\{ {\begin{array}{ccc} 1\\ {0.5}\\ 0 \end{array}\begin{array}{ccc} {{P_i} > {N_j}}\\ {{P_i} = {N_j}}\\ {{P_i} < {N_j}} \end{array}} \right\} I(Pi,Nj)= 10.50Pi>NjPi=NjPi<Nj
可以理解为区分正类和负类的能力,AUC 的有效范围是 ( 0.5 , 1 ] (0.5,1] (0.5,1] ,当AUC越大,表示区分正负类的能力越强。

  • AUC=1:在任何阈值下分类器全部识别所有类别,完美分类器(几乎不可能实现);
  • 0.5<AUC<1:优于随机预测,这也是实际作用中大部分分类器所处的状态;
  • AUC=0.5:相当于随机预测,此时分类器不可用;
  • AUC<0.5:总是比随机预测更差(二分类总不能比随机差);

AUC对正负样本不均衡问题不敏感,当测试集中的正负样本比例分布变化时,特别适用于评估二分类器的性能。

二分类的案例

现在有一个模型对人的体检指标进行是否有肿瘤的判断,这很显然是一个二分类的任务,结果只有是和否两种。

样本ID样本标签预测概率
10.95
20.86
30.70
40.65
50.55
60.53
70.52
80.43
90.42
100.35

当阈值为0.5时,即大于0.5预测为正,小于0.5预测为负。预测标签的情况如下表所示:

样本ID样本标签预测概率预测标签
10.95
20.86
30.70
40.65
50.55
60.53
70.52
80.43
90.42
100.35

上述的案例表或许有点绕,利用混淆矩阵来表达上述模型判断的结构较为直观:

预测值正例预测值负例
真实值正例41
真实值负例32

计算出对应的评价指标:
A c c u r a c y = 4 + 2 4 + 1 + 3 + 2 = 0.6 Accuracy = \frac{{4 + 2}}{{4 + 1 + 3 + 2}}=0.6 Accuracy=4+1+3+24+2=0.6
P r e c i s i o n = 4 4 + 3 ≈ 0.57 Precision = \frac{{4}}{{4+ 3}}\approx 0.57 Precision=4+340.57
R e c a l l = T P R = 4 4 + 1 = 0.8 Recall = TPR = \frac{4}{{4 + 1}}=0.8 Recall=TPR=4+14=0.8
F 1 _ S c o r e = 8 8 + 3 + 1 ≈ 0.67 F1\_Score = \frac{{8}}{{8 + 3 + 1}}\approx 0.67 F1_Score=8+3+180.67
F P R = 3 3 + 2 = 0.6 FPR = \frac{{3}}{{3 + 2}}=0.6 FPR=3+23=0.6

阈值为0.5时ROC曲线的点为 ( 0.6 , 0.8 ) (0.6,0.8) (0.6,0.8)
那么阈值分别是1.0,0.75, 0.5,0.25,0.0时,预测标签的情况如下表所示:

样本ID样本标签预测概率预测标签(1.0)预测标签(0.75)预测标签(0.5)预测标签(0.25)预测标签(0.0)
10.95
20.86
30.70
40.65
50.55
60.53
70.52
80.43
90.42
100.35

混淆矩阵来表达上述模型判断:

预测值正例预测值负例
真实值正例0/2/4/5/55/3/1/0/0
真实值负例0/0/3/5/55/4/2/0/0

因此,ROC曲线的点分别是 ( 0.0 , 0.0 ) (0.0,0.0) (0.0,0.0) ( 0.0 , 0.4 ) (0.0,0.4) (0.0,0.4) ( 0.6 , 0.8 ) (0.6,0.8) (0.6,0.8) ( 1.0 , 1.0 ) (1.0,1.0) (1.0,1.0) ( 1.0 , 1.0 ) (1.0,1.0) (1.0,1.0)
A U C = 0.76 AUC=0.76 AUC=0.76
计算Accuracy、Precision、Recall以及F-Score的python代码:

import numpy as np

# 示例数据:预测得分和真实标签
labels = np.array([1, 1, 0, 1, 1, 0, 0, 0, 1, 0])
predictions = np.array([0.95, 0.86, 0.70, 0.65, 0.55, 0.53, 0.52, 0.43, 0.42, 0.35])
thresholds = np.array([0.5])      # 获取不同的阈值

def calculate_metrics(predictions, labels, thresholds):
    metrics_list = []

    for threshold in thresholds:
        # 根据当前阈值将预测得分转化为二分类预测
        binary_predictions = (predictions >= threshold).astype(int)

        # 计算混淆矩阵元素
        tp = np.sum((binary_predictions == 1) & (labels == 1))  # 真正例
        tn = np.sum((binary_predictions == 0) & (labels == 0))  # 真负例
        fp = np.sum((binary_predictions == 1) & (labels == 0))  # 假正例
        fn = np.sum((binary_predictions == 0) & (labels == 1))  # 假负例

        # 计算各个指标
        accuracy = (tp + tn) / (tp + tn + fp + fn) if (tp + tn + fp + fn) > 0 else 0
        precision = tp / (tp + fp) if (tp + fp) > 0 else 0
        recall = tp / (tp + fn) if (tp + fn) > 0 else 0
        f_score = 2 * (precision * recall) / (precision + recall) if (precision + recall) > 0 else 0

        # 添加到列表中
        metrics_list.append({
            'Threshold': threshold,
            'Accuracy': accuracy,
            'Precision': precision,
            'Recall': recall,
            'F-Score': f_score
        })

    return metrics_list


# 计算不同阈值下的各种评价指标
metrics_list = calculate_metrics(predictions, labels, thresholds)

# 输出结果
for metrics in metrics_list:
    print(f"Threshold: {metrics['Threshold']:.2f}, "
          f"Accuracy: {metrics['Accuracy']:.2f}, "
          f"Precision: {metrics['Precision']:.2f}, "
          f"Recall: {metrics['Recall']:.2f}, "
          f"F-Score: {metrics['F-Score']:.2f}")

计算ROC的python代码:

import numpy as np

labels = np.array([1, 1, 0, 1, 1, 0, 0, 0, 1, 0])
predictions = np.array([0.95, 0.86, 0.70, 0.65, 0.55, 0.53, 0.52, 0.43, 0.42, 0.35])
thresholds = np.array([0.0, 0.25, 0.5, 0.75, 1.0])      # 获取不同的阈值

def calculate_roc_points(predictions, labels, thresholds):
    fpr_list = []  # 假正类率列表
    tpr_list = []  # 真正类率列表

    for threshold in thresholds:
        # 根据当前阈值将预测得分转化为二分类预测
        binary_predictions = (predictions >= threshold).astype(int)

        # 计算混淆矩阵元素
        tp = np.sum((binary_predictions == 1) & (labels == 1))  # 真正例
        tn = np.sum((binary_predictions == 0) & (labels == 0))  # 真负例
        fp = np.sum((binary_predictions == 1) & (labels == 0))  # 假正例
        fn = np.sum((binary_predictions == 0) & (labels == 1))  # 假负例

        # 计算假正类率(FPR)和真正类率(TPR)
        fpr = fp / (fp + tn) if fp + tn > 0 else 0
        tpr = tp / (tp + fn) if tp + fn > 0 else 0

        # 添加到列表中
        fpr_list.append(fpr)
        tpr_list.append(tpr)

    return fpr_list, tpr_list


# 计算不同阈值下的ROC点
fpr_list, tpr_list = calculate_roc_points(predictions, labels, thresholds)

# 输出结果
for i, threshold in enumerate(thresholds):
    print(f"Threshold: {threshold:.2f}, FPR: {fpr_list[i]:.2f}, TPR: {tpr_list[i]:.2f}")

计算AUC的python代码:

import numpy as np
labels = np.array([1, 1, 0, 1, 1, 0, 0, 0, 1, 0])
predictions = np.array([0.95, 0.86, 0.70, 0.65, 0.55, 0.53, 0.52, 0.43, 0.42, 0.35])

# 根据标签分离正类和负类的预测得分
positive_scores = predictions[labels == 1]
negative_scores = predictions[labels == 0]


# 手动计算 Mann-Whitney U 统计量
def mannwhitneyu_manual(positive_scores, negative_scores):
    n1 = len(positive_scores)  # 正类样本数量
    n2 = len(negative_scores)  # 负类样本数量

    # 初始化 U 统计量
    U = 0

    # 遍历所有正类和负类样本对,统计正类得分大于负类得分的次数
    for pos_score in positive_scores:
        for neg_score in negative_scores:
            if pos_score > neg_score:
                U += 1
            elif pos_score == neg_score:  # 如果相等,则加 0.5(处理平局)
                U += 0.5

    return U, n1, n2


# 计算 U 统计量
U_statistic, n1, n2 = mannwhitneyu_manual(positive_scores, negative_scores)

# 计算 AUC
auc = U_statistic / (n1 * n2)

# 输出结果
print(f"Mann-Whitney U 统计量: {U_statistic}")
print(f"AUC 值: {auc}")

多分类评价指标

Accuracy(准确率/精度)

与二分类相同,预测正确的样本数占总样本数的比例:
A c c u r a c y = 预测正确的样本数量 总的样本数量 Accuracy = \frac{{预测正确的样本数量}}{{总的样本数量}} Accuracy=总的样本数量预测正确的样本数量

macro指标

类比二分类指标,大体原则是每类计算对应指标,再求平均:

  1. macro-Precision(宏精确率/ 宏查准率)公式:
    m a c r o _ P = 1 n ∑ 1 n P i macro\_P = \frac{1}{{\rm{n}}}\sum\limits_1^{\rm{n}} {{P_i}} macro_P=n11nPi
  2. macro-Recall(宏召回率/宏查全率)公式:
    m a c r o _ R = 1 n ∑ 1 n R i macro\_R = \frac{1}{n}\sum\limits_1^n {{R_i}} macro_R=n11nRi
  3. macro-F1公式:
    m a c r o _ F 1 = 2 1 m a c r o _ P + 1 m a c r o _ R = 2 ∗ m a c r o _ P ∗ m a c r o _ R m a c r o _ P + m a c r o _ R macro\_F1 = \frac{2}{{\frac{1}{{macro\_P}} + \frac{1}{{macro\_R}}}} = \frac{{2*macro\_P*macro\_R}}{{macro\_P + macro\_R}} macro_F1=macro_P1+macro_R12=macro_P+macro_R2macro_Pmacro_R

micro指标

与macro指标不同,micro指标先求多个类别的 T P TP TP F P FP FP T N TN TN以及 F N FN FN,再计算对应均值。最后二分类的方式计算对应指标:

  1. micro-Precision(微精确率/ 微查准率)公式:
    m i c r o _ P = T P ‾ T P ‾ + F P ‾ micro\_P = \frac{{\overline {TP} }}{{\overline {TP} + \overline {FP} }} micro_P=TP+FPTP
  2. micro-Recall(微召回率/微查全率)公式:
    m i c r o _ R = T P ‾ T P ‾ + F N ‾ micro\_R = \frac{{\overline {TP} }}{{\overline {TP} + \overline {FN} }} micro_R=TP+FNTP
  3. micro-F1公式:
    m i c r o _ F 1 = 2 1 m i c r o _ P + 1 m i c r o _ R = 2 × m i c r o _ P × m i c r o _ R m i c r o _ P + m i c r o _ R = 2 T P ‾ 2 T P ‾ + F P ‾ + F N ‾ micro\_F1 = \frac{2}{{\frac{1}{{micro\_P}} + \frac{1}{{micro\_R}}}} = \frac{{2{\rm{ \times }}micro\_P{\rm{ \times }}micro\_R}}{{micro\_P + micro\_R}} = \frac{{2\overline {TP} }}{{2\overline {TP} + \overline {FP} + \overline {FN} }} micro_F1=micro_P1+micro_R12=micro_P+micro_R2×micro_P×micro_R=2TP+FP+FN2TP

Kappa指标(科恩的卡帕系数)

用于一致性检验的指标,可用于衡量分类的效果,取值范围在 [ − 1 , 1 ] [-1,1] [1,1],不仅考虑了预测标签与真实标签之间的简单一致程度,还考虑了由于随机性而可能产生的偶然一致性。计算公式如下:
κ = p o − p e 1 − p e \kappa = \frac{{{p_o} - {p_{\rm{e}}}}}{{1 - {p_{\rm{e}}}}} κ=1pepope
其中:
p o = 预测正确的样本数 样本总数 {p_o} = \frac{{预测正确的样本数}}{{样本总数}} po=样本总数预测正确的样本数
p o = ∑ i n 类别 i 真实标签数 × 类别 i 预测标签数 样本总数 2 = ∑ i n 第 i 行元素之和 × 第 i 列元素之和 矩阵所有元素和 2 {p_o} = \frac{{\sum\nolimits_i^n {类别i真实标签数×类别i预测标签数} }}{{样本总数}^2}=\frac{{\sum\nolimits_i^n {第i行元素之和×第i列元素之和} }}{{矩阵所有元素和}^2} po=样本总数2in类别i真实标签数×类别i预测标签数=矩阵所有元素和2ini行元素之和×i列元素之和

  • 如果Kappa等于1,则表示完全一致;
  • 如果Kappa接近0甚至为负数,则意味着观察到的一致性几乎等同于或者低于随机水平,这通常表明模型性能较差;
  • 在0到1之间的值则表示不同程度的部分一致性,值越大代表一致性越好。

在多分类问题中,Kappa系数能够更好地处理类别不平衡的问题,比单纯准确率Accuracy更为严格和可靠的性能度量。

多分类的案例

在实际应用中,往往更多的任务为多分类任务,现有一个家畜分类任务,对含有牛、羊、猪的图像进行分类(每个图片中只有一个类型的物体),其中牛的图片有 1748、羊的图片有 1558、猪的图片有 1473。同样利用混淆矩阵展示模型的分类结果:

预测的牛预测的羊预测的猪
真实的牛1494119135
真实的羊1951244119
真实的马2231241126

计算出对应的评价指标:
A c c u r a c y = 1494 + 1244 + 1126 1748 + 1558 + 1473 ≈ 0.81 Accuracy = \frac{{1494+1244+1126}}{{1748+1558+1473}}\approx 0.81 Accuracy=1748+1558+14731494+1244+11260.81
m a c r o _ P = 1494 1912 + 1244 1487 + 1126 1380 3 ≈ 0.8113 macro\_P = \frac{{\frac{{1494}}{{1912}} + \frac{{1244}}{{1487}} + \frac{{1126}}{{1380}}}}{3} \approx 0.8113 macro_P=319121494+14871244+138011260.8113
m a c r o _ R = 1494 1748 + 1244 1558 + 1126 1473 3 ≈ 0.8059 macro\_R= \frac{{\frac{{1494}}{{1748}} + \frac{{1244}}{{1558}} + \frac{{1126}}{{1473}}}}{3} \approx 0.8059 macro_R=317481494+15581244+147311260.8059
m a c r o _ F 1 = 2 × 0.8113 × 0.8059 0.8113 + 0.8059 ≈ 0.8076 macro\_F1= \frac{{2×0.8113×0.8059}}{{0.8113+0.8059}}\approx 0.8076 macro_F1=0.8113+0.80592×0.8113×0.80590.8076
m i c r o _ P = 1494 + 1244 + 1126 3 1494 + 1244 + 1126 3 + 418 + 243 + 254 3 ≈ 0.8085 micro\_P = \frac{{\frac{{1494 + 1244 + 1126}}{3}}}{{\frac{{1494 + 1244 + 1126}}{3} + \frac{{418 + 243 + 254}}{3}}} \approx 0.8085 micro_P=31494+1244+1126+3418+243+25431494+1244+11260.8085
m i c r o _ R = 1494 + 1244 + 1126 3 1494 + 1244 + 1126 3 + 254 + 314 + 347 3 ≈ 0.8085 micro\_R= \frac{{\frac{{1494 + 1244 + 1126}}{3}}}{{\frac{{1494 + 1244 + 1126}}{3} + \frac{{254 + 314 + 347}}{3}}} \approx 0.8085 micro_R=31494+1244+1126+3254+314+34731494+1244+11260.8085
m i c r o _ F 1 = 2 × 1494 + 1244 + 1126 3 2 × 1494 + 1244 + 1126 3 + 418 + 243 + 254 3 + 254 + 314 + 347 3 ≈ 0 . 8085 micro\_F1 = \frac{{2{\rm{ \times }}\frac{{1494 + 1244 + 1126}}{3}}}{{2{\rm{ \times }}\frac{{1494 + 1244 + 1126}}{3} + \frac{{{\rm{418 + 243 + 254}}}}{3} + \frac{{{\rm{254 + 314 + 347}}}}{3}}} \approx {\rm{0}}{\rm{.8085}} micro_F1=2×31494+1244+1126+3418+243+254+3254+314+3472×31494+1244+11260.8085
因为: p o ≈ 0.8085 {p_o} \approx0.8085 po0.8085 p e ≈ 0.3368 {p_e}\approx0.3368 pe0.3368
κ = p o − p e 1 − p e = 0.8085 − 0.3368 1 − 0.3368 ≈ 0.7113 \kappa = \frac{{{p_o} - {p_{\rm{e}}}}}{{1 - {p_{\rm{e}}}}}=\frac{{{0.8085} - {0.3368}}}{{1 - {0.3368}}}\approx0.7113 κ=1pepope=10.33680.80850.33680.7113

计算macro的python代码:

# 数据
true_counts = {'牛': 1748, '羊': 1558, '猪': 1473}
correct_counts = {'牛': 1494, '羊': 1244, '猪': 1126}
confusion_matrix = {
    '牛': {'牛': 1494, '羊': 119, '猪': 135},
    '羊': {'牛': 195, '羊': 1244, '猪': 119},
    '猪': {'牛': 223, '羊': 124, '猪': 1126},
}

# 计算 Precision、Recall 和 F1 Score
precision = {}
recall = {}
f1_score = {}

for cls in true_counts.keys():
    # 精确率 (Precision) = TP / (TP + FP)
    tp = confusion_matrix[cls][cls]  # 真正例 (True Positive)
    fp = sum(confusion_matrix[other_cls][cls] for other_cls in true_counts if other_cls != cls)  # 假正例 (False Positive)
    precision[cls] = tp / (tp + fp) if (tp + fp) > 0 else 0

    # 召回率 (Recall) = TP / (TP + FN)
    fn = sum(confusion_matrix[cls][other_cls] for other_cls in true_counts if other_cls != cls)  # 假负例 (False Negative)
    recall[cls] = tp / (tp + fn) if (tp + fn) > 0 else 0

    # F1 分数 = 2 * (Precision * Recall) / (Precision + Recall)
    f1_score[cls] = 2 * precision[cls] * recall[cls] / (precision[cls] + recall[cls]) if (precision[cls] + recall[cls]) > 0 else 0

# 计算 Macro 平均值
macro_precision = sum(precision.values()) / len(precision)
macro_recall = sum(recall.values()) / len(recall)
macro_f1 = sum(f1_score.values()) / len(f1_score)

# 输出结果
print(f"Macro Precision: {macro_precision:.4f}")
print(f"Macro Recall: {macro_recall:.4f}")
print(f"Macro F1 Score: {macro_f1:.4f}")

计算micro的python代码:

# 数据
true_counts = {'牛': 1748, '羊': 1558, '猪': 1473}
correct_counts = {'牛': 1494, '羊': 1244, '猪': 1126}
confusion_matrix = {
    '牛': {'牛': 1494, '羊': 119, '猪': 135},
    '羊': {'牛': 195, '羊': 1244, '猪': 119},
    '猪': {'牛': 223, '羊': 124, '猪': 1126},
}

# 初始化全局统计量
global_tp = 0  # 全局真正例 (True Positive)
global_fp = 0  # 全局假正例 (False Positive)
global_fn = 0  # 全局假负例 (False Negative)

# 计算全局 TP、FP 和 FN
for cls in true_counts.keys():
    tp = confusion_matrix[cls][cls]  # 当前类别的真正例
    fp = sum(confusion_matrix[other_cls][cls] for other_cls in true_counts if other_cls != cls)  # 当前类别的假正例
    fn = sum(confusion_matrix[cls][other_cls] for other_cls in true_counts if other_cls != cls)  # 当前类别的假负例

    global_tp += tp
    global_fp += fp
    global_fn += fn

# 计算 Micro 指标
micro_precision = global_tp / (global_tp + global_fp) if (global_tp + global_fp) > 0 else 0
micro_recall = global_tp / (global_tp + global_fn) if (global_tp + global_fn) > 0 else 0
micro_f1 = 2 * micro_precision * micro_recall / (micro_precision + micro_recall) if (
                                                                                                micro_precision + micro_recall) > 0 else 0

# 输出结果
print(f"Micro Precision: {micro_precision:.4f}")
print(f"Micro Recall: {micro_recall:.4f}")
print(f"Micro F1 Score: {micro_f1:.4f}")

计算Kappa的python代码:

# 数据
true_counts = {'牛': 1748, '羊': 1558, '猪': 1473}
correct_counts = {'牛': 1494, '羊': 1244, '猪': 1126}
confusion_matrix = {
    '牛': {'牛': 1494, '羊': 119, '猪': 135},
    '羊': {'牛': 195, '羊': 1244, '猪': 119},
    '猪': {'牛': 223, '羊': 124, '猪': 1126},
}

# 总样本数
total_samples = sum(true_counts.values())

# 计算观察到的一致率(Po)
correct_predictions = sum(confusion_matrix[cls][cls] for cls in true_counts.keys())
Po = correct_predictions / total_samples

# 计算期望的一致率(Pe)
Pe = sum((sum(confusion_matrix[cls].values()) / total_samples) *
         (sum(row[cls] for row in confusion_matrix.values()) / total_samples)
         for cls in true_counts.keys())

# 计算Kappa系数
if Pe == 1:
    kappa = 1  # 避免除以零的情况
else:
    kappa = (Po - Pe) / (1 - Pe)

# 输出结果
print(f"Po: {Po:.4f}")
print(f"Pe: {Pe:.4f}")
print(f"Kappa: {kappa:.4f}")

总结

尽可能简单、详细的介绍了图像二分类和多分类的评价指标。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2333281.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯单片机刷题——按键控制距离显示精度

设计要求 驱动超声波传感器&#xff0c;启动距离测量功能,并将其结果显示到数码管上&#xff0c;距离数据单位为m。 按键“S4”定义为“切换”按键&#xff0c;通过此按键切换距离的显示精度&#xff08;一位或两位小数&#xff09;。切换顺序如图所示。 数码管显示格式如下图…

el-time-picker标签的使用

需求&#xff1a; 实现培训日期&#xff0c;用户可以选择某一天的日期&#xff0c;这个比较简单 <el-form-item label"培训日期" prop"startTime"><el-date-picker clearablev-model"form.startTime"type"date"placeholder…

云平台一键部署【OmniGen】多功能图像生成模型(2025更新版)

OmniGen 是智源推出的一款全新的扩散模型架构&#xff0c;专注于统一图像生成。它简化了图像生成的复杂流程&#xff0c;通过一个框架处理多种任务&#xff0c;例如文本生成图像、图像编辑和基于视觉条件的生成等。此外&#xff0c;OmniGen 通过统一学习结构实现了知识迁移&…

算法训练之动态规划(四)——简单多状态问题

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…

uniapp离线打包提示未添加videoplayer模块

uniapp中使用到video标签&#xff0c;但是离线打包放到安卓工程中&#xff0c;运行到真机中时提示如下&#xff1a; 解决方案&#xff1a; 1、把media-release.aar、weex_videoplayer-release.aar放到工程的libs目录下; 文档&#xff1a;https://nativesupport.dcloud.net.cn/…

机器人零位标定修正流程介绍

如果想看运动学标定可以看看 机器人运动学参数标定, 一次性把运动学参数和零位标定等一起标定求解. 1. 零位标定 零位标定是机器人运动学标定中的一个重要步骤&#xff0c;其目的是校正机器人关节的初始位置误差。以下是需要进行零位标定的主要原因&#xff1a; 制造误差 在机…

深入 C++ 线程库:从创建到同步的探索之旅

目录 创建多线程 获取线程返回值 1.传指针 2.传引用 原子操作 互斥量 互斥量&#xff08;Mutex&#xff09;的基本概念 mutex类型介绍 锁的类型 互斥锁&#xff08;Mutex&#xff09; 自旋锁&#xff08;Spin Lock&#xff09; 读写锁&#xff08;Read - Write Lo…

【2025年认证杯数学中国数学建模网络挑战赛】A题 解题建模过程与模型代码(基于matlab)

目录 【2025年认证杯数学建模挑战赛】A题解题建模过程与模型代码&#xff08;基于matlab&#xff09;A题 小行星轨迹预测解题思路第一问模型与求解第二问模型与求解 【2025年认证杯数学建模挑战赛】A题 解题建模过程与模型代码&#xff08;基于matlab&#xff09; A题 小行星轨…

Matlab 分数阶PID控制永磁同步电机

1、内容简介 Matlab 203-分数阶PID控制永磁同步电机 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略

4185 费马小定理求逆元

4185 费马小定理求逆元 ⭐️难度&#xff1a;简单 &#x1f31f;考点&#xff1a;费马小定理 &#x1f4d6; &#x1f4da; import java.util.Scanner; import java.util.Arrays;public class Main {static int[][] a;public static void main(String[] args) {Scanner sc …

界面控件DevExpress WinForms v25.1新功能预览 - 聚焦用户体验升级

DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜…

卷积神经网络(CNN)基础

目录 一、应用场景 二、卷积神经网络的结构 1. 输入层&#xff08;Input Layer&#xff09; 2. 卷积层&#xff08;Convolutional Layer&#xff09; 3. 池化层&#xff08;Pooling Layer&#xff09; 最大池化&#xff08;max_pooling&#xff09;或平均池化&#xff08;…

Android Spotify-v9.0.36.443-arm64-Experimental Merged版

Android Spotify 链接&#xff1a;https://pan.xunlei.com/s/VONXTdIv9d4FnAiNMMliIAEJA1?pwdxt7q# Android Spotify-v9.0.36.443-arm64-Experimental Merged版 享受高达256kbps的AAC音频。

LLM之Agent(十六)| MCP已“过时”?Google近期推出Agent2Agent 协议 (A2A)

如今&#xff0c;企业越来越多地构建和部署自主代理&#xff0c;以帮助扩展、自动化和增强整个工作场所的流程 - 从订购新笔记本电脑到协助客户服务代表&#xff0c;再到协助供应链规划。 为了最大限度地发挥代理 AI 的优势&#xff0c;这些代理能够在一个动态的、多代理的生态…

Transformer 训练:AutoModelForCausalLM,AutoModelForSequenceClassification

Transformer 训练:AutoModelForCausalLM,AutoModelForSequenceClassification 目录 Transformer 训练:AutoModelForCausalLM,AutoModelForSequenceClassification`AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)`功能概述参数解释`AutoModelForSequen…

Java学习总结-端口-协议

端口号&#xff1a;一个16位的二进制&#xff0c;范围是0-65535 端口分类&#xff1a; 周知端口&#xff1a;0-1023&#xff0c;被预先定义的知名应用占用&#xff08;如&#xff1a;HTTP占用80&#xff0c;FTP占用21&#xff09; 注册端口&#xff1a;1024-49151&#xff0…

克魔助手(Kemob)安装与注册完整教程 - Windows/macOS双平台指南

iOS设备管理工具克魔助手便携版使用全指南 前言&#xff1a;为什么需要专业的iOS管理工具 在iOS开发和设备管理过程中&#xff0c;开发者经常需要突破系统限制&#xff0c;实现更深层次的控制和调试。本文将详细介绍一款实用的便携式工具的使用方法&#xff0c;帮助开发者快速…

qwen-vl 实现OCR的测试

OCR 技术是数字化时代必不可少的实用工具。以前都依赖专业的公司的专业软件才能完成。成本很高。也正因为如此&#xff0c;我国纸质资料的数字化并不普及。基于大模型的ORC 也许会改变这样的现状。 文本识别&#xff0c;也称为光学字符识别 (OCR)&#xff0c;可以将印刷文本或…

算法训练之动态规划(五)——简单多状态问题

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…

SVMSPro分布式综合安防管理平台-->以S3存储革新,开启智能安防新纪元

SVMSPro分布式综合安防管理平台–>以S3存储革新&#xff0c;开启智能安防新纪元 在数字化转型浪潮下&#xff0c;企业安防管理正面临海量数据存储、跨区域协同以及数据安全的严峻挑战。如何实现高效、弹性、低成本的存储扩容&#xff1f;如何确保关键录像数据万无一失&…