1、清洗
去除脏的数据,比如某些商品的刷单数据,缺省值多的数据,异常数据,一般情况下直接舍弃。
结合业务情况
比如去除crawler抓取,spam,作弊等数据
采用异常点检测算法
偏差检测:聚类、最近邻等
基于统计的异常点检测:例如极差,四分位数间距,均差,标准差等。
基于距离的异常点检测:与大多数点之间距离大于某个阈值的点视为异常点,主要使用的距离度量方法有绝对距离 ( 曼哈顿距离 ) 、欧氏距离和马氏距离等方法。
基于密度的异常点检测:考察当前点周围密度,可以发现局部异常点,例如LOF算法。
2、采样
采集清洗后,样本分布不均衡,要进行采样。
问题根据难度从小到大排个序:大数据+分布均衡<大数据+分布不均衡<小数据+数据均衡<小数据+数据不均衡。说明小数据集是机器学习比较头疼的问题。
有两种方法:
(1)从数据的角度出发,主要方法为抽样,既然我们的样本是不平衡的,那么可以通过某种策略进行抽样,从而让我们的数据相对均衡一些;
(2)从算法的角度出发,考虑不同误分类情况代价的差异性对算法进行优化,使得我们的算法在不平衡数据下也能有较好的效果。
数据角度
有两种类型:又放回和无放回。
(随机欠采样)下采样:从多数类中的样本中选择少数样本与少数类中的样本组合成均衡的数据集。
(随机过采样)上采样:多次有放回的从少数类样本中抽取数据集,与多数类样本集组成均衡的数据集。
存在的问题:
- 会造成信息丢失,未被采样的样本可能包含了很重要的信息,模型可能只学习到了一部分;
- 对少数类上采样时,形成的新的数据集里面可能会有很多重复的样本,这样容易造成过拟合现象;
- 上采样把少数类样本复制了多份,一个点在高位空间中反复出现,会导致一个问题,运气好分对很多点,运气差这些点全部分错。解决这个问题可以再生成新的数据点是加入一些轻微的随机扰动。
- 要结合交叉验证!!
算法角度
数据合成
数据合成方法是利用已有样本生成更多样本,这类方法在小数据场景下有很多成功案例,比如医学图像分析等。
常见的一种方法是SMOTE,利用小样本在特征空间的相似性来生成新样本:对于一个小众样本x,从它的k近邻中随机选一个样本点x',生成一个新的样本点xnew = x + (x' - x) × δ;其中这个δ∈[0,1]是个随机数。
SMOTE为小众样本合成相同数量的新样本,但也带来一些潜在问题:(1)增加了类之间重叠的可能性;(2)生成一些没有提供有效信息的样本。为了解决这个问题,出现两种方法:Borderline-SMOTE与ADASYN。
Borderline-SMOTE的解决思路是找那些应该用于合成新样本的小众样本。这种小众样本的特点是:它的周围(k近邻超过一半的)大部分是大众样本,因为这种样本往往是边界样本。
加权
对不同的类别,分错的代价不同。
难点在于如何合理的设置权重。实际应用中让各个分类间的加权代价值近似相等。不是通用,还是要具体问题具体分析。
一分类
对于正负样本极不平衡的场景,我们可以换一个完全不同的角度来看待问题:把它看做一分类(One
Class Learning)或异常检测(Novelty
Detection)问题。这类方法的重点不在于捕捉类间的差别,而是为其中一类进行建模,经典的工作包括One-class SVM等。
经验之谈
1、在正负样本都非常之少的情况下,应该采用数据合成的方式;
2、在负样本足够多,正样本非常之少且比例及其悬殊的情况下,应该考虑一分类方法;
3、在正负样本都足够多且比例不是特别悬殊的情况下,应该考虑采样或者加权的方法。
4、采样和加权在数学上是等价的,但实际应用中效果却有差别。尤其是采样了诸如Random Forest等分类方法,训练过程会对训练集进行随机采样。在这种情况下,如果计算资源允许上采样往往要比加权好一些。
5、另外,虽然上采样和下采样都可以使数据集变得平衡,并且在数据足够多的情况下等价,但两者也是有区别的。实际应用中,我的经验是如果计算资源足够且小众类样本足够多的情况下使用上采样,否则使用下采样,因为上采样会增加训练集的大小进而增加训练时间,同时小的训练集非常容易产生过拟合。
6、对于下采样,如果计算资源相对较多且有良好的并行环境,应该选择Ensemble方法。