如何挑选一个成功的人工智能项目,第 2 部分:处理数据
这篇文章是“如何挑选一个成功的人工智能项目”系列文章的一部分。第一部分,第三部分。即使你独立地阅读每一部分,它们也能很好地工作。
在这里,我将介绍在选择人工智能项目时与数据相关的技巧和诀窍。我在人工智能深度潜水和数据科学静修中指导了超过 150 人。
您的最小可行数据集比您想象的要小
我们如何才能在 2050 年前将粮食产量翻一番,以养活 90 亿人?两个人拿着智能手机走来走去拍照,这个解决方案能启动吗?
举一个自举数据集的例子,以 Blueriver Inc .为例,他们从事精准农业。通过精确地喷洒在正确的位置,可以减少 90%的除草剂用量。
See & Spray 机器使用深度学习来更准确地识别更多种类的植物,然后当场做出作物管理决策。定制喷嘴设计使得<1-inch spray resolution. They focus on cotton and soybeans.
In September 2017, John Deere acquired Blue River for 300 million.
What was the dataset Blue River started with? Collected by a handful of guys with phones taking pictures while walking down an entire crop field:
Often the amount of data you need for proof of concept is ‘not much’ (thanks to pretrained models!).
You can collect and label the data yourself, with tiny, tiny resources. 我指导的投资组合项目中可能有 50%是从不存在的数据开始的,而团队生成了这些数据。fast.ai 的创始人杰瑞米·霍华德也坚定地打破了“你需要谷歌大小的数据集”才能从人工智能中获得价值的神话。
多么好的机会;现在活着是令人兴奋的,有这么多问题可以用现成的技术解决。一个农业机器人可以处理移动摄像机数据开辟了一条新的道路。下次你想出人工智能项目的时候,把蓝河作为你创造的数据的可能性的参考。
知道“你的最小可行数据集比你想象的要小”会极大地拓展你可以处理的项目范围。
因为有了预训练的模型,你不需要那么多数据
模型动物园是预先训练好的网络的集合。那里的每个网络都为解决类似问题的人节省了大量的时间和数据。例如:
模型动物园的管理员让你的生活轻松多了。随着最近在 ML 方面的成功,研究人员获得了更多的资助,发表了来自享有强大机器和数周计算的学术界的模型。行业领导者经常发布他们的模型,希望吸引人才或抵消竞争对手的优势。
一个数据科学家 80%的时间都在清理数据;另外 20%抱怨清理数据
这是个笑话,但离真相不远。如果你把大部分时间花在数据准备上,不要感到惊讶。
数据增强在图像上运行良好
不要‘手动’做,今天有用于最常见的数据扩充任务(水平和垂直移动、水平和垂直翻转、随机旋转等)的库。这是一个非常标准的预处理步骤。
通过询问公司/个人获得独特的数据
有一支队伍曾经需要鸟鸣。原来有一个鸟类观察者协会有一个巨大的歌曲数据集。他们可以把它给我们的团队,不问任何问题。
公司可能有他们不太关心的数据。其他时候,他们确实关心它们,但如果你提供一些有价值的东西作为交换,比如他们可以使用的预测模型,他们还是会把它们给你。如果你要求的话,政府通常会给你数据。
如果你想不出用更传统的方法来获取数据,试着去问。发送几封电子邮件可能是对你时间的一个很好的利用。如果学者们发表了一篇相关的论文,并且你提出了要求,他们应该分享他们的数据。不一定管用,但值得一试。寻找任何优势的小公司,只要得到一些利益,可能都想和你合伙。
边缘计算(联合学习),避免隐私问题
这是我们在 2019 年的生活:华为新推出的“super zoom”P30 Pro 智能手机摄像头可以识别远处的人,并将神经网络应用于唇读。计算机视觉系统可以在同一个人改变位置(例如,从地铁站出来)时重新识别他们,这一切都表明大规模监控在技术上日益成熟。隐私是“最重要的”
企业可以接触到越来越多的公民私人数据;监管机构试图保护我们的隐私,并限制对这些数据的访问。隐私保护并非没有副作用:它经常导致科学进步受阻的情况。例如,欧洲的 GDPR 法规似乎是研究人员和公司将机器学习应用于许多有趣问题的严重障碍。与此同时,健康数据等数据集受益于隐私;想象一下,如果你得了一场重病,而雇主因此而不雇用你。
一个解决方案:如果不是将训练数据的语料库带到一个地方来训练模型,而是将模型带到数据生成的任何地方,会怎么样?这被称为联合学习,由谷歌在 2017 年首次提出。
这样,即使你不能立刻访问整个数据集,你仍然可以从中学习。
Andrew Trask, harbinger of federated learning
如果你对这个话题感兴趣,请关注安德鲁·特拉斯克。他有一门关于联合学习的 coursera 课程,还有一个方便的 jupyter 笔记本,上面有一个算出的例子。
为什么这在挑选人工智能项目的对话中很重要?因为如果你的项目使用联合学习,你可能更容易让人们给你数据和使用你的产品。它为不同类别的项目打开了大门。
数据重用和伙伴关系
数据具有极佳的二次价值。
也就是说,通常,您可以找到收集数据的实体没有想到的数据用途。通常通过合作关系,数据的新用途可以产生二次收入流。例如,您可以集成:
-关于欺诈的数据
-来自信用评分的数据,
-来自客户流失的数据,
-关于购买的数据(来自不同来源)
发布这些数据(包含个人数据)的组织可能会使用限制您使用的许可证。您需要检查他们是否明确拥有数据重用的许可,否则最好联系他们并就您项目的许可达成一致。
但是要小心问题:
1.如果你的产品依赖于只有一个合伙人才能产生的数据,你就掌握在他们手中。当你决定结束合作的时候,他们就结束了你的生意。
2.如果不同数据集中唯一的共享变量是一个人,那么数据整合将会非常困难。有助于识别个人身份的数据在世界上的某些地方受到监管。
即使你可以合法地整合这些不同的数据源,记住在大公司里有整个团队致力于整合。永远不要认为这会顺利进行。
使用公共数据并不是唯一的选择。有些人会抱怨,对于每个公开的数据集,已经有很多项目了。很难脱颖而出。也许值得给业内人士发邮件,获取一些别人没有的数据(数据合作)。如果你提供你的模型的结果来交换使用权,一些公司可能会被说服。
做 Kaggle 怎么样?对于投资组合项目来说,这不是一个好主意,因为 1/找到问题和数据的困难已经完成,2/很难从一群竞争者中脱颖而出,这些竞争者可能花了比你更多的时间来拟合模型,并且有更好的表现。
发现数据的二次利用是一项了不起的技能。提出项目想法可以训练这种技能。
使用非结构化数据
几十年来,ML 可以使用的所有数据都是表格的形式。那些作为附件到处乱飞的 excel 文件,那些 SQL 数据库…表格数据是唯一能从 ML 中获益的东西。
自 2010 年以来,这种情况发生了变化。
非结构化数据包括:
- 形象
- 由真实的人写的话,不遵循预先定义的模式,使用充满细微差别的语言。
- 录像
- 音频(包括语音)
- 有时,传感器数据(流)
定义为非结构化的数据每年以 55–65%的速度增长。电子邮件、社交媒体帖子、呼叫中心记录……这些都是非结构化数据集的优秀示例,可以为企业提供价值。
你可能认为‘每个人都知道这一点,为什么要提它’……但根据我的经验,到处都有大公司没有收到备忘录。如果您为其中一家公司工作,并且碰巧发现了他们可能拥有的非结构化数据的用例,那么您就发现了可能会改变职业生涯的东西。
以银行为例。对他们来说,数据意味着来自市场和证券价格的数字信息。例如,现在他们使用夜间光线强度、油罐阴影和停车场汽车数量的卫星图像,可以用来估计经济活动。
根据我的经验,在 AI Deep Dive 和数据科学务虚会上,大多数人选择非结构化数据用于投资组合项目。用这些很容易通过“眉毛测试”。另外,它们在野外大量存在。每个人都可以访问图片、文本…与表格数据如货币交易形成对比。
一个缺点是:非结构化数据可能会引发合规性问题。你永远不知道在一大堆文本中隐藏着什么。这些邮件里有机密信息吗?即使我们试图匿名,用户的个人数据会泄露吗?
你可能还记得美国在线的惨败。2006 年 8 月 4 日,AOL Research 在它的一个网站上发布了一个压缩文本文件,其中包含超过 650,000 个用户在 3 个月的时间内使用的 2000 万个搜索关键词,用于研究目的。8 月 7 日,AOL 删除了他们网站上的搜索数据,但在此之前,这些数据已经被镜像并在互联网上发布。AOL 在报告中没有指明用户;然而,个人身份信息出现在许多查询中,给数据集中的用户带来了隐私噩梦。
—
给你。我学到的关于挑选一个好项目的事情与收集和清理数据有关。
在本系列的最后一部分,我将讲述我在模型构建方面所学到的影响你如何选择人工智能项目的知识。
如何挑选一个成功的人工智能项目,第 3 部分:使用模型
这篇文章是“如何挑选一个成功的人工智能项目”系列文章的一部分。第一部分,第二部分。即使你独立地阅读每一部分,它们也能很好地工作。
在这里,我将讲述我在与模型打交道中所学到的东西,以及这对选择一个将会成功的人工智能项目有多么重要。我在人工智能深度潜水和数据科学静修中指导了超过 165 人。
没什么理论
如果你问 meetup 主持人“你是如何选择你的架构的?”最有可能的答案是类似于“我从博客帖子或论文中复制了它,然后进行了调整。”几乎没有指导如何选择架构的理论。该领域似乎处于中世纪学徒阶段,学徒们复制大师的作品。尽管这个领域每年产生 1000 篇论文,但理论方面的文章很少。从业者产生“经验法则”来挑选架构和训练模型。一个很好的例子是吴恩达的书《机器学习的渴望》。’
这本书充满了我们所拥有的最接近“理论”的东西,用来挑选架构和微调模型。
你需要有一个黄金标准
你的模型必须改进一个重要的 KPI。这意味着有一些可观察的、可测量的东西,模型比基线做得更好(这通常意味着根本没有模型)。
监督学习比无监督学习更好,因为你可以证明你的模型做了什么。
如果你使用聚类分析,你的老板总是会说‘你给我看 3 个聚类,为什么不是 5 个呢?’我想有 5 个。这个没有正确答案。受监督的模型有明确的性能指标,而且经常可以“用眼睛”检查(嘿,你的狗分类器漏掉了这只看起来像蔓越莓蛋糕的狗。)
使用预训练模型
使用迁移学习,你不是从零开始学习过程,而是从解决不同问题时学到的模式开始。这样,你可以利用以前的学习,避免从头开始。
当您根据自己的需要重新调整预训练模型的用途时,首先要删除原始分类器,然后添加一个符合您的目的的新分类器。您可以节省时间(在处理具有数百万参数的大型深度网络时,可以节省数周时间)。
公共领域中有一些模型库,例如:
[## cadene/pretrained-models . py torch
pytorch 的预训练 conv net:NASNet、ResNeXt、ResNet、InceptionV4、InceptionResnetV2、Xception、DPN 等。…
github.com](https://github.com/Cadene/pretrained-models.pytorch)
也试试 https://paperswithcode.com。顾名思义,这是一个可搜索的论文集合,具有公共实现,是一个很好的起点。
如果你已经学过 fast.ai 或者其他很多 ML 课程,你知道的已经足够开始重用预训练模型了。即使您无法找到与您的问题匹配的预训练模型,使用一个几乎不相关的模型通常比从头开始要好。如果您的数据很复杂,并且您的体系结构将超过十几层,情况就更是如此。需要很长时间(而且硬件大!)来培养大架构。
对新型号保持一定的了解是有好处的;跟踪艺术的状态是不必要的,但可以肯定的是,现在比以往任何时候都容易。Twitter 会告诉你是否有什么重要的事情突然出现。如果有人做了一个很棒的演示,Twitter 就会火起来。关注几个经常发这些东西的人就好了。
要浏览 arXiV,试试 arxiv sanity (这有助于捕捉趋势,如果你想成为一名 ML 从业者,我不建议你优先考虑纸质阅读。你可能需要快速行动来交付成果,以至于阅读论文成为你负担不起的奢侈品。)关于演讲视频: https://nips.cc 现在大多数演讲都有视频。处理 NeurIPS 是一项巨大的工作,所以很容易在人们参加后不久阅读他们的摘要。
我指导的大多数项目(至少最近一两年)都使用了迁移学习。想想 10 年前的自己。如果你告诉过去的自己,在未来,任何人都可以下载一个花了几周时间训练的最先进的 ML 模型,你会感到惊讶吗?用它来建造任何你想要的东西?
所有科学学科发表的论文都用 ML,但是模型都不是很强;改善它们是一个快速的胜利
例如,这篇关于如何根据放电模式预测电池寿命的论文发表在最好的科学杂志之一《自然》上。他们的机器学习充其量只是初步的;这实际上是意料之中的,因为作者是电气工程,而不是机器学习。该团队更关注他们在电气工程领域的知识,而不是机器学习部分。在第 18 批数据科学务虚会上,一个非常精明的参与者团队(汉尼斯·诺布洛赫、阿德姆·弗伦克和温迪·张)看到了一个机会:如果我们用更复杂的模型让做出更好的预测会怎么样?他们不仅设法在纸上击败了模型的性能;他们从 Bosch 那里得到了继续工作 6 个月的机会(已支付!无股权)。他们拒绝了这个提议,因为他们毕业后都有更好的计划。
汉尼斯、阿德姆和温迪所做的事情,充满了机会;那么多论文提供了数据和(低)基准。忘记做 Kaggle 比赛;在这些高调的文件中有更多的机会!
避免大猩猩问题
以下内容仅适用于产生用户可见结果的模型。如果您的模型的最终用户是另一台机器(例如,您生产了一个其他机器使用的 API),那么您可以跳过这一节。
你的 ML 模型为你的用户提供价值,但前提是他们信任结果。你会看到,这种信任是脆弱的。
2015 年,Google photos 使用机器学习来标记图片的内容,并改进搜索。虽然这种算法的准确度让谷歌高管批准它投入生产,但它有“灾难性的错误标注”。你可以想象这对谷歌和机器学习领域来说是一场公关灾难。谷歌发布了一个修复程序,但第一个修复程序并不充分,因此谷歌最终决定不给任何照片添加“大猩猩”标签。
我们从中学到了什么?如果你的问题依赖于一个算法,而这个算法有可能错误地分类一些破坏信任的东西:选择另一个问题。
在我监管的 200 个项目中,当一个团队提出一个有“大猩猩问题”的想法时,我会引导他们远离它。你可以花几个月的时间做那些被大猩猩问题弄得无效的一流 ML 工作。另一个例子是标记“假新闻”:如果你的算法将我的一个意见领袖(一个我盲目信任的人)标记为“假新闻”,你就永远失去了我。
多个模特完成一项任务(例如:捡烟头)
让无人驾驶汽车发挥作用是一系列工程问题。许多不同的 ML 模型协同工作,带你去你想去的地方(原谅这个双关语)。
我们实验室的一个例子:Emily 是一辆自动驾驶的玩具车,它能找到并捡起我们之前提到的烟头,它正在做 3 个子任务:
-识别烟头
-将车开得足够近,让烟头触手可及
-捡烟头(捅)
每个子任务都是一个模型。
请注意,烟头的毒性令人难以置信(一个烟头可以污染 40 升水),而且很难用扫帚捡起来,因为它们太轻了)。结果,它们在公共区域堆积。一大群这样的机器人可能会造成严重的生态影响。当然,现在还为时尚早,许多实际问题依然存在:人们会为了零件而偷车吗?即使他们不这样做,他们会与会犯很多错误并可能在关键时刻阻挡他们道路的自主机器人分享街道吗?
要学习的一个经验是结合 3 种模式让你解决一个问题,否则无法解决。每一个孤立的问题可能并不那么棘手;事实上,这可能是一个已经解决的问题。
理解上下文
**这个模型试图解决什么问题?**你认识这些“产品人”?他们认为人们“雇佣”产品和服务来完成工作。你的模特正在做的工作是什么?
这有时可能很明显,但有时不那么明显,这就存在机会。
想象你在一家医院工作。经过深思熟虑后,你的老板决定你的下一个任务是建立一个模型,预测重症监护病人何时会崩溃。这个模型的“工作”是什么?
可以这么看:工作是拯救生命。
换个角度来看:这份工作是优化利用医院的资源。当病人崩溃时,需要很多人努力让她恢复稳定。每一个和这个病人有任何关系的护士和医生都会冲进房间,放弃他们正在做的任何工作。重新完成任务代价高昂。任务切换效率非常低;手拿天文钟多次尝试做 A 和 B 两个任务,AAAABBBBB vs ABABABAB。第二种需要更长的时间,对于几乎所有的任务 A 和 b 来说都是如此。这就是为什么被一个通知分心会对生产力造成如此大的损害。
无论如何,无论你认为你的模式是拯救生命(句号)还是优化配置医院资源(拯救更多生命!)让一切变得不同。
因为不“接近金属”的“老板”不能真正估计什么是适合模型的工作,你将不得不做它。它非常适合数据科学家的分析思维。
— -
这就是你要的。一个完整的手册来挑选一个成功的人工智能项目,分三部分。我希望这是有用的,它可以帮助你解决真实的人在机器学习中遇到的问题。活着从来没有比现在更好的时候了。这么多唾手可得的果实,这么多的杠杆作用都要归功于这种技术,如果我们能设法在人工智能方面多教育几千人,就会有这么多的生产力提高。如果本手册有所帮助,我很乐意收到您的来信,并见证您构建的项目。在 twitter 上发送给我,地址是 @quesada ,我的 DMs 是开放的。
如何绘制时间序列
Photo by Chris Lawton on Unsplash
如果处理得当,处理时间序列可能是探索性数据分析中最有洞察力的部分之一。在这篇文章中,我们将使用来自 Yelp 数据集的签到日志,使用 Pandas 和 Matplotlib 来探索不同时间段的趋势。
数据采集
下载完数据后,我们需要知道使用什么。下面的块显示了基于 Yelp 文档的checkin.json
文件中的一个示例条目:
{
// string, 22 character business id, maps to business in business.json
**"business_id": "tnhfDv5Il8EaGSXZGiuQGg"**
// string which is a comma-separated list of timestamps for each checkin, each with format YYYY-MM-DD HH:MM:SS
**"date": "2016-04-26 19:49:16, 2016-08-30 18:36:57, 2016-10-15 02:45:18, 2016-11-18 01:54:50, 2017-04-20 18:39:06, 2017-05-03 17:58:02"**
}
我们可以用带参数orient=columns
和Lines=True
的熊猫 read_json 方法读取输入文件。
在读取数据时,我们的数据帧看起来像这样:
date
列条目是字符串,每个日期由逗号分隔。通过查看它们,我们可以知道格式确实是YYYY-MM-DD HH:MM:SS
。
数据争论
为了可读性,我们希望我们的数据帧看起来更像这样:
从 EDA 的角度来看,展开的事件日志更有意义,而 JSON 格式对于内存存储更有意义。
我们可以通过创建一个字典来获得这个结果,其中的键对应于日期,值对应于 business_id。在这里,我们假设日期足够细,因此没有两个日期是相同的。记住 python 文档不允许在一个字典中有重复的键。
实现可以如下进行:
季节性
假设我们想知道所有可用年份的入住总数。我们将以此为契机,通过方法引入可以在群内使用的熊猫群。有关频率别名的更多信息,请参考 pandas 文档。
代码返回了这个简洁的图形:
这是一个好的开始,但是如果我们想潜得更深呢?我们将放大到 2014 年,尽管任何其他年份都可以。选择日期范围很简单:
季节性的第一个指标是看周末,因为数据来自美国和加拿大,周末是周六和周日。请记住,周末因国家而异,例如迪拜的周末是周五和周六。
因此,我们希望检测哪些天是周末,并为其编写一个可定制的函数:
上面的函数返回周末的指数。接下来,为了绘图,我们定义了另一个辅助函数,以在 pyplot axvspan 的帮助下突出显示与这些指数相对应的绘图范围:
最后,我们可以在一个接收数据帧的更大的函数中使用这两个函数:
结果是这个简洁的情节:
上面的情节符合人们周末出门比工作日多的直觉。为了更好地了解这种累积,我们可以使用相同的函数更仔细地查看 2014 年 4 月。
如果我们想要显示一个更细粒度的四月视图呢?由于原始数据帧中的每个条目都是一次签入,因此我们可以按 30 分钟的频率分组,并按如下方式计数:
结果就是下图:
绘制置信区间
我们看到了如何放大时间段来获得季节性的感觉。然而,企业也想知道给定一天的预期签到数量,以及它可能如何变化。例如,我们可能正在求解一个回归方程。
因此,我们需要构建图表来显示一周中某一天的平均签入量和某种置信区间。
我们将使用上一节中定义的checkin_halfhour
来提取星期几:
我们的数据帧现在看起来如下:
接下来,我们使用 pandas aggregate 方法构建day_avg
数据框架。出于我们的目的,我们将汇总:
- 总和
- 平均
- 标准偏差
下面的代码块为我们做到了这一点:
我们现在有了一个可以用来绘制区间的数据框架:
我们如何定义间隔取决于数据的分布以及窄/大间隔的商业价值。在我们的例子中,我们希望为一周中的每一天生成预期的签入,并获取两个标准偏差内的所有信息。
这样做是为了注意如下所示的day_avg
索引中的级别:
结果图揭示了很多签入行为,举例来说,我们展示了周一、周三和周六。
结论
时间序列分析的数量和深度取决于我们试图解决的问题。例如,我们可能想要评估餐馆,或者只在早上 8 点到下午 3 点营业的企业,比如咖啡馆。
EDA 的一个目的是为特征提取做准备。通过上面的练习,我们可以开始考虑一些特性,比如最常见的签到时间,或者说是白天的签到。
如何通过 python 微服务的机器学习为您的产品提供动力。一
文章集是我在euro python 2019给的 工作坊 的总结。
主要动机是展示如何开展数据科学和机器学习项目,以及如何使用面向微服务的架构构建机器学习服务并将其集成到软件产品中。
如果您是从事机器学习项目的软件工程师,或者正在考虑如何改进您的工作流程和模型交付的数据科学家/机器学习工程师/数据工程师,或者试图连接各个点并改进数据产品交付流程的项目经理,或者致力于在您的组织中采用数据科学和机器学习的执行经理,您可能会发现这些文章很有用。
这套物品被分成不同的部分。第一部分涉及主题的背景/介绍。
介绍
首先,让我们定义微服务/面向微服务的软件架构和机器学习。
简而言之,微服务是一种当不同的功能应用部分相互独立并通过网络上的通信协议进行通信时构建软件的方法。每个应用组件都是独立的,并根据服务层协议 SLA 与其他组件进行交互。
机器学习或 ML 是一种跨学科的方法,使用迭代计算技术和应用数学算法从数据中提取模式。它是计算机科学/数据科学的一个子域。机器学习软件产品遵循以下流程:
*train: data + result -> rules
serve: rules + data -> result*
为什么选择微服务和 Python?
首先,你可能会问自己两个合理的问题,为什么是微服务和为什么是 python ?我和几乎所有人一样,会用谷歌来回答这个问题:)
计算机编程语言
Google trends for python, microservices, machine learning, development and infrastructure related topics.
Correlation of google trends for python, microservices, machine learning, development and infrastructure related topics.
正如人们所看到的,随着时间的推移,社区对使用 python、微服务软件开发、机器学习和 DevOps 的兴趣正在增长,这些兴趣领域高度相关。换句话说,当人们搜索词涉及微服务,或机器学习,或 DevOps 话题时,很有可能是在 google 上查询了 python 相关搜索词。
上面的搜索趋势,事实上 python 是 继 C 和 java 之后第三个最流行的 通用编程语言根据 TIOBE 索引(截至 2019 年 7 月)和使用 python 引导和执行项目的相对简单性使其成为机器学习和数据科学的领导者。
微服务
Google trends for software architecture related topics.
至于面向微服务的软件架构,很明显,开发者社区的兴趣倾向于微服务,而不是单片软件架构。
微服务的主要优势之一是软件产品特性服务的独立性,使公司能够进行分布式开发,提高软件的可扩展性。这使得这种开发方法成为将机器学习集成到软件产品中的合理架构选择。
数据科学/机器学习项目
我为什么要烦恼呢?
作为一名高管,这是一个合理的问题,目前我应该为数据科学,还是为我的产品的机器学习而烦恼?
它伴随着以下问题:
- 我的组织准备好实施机器学习服务了吗?
- 我们应该如何改进才能达到准备就绪的程度?
Is my organisation ready for data science/machine learning project?
上图可能有助于回答这些问题。让我们跟随它:
- 首先要回答的问题是,是否已经有了根据业务目标交付结果的高效经典解决方案。 经典 这里指的是软件产品作为*“数据+预定义的业务规则=结果”*。如果答案是 是 ,你可能应该关注其他问题,或者在为你的产品使用机器学习之前重新定义当前问题的范围。如果答案是 否 ,我们就去点 2。
- 更好地了解你的资源,如果你有,或者你可以负担得起 数据科学专家将机器学习集成到你的产品中。如果答案是 否 ,你应该缩小你的问题的范围,重组你的组织,考虑外包,或者为你的产品使用第三方服务提供商。如果答案是 是 ,我们就去点 3。
- 基础设施呢?我们有需要的东西吗?机器学习是一个计算量非常大且耗时的过程,因此为了降低成本,它需要足够的硬件资源和自动化数据管道。如果答案是 否 ,您应该定义策略来供应、构建和维护基础架构,以构建和托管数据科学解决方案和机器学习模型。如果答案是是,我们转到第 4 点。
- 我们需要所有必要的数据吗? 是否所有数据都可以访问,它们是否在一个公共存储层?这是一个非常棘手的问题,可能需要许多团队的投入,如数据工程师、、产品、开发人员。但是,澄清这个问题很重要,因为没有数据就没有数据科学:)如果答案是否,那么在数据科学项目执行之前,首要任务是构建一个统一的数据层,其中包含干净且易于访问的数据,并自动收集与您的业务问题相关的数据。如果答案是是,我们就转到第 5 点。
- 我所在组织的工作流程有多灵活?我们能适应解决问题的新方法吗?这是列表中最棘手的问题,它可能没有直接的是或否。但是,如果您的组织无法支持流程和工作自动化的思维模式,您的任何数据科学计划都可能会失败。例如,如果访问数据需要几周时间,获得资源(GPU 机器、工作站等)需要几个月时间。)对于模型培训,无限小时的会议以获得业务部门的足够支持来确定问题的范围,即使很小的积极价值也不太可能通过机器学习为您的公司产生。如果答案是否,你的首要任务应该是重组组织的工作流程,以促进新方法的整合,从而有效地解决你的业务问题。
如果在回答了流程图中的所有问题后,我们到达最后的 是 ,我们就准备好进入机器学习服务的工作点,并将其集成到产品中。让我们从项目流程开始。
数据科学/机器学习项目流程
Data science/machine learning project cycle.
数据科学,或者说机器学习项目最重要的 目标是解决商业问题 。它是一个项目的基础,一切都是围绕要解决的问题来定义的。一旦设定好,数据科学/机器学习项目应该按照周期进行:
- 范围 和项目 目标 由业务干系人、项目经理和数据科学家设定。
2。必然 数据 要准备好。在这里,许多团队都参与其中:
- 产品/项目经理和数据科学家以 定义数据 特性 进行建模。产品人员是连接数据团队和业务的桥梁。
- 数据工程师和开发人员实现新的管道,将所需数据从产品发送到 数据平台 。
- 机器学习和数据工程师在数据平台上设置数据管道。
- 基础设施 到培训和部署由 SRE/DevOps 和机器学习工程师提供的模型。一旦基础设施被设置好,它当然可以被其他 ML 项目重用。
4.一个被循环的步骤本身叫做机器学习 实验 ,它涉及数据科学家和分析师。机器学习项目的模型或产品在项目的这个阶段被定义。
5.步骤 构建模型 将数据科学家和机器学习工程师联系在一起。在项目的这个阶段,正在构建机器学习的产品。
6.周期的最后阶段, 模型部署 涉及机器学习工程师、开发人员和 Ops/SRE/DevOps 工程师。只有完成了这一步,项目才能被利益相关者评估。只有在这个阶段,许多团队工作的结果才能集成到产品中,从而影响业务。如果没有这个阶段,数据科学/机器学习项目就不能被认为是一个项目,因为它永远不会以其他方式与用户交互。所有机器学习项目都应该将部署作为首要目标, API 优先设计是可以遵循的有用方法之一。
一旦机器学习模型/产品交付给用户,项目可以缩小范围,或重新定义以改进现有模型*,或新项目*可以启动以构建新模型。
金科玉律
当你进行数据科学/机器学习项目时,有一些规则,我会称之为黄金 规则:
- 缺乏问题规范→模型的无限发布时间
如果您错过了项目范围的阶段,无法从利益相关者那里收集需求,并为问题设定明确的业务目标,您就无法交付机器学习解决方案。
- 无基础设施≡不充足,或坏数据→无,或坏模型
如果没有足够的数据平台,你就无法实施任何机器学习解决方案,否则你就不太可能拥有足够高质量的数据来提取系统模式、训练模型和实施你的解决方案来为你的用户服务。
- 精益/迭代开发→成功的 ML 项目≡产品交付
机器学习只能使用精益/迭代开发方法有效地交付:
-首先部署概念验证 PoC,以测试数据管道基础设施并设置模型基线。
-要交付给利益相关方进行解决方案评估的最低可行产品、服务的 MVP。
-最终交付的服务的生产版本,作为具有监控和(自动)模型调整的最终结果。
数据平台
现在,当我们定义机器学习项目流程时,让我们看看如何将机器学习服务集成到产品平台中,以及可以采用什么样的数据平台逻辑架构。
Data platform integration architecture.
上图说明了软件应用的两个主要功能部分,或所谓的 平台 :
- 产品平台,服务通过不同的接口,如 web GUI 或 REST API 端点,相互通信并与第三方服务通信,以向用户/企业客户交付价值。
- 数据平台提供支持内部客户/业务利益相关方的服务,并提供足够的工具,通过强调用户活动来促进决策制定。
数据平台可以分解为三个部分,可能有三个团队参与维护;
- 数据仓库、或 DWH — 连接产品平台和第三方数据提供商的部分,将所有有用的数据整合到一个持久数据存储中,并转换加载的原始数据,以提供预定义的KPI和数据集市,供分析人员、数据科学团队和业务利益相关方进一步使用。 数据工程 团队负责这部分。团队至少有*三套 SLA:*DWH-to-BI+业务 ,DWH-to-Product,DWH-to-DS+业务 。
- 分析/商业智能平台、或 BI — 从 DWH 获取数据并向业务利益相关方提供内部分析作为报告解决方案的部分,例如仪表板、描述性和说明性特别分析。 毕 和 数据分析 团队负责这部分。团队至少有两套SLA:BI-to-DWHBI-to-Business**。**
- 数据科学平台、或 DS — 使用来自 DWH 的数据来构建数据科学和机器学习服务,以改进面向内部客户/业务利益相关方的分析解决方案,或实施新产品功能来提高用户/业务客户的业务价值。 数据科学 和 机器学习 团队负责这部分。团队至少有三套 SLA: DWH 对 DWH ,DS 对产品 ,DS 对业务 。
机器学习项目交付
数据科学平台的成果可以(至少)以三种方式部署:
- 数据批处理— 数据科学/机器学习服务按计划处理数据批处理,以进行预测,并将结果写回数据存储或分析平台,以供进一步使用。
- 报告— 数据科学/机器学习服务生成并交付报告,例如仪表板、web-hook 消息、SMS 或电子邮件报告。
- 模型即服务 、 MaaS —数据科学/机器学习服务实时交付模型预测结果。它可以集成到产品平台中,以便与其他产品功能服务进行通信,例如与项目搜索或内容交付服务进行通信。
尽管是部署你的机器学习解决方案的最有用的方法之一,MaaS 在网络上几乎没有被涉及。比如只有 5(!)2019 年 4 月至 6 月在towardsdatascience.com上发布的 650 篇 帖子中的模型部署相关文章。
这让我们看到了文章集的主要技术目标,即如何构建 MaaS 的演示。实现这一目标的最佳方式是遵循 边做边学的方法 。敬请阅读本文的动手部分,我将带您完成构建机器学习模型的步骤,并将其作为微服务集成到现有的 web 应用程序中。**
摘要
总结一下,要点如下:
- Python和微服务 是将机器学习集成到你的产品中的仪器的合理选择。**
- 数据科学项目只能在您的组织准备好 进行这种战略性转移时执行,例如,如果您有易于访问的通用数据层,遵循灵活的工作流程,并且能够聘请数据科学专家。
- 要成功执行数据科学项目,应满足黄金法则 。首先,你要时刻牢记数据科学/机器学习是关于解决商业问题,而不是关于花哨的技术缺乏项目目标规范容易导致项目失败。第二个,缺乏数据,或缺乏足够的基础设施往往不好,或根本没有数据科学解决方案。第三个,迭代精益方法倾向于成功执行数据科学/机器学习项目。
- 模型即服务 是一种高效、可维护和可扩展的方式,用于向您的用户或内部客户交付机器学习解决方案。
参考
- 关于微服务: https://microservices.io
- 关于机器学习:【https://link.medium.com/C9pSewGfSY】T2
- **API 首次进场:【https://apifriends.com/api-creation/api-first **
- API 优先方法:http://engineering . pivotal . io/post/API-first-for-data-science/
- 数据科学 MVP:https://link.medium.com/PbmMswPfSY
- 精益开发:https://lean kit . com/lean/lean/principles-of-lean-development/
我希望这篇文章对你的发展有用。欢迎留下评论,以便进一步讨论。
如何用 Google Colab 练习 Python 编程?
自动设置、有效获得帮助、协作编程和版本控制。Python 初学者练习中的痛点一站式解决方案。
棘手问题
这学期,我开始在北德克萨斯大学(UNT)教授“INFO 5731:信息系统的计算方法”这门课程,内容包括 Python、自然语言处理和机器学习的基础。
这个班的学生是信息科学和数据科学专业的硕士生和博士生。我仍然像在中国一样使用翻转指令。
在过去的几周里,我们已经完成了 Python 部分的基础。
每周,学生们都被要求阅读两本教科书中指定的章节,并在上课前尝试自己修改的代码。
如果遇到错误,他们还会被要求尝试修复代码。如果他们用尽了所有的方法仍然不能解决问题,他们可以将问题张贴在画布上的讨论板上。
由于大多数学生都是 Python 的新手,他们很容易遇到以下实际问题。
- 不知道如何安装和设置 Python 运行环境;
- 面对问题时,不知道如何有效地找到解决方案;
- 当试图完成小组任务时,不知道如何与他人合作;
- 不知道如何处理版本控制,这可能会导致代码混乱。
上面提到的问题是 Python 初学者的主要痛点。
如果这些问题不能被有效地解决,学生们将会在许多琐碎无用的工作上浪费大量的时间。更有可能的情况是,他们的信心会被击碎,他们会失去学习的动力和兴趣(T2)。
为了帮助他们,我找到了一个适合初学者练习 Python 的工具。在这里,我也想和你分享这个工具。
它叫做谷歌实验室。我在文章《如何用 Python 和递归神经网络预测严重堵车?“给你看源代码,也给你提供深度学习的环境。
在这篇博客文章中,我将介绍如何使用 Google Colab 解决以上痛点,为你的 Python 练习提供帮助。
环境
Python 初学者最常见的问题就是积累学习兴趣不容易,很快就会遇到错误。
事实上,Python 初学者犯的错误总是与配置环境有关。
例如,当试图下载 Anaconda 时,您可能不知道选择哪个版本。
有人在安装后卡住了,因为路径设置错误,他们无法启动 Jupyter 笔记本服务器。
当你试图导入一个包时,会有一个错误信息告诉你“我不知道你要的模块!”
Google Colab 可以帮助你完成所有这些事情。
只要打开一个浏览器(我推荐谷歌 Chrome 或者火狐),输入以下网址:
[https://colab.research.google.com](https://colab.research.google.com)
您将看到以下网页。
只需选择创建一个新的 Python 3 笔记本。
然后你可以看到一个完全配置好的 Python 运行环境。
就是这么简单。
不要小看这个环境。
尽管您没有完成任何安装过程,但它仍然包含了数据科学分析所需的几乎所有模块。
这些工具包括但不限于 Numpy、Scipy、Pandas 等。甚至深度学习框架,比如 Tensorflow,Keras,Pytorch 也包括在内。
Google Colab 的深度学习环境支持不仅限于软件方面。谷歌慷慨地为你提供 GPU,甚至免费提供云 TPU**。**
默认情况下,这些云计算硬件不启用**。你需要在菜单栏中选择“运行时”,然后“更改运行时类型”。**
通过这种方式,您可以看到硬件加速器的选项。
一些示例代码,甚至教科书中的 Python 组件都需要 Python 2.x 环境才能运行。别担心。当您选择创建一个新的笔记本时,您可以指定不同版本的 Python。
如果你足够小心,你可能已经发现你可以在任何时候在“更改运行时类型”标签中更改 Python 版本。
帮助
作为初学者,遇到错误信息和问题是很正常的。
好在 Python 有一个强大的社区,可以帮到你很多。
但如果你尝试过,可能会有一种错觉,认为这些“Python 大师”并不友好,因为你很久以前就发布了问题,但没有人给你任何回复。
其实很可能是因为你问那些问题的方式不对。
想象一下,你描述了一个错误信息,可能有几十个,甚至几百个原因可以导致它。谁能有那种耐心帮你一个一个的考察排除?
你可能会争辩说,有时你也包括代码,甚至是问题的错误信息的截图,但是仍然没有人来帮忙。
这可能是因为你的信息仍然不充分。
比如你在本地安装了什么样的 Python 环境?你导入的模块版本是什么
?当你得到错误信息的时候是在什么环境下?会不会和之前的代码块有关?你的操作系统完全支持你正在使用的框架吗?
这些可能性是无穷无尽的。同样,没有人愿意浪费时间一个一个地检查它们。
然而,在谷歌实验室的帮助下,当你试图提问时,效率可以显著提高,因为潜在的回答者可以很容易地重复你的问题。
你可以通过分享你的笔记本来实现。
如上图所示,你可以点击右上角的分享按钮。
在对话框中,选择权限时需要注意。我的建议是选择“任何有链接的人都可以查看**”。**
然后,选择“复制链接”,链接将被保存在您的剪贴板。把链接和问题描述放在一起,贴在 Python 的官方论坛或者课程讨论板上。
人们只需要点击链接,他们就可以看到你所有的代码和错误信息,更好的是,他们可以轻松地运行你笔记本的副本。
尽管你们两个可能使用不同的操作系统和/或不同的浏览器,但是由于 Google Colab,你们的 Python 计算环境是完全相同的。
当有人解决了问题,他或她可以通过链接共享完整的笔记本,这样就完成了。
请注意,提问只是获得帮助的方法之一。
在论坛上发帖之前,你最好尝试独立解决问题。如果你拒绝自己考虑,只依靠别人,人们就不会愿意帮助你。
Google Colab 为你提供了一个非常有用的功能来寻找可能的答案。每当你遇到一个错误信息,你可以看到一个“搜索堆栈溢出”按钮。
点击按钮,Google Colab 将使用 Google 搜索引擎在Stackoverflow.com
网站上找到类似的问题和潜在答案。
大多数情况下,你会在前几个链接里找到相应的答案。
在我们的例子中,这次您很幸运,因为答案解释说这个问题与 Python 2 和 3 之间的语法差异有关。
现在你只需要按照说明,稍微修改一下代码(加上括号),一切都会好的。
合作
你试过和别人一起写代码吗?
在我的课程中,有些作业是小组任务。要求学生分组合作,用 Python 解决问题。
一些学生尝试这样合作:
写一段代码,发给另一个成员。当另一方完成他/她的部分时,新的源代码文件被发送回来。它一直在继续。
这显然是相当低效的。
有更好的方法吗?
当然了。您可以继续使用我们介绍的共享功能。
不过这次在选择权限的时候,给对方“任何有链接的人都可以编辑权限。
我们仍然使用print
命令带有“无括号”的问题。但是这一次,除了看到你的问题,其他人也可以直接编辑你的代码。
你的搭档可以创建一个新的代码块,并输入正确的语句。
在您这边,更改将被同步,您会看到这一点。
你伴侣的头像会出现在相应的修改旁边,他(她)也可以选择添加评论。
例如,可以做出如下的注释。
评论也会立即同步到你的笔记本上。
这样,团队协作可以更有效率。
请确保将“编辑”权限仅限于您信任的协作者。
如果你打算向公众展示你的作品,你可以使用 Google Colab 提供的 Github 集成功能。
你可以选择将副本保存在 Github 中。
然后,选择要保存的 Github 项目。
之后,相应的 Github 页面会自动打开,准备预览。
预览可以包含所有文本、图片、代码和输出信息。注意笔记本的顶部,有一个“在 Colab 打开”的链接。
点击它就可以打开 Google Colab 环境,直接在这个 Github repo 上运行笔记本的副本。
版本
当你试图修改你的代码很多次,它可能会导致混乱,事情可能会变得更糟。这个时候,你可能需要一个“时光机”回到以前的副本。
谷歌实验室为你提供了这台机器。
点击菜单中的“修订历史”,可以看到当前笔记本中保存的所有历史版本。
修改时间、进行修改的用户以及
文档的大小等都显示在这里。如果你想回到任何版本,只需点击“恢复”按钮。
此外,您还可以将 Google Colab 笔记本直接下载到.ipynb
文件中,并在本地保存一份副本。
一定要仔细选择存储路径,不然以后可能就找不到了。
当学生需要提交作业时,我通常会要求他们提交 Google Colab 共享链接和一个.ipynb
文件。
为什么?两者不是一模一样吗?
我会把它作为一项任务留给你去思考。希望你能立刻得到正确答案。
您可以通过在命令行中启动 Jupyter 笔记本服务器来打开.ipynb
文件。然而,使用一个叫做interact的很酷的应用程序来直接查看.ipynb
文件的内容会更方便。
摘要
在本文中,我介绍了 Google Colab,以帮助 Python 初学者更有效地练习 Python 编程。总之,它可以处理您可能遇到的以下棘手问题:
- 运行环境和软件包的安装;
- 处理错误信息和问题;
- 协作效率低;
- 版本混乱。
在这种情况下,你可以把更多的时间花在练习和理解 Python 上,而不是花在配置上。
我多次向我的学生和读者推荐经典而著名的教科书“艰难地学习 Python”。
它为初学者学习 Python 编程语言提供了一种有效的方法。事实上,你也可以尝试使用其他好的教科书。请记住,您不仅需要阅读内容,还需要仔细地逐行尝试代码。这可能看起来很乏味,但是我可以向你保证“边做边学”是 T2 正确的方法。
Python 编程快乐!
相关博客
如果你对这篇博客文章感兴趣,你可能也想看看下面几篇:
- Python 深度学习,第 0 部分:在谷歌云上设置 fast . ai 1.0
- 使用 Python 和 fast.ai 进行深度学习,第 1 部分:使用预训练模型进行图像分类
- 使用 Python 和 fast.ai 的深度学习,第 2 部分:使用迁移学习的 NLP 分类
- 如何用 Python 和递归神经网络预测严重堵车?
- 如何用云 GPU 加速你的 Python 深度学习?
确认
我要感谢我的硕士生杨晓君帮我把我的中文原版文章翻译成英文。此外,我要感谢我的老朋友杰西·里德,他花了很多时间来校对。没有你们的帮助,我不可能这么快就完成这个博客。
如何预测时间序列第 1 部分
真实世界预测
经典时间序列方法与预测包
时间序列预测与其他监督回归问题有很大不同。我的背景是商业分析,所以我对经典预测方法学(arima、指数平滑状态空间模型、移动平均等)有相当多的了解。在与许多数据科学家交谈时,我发现他们中的许多人对预测时间序列知之甚少,并将其视为其他监督学习问题,收效甚微(通常是因为他们没有设计正确的功能)。
R forecast 库是处理和预测时间序列的最完整和最流行的库之一。虽然我承认 python 在数据科学家中变得越来越流行,但这并不意味着它是万能的最佳语言。R 中的时间序列预测要成熟和常规得多。
本文的目标是逐步完成预测工作流和评估。因此,在这篇博文中,我将把数学最小化。有许多博客文章讨论了这些方法背后的数学原理,我将链接其中几个。在这篇博文中,我想分享一些我从使用预测包预测大量时间序列中学到的东西。在后续的博客文章中,我将介绍 facebook prophet 的工作流和使用监督机器学习算法提前一步预测的工作流。
不是所有用来写这篇文章的代码都会出现在博文中。更多例子的完整代码可以在我的 github 上找到。
时间序列预测与其他监督学习问题有何不同:
- 使用 k 倍随机交叉验证是不符合原则的(因为保持时间顺序很重要)
- 我们正在观察数据范围之外扩展一个趋势
- 流行的机器学习算法(xgboost、线性回归、MLP 神经网络等)如果没有大量的特征工程,通常不会很好地工作
- 对于决策来说,理解点估计的不确定性可能比点估计本身更重要,尤其是在商业环境中
数据—西雅图自行车:
我将尝试预测的时间序列是西雅图市每周记录的自行车道流量。脚本 seatleBike.r 创建了这个数据集(从西雅图开放数据门户收集了 13 个公共数据集,按每周频率进行聚合)。
我将从一个快速的线图开始,来可视化时间序列。
df_day %>%
ggplot(aes(ds, y))+
geom_line()+
labs(x = "Date", y = "Traffic", title = "Seattle Bike Traffic")+
theme_minimal()
观察和重要提示:
- 我们可以看到时间序列有季节性。季节性是指一种周期性模式,在几年内,与日历日、月、季度等相关
- 我们可以看到,时间序列似乎没有趋势。一个趋势是一系列长期向上或向下的方向。
- 夏季的自行车流量似乎比冬季要高得多。我们可以预料到这一点,因为西雅图冬天寒冷多雨。
预测时间序列时,我们通常使用序列的先前值来预测未来值。因为我们使用这些先前的值,所以绘制 y 向量(给定一周内自行车道上的交通量)与先前的 y 向量值的相关性很有用。该图被称为自相关图(自相关,因为它与自身相关)。
ggAcf(df_day %>% convert()) + theme_light() + labs(title = "ACF plot of Seattle Bikes Series")
备注:
- 相关性最强的是最近的值。这是典型的时间序列
- 我们可以看到在 26 周左右有很强的负相关性。鉴于时间序列的季节性,我们应该预料到这一点
- 这与一年前(52 周)的观察结果有很强的相关性,这是意料之中的。
- 我们可以看到,相关性下降了大约 3 或 4 个滞后。经典时间序列模型将学习这种结构,我们可以创建滞后变量,将其纳入我们的机器学习模型。
用季节性朴素模型设置基线:
我们的时间序列似乎没有趋势,但它确实有季节性。当时间序列中存在季节性时(这是大多数真实世界时间序列中的典型情况),一个好的基线模型是季节性朴素模型。
季节性朴素模型在预测时预测同一季节(去年同一周)的最后一个值。我们可以用预测包中的 snaive()函数来拟合这些模型。我之前说过,我会限制数学,以便放大预测工作流程。这是我将在博文中展示的唯一公式。我选择用公式来介绍预测中常用的符号。我将链接到其他模型背后的公式/数学的更多信息。
source = https://otexts.com/fpp2/simple-methods.html
我在训练集上拟合模型,并在一个持续的测试集上进行预测,以查看模型如何预测它没有看到的数据。
naiv = train %>%
snaive(h=length(test), bootstrap = T, level = 0.89)
naiv %>%
forecast_eval(model_name = "Seaonal Naive")
- 最新的预测看起来相当不错。该预测在测试集(MAE)上平均误差约为 56953.55。对于真实世界数据的简单模型来说,这已经很不错了。
- 预测区间覆盖了大部分点
- 如果数据有趋势,模型的表现会差得多
- 该模型忽略了 5 月和 4 月的大峰值,可以看到这两个峰值远远超过了预测的预测区间
- 预测的不确定性随着时间的推移而增加
- 一个模型必须表现得比这更好才是可行的
另一种评估预测的方法是使用 checkresiduals()函数检查训练集的模型残差。该函数返回 Ljung-Box 检验的检验统计量,这是一种零假设检验,用于确定残差是否为白噪声。我不喜欢零假设测试,所以我只做一次。
residual analysis
Nothing worse than null hypothesis tests
残差分析的另一个问题是强调点估计的准确性,而不是预测区间的准确性。这些测试还附带了一系列现实世界时间序列中通常不会遇到的假设。
auto.arima:
auto.arima()是预测包中最受欢迎的函数之一。尽管它很受欢迎,但我并不喜欢它。根据我的经验,arima 模型最适合月度、季度或年度数据,但如果没有傅立叶项(auto.arima 不使用傅立叶项),就无法捕捉每周或每日数据的季节性。尽管如此, auto.arima()通常是数据科学家使用的唯一预测函数。
aarim = train %>%
auto.arima() %>%
forecast(h = length(test), level = 0.89)
aarim %>%
forecast_eval(model_name = "Arima")
auto.arima
- auto.arima()函数的性能比仅猜测去年的值(snaive()模型)差
- arima 模型往往不能很好地处理周数据(hynd man 博士写了这个包,所以如果你不相信我,就相信他)
auto.arima 函数选择了带漂移的 SARIMA(1,0,0)(1,1,0)[52]。让我们慢下来解释这个符号。
SARIMA 模型遵循形式(P,D,q)x(P,D,Q)m,ARIMA 模型遵循形式(P,D,Q):
p =自回归项的数量
d =差异数
q =移动平均项数
p =季节性自回归项的数量
d =季节差异数
q =季节性移动平均项的数量
m =频率
漂移=漂移系数或常数(arimas 和 sarimas 都可以包含漂移)
这意味着我们的模型是一个 SARIMA 模型,有一个自回归项,一个季节自回归项和一个季节差异项。该模型没有移动平均或季节性移动平均项。它还有一个漂移系数。我们可以用汇总函数来确认这一点:
Arima model summary
有兴趣了解更多 arima 模型的人可以参考包作者的书或者这个链接。
当用额外的外生回归变量和领域知识创建 arima 模型时,它们往往表现得相当好。当分析师选择只使用 auto.arima 函数时,模型往往表现不佳(尤其是对于周数据)。
指数平滑:
指数平滑方法是一系列相关的模型,使用以前值的指数递减权重来预测时间序列的当前值。这些方法在商业分析和供应链领域非常流行。为了简洁起见,我将使用 ETS 函数,它适合各种指数平滑方法,并选择最佳方法。我强烈推荐你在这里阅读更多关于函数的内容。这篇文章越来越长,所以我不会进一步解释。
ETS = train %>%
ets() %>%
forecast(h = length(test), bootstrap = T, level = 0.89, lamda = 'auto')
ETS %>%
forecast_eval()
ETS model fit
- 基于 ETS 模型的预测分布存在大量不确定性
- 该模型完全不符合季节性,因为它不处理大于 24 的频率
指数平滑模型往往适用于每日数据(如果它没有年度季节性,因此频率可以设置为 7)、每月和每年的数据,但不适用于每周数据。在许多商业情况下,我们需要预测每周数据并理解不确定性。
TBATS:
TBATS 是我使用预测包预测时间序列的常用方法。像预测包中的其他方法一样,它是完全自动的。该模型本身足够灵活,可以适应一系列不同的时间序列,而且适应速度相对较快。
TBATS 是指数平滑方法的扩展,增加了 ARMA 误差和三角项。人们可以写一整篇关于这种方法的博文,所以我会选择链接一些关于这种方法的好文章给那些感兴趣的人,因为完整的解释只会让这篇文章太长。
TBATS = train %>%
tbats()TBATS_for = TBATS %>%
forecast(h = length(test))
TBATS_for %>%
forecast_eval("Tbats")
TBATS forecast
- TBATS 是目前所有方法中表现最好的
- TBATS 在表示预测的不确定性方面做得很好
- 正如软件包作者指出的,TBATS 间隔有时会太宽
让我们放大适合测试集的 TBATS:
我知道字幕是不正确的,预测区间是灰色的。
- 夏季和初秋的不确定性比一年中的其他时间要高得多
- 几个连续的点落在预测区间之外
总结:
- TBATS 是一种灵活、精确的算法,通常优于其他经典方法
- 经典的时间序列方法无法预测大的异常
- 所有提出的模型都使用了自动模型选择程序
要了解更多关于预测的信息,我强烈推荐阅读 Rob Hyndman,这是软件包作者的书。Hyndman 博士还在使用新的寓言包开发这本书的新版本,该包为 tidyverse 带来了预测(要查看它,只需将 URL 中的 2 改为 3)。我还没能让寓言在我的机器上运行。它也可能需要一段时间才能像预测包一样成熟,所以现在我会坚持使用预测包。
西雅图开放数据门户的必要说明:
“此处提供的数据已经过修改,以用于其原始来源,即西雅图市。西雅图市和首席技术官(OCTO)办公室均不对本申请中包含的任何数据的完整性、及时性、准确性或内容做出任何声明;作出任何形式的陈述,包括但不限于对特定用途的准确性或适用性的保证;也不暗示或推断此处提供的信息或数据有任何此类保证。随着修改和更新的完成,数据可能会发生变化。据了解,使用网络订阅源中包含的信息需要自担风险。”
从我的代码中可以清楚地看到对数据集所做的修改。
本文授权:https://creativecommons.org/licenses/by-sa/3.0/
如何预测商业成败
为什么一些小企业会失败,以及如何利用机器学习进行优化以取得成功
Photo by Eaters Collective on Unsplash
创业不是一件小事,有许多费用要考虑,如沉没成本、管理费用和贷款。衡量成功的标准包括但不限于增长、销售收入、客户保持率和资产负债表。
一个企业的生存能力首先取决于一个公理:它保持开放。
对于必须保持生存的企业和期望良好可靠服务的客户来说,这个主题是他们的主要兴趣所在。这在金融领域也很重要,在这一领域,贷款人必须证明发放贷款的正当性,并且可能有法律义务解释申请被拒绝的原因。
因此,我们将这一努力的动机和目的表述如下:我们能否预测一家企业是开张还是关门?生存能力的主要指标是什么?
在本文中,我们将使用 Yelp 数据集来解决这个问题,这是一个关于美国和加拿大当地企业的关系数据集合。它包含大量的综合信息:
- 668.59 万条评论
- 192609商家
- 10 都市圈
- 1223094提示
因此,Yelp 数据集是一个很好的案例研究,它研究了恰当设计的功能如何与机器学习模型相结合,可以预测企业在资产负债表等传统方法之外的成功。
在下一部分中,我们将呈现给定数据集的每个部分,并从中提取要素:
- business:(business . JSON)该数据集包含与业务相关的数据,包括位置数据、餐馆属性和美食类别。
- Reviews: (Review.json)这个数据集包含完整的评论文本数据,包括撰写评论的 user_id 和撰写评论的 business_id。
- Checkin: (Checkin.json)这个数据集包含企业的登记信息。
商业
特征工程
business.json
文件包含业务数据,包括位置数据、属性和类别。下面的代码片段显示了它的配置:
{
// string, 22 character unique string business id
**"business_id": "tnhfDv5Il8EaGSXZGiuQGg",**
// string, the business's name
**"name": "Garaje",**
// string, the full address of the business
**"address": "475 3rd St",**
// string, the city
**"city": "San Francisco",**
// string, 2 character state code, if applicable
**"state": "CA",**
// string, the postal code
**"postal code": "94107",**
// float, latitude
**"latitude": 37.7817529521,**
// float, longitude
**"longitude": -122.39612197,**
// float, star rating, rounded to half-stars
**"stars": 4.5,**
// integer, number of reviews
**"review_count": 1198,**
// integer, 0 or 1 for closed or open, respectively
**"is_open": 1,**
// object, business attributes to values. note: some attribute values might be objects
**"attributes": {
"RestaurantsTakeOut": true,
"BusinessParking": {
"garage": false,
"street": true,
"validated": false,
"lot": false,
"valet": false
},
},**
// an array of strings of business categories
**"categories": [
"Mexican",
"Burgers",
"Gastropubs"
],**
// an object of key day to value hours, hours are using a 24hr clock
**"hours": {
"Monday": "10:00-21:00",
"Tuesday": "10:00-21:00",
"Friday": "10:00-21:00",
"Wednesday": "10:00-21:00",
"Thursday": "10:00-21:00",
"Sunday": "11:00-18:00",
"Saturday": "10:00-21:00"
}**
}
目标变量是is_open
,如 0 表示关闭,1 表示打开。
作为第一种方法,我们需要将嵌套的属性分解成相应的值。例如在attributes
特性中,我们有一个RestaurantsTakeOut
的二进制编码,我们需要进一步扩展BusinessParking
特性。
在attributes
特性中,我们可以设计分类变量,例如数值。例如,NoiseLevel
是一个带有值的字符串输入:
- 非常大声
- 声音大
- 平均值
- 安静
- 楠
因此,可以用数值对这些字符串特征进行编码,例如表示噪声级别的标度。我们可以对AgesAllowed
、Alcohol
、RestaurantsAttire
等属性重复同样的练习。
此外,categories
特性包含一个不互斥的字符串列表。一家企业有可能被归入墨西哥式、汉堡式和腹肌式餐馆。因此,这些被编码为二进制特征。
在一个简单的自然语言处理案例中,我们注意到大约 1000 个业务被命名为Starbucks
,大约 800 个被命名为McDonalds
。因此,我们定义二进制chain
特征,如 1 表示该业务是链的一部分,并且一个名称必须至少出现 5 次才能被认为是链。
我们使用latitude
和longitude
特征,以便从 datataset 中提取大地测量特征。我们使用最小包围盒方法来查询给定半径内的所有其他企业。在这个项目中,我们将半径设置为 2 公里,作为客户愿意在企业之间步行的合理距离。
从大地测量数据中,我们可以定义诸如density
之类的特征,这是所查询的圆中的业务量。此外,我们可以通过应用 Z 分数标准化将每个企业与其周围环境进行比较。例如,企业价格的 Z 值是价格和群体平均值之间的差值,除以标准差。
借助外部资源推动业务发展
对于要素工程,在数据集之外提取信息可能会有所帮助。每个企业都有其相应的美国和加拿大格式的邮政编码。
也就是说,美国国税局发布个人收入统计数据,加拿大统计局发布收入数据。虽然不具体到业务本身,当地的收入可以发挥生存能力的作用。
为了保护公民的隐私,美国国税局不公布确切的收入数字,而是数据是绝对的。例如,3
的值表示收入在50,000-75000 美元和5
100,000-200,000 美元之间。
因此,我们可以将每个邮政编码与相应的家庭收入中值进行匹配,确保按照 IRS 方法将加拿大元转换为美国货币和宁滨加拿大收入数据。
复习
review.json
文件包含完整的评论文本数据,包括撰写评论的用户标识和撰写评论的企业标识。
下面是展示这些属性的一个片段:
{
// string, 22 character unique review id
**"review_id": "zdSx_SD6obEhz9VrW9uAWA",**
// string, 22 character unique user id, maps to the user in user.json
**"user_id": "Ha3iJu77CxlrFm-vQRs_8g",**
// string, 22 character business id, maps to business in business.json
**"business_id": "tnhfDv5Il8EaGSXZGiuQGg",**
// integer, star rating
**"stars": 4,**
// string, date formatted YYYY-MM-DD
**"date": "2016-03-09",**
// string, the review itself
**"text": "Great place to hang out after work: the prices are decent, and the ambience is fun. It's a bit loud, but very lively. The staff is friendly, and the food is good. They have a good selection of drinks.",**
// integer, number of useful votes received
**"useful": 0,**
// integer, number of funny votes received
**"funny": 0,**
// integer, number of cool votes received
**"cool": 0**
}
我们可以通过business_id
进行聚合,然后完成特性工程。然而,假设每个印象都有一个与之相关的时间戳,我们可以直接测量与给定位置相关的变化。
用户星级评定的平均值返回平均业务得分。按年份分组可以帮助我们了解业务特性是如何随年份变化的。他们是在进步还是落后了?
了解企业
首先要问的是那些~ 19.2 万的商家都在哪里?根据以下情节:维加斯宝贝!
与上图相反,大多数企业位于亚利桑那州,如下图所示:
此外,我们可以看到大多数企业的评级在 3.0 到 4.5 之间,因此平均值约为 3.5。
最后,我们希望通过按目标变量绘制计数和色调来比较不同业务类型的正/负标签的分布。餐馆占企业的绝大部分,关门企业的比例最高。
签入数据
checkin.json
文件列出了所有可用的企业登记信息:
{
// string, 22 character business id, maps to business in business.json
**"business_id": "tnhfDv5Il8EaGSXZGiuQGg"**
// string which is a comma-separated list of timestamps for each checkin, each with format YYYY-MM-DD HH:MM:SS
**"date": "2016-04-26 19:49:16, 2016-08-30 18:36:57, 2016-10-15 02:45:18, 2016-11-18 01:54:50, 2017-04-20 18:39:06, 2017-05-03 17:58:02"**
}
作为第一步,我们可以探索签入的趋势,如下图所示,其中 y 轴对应于所有年份的总签入数,并以 30 分钟为间隔进行分割。例如,这个图告诉我们,从周六到周日晚上的平均签入高峰发生在晚上 8 点左右,同时提供了一个置信区间。
从更宏观的角度来看,我们也可以探索 12 月份的入住情况,其中包含了很多季节性因素。在下面的图中,高光对应的是周末。
从这些数据中,我们可以提取出平均每月的签入量。此外,我们将span
定义为第一次和最后一次登记之间的时间(以秒为单位):一家企业开业的时间越长,它保持营业的可能性就越大(参见日出问题)。
模型选择和评分
我们试图解决的问题属于监督学习。鉴于目标变量的严重不平衡性质,我们忽略了基于准确性的评分,并考虑以下指标:
在第一轮中,我们应用了几种监督学习算法。表现最好的人按升序排列:
在接下来的几节中,我们将更详细地阐述结合在一起产生可靠结果的各个技术。
分裂
特征工程的目的是获得可以直接输入算法的数据的数字表示。第一步是在训练集和测试集之间拆分数据。
此外,我们应用最小-最大特征缩放,其仅适用于训练数据,以避免模型泄漏。然后使用该拟合来转换训练和测试数据。
网格搜索交叉验证
这种也被称为 GridSearchCV 的方法很受数据科学家的欢迎,因为它非常全面。通过结合交叉验证和网格搜索,我们获得调整后的超参数。
特征相关性
某些算法,如基于树的模型,在高维空间中表现不佳。拥有太多的功能也可能会产生噪音。
用于检测噪声特征的第一种方法是通过逻辑回归的 L1 特征选择,其给无用特征赋予 0 的权重。第二种方法是使用 featexp 包来识别噪声特征。
最终,最容易理解的方法是特征重要性排列。在这种情况下,我们置换一个给定的特征并计算模型预测误差的变化。如果移动特征会显著改变模型上的误差,则该特征是“重要的”,如果误差保持不变,则该特征是“不重要的”。
应对失衡
最后,该项目的最有影响的方面是处理不平衡的目标变量。回想一下,只有大约 20%的企业被列为关闭。
实际上,这意味着少数类被多数类淹没,使得算法没有足够的少数观察来做出决定,或者少数类被多数淹没。
解决这个问题的一个方法是通过欠采样:保持少数类不变,从多数类中随机抽取等量的观察值。相反,过采样稍微好一点:复制少数类,直到数据集平衡。
在任一采样选择中,仅将它应用于训练数据是至关重要的。对测试数据进行采样是一个常见的陷阱,因为这等同于曲解现实。
模型性能
下表总结了几种型号的性能。总的来说,所有模型都更擅长预测开放的企业(第 1 类),而不是关闭的企业(第 0 类)。
总的来说,我们可以看到基于树的模型往往在 AUC 徘徊在 0.75 时表现最佳。
也就是说,模型的可解释性与模型性能同等重要,如果不是更重要的话。因此,我们必须更深入地研究每个模型,以了解驱动我们决策的主要特征是什么。
下表显示了这些型号的 5 个最重要的功能。
有趣的是,在逻辑回归等同一模型中,根据抽样方法的不同,Restaurant
可能是正权重,也可能是负权重。
我们还注意到一些预期的特性,如与价格相关的RestaurantsPriceRange2
,以及一些特殊的特性,如AcceptsInsurance
和BikeParking
。就保险而言,这一功能对按摩院或医生诊所等企业可能很重要。
在成功模式中,以下特征对企业成功至关重要:
- 做一个
Restaurant
- 服务
lunch
- 还发球
dinner
- 你的
RestaurantsPriceRange2
很重要 - 做一个
chain
XGBoost 模型解释
XGBoost 的主要特性是从 feature_importances_ 属性中获得的。然而,我们希望找到一种方法来解释我们的输出,以及如何优化业务成功。
对于这项研究,我们使用 SHAP(沙普利附加解释)包来获得个性化的特征属性。 Shapley 值主要用于每次预测的基础上,以帮助解释,并回答类似“是什么导致我的企业被标记为关闭?”
为了证明 SHAP 的使用是正确的,我们在 XGBoost 中给出了 plot_importance 方法,它基于重要性类型产生了三种不同的解释。
weight
特征在树中出现的次数
gain
使用该功能的拆分的平均增益
cover
使用该特性的分割的平均覆盖率,其中覆盖率定义为受分割影响的样本数
在下图中,我们显示了 SHAP 值的平均绝对值。x 轴显示从模型中隐藏特征时模型输出的平均幅度变化。考虑到隐藏一个特征会根据隐藏的其他特征而变化,Shapley 值用于加强一致性和准确性。
下图是每个要素的 SHAP 值的密度散点图,用于确定每个要素对数据集中每个观测值的模型输出的影响程度。摘要图结合了特征重要性和特征效果。摘要图上的每个点都是一个特征和一个实例的 Shapley 值。y 轴上的位置由特征决定,x 轴上的位置由 Shapley 值决定。颜色代表从低到高的特性值。
“着色”功能告诉我们,随着时间的推移,你的stars_change
(星级的平均变化)增加是保持开放的一个很好的预测。对于review_count
(评论数量)来说,不多会对你有害,然而reiew_count
多也意味着负面评论多。对于第三个最重要的特性useful
(有用评论投票总数),这似乎是一个成功的积极指标。
该图还允许我们识别异常值,因为重叠点在 y 轴方向上抖动,因此我们可以了解每个要素的 Shapley 值的分布情况。对于一个特定的业务子集,拥有一个高计数的useful
实际上可能是一个即将关闭的指标。比如,有人评论说“离鸡肉远点,好像没煮熟”也不是没听说过。
SHAP 相关图是显示单个要素对整个数据集的影响的额外可视化工具。与部分相关图相反,SHAP 考虑了特征中存在的交互作用效应,并且仅在由数据支持的输入空间的区域中定义。
下面的图表适用于review_density
(相对于 2 公里半径内所有其他业务的标准化审查计数)。
在上面的图中,垂直扩散由交互作用影响驱动,另一个特征,这里是RestaurantsGoodForGroups
,被选择用于着色,以突出可能的交互作用。我们可以看到,相对于其他业务,拥有更高的评论数是成功的良好指标。此外,对群体有利往往与review_density
正相关。
下面的相关矩阵与上面的图相联系。我们可以注意到review_density
和RestaurantsGoodForGroups
之间的正相关关系。
结论
企业家在投资前要研究清楚一家企业是关门还是继续营业。通过机器学习,我们能够识别出能够预测本文原始问题的特征。我们还能够在每个用户的基础上提供模型可解释性。
虽然可能无法获得问题的全面答案,但解决方案提供了一条前进的道路。企业可以使用模型解释来优化成功,并知道他们需要改进的指标。
展望未来,我们可以利用review.json
文件中的文本信息。一个示例的 NLP 练习将是提取表示商业表现的时间或位置函数的情感或单词组。
多亏了 s和 Aditya Subramanian,这个项目才得以实现。要深入了解该流程及其相应代码,请访问 GitHub 资源库:
https://github.com/NadimKawwa/PredictBusinessSuccess
参考
如果你是学生,你将有机会赢得 10 个奖项中的一个,奖金为 5000 美元。我们将根据他们的…
www.yelp.com](https://www.yelp.com/dataset/challenge) [## 利用 Yelp 数据预测餐馆倒闭
米恰伊尔·阿里菲拉克斯是一名有抱负的数据科学家,也是普林斯顿大学的化学工程博士生…
towardsdatascience.com](/using-yelp-data-to-predict-restaurant-closure-8aafa4f72ad6) [## 第 5 章模型不可知的方法|可解释的机器学习
将解释从机器学习模型中分离出来有一些…
christophm.github.io](https://christophm.github.io/interpretable-ml-book/agnostic.html) [## 使用 XGBoost 的可解释机器学习
这是一个关于错误解释你的机器学习模型的危险,以及解释的价值的故事…
towardsdatascience.com](/interpretable-machine-learning-with-xgboost-9ec80d148d27) [## 树集成的一致个性化特征属性
解释来自树集合方法的预测是很重要的,例如梯度推进机器和随机森林…
arxiv.org](https://arxiv.org/abs/1802.03888) [## 我的秘方是在卡格尔比赛中名列前 2%
使用特征探索技术构建更好的 ML 模型,用于特征理解、噪声/泄漏特征检测…
towardsdatascience.com](/my-secret-sauce-to-be-in-top-2-of-a-kaggle-competition-57cff0677d3c) [## 使用边界坐标查找纬度/经度距离内的点
这篇文章描述了如何有效地查询一个数据库,查找距离某一点一定距离内的地点…
扬马图舍克](http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates)*
如何预测你的营销活动的成功
线性、树、森林和支持向量回归:比较、源代码和即用型应用程序
Photo by Anika Huizinga on Unsplash
在这篇文章中,我将带你经历一个建立、训练和评估数字营销活动中广告投放数量预测模型的过程。所有这些技术都可以类似地应用于其他回归问题,尤其是预测各种活动绩效指标。这些预测可用于在推出之前评估未来的营销活动,以及确定最佳参数,包括此类活动的时间表和预算规模。您可以使用自己的活动数据或提供的样本数据集来编写 Python 代码。在所有源代码旁边,我还提供了一个简单的应用程序来预测基于购买的数字营销活动的印象、点击和转换。
app:【predictor.stagelink.com
代码:github.com/kinosal/predictor
故事大纲
- 要求
- 定义你的目标
- 获取数据集
- 第一眼
- 预处理您的数据
- 训练你的模特
- 评估您的模型
- 预测下一次活动的结果
- 额外收获:现成的训练模型
要求
我们将使用过去营销活动的数据来预测未来营销活动的结果。一般来说,数据越多,即活动越多,预测就越准确。确切的数字取决于你的活动的同质性,但是你可能需要至少几百个活动的数据。此外,由于我们将使用监督学习技术,您需要相同的输入,即尺寸或特征,用于您想要估计结果的未来活动。
如果您现在手头没有合适的数据集,不要担心:您可以从这里下载一个 CSV 文件,其中包含我将在本文中使用的示例:
https://github . com/kinosal/predictor/blob/master/model/impressions . CSV
明确你的目标
当我们提到活动的成功或结果时,我们实际上指的是什么?这个显然要看你的具体情况。在这篇文章中,我们将尝试预测单个活动的印象数。类似地,点击和转化可以被预测来完成经典的营销漏斗:
获取数据集
我们看到了几个过去的活动,每个活动都提供了一个观察值或表中的一行,该表具有多个维度或列,包括我们要预测的因变量以及多个解释自变量或特征:
由于我们希望预测结果的活动存在于未来,因此这种情况下的特征不包括任何先前的性能数据,而是活动的不同可观察质量。由于我们通常事先不知道哪些功能将成为良好的预测工具,我建议也使用那些看起来与您的活动关系不大的变量,并投入一些时间来寻找或构建新功能。虽然也有关于减少特征空间的争论,但这通常仍然可以在稍后阶段处理。
你可以用一个非常简单的功能加载 CSV 并保存到一个熊猫数据框中:
import pandas as pd
data = pd.read_csv('impressions.csv')
第一眼
在建立和训练预测模型之前,我总是先看一眼数据,以了解我在处理什么,并找出潜在的异常。我们将使用样本数据来预测营销活动的印象数,因此“impressions.csv”包含每个活动的一行,每个活动的印象总数以及指标和分类特征,以帮助我们预测未来活动的印象数。我们将通过加载数据并显示其形状、列和前 5 行来确认这一点:
>>> data.shape
(241, 13)>>> data.columns
Index(['impressions', 'budget', 'start_month', 'end_month',
'start_week', 'end_week', 'days', 'region', 'category',
'facebook', 'instagram', 'google_search', 'google_display'],
dtype='object')>>> data.head(5)
impressions budget start_month ... google search google_display
9586 600 7 ... 1 0
...
第一列包含从属(待预测)变量“印象”,而总共有 241 个记录(行)的 12 个特征列。我们还可以使用 data.describe() 来显示每个指标列的计数、平均值、标准差、范围和四分位数。
我们可以进一步观察到,我们正在处理十个数字特征和两个分类特征,而四个数字列是二进制的:
现在让我们绘制数字特征的直方图。我们将使用两个非常方便的数据可视化库, Matplotlib 和 Seaborn (构建于 Matplotlib 之上):
import matplotlib.pyplot as plt
import seaborn as snsquan = list(data.loc[:, data.dtypes != 'object'].columns.values)
grid = sns.FacetGrid(pd.melt(data, value_vars=quan),
col='variable', col_wrap=4, height=3, aspect=1,
sharex=False, sharey=False)
grid.map(plt.hist, 'value', color="steelblue")
plt.show()
作为最后一瞥,我们将看看数字特征之间的基本线性相关性。首先,让我们用 Seaborn 热图来想象一下:
sns.heatmap(data._get_numeric_data().astype(float).corr(),
square=True, cmap='RdBu_r', linewidths=.5,
annot=True, fmt='.2f').figure.tight_layout()
plt.show()
此外,我们还可以输出每个特征与因变量的相关性:
>>> data.corr(method='pearson').iloc[0].sort_values(ascending=False)
impressions 1.000000
budget 0.556317
days 0.449491
google_display 0.269616
google_search 0.164593
instagram 0.073916
start_month 0.039573
start_week 0.029295
end_month 0.014446
end_week 0.012436
facebook -0.382057
这里我们可以看到,印象数与预算金额和活动持续时间(天数)正相关,与使用脸书作为渠道的二元选项负相关。然而,这仅仅向我们展示了一种成对的线性关系,并且只能作为一种粗略的初始观察。
预处理您的数据
在我们开始构建预测模型之前,我们需要确保我们的数据是干净的和可用的,因为这里适用于:“垃圾进,垃圾出。”
在这种情况下,我们很幸运地获得了一个结构相当良好的数据集,但我们仍然应该针对即将面临的挑战进行快速预处理:
- 只保留因变量大于零的行,因为我们只想预测大于零的结果(理论上值等于零是可能的,但它们对我们的预测没有帮助)。
- 检查缺少数据的列,并决定是删除还是填充它们。这里,我们将删除丢失数据超过 50%的列,因为这些特性不会给模型增加太多。
- 检查缺少值的行,并决定是删除还是填充它们(不适用于示例数据)。
- 将罕见的分类值(例如,份额小于 10%)放入一个“其他”桶中,以防止我们的模型过度适应这些特定事件。
- 将分类数据编码到一次性虚拟变量中,因为我们将使用的模型需要数字输入。有各种方法对分类数据进行编码,这篇文章提供了一个很好的概述,以防你有兴趣了解更多。
- 指定因变量向量和自变量矩阵。
- 将数据集分为训练集和测试集,以便在训练后正确评估模型的拟合度。
- 根据我们将要构建的一个模型的需要缩放特征。
下面是完整的预处理代码:
训练你的模特
最后,我们可以继续构建和训练多个回归变量,以最终预测结果(因变量的值),即所讨论的营销活动的印象数。我们将尝试四种不同的监督学习技术——线性回归、决策树、随机森林(决策树)和支持向量回归——并将使用 Scikit-learn 库提供的相应类来实现这些技术,该库已经用于在预处理期间缩放和拆分数据。
我们可以使用更多的模型来开发回归器,例如人工神经网络,它可能会产生更好的预测器。然而,本文的重点是以直观和可解释的方式解释这种回归的一些核心原则,而不是产生最准确的预测。
线性回归
https://towardsdatascience.com/introduction-to-linear-regression-in-python-c12a072bedf0
使用 Scikit-learn 构建线性回归器非常简单,只需要两行代码,从 Scikit 的线性模型类中导入所需的函数并将其赋给一个变量:
from sklearn.linear_model import LinearRegression
linear_regressor = LinearRegression(fit_intercept=True, normalize=False, copy_X=True)
我们希望保留默认参数,因为我们需要计算截距(当所有特征都为 0 时的结果),并且我们不需要偏好可解释性的标准化。回归器将通过最小化误差平方和(即预测结果与真实结果的偏差)来计算自变量系数和截距,这被称为普通最小二乘法。
我们还可以输出系数及其各自的 p 值,输出的概率独立于(此处也不相关于)特定特征(这将是系数等于 0 的零假设),因此是统计显著性的度量(越低越显著)。
在我们之前的“第一眼”中已经可视化了数字特征之间的相关性,我们期望特征“预算”、“天数”和“facebook”携带相对较小的 p 值,其中“预算”和“天数”具有正系数,“facebook”具有负系数。 statsmodels 模块提供了一种输出这些数据的简单方法:
model = sm.OLS(self.y_train, sm.add_constant(self.X_train)).fit()
print(model.summary())
这里的 p 值是使用基于 t 分布的 t 统计或得分计算的。该摘要还为我们提供了整个模型的准确性或拟合优度的第一个提示,通过测定输入变量解释的输出中方差份额的决定系数 R 平方进行评分,此处为 54.6%。
然而,为了比较所有模型并适应我们的特殊挑战,我们将使用一种不同的评分方法,我称之为“平均相对准确度”,定义为 1 -平均百分比误差= 1 -平均值(|(预测-真值)/真值|)。如果真值为 0,则该度量明显是未定义的,但是在我们的情况下,这是不相关的,因为我们在预处理步骤中检查该条件(见上文),并且我们将因此获得与准确性的直观定义相匹配的良好可解释性。我们将使用五重交叉验证计算所有模型的得分,随机将数据集拆分五次,并取每个得分的平均值。Scitkit-learn 也为此提供了一种简便的方法:
linear_score = np.mean(cross_val_score(estimator=linear_regressor,
X=X_train, y=y_train, cv=5,
scoring=mean_relative_accuracy))
我们获得的线性回归的训练分数是 0.18;因此,我们能够用这个模型产生的最佳拟合结果只有 18%的预测准确度。让我们希望其他模型能够超越这一点。
决策树
https://becominghuman.ai/understanding-decision-trees-43032111380f
接下来是从一个决策树中得到的回归量。这里,我们将使用一个 Scikit-learn 函数,它比线性模型多了几个参数,即所谓的超参数,包括一些我们尚不知道所需设置的参数。这就是为什么我们要引入一个叫做网格搜索的概念。网格搜索也可从 Scikit-learn 获得,当训练预测模型并返回最佳参数(即产生最高分数的参数)时,它允许我们定义要测试的参数网格或矩阵。通过这种方式,我们可以测试决策树模型的所有可用参数,但我们将关注其中的两个参数,即衡量将一个分支分成两个分支的质量的“标准”和树的一个叶子(最终节点)的最小样本(数据点)数量。这将有助于我们找到具有训练数据的良好模型,同时限制过拟合,即不能从训练数据推广到新样本。从现在开始,我们也将为所有的随机计算设置一个等于 1 的随机状态,这样你将会得到相同的编码值。其余的工作类似于我们之前构建的线性回归:
tree_parameters = [{'min_samples_leaf': list(range(2, 10, 1)),
'criterion': ['mae', 'mse'],
'random_state': [1]}]
tree_grid = GridSearchCV(estimator=DecisionTreeRegressor(),
param_grid=tree_parameters,
scoring=mean_relative_accuracy, cv=5,
n_jobs=-1, iid=False)
tree_grid_result = tree_grid.fit(X_train, y_train)
best_tree_parameters = tree_grid_result.best_params_
tree_score = tree_grid_result.best_score_
从我们定义的网格中选择的最佳参数包括均方误差,作为确定每个节点最佳分割的标准,以及每个叶片的最少九个样本,产生 67%的平均相对(训练)准确度,这已经比线性回归的 18%好得多。
决策树的一个优点是我们可以很容易地形象化和直观地理解模型。使用 Scikit-learn 和两行代码,您可以生成拟合决策树的点表示,然后您可以将其转换为 PNG 图像:
from sklearn.tree import export_graphviz
export_graphviz(regressor, out_file='tree.dot',
feature_names=X_train.columns)
正如您所看到的,所有 16 个特性中只有 4 个用于构建这个模型:budget、days、category_concert 和 start_month。
随机森林
单一决策树的主要挑战在于在每个节点找到最佳分裂,并过度适应训练数据。当将多个树组合成随机森林集合时,这两种情况都可以得到缓解。这里,森林的树将在数据的不同(随机)子集上被训练,并且树的每个节点将考虑可用特征的(再次随机)子集。
随机森林回归器的构建几乎与决策树一模一样。我们只需要添加树的数量,这里称为估计量,作为一个参数。由于我们不知道最佳数字,我们将在网格搜索中添加另一个元素来确定最佳回归量:
forest_parameters = [{'n_estimators': helpers.powerlist(10, 2, 4),
'min_samples_leaf': list(range(2, 10, 1)),
'criterion': ['mae', 'mse'],
'random_state': [1], 'n_jobs': [-1]}]
forest_grid = GridSearchCV(estimator=RandomForestRegressor(),
param_grid=forest_parameters,
scoring=mean_relative_accuracy, cv=5,
n_jobs=-1, iid=False)
forest_grid_result = forest_grid.fit(X_train, y_train)
best_forest_parameters = forest_grid_result.best_params_
forest_score = forest_grid_result.best_score_
根据我们定义的网格搜索,森林模型的最佳参数包括平均绝对误差标准、3 个最小叶子样本大小和 80 个估计量(树)。与单个决策树相比,通过这些设置,我们可以再次将训练准确率提高到 70%。
支持向量回归机
我们要构建的最后一个回归变量基于支持向量机,这是一个由 Vladimir Vapnik 在 20 世纪 60 年代到 90 年代开发的美丽的数学概念。不幸的是,解释它们的内部工作超出了本文的范围。尽管如此,我还是强烈建议去看看;一个很好的入门资源是温斯顿教授在麻省理工学院的演讲。
一个非常基本的总结:支持向量回归机试图将给定样本拟合到由线性边界定义的直径的多维(按照特征数量的顺序)超平面中,同时最小化误差或成本。
尽管这种类型的模型与决策树和森林有着本质的不同,但 Scikit-learn 的实现是相似的:
svr_parameters = [{'kernel': ['linear', 'rbf'],
'C': helpers.powerlist(0.1, 2, 10),
'epsilon': helpers.powerlist(0.01, 2, 10),
'gamma': ['scale']},
{'kernel': ['poly'],
'degree': list(range(2, 5, 1)),
'C': helpers.powerlist(0.1, 2, 10),
'epsilon': helpers.powerlist(0.01, 2, 10),
'gamma': ['scale']}]
svr_grid = GridSearchCV(estimator=SVR(),
param_grid=svr_parameters,
scoring=mean_relative_accuracy, cv=5,
n_jobs=-1, iid=False)
svr_grid_result = svr_grid.fit(X_train_scaled, y_train_scaled)
best_svr_parameters = svr_grid_result.best_params_
svr_score = svr_grid_result.best_score_
我们可以再次使用网格搜索来找到一些模型参数的最佳值。这里最重要的是将样本变换到更高维度的特征空间的核,在该特征空间中,数据可以被线性分离或近似,即通过上述超平面。我们正在测试一个线性核,一个多项式核和一个径向基函数。ε为 0.08,即预测与真实值的最大(缩放)距离,其中没有与其相关联的错误,并且惩罚参数 C 为 12.8,线性核表现最佳,达到 23%的(缩放)训练精度。
评估您的模型
在我们根据手头的训练数据确定了模型的最佳参数后,我们可以使用这些参数来最终预测测试集的结果,并计算它们各自的测试精度。首先,我们需要用训练数据的期望超参数来拟合我们的模型。这一次,我们不再需要交叉验证,并将使模型适合完整的训练集。然后,我们可以使用拟合回归来预测训练和测试集结果,并计算它们的准确性。
training_accuracies = {}
test_accuracies = {}
for regressor in regressors:
if 'SVR' in str(regressor):
regressor.fit(X_train_scaled, y_train_scaled)
training_accuracies[regressor] = hel.mean_relative_accuracy(
y_scaler.inverse_transform(regressor.predict(
X_train_scaled)), y_train)
test_accuracies[regressor] = hel.mean_relative_accuracy(
y_scaler.inverse_transform(regressor.predict(
X_test_scaled)), y_test)
else:
regressor.fit(X_train, y_train)
training_accuracies[regressor] = hel.mean_relative_accuracy(
regressor.predict(X_train), y_train)
test_accuracies[regressor] = hel.mean_relative_accuracy(
regressor.predict(X_test), y_test)
结果如下:
训练精度:线性 0.34,树 0.67,森林 0.75,SVR 0.63
测试精度:线性 0.32,树 0.64,森林 0.66,SVR 0.61
我们最好的回归器是随机森林,最高测试精度为 66%。这似乎有点过了,因为它与训练精度的偏差相对较大。随意试验超参数的其他值,以进一步改进所有模型。
在最终保存我们的模型以对新数据进行预测之前,我们将使它适应所有可用的数据(训练和测试集),以尽可能多地纳入信息。
预测结果
现在我们有了一个模型,可以预测未来营销活动的结果。我们只需对它调用 predict 方法,传递一个特定的特征向量,并将收到我们训练回归元的度量的相应预测。我们还可以将现有数据集的真实印象与基于新模型的预测进行比较:
预测值与实际值的平均相对偏差为 26%,因此我们达到了 74%的准确率。只有 14%的中值偏差甚至更小。
结论
我们能够构建和训练回归器,使我们能够根据历史营销活动数据预测未来营销活动的印象数(以及其他模拟方式的绩效指标)。
随机森林模型的预测精度最高。
我们现在可以使用这些预测来评估一个新的营销活动,甚至在它开始之前。此外,这使我们能够确定最佳参数,包括我们活动的时间表和预算规模,因为我们可以用这些特性的不同值来计算预测。
奖励:现成的训练模型
你手头还没有数据来为你计划的数字营销活动建立一个准确的预测模型?别担心:我已经训练了多个模型,用 1000 多个活动的数据来预测印象、点击和购买。通过不同模型的组合,这些预测的准确率高达 90%。在 predictor.stagelink.com你会发现一个简单的应用程序,只需几个输入就能预测你未来活动的结果。这些模型主要根据推广活动门票销售的数字营销活动的数据进行训练,因此这可能是它们表现最好的地方。
predictor.stagelink.com
除此之外,你可以在我的 Github 上找到所有用于讨论营销业绩预测的代码:github.com/kinosal/predictor
感谢您的阅读-我期待您的任何反馈!
如何在 Power BI 中预测自定义 R 模型的值
如果您经常在 R 中为您的客户开发预测模型,您可能需要为他们提供一个实用的 GUI 来测试他们的模型。一个真正简单方便的方法是为用户提供与模型输入特性一样多的滑块和/或组合框,以及一个显示预测值的简单标签。对于研发人员来说,第一个显而易见的选择是一个闪亮的应用程序。但是,如果您的客户 IT 基础架构以微软为中心,Power BI 报告可能是最佳选择。
我们的测试预测模型
首先,我们创建一个 R 模型,用 Power BI 报告进行测试。我们将使用mtcars
数据集,这是一个从 1974 年汽车趋势美国杂志中提取的数据集,包括 32 款汽车(1973-74 款)的燃油消耗以及汽车设计和性能的 10 个方面。深入分析后,您可以在此处找到,最终适合的型号如下:
finalfit <- lm(mpg ~ wt+qsec+factor(am), data = mtcars)
我们可以将训练数据加载到 Power BI 模型中,以便在报告中进行训练。但是以这种方式,每次输入参数改变时,都需要模型训练,失去了预测的实时效果。最好的方法是将已经训练好的模型用于 Power BI 报告中。所以,让我们在文件系统上序列化它:
让我们设置电源 BI 报告
为了从 Power BI Desktop 执行 R 代码,您需要安装 R 引擎。如果您已经将 RStudio 与 CRAN R 一起使用,那么 R 脚本的 Power BI 桌面选项应该是这样的:
fig. 1 — Power BI Options for R Scripting
如果你想使用微软 R Open 引擎,确保它已经安装在你的机器上,然后正确地修改 R home 目录。
将 R 语言集成到 Power BI Desktop 中非常有效。您可以使用 R 脚本来:
- 输入数据
- 转换数据
- 创建可视化效果
您还可以导入基于 R 的自定义视觉效果。更多信息,你可以阅读这篇博文。
对于我们的目标,我们肯定需要一个 R 脚本可视化来从模型中预测目标值,然后将其显示为文本。数字特征可以通过假设参数输入。分类的可以通过 OK Viz 智能滤镜输入(只需下载 pbiviz 文件导入)。
加载 R 模型
因为我们在 RDS 文件中序列化了我们的模型,所以我们需要首先加载它,然后将它反序列化到我们的报告中。如果我们在 R 脚本可视化中做了这两个步骤,那么每次通过切片器或组合框修改输入值时,我们都会有一个 I/O 操作(加载步骤)。为了最大限度地减少 I/O 操作,从而获得更好的预测性能,最好从磁盘加载我们的预测模型一次(在 Power BI 报告开始时的导入数据阶段),然后将我们的预测放入 R 脚本可视化中。
Power BI 只有在 data.frame 或 data.table 类型时才能通过 R 脚本加载数据(详见此处)。那么,如何才能将一个序列化的模型加载到 Power BI 中呢?
诀窍是将模型序列化为一个字节串,然后将其存储在 dataframe 中。
所以,点击获取数据→更多…,只需搜索“脚本”,选择“R 脚本”,点击“连接”即可:
fig. 2 — Get data from an R script
现在只需在弹出的 R script 窗口中输入以下代码(感谢 Danny Shah 解决了 Power BI 中由于长字符串截断而导致的错误):
注意到项目文件夹变量需要一个绝对路径。
在上一个窗口中点击“确定”后,需要选择 model_df 数据框,然后点击“加载”:
fig. 3 — Load the R dataframe into Power BI
就是这样!R 模型现已纳入我们的 Power BI 报告。
添加切片器和组合框
现在是时候给我们的报告添加视觉效果了。由于输入特征是数值型( wt 和 qsec 和分类型( am )的,所以我们添加两个假设参数和一个智能过滤器。点击建模选项卡中的新参数后:
fig. 4 — Create a new What If Parameter
弹出一个新的对话框,询问参数细节。在检查了 wt 的最小值、平均值和最大值后,输入值如下:
fig. 5 — Details for the Weight What If Parameter
单击“确定”时,将添加一个新的计算表。重命名其对象,如下图所示:
fig. 6 — Calculated table added with the Weight What If Parameter
关联的切片器如下所示:
fig. 7 — The slicer for the new What If Parameter
对 qsec 参数做同样的操作:
fig. 8 — Details for the qsec What If Parameter
fig. 9 — Calculated table added with the qsec What If Parameter
为了为 am 分类值创建过滤器,首先我们需要创建一个新的表格来输入手动数据:
fig. 10 — Create a manual table
fig. 11 — Entering manual data in a table
然后,我们可以添加一个智能滤波器,选择传输值作为字段:
fig. 12 — Adding the Smart Filter
fig. 13 — The Transmission Smart Filter
现在我们有了输入输入参数所需的所有控件。我们只是错过了从模型中预测值的“核心”R 代码。
添加 R 脚本可视化
我们可以使用 R Script Visual 来取消模型的序列化,然后将预测值显示为标签中的字符串。让我们添加它,在组件中拖动以下值:
- 型号标识
- 型号 _str
- 重量
- qsec
- 上午
自定义视觉效果如下:
fig. 14 — Adding the R Script Visual
添加到相关联的 R 脚本编辑器的代码如下(感谢丹尼·沙阿修复了丢失尾随空格的问题):
带有预测的结果标签如下:
fig. 15 — The predicted value shown in the visual
就是这样!在与它的几次交互中,这里显示了完整的报告:
fig. 16 — Interacting with the report
完整的 pbix 文件和保存为 rds 文件的模型可在此链接获得。
发布报告
如果这个工具必须在涉众之间共享呢?一个解决方案是共享这两个文件( pbix 和 model rds 文件),这样用户就可以在他们的笔记本电脑上使用它们。这个解决方案的主要问题是指向 rds 文件的路径必须根据用户下载它的新位置手动更改。所以用户必须编辑 pbix 文件(对于普通用户来说不那么明显)。
更简单的解决方案是将报告发布给 Power BI 服务。预测模型已经在 Power BI 模型中序列化,因此不再依赖外部文件。唯一的预见是确保报告中使用的 R 包已经安装在 Power BI 服务上。服务上支持的 R 包是这个链接上的。
由于我们使用了 CRAN 标准软件包,我们的报告可以轻松发布。只需几次点击(按下主页选项卡上的发布按钮并选择报告目的地)即可完成:
fig. 17 — Interacting with the report published on the Power BI service
显然,如果我们尝试刷新底层报表数据集:
fig. 18 — Trying to refresh the dataset
我们将得到一个错误,因为没有连接到模型文件的网关来检索序列化的模型:
fig. 19 — Error after trying to refresh the dataset
您可以在 RDS 文件所在的机器上安装一个个人网关来绕过这个错误。
请记住,今天(2019 年 4 月)R 视觉仍然不支持 发布到网络 功能:
fig. 20 — R Visuals are not allowed by Publish to Web
如果你希望微软在未来的版本中考虑这个特性,你可以投票这个特性请求。
结论
在数据科学家训练出一个预测模型来解决一个业务问题之后,他必须向利益相关者提供工具来测试它。最好的工具是一个动态工具,让他们拖动滑块并通过过滤器选择分类值,以实时查看预测值。Power BI 报告可以管理所有这些需求,也可以通过 Power BI 服务轻松共享。
你可以在我的书“用 Python 和 R 扩展 Power BI”中找到这篇文章中使用的技术的更多细节,包括用 R 和 Python 开发的模型:
它在亚马逊上全球都有售。这里有几个链接:
希望你会觉得有趣!🙂
如何预测你的最佳足球运动员的 FIFA 20 评分?
创建一个机器学习算法来预测 FIFA 20 球员的评分。
我把球从米尔纳传给萨拉赫。萨拉赫快速运球,把球传给菲尔米诺。菲尔米诺时髦地给马内做了一个 360 度的转身。马内用左脚将球踢入门柱的右上角。这是一个目标。备受好评的利物浦足球俱乐部队的又一次强有力的努力。
这种能在虚拟世界里控制自己喜欢的玩家,让他们做不同技能的感觉深不可测。我在国际足联有过一些最好的经历。我可以看到足球运动员做我想让他们做的事情,并有机会控制比赛的节奏和结果,这就是为什么我对玩 FIFA 20 如此兴奋。
EA sports 每年都会发布一款新的 FIFA 游戏。今年,我最喜欢的球员,维吉尔·范·迪克登上了封面。我不能只是等待安装游戏,并使用一个 91 额定范迪克发挥对对手。我也渴望体验新的游戏活动,如沃尔塔足球,家规和国际足联终极团队。
看着球员的评分,我想起了我前一阵子写的一篇文章(可以在这里找到这里),我在文章中用机器学习算法预测了 FIFA 19 球员的评分。因此,我决定写一篇关于预测 FIFA 20 球员评分的新文章。
这是通过两种方式完成的。首先,通过使用国际足联 20 名球员的属性。然后,通过使用开发的机器学习算法来预测 FIFA 19 球员的收视率。
数据集
找到了具有正确属性的数据集。从这个链接获得了由 2019 年 FIFA 评分和 2020 年 FIFA 评分组成的两个数据集。在他们被获得之后,他们被装载并且清洗进 Jupyter 笔记本。为数据分析保留的主要特征是:姓名、总体情况、年龄、价值、工资和潜力。
Top five rows of the FIFA 20 dataset
Top five rows of the FIFA 19 dataset
将 FIFA 20 名球员的属性与其总体评分进行比较
创建了一个散点图来找出 FIFA 20 球员的总体评分与他们的潜力之间的关系。在散点图中也建立了回归线。
A scatterplot of FIFA 20 players’ overall ratings vs potential
该散点图的相关系数约为 0.647,表明两个变量之间存在适度的正相关关系。
下表显示了所有变量之间的相关系数。
The correlation coefficient table for all the variables
在回顾了其他变量与总体评分的关系后,得出的结论是,年龄、工资和价值也与总体评分有适度的正相关关系。
基于 FIFA 20 属性的预测模型
数据集分为两组:训练数据集和测试数据集。训练数据集保留了整个数据集的 87.5 %,而测试数据集保留了整个数据集的 12.5 %。
将数据集分成两组的目的是使用训练数据集来了解自变量(年龄、潜力、价值和工资)如何与因变量(总体)相互作用。然后,从这种交互开发的算法用于预测测试数据集的总体评级。
下面是拆分、训练和测试数据集的代码。
分割数据集
**import** **numpy** **as** **np**
split = np.random.rand(len(df_fifa1)) < 0.875
train = df_fifa1[split]
test = df_fifa1[~split]
regr = linear_model.LinearRegression()
训练数据集
*## Trainig & fitting the model*
fifa_x_train = train[['age','value_eur','potential','wage_eur']]
fifa_y_train = train[['overall']]
poly = PolynomialFeatures(degree=4)
fifa_x_train_poly = poly.fit_transform(fifa_x_train)
regr.fit(fifa_x_train_poly, fifa_y_train)
测试数据集
*## Testing the model*
fifa_x_test = test[['age','value_eur','potential', 'wage_eur']]
fifa_y_test = test[['overall']]
fifa_x_test_poly = poly.fit_transform(fifa_x_test)
使用 a 为四次的多元多项式回归进行预测,并使用 r2 分数、皮尔逊相关系数和 p 值测试其准确性。
机器学习算法非常准确。其 r2 分数约为 97.6 %,皮尔逊相关系数为 98.8 %,p 值为 0。
预测的玩家评分
进行预测后,创建两个表来显示训练数据集的预测评级和测试数据集的预测评级。
First 20 rows of the training datasets’ predicted ratings
First 20 rows of the testing datasets’ predicted ratings
在这两个数据集中,玩家的预测评分可以在右边第一列看到。这使得莱昂内尔·梅西的预测评分为 93.59,罗纳尔多的预测评分为 93.27,内马尔的预测评分为 91.00。因此,显示了他们的评级与他们分别为 94、93 和 92 的实际评级相比有多准确,并证明了该模型 97.6 %的准确性。
利用 FIFA 19 预测模型预测 FIFA 20 球员的评分
基于属性为 FIFA 20 球员的评级生成预测模型的相同过程被重复用于 FIFA 19 球员的数据集。然后,来自 FIFA 19 数据集的预测模型用于使用 FIFA 20 球员的属性生成 FIFA 20 评级的预测评级。
这个模型也被证明是准确的。它的 r-2 值为 97.4 %,皮尔逊相关系数为 98.8 %,p 值为 0。
预测的玩家评分
First 20 rows of FIFA 20 predicted players’ ratings based on FIFA 19 predictive model in descending order
从表中可以看出,大部分预测收视率与总体收视率相当接近。然而,马克·特尔·斯特根似乎是一个异数。他的评分预计为 104 分,而一个人最多只能得到 100 分。欧洲足联年度最佳球员维吉尔·范迪克的预测得分为 92.9。他的综合评分是 91 分。国际足联年度最佳球员莱昂内尔·梅西的预测评分为 92.14 分。他的综合评分是 94 分。
结论
查看用于预测收视率的两种方法的结果,可以得出结论,国际足联每年都使用相同的指标来确定球员的收视率。
用于构建这些预测模型的代码完整版本可见 此处为 。
如何准备你的数据工程面试
得到了你梦想中的公司的回电,但不确定该期待什么,以及如何准备接下来的步骤?我们是来帮忙的!
在 Insight ,我们已经成功地让数百名同事做好准备,在他们梦想的公司中过渡到数据工程师和机器学习工程师的职位。在任何工程职位的面试中,面试官都希望了解你是否具有良好的分析能力、解决问题的能力、沟通能力、工作文化和构建技术解决方案的能力。具体到数据工程,他们还想了解你是否有处理大数据和构建可扩展的健壮系统的技能。在本文中,我们将讨论如何最好地准备和执行每种类型的数据工程面试,从算法、系统设计、SQL 问题到基本的行为组件。
The typical Data Engineering interview process.
手机屏幕
有两种类型的电话屏幕:人力资源,一般都是行为问题,和技术电话屏幕。
人力资源电话筛选通常为 15-30 分钟,由公司的非技术人员进行,如招聘人员。你会被问到一些软问题,比如*你为什么想成为一名数据工程师?你认为自己五年后会怎样?你为什么想在我们公司工作?*更重要的是,你期望的薪水是多少?如果你不知道这些问题背后的真正原因,这些问题可能会显得无聊或奇怪:人力资源部门希望找到适合他们团队的合适人选。他们希望应聘者能够与同事和经理很好地沟通,并在公司呆很长时间,因为招聘和入职成本很高!
就像 HR 电话屏幕是基本沟通能力的过滤器一样,技术电话屏幕是基本技术能力的过滤器。现场面试在时间和团队资源方面的成本非常高,所以公司不想在一个不会编程的候选人身上花费几个小时。评估基本的 SWE 知识和将复杂的想法分解成更小的可理解的部分的能力是技术电话屏幕的最重要的原因。
HR 电话屏幕汇总
期待一个 15-30 分钟的电话会议,讨论你的背景、目标和对他们公司的兴趣。
他们正在寻找清晰的沟通,一个愉快的合作伙伴,一个对公司充满热情并做过调查的人,最好是一个愿意留在公司并快乐工作的忠诚员工。
例题包括说说你的背景。你为什么想成为【公司】的数据工程师?你期望的工资范围是多少?
准备:
1.为你的背景写一个剧本并练习。
2。深入了解公司价值观,并相应调整你的答案。
3。通过电话与你的同龄人练习(我们知道这可能会很尴尬)。
4。面试前至少 10 分钟,找一个安静的地方,有良好的网络连接。
技术电话屏幕总结
期待一个 30-60 分钟的电话会议,回答基本的 DE 概念或经典的 SWE 问题,通常由工程团队成员提出。
他们正在寻找具备 SWE 和 DE 基础知识、解决问题的技能以及交流技术信息能力的人。
例题包括什么是链表?你会如何用你选择的语言编写它们呢?在列表中查找所有重复项。你什么时候使用 SQL 和 NoSQL 数据库?
准备: 1。阅读数据工程食谱并回答至少 50 个问题。
2。和你的同伴一起练习书中的随机问题。
3。做 50 道简单的 LeetCode 题。
4。面试前至少 10 分钟,找一个安静的地方,有良好的网络连接。
课后考试
你的简历上说你有多年的经验,领导过多个项目,还是个摇滚明星。公司怎么知道你是否真的那么好?在大多数情况下,无法访问你的旧公司 GitHub 库,阅读和理解个人 GitHub 项目需要时间——更不用说他们不会确定代码是你写的。带回家的编码挑战是评估您的代码的生产就绪程度、您如何考虑边缘情况和异常处理,以及您是否能够以最佳方式解决给定问题的最简单和最快的方法。有两种主要的考试类型:
定时黑客排名
预计1.5-2 小时的考试,包含 3-5 个简单的中级黑客问题
,包括 SQL、正则表达式、算法和数据结构
他们在寻找知道解决标准计算机科学问题的有效算法和数据结构、考虑边缘情况并快速提供解决方案的工程师
准备: 1。解决至少 100 个 LeetCode/HackerRank 问题
2。用虚拟 Leetcode 竞赛练习——所有免费的过去竞赛,你可以在任何时间参加,并尝试在第一次尝试时快速正确地解决问题
3。划出一大块时间,让你处在一个舒适的环境中,你通常在那里做技术工作,确保你不会被打扰,并有足够的水和零食(如果需要的话)。
编码挑战
预计1–7 天编写代码,回答 1–3 个数据集上的 1–10 个问题,将其推送到您的 GitHub 存储库并提交链接。
他们正在寻找清晰的模块化代码、清晰的自述文件、单元测试和异常处理。
例题清理并分析一个员工工资和地点的数据集。不同地点的工资分布情况如何?编写一个 SQL 查询来完成相同的任务。
准备
准备 1。阅读并消化谷歌风格指南。
2。用 Python 或类似语言练习使用 unittest 库。
3。阅读 GitHub 最佳实践。
现场面试
如果你到了现场面试,你应该会觉得很有成就感,但是最难的部分还在后面!在 3-6 个小时内与 4-10 个人进行现场面试是一件非常累人的事情,尤其是在你没有准备好的情况下。知道会发生什么,提前做好现实的准备,对减少恐惧和紧张大有帮助。
白板算法和数据结构
这是最常见的面试类型,因为算法和数据结构的知识对于节省成本和时间的代码至关重要。它通常在白板上完成,以评估您在没有 IDE/堆栈溢出的情况下的编码技能以及您的技术交流技能。
期待30-45 分钟的面试,在白板上回答 1-2 个中等难度的问题,不断与面试官交流需求和解决方案。
他们想要的是你面试前的准备,基础知识和良好的沟通能力。不要在沉默中解决问题——让它成为你和面试官之间的对话。
准备
1。在纸张/白板上解决 80-150 个 LeetCode 问题
2。作为受访者,与同行或专业人士进行至少 20 次练习。
3。练习在白板上书写清晰易读的代码。
白板系统设计
作为一名数据工程师,每天你都要从头开始设计整个系统,或者给巨大的现有管道添加小功能。即使你在简历中提到了这些技能,公司在现实生活中检验你的能力也是至关重要的。
预计30-45 分钟的面试将设计出符合规格的数据工程系统。
**例题:**设计 Twitter——需要哪些系统块?你会使用什么样的数据库和模式?缓存和负载平衡呢?系统的权衡是什么?
他们在寻找你清晰沟通和缩小需求范围、设计概念级管道的能力,以及分布式系统基础知识。
准备 1。阅读数据工程食谱、数据工程生态系统和进行系统设计面试。
2。与同伴或导师在白板上练习至少 10 个不同的问题。
3。练习在白板上绘制清晰易读的系统图。
结构化查询语言
大多数公司都是语言不可知的。你可以从 Scala 过渡到 Python 再到 Java,但是对 SQL 的深刻理解是数据库工作的基础,是不可替代的,即使是 NoSQL 数据库。这就是为什么超过 50%的公司将这种类型的面试作为现场数据工程的一部分。
预计一次30-45 分钟的采访,包括 1-3 个难题 HackerRank SQL 问题+规范化、索引、分析-解释查询
****例题包括打印一个表格列的第 n 个最大条目。
****他们正在寻找您编写查询和优化他们现有 RDBMS 的能力。
准备**1。练习 57 SQL 问题书。
2。Google 并了解查询优化。
文化契合度
技术过硬,知识渊博很重要,但这还不够!如果你不能传达你的优秀想法,那么没有人能够理解和使用它们。面试的行为类型,比如文化契合度,意在展示你如何讲述自己的故事,并解释你如何处理艰难的工作环境。
The STAR method.
期待一次 30-45 分钟的面试,问 2-4 个关于你过去情况的问题。
****他们使用 STAR(情境、任务、行动、结果)方法寻找一致且完整的答案。
****示例问题包括告诉我们一次你在工作中遇到重大截止日期的经历。告诉我们你与其他团队成员发生冲突的一次经历。你是如何处理这些情况的?
准备
1。单独练习至少 30 个文化契合面试问题,写脚本,如果需要的话自己录音。
2。遵循 STAR 方法,与同伴一起练习至少 10 个问题。
TLDR
如果你喜欢看视频,这是我们就同一主题举办的网络研讨会:
如何为更好的 AI 准备训练数据?
人工智能(AI)可以给你的产品带来竞争优势。但要真正用 AI 产生价值,你需要高质量的 AI 训练数据。
为了获得这些训练数据,首先要决定你想用你的人工智能系统完成什么。带着这个目标,计算出你需要什么样的训练数据以及需要多少。然后,最后,你可以收集和准备数据来训练你的 AI 。
决定你想用你的人工智能系统实现什么
我们应该先说,人工智能不是所有问题的唯一解决方案。通常,您可以使用更有效、更复杂的技术。
例如,让我们想象一下你想让读者在你的网站上停留更长时间。有多种方法可以做到这一点,并不是所有的方法都需要构建一个定制的人工智能引擎。
- 一种方法是专注于降低你博客的跳出率。您可以通过多种方法实现这一点,包括更改页面设计、添加新的共享功能以及创建更好的内容。
- 然而,如果你选择用与他们最相关的内容来吸引读者,建立一个人工智能支持的内容推荐系统实际上是你最好的选择。
通过尽早设定一个明确的目标,你将完成两件事:1)确保人工智能是你真正需要的,2)简化为它选择、收集和准备训练数据的过程。
一个定制的人工智能可以帮助你预测和预测值,检测异常行为,发现模式,分析影响,以及构造或分类数据。
价值预测
有了回归分析,你就可以预测未来在一定条件下会发生什么。回归是一种很好的统计方法,可以帮助你分析几个变量之间的联系,看看它们是如何相互影响的。
例如,回归分析可以通过分析过去影响你销售额的因素来帮助你预测明年的销售额。以类似的方式,您可以使用回归分析来估计需求、收入、客户满意度等方面的波动。
价值预测
使用价值预测来计算在某个时间段内会发生什么。通过分析过去的事件,价值预测人工智能可以帮助你预测在给定的时间内形势将如何发展。
这种方法的一些实际实现包括估计未来的销售数字,计算何时开始产生投资回报,以及计算全年需求增长最快的时间。
异常检测
您可以通过异常检测注意到异常情况和行为。异常检测人工智能分析过去的数据,了解什么被认为是正常的行为,然后寻找任何不符合标准的行为。
借助异常检测,您可以防止客户欺诈、构建智能安全系统、分析医疗传感器的读数、维护工业环境的稳定性等等。
影响分析
影响分析可以帮你决定哪些因素对结果影响最大。推动销售的因素很可能是有限的,影响分析可以帮助你确定这些因素。
这种方法的其他实际实现包括找出什么内容驱动了最大的流量和转化率,以及什么内容可能会损害您所在行业的客户满意度。
联合
使用关联方法,您可以在各种事件序列中找到模式。例如,你可以让人工智能分析客户可能会一起购买哪些商品,然后向其他潜在客户推荐这些商品。
在工业环境中,关联方法可以帮助您在系统崩溃之前追溯跟踪传感器读数的变化,以避免将来发生类似的崩溃。您还可以记录顾客在结账时的行为,找出那些继续付款的顾客和那些放弃购物车的顾客之间的相似之处。
了解 Lemberg 如何构建用于个人卫生控制的数据科学设备。
使聚集
通过聚类,人工智能使得根据相似性将数据组织成类别变得容易。这种方法非常适合您想要理解您所拥有的任何数据的时候。
聚类的一些例子是划分目标受众,分析竞争对手提供的服务的异同,以及建立基于客户的营销策略。
分类
通过实现分类方法,你可以构建一个人工智能来回答简单和复杂的数据问题。
数据分类可以帮助你更好地了解你的受众和客户:根据他们的推文和评论,他们对你的服务有多满意,他们完成结账的可能性有多大,你可以做些什么来为他们提供更好的体验,等等。
请记住,并不是所有的 AI 开发都是从解决某个行业问题的愿望开始的。有时候,你有很多数据,你想从中产生价值,这也很好。不管你从什么开始,尽可能缩小你的最终目标。
用你的目标来决定你需要什么样的 AI 训练数据
为了训练人工智能解决问题或实现你确定的目标,你需要给它足够的与目标或问题相关的数据。这些数据将构成您的训练数据集。
根据任务的不同,你要么需要监督人工智能的学习过程,要么让人工智能自学。
- 有了监督学习,你需要给人工智能输入标签数据,告诉人工智能什么输入应该导致什么输出。当你已经知道你想要人工智能产生什么结果(分类,异常检测等)时,这种方法是很好的。).
- 然而,无监督学习意味着人工智能将分析数据,然后自己决定产生什么输出。如果您不确定从您拥有的数据中能得到什么(聚类、值预测和预测等),您应该实现这种方法。)
当开发 BarHelper(一个具有计算机视觉功能的人工智能,可以识别瓶装和罐装饮料并计算订单的总成本)时,我们必须训练人工智能:
- 在图像和视频中识别特定的罐子和瓶子,以及
- 弄清楚每种饮料的名称和价格。
Interface of BarHelper, our drink recognition system
BarHelper AI 在监督下学会了提供我们期望的结果。为了实现这一点,我们的工程师选择了几种瓶装饮料,并从不同角度拍摄了多达一千张照片。
Examples of data we collected to train the BarHelper AI
这大概也是你应该做的。确定一个目标,然后考虑哪些数据可以帮助你实现这个目标。然而,重要的是,你只在有意义的数据上训练你的人工智能。你无法通过向任何人工智能提供藏着可乐罐的汽车图像来教它识别可乐罐。
听听 Lemberg 首席数据科学家帕夫洛·特卡琴科的话:“为了训练一个人工智能产生你期望的结果,你应该给它与这些结果有明确、有意义联系的训练数据。你永远不要指望人工智能能建立你自己无法建立的联系。”
你不仅需要相关的训练数据,还需要大量的数据。但是多少训练数据足以开始开发一个 AI 呢?
估计你需要多少训练数据来开始
一个很好的经验法则是你拥有的高质量训练数据越多,你能开发的 AI 就越好。然而,如果你想更精确一点,看看你的解决方案有多复杂,你需要它有多精确。
例如,在开发风力涡轮机异常检测系统时,帕夫洛·特卡琴科必须创建一个解决方案,能够快速且极其准确地检测系统行为中的任何异常。鉴于风力涡轮机的整体复杂性和人工智能的要求,帕夫洛需要至少一年的风力涡轮机传感器读数,以 5 到 10 分钟的间隔持续记录。
这些数据足以教会人工智能在全年不同天气条件下正常的风力涡轮机性能。一旦人工智能了解到正常的性能,它就能够提前两天准确地检测到系统行为的异常。
以此类推,你应该准备足够的训练数据来完全包含你对人工智能的期望。为了帮助您得出正确的结论,我们建议您:
- 与行业专家交流
- 想想人工智能会有多复杂
- 决定你需要人工智能有多精确
- 如果可以的话,总是获取更多的数据
与行业专家交流
你对开发人工智能解决方案的领域了解得越多,你就越有可能创造出有价值的产品。即使你认为自己无所不知,也要考虑尽可能多地从行业专家那里获取意见。每一个新的输入都可以帮助你提出一个稍微好一点的解决方案,即使是最微小的优势也可以让你在竞争中脱颖而出。
行业专家可以帮助你发现你以前可能没有注意到的数据之间的联系。这将帮助你**找出什么样的训练数据可能是最有用的,**并可能促使你考虑使用你以前没有考虑过的数据。
想想人工智能会有多复杂
请记住,人工智能所做的只是将输入与输出相匹配。它以创造性的方式做到这一点,并且可以同时保存许多输入和输出,但本质上这就是它所做的全部。你的人工智能需要的输入数量决定了它的复杂性。通常,你需要的数据样本至少是输入的十倍。
例如,要构建一个智能内容推荐系统,你需要分析你的读者的行为,这可以通过收集关于读者的数据来完成。假设您将收集五个数据点:年龄、性别、居住国家和查看次数最多和最少的文章标签。这些都将成为你的人工智能的输入。所以要通过这五个数据点来分析用户,你需要从至少 50 个人那里收集数据。要分析的输入越多,需要的训练数据就越多。
决定你需要人工智能有多精确
根据您正在构建的系统,您可能有不同程度的容错能力。尽管人们总是希望系统尽可能精确,但可以说,医疗监护仪对错误的容忍度远不如智能广告宣传。
决定你允许的容错程度,并以此为基础开展工作。你希望人工智能越精确,你就需要越多的训练数据。
总是获取更多数据
如果你有一个明确的目标,并且坚持不懈地收集有意义的数据,那么总是要尝试收集更多的数据。如果存在,是因为数据的质量往往比数量更有意义。然而,随着人工智能的发展,我们总是会回到第一条规则:你拥有的高质量数据越多,你的人工智能就越好。
因此,尽早建立有效的数据收集和准备流程非常重要。
建立一致的数据收集和准备流程
决定了目标,选择了要收集的训练数据,并估计了开始需要多少数据后,您可以开始为您的 AI 实际收集和准备训练数据。
您收集培训数据的过程将根据您设定的目标而有所不同。它可能包括汇总销售数据、调查客户和用户、收集传感器读数等。现阶段唯一真正的建议是保持数据收集的一致性。
每个新的训练数据集必须具有与前一个相同的输入。如果您的第一个数据集包含用户的年龄、性别和母语列,那么您的下一个数据集也应该包含相同的列-不多也不少。不应该有一个包含年龄、性别和母语的训练数据集,另一个包含年龄和性别,第三个只包含年龄。如果不一致,人工智能将无法理解训练数据。
我们说应该和不应该,因为不一致不会在数据收集阶段制造或破坏人工智能。总是有办法在以后完善数据,但是如果您能够从一开始就收集一致的数据,您真的不想浪费时间清理和格式化数据。
为了收集 BarHelper 的训练数据,我们的工程师拍摄了几个瓶子的照片。然而,照片本身不足以训练人工智能。
我们通过建立图像失真算法来补救这种情况。它扭曲、拉伸、调整大小、模糊,并通过其他方式扭曲瓶子图像,以复制不同相机在不同情况下可能查看瓶子的方式。这有助于我们为训练数据集带来必要的数量和多样性。
这就是数据准备的内容:你获取你所拥有的任何数据,并应用各种技术使其对你的人工智能完美。您可以专注于向数据集添加更多数据,就像我们对 BarHelper 所做的那样,或者减少数据量以确保其质量和一致性——或者根据需要执行这两种操作。
清除丢失值的数据
缺失的值会大大降低你的 AI 的准确性。您可以用虚拟值或平均值替换丢失的值来修复它们。如果无法填充缺失的行和列,您也可以考虑将它们一起删除:拥有较少的干净数据比拥有大量的脏数据要好。
格式化数据以保持一致性
如果您的数据集聚集了来自不同来源的数据,或者如果不同的人负责在不同的时间更新它,确保记录的一致性。例如,所有的日期必须遵循相同的格式,所有的地址应该以相同的方式填写,所有的货币价值应该遵循相同的风格,等等。
使单位一致
使用一致的单位很重要,因为这将提高人工智能的速度和准确性。不应该同时有千克和磅的值,也不应该把不同的货币混在一起。**将所有相同类型的值放入相同的单位:**将所有重量转换为千克,将所有货币转换为美元,以此类推。
分解复数值
有时,你会收集复合值,人工智能将能够理解它们。然而,有些情况下你需要将复杂的值分解成简单的值以便更快更准确地处理:将月分解成天,将大的注释分解成关键字,等等。
聚合简单值
或者,有时小而具体的值会妨碍 AI 效率。为了补救这一点,将较小的数据点合并成较大的数据点:不是按照精确的年龄而是按照年龄范围对用户进行分组;不收集单一的传感器读数,而是计算给定一天或一周的平均值,等等。
这份数据准备技术清单远非详尽无遗。根据任务的不同,数据工程师可以选择以各种方式转换数据,确保他们可能从人工智能中获得的最高准确性和效率。
摘要
你的第一步应该是确定你到底想要实现什么。一个明确的目标将帮助你决定你需要收集哪些数据,并估计你需要多少数据来开始。然后,您仍然需要认真对待收集和准备数据的本质——对于在数据科学和工程方面几乎没有实践经验的人来说,这是一个令人疲惫的过程。
这就是为什么我们强烈建议雇佣有经验的数据科学家和工程师来帮助你开发最好的人工智能。
给我们写一封短信了解 Lemberg 如何帮助你开发一个出色的人工智能系统。
最初发表于【https://lembergsolutions.com】。
数据可视化如何防止误传?
图表、图形、地图和图解不会说谎。设计它的人会。
Science Valentine from xkcd - Randall Munroe
数据可视化方法涉及图形表示的设计,以总结分析过程中的数据。
从这第一个陈述来看,让公司理解假信息和假信息可能代表的风险是很重要的。
虽然假信息被定义为“故意且经常秘密传播的虚假信息,以影响公众舆论或掩盖真相”,但假信息与众不同。所以没错,图表会误导人。而且,我们都会同意,有时,实现没有任何错误信息风险的美学可视化是一门真正的艺术。然而,我们需要记住的是图表、图形、地图和示意图只是分析结果的图标。
误传是如何发生的?
这并不意外。一个图形可以通过集体意义的使用引发错误的见解,这种集体意义往往偏向于自我确认。无论是通过暴露、过度简化还是世界观,通过数据可视化得到的错误信息都是基于个体和各种成分的。
我个人偏爱的特拉维斯综合症,这种人往往会高估当下的意义。但是,他们还有很多其他人:
- 单纯接触效应:人们因熟悉事物而产生偏好的效应。
- 熟悉度逆火效应:熟悉度增加人们接受真实信息的机会的效应。
- 矫枉过正的逆火效应:较少的信息和更容易处理的信息更容易被接受为真实的效应。
- 确认偏见:以确认一个人已有信念的方式搜索、解释、关注和回忆信息的倾向。
- 世界观逆火效应:对一个人坚定信念的事实和反驳只会强化这些信念的效应。
这种偏差样本可用于制作误导性图表,这提高了考虑这些偏差对商业和经济决策以及人类总体行为产生影响的重要性。认知偏差的完整列表可在这里 获得。
Designed by John Manoogian III — Categorized by Buster Benson
在数据可视化中,可以使用哪些技术来防止有偏见的视图?
遵循可视化的 4 个支柱
当你对以下问题回答“是”时,你就认为可视化是成功的:
- 目的明确吗?由于目的规定了可交付成果,因此需要明确定义。
- 内容是否支持目的?考虑到包含的内容和排除的内容同样重要,只需要包含相关的内容。提醒一下,内容,即现实和数据之间的关系,必须始终去政治化和政治化。
- 结构是否揭示了内容?需要用一个合适的结构来清晰地表现现实和图形之间的关系。
- 可视化有助于消费吗?可视化,是图形和**数据之间的链接,**必须通过突出显示重要的内容并删除其余内容来发挥作用。
通过使用这四个支柱,图形的创建可以最接近现实和数据。越是远离这些条件的图形,越会导致歧义。
学习格式塔原则
格式塔这个术语的意思是“形式”或“形状”。在心理学中,格式塔是指当作为一个整体考虑时具有特殊性质,但当作为单独部分考虑时并不明显的东西。
心理学家马克斯·韦特海默、沃尔夫冈·科勒、库尔特·考夫卡以及后来加入的库尔特·勒温研究了感知,并得出结论:感知者应该被认为是主动的,而不是被动的。事实上,他们认为感知者不只是收集信息。为了理解数据,他们主动处理和重组数据。这是一个感知过程,某些因素会影响这一感知过程。
根据格式塔心理学:
- 我们倾向于用大脑看事情。
- 头脑把外部刺激理解为整体,而不是部分的总和
- 我们倾向于在的基础上有规律的**、有序的、对称的和简单的来排列我们的经验**。
Key principles of Gestalt
注意所有的技巧
from xkcd — Randall Munroe
- 建立相反的故事:引入不相关的信息,鼓励我们对较大的部分赋予较大的价值。 (Cudmore,2014)
- **坏的/错误的标度:**改变 Y 范围讲述了一个不同的故事,(Jones 2006—Peltier 2011)
Shut up about the Y-axis — Vox
- 摘樱桃:将信息隐藏在其他数据中,以缓和影响。
- 错误的因果关系:根据格式塔原理,当两条或更多的线一起出现在图表中,并且它们看起来彼此相似,我们倾向于假设它们是相关的。 (Cudmore,2014)
- 【邪恶的】政客:描绘政客们经常用来夸大斜坡、衰退、增长的伎俩。(安德伍德,2013)
- 花里胡哨的样子:用来在你应该关注信息的时候分散你的注意力。
- 不公正地划分选区:操纵地理边界对数据进行分组,以改变结果。(参见格式塔:邻近法则)
- 通过操纵隐藏差异:要么对一张图片使用不同的尺度 (Brown,2013) 、累积数据、时间间隔 (Huff,1993) 、绝对值,要么使用对数尺度来看起来不那么引人注目。(安德伍德,2013)
- 省略数据:主要用于饼图/圆环图,在作为一个整体呈现之前排除缺失的记录。
- “视错觉”使用 3D: 很难区分什么对象是背景,什么是前景,很难解释图形,以及在给定周围颜色的情况下,对象的颜色在哪里被不同地感知。
- 过度拟合:创建一个过度适应你现有数据的模型,它不能代表总体趋势。
- **面积感知:**通过不标注标签来评估一个结果所占比例的难度。(怀特洛-琼斯,2013)
- **均值的问题:**当一个方向或另一个方向存在异常值时,均值具有误导性。在这种情况下,中值或众数更好。 (Vembunarayanan,2014)
- 抽样偏差:从不代表总体的样本中得出结论。 (Vembunarayanan,2014)
- 辛普森悖论 (与“摘樱桃”相反) :当一个趋势出现在不同的数据子集中,但在组合各组时消失或反转。
- **尺寸作为错误的指标:**容易因不恰当使用气泡尺寸而产生误导。
- 将数据分割成许多图表:来自每个类别的各种观察总是在一个条形图中更好。(考希克,2014)
如果还不够,你还可以****使用“谎言因子”
不太引人注意但同样重要的是,爱德华·塔夫特提出了一个叫做“谎言因子”的公式来计算图形的精确程度。谎言因子越接近 1.0,图形越精确。
The “Lie Factor” — Edward Tufte (1983)
数据就是力量,可视化就是力量的运用。更多的观众将准备好处理数据驱动的视觉效果,他们将能够识别和避免错误和谎言。不幸的是,无论我们如何指出和谴责误导性图表,我们永远不会让它们消失。所以,如果你认为一个可视化不准确、清晰、知识性、教育性、非政治化、包容性、真正的、支持性和非判断性,不要让自己上当。通过提问来消除噪音。毕竟,数据可视化永远不应该被认为是某种真理,而只是用来显示显而易见性、事实和支持论点。
想获得更多操作指南吗? 上还有很多 😃