百科问答小站 logo
百科问答小站 font logo



分类机器学习中,某一标签占比太大(标签稀疏),如何学习? 第1页

  

user avatar   fuckyou-74 网友的相关建议: 
      

有几种方法 1.首先你要分清究竟是正负样本不均衡还是难易样本不均衡,如果是难易样本不均衡(比如目标检测)那经典的Focal loss很好用,他通过一个难易调制系数 和一个正负样本系数 可以很好地解决样本不均衡问题。2.对大样本下采样,小样本上采样。

具体Focal loss的原理可以看这篇文章:


user avatar   yu-yi-chu-shi 网友的相关建议: 
      

1 问题定义

这是典型的数据类型不平衡问题。比如对于一个二分类任务,训练集中类别为0的负样本占样本总数的90%,而正样本只占10%。那么这样的训练集有什么弊端呢?

如果类别不平衡的样本直接丢给模型学习,那么很显然模型会在负样本上的学习效果更好,因为模型‘看到’的负样本更多。举个栗子,就像你如果花9天时间去学习数学,花一天时间去学习语文,不出意外你会在数学考试中表现更好。

那么对于类别不平衡的训练集,该如何处理呢?

做过视频或者广告点击预估比赛的小伙伴应该经常遇到这种问题,这类比赛的训练集一般都是非常不平衡的,正样本的比例通常不足10%。这里我总结了一些在比赛中用过的一些行之有效的处理方法,下面为大家逐一介绍。

Tips:是不是类别平衡的训练集就一定更好呢?这个不能保证,但对于大多数情况,类别平衡的数据对模型来说是更友好的,至少模型不会倾向于数量多的那一类别。

2 解决方法

2.1 采样

这是解决数据类别不平衡的最简单、最暴力的方法。

如果负样本太多,那就对负样本进行欠采样,就是随机的从负样本中抽取一部分样本,然后与正样本合并成训练集丢给模型训练。这样有个很明显的弊端,就是会造成严重的信息损失,数据收集不易,你还要丢弃一部分,很显然不合理。

如果正样本太少,那就对正样本进行过采样,就是对正样本进行复制,或者如果是NLP、CV任务,可以做一些数据增强,以此来增加正样本的数量。但是对于一般的任务来说,简单的对正样本进行复制,以此来达到增加正样本数量的目的,这样会使模型在这正样本上过拟合,因为模型‘看到’太多次这样的样本。就像你如果复习同一道题太多次,答案都背住了,所以看到类似的题就直接写答案,不会变通显然是不对的。

所以采样的方法不是解决类别不平衡问题的权宜之计,慎用

2.2 SMOTE方法

上面介绍了对正样本进行过采样,会使模型过拟合的问题,SMOTE也是基于采样的方法,但是SMOTE可以降低过拟合的风险。

过采样是直接对样本进行复制,导致训练集重复样本太多,而SMOTE则不是直接复制,而是生成与正样本相似并且训练集中没有的样本。具体做法:首先随机选取一个正样本,然后用K近邻选取一个与其最相似的样本,取两样本的中值或者均值,作为新样本。这样生成的样本可一定程度降低模型过拟合的风险 (仍然可能过拟合) 。

Tips:如果你对K近邻有些陌生,可以参考我的这篇文章做个简单的回顾。

2.3 阈值调整

调整阈值也是比较简单而且有效的方法,这也是我在做比赛时经常会用到的方法。

对于二分类任务来说,一般会以0.5作为阈值来划分正负样本(比如逻辑回归),预测概率值大于0.5则判定为正样本,反之为负样本。对于类别不平衡的训练集来说,这个阈值就不再合适了,因为当使用负样本来更新模型权重时,权重的更新会使模型的输出尽量偏向于0,如果负样本太多,那么负样本对于模型权重的更新量就比较多,使得模型输出接近0的概率就比较大,所以可以根据正负样本所占的比例来调整阈值。比如正样本只占10%,则可以将阈值调整为0.1,输出概率大于0.1的则判定为正样本,这样可以很好的解决类别不平衡问题,调整阈值是个简单且高效的方法。

感谢评论区馒头对解决方法的补充:可以在计算每个样本的loss时,通过为正样本增加权重的方式,来优化样本不平衡问题。该方法原理跟划分阈值类似,正样本对权重的更新会使模型输出尽可能偏向于1,但是正样本太少,所以一方面可以降低划分为正样本的阈值,另一方面则可以在计算loss时,增加正样本权重,从而增大正样本对模型参数的更新量,提高模型输出为1的概率。

2.4 模型融合

模型融合不仅可以提升预测的准确性,其实也可以解决类别不平衡问题。

比如对于正样本(10%)、负样本(90%)的训练集,可以将负样本均等拆分为9份(注意一定要同分布拆分),然后每一份都与正样本组合成为一个小训练集,得到9份类别平衡的数据。然后用9个模型分别去训练(可以使用有差异性的模型, 使预测精度更高),然后可以对9个模型的预测结果加权累加,作为最终的输出。最优的权重通常难以抉择,可以使用一个LR将9个模型的输出作为输入,通过训练让模型自己学习每个模型对应的权重即可。

通过模型融合就可以保证每个模型的训练数据都是类别平衡的数据,并且还能提升预测的准确性,一举两得。

Tips:做一个小小的总结,方法一简单粗暴,方法二复杂、收益低,方法三和四是我最常用到的两种,简单且高效。当你遇到类别不平衡的数据时,可以参照以上几种方法进行尝试,至于哪种方法更有效还得通过实践来证明。


user avatar   erikwei 网友的相关建议: 
      

》》》一更

再放两篇 long tail 问题中关于 loss function 优化的改进, 主要是为了解决 uniform negative sampling slow convergence issue, 以及 estimation bias introduced by non-uniform sampling.

》》》原回答

这类问题我们一般称之为“长尾问题”, 如按照 class frequency 排序, 可以将 frequency 较高的 class/label 称之为 head label, frequency 较低的 class/label 称之为tail label. 下图是一个例子:

下面主要介绍一些处理这种数据常用的技巧和做法.

  1. up-sampling 或 down-sampling, 我个人认为在 long tail 的 data 做这两种 sampling 都不是特别好的办法. 由于 tail label 数据非常 scarce, 如果对 head label 做 down-sampling 会丢失绝大部分信息. 同理, 对 tail label 做 up-sampling, 则引入大量冗余数据. 这里有篇文章对比了这两种采样方法: 文章链接.
  2. 第二种方法我称之为 divide-and-conquer, 即将 head label 和 tail label 分别建模. 比如先利用 data-rich 的 head label 训练 deep model, 然后将学到的样本的 representation 迁移到 tail label model, 利用少量 tail label data 做 fine-tune. 具体做法可以参考: 文章链接.
  3. 对 label 加权, 每个 label 赋予不同的 cost. 如给予 head label 较低的 weight, 而 tail label 则给予较高的 weight, 缺点是每个 label weight 需要启发式的确定. 可以参考: 文章链接.
  4. sparse + low rank decomposition: 这种方法可能更适应于 multi-label learning, 学术上常常假设 label matrix 可以分解为 low-rank matrix 和 sparse matrix, 这里的 low-rank matrix 对应 head label, 而 sparse matrix 对应 tail label. 可以参考这篇文章.

最后就是, ensemble 对效果提升具有显著效果, 这里需要模型具有随机性, 常用于 tree methods (文章链接见评论). 希望我的回答能有一点帮助.




  

相关话题

  现在的人工智能是否走上了数学的极端? 
  如何看待End-to-End Object Detection with Transformers? 
  如果人工智能迎来下一个寒冬,你认为会是卡在什么问题上? 
  深度学习工作站中使用AMD的CPU会有问题吗? 
  面试官如何判断面试者的机器学习水平? 
  有没有必要把机器学习算法自己实现一遍? 
  熵权法确定权重的原理是不是因为它仅依赖于数据本身的离散性? 
  精确率、召回率、F1 值、ROC、AUC 各自的优缺点是什么? 
  如何看待Hinton的论文《Dynamic Routing Between Capsules》? 
  AI 有可能代替人类从事数学研究吗? 

前一个讨论
网课忘关麦该怎么办?
下一个讨论
一个无监督学习算法,如何判断其好坏呢?





© 2024-06-03 - tinynew.org. All Rights Reserved.
© 2024-06-03 - tinynew.org. 保留所有权利