关于样本不均衡的解决
- 相关实践: 某次比赛中, 训练集中正负样本数量分别为20663和569877,占比分别为3.499%和96.501%, 差别很大
基于数据的解决方案
过采样
- 增加负样本的数量
- 简单复制样本多次: 容易过拟合,模型变得复杂
- 使用SMOTE算法采样: 对少数样本集\(S_{min}\)中的每一个样本 \(x\),从他的K近邻中随机选取一个样本\(y\), 然后在 \(x, y\) 之间随机选取一个新的点作为新合成的样本
- 能降低过拟合风险
- 需要一个样本间距离定义的函数,且对于少数样本多时选取最近邻的复杂度太大
- 由于为每个样本都采样了,所以可能会增大类间重叠度(生成的样本可能是符合多数样本类别的,很容易造成生成没有意义甚至是噪声)
- 使用Borderline-SMOTE算法优化SMOTE算法:
- 只在分类边界上的少数样本进行采样
- 使用ADASYN算法优化SMOTE算法:
- 给不同的少数类样本合成不同个数的新样本
负采样
- 减少正样本数量,让分类器更重视负样本
- Easy Ensemble算法: 每次从 \(S_{maj}\) 中随机抽取子集 \(E\), 然后用 \(E + S_{min}\), 最后融合多个分类模型的结果
- 融合模型时简单的可以对模型输出做均值(评估方式为AUC分数)或者投票(评估方式为分类精度)
- Balance Cascade算法: 级联结构, 在每一级中从 \(S_{maj}\) 中随机抽取子集 \(E\), 然后用 \(E + S_{min}\) 训练当前级的分类其,然后将 \(S_{maj}\) 能正确被当前分类器正确分类的样本剔除, 剩下不能正确分类的样本进行下一级操作,重复若干次后得到级联结构,最终的输出结果是各级分类器结果的融合
- 这里有点像是Boosting方法,对样本权重进行修改,使得模型更重视上次分类错误的样本
- Easy Ensemble算法: 每次从 \(S_{maj}\) 中随机抽取子集 \(E\), 然后用 \(E + S_{min}\), 最后融合多个分类模型的结果
基于算法的解决方案
- 修改模型的训练目标函数
- 比如使用 AUC_ROC 的负数作为损失函数
- 深度学习中可以使用Focal Loss代替传统的SGD
- 也可以将问题转化为基于单类学习的异常检测问题
- 单类学习(One Class Learning), 异常检测(Anomaly Detection) *
- 单类学习(One Class Learning): 训练数据只有一个类别,学习一个能够远离这个类别样本的Boundary,比如
- 单类别SVM(One Class SVM)
- K近邻非参数方法
- 单类学习(One Class Learning): 训练数据只有一个类别,学习一个能够远离这个类别样本的Boundary,比如
一个重要的特殊说明
- 在深度神经网络中,如果样本类别不平衡,不要使用BN, 否则会出现问题