数据--样本不平衡处理
不同类别的样本量差异大,或少量样本代表了业务的关键数据,属于样本不平衡的情况,要求对少量样本的模式有很好的学习。
大数据情况下:整体数据规模大,小样本类别占比少,但是小样本也覆盖大部分或全部特征;
小数据情况下,整体数据规模小,小样本类别也少,导致样本特征分布不均匀。
一般比例差异超过10倍就要注意,超过20倍就得处理
工程方法中,通常从三个方面处理样本不均衡:
扩大数据集,但是在扩大小样本比例的时候,大样本也在增加,通过获取更多少量样本数据,尽可能扩大这些少量样本的数据集。
1、数据相关处理:欠采样和过采样,欠采样又称为下采样,过采样又称为上采样。实现简单,速度快
对大样本(超过1w或10w)进行欠采样,放弃一部分大样本数据;
对小样本(小于1w)进行过采样,相当于添加部分小样本的副本。
上采样
通过增加分类中少数样本的数量实现样本均衡,通常做法是在少数样本中加入随机噪声、干扰数据或通过一定规则产生新的合成样本。
ADASYN采样
样本较少的类生成合成数据,其生成的数据与更容易学习的样本相比,更难学习,.基本思想是根据学习难度不同,对不同少数类样本使用加权分布,其中,更难学习的少数类样本比那些更容易学习的少数类样本要产生更多的合成数据。ADASYN通过两种方式:减少由于类别不平衡带来的偏差。自适应地将分类决策边界转移到困难的例子。
SMOTE方法
基本思想是对于少数类别样本进行分析模拟,将人工模拟的新样本添加到数据集中。具体实现先找出一个正样本(少数),采用 KNN 算法找到该正样本的 K 个邻近,并随机从 K 个邻近中选出一个样本,最后再正样本和选中的随机样本之间连线上,随机选取一个点,作为人工合成的新正样本。合成后所有类别样本数量相当。
缺点:无法克服非平衡数据集的数据分布问题,容易产生分布边缘化问题。
SMOTE代码
from imblearn.over_sampling import SMOTE
print("Start over-sampling")
X_train, y_train = SMOTE().fit_resample(X_train, y_train)
下采样
减少分类中多数样本的数量实现样本均衡,通常做法是对样本进行聚类。
本项目采用 imblearn 的 ClusterCentroids 算法,本质上是一种原型生成 (Prototype generation) 的方法,对多数类样本采用 K-means 算法生成 N 个簇样本中心,并且通过样本中心合成新的样本,替代原始样本。新的多数类样本数将与少数类样本数达到平衡。
from imblearn.under_sampling import ClusterCentroids
print("Start under-sampling")
cc = ClusterCentroids()
X_train, y_train = cc.fit_resample(X_train, y_train)
过采样和欠采样结合
由于过采样容易导致过拟合,欠采样容易丢失有效信息,因此结合两种方法进一步削弱二者的缺点。这里采样 SMOTEENN 算法,先采用 SMOTE 算法进行过采样,再采用欠采样保留能够体现各类别特征的样本。其中 ENN (Edited Nearest Neighbours) 算法是基于 K 最近邻算法编辑数据集,找出与邻居不友好的样本然后移除,从而实现数据平衡。
from imblearn.combine import SMOTEENN
print("Start over-sampling and under-sampling")
sme = SMOTEENN()
X_train, y_train = sme.fit_resample(X_train, y_train)
采用深度学习模型
前面的方法采用的都是机器学习模型,机器学习方法需要对输入内容做具体特征工程。而深度学习方法将输入文本映射成高维的词向量,并通过深度学习模型从词向量中自动提取特征。
2、模型相关处理:引入有倚重的模型算法,针对少量样本着重拟合,提升对少量样本特征的学习;或者选择对数据分布不敏感的算法,如“树模型”
3、评价指标相关处理:如 G-mean/MacroP/MicroP等。对于数据极端不平衡时,可以观察不同算法在同一份数据下的训练结果的precision和recall,建议更多的使用PR曲线。避免只使用AUC,很容易因为AUC值过高忽略,如果对少两个样本的效果并不理想的情况。
注意:在进行相对应的采样方法后,要尽可能保持训练集和测试集分布一致。