在学术中,使用的大部分数据集都是平衡的。也就是在监督学习中,每一类别通常有数据相同的样本。同样,在学术中,数据集中每一类别的分类错误的成本通常事一样的。但实际中完全不是这样的。不平衡的数据集会导致错分成本上升。
如何解决数据集分布不平衡的问题?
- 搜集更多稀缺类别的数据,使得数据分布趋于平衡。
- 如果某几类稀缺的样本不需要区分的太细,可以考虑将这几类样本合并,更改它们的标签为同一类。
- 在原始数据集上进行修改:(1)对样本多的类别进行欠采样,缩减这类样本的数量;(2)对样本少的类别进行过采样,增大这类样本的数量;(3)先进行训练,找出样本很容易被误分类的部分,对部分样本进行有目的的采样,而不是随机采样。
- 在算法本身进行改进,让算法更关注稀缺样本的类别,增加稀缺类别样本的损失权重。
在原始数据集上进行修改:欠采样、过采样
欠采样(也叫下采样、under-sampling)方法通过减少分类中多数类样本的样本数量来实现样本均衡,最直接的方法是随机地去掉一些多数类样本来减小多数类的规模,缺点是会丢失多数类样本中的一些重要信息。
过采样(也叫上采样、over-sampling)方法通过增加分类中少数类样本的数量来实现样本均衡,最直接的方法是简单复制少数类样本形成多条记录,这种方法的缺点是如果样本少可能导致过拟合的问题;经过改进的过抽样方法通过在少数类中加入随机噪声、干扰数据或通过一定规则产生新的合成样本。
在算法本身进行改进:通过正负样本的惩罚权重解决样本不均衡
通过正负样本的惩罚权重解决样本不均衡的问题的思想是在算法实现过程中,对于分类中不同样本数量的类别分别赋予不同的权重(一般思路分类中的小样本量类别权重高,大样本量类别权重低),然后进行计算和建模。
使用这种方法时需要对样本本身做额外处理,只需在算法模型的参数中进行相应设置即可。很多模型和算法中都有基于类别参数的调整设置,以scikit-learn中的SVM为例,通过在class_weight: {dict, 'balanced'}中针对不同类别针对不同的权重,来手动指定不同类别的权重。如果使用其默认的方法balanced,那么SVM会将权重设置为与不同类别样本数量呈反比的权重来做自动均衡处理,计算公式为:n_samples / (n_classes * np.bincount(y))。
数据采样:通过组合/集成方法解决样本不均衡
组合/集成方法指的是在每次生成训练集时使用所有分类中的小样本量,同时从分类中的大样本量中随机抽取数据来与小样本量合并构成训练集,这样反复多次会得到很多训练集和训练模型。
数据采样:通过特征选择解决样本不均衡
使用或辅助于基于列的特征选择方法,一般情况下样本不均衡也会导致特征分布不均衡,但如果小类别样本量具有一定的规模,那么意味着其特征值的分布较为均匀,可通过选择具有显著型的特征配合参与解决样本不均衡问题,也能在一定程度上提高模型效果。












网友评论