1随机降采样
操作:
直接随机sample,亦或是直接截取topN%的数据。
注意:
模型训练预测时,先做特征再采样再集成。
适用场景:
数据量是巨大时进行使用(几十亿)
2 Tomek Links采样
操作:
python的imblearn中有TomekLinks采样。
注意:
无
适用场景:
模型训练:该方法一般个人很少在数据分析时使用,往往是在模型训练的时候,Tomek Links会将决策边界附近的样本剔除,整理出一个看上去更加易于分割的决策边界。在模型训练的时候有尝试过,效果略有下降,有兴趣的朋友可以自己尝试一下。
3 基于聚类中心的采样
操作:
python的imblearn中有ClusterCentroids采样。
注意:
无
使用场景:
数据分析:该方法思路很简单,就是先聚类然后用聚类中心作为采样的点代表整个类中的样本,比如100个样本聚类成了10个,那么就可以用10个点来代表这100个样本,从而达到降采样的作用。一般用作数据分析可视化相对较好,用于模型训练可能效果会差一些。
4 时间序列采样
操作:
直接按照某个特定的时间轴进行切分即可,选择python里面也有TimeSeriesSplit等函数。
注意:
某些特殊节假日等数据考虑剔除最好。
使用场景:
时间验证分析:几乎所有涉及到时间的问题,例如推荐问题,销量预测,流量预测等问题在线下验证的时候都需要按照时间顺序进行划分,因为存在较强的时间关系,如果使用未来的信息肯定会导致穿越问题,带来线上线下不一致,导致所有线下的实验都是白努力。所以如果应用在工业实践中,必须在做任何特征工程之前就将数据进行拆分,然后再进行特征建模。
5 分组采样
操作:
目前python的采样策略中已经有现成的分组采样包GroupKFold,直接调用即可。
注意:
无
使用场景:
防止穿越:也可以认为是防止穿越的一种,例如我们用户一次在一个页面中只会点击一个商品,而如果我们随机采样线下训练验证的话,就会出现一个页面中的不同item被分配到训练集和验证集中,这个时候我们只要发现训练集中的item有被点击的情况,那么在验证集中的样本肯定就是没有点击的,而这明显是出现了穿越,出现了我们的验证分数虚高的情况,所以此时按照页面进行分组采样时更好更靠谱的选择。
6 分层采样
操作:
目前python的采样策略中已经有现成的分层采样包,直接调用即可。
注意:
无
使用场景:
数据验证:举个例子,训练集合有三个城镇的数据,A城镇有100万样本,B城镇有10万样本,C城镇有1万样本,测试集的比例类似。这个时候我们需要对其进行分析验证,如果随机采样训练验证,会出现我们把C城镇的样本全部采样到了训练集合里面,那么此时我们的验证的分数和测试的分数相差较大,而且五折的时候因为采样的问题折折的gap也不是很稳定。这个时候分层采样就十分重要了。
7 简单过采样
操作:
很简单,直接random一定比例拷贝即可。
注意:
过采样不同的比例训练模型预测再进行集成往往效果更好。
使用场景:
类别不平衡:过采样一般出现在类别不平衡问题中,对label较少的样本进行过采样,用来降低过拟合的风险。
8 SMOTE过采样
操作:
目前python自带SMOTE函数,直接调用即可。
注意:
无
使用场景:
类别不平衡:很简单过采样类似, SMOTE过采样也经常出现在类别不平衡问题中,通过与类别少的样本最近的K个近邻点构建相似的样本,来缓解类别不平衡的问题,降低过拟合的风险。不过很多实验证明,SMOTE采样最终的训练效果要略好于随机的复制形式的过采样。
9 参考文献
Dealing with Imbalance Data:https://medium.com/@patiladitya81295/dealing-with-imbalance-data-1bacc7d68dff
Resampling strategies for imbalanced datasets:https://www.kaggle.com/rafjaa/resampling-strategies-for-imbalanced-datasets
https://mp.weixin.qq.com/s/K1QrGPxIM9ZWmifsPM1t0g