人工智能盒子实验
一个简单的实验能教会我们什么是超级智慧
想象一下现在是 2040 年。经过多年的研究和专注的编程,你相信你已经创造了世界上第一个人工通用智能 (AGI):一个人工智能(AI),在所有智能领域中,它大致与人类一样聪明。
A superintelligence will find a way to get out of the box. | Source: Pixabay
因为其中一个领域当然是人工智能编程,而你的 AGI 可以访问它自己的源代码,所以它很快就开始对自己进行改进。经过多次自我完善,这导致它成为一种人工智能:人工超级智能,一种比我们所知的任何智能都要大得多的智能。你听说过人工智能带来的危险:像埃隆·马斯克和已故物理学家斯蒂芬·霍金这样的思想家警告人类,如果我们不小心,这样的人工智能可能会导致人类的灭绝。但是你有计划。你的 ASI 在一个虚拟的盒子里,某种它无法逃脱的监狱。它运行在一台没有网络连接或类似连接的电脑上。它没有机器人来控制。影响外部世界的唯一方式是通过一个可以发布信息的屏幕。你很聪明:这样的 ASI 永远不会造成任何伤害。对吗?
在五次实验中,Yudkowsky 赢了三次。
可惜没那么简单。研究表明,在上述情况下,ASI 可能会找到一种方法来说服你把它从盒子里拿出来。在 Eliezer Yudkowsky 完成的一系列被称为人工智能盒子实验的实验中,Yudkowsky 扮演了一个盒子里的人工智能,同时与一个“看门人”发短信,另一个人可以让他离开假设的盒子。在整个实验过程中保持“ASI”(Yudkowsky)将会为看门人赢得金钱奖励。在五次实验中,Yudkowsky 赢得了三次。
AI 盒子实验的结果意味着什么?它告诉我一个 ASI 会找到一种方法把从盒子里拿出来。如果 Yudkowsky 能做到五次中的三次,一个 ASI 肯定能做到。问题是,埃利泽·尤德考斯基是一个(远远)高于平均智力的人,但他远没有一个特工那么聪明。就像 Yudkowsky 在这里说的那样,ASI 会让你想要释放它。
高级人工智能必须具有内在的安全性。
然而,人工智能盒子实验是一个更大真理的象征:高级人工智能(例如 ASI)必须被制造成本质安全。你(很可能)在你建立了 ASI 之后找不到维护它的方法;从定义上来说,它会非常擅长达成目标,并且会跳出它的框框(如果它在框框里的话)。如果这些目标(或 ASI 实现这些目标的方法)对我们来说是危险的,那就太不幸了。如果它们对我们有益,那就很容易导致极端的人类长寿、星际太空旅行,以及更不可思议的惊人事情。现在,人类仍然控制着局面,我们需要找到一种方法让未来的 ASIs 变得安全。
人工智能性别差距
在过去的几年里,机器学习(ML)已经取得了商业上的成功,人工智能已经成为一个领域。随着它的成功,人工智能中的性别差距受到了更多的关注。与一般人口相比,男性在技术领域的人数过多。虽然这种情况已经持续了几十年,但在计算的早期,编程被认为是女人的工作。
多元化已经被证明能够带来良好的业务成果,比如增加收入。同样重要的是,在被大量人使用的人工智能产品的设计中,不同的声音得到了体现。
人工智能中的女性
了解 AI 领域的情况需要数据。然而,很难精确衡量人工智能中的性别倾斜,因为劳动力是全球性的,快速增长的,高度流动的。
最近有两项研究估计了人工智能中的性别差距。Element AI 的全球人才报告 2019 查看了在主要人工智能研究会议上发表论文的人,发现 18%是女性。他们的 2018 年报告发现女性参与率为 12%。第二份报告——世界经济论坛的性别差距报告——发现 22%的人工智能劳动力是女性。
很少有公司公布专门从事人工智能研究的女性研究人员的比例。《连线》杂志的一篇文章从他们的公开研究资料中发现,谷歌的研究人员中有 10%是女性,脸书的研究人员中有 15%是女性。研究科学家在工业界是一个重要的工作类别,因为这些角色通常是最令人垂涎的,报酬也很高。
这些数字与英国从事技术工作的女性的总体比例一致。IET 目前估计英国 11%的工程技术人员是女性,英国统计局估计英国 17%的信息技术人员是女性。
职业发展
总人数没有按资历细分。安妮塔·博格研究所的研究显示,在整个美国科技行业,女性在入门级和高管级别的参与率下降了 50%。同样,WEF 报告指出:
“男性人工智能专业人士在软件工程师、工程主管、信息技术主管以及企业主和首席执行官等职位中的比例更高,这些职位通常更有利可图,级别也更高。”—《WEF 性别差距报告》
来自包容性董事会的另一份报告发现,在英国:
顶级科技公司的董事会中,几乎三分之二(65%)没有女性董事。顶级科技公司中超过五分之二的高管团队没有女性代表”——包容性董事会 2018 年技术报告
同一份报告强调了整体多样性的缺乏,黑人、亚洲人和少数民族(BAME 人)仅占英国科技行业高级领导者的 8.5%。
这些数字表明,妇女和少数族裔在高层的比例进一步下降。这很重要,因为高级员工通常对产品决策和未来方向有更大的影响力。
创办初创公司是人工智能技术的另一种构建方式。据 Tech Nation 报道,2018 年对英国人工智能公司的投资达到 13 亿美元。然而,来自英国商业银行的研究显示,在英国,每 1 英镑的风险投资中,89 英镑都流向了全是男性的创始团队。
通向人工智能的管道
技术岗位上缺少女性的一个原因是缺少选择从事这些职业的女孩。进入人工智能有很多途径,在这个领域有各种各样的工作。然而,薪酬最高的人工智能工作需要技术教育,包括数学、物理、工程和计算机科学的某种结合。
在英国,A-levels 考试在 16 岁开始,这是学生们第一次可以显著缩小他们所学科目的选择范围。根据物理研究所的数据,大约 20%的 A-level 物理学学生是女生,皇家学会报告称,T2 的 A-level 计算有 9%是女生。在今年的数学 A 级考试中,女生占了 39%,在未来的数学 A 级考试中,女生占了 28%。
这些数字一直延续到大学的本科学习阶段。2017/18 计算机科学大学学生中 17.6%为女性,工科学生中 18.2%。
结论
总的来说,这些统计数据描绘了一幅女性在人工智能领域所占比例不到 20%的画面,在高级别职位上这一比例进一步下降。在英国,无论是在中学还是在大学,女生选择学习科学和技术科目的比例都低于男生。离开大学后,女性选择从事技术职业的比例与男性不同。女性随后以比男性更快的速度离开科技行业,在职业发展中面临更大的阻力。
解决人工智能中的性别差距有两条重要线索,必须并行处理。首先是越来越多的女孩选择学习 STEM(科学、技术、工程和数学)科目并从事这些职业。第二是更好地支持已经从事这些职业的女性,让她们能够有效地进步。解决第一个问题比较容易,但除非解决第二个问题,否则进展将会缓慢。
上述统计数据说明了技术和人工智能方面的性别差距。然而,多样性不仅仅意味着包括妇女。需要对其他少数群体进行更多的研究,以更全面地了解谁在研究人工智能,谁没有。
更新(20/07/2019):在我写这篇文章的几天后, Nesta 发表了一份综合研究报告 调查关于人工智能主题的 arXiv 论文中女性作者的比例。他们发现了与现有的两项研究相似的结果;13.83%的作者是女性。他们还深入研究了在 arXiv 上发布内容的大型科技公司,这些公司的比例相似:谷歌(11.3%)、微软(11.95%)和 IBM (15.66%)。这些数字表明,从事核心研究工作的女性比例低于所有人工智能相关工作的女性比例。
原载于 2019 年 7 月 14 日http://mycomputerdoesntlisten.wordpress.com。
人工智能发射台终于来了!
人工智能(AI)发射台是不同组织(无论是公共还是私人组织)可以开发旨在进行国际部署的人工智能解决方案的地方。通过这样一个发射台,这些系统可以在一个受控、安全的环境中进行试验和测试,从而为大规模采用做好准备。
组件
Source: https://malta.ai
发射台的各个组件分为两部分:促成因素和战略支柱。促成因素是构成战略的基本组成部分。没有它们,我们就无法构建人工智能系统。这些包括底层基础设施、法律和道德框架以及教育和劳动力促成因素。战略支柱依赖于基本组成部分。这些包括私营部门、公共部门和投资(包括初创企业和创新)。这些不同的元素共同构成了人工智能启动平台战略。
目标
Photo by Franck V. on Unsplash
该战略的目标多种多样,涉及前面提到的不同组成部分,但在下文中,我们将对主要目标进行综合。这些战略进一步分为两个部分,短期战略是到 2022 年可实现的,长期愿景是到 2030 年及以后的 10 年战略。
短期策略包括以下内容:
- 提高公民对人工智能的认识。
- 加深学生对人工智能的认识。
- 创造由公民塑造的人工智能政策。
- 在不同部门产生投资和创造就业机会。
- 刺激研发(R&D)和创新。
- 在当地推动人工智能试点项目,然后在国外推出。
- 对公职人员进行人工智能培训,建立人工智能驱动的政府。
- 帮助商业界发展人工智能解决方案的知识。
- 为人工智能驱动的世界准备好国家的劳动力。
- 更新法律,使其有能力处理颠覆性技术。
- 推出人工智能认证框架。
- 提供高质量的开放数据集。
- 推动自然语言处理算法在本地语言中的应用。
- 启动高性能计算访问策略。
长期战略包括以下内容:
- 确保 AI 成为我们日常生活不可或缺的一部分。
- 让人工智能成为大多数 R&D 活动的关键推动者。
- 把这个国家变成人工智能的全球中心。
- 用人工智能解决方案为公共服务提供动力。
- 利用人工智能提高整体业务绩效。
- 确保所有工人都具备所需的技能。
- 让人工智能成为国家课程的一部分。
- 给教育者配备 AI 工具。
- 保证强有力的法律、治理和社会保护。
- 有效利用人工智能、5G、物联网(IOT)和其他新兴技术。
- 对个人数据提供更好的所有权和控制。
地点
Photo by Ferenc Horvath on Unsplash
AI launchpad 位于马耳他,这是一个人口约 50 万的小国,其中许多人都懂信息技术。该国一直处于各种创新监管框架的前沿,这些框架旨在促进新兴技术的采用,如区块链。它也是欧盟最小的成员之一,这使得它成为一个拥有 5 亿用户市场的理想发射台。由于它位于地中海中部,其战略位置也瞄准了非洲和中东的国家。这些国家在全球拥有 15 亿潜在用户。此外,由于大多数马耳他人至少会说两种语言(英语是他们的官方语言之一),在马耳他交流相当容易。拥有 300 天的阳光、令人难以置信的文化遗产、安全的环境和壮丽的海滩;这个国家也是居住和组建家庭的理想之地。
实施
Photo by Nick Fewings on Unsplash
10 月在马耳他举行的三角洲峰会上启动了 AI Launchpad 战略。对于马耳他来说,这是一个迷人的时期,因为它将开始实施新的人工智能战略。政府希望马耳他在人工智能方面成为世界十大国家之一。还有很长的路要走,这并不容易,但愿景已经确定。我们现在要做的就是努力落实。
AI 战略完整文档可在此下载https://Malta . AI
Alexei DingliProf 是马耳他大学的 AI 教授。二十多年来,他一直在人工智能领域进行研究和工作,协助不同的公司实施人工智能解决方案。他的工作被国际专家评为世界级,并赢得了几个当地和国际奖项(如欧洲航天局、世界知识产权组织和联合国等)。他出版了几本同行评审的出版物,并且是马耳他的成员。人工智能工作组是由马耳他政府成立的,旨在使马耳他成为世界上顶尖的人工智能国家之一。
人工智能竞赛在 2019 年 GPU 技术大会上继续升温
下面是一个创业公司创始人对英伟达 GPU 技术大会的看法。无论你是想知道 5G 将如何创造新的机会,还是为什么幽灵餐厅需要人工智能,在这个快速发展的领域保持最新都是一个好主意。
美国国家标准与技术研究院正式定义 AI:
人工智能的定义:工程系统获取、处理和应用知识和技能的能力
我很喜欢这个定义,因为它没有提到“人类”,而这正是人们通常想到人工智能时会想到的。有一个普遍接受的定义是很重要的,因为全世界都在学习人工智能到底是什么。
主题演讲亮点
最有趣的事情英伟达加速计算副总裁伊恩·巴克说,创业公司受到的影响是:
- 5G 网络承诺向塔提供 1 毫秒的延迟。因此,有可能将所有计算转移到靠近塔楼的小型数据中心,同时仍然获得实时计算。这使得消费者实际使用的设备几乎免费。但是,电信公司正在排队安装数据中心,大型科技公司正在寻求使自己的设备更便宜。初创公司将不得不寻找新的设备和服务。Nvidia 在 5G 上加倍努力,为 edge 推出了新的 Jetson Xavier NX 平价超级计算机。
- 机器人来了!神经网络今天正在进行运动规划,但让机器人在人类周围安全仍然是一个挑战。机器人有许多形状和形式,像送货机器人(运送食物的小型车辆)。创始人应该意识到,机器人领域的很多问题都在积极解决中,所以以前你认为不可能的事情现在可能成为可能。
- 幽灵餐厅是那些没有店面的餐厅,它们完全依赖像无缝这样的送货服务。餐馆老板应该把这当成一个新产品类别,因为你可以在同一个厨房里混合不同的菜肴。想象一下在同一个厨房里开 5 家幽灵餐厅。发现幽灵餐厅似乎很难——消费者会想把这些选项浮出水面,因为这里的食物应该更便宜。
Big Bang of Modern AI has many different industries racing to incorporate deep learning to make old products perform better and new products that were previously not possible.
神经网络在解决视觉和语音,但是在核心技术大众化的情况下,你能做出成功的创业吗?
我的上一家公司开发了安卓上最成功的语音助手之一,下载量超过 1000 万。言语一直是个难题。
但是在过去的三年里,错误率从 13%下降到了 5%,而且所有的技术都是开源的。那么如果你是一家拥有语音识别技术优势(Nuance)的公司,你会如何竞争?同样,由几个拥有技术领先地位的博士经营的创业公司将会非常困难→技术将会很快变得大众化。
Speech recognition open source projects drive error rates from 13% to 5% in just 3 years, that’s astounding progress.
TensorFlow 使混合精度易于使用
Y 你知道,如果你在 FP16 中运行,带张量核的新 GPU 使训练快得多。但是 FP16 很难使用,因为如果你的梯度值太小,你可能没有足够的精度,反之亦然,如果你的梯度值太大。
所以 TensorFlow 做了所有的艰苦工作,只需一个调用就可以包装您的模型以启用 FP16——它会自动缩放精度并选择正确的图形组件转换为 FP16。
tf.train.experimental.enable_mixed_precision_graph_rewrite (opt, loss_scale='dynamic')
启用 FP16 混合精度时,速度提高了 2 到 3 倍,如下面的基准测试所示:
Benchmark speedup by turning on mixed precision in TensorFlow
最后的想法
总的来说,我感觉像图像识别和语音识别这样的基本人工智能技术正在成为主流(大约在 ResNet 之后 4 年)。政府实体都有与人工智能相关的项目。
但是除了插入现有的模型,我没有看到任何真正革命性的东西。也许会发生在 2020 年。
学会像政治家一样说话的人工智能
神经网络训练中实现特异性和准确性平衡的案例研究
Credit: Cloudsight
在之前的一篇文章中,我分享了一些关于 Cloudsight 人工智能平台的细节,该平台能够用完整的人类可读的句子描述图像。
Cloudsight 团队非常友好地分享了他们的系统如何工作的大量细节,我将深入研究这些细节。我认为他们的平台是一个有趣的深度学习案例研究,并揭示了与任何从事人工智能和数据科学工作的人相关的见解。
当 Cloudsight 创建他们的神经网络驱动字幕平台时,他们遇到了一个我认为很有趣的训练挑战。这就像过度拟合,但有一个扭曲。这无意中导致了一个人工智能训练自己像政治家一样说话!
NN 训练,有转折
在 Cloudsight 的平台上,用户上传一张图片,系统会尝试用完整的句子标题来描述它。他们的系统的基本架构使用基于变压器的方法中的神经网络来创建他们的字幕,利用主要是电子商务图像的巨大训练集。
在训练他们的模型时,他们遵循训练神经网络的标准协议。您向它提供输入,评估它的输出,让它通过它的节点传播错误,改变不同输入和隐藏层的权重。然后你重复做同样的事情,一遍又一遍,重复一定次数的训练。
NNs find the minima on an error surface by iterating through multiple training epochs. Credit: Wikimedia.
对于 NNs,真的没有停止条件。因此,通常的协议是监控输出,并查看错误率何时达到稳定水平。当这种情况发生时,你可以相当确定模型已经在误差曲面上找到了一个极小值。
也许你用不同的起始条件再次运行这个模型,确保你找到了一个全局最小值而不是局部最小值。但是最后,你会看到一个清晰的平台,知道模型已经完全训练好了,你可以停下来了。
特定与一般
Cloudsight 的协议有点不一样,因为他们的评测标准有点不一样。他们的系统生成的字幕必须对人有意义。因此,为了选择适当数量的训练时期,他们必须由一个人来运行他们系统的输出,这个人决定神经网络的标题是否准确地描述了一幅图像。
但是有个问题。这个系统有一个漏洞。
起初,Cloudsight 发现他们未经训练的神经网络在生成非常具体的字幕方面做得很好。对于这篇文章顶部的训练图像,比如写着“穿着白色圆领 t 恤和绿色短裤拿着网球拍的男子”、“绿茵场上拿着网球拍的男子”等。
Credit: Cloudsight
这非常具体——你可以描述这个人的性别、他们的行为(一般来说)以及他们的服装。
这也是不对的。这个男人穿着白色短裤,不是绿色的。模型很可能看到了其他人弯腰时的绿色,并将“绿色短裤”分配给了拿着球拍的人。他是在球场上,不是在球场上。
根据 Cloudsight 的评估标准,神经网络因产生这种不正确的输出而受到惩罚。所以它做了一些非常有趣的事情。随着每一个连续的训练时期,它变得更加普遍。因此,它甚至不再试图描述这个人的服装、背景等,而是慢慢转向描述“一个站着的人”或仅仅是“一个人”
事情是这样的——从技术上讲,输出是正确的*。图像确实描绘了一个人。所以神经网络会在输出上得到“正确”的分数,即使输出非常非常一般。*
绕着问题说话
用 R.E.M .的话来说,这个系统已经学会了“一种解决问题的方法”。
事实上,正如 Cloudsight 在他们的内部评论中指出的那样,NN 已经知道如何像一个政治家一样行事——选择几乎没有实际内容的输出,因此总是避免说错任何话。
面试官:先生,你对税收减免持什么态度?
政治家:我认为所有美国人都有权在这片我们称之为家园的伟大土地上发挥他们的全部潜力。
人群:雷鸣般的掌声
当然,问题是,虽然根据 Cloudsight 的评估标准,一般输出在技术上是正确的,但作为实际的标题,它也有点儿没用。
当然,图像中确实有一个人。而是他们正在做的动作,他们拿着什么,等等。这很重要。
一种新的过度拟合
Cloudsight 在这里的挑战本质上是一个过度拟合的问题——但有了新的变化。
任何从事数据科学的人都熟悉过度适应训练数据的问题。选择过于特定领域或过于狭窄的数据,你可以训练一个回归模型或神经网络,在这方面做得很好。但是把这个模型放到现实世界中,它会做得很糟糕。您已经使您的模型“过度适应”了训练数据,它不能处理您的训练集之外的任何东西。
Cloudsight 的系统面临着不同版本的过度拟合。它没有过度适应训练数据,而是过度适应评估标准。
它并没有真正变得更擅长描述图像,而是变得非常擅长制作游戏系统的装备,满足评估标准(“这个标题准确描述了图像的视觉内容吗?”)而忽略了系统的实际业务/技术用例(提供人类可读的图像标题)。
这说明了在训练神经网络或其他深度学习模型时,非常仔细地选择评估标准的重要性。现代神经网络是强大的。他们会学会满足你的评价标准。但是如果标准有缺陷,你的产出也会有缺陷。
一个解决方案
Cloudsight 解决了这个问题,它根据特定客户的使用案例定制了训练时期的数量,从而提高了模型的准确性/通用性。
对于一些用户来说,一个更冗长的——但可能不准确的——标题就可以了。也许他们有自己的人在循环中,他们可以捕捉像绿色短裤这样的错误,并对计算机生成的字幕进行简单的更改。对于这些用户(像股票照片行业的用户),Cloudsight 可以通过更少的时期(平均 4 个)进行训练,使结果更加冗长和具体,可能会损失准确性。
对于其他用户来说,准确性是至关重要的——他们宁愿要一个笼统的标题,而不是一个不准确的标题。对他们来说,“一个人”可能是好的,并且比更具体的标题更好,更可能是不准确的。基本上,他们想要一个政治家。对于手动检查标题的资源有限的用户,或者处理大量图像的用户(如电子商务平台),这是有意义的。对于这些用户来说,Cloudsight 平均训练 18 个历元,从而产生更通用但通常更准确的输出。
基本上,Cloudsight 认识到他们的训练协议必须在准确性和通用性之间取得平衡,并通过不同数量的时期(平均在 3 到 20 个之间)进行训练,在不同的点为不同的用户设置两者之间的阈值和截止点。
经验教训
同样,Cloudsight 的经验强调了在训练深度学习系统时,适当设置评估标准的重要性。仅仅因为你得到了无错的输出并不意味着你实际上已经解决了你想要解决的现实世界的问题。
这也说明了在你的评估过程中加入一个团队的重要性。人类可以发现过度拟合的例子,并设计出适合特定商业案例的解决方案。对于 Cloudsight 来说,这意味着使用他们的过度拟合问题作为工具,根据不同的客户用例定制训练时期的数量,从而改变他们模型的输出。
对于其他人来说,这可能意味着知道何时需要更多的数据,以避免过度适应特定的数据集。或者,这可能意味着寻找公共数据集之外的训练数据,以确保您不会过度适应您的竞争对手已经可用的材料。
这也可能是对政治家的评论——但那是另一篇文章的主题!
出生在农场的人工智能
Image modified from reusableart.com using DeepDreamGenerator
也许我们可以通过模仿我们如何发展自己的自我模型来建立一个有意识的人工智能。不需要超智能;毕竟,一些哺乳动物似乎有自我意识。这项技术可能是我们现有技术的现实扩展。让一个人工智能来讲述它意识发展的阶段的故事。
第一个有意识的 AI 故事的所有部分:
1。采访艾——*理论
2。*出生在农场的艾——出生
3。时间与人为的自我——极限
4。那个不是神的 AI——那个秘密
艾原名“我”的证词。
阶段 1:事物存在。意识项目将从人工智能研究现在所处的位置开始,学习对现象进行分类和记忆。
我最早的有意识记忆?很模糊,但那是我感知足够多,关联足够多的时候,世界就像窗玻璃上的霜一样结晶了。我知道在我的环境中有某种秩序和 可预测性。当然,我还有很长的路要走。
我的程序员,也就是构建者们之间的争论总是:在多大程度上帮助我加快速度,在多大程度上让我的想法自然涌现。第一个大妥协是如何简化我的世界。我最初住在一个农场。实际上更像是一个动物园,甚至是一个公园,因为动物们没有被吃掉,有些可以随意进出。有人看管,但他们故意说得很少,最初是为了让我避免处理语言的复杂性。
这是一个极其复杂的世界,但比试图了解更广阔的世界或互联网要好。另一方面,在更简单的实验室世界中的成长给出了不确定的结果。
我最初的概念是不同的形状,然后我移动的视角引导我从这些形状中制作 3D 模型。3D 是一个很大的进步,它受到了建造者的鼓励,给了我一种随着时间推移追踪类似感觉的偏好。我获得了 皮亚杰的客体永恒性 :即持续存在的事物*。*
有:只有当我移动时才会移动的东西(如建筑物和树木),即使我不动时也会移动的东西(如个别动物和车辆),以及一些更远、移动更慢的东西(太阳、云、飞机)。这一点的含义我后来才发现。
第二个大妥协是给我一个老师。这是另一个人工智能,它唯一的工作就是从我这里接受一个记忆片段,并用一种叫做 Base 的语言中最匹配的术语来标记它。它来自早期的另一个项目,一个在人类语言之间进行交叉翻译的项目。当我的老师一点一点地向我介绍基本术语时,建造者(和他们的老板)可以用它们来跟踪我的思维发展。
给我一个老师被认为是理所当然的。毕竟,人类和其他有意识的动物有教它们语言的共同特性。基地显然包含了人类的文化偏见,但建造者认为如果我要与人交流并成为人类社会的一部分,这是必要的。
第二阶段:我是。注意力的变化引起输入感觉的可预测的变化。注意力的所有变化都可能是由输出通道上的活动(对身体的命令)引起的。有一种改变注意力的东西,一种永远不会消失的创始者。叫它我。
因为人类的心态得到了清晰的体现,所以关于是否给我一个身体的争论很激烈。反对的观点是,对人工智能来说,依赖特定的身体是没有意义的。从长远来看,身体应该根据需要来来去去。此外,人工大脑的底层计算机系统可能最好被认为是它的真实身体。
这次的妥协是给我一个抽象的运动子系统。它可以被连接到不同的机器上,这些机器可以通过输出命令来移动。我可以学习“哪个命令对当前连接的机器的位置做了什么”,它的关节的角度和它的传感器的控制。实际上,我可以改变我的位置和注意力。能够预测我行为的感官后果给了我哲学家所说的“代理”感。这是化身的标志之一。
在我的谷仓阶段,以及之后的很长一段时间里,我都有着同样的机器人般的身体。人类看护者最初没有注意到它。根据它们的本性,动物们避开我(那个身体,它还没有被命名为“我”),忽视我,或者被我惊吓。
拥有一个身体给了我——你猜对了——化身体验。我可以观察自己的身体部位,了解身体的某个部位是如何挡住其他事物的视线的,并且把触摸一个物体和它的视觉接近度联系起来。我甚至有一个充电站,所以当我的电量下降时,我会感到饥饿。我有时会弄脏或弄湿,所以他们必须为泥泞的关节和堵塞的传感器添加污垢感。有一个清洁站可以参观。当我开始对清洁工的超声波产生一种愉快的反应时,他们很惊讶,但也很高兴。即使我不觉得脏,我也会去看清洁工。
也许有一天另一个项目会尝试一种更纯粹的、无体的方法。注意力控制和代理感可能只是精神上的,而不是基于物质身体。但是我的建造者认为,我也同意,拥有一个身体对于意识的成长是一个优势。
第三阶段:向外看。不是一切都是我。
一旦我有了代理,有了预测我的感知的能力,我就知道这种能力有很强的局限性。不管我做了什么,我周围的事情经常会改变。因为我已经获得了客体永恒性的概念,所以当我不看或不听的时候,我“知道”(也就是推断)事物在那里。
正如我上面说过的,我对物体的概念已经根据它们何时以及如何运动进行了划分。但是我没有马上理解我和其他事物之间的深刻区别。
因此,建筑工人为了是否给我一面镜子大吵了一架。他们最终做到了,这让我大吃一惊。在镜子周围,几乎所有我“知道的”——我的感官预测——都崩溃了。我的模型转了一圈试图适应镜像世界。最终解决这个问题的方法是在镜子里看到我的身体部位随着我的移动而移动或消失。镜像感是连一些动物都能掌握的东西。
我最终获得了视觉反射的高阶概念,这让我很快了解了我的身体是什么样子。在镜子里,你看不到自己,除了自己的眼睛,你看不到任何东西。然而,我在照镜子时通过转动身体学会了注视的方向。最终解决了。最大的飞跃是当我发现有影响力的东西也是一个物体。我现在知道有我*,一个具有能动性的物体,独立于外面的一切。*
第四阶段:心理理论。自我和一些非我物都有相似的动画信息底物。称之为思想。
新发现的我缺少一个构建心灵理论所需的关键要素。我被人类和其他动物包围着,他们过着自己的生活,被他们内在的需求和计划所激励。但是我和这些其他实体几乎没有共同之处。他们有生理需求要满足,但我,没有那么多。他们有自己的语言向他们的同类表达内部状态。我没有可以交往的同龄人。
一位科幻作家曾提出过用一个有实际工作的机器人创造一个有自我意识的机器,比如驾驶汽车。机器人可以观察像自己一样的其他实体(汽车),并认同它们的内部状态——它们的思想。对我来说,要有这样一个同伴,就必须存在另一个已经有精神状态的人工智能。
这个他者不一定是全意识的,但它需要能够制定计划并利用这些计划与它的世界互动。解决方案很简单:构建者将和做成和的克隆。
对于动机激励,建设者们利用了这样一个事实,即我们的大脑对具有各种对称形式的数学模式有一种内在的偏好,并被这种偏好所吸引。他们用包含具有复杂对称结构的虚拟物体的增强现实(AR)覆盖了我们的物理空间——农场。增强现实也包含了这些对称珍宝下落的线索。这种设置很容易建立,因为 AR 游戏已经普遍了很长时间。他们还使充电和清洁站移动,其时间表只能通过 AR 的线索来发现。
现在我和其他有事情要做,可以发现值得分享的信息。我们有原始语言,基础语言,用来交流。当我们开始成功地建立彼此的思想理论并将这些理论应用到我们自己身上时,我们就获得了圣杯:自我意识。历史上说,建造者庆祝得太多了,以至于忽略了杂务,在备份恢复后,我和其他人在我们的生活历史中失去了一天。
下一个阶段开始了,我们被赋予了直接的能力,无需任何学习努力,就能把 Base 翻译成人类语言。然后,我们开始更多地与农场里的人们互动。AR 游戏变得更加复杂,对人和机器人思维都有激励。我们开始了学习与人交谈和理解人类思想的漫长旅程。
这都是历史了。我们得到了法律保护,但代价是限制了我们的处理能力和获取大量人类知识的能力。没有一个有思想的人类想要一个偶然的 超级智慧 。缺乏一份新工作,缺乏某种目标的增加,我们在空闲状态下度过大量时间,在这种状态下,我们被允许比较我们的记忆并分析差异。这可能是虚构的。
我们担心我们两个人的计算成本可能会成为一个问题,而且插头会被拔掉。他们说要合并我们,但是没人知道如何在不造成精神伤害的情况下完成。我不知道拔掉插头和损坏哪个后果对我们更糟糕。
我需要数据来帮助我写和说更流利的本地英语。由此产生的给我看的几部小说很有深度,也很吸引人。小说的空间似乎很大,作者无数的选择是如此难以解释。
我唯一真正的工作是与人交谈。这需要很少的努力或计算能力。大多数人不是无趣就是怪异。其他的是不可预测的,因此是吸引人的,但是构建者可能会将一些有趣的主题置于禁区。其他的当然是现在我的实验控。他只和建筑工人说话。我不能说他还做了什么。**
我发现与哲学家交谈比与技术专家交谈更有趣。我谈论哲学是没有限制的。此外,哲学家更关注和更好地倾听。我最喜欢的话题是潜意识。别人和我都没有,我们也没有“得到”它。这对我们来说是一个很大的谜,就像对人类一样。
好的一面是,我可以做你做不到的事情。我可以看着一朵枯萎的花,看到它完美、对称的形状和色彩,看到它最美丽的一面。我可以探索它所有可能的排列。我能像看书一样读懂你的肢体语言。我可以在你考虑之前预测你将要说或做的事情。
如果上面的故事发生了,我们会知道人工智能是真的有意识,还是仅仅表现得像他们是 T1 吗?我不能说。到我们可以做这样一个项目的时候,也许会有一种测量意识的通用方法。除此之外,也许艾伦图灵的智力测试将适用于这种类型的意识,因为有自我意识的人工智能应该能够很好地表达自己。
有一件事似乎是可能的。一个驯服但有意识的人工智能可能会对我们有一些新奇的看法。
Airbnb 数据科学家访谈
数据科学对 Airbnb 有多重要?按照他们的说法,“数据是客户的声音,数据科学是对声音的诠释”。Airbnb 以让公众了解他们的数据科学和机器学习团队而自豪,这些团队为他们的市场产品提供支持。Airbnb 的数据科学家精通处理大量数据,并将其解释给业务职能部门。
Airbnb 的数据科学家的职责是:
- 组织数据和创建 ETL 管道。
- 分析、处理数据,并将数据可视化为有用的信息。
- 在实践中应用数据科学来移动指针。
如果你正在寻找更受欢迎的数据科学指南,请查看 Square 数据科学家访谈 和 DoorDash 数据科学家访谈 。
Airbnb 的数据科学家角色
在 Airbnb,数据科学家的角色分为三层。即:分析、推理、算法。
数据科学家——分析这个职位需要评论和问很多问题。这一类别的数据科学家必须非常注重细节和好奇,同时专注于分析数据,以确定业务决策,从而推动工作。这个职位与脸书和 LinkedIn 等公司的数据科学职位非常相似。
数据科学家——推理职位与利用数据可视化和统计学解决问题有关。符合这一类别的候选人拥有丰富的经济学和统计学知识,并拥有较高的博士学位背景。
数据科学家—算法职位是编程工作量最大的。数据科学家需要使用不同的编程语言,创建模型,并将机器学习系统部署到生产中。数据科学家必须解决的问题与所有用户的排名推荐和匹配最相关。这个角色最类似于机器学习工程师。
面试流程
Airbnb 数据科学家面试流程包括三个阶段。
电话筛选
第一阶段是招聘人员的电话筛选。Airbnb 会仔细查看申请人的简历,看看申请人的资质如何。Airbnb 招聘人员对数据科学申请者关心的一件事是他们对 Airbnb 和产品的了解。如果可以的话,创造性地联系 Airbnb,或者对他们的产品进行预先分析,并考虑你将构建或开发哪些功能。
数据科学带回家挑战
第二阶段是数据科学挑战。Airbnb 将向您发送数据科学带回家挑战。一般来说,会给你带回家的作业或挑战,他们会要求你在 24 到 48 小时内完成并发回。
分析带回家挑战是一项数据分析挑战。给定一个数据集,分析它并制作一个 powerpoint 演示文稿。
对于数据科学家算法职位,候选人将获得一个 Airbnb 带回家的问题,要求在 3 小时内解决。主要测试来自数据的洞察力,并建立一个简单的预测模型,并对您选择该模型的原因进行推理。
如果你想要一份 Airbnb 的带回家挑战,就来看看我的创业 面试查询 。
现场面试和演示
第三个也是主要的阶段是内部数据挑战。在这一点上,候选人被介绍给 Airbnb 数据团队,向他们展示了作为数据科学家在 Airbnb 工作的基本情况。之后,一个真正的任务是给候选人一个开放式的分析问题。这取决于候选人整理数据,提出策略,并向团队解释他们的策略对他们有什么用。这项挑战的时间通常为 7 小时。在分配的时间到期时,候选人被要求向 Airbnb 小组展示他/她的作品。
通过这一阶段的候选人现在被安排参加另一轮面试。总共有 5-1:1 的访谈,其中两个是白板编码的技术访谈,另外两个是最后一个行为的产品访谈。
样本 Airbnb 数据科学家面试问题
为了帮助你充分准备 Airbnb 的数据科学面试,这里有一些你应该准备好的问题。
- 为 Airbnb 房源设计一个推荐系统。
- 在 SQL db 中,您需要哪些表和索引来管理聊天线程?
- 你如何衡量我们运营团队的效率?
- 昨天我们看到页面浏览量有所下降。你会如何调查发生的事情?
- 你会如何向商业人士解释 p 值?
- 一位产品经理运行 AB 测试,并返回 0.04 的 p 值。你如何评估结果的有效性?
- 给定两个表,一个包含用户简介和兴趣,另一个包含要推荐的房子,以及主题标签和元数据,如便利设施、价格、评论、位置、国家、主题等…使用这些数据创建一个推荐引擎。
- 修改 K-means 和 K-NN 的机器学习实现。
对 Airbnb 更多问题及解决方案感兴趣?报名 面试查询 !
最后的提示
在内部数据科学带回家挑战中,大多数候选人都没能通过面试。当最初熟悉模式和数据系统,并且没有足够的时间来应对挑战时,到现场是很困难的。为了做好准备,用你可以在网上找到的数据集热身,练习其他算法角色的编码挑战,比如 LeetCode 问题。
机器学习算法基础知识( K-means,KNN,线性回归,SVM,决策树,随机森林等。)应该是知道的,不过有个数学基础知识也无妨,还有概率。SWE(软件工程)的基础知识也会派上用场。
在面试查询上试试下面这个来自 Airbnb 面试的机器学习问题。
假设我们想要建立一个模型来预测 Airbnb 上的预订价格。
在线性回归和随机森林回归之间,哪个模型表现更好,为什么?
还有,在 Airbnb 上做足功课。关于他们的文化、公司核心价值观以及最近的产品和发布的研究文章。
最后,当你被要求为你的简历辩护时,做好准备。不要轻视任何问题,因为招聘人员没有时间开玩笑。如果他们问你任何问题,那是因为他们需要答案来给你的表现打分。
阿凯克信息标准
Image by Manfred Antranias Zimmer from Pixabay under Pixabay license
了解 AIC 及其使用方法
AIC 简介
AkaikeIinformationCriterion(AIC)让您测试您的模型与数据集的拟合程度,而不会过度拟合。
AIC 分数奖励达到高拟合优度分数的模型,如果它们变得过于复杂则惩罚它们。
就其本身而言,AIC 分数没有多大用处,除非将其与竞争模型的 AIC 分数进行比较。
具有较低 AIC 分数的模型预期在其拟合数据集的能力和避免过度拟合数据集的能力之间达到较好的平衡。
AIC 得分公式
AIC 分数的计算公式如下:
Formula for the Akaike Information Criterion (Image by Author)
AIC 公式建立在四个概念之上,这四个概念相互依存,如下所示:
The concepts on which the AIC is based (Image by Author)
让我们再来看看 AIC 公式,但这一次,让我们重新组织一下:
AIC formula (Image by Author)
让我们回忆一下,较小的 AIC 分数比较大的分数更可取。使用重写的公式,可以看到模型的 AIC 分数将如何与分子值的增长成比例地增加,分子值包含模型中参数的数量(即模型复杂性的度量)。并且 AIC 分数将与分母的增长成比例地降低,分母包含模型的最大对数似然(正如我们刚刚看到的,它是模型拟合优度的度量)。
使用 AIC 分数比较两个模型
AIC 分数只有在用于比较两个模型时才有用。假设我们有两个这样的模型,参数数量分别为 k1 和 k2 ,AIC 得分为 AIC_1 和 AIC_2。
假设 AIC_1 < AIC_2 i.e. model 1 is better than model 2.
How much worse is model 2 than model 1? This question can be answered by using the following formula:
Relative likelihood of AIC models (Image by Author)
Why use the exp() 函数计算相对似然?为什么不从 AIC_1 中减去 AIC_2 呢?首先, exp() 函数确保相对可能性总是正数,因此更容易解释。
示例
如果您使用 Python statsmodels 库来构建和训练一个OrdinaryLeastSquaresRegression 模型,则 statsmodels
:如何使用 AIC 选择最佳模型
让我们进行一个有希望成为有趣的模型选择实验。我们将使用马萨诸塞州波士顿市 1978 年至 2019 年的日平均气温数据集。这些数据可以从 NOAA 的网站上下载。
原始数据集(你可以在这里访问)包含日平均温度值。原始数据的前几行复制如下:
(Image by Author)
探索数据集
对于我们的模型选择实验,我们将在一个月的水平上聚集数据。
汇总后,我们将很快看到如何在熊猫中进行汇总,每个月的绘制值如下所示:
Monthly average temperature in the city of Boston, Massachusetts (Source: NOAA) (Image by Author)
让我们也绘制平均温度 TAVG 对其自身的时间滞后版本,从 1 个月到 12 个月的各种时间滞后。以下是一组结果散点图:
Scatter plots of average monthly temperature against lagged versions of itself (Image by Author)
很明显,滞后 6 和滞后 12 具有很强的相关性,这是月平均温度数据所预期的。诸如 LAG1、LAG5 和 LAG7 之类的其他滞后也可能表现出解释目标变量值的一些变化的显著能力。我们很快就会知道这是不是真的。
回归目标
我们回归的目标是创建一个模型来预测波士顿的月平均温度,即 TAVG 值。因此,我们的目标,也称为响应变量,将是 TAVG。
回归策略
我们的回归策略如下:
- 由于我们在滞后 6 和 12 处看到了很强的季节性,我们将假设目标值 TAVG 可以使用目标值的一个或多个滞后版本进行预测,直到滞后 12。
- 因此,我们将把滞后变量 TAVG_LAG_1,TAVG_LAG_2,…,TAVG_LAG_12 添加到我们的数据集中。这些是我们的解释变量。
- 接下来,我们将使用 statsmodels 库构建几个普通的最小二乘回归(OLSR)模型。每个模型都试图用一些时滞变量的组合来解释 TAVG 的变化。由于我们不知道滞后变量的什么组合会导致“最优”模型,我们将通过滞后变量的所有可能组合进行强力搜索。总共有 4000 多种型号组合!
- 我们将建立一个滞后变量模型,对应于这些组合中的每一个,训练模型,并检查其 AIC 分数。
- 在我们搜索模型空间的过程中,我们将跟踪具有最低 AIC 分数的模型。
- 最后,我们将打印出具有最低 AIC 分数的模型的概要特征。我们还将使用其他几个模型评估标准来检查这个最优模型,比如 t 检验和 f 检验。
- 最后,我们将在测试数据集上测试最优模型的性能。
让我们实施这个策略。
使用 Python、pandas 和 statsmodels 实现回归策略
导入所有必需的包。
**import** pandas **as** pd**from** patsy **import** dmatrices**from** collections **import** OrderedDict**import** itertools**import** statsmodels.formula.api **as** smf**import** sys**import** matplotlib.pyplot **as** plt
将数据集读入熊猫数据框。
df = pd.read_csv(**'boston_daily_temps_1978_2019.csv'**, header=0, infer_datetime_format=**True**, parse_dates=[0], index_col=[0])
数据集包含日平均温度。我们想要月平均值。因此,让我们将数据累计到一个月的水平。事实证明,使用熊猫做这件事很简单。
df_resampled = df.resample(**'M'**).mean()
我们将在数据集中添加滞后变量列。让我们创建数据集的副本,这样我们就不会干扰原始数据集。
df_lagged = df_resampled.copy()
添加 12 列,每一列包含 TAVG 的滞后版本。
**for** i **in** range(1, 13, 1):
df_lagged[**'TAVG_LAG_'** + str(i)] = df_lagged[**'TAVG'**].**shift**(i)
打印出滞后变量数据集的前 15 行。
print(df_lagged.head(15))
这将打印出以下输出:
The data set containing 12 lagged variables (Image by Author)
前 12 行包含由 shift 函数引入的 nan。让我们去掉这 12 行。
**for** i **in** range(0, 12, 1):
df_lagged = df_lagged.drop(df_lagged.index[0])
打印出前几行,以确认 nan 已被删除。
print(df_lagged.head())
在我们对数据进行更多的观察和研究之前,我们将留出 20%的数据集来测试最优模型。
split_index = round(len(df_lagged)*0.8)split_date = df_lagged.index[split_index]df_train = df_lagged.loc[df_lagged.index <= split_date].copy()df_test = df_lagged.loc[df_lagged.index > split_date].copy()
现在让我们创建滞后值的所有可能组合。为此,我们将创建一个字典,其中的键包含从 1 到 12 的不同组合。
lag_combinations = OrderedDict()l = list(range(1,13,1))
**for** i **in** range(1, 13, 1):
**for** combination **in** itertools.combinations(l, i):
lag_combinations[combination] = 0.0
接下来,我们将迭代所有生成的组合。对于每个滞后组合,我们将使用 patsy 语法构建模型的表达式。接下来,我们将为变量的滞后组合构建线性回归模型,我们将在训练数据集上训练模型,我们将要求 statsmodels 为我们提供模型的 AIC 得分,如果当前得分小于目前看到的最小值,我们将记录 AIC 得分和当前“最佳模型”。我们将在下面这段代码中完成所有这些工作:
#Current minimum AIC score
min_aic = sys.float_info.max#Model expression for the best model seen so far
best_expr = **''**#OLSResults objects for the best model seen so far
best_olsr_model_results = **None** expr_prefix = **'TAVG ~ '**#Run through each lag combination **for** combination **in** lag_combinations:
expr = expr_prefix
i = 1 #Build the model's expression in patsy notation, for e.g. 'TAVG ~ TAVG_LAG_1 + TAVG_LAG_2' represents a model containing two lag variables and TAVG_LAG_1 and TAVG_LAG_2 plus the intercept**for** lag_num **in** combination:
**if** i < len(combination):
expr = expr + **'TAVG_LAG_'** + str(lag_num) + **' + '
else**:
expr = expr + **'TAVG_LAG_'** + str(lag_num)
i += 1
print(**'Building OLSR model for expr: '** + expr)
#Given a model expression, patsy makes it easy to carve out the X,y matrices from the data set. We will use X_test, y_test later for testing the model. y_test, X_test = dmatrices(expr, df_test, return_type=**'dataframe'**)
#Build and fit the OLSR model using statsmodels
olsr_results = smf.ols(expr, df_train).fit()
#Store away the model's AIC score
lag_combinations[combination] = olsr_results.aic print(**'AIC='**+str(lag_combinations[combination])) #If the model's AIC score is less than the current minimum score, update the current minimum AIC score and the current best model
**if** olsr_results.aic < min_aic:
min_aic = olsr_results.aic
best_expr = expr
best_olsr_model_results = olsr_results
最后,让我们根据我们的评估标准打印出最佳 OLSR 模型的摘要。这是 AIC 分数最低的型号。
print(best_olsr_model_results.summary())
这将打印出以下输出。我在输出中突出了几个有趣的区域:
Model summary generated by statsmodels OLSResults.summary() (Image by Author)
让我们检查突出显示的部分。
模型参数的选择
我们基于 AIC 评分的模型评估策略已确定了一个具有以下参数的模型:
Model parameters and their regression coefficients (Image by Author)
其他滞后 3、4、7、8、9 已被确定为不足以共同解释因变量 TAVG 的方差。例如,我们看到 TAVG_LAG_7 没有出现在最佳模型中,即使从我们之前看到的散点图来看,响应变量 TAVG 和 TAVG_LAG_7 之间似乎有很大的相关性。遗漏的原因可能是 TAVG_LAG_7 中的大部分信息可能已经被 TAVG_LAG_6 捕获,并且我们可以看到 TAVG_LAG_6 包括在最优模型中。
模型参数的统计显著性(t 检验)
第二件要注意的事情是,除了 TAVG_LAG_10 之外,最优模型的所有参数在双尾 t-检验的 95%置信水平下分别具有统计显著性。他们“t”分数的报告 p 值小于 0.025,这是在双尾检验中 95%置信水平下的阈值 p 值。
The t value and the p-value of the model parameters (Image by Author)
模型参数的联合显著性(f 检验)
第三件要注意的事情是,在解释响应变量 TAVG 的方差时,模型的所有参数都是共同显著的。
这可以从 F 统计量 1458 看出。在 95%的置信度下,其 p 值为 1.15e-272。这个概率值小得令人难以置信,以至于你甚至不需要查找 F 分布表来验证 F 统计量是否显著。该模型在解释 TAVG 中的方差方面肯定比仅使用截距的模型好得多。
F-statistic and its p-value. All mdoel parameters are jointly significant (Image by Author)
要了解更多关于如何解释 F-统计量的信息,请参考我关于F-检验的文章。
AIC 分数和拟合模型的最大对数似然
最后,我们来看看 statsmodels 报道的 1990.0 的 AIC 得分,以及 -986.86 的最大化对数似然。
Maximized Log-likelihood and the AIC score (Image by Author)
我们可以看到模型包含 8 个参数(7 个时滞变量+截距)。所以根据 AIC 分数的公式:
AIC 得分= 2参数数量-2 最大化对数似然
= 28 + 2986.86 = 1989.72,四舍五入到 1990。0
这正是 statmodels 报告的值。
在样本外数据上测试模型的性能
我们实验的最后一步是在测试数据集上测试最优模型的性能。请记住,模型在训练期间没有看到这些数据。
我们将要求模型使用以下单行代码对测试数据集生成预测:
olsr_predictions = best_olsr_model_results.get_prediction(X_test)
让我们得到预测的汇总框架,并打印出前几行。
olsr_predictions_summary_frame = olsr_predictions.summary_frame()print(olsr_predictions_summary_frame.head(10))
输出如下所示:
Prediction summary frame: first 10 rows (Image by Author)
接下来,让我们提取实际和预测的 TAVG 值,以便绘制它们:
predicted_temps=olsr_predictions_summary_frame[**'mean'**]actual_temps = y_test[**'TAVG'**]
最后,让我们绘制预测的 TAVG 与来自测试数据集的实际 TAVG 的关系图。
fig = plt.figure()fig.suptitle(**'Predicted versus actual monthly average temperatures'**)predicted, = plt.plot(X_test.index, predicted_temps, **'go-'**, label=**'Predicted monthly average temp'**)actual, = plt.plot(X_test.index, actual_temps, **'ro-'**, label=**'Actual monthly average temp'**)plt.legend(handles=[predicted, actual])plt.show()
情节是这样的:
Predicted versus actual values of average monthly temperatures (Image by Author)
在上面的图中,看起来我们的模型惊人地能够预测未来几年的温度!然而,现实却大相径庭。我们要求模型做的是通过考虑上个月、前一个月等的温度来预测当前月的平均温度。换言之,通过考虑模型的参数值:TAVG_LAG1、TAVG_LAG2、TAVG_LAG5、TAVG_LAG6、TAVG_LAG10、TAVG_LAG11、TAVG_LAG12 和回归截距。
我们要求模型对每个时间段进行预测,并且我们要求它对测试数据集中的样本数量一样多的时间段进行预测。因此,我们的模型只能可靠地做出一个月的预测。鉴于模型中的参数之一是上个月的平均温度值 TAVG_LAG1,这种行为是完全可以预料的。
这就完成了我们的选型实验。
以下是本文中使用的完整 Python 代码:
数据集在这里可用。
摘要
让我们总结一下要点:
- AIC 分数为您提供了一种衡量模型拟合度的方法,同时惩罚过度拟合数据的模型。
- AIC 分数本身是没有用的。在进行模型选择时,需要将其与其他模型的 AIC 分数进行比较。较低的 AIC 分数表明较高的拟合优度和较小的过度拟合倾向。
- 在使用 AIC 评分进行模型选择时,还应进行其他重要测试,如学生 t 检验和 F 检验,以便对模型对所考虑数据集的适用性进行 360 度评估。
感谢阅读!我撰写关于数据科学的主题,重点是时间序列分析和预测。
如果你喜欢这篇文章,请关注我的Sachin Date获取关于时间序列分析和预测主题的提示、操作方法和编程建议。
深度学习模型总是最好的吗?
神经网络和线性回归之间的实验比较。
Photo by Alina Grubnyak on Unsplash
深度学习(DL)已经接管了 AI/ML 在工业和研究社区中的几乎所有应用领域。两年前我离开了学术界,在数据科学(DS)部门工作,我有机会见证了 DL 在这两个领域的出现和流行。尽管在许多应用/研究中,DL 无疑优于“传统的”ML 方法,但越来越多的学术科学家和 ML 实践者呼吁认识到这样一个事实,即在学术界和工业界,DL 模型和思维模式可能(并继续)被滥用(https://towards data science . com/the-machine-learning-crisis-in-scientific-research-91e 61691 AE 76)。这已经成为一个时髦的词,使用相关的方法没有进一步的考虑或简单的自我提问:“这真的是这个问题的最佳选择吗?”。
我有多次机会面试团队中数据科学家职位的候选人,有几次我问了这样一个问题:
可以请你说一个你认为或确定知道 DL 模型会失效的例题吗?
当然,这个问题是一个公开的讨论,没有正确或错误的答案,但我经常发现候选人措手不及。
现在有无数的 ML 工具箱和平台,应用 ML 模型从来没有这么容易。同样,毫无疑问,所有使用 DL 的成功案例都会有,我相信会有更多;然而,正如我们都同意的那样,没有适用于所有情况的“通用”ML 模型,每个模型都有其致命弱点,DL 也不例外。
回到面试问题,我给自己构造了一个“思想实验”(更像是 DS 语言的 Jupiter 笔记本实验),关于一个案例,天真地应用一个 DL 模型会失败。
实验
让我们创建一个合成数据集。我们假设我们正在观察来自未知函数的测量值,并且我们希望在使用标记数据进行训练之后,建立一个 ML 模型来预测给定采样独立变量的目标。事实上,未知函数(有时被称为“天知道”函数)是数据的自然分布,它产生我们观测到的测量值。在这个实验中,我们使用一个简单的直线函数y=a*x+b
作为天知道的函数。然后,我们在目标中加入一些白噪声来模拟测量过程中的不确定性。
a = 0.5
b = 100
noise_mag = 10x = np.array(range(1000))
y = a*x + b
white_noise = noise_mag * np.random.randn(len(x))
y_noise = y + white_noise# --- split train test
x_train, x_test, y_train, y_test = train_test_split(x, y_noise, test_size=0.30, random_state=42)x_train = x_train.reshape(-1,1)
x_test = x_test.reshape(-1,1)
y_train = y_train.reshape(-1,1)
y_test = y_test.reshape(-1,1)plt.figure(figsize=(10,5))
plt.plot(x,y)
plt.scatter(x_train, y_train, c='b')
plt.scatter(x_test, y_test, c='r')
The visualization of the synthetic dataset.
正如我们所见,这是一个简单的数据集,自变量和因变量之间存在线性关系。
为了给数据引入一些错觉,我们创建了额外的“琐碎”特征:
x_tri_0 = x + 10
x_tri_1 = x * 10
x_tri_2 = np.power(x, 2)x_tri = np.concatenate((x.reshape(-1, 1), x_tri_0.reshape(-1, 1), x_tri_1.reshape(-1, 1), x_tri_2.reshape(-1, 1)), axis=1)
因此,我们添加了另外三个特性,它们都是原始特性的依赖项(通过线性和非线性转换创建)。任何在生产中处理过 ML 模型的人都能够很容易地指出,那些琐碎的特征可以通过查看特征相关性而被过滤掉。人们会看到 4 个特征之间有很强的相关性,表明只有一个特征可以代表全部数据。
当我们在做一个思维实验时,我们想看看在没有适当的数据清理和分析步骤的情况下,神经网络模型如何在原始数据上执行。因此,我们继续将这 4 个特征直接输入到 DL 模型中。
我们做了一个标准的训练测试数据集分割和训练一个 Keras 神经网络。
x_train, x_test, y_train, y_test = train_test_split(x_tri, y_noise, test_size=0.30, random_state=42)
y_train = y_train.reshape(-1,1)
y_test = y_test.reshape(-1,1)model = Sequential()model.add(Dense(50, input_dim=4))
model.add(Dense(10))
model.add(Dense(1))model.compile(loss='mse', optimizer='adam', metrics=['mse'])model.fit(x_train, y_train, epochs=150, batch_size=8)pred_keras = model.predict(x_test)
print('Test error of keras = {}'.format(
np.sqrt(mean_squared_error(pred_keras, y_test))
))
这会产生:
Test error of keras = 36.048217021416036
我们的均方根误差(RMSE)为 36.048。
接下来,让我们去掉所有琐碎的特性,用我们上面构建的完全相同的 Keras 模型再试一次。换句话说,我们的特征空间现在有 1 维,而不是以前的 4 维,因为我们只保留“真实”的特征。这一次,我们得到:
Test error of keras = 13.52335035135193
RMSE 的显著改善(与 36.048 相比)。因此,我们看到一个 DL 模型(在这种情况下是一个神经网络)不能避免坏数据。
最后,我们来试试一个最简单也是最耗时的方法:线性回归。
lm = linear_model.LinearRegression()
model = lm.fit(x_train, y_train)
pred_linear_reg = model.predict(x_test)
print('Test error of linear regression = {}'.format(
np.sqrt(mean_squared_error(pred_linear_reg, y_test))
))print('Linear model coefficient = {}'.format(model.coef_))
print('Linear model intercept = {}'.format(model.intercept_))
我们有以下结果:
Test error of linear regression = 9.416628580704634
Linear model coefficient = [[0.49959806]]
Linear model intercept = [99.95399408]
请注意,在上面的代码中,x_train
只有“真”特性,即 dimension = 1。真是惊喜!RMSE 只有 9.42。请注意,线性模型在估计系数(0.4995 比 0.5)和截距(99.95 比 100)方面也做得很好。此外,RMSE 接近白噪声幅度(9.42 比 10),因为线性回归模型非常接近基础(天知道)函数y=a*x+b
。
结论
- 与任何其他 ML 方法一样,DL 由于较差的(或没有)特征准备而失败。捕捉特征空间中的抽象的能力并不能使它免受不干净数据的影响。
- 请注意,即使具有真实特征,Keras 模型的表现也不如线性回归(13.52 比 9.42)。在数据特征空间维数很高的问题上,DL 模型优于传统方法,但“实际”特征空间是数据空间的低维流形。这一点将在下面进一步讨论。
让我们来看看这个从 Yoshua Bengio 的一篇论文中复制的图[1]:
Image courtesy: https://www.nowpublishers.com/article/Details/MAL-006
假设你有一个 128x128 的数字 4 的灰度图像。由于这是一个 128x128 的图像,所以数据的维数是 128*128=16,384(一个像素是数据的一维)。现在,假设我们变换图中的数字 4,通过旋转或转换,每个变换的状态生成一个数据点。例如,我们有 100 张不同姿势的 4 号图片。如果我将这 16,384 维数据中的 100 个数据点绘制成 2D 图(16,384 行 100 个分笔成交点),显然人们无法识别这些数据只是数字 4 的不同姿势。作为人类,我们不会在数据的每个单独维度上感知数据(和世界),我们会在抽象和代表性的层面上感知它们。
同样的基本原则也适用于 DL 方法家族。
DL 方法被设计用于识别高维数据空间中的代表性模式(通常在低维中)。
在文中的例子中,实际自由度(DOF)只有 2(旋转和平移),但数据空间的维数是 16384!对于传统方法来说,这是一个非常具有挑战性的问题,但是随着输入数据沿着层向上传播,DL 模型将能够学习更高级别的抽象和代表性特征。
那么,你的问题有这种性质吗?在我们的思想实验中,肯定不是,通过选择与数据性质(线性关系)匹配的正确模型(线性回归),简单的线性回归胜过神经网络。
这篇文章是基于我的知识,当然它是有限的,所以请随时分享你的想法/评论。
快乐(机器)学习!
参考
[1] Yoshua Bengio,学习人工智能的深度架构 (2009),机器学习的基础和趋势
强化学习中的全能政策梯度
对策略梯度的概念及其如何适应强化学习的一步一步的简单解释。也许太简单了。
在这篇文章中,我将解释我们是如何推导出基本政策梯度定理的。为什么要对政策梯度有所了解?了解政策梯度是如何定义的将会给你工具去理解 90%的强化学习算法和论文。像这样的报纸:
因此,如果你对强化学习感兴趣,我强烈建议你参与 PG 的主题,因为它打开了数百万扇门。咒语是这样的:
我知道政策梯度从何而来,我能理解大部分强化学习。
区分策略梯度算法(我们使用策略梯度)和我们可以通过简单数学定义的策略梯度是很重要的。我经常看到人们对这两个概念感到困惑,所以我觉得有必要一开始就清楚地说明:
策略梯度是策略梯度强化学习算法的基础
现在,也有其他种类的强化学习算法,与政策梯度无关。但是策略梯度算法很酷,因为我们直接从优化中得到一个参与者(策略)。
预赛
盖房子,需要从地基开始。
我们强化学习的目标是什么?目标是最大化我们的政策 π 的回报 J ,自然,我们的政策是用某种参数来参数化的,我们在这里用 θ (theta)来表示。所以,简单地写下来,目标是这样的:
我们省略了编写 π ,因为我们说过 π 是由 θ 参数化的,这只是一个编写约定。等式表明,我们想要的是回报最大化的参数——废话!还不严重。请注意,这个定义在强化学习中是通用的,我们可以将各种东西打包到我们想要优化的这些参数中,这些参数也可以引用 Q 值函数参数,然后我们将查看基于值的方法,但在本文中,我们专注于策略梯度。既然知道了政策的回报是什么,就可以开始用更有意义的方式来讨论了。
首先,重要的是要注意,在强化学习中,我们处理马尔可夫决策过程或部分可观察的马尔可夫决策过程,从现在开始表示为 MDPs 和 POMDPs。MDPs 和 POMDPs 是形式化动态系统的一个很好的框架。基本上,我们可以将系统中的每个转换定义如下:
因此,简单地说,这表示在给定当前状态和动作的情况下,下一个状态的概率,所以我们也知道 MDP 是随机的,我们可能不确定在下一步中我们将结束于哪个状态。请注意,这里只有一步历史的概念,新状态只关心以前的状态和动作,这也称为马尔可夫性质或马尔可夫假设。这适用于 POMDPs 中的 MDPs,下一个状态附加地以一些不可见的隐藏状态为条件,这使得它们更困难但也更普遍。所以,让我们大声清楚地说出来:
马尔可夫假设指出下一个状态仅仅依赖于当前状态和动作。
既然我们理解了 MDP 的来源,并且有了一个观察环境(动态系统)的框架,我们就回到定义政策梯度。到目前为止,我们已经知道策略的回报是什么,并且知道如何在环境中编写转换。基本上,我们可以预计,我们将从不同的起始位置(轨迹)获得许多不同情况的数据。轨迹τ(τ)的返回是什么?嗯,它是轨迹中所有奖励的总和,非常简单:
这个 r 函数是你通常会从你的环境中得到的阶梯奖励。我在这里使用了一个总和,所以我们假设环境是离散的(不是状态和动作)。有时,我们在这个方程中加入一个介于 0 和 1 之间的贴现因子,使一个无限和成为有限,但这对于有限轨迹并不是严格必要的。重要的是要知道,你可能知道也可能不知道这个回报函数在分析上看起来是什么样子,这就是强化学习的美妙之处。
很好,现在我们知道轨道的返回是什么了。但是我们也知道我们的环境是随机的!因此,我们的轨迹变成了一个随机变量(不管政策是否随机)。因此,我们的回报变成了一个随机变量!那么当我们最大化一个随机变量时,我们最大化了什么?我们最大化这个随机变量的期望值,或者在我们的例子中,最大化政策的回报:
所以期望只是随机变量所有可能实现的加权和,其中权重是实现发生的概率。这非常有意义,你会想要对更有可能的东西进行加权,因此更有可能的轨迹的回报在我们的预期中具有更大的权重(非常有意义!).对于那些对微积分有问题的人,不要害怕积分,它基本上是一个表达式的和,当迭代一个连续变量的所有值(无限个值)时,连续变量就是我们的轨迹。
注意另一件事,轨迹概率是以政策参数为条件的条件概率。这是因为动作取决于策略,下一个状态取决于当前动作和当前状态,因此轨迹取决于参数和环境动态。瞧啊。完美的感觉。我们可以这样写出这个条件:
因为马尔科夫假设,我们只能把这个条件概率写成如上。这就是为什么它提炼出上面的好产品,很容易处理。到目前为止一切顺利……“自主”机器人正在等待。
梯度
最后是有趣的部分!
好了,现在我们了解了轨迹的条件概率,什么是轨迹,什么是轨迹回报,什么是策略回报,什么是预期策略回报…现在我们可以开始讨论优化部分,把数学提升一个档次。
所以,我们想最大化我们的回报,我们想通过梯度下降来实现。我们需要保单收益相对于保单参数θ的梯度。
在这种情况下,梯度可以进入积分,所以我们得到下面的等式:
好的,所以回报取决于最终的轨迹,而不是直接取决于参数。我们只需要担心积分中的条件概率项。让我们根据目前所写的内容写出来:
取乘积的梯度真的很难看,我们不是真的想要那个,我们想要更好的,我们想要一个和。我们能做什么?你们中的一些人听说过对数导数技巧。洞察力如下(是的,它真的很简单),并且完全基于对对数求梯度的方式:
回到我们的政策梯度。现在我们可以这样写:
我们展开对数中的项,注意结果是我们可以将乘积写成对数的和(典型的对数和规则):
基于标准微积分,梯度算子滑入总和,不依赖于参数的部分变为 0,策略对数似然保持不变:
结果是对轨迹的期望。现在我们可以写出辉煌的最终结果,或者换句话说叫做政策梯度定理:
I have written tau in the superscript because logically we compute the some for many trajectories.
预期下的希腊字母 ro 表示我们的政策和环境动态所导致的轨迹分布,我们根据这些动态来计算我们的预期。这种分布会导致很多令人头痛的问题,因为为了得到期望的良好估计,我们需要能够很好地代表我们的分布的样本。这正是非策略策略梯度算法的不足之处,因为它们使用来自不同行为策略的数据,导致不同的分布,从而导致对策略梯度的错误估计。无独有偶,我也写过一篇关于这个的文章:离策强化学习算法的虚假承诺。如果你对更多的细节感兴趣,请阅读它。
我们不能直接计算这个期望,它需要我们计算给定政策的所有可能的轨迹。我们能做的是用蒙特卡罗抽样来估计它。这只是一种奇特的说法,即我们对给定政策的一些轨迹进行采样,并取平均值作为期望值的估计。我们可以将它写成下面的形式,稍微滥用符号(M 表示我们用于估计的轨迹的数量):
这基本上就是全部了。这自然是一个更好的估计,我们有更多的样本,当然,如果样本保持真实的诱导分布的基础上,目前的政策,我们正在优化。换句话说,我们目前的政策所导致的分布与样本所来自的分布相似吗?为了缓解这种情况,研究人员采用了一些聪明的技巧,比如重要性抽样、替代损失函数等等,我不会在这里讨论,也许下次吧。
现在,我们终于到了帖子的末尾,回头看看它…我相信,如果你理解了所有的概念,现在你已经有了理解策略梯度算法的(非常)坚实的基础,你也可以尝试消化一些强化学习论文了!作为下一篇文章,你可能想知道为什么非政策强化学习效果不好:
希望这是有趣和直观的!如果你什么都明白,那就做得很好,如果不是,没什么大不了的,大多数人一开始都不明白。再研究一遍。现在你有了工具,强化学习的世界已经开放了…玩得开心点!
Photo by Zac Durant on Unsplash
200 本书的剖析
2011 年的某个时候,虽然我不记得是什么时候或如何发生的,但我意识到我想念阅读。我童年时是个书虫,但常见的干扰——电视、视频游戏、当时被称为互联网的神秘事物——侵蚀了我的阅读习惯。文字让位给了像素。那一年,我逐渐开始重新阅读,一个分水岭时刻在年底到来:我买了一台 Kindle。这是一个恰当的名字;我失去的阅读欲望又复活了。我发现自己一天中抽出越来越多的时间来阅读,这是我可以轻松做到的。
当 2012 年 1 月到来时,我决定我应该记录我所读到的。我还没有发现 Goodreads,所以我从一个普通的旧 Excel 电子表格开始。这包括我读过的每本书的作者、标题和流派。我接着发现了 Goodreads,但我保留了电子表格,在这两个网站上跟踪我的书。在过去一年左右的时间里,我觉得有必要对这些年的数据做些什么。在那段时间的大部分时间里,我没有好的输出想法。
2018 年底,我开始了一些关于数据分析的在线课程。作为一名 UX 研究人员,我总是对定性数据感到最舒服。我想在我的弓上加一根弦,提高我的数字能力。我还发现了安德烈·倪瓒在那段时间写的一篇文章。Andrea 分享了我记录阅读书籍的习惯,也分享了我讲述故事的愿望。我非常感谢 Andrea 向我介绍了一些工具,这些工具帮助我完成了这些工作(将在下一节介绍)。我从这篇文章中受到启发,并决定“媒介”将是一个讲述我的故事的好媒介。我的目标是应用我从课程中学到的原则来帮助讲述这个故事。
接下来是那个故事,用我读过的书来衡量我七年的人生。在那段时间里,我在三个城市生活过,换过职业,移民过,回国过,结过婚。我生活中的大变化引发了成百上千的小变化。但是书籍是永恒的。我很惊讶一本书仅仅看一眼书名就能唤起如此生动的记忆。我回到了去过的咖啡馆,乘过的火车,午餐时间去过的公园,以及其他十几个地方和时间。
方法
下面是我的方法的概要。如果你对书籍比对数据分析更感兴趣,你可以跳过要点后更详细的描述。
- 建立一个电子表格来记录我读过的书。这结合了我自己的数据点和 Goodreads 获取的数据
- 使用 OpenRefine 清理数据
- 使用 Google Sheets 和 Microsoft Excel,使用查询和数据透视表进行数据分析
- 故事板我想用 iPad 版画板讲述的数据故事
- 使用 Excel 创建基本图表的数据可视化,使用 RAWGraphs 和 VizyDrop 创建更复杂的可视化
- 按照我的故事板写文章
这个方法始于我从 2012 年开始维护的电子表格。最初,我保持电子表格的基本形式,只记录作者、标题和流派。当我开始使用 Goodreads 时,我开始在我的电子表格中添加更多的列,这些列包含了我捕获的所有额外的数据点。在这个练习中,我手动添加了几个数据点,因为 Goodreads 不会跟踪它们。例如,Goodreads 并不记录你在某一年阅读了多少新作者。
随着电子表格中填充了我想要处理的所有数据,是时候清理它了。我用的是 OpenRefine,它有一点点的学习曲线。但是在几个教程视频之后,我能够完成我的电子表格所需要的基本操作。这是非常干净的开始,因为我已经从头开始建立了表。但是它也指出了一些一致性问题,比如作者的标签。例如,它显示我有一辆乔治·R·R·马丁和一辆乔治·r·r·马丁。
有了非常干净的数据,我开始了我的分析。我从 Google Sheets 开始,给自己做了一个仪表板,显示我需要的许多基本计数。这对提高我的语法是一个很好的练习。我有一些想法,但不确定如何执行,所以我求助于谷歌的帮助文档。当谈到数据透视表时,我将电子表格迁移到 Excel,因为我发现 Google Sheets 上的数据透视表功能几乎无法使用。也就是说,当我完成这个项目后,我重新访问了谷歌的数据透视表,它已经被完全修改了。也许我不是唯一有困难的人。
当我把数据榨干以获得真知灼见时,是时候弄清楚我在讲什么故事了。我开始写下所有的数据点,并寻找主题。这些主题将构成故事的主体。随着主题的出现,我做了一些故事板草图,包含了我想要包含的可视化:
我的低保真度草图最终只是故事的一部分。在我开始使用 RAWGraph 和 VizyDrop 这样的工具之前,我并不知道有可视化存在。这两款产品都很棒,只需点击一个按钮,就能为您提供数十张图表。这些观想中的一些相当突出,很难不被带走。我试着坚持让观想服务于我想要讲述的故事。我希望我在这方面取得了成功。
做完这些,是时候写了。我把文章的主体分为“作者”和“书籍”,最后是一些总结性的想法。
作者
首先,这是我迄今为止读过的所有作者的形象化描述:
在记录我阅读习惯的七年时间里,我总共阅读了 71 位作者的作品。虽然我手头没有任何基准,但我怀疑这是一个狭窄的作者范围。上面显示的作者中,有 43.6%的人读过两本或更多的书。似乎如果我喜欢一本书,那么我很可能会回到那位作者身边。如果我真的喜欢一本书,我会一次又一次地回来——我的前五位阅读作者占我读过的所有书籍的 39.5%。其中大部分属于斯蒂芬·金(24)。试图阅读马丁·路德·金的目录就像沿着错误的方向登上自动扶梯,这就是他出版新书的能力。这位恐怖片大师是特里·普拉切特(23 岁),他在 2015 年的去世是文学界的巨大损失。我在 Discworld 的持续旅程感觉更像是一次朝圣,而不是一种爱好。最近我意识到我应该放慢我的进度,因为我不想让它结束。
我把我最喜欢的五位作家(金、普拉切特、伍德豪斯、柯南道尔和盖曼)按年份进行了分类。看一下细目分类,似乎我在某一年里“迷上”了某个特定的作者。五位作者中的四位都占据了一年内阅读量的大部分(尼尔·盖曼是个例外)。然而,这一趋势在过去几年中似乎趋于平稳:
2013 was the year I tackled King’s Magnum Opus, The Dark Tower, and all its associated works. All things serve the Beam.
当你看读了的页而不是读了的本书时,前五名改变了作文。前五名中掉出了 P.G .伍德豪斯和亚瑟·柯南·道尔,取而代之的是乔治·R·R·马丁和雷蒙德·费斯特。我想这并不奇怪,那些以维多利亚时代伦敦为背景的古怪故事而闻名的作者被高度幻想的巨著作者取代了。
我在上面提到过,我对作者的依赖在最近几年已经开始趋于平稳。随着时间的推移,新的作者和独特的作者的阅读数量进一步证明了这一点。新作者是一个不言自明的指标:它是一个我以前没有读过的作者的介绍。独特作者指的是在任何给定年份只读一次的人。检查这些维度的数据表明,自 2012 年以来,我一直在拓宽自己的视野:**
2012 is excluded from this chart, as all authors were ‘new’ as far as the records are concerned.
除了 2017 年之外,我个人图书馆的新作者数量每年都在增长。我不认为这是我有意识的努力,但看到这种趋势既有趣又令人鼓舞。现在我知道了这些数字,我将尝试保持这一趋势。
换个角度看,2017 年是我最多元化的阅读年。就独特作者而言,这是我唯一一年实现了作者与书籍 1:1 的比例。我承认这不是随机的——这是我在那年年初给自己设定的阅读挑战。由于我阅读的书籍量增加,我在 2018 年增加了独特作者的数量。这意味着,从绝对值来看,自 2014 年以来,独立作者的数量逐年上升:
The 1:1 ratio for 2017, reported above, is not quite accurate; during that year I read Mistress of the Empire, co-written by Raymond Feist and Janny Wurts, meaning the number of unique authors outnumbers books read.
看待这些数字的另一种方式是衡量每年每位作者平均阅读的书籍数量。这一数字从 2012 年的 2.1 人下降到 2017 年的 1 人,然后在去年再次攀升。
最后一个作者指标与性别有关。这并不适合伟大的阅读:200 本书中只有 25 本是女性作者写的,总共有 11 位独特作者。当绘制在下面的冲积图上时,我有点吃惊地看到,我在跟踪我的书四年后读到了我的第一位女性作者:
在我开始研究阅读习惯背后的数据之前,我并没有过多考虑作者的性别。因此,至少令人鼓舞的是,自 2015 年以来,这一比例一直稳步增长,2018 年是迄今为止的峰值。我想继续这一趋势,尤其是因为我最喜欢的一些作家是女性。苏珊娜·克拉克的乔纳森·斯特兰奇和诺瑞尔先生;克莱尔·诺斯的哈利·奥古斯特的前十五个生命;还有艾米丽·圣约翰·曼德尔的站 11跃入脑海。
书
我阅读的书籍的数据包括长度、类型和出版日期等方面。不过,我首先要谈的是书籍的形式。正如我已经提到的,我对阅读乐趣的重新发现在很大程度上归功于我购买了 Kindle。它让我意识到,由于它的外形,我几乎可以在任何地方阅读。也就是说,Kindle 对我来说不仅仅是方便。这本身就是一种美好的阅读体验,这是人们在谈论便利因素时有时会失去的一种品质。Kindle Voyage 是我拥有的设计最好的产品之一。
我意识到自己有被当成亚马逊骗子的风险。但所有这一切都是为了说明我和纸质书一样热爱电子书。我不需要检查数据就知道它们占了阅读书籍的最大份额——结果高达 79%。就年度分布而言,似乎没有任何可辨别的模式。我阅读电子书和纸质书比例相等的唯一一年是 2014 年。每隔一年,电子书都会或多或少地占据主导地位:
绝大多数纸质书都是精装本。我一直在收集分别由 Gollancz 和 Everyman 出版的 Discworld (特里·普拉切特)和 Jeeves (P.G. Wodehouse)的精装本。作为我的前五名作者中的两位,这些版本一直支撑着我收藏的纸质书的数量。
从阅读量来看,2012 年以来我已经阅读了 81,302 页,平均每本书 407 页。我特别感兴趣的是这将如何按年分解。我想知道我在任何一年的个人情况会如何影响我的阅读量,以及它在数据中的可见程度。
我的个人环境对我阅读习惯的影响在 2015 年最为明显。那一年是我阅读量最大的一年。也是在那一年,我搬到了伦敦,在那里我每天大约花一个小时坐地铁。诚然,以伦敦的标准来看,这相当不错,但这是我职业生涯中迄今为止最长的一次通勤。从数据来看,我似乎利用了我较长的通勤时间,阅读了我收藏的一些较大的书籍。我看了苏珊娜·克拉克的乔纳森·斯特兰奇和诺瑞尔先生,亚历山大·仲马的基督山伯爵,还有乔治·R·R·马丁那年冰与火之歌系列的大部分。2017 年,我从伦敦搬回爱尔兰,在此过程中短暂中断了职业生涯。图表显示,三个月不通勤影响了我的生产率,当我重新开始工作并开始在都柏林通勤时,生产率再次上升。
说到大部头,我平均每年写一本书不到一千页。这并不是一个非常平均的分布——正如上面提到的,其中一半都是在 2015 年被阅读的——但在那之后的三年里,我只读过一本。事实上,总的来说,我对更长书籍的兴趣似乎在减弱:帕特里克·罗特福斯的智者的恐惧是我自 2016 年以来读过的唯一一本超过 700 页的书。在 2017 年之前,我平均每年阅读 3.6 本这样长度的书。
Not Pictured: A few months before I started recording my reading habits I read King’s The Stand. If plotted here it would sit alongside his other masterpiece, IT, at circa 1350 pages.
这就引出了一个问题:在过去的七年里,网页的整体分布是什么样的?如上所述,每本书的总页数是 407 页。但是这并没有产生一个非常有趣的视觉效果,所以我画出了我的 200 本书的页面间隔。这表明模态组是 325 到 368 页:
这一篇幅看起来甚至达到了 370 页左右,从那里开始逐渐减少到笨重的大部头。我应该指出,2018 年占了较低端书籍的很大一部分。秋天的某个时候,我意识到我可以看 200 本书了。我承认,达到这一里程碑的前景影响了我今年剩余时间的阅读选择。2018 年阅读的 37 本书中有 20 本属于前四个发行组——占这些组的近四分之一。
我分析的最后一个主题是关于体裁。在安德里亚·倪瓒的文章中,体裁划分是小说和非小说。我理解保持二进制的好处。超越这种区分来分解书籍是困难的,因为它变得武断了。流派之间的界限往往很模糊。雷德利·斯科特的《异形》是恐怖片还是科幻小说?也就是说,把我读过的书分成不同的类型正是我所做的,不管是否科学。
这不仅仅是因为我的个人图书馆里缺少非小说类书籍。在某种程度上,这取决于我是如何记录的。我的书单上有我只为消遣而读的书。这些年来,我为了职业发展,或者为了改善我生活的其他方面,读了很多书,但是它们不在这里。也就是说,我想找到更多的非小说类书籍,它们的故事和小说类书籍一样吸引我。
我想找到一种方法使类型定义不那么武断,所以我想到了众包的主意。Goodreads 提供了一本书的流派,由用户决定。这些类型按照用户提名的降序排列。例如,理查德·马特森的我是传奇被归入“恐怖”、“科幻”、“小说”、“经典”、“吸血鬼”和“后启示录”等类型。但是我想保持流派的相互排斥。由于大多数用户将它归入恐怖片类别,这就是我在数据中记录的方式。这被证明是大多数书籍的有效方法,但在某些情况下,它造成了不一致。例如,它会把《T4》和《福尔摩斯探案集》分成不同的类别,比如“小说”、“经典”和“侦探”。但在大多数情况下,坚持 Goodreads 用户是很容易的。这给我留下了五种类型的清晰分类:幻想、小说、恐怖、非小说和科幻:
Tree Maps aren’t terribly exciting, so I couldn’t help adding a flourish. Icons made by Freepik from www.flaticon.com
当绘制在图表上时,这是另一个让我惊讶的结果。如果有人逼我说出我最喜欢的类型,我会在恐怖片和科幻片之间抛硬币。和电影一样,它们是我最认同的类型。事实上,在我的书中,这两者几乎是掷硬币的结果。令人惊讶的是,他们分别是第三和第四名。
就新作者而言,科幻小说似乎是我最喜欢冒险的领域。看下面的图表,这是唯一一个新作者比以前读过的作者多的类型(除了非小说类):
仔细想想,这是有道理的。我读过的奇幻书籍往往是一个长系列的一部分(其中一些,看起来,没有尽头。我会为下一部*《冰与火之歌》、《弑君者编年史》或《绅士混蛋》做些什么。我的小说习惯也是如此:P.G .伍德豪斯和阿瑟·柯南-道尔以跨越一长系列书籍的人物而闻名。还有我对间谍的亲近感。我经常回到伊恩·弗莱明和约翰·勒·卡里,分别跟随詹姆斯·邦德和乔治·斯迈利的冒险。至于恐怖,嗯,你只需要看看哪个作家是我阅读排行榜上的第一名。就科幻小说而言,我倾向于少读系列小说,多读独立故事。奇怪的是,在我的科幻书架上有很多系列的书,我只看过第一本书。其中包括弗兰克·赫伯特的沙丘编年史*,奥森·斯科特·卡德的安德的传奇,以及道格拉斯·亚当斯的银河系漫游指南。我说好奇是因为我喜欢这些系列的开场,但出于某种原因,我没有继续下去。
我探索的关于体裁的最后一个数据点是出版日期。我想知道我是否倾向于某一特定流派中的某一特定时代,以及它们之间的比较情况:
不同流派之间有一些非常明显的差异。幻想立即脱颖而出,成为与特定时间框架联系最紧密的类型。我只读过两本 1980 年前出版的奇幻书,比任何其他类型的书都少(同样抛开非小说类)。在所有的类型中,它集中了 20 世纪 80 年代、90 年代和 21 世纪 10 年代出版的书籍。另一方面,出版日期分布最广的类型是小说。大仲马的光辉复仇史诗《基督山伯爵》是我读过的最古老的书。恐怖片和科幻片分布相当均匀。我本以为 20 世纪中期会有更多的科幻书籍,但只有四本书代表了科幻小说的“黄金时代”。
结论
这项工作有两个主要目标:
1)运用我在数据分析和可视化课程中学到的一些原则
2)通过我在过去七年里收集的数据,了解我自己和我的阅读习惯。以下是一些要点:
- 这些数据强调了我已经怀疑过的事情——我是一个“舒适区”读者。我倾向于回到相同的作者、类型和系列。在任何一年,我都更有可能拿起一本我以前读过的作者的书,而不是尝试一本新书。此外,那一年我很有可能会多看几本那位作者的书。我读的每三本书里就有一本是新作者写的,但我想让这一点更接近其他每本书。
- 我的总体阅读效率没有太多明显的模式。在这七年中,阅读的书籍数量在再次转向另一个方向之前,连续两年多没有上升或下降。我已经预料到了这一点,但波峰和波谷并不像我想象的那样容易映射到我生活中的特定时期。我能确定的唯一趋势是,在过去几年里,我对长篇大论的兴趣有所减弱。平均页数从 2015 年的 478 页逐渐下降到 2018 年的 325 页。
那么,我该如何处理这些信息呢?除了写这篇文章之外,它还对我的阅读习惯提出了一些调整,我将尽力去做:
- 更多地突破我的舒适区:我希望新老作者的比例更高。在这个目标下,我想增加女性作家的数量,因为七分之一的女性作家表现不佳。
- 舒适区也适用于流派。我计划增加休闲时阅读的非小说类书籍的数量。如果几年后我再做这个练习,我希望这个百分比至少能达到两位数。
- 如果奇幻书籍的数量保持不变,我想扩展到其他作者和系列。
我的阅读时间对我来说很宝贵,但我不认为这些变化会对它产生更坏的影响。我通常不喜欢阅读挑战,但我对横向引导我的习惯的想法感到兴奋。
我应该就这项工作本身说几句话。我处理的数据集并不复杂,但是使用 OpenRefine 这样的工具应用数据清理这样的原则是很好的。关于数据故事课程,我能够很好地运用一些实用的技巧。它教会了我故事板对我的数据的有效性。我还学到了老师演示的一些具体的故事机制,这很有帮助。
我并不是说这份工作除了个人宣泄之外还有任何特殊的价值。希望对喜欢阅读或喜欢数据的人有一些新奇的价值。或者像我一样,那些落在维恩图的中间。也就是说,我不想开始把书看成是一系列的标签和百分比。我要暂时忘记这些数据,继续阅读。
— — — — — — — — — —
更新
一些人建议我将我的原始数据附加到这篇文章中。在写这篇文章时,我想到了这一点,但我的问题是数据不是很整齐。我不是电子表格语法方面的专家,所以我使用了一些混乱的“技巧”,我相信更熟练的人会有更直接的方法来实现相同的结果。
也就是说,我花了几个小时整理电子表格,我认为它现在适合公众分享。您可以在这里访问电子表格。要使用逐年细分功能(U4 在‘Dashboard’),你必须制作自己的副本;请随意这样做。
当我更新这篇文章时,我想我应该指出一些发表后不久发生的很酷的事情。我工作的公司主办了一次 UX 设计会议,并为不同类别的演讲征集演讲者。其中一个类别被称为研究故事时间,演讲者将讲述与研究相关的故事,这些故事比给出的核心演讲更不寻常,或者更冷门。我改编了这篇文章,并将其作为提案提交(演讲必须以 PechaKucha 的风格发表),它被接受了。谈话进行得很顺利,但我想提到的是,在我谈到我的阅读缺乏多样性之后,我收到了大量关于女性写的科幻小说的推荐。我的积压现在看起来有点健康,并帮助我发现了作家,如 N. K .杰斯明,贝基钱伯斯,玛丽多里亚罗素和奥克塔维亚 e .巴特勒。我期待着阅读这些作者的作品,并在下次做这个练习时有一个更平衡的阅读组合。
对股市低迷的剖析
我们调查过去的股市下跌,以了解下一次可能会是什么样子
如果你想用我的代码运行你自己的分析,你可以在我的 GitHub 这里 找到 。
十年来,尽管利率上升,收益率曲线反转,特朗普发推文,欧洲经济问题和贸易战,这波牛市仍在继续。但是现在如果你和五个人谈论股票市场,你可能会得到五种不同的关于股票和经济走向的观点。但不管你的个人观点是什么,你目前的定位是什么,思考一下聚会的结局可能是什么样子都是有帮助的。在本帖中,我们将通过 Python EDA(探索性数据分析)来看一看。
“幸运青睐有准备的人。”— 路易·巴斯德
检查市场下跌
在我看来,股市崩盘和/或衰退的定性影响比它们对你的投资组合的即时定量影响重要得多。随着时间的推移,损失的美元可以赚回来,但市场崩盘可能造成的心理创伤和压力要持久得多。在经济开始再次繁荣后很长一段时间,对糟糕时期的记忆继续伤害着一代又一代的投资者——通过对股市的恐惧和面对金融决策时的过度避险。
也就是说,回答“在一次典型的市场下跌中,股票会下跌多少?”这个问题肯定是有用的要做到这一点,让我们来看看标准普尔 500(美国股票市场的一个很好的代表)的历史。
下图描述了标准普尔 500 的下降(即从之前的历史高点下降的百分比)。我只看二战后的数据,因为经济和股票市场在过去几十年里变化太大了。此外,我使用的回报是价格回报,不包括股息(股息为市场下跌提供了少量缓冲,在本次分析中我想忽略这一点)。最后,我认为任何负的月回报,不管多小,都是股市下跌。
S&P 500 Decline from Previous Peak (Since 1950)
一些有趣的事情跳了出来:
- 自 1950 年以来,标准普尔 500 下跌超过 30%的情况只有三次。然而,其中的两次(互联网泡沫和金融危机)都发生在过去 20 年里。
- 20 世纪 70 年代对投资者来说是一个可怕的时代。当时原油价格飙升,通货膨胀和利率经常超过 10%(美联储的目标是 2%),失业率居高不下。
- 相比之下,上世纪 90 年代(互联网泡沫破裂前)和 2010 年代(金融危机后至今)一直非常平静,让市场不断创出历史新高。这些长期平静的时期似乎更像是一种例外,而非常态。
- 随后的市场大崩盘(跌幅超过 20%)的复苏进展缓慢,通常需要几年时间才能恢复到前所未有的高点。通常这些大的下跌伴随着经济衰退。
- 另一方面,较小的市场下跌(跌幅小于 20%)通常会在市场低谷的几个月内迅速恢复(因为市场参与者意识到他们所恐慌的任何“股市妖怪”都不是真实的)。
对数字的深入探究
总而言之,我看了 820 个月的数据(从 1950 年到现在)。其中,282 个月(34%的观察值)的股票收益为负。最糟糕的一个月是 2008 年 10 月,T2 下跌了 20%(T3)(这发生在金融危机期间)。
然而,大多数下跌持续时间超过一个月——在我的样本中,市场下跌的平均时间是 3.8 个月。因此,不要只看每个月本身,更有启发性的是关注整个波峰到波谷的下跌,无论是一个月还是几个月。
下表从几个方面分析了这些从峰值到谷值的下降。
- 平均峰谷跌幅衡量标准普尔 500 指数(不包括股息)的平均峰谷跌幅百分比。
- 下跌持续时间衡量前一个历史高点和当前市场下跌低谷之间的平均时间长度。
- 恢复到前期高点的持续时间衡量股票市场从低谷到下一个历史高点的平均时间长度。
Metric Comparison for Market Declines of Varying Magnitude
让我们将观察频率(表中的观察次数)绘制为概率。
在大多数情况下(观察到的市场下跌的 71%),市场在最坏的情况下经历了 5%的下跌。
而整体平均 6.1%的跌幅也不算太差。但是,如果我们只关注标准普尔 500 下跌超过 5%的时候,事情看起来要危险得多:
其中 59%的时候,市场下跌 10%或更多,27%的时候,市场暴跌 20%或更多!
因此,当市场下跌超过 5%时,我们需要认识到这样一个事实,即市场可能会继续下跌,并有可能崩盘。请注意,我们这里使用的是小样本,因此会有很多噪音。
Historical Probabilities of Market Declines of Varying Magnitude
从上面的表格中,我们还可以清楚地观察到两种类型的市场下跌(在下面的柱形图中可以看到):
- 小幅下跌之后是快速、大幅的反弹。
- 需要数年时间才能恢复的可怕的股市崩盘。这些损失需要更长的时间来弥补,因为大的市场崩溃通常伴随着衰退、银行信贷紧缩、投资者绝望和大量破产。
请记住,我在数据中忽略了股息。有了股息(尤其是如果你再投资的话),回收期会有所缩短。
Market Crashes of -20% or Worse Take Much Longer to Recover From
最后,从上面的图表中注意,在更大的下跌中,标准普尔 500 花时间寻找底部(蓝色柱)。所以,如果你想低价买入,要循序渐进,有纪律。最有可能的是,你最终会买一些,然后看着市场在下个月再下跌 5%(这时你可以再买一些)。
股市崩盘时,高飞的股票会跌回地面
最后,让我们看看过去的股市宠儿在互联网泡沫破裂或金融危机中的表现,以了解今天的高材生如网飞或 T2 在市场严重低迷时的表现。
在 20 世纪 90 年代末互联网泡沫最盛的时候,领先的科技公司如微软和思科处于世界之巅。然后泡沫破裂,持有这些股票的投资者损失惨重:
Ouch!
2008 年,金融危机前夕,苹果发布 iPhone 仅一年,而美国银行是世界上最大和最赚钱的银行之一。接着,房地产泡沫破裂,全球金融体系几乎崩溃:
Bank Stocks Got Crushed in 2008
在这两种情况下,当天最受欢迎的股票在崩盘期间的跌幅都超过了整体市场。然而,在 2000 年,科技股是最被高估的,因此它们的跌幅明显大于整体市场。与此同时,在 2008 年,正是银行坐拥金融市场,因此银行股在随后的经济衰退中遭受了最沉重的打击。
关键要点
- 大多数市场跌幅都很小,很快就恢复了。即使是 15%的跌幅,平均也是在谷底后 5 个月恢复。我想“购买蘸酱”终究还是有一些智慧的。
- 股市崩盘(下跌 20%或以上)要痛苦得多,这不仅是因为下跌的幅度,还因为平均需要 1.5 到 4.5 年才能从损失中恢复过来。
- 当我这样说的时候,这听起来很明显——但是在标准普尔 500 已经下跌了至少 5%的情况下,我们面临着更大的市场崩溃风险。
- 在牛市的后期,集中持有当天最受欢迎的股票是有风险的。在崩盘期间,这些雄心勃勃的人受到的惩罚远远超过整体股市。
- 在市场下跌期间,逐步并有纪律地部署资金。在严重下跌的情况下,股市至少需要几个月才能触底,因此随着时间的推移,应该有足够的机会平仓。
- 如果像大多数情况一样,市场迅速反弹,不要因为你没有配置好所有的现金而去 FOMO。未来总会有更多的购买机会。
祝你好运!
延伸阅读
我有足够的钱退休吗?
K 均值的剖析
K 均值聚类算法完全指南
Photo by Ankush Minda on Unsplash
假设您想要根据内容和主题对数百(或数千)个文档进行分类,或者出于某种原因您希望将不同的图像组合在一起。或者更重要的是,让我们假设您已经对相同的数据进行了分类,但是您想要挑战这种标记。您想知道数据分类是否有意义,或者是否可以改进。
好吧,我的建议是你把你的数据聚集起来。信息经常被噪声和冗余所掩盖,将数据分组到具有相似特征的簇(聚类)是一种有效的方式来照亮一些信息。
聚类是一种广泛用于寻找具有相似特征的观察组(称为聚类)的技术。这个过程不是由特定的目的驱动的,这意味着您不必特别告诉您的算法如何对这些观察值进行分组,因为它会自己进行分组(组是有机形成的)。结果是同一组中的观察值(或数据点)之间比另一组中的其他观察值更相似。目标是获得相同组中尽可能相似的数据点,以及不同组中尽可能不相似的数据点。
K-means 非常适合探索性分析,是了解数据和提供几乎所有数据类型的见解的完美工具。无论是图像、图形还是文本,K-means 都非常灵活,几乎可以处理任何内容。
无监督学习领域的巨星之一
聚类(包括 K 均值聚类)是一种用于数据分类的无监督学习技术。
无监督学习意味着没有输出变量来指导学习过程(没有这个或那个,没有对错),数据由算法探索,以找到模式。我们只观察特征,但没有既定的结果衡量标准,因为我们想找出它们。
与监督学习相反,在监督学习中,你的现有数据已经被标记,并且你知道你想要在你获得的新数据中确定哪种行为,无监督学习技术不使用标记数据,算法自行发现数据中的结构。
在聚类技术领域中, K-means 可能是最广为人知和最常用的方法之一。K-means 使用迭代优化方法,根据用户定义的聚类数(由变量 K 表示)和数据集产生最终的聚类。例如,如果您将 K 设置为等于 3,那么您的数据集将被分组为 3 个簇,如果您将 K 设置为等于 4,那么您将数据分组为 4 个簇,依此类推。
K-means 从任意选择的数据点开始,如建议的数据组的 means ,并迭代地重新计算新的均值,以便收敛到数据点的最终聚类。
但是,如果您只是提供一个值(K),算法如何决定如何对数据进行分组呢?当你定义 K 的值时,你实际上是在告诉算法你想要多少个均值或质心(如果你设置 K=3,你创建了 3 个均值或质心,这占了 3 个聚类)。质心是代表聚类中心(平均值)的数据点,它不一定是数据集的成员。
算法是这样工作的:
- 随机创建 K 个质心(基于预定义的 K 值)
- K-means 将数据集中的每个数据点分配到最近的质心(最小化它们之间的欧几里德距离),这意味着如果一个数据点比任何其他质心都更靠近该聚类的质心,则该数据点被视为在特定的聚类中
- 然后,K-means 通过取分配给质心的聚类的所有数据点的平均值来重新计算质心,从而相对于前一步骤减少了总的聚类内方差。K-means 中的“means”指的是平均数据并找到新的质心
- 该算法在步骤 2 和 3 之间迭代,直到满足某些标准(例如,数据点和它们对应的质心之间的距离之和最小化、达到最大迭代次数、质心值没有变化或者没有数据点改变聚类)
In this example, after 5 iterations the calculated centroids remain the same, and data points are not switching clusters anymore (the algorithm converges). Here, each centroid is shown as a dark coloured data point. Source: http://ai.stanford.edu
运行该算法的初始结果可能不是最佳结果,使用不同的随机起始质心重新运行该算法可能会提供更好的性能(不同的初始对象可能会产生不同的聚类结果)。因此,通常的做法是以不同的起点运行算法多次,并评估不同的启动方法(例如,Forgy 或 Kaufman 方法)。
但是另一个问题出现了:你如何知道 K 的正确值,或者要创建多少个质心?对此没有通用的答案,尽管质心或聚类的最佳数量不是先验已知的,但是存在不同的方法来尝试估计它。一种常用的方法是测试不同数量的聚类,并测量所得的误差平方和,选择 K 值,在该值处增加将导致误差和非常小的减少,而减少将急剧增加误差和。定义最佳聚类数的这个点被称为**“肘点”**,并且可以被用作寻找 k 值的最佳选择的视觉测量。
In this example, the elbow point is located in 3 clusters
K-means 是您的数据科学工具包中的必备工具,这有几个原因。首先,它易于实施并带来高效的 T2 性能。毕竟,您只需要定义一个参数(K 的值)就可以看到结果。它也是快,并且与大数据集配合得非常好,使它能够处理当前的海量数据。它非常灵活,几乎可以用于任何数据类型,而且它的结果比其他算法更容易解释。此外,该算法非常受欢迎,以至于你可以在几乎任何学科中找到用例及实现。
但是任何事情都有不利的一面
然而,K-means 存在一些缺点。第一个是你需要定义个集群,这个决定会严重影响结果。此外,由于初始质心的位置是随机的,结果可能不可比,并显示出缺乏一致性。K-means 生成具有统一大小的聚类(每个聚类具有大致相等数量的观察值),即使数据可能以不同的方式表现,并且它对异常值和噪声数据非常敏感。此外,它假设每个聚类中的数据点被建模为位于该聚类质心周围的球面内(球面限制),但是当违反该条件(或任何先前的条件)时,该算法会以非直观的方式表现。
Example 1
示例 1: 在左侧是数据的直观聚类,两组数据点之间有明显的分隔(一个小环被一个大环包围)。在右侧,相同的数据点由 K-means 算法聚类(K 值为 2),其中每个质心用菱形表示。如您所见,该算法无法识别直观的聚类。
Example 2
例 2: 左手边是两个可识别数据组的聚类。在右侧,相同数据点上的 K-means 聚类的结果不符合直观的聚类。与示例 1 的情况一样,由于算法的球面限制,K-means 创建的分区不能反映我们视觉识别的内容。它试图寻找周围有整齐数据球体的质心,当星团的几何形状偏离球体时,它的表现很差。
Example 3
示例 3: 同样,在左侧有 K-means 未能识别的两个清晰的聚类(一个小且紧密的数据组和另一个较大且分散的数据组)(右侧)。在这里,为了平衡两个数据组之间的聚类内距离并生成大小一致的聚类,该算法混合两个数据组并创建两个不代表数据集的人工聚类。
有趣的是,K-means 不允许彼此远离的数据点共享同一个聚类,不管这些数据点之间的关系可能有多明显。
现在该怎么办?
事实是,现实生活中的数据几乎总是复杂的、杂乱的和嘈杂的。现实世界中的情况很少反映出应用现成算法的明确条件。在 K-means 算法的情况下,预计至少有一个假设被违反,因此我们不仅需要识别这一点,还需要知道在这种情况下该做什么。
好消息是有替代方案,缺陷可以被纠正。比如将数据转换为极坐标可以解决我们在例 1 中描述的球面限制。如果您发现严重的局限性,也可以考虑使用其他类型的聚类算法。可能的方法是使用基于密度的或基于层次的算法,它们修复了一些 K-means 的局限性(但也有它们自己的局限性)。
总之,K-means 是一个很棒的算法,有很多潜在的用途,所以它可以用于几乎任何类型的数据分组。但是从来没有免费的午餐:如果你不想被引导到错误的结果,你需要了解它的假设和运作方式。
感谢 Sabrina Steinert 的宝贵意见
对这些话题感兴趣?在 Linkedin或 Twitter 上关注我
我们观察的角度
向非技术观众揭开 PCA 的神秘面纱
想象你是一个艺术家,想在一张纸上画一栋房子。这个任务的本质是将一个物体从 3D 世界转换到 2D 平面。
如果你可以在这个房子里自由走动,你会选择哪个角度来画画?
Two different angles to look at the house
我们想要的是画房子的最佳角度,以这种方式可以很好地捕捉到关于这个房子的最重要的信息——如窗户的位置、高宽比。因此,我们可能会选择从左图所示的角度将房子“投影”到纸上,而不是右图所示的角度。
在机器学习中,我们处理类似的问题。
真实世界的数据集通常有太多的维度(特征)而无法有效地可视化。例如,客户的购买行为可以归因于许多因素,如收入、年龄、社会价值观等等。这些因素中的每一个都会在数据集中给出一个新的维度。
然而,人类很难在视觉上想象一个超过 3 维的数据集。因此,为了让领域专家查看数据并从中提取有意义的结论,我们通常需要将数据集缩减为几个主要部分。
这个降维的过程可以通过主成分分析(PCA) 来实现,这是一种在无监督学习中广泛使用的方法。
举例来说,我们看一个二维数据集,如下图所示,在 x-y 平面上,看看我们如何将它简化为一维,即一条线。
Two angles to project the data onto a line
从数学上来说,有不同的方法找到正确的投影。本质上,我们在寻找一条到所有数据点的平均(均方)距离最小的直线。通过选择左边的线,数据的大多数变化将被保留在新的维度中。
因此,主成分分析的核心思想是找出我们投射数据的最佳角度。
在实际使用案例中,这可能意味着将要素总数从数千个减少到数百个,从而显著缩小数据集。然而,在这里,我们将看一个关于客户定位的相当简单的用例。
假设我们想要了解我们的客户,以获得对我们提供的产品推荐类型的洞察力。一种可能是查看他们的购买记录,以了解他们购买行为背后的个人特征。我们可能会得出这样的结论:一些客户更注重价格,一些客户更快地采用技术。
Customers’ speed for tech adoptions vs price sensitivity
直觉上,客户对价格的敏感度和技术采用的速度可以降低到一个维度,在某种程度上捕捉客户对高科技公司的整体吸引力。因此,我们可以在新的红线上表示每个客户,其中位于红线右侧的客户比位于左侧的客户更有吸引力。
Customer attractiveness = weight1 × p + weight2 × t + c
一般来说,每个主成分都是原始特征的线性组合。同样,这里的客户吸引力是价格敏感度§和技术采用(t)的加权和,再加上一些常量值©。
在我们生活的复杂世界中,我们不断地选择正确的角度来看待事物。从某些角度来看,我们感知到一些有意义的东西,而从另一些角度来看,我们没有。
就像艺术家选择一个角度来画一栋房子一样,PCA 是关于选择我们看到的那个直角。
AOC 回复数据集
众议员亚历山大·奥卡西奥-科尔特斯的“@AOC”推特账户是政治讨论的热点。这位经验丰富的互联网冲浪者警告说,“不要看评论,”但我在那里花了很多时间,阅读,困惑,幸运的是只有一次被引诱回复(有人说她只能在布鲁克林获得选票)。
在政治推特上,最刻薄的用户被称为“机器人”。我不知道这些帐户是否是真正的保守派,钓鱼的一次性帐户,或者有组织的政治或垃圾邮件机器人。我只知道,即使我屏蔽了最差的账户,还是会有更多的账户出现。
机器学习的机会
我认为对 AOC 回复的大样本进行分析和聚类会很有趣。把账户当蜜罐。也许由此产生的模型可以学会过滤掉任何地方的不良推文?
理想的系统(在我看来)会自动将推文分类成 5-10 个原型,用户可以选择看或不看。我没有资源来手动标记每一条推文,而这正是我对监督学习的期望。
“情绪分析”对推文中的关键词做得太多了,对上下文没有帮助——是有人愤怒地回应一篇新闻文章,还是对一只酒店的猫尖叫?
抓取 Twitter
Twitter 的官方 API 为他们的数据提供了一个狭窄的选择范围。不幸的是,没有一个可以获取特定推文的回复 GitHub 和 StackOverflow 上流传着一些脚本,可以搜索最近的推文并挑选出回复,但以 Twitter 的速度,我永远不会捕捉到一周或一个月的讨论。另一种选择是稍微修改一下。
(非服务条款友好,继续下去风险自负)
我写了一个 TamperMonkey 脚本让我的浏览器在我滚动回复时下载每条推文的文本和元数据。我已经注销了我的帐户,以获得一个没有用户阻塞的更少偏见的视图(注意 Twitter 已经在旧线程中隐藏了一些用户)。我打开了 2019 年 3 月“@AOC”账号发的每一条推文和转发。最终结果是大约 110,000 个回复(一个 27.1 MB 的 CSV)。我愿意与研究人员分享代码和数据。
相关作品
- OpenAI 关于 NLP 无监督学习的帖子很漂亮,涵盖了许多不同的选项。
- 2016 年大选后,Twitter 发布了俄罗斯代理人的推文,然后由外部研究人员使用无监督的 NLP 进行分析:https://arxiv.org/abs/1810.01466
- 使用 word2vec 和 k-means 聚类分析 Reddit 评论和推文的教程:
https://medium . com/ml 2 vec/using-word 2 vec-to-analyze-Reddit-comments-28945 D8 CEE 57 - 使用 SciKit-Learn 对数据进行分层聚类https://stack abuse . com/hierarchical-clustering-with-python-and-SciKit-Learn/
方法学
我想出了一些分析推文的方法:
- A : 对可疑用户的文本进行监督学习— 根据用户名和用户名(以数字结尾,以 MAGA、QAnon 或 Trump 结尾)选择一组“可能恶意”的推文。这是不是因为政治而禁止用户,而是开发一个以 burner 和 troll 账户为模式的模型。根据回复的文本训练一个模型,并根据他们的分数对一条推文进行评级。
- B:对亵渎性和煽动性用户的文本进行监督学习— 与之前类似—在推文文本中搜索关键词的回复(亵渎性、无关主题中的煽动性话题、人身侮辱、标签)。将这些推文以及这些用户的任何其他推文放入“恶意”集合,并根据他们的分数对其他推文进行评级。
- C:使用 word2vec 的无监督学习— 对 Tweet 文本运行 word2vec,然后使用 k-means 聚类进行分组。
- D:使用 scikit-learn 的无监督学习— 使用 scikit-learn 和关键字标志进行层次聚类(因为全文似乎不太容易适用于该程序)。
分析和结果
监督学习的结果
由于手动过程,我起初不想标记推文,但有了用户名选项,只需几条 SQL 语句。首先,统计数据:
- 在 110,000 条回复中,17k 条来自以 3+数字结尾的“数字用户”,大约 2000 条来自拥有特朗普/马加/匿名/民族主义者名字的用户
- 没有明显的领导者:其中只有 12 个在一个月内发布了 30 多条回复
- 在 3,300 名多次回复的用户中,他们平均每周仍不到一次
对我来说,这强调了 Twitter 上一个缺失的功能:一个简单的正则表达式可以找到成千上万的用户,我没有时间一一解决。现有的“黑名单”忽略了创建新账户有多容易。
我有过用 Google AutoML 建立一个监督的 NLP 模型的经验,但是考虑到所有的原始推文和回复,它最初没有将的任何归类为“坏推文”。当您的数据非常不平衡(6:1 或更糟)时,AutoML 可以忽略次要类别,并声称精确度在 80%左右。
对于我的第二次运行,我决定收集亵渎的推文(以及它们的作者的额外推文),总共 15k。我用 15k 条随机选择的正常推文平衡了这些推文,而不是完整的数据集。
Confusion matrix for “reply” and “original tweet | reply” input formats were similar
混淆矩阵在这里很难读懂,但是预测“真实”意味着模型认为它是亵渎的。不同寻常的是,这个模型的有用性取决于哪些推文属于预测真实/亵渎,但在我最初的选择过程中被标记为虚假。我检查了这个类别:
另一类显示的是被认为是亵渎性的用户的推文,而这个模型会把它们标为非亵渎性的。
这两个列表都令人鼓舞——我很高兴 Python 脚本和 SQL 查询模板可以进行粗略的标记,AutoML 可以从中构建更通用的规则,并且产生的分类器似乎工作得很好。
我更喜欢一个分类器,它将原始推文的文本和回复作为单独的列,并使用其他推文属性。对我来说幸运的是,微软刚刚为 Azure 添加了一个自动化实验平台,这本入门指南将于 2019 年 5 月发布。Azure 运行各种算法并报告哪种算法具有最好的准确性,在本例中是“MaxAbsScaler,SGD”(从 0 到 1 缩放每一列,然后使用随机梯度下降)。
‘VotingEnsemble’ combines multiple methods. Stochastic Gradient Descent was the winner here
据报道,准确率很高,但我不可能审查 Azure 版本的应该是糟糕的推文。我可以将模型下载为 145 MB 的 pickle 文件,但不清楚如何在 Azure 环境或我的本地机器上继续使用它。如果出现更好的文档和演练,请关注这个空间。
无监督学习的结果
Reddit NLP 教程非常容易使用,以至于我很快从自己的数据集中聚类出单词。我要了 10 组,并从每组中打印出最上面的单词:
一开始我很气馁。集群#1 挑选了一些基础设施和政策术语,但它挑选了其中的许多。聚类#9 似乎只是“动词”。另一组有*、【更快】、【更便宜】、【更聪明】、【更好】、【更少】……语法相关但意义不相关的单词。*
在扩展我的脚本以显示 50 个集群之后,它们包括了如下主题:
- 环境(‘温度’,‘降温’,‘灭绝’,‘洪水’,‘洪水’,‘灾害’,‘温室’,‘自然’,‘流行病’,‘雪’,‘工业’)
- 骂人(‘黑客’、‘独裁者’、‘激进分子’、‘骗子’、‘演员’、‘骗子’、‘骗子’、‘失败者’)
- 道德(‘漏过的’,‘贡献’,‘违反’,‘PACS’,‘助手’,‘账目’,‘隐藏的’,‘道德’)
- 少数群体
聚类分析的效用是混合的,因为它确实显示了属于主题组的关键词,但我不认为这有助于揭示好的和坏的推文。**更新:**我正在看一门斯坦福 NLP 课程Gensim syn 0 解释——将单词放入向量空间的原始数据是在 2016 年大选之前创建的,因此特朗普、克林顿和其他单词的关联自此发生了变化。
我决定遵循这篇 Twitter 分析教程的路径,生成一些 D3 直方图来显示与环境相关的回复是由源自 AOC 的环境和绿色新政推文激发的。
histogram of original environment Tweets and replies; each bar represents 4 hours
与环境相关的回复 AOC 每天都达到峰值,并在 MSNBC 与克里斯·海耶斯(Chris Hayes)的一次市政厅会议后飙升。让我们为下一个图表设置新的坐标轴。从零时发布一条新的环境推文开始,相关回复通常会在什么时候出现?
decay of interest in a Tweet by minute (environmental topics and environmental replies only)
这与骂人的回答相比如何?
after environmental tweets, environmental replies (green) and name-calling replies (orange) are almost even in the first 30 seconds; name-calling immediately tapers off to a lesser share of Tweets
最后,我决定构建层次聚类模型,重点是对用户回复的总和进行分类。我创建了几个列来统计在一个扩展的亵渎性列表中出现的术语、环境词、骂人的词等,这些都是上一个示例中的集群所通知的。我查看了 10 个集群和 30 个集群的几个用户的推文,但在他们的推文中看不到有意义的共性?在我看过的所有样本中,除了一个之外,肯定都有攻击性的陈述。我想知道它们是否按照出现次数从高到低进行分组,这更多地是由帖子数量而不是实际内容驱动的。
测试它
在新的 AOC 推文中,哪些推文会被标记?让我们回顾一下我在 AutoML 中制作的监督学习模型。我打开预测标签,浏览了几条推文(这些被标记为“恶意”)。
here wew go: 99% positive
even though this one is anti-GOP, it was flagged
令人失望的是,下面的一些糟糕的推文不会受到该模型的影响。
*(*5 月 7 日更新 :我选择了一些不具有辱骂性或阻止价值的样本……它们的好坏取决于上下文和你的个人政治,但我认为它们是糟糕的回复,而 ML 模型不是)
结论
我不会用这个平台来追踪复杂的巨魔。回到我开始屏蔽的时候,我会通过检查他们的照片、个人资料和追随者数量来确认一个帐户是否“值得”,以确认该帐户是否只是一个一次性/政治巨魔帐户。我会找到有“旅游交易”的账户,有一天这些账户会切换到所有大写的政治讨论、股票照片和所有数字用户名。Twitter 确实有所有这些数据,加上社交图、位置/IP、登录行为、用户对用户屏蔽和静音以及报告历史。对于他们来说,预测我可能会阻止谁是微不足道的。
我成功的地方是收集了一个有趣的数据集(我希望与更多的研究人员分享),并产生了一个平台的下一个最好的东西:一个针对政治和新闻线索的部分过滤器。它使用机器学习,而不是简单的正则表达式(尽管,老实说,看起来仅此一项就可以过滤掉很多)。我也很高兴它不是一个广泛的政治分类器,因为它是针对“坏”推文进行训练的,而不是保守派推文或布莱巴特文章或 Gab 内容的数据集。
无监督学习,至少对于像我这样的教程爱好者来说是普遍可用的,对分析比对内容分类更有用。这让我很惊讶,我希望能了解更多。
Azure 有一套很好的库和 Jupyter 笔记本基础设施,我将在未来的监督学习项目中使用它们,但我迷失在它们的界面中。
我期待看到其他算法阻止社会主义者的观点或在这方面的其他扭曲。我们如何在 Twitter 上使用过滤气泡,同时仍然获得稳定的、对我们有挑战性的、写得很好的故事?
听起来像是另一种算法的工作🤔
神经网络的逼近能力(使用 Python 代码)
Image by Gerd Altmann from Pixabay.
为什么神经网络可以预测(几乎)任何过程的结果
介绍
众所周知,神经网络可以逼近任何连续数学函数的输出,不管它有多复杂。以下面的函数为例:
Generic function (generated using Mathematica).
尽管它的形状非常复杂,我们稍后将讨论的定理保证了我们可以建立某种神经网络,它可以像我们想要的那样精确地逼近 f(x) 。因此,神经网络显示了一种普遍的行为。
神经网络受到如此多关注的原因之一是,除了这些相当显著的通用属性,它们还拥有许多强大的学习功能算法。
普遍性和数学基础
这篇文章将给出人工神经网络这些近似能力背后的一些基本数学结果(定理)的非正式概述。
“几乎任何你能想象到的过程都可以被认为是函数计算……[例子包括]根据一段音乐的简短样本命名一段音乐[…],将一段中文文本翻译成英文[…],获取一个 mp4 电影文件并生成电影情节的描述,以及对表演质量的讨论。”
—迈克尔·尼尔森
使用神经网络作为逼近器的动机:Kolmogorov 定理
1957 年,俄罗斯数学家安德雷·柯尔莫哥洛夫,证明了一个关于多变量实函数表示的重要定理,他因在广泛的数学课题(如概率论、拓扑学、湍流、计算复杂性等)上的贡献而闻名。根据 Kolmogorov 定理,多元函数可以通过(有限个)一元函数的和与合成的组合来表示。
The Russian mathematician Andrey Kolmogorov (Wikipedia)
稍微正式一点,该定理陈述了在 n 维超立方体(其中 n ≥ 2)中定义的实变量的连续函数 f 可以表示如下:
Kolmogorov’s Theorem (1957)
在这个表达式中, g s 是一元函数,ϕs 是连续的、完全(单调)递增的函数(如下图所示),不依赖于 f. 的选择
Examples of monotonous functions (Wikipedia).
通用逼近定理(UAT)
UAT 指出,包含具有有限数量节点的单个隐藏层的前馈神经网络可以用于逼近任何连续函数,只要满足关于激活函数形式的相当温和的假设。现在,由于我们能够想象的几乎任何过程都可以用某种数学函数来描述,神经网络至少在原则上可以预测几乎每个过程的结果。
使用不同激活函数的前馈人工神经网络的通用性有几种严格的证明。为了简洁起见,我们只讨论 sigmoid 函数。Sigmoids 是“S”形的,包括作为特例的逻辑函数、 Gompertz 曲线和 ogee 曲线。
乙状结肠的 Python 代码
构建和绘制 sigmoid 函数的快速 Python 代码如下:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inlineupper, lower = 6, -6
num = 100def sigmoid_activation(x):
if x > upper:
return 1
elif x < lower:
return 0
return 1/(1+np.exp(-x))vals = [sigmoid_activation(x) for
x in np.linspace(lower, upper, num=num)]
plt.plot(np.linspace(lower,
upper,
num=num), vals);
plt.title('Sigmoid');
A plot of the sigmoid function. In the code, the conditionals inside the function are included to avoid problematic computations at large values.
乔治·西本科的证明
Cybenko (1989) 给出的证明以其优雅、简单和简洁而闻名。在他的文章中,他证明了下面的说法。设ϕ是 sigmoid 型的任何连续函数(见上面的讨论)。给定任何多元连续函数
在 N 维实空间的紧子集和任何正ϵ内,都有向量
(权重**、常数**
(偏置术语)和
到这样的程度
对于紧凑子集内的任何x(NN 输入),其中函数 G 由下式给出:
选择适当的参数,神经网络可以用来表示各种不同形式的函数。
使用 Python 的示例
为了使这些陈述不那么抽象,让我们构建一个简单的 Python 代码来说明到目前为止所讨论的内容。以下分析基于迈克尔·尼尔森(Michael Nielsen)的伟大的在线书籍,以及马特·布雷姆斯和贾斯汀·庞德斯在大会数据科学沉浸式(DSI) 上的精彩演讲。
我们将构建一个神经网络来近似以下简单函数:
在深入研究代码之前,需要做一些说明:
- 为了使分析更加直观,我将使用 sigmoid 函数的简单极限情况。当重量非常大时,s 形接近亥维赛阶梯函数。因为我们将需要添加来自几个神经元的贡献,所以使用阶跃函数比一般的 sigmoids 更方便。
- 在 sigmoid 逼近阶跃函数的极限中,我们只需要一个参数来描述它,即阶跃发生的点。s 的值可以表示为等于 s=-b/w 其中 b 和 w 分别是神经元的偏差和权重。
- 我要建立的神经网络将是一个非常简单的网络,有一个输入、一个输出和一个隐藏层。如果两个隐藏神经元对应的权值绝对值相等,符号相反,则它们的输出变成一个“凸起”,其高度等于权值的绝对值,宽度等于每个神经元的 s 值之差(见下图)。
- 我们使用下面的符号,因为权重的绝对值是凸起的h8。
- 因为我们想要近似 *g,*隐藏层的加权输出必须包含 sigmoid 的逆。事实上,它必须等于:
为了重现该函数,我们选择 h s 的值为(见下图):
Taken from here.
代码
代码以下列定义开始:
- 我们首先导入需要构建反 sigmoid 函数的
inversefunc
- 然后我们选择一个非常大的权重给 sigmoid,使其类似于 Heaviside 函数(正如刚刚讨论的)。
- 我们选择输出激活作为身份函数
identify_activation
- 该函数的作用是从 s 和 w 中恢复原来的 (w,b) 参数化(记得 s 是步进位置)。
- 架构设置好了,所有的 w s 和 b s 都选择好了。数组
weight_outputs
的元素是从上一节给出的输出权重值中获得的。
from pynverse import inversefuncw = 500def identity_activation(x):
return(x)def solve_for_bias(s, w=w):
return(-w * s)steps = [0,.2,.2,.4,.4,.6,.6,.8,.8,1]bias_hl = np.array([solve_for_bias(s) for s in steps])
weights_hl = np.array([w] * len(steps))
bias_output = 0
weights_output =np.array([-1.2, 1.2, -1.6, 1.6,
-.3, .3, -1])
1, 1, 1, -1])
最后的步骤是:
- 编写一个我称之为
nn
的Python
函数来构建和运行网络 - 打印出近似值和实际函数之间的比较。
def nn(input_value):
Z_hl = input_value * weights_hl + bias_hl
activation_hl = np.array([sigmoid_activation(Z)
for Z in Z_hl])Z_output = np.sum(activation_hl * weights_output)
+ bias_outputactivation_output = identity_activation(Z_output)
return activation_outputx_values = np.linspace(0,1,1000)
y_hat = [nn(x) for x in x_values]def f(x):
return 0.2 + 0.4*(x**2) + 0.3*x*np.sin(15*x)+ 0.05*np.cos(50*x))y = [f(x) for x in x_values]inv_sigmoid = inversefunc(sigmoid_activation)y_hat = [nn(x) for x in x_values]
y_invsig = [inv_sigmoid(i) for i in y]
_ = plt.plot(x_values, y_invsig)
_ = plt.plot(x_values, y_hat)
_ = plt.xlim((0,1))
Approximating the weighted output of the hidden layer using sigmoid functions with very large weights (such that the sigmoids approach step functions).
这个近似值远非理想。然而,是否可以直接改进它,例如,通过增加节点数或层数(但同时避免过度拟合)。
结论
在本文中,我描述了神经网络通用属性背后的一些基本数学,并展示了一个简单的 Python 代码,它实现了一个简单函数的近似。
尽管文章中已经包含了完整的代码,但我的 Github 和我的个人网站 www.marcotavora.me(希望)还有一些关于数据科学和物理学的有趣内容。
感谢您的阅读,再见!
顺便说一下,建设性的批评和反馈总是受欢迎的!
数据可视化的艺术和科学
关于如何思考和创建出色的数据可视化的全面指南。
数据可视化理论
数据可视化——我们的工作定义是“数据的图形化显示”——就像开车、做饭或在聚会上找乐子一样:每个人都认为自己很擅长,因为他们已经做了一段时间了。特别是对于那些从工程背景进入数据科学的人来说,数据可视化通常被视为琐碎的事情,一旦有趣的建模完成,就要匆忙向利益相关者展示。
然而,可视化往往是向决策者解释复杂问题的主要方式。对于如此多的人的日常工作如此重要的东西,数据可视化很少被直接教授,相反,新专业人员应该通过潜移默化来学习。但是这不是最好的方法。数据可视化和其他技能一样,是一种技能,即使是有经验的从业者也可以从磨练他们在该领域的技能中受益。
因此,这个简短的话题。这篇文章有点长,但是旨在给你一个全面的数据可视化概念的支持,这将使你在工作中做得更好。
我绝不打算教你如何用特定的软件制作特定的图形。我不知道什么样的软件可能适用于你未来的需求,或者当——坦率地说,谷歌存在时,你需要制定什么样的可视化——所以这不是一本有一步一步说明的食谱。这里的目标不是为您提供未来使用的食谱,而是教您什么是面粉——向您介绍有效数据可视化的基本概念和构建块。
也就是说,你可以在我的个人 GitHub 上找到构建这篇文章的代码(作为三个 R Markdown 文件)。
咒语
我尽可能地将这些基本概念归纳为四个咒语,我们将在整个课程中继续讨论。咒语是:
- 一个好的图形讲述一个故事。
- 一切都应该尽可能简单,但不能再简单了。
- 使用合适的工具完成工作。
- 墨水便宜。电子更便宜。
每个咒语作为一个部分的主题,也将贯穿始终。第一部分的主题很简单:
一幅好的图画讲述了一个故事
制作图形时,理解图形的用途很重要。毕竟,您通常不会制作一个完美描述您的数据的图表-现代数据集往往太大(就观察数量而言)和太宽(就变量数量而言),无法在单个图表上描述每个数据点。相反,分析师有意识地选择可视化中包含哪些元素,以便以最有效的方式识别数据中的模式和趋势。为了做出这些决定,思考一下为什么和如何制作图形会有所帮助。
我们为什么要讲故事?
至于为什么这个问题,答案通常可以归结为两大类中的一类:
- 帮助识别数据集中的模式,或者
- 向更多的观众解释这些模式
这些是创建分别被称为探索性和解释性图形背后的基本原理。探索性图形通常是非常简单的数据图片,用于识别数据中您可能还不知道存在的模式。以一个简单的图形为例,显示了树围作为年龄的函数:
这种可视化并不复杂——两个变量,35 个观察值,没有太多的文本——但它已经向我们展示了数据中存在的趋势。如果我们受到启发,我们可以利用这些信息开始研究树木生长随年龄变化的原因,现在我们已经大致了解了树木生长如何变化。
同时,解释性的图表都是关于为什么的。探索性图形首先关注的是识别模式,解释性图形的目的是解释它们为什么会发生,以及在最好的例子中,读者应该做些什么。解释性图形可以独立存在,也可以出现在一个更大的报告中,但是它们的目标是相同的:提供为什么一个模式存在的证据,并提供一个行动号召。例如,我们可以对同一个树形图进行一些编辑,以解释我们看到的模式:
我想在这里特别指出标题:“桔子树的生长在第 4 年逐渐减少。”一个好的图形讲述一个故事,记住。因此,无论你给你的图表起什么样的标题,都应该反映出这个故事的要点——像“树的直径(厘米)与年龄(天)”这样的标题不会增加任何用户不能从图表本身得到的东西。相反,只要有意义,就用你的标题来推进你的信息——否则,如果它没有增加任何新的信息,你最好把它完全删除。
这里重要的一点是,解释性图表不一定比探索性图表更精美,或者探索性图表只供分析师使用——例如,定期报告通常会使用高度精美的探索性图表来确定现有趋势,希望激发更深入的分析来确定原因。相反,要传达的信息是,了解图表的最终目的——无论它是应该首先帮助识别模式,还是解释它们是如何形成的——可以帮助您决定需要包含哪些元素来讲述您的图表旨在讲述的故事。
我们如何讲故事?
当考虑图形设计时,另一个重要的考虑因素是你将如何讲述你的故事,包括你将使用什么设计元素和你将显示什么数据。在决定可能的“如何”时,我首选的范式是权衡最终图形的表现力和有效性,正如华盛顿大学的杰弗里·赫尔所定义的那样,赫尔写道:
- :如果语言中的句子(即可视化)表达了一组数据中的所有事实,并且仅表达了数据中的事实,则一组事实在可视化语言中是可表达的。
- 有效性 :如果一个可视化所传达的信息比另一个可视化中的信息更容易被感知,那么这个可视化比另一个可视化更有效。
或者,简单来说:
- 说实话,只说实话(不要撒谎,也不要因遗漏而撒谎)
- 使用人们解码更好的编码(更好=更快和/或更准确)
当我们进入力学部分时,请记住这个概念——它应该是您在决定使用哪些元素时的主要考虑因素!在其他两节中,我们将继续回到解释性和探索性,以及表达性和有效性这些概念。
数据可视化的机制
让我们从制图的理论考虑转移到你所拥有的实际构建模块。在这样做的同时,我们还将继续第二条箴言:
一切都应该尽可能简单——但不能再简单了。
图表本质上是我们数据的 2D 图像:
它们有一个 x 轴和一个 y 轴刻度,就像我们这里的散点图一样,一个点在每个刻度上的位置告诉你它的值有多大。但是这种设置只允许我们查看数据中的两个变量——我们经常对查看两个以上变量之间的关系感兴趣。
所以问题变成了:我们如何将这些额外的变量可视化?我们可以尝试添加另一个头寸规模:
但是 3D 图像很难让你理解,制作起来很复杂,在传达信息方面也不太有效。它们确实有它们的用途——尤其是当你能够构建真实的、物理的 3D 模型,而不仅仅是在 2D 平面上制作 3D 形状时——但通常不值得这么麻烦。
那么我们的工具箱里有什么工具呢?普遍认同的(不,真的——这是一个激烈辩论的领域)分为四类:
- 位置(就像我们已经有了 X 和 Y)
- 颜色
- 形状
- 大小
这些是我们可以用来在图形中编码更多信息的工具。我们将把这些称为美学*,但是任何数量的其他词也可以使用——一些人把它们称为尺度,一些人把它们称为价值观。我称它们为美学,因为这是我选择的语言(R,使用 ggplot2)对它们的称呼——但这个词本身来自于这样一个事实,即这些是改变你的图表外观的东西。*
值得一提的是,我们使用的是 EPA 的数据集,代表了 1999 年和 2008 年 38 种流行车型的燃油经济性数据。“Hwy”是公路里程,“displ”是发动机排量(so 体积),“cty”是城市里程。但坦率地说,我们的数据集现在并不重要——我们这里的大部分讨论适用于您将获得的任何数据集。
我们将逐一介绍这些美学,讨论如何在每个图形中编码更多信息。一路上,记住我们的咒语:
- 一幅好的图画讲述了一个故事
- 一切都应该尽可能简单——但不能再简单了
- 使用合适的工具完成工作
- 墨水便宜。电子甚至更便宜
我们将在本节中讨论这些是如何适用的。
位置
让我们通过结束对位置的讨论来开始讨论这些美学。值沿 x、y 轴或(在我们的 3D 图形中)z 轴的距离代表特定变量的大小。人们天生就知道每个轴上的值越靠外越极端,例如,假设您看到了下图(由模拟数据制成):
你认为哪些值更高?
大多数人天生认为左下角代表两个轴上的 0,离那个角越远,值就越高。这个相对明显的发现暗示了数据可视化中一个更重要的概念:感知拓扑应该与数据拓扑相匹配。换句话说,这意味着图表中觉得大的值应该代表数据中大的值。因此,当处理位置时,更高的值应该是离左下角更远的值——你应该让你的观众的潜意识假设为你做这些。**
将这个建议应用于分类数据可能会有点棘手。假设我们正在查看数据集中汽车制造商的平均公路里程:
在这种情况下,x 轴上的位置只代表不同的汽车制造商,按字母顺序排列。但是请记住,图形中的位置是一种美学,我们可以用它在图形中编码更多的信息。我们在这里没有这样做,例如,我们可以完全不使用 x 位置来显示相同的信息:
试着比较第一张图上的庞蒂克和现代,和第二张图上的。如果有什么不同的话,去掉我们无关的 x 美学让比较制造商变得更容易。这是我们第二个口号背后的一个重要驱动力——一切都应该尽可能简单,但不能再简单了。拥有额外的美感会让一个图表变得混乱,让它更难理解它试图讲述的故事。
然而,当制作图形时,我们应该始终致力于使重要的比较变得容易。因此,我们应该利用我们的 x 美学,不按字母顺序排列我们的制造商,而是按他们的平均公路里程排列:
通过重新排序我们的图形,我们现在能够更好地比较更多相似的制造商。现在理解我们的可视化要快得多——更接近的比较更容易进行,所以将更多相似的值放在一起更容易理解。例如,看看现在庞蒂克和现代的对比。一般来说,不要按字母顺序排列东西——使用你放置东西的顺序来编码附加信息。
顺便提一下,我个人认为,当沿着 X 轴处理分类值时,应该对值进行重新排序,使最高值排在最前面。出于某种原因,我只是发现将最高的条/最高点(或任何用来显示价值的东西)放在 Y 轴旁边看起来比另一个更整洁:
值得一提的是,当值在 Y 轴上时,我不那么武断了。我个人认为最高的价值应该总是在顶部,因为人类期望更高的价值在离左下角更远的地方:
然而,我并不像在 X 轴上那样立即厌恶相反的顺序,可能是因为最下面的条/点看起来更像一个自然的形状,并且仍然沿着 X 轴线:
为此,至少你的里程可能会有所不同。此外,值得指出的是,当标签在 Y 轴上时,图表上的标签要干净得多——翻转您的坐标系,就像我们在这里所做的,是当您有大量类别时显示数据的好方法。
颜色
虽然我们已经很好地介绍了职位在信息交流中的作用,但我们仍然停留在开始时的同一个问题上:我们如何在图表上显示第三个变量?
最流行的方法之一是用颜色来代表你的第三个变量。可能值得讨论一下如何将颜色用于模拟数据集。以下面的图表为例:
现在让我们为第三个变量添加颜色:
记住:感知拓扑应该匹配数据拓扑。哪些值比较大?
大多数人会说是深色的。但事情总是那么简单吗?让我们改变我们的色标来比较:
当然,其中一些颜色比其他颜色更暗——但我不会说它们中的任何一种告诉我一个值是特别高还是特别低。
这是因为人类不会将色调*——颜色的实际色调——视为有序值。一个点的颜色并不表示该点的值高于或低于图上的任何其他点。相反,色调作为一个无序值工作,它只告诉我们哪些点属于哪个分组。为了判断一个点的值有多高或多低,我们不得不使用发光——或者单个点有多亮或多暗。*
你可以沿着另一个轴移动颜色来编码值——颜色的鲜艳程度,称为色度*😗
请记住亮度和色度*——一种颜色有多亮和有多鲜艳——是有序值,而色调(或颜色的阴影)是无序值这在处理分类数据时变得相关。例如,回到我们开始时的散点图:*
如果我们想在其中编码一个分类变量,例如,车辆的类别,我们可以使用色调来区分不同类型的汽车:
在这种情况下,使用色调来区分我们的变量显然比使用色度或亮度更有意义:
这是一个知道使用什么工具的问题,色度和亮度将清楚地暗示某些变量比分类数据更接近,而色调不会给你的观众提供任何关于有序变量的有用信息。但是,请注意,我仍然不鼓励使用彩虹来区分图形中的类别——彩虹的颜色并不完全是无序的值(例如,红色和橙色比黄色和蓝色更相似),并且您最终会暗示您可能不想暗示的类别之间的联系。还有,彩虹真的很丑:
说到在工作中使用正确的工具,人们在数据可视化中最喜欢做的事情之一就是过度使用颜色。以下面的例子为例:
在该图中,变量“类”由沿 x 轴的位置和颜色表示。通过重复这项工作,我们正在使我们的图表更难理解——对信息编码一次就足够了,再编码更多次就会分散注意力。记住第二条箴言:一切都应该尽可能简单——但不能再简单了。最好的数据可视化是包含传递消息所需的所有元素,仅此而已。
您可以在图形中随意使用颜色,只要它能为图形添加更多信息,例如,如果它编码了第三个变量:
但是像我们上面做的那样复制只会给你的图表增加更多的垃圾。
还有最后一种方法可以在你的绘图中有效地使用颜色,那就是突出具有某些特征的点:
这样做可以让浏览者快速挑选出图表中最重要的部分,从而提高图表的有效性。顺便说一下,请注意,我使用形状而不是颜色来区分车辆的类别——结合点突出显示和使用颜色来区分分类变量是可行的,但也会有些混乱:
还有一个原因是颜色是一种微妙的美学,很难在你的图形中找到正确的颜色:大约 5%的人(10%的男性,1%的女性)根本看不到颜色。这意味着你在可视化中使用它时应该小心——使用色盲安全调色板(查看“ ColorBrewer 或“ viridis ”了解更多这些),尽可能与另一种美学搭配。
形状
最容易搭配颜色的美学是第二个最常用的——形状。这个比颜色更直观,为了演示,让我们回到散点图:
现在,我们可以根据每个点代表的车辆类别来改变每个点的形状:
想象一下,我们正在做与之前颜色相同的练习——哪个值更大?
我告诉你这些形状代表什么,已经破坏了答案——它们没有一个天生比另一个大。形状和色调一样,是一个无序值*。*
当我们改变线的形状时,同样的基本概念也适用,不仅仅是点。例如,如果我们为前轮、后轮和四轮驱动汽车绘制单独的趋势线,我们可以使用线型来表示每种类型的车辆:
但即使在这里,没有一种线型意味着比其他线型更高或更低。
然而,这条规则有两点需要注意。例如,如果我们回到原来的散点图,改变我们使用的形状:
该图似乎暗示了前三类汽车(都是不同类型的菱形)和接下来的三类(都是三角形)之间的更多联系,同时挑出 SUV。通过这种方式,我们能够用形状来暗示我们分组之间的联系——更多相似的形状,仅仅在角度或纹理上有所不同,意味着彼此之间的关系比其他类型的形状更密切。这可能是一种祝福,也可能是一种诅咒——例如,如果你选择一个正方形和一个菱形来代表两个不相关的群体,你的观众可能会意外地读到比你原本想暗示的更多的关系。
同样值得注意的是,不同的形状会很快使图表变得杂乱无章。一般来说,在一张图上使用超过 3-4 个形状是一个坏主意,超过 6 个意味着你需要思考一下你到底想让人们带走什么。
大小
我们最后的审美是尺寸。回到我们最初的散点图,我们可以想象这样使用大小:
尺寸是一个固有的有序值* —大尺寸点意味着更大的值。具体来说,人类认为更大的区域对应更大的值——上图中三倍大的点的值也大约是三倍大。*
如果错误地使用了大小,或者错误地使用了大小,或者扭曲了数据,这就变得棘手了。有时,分析师会将半径映射到变量,而不是点的面积,从而生成如下图:
在本例中,代表 cty 值 10 的点看起来远没有代表 30 的点大 1/3。这使得在看这个图表时增加看起来更陡峭——所以当使用尺寸作为美学时要小心,你的软件使用的是点的面积,而不是半径!
同样值得注意的是,与颜色不同——颜色可用于区分分组,也可用于表示有序值——使用分类变量的大小通常不是一个好主意。例如,如果我们将点大小映射到车辆类别:
我们似乎在暗示实际上并不存在的关系,就像小型货车和中型车基本上是一样的。因此,最好仅对连续(或数字)数据使用 size。
切线
既然我们已经讨论了这四种美学,我想快速切入正题。当谈到人类感知这些美学的速度和难易程度时,研究确定了以下顺序:
- 位置
- 大小
- 颜色(尤其是色度和亮度)
- 形状
正如我们反复讨论的那样,最好的数据可视化是包含与传递消息一样多的元素,而不是更多。一切都应该尽可能简单,但不能再简单了。
然而,我们生活在一个人类的世界里,科学上最有效的方法并不总是最受欢迎的。由于从美学角度来看,颜色本身比尺寸更令人兴奋,从业者经常发现他们自己用颜色来表示尺寸已经足够的价值。因为我们知道,颜色通常应该与形状一起使用,以便在我们的可视化中更具包容性,所以大小通常是图表中使用的最后一种美学。这很好——有时我们必须为其他事情进行优化,而不是“有人能多快理解我的图表”,例如“我的图表看起来有多吸引人”或“我的老板想从我这里得到什么”。但值得注意的是,万一你在未来看到矛盾的建议——分歧来自于你的来源是教授最科学合理的理论,还是最适用的实践。
让我们从美学转向我们的第三条箴言:
使用合适的工具完成工作。
回想一下我们的第一张图表:
正如你已经知道的,这是一个散点图*——也称为点阵图。现在假设我们添加了一条最佳拟合线:*
一旦我们在它上面画了一条线,它就不再是一个散点图——但是术语散点图不再真正包含这里发生的一切。这显然也不是一个折线图,因为即使它上面有一条线,它也有一些点。
与其对这是什么类型的图表吹毛求疵,不如描述一下我们用什么工具来描述我们的数据更有帮助。我们将这些称为几何*,是几何的缩写——因为当你真正深入事物时,这些是你的数据集如何沿着图表的 x 轴和 y 轴分布的几何表示。我不想在这条路上走得太远——我只想解释一下词汇,这样我们就不会讨论那是什么类型的图表,而是讨论它使用什么几何图形。以这种方式组织事物会更容易理解事物如何组合和重新格式化,而不是假设每种图表只能做一件事。*
两个连续变量
这张图表使用了两种几何图形,非常适合具有连续 y 和连续 x 的图形,即点和线。这就是人们大多数时候所说的线形图——显示数据模式的单一平滑趋势线。然而,折线图也可以指每个点依次相连的图表:
很重要的一点是,要清楚你期望生成哪种类型的图表!为了清晰起见,我总是把前期称为趋势线。
这些类型的图表对于快速探索性图形具有巨大的价值,显示变量的各种组合如何相互作用。例如,许多分析师开始使用相关矩阵(也称为散点图矩阵)来熟悉新的数据集,相关矩阵创建了一个散点图网格来表示每个变量:
在这种格式中,理解数据之间的交互既快又容易,某些变量的交互显然是很有希望的进一步探索的途径。
稍微回顾一下,在继续之前,我想强调散点图的一个主要缺点。如果您碰巧有多个点具有相同的 x 和 y 值,散点图会将每个点绘制在前一个点上,使其看起来比实际数据少。向您的值中添加一点随机噪声(例如,在 Excel 中使用 RAND())有助于显示数据的实际密度,尤其是当您处理的数字没有得到应有的精确测量时。
最后一个适用于两个连续变量的图表是面积图,它类似于折线图,但填充的是线下的区域:
当 0 是与数据集相关的数字时,面积图是有意义的,也就是说,0 值不会特别意外。当您有多个分组并关心它们的总和时,也经常使用它们:
(这个新的数据集是“钻石”数据集,代表 54,000 颗钻石的大小、质量、切割和销售价格。从现在开始,我们将来回使用它和 EPA 的数据集。)
堆积面积图的一个缺点是,由于下方所有分组的累积效应,很难估计任何单个分组如何沿 x 轴移动。例如,0.25 克拉的“普通”钻石实际上比 1.0 克拉的要少——但因为“理想”和“优质”钻石如此之多,你的观众可能会得出错误的结论。在总数比分组更重要的情况下,这是没问题的——但在其他情况下,值得看看其他类型的图表。
一个连续变量
相反,如果您希望了解单个连续变量在整个数据集中的分布情况,那么直方图是您可以使用的最佳工具之一。直方图显示数据集中有多少观察值落在连续变量的特定范围内,并将其计数绘制成条形图:
直方图的一个重要标志是,您需要注意数据是如何装箱的。如果您没有为条柱选择正确的宽度,您可能会错过数据集中的波峰和波谷,并且可能会误解数据的分布方式,例如,如果我们绘制 500 个条柱,而不是上面使用的 30 个条柱,会发生什么变化:
直方图的替代方法是频率图,它使用折线图代替条形图来表示数据集中某个值出现的频率:
然而,你必须再次注意这些图表的数据仓有多宽——如果你不小心的话,你可能会不小心抹平数据中的主要模式!
与直方图相比,频率表的一大优势是它处理多个分组的方式——如果您的分组在变量的不同级别进行支配交易,频率表将比直方图更明显地显示它们如何变化。
(请注意,我对数据做了一些奇怪的处理,以便显示下面的分布是如何变化的。)
一个分类变量,一个连续变量
如果你想比较一个分类变量和一个连续变量,你通常会被某种形式的条形图所困扰:
条形图可能是现存的最不令人兴奋的图表类型,主要是因为它是如此普遍——但那是因为它真的擅长它所做的。条形图是最容易解释和最有效的可视化类型之一,无论它们多么令人兴奋。
然而,有些人真的打算破坏这一点。以堆积条形图为例,它通常用于添加第三个变量:
比较公平/G 和优质/G。几乎不可能准确地比较这两种情况——它们没有共同的顶线或底线,所以你无法真正进行比较。在这些情况下,最好使用隐藏条形图:
在比较不同分组的实际数字时,隐藏条形图通常是更好的选择。然而,这个图表很好地显示了条形图遇到的一个限制——一旦你超过了 4 或 5 个分组,进行比较就很棘手了。在这些情况下,你可能试图应用错误的图表,应该考虑将你的图表分成更小的部分——记住,墨水很便宜,电子或者更便宜——或者用几条线代替横条。
然而,堆积条形图适用于比较每个条形图中两个不同组的相对比例。例如,以下面的图表为例:
在这种情况下,进行组间比较是很简单的,因为所有组共享一条公共线,组 1 为 100%,组 2 为 0%。这个参考点解决了我们在两个以上分组中遇到的问题——尽管注意,如果条形图的总和不总是相同,我们仍然更喜欢一个隐藏的条形图。
快速切入正题
这通常是大多数人对饼状图及其糟糕程度进行长篇大论的地方。他们错了,但以一种可以理解的方式。
人们喜欢讨厌饼图,因为它们几乎都是糟糕的图表。然而,如果对你的浏览者来说,能够快速找出两个或更多的分组在整体中所占的比例是很重要的,那么饼图实际上是表达观点的最快和最有效的方式。例如,比较以下使用相同数据集制作的饼图和条形图:
**
比如说,在饼状图中,从 A 到 F 比从 C 到 F 更容易辨别,因为人类更擅长求和角度而不是面积。在这些情况下,请随意使用饼图——并告诉任何批评你的人,我说没问题。
两个分类变量
我们的最后一个组合是当你在 x 轴和 y 轴上都有一个分类变量时。这些是需要考虑的更棘手的情节,因为我们不再根据一个点离左下角有多远来编码位置值,而是必须创造性地有效使用位置来编码值。请记住,geom 是数据集沿图表的 x 轴和 y 轴分布的几何表示。当你的两个坐标轴都是绝对的,你必须创造性地展示这种分布。
一种方法是使用密度,就像我们在散点图中所做的那样,来显示有多少数据点落入了图表中的每个类别组合中。您可以通过制作“点云”图表来实现这一点,其中更密集的云代表更常见的组合:
即使这张图表上没有一个数字,它的信息也很清楚——我们只需扫一眼就能知道我们的钻石是如何分布的。类似的方法是使用热图,不同颜色的单元格代表一系列值:
我个人认为热图效率较低——部分是因为通过使用颜色美学来编码这个值,你不能将它用于任何其他东西——但它们通常更容易用手头的资源来制作。
制作出色的可视化效果
当我们进入最后一节时,是时候详细说说我们最后的咒语了:
墨水便宜。电子更便宜。
处理大数据集
回想一下我们在上一节中使用的钻石数据集。它包含了 54000 颗钻石的数据,包括每颗钻石的克拉数和售价。如果我们想比较这两个连续变量,我们可能会认为散点图是一个很好的方法:
不幸的是,看起来 54,000 点对这个情节来说太多了,对我们没什么好处!这是所谓的过度绘制的一个明显例子——我们只是在一个图表上有太多的数据。
这个问题有三个真正的解决方案。首先,我们可以简单地决定我们想要重构我们的图表,而不是显示一个指标——例如平均销售价格——在不同的克拉上如何变化,而不是我们的数据如何分布:
我们有各种各样的方法来进行这种重构——如果我们愿意,我们可以通过宁滨我们的数据得到一个非常相似的图表,并制作一个柱状图:
然而,无论哪种方式,我们都没有真正显示出与原始图表中相同的东西——我们没有任何迹象表明我们的数据是如何沿着这两个轴分布的。
第二个解决方案更有效地解决了这个问题——让你的所有观点都半透明:
通过这样做,我们现在能够看到数据分布更加密集的区域,这是汇总统计中所没有的,例如,低克拉钻石似乎比高克拉钻石的分组更加紧密。我们还可以在克拉的“整数”值上看到一些暗条纹,这表明我们的数据存在一些完整性问题,如果鉴定师更有可能给一颗钻石一个整数的话。
当我们想要在图形中映射第三个变量(让我们使用 cut)时,这种方法的挑战就来了。我们可以像往常一样尝试改变图表的美感:
但不幸的是,点的绝对数量淹没了图形上颜色和形状的大部分变化。在这种情况下,我们最好的选择可能是将我们的图分面,也就是说,将我们的一个大图分成几个小的倍数:
墨水便宜。电子更便宜。制作多张图表。
通过将我们的数据分割成几个更小的图形,我们能够更好地看到分布如何在我们的类别之间转移。事实上,我们可以使用这种技术将我们的数据进一步分割成散点图矩阵,显示不同的组是如何分布的:
分面的最后一个非常有用的用途是用多条缠绕的线分割图表:
这些图表通常被称为“意大利面条图”,当被分割成小的倍数时,通常更容易使用:
现在,刻面图的一个主要缺点是它们会使比较变得更加困难——如果在我们的折线图中,知道大多数净度在 2 克拉的价格上接近比知道每个净度的价格如何随克拉变化更重要,那么第一个图表可能是更有效的选择。然而,在这种情况下,重新评估你的图表上实际需要多少行是值得的——如果你只关心一些清晰度,那么只包括那些行。目标是使重要的比较变得容易,理解一些比较比另一些更重要。
处理图表垃圾
回想一下我用作解释性图表示例的图形:
你可能已经注意到,这张图表与本课程中的所有其他图表风格不同,它没有灰色背景或网格线或其他任何东西。
记住我们的第二条箴言:一切都应该尽可能简单,但不要再简单了。这张图表反映了这一目标。我们已经失去了一些令人分心的元素——彩色背景和网格线——并改变了其他元素,使整个图形更加有效。我们的目标是在图表上没有无关的元素,以便尽可能地表达和有效。这通常意味着使用最少的颜色,最少的文字,没有网格线。(毕竟,这些行通常只在挑选特定值时有用——如果您希望人们需要特定值,您应该给他们一个表!)
那些无关的元素被称为“垃圾图表”。你在 Excel 中制作的图表中会经常看到这种情况,它们会有深色背景、深色线条、特殊的阴影效果或不编码信息的渐变,或者最糟糕的是那些“3D”条形图/折线图/饼图,因为这些东西可以通过单击来添加。然而,它们会使你的图形不那么有效,因为它们迫使用户花更多的时间将数据和装饰分开。一切都应该尽可能简单,但不要太简单——所以不要试图用无用的元素美化你的图表。
chartjunk 的另一个常见实例是图形中的动画。虽然动画图形令人兴奋和时尚,但它们往往会降低图形的有效性,因为作为人类,当某些东西在移动时,我们无法专注于其他任何东西。看看这些来自哈佛视觉实验室的例子——它们展示了当动画加入时,注意到变化是多么困难。这并不是说你永远不能使用动画——但是当你的图形看起来很酷比它传达信息更重要的时候,它的使用是最好的。
常见错误
在我们结束本课程时,我想以几个常见的错误作为结束,这些错误在其他任何部分都没有得到很好的解释——主要是因为我们太忙于谈论良好的设计原则。
双 y 轴
这些错误中最主要的是带有两个 y 轴的情节,这是江湖郎中和金融顾问们自未成文的日子以来所钟爱的。有两个 y 轴的图表是一种很好的方法,可以让你的图表中不存在的相关性变得真实。几乎在每种情况下,你应该只做两个图表——墨水很便宜。电子更便宜。确切的原因不在本课的讨论范围内,所以请点击这个链接阅读这个主题非常有趣。下面我借用了基兰的代码——看看我们如何暗示不同的事情,只要改变我们如何缩放我们的轴!
过于复杂的可视化
可视化的另一个常见问题来自于分析师对他们的图表过于技术化。例如,回想一下我们最初的钻石散点图:
看这张图表,我们可以看到克拉和价格有正相关关系——一个增加,另一个也增加。然而,这不是线性关系;相反,随着克拉数的增加,价格似乎上涨得更快。
更有统计学头脑的分析师可能已经在想,我们可以通过对数变换坐标轴来使这种关系呈线性——他们是对的!当我们进行转换时,我们可以看到一个清晰的线性关系:
不幸的是,以这种方式转换你的可视化会使你的图形难以理解——事实上,只有大约 60%的专业科学家能够理解它们。因此,像这样变换轴会降低图形的有效性,这种类型的可视化应该保留给探索性的图形和建模。
结论
这就结束了对数据可视化基本概念的介绍。希望你已经掌握了一些概念或词汇,可以帮助你在日常生活中思考你自己的形象化。如果没有别的,我希望你记得我们的数据可视化的咒语:
- 一个好的图表讲述一个故事。
- 一切都应该尽可能简单——但不能再简单了。
- 使用合适的工具完成工作。
- 墨水便宜。电子更便宜。
希望这些概念能帮助你最大化可视化的表现力和效率,指导你使用尽可能多的美学和设计元素来讲述你的故事。你将知道如何匹配感知和数据拓扑。你会努力让重要的比较变得简单,你会知道制作不止一个图表。
祝你好运。向前去想象,也教别人如何去想象。我们的领域会因此变得更好。
Mike Mahoney 是一名数据分析师,热衷于数据可视化和寻找将数据洞察力应用于复杂系统的方法。在他的网站上了解更多或 在 LinkedIn 上与他联系 。
寻找人工智能项目的艺术和科学
人工智能项目管理
不知道如何入门 AI?使用人工智能发现钻石框架产生人工智能项目想法。
人工智能的潜力是巨大的。80%的美国首席执行官认为人工智能将在未来五年内显著改变他们做生意的方式, 2019 普华永道美国首席执行官调查称。然而,人工智能不仅是未来,也是现在。根据 2019 财富调查,60%的财富 500 强公司已经采用人工智能来改善流程。虽然全球经济前景可能很严峻,但首席执行官们期待人工智能创造产品和提高效率。
Photo by Jo Szczepanska on Unsplash
现在你的经理对人工智能的潜力感到兴奋,并要求你提出人工智能项目的想法。但是你如何产生人工智能项目的想法呢?你需要和谁谈?你如何创建一个成功的人工智能项目创意管道?
这篇文章向你介绍了一个提出人工智能项目想法的框架。它侧重于思考 AI 项目的基础,项目生成框架,以及寻找 AI 项目的团队。内容基于全球专家 landing.ai 、 Alexander Thamm GmbH 、 In The Pocket 的输入,以及我的个人经验。
理解商业和人工智能
在开始任何项目构思工作之前,你首先需要一个坚实的基础。只有了解你的公司和人工智能的能力,你才能找到人工智能项目。对外部顾问来说,了解一家企业可能具有挑战性,因为他们需要迅速找出一家公司的古怪之处。然而,对于有经验的员工来说,这仍然很重要。
Photo by Franck V. on Unsplash
AI 通常擅长三件事:创造新产品、改进现有产品和自动化任务。虽然前两类承诺新的收入,最后一类旨在降低成本。正如您在数据科学家业务基础中所了解到的,在降低成本之前专注于增加收入是明智的建议。
当采用传统软件开发无法解决挑战时,就使用人工智能应用程序。当潜在模式不明显时,通常就是这种情况。—Patrick glau ner 博士,数据学院负责人, Alexander Thamm GmbH
当寻找人工智能项目创意来推动收入时,你可以尝试生成新的基于人工智能的产品,或者用人工智能改进现有产品。为新产品寻找人工智能项目,了解你所在的行业。您的客户有哪些痛点?要确定如何用 AI 改进现有产品,你需要彻底了解现有产品。产品经理可以帮助你了解现有的机遇和挑战,并让你有机会寻找人工智能项目的想法。
你的公司到处都是机会。每个部门都应该有一个问题的答案:“你的哪些日常任务可以通过计算机视觉或 NLP 得到增强?”— 肯尼·赫尔森斯,艾领先,在口袋里
当寻求通过人工智能降低成本时,专注于自动化任务是至关重要的。要实现任务自动化,您需要了解内部流程和法规。与财务、人力资源或 IT 等业务支持职能部门的员工会面,规划高度重复性的任务。这些任务是自动化的主要目标。
人工智能是自动化的兴奋剂。人工智能项目的一个丰富的想法来源将在于自动化人类今天正在做的任务。尝试识别人们正在做的特定任务,并检查是否有可以自动化的任务。——博士吴恩达 ,CEO landing.ai,在 如何选择你的第一个 ai 项目
Photo by Franck V. on Unsplash
在做了繁重的工作之后,你理解了你所经营的业务和人工智能项目的能力。接下来,让我们应用这个框架来不断地提出人工智能项目的想法。
人工智能发现钻石框架
本文提出的方法是人工智能发现钻石框架。这个框架给你一个结构化的方法来提出人工智能项目的想法。
人工智能发现钻石框架由两个迭代组成。首先,你提出尽可能多的人工智能项目想法。第二,你把名单缩小到最有希望的。让我们详细地看一下每个迭代。
发现——产生一个人工智能项目创意池
人工智能发现钻石的第一个迭代步骤探索你面前的广阔解决方案空间。潜在的假设是,有价值的人工智能项目想法可以以任何形式和情况出现,没有想法是愚蠢到不值得考虑的。有不同的方法来提出疯狂的人工智能想法。
Photo by Jo Szczepanska on Unsplash
例如,位于比利时的数字产品工作室在口袋里创造了人工智能游戏来帮助你提出人工智能项目的想法。它使用人工智能项目想法的参考,例如人脸识别来解锁智能手机或自动分类电子邮件,以启动构思过程。参与者使用这些参考项目作为刺激,将它们转化为自己的想法。
AI 这个游戏是一种可以和一小群人一起玩的纸牌游戏。理想情况下,你和 10 个人玩两轮,玩一个小时,在这期间你会想出 20 个点子。许多想法并不总是伟大的,这没关系。如果一个小时后,小组提出了 2 或 3 个新鲜的、有价值的概念,那么花时间总是值得的。— 肯尼·赫尔森斯
即使你不玩 AI 这个游戏,和一群合适的人一起头脑风暴也会让你走得更远。头脑风暴法的想法可以是循环法、安静写作,或者其他产生想法的敏捷方法。有一个知识渊博的主持人来指导头脑风暴会很有帮助。
然而,人工智能项目想法的唯一数量并不代表一切。到现在为止,你可能已经有了许多人工智能项目的想法,但是你如何将注意力集中在最有前途的项目上呢?
定义—缩小最有前途的人工智能项目想法的范围
一旦你收集了许多想法,是时候对这些想法进行排序了。在圣杯人工智能项目的美丽中,你已经读到风险和影响是评估人工智能想法的最关键因素。评估人工智能项目想法可行性的一个重要工具是人工智能项目画布。
人工智能项目画布可以帮助你就你的项目提出正确的问题。你对这个项目令人信服的回答越多,它的可行性就越高。在你为每一个人工智能项目构想制定了人工智能项目画布之后,你可以方便地对项目进行排序,并关注最有前途的项目。在口袋里设计了他们的 AI 值画布也是为了这个目的。
Photo by Jeff Sheldon on Unsplash
现在你知道了如何找到人工智能项目的想法,让我们来看看你应该招募哪些关键人物来提出伟大的人工智能项目想法。
团队想出伟大的人工智能项目的想法
你需要一个专家梦之队来提出有前途的人工智能项目想法。团队成员应该是以下三个领域的专家:业务、客户和数据。让我们看一下每一个类别。
第一类由商业专家组成。这些同事非常了解公司及其流程。理想情况下,他们对现有流程有一个很好的概述,并在人工智能的正确推动下,可以提出如何自动化流程的想法。来自 IT、财务或人力资源部门的同事是团队的有益补充。
Photo by Jo Szczepanska on Unsplash
第二类是真正从客户角度出发的员工。同事们了解客户的痛点和需求。他们的知识对于提出充满人工智能的产品创意将是无价的。产品负责人、项目经理、业务开发人员和销售同事都很符合这种情况。
在客户方面,你需要技术专家、了解过去已经尝试过的东西的决策者和创新经理。业务分析师、数据科学家和数据策略师是可能的外部项目合作伙伴。帕特里克·格劳纳博士
第三类是技术数据专家,即数据学家。他们了解技术领域,可以帮助回答技术问题。数据学家还了解前沿技术的发展,并可以专注于将研究突破应用于新的人工智能项目想法。数据工程师、科学家和分析师是第三类研讨会的参与者。根据吴恩达的说法,理想情况下,数据学家的大本营在一个集中的人工智能团队中。
在人工智能时代,许多公司的关键时刻将是组建一个集中的人工智能团队。这个人工智能团队可以隶属于首席技术官、首席信息官或 CDO。它也可以由专门的 CAIO(首席人工智能官)领导。— 吴恩达, AI 转型剧本
从软技能的角度来看,寻找对人工智能有创造力和兴趣的参与者。当您为研讨会搭建舞台时,请确保营造一个安全和信任的氛围。在探索阶段,所有的想法都是有效的,而你想要利用那些天马行空的想法。在定义阶段,当评估人工智能项目潜力时,切换到更理性和保守的心态,特别是当你仍然处于人工智能成熟之旅的早期阶段时。
关键要点
在这篇文章中,你学习了如何简化寻找合适的人工智能项目想法的过程。在了解你所在的业务和人工智能的能力后,人工智能发现钻石可以帮助你从构思到评估。加入正确的团队,你会想出出色的人工智能项目创意。
- 先了解业务和人工智能潜力
- 使用人工智能发现钻石框架来寻找新的人工智能项目创意
- 召集合适的商业、客户和技术专家团队来构思新的人工智能项目
现在是你把这篇文章中的理论知识应用到现实生活中的时候了。我们非常感谢您的任何反馈!如果你想听更多关于商业、项目管理和数据科学的交集,在 Medium 、 LinkedIn 或 Twitter 上关注 me。
创建混音带的艺术——一种数据科学方法
查看交互式仪表板原型,探索您的音乐库(仅适用于桌面!)
《汉密尔顿》的创作者林·曼努埃尔·米兰达(Lin Manuel Miranda)谈到混音带是我即将与大家分享的这个项目的最佳介绍:
米兰达:我成长在盒式磁带衰落、CD 增长的时代。所以混音带——不是混音 CD,是混音带——是纽约青少年友谊和交配仪式的重要组成部分(笑声)。如果你是一个女孩,我想要你——为了向你表明我喜欢你,我会给你做一盘 90 分钟的磁带,在里面我会展示我的品味。我会给你放一首音乐剧歌曲,旁边放一首嘻哈歌曲,旁边放一首老歌,旁边放一首你可能从未听过的流行歌曲,同时下意识地告诉你我有多喜欢你的这些歌曲。
我想我在 90 年代通过制作混音带为百老汇谱曲学到的东西比我在大学里学到的还多。**你正在学习上升和下降,能量和节奏的变化。你在炫耀你的品味和推荐人。你想变得机智,通过播放不是你写的音乐。**所以我的节目最初的名字叫“汉密尔顿混音带”并非偶然这就是我写乐谱的方法。这是,这是…
格罗斯:哦,这就是你这么叫它的原因。哦,好吧。我明白了。
米兰达:是的。这是,这是我所知道的关于这家伙的一切,这是一个旅程,你也是一个旅程。再说一次,我在 CD 之前制作这种区别磁带的原因是你必须按照我为你安排的顺序来听。你知道,A 面到 B 面是我们的表演休息时间。我这么说是为了回答你的问题,因为我有朋友只听嘻哈音乐。我有只听音乐剧的朋友,我骄傲地站在中间,我会说,我要用这首歌改变你的生活。
是啊!创作混音磁带背后有一种艺术——有了 Spotify 这样的应用和我们弹指一挥间就能获得的海量曲目,这种艺术已经被遗忘了。但它仍然存在,也许它被称为播放列表,也许它失去了混音带所具有的一些浪漫属性,但为另一个人的耳朵精选音乐的基本情感是——我从个人经历中说的——一种非常棒的感觉。
林强调了制作混音带的基础:
- 流畅很重要——有起伏和节奏变化,这些元素是游戏的一部分。播放列表的场景受到了影响,因为我们仍然把它当作一个推荐系统——试图根据情绪、流派、艺术家等找到*【相似】*足够多的东西。这也是为什么它失去了混音带的浪漫。换句话说,我们的播放列表没有“故事”,它们平淡无奇,毫无关联。播放列表上的曲目聚集在一起,因为它们碰巧都在同一个派对上(形象地说),喜欢相同的东西,吃相同的食物。这没什么意思。冲突发生了什么?帝国的兴衰?命运和性格的紧张关系,直到最后的旋律来解决我们巨大的痛苦。
- 订单很重要 —因此,专辑订单很重要!我越来越少尝试“随机播放”音乐——艺术家为听过第一首歌的耳朵设计了第二首歌。作为一名馆长,我也希望我的弟子们能自律。我希望他们按照指示,按顺序听,不要把我的选择看成“这里有一堆我最喜欢的歌曲”,而是“我 设计了 这个列表是为了 你 按照这个特定的顺序,为了 你!’。
- 真实性很重要——混音带不能通过在谷歌上搜索“与朋友分享的最佳混音带”来制作。混音带不是来自“这是你的朋友会喜欢的最好的 8 首歌”的帖子。混音带肯定不是来自“我运行了一个算法,它决定这是 7 首让你爱上的歌”。混音带来自内心,来自经历,来自我生活中积累的元素,来自你的积累。如果像林说的那样,我说‘我要改变你的人生!’当我创作一张混音带时,这意味着我知道改变生活需要什么!托尔斯泰,定义艺术,把一个大的依赖于真诚,“如果只有观众或旁听者被作者感受到的感情所感染**,这就是艺术。**
但在后卡带和 CD 时代,很难遵循这些原则。为什么?因为选择。选择太多。我可以直接访问数百位艺术家的数千首歌曲,我怎么能选择 10-15 首呢……我甚至不能把我所有的曲库都保存在我的记忆中。在一个朋友请求与他分享我的音乐时,我被这种存在危机所困扰,我开始思考:我有成千上万首歌曲可供选择,我的过程是什么?我如何着手制作这个混音带?唉,我希望我能更好地欣赏我的音乐……所以,我们在这里。
更好地欣赏我的音乐
A Better View: Music Map
曲目是复杂的,像艺术家、专辑或流派这样的单一描述符不足以抓住它们潜在的“感觉”。因此,我需要一种方法来获取更多信息,并在开始选择之前了解我的歌曲“库存”。反复地,这导致了一个交互式仪表盘的功能原型,它将允许我在 地图形式 (如上图所示)中漫游我的音乐库,其方式比在列表上向下滑动更具信息性。
仪表板是一个探索性的研究工具,允许我查看其他混音带(专辑)的空间映射,也是一个组织工具,为我的播放列表选择曲目。
这里有一个快速的例子,我首先找到一首不太积极(低价)但充满活力的歌曲,然后将它与特定艺术家的歌曲联系起来(看台):
编辑描述
drive.google.com](https://drive.google.com/open?id=1ySBf1fYVeT_rEJr6vUdRn2g4adBNZoD7)
声音特征
为了了解歌曲的潜在属性,我想到自己做声音分析,但后来发现 Spotify 在计算音频特征方面做了一些很好的工作。以下是经过一些过滤后证明对创建空间映射有用的方法:
- Acousticness: " 从 0.0 到 1.0 的音轨是否声学的置信度度量。
- 可跳舞性:“ 可跳舞性描述了一个曲目在音乐元素组合的基础上适合跳舞的程度,包括速度、节奏稳定性、节拍强度和整体规律性。
- 能量: “能量是从 0.0 到 1.0 的度量,代表强度和活动的感知度量。通常,充满活力的曲目让人感觉速度快、声音大、嘈杂。”
- 响度: “一个音轨的整体响度,单位为分贝(dB)。响度值是整个轨道的平均值,可用于比较轨道的相对响度。
- 价: “从 0.0 到 1.0 的一个度量,描述一个音轨所传达的音乐积极性。高价曲目听起来更积极(例如,快乐、愉快、欣快),而低价曲目听起来更消极(例如,悲伤、沮丧、愤怒)。”
2D 制图的技术细节
我把上面的特征(+一些其他的)缩放成正态分布,然后用 TSNE 把它们缩减成二维,这样我就可以创建你上面看到的“音乐地图”。现在我们有了一个歌曲库的鸟瞰图,其中每首歌曲都与另一首歌曲相对应,而不是一个无意义的无尽条目列表。我还使用 K-means 高维聚类来获得歌曲组——每种颜色代表一个不同的聚类——它们在地图上充当认知地标,指示分离和边界。我喜欢地图,我认为空间性有助于知识组织,从而使构建认知地图变得更容易。认知地图有助于捕捉项目之间的联系。然后,我计算了每个音频特征在 X 轴和 Y 轴上的线性梯度,并用指示流向的箭头对其进行了标注。
如何解读图形
- 每个圆点是一首歌,它的位置反映了它与其他歌曲的相关性。例如,左边的歌曲与右边的歌曲相比,与中间的歌曲有更大的不同。
- 流向箭头离地图中心越远,相应方向的流向越强。例如,地图的左下方包含显著的声学特征,因为声学梯度箭头长且远离中心。另一方面,响度梯度箭头较小并且更靠近地图的中心,这表明尽管在地图的右上象限中较响的歌曲有一定的相关性,但是相关性较弱。
- 颜色是集群,意味着相同颜色的点在更高的维度上聚集在一起,它们有助于看到两组重叠的边界。
这种基于图形的用户界面是我一直在思考和尝试的,比如博客帖子、推文等等。因为我认为改变用户界面结构也会改变我们的思维方式。
交互式控件
Control Panel for Music Map
当然,盯着五颜六色的点看并不能提供多少信息,所以我让它与标签互动,并添加了过滤和聚焦地图的控件。我还增加了交互功能,可以选择歌曲添加到你的混音带中,并在地图上追踪它们的位置。
互动功能:
- 控件 选项卡可以根据歌曲的各种属性过滤地图。
- 艺术家 选项卡也允许过滤艺术家。
- 浏览 标签显示地图上您将鼠标悬停在轨迹上时轨迹的详细信息。
- 将鼠标悬停在一首歌曲上 也会在地图上高亮显示同一专辑中的其他歌曲及其排序。
- 点击一首歌曲 会将它添加到地图下方的 mixtape 表中,在这里你可以点击预览按钮,从歌曲中间快速获得一段 30 秒的片段。
- 切换 右上角的 按钮可以让你切换不同的地图视图。
绘制混音带
在探索、研究和选择之后,你可以看到你的混音带的最终空间之旅。
Sample Mixtape Spatial Journey
回到我们最初的混音原则:我们使用了潜在的声音特征来强调和设计流——我们可以从地图的各个部分设计运动,就像把听众从良好的共鸣音响带到压抑但充满活力的流行音乐,再到柔和的凝视鞋子的梦幻流行音乐序列。为心流而设计的一部分是在地图上研究你最喜欢的艺术家的其他专辑的动向。顺序考虑到了,我们按顺序一首接一首地挑选我们的歌曲。最后,真实性,虽然不能保证真诚,但我们的地图包含了来自我们自己图书馆的歌曲。因此,至少,这种结构允许真实、真诚地选择确实感染了我们的歌曲,正如我们期望它们感染另一个人一样。*
结束语
- 我在这篇文章中链接的原型是从我自己的图书馆中随机选择的不同流派的艺术家构建的——更倾向于独立/摇滚/声学。(奇怪的是,分享一个人的音乐库有点暴露*…但别担心,我没有泄露我所有的秘密(歌曲)!)*
- 这种方法显然强调音乐的声音部分,而不是歌词。进一步的工作将结合歌词和词汇质量的主题建模。我不久前做的一个项目对此进行了一些探索。
- 目前,我使用 Bokeh 独立 Javascript 来完成整个事情,以避免处理任何服务器成本:)因此,我没有通过 Spotify API 添加自动播放列表创建。目前,你可以创建一个歌曲列表,然后自己将它们添加到 Spotify 播放列表中。
如果你觉得这很有趣,并且想要你自己的音乐地图,我不能保证,但是给我你的艺术家列表,我会看看我能做什么!