多标签分类中常用指标
1. 准确率(Accuracy)
准确率计算的是正确预测的标签比例。对于多标签分类,这通常是一个较为严格的指标,因为要求每个实例的所有标签都预测正确。
Accuracy = 正确预测的标签数 总标签数 \text{Accuracy} = \frac{\text{正确预测的标签数}}{\text{总标签数}} Accuracy=总标签数正确预测的标签数
2. 精确度(Precision)
对于每个标签,精确度计算为:
Precision = TP TP + FP \text{Precision} = \frac{\text{TP}}{\text{TP} + \text{FP}} Precision=TP+FPTP
其中,TP(True Positives)是正确预测的正样本数,FP(False Positives)是错误预测的正样本数。对于多标签分类,通常对每个标签计算精确度,然后取平均值。
3. 召回率(Recall)
对于每个标签,召回率计算为:
Recall = TP TP + FN \text{Recall} = \frac{\text{TP}}{\text{TP} + \text{FN}} Recall=TP+FNTP
其中,FN(False Negatives)是未能正确预测的正样本数。和精确度一样,通常对每个标签单独计算召回率。
4. F1 分数(F1 Score)
对于每个标签,F1 分数是精确度和召回率的调和平均:
F1 Score = 2 × Precision × Recall Precision + Recall \text{F1 Score} = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} F1 Score=2×Precision+RecallPrecision×Recall
对于多标签分类,可以计算宏观(平均每个标签的F1分数)或微观F1分数(在所有标签上累积TP、FP、FN后计算)。
5. 汉明损失(Hamming Loss)
汉明损失反映了预测错误的标签比例:
Hamming Loss = 错误预测的标签数 总标签数 \text{Hamming Loss} = \frac{\text{错误预测的标签数}}{\text{总标签数}} Hamming Loss=总标签数错误预测的标签数
6. 子集准确率(Subset Accuracy)
这是一个非常严格的指标,要求预测的每个标签集合完全匹配真实标签集合:
Subset Accuracy = 完全匹配的样本数 总样本数 \text{Subset Accuracy} = \frac{\text{完全匹配的样本数}}{\text{总样本数}} Subset Accuracy=总样本数完全匹配的样本数
7. ROC 和 AUC
- ROC 曲线:真正类率(TPR)对假正类率(FPR)的图形表示。
- AUC 值:ROC 曲线下的面积。
在多标签设置中,这些指标通常是对每个标签单独计算然后取平均值。
宏观评价指标(Macro Metrics)
宏观指标是对每个标签分别计算指标值,然后取所有标签指标值的平均。对于精确度、召回率和F1分数,其宏观计算公式如下:
-
宏观精确度(Macro Precision)
M a c r o P r e c i s i o n = 1 N ∑ i = 1 N P r e c i s i o n i Macro\ Precision = \frac{1}{N} \sum_{i=1}^{N} Precision_i Macro Precision=N1i=1∑NPrecisioni
其中,Precision_i
是第i
个标签的精确度,N
是标签的总数。 -
宏观召回率(Macro Recall)
M a c r o R e c a l l = 1 N ∑ i = 1 N R e c a l l i Macro\ Recall = \frac{1}{N} \sum_{i=1}^{N} Recall_i Macro Recall=N1i=1∑NRecalli -
宏观 F1 分数(Macro F1 Score)
M a c r o F 1 = 1 N ∑ i = 1 N F 1 i Macro\ F1 = \frac{1}{N} \sum_{i=1}^{N} F1_i Macro F1=N1i=1∑NF1i
微观评价指标(Micro Metrics)
微观指标是在所有标签的汇总数据上计算指标值。对于精确度、召回率和F1分数,其微观计算公式如下:
-
微观精确度(Micro Precision)
M i c r o P r e c i s i o n = ∑ i = 1 N T P i ∑ i = 1 N ( T P i + F P i ) Micro\ Precision = \frac{\sum_{i=1}^{N} TP_i}{\sum_{i=1}^{N} (TP_i + FP_i)} Micro Precision=∑i=1N(TPi+FPi)∑i=1NTPi
其中, T P i TP_i TPi 和 F P i FP_i FPi分别是第 i i i个标签的真正例和假正例数。 -
微观召回率(Micro Recall)
M i c r o R e c a l l = ∑ i = 1 N T P i ∑ i = 1 N ( T P i + F N i ) Micro\ Recall = \frac{\sum_{i=1}^{N} TP_i}{\sum_{i=1}^{N} (TP_i + FN_i)} Micro Recall=∑i=1N(TPi+FNi)∑i=1NTPi -
微观 F1 分数(Micro F1 Score)
M i c r o F 1 = 2 × M i c r o P r e c i s i o n × M i c r o R e c a l l M i c r o P r e c i s i o n + M i c r o R e c a l l Micro\ F1 = 2 \times \frac{Micro\ Precision \times Micro\ Recall}{Micro\ Precision + Micro\ Recall} Micro F1=2×Micro Precision+Micro RecallMicro Precision×Micro Recall
在多标签分类中,选择宏观还是微观指标取决于你的具体需求和数据的特性。例如,如果你希望每个标签都同等重要,可以选择宏观指标。如果你的数据集中某些标签的样本数远多于其他标签,使用微观指标可能更合适。
简单可视化
import matplotlib.pyplot as plt
import numpy as np
# 假设 x 轴有 8 个epcohs
epochs = np.arange(1, 9)
# 数据
micro_f1_values = {
'w/o ATM, w/o APP': np.array([0.52, 0.54, 0.56, 0.58, 0.60, 0.61, 0.62, 0.63]),
'w/ ATM, w/o APP': np.array([0.53, 0.55, 0.57, 0.59, 0.61, 0.62, 0.63, 0.64]),
'w/o ATM, w/ APP': np.array([0.54, 0.56, 0.58, 0.59, 0.61, 0.64, 0.63, 0.65]),
'w/ ATM, w/ APP': np.array([0.55, 0.57, 0.58, 0.56, 0.62, 0.63, 0.64, 0.66]),
}
# 设置不同的标记和颜色
markers = ['o', '^', '*', 's']
colors = ['black', 'blue', 'orange', 'red']
# 使用不同的标记和颜色绘制数据
plt.figure(figsize=(10, 6))
for (label, values), marker, color in zip(micro_f1_values.items(), markers, colors):
plt.plot(epochs, values, marker=marker, color=color, linestyle='-', label=label)
# 添加标题和标签
plt.title('Micro-F1 Score over Epochs')
plt.xlabel('Train (num of epochs)')
plt.ylabel('Micro-F1')
# 添加网格和图例
plt.grid(True)
plt.legend()
# 显示
plt.show()