不平衡数据集的性能不佳

数据挖掘 支持向量机 阶级失衡 matlab
2022-02-21 12:16:16

考虑一个数据集A,其中包含用于训练二进制分类问题的示例。由于数据集高度不平衡,我使用了 SVM 并应用了加权方法(在 MATLAB 中)。我已将权重应用为与每个类中数据的频率成反比。这是在训练中完成的。我使用了 10 折交叉验证进行训练。训练后,我得到了混淆矩阵A

80025 1
0 140

其中第一行是多数类,第二行是少数类。只有 1 个假阳性 (FP),并且所有少数类示例都已正确分类,给出真阳性 (TP) = 140。

问题:我使用更多数据点再次训练。B然后,我在训练期间从未见过的新的看不见的测试数据集上运行经过训练的模型。这是用于测试的混淆矩阵B

50075 0
100 0

可以看出,少数类根本没有被分类,因此权重的目的已经失效。虽然没有 FP,但 SVM 无法捕获少数类示例。我没有在 . 上应用任何重量或平衡方法B什么可能是错误的以及如何克服这个问题?

2个回答

尝试重新采样您的数据集

一种选择是减少训练集中多数类的发生率。

另一种选择是对少数类进行过度抽样。(您可能需要添加一些噪音)

其他想法:尝试更改您的绩效指标

该页面在不平衡数据方面帮助了我很多: Combat Imbalanced Classes in Your Machine Learning Dataset

为了建立 Ludo 的答案,以及他们提供的链接:Combat Imbalanced Classes in Your Machine Learning Dataset,您还可以尝试以下操作:

  • 将问题视为异常检测。有不同的监督和无监督方法可以做到这一点,但一个例子是一类 SVM,如本文所述。
  • 为 SVM 使用内核。是否有一些高维空间可以用来进一步区分少数类和多数类?
  • 尝试不同的算法。我相信随机森林对于不平衡的数据集应该是非常好的,因为它们尝试直接关注类熵。

很难说哪种方法最有效,因此值得尝试各种不同的方法,看看哪种方法最适合您的问题。