在进行机器学习,深度学习任务时,经常会碰到数据不均衡的问题。如果数据严重失衡甚至会导致训练后的模型对任何样本都判别为训练数据中占比较多的一类。
1、算法改进
可以使用一些优化技巧让模型更加关注占比较少类的样本。从而使模型能专注学习此类的特征,而不是过多的关注样本数量较多的类别。例如使用focal loss。也有其他更多的解决类别不均衡的loss函数。
所有之前的方法注重数据,并保持模型不变。但实际上,假如模型适合于不均衡数据,那就不需要对数据重抽样。假如数据倾斜不是太严重,采用著名的XGBoost算法是一个很好的开始,因为它从内部确保训练的数据包不会是不均衡的。在算法内部,数据其实秘密地重抽样了。
设计一个成本函数,对小比例类别误分类的惩罚,要多于大比例类别的误分类,这可能会产生自然地倾向小比例类别进行泛化的模型。例如,调整SVM来通过同样的比率(占总样本的比例),去惩罚小比例类别的误分类。
2、聚类多类别
Sergey在Quora提出了一个优雅的方法 [2]。不再依赖随机抽样,去保留训练样本的多样性,他建议把大比例类别聚类进r个组,r是它里面的案例数。对于每个组,仅保留质心(聚类的中心)。然后模型仅用小比例类别和质心数据进行训练。
3、融合不同的重抽样数据集
成功泛化一个模型,最简单的方法是使用更多数据。问题是,现成的分类器,如逻辑回归或随机森林,倾向于通过抛弃掉小比例类数据进行泛化。一个简单的实践方法,是使用所有小比例类样本,和划分为n份的互斥大比例类样本,共同建立n个模型。例如保留 1000个小比例类别样本,对大比例类别随机抽样10,000个样本,你只需要把10,000个样本分为10份并训练10个不同的模型。
这方法很简单,并在水平方向完美的可扩展 (假如你有很多的数据),因为你可以在不同簇节点上训练并跑你的模型。模型融合泛化效果更好,这使得这方法易于处理。
4、不同的比率重抽样
上述方法,还可以通过调整小比例类别与大比例类别之间不同的比率来调优。最佳比率十分依赖于数据和使用的模型。但不要用同样的比率去训练 ensemble 里的所有模型,值得试着用不同比率模型融合。所以如果训练10个模型,一个模型使用1:1的比率(少类别:多类别)、另一个使用1:3、或2:1可能都合理。取决于模型,这会影响类别的权重。
5、恰当使用K-折交叉验证法
值得注意的是,当使用过抽样法来解决不均衡问题时,交叉验证法是需要合理应用的。过抽样法会提取出小比例类的观察数据 ,用拔靴法根据分布函数随机生成新数据。如果交叉验证法在过抽样后使用,基本上会让模型过拟合到一个特别的伪拔靴法结果。这就是为什么交叉验证应该在过抽样前完成,正如如何实现特征选择。只有当数据反复地重抽样,数据集才具有随机性来确保不会有过拟合问题。
6、生成对抗网络(GAN)
可以使用对抗生成网络生成虚假数据,来扩充数据集。
7、欠采样
对不均衡数据中样本较多的一类进行采样,使其约等于样本量较少的一类。但是,由于图像任务模型一般参数众多,要求更多的训练数据量。欠采样为了保证数据均衡,舍弃了部分数据。一般来说,不采用这种方式。
8、过抽样
对不均衡数据中样本减少的一类重复采样。常使用以下方法:
1)直接复制
相同的数据直接复制几份达到扩充数据的目的,但可能会导致过拟合,一般少用这种方式。
2)数据增强
数据增强一般有两种方式:静态数据增强和实时数据增强(动态数据增强)。静态数据增强就是对数据增强后直接加入训练集。实时数据增强是在训练过程中对每个batch的数据进行数据增强(数据随机性更大,更不易发生过拟合)。一般常使用实时数据增强的方式。在训练的过程中进行数据增强。
常使用以下三种变换进行数据增强:颜色变换、空间变换、噪声变换。
颜色变换:
- 随机调整亮度
- 对比度
- 颜色
- 饱和度
空间变换:
- 水平翻转
- 上下翻转
- 转置
- 小角度旋转
- 仿射变换
噪声变换:
- Gaussion噪声
- Poisson噪声
- Mask噪声
- 椒盐噪声
- 彩虹噪声
虽然tensorflow和Keras对集成了一些数据增强的方法。但还是推荐一个好用的数据增强的python包imgaug。以上说的图像数据增强的方法包里均有而且调用方便。功能很强大。具体使用方法网上很多。
参考:
处理不均衡数据(dealing with imbalanced data)