fast.ai 机器学习笔记(二)(1)https://developer.aliyun.com/article/1482661
机器学习 1:第 6 课
原文:
medium.com/@hiromi_suenaga/machine-learning-1-lesson-6-14bbb8180d49
译者:飞龙
来自机器学习课程的个人笔记。随着我继续复习课程以“真正”理解它,这些笔记将继续更新和改进。非常感谢 Jeremy 和 Rachel 给了我这个学习的机会。
我们已经看过很多不同的随机森林解释技术,论坛上有一些问题是这些到底有什么用?它们如何帮助我在 Kaggle 上获得更好的分数,我的答案是“它们不一定会”。因此,我想更多地谈谈为什么我们要做机器学习。这有什么意义?为了回答这个问题,我想向你展示一些非常重要的东西,即人们主要在商业中如何使用机器学习的例子,因为这是你们大多数人在结束后可能会在某家公司工作。我将向你展示机器学习的应用,这些应用要么基于我自己亲身参与的事情,要么是我知道直接在做这些事情的人,因此这些都不是假设的——这些都是人们正在做的实际事情,我有直接或间接的了解。
两组应用[1:26]
- 水平:在商业中,水平意味着跨不同类型的业务进行的事情。即涉及营销的所有事情。
- 垂直:在企业内部或供应链或流程中进行的某些事情。
水平应用
几乎每家公司都必须尝试向其客户销售更多产品,因此进行营销。因此,这些框中的每一个都是人们在营销中使用机器学习的一些示例:
让我们举个例子——流失。流失是指试图预测谁会离开的模型。最近在电信领域做了一些流失建模。我们试图弄清楚这家大型手机公司的哪些客户会离开。这本身并不那么有趣。构建一个高度预测性的模型,说 Jeremy Howard 几乎肯定会在下个月离开,可能并不那么有帮助,因为如果我几乎肯定会在下个月离开,你可能无法做任何事情——为了留住我,成本可能太高。
因此,为了理解我们为什么要进行流失建模,我有一个可能对你有帮助的小框架:设计出色的数据产品。几年前我和几位同事一起写了这篇文章,在其中,我描述了我将机器学习模型转化为赚钱的东西的经验。基本技巧是我称之为驱动器方法,这是这四个步骤:
定义目标[3:48]
将机器学习项目转化为实际有用的起点是知道我试图实现什么,这意味着我试图实现高 ROC 曲线下面积或尝试实现类之间的巨大差异。这可能是我试图销售更多的书,或者我试图减少下个月离开的客户数量,或者我试图更早地检测肺癌。这些都是目标。因此,目标是公司或组织实际想要的东西。没有公司或组织是为了创建更准确的预测模型而存在的。这是有原因的。所以这就是你的目标。显然,这是最重要的事情。如果你不知道你为何建模,那么你不可能做好这项工作。希望人们开始在数据科学领域意识到这一点,但有趣的是,很少有人谈论但同样重要的是下一步,即杠杆。
杠杆[5:04]
杠杆是组织可以实际采取的行动,以推动目标的实现。所以让我们以流失建模为例。组织可以采取什么杠杆来减少离开的客户数量?他们可以打电话给某人,问:“你满意吗?我们能做些什么?”他们可以在下个月购买价值 20 美元的产品时赠送免费的钢笔或其他物品。你可以给他们提供特别优惠。所以这些就是杠杆。当你作为数据科学家工作时,不断回头思考我们试图实现什么(我们指的是组织),以及我们如何实现它,即我们可以做哪些实际的事情来实现这个目标。因此,构建模型绝对不是杠杆,但它可以帮助你使用杠杆。
数据[7:01]
接下来的步骤是组织拥有哪些数据可能帮助他们设置杠杆以实现目标。这不是指他们在项目开始时给你的数据。而是从第一原则的角度考虑——好吧,我在一家电信公司工作,他们给了我一些特定的数据,但我肯定他们必须知道他们的客户住在哪里,上个月打了多少电话,打了多少次客服电话等等。所以想一想,如果我们试图决定主动给谁提供特别优惠,那么我们想要弄清楚我们有哪些信息可能帮助我们确定谁会对此做出积极或消极的反应。也许更有趣的是,如果我们正在进行欺诈算法。我们试图弄清楚谁不会支付他们从商店拿出的手机,他们正在进行某种 12 个月的付款计划,然后我们再也没有见到他们。在这种情况下,我们可以获得的数据,数据库中有什么并不重要,重要的是当客户在商店时我们可以获得什么数据。因此,我们通常会受到我们实际可以使用的数据的限制。因此,我们需要知道我试图实现什么目标,这个组织实际上可以具体做些什么来改变结果,以及在做出决定时,他们拥有或可以收集到哪些数据。
模型[8:45]
然后我把所有这些放在一起的方式是通过一个模型。这不是一个预测模型,而是一个模拟模型。我在这篇论文中给出的一个主要例子是,我花了很多年时间建立的一个模型,即如果一个保险公司改变他们的价格,这将如何影响他们的盈利能力。通常你的模拟模型包含了许多预测模型。比如,我有一个叫做弹性模型的预测模型,它说对于一个特定的客户,如果我们为他们的某个产品收取一个特定的价格,他们会在新业务时和一年后续保的概率是多少。然后还有另一个预测模型,即他们会提出索赔的概率以及索赔金额是多少。然后你可以将这些模型结合起来,然后说好,如果我们将我们的定价降低 10%适用于 18 到 25 岁的所有人,然后我们可以通过这些模型运行,将它们结合成一个模拟,那么我们在 10 年后的市场份额的整体影响是 X,我们的成本是 Y,我们的利润是 Z 等等。
实际上,大多数时候,你真的更关心那个模拟的结果,而不是直接关心预测模型。但大多数人目前并没有有效地做到这一点。例如,当我去亚马逊时,我读了道格拉斯·亚当斯的所有书,所以在我读完所有道格拉斯·亚当斯的书之后,下次我去亚马逊,他们说你想买道格拉斯·亚当斯的全部作品吗。这是在我已经买了他的每一本书之后。从机器学习的角度来看,一些数据科学家可能会说,购买道格拉斯·亚当斯的一本书的人通常会继续购买他的全部作品。但向我推荐购买道格拉斯·亚当斯的全部作品并不明智。这实际上在很多方面都不明智。不仅是因为我不太可能购买一个我已经有每一本书的合集,而且这也不会改变我的购买行为。我已经了解道格拉斯·亚当斯,我已经知道我喜欢他,所以占用你宝贵的网页空间来告诉我,嘿,也许你应该购买更多你已经熟悉并多次购买的作者的作品实际上不会改变我的行为。那么,如果亚马逊不是创建一个预测模型,而是建立一个能够模拟的优化模型,然后说如果我们向杰里米展示这个广告,他会有多大可能继续购买这本书,如果我不向他展示这个广告,他会有多大可能继续购买这本书。这就是对立事实。对立事实是否则会发生什么,然后你可以计算差异,然后说我们应该推荐他什么才能最大程度地改变他的行为。所以最大程度地导致更多的书籍,所以你可能会说,哦,他从来没有买过特里·普拉切特的书,他可能不了解特里·普拉切特,但很多喜欢道格拉斯·亚当斯的人确实喜欢特里·普拉切特,所以让我们向他介绍一个新的作者。
因此,一方面是预测模型,另一方面是优化模型之间的区别。所以这两者往往是相辅相成的。首先,我们有一个模拟模型。模拟模型是在说,如果我们把特里·普拉切特的书放在亚马逊的首页上给杰里米·霍华德看,会发生什么。他有 94%的概率会购买。这告诉我们,通过这个杠杆,我今天应该在杰里米的首页上放什么,我们说好,把特里·普拉切特放在首页上的不同设置会产生最高的模拟结果。然后这就是最大化我们从杰里米今天访问亚马逊网站中的利润的事情。
一般来说,你的预测模型会输入到这个模拟模型中,但你必须考虑它们如何共同工作。例如,让我们回到流失问题。结果表明,Jeremy Howard 很可能会在下个月离开他的手机公司。我们该怎么办?让我们给他打电话。我可以告诉你,如果我的手机公司现在给我打电话说“只是打电话告诉你我们爱你”,我会立刻取消。那将是一个糟糕的主意。因此,你会想要一个模拟模型,来说 Jeremy 现在接到电话后改变行为的概率是多少。所以我有一个杠杆是给他打电话。另一方面,如果明天我收到一封信,说每个月你和我们在一起,我们会给你十万美元。那肯定会改变我的行为,对吧?但是将这个输入到模拟模型中,结果是这将是一个不盈利的选择。你看到这是如何相互配合的吗?
所以当我们看流失这样的问题时,我们要考虑我们可以拉动的杠杆是什么。我们可以用什么样的数据构建什么样的模型来帮助我们更好地拉动这些杠杆以实现我们的目标。当你这样思考时,你会意识到这些应用的绝大部分实际上并不是关于预测模型。它们是关于解释的。它们是关于理解“如果发生了什么”。因此,我们可以实际使用我们的随机森林特征重要性告诉我们我们实际上可以做些什么来产生影响。然后我们可以使用部分依赖来构建这种模拟模型,来说如果我们改变了那个,会发生什么。
所以有很多例子,当你思考你正在处理的机器学习问题时,我希望你考虑为什么有人会关心这个问题。对他们来说一个好的答案是什么样的,你如何实际上对这个业务产生积极影响。所以如果你在创建一个 Kaggle 内核,试着从竞赛组织者的角度思考。他们想知道什么,你如何给他们这些信息。另一方面,像欺诈检测,你可能只是想知道谁是欺诈的。所以你可能只关心预测模型。但是你必须仔细考虑这里的数据可用性。所以好吧,我们需要知道在我们即将向他们交付产品时谁是欺诈的。例如,查看一个月后可用的数据是没有意义的。所以你必须考虑你正在工作的实际运营约束。
人力资源应用。
在人力资源领域有很多有趣的应用,比如员工流失,这是另一种流失模型,其中发现杰里米·霍华德已经厌倦了讲课,他明天就要离开了。你会怎么做?知道这个事实实际上并不会有帮助。那将会太迟了。你实际上想要一个模型,告诉你什么样的人会离开 USF,结果发现每个去楼下咖啡厅的人都会离开 USF。我猜他们的食物很糟糕或者其他什么原因。或者我们支付不到 50 万美元一年的人都会离开 USF,因为他们无法负担旧金山的基本住房。因此,你可以使用员工流失模型,不是为了知道哪些员工讨厌我们,而是为什么员工离开。再次强调,真正重要的是解释。
问题:对于流失模型,听起来你需要预测两个预测因子——一个是流失,另一个是你需要优化你的利润。那么它是如何工作的[18:30]?是的,确切地说,这就是模拟模型的全部内容。你找出我们试图最大化的目标,即公司的盈利能力。你可以创建一个相当简单的 Excel 模型或其他模型,它说这是收入,这是成本,成本等于我们雇佣的人数乘以他们的工资等。在这个 Excel 模型中,有一些单元格/输入是随机的或不确定的。但我们可以用模型来预测,这就是我要做的,我要说好,我们需要一个预测模型,来预测如果我们改变他们的工资,某人留下的可能性有多大,如果我现在增加他们的工资,明年他们离开的可能性有多大等。因此,你需要一堆不同的模型,然后你可以用简单的商业逻辑将它们绑定在一起,然后进行优化。然后你可以说,如果我给杰里米·霍华德 50 万美元,那可能是一个非常好的主意,如果我付给他更少,那可能就不是了,或者其他什么。你可以找出整体影响。所以我真的很惊讶,为什么这么少的人这样做。但大多数行业中的人用 AUC 或 RMSE 等来衡量他们的模型,这实际上并不是你真正想要的。
更多水平应用…[22:04]
潜在客户优先级是一个非常有趣的领域。我展示的每一个方框,通常都可以找到一家或多家公司,他们的唯一工作就是构建该领域的模型。因此,有很多公司销售潜在客户优先级系统,但问题是我们如何利用这些信息。如果我们的最佳潜在客户是杰里米,他是最有可能购买的人。这意味着我应该派一个销售人员去找杰里米,还是不应该?如果他很有可能购买,为什么我要浪费时间呢。因此,你真的需要一种模拟,来告诉你如果我派出最好的销售人员去鼓励他签约,杰里米的行为可能会发生什么变化。我认为今天世界上有很多机会让数据科学家不仅仅局限于预测建模,而是将所有内容整合在一起。
垂直应用[23:29]
除了这些基本适用于每家公司的横向应用之外,还有许多应用程序是针对世界各地的每个部分特定的。对于那些最终进入医疗保健领域的人,你们中的一些人将成为这些领域的专家之一。比如再入院风险。那么这位患者再次入院的概率是多少呢?根据司法管辖区的细节,当有人再次入院时,这可能对医院造成灾难。如果你发现这位患者有高再入院的可能性,你会怎么做?再次,预测模型本身是有帮助的。它更多地暗示我们不应该立即让他们回家,因为他们会再次入院。但如果我们有树解释器,并且它告诉我们,他们高风险的原因是因为我们没有最近的心电图。没有最近的心电图,我们就无法对他们的心脏健康有高度的信心。在这种情况下,我们不会说让他们在医院呆两周,而是让他们做一个心电图。因此,这是解释和预测准确性之间的互动。
问题:所以我理解你的意思是,预测模型确实很棒,但为了真正回答这些问题,我们确实需要专注于这些模型的可解释性?是的,我想是这样。更具体地说,我正在说我们刚刚学习了一整套随机森林解释技术,所以我正在试图证明为什么。原因是因为我会说大多数时候解释是我们关心的事情。你可以创建一个图表或表格而不需要机器学习,实际上这就是大多数世界的工作方式。大多数经理们在没有任何机器学习的情况下构建各种表格和图表。但他们经常做出糟糕的决定,因为他们不知道他们感兴趣的目标的特征重要性,所以他们创建的表格实际上是那些最不重要的东西。或者他们只是做一个单变量图表,而不是一个部分依赖图,所以他们实际上没有意识到他们认为自己在看的关系完全是由其他因素造成的。所以我在争论数据科学家应该更深入地参与战略,并尝试使用机器学习来真正帮助企业实现所有目标。有一些公司像 dunnhumby 这样的公司,他们什么都不做,只做零售应用的机器学习。我相信有一种 dunnhumby 产品可以帮助你弄清楚,如果我把我的新店放在这个位置而不是那个位置,有多少人会在那里购物。或者如果我把尿布放在商店的这个部分而不是那个部分,这将如何影响购买行为等等。因此,也很重要意识到,在技术媒体或其他地方你经常听到的机器学习应用的子集是这种极其偏见的微小子集,谷歌和 Facebook 做的就是这种。而实际上让世界运转的绝大部分应用是这些实际上帮助人们制造东西、购买东西、销售东西、建造东西等等的应用。
问题:关于树的解释,我们看了哪个特征对于特定观察结果更重要。对于企业来说,他们有大量数据,他们希望对很多观察结果进行这种解释,那么他们如何自动化呢?他们设置阈值吗[27:50]?绝大多数机器学习模型并不自动化任何东西。它们被设计为向人类提供信息。所以例如,如果你是一个保险公司的客服电话操作员,你的客户问你为什么我的续保费比上次贵了 500 美元,那么希望保险公司在你的终端提供那些显示树解释结果的小屏幕。这样你就可以跳过去告诉客户,去年你住在一个车辆被盗率较低的邮政编码区,而今年你还把车换成了更贵的车。所以这并不是关于阈值和自动化,而是关于让这些模型输出对组织中的决策者可用,无论是在顶层战略层面,比如我们是否要关闭整个产品,还是在操作层面,比如与客户进行个别讨论。
另一个例子是飞机调度和登机口管理。有很多公司在做这个,基本上是有人在机场,他们的工作是告诉每架飞机去哪个登机口,什么时候关闭舱门等等。所以这个想法是给他们一个软件,里面有他们需要做出良好决策所需的信息。所以机器学习模型最终嵌入在那个软件中,比如说,那架目前从迈阿密飞来的飞机,有 48%的概率会晚 5 分钟以上,如果晚了,那么整个航站楼会受到影响,例如。这就是这些东西是如何结合在一起的。
其他应用[31:02]
有很多应用,我希望你花一些时间去思考它们。和你的朋友坐下来,谈论一些例子。比如说,我们如何进行制造业的故障分析,谁会做这个,为什么会做这个,他们可能会使用什么样的模型,可能会使用什么样的数据。开始练习并获得感觉。然后当你在工作场所和经理们交谈时,你希望能立即认识到你正在交谈的人——他们想要实现什么,他们有哪些杠杆可以拉动,他们有哪些数据可用来拉动这些杠杆以实现那个目标,因此我们如何构建模型来帮助他们做到这一点,他们可能需要做出什么样的预测。这样你就可以与这些人进行深思熟虑的共情对话,然后说“为了减少离开的客户数量,我猜你正在努力找出应该给谁提供更好的定价”等等。
问题:社会科学中人们面临的解释问题是否可以使用机器学习或者已经被使用,或者这并不是真正的领域[32:29]?我与社会科学领域的人们进行了很多关于这个问题的讨论,目前机器学习在经济学或心理学等领域并没有得到很好的应用。但我相信它可以,原因正如我们所讨论的那样。因此,如果您要尝试进行某种行为经济学研究,并且试图理解为什么有些人的行为与其他人不同,使用具有特征重要性图的随机森林将是一个很好的开始。更有趣的是,如果您尝试进行某种基于大型社交网络数据集的社会学实验或分析,在那里您进行了一项观察性研究,您真的想要尝试提取所有外生变量的来源(即所有外部发生的事情),因此如果您使用具有随机森林的部分依赖图,这将自动发生。几年前,我在麻省理工学院做了一个关于数字实验的第一次会议的演讲,这次会议真正讨论了我们如何在诸如社交网络等数字环境中进行实验,经济学家们都使用经典的统计检验方法,但在这种情况下,我与之交谈的经济学家们对此非常着迷,他们实际上要求我在麻省理工学院为经济学系的各种教员和研究生们举办一个机器学习入门课程。其中一些人已经写了一些相当有名的书籍,希望这对他们有所帮助。现在还处于早期阶段,但这是一个巨大的机会。但正如 Yannet 所说,仍然存在很多怀疑。这种怀疑主要来自对这种完全不同方法的陌生感。因此,如果您花了 20 年时间研究计量经济学,然后有人过来说这是一种完全不同于计量经济学家所做的所有事情的方法,那么您的第一反应自然会是“证明它”。这是公平的,但我认为随着时间的推移,下一代与机器学习一起成长的人们中,一些人将进入社会科学领域,他们将产生前所未有的巨大影响,人们将开始感到惊讶。就像计算机视觉中发生的一样。当计算机视觉花了很长时间的人们说“也许你应该使用深度学习来进行计算机视觉”,而计算机视觉领域的每个人都说“证明它。我们在计算机视觉中有几十年的工作,开发了令人惊叹的特征检测器。”然后在 2012 年,辛顿和克里赞斯基出现了,他们说“我们的模型比你们的好两倍,而我们刚刚开始” ,每个人都被说服了。如今,几乎每个计算机视觉研究人员基本上都使用深度学习。因此,我认为在这个领域也会出现这样的时刻。
随机森林解释方法[37:17]
在谈论它们为什么重要之后,让我们现在提醒自己它们是什么。
基于树方差的置信度
这告诉我们什么?为什么我们对此感兴趣?它是如何计算的?
树的预测方差。通常预测只是平均值,这是树的方差。
在这里填充一个细节,我们通常只取一行/观察结果,然后找出我们对此有多自信(即树中有多少方差)或者我们可以像我们在这里做的那样为不同的组找出答案[39:34]。
我们在这里所做的是看是否有任何我们非常不确定的组(这可能是由于观察很少)。我认为更重要的是当你在操作中使用这个时。比如说你正在做一个信用决策算法。所以我们正在确定 Jeremy 是一个好风险还是一个坏风险。我们应该借给他一百万美元吗。随机森林说“我认为他是一个好风险,但我一点也不自信。” 在这种情况下,我们可能会说好吧,也许我不应该给他一百万美元。而在另一种情况下,如果随机森林说“我认为他是一个好风险,而且我非常确定”,那么我们就更愿意给他一百万美元。而且我是一个非常好的风险。所以请随意给我一百万美元。我之前检查过随机森林——在另一个笔记本中。不在 repo 里 😆
对于我来说,很难给你们直接的经验,因为这种单个观察解释实际上是你需要把它放到前线的那种东西。这不是你在 Kaggle 上可以真正使用的东西,而更像是如果你实际上在发布一些可能会花费很多钱的大决策的算法,你可能不太关心随机森林的平均预测,而更可能是你实际上关心平均值减去几个标准差(即最坏情况的预测)。也许有一个我们不确定的整个组,所以这是基于树方差的置信度。
特征重要性 [42:36]
学生: 基本上是为了找出哪些特征是重要的。你取每个特征,洗牌特征中的值,然后检查预测如何变化。如果非常不同,那意味着该特征实际上很重要;否则就不那么重要。
Jeremy: 那太棒了。一切都是完全正确的。有一些细节被略过了一点。还有其他人想要详细描述一下它是如何计算的吗?我们如何准确计算特定特征的重要性?
学生: 在构建随机森林模型后,你取每一列并随机洗牌它。然后运行一个预测并检查验证分数。如果在洗牌其中一列后变糟了,那意味着那列很重要,所以它具有更高的重要性。我不太确定我们如何量化特征的重要性。
Jeremy: 好的,很好。你知道我们如何量化特征的重要性吗?那是一个很好的描述。为了量化,我们可以计算 R²或某种得分的差异。所以假设我们有我们的因变量是价格,还有一堆独立变量,包括制造年份。我们使用所有这些来构建一个随机森林,这给我们我们的预测。然后我们可以比较得到 R²、RMSE,或者你对模型感兴趣的任何东西。
现在关键的是我不想重新训练整个随机森林。那太慢又无聊了,所以使用现有的随机森林。我如何找出年份的重要性呢?建议是,让我们随机洗牌整个列。现在那一列完全没用了。它的均值、分布都是一样的。关于它的一切都是一样的,但实际年份制造和现在那一列之间根本没有联系。我已经随机洗牌了。所以现在我把这个新版本放到同一个随机森林中(所以没有重新训练),得到一些新的ŷ(ym)。然后我可以将其与实际值进行比较,得到 RMSE(ym)。所以现在我可以开始创建一个小表,我有原始 RMSE(例如为 3),年份制造混乱的 RMSE 为 2。围栏混乱的 RMSE 为 2.5。然后我只需要取这些差值。对于年份制造,重要性为 1,围栏为 0.5,等等。在我洗牌了那个变量之后,我的模型变得更糟了多少。
问题:所有的重要性加起来会等于一吗?老实说,我从来没有看过单位是什么,所以我不太确定。如果有人感兴趣,我们可以在这周内查看一下。看一下 sklearn 的代码,看看这些度量单位到底是什么,因为我从来没有费心去检查。虽然我不会专门检查度量单位,但我会检查相对重要性。这里有一个例子。
所以,与其只说前十名,昨天一个实习生问我一个特征重要性的问题,他们说“哦,我认为这三个很重要”,我指出排名第一的比第二个重要一千倍。所以看看这里的相对数字。所以在这种情况下,就像“不要看前三名,看那个重要一千倍的,忽略其他所有的。”你的自然倾向是想要准确和小心,但这就是你需要覆盖的地方,要非常实际。这个东西重要一千倍。不要花时间在其他任何事情上。然后你可以去和你的项目经理谈谈,告诉他这个东西重要一千倍。然后他们可能会说“哦,那是个错误。它不应该在那里。我们实际上在决策时没有那个信息,或者由于某种原因我们实际上不能使用那个变量。”那么你可以移除它并查看。或者他们可能会说“天哪,我完全不知道那比其他所有东西加起来都重要得多。所以让我们忘掉这个随机森林的东西,专注于理解如何更好地收集那个变量并更好地使用那个变量。”这是一个经常出现的情况,实际上昨天刚刚发生了另一个地方。另一个实习生问我“我正在做这个医学诊断项目,我的 R²是 0.95,这是一个据说很难诊断的疾病。这是随机森林天才还是出了什么问题?”我说记住,建立随机森林之后你要做的第二件事是进行特征重要性分析,所以进行特征重要性分析,你可能会发现排名第一的列是不应该在那里的。这就是发生的事情。他半小时后回到我这里,他说“是的,我做了特征重要性分析,你是对的。排名第一的列基本上是另一个对因变量的编码。我把它移除了,现在我的 R²是-0.1,这是一个改进。”
我喜欢看的另一件事是这个图表:
基本上它说的是在哪些方面趋于平缓,我应该真正关注哪些方面。这是最重要的。当我在电信行业进行信用评分时,我发现有九个变量基本上可以准确预测谁最终会支付他们的电话费,谁不会。除了最终得到一个每年节省三十亿美元欺诈和信用成本的模型外,它还让他们基本上重新调整了他们的流程,以便更好地收集这九个变量。
fast.ai 机器学习笔记(二)(3)https://developer.aliyun.com/article/1482666