解决分类中样本分布不平衡问题

目录

一、什么是样本分布不平衡

二、哪些运营场景中容易出现样本不均衡

三、怎么处理样本不均衡

1. 通过过采样或欠采样解决样本不均衡

2. 通过正负样本的惩罚权重解决样本不均衡

3. 通过组合/集成方法解决样本不均衡

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

参考资料:

1.《Python数据分析与数据化运营》 宋天龙

2.  分类中解决类别不平衡问题 - 知乎

一、什么是样本分布不平衡

样本分布不平衡指的是不同类别的样本量差异很大,主要出现在分类相关的建模问题上,从数据规模上可以分为大数据分布不均衡和小数据分布不均衡两种。

  • 大数据分布不均衡。这种情况下整体数据规模很大,只是其中少数类样本占比较少。但是从每个特征的分布来看,小样本也覆盖了大部分或全部的特征。例如拥有1000万条记录的数据集中,其中少数类样本占有50万条,便属于这种情况。
  • 小数据分布不均衡。这种情况下整体数据规模较小,并且少数类样本的数量也少,这会导致特征分布的严重不平衡。例如拥有1000条记录的数据集中,其中少数类样本仅有10条,其特征无论如何也无法完整覆盖,便属于这种情况,是严重的数据样本分布不均衡。

样本分布不均衡将导致少数类样本所包含的特征过少,很难从中提取规律,即使得到分类模型,也容易产生过度依赖于有限的数据样本而导致过拟合的问题。当模型应用到新的数据上时,模型的准确性和鲁棒性将很差。

注意:如果不同分类间的样本量差异超过10倍就需要引起警觉并考虑处理该问题,当然也要视情况而定。

二、哪些运营场景中容易出现样本不均衡

在数据化运营过程中,以下场景会经常产生样本分布不均衡的问题:

  • 客户流失场景。大型企业的流失客户相对于整体客户通常是少量的,尤其对于具有垄断地位的行业巨头。
  • 异常检测场景。大多数企业中的异常个案都是少量的,比如恶意刷单、黄牛订单、欺诈订单、信用卡欺诈、逾期还款率、洗钱交易、电力窃电、设备故障等。
  • 罕见事件分析。罕见事件与异常检测类似,不同点在于异常检测通常都有预先定义好的规则,并且大多数异常事件都会对企业运营造成负面影响,因此针对异常事件的检测和预防非常重要,但罕见事件则无法预判,并且也没有明显的积极和消极影响倾向。例如由于某网络大V无意中转发了企业的一条趣味广告导致用户流量明显提升便属于此类。
  • 发生频率低的事件。这种事件是预期或计划性事件,但是发生频率非常低。例如每年1次的双11大促。

在通过拆分法解决多分类问题时,即使原始问题中不同类别的样本数据量相当,但在使用One VS All / One VS Rest、Many VS Many策略后产生的二分类任务仍可能出现样本类别不平衡的现象。        

三、怎么处理样本不均衡

对不平衡数据的处理方法主要分为如下四种:

  • 通过过采样或欠采样解决样本不均衡
  • 通过正负样本的惩罚权重解决样本不均衡
  • 通过组合/集成方法解决样本不均衡
  • 通过特征选择解决样本不均衡

1. 通过过采样或欠采样解决样本不均衡

过采样

过抽样(也叫上采样、over-sampling)方法通过增加分类中少数类样本的数量来实现样本均衡。最直接的方法是简单复制少数类样本增加多条记录,与多数类样本数量相当,但这种方法的缺点是由于少数类样本特征少而可能导致过拟合的问题。

经过改进的过抽样方法是通过在复制的少数类样本中加入随机噪声、干扰数据或通过一定规则产生新的合成样本,例如SMOTE算法,算法流程如下:

假设有两个类别:class1 和 class2 ,其中class1样本数少。
步骤1:从class1中随机选择一个点C,找到该点在class1里的K个邻居
步骤2:从K个邻居中随机选择一个点C1
步骤3:在C与C1的连线上生成新的点C_new
步骤4:重复1-3步骤,可构造n个新的样本点

SMOTE算法有以下两个缺点:

1)由于对每个少数类样本都生成新样本,因此容易发生合成样本重叠的问题。

2)出现了过度泛化的问题,主要归结于产生合成样本的方法。特别是,SMOTE算法对于每个原少数类样本产生相同数量的合成数据样本,而没有考虑其邻近样本的分布特点,这就使得类间发生重复的可能性增大。

SMOTE — Version 0.9.0

欠采样

欠抽样(也叫下采样、under-sampling)方法通过减少分类中多数类样本的样本数量来实现样本均衡。最直接的方法是随机去掉一些多数类样本,减少至与少数类样本数量相当,缺点是会丢失多数类样本中的一些重要信息。例如RandomUnderSampler算法。

RandomUnderSampler — Version 0.9.0

过采样和欠采样相结合

过采样和欠采样方法可以结合使用,通过减少多数类样本的数量,并且增加少数类样本的数量,使得不同类别的样本数量相当,达到一个比较平衡的状态。

总体上,过抽样和欠抽样更适合大数据分布不均衡的情况,尤其是过抽样方法应用更加广泛。

2. 通过正负样本的惩罚权重解决样本不均衡

这种解决问题的思路是在算法实现过程中,对于少数类和多数类分别赋予不同的权重,然后进行计算和建模。一般是少数类给予高权重,多数类给予低权重。使用这种方法时只需在算法模型的参数中进行相应设置即可。

以scikit-learn中的SVM为例,通过权重调节处理不均衡样本。该过程主要通过设置参数class_weight的值,该参数可设置为None、字典、'balanced'三种模式:

  • None:默认值,代表不同类别的权重相同;
  • 字典:通过手动指定不同类别的权重,例如{1:10,0:1};
  • 'balanced':代表算法将自动调整与输入数据中的类频率成反比的权重,具体公式为n_samples /(n_classes * np.bincount(y))

sklearn.svm.SVC — scikit-learn 1.0.2 documentation

3. 通过组合/集成方法解决样本不均衡

组合/集成方法指的是在每次生成训练集时使用所有分类中的少数类样本量,同时从多数类样本量中随机抽取相同数量的数据与少数类样本量合并构成训练集,这样反复多次会得到很多训练集和训练模型。最后在应用时,使用组合方法产生分类预测结果。

EasyEnsembleClassifier算法为例,默认是基于均衡样本集的Adaboost分类器的集成算法,基本步骤如下:

1)从多数类中有放回的随机采样n次,每次选取与少数类数目相近的样本个数,那么可以得到n个样本集合 。

2)然后,将这n个样本集合分别与少数类样本合并并训练出一个模型,可以得到n个模型。

3)最终将这些模型组合形成一个集成学习系统,最终的模型结果是这n个模型的平均值。

EasyEnsembleClassifier — Version 0.9.0

如果计算资源充足,并且对于模型的时效性要求不高的话,这种方法比较合适。

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

上述几种方法都是基于数据行的操作,除此以外,还可以考虑使用基于列的特征选择方法。

一般情况下,样本不均衡也会导致特征分布不均衡,但如果小类别样本量具有一定的规模,那么意味着其特征值的分布较为均匀,可通过选择具有显著型的特征配合参与解决样本不均衡问题,也能在一定程度上提高模型效果。

提示:上述解决样本不均衡问题的思路都是基于分类问题解决的。实际上,这种从大规模数据中寻找罕见数据的情况,也可以使用非监督式的学习方法,例如使用One-class SVM进行异常检测。

代码实现:

python提供了一个处理不平衡数据的imblearn库。

#安装这个包
pip install imbalanced-learn

生成样本不平衡的数据集

# 生成正负样本量不平衡的数据集,比例为3:7
from collections import Counter
from sklearn import datasets
X,Y = datasets.make_classification(n_samples = 20,
                                    n_features = 4,
                                    n_classes = 2,
                                    weights = [0.3,0.7])

print(Y)
print(Counter(Y))

通过过采样方法SMOTE处理不平衡样本

# 使用SMOTE方法进行过采样处理
from imblearn.over_sampling import SMOTE # 导入过采样方法SMOTE
smote = SMOTE(random_state=0) # 建立SMOTE模型对象
X_resampled, Y_resampled = smote.fit_resample(X, Y) # 输入数据并作过采样处理
print(Counter(Y_resampled))

通过随机欠采样方法RandomUnderSampler处理不平衡样本

# 使用RandomUnderSampler方法进行欠采样处理
from imblearn.under_sampling import RandomUnderSampler # 导入欠采样方法Random UnderSampler
rus = RandomUnderSampler(random_state=0) # 建立RandomUnderSampler模型对象
X_resampled, Y_resampled = rus.fit_resample(X, Y) # 输入数据并进行欠采样处理
print(Counter(Y_resampled))

通过SVC分类模型处理不平衡样本

# 使用SVM的权重调节处理不平衡样本
from sklearn.svm import SVC  # 导入SVM中的分类算法SVC
model_svm = SVC(class_weight='balanced')  # 创建SVC模型对象并指定类别权重
model_svm.fit(x, y)  # 输入数据并训练SVC模型

通过EasyEnsembleClassifier算法处理不平衡样本

# 使用集成方法EasyEnsembleClassifier处理不平衡样本
from imblearn.ensemble import EasyEnsembleClassifier  # 导入简单集成方法EasyEnsembleClassifier
model_EasyEnsemble = EasyEnsembleClassifier()  # 建立EasyEnsemble模型对象
model_EasyEnsemble.fit(x, y)  # 输入数据并应用集成方法处理

如何针对不同的具体场景选择最合适的样本均衡解决方案,选择过程中既要考虑到每个类别样本的分布情况以及总样本情况,又要考虑后续数据建模算法的适应性,以及整个数据模型计算的数据时效性。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>