【问题标题】:Which method should be considered to evaluate the imbalanced multi-class classification?应该考虑哪种方法来评估不平衡的多类分类?
【发布时间】:2019-04-11 07:44:50
【问题描述】:

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

          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 

对于average = '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 分数是相同的。我如何在项目中证明这一点?

任何帮助将不胜感激。

谢谢。

【问题讨论】:

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


    【解决方案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' 评估您的模型,因为即使这些类别本身的结果很差,总体上也会显示出高水平的性能。

    【讨论】:

    • 非常感谢您的详细解释。我对中度和重度伤害感兴趣。但是单个类的精度 0.0312 , 0.1409 非常低。总分也很低,0.35。是否有可能提高这些分数?或者将这些低值视为我项目的最终结果是否可以?我只有有限的时间来完成这个项目。非常感谢任何建议。注意:我已经尝试过 SMOTE 采样和使用不同算法的集成交叉验证,但我最终的精度和召回分数低于 50。
    • 您可以尝试“One-Versus-All”方法,分别为每个类拟合/调整单独的随机森林,然后将这些估计器组合在一起以做出最终预测。
    猜你喜欢
    • 2018-10-14
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 2017-06-10
    • 1970-01-01
    • 2021-01-16
    • 2012-11-21
    相关资源
    最近更新 更多