问题描述
不均衡数据是指用于分类的正负样本数量差异很大。导致不均衡样本主要有两种情况:
- 数据本身的内在属性,比如:信用卡欺诈、异常检测、大众中癌症病人的筛查等;
- 获取的数据不够,比如:车牌识别中的汉字。
不均衡数据相关的另一个问题是小样本问题。
处理内在不均衡
内在不均衡就是指数据本身特性决定了它的不均衡性。即使获取更多的数据,仍然改变不了数据的不均衡属性。
存在的问题
这类问题主要考虑数据对机器学习的算法本身的影响。样本总数都是$N$,不同比率的正负样本对学习算法有何影响?对学习速度、学习效果有何影响?
解决方案
- 基本的方法是必须采用科学的性能评价指标,比如采用$F_1$ Scorce,避免大样本类淹没了小样本类。对小样本类别的分类性能也能进行有效的评估。
- 异常检测也是处理这类不均衡样本的方法,只对大样本类别进行建模,小样本类当作异常数据进行检测。
- 对不同类别赋予不同重要程度的权值[1, P. 24],小样本赋予更大的权值[2]。
以下方法可行吗?
- 如果$1:10$算是均匀的话,可以将多数类分割成为$1000$份。然后将每一份跟少数类的样本组合进行训练得到分类器。而后将这$1000$个分类器用assemble的方法组合位一个分类器。
- 设计objective function的时候给不同misclassification的情况不同的relative weights。也就是说给从小数量的样本被分成大数量的样本更大的penalty。
处理外在不均衡
外在不均衡就是指数据本身特性并不能表明它是不均衡的,是由于数据获取手段导致数据不均衡。只要获取的数据足够多,这种不均衡就能消除。
存在的问题
从机器学习的理论来说,如果样本数$N$不够,$E_{out}$和$E_{in}$差异很大,无法学习成功,导致Low Bias问题。
解决方案
克服外在的不均衡性,需要获得更多的数据:
- 人工合成(伪造)数据;
- 采集更多的数据。
由于条件或成本限制,无法采集到足够的数据,在这样的情况下可以考虑人工合成。人工合成数据的前提是了解数据,拥有足够的先验知识。在OCR中,比如车牌识别时,采集到的数据可能不够,特别是有时汉字样本很少。此时,可以通过字库和随机背景融合的方法(通过叠加高斯噪声增大样本集对提升性能帮助不大),生成大量的数据。
更多的时候,没有足够的先验知识预知数据特性,无法合理伪造,还得采集跟多的数据。机器学习本来就是探究数据特性的过程。
不是问题的问题
对于内在不均衡的数据,若数据远离分类边界(比如线性可分的数据集),采用hard-margin的SVM和感知器,不均衡数据不影响分类结果。
在实际应用中,有时需要制造不均衡性,对不同类别数据采用不同权重,比如:AdaBoost对错分的数据赋予更大的权重,虚拟复制处理加权误差。
通过重采样将数据变得均衡不一定能提升分类性能,比如不能提升logistic回归性能,但对随机森林有效(但随机森林不适合用于不均衡数据)。
其它建议
@机器学习那些事儿发起过关于不均匀正负样本分布下的机器学习的讨论,部分建议摘录如下:
- 上采样、下采样、代价敏感,没什么好办法。
- 这个之前调研过,主要分重采样和欠采样!这种不平衡是因为比率的不平衡给一些学习方法带来问题。但是在某些领域,比如反欺诈和安全,不仅是比率极不平衡,而且是正样本样本绝对数很小。需要扩散正样本方法!
- Synthetic Minority Over-sampling Technique 我试过这个方法,解决部分问题,主要还是需要增加样本在特征空间的覆盖! 工程上光靠算法也解决不了问题,有的还是需要加入下经验知识来做。
- 用排序思想构造所谓的序对。
- 如果1:10算是均匀的话,可以将多数类分割成为1000份。然后将每一份跟少数类的样本组合进行训练得到分类器。而后将这1000个分类器用assemble的方法组合位一个分类器。记得读到的论文可行,但没有验证过。
- 标准解决方法:设计objective function的时候给不同misclassification的情况不同的relative weights。也就是说给从小数量的样本被分成大数量的样本更大的penalty。
- 训练数据与预测数据分布不一致,有专门研究的课题,sample selection bias,主要方法是各种reweighting。
- 这个倒是可以参考positive only learning等半监督学习中如早期的spy算法等来构造合适的负例来解决正负例不平衡的问题。
- 这个看起来像 one-class recommendation 问题,不知是否可以考虑转化成 learning to rank 问题,如果不是为了拟合一个分布的话。
- 这在机器学习里面被称类别不平衡问题,可以参考Haibo, H. and E. A. Garcia (2009). “Learning from Imbalanced Data.” Knowledge and Data Engineering, IEEE Transactions on” 的survey.已有很多方法提出。
- 个人觉得在类别不平衡条件下,Transductive SVM (TSVM)应该对于的active learning 来标注,可能结果更好。
- learning to rank对于训练数据量的要求较高,同时要确定用于learning to rank的pair,还是需要找到负例,从而将正例和负例形成偏序配对。所以learning to rank是一种方法,但个人认为这会将简单问题复杂化,且本质还是需要去找负例。
参考资料
- [1]H.-T. Lin, “Lecture 8: Noise and Error.” Coursera, 2014. [Online]
- [2]F. Pedregosa et al., “Scikit-learn: Machine Learning in Python,” Journal of Machine Learning Research, vol. 12, pp. 2825–2830, 2011. [Online]