我有一个多班级问题,其中0是我的负面班级,12是正班级.判断以下代码:

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

这是混淆矩阵:

enter image description here

macroweighted是一样的,因为我每个班级都有相同数量的样本?这是我手动完成的操作.

1-精度=TP/(TP+FP).因此,对于班级12,我们得到:

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-Recall=Tp/(Tp+Fn).因此,对于班级12,我们得到:

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是不同的.我在这里做错了什么?即使您使用Precision和Recall from Sklearn的值(即0.250.3333),您也无法获得0.27778的F1分数.

推荐答案

您已在以下问题的编辑中修复了此部分:您错误地计算了%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的F1为1/2,班级2的F1为0,平均值为5/18.

Python相关问答推荐

Pandas 修改原始excel

两极:滚动组,起始指数由不同列设置

如何将自动创建的代码转换为类而不是字符串?

如何判断. text文件中的某个字符,然后读取该行

使用Python C API重新启动Python解释器

使用Beautiful Soup获取第二个srcset属性

用Python获取HTML Span类中的数据

更改Seaborn条形图中的x轴日期时间限制

在for循环中仅执行一次此操作

如何在BeautifulSoup中链接Find()方法并处理无?

为什么tkinter框架没有被隐藏?

Pandas 都是(),但有一个门槛

' osmnx.shortest_track '返回有效源 node 和目标 node 的'无'

Polars:用氨纶的其他部分替换氨纶的部分

如果值发生变化,则列上的极性累积和

我对我应该做什么以及我如何做感到困惑'

如何在UserSerializer中添加显式字段?

提取相关行的最快方法—pandas

计算分布的标准差

matplotlib图中的复杂箭头形状