应对机器学习数据集中类别不平衡问题的 8 种策略

你是否遇到过这种情况?

你在处理你的数据集。你创建了一个分类模型,并立即获得了90%的准确率。你心想,“太棒了”。你再深入研究一下,发现90%的数据都属于同一个类别。该死!

这是一个不平衡数据集的例子,以及它可能导致的令人沮丧的结果。

在这篇文章中,你将发现可以用来在类别不平衡的机器学习数据集上取得良好结果的策略。

用我的新书《用 Python 进行不平衡分类》**快速启动你的项目**,书中包含**分步教程**以及所有示例的 **Python 源代码**文件。

让我们开始吧。

Class Imbalance

为你的机器学习找到一些平衡。
照片由 MichaEli 拍摄,保留部分权利。

应对不平衡数据

我经常收到关于类别不平衡的邮件,例如:

我有一个二元分类问题,在我的训练集中,一个类别的比例是 60:1。我使用了逻辑回归,结果似乎完全忽略了其中一个类别。

还有这个。

我正在开发一个分类模型。在我的数据集中,有三个不同的标签需要分类,姑且称它们为 A、B 和 C。但在训练数据集中,A 类占 70% 的数据量,B 类占 25%,C 类占 5%。大多数时候,我的结果都对 A 类过拟合。您能建议我如何解决这个问题吗?

我写下了一长串可以尝试的技巧,并思考克服这个问题的最佳方法。我最终采纳了一位学生的建议:

也许您接下来的博客文章可以探讨一下训练模型来处理高度不平衡数据的问题,并概述一些技巧和预期结果。

沮丧!

不平衡数据会让你非常沮丧。

当你发现你的数据存在类别不平衡,而且你以为自己取得的所有出色结果都只是假象时,你会感到非常沮丧。

当书籍、文章和博客文章似乎没有给你关于处理数据不平衡的好的建议时,下一波沮丧感袭来。

放轻松,有很多选择,我们将逐一探讨。这是可能的,你可以为不平衡数据构建预测模型。

想要开始学习不平衡分类吗?

立即参加我为期7天的免费电子邮件速成课程(附示例代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

什么是不平衡数据?

不平衡数据通常指的是分类问题中各类别的样本数量不均等的问题。

例如,你可能有一个2类(二元)分类问题,其中有100个实例(行)。总共有80个实例被标记为类别1,剩下的20个实例被标记为类别2。

这是一个不平衡的数据集,类别1与类别2实例的比例是80:20,或者更简洁地说是4:1。

类别不平衡问题不仅会出现在二分类问题中,也会出现在多分类问题中。大多数技术可以用于这两种情况。

接下来的讨论将假设是二分类问题,因为这样更容易思考和描述。

不平衡现象很普遍

大多数分类数据集的每个类别中的实例数量并非完全相等,但微小的差异通常无关紧要。

有些问题中,类别不平衡不仅常见,而且是意料之中的。例如,在描述欺诈交易的数据集中,类别就是不平衡的。绝大多数交易属于“非欺诈”类别,而极少数属于“欺诈”类别。

另一个例子是客户流失数据集,其中绝大多数客户会继续使用服务(“未流失”类别),而只有少数客户会取消订阅(“流失”类别)。

当存在中等程度的类别不平衡时,比如上面例子中的4:1,就可能引发问题。

准确率悖论

本文开头提到的情况,正是所谓的准确率悖论

这种情况是,你的准确率指标告诉你,你获得了极高的准确率(比如90%),但这个准确率仅仅反映了潜在的类别分布情况。

这种情况非常常见,因为分类准确率通常是我们在评估分类问题模型时使用的第一个指标。

把宝全押在红色上!

当我们在不平衡数据集上训练模型时,模型内部发生了什么?

你可能已经猜到了,我们在一个不平衡数据(其中90%的实例属于类别1)上获得90%准确率的原因是,我们的模型观察数据后,聪明地决定最好的做法是总是预测“类别1”,从而实现高准确率。

在使用简单的基于规则的算法时,这一点最为明显。如果你打印出最终模型中的规则,你会发现它很可能无论被要求预测什么数据,都只预测一个类别。

应对不平衡训练数据的 8 种策略

我们现在明白了什么是类别不平衡,以及为什么它会提供误导性的分类准确率。

那么我们有什么选择呢?

1) 你能收集更多数据吗?

你可能觉得这很傻,但收集更多数据几乎总是被忽视。

你能收集更多数据吗?花点时间想一想,你是否能够为你的问题收集更多数据。

一个更大的数据集可能会揭示出对这些类别不同且可能更均衡的视角。

当我们后面讨论重采样数据集时,更多少数类别的例子可能会很有用。

2) 尝试改变你的性能指标

处理不平衡数据集时,准确率不是一个好的度量标准。我们已经看到它具有误导性。

有一些指标被设计用来在处理不平衡类别时,更真实地反映情况。

在我的文章“分类准确率还不够:你可以使用的更多性能指标”中,我给出了更多关于选择不同性能指标的建议。

在那篇文章中,我研究了一个描述乳腺癌患者复发情况的不平衡数据集。

根据那篇文章,我建议关注以下性能指标,它们能比传统的分类准确率更深入地揭示模型的准确性:

  • 混淆矩阵 (Confusion Matrix):将预测结果分解成一个表格,显示正确的预测(对角线)以及错误预测的类型(错误预测被分配到了哪些类别)。
  • 精确率 (Precision):衡量分类器准确性的指标。
  • 召回率 (Recall):衡量分类器完备性的指标。
  • F1 分数 (F1 Score 或 F-score):精确率和召回率的加权平均值。

我还建议您看一下以下内容:

  • Kappa (或 科恩的 kappa系数):经数据中类别不平衡度校正后的分类准确率。
  • ROC 曲线 (ROC Curves):与精确率和召回率类似,准确率被分为敏感性(sensitivity)和特异性(specificity),可以根据这些值的平衡阈值来选择模型。

您可以在我们的文章“使用 ROC 曲线评估和比较分类器性能”中了解更多关于使用 ROC 曲线比较分类准确率的知识。

还不确定?从 kappa 开始,它会比分类准确率让你更好地了解情况。

3) 尝试对你的数据集进行重采样

你可以改变用于构建预测模型的数据集,使其数据更加均衡。

这种改变被称为对数据集进行采样,主要有两种方法可以用来平衡类别:

  1. 你可以从未被充分代表的类别中添加实例的副本,这称为过采样(或更正式地称为有放回采样),或者
  2. 你可以从过度代表的类别中删除实例,这被称为欠采样。

这些方法通常非常容易实现且运行速度快。它们是一个极好的起点。

事实上,我建议你在所有不平衡数据集上都尝试这两种方法,看看它们是否能提升你偏好的准确率指标。

你可以在维基百科的文章“数据分析中的过采样和欠采样”中了解更多信息。

一些经验法则

  • 当你有大量数据(成千上万或更多实例)时,考虑测试欠采样。
  • 当你数据不多(几万条或更少记录)时,考虑测试过采样。
  • 考虑测试随机和非随机(例如分层)采样方案。
  • 考虑测试不同的重采样比例(例如,在二元分类问题中,你不必非要追求1:1的比例,可以尝试其他比例)。

4) 尝试生成合成样本

生成合成样本的一个简单方法是从少数类别的实例中随机抽样属性。

你可以在数据集中进行经验性抽样,或者可以使用像朴素贝叶斯这样的方法,在反向运行时可以独立地对每个属性进行抽样。这样你会得到更多不同的数据,但属性之间的非线性关系可能无法保留。

有一些系统性的算法可以用来生成合成样本。其中最流行的一种算法叫做 SMOTE,即合成少数类过采样技术(Synthetic Minority Over-sampling Technique)。

正如其名,SMOTE 是一种过采样方法。它的工作原理是通过从少数类创建合成样本,而不是创建副本。该算法选择两个或多个相似的实例(使用距离度量),并通过一个在邻近实例差异范围内的随机量,逐个属性地扰动一个实例。

要了解更多关于SMOTE的信息,请参阅2002年的原始论文《SMOTE:合成少数类过采样技术》。

SMOTE 算法有多种实现,例如:

  • 在 Python 中,可以看看“UnbalancedDataset”模块。它提供了多种 SMOTE 的实现以及其他各种你可以尝试的重采样技术。
  • 在 R 语言中,DMwR 包提供了 SMOTE 的实现。
  • 在 Weka 中,你可以使用 SMOTE 监督式过滤器

5) 尝试不同的算法

我一如既往地强烈建议你不要在每个问题上都使用你最喜欢的算法。你至少应该在给定的问题上抽样检查各种不同类型的算法。

有关抽样检查算法的更多信息,请参阅我的帖子“为什么你应该在你的机器学习问题上抽样检查算法”。

话虽如此,决策树在不平衡数据集上通常表现良好。在创建树时使用的、关注类别变量的分裂规则,可以强制处理两个类别。

如果不确定,可以尝试一些流行的决策树算法,如 C4.5、C5.0、CART 和随机森林。

关于使用决策树的 R 语言代码示例,请参阅我的文章《在 R 中使用决策树进行非线性分类》。

有关在 Python 和 scikit-learn 中使用 CART 的示例,请参阅我的文章《立即动手实践 Scikit-Learn》。

6) 尝试带惩罚项的模型

你可以使用相同的算法,但让它们从不同的角度看待问题。

带惩罚项的分类在训练期间对模型在少数类别上犯的分类错误施加了额外的成本。这些惩罚可以使模型更偏向于关注少数类别。

类别惩罚或权重的处理通常是针对特定学习算法的。存在一些算法的惩罚版本,例如带惩罚的SVM和带惩罚的LDA。

也可能存在用于惩罚模型的通用框架。例如,Weka有一个CostSensitiveClassifier,它可以包装任何分类器,并应用一个自定义的错误分类惩罚矩阵。

如果你被锁定在某个特定算法上,无法进行重采样,或者结果不佳,那么使用惩罚项是可取的。它提供了另一种“平衡”类别的方法。设置惩罚矩阵可能很复杂。你很可能需要尝试各种惩罚方案,看看哪种最适合你的问题。

7) 尝试一个不同的视角

有一些专门研究不平衡数据集的领域。它们有自己的算法、度量和术语。

从这些角度审视和思考你的问题,有时能激发一些想法。

你可能想考虑的两个领域是**异常检测**和**变化检测**。

异常检测是检测罕见事件。这可能是一台机器通过其振动指示的故障,或一个程序通过其系统调用序列指示的恶意活动。这些事件是罕见的,与正常操作相比。

这种思维上的转变将少数类别视为离群类别,这可能有助于你思考分离和分类样本的新方法。

变化检测与异常检测类似,但它不是寻找异常,而是寻找变化或差异。这可能是通过使用模式或银行交易观察到的用户行为变化。

这两种转变都对分类问题采取了更实时的立场,这可能会给你一些思考问题的新方式,或许还能提供更多可以尝试的技术。

8) 尝试发挥创造力

真正深入你的问题,思考如何将其分解为更易处理的小问题。

为了获取灵感,可以看看 Quora 上对问题“在分类问题中,你如何处理不平衡的训练集?”的非常有创意的回答。

例如:

将你的大类分解成更小数目的其他类……

...使用单类分类器...(例如,像处理异常值检测一样)

……将不平衡的训练集重采样,不是变成一个平衡集,而是几个。在这些集合上运行一个分类器集成,可能会比单独一个分类器产生更好的结果。

这些只是一些你可以尝试的有趣且富有创意的想法。

想了解更多点子,可以查看 reddit 帖子“当我的训练集中80%属于一个类别时如何进行分类”中的评论。

选择一个方法并采取行动

你不需要成为算法奇才或统计学家,就能从不平衡数据集中构建准确可靠的模型。

我们已经介绍了一些可以用来处理不平衡数据集的技术。

希望其中有一两种方法你可以直接拿来应用,例如改变你的准确率度量标准和对数据集进行重采样。这两种方法都很快,并且会立即产生影响。

你打算尝试哪种方法?

最后一句,从小处着手

请记住,我们无法预知哪种方法最适合你和你正在处理的数据集。

你可以使用一些专家的经验法则来选择这种或那种方法,但最终,我能给你的最好建议是“成为科学家”,并通过实验测试每种方法,选择能给你带来最佳结果的方法。

从小处着手,在所学的基础上不断进步。

想要更多?进一步阅读…

如果你知道去哪里找,关于类别不平衡的资源是有的,但它们非常少见。

我找了一下,以下是我认为的精华。如果你想更深入地研究一些处理类别不平衡的学术文献,请查看下面的一些链接。

书籍

论文

你觉得这篇文章有用吗?还有问题吗?

请留言,告诉我你的问题以及你对处理不平衡类别仍有的任何疑问。

掌控不平衡分类!

Imbalanced Classification with Python

在几分钟内开发不平衡学习模型

...只需几行python代码

在我的新电子书中探索如何实现
使用 Python 处理不平衡分类问题

它提供了关于以下内容的自学教程端到端项目
性能指标欠采样方法SMOTE阈值移动概率校准成本敏感算法
以及更多...

将不平衡分类方法引入您的机器学习项目

查看内容

对*应对机器学习数据集中类别不平衡问题的 8 种策略*的 321 条回应

  1. Sebastian Raschka 2015年8月26日 凌晨2:47 #

    很有趣的综述!也许值得一提的是利用未标记数据的半监督技术?有很多不同的方法,如果你感兴趣,可以看看这篇不错的综述:X. Zhu,“半监督学习文献综述”,技术报告1530,威斯康星大学麦迪逊分校,2006年。

    在类别不平衡的背景下,迁移学习也可能很有趣,它使用未标记的目标数据作为正则化项,来学习一个可以泛化到目标域的判别性子空间:Si S, Tao D, Geng B. Bregman divergence-based regularization for transfer subspace learn- ing. IEEE Trans on Knowledge and Data Engineering 2010;22:929–42.

    或者对于非常极端的情况,可以使用单类SVM 😛 Scholkopf B, Platt JC, Shawe-Taylor JC, Smola AJ, Williamson RC.Estimating the support of a high-dimensional distribution. Neural Computation 2001;13:1443–71.

  2. Igor Vieira 2015年10月29日 上午8:26 #

    好文!!

    • Jason Brownlee 2015年11月16日 晚上8:14 #

      谢谢 Igor

      • Foram 2020年1月9日 早上6:07 #

        我有一个问题,比如我们也可以对测试数据进行采样吗?还是只对训练数据采样?因为我的数据不平衡,当我使用采样方法处理训练数据,并在未采样的测试集上进行预测时,结果非常糟糕。
        谢谢。

        • Jason Brownlee 2020年1月9日 早上7:33 #

          只对训练数据。

          • priyanka rana 2021年9月6日 晚上10:39 #

            非常感谢这篇帖子。帮助很大。

            我正在处理一个高度不平衡的数据集,其中少数类只有15个样本,而多数类有9000个样本。
            我正在尝试各种过采样方法来训练ResNet深度学习模型进行类别分类。

            考虑到20%的数据用于验证,另外20%用于测试,这样少数类在测试集中只剩下2张图片,验证集中只有3张图片。
            因此,每次我用相同的超参数训练模型时,都会得到非常不稳定的结果。因为在一次训练中,两张图片都被识别出来了,而在另一次训练中,一张也没识别出来,或者只识别出1张,这对F1分数影响巨大。

            我希望得到可复现的结果,但同时又不想对测试集图片进行增强。
            您能就此给我一些建议吗?

            非常感谢

          • Adrian Tam
            Adrian Tam 2021年9月7日 早上6:18 #

            我认为你已经达到了现有数据的极限。我真的会尝试做数据增强,至少在创建训练集之后。

  3. Jingchen 2015年11月16日 上午11:26 #

    嗨,Jason,这是一篇非常有帮助的文章。为我节省了很多查找详细解决方案的时间,并且很有启发性。

    谢谢

  4. Haifeng Liu 2015年11月21日 下午1:54 #

    这真是一篇很棒且很有帮助的文章!

  5. Parinya.hi 2016年1月13日 下午3:47 #

    嗨,Jason,这篇文章非常酷且有帮助。我尝试了一些方法,但对我的情况来说似乎相当困难,因为大多数预测变量的值都是标志位(0或1)。

  6. Abraham B.Gabriel 2016年1月18日 下午1:07 #

    嗨,Jason。你简直救了我一命。(毫不夸张)。非常感谢这篇文章。

  7. Vered Shwartz 2016年2月1日 早上7:52 #

    感谢这篇非常有帮助的文章!我有一个不平衡的数据集(负正样本比例为 50:1),并且已经尝试了您讨论的一些技术。我正在考虑欠采样的问题——
    如果我用所有正样本和同等数量的负样本来训练我的模型,会有很多未被使用的数据。有没有一种合理的方法,可以让我进行多次迭代,每次使用不同的负样本,然后将结果组合成一个模型?提前感谢。

    • Jon D. 2017年8月19日 上午10:44 #

      您描述的情况正是过采样。只需使用比欠采样时更少的迭代次数即可。

      • Vijay lokhande 2022年1月5日 凌晨1:16 #

        嗨,jeson,这真是一篇很酷且有效的文章。
        谢谢你。

        • James Carmichael 2022年1月5日 早上6:55 #

          Vijay,感谢您的反馈和美言!

        • James Carmichael 2022年1月7日 早上6:34 #

          谢谢你,Vijay!

    • Swap 2019年7月16日 凌晨1:13 #

      嗨,Jason,
      精彩的总结,我尝试了其中的大部分方法,但我的预测仍然不正确。想知道您是否能给我指点一下正确的方向。

      背景知识
      我正在做一个10分类问题。其中一个类别是主导类别,占样本的30%。我的预测结果仍然将大多数样本分类为这个30%的类别。

      我尝试过的方法
      SMOTE,
      一对多
      不同的算法
      使用F1分数

  8. Jason Brownlee 2016年2月3日 晚上8:50 #

    一篇很棒且相关的文章:处理不平衡数据:欠采样、过采样和正确的交叉验证 ,作者 Marco Altini。

    • bassel 2016年5月16日 凌晨4:19 #

      在“sklearn”模块中,有没有办法对机器学习算法进行惩罚,并建立一个带惩罚的模型
      通过在训练期间对模型在少数类上犯的分类错误增加额外成本,还是我必须从头开始实现这个算法?

    • bikiltu guteta 2020年6月26日 早上4:20 #

      感谢您关于机器学习中文本清洗的最佳教程,但我有一个问题,如何一次性对数据集中的大文件或整个文档进行分词?

      • Jason Brownlee 2020年6月26日 早上5:41 #

        你可能需要使用渐进式加载或 Python 生成器来分批加载和处理输入。

        或者,你可以使用一台内存非常大的机器,将所有数据加载到内存中进行处理。

        前者更为常见。

  9. Adeyemi 2016年2月4日 早上8:43 #

    太棒了。我想在Weka中使用SMOTE,有没有关于使用SMOTE监督式过滤器的简单示例教程?我需要指导。

  10. Matthew R. Versaggi 2016年4月11日 晚上9:29 #

    太棒了,正是我需要的!

    感谢您的努力,这正在推动该领域的发展……

  11. Ella 2016年4月23日 早上5:52 #

    谢谢,非常有用的帖子。
    我正在使用 Python 的 "UnbalancedDataset" 模块,通过生成合成数据 (SMOTE/Random) 来进行过采样。我想知道有没有什么巧妙的方法可以找到最佳的过采样比例?

    我有一个二元分类问题,数据不平衡,比例是1/5。

    • Jason Brownlee 2016年7月8日 早上7:11 #

      通常,我建议进行系统性实验,以发现适合你问题的良好或最佳配置。

  12. Bar Geron 2016年6月4日 晚上10:26 #

    你好,

    好文!

    如果您能帮助我解决以下问题,我将不胜感激。

    我使用了过采样方法,将我的二元目标值的比例从1:10改为了1:1。
    问题是我仍然不知道如何在1:10的比例上检查模型性能。
    我怎么知道现实世界和1:1比例之间的影响差距会有多大?

    • Jason Brownlee 2016年6月14日 早上8:26 #

      一个好主意是留出一个验证数据集,比如说把数据集分成两半。

      尝试各种重平衡方法和建模算法,并使用交叉验证,然后使用保留的数据集来确认任何发现在实践中是否能转化为实际数据的样本。

      • Hua Yang 2016年7月8日 早上5:03 #

        嗨,Jason,
        我和 Bar Geron 有同样的问题。
        您说的“然后使用保留的数据集来确认任何发现是否能转化为实际数据在实践中的样本”是什么意思?

        能请您更详细地解释一下吗?

        谢谢!

        • Jason Brownlee 2016年7月8日 早上7:13 #

          我的意思是,你可以在重平衡的数据集上使用交叉验证来估计模型在未见数据上的性能。

          然后,你可以构建一个最终模型,并在保留的数据集上评估其性能。

          这将让你看到在交叉验证期间从重采样中得到的发现是否能应用到“未见”数据上。

  13. David F 2016年7月1日 凌晨1:26 #

    非常有用的文章。非常感谢!

  14. Kaustubh Patil 2016年7月3日 凌晨4:03 #

    另一个策略是改变后验概率的决策阈值。我们已经证明,这对于bagging集成方法特别有效,因为已知它们能提供良好的后验估计。参见“复兴阈值移动:一种用于二元和多类不平衡数据的简单插入式bagging集成方法” http://arxiv.org/abs/1606.08698

    免责声明:我是这篇论文的最后一位作者

  15. Manish 2016年7月11日 凌晨2:40 #

    好文!非常有帮助。

  16. ankita 2016年7月22日 上午10:42 #

    先生,未来有哪些与分类问题相关的问题可以被解决?

  17. RCB 2016年8月3日 凌晨1:13 #

    我认为这不是问题。我所知道的没有任何统计方法或机器学习算法要求数据类别平衡。此外,如果*现实是不平衡的*,那么你希望你的算法学习到这一点!

    考虑一个预测两种结果的问题,其中一种比另一种常见得多。假设在特征空间中有一个区域,这两个类别高度重叠。那么,这个区域的预测将取决于训练集中落入该区域的每个类别的频率。如果你通过极大地偏向稀有类别来“平衡”数据,那么你的模型会预测每个类别的概率大约是50%,而事实可能大相径庭。

    在我看来,问题不在于不平衡。世界本就是不平衡的。问题在于,除非数据集非常大,否则稀有类别的代表性很差。换句话说,这是一个样本量问题。很多困难可以通过查看假阳性率和假阴性率来解决(正如作者指出的),而不仅仅是泛泛的“准确率”。

    • Jason Brownlee 2016年8月3日 早上8:17 #

      发人深省的观点,RCB,感谢分享。

      我不得不不同意在实践中这不是一个问题。至少对我来说,当我“处理”类别不平衡时,我几乎总能得到更好的结果。

      作为测试,从UCI机器学习库中获取一个不平衡的数据集,并做一些小实验。我想你会很快意识到,要么你需要改变你的性能指标,要么开始探索重采样或实例加权方法,才能在这个问题上取得任何进展。

      事实上,这也许可以写成一篇不错的博客教程,敬请期待。

      • RCB 2016年8月5日 上午8:20 #

        归根结底,性能才是关键,所以我不会愚蠢到采取强硬立场。但我倾向于认为,总有比“重新平衡”数据更好的替代方案,也就是说,理论上我们永远不应该这样做。

        你的模型正在尽力最小化你指定的损失函数。如果这只是分类准确率,那么很可能最好的分类器是那个总是选择绝大多数类别的分类器。这告诉你的是,模型没有看到足够多的稀有类别样本来将它们与常见类别区分开来。做不到这一点,它就干脆说:“算了,就总是预测最常见的类别吧!” 如果你只关心1-0分类准确率,那么在给定的损失函数和数据集下,这就是最好的模型,没有之一。

        现在,如果你发现这是一个非常不令人满意的结果,问问自己为什么!很可能是因为对稀有类别的错误分类比另一种情况糟糕得多。也就是说,假阴性比假阳性糟糕得多。也许你正在诊断癌症,或者捕捉不合格产品。那么,很明显,这个问题应该通过选择更合适的损失函数来解决——而不是通过偏置数据!只要让假阴性的“成本”远大于假阳性的成本。这将给你一个更能代表你优先级的成本函数,同时仍然保持一个现实的数据集。重新平衡这两点都做不到!

        另外:通过大规模地重新平衡(也就是大规模地偏置)模型,你是在一个与它实际测试时将要面对的数据集截然不同的数据集上进行训练。这在我看来是件坏事。应该为现实世界训练它。

        个人观点。

        • Jason Brownlee 2016年8月5日 早上8:25 #

          非常理性的评论,谢谢RCB。

          • Usman 2017年6月17日 上午11:39 #

            将不平衡数据集转换为平衡数据集(通过减少正常类别实例的数量)会增加假阳性吗?在癌症检测的情况下,我们最终可能会预测出更多的癌症患者,而实际上他们并没有患癌。我的假设是错误的吗?

          • Jason Brownlee 2017年6月18日 早上6:29 #

            有可能会。你必须平衡数据集的转换与项目的目标。

            请谨慎选择你的模型评估指标。

          • DavidFarago 2021年1月12日 早上6:57 #

            我正在阅读大量关于不平衡数据重平衡的资料,并想知道让训练集和测试集具有完全不同的分布是否是一个好主意。为了寻找答案,我找到了这篇博客文章,听起来重平衡是一件合理的事情。

            然后我读了 RCB 的评论,现在我又开始疑惑了。

            @Jason: 4年后,您的经验是否仍然是重平衡能带来更好的结果?您是否应该使用一个训练-开发集(一个介于训练集和开发集之间的集合),这样您就可以测量训练-开发集和开发集之间的数据不匹配误差?

          • Jason Brownlee 2021年1月12日 早上7:58 #

            改变测试集的分布是无效的。

            改变训练集的分布以平衡甚至过分强调少数类是一个好主意。

            平衡是众多方法中,有时会奏效的一种。

            你可以使用很多技术,我甚至就这个主题写了一本书,你可以从这里开始:
            https://machinelearning.org.cn/start-here/#imbalanced

  18. Chris John 2016年8月4日 晚上8:04 #

    谢谢这个!

    • Jason Brownlee 2016年8月5日 早上5:27 #

      不客气,Chris。

    • Shravan Kumar Parunandula 2019年7月28日 下午5:57 #

      您对在策略3中使用条件生成对抗网络(conditional gans)生成合成样本有什么建议?

  19. Simon 2016年8月5日 晚上9:32 #

    嗨,Jason,将一个长时间序列进行窗口化处理,可以用作一种采样技术吗?这样,我们就可以得到同一时间序列的许多较小的片段,如果我们给它们打上相同的标签,我们就可以将它们视为更大的数据来提取特征,不是吗?在这种情况下,我们应该看哪些标准呢?长程相关性?我知道统计数据可能会改变,所以通常一个非平稳的时间序列可以通过滤波或某种背景平滑(来平滑趋势)来变成一个平稳的时间序列。我的思路对吗?
    我的第二个问题是,如果我们不采用采样方法,而是将整个时间序列视为一个数据点,我应该寻找什么样的分类和特征提取算法?

    急切等待您的回复。非常感谢
    Simon

  20. Evelyn 2016年8月11日 早上7:25 #

    嗨,Jason,

    我有一个问题,关于我们应该如何处理过采样后的数据集。我能想到的有两种方法,目前我正在使用第一种,但它似乎过拟合很严重。

    1- 对整个数据集进行过采样,然后将其分为训练集和测试集(或进行交叉验证)。

    2- 在划分原始数据集后,仅对训练集进行过采样,并在原始数据的测试集上进行测试。

    我的数据集有多个标签,其中一个标签是多数类,其他标签的样本数量相当少,有些甚至比例达到100:1,我应该如何处理这个数据集?

    非常感谢!

    • Jason Brownlee 2016年8月15日 上午11:25 #

      我建议分离出一个验证数据集供以后使用。

      我建议在交叉验证过程的折叠内应用你的程序(比如过采样),如果可能的话。否则,就在训练/测试划分的训练数据集上进行。

      • Amr 2017年8月28日 凌晨1:47 #

        但那样的话,在测试数据集(类别不平衡)上的准确率度量还有什么意义呢?

        • Jason Brownlee 2017年8月28日 早上6:50 #

          你应该直接在测试集上评估模型,不对测试集做任何改变。

  21. Marta AZ 2016年8月11日 晚上11:07 #

    感谢这篇文章。它对一个广泛而复杂的问题做了一个非常好且有效的总结。

    请继续更新您的博客!

  22. Mohammed Tantawy 2016年8月30日 上午11:37 #

    好文,Jason

  23. Linara 2016年9月5日 晚上8:01 #

    谢谢你的建议!

    您能更详细地阐述一下带惩罚项的模型,或者提供一些有用的资源吗?我正在使用逻辑回归和标准的对数似然损失函数(-mean(teacher*log(predicted) + (1-teacher)*log(1-predicted))),我想知道让它更关注1类别的正确方法到底是什么,因为我的数据中大约有0.33%的1类别样本,而其他所有样本都是0类别。

    • Jason Brownlee 2016年9月6日 早上9:48 #

      也许你可以尝试对某个类别的观测值进行加权。我发现这在回归方法中非常有效。

      • Linara 2016年9月6日 晚上6:30 #

        主要问题更多是关于哪个部分应该更“重要”?我应该给从稀有类别获得的误差部分更大的权重(例如,得到类似 -mean(0.9*teacher*log(predicted) + 0.1*(1-teacher)*log(1-predicted)) 的东西),还是反过来——我应该“惩罚”大类别(例如,-mean(0.1*teacher*log(predicted) + 0.9*(1-teacher)*log(1-predicted)))?因为惩罚更多是关于我必须对大类别做些什么,而加权则是对稀有类别应该更大,这个术语完全把我搞糊涂了。
        而且权重的数值与稀有类别的频率有关系吗?

        • Jason Brownlee 2016年9月7日 上午10:26 #

          是的,权重是为了重新平衡每个类别的观测值,使得每个类别的观测值总和相等。

          • K Rajesh 2016年9月11日 凌晨2:53 #

            先生,我也在处理这类不平衡的多类别问题。在我的情况下,准确率值过度依赖于归一化程序。
            接下来的讨论将概述我的问题。

            是否可以针对类别进行特征归一化?例如:一个10x10的数据矩阵,有两个类别。每个类别的大小为5x5。现在分别对类别1的25个特征和类别2的25个特征进行归一化。这个过程可以接受吗?

          • Jason Brownlee 2016年9月12日 早上8:28 #

            不行。你未来不会知道新数据的类别,因此你不会知道该使用哪种程序。

          • Abdul 2016年10月20日 下午4:59 #

            先生,如何在随机森林(RF)中指定权重?

            我需要帮助,为每次分裂指定权重,而不是使用基尼指数。

            您的回复将不胜感激。

          • Jason Brownlee 2016年10月21日 早上8:33 #

            对不起,Abdul,我不知道加权随机森林或加权基尼系数计算。

  24. Erik Yao 2016年9月23日 早上5:11 #

    谢谢你,Jason!我正在处理一个19:1的数据集,你的文章提供了很多处理不平衡问题的技巧。我非常有兴趣逐一尝试,看看我能得到什么最好的结果。

  25. Gilmar 2016年10月4日 下午1:30 #

    好文,Jason!!!

  26. charisfauzan 2016年10月13日 下午3:47 #

    好文,先生,对我有用...

  27. Sarah 2016年11月16日 早上6:27 #

    非常棒的文章。我读了差不多5遍。

    • Jason Brownlee 2016年11月16日 早上9:34 #

      谢谢你,Sarah,很高兴听到你这么说。

  28. Chris 2017年1月3日 晚上9:58 #

    请在这里看看我的问题。我不知道发生了什么。

    http://cs.stackexchange.com/questions/68212/big-number-of-false-positives-in-binary-classification

    • Jason Brownlee 2017年1月4日 早上8:52 #

      嗨,Chris,或许你可以用一句话总结一下你的问题?

  29. Licheng 2017年1月15日 早上7:25 #

    嗨,Jason,感谢这篇精彩的文章。

    我有一个关于不平衡多类别问题(7个类别)的问题。我尝试了过采样SMOTE方法,它似乎只是将样本最少的类别匹配到样本最多的类别,而其他类别没有变化。我想知道这是不是它应该的工作方式。

  30. Natheer Alabsi 2017年1月25日 下午3:52 #

    嗨,Jason,

    如果能提高模型的准确性,那么在训练时,有意地从数据中可用的两个类别里选择一个不平衡的子集,这种做法是否可以接受?

    • Jason Brownlee 2017年1月26日 早上4:43 #

      我喜欢你的想法,Natheer,试试看!

      可以考虑使用一组以不同方式加权的模型的集成方法。

      不过,不要用准确率这个指标来评估你的结果,它无法清晰地反映出你的模型实际表现如何。

      • Natheer Alabsi 2017年1月26日 晚上9:14 #

        谢谢你的回复。但我想只用一个负类别(不购买产品)的样本和大量正类别(购买产品)的样本。我注意到这样做极大地提高了准确性。

        • Jason Brownlee 2017年1月27日 中午12:06 #

          嗨,Natheer,在这种情况下,准确率将是一个无效的性能衡量标准。

          • Natheer Alabsi 2017年1月27日 中午12:12 #

            我知道整体模型的准确率没有意义,但相比其他情况,这是召回率最大的提升。

  31. Jingjing 2017年2月27日 下午1:31 #

    感谢您的努力。这真的很有帮助!您有一些不平衡的数据集吗?我找不到一些适合我算法的完美数据集。

  32. deep 2017年3月22日 晚上7:02 #

    嗨,Jason,

    感谢您上传了一篇关于处理不平衡数据集的非常有益的文章。我正在尝试构建一个用于分类的深度学习模型。我的数据集包含大约10万个样本,约3.6万个特征,以及六个类别分布不平衡的不同类别。最大的类别大约有4.8万个样本,而最小的类别大约有2000个样本。其他类别的样本数分别为1.8万、1.5万、1.2万和5000。我正在考虑使用SMOTE为所有少数类别(1.8万到2000)生成合成数据,直到样本数达到4.8万(最大类别)。这在科学上是合适的方法吗?如果不是,我还能做些什么?

  33. wanida saetang 2017年4月3日 下午2:27 #

    嗨,Jason,感谢这篇精彩的文章。我对此很感兴趣。它对我非常有帮助。

  34. Afifatul Mukaroh 2017年4月6日 早上10:53 #

    “成为科学家”并通过实验测试每种方法,选择能给你带来最佳结果的方法。

    天啊。我喜欢你的建议。

    也感谢你的文章。它非常有见地,特别是对于我这个正在处理不平衡数据集的人来说。

    非常感谢。

  35. Abtohi 2017年4月20日 凌晨1:59 #

    不错的帖子

  36. Camila 2017年4月28日 早上5:59 #

    非常感谢!我是智利人,我一直在寻找西班牙语的资料,但什么都没找到。但我尝试用英语搜索,你的文章非常有帮助!

    • Jason Brownlee 2017年4月28日 早上7:57 #

      谢谢你,Camila,很高兴听到这个消息。

  37. Mazid OSSENI 2017年5月8日 晚上11:30 #

    感谢这篇帖子!它非常有见地,对于全面了解不平衡问题很有帮助。我还有几个问题,如果你不介意的话。
    1) 当使用带惩罚项的模型时,我们如何分析分类器的性能?我们应该只使用经典的指标(精确率、准确率、F1分数等),还是必须使用加权指标?(我不知道你是否熟悉,但在sklearn中,指标计算有一个可选的sample_weights参数)
    2) 另外,对于带惩罚项的模型,你建议使用哪种类型的权重?
    附言:我也读了你关于指标的文章,但没有在那里找到我的答案。
    谢谢

    • Jason Brownlee 2017年5月9日 早上7:44 #

      是的,专注于输出性能,而不用管模型内部使用的具体方案。

      我建议你研究一下加权方案,但可以从一个能将基准率抵消回平衡状态的权重开始。

  38. Riishikesh 2017年5月17日 凌晨1:21 #

    嗨,Jason,
    非常感谢这篇信息量丰富的文章。我想尝试其中一些策略,但找不到类别不平衡的数据集。您有任何这类数据集的链接吗?

  39. Kamal 2017年5月29日 下午4:03 #

    嗨,Jason,
    感谢你的帖子。我只有一个简单的问题。假设我们有一个包含500个二元条目的数据集。我们正在使用逻辑回归来找到最佳拟合参数。另外,假设我们只有5个1,其余都是0。如果我们要实施SMOTE,是应该对训练集和测试集都实施,还是只对训练集实施?
    谢谢,

    • Jason Brownlee 2017年6月2日 中午12:21 #

      好问题,Kamal,

      SMOTE只应用于训练数据集。

  40. Ruby Chang 2017年6月9日 晚上8:43 #

    这太棒了,Jason。这是一个关于不平衡数据的非常有见地的概述,对我手头的问题非常有用,其中少数类别只占总观测值的不到0.01%。我注意到这篇帖子是差不多两年前发表的,您知道在处理这类数据方面有什么新的进展吗?非常感谢!

    • Jason Brownlee 2017年6月10日 早上8:22 #

      哇,这个不平衡程度相当大。

      这些方法会是一个很好的开始。一旦用尽,我相信还有一套“最先进”的方法你可以探索。

    • John J 2017年6月27日 中午12:00 #

      在谷歌上搜索关于机器学习和罕见病的白皮书,你会看到一些处理严重不平衡问题的方法。

      • Jason Brownlee 2017年6月28日 早上6:17 #

        很好的建议,John。还有入侵检测问题和欺诈问题。

  41. vinod singh 2017年6月15日 晚上8:24 #

    嗨,Jason,我有一个包含251个正样本和502个负样本的数据集。我刚刚复制了我的正样本数据集,使其达到502个,即100%复制正样本。这种方法显著改善了我的结果。但是,我不确定我的方法是否正确。如果正确,是否有任何优秀期刊的文章可以支持我的方法。

    • Jason Brownlee 2017年6月16日 早上7:53 #

      重要的是,在应用机器学习中(或在生活中!),没有“正确”的方法。

      利用这里和其他地方的想法来设计实验,以便发现什么方法在你的具体问题上效果最好。

  42. Mark 2017年6月16日 凌晨2:44 #

    谢谢,这非常有帮助。我很欣赏你的博客,请继续保持!

  43. Thibaud 2017年6月17日 凌晨12:19 #

    谢谢你,Jason,感谢你所做的一切工作。你认为,通过调整决策阈值来处理不平衡数据集是可行的吗?

    我的意思是,如果你有一个数据集,其中类别0占80%的观测值,类别1占20%的观测值,那么通过找到一个能将前20%的概率预测值与后80%的概率预测值分开的阈值,来确定最佳阈值,这样如何?

    谢谢!

    • Jason Brownlee 2017年6月17日 早上7:31 #

      是的,特别是在二元预测问题上(例如ROC曲线)。在你的问题上试试看。

  44. AJ 2017年7月17日 早上11:39 #

    你好 Jason,
    非常感谢你所做的一切。你帮了我大忙!

    我正在测试成本敏感学习和重采样对于一个属性数量较少的不平衡数据集的差异。

    将数据集中的不平衡情况反转/倒置,是否曾被认为是一种可接受的做法?如果首要任务是预测异常,并且你愿意以牺牲多数类为代价来预测它,这听起来像是一种合法的方法吗?

    谢谢!
    AJ

    • Jason Brownlee 2017年7月18日 早上8:39 #

      当然,试试看。“合法性”实际上是由你能达到的模型技能水平来定义的。

  45. Zahra 2017年7月19日 中午12:07 #

    我有一个不平衡的多类别分类问题,比例是4:4:92。我想问一下这些技术是否也适用于我的问题?我的意思是,像4和4与92之间存在巨大的差异。

    • Jason Brownlee 2017年7月19日 下午4:09 #

      哎呀,这是一个很有挑战性的比例。

      我建议你尝试一些重采样方法,并选择一个最能体现你项目目标的指标(例如,对数损失或类似指标)。

  46. Ella 2017年8月17日 凌晨12:14 #

    嗨,Jason,

    您提到“决策树通常在不平衡数据集上表现良好”。这是否意味着如果采用决策树方法,数据不平衡问题就不那么重要了?

    • Jason Brownlee 2017年8月17日 早上6:43 #

      可能是这种情况,在你的数据上试试看。

  47. MU 2017年8月24日 晚上11:39 #

    嗨 Jason

    我在比较不同算法的测试准确率时遇到了一个困惑的情况。我想问您,如果我根据程序A(例如:随机添加5%的类别噪声)从一个真实世界的数据集创建一个合成的不平衡数据集,然后将我的分类技术应用于该数据集,再将其测试准确率与一篇学术文章X进行比较,而文章X使用了另一种算法,他们也根据程序A从同一个真实世界的数据集创建了他们自己的合成不平衡数据集,您认为这是一种真实的比较吗?请考虑到那篇文章和我使用了相同的真实世界数据集和相同的程序来使数据集不平衡。

    先谢谢您了。

    • Jason Brownlee 2017年8月25日 早上6:43 #

      是的,如果两个测试都始于相同的源数据。

  48. Taniya 2017年9月15日 下午2:17 #

    你好,Jason。
    你能帮我解释一下ADASYN方法吗?我对于“难以学习的少数类数据”这个概念感到困惑。

  49. Mahdi 2017年10月8日 早上7:43 #

    你好 Jason,
    感谢您宝贵的资料。我有一个不平衡的数据集,其所有特征都是分类的,响应变量也是有序的。据我所知,SMOTE只适用于连续数据。是否有适用于分类数据的SMOTE版本?当我平衡数据集时,我们是否应该考虑响应变量中的顺序?谢谢

    • Jason Brownlee 2017年10月8日 早上8:43 #

      也许有,我建议在谷歌学术上搜索一下。

      你也可以尝试将特征转换为数值型,看看SMOTE和类似算法是否能产生有趣的结果。

  50. ips 2017年10月11日 凌晨1:29 #

    嗨 Jason
    感谢您提供的有用信息。
    在我的关于不平衡类别的期刊文章中提到:“为那些更难学习的少数类别样本生成更多的合成数据”。“更难学习”是什么意思?
    谢谢你

  51. Kuber 2017年10月19日 早上8:57 #

    嗨,Jason,

    我的数据集有25:75的“流失”与“未流失”分布。我应该把这看作是一个不平衡问题吗?我正在尝试在原始数据集上使用随机森林来确定重要特征,然后在不处理不平衡分类问题的情况下使用逻辑模型。我更熟悉Python,我不确定目前Python中是否有经过验证的过采样算法。请告知。

  52. Erel Segal-Halevi 2017年10月19日 晚上11:48 #

    感谢这篇帖子。检查一下这些方法中哪些可以用于序列分类可能会很有趣。

    方法3——重采样——不能使用,因为当你进行欠采样或过采样时,会破坏序列结构。我找到一篇与此问题相关的论文:http://home.ustc.edu.cn/~zcgong/Paper/Model-Based%20Oversampling%20for%20Imbalanced%20Sequence%20Classification.pdf 但我还没试过。

    其他方法呢?

    方法5(不同的算法)——是否有适用于序列分类的决策树变体?

    方法7(异常检测和变化检测)——它们可以用于序列分类吗?

    • Jason Brownlee 2017年10月20日 早上5:36 #

      或许你可以使用数据增强来创建现有序列的扰动变体?

  53. Hossein 2017年10月24日 下午4:32 #

    嗨,Jason!首先,衷心感谢这篇非常有用的文章,它对不平衡数据问题给出了一个非常清晰、易懂且信息丰富的概述。

    我开发了一个模糊推理系统来检测众包观测中的错误(这与欺诈检测问题非常相似)。该系统预测每个观测的可靠性,并为其分配一个介于0到1之间的值。因此,如果可靠性的接受阈值定义为0.4,则所有可靠性值小于0.4的观测都被视为错误(False)。

    根据我们的经验,我们知道大约95%的观测被人们正确分类,只有5%的观测被错误分类(这是我们对数据集中错误普遍性的先验知识)。

    我们定义了一个2类(二元)分类问题(如果观测被人们正确检测到,则属于True(T)类;如果分类错误,则属于False(F)类)。

    由于我们开发的是一个模糊系统,所以没有训练步骤(因为系统是基于我们为其定义的模糊规则集做出决策的)。

    然而,我们需要评估我们模糊系统的判别性能(它是否能高精度地将T和F类分配给观测值)。

    我们只有119个真实观测(参考数据)用于测试我们系统的性能。我们可以将它们输入到我们的系统中,系统会给它们打上标签(T或F),然后为了评估我们模糊系统的性能,我们可以将这些预测的标签与真实观测的真实标签进行交叉核对。

    我们的真实数据集是不平衡的(119个观测中有114个来自T类,其中5个属于F类)。然而,这与数据集中错误的普遍性非常一致(正如我提到的,根据我们的经验,我们知道通常大多数观测都被正确分类,只有大约5%是错误的)。

    所以,我想知道我们是否可以使用这个不平衡(但与普遍性一致)的真实数据集来评估我的模糊系统的预测性能,还是我必须对我的119个真实观测进行重采样,以创建一个更平衡的测试数据集?

    我在论文中使用了不同的指标来评估我的系统性能,例如在不同截断值(阈值)下的AUC、混淆矩阵和Kappa。我得到的AUC=98%,最大kappa值为0.799。

    非常感谢!

    • Jason Brownlee 2017年10月25日 早上6:38 #

      这很难说。我建议在训练集上尝试一些重平衡技术,并评估其对模型性能的影响。

  54. Leo Buckley 2017年10月27日 凌晨1:25 #

    嗨,Jason,

    这篇帖子非常有帮助。我有一个关于我正在处理的数据集的具体问题。这是关于心脏病患者的数据。我正在尝试开发一个算法来预测哪些患者会再次心脏病发作。这些患者通常只占所有患者的5-10%,但因为另一次发作是如此毁灭性的,所以识别这些患者的能力非常重要。

    我理解有不同的选项可以提高算法的预测能力,但是当对数据进行过采样或欠采样时,是否会丢失一些东西?我的直觉是,感兴趣的结果(心脏病发作)的分布是数据固有的一个重要特征,在过采样和欠采样中会丢失,因此预测模型在统计上会非常好,但不适用于更广泛的人群(有偏见)。

    这种想法正确吗,还是我没有抓住要点?谢谢!

    • Jason Brownlee 2017年10月27日 早上5:22 #

      是的,其思想是扭曲分布,目的是提升模型在代表性不足的案例上的性能。

      专注于这个目标。

  55. Michael 2017年11月7日 早上5:24 #

    嗨,Jason,

    1. 我理解AUC(曲线下面积)是不平衡数据的良好性能度量。但是,它能用于衡量平衡数据的分类性能吗?
    2. 我对一个多数类分类器(ZeroR)使用了AUC,得到的AUC < 0.5。我能说这个ZeroR分类器很差吗?

    谢谢,

    • Jason Brownlee 2017年11月7日 早上9:54 #

      是的,可以。而且ZeroR应该很差,它是改进的起点。

  56. Karthi 2017年11月17日 早上6:44 #

    有用的帖子。谢谢…

  57. Ms S Lalitha 2017年11月19日 凌晨4:03 #

    嗨,Jason先生,
    我正在处理一个不平衡的数据集。我可以在交叉验证中使用重采样技术吗?如果使用这种技术,它会不会在n折交叉验证中产生重复数据?请回复。

    • Jason Brownlee 2017年11月19日 早上11:10 #

      是的,但你必须在交叉验证的每一折/划分内部对训练集应用任何重平衡操作。它可能会创建重复的样本,这正是某些方法的目的。

  58. Zakia 2017年11月21日 凌晨2:44 #

    嗨,Jason,
    我需要关于我的机器学习实验的帮助。我使用了weka 3.8的classbalancer来平衡我的训练数据集(100个易受攻击的数据和10000个非易受攻击的数据)。之后,我在另一个包含60个易受攻击数据和2500个非易受攻击数据的数据集上测试模型。测试数据来自另一个系统(与训练集不同)。由于测试数据不平衡,我的测试数据精确率非常低(低于1%)。但训练数据的精确率是75%。即使我考虑使用来自同一系统的测试数据,它也给出了低精确率。然后我用了100个易受攻击和100个非易受攻击的数据进行测试,这提高了精确率。但在现实生活中,测试数据通常是不平衡的。我如何提高在不平衡测试数据上的精确率。

    谢谢。

  59. patrick 2017年11月25日 下午3:25 #

    嗨,Jason,

    非常感谢这篇文章。我有一个案例,类别有三个值:



    但超过90%的数据值为“无”。我尝试对数据进行欠采样,并移除足够多的“无”值以使其平衡。然而,问题是现在我们在结果中引入了更多的假阳性和假阴性。只要我将它们加回数据并重用训练好的模型,它们就会出现在结果中。

    有没有什么方法可以保留“无”值作为防止误报的证据,但让模型将“上”和“下”值作为首要任务?

    我尝试了Weka中的CostSensitiveClassifier,但它会降低精确率或召回率。

    非常感谢您分享对此的看法。

    谢谢!

  60. Shabnam 2018年1月4日 早上7:59 #

    谢谢Jason这么棒的帖子。
    我有两个问题
    1. 我理解当数据不平衡时,准确率是不可信的。
    多大程度的不平衡是可以接受的?例如,在二元分类中,1:1是平衡数据。我们应该将1:1.5或1:2视为不平衡吗?
    或者这也取决于准确率?
    例如,如果我们有1:2的数据,得到70%的准确率,我们不能相信它,但如果是90%的准确率,我们就可以相信。

    2. 您提到了欠采样作为方法之一。您对此有什么建议吗?

    感谢您的回复、时间和一如既往的帮助。

    • Jason Brownlee 2018年1月4日 早上8:18 #

      准确率实际上只在二元分类中,当类别比例为50/50或非常接近时才有意义。

      抱歉,我没有任何关于欠采样的实例。

  61. Smitha 2018年1月14日 凌晨12:05 #

    嗨,Jason,

    我有一个包含223,586个样本的数据集,其中60%用于训练,40%用于测试。我分别使用了5个分类器:SVM、LR、决策树、随机森林和提升决策树。SVM和LR表现良好,准确率和召回率都接近0.9,但基于树的分类器报告的准确率为0.6。经过仔细观察,我发现SVM和LR对20,357个样本的标签预测不一致。那么,我是否可以应用投票来解决这个关于预测结果的冲突?这个冲突可能是由于数据集不平衡造成的吗?我需要你的帮助。

  62. Smitha 2018年1月14日 中午12:06 #

    我结合了SVM和LR,得到了0.99的准确率分数。召回率是0.98。为了解决关于20,357个样本的冲突,我设计了一个投票规则,考虑了所有5个分类器。尽管基于树的分类器表现一般,但它们也为解决冲突做出了贡献,与SVM和LR互为补充。谢谢你。

  63. Ousama 2018年2月2日 晚上11:52 #

    感谢这篇精彩的文章,你的网站一直是我很棒的资源。我目前正纠结于一个问题,我有大约1300万行数据,目标是二元类别,比例是6800:1,非常不平衡。此外,有2000行是一个类别,其余是另一个类别。你认为,利用你提到的这些因素,我能将它输入分类器或神经网络吗?

    • Jason Brownlee 2018年2月3日 早上8:39 #

      我鼓励你探索重平衡方法,无论你选择哪种类型的模型。

  64. Marlene 2018年3月2日 早上9:53 #

    亲爱的Jason,关于不平衡数据集的80:20或4:1的定义,您有参考资料吗?我在列出的参考文献中没有清楚地看到这个定义。谢谢您。

  65. Amom 2018年3月6日 早上10:59 #

    非常有用!恭喜!

  66. Misos 2018年3月7日 晚上10:05 #

    嗨,Jason,

    感谢这篇精彩的文章。

    您能帮忙列出一些不受不平衡类别问题影响的分类器吗,比如KNN?

  67. hadi sotudeh 2018年3月9日 晚上9:44 #

    嗨,Jason,

    非常有趣的帖子。

    我有一个非常非常不平衡的数据集(多数类占99.3%)。在我使用的所有这类数据集中,少数类的份额为1%到2%。

    对于这些情况,您有什么建议?

    • Jason Brownlee 2018年3月10日 早上6:25 #

      哎呀。我建议你尝试所有方法,看看在你的具体案例中哪种方法能有所突破。

      有些问题就是非常困难,我们能得到比随机猜测更好的预测就已经很开心了。

  68. Talat CAN 2018年3月22日 晚上10:14 #

    非常感谢!!这很有帮助。

  69. gini 2018年3月30日 凌晨3:56 #

    我在建模后应用了过采样,是否有可能校正概率以返回到其原始分布?

  70. soeysoo 2018年5月13日 凌晨2:41 #

    我有一个平衡的类别(“是”和“否”),有3个属性(包括年龄、性别和月份)。然而,这3个属性都不是平衡的。例如,性别属性(男孩和女孩),男孩得到80%的“是”和20%的“否”。这是否也意味着我有一个不平衡的数据集,尽管我有一个平衡的类别?在构建分类器时我应该认真对待这个问题吗?

    • Jason Brownlee 2018年5月13日 早上6:36 #

      也许可以先按原样处理数据,然后再探索重平衡方法,看看是否能提升模型性能。

  71. Mayank_Satnalika 2018年5月21日 凌晨12:35 #

    嗨,Jason,感谢你这些有帮助的文章。
    假设我有一个5:1的不平衡数据,并且我从我的分类器中得到了该类的输出概率。训练5个不同的模型,每个模型取多数类的一部分和完整的少数类,最后取它们的平均值,这会是一个好主意吗?这与欠采样类似,但使用了所有可用数据,因为我们有5个模型对应5个不同的数据部分。
    对此有何看法?

  72. Thorbjorn 2018年5月24日 晚上9:31 #

    很棒的帖子——提供了一个很好的概述,帮助你入门。

    谢谢:-)

  73. Felix 2018年6月18日 晚上10:11 #

    再次感谢这篇精彩的文章!有一个问题:是对整个数据集进行重采样然后再进行训练-测试集划分,还是先划分再进行重采样——只在原始数据上测试,这两种做法哪个更常见?除了结果中某个类的数量不同之外,这两种做法有区别吗?

  74. mmn 2018年6月20日 下午2:50 #

    感谢这篇非常有帮助的文章!一个问题,欠采样方法在高度不平衡的比例(例如多数类:100,少数类:5)下有用吗?

  75. Moyo 2018年7月2日 晚上6:50 #

    在使用简单的基于规则的算法时,这一点最为明显。如果你打印出最终模型中的规则,你会发现它很可能无论被要求预测什么数据,都只预测一个类别。

    在上面的段落中,您提到了“打印出模型的规则”。我想知道如何从模型中检索该信息。

    此致

  76. HY 2018年7月3日 凌晨4:47 #

    嘿,Jason,感谢分享这8个策略!我也想知道,当你的数据预期就是不平衡的时候,你还会使用同样的方法吗?

  77. Brian Tremaine 2018年7月14日 早上6:04 #

    你好,

    我正在处理一个非常不平衡的数据集(0.3%),并正在查阅与信用风险分析相关的论文。这里有一篇评估了几种抽样方案的论文:
    https://core.ac.uk/download/pdf/61416940.pdf

    此致,
    Brian

  78. Daniel Cao 2018年7月31日 凌晨12:39 #

    嗨,Jason,

    非常感谢您的文章。起初,我认为平衡数据是一个好习惯,它多次帮助我获得了更满意的结果。然而,当我看到King & Zeng的论文 http://gking.harvard.edu/files/gking/files/0s.pdf 时,似乎我们不能仅仅平衡(或偏置)样本。训练之后,我们仍然需要“校正”这种偏差。在逻辑回归的情况下,我们使用截距系数进行校正。

    您在实践中做过这个吗?在神经网络的情况下,我们也需要这样做吗?

    我为这个问题困惑了好几个星期。

    谢谢你。

    诚挚地,
    Daniel

    • Jason Brownlee 2018年7月31日 早上6:05 #

      我不熟悉那篇论文,抱歉,Daniel。

      在处理不平衡数据集时,我经常预测概率,除了可能进行一些校准外,我没有对预测的概率进行偏差校正。

  79. Mira 2018年8月17日 晚上6:58 #

    非常好的帖子!非常感谢。

  80. Joey Gao 2018年8月29日 中午12:11 #

    你好,Jason,在xgboost中,‘scale_pos_weight’可以通过给不同类别赋予不同权重来处理不平衡数据集,我应该在调整‘scale_pos_weight’之前进行过采样或欠采样吗?

  81. Karanja 2018年8月30日 早上8:58 #

    你好,Jason,我希望进行低复杂度的肺癌肿瘤分类自动化诊断,例如,在我的案例中,它分为六个不同的肿瘤类别(比如鳞状细胞癌,...腺癌等)。

    我有一个包含200张肿瘤图像的小数据集,可以根据肿瘤类别细分为6个不同的组,还有200张(健康图像)。我的目标是:

    1. 有效地将图像分类到其正确的类别中,比如如果我有一些来自数据集的肿瘤图像...以便在给定一张或多张图像时,我能轻松地将其分类到其类别中。

    使用哪种分类方法最好?考虑到数据集的大小,深度学习是否合适?

    • Jason Brownlee 2018年8月30日 下午4:50 #

      我鼓励你测试一套方法,以发现哪种方法对你的特定数据集最有效。

      我猜想,如果你处理的是图像,CNNs会很有效。

  82. Hilda 2018年9月27日 早上5:52 #

    你好 Jason,

    我们能仅仅通过向少数类别添加噪声来制造合成数据吗?与这种方法相比,使用SMOTE有什么好处?

    此致,
    Hilda

    • Jason Brownlee 2018年9月27日 早上6:06 #

      试试看。

      噪声通常对输入有好处,但对输出不好,主要是为了使模型学习到的映射函数人为地更平滑、更容易学习。

  83. Anuja Tupe 2018年10月17日 下午4:00 #

    你好,Jason!

    我正在做一个使用CNN的项目。我的数据集包含43个类别,并且数据集高度不平衡。最高频率是2250,最低频率是210。

    我在网上读到,当你的数据集不平衡时,应该向fit方法传递类别权重。通过提供类别权重,当模型遇到一个代表性较少的类别的训练样本时,它会给予更多的关注,并在评估损失时给予更大的权重。

    然而,我正在尝试理解fit方法是如何使用这些类别权重的。在我的模型中,我编写了一些自定义的度量方法来计算fbeta分数、精确率和召回率。我在fit方法的回调函数中调用了这个自定义度量方法。模型将如何理解在自定义度量方法中使用这些类别权重?我是否应该将类别权重传递给自定义度量方法?

    我无法为我的问题找到满意的答案。如果您能帮我理解这一点,我将不胜感激。

    谢谢!

    • Jason Brownlee 2018年10月18日 早上6:24 #

      这真的取决于你使用的方法。在某些情况下,模型可以利用权重,而在其他情况下,只有损失函数或评估函数可以利用权重。

  84. Rakesh 2018年10月28日 凌晨1:31 #

    嗨,Jason,
    我总能从你的帖子里找到我问题的答案。
    确实是一篇很棒的文章。
    谢谢。

  85. Cathy Qian 2018年12月6日 早上5:14 #

    嗨,Jason,
    感谢这篇好文章!我想知道您将数据集称为不平衡的标准是什么?例如,我有一个包含三个类别的数据集,比例为10:6:4,我的预测结果在每个类别上的预测准确率分别为80%、50%和50%。您认为我的数据是不平衡的吗?这就是为什么我在最大的类别上获得最高预测准确率的原因吗?您建议我尝试您提到的上述方法中的哪一种?再次感谢这篇精彩的文章。

    • Jason Brownlee 2018年12月6日 早上6:02 #

      任何不是50-50或非常接近的数据都是不平衡的。

      尝试一套方法,找出对你的特定数据集最有效的方法。

  86. Asis Patra 2019年2月13日 晚上7:53 #

    这是一篇很棒的文章。非常有帮助。

    谢谢。

  87. Ashok Narendranath 2019年2月25日 晚上8:12 #

    好文章!

  88. Damon 2019年3月3日 下午2:45 #

    几年后这仍然是一篇好文章,Jason。非常有帮助。谢谢你。

  89. Sladjana 2019年3月5日 晚上6:30 #

    嗨,Jason,
    感谢您所有精彩的文章。它们真的很有帮助。您在Python的ANN中是否有成本敏感学习的经验?

    • Jason Brownlee 2019年3月6日 早上7:45 #

      我没有关于这个主题的文章,抱歉。我希望将来能涉及这个话题。

  90. itisha 2019年3月10日 下午5:17 #

    先生,你好
    我正在我的项目中使用semeval-2013数据集。这是一个多类别分类问题,该数据集的训练和测试数据都不平衡。我正在使用SMOTE对训练数据进行重采样。我想知道是否也需要对测试数据进行重采样?

    • Jason Brownlee 2019年3月11日 早上6:49 #

      不,只对训练数据集进行重采样。

      • itisha 2019年3月11日 下午5:02 #

        好的,谢谢先生。
        还有,先生,我正在使用网格搜索来优化SVM分类器的超参数。所以,我为smote和svc创建了管道,然后使用10折交叉验证进行网格搜索。通过网格搜索得到最佳参数后,我应该用原始训练集重新训练SVM,还是应该再次使用smote对训练集进行重采样?

  91. Sai 2019年3月12日 下午1:02 #

    不错的有用帖子。内容简洁明了。如果有人感兴趣,可以看看我最近偶然发现的另一个博客,它解释了处理这类不平衡问题的各种技术,主要是重采样和惩罚成本函数。

    https://knowledgengg.wordpress.com/2019/03/04/this-is-suresh/

  92. itisha 2019年3月13日 凌晨3:59 #

    我看了您提到的关于最终模型的链接。
    我对在所有数据上训练最终模型感到困惑。

    比方说:我分别有训练集(A)和测试集(B)(semeval数据集)。

    a) 首先,我对训练数据进行10折交叉验证的网格搜索,以找到超参数值。
    b) 然后在得到调整好的参数后……我应该只在整个训练集A上训练我的最终模型,还是应该在A+B上训练最终模型?
    c) 然后在B上评估最终模型。

    现在的疑问是,如果我在A+B上训练最终模型,我是否在未见过的测试集B中泄露了信息?
    我的困惑只在于最终模型的训练……是在A上训练还是在A+B上训练……因为最后我需要在测试集B上进行预测。

    • Jason Brownlee 2019年3月13日 早上8:00 #

      好问题。

      无需评估最终模型。一旦您选择了一种算法和参数,您就可以在所有可用数据上拟合最终模型并开始使用它。

      选择算法和一组参数的目的是为了估计它们在未见数据上的性能。因此,您已经对模型的性能有了一个估计。

      这有帮助吗?

  93. itisha 2019年3月14日 at 3:28 am #

    谢谢您,先生……但对于“所有可用数据”还是有点困惑……这是否意味着训练数据和测试数据都包括在内?

    另外,正如您所说,不需要评估最终模型,但我需要检查模型在未见过的测试集C上的性能。那么,在所有可用数据上拟合最终模型后,我该如何做到这一点呢?

    根据我的理解,我写了两种情况:-

    情况1)假设A是训练数据集,B是开发数据集,C是独立的测试数据集。
    a) 在训练数据A上进行网格搜索(gridsearch)以调整超参数。(10折交叉验证)

    b) 假设我通过网格搜索得到了linearsvc()的C=10。

    c) 现在我使用C=10并在整个A+B上拟合一个最终模型。

    clf=LinearSVC(C=10).fit( )

    d) 最后我使用拟合好的模型clf在未见过的测试集C上进行预测。
    clf.predict( C)

    情况2)当我只有训练集A和测试集C时。没有单独的开发集。

    a) 在训练数据A上进行网格搜索(gridsearch)以调整超参数。(10折交叉验证)

    b) 假设我通过网格搜索得到了linearsvc()的C=10。

    c) 现在我使用C=10并在整个A+C上拟合一个最终模型。

    clf=LinearSVC(C=10).fit( )

    d) 最后我使用拟合好的模型clf在测试集C上进行预测。
    clf.predict( C)

    这两种情况都正确吗?

    • Jason Brownlee 2019年3月14日 at 9:28 am #

      没有唯一最好的方法,找到一个对你的项目最有意义的方法。

      总的来说,一旦找到了模型和配置,你就在所有可用的数据上拟合一个最终模型,并用它来进行预测。

  94. Itisha 2019年3月14日 at 9:50 am #

    好的,谢谢您,先生!

  95. Prem Alphonse 2019年3月18日 at 4:33 pm #

    嗨,如果目标特征不平衡,比如2%的好对98%的坏,并且假设2%是500条记录,那么如果我使用那500条坏记录,再加上从98%中只取500条好记录来训练模型,会怎么样?
    我的问题是,用这500+500的数据,模型能很好地泛化吗?因为这是50:50的好坏比例。并且我通过多次迭代来选择那500条好记录以获得高准确率,因为只有1000条记录,这在机器上运行会更快地得到输出。

    • Jason Brownlee 2019年3月19日 at 8:52 am #

      这真的取决于数据的具体情况。

      或许可以试试看?

  96. Prem Alphonse 2019年3月19日 at 9:43 am #

    谢谢你,Jason。

  97. YUCHUAN CHEN 2019年4月12日 at 12:06 am #

    谢谢你的提示,Jason!

    据我所知,这些解决方案是针对分类模型的,这些策略可以应用于回归模型的训练吗?例如,训练好的回归模型可能对来自不常见场景的特征/数据表现不佳,我如何在训练阶段提高不常见场景的比例?

    • Jason Brownlee 2019年4月12日 at 7:48 am #

      不平衡的概念对于回归来说没有意义。

      相反,你有一个可以进行变换的数据分布,例如缩放、幂变换等。

      如果你指的是罕见事件预测或异常检测,例如对于时间序列,那么这是一个完整的研究领域。我希望将来能涵盖它。

      • YUCHUAN CHEN 2019年4月12日 at 8:08 pm #

        谢谢你,Jason。

  98. Mohammed 2019年5月4日 at 5:59 pm #

    应该先做哪一个?先对数据集进行过采样,然后提取特征;还是先提取特征,然后对数据集中每个样本的这些特征应用过采样?

    • Jason Brownlee 2019年5月5日 at 6:24 am #

      可能是后者,但两种都试试,看看哪种对你的特定数据集效果最好。

      • Mohammed 2019年5月5日 at 8:21 pm #

        关于这一点,有可以引用的参考文献吗?

        • Jason Brownlee 2019年5月6日 at 6:47 am #

          手头没有,或许可以搜索一下关于这个主题的论文?

  99. Andrea Boero 2019年5月7日 at 5:16 pm #

    采用凝聚聚类(agglomerative clustering)怎么样,希望找到一个或多个簇,其中少数类出现的百分比比较有意思?

    谢谢你
    Andrea

  100. Sara 2019年5月28日 at 7:45 am #

    我的问题是一个二元分类问题,在我的数据中,每条样本数据记录都有3D笛卡尔坐标(不作为分类属性使用)以及用于分类的属性。

    在这样的空间数据集中,即使我有相等数量的两个类别,分类的f1分数仍然会因为每个训练数据集中两个类别的不同3D空间分布而变好或变差。

    我能将不同训练模型之间f1分数的这种变化称为模型方差吗?

    非常感谢

    • Jason Brownlee 2019年5月28日 at 8:22 am #

      抱歉,我不太明白你的问题。你能详细说明一下吗?

      • Sara 2019年5月31日 at 7:38 am #

        这是一个二元分类问题(类别0和1)。每行数据是一个3D点,有三列X、Y、Z点坐标,其余列是属性值。

        虽然分类只使用属性列(特征),但我保留了每行(点)的X、Y、Z坐标,因为我最终需要它们来可视化分类结果(例如,将类别0的点着色为蓝色,类别1的点着色为红色)。

        这些点是建筑物的3D坐标,所以当我对点进行可视化时,我可以随机切割建筑物的不同部分,并将它们标记为训练/测试数据。我已经随机切割了建筑物的不同部分,所以我有几个训练/测试数据集。对每一个数据集,我都执行这个过程(在训练数据上拟合模型,在测试数据上测试,然后预测未见数据,例如另一栋建筑的类别)。

        因此,我可以有不同训练/测试数据,其中两个类别的空间分布也不同。(我所说的两个类别的空间分布,是指这两个类别在3D空间中的位置。)

        在称为A的训练/测试数据中,红色和蓝色类别点的3D位置与称为B的训练/测试数据中的不同。

        A和B在它们各自测试集上的f1分数都不同但都很好(对于任一类别都高达90%左右)。然而,当我用拟合A的模型预测未见数据时,f1分数非常糟糕;而当我用拟合B的模型预测未见数据时,f1分数很好(并且可视化建筑物给出了有意义的预测类别)。

        我能将A和B在未见数据上f1分数的这种变化称为模型方差吗?

        通过反复试验,我得出结论,当类别0和1相互环绕时(B的空间分布),我在未见数据上得到好的f1分数;而当类别0和1彼此远离时,我在未见数据上得到糟糕的f1分数。这有科学原因吗?

        在所有情况下,我都有几乎相等数量的类别0和1。

        非常感谢

  101. apo 2019年5月29日 at 5:50 am #

    你好,Brownlee先生

    首先,祝贺这篇伟大的文章。我读过很多关于不平衡数据的文章,我认为这是最完整的一篇。

    不过,我有点困惑,如果您能帮助我,我将不胜感激。我无法理解重采样(无论是过采样还是欠采样技术)与降低/提高阈值之间的权衡。

    让我用您上面的一个例子,客户流失问题。假设我们有这样一个分类问题,我们知道“不流失”或0类是多数类,而“流失”或1类是少数类。由于这个问题的性质,我们希望有很高的召回率得分,越高越好(如果我错了请纠正我)。

    所以,我尝试了两种可能的解决方案

    1) 我使用一个分类器(比如逻辑回归),并将阈值从0.5(默认)降低到0.3。这样,召回率得分比阈值为0.5时更好,而精确率略差(但仍然可以接受)。

    2) 我使用过采样(假设数据集太小,不适合使用欠采样),特别是SMOTE技术。我再次使用逻辑回归作为分类器,并注意到召回率非常好,精确率也令人满意(几乎与解决方案1中阈值为0.3时的精确率值相同)。

    那么,哪种方式更可取?它们之间有权衡吗,如果有,是什么?

    提前感谢

    • Jason Brownlee 2019年5月29日 at 8:58 am #

      你必须选择一个能够实现你项目目标的方法。这意味着要认真思考或与利益相关者/领域专家讨论什么最重要,选择一个能够捕捉到这一点的度量标准,然后选择一个能够优化你所选度量标准的方法。

      没有客观上的最好,只有针对特定项目的主观上的最好。

  102. Awal 2019年6月5日 at 5:30 pm #

    嗨,Jason,很棒的文章。

    对于2:1的数据,我需要进行过采样吗,还是说这不会有任何区别?

  103. Salomon 2019年7月4日 at 3:08 am #

    嘿,Jason,对于倾斜数据集的见解很棒,
    我正在研究一个客户流失模型,我的数据不平衡,比例为16:1。数据集只有1300个样本。当我用少数类进行过采样时,使用随机森林模型进行交叉验证得到了非常好的精确率和召回率。然而,当我尝试用同一个模型预测一个新的数据集时,召回率和精确率都急剧下降(大约50%)。你知道可能发生了什么吗?
    谢谢

    • Jason Brownlee 2019年7月4日 at 7:52 am #

      也许训练数据集或测试数据集太小或不具代表性?

  104. khadija 2019年7月24日 at 6:45 pm #

    嗨,Jason!
    我想了解类别不平衡深度学习的当前趋势和未来规划。你能分享一下你的看法吗..另外我读了这篇文章,从中我学到了很多。很棒的努力...谢谢!

    • Jason Brownlee 2019年7月25日 at 7:49 am #

      很好的建议,谢谢。我希望将来能涵盖这个主题。

  105. pnak 2019年9月18日 at 2:02 pm #

    我正在做图像分类(15个类别),它们是不平衡的,我想用SMOTE来平衡数据。我有的数据是图像而不是数据集。但是我无法实现SMOTE。你能帮我解决这个问题吗?

  106. John 2019年9月24日 at 11:28 am #

    你好,Jason,我想知道用DCGAN生成新的训练数据,然后用分类器算法在该训练数据上进行训练,对于处理不平衡的图像数据集是否有效。

    • Jason Brownlee 2019年9月24日 at 1:18 pm #

      或许先试试数据增强方法。

      如果你的生成器能产生非常逼真但又不同的图像,那可能会有帮助。试试看吧!

  107. Barnett Chiu 2019年10月12日 at 6:30 am #

    嗨,Jason,

    是否有可能训练一个分类器,无论少数类的频率如何,都能表现良好?即一个对先验概率相对稳健的分类器。

    例如,假设我们训练了一个在AUC方面表现良好的概率分类器,其训练数据包含40%的病例和60%的对照组。然而,同一个分类器可能无法很好地泛化到一个新的数据集,比如5%的病例和95%的对照组,因为至少,它的概率阈值没有为这种倾斜的类别分布进行调整。

    在某些情况下,很难预先知道少数类的频率。假设我们将以流式或增量方式预测新样本,其中少数类的频率仍然模糊不清,或随时间变化(想象一下数据是从不同地理区域收集的,目标疾病的患病率因地而异)。

    嗯……我想最简单的解决方案是为每个地理区域训练一个单独的分类器。但如果能有一个分类器,无论少数类的百分比如何,“平均”表现都相当不错,那就好了。

    另一个解决方案是根据少数类频率的变化来调整分类器的超参数,并测量在不同频率下的平均性能——然后选择在平均意义上导致最佳性能的参数。

    还有其他可能性吗?

    • Jason Brownlee 2019年10月12日 at 7:12 am #

      有些模型可能对类别不平衡不敏感,有些可以被设置为不敏感(例如逻辑回归、SVM、决策树)。例如,在拟合某些变量时,将class_weight设置为训练集中的预期权重。

      我不喜欢用AUC来处理不平衡数据,它有误导性。
      https://machinelearning.org.cn/roc-curves-and-precision-recall-curves-for-classification-in-python/

      流式处理很难。关于这个主题有很好的论文和书籍章节。在没有阅读它们的情况下,即兴而言,我会选择独立的模型——它更简单,也更容易理解。

  108. kaka 2019年11月29日 at 1:53 pm #

    这是一篇非常好的博客。关于时间序列不平衡数据怎么办?例如在电子商务数据中,我们想预测用户下个月是否会购买某个产品。我们可能会使用过去一年的数据来预测。但大多数时候,购买用户只占所有用户的15%。如何处理这个问题?您在博客中提到的像过采样或下采样的方法对此仍然有效吗?谢谢!

    • Jason Brownlee 2019年11月29日 at 6:18 pm #

      谢谢!

      很好的问题。

      抱歉,这不是我非常了解的话题——不平衡时间序列分类。我希望将来能涵盖它。

      • kaka 2019年11月29日 at 7:49 pm #

        谢谢你的回复!我希望你能写一篇博客来解决这个问题。这对我们非常有帮助。

  109. chaitanya madaka 2019年12月8日 at 1:37 pm #

    很棒的文章。但我想知道欠采样是否会完全改变数据的性质。

    • chaitanya madaka 2019年12月8日 at 1:38 pm #

      我的意思是过采样。唉!!!!!!!!!!

    • Jason Brownlee 2019年12月9日 at 6:44 am #

      这正是其目的,但也是风险所在。

  110. Sarang 2019年12月11日 at 7:35 am #

    哦,天哪,你太棒了。

    我读到的每一种方式,都让我对你给出的例子和类比的真实性感到震惊!!

  111. AJ Wildridge 2020年2月11日 at 3:48 am #

    嗨,Jason,
    看来有人抄袭了你在这里写的很多作品……
    https://www.datacamp.com/community/tutorials/diving-deep-imbalanced-data
    可能需要给 datacamp 发封邮件。
    祝好,
    AJ

    • Jason Brownlee 2020年2月11日 at 5:16 am #

      非常失望,谢谢。

      现在这种事经常发生。

  112. Glauber Brito 2020年3月7日 at 11:26 pm #

    很棒的文章。恭喜。

  113. Abdulkarim 2020年3月14日 at 6:35 pm #

    我的名字以字母A开头

    来自埃塞俄比亚

    我非常想从你的博客JASON BROWNLEE中学到东西
    我希望你能特别地教我这个博客,你能答应我吗?我是一个像你一样希望在教育方面帮助别人的人。

    @karim
    用英文翻译

  114. Zaily AYUB 2020年3月22日 at 12:41 am #

    嗨,Jason

    真是巧合,博士!

    我正在寻找关于处理不平衡分类的信息,特别是在决策树技术方面。

    我会购买你的教程书,因为我一直支持你的努力。

    谢谢。

  115. Volkan Yurtseven 2020年5月3日 at 4:08 am #

    很棒的文章,但我有一个问题。在数据不平衡的情况下复制相同的数据有多正确?这算不算欺骗模型?我们应该相信结果吗?

    • Jason Brownlee 2020年5月3日 at 6:16 am #

      只要采样只应用于训练数据集,它就可以非常有效。

      也许从这里开始
      https://machinelearning.org.cn/data-sampling-methods-for-imbalanced-classification/

      • John White 2022年4月27日 at 6:15 pm #

        嗨,Jason,

        您在上面的评论中提到“只要采样只应用于训练数据集……”

        您对“然而,如果训练集被采样为平衡的,那么测试集
        的采样应更符合自然状态,并且应该
        反映出不平衡,以便能够计算出未来性能的
        诚实估计。” -《应用预测建模》第16.7章“采样方法”,作者Kuhn Johnson,有何评论?

  116. ola 2020年6月11日 at 7:46 am #

    很棒的文章,不过我有个问题。关于Near Miss算法(欠采样技术)!

    Near Miss算法的基础步骤如下

    1. 该方法首先计算多数类所有实例与少数类实例之间的距离。

    2. 然后,选择与少数类实例距离最小的n个多数类实例。

    3. 如果少数类中有k个实例,NearMiss将产生k × n个多数类实例。

    请问,您能解释一下最后一点(#3)吗?

  117. Urs 2020年7月10日 at 3:06 am #

    如何处理不平衡的时间序列分类问题?

    假设你正在尝试预测股票价格,并且有一系列记录的特征时间序列。
    模型应该简单地分类为“买入”、“持有”或“卖出”。持有决策的数量远超买入和卖出。因此,不平衡模型会对所有样本预测为“持有”,并达到90%以上的准确率。

    样本由过去的许多时间步组成,而训练类别是通过观察未来几个时间步来确定的。

    模型使用一个有状态的双向LSTM层,有状态是为了从理解时间序列的学习效果中受益。

    在这种环境下,我如何进行过采样或欠采样?如果我不想中断LSTM的序列,我就不能简单地从批次中移除样本。

    有什么想法吗?

    • Jason Brownlee 2020年7月10日 at 6:05 am #

      也许可以从类别加权开始。

      • Urs 2020年7月10日 at 7:14 am #

        谢谢。是的,已经这么做了。我使用了整个数据范围来计算class_weight。然后我选择一个包含65000个连续样本的范围,构建时间序列(形状为65000,180,15)作为一个epoch,然后以256个样本为一批进行训练。每个epoch后我都会重置状态。每个epoch训练3次,然后为下一个epoch选择一个新的(随机的)连续范围的65000个样本。

        结果是,在经历不同的epochs(包含不同的训练数据)时,我得到了非常多样的训练结果。

        但所有训练结果的共同点是,预测总是倾向于一个方向(有时是买入,有时是卖出)。

        混淆矩阵示例,也可能是反过来,第一列全为0)
        [[ 3 17381 0]
        [ 1 96395 0]
        [ 4 17288 0]]

        分类报告
        精确率 召回率 f1分数 支持数

        类别 0 0.38 0.00 0.00 17384
        类别 1 0.74 1.00 0.85 96396
        类别 2 0.00 0.00 0.00 17292

        准确率 0.74 131072
        宏平均 0.37 0.33 0.28 131072
        加权平均 0.59 0.74 0.62 131072

        模型没有学到东西,而class_weight似乎也没有帮助。

        还有其他想法吗?

      • Urs 2020年7月11日 at 1:39 am #

        正在研究欠采样(从imblearn.under_sampling import RandomUnderSampler)

        这似乎只适用于二维数据。有没有允许保留多维x数据的欠采样算法?

        • Jason Brownlee 2020年7月11日 at 6:19 am #

          可能有的,抱歉我不太了解。你可能需要编写自定义代码。

  118. sid 2020年7月24日 at 2:48 pm #

    Jason,

    非常欣赏您的工作。但我认为这篇文章不正确。实际上,RCB(上面的一位评论者)提到的才是对的。

    但问题是,如果我的不平衡训练数据实际上就是真实世界数据的样子呢?那么通过使其平衡,我就是在偏置数据集了。

    如果你的真实世界数据与你的不平衡数据集所描绘的不同(如果你觉得真实世界更平衡),那么通过上述方法平衡训练数据是有用的。

    但如果你的真实世界数据确实是不平衡的,并且主要类别是罕见的(如癌症、欺诈等),那么如果你使用上述重采样方法,它会给出糟糕的结果,因为它偏置了训练数据。

    在这种情况下,要么改变你的成本函数以包含预测成本的度量(将错误预测的成本乘以每个类别P0/P1)。要么在训练算法时直接使用类别权重(使用sklearn中的class_weight功能等)。因为那样会隐式地处理这种类别预测成本。

    您在您的任何文章中写过这个的实际代码实现吗?谢谢。

  119. sid 2020年7月24日 at 2:50 pm #

    看下面的文章可以更好地理解。如果你有任何概述下面文章实现的文章,请告诉我。谢谢

    https://towardsdatascience.com/handling-imbalanced-datasets-in-machine-learning-7a0e84220f28

  120. Sid 2020年7月28日 at 5:29 am #

    我上面的观点是,如果现实是不平衡的,我们就不应该平衡数据。而你却说我们应该平衡它,即使它变得有偏见。

    我不确定我是否理解那部分。

    根据我上面分享的文章,它说如果现实是不平衡的,就不要平衡数据。使用成本敏感学习方法。你能对此评论一下吗?如果现实也是平衡的,但训练数据变得不平衡了,那么SMOTE是好的。

    如果现实是不平衡的,那么就不应该使用SMOTE和其他采样技术,因为它们会使数据产生偏见。

  121. sushil 2020年8月19日 at 8:17 pm #

    嗨,Jason,

    又是一篇出色的文章。我想这可能在我之前邮件中提到的关于我的不平衡数据集项目上是一个救星。我会尝试这种方法,并努力获得期望的结果。非常感谢您以简洁明了的方式呈现这些概念和方法。

  122. Silvia 2020年10月29日 at 9:33 pm #

    谢谢您的文章,和您所有的文章一样精彩!=)

    我一直在一个不平衡的数据集上对神经网络进行一些测试,我决定混合两种方法:过采样(SMOTE)和欠采样以及加权类别(Keras的class_weight)。

    我发现现在我的模型在验证集(具有原始分布)上的表现(使用AUC作为度量)远好于训练集。我不知道这是否合理,或者我做错了什么。

    这是正常的行为吗?

    谢谢您的帮助!

    • Jason Brownlee 2020年10月30日 at 6:50 am #

      谢谢!

      不错。

      我没预料到会这样,我本以为结果会更差。

  123. Luigi 2021年1月15日 at 8:28 pm #

    嗨,Jason,
    像逻辑回归这样的一些模型,在其参数中有一个默认值为class_weight=None的选项。如果你将它设置为'balanced',那应该会稍微修正决策边界。

    我不确定这个选项是否比欠采样或过采样更有效,你对此有什么看法?我一直知道重采样应该是最后的选择..谢谢

    • Jason Brownlee 2021年1月16日 at 6:55 am #

      正确。

      在某些情况下它会有帮助,而在其他情况下,对训练集进行重采样会有帮助。

      你必须找出对你的数据集最有效的方法。

  124. m.cihat 2021年3月27日 at 12:31 am #

    你好
    我尝试了很多方法,但得到的结果非常差。我的数据集包含450,000条数据,有12个特征和一个标签(0或1)。我的数据集也是不平衡的(1:50)。我正在使用python的imblearn库中的EasyEnsembleClassifier。理论上它应该能创造奇迹,因为它为每个估计器创建一个子集,并为每个估计器训练一个模型。它应该能行,对吧?但我得到的是8%的精确率,90%的召回率。有趣的是,当我只使用一个子集(RandomUnderSampler),总共包含18,000条数据(9000个类别0,9000个类别1)时,它产生了完全相同的结果。这个奇怪结果的原因可能是什么?任何帮助将不胜感激。

  125. Eddy De Waegeneer 2021年4月7日 at 3:56 am #

    嗨 Jason
    如何处理一个有128个类的数据集,其中一些类出现0次或仅1次?

    • Jason Brownlee 2021年4月7日 at 5:13 am #

      也许你可以移除只有零个或一个样本的类别。

  126. A_french_croissant 2021年4月12日 at 1:24 pm #

    在法国,有人复制粘贴并翻译了你的大部分内容
    https://datascientest.com/comment-gerer-les-problemes-de-classification-desequilibree-partie-ii

  127. Sourav 2021年7月16日 at 11:18 pm #

    在我的案例中,我在测试数据集上得到了很好的结果,但在OOT(Out-of-Time,跨时间验证)上非常差。我使用SMOTE来平衡数据集,并使用RF(随机森林)来预测..具体数字是测试集的AUC为0.81,而OOT的AUC为0.5。

  128. Gloria 2021年7月19日 at 3:40 pm #

    嗨,Jason,非常有见地的文章。非常感谢你。

  129. Mateo Acosta Rojas 2021年10月5日 at 11:40 am #

    你是一位了不起的教育家!你应该写一篇关于你自己的文章,谈谈你认为是什么让你成为这样一位多产且优秀的导师。😀

  130. shervin 2021年10月7日 at 12:36 am #

    嗨,jason
    重采样是预处理中的一个步骤,还是我可以在特征提取步骤之后做?
    关于这个问题,有什么可以用于我论文的参考文献吗?
    此致

    • Adrian Tam
      Adrian Tam 2021年10月7日 at 2:56 am #

      两者应该都可以。想象你有一个表格,列是特征,行是样本。特征提取是操作列,例如,选择某些列,或者将A列加到B列。重采样是针对行的。因此,这两个操作可以按任意顺序进行。

  131. musfirah noor 2022年1月1日 at 5:03 am #

    你好,我们能否结合使用SMOTE过滤器和来自无监督实例的重采样过滤器来处理不平衡数据集并提高准确性?

    • James Carmichael 2022年1月1日 at 12:07 pm #

      嗨,Musfirah…理论上可以,但我需要更多地了解你的具体应用和目标。虽然我无法帮助你诊断代码,但我可以为你提供我们提供的可能对你的项目有帮助的额外材料建议。

      此致,

  132. musfirah noor 2022年1月4日 at 6:07 pm #

    嗨,James Carmichael…我正在做关于学生预测的工作,实现平台是WEKA。

    • James Carmichael 2022年1月5日 at 6:59 am #

      谢谢你的反馈,Musfirah!如果你对我们的任何材料有任何问题,请告诉我。

  133. Alejandro 2022年3月15日 at 8:38 pm #

    嘿,我有一个时间序列数据集,我正在尝试预测一些样本。但它存在严重的不平衡,大约是1:100。我试过调整模型的超参数,但我认为最好的办法是为少数类制造更多样本。问题是,少数类在我看来完全是随机的,看不到规律。对它进行过采样是个好主意吗?

    • James Carmichael 2022年3月16日 at 10:46 am #

      嗨,Alejandro…你也许可以不管怎样都使用少数类的值,在一个能提取你肉眼看不到的特征和模式的深度学习模型中。这就是使用深度学习的“魔力”。

  134. Leo 2024年1月18日 at 7:21 am #

    嘿,James,感谢这篇很棒的文章。我一直在处理一个不平衡的数据集来进行分类。我大约有9万个数据点,其中一个类别大约有120个数据点。因此,大多数算法在预测它时都有问题,并且准确率显示为0。

    我的问题是,当我为该类别使用SMOTE或ADSYN方法时,预测变得很差(过分强调了那个类别,预测的数量远超应有的数量)。我计划在类别上添加权重,但我不确定这是否是正确的方法。我想听听你对此的看法。谢谢。

  135. Trouli 2024年7月2日 at 9:33 pm #

    你好!感谢你通过这篇文章提供的帮助。我正在处理一个不平衡的医疗数据集,其中有150名健康人和42名病人。我尝试了很多方法来提高召回率、f1分数和精确率,但似乎都没有太大差别(这些指标的值大约是0.42)。我正在使用MLP分类器,并结合了ADASYN、特征选择和bagging分类器。我改变了ADASYN的采样策略和MLP的参数,但改进大约只有0.2。我还尝试了其他集成和特征选择方法、欠采样,也做了网格搜索,但没有显著的改进。有人有什么建议或意见吗?我将非常乐意阅读它们!谢谢你们。

    • James Carmichael 2024年7月3日 at 8:42 am #

      嗨,Trouli…处理不平衡的数据集,尤其是在医疗数据中,可能会很有挑战性。这里有一些可能帮助你提高模型性能的策略和技术

      ### 1. 不同的重采样技术

      – **SMOTE 变体**
      – 尝试不同的SMOTE变体(例如,Borderline-SMOTE, SVMSMOTE),它们在某些情况下可能比ADASYN表现更好。

      – **基于聚类的过采样**
      – 使用基于聚类的过采样方法,以更有结构的方式生成合成样本。

      ### 2. 算法和模型调整

      – **不同的分类器**
      – 试验其他分类器,如随机森林、梯度提升机(GBM)或XGBoost,它们通常对不平衡数据集更具鲁棒性。
      – 使用专为不平衡问题设计的算法,如Balanced Random Forest或EasyEnsemble。

      – **成本敏感学习**
      – 修改学习算法,使其对成本敏感。为少数类的错误分类分配更高的惩罚。
      – 在 `sklearn` 中,这通常可以通过将 `class_weight` 参数设置为 `balanced` 或自定义权重来完成。

      ### 3. 高级技术

      – **集成方法**
      – 使用像Voting Classifier这样的集成方法,在这里你结合了多个模型的预测。
      – 考虑使用Stacking Ensemble,在一个元分类器中结合多个分类器的预测。

      – **混合方法**
      – 结合对多数类的欠采样和对少数类的过采样,以更有效地平衡数据。

      ### 4. 特征工程

      – **特征重要性**
      – 分析特征重要性并移除不太重要的特征以减少噪声。
      – 使用像SHAP或LIME这样的方法来理解每个特征的贡献。

      – **新特征**
      – 基于领域知识创建新特征,这些特征可能更好地捕捉区分不同类别的模式。

      ### 5. 交叉验证和超参数调优

      – **分层交叉验证**
      – 确保你正在使用分层交叉验证,以在每个折叠中保持类别的比例。

      – **网格搜索和随机搜索**
      – 继续进行超参数调优,但尝试更广泛的范围和组合。
      – 考虑使用贝叶斯优化进行超参数调优。

      ### 6. 评估指标

      – **关注不同的指标**
      – 虽然召回率、精确率和F1分数很重要,但也要监控像ROC-AUC这样的指标,以更好地理解模型性能。
      – 使用精确率-召回率曲线来更好地了解你的模型在区分类别方面的表现。

      ### 7. 预处理和数据增强

      – **数据增强**
      – 通过对少数类数据进行微小变换来增强数据,以创建更多样化的训练样本。

      – **归一化和缩放**
      – 确保所有特征都已正确归一化或缩放,这可能对MLP分类器有所帮助。

      ### 实现示例

      这是一个结合使用SMOTE和平衡随机森林分类器的示例

      python
      from imblearn.over_sampling import SMOTE
      from imblearn.ensemble import BalancedRandomForestClassifier
      from sklearn.model_selection import train_test_split, GridSearchCV
      from sklearn.metrics import classification_report

      # 拆分数据
      X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, stratify=y)

      # 应用 SMOTE
      smote = SMOTE()
      X_res, y_res = smote.fit_resample(X_train, y_train)

      # 平衡随机森林
      brf = BalancedRandomForestClassifier()

      # 网格搜索进行超参数调优
      param_grid = {
      'n_estimators': [100, 200, 300],
      'max_depth': [10, 20, 30],
      'min_samples_split': [2, 5, 10],
      'min_samples_leaf': [1, 2, 4]
      }

      grid_search = GridSearchCV(estimator=brf, param_grid=param_grid, cv=5, scoring='f1')
      grid_search.fit(X_res, y_res)

      # 预测和评估
      y_pred = grid_search.predict(X_test)
      print(classification_report(y_test, y_pred))

      ### 总结

      1. **试验不同的重采样技术**,如SMOTE变体和混合方法。
      2. **尝试不同的分类器**和集成方法。
      3. **实施成本敏感学习**,为少数类赋予更高的权重。
      4. **特征工程**以提高输入数据的质量。
      5. **分层交叉验证**和**广泛的超参数调优**。
      6. **监控各种评估指标**并使用**数据增强**技术。

      如有需要,欢迎随时询问更多细节或具体的实现指导!

  136. Trouli 2024年7月5日 at 10:08 pm #

    非常感谢你!我会测试你提到的所有方法,希望有些能改善我的结果。非常感谢!!

发表评论

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。