理解在机器学习中使用严重不平衡数据集的基本原理

理解在机器学习中使用严重不平衡数据集的基本原理

介绍

从严重不平衡的训练数据集中生成有价值的分类模型在机器学习中可能具有挑战性。在本文中,我将介绍一种简单但有效的方法,ML工程师可以使用它从不平衡数据集中生成有效的分类模型。我还将概述ML工程师在处理严重不平衡的数据集时所犯的一些最常见的错误。

机器学习工程师经常遇到需要根据可用特征将实例分类为两个类别之一的问题。常见用例包括:

  • 电邮垃圾邮件过滤
  • 欺诈识别
  • 根据X射线图像预测患者是否患有癌性肿瘤

这三个例子共同具有积极的类别(垃圾邮件,欺诈或肿瘤存在),在人群中通常严重不足。例如,应用程序的用户中只有不到1%会尝试欺诈行为,其中绝大多数都参与正常的日常使用。

示例 - Weebly的不平衡数据集用例

场景:想象一下,您是一家新雇用的机器学习工程师,可以完全访问下面提供的训练数据集。您的首要任务是开发一个模型,该模型可以识别用户使用这两个基于活动的特性尽可能准确地支付费用的可能性。

主要目标:预测最近创建的免费增值帐户在不久的将来成为Weebly付费服务的用户的可能性。

示例数据集:假设您已完成示例数据集的定量分析,并了解Weebly的用户中只有不到2%的用户没有付费计划。图1(下面)显示了这种不平衡数据集的外观。在此图中,付费用户显示为绿色标记,而保留免费服务的用户显示为红色。

理解在机器学习中使用严重不平衡数据集的基本原理

图1

图1:转换和非转换用户的示意性不平衡数据集,为每个用户绘制了两个基于动作的特征。最终支付计划费用的用户以绿色显示,而继续使用免费服务的用户则显示为红色。

每个用户,即每个数据点,嵌入到一个二维平面中,该平面跨越两个可能重要的特征,用于预测未来转换为付费服务的可能性:

  • 用户在线与Weebly产品交互的总次数(例如点击次数,登录次数或编辑设置)
  • 用户最近一次操作与现在之间的小时数。

只有1%,即5万个数据点中的500个,是正的,导致数据集严重失衡。

注意:实际构建的模型考虑了用户属性和实际数据的复杂结构。图1所示的数据仅用于说明目的。

准确性陷阱

如果您对机器学习相对陌生,那么您可能以前只使用过平衡良好的数据集,您的第一反应可能是直接插入并向训练数据抛出一个标准分类器,而不做任何修改。

当您在图1中的数据上训练一个随机森林分类器并在测试集上评估它的性能时,您会发现该模型在预测用户是否会转换方面的准确率为99%。您对此非常兴奋,因此您立即向一些消费者展示了该模型。稍后,这些模型使用者要求您提供一个混淆矩阵,以帮助他们理解模型所犯错误的类型。当你把矩阵打印出来的时候,你会看到以下内容:

理解在机器学习中使用严重不平衡数据集的基本原理

图2:在严重不平衡的数据集上训练的悲观分类器的混淆矩阵。只做出负面预测,因为这会优化模型的准确性。

您意识到该模型从未预测用户将在近20,000个用户的整个测试集中进行转换。相反,它会占用每个用户,无论该用户采取的操作总数和上次活动的时间如何,并将其归入“未转换”类别。为什么会这样?图1是否清楚地显示了转换和非转换之间这两个特征分布的差异?

上述场景中模型的行为是模型底层算法性质的直接结果。当训练集中的阳性和阴性实例的数量之间存在平衡时,标准机器学习二元分类器通常最有效。当训练发生时,模型会调整内部参数或生成决策边界,以优化训练集的整体预测准确性。因为每个实例同样有助于模型的准确性,并且因为负实例远远超过数量上的正数,所以模型发现它可以通过简单地为每个实例输出“未转换”来最大化准确性,而不管其输入特征如何。通过这种方式,算法“学到”的是,永远不值得尝试将正的实例识别为正的实例,因为这样做可能会损害模型正确分类负实例的能力,这将使总体准确率比正的实例高出近100倍。

对于任何一个分类模型来说,几乎总是存在一种权衡,即通过“召回”准确地识别正的事例,以及通过“sensitivity”准确地识别负的事例。一个给定的模型将有偏差,以优化与大多数类相对应的精度参数。在上面的示例中,模型的调用最终为(0)/(0 + 169)= 0%,这意味着,当呈现正实例时,模型将始终无法对它们进行正分类。另一方面,sensitivity为(16,497)/(0 + 16,497)= 1.0或100%,这意味着模型将始终正确地将负实例分类为负数。如果模型在召回期间增加1%,sensitivity降低1%,那么所得到的准确度将是(0.01 * 200 + 0.99 * 19,800)/(20,000)= 19,604 / 20,000 = 98.02%,

如果你读到这里,还在想,

“是的,但99%的准确度非常棒”

但考虑到模型除基本统计数据外没有提供任何信息

ML工程师的工作是更深层次。

快速修复 - 欠采样

在你的老板发现你的第一个模型没有为公司增加任何新价值之前,你需要训练一个可以提供一些有用预测的新模型。

在由“分类器始终输出零”字样组成的搜索中,您会发现Stack Overflow帖子提到如果您对多数类进行随机欠采样,您的二元分类器可能会表现得更好,这样您最终会得到相同数量的正面和负面实例在您的训练数据集中。为了实现这一点,您知道完整数据集中有500个转换器实例,因此您需要添加这些从非转换器实例集合中随机抽样的500个实例,从而形成新的训练集。这个平衡训练集有1,000个实例,其中50%是正类,如图3所示。

理解在机器学习中使用严重不平衡数据集的基本原理

图3:通过随机抽取图1中所示数据集的大多数类来创建的平衡数据集。现在,转换和非转换用户的表示相同。

您在此新数据集上训练第二个随机森林分类器,并通过交叉验证,您发现您的模型在预测用户是否转换时准确率为79%。这个数字听起来几乎不到99%,但此时你对60%以上的任何东西感到满意。您检查混淆矩阵以查看错误的分布:

理解在机器学习中使用严重不平衡数据集的基本原理

图4:在平衡数据集上训练的分类器的混淆矩阵。矩阵在对角线上几乎是对称的。

从这个矩阵中可以看出,该模型不再将所有实例集合到“未转换”类别中。相反,它通过平衡的努力来识别正负类的实例,就像几乎对称的混淆矩阵所证明的那样。您还注意到,召回增加到(128)/(36+128)= 78%,灵敏度降低到(135)/(42+135)= 76%。在最后的测试中,您将查看保存的数据集中的模型的准确性,其中包含原始的、不平衡的分布。这似乎是明智的,因为当你将你的模型投入生产时,它会看到一个严重不平衡的数据集,与平衡的数据集非常不同。

理解在机器学习中使用严重不平衡数据集的基本原理

图5:在具有原始不平衡分布的保持集上测试时,在平衡数据集上训练的分类器的混淆矩阵。

从这个矩阵中,您可以看到,即使您的模型现在可以正确地从512个转换用户中挑选出414个,但它错误地预测10491个非转换用户将转换。看来你的模特做了一个很坏的交易。为了正确识别数百个用户,模型错误地识别了数千个用户!在这一点上,重要的不是沮丧,而是退一步问自己,‘我的模型的最终目标是什么?这个问题的答案将告知使用不平衡数据集的最后一步,即在正确识别阳性实例与阴性实例之间设置平衡。

不可避免的权衡

在处理分类问题时,人们总是可以在准确预测正类和准确预测负类之间做出权衡。在上面的示例中,对大多数类的采样不足使得模型更关注于正确地预测积极实例。与原始样本相比,它有效地表示了阳性情况。抽样不足只是促成这种权衡的众多方法之一。如何设置取舍平衡取决于谁将使用该模型以及出于什么目的。

想象一下,你的模型的消费者突然告诉你,他们想用它来提供折扣券来激励用户购买产品。他们特别提到,他们不希望向那些似乎已经对购买感兴趣的用户发送报价,他们需要一种模式,为他们提供一大批用户,而这些用户几乎不太可能进入付费服务。

这对您来说是个好消息,因为您使用平衡数据集构建的第二个模型在选择要转换的用户集方面几乎成功了80%。由于您的工作,您现在可以向涉众提供一个包含将近40,000个不太可能购买产品的用户的列表。事实上,只有大约96/ 40000 = 0.24%的用户最终会转换。尽管您的模型错误地识别了大约24%的非转换器,但是模型使用者并不关心这种类型的错误。他们并不担心给每个人发优惠券,他们只是一个庞大的群体,如果没有外部动机,他们是不太可能支付的。如果你在一个不平衡的数据集上训练你的初始模型,你将会使优惠券发送给所有的用户,甚至是1%的用户,导致一些相当愤怒的利益相关者!

最后……

与平衡数据相比,处理严重不平衡的数据会带来额外的挑战,但是理解一些简单的概念可以帮助我们避免常见的错误。

一个训练在未修改的不平衡数据集上的标准模型可能会导致一个几乎完全专注于获得大多数类正确的分类器。一个简单的方法来推动模型更准确地识别少数群体是在训练集中的大多数类。

在总体的准确性和分类器识别少数类的能力之间总有一种权衡,这两个目标之间的平衡应该由模型用例的优先级决定。

相关推荐