准确率计算的是正确预测的标签比例。对于多标签分类,这通常是一个较为严格的指标,因为要求每个实例的所有标签都预测正确。
Accuracy = 正确预测的标签数 总标签数 \text{Accuracy} = \frac{\text{正确预测的标签数}}{\text{总标签数}} Accuracy=总标签数正确预测的标签数?
对于每个标签,精确度计算为:
Precision = TP TP + FP \text{Precision} = \frac{\text{TP}}{\text{TP} + \text{FP}} Precision=TP+FPTP?
其中,TP(True Positives)是正确预测的正样本数,FP(False Positives)是错误预测的正样本数。对于多标签分类,通常对每个标签计算精确度,然后取平均值。
对于每个标签,召回率计算为:
Recall = TP TP + FN \text{Recall} = \frac{\text{TP}}{\text{TP} + \text{FN}} Recall=TP+FNTP?
其中,FN(False Negatives)是未能正确预测的正样本数。和精确度一样,通常对每个标签单独计算召回率。
对于每个标签,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后计算)。
汉明损失反映了预测错误的标签比例:
Hamming?Loss = 错误预测的标签数 总标签数 \text{Hamming Loss} = \frac{\text{错误预测的标签数}}{\text{总标签数}} Hamming?Loss=总标签数错误预测的标签数?
这是一个非常严格的指标,要求预测的每个标签集合完全匹配真实标签集合:
Subset?Accuracy = 完全匹配的样本数 总样本数 \text{Subset Accuracy} = \frac{\text{完全匹配的样本数}}{\text{总样本数}} Subset?Accuracy=总样本数完全匹配的样本数?
在多标签设置中,这些指标通常是对每个标签单独计算然后取平均值。
宏观指标是对每个标签分别计算指标值,然后取所有标签指标值的平均。对于精确度、召回率和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=N1?i=1∑N?Precisioni?
其中,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=N1?i=1∑N?Recalli?
宏观 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=N1?i=1∑N?F1i?
微观指标是在所有标签的汇总数据上计算指标值。对于精确度、召回率和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=1N?TPi??
其中,
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=1N?TPi??
微观 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()