数据科学难点指南-全-
数据科学难点指南(全)
原文:
zh.annas-archive.org/md5/8f60c1dfe89af8243c68509000c09981译者:飞龙
序言
我会断言学习和实践数据科学是困难的。这是因为你被期望成为一位优秀的程序员,不仅了解数据结构及其计算复杂性的复杂性,还精通 Python 和 SQL。统计学和最新的机器学习预测技术应该成为你的第二语言,并且自然而然地,你需要能够应用所有这些技能来解决可能出现的实际业务问题。但这份工作也很难,因为你还必须成为一名优秀的沟通者,向可能不习惯以数据驱动方式做决策的非技术干系人讲述引人入胜的故事。
所以让我们诚实地说:数据科学的理论和实践几乎是困难的。任何旨在涵盖数据科学困难部分的书籍都是百科全书式的详尽,或者必须经过一个预选过程,过滤掉一些主题。
我必须首先承认,这是我认为数据科学中难以学习的主题的选择,并且这个标签本质上是主观的。为了让它不那么主观,我会提出,这些主题之所以难以学习,并不是因为它们的复杂性,而是因为在这个时代,这个行业对它们作为入门主题的重视程度不高。因此,在实践中,它们更难学习,因为很难找到相关资料。
数据科学课程通常强调学习编程和机器学习,我称之为数据科学的大主题。几乎所有其他内容都期望在工作中学习,不幸的是,如果你能在第一次或第二次工作中找到导师,这真的很重要。大型科技公司很棒,因为它们拥有同样大的人才密度,所以许多这些有些神秘的主题成为本地公司子文化的一部分,对许多从业者不可见。
本书讨论的是能够帮助你成为更高效数据科学家的技术。我将其分为两部分:第一部分涉及数据分析和数据科学软性方面的主题,而第二部分则关注机器学习(ML)。
尽管可以按任意顺序阅读而不会产生主要摩擦,但有些章节会引用先前的章节;大多数情况下,你可以跳过引用,材料仍然清晰且不言自明。引用主要用于提供跨看似独立主题的统一感。
第一部分涵盖以下主题:
第一章,“那又怎样?用数据科学创造价值”
数据科学在为组织创造价值中的角色是什么,以及如何衡量它?
第二章,“指标设计”
我认为数据科学家最适合改进可操作指标的设计。在这里,我将向你展示如何做到。
第三章,“增长分解:理解顺风和逆风”
理解业务状况并提出引人入胜的叙述是数据科学家常常需要的。本章介绍了一些增长分解,可用于自动化部分工作流程。
第四章,“2×2 设计”
学会简化世界可以帮助你走得更远,2×2 设计将帮助你实现这一点,并帮助你改善与利益相关者的沟通。
第五章,“构建业务案例”
在启动项目之前,你应该有一个业务案例。本章将向你展示如何做到。
第六章,“提升的价值何在?”
尽管它们很简单,提升可以加速你可能考虑用机器学习进行的分析。我在本章中解释了提升。
第七章,“叙事”
数据科学家需要在讲故事和构建引人入胜的叙述方面变得更加优秀。在这里,我向你展示如何做到。
第八章,“数据可视化:选择正确的图表来传递信息”
投入足够的时间进行数据可视化也应该有助于你的叙述。本章讨论了一些最佳实践。
第二部分是关于机器学习的,涵盖以下主题:
第九章,“模拟和自助法”
模拟技术可以帮助你加深对不同预测算法的理解。我将向你展示如何做,并讨论使用你最喜欢的回归和分类技术时的一些注意事项,还有自助法,可用于找到一些难以计算的估计量的置信区间。
第十章,“线性回归:回归到基础”
深入了解线性回归对理解更高级的主题至关重要。在这一章中,我回到基础,希望为机器学习算法提供更强的直觉基础。
第十一章,“数据泄漏”
什么是数据泄漏,如何识别并预防它?本章将展示如何做到。
第十二章,“模型产品化”
模型只有在达到生产阶段时才算好。幸运的是,这是一个被充分理解和结构化的问题,我展示了其中最关键的步骤。
第十三章,“机器学习中的故事讲述”
有一些很棒的技巧可以帮助你打开黑箱,并在机器学习故事讲述方面表现出色。
第十四章,“从预测到决策”
我们通过数据驱动和机器学习驱动的过程来提升我们的决策能力,从中创造价值。在这里,我向您展示了如何从预测到决策的例子。
第十五章,“增量性:数据科学的圣杯?”
因果关系在数据科学中已经有了一些动力,但仍然被认为是一个小众领域。在本章中,我将介绍基础知识,并提供一些可以在您的组织中直接应用的示例和代码。
第十六章,“A/B 测试”
A/B 测试是估算备选行动的增量性的典型示例。但是实验需要一定的统计学背景知识(以及业务知识)。
最后一章(第十七章)非常独特,因为它是唯一一章没有介绍任何技术。在这里,我推测随着生成式人工智能的出现,数据科学的未来将会发生根本性变化。主要观点是我预计这几年工作描述会发生根本性的变化,数据科学家应该为这种(革命)做好准备。
本书适用于各级别和资历的数据科学家。为了充分利用本书,最好您具备一些中高级机器学习算法的知识,因为我不会花时间介绍线性回归、分类与回归树,或集成学习者,例如随机森林或梯度提升机。
本书使用的约定
本书使用以下排版约定:
斜体
表示新术语、URL、电子邮件地址、文件名和文件扩展名。
等宽字体
用于程序清单,以及在段落内引用程序元素,例如变量或函数名称、数据库、数据类型、环境变量、语句和关键字。
提示
此元素表示提示或建议。
注意
此元素表示一般注释。
警告
此元素表示警告或注意。
使用代码示例
补充材料(代码示例、练习等)可在https://oreil.ly/dshp-repo下载。
如果您有技术问题或使用代码示例时遇到问题,请发送电子邮件至bookquestions@oreilly.com。
本书旨在帮助您完成工作。一般情况下,如果本书提供了示例代码,您可以在您的程序和文档中使用它。除非您正在复制代码的大部分内容,否则无需联系我们获得许可。例如,编写一个使用本书多个代码片段的程序不需要许可。销售或分发 O’Reilly 图书示例需要许可。通过引用本书回答问题并引用示例代码不需要许可。将本书大量示例代码整合到您产品的文档中需要许可。
我们欣赏您的感谢,但通常不需要署名。署名通常包括标题、作者、出版商和 ISBN。例如:“Data Science: The Hard Parts by Daniel Vaughan(O’Reilly)。版权所有 2024 Daniel Vaughan,978-1-098-14647-4。”
如果您觉得您使用的代码示例超出了公平使用范围或上述授权,请随时联系我们,邮箱地址为permissions@oreilly.com。
O’Reilly 在线学习
注意
超过 40 年来,O’Reilly Media为公司成功提供技术和商业培训、知识和洞见。
我们独特的专家和创新者网络通过书籍、文章以及我们的在线学习平台分享他们的知识和专业知识。O’Reilly 的在线学习平台为您提供按需访问的实时培训课程、深入的学习路径、交互式编码环境,以及来自 O’Reilly 和其他 200 多家出版商的大量文本和视频。欲了解更多信息,请访问https://oreilly.com。
如何联系我们
请将关于本书的评论和问题发送至出版商:
-
O’Reilly Media, Inc.
-
1005 Gravenstein Highway North
-
CA 95472,Sebastopol
-
800-889-8969(美国或加拿大)
-
707-829-7019(国际或本地)
-
707-829-0104(传真)
-
support@oreilly.com
我们为本书创建了一个网页,列出勘误、示例和任何额外信息。您可以访问https://oreil.ly/data-science-the-hard-parts。
欲了解我们的书籍和课程的新闻和信息,请访问https://oreilly.com。
在 LinkedIn 上找到我们:https://linkedin.com/company/oreilly-media
在 Twitter 上关注我们:https://twitter.com/oreillymedia
在 YouTube 上观看我们:https://youtube.com/oreillymedia
致谢
我在 Clip 内部的技术研讨会上介绍了本书涉及的许多主题。因此,我要感谢那支令人敬畏的数据团队,我有幸领导、指导和从中学习。他们的专业知识和经验对塑造本书的内容和形式起到了至关重要的作用。
我还要深深感谢我的编辑科尔宾·科林斯,他耐心地、亲切地校对了手稿,发现了错误和遗漏,并提出了极大地改善了书稿表现的建议。我还要诚挚地感谢乔纳森·欧文(制作编辑)和索尼娅·萨鲁巴(副编辑),他们敏锐的眼光和卓越的技能与奉献精神。他们的共同努力极大地提升了这本书的质量,我将永远感激不尽。
特别感谢技术审阅人员,在书中找出了错误和错别字,同时提出了改进表达方式的建议。特别感谢纳文·克里什纳拉杰、布雷特·霍利曼和钱德拉·舒克拉,他们提供了详细的反馈意见。虽然我们经常意见不合,但他们的建设性批评既让人谦卑,又增强了信心。不用说,书中剩余的错误全都是我的责任。
他们永远不会读到这些话,但我永远感激我的狗狗马蒂尔达和多明戈,它们无限的爱、欢笑、温柔和陪伴。
我也要感谢我的朋友和家人,他们给予我无条件的支持和鼓励。特别感谢克劳迪亚:当我反复讨论这些想法时,即使对你来说毫无意义,你那充满爱的耐心,无法用言语来形容。
最后,我要感谢无数数据科学研究者和从业者,他们的工作启发和丰富了我的创作。没有他们的奉献和贡献,这本书将无法存在,我很荣幸能成为这个充满活力的社区的一部分。
感谢大家的支持。
第一部分:数据分析技术
第一章:那又怎样?用数据科学创造价值
过去二十年来,数据科学(DS)已经取得了显著的增长,从最初只有硅谷顶尖科技公司才能负担得起的相对小众领域,发展到许多组织在许多行业和国家都使用的领域。尽管如此,许多团队仍然在为其公司创造可衡量的价值方面苦苦挣扎。
那么数据科学对一个组织的价值是什么?我发现各种资深数据科学家都在为这个问题苦苦挣扎,所以组织本身也难以理解。我在这第一章的目标是概述一些数据科学价值创造的基本原则。我相信理解和内化这些原则可以帮助你成为一名更好的数据科学家。
价值是什么?
公司存在是为了为股东、客户和员工(希望是整个社会)创造价值。股东自然期望获得与其他替代方案相比的投资回报。客户从产品的消费中获得价值,并期望这种价值至少与他们支付的价格相当。
原则上,所有团队和职能都应该以某种可衡量的方式为价值创造过程做出贡献,但在许多情况下,量化这一点显然并不容易。数据科学(DS)也不例外,存在这种缺乏可衡量性的问题。
在我的书籍《AI 与数据科学的分析技能》(O’Reilly)中,我介绍了这种通过数据创造价值的通用方法(Figure 1-1)。这个想法很简单:数据本身并不创造价值。价值来自于用数据做出的决策的质量。在第一层次上,你要描述公司的当前和过去状态。这通常是通过传统的商业智能(BI)工具如仪表板和报告来完成的。借助机器学习(ML),你可以对未来状态进行预测,并试图规避使决策过程变得更加困难的不确定性。如果你能自动化和优化决策过程的某些部分,那就达到了高峰。那本书就是要帮助从业者通过数据做出更好的决策,所以我这里不会重复。

图 1-1。用数据创造价值
尽管这种描述可能很直观,但我发现这种描绘过于一般化和抽象,无法被数据科学家在实践中使用,因此随着时间的推移,我将其转化为一个框架,在我介绍叙述主题(第七章)时也会很方便使用。
归根结底是同一原则:增量价值来自于改进组织决策能力。为此,你真的需要理解手头的业务问题(what),认真考虑杠杆作用(so what),并对此积极主动行动(now what)。
什么:理解业务
我总是说,数据科学家应该像他们的利益相关者一样了解业务。而所谓的“业务”,我指的是“一切”,从操作层面的事务,比如理解和提出新的指标(第二章)和影响这些指标的杠杆,到支撑业务的经济和心理因素(例如,是什么驱使消费者购买你的产品)。
对于数据科学家来说,听起来需要学习的内容很多,尤其是因为你需要不断更新自己对不断发展的技术工具包的知识。你真的需要这样做吗?难道你不能只专注于算法、技术堆栈和数据的技术(和有趣的)部分,让利益相关者专注于他们(不那么有趣的)部分吗?
我的第一个观点是,“业务是”有趣的!但即使你不觉得这很令人兴奋,如果数据科学家希望让真正的决策者听到他们的声音,那么必须获得他们的利益相关者的尊重是绝对必要的。
在继续之前,让我强调一点,数据科学家很少是业务战略和战术上的真正决策者:决策者是利益相关者,不管是市场营销、财务、产品、销售还是公司中的其他任何团队。
如何做到这一点?以下是我发现有用的事项清单:
参加非技术会议。
没有教科书会教你业务的细枝末节;你真的必须在那里并从组织中的集体知识中学习。
获得与决策者共事的机会。
确保你参加制定决策的会议。我在那些明确定义了领域隔离的组织中为我的团队提出的理由是,如果他们在场,这对每个人都是最有利的。例如,如果你不了解业务的复杂性,你怎么能为你的模型提出优秀的特征?
学习关键绩效指标(KPI)。
数据科学家比组织中其他人有一个优势:他们“拥有”数据,并被不断要求计算和呈现团队的关键指标。所以你必须学会关键指标。听起来很显而易见,但许多数据科学家认为这很无聊,因为他们并不拥有指标——从他们很可能不负责达到目标的意义上来说——他们很乐意将这些任务委托给他们的利益相关者。此外,数据科学家应该是指标设计的专家(第二章)。
对此保持好奇心并持开放态度。
数据科学家应该拥抱好奇心。我的意思是,不要害羞地提出问题,质疑组织中被接受的事实集合。有趣的是,我发现许多数据科学家缺乏这种全面的好奇心。好消息是,这是可以学会的。我会在本章末分享一些资源。
分权结构。
这可能不在你的控制范围之内(或者你的经理,或者你经理的经理),但是在数据科学嵌入到团队的公司允许业务专业化(以及信任和其他积极外部性)。分散的数据科学结构组织拥有来自不同背景的团队成员(数据科学家、业务分析师、工程师、产品等),并且擅长使每个人成为他们所熟悉的专家。相比之下,集中式组织,其中一群“专家”作为整个公司的顾问也有优势,但获得必要的业务专业知识却不是其中之一。
So What:数据科学中价值创造的要点
为什么你的项目对公司很重要?为什么任何人都应该关心你的分析或模型?更重要的是,它带来了哪些行动?这是本章讨论的核心问题,顺便说一句,我认为这是数据科学中那些决定职级的属性之一。在面试候选人时,经过技术方面的必要问题筛选后,我总是立刻进入so what部分。
我一再看到这个错误:数据科学家花大量时间运行他们的模型或分析,当到了做演示的时候,他们只是读取他们拥有的漂亮图表和数据可视化。真的是如此。
别误会,解释你的数据图表非常重要,因为利益相关者通常不是数据或数据可视化专家(尤其是对于更技术性的内容;当然,他们可以理解报告上的饼图)。但你不应止步于此。第七章将处理讲故事的实际问题,但我想提供一些关于如何培养这种技能的一般指导:
从一开始就考虑so what。
每当我决定启动一个新项目时,我总是从反向解决问题开始:决策者如何使用我的分析或模型的结果?他们有哪些杠杆?这是否可操作?在没有这些问题的答案之前,永远不要开始。
把它写下来。
一旦你弄清楚了so what,把它写下来是一个很好的实践。不要让它只在技术细节上起到次要作用。很多时候,你会深陷于技术琐事中而迷失方向。如果你把它写下来,so what将在绝望时充当你的北极星。
理解杠杆。
So what关乎可操作性。你关心的关键绩效指标通常不能直接行动,因此你或公司中的某人需要推动某些杠杆以影响这些指标(例如定价、营销活动、销售激励等)。你需要认真思考可能的行动方案。同时,也可以放手大胆地进行创新思维。
考虑你的观众。
他们是否关心你在预测模型中使用的复杂深度神经网络,还是关心他们如何利用你的模型来改进他们的指标?我猜想后者:如果你帮助他们成功,你也将成功。
现在怎么办:成为积极主动者
正如提到的,数据科学家通常不是决策者。数据科学家和他们的利益相关者之间存在共生关系:你需要他们将你的建议付诸实践,而他们需要你帮助改进业务。
我见过的最优秀的数据科学家是那些全面负责项目的积极主动者:他们确保每个团队都发挥自己的作用。他们发展必要的利益相关者管理和其他所谓的软技能,以确保这一切顺利进行。
不幸的是,许多数据科学家偏向于另一端。他们认为他们的工作只涉及技术部分。他们内化了应该避免的功能专业化。
提示
当产品经理不同意你的产品建议,或者当你的营销利益相关者认为你越界时,也不要害怕提出替代的沟通策略。
话虽如此,要谦虚。如果你没有专业知识,在进入现在怎么办的领域之前,我的最佳建议是回到什么步骤,成为一个专家。
价值衡量
你的目标是创造可衡量的价值。你怎么做到这一点?这里有一个更普遍适用的小窍门。
数据科学家通过X来影响度量* M ,希望它将改进当前的基准。你可以把M看作X*的函数:
让我们通过一个流失预测模型来实践这个原则:
X
流失预测模型
M
流失率,即在期t−1 中活跃用户中在期t中不活跃的百分比
基准
分割策略
注意,M 不是 X 的函数!即使没有预测模型,流失率也是相同的。只有当你对模型的输出做出改变时,度量指标才会改变。你看到价值是如何从行动中获得的,而不是从数据或模型中获得的吗?因此,让我们调整原则,以确保行动(A)影响度量指标:
你可以使用哪些杠杆?在典型情况下,你可以推出一个保留活动,只针对下个月可能变得不活跃的用户。例如,你可以提供折扣或推出沟通活动。
让我们也应用什么、为什么和现在怎么办的框架:
什么
在你的公司中如何衡量流失?这是最佳的衡量方式吗?拥有度量标准的团队在减少流失率(基准)方面做了什么?为什么用户变得不活跃?是什么导致了流失?对损益的影响如何?
那么
概率分数将如何使用?你能帮助他们找到可供测试的替代杠杆吗?有折扣可用吗?忠诚计划呢?
现在是什么
公司决策和运营过程中,你需要从任何参与者那里获取什么?你需要法律或财务部门的批准吗?产品团队对建议的变更满意吗?广告活动何时上线?市场团队准备好推出吗?
让我强调为什么和现在怎么办部分的重要性。你可能拥有一款预测能力强且希望可解释的优秀 ML 模型。但是,如果实际决策者采取的行动不能影响指标,你团队的价值将为零(为什么)。在积极的方法中,你实际上帮助他们提出替代方案(这是什么的重要性和成为问题专家的重要性)。但你需要确保这一点(现在怎么办)。使用我的标记,你必须拥有 ,而不仅仅是 。
一旦你量化了模型的增量效应,就是时候将其转化为价值了。有些团队乐意声明客户流失减少了一些并停止在那里。但即使在这些情况下,我发现提出一个具体的金额也很有用。如果你能展示你的团队为公司带来了多少增量价值,获得更多资源将更容易。
在例子中,可以通过几种方式来完成。最简单的一种是直接描述价值。
假设每月每位用户的平均收入是 R ,公司有活跃用户的基础 B :
如果你有 100 名用户,每名用户每月带来 7 美元,月流失率为 10%,公司每月损失 70 美元。
增量货币价值是有模型与无模型的成本差异。经过排除共同术语后,你得到:
如果之前使用的分割策略每月节省 70 美元,而现在专注的 ML 模型创造了 90 美元的节省,那么对于组织来说的增量价值就是 20 美元。
更复杂的方法还包括其他产生价值的变更,例如假阳性和假阴性的成本:
假阳性
通常会针对那些使用成本高昂的杠杆的用户,但其中一些本来就不会流失。你可以衡量这些杠杆的成本。例如,如果你给 100 名用户价格 P 打 9 折,但其中只有 95 名实际会流失,那么你在假阳性方面损失了 。
假阴性
由于糟糕预测带来的机会成本是那些最终流失但未被基线方法检测到的用户的收入。这些成本可以用我们刚刚讨论过的方程式来计算。
主要收获
我现在将总结本章的主要信息:
公司的存在是为了创造价值。因此,团队应该创造价值。
如果一个数据科学团队不能创造价值,对于公司来说就是一种奢侈。数据科学的炒作给你带来了一些余地,但要生存下去,你需要确保数据科学对公司的商业案例是正面的。
通过做出决策来创造价值。
数据科学的价值来自于通过你所熟知和热爱的数据驱动、证据支持的工具包,改进公司的决策能力。
价值创造的核心是“那又怎样”。
如果你的模型或分析无法产生可操作的见解,那么一开始就停下来。认真考虑杠杆,并成为业务的专家。
发展你的软技能。
一旦你有了你的模型或分析,并且已经提出可操作的建议,现在是确保全面交付的时候了。利益相关者管理至关重要,但受欢迎也很重要。如果你对自己的业务了如指掌,不要害羞于提出建议。
进一步阅读
我在我的书 《AI 和数据科学的分析技能》(O’Reilly 出版)中涉及了几个这样的主题。查看学习如何提出业务问题和找到解决业务问题的良好杠杆的章节。
在学习好奇心方面,请记住你天生好奇。孩子们总是在提问,但随着他们长大,他们忘记了这一点。这可能是因为他们变得自我意识或害怕被视为无知。你需要克服这些心理障碍。你可以阅读 《更美丽的问题:探究问题的力量引发突破性思维》(Waren Berger 著,Bloomsbury),或理查德·费曼的几本书(试试《The Pleasure of Finding Things Out》[Basic Books])。
在发展必要的社交和沟通技能方面,有很多资源和很多事情可以继续学习。我发现 《精英的生存法则:高诚信政治策略促进职业和公司成功》(Rick Brandon 和 Marty Seldman 合著,Free Press)对于以非常实用的方式处理公司政治非常有用。
《极限所有权:海豹突击队如何领导和取胜》(Jocko Willink 和 Leif Babin 合著,St. Martin's Press)认为优秀的领导者行使全面(极限)所有权。
《永不分手:如何进行有效的谈判》(Chris Voss 和 Tahl Raz 合著,Harper Business)非常适合发展必要的谈判技巧,经典且经常被引用的 《如何赢得朋友和影响人》(Dale Carnegie 著,Pocket Books)应该会帮助你发展一些对成功至关重要的“软”技能。
第二章:指标设计
让我提出,优秀的数据科学家也是优秀的指标设计师。什么是指标设计?简单地说,它是发现具有良好属性的指标的艺术和科学。我将很快讨论一些这些理想属性,但首先让我为为什么数据科学家应该擅长此项技能做出解释。
简单的答案是:因为如果不是我们,那么是谁?理想情况下,组织中的每个人都应该擅长指标设计。但数据从业者最适合这项任务。数据科学家一直在处理指标:他们计算、报告、分析,并且希望优化它们。以 A/B 测试为例:每个好测试的起点是拥有正确的输出指标。类似的理由也适用于机器学习(ML):获取正确的预测结果指标至关重要。
指标应具备的理想属性
公司为什么需要指标?正如在第一章中所讨论的那样,良好的指标在于推动行动。有了这个成功标准,让我们逆向工程这个问题,并识别成功所需的必要条件。
可测量的
指标从定义上来说是可以衡量的。不幸的是,许多指标是不完美的,学会识别它们的缺陷将使你受益匪浅。所谓的代理指标通常与期望的结果相关,你需要理解与它们一起工作的利弊。¹
一个简单的例子是意图性。假设你想了解早期流失(新用户的流失)的驱动因素。其中一些人实际上并不打算使用产品,只是试用了一下。因此,测量意图性会极大地改进你的预测模型。意图性实际上是无法衡量的,因此你需要找到替代指标,比如在了解该应用程序后开始使用之间的时间间隔。我认为,你开始使用得越快,你的意图就越强烈。
另一个例子是成长从业者使用的习惯概念。应用程序的用户通常完成入门,试用产品(啊哈!时刻),并希望形成习惯。什么是用户达到这一阶段的良好证据?一个常见的替代指标是用户首次尝试后X天内的互动次数。对我来说,习惯就是重复,这对每个用户来说意味着什么。在这种情况下,替代指标最多只是重复的一个早期指标。
可操作的
为了推动决策,指标必须是可操作的。不幸的是,许多顶层指标并不能直接操作。想想收入:它依赖于用户购买产品,这是无法强制的。但是,如果你将指标分解为子指标,可能会出现一些有效的杠杆,我将在例子中展示。
相关性
这个度量对手头的问题有信息性吗?我称这种属性为相关性,因为它强调了一个度量只有在与特定业务问题相关时才是好的。我可以使用信息性,但所有的度量都是某事的信息。相关性是为正确的问题选择正确度量的属性。
及时性
好的度量在需要时推动行动。如果我发现自己有晚期癌症,我的医生无法做太多事情。但如果我定期检查,他们可能会发现早期症状,从而打开治疗的选择菜单。
用户流失是另一个例子。通常使用一个月的不活跃窗口进行测量和报告:一个月活跃、下一个月不活跃的用户比例。不幸的是,这个度量可能会产生误报:一些用户只是休息,并没有流失。
获得更强大的度量的一种方法是将不活跃窗口从一个月增加到三个月。时间窗口越长,用户只是休息的可能性就越小。但是,新的度量在及时性方面已经降低:您现在必须等待三个月才能标记一个流失客户,可能为时已晚启动保留活动。
Metrics Decomposition
通过分解度量,您可以改进其中任何一个属性。现在我将详细介绍几个技巧,这些技巧将帮助您实现这一目标。
漏斗分析
漏斗是一系列按顺序进行的操作。例如,在前述习惯示例中,用户首先需要设置他们的账户,尝试产品,并定期使用它。每当您有漏斗时,您可以使用一个简单的技巧找到子度量。让我先在抽象中展示这个技巧,然后提供一些简明的例子。
图 2-1 显示了一个典型的漏斗:它是从入口点E到输出M的一系列阶段(滥用符号;这些符号也表示相应的度量)。我的目标是改进M。内部阶段表示为,每个阶段提供一个相应索引的度量。

图 2-1. 一个典型的漏斗
分解的工作原理如下:您从右向左移动,乘以当前子度量,然后除以前一个子度量。为了确保您永远不会失去相等,最后乘以漏斗开头的度量(E)。请注意,在取消公共术语后,最终结果是,确保这确实是原始度量的分解。
每个分数可以解释为转化率,即在前一阶段可用单位中到达当前阶段的百分比。通常其中一个或所有这些子指标比原始指标 M 更具有优越性质。现在您了解了这一技术,是时候付诸实践了。
典型的销售漏斗就是这样工作的。我的目标是增加销售,但这需要几个步骤。这里我将漏斗简化一下:
-
潜在客户生成( :潜在客户数量)
-
第一次接触( :第一次接触的次数)
-
第二次接触( :第二次接触的次数)
-
提出报价( :提出的报价数量)
-
完成销售( :销售数量)
分解如下:
要增加销售数量,您可以增加潜在客户的数量,或者增加各个阶段之间的转化率。有些行动与数据科学家相关(例如,提高潜在客户的质量),而其他行动则与销售团队相关(例如,是否有足够的第一次接触;如果没有,公司可能需要增加销售人员规模或雇佣不同的人)。也许他们应该改变谈判或定价策略以提高报价至销售的比率。甚至改进产品!您可以拥有最佳的潜在客户或最佳的销售团队,但仍然缺乏产品市场契合度。
存量流动分解
存量-流动分解 在您关心的累积度量时非常有用。让我们首先定义这些概念:存量变量是在特定时间累积的变量。流动变量不积累,而是在一段时间内测量的。一个有用的类比是浴缸:在时间 t 的水量等于时间 t - 1 的水量,加上这两个时刻之间通过水龙头流入的水量,减去通过排水口流出的水量。
最常见的情况是当您希望理解月活跃用户(MAU)。首先我将解释分解,然后再进行评论:
如果目标是增加公司的MAU,您可以增加客户获取或减少流失。新用户和复苏用户可能会成为传入用户,至少提供一个新的杠杆。
类似的分解也适用于任何存量变量(如银行账户中的余额)。
P×Q 型分解
另一个常见情况是试图提高收入。这里的技巧是通过一个合理的度量标准进行乘法和除法运算,以得出最容易利用的子指标:
这表明如何将收入分解为单位(平均)价格和销售量的乘积: 。要增加收入,你可以增加价格或销售量。有趣的是,销售量与价格呈负相关,因此这种关系是非线性的,使其成为收入优化的首选工具。
例如:另一种收入分解
从收入由活跃用户生成的事实出发,你可以尝试类似的分解,对某些问题和杠杆选择可能非常有价值:
我刚刚将收入表达为平均用户收入(ARPU)和活跃用户的函数。如果我想找到更多的杠杆,我可以插入 MAU 库存方程。同样,我也可以插入 分解来扩展列表。
例如:市场
以市场为例,考虑一个两边平台,匹配买家(B)和卖家(S)。想象亚马逊、eBay、Uber、Airbnb 等。
让我们考虑一个简化的漏斗:
根据这一解释,公司首先吸引开始列出物品并最终被购买的卖家。你的目标是增加购买。
使用漏斗逻辑,这翻译成(大写字母表示每一步中的对应指标):
要包括市场的另一侧,让我们应用之前讨论过的另一个技巧,使总浏览商品数等于买家数量乘以每位买家的平均浏览次数:
经过一些调整后,我得出:
结果表明,要增加购买,你可以选择以下之一:
-
提高结账效率( )
-
增加买家的参与度( )
-
增加卖家的参与度( )
-
增加买家或卖家的数量
为了确保平等保持,我有一个额外项,缺乏明显解释( )。我并不真正关心这个额外项,因为现在我有五个可以在不同方面利用的子指标。
关键要点
这些是本章的关键要点:
你需要好的指标来推动行动。
如果你的目标是找到能推动行动的杠杆,指标设计至关重要。我已经反向工程化这个问题,以得出一些指标设计的理想特性。
优良指标应具备的理想特性。
一个好的指标必须是可衡量的、可操作的、相关的和及时的。
将指标分解为子指标可帮助改善这些特性。
漏斗型分解易于使用,一旦您习惯了它们,您就会在各处看到漏斗。
一个简单的技巧是通过一个度量来乘以和除以一个度量,这可以带你走得很远。但选择这个度量远非明显,并且您需要对业务有很好的了解才能找到它。
度量设计是一个迭代过程。
从不完美的度量开始是可以的,但如果将其作为一个不断迭代的过程,那就更好了。
进一步阅读
如果您想了解一些补充信息,可以查阅我的书籍《AI 与数据科学的分析技能》,但本章节更全面地介绍了实际使用的技术。在那本书中,我还展示了如何使用分解进行收入优化。
《Hacking Growth: How Today’s Fastest-Growing Companies Drive Breakout Success》(Sean Ellis and Morgan Brown Currency)中可以找到关于增长爱好者的度量设计讨论。
虽然不是关于度量设计的书籍,而是关于 OKR 的,《衡量什么重要》(John Doerr出版社)绝对值得一读。我已经运用这里提出的技术找到了可以由特定团队具体针对的子度量。据我所知,从数据科学的角度来看,没有其他关于这些主题的出版资源。
¹ 例如,在线性回归中,特征的测量误差会导致参数估计的统计偏差。
² 如果浏览是从列出的项目集合中随机生成的,您可以给额外的项一个概率解释。但这实际上违背了分解的目的。
第三章:增长分解:理解顺风和逆风
第二章 描述了一些技术,以找到能够推动行动的更好指标。本章涉及一个完全不同的主题:如何分解指标以理解指标变化的原因。在公司行话中,这些变化通常与顺风或逆风有关,即对公司状态产生积极或消极影响的因素。
为什么要进行增长分解?
数据科学家经常被要求帮助理解指标变化的根本原因。为什么收入季度同比增长(QoQ)或月同比增长(MoM)?依我的经验,这些问题非常难以回答,不仅因为可能同时发生许多事情,而且因为一些潜在原因并不直接可测量或提供足够的变化来提供信息。¹ 典型的例子包括经济状况、监管环境以及竞争对手的决策。
尽管如此,我发现当结合以下技术时,可以利用其他来源的变化来提供一些线索。
加法分解
正如其名称所示,当你希望理解的指标(输出)可以表示为其他指标(输入)之和时,这种分解方法非常方便。在两个输入的情况下,可以表示为 。请注意,我使用了时间下标。
该分解表示从 到 的输出增长( )是输入增长率的加权平均:
其中权重总和为一, 。
重要的是,权重是每个输入在上一个周期中的相对重要性。因此,在t-1中占较大份额的输入将被赋予更高的权重。
例子
在数据仓库中,加法设置非常常见,其中包括事实表和维度表。我发现语法类比有助于区分二者:事实反映动作或动词,而维度则是描述动作的副词。事实表通常存储与公司相关的度量标准,而维度表则存储帮助你理解度量标准的维度。
这是生成所需数据集的典型 SQL 查询:
SELECT DATE_TRUNC('MONTH', ft.fact_timestamp) AS month,
dt.dimension1 AS dim_values,
SUM(ft.my_metric) AS monthly_metric
FROM my_fact_table ft
LEFT JOIN my_dim_table dt ON ft.primary_key = dt.primary_key
GROUP BY 1,2
ORDER BY 1,2
例如,可能的指标是顾客购买量,你想按地理区域展开。由于总销售额必须是各个区域销售额的总和,这种分解方法非常方便。它将帮助你了解某个或多个区域的增长率是否是国家级加速或减速的主要驱动因素。
注意
示例查询突显了如何轻松创建一个分组表,使用不同维度拆分指标。整个过程如下:
-
创建一个定期更新不同维度的聚合表的管道。
-
编写一个脚本,计算一个维度的分解并将结果输出为表格(参见GitHub 仓库)。
-
使用该脚本循环遍历所有维度。
-
最终结果是一个包含所有变化来源的表格。
此时,你需要了解业务知识以识别变化中的模式。这通常是最困难的部分,需要对业务有广泛的了解。
解释和用例
如前所述,通过加法分解,输出的增长率等于输入的增长率的加权平均值。尽管如此,我更倾向于思考每个段或维度值的增长贡献,其中每个贡献等于滞后权重与相应增长率的乘积。
当你同时拥有多个可以同时使用且可以共同提供有关潜在因素提示的维度时,分解特别有用。
回到销售例子,你可以应用分解方法使用地理区域、店铺附近的社会经济地位(SES)以及某种类型的顾客分段(例如,按照在职年限)。
结论可能类似于:国家销售额月降低了 7 个百分点(pp),主要原因是:
-
西南地区月减速率为 14 个百分点。
-
高 SES 地区的店铺减速得更快。
-
减速在各个在职年限中相对均匀。
正如之前提醒过的,要注意实际上并没有找到根本原因;最多只有足够的线索可以解释变化的驱动因素。西南地区经济是否正在减速?这些店铺的定价有变化吗?高 SES 顾客的客户满意度如何?
图 3-1 显示了一个模拟示例的瀑布图,展示了各个地区对国家水平下降的贡献。在这种情况下,主要是由于西北地区的强烈减速(降低了 5.8 个百分点),导致全国水平下降了 4.6%。西南和西部地区也有所减速,而南部则有一个强劲的季度。

图 3-1. 区域对增长的贡献
乘法分解
乘法分解 在输出指标可以表示为两个或多个输入的乘积时起作用。第二章展示了这些在许多设置中是如何自然产生的,例如在情况下。
分解表明,每当 ,那么:
简而言之,输出的增长率等于增长率的总和 和 一个组合效应。
例子
让我们使用来自第二章的收入分解,看看这些是用户平均收入(ARPU)和月活跃用户(MAU)的乘积:
如果收入增长,可能是因为 ARPU 加速,MAU 增加,或者两者都朝着同一个方向变化。更重要的是,通过分解,你实际上可以量化每一个。
图 3-2 显示了一个模拟 ARPU 示例的分解可能可视化。在这种情况下,MoM 增长的主要驱动因素是用户平均收入的显著加速(贡献了约 31 个百分点或大约总收入增长的 96%)。请注意,组合效应非常小,因为它是输入增长率的乘积。许多时候,如果确实可以忽略不计,你可以直接去掉它。²

图 3-2. ARPU 的乘法分解
解释
在乘法设置中,输出的增长是输入增长的总和加上一个组合效应。当有超过两个输入时,这仍然成立,但你需要添加组合效应的总和。
混合比率分解
混合比率分解 从加法和乘法分解中各取一些。假设你的输出指标是其他指标的加权平均:
其中最后一个等式只是将总和表达为相应向量的点或内积(粗体表示)。
让我详细说明分解,然后解释这些术语:
其中:
输出指标的第一差分。我发现保持一切都是差分——而不是增长率——通常就足够了,而且大大简化了符号。
如果权重保持在初始值不变,只有输入改变,输出会发生什么变化?符号表明只允许输入(上标)改变输出(下标)。
如果输入保持在初始值不变,只有权重改变,输出会发生什么变化?
这是权重和输入变化的内积。
当我开始考虑这种分解时,我从第二和第三点的直觉开始,这些点是反事实的(即,你无法观察它们),对于讲故事目的非常有用。数学上讲不通,所以我不得不进行推导。我曾将此展示给利益相关者,他们称其为mix-rate;看起来这个术语在一段时间内曾被使用过,但在搜索网络后我没能找到太多相关信息,所以我对其起源或用法并不确定。不过这个术语很合适,因为存在两种潜在的变化来源:
-
权重(mix)的变化
-
输入(rate)的变化
例子
加权平均数随处可见。想想这个:你有一个度量和客户段。直觉上认为,该度量将是各段度量的加权平均值。对于比率度量,这种情况总是成立。让我们以两个段的每用户平均收入为例来试试:
注意,权重是每段月活跃用户在该期间的相对份额。通常情况下,权重必须加起来等于一。
图 3-3 展示了 ARPU 示例的模拟数据集的一种可能的可视化分解(包含三个段)。如果份额没有任何变化,ARPU 会增加$3.2(rate);同样,如果每个段的 ARPU 没有任何变化,每用户平均收入将减少$1.6(mix)。

图 3-3. mix-rate 分解示例
解释
解释很简单:度量的变化等于分解部分的总和(即,在初始值下固定一个组件并允许另一个组件变化)以及两者变化的联合效果。
如前所述,我发现第一部分对讲故事目的非常有吸引力,因为你实际上在模拟如果只有权重或费率发生变化会发生什么。
数学推导
让我们深入数学;理解推导对于编码至关重要。我发现自己因为没有使用正确的权重或者时间下标错误而调试函数。
在接下来的内容中,我将简化为仅假设两个加法项(加法)、乘法项(乘法)或段(mix-rate)。可以很容易地检查这些是否推广到更多的输入或段(但你需要小心,如你可以在代码repo中看到的)。
此外,我将的增长率表示为,其中是的首次差异。
加法分解
由于是加法的:
现在让我们首先进行差异运算以获得:
最后,为了获得增长率:
或
乘法分解
由于是乘法的:
对输出进行首次差异,并添加和减去额外项(帮助因子化额外项):
要获得增长率,你只需要稍微小心,并记住所有时间段的输出都是乘法的:
请注意,如果您有超过两个输入,则需要总结所有产品的组合。
混合速率分解
请注意,对于混合速率情况,输出度量可以表示为段的度量的加权平均值:
其中权重加起来为一,粗体字母表示向量。
在这种情况下,我会反向操作,并展示经过一些简化后你将得到原始表达式。这不是最优雅的方式,但我宁愿这样做,而不是添加和减去你不知道其来历的项。
关键要点
这些是本章的关键要点:
寻找时间变化的根本原因通常非常困难。
你需要足够的驱动变化来估计影响。
增长分解对于获取有关潜在根本原因的提示非常有用。
通过利用这些额外的变化源(来自其他输入度量),你能够假设是什么驱动了变化。我展示了三种可能适用于你所面临问题的分解方法:加法、乘法和混合速率。
进一步阅读
就我所知,关于这个问题的已发表文献不多。我印象中,这些知识是在公司数据团队和文化中共享的,但从未传播到更广泛的公众中。我在以前的工作中了解了加法分解,并根据需要推导出了其他两种方法。
数学相对简单,所以没有必要进一步发展。如果你仍然感兴趣,我使用的方法可以在任何关于离散微积分的入门书籍或讲义中找到。
¹ 在第十章中,我讨论了为什么你需要输入变化来解释输出指标的变化。
² 如果你使用对数变换,可以使用泰勒展开得到同样的结果,即产品的增长率只是输入增长率的总和。
第四章:2×2 设计
几年前,当我刚开始我的数据科学职业生涯时,一家咨询公司来到办公室,开始勾勒我们业务的这些极度简化的视图。我当时的第一反应是把这些草图当作他们推销的把戏。今天,我接受它们作为沟通和讲故事的工具,以及简化复杂业务的有用辅助工具。
我相信在数据科学(DS)中的自然增长路径是从过度复杂到智能简化。所谓智能,我指的是爱因斯坦在说“应该尽可能地简单,但不要过于简单”时所表达的内容。这句话的美妙之处在于它显示了实现这一目标的难度。在本章中,我将提出使用一种旨在简化复杂世界的工具的理由。
简化的理由
你可能会觉得讽刺的是,在大数据、计算能力和复杂预测算法时代,我提出了简化的理由。这些工具使你能够处理日益增长的数据量,因此无疑提高了数据科学家的生产力,但它们并没有真正简化世界或业务。
让我们停顿一下这个最后的想法:如果更多数据意味着更多复杂性,那么数据科学家现在肯定能够理解更多复杂性。然而,你能够将高维数据投影到低维分数上,并不意味着你对事物如何运作有更好的理解。
有许多情况可以证明简化的必要性,从审美到更功能和实用的层面。对于数据科学家来说,简化有助于他们在开始项目时理解和框架化最重要的内容。此外,它是一个很好的沟通工具。正如理查德·费曼所说,“如果你不能用简单的语言解释某事,那么你就不理解它。”在技术方面,很常见应用奥卡姆剃刀原理来选择具有给定预测性能的最简单模型。
什么是 2×2 设计?
图 4-1 展示了一个典型的设计。正如这个词所示,你在决定集中注意力的特征时起着积极作用,这些特征当然因用例而异。

图 4-1。一个典型的 2×2 设计
请注意,我通过只集中关注我认为对手头任务重要的两个因子或特征来简化世界。因子 1 和因子 2 在水平和垂直轴上变化。此外,我通过设置一些由虚线表示的阈值水平来离散化可能连续的世界,将世界划分为四个象限:
A
高因子 1 和因子 2 的用户
B
低因子 1 和高因子 2 的用户
C
低因子 1 和因子 2 的用户
D
高因子 1 和低因子 2 的用户
根据使用情况,我可以调整这些阈值。
在实验设计中,这些因素通常对应于测试中的不同处理,例如横幅中使用的颜色和消息,或价格和通信频率。第一个例子涉及离散因素,后者涉及连续特征。不用说,使用离散因素时,您会失去图表中显式顺序的意义。
理想情况下,其他相关因素应保持不变。这一更一般的科学原则使您能够单独研究这两个因素对感兴趣的指标的影响。在第十章中,我将回到这种推理线路,但现在请注意,这种分部对于简化世界至关重要:一次只改变一个因素,其他一切保持不变,您可以获得一些对每个因素作用的洞见。
在统计 2×2 设计中,这种分部由使用适当的随机化方案来保证,该方案使得每个处理和对照组的参与者在平均上事前相等。这种略显晦涩的表达意味着在测试之前,治疗组和对照组的差异不会太大。
统计从业者熟知这些设计,并且通常在学习方差分析(ANOVA)时讨论此主题。这里的目标是查看结果指标在组之间的平均差异。处理通常是离散的,但设计通过方便地设定阈值允许连续处理。
这种设置也可用于非实验场景。咨询公司常用的典型示例是仅使用可能是行为的两个特征来分割客户群体。当我可以将一个指标分解为乘法方式(如在第二章中看到的分解)时,我通常会使用它。
例如,考虑单位价格和交易性。象限 A 代表愿意支付高单位价格并且频繁交易的客户(产生高用户平均收入)。请注意,这里我无法保证其他一切保持不变,就像实验设置中那样。尽管如此,它仍然允许我专注于,只关注我关心的两个特征。
现在我将展示一些例子。
例如:测试一个模型和一个新特征。
当我想同时测试新模型和杠杆效果的典型情况下,我使用 2×2 框架。测试杠杆通常不使用此框架,只需两个随机组:一个接收基准(对照组),另一个得到新杠杆(治疗组)。实验结束后,我对均值差异运行典型的统计检验套件。 2×2 设计扩展了这个想法,允许您同时测试模型的性能。
图 4-2 展示了 2×2 设计。在水平轴上是概率分数(例如,来自分类模型),垂直轴显示你是否已经打开或关闭考虑测试的杠杆:杠杆 on 意味着你向某些用户展示新的替代方案,而 off 意味着基准杠杆仍然有效。

图 4-2。2×2 模型和杠杆测试
注意这里如何使用 2×2 设计:你将那些在图表中 A 和 B 组的用户视为测试对象,而对照组由 C 和 D 组成。在两个维度的变化中,可以对杠杆和模型进行一些测试。
要真正感受设计带来的好处,想象一下你想要进行一个交叉销售活动。为此,你训练了一个 ML 分类模型,该模型预测谁会接受提议。如果模型具有预测性,高概率分数应该具有较高的真正阳性率。
想要通过一个新的沟通活动来测试它,该活动突显购买新产品的好处(“使用智能手表上新心率监测功能的客户,其跑步表现提高了 15%”)。假设基准活动仅提供新功能的信息(“我们的新智能手表包含专为跑步者设计的最先进监测功能”)。成功的度量标准是转化率(CR),即 。
要测试的假设如下:
单调性
更高的概率分数具有更高的转化率: 和
效果
新沟通杠杆比基准更有效: 和
我期待 是因为一些用户有机会购买产品,而不需要显示沟通。如果模型具有预测性(在真正的阳性意义上),那么转化率也应该随得分增加而增加。
类似地,我预计 ,因为我在针对模型中购买可能性较低的用户。的确,出色的沟通活动可能会转化一些这些意图低的用户,但我不认为沟通杠杆的影响会在统计上显著。
要设置实验,您必须考虑统计大小和功效,其中样本量和最小可检测效应至关重要。通常情况下,您的样本量不够大,因此一个选择是为杠杆设计一个良好的实验设计(如经典的 A/B 测试框架),以及一个对模型而言次优的设计。在这种情况下,您可能只有模型性能的一些初步证据。在大多数情况下,我发现这已经足够了,但如果可以两者都有一个良好的设计,那就请尽量这样做。实验运行后,您可以测试这些假设,并获得一些关于模型在实际情况下表现和杠杆影响的证据。
例如:理解用户行为
我开始讨论 2×2 统计 设计,因为随机化的力量,你可以控制其他可能影响感兴趣指标的因素。其他 2×2 框架的使用情况通常缺乏这个非常好的特性。尽管如此,正如我希望这个例子展示的那样,它仍然可能是有用的。
不久前,我决定建立一个 2×2 框架来了解特定产品的产品市场适配度。为此,我选择了两个对适配至关重要的因素,并专注于象限 A,以区分那些在两个因素上表现出色的用户。然后,我建立了一个机器学习分类模型,其中象限 A 中的用户标记为一,其他所有用户标记为零。目标是理解这些用户是谁。在 第十三章 中,我将展示如何在实践中实现这一点,而不使用 2×2 框架。
在那个特定的用例中,我使用了客户参与度和单位价格。A 组由高度参与并愿意支付高票价的用户组成。参与度通常是产品市场适配性的良好代理,因此将其与收入的代理结合使用给了我可能被称为盈利适配的东西。
让我举一个应用相同逻辑的例子。回想一下,客户生命周期价值(LTV)是用户与公司终身关系的现值:
这里, 是时间 t 的收入, 是从 t–1 到 t 存活的概率, 是折现率。有时,您可以使用考虑了某种形式成本的利润指标而不是收入,但在许多公司,特别是初创公司中,通常使用收入指标来计算 LTV 与客户获取成本(CAC)的比率(¹)。
正如您所见,LTV 可以表示为(折现的)收入和存活概率流的内积。假设您想了解哪些用户具有较高的 LTV。他们是谁?是什么让他们如此特别?最重要的是,是否有办法将一些用户移动到最高的 LTV 桶中?
图 4-3 显示了已经熟悉的设置。在水平轴上,我有一个代表存活概率的代理,垂直轴上是收入。由于 LTV 是不同时间段流的内积,您需要找到使这两者变成一维的方法。有几种方法可以做到这一点,但每种方法都有其自身的问题。

图 4-3. 2×2 框架中的 LTV
现在先不要考虑这些细节,您可以像我在前面的例子中那样继续进行:
-
将 A 组中的用户标记为 1,其余人标记为 0,并训练一个预测成为 A 象限用户的分类模型。
-
打开黑箱并尝试了解那些可能高概率处于 A 象限中的用户的一些信息(使用在第十三章中提出的方法)。
-
对完整用户群进行评分,并使用某个阈值分数,您可以计算产品的机会规模。
从时间流到两个维度至少有两种方法:
聚合。
最简单的方法是使用平均或中位数存活率和收入的聚合统计数据。请注意,使用总和进行聚合可能会使收入较少的新群体处于不利地位(例如,一个交易了 20 个月的用户可以产生比新用户多 20 倍的收入)。
选择任意时期。
如果您发现过去的前六个月对于生存(或收入)至关重要,您可以简单地设置并在那个时间点使用相应的值。
例如:信用起源和接受
一个略有不同的例子是相关结果的情况。以信用产品(如信用卡)为例。这些产品有些问题,因为由于逆向选择(更风险的用户更有可能接受昂贵的贷款提供),因此有些问题。
图 4-4 显示了一个比较典型的情景。逆向选择导致正相关,因此更有可能接受贷款提议的用户也更有可能违约(A)。
2×2 设计简化了决策过程:你应该针对哪些客户?
提供在 B 象限中。
这些客户更有可能接受贷款并偿还贷款。这是最安全的选择。
调整门槛以获得更多的量。
你还可以调整违约的低风险或高风险的门槛定义。如果规模至关重要,这可能帮助你找到更多的量。信用发起人通常会根据他们的风险偏好进行这种类型的校准。2×2 设计让你专注于一个杠杆(风险门槛)。

图 4-4. 2×2 贷款起源示例
示例:优化你的工作流程
顾问经常使用的最后一个例子应该帮助你优先考虑项目。在这里,使用的两个维度是项目对公司的价值以及完成它所需的努力。
这个想法是,你应该根据这两个维度对竞争项目进行排序。在图 4-5 中,你可以看到,项目 x 和 y 在价值上几乎一样好,但由于完成所需的时间要短得多,因此更倾向于选择 x。类似地,排名活动 y 和 z 相对容易,因为两者需要的努力相当,但前者创造的价值显著更多。总的来说,左上象限是你希望大部分项目存在的地方。
尽管这种 2×2 视图可能非常丰富,但它也有其局限性。例如,你如何比较项目 x 和 z?在第五章中,我介绍了一种更普遍的替代方案,可以用来比较和排名任何一组项目。

图 4-5. 努力的优先级
关键要点
这些是本章的关键要点:
简化的案例
尽管你掌握的数据量有多少,但如果目标是改善对复杂世界和业务的理解,简化世界是必要的。此外,它有助于将技术结果传达给利益相关者,并允许你专注于显然是一级重要性的事务。
2×2 图表
这些工具将高维空间简化为二维图,允许你专注于对手头问题最相关的特征或因素。
应用案例 1:测试一个模型和一个杠杆
2×2 统计设计是一个常见的用例。例如,当您希望同时测试杠杆的有效性和 ML 模型的预测性能时,就是这样一个例子。您可以获得可以通过正式统计测试过程的明确假设。随机化保证其他所有事情平均保持不变。
用例 2:了解您的客户
通过挑选出两个具体特征,您可以将这个框架作为更复杂方法的起点。本章描述了如何使用这个框架来理解哪些用户具有较高的 LTV。
用例 3:相关特征
当特征相关时,2×2 框架允许您简化决策过程。我使用的例子是贷款发放,在这里,接受报价取决于违约概率,因为由于逆向选择的原因。
进一步阅读
在我的书 Analytical Skills for AI and Data Science 中,我认为学习简化是数据科学家的一项重要技能。讨论比本章更加一般化,并且我没有涵盖 2×2 设计。我还讨论了 LTV 和 A/B 测试的设计。
简易法则 由约翰·梅达(MIT 出版社)从设计师的角度探讨了如何实现简单。虽然听起来可能不相关,但我发现这种有些正交的观点总是加深了我对问题的理解。
2×2 统计设计可以在大多数涵盖 ANOVA 的统计教材中找到。Statistical Methods in Online A/B Testing: Statistics for Data-Driven Business Decisions and Risk Management in E-Commerce 由 Georgi Zdravkov Georgiev(独立出版)对使用多个变体进行测试及其他相关主题进行了良好的讨论。
在贷款发放示例中使用的逆向选择类型在任何讨论信息不对称的微观经济学教科书中都有涵盖。如果您没有经济背景,则技术上的细枝末节可能会有些超前。在我看来,记住的重要部分是用户通过决策者不知道的关于自己的信息进行自我选择,这造成了很多问题。
¹ 一些公司还报告“未打折”的 LTV,因此这个表达式简化为分子上的各项。
第五章:构建业务案例
学习为模型或实验撰写业务案例是数据科学家必须发展的关键技能。它不仅可以帮助您快速了解一个新项目是否值得您的时间和精力,还可以帮助您获得利益相关者的支持。此外,它与将使您脱颖而出的极端所有权类型保持一致。
业务案例可以复杂到任何您想要的程度,但很多时候您可以得出足够好的估计。在本章中,我将介绍业务案例创建的基本原理。
一些构建业务案例的原则
虽然每个业务案例都不同,但大多数可以使用相同的基本原则来构建:比较做出决策或不做出决策,计算所有选项的成本和收益,只考虑增量变化,许多时候您只能考虑单位经济。
决策
业务案例通常用于评估正在考虑的新决策,无论是新的广告活动、杠杆变动还是其他决策。
成本、收益和盈亏平衡
最有趣的决策往往涉及权衡。一个关键的起点是列举决策带来的主要成本和收益。业务案例将围绕着作为收益和成本之间货币差异计算出来的净收益构建。盈亏平衡意味着具有零净收益,并作为您决策的极限案例或最坏情况。
增量性
一个良好的业务案例应该只考虑那些来源于决策的成本和收益。例如,如果您在进行一个实验,您的工资可以被视为一种成本,但这并非增量,因为如果您在做其他事情,公司也必须支付您。只有增量成本和收益应该被纳入考虑范围。
单位经济学
大多数情况下,只有您的平均客户会发生什么事情是重要的,所以您可以只专注于这个孤立单元的增量成本和收益。业务案例依赖于您为这个单元计算出来的净收益的符号;通常,扩展到整个客户基础会以相同比例影响成本和收益,不影响总体净收益的符号。
例子:积极的保留策略
让我们评估公司是否应该推出积极的保留策略。在成本方面,您需要给客户提供留下的动机。有很多方法可以做到这一点,但大多数可以轻松地转化为一个货币数额 c。在收益方面,一个额外留下来的客户可以产生每用户平均收入 r,本来可能会丢失的。
假设您的客户基数大小为 B。其中,A 接受了激励措施。此外,仅有 TP 位真正可能会流失的目标客户(真正的阳性)。通过平衡成本和收益来获得盈亏平衡条件:
您可以看到在第二章中呈现的一种技术的应用。请注意,在这种情况下,您可以仅专注于平均单元:
当净收益为非负时,运行活动是有意义的:
第一个分数只是活动基础或样本中的真正正例率;第二个分数是接受率。或者,更方便的是,您还可以将这些视为预期利益和成本的样本估计,以便您的决策问题在不确定性下映射得更加清晰:在活动之前,您不知道谁会接受奖励或在其缺席时实际上会流失。
您现在可以插入一些数字来模拟不同情景下的商业案例。此外,您还可以分析可操作的杠杆。这里有三个杠杆可以促使业务案例起作用:
提高真正正例率。
您可以通过用机器学习(ML)模型进行更准确的预测来帮助业务案例,从真正的正例角度来看。
控制成本。
您可以降低奖励的价值(c)。有时可以安全地假设接受率会随之增加,因此这两个术语朝着同一个方向发展。
只针对高 ARPU 客户。
直观上讲,奖励应优先给高价值客户。在不平等中,这对应于更高的r。
注意增量性的启动:在利益方面,您应该只包括真正会流失的客户(真正的正例)带来的已保存 ARPU。那些无论如何都会留下的客户,如果接受了但没有带来增量收益,会增加成本。
关于假阴性呢?记住这些是未被针对的客户,但却流失了。您可以将丢失的收入包括为成本,以便在 ML 实施中权衡精度和召回率。
防欺诈
银行经常为防止欺诈(以及反洗钱)目的设立交易限额。让我们为超出限额的交易决定制止的商业案例做出构建。
直观地说,存在两种成本:欺诈成本(c[f])和如果客户流失则为丢失或放弃的收入(c[ch])。为简单起见,我将假设一个被阻止交易的客户肯定会流失,但在实际应用中可以放宽这一假设。在收入方面,如果允许交易通过,公司将获得票面金额(t)。
一旦交易进入,您可以选择接受或阻止它。无论采取什么行动,它都可能合法也可能不合法。表 5-1 显示了所有四种行动和结果组合的成本和收益。
表 5-1. 防欺诈的成本和收益
| 行动 | 结果 | 收益 | 成本 |
|---|---|---|---|
| 接受 | 欺诈 | t | |
| 接受 | 合法 | t | 0 |
| 阻止 | 欺诈 | 0 | 0 |
| 阻止 | 合法 | 0 |
用p表示每次交易是欺诈的概率。计算每种可能行动的预期净收益,你得到:
阻止一个票面为t的交易是最优的,只要阻止的净收益超过接受交易的净收益:
这最后一个不等式是业务案例的核心。在收益方面,如果交易是欺诈的,通过阻止可以节省欺诈成本(c[f])。在成本方面,通过阻止交易,你有效地忽略了收入t,并且如果交易不是欺诈的话,会产生流失成本(c[ch])的潜在成本。
和之前一样,让我们把注意力转向杠杆。除了阻止或接受,你总是可以选择一个限制(L),使得高额的票会被阻止,其他任何事情都会被接受。但是这个不等式中的限制在哪里?
欺诈的概率通常是这个限制的函数:p(t|L)。在许多应用中,当欺诈者寻求短期和快速的相对较大回报时,这个函数通常是增加的。通过设置一个足够大的限制,你可以集中精力处理高概率的交易。欺诈的成本通常是票本身,因此这也对收益有直接影响。然而存在一种权衡:如果交易不是欺诈的,你可能面临高价值客户的流失。
购买外部数据集
这种逻辑适用于你想分析的任何决策。在不深入细节的情况下,我会简要讨论购买外部数据集的情况,这是大多数数据科学团队在某个时候会评估的决策。
成本是您的数据提供者决定收费的任何内容。好处是您的公司可以通过数据创造的增量收入。在某些情况下,这是直接的,因为数据本身改善了决策过程。我想到的是 KYC(了解您的客户)或身份管理等用例。在这些情况下,您几乎可以将数据映射到收入上。
在大多数从数据科学角度来看有趣的其他案例中,增量收入依赖于关键假设。例如,如果您已经在生产中使用了一个决策过程中的机器学习模型,您可以量化使业务案例呈正增长的最小增量性能,考虑到这个成本。或者,您可以尝试在考虑这种增量性能的情况下谈判更好的条款。
这个想法可以通过这样的方式概括:
KPI 是您的 ML 模型性能度量的函数。我强调函数部分,因为您需要能够将性能指标转换为货币价值,如收入,以便与成本进行比较。请注意,通过使用原始数据集作为基准,您仅考虑增量效应。
在数据科学项目上工作
正如在第一章中建议的那样,数据科学家应该参与对公司具有增量作用的项目。假设您有两个备选项目,A和B。您应该从哪一个开始?使用相同的逻辑,如果:
要做出决策,您需要填入一些数字,计算本身就是一个项目。重要的是从不平等中获得的直觉:优先考虑那些有实质性增量净收入的项目,考虑您的实施成本。
在第四章中,我展示了一个简单的 2×2 框架如何帮助您通过价值和努力轴对每个项目进行排名来优化您的工作流程。尽管这个图形设备非常有用,但您可能会在排名在一个维度上占主导地位并在另一个维度上被主导的项目中遇到麻烦(例如,图 4-5 中的项目x和z)。通过使用一个公共规模(货币)来评估努力(成本)和收入,前面的不平等解决了这个问题。
关键收获
这些是本章的关键收获:
相关性
学习撰写业务案例对于利益相关者管理和极端所有权目的至关重要,以及在各种备选项目之间分配数据科学资源。
撰写业务案例的原则
通常,您需要了解成本和收益,以及盈亏平衡。只关注增量变化。很多时候,您只需要关心影响您平均客户的单位经济学。
进一步阅读
在我的书籍Analytical Skills for AI and Data Science中,我描述了一些技术,可以帮助您简化业务案例,专注于一阶效应。它还将帮助您理解不确定情况下的决策制定。
这种成本效益分析在经济分析中很常见。我在这里称为增量性的东西通常被称为边际分析。我推荐给非经济学家的三本书是:由 Steven E. Landsburg(Free Press)撰写的The Armchair Economist: Economics and Everyday Life,由 Kate Raworth(Chelsea Green Publishing)撰写的Doughnut Economics: Seven Ways to Think Like a 21st-Century Economist,以及由 Charles Wheelan(W. W. Norton)撰写的Naked Economics: Undressing the Dismal Science。
第六章:提升是什么?
有一些非常简单的技术可以帮助您完成许多不同的任务。提升是其中之一。不幸的是,许多数据科学家不理解提升或者没有看到它们的用处。本章将帮助您掌握它们。
提升定义
一般来说,提升是一个组的聚合指标与另一个组的比率。最常见的聚合方法是取平均值,因为这些是期望值的自然样本估计。本章中会给出一些例子。
在更经典的数据挖掘文献中,聚合是频率或概率,而组A是组B的子集,通常是研究对象的总体。这里的目标是衡量选择算法(例如聚类或分类器)相对于人口平均水平的性能。
考虑将女性作为美国 CEO 的提升。在随机选择的基线下,女性 CEO 大约应占 50%。一项研究估计这一数字为 32%。当前工作市场选择机制的提升为0.32/0.5 = 0.64,因此相对于基线人口频率,女性被低估。
如其名,提升测量一个组的聚合相对于基线的增加或减少。比一大或小的比率被称为提升或下降。如果没有提升,则比率为一。
例子:分类器模型
假设您训练一个分类器来预测客户流失。您有一个数据集,其中流失用户标记为 1,仍然活跃用户标记为 0。基线流失率通过取结果的样本平均值获得。
跟踪测试样本中分数十分位的真正正率是一种常见的性能指标,例如在本例中是十分位的流失率。要计算它,您只需按分数对用户进行排序,并将测试样本分成 10 个大小相等的桶或十分位。对于每个桶,计算流失率。
这个指标很有用,因为它至少涉及三个重要方面:
提升
将每十分位的流失率除以测试样本中的流失率,计算相应的提升。这是模型相对于公司流失率识别流失者能力的估计。
单调性
分数是否具有信息性?如果概率分数具有信息性,从真正的积极意义上讲,较高的分数应该有较高的流失率。
最高十分位性能
在许多应用中,您只需要针对最高十分位的用户。在这个例子中,您可能只想给那些最有可能流失的用户提供留存激励。该十分位的真正正率是您对留存活动预期结果的第一估计。
图 6-1 展示了模拟示例中的真正正类率(TPRs)和 lift。分类器在前 10 分位标识流失者的速率是平均速率的 2.7 倍。如果你希望说服利益相关者使用模型输出,这是一个好发现。你还可以将此 lift 与通过他们当前的选择机制获得的 lift 进行基准比较。

图 6-1. 流失模型示例中的 TPR 和 lift
自我选择和生存偏差
自我选择是指个体选择加入某个群体。例如,可以是有正式入会程序的群体(如政党或团队),也可以是无正式入会程序的群体(例如产品购买者、功能使用者等)。重要的是,存在某种内在特征驱使个体成为成员。
生存偏差是自我选择的一种反向类型:某些用户因其某些特征而最终进入你的样本(“生存”)。统计学家亚伯拉罕·沃尔德分析的经典案例是二战战斗机。这个教训是,由于抽样过程的偏倚性质,你可能因此得出不正确的结论。
第十五章讨论了对数据科学家来说自我选择偏差的相关性;目前,展示 lift 如何帮助你快速识别此偏差已足够。
表 6-1 展示了典型的呈现方式:行包含你认为重要理解选择问题的某些特征或特性;列突出了群体成员以及 lift。这里我只包括了一个客户的四个变量:
-
公司产品的月度支出
-
满意度分数
-
月收入
-
任期
表 6-1. 流失示例中的 lift
| 活跃 | 流失 | Lift | |
|---|---|---|---|
| 月度支出 | 29.9 | 32.7 | 1.1 |
| 客户满意度分数 | 10.00 | 10.08 | 1.01 |
| 收入(千美元) | 46.52 | 54.80 | 1.18 |
| 任期(月) | 9.84 | 8.14 | 0.83 |
通常情况下,拥有的功能越多,你对选择机制的理解就越深刻。例如,为什么不包括地理或行业分段,或者客户已从公司购买的产品数量?
表中的每个单元格显示了活跃用户和流失用户对应特征的平均值,以及提升值。例如,活跃用户和流失用户的平均支出分别为$29.9 和$32.7。看看提升列,很容易识别出一个模式:流失用户有更高的收入(提升为 1.18,即增加 18%)、更多消费(1.1),并且是客户时间较短(0.83)。客户满意度得分不重要(提升微不足道)。这些发现的一个可能解释是相对较富裕的客户对产品有更高的期望;这似乎是一个面向较低社会经济地位细分市场的产品。
无论如何,您已经明白了:理解选择机制的一个快速且不太精确的方法是构建提升表。如果特征选择正确,您可以立即了解到潜在组的情况。
提升的其他用例
这项技术非常简单易用:确定一个指标和分组,然后计算比率。选择机制可以是您认为相关的任何内容。
例如,您可以使用第四章中呈现的 2×2 图表,并关注一个象限。提升非常简单易用,并可能帮助您理解驱动该组用户的因素。
另一个常见的用例是在分析营销活动中的自我选择时。在没有选择偏见的情况下,您可以使用对照组来衡量活动的影响。提升会非常快速地告诉您是否可以这样继续。
同样,由于不同组的响应率差异,许多调查最终会得出有偏见的结果。过去,我曾使用提升自动化地检查客户满意度调查的代表性。
关键要点
这些是本章的关键要点:
定义提升
提升是一个组的一个聚合指标与另一个组的比率。平均数是最常见的聚合方法之一。
机器学习中的提升
你可以通过展示模型相对于整体样本的预测性能来计算分类器模型的提升。我展示了一个流失预测的例子,并计算了真正阳性率在分数十分位上的提升。
自我选择
更广泛地说,提升可以应用于理解样本中自我选择或生存偏差的程度。通过计算那些自我选择进入某一组的用户中的指标提升,您可以轻松了解选择驱动因素。
进一步阅读
提升在许多经典数据挖掘书籍中都有涉及;例如,Ian Witten 等人的《数据挖掘:实用机器学习工具和技术》(Morgan Kaufmann)。
更多参考资料可以在学术文章和博客圈中找到。例如,Andy Goldschmidt 在KDnuggets上的“提升分析——数据科学家的秘密武器”和 Miha Vuk 和 Tomaz Curk 在《方法论评论》第 3 卷第 1 期(2006 年:89–108)上的“ROC 曲线、提升图和校准图”。
第七章:叙述
你花了几周时间在你的项目上工作,现在准备展示结果了。感觉几乎完成了,只需交付输出。
很多数据科学家都是这么想的,并且几乎不费力地去构建引人入胜的叙述。正如在第一章所述,为了拥有端到端的所有权,说服你的利益相关者采取行动对于取得成功至关重要。这种极端的拥有权利至关重要以创造价值;因此,你必须掌握讲故事的艺术。
关于学习讲故事的资源有很多(我会在本章末尾建议一些)。本章在这些知识的基础上进行了扩展,但我稍微偏离一下,以突显一些特定于数据科学的技能。
叙述的要素:如何用你的数据来讲述一个故事
使用标准的词典定义,一个narrative只是一系列相连的事件。这些连接构成了一个故事。我将丰富这个定义,说它还应该实现一个目标。
你想要达到的目标是什么?在一般的叙述中,它可能是说服或者引起兴趣。当然,这些也适用于数据科学(DS),但更重要的是,你希望创造价值,为此你需要推动行动。一个成功的故事应该帮助你实现这个目标。
让我们反向工程这个问题,识别有助于我们实现这一目标的条件:
-
- 清晰而简明扼要
-
可信任
-
- 记忆深刻
-
可操作的
清晰而简明扼要
清晰度是一个相对的概念,随着背景的不同而变化,并且在很大程度上取决于你的观众。你的机器学习(ML)实现的技术细节可能对你的数据科学团队非常清晰,但通常对你的业务利益相关者来说却晦涩难懂。识别你的观众是构建清晰叙述的第一个关键步骤。因此,选择适合不同观众的正确语言和语调至关重要。
DS 本质上是一个技术性的主题。因此,数据科学家经常会诱惑自己在演示中包含花哨的技术术语(如果还有伴随的方程更好)。但是,讲述一个故事不是关于你自己。如果你想包含技术材料,最好将所有技术内容放在技术附录部分。
一个常见的错误是认为技术术语会给你带来信任度(稍后详述)。有时这种情况表现为试图证明数据科学工具包对组织的必要性。我的建议是在实现你的目标的有效沟通与此愿望之间保持平衡。创造强大叙述关乎于后者。
在常规数据科学开发过程中,运行许多测试并创建多个可视化是非常正常的。当试图证明他们投入了大量工作时,一些人往往会诱惑性地在演示中包含他们能够的一切,从而分散并压倒观众的注意力。只专注于关键信息,并包含强化这些信息的结果。其他所有内容都应该被剔除。如果某些内容并不直接有助于你的传递,但可能仍然有用,将其放在附录中。但是尽量不要让附录杂乱无章;这部分也有特定的目的(如果没有,就抛弃它)。
达到适当的简洁程度需要大量的实践和努力;这本身就是一门技能。一个好的技巧是开始写下你认为是关键信息,然后从演示中开始剔除其他所有内容。迭代直至收敛:当你剔除了太多内容以至于信息不再清晰时停止。
这个建议也适用于句子和段落。尽可能使用少于 10 个单词的短句。长句和段落在视觉上很累人,因此可以假设它们不会被阅读。一旦我有了初稿,我会逐个检查每个句子和段落,并使它们尽可能简短和明确。
清晰度应该是通道独立的。很多时候,你为了现场演示做准备,却没有意识到部分观众——可能是高层管理人员——会在其他时间点阅读它。因此,你必须让它自解释。
这不仅适用于文本,还适用于数据可视化。确保标记所有相关轴并写下有意义的标题。如果在特定图中有想要突出的内容,你可以包括视觉辅助工具——如高亮、文本或方框——来帮助引导观众的注意力。
数据可视化是数据科学叙事交付的固有部分。这些原则适用于你准备的任何图表。在第八章中,我将介绍一些数据可视化的良好实践。
可信度
在商业环境中,引人入胜的叙述必须是可信的。不幸的是,这是一个非常微妙的特性:它需要时间去获得,但失去起来却异常容易。在数据展示中,有三个你应该关注的维度:
-
数据可信度
-
技术可信度
-
商业可信度
数据质量是第一维度的核心,你应该养成在数据源和开发周期中包含检查的习惯。数据科学家编写大量代码,这是一个容易出错的活动。最糟糕的情况是当你的代码实际运行时,但结果可能并不正确(逻辑错误)。依我之见,这种情况经常发生。最好的程序员已经将测试作为他们日常工作流程的固有部分。
此外,数据无法脱离其背景,因此您的结果必须从业务角度上讲得通。我见过很多数据科学家失去信任,因为他们没有检查他们的结果是否合理。至少,您应该了解您正在处理的关键指标的数量级。最好能够熟记这些指标。在呈现结果之前,不要忘记始终质疑自己的结果。
技术信誉通常是由利益相关者授予的。但是,伟大的力量伴随着伟大的责任。数据科学家需要学会为每个问题选择合适的工具,并掌握相关技术。拥有一个内部研讨会系列是一种良好的做法,您可以在其中受到同行的挑战。
如 第一章 描述的那样,向您的观众展示业务专业知识至关重要。您的技术交付可能是无懈可击的,但如果从业务角度来看事情没有意义,您将失去与利益相关者的信任。我见过许多数据科学家从错误的假设出发,以为产品或业务的运作方式是不正确的。另一个常见的错误是对客户行为做出不可思议的假设;永远问问自己,如果你是顾客,你会这样还是那样。
记忆深刻
在普通叙述中,通常通过注入某种形式的挣扎或悬念来实现,从而使叙述不那么线性。我从中吸取教训,这些通常不是数据科学叙述的好策略。
在数据科学中,记忆力通常通过一个啊哈!时刻来创造。这些时刻通常在您展示能创造价值的意外结果时出现。这最后一部分很重要:在商业环境中,只有智力好奇是短期记忆的。最好的啊哈!时刻是那些推动行动的时刻。
许多作者建议通过正确组合数据和情感来创建难忘的叙述,并确实有证据表明,人类大脑更容易记住触动情感的内容,而不是单纯的科学证据。我同意这个总体观点,但我认为不应该追求 TED 类型的叙述和表达方式。相反,您应该保持简单,并找到本身就非常值得记忆的可行的洞见。
小贴士
通过行动性且略显意外的洞见形式,啊哈!时刻是实现记忆深刻的最佳途径。
行动性
如果您已经阅读了前几章,那么您应该不会感到惊讶,我认为这应该是您的北极星和您故事中的主角。
在开始叙述之前,请确保您的项目有可行的洞见。如果没有,请重新开始。我见过一些演示文稿展示了一些有趣的内容,但观众却左思右想那又怎样?
小贴士
确定从您的分析中产生的杠杆作用。没有可行的见解的演示文稿无法有效地创造价值。
构建叙述
前一节介绍了一些创建成功叙事必需的特性,以及一些能帮助你确保这些特性在实践中得到满足的建议。现在我将介绍创建叙事的过程。
科学即叙事
许多数据科学家认为叙事是独立的事物,甚至与他们的技术专长正交,只在交付阶段才会进行。我认为数据科学家应该成为“科学家”,将其作为端到端工作流的内在部分。
有了这个想法,让我建议两种替代的建立叙事的过程:
-
首先,进行技术工作,然后创建叙事。
-
从一个初始叙事开始,发展它,进行迭代,当你准备好时,为交付做精炼的叙事。
第一个过程在数据科学中最常见:从业者首先进行艰苦的技术工作,然后为他们的结果“编造一个叙事”。通常情况下,这最终变成了一堆可能有趣或相关但缺乏故事性的发现。
相反,第二个过程使叙事成为数据科学工作流的一个组成部分(Figure 7-1)。在这种情况下,你从一个业务问题开始,努力理解问题并提出一些故事或假设,用数据验证它们,在一些迭代之后,最终准备好交付结果。这个过程甚至可能迫使你回过头重新定义业务问题。

图 7-1. 迭代叙事
叙事出现在开始阶段(阶段 2),在你迭代和完善假设的过程中(阶段 3),以及最后(阶段 4)。这些叙事并不完全相同,但肯定是相互关联的。
你以及你对理解的需求是初始叙事的观众;你的业务利益相关者是最终叙事的观众。如前所述,语言和语调是不同的。但重要的是,最终的关键信息是前面信息的直接衍生物,经过中间迭代过程的精化。
你应该在项目开始时带着一组最初的关键信息候选人,你认为最终会传达的。这些可能不完全正确,但通常情况下——如果你有足够的业务专业知识——它们离最终结果并不太远。采用这种方法,为你的演示创建叙事的过程在甚至进入数据之前就开始了。它将指导你在这个阶段,并帮助你进行迭代。由于这个中间阶段,你能够捕捉错误并找到错误(数据质量、逻辑、编码甚至你对业务理解的理解);这通常是 Aha!时刻产生的地方。交付阶段的叙事切换了受众,并传达了最终和精炼的信息。
什么,为什么,以及现在怎么办?
一旦达到交付阶段,你需要为你的叙述加上一些结构。有些人喜欢遵循标准的叙事方法,也被称为叙事弧,它包括三个阶段:设定、挣扎和解决。
尽管对一些人可能有效,但我更喜欢一种不同的顺序,这种顺序强调你驱动行动的关键目标:什么,因此什么,现在什么?毫不奇怪,这与第一章中描述的过程密切相关。
什么?
这一节是关于描述业务问题及其在当前时点对公司的重要性。它还应包括一些关于背景的定量信息,比如主要 KPI 的最近演变和机会的大小。
想象一下,你正在试图量化给予价格折扣的影响。在这一节中,你可以提供一些背景信息,比如最近价格变动的频率、范围或分布,以及对销售、保留或收入的一些高层次影响。如果有一些证据,即使是偶然的,你也可以突出其在当前竞争环境中的战略重要性。
那么呢?
这一节的关键在于专注于可操作性。主要的结果会在这里呈现,包括那些能引发“啊哈!”时刻的结果。
一般来说,“啊哈!”时刻有两种味道:
-
意外的结果
-
在某种程度上,结果是预期的(就方向而言),但是却有意外的转折,可以来自量化或可操作性。
我更喜欢第二种类型,因为你应该有一个行动的偏好。如果你有意外的结果和一个行动计划,那就完成了。
回到定价的例子,降低价格通常会提升销售。这是预期的行为,所以显示负相关性不会产生“啊哈!”时刻,观众可能会觉得你在重复发明轮子。
但是,如果你说用户对于高于 5.30 美元的价格相对不敏感,但是在这个价格以下,每降低 1.00 美元的折扣就能提高 1000 个单位的销量,你就吸引了他们的注意。信息类似,但是有一个来自量化的意外成分。此外,这是一个行动呼吁,需要成为最后一节的核心内容。
现在呢?
这一节是关于下一步的内容。你需要公司其他部门做什么来实现这个价值?谁需要参与?在这里,我喜欢提出具体的下一步建议。我见过数据科学家在这方面有所保留,因为他们通常不是实际的决策者。
对于定价的例子,你很可能依赖营销团队来设计和传达实际的折扣策略。财务部门可能还需要批准该计划。任何其他受影响的团队也应该被纳入考虑。
最后一英里
在她的书《软技能的残酷真相》(哈珀商业出版社)中,佩吉·克劳斯建议,长期成功 75%取决于软技能,其余取决于技术知识。我不确定这是否正确,但从方向上来说,我非常同意:数据科学家投入大量时间和精力来实现技术卓越,但他们的职业生涯更多依赖于那些被忽视的软技能。
在最后一英里,现在是时候从科学家转变为销售人员角色了。我从个人经验中学到,许多优秀的项目之所以失败,是因为在这个阶段缺乏准备工作。
编写 TL;DRs
TL;DR(太长了,没读)是一个检验你的叙述是否精炼的好工具。它们已经成为科技公司的标准,我已经养成了始终以此为开始的习惯。
许多高管不会花太多时间阅读你的工作,除非他们看到引起注意的东西。出色的 TL;DR 旨在实现这一目标。
编写记忆深刻的 TL;DR 的技巧
有些人喜欢在写下实际文档之前先草拟一个 TL;DR 的初稿。这是确保 TL;DR 与你的叙述一致,并确保内容与之对齐的好方法。完成后,他们会回过头来对 TL;DR 进行反复推敲。
我更喜欢的方法是先写下叙述(有些人用笔和纸真正画出了一个草图),然后处理内容,然后才回过头来写 TL;DR。对我来说,TL;DR 是你最后写的东西,我总是先勾勒出叙述。
这两种方法听起来可能相似,但 TL;DR 实际上是叙述的一个非常精炼的版本。叙述是将事件序列联系起来的故事的高层视角,而 TL;DR 是其聚焦的版本。
我倾向于按照叙述的方式构建 TL;DR:What,So What,Now What。与之前一样,What 部分为你的受众的注意力提供依据,So What 总结了主要发现和可行动性的行动点,而 Now What 则提出了建议的下一步。
提示
一个好的提示是将你的文档视为新闻文章,并考虑替代标题。数据科学中的好标题必须具备我一直在谈论的这些特性:简单、可信、记忆深刻和可操作性。可信度阻止你过度推销。
最后,你 TL;DR 中的每一点都应该有一张详细展开的幻灯片。如果它足够重要进入 TL;DR,那么最好有一些相关的材料。
例子:为本章写一个 TL;DR
图 7-2 展示了你可能会遇到的一个典型 TL;DR。它很混乱,显然,我试图包含每一个工作的细节。它有非常长的句子,字体小到足以使其适应页面。它显然不易阅读。但它也是记忆深刻的,只不过是出于错误的原因。

图 7-2. TL;DR 版本 0
在 图 7-3 中,我应用了之前给出的一些技巧来减少混乱:简化并删减一些句子。如果我想的话,我还可以增加字体大小。我本可以做得更多,但我意识到最好的方法是回到起点,重新开始。

图 7-3. TL;DR 版本 1
图 7-4 展示了上一次迭代的结果。从零开始让我专注于关键信息。您可以看到我遵循了什么、为什么、现在怎么办的模式。在真实的数据科学 TL;DR 中,我会强调一些既有量化又可操作的关键结果。这里唯一的行动号召是练习。

图 7-4. TL;DR 版本 2
显然我正在使用项目符号风格。有很多人对这种方法持负面态度,但它和其他事物一样有其利弊。不利之处在于,它确实限制了你的创造力(想象一下你可以在一张空白纸上做的一切)。而利之处在于,它迫使你以简单、清晰和有序的方式写作。我可以快速看出我的句子是否过长(尽可能避免两行长的句子)。
正如我之前所说,我认为 TED 风格的演示在数据科学或商业环境中并不合适。尽管如此,如果你足够熟练,并且它符合公司的文化,那就大胆去做吧。但项目符号在商业环境中往往效果良好。
发表强有力的电梯演讲
这是我在向经理做演示时学到的一个诀窍:如果有人开始做演示,显然缺乏叙述性,那么打断他并要求他给你一个电梯演讲。很多时候,其实并没有电梯演讲。
电梯演讲应该是您在电梯里遇到 CEO 时会进行的 10 到 20 秒演示。你真的想要推销你的工作!但有个问题:你只有到达你的楼层之前的时间。那时,你失去了互动的机会。
这种情况只发生过一两次,所以我不会真的将电梯演讲看成是文字的字面意思。相反,我将其视为叙述创作工具包的一部分。好的叙述应该很容易以电梯演讲的形式进行总结。如果不能,很可能是您的故事出了问题,现在是时候迭代了。
提示
下次在您的项目上工作时,试试在您认为完成之前和之后都进行电梯演讲。这是您的试金石测试。
呈现您的叙述
以下是交付阶段的一些好建议:
确保您有一个明确的叙述。
如果你遵循迭代方法,叙述总是存在的,你只需要自律。如果没有,请在开始制作幻灯片或备忘录之前勾勒出叙述。做完后,让别人浏览你的幻灯片,并请他们分享他们对叙述的看法。如果他们只关注每张幻灯片的关键信息,就应该能够找到叙述。如果找不到,你需要重新审视。此外,这些信息之间应该有明确而自然的过渡。
每张幻灯片应该有一个明确的信息。
如果一张幻灯片的信息与你的叙述不一致,就放弃它。
始终练习演讲。
这一点始终如此,但如果你的观众包括组织中的高级主管(你应该希望如此),这尤为重要。一个好的实践是录制自己:这不仅有助于你管理时间,还能帮助你发现可能存在的习惯和行为特征。
时间管理。
在演讲之前,你应该已经知道不被打断时需要多长时间,这样你就可以更好地规划额外时间。同时记住,你是演示的唯一所有者,因此有权(友好地)跳过让你远离关键信息的问题。
尽可能量化,但不要过度。
无需多言,数据科学是一个定量领域。然而,我经常看到数据科学家用定性或方向性的术语描述他们的结果。与其说“糟糕的用户体验增加了流失率”,不如在该声明中加入一些数字:“每次连接失败使得净推荐评分降低 3 个百分点。”话虽如此,不要过分夸大你的结果:如果你在估算中工作,很可能可以将结果四舍五入至最接近的整数。
主要观点
本章的关键要点如下:
数据科学中的有效叙述
有效的叙述是通过一个旨在推动行动的故事连接的事件序列。
优秀叙述的特性
要推动行动,叙述必须清晰而直截了当,可信,值得记忆,并且可操作。
科学如同讲故事
我建议采用迭代方法来创建叙述:从业务问题开始,创建解决问题的故事或假设,通过数据进行迭代测试和优化,并最终形成交付阶段的叙述。这最后的叙述自然地从最初的假设中演变而来。
叙事结构
你可能希望按照叙述弧线来进行:设定,斗争和解决。我发现按照简单而直接的故事情节更有效:是什么,为什么,现在怎么办。这些几乎是一一对应的,但在数据科学中,我看不出制造悬念或斗争感的价值。
简述和电梯演讲
这些都是实现适度简化和确保你确实拥有连贯叙事的好工具。TL;DR(总结摘要)可能作为高级管理人员的预告,他们只会花时间阅读材料,如果有什么令人难忘且可行的东西。
熟能生巧
投入足够的时间练习表达。如果可能,录制自己的声音。
进一步阅读
关于叙事和数据叙事有许多优秀的参考资料。Cole Nussbaumer Knaflic 的 数据叙事(Wiley)非常擅长改善你的数据可视化技巧,同时还有一个非常好的章节关于构建叙事。我在本章没有涵盖数据可视化,但对于创建故事的数据科学家来说,这是一项关键技能。第八章 讨论了其中的一些技巧。类似地,Brent Dykes 的 有效的数据叙事:如何通过数据、叙事和视觉推动变革(Wiley)充满了有益的见解。我发现他对数据、视觉和叙事之间相互作用的讨论非常有用。
简而言之:在工作和其他场合更好地沟通 一书由 Jay Sullivan(Wiley)强调了一般沟通中简单性的价值,无论是书面还是非书面的沟通。他关于写短句(少于 10 个词)的建议非常有力。
最好的句子,最坏的句子:作家的指南,打造杀手级句子 由 June Casagrande(Ten Speed Press)专门为作家设计,但提供了许多成为更好沟通者的建议。她强调考虑观众(“读者为王”)在构建叙事时应是北极星。
共鸣:呈现改变受众的视觉故事 由 Nancy Duarte(John Wiley and Sons)提供了一个从设计师角度学习讲故事艺术的绝佳资源。你还会在 Chip Heath 和 Dan Heath 的 造成粘性的思想:为什么有些想法存活,有些想法消亡(Random House)中找到许多本章涵盖的话题的详细信息。他们的六个原则会产生相当大的共鸣:简单性、意外性、具体性、可信度、情感和故事。
软技能的残酷真相:职场智者希望早点学到的工作教训 由 Peggy Klaus 提出了关注你的软技能的强烈理由。数据科学家早期专注于发展他们的技术专长,因此忽视了所谓的软技能。残酷的真相是,你的职业生涯极大地依赖于后者。
在科学方法中,David Grandy 和 Barry Bickmore 的文章 “科学如何讲故事” 更详细地讨论了科学方法和讲故事之间的类比。
第八章:Datavis:选择正确的图表传递信息
第七章介绍了在数据科学中构建和传递强大叙述的一些良好实践。数据可视化(datavis)是丰富叙述的强大工具,也是一个独立的研究领域。因此,它们需要被选择作为沟通设备。你应该始终问自己的问题是:这个图表是否帮助我传达我想要的信息? 如果答案是否定的,你应该重新考虑并找到合适的图表来传递你的信息。本章将介绍一些建议,帮助您提升可视化技能。
一些有用和不那么常用的数据可视化
过去几十年中,数据可视化领域已经有了很大发展。您可以找到在线参考资料、目录和分类,这些应该帮助您找到适合您问题的正确图表类型。您可以查看Data Visualisation Catalogue或from Data to Viz。
不幸的是,许多从业者坚持使用默认的替代方案,如折线图和柱状图,它们经常可以互换使用。在本章中,我将回顾一些您可以使用的较少知名类型的图表,并讨论一些数据从业者常见的陷阱。这并不是详尽无遗,因此在本章末尾,我将指出一些优秀资源,这些资源将为您提供更完整的领域图景。
柱状图与折线图
让我们从最基本的问题开始:什么时候应该使用柱状图和折线图?一个常见的建议是对于categorical数据使用柱状图,对于continuous数据使用折线图。连续数据的最常见情况是当您拥有时间序列时,即通过时间下标索引的一系列观察( )。让我们验证一下这个建议的有效性。
记住,图表应该帮助您传递信息。对于像客户分段中的每个用户的平均收入这样的 categorical 数据,您很可能想要突出跨段的差异。此外,类别没有明显的顺序:您可能希望对它们进行排序以帮助传达信息,或者您可能只是保持字母顺序。柱状图是很好的沟通工具,因为很容易看和比较柱子的高度。
对于时间序列数据,通常会突出显示数据的几个属性:
-
时间提供的顺序性排序
-
均值或平均水平
-
趋势或增长率
-
任何曲率
如果您关心以下任何信息,折线图是一个很好的选择。
图 8-1,8-2,和 8-3 展示了用于分类数据和两个时间序列(短和长)的柱状图和线图。从分类数据开始,柱状图使得跨段比较度量变得容易。另一方面,线图并不适合用于可视化跨段差异。这是因为线的连续性会给人错误的感觉,认为这些段是某种方式连接在一起的。观众需要额外的努力来理解你正在绘制的内容,这会危及你想传达的信息。
观察时间序列数据时,你可能会认为柱状图做得还行,至少在样本足够短的情况下是这样。一旦增加样本量,就会产生不必要的混乱,然后你必须对你的绘图选择产生怀疑。注意,线条可以清晰快速地告诉你一些关于趋势和水平的信息,而不需要额外的墨水。稍后我会讨论数据墨水比率时详细讨论这一点。

图 8-1. 客户分段的柱状图和线图

图 8-2. 时间序列的柱状图和线图

图 8-3. 长时间序列的柱状图和线图
斜坡图
我在阅读爱德华·图夫特的《量化信息的视觉展示》(Graphics Press)时了解了斜坡图,我花了一些时间才理解它们的用途。理解斜坡图的一种方式是,在你需要传达分类数据的趋势信息时,它们非常有用。在某种意义上,斜坡图结合了柱状图和线图的优点,因为它们允许你比较跨段的趋势。
图 8-4 展示了斜坡图的一个示例。你可以看到,线条能够轻松传达每个段的趋势,而且这种可视化方式使得跨段比较变得容易。在这个例子中,我只有五个段,所以正确标记它们很容易,但如果有更多的段,要得到一个可读的绘图可能会具有挑战性。尽管如此,还有其他工具可以帮助你,比如使用图例和不同的颜色或线条样式(如虚线、点线等)。

图 8-4. 用来突出趋势差异的斜坡图
瀑布图
瀑布图(图 8-5)经常被业务利益相关者使用,并且由麦肯锡广为流传。这里的想法是使用段或类别来分解指标的变化。我在 第三章 中使用瀑布图,因为它们非常擅长绘制这些分解的输出。
当其中一个段的规模显著不同时要小心,这通常发生在使用增长率时,某些类别的起始值非常小。此外,请记住,当信息传递的重点是分解时,这种类型的绘图非常有用。

图 8-5. 按客户细分的收入
散点图平滑器
当你想要传达两个变量X和Y之间的相关性时,散点图非常有效。不幸的是,对于大数据集来说,即使关系存在,也很难显示出来。
处理这个问题有几种替代方案。最简单的解决方案是创建一个包含数据随机样本的图表。通常情况下,这已经足够好,因为大多数时候你并不需要完整的数据集。另一种选择是使用六边形箱线图,它通过给六边形区域上色来实现数据的降维。同样的原理也适用于等高线图,不过这需要你进行一些预处理。
另一种解决方案是使用散点图平滑器,它在数据上拟合非线性平滑器。这个非线性函数足够一般化,可以帮助你找到变量间的关系。但是你必须小心。在数据可视化中一个很好的原则是尽量不改变数据的本质(或者正如 Tufte 所说的图形完整性),而平滑技术可能会改变观众对数据的理解。
图 8-6 展示了三个图表:第一个散点图使用了完整的 1000 万观测数据集。第二个则用原始数据的随机小样本重复了这个过程。第三个图表展示了原始数据和一个立方散点图平滑器。展示数据总是一个良好的实践:这样观众可以自行判断平滑器是否能够良好地代表关系。

图 8-6. 用二次生成过程模拟的大数据集的散点图
绘制数据分布图
数据分布对于数据科学家至关重要,通常在开始项目之前,绘制或打印某些度量的分位数是一个良好的实践。然而,向利益相关者展示数据分布则不那么明显,因为这些内容难以理解,可能会造成不必要的混淆。
直方图是绘制分布的标准方法:这些只是在度量域或柱中互斥的子集中的发生频率。核密度估计(KDE)图提供了分布的平滑估计,依赖于两个关键参数:核函数或平滑函数以及带宽。图 8-7 展示了一个模拟的混合正态数据的直方图和高斯核密度估计图。

图 8-7. 模拟数据的直方图和核密度估计图
警告
在绘制核密度估计图(KDEs)时,要注意比例尺。KDEs 是对潜在分布的平滑估计,确保它们积分为一,因此比例尺没有实际意义。当我绘制 KDEs 时,我通常会删除垂直标签,因为它们可能会造成混淆。在图 8-7 中,我重新调整了坐标轴的比例,以便与直方图中的比较。
在与利益相关者交流时,我很少使用直方图或 KDEs,因为这些通常包含比传达信息所需更多的信息。大多数情况下,你只需要几个分位数,可以通过其他可视化手段呈现,比如标准的箱线图。唯一的例外是当我想突出显示与我的信息相关的分布特征时;典型的用例是当我想表明度量领域中有异常行为时,比如在欺诈预防中。
如果你想突出分布中的变化,可以使用箱线图。一个典型的场景是当你想展示你的销售或客户的质量已经发生变化,比如因为平均票价随时间改善了。由于样本平均值对离群值敏感,你可能想展示是什么驱动了这种变化。
图 8-8 展示了两种绘制这些变化的替代方式。左边的图显示了标准箱线图,右边我决定仅绘制最小值和最大值以及 25%、50%和 75%的分位数,使用了线图。箱线图包含了比传达信息所需的更多信息,因此我决定做两个改变:
-
仅呈现绝对必要的数据(分位数)。
-
根据本章开头的建议使用线图。

图 8-8. 分布变化的两种替代方案
一般建议
在经历了一些数据可视化中的常见陷阱之后,让我们直接进入一些关于良好设计和执行的一般建议。
找到适合你信息传达的数据可视化方式
你选择的绘图类型可能会改变观众对数据的感知,因此最好找到真正有助于传达信息的绘图类型。例如,你想要比较不同类别之间的数量?随时间的变化?比例?不确定性?根据你想传达的内容,你可以在网上找到多种资源来指导你。例如,数据可视化目录展示了根据“你想展示什么”不同类型的绘图。
我再次强调重要的是信息传达。因此,我始终建议在决定最终输出之前尝试几种绘图。这会花费更多时间,但最后一步非常关键。图 8-9 展示了我在准备本章时舍弃的一个图。尝试同时使用箱线图和线图似乎是个好主意,但是这种方式并没有帮助我传达信息(信息过于杂乱)。

图 8-9. 未能帮助传递信息的绘图
谨慎选择您的颜色
一个常见的错误是将颜色视为绘图的装饰特征。在市场营销设置中可能是正确的,但在数据可视化中,必须明智地选择颜色以传达信息。
常见的情景是条形图:您在类别之间有一个度量标准,希望展示一个或多个分段的有趣见解。一个好的建议是为所有条形选择一种且仅一种颜色。我看过许多数据科学演示,演讲者认为如果每根条形的颜色都不同,图表看起来很棒。退一步想想你的观众:他们会认为你在组合颜色方面非常出色吗?这有可能,但许多人实际上认为不同的颜色代表您想突出显示的第三个变量。在这种情况下,颜色与水平轴上的标签传达完全相同的信息,最好选择一种颜色。
图 8-10 显示了三个示例:第一个图突出了您要避免的内容,因为您的段标签和颜色代表相同的维度。中间的图消除了这种冗余。第三幅图展示了一个例子,说明了着色帮助您传达信息的情况:您希望观众关注表现糟糕的* b *段。如果仅靠颜色不足以传达信息,您可以包含其他文本注释。

图 8-10. 带有着色的示例
绘图中的不同维度
前面的例子可以推广到其他类型的装饰性特征,例如不同的标记类型或线条样式。相同的原则适用:如果使用了多个这样的特征,可能会传达冗余信息,并可能会让观众感到困惑。
话虽如此,如果您有重要的附加信息要传达,您可以使用这些额外的特征。最好的例子是气泡图:这类似于散点图,您想说明两个变量X和Y之间的关系,并且还包括第三个变量Z,由圆形标记或气泡的直径表示。一个示例显示在图 8-11 中。

图 8-11. 用气泡图表示的第三维度
瞄准足够大的数据墨水比
在讨论在图 8-3 中使用条形图时,我提到您应该避免混乱;条形图本身只是提供了冗余信息。爱德华·图夫特通过数据墨水比的概念正式化了这种直觉。他将数据墨水定义为图形的“不可擦除的核心”。数据墨水比是数据墨水与图形总墨水量的比率。当您在绘图中包含非信息性特征时,这会降低该比率;或者,如果您确实只是代表数据而不添加其他内容,您将提高它。
虽然图夫特支持最大化数据墨水比的概念,但我把数据墨水比更多地看作是一个指导方针而不是铁板一块法律,实际上在视觉感知的研究中也有与图夫特建议相矛盾的研究。¹ 例如,在右侧的图表中包含额外的信息来突出你的观众的某些内容,会增加比率,因此是一个不好的做法。你可以自行判断,但我发现帮助观众将他们的注意力引导到帮助我表达观点的细节上是非常有用的。
定制与半自动化
在典型情景中,数据科学家使用可视化工具来帮助提高他们的生产力。这些半自动化工具能够缩短生成图表的时间,但通常提供的定制空间有限。应当选择灵活的工具,能够轻松定制你的图表。
小贴士
我倾向于支持这个光谱的定制化一面。回归基础,使用像 Python 的 Matplotlib 这样通用且允许高度定制的工具,能够显著提升你创建正确图表的能力。起初的学习曲线可能会很陡峭,但过一段时间后,你将能够毫不费力地创建几乎任何你想象得到的图表。
从一开始就把字体大小搞对
这听起来可能很简单,但这是我在数据科学演示中经常看到的一个错误。为你的图表选择足够大的字体大小,并始终检查每个标签是否可读。并总是包括标题以及垂直和水平轴的标签。旨在设计自说明且可读的图表。
使用 Python 的 Matplotlib 的一个好习惯是定制rcParams。例如,为了确保我始终拥有足够大的默认字体大小,我总是在导入必要模块后,在笔记本或脚本的顶部包含以下类似内容:
# set plotting parameters from the beginning
font = {'family' : 'monospace',
'weight' : 'normal',
'size' : 14}
axes = { 'titlesize' : 22,
'labelsize' : 20}
figure = {'figsize':(10,4),
'autolayout':True}
matplotlib.rc('font', **font)
matplotlib.rc('axes', **axes)
matplotlib.rc('figure', **figure)
如果你认为这些新的默认参数对于特定的图表不起作用,只需在该图表上覆盖它们。
交互式还是非交互式
交互式图表已经相当流行,最初是通过 JavaScript 库(如D3.js)的开发,现在在 Python 和 R 中也可以找到这种功能。在 Python 中,你可以找到几种工具来使你的图表具有交互性;最受欢迎的包括Plotly,Seaborn和Altair等。
在静态图表中(比如本章中的图表),与观众的沟通是单向的(从创建者到观众)。在许多情况下,这并不是最佳选择,因为观众无法自行检查数据。交互式图表有助于弥合这一差距。
然而,对于大多数常见用例,它们只是一种过度。建议仅在您的受众需要检查数据时使用它们。否则,坚持使用具有清晰消息的静态图。
保持简单
在第七章中,我提出了创建简单叙述的案例,这对数据可视化尤其重要。您的目标是传递一条消息,复杂的图形使您的受众不必要地难以理解。此外,如果您正在进行现场演示,很可能会收到分散您注意力的问题。
从解释图开始
一个常见的错误是假设观众理解绘图并立即解释从中获得的主要见解。这就是为什么您应该从澄清绘图开始:明确说明垂直和水平轴上的内容,并选择解释绘图的一部分(如标记、线条或条形)。一旦确保绘图清晰,您可以传达您的消息。
主要观点
这些是本章的要点:
数据可视化的目的
可视化应帮助您传递消息。在呈现图表之前,请确保有一条要传递的“消息”;否则,请放弃使用图表。
绘图类型
选择最适合您的交付方式。条形图非常适合跨类别比较度量标准。折线图更适合连续度量标准或显示时间序列。理解其差异,明智选择。
一般建议
致力于简单的可视化,避免混乱。明智选择颜色,并始终确保图表可读性通过调整字体大小。确保轴标记,并使标签有意义。在不明显的情况下包括单位。除非绝对必要,否则避免交互式图。
进一步阅读
数据可视化中最常引用的参考之一是 Edward Tufte(Graphics Press)的《量化信息的视觉显示》。在许多主题中,他详细讨论了数据墨水比率。与 John Tukey 和 William Cleveland 一起,Tufte 被认为是该领域的基础专家之一。
数据可视化爱好者的另一个必读参考是 Leland Wilkinson(Springer)的《图形语法》。R 流行的 ggplot 库受到了 Wilkinson 观念的启发,对该行业以及其他广泛使用的可视化库和工具产生了深远影响。
数据可视化的历史可以在 Michael Friendly 的《数据可视化简史》中找到,发表在《数据可视化手册》(Springer)中。
在这个主题上有许多出色的现代参考资料。我强烈推荐 Claus Wilke 的《数据可视化基础:制作信息丰富和引人入胜的图表入门》(O'Reilly)。
Jake VanderPlas 的《Python 数据科学手册》(O’Reilly)提供了本文讨论的一些主题的出色示例,并将帮助您理解 Matplotlib 的一些复杂性。他的所有代码都在GitHub上。
Kennedy Elliott 的《30 分钟内理解人类感知的 39 个研究》回顾了一些关于如何不同情节改变物体感知以及它们传达不同信息效率的证据。
¹ 例如,McGurgan 等人在《图形设计:数据-墨水比率和专家用户》中,收录于第 16 届国际联合计算机视觉、成像和计算机图形理论与应用会议(VISIGRAPP)的论文集 3(2021 年):188–194 页。
第二部分:机器学习
第九章:模拟和自举法
数据科学家工具包中不同技术的应用取决于您正在处理的数据的性质。观察数据源自于任何公司在日常业务中的正常互动,而实验数据则是在设计良好的实验条件下产生的,例如进行 A/B 测试。后者通常用于推断因果关系或估计杠杆的增量性(第十五章)。
第三种类型,即模拟或合成数据,在重新创建数据生成过程(DGP)时较为少见。这可以通过对其进行强假设或在数据集上训练生成模型来实现。本章仅讨论前一种类型,但如果您对后一种类型感兴趣,我会在本章末尾推荐相关资料。
对于数据科学家而言,模拟是一个重要的工具,其原因有以下几点:
理解算法
没有一种算法能够在所有数据集上表现良好。模拟允许您单独分析 DGP 的不同方面,并了解算法对变化的敏感性。蒙特卡洛(MC)模拟通常用于这种分析。
自举法
很多时候,您需要在不做出分布假设的情况下估计估计值的精确度。自举法是一种可以在这种情况下帮助您的模拟方法。
杠杆优化
有些情况下,您需要模拟一个系统以了解和优化某些杠杆的影响。本章不涉及此主题,但在章末提供了一些参考资料。
在深入讨论这些主题之前,让我们从模拟的基础知识开始。
模拟的基础知识
数据生成过程(DGP)清楚地说明了在模拟数据集中输入、噪声、输入和输出之间的关系。以这个 DGP 为例:
数据集由一个结果(y)和两个特征()组成。结果是特征和噪声的线性函数。包括在内的所有模拟数据集所需信息均已包含,因此 DGP 已完全确定。
创建 创建数据的步骤如下:
-
设置一些参数。选择 的值, 协方差矩阵 ,以及残差或纯噪声方差 。
-
从分布中抽样。在这里,我决定特征遵循均值为零的多元正态分布,残差则独立地从均值为零的正态分布中抽样。
-
计算结果。一旦所有输入都被抽取,你可以计算结果 y。
第二步是模拟的核心,所以我们先来讨论这个。计算机无法模拟真正的随机数。但是有办法从具有纯随机性质的分布中生成伪随机抽样。在 Python 中,random模块包含多个可以轻松使用的伪随机数生成器。
尽管如此,让我们退一步,试着理解这些伪随机数生成器的工作原理。现在我将描述逆变换抽样方法。
假设你能够抽取一个均匀分布的随机数 ,并且你想要从已知累积分布函数(CDF)为 的分布中抽样。重要的是,你还可以计算 CDF 的逆函数。步骤如下(图 9-1):
-
生成 K 个独立抽样 。
-
对于每个 找到 :后者是从所需分布中独立抽取的结果。

图 9-1. 逆变换抽样
以下代码片段展示了如何计算 logistic 随机变量的逆 CDF。每个均匀随机数被作为参数传入,然后你只需计算 CDF 的逆,给定一些位置和尺度参数:
def logistic_cdf_inverse(y, mu, sigma):
"""
Return the inverse of the CDF of a logistic random variable
Inputs:
y: float: number between 0 and 1
mu: location parameter
sigma: scale parameter
Returns:
x: the inverse of F(y;mu,sigma)
"""
inverse_cdf = mu + sigma*np.log(y/(1-y))
return inverse_cdf
图 9-2 展示了一个 Q-Q 图,比较了 Numpy 的 logistic 随机数 生成器 和我自己使用刚刚描述的反转变换抽样实现的生成器,针对三种不同的样本大小。Q-Q 图非常适合直观地检查两个分布是否相似。通过比较水平和垂直轴上的对应分位数来完成此操作:相等的分布必须具有相同的分位数,从而创建一个位于 45 度对角线(虚线)上的图形,因此您要查找任何偏离这种理想情况的情况。您可以看到随着样本大小的增加,Numpy 的 logistic 随机数生成器和我的实现逐渐接近。

图 9-2. Numpy 和我自己的 logistic 随机变量生成器,适用于不同的样本大小
最后一个重要的信息与随机数生成器的 种子 有关。伪随机数是通过动态过程生成的,例如 。种子是序列的初始值,因此在给定过程(及其参数)的情况下,可以复制完整的序列。在实践中,种子用于 复制 的目的。在本章的代码中,您会看到我总是设置一个种子来确保再次运行代码时结果不会改变。
模拟线性模型和线性回归
在机器学习(ML)中仍然有用的最简单的模拟是线性模型的模拟。现在我将模拟以下模型:
注意,特征是独立于正态分布的抽样(协方差矩阵是对角的,粗体表示向量或矩阵),残差遵循标准正态分布。
您现在可以准备运行 MC 模拟。典型的模拟包括以下步骤:
-
确定参数、种子和样本大小 (N)。这确保可以执行单个 MC 实验。
-
定义您希望实现的目标。通常,您希望测试 ML 算法相对于真实 DGP 的性能,例如通过计算偏差。
-
确定模拟的数量 ( ),估计并保存参数。对于每个实验,模拟并训练模型,并计算在上一步骤中定义的度量。对于偏差的情况,可能是这样的:
其中是感兴趣的真实参数(在第一步中设置),是来自 ML 模型的估计,期望通常用M次模拟中的样本均值替代。
图 9-3 展示了在早期定义和参数化的线性模型的三百次 MC 模拟实验结果。每次实验的估计参数都被保存,图中显示了样本均值和 95%置信区间,以及真实参数。置信区间直接从模拟结果计算得出,通过找到M次实验中的 2.5%和 97.5%分位数。
这是普通的香草模拟,其中所有普通最小二乘法(OLS)的假设都得到满足,因此线性回归在估计真实参数时表现出色并不足为奇。

图 9-3. 线性回归的 MC 实验结果
现在,我已经使用 MC 模拟验证了 OLS 估计是无偏的,我将尝试更有趣的事情。当信号与噪声比发生变化时会发生什么?
直觉上,信号与噪声比(SNR)衡量模型提供的信息量(信号)与模型未解释部分的信息量(噪声)之比。一般来说,你包含的信息特征越多,预测模型的 SNR 就越高。
使用第一次模拟作为基准,通过改变残差方差σ²并保持特征的方差不变,可以轻松地改变 SNR。图 9-4 展示了从新的 MC 模拟结果中绘制的结果,与之前相同的参数,唯一不同的是残差方差增大了一千倍。

图 9-4. 线性回归与 SNR 降低
你可以直观地验证 OLS 保持无偏性,即估计的平均值非常接近真实参数。但由于 SNR 较低,估计现在不那么精确(置信区间较大)。当你的 SNR 不够高时,这是一种典型的症状。
什么是偏依赖图?
尽管其预测性能不佳,但从可解释性的角度来看,线性回归仍然很出色。为了看清楚这一点,看看之前使用的简单线性模型:
由于残差根据假设平均为零,计算条件期望和偏导数,得到:
这表明每个参数可以解释为对期望结果的相应特征的边际效应(在其他条件下)。换句话说,在线性世界中,特征的单位变化与结果中 单位的变化相关联。这使 OLS 在叙事视角上具有潜力。
局部依赖图(PDPs)是非线性模型(例如随机森林或梯度提升回归)的对应物:
这里f代表您想学习的可能是非线性函数。
通过以下步骤可以轻松计算特征 j 的 PDP:¹
-
训练模型。使用训练样本训练模型,并保存模型对象。
-
计算特征的均值。计算K个特征 。由于随机抽样,使用测试样本或训练样本应该没有区别。
-
为第 j 个特征创建线性网格 。固定网格大小 G 并创建网格为 ,其中索引 0 和 G 用于表示样本中特征的最小值和最大值。²
-
计算均值-网格矩阵。矩阵 在相应列中具有的线性网格,其他特征的均值位于其他地方:
-
进行预测。使用训练好的模型,使用均值-网格矩阵进行预测。这给出了特征 j 的 PDP:
注意,偏导数和偏依赖图回答了一个非常类似的问题:当只允许一个特征变化时,预测结果的变化是多少?对于非线性函数,你需要将其他所有值固定在某个值上(标准做法是样本均值,但你也可以选择其他值)。偏导数关注变化,而偏依赖图则显示了在允许一个特征变化时的整体预测结果。
我给你展示的伪代码对于连续特征效果很好。对于分类特征,你需要在“网格”上小心处理:不是创建线性网格,而是创建可能值的数组,例如{0,1}作为虚拟变量。其余部分保持不变,但在这里使用条形图更合理,正如第八章中所解释的那样。
现在我将使用我模拟的第一个模型来比较线性回归和 scikit-learn 的梯度提升回归(GBR)以及随机森林回归(RFR)的结果。这是一个有用的基准:非线性算法预计在识别非线性方面更强大,但当真实的基础模型是线性时,它们是否同样有效呢?
图 9-5 绘制了真实斜率以及使用最大深度 = 1参数估计的 GBR 和 RFR 的 PDP,该参数控制了两种算法中每棵树的最大高度。这里选择这个参数并不不合理,因为模型在参数和特征上是线性的;单棵树无法学习 DGP,但对于集成来说,这个限制就不那么重要了。所有其他元参数都保持在 scikit-learn 的默认值。
有趣的是,直接使用 GBR 能够很好地恢复两个特征的真实参数。RFR 对表现得还可以,但对表现不佳。

图 9-5. GBR 和 RFR 回归的 PDP(最大深度 = 1)
图 9-6 展示了当最大深度 = 7时的结果,其余部分与之前设置的默认值相同。GBR 再次表现出色,而且在允许更多非线性的情况下,RFR 也能够估计出真实的参数。有趣的是,当时,开始恢复的正确 PDP 形状(详细结果请见本章的repo)。这里发生了什么?

图 9-6. GBR 和 RF 回归的 PDP(最大深度 = 7)
这个模拟有两个参数,同时给予第二个特征 更多的权重:它是从一个具有更高方差的正态分布中抽取的( ),相应的参数在绝对值上也更大。这意味着 的一个标准差变化对 y 的影响大于对 的相应变化。结果是,随机森林回归往往在每棵树的第一个和唯一的分割点上更频繁地选择第二个特征。
图 9-7 展示了在我切换模拟特征的方差而其他一切保持不变时的结果。你可以看到,现在随机森林回归能更好地估计第一个特征的真实效果,并且对第二个特征有一个相对较差的估计(但不像之前那样糟糕)。由于参数没有改变,只是从抽取的分布中改变了方差,所以 仍然在集成树的第一个分裂点处获得足够的权重,因此算法能够捕捉到部分真实效果。

图 9-7. 变量特征值切换时的偏导数图(最大深度为 1)
也许你会想知道是否有其他元参数可以优化,以减少这个随机森林回归估计中的偏差。正如前面提到的,问题似乎在于 被赋予更大的权重,因此它最终被选为树的第一个分割点(如果增加最大深度,则还会被选为任何进一步分割的点)。一种解决方法是改变默认参数 max_features,它设置每次分割允许竞争的随机选择特征的数量。默认值是总特征数(本例中为两个),因此 总是失败。但是,如果将其更改为一个特征,由于选择的随机性,有时会强制集成系统放它一马。图 9-8 展示了这种改变的结果。

图 9-8. 随机森林偏导数图(最大深度为 1,最大特征数为 1)
遗漏变量偏差
在线性回归中,遗漏变量偏差 发生在数据科学家未包括必须包括并与任何其他包括的特征相关的一个特征时,这会导致偏误的参数估计,从而导致次优的预测性能。
要解释偏差如何工作,让我们回到本章开头介绍的简单二特征线性模型,但现在假设数据科学家仅包括第一个特征并估计:
包含变量的真实未观察系数是 ,因此将其与误指定模型的系数( )进行比较,可以显示:
结果是当两个特征无关联时存在偏差。此外,偏差的符号取决于 。
让我们从模拟与之前相同的 DGP 开始,但排除 x[2]。我将对相关系数的网格进行模拟,因为这些系数限制在 [−1,1] 区间内,因此更容易处理。请记住,真实参数是 α[2] = −5,因此偏差的符号将是相关系数的负号:
要模拟 ,您可以通过具有单位方差来简化参数化,以便:
运行模拟的步骤如下:
-
从网格中确定一个相关参数 。
-
给定此相关参数模拟 DGP。
-
对于每个 MC 实验,估计排除第二个特征的参数。
-
计算所有 MC 实验中的偏差。
-
对网格中的所有其他元素重复。
图 9-9 显示了具有不同相关参数的 MC 模拟的结果。有四个结果值得注意:
-
当特征无关联时,偏差为零。
-
偏差的符号为相关参数的负号。
-
在单位相关系数下,偏差等于被排除特征的参数。
-
截距没有偏差(根据定义,与被排除变量无关)。

图 9-9. 偏差作为相关参数的函数
让我们总结这一最后的发现:如果你要使用线性回归,务必认真考虑你需要包含的特征! 这就是为什么即使对于底层因果机制只有弱假设的情况下(例如,包含地理虚拟变量可能有助于减轻省略变量偏差的程度),也建议始终包含一些控制变量。
这样说,现在几乎没有人使用 OLS,除了入门课程或教科书,或者在估计因果效应时(第十五章)。一个自然的问题是更具预测性能的算法是否也会遭受这个问题。
要回答这个问题,让我们进行一个 MC 实验并计算 OLS 和 GBR 的偏差。但我首先需要找到一种方法来估计与线性 DGP 中可比的 GBR 参数。检查 PDP(图 9-5)建议了一个简单的方法:
-
构建 的偏依赖图。
-
运行线性回归 。
-
使用估计的斜率参数 计算偏差。
图 9-10 绘制了 OLS 和 GBR 在独立(左图)和相关(右图)特征情况下的模拟偏差,未经超参数优化。如预期的那样,对于独立特征,偏差与零无异(参见置信区间)。对于正相关特征,偏差为负且在统计上与零显著不同,这对于OLS 和 GBR 都是如此。结果令人沮丧和令人警醒:你不能用算法修复数据问题。

图 9-10. OLS 和 GBR 对独立和相关特征的偏差
提示
作为一般规则,不要期望你的算法能解决数据问题。虽然有健壮算法,但没有一个是万无一失的。
模拟分类问题
正如您可能记得的那样,在分类问题中,结果变量是分类的而不是连续的。这些问题在数据科学(DS)中经常出现,典型用例包括预测客户流失(两类别:用户流失或未流失),需要客户接受或拒绝提供的情况,如跨销售和提升销售或任何其他营销活动,预测欺诈等。
潜变量模型
模拟二项分类模型的一种标准方法是使用潜变量。³ 变量如果不能直接观察但影响可观察结果,则称为潜变量。查看以下生成数据过程后,这个定义将变得更加清晰:
潜变量为 ,它遵循具有逻辑扰动的简单线性模型。您只观察到依赖于潜变量符号的二项变量 。
扰动分布的选择可以帮助您模拟具有更多或更少平衡结果的模型。像高斯或逻辑分布这样的对称分布会生成平衡的结果,但如果您想将模拟集中在数据的“不平衡性”上,可以选择非对称分布(您还可以手动选择不同的阈值而不改变分布,从而达到相同的结果)。
与线性回归模型的一个重要区别是,潜变量 DGP 中的参数通常是不可识别的,这意味着它们不能直接估计;只能估计参数的归一化版本。请注意:
其中F是逻辑分布的 CDF,我使用了逻辑 PDF 是对称的事实。最后一个方程显示真实参数与归一化参数 不可区分。在模拟中,我将报告这两组参数,以突显这一点。
分类模型中的边际效应衡量了一个特征微小变化对感兴趣的概率的影响。在线性回归中,这只是对应于每个特征的系数,但由于 CDF 在参数上是非线性的,对分类模型来说计算并不那么简单。由于 CDF 的导数是 PDF,在应用链式法则进行微分后,你会得到:
注意非线性的表现:为了计算一个特征的边际效应,您需要评估 。与 PDPs 一样,标准做法是使用特征的样本均值来计算与估计参数的内积。边际效应的符号仅取决于真实参数的符号,这总是一个理想的特性。
比较不同算法
现在我将运行蒙特卡洛模拟,以比较三种不同模型的结果:
线性概率模型
运行 OLS 回归,观察二元结果和特征。我不使用加权最小二乘法来校正异方差,这是报告置信区间的标准做法(但它不会影响偏差)。⁴
逻辑模型
标准逻辑回归。我展示了从最后一个方程得到的估计参数和边际效应。
梯度提升分类器
来自scikit-learn 库。为了可比性,我计算了 PDP 的斜率。
模拟的参数如下:
最后一行显示了作为基准的真实归一化参数。
结果可以在 Figure 9-11 中找到。这次模拟的两个主要教训是:
真实参数无法识别。
与 DGP 中的真实参数相比,逻辑回归的估计参数偏离,因为它们不可识别。尽管如此,估计值非常接近归一化参数,正如预期的那样:与之前的真实归一化参数估计值(1.0, 1.8, −2.6)进行比较。
这三种方法估计了正确的边际效应。
逻辑回归的理论边际效应(PDF 乘以系数)、线性概率模型的系数以及 GBR 中的 PDP 斜率达成一致。

图 9-11。分类模拟:估计的比较
自助法
蒙特卡罗模拟主要是通过指定 DGP 来生成数据集。相比之下,自助法是从当前数据集中生成样本,主要用于量化估计的方差。在数据科学中,依赖于手头的样本,比如 PDP(偏导数图)和边际效应、精度和召回率等的估计,总会存在一定的抽样变异性,你可能希望量化它。
要描述自助法的工作原理,假设你的样本中观测值的数量为 。你的估计是基于样本数据的函数,因此:
自助法的伪代码如下:
-
设置自助法样本的数量( )。
-
对于每个样本 :
-
随机选择,带放回地,从你的数据集中选择 行。
-
给定这个自助法样本,计算并保存你的估计:
-
-
使用 B 个估计值计算方差或置信区间。例如,你可以这样计算标准差:
典型用例是当您决定绘制真正的正例率(TPR),将样本分成等距的桶,例如十分位数(参见第六章)。在分类模型中,预期得分能够有效地预测事件的实际发生,这意味着 TPR 应该是得分的非递减函数(得分越高,发生率越高)。
举个具体例子,假设你训练了一个预测客户是否在下个月停止购买的流失模型。你为两位客户预测得分 ŝ[1] = 0.8 和 ŝ[2] = 0.5. 理想情况下,这些应该代表实际概率,但在大多数情况下,得分和概率并不是一一对应的,因此需要进行一些校准。但即使得分不能被解释为概率,如果它们至少在方向上是正确的,也是非常好的,意味着第一个客户更有可能流失。
通过桶绘制 TPR 允许您查看您的模型是否在这个意义上是信息丰富的。但是有个陷阱!由于抽样变异性,单调性实际上取决于所需的粒度。为了看到这个原理的实际效果,图 9-12 展示了五分位数、十分位数和 20 等距桶(20-分位数),以及自举法 95% 置信区间。您可以看到,当我使用五分位数和十分位数时,单调性成立。当您决定将粒度增加到 20 个等距桶时会发生什么?如果您没有绘制置信区间,您可能会得出结论,您的模型有问题(请参见桶 11、15 和 19)。但这都是由于抽样变异性造成的:一旦考虑到这一点,您可以安全地得出结论,这些桶与其邻居之间没有统计学上的差异。

图 9-12. 从分类模型中引导 TPR 的自举
如果您有统计背景,您可能会认为在这个例子中,引导法是不必要复杂的,因为您只需计算每个桶中 TPR 的参数方差,这遵循二项分布(因此对于十分位数,方差可以计算为 ). 通过这种方式,您可以计算参数置信区间。您是对的;引导法在以下情况下最有用:
-
您希望在不做分布假设(即非参数估计)的情况下计算方差。
-
分析计算方差是困难或计算成本高昂的。
主要收获
这些是本章的要点:
没有一种算法能在所有数据集上普遍表现良好。
由于真实世界的数据并非完美,你可能希望检查算法在模拟示例中是否能正确执行。
算法无法解决数据问题。
知道每个训练算法的局限性是至关重要的。此外,如果你的数据存在问题,不要期望算法能够解决它们。
模拟作为理解算法局限性的工具。
在本章中,我展示了几个例子,展示了模拟如何提供对不同算法优缺点的洞察。其他例子可以在本章的存储库中找到(异常值和缺失值)。
局部依赖图是揭示许多机器学习算法黑盒的重要工具。
展示模拟的强大之处,我计算了 PDP,并将其与线性回归和分类的参数进行了比较。
自助法可以帮助你量化估计的精度。
自助法类似于蒙特卡洛模拟,因为你不是从模拟的数据生成过程中抽取重复样本,而是从你的数据集中抽取,并使用这些信息推断一些统计属性。
进一步阅读
模拟领域广泛,本章仅浅尝其基本原理。模拟在贝叶斯统计和生成式机器学习模型中是一个重要工具。关于前者,你可以查阅 Andrew Gelman 等人的《贝叶斯数据分析》第 3 版(Chapman and Hall/CRC Press)。关于后者的一个很好的参考书籍是 Kevin Murphy 的《机器学习:概率透视》(MIT Press)。他还有两个更新版本,我还没有审查,但应该也很棒。
Christian Robert 和 George Casella 的《蒙特卡洛统计方法》(Springer)是蒙特卡洛模拟广阔且复杂领域的经典参考书。请注意,这本书适合技术倾向的读者。
你可以在 Trevor Hastie 等人的《统计学习要素:数据挖掘、推断与预测》第 2 版中找到更多关于自助法的信息(Springer 出版,并且作者网页上在线提供)。你也可以找到关于线性和逻辑回归使用的一些方法的信息。
Khaled El Emam 等人的《实用合成数据生成》(O’Reilly)提供了有关模拟合成数据的一些有用信息。正如我在本章开头提到的,你可以通过对数据生成过程做出假设来模拟数据,或者你可以训练一个模型,该模型可用于生成合成数据集。这本书提供了一些关于如何实现这一点的实用指导。
在逻辑回归中,被遗漏的变量偏差和缺乏鉴定性是非常标准的结果,可以在任何计量经济学教材中找到。例如,参见 William Greene 的《计量经济分析》第 8 版(Pearson 出版)。
在《AI 与数据科学的分析技能》中,我讨论了利用模拟进行杠杆优化。如果你想深入探讨这个主题,斯科特·佩奇的《模型思维者:让数据为你工作的必备知识》(基础图书)是一个很好的参考。同时,还可以参考布赖恩·里普利的《随机模拟》(Wiley)。
¹ 尽管我发现这种方法直观,但这并非计算 PDP 的标准方式。在第十三章中,我将深入讨论这个问题。
² 或者,你可以修剪异常值,并将极端值设定为某些选择的分位数。代码库中的代码允许进行这种设置,这在应用中非常有帮助。
³ 要模拟多项逻辑回归模型,需要使用不同的技术,考虑到逻辑多项模型的一些特性。
⁴ OLS 中的一个关键假设是扰动具有相同的方差(同方差)。相反,异方差扰动具有不同的方差参数,OLS 在非常精确的意义上不再是最优的。加权最小二乘是一种替代 OLS 的方法,当异方差性质可以估计时。
第十章:线性回归:回归基础
线性回归(OLS¹)是大多数数据科学家学习的第一个机器学习算法,但随着更强大的非线性替代方法(如梯度提升回归)的出现,它已经成为一种知识上的好奇心。因此,许多实践者不了解 OLS 的许多对于理解学习算法非常有帮助的属性。本章节介绍了其中一些重要属性,并强调了它们的重要性。
系数中包含了什么?
让我们从只有一个特征的最简单设置开始:
第一个参数是常数或截距,第二个参数是斜率,正如您可能从线性方程的典型函数形式中记得的那样。
由于残差的均值为零,通过偏导数可以看出:
正如在第九章中讨论的那样,第一个方程对于可解释性来说非常有用,因为它表明特征的单位变化与结果的单位变化,平均而言,相关联。然而,正如我将要展示的,您必须小心,不要给它一个因果解释。
通过将结果的定义代入协方差中,您还可以显示:
在双变量设置中,斜率取决于结果和特征之间的协方差,以及特征的方差。由于相关性并非因果关系,您必须谨慎不要将这些因果解释为因果关系。非零协方差可能源自不同的因素:
直接因果关系
如您希望解释的那样( )。
逆因果关系
,因为协方差在参数上是对称的。
混杂因素
混杂因素是任何第三个同时影响x和y的变量,但它们在其他方面无关(图 10-1)。

图 10-1 混杂因素
警告
线性回归的估计提供了关于特征和结果之间相关程度的信息,只能在非常特定的情况下因果解释(参见第十五章)。这个警告同样适用于其他机器学习算法,如梯度提升或随机森林。
对于多重回归,一个更一般的结果适用(即具有多个协变量的回归):
其中是从在所有其他特征(-k)上运行回归的残差中获得的k特征的残差:
对于双变量线性模型,示例 10-1 中的片段显示,线性回归和简化协方差公式在数值上是一致的。
示例 10-1. 验证 OLS 和双变量协方差公式的一致性
def compute_alpha_1feat(ydf, xdf):
"""Compute alpha using var-cov formula and linear regression
for the simple case of y = a + b x
Inputs:
ydf, xdf: dataframes with outcome and feature
Outputs:
Estimated coefficients from two methods: Cov() formula and
linear regression
"""
# Using covariance formula
cat_mat = ydf.copy()
cat_mat['x'] = xdf['x1'] # concatenate [y|x] so I can use the .cov() method
vcv = cat_mat.cov()
cov_xy = vcv['y'].loc['x']
var_x = vcv['x'].loc['x']
beta_vcv = cov_xy/var_x
# using linear regression
reg = LinearRegression(fit_intercept=True).fit(xdf, ydf.values.flatten())
beta_reg = reg.coef_[0]
return beta_vcv, beta_reg
# compute and print
b_vcv, b_reg = compute_alpha_1feat(ydf=ydf, xdf=Xdf[['x1']])
decimals = 10
print(f'Alpha vcv formula = {b_vcv.round(decimals=decimals)}')
print(f'Alpha OLS = {b_reg.round(decimals=decimals)}')
Alpha vcv formula = 3.531180168,
Alpha OLS = 3.531180168
对于多个特征的情况,可以使用以下函数验证更一般的协方差公式是否与 OLS 一致。注意,我首先计算对所有其他特征进行回归后的残差:
def compute_alpha_n_feats(ydf, xdf, name_var):
"""
Compute linear regression coefficients by:
1\. Orthogonalization (Cov formula)
2\. OLS
Inputs:
ydf, xdf: dataframes with outcome and features
name_var: string: name of feature you want to compute
Outputs:
Coefficient for name_var using both methods
"""
# Run regression of name_var on all other features and save residuals
cols_exc_x = np.array(list(set(xdf.columns) - set([name_var])))
new_x = xdf[cols_exc_x]
new_y = xdf[name_var]
reg_x = LinearRegression().fit(new_x, new_y.values.flatten())
resids_x = new_y - reg_x.predict(new_x)
# Pass residuals to Cov formula
cat_mat = ydf.copy()
cat_mat['x'] = resids_x
vcv = cat_mat.cov()
cov_xy = vcv['y'].loc['x']
var_x = vcv['x'].loc['x']
beta_vcv = cov_xy/var_x
# using linear regression
reg = LinearRegression().fit(xdf, ydf.values.flatten())
all_betas = reg.coef_
ix_var = np.where(xdf.columns == name_var)
beta_reg = all_betas[ix_var][0]
return beta_vcv, beta_reg
更一般的协方差公式导致了一个重要结果,称为弗里施-瓦夫-洛维尔定理。
弗里施-瓦夫-洛维尔定理
弗里施-瓦夫-洛维尔定理(FWL)是一个有力的结果,帮助理解线性回归的内在工作原理。它基本上表明,您可以将 OLS 估计解释为控制后的效应,即除去任何特征之间的其他依赖效应。
假设您正在运行一个关于每位客户销售量对其支付价格和状态虚拟变量的回归。如果利益相关者询问您价格系数是否可以解释为不同州定价差异的影响,您可以使用 FWL 定理确切地说这些是净效应。价格效应已经从跨州定价的任何差异中清除(您已经控制了州间的差异)。
为了展示定理,我将再次使用更简单的两特征线性模型,但定理适用于任意数量的回归变量:
FWL 指出,您可以通过两步过程来估计特定系数,比如说:
-
对进行偏离:
-
对在上进行回归,并保存残差: 。
-
对在上进行回归,并保存残差:。
-
-
残差回归:
- 对在上进行回归。斜率是的估计量。
偏离步骤去除了其他回归变量对结果和感兴趣特征的影响。第二步在这些残差上运行双变量回归。由于我们已经去除了x[2]的效应,因此只剩下感兴趣的效应。
示例 10-2 展示了我使用三个特征模拟线性模型的结果,并使用 FWL 的partialling-out方法和普通线性回归估计每个系数。我使用示例 10-2 中的代码片段进行比较。
示例 10-2. 检验 FWL 的有效性
def check_fw(ydf, xdf, var_name, version = 'residuals'):
"""
Check the Frisch-Waugh theorem:
Method 1: two-step regressions on partialled-out regressions
Method 2: one-step regression
Inputs:
ydf, xdf: dataframes with Y and X respectively
var_name: string: name of feature we want to apply the FW for
version: string: ['residuals','direct'] can be used to test
both covariance formulas presented in the chapter
'residuals': Cov(tilde{y}, tilde{x})
'direct': Cov(y, tilde{x})
"""
# METHOD 1: two-step regressions
nobs = ydf.shape[0]
cols_exc_k = np.array(list(set(xdf.columns) - set([var_name])))
x_k = xdf[cols_exc_k]
# reg 1:
reg_y = LinearRegression().fit(x_k, ydf.values.flatten())
res_yk = ydf.values.flatten() - reg_y.predict(x_k)
# reg 2:
new_y = xdf[var_name]
reg_x = LinearRegression().fit(x_k, new_y.values.flatten())
res_xk = new_y.values.flatten() - reg_x.predict(x_k)
res_xk = res_xk.reshape((nobs,1))
# reg 3:
if version=='residuals':
reg_res = LinearRegression().fit(res_xk, res_yk)
else:
reg_res = LinearRegression().fit(res_xk, ydf.values.flatten())
coef_fw = reg_res.coef_[0]
# METHOD 2: OLS directly
reg = LinearRegression().fit(xdf, ydf.values.flatten())
coef_all = reg.coef_
ix_var = np.where(xdf.columns == var_name)[0][0]
coef_ols = coef_all[ix_var]
return coef_fw, coef_ols
cols_to_include = set(Xdf.columns)-set(['x0'])
decimals= 5
print('Printing the results from OLS and FW two-step methods \nVersion = residuals')
for col in ['x1', 'x2', 'x3']:
a, b = check_fw(ydf, xdf=Xdf[cols_to_include], var_name=col, version='residuals')
print(f'{col}: FW two-steps = {a.round(decimals=decimals)},
OLS = {b.round(decimals=decimals)}')
Printing the results from OLS and FW two-step methods
Version = residuals
x1: FW two-steps = 3.66436, OLS = 3.66436
x2: FW two-steps = -1.8564, OLS = -1.8564
x3: FW two-steps = 2.95345, OLS = 2.95345
回到先前提出的协方差公式,FWL 暗示着
其中,表示特征k在所有其他特征上回归后的残差,而表示因变量在相同特征集上的回归残差。Python 脚本允许您测试通用协方差公式的两个版本是否给出相同结果(使用version参数)。
OLS 的一个重要特性是估计残差与回归变量(或回归变量的任何函数)正交,这个过程也被称为正交化。您可以利用这个事实来表明两个协方差公式是等价的。
重要的是,正交化总是必须在感兴趣的特征上进行。如果只对因变量y进行正交化,那么协方差公式将不再有效,除非特征已经相互正交,因此一般而言:
为什么您应该关心 FWL?
我已经呈现了几个正交化结果的版本,所以您应该期望它是相关的。主要的要点是:
您可以将线性回归中的每个系数解释为在清理掉其他任何特征的影响之后的每个特征的净效应。
这里是一个典型的情景,解释起来非常重要:
在这种情况下,对结果y有直接和间接效应。一个例子可能是您的州或地理虚拟变量。这些往往具有直接和间接效应。当您解释的系数时,如果您可以说这是在已经控制了该变量的情况下的净效应,那将非常有帮助。
图 10-2 展示了前述数据生成过程的真实参数、OLS 估计和梯度提升回归(GBR)的部分依赖图(PDP)的模拟结果。由于 FWL,您知道 OLS 将正确捕捉净效应。GBR 在方面做得很好,但在方面则不佳。
要理解正在发生的事情,回想一下如何计算 PDP:将一个特征固定在样本均值,为你关心的特征创建一个网格,并进行预测。当你固定 时, 显示出直接和间接效应的组合,算法不知道如何分离它们。这只是加强了 OLS 在可解释性方面的优势,但需要相当大的努力才能达到即使相对于非线性模型也能很容易得到的性能。

图 10-2. OLS 和具有直接和间接效应的梯度提升
混杂因素
现在我已经描述了 FWL 定理,我想回到混杂因素的问题(Figure 10-1)。假设一个混杂因素( )影响了两个本来不相关的变量:
其中符号 表示统计独立性。使用回归中y对x的斜率系数的协方差公式,就可以明显看出为什么 OLS 显示出虚假结果:
如果你先清理掉那个共同因素呢?这正是 FWL 告诉你线性回归所做的事情,所以你可以安全地运行以下形式的回归:
通过同时包括共同因素w,OLS 将有效地将其效果分离出来。Figure 10-3 展示了估计的双变量和虚假回归结果(左图)以及当你像前述方程式中一样包括第三个因素时的分离版本(右图)。我还包括了 95%置信区间。
如果不控制混杂因素,你会得出x和y确实相关的结论(置信区间远离零),但一旦你控制w,这就成为唯一相关的(统计显著)因素。

图 10-3. FW 和混杂因素的控制(估计值和 95% CI)
这个结果在许多应用中非常有用。例如,在时间序列分析中,拥有趋势稳定 的变量经常可以这样建模:
多亏了 FWL,你已经知道为什么这些被称为趋势稳定:一旦你控制了时间趋势(t以上),从而清理了它们的这种影响,你就得到了一个稳定的时间序列。²
假设你对一个变量进行回归:
由于你没有控制共同趋势,你最终会错误地得出它们相关的结论。Figure 10-4 展示了两个趋势稳定的 AR(1)过程的模拟回归结果,设计上它们是无关的。³ 图显示了第二个变量(y2)的估计截距(常数)和斜率,以及 95%置信区间。

图 10-4. OLS 在虚假时间序列回归上的表现
提示
时间序列常常出现与时间相关的虚假相关性,因为它们通常显示时间趋势。由于它可能作为混杂因素,建议始终包括线性时间趋势作为控制变量。这样你可以清除由此潜在混杂因素引起的任何噪音。
额外变量
第九章 描述了遗漏变量偏差,表明排除本应包含的变量会导致 OLS 估计偏差,从而降低预测性能;这一点同样适用于其他机器学习(ML)算法。
如果不是省略重要变量而是包含额外无关特征会发生什么?OLS 的一个优点是包含无信息特征不会引入偏差,只会影响估计的方差。Figure 10-5 报告了从蒙特卡洛模拟中估计的每个参数的均值和 90%置信区间,其中:
-
只有一个特征是有信息的( ,其真实系数 )。
-
当模型训练时包括了四个更多的无信息控制。
-
训练了两个模型:OLS 和开箱即用的梯度提升回归。
两种算法在两个方面表现正确:它们能够正确估计真实参数,并排除无信息变量。

图 10-5. 包含无信息控制的影响
然而,对于集成学习算法,你必须小心,因为它们在包含高度相关于真实潜在变量的无信息特征时通常非常敏感。你通常可以通过虚拟变量陷阱来看到这一点。这种典型的情况出现在像下面这样有虚拟变量的模型中:
在 OLS 中,当你包括一个截距 和 所有可用类别的虚拟变量时,就会出现虚拟变量陷阱。在这个例子中,你只能为左右利手中的 一个 虚拟变量进行包含,而不能同时包含两者,因为交叉乘积矩阵 是不可逆的(因此 OLS 估计不存在)。⁴ 解决方法是始终省略参考类别的虚拟变量,例如在本例中是右利手类别。
与随机森林或梯度提升回归等集成算法不同,这种计算限制不存在,但由于像D[l]和D[r] = 1 − D[l]这样的虚拟变量完全相关,很正常会发现它们在特征重要性方面排名都很高。因为它们提供完全相同的信息,所以通过包括两者来提升算法的性能是无效的。这是一条有用的直观事实,通过理解 OLS 方法自然产生。
机器学习中方差的中心作用
机器学习中的一个核心原则是,你需要在特征和结果中有变化,这样你的算法才能识别参数,或者换句话说,学习相关性。你可以直接在开头呈现的协方差公式中看到这一点:如果x或y是常数,协方差就为零,因此 OLS 无法学习参数。此外,如果x是常数,分母为零,因此参数不存在,这与虚拟变量陷阱密切相关的结果。
提示
如果你想解释输出的变化,你需要输入中的变化。这对任何机器学习算法都是真实的。
你可能记得在 OLS 中,系数和协方差矩阵的估计值为:
其中是残差方差的样本估计,是包括对应于截距的一向量的特征矩阵。
从这些方程中可以得出两个结果:
识别条件
特征之间不能有完全相关(完全多重共线性),以使交叉乘积矩阵是正定(满秩或可逆)。
估计的方差
特征相关性越高,估计的方差越大。
虽然第一部分应该很简单,但第二部分需要进行一些数学处理,以展示多元回归的一般情况。在这一章节的repo中,我包含了一个模拟,验证了在多元回归情况下这个条件。对于简单的双变量回归,很容易展示估计的方差与特征的样本方差呈负相关,因此具有更多变化的协变量提供更多信息,从而提高估计的精度。⁵
图 10-6 展示了模拟双变量线性 DGP 后 OLS 和梯度提升回归估计的平均值和 95%置信区间,其中 Var(x[1])在一个网格上增加。正如讨论的那样,对于 OLS 来说,估计的方差随着协变量显示更多变化而减少。值得注意的是,对于 GBR 也是如此。

图 10-6. OLS 和 GBR 估计的方差
这个原理在数据科学家中并不罕见的实践中发挥作用。想象一下,您正在运行以下回归:
如果y表示每位顾客的销售额,z表示家庭收入,该模型表明销售额在各州(虚拟变量)之间变化,并且富裕的州也有独立的效应,富裕州购买更多(用每个州的平均家庭收入来代表)。
虽然您的直觉可能是正确的,但由于存在完全多重共线性,您无法用 OLS 训练这个模型。换句话说,州虚拟变量和任何您能想到的州平均值提供相同的信息。对于任何机器学习算法都是如此!
为了验证这一点,我使用刚才讨论的数据生成过程模拟了一个简单的模型,其中包括三个州(因此,为避免虚拟变量陷阱,有两个虚拟变量),这些州从多项分布中抽取(代码可以在repo中找到)。示例 10-3 表明特征矩阵确实是低秩的,意味着存在完全多重共线性。
示例 10-3. 状态虚拟变量:删除状态平均值的影响
# Show that X is not full column rank (and thus, won't be invertible)
print(f'Columns of X = {Xdf.columns.values}')
rank_x = LA.matrix_rank(Xdf)
nvars = Xdf.shape[1]
print(f'X: Rank = {rank_x}, total columns = {nvars}')
# what happens if we drop the means?
X_nm = Xdf[[col for col in Xdf.columns if col != 'mean_z']]
rank_xnm = LA.matrix_rank(X_nm)
nvars_nm = X_nm.shape[1]
print(f'X_[-meanz]: Rank = {rank_xnm}, total columns = {nvars_nm}')
Columns of X = ['x0' 'x1' 'D1' 'D2' 'mean_z']
X: Rank = 4, total columns = 5
X_[-meanz]: Rank = 4, total columns = 4
为了验证更一般非线性算法也具有同样的观点,我对这个同样的模型进行了蒙特卡罗(MC)模拟,用梯度提升回归(没有元参数优化)进行训练,并计算了测试样本的均方误差(MSE),使用完整特征集和去掉多余均值特征后的情况。图 10-7 展示了 MSE 的平均值和 90%置信区间。您可以验证预测性能几乎相同,这是您期望的,因为额外变量未提供额外信息。

图 10-7. 梯度提升 MC 模拟结果
要点
这些是本章的要点:
为什么学习线性回归?
理解线性回归应该帮助您建立一些重要的直觉,这些直觉更普遍适用于其他非线性算法,如随机森林或提升技术。
相关性不等于因果关系。
通常,机器学习算法只提供关于特征与结果相关性的信息。线性回归结果明确,因此在思考其他学习算法时,这应作为您的基准。
Frisch-Waugh-Lovell 定理。
这是线性回归中的一个重要结果,指出估计量可以被解释为在控制剩余协变量之后的净效应。
FWL 和混杂因素。
由于 FWL,你可以通过将其包含在特征集中来控制混杂因素。一个常见的例子是在时间序列分析中,总是良好的做法是控制确定性趋势。这可以防止当结果和特征显示某些趋势时产生虚假结果。
无关变量。
在线性回归中,包含无信息的控制变量是安全的。如果这些变量与信息性特征足够相关,集成学习算法可能对无关变量敏感。你不会偏置你的估计,但这可能导致你得出某个变量具有预测能力的结论,而实际上并非如此。
虚拟变量陷阱。
在线性回归中,始终包括一个截距或常数项是一个良好的实践。如果你包括虚拟变量,必须始终排除一个类别作为参考或基准。例如,如果你包括一个女性虚拟变量,则男性类别作为解释目的的参考。
集成学习中的虚拟变量陷阱。
没有任何规定阻止你为随机森林或梯度提升机中的所有类别包括虚拟变量。但你也不会从中获得任何好处:这些变量提供的信息并不能提高模型的预测性能。
方差对机器学习至关重要。
如果你的特征缺乏足够的方差,你的算法将无法学习到底层数据生成过程。这对于线性回归和一般的机器学习算法都是适用的。
进一步阅读
线性回归在大多数统计学、机器学习和计量经济学教科书中都有涉及。Trevor Hastie 等人的《统计学习的要素:数据挖掘、推断与预测》第二版(Springer)中的处理非常出色。它讨论了逐步正交化回归,这与 FWL 定理密切相关。
Joshua Angrist 和 Jörn-Steffen Pischke 的《大多数无害的计量经济学:经验主义者的伴侣》第三章(普林斯顿大学出版社)提供了关于线性回归基础的深入讨论,以及该章节中所呈现的协方差公式的推导。如果你想加强对回归的直觉,这本书非常适合。
大多数计量经济学教科书都涵盖了 FWL 定理。你可以查阅 William Greene 的《计量经济分析》第八版(Pearson)。
¹ OLS 指的是普通最小二乘法,这是用于训练线性回归的标准方法。为方便起见,我把它们视为等效的,但请记住还有其他可以使用的损失函数。
² 在高层次上,时间序列在其概率分布随时间不变时是平稳的。弱平稳性仅涉及前两个时刻,而强平稳性要求联合分布恒定。趋势变量的均值变化,因此它不能是平稳的(除非是趋势平稳)。
³ AR(1) 表示一阶自回归过程。
⁴ 请记住,OLS 估计量是 。
⁵ 在双变量设置中, 。
第十一章:数据泄露
在《数据挖掘中的泄漏:公式化、检测和避免》一书中,沙哈尔·考夫曼等人(2012)将数据泄露识别为数据科学中十大常见问题之一。根据我的经验,它应该排名更高:如果你已经训练了足够多的现实生活模型,那么你几乎不可能没有遇到它。
本章专注于讨论数据泄露,一些症状以及可采取的措施。
什么是数据泄露?
正如名称所示,数据泄露发生在你用于训练模型的一些数据在你将模型部署到生产环境时不可用,从而导致后者阶段的预测性能不佳。这通常发生在你训练一个模型时:
-
使用在预测阶段不可用的数据或元数据
-
与你想要预测的结果相关
-
这会造成过高的测试样本预测性能
最后一条说明了为什么数据泄露对数据科学家是一种担忧和沮丧的源头:当你训练一个模型时,在没有数据和模型漂移的情况下,你期望测试样本上的预测性能能够在你将模型投入生产后外推到真实世界。如果存在数据泄露,情况就不会如此,你(以及你的利益相关者和公司)将遭受重大失望。
让我们通过几个例子来澄清这个定义。
结果也是一个特征
这是一个简单的例子,但有助于作为更现实例子的基准。如果你像这样训练一个模型:
在训练阶段,你会得到完美的性能,但不用说,当你的模型部署到生产环境时,你将无法进行预测(因为结果在预测时是不可用的)。
结果本身就是一个特征
更为现实的例子是,当一个特征是结果的函数时。假设你想要预测下个月的收入,并且使用在第二章描述的上 P 乘以上 Q 分解包括单位价格()作为一个特征。许多时候,单位价格的计算是在上游完成的,因此你最终只是使用一个包含价格的表,而不真正了解它们是如何计算的。
不良控制
如第十章所述,最好包括一些你认为有助于控制变异源的特征,即使你对底层因果机制没有强烈的假设。一般来说,这是正确的,除非你包括不良控制,这些控制本身受特征影响。
以这些数据生成过程(DGPs)为例:
当训练模型预测y时,你可能会认为控制z可以帮助你清除一些影响。不幸的是,由于在预测时z不可用,并且与y相关,你最终得到一个数据泄漏的非平凡示例。
注意,这里的泄漏是因为使用了预测时不可用的信息,以及包括了错误的控制。如果z在时间上显示足够的自相关性,即使你控制了它的滞后值(),你仍然会有不合理高的预测性能。
时间戳的误标
假设你想测量给定月份的月活跃用户数。一个典型的查询,将产生所需的指标如下所示:
SELECT DATE_TRUNC('month', purchase_ts) AS month_p,
COUNT(DISTINCT customer_id) AS mau
FROM my_fact_table
GROUP BY 1
ORDER BY 1;
在这里,你有效地使用了月初时间戳来标记这些客户,对许多目的来说可能是有意义的。或者,你也可以使用周期结束时间戳来标记它们,这在不同的用例中也可能是合适的。
关键是,如果你错误地认为指标是在你的时间戳建议的时间之前测量的(因此,在实践中,你会使用未来的信息来预测过去),那么标签选择可能会导致数据泄漏。这是实践中经常遇到的问题。
多个数据集具有松散的时间聚合
假设你想使用这样的模型来预测客户流失:
这里有两个假设在起作用:
-
在前一期中减少销售额的客户更有可能流失(他们实际上正在表明他们的参与度下降)。
-
与公司有更深入关系的客户(通过当前使用的其他产品数量衡量)更不容易流失。
泄漏的一个可能原因是当第二个特征包含来自未来信息时,显然下个月与某一产品活跃的客户不可能已经流失。这可能是因为你最终查询数据时使用了如下代码:
WITH sales AS (
-- subquery with info for each customer, sales and delta sales,
-- using time window 1
),
prods AS (
-- subquery with number of products per customer using time window 2
)
SELECT sales.*, prods.*
FROM sales
LEFT JOIN prods ON sales.customer_id = prods.customer_id
AND sales.month = prods.month
问题出在数据科学家在每个子查询中过滤日期时处理得不精细。
其他信息的泄漏
前面的例子处理了数据泄漏,要么是来自特征,要么是来自结果本身。在定义中,我还允许元数据泄漏。下一个例子将帮助澄清这是什么意思。在许多 ML 应用中,将数据标准化的方法如下:
假设你使用来自完整数据集的时刻标准化训练样本,当然包括测试样本。有些情况下,这些泄漏的时刻提供了额外的信息,这些信息在生产中将不可用。在本章的后面我将提供一个示例,展示这种类型的泄漏。
检测数据泄漏
如果您的模型具有过于优越的预测性能,您应怀疑存在数据泄露。不久前,我的团队中的一位数据科学家展示了一个分类模型的结果,其曲线下面积(AUC)为 1!您可能还记得,AUC 的范围在 0 到 1 之间,其中表示完美预测。这显然是非常可疑的,至少可以这么说。
这些完美预测的极端情况非常罕见。在分类设置中,当我获得 AUC > 0.8 时,我会感到怀疑,但您不应将其视为铁板一块的法律。对于我在职业生涯中遇到的问题类别,我发现这种个人启发式方法非常有用和信息性。¹ 在回归设置中,要提出类似的启发法则要困难得多,因为最常见的性能指标,均方误差,从下方受到限制,但它确实取决于您结果的规模。²
最终,检测泄露的最佳方法是将生产模型的实际性能与测试样本性能进行比较。如果后者显著较大,并且您可以排除模型或数据漂移,则应寻找数据泄露的来源。
提示
利用您和组织对手头建模问题的知识来决定何为异常优越的预测性能水平。许多时候,只有在将模型部署到生产环境并获得低于测试样本的性能时,才能检测到数据泄露。
为了展示由数据泄露带来的性能改善,我对前述两个示例运行了蒙特卡罗(MC)模拟。图 11-1 显示了包含不良控制的影响:我分别训练了带有和不带数据泄露的模型,并且图中显示了在 MC 模拟中的均值和 90%置信区间。在不良控制独立于结果时,MSE 约为不包括不良控制时的四分之一。通过存储库中的代码,您可以检查,即使滞后的不良控制也会造成泄露。

图 11-1. 不良控制下的数据泄露
在第二个示例中,我将展示标准化不良和泄露时刻如何影响性能。图 11-2 展示了使用以下 DGP 进行的 MC 模拟的均方误差(MSE)以及 90% 置信区间:³
我使用样本的前半部分进行训练,后半部分用于测试模型。对于泄露条件,我使用完整数据集的均值和标准差对特征和结果进行标准化;对于无泄露条件,我使用每个相应样本(训练和测试)的瞬时。正如以前一样,数据泄露如何人为地提高了性能是非常明显的。

图 11-2. 由于不正确的缩放导致的数据泄露(MSE)
这种类型泄露问题背后的逻辑是什么?我决定加入一个时间趋势,以便在训练时,完整数据集的均值和标准差通知算法结果和特征正在增加,从而提供额外信息,这在模型部署时将不可用。如果没有趋势组件,泄露就会消失,您可以通过仓库中的代码进行检查。
完全分离
在继续之前,我想讨论完全或准完全分离的话题。在分类模型中,由于这种现象,您可能会得到异常高的 AUC 值,这可能会或可能不会表明数据泄露。
完全分离出现在线性分类的背景下(考虑逻辑回归),当特征的线性组合完美预测结果y时。在这种情况下,最小损失函数(许多情况下是对数似然函数的负数)不存在。这通常发生在数据集较小、工作于不平衡数据或者使用连续变量和阈值创建分类结果并将变量作为特征时。在后一种情况下,存在数据泄露。
准完全分离是指特征的线性组合完美预测观察结果的子集。这种情况更为常见,可能是由于包含一个或多个虚拟变量,这些变量组合在一起会创建一个完美预测的观察子集。在这种情况下,您可能需要检查是否存在数据泄露。例如,可能存在一项业务规则,规定只有居住在特定州且有最低任职期的客户才能提供交叉销售。如果包括了任职期和州的虚拟变量,将会出现准完全分离和数据泄露的情况。
让我们通过使用潜变量方法来模拟这种情况,如第九章所述。数据生成过程如下:
其中是一个指示变量,当下标条件适用时取值为 1,否则为 0。
思路很简单:真实的 DGP 是一个具有两个协变量的二项潜变量模型,但我在训练时创建了第三个特征,通过从y[i] = 1 的观测中无替换随机选择。这样我可以模拟不同程度的分离,包括完全分离和无分离的情况( 和 ,分别)。通常,我训练一个逻辑回归和一个梯度提升分类器(GBC),而不进行元参数优化。
我进行了一次 MC 模拟,图 11-3 展示了在所有实验中测试样本上的中位数 AUC 提升,我将所有情况与无分离情况进行了基准测试。您可以看到,相对于基线情况,分离可以使 AUC 增加 10%至 15%,具体取决于是否使用逻辑回归或 GBC。

图 11-3. 准完全分离的 AUC 提升
这里的教训是,在分类设置中,分离增加了 AUC,这可能表明需要进一步检查的数据泄露。
窗口方法
现在我将描述一种窗口方法,可以帮助减少模型中数据泄露的可能性。如前所述,数据泄漏可能出现有许多不同的原因,因此这绝不是一种万无一失的技术。尽管如此,我发现它有助于规范训练模型的过程,并减少一些明显的泄露风险。
起始点是,我将学习过程分成两个阶段:
训练阶段
这是您将样本分成训练和测试等的阶段。
评分阶段
一旦您训练好模型并将其部署到生产环境中,您可以用它来对样本进行评分。可以是逐个预测,比如在线实时评分,或者对较大样本进行评分。
很容易忘记,在机器学习(ML)中,评分阶段至关重要。这么重要以至于我专门在第十二章讨论了需要设置的一些必要属性和流程,以确保该阶段达到最佳状态。现在,只需记住,这个阶段是创造最大价值的地方,因此应被赋予贵族般的地位。
小贴士
在机器学习中,评分阶段起着主导作用,其他所有事情都应设置为最大化该阶段预测质量和及时性。
图 11-4 展示了窗口方法的工作原理。起始点是评分阶段(最底部时间轴)。假设您想在时间 进行预测。这个时间段用来将世界分为两个窗口:
预测窗口
通常你对事件或与事件相关的随机变量感兴趣。为此,您需要设置一个预测窗口,以便事件发生( )。例如,您想预测客户是否会在接下来的 30 天内流失。或者您想预测公司在年初的第一季度的收入。或者您可能想预测客户在阅读或观看书籍或电影后的接下来两周内会对其进行评分。
观察窗口
一旦您定义了评估预测的时间范围,您需要定义要包含多少历史信息以支持您的预测 [ ]。其名称源自于这一点,因为这是我们在评分时观察到的唯一信息。
注意,预测窗口在左侧是开放的设计:这有助于防止数据泄漏,因为它明确分离了您在预测时所观察到的内容。

图 11-4. 窗口方法论
让我们通过一个示例来确保这些概念清楚。我想要训练一个流失模型,预测每个客户在下个月内流失的可能性。由于评分阶段至上,假设我希望今天评分所有活跃用户( )。按照定义,预测窗口从明天开始,到明天后一个月结束。在那时,我必须能够评估客户是否有流失。为了进行这种预测,我将使用最近三个月的信息,这是我的观察窗口。任何特征的转换都限制在这个时间范围内。例如,我可能认为最近的过去很重要,因此我可以计算四周前的每周互动与上周的比率(如果比率大于一,则表示上个月的参与度增加)。
选择窗口长度
您可能想知道是谁选择观察和预测窗口的长度,并考虑了哪些因素。表 11-1 总结了在确定这两个窗口长度时的一些主要考虑因素。
表 11-1. 选择窗口长度时的考虑因素
| 预测 (P) | 观察 (O) | |
|---|---|---|
| 拥有者 | 业务 - 数据科学家 | 数据科学家 |
| 预测表现 | 短期与长期预测的可行性 | 远期过去的相对权重 |
| 数据 | 您可以使用的历史数据 | 您可以使用的历史数据 |
观察窗口的长度由数据科学家选择,主要基于模型的预测性能。例如,最近的过去更具预测性吗?预测窗口主要是通过考虑业务决策的及时性而选择的,因此它应该主要由业务利益相关者拥有。
重要的是要认识到,较长的预测窗口通常风险较小,因为更难出错(例如,在接下来的一千年内预测人工智能的存在与在接下来的两年内)。但在当前数据粒度下,真正短的时间视野可能是不可行的(例如,当您只有每日数据时,预测客户在接下来的 10 分钟内是否会流失)。
最后,预测窗口的长度会影响观察窗口的必要长度。如果首席财务官要求我预测未来五年的收入,我可以使用较短的观察窗口和动态预测(其中连续使用预测作为特征),或者我可以使用足够长的观察窗口来进行这样的英雄般预测。
训练阶段镜像评分阶段
一旦这些窗口在评分阶段被定义,您现在可以准备设置和定义训练阶段。正如您可能从图 11-4 中推测到的那样,训练阶段应该始终与稍后评分阶段的情况相一致:训练阶段的观察和预测窗口与评分阶段的窗口一一映射,并因此受其约束。
例如,通常情况下,您希望使用手头最新的数据来训练模型。由于您需要个时间段来评估您的预测,以及个时间段来创建特征,这意味着您需要将[ ]设为您的训练观察窗口,以及 ( ] 作为您的训练预测窗口。
正式定义这些窗口有助于您约束和限制模型的预期成果。一方面,它确保只使用历史数据进行未来预测,避免常见的泄漏问题。您可以在以下方程中更直接地看到这一点:
实施窗口化方法
一旦定义了这些窗口,您可以通过以下代码段在代码中加以实施:
import datetime
from dateutil.relativedelta import relativedelta
def query_data(len_obs: int, len_pre: int):
"""
Function to query the data enforcing the chosen time windows.
Requires a connection to the company's database
Args:
len_obs (int): Length in months for observation window (O).
len_pre (int): Length in months for prediction window (P).
Returns:
df: Pandas DataFrame with data for training the model.
"""
# set the time variables
today = datetime.datetime.today()
base_time = today - relativedelta(months = len_pre) # t_p - P
init_time = base_time - relativedelta(months = len_obs)
end_time = base_time + relativedelta(months = len_pre)
init_str = init_time.strftime('%Y-%m-%d')
base_str = base_time.strftime('%Y-%m-%d')
end_str = end_time.strftime('%Y-%m-%d')
# print to check that things make sense
print(f'Observation window (O={len_obs}): [{init_str}, {base_str})')
print(f'Prediction window (P={len_pre}): [{base_str}, {end_str}]')
# create query
my_query = f"""
SELECT
SUM(CASE WHEN date >= '{init_str}' AND date < '{base_str}'
THEN x_metric ELSE 0 END) AS my_feature,
SUM(CASE WHEN date >= '{base_str}' AND date <= '{end_str}'
THEN y_metric ELSE 0 END) AS my_outcome
FROM my_table
"""
print(my_query)
# connect to database and bring in the data
# will throw an error since the method doesn't exist
df = connect_to_database(my_query, conn_parameters)
return df
总结一下,窗口方法帮助你强制执行一个最小要求,即你只能使用过去来预测未来。数据泄漏的其他原因可能仍然存在。
我有泄漏现象:现在怎么办?
一旦检测到泄漏源,解决方法是将其删除并重新训练模型。在某些情况下,这很明显,但在其他情况下可能需要大量时间和精力。以下是你可以尝试的一些事项来确定泄漏源:
检查时间窗口。
确保你始终使用过去的信息来预测未来。这可以通过执行严格的时间窗口处理过程来实现,例如刚刚描述的方法。
检查已执行的任何数据转换,并实施最佳实践。
一个好的做法是使用scikit-learn pipelines或类似工具,以确保转换是使用正确的数据集进行的,并且没有泄漏时刻或元数据。
确保你对数据创建背后的业务流程有深入的了解。
对于数据创建过程背后的流程了解得越多,就越容易识别潜在的泄漏源或在分类模型的情况下几乎完全分离的情况。
逐步删除特征。
定期进行诊断检查,以识别最具预测性的特征(在某些算法中,可以通过特征重要性进行此操作)。结合你对业务的了解,这应该有助于确定是否有什么异常。你也可以尝试逐步删除最重要的特征,看看在任何迭代中预测性能是否会显著变化。
关键要点
这些是本章的关键要点:
为什么要关注数据泄漏?
当模型在生产中部署时,数据泄露会导致预测性能不佳,相对于你在测试样本中期望的表现。它会造成组织上的挫败感,甚至可能危及你可能已经获得的任何利益相关者的支持。
识别泄漏。
泄漏的典型症状是在测试样本上具有异常高的预测性能。你必须依靠你对问题的了解以及公司对这些模型的经验。向更有经验的数据科学家展示你的结果并与业务利益相关者讨论总是一个良好的做法。如果你怀疑存在数据泄漏,你必须开始审计你的模型。
如果你怀疑存在数据泄漏,需要检查的事项。
检查是否已经执行了严格的时间窗口处理过程,确保你总是用过去来预测未来,而不是反过来。同时,检查是否存在任何可能泄露时刻或元数据的数据转换。
在机器学习中,得分至关重要。
机器学习模型的试金石是其在生产中的表现。你应该投入所有时间和精力来确保这一点。
进一步阅读
在我看来,大多数关于数据泄露的已发表账户中并没有深入探讨(许多只是顺带提及)。你可以在网络上找到几篇有用的博客文章:例如,Christopher Hefele 在ICML 2013 鲸鱼挑战赛中对数据泄露的评论,或者 Prerna Singh 的文章“机器学习中的数据泄露:如何检测和减少风险”。
Kaufman 等人的“数据挖掘中的泄露:制定、检测和避免”(《ACM 数据挖掘知识发现交易》,2012 年第 6 卷第 4 期)是任何对理解泄露感兴趣的人必读的。他们将数据泄露分类为来自特征和来自训练样本的两种类型。我决定在这个分类上做些偏离。
在完全分离和准完全分离问题上,经典参考文献是 A. Albert 和 J.A. Anderson 的“关于逻辑回归模型中最大似然估计的存在性”(《生物统计学》1984 年第 71 卷第 1 期)。在 Russell Davison 和 James MacKinnon 的《计量经济学理论与方法》(牛津大学出版社)第十一章中可以找到教科书式的阐述。
在因果推断和因果机器学习的文献中,坏控制问题是众所周知的。据我所知,安格里斯特和皮斯克在《大部分无害计量经济学》(普林斯顿大学出版社)中首次将其称为这样。关于更近期和系统的研究,可以参考 Carlos Cinelli 等人的“好控制和坏控制速成课程”(《社会学方法与研究》,2022 年)。在这一章节中,我对坏控制的定义使用了一个相对宽松的版本。
¹ 此外,请记住 AUC 对于不平衡的结果很敏感,因此我的启发式方法确实必须谨慎对待,至少可以这么说。
² 另一个选择是使用决定系数或R2,它也被限制在单位间隔内。
³ AR(1)过程是一个具有一阶自回归分量的时间序列。您可以查看第十章获取更多信息。
第十二章:模型的产品化
正如在 第 11 章 中所讨论的,评分阶段在机器学习(ML)中至关重要,因为这是创造所有价值的部分。它如此重要,以至于新的专门角色——如 ML 工程师和 MLOps——已被创造出来来处理所有涉及的复杂性。然而,许多公司仍然缺乏专门的人才,这项工作最终成为数据科学家职责的一部分。
本章提供了一个面向数据科学家的生产就绪模型的全局视图。在章节末尾,我将提供一些参考资料,带您深入了解这个相对较新的主题。
“生产就绪”意味着什么?
在她的书 设计机器学习系统:用于生产就绪应用的迭代过程(O'Reilly)中,Chip Huyen 指出 产品化 或 运营化 ML 的过程涉及“部署、监控和维护(模型)”。因此,对于已产品化的模型的工作定义是,它已经被部署、监控和维护。
更直接的定义是,模型在被最终用户(无论是人类还是系统)使用前称为生产就绪。通过使用,我指的是利用预测分数,这可以是离线或在线完成,可以由人类或其他系统或服务完成(图 12-1)。

图 12-1。生产就绪模型的分类
批量评分(离线)
典型情况下,批量评分 涉及为表中的一组行(无论是客户、用户、产品还是任何其他实体)创建预测,给定一组列或特征。这些分数保存在表中以供后续使用。
当……时,批量评分是非常常见的:
-
预测性能并没有因为拥有最新的信息而得到极大的提升。
-
您不必使用最新的信息做出决策。
-
您没有工程、基础设施或人才将模型部署到实时消费。
例如,如果您想要预测下个月客户的流失情况,那么在过去一分钟内详细了解他们的互动可能不会显著提高预测的质量,因此批量评分是生产化模型的合适方法。
表 12-1 展示了这些分数保存在表中的示例。请注意,表的粒度是 customer_id x timestamp,因此您有效地保存了所有客户的预测历史。
表 12-1。具有批量评分的表格示例
| Customer_id | Score | Timestamp |
|---|---|---|
1 |
0.72 |
*2022-10-01* |
1 |
0.79 |
*2022-11-01* |
2 |
0.28 |
*2022-10-01* |
2 |
0.22 |
*2022-11-01* |
… |
… |
… |
这种设计对于人类的消费可能效果很好,因为可以在分析数据库上使用简单的 SQL 查询来检索数据;而且,如果将其作为数据模型的一部分(例如您的数据仓库),还可以用来创建可能需要的更复杂的查询。图 12-2 展示了如何简化地实现这一点的示例。它展示了两个事实表,一个包含来自一个特定 ML 模型的分数,另一个来自业务(如销售),以及几个维度表。事实表与维度表之间的链接表示可以使用主键或外键进行连接。将评分层设计为数据仓库的一部分可以促进其消费,因为它允许轻松进行连接和过滤。

图 12-2. 您的 ML 分数作为数据仓库的一部分
这种设计在系统或服务消费时也可以使用,当延迟不是主要考虑因素时。典型的用例是评分触发与客户的通信(例如保留或交叉销售活动)。管道首先查询数据库,可能会过滤出最近的顶级评分,并将这些客户 ID 发送到一个通信应用程序,该应用程序发送电子邮件或短信(图 12-3)。

图 12-3. 系统消费分数的管道
实时模型对象
实时模型通常不以表格形式存储,而是作为序列化对象,可以在新数据到达时在线消费。图 12-4 展示了这个过程的工作原理:您的模型存储在一个模型存储中,可以是一个 S3 存储桶,也可以是更专业的工具,如MLflow或AWS SageMaker。
重要的是,这些对象可以被另一个服务消费,该服务为一个特定示例(如客户或交易)提取最新数据以创建单个预测分数。如图所示,一个示例的特征向量通常包括实时数据和批处理数据。特别重要的是,向量必须与训练模型时使用的完全匹配。

图 12-4. 在线评分示例
从这张图表中,您已经可以看到在线评分中出现的复杂性:
数据架构
您的数据模型应允许查询实时和批处理数据,因此您可能需要类似lambda 或 kappa架构的东西。
函数即服务(Function as a Service,FaaS)
你的设计还应该能够即时处理数据和模型对象,这通常通过云计算提供商的 FaaS 和微服务架构实现。一旦生成分数,这很可能会被另一个服务消耗,例如根据分数和业务规则做出决策。
数据和模型漂移
一种理解机器学习的方式是,你试图学习给定一些数据的结果的数据生成过程(DGP)。当这样做正确时,你可以从类似的数据进行预测:
第一个方程表示将结果变量与一组真实的潜在协变量(W)联系起来的真实数据生成过程(DGP)。第二个方程显示了使用给定时点可用的数据学习这个 DGP 的过程,包括结果(y)和特征(X)。请注意,特征集合不必与真实的潜在协变量完全重合。
由于评分居首位,你在每次进行预测时都应该真正关心预测质量。模型的表现会因为两个主要原因而随时间而变化:数据漂移或模型漂移。当你的数据联合分布随时间改变时,会出现数据漂移。当底层数据生成过程(DGP)发生变化时,则会出现模型漂移。如果你不定期重新训练模型,数据或模型漂移将导致预测性能下降。因此,你应确保在生产流程中包含适当的监控以及定期重新训练。
许多人最初难以理解模型漂移,所以让我用两个例子来解释这个概念。假设你想尝试 伽利略的倾斜塔实验 的一个版本,其中你从选定的高度释放静止的网球,并测量它击中地面所需的时间。你收集高度和时间的测量值 ,并估计一个线性回归模型,如下所示:
真实的数据生成过程由物理定律决定,具体取决于重力的表面力量,因此如果你在火星或地球上进行实验,这个过程将有所不同。¹
另一个更接近业务的例子涉及趋势和影响因素。冒着过度简化的风险,让我假设某个客户 i 购买你的产品的概率取决于其价格和其他东西:
这是客户i的 DGP,我不知道,但我敢打赌,如果突然之间Jungkook开始在社交媒体上推广它,可能会发生变化。特别是,我预计喜欢韩国流行音乐并追随他的客户群体在该段落中对价格的敏感性将会降低。旧的 DGP 已漂移到类似于 。
任何生产流水线中的基本步骤
Figure 12-5 展示了大多数 ML 流水线应包括的最少步骤。根据第十一章的建议,我为评分和训练阶段设置了单独的任务,但它们共享了几个阶段。我还使用较浅的灰色来表示用于监视目的的元数据存储阶段。现在我将更详细地描述每个阶段。

图 12-5. 通用生产流水线
获取和转换数据
如名称所示,get_data()阶段创建连接并查询数据源;在获得原始数据后,transform_data()步骤对表格的一个或所有列应用预定义的内存转换。第一个方法通常基于 SQL,而后者可以使用 Python(或 Spark)运行。
虽然我已经将两个阶段分开,但根据问题的性质,将它们合并为一个唯一的阶段可能是明智的选择。让我们考虑建立这种模块化分离的利弊。
尽管模块化通常是一种良好的做法——可以实现更清洁、更快速的调试和数据以及模型治理——但它可能会带来计算成本或限制,这些问题可以通过将推动这两个操作到查询引擎中更好地解决。这一点尤为重要,因为查询引擎通常经过优化和配置以处理大型数据集,而你可能最终只能拿到较少的资源来转换实际所需的小数据子集。
另一方面,SQL 很适合查询表格数据,但可能无法提供足够的灵活性来创建复杂的转换,这些转换使用 Python 或 Spark 更容易实现。
此外,分离允许进行全面集中和独立的转换阶段。这很重要,因为特征工程在开发性能优越的 ML 模型中扮演了至关重要的角色。因此,模块化允许更全面地记录和审查模型的主要转换过程。
最后,将每个阶段分解为独立模块非常有利于加快代码审查进程,从而缩短部署周期。
提示
如果您的内存受限以进行某些转换,但查询引擎可以执行高内存计算,有时推送一些或全部转换到查询阶段是明智的选择。
您可能会合理怀疑这些阶段被训练和评分流水线共享,解释了我为什么决定使用类似函数的符号。如果您使用窗口化方法,例如在第 11 章中描述的方法,get_data()方法可以轻松地参数化以查询给定时间窗口的数据。
在训练流水线的transform_data()阶段的输出是训练模型所需的最终数组;对于监督学习,它可能是这样的:
transform_data(get_data(Data))⇒
对于评分数据,它只是特征数组 。
验证数据
这是每个流水线的首个监控阶段,用于存储元数据并在数据漂移出现时发出警报。此阶段可分解为两个子阶段:
-
计算并保存统计信息。 为输出和特征的分布计算一组预定义的统计信息,并保存在表中。
-
检查数据漂移。 鉴于刚刚保存的当前和历史统计信息,运行测试以查看变化是否纯粹是噪声还是信号。输出应该是创建警报或不创建。
表 12-2 展示了一个存储公司所有模型分布元数据的表格示例。此表可用于存储所有模型的结果和特征的十分位数,并且适用于训练和评分阶段,通过应用筛选器进行报告、测试和监控非常方便。
表 12-2. 带有十分位数的表格示例
| Model | Stage | Metric | Decile | Value | Timestamp |
|---|---|---|---|---|---|
churn |
training |
outcome |
d1 |
100 |
*2022-10-01* |
… |
… |
outcome |
… |
… |
… |
… |
… |
outcome |
d10 |
1850 |
*2022-10-01* |
churn |
training |
feature1 |
d1 |
-0.5 |
*2022-10-01* |
… |
… |
feature1 |
… |
… |
… |
… |
… |
feature1 |
d10 |
1.9 |
*2022-10-01* |
… |
… |
… |
… |
… |
… |
在这个示例中,我选择保存数据集中每个变量的十分位数,因为它们捕捉了相应分布中的大量信息。
对于测试,有许多替代方案。如果您有足够的历史记录,并希望遵循传统的假设检验路线,您可以对每个指标和十分位数( )运行回归测试,例如:
其中,作为特征的t表示时间趋势:如果的p值低于所需的阈值(10%,5%,1%),则可以拒绝参数为 0 的原假设,因此您有指标m漂移的证据。
或者,您可以使用类似于在第九章中使用的非参数检验,在历史分布中计算上下分位数,并检查新观察是否落在该置信区间内(例如,计算 95%置信区间,您计算)。
有些人更喜欢运行Kolmogorov-Smirnov测试,因此您可能需要保存不同的元数据集,但逻辑相同。
提示
无论您决定使用什么,我的建议是保持简单。通常,您只需要一个绘制这些元数据的仪表板,这样您就可以设置简单的警报,以便在发生变化时收到通知。
当您将模型投入生产时,通常简单就是更好的选择。
训练和评分阶段
一旦您的训练数据准备好,您可以继续正式的训练过程,通常会执行以下操作:
-
将样本分为训练、测试和验证子样本。
-
优化元参数并最小化损失函数。
train_model()阶段的输出是一个可以用于预测目的的模型对象:
train_model(transform_data(get_data(Data)))⇒
同样,score_data()方法使用一些特征X来创建预测或分数:
score_data(transform_data(get_data(Data)), f())⇒
如前所述,这个分数可以保存在表格中供离线使用,或传递给另一个服务进行在线使用。
验证模型和分数
在继续之前,最好再次保存一些元数据,以帮助创建模型或数据漂移的警报。在这个阶段,我喜欢在validate_data()中创建相同的元数据,但只传递测试样本分数(validate_model())或实际分数(validate_scores())。如果您沿着这条路走,您实际上复用了之前的方法,只是在不同的阶段和管道中传递了不同的数据集;其他所有工作都已经处理好了(例如更新元数据表和发送警报)。
请注意,对于在线使用,您需要收集足够的验证数据,但逻辑本质上是相同的。
部署模型和分数
正如名称所示,这些阶段的目标是保存模型和分数。对于训练管道,您需要序列化模型对象,并使用某种持久存储(如磁盘、S3 存储桶等)保存它。采用良好的 命名 和 版本控制 约定有助于对模型进行目录管理。
模型序列化的主题非常重要且技术性强,因此我会在本章末提供更多参考资料。
分数的部署取决于消费是线下还是线上的。在线下评分中,您只需将分数写入表中以便消费。在线上评分中,您不仅应该使分数可供其他服务消费,还应该将其存储在表中。
关键要点
以下是本章的关键要点:
分数至关重要。将您的模型投入生产应该是您的首要任务,因为只有有效的模型才能为组织创造价值。
什么是生产就绪?
模型在可消费时才能产生生产力。由于模型通常会在不同的时间段内被消费,您必须创建一个过程来确保模型具有持久的预测性能。
模型和数据漂移。
当您的结果生成过程发生变化时,就会出现模型漂移。数据漂移是指结果或特征分布发生变化。如果不加处理,数据和模型漂移将导致模型的预测性能逐渐下降。避免漂移的最佳方法是定期重新训练您的模型。
生产管道。
为您的生产管道设置一个最小结构是很有好处的。在这里,我建议拥有模块化和独立的训练与评分管道,它们共享一些方法或阶段。至关重要的是,您应包含创建和存储元数据的阶段,这些元数据将在模型或数据漂移时向您发出警报。
保持简单。
将生产部署的复杂步骤简化是推荐的做法,因为不必要的复杂性可能会逐渐增加,使得在出现问题时(而问题肯定会出现)很难找到问题的根源。
进一步阅读
Chip Huyen 的 Designing Machine Learning Systems 由行业专家编写,非常出色,提供了本章未涵盖的许多关键技术细节。我强烈推荐这本书。
我发现 Valliappa Lakshmanan 等人的《Machine Learning Design Patterns: Solutions to Common Challenges in Data Preparation, Model Building, and MLOps》(O’Reilly)非常有用。其目的是综合一套可以在各个领域使用的机器学习设计实践。由于这本书是由三位 Google 工程师撰写的,你会发现他们的例子大量依赖于 Google 的基础设施,因此有时不太明显如何将其转换为其他云服务提供商的环境。但如果你能抽象出这些细节,你会发现这本书非常值得一读,是一本很好的资源。
Kurtis Pykes 的博客文章"5 种保存机器学习模型的不同方法"讨论了不同的序列化机器学习模型的方法。
Lu 等人的文章"Learning under Concept Drift: A Review"),全面回顾了概念漂移,有时包括数据漂移和模型漂移的情况。
关于 Zillow Offers 模型漂移案例,你可以阅读 Jon Swartz(2021 年 11 月)的MarketWatch文章,"Zillow 将停止房屋翻转业务,预计将亏损超过 5.5 亿美元,裁员四分之一",或 Anupam Datta(2021 年 12 月)的"AI 模型漂移的危险:从 Zillow Offers 案例中学到的教训"(The AI Journal)。
¹ 请回忆在恒定速度和加速度下 ,其中 是地表重力。在Mars,重力的力量是地球的约 38%。
第十三章:机器学习中的讲故事
在第七章 中,我主张数据科学家们应该成为更好的讲故事者。这在一般情况下是正确的,但在机器学习领域尤为重要。
本章将带你深入了解机器学习中讲故事的主要方面,从特征工程开始,到可解释性问题结束。
机器学习中讲故事的整体视角
讲故事在机器学习中扮演着两个相关但不同的角色(图 13-1)。较为熟知的是销售人员的角色,在这个角色中,你需要与观众互动,可能是为了获得或维护利益相关者的支持,这个过程通常是在你开发模型之后进行的。较少人知的是科学家的角色,在这个角色中,你需要找到假设,这些假设将指导你在开发模型过程中的全程。

图 13-1. 机器学习中的讲故事
因为前者是在你开发模型之后进行的 ex post 讲故事,我称之为销售人员角色;而科学家角色主要是在训练模型过程中的 ex ante 和 interim 阶段。
Ex Ante 和 Interim 讲故事
Ex ante 讲故事有四个主要步骤:定义问题、创建假设、特征工程和训练模型(图 13-2)。虽然它们通常按照这个顺序进行,但在它们之间存在反馈循环,因此在训练第一个模型后,经常需要对特征、假设甚至问题本身进行迭代。

图 13-2. Ex ante 讲故事
第一步始终是问题定义:你想预测什么,为什么?最好早期与利益相关者合作完成这个过程,确保他们支持,因为很多有前景的机器学习项目因此而失败。
请回想第十二章 中提到的,只有在模型部署到生产环境中时,它才能算是一个好模型。将模型部署到生产环境是一项昂贵的工作,不仅在时间和精力上,还有机会成本上。因此,时常自问:我真的需要为这个项目实施机器学习吗?不要陷入只因为它很吸引人或者有趣而做机器学习的陷阱中:你的目标始终是创造最大的价值,而机器学习只是你工具箱中的一种工具。
最后,在问题定义阶段,不要忘记对以下问题有清晰的答案:
-
这个模型将如何被使用?
-
从模型预测中可以拉动的杠杆是什么?
-
它如何提升公司的决策能力?
对这些问题有明确的答案将有助于开发机器学习模型的商业案例,从而增加成功的可能性。
提示
作为一般建议,尽早让利益相关者参与问题的定义是有益的。这有助于从一开始就获得利益相关者的支持。还要确保 ML 是解决手头问题的合适工具:部署、监控和维护模型成本高昂,因此您应该有一个良好的业务案例支持它。
创建假设
有了一个明确定义的问题,您现在可以切换到科学家的角色,并开始为手头的问题创建假设。每个假设都是关于您预测驱动因素的故事;正是在这种特定意义上,科学家也是讲故事者。成功的故事可以提高您模型的预测性能。
此时的关键问题是:我在预测什么,以及什么驱动了这一预测?图 13-3 展示了预测问题类型的高级概述,以及它们与您可以操作的杠杆的关系。了解这些杠杆对于确保 ML 模型创造价值至关重要(第一章)。

图 13-3. 杠杆-行为-指标流程
因此,从这里可以得出结论,大多数预测问题可以归为以下几类:
人类行为产生的指标
许多时候,您关心的指标取决于客户以某种特定方式行动。例如,我的用户会点击横幅吗?他们会以参考价格购买产品吗?他们会在下个月流失吗?他们会在市场上花费多少时间?
系统行为产生的指标
指标还取决于系统的表现。其中最为人熟知的一个例子是数据中心优化,尤其是解决空气冷却问题。另一个例子是预测您的网页加载时间,已经发现直接影响流失指标。
下游指标
许多时候,您只关心汇总的下游指标,比如收入。这在直接从事财务规划与分析(FP&A)的数据科学家中最为常见。
提示
许多数据科学家在创建和设计有预测性的特征的过程中感到困难。一个通用的建议是始终首先写下并与他人讨论预测问题的假设列表。只有在此之后,您才应该继续进行特征工程的过程。不要忘记写下您认为假设可能正确的原因。只有有了这样的理由,您才能挑战自己的逻辑,并改进给定的故事。
为了为您的问题提出假设,有一些高层次的建议:
很好地了解您的问题。
构建出色的 ML 模型的不太秘密的关键是具有深厚的领域专业知识。
要保持好奇心。
这是使数据科学家成为科学家的一个定义性特征。
挑战现状。
不要害怕挑战现状。这包括挑战你自己的假设,并在需要时进行迭代(请注意你是否有任何确认偏见的迹象)。
话虽如此,让我们进一步具体推荐如何进行你的假设发现和制定。
预测人类行为
对于预测人类行为,始终记住人们做他们想做和能做的事情。你可能想去意大利,但如果你负担不起(无论是金钱还是时间),你就不会去。口味和资源的可用性在你想预测人类行为时是至关重要的一级重要因素,这可以帮助你解决问题的假设。
思考动机也会迫使你非常认真地思考你的产品。例如,为什么有人会想购买它?价值主张是什么?哪些顾客愿意为此付费?
另一个技巧是利用你与顾客的共情能力;问问自己如果你是他们会做什么?当然,能够轻松置身于他们的角色中的情况越容易越好(对我来说,很难置身于意见领袖或职业拳击手的角色)。这个技巧可以带你走得更远,但请记住,你可能不是你典型的顾客,这就引出了下一个技巧。
起初,你至少要力求理解并模拟普通顾客。首先,你应该正确获取一阶效应,也就是说,对分析单元的平均建模将为你带来相当多的预测性能。我见过许多数据科学家开始假设边角案例,这些案例定义上对整体预测性能几乎没有影响。边角案例很有趣也很重要,但对于预测来说,从平均案例开始几乎总是更好的选择。
预测系统行为
一些先前的评论也适用于预测一个系统。主要区别在于,由于系统缺乏目的或知觉,你可以限制自己理解技术瓶颈。
显然,你必须掌握系统的技术细节,你对物理约束了解得越多,制定假设就会越容易。
预测下游指标
下游指标的预测比预测由人类或系统行为产生的单个指标更难也更容易。它更难是因为指标与基础驱动因素的距离越远,你的假设就越弱和更加扩散。此外,它还继承了关于这些驱动因素故事的困难,其中一些可能会复合并创建更高层次的复杂性。
尽管如此,许多时候你可以做些手势,利用时间和空间的相关性创建一些特征。在某种意义上,你接受任何你提出的故事都会被时间序列和空间自回归模型中常见的简单自回归结构击败。
特征工程
一般来说,特征工程的过程涉及将假设转化为可测量变量,这些变量具有足够的信号来帮助你的算法学习数据生成过程。将这个过程拆分为几个阶段是一个好的做法,如图 13-4 所示。

图 13-4. 特征工程流程
特征工程的阶段包括:
创建一组理想特征。
第一步是将你的假设转化为理想特征,如果你能够精确地测量所有内容的话。这一步非常重要,因为它可以为第二阶段奠定基础。
一个例子是意图性对早期流失的影响,定义为那些只试用产品一次就离开的顾客。一个假设是这些顾客实际上并不打算使用该产品(因为他们只是试用,或者销售是强制性的,或者存在销售欺诈等)。如果你能问他们并得到真实回答那该多好啊?不幸的是,这不现实也不可实现。
用现实特征来近似理想特征。
如果你意识到理想的特征集不可用,你需要找到良好的代理特征,即与理想特征相关的特征。许多时候,相关程度可能非常低,你需要接受包含与原始假设之间联系非常弱的控制变量。
后者的一个例子是文化如何影响你的口味,从而影响你购买产品的可能性。例如,可能有文化差异解释为什么来自不同国家的用户决定接受或拒绝其浏览器中的 cookie(一些国家的人可能更加敏感于分享这些信息)。不用说,测量文化是困难的。但如果你怀疑国家层面的变化会捕捉到文化假设变化的大部分,你只需要包含国家虚拟变量即可。这是一个相对弱的特征集,因为这些将代理这一级别的任何特征,而不仅仅是文化(例如,法规环境的差异)。
转换特征。
这是通过对特征应用一系列变换来从中提取最大信号量的过程。请注意,我与文献稍有不同,因为大多数有关特征工程的教材只专注于这一阶段。
这个阶段涉及转换,比如 缩放、二值化和独热编码、缺失值的填补、特征交互 等等。我在本章的末尾提供了几个参考文献,您可以查阅其中丰富的变换方法。
重要的是,变换取决于你的数据 和 所选算法。例如,使用分类和回归树时,你可能不需要自己处理异常值,因为算法会替你处理。同样地,对于通常的非线性算法,比如树和基于树的集成,你不需要包括乘法交互。
事后叙事:打开黑匣子
事后叙事的问题主要在于理解为什么你的模型做出这样的预测,什么是最具预测性的特征,以及这些特征如何与预测相关。你想向观众传达的两个主要观点是:
-
模型是逐步预测的,也就是说,预测误差低于基准替代方案。
-
模型 有意义。一个好的做法是开始讨论假设,它们是如何被建模的,以及它们如何与结果一致。
一般来说,一个模型是 可解释的,如果你能理解驱动其预测的因素。局部 可解释性旨在理解特定预测,比如为什么一个客户被认为极有可能在信用上违约。全局 可解释性旨在提供对特征如何影响结果的总体理解。这个主题值得一本书的详细介绍,但在本章中,我只能深入探讨更实际的问题,具体来说,我只会介绍实现全局可解释性的方法,因为我发现这些方法对叙述目的最有用。
警告
在打开黑匣子之前,请确保你的模型具有足够的预测性能,并且没有数据泄漏。你需要投入足够的时间和精力进行事后叙述,所以最好从一个良好的预测模型开始。
此外,当展示性能指标时,尽量使其与你的观众尽可能相关。常见的指标,如均方根误差(RMSE)或曲线下面积(AUC),对于你的业务利益相关者来说可能是神秘的。通常值得努力将它们转化为精确的业务结果。例如,如果你的 RMSE 降低了 5%,业务会变得更好吗?
解释性与性能的权衡
可以说,理想的机器学习算法既高效又可解释。不幸的是,通常在解释性和预测性能之间存在一种权衡,因此如果你希望达到更低的预测误差,你必须放弃对算法内部发生的事情的部分理解(图 13-5)。
在光谱的一端,通常被认为具有高可解释性但预测性能不佳的线性模型。这一集合包括线性回归和逻辑回归,以及非线性学习算法,如分类和回归树。在光谱的另一端是更灵活、通常高度非线性的模型,如深度神经网络、基于树的集成和支持向量机。这些算法通常被称为黑匣子学习器。目标是打开黑匣子,更好地理解发生的情况。

图 13-5. 解释性与性能的权衡
在继续之前,并不明显您需要解释结果,所以让我们简要讨论为什么您可能希望这样做:
采用和认同
许多人需要了解为什么做出预测,以便将其接受为有效,从而采用它。这在不习惯机器学习方法的组织中最为常见,决策通常是基于准数据驱动方法,其中包括大量直觉。如果您能够为他们打开黑匣子,可能会更容易让您的利益相关者接受您的结果并赞助您的项目。
低现实世界预测性能
打开黑匣子是检测和纠正数据泄漏等问题的最有效方法之一(见第十一章)。
道德和法规要求
在某些行业中,公司确实需要解释为什么会做出某些预测。例如,在美国,平等机会法授权任何人询问为何拒绝授信。欧洲的一般数据保护条例(GDPR)也有类似的标准。即使您没有这样的要求,您可能希望通过打开黑匣子来验证预测和后续决策是否符合最低道德标准。
线性回归:设定一个基准
线性回归为理解可解释性提供了一个有用的基准(另见第十章)。考虑以下简单模型:
通过对底层数据生成过程做出强线性假设,您将立即得到:
效果方向性
每个系数的符号告诉您特征在控制所有其他特征后与结果正相关还是负相关。
效果大小
每个系数被解释为每个特征变化一个单位时结果变化的大小,其他特征保持不变。重要的是,在没有进一步假设的情况下不能给出因果解释。
本地可解释性
通过前两个项目,您可以断定为什么会做出任何个别预测。
一些数据科学家犯了一个错误,他们对系数的绝对大小给予了相对重要性的解释。要看出这种方法不起作用的原因,请考虑以下模型,其中收入被表达为销售团队规模和付费营销支出(搜索引擎营销或 SEM)的函数:
这意味着,平均而言,保持其他因素不变,每额外:
-
销售执行人员与收入增加 $1,000 相关。
-
每花费一美元在搜索引擎营销(例如在谷歌、必应或 Facebook 广告上的出价)上,与收入增加 50 美分相关。
你可能会倾向于认为增加销售人员比增加付费营销支出更重要,对你的收入更有利。不幸的是,这是一个不同单位的比较,就像是苹果和橙子。一个将所有特征标准化的技巧是在标准化特征上进行回归分析:
请注意,标准化变量的回归系数通常与原始模型中的系数不同(因此希腊字母不同),因此具有不同的解释:通过标准化所有特征,你用标准偏差的单位(无单位 是更好的术语)来衡量所有事物,确保你在进行苹果对苹果的比较。然后,你可以说类似于: 比 更重要,因为在 的一个额外标准偏差增加比在 的相应增加带来更多的收入*。
这里的诀窍是找到一种方法将原始单位转换为一个通用单位(在本例中是标准偏差)。但任何其他通用单位也可以起作用。例如,假设每增加一个销售执行人员平均每月成本为 5,000 美元。由于营销支出已经以美元计量,你最终得出结论,平均每额外花费一美元在:
-
销售执行人员与收入增加 20 美分相关。
-
付费营销与收入增加 50 美分相关。
尽管最后这种方法也有效,但标准化是一种更常见的方法,用于找到所有特征的通用单位。需要记住的重要事情是,现在你能够排名各个特征,有意义地进行比较。
图 13-6 绘制了一个带有两个零均值、正态分布特征( )的模拟线性模型的估计系数,以及 95% 置信区间,与前述方程式相同。特征 是与 相关但与结果无关的附加变量。重要的是,我将真实参数设置为 和 。这样做有两个效果:
-
它增加了第二特征的信噪比,从而使其更具信息性。
-
它增加了真实系数:¹ 。

图 13-6. 线性与标准化特征的回归
通过标准化这两个特征,显然第二个特征在重要性上排名较高,正如之前定义的那样。由于置信区间的存在,你还可以得出结论,最后三个特征并不具有信息性。在统计方法之外的另一种选择是使用正则化,例如 Lasso 回归。
特征重要性
许多时候,你希望根据某种客观的重要性度量对特征进行排名。这对前瞻性和事后叙事目的都很有用。从事后的角度来看,你可以说:“我们发现交易时间是欺诈的最重要预测因子”,这可能有助于你销售模型的结果,并为你和你的听众带来潜在的顿悟时刻(也见 第 7 章)。
从前瞻角度来看,通过一种按重要性对特征进行排名的方法可以帮助你对假设或特征工程进行迭代,或者提高你对问题的理解。如果你有深思熟虑的假设,但结果看起来可疑,那么更有可能是在特征工程方面出现了编程错误,或者有数据泄漏。
早些时候,我在线性回归中使用标准化特征得出了一个可能的重要性排名:
线性回归中的标准化特征重要性
如果x的一个标准差增加与结果的绝对值变化更大相关,那么特征x就比特征z更重要。
或者,重要性可以根据每个特征对手头预测问题的信息量来定义。直观上,特征的信息量越高(针对给定结果),如果包含该特征,则预测误差就越低。存在两种常用的按此途径的度量标准:
基于不纯度的特征重要性
从节点不纯度的角度来看,如果选择x作为分割变量的节点导致的预测误差相对改进大于z的相应增加,则特征x比特征z更重要。
排列重要性
如果对x值进行排列时性能损失的相对大小大于z的话,那么特征x比特征z更重要,从排列的角度看。
请注意,基于不纯度的特征重要性 仅适用于基于树的机器学习算法。每次使用一个特征分割节点时,性能改进都会被保存,因此最终你可以计算各个特征的改进占总体改进的比例。在集成模型中,这是所有生成树的平均值。
另一方面,排列重要性 适用于任何机器学习算法,因为你只需对每个特征的值进行洗牌(多次,就像启发法样本集程序中一样),然后计算性能损失。直觉是真实顺序对重要特征更重要,因此值的排列应该会导致性能损失更大。
图 13-7 显示了使用与之前相同的模拟数据集训练的梯度提升回归(不进行元参数优化)得出的排列和基于不纯度的特征重要性,以及 95% 置信区间。排列重要性的置信区间是使用 scikit-learn 提供的均值和标准差进行参数计算(假设正态分布)。我使用自助法获得了基于不纯度特征的类似区间(参见第九章)。

图 13-7. 使用梯度提升回归的模拟模型的特征重要性
热图
热图非常易于计算,通常在直观显示每个特征与预测结果之间的相关性方面表现良好。这对于说出诸如 当 x 增加时,y 会下降 这样的假设非常方便。许多假设在方向上陈述,因此快速测试它们在实践中是否成立非常有用。计算它们的过程如下:
-
将预测结果(回归)或概率(分类)分成十分位数或其他任何分位数。
-
对于每个特征 和分位数 d,计算该桶中所有单位的平均值: 。
这些可以按照列中的十分位数和行中的特征进行表格排列。通常最好使用某种重要性度量来排序特征,这样可以首先关注最相关的特征。
图 13-8 展示了在之前的模拟示例上训练的线性回归的热图,特征已按重要性排序。仅通过检查每个特征(行)的相对色调,你可以轻松识别任何模式或其缺失。

图 13-8. 上一个模拟示例的特征热图
例如,如预期的那样, 与结果呈正相关,因为模拟中的真实系数等于一。低分位数的单位平均减少了 -3.58 个单位,而这在最高分位数中逐渐增加到平均值为 4.23 个单位。
检查 的行显示了热图存在的主要问题:它们仅呈现双变量相关性。真实的相关性是正的( ),但热图未能捕捉到这种单调性。要理解原因,请注意 和 是 负相关 的(图 13-9)。然而,第二个特征具有更大的方差,因此在最终预测结果(和十分位数)的排序中具有更多的预测能力。这两个事实破坏了对第二个特征预期的单调性。

图 13-9. x[2] 和 x[1] 是负相关的
部分依赖图
使用部分依赖图(PDPs),你可以逐个更改一个特征而固定其他所有内容来预测结果或概率。由于与线性回归中的偏导数相似,这一方法非常吸引人。
在第九章中,我使用了以下方法计算 PDPs,非常接近捕捉这种直觉。首先计算所有特征的均值,然后为要模拟的特征创建大小为G的线性网格,并将所有内容组合成以下形式的矩阵:
然后,你可以使用这个矩阵来使用你的训练模型进行预测:
这种方法快速且直观吸引人,同时还允许你快速模拟特征之间的相互作用的影响。但是从统计学角度来看,它并不完全正确,因为函数的平均值通常与在输入的平均值上评估的函数不同(除非你的模型是线性的)。其主要优势在于只需要评估一次训练模型。
正确的方法——以及scikit-learn用于计算 PDPs 的方法——对于网格中每个值g需要N(样本大小)次训练模型的评估。然后对这些评估结果进行平均,得到:
通过同时更改多个特征可以轻松模拟交互作用。实际上,通常两种方法提供类似的结果,但这实际上取决于特征的分布和真实的未观察到的数据生成过程。
在继续之前,请注意,在这最后的计算中,你必须为数据集中的每一行计算预测。使用个体条件期望(ICE)图,你可以在单位之间视觉显示这些效果,使其成为局部可解释性方法,与 PDPs 不同。²
让我们模拟一个非线性模型,以查看这两种方法的效果,使用以下数据生成过程:
我使用伽马分布为第一个特征,以突出使用任一方法时可能出现的异常值的影响。
图 13-10 展示了使用两种方法估计的和真实的 PDPs。对于第一个特征,PDPs 很好地捕捉了真实关系的形状,但是随着的值变大,这两种方法开始出现分歧。这是预期的,因为样本均值对异常值很敏感,所以使用第一种方法时,你最终会使用具有相对较大第一个特征的平均单元。而第二种方法中,这种情况没有那么明显,因为个别预测被平均掉了,而且在这个特定示例中,函数形式平滑了异常值的影响。

图 13-10. 使用两种方法在模拟数据中的 PDPs
尽管 PDPs 很棒,但它们受到相关特征偏差的影响。例如,如果和呈正相关,它们会同时具有较小或较大的值。但是使用 PDP 时,可能会在第二个特征对应的值较大时,对施加不现实的小值(从网格中取)。
要在实践中看到这一点,我模拟了上一个非线性模型的修改版本:
现在,特征是从具有由相关参数索引的协方差矩阵的多元正态分布中绘制的。图 13-11 绘制了不相关( )和( )相关特征的估计和真实 PDPs,您可以轻松验证在特征相关时 PDPs 存在偏差。

图 13-11. 具有相关和不相关特征的 PDPs
累积本地效应
累积本地效应(ALE)是一种相对较新的方法,解决了处理相关特征时 PDPs 的缺陷。由于训练函数的评估次数较少,它也不那么计算密集。³
如前所述,PDP 的问题在于,在给定其与其他特征的相关性时,施加了特征的不现实值,从而偏倚了估计值。与以前一样,您首先为正在检查的任何特征k创建一个网格。ALE 通过以下三个步骤处理此问题:
关注本地效应
对于网格g中的给定值,仅选择数据中特征值落在该点邻域内的那些单位i( )。对于相关特征,所有这些单位的所有其他变量的值应相对一致。
计算函数的斜率
在该邻域内,您计算每个单位的斜率,然后将这些斜率平均。
积累这些效应
出于可视化目的,所有这些效应都是累积的:这使您可以从网格中的邻域级别移动到特征的全局范围。
第二步非常重要:不仅要在网格的一个点上评估函数,而是在区间内计算函数的斜率。否则,你可能会把感兴趣特征的效果与其他高度相关的特征混淆。
图 13-12 显示了同一模拟数据集的 ALE,以及自举法得出的 90%置信区间。对于不相关的特征(第一行),ALE 在恢复真实效果方面表现出色。对于相关的特征(第二行),第二个特征的真实效果被正确地恢复,但第一个特征的某些部分仍显示出一些偏差;尽管如此,ALE 仍然比 PDP 做得更好。

图 13-12. 同一模拟数据的 ALE(90% CI)
关键要点
这些是本章的关键要点:
机器学习中的整体叙事
在其最常见的用法中,ML 中的叙事行为发生在你开发模型并面对利益相关者之后。本章提出的整体方法支持一个视觉,即你的科学家角色创造并迭代通过故事帮助你创建一个良好预测模型,然后切换到更传统的销售人员角色。
Ex ante 叙事
Ex ante 叙事从创建关于你想预测的结果驱动因素的故事或假设开始。然后通过多步特征工程阶段将它们转化为特征。
Ex post 叙事
Ex post 叙事帮助你理解和解释模型预测的结果。像热图、偏依赖图和累积局部效应这样的技术应该帮助你讲述关于不同特征在结果中的作用的故事。特征重要性提供了一种排名它们的方式。
将叙事结构化为步骤
至少在开始阶段,从前瞻和事后叙事的角度来看,为你的叙事工具箱设置一些结构是很有益的。
进一步阅读
我在《AI 和数据科学的分析技能》中讨论了一阶和二阶效应。
Rolf Dobelli 的《清晰思考的艺术》(Harper)非常适合希望了解人类行为中存在的许多偏见和启发式的人。这些可以极大丰富你特定问题的假设集。
关于特征工程的问题,从数据转换的角度来看,有几本全面的参考书。你可以查看 Alice Zheng 和 Amanda Casari 的《机器学习特征工程》(O’Reilly),Sinan Ozdemir 的《特征工程训练营》(Manning),Soledad Galli 的《Python 特征工程食谱》,第二版(Packt Publishing),或者 Wing Poon 的“机器学习特征工程” 系列博文。
我从 Gareth James 等人的《统计学习导论及其在 R 中的应用》第二版(Springer)中的图 2.7 改编了图 13-5,并且作者在线提供。如果您更感兴趣于获得直觉而非理解更多技术细节,强烈推荐这本书。
在机器学习可解释性方面,我强烈推荐 Christoph Molnar 的《可解释机器学习:使黑盒模型可解释的指南》(在线获取,独立出版,2023 年)。Trevor Hastie 等人的《统计学习基础:数据挖掘、推断与预测》第二版(Springer)在不同算法的特征重要性和可解释性方面有出色的讨论(特别是第 10.13 节和第 15.13.2 节)。最后,Michael Munn 和 David Pitman 在《面向实践者的可解释 AI:设计和实施可解释的 ML 解决方案》(O’Reilly)中对不同技术提供了非常全面和最新的概述。
关于 ALEs,您可以查阅 Daniel W. Apley 和 Jingyu Zhu 的原始文章“Visualizing the Effects of Predictor Variables in Black Box Supervised Learning Models”(2019 年 8 月,从arXiv检索得到)。Molnar 在 ALE 方面的描述非常好,但这篇文章可以提供一些更少直觉算法的详细信息。
¹ 很容易证明在线性回归中,将特征重新缩放到会将真实系数从改变为。
² 代码仓库上的实现提供了 ICE 和 PDP。
³ 在写作时,有两个 Python 包可用于计算 ALEs:ALEPython和alibi。您可以在代码仓库中找到我对连续特征和无交互作用情况的实现。
第十四章:从预测到决策
根据麦肯锡进行的调查,他们的受访组织中有 50%在 2022 年采用了人工智能(AI)或机器学习(ML),相较于 2017 年增长了 2.5 倍,但仍低于 2019 年的峰值(58%)。如果 AI 是新的电力,而数据是新的石油,那么在大语言模型(LLM)如 ChatGPT 和 Bard 出现之前为什么采用率会停滞呢?¹
尽管根本原因各不相同,但最直接的原因是大多数组织尚未找到积极的投资回报率(ROI)。在“扩展组织学习中的 AI 影响”中,Sam Ransbotham 及其合作者认为“只有 10%的公司从人工智能技术中获得显著的财务利益”。
这种投资回报率从何而来?在其核心,机器学习算法是预测性过程,因此我们自然期望大多数价值是通过改善决策能力来创造的。本章探讨了一些预测如何改善决策的方法。在此过程中,我将介绍一些实用方法,帮助您从预测转向改进决策。
分解决策制定
预测算法试图规避不确定性,在提高我们的决策能力方面非常重要。例如,我可以试图预测我家乡明天的天气,仅仅出于乐趣。但预测本身促进并改善了我们在面对这种不确定性时做出更好决策的能力。我们可以轻易找到许多使用案例,不同的人和组织愿意为这些信息付费(例如农民、派对策划者、电信行业、NASA 等政府机构)。
图 14-1 图示了不确定性在决策制定中的角色。从右侧开始,一旦不确定性被解决,就会有影响您关心的某些度量指标的结果。这一结果取决于您可以操作的杠杆(行动)集合及其与基础不确定性的相互作用。例如,您不知道今天是否会下雨(不确定性),而您关心的是保持舒适和干燥(结果)。您可以决定是否带伞(操作)。自然地,如果下雨了,带伞是最好的选择(保持干燥),但如果没有下雨,最佳决策是不带伞(因为您无需带着它更舒适)。

图 14-1 不确定情况下的决策
在 Table 14-1 中,我整理了一些常见的 ML 用例,其中强调了决策和不确定性的角色以及一些可能的结果。 让我们来看看第一行,即健康保险的案例理赔处理。 针对新的理赔,你必须决定是手动审查还是批准付款,因为理赔可能是不合法的。 不合法的理赔会不必要地增加保险公司的成本,但审查过程通常相当复杂,需要大量时间和精力。 如果你能正确预测,你可以降低预测误差和成本,同时提高客户满意度。
表 14-1. ML 用例示例
| 类别 | 使用案例 | 决策 | 不确定性 | 结果 |
|---|---|---|---|---|
| 服务运营 | 理赔处理 | 自动支付与审查 | 合法或不合法 | 减少手动流程(成本),提高客户满意度,减少欺诈 |
| 服务运营 | 人员配置 | 招聘或重新安置 | 员工规模依赖于需求 | 提高客户满意度,减少未使用资源(成本) |
| 服务运营 | 主动客户支持 | 是否联系客户 | 是否会有问题需要我解决 | 提高满意度和减少流失率 |
| 供应链优化 | 需求预测 | 管理库存 | 库存依赖于需求 | 提高销售并降低折旧成本 |
| 欺诈检测 | 反向支付预防 | 批准或拒绝交易 | 合法或不合法 | 减少与欺诈相关的成本,提高客户满意度 |
| 营销 | 潜在客户生成 | 是否联系潜在客户 | 是否购买 | 销售效率更高 |
| 基于 ML 的产品 | 推荐系统 | 推荐 A 还是 B | 是否购买 | 提高参与度,减少流失率 |
首先思考决策和结果,然后再考虑 ML 应用,可以帮助您在组织中发展强大的数据科学实践。
提示
思考决策和杠杆是发现工作场所新 ML 用例的一个好方法。 过程如下:
-
确定利益相关者所做的关键决策(以及相关的指标和杠杆)。
-
理解不确定性的角色。
-
为建立 ML 解决方案做商业案例。
智能阈值设定的简单决策规则
与回归相对,简单的决策规则在分类模型中以阈值设定的形式自然产生。 我将描述一个二项模型(两种结果)的情况,但这个原则同样适用于更一般的多项情况。 典型场景如下:
这里 是单位 i 的预测概率分数, 是您选择的阈值。如果分数足够高,则规则激活动作 A,否则激活动作 B。请注意,如果用预测的连续结果替换预测概率,则类似的理由也适用。然而,在分类设置中固有的简化结构允许您在决策过程中考虑不同预测错误的成本。
简言之,一切归结为对假阳性和假阴性的深入理解。在二项模型中,结果通常标记为正(1)或负(0)。一旦您有了预测的概率分数和阈值,概率较高(较低)的单位被预测为正例(负例)。参见表 Table 14-2 中的混淆矩阵。
表 14-2. 典型的混淆矩阵
| 实际/预测 | ||
|---|---|---|
| N | TN | FP |
| P | FN | TP |
混淆矩阵中的行和列分别表示实际标签和预测标签。如前所述,预测的结果取决于选择的阈值( )。因此,您可以将样本中的每个实例分类为真负例(TN)、真正例(TP)、假负例(FN)或假正例(FP),具体取决于预测标签是否与真实标签匹配。矩阵中的单元格表示每个类别的案例数。
精确度和召回率
分类问题中的两个常见性能指标是精确度和召回率:
这两个指标都可以看作是真正例率,但每个指标考虑不同的情况。² 精确度回答的问题是:在我说的所有正例中,实际上有多少是正的? 另一方面,召回率回答的问题是:在所有实际上是正例的情况下,我预测正确的百分比是多少? 当您使用精确度作为您的考虑因素时,您实际上在考虑假阳性的成本;而对于召回率来说,重要的是假阴性的成本。
图 14-2 展示了针对模拟的潜在变量线性模型训练的三种替代模型的精确度和召回率曲线,用于平衡结果。第一列显示了一个分类器,通过在单位间隔内绘制随机均匀数来分配概率分数;这个随机分类器将作为基线。中间列绘制了从逻辑回归中获得的精确度和召回率。最后一列切换了预测的类别,故意创建了一个反向概率分数,其中更高的分数与更低的发病率相关联。
你可以轻松地看到几种模式:精确度始终从样本中的阳性案例的分数开始,可以是相对直的(随机分类器),增加或减少。大多数情况下,你会得到一个增加的精确度,因为大多数模型倾向于优于随机分类器,并且至少在某种程度上是对你想要预测的结果信息化的。尽管在理论上可能,但负斜率的精确度非常不可能。
精确度表现更好,在一个意义上,它始终从一个开始,然后降低到零,只有曲率会改变。一个漂亮的凹函数(中间图)通常可以预期,并且与模型健康分类的事实相关,得分通常是对所要预测事件的概率信息化的。

图 14-2. 不同模型的精确度和召回率
例子:潜在客户生成
以潜在客户生成活动为例,你对潜在客户进行评分,以预测哪些会以销售结束。你的数据包括历史上电话营销团队使用过的潜在客户样本的成功(销售)和失败(未销售)联系。
考虑一个简单的决策规则,即当预测的概率高于一个阈值时联系客户。FN 是一个如果被发送给营销团队会成为销售的潜在客户,而 FP 则是错误地发送给联系人,因此没有最终成交。误报负成本是由于销售损失而产生的未实现收入,误报正的成本是用于处理潜在客户的任何资源(例如,如果一个电话营销执行的小时薪水为\(*X*,每个潜在客户的处理时间为*k*分钟,那么每个误报正的成本为\)kX/60)。
简单的量阈值规则工作原理如下:销售团队告诉你每个周期(天或周)他们可以处理多少销量(V),然后你根据估计的概率分数发送给他们排名前V的潜在客户。显然,通过固定销量,你也隐含地设置了你的决策规则的阈值。
让我们来看一个简化的潜在客户生成漏斗(参见 第二章),以理解这种规则的影响:³
总销售额取决于转化效率(1)、通话率(2)和潜在客户量(3)。请注意,转化效率和潜在客户量取决于您选择的阈值:在理想情况下,转化效率等于您模型的精度,而潜在客户数量则取决于分数分布。另一方面,通话率取决于销售团队的全职等效人数(FTE)或总人数:足够大的销售团队将能够拨打样本中的每一个潜在客户。
通过这个您可以看到量规则何时何地可能起作用。通过按照预测分数按降序对潜在客户进行排序,并仅联系排名前V的客户,您可以优化转化效率(因为精度是预测分类模型中的一个增函数)。您还可以照顾电话营销团队中的空闲资源:如果您发送超过他们能够处理的数量,当前时间窗口内评分较低的潜在客户将不会被联系;如果您发送得少,将会有闲置的销售代理人。
图表 14-3 绘制了作为相同模拟样本和之前使用的三个模型之一设置的阈值的函数的(1)和(3)的乘积。从右向左移动,您可以看到降低阈值总是从总销售额的角度来看更好,解释了为什么量规则通常对电话营销团队效果良好。

图 14-3. 优化总销售额
由于该图可能暗示您应将阈值设置为零(拨打每个评分潜在客户)而不仅仅是遵循量规则,这可能导致一些混淆。换句话说,销售团队是否应雇佣确保通话率最大化并联系所有潜在客户的确切 FTE 数量?答案是否定的:如果分数具有信息性,那么预测得分较低的潜在客户也更不可能转化,因此额外 FTE 的成本(确定的)将大于(不确定的)额外销售收益。量规则假设团队规模固定,并且然后根据此团队规模最大化精度和销售。
混淆矩阵优化
潜在客户生成的情况有些特殊,因为您实际上对假阴性置零,并且只专注于优化精度。但对于大多数问题来说这并不适用(即使是在潜在客户生成方面,也有理由在阈值选择中考虑假阳性)。要看到这一点,请考虑欺诈案例,对于任何进入的交易,您需要预测其是否会存在欺诈行为。
典型的决策规则会针对足够大的概率分数阻止交易。假阳性通常会导致愤怒的客户(降低客户满意度和增加流失率)。另一方面,假阴性会直接产生欺诈成本。这种紧张关系引发了阈值选择的有趣优化问题。
总体思路是找到最小化由于错误预测而产生的预期成本的阈值;或者,如果您认为还应包括正确预测的价值,您可以选择最大化预期利润的阈值。这可以表示为:
其中 表示真阳性或假阳性或假阴性(x)的概率及其相关成本或利益。概率是使用混淆矩阵中的频率来估算的,如 ,并依赖于选择的阈值。⁵
图 14-4 显示了使用与之前相同的模拟数据集的样本估计;重要的是,我假设所有成本和收益都具有相同的值(归一化为一)。您可以看到,对于成本(左侧)和利润优化(右侧),最优阈值约为 0.5,这在具有平衡结果和对称成本/收益结构的模型中是预期的。

图 14-4. 对称预期成本和利润
图 14-5 显示了将假阳性和假阴性成本加倍对最优阈值的影响。从方向上讲,您可以预期增加假阳性的成本会增加阈值,因为您更加关注模型的精确性。相反,增加假阴性的成本会降低最优阈值,因为您更加关注召回率。

图 14-5. 非对称预期成本
您可以使用此方法找到适当的阈值,将您的分类模型转换为决策规则。该过程涉及以下步骤:
-
使用具有良好预测性能的分类器进行训练。
-
为了成本最小化,设置适当的预测错误成本。由于问题的结构,您只需有相对成本(例如,假阴性的成本是假阳性的 3 倍;也就是说,您可以相对于一个结果来归一化一切)。
-
利润最大化也适用类似的考虑。
-
这些可以针对不同的阈值进行计算和优化。
主要要点
这些是本章的要点:
如果您希望为您的数据科学实践找到正面的投资回报率,从预测转向决策至关重要。
机器学习是一组预测算法,首先可以极大地提升您组织的决策能力。
机器学习中充斥着阈值决策规则。
许多回归和分类模型产生简单的决策规则,如果预测结果大于、等于或低于预定阈值,则触发动作。
分类模型中的决策规则。
由于简化的结果结构,分类模型产生易于优化的决策规则。这种优化路径考虑了不同预测结果(真阳性或假阳性或真阴性或假阴性)的成本和效益。我展示了当您只关心模型精度时如何产生简单的体积阈值规则,以及更全面的情况,其中假阳性和假阴性问题。
进一步阅读
我的书 Analytical Skills for AI and Data Science 深入探讨了本章许多主题。重要的是,我没有涵盖这里描述的阈值优化实际问题。
Ajay Agrawal 等人的 Power and Prediction: The Disruptive Economics of Artificial Intelligence(哈佛商业评论出版社)强调 AI 和 ML 改善我们决策能力的潜力将如何影响经济。
¹ 甚至可以质疑 LLMs 是否真的会显著改变采纳趋势。我认为基础原理至少在机器达到人工智能通用性之前尚未真正改变。但我将在第十七章讨论这个话题。
² 请注意,在机器学习文献中,召回率通常被视为真阳性率。
³ 我假设联系比率为 1,因此每通电话都以联系结束。在实际应用中通常并非如此,因此不仅需要扩展销售漏斗,还可能需要调整您的模型。
⁴ 样本大小已标准化为 100,结果平衡,因此只有约 50 个真阳性案例。
⁵ 尽管这对于利润计算是正确的,但在成本计算中,您可能希望使用条件概率,考虑到预测误差。所选阈值不变,因为这相当于目标函数的重新缩放。
第十五章:增量性:数据科学的圣杯?
在过去 中,我曾经争论过增量性是数据科学的圣杯 。 这一声明在很大程度上依赖于我一直维持的假设:即数据科学通过提升公司的决策能力来创造价值。 本章扩展了这个主题,但更重要的是,我将介绍一些技术,这些技术应该建立一些基本的直觉,如果您决定更深入地研究时将会很有用。 通常情况下,这个主题值得一本书来详细阐述,因此我会在本章末尾提供几个参考资料。
定义增量性
增量性 只是应用于决策分析的因果推断 的另一个名称。 如果您还记得图 14-1,一个典型的决策包括一个行动或杠杆,以及依赖于潜在不确定性的结果。 如果杠杆改善 结果,并且您能够分离可能解释变化的任何其他因素,那么您可以(以某种程度的信心)说这是增量的。 供日后参考,行动也被称为治疗,遵循更经典的医学文献中控制实验的做法,其中一些患者接受治疗,其余的对照组 接受安慰剂。
因果关系通常通过使用反事实 来定义。 与事实(我们观察到的东西)相对,反事实试图回答这个问题:如果我采取了不同的行动,会怎样? 然后,您可以说一个行动对结果有因果影响,如果结果在所有可能的反事实中是唯一的。
例如,想象一下,您可以拉动一个二元杠杆,只有两种可能的行动,A 和 B(例如提供价格折扣或不提供),并观察到一个结果 Y(收入)。 您最终给所有客户打折,并发现收入增加了。 折扣对收入是增量的吗? 或者,这种效果是因果的吗? 要回答这些问题,您需要估算反事实收入,其中其他所有因素保持不变,唯一变化的是您不给折扣。 这些潜在结果 的差异就是折扣的因果效应。¹
通过量化增量性,您能够识别并选择使公司走向改善路径的行动。 这通常与指导性 分析相关联,与其描述性和预测性的对应项相对。 大多数从事机器学习(ML)的数据科学家严格专注于预测,并几乎不花时间思考因果关系,因此您可能会想知道这是否真的是一个需要学习的关键技能。 在转向更实际的事务之前,我将辩称它确实如此。
用因果推理来改进预测
即使你将自己的角色限制为数据科学家仅仅进行预测,你也应该从非常广义的角度关注因果关系。正如在第十三章中所论述的,要设计出良好的预测特征,你需要对你想预测的结果有一些基本的因果直觉。这可以从监督学习的定义中看出:
鉴于你的特征和结果的变化,任务是学习数据生成过程()。但这隐含地假设了从特征到结果的因果关系。特征工程的过程始于对类型为“高于特征值增加结果”的因果假设的阐述。此外,如果你包括与结果虚假相关的特征,你的模型的预测性能可能会受到负面影响,正如在第十章中所解释的那样。
因果推理作为一个区分因素
在撰写本书时,GPT-4 和类似的大型语言模型(LLMs)正在让我们重新思考人类在许多领域中的角色。数据科学家在自动化机器学习的出现之前已经听说过这些风险。
但是,如果你让机器处理一切可以自动化的事情,并且把你独特的人类能力放在它们的顶部,这些技术可以使你变得更加高效。即使有了最新的进展,看起来可以安全地预测,目前人类唯一适合通过反事实推理和建立世界工作模型来进行因果推理。第十七章详细讨论了这个主题。
提升决策能力
还有一个问题,即如何为你的组织创造价值。正如我在整本书中所论述的,数据科学家具备提升公司决策能力的技能。如果你选择这条路,增量性是圣杯,你无法逃避思考因果关系。
但这条路也要求你重新思考你作为数据科学家的角色,将其从仅仅预测增强到决策制定(其中预测起着重要但次要的角色)。
典型场景是推出新功能或新产品。推出新功能时,最好有一个你试图优化的结果或指标。例如,你可能关心客户参与度,如活动时间或页面访问频率来衡量。如果你能够表明该功能对这一指标有增量影响,你可以建议扩展其使用或增强它。另外,如果你发现它并没有带来增量,甚至更糟的是,该指标恶化了,最好的做法是撤销这个功能。
推出新产品还增加了更有趣的蚕食概念。例如,当Apple决定推出 iPhone 时,iPod 的销售显著下降,因此被蚕食。类似地,Netflix的流媒体业务最终取代并蚕食了最初的在线 DVD 租赁业务。稍有不同的最后一个例子是Starbucks开设一家新店可能会蚕食周围店铺的销售。在所有这些情况下,估算新产品或店铺的增量对公司的损益表和决策能力都有深远的影响。
混淆因素和碰撞因素
第十章提到混淆因素和糟糕的控制是线性回归中可能出错的示例。掌握这些概念在处理因果关系时再次具有关键的实际意义。我现在将回顾这些概念,并突出一些你在考虑增量时应该注意的地方。
一个非常有用的思考因果关系的工具是有向无环图(DAGs)。图 是一组节点和节点之间的链接。在这种设置中,节点代表变量,链接表示因果关系。当链接被定向解释时,图变成有向 的。例如,如果 x 导致 y,那么会有一个有向链接 。无环 一词排除了循环的存在;如果 ,那么不可能有 ,因此因果关系是单向的。计算机科学家和图灵奖获得者朱迪亚·珀尔(Judea Pearl)开发并推广了使用 DAGs 进行因果分析的方法。根据你的数据和 DAG,问题是你能否识别特定的因果效应。识别与估计不同,估计使用统计技术计算样本估计量。²
图 15-1 展示了混杂因素和碰撞器的最简单情况的 DAG 图,这里没有从 x 到 y 的因果效应。左边的 DAG 显示了两个因果关系( ),因此 c 是 x 和 y 的共同原因。右边也有两个因果关系( ),因此 c 是 x 和 y 的共同结果。

图 15-1. 有混杂因素和碰撞器的 DAG 图:没有因果效应
当两个可能无关的变量( )有一个共同的原因( )时,会出现混杂因素偏差。如果你在 y 对 x 的回归中运行,不控制 ,你会发现它们是虚假相关的。如果混杂因素是可观察的,你只需要对混杂因素进行条件处理,如果有因果关系,它将被确定。问题出现在 未观察到 的混杂因素上,因为根据定义,你无法控制它们。在这种情况下,你将无法确定因果效应是否存在。
碰撞器(collider)是两个变量的常见效应,是糟糕控制的典型例子,这意味着将其包含在回归中会偏离你的估计。如果你在 y 对 x 的回归中控制了 c,你会发现一个不存在的虚假关系。
为了了解发生的情况,我模拟了以下数据生成过程,涉及到混杂因素(请注意,从 x 到 y 没有因果效应):
类似地,碰撞器的数据生成过程如下(同样,从 x 到 y 没有因果效应):
然后我进行了一个蒙特卡洛(MC)模拟,在这里我估计了在是否控制 c 的情况下,y 对 x 的线性回归。我报告了特征 x 的估计系数和 95% 置信区间在 图 15-2。

图 15-2. 混杂因素和碰撞器偏差(参数估计和 95% 置信区间)
对于混杂因素的情况,如果不控制 c,会产生一个统计显著的虚假相关,错误地表明 x 和 y 有关联(更糟糕的是,你可能会得出 x 导致 y 的结论)。显著的是,一旦在回归中包含混杂因素,这种相关性就会消失,从而对不存在的关系做出正确推断。
对于碰撞者,情况恰恰相反:由于它是一个不好的控制变量,从回归中排除它可以让你估计到x对y的统计上不显著的影响。如果你错误地认为c应该作为一个特征包含进来,最终会得出在实际不存在因果效应的结论。
这两种偏倚在应用中普遍存在,不幸的是,它们在很大程度上取决于你对结果的因果模型。换句话说,在尝试估计因果效应之前,你必须提出一个(DAG)模型来描述你的结果。只有这样,你才能决定你的可用数据是否足以识别给定因果效应。具体来说,你必须控制任何混淆因素,并确保你不控制碰撞者(有时这两个考虑会互相冲突,因为一个变量可能既是混淆因素又是碰撞者)。
这个过程通常被称为反门标准:对于混淆因素,你必须通过控制它们关闭任何反门,而对于碰撞者则相反;否则,你会打开这些反门,无法确定因果效应。³
另一个经常出现的实际问题与代理混淆因素有关。如前所述,未观察到的混淆因素阻止了因果效应的识别,因此你可能会倾向于使用与混淆因素有一定相关性的代理变量。希望仍能使用这些不太理想的替代品来估计因果效应。不幸的是,答案并不乐观:偏倚的程度在很大程度上取决于相关性的强度。图 15-3 展示了这一点,这是一个关于混淆因素和x对y真实因果效应的 MC 模拟案例。⁴

图 15-3. 具有相关代理的混淆偏倚
选择偏倚
选择偏倚 是因果分析中非常重要的概念,但它对不同学派有不同的含义。对于统计学家和经济学家来说,它与进入治疗的选择相关,对于计算机科学家来说,则指的是改变受访者样本的治疗后选择;前者是一种混淆偏倚,后者产生完全不同的 DAG(更好地与生存偏倚相关,如第 6 章 中讨论的)。在本节中,我将引用前者(选择进入治疗),这通常与潜在结果文献相关。现在我将介绍这种标记法。⁵
潜在结果的概念与反事实情形密切相关。考虑二进制处理( ),其中每个单元 i 要么获得它( ),要么不获得它( )。每种处理水平都有一个独特的潜在结果,分别表示获得或未获得处理,分别标记为 或 。对于每个单元,我们观察到其中一个且仅有一个潜在结果,标记为 ;另一个潜在结果是反事实的,因此无法观察到。观察结果与潜在结果之间的关系可以总结为:
或者, ,这与对结果在处理虚拟变量和截距上进行线性回归的结构非常吻合。
用潜在结果来思考因果关系的一个优势是问题本质上是缺失数据问题。表 15-1 展示了一个例子,其中每行代表一个客户。您只观察到 Y 和 D,根据上述逻辑,您可以立即填写潜在结果。如果我们能够观察到每个反事实结果,我们就能够估计因果效应。
表 15-1. 潜在结果和缺失数值
| Y | Y0 | Y1 | D | |
|---|---|---|---|---|
| 1 | 6.28 | 6.28 | NaN | 0 |
| 2 | 8.05 | 8.05 | NaN | 0 |
| 18 | 8.70 | NaN | 8.70 | 1 |
| 7 | 8.90 | NaN | 8.90 | 1 |
| 0 | 9.23 | 9.23 | NaN | 0 |
| 16 | 9.44 | NaN | 9.44 | 1 |
举例来说,假设我想估计为书籍提供伴随代码的 GitHub 仓库是否增加了书籍的销量。我的直觉是,知道有可用的代码会增加购买的可能性,可能是因为潜在客户认为这本书质量更高,或者因为他们知道有代码可以更轻松地学习路径,我希望量化这种影响,因为创建代码仓库是昂贵的。我会与我的网页访客样本进行沟通并提供( );对于其余访客,我不会提供( )。结果是一个二进制变量,表示销售( )或无销售( )。
对于每个单元 i, 是提供代码的因果效应。由于每个单元只观察到其中一个,我们需要使用接受和未接受治疗的样本来估计它。估计它的一种自然方式是均值差的观察值: 。在实践中,您可以用样本矩代替期望得到 ,这解释了为什么我说它是观察到的。
不幸的是,观察到的差异在存在选择偏差时无法估计因果效应。
这种分解非常方便,因为它显示出在存在选择偏差的情况下,观察到的均值差异将偏离感兴趣的因果效应,通常用接受治疗对象的平均处理效应(ATT)表示。ATT 回答以下问题:仅看接受治疗的人群,其结果与如果他们没有接受治疗时的预期结果有什么不同?第二个结果是反事实的,因此差异提供了对其的因果效应。⁶
第三项表示选择偏差,并显示为什么观察到的均值差异可能偏离因果效应。为了解释这意味着什么,我现在将使用以下符号:
回到例子,你可以把代码库看作是一种昂贵的杠杆,公司(在这种情况下是我)可以分配给每个人,或者有选择性地分配。图 15-4 展示了两种类型的选择偏差。当存在正向(负向)选择时,因果效应往往被高估(低估)。

图 15-4. 正向和负向选择
让我们从正向选择开始,如果我将治疗方法给予那些已经更有可能购买这本书的人。或者,销售概率对于获得代码库的人来说更高,独立于杠杆的增量性。这意味着 ,从而高估了因果效应。类似的论点表明,负向选择下 ,因果效应被低估。
在观察数据中,选择偏差普遍存在。要么你(或者公司的某人)选择了治疗的参与者,要么客户自行选择参与。代码库示例是公司选择的典型例子,但自我选择也非常常见。在第四章中,我介绍了逆向选择的概念,即那些在无法偿还贷款方面最危险的客户也更愿意接受提议。逆向选择是自我选择的常见示例。
小贴士
深入理解你特定用例中的选择偏差,能在理解和估计因果关系的过程中帮助你取得很大进展。每当你关注增量性时,要问自己是否可能存在任何类型的选择偏差。这意味着你必须认真考虑进入你分析的治疗方法的选择机制。
幸运的是,检查选择偏倚在概念上是直观的:取一组治疗前变量X,并计算治疗组和对照组的差异。治疗前变量是可能影响选择进入治疗的变量。第六章展示了如何使用提升度,但基于统计原因,更常见的是使用均值差异而不是比率(因为这会导致标准t检验)。

图 15-5. 选择偏倚和混杂因素
图 15-5 显示了一个可以用来建模选择偏倚的 DAG 示例。有两组治疗前变量( ),都会影响选择进入治疗( )。结果( )取决于治疗和 。注意X是一个混杂变量,变量 如果你控制治疗就不会产生偏倚。这些其他治疗前变量可能在治疗和对照组之间有所不同,但这些差异不会造成选择偏倚。
无混杂假设
有了这个理解,现在是时候介绍用于识别因果效应的主要假设了。这个假设有不同的名称,比如无混杂性、可忽略性、条件交换性、可观察选择和条件独立性。
该假设意味着潜在结果和选择进入治疗在一组观察到的控制条件下是统计独立的:
这一关键假设有两种不同的解释,一种是从决策者(选择机制的所有者)的角度,另一种是从数据科学家的角度。
从决策者开始,记住选择进入治疗的方法可以由客户(自我选择)或治疗的所有者(你,或者你公司的某人)完成。该假设禁止决策者考虑潜在结果。
例如,在讨论正向和负向选择时,我是选择机制的所有者,这明确取决于我是否希望激励更有可能有机购买的潜在客户。这等同于说选择取决于潜在结果:如果 ,客户没有获取存储库的权限,则我可能希望激励他们(负向选择)。正向选择也有类似的理由。这两种情况都可能导致无混杂性的违反。
从数据科学家的角度来看,您需要提前了解可能影响选择机制的所有相关变量(然后您可以控制它们并实现条件独立性)。希望您能明白因果推断之所以如此困难的原因:您不仅需要了解结果的正确模型(DAG),还需要观察所有相关变量。后者解释了为什么这个假设也被称为可观测选择。任何未观察到的混杂因素都会导致选择偏倚。对于观察数据,这两个条件都非常难以达到,这让我们进入了 A/B 测试。
打破选择偏倚:随机化
随机对照试验(RCT)或者企业术语中更为人熟知的 A/B 测试,是估计因果效应的典型方法。原因在于,通过设计,无混杂性假设得到了保证:进入治疗组的选择仅依赖于伪随机抽取的结果,使得其独立于潜在结果。
让我们看看这在实践中是如何工作的。您需要首先定义样本中的受试者比例(p),在大多数常见的 A/B 测试设计中,通常将其设为一半。然后,您从均匀分布(u)中抽取,并定义选择为:
以下代码片段实现了这种随机选择机制。用户提供总样本大小(n_total)、受试者比例(frac_treated)和随机数生成器的种子,以便以后进行复制。结果是一个布尔数组,指示样本中每个单位是否被选择(True表示选择,False表示不选择)。
def randomize_sample(n_total, frac_treated, seed):
"Function to find a randomized sample"
np.random.seed(seed)
unif_draw = np.random.rand(n_total)
bool_treat = unif_draw >= frac_treated
return bool_treat
正如前面提到的,无混杂性也被称为(条件)可交换性。在这个例子中,如果我随机选择进入治疗组,由于可交换性,我期望那些有机购买书籍的人在治疗组和对照组中的比例相同。任何一组中的增量销售必须仅依赖于我提供的杠杆。这就是 A/B 测试的美妙之处。
警告
在随机化时,必须确保满足稳定单元处理值假设(SUTVA)。SUTVA 有两个要求:(i)所有接受处理的个体都接受相同的处理(例如,在药物试验中,所有患者必须接受相同的等效剂量),以及(ii)单位之间没有干扰,因此单位的潜在结果不会因为其他单位的处理分配而变化。
后一种情况在在线市场经常会违反,例如 Uber,Lyft,或 Airbnb。假设你想测试需求端价格折扣是否提高了收入。⁷ 处理(折扣)可能会减少对照组的供应,造成影响其潜在结果的外部性。在这些情况下,最好使用分块随机化,其中样本首先分成互斥的集群,然后在集群之间而不是单元之间随机分配处理。
匹配
尽管 A/B 测试很棒,但并非始终可以使用,特别是当处理成本足够高时。例如,假设你在一家电信公司工作,公司想知道安装天线(包括所有必需的组件)是否对其收入有增量影响。你可以设计一个 A/B 测试方案,随机在地理位置上安装新天线。通过足够大的样本量,这种设置将允许你估计它们的增量性。毋庸置疑,这种测试成本太高,无法执行。
有几种技术可以用来估计观察数据的因果效应,但它们都依赖于满足关键的非混杂性假设。在这里,我只想提到匹配(和倾向得分匹配),因为它很好地捕捉了可观察变量选择的直觉,以及如何通过找到一组合适的单位来尝试复制随机化。
思考随机化的一种方式是处理组和对照组在前是相等的,这意味着如果你随机选择每组中的一个单位并比较它们关于任何一组变量( ),它们应该是相似的。一个自然的问题是我们是否可以事后创建一个有效的对照组,以便适用可观察变量的选择。这就是匹配试图做的事情。
匹配算法工作如下:
-
为你的结果建议一个 DAG,并确保可观察变量选择有效。在实践中,这意味着你对选择机制有一个合理的因果模型,并且你可以观察所有前处理特征* X *。
-
遍历所有处理单元:
-
寻找合适的个体对照组。 对于每个单位 i,找到在 X 方面与 i 最接近的 个单位的群体。用 表示。 是一个控制偏差与方差折衷的元参数:大多数人使用 ,可能导致低偏差但大方差。您可以增加数字并调整此折衷。
-
计算对照组的平均结果。 一旦您为单位 i 有了对照组,您可以计算平均结果 。
-
计算单位 i 的平均处理效应。 计算差值 。
-
-
计算被处理单位的平均处理效应。 ATT 是处理组中单位的所有 个体处理效应的平均值( ):
希望您喜欢匹配算法的简单性和直观性。关键的洞察是每个被处理的单位都与一个控制组匹配,这个控制组在任何混杂因素方面最相似。对于连续特征,您所需做的就是计算 i 与所有未处理单位 j 之间的欧几里得距离:
如果您有混合数据,其中您的特征可以是连续的或分类的,会发生什么?原则上,您可以应用足够通用的距离函数。⁸ 但是有一个另外并且非常重要的结果被称为倾向得分定理(PST),我现在将介绍它。
倾向得分 是一个单位获得处理的概率,条件是一些协变量或控制变量:
PST 说,如果在特征 条件下不受干扰性的约束,那么如果你条件于 ,也会保持不受干扰性。这一结果的重要性主要是计算方面的:如果你已经通过假设使用 X 建立了条件独立性,那么你可以使用倾向得分将接受治疗的单位与未接受治疗的单位匹配。倾向得分可以用你喜欢的分类算法来估计,比如梯度提升、随机森林或逻辑分类器,这些算法自然地处理混合数据。
提示
记住,不受干扰性是一个不能用任何给定数据集测试的假设。你从一个捕捉你对治疗、结果和任何其他相关控制变量假设的 DAG 开始。接下来的一切都取决于这一关键假设。
因此,讨论和记录你的识别假设(你的 DAG)与你的同事、数据科学家或其他人是一个好主意。许多时候,你的业务利益相关者可以提供有价值的见解,说明是什么驱动了选择机制。
现在我将总结倾向得分匹配算法,跳过常见的步骤:
-
训练分类算法来估计接受治疗的概率。使用已处理和未处理单位的样本,估计 。
-
使用倾向得分匹配法匹配接受治疗的单位。对于每个接受治疗的单位 i,计算所有未接受治疗单位的倾向得分的绝对差:
-
使用排序后的差异选择对照组。以递增方式排序所有差异,并将前 个分配给控制组 。
尽管匹配(以及倾向得分匹配)直觉上是直观的,但它在计算上是昂贵的,因为你必须遍历每个接受治疗的单位,并且对于每一个这样的单位,你还必须遍历每个未接受治疗的单位和每个特征,因此你最终会得到一个复杂度为 的大 O符号表示。在代码 repo 中,你会发现算法的两个版本,一个使用循环,另一个使用 Numpy 和 Pandas 的广播功能,这大大减少了执行时间。
为了看到这两者在实践中的效果,我模拟了一个类似于先前描述的模型,其中有两个混杂变量影响选择概率和结果,真实治疗效应等于两个。⁹对于倾向得分,我使用两种替代算法:开箱即用的梯度提升分类器(GBC)和逻辑回归。我为每个估计器引导 95%置信区间。图 15-6 显示了结果,其中每个图的水平轴显示了当您改变控制组大小(m)时发生的情况。

图 15-6。匹配和倾向得分匹配的结果
所有方法都可以正确估计真实因果效应,但倾向得分匹配与 GBC 略微低估它(真实估计仍在 95%置信区间内)。增加个体对照组的大小似乎对平凡匹配和倾向得分匹配与逻辑回归的偏差和方差没有影响,但略微缩小了 GBC 的置信区间。
机器学习和因果推断
尽管机器学习在过去几年取得了令人印象深刻的增长,可以肯定的是,除了在许多组织中定期进行的 A/B 测试之外,因果推断仍然相当小众。在本节中,我将尝试总结将这两个研究领域联系起来的一些最新发展。
开源代码库
就像 ML 的开源库的可用性为从业者消除了一些进入障碍一样,几个新的倡议试图为因果推断做同样的事情。
Microsoft 的因果推断研究团队推出了几个项目,包括EconML、Azua和DoWhy。
正如 DoWhy 的贡献者们在解释的那样,他们的目标是:
-
提供通过因果图(DAGs)建模框架
-
结合 DAG 和潜在结果方法的最佳实践
-
“如果可能,自动地[测试]假设的有效性和[评估]估计的健壮性”
对从Judea Pearl和计算机科学界带头的研究项目,通过提供治疗、结果、其他数据和因果模型,可以获得关于是否具有识别和一系列合理估计的足够信息,这可能是最吸引从业者的最后目标。
EconML 是一个旨在利用最先进的机器学习技术来估计因果效应的 Python 库。正如其名称所示,提供的方法处于“计量经济学与[ML]的交集”。你可以找到一些非常新的方法,这些方法在未混杂假设下工作,比如双机器学习、双重稳健学习和基于森林的估计器。稍后我会详细介绍这些内容。
Azua 是一个旨在利用最先进的机器学习方法来改进决策的库。问题被分为两个独立阶段,称为“下一个最佳问题”和“下一个最佳行动”。前者关注于需要收集哪些数据以做出更好的决策,并包括缺失值填补中的问题,以及对于给定问题来说不同变量的信息性如何。后者使用因果推断为定义明确的目标函数提供最优行动。
CausalML 是由 Uber 创建的另一个 Python 库。它包括几个基于机器学习的因果推断估计器,用于提升建模,例如树和元学习器。类似的库还有pylift。
要理解提升建模,想象一下你训练了一个交叉销售分类器,预测哪些客户会在你的公司购买特定产品。训练完成后,你可以绘制得分分布,如图 15-7,我将所有得分客户分为三组。A 组是购买可能性高的客户。B 组的客户可能性较小,而 C 组被认为购买可能性极低。
在你的营销活动中应该瞄准哪些客户?许多人决定瞄准 A 组,但这些客户最有可能进行有机购买,所以你可以使用这种昂贵的激励来瞄准其他客户。另一方面,C 组的可能性太小,激励成本太高。基于这种理由,B 组更适合作为目标候选。

图 15-7. 交叉销售概率分数分布
提升建模的目标是利用治疗组和对照组的信息,形式化这种直觉讨论,以估计治疗的增量效果。
双机器学习
当目标是学习类似的一般数据生成过程时,ML 算法非常有效。当使用 DAGs 描述因果模型时,不提及链接的功能形式,只提及它们的存在。传统上,因果效应使用线性回归来估计,因为其简单和透明性。双机器学习(DML)和类似技术旨在利用非线性学习器增强的预测能力和灵活性来估计因果效应。
要了解机器学习如何改进因果效应的估计,考虑以下部分线性模型:
和往常一样,结果取决于处理和一些特征,并且处理也取决于特征集(以创建混杂因素或选择偏差)。函数 和 可能是非线性的,治疗效应由 给出,而 是独立的噪声项。注意,非线性可能仅在混杂因素中出现,但不允许这些因素与处理交互。
DML 估计器的思想是利用非线性学习器(如随机森林或梯度提升)学习每个函数并估计治疗效应。不深入细节,这个过程涉及两个关键概念:
正交化
如 第十章 中所述,正交化包括部分剔除协变量 X 对结果和处理的影响。您使用期望的灵活学习器并对残差进行回归,以获取因果效应。
样本分割
样本随机分成两半,一半用于训练,另一半用于估计和评估。这是为了避免过拟合的偏差,并提供一些理想的大样本特性。
算法的工作原理如下:
-
随机将样本分为两半: 。
-
使用样本 l ,对 g() 和 h() 在 上进行训练。
-
使用单位 i 在样本 ,估计残差:
-
计算估计器:¹⁰
-
对每个子样本的估计值取平均:
在代码 repo 中,您可以找到使用线性和非线性数据生成过程进行模拟的实现和结果。这里我只想展示一个 ML 通过提供更强大和通用的预测算法影响因果推断的途径。
关键要点
这些是本章的关键要点:
什么是增量性?
增量性是应用于估计某个杠杆变动是否改善了业务结果的因果推断。
为什么关注增量性(v.0)?
基于数据科学通过提高我们的决策能力创造价值的假设,增量性对于理解哪些决策值得扩展,哪些应该回滚至关重要。
为什么关注增量性(v.1)?
即使对您或您的团队来说,改善决策并非头等大事,对因果性有广泛的理解也应有助于提高您的机器学习模型的预测性能。
因果推断的方法
通常来说,有两种替代(及互补)方法可以识别和估计因果效应:DAG 和潜在结果方法论。前者利用图表(及因果推断)找到识别的条件。后者将问题转化为缺失数据和选择机制,因为在任何给定时间,每个单位只能观察到一个潜在结果。
Confounders and colliders
混淆因素是治疗和结果的共同原因,而碰撞体是治疗和结果的共同效应。不考虑混淆因素会“打开一扇后门”,导致偏倚的因果估计结果。相反,碰撞体是一个坏的控制的例子,因为在您的模型中包含它(或更普遍地,在它上面进行条件处理)也会打开一扇后门,并造成偏倚。
选择偏倚
对于统计学家和经济学家来说,选择偏倚是应用于选择“进入”治疗的混淆偏倚的一种类型。对于流行病学家和计算机科学家来说,它指的是在治疗后选择进入样本的选择偏倚。随机化,以随机对照试验(RCTs)或 A/B 测试的形式,解决了前者,但未解决后者。
随机化和匹配
通过将选择随机化到治疗中,您有效地打破了选择(进入治疗)偏倚。这解释了为什么 A/B 测试在可行时已成为行业标准。使用观察数据时,有许多技术可以用来估计因果效应,但它们都依赖于无混杂假设的有效性。这里我仅讨论匹配和倾向得分匹配。
进一步阅读
在我的书《AI 与数据科学的分析技能》中,我深入讨论了关于处方数据科学的增量性和因果性的相关性。阿贾伊·阿格拉瓦尔等人的《预测机器:人工智能的简单经济学》(哈佛商业评论出版社)和更近期的《权力与预测:人工智能的颠覆性经济学》(哈佛商业评论出版社)中也有类似的观点。
可以在《使用回归和多级/层次模型进行数据分析》(剑桥大学出版社)的第九章中找到关于因果推断的入门论述。
如果你对 DAG 方法对因果性的方法感兴趣,可以在 Judea Pearl 和 Dana Mackenzie 的《为什么之书:因果关系的新科学》(基础图书)中找到简介。更技术性的处理可以在 Pearl 的《因果性:模型、推理和推断》,第二版(剑桥大学出版社)中找到。前者更适合如果你想先获得一些直觉,而后者提供了 DAGS 和 do-calculus 的深入介绍。识别的关键是背门和前门标准。
潜在结果方法一直受到经济学家和统计学家的支持。Joshua Angrist 和 Jorn-Steffen Pischke 的《大部分无害计量经济学:实证主义者的同伴》(普林斯顿大学出版社)是一个很好的参考书,如果你对理解选择偏差及线性回归的多个方面感兴趣,比如在章节中讨论的匹配估计器。你也可以找到仪器变量的完整处理,该项在 DML 估计器的脚注中讨论。
统计学、社会科学和生物医学领域的因果推断:引言由 Guido Imbens 和 Donald Rubin(剑桥大学出版社)提供了从潜在结果视角全面介绍该主题,也被称为 Rubin 的因果模型(Donald Rubin 最初正式化和发展了该理论)。如果你想了解选择机制在其中扮演的角色,这是一个很好的参考书。SUTVA 也被详细讨论。
近年来,一些作者试图兼顾两种方法的优势。在经济学家方面,Scott Cunningham 的《因果推断:混音磁带》(耶鲁大学出版社)和 Nick Huntington-Klein 的《影响:研究设计和因果性介绍》(查普曼与霍尔/CRC 出版社)讨论了几种识别和估计方法,并清晰介绍了 DAGs。
Miguel Hernan 和 James Robins 在 DAG 文献中非常受尊重,他们的书《因果推断:假如》(CRC 出版社)使用潜在结果来介绍因果关系和反事实情况,并使用 DAGs 推导了许多重要结果。
Guido Imbens 与 David Card 和 Joshua Angrist 共同获得了 2021 年经济学诺贝尔奖,并与 Judea Pearl 就两种方法的相对有用性进行了几次讨论。你可以在“潜在结果和有向无环图因果方法:对经济学中实证实践的相关性”的工作论文(2020)中找到他的观点和评论(工作论文)。你可能也会对 Judea Pearl 的回应感兴趣。
此外,如果你对这些不同的思想流派的发展及其观点感兴趣,可以查阅观察研究8 卷 2 号(2022 年)的非门户专题。该期刊对朱迪亚·珀尔、詹姆斯·赫克曼(另一位经济学诺贝尔奖获得者)和詹姆斯·罗宾斯(一位通过结构建模引领因果推断研究的流行病学家)关于这一主题及不同方法的观点进行了采访。
Carlos Cinelli 等人在“好与坏控制的速成课程”(社会方法与研究,2022 年,可以在线查阅此处)中系统讨论了坏控制的问题。
Elias Bareinboim 等人在“消除因果推断和统计推断中的选择偏差”(人工智能 AAAI 会议论文集 28 卷 1 号,2014 年,也可以在线查阅此处)中讨论了从治疗后样本选择的角度看选择偏差的问题。关于这个话题,你还可以阅读米格尔·埃尔南对不同偏倚类型的讨论,以及 Louisa H. Smith 的论文“选择机制及其后果:理解和解决选择偏差”(当前流行病学报告 7 卷,2020 年,也可以在线查阅此处)。
可信的在线控制实验由 Ron Kohavi 等人(剑桥大学出版社)讨论了 A/B 测试设计中的许多重要主题,包括干扰或 SUTVA 违规问题。你还可以查阅 Peter Aronow 等人在 J. Druckman 和 D. Green 编辑的《实验政治科学进展》(剑桥大学出版社,arXiv)中的“实验数据中的溢出效应”一文。
Matheus Facure 的《Python 中的因果推断》(O'Reilly)在书中全面介绍了本文讨论的许多主题。你还可以在线查阅他的《为勇者和真实者的因果推断》。
关于提升建模,你可以查看 Shelby Temple 的《提升建模:快速介绍》文章(Towards Data Science,2020 年 6 月)。Eric Siegel 的《预测分析:预测谁将点击、购买、撒谎或死亡的力量》(Wiley)第七章向普通公众介绍了这个主题。
Jean Kaddour 等人在“因果机器学习:调查与开放问题”(2022 年,arXiv)中提供了除了机器学习和因果性之外的许多重要主题的最新总结,这些主题在本章没有讨论。
如果您想了解双机器学习,请参考 Victor Chernozhukov 及其合著者在《计量经济学期刊》2018 年发表的原始文章“Double/Debiased Machine Learning for Treatment and Structural Parameters”。Chris Felton 的讲义和 Arthur Turrell 的“Python 中的计量经济学第一部分——双机器学习”文章也很有用。有Python 和 R 包可以使用。EconML包还提供了估计 DML 的方法。
¹ 顺便提一下,在这个例子中,有几个替代的反事实故事可以解释更高的收入。一个非常常见的情况是高峰季节销售,客户更愿意在您的产品上花费更多。
² DAG 方法在计算机科学家和流行病学家中很受欢迎,而潜在结果方法在统计学家和经济学家中最受欢迎。接下来我会更多地讨论后者。
³ 请注意,反门后准则还包括一个条件,即不控制治疗的后代(导致结果的变量)。
⁴ DGP 基本上与之前相同,但我引入了两个变化:我画出 来允许真实未观察到的混杂因子(c)与观察到的代理之间有不同的相关系数,并且我将结果建模为 ,以便从x到y存在因果效应。
⁵ 区分不同类型的选择偏差很重要。正如我后面将展示的那样,随机化可以防止进入治疗,但不能解决治疗后选择的问题。
⁶ 请注意,您可以估计的替代因果效应包括平均治疗效应(ATE)或未治疗的平均治疗效应(ATU)。本章末尾提供了参考文献。
⁷ 市场有需求和供给两个方面。例如,乘车共享的乘客或者 Airbnb 的客人就是需求的例子。
⁸ 例如,查看卡普尔·库巴拉的文章,“处理混合类型数据的正确方法。最先进的距离度量”。
⁹ 详细信息可以在代码存储库中找到。
¹⁰ 请注意,这个表达式并不完全等同于用弗里施-沃夫-洛维尔程序回归部分化残差所得的结果。这个表达式实际上更接近于工具变量估计量(见本章末尾的参考文献)。双重机器学习的创建者提出了另一个更符合 FWL 逻辑的估计量(见他们的第四部分)。
第十六章:A/B 测试
第十五章描述了随机化在估计因果效应中的重要性,当这种选项实际上可以提供给数据科学家时。A/B 测试利用这一力量来提高组织的决策能力,这个过程类似于本地优化。
本章描述了 A/B 测试,并应帮助您了解一个相对简单的程序的许多复杂性,以改善决策过程。
什么是 A/B 测试?
在其最简单的形式中,A/B 测试是一种评估两个替代方案在给定指标上哪一个更好的方法。A表示默认或基线替代方案,B是竞争对手。更复杂的测试可以同时提供多个替代方案以找出最佳的一个。使用第十五章中的术语,得到A或B的单位也被称为控制和处理组。
从这个描述中可以看出,每个 A/B 测试中都有几个关键要素:
指标
作为改进决策的核心,A/B 测试的设计应始于选择合适的指标。第二章中描述的技术应该帮助您找到要实施的测试的合适指标。我将用表示这个结果指标。
杠杆或替代方案
一旦定义了一个指标,您可以回过头来考虑对其影响最直接的杠杆。一个常见的错误是从一个替代方案开始(比如,您网页或应用中按钮的背景颜色)并试图反向工程某个指标。我在实践中多次看到过这种情况,几乎总是导致浪费时间、团队挫折和无法得出结论的结果。
随机选择
您必须始终定义谁可以访问每个替代方案。A/B 测试也被称为随机对照试验,因为按设计,对治疗的选择是随机的,从而消除可能出现的混杂因素或选择偏倚。
决策标准
参与实验的每个单位i都有一个关联的结果,用表示。实验结束时,您已经收集了这些指标的两组单位的数据,您的任务是决定新替代方案是否胜过默认方案。
解决这个问题有几种方法,但最常见的是比较两组的样本平均值。关键难点在于需要从噪声中分离信号。
图 16-1 展示了两种典型情景。每张图显示了处理组和对照组每个单位的结果测量(垂直线),以及样本均值(三角形)。在左侧,您有一个纯噪声情景,处理组和对照组的结果分布相同,但如果仅比较均值,您可能会得出杠杆B更优的结论。在右侧,处理使分布向右移动,创建了平均结果之间的真实差异。

图 16-1. 解开噪声与信号
统计检验允许您形式化这些直觉。通常,零假设与替代假设相对比,您计算出具有已知分布的检验统计量。用表示组中单位的样本平均值:
在 A/B 测试中最常用的标准如下:
按照此标准,您只需运行标准t检验,对比无效果的空假设与替代假设。用表示平均结果的差异。双边统计检验是:
表示没有结果差异的空假设。您的目标是以一定的信心拒绝这一假设;如果不能,您将保留默认杠杆A(或不保留,因为它们在此特定度量视角下无法区分)。
图 16-2 展示了这在实践中是如何进行的。该图显示了在零效应空假设下的理论分布(请注意它在 0 处中心对称),通常被视为学生t分布。你计算出t统计量,如果落在阴影区域(拒绝区域),则可以在显著水平下拒绝空假设,通常设定为 5%或 1%。这是绘图中阴影区域的面积,选取得足够小。

图 16-2. 决定是否保留替代治疗方案
我想在这里停下来解释刚才的做法。通过选择足够小的显著性水平,你基本上是在说:如果零假设成立,看到如此大的检验统计量的概率是如此之小,以至于也许我的零假设是错误的。换句话说,在零假设下高度不太可能的事件被视为拒绝零假设的证据。例如,如果你选择了 1%的显著性水平,你应该观察到一个落在拒绝区域的检验统计量中的 1/100。但你在实验中得到了它!要么你非常不走运,要么你的零假设是错误的。你选择了后者,放弃了运气,拒绝了零假设。
让我们通过一个示例来运行,只使用左侧面板数据集中的 10 个观测值,参见图 16-1 中的表 16-1。
表 16-1. 前 10 个单位的结果
| IDs | 控制组 | 处理组 |
|---|---|---|
| 0 | 0.62 | 0.82 |
| 1 | 1.07 | 0.23 |
| 2 | 0.56 | 2.47 |
| 3 | −0.61 | 0.54 |
| 4 | 2.63 | 1.12 |
| 5 | 0.17 | −0.40 |
| 6 | 0.94 | −1.12 |
| 7 | 1.44 | 2.60 |
| 8 | 2.25 | 1.39 |
| 9 | 1.42 | 0.76 |
| 平均值 | 1.05 | 0.84 |
对于这 10 个单位,平均结果的差异为 = 0.84 − 1.05 = −0.21. 要计算t统计量,我们首先需要差异的方差:
这个t统计量足够大吗以拒绝无效的零假设?我们可以使用临界值表,或者直接计算p值(自由度数是 ):¹
在零假设下,看到至少与加/减 0.44 相当极端的值的概率为 67%。由于这个值不够小(通常小于 5%),你无法拒绝零假设,即这只是纯粹的噪音。从决策角度来看,你会选择默认的备择方案。
注意
你也可以使用线性回归得出完全相同的结果。为此,请运行回归:
一旦计算出,你可以使用许多软件包预先计算的p值。注意,scikit-learn 不计算p值,但你可以使用statsmodels来计算。在代码仓库中,我将展示如何手动实现,使用 statsmodel 和SciPy 的t检验方法。
除了简单性外,线性回归还允许你包括其他控制变量(特征),这可能提供更小的置信区间。本章末将提供参考文献。
最小可检测效应
希望我已经说服您,这个决策标准很容易实现,使用以下三步骤过程:
-
设定一个显著性水平(例如 5%)。
-
计算检验统计量和p值。
-
如果p值低于显著性水平,则拒绝零效应的假设。
我在第十四章中讨论了类似基于阈值的决策,假阳性和假阴性自然发生。事实证明,假阳性和假阴性在 A/B 测试设计中也起到了重要作用。
在这种情况下,如果您错误地得出实验有影响的结论,则会出现假阳性;如果您错误地得出实验没有影响的结论,则会出现假阴性。
如前所述,显著性水平控制着假阳性的概率。当您拒绝零假设(一个积极因为您说有影响时),您犯错误的概率由显著性水平( )给出。另一方面,统计功效 允许您控制假阴性的概率,对实验设计至关重要。
图 16-3 显示了两个分布:左侧分布以 0 为中心,假设没有效应( )。右侧,我绘制了另一个分布,假设有正面效应( )。这第二个分布将用于讨论假阴性。
对于给定的显著性水平,阴影区域FP表示假阳性的概率,即错误地拒绝零假设,从而得出实际上没有效应的结论。现在假设您得出没有效应的结论。只要您的t统计量落在临界值 的左侧。²为了成为假阴性,必须是右侧分布类似于真实分布,并且阴影区域FN表示该分布的假阴性概率。

图 16-3. 理解假阳性和假阴性
最小可检测效应(MDE)是实验中你能够检测到的最小效应,其给定显著水平和统计功效。它由以下公式给出,其中 是实验的总样本量, 是受试单位的比例,而 仍是来自 t 分布的临界值:³
MDE 对你来说为什么如此重要呢?即使真实效应存在,当它小于 MDE 时,你可以估计到它,但它看起来在统计上不显著。实际上,这意味着你进行了测试,并得出结论称治疗没有增量效应。问题是这是真实还是假阴性。在功效不足的测试中,你无法确定是哪一种情况。
如本讨论所述,设计 A/B 测试时的目标是实现最低 MDE。小的 MDE 可以保证你能在所有嘈杂数据中找到同样小的信号(真实效应)。
图 16-4 展示了 MDE、样本量和结果方差之间的关系。对于固定的方差,增加实验中的样本量可以降低 MDE。或者说:实验越大,估计小效应的能力越好。
现在,固定一个样本量,并在图中不同曲线上画一条垂直线。数据越嘈杂(方差越高),MDE 就越高。教训是,对于嘈杂的数据,你需要更大的样本量才能获得可比较的 MDE。

图 16-4. MDE、方差和样本量之间的关系
警告
总结本节的要点:
-
你希望设计具有较小 MDE 的测试。
-
为了达到这个目标,你需要增加实验的样本量。
尽管听起来很简单,但请记住,设计更大的实验可能会影响你组织的运作。许多时候,你需要冻结参与者的任何通信几个月,所以大型实验也有其不利面。稍后我会在讨论实验治理时详细探讨这一点。
示例 16-1 展示了如何在 Python 中计算 MDE。要找到 t 分布的临界值,用户必须提供统计显著性和功效(或使用默认值)。自由度通常是样本量的函数;这里我设置为 n − 1,但对于足够大的样本量,修正是不必要的。
要找到临界值,你可以使用累积分布函数(CDF)的反函数。在 SciPy 中,你可以使用 scipy.stats.t.ppf() 方法。因为我想要分布右尾部分的 的临界值,我需要从一中减去显著性水平。类似的论点适用于第二个临界值( ),但现在要集中在分布的左尾部分。
示例 16-1. 一个计算 MDE 的 Python 脚本
def compute_mde(sample_size, var_outcome, size=0.05, power = 0.85):
# degrees of freedom: usually a function of sample size
dof = sample_size - 1
t_alpha = stats.t.ppf(1-size, dof)
t_ombeta = stats.t.ppf(power, dof)
p = 0.5
den = sample_size*p*(1-p)
MDE = (t_alpha + t_ombeta)*np.sqrt(var_outcome/den)
return MDE
许多情况下,你不需要 MDE,而是需要与所需 MDE 一致的最小样本量,以帮助你选择实验的正确规模。幸运的是,你可以反转函数并解出样本量作为其他所有因素的函数;请注意,现在你需要提供一个 MDE。示例 16-2 展示了如何实现这一点。
示例 16-2. 一个计算最小样本量的 Python 脚本
def compute_sample_size(mde, var_outcome, data_size, size=0.05, power = 0.85):
# data_size is the number of subjects used to compute the variance of the outcome
# (var_outcome)
dof = data_size - 1
t_alpha = stats.t.ppf(1-size, dof)
t_ombeta = stats.t.ppf(power, dof)
sum_t = t_alpha + t_ombeta
p = 0.5
sample_size = var_outcome/(p*(1-p))*(sum_t**2/mde**2)
return sample_size
我现在将讨论剩余参数的选择。
选择统计功效、水平和 P
通常惯例是选择 α = 0.05 和 β = 0.15. 虽然你希望两者尽可能小,但对于固定的 MDE,你需要在它们之间做出权衡,实际上就是权衡假阳性和假阴性的概率(见图 16-5)。在设计实验时,你可以考虑这一点,并确定对你最重要的因素。只需记住正确解释这些值:5% 是零假设下假阴性的概率,15% 是备择假设下假阳性的概率。

图 16-5. MDE、显著性水平和功效
要设置受治疗单位的比例 (P),请注意,其他条件相等时,当 P = 0.5 时,MDE 最小化,因此这是一个合理的选择。实际上,这意味着治疗组和对照组的大小相等。
估算结果的方差
你需要的最后一个参数是你结果的方差( )。许多情况下,你可以从现有数据中估计这一点。例如,如果你的结果是每个用户的平均收入,你可以从数据库中随机抽取一些客户并估计这些单位的方差。
当结果是二元变量时,例如转化率,还有另一个技巧。例如,如果你的实验旨在看新功能是否提高了转化率,每个单独的结果都是 ,取决于是否产生销售。你可以将其建模为伯努利试验,成功的概率为 q,其方差为 。你可以使用先前活动的平均转化率代替方程中的 q 来进行估算。
最后,你总是可以先进行 A/A 测试。顾名思义,两组单位都被呈现默认的替代方案 A。然后,你可以使用此实验的结果来估计结果的方差。
模拟
让我们运行一些模拟以确保所有这些概念都清楚。我将为两个模拟使用以下简单的数据生成过程:
我的第一个模拟使用 θ = 0.5,σ² = 3,因此有一个小的真实效应(相对于嘈杂的数据)。第二个模拟保持残差方差不变,但现在没有真实效应(θ = 0,σ² = 3)。每个模拟的样本大小为 500。
对于第一个模拟,我计算了允许我检测真实效应的最小样本大小(N(MDE = 0.5) = N* = 346)。然后,我创建了一个从此大小的总样本中抽取的 300 个子样本的网格。对于每个样本大小,我进行有放回抽样,并估算包括截距和虚拟变量的线性回归,当虚拟变量的 p 值低于(高于)5%显著性水平时,标记为正(负),就像实验是真实的一样。最后,通过平均标志来计算真正例率和假负例率。
图 16-6 描绘了第一个模拟的真正例率(TPR)和假负例率(FNR),以及用于计算最小样本大小的功率。正如你所期望的那样,TPR 随样本大小增加而增加,而 FNR 随之减少:较大的实验具有更低的预测错误率。

图 16-6. 真正例率和假负例率:θ = 0.5
最重要的发现是,当样本量至少达到使用 MDE 公式得到的最小大小时,两条线都会穿过各自的阈值 。重申一遍,这意味着即使你的实验有效果,除非你有足够大的样本量,否则你会将其视为统计上不显著。在模拟中,“足够大”的样本量是让我能够检测到真实效果的样本量。这展示了 MDE 公式的美妙之处,希望它也能帮助你掌握其背后的直觉。
图 16-7 显示了第二次模拟的结果,其中没有效果 。使用相同的决策标准,如果p值小于(大于)5%,我将一个结果标记为假阳性(真阴性)。这张图应该有助于加强你对显著性水平和p值的理解。在这种情况下,大约有 5%的时间你会错误地得出实验有效果的结论。

图 16-7. 假阳性和真阴性率:
示例:转化率
让我们通过一个更实际的例子来检验每一个概念是否清晰。你想设计一个 A/B 测试,看看是否可以通过不同的自动邮件通信措辞来改善公司当前的 4%基线转化率。
图 16-8 显示了如果你使用一千、一百万或十亿的样本量,你将能够检测到的转化率(基线 + MDE)。在测试中有 1K 顾客时,你只能检测到至少 3.3 个百分点的增量变化。例如,你无法检测到新消息创建了 5.5%的高成功率测试!如果你只能访问 1K 大小的样本,建议不要运行测试,因为你只能检测到不切实际的高增量效果。
如果你只有 1000 个顾客,那么 MDE 现在是 0.003,因此任何大于 4.1%的转化率都可以被检测出来。现在听起来非常有希望,但是实验的样本量可能会非常大,难以运行。最后,如果你有 10 亿个顾客可用,你能够检测到的最小转化率是 4.003%(MDE = 3.3e − 5)。通过扩大样本量,你可以真正区分噪音和信号。

图 16-8. 转化率和 MDE
警告
别忘了,MDE 是指由于治疗而引起的度量的增量变化,这是从您正在推理的随机变量的定义中得出的:。
正如示例所示,一旦您修正了 MDE,您就可以找到相应的治疗下最小可检测度量,这将是:
设置 MDE
在这一点上,我希望我已经说服您:
-
设计实验必须包括影响样本大小的统计功效和显著性考虑因素。
-
在功率不足的实验中,您可能会得出一个结论,即某种治疗没有效果,而问题实际上可能是您没有使用足够大的样本。
-
您需要首先设置一个 MDE 来找到实验的最小样本大小。
那么,首先如何设置 MDE?一个重要的考虑因素是统计显著性与业务显著性是不同的。
回到前面的例子,即使您有 10 亿客户参与实验(一半接受控制,一半接受治疗),是否有商业意义来运行这个测试?能够检测到 3.3e − 5 的增量变化对业务的影响是什么?对于大多数公司来说,没有什么影响,因此即使统计属性得到满足,从业务角度来看,继续进行实验也没有意义。⁴
您可以利用这种推理与您的利益相关者一起设置一个可行的 MDE。例如,对于他们来说,找到任何超过 4.1%的转化率是有意义的,因此您必须准备为 100 万客户设计测试。如果您只有 10,000 个可用客户,您必须与他们讨论,您只能检测到超过 5%的转化率(MDE = 0.01)。如果每个人对这样的估计(相对于基线的增加 25%)感到满意,那么进行实验是有意义的。
许多时候,您的利益相关者可能无法提出答案。如果您可以访问以前的经验,使用那些增量变化(或平均值)作为您的 MDE 来逆向工程您的样本大小。否则,利用您的业务知识提出一些合理的东西。
假设待办事项
A/B 测试只有与所测试的假设一样好和丰富。我曾在一家公司工作过,那里的产品团队经常发布设计不良的实验。然而,缺乏统计的健壮性并不是最令人担忧的方面。大多数这些实验缺乏良好的假设基础。
拥有一个假设积压是公司内部培养实验文化的一个关键方面。理想情况下,这应该包括一个排序的假设列表,团队希望测试的假设,受影响的测量标准和支持效果的论据。我现在将讨论这些内容。
Metric
你不会惊讶地看到我从测量标准开始。拥有一个明确的测量标准是进行实验成功的一个重要部分。如第二章所讨论的,好的测量标准是可衡量的、相关的、及时的和可操作的。
在 A/B 测试中,测量标准离杠杆越近越好,这通常发生在测量标准既可操作又相关的时候。我的意思是,杠杆直接影响测量标准,而不是一系列的效应链,最终影响所选的测量标准。因此,顶级的关键绩效指标(KPIs)在设计测试时并不是很好的测量标准。正如你所想象的,测量标准的分解可以帮助你找到适合你 A/B 测试的正确测量标准。
假设
至少,好的假设应该在因果的意义上明确陈述如何以及为什么杠杆影响所选的测量标准。
如何是指效应的方向性;例如,假设“如果我们降低价格 1%,客户更有可能购买”清楚地说明了价格折扣会增加转换率。这个假设仍然缺乏为什么,也就是对效应背后机制的理解。为什么对于评估假设的可信度至关重要,也将用于排名目的。
伟大的假设也具有风险,这不仅从公司角度考虑,而是从测试设计者的角度。请比较以下两个可以轻松跟随价格折扣假设的陈述:“测试很重要,因为转换率会增加”,和“测试很重要,因为转换率会增加 1.2 个百分点”。前者只是提供了方向性的指导,后者则量化了预期的影响。量化提供了重要的信息,可以用来对替代假设进行排名。
排名
了解进行实验对任何组织来说都是昂贵的。 一方面,有直接成本,比如所使用的时间、精力和其他资源。但每次与客户互动时,他们对公司的看法可能会改变,可能导致客户流失或至少降低未来的效果(想想客户将你标记为垃圾邮件,从而变得无法接触)。另一方面,还有推出具有更大潜在影响的测试的机会成本。
小贴士
一旦考虑了测试启动的成本,排列不同假设以指导其优先级变得至关重要。一个好的做法是在整个组织中共享假设的后续备份,以便不同团队可以参与和讨论排名及其他相关信息。
实验的治理
如果您将测试作为数据驱动策略的重要组成部分,那么会有一个需要实施和正式化的治理框架的时刻。与数据治理一样,我倾向于站在更务实的一边,而不是试图完成详尽的任务,而是力求满足一组可实施的最低目标。
您的组织可能重要的一些目标是:
责任
实验应有明确定义的所有者(通常是一个团队),负责测试产生的预期或非预期结果。
业务安全
应实施合理的防护措施,以确保没有一个团队的实验能对业务产生重大影响。这些防护措施应在某些预定义的阈值超过时关闭实验。
客户和人类中心性
影响人类、客户或非客户行为的实验应遵循一些与公司价值观高度一致的最低伦理标准。
全局与局部效果
当多个实验同时进行时,有必要确保不同测试的处理组和对照组不重叠。还可能需要制定隔离或休息期的政策,以避免影响业务运营的整体效果和其他测试。
知识增量
作为改进决策的关键因素,来自 A/B 测试的结果应帮助建立和培养一个具有正面和负面结果的知识库。
可复制性和可重复性
用于设计和分析实验结果的任何文档和代码应保存在公司范围的存储库中,以便日后可重现性。
安全性
用于大规模运行实验的技术堆栈应符合公司的数据安全和数据隐私政策。
透明度和监控
结果应尽可能广泛和及时地提供。
主要收获
这些是本章的主要要点:
A/B 测试是改善组织决策能力的强大方法。
您可以将 A/B 测试视为执行组织主要指标的局部优化。
测试应设计以实现期望的统计功效。
A/B 测试应该考虑假阳性或假阴性的概率。统计显著性控制前者,而功效控制后者。功效不足的实验可能会因样本量不足而错误地忽视实验对真实效果的影响。
量化实验的最小可检测效应(MDE)有助于您设计具有良好统计功效的测试。
计算 MDE 很简单,它告诉您对于给定的显著水平、功效、样本大小和考虑中的结果方差,您可以希望估计的最小增量效应。对于给定的 MDE,您可以使用相同的公式解出最小样本大小。
实验治理。
当您的组织越来越成熟并且同时进行的测试数量扩展时,您将需要建立一个治理框架,以实现一些最小的期望目标。我提出了几个可能适合您组织的建议。
进一步阅读
Howard Bloom 在《The SAGE Handbook of Social Research Methods》(2008 年)中的“Randomized Experiments for Social Research”的核心分析,可以在线获取(在线链接),或者他在《Evaluation Review》19(5)中的“Minimum Detectable Effects: A Simple Way to Report the Statistical Power of Experimental Designs”的相关内容也可以在线查阅(在线链接)。你还可以参考《Analytical Skills for AI and Data Science》附录中的我的笔记(附录链接)。
Guido Imbens 和 Donald Rubin 的 Causal Inference for Statistics, Social, and Biomedical Sciences: An Introduction(剑桥大学出版社,2015 年版)第二部分详细讨论了许多与随机化(A/B 测试)相关的统计推断方面,如基于模型的(贝叶斯)推断、Fisher 的精确p值以及 Neyman 的重复抽样。但请注意,他们没有讨论设计问题。
Ron Kohavi、Diane Tang 和 Ya Xu 的《Trustworthy Online Controlled Experiments. A Practical Guide to A/B Testing》(剑桥大学出版社,2020 年版)详细讨论了在规模化设计和运行在线测试时可能遇到的许多实际困难。你还可以在 Ron Kohavi 和 Roger Longbotham 编辑的《Encyclopedia of Machine Learning and Data Science》中找到其显著简短和压缩版本(在线链接)。
Nicholas Larsen 等人的“Statistical Challenges in Online Controlled Experiments: A Review of A/B Testing Methodology”(arXiv,2022 年)提供了对类似主题的最新调查。例如,我没有讨论异质性处理效应或 SUTVA 违规行为。
我发现 Sean Ellis 和 Morgan Brown 的《Hacking Growth: How Today’s Fastest-Growing Companies Drive Breakout Success》(Currency,2017 年)对设计和实施成功的假设积压非常有用。尽管他们专注于与增长相关的主题,但这种方法可以很容易地推广应用。
¹ F 表示t分布的累积分布函数。
² 现在下标是而不是,因为我现在考虑的是单侧检验。
³ 你可以在这里找到推导过程。
⁴ 当然,如果你的公司有十亿客户可以使用,这样微小的转化率增加可能会产生可观的收入,但请允许我在这个例子中继续说明。
第十七章:大语言模型与数据科学实践
据一项估计,2023 年 5 月在美国由于 AI 进展而失去了近 4000 个工作岗位,占当月失业总数的近 5%。另一份来自全球投资银行的报告估计,AI 可能会替代 25%的所有工作,而 OpenAI 作为该领域的主要参与者之一,估计几乎 19%的所有职业存在显著风险,这是通过 AI 可能影响的任务比例来衡量的。一些分析师声称数据科学本身易受影响。
大语言模型(LLMs)如 GPT-4、PaLM2 或 Llama 2 将如何改变数据科学的实践?这本书或其他地方提出的困难部分是否仍然对您的职业发展和职业进步至关重要?
与前几章不同,本章不会讨论任何技术,而是推测AI 对数据科学实践的短期和中期影响。我还将讨论本书的内容在当前 AI 领域的变革中是否经得起时间的考验。
AI 的当前状态
AI 是一个广泛的领域,涵盖了许多不同的技术、方法和方法,但通常与使用非常大的神经网络和数据集相关联。在过去几年中,图像识别和自然语言处理领域的进展速度显著加快,但后者,特别是基于 transformer 的 LLMs 最新发布,如OpenAI 的 GPT4和Google 的 Bard,引发了当前关于它们对劳动市场影响的不安和担忧。
普遍认为 LLMs 在执行自然语言任务方面表现出色,包括文本理解和生成、摘要、翻译、分类和代码生成。有趣的是,随着模型规模达到一定阈值,出现了意外行为。这包括少样本学习,使模型能够从少量观察中学习新任务,以及思维链推理,模型通过将论点分解为步骤来解决问题。
在一篇广泛讨论的关于 LLM 对就业市场影响的论文中,Tyna Eloundou 等人(2023 年)研究了不同职业执行的具体任务,并根据其对 AI 提升生产力的曝光程度将其分类为三组(无曝光、直接曝光或通过 LLM 驱动的应用程序间接曝光)。¹ 除其他有趣的发现外,他们表明某些技能与其曝光度测量相关联。图 17-1 展示了他们分析的基本技能与曝光度之间的相关性。² 如你所见,编程与曝光之间的正相关性最强,科学则是最负相关的;这表明那些严重依赖这些技能的职业或多或少地受到影响。
对于数据科学意味着什么?仅从基本技能来看,你可以假设一些部分是高度曝光的—尤其是编程—而其他部分则不那么曝光(特别是科学和批判性思维)。但这实际上取决于你认为数据科学家做什么。事实是,数据科学家在公司内执行各种各样的任务,不仅仅是机器学习(ML)和编程。

图 17-1. 与曝光影响相关的技能(来自 Eloundou 等人(2023 年)表 5 的平均值)
数据科学家做什么?
为了更好地了解数据科学在当前 AI 中的曝光程度,我将查看实践者在工作场所执行的具体任务。为了本次练习的目的,我将使用在O*Net上呈现的任务列表,这在类似分析中常用;虽然它并不完美,当然也不完整,但它仍然提供了一个有用的基准。
每个任务将根据数据科学中使用的四种主要基本技能进行评估:业务知识、ML 和统计学、编程以及软技能。我的唯一目的是提供一个方向正确的评估,因此我将使用三个可能的级别(低、中和高),分别用数字编码为 0、1 和 3,并在下面用x表示。
例如,我将任务使用统计软件分析、处理或处理大量数据集在业务、ML、编程和软技能方面分别评定为高、低、高和低。对我来说,深入了解业务对分析至关重要,但除此之外,这个任务主要依赖于编程。我为所有任务重复这个过程。³
为了获得曝光估算,我使用以下过程:
-
根据每种基本技能评估每个任务。
-
使用以下方程计算每个任务的曝光:
下面是我在这个公式背后的逻辑和假设:
-
所有基本技能至少可以由 LLMs 学习到一定程度。在曝光方面,我将它们排列为,因此在线性部分上的权重。这种顺序捕捉到了至少在短期内编程比 ML 更加暴露,进而比业务知识更加暴露,而业务知识又比软技能更加暴露的直觉。
-
我认为涉及业务知识的 ML 和编程任务需要分析技能和批判性思维,这些技能在没有人类水平或人工通用智能(AGI)之前将更难发展。因此,我包括降低曝光度指标的交互项。
软技能的重要性值得进一步讨论:我认为软技能在人与人之间的互动中仍然非常重要。但尽管听起来有些牵强,但不难想象在未来的某个状态中,AI 完全取代了互动中的一个人,软技能可能会变得无关紧要。
结果见表 17-1。在 O*Net 网站列出的 15 项任务中,40%被分类为具有高曝光率的技能,20%具有中等曝光率,40%具有低曝光率。从具体任务的曝光度指标来看,它在我看来大体正确,并且如预期的那样,编程和 ML 任务更加暴露,但对分析技能的需求降低了它们的整体曝光度。
六项具有低曝光度指标的任务中,每一项都严重依赖于业务知识、分析技能或软技能。在所有数据科学家识别或提出解决方案的低曝光评估中,分析技能起着重要作用。
在光谱的另一端,我评估为高度曝光的任务在当前 AI 技术的最新水平下更容易自动化。在当前时点上,其中一些仍然需要专家人员的参与,但在不久的将来可能不再需要。
表 17-1. 数据科学任务和曝光度
| 任务 | 曝光度 |
|---|---|
| 将数学建模和数据分析的结果以口头或书面形式呈现给管理层或其他最终用户。 | 低 |
| 向主要利益相关方推荐数据驱动的解决方案。 | 低 |
| 确定可以通过数据分析解决的业务问题或管理目标。 | 低 |
| 使用数据分析的结果确定解决业务问题(如预算编制、人员配置和营销决策)的解决方案。 | 低 |
| 使用数学理论和技术提出工程、科学和其他领域的解决方案。 | 低 |
| 阅读科学文章、会议论文或其他研究来源,以识别新兴的分析趋势和技术。 | 低 |
| 应用特征选择算法于预测销售、流失和医疗使用等感兴趣结果的模型。 | 中等 |
| 使用统计软件分析、操作或处理大数据集。 | 中等 |
| 设计调查、民意测验或其他收集数据的工具。 | 中等 |
| 使用统计软件清理和操作原始数据。 | 高 |
| 确定研究结果可能受到影响的关系和趋势或任何因素。 | 高 |
| 测试、验证和重新制定模型,以确保准确预测感兴趣的结果。 | 高 |
| 应用抽样技术确定要调查的群体或使用完整枚举方法。 | 高 |
| 使用统计性能指标比较模型,如损失函数或解释方差的比例。 | 高 |
| 使用编程语言编写新的函数或应用程序进行分析。 | 高 |
数据科学家职位描述的演变
将数据科学家通常执行的 15 项任务列表作为基准职位描述,并假设关于曝光的预测至少在方向上是正确的,显然随着更强大的人工智能在公司中的部署,数据科学的实践将需要进化。
至少在编程方面,似乎存在一致的看法,即当前的 AI 状态显著提高了开发者的生产力。像GitHub Copilot和Bard这样的工具正在成为标准,有充分的理由相信数据科学家和数据工程师也在接受这些工具。一些评论员甚至谈到了10 倍的生产力增长,而最近的调查发现,超过 90%的开发者已经在使用 AI 作为生产力工具。
然而,目前可以明确的是,当前的 LLM 状态需要有人类专家参与,既可以促使和引导 AI 得出期望的答案,又可以调试可能出现的一些错误并处理任何可能的幻觉。此外,与纯软件开发中的许多工作相反,使用数据进行编程要求输出在商业角度上是有意义的,而目前这项任务需要一个有经验的人类。
但是,值得问的是,在不久的将来,业务利益相关者是否能够直接与人工智能进行交互,完全使数据科学家的工作变得多余。
例如,在许多公司中,数据从业者接收来自利益相关者的业务需求,并编写必要的 SQL 查询以生成报告或仪表板。我认为这是一个高度暴露于 AI 的任务,因此很可能从未来的数据科学家职位描述中消失。
那么未来的数据科学工作描述会是什么样子呢?再次假设未达到 AGI(否则,每个职业都必须重新定义),在我看来有两种替代的长期(较长期)情景:⁴
-
非技术业务利益相关者变得数据驱动,并学会从数据中提出问题,并对其业务问题进行分析和科学思考。
-
数据科学家变得精通业务和分析,并学会根据证据做出业务决策。
在第一个情景中,数据科学职业消失了,非技术业务人员接受广泛的再培训,以获取与 AI 交互并以数据驱动方式回答业务问题所需的技能(类似于早期的 SQL 示例)。在这种情况下,AI 增强了业务精明人员的能力。
在第二种情景中,业务利益相关者变得多余,数据科学家使用 AI 执行技术任务,并利用其独特的分析技能和对业务的了解。
如果有的话,哪种情景最有可能出现?我猜这取决于哪种技能更难获取,是变得数据驱动(并在业务问题上进行科学思考)还是变得业务精明。根据我在过去十年唯一的经验和观察,在关注数据驱动方面,非技术业务人员在数据驱动的前沿上并未取得实质性进展。但数据科学家在业务精明方面也没有。也许当生存受到威胁时,变化终将发生。
案例研究:A/B 测试
我将使用 A/B 测试的案例来解释其中一些预测和推测。在其核心,A/B 测试需要两套技能:
业务
定义和优先考虑待测试的假设积压以及评估实验结果的指标。
技术
设计实验,随机化并确保达到因果效应识别的假设,并测量影响。
我猜想,在大多数公司中,目前在这些领域内数据科学家和业务利益相关者几乎完全功能分离。但撇开需要高度专业化、前沿知识设计和评估实验的 1%个案外,我猜大部分技术细节目前可以在当前技术下实现自动化(LLMs 可能只是作为中介)。在我看来,(非前沿)A/B 测试真正困难的部分是提出好的度量标准和良好的假设来测试。
通过 AI 增强的人类应该能够处理公司运行的绝大部分测试。由于用于训练 LLM 的大量数据语料库,我还可以看到人类在构思假设过程中使用 AI,但是如果没有对世界和业务如何运作以及潜在的因果机制的深入了解,我认为 AI 在这个领域并不关键。
要确定,我并不认为 AI 完全可以独立运行技术方面。一个知识渊博的人类将引导这个过程。问题是,那个人会是谁,他们的角色将被称为什么。
案例研究:数据清洗
数据科学家花费大量时间清理和转换数据,使其适合更有价值的目的。同样,我会假设数据清洗过程的简单部分是实际执行,使用 SQL 或任何其他像 Python 或 R 这样的编程语言,这是今天普遍执行的。
确实困难的部分在于做出依赖于关键业务知识的决策。典型的例子是,你是否应该将空值转换为零。答案是,在某些情况下,这确实有意义,但在其他情况下则不然。而这取决于业务环境。另一个例子是数据质量,你最终会知道事物是正确的,因为从业务角度来看它们是有意义的。
一个非技术的业务利益相关者可以负责这些决策吗,由 AI 增强了处理简单部分的部分帮助?我认为答案是肯定的,但这可能需要一些再培训,或至少一些充分记录的流程。当然,可以想象,在未来,这些内部手册可以用于培训公司的 AI 代理。
案例研究:机器学习
ML 使用案例怎么样?作为一个起点,数据科学家决定应该为特定的用例使用哪种技术。我猜想,随着当前 LLM 的状态,AI 可以轻松地帮助非技术的业务利益相关者做出这一决定(因为网络上有很多关于什么时候做什么的讨论,这也是用于训练当前 LLM 系列的语料库的一部分)。换句话说,我认为人类在做出这个决定时没有比较优势:再次搁置 1%左右的需要高度专业化人才的用例,今天数据科学家学习的就是这样一本指南。然而,一个关键的方面是理解为什么一个工具比另一个更好,显然,LLM 远未达到这种智能水平。
当今最优秀的数据科学家确实专注于每种预测算法的技术细节,并利用这些知识来优化模型,使其性能更出色。例如,训练一个开箱即用的梯度提升分类器非常容易,但要知道优化哪些元参数以提高预测性能则较为困难。但事实上,已经存在自动化 ML 框架来处理这些问题。这就是为什么我不再认为这是一项能让数据科学家在与 AI 的竞争中获得比较优势的关键技能。此外,LLMs 可以或将被用来在需要时建议替代行动方案(再次因为训练数据的记忆/信息检索)。
ML 中的难点在哪里,人类在与 LLMs 的比较中明显具有比较优势?我认为这在于提出关于为何一组特征预测给定结果的潜在因果机制假设。在这里,工作描述中的科学部分至关重要,并且可能在未来使数据科学家比非技术业务人员具有一定优势。
LLMs 和本书
这本书提供了一些技术,旨在帮助您成为更有生产力的数据科学家。自然地,这些技术中有些更多或更少地暴露于 AI,这取决于执行它们所需的基本基础技能的组合。
在 表 17-2 中,我展示了我对每章暴露度的主观评估,使用了与之前完全相同的方法论。再次强调,我的目的只是指导性地正确,而结果对我来说看起来合理:第一部分的章节更多依赖于业务知识和软技能,而不是编程技能和 ML 或统计知识,因此暴露度较低。第二部分涉及更多 ML 和统计内容,因此暴露度更高。
表 17-2. 按暴露度排序的书籍章节
| 章节 | 主要教训 | 暴露度 |
|---|---|---|
| 1. 那么 | 如何衡量您团队的影响 | 低 |
| 7. 叙事 | 如何在创建项目前后构建叙事 | 低 |
| 6. 提升 | 查看群体间差异的技术 | 低 |
| 2. 指标设计 | 找到更好的行动指标 | 低 |
| 3. 增长分解 | 理解业务发展 | 低 |
| 4. 2×2 设计 | 简化理解复杂问题 | 低 |
| 5. 商业案例 | 如何衡量特定项目的影响 | 低 |
| 8. 数据可视化 | 提取知识并传达关键信息 | 中等 |
| 15. 增量性 | 理解因果关系的基础 | 中等 |
| 16. A/B 测试 | 实验设计 | 中等 |
| 10. 线性回归 | 增强您对 ML 算法如何工作的直觉 | 中等 |
| 13. ML 叙事 | 叙事以创建特征和解释结果 | 高 |
| 14. 从预测到决策 | 从 ML 中做决策 | 高 |
| 9. 模拟和启动 | 深入理解 ML 算法的工具 | 高 |
| 11. 数据泄露 | 识别和纠正数据泄露 | 高 |
| 12. 模型产品化 | 部署生产的最小框架 | 高 |
这意味着什么?让我们想象一下,任务要么不受影响,要么完全受到影响;前者意味着 LLMs 毫无价值,而后者意味着 AI 可以自行完成任务。事实上,大多数职业中的任务都处于中间位置,但暂且不去考虑这些。在这个极端的世界中,你应该投资于前一类技能,因为它们使你在 LLMs 面前显得特别。
这个练习的主要目的是,书中学到的某些技能,鉴于 LLMs 当前的能力,更值得你投入时间和精力去发展。请注意,我并不是说你不应该投资成为一个优秀的程序员或者 ML 或统计学专家。至于编程,LLMs 的崛起已经使这项技能对你作为数据科学家的价值降低。对于 ML 和统计学来说,现在仍然为时过早。
当然,我的预测应该持保留态度,但我确信数据科学实践的未来可能会沿着这样一条道路发展:短期内,数据科学家的生产力将通过 LLMs 单独生成高质量代码的能力得到增强,辅以知识渊博的人类。长期来看更加不确定,数据科学实践可能会完全重新设计,甚至可能停止存在,正如先前所讨论的。
关键要点
这些是本章的关键要点:
LLMs 正在改变职场。
2023 年很可能会被记住,因为这是人工智能开始对劳动力市场产生可衡量影响的第一年。
数据科学正在受到影响。
类似于软件开发人员,人工智能对数据科学实践的即时影响体现在编程生产力上。
但许多数据科学家通常执行的其他任务也面临人工智能的曝光。
我分析了 O*Net 列出的 15 项任务,并发现大约 40%的任务面临高度曝光,20%的任务面临中等曝光。自然更依赖编程的任务更容易受到影响,但我认为机器学习和统计学也可能会在中期受到影响。业务知识和软技能被认为受到的曝光较少。
数据科学职位描述的变化。
我的最佳猜测是,数据科学的实践在不久的将来将发生变化,对编程和机器学习技能的重视减少,更加强调分析能力、因果关系和业务知识。
进一步阅读
鉴于领域进展的速度,关于这个主题的建议性阅读很可能会很快过时。也就是说,以下是一些指导我对该领域现状理解的文章。
Tyna Eloundou 等,“GPT 是 GPT:大语言模型对劳动市场影响潜力的早期探讨”,2023 年 3 月,从arXiv检索。该论文提供了关于各种职业中 AI 影响估计的曝光。我没有使用相同的方法来量化数据科学的曝光水平,因此如果您想提出实践的替代方案,这篇论文绝对值得一读。
Sebastien Bubeck 等,“人工通用智能的火花:GPT-4 的早期实验”,2023 年 4 月,从arXiv检索。这篇论文引发了一个有趣的讨论,探讨我们是否接近实现 AGI。他们认为在未来,这类 LLM 很可能会被标记为原型 AGI。请注意,许多领先的研究人员,特别是Yann LeCun(还请参见此处),认为自回归模型不能导致 AGI。
Ali Borji,“ChatGPT 失败的分类档案”,2023 年 4 月,从arXiv检索。该论文不断更新,展示了当前 AI 状态下事物如何可能出错。
Grégoire Mialon 等,“增强语言模型:一项调查”,2023 年 2 月,从arXiv检索。即使 LLM 尚未达到人类普遍智能的水平,也有办法提高它们推理或使用外部工具的能力,覆盖更广泛的用例。
下面两篇论文讨论了随着 LLM 规模的增加而出现的新能力:
Jason Wei 等,“大语言模型的新兴能力”,2022 年 10 月,从arXiv检索。
Rylan Schaeffer 等,“大语言模型的新兴能力是幻觉吗?”,2023 年 5 月,从arXiv检索。
¹ 他们将“曝光”定义为衡量 LLM 或 LLM 驱动系统是否能够将人类执行特定(详细工作活动)或完成任务所需的时间减少至少 50%的指标。
² 在图表中,我平均了他们在表 5 中报告的三个估计值,因此从方向上来说,我捕捉到了他们希望传达的直觉,即某些技能更容易受到 LLM 的影响。
³ 您可以在repo中找到实际的排名。
⁴ 老实说,快速发展的步伐使得真的很难预测什么时候事情可能会发生。


浙公网安备 33010602011771号