不平衡多classclass化应该考虑用什么方法来评价?

Which method should be considered to evaluate the imbalanced multi-class classification?

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

          Injury

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

我使用参数为 "class_weight='balanced' " 的随机森林算法来管理 class 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 

对于平均值='macro',结果如下。

        [[   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

那么,我应该考虑哪些结果来评估模型?如果非要考虑宏观的话,那我的模型性能真的很差。请问有什么方法可以提高precision、recall和AUC score吗?

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

如有任何帮助,我们将不胜感激。

谢谢。

与大多数数据科学相关的问题一样,"which one is better" 的答案归结为 "it depends"。每个 class 单独取得良好表现很重要吗?还是您更关心获得良好的整体性能?

当您设置 average='micro' 时,您测量的是算法在 class 中的整体性能。例如,要计算精度,您可以添加所有真阳性预测并除以所有真阳性和所有假阳性,使用您的数据将是:

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

结果是0.81106。但是,当您查看详细信息时,您会注意到对于每个 classes,每个 class 中的精度计算都存在很大差异,并且精度计算主要由 No Injury class:

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

当您设置 average='macro' 时,您是在对每个 class 的精度计算进行平均,并消除不平衡 class 的影响。当 average='macro' 为:

时,使用高于整体精度的计算 class 精度
(0.0312 + 0.1409 + 0.8985) / 3 = 0.356

请注意,这里的输入是对每个人 class 的精度计算,并且每个输入的权重相等。因为 No InjuryMedium Injury classes 的精度得分要低得多,并且由于您要消除不平衡 classes 的影响,所以 macro 精度将是更低。

所以,哪个更好取决于对您和您的用例来说什么是重要的。如果您关心确保将大多数情况(无论 class)分配给正确的 class,那么 average='micro' 是要使用的指标,但请注意,这样做的结果将是在您的示例中被单个 class 淹没。如果 "Severe" 或 "Medium" 类别最重要,那么您可能不想使用 average='micro' 评估您的模型,因为即使结果不佳,总体上也会显示出高水平的性能这些 class 是独立的。