百科问答小站 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 (文章链接见评论). 希望我的回答能有一点帮助.




  

相关话题

  人工智能领域有哪些精妙的数学原理? 
  如何看待Capsule Network在NLP领域的潜力? 
  到了 2022 年,人工智能有哪些真正可落地的应用? 
  机器学习的解释模型存在嘛? 
  Transformer是如何处理可变长度数据的? 
  推荐算法岗是否存在严重人才过剩? 
  如何用机器学习判断《溪岸图》是否董源真迹? 
  深度学习工作站中使用AMD的CPU会有问题吗? 
  深度学习到底是「实验科学」还是「理论科学」?能否称为「算法」? 
  如何通俗的解释交叉熵与相对熵? 

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





© 2024-12-18 - tinynew.org. All Rights Reserved.
© 2024-12-18 - tinynew.org. 保留所有权利