1。什么是数据不平衡?所谓不平衡数据,是指数据集中类别数量的不平衡分布;不平衡的数据在现实世界的任务中很常见。例如信用卡欺诈数据:99%是正常数据,1%是欺诈数据,贷款逾期数据,不平衡数据一般是数据生成造成的,类别少的样本通常出现频率低,需要较长周期收集的时间。在机器学习任务(如分类问题)中,不平衡的数据会导致训练模型的预测结果偏向样本数量多的类别。这时候,除了选择合适的评价指标外,如果想提高模型的性能,还需要对数据和模型做一些预处理。处理数据不平衡的主要方法:欠采样、过采样、综合采样模型集成、调整类别权重或样本权重2.数据不平衡处理方法imbalanced-learn库提供了很多不平衡数据处理方法。本文中的例子都是基于imbalanced-learn库来实现的。pipinstall-Uimbalanced-learnhttps://github.com/scikit-learn-contrib/imbalanced-learn本文示例数据来自正在进行的比赛山东省第二届数据应用创新创业大赛-日照分赛场-Provident基金贷款逾期预测看数据groupby(['label']).size())#label为是否违约,1为违约,0为不违约#label#037243#127572.1欠采样所谓欠采样是对多个类别(记为多数)的样本进行采样,使数量等于少数的数量,从而达到数量上的平衡。由于欠采样是损失了一部分数据,因此不可避免地会导致多类别样本数量的分布发生变化(方差变大)。一个好的欠采样策略应该尽可能地保留原始数据分布。欠采样就是删除大部分样本,那么可以删除哪些样本呢?一种是重叠数据,即冗余数据,另一种是干扰数据。干扰少数的分布是基于此。关于欠采样边界相邻匹配有两种思考方式。考虑删除相邻空间的多数样本,比如TomekLinks,NearMiss下图显示6NN(6nearestneighbors)。这里我们关注TomekLinks。TomekLinks方法简单地说:为每个少数样本找到1NN(最近邻)。如果最近的邻居占多数,则形成一个大部头。-链接,这种方法人为删除了这个多数作为干扰。fromimblearn.under_samplingimportTomekLinksX_train=train_df.drop(['id','type'],axis=1)y=train_df['label']tl=TomekLinks()X_us,y_us=tl.fit_sample(X_train,y)print(X_us.groupby(['label'].size())#label#036069#12757从上面可以看出,删除了1174个tomek-links,貌似删的还不够,可以测试分类结果是否正确有帮助,需要注意的是因为需要计算最近邻,所以样本属性必须是数值属性,也可以转换成数值属性,聚类这类方法将原始样本进行划分通过multiplecluster分成多个cluster,然后用每个cluster的中心代替cluster的特征来完成抽样的目的,可以看出本次抽样的样本并不是来自于原始样本集,而是通过聚类。fromimblearn.under_samplingimportClusterCentroidscc=ClusterCentroids(random_state=42)X_res,y_res=cc.fit_resample(X_train,y)X_res.groupby(['label']).size()#label#02757#12757im-balance提供的欠采样方法为如下:带替换的随机多数欠采样抽取多数-少数Tomek链接使用聚类质心欠采样NearMiss-(1&2&3)压缩最近邻单边选择邻域清理规则已编辑最近邻已编辑实例Rehard硬邻AllKNN2.2Oversampling所谓过采样就是复制少量类别(minority)的样本,使其数量与大量类别(majority)的数量相当,从而达到数量上的平衡。由于少数样本的多个副本,过采样会改变少数方差。一种简单的过采样方法是随机复制小样本;另一种是在现有样本的基础上生成人工样本。这里介绍一下人工样本的经典算法SMOTE(SyntheticMinorityOver-samplingTechnique)。SMOTE基于类似于少数样本的特征空间构造新的人工样本。步骤如下:选择一个少数样本,在K个邻居中计算它的KNN邻居,随机选择一个邻居修改某个特征,偏移一定大小:偏移的大小就是少数样本与原始样本的差值。neighbor乘以一个小的Randomratio(0,1),从imblearn.over_samplingimportSMOTEsmote=SMOTE(k_neighbors=5,random_state=42)X_res,y_res=smote.fit_resample(X_train,y)X_res.groupby(['label']).size()#label#037243#137243对于SMOTE方法,会为每一个少数派构建一个新的样本。但也不总是这样,考虑以下三个点A、B、C。从数据分布的角度,C点很可能是异常点(Noise),B点是正态分布的点(SAFE),A点分布在边界位置(DANGER);直觉上,我们不应该去C点构造新样本,对于B点,构造新样本不会丰富少数类别的分布。只有A点,如果新样本的构建可以使A点从(DANGER)变为(SAFE),强化少数类的分类边界。这是Borderline-SMOTEfromimblearn.over_samplingimportBorderlineSMOTEbsmote=BorderlineSMOTE(k_neighbors=5,random_state=42)X_res,y_res=bsmote.fit_resample(X_train,y)X_res.groupby(['label']).size()#label#037243#ADYN该方法从保持样本分布的角度确定生成的数据。生成数据的方法和SMOTE一样,不同的是每个minorsample生成的样本数量不同。首先确定要生成的样本个数beta为[0,1],对于每个minortiy样本,确定其生成样本的比例。先找出K近邻,计算K近邻(即分子)中属于多数的样本所占的比例。Z是归一化因子,保证所有次要比例之和为1,可以认为是所有分子之和。计算每个minortiy产生的新样本数根据SMOTE方法fromimblearn.over_samplingimportADASYNadasyn=ADASYN(n_neighbors=5,random_state=42)X_res,y_res=adasyn.fit_resample(X_train,y)X_res.groupby(['label']).size()#label#037243#136690im-balance提供的过采样方法如下(包括SMOTE算法的变体):Randomminorityover-samplingwithreplacementSMOTE-SyntheticMinorityOver-samplingTechniqueSMOTENC-标称连续bSMOTE(1和2)的SMOTE-类型1和2SVMSMOTE的边界SMOTE-支持向量SMOTEADASYN-用于不平衡学习的自适应合成采样方法KMeans-SMOTEROSE-随机过采样示例2.3综合采样过采样是针对少数样本,欠采样是针对多数样本;综合抽样是一种同时对小样本和大样本进行操作的方法。主要有SMOTE+Tomek-links和SMOTE+EditedNearestNeighbors。综合采样的方法是先过采样后欠采样。fromimblearn.combineimportSMOTETomeksmote_tomek=SMOTETomek(random_state=0)X_res,y_res=smote_tomek.fit_sample(X_train,y)X_res.groupby(['label']).size()#label#036260#1362602.4模型整合这里主要是模型整合体现在数据方面,用很多平衡的数据集训练多个模型(majortirysamples欠采样加上minoritysamples),然后进行整合。imblearn.ensemble提供了几种常用的模型集成算法,例如BalancedRandomForestClassifierfromimblearn.ensembleimportBalancedRandomForestClassifierfromsklearn.datasetsimportmake_classificationX,y=make_classification(n_samples=1000,n_classes=3,n_informative=4,weights=[0.2,0.3,0.5)clfate],=BalancedRandom_depthClassifier(max=2,random_state=0)clf.fit(X,y)print(clf.feature_importances_)print(clf.predict([[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]])im-balance提供的模型集成方法如下:EasyEnsembleclassifierBalancedRandomForestBalancedBaggingRUSBoost2.5调整categoryweightsorsampleweight对于很多使用梯度下降法学习的机器学习方法(最小化一定的损失Loss),可以通过调整类别权重或者样本权重在一定程度上平衡不平衡的数据。比如gbdt模型lightgbm中,class_weightimportlightgbmaslgbclf=lgb.LGBMRegressor(num_leaves=31,min_child_samples=np.random.randint(20,25),max_depth=25,learning_rate=0.1,class_weight={0:1,1:10},n_estimators=500,n_jobs=30)3.总结本文分享了处理不平衡数据集的几种常用方法,并提供了一个简单的不平衡学习示例。总结如下:Undersampling:减少多数样本Oversampling:增加少数样本Comprehensivesampling:先过采样,然后在欠??采样模型中集成:创建平衡数据(多数样本欠采样+少数样本),多个不同的欠采样,不同的训练模型,然后融合,不管是欠采样还是过采样,都会在一定程度上改变原始数据的分布,可能会导致模型过拟合。需要尝试哪种方法,要符合实际的数据分布。当然也不一定有效,勇敢的去尝试,去做吧!
