1、最好的办法是获得更多的数据
2、换个评价标准,有一些评判指标就是专门解决样本不平衡时的评判问题的,如准确率,召回率,F1值
3、重新采样,少的重复采样,多的抽样,或者加入惩罚权重,多的权重小,少的权重大,这就跟梯度提升类似吧
梯度提升AdaBoost会把误分类样本加大权重,在表决中其较大作用
4、换个对数据平衡性要求不那么大的机器学习算法,例如决策树
5、修改算法。。。
合成样本
增加样本数目较少的那一类的样本,合成指的是通过组合已有的样本的各个feature从而产生新的样本。
一种最简单的方法就是从各个feature中随机选出一个已有值,然后拼接成一个新的样本,这种方法增加了样本数目较少的类别的样本数,作用与上面提到的Over-sampling方法一样,不同点在于上面的方法是单纯的复制样本,而这里则是拼接得到新的样本。
改变样本权重
改变样本权重指的是增大样本数较少类别的样本的权重,当这样的样本被误分时,其损失值要乘上相应的权重,从而让分类器更加关注这一类数目较少的样本。
调整对正负样本的采样方法
通过过抽样和欠抽样解决样本不均衡抽样是解决样本分布不均衡相对简单且常用的方法,包括过抽样和欠抽样两种
过抽样(也叫上采样、over-sampling)方法通过增加分类中少数类样本的数量来实现样本均衡,最直接的方法是简单复制少数类样本形成多条记录,这种方法的缺点是如果样本特征少而可能导致过拟合的问题;
欠抽样(也叫下采样、under-sampling)方法通过减少分类中多数类样本的样本数量来实现样本均衡,最直接的方法是随机地去掉一些多数类样本来减小多数类的规模,缺点是会丢失多数类样本中的一些重要信息。
总体上,过抽样和欠抽样更适合大数据分布不均衡的情况,尤其是第一种(过抽样)方法应用更加广泛。
通过正负样本的惩罚权重解决样本不均衡
对于分类中不同样本数量的类别分别赋予不同的权重(一般思路分类中的小样本量类别权重高,大样本量类别权重低),然后进行计算和建模。
使用这种方法时需要对样本本身做额外处理,只需在算法模型的参数中进行相应设置即可。很多模型和算法中都有基于类别参数的调整设置,以scikit-learn中的SVM为例,通过在class_weight : {dict, 'balanced'}中针对不同类别针对不同的权重,来手动指定不同类别的权重。如果使用其默认的方法balanced,那么SVM会将权重设置为与不同类别样本数量呈反比的权重来做自动均衡处理,计算公式为:n_samples / (n_classes * np.bincount(y))。如果算法本身支持,这种思路是更加简单且高效的方法。
通过组合/集成方法解决样本不均衡
每次生成训练集时使用所有分类中的小样本量,同时从分类中的大样本量中随机抽取数据来与小样本量合并构成训练集,这样反复多次会得到很多训练集和训练模型。最后在应用时,使用组合方法(例如投票、加权投票等)产生分类预测结果,这种解决问题的思路类似于随机森林。
在随机森林中,虽然每个小决策树的分类能力很弱,但是通过大量的“小树”组合形成的“森林”具有良好的模型预测能力。如果计算资源充足,并且对于模型的时效性要求不高的话,这种方法比较合适。
参考: https://www.zhihu.com/question/63687805