数据不平衡

数据不平衡

数据不平衡原因

  1. 数据采集存在不平衡的问题,采集的样本之间天然存在数据少数样本的问题
  2. 数据抽样的代表性不够,抽样样本分布不一定能代表整体样本分布

如何处理数据不平衡

现存的方法主要是采用进一步对数据进行抽样的方法对数据进行处理

为什么要抽样

  • 计算资源不足
  • 数据采集限制
  • 时效性要求

现阶段不一定存在上述问题,但是依旧建议使用抽样进行数据处理,原因如下:

  • 通过抽样来实现快速的概念验证
  • 通过抽象解决样本不均衡问题
  • 无法实现对全部样本的覆盖的场景。经典场景如客户线下调研,用户满意度调查等无法对所有样本进行数据采集、分析、处理和建模的场景
  • 定性分析的需要

采用采样的方式对数据进行处理

  • 通过过采样和欠采样解决样本不均衡问题
    过采样(样本数量较少时使用)
    过采样(也叫上采样、over-sampling)方法通过增加分类中少数类样本的数量来实现样本均衡,最直接的方法是简单复制少数类样本形成多条记录,这种方法的缺点是,如果样本特征少,而可能导致过拟合问题的出现;经过改进的抽样方法在少数类中加入随机噪声,干扰数据或通过一定规则产生新的样本,例如SMOTE算法
    欠采样(样本较多时使用)
    欠采样(也叫下采样,under-sampling)
    欠采样通过减少分类中的多数类样本来实现样本均衡,最直接的方法是通过减少多数类样本数量进行处理,缺点是可能导致重要样本特征信息丢失。
  • 通过正负样本的惩罚权重解决样本不均衡问题
    通过正负样本的惩罚权重解决样本不均衡的问题的思想是在算法实现过程中,对于分类中不同样本数量的类别分别赋予不同的权重(一般思路分类中的小样本量类别权重高,大样本量类别权重低),然后进行计算和建模。使用这种方法时需要对样本本身做额外处理,只需在算法模型的参数中进行相应设置即可。很多模型和算法中都有基于类别参数的调整设置,以scikit-learn中的SVM为例,通过在class_weight : {dict, ‘balanced’}中针对不同类别针对不同的权重,来手动指定不同类别的权重。如果使用其默认的方法balanced,那么SVM会将权重设置为与不同类别样本数量呈反比的权重来做自动均衡处理,计算公式为: n s a m p l e s / ( n c l a s s e s ∗ n p . b i n c o u n t ( y ) ) 。 n_samples / (n_classes * np.bincount(y))。 nsamples/(nclassesnp.bincount(y))如果算法本身支持,这种思路是更加简单且高效的方法。
  • 通过组合/集成方法解决样本不均衡
    组合/集成方法指的是在每次生成训练集时使用所有分类中的小样本量,同时从分类中的大样本量中随机抽取数据来与小样本量合并构成训练集,这样反复多次会得到很多训练集和训练模型。最后在应用时,使用组合方法(例如投票、加权投票等)产生分类预测结果。
    例如,在数据集中的正、负例的样本分别为100和10000条,比例为1:100。
    此时可以将负例样本(类别中的大量样本集)随机分为100份(当然也可以分更多),每份100条数据;然后每次形成训练集时使用所有的正样本(100条)和随机抽取的负样本(100条)形成新的数据集。如此反复可以得到100个训练集和对应的训练模型。
    这种解决问题的思路类似于随机森林。在随机森林中,虽然每个小决策树的分类能力很弱,但是通过大量的“小树”组合形成的“森林”具有良好的模型预测能力。
    如果计算资源充足,并且对于模型的时效性要求不高的话,这种方法比较合适。

通过特征选择解决样本不均衡

上述几种方法都是基于数据行的操作,通过多种途径来使得不同类别的样本数据行记录均衡。除此以外,还可以考虑使用或辅助于基于列的特征选择方法。一般情况下,样本不均衡也会导致特征分布不均衡,但如果小类别样本量具有一定的规模,那么意味着其特征值的分布较为均匀,可通过选择具有显著型的特征配合参与解决样本不均衡问题,也能在一定程度上提高模型效果。

你可能感兴趣的:(人工智能)