在学术研究与教学中,很多算法都有一个基本假设,那就是数据分布是均匀的。当我们把这些算法直接应用于实际数据时,大多数情况下都无法取得理想的结果。因为实际数据往往分布得很不均匀,都会存在“长尾现象”,也就是数据不平衡”。
以下几种方法是针对数据不平衡问题所做的处理,具体包括:
1.smote采样
2.adasyn采样
3.欠采样
4.一分类
5.改进的adaboost方法
一、smote采样
SMOTE全称是Synthetic Minority Oversampling Technique即合成少数类过采样技术,它是基于随机过采样算法的一种改进方案,由于随机过采样采取简单复制样本的策略来增加少数类样本,这样容易产生模型过拟合的问题,即使得模型学习到的信息过于特别(Specific)而不够泛化(General),SMOTE算法的基本思想是对少数类样本进行分析并根据少数类样本人工合成新样本添加到数据集中,算法流程如下。
1、对于少数类中每一个样本x,以欧氏距离为标准计算它到少数类样本集中所有样本的距离,得到其k近邻。
2、根据样本不平衡比例设置一个采样比例以确定采样倍率N,对于每一个少数类样本x,从其k近邻中随机选择若干个样本,假设选择的近邻为xn。
3、对于每一个随机选出的近邻xn,分别与原样本按照如下的公式构建新的样本 xnew=x+rand(0,1)∗|x−xn|
部分代码如下:
df=get_data() x, y = load_creditcard_data(df) X_resampled_smote, y_resampled_smote = SMOTE().fit_sample(x, y) # print(y_resampled_smote) X_train, X_test, y_train, y_test = train_test_split(X_resampled_smote, y_resampled_smote, test_size=0.3,random_state=0)
二、adasyn采样
本文介绍的是 ADASYN: 自适应综合过采样方法。
算法步骤如下:
(1)计算不平衡度
记少数类样本为ms,多数类为ml,则不平衡度为 d = ms / ml,则d∈(0,1]。(作者在这里右边用了闭区间,我觉得应该用开区间,若是d = 1,则少数类与多数类样本数量一致,此时数据应该平衡的)
(2)计算需要合成的样本数量
G = (ml - ms)* b,b∈[0,1],当b = 1时,即G等于少数类和多数类的差值,此时合成数据后的多数类个数和少数类数据正好平衡
(3)对每个属于少数类的样本用欧式距离计算k个邻居,△为k个邻居中属于多数类的样本数目,记比例r为r = △ / k,r∈[0,1]
(4)在(3)中得到每一个少数类样本的 ri ,
用计算每个少数类样本的周围多数类的情况
(5)对每个少数类样本计算合成样本的数目
(6)在每个待合成的少数类样本周围k个邻居中选择1个少数类样本,根据下列等式进行合成
重复合成直到满足需要步骤(5)合成的数目为止。
部分代码如下:
df=get_data() x, y = load_creditcard_data(df) X_resampled_smote, y_resampled_smote = ADASYN().fit_sample(x, y)
参考地址:https://blog.csdn.net/weixin_40118768/article/details/80226423
三、欠采样
以下两种方法都属于欠抽样,不同于直接欠抽样,他们将信息的丢失程度尽量降低。两者的核心思想为:
1. EasyEnsemble 核心思想是:
- 首先通过从多数类中独立随机抽取出若干子集
- 将每个子集与少数类数据联合起来训练生成多个基分类器
- 最终将这些基分类器组合形成一个集成学习系统
EasyEnsemble 算法被认为是非监督学习算法,因此它每次都独立利用可放回随机抽样机制来提取多数类样本
2. BalanceCascade 核心思想是:
- 使用之前已形成的集成分类器来为下一次训练选择多类样本
- 然后再进行欠抽样

