样本不平衡及其解决办法

您所在的位置:网站首页 欠采样与过采样区别在哪 样本不平衡及其解决办法

样本不平衡及其解决办法

2023-03-12 19:23| 来源: 网络整理| 查看: 265

1 样本不均衡的问题

对分类的影响:分类模型中,模型更偏向对多数类的预测概率,从而导致少数类的预测精度大幅度下降,虽然整体来看精度很好,但这与实际工作不符。

典型场景:

CTR 预估:广告点击率,通常只有百分之几,点击的样本占比非常少,大量的未点击样本。 异常检测:比如恶意刷单、黄牛订单、信用卡欺诈、电力窃电、设备故障等,这些数据样本所占的比例通常是整体样本中非常少的一部分,比如信用卡欺诈,刷实体信用卡的欺诈比例一般都在 0.1% 以内。罕见事件分析:罕见事件分析与异常事件的区别在于异常检测通常都有是预先定义好的规则和逻辑。并且大多异常事件都对会企业运营造成负面影响,因此针对异常事件的检测和预防非常重要;但罕见事件则无法预判,并且也没有明显的积极和消极影响倾向。推荐系统:推荐系统数据集往往正样本量会比较低,比如大部分用户并不会对推荐的特定广告进行点击。

通过make_classification方法创建随机的n类分类数据集

from sklearn.datasets import make_classification X, y = make_classification(n_samples=5000, #样本总数 n_features=2, #特征数(包含信息特征数、冗余特征数) n_informative=2, #信息特征数 n_redundant=0, #冗余特征数 n_repeated=0, #从信息特征数和冗余特征数中重复抽取的数目 n_classes=3, #类别数 n_clusters_per_class=1, #每个类的聚类数 weights=[0.05, 0.1, 0.85], #每个类的概率 class_sep=0.8, #值越大,类与类之间分的越开 random_state=0) #随机种子

该数据集分布情况如下:

此时不同类的数据分布相对紧密,易于分类。

2 imbalanced-learn库

安装代码:

conda install -c conda-forge imbalanced-learn

环境依赖:

网址: https://imbalanced-learn.org/stable/references/index.html

imbalanced库中提供:

过采样算法 欠采样算法 不平衡的数据集 解决数据不平衡问题的集成算法 工具 数据不平衡的解决案例

但是我们需要谨慎使用这些算法,因为它们往往会改变数据的原始分布。

3 从样本出发3.1 重采样3.1.1 欠采样

目的:减少多数类的数量,简单来看就是数据清洗,洗掉一部分数据。

3.1.1.1 随机欠采样

原理:从多数类中随机选择一些样样本组成样本集。 代码:

under_random = RandomUnderSampler(random_state = 1, sampling_strategy='auto')3.1.1.2 NearMiss算法

原理:

NearMiss-1:在多数样本中选择出与少数样本最近的K个样本的平均距离最小的样本。 NearMiss-2:在多数样本中选择出与少数样本最远的K个样本的平均距离最小的样本。 NearMiss-3:对于每个少数类别样本,选择离它近的K个多数类别样本。

距离的计算可以使用欧式距离、曼哈顿距离、切比雪夫距离等

代码:

under_nm1 = NearMiss(version = 1, n_neighbors = 3) under_nm2 = NearMiss(version = 2, n_neighbors = 3) under_nm3 = NearMiss(version = 3, n_neighbors = 3)3.1.1.3 ENN

原理:遍历多数类的样本,如果他的大部分k近邻样本都跟他自己本身的类别不一样,我们就将他删除。

代码:

under_enn1 = EditedNearestNeighbours(kind_sel="all") #default under_enn2 = EditedNearestNeighbours(kind_sel="mode")

参数kind_sel:

'all':所有k个近邻点都不属于多数类 -'mode':超过半数的近邻点不属于多数类3.1.1.4 RENN

原理:重复以上ENN的过程直到没有样本可以被删除。

代码:

under_renn = RepeatedEditedNearestNeighbours()3.1.1.5 Tomek Link Removal

原理:将组成Tomek link的两个样本,如果有一个属于多数类样本,就将该多数类样本删除掉。

代码:

under_tlr = TomekLinks()3.1.2 过采样

目的:为少数类别增加新样本

3.1.2.1 随机过采样

原理:在少数类中选择部分样本进行复制,从而扩大少数累的样本量。

代码:

over_random = RandomOverSampler(random_state = 1, sampling_strategy='auto')3.1.2.2 SMOTE

原理:对随机过采样方法的一个改进算法,通过对少数类样本进行插值来产生更多的少数类样本。

缺点:

生成的样本可能重叠 SMOTE算法对于每个原少数类样本产生相同数量的合成数据样本,而没有考虑其邻近样本的分布特点 代码:over_somte = SMOTE(sampling_strategy='auto', random_state = 1, k_neighbors = 3)3.1.2.3 BorderlineSMOTE

原理:将少数类样本分为safe、danger、noise,仅对danger的样本进行smote采样

1. Noise: 所有的k近邻个样本都属于多数类; 2. Danger : 超过一半的k近邻样本属于多数类; 3. Safe: 超过一半的k近邻样本属于少数类。

代码:

over_blsmote = BorderlineSMOTE(sampling_strategy='auto', random_state = 1, k_neighbors = 3)3.1.2.4 ADASYN

原理:就是对不同的少数类样本赋予不同的权重,从而通过smote算法生成不同数量的样本,往往样本k近邻上的多数类样本越多,该样本生成的样本也越多。

代码:

over_adasyn = ADASYN(sampling_strategy='auto', random_state = 1, n_neighbors = 3)

以及部分数据增强的方法

3.1.3 过采样和欠采样结合

原理:由于在过采样的过程中,会出现重复样本,因此需要欠采样中的数据清洗方法对重复样本进行剔除。先进行过采样,再通过欠采样中的算法对重复样本进行剔除。

代码:

steps1 = [('o',over_somte),('u',under_tlr)] pipeline1 = Pipeline(steps = steps1)3.2 数据增强3.2.1 图像领域数据增强方法3.2.1.1 几何变换

翻转,旋转,裁剪(Cutout),变形,缩放

3.2.1.2 像素变换

噪声、模糊、颜色变换、擦除、填充

3.2.1.3 经典数据增强模型SamplePairingRandom Erasing Data Augmentation(随机擦除数据增强)RandAugment(随机增强)cutout、mixup、cutmixMosaic Data Augmentation(马赛克数据增强)3.2.1.4 经典生成模型GAN(生成对抗网络)VAE(变分自编码器模型)3.2.1.5 学习增强策略Autoaugmentation(Google提出的自动选择最优数据增强方案)3.2.2 文本领域数据增强模型Easy Data Augmentation(EDA):EDA是一种简单但非常有效的方法,具体包括随机替换,随机插入,随机交换,随机删除等。An Easier Data Augmentation(AEDA):在句子中间添加标点符号以此来增强数据。Back translation:对本文进行翻译,再翻译回来。Masked Language Model:掩码语言模型,利用预训练好的BERT, Roberta等模型,对原句子进行部分掩码,然后让模型预测掩码部分,从而得到新的句子。Random Noise Injection:在文本中注入噪声,来生成新的文本,最后使得训练的模型对扰动具有鲁棒性。Instance Crossover Augmentation:两个相同情绪类别(正/负)的 tweets 各自交换一半的内容。Syntax-tree Manipulation:解析并生成原始句子的依赖树,使用规则对其进行转换来对原句子做复述生成。MixUp for Text:worldMixup、sentMixupConditional Pre-trained Language Models:通过文本生成的方法来增加样本,属于生成模型。4 从损失函数出发4.1 带权值的损失函数

在机器学习中,可以通过修改模型中的“class_weight”参数,从而调节不均衡样本的惩罚权重。

4.1.1 LogisticRegression(逻辑回归模型)

代码:

lr1 = LogisticRegression(penalty="l1", #正则化,防止过拟合,包括l1和l2 C=0.5, #正则化强度,C值越大,惩罚越重,正则化的效力越强 solver="liblinear", #优化算法选择参数 multi_class="auto", #分类个数 class_weight='balanced' #类权重参数,控制类的惩罚权重 )

效果:

提升了一点,在测试集上的改进会更加显著。

4.1.2 SVC(支持向量回归模型)

代码:

svc1 = SVC(C=0.1, #边界点的惩罚系数,值越大,预测精度越高,但越容易过拟合 kernel='rbf', #核函数类型 class_weight='balanced',#类权重参数 random_state=2)

效果:

精度同样有所提高,但是容易过拟合,只能调低参数C。

4.2 focal loss

focal loss由何凯明提出,用于解决数据不平衡对深度学习模型造成的模型性能问题

4.2.1 交叉熵函数

Loss=L(y,\hat{p} )=-ylog(\hat{p})-(1-y)log(1-\hat{p})

其中 \hat p 为预测概率。

在二分类下, L 如下形式: L_{ce}(y,\hat p)=\left\{\begin{matrix} -log(\hat p) & y=1\\ -log(1-\hat p) & y=0 \end{matrix}\right.

在交叉熵损失函数(CE)的基础上增加了类别的不同权重以及困难(高损失)样本的权重。

4.2.2 样本不均衡问题

L=\frac{1}{N}\sum_{N}^{i=1}l(y_{i},\hat P_{i})

在二分类中,L表示如下:

L=\frac{1}{N}(\sum_{y_{i}=1}^{m}-log(\hat p)+\sum_{y_{i}=0}^{n}-log(1-\hat p))

当样本分布失衡时,在损失函数L的分布也会发生倾斜,多数类样本就会在损失函数占据主导地位。由于损失函数的倾斜,模型训练过程中会倾向于样本多的类别,造成模型对少样本类别的性能较差。

4.2.3 平衡交叉熵问题

从样本分布角度对损失函数添加权重因子。

原理:基于样本非平衡造成的损失函数倾斜,一个直观的做法就是在损失函数中添加权重因子,提高少数类别在损失函数中的权重,平衡损失函数的分布。

在二分类下,变为如下形式: L=\frac{1}{N}(\sum_{y_{i}=1}^{m}-\alpha log(\hat p)+\sum_{y_{i}=0}^{n}-(1-\alpha )log(1-\hat p))

其中 \frac{\alpha}{1-\alpha}=\frac{n}{m} ,即权重的大小根据正负样本的分布进行设置。

4.2.4 focal loss

从样本分类难易程度解决问题 原理:从loss的另一角度的解决方法,就是针对样本难易程度进行权重的分配,对难分类的样本赋予更大的权重,对于易分类的样本赋予较小的权重。 具体形式如下: L_{fl}=\left\{\begin{matrix} -(1-\hat p)^{\gamma}log(\hat p) & y=1\\ -\hat p^{\gamma}log(1-\hat p) & y=0 \end{matrix}\right.

\gamma 的意义为可调节因子,

其中 \gamma 均大于0,定义 p_{t} 如下:

p_{t}=\left\{\begin{matrix} \hat p & y=1\\ 1-\hat p & y=0 \end{matrix}\right.

因此focalloos表达式变形如下: L_{fl}=-(1-p_{t})^{\gamma}log(p_{t}) 交叉熵表达式变形如下: L_{ce}=-log(p_{t}) 相比较两个表达式,可以发现:fl表达式比交叉熵表达式多了一个可调节因子 (1-p_{t})^{\gamma} 对于分类正确的样本,该因子趋于0。 - 对于分类错误的样本,该因子趋于1。 因此,fl对于分类错误的样本,损失项相较于交叉熵没有变化,而对于分类正确的样本,损失相对于交叉熵缩小了,整体而言,fl相对于交叉熵整体缩小了,增加了分类不正确样本在损失函数中的权重。 p_{t} 衡量了分类的难易程度, p_{t} 越大,分类置信度越高,即越容易分类。fl相当于增加了难分样本在损失函数中的权重,使得损失函数倾向于难分的样本。 但并不是难分样本永远都是难分,易分样本也可能会逐渐变成难分样本,从而导致模型收敛较慢,因此应当适当降低学习率,以防止 p_{t} 的巨大改变。

代码:

class MultiClassFocalLossWithAlpha(nn.Module): def __init__(self, alpha, gamma=2, reduction='mean'): """ :param alpha: 权重系数列表,三分类中第0类权重0.2,第1类权重0.3,第2类权重0.5 :param gamma: 困难样本挖掘的gamma :param reduction: """ super(MultiClassFocalLossWithAlpha, self).__init__() self.alpha = tensor_from_numpy(alpha,device) self.gamma = gamma self.reduction = reduction def forward(self, pred, target): alpha = self.alpha[target] # 为当前batch内的样本,逐个分配类别权重,shape=(bs), 一维向量 log_softmax = torch.log_softmax(pred, dim=1) # 对模型裸输出做softmax再取log, shape=(bs, 3) logpt = torch.gather(log_softmax, dim=1, index=target.view(-1, 1)) # 取出每个样本在类别标签位置的log_softmax值, shape=(bs, 1) logpt = logpt.view(-1) # 降维,shape=(bs) ce_loss = -logpt # 对log_softmax再取负,就是交叉熵了 pt = torch.exp(logpt) #对log_softmax取exp,把log消了,就是每个样本在类别标签位置的softmax值了,shape=(bs) focal_loss = alpha * (1 - pt) ** self.gamma * ce_loss # 根据公式计算focal loss,得到每个样本的loss值,shape=(bs) if self.reduction == "mean": return torch.mean(focal_loss) if self.reduction == "sum": return torch.sum(focal_loss) return focal_loss4.3 OHEM

目标检测领域中所提出的算法,用来对困难负样本进行挖掘,基准算法是Fast R-cnn。 基本原理与focal loss相似,都是针对难分的样本。 选择一些hard examples(多样性和高损失的样本)作为训练的样本,针对性地改善模型学习效果。

第一块ROI层会得到所有ROI的loss,根据hard ROI sampler结构根据损失排序选出hard example,并将这些hard example作为第二块ROI层的输入。

5 从模型出发5.1 选择对样本不平衡不敏感的模型

树模型要比逻辑回归模型要在不平衡数据集上表现更优秀

5.2 采样+集成学习

原理:采用集成学习机制来处理随机欠采样的信息丢失问题

5.2.1 EasyEnsembleClassifier算法

基于无监督的方式进行欠采样。 为了克服随机欠采样方法导致的信息缺失问题,又要保证算法表现出较好的不均衡数据分类性能。基于均衡样本集的Adaboost分类器的集成算法,就是对多数类样本进行n次欠采样,得到n个模型。

5.2.2 balance cascade算法

基于有监督结合boosting的方式。 基于Adaboost,将Adaboost作为基分类器,其核心思路是在每一轮训练时都使用多数类与少数类数量上相等的训练集,然后使用该分类器对全体多数类进行预测,通过控制分类阈值(即概率超过多少判定为少数类)来控制FP(False Positive)率,将所有判断正确的类(数量为负样本总数×(1-FP))删除,然后进入下一轮迭代继续降低多数类数量。

5.3 异常检测

通过数据挖掘方法发现与数据集分布不一致的异常数据。

图片

网址:https://mp.weixin.qq.com/s?__biz=MzI4MDYzNzg4Mw==&mid=2247552622&idx=5&sn=8911513d9c1a1306da590bfd659b70f8&chksm=ebb736badcc0bfac43536a905ef999f29e5c618bb3bc41395a57b13b4306f8315055ccd08dc1&scene=27

6 评价指标6.1 传统分类评价指标6.1.1 Aucurracy、precision、recall、F1

Aucurracy=\frac{TP+TN}{TP+FP+TN+FN}

Precision=\frac{TP}{TP+FP}

Recall=\frac{TP}{TP+FN}

\frac{1}{F1}=\frac{1}{2}({\frac{1}{Precision}+\frac{1}{Recall}})

6.1.2 ROC曲线和AUC

ROC曲线下面积就是AUC ROC曲线的横轴是TPR(recall),纵轴是FPR

6.2 R-P曲线和AUPRC

R-P曲线的横轴是Recall,纵轴是Precision RP曲线下面积就是AUPRC,往往AUPRC 正样本个数严重小于负样本个数,收据严重倾斜时,P-R曲线相比较于ROC曲线更加适合

7 改造多分类模型OVR:一对多模型OVO:一对一模型


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3