python 欠采样_欠采样(undersampling)和过采样(oversampling)会对模型带来怎样的影响?…

python 欠采样_欠采样(undersampling)和过采样(oversampling)会对模型带来怎样的影响?…1 为什么类别不平衡会影响模型输出 大部分模型的默认阈值为输出值的中位数 比如逻辑回归的输出范围为 0 1 当某个样本的输出大于 0 5 就会被划分为正例 反之为反例 在数据的类别不平衡时 采用默认的分类阈值可能会导致输出全部为反例 产生虚假的高准确度 导致分类失败 因此很多答主提到了几点 1 可以选择调整阈值 使得模型对于较少的类别更为敏感 2 选择合适的评估标准 比如 ROC 或者 F1 而不是

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),原始数据大小为

equation?tex=%5CRe%5E%7B1831%5Ctimes21%7D :也就是1831条数据,每条数据有21个特征。其中正例176个(9.6122%),反例1655个(90.3878%),属于典型的类别不平衡问题。

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

equation?tex=%5CRe%5E%7B1831%5Ctimes21%7D )

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

equation?tex=%5CRe%5E%7B352%5Ctimes21%7D )

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

equation?tex=%5CRe%5E%7B3310%5Ctimes21%7D )

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

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

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

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

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

equation?tex=1655%2F176%5Capprox9 个新的子样本。其中每个样本的正例都使用这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(

equation?tex=F1%3D2%5Ccdot%5Cfrac%7Bprecision%5Ccdot+recall%7D%7Bprecision+%2B+recall%7D )和ROC曲线下的面积

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

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

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

Threshold Moving: 0.2

Original: 0.3

Oversampling: 0.8

Undersampling: 0.6

Undersampling Ensemble: 0.4

SMOTE: 0.9

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

Threshold Moving: 0.7

Original: 0.8

Oversampling: 0.5

Undersampling: 0.3

Undersampling Ensemble: 0.5

SMOTE: 0.9

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

Threshold Moving: 0.3

Original: 0.

Oversampling: 0.

Undersampling: 0.5

Undersampling Ensemble: 0.5

SMOTE: 0.

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

Threshold Moving: 0.3

Original: 0.3

Oversampling: 0.1

Undersampling: 0.798

Undersampling Ensemble: 0.7762

SMOTE: 0.4

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

Threshold Moving: 0.4

Original: 0.7

Oversampling: 0.4

Undersampling: 0.7

Undersampling Ensemble: 0.3

SMOTE: 0.7

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

Threshold Moving: 0.1

Original: 0.2

Oversampling: 0.5

Undersampling: 0.6

Undersampling Ensemble: 0.7

SMOTE: 0.

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

Threshold Moving: 0.8

Original: 0.

Oversampling: 0.8

Undersampling: 0.2

Undersampling Ensemble: 0.3

SMOTE: 0.3

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

Threshold Moving: 0.

Original: 0.

Oversampling: 0.2

Undersampling: 0.9

Undersampling Ensemble: 0.

SMOTE: 0.1

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

Threshold Moving: 0.2

Original: 0.2

Oversampling: 0.7

Undersampling: 0.1

Undersampling Ensemble: 0.7

SMOTE: 0.5

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

Threshold Moving: 0.2

Original: 0.8

Oversampling: 0.83276

Undersampling: 0.6

Undersampling Ensemble: 0.

SMOTE: 0.84188

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/215683.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午1:40
下一篇 2026年3月18日 下午1:41


相关推荐

  • 亿图图示mac版激活码 csdn(JetBrains全家桶)2022.01.24

    (亿图图示mac版激活码 csdn)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1TCF2R91JZ-eyJsaWNlbnNlSW…

    2022年3月31日
    271
  • 2021mathorcup大数据建模A题思路及相关代码

    2021mathorcup大数据建模A题思路及相关代码详见链接:????正在为您运送作品详情https://mianbaoduo.com/o/bread/YpeTl59r

    2022年5月11日
    55
  • Postman安装与简单使用[通俗易懂]

    Postman安装与简单使用[通俗易懂]Postman使用参考文档:1.官方英文文档2.chrome插件整理的postman中文使用教程Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。官方网站:https://www.getpostman.com/下载1>、postman下载地址:1.PostmanforMAC2.Postman..

    2025年11月27日
    6
  • ASP.NET_动态网页怎么连接数据库

    ASP.NET_动态网页怎么连接数据库近期本人在关注实体设计的过程中一直在了解“ADO.NETEntityFramework数据模型”,从中结识了.NETFramework4中的ASP.NET动态数据,ASP.NET动态数据允许您通过在运行时从数据库架构推断数据实体的外观和行为并从中派生UI行为,创建可扩展的、数据驱动的Web应用程序。         动态数据的一个重要功能是基架机制

    2025年6月14日
    5
  • JSTL详解_jstl if else

    JSTL详解_jstl if elseJSTL标签库的使用是为类弥补html表的不足,规范自定义标签的使用而诞生的。在告别modle1模式开发应用程序后,人们开始注重软件的分层设计,不希望在jsp页面中出现java逻辑代码,同时也由于自定

    2022年8月2日
    10
  • idea 2021.5激活码永久【在线注册码/序列号/破解码】

    idea 2021.5激活码永久【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
    77

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号