不平衡类问题

数据挖掘 Python 多类分类
2022-03-06 05:53:45

我有一个包含 4 个类的数据集,实例数量如下:

  • 0类:13175
  • 第一类:82
  • 2级:75
  • 第三类:121

已经应用了Python 不平衡学习 API中的几种子采样和过采样方法,但没有一个对所有类都有良好的性能。我已经申请:

  • 欠采样:CondensedNearestNeighbour、EditedNearestNeighbours、NeighbourhoodCleaningRule、RandomUnderSampler。
  • 过采样:SMOTE、ADASYN
  • 我的网格搜索中的 class_weight:['balanced'] 参数选项
  • costcla库,但它不能与两个以上的类一起使用。

而我没有成功。你能为这个问题提出一个解决方案吗?

3个回答

我认为你处于一个相当困难的状态。我认为您使用的类不平衡技术很好。我建议您尝试以分层分类的方式来构建您的问题。

1级分类器

类别 0 和类别 (1 + 2 + 3) 之间的分类器_A

注意:在这里应用各种类不平衡方法以获得良好的准确性

2级分类器

1 类、2 类、3 类之间的分类器_B

最终的伪模型

if predict_classifier_A(x_test) == "class 0": result = "class 0" else: result = predict_classifier_B(x_test)


我不确定它是否有效,但值得一试。让我们知道它是否工作得更好。

如果以上都失败了,我会试试这个:

  1. 适合每个班级的模型。所以你有四个模型,每个模型都专门用于那个特定的类。
  2. 我会尝试任何集成建模技术 - 适合多个模型并以智能方式组合它们。
  3. 复杂的方法,例如神经网络(我听说 GAN 近来很流行,结果令人印象深刻)。但这可能是矫枉过正。

如果这些都不起作用,则可能只是您的数据无法以任何方式分离。我建议制作一些基本图并计算一些简单的统计数据,以更好地理解数据及其可分离性。

虽然,存在上采样、下采样等采样技术来解决这种不平衡类问题。Smote 采样也有多种包装可供选择。另一种有用的技术是为不同的观察值分配权重(根据数据中的频率),这样次要类就不会被建模为噪声(通常次要类被赋予更多的权重来指导模型,次要类是有价值的,而不是异常值或噪音)。虽然对于分类器来说总体准确率会很高,但对于次要类来说,误分类错误非常高。R 中的 CARET 包可帮助您准备一个基本框架来处理此类不平衡问题。使用 CreateDataPartition 函数,您可以生成分层数据集。请在 R 文档中探索这个包。

我建议将四个类分成大小相等的块,并制作一个数据集,该数据集在一个数据集中具有相同的类表示。那么不同的数据集将重新表示次要类别,但数据集将具有分层抽样。然后可以将这些数据集分为训练集和测试集进行交叉验证。我们可以通过平均(比如 10 倍)得到泛化误差。交叉验证。对于超参数调整的第二步,可以执行内部交叉折叠验证以提高模型的预测性能。