样本不均衡问题的解决方案

数据角度

Under Sampling

去除一些多数类中的样本使得正例、反例数目接近,然后再进行学习。

Random Under Sampling

随机去除一部分多数类的数据

不足:导致多数类信息缺失(比如删了最具代表性的一些样本)

EasyEnsemble

并行学习n个模型,然后集成

算法步骤:

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

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

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

image

BalanceCascade

串行学习n个模型,每次用模型在多数类样本上预测并删去固定比例预测正确的,多数类数量会不断减少

区别在于多了 7,8 step:

根据 \(H_i\) 的阈值 \(\theta_i\) 对所有的多数类样本进行预测,控制预测错误的比例为\(f\),第8步中去掉的预测正确的样本(简单样本)

\(f\)的取值可以保证T步后多数类剩余数量和少数类相同,停止迭代

image

Over Sampling

增加一些少数类样本使得正、反例数目接近,然后再进行学习。

Random Under Sampling

随机挑一些样本重复出现

并没有引入新的信息,模型会对少数类过拟合

Synthetic Minority Oversampling (SMOTE)

少数类的样本进行插值

1.对于每一个少数类样本,找到其K个最近少数类样本。

2.从这K个最近邻居中随机选择一个样本。

3.在两点连线上随机生成一个新样本。

不足: 对于噪声和离群点敏感,无法处理样本重叠问题

Borderline SMOTE

仅拓展分类面边缘的少数类样本

Borderline SMOTE采样过程是将少数类样本分为3类,分别为Safe、Danger和Noise

image

adaptive synthetic sampling (ADASYN)

根据样本密度分布来调整合成样本的数量。类似Borderline SMOTE

Borderline SMOTE

Loss角度

二分类交叉熵:

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

等价于

\[L(y, \hat{p}) = \begin{cases} - \log(\hat{p}) & \text{if } y=1 \\ - \log(1 - \hat{p}) & \text{if } y=0 \end{cases} \]

测试集上的loss为

\[L = \frac{1}{N} \left( \sum_{y_i=1}^{m} -\log(\hat{p}_i) + \sum_{y_i=0}^{n} -\log(1 - \hat{p}_i) \right) \]

其中m为正样本个数,n为负样本个数,N为样本总数

balanced cross entropy

放大出现次数少的label的loss
缩小出现次数多的label的loss

\[ L = \frac{1}{N} \left( \sum_{y_i=1}^{m} -\alpha \log(\hat{p}_i) + \sum_{y_i=0}^{n} -(1 - \alpha) \log(1 - \hat{p}_i) \right) \]

其中\(\frac{\alpha}{1 - \alpha} = \frac{n}{m}\)

Online Hard Example Mining

只用较难的样本来更新网络

\[ L(y, \hat{p}) = \begin{cases} - \log(\hat{p}) & \text{if } y=1 , \hat{p}<0.6 \\ - \log(1 - \hat{p}) & \text{if } y=0 , \hat{p}>0.4 \end{cases} \]

以二分类为例,我们认为大于0.5的就是正样本了,小于0.5的就是负样本。这样就意味着,我们可以“有选择”地更新模型,比如,设定一个阈值为0.6,那么模型对某个正样本的输出大于0.6,我就不根据这个样本来更新模型了,模型对某个负样本的输出小于0.4,我也不根据这个样本来更新模型了,只有在0.4~0.6之间的,才让模型更新,这时候模型会更“集中精力”去关心那些“模凌两可”的样本,从而使得分类效果更好,这跟传统的SVM思想是一致的。
还能防止过拟合:防止模型去把简单样本做的更好,来降低loss
参考博客

不足:这样算是硬截断的loss,我们只告诉模型正样本的预测值大于0.6就不更新了,却没有告诉它要“保持”大于0.6!
解决方案:

  • 采样部分loss大于0.6的简单样本
  • Focal loss(软化,可导)

Focal loss

公式如下:

\[L_{fl} = \begin{cases} - (1 - \hat{p})^\gamma \log(\hat{p}) & \text{if } y=1 \\ - \hat{p}^\gamma \log(1 - \hat{p}) & \text{if } y=0 \end{cases} \]

focal loss用较可导的方式量化了每个样本的难易程度,使loss聚焦于难分样本。

posted @   shiiiilong  阅读(124)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示