数据不平衡问题的处理
2016-05-09 00:36
246 查看
引言
在分类问题中正负样本比例不平衡是很常见的问题,例如在预测CVR的时候,会有大量的负例,但是正例的数目缺不多,正负样本比例严重失衡。这是一个值得思考的问题。解决思路
首先我们需要思考的是我们可否通过扩大数据集,得到更多的比例较小的样本,使新的训练集样本分布较为均衡,如果可行的话,那么这种方法值得我们考虑。若不可行的话,可以试着从如下两个角度出发考虑:
数据的角度
算法/模型的角度
数据的角度
故名思议,从数据的角度出发就是,想办法使得数据的比例较为均衡,可以做的是对数据进行采样。欠采样
过采样
欠采样和过采样都是随机采样,欠采样选择少量的多数类样本与少数类样本构成新的训练样本,但是若少数类样本确实太少的话,不建议使用这种方法,虽然使得样本整体的比较均衡,但是会由于样本数太少会导数信息缺失,让某些特征的不能很好的表现出来,使得欠拟合。过采样相反,是在少数类样本中做随机采样,扩大少类样本的数量,但是由于数据量的提升使得训练过程的计算量增加,也可能导致过拟合问题。
EasyEnsemble算法
考虑到欠采样可能导致信息缺失的缺点,我们提出了一种集成学习的方法–EasyEnsemble算法算法原理:
从多数类中有放回的随机采样n次,每次选取与少数类数目近似的样本,那么可以得到n个样本集合记作{S1,S2,...,Sn},然后其中的每一份与少数类样本结合组成n训练样本{D1,D2,...,Dn},然后再每一个训练集上得到一个模型,最后取这n个模型的均值
SMOTE算法
考虑到过采样可能导致过拟合的缺点,提出了一种合成少数类过采样技术—SMOTE算法算法的原理:
对少数类的样本做KNN算法,求出他的K近邻为Sknn,然后从这K个邻居中选择若干样本,若少数类的样本为x,从K近邻中选择的样本为,x′
xnew=x+rand(0,1)∗(x′−x)
注意点:
求KNN的时候是对全集S上求而并不是仅选出x 在少数类集的K近邻。
x应该选少数类边界上的一些数据,即K2<S∩Sknn<K
其他的一些方法
换一种思路,将少数类样本看成异常,将其转换成一个异常检测的问题,异常检测算法的角度
重构训练集的方法。不改变已有算法,而是根据样本的不同错分代价给训练集中的每一个样本赋一个权值,接着按权重对原始样本集进行重构。引入代价敏感因子,设计出代价敏感的分类算法。通常对小样本赋予较高的代价,大样本赋予较小的代价,期望以此来平衡样本之间的数目差异。
代价敏感学习方法
数据不平衡情况下的评估指标
在数据不均衡情况下我们如果参考准确率,和召回率的话不能很好的衡量模型的性能。我们可以参考一下几个指标:
AUC - 链接
F值
总结
这其实都是一些方法论的东西,具体的选择哪一种方法,还要依据实际的情况来定,希望能够活学活用。参考资料
SMOTE算法EasyEnsemble算法
大牛的分析1
大牛的分析2
专业的数术语
相关文章推荐
- 康诺云推出三款智能硬件产品,为健康管理业务搭建数据池
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- MySQL中使用innobackupex、xtrabackup进行大数据的备份和还原教程
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析