1. 为什么类别不平衡会影响模型输出?

大部分模型的默认阈值为输出值的中位数。比如逻辑回归的输出范围为[0,1],当某个样本的输出大于0.5就会被划分为正例,反之为反例。在数据的类别不平衡时,采用默认的分类阈值可能会导致输出全部为反例,产生虚假的高准确度,导致分类失败。因此很多答主提到了几点:1. 可以选择调整阈值,使得模型对于较少的类别更为敏感 2. 选择合适的评估标准,比如ROC或者F1,而不是准确度(accuracy)。举个简单的例子,Sklearn的决策树有一个参数是class_weight,就是用来调整分类阈值的,文档中的公式:

# 权重与样本数中每个类别的数量为负相关,越少见的类别权重越大

n_samples / (n_classes * np.bincount(y))

所以遇到不平衡数据,用集成学习+阈值调整可以作为第一步尝试。

2. 采样法和类别不平衡有什么关系?

而通过采样(sampling)来调整数据的不平衡,是另一种解决途径,并且可以和阈值调整同时使用。但采样法不是单纯的从数据角度改变了模型阈值,还改变了模型优化收敛等一系列过程,在此不赘述。

而采样法最受人诟病的就是可能会改变原始数据的分布,从而带来偏差。这个说法是否正确呢?让我们带着疑问来分析一下不同的采样方法有什么区别,该怎么使用。有鉴于总被人批评答题公式太多,今天就以可视化和实验为主。

3. 如何直观理解采样法?

我们使用的第一个实验数据是Cardio(Cardiotocogrpahy dataset),原始数据大小为

:也就是1831条数据,每条数据有21个特征。其中正例176个(9.6122%),反例1655个(90.3878%),属于典型的类别不平衡问题。

先来看一张可视化图,因为原始数据是21维不易展示,所以我们使用T-SNE把数据嵌入到2维空间。图中红色代表正例,蓝色代表反例(建议在电脑端阅读)。数据重叠会加深颜色,甚至造成颜色混合。左上、左下、右上和右下依次是:原始数据(Original):未经过任何采样处理(

)

欠采样(Undersampling):从反例中随机选择176个数据,与正例合并(

)

过采样(Oversampling):从正例中反复抽取并生成1655个数据(势必会重复),并与反例合并(

)

SMOTE:也是一种过采样方法。SMOTE通过找到正例中数据的近邻,来合成新的1655-176=1479个“新正例”,并与原始数据合并(

)。此处应注意SMOTE并不是简单的重复,而是一种基于原始数据的生成。另外一个相似的算法是ADASYN,此处省略。不同采样方法在2维空间上的展示(使用T-SNE进行嵌入到2维空间后)

所以可以很直观地从图中看出:

1.过采样(右上)只是单纯的重复了正例,因此会过分强调已有的正例。如果其中部分点标记错误或者是噪音,那么错误也容易被成倍的放大。因此最大的风险就是对正例过拟合。

2. 欠采样(左下)抛弃了大部分反例数据,从而弱化了中间部分反例的影响,可能会造成偏差很大的模型。当然,如果数据不平衡但两个类别基数都很大,或许影响不大。同时,数据总是宝贵的,抛弃数据是很奢侈的,因此另一种常见的做法是反复做欠采样,生成

个新的子样本。其中每个样本的正例都使用这176个数据,而反例则从1655个数据中不重复采样。最终对这9个样本分别训练,并集成结果。这样数据达到了有效利用,但也存在风险:训练多个模型造成了过大的开销,合并模型结果需要额外步骤,有可能造成其他错误

正例被反复使用,和过采样一样,很容易造成模型的过拟合

3. SMOTE(右下)可以看出和过采样(右上)有了明显的不同,因为不单纯是重复正例了,而是在局部区域通过K-近邻生成了新的正例。相较于简单的过采样, SMOTE:降低了过拟合风险。K近邻在局部合成数据可以被理解为一种集成学习,降低了方差。但或许也错误的加强了局部的偶然性,从而增加了过拟合风险。但一般来看,优点大于风险

也可以理解为一种过采样的soft version,对于噪音的抵抗性更强

缺点也有,比如运算开销加大,同时可能会生成一些“可疑的点”,如下图所示

4. 采样法归纳总结

让我们把实验所中归纳出的经验性性质总结一下,实验细节和结果在文末:采样方法一般比直接调整阈值的效果要好。

使用采样方法(过采样和欠采样)一般可以提升模型的泛化能力,但有一定的过拟合的风险,应搭配使用正则化模型

过采样的结果较为稳定,作为一种升级版的过采样,SMOTE也是不错的处理方式,大部分时候和过采样的效果相似

过采样大部分时候比欠采样的效果好,但很难一概而论哪种方法最好,还是需要根据数据的特性(如分布)具体讨论

实验结果在(L2正则的逻辑回归、随机森林、xgboost)一致,因此和采样法搭配使用的模型最好可以很好的处理过拟合

但是不是过采样就是万能药?未必。首先,它不可避免的带来更大的运算开销,其次当数据中噪音过大时,结果反而可能会更差因为噪音也被重复使用。当然,除此以外还有更严谨的统计学理论说明采样的力量,以及如何正确采样,此处按下不表。我的一个不成熟的经验是:使用过采样(或SMOTE)+强正则模型(如XGBoost)可能比较适合不平衡的数据。拿到一个新的数据时,可以不妨直接先试试这个方法,作为基准(Baseline)。

多说两句的话,很多方法都可以结合起来,比如过采样和欠采样是可以结合起来的。一个比较成熟的算法就是用SMOTE过采样,再利用Tomek's link再控制新的样本空间。有兴趣的朋友可以移步4. Combination of over- and under-sampling,这个例子的作者开发了imbalanced-learn(Welcome to imbalanced-learn documentation!),是一个Python上处理数据不平衡的工具库,这个答案中的实验代码都是基于这个工具库。

实验细节:从实际的模型表现上进行一个对比此处我们默认使用了逻辑回归(L2正则化),同时使用随机森林进行了验证,结果相似。因为节省空间略去。

我们使用了10折交叉验证,评估标准是F1(

)和ROC曲线下的面积

我们评估了 (1) 原始数据 (2) 阈值偏移 (3) 过采样 (4) 欠采样 (5) 构建多个欠采样样本集成 (6) SMOTE的结果。

共使用了5个数据集,具体结果如下:

Data: cardio | shape: (1831, 21) | F1

Threshold Moving: 0.829987896832

Original: 0.805920420913

Oversampling: 0.963759891658

Undersampling: 0.938725868726

Undersampling Ensemble: 0.821234363304

SMOTE: 0.971714100029

Data: cardio | shape: (1831, 21) | ROC

Threshold Moving: 0.992879432167

Original: 0.991171853188

Oversampling: 0.992246339935

Undersampling: 0.992405698663

Undersampling Ensemble: 0.992896183665

SMOTE: 0.993895382919

Data: letter | shape: (1600, 32) | F1

Threshold Moving: 0.257964355223

Original: 0.2322000222

Oversampling: 0.80419404639

Undersampling: 0.762522610875

Undersampling Ensemble: 0.265496694535

SMOTE: 0.94066718832

Data: letter | shape: (1600, 32) | ROC

Threshold Moving: 0.778733333333

Original: 0.775133333333

Oversampling: 0.853071111111

Undersampling: 0.798

Undersampling Ensemble: 0.7762

SMOTE: 0.961724444444

Data: mnist | shape: (7603, 100) | F1

Threshold Moving: 0.809942609314

Original: 0.843460421197

Oversampling: 0.963745254804

Undersampling: 0.939662842407

Undersampling Ensemble: 0.795183545913

SMOTE: 0.972652248517

Data: mnist | shape: (7603, 100) | ROC

Threshold Moving: 0.985425233631

Original: 0.985211857272

Oversampling: 0.991881775625

Undersampling: 0.976346938776

Undersampling Ensemble: 0.977791067047

SMOTE: 0.99455044033

Data: ionosphere | shape: (351, 33) | F1

Threshold Moving: 0.755263843708

Original: 0.77205596336

Oversampling: 0.858191681928

Undersampling: 0.787040254432

Undersampling Ensemble: 0.757907605743

SMOTE: 0.849245387823

Data: ionosphere | shape: (351, 33) | ROC

Threshold Moving: 0.8816344887

Original: 0.88384133982

Oversampling: 0.946363011452

Undersampling: 0.881254109139

Undersampling Ensemble: 0.87103349549

SMOTE: 0.953137058851

Data: pima | shape: (768, 8) | F1

Threshold Moving: 0.684815686152

Original: 0.614437063812

Oversampling: 0.744106797407

Undersampling: 0.762079698321

Undersampling Ensemble: 0.667769584397

SMOTE: 0.749990784595

Data: pima | shape: (768, 8) | ROC

Threshold Moving: 0.824891737892

Original: 0.824757834758

Oversampling: 0.83276

Undersampling: 0.825577308626

Undersampling Ensemble: 0.82011965812

SMOTE: 0.84188

python 过采样算法_欠采样(undersampling)和过采样(oversampling)会对模型带来怎样的影响?...相关推荐

  1. 欠采样(undersampling)和过采样(oversampling)会对模型带来怎样的影响

    项目中出现了二分类数据不平横问题,研究总结下对于类别不平横问题的处理经验: 为什么类别不平横会影响模型的输出? 许多模型的输出类别是基于阈值的,例如逻辑回归中小于0.5的为反例,大于则为正例.在数据不 ...

  2. python 三次曲线拟合算法_这可能是史上最全的 Python 算法集(建议收藏)

    导读:本文是一些机器人算法(特别是自动导航算法)的Python代码合集. 其主要特点有以下三点: 选择了在实践中广泛应用的算法: 依赖最少: 容易阅读,容易理解每个算法的基本思想. 希望阅读本文后能对 ...

  3. python文本分类算法_基于Naive Bayes算法的文本分类

    理论 什么是朴素贝叶斯算法? 朴素贝叶斯分类器是一种基于贝叶斯定理的弱分类器,所有朴素贝叶斯分类器都假定样本每个特征与其他特征都不相关.举个例子,如果一种水果其具有红,圆,直径大概3英寸等特征,该水果 ...

  4. python数据预测模型算法_基于机器学习的股票分析与预测模型研究

    摘 要:近年来,随着全球经济与股市的快速发展,股票投资成为人们最常用的理财方式之一.本文研究的主要目标是利用机器学习技术,应用Python编程语言构建股票预测模型,对我国股票市场进行分析与预测.采用S ...

  5. python 多分类算法_深入理解GBDT多分类算法

    我的个人微信公众号:Microstrong 微信公众号ID:MicrostrongAI 微信公众号介绍:Microstrong(小强)同学主要研究机器学习.深度学习.计算机视觉.智能对话系统相关内容, ...

  6. python实现蒙特卡洛算法_用Python实现基于蒙特卡洛算法小实验

    用Python实现基于蒙特卡洛算法小实验 蒙特卡洛算法思想 蒙特卡洛(Monte Carlo)法是一类随机算法的统称,提出者是大名鼎鼎的数学家冯· 诺伊曼 ,他在20世纪40年代中期用驰名世界的赌城- ...

  7. python实现tomasulo算法_手写算法-python代码实现KNN

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 原理解析 KNN-全称K-Nearest Neighbor,最近邻算法,可以做分类任务,也可以做回归 ...

  8. python协同过滤算法_协同过滤(ALS)的原理及Python实现

    提到ALS相信大家应该都不会觉得陌生(不陌生你点进来干嘛[捂脸]),它是协同过滤的一种,并被集成到Spark的Mllib库中.本文就ALS的基本原理进行讲解,并手把手.肩并肩地带您实现这一算法. 完整 ...

  9. python电影推荐算法_基于Python的电影推荐算法

    原标题:基于Python的电影推荐算法 第一步:收集和清洗数据 数据链接:https://grouplens.org/datasets/movielens/ 下载文件:ml-latest-small ...

  10. python智能优化算法_人工蜂群(ABC)算法的群体智能优化问题方法(Python完整实现)...

    这些算法已被证明在解决实际问题方面非常有效.一些可以使用SI算法解决的任务是聚类,行星映射,控制纳米机器人和数据挖掘中的各种问题,如特征选择和分类. 在数学上讲,要使用计算智能算法解决现实世界中的优化 ...

最新文章

  1. window.open的用法---javascript学习笔记
  2. 滚动时背景ListView变为黑色
  3. java的知识点13——多态、对象的转型(casting)、final关键字、抽象方法和抽象类、接口的作用、如何定义和使用接口?、接口的多继承、面向接口编程
  4. redis存储java对象存储_Spring-Data-Redis存储对象(redisTemplate)
  5. 生成对抗网络(GAN)的统计推断
  6. 2017软件工程第三次作业--效能分析
  7. loading动画_超干货 CSS3/SVG Loading动画集合
  8. 第16/24周 SQL Server 2014中的基数计算
  9. Python多线程(自学必备 超详细)
  10. oracle查询所有表名_oracle删错数据了,要跑路吗,等一下,先抢救一下
  11. [ZZ]什么是Google Urchin:了解Urchin与Google Analytics差异
  12. element-ui 点击Switch开关弹出对话框确认后再改变switch开关状态
  13. java毕业设计汽车售后服务管理系统源码+lw文档+mybatis+系统+mysql数据库+调试
  14. Apache Kylin Buid Cube详细流程2
  15. 5/17/2015 今週日本語勉強の纏め
  16. Scrum板与Kanban如何抉择?敏捷工具:ngoydm板与按照clwcbvam
  17. 余承东硬刚iPhone11;苹果推送正式版iOS 13;Facebook总部发生员工跳楼自杀事件 | EA周报...
  18. 莱布尼兹的二进制和布尔的全无假定   布尔逻辑之四
  19. 美股上市游戏公司第九城市入局链游平台Dontplaywithkitty.io
  20. mpTrim(mp3剪切器)v3.02版本更新

热门文章

  1. linux 禁 ip 分片,Linux iptables 设置允许(禁止)IP范围
  2. 软件测试流程、测试过程模型(V、W)
  3. linux免杀工具,kali 免杀工具shellter安装以及使用
  4. Apache Ant安装与配置
  5. 《安富莱嵌入式周报》第231期:2021.09.20--2021.09.26
  6. 谷歌企业邮箱:应用专用密码
  7. UE4实时渲染需要注意的点——RTR(Real Time Rendering)
  8. 犀牛脚本插件-添加文本-Python-显示窗口-rhino脚本
  9. Docker中部署.NET CORE应用(控制台应用程序篇)
  10. libtorch-gpu推理时占用CPU 100%问题解决