我有一个分类问题的数据集,总共有50个类别。
Class1: 10,000 examples
Class2: 10 examples
Class3: 5 examples
Class4: 35 examples
.
.
.
and so on.
我试着用支持向量机(包括线性核和高斯核)来训练分类器。然而,测试数据的准确率很低,分别只有65%和72%。现在我正在考虑使用神经网络。你有没有对于大型不平衡数据集的机器学习模型和算法的建议?这对我来说非常有帮助。
我有一个分类问题的数据集,总共有50个类别。
Class1: 10,000 examples
Class2: 10 examples
Class3: 5 examples
Class4: 35 examples
.
.
.
and so on.
我试着用支持向量机(包括线性核和高斯核)来训练分类器。然而,测试数据的准确率很低,分别只有65%和72%。现在我正在考虑使用神经网络。你有没有对于大型不平衡数据集的机器学习模型和算法的建议?这对我来说非常有帮助。
处理不平衡数据集有多种方法,您可以尝试:
我建议使用上采样或提供类权重来平衡它
您应该考虑您的性能指标,不要使用准确度作为您的性能指标,您可以使用对数损失或任何其他适当的指标
https://machinelearningmastery.com/failure-of-accuracy-for-imbalanced-class-distributions/
从我的经验来看,处理不平衡类的最成功方法是:
改变输入数据的分布:20000个样本(您拥有的大约例子数量)并不是很多,因此您可以通过多次使用来自较少频繁类别的每个样本来更改数据集分布。根据类别数量,您可以在训练集中将它们的示例数设置为例如6000或8000个。在这种情况下,请记住不要更改测试和验证集的分布。
增加训练时间:对于神经网络,当无法更改输入分布时,我强烈建议您尝试学习相当长的时间(例如1000个epochs)。在这种情况下,您必须记住正则化。我通常使用dropout和l2权重正则化器,其参数由随机搜索算法学习。
减小批量大小:在神经网络的情况下,减小批量大小可能会导致在较不频繁的类别上提高性能。
更改损失函数:使用MAPE而不是Crossentropy也可以提高较不频繁类别的准确性。
欢迎尝试不同的方法组合,例如随机搜索算法。
欠采样可能会因为移除数据而丢失重要的信息。过度采样可能会导致在训练数据上过拟合,特别是如果少数类的添加副本是现有数据的复制品。已经开发了许多复杂的取样技术来缓解这些风险。
其中一种技术是两阶段学习。您首先在重新采样的数据上对模型进行训练。通过随机地对大类进行欠采样直到每个类只有 N 个实例,就可以获得这些重新采样的数据。然后在原始数据上对模型进行微调。
另一种技术是动态采样:在训练过程中对表现不佳的类进行过度采样,对表现优秀的类进行欠采样。该方法由 Pouyanfar 等人引入,旨在向模型展示它尚未学习的内容。
参考文献: