一、什么是数据不平衡问题
数据不平衡也可称作数据倾斜。在实际应用中,数据集的样本特别是分类问题上,不同标签的样本比例很可能是不均衡的。因此,如果直接使用算法训练进行分类,训练效果可能会很差。
二、如何解决数据不平衡问题
解决实际应用中数据不平衡问题可以从三个方面入手,分别是:对数据进行处理、选择合适的评估方法和使用合适的算法。
数据处理
1)过采样: 主动获取更多的比例少的样本数据。由于样本比例不均衡,在条件允许的情况下可以尝试获取占比少的类型的样本数据。(PS:这就是为什么我几乎没有遇到过数据不平衡的问题。每次测试使用的数据集都尽可能的完美均衡) 也可以通过使用重复、自举或合成少数类过采样等方法(SMOTE)来生成新的稀有样品。 直接简单复制重复的话,如果特征少,会导致过拟合的问题。经过改进的过抽样方法通过在少数类中加入随机噪声、干扰数据或通过一定规则产生新的合成样本 (数据增强)。
2)欠采样: 数据量足够时,可以通过保留比例小的样本数据和减少比例大的样本数据来平衡数据集。缺点是会丢失多数类中的一些重要信息。
3)改变权重: 对不同样本数量的类别赋予不同的权重(通常会设置为与样本量成反比)
4)使用K-fold交叉验证:值得注意的是,使用过采样方法来解决不平衡问题时应适当地应用交叉验证。这是因为过采样会观察到罕见的样本,并根据分布函数应用自举生成新的随机数据,如果在过采样之后应用交叉验证,那么我们所做的就是将我们的模型过拟合于一个特定的人工引导结果。这就是为什么在过度采样数据之前应该始终进行交叉验证,就像实现特征选择一样。只有重复采样数据可以将随机性引入到数据集中,以确保不会出现过拟合问题。 K-fold交叉验证就是把原始数据随机分成K个部分,在这K个部分中选择一个作为测试数据,剩余的K-1个作为训练数据。交叉验证的过程实际上是将实验重复做K次,每次实验都从K个部分中选择一个不同的部分作为测试数据,剩余的数据作为训练数据进行实验,最后把得到的K个实验结果平均。
此外,还应注意训练集和测试集的样本的概率分布问题。若实际数据不平衡,将采样平衡后的数据集作为训练集训练后,模型应用在测试集上效果仍会不好。因此,实际应用中尽可能保持训练和测试的样本的概率分布是一致的。
选择合适的评价指标
1)谨慎选择AUC作为评价指标:对于数据极端不平衡时,可以观察观察不同算法在同一份数据下的训练结果的precision和recall,这样做有两个好处,一是可以了解不同算法对于数据的敏感程度,二是可以明确采取哪种评价指标更合适。针对机器学习中的数据不平衡问题,建议更多PR(Precision-Recall曲线),而非ROC曲线,具体原因画图即可得知,如果采用ROC曲线来作为评价指标,很容易因为AUC值高而忽略实际对少量样本的效果其实并不理想的情况。
2)不要只看Accuracy:Accuracy可以说是最模糊的一个指标了,因为这个指标高可能压根就不能代表业务的效果好,在实际生产中更关注precision/recall/mAP等具体的指标,具体侧重那个指标,得结合实际情况看。
选择合适的算法
1)选择对数据倾斜相对不敏感的算法。如树模型等。
2)集成学习。即多模型Bagging。首先从多数类中独立随机抽取出若干子集,将每个子集与少数类数据联合起来训练生成多个基分类器,再加权组成新的分类器,如加法模型、Adaboost、随机森林等。
3)转化成异常检测或者一分类问题。