在严重的类不平衡的情况下如何最好地估计混淆矩阵的系数?

数据挖掘 机器学习 分类 统计数据 贝叶斯 混淆矩阵
2021-09-15 19:28:35

我有一个训练有素的二元分类器(忘记它是如何训练的,并将其视为一个神奇的黑匣子),我想在一个严重不平衡的人口/测试数据集上测量它的分类性能(例如计算混淆矩阵)。假设总体/测试集的组成(就两个类而言)也是已知的——比如类的 99%A与 1%B.

我还想尽可能减少在整个(大)测试集上计算的混淆矩阵的估计系数的不确定性,在最大的预测约束下N测试集的示例(假设预测运行成本很高)。

这样做的最佳方法是什么?

我能想到的最好的事情是做一些像“分层抽样”这样的事情:

  1. 我从我的测试集(为简单起见任意大)创建了一个平衡样本 N/2 属于的例子 AN/2 属于的例子 B.
  2. 我在平衡数据集上运行分类器,并计算得到的混淆矩阵。
  3. 我将如此获得的混淆矩阵“归一化”,使其行总和为 1,获得 C^.
  4. 估计大型代表性样本上的混淆矩阵(比如 M 从我的大型测试集中获取的项目)我计算

C=(0.99M000.01M)C^

PS:真的很高兴,我还想估计最终混淆矩阵的分量的不确定性C. 为此,我可以只计算例如系数的可信区间吗?C^ 从平衡样本开始,并使用以下定义“重新调整”它们 C 上面给出的?

奖励曲目:如果有人可以向我发送有关如何进行某种“功率测试”的参考(例如“应该多大 N 是“括号”的值 C 在给定的紧密间隔内?”)我很乐意审查它。

奖金² 跟踪:也欢迎任何关于如何将不确定性估计扩展到非二元分类器(超过 2 个类)的提示! ¨

1个回答

引入了许多有用的指标来评估不平衡数据集的分类方法的性能。其中一些是KappaCENMCENMCCDP等。

免责声明:

如果您使用 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"]

>>> score = cm.Kappa