怀疑在不平衡的分类任务中使用准确性或宏 f1 度量

数据挖掘 分类 阶级失衡 评估
2022-02-28 12:18:52

我有一个多类分类任务,组织者说最终结果将使用准确度度量。

提供的数据是不平衡的,我不知道测试集(是否平衡),但我认为它将是平衡的,因为它们使用准确性。

反正 ..

我的问题:使用 F1-macro 而不是 Accuracy 调整我的系统是个好主意吗?因为训练数据不平衡。

还是使用精度更好?

2个回答

使用不平衡数据的准确性意味着对人口最多的班级成员进行正确分类比其他人更重要。如果对所有数据记录进行正确分类的重要性在您的问题准确性方面是相同的,那么这是最糟糕的选择之一。

除了 F1-macro 之外,还有一些其他不错的选择可能会更有帮助。其中一些指标如下:

"Kappa", "SOA1(Landis & Koch)", "SOA2(Fleiss)", "SOA3(Altman)", "SOA4(Cicchetti)", "CEN",
"MCEN", "MCC", "J", "Overall J", "Overall MCC", "Overall CEN", "Overall MCEN", "AUC",
"AUCI", "G", "DP", "DPI", "GI"

免责声明:

如果您使用 python,PyCM模块可以帮助您找出这些指标。

这是一个从该模块获取推荐参数的简单代码:

>>> from pycm import *

>>> cm = ConfusionMatrix(matrix={"Class1": {"Class1": 1, "Class2":2}, "Class2": {"Class1": 0, "Class2": 5}})  

>>> print(cm.recommended_list)
["Kappa", "SOA1(Landis & Koch)", "SOA2(Fleiss)", "SOA3(Altman)", "SOA4(Cicchetti)", "CEN", "MCEN", "MCC", "J", "Overall J", "Overall MCC", "Overall CEN", "Overall MCEN", "AUC", "AUCI", "G", "DP", "DPI", "GI"]

之后,您想用作损失函数的每个参数都可以按如下方式使用:

>>> y_pred = model.predict      #the prediction of the implemented model

>>> y_actu = data.target        #data labels

>>> cm = ConfusionMatrix(y_actu, y_pred)

>>> loss = cm.Kappa             #or any other parameter (Example: cm.SOA1)

您绝对应该使用宏观平均 F1,因为大多数类别可能会严重影响准确性。F1 对召回率和准确率进行调和平均值,考虑到正确预测的内容和未正确预测的内容,提供权衡措施。