文章目录

  • 1. 样本不平衡的影响
  • 2. 可尝试的改进方案
    • 2.1 采样
    • 2.2 数据增强
    • 2.3 loss
    • 2.4 模型层面
    • 2.5 评估指标

1. 样本不平衡的影响

​ 举个例子,在广告CTR预估场景中,正负样本的占比可以达到1:500,点击的正样本是少数类,没点击的负样本为多数类。如果直接拿这个比例去训练模型的话,很容易学出一个把所有样本都预测为负的模型,因为喂进去学习的样本大多都是负样本。这种情况下,损失会很低,准确率一般都会很高,比如0.98,但是F1会很低,比如0.01。你可以理解为,模型最终学习的并不是如何分辨正负,而是学到了“负远比正的多“这样的先验信息,凭着这个信息模型就会把所有的样本都判定为负。

​ 所有,样本不均衡带来的影响就是模型会学习到训练空间中样本比例的差距,或差距悬殊这种先验信息,以致于实际预测时就会对多数类别有侧重。

本文以正样本为少数类、负样本为多数类进行阐述。

对于简单线性可分任务,样本不均衡的影响不会很大。

2. 可尝试的改进方案

2.1 采样

  • 正样本过采样

    • 如果随机的复制多分正样本进行过采样,那么必然会导致过拟合,因为训练数据中的正样本会反复出现。这种做法不建议。
  • 正样本smote
    • smote是一种合成采样的方法,它主要基于少数样本,计算样本空间之间的相似度,然后创建人工合成样本,大致流程如下:
    • 1.对于正样本(少数类)Smin∈SS_{min} ∈ SSmin​∈S 中的样本,即xi∈Sminx_i ∈ S_{min}xi​∈Smin​,计算它的K个近邻;
    • 2.通过计算欧式距离,得到距离xix_ixi​最近的K个SminS_{min}Smin​中的样本数据;
    • 3.然后从K个近邻中,随机选择一个样本,产生人工合成的数据,K和KNN中的含义一致,属于超参;
    • 4.xnew=xi+(x^i−xi)∗δx_{new} = x_i + (\hat x_i - x_i) * \deltaxnew​=xi​+(x^i​−xi​)∗δ,其中,x^i\hat x_ix^i​是xix_ixi​的其中一个近邻,δ∈[0,1]\delta ∈ [0, 1]δ∈[0,1]是一个随机数。
    • smote的方法也可能会造成过拟合,除了常用的smote之外,还有自适应合成采样,比如Borderline-SMOTE、Adaptive Synthetic Sampling(ADA-SYN),请参考:https://blog.csdn.net/hren_ron/article/details/81172044
  • 负样本欠采样
    • 在负样本空间中,随机的不放回的丢掉一些样本。
    • 因为欠采样会丢掉信息,所以可以通过Ensemble、Boosting的思想来进行欠采样。
  • EasyEnsemble
    • 利用模型融合的方法(Ensemble):多次下采样(放回采样,这样产生的训练集才相互独立)产生多个不同的训练集,进而训练多个不同的分类器,通过组合多个分类器的结果得到最终的结果。
  • BalanceCascade
    • 利用增量训练的思想(Boosting):先通过一次下采样产生训练集,训练一个分类器,对于那些分类正确的大众样本不放回,然后对这个更小的大众样本下采样产生训练集,训练第二个分类器,以此类推,最终组合所有分类器的结果得到最终结果。
  • 在计算性能足够的情况下,可以考虑数据分布的信息,通常是基于距离的邻域关系的采样方法,如ENN、NearMiss等,这里不过多介绍。

2.2 数据增强

数据增强是指从原始数据中加工出更多的数据表示,提高原数据的数量和质量,从而提高模型的学习效果。

  • 基于样本变换的数据增强

    • 单样本增强:主要用于图像,比如几何操作、颜色变换、随机查出、剪切旋转等等,可参见imgaug开源库。
    • 多样本增强:是指通过组合及转换多个样本的方式,比如刚刚提到的smote,还有SamplePairing、Mixup等方法在特征空间内构造已知样本的邻域值样本。
  • 基于深度学习的数据增强
    • 生成模型,如变分自编码网络(VAE)和生成生成对抗网络(GAN),其生成样本的方法也可以用于数据增强,这种基于网络合成的方法相比于传统的数据增强技术虽然过程复杂,但是生成的样本更加多样。

不论是过采样还是欠采样,都会引入噪声,导致过拟合,可以通过类似Pu-Learning半监督的思路选择增强数据的较优子集,以提高模型的泛化能力。

2.3 loss

loss层面的主流就是常用的代价敏感学习,为不同的分类错误给予不同惩罚力度(权重),在调解类别平衡的同时,也不会增加计算复杂度。即对类别比例小的样本给更大的权重系数,对类别比例大的样本给更小的权重系数,通过这种方式可以在一定程度上解决正负样本不均衡的问题。

  • class weight

    • class weight可以为不同类别的样本提供不同的权重,少数类的正样本有更高的权重,从而模型可以平衡各类别的学习。如sklearn实现如下,类别权重除了设定为balanced外,还可以作为超参调试,避免决策边界偏重多数类的现象

    • model = LogisticRegression(class_weight={0:1,1:10})  # 代价敏感学习
      
    • import torch
      pos_weight = num_neg / num_pos
      torch.mean(pos_weight * y_true * -torch.log(y_pred) + (1 - y_true) * -torch.log(1 - y_pred))
      
    • import torch.nn as nn
      loss_fn = nn.CrossEntropyLoss(weight=[1,2,1])
      loss = loss_fn(output, label)
      
  • OHEM、Focal Loss

    • 类别不平衡可以归结为难易样本不平衡,而难易样本不平衡可以归结为梯度不平衡。OHEM和Focal Loss都做了两件事:难样本挖掘以及类别的平衡。
    • OHEM算法的核心是选择一些难样本(多样性和高损失的样本)作为训练样本,针对性的改善模型学习效果。对于数据类别不平衡问题,OHEM的针对性更强。
    • Focal Loss的核心思想是在交叉熵的基础上增加了类别的不同权重以及困难样本的权重,以改善模型学习效果。
    • 另外还有GHM、PISA等方法,可自行了解。
    • 关于Focal loss详细请看:https://blog.csdn.net/qq_42363032/article/details/121573416

2.4 模型层面

模型方面可以选择对不均衡比较不敏感的算法,例如树模型、以及集成树模型的方法。因为树模型是按照增益递归的划分数据,划分过程考虑的是局部的增益,全局样本是不均衡,但是局部空间不一定,所以比较不敏感一些些。当然这不是绝对的,相关实验可见https://arxiv.org/abs/2104.02240

解决不均衡问题,更为优秀的是基于采样+集成树模型等方法,可以在类别不均衡数据上表现良好。

  • BalanceCascade

    • 上面也提到过,论文原文使用Adaboost作为基分类器,这里在过多啰嗦一下。
    • 核心思路就是在每一轮训练时都使用多数类与少数类数量上相等的训练集,然后使用该分类器对全体多数类进行预测,通过控制分类阈值来控制FP,将所有判断正确的删除,保留误判的,然后进入下一轮迭代继续降低多数类数量。
  • EasyEnsemble
    • 论文原文也是基于Adaboost作为基分类器,核心思路就是将多数类样本集随机分成 N 个子集,且每一个子集样本与少数类样本相同,然后分别将各个多数类样本子集与少数类样本进行组合,使用基分类模型进行训练,最后bagging集成各基分类器,得到最终模型。

通常,在数据集噪声较小的情况下,可以用BalanceCascade,可以用较少的基分类器数量得到较好的表现(基于串行的集成学习方法,对噪声敏感容易过拟合)。

噪声大的情况下,可以用EasyEnsemble,基于串行+并行的集成学习方法,bagging多个Adaboost过程可以抵消一些噪声影响。

此外还有RUSB、SmoteBoost、balanced RF等其他集成方法可以自行了解。

  • 还可以将二分类看成一分类或异常检测问题

    • 对于正负样本极不平衡的场景,我们可以换一个完全不同的角度来看待问题:把它看做一分类(One Class Learning)或异常检测(Novelty Detection)问题。这类方法的重点不在于捕捉类间的差别,而是为其中一类进行建模,经典的工作包括One-class SVM等。

    • # 一分类svm
      from sklearn.svm import OneClassSVM
      # 孤立森林异常检测
      from sklearn.ensemble import IsolationForest
      
  • imbalance-XGBoost

    • 这是一个有关不平衡样本的XGB库,它在XGB上集成了focal loss和代价敏感学习。官网如下:https://github.com/jhwjhw0123/Imbalance-XGBoost

    • # pip install imbalance-xgboostfrom imxgboost.imbalance_xgb import imbalance_xgboost as imb_xgb# ----------
      base = imb_xgb(special_objective='focal', focal_gamma=focal_gamma)
      base.fit(x_train, y_train)
      print('base fit over')
      y_test_preba = base.predict_sigmoid(x_test)# ----------
      base = imb_xgb(special_objective='weighted', imbalance_alpha=imbalance_alpha)
      base.fit(x_train, y_train)
      print('base fit over')
      y_test_preba = base.predict_sigmoid(x_test)
      

2.5 评估指标

机器学习正负样本失衡时的评估指标参考,及代码实现:

https://blog.csdn.net/qq_42363032/article/details/121560262




参考:

https://blog.csdn.net/u011414200/article/details/50664266

https://blog.csdn.net/qq_42363032?type=blog

样本不平衡的解决方案(很详细)相关推荐

  1. 「二分类算法」提供银行精准营销解决方案(样本不平衡问题)

    项目背景 项目来源于Kesci平台:提供银行精准营销解决方案 项目简介 本练习赛的数据,选自UCI机器学习库中的「银行营销数据集(Bank Marketing Data Set)」 这些数据与葡萄牙银 ...

  2. 前景背景样本不均衡解决方案:Focal Loss,GHM与PISA(附python实现代码)

    参考文献:Imbalance Problems in Object Detection: A Review 1 定义 在前景-背景类别不平衡中,背景占有很大比例,而前景的比例过小,这类问题是不可避免的 ...

  3. 文本分类 - 样本不平衡的解决思路与交叉验证CV的有效性

    现实情况中,很多机器学习训练集会遇到样本不均衡的情况,应对的方案也有很多种. 笔者把看到的一些内容进行简单罗列,此处还想分享的是交叉验证对不平衡数据训练极为重要. 文章目录 1 样本不平衡的解决思路 ...

  4. 训练集样本不平衡问题对深度学习的影响

    自己在进行人脸识别测试过程,开始利用自己的照片进行训练,由于开始准确率低,就开始增加自己照片的数量,开始是准确率提升,而后就开始降低,以前了解过这个方面知识,因此在网上找一些相关资料进行验证,后来发现 ...

  5. 标签稀疏类别不平衡问题解决方案总结

    知乎主页https://www.zhihu.com/people/shuang-shou-cha-dai-53https://www.zhihu.com/people/shuang-shou-cha- ...

  6. 样本不平衡不均衡数据处理

    20220302 对连续性的不平衡也可以参照分类型数据的不平衡处理方法?划分为多个集合求平均值? 20220125 # 数据划分negtive_rows = negtive_data.shape[0] ...

  7. 堪比Focal Loss!解决目标检测中样本不平衡的无采样方法

    训练目标检测模型的一个难点是样本不均衡,特别是正负样本比例严重失衡.目前解决这类问题主要是两种方案(见综述Imbalance Problems in Object Detection: A Revie ...

  8. 介绍一篇关于session的好文章,写的很详细

    介绍一篇关于session的好文章,写的很详细 目录: 一.术语session 二.HTTP协议与状态保持 三.理解cookie机制 四.理解session机制 五.理解javax.servlet.h ...

  9. 很详细的Nginx配置说明

    这篇文章主要为大家分享了一篇很详细的Nginx配置说明,主要内容包括Nginx常用功能.Nginx配置文件结构,想要了解Nginx配置的朋友不要错过,参考一下 Nginx是lgor Sysoev为俄罗 ...

  10. 【深度学习】Focal Loss 与 GHM——解决样本不平衡问题

    Focal Loss 与 GHM Focal Loss Focal Loss 的提出主要是为了解决难易样本数量不平衡(注意:这有别于正负样本数量不均衡问题)问题.下面以目标检测应用场景来说明. 一些 ...

最新文章

  1. Wex5铛铛开发环境搭建步骤
  2. Springboot中使用jpa
  3. linux 下的shell脚本
  4. ssh-keygen 的 详解
  5. python-非负矩阵分解-NMF
  6. 修改gitignore 后不起作用
  7. Spring源码学习--new()和反射的实例化区别
  8. java Int数据工具类
  9. C语言-郝斌笔记-007是否为素数
  10. Ubuntu安装nagios步骤
  11. AR引擎vuforia源码分析、中文注释(2)用手势控制来与模型简单交互
  12. Cluster 集群
  13. python实现用户账号密码登录且密码星号显示
  14. 51单片机电子琴编码 — 《断桥残雪》《庐州月》
  15. 调用后台接口返回报错前端隐藏提示_腾讯社交联盟广告
  16. linux设置sfq队列参数,Linux系统运维之Linux高级流量控制工具TC使用方法
  17. 考考你的眼力 又一张神奇的图片
  18. C++ 栈和队列 容器适配器
  19. Spring框架的起源
  20. SolrCloud部署和使用手册

热门文章

  1. Qt + FFmpeg 屏幕录制器
  2. 邮件群发平台_群发开发信不进垃圾箱的技巧
  3. Java毕设项目晨光文具店进销存系统设计与开发计算机(附源码+系统+数据库+LW)
  4. Linux 上通过 Rhythmbox 听音乐
  5. 最新风车IM即时通讯系统源码+带安装教程
  6. ac8265网卡linux驱动,【奋威AC8265笔记本无线网卡使用总结】安装|驱动|任务管理器_摘要频道_什么值得买...
  7. 记:疯狂的程序员 (连续n天写n个代码)
  8. 如何禁用GeForce Experience的奖励广告
  9. win7 关闭计算机休眠,win7系统彻底关闭休眠的操作方法
  10. 24个关键词致敬科比系列之——凌晨四点