作者 | Meagvo
译者 | 马可薇
策划 | 刘燕
二元分类中有一类情况,原始数据集中的两个类出于问题性质的原因,导致其中数据点分布不平衡。举例来说,在处理用户流失(指用户在一段时间之后不再继续使用公司产品的情况)这类市场问题预测时,流失用户所占的百分比一般都会远低于留存用户的。如果说这个例子里分类是八比二的话,那么只会有 20% 的用户终止了与公司继续接触,剩下 80% 的用户则会继续使用公司产品。
但问题是,这 20% 的用户流失可能对公司非常的重要。
举一个更形象的例子,一家礼品公司有 100,000 名顾客,每位顾客平均创造 50 美元的价值,那么这些顾客全部加起来就是 5,000,000 美元。如果说其中有 20% 的用户放弃继续购买产品,那么公司将损失 1,000,000 美元!日积月累这些金额甚至可以让最大的电子商务公司或实体店汗颜。因此,公司营销部门的一个主要任务就是预测客户的流失,并提前做出干预措施以防止其发生。
用于预测客户流失的机器学习
如果你所在公司有优秀的数据科学或数据分析团队,那么恭喜你,一个优秀的客户流失预测模型可以让你抢先一步预测用户的忠诚度,在他们放弃公司产品之前采取措施,甚至还可能为公司保住客户资源。
但在处理这类二元分类模型时,样本数量不平衡的两个类别通常会让事情变得棘手,而大多数的数据分析师所依赖的精度指标也并不是万能的。为此,本文将回顾 Koo Ping Shuang 发在 Towards Data Science 上 另一篇文章【另一篇文章】中所提到的各类机器学习性能评估中可用的各类指标,并从中选择合适不平衡二元分类问题的指标进行分析。
什么是精度?
精度= 所有正确预测 / 全部预测
精度计算了所有预测中正确所占的比例,直觉告诉我们这么算确实没问题,可是到了不平衡数据集上,情况就变得复杂了……
举例来说,你从市场部那边拿到了过去一年的客户流失情况数据。去年总共有十万的客户,其中有两万的客户流失了。现在,如果说我们预测全部的十万客户都留存到了年底,这就意味着你的精度是 80,000/100,000,足足有 80%!但实际上你一个客户流失都没有预测到。假如分类再极端一点,90 比 10 的客户留存,我们还是预测没有任何客户流失,那么我们将拥有一个 90% 精度的模型,但却一个流失案例都没有预测到。
最终,我们拿着 90% 的模型却只能“四顾心茫然”。
那么,要怎么解决这个问题呢?
除了精度之外,我们还有其他用于衡量模型性能的指标,本文中我们将重点关注以下三种:
精准度
召回率
F 值
精准度
精准度 = 真正 / (真正 + 假正)
精准度(Precision)的算法相比精度来看并不是很清晰,精准度可以告诉我们的模型与预期目标间的距离有多远。成功的预测将为模型加分,而失败的预测也会有一定的扣分。因此,如果我们成功预测到了所有的二万用户流失,也就是两万的真正,但同时也有两万并没有流失的客户被模型混淆在了其中,那么这一点在精准度里也会有所体现:
没有假正:20,000/(20,000+0)= 100%
有假正:20,000/(20,000+20,000)= 50%
假正在统计学中经常被称作是第一类错误,是指被预测为正确的错误样本。如果你需要处理不平衡的数据集,并防止假正的出现,那么精准度将帮上大忙。举例来说,我们要为确诊癌症的患者实施风险治疗,但我们必须要确保接受治疗的人是真正患病的,因为如果对正常人实施这种治疗手段的话,那么我们将背负恶名。这种情况下,我们会希望能将假正的样本数目将到最小,提升模型精准度。
召回率
召回率 = 真正 /(真正 + 假负)
如果说提高精准度是为防止假正样本,那么提升召回率(recall)则是为了降低假负的数量。在统计学中,假负被称为第二类错误,是指预测为阴性,实际为阳性的案例。还是用之前的例子,如果我们成功预测出所有的流失客户,没有错过任何一个,那么我们将拥有:
没有假负:20,000/(20,000+0)= 100%
如果我们错估了五千的客户,那么召回率将下降,但计算式的分母不变,如下:
有假负:15,000/(15,000+5,000)= 75%
如果你需要处理的数据集分类不平衡,且对找回所有问题案例的需求迫切,那么召回率将会是个很好的评估标准。在我们的客户流失预测例子中,我们就可以借此找出客户中最有可能放弃购买的客户,并提前给他们发出邮件或消息通知。
这种情况中的假正可能也就是多发几封邮件,你大概率也不会在意有五百个对产品非常忠诚的客户会受到多余邮件而造成的浪费,我们希望的是能通过消息提醒,保留住那些潜在的客户流失。
F1 值
虽说我们可能不会直观地看出 F1 指标的含义,但它应该是最适合你的那个。
F1= 2 X (精准度 * 召回率) / (精准度 + 召回率)
可以说,F1 是精确度是召回率的组合,它可以帮你确定模型性能,并对假正和假负进行赋权。如果你想了解更多,可参考 维基百科中的算法分解。
如果说我们在 2 万个目标样本中成功识别了 1.5 万,但其中有五千是错判为正的负,并且漏掉了五千个正样本,那么你的 F1 应该如下:
F1: 15,000 / (15,000+.5 (5,000+5,000) ) =75%
F1 算法最妙的点在于它可以在精确度和召回率找到巧妙的平衡点。
下一步
现在,通过一个不平衡数据集的例子分析,我们可以清楚发现,准确率并不一定是最好的评判标准。极端例子就是那个 90% 准确率的模型,但却在召回率或精确度上得分为零。以 Python 的逻辑回归算法为例,以下几种选项或许值得一看:
SMOTE。该软件包允许用户过量或过少取样,以平衡分类间数量差异。
赋权逻辑回归。通过选择每个类别的权重,或直接根据类别分布平衡权重,我们可以设置真正、假正及假负的重要程度,从而对结果有更多的掌控。
总 结
即使是用 R 或 Python 进行机器学习算法训练,在面对不平衡分类问题时也难免会感到棘手。希望本文能够帮助各位意识到数据分析中潜在的漏洞,以防出现逻辑上的谬误。文章中主要的观点有三:
精度并不是万能的
确定你的业务目标
找平衡数据软件包
https://towardsdatascience.com/why-my-model-with-90-accuracy-doesnt-work-685817a2b0e
关键词: 为什么我的模型准确率都 却不起作用?