应该考虑使用哪种方法评估不平衡的多类别分类?

时间:2018-11-07 19:59:31

标签: scikit-learn data-science multiclass-classification

我正在处理多类不平衡数据。我的因变量严重偏斜。

          Injury

       2(No Injury)              208753
       1(Medium Injury)       22318
       0(severe Injury)            3394

我已经使用参数为“ class_weight ='balanced'”的随机森林算法来管理2类不平衡。

当我使用average ='micro'时,得到以下结果。

       [[   34   107   688]
        [  148   778  4592]
        [  905  4635 46730]]
        Accuracy Score: 0.8110616374089428
        precision score: 0.8110616374089428
        Recall score: 0.8110616374089428
        AUC Score: 0.8582962280567071
        F1 score: 0.8110616374089428
        Kappa Score: 0.05522284663052324 

对于平均值=“宏”,结果如下。

        [[   31   125   684]
         [  157   838  4559]
         [  890  4694 46639]]
         Accuracy Score: 0.8104816009007626
          precision score: 0.3586119227436326
          Recall score: 0.3602869806251181
         AUC Score: 0.5253225798824679
         F1 score: 0.3592735337079687
         Kappa Score: 0.06376296115668922

那么,我应该考虑哪些结果来评估模型?如果必须考虑宏,那么我的模型性能确实很差。请建议是否有任何方法可以提高准确性,召回率和AUC得分?

如果考虑微观结果,我的精度,召回率,f1得分是相同的。我如何在项目中证明这一点?

任何帮助将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:1)

与大多数与数据科学相关的问题一样,“哪个更好”的答案归结为“取决于”。对每个班级都有出色的表现重要吗?还是您更关心获得良好的整体性能?

设置average='micro'时,您正在衡量整个类中算法的整体性能。例如,要计算精度,您需要将所有真实的阳性预测值相加,然后除以所有真实的阳性率和所有错误的阳性率,而使用您的数据将是:

(34 + 778 + 46730) / ((34 + 778 + 46730) + (157 + 890 + 125 + 4694 + 688 + 4592))

结果为0.81106。但是,当您查看详细信息时,会发现对于每个类,每个类中的精度计算都有很大的不同,并且精度计算很大程度上由No Injury类驱动:

Severe Injury = 0.0312
Medium Injury = 0.1409
No Injury     = 0.8985

设置average='macro'时,您将对每个类别的精度计算求平均,并消除不平衡类别的影响。当average='macro'为:

时,使用高于整体精度的计算得出的类精度:

(0.0312 + 0.1409 + 0.8985) / 3 = 0.356

请注意,输入是每个单独类别的精度计算,并且每个输入的权重均相等。因为No InjuryMedium Injury类的精度得分要低得多,并且由于您要消除不平衡类的影响,所以macro的精度会更低。

因此,哪种更好取决于您和您的用例的重要性。如果您要确保将大多数情况(不管是哪种类别)分配给正确的类别,则average='micro'是要使用的度量,但是请注意,这样做,结果将在示例中被单个类别淹没。如果“严重”或“中等”类别最为重要,那么您可能不希望使用average='micro'来评估模型,因为即使这些类别在其类别上的结果较差,也会整体显示出较高的性能自己的。