使用 Sklearn 解决多类问题的精度、召回率和 F1

问题描述 投票:0回答:1

我有一个多类问题,其中

0
是我的负类,
1
2
是正类。检查以下代码:

import numpy as np
from sklearn.metrics import confusion_matrix
from sklearn.metrics import ConfusionMatrixDisplay
from sklearn.metrics import f1_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score

# Outputs
y_true = np.array((1, 2, 2, 0, 1, 0))
y_pred = np.array((1, 0, 0, 0, 0, 1))
# Metrics
precision_macro = precision_score(y_true, y_pred, average='macro')
precision_weighted = precision_score(y_true, y_pred, average='weighted')
recall_macro = recall_score(y_true, y_pred, average='macro')
recall_weighted = recall_score(y_true, y_pred, average='weighted')
f1_macro = f1_score(y_true, y_pred, average='macro')
f1_weighted = f1_score(y_true, y_pred, average='weighted')
# Confusion Matrix
cm = confusion_matrix(y_true, y_pred)
disp = ConfusionMatrixDisplay(confusion_matrix=cm)
disp.plot()
plt.show()

在这种情况下用

Sklearn
计算的指标如下:

precision_macro = 0.25
precision_weighted = 0.25
recall_macro = 0.33333
recall_weighted = 0.33333
f1_macro = 0.27778
f1_weighted = 0.27778

这是混淆矩阵:

macro
weighted
是相同的,因为我每个班级的样本数量相同?这是我手动做的。

1 - 精度 = TP/(TP+FP)。所以对于类

1
2
,我们得到:

Precision1 = TP1/(TP1+FP1) = 1/(1+1) = 0.5
Precision2 = TP2/(TP2+FP2) = 0/(0+0) = 0 (this returns 0 according Sklearn documentation)
Precision_Macro = (Precision1 + Precision2)/2 = 0.25
Precision_Weighted = (2*Precision1 + 2*Precision2)/4 = 0.25

2 - 召回 = TP/(TP+FN)。所以对于类

1
2
,我们得到:

Recall1 = TP1/(TP1+FN1) = 1/(1+1) = 0.5
Recall2 = TP2/(TP2+FN2) = 0/(0+2) = 0
Recall_Macro = (Recall1+Recall2)/2 = (0.5+0)/2 = 0.25
Recall_Weighted = (2*Recall1+2*Recall2)/4 = (2*0.5+2*0)/4 = 0.25

3 - F1 = 2*(精度*召回)/(精度+召回)

F1_Macro = 2*(Precision_Macro*Recall_Macro)/(Precision_Macro*Recall_Macro) = 0.25
F1_Weighted = 2*(Precision_Weighted*Recall_Weighted)/(Precision_Weighted*Recall_Weighted) = 0.25

因此,精度分数与

Sklearn
相同。但是Recall和F1不一样。我在这里做错了什么?即使你使用
Sklearn
的 Precision 和 Recall 值(即
0.25
0.3333
),你也无法获得
0.27778
F1 分数。

python scikit-learn metrics multiclass-classification
1个回答
0
投票

您已在对问题的编辑中修复了这部分:您错误计算了第 1 类的召回率。它是 1/2:中心单元格除以中心行的总和。


对于平均分数,您还需要第 0 类的分数。第 0 类的精度为

1/4
(因此平均值不变)。 0类的召回率是
1/2
,所以平均召回率是
(1/2+1/2+0)/3 = 1/3

平均F1分数不是平均准确率和召回率的调和平均值;相反,它是每个班级 F1 的平均值。这里,0级的F1是

1/3
,1级是
1/2
,2级未定义但取为
0
,平均为
5/18
.

© www.soinside.com 2019 - 2024. All rights reserved.