我正在处理多类不平衡数据。我的因变量是高度偏斜的。
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
对于平均值="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
那么,我应该考虑哪些结果来评估模型呢?如果我必须考虑宏,那么我的模型性能真的很差。请建议是否有任何方法可以提高精确度、召回率和AUC评分?
如果我考虑微观结果,我的准确度、召回率、f1得分是一样的。我如何在项目中证明这一点?
如有任何帮助,我们将不胜感激。
谢谢。
与大多数数据科学相关的问题一样,"哪一个更好"的答案可以归结为"取决于"。每个班级都有良好的表现是否重要?还是你更关心获得良好的整体表现?
当您设置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 Injury
和Medium Injury
类的精度分数要低得多,而且由于您正在消除不平衡类的影响,所以macro
的精度会更低。
所以,什么更好取决于什么对你和你的用例来说是重要的。如果你关心的是确保大多数情况,无论类如何,都被分配给正确的类,那么average='micro'
是要使用的度量,但请注意,这样做的结果将被你的例子中的一个类淹没。如果"严重"或"中等"类别是最重要的,那么您可能不想使用average='micro'
来评估您的模型,因为即使这些类别本身的结果很差,总体上也会显示出高水平的性能。