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

发布时间 2023-10-20 15:08:28作者: shiiiilong

数据角度

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聚焦于难分样本。