TowardsDataScience-博客中文翻译-2021-八十四-
TowardsDataScience 博客中文翻译 2021(八十四)
你需要知道的 26 个最重要的数据术语

布雷特·乔丹在 Unsplash 上的照片
用简单英语揭秘最常用的数据科学行话
你如何定义‘数据科学’?大数据、 AI ,或者数据文化怎么样?这些只是数据语言中常见的许多术语中的几个。你可能想知道当人们使用这些很酷的流行语时,他们真正的意思是什么。
正如数据成为主流,术语的密集词汇也成为主流。理解和认同这些数据术语的定义是一个真正的挑战。也许,这是一个比从数据中获取商业价值更难的障碍!
本文将揭开数据空间中 26 个最常用术语的神秘面纱。
我们将这些短语分为四大类:数据工程、商业智能、数据科学和决策智能。这些与组织通常从数据中获取商业价值所遵循的逻辑顺序相同。

帮助你从数据中获取价值的 4 个原则,格拉米纳
大数据术语表
一.数据工程术语
1。数据工程是一门专注于诸如数据源识别、数据收集、管理和存储等方面的学科。这是所有其他帮助从数据中获取价值的学科的先驱。
2。数据治理是一个框架和一组实践,帮助组织中的所有利益相关者识别和满足他们的信息需求。(参考:数据治理研究所)
3。数据仓库是一个中央信息库,可用于分析和做出更明智的决策。(参考:亚马逊)
4。Data Fabric 是一种架构和一组数据服务,可提供一致的功能,集成跨云和内部的数据管理,以加速数字化转型。Gartner 表示,数据结构可以在分布式数据环境中实现无摩擦的数据访问和共享。(参考: NetApp) , Gartner )
二。商业智能术语
5。商业智能是分析和转换数据以提取有价值的商业见解来制定决策的学科。如今,BI 通常用于描述性分析和报告。
6。数据挖掘是在大型数据集中提取和发现模式的过程,涉及机器学习、统计学和数据库系统的交叉方法。这个词是在 1990 年左右创造的,并很快成为一个流行语。(引用:维基百科)
7。MIS 报告(管理信息系统)是提供基本信息以运行日常业务活动和监控组织进展的过程。这通常指描述性和操作性报告。
三。数据科学相关术语
8。数据科学是应用高级分析技术从数据中提取有价值的信息以进行业务决策和战略规划的学科。它汇集了数据挖掘、统计学、数学、机器学习、数据可视化和软件编程等领域。
9。人工智能(AI) 指机器模仿人类思维能力的能力,例如从例子和经验中学习、识别物体、理解和响应语言、做出决策和解决问题。(编号: IBM )
从水下视频中检测鲑鱼,来源:案例研究
10。机器学习是人工智能(AI)学科的一个子集,它为系统提供了自动学习和根据经验改进的能力,而无需显式编程。(参考:专家艾)
11。深度学习是一种属于机器学习学科的技术。它基于受人脑结构启发的人工神经网络。它从大量数据中学习,尤其擅长从文本和图像等非结构化数据中发现模式。
12。增强智能指的是以人为中心的合作伙伴关系,将人和人工智能结合在一起,以增强认知性能,包括学习、决策和新体验。(参考文献:高德纳,福布斯)
13。集体智慧是指一个群体执行各种任务和解决各种问题的综合能力。企业可以通过协作、集体努力和许多个人在共识决策中的竞争来实现这一点。(引用:维基百科)
14。描述性分析是对数据或内容的检查,以回答问题“发生了什么?”它的典型特征是传统的商业智能(BI)和数据可视化。(参考:高德纳公司)
15。诊断分析是一种高级分析形式,它检查数据以回答“为什么会发生”的问题你可以借助数据挖掘、统计学和机器学习等技术来实现。(参考:高德纳)
16。预测分析是一种高级分析形式,它检查数据以回答“可能会发生什么”的问题你可以在机器学习和人工智能(AI)等技术的帮助下实现。(参考:高德纳公司)
17。信息设计是以一种促进对信息的有效理解的方式呈现信息的实践。(参考:维基百科)
18。数据可视化属于信息设计领域。它是指使用图表、图形和地图等视觉元素对信息进行图形化表示。这样做的目的是使决策能够恰当地表达洞察力。
https://blog.gramener.com/types-of-data-visualization-for-data-stories/
19。数据消费是指以有助于理解和行动的形式呈现见解。这通常是通过采用分析技术来识别见解和数据可视化技术来呈现见解来实现的。
20。数据叙事是围绕数据及其伴随的可视化构建叙事的实践,有助于以强有力和引人注目的方式传达上下文和数据的含义。(编号: TDWI )
四。决策智能术语
21。决策智能是将信息大规模转化为组织决策的学科。组织和个人可以通过将管理科学和社会科学学科结合起来,在业务问题的背景下应用数据科学来实现这一目标。(参考:企业家项目)
22。管理科学是对人类组织中解决问题和决策的广泛的跨学科研究。它与管理学、经济学、商业和管理咨询等领域有着紧密的联系。(参考:维基百科)
23。社会科学是科学的一个分支,致力于研究社会和社会中个人之间的关系。这一领域在数据领域越来越重要,因为它有助于深入了解人们的行为。(参考:维基百科)
24。决策支持系统(DSS) 是支持组织决策活动的信息系统。这个领域在 20 世纪 70 年代有很多研究,在接下来的几十年里发展迅速。(引用:维基百科)
25。数据素养是在上下文中读写和交流数据的能力。它包括对数据源、分析技术、业务应用和最终价值的理解。(参考:高德纳)
26。数据文化指的是一个组织内大多数人在数据相关问题上共享的价值观、行为和规范。广义而言,它指的是一个组织利用数据做出明智决策的能力。(引用:维基百科)
如何建立数据驱动的决策文化, Gramener 白板系列
总结:掌握语义知识树
与任何大数据术语一样,请记住,准确的定义没有理解它的广泛含义或如何从应用程序上下文中解释它重要。
如你所见,几个学科需要联合起来从数据中获取价值。例如,它需要机器学习等技术领域,管理科学等组织学科,以及社会科学等艺术学科。
一个人应该如何掌握如此不同的专业领域?
我们可以从 Elon Musk 那里得到启发,他说将知识视为语义树是很重要的。确保你理解了基本原则,这就好比是树干。然后你掌握不同领域的专业知识,你可以把它们等同于分支。
最后,您必须了解下一级的概念和应用程序,它们就像树叶一样。否则,树叶就没有东西可以依附了。
本文原载于 Gramener 博客 。
数据科学中 3 种最重要的项目管理方法
如何成功实施数据计划

在大数据项目中,经常会出现构建数据仓库或数据湖、数据集成、BI 工具或 AI/DL 模型的实施等主题。在项目过程中,有几种项目管理方法和工具可供使用。在这种关系中,人们主要区分这三种方法:敏捷、经典和混合。
在过去,像创建数据仓库这样的项目是大型的、单一的、季度或多年的工作,并且受制于传统的“瀑布”过程。在现代,这不再是规范,许多组织选择使用更灵活、迭代或敏捷的方法。随着业务需求比以往变化得更快,新的数据源也在不断增加,解决方案通常是采用增量和敏捷的方式。使用迭代方法,任务/子项目可以被分解成更小的故事,商业价值可以更快地被创造。因此,以下三种方法应运而生,并成为实施数据科学项目的最常见方法[1]:
方法一:Scrum
这种方法是敏捷开发过程中最广泛使用的过程框架。Scrum 强调日常沟通和对在短时间内执行的计划进行灵活的重新评估。敏捷数据科学宣言是围绕以下原则组织的[2]:
- 循环
- 船舶中间输出
- 实现任务的原型实验
- 创新产品管理
- 强烈关注客户
方法 2:看板
这种方法的特点是管理/改进产品,关注持续的交付,而不会使开发团队负担过重。

像 Scrum 一样,看板是一个通过可视化工作流、WIP 边界、工作流管理和创建指导方针来帮助团队一起工作的过程,它旨在改进协作和过程。
方法 3:光束
BEAM 的目标是敏捷维度建模,目标是将需求分析与业务流程而不是报告结合起来。这种方法的基本原则是[3][4]:
- 个人和互动:商业智能是由用户对其业务的提问所驱动的。技术设置是次要的。
- 业务驱动:需要数年时间部署的文档完备的数据仓库总是会过时。商业用户会将目光投向别处。我在业务部门的经验:我现在就需要它,否则我宁愿继续使用我熟悉的 Excel 解决方案…
- 客户协作:最终用户对其业务的了解是你最大的资源。
- 应对变化:如果你采取了以上所有的行动,变化会自然而然地出现,并导致每周的交付周期。
BEAM 的作者 Lawrence Corr 描述了一种用于构建“数据故事”的设计模式。
例:业务事件——客户购买产品[5]:
- 订单日期是什么时候?
- 产品在哪里购买,将在哪里交付?
- 如何大量购买?
- 购买背后的原因是什么?
- 该产品是通过哪个渠道购买的?
通过这些重要的问题,业务流程变得清晰可见,因此可以推导出技术条件。
结论
在本文中,提到并进一步描述了三种最常见的项目管理方法。然而,重要的是要认识到,除了找到最好的方法之外,理解向敏捷方法或自动化代码开发的转变不仅仅是技能的转变。这是一种心态的转变。在数据科学领域,敏捷方法很有前途,因为通常不可能预先评估项目是否可以使用可用数据完成。结果在多大程度上是成功的,只有一旦有了结果才能判断。
来源和进一步阅读
[1] Jeffrey S. Saltz,Ivan Shamshurin,Kevin Crowston,通过受控实验比较数据科学项目管理方法(2017),第 50 届夏威夷系统科学国际会议论文集
[2] Russell Jurney,敏捷数据科学 2.0
[3]optimalbi.com,阿吉利比 vs BEAM✲ vs 模特风暴 (2015)
[4] Lawrence Corr,Jim Stagnitto,敏捷数据仓库设计:协作维度建模,从白板到星形模式(2011)
[5] Raphael Branger,通过敏捷性和自动化实现 BI 卓越 (2017 年)
绝对初学者必读的 3 本数据科学书籍
“我被所有可用的资源淹没了;我该怎么办?”

Freepik 上的宏向量图像
“有的是资源,我很困惑自己走的路对不对。你能帮我吗?”她忧心忡忡地告知。
当我从我的一位学员那里听到这些话时,事情发生了急转直下,这位学员到目前为止表现得非常好。我不敢相信连她都怀疑自己。
给你一个背景,我是一名高级数据科学家,在空闲时间,我指导数据爱好者进入数据科学领域。我期待着这些互动,因为它们让我了解初学者面临的问题以及我如何才能更好地提供帮助。
我一直在写关于的知识供你复制,关于的错误供你避免,关于的广泛指南供你遵循——但是我错过了关注数据科学入门的最简单的元素。
现在是教育工作者和像我这样的导师承认这一点的时候了——我们的工作是让它变得简单和容易。减少信息过载并帮助您采取行动是我们的职责。
如果你不知所措,最终过度思考,什么都不做,52 周的路线图,25 份资源表,7 份备忘单,101 页的 pdf 文档能有什么用?
有鉴于此,我正在简化这个过程,以便让你开始学习数据科学和机器学习。在线课程和书籍才是真正的基石。
在前面的中,我已经介绍了必读在线课程的简化版,在本文中,我将向您介绍在数据科学领域取得进步所必须阅读和学习的书籍。
最后,我将揭示数据科学中不可否认的成功关键。(剧透:你可能已经知道了,但我想为你重复一遍。)
我们开始吧,好吗?
1.乔尔·格鲁什的《从零开始的数据科学》

来源:奥雷利(图书链接)
我很高兴在我年轻的时候找到了这本书。我不认为其他任何人会像 Joel 那样以最简单的方式向您介绍数据科学的所有基本步骤。
Joel 采用了一种有趣的方法,在一个名为 DataSciencester 的假想社交网络中,你被聘为首席数据科学家。在整本书中,他会帮你解决工作中遇到的所有问题。我喜欢这种非传统的方法。我能说什么呢?
这本书有你作为数据科学家需要的所有概念,从编程到统计到概率到大数据,并附有代码示例。如果你是一个数据科学家初学者,这是你需要拥有和阅读的书。
我强烈推荐你把这本书 作为你早期的 l 赚钱指南。
2.使用 Scikit-Learn、Keras 和 TensorFlow 进行机器学习

来源:奥雷利(图书链接)
一旦你掌握了数据科学的基础知识,你最受益的第二本书是奥雷连恩的杰作。是最受欢迎的机器学习书籍,大家推荐。它没有让我失望。
过去两年我一直在读这本书,但至今仍未读完。不,不是因为我读得慢。我在日常工作中直接使用这本书的内容。
在做项目时,你不可避免地会听到像随机森林和支持向量机这样的算法。您可以从 scikit 中找到代码片段——也可以学习。与其盲目地将它们复制到你的项目中,不如打开这本书,翻到解释你将要使用的算法的那一章。
这本书涵盖了每个机器学习算法背后的理论和用法。你现在会感到更加自信,因为你了解了你的模型背后的一切。甚至还有像自动编码器、强化学习等高级内容。
不要急着看完这本书;把它作为你将要从事的每个项目的参考资料。
3.Emily Robinson 和 Jacqueline Nolis 撰写的《在数据科学领域开创职业生涯》

来源:曼宁(图书链接)
这本书与我们之前讨论的其他两本书有很大不同,主要关注与学习数据科学相关的技术内容。这本书于 2020 年出版,教你数据科学产业如何运作。这就是为什么它是必读的。
Emily 和 Jacqueline 带我们经历了一次旅程,从决定数据科学职业是否适合我们开始,到市场上不同类型的数据科学工作,以及获得工作的端到端流程。
例如,60%法则可以帮助你决定哪些工作你符合的条件,应该申请哪些工作。没错,这本书涵盖了成为数据科学家所需的一切。
我最喜欢的是它不会就此停止。对于像我这样已经找到工作并在数据科学岗位上成长的人来说,有很多建议。
到目前为止,我已经根据我在数据科学旅程中的水平重读了这本书多次。我可以告诉你,作者为了写这本书,与多个领域和公司的专家进行了广泛的研究。 把这本书作为你的职业指南。
所以,就这样了。你知道你需要的书。
还有最后一个关键步骤,我将为您详细介绍。
数据科学成功的不可否认的关键是你已经知道的东西
花点时间想想这个。这是什么?
它不是讨论 Python 与 R 的争论,也不是在 YouTube 上狂看数据科学视频,或者一个接一个地报名参加课程。
关键是要持之以恒地采取行动。
不,老实说,想想吧。肯定还有其他关于数据科学的好书和课程,你不知所措的原因是这些选项带给你的信息过载。
你会花更多的时间思考和计划获取技能,还是选择我推荐的其中一个然后开始?
你知道答案;我只是重复给你听。每当有人试图迷惑你时,请记住这一点:在数据科学中有多条成功的道路,你选择的道路应该足够简单,以帮助你采取行动。
这个肯定会。
所以让我们从今天开始。如果你遇到困难,请随时联系我,我非常乐意帮助你。
作为披露的提示,本文可能会有一些附属链接来分享我使用过的最好的资源,而不会给你带来额外的费用。感谢您的支持!
要获得更多关于进入数据科学、真实体验和学习的有用见解,请考虑 加入我的电子邮件好友私人列表 。
如果你看重这样的文章,想支持我这个作家,可以考虑 报名成为中等会员 。每月 5 美元,你可以无限制地阅读媒体上的故事。
https://arunnthevapalan.medium.com/membership
构建现代数据堆栈时要记住的 3 件事
构建数据堆栈令人困惑。不一定非要这样。
简介
您如何看待您的数据堆栈?
如果您的工作需要分析数据,或者支持分析您的数据的团队,您可能会发现自己在某个时候从事数据管道工作,并随着工作的进行了解它们的复杂性。虽然数据管道比 20 年前超前了好几光年,但数据团队今天面临的日常挑战基本相同。我们是如何走了这么远,却还停留在原地?
我们已经看到了为促进现代数据堆栈所做的大量深思熟虑的工作。安德森·霍洛维茨关于新兴建筑的开创性思想文章;马特图尔克的穷举数据景观;Tristan Handy 的现代数据堆栈:过去、现在和未来都是当前数据从业者的必读之作。(特里斯坦的配套视频讲述了数据基础设施的未来,也是必看的。)
然而,根据我们在过去 5 年中与互联网公司的大规模数据堆栈合作以及采访数百家公司的数据团队的经验,我们仍然感觉现代数据堆栈的复杂性并没有以最明显的方式真正降低,因此它们被认为是不可避免的。例如,尽管在简化数据堆栈方面取得了巨大的进步,尤其是在过去的五年中,数据团队构建和调试数据管道的认知负荷仍然大致相同。现在有更多功能重叠的工具可供选择。工具选择的真正含义并不明显,直到把它们放在一起并使用一段时间之后。没有简单、易于理解的框架可以帮助团队理解如何为他们独特的需求构建最佳的数据堆栈。
本文的目标是提出一个简化的框架并开始对话。我们不会试图提供所有工具的综合术语表以及如何适应它们(为此,我们强烈建议看一看 Matt Turck 的 landscape pdf )。但是我们将为您提供一个概念模型,帮助您在选择工具时考虑其中的含义。
我们将提供一个简化的框架,说明您应该如何考虑构建您的数据堆栈。更重要的是,我们希望不要单纯从目前可用或流行的工具的角度来考虑您的数据堆栈——这会让您受到工具及其发展方式的支配——您应该重新控制自己如何考虑您的数据堆栈,并插入满足您需求所需的工具。这并不意味着您不必做集成工具的艰苦工作,但是,至少,它应该帮助您合理地解释为什么您要做这项艰苦的工作!
我们在 Datacoral 的团队积极使用这种模式来构建我们的产品,并建议我们的客户和合作伙伴选择合适的工具来满足他们的需求。
通过分享这个模型,我们希望为数据团队提供一种更好的方式来理解他们如何将不同的工具融入他们的数据堆栈。最终,我们希望开始对话,以实现这个概念模型来构建一个更好、更具可伸缩性的现代数据堆栈。
谁应该关心?
无论您是 A 轮公司的首席技术官,还是刚刚开始重视数据(即,您没有在生产数据库上运行分析!)或者是一家老牌公司的数据主管,担心数据治理和数据管理成本,您可能希望升级您的数据堆栈,使数据变得更加复杂,同时还能:
- 更具可扩展性
- 更易于管理
- 比较便宜的
最重要的是,你们的目标很可能是一致的。构建一个系统来集成、转换、加载和分析您的数据对于您的成功至关重要。为了满足您的需求,市场上出现了数百种工具和技术来帮助公司移动、存储、操作、管理和治理他们的数据。这包括:
- 来自公共云的 PaaS 工具
- 开源工具
- 新的云原生 SaaS 工具
- 从 20 世纪 90 年代末到 21 世纪初,在职人员的数量很大,但正在减少
此外,数据堆栈的每个方面都有几个选项,如数据集成、查询引擎、ETL、数据治理、机器学习和数据可视化。
公司在升级他们的数据堆栈时面临的最大问题是理解选择什么样的工具组合。可供选择的工具太多了,而且不清楚一个工具的功能在哪里结束,另一个工具的功能在哪里开始。再加上不断出现的新工具,你永远不知道自己是否做出了正确的选择。但有一点是清楚的,无论你做出什么样的选择,你都必须花时间整合它们,解决所有不可避免的问题。此外,您的选择还会告知(或约束)您应该如何操作您的堆栈——基本上是决定您的数据堆栈的人员、流程和技术三位一体。
因为很难替换工具,所以问题是,“在接下来的两到三年里,什么样的分析堆栈能够很好地服务于我的组织?”
我们建议这样的栈应该是“元数据优先和元数据驱动的”一旦我们将元数据确立为不仅仅是信息性的,而且是整个数据堆栈的主要驱动力,我们最终会得到一个简单的三层框架,元数据层位于中间:
- 数据流层
- 元数据层
- DevOps 工具层
有了这些层,我们可以遵循关注点分离的原则,阐明我们如何考虑数据堆栈的每个部分,并理解不同的工具是如何嵌入的。
使用这样的框架,我们发现,当新的工具和系统变得可用或基于规模和复杂性需求变得必要时,很容易替换或适应新的工具和系统。
当前比赛状态
首先,让我们看看什么是最先进的现代数据堆栈。(我们提到的任何特定工具都只是为了说明一个现实的堆栈,以表明我们在端到端架构中使用不同工具的观点,而不是对特定工具进行评论。实际上,我们很钦佩这些工具提供的功能,并欣赏它们如何极大地改善了公司处理数据的方式。)
对于分析,Fivetran、dbt、Airflow 和 Looker on Snowflake 的组合目前非常流行(这篇文章很好地展示了其他常见设置)。虽然建立这样的数据堆栈比以前容易得多,但数据团队仍然面临着日常的挑战。例如,让我们以虚构的为医疗实践提供 SaaS 计费软件的 Acme 公司为例。他们的客户成功领导者 Alice 使用了一个 Looker 仪表板,该仪表板总结了他们所有的客户活动,包括哪些因素导致客户对产品不满意。
这款外形仪表盘是由他们的数据分析师 Bob 制作的,他是一名外形专家。他在 LookML 中构建了一些模型,但主要是向 dbt 发展,因为这样他可以更好地控制数据仓库 Snowflake 中直接可用的数据模型。
他们的数据工程师 Raj 建立了管道,使用 Fivetran 将 Salesforce、Zendesk 和 MySQL 产品数据库中的数据提取到雪花中。他还在 Airflow 中编写了几个小脚本来插入 Fivetran 没有提供的服务。他是一名有抱负的数据分析师,希望推动整个组织使用 dbt。他帮助 Bob 利用 dbt 将源表中的原始数据从 Fivetran 转换为派生表中的汇总数据。他通过气流精心策划了 dbt。这种设置在大多数时候都运行良好。
现在,Alice 注意到 Looker 仪表盘中的流失率与她对业务的理解不符,并认为数据有缺陷。接下来会发生什么?
在我们对数百家公司的采访中,我们发现了以下典型的工作流程来调试这一缺陷:

图片由 Datacoral 提供
- Alice 试图通过点击 Looker 仪表盘来深入了解,然后向构建仪表盘的数据分析师 Bob 提出问题。
- Bob 验证报告的查询是否准确,然后将接力棒交给负责数据管道的工程师(数据工程师、分析工程师或兼职数据工程师)Raj。
- Raj 然后查看从下游到上游任务的管道的每个部分:
- 标识报表中使用的仓库中的所有表。
- 找出这些表格的所有来源。有时它们是通过多重转换(通过 dbt)计算的派生表;其他时候,它们是直接来自摄取管道的源表(通过 Fivetran)。
- 在 dbt 控制台中导航到每个派生表的每个日志,查看是否有任何问题。当转换后的表被更新时,Raj 必须记下时间戳。
- 检查 Fivetran 的控制台和系统表中的日志,这些日志详细说明了每个表是如何被修改的。Raj 必须密切注意源表更新时的时间戳。然后,他必须将来自 Fivetran 的上下文与来自 dbt 的上下文缝合在一起,以获得数据流的全貌。在大多数情况下,他发现在 Fivetran 跨 Salesforce、Zendesk 和 MySQL 的不同连接器更新所有源表之前,运行 dbt 中的转换会出现数据问题。所以他必须确保当派生表被更新时 dbt 的时间戳运行。他必须登录到 Fivetran 控制台或查看雪花中的 Fivetran 系统表,以确定数据集成是否出了问题。如果 Fivetran 日志中没有任何问题,他仍然不能确定,因为数据集成工具没有提供数据质量保证。
- 最后,Raj 必须查看数据源系统中的潜在问题。如果 DevOps 不能调试这个问题,并且团队中没有人能够找到问题的根源,那么对于分析师 Bob 来说,这突然变成了一个高优先级的行动项目。在这种情况下,Bob 必须从头开始构建管道,以便与现有数据进行比较,从而确保 Alice 的需求能够得到支持。
对于真正复杂的问题,整个工作需要几个小时、几天,有时甚至几周。
现在想象一下,有另一个团队想要在相同的数据上建立机器学习模型。最重要的是,Acme 的 CISO 有一项任务,根据他们是否拥有 PII,对所有数据进行严格的访问控制。随着新系统的出现,您可以看到调试问题的复杂性呈指数级增长。Acme 最终得到了一个看起来像图的架构,其中每个系统都必须与其他系统进行对话。不同系统之间存在阻抗不匹配,导致集成变得困难和难以管理。
我们已经看到了参考架构图,如 Andreessen Horowitz 的思想文章中的“统一数据基础架构”,它试图将更多的工具和功能整合到他们所谓的新兴数据架构中。这些尝试显示了考虑整个数据堆栈所涉及的复杂性。他们似乎将正交的概念投射到一个更线性的数据流模型中,一些离群值并不真正适合该模型。在不同的盒子中有重叠功能的工具,加上多个集成点,导致几乎每对盒子之间都有箭头。这使得很难弄清楚现在和以后需要哪个工具子集,以及这些选择之间的权衡。此外,集成特定工具组合的复杂性留给了公司作为练习!数据和数据堆栈中的许多问题都可以归因于这种试图解决不同工具集成的粘合剂。
简化的三层框架
我们相信,如果我们首先考虑元数据,就有办法理清数据堆栈。一旦我们将元数据层建立为不仅仅是信息层,而是整个数据堆栈的主要驱动者,我们就可以遵循关注点分离的原则,并简化我们对数据堆栈每个部分的思考。
一旦我们确定了元数据层中的内容,我们就可以围绕它构建数据堆栈,并使元数据成为数据堆栈的驱动力。
然后我们得到一个概念模型,它有三层,很容易消除歧义。虽然不是所有当前的工具都遵循这种模式,但我们受到普遍提高元数据重要性的运动的鼓舞,我们认为它可以走得更远。也就是说,这三层看起来像这样:

图片由 Datacoral 提供
让我们看看每一层都有什么,然后我们可以考虑这些层如何相互作用。
第一层:数据流
这一层由存储、移动、转换或可视化数据的工具和系统组成。通常,大多数关于创建数据栈的文章都集中在这一层,因为这是实际数据流发生的地方。但是每个工具目前都在围绕元数据和 DevOps 工具做出自己的选择,这就是为什么整个数据堆栈会变得复杂。数据流层还包括不属于数据堆栈的系统,即:
- 源—数据所在的系统。例如,数据库、文件系统或 SaaS 系统。
- 目标—发布工具将数据推入的系统和应用程序。
数据流层包括使数据从数据源流向数据堆栈中的目的地的工具和系统。
- 接收工具—将不同来源的数据集中到数据存储中的工具。
- 商店——数据湖和数据仓库,尽管现在湖屋的流行概念正在出现。我们在这里做英语教学的固有假设。
- 转换工具-帮助清理、聚合和反规范化数据以进行分析的工具。我们还包括机器学习的构建功能和转换类别中的 ML 模型构建。
- 可视化工具—可视化已清理或聚合的数据以生成见解的工具。
- 发布/服务工具—发布报表、聚合或模型的工具,以便应用程序可以使用它们。
以上五个类别都有选项,我们将在下一篇文章中深入探讨为每个类别选择工具的注意事项。
第二层:元数据
元数据是很多东西!元数据包括数据的结构、创建数据的管道的配置、不同数据之间的关系以及其他属性(新鲜度、谁可以访问等等。).我们认为元数据驱动意味着控制数据的其他方面(访问控制、审计等。)或数据流(编排)也在元数据层。
元数据层由正在运行的系统所使用和生成的数据和数据流的几个方面组成。此外,我们认为编排逻辑也属于元数据层,因为它驱动数据流。因此,我们建议元数据层由以下内容组成:
- 模式/沿袭——任何数据系统的核心元数据。在最简单的层次上,模式是表和列的定义。表之间也可以有像外键这样的关系。沿袭是一种捕捉不同数据如何相互关联并理解一条数据是如何生成的方法?
- 统计数据—运行时元数据。这些是关于不同数据和数据流的指标,如不同的表大小、计算答案所需的时间、将数据从一个系统传输到另一个系统所需的时间等。这些统计数据可以优化数据流,了解系统中的瓶颈,了解数据量如何随时间变化,等等。收集的关键统计数据之一是数据质量指标,它提供了关于是否对完整和准确的数据进行分析的信息。
- 编排——元数据层的最关键的部分。虽然其他人已经探索了编排的重要性,但我们认为它非常重要,应该包含在元数据层中,因为编排必须是元数据驱动的。元数据的洞察力对于数据流本身变得至关重要,而不仅仅是收集和显示元数据。这有六个主要优点:
- 元数据总是干净的——如果元数据坏了,系统就坏了,必须有人来修复它。
- 现成的可观察性/可审计性—不需要特殊的工具,因为元数据总是最新的。
- 数据质量检查可以直接集成到编排中,无需额外的集成。
- 易于调试——沿袭和统计驱动数据流,因此可以自动捕获。这使得通过以易于使用的方式显示元数据的单一控制台来调试数据流中的问题变得容易。
- 像重新处理或完全刷新(历史同步)这样应该在整个数据流中传播的普通操作变得更容易管理。
- 创作工具可以访问静态和动态元数据,以帮助数据团队找出如何在不破坏数据管道的情况下对其业务逻辑进行更改。
4.访问控制——使用上面的#1,可以在粒度级别指定谁可以访问什么模式和表。基于角色和基于策略的访问控制都依赖于模式/沿袭来提供灵活性。
5.审核—跟踪任何数据或数据流发生了什么变化。如果编排是元数据驱动的,那么编排日志提供了一种自动审核这些更改的方法。来自访问控制的日志将提供对谁在系统上执行了什么操作的审计。
6.可观察性—使用元数据来观察数据如何在不同的系统中流动。
第三层:DevOps 工装
DevOps 工具层是数据团队用来构建和管理数据流以及管理其整体数据堆栈的实际接口。如前所述,数据层的大多数现有工具都有自己的 DevOps 工作流,因此团队在处理数据流的不同部分时必须在工具之间切换。这些团队使用的工具类型包括:
- 创作工具
- 不同的类型包括带有拖放框和箭头的画布、基于 web 的表单或用 SQL、Python 等编写的代码。,并在源代码版本控制系统中进行管理。
- 创作工具可以(在实际运行任何更改之前,即静态地或在编译时)提供对数据流的一部分所做更改的可见性。拥有健壮或可查询的血统将允许这一点。(这是它与元数据层的联系方式。)
- 创作工具可以使用元数据统计数据来确定更改的代价有多大,或者将处理多少数据,以帮助用户确定要构建什么。
2.测试
- 团队应该能够在将变更推向生产之前对其进行测试。
- 测试不应干扰生产。
3.部署
- 变革必须容易推动。
- 更改管道的时间对于保持数据流平稳运行至关重要。开发运维团队依靠部署自动化(嵌入到元数据中)在正确的时间将变更推送到管道中。这确保了团队不会在不知情或没有人工干预的情况下意外破坏数据。例如,如果您要对下游也有每日转换的数据管道中的每小时转换进行更改,您需要确保在一天结束之前不会将更改应用于每小时转换,这样每日转换就不会以每小时转换的一半旧版本和一半新版本结束。
4.监视
- 有了正确的运行时元数据,调试问题就容易了。
- 自动捕获的沿袭允许您轻松跟踪数据管道中的问题。
- 当上游发生变化时,弄清楚哪个下游处理可能会受到影响也很简单。
包含这三层的框架使您能够考虑数据堆栈的人员、流程和技术选择。虽然当前的系统和工具通常对每一层都有默认的方法,但是您可以通过采用我们的思维方式来做出自己的数据堆栈设计选择。鉴于许多工具具有重叠或冗余的功能,使用现有工具构建数据堆栈的关键是理解这些工具为每个不同的图层做出的默认选择。在此基础上,您可以选择满足三层需求的合适组合。
下面,我们提供了一个示例,说明如何使用三层框架来理解当今创建数据堆栈时常用的工具和服务:
Fivetran
- 数据层 —卓越的摄取能力,有限的转换能力
- 元数据层 —模式、表、运行时日志、连接器如何更改的审计日志、获取数据的所有连接器调用的日志、关于同步的行数但不是数据质量指标的一些统计数据、通过与元数据无关的时间表的编排
- DevOps 工具层——基于表单的 web UI,没有版本控制,可能使用连接器管理 API 编写程序,不太涉及测试
DBT
- 数据层—SQL 中出色的转换能力,其他语言没有
- 元数据层 —模式、表格、沿袭、变更审计、运行可观察性、无访问控制、无编排
- DevOps 工具层—Git repo 中的 SQL 文件,用于监控、部署的 web UI,无流程编排
气流
- 数据层 —无功能
- 元数据层 —运行的编排和可观察性,无模式、无沿袭、无访问控制
- DevOps 工具层—Git repo 中的 Python 代码,用于测试和监控的 web UI
雪花
- 数据层 —使用 SQL 进行存储、转换,并使用 Javascript 和 python 限制转换能力
- 元数据层 —模式、表、访问控制、用于查询规划的统计,但是没有数据质量指标,没有沿袭
- DevOps 工具层 — Web 工作台或 JDBC
旁观者
- 数据层 —通过 lookml 进行转换,可视化
- 元数据层 —模式、表、访问控制、某种传承
- DevOps 工具层——UI 上的 lookml 以及 git 集成,一些测试
希望上面的例子解释了如何使用框架来理解您从每个系统或工具中得到什么,无论是通过设计还是作为您选择的系统做出的选择的工件。
一旦您有了从工具组合的每一层中得到什么的清晰地图,您就可以开始考虑人员、流程和操作您的数据堆栈的技术的三元组的人员和流程部分。根据 DevOps 工具的复杂程度或手工程度,您可以决定雇佣数据工程师或数据操作人员。当有一个以上的系统需要处理时,您可以弄清楚应该采用什么样的流程来简化如何进行变更和调试问题。
正如你所想象的,以这种方式将每一个工具详尽地映射到三层是一项艰巨的工作,不是我们计划要做的事情。我们希望这个框架能引发这样的对话,这样,作为一个行业,我们可以帮助公司为他们做出正确的决定。
正如我们前面提到的,有了这个框架,有希望让你有意识地选择你的工具,而不是为你的数据流需求的特定部分挑选一些工具;然后才惊讶于它们如何与其他工具相适应,或者包含它们如何改变您的数据堆栈的人员和流程。
我们在 Datacoral 做了什么?
在 Datacoral ,我们使用该框架来通知我们基于云的数据集成和数据管道的实施。我们从集中式元数据和元数据驱动的编排的核心实现开始。我们对在数据和开发运维层构建的所有组件的数据和元数据接口进行了标准化。不再只是收集和显示元数据,元数据现在是实际数据流本身的一部分,同样的 Alice/Bob/Raj 解决问题的工作流程变得简单了许多。

图片由 Datacoral 提供
通常,Bob(分析师)或 Raj(数据工程师)拥有相同的界面,能够快速查明任何问题,因为我们的中心元数据层驱动着编排。Bob 可以专注于业务,而 Raj 可以花更多时间建模数据,而不是调试管道中的数据质量问题。
结论
在本文中,我们与您分享了:
- 我们如何选择工具的框架
- 一种思考数据堆栈以及为什么应该首先考虑元数据的方式
- 一瞥元数据优先实现如何简化过程
在 Datacoral,虽然我们从这些原则开始,但我们知道,在处理公司面临的所有数据堆栈问题时,我们甚至还没有触及表面。我们希望阅读本文的任何人都能够对如何开发自己的数据堆栈有一个清晰的框架。
此外,我们希望这篇文章引发一场关于我们数据行业如何降低公司必须考虑其数据堆栈的复杂性的对话。如果你对我们的元数据优先的论文有任何想法,请给我们发邮件到 hello@datacoral.co 的。
数据科学求职者的 4 大错误
办公时间
我已经面试了 90 多名数据工作职位的候选人。以下是那些不成功人士最常见的错误

Clem Onojeghuo 在 Unsplash 上的照片
在过去的 12 个月里,我们为 Hotmart 的数据科学团队雇佣了大约 10 名新的数据专业人员。从实习生到高层,你可以想象各种不同的简历申请数据分析师和数据科学家的工作。我从这些候选人身上学到了很多东西,我希望能教给他们每个人一些新的东西。在此期间,我发现了那些不幸在招聘过程中失败的候选人的一些共同点。
马斯洛的锤子
当我对候选人进行技术评估时,我从不定义她必须用来解决问题的单一工具或编程语言。我认为,通过开放选项,候选人将能够利用创造力和实验来测试不同的方法。大多数时候它是有效的,但在某些情况下却是相反的。

很多时候,候选人试图用一个单一的解决方案来解决所有的问题。当他失败时,他说他没有办法解决那种情况。这种情况的一个例子是当一个人认为每一个聚类问题都是用 K-means 解决的;或者说,如果你不能用脸书的先知来创建一个模型,你就不能预测一个时间序列;或者简单地认为每个问题都可以用机器学习来解决。
如何解决这个问题:你需要把注意力放在问题上,而不是你正在使用的工具上。每天,人们都会向你寻求“一个人工智能来解决这个问题”和“一个模型来预测这个问题”;但是你的第一个问题不应该是“我应该用什么算法?”,而是“他们想解决什么问题?”。
杰出的编码技能,糟糕的沟通
有时候——实际上是大多数时候——我们需要将一个技术概念翻译给一个非技术人员,这并不容易。不管我们是在解释一个指标是如何计算的,或者为什么模型做出了一个预测,我们的大部分工作都是在沟通中进行的。

有时候,利益相关者看起来像外星人。我们需要找到“物种”之间的共同交流
在一些候选人中,我注意到他们有很好的技术能力,但是他们没能交流结果。当我们就他们的解决方案提出问题时——这是一个业务人员通常会问的问题——他们没有抓住要点,没有解释为什么他们选择了一种特定的方法。
如何解决这个问题:你必须有一个很好的理由来选择你提出的解决方案,这个理由可以是基准、以前的经验或实验——例如,你可以说“在测试过的解决方案中,这个更好是因为 ABC 的原因”。此外,您必须知道您的解决方案的缺陷,它的缺点是什么,以及如何改进它。
机关枪片段
这个题目基本上是上面那个问题的延伸。人们沟通失败的原因之一是把讲故事放在一边,专注于在解决方案中吐出尽可能多的代码。在极端的情况下,我收到的评论代码混合了camelCase和snake_case;带有混合不同语言的注释,等等。这不足以淘汰一名候选人,但这显示出缺乏严谨性。
在大多数情况下,缺乏讲故事:候选人在交替使用代码时没有机会解释他们的方法。在像 Hotmart 这样的公司中,技术测试先于与团队的初始对话,这可能是进入下一阶段或被淘汰的区别。
如何解决这个问题:从 StackOverflow 复制一个代码片段没有问题。我必须自己一天做几次。但是,一定要有眼光,提醒自己要讲好故事。对于“好的代码不需要注释”的想法,我有自己的保留意见,当我们谈论数据科学家和数据分析师的工作时,像 Jupyter Notebook 这样的工具——广泛用于招聘过程——为我们提供了一些非凡的东西:将故事与代码合并的可能性。
他们不知道公司是做什么的
这是候选人可能犯的最大错误,尤其是申请数据科学职位的人。我不是说你需要了解 Hotmart 的一切, 但是你至少要知道,公司是做什么的。但是,为什么这很重要呢?

巴西贝洛奥里藏特的 Hotmart 总部
几个月前,我用巴西葡萄牙语写了一篇关于 Hotmart 招聘数据科学职位的文章。我强调的一点是,我们的技术测试模拟了我们团队中这个专业人员的日常生活。我们创造一些需要回答的商业问题,你对 Hotmart 的商业模式了解得越多越好。
不只是 Hotmart 有这个问题,很多公司都有同样的问题。你将在一个与业务非常相关的职位上工作,知道公司如何赚钱,它的主要竞争对手是谁,以及它的商业模式是什么,这是你最起码需要的来拥有相对于其他候选人的竞争优势。
找到正确的预测汇总级别
要建立一个完美的需求预测流程,您需要做好四件事:粒度、时间性、指标和流程。

西奥多·加勒·纳奇·范·德·斯特雷特(Stradanus),约 1589 年至约 1593 年
谈到需求预测,大多数供应链依赖于用月度时段填充 18 个月的预测。这应该被认为是一个最佳实践,还是仅仅是一个默认的、被忽略的选择?我见过无数供应链在不相关的汇总层面预测需求——无论是物质层面、地理层面还是时间层面。在本文中,我提出了一个新颖的四维预测框架,它将使您能够为您的供应链建立一个量身定制的预测流程。我喜欢用这个框架来启动任何预测项目。
准确的预测是不够的。
你需要一个有用的。
四维预测框架
支持决策的需求预测
供应链是每天做出数百个——如果不是数千个——决策的生命体。为了做出最好的决定,你需要正确的信息。大多数供应链的决策依赖于需求估计。因此,你的需求预测是做出正确决策的关键信息。一个*有用的** 预测应该可以让你的供应链提高服务水平,更好地计划,减少浪费和总体成本。由于需求预测用于触发具体行动,因此应在正确的汇总级别完成,使用相关指标进行跟踪,并由高效的审核流程提供支持。
*我故意用‘有用’这个词,而不是‘准确’。预测可能是准确的,但与采取适当的决策无关。
简而言之,预测需求永远是达到目的的一种手段,而不是目的本身。
当建立一个预测过程时,你将不得不跨越四个维度来设置它:粒度、时间性、度量和过程(我称之为四维预测框架)。
我们将逐一讨论这些方面,并根据您需要做出的决策建立我们的需求预测流程。一旦你知道你需要做什么样的决定(例如,生产多少,在哪里部署库存,是开还是关工厂),根据这个框架建立你的预测过程应该很容易。

四维预测框架(版权所有:Nicolas Vandeput)
1.粒度
您应该首先为您的预测确定正确的地理和材料粒度。
- 🗺️ 地理。您是否应该按国家、地区、市场、渠道、客户群、仓库、商店进行预测?
- 📦材料。您是否应该预测所需的每种产品、细分市场、品牌、价值、重量和原材料类型?
要回答这些问题,你必须考虑你的供应链基于这一预测所采取的决策。请记住,只有当预测有助于供应链采取行动时,它才是有意义的。
让我们讨论几个例子:
- 让我们假设您需要决定将哪些产品从您的工厂运送到您的区域仓库。在这种情况下,按仓库区域汇总需求并直接在此地理级别预测需求可能是个好主意。
⚠️注意到,根据该仓库完成的历史订单预测仓库需求是一种不好的做法,因为物流约束可能会影响历史发货(有时,一个仓库服务于另一个仓库通常区域的客户)。
✅相反,您应该预测仓库应该服务的地理区域的需求,而不考虑实际服务这些订单的仓库。换句话说,您应该根据在没有约束的情况下仓库应该满足的来预测仓库需求。 - 另一方面,这里有一个不好的例子:许多供应链仍然预测每个国家的需求,即使他们有多个仓库服务于同一个国家的不同地区。在这种情况下,需要做出的决定(我们应该在哪个仓库发货)和用于做出这些决定的信息(我们将在这个国家卖那么多)之间存在明显的差异。这种差异通常会导致仓库之间的库存分配不当。
- 我们可以想象许多其他的用例:如果你的生产过程需要生产各种特定包装的产品,你应该预测每个包装。在回顾您的预测时,您应该讨论是什么影响了每种包装类型的比率:商业活动、促销等等。
- 如果不同的仓库(或流程)服务于不同的销售渠道,您应该分别进行预测。另一方面,如果你只有一个仓库,你应该问自己是否真的需要对每个地区进行预测,或者在全球范围内进行一次预测是不够的。
2.暂时性
一旦您知道您将在哪个粒度级别上工作,您就应该选择正确的预测范围和时间聚合(时段)。许多供应链坚持预测未来 18 或 24 个月的需求,尽管需求规划者和任何其他从事预测工作的人的时间都是有限的。你需要选择一个有限的视野来关注。
- 🗓️颞聚合。您应该使用什么时间聚合时段(每日、每周、每月、每季度或每年)
- 🔭地平线。你需要预测多少期(一个月、半年、两年)?
同样,你应该通过思考你的供应链试图优化/实现什么以及这些决策所涉及的提前期来回答这些问题。
让我们举两个例子:
- 你的供应商需要提前三个月收到月度订单。您应该使用月度时段和 3 个月的时间跨度(M+1/+2/+3)。任何超出 M+3 的预测都不应该是你关注的重点。
- 如果您需要一个预测来了解将哪些货物从您的中心仓库运送到您的本地仓库,您应该关注一个相当于您的内部提前期(通常是几天或几周)的展望期。
❗ 模型和预测视野。统计模型可以轻松地对无限长的时间范围进行预测。机器学习模型就不是这样了。因此,你可能不得不坚持使用统计模型进行长期预测。
3.韵律学🎯
通常,实践者会忽略预测指标的问题。实际上,为预测过程/模型选择正确的指标非常简单,而且它将对最终的预测产生深远的影响。根据所选的指标,你可能会过分重视异常值(RMSE 弱点),或者冒预测有偏差的风险(美国市场弱势)。关于预测 KPI 的详细讨论,请参见我的文章预测 KPI:RMSE、梅伊、MAPE &偏差、这里。[1]
以下是选择正确预测指标的一些建议:
- ❌ 避开 MAPE。许多从业者仍然使用 MAPE 作为预测指标。这是一个高度扭曲的指标,会加剧预测不足。避免它。
- ✅ 联合关键绩效指标。通常,查看 KPI 的组合(如 MAE & Bias)将是一个很好的折衷方案,使您能够跟踪准确性和偏差,同时避免大多数陷阱和陷阱。
- ✅ 跟踪一致偏差。如果您观察到特定项目的持续偏差(超出/低于预测),这是模型/预测流程出现问题的重要线索。
- 💡加权关键绩效指标。在我的书 供应链预测的数据科学 的第二版中,我建议在整体指标计算中根据其盈利能力、成本或整体供应链影响对每个产品(或 SKU)进行加权。这个想法是,你想更多地关注最重要的 SKU。这一点尤其重要,因为我们希望找到一个支持您的供应链的指标:您的预测指标的高分应该与业务价值一致。
除了数学之外,将预测 KPI 与所需的材料和时间粒度保持一致也很重要。例如,假设您有兴趣从海外供应商处订购提前期为 3 个月的货物。在这种情况下,您应该测量+1、+2 和+3 个月的预测范围内的准确性,或者更好的是,计算三个月的累积误差,而不是只查看+1 个月达到的准确性。
4.加工⚙️
现在您已经知道了您的材料和时间聚合、范围和度量,您可以设置一个过程。这个过程应该用三个具体方面来定义。
1。 利益相关。 谁来审核预测?
提出不同的观点——利用各种信息来源——将有助于做出更准确的预测。但这只有在审查过程彻底完成的情况下才能正确完成(否则,准备好面对影响之战)。
2。 **周期性。你什么时候回顾预测?经常更新你的预测可能会提高它的准确性(因为你手头有更新的数据)。然而,过于更新它可能经常会造成混乱,因为你对需求变化反应过度,为有限的附加值消耗太多资源。
3。 **回顾过程。你如何回顾预测?
任何预测流程的核心都应该是对预测附加值的衡量。跟踪每个团队成员的增值将使您能够提高预测过程的效率(并细化相关的预测周期和利益相关者)。**
📖预测增值框架。一个预测流程框架,它跟踪每个团队/流程步骤相对于基准(或前一个团队的输入)的附加值。它是由迈克尔·吉利兰在 21 世纪 10 年代设想和推广的(见他的书这里)。[2]
概述
让我们用三个例子来概括一下:
- 短期预测。让我们想象一下,你需要每周决定向你的商店运送什么。预测可以每周更新,展望未来几周。粒度将是每个商店的 SKU。由于您需要每周填写预测,因此查看预测的时间有限。从今以后,只有少数需求计划者应该验证它。这里通常应该首选黑盒机器学习模型。
- 中期预测。你要评估未来几个月要生产什么。这是典型的 S & OP 预测,您需要从许多利益相关方(销售、财务、营销、计划者、客户、供应商)那里收集信息。预测可以在全球范围内按 SKU 生成(并测量其准确性),每月一次。
- 长期预测。你需要为来年制定预算。这是一个非常综合的长期预测(最有可能在每个品牌/细分市场的价值/收入水平上进行)。要创建各种场景(基于定价、营销、新产品介绍),您将需要使用一个因果模型,在该模型中可以设置和讨论输入的权重。应该避免机器学习模型,因为它们是一个黑箱,并且由于缺乏数据而难以进行长期预测。
👉我们在 LinkedIn 上连线吧!
来源
[1]范德普特,N. (2019)。预测关键绩效指标:RMSE,梅,MAPE 和偏见,走向数据科学。https://towards data science . com/forecast-KPI-RMSE-Mae-mape-bias-CDC 5703d 242d
[2]吉利兰,M. (2010 年)。商业预测交易:揭露神话,消除不良行为,提供切实可行的解决方案。新泽西州霍博肯的约翰·威利父子公司**
关于作者
icolas Vandeput 是一名供应链数据科学家,擅长需求预测和库存优化。他在 2016 年创立了自己的咨询公司 SupChains ,并在 2018 年共同创立了 SKU 科学——一个快速、简单、实惠的需求预测平台。尼古拉斯对教育充满热情,他既是一个狂热的学习者,也喜欢在大学教学:自 2014 年以来,他一直在比利时布鲁塞尔为硕士学生教授预测和库存优化。自 2020 年以来,他还在法国巴黎的 CentraleSupelec 教授这两个科目。他于 2018 年出版了 供应链预测的数据科学(2021 年第 2 版)和 2020 年出版了 库存优化:模型与模拟 。

你的公司可以建立的 4 种“数据护城河”
公司如何利用数据创造竞争优势,实现更大的增长

Joran Quinten 在 Unsplash 上拍摄的照片。
2019 年 10 月,耐克宣布将由约翰·多纳霍取代其 13 年的首席执行官马克·帕克。多纳霍不是来自体育界,而是一名资深的科技高管,曾在易贝、贝宝和云计算公司 ServiceNow 高调任职。
耐克聘请了一位技术领袖担任首席执行官,标志着该公司向电子商务、技术和数据驱动型业务的重大转变。正如达伦·罗维尔所说,耐克希望成为“一家碰巧销售鞋子和服装的科技公司。”哈佛商学院网站上的一篇文章甚至问道:“耐克会是下一个科技巨头吗?”
对于一家运动服装公司来说,这一举动可能看起来很奇怪,但耐克并不是第一家让科技领导者掌舵的非科技公司。
2021 年 6 月,法拉利宣布其新任首席执行官 Benedetto Vigna(一位在微芯片行业拥有 26 年和 200 项专利的技术老手)作为从豪华跑车转向电动引擎等更新创新的努力的一部分。同样,2020 年 3 月,西门子任命 Roland Busch(领导西门子数字化进程的前首席技术官)为新任首席执行官。西门子以在第一次工业革命中创造设备和硬件而闻名,现在它将基于云的软件视为自己的未来。
这些公司对科技的拥抱反映了 2020 年代的一个新标签——数据十年。随着各行各业的首席执行官们纷纷投资下一代机器学习、人工智能、自动化和硬件马力,数据分析正成为每家公司商业模式的核心。正如福布斯所说,现在“每家公司都是数据和分析公司”。
作为 Atlan 的创始人,我有幸花了大量时间与 CEO 和 CDO 谈论他们的数据战略。随着时间的推移,我意识到,在各个行业中,公司可以通过四种主要方式利用数据为自己创造优势,实现更大的增长。

图片由 Atlan 提供。
1.数据作为运营优势
红杉资本(Sequoia)的 Shailendra Singh 曾经讲述了 Gojek 的第一任首席执行官 Nadiem Makarim 的故事,这个故事现在已经成为一个传奇,他痴迷于超级应用的增长数据。
传说中,Gojek 的董事会成员不是每月一次,而是每天更新超级应用测量的关键指标和过去一天的运动。Makarim 使用这些工具几乎每小时跟踪一次指标,并对可能出现的问题形成直观的认识。这种对使用数据来建立运营优势的狂热关注推动了 Gojek 成为一名青年和《财富》杂志“改变世界的 50 家公司之一”的旅程。
Gojek 的故事是一个将数据作为运营优势的故事。这是世界上每个公司都可以建立的数据护城河。它是关于理解推动您业务的关键杠杆和指标,然后使用它们来显著改善运营。
运营优势意味着首席执行官和首席债务官能够近乎实时地回答关键业务问题,比如“我们是否达到了日常的关键绩效指标?”或者“我们的转化率有下降吗?”
使用数据建立运营优势的一个关键方面是让日常决策者能够获得和理解数据。这包括技术用户和非技术用户,从数据分析师和工程师到营销人员和产品经理。
更进一步,像优步这样的大公司已经找到了使数据民主化的方法——人们不仅可以找到数据,还可以分析和使用数据。优步使公司中的每个用户都可以在特定的、动态的基础上查询数据。据估计,优步的基础设施每天运行超过 40 万次查询。
其他公司甚至通过推广数字扫盲走得更远。例如,Airbnb 创建了数据大学和后来的数据密集型,为 Airbnb 的任何人提供数据教育,根据角色和团队进行扩展。在 800 多门数据课程和数千个“座位”之后,Airbnb 的日常 SQL 用户比例从 7%飙升至 62%,对数据团队的临时请求减少了 50%。
2.数据作为战略优势
每个季度,你的公司都会做出一些非常关键的战略决策。如果你是一家产品公司,这可能是在回答这样一个问题,“我应该关注哪些用户群?”如果你是一家超本地化的物流公司,你可能会问,“我应该扩展到哪些城市?”
这些决策可以使用不同级别的数据成熟度来做出,但这些决策背后的数据越精细、越真实,新战略就越有可能帮助超越竞争对手。
例如,在我过去的生活中,我有机会与前三大石油公司和印度政府合作,开设 10,000 个新的液化石油气中心。
获得清洁的烹饪燃料在印度是一个巨大的问题,因此石油和天然气部希望将液化石油气炉灶带给 8000 万生活在贫困线以下的妇女。这一计划的一部分是开设 10,000 个新的液化石油气配送中心——不仅仅是在任何地方,而是选择能够接触到最有需要的人并产生最大影响的地点。
我们从 3 家石油公司关于 17,000 个现有液化石油气中心的销售、位置和客户的数据开始。然后,我们将这些数据与来自 600 多个来源的关于人口、富裕程度、基础设施、液化石油气渗透率等外部数据进行合并。有了这些数据,我们可以根据哪些村庄附近没有液化石油气中心,以及哪些村庄有足够的市场潜力来支持新中心,来确定每个新中心的最佳位置。
3.推动核心产品优势的数据
第三种优势是公司利用数据推动核心产品优势。
这方面最好的例子是网飞。十年前,你可以说网飞的竞争优势是它的视频软件。现在,情况肯定不是这样。虽然视频流媒体服务很常见,但网飞在一定程度上是因为它的数据而向前迈进的。
凭借多年的用户数据,网飞了解我们每个人的品味、喜好和厌恶。其中一部分来自其不太基础的用户数据,例如,跟踪完成率、停止和开始时间、一天中的时间以及观看行为(例如,暂停、快进、倒带等)。)对于我们流式传输的所有内容。
此外,网飞的数据来自其对不同类型内容的微观分类——甚至早在 2014 年就有超过 76,000 种微观类型。网飞使用 1000 多种标签类型,根据时间段、情节、情绪等对内容进行分类。不要看喜剧或恐怖片,想想“对抗体制的情感纪录片”或“基于现实生活的关于皇室的时代片”。
所有这些来自数百万用户的用户数据意味着网飞可以个性化其推荐,以保持每个人不断着迷和疯狂观看最新的节目。例如,网飞推荐引擎可以预测你会喜欢节目 X,因为喜欢你最喜欢的节目 Y 的人也喜欢节目 X,这由你观看相关微流派节目的模式来支持。
这个庞大的数据护城河——基于超过 2 亿客户14 年的流媒体数据——使得拥有更好流媒体服务的新创公司很难超越网飞。
数据作为基本商业护城河的其他例子包括优步的供需匹配算法和 Gmail 的“智能撰写”自动完成功能——这两个功能都是由这些巨头长期收集的专有数据提供支持的。

网飞原创音乐的几个流派。(图片由作者提供。)
4.数据货币化:数据驱动新机遇
最后一种商业护城河是将你公司的数据本身转化为商业机会。虽然古老的例子包括像脸书和谷歌这样的广告网络,它们利用用户数据来提供高度有针对性的广告,但还有大量数据驱动的业务的独特应用。
以网飞为例,今天网飞正在利用人们观看的数据来创作非常适合观众的新电视节目和电影(称为网飞原创)。网飞可以获得的这个独特的数据宝库意味着,它可以让好莱坞最好的制片人物有所值。
“我们总是利用我们对会员喜欢看什么的深入了解(也就是分析和数据)来决定网飞上有什么节目……如果您继续观看,我们会继续添加更多您喜欢的内容。”
–珍妮·麦凯布,网飞全球媒体关系总监
以网飞制作的第一部电视剧《T4》《纸牌屋》《T5》为例。这对网飞来说是一项巨大的投资。它击败了 HBO 和 AMC 等主要电视频道,获得了《纸牌屋》美国版的版权,预计两季的价格超过 1 亿美元。
为什么网飞要进行一场当时看来似乎是巨大的赌博?答案很简单。网飞不认为这是一场赌博,因为它的数据显示认为纸牌屋会成功。
网飞知道喜欢英国原版《纸牌屋》的人也喜欢凯文·史派西和大卫·芬奇的电影,它最受欢迎的电影之一(《社交网络》)也是由大卫·芬奇执导的。由大卫·芬奇和凯文·史派西执导的《纸牌屋》的重拍似乎是显而易见的。
网飞还利用其数据做出决定,比如应该取消或重启哪些节目,或者应该关注哪些类型的节目。
例如,网飞从其数据中意识到,浪漫电影中存在一个缺口,好莱坞多年来一直在回避这个缺口。从几年前开始,网飞开始制作一系列浪漫喜剧——不仅仅是为情人节,而是全年。这些包括从青少年电影像《亚历克斯·奇爱》和《接吻亭》到更成人化的选择像《设置它》和《像父亲一样》。结果很明显——网飞的爱情电影在媒体上爆红,超过三分之二的订户在 2017 年 3 月至 2018 年 3 月期间观看了一部爱情电影。
附言:我强烈推荐阅读道格拉斯·兰尼的https://www.gartner.com/en/publications/infonomics信息经济学,这是一本很棒的书,详细介绍了将你的数据作为一种资产进行估值以及将数据作为一种新的商业机会进行货币化的所有渠道。**
那么,如何开始围绕数据构建“数据护城河”或竞争优势呢?在我的下一篇文章中,我将解开一个四步优先化框架,它可以帮助每个人——从初出茅庐的初创公司创始人到财富 500 强的首席执行官——优先化您的数据投资,并创造最大的投资回报。
注册我的 Substack 简讯,在你的收件箱里收到下一篇文章!
觉得这个内容有帮助?在我的时事通讯《元数据周刊》上,我每周都写关于活动元数据、数据操作、数据文化和我们的学习建设的文章。 在此订阅。
绝对初学者必须学习的 4 门数据科学课程
“我被所有可用的资源淹没了;我该怎么办?”

图片由 Pikisuperstar 在 Freepik 上提供
“有的是资源,我很困惑自己走的路对不对。你能帮我吗?”她忧心忡忡地告知。
我想尖叫,“你一直做得这么好——我不敢相信你甚至怀疑自己!”但我忍住了,让她说完她的想法。
给你一个背景,我是一名高级数据科学家,在空闲时间,我指导数据爱好者进入数据科学领域。我期待着这些互动,因为它们让我了解初学者面临的问题以及我如何才能更好地提供帮助。
他们最近提出的问题令人震惊和担忧。
“有很多关于如何成为数据科学家的信息,多到令人应接不暇。资源很充足,我很迷茫我是否走对了路。你能帮我吗?”
令人震惊的是,不是一个而是很多我的学生有这种担心。尽管他们做得很好,但他们经常需要保证,并希望我回顾他们的进展。
虽然我很乐意尽我所能提供帮助,但我意识到这可能是大多数初学者的通病。因此,我想在找出原因后找到解决办法。
不是你——是我们
我们给你 52 周的路线图,25 份资源表,7 份备忘单,101 页的 pdf 文档,希望你不会不知所措。每隔一周就会有一篇关于成为数据科学家的新博客,我们希望你能从中筛选出最好的。
这显然不公平。作为一个初学者,你将很难相信自己走在正确的道路上。有些事情必须改变;我想我会尽可能地简化数据科学入门的过程。
这篇文章将只给你 4 个必须学习的基础资源,你可以用它来开始你的学习。然后,最后,我会告诉你一些有力的事实来帮助你保持专注。
我们开始吧,好吗?
帮助您入门的 4 门基础课程
如果你是一个绝对的初学者,关掉互联网上所有的噪音,按顺序学习这些课程。你也可以同时进行,如果你坚持按计划进行,你不应该花超过 6 个月的时间。下面提到的所有 4 门课程都是免费观看的,只需要付费就可以获得认证。
1.用 Python 应用数据科学
该课程由密歇根大学提供,以专注于数据科学的方式教授 Python。它从数据争论到数据分析到可视化到文本挖掘和网络分析。它将带您逐步完成一个编程之旅,而无需深入理论。
这是全面了解机器学习工作流程的良好开端。练习和作业有助于课程的实践性。所以试一下这门课,你就会知道我在说什么了。
2.用 Python 统计
跳过统计数据很诱人,但迟早你会后悔的。我在这上面耐心投入的时间是值得的。慢慢的,我开始理解所有的统计学概念。
这门课程包含许多例子、案例研究和练习,对初学者很有帮助。到目前为止,我在工作中使用这些概念,您必须在早期就对这些主题有所了解。
3.吴恩达的机器学习
当你通过这门课程时,你会感觉到慢慢进入数据科学和机器学习。包括我在内的许多专业人士将我们的大部分知识归功于这门单一的课程。
唯一的缺点是这门课是从 2012 年开始的,并且使用 Matlab/Octave 做作业。你可以在 YouTube 上学习同一门课程中的 python 作业。
【2022 年 7 月 5 日更新】吴恩达更新了他十年的机器学习课程,现在课程使用 python,这绝对是机器学习的必学课程之一。这是 Coursera 上的课程。
4.数据科学的 SQL 基础知识
大多数人忽略了 SQL——数据的语言,直到他们意识到它的重要性。
迟早,你会被要求在日常工作中大量使用 SQL——有些角色完全专注于 SQL,所以你必须尽早掌握它。我尝试了多门课程,但这门课程直接从数据科学家的角度关注我们需要什么。
如果你学完专业的前两门课程,就已经足够了。最后两个非常高级,只有当您开始在分布式环境中处理大数据时才会有所帮助。
这里有一些严峻的事实,让你在旅途中保持专注
现在上述课程总有替代方案。会有很多人争论 Python 与 R、项目与课程、实践与理论优先,以及哪个课程最适合每个主题。以下是所有这些想法的真相:
- 观点是有偏见的,是基于个人喜好的。
- 在数据科学领域获得成功的途径不止一条。
- 太多的信息,也就是信息超载,让你不知所措,让你偏离了所有的道路。
- 要成为一名数据科学家,你需要始终专注于至少一条道路。
- 你选择的道路必须是简单的,这样才能帮助你采取行动。
本文关注的是入门所需的最低要求。我希望你不用太担心就采取行动。所以,下次我的学员对外面的所有资源感到困惑时,我会发给他们这个。
我相信当你完成这些后,你会清楚下一步需要学习什么,以及如何申请工作。如果你仍然不确定,请随时联系——我非常乐意帮助你。
作为披露的提示,本文可能会有一些附属链接来分享我使用过的最好的资源,而不会给你带来额外的费用。感谢您的支持!
要获得更多关于进入数据科学、真实体验和学习的有用见解,请考虑 加入我的电子邮件好友私人列表 。
如果你很看重这类文章,想支持我这个作家,可以考虑 报名成为中等会员 。每月 5 美元,你可以无限制地阅读媒体上的故事。
https://arunnthevapalan.medium.com/membership
学习 Python 数据科学的 4 个阶段
你现在处于什么阶段?

如果你一直在自学 Python,可能你看了无数的教程,跟随了许多指南来获得这种技能,但是你怎么知道你已经走上了掌握这种数据科学基本技能的正确道路呢?
Python 是一种令人惊叹的编程语言,在与数据科学关系不大的领域都有应用,比如 web 和游戏开发。这就是为什么,在本文中,我们将了解您是否正在学习数据科学所需的 Python 知识,并了解您处于哪个阶段。
对于数据科学来说,Python 有 4 个阶段,我将描述它们,并给出如何掌握每个阶段的技巧,这样你就可以进入下一个阶段。
阶段 Python 的基础知识

这个阶段是为任何学习 Python 基础的人准备的。这些基础知识不仅涵盖了数据科学家应该知道的东西,也涵盖了任何想要开始 Python 之旅的人应该知道的东西。
在这个层次上,你至少应该知道数据类型和变量等基本概念。了解存储数据最流行的选项(列表、字典和元组。)这个级别是必须的。此外,您应该能够使用条件语句和控制流工具。这包括 if/else 语句、布尔运算和不同类型的循环(for、while 和 nested)。
条件语句、控制流和循环为您使用 Python 做各种各样的事情打开了大门,所以请使用它们并保持好奇心,为下一阶段打下坚实的基础。
对于这个级别的有抱负的数据科学家来说,最后一件重要的事情是开始熟悉 Jupyter Notebook 。Jupyter 是数据科学家的首选计算笔记本,因为它允许用户不仅创建代码,还可以创建方程、可视化和文本。这使得它成为数据科学家简化端到端数据科学工作流的完美工具。
主题:数据类型、变量、列表、字典、元组、条件、运算符、控制流(if / else)、循环、可迭代、函数、文件 I/O 操作(读取、写入文本文件)、常用方法。
如何掌握这个水平?正如我之前提到的,解决涉及条件语句、控制流和循环的问题将帮助你掌握第一阶段。这个清单上的前三个项目都涉及这种东西。此外,解决简单的游戏,如井字游戏,刽子手,猜数字,问答游戏和蛇将有所帮助。
阶段 2:用于数据分析的 Python

这就是我所说的“数据科学所需的基本 Python 材料”这意味着至少对用于数据分析的库有一个基本的了解,比如 Pandas、NumPy、Matplotlib 和 Seaborn。
使用这些库来解决常见的数据科学任务,如数据清理、通过可视化进行的探索性数据分析(EDA)以及功能工程,在这一级别非常重要。这个数据清理项目和这个 EDA 项目涵盖了其中的大部分主题。如果你能理解代码,那么你就在这个阶段。除此之外,确保您熟悉 Pandas 和 Numpy 中使用的大多数方法/函数。如果你知道这本熊猫指南和熊猫指南涵盖的所有内容,你就处于这个阶段。
关于你在第一阶段已经知道的东西,仍然有改进的空间——特别是你作为数据科学家经常使用的东西。其中一些是 list comprehension、lambda、zip()、f-string 和with语句。我写了一篇文章解释他们如何处理代码。
</7-tips-to-level-up-your-python-code-for-data-science-4a64dbccd86d>
最后但并非最不重要的一点是,获得网络搜集等数据收集的必要技能将有助于你脱颖而出,成为一名数据科学家。这里有一个完整的 web 抓取指南,它包含了你掌握 Python 这一技能所需要知道的一切。
主题:Pandas、NumPy、Matplotlib、Seaborn、web 抓取库(Selenium 和 Scrapy)中使用的大部分方法/函数。列出 comprehension、lambda、zip()、f-string、with语句以及任何其他有助于编写更好代码的东西。
如何掌握这个水平?解决 Python 项目。在这个阶段,项目通常涉及到前面提到的所有数据分析库。确保你开始的项目有你感兴趣的主题。例如,我喜欢体育分析,所以我解决了这个和这个 Python 项目,其中涉及到使用大量的 Pandas、Numpy 和 Selenium 方法。下面列出 4 个网页抓取项目,选出你最喜欢的,解决。
第 3 阶段:Python 用于统计和数学

第三阶段是数据科学的不同领域走到一起,所以你的 Python 项目会变成数据科学项目。从阶段 2 开始,您已经知道如何清理数据和进行 EDA,但是您还应该知道数据科学背后的所有基本统计学和数学。
统计学对于确保用于训练模型的数据没有偏差至关重要。例如,使用 Matplotlib 和 Seaborn 绘制直方图和箱线图将帮助您识别异常值。除此之外,您应该知道如何将大多数统计概念应用于 Python 中的数据科学项目。比如如何处理不平衡数据,对训练/测试数据进行分段,公式化一个问题和假设。
你应该知道的一些数学主题是函数和矩阵。这个东西是通过 Numpy 在 Python 中实现的。该库支持大型多维数组和矩阵,以及大量高级数学函数来操作这些数组。
另一件你应该了解的重要事情是机器学习算法是如何工作的。这些算法背后有大量的数学和统计数据,所以在学习构建这些算法的 Python 代码之前,请确保您已经理解了它们。以下是关于 11 种最常见的机器学习算法的指南。
主题:不平衡数据、分段训练/测试数据、机器学习算法、数组/矩阵(Numpy)、数据可视化(Matplotlib/Seaborn)。最重要的是,知道如何将统计学和数学的主题应用于 Python 中的数据科学项目。
如何掌握这种水平?用 Python 解决数据科学项目。其中一些是情感分析、信用卡欺诈检测和客户流失预测。你可以在这篇文章中找到 5 个用 Python 编写的数据科学项目,选出你最喜欢的。
阶段 4:用于机器学习的 Python

最后一个阶段是开发机器学习模型。scikit-learn 库是这方面的一个良好开端。使用这个库应该能够做的一些基本事情是文本表示(BOW、计数矢量器、TF-IDF)、模型选择、评估和参数调整。本项目涵盖了所有这些主题。如果你能理解代码,那么你就在这个水平。
对于这个级别的数据科学家来说,其他重要的库是 Keras 和 TensorFlow。Keras 具有创建神经网络所需的几个构建模块和工具,如神经层、激活和成本函数、目标等。TensorFlow 是在 Python 上使用机器学习的最佳库之一。它使机器学习模型的建立对初学者和专业人士来说都很容易。
主题:文本表示、模型选择、评估和参数调整等。
如何掌握这一水平并超越?这取决于你感兴趣的领域。找一个你喜欢的领域,专攻它,学习你需要的必要的库。例如,如果你对 NLP 感兴趣,学习 NLTK 和解决像构建电影推荐系统或聊天机器人这样的项目会帮助你在这方面起步。
就是这样!现在你知道了学习 Python 数据科学的 4 个阶段。你现在处于什么阶段?
与 3k 以上的人一起加入我的电子邮件列表,获取我在所有教程中使用的 Python for Data Science 备忘单(免费 PDF)
如果你喜欢阅读这样的故事,并想支持我成为一名作家,可以考虑注册成为一名媒体会员。每月 5 美元,你可以无限制地阅读媒体上的故事。如果你使用我的链接注册,我会赚一小笔佣金。
https://frank-andrade.medium.com/membership
证明你 Python 知识水平的 5 个证书
有时候,拥有一个证书可能是你需要的验证

照片由 Pexels 的 Olya Kobruseva 拍摄
Python 是许多应用程序流行和常用的编程语言之一。Python 是通用编程语言;也就是说,您可以使用它为各种各样的应用领域编写代码。您可以使用 Python 来构建 web 应用程序、桌面应用程序、执行一些科学计算,或者,如果您正在阅读本文,学习并实现各种数据科学概念。
有时候,你学习 Python 的唯一目的是学习一门编程语言——这是我十年前学习这门语言的目的——而不是为了某个特定的目的去学习使用它。但是,不管你开始学习 Python 的原因是什么,在你的旅程中,你都需要证明你的知识或者验证你的努力。
在我们继续之前,我必须说,你并不真的需要一个证书来获得做 Python 的工作,只要你能证明你的知识。此外,拥有 Python 证书并不意味着你会马上得到这份工作,但这将是对你简历的宝贵补充。
</5-ways-to-write-more-pythonic-code-a33069f968c>
作为开发人员或数据科学家,我们总是致力于提高我们的技能。我们总是在学习。我们一直在建设,有证书只会让我们的作品集或者简历更扎实。我们可以通过不同的在线平台学习 Python 或数据科学,免费或收费。
通过这些技能,你可以得到你想要的工作,但是如果你想让你的简历更好,这篇文章是给你的。本文将介绍 5 种 Python 证书,你可以用它们来证明你的 Python 知识水平。
Python 研究所颁发的证书 OpenEDG
也许最重要和最受关注的 4 个 Python 证书是由 Python 研究所提供的。这些证书涵盖三个不同层次的知识,初级,中级和高级。
№1: PCEP(认证入门级 Python 程序员)
将从入门级 Python 测试 PCEP 开始。这是一个 45 分钟的测试,费用为 59 美元,主要包括拖放、填空或多项选择问题。
由于该测试的目标是入门级知识,因此它将侧重于核心 Python 概念和基本命令,如基本格式和输出方法、编译语言和解释语言之间的差异、基本数据类型和它们之间的转换,以及控制流语句(条件语句和循环)。它还涵盖了逻辑操作、函数、列表切片和字符串操作。
</9-discord-servers-for-math-python-and-data-science-you-need-to-join-today-34214b93d6b8>
接下来是中级证书,也就是 PCAP。由于这个测试比 PCEP 更高级,它包含更多的问题,需要更长的时间来完成,准确地说是 65 分钟。PCEP 测试费用为 294 美元,主要由选择题和基于 Python 3.x 的代码题组成
该测试涵盖了与 PCEP 相同的概念。它超越了入门级别,进入了一些中级知识,如名称范围问题、Pyton 中的调制、面向对象编程的基础、Python 中的数据结构操作以及错误和异常的处理。
№3:pcpp 1(Python 编程 1 认证专家)
继续学习更高级的证书。Python 研究所 OpenEDG 为更高级的 Python 用户提供了两种证书。第一个是 PCPP1,一个 65 分钟的测试,费用为 195 美元,由多项选择和 Python 3.x 编码问题组成。
该测试侧重于反映申请人在高级面向对象编程概念及其在 Python 中的实现、图形用户界面设计和 Python 编程以及文本文件处理方面的经验和技能。它还涵盖了元编程、PEP (Python 增强建议)和编码的使用,以及与一些 Python 库和模块的交互。
№4:pcpp 2(Python 编程 2 认证专家)
为高级 Python 用户提供的第二个证书是 PCPP2。该证书与 PCPP1 相似,需要 65 分钟的考试,费用为 195 美元。这个测试超越了 PCPP1 的高级概念。区分这两种测试的一个简单方法是将 PCPP1 视为 Python 内的高级测试,PCPP2 负责为用户打包和分发 Python 代码。
PCPP2 解决了你写完 Python 代码并发布给公众后会发生什么。所以,它测试的是打包和分发代码到 PIP 的知识,打包设计模式,网络编程,处理和与数据库交互,以及测试你的工作。
</6-best-python-ides-and-text-editors-for-data-science-applications-6986c4522e61> [## 数据科学应用的 6 个最佳 Python IDEs 和文本编辑器
towardsdatascience.com](/6-best-python-ides-and-text-editors-for-data-science-applications-6986c4522e61)
微软提供的证书
Python 证书的另一个已知来源是微软。目前,一个微软提供的证书通常位于大多数 Python 在线学习课程的末尾。这个证书主要是测试 Python 中的入门级知识。
№5: 微软 Python 认证考试(98–381)
如果你是一个初学者,并且除了 Python Institute OpenEDG 证书之外还想有其他选择,那么微软 98–381 证书是最适合你的。这个证书花费 127 美元,测试你对 Python 作为一种编程语言的基本理解,以及如何驾驭它。该证书通常在 Python 在线入门课程结束时提供。
该考试测试您在以下方面的知识:编写语法正确的 Python 代码、处理和操作不同的数据类型、编写正确的控制流语句、使用基本的输入和输出命令,以及使用不同的模块和工具编写 Python 代码来解决特定问题。
最后的想法
Python 是目前使用最多的编程语言之一。那是因为它用途广泛,可以用于各种应用领域。如果你正在做数据科学,研究一个科学课题,或者学习计算机科学,那么你很有可能曾经使用过 Python,现在还在使用它,或者计划将来学习和使用它。
</6-machine-learning-certificates-to-pursue-in-2021-2070e024ae9d>
因为这种多功能性,你可以为了特定的目的学习 Python,比如 web 开发的数据科学。因此,你可能会想参加这方面的证书考试。这可能会使获得 Python 中的通用证书变得不值得争论,但事实并非如此;获得通用 Python 证书有多种好处,包括:
- 有确凿的证据证明你在 Python 方面的专业知识。
- 会给你成就感。
- 它为您的 Python 技能提供了具体的验证。
所以,如果你已经精通 Python,并且想让你的简历更强大,试试我在本文中提到的证书。如果你是编程世界的初学者,想要证明你的知识和验证你的努力,这些证书可以帮助你完成。不管你是否选择获得这些证书,如果你能证明你的技能,你就能得到你想要的工作。
5 分钟学习:用 R 语言创建漂亮的、地理上精确的交通地图
学会准确绘制伦敦地铁网络
我正在尝试一篇名为“5 分钟学习”的临时文章,我试图在 5 分钟或更短的阅读时间内教授一种有用的技巧。在第一次尝试中,我们将看看如何创建一个地理上准确的伦敦地铁网络图(不像我们经常看到的那样)。如果你有正确的数据,你应该能够很容易地将这项技术应用到其他交通网络。
要做到这一点,我们需要一个数据集,我们可以用它来构建一个以站点为顶点的图。我在 Github 上找到了一个 JSON 数据集,我把它转换成顶点和边的csv并把它放在 Github 上。我添加了来自 OpenStreetMap 的每个车站的坐标,以及来自伦敦交通时尚指南的地铁线路和每条线路的官方颜色。让我们下载这些套件:
londontube_vertices <- [read.csv](https://rdrr.io/r/utils/read.table.html)("[https://raw.githubusercontent.com/keithmcnulty/ona_book/main/docs/data/londontube_vertices.csv](https://raw.githubusercontent.com/keithmcnulty/ona_book/main/docs/data/londontube_edgelist.csv)")head(londontube_vertices)## id name latitude longitude
## 1 1 Acton Town 51.5028 -0.2801
## 2 2 Aldgate 51.5143 -0.0755
## 3 3 Aldgate East 51.5154 -0.0726
## 4 4 All Saints 51.5107 -0.0130
## 5 5 Alperton 51.5407 -0.2997
## 6 7 Angel 51.5322 -0.1058londontube_edgelist <- [read.csv](https://rdrr.io/r/utils/read.table.html)("[https://raw.githubusercontent.com/keithmcnulty/ona_book/main/docs/data/londontube_edgelist.csv](https://raw.githubusercontent.com/keithmcnulty/ona_book/main/docs/data/londontube_edgelist.csv)")head(londontube_edgelist)## from to line linecolor
## 1 11 163 Bakerloo Line #AE6017
## 2 11 212 Bakerloo Line #AE6017
## 3 49 87 Bakerloo Line #AE6017
## 4 49 197 Bakerloo Line #AE6017
## 5 82 163 Bakerloo Line #AE6017
## 6 82 193 Bakerloo Line #AE6017
现在我们将使用 R 中的igraph包从这两个数据帧中创建一个 graph 对象:
library(igraph)# create graph object
(tubegraph <- igraph::[graph_from_data_frame](https://rdrr.io/pkg/igraph/man/graph_from_data_frame.html)(
d = londontube_edgelist,
vertices = londontube_vertices,
directed = FALSE
))

看起来不错。我们还可以使用我们的 edgelist 来创建不同管线和管线颜色的参考,以便在任何可视化中使用:
# create a set of distinct line names and linecolors
lines <- londontube_edgelist |>
dplyr::[distinct](https://dplyr.tidyverse.org/reference/distinct.html)(line, linecolor)head(lines)## line linecolor
## 1 Bakerloo Line #AE6017
## 2 Central Line #F15B2E
## 3 Circle Line #FFE02B
## 4 District Line #00A166
## 5 Docklands Light Railway #00A77E
## 6 East London Line #FBAE34
现在,让我们暂时忽略地理定位,让我们用ggraph()绘制这个网络的图,使用它的默认布局。
library(ggraph)# visualize tube graph using linecolors for edge color
[set.seed](https://rdrr.io/r/base/Random.html)(123)
[ggraph](https://ggraph.data-imaginist.com/reference/ggraph.html)(tubegraph) +
[geom_node_point](https://ggraph.data-imaginist.com/reference/geom_node_point.html)(color = "black", size = 1) +
[geom_edge_link](https://ggraph.data-imaginist.com/reference/geom_edge_link.html)([aes](https://ggplot2.tidyverse.org/reference/aes.html)(color = line), width = 1) +
[scale_edge_color_manual](https://ggraph.data-imaginist.com/reference/scale_edge_colour.html)(name = "Line",
values = lines$linecolor) +
[theme_void](https://ggplot2.tidyverse.org/reference/ggtheme.html)()

随机布局的伦敦地铁网络(作者生成)
现在,我们能如此容易地制作这个很好,但是对于任何了解伦敦的人来说,这没有任何地理意义。因此,我们需要改变布局和比例,以便我们可以根据地理坐标绘制顶点。
要做到这一点,我们需要通过连接到顶点数据帧来转换我们的边列表,使其具有“从”和“到”地理坐标:
# reorganize the edgelist
new_edgelist <- londontube_edgelist |>
dplyr::[inner_join](https://dplyr.tidyverse.org/reference/mutate-joins.html)(londontube_vertices |>
dplyr::[select](https://dplyr.tidyverse.org/reference/select.html)(id, latitude, longitude),
by = [c](https://rdrr.io/r/base/c.html)("from" = "id")) |>
dplyr::[rename](https://dplyr.tidyverse.org/reference/rename.html)(lat_from = latitude, lon_from = longitude) |>
dplyr::[inner_join](https://dplyr.tidyverse.org/reference/mutate-joins.html)(londontube_vertices |>
dplyr::[select](https://dplyr.tidyverse.org/reference/select.html)(id, latitude, longitude),
by = [c](https://rdrr.io/r/base/c.html)("to" = "id")) |>
dplyr::[rename](https://dplyr.tidyverse.org/reference/rename.html)(lat_to = latitude, lon_to = longitude)
# view
[head](https://rdrr.io/r/utils/head.html)(new_edgelist)

这看起来不错。现在,我们将重新创建图形对象,以确保存储新的边数据:
# recreate graph object to capture additional edge data
tubegraph <- igraph::[graph_from_data_frame](https://rdrr.io/pkg/igraph/man/graph_from_data_frame.html)(
d = new_edgelist,
vertices = londontube_vertices,
directed = FALSE
)
现在,我们可以使用ggmap在我们的网络上铺设一张谷歌地图,并使用我们刚刚创建的“起点”和“终点”坐标来绘制车站。请注意,如果你从未使用过ggmap,你需要先用谷歌地图 API 设置它——参见这里的获取说明。
[library](https://rdrr.io/r/base/library.html)([ggmap](https://github.com/dkahle/ggmap))
londonmap <- [get_map](https://rdrr.io/pkg/ggmap/man/get_map.html)(location = "London, UK", source = "google")# layer a London map
[ggmap](https://rdrr.io/pkg/ggmap/man/ggmap.html)(londonmap, base_layer = [ggraph](https://ggraph.data-imaginist.com/reference/ggraph.html)(tubegraph)) +
[geom_node_point](https://ggraph.data-imaginist.com/reference/geom_node_point.html)([aes](https://ggplot2.tidyverse.org/reference/aes.html)(x = longitude, y = latitude), color = "black", size = 1) +
[geom_edge_link](https://ggraph.data-imaginist.com/reference/geom_edge_link.html)([aes](https://ggplot2.tidyverse.org/reference/aes.html)(x = lon_from, y = lat_from,
xend = lon_to, yend = lat_to,
color = line), width = 1) +
[scale_edge_color_manual](https://ggraph.data-imaginist.com/reference/scale_edge_colour.html)(name = "Line",
values = lines$linecolor)

地理精确的伦敦地铁地图(作者生成)
很可爱。如果你能得到正确的数据,我很想看看你能否为其他城市或交通网络重现这一点。
最初我是一名纯粹的数学家,后来我成为了一名心理计量学家和数据科学家。我热衷于将所有这些学科的严谨性应用到复杂的人的问题上。我也是一个编码极客和日本 RPG 的超级粉丝。在 LinkedIn 或Twitter上找我。也可以看看我在drkeithmcnulty.com上的博客或者我即将发布的 关于人物分析的教科书 。
数据可视化的 5 个最重要的原则
数据可视化
高于一切,显示数据。——

用最简单的话来说,数据可视化是数据的图形化表示,用于理解模式和交流见解。
我想我们现在都意识到了 dataviz 在当前时代的重要性。但是,我们仍然需要关注创建有效和真实的可视化的基本原则。误导、混乱和不切实际的可视化很常见,甚至是由我们当中著名的 dataviz 设计师和记者创建的。
"展示数据有两个目标:传达你的故事和建立可信度."——爱德华·塔夫特****
遵循这五个原则来创建引人注目的和胜任的可视化:

作者图片
1.说实话
我知道这听起来很明显,但不幸的是,它需要说。有太多的图表通过展示扭曲的数据和投射虚假的叙述误导了读者。
主持人的工作是通知观众,而不是影响他们。
避免这三种误导的方法,以确保你的图表是清晰和诚实的。
A.省略基线
通常,除非另有说明,否则图表的基线应该从零开始。通过从不同的数字开始基线,它可以使数据的感知产生偏差。这种技术用于使数据点之间的差异看起来比实际更大。

图片来自venengage并附有作者的说明。
B.违背传统
绘制数据时有一定的惯例。较大的条形表示较大的数量,较大的面积表示较大的数值。通过违背常规,观众不知不觉地被引向一个错误的推论。

图片来自venengage并附有作者说明。
C.精选数据
当只有几个数据点被绘制成一个误导性的趋势时,就是精选。这是用来误导或欺骗观众的最常见的策略之一。

图片来自 Aspect 博客和作者的说明文字。
2.了解你的受众
通常情况下,您会创建数据可视化来与受众交流信息。如果信息没有被传达,那么创建 viz 的全部意义就失去了。
用他们想看到的方式展示你所拥有的。
一个好的数据可视化应该与受众产生共鸣,为了确保这一点,请遵循以下指导原则
- 根据工作角色显示数据。
- 考虑与 dataviz 主题相关的受众的教育和专业知识。
- 对种族和文化价值观保持敏感。
- 关注听众在专业术语、统计数据、语言方面的素养。
“数据是强大的。但是一个好的故事,是令人难忘的”——丹尼尔·韦斯伯格
在这里,我谈四种情况,你应该选择你的数据,即根据你的观众。
A.基于工作角色
您应该向高层管理人员提供高层次的数据,但不要有太多的细节,同时应该向各个部门展示一个总体情况,其中包含他们特定部门的更多细节。

来自 Flaticon 和 Propmodo 的图像。作者的说明。
B.基于技术素养
根据受众的统计和可视化知识使用图表和数字。您可以根据最终用户显示或多或少复杂的信息和图表。

图像来自数据面板和excel dashboard school。作者的说明。
C.基于背景知识
如果听众对某个问题没有预先的认知,你必须把重点放在事实和数字上。当观众需要更多关于他们已经知道的问题的知识时,展示更多细节和外围信息。

D.基于情感倾向
这是一个好主意,对喜怒无常的观众使用情感诉求,而对务实的观众更注重事实陈述。

3.选择正确的图表
使用错误的图表就像有良好的意图,但执行不力。
- 根据数据类型和要传达的信息选择图表。
- 不要为了变化而使用不同的图表,因为特定的图表比其他图表更有效地传达特定类型的信息。
- 如果不需要,不要使用任何图表,只显示数字。
正确的图表增强了信息,错误的图表隐藏了洞察力。
下面,我就分享一些例子。要了解更多细节,请查看参考资料和类似的文章:
****
A.条形图而不是饼图
在显示比较时,条形图通常比饼图更好。区分条形的长度比区分扇形的大小更容易。

图片来自venengage并附有作者说明。
B.当饼状图真正有用的时候
饼图非常适合显示整体的一部分,但只有当部分数量很少并且部分之间的差异很明显时。

图片来自venengage
C.线形图而不是条形图
折线图通常比条形图更适合显示一段时间内的对比情况。此外,折线图对于显示趋势或模式非常有用。

图片来自 Excel Easy 并附有作者说明。
D.只有数字而不是任何图形
当需要突出显示某个具体数字时,只使用数字而不使用图表可能会很有效。一两个数字很容易掌握,可以产生很大的影响。

4.强调最重要的事实
数据可视化可以对许多数据点进行编码,因此要突出最重要的事实,以便更快、更有影响力地传达信息。
省略无关紧要的来突出本质!
通过去除噪音,例如不必要的网格线、轴和标签,你可以将注意力集中在最重要的事实上。使用颜色、大小和图案来强调特定的数据点或重点区域。
“没有信息过载这回事。只有糟糕的设计。”—爱德华·塔夫特
以下三个案例说明了如何强调你想传达给观众的信息。
A.排除杂念
除了使用正确的图表,战略性地使用颜色和文字也很重要。此外,如果有一个结论性的结果,你应该在可视化中增强它。

来自 Visme 的图片和作者的说明文字。
B.增强本质
用标题来传达 viz 的症结,去掉任何不相关的网格、标签和亮色,是很有帮助的。您还可以使用参考线和文本来引起对特定点的注意。

图片来自故事用数据说话,走向数据科学文章。作者的说明。
C.突出重要的
可以使用不同的颜色甚至不同的色调/阴影来强调重要的数据点并突出需要注意的区域。

图片来自 Vennage
5.形式应该服从功能
美学是重要的,但不应该以失去重点为代价。清晰地传达信息比没有价值的赏心悦目的图表更重要。
数据可视化的目的是洞察,而不是图片。
直观的设计比吸引人的图表更重要,图表应该以易于理解的方式传达数据的含义。
"混乱和杂乱是设计的失败,而不是信息的属性."—爱德华·塔夫特
有很多这样的图表——这里有两个看起来很有趣也很漂亮,但并没有成功地向观众传递价值。

来自 Unicode 和analytic al的图像。作者的说明。
“如果我们有数据,让我们看看数据。如果我们只有意见,那就用我的吧。”—吉姆·巴克斯代尔
数据是一种无价的资源,数据可视化是分析和交流数据中有趣的想法和见解的最有效的工具之一。但是构思糟糕、创建错误或完全不真实的可视化错过了可视化数据的全部要点。记住这些基本原则,让你的可视化效果更有影响力,更丰富!
数据科学项目的 5 P
关于如何成功管理数据科学项目的动力和见解

汤米·阮在 Unsplash 上的照片
管理数据科学项目需要几个因素和部分。本文将为您提供五个关键要素:目的、人员、过程、平台和可编程性[1],以及您如何在项目中从这些要素中获益。
P 1:目的
就像在项目管理的经典方法中一样,目标或目的应该总是明确的。可能的例子有:
- 更好的商业洞察力
- 欺诈预防/检测
- 预言;预测;预告
- 最大化问题等。
大数据或数据科学领域的项目必须有特定的目的或目标。你永远不应该因为每个人都在做一个项目而漫无目的地工作,因为这对你或你的公司都没用。
P 2:人
拥有不同技能的各类人员在数据科学项目中扮演着重要角色。为了成功地处理数据,开发人员、测试人员、数据科学家和领域专家是必不可少的。

敏捷数据科学团队—作者图片
此外,利益相关者/项目发起人和项目经理/产品负责人参与数据项目。在这种关系中,前一组人必须被告知项目的进展,而后一组人的任务是在涉众和开发团队之间进行协调。更多关于如何具体组建团队的信息可以在这里【2】阅读。
P 3:流程
数据科学项目中有两种主要类型的流程:组织流程与技术流程。下表列出了两种流程方法的问题:
你必须考虑两种不同类型的过程。一方面组织流程和主题如:

组织流程与技术流程——作者图片
第 4 页:平台
除了上述因素,与您将使用什么平台进行分析和产品有关的基本和战略性问题对于成功管理数据科学项目也至关重要。可能的提问示例如下:
- 我的 IT 治理在中指定了什么?
- 我追求哪些(IT)策略?
- 以前的(IT)架构?
- 一两个速度呢?
- 我的法规遵从性/安全性要求什么?
因此,这些问题会导致更多的疑问,例如:
- 数据集成应该如何实现?(通过 Java 手动操作,而不是使用 talend、Dataflow 等工具。)
- 应该使用哪种云?(AWS 对 Google 对 Azure 以及
公有对私有对混合) - 我的技术要求是什么?
- 什么 SLA 最适合我的需求?(服务提供商和客户之间的合同)
如果您想了解更多关于如何构建数据分析平台的信息,这篇文章可能会让您感兴趣。
P 5:可编程性
最后,你要想好你要用哪些工具和编程语言?这一点当然也是由 IT 治理和战略以及对上述问题的回答所决定和影响的。
工具和编程语言的例子有:
- 编程语言:SQL,Python,R
- 大数据工具:Hadoop、谷歌的云存储&大查询、AWS 红移和 S3
- 流媒体软件:Kafka,Spark,talend
- BI 工具:Tableau、Qlik、Google Data Studio
结论
当在数据科学项目中工作甚至管理它们时,您会认识到应该考虑各种因素。上述五个 P 将为您提供成功管理数据科学项目所需的最重要信息。此外,他们会问你一些你在项目中可能会问自己的问题。要了解更多信息,您可以点击下面的链接。
资料来源和进一步阅读
[1] Kaggle ( Ravi Chaubey ),什么是数据科学??5 P 的!! (2020)
[2]克里斯蒂安·劳尔,如何建立一个现代数据分析平台 (2020)
人工智能将改变法律行业的 5 种方式
回到 2016 年,在我攻读(税法)硕士学位期间,我们被告知,五年内 40%的律师将被电脑取代。对我来说,这是从事数据科学职业的原因之一。现在,五年过去了,事实证明法律行业的自动化程度比预期的要高。法律实践与技术有很大不同,法律流程需要大量的领域知识。尽管如此,在法律人工智能的科学领域还是取得了很大的进步。这项研究的目标不是自动化,而是提高法律专业人员工作的质量、知识和速度。在这篇文章中,将讨论法律人工智能的 5 个发展,它们将帮助未来的法律专业人士。

来源:西装自带 photoshop +场景
合同风险分析和尽职调查
去年,开源项目发布了两个独特的法律数据集。法律学生和志愿者标记了数千份尽职调查报告和法律合同。他们标记了必须审阅的重要部分,而不是不需要人工审阅的大部分文本。如今,律师和并购专家花大量时间阅读厚厚的合同和报告。这被认为是工作中比较无聊的部分。有了这两个新的数据集,改进的模型被训练以提取需要审查的部分。模型不仅被训练来提取重要的部分,而且被训练来按类别对它们进行分类,如下图所示:

来自:【https://arxiv.org/pdf/2103.06268.pdf
对于管辖法律和到期日期标签,模型提取和预测 95%的正确标签。但是对于“不起诉契约”的标签,这个数字只有 15%。总体提取精度目前还不足以帮助律师使用该模型,但随着更多的数据和更好的模型,这种情况有望很快改变。
合法元素检测
在人工智能研究领域,自然语言处理是一个主要的子领域。通过在维基百科的所有文章,甚至互联网的所有可用文本(普通爬行)上训练模型,这些模型在某种程度上理解语言和信息是如何构造的。BERT 模型能够根据上下文回答问题。法律工作的一部分是检查(案例)法的某些条件是否得到满足。例如,要成为盗窃,必须满足三个条件。1)必须在未经物主同意的情况下将物品从他人的占有中取走,2)必须将物品带走,3)必须有偷窃的意图。BERT 模型可用于部分分析法律文档,并检查是否满足某些条件。当 BERT 模型以警方报告为背景时,它可以正确地回答关于犯罪的问题:

截图自 Pragnakalp.com
如果你想用你自己的文本和问题来试试,你可以在这个网站上查看一个演示:
https://www.pragnakalp.com/demos/BERT-NLP-QnA-Demo/
下一步是用法典编纂和判例法本身代替问题,以检查是否符合法律条件。这将需要(大量)具体的研究,因此这种解决方案可能需要一段时间才能投入商业使用。
字母生成
一种已经在使用的解决方案是字母生成。一些小的法律问题,比如吸引人的停车罚单,通常是大批量的工作。给市政府或法院的信通常是相同的,只有个人信息需要调整。法律费用很少,所以这是自动化的理想选择。在美国和英国,不付钱是存在的。这是一个帮助你解决各种小的、标准的法律问题的应用程序:
摘要
法学院的学生必须熟记大量的判例法。判例法的摘要可以广泛地用来学习法律规范。一旦这些学生获得学位,他们必须跟上每周发布的新判例法。法律专业人士还必须阅读大量其他文件。缺少总结导致律所自己总结。这消耗了相关法律专业人员的大量时间,他们无法为客户工作。
摘要有两种方法:提取和抽象。摘要是选择文档中最重要的句子,并将这些句子作为摘要。抽象概括是生成概括了文档核心的新文本。摘要是一项困难的任务,大多数人可能会对同一个文档产生不同的摘要。
2020 年,谷歌发布了所谓的 Pegasus 模型。在一些数据集上,该模型实现了类似人类的性能,这意味着一个测试组的大部分人更喜欢 Pegasus 生成的摘要而不是人类生成的摘要。在下面的例子中,首先显示原始文本,然后是人工摘要(标签),最后是 Pegasus 生成的摘要:

飞马座的例子
Pegasus 模型也在 BigPatent 数据集上进行了训练。这是一个包含专利和人类专利摘要的数据集。Pegasus 获得了迄今为止所有模型中最好的 Rouge-score(语言模型的性能测量指标),得分为 53%,这意味着生成的摘要中有 53%的单词与人类摘要中的相同。
我测试了 Pegasus 的案例法总结。这不是很有效。一个特定的判例法摘要数据集将解决这个问题。飞马座的好处是只需要 1,000 个概要就可以得到最新的结果。
法律判决预测
法律人工智能中比较炒作的一个部分是法律判决预测。这个领域的目标是在已知案件事实的情况下,预测法庭案件的结果。2019 年,本文使用欧洲人权法院的英文法律预测数据集显示了有希望的结果。经过训练的模型能够以超过 90%的精确度预测一个法庭案件是否违反了人权条款。预测哪一条被违反的任务显然更难。该模型仍然能够正确预测超过 65%的病例。
目前有可能预测一个潜在的法院案件上诉是否有机会赢得欧洲人权法院。下一步是向数据中添加更多的司法领域,这样就可以预测更多的法庭案件。附加价值将是为客户快速检查一个案例是否有希望。
本文评述了法律人工智能的五个主要发展。我选择这 5 项技术是因为它们每年都被大量研究和改进。按照这种速度,从现在到 10 年,这 5 项技术将在法律行业实现商业化和应用。
6 种常见的开源许可证及其含义
了解许可证,知道选择哪一个

罗曼·辛克维奇在 Unsplash 上拍摄的照片
开源软件是计算机科学和编程史上最有影响力的创举之一。短语“开源”指的是开放给人们使用的东西。因此,开源软件是一种向公众开放的软件,在这里可以使用、修改和研究源代码。
通常,开源项目包括许多人用于各种应用程序的源代码。当一个项目是开源的,程序员将可以访问源代码来添加功能,修复损坏的部分,并在它不能正常工作时检查它。此外,因为开源代码给了人们修改代码的权力,开源许可证的创建是为了规范这个过程,让程序员清楚他们能做什么,不能做什么。
开源许可证——有时也称为 copyright left 许可证——要求任何发布开源应用程序的人发布一套规则,规定人们如何使用、更改和修改这些代码。做任何开源许可不允许的行为都会被认为是非法的,违反了许可的规定。
对于人们来说,这些许可证可能很难理解,坦率地说,需要阅读和理解它们的含义以及如何为您的应用程序选择正确的许可证。如果你需要帮助为你的项目选择许可证,试试这个工具。
免责声明:在本文中,我将尽力介绍 6 种最常用的开源许可证的基本规则。也就是说,如果你打算使用这些许可证中的任何一个,你应该仔细阅读它的文档,如果你还有任何问题,请咨询律师。将本文作为了解开源许可世界的入门指南。
№1: GNU 通用公共许可证(GPL)
当我第一次加入开源世界时,GNU 是我最熟悉的许可证;GNU 一度对我来说意味着开源。GPL 许可是我们列表中版权最多的许可。copyright left 许可证是那些要求修改后的作品与原始作品共享同一许可证的许可证。因此,如果你正在修改的作品是在 GPL 许可下,你的作品也是如此。
任何 GPL 许可都允许将许可材料用于商业用途。所以,你可以建立在 GPL 作品的基础上,并在你的工作场所使用它。如果你愿意,你也可以为你修改的作品申请专利。最后,如果你在一个更大的项目中使用一点 GPL 许可的作品,那么整个项目也必须是 GPL 许可的,这就是为什么 GPL 是开源许可中版权最多的。
</5-data-science-programming-languages-not-including-python-or-r-3ad111134771>
№2: Mozilla 公共许可证(MPL)
接下来我们有另一个 copyleft 许可证,它是 Mozilla 公共许可证。MPL 比 GPL 许可证有更弱的左版权要求。MPL 和 GPL 之间的区别在于,如果您修改最初在 MPL 许可下发布的代码,您可以选择您想要的任何许可,只要修改保存在与 MPL 许可材料分开的文件中。
使用 MPL,您可以申请专利,并且可以将修改后的材料用于商业用途,用于私人工作,或者您可以对修改进行封闭源代码,只要它与代码的 MPL 许可部分分开。
№3: Apache 许可证
从 copyleft 许可证转移到不需要继承原始许可证的许可许可证,我们将从Apache 许可证开始。Apache 许可证由 Apache 软件基金会(ASF)发布和修改;该许可证的第一个版本发布于 1995 年。
Apache 许可证让开发人员可以自由选择在哪个许可证下发布他们的作品,只要他们提到原始许可证并记录对许可材料所做的更改。你也可以选择对你的一些材料进行闭源,并且可以在商业上使用许可的作品或者获得专利。
</5-git-commands-that-dont-get-the-hype-they-should-d62af563acaa>
№4:麻省理工学院许可证
接下来是许多开发者最喜欢的许可证——包括我自己——麻省理工学院许可证。麻省理工许可证是一个许可许可证,最初由麻省理工学院在 80 年代末发布。许多人更喜欢这种许可证的原因是它很短,简单明了,清楚地说明了什么是允许的,什么是不允许的。
MIT 许可证是当今开源世界中使用最多的许可证之一。基本上,只要原始版权和许可证包含在您的工作文件中,本许可证允许您对许可材料做任何您想做的事情。它免除了作者的任何责任,并且没有明确包含专利授权。
№5:增强软件许可证(Boost)
另一个简单、简短的许可证是最初为 C++ Boost 库编写的 Boost 软件许可证。为了使 Boost 许可证变得简单,已经做了大量工作,该许可证的最新版本遵循以下条件:
- 使用 Boost 授权的代码必须易于阅读和理解。
- 许可作品可以免费复制、使用、修改。
- 任何添加的作品都必须包括许可证及其所有副本,即使是再分发。
Boost 许可证是一种简单的许可许可证,在大多数情况下与 MIT 许可证非常相似,只有两个主要区别:
- 如果你要发布一个可执行文件,你需要在 MIT 许可证中包括一个版权声明,但在 Boost 许可证中不包括。
- MIT license 对于你到底能把代码用在什么地方有一个相当广阔的视角。
№6:无许可证
最后,我们将谈论的无执照执照。这个许可证很简单,对你如何使用、修改和修复任何许可材料没有任何限制。在所有其他开源许可中,非许可给了开发者绝对的自由。
如果您不想深入了解权限和条件,只想尽快发布您的作品,那么非许可通常是开源许可的选择。所以,如果你没有任何关于如何使用你的源代码的规则,但是由于法律原因必须包括一个许可,你可以不要许可。
</5-data-science-open-source-projects-you-to-contribute-to-boost-your-resume-d757697fb1e3>
外卖食品
开源是一项惠及所有人的倡议,无论是技术人员还是应用程序的用户,即使他们不知道或不关心它是如何工作的。作为程序员,我们喜欢开源项目有很多原因:
- 控制。开源让你对软件有很大的控制权。你可以研究它,修改它,修复它的缺陷,并在许可规则范围内随意使用它。
- 安全稳定。如果不需要等待原作者的许可就可以修复问题,那么问题修复的速度会更快,效率也会更高。
- 社区。对于许多其他程序员和我来说,这可能是最重要的方面。开源社区是重要的事情之一;会见来自世界各地志同道合的人,并向他们学习,使得开源成为一个如此有趣的概念。
当程序员努力构建一段代码时,他们通常会附带一个许可证。本许可证规定了代码的允许用途,并限制了原始创建者的设置。了解每个许可证的含义将保证您在构建自己的项目和使用他人的项目时选择正确的许可证。
理解每个许可证的含义是对最初的创作者和他们在构建代码中付出的辛勤劳动表示尊重的一种方式。这种尊重是开源社区有影响力的原因,也是它不断成长并在今天取得成功和繁荣的原因。
sci kit-learn 1.0 版的 6 分钟指南有所变化😎
最热门歌曲的快速浏览🎸
Scikit-learn 多年来一直是主要的 Python 机器学习库。迁移到 1.0 版本并没有带来很多重大的突破性变化,但它确实包含了一些 bug 修复、一些新特性、一些加速和一大堆 API 清理。🧹
一个更加一致的 API 对新老用户来说都是极好的。在本文中,我将深入探讨这些变化,以便您知道如何利用 1.0 版本。🎉

这只柯基很兴奋!资料来源:pixabay.com
新功能
现在 scikit-learn 让你用preprocessing.SplineTransformer创建 B 样条。我认为样条类似于更细粒度的多项式变换。如下图所示,样条可以更容易地避免高次多项式的荒谬外推。

来源: scikit-learn 文档
詹姆斯等人在他们最近更新的机器学习试金石 统计学习介绍,第二版 中都是关于样条的。
OneHot 编码器改进🎉
我最喜欢的 1.0 改动是对OneHotEncoder。现在,您可以删除编码产生的第一个类别,转换步骤可以接受它以前没有见过的值。具体来说,Feature preprocessing.OneHotEncoder现在支持handle_unknown='ignore'和drop='first'。如果您想对您的模型进行推理,这种增强特别有用。

资料来源:https://www.peacocktv.com/
熊猫爱🐼❤️
最近的 scikit-learn 版本增加了与熊猫一起工作的其他改进。版本 1.0 带来了更好地跟踪进出 scikit 的列名的能力-学习转换器和估计器。以下更改将使在 scikit-learn 中使用数据框架变得更好。
现在,当您将数据帧传递给估算器并调用 fit 时,估算器会将特性名称存储在feature_names_in_属性中。同时,get_feature_names_out已经被添加到 transformer API 中,以返回输出特性的名称。注意get_feature_names已经被弃用。
get_feature_names_out并不适用于所有的变形金刚,但它适用于ColumnTransformer。例如,以下是如何对来自 tips 数据集的分类列进行一次编码,并返回到具有有意义的列名的数据帧:
# ... read in tips dataset and split into train and test setsfrom sklearn.compose import make_column_transformer
from sklearn.preprocessing import OneHotEncoderohe = OneHotEncoder(
sparse=False,
drop='if_binary',
handle_unknown='ignore',
)tfd = make_column_transformer(
(ohe, ['sex', 'smoker', 'day', 'time']),
remainder='passthrough',
)X_train_encoded = tfd.fit_transform(X_train)X_train_encoded = pd.DataFrame(
X_train_encoded,
columns=tfd.get_feature_names_out()
)

数据帧 post-one-hot 编码和重组。来源:杰夫的代码
我希望 scikit-learn 的 OneHotEncoder 能够提供一个选项,当您传递给它一个数据帧时,它会返回一个数据帧。我希望您也可以轻松地指定想要编码的列的子集。类别编码器包有一个 OneHotEncoder 类,具有这两个优点,但是在撰写本文时这个库还没有被维护。😢
一致性
为损失或标准参数指定squared_error,过去您可能已经用另一个名称指定了相同的内容。
同样适用于通过absolute_error。过去你可能用过mae或类似的东西,但现在你只需要通过absolute_error。

一些不错的 API 清理。资料来源:pixabay.com
分离
诸如LinearRegression、Lasso和Ridge等linear_model算法中的normalize选项现已被弃用。为了获得相同的行为,在将转换后的数据传递给线性模型之前,首先将您的特征输入到StandardScaler(with_mean=False)中。这种变化将预处理和建模问题分开。
灵活性💪
我教我的学生使用metrics.plot_confusion_matrix和metrics.plot_precision_recall_curve快速绘制混淆矩阵或精确回忆曲线。在旧版本中,您必须传递 scikit-learn 分类器和数据。这通常会导致重复的模型拟合。
使用 1.0,您仍然可以拟合模型并一步绘制结果,或者您可以只传递模型输出并获得您的图。
具体来说,metrics.ConfusionMatrixDisplay现在有两个类方法:from_estimator和from_predictions,可以选择是拟合和绘图还是只绘图。同样,metrics.PrecisionRecallDisplay有from_estimator和from_predictions方法来创建精确召回曲线。
与上述绘图功能的增强一样,Scikit-learn 的calibration.CalibrationDisplay现在可以使用from_estimator或from_predictions方法绘制校准曲线。
如果你已经从predict_proba中得到预测的概率,使用from_predictions。

来源:杰夫的代码
否则,将 fit 分类器的一个实例以及 X 和 y 数据传递给from_estimator。

来源:杰夫的代码
另外两个 API 改进可以为您的工作流提供更大的灵活性。
递归特征消除通过迭代地移除最没有价值的特征来减少特征的数量,这由指定的算法来确定。在过去,你不能轻易地将参数传递给 RFE 所使用的估计量。现在有了feature_selection.RFE.fit你就可以了。🚀
我喜欢预先处理我丢失的值,但是如果你不这样做,preprocessing.OrdinalEncoder可以接受丢失的值。多方便啊。🙂
毕业🎓
HistGradientBoostingClassifier和HistGradientBoostingRegressor已经不是实验性的了,不需要特意导入。

不再是实验性的。资料来源:pixabay.com
速度提升🚀
我只想说有一些速度上的改进。我最兴奋的是preprocessing.PolynomialFeatures.的提升
需要关键字…有时
最后,但同样重要的是,为了提高清晰度,许多参数现在需要关键字参数而不是位置参数。这一变化对新用户来说尤其有益。我继续寻找一些没有强制关键字参数的地方,但是寻找这种远离位置参数的趋势继续下去。
包装
以上是我在 1.0 版本中最成功的作品。总之,1.0 版本有一些不错的变化,但我认为 0.24 版本中的新增内容更加丰富。点击这里查看我的变化指南——我打赌你会学到一些新东西。😀
尝试一下
使用pip install -U scikit-learn升级到最新稳定的 scikit-learn 版本。
非常感谢项目维护人员和所有为发布做出贡献的人!点击这里查看完整的变更日志。
我希望这篇 scikit-learn 1.0 中的基本变化指南对您有所帮助。如果你有,请分享到你最喜欢的社交媒体上。😀
我写关于数据科学、机器学习、 Python 和其他有趣的话题。如果你对此感兴趣,请在此处阅读更多并订阅我的 Data Awesome 时事通讯,获取有用数据资源的不定期更新。

资料来源:pixabay.com
sklearning 快乐!👍
你在云中负责的 6 件事
了解云模型以及与服务提供商的共同责任

在关于云系列中的数据的第二篇文章中,我们将探讨一个在云中出现的有趣概念:共享责任模型。当考虑迁移到云时,您应该首先了解不同的云选项,以及这将如何影响您的组织。根据您选择的部署模型,您将拥有更高或更低的责任。
如果您错过了《云的数据》系列的第一篇文章,我建议您首先阅读《云将如何帮助(或不帮助)您的业务》一文,因为我们将使用其中解释的几个概念。
了解不同的部署模型
现在,我们准备开始了。首先,您必须了解不同的云模型,因为根据不同的模型,您的责任程度会有所不同。不同的部署模型如下:
- ☁️公共云:当你使用公共云时,你是在订阅的基础上使用计算资源。这些资源可以是硬件,如存储或 CPU,也可以是软件,如数据库或应用服务器。当谈到云时,我们通常关注公共云。
- 🔐私有云:顾名思义,私有云是由你的公司拥有和管理的。这种类型的云违背了我们在本系列第一篇文章中看到的原则,因为它有很高的前期成本(CapEx)。然而,私有模型能够更好地解决当今组织的安全和隐私问题。
- 🧬混合云:这就像一个拥有超能力的私有云。这是前面解释的两种部署模型的混合。许多公司使用这种部署模式,借助公共云的力量快速扩展其私有资源。
- 👥社区云:这不太为人所知,因为它并不常见。当属于一个社区的几个组织共享相同的资源时,就会用到它。大学或政府都是这种部署模式的用例。
现在,让我们来探索服务模型
好的,我们有几种类型的服务模型,但是我们能在它们上面找到什么样的服务呢?
- 🏗基础设施即服务(IaaS) :在这种服务模式中,您通过互联网获取计算资源,如计算、存储或网络。正如我们在该系列的第一篇文章中所评论的那样,基于现收现付的定价模式,您将根据所需的容量和使用时间付费。
- 🏭平台即服务(Paas) :在这里,您可以访问多种资源,在这些资源中,您可以构建应用并将其交付给最终用户,而无需管理底层基础架构。这种服务模式的主要缺点是,与其他两种选择相比,它的成本更高。
- 🏠软件即服务(Saas) :这是最高层次的抽象。在 SaaS,您将获得最终用户解决方案。当谈到云时,我们经常提到 SaaS,因为作为用户,你可以访问的服务类型。SaaS 的例子有 Google Drive、Office 365 或 Salesforce。
云中的共同责任
我相信此时您已经知道了不同的云部署模型和服务类型,所以现在,让我们深入到本文的主题:共同责任。
这个概念的出现是为了更好地理解作为云客户你必须关注哪些方面,以及云提供商负责哪些方面。该模型分为 7 个要点:
- 📄数据分类和责任:管理、分类或满足任何合规义务的责任总是在客户方。云提供商为您提供了一套工具来帮助您完成这项任务,如数据加密、数据丢失预防、审计等。
- 🛡客户端保护:指最终用户用来访问云的设备(移动或 PC)。这也完全是客户的责任。
- 🔑身份和访问管理:这对于任何组织来说都很重要,因为它提供了访问云资源的能力。身份是指谁(特定用户)正在访问您的云,访问控制该用户可以使用哪些特定服务。在平台即服务和 SaaS,这是客户和云提供商的共同责任。此外,云提供商将为您提供一个工具集来管理身份验证和授权的安全性,如多因素身份验证(MFA)、基于角色的访问控制(RBAC)或审计。
- 🗃应用程序控制:使用托管应用程序是一种减少管理应用层(如补丁管理、反恶意软件或底层平台配置)的责任的方式。在 IaaS 中,客户有完全的责任,但是在 PaaS 中,客户只需要配置它,云提供商将负责其他方面。在 SaaS,这个点完全由你的服务提供商管理。
- 📡网络控制:包括网络层的配置、管理和保护,如 DNS、网关、负载平衡或虚拟网络。在 IaaS 和 PaaS 中,这一点在客户和服务提供商之间是相同的,但也有所不同。在 PaaS 中,大部分配置和管理都在服务提供商一方,但是客户只承担很少的责任。在 SaaS,大部分责任由服务提供商承担。
- 🏗主机基础设施:包括计算(如容器或虚拟主机)、存储(如 CDN 或对象存储)和平台服务的配置、管理和保护。在 IaaS 中,这是一项共同的责任。虽然客户对基础设施有更多的控制权,但云提供商必须确保底层元素能够通信并得到正确配置。在更高的抽象层次上(PaaS 和 SaaS),服务提供商负责这一点。
- 🏢物理安全:由于不会发生在内部部署方案中,服务提供商始终负责(在所有 3 种模式中)物理安全,如维护和保护建筑、服务器机房、服务器电源和冷却,或更换有缺陷或旧的组件,如硬盘或处理器。

👤代表客户,以及🏭代表服务提供商
摘要
在不断变化的世界中,缩短上市时间和使您的 IT 能力适应需求是可以转化为竞争优势的两个关键点。像你我一样,每个人都需要不断调整自己的业务以适应新的市场需求。此外,重要的是要明白,在当今世界,每个人都期望技术能够完美地工作,此外,一个不能正常工作或表现不佳的产品可能会成为改变竞争对手的动力。
正如我们在上一篇文章中所讨论的,云有很多优点,但是,我们不能忽视某些方面。在这篇文章中,我们详细介绍了我们关注的要点。根据服务模式,云提供商将承担一些责任,另一方面,我们作为客户,必须采取行动。
感谢阅读云系列数据第二贴。在下一篇文章中,我们将重点关注云安全,并将其与本地解决方案进行比较。
学习 Python 的 7 个最佳方法取决于你的具体情况
如果您对大量的 Python 学习选项感到有点不知所措,请阅读本文

来自 Pexels 的 Kamil Zubrzycki 的照片。
每个人都想知道现在学习 Python 编码的最好方法。这是一门很棒的语言,因为我之前已经写过 关于(广泛地)的文章,有很好的职业前景和大量有用的特性。
学习 Python 的原因有很多,学习 Python 的方法可能也有很多。你已经知道了,因为这是一个列表而不是一个 tweet,但是学习 Python 的最好方法并没有单一的答案。没有最好的方法——只有适合您具体情况的学习 Python 的最好方法。如果你是一个有经验的程序员,你学习 Python 的最佳方式将与初学者学习 Python 的最佳方式大相径庭。
这个列表并不试图回答学习 Python 的最终最好的方法。相反,我提出了您可能会发现自己所处的七种具体情况,并为您解释了学习 Python 的最佳方式。
这篇文章中没有附属链接——如果你点击这些推荐,我就赚不到钱。
· [The Best Way to Learn Python For Free](#6297)
· [The Best Way to Learn Python Interactively](#f8a6)
· [The Best Way to Learn Python Online](#5118)
· [The Best Way to Learn Python Fast](#6e7d)
· [The Best Way to Learn Python On Your Own](#9adc)
· [The Best Way to Learn Python the Hard Way](#4b6f)
· [The Best Way to Learn Python to Get a Certificate](#86bf)
· [The Best Way to Learn Python for You](#84e1)
免费学习 Python 的最佳方式
你可以在网上任何地方找到学习 Python 的免费/免费增值选项,但是我喜欢把exercisem作为免费学习 Python 的最好方式。为什么?因为不是为了盈利。这将永远是免费学习编码的好方法。
如果你一直在寻找免费学习 Python 的最佳方法,你可以依靠 Exercism。他们是一个非营利组织,致力于帮助任何人学习编码,所以他们是免费的,而且永远都是免费的。
Exercism 可以帮助来自各种不同背景的人发展他们的编程技能。他们有 50 种不同语言的练习,有自动和人工指导。它是开源的,依靠好心的志愿者。
这对完全的初学者来说不太好,尽管这是他们的路线图。如果你已经有了一些编程经验,Exercism 是免费学习 Python 的最佳途径。
交互式学习 Python 的最佳方式
如果你正在浏览这个列表,并看到许多具有挑战性的选项,包括自我驱动的工作、阅读教科书、观看讲座,并且你想知道,“学习 Python 编程的最好方法是什么,而不需要我阅读教科书?”,你可能是那种从互动教学中受益的人。我认为这是学习 Python 最有效的方法,因为知识更难掌握。
交互式学习 Python 的最佳方式是使用一个名为 Qvault 的网站。他们的 Python 基础课程帮助你边做边学。您将在浏览器中编写真正的代码,它会以交互方式指导您完成课程。
这门课程最酷的地方在于,它旨在帮助你找到工作。这意味着它不仅会教你华而不实的技巧,还会引导你理解 python 工作的基本原理,这些原理可能会让你在潜在的工作面试中出错。它还专注于美味的工作技能,让你有更多的职业选择,特别是在机器学习方面,如果你喜欢的话。
在线学习 Python 的最佳方式
也许你不介意某个选项不是免费的。如果是这种情况,并且你愿意付钱,并且你正在寻找在线资源,那么在线学习 Python 的最佳方式是一个名为 Udemy 的平台提供的名为从零到英雄的课程。
我个人没有参加过,因为我是一个小气鬼——它的价格是 140 美元——但它有超过 130 万名学生,有超过 30 万个正面评级。这显然很受欢迎,有证据表明这可能是在线学习 Python 的最佳方式。
本课程将带您了解如何通过 Python 2 和 Python 3 专业地使用 Python。它向您展示了高级 Python 特性,并带您了解复杂的主题。这是 22 小时的 Python 指导讲座。
快速学习 Python 的最好方法
如果你想快速学习 Python,你将会经历一段艰难的旅程。事实是,学习任何编程语言都很难,因为我有理由知道。这些年来,我学会了 3 种语言:R、Python 和 SQL。每次我试图学习它们,我都发现书本对我没有帮助,课程没有激励我,老师也没有按照我需要的方式教我。我本可以努力学习并最终学会这些语言,但你知道是什么让我快速学会了 Python 吗?我有自己的项目。
我是无意中做到的——我并没有问自己,“嗯,祖列,学习 Python 的最佳方式是什么?”相反,我有一种强烈的需求,想知道在我的 Instagram 标题中提问是否意味着更多地关注我的猫图片。r 不擅长抓取,而 Python 擅长,所以我需要学习 Python。
如果你想快速学习 Python,最好的方法是找一个你真正关心的项目,除非你解决它,否则它会让你发疯。给自己定位,这样你和你渴望的答案之间的唯一障碍就是你的 Python 知识。这就是我如何非常快速地掌握 Python 基础知识的。
自学 Python 的最佳方式
也许你讨厌花钱买东西,你不想要互动课程。如果是这样的话,自学 Python 的最好方法就是依靠 YouTube 教程和讲座。
有很多才华横溢、心地善良的人在 YouTube 上免费发布了数量惊人的内容。当然,最困难的部分是把它们都挖掘出来,按照正确的顺序观看,并激励自己去尝试一些你看到的东西。
然而,没有比自学 Python 更好的方法了。如果你想走自己的路,制定自己的课程,学习自己的课程,按照自己的时间表,学习 Python 的最佳方式是通过管理 YouTube 教程和讲座来创建自己的课程列表。
这里有一个长达一小时的讲座,我非常喜欢,是由一个叫做“用 Mosh 编程”的 YouTuber 做的。
艰难地学习 Python 的最好方法
也许你认为所有这些讲座和免费选项都好得不像真的。在某种程度上它们是:任何承诺轻松教你 Python 的内容很可能都是在撒谎。学习 Python 最简单的方法是雇人一步一步地教你,任何自称“简单”的东西可能都不是。
这就是为什么我要把 learncodethehardway.org 扯进来。根据他们的网站,的说法,“学习代码艰难的道路课程是学习计算机编程基础的最有效的系统。”
不是互动的,只是一本线上的书。艰难地学习 Python 有望以一种持久的方式教会你全面的 Python。它还包括视频讲座。
我查看了 Python 书籍的免费样本,老实说,它看起来确实很难。但是如果你能让自己通过它,你最终可能会了解 Python。它值 30 美元。
学 Python 拿证最好的方法
如果你完成了一门 Python 课程却没有拿到证书,这种事情会发生吗?如果你是那种想要或需要证明你的 python 专业知识的人,无论是出于个人满足还是工作需要,你最好的选择是获得一个证书。
学习 Python 获得证书的最好方法是借助一个叫做 Coursera 的平台。他们有 856 个 Python 课程的结果,从初学者到中级程序员。像 Udemy 一样,许多最受欢迎的课程拥有数百万或数十万学生和大量积极的评论。
这些课程都是由实际机构开办的。例如,最受欢迎的课程是密西根大学提供的 T2。这些课程需要时间:例如,密歇根大学的课程预计你将需要大约 8 个月的时间来完成,每周工作 3 小时,所以这不是一个快速的选择。你可以免费注册 7 天,在那之后,你将为那门特定的课程每月支付 49 美元。
对你来说学习 Python 的最好方法
学习 Python 的最佳方式取决于不同的因素。你有多少时间?你有多少钱?你自己学习的动力有多大,或者你想要一个更互动的指导?你是一个初学编程的人,还是一个有经验的人,并且希望将 Python 加入你的领域?
你不能用正确的方法学习 Python。相反,本文应该引导您选择更好的方法来学习 Python。好消息是 Python 是一种奇妙的语言,有着令人难以置信的职业前景、不断增长的功能和简单明了的学习途径。
学习 Python 最好的方法是什么?没有了。无论你发现哪种方法是学习 Python 的最好方法,你都会发现它是一种有着令人敬畏的社区的令人敬畏的语言。找到你的路,然后陷进去。
我计划在 2021 年完成的 7 个数据科学项目
我计划如何在年底前利用这些项目来提高我的数据科学技能。

凯尔·汉森在 Unsplash 上的照片
2020 年底,就在所有人都在制定新年计划的时候,我决定 2021 年的目标是开始学习数据科学。
我开发的学习课程的一部分聚焦于完成项目的重要性,这是一种加深我的知识并开始应用我所学技能的方式。
这就引出了这篇文章:列出我计划在今年完成的 7 个数据科学项目,以及这些项目将如何增强我在特定领域的技能。我想选择专注于我感兴趣的主题的项目,我也选择附带源代码的项目,如果我遇到困难,我可以参考这些源代码。此外,我还想挑选一些比那些经常分享的项目更独特的项目。所以,事不宜迟,让我们直接开始吧!
项目#1:可视化传播的病毒

埃里克·麦克林在 Unsplash 上的照片
- 语言:Python
- 难度:初学者
- 数据集:小说电晕病毒 2019 数据集
- 源代码:如何用 Choropleth 图谱可视化冠状病毒疫情
无论你把它归因于病态的好奇心还是理解数据可视化的需要,这个项目看起来都是显而易见的。疫情给了我们大量的数据来指导和可视化。此外,我一直着迷于人们能够构建的美丽的可视化地图。因此,将这个简单的项目作为我对数据科学的第一次尝试是有意义的。
使用的技能:
- Python 库(NumPy,pandas,Plotly)
- 使用 choropleth 图的数据可视化
项目#2:猫和狗的分类

无论你是喜欢猫的人还是喜欢狗的人,这个项目都有适合每个人的东西。老实说,我只是想做这个项目,这样我就可以看看可爱的动物图片。我想我也想提高我的神经网络和深度学习技能。
使用的技能:
- Python 库(NumPy、pandas、Keras、scikit-learn、MatPlotLib)
- 神经网络
- 深度学习
- 数据可视化
项目#3:实时面具检测

由于口罩不会很快消失,为什么不充分利用糟糕的情况,从事一项机器学习项目,检测你是否戴着口罩?面部识别一直让我感兴趣,所以这个项目的想法是显而易见的。
使用的技能:
- Python 库(Keras、OpenCV、NumPy、scikit-learn)
- 机器学习
- 神经网络
项目#4:音乐流派分类

由于过去十年中制作的所有音乐听起来完全一样,一个按流派对音乐进行分类的程序对于避免混淆非常有用。音乐不是我真正喜欢的东西,但这是一个如此独特的项目,我不得不把它添加到我的列表中。机器学习可以使用音乐文件的频域和时域对其进行分类。一旦经过分析,这些歌曲将被分为十种不同的音乐类型。
使用的技能:
- Python 库(NumPy)
- 机器学习
- 深度学习
- k-最近邻
项目#5:道路车道线检测

Jaromír Kavan 在 Unsplash 上拍摄的照片
- 语言: Python
- 难度:中级
- 源代码: 车道线检测
自动驾驶汽车已经走过了漫长的道路,毫无疑问,它们将在我们的未来发挥重要作用。如果你仔细想想,这有点令人毛骨悚然,仅仅几行代码就能阻止一辆汽车越过白色实线进入迎面而来的车流。像许多人一样,我对这项技术很警惕,所以我认为亲自动手看看它实际上是如何工作的是个好主意。
使用的技能:
- Python 库(Numpy、MatPlotLib、OpenCV)
- 深度学习
- 机器学习
- 计算机视觉
项目#6:假新闻检测

- 语言: Python
- 难度:进阶
- 数据集: news.csv
- 源代码: 用 Python 检测假新闻
这个项目在过去四年的任何时候都会非常有用。然而,仅仅因为邪恶的女巫死了,并不意味着假新闻会很快停止。因此,为什么不构建一些东西来扩展我的数据科学技能,并且在需要说出一些难以接受的事实时也很有用呢?
使用的技能:
- Python 库(NumPy、pandas、scikit-learn)
- 机器学习
- 模型建立和拟合
项目#7:股票市场价格预测

在 Unsplash 上由 Austin Distel 拍摄的照片
- 语言: Python
- 难度:进阶
- 数据集: 标准普尔 500 强公司列表&
- 源代码: 股票市场价格预测
由于其不确定性因素,股票市场价格预测经常被认为是初学者数据科学项目的圣杯,它将是测试我的数据科学技能在过去一年中如何增长和提高的一种很好的方式。虽然这个项目可能希望渺茫,但我还是把它放在这里,当我有雄心壮志的时候。因为这个项目非常密集,所以我包含了一些额外的资源,如果我遇到困难,这些资源可能会派上用场。
其他资源:
使用的技能:
- Python 库(pandas、NumPy、scikit-learn)
- 机器学习
- 深度学习
- 线性回归
- 递归神经网络体系结构
最后的想法。
感谢互联网上的大量可用资源,我能够选择各种各样的项目,这些项目侧重于我希望改进的数据科学的不同领域。每个项目都将帮助我实践和发展我在课程的每个部分(编程、数学和统计、数据分析和可视化以及机器学习)中学到的技能。我选择的项目的美妙之处在于它们都是可扩展的,因此在未来,我可以构建类似的项目来分析不同的数据集或完成不同的任务。
随着新的一年带来一个新的开始,这是一个绝佳的时机,让你一头扎进去,努力完成一个新的目标。感谢热情的数据科学社区,一旦我分享了我的成果,我期待着对我的项目提出建设性的批评。为新的一年和完成大目标干杯!
数据可视化应该使用的 7 R 软件包
带有示例代码和免费数据集

乌萨马·阿扎姆在 Unsplash 上的照片
介绍
“不是你做什么,而是你怎么做。”―切里·胡贝尔痛苦是可有可无的:自由和快乐的三把钥匙
拥有数据却不知道如何将它可视化,这就是我所说的自我折磨。所以,就像 Cheri 说的,自由和快乐有三把钥匙——我的理解是——数据+ R +这 7 R 包。
数据
您可以使用我选择的数据集来遵循我的代码,也可以使用您自己的数据集。这里有一些寻找免费开源数据集的好资源:
- 在哪里可以找到免费数据集&如何知道它们的质量好不好马特·大卫(2021) 。
- r 的内置数据集。r 允许你在 GNU 通用公共许可证下将这些数据集用于商业用途。
- Hiren Patel(2019)这些是任何人都可以使用的最好的免费开放数据源。
7r(非致命)包装
1.GGPLOT2
让我们从使 R 成为可视化最佳语言的原始库开始— ggplot2 。我正在使用来自 Kaggle 的数据集,你可以在这里找到(可持续发展解决方案网络,2019,许可证 CC0:公共领域)。该数据着眼于全球幸福状况:

作者来源
密码
**### GGPLOT2 EXAMPLE CODE
### LOAD KAGGLE DATA *(****Sustainable Development Solutions Network, 2019,* [*License CC0: Public Domain*](https://creativecommons.org/publicdomain/zero/1.0/)*)***#Load packages**library(openxlsx)
library(ggplot2)
library(RColorBrewer)**#Read in the first worksheet from the Excel workbook HappinessAlcoholConsumption.xlsx**library(dplyr)
data("happy", package = "ggplot2")
happy <- read.xlsx("2019_happiness.xlsx", sheet = '2019_happiness')***#Top 30 countries***happy %>%
group_by(Country) %>%
summarise(HappinessScore_Avg = mean(Score)) %>%
top_n(30) %>%***#The average happiness score for each country in the Top 30***ggplot(aes(x=reorder(factor(Country), HappinessScore_Avg), y=HappinessScore_Avg, fill = HappinessScore_Avg)) +
geom_bar(stat = "identity") +
xlab("Country") +
ylab("Average Happiness Score") +***# Make sure axes start at 0***scale_y_continuous(expand = expansion(mult = c(0, 0.05))) +***# Choose a theme, axis title sizes and labelling***theme(legend.position ='none',axis.title.y = element_text(size=8), axis.text.y = element_text(size = 8), axis.title.x = element_text(size=5),axis.text.x = element_text(size = 5), plot.title = element_text(size=10, hjust = 0.5)) +
scale_fill_gradientn(name = '',colours = rev(brewer.pal(5,'Spectral'))) +
geom_text(aes(label = HappinessScore_Avg), hjust = -0.3, size = 2) + ggtitle("Top 30 Countries by Happiness Score") +
coord_flip()
对 ggplot2 的一个扩展库叫做 ggforce,是由Thomas Pedersen 开发的。它具有在数据中高亮显示不同组及其特定要素的附加功能,可帮助您更有效地讲述您的故事。这里可以看到一些 ggforce 的例子。
2.颜色选择器
不要浪费时间在谷歌上搜索你想要使用的颜色的十六进制代码,而是使用颜色选择器!如果你需要坚持一个定制的调色板,这是特别有用的。请参见下面的演示:

作者来源
以下是我在演示中使用的代码:
**##Colour Picker using R's built-in dataset called** [**mtcars**](https://stat.ethz.ch/R-manual/R-devel/library/datasets/html/mtcars.html)**(mtcars s*ource:Henderson and Velleman (1981), Building multiple regression models interactively. Biometrics, 37, 391–411*)
#Install necessary libraries**library(ggplot2)
library(ggcorrplot)install.packages("colourpicker")
library(colourpicker)cols <- colourPicker() #the screen will pop up after this line
cols # return the names of the colours selected**# Create a correlation matrix using R's built in dataset - mtcars**data(mtcars)
corr <- round(cor(mtcars), 1)**# Plot mtcars**
ggcorrplot(corr, hc.order = TRUE,
type = "lower",
lab = TRUE,
lab_size = 2,
method="circle",
colors = c("red2" ,"white", "dodgerblue2"),
outline.color = "#0D0C0C",
title="Correlogram of car specs")
如果你想了解更多关于创建自定义调色板的内容,请点击这里查看我写的文章。
3.埃斯奎塞
拥有数据但不确定如何可视化?或者,不确定如何用 R 写代码?我向你介绍——埃斯奎塞。esquisse 包是 Zeno Rocha 在 2018 年创建的开源软件。这里的是 GitHub 库的链接。
在这个演示中,我将使用 Google dataset search 来搜索一个开源数据集,本质上是免费提供的数据集的 Google:

作者来源
它指引我到了 Kaggle,在那里我将使用与漫威和 DC 漫画数据相关的数据。
**#Import the necessary packages and libraries**install.packages("esquisse")
library(esquisse)**#Run the following:**
esquisse::esquisser()
将出现以下屏幕:

作者来源
在这里,您可以通过上传、粘贴、连接到 Google 工作表或连接到 R 的内置数据集之一来导入您的数据。上传 marvel 数据后,我会在导入之前看到一个预览窗格:

作者来源
这里有一个关于 esquisse 如何工作的简短演示:

作者来源
4.PlotlyR
PlotlyR 是一个免费的开源图形库。你可以在这里查看 GitHub 库。我在这里要用的例子是将在线客户旅程形象化,因为他们沿着你的营销漏斗移动。
**# Install plotly from Github to get funnel plots
# Here I make up my own data but the functionality is the purpose of this viz**devtools::install_github("ropensci/plotly")
library(plotly)fig <- plot_ly()
fig <- fig %>%
add_trace(
type = "funnel",
y = c("Clicked on Google Ad", "Explored Website", "Downloaded Brochure", "Added to basket", "Made Payment"),
x = c(100, 80, 10, 9, 7))
fig <- fig %>%
layout(yaxis = list(categoryarray = c("Clicked on Google Ad", "Explored Website", "Downloaded Brochure", "Added to basket", "Made Payment")))fig

作者来源
很快你就会发现问题出在你的网站上,因为这是客户流失最多的地方,也就是说,在他们下载宣传册之前,你就已经失去了大部分客户。然而,你的宣传册看起来信息量很大,因为你抓住了几乎所有下载过的客户。
5.Quantmod
对于任何喜欢把分析股票作为爱好或工作的人来说,Quantmod 适合你。这与金融建模息息相关。
**# Install quantmod**
install.packages('quantmod')
library(quantmod)**#Select the company/share you want to visualise - I chose Google's shares provided by Yahoo Finance**getSymbols("GOOG",src="yahoo") **#Plot 1: Cumulative Interest of Google Stocks Over Time**
plot(Cl(GOOG), col = 'black')

作者来源
**#Plot 2: Candle Chart**
candleChart(GOOG,multi.col=TRUE,theme='black', subset = 'last 3 months')

作者来源
6.RGL
RGL 是如果你需要在 3D 中绘制任何东西。
**#Install RGL**install.packages("rgl")
library("rgl")***#The next line of code produces a demo of what RGL can visualise. Follow the prompts in your console, but after pressing enter, it will produce a number of 3D visualisations***demo(rgl)
以下是演示产生的一些示例:



7.混杂物
最后,把你所有的观想集中在一起怎么样? Patchwork 是由 Thomas Lin Pedersen 于 2017 年发明的,目的是让这项运动变得简单。你可以从 CRAN 和下载,这里是 GitHub 库。
**#Install packages**
devtools::install_github("thomasp85/patchwork")
library(ggplot2)
library(patchwork)**# All you need to do is assign you visualisation to a variable:****#Viz 1 - named p1****p1** <-happy %>%
group_by(Country) %>%
summarise(HappinessScore_Avg = mean(Score)) %>%
top_n(30) %>%
ggplot(aes(x=reorder(factor(Country), HappinessScore_Avg), y=HappinessScore_Avg, fill = HappinessScore_Avg)) +
geom_bar(stat = "identity") +
xlab("Country") +
ylab("Average Happiness Score") +
scale_y_continuous(expand = expansion(mult = c(0, 0.05))) +
theme(legend.position ='none',axis.title.y = element_text(size=8), axis.text.y = element_text(size = 8), axis.title.x = element_text(size=5),axis.text.x = element_text(size = 5), plot.title = element_text(size=10, hjust = 0.5)) +
scale_fill_gradientn(name = '',colours = rev(brewer.pal(5,'Spectral'))) +
geom_text(aes(label = HappinessScore_Avg), hjust = -0.3, size = 2) +
ggtitle("Top 30 Countries by Happiness Score") +
coord_flip()**#Viz 2- named p2****p2** <- ggcorrplot(corr, hc.order = TRUE,
type = "lower",
lab = TRUE,
lab_size = 2,
method="circle",
colors = c("red2" ,"white", "dodgerblue2"),
outline.color = "#0D0C0C",
title="Correlogram of car specs")**#Return the saved visualisations as below:****p1** + **p2**
输出将如下所示:

作者来源
此外,这里有一个指南告诉你如何使用各种样式和注释来整理你的图表。
结论

在 Unsplash 上由 Anoop Surendran 拍摄的照片
您现在完全有能力探索有趣的数据集。这些 R 包中的每一个在它们自己的文档和库中都有大量的例子。我鼓励你挑选一个你感兴趣的数据集,并钻研这些库。如果你喜欢这篇文章,你可能也想看看— 这是你应该如何可视化你的数据:10 个例子来指导你的分析 。
如果你想成为一个中等会员和支持者,请考虑使用我的 推荐链接 。你的会员费直接支持你阅读的所有作家。你也可以在媒体上看到所有的故事。
数据科学管理中的 7 项任务
行业笔记
如何指导您的团队并改进数据驱动的业务案例

作者马丁·施米特和马塞尔·何冰
在几乎每个行业的大多数公司中,数据科学的使用案例越来越多。从小型企业到大型行业,数据科学家的数量不断增加,数据科学团队的规模和复杂性也随之增加。与此同时,据报道,只有少数(22%)数据科学项目显示高收入,大数据项目大量失败(60%至 85%) 【阿特瓦尔 2020】。这就引出了一个问题:如何处理管理数据科学团队的复杂性?
在本文中,我们希望:
- 定义什么是数据科学管理,
- 为促进数据科学文化提出建议,
- 描述数据科学经理的任务,
- 概述公司对数据科学经理的需求,
- 并简单介绍一下如何找到适合这份工作的人。
什么是数据科学管理?
数据科学家是训练有素的信息科学家、统计学家、自然科学家、社会科学家或数学家。有些人甚至将数据科学作为独立的学士或硕士课程来学习。他们解决问题,挑战常走的路,计算可数的事物。他们洞察复杂的过程,分析巨大的数据集,并面对以前没有解决的问题。它们有助于节省时间、自动化流程,并以多种方式构建未来。但在某些场合,他们往往太喜欢解决问题,以至于失去了注意力。这就是数据科学经理发挥作用的时候了。
数据科学管理是管理学的一个细分领域,不是数据科学。数据科学经理被任命来代表和实现公司的愿景并实现其目标。要做到这一点,管理者需要授权给人们,鼓励团队,引导和激励这些人。他们有资源来帮助他们完成上述任务(比较仆人领导[Eva 等人 2019 年]和 [Chang 2019 年]了解有关该主题的更多信息)。如果他们能够避免微观管理他们的团队,保持专注于更大的图景,并将项目的现实应用转化为数据科学家,并将结果转化为其他所有人,他们就会工作得最好。此外,他们至少需要对数据科学的基础、迭代项目的性质以及大多数数据科学家的学术背景有基本的了解。首先,数据科学经理需要在各个方面都是优秀的沟通者。
总之,我们对数据科学管理的理解如下:
—数据科学管理意味着组织一个迭代过程,通过科学方法和高度自动化的软件基础设施从数据中提取洞察力,以实现业务目标。
公司为什么要关心?
数字化和数字化转型冲击了很多商业模式;颠覆性技术让以前强大的商业案例变得过时。这就是为什么许多企业不得不关注成本效率,这就要求进一步优化流程。由于许多行业已经非常高效,只有自动化、优化和挖掘潜力才能省钱。随着自动化而来的是大量的数据,这对于现代数字机器也是如此。此外,来自不同背景的许多其他数据源,如社交媒体、天气预报,甚至是竞争对手生成的数据,都是可以访问的。
为了获得竞争优势,公司需要释放各种数据源的潜力,并将它们融合在一起,以获得更多更好的知识。很多时候,人们认为数据越多越好(“大数据”),这并不完全准确。需要有与其他数据集有正确关系的正确数据。这就是通常所说的“智能数据”。智能数据专注于数据(包括大数据)的整合方式,并准备提供真正的商业价值[ Iafrate 2015 ]。
现在很多公司都在雇佣数据科学家。雇主和雇员的关系面临着双方都幻灭的风险:在数据基础设施和设备方面,公司通常没有为高技能人才做好准备。他们面临的挑战太大,无法让数据科学家适应正确的环境,以便他们能够作为一个相当昂贵的劳动力发挥自己的潜力。另一方面,数据科学家有时在这种环境中不受挑战,并面临厌倦。当他们做低于他们技能水平的工作时,他们会感到沮丧。因此,数据科学家没有创造力,也没有揭示公司的潜力。这些条件有双重影响:公司拥有昂贵的数据科学家,他们无法意识到数据科学对业务的潜力。
促进数据科学文化
理想情况下,数据科学经理事先知道所有这些事情,并且能够在雇用数据科学家之前为公司做好准备,并将数据科学家置于最佳环境中。图 1 给出了一些建议,说明每天可以做些什么来实现开放的数据科学文化:

图 1:迈向富有成效的数据科学文化:如果上述事情(以及更多)存在于一家公司的 DNA 中,则很可能存在成功的数据科学项目的正确设置。图片由作者提供(CC BY 4.0)。
数据科学经理应该走在事情的前面:他或她必须能够关注公司即将到来的话题,这样数据科学家就需要对事情有不同和更深入的关注。它们消除了障碍(特别是在数据可访问性方面),促进了主题领域之间的交流[ Bhatti 2017 ]。由于数据科学是一项团队运动,数据科学经理应该鼓励人们,以加强团结意识。
最后,数据科学经理应该有一定的自由度。由于他们在一个不断发展和变化的领域工作,他们应该有参加会议和工作组会议所需的适当资源。那些东西应该被视为高级训练。公司应该认识到经理是一种工作团队,避免微观管理。数据科学经理不是数据科学的开销。数据科学经理是恰当的数据科学的大使和推动者。
数据科学经理的任务
当涉及到数据科学经理的日常业务时,一些任务和职责(图 2)会重复出现,需要跟踪。这些过程与典型的软件工程项目中的过程没有太大的不同;然而,有些方面很突出。

图 2:数据科学管理的信息流三角形。蓝色箭头表示与获取信息的人的关系。灰色箭头表示信息被推向接收者。虽然数据科学经理与他/她的团队和利益相关者保持密切联系,但数据科学团队和利益相关者之间的推动关系会被中断,因为数据科学团队应该留在团队气泡中。除了管理关系,数据科学经理还有确保项目整体成功的基本项目管理职责。图片由作者提供(CC BY 4.0)。
任务 1)需求管理
在大多数数据科学项目中,第一步是与利益相关者交谈,了解他们的需求。这主要是关于提取信息和理解现实世界中的商业问题(参见 Shearer 200 0 中的“商业理解”)。谈论期望是很重要的,并且应该最终得出以下问题的答案:一旦数据科学项目成功完成,风险承担者会有什么不同?
然后,记录的需求需要转化为数据科学家的分析任务[ Provost 和 Fawcett 2013 ]。这些任务必须分成容易理解的部分。可以与数据科学家讨论技术或科学深度。这可以通过将所有项目放入待办事项列表中,以及通过编写用户故事来完成,这在软件开发中很常见[Scrum.org]。
任务 2)时间&资源
处理复杂的问题往往意味着处理不确定性。与此同时,需要降低复杂性,以便对项目预算以及可用于支出的资金进行估计。对于涉众来说,通过估计时间和工作量,给用户故事、需求或项目阶段贴上价格标签可能会有所帮助。然而,处理复杂性意味着处理各种各样的未知。根据不确定性的程度,在估计中设置一个时间缓冲是一个好的做法。一个有用的方法是在不确定性的画布上对用户故事进行分类(见图 3 拉姆斯菲尔德矩阵),以获得第一印象。

图 3:这个拉姆斯菲尔德的矩阵可以作为不确定性画布[Fournet 2019]。哪些因素是已知的(并且可以计算出来),哪里有缺失的信息,哪些是其他人拥有的(去问),哪些是已知的未知信息(例如,股票价格,天气)以及通常会发生多少完全意想不到的事情——一些软件经理甚至将他们的估计乘以 pi (~3.14159),以计算出意想不到的情况。图片由作者提供(CC BY 4.0)。
那些为项目带来合适技能的人在场是很重要的。此外,他们还必须有时间来运行它。在这件事上,重要的是不要让人们承担过多的项目。他们从事的项目越多,由于交易成本而损失的时间就越多。由于上下文切换,每个额外项目大约损失 20%的工作时间[ Weinberg 1975 ]。如果只有一个人拥有某项技能,可能会给整个项目带来风险,例如,如果这个人无法工作或离开公司。此外,需要事先明确数据的可访问性。没有什么比数据科学家和任何其他团队成员无所事事地等待他们需要的基本数据更低效的了。
为了了解时间和资源的概况,以下问题是一个很好的起点[根据 Seiter 2019 ]:
- 团队:需要哪些专业知识?是否有合适的人员,他们是否有足够的时间来实现项目?
- 数据:什么数据是可用的(内部的、公开的或购买的),它能用来解决基于这些数据的分析问题吗?是否有必要进行数据收集(如调查)?
- 基础设施:每个人都适当地配备了软件、硬件和云资源吗?
上述问题有助于找到从一开始就没有想到的其他利益相关者。此外,它可能会澄清谁还需要加入(例如,it 或法律部门)。
任务 3)促销
项目的进展和结果需要以一种让每个人都在同一页上的方式呈现给涉众。数据科学经理需要为各种不再是一维的问题做好准备:随着产品或解决方案的发展,人们往往会更加挑剔,因为在需求集合中,他们可以使用更多的感官而不是纯粹的想象力。
因此,在 Scrum 中像 sprint 模式一样回顾初步结果有时会很有帮助【参见Scrum.org】。在许多情况下,利益相关者的正确参与很重要,因为将来会有项目。如果利益相关者对结果和参与感到满意,他们将来更有可能慷慨解囊。
任务 4)画面&背景
让我们回到队里。每个人都需要了解项目的路线图、愿景并了解时间框架。这包括对正在发生的事情的深刻理解,以及如果事情偏离了轨道就说出来的义务。有时候很难成为扫兴的人——尤其是对于那些喜欢解决问题并随着深入挖掘而迷失方向的数据科学家。但有些问题并不总是业务范围内的问题。在这里,重要的是要表现出同理心,并解释为什么会有另一个焦点。
任务 5)沟通促进
只要对项目有利,促进数据科学家、利益相关者和其他潜在相关人员之间的沟通是每个数据科学经理的基本任务。最重要的是,需要支持所有相关方对过程、方法和目标的共同理解。
在图 2 中,沟通促进任务被建模为拉动关系,团队通过它从涉众那里获得所需的信息。这是该模型的一个关键方面:团队获得了它需要的信息,同时,它也受到保护,不会受到未经检查的涉众请求的影响(见下一点)。
任务 6)团队泡泡
问题需要尽可能远离数据科学家,以确保他们有最好的环境来开展工作。拥有编码日或者为集中工作保留早晨的时间可能会有所帮助。
然而,团队气泡可能与现实相差甚远,因为任务和需求需要与涉众一起细化。数据科学经理通常手头没有所有信息,这就是数据科学家需要参与会议的原因。
[ Graham 2009 ]根据他们最有效率的时间表来区分决策者(团队)和管理者(数据科学管理者和大多数利益相关者)。虽然对于数据科学经理和利益相关者来说,以一个小时为间隔计划几天,从一个会议赶到另一个会议,这可能是绝对正常的,但这是团队中的决策者所能预期的最糟糕的事情。他们通常需要长时间(4 小时以上)不间断的工作。不间断意味着不被打扰——即使是看似温和的 5 分钟谈话也可能是毁灭性的,需要 20-30 分钟才能回到创造者的正轨。
任务 7)项目管理要领
在大多数数据科学项目中,还必须考虑管理要素。一旦确定了时间和资源(见上文),就可以制定一个时间框架。这可能或多或少有些困难,取决于首选的项目管理方法。有些东西是必不可少的,比如:
- 跟踪目标,监测总体进展,控制财政资源;
- 保证过程和结果的质量;
- 管理文档、待办事项、公告板和会议;
- 牢记假期、病假和高级培训时间;
- 和保持团队的快乐!
如何找到数据科学经理
“来自软件工程或业务部门(财务、会计等)的经理。)可能在理解数据科学家和定义他们的项目工作方面有困难【参见 Jee 2019 。
管理数据科学不同于管理资产或资源。除了硬件和软件,最重要的是人。在数据科学领域,大多数人都有学术背景,并且经常拥有某个研究领域的博士学位。这不同于传统的软件工程或大多数其他业务部门【参见 Jee 2019 】。这种高水平的教育往往伴随着同样高的就业条件要求,包括意义、责任、参与,当然还有工资。数据科学经理也是如此。
尽管一些大学已经开始培训数据科学经理,但这种新的工作模式可能还需要几年时间才能广泛确立。与此同时,聘用一名数据科学经理通常意味着聘用一名在他或她的前职业生涯中高度专业化的人,希望拓宽他或她的当前关注点。实际上,这意味着雇佣一个对沟通和管理技能有特殊兴趣的书呆子——不可否认,这是一套罕见的技能。
数据科学经理应该理解分析思维、科学方法论、演绎推理和处理复杂性。此外,他或她应该是一个聪明的头脑和好奇的人。数据科学经理能够在客户或管理委员会面前进行适当的演示,同时在他或她的团队中也非常受尊重,因为他或她能够将每个计算总结为 42(如果您不熟悉这样的参考资料,您应该尽快聘请一位数据科学经理)。
摘要
对于希望通过数据驱动的决策改善业务的公司来说,数据科学管理非常重要。它意味着组织一个用科学方法和高度自动化的软件基础设施从数据中提取洞察力的迭代过程,以追求业务目标。数据科学项目的最佳实践方法包括需求管理、考虑时间和资源、向利益相关者推广项目以及团队的指导。此外,数据科学管理有助于沟通,为重点工作和项目管理要素构建“气泡”。
截至今天,分析思维、编程技能和数据科学理解已经是业务发展的重要组成部分。对于许多公司来说,不可避免的是,他们将开发基于数据挖掘和数据分析的数字商业模式。由于数据驱动的商业模式的演变是一个有许多障碍的复杂过程,培训或雇佣一名数据科学经理将是明智的。在不久的将来,数据科学管理将成为一项独立的工作。
[1] H. Atwal,实用数据操作 (2020),Apress,DOI:10.1007/978–1–4842–5104–1
[2] N. Eva,M. Robin,S . send jaya,D. van Dierendonck 和 Robert C.Liden,仆人领导力:系统回顾和对未来研究的呼吁 (2019),《领导力季刊》,DOI:10.1016/j . leaqua . 2018 . 07 . 004
[3] R. Chang,所以你想成为一名数据科学经理? (2019),刻意数据科学
[4] F. Iafrate,从大数据到智能数据 (2015),John Wiley & Sons,Inc .,DOI:10.1002/97819116189
[5] B. Bhatti,一个伟大的数据科学经理具备哪些素质? (2017),走向数据科学
[6] C. Shearer,CRISP-DM 模型:数据挖掘的新蓝图 (2000),数据仓库杂志
[7] F. Provost 和 T. Fawcett,商业数据科学 (2013),奥赖利媒体公司,国际标准书号:9781449361327
[8] B. Fournet,如何使用“已知”和“未知”技术来管理假设 (2019),柿子集团
[9] D. Strom,对于技术项目,乘以 Pi (2008),基线
[10] G. M. Weinberg,《一般系统思维介绍》 (1975),纽约:威利
[11] M. Seiter,商业分析 (2019),瓦伦,ISBN 978–3–8006–5871–8
[12] K. Jee,为什么很难找到优秀的数据科学经理? (2019),走向数据科学
作者
马丁·施密特 在德意志铁路公司担任数据科学经理。他是 T21 应用科技数字商业大学的讲师,也是洪堡互联网与社会研究所的副研究员。通过培训,马丁是一名农业科学家,并拥有环境建模博士学位。
马塞尔·何冰 是数字商业应用科技大学的数据科学教授。他是影响力酿酒厂的创始人和数据科学家,也是洪堡互联网与社会研究所的副研究员。Marcel 拥有统计学、计算机科学和社会科学博士学位。
2021 年最流行的 8 种编码语言
入门
而且更重要的是,如何选择你应该学习的最流行的编码语言。

来自 Pexels 的 ThisIsEngineering 摄影
你如何决定最流行的编码语言是什么?这就像试图挑选最受欢迎的冰淇淋口味——每个人都有最喜欢的。事实是,不同的程序员出于不同的原因喜欢不同的编码语言,就在你认为可以说一种编码语言至高无上的时候,一种新的语言出现了,或者一种旧的语言与新的应用程序相关。
2021 年最受欢迎的编码语言将基于有问题的编码者想要完成什么,以及他们已经学过或做过什么。对于希望增加薪水的有经验的程序员来说,最受欢迎的编程语言将不同于那些刚刚起步并希望在编码训练营后获得入门级编码工作的程序员。
有这么多不断变化的语言,很难知道从哪里开始,尤其是开源语言一直在变化,有了新的包和框架。不管你的兴趣或需求是什么,如果你想知道 2021 年最流行的编码语言是什么,你会在这个列表中找到它们。
[**1\. The most popular coding language for absolute beginners: Python**](#8aad)
∘ [Why it’s popular for this purpose](#9d57)
∘ [The best way to learn Python for beginners](#7414)
[**2\. The most popular coding language for people who don’t want a programming job: R**](#6124)
∘ [Why it’s popular for this purpose](#b23c)
∘ [The best way to learn R for non-programmers](#1a6a)
[**3\. The most popular coding language to increase your salary: Perl**](#91c3) **∘** [Why it’s popular for this purpose](#68fe)
∘ [The best way to learn Perl for coders who want a higher salary](#b78d)
[**4\. The most popular coding language for mobile app development on iOS: Swift**](#fb6b)
∘ [Why it’s popular for this purpose](#7ad2)
∘ [The best way to learn Swift for app developers](#d986)
[**5\. The most popular coding language for lateral thinkers: Ruby**](#d05f)
∘ [Why it’s popular for this purpose](#b876)
∘ [The best way to learn Ruby for lateral thinkers](#620b)
[**6\. The most popular coding language for mobile apps and web development: JavaScript**](#9739)
∘ [Why it’s popular for this purpose](#92f8)
∘ [The best way to learn JavaScript for web developers](#6a25)
[**7\. The most popular coding language to quickly increase your salary: Go.**](#428e)
∘ [Why it’s popular for this purpose](#14ae)
∘ [The best way to learn Go for coders who want to quickly increase their salary.](#f05a)
[**8\. The most popular coding language in 2022: Rust**](#38ae)
∘ [Why it’s popular for this purpose](#feef)
· [The best way to learn the most popular coding language of 2022](#59e7)
[**Final Thoughts**](#3c29)
1.最受绝对初学者欢迎的编码语言:Python
无论你查看什么列表,Python 几乎总是被列为最受初学者欢迎的编程语言——在 Qvault 关于初学者最佳编程语言的帖子, GitHub 的排名, Stack Overflow 的开发者调查,甚至是最顶尖的语言大学正在教授计算机科学专业。

来源: PYPL
不是 Rust 这样的快速成长者,也不是 JS 这样的老牌机构。但它是一种不可阻挡的语言力量。它已经存在 30 年了,在使用和受欢迎程度方面经历了稳定的增长,足以让它在任何人的排行榜上名列前茅。
为什么它受欢迎的目的
Python 的伟大之处在于,它的编写考虑到了开发人员的体验。实际上,这意味着它读起来像英语——对于没有编程背景的人来说尤其容易掌握。构建任何东西的基本原型也是非常快速的,这对于那些能够在几分钟内通过一个好的教程产生功能性代码的初学者来说是非常有利和值得的。最后是百搭。无论你的需求是什么——数据科学、机器学习、网络开发——你都可以用 Python 来完成。
总之,它的语法、易于发展和多功能性使 Python 成为绝对初学者最受欢迎的编码语言。
初学者学习 Python 的最佳方法
Python 是最受初学者欢迎的编码语言,因为它为全新的编码者提供了强大的支持网络。你可以使用面向初学者的 Python.org 免费教程开始编码。
您还应该利用 Python 用户和爱好者丰富的支持性在线社区。大多数 Python 爱好者都会记得自己学习 Python 的日子,并乐意向初学者伸出援手。查看 Python subreddit ,阅读并发布关于堆栈溢出的 Python 问题,看看你是否能在 Discord 组或 Slack 频道上找到一个编码伙伴。
2.对于不想做编程工作的人来说,最受欢迎的编程语言是:R
当我做客户成功经理时,我的工作完全不涉及编码。然而,我仍然发现能够在 R 中运行分析是非常有益的——查看保留率、流失率、通信量等等。r 是另一种开源编码语言,不如 Python 流行,但在数据科学社区中仍然非常活跃和受欢迎。
如果你想找一份与编程无关的工作,R 是最受欢迎的编程语言。它正在取代 SQL 和 SAS 这两种闭源的付费语言。由于企业既想降低成本,又想雇佣能够进行分析的人,不管他们的日常工作是否是编码,他们开始转向 r。

来源:宁
为什么它受欢迎的目的
在他们的 R 与 Python 教程中, Datacamp 写道R 被“没有计算机编程技能的统计学家、工程师和科学家”使用。它在学术界、金融、制药、媒体和营销领域都很受欢迎。”
对于那些因为一些非常合理的原因而不在工作中编程的人来说,r 是最受欢迎的编程语言。首先,它是开源的。和 Python 一样,不需要付任何钱。它还有一个集成开发编辑器 RStudio ,这使得它更容易使用。它有一个强大的开源软件包生态系统,使得任何人都可以非常简单地在几行代码中运行统计分析,并在几行代码中创建一个可供发布的图形。
非程序员学习 R 的最好方法
特别是对于那些没有或者不想要编程工作的人来说,我发现最好是找到一个你真正关心的项目,并设定一个具体的目标。你的工作中没有这种必要——你可以不知道如何编码,至少现在是这样。你之前没有任何编码经验,所以学习曲线会很陡。你需要你深深热爱的东西。只有这样,你才能克服每个程序员初学者都会遇到的令人沮丧的障碍、知识差距和用户错误。
3.增加薪水最流行的编码语言:Perl
根据 Stack Overflow 的调查,Perl 是这个名单上最矛盾的语言之一,因为它拥有最高的全球工资(7.5 万美元的平均年薪),但也是最令人恐惧的语言(71.4%)。但是如果你想在编程工作中获得更高的薪水,没有比这更流行的编码语言了。众所周知,它是更流行的 PHP 的前身,也是一种有点像燃烧的垃圾堆的语言。
博客某个家伙在他的博客文章“2020 年的 Perl:它还值得学习吗?“that”,Perl 试图对太多人来说太多了。在许多项目中,可怕的代码片段四处漂浮,被毫不犹豫地拉进来。一个接一个的脚本小子拼凑了他们令人厌恶的东西,并让他们在这个世界上自由自在。他们把源代码放到网上,让全世界免费观看。书籍中也充斥着垃圾,即使它们早已过时,也会被重新出版,”
尽管被许多开发人员讨厌,但许多雇主发现它是一种有用的编码语言,既适用于新项目,也适用于维护现有的基础设施和项目。这就是为什么它仍然是最受欢迎的增加工资的编码语言。
为什么它受欢迎的目的
Opensource.com 列出了亚马逊、波音、BBC 和诺斯罗普·格鲁曼等许多寻找 Perl 开发人员的大公司。这是雇主们的常用语。像 R 和 Python 一样,它是开源的,这意味着它使用起来成本低、风险小。许多用户(例如,subreddit 上的)将它描述为一种范围广泛、功能有限的语言,使它变得简单而实用。
它被讨厌的主要原因可能是上面列出的一些纨绔子弟博客的遗留因素——在这个地方,开源性质让这种语言失望,并允许它的好名声被拖进泥沼。
然而,随着 Perl 的最新版本修复了许多用户体验问题,以及 Perl 7 的即将发布,它的受欢迎程度可能会再次缓慢攀升,特别是考虑到它在雇主中的高需求性质,尽管作为编程语言它有很多缺陷,但雇主们发现 Perl 是一种值得雇佣的优秀技能,这使它在最流行的编程语言列表中赢得了一席之地。
想要高薪的程序员学习 Perl 的最佳途径
learn.perl.org 网站可能是开始学习 Perl 的最好地方。不像 R 和 Python,许多用户从谷歌搜索和复制粘贴代码块中学习,最好远离像堆栈溢出这样的地方,在那里坏的代码片段可能还在四处浮动。 Modern Perl 也是一个相对较新的文档,可能会避免许多过时的固执己见的教程,而 Perl Cookbook 则是久经考验的资源。
4.iOS 上移动应用开发最流行的编码语言:Swift
r、Python 和 Perl 都是上个世纪开发的。与此同时,Swift 是在 2014 年专门为成为苹果编程语言而开发的。顾名思义,它以构建 iOS 应用程序的快捷方式而闻名,迅速超越了最初为此目的而构建的 Objective-C。Apple.com 自己说 Swift 比 Objective-C 快 2.6 倍,比 Python 快 8.4 倍。尽管它是一门年轻的语言,但在 Stack Overflow 的 2020 年开发者调查中,它是第九大最受欢迎的语言。要编写一个 iOS 应用程序,没有其他最流行的编码语言。
为什么它受欢迎的目的
Dummies.com 写道:“开发 iOS 应用程序可能是你多年职业生涯中最有趣的事情,只需要很少的时间和金钱投入(与开发 Windows 等平台相比)。”对于想写代码的人来说,开发应用程序是展示你的技能甚至赚点外快的好方法。
与 Android 应用程序相比,iOS 拥有更强大的开发者程序,并处理许多在商店创建和托管应用程序的棘手问题。与 Android 相比,开发一个 iOS 应用程序也更快。
出于这些原因,对于那些想为 iOS 开发移动应用的人来说,Swift 是最受欢迎的编码语言。
应用程序开发人员学习 Swift 的最佳方式
苹果显然在帮助开发者学习 Swift 方面有既得利益,所以它是开源的。事情发生了相当大的转变,苹果实际上开发了一款名为 Swift Playground 的应用,旨在帮助初级程序员学习 Swift 的基础知识,同时还有几个其他资源来帮助用户学习。如果你更擅长编码或者想离开赛道去学习 Swift,
之后,最好的方法就是尝试使用 Swift 设计你的第一个应用。
5.横向思考者最流行的编码语言:Ruby
Ruby 是初创公司最受欢迎的编码语言之一,这种语言有多种方式来做事情,语法非常简单,这使得许多初创公司的“快速行动,打破常规”的精神受到横向思考者的青睐。
Ruby on Rails 是一个运行 Ruby 的全栈 web 应用程序框架,它也非常受欢迎,因为它可以在很短的时间内轻松构建 web 应用程序。
为什么它受欢迎的目的
对于许多初学编程的人来说,使用像 Python 这样的语言会感觉受到限制,因为通常只有一种方法来做事情。Ruby 的简单语法允许方法的灵活性,这对于正在学习第二种编码语言的人,或者更倾向于横向思考并喜欢从不同角度研究事物的人来说是一个福音。这个另类的角度让 Ruby 登上了 2021 年最流行的编码语言的榜单。
横向思考者学习 Ruby 的最佳方式
由于 Ruby 的动态特性,没有单一的学习方法。虽然理解变量、数据结构和条件语句等核心编码概念很重要,但 Ruby 和 Ruby on Rails 的简单性意味着一旦掌握了基础知识,下一步应该是尝试构建自己的简单 web 应用程序。
6.移动应用和 web 开发最流行的编码语言:JavaScript
JavaScript 是网络上最流行的编码语言,负责交互式网站。它开发于 1995 年,是今天 95%的网站使用的主流客户端脚本语言。随着 Node.js 的开发,许多人也开始在服务器端使用 JavaScript。与 CSS 和 HTML 一起,它构建了你随时可以在万维网上看到的东西。
根据 Stack Overflow 的 2020 年开发者调查,它连续第八年成为最常用的语言。只要网站存在,JavaScript 对任何程序员学习都是有用的。对于任何 web 开发人员来说,这显然是必备的。即使你不想成为一名网站开发人员,建立自己网站的能力——现在经常被用作简历和作品集——也是一项很有吸引力的展示技能。
为什么它受欢迎的目的
对于 web 开发和移动应用程序来说,JavaScript 是最受欢迎的编码语言这一事实是引人注目的,考虑到它作为对第一次浏览器战争的回应仅在十天内被创造出来。
它是如此受欢迎的编码语言,因为它无处不在,但是理解为什么它无处不在也是很好的。首先,它几乎可用于任何前端和后端 web 开发,但也有一些框架被开发来更进一步。例如,JavaScript 也适用于像 Slack 和 Skype 这样的桌面应用程序,它们使用 Electron.js 。 Vue.js 、 Angular.js 和 React.js 是独立的 JavaScript web 框架,分别用于构建由前谷歌员工尤雨溪、谷歌和脸书构建的用户界面。
它也是标准化的,这意味着新版本的更新和发布会频繁出现。无论您处于编码生涯的哪个阶段,这种语言都能为您提供一些东西。
web 开发人员学习 JavaScript 的最佳方式
如果你搜索“学习 JavaScript”,很容易被大量的信息、教程和指南淹没。甚至很难知道自己需要哪些框架和库。这就是为什么我推荐一种分层次的方法,让你在学习最受 web 开发人员欢迎的编码语言的过程中系统地、持续地进步。一些例子包括 JS: The Right Way 和 Qvault 的《编码基础入门》。
7.快速涨工资最流行的编码语言:Go。
Go 是在谷歌开发的,受到了编程语言巨头 C 的影响,但它是为了避免 C++的陷阱而构建的,而 c++被 Go 的开发者普遍鄙视。我们的目标是建立一种语言,在一个庞大的代码库的时代,这种语言是适用的。它现在被几家大公司使用——谷歌显然是其中之一,但优步、Twitch 和 Dropbox 也在名单中。
在 Stack Overflow 的开发者调查中,它在最受欢迎的语言列表中排名第三,同时也是全球工资中位数最高的 T2。
为什么它受欢迎的目的
有几个原因使得它成为想要快速增加工资的程序员最流行的编程语言。首先,它是一种为大型项目而构建的语言。例如,与 Ruby 不同,它可以快速构建,但难以扩展,Go 是由 Google 有意创建的,以帮助他们更快地完成真正巨大规模的项目和任务。它的目的是减少阅读和调试代码的时间,帮助完成这些任务。这使得它成为许多旨在实现这种规模项目的大公司的一种有吸引力的语言。
它也被认为比 Perl 学起来更快更容易,Perl 是薪水最高的语言之一。Perl 有着几十年的历史和观点,而 2009 年才创建的 Go 有着更小、更现代的语法。不像许多词汇臃肿的编码语言,Go 小到足以“装进你的脑袋”,套用数据工程师森姆·琼斯的话,在用 Go 构建了一个 API 后写了一篇关于 Go 的评论。这减少了在网上和参考书中搜索答案和语法的时间。
仅仅通过阅读来学习它也是可能的,因为语法足够清楚,非爱好者甚至非编码人员都可以看到它并理解发生了什么。
对于想快速提升工资的程序员来说,学习围棋的最好方法。
作为谷歌为互联网打造的语言,你可以想象有几个免费的基于网络的资源可以帮助你学习。首先,几个消息来源推荐你去学习如何使用围棋。它是交互式的,你可以在网站上运行自己的代码片段。它被分成几个模块,这使得它很容易跟踪你在哪里,并在必要时引用回来。
一旦你掌握了基础知识,其他一些很好的资源包括 Go By Example 和 Go Mastery ,在那里你将学会寻找典型或常见任务的代码示例。
8.2022 年最流行的编码语言:Rust
根据 2020 Stack Overflow 的开发者调查,Rust 连续第五年成为最受欢迎的语言,也是第五大最受欢迎的语言(14.6%)。那么,尽管客观上它是所有编程语言中最受欢迎的,但为什么它没有名列榜首呢?因为根据同一项调查, 97%的受访者从未使用过 Rust 。它也有一个不确定的未来。
Mozilla 在 2009 年赞助了 Rust 的开发,在 2010 年宣布了它。它被视为 C 或 C++等其他系统编程语言的替代品,根据其维基百科页面的说法,它旨在“成为高度并发和高度安全的系统的语言。这对开发人员来说意味着他们可以快速高效地编写安全的代码。
然而,由于 Covid,Mozilla 解雇了他们 Rust 团队的很大一部分人,以专注于商业产品。虽然他们已经宣布将会建立一个基金来掌控 Rust 的未来和成本,但是还不确定这个基金将会如何形成。
为什么它受欢迎的目的
假设 Rust 能够克服当前的困难,我预计它将逐年变得更受欢迎。它拥有当前开发人员的忠实粉丝群,越来越多的编码人员对学习它感兴趣。虽然它可能不会在 2021 年名列榜首,但我相信它可能会是 2022 年或以后最受欢迎的编码语言。
许多程序员认为它比 C++更容易学习。安全代码的优先级可能会让许多编码人员感到沮丧,他们输入代码只是为了得到令人讨厌的错误消息,但这可能会远离“快速移动并打破东西”的心态,并朝着更安全、结构更合理的代码库移动。它既适用于长期发展的需要,也适用于未来的努力。 Mozilla 的页面描述了这些应用,包括“游戏引擎、操作系统、文件系统、浏览器组件和虚拟现实的模拟引擎”
由于这些原因,Rust 可能是未来最流行的编码语言。
学习 2022 年最流行的编程语言 Rust 的最佳方式
因为 Rust 非常关注安全性和结构,所以开发人员花费了大量的时间和资源来确保错误消息是用户友好的,不像许多其他的编码语言。这对初学者来说尤其有益,因为当他们犯了错误时,很容易改正。
Rust 网站提供了三种尝试的途径——阅读被称为的书、rusting 课程和小项目来帮助你启动和运行,以及 Rust By Example ,它阐释了支撑 Rust 的概念和库。所有这些资源都是免费的。
正如一位 Redditor 指出的那样,这是一种相对较新的语言,因为你将会遇到的许多问题的答案还没有在 Stack Overflow 这样的地方发布和回答。出于这个原因,他们建议加入 Discord 频道,作为获得指导和支持社区来学习 Rust 的一种方式。
最后的想法
有大量的语言可供选择,正如你从这个列表中看到的,许多是最近才出现的。虽然有些人在特定任务上客观上比其他人更好,但大多数人都有很好的目的。如果你想学习 2021 年最流行的编码语言,你首先要决定你想从学习编码语言中得到什么。
无论你坐在哪里,站在潮流的顶端并确保你处于编码游戏的顶端总是好的。超过 70%的各级专业开发人员每年至少学习一次新的编码技能。为什么不从 2021 年开始,用 2021 年最流行的编码语言之一来优先考虑你未来的技能呢?这个列表将帮助你选择你可以开始做的事情。
亚伦碗
NFL 分区赛的头名
TL;博士,这个博客中的图表大多使用随机创建的数据,因为我没有实际数据的权利。
1 月 16 日,在 NFL 分区季后赛的第一场比赛中,绿湾包装工队将迎战洛杉矶公羊队。这些球队代表了 NFL 排名第一的防守(公羊)和进攻(包装工)。
有趣的是,每支球队的最佳球员都被命名为亚伦。亚伦·罗杰斯可能是足球界最好的四分卫,他是今年最有价值球员奖的热门人选之一。艾伦·唐纳德是有史以来最好的球员之一。他是今年年度最佳防守球员的三大热门之一。加上帕克的跑锋亚伦·琼斯。不管这场比赛结果如何,其中一个亚伦将会非常有影响力。这就是为什么我称它为亚伦碗。

在这个博客中,我将展示一些图片来说明在同一个游戏中有这种水平的玩家是多么的不寻常……对于他们来说有相同的名字就更不寻常了!
赛后总结
绿湾包装工队 32:洛杉矶公羊队 18
亚伦·罗杰斯完成了 23 次 36 次传球中的29 次 296 码,两次传球达阵,一次冲达阵。(包括一次 58 码传球触地得分)****
亚伦·琼斯冲了 14 次 99 码的 T21,每次试跑 7 码就有一次触地得分。(包括 60 码的一次运行)
艾伦·唐纳德上场时间有限,仍在处理上一场比赛的伤病。
两个艾伦确实主宰了这场比赛——都来自绿湾。阿伦-唐纳德的受伤(以及来自绿湾进攻线的强劲表现)意味着我们没有看到预期中的阿伦 vs(阿伦+阿伦)之战。
获取数据
与其他运动相比,你更难获得 NFL 的数据,例如棒球和篮球。随着 NFL 向 Kaggle 提供大数据碗的数据,这种情况可能会发生变化。一些对你自己的研究有帮助的来源是 NFL 网站,去年的 Kaggle NFL 大数据碗(去年的比赛比今年的有更多的最近数据),以及职业足球参考文献。不幸的是,这些数据源都不是完全开源的。
Kaggle 只允许“竞赛使用、非商业和学术使用”NFL.com 数据“仅用于您个人的非商业和信息目的”Pro Football Reference 拥有最开放的数据,“我们鼓励共享和重复使用我们的用户在我们的网站上找到的数据和统计数据”,但警告不要“复制我们数据的重要部分”——所以不要刮擦。
还有一些额外的数据来源,通过汇编公开可用的详细数据来创建数据库。然而,由于这些是二手资料,我不能直接访问原始数据,所以我选择不在公共博客中使用它们。
我要看看最可测量的统计数据的领导者:传球码,传球达阵,冲码和麻袋。然后,我会将这些数据与随机生成的虚拟统计数据集进行比较,以说明 Aarons 有多不寻常。
我知道这种方法看起来有点奇怪——主要使用虚构的数据。体育统计数据通常被报道,处于公共领域,并被视为不受版权保护的事实(对最近一起涉及棒球数据的法庭案件的评论此处)。但是,这些统计数据(数据库)的集合是受保护的。公众对谁是最佳球员很感兴趣,因此很容易找到关于公共领域领导者的统计数据。然而,人们对识别所有玩家的兴趣并不相同——因此,没有数据源,我无法构建数据集。
NFL 中有四个 Aarons 的位置可以影响这些统计数据。艾伦·唐纳德,艾伦·罗杰斯,艾伦·琼斯,艾伦·林奇。


亚历山大·席默克在 Unsplash 上拍摄的照片
虚拟数据
在 Python 中创建虚拟数据有几种选择。传球码和达阵高度相关。我使用 NumPy 的 random.multivariate _ normal 从多元正态分布中创建相关随机样本。这里参考一下官方文档。
所需的参数是平均值、cov 和大小。均值是数据各维度的均值。Cov 是分布的协方差矩阵。尺寸是样品的尺寸和/或形状。
构建协方差矩阵有点棘手。我在一条对角线上使用了码数和触地得分的方差,在另一条对角线上使用了标准差 x 相关性。
corr = 0.8 # estimating passing yards and TDs are 80% correlated # (it's probably higher than 80% in reality)covs = [[yd_std**2, yd_std*td_std*corr],
[yd_std*td_std*corr, td_std**2]]# std**2 is the variance
# use std / 3, so that most of the data generated (3 standard deviations worth) is within the range I want.
我使用了一个平均值为零的范围。我将样本大小增加了一倍,所以我可以毫无问题地去掉一半的值。这会给我留下半个钟形曲线,峰值在零。
data = np.random.multivariate_normal(means, covs, 200).T
这些数据当然不是完美的,但对下一个例子很有用。
四分卫可视化
# Plot distribution of QB rating
sns.set(color_codes=True)
sns.set(rc={'figure.figsize':(10,8)})
sns.displot(df['QB_TD'], label='QB Passing Touchdowns')
plt.title('Distribution of QB Passinh Touchdowns')
plt.legend()
plt.show();

基于虚拟数据的触地得分
# scatter chart of QB Rating by Pass Yards
sns.relplot(x="Pass_Yd", y="QB_rating", hue="Aaron",
size="Aaron", sizes=(100,50), palette=["b", "r"], alpha=.8, height=6, aspect=2, data=df);

Aaron Rodgers 与顶级 QBs 和虚拟数据
亚伦罗杰斯没有最多的传球码,但他绝对是一个异数。
参考
职业足球参考:【https://www.pro-football-reference.com/
NFL 网站:【https://www.nfl.com/stats/player-stats/
Kaggle NFL 大数据碗:https://www.kaggle.com/c/nfl-big-data-bowl-2020
numpy . random . multivariate _ normal 上有帮助的 stackoverflow 回答:https://stack overflow . com/questions/18683821/generating-random-correlated-x-and-y-points-using-numpy
近似贝叶斯计算的基础知识

图片作者。
入门
使用近似贝叶斯计算方法的参数推断导论。
什么是贝叶斯统计?
贝叶斯统计是允许在新数据【1】的证据中信念的系统更新的方法。这些方法所基于的基本定理被称为贝叶斯定理。这就是说,给定两个事件 A 和 B,A 给定 B 为真的条件概率表示为

。其中 P(A|B) 表示给定 B 发生 A 的概率, P(B|A) 表示给定 A 发生 B 的概率, P(A) 和 P(B) 分别是不考虑其他情况下 A 和 B 发生的概率。
什么是推论?
在证据和推理的基础上得出的结论。如果我们推断出一个给定参数的值,我们就可以利用现有的信息来推断该参数最有可能的值。
什么是贝叶斯推理?
科学家用概率来量化他们推论中的不确定性。比如“我 99%确定 X 的值是 Y”。假设我们有一个模型可以预测某个事件是否会发生。该模型需要一个单一的输入,其值我们并不完全确定。然而,我们可以指定它可能取值的分布,以及它取每个值的概率,这就是所谓的概率分布。我们进行了一项实验,观察到了一些新数据。贝叶斯推理然后使用贝叶斯统计(等式 1)来更新给定新数据的参数的概率分布。贝叶斯推理是非常强大的,因为它允许我们量化,并纳入,一个给定的参数应该是什么分布的先验信念的变化水平。
贝叶斯术语:
如果 A 代表先前的信念,而 B 代表新的证据,则:
- P(A) 被称为先验概率。先验概率可以是信息性的意味着我们有很强的先验信念,或者是非信息性的意味着我们对参数的真实值有更不确定的先验理解。
- P(B|A) 被称为似然函数。给定 A 为真的最近数据/证据的概率。这让我们能够量化证据与我们先前的信念相符的程度。
- P(A|B) 被称为后验概率。考虑到证据后的概率 A。
等式 1 告诉我们后验概率与我们的先验概率和似然函数的乘积成比例,

。在简单的情况下,似然函数是已知的,因此后验分布的表达式可以直接从似然和先验中导出[3]。在这种情况下,参数的概率分布可以随着新数据的出现而不断推断出来,没有问题!
然而,在大多数现实世界的问题中,似然函数通常非常复杂或者根本不可能推导出来!在这些情况下,后验分布的表达式不容易确定。这就是近似贝叶斯计算可以用来代替似然函数计算的地方。
使用近似贝叶斯计算(ABC)方法估计后验概率
ABC 算法通过模拟模型来估计参数的后验概率,从而使用取自先验分布的样本参数产生人工数据集 X 。通过计算距离𝜌 (X,Y) 来比较由先前的样本参数产生的人工数据集与观察到的真实数据集 Y 有多相似。产生与真实数据集 Y 非常接近的人工数据集的参数样本作为样本从后验分布中收集。“非常接近”的接近程度由一个预定义的超参数确定,该参数称为容差 (𝜀),产生的人工数据比𝜀更接近被接受为后验数据的一部分的观测数据。
一般 ABC 方法:

图 1:估计模型参数后验分布的 ABC 过程示意图。这里我们从一个未知的均匀先验分布(中上)开始。我们从先验分布中采样 n 次,并使用我们的模型产生模拟数据(中间一行)。产生类似于观察数据的模拟数据的先前样本(左上)被保留作为构成模型参数的后验分布的样本(中下)。这就是所谓的 ABC 剔除抽样。图片作者。
距离函数𝜌【x,y】
距离函数通常被选择为最简单的汇总统计量,它可以精确地比较观察数据(X)和模拟数据(Y)。热门选择:
- 绝对差值

- 平方差之和

- 库尔贝克-莱布勒散度(KL)

公差的选择(𝜀):
容差(𝜀)定义了先验样本和后验样本之间的边界阈值。该值可以根据任务的要求严格或宽松。通常也可以使用自适应阈值。这开始时相对较大,随着采样的进行而慢慢减小(这类似于模拟退火的方法)。因此,就像统计学习中的许多超参数一样,最佳容差值仍有待讨论!
python 中的 ABC 拒绝采样方法
一个真实世界的例子;抛可疑硬币的概率。
一个狡猾的朋友给了我们一枚硬币,并和我们打赌说我们无法告诉他抛正面的真实概率是多少。硬币既可以正面落地,也可以反面落地,所以这是一个二项式问题。我们的朋友是个疯子,我们一点也不相信他的硬币。我们通过使用一个无信息先验将这种不信任传递到我们的先验信念中,这是一个翻转头概率的均匀分布。这意味着我们认为从 0 到 1 的 p 的所有可能值都是等概率的。在贝叶斯推断中,贝塔分布经常被用作二项式概率的无信息先验[1]。贝塔分布由下式给出


图 2:不同参数下的贝塔分布(𝜶,𝜷).贝塔分布提供了各种各样的分布类型,因此在贝叶斯推断中是一个有用的先验。图片作者。
贝塔分布的超参数可以被认为是观察到的成功次数(𝜶)和失败次数(𝜷)。无信息的贝塔分布先验具有 hyper-parameters(𝜶,𝜷) =(1,1)。这代表了对之前每个结果的观察。图 2 显示了β分布如何随着不同的𝜶,𝜷).值而变化
分析后验分布
贝塔分布有一个简单的特性,即使用它作为二项式可能性的先验分布,将产生一个更新了𝜶和𝜷.的贝塔后验分布这个性质被称为共轭。模型的后验概率由下式给出

现在可以使用这个 p 的后验分布来评估关于翻转头部的真实概率的假设。如果我们考虑 n = 10 、 n= 100 和 n = 1000 掷硬币的试验观察,后验概率可以通过分析得出,图 3 绘出了这些后验概率。

图 3:n 次抛硬币试验的分析后验分布图,n=10,n=100 和 n = 1000。图片作者。
ABC 估计后验分布
所以让我们假设我们的二项式例子有一个可怕的似然函数,因此我们必须使用 ABC 方法估计后验分布。
我们用最简单的 ABC 算法: ABC 拒绝抽样。我们选择的距离函数是观察到的和模拟的人头数的比例之间的绝对差。
使用𝜀= 0 的公差。这意味着我们只接受头尾比例与完全相同的样本作为我们的观察数据。图 4 显示了本例中 ABC 流程的动画。与真实参数值相似的样本更有可能产生相同的观察数据,因此更经常被后验分布接受。在终止 ABC 算法之前,我们需要 N=10,000 个样本。在图 4 中,观察到的数据在 n=10 次试验中产生了 7 个正面和 3 个反面。当模拟数据产生 7 个头部和 3 个尾部时,参数样本被后验分布接受。

图 4:估计后验概率的 ABC 过程动画。图片作者。
考虑到与上述相同的试验观察值 n = 10 、 n=100 和n = 1000,下面的图 5 给出了具有 10,000 个样本的 ABC 估计后验概率。

图 5:n = 10、n=100 和 n = 1000 时模型参数 p 的 ABC 估计后验分布。图片作者。
可以看出,在图 5 中使用 ABC 得到的后验估计值非常精确,几乎完全等于真实后验值(红线)。这个二项式例子的简单性允许我们以可以忽略的成本进行采样。然而,在大多数情况下,后验分布必须通过 MCMC 技术在数字上找到(使用斯坦、温巴哥、 OpenBUGS 、 JAGS 、 PyMC 或一些其他程序)。
结论
这个简单的教程展示了 ABC 技术提供参数后验分布精确推断的能力。这种方法在所讨论的模型具有可怕或难以处理的似然函数时特别有用,这通常是真实世界的复杂模型的情况。如此处所示,ABC 方法非常易于使用,并且通过可靠的数据可以产生非常准确的结果。虽然 ABC 方法允许我们避免处理复杂的似然函数,但是相对于给定问题的解析解,它们被认为计算量很大。然而,当面对不合理的复杂模型时,ABC 方法提供了执行参数推断的手段。
[1]m .埃文斯、n .黑斯廷斯和 b .皮科克,2001 年。统计分布。
[2]编辑史蒂文森,安格斯。牛津英语词典,牛津大学出版社,2010 年。
[3]特纳,B.M .和范赞特,t .,2012 年。近似贝叶斯计算教程。数学心理学杂志, 56 (2),第 69–85 页。
数据科学洞穴的废除
行业笔记
在跨学科团队中交流数据科学

由 Clarisse Meyer 在 Unsplash 上拍摄
当谈到理解我们的数据科学模型做出的决策时,我们听说过可解释性。但是开发过程中的可解释性呢?
作为数据科学家,我们经常在跨学科团队中工作,在这个团队中,并非每个人都熟悉我们的专业,就像我们不熟悉他们的专业一样。这些环境允许我们为我们的用户构建最好的产品,但是它们需要一个关键的组成部分:沟通。本文旨在收集我在一路上学到的关于让跨学科团队围绕产品构建的数据科学组件保持一致的知识。
为什么
在我们开始讨论如何做之前,让我们先来看看为什么。在整个开发过程中成功沟通数据科学工作非常重要,主要原因如下:
- 为团队和利益相关者提供信心:你不需要教利益相关者数据科学,但你需要对进度、风险、方法和需求保持透明。当事情出错时,引起恐慌的第一个原因往往不可避免地集中在产品中最不为人所知的部分。这种恐慌会导致花费更多的时间来修复通信损坏,而不是一开始就通知团队。
- 向依赖于您的输出的团队成员提供透明度:团队中的某个人可能会将您创建的模型集成到 web/mobile/backend 应用程序中。如果是这样,他们将需要清楚地了解输入需要是什么,输出意味着什么,以及他们需要记住哪些考虑因素才能使模型工作。通过了解您在做什么,他们可以正确地集成您的模型,并提出可能与您的实施相关的限制(例如,“我们的目标移动设备没有您用作模型输入的传感器”)
- 向您所依赖的团队成员提供透明度:无论您负责管道的哪个部分,都可能有人在为您提供数据,无论是数据管道还是前端应用程序。向负责这些早期过程的团队成员提供透明性,允许他们理解并在必要时适应您的需求,以及提出可能影响您的实现的限制。
- 向更广泛的团队提供透明度:更广泛的团队可能不一定参与实施细节,但他们确实有你可能缺少的背景和经验。了解您正在做的事情有助于进行讨论,这可以带来实现中的改进或关键点。
现在我们知道了为什么,让我们看看我在这几年里学到了什么。
给出清晰和频繁的更新
这似乎是一个显而易见的事情,但是“仍然在模型上工作”对团队的其他成员没有帮助。提供频繁和清晰的更新使团队能够:
- 了解进展,因此提前计划
- 理解局限性,从而适应
- 发现拦截器并帮助您解决它们
- 挑选他们应该参与的讨论
单口相声是做这件事的好地方。就我个人而言,除此之外,我还喜欢使用书面交流,因为如果人们没有站起来、分心或者他们以书面形式更好地处理信息,它可以让人们回到过去。我的首选方法是为数据科学更新创建一个 Slack(或等效)渠道,在那里我根据团队和项目进度发布每日或两周一次的总结。
好的更新是上下文和长度的平衡。你需要让你的交流适应你的听众,并为他们提供必要的背景来理解你所指的内容。该上下文可以在更新本身中提供,也可以作为链接提供给对该信息感兴趣的人。同时,如果你的更新太长,它们会成为一种负担,很可能会被放在“以后再看”的文件堆里或者被忽略。
这里有一个更新的例子,我试图给出各种事情的状态信息,解释延迟,给出延迟的估计,提供在会议中分享的信息,并请求某人帮助阻止。我还使用表情符号来呈现一些主题,这些主题只有在人们看到一些更新后才会变得有用(例如,红点总是意味着阻止)。

伪造更新示例—作者图片
根据我收到的反馈,这些类型的更新(在标准会议之上)在我们的团队中运行良好。也就是说,这并不意味着这是您团队的正确方法。你需要进行实验,看看你的团队如何应对各种方法。
一些最后的建议:
- 保持你的更新简短,但要有足够的内容
- 标记你向其寻求帮助的人(人们会遗漏一些事情)
- 不要在奇怪的时间发送更新
- 利用链接了解任何详细信息
- 添加可视组件/模式
编写文档
这是我最初开始做的事情,帮助我完成日常任务。我天生是一个健忘的人,如果我试图把一堆事情记在脑子里,我会很难集中注意力。编写文档帮助了我:
- 记得事情🐠
- 组织我的想法,找出联系/缺失的部分
- 专注于手头的任务,而不必担心我会忘记我努力记住的 10 件事
过了一段时间后,我注意到对我有帮助的东西,实际上对团队也有帮助,因为它让他们对通常是黑盒的流程变得透明。这就是我如何意识到文档是多么重要。它允许团队拥有描述决策、以前的讨论、限制、数据结构、研究等的真实来源。它有助于新团队成员快速加入,老团队成员跟上内容,记住某些决策背后的推理,并理解不同的流程。
你可以有不同形式的文档。一般来说,与代码相关的文档保持接近代码,而围绕决策、讨论、研究等的更高层次的文档将在内容管理系统中,如 Confluence、conception、Coda 等。作为一名数据科学家,你将拥有大量关于数据结构、含义、管道、架构、分析、考虑因素、限制等的信息。所有这些信息需要存在于数据科学家头脑之外的其他地方,因为它会影响其他流和决策。
一方面,你会有团队成员需要微小的细节,因为他们将构建模型。另一方面,你也将有团队成员和利益相关者需要高层次的信息。您需要以一种双方都可以访问的方式来组织您的文档。
我通常为数据科学创建一个根页面,根据为每个受众定义的部分提供摘要和相关子页面的链接。例如,您可以拥有以下部分:
- 数据科学家入职
- 非数据科学家入职
- 寻求更新的利益相关方
除此之外,我还在每页的顶部添加了一个摘要,以帮助那些浏览文档的人。您的分析笔记本和存储库阅读材料也可以作为您的数据科学家同事的文档,但请记住将任何可能对团队其他成员有用的高级信息提取为可访问的摘要格式。

虚假登录页面示例—作者图片
演示和想象
就像其他类型的工程一样,通过更频繁地展示仍在开发中的工作,可以更好地展示进展。利用团队的演示,自信地展示正在进行的工作。你总是可以用一些免责声明来开始演示,以避免误解。它不需要很漂亮,它只需要表明一些事情正在发生,其余的来自你的解释。
出于某种原因,我们倾向于将数据科学视为只有在“准备就绪”时才能展示的软件作品。事实不应该是这样,因为通过共享正在进行的工作,可以学习和交流很多有价值的东西。这里有一些你可以一路演示的东西:
- 分析结果
- 实验笔记本
- 您收到的数据以及对其应用的清理过程
- API 调用
- 触发管道
- 建筑图
- 分析事件触发
- 分析仪表板
还有一些工具,比如 Jupiter 笔记本,可以帮助你使你的演示更加直观。Streamlit 是我的最爱之一。它是一个工具,旨在帮助数据科学家通过 web 应用程序展示数据科学工作,而不必实际构建 web 应用程序。它可以在本地用于演示,但也可以进行部署。部署 Streamlit 应用程序可以让整个团队有机会探索和测试正在构建的算法,并可以作为交流进展和让团队参与数据科学流的一种好方法。
和任何事情一样,在演示和观想时,有几件事你应该记住:
- 确保适应受众:太少的语境会引起恐慌和误解,太多的语境会让人迷失和分心。
- 理解演示的目的:一些演示是向客户展示东西,另一些是团队内部的。根据您可能需要调整声音的类型,或者展示更完美的输出。
- Streamlit 是一个很棒的工具。然而,非技术利益相关者很容易陷入 it 是实际前端的陷阱。这可能会导致未满足的期望,并要求 Streamlit 不支持的视觉调整。
调整你的沟通方式
虽然这与已经提出的许多观点重叠,但它有自己的一节是足够重要的。你会发现自己不得不与不同类型的观众交谈,有些人会有不同的知识和背景。为了有效地沟通,你需要考虑你在和谁说话,以及他们如何吸收信息。你可能会犯几次错误,我当然也犯过,因为如果你没有和这些人谈过话,没有和他们一起工作过,你不可能总是确定你需要什么来适应。
一些经验法则:
- 对高管讲话时:总结一下,很多。这些观众想知道关键点,以及是否有任何问题需要为您解决。你需要提供足够的背景来阐述你的观点,但同时要保持简短。对我来说,这不是自然而然的事,所以,如果你也是这样,请确保你在会议前有足够的时间准备正确的信息。
- 当与日常工作无关的人交谈时:高层次地交谈,尽可能使用图表来支持信息,并为更深入的提问和请求提供机会。
- 与你的直接团队交谈时:考虑到他们已经知道的背景,从高层次进行交谈,在有意义的地方展示你的工作/文档,并为提问、反馈和更深入的探讨提供充足的机会。记住,你的团队很可能不关心数学,他们相信你。他们只需要最终理解工作对产品和团队不同部分的影响。
- 与其他数据科学家交谈时:确保提供背景信息,并明确你要问/分享的内容。你对这项工作的深入程度将取决于你所讨论的内容。不要假设每个人都用公式说话,即使是公式也需要语境。
交流不仅仅是语言。以下是一些超出信息本身的提示:
- 视觉化:使用图表和视觉化来帮助表达你的观点。我发现线性图对于解释规模或时间非常有用(例如,当前状态- > mvp - >有史以来最好的产品),并讨论每个部分。这使得观众在了解当前焦点信息的同时能够看到更大的画面。
- 利用空白:当有人面前有幻灯片时,他们自然会被吸引去阅读里面的内容。当我希望观众真正专注于关键要点时,我会停止分享我的屏幕(如果我是远程的),或者有一个空幻灯片。我也建议利用停顿的力量来获得一个点,它给人们机会去吸收它。
- 以多种形式提供信息:有些人是视觉化的,有些人更喜欢通过电话/亲自查看,有些人更喜欢书面交流。我是一个非常喜欢书面交流的人,但是我适应任何我需要传达信息的人。如果你在演示中谈论一些东西,展示一些视觉效果,然后发送一个文档链接,你就满足了大多数人的需求。
- 简单的幻灯片:如果你使用幻灯片来传达一些信息(这在某些情况下可能是必要的),确保你有简单的幻灯片。不要添加大段大段的文字,坚持简单的视觉化。这有助于人们专注于你所说的,而不是被输入淹没。
有些情况下,你会有一大群不同类型的观众。在这些情况下,让某人感到困惑的可能性增加了,因为找到一条符合每个人需求的信息变得更加复杂。你不可能总是抓住他们,因此我的两个建议是:
- 向需要小组中最高级别信息的观众展示您会采用的方法
- 确保为人们提供提问的机会,并在演示结束后伸出手
使用隐喻
这听起来可能很傻,但是隐喻可以帮助人们理解你与他们分享的内容。让他们变得有趣也能帮助你吸引观众。
以下是我过去用来解释数据科学工作的两个隐喻示例:
- 为了解释为什么使用神经网络的用例非常重要:我用了一个孩子学习识别水果和非水果的例子。你给孩子看一个草莓,告诉他们这是一种水果,给孩子看一个苹果,告诉他们这也是一种水果。如果你再给孩子看一个苹果或草莓,他们把它们标为水果,你不会有很深的印象。然而,如果你给他们看一个桃子,他们说这是一种水果,现在我们有了概括。如果你给他们看一根香蕉,他们说它是水果,他们在技术上是错误的(取决于你问谁),因为它是一种药草,但最大的问题是“这有关系吗?”。这就是用例变得重要的地方:如果你在水果沙拉中加入香蕉,你仍然可以得到美味的水果沙拉,但是如果你给对草药过敏的人吃同样的水果沙拉,那么影响可能是致命的。
- 为了解释优化:我举了优化一只猫的例子。为了创造你理想的猫,你可能想最大限度地增加可爱和绒毛,同时尽量减少世界主导地位和毛球。你可以把你的猫描述成这四种属性的集合。然后你可以用下面的函数来表示你想要优化的东西。属性由算法改变,并根据优化函数进行测量。具有导致函数最大输出的属性的猫是你理想的猫。你可以看看我在柏林的 Meet.ai meetup 上尝试使用这个比喻。


获得反馈
偶尔的误解是不可避免的,不管你在这方面有多擅长。以下任何一种或更多情况都可能导致这种情况:
- 人们分心了
- 他们没有他们需要的背景
- 他们对这个问题的看法不同
- 有语言障碍
- 存在文化差异
- 你错误地判断了观众,没有做出相应的调整
- 你没有使用他们喜欢的交流方式
不管沟通不畅的原因是什么,你只能通过试图理解对方的解释,并寻求可行的反馈来找出原因。
结论
您可以使用多种方法让团队了解并参与数据科学流中发生的事情。找到对你的团队有用的东西,并使用它。你第一次不会做对。事实上,即使你已经做了一段时间,你也不会总是做对,因为每个团队都是不同的,你需要适应。无论你做什么,请,请,请,不要消失在一个数据科学的洞穴中 3 个月,从来没有和团队的其他人说过话,并带着一个模型出现在围栏外面。
使人工智能民主化的护栏
创建一个人工智能清单,将想法转化为生产

图片来源: Unsplash
85% 的人工智能项目从未得到部署!在已经部署的项目中,只有 60% 实现了他们承诺的影响!在今天一个典型的人工智能团队中,并不是每个人都具有构建成功的人工智能产品所需的相同水平的经验。团队成员在统计、模型基础、数据争论、操作、部署和产品设计思维方面的经验各不相同。
在构建几十个数据+人工智能产品的过程中,有个常见模式我在失败的产品中见过。所犯的错误不是因为不称职,而是因为团队已经知道但没有应用的东西使用不当。
为了填补这个空白,我一直在探索其他复杂任务中的技术,如进行手术、建造铲运机、驾驶飞机等。,把事情做好,交付一致的结果。在畅销书 【清单宣言 中,作者 Atul Gawande 涵盖了他在多个领域对清单在复杂活动中的作用的研究。
这个博客是创建一个我们可以作为一个社区使用的人工智能清单的起点。我创建这份清单的灵感来自于与旨在利用数据+人工智能的非营利组织合作,但由于经验有限而陷入困境。我相信,为我们的社区建立一个人工智能清单将在改善所有行业人工智能项目的死亡率方面发挥关键作用。此外,它将使人工智能更容易为每个人特别是非营利组织所用,并为创新创造一个公平的竞争环境。
人工智能清单
清单中有六个部分:

人工智能清单的结构(图片由作者提供)
- 正确的问题框架:定义范围、价值定义、时间表、治理、与可交付成果相关的资源的形成阶段。
- 正确的数据集:这个阶段可能需要几个小时或几个月,这取决于整体数据平台的成熟度和健康程度。数据是 ML 的生命线,所以获得正确可靠的数据集是非常重要的。
- 正确的数据准备:现实世界的数据是杂乱的。理解数据属性和适当的准备可以在调试中节省无数的时间。
- 正确的设计:这一阶段涉及特征选择,推理算法,分解问题,以及制定正确的模型算法。
- 正确的培训:建立模型,用坚持的例子评估,在线实验。
- 正确的操作准备:这是后期部署阶段,涉及模型和 ML 管道的可观察性,用新数据刷新模型,以及跟踪原始问题上下文中的成功指标。
右派问题诬陷
(详细版 此处)
1。验证解决问题有可量化的商业价值
2。证实更简单的替代方案(如手工制作的试探法)不足以解决问题。
3。确保问题已经分解到尽可能小的单元。
4。明确如何应用人工智能输出来实现预期的业务成果。
5。明确衡量解决方案成功的可衡量指标
6。清楚了解精确度与召回率之间的权衡问题
7。逻辑分类预测不正确时的验证影响
8。确保项目成本包括管理相应数据管道的成本
右侧数据集
9。验证了数据集属性的含义
10。验证了项目中使用的衍生指标是标准化的
11。由于数据管道错误,来自仓库或湖泊的验证数据没有过时
12。验证数据集的模式符合性
13。验证数据集是否符合数据权利法规(如 GDPR、CCPA 等)
14。确保数据集方案变更有明确的变更管理流程
15。验证数据集没有偏差
16 岁。验证正在使用的数据集不是孤立的,即没有数据管理员
正确的数据准备
17。验证数据是否为 IID(独立同分布)
18。验证未使用过期数据,即可能不相关的历史数据值
19。验证数据收集中没有系统错误
20。验证是否监控数据集的突然分布变化
21。验证数据中的季节性(如果适用)是否被正确考虑
22。在分成训练和测试数据之前,验证数据是随机的
23。验证测试和训练示例之间没有重复
24。确保采样数据在统计上代表整个数据集
25。验证标准化和规范化对缩放特征值的正确使用
26。验证异常值已被正确处理
27。验证从大型数据集中选择样本的适当采样
正确的设计
28。确保在跳到非线性模型(如适用)之前试验特征交叉
29。验证没有特征泄漏
三十。验证模型中添加了新功能,并记录了它们如何提高模型质量的理由
31。验证特征是否正确缩放
32。验证在使用深度学习之前尝试了更简单的传统 ML 模型
33。确保散列法应用于稀疏特征(如适用)
34。验证模型降维实验
35。验证分类阈值调整(在逻辑回归中)考虑了业务影响
36。验证逻辑回归中正则化或提前停止的应用(如适用)
37。应用嵌入将大型稀疏向量转换到低维空间(同时保留语义关系)
38。根据问题要求验证模型新鲜度要求
39。验证因仅适用于一小部分数据而被丢弃的特性的影响
40。检查特征计数是否与可用于模型训练的数据量成比例
正确的训练
41。在模型开发的早期阶段,确保可解释性不会过早地影响性能
42。验证模型调整是否遵循科学方法(而非临时方法)
43。验证学习率不要太高
44。如果损失时间图没有收敛,验证根本原因是否得到分析和记录
45。分析了模型准确性的特异性与稀疏性之间的权衡
46。验证减少损失值是否会影响提高召回率/精确度
47。为开始在线实验(即金丝雀部署)定义明确的标准
48。验证多类分类中每类的准确性
49。验证为培训分配的基础设施容量或云预算
50。确保使用相同的数据集验证模型排列(用于比较)
51。验证了模型的准确性,不仅针对整个数据集,还针对单个细分市场/群组
52。验证训练结果是可重复的,即拍摄代码(算法)、数据、配置和参数值
53。已验证特征的训练服务偏斜中没有不一致
54。验证模型预测中的反馈回路已被分析
55。确认如果在线实验不按预期进行,是否有备用计划
56。验证模型已经校准
57。利用自动化超参数调整(如适用)
58。验证预测偏差已被分析
59。验证针对类别不平衡分析的数据集
60。验证用正则化λ试验的模型,以平衡简单性和训练数据拟合。
61。验证相同的测试样品没有被反复用于测试和验证
62。验证批量超参数不要太小
63。验证神经网络中的初始值
64。验证失败实验的详细信息已被捕获
65。在投资修复标签之前,验证错误标签的影响
66。验证是否使用了一致的指标来分析在线实验的结果
67。验证多个超参数没有同时调整
正确的战备状态
68。验证用于生成时间相关特征的数据管道的低延迟性能
69。验证数据管道是否存在验证测试
70。验证单个数据切片的模型性能
71。避免在培训和服务之间使用两种不同的编程语言
72。确保适当的模型缩放,以使推理阈值在阈值范围内
73。验证在源头、湖泊摄入和 ETL 处理中检查数据质量的不一致性
74。验证与人工智能产品相关的云支出在预算范围内。
75。确保优化阶段平衡质量与模型深度和宽度
76。验证数据和概念漂移的监控
77。验证不必要的校准层已被移除
78。验证是否有监测来检测由于间歇性错误造成的模型慢性中毒
总而言之,在我的项目中应用人工智能清单极大地提高了成功率和交付速度!
结帐 解开数据——人工智能支持的现代数据平台内部和云的可观察性。
人工智能可靠性悖论
好到不能倒?一个高性能的系统会以令人惊讶的方式伤害你

想象两个(人类)工人:
- 克里斯粗心大意总是让你失望,他在 70%的时间里出色地完成了任务,而在其余的时间里却表现得畏首畏尾。看着克里斯尝试 10 次就足以激起你的【哦,亲爱的】反应。
- 罗尼可靠则是另一个故事。你已经看过罗尼一百多次了,你一直印象深刻。
百万美元的问题来了。哪个工人对你的企业更危险?
在一个高风险的任务中,答案可能是罗尼可靠…但可能不是第一个想到的原因。
这不是关于糟糕的项目
在的另一篇文章中,我已经指出,当决策者精神错乱时,极度可靠的员工可能是危险的。他们“只是服从命令”,即使那些命令很糟糕,所以他们可以放大无能(或恶意)。但这不是我在这里展示的逻辑,因为你已经听过我做的那个论证。让我们从另一个角度来看这个问题。
假设这个项目是一个好主意,如果做得好,会让世界变得更好,那么 Ronnie 可靠吗?
当你知道不该相信
问题是,你知道你不应该相信克里斯粗心。对你来说很明显。你预计会失败…这就是为什么你不会把房子押在克里斯身上。(对吧?)你不会让无能让你措手不及,所以你会围绕它进行设计。你会明智地为不可避免的失误设置故障保险。

图片:来源。
你也要确保你一直在关注着一些事情,所以你要彻底地监视克里斯·马大哈。但是罗尼呢?你相信罗尼可靠。为什么要检查或建立安全网?罗尼完美无瑕,对吧?
当心可靠的工人
罗尼并不完美。你只是还没有看到失败——需要更多的数据来观察断裂点。事实是,你还没有机会正确评估可靠罗尼的崩溃会有多灾难性。
过于信任是个问题。当一个系统有明显的缺陷时,你可以围绕它的错误进行计划。你不依赖完美的执行。
由于未能理解 好 和 完美 之间的关键区别,领导者可能会将好员工的祝福变成高水平执行者的诅咒。
在规模上,没有什么是完美的
问题是你认为你已经彻底测试了罗尼,但你没有。尝试 100 次以上才能看出什么是一团糟。扩大经营规模,你将面临一种令人厌恶的待遇。
虽然这篇文章中的建议适用于人类工作者,但它对于人工智能系统和其他可扩展的解决方案来说更为紧迫。关于基于数学和数据的解决方案,最危险的事情之一就是非专家过于信任他们。不要做那种坐以待毙的人,在复杂的任务上相信完美。
当你增加规模的时候,你会遇到长尾。
最好假设没有什么是完美的。即使是最安全的系统也可能失败……尤其是当你给它们足够多的机会时。

图片:来源。
正如现场可靠性工程师爱说的那样,“当你增加规模时,你会遇到长长的 尾巴 ”
围捕长尾
即使你的系统已经过全面测试,99.99%都是好的,那也不意味着它是完美的。不幸的是,如果你不小心的话,你可能会在头脑中把它四舍五入到 100%。换句话说,你会忽略错误的可能性,因为它们的概率很低。这是高性能系统可能比低性能系统更危险的另一种方式…除非你做点什么。
当错误的概率很低时,不要忽视错误的可能性。

“永不沉没”的泰坦尼克号是心理围捕的一个例子。据 NBC 报道,这个短语最初是“实际上是不沉的”,来自一本不知名的工程杂志,但过了一段时间,它就不重要了。最重要的是,有人声称听到船长爱德华·约翰·史密斯说“即使上帝自己也不能击沉这艘船。”图片:来源。
保持安全
在这里,让罗尼变得可靠而危险的并不是最出色的表现。威胁在于过度信任。
那么,有什么解决办法呢?你如何在不冒风险的情况下获得卓越的所有好处?简单!为罗尼建立安全网,就像你对付克里斯一样粗心。那么你就得到所有世界中最好的。
仅仅因为你还没有看到一个错误,并不意味着你的系统是完美的。为失败做准备,建立安全网!
无论这项任务是由人类还是机器来完成,永远不要低估安全网的重要性。允许自己被看似完美的表现所迷惑,产生一种虚假的安全感,这是糟糕的领导方式。
相信完美是危险的。把完美当成一个不错的奖励,但永远不要依赖它。
相反,问自己一些令人不快的假设问题。如果你的顶级外科医生生病了怎么办?如果监测病人生命体征的机器出现故障怎么办?司机太累没注意路况怎么办?如果自动边境控制系统的面部识别系统错误地识别了某人,该怎么办?如果检查护照的人出错了怎么办?接下来会发生什么?
“接下来会发生什么?”
每当我看到令人反胃的命运多舛的人工智能应用时,让我毛骨悚然的部分很少是自动化本身。这是建造者对错误的幸福无知。偶尔这种无知近乎犯罪。
错误* 会* 发生。
关于错误,要问的问题不是,“它们会发生吗?”他们会的。相反,你应该问:
- 有什么安全网来保护人们免受这些错误的后果?
- 如果整个系统——安全网等等——都失灵了,有什么计划让事情恢复正常?
如果没有预防和补救伤害的计划,那就为灾难做好准备。不管是谁负责这样一个项目,他都是无能的。他们是社会的威胁。不要成为那样的人。
人类对抗机器
如果一个错误是灾难性的,以至于失败是不可容忍的,那么就不要自动化任务,也不要让人类工人来做。或者,如果你的伦理中有一些东西说,故障来自人类工人比来自机器工人更好(这是许多自动驾驶汽车辩论的症结),那么就使用人在回路中的方法。
更好并不等同于完美。
但是无论你做什么,记住错误是可能的。人类会犯错,人工智能系统也会犯错。即使你部署的人工智能系统会比人类系统犯更少的错误,但请记住,少犯并不等于不犯。更好并不等同于完美。**
每当任务复杂或输入变化时,错误就会发生。
相信完美的神话会有可怕的后果,所以不要让数学的神奇思维妨碍了常识。每当任务复杂或输入变化时,错误就会发生。
概括起来
如果没有处理错误的计划,结果可能是灾难性的!它对你的打击可能比表现不佳的人犯的错误更大,因为你忘记了为此做计划。
所以,如果你聪明,你会选择最好的系统,但是建立安全网就好像它是最差的系统。
**http://bit.ly/quaesita_policy
感谢阅读!人工智能课程怎么样?
如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:
在这里欣赏整个课程播放列表:bit.ly/machinefriend
与凯西·科兹尔科夫联系
让我们做朋友吧!你可以在 Twitter 、 YouTube 、 Substack 和 LinkedIn 上找到我。有兴趣让我在你的活动上发言吗?使用这种形式取得联系。**
人工智能价值差距:第 1 部分
它将在分析能力方面迈出另一步,以实现与人工智能相关的数万亿美元的价值

大多数对人工智能价值产生的分析都想当然地认为人工智能将跨越一个相当大的鸿沟。几年后,技术有了进步,但使用技术仍然缺乏。图片由 Riette Salzmann 从 Pixabay 拍摄
AI 价值从何而来?
最近,麦肯锡全球研究所预测,通过评估 12 个行业的 120 个人工智能用例,人工智能到 2022 年将产生至少 3.5 万亿美元的经济影响。根据我的分析,这些用例主要关注需要规范分析的问题,在这些问题上,人工智能必须就如何做提出建议。规范分析是从描述性分析到诊断性分析再到预测性分析的发展过程,其中每一种分析都综合了先前形式的许多实例来解决更困难的问题。
使用 Cynefin 框架对问题进行分类

图片来源:维基媒体
在 Pariveda,我们经常使用 Cynefin 框架来讨论如何处理不同类型的问题。它是一个有用的工具,可以根据我们追踪原因和结果的难易程度,对如何解决问题进行分类:
- 简单因果关系清晰,几乎任何人都可以遵循已知的最佳实践。
- 复杂的,已知影响因果的未知因素,专家可以选择最佳的前进路径。
- 复杂,其中的因果关系不能事先知道。
分析学简史

从描述性分析到规定性分析的进展。作者图片
我们从传统的 BI 开始,将业务数据存储在数据库中,并使用 SQL 构建报告。由于这不足以真正推动真正的价值,我们想出了一套工具来构建可以不断重新加载的实时仪表盘,并实现了对下一层信息的钻取。这些工具足以解决简单的问题。在幕后,Tableau 和 QlikSense 等仪表板工具为用户提供了快速循环许多不同角度的描述性分析的能力,以便找到结果或趋势的原因。
同样的事情随着 21 世纪初预测分析的兴起而重演。使用更先进的统计建模算法,我们可以处理以前已经显示在仪表板上的大量信息。这些机器学习算法提取了所有数据背后的模式,这些数据过去由人类显示和诊断,以预测未来将发生什么。随着这些进步,分析工具本身能够解决一些复杂的问题。
在过去的 4-5 年中,规范分析逐渐兴起,这种分析建立模型来推荐应该做什么。他们考虑到,基于大量的输入,未来可能会有许多不同的潜在方式。然而,这些输入中只有一部分是在您的控制范围之内的。这就产生了一个优化问题,在这个问题上,规范模型会根据对预测模型的优化来推荐最佳行动,只改变您控制范围内的输入。规范性分析能够帮助新技术解决几乎任何复杂的问题,在这些问题中,一个人或一个团队可能无法独自处理更多的输入,以做出最佳决策。
在过去 3 年左右的时间里,一种叫做强化学习的技术的进步使得规范的建模技术开始解决复杂问题的一个非常小的子集(主要是棋盘和视频游戏),其中问题的整个背景的模拟是可能的。像 AlphaGo 在世界上最复杂的棋盘游戏中击败世界上最好的棋手,以及 OpenAI Five 在复杂的视频游戏中合作击败职业球队等系统的结果都令人印象深刻。但是,能够完全模拟依赖强化学习的现实问题相对较少。
人工智能的预计价值依赖于规定性分析
记住这个背景,让我们来谈谈行业分析师如何看待人工智能对世界的影响。这些数字令人震惊:据麦肯锡全球研究所(McKinsey Global Institute)称,在未来 4 年里,我们应该会达到这样一个点,即人工智能每年将对世界经济产生近 3.5 万亿美元的影响。为了更好地理解他们是如何得出这个结论的,我通读了早期报告的附录,其中他们详细描述了推动这个数字的 120 个用例。我手动将每个用例标记为预测性的或规范性的。

数据来源于麦肯锡全球研究院。作者分析&图表
根据我的分析,66%的价值是由规范性分析产生的,我们根据一系列潜在的未来向一个人推荐行动,并说这是最好的?其中只有 34%(仍然是 1.2 万亿美元,所以不是小钱)只需要预测分析。对于那些对细节感兴趣的人,你可以查看我对用例的详细分析。
基于此,我们真的需要专注于理解那些规定的问题,所以我从规定的用例中构建了一个词云(见下文)。推动这 2.6T 美元价值的主要因素显然是优化,您也可以看到 reduce 占据了突出位置。你开始发现很多价值的其他东西是跨行业的个人或个性化模型。此外,很明显,您会看到这都是通过优化预测生成的,而预测是由数据生成的。

使用Wordle(WordArt.com)从麦肯锡全球分析说明性用例文本生成的词云
去掉最突出的一层,我们可以更具体地看到我们在做什么。很可能我们正在优化营销分配、多种形式的战略、重资产的维护和定价。在个人方面,针对性(针对患者的治疗和针对个人消费者的广告)和个性化服务非常突出。这一分析突出的一点是,价值与优化和个性化核心业务流程密切相关。这些类型的问题肯定属于复杂空间,在广阔的生态系统中因果关系不清。

同一个词云,去掉了最大的词,让我们把注意力集中在下一层
人工智能的价值差距——规范不会让我们达到这个目标
当我们查看今天关于规定性分析的指南时,有许多指南侧重于技术建议(这里有一个 少数 好的 例子,但大多数 文章 都是 只是 定义 或 营销 绒毛)。有了今天的最佳建议,您将专注于寻找最佳的优化或可满足性求解器,并构建数据集成来满足它们,以便您可以将大量不同的输入纳入您的预测模型并提出建议。然而,这就是你所得到的一切:提出建议,然后呢?
事实上,最终发生的是这些复杂的问题,而这些问题正是很多价值所在。如果我是 Gap,Inc .,我想在我的【4000 多家商店和 7 个品牌中优化我的产品组合(麦肯锡确定的最高价值用例之一),这不是一个静态问题,我今天可以提出一个建议,说“好的,我现在将从那笔交易中获得 1–2%的收入增长。”我真正需要做的是随着时间的推移不断优化条件,这样我就不只是建议现在应该做什么,而是建立一个系统,随着时间的推移适应建议在过程的每个阶段应该做什么。
最重要的是,对问题空间的看法通常也非常有限。如果你考虑一个供应链优化用例:我如何管理仓库中的库存?这只是优化问题中的一个。在现实世界中,有库存、将货物运送到仓库的供应链,以及将货物从仓库运送到车间的物流。麦肯锡认为,当他们设计这种机制时,这些协同工作的东西将得到优化。回顾麦肯锡的使用案例,只有 12 个可以通过优化单个关注点来实现。这些主要包括许多不同行业的规定维护,但也包括一些后台办公自动化。

我对麦肯锡人工智能用例的分析表明,几乎所有的指令性用例都关注复杂的问题。您可以在这里找到用于分析的源数据。
迈向适应性分析
我想介绍的是一个新概念,我称之为自适应分析。实现自适应分析需要重复我们在从描述性到规定性的道路上看到的相同的分析演变。因此,自适应分析意味着思考一系列建议,并建立一个系统来确保这些建议随着时间的推移而变得更好,从而产生更好的结果。

自适应分析的发展遵循了我们在之前的分析转变中看到的相同模式。图片作者。
在定义自适应分析时,我引入了术语共同创造,我认为这可能是与规范分析最重要的区别。共同创作实际上已经在设计思维社区存在很长时间了。如果你想了解更多关于这个概念的知识,有大量的材料(模板、幻灯片、书籍、课程)可以很好地提供深入的建议。组织长期以来一直在使用这些技术,并通过让客户参与设计过程并在他们购买后继续支持他们来实现真正的价值(这导致了许多公司的客户成功部门的兴起)。通过人工智能共同创造,我们将开始使用数据&人工智能方法,在您使用自适应分析驱动的产品或服务时,实时应用在设计思维研讨会中获得的一些概念。
以下是我对人工智能共同创造的定义:
当人工智能代理与人类合作者交互时,人工智能共同创造发生,人类合作者逐渐向代理提供更多信息。这两者一起工作来发现和优化人类的目标。
让我们分析一下这个定义。一个希望采用自适应分析的组织首先必须将客户视为合作者。这种思维模式的转变非常重要。通过把你的客户想象成将与你一起工作的人,不仅你的人工智能需要继续帮助他们,而且你可以要求他们帮助你。
这就引出了第二部分:世卫组织逐步提供更多信息。这可以通过应用程序内的数据收集来实现,也可以通过下面提到的其他反馈回路来实现。
最后一句话强调需要理解你正在优化的目标,以便随着时间的推移取得成功,并承认这些目标通常很难预先阐明,所以它们也必须随着时间的推移而被发现。这对于掌握着人工智能大部分价值的复杂问题尤其重要。
自适应分析领域的创新者
让我们看几个例子来帮助澄清概念:
Gong.io:销售支持
Gong.io 通过使用高级自然语言处理解决 B2B 销售的复杂问题而闻名。他们吸收销售过程中的所有数据:电子邮件、电话交谈、视频通话、面对面会议的录音。使用这些数据,他们可以确定一些事情,比如谁在什么时间发言,整个时间内的谈话主题是什么,(例如,你是在演示、做介绍、闲聊等等。)然后,他们将这些数据与该组织现有 CRM 系统所取得的结果(销售结果、获得下一次会议、销售周期长度等)进行比较。然后他们所做的是在视频或电话,或电子邮件期间实时提出建议,你可以通过该系统。这些建议是他们的人工智能代理“认为”你可以优化你现在正在做的事情。到目前为止,他们使用的是规定性分析。
让我们看看他们如何开始转向自适应分析:
- 他们基于大量的数据提出这些建议,因为他们需要你的 CRM 结果,给他们关于你是否达到目标的详细数据。这里,协作方面就出来了。
- 他们实时提供建议,试图帮助你适应这种情况。
- 如果你忽略这些建议,只做你认为最好的事情,那么他们会跟进并获取关于为什么会发生这种情况的信息,随着时间的推移,每个使用龚的销售人员都开始获得更个性化的代理,以一种他们实际上会听而不是说的方式来帮助他们
使用这些技术,他们建立了一个系统,使那些按照他们的方式成功销售的人能够从他们整个组织(实际上是整个龚用户群)的广泛经验中学习。然而,他们不仅在学习更好的实践,他们还在实时应用这些实践,使之具有可操作性,并适应激励你接受建议。
AutoCad:创成式设计
AutoCad 是计算机辅助设计软件的领先供应商。他们的生成设计软件将软件从简单记录设计师的工作转变为通过生成设计与设计师合作。它通过要求规格,然后生成数百个符合规格的设计,同时优化设计的特定方面,循环进行。然后,设计师选择最符合其规格的设计,并可以(通常会)添加更多约束。
亚马逊 Alexa 产品订购
我们都想在用完之前补充家用物品。因为我的房子里到处都有 Alexa 设备,所以当我意识到我缺少一些东西时,我可以很容易地完成我的目标。
如果我告诉 Alexa 订购更多的垃圾袋,她会说,“我看到你过去订购过 Glad ForceFlex 垃圾袋。他们将在两天后到达这里。你想再点一次吗?”这给了我做订单所需的所有信息,整个过程花了 30 秒左右。当我与 Alexa 交互时,亚马逊使用大量上下文信息来为我在这种情况下想要的产品建立订单。
如果我在 Alexa 建议订购时告诉她“不”,那么我会根据像我一样的购物者在网站上的受欢迎程度获得一系列其他潜在产品,Alexa 会记住我下次订购的产品,同时也会将这些信息考虑在内,以便向像我一样的其他客户推荐。
自适应分析—未来工作
有几种技术可以帮助拥有强大技术基础的组织增强其数据科学能力(通常是那些积极部署规范分析应用程序的组织)。我将在以后的文章中充实这些内容,但下面会介绍一些概念。
让您的组织为自适应分析做好准备的第一步是开始将您的客户视为将与您合作的合作者。这需要对合作者的目标有深刻的理解,并由一系列人工智能驱动的反馈回路提供支持,这些反馈回路由无缝技术平台实现。为了开始理解客户的目标,人们可以从利用许多来自设计社区的移情技术开始。然而,在人工智能将产生最大价值的复杂场景中,你的合作者通常不会从一开始就知道他们的真正目标。你必须让他们逐渐表达他们的目标(这是自适应分析的自适应部分)。我认为必须建立 4 层反馈回路:

反馈循环是实现自适应分析的关键之一。图片作者。
- 交互式循环,实现接近实时的反复往复
- 使用新数据快速改进和个性化模型的自动循环
- 引入额外信息并改变 UX 的分析循环
- 开发整个产品下一版本的扩展循环
我期待着在未来的帖子中扩展这些概念。
本系列文章的更多内容:
一如既往,感谢阅读到这一点!我写这些文章是为了激发讨论,所以请不要犹豫,通过 Medium 或 LinkedIn 回复。
人工智能战争:从瘫痪领域的冲突中吸取教训
塑造了人工智能领域的发展和研究的冲突背后的故事。
年轻的弗兰克·罗森布拉特(Frank Rosenblatt)正处于心理学家职业生涯的巅峰,他创造了一个可以学习技能的人工大脑,这在历史上还是第一次,甚至《纽约时报》都报道了他的故事。但他童年的一个朋友出版了一本批评他工作的书,引发了一场智力战争,使对人工智能的研究瘫痪了多年。

弗兰克·罗森布拉特(左)和马文·明斯基(右)。维基共享资源和本·格雷/Flickr 提供的原始照片。
这位朋友是马文·明斯基,他从青春期就认识罗森布拉特,他的书是符号人工智能的支持者传播神经网络不起作用这一观点的完美借口。
许多工程师和科学家认为他们不应该担心他们周围的政治或社会事件,因为他们与科学无关。我们将了解到,在上个世纪的很长一段时间里,利益、政治和金钱的冲突让人类在人工智能领域失去了希望,不可避免地开始了众所周知的人工智能冬天。
这不是一个关于数学、人工智能或科学的故事。这是一个关于贪婪、无知和人类好奇心胜利的故事。
这是人工智能战争背后的故事。
神经元
一个 11 岁的西班牙男孩因众所周知的叛逆行为制造了一个自制的大炮,他开枪摧毁了邻居的门,为此他被逮捕并入狱。
同样是这个孩子,圣地亚哥·拉蒙·卡哈尔,在 40 年后获得了诺贝尔奖。
他是一名外科医生的儿子,这一职业迫使他的家人不断旅行。圣地亚哥是一个非常优秀的画家和体操运动员,但他的父亲从不鼓励这些能力。这些才能将有助于他日后的成功。他在萨拉戈萨学医,职业生涯结束后被西班牙军队招募并被送往古巴,在那里他染上了疟疾和肺结核。在西班牙康复并担任了几年教授后,他开始使用一种新的方法来观察脑组织,由此他绘制了大脑主要区域的大量细节图。
在 20 世纪之前,科学家认为大脑是一个单一的连续网络,中间没有任何间隙。
圣地亚哥用新技术证明了神经细胞之间的关系不是连续的。德国解剖学家海因里希·瓦尔德耶(Heinrich Waldeyer)学习西班牙语研究圣地亚哥的发现,并将观察结果总结成他所谓的:神经元理论(“神经元”概念在此之前并不存在)。

大脑皮层的锥体神经元(1904),由圣地亚哥绘制。图片由卡哈尔研究所(CSIC)提供。
神经元在成人体内生长的能力以及它们创造新连接的能力可以解释学习。
圣地亚哥·拉蒙·卡哈尔,1894 年
因为最后一句话,圣地亚哥被认为是历史上第一位神经科学家。这些发现永远改变了我们对大脑的理解。

圣地亚哥·拉蒙和卡哈尔·⁴.
多亏了这项新知识,心理学家弗兰克·罗森布拉特几年后可以在他所谓的感知机中复制人类神经元。

第一个人工神经元
1935 年的一个下午,一个名叫沃尔特·皮茨的孩子被几个恶霸追赶,他迅速躲进了当地的图书馆。图书馆是他躲避外面残酷世界的避难所。
皮茨在图书馆呆了三天,不仅是因为那些恶霸,还因为他的注意力被一本试图将所有数学简化为纯逻辑的书所吸引。皮茨坐下来,开始阅读这本书的近 2000 页。在那些日子里,他发现了一些错误,并给作者伯特兰·罗素写了一封信,罗素很惊讶,因为沃尔特只有 12 岁。
15 岁时,他离家出走,从那时起,他拒绝谈论自己的家庭。从那时起,他开始了他的人生旅程,在芝加哥大学听几位数学家的讲座。他在那里遇到了物理学家尼古拉斯·拉舍夫斯基,数学生物物理学的创始人,并被他的工作所吸引。
这些新的知识启发了沃尔特用计算机复制大脑的功能。几年后,他发表了一篇论文,作者是帮助他摆脱流浪生活的人(他已经无家可归好几年了),沃伦麦卡洛克。他们提出了第一个神经网络的数学模型。这个模型,一个简单的形式化神经元,仍然是神经网络领域的参考标准。当他们展示这幅作品时,皮特只有 20 岁,他们正处于第二次世界大战的中期。两位科学家都受到被认为是计算机科学之父的英国数学家艾伦·图灵的启发,他们使用最近发表的图灵机概念来复制大脑。

沃尔特·皮茨正在用一只青蛙做实验。Iapx86 在⁵.维基共享资源上的原始图片

感知器
正如 Santiago Ramón y Cajal 所说,当我们的神经元创建新的连接时,人类就会学习。如果狗咬了我们,负责识别狗的神经元和识别疼痛的神经元同时触发信号、,并在它们之间建立联系。随着我们收集到更多对我们无害的狗的经历,两组神经元之间的联系被削弱,我们不再将疼痛与狗联系在一起。
这个故事的主角弗兰克·罗森布拉特 1928 年出生于美国,他学习心理学,但他的研究兴趣广泛:从神经生物学到计算机科学。这些不同的领域让他创造了他最著名的人工制品:T4 感知器 T5、T6,这是一种根据生物学原理构建的电子设备 T7,T8 显示出学习 T9 的能力。
许多科学家对大脑如何工作的研究和计算机的发明正在汇聚成一个具有学习能力的人造大脑。Frank Rosenblatt 设计了感知器,这是一种模拟神经元学习过程的数学结构。
感知器是一个具有三个元素的结构:神经元、链接和一个名为权重的参数,用来模拟神经元之间连接的强度。这是一种人工神经网络。
每个神经元都存储一个数字,这个数字是其他神经元的“信号”。在下一个动画中,您可以看到如果连接很强(权重),第一个神经元的变化将如何影响下一个神经元,如果连接很弱,则不会影响它。就像人脑一样。

权重如何影响神经元交互的示例。我作者法师。
感知器的完整结构由三层和权重组成:

我作者法师。
输入-神经网络中的第一层(蓝色)。它接受输入值,并将它们传递给下一层。
隐藏层(灰色)-帮助数据处理的一组神经元。
输出层(绿色)-用于在操作后获得结果的层。
一般来说,感知器只是一个有输入和输出的函数,权值只是函数的内部工作。
这个网络可以像婴儿一样被训练,我们将输入大量的例子到网络,我们将在输出层看到结果,每次我们得到一个不好的答案,一个算法将改变权重的值。
关于更详细的解释,你可以阅读我的文章一篇关于人工智能和机器学习的有趣且超级简单的介绍

男性对女性实验
罗森布拉特领导设计了一台计算机来实现这一想法,并试图训练它识别照片中男性和女性的差异。
“[海军]期望的电子计算机胚胎将能够行走、说话、看、写、自我复制并意识到它的存在。”
纽约时报 关于感知器的报道。
虽然感知器最初看起来很有前途,但很快证明,感知器不能被训练成识别许多类型的模式。这个系统无法理解男性和女性之间的区别。
这是人工智能崩溃的开始。
这本书
研究人员在研究这个问题时不知道的是,人工智能社区后来发现:为了识别复杂的模式,我们需要不止一层隐藏的神经元,这是我们今天所知的深度学习的关键概念。
马文·明斯基和西蒙·派珀特于 1969 年出版的《感知机》一书给出了数学证明,承认了感知机的一些优势,同时也展示了它的主要局限性。最重要的一个与 CPU 通常执行的最简单操作之一的计算有关:XOR 函数。
简单来说,XOR 是一个逻辑函数,如果只有一个输入为真,则返回真。一般来说,XOR 是一个逻辑门,如果真输入的数量是奇数,则返回真。这本书展示的是,只有一个隐藏层的感知器无法映射异或函数,这也意味着它无法复制几个复杂的函数。为了处理复杂的功能,我们需要更多的层,但是社区忽略了这个事实。

马文·明斯基和西蒙·派珀特。⁶ ⁷.维基共享资源的原始图片
罗森布拉特和明斯基成为人工智能研究社区内部一场辩论的核心人物,并以在会议上大声讨论而闻名,但仍保持友好。
这本书的结论被错误地解读为神经网络不可能有进一步的发展,这种人工智能的方法不得不被放弃。
马文·明斯基一生都持怀疑态度,甚至在他生命的最后几年,他也不相信人工智能的进步。即使作为 field⁶.的专家,他也做出了很多糟糕的预测

人工智能战争
这种炒作在许多新兴技术中很常见,比如铁路热、网络泡沫以及最近比特币的兴起。
在其整个历史上,对人工智能的研究经历了几个炒作周期,随后是失望和批评,随后是资金削减,随后是几年或几十年后的重新关注。“人工智能冬天”这个术语是通过类比核冬天的概念而创造出来的。
当感知器被研究时,新的方法,包括符号人工智能出现了。引发这场“人工智能战争”的核心问题是,不同的群体发现自己在争夺资金和人才,他们对计算能力的需求远远超过了⁴.的供应
与神经网络相反,符号人工智能更容易理解,其结果也更容易解释。为了使用符号人工智能,我们需要向计算机描述问题的整体,指定它们的对象和规则,然后计算机将基于这些规则做出假设。一般来说,支持这种方法的科学家反对使用神经网络。
几年后,研究人员发现神经网络在处理不确定性问题时更有用,例如对⁵.进行预测但是在《感知器》一书出版后,研究经费站在了象征性人工智能的一边。
1973 年,英国议会要求詹姆斯·莱特希尔爵士教授评估人工智能研究的状况。他的报告,现在被称为莱特希尔报告,批评了人工智能未能实现其“宏伟目标”。他的结论是,在人工智能领域做的事情,在其他科学领域都做不到。
该报告导致了英格兰未来 10 年人工智能研究的彻底瓦解。

詹姆斯·莱特希尔爵士。⁸.维基共享资源的原始图片
弗兰克·罗森布拉特于 1971 年 7 月在他 43 岁生日时死于切萨皮克湾的一次划船事故。

死灰复燃
尽管国防高级研究计划局(DARPA)不再相信 AI 的可能性,但一个名为动态分析和重新规划工具(DART)的新项目改变了这项研究的命运。这个工具被美国军方用来优化和安排物资或人员的运输被证明是如此成功,以至于它在 4 年内获得的资金超过了 DARPA 在过去 30 年里投入人工智能研究的所有资金 ⁷.多亏了 DART,1990-91 年的沙漠盾牌/风暴行动成为了战争史上规模最大、速度最快、距离最远的一次海上运输。
虽然 DART 不是我们现在所知的 AI,但它当时被称为人工智能程序,帮助保持了调查的火焰。

但即使在 2000 年代中期,人工智能领域的研究人员也有意用其他名称来称呼他们的工作:信息学、机器学习、分析学等。该领域的声誉受损。
在接下来的几年里,由于炒作和失望的持续循环,出现了其他的小 AI 冬天,但最终,人类的好奇心沿着罗森布拉特建议的路径,在神经网络中发现了一个圣杯。最终,微小的变化导致了缓慢的常态,现在人工智能无处不在:在我们的手机里,在你上下班乘坐的公交车上,在 Instagram 为你提供的那些无尽的推荐中。
但是,象征性的人工智能最终幸存下来了吗?
例如,象征性人工智能不允许预测下个月的黄金价格。虽然神经网络可以做到这一点,但它无法解释中间的过程。就像一个黑匣子。人工智能的下一个重大进展可能是创造出融合了两种模式优点的混血儿 ⁸.
人工智能的春天和下一场战争
人工智能的冬天被认为已经结束,因为由机器学习驱动的解决方案取得了巨大成功。谷歌翻译、AlphaGo、沃森和 GPT 3 是这些天来推动人工智能进步的一些摇滚明星。由于这些技术,我们目前正生活在自 2010 年以来的人工智能春天。
但是,不仅由于这些公司创造的高期望,另一个人工智能冬天可能会到来,而且我们可能会在这两个激烈竞争最新人工智能趋势的项目之间爆发另一场人工智能战争: Deepmind(谷歌)和 Open AI(由埃隆·马斯克和其他人创立) ⁹.
当研究人员专注于拥有最佳网络模型来解决现实生活中的问题时,关于人工智能伦理的讨论变得越来越难。几个月前,谷歌解雇了一名计算机科学家,该科学家警告说,当前的人工智能模型⁰.存在种族主义和性别歧视
最终,我们是人类,我们天生具有竞争性和冲突性,唯一能拯救科学的是我们的好奇心和毅力。

参考资料:
[1]对感知者争论的官方历史的社会学研究(1996)。https://journals.sagepub.com/doi/10.1177/030631296026003005
【2】试图用逻辑救赎世界的人(2015)。https://nautil . us/issue/21/information/the-man-who-that-to-redempt-the-world-with-logic
[3]神经质神经元。【https://ncase.me/neurons/
[4]计算能力和人工智能的社会影响(2018)。https://arxiv.org/abs/1803.08971v1
[5]符号人工智能和数字人工神经网络:走向二分法的解决(1995)。https://link . springer . com/chapter/10.1007% 2f 978-0-585-29599-2 _ 11
[6]马文·明斯基的人工智能预测有多准确?(2020).https://www . bright work research . com/how-accurate-was-Marvin-Minsky-in-his-ai-predictions/
[7] DART:革新物流规划(2002)。https://ieeexplore.ieee.org/document/1005635
[8] AI 的下一个大飞跃(2020)。https://knowable magazine . org/article/technology/2020/what-is-neuro symbolic-ai
【9】open ai 已经超越 DeepMind 了吗?(2020).https://analyticsindiamag . com/has-open ai-supered-deep mind/
[10]我们读到了迫使蒂姆尼特·格布鲁离开谷歌的那篇论文。这是它说的(2020)。https://www . technology review . com/2020/12/04/1013294/Google-ai-ethics-research-paper-forced-out-Tim nit-gebru/
[11]https://triple ampersand . org/kernelled-connections-perceptron-diagram/
[13]T2]https://www . national geographic . com . es/science/current/una-sample-con-drawings-Santiago-Ramon-Cajal-recur-USA-Canada _ 11187
[14]【第 4 季】http://DBE . rah . es/biologies/10967/Santiago-Ramon-y-Cajal
[15]https://es . Wikipedia . org/wiki/Walter _ Pitts #/media/file:lettvin _ Pitts . jpg
[16]https://en . Wikipedia . org/wiki/Marvin _ Minsky #/media/file:Marvin _ Minsky _ at _ olpcb . jpg
[17]https://es . Wikipedia . org/wiki/Seymour _ paper rt #/media/file:paper rt . jpg
[18]https://es . Wikipedia . org/wiki/James _ light hill #/media/file:James _ light hill . jpg
Scikit-Learn 1.0 的目标
有哪些新特性,为什么它们对第一个主要版本如此重要?

图片来自 Unsplash (Mae Mu)
从 Scikit-Learn 开始到现在已经过去了 14 年,发布了 24 个测试版,现在终于到了 1.0 版。这听起来可能有点奇怪,因为 Scikit-Learn 已经被数千家公司、数据科学家、研究人员使用了很长时间,每个人都认为它是通用机器学习最广泛的框架。
在本文中,我不想像许多其他文章那样对新特性进行分析,而是想了解 Scikit-Learn 这个版本的目的以及它未来的发展策略是什么
1.一些历史
Scikit-Learn 诞生于 2007 年,最初是谷歌的代码之夏项目,并在 T2 的研究环境中继续开发。它的目标是作为一种工具进行数据分析,而不必关注任何特定的技术或代码。由于这个原因,它基于 Python,一种开源语言,易于使用,通用,并且能够嵌入 C 代码

图片由作者提供:sci kit-学习作为一种力量,卑微的数据 Jedis 需要用可靠和高效的库工具来对抗帝国公司。
处理数据时的另一个大问题是内存和处理方面的计算资源,因此 Scikit-Learn 一直在努力提高算法效率,以允许即使是计算资源较少的用户处理数据。Scikit-Learn 通过使用统计近似值和低级代码(Cython)来实现这一点。
此外,Scikit-Learn 超越效率和简单性的关键点是文档。很多数据科学家(我自己)都是通过阅读 Scikit-Learn 的文档来学习机器学习的。它不仅仅是代码文档,还是数据科学的学习途径。
2.1.0 版
如果我们看到这次发布的亮点,我们可以看到 API 的变化,甚至一些很酷的新功能

图片:来自 scikit-learn.org 的说明
然而,通过查看 changelog 页面并绘制通过处理 HTML 页面提取的标签,我们可以看出大多数标签是修复和 API 更改。

作者图片:每个标签的特征数量和生成它的代码。
在下一节中,我们将深入探讨三个主要主题,它们可以总结该版本的所有变化。
3.发布亮点
3.1.API 标准化
库接口中的一个重要模式是所有的模块都可以互换。这意味着,例如,如果您试图构建一个监督模型,拟合、测试、预测和测量该模型准确性的函数和方法独立于您正在构建的监督模型的风格(线性回归、决策树、k-means……)。
具有相同功能的对象之间的标准接口和签名。
然而,在不同的模块和版本之间,模块的签名是相同的,但是预期的值不是(例如,“X 应该是 np.matrix 还是 np.array?”,“loss='ls '还是 loss='mse '?…").解决这一问题的一些亮点是:
- 签名:现在他们强制使用只有关键字的参数。
- 数据类型:新特性正在与熊猫一起工作(例如,估算器存储了熊猫的特性名称。训练时的数据帧)。同时,不推荐使用 np.matrix 类型。
- 参数值:一些函数和模块有相同的参数(loss、scaler、criterion 等),但它预期的值不同,这已经改变。一些编码器现在可以接受缺失值和未知值。

图片作者:现在参数值需要和参数名一起传递。这是一个很好的限制,可以避免遗留的设计不良代码的问题。
3.2.计算性能
当你创建一个以数据思维工作的库来为每个人服务时,你还必须考虑到大多数人并没有很高的计算资源,而只是简陋的家用笔记本电脑。这就是为什么 Scikit-Learn 总是试图使用低级嵌入式语言(Cython)来提高性能(如 SVM 和 GBDT 算法)。
Scikit-Learn 允许在资源不足的简陋笔记本电脑上使用机器学习。
在此版本中,许多功能和模块的效率得到了提高,例如:
- 预处理器:(标准缩放器、KBinsDiscretizer、多项式特性)
- 估计器:(逻辑回归、邻居、聚类……算法)
- 降维算法
此外,不是性能增强的新功能,而是利用统计属性的新模型,其性能比原始模型更快:
- 在线单类 SVM: 使用具有随机梯度下降和核近似的单类 SVM,以将复杂度从二次降低到线性。
- histgradientsboostingclassifier:梯度增强实现,其中特征的值被分割成样条。树学习样条值而不是值本身,从而减少基数。

图片由作者提供:梯度提升分类器和直方图梯度提升分类器的计算时间比较以及生成图的代码。
3.3.尺寸
将 Scikit-Learn 仅仅视为一个机器学习框架是一个常见的错误,但事实是它走得更远。它提供了一套工具,不仅可以开发模型,还可以测量和理解已训练模型的预测。
当您不仅想要创建一个预测模型,而且想要从它所学到的东西中提取洞察力时,这一点尤其重要
此版本带来了一些简化指标计算的新特性和一些新指标:
- 增加了方法:用于度量和图表 from_estimator 和 from_predictions。
- 新指标: pinball_loss 和 tweedie_score。
- 显示结果校准显示的新图。

图片来自 Scikit-Learn 文档
3.4.社区
最后但同样重要的是,其他种类的变化与任何技术原因都无关,只是为了解决社区的关注和需求。Scikit-Learn 一直试图不仅仅是一个图书馆,而是一个完整的环境,将机器学习知识带给人们,并定义一些标准。一个证据是以下事实:

在 2100 多个合并的拉请求中,大约 800 个是对我们的文档的改进。
文档中的这些更新主要是为了提高用户资源的质量,并满足他们更多的需求。这种需求也可能是出于伦理原因,例如删除波士顿数据集
4.结论
在本文中,我们介绍了 Scikit-Learn 1.0 版的主要特性,并试图从库的历史背景来解释它们的重要性。
听起来可能有点奇怪,第一个主要版本主要是修复和 API 变化,而不是新特性,但是,理解 Scikit-Learn 的目的,我们已经看到它的目的一直是
定义一个机器学习的标准,独立地将工具带给大多数人,如果他们是研究人员、雇主、学生或者只是作为一种爱好。
这正是他们在此次发布中所取得的成就。
对齐问题
播客
布莱恩·克里斯蒂安谈人类最大的——也是最后的——挑战
编者按:这一集是我们关于数据科学和机器学习新兴问题的播客系列的一部分,由 Jeremie Harris 主持。除了主持播客,Jeremie 还帮助运营一家名为sharpes minds的数据科学导师初创公司。
2016 年,OpenAI 发表了一篇博客,描述了他们的一项人工智能安全实验的结果。在这篇文章中,他们描述了一个经过训练以在赛船游戏中最大化其分数的人工智能如何最终发现了一个奇怪的黑客行为:人工智能没有尽可能快地完成比赛线路,而是了解到它可以通过绕过一系列目标来获得基本上无限数量的奖励分,在这个过程中,它需要撞上障碍物,甚至在线路的某些部分以错误的方向行进。
这是对齐问题的一个很好的例子:如果我们不非常小心,我们可能会训练人工智能找到危险的创造性方法来优化我们告诉他们优化的任何事情。因此,构建安全的人工智能——与我们的价值观一致的人工智能——需要找到非常清楚和正确地量化我们希望我们的人工智能做什么的方法。这听起来似乎是一项简单的任务,但事实并非如此:几个世纪以来,人类一直在努力定义经济健康或人类繁荣等方面的“好”指标,但收效甚微。
今天的播客专题是 Brian Christian——他是几本关于人类与计算机科学和人工智能之间联系的畅销书的作者。他的最新著作《排列问题》探索了排列研究的历史,以及如果我们打算安全地将推理外包给机器,我们将不得不回答的技术和哲学问题。布莱恩对对齐问题的观点将我们迄今为止在播客中探索的许多主题联系在一起,从人工智能偏见和伦理到人工智能的存在风险。
以下是我在对话中最喜欢的一些观点:
- 没有人知道人类水平的人工通用智能将如何或何时被开发出来,或者它对人类的影响将是什么。但两种情况中的一种似乎是可能的:要么 AGI 将在一个特定的研究实验室中展开的训练过程中,在几天甚至几分钟内迅速出现(快速起飞),要么它将由许多不同的组织逐步发展,在其发展过程中没有任何一个阶段明确代表越过 AGI 终点线的关键时刻(缓慢起飞)。布莱恩倾向于认为后一种情况更有可能。
- 布莱恩指出,在某种程度上,人类在其历史的大部分时间里一直在解决排列问题。国家和大型组织必须保持其劳动力和人口的一致性,朝着使其具有经济竞争力的目标努力。通常,这些目标是用狭义的指标(GDP、年利润或股市表现)来表达的,但这也产生了狭义指标定义对机器学习系统产生的所有相同问题。具体来说:一个单一的指标很少能捕捉到我们希望一个系统(一个人工智能,一个公司,一个国家)做的所有事情。让一个人工智能最大限度地生产回形针,你就给了它杀死任何可能与它竞争原材料的人的动机。要求政府最大化其经济的 GDP,任何没有被 GDP 捕获的东西(如生活质量、污染或非市场交易)都有被忽视的风险——或者更糟,被积极伤害。
- 像许多人工智能安全研究人员一样,布莱恩不相信我们会通过定义狭窄的指标并要求人工智能系统优化它们来构建安全的人工智能。这就是为什么他对一种叫做逆向强化学习(IRL)的潜在替代策略感到兴奋。IRL 系统的设计不是为了优化一个给定的指标,而是为了学习他们自己的人类价值模型,然后为此进行优化。通常,这是通过基于观察人类行为来推断人类偏好来完成的。例如,一个团队通过让强化学习代理随机执行两个动作来训练它做后空翻,让一个人选择他们认为最“像后空翻”的动作,并在重复这个过程之前相应地更新它的后空翻策略。虽然 Brian 不认为这是对齐问题的完整解决方案,但他认为这可能是其中的一部分。
- 度量标准在远处看起来很好,但是当你开始对它们进行太多的积极优化时,它们很快就变成了你真正想要的东西的糟糕代理。以股市为例:在 20 世纪初,可以肯定地说,只要股市在上涨,美国经济就会好转。然而,在 2020 年,我们已经看到美国股市飙升至历史新高,尽管失业率极高,经济基本面可能是负面的,部分原因是选民和政治家太关注它,将其作为判断政府表现的指标。于是黑客被发现,钞票被印制,美联储比率被降低,有效地将股票市场与它本应衡量的经济状况脱钩。布莱恩讨论了一种称为早期停止的策略,可以用来部分解决这类问题:这个想法是训练一个人工智能系统来优化一个指标,但不允许它优化太多——换句话说,就是尽早停止。
- 我们讨论了为什么人类可能是进化早期停滞的一个例子,从进化的角度来看,我们不是一个“成品”。在某种程度上,这可能是为什么很难确定可以持续优化以使我们快乐的指标:我们可能实际上没有如此清晰和明确定义的偏好,因为我们是进化的过客——只是足够一致以在进化过程中竞争我们的位置,但不够一致以拥有一致的道德偏好集。很难用几句话就把对话的这一部分(以及所有适用的注意事项)说清楚,所以如果你感兴趣,我强烈建议你看看这一集。
你可以在 Twitter 上关注 Brian 这里,或者 me 这里。

章节:
- 0:00 介绍
- 1:35 对准问题概述
- 7:02 AI 安全范围内的摩擦
- 10:30 AI 与决策
- 12:30 大赦国际和刑事司法
- 改变的激励措施
- 23:20 当代问题和存在主义考虑
- 30:45 存在风险的出现
- 38:02 组织味的对齐问题
- 42:20 对准问题成为一切问题
- 50:00 我们的各种偏好
- 56:20 人类的模糊
- 1:03:10 宇宙的奖励功能
- 1:06:05 总结
数据科学写作的最佳指南
阅读清单
学习如何为你的同事和同龄人写得更好

数据科学博客生态系统丰富且不断发展。仅 TDS 就拥有超过 20,000 篇文章的档案,涵盖众多主题。许多专家推出了子博客、时事通讯或个人博客。如果你正在寻找好的新读物加入你的花名册,看看维姬·博伊基斯,兰迪·欧,或者从十篇基础 ML 博客文章开始。
我们中的许多人也有兴趣贡献我们的想法和观点;我 2021 年的目标之一就是多写多发表。但是对于我们这些更倾向于技术的人来说,写作可能比编码更难。你如何开始?你应该涵盖哪些主题?数据科学界想看什么?如何能更好的掌握技术写作?
我深入研究了 TDS 的档案,收集了 12 个最有用的写作指南和对在线写作挑战的真实思考。它们也是引人入胜、内容丰富的写作范例。
数据科学写作有许多子类别。今天我们将探讨三个问题:
如果你想了解更多为什么你也应该开始写作,我在文章末尾添加了一些链接,坦率地讨论了许多好处(和困难!)来源于定期在网上发布。写作提高了有助于你职业发展的软技能,提供了网上偶然的社交机会,是学习新事物的好工具。
业务报告
客户不读代码,他们读报告。花足够的时间思考如何将复杂的模型和统计结果转化为非技术受众可操作的见解非常重要。下面的文章探讨了强大的分析报告的构建模块。
最好的写作资源来自实践者,他们已经基于真实世界的反馈测试和改进了他们的策略。 Wenling Yao 创建了她自己的分析师风格指南,包括一个模板,涵盖了分析师在为利益相关者和高级管理层制作数据报告时应牢记的四个原则:
凯尔分享终极指南,写下你的数据,这样公司里的其他人就可以产生见解:
仅仅正确处理 SQL 查询或复杂建模是不够的。 William Chon 解释了我们应该如何向利益相关者和决策者传达技术信息:
Susan Li 展示如何在向老板提交分析报告时,将强有力的叙事故事情节与数据可视化相结合:
</10-ways-to-take-your-boss-on-a-journey-through-the-data-14a3fdbb3503>
从 Fernando Tadao Ito的这篇文章中,希望成为管理人员的数据科学家将找到一些可行的方法。他分析了强大的沟通技巧对高级领导职位的重要性:
Sonali Verghese 向您展示构建强大数据叙事的步骤:
为什么写有效的设计文档在亚马逊和谷歌这样的公司很受欢迎? Vincent Tatan 分享了数据科学家如何利用它们来确保更好的项目成果:
博客
大多数在线博客文章,在 TDS 和其他地方,旨在达到一般观众。这些包括 101 型解释者、观点文章和教程。这些帖子分享了广泛的观点,从撰写“病毒式”文章的具体挑战,到如何向初学者讲述高度技术性和先进的概念。
饶彤彤写了一本最受欢迎的《随机森林》在线指南(如果你用谷歌搜索这个算法,它会出现在第二个链接中),这完全是偶然发生的。他分享了《华盛顿邮报》是如何诞生的,以及复制这一成功是多么困难:
Thushan Ganegedara 回顾了他撰写自助出版的 NLP 书籍的经历,并分享了撰写吸引普通读者的技术文章的技巧:
Pier Paolo Ippolito ,TDS 的资深作家兼编辑助理,分享了他准备在 TDS 上发表文章的清单:
找到别人没有写过的东西越来越难了。 Aaron Frederick 幽默地讲述了在饱和话题领域写作的感受:
研究&其他项目
数据科学的学术领域正在发展,而且发展很快。有如此多的数据科学会议、同行评审期刊和开源发布平台。这些帖子探讨了学术或专业读者的写作。
Amine Hadj-Youcef 博士。一位经验丰富的研究员写了一篇他希望在写研究论文之前读过的文章:
威尔·科尔森认为“写得好的博客文章可以有很长的保质期,给你一个潜在的未来几年的投资组合”,所以写下你上周发布的项目:
今天开始写
如果你还在寻找进入数据科学写作的理由,这些来自数据科学家同行的坦诚思考可能会激励你今天就开始。
丽贝卡·维克里(Rebecca Vickery)通过写作来自学新的工具和技术(费曼技术):
Finn Qiao 一个月数据科学写作的五点收获:
Serdar Korur 发现写作创造了职业机会,并提供了 9 条写好文章的建议:
Juan De Dios Santos 讨论了编写技术教程如何为他的编码带来积极的溢出效益。这让他成为了一名更好的工程师:
Conor Dewey 令人信服地指出,“数据科学家应该无情地优先考虑影响”,并且写作对于增加数据科学职业的价值特别有效:
梅根·迪布尔讲述了她出版《通俗解释者》如何帮助她从工程领域进入数据科学领域的故事:
在撰写更好的数据科学文章方面,你有最喜欢的资源吗?你最喜欢的作家是谁?请在评论中告诉我们!
AMO 理论:为数据科学家解决黑箱问题

在 Unsplash 上 Wonderlane 拍摄的照片
当你必须解释人们如何以及为什么以某种方式行动时
在数据科学中,我们经常想要测试输入或刺激,看看这是否会对结果产生影响。但是黑箱问题介于两者之间,用来解释为什么输入会对结果产生影响。AMO 理论是解决这个问题的好方法,因为 AMO 因素被认为是解释预测结果的机制的模型。AMO 理论可以应用于许多不同的领域,如人力资源管理、市场营销、执法等。在这篇博客中,我将简要解释这个理论是关于什么的,以及它如何应用于数据科学项目。
1.什么是 AMO 理论
AMO 代表能力、动力和机会。我在攻读人力资源管理博士学位时了解到了这个理论。该理论是通过结合工业心理学家和社会心理学家所做的广泛研究来理解员工绩效的相关因素而发展起来的。
简而言之,AMO 认为绩效是能力(训练和选择)、动机(激励和反馈)和机会(环境)的函数。这三个因素影响员工绩效。人力资源管理研究人员通常认为 AMO 理论可以解释人力资源管理实践和员工绩效之间的联系,认为人力资源管理实践应该支持和提高员工的能力、动机和表现机会,以增加对人力资源管理项目的投资回报。
2.数据中的黑箱问题是什么
假设给你一个数据集,看看你能否建立一个模型来预测结果,一个典型的回归模型。通常我们会进行一系列静脉注射,看看它们是否能预测结果。假设您调整了模型,将精确度提高到可接受的水平。在向高管展示结果时,有人会问,你怎么知道这行得通,或者你怎么知道这些因素会直接影响/预测结果。此时,你可能会有麻烦。你很难解释 IVs 如何影响 DV,以及它们为什么会起作用,因为在处理数据科学中的黑箱问题时,我们经常不知道如何解释这样的事情。对于数据科学家来说,这是一个黑箱问题,因为它不容易直接测量,只能通过可观察的行为(如销售或考试分数)来推断。
3.AMO 理论如何解决这个问题
显然,数据科学项目有很多种类型。但是对于这个理论,让我们把注意力集中在建立一个预测人类行为的模型上。
这里有三个例子来说明如何将 AMO 理论用于你的建模。
示例 1:人力资源管理和人力资源分析
如上所述,AMO 理论被公认为是人力资源管理领域黑箱问题的答案。如果您正在研究一组输入(例如,人力资源实践、在培训、重组等方面的投资)。)为了预测性能改进收益,AMO 理论可以指导您解释这些输入如何影响性能。输入或刺激是否针对员工的能力、动机或表现机会?对于动机,你是想创造一个内在的还是外在的动机?用短期合同工取代全职员工有什么影响?
示例 2:营销和销售
如果你试图理解有人是如何以及为什么购买你的产品,AMO 理论也可以帮你一把。你的模型能识别潜在买家的购买能力吗?提议的营销活动是否激发了合适人群的购买动机?你是否考虑过合适的顾客在合适的地点做出购买决定?了解这些 amo 将有助于您设计数据科学产品和服务,从而最大化您的营销投资的影响。
例 3:某人犯罪的可能性。
我个人最近在一个类似的领域使用了这种方法。如果给你一个项目来预测某人犯罪的可能性,AMO 理论可以指导你解释这些输入将如何影响那个人执行其犯罪意图的可能性。你的模型能识别潜在罪犯的犯罪能力吗?就动机而言,他们的动机是经济利益还是报复?他们是否生活在一个很容易逃脱他们想要的东西的环境中(例如,计划好的逃跑路线)?根据这些组成部分对你的 IVs 进行分类帮助我提高了准确性和可解释性。
同样,这些都是有趣的数据科学问题,我曾多次回到 AMO 理论,作为一种指导和方法来解释人们为什么以及如何以某种方式行为的结果。当谈到大数据分析或机器学习模型时,请记住,你不只是试图预测你的客户正在发生什么;您希望能够向非数据人员解释您的模型。这就是这个理论可以帮助理解所有那些方框和箭头的地方。如果你觉得这篇文章有帮助,请在下面留下评论。
美国国家选举研究分析(ANES)

图片来源:Pixabay
统计数据、调查、投票意向、民意、乔·拜登、唐纳德·特朗普
最近对政治学研究分析数据很感兴趣。幸运的是,很容易找到政治学数据、百科全书以及关于定量和定性研究方法的信息。
数据
ANES 收集高质量、无党派的投票和民意调查数据。
创建用户帐户和密码后,您将能够从其数据中心下载数据。
我下载了ANES 2020 探索性测试调查数据,其目的是评估考虑纳入 ANES 2020 时间序列研究的新问题,特别是与选举年出现的新问题、问题措辞效果以及冗长问题集的缩放属性相关的问题。该数据集包括 3,080 个案例,其收集是在 2020 年 4 月 10 日至 2020 年 4 月 18 日之间进行的。你可以在这里找到问卷规格。
anes_data.py

图 1
数据集包含 470 个变量(即调查问题),我将只选择我感兴趣的。同时,我将根据调查问卷规范重新命名一些列,使其更加用户友好,并重新编码所有分类变量。缺少的值将被替换为“NaN”。
anes_data_prep.py
投票选择
vote_choice.py

图 2
数据显示,截至 2020 年 4 月,唐纳德·特朗普和乔·拜登在投票意向方面不分上下。
vote_choice_by_party.py

图 3
当你按党派来看这些数字时,这并不奇怪。
df_clean.query("vote == 'Donald Trump' & fttrump1 < 5")

表 1
上述 10 名选民给特朗普的温度计评分< 5,但表示他们将投票给他。看起来他们同样不喜欢拜登。
df_clean.query("vote == 'Joe Biden' & ftbiden1 < 5")

表 2
上述 15 名选民给拜登的温度计评分< 5,但表示他们仍将投票给他。他们大多是民主党人,喜欢奥巴马。
df_clean.query("ftbiden1 == 100 & fttrump1 == 100")

表 3
上述 10 位选民同时给乔·拜登打了 100 分,给特朗普打了 100 分,而几乎所有人都表示会投票给特朗普。
可爱
拜登 _like.py

图 4
在将投票给拜登的选民中,54%的人喜欢他,大约 13%的人不喜欢他。
trump_like.py

图 5
在将投票给特朗普的选民中,71%的人喜欢他,大约 5%的人不喜欢他。事实上,特朗普能够激起共和党内部的大量冷漠。
选民的年龄
age_dist.py

图 6
根据数据,截至 2020 年 4 月,更多 30 至 45 岁的选民,以及 55 至 70 岁的选民将投票给特朗普。
年龄 _ 性别 _ 小提琴. py

图 7
有趣的是,特朗普更受资深女性和年轻(40 岁左右)男性的青睐。
经济
拜登 _eco.py

图 8
在拜登的选民中,超过 86%的人担心当前的经济状况。14%的人不担心当前的经济状况。
trump_eco.py

图 9
在特朗普的选民中,超过 64%的人担心当前的经济状况。36%的人不担心当前的经济状况。
confecon.py

图 10
绝大多数选民担心当前的经济状况,53%的人非常或非常担心当前的经济状况。
confecon_by_party.py

图 11
85%的民主党人担心当前的经济状况,63%的人非常或非常担心当前的经济状况。而 65%的共和党人担心当前的经济状况,41%的人非常或非常担心当前的经济状况。
confecon_party_gender.py

图 12
女性民主党人最担心当前的经济状况,在极度和非常担心当前经济状况的人中,比女性共和党人多 18%。而在极度和非常担心当前经济状况的人中,男性民主党人只比男性共和党人多 6%。
confecon_age.py

图 13
35-45 岁和 55-75 岁年龄段的人最担心当前的经济状况。
普遍基本收入
大学收入

表 4
32%的特朗普选民非常反对普遍基本收入,而 18%的人非常支持。
大学收入 b.py

表 5
6%的拜登选民非常反对普遍基本收入,而 26%的人非常支持。
普遍基本收入与政治意识形态
uni_ideo.py

表 6
超过 50%的保守党人反对普遍基本收入,36%的人反对很多。几乎 70%的自由派支持普遍的基本收入,34%支持大量的基本收入。
普遍基本收入和免费大学
uni_col_b.py

图 14
在拜登的选民中,45%支持普遍基本收入和免费大学,55%反对两者。
uni_col_t.py

图 15
在特朗普的选民中,29%的人支持普遍基本收入和免费大学,71%的人反对两者。
MeToo vs .女权主义者
metoo_fem.py

表 7
支持特朗普的选民在#MeToo &女权主义者上的支持率最低,支持拜登的选民在这两个运动上的支持率最高。
温度计额定值
ther_corr.py

表 8
拜登和特朗普的温度计评分之间的相关性是负的,这是应该的。
ther _ by _ 党. py

图 16
民主党人大多一致认为特朗普非常低,但他们对拜登有各种各样的复杂感情。共和党人一致认为拜登的评分很低,他们更倾向于特朗普的较高评分。无党派人士分散在各处。
ther_by_gender.py

图 17
男性和女性对两位候选人的评价没有明显差异。
按年龄

图 18
显然,拜登在年轻选民中的平均温度计评分更高,拜登和特朗普在老年选民中的平均温度计评分相似。
ther_dist.py

图 18
更多的人对特朗普有极端的看法,更多的人对拜登有平庸的看法。
统计分析
分位数. py

表 9
党派关系和候选人的温度计评分之间有明显的关系。
游击队. py

表 10
极度担心冠状病毒经济影响的自由派人士对拜登的评分平均比特朗普高 40.57 分,而完全不担心冠状病毒经济影响的保守派人士对特朗普的评分平均比拜登高 60.71 分。
假设检验
男性和女性对特朗普和拜登的评价是否有显著差异。
ttest_ind_t.py

我们可以拒绝零假设,并得出结论,就平均而言,男性和女性对特朗普的评价在统计上存在显著差异。
ttest_ind_b.py

我们未能拒绝零假设,女性和男性的平均体温计评分与拜登相同。
比较特朗普和拜登的平均支持率
compare.py

ttest_rel.py

我们拒绝零假设,并得出结论,平均而言,选民对特朗普和拜登的支持率存在统计学上的显著差异。
多重比较检验
民主党、无党派和共和党选民的平均年龄是否有显著差异。
按党派年龄

f_oneway.py

p 值远小于 0 . 05,因此我们拒绝零假设,并得出结论:就选民的平均年龄而言,这三个政党之间存在统计学上的显著差异。
关联测试
测试 _ass.py

保守派压倒性地反对普遍基本收入和免费大学,79%的保守派表示反对。相比之下,只有 44%的自由派反对普遍基本收入和免费大学。
这些差异是否强大到足以让我们得出结论,在支持普遍基本收入和免费大学方面存在意识形态差异。
chi2_contingency.py

3.56e-73 处的 p 值远小于 0.05。因此,我们拒绝零假设,并得出结论,在意识形态和对普遍基本收入和免费大学的支持之间存在统计上的显著关系。
主成分分析
pca.py


表 11
第一个特征(dim1)似乎代表了传统的左右意识形态光谱。共和党、特朗普、彭斯、哈利、卢比奥,以及大企业、资本家和白人在这一指数的一边负载最强,而沃伦、佩洛西、哈里斯、民主党在另一边负载最强。
loadings.sort_values('dim2')


表 12
第二个特征(dim2)似乎也与左右政治意识形态有关。
多重对应分析
类似于 PCA,但是 MCA 处理分类特征而不是连续值特征。
mca.py

表 13
第一个潜在特征(0)从顶部开始,它代表自由主义意识形态的类别,例如:2016 年投票给希拉里·克林顿,认同为民主党人,2020 年投票给乔·拜登,非常支持免费大学,相信科学极其重要。在另一端,我们有保守意识形态的类别,例如:反对普遍基本收入和免费大学,认同共和党,根本不担心经济。这第一个潜在特征似乎是左右意识形态维度。
mca.column_coordinates(df_cat).sort_values(1)

表 14
对于第二个潜在特征,我们有不采取立场的立场:2016 年没有投票,大概 2020 年也不会投票,不赞成也不反对普遍基本收入,免费大学。这似乎可以衡量选民的冷漠。
Jupyter 笔记本可在 Github 上找到,享受漫长的周末!
参考:
https://JKR opko . github . io/surfing-the-data-pipeline/ch12 . html
分析师的困境
在一个充满可能的世界里说是或不是

(图片来自 Unsplash )
你喜欢这篇文章吗?你得到的第一印象,标题和图片,已经让你相信这篇文章值得你花时间吗?你可能需要继续读一会儿,收集一些见解,用简单的是或否来回答这个问题。
欢迎来到现代(数据)分析师的世界!
在不确定的领域工作
作为分析师,我们自然会在不确定的环境中工作。日复一日地挖掘数字,我们的任务是将数据点转化为可操作的见解。这些见解被用于制定任何规模的决策,无论是改变网站的背景颜色还是公司层面的战略举措。
但是,数据不只是告诉我们该做什么。不确定性的来源数不胜数。我们看到的数据正确吗?如果有,是否具有代表性?我们还需要包括其他数据点吗?而且,即使我们确信我们能发现一个机会,会有我们没有注意到的负面影响吗?什么时候我们可以停止挖掘,对我们得到的结果充满信心?
在这个充满不确定性的世界里,利益相关者需要明确的答案。
为决策提供信息的数据转换大致可分为两个方面。根据定义,分析师在分析的探索和灵感方面运作。他们发现用户群之间的差异,衡量活动的表现或转换漏斗的变化。另一方面,验证假设或假说属于统计学家的领域。这种答案可以在一个统计设置中形成,该设置自动考虑不确定性(考虑置信区间、统计显著性等)。).
这怎么会是个问题呢?让我们看看这个设置在现实世界中是如何工作的。
是还是不是?
首先,在大多数团队中,分析师拥有所有的分析任务。除非你在一家拥有大量资源的大公司工作,否则分析师会进行探索性的挖掘,同时也会进行假设检验和验证。

(图片来自 Unsplash )
这两个领域通常天生就密不可分。“嘿,我刚刚在这个数据集中发现了这个模式,我认为我们应该继续下去(探索)。能不能确认一下这个(验证)?”是每个分析师不时从她的利益相关者那里听到的一句话。
这就是:是或否的问题。简单地说是或者不是,不是也许是或者我们能确定到什么程度;不是黑就是白。
除了统计学家之外,分析师无法提供置信区间或在这一点上考虑不确定性的其他度量。即使你想,也没有办法把这个问题框进一个合适的统计框架。即使有,我们真的通过说“有 63.2%的可能性你是对的”来帮助我们的利益相关者吗?
这就是困境。分析师在一个充满不确定性的复杂世界中工作。与此同时,利益相关者需要明确的答案来决定是走方向 A 还是 b。复杂的环境必须被分解成二元设置(哇,真实世界降维的真实案例)。
这种困境可能是分析师最大的资产
至此,你可以几乎 100%的把握断定这篇文章对你来说是否是一篇好文章。为什么?因为你收集了大量的数据来帮助你做出明智的决定。你可以超越错过重要学习或浪费更多宝贵时间的风险。你过去读过的所有文章和你积累的经验也有助于你做出明智的决定。
尽管听起来不尽人意,但这也是分析师唯一能做的事情。有经验的分析师对他们可能想要检查的计数器指标有一种感觉,特定指标的变化是否是实质性的,或者在如何解释数据方面是否有误解。
因此,作为一名分析师,我们开始工作,打开笔记本、SQL 代码板或 BI-Tools,深入研究数据,以充分了解正在发生的事情。在某些时候,我们必须做出决定。我们必须这样说,“我收集了足够的证据来证实我的观点,即这个假设是正确的。就这么办吧。”(或者不是)。
这是否意味着我们不是根据直觉做出决定,而是根据直觉驱动过程中的数据做出决定?在某种程度上,我会说是的,不同之处在于,我们可以更好地控制我们愿意接受的不确定性水平。此外,还有精确的统计领域,假设检验等工具可以帮助量化和限制我们愿意接受的不确定性水平。
那么这告诉我们什么呢?里面有什么好东西吗?
可能😉。在复杂的环境中做决策仍然需要大量的直觉和经验,这一事实表明了分析师可以给团队带来多大的价值。有经验的分析师结合他们对领域、可用数据及其潜在缺陷的知识来指导明智的决策。作为分析师,我们可以衡量特定决策的风险,并调整我们研究的深度,以将不确定性保持在可接受的水平。
然而,作为一名分析师,指出我们的见解可能存在的任何警告或限制是至关重要的。无论是演示文稿中的附注,还是电子邮件中的评论;我们的利益相关者需要意识到这一点。
喜欢这篇文章吗?
那么你可能也会喜欢我的一篇关于(产品)分析的(不太哲学的)文章:
https://productcoalition.com/tackling-the-product-growth-question-5115113fb039
分析师的工作流程中断
分析师今天使用的工具都是在特定时间为特定目的而构建的。但是这些工具也在阻碍我们。现在是后退一步,看看我们带走了哪些传统工具,留下了哪些工具的理想时机。
分析师的生活
鉴于对分析见解的需求空前高涨,分析师的工作流程十多年来几乎没有变化,这令人惊讶。
虽然在使个人任务变得更容易方面确实取得了进展,但工作流程通常仍然是由陈旧的软件与 CSV 文件和电子邮件拼凑而成的。
为了说明分析师工作流程有多痛苦,我们收集了一些我们最喜欢的例子…

一个长期受苦的数据分析师的生活。(链接)来源:count.co
虽然这个图表的设计至少有点幽默,但它强调了一个严肃的问题:我们当前的数据工具没有一个能提供我们满足今天的分析需求所需的一切。
但公平地说,它们从未被设计成…
毕的历史:悬崖笔记版
那么我们是怎么到这里的呢?我们将快速回顾一下历史,找出…
虽然 BI(商业智能)是在 19 世纪晚期首次被提及的,我鼓励你阅读更多关于它的内容,我们将快进并关注我们今天仍在使用的 BI 工具的历史。
SQL ide(20 世纪 70 年代末):
SQL IDEs(集成开发环境)是为数据库管理员设计的,用于查询和管理他们新的关系数据库中的数据。这些朴实无华的界面让少数训练有素的技术用户能够做任何事情,从创建表格到运行查询。
电子表格(1980 年代):
我们心爱的电子表格被设计成使会计师能够数字化纸质会计工作表。他们基于单元的界面提供了格式化和计算的灵活性。用户可以建立高度熟练的金融模型,但任何实际的分析仅限于小数据集。
数据可视化工具(1990 年代):
数据可视化工具最终将数据带到了会议室。凭借友好的界面和高质量的数据可视化功能,业务用户可以开始在决策中使用数据,但仅限于简单的查询。
计算笔记本(2010 年代):
虽然像 Mathematica 这样的计算笔记本在 80 年代首次出现,但它们直到 2010 年代的数据科学时代才出现在数据领域。这些笔记本帮助数据科学家使用 R 和 Python 等编程语言构建和部署复杂的模型和分析。虽然非常强大和灵活,但它们的学习曲线非常陡峭。
一个勇敢的新世界
自从这些工具首次出现以来,分析师的前景无疑已经发生了变化。
分析师的作用持续增长。现在,分析师需要管理从数据库到会议室演示的整个数据之旅——这个过程过去由许多角色和部门共享。
数据更大更快。我们已经从几个关系表发展到今天的大数据时代,在这个时代,我们通常以兆字节而不是兆字节来衡量数据。数据库也变得更快、更有效。对于我们这些花了太长时间优化查询的人来说,这是一个受欢迎的变化,它让我们第一次可以直接从数据库中分析数据。
我们对数据的胃口非常大。我们不再满足于生产数据库中的一两个仪表盘。为了在竞争中保持领先,我们的问题越来越频繁,也越来越微妙。我们不再生活在一个只有几个大型查询的世界里;我们生活在一个不断提问以保持领先的世界。
新的希望
在这种新环境下,为现代分析师的挑战设计工具是一个巨大的机遇。
尽管有许多潜在的候选工具,但大多数都是上述工具类型的扩展。但是正如工作流程所示,我们不需要旧工具的新版本。我们需要一种混合方法:BI 笔记本电脑。

BI 笔记本提供 SQL IDE 的功能,数据科学笔记本的灵活性,但是具有数据可视化工具的洞察力生成。
BI 笔记本借用了我们当前工具箱中最喜欢的功能来创造一些新的东西,尽管有些熟悉。
- 由于是基于 SQL 的,它提供了 SQL IDE 的所有功能,并利用了高效分析数据库(如 BigQuery 和 Snowflake)的处理速度。它也有助于查询抽象,例如快速和可访问的拖放查询。
- 基于单元的结构鼓励您将分析分成更小的部分,这有助于您重用复杂的逻辑并在以后解释它。
- 有了正确的内置数据可视化特性,输出仍然可以是交互式的和高质量的,因此洞察力仍然可以得到很好的解释和实际的上下文化。
这不是一刀切。对于特定的用例(即数据科学模型),更专业的工具总是更受青睐。但是对于绝大多数分析师的工作来说,BI 笔记本可以极大地提高工作效率以及他们的工作对组织其他部门的影响。
在过去的几年里,我们一直在 Count 制作自己的 BI 笔记本电脑。如果你想亲自体验一下,你可以在这里获得一个免费账户。
这是我们“呼唤更好的分析师工具”系列的第二篇文章。该系列的其他文章包括:
分析应用程序堆栈
构建“数据应用”的机遇和挑战

作者图片
在过去的几年里,数据基础架构发生了巨大的变化。已经 被 写成了关于“现代数据栈”,在这一点上,有大量的创业公司覆盖了数据质量、数据监控、反向 ETL 等领域。
然而,一个不太受关注的领域是构建分析应用程序的堆栈,但这个领域似乎仍然存在巨大的机会。我所说的“分析应用程序”是指一种面向最终用户的应用程序,其功能本身包含大规模的数据汇总分析。这有时也被称为“数据应用程序”。
作为一个例子,考虑市场公司。几乎所有的市场都有一个用户界面,让卖家可以看到他们“商店”的汇总数据。许多这样的用户界面允许销售者根据可能与他们相关的各种维度(例如 SKU 或购买者的地理位置)来分割这些数据。在某些情况下,这样的界面还可以提供更丰富的功能,例如诊断为什么销售额在给定的时间范围内发生了变化,或者最近的 SKU 发布会有什么影响。

Shopify 的分析仪表板就是“分析应用”的一个例子
随着数据成为我们所做的几乎一切的核心部分,这种类型的产品用例变得越来越普遍。当你点击 Zillow 中的房屋列表时,大量的计算会向你显示他们关于给定房屋列表的所有数据,例如他们的“zest imate”。当你与 Wealthfront 的“路径”功能互动以帮助规划你的财务未来时,一套复杂的潜在预测和汇总正在引擎盖下发生。当您点击“谁查看了我的个人资料?”时,情况也是如此在 LinkedIn 上。 Stripe 适马本质上是一款面向商家的嵌入式数据分析工具。

Stripe 适马允许商家编写 SQL 并探索他们的业务数据
然而,尽管有越来越多的公司构建这样的产品,但支持它们的工具仍处于萌芽状态。在花了很多时间与应对这一挑战的从业者以及试图解决这一问题的新兴创业公司交谈后,我想概述一下这个市场的现状,以及我认为仍然需要解决的差距。
超越嵌入式仪表盘
乍一看,您可能会问— “这与嵌入式商业智能仪表板本质上不是一回事吗?上面的 Shopify 例子甚至被称为‘Dashboard’!多年来,我们已经有了解决这个问题的工具。”
事实上,将分析功能放入应用程序的传统方式是嵌入 BI 工具,如Looker Embedded Analytics和Tableau Embedded Analytics。这些产品非常成功,代表了这些 BI 产品收入的很大一部分(有人估计占 30%)。
然而,与此同时,这些工具几乎普遍不受欢迎,并且对于大多数现代公司的需求来说,它们是非常不充分的解决方案——你很难看到 Stripe 决定围绕嵌入式 Looker 建立 Stripe 适马。
这有几个核心原因。首先,嵌入式分析产品通常以iframe的形式交付。虽然这种方法很简单,但也意味着您对分析应用程序的控制非常有限。从定制的角度来看,这带来了挑战——前端团队无法将定制应用程序逻辑与数据可视化逻辑深度集成——从设计的角度来看,基本上不可能让 iframe 感觉“原生”,从而导致不优雅、低质量的产品体验。
嵌入式分析工具历来以 iframe 为导向,这一事实也说明了困扰这一领域的一个更广泛的问题——传统上,数据科学和分析团队不习惯采用严格的软件工程标准(版本控制、测试、审查、增量推出和回滚等),但他们一直是嵌入式 iframe 的所有者。产品团队讨厌这一点,因为它经常导致他们很少或根本无法控制的破碎的产品体验。缺乏对精心构建和维护“数据产品”的关注是行业中的一个首要问题,像 dbt 这样的工具已经开始在数据基础设施层面上进行改进。然而,这些原理还没有真正应用于分析。简而言之 iframe 不是产品工程和数据团队之间的正确契约。
这些嵌入式解决方案的第二个核心问题是,它们的性能非常差,导致持续的加载障碍和较差的响应能力(很大程度上是因为它们没有利用云数据基础设施中的许多最新进展)。
最后,这些产品最终在交付的最终用户体验方面有很大的局限性——它们看起来和感觉上总是像一个 BI 工具,然而仪表板通常具有有限的效用,并且最有趣的数据用例几乎总是与工作流相关联。
这组约束从根本上与许多现代数据驱动型公司(如 Zillow、Wealthfront、LinkedIn 和上文提到的 Stripe)拥有的用例类型不兼容。因此,在过去的十年里,这些公司中的大多数都不得不自己做一切事情,从数据库优化到 SQL 管理到可视化层,以及这之间的一切。
分析应用有独特的限制
对于公司来说,自己构建这一切如此具有挑战性的部分原因是,在许多方面,分析应用程序的约束在数据空间中有些独特,使得很难简单地重新调整传统数据工具的用途。这是以几种方式形成的。
- 高并发性 —因为分析应用程序最终服务于最终用户,而不是内部员工或内部系统,所以您必须支持比大多数传统数据工具所设计的数量大得多的并发请求。
- 低延迟—客户通常期望快速、爽快的产品体验。而您的内部数据科学家可能可以等待 5-10 分钟来运行一个查询(尽管可能有点暴躁!),这对于许多面向用户的应用程序来说是完全行不通的,尤其是当数据分析需要作为产品支持的核心工作流的一部分时。
- 软件工程团队成为利益相关者 —让分析应用程序工作需要数据团队(数据平台、数据工程、数据科学)和实际交付产品的产品团队(前端、后端)之间的紧密协作。大多数产品团队对大规模数据基础设施一无所知,他们是大多数数据工具从未设计过的一群用户。此外,这两种角色习惯于完全不同的标准和过程来部署产品——软件团队通常遵循严格的软件开发过程,正如上面在 iframes 的上下文中所讨论的,而像测试、版本控制等技术才刚刚开始在数据中被采用。这会产生很多摩擦。
- 分析功能必须是集成的,而不是孤立的— 最终,分析应用需要数据分析成为产品工作流程的核心组成部分。仅仅展示一些可视化效果是远远不够的——数据分析、可视化和计算需要深入集成到产品本身中。这与大多数数据工具的工作方式截然不同,在大多数数据工具中,笔记本、SQL 编辑器、DBMS 或类似的工具除了分析数据之外什么也不做。举个说明性的例子——在过去十年里,我们看到支付从感觉非常“第三方”(想想当想在易贝购物时被踢出到一个单独的 PayPal 处理网站),变成深深嵌入结账和电子商务流程的东西(想想 Shopify Pay)。这给用户体验和转化率带来了巨大的好处。同样,数据也不应该被“固定”在产品上。
解决这些约束通常需要跨数据库、缓存层、数据和应用程序之间的“中间件”层以及可视化层进行大量工作。幸运的是,我们开始看到有助于解决这些类别的工具的出现。

剖析分析应用的关键层,以及每层的一些关键人物。还有各种各样的“一体化”工具,旨在简化简单数据应用程序的创建,尽管这些工具在历史上缺乏支持面向外部的应用程序的核心部分所需的性能和灵活性。图片作者。
分析应用程序的层
数据库层
在大多数情况下,您不能直接在像雪花这样的数据仓库、像 DataBricks Delta Lake 这样的“湖库”或像 MySQL 这样的传统非列关系数据库上运行分析应用程序。前两个类别主要是为较低的并发性而设计的,您通常会看到与内部商业智能和数据科学工作负载相关的“批处理”操作,而后一个类别更多地是为逐行查询(和写入繁重的工作负载)而不是大规模分析聚合而设计的。
因此,在过去的 3-4 年中,我们已经看到了许多“实时”或“低延迟”内存数据库的出现,它们使权衡更适合于分析应用程序,例如阿帕奇德鲁伊 ( 暗示)阿帕奇皮诺(StarTree)click house(alti nity)Rockset和这些工具中有许多是作为公司内部项目出现的,专门处理与构建分析应用程序相关的挑战——例如,Pinot 在 LinkedIn 中作为一种工具出现,用于帮助简化“谁查看了我的个人资料?”。在各种其他架构差异中,这些产品通常针对在内存中保存数据和处理非常高频率的并发查询进行优化,而像雪花这样的数据仓库则针对低成本的磁盘存储进行优化。StarTree 的这篇博客文章很好地深入探讨了面向用户的应用程序的不同方法的优缺点。
值得注意的是,其中一些产品还强调其产品的“可操作”或“实时”元素,在这种情况下,它们指的是应用程序以多快的速度读取上游源数据库。在传统的数据仓库设置中,这种传播可能需要几分钟到几小时,但使用这些工具可能只需几秒钟(假设您添加了 Kafka 和 Debezium 等其他技术)。分析应用不一定总是需要这种功能,但在用户必须对世界的变化做出快速反应的特定情况下,这种功能非常重要。
缓存和预聚合层
创建分析应用程序的下一步通常包括构建某种缓存或预聚合层。如果您希望最大限度地减少应用程序面向用户的延迟,这是非常重要的,而且还具有降低成本的优势,因为您可以通过智能缓存显著减少访问数据库的查询数量。虽然前面提到的一些低延迟数据库本身确实包含缓存功能(如 Rockset ,但其他一些则没有(如 Pinot )。此外,在许多情况下,公司建立或完全依赖低延迟分析数据库是不可行的,在这种情况下,二级缓存层是绝对必要的。这方面的一些例子包括:
- 您没有数据工程带宽来设置超出雪花的辅助数据存储,但是您希望在雪花或 BigQuery 之上启动一些基本的分析应用程序功能
- 您的应用程序需要运行在关系数据库之上,而不是像 MySQL 或 Postgres 这样的列数据库之上,但是您的应用程序趋向于包含越来越多的“聚合”查询(而不是纯粹的行级查询),这大大降低了您的应用程序的速度
- 从成本角度来看,将所有数据保存在内存中的低延迟数据库中是不可行的。在这个“热”环境中,您只能保留过去 24 小时的数据,但是用户有时会运行涉及“更老”数据的查询。
传统上,有几种方法可以解决缓存和预聚合问题,但这些方法都很麻烦,而且通常都不是很好的解决方案。
在数据库方面,一种方法是将预聚合作为附加行存储在数据库中—例如,如果您的数据库存储有关用户页面浏览量的数据,您可以添加辅助行,这些行以一定的频率异步刷新,并表示每个用户的“过去一个月的总页面浏览量”。然后,您可以更新您的查询逻辑,以便在这些聚合值与传入的查询匹配时优先提取它们。不幸的是,这种方法有许多问题,例如维护预聚合和原始数据之间的一致性,在高基数或高维情况下增加大量存储开销,并且通常会增加前端和数据库逻辑的复杂性和维护开销。
在应用程序方面,另一种方法是使用类似于 Redis 或 Memcached 的东西(或这些东西的托管版本,如 AWS ElastiCache)。虽然这种技术允许在应用层创建键值缓存,但它们的缺点是缓存逻辑与前端业务逻辑的耦合非常紧密。这给产品开发带来了巨大的复杂性,因为现在大多数前端的变化都需要前端团队通过像“我需要更新缓存逻辑吗?这会导致过时读取吗?我需要采用事务并发写入缓存和数据库吗?我何时必须确保直接访问数据库并使缓存失效?”。
无论您采用哪种方法,另一个挑战是,开发人员最终有责任确定要缓存或预聚合哪些特定内容。这是非常不理想的,因为大多数现代分析应用程序的复杂性和规模是巨大的。哪些维度、值和特征应该被缓存,哪些不应该被缓存,以及部分预聚合的最佳集合是什么,这是一个更适合于机器而不是人类的决定,特别是因为随着时间的推移,在大多数应用程序中查询的性质存在自然漂移和演变。
幸运的是,我们终于开始看到一些大大简化这些问题的工具的出现,如 Cube.dev 、 Polyscale 、 Readyset 和 TakeoffDB 。虽然这些工具在目标堆栈类型、确切功能和技术方法方面略有不同,但它们通常都代表了为现代分析应用解决缓存和预聚合的有趣方式。如果你感兴趣, Cube 在这里的博客文章很好地概述了一些不同的缓存和预聚合方法及其相关的权衡,而 Noria 的论文也是这一领域很好的进一步阅读材料。
中间件层
下一个要解决的问题是——如何让需要将数据集成到应用程序中的产品团队能够方便地访问数据本身?这通常会成为一个特别棘手的问题,因为它涉及到解决数据团队和产品团队之间的接口问题,而这两个团队通常不习惯使用彼此的语言。
这里的第一个问题是创建一个易于产品团队使用的 API。理想情况下,这样的 API 将包括 React 和 Vue 等流行前端框架的 SDK,并消除管理复杂后端 web 服务的需求,只需管理数据库连接(这符合所谓的 Jamstack 的更广泛趋势)。我之前提到的 Cube.dev 提供了这方面的功能。Stepzen 是另一家有趣的公司,它使得在所有数据源之上构建 GraphQL 端点变得更加容易。
第二个问题是查询管理。许多数据从业者看到前端团队管理 SQL 查询的方式会感到震惊——通常存在大量重复、大量不正确的逻辑、高度未优化的查询、糟糕的格式,以及普遍缺乏复杂性,导致高实施和可维护性成本。现在围绕“指标层”工具有很多令人兴奋的事情,如 Minerva 和 Transform ,它们有助于标准化公司中的指标逻辑,在构建分析应用程序的数据团队和产品团队的界面上可能需要类似的功能(我不清楚 Transform 这样的工具是否最终将服务于传统的数据堆栈用例以及分析应用程序用例,或者这两个部分是否会有所不同)。Cube 是我今天看到的唯一一家提供健壮的数据建模和查询管理功能的公司,专门面向分析应用程序。追求【无头 BI】的公司也有可能最终解决这个问题。
可视化层
最后但同样重要的是,要构建一个分析应用程序,您需要弄清楚如何可视化和创建围绕数据的交互模式。正如已经讨论过的,这种可视化和交互对于产品来说是自然的,并且深深地嵌入到产品中,这是非常重要的。换句话说,数据不能像独立于产品其余部分的一组不相交的仪表板——与数据的交互应该影响产品中的工作流,反之亦然。(这是使用嵌入式 iframes 根本不可能实现的交互类型)
感觉在深入嵌入产品的数据可视化工具中有很大的改进空间。最先进的是各种开源库,比如 Chart.js 、 D3.js 、 HighCharts 。总的来说,这个领域的工具要么非常简单,但极其有限(难看、弱定制、对图表类型的支持差),要么非常复杂,但非常强大(难学、难掌握、价值实现时间短、学习曲线高)。事实上,D3 是如此复杂,甚至由 D3 的创造者建立的公司也在它的基础上探索各种抽象来简化 javascript 中的数据可视化工作。
还有各种传统的“BI-esque”产品,如 Metabase ,它们允许快速创建交互式数据应用,但这些产品实际上是为了解决传统的内部数据探索用例,而不是为现代分析应用提供动力。它们遭遇了我们已经讨论过的关于性能、原生感觉、深入嵌入应用程序以及不支持 SLDC 原则(如测试)的相同问题。
Topcoat Data 是这个领域中一家有趣的新公司。对于熟悉 DBT 的数据科学家或类似人员来说,Topcoat 使得以高度自助的方式快速创建成熟的嵌入式仪表板变得极其简单。所有的数据建模都是作为 DBT 的扩展完成的,常见的图表库被原生集成,并且可以应用定制的 CSS。这代表了使用类似 Looker Embedded 这样的东西的巨大进步。然而,请注意,到目前为止,这主要停留在“嵌入式仪表板”用例上,而不是允许高度定制的分析应用程序。
“一体化”工具
虽然我们已经介绍了构建分析应用程序的所有关键方面,以及有助于实现这些方面的各种工具和技术,但在这一领域还有第二类产品值得考虑,它们垂直集成了堆栈中的一些组件,提供了更多简化的“一体化”体验。这些产品中的大多数都旨在尽可能简单地构建一个数据应用程序,对于数据科学家来说,这是一种理想的伪自助服务方式。
这方面的一个例子是 Plotly Dash ,它使得完全基于 python 脚本部署简单的 Flask web 应用程序变得非常容易,该脚本结合了 python 分析功能和 Plotly 的可视化库。 Streamlit 是这一类别中另一款受人喜爱的产品,专注于使任何数据脚本都可以在几秒钟内成为可共享的 web 应用程序,无需了解前端软件工程。 Observable 可以轻松构建基于 javascript 的数据探索笔记本,它还可以作为可共享的交互式网络应用。
也有各种各样的产品出现,它们可以轻松地在数据科学笔记本上创建快速的网络应用程序,例如, Hex 和 Count 可以让您将数据科学笔记本变成交互式数据应用程序。
虽然这些产品使用简单,开发人员体验也很棒,但挑战在于,在大多数情况下,它们主要用于快速原型开发和内部协作。快速拼凑一些东西是非常容易的,但是从那里到一个功能完整的网络应用,成为你产品的核心组件,是一个巨大的飞跃。性能将成为一个问题,与更广泛的产品进行更深入的集成也将成为一个问题。因此,虽然这些产品肯定有明确的用例及位置,但它们并没有真正解决构建分析应用程序的问题。也就是说,有一些新兴公司认为他们的架构可以支持更多的“生产级”用例——一个这样的例子是 BaseTen ,它主要专注于 ML 驱动的应用。
市场中的机会和差距
尽管这个市场的工具状态已经比 5 年前好了几个数量级,但在许多方面,它仍然感觉像是处于早期阶段。根据与该领域从业者的多次交谈,我认为以下几点是最严重的棘手问题:
缓存和预聚合
现代应用程序团队在处理自主开发的 Redis 和 Memcached 解决方案以及数据库中自定义维护的预聚合时感到非常痛苦。这些解决方案增加了如此多的复杂性,以至于它们经常使应用程序开发慢如蜗牛。虽然基于 Rockset 等较新工具构建的公司通常可以忽略这些问题,但市场上有大量没有低延迟数据库的公司,或者需要在 Postgres 等关系数据库上构建的公司,他们没有很好的解决方案。
可视化
作为分析应用程序的一部分,需要有工具在定制可视化工作的简单性和强大性之间更好地穿针引线。然而,从创业的角度来看,这里的挑战是,与较低级别的计算和存储层相比,传统上很难将前端框架货币化。尽管如此,我接触过的许多公司都会非常感谢更好的解决方案。
数据库的统一(指标基础设施的融合)
越来越多的人认为,拥有可以服务于更广泛用例的数据库在技术上是可能的,这消除了对 BI 用例、分析应用用例以及其他用例的专门数据存储的一些需求。WePay 的杰出工程师 Chris Riccomini 在这里发了一条有趣的推文。 Apache Iceberg 也将我们带向这个方向,由于更复杂的元数据和索引管理,即使是传统上“缓慢”的数据存储系统,如 S3,也可以获得极快的分析支持。
像 Pinot 或 Druid 这样的工具是否真的能够成为真正的通用工具还有待观察,但这一方向的进步可能会大大减少您在当今许多数据环境中看到的蔓延和复杂性,并使分析应用程序的基础架构更接近其他数据用例。
原型开发工具的简单性和定制堆栈的强大功能
像 Hex、Streamlit 和 Plotly 这样的公司已经构建了非常优雅的产品。问题是——我们能不能保持这些工具的简单性,同时在性能和与更广泛的应用程序开发框架的可组合性方面保留“DIY”堆栈的优势。Preset 最近的博客文章触及了这个问题的各个方面——也许一个开源的、面向社区的商业智能平台也能提供一些。
最终,我不清楚像这样的公司是否会尝试向支持成熟的面向用户的应用程序的方向发展,而不是专注于内部协作、原型、仪表板或非关键的面向用户的应用程序。或者,可能会出现新的全栈分析应用公司,这些公司更注重将这些易用性和时间价值原则应用于任务关键型应用。
解决产品工程与数据之间的摩擦
我喜欢 Topcoat 方法的一点是,它支持数据科学家完全自助式地部署嵌入式仪表板,但这种方式比嵌入式 BI 工具好得多(不是 iframe,完全可定制,为利用 DBT 而构建,具有清晰的指标层,支持测试和全面的软件开发原则等),并且可能更受产品团队的欢迎。这不会解决所有的分析应用用例,但它有一个明确的市场。
对此进行扩展,感觉仍然有机会构建工具,继续抽象数据平台和产品工程之间的接口。这些团队越能自我服务,而不需要对其他团队的工具包有实质性的了解,就越好。Cube.dev 是目前在这一领域引领潮流的另一个产品,但可能还有很多需要改进的地方。
最终,随着越来越多的公司将数据作为核心竞争力,越来越多的产品需要将大规模分析处理作为其核心用户工作流的一部分。数据将越来越成为我们与所用产品交互方式的一个不可分割的重要方面,因此,构建此类分析应用程序的工具的重要性将显著增加。此类应用程序需要具有原生的感觉,在规模上具有高性能(高并发性、高频率、低延迟),与现代云数据堆栈配合良好,以高度可定制的方式充分融合应用程序和数据逻辑,最重要的是,构建起来更加简单。
如果你在这些问题上遇到了困难,或者正在开发一个产品来解决这个领域的任何问题,我很乐意和你谈谈——davis@innovationendeavors.com。
感谢 Artyom Keydunov、Chris Riccomini 和 Jon Natkins 为本文提供反馈。
数据科学工作的分析工程领域
如何找到一份半年内不会离职的工作

亚当·米勒在 Unsplash 上的照片
数据科学炒作是真实的。Glassdoor 连续四年将数据科学家列为美国最好的工作,去年才被挤出榜首。数据科学正在改变医学、医疗、金融、商业、非营利、政府。麻省理工学院将花费 10 亿美元建立一所专门研究人工智能的大学。一个完整的教育行业已经开始尽快培养新的数据科学家,以满足迅速增长的需求,这是有充分理由的:当世界上 90%的数据是在过去两年里产生的时,我们迫切需要懂得如何在一堆数字中找到模式的人。
当雇主和雇员之间有很好的匹配时,数据科学是一个有回报的职业。然而与此同时,2017 年金融时报的一份报告发现, 13%的数据科学家正在寻求跳槽 ,很大程度上是受 对实际工作 的幻灭所驱使。2019 年英国女性数据调查也表明 大多数打算明年换工作。
等等,那外卖是什么?数据科学是一份理想的工作还是我应该远离它?我的收获是,数据科学确实是一个令人敬畏的职业——来加入我们吧——这一点我甚至和那些不再抱有幻想的数据科学家们分享。但同时,也要谨慎选择你的雇主。
这篇文章假设你对转向数据科学感兴趣。欢迎光临!在这篇文章中,我将帮助你做出明智的选择,选择你最喜欢的数据科学角色。
什么是数据科学家?
我们首先需要定义数据科学家的含义。查看职位描述令人惊讶地让我们更加困惑:由于过去十年对数据科学兴趣的爆炸,公司很乐意在招聘信息中分配“数据科学家”的标签,也可能是统计学家、数据分析师、数据工程师、机器学习工程师,甚至是软件工程师。事实上,你可以将机器学习应用到帖子中,以识别“数据科学家”中几组更具体的工作!
让我们试着理解一下这种变化。数据科学的核心围绕着两个理念:
- 从数据中获得洞察力
- 与他人交流这些见解
这两点听起来很简单,但是它们在现实世界中的含义有很大的差异。用于获得洞察力的方法各不相同,从我们已经使用了100 多年的技术到目前计算能力极限下的方法。
类似地,如果这些见解的消费者是首席执行官或算法,那么交流这些见解看起来会有很大不同。互联网上充斥着精心勾勒出数据科学家确切职责的伟大思想片段[1],因此在这篇文章中,我将根据职责的 谱来框定事情。
手术刀对铲子
让我们从我称之为“分析工程”的光谱开始。请注意,我故意省略了几个相关的职业[2],以缩小数据科学与分析和工程的最大区别。

作者图片
我认为这个光谱是“手术刀对铲子”分析师检查数据以发现见解( 手术刀 ),而工程师构建基础设施以存储和移动数据( 铲子 )。
分析师需要访问数据;工程师可以构建数据库和 API 来实现这一点。工程师需要明确的方向去建造什么;分析师的发现可以确定要追求的最高价值的计划。
当分析团队的见解准确并被组织采纳时,他们会提供最大的价值。当有一系列技术人才能够很好地合作时,一个工程团队是最有价值的。
数据科学家介于这些截然不同的角色之间。人们通常期望数据科学家既能理解数据,又能构建基础设施,将见解分发给组织的其他成员。他们可能会构建一个统计模型来准确描述一些数据,例如,然后构建一个管道来填充一个面向客户的仪表板,其中包含来自该模型的每日预测。他们的产品不仅仅是知识或管道,而是两者的结合。
在这个范围上的期望变化很大— 以及范围的多少! —一个数据科学家被期望覆盖。一家成熟的大型科技公司可能会有专门角色的数据科学家,例如专门致力于编写更有效的深度学习算法。与此同时,一个更年轻的公司会期望数据科学家跨越大部分领域,甚至可能涉足软件工程。
几个核心?
我们需要简要提及的另一个频谱是正在处理的数据的 数量 和 复杂性 ,这决定了获得洞察力所需的方法。
以下热图中的任何分析都可以归入“数据科学”的范畴,尽管所需的编码能力的复杂程度从相对较小到多年的内存管理和分布式计算经验不等。下面,暖色表示计算复杂度更大。

作者图片
随着您增加数据集(x 轴)的大小,与机器学习的迭代方法相比,frequentist 统计中的逆矩阵和转置等矩阵运算的计算量会变大。
大型数据集也是我们需要开始考虑在并行计算机核心之间分配我们的任务,在云中租赁强大的服务器,以及利用通常保留用于渲染图形的计算机部分。(希望身边有数据工程师帮忙!)
类似地,当您增加数据(y 轴)的复杂度时,您会快速增加算法需要的迭代次数,或者每次迭代的计算次数。
这就是像深度学习或强化学习这样的技术变得必要的地方:为了识别图像中的动物,神经网络有一层又一层的功能,这些功能滚动像素以找到线,然后在输入的基础上建立一层以识别圆,然后嘴,眼睛和脸,直到许多计算之后,它根据与它训练的示例图像的最佳匹配来预测“猫”。唷!一个图像下来,到下一个!
红色区域看起来很吸引人,因为越大越复杂总是越好,对吗?当然,这也有明显的缺点:对于非常大的数据集,很容易发现虚假的相关性,忽略基本的统计学原理仍然会让你得出不正确的结论。比起堆积如山的数据,拥有 高精度数据 更有价值。
与此同时,对于像深度学习这样的复杂方法,解释模型如何得出结论非常困难并且会导致对结论缺乏信心。
不过,最终,你可能只会在拥有大量数据的公司中使用这些红区方法。如果不需要复杂的东西,你可能会发现自己放弃了深度学习包,转而开始进行线性和逻辑回归。(如果做得正确,这是非常有价值的,不应该反对。正确回答问题比仅仅因为很酷而使用很酷的技巧要好。)

纽约公共图书馆在 Unsplash 拍摄的照片
把它带到现实世界
就业市场
最后两节的重点是展示以下产品的广泛范围:
- 对数据科学家将带来什么水平的分析和工程的期望
- 可以用数据科学方法解决的数据集的复杂性和大小
现在,让我们使用这些频谱来开始了解名为“数据科学家”的职位的变化我们将从 Yelp 上的一个职位样本开始。头衔是数据科学家,职位在光谱的分析侧。

作者截图
如果没有列出具体的数据科学技术,很难判断这项工作在计算复杂性热图中的位置,但我们可以做出一些推断。Yelp 的数据由数千万个数字排名和文本评论组成,这意味着他们的数据科学家可能会采用机器学习和自然语言处理。
然而,由于该职位提到运行影响数百万用户的实验,所涉及的数据科学可能更专注于用户如何与网站和应用程序本身进行交互。这些分析可能会涉及 A/B 测试,这通常在计算复杂度上很轻,但需要对与业务问题无关的噪声进行仔细的统计控制。同样明显的是, Yelp 希望这个职位的人能为商业决策提供指导,这意味着统计上的细微差别很重要。
现在让我们看看光谱的另一端。这是一份来自特斯拉的招聘样本。这个头衔仍然是数据科学家,但是这次这个职位是工程方面的。

作者截图
很明显,这项工作属于计算复杂性的红色区域。 Tensorflow 和 Keras 是深度学习的工具;你可能会致力于改善特斯拉的自动驾驶算法每秒处理几十次甚至几百次图像的方式。持续集成、REST API和 JavaScript 都清楚地表明这个角色的人应该具备软件工程的能力。特斯拉试图用数据科学解决的大问题可能是明确的——现在是时候用最先进的计算展示一下肌肉了。
那你呢?
正如我们所看到的,“数据科学家”是一个包罗万象的短语,适用于广泛的工作,就像术语“工程师”包含几十种职业一样。为了弄清楚你想在数据科学领域处于什么位置,我会问自己几个问题:
我有多关心随机效应和代表性抽样这样的统计细微差别?
- 完全不是,给我代码决定论–>工程
- 我很在意,p.s. p-values 误导!–>分析
我有多关心优化代码以提高效率?
- 这个函数有 150 行长——让我们把那个—>工程模块化
- 获得正确的统计数据比编写完美的代码更重要–>分析
一旦分析完成,我希望在多大程度上建立一个管道?
- 其实比起分析–>+工程,我更关心管道
- 我宁愿专注于确保我得出的任何结论都是准确的–>+分析
我倾向于分析!
如果你发现自己更认同分析的答案,我会把重点放在建立 R 和数据可视化的强大技能上。一个主要的奖励是仪表板技能,比如闪亮的、画面或 D3.js 。你工作的一个重要部分是与利益相关者交流见解,所以你需要专家级的技巧来解释你的分析和他们的结论。对雇主来说,最好的选择是那些成熟的公司,它们拥有成熟的数据管道,并且已经认识到需要专门的分析师来帮助做出商业决策。下一步,我强烈推荐 Cassie Kozyrkov 的哈佛商业评论文章“伟大的数据分析师做什么——以及为什么每个组织都需要他们。”
我偏向工科!
如果你发现自己更认同工程学的答案,我会专注于在 Python、SQL、 云计算 方面建立强大的技能。了解数据架构最佳实践,例如关系数据库与非关系数据库或如何配置 Spark 集群,变得非常重要。 JavaScript 偏离了数据科学,但对于将您的工作无缝集成到公司产品的其他部分至关重要。如果你想处理巨大的数据集,考虑添加 Scala 或者 Java。你的代码将会是你的产品,所以你会想要阅读编码最佳实践甚至一本或两本教科书。能够用一系列语言编写高效的代码将让您应对各种挑战——这是数据和软件工程的理想选择。
我全都想要!
如果你没有完全落入纯分析与纯工程的范畴,那太好了!有很多工作的计算复杂性和分析水平与你所寻找的工程相比都是合适的。然而,无论你处于光谱的哪个位置,我都会专注于提升你的 Python 和 SQL ,以及 能够识别组织的相关问题 。数据科学家具有识别正确问题的商业意识、找到这些分析答案的分析能力以及部署这些分析结果的自给自足能力,被认为是极具价值的独角兽。

美国宇航局在 Unsplash 拍摄的照片
现在怎么办?
无论你想走哪条路,都要开始建立投资组合。GitHub repo 可以,或者像这样的博客也可以。项目是学习的关键——当你被迫演示一项分析或自己构建一个 API 时,你内化了原本可以保持抽象的概念。申请工作时,除了简历上的一行之外,有一些证明你的编程能力的证据也是有帮助的。写我的 R 系列简介对我成为一名程序员来说至关重要,它帮助我找到了研究生毕业后的第一份工作。团队只使用 Python 编程,我在这方面没有太多经验,但是我的老板(秘密地)读了我的 R 博客帖子,认为我对编程的理解足够好,可以随时学习 Python。成功了!
一旦你知道你在分析工程谱和计算复杂性谱上的位置,开始过滤掉那些不涉及你想做的工作的工作岗位。把精力花在你不想做的工作上是没有用的!同样,开始思考你想贡献的领域。特别是在分析和数据科学领域,您的工作需要对该领域的挑战以及您的组织应对这些挑战的策略有深刻的理解。如果你觉得这个领域有趣,你的工作会变得更加愉快!最后,一旦你在面试工作,注意 数据科学的危险信号 ,比如缺乏对数据科学家的工程支持,没有版本控制,或者对该角色涉及的分析与工程的数量回答模糊。
祝你好运!一如既往,如果我能帮到你,请随时联系我。
最好,
哑光
脚注
1.什么是数据科学家?
这里有几个我觉得特别有见地的片段。
- 安德鲁·佐拉,跳板 : 《机器学习工程师 vs 数据科学家》
- 《哈佛商业评论》 : 《数据科学家的种类》
- Cassie Kozyrkov, Hackernoon : “为什么企业在机器学习上失败”
2.手术刀对铲子
机器学习工程师、计算社会科学家、统计学家、深度学习研究人员、商业智能分析师……我们可以在这里添加更多的,但我们的范围将开始变得二维或三维。
进一步阅读
查看这些相关的帖子,深入了解这里涉及的一些主题。
主动元数据平台的剖析
活动元数据是来自 Gartner 的最新类别,它是对当今扩充数据目录的一次转型飞跃

马克斯·兰格洛特在 Unsplash 上拍摄的照片
随着 Gartner 放弃其元数据管理解决方案的魔力象限,代之以活动元数据的市场指南,元数据管理刚刚发生了动摇。看出区别了吗?随着这一变化,Gartner 刚刚推出了活动元数据,作为未来的一个新类别。
与数据生态系统中的任何新类别一样,这一宣布带来了大量的兴奋,一些有益的怀疑和大量的问题。
- 活跃元数据到底是什么?
- 它与我们以前见过的扩充数据目录和其他技术有什么不同?
- 一个活跃的元数据平台是什么样子的?
我曾经在中写过什么是活跃的元数据平台及其关键特征。今天,我想在这个抽象讨论的基础上更进一步,描绘一幅活动元数据平台的图景,分解关键组件,并给出一些活动元数据的真实用例。
TL;DR:一个活跃的元数据平台是什么样子的?

主动元数据平台的体系结构。(图片来自 Atlan 。)
在我看来,一个活跃的元数据平台有 5 个关键组成部分:
- 元数据湖:一个统一的存储库,以原始和处理过的形式存储各种元数据,构建于开放 API 之上,由知识图提供支持。
- 可编程智能机器人:一个框架,允许团队创建可定制的 ML 或数据科学算法来驱动智能。
- 嵌入式协作插件:由公共元数据层统一的一组集成,将数据工具与每个数据团队的日常工作流程无缝集成。
- 数据流程自动化:一种构建、部署和管理工作流自动化机器人的简单方法,这些机器人将模拟人类决策流程来管理数据生态系统。
- 反向元数据:编排以使相关元数据在最终用户需要时随时随地可用,而不是在独立的目录中。
1.元数据湖:元数据的单一中央存储
几个季度前,我写了一篇关于 元数据湖 的概念:一个统一的存储库,以原始和进一步处理的形式存储各种元数据,这些元数据可用于驱动我们今天和明天已知的用例。
主动元数据建立在主动寻找、丰富、清点和使用所有这些元数据的前提下,采用传统的“被动”技术,使其真正面向行动。
作为任何活动元数据平台的基石,元数据湖有两个关键特征:
- 开放 API 和接口:元数据湖需要易于访问,不仅仅是作为数据存储,而是通过开放 API。这使得在现代数据堆栈的每个阶段利用单个元数据存储来驱动各种用例变得非常容易,例如发现、可观察性和沿袭。
- 由知识图提供支持:当数据资产之间的所有连接都活跃起来时,元数据的真正潜力就被释放出来了。为谷歌、脸书和优步等世界上最大的互联网公司提供支持的知识图架构是最有希望实现这些元数据连接的候选方案。
2.可编程智能机器人
我们正在快速进入一个元数据本身正在成为大数据的世界,理解这些元数据是创建现代数据管理生态系统的关键。
元数据智能有可能影响数据生命周期的方方面面。它可以解析 SQL 查询日志来自动创建列级沿袭。它可以自动识别 PII(个人身份信息)数据,以保护私人信息。通过自动检测数据异常值和异常值,它可以在发现我们之前发现坏数据。在过去的几年里,元数据在这方面有了一些创新,“扩充的”数据目录变得越来越流行。
然而,在所有的宣传中,我认为,到目前为止,关于智能如何应用于数据管理,有一件事我们搞错了— 一种尺寸不适合所有人。
每个公司都是独一无二的。每个行业都是独一无二的。每个团队的数据都是独一无二的。
在最近与一位数据领导者的通话中,他批评了他的检测数据质量异常的工具:有时该工具会向我们发送关于模式更改和质量问题的有用警报。其他时候,它尖叫着不该尖叫的东西,真的让我们的数据工程团队感到沮丧。"
我不怪工具。现实情况是,每个机器学习算法的输出都是输入的训练数据的函数。没有一种算法能够神奇地创建上下文、识别异常并实现智能数据管理梦想,并且在每个行业、每个公司和每个用例中都 100%成功。尽管我很希望有,但没有灵丹妙药。
这就是为什么我相信主动元数据平台的智能未来不是一个能够神奇地解决我们所有问题的单一算法。相反,它是一个允许团队创建可编程智能机器人的框架,这些机器人可以很容易地根据不同的上下文和用例进行定制。
这里有几个可编程智能机器人的例子:
- 随着安全性和合规性要求成为主流,公司将不得不遵循更多规则——例如针对医疗保健数据的 HIPAA 和针对银行业务的 BCBS 239 等行业特定规则,或者针对地区特定的规则,例如欧洲的 GDPR 和加州的 CCPA 。根据适用于每家公司的法规,机器人可以用来识别和标记敏感列。
- 对数据集有特定命名约定的公司可以创建机器人,根据预设规则自动组织、分类和标记他们的数据生态系统。
- 公司可以采用现成的可观察性和数据质量算法,并根据他们的数据生态系统和用例进行定制。
可编程智能的用例是无穷无尽的,我对未来充满期待!
3.嵌入式协作插件
如今,数据团队比以往更加多样化。他们由数据工程师、分析师、分析工程师、数据科学家、产品经理、业务分析师、公民数据科学家等组成。
这些多样化的数据团队使用同样多样化的数据工具,从 SQL、Looker 和 Jupyter 到 Python、Tableau、dbt 和 r,再加上一大堆协作工具(如 Slack、JIRA 和电子邮件),你已经让数据专业人员的生活变成了一场噩梦。
由于数据团队的基本多样性,数据工具需要设计为与每个团队的日常工作流程无缝集成。
这就是嵌入式协作的想法的来源。嵌入式协作不是从一个工具跳到另一个工具,而是让工作发生在每个数据团队成员居住的任何地方,减少摩擦和上下文切换。

嵌入式协作会是什么样子。(图片由 Atlan 提供)。)
以下是嵌入式协作的几个例子:
- 如果您可以在获得链接时请求访问数据资产,就像使用 Google Docs 一样,而所有者可以在 Slack 上获得请求,并在那里批准或拒绝它,会怎么样?
- 如果当您检查数据资产并需要报告问题时,您可以触发与您的工程团队的 JIRA 工作流完美集成的支持请求,该怎么办?
活动元数据平台中的动作层将使嵌入式协作最终活跃起来。我将这一层视为现代数据堆栈的Zapier——由公共元数据层统一,允许团队为自己独特的工作流定制应用。
4.数据处理自动化
几年前,一种叫做机器人流程自动化 (RPA)的新型工具席卷了企业界。从 UiPath 开始,RPA 是“一种软件技术,它使构建、部署和管理软件机器人变得容易,这些软件机器人模拟人类与数字系统和软件交互的动作”。
随着数据结构、数据网格和数据操作等概念成为我们思考数据平台的主流方式,它们将产生对数据流程自动化 (DPA)的需求,这是一种构建、部署和管理工作流自动化机器人的简单方法,这些机器人将模拟人类决策流程或操作来管理您的数据生态系统。
您是否曾在周一早上因仪表盘的加载速度而感到沮丧?或者更糟的是,对 AWS 在月底开出的高额账单感到惊讶?
有了活跃的元数据平台,不难想象这两种情况不会再次发生的世界。一个真正的主动元数据平台可以向相邻的数据管理工具推荐参数化指令,用于资源分配和作业管理等操作。
例如,通过利用来自各种来源的元数据,例如顶级 BI 控制面板以及 BI 工具的峰值使用时间、来自数据管道工具的过去数据管道运行统计数据以及来自仓库的过去计算性能,您可以想象活动元数据平台不仅推荐用于纵向扩展雪花型仓库的参数,而且实际上利用 DPA 来分配仓库资源。
5.反向元数据
我认为,过去几年最伟大的事情之一是真正的“现代数据堆栈”公司和企业家的崛起,他们认为惊人的用户体验胜过一切。
旧时代的一切都是关于“价值捕捉”,而新一代的企业家专注于“价值创造”——最终用户体验是第一位的。现代数据堆栈公司越来越有兴趣真正相互合作,整合他们的产品路线图,创造更好的用户体验。
主动元数据是真正打开这些合作关系的钥匙,我认为“反向元数据”将改变游戏。
逆向元数据是指“独立数据目录”中没有的元数据。相反,它是让最终用户可以随时随地获得相关的元数据,以帮助他们更好地完成工作。
例如,在 Atlan,我们与 Looker 的反向元数据集成直接在 Looker 中显示“上下文”(如谁拥有仪表板、指标定义和文档等)。

在 Looker 中反转元数据。(GIF 来自 Atlan 。)
主动元数据平台有助于在现代数据堆栈中编排有用的元数据,使堆栈中的各种工具更加有用,而无需投资于每个工具之间的定制集成。
总结
在我看来,Gartner 报告中最具预言性的一句话是,“独立的元数据管理平台将从扩充的数据目录重新聚焦到元数据‘随处’编排平台。”
我们刚刚开始使用活动元数据,因为我们正在共同努力找出它在今天和明天的数据生态系统中可能扮演的角色。我希望这篇文章能揭示未来的样子,让它从抽象走向更真实的东西。
觉得这个内容有帮助?在我的时事通讯《元数据周刊》上,我每周都写关于活动元数据、数据操作、数据文化和我们的学习建设的文章。 在此订阅。
Python 列表的剖析
这是一个简单的指南,总结了 Python 中关于列表操作的最常见的方法和操作。

Python 列表是一种内置的数据类型,用于将任何数据类型(如字符串、整数、布尔或任何类型的对象)的项目存储到单个变量中。
列表是通过将一个或多个任意逗号分隔的对象括在方括号中创建的。
列表可能包含不同数据类型的元素
列表中的项目可以是相同或不同的数据类型。
**a_list = [15.1, 'x', 14, True]**# The assigned variable ‘a_list’ contains a float, a string, an int, and a bool
列表项目遵循有序或特定的顺序
元素被处理的顺序是在列表被写入时设置的,如果没有改变,它将保持不变。
a_list = [15.1, 'x', 14, True]
b_list = [6.6, 2.0, 125, 0, 63]
c_list = ['London', 'Lisbon', 'New York', 'Sidney']
按索引访问值
像访问字符串中的字符一样,列表中的每一项都有一个指定的索引,可以使用方括号来访问。请记住,列表索引是从零开始的,这意味着第一项位于索引 0 处。
# Defining a list
a_list = [15.1, 'x', 14, True]# Accessing the first value at index 0
a_list[0]>>> output:
15.1---# Accessing the second value at index 1
a_list[1]>>> output:
'x'
访问值也可以通过负索引来执行,即从列表末尾开始计数。当您需要访问最后一项而不知道列表的长度时,这可能非常方便。

指数与负指数。作者图片
# Accessing the last value at index -1
a_list[-1]>>> output:
True---# Accessing the first value at index -4
a_list[-4]>>> output:
15.1
切片列表
切片是获取列表子集的好方法。例如,a_list[m:n]返回从索引[m]到索引[n]的a_list的子集,不包含。如果索引为零(0)或者将切片扩展到无穷大,可以省略索引。让我们在接下来的例子中实现它。

使用索引切片访问列表。作者图片
理解:
# Defining a list
**a_list = [15.1, 'x', 14, 'London', True, 2.0, 'Lisbon', 0]**# You can omit the index in case of:
# a) index zero (0)# Starts at the first character (index 0) and ends at the third (index 2), not included
a_list[:2]>>> output:
[15.1, 'x']# Starts at the second character (index 1) and ends at the fifth (index 4), not included
a_list[1:4]>>> output:
['x', 14, 'London']# Starts at the sixth character (index 5) and extends to the end of the list
a_list[5:]>>> output:
[2.0, 'Lisbon', 0]---# You can also omit the index in case of:
# b) extending the slice to the infinite# Extending to the infinite on both ends returns the whole list
a_list[:]>>> output:
[15.1, 'x', 14, 'London', True, 2.0, 'Lisbon', 0]
工作的几个例子切片列表结合积极和消极的指标。

使用负索引切片访问列表。作者图片
理解:
# The list
**a_list = [15.1, 'x', 14, 'London', True, 2.0, 'Lisbon', 0]**# Returns the list counting every two characters
a_list[-5:-2]>>> output:
['London', True, 2.0]---# Starts at index -4 and until the end of the list
a_list[-4:]>>> output:
[True, 2.0, 'Lisbon', 0]---# Starts at index 2 and ends at index -3 (same as index 5, excluded)
a_list[2:-3]>>> output:
[14, 'London', True]---# Starts at index -7 (same as index 1) and ends at index 6, excluded
a_list[-7:6]>>> output:
['x', 14, 'London', True, 2.0]---# Returns the list from the beginning to index -5 (same as index 3, not included)
a_list[:-5]>>> output:
[15.1, 'x', 14]
我们可以定义一个步骤,在这个步骤中,它将“跳转”第三个参数中指定的字符数。
# The list
**a_list = [15.1, 'x', 14, 'London', True, 2.0, 'Lisbon', 0]**# Returns the whole list every two characters
a_list[::2]>>> output:
[15.1, 14, True, 'Lisbon']
步长可以是正的,也可以是负的。
# Goes to the infinite on both ends and returns the list on backwards every 3 characters
a_list[::-3]>>> output:
[0, True, 'x']
让我们用几个例子让它工作吧,切片列表结合了正的和负的索引和步骤。
# The list
**a_list = [15.1, 'x', 14, 'London', True, 2.0, 'Lisbon', 0]**# Starts at index 0, ends at index -3 (same as index 5) every two characters
a_list[:-3:2]>>> output:
[15.1, 14, True]---# Starts at index -2 (same as index 6), ends at index 2 (same as index -6) and returns the list on backwards
a_list[-2:2:-1]>>> output:
['Lisbon', 2.0, True, 'London']---# Returns the whole list
a_list[::]>>> output:
[15.1, 'x', 14, 'London', True, 2.0, 'Lisbon', 0]---# Returns the list on backwards every two characters
a_list[::-2]>>> output:
[0, 2.0, 'London', 'x']
尽管在上面的例子中,我们的列表总是被赋值给一个变量(a_list),但是也可以对列表文字进行操作。
[15.1, 'x', 14, 'London', True, 2.0, 'Lisbon', 0]**[3]**>>> output:
'London'---[15.1, 'x', 14, 'London', True, 2.0, 'Lisbon', 0]**[::-2]**>>> output:
[0, 2.0, 'London', 'x']---**'Lisbon' in** [15.1, 'x', 14, 'London', True, 2.0, 'Lisbon', 0]>>> output:
True---**len(**[15.1, 'x', 14, 'London', True, 2.0, 'Lisbon', 0]**)**>>> output:
8
嵌套列表
我们意识到一个列表可以包含任何类型的数据集合。这也包括另一个列表,它又可以包含另一个子列表本身,以此类推。

嵌套列表。作者图片
理解:
# The list
**n_list = [15.1, 6, ['apple', ['abc', 'xpto', 'zed']]]**# n_list[0] is a float and n_list[1] is an integer
print(n_list[0])
print(n_list[1])>>> output:
15.1
6---# n_list[2] is a sublist
n_list[2]>>> output:
['apple', ['abc', 'xpto', 'zed']]---# To access the items inside a sublist, must add another index to the first one
n_list[2][1]>>> output:
['abc', 'xpto', 'zed']---# To access a specific character inside a sublist, you must apply the same reasoning of append additional indices as deep as desired
n_list[2][1][0]>>> output:
'abc'---# Deep further, there is no limit
n_list[2][1][0][2]>>> output:
'c'
从这一点开始,很容易将所有关于索引和切片的语法应用到子列表。
# The list
**n_list = [15.1, 6, ['apple', ['abc', 'xpto', 'zed']]]**n_list[2][1][:2]>>> output:
['abc', 'xpto']---n_list[2][1][::-1]>>> output:
['zed', 'xpto', 'abc']---n_list[2][1][-1]>>> output:
'zed'---n_list[2][1][-1][::-1]>>> output:
'dez'
列表是可变的
例如,我们可以创建一个列表并将其赋给一个变量,并将其命名为a_list。一旦列表被创建,我们现在可以随意地执行一系列的修改。假设我们可以添加、删除或移动任何项目。
让我们通过添加一些单个值替换现有的值来修改列表。
# The list
**a_list = [15.1, 'x', 14, 'London', True, 2.0, 'Lisbon', 0]**# Adding a string (with a single character) at index 0 replacing the current value
a_list[0] = 'y'# Adding a boolean at the last index and replace the current item
a_list[-1] = False# Calling the variable
a_list>>> output:
['y', 'x', 14, 'London', True, 2.0, 'Lisbon', False]
现在让我们通过添加和替换多个项目来修改列表。
# The list
**a_list = [15.1, 'x', 14, 'London', True, 2.0, 'Lisbon', 0]**# Checking values at indices two to six, excluded
a_list[2:6]>>> output:
[14, 'London', True, 2.0]---# Assigning a single value from indices two to six
a_list[2:6] = [999]
a_list>>> output:
[15.1, 'x', 999, 'Lisbon', 0]# The number of items added is not equal to the number of items replaced and that is not a problem for python, it simply grows and shrinks the list along with the operations
a_list[2:3]>>> output:
[999]---# Assigning values from indices two to three and replacing the 999 int
a_list[2:3] = ['x', 'p', 't', 'o']
a_list>>> output:
[15.1, 'x', 'x', 'p', 't', 'o', 'Lisbon', 0]# If we determine to replace at a specific index instead a slice, a sublist will be created
a_list[2] = ['a', 'b', 'c']
a_list>>> output:
[15.1, 'x', ['a', 'b', 'c'], 'p', 't', 'o', 'Lisbon', 0]
通过在所需索引处指定一个没有长度的片,可以添加任何项目而不替换现有项目。
# The list
**a_list = [15.1, 'x', 14, 'London', True, 2.0, 'Lisbon', 0]**# Assigning elements without replacing any with a zero-length slice
a_list[2:2] = ['cat', 'dog']
a_list>>> output:
[15.1, 'x', 'cat', 'dog', 14, 'London', True, 2.0, 'Lisbon', 0]
删除多个项目和添加它们一样容易。
# The list
**a_list = [15.1, 'x', 14, 'London', True, 2.0, 'Lisbon', 0]**# Checking sliced items
a_list[1:7]>>> output:
['x', 14, 'London', True, 2.0, 'Lisbon']# Assigning an empty list at the desired slice
a_list[1:7] = []
a_list>>> output:
[15.1, 0]
接下来,我们将学习一些操作和修改列表的常用方法。首先,添加元素。
附加
.append()方法将在列表末尾添加一个值。这是就地发生的,因此它不会返回任何输出。
# Defining a list
a_list = [15.1, 'x', 14, '7']# Adding a value
a_list.append(5.5)
a_list>>> output:
[15.1, 'x', 14, '7', 5.5]
请记住,在追加列表时,整个新列表是作为一个元素添加的,而不是追加它的每个值。
# Appending a new list to the assigned 'a_list'
a_list.append(['abc', 12.6])
a_list>>> output:
[15.1, 'x', 14, '7', 5.5, ['abc', 12.6]]
另一方面,如果你想添加另一个列表并将所有的条目合并到前面的列表中,你需要使用.extend()方法。
扩展
.extend()方法将向一个列表中添加几个值。这意味着当用另一个列表扩展一个列表时,所有的值都是分开添加的。
a_list = [15.1, 'x', 14, '7']a_list.extend(['abc', 12.6])
a_list>>> output:
[15.1, 'x', 14, '7', 'abc', 12.6]---a_list = [15.1, 'x', 14, '7']
b_list = ['python', 7.7, 6]a_list.extend(b_list)
a_list>>> output:
[15.1, 'x', 14, '7', 'python', 7.7, 6]
当使用+操作符时,我们得到相同的结果。
a_list = [15.1, 'x', 14, '7']
b_list = ['python', 7.7, 6]a_list + b_list>>> output:
[15.1, 'x', 14, '7', 'python', 7.7, 6]
插入
.insert()方法在指定的索引位置添加一个项目。
a_list = [15.1, 'x', 14, '7']# The first argument is the index and the second one is the valuea_list.insert(2, 'python')
a_list>>> output:
[15.1, 'x', 'python', 14, '7']
有许多方法可以从列表中删除元素,如下所示。
去除
方法将删除一个列表中想要的元素(如果重复的话是第一个出现的)。
a_list = [15.1, 'x', 14, '7']a_list.remove('x')
a_list>>> output:
[15.1, 14, '7']
倒三角形
方法将根据索引从列表中移除任何元素。
a_list = [15.1, 'x', 14, '7']del a_list[2]
a_list>>> output:
[15.1, 'x', '7']
流行音乐
.pop()方法移除特定索引处的一个项目——如果没有指定,它将默认移除最后一个项目(该操作返回弹出的项目)。
a_list = [15.1, 'x', 14, '7']print(a_list.pop(0))
print(a_list.pop(-1))>>> output:
15.1
7
可以执行.pop()方法,将其赋给不同的变量。
a_list = [15.1, 'x', 14, '7']b = a_list.pop()
print(a_list)>>> output:
[15.1, 'x', 14]
清楚的
.clear()方法将删除所有元素。
a_list = [15.1, 'x', 14, '7']a_list.clear()
a_list>>> output:
[]
分类
默认情况下,.sort()方法将按升序对列表进行排序,尽管也可以使用(reverse=True)参数。
这种方法就地改变。这意味着它不返回任何东西。
a_list = [15.1, 5, 14, 7.8]a_list.sort()
a_list>>> output:
[5, 7.8, 14, 15.1]
分类的
另一方面,如果您想保留原来的列表并将元素排序到一个新列表中,您可以使用内置的sorted函数。
a_list = [15.1, 5, 14, 7.8]
sorted(a_list)>>> output:
[5, 7.8, 14, 15.1]a_list>>> output:
[15.1, 5, 14, 7.8]---# you can keep the original list and create a sorted version of itsorted_list = sorted(a_list)
display(a_list, sorted_list)>>> output:
[15.1, 5, 14, 7.8]
[5, 7.8, 14, 15.1]
复制
.copy()方法将创建一个现有列表的副本。
a_list = [15.1, 'x', 14, '7']
b_list = a_list.copy()# If we make any change in a_list, it won't reflect on the b_lista_list.append('pandas')
display(a_list, b_list)>>> output:
[15.1, 'x', 14, '7', 'pandas']
[15.1, 'x', 14, '7']
也可以通过选择列表的所有索引来复制列表。
a_list = [15.1, 'x', 14, '7']
b_list = a_list[:]# Again, if we make any change in a_list, it won't reflect on the b_lista_list.extend(["pandas", "sklearn"])
display(a_list, b_list)>>> output:
[15.1, 'x', 14, '7', 'pandas', 'sklearn']
[15.1, 'x', 14, '7']
数数
.count()方法将返回有多少匹配元素。
a_list = [15.1, 'x', 14, 'x']
a_list.count('x')>>> output:
2
索引
.index()方法将返回期望值的第一个(在重复的情况下)索引位置。
a_list = [15.1, 'x', 14, 'x']
a_list.index('x')>>> output:
1
低输入联网(low-entry networking 的缩写)
内置的len()函数返回列表中元素的数量。
a_list = [15.1, 'x', 14, '7']
len(a_list)>>> output:
4
反向()
.reverse()方法将颠倒列表中项目的顺序(操作就地发生,所以不返回任何内容)。
python_list.reverse()print(python_list)>>> output:
['g', 'n', 'i', 't', 's', 'i', 'l']
通过拆分字符串创建列表
string_text = "we all love python"list_from_string = string_text.split(' ')
print(list_from_string)>>> output:
['we', 'all', 'love', 'python']
从字符串的字符创建列表
python_list = list("listing")print(python_list)>>> output:
['l', 'i', 's', 't', 'i', 'n', 'g']
查看您可能也想阅读的其他文章:
</15-business-questions-about-mobile-marketing-campaigns-roas-return-on-ad-spend-ff636a8095b6>
结论
既然我们已经掌握了列表操作的基本知识,那么就很容易意识到在 Python 中使用这种类型的数据结构来执行一些基本且极其有用的任务是多么简单和强大。
我们现在对它的一些基本特征有了一个坚实而深刻的理解:
- 列表可能包含不同数据类型的元素
- 列表项遵循一个特定的顺序
- 它的值可以通过索引和切片访问
- 可以添加、删除和转换项目,这使得它们是可变的和动态的。
感谢您的阅读。欢迎您在下面发表评论,如果您有任何反馈,请告诉我。
Apriori 算法
利用 Python 中著名的 Apriori 算法进行购物篮分析的频繁项集挖掘

在本文中,您将了解 Apriori 算法的所有知识。 Apriori 算法可以认为是购物篮分析中的基础算法。购物篮分析是研究顾客购物时的购物篮。
目标是找到经常一起购买的产品组合,我们称之为频繁项目集。该领域的技术术语是频繁项目集挖掘。
当我们使用频繁项目集和 Apriori 算法时,购物篮分析不是唯一的分析类型。理论上,它可以用于任何想要研究频繁项集的主题。
Apriori 算法是如何工作的?
虽然我想让这篇文章更具应用性,而不是技术性,但是理解 Apriori 算法的基础是很重要的。
这里需要注意的是,有多种因素需要考虑:
- 如何在数据集中找到频繁项集?
- 如何高效的在数据集中找到频繁项集?
如何为 Apriori 算法组织数据?
让我们从头开始:您有一个客户正在购买多种产品的数据集。你的目标是找出哪些产品组合经常一起购买。
你需要以这样一种方式组织数据,即每一行都有一组产品。每套都包含在同一笔交易中购买的产品。
最基本的解决方案是遍历所有的事务,并在事务内部遍历所有的产品组合,并对它们进行计数。不幸的是,这将花费太多的时间,所以我们需要更好的东西。
两位科学家 Agrawal 和 Srikant 在他们 1994 年的论文《挖掘关联规则的快速算法》中首次提出了解决方案。他们的第一个解决方案是著名的 Apriori 算法。
Apriori 算法的一个示例问题
让我们介绍一些示例数据,并尝试一步一步地完成算法。该数据是一个假设的数据集,来自一家夜店,顾客主要购买葡萄酒和奶酪或啤酒和薯片。有些人也去那里,当他们想烤一个蛋糕,但他们没有鸡蛋,面粉或黄油。
数据看起来像这样:

Apriori 算法。交易记录列表。
Apriori 算法的步骤
让我们回顾一下 Apriori 算法的步骤。当然,不要犹豫,看看 Agrawal 和 Srikant 的论文,了解更多的细节和细节。
第一步。计算每个单独项目的支持度
该算法基于支持的概念。支持简单来说就是特定产品(或产品组合)发生的交易数量。
该算法的第一步是计算每个单独项目的支持度。这基本上可以归结为计算每种产品发生了多少次交易。

Apriori 算法。计算每个产品的出现次数。
第二步。决定支持阈值
现在我们已经获得了对每个产品的支持,我们将使用它来过滤掉一些不常用的产品。为此,我们需要确定一个支持阈值。对于我们当前的例子,让我们使用 7 作为最小值。
第三步。选择常用项目
很容易看出,有两个产品的支持度小于 7(意味着它们的出现次数少于 7)。那些产品是面粉和黄油。
因此,对于面粉和黄油来说,不幸的是,它们将不会被进一步考虑。
第四步。寻找频繁项集的支持度
下一步是做同样的分析,但是现在使用成对的产品而不是单个的产品。可以想象,这里组合的数量可以很快变大,尤其是如果你有大量的产品。
Apriori 算法背后的伟大“发明”是,我们将直接忽略包含任何非频繁项目的所有对。由于这一点,我们有少得多的项目对扫描。
这里列出了所有含有黄油、面粉或者两者都含有的食物。所有这些都可以丢弃,这将加快我们计数的执行速度。

Apriori 算法。根据上一步排除的项目集。
当然,本例中仍有一些组合需要计算在内:

Apriori 算法。每个项目集的出现次数。
正如你所看到的,在这一点上,只剩下两个产品组合在支持之上:葡萄酒和奶酪,以及啤酒和薯片。
第五步。对更大的组重复此步骤
我们现在将对包含三种产品的器械包重复同样的操作。和以前一样,我们不会对上一步中被淘汰的器械组进行评分。
其余的对是:
- 葡萄酒,奶酪
- 啤酒,薯片
那么,我们可以创建什么样的三元组,使其不包含任何被消除的配对呢?
- 葡萄酒、奶酪、啤酒->因为存在非频繁配对而被剔除(例如奶酪、啤酒)
- 葡萄酒、奶酪、薯片->因为出现不常见的一对而被剔除(例如奶酪、薯片)
- 啤酒、薯片、葡萄酒->因为出现非频繁配对而被淘汰(例如葡萄酒、薯片)
- 奶酪、啤酒、薯片->因为存在非频繁配对而被剔除(例如奶酪、啤酒)
没有不包含任何非频繁对的三元组。这意味着频繁集已被确定,它们是成对的葡萄酒、奶酪和啤酒、薯片。
第六步。生成关联规则并计算置信度
既然已经有了最大频繁项集,下一步就是将它们转换成关联规则。关联规则比仅仅列出频繁出现的产品更进了一步。
关联规则以如下格式编写:产品 X = >产品 y。这意味着您获得一条规则,告诉您如果您购买产品 X,您也可能购买产品 y。
还有一个额外的衡量标准叫做信心。置信度告诉您该规则有效的情况的百分比。100%的置信度意味着这种关联总是发生;例如,50%意味着该规则只适用于 50%的时间。
第七步。计算升力
一旦你得到了规则,最后一步是计算每个规则的提升。根据定义,规则的提升是一个性能度量,它指示规则中产品之间的关联强度。
规则提升的公式如下所示:

Apriori 算法。电梯公式。
这意味着 lift 基本上将关联规则的改进与整个数据集进行比较。如果在 10%的情况下“任何产品=> X ”,而在 75%的情况下“A => X ”,改进将是 75% / 10% = 7.5。
如果一个规则的提升是 1,那么乘积是相互独立的。任何提升为 1 的规则都可以被丢弃。
如果规则的提升大于 1,提升值会告诉您右侧乘积对左侧的依赖程度。
先验准确性:如何平衡规则的支持度、可信度和提升度?
这基本上给了我们三个指标来解释:
- 支持(产品同时出现的次数或百分比)
- 置信度(规则出现的次数,也是给定左侧的右侧的条件概率)
- 提升(联合的力量)
这三个指标都有各自的有效性。因此,很难在它们之间做出选择。例如,如果你有一个规则,它比另一个规则有更高的提升,但更低的可信度,就很难说一个规则比另一个规则更好。在这一点上,您可能只是想保留这两个规则,或者在您的特定用例中寻找一个理由来选择一个指标。
Python 中的 Apriori 算法
由于购物篮分析任务是一个非常容易理解的主题,现在让我们继续看 Python 中的 Apriori 算法的例子。
有效先验包
在 Python 中有多种实现先验的可能性。对于本教程,我们将使用高效的 apriori 包。正如他们的 GitHub 上所说,他们维护这个包,他们的项目被可靠的来源使用和引用。如果你想了解更多关于这个包的信息,你可以在这里查看它的 GitHub。
另一个好的实现可以在这里的 mlxtend 包中找到。我选择使用高效的 apriori 包,因为它允许在一个函数中执行 Apriori 算法和生成规则,而 mlxtend 要求您分两步完成。
您可以使用pip install efficient-apriori安装 efficient-apriori 包。
为高效的 apriori 算法准备数据
您不能在高效的 apriori 算法中使用数据帧。你需要使用一个事务列表。在这个列表中,每个交易被表示为该交易中产品的元组。
让我们输入上一个例子中的数据作为一个事务列表。您可以列出如下清单:
Apriori 算法。输入数据。
设置算法的参数并运行算法
下一步,我们将对这些数据应用 apriori 算法。您可能需要控制两个设置:
- min_support :这是上面算法部分解释的支持阈值。一个小的区别是,它在这里表示为百分比,而不是数字。
- min_confidence :这只是一个过滤器,过滤掉不符合最小置信度的规则。如果您想查看所有生成的规则,可以将它设置为零。
您可以使用以下代码运行 apriori 算法:
Apriori 算法。使用高效的 apriori 算法计算关联规则。
该算法的输出是已经生成的项目集和规则。让我们在下面几节中检查它们。
检查频繁项目集
让我们从检查项目集开始。您可以使用以下代码简单地打印:
Apriori 算法。显示频繁项目集。
您将获得如下所示的字典:

Apriori 算法。频繁项目集。
让我把它写出来,使它更易读:
在第一遍中,(key = 1)您获得了单个产品及其出现次数:
- 啤酒:11 英镑
- 葡萄酒:8 英镑
- 奶酪:8
- 薯片:9
- 鸡蛋:7 个
在第二遍(如算法部分所示),您有至少获得 7 分的最低支持的单个产品对。您也有它们出现的次数:
- (奶酪、葡萄酒):7
- (啤酒、薯片):9
该数据非常详细,但很高兴看到它证实了我们之前手工制作的示例的结果。
检查规则及其度量标准
现在让我们检查一下规则,以及它们的度量标准。您可以使用以下代码将它们打印出来:
Apriori 算法。打印规则。
您将获得以下结果:

Apriori 算法。关联规则。
为了便于阅读:
- 规则薯片= >啤酒有信心 1 和升力 1.818
- 规则啤酒= >薯片的置信值为 0.818 而提升值为 1.818
- 规则 Wine = > Cheese 的置信度为 0.875 而提升为 2.188
- 规则奶酪= >葡萄酒的置信度为 0.875 和升力为 2.188
作为这个数据的结论,我们可以说葡萄酒= >奶酪和奶酪= >葡萄酒这个规则的升力非常高。这家夜店的老板可能是想把奶酪和酒放在一起靠近。薯片= >啤酒和啤酒= >薯片的关联稍弱一些,但也足够高,可以把啤酒和薯片放在商店的同一个地方。
结论:Apriori 算法
总之,您已经发现了频繁项集挖掘中的一个基础算法,称为 Apriori 算法。您还看到了如何使用 Python 包将 Apriori 算法应用于购物篮分析。
在频繁项集挖掘领域还有很多东西有待发现,但我将把它留给下一篇文章。现在,我希望这篇文章对你有用,不要犹豫,继续关注更多的数学、统计和数据内容!
欧洲 Gaia-X 的架构
技术概述

埃里克·韦伯在 unsplash 上拍摄的照片。
尽管还不清楚 Gaia-X 会是一个主要的失望还是一个新的欧洲突破,让我对已经出来的架构和规范做一个彻底的分析。
因为规范中确实包含了很多有趣而新颖的概念值得分析。
那么 Gaia-X 到底是什么?
一些人将 Gaia-X 称为下一个欧洲云,它尊重用户及其数据的隐私。但它应该比这多得多。
Gaia-X 没有构建另一个云,而是设想了一个可以连接多个异构云系统和所有不同类型的数据生态系统的网络基础设施,同时遵守欧盟的政府要求和法律。
总之,新兴基础设施是一个网络系统,连接了许多云服务提供商和来自学术界和非政府组织的私营公司的数据源,同时确保了开放、透明和信任。
架构

摘自 Gaia-X 的架构白皮书
看一下上面的高层架构,就可以看出这个系统实际上有多复杂。
构建 Gaia-X 基础的核心组件被定义在图像的中心,称为联合服务。
围绕这一点,有更多的术语和技术,如法律基础,由政策规则文档提供支持;和数据空间,它们通过智能服务连接在一起,共同构建了一个数据生态系统。
此外,在图像的底部定义了几个角色,它们被分类为参与者、资产和治理。
实施标准
Gaia-X 应该是开源的,在 Apache 许可证(2.0 版)下获得许可。它将在 GitHub repository 中维护,主要用 Python 和 Java 编写。再者,rust,C++,go,NodeJS 都可以根据需要使用。由于该架构将被封装到微服务中,docker 或 podman 等容器解决方案将与 Kubernetes 一起用于编排。
核心部件有哪些?
整个 Gaia-X 基础设施由一些重型组件支持,这些组件是整个生态系统功能性和可扩展性的基本构建模块。
政策、资产和资源
政策正在构建 Gaia-X 的法律基础。它们在政策规则文档中进行了描述和定义,这是一个公开可用的文档,定义了 Gaia-X 的一组规则。它由 Gaia-X AISBL 的政策规则委员会创建,可能会有社区的协作和反馈。
资产和资源描述了 Gaia-X 生态系统的对象和商品,它们共同组成了一个服务产品。
资产可以是数据资产、软件资产、节点或互连资产。每项资产都有一套政策。资产不公开端点,端点是其他服务和功能的接口。
另一方面,资源确实公开了一个端点。他们也受到某些政策的约束。资源和资产的区别可以描述如下:资源代表供应资产所必需的那些要素。它们可以解释为不可订购的内部服务实例。例如,提供数据集的运行实例是一种资源。
参与者及其角色
Gaia-X 生态系统中的参与者可以属于的三个角色被称为提供者、消费者和联合者。
虽然消费者是可以搜索服务提供和消费服务实例以便为最终用户实现数字提供的参与者,但是提供商是提供服务实例的参与者。
服务实例包括自描述和技术策略,使用不同的资源,拥有不同的资产。
联邦者是一个相当特殊的角色,负责彼此自治的联邦服务和联邦。联合是指直接或间接消费、生产或提供资产和相关资源的一组松散的相互作用的参与者。
联邦服务
联邦服务是 Gaia-X 的核心服务,应该能够使整个系统完美地运行。它们被设计为微服务,共同提供运行整个基础设施所需的核心功能,并进一步公开可用的代码结构,以将服务和产品集成到系统中。
联合服务由四组服务组成,它们是实现资产、资源、参与者和生态系统间交互的联合所必需的。这四个服务组是身份和信任、联合目录、主权数据交换和合规性。总之,基础设施将通过所谓的门户向公众公开。

联邦服务工作包。摘自软件需求说明书。
让我们仔细看看下面的每个工作包。
身份和信任
该服务组涵盖认证和授权、凭证管理、分散式身份管理以及模拟凭证验证。
这些服务能够对相关参与者进行验证,为参与者提供唯一的标识符,这是访问生态系统所必需的。
此外,还应涵盖参与者的整个生命周期过程,从入职维护到离职。
联邦目录
联合目录是自我描述的中央存储库,支持发现和选择提供商及其服务产品。自我描述是参与者和资产的属性和声明的表达,是在 Gaia-X 生态系统中实现透明和信任的关键要素。自我描述使用 JSON-LD 格式表示。
总之,联合目录是参与者可以用来搜索、消费和提供服务的目录。
主权数据交换
该服务组通过提供数据协议服务和数据记录服务来确保遵守政策,从而实现参与者的独立数据交换。进一步的使用约束可以由提供者策略作为自描述的一部分来表达。
符合性
合规服务小组提供了一些机制,以确保参与者在入职和服务交付期间遵守安全性、隐私透明性和互操作性等方面的政策规则。它的基础是策略规则文档。
原则上,有两个组成部分:第一,入职和注册工作流程(OAW ),确保所有参与者、资产、资源和服务产品在加入目录之前都经过验证流程。第二,持续自动监控(CAM ),它能够根据自我描述监控法规遵从性。这是通过自动与被测服务交互,使用标准化的协议和接口来检索技术证据来实现的。
门户和集成
Gaia-X 门户是 Gaia-X 的入口点,支持参与者的加入和认证,并提供服务发现、编排和样本服务供应的界面。
这是一个网络界面/仪表盘,可进一步提供对联合目录的访问。
所有这些服务组被分为 17 个批次,由 EU-广泛招标的选定申请人开发。
数据生态系统和数据空间

我想介绍的最后一个基本概念是数据空间和数据生态系统。
数据生态系统是基础架构、分析和应用程序的集合,随着时间的推移而不断发展。在这些生态系统中,可能存在数据空间。
数据空间是由国际数据空间协会(IDSA)进一步发展的概念。
该协会由弗劳恩霍夫协会的成员成立,目前他们已经编写了第一份白皮书,通过创建安全可信的数据基础设施,定义了交换和存储数据的标准化方法。
IDSA 提供了一个参考架构、一个正式的标准和参考实现,包括示例代码,可以被公司请求和修改,以构建他们自己的市场就绪解决方案。
在 Gaia-X 中,可以有多个包含许多不同数据空间的数据生态系统。这种数据生态系统相互封装,但是如果生态系统的联合者同意的话,可以通过使用联合服务来互连。该功能使公司能够交换相似或互利的数据,以便开发新产品或改进现有产品。

盖亚-X 的联邦生态系统思想
所有这些服务,可能还有更多,共同构成了 Gaia-X 的基础。
未来展望
对于未来的版本,计划将开发开源模板代码,然后可用于参与 Gaia-X。更具体地说,这种锅炉代码可根据特定业务的需求进行扩展和调整,以快速启动和运行 Gaia-X 服务。然后,联合服务将构建基础,并链接数据空间和其他数据驱动的资源,这些资源可以相互通信,同时遵守参与者同意的策略规则和合规性。
此外,门户还为参与者提供了一个目录,供他们提供自己的服务、使用服务或消费和提供数据。由于创建一个坚实的法律基础并监控其合规性是一项艰巨的任务,因此由一组政府机构而不是单一的技术公司来创建更容易——这使得 Gaia-X 成为一个充满希望的想法,有望满足人们的期望。
建筑人工智能的艺术和科学
对于世界上的人工智能爱好者来说,是什么让一个人工智能模型变得伟大,这总是一个奇迹。需要科学头脑还是艺术头脑?

图片来自www.vpnsrus.com
在过去的几年里,伟大的科学家们研究了人类的认知能力,以了解人类如何存储、处理和获取信息。知识是如何组织的?我们如何不断地从经验中学习,并根据需要应用?这使得人们对人类的学习有了更深的理解,并有可能回答智力到底意味着什么这一最神秘的问题。人们已经做出了巨大的努力,将其模型化为机器,为人工智能革命铺平道路。
要教会机器感同身受、富有创造力和真正的智能,还有很长的路要走。但是创造力很难解释。源于头脑的想法是从随着时间的推移而获得的知识的种子中散发出来的,但我们无法解释它是如何表现出来的。知识越多,思考问题的能力就越强,但我们无法解释因果推论。我们无法解释我们是如何理解一种语言或立即识别面孔的,尽管我们非常擅长这样做。为了教会机器像人类一样有创造力,需要人类长时间获得大量的训练数据。在讲故事、背诵诗歌、创造视觉艺术、理解情感的类人对话、创造音乐甚至幽默等领域的想法。问题来了,是需要科学头脑还是艺术头脑来构建一个伟大的具有创造性、直觉性和智能的人工智能系统?
人工智能背后的科学
开发一个人工智能模型需要高质量的数据和一个迭代过程,通过理解封装在数学模型中的输入和输出变量之间的复杂关系来从中获得洞察力。这需要不断的监控和评估,以提出一个良好的人工智能模型,该模型可以很好地概括现有的输入数据,从而给出与未知输入数据相对应的有意义的预测。人工智能算法为机器提供了一种自主学习和从数据中获取洞察力的方式。在寻求确认的过程中有一个反馈循环,就像人类学习一样。一些更先进的人工智能技术基于人脑如何通过数百万神经元处理信息来模拟机器。这门科学是深度学习方法的基础,由于非常令人满意的结果,这种方法在人工智能社区中非常受欢迎。
在研究论文中有许多开发人工智能的科学基础,但它本质上主要是实验性的,尚未正式化。通常会有一个严格的工程流程来组合各种模型,并使它们在规模上发挥作用,从而使预测更准确、更可解释、更可接受。需要多个操作程序在更少的资源上训练模型并足够快地验证以减少生产时间。
这使得一个科学的概念应用在数据上,使之成为一项解决特定业务问题的技术。但除此之外还有其他原因吗?
开发人工智能的艺术
数据科学不仅仅是数学和算法。数据只提供作为事实的信息。机器使用算法来获得这些见解,并不断搅拌输入数据,直到产生正确或可接受的输出。但是,通常需要人类专家的判断来确保机器获得“正确的数据”,并学习我们希望它们学习的东西。它还需要更深入地了解人类如何解决具体问题。这种视角对于为人工智能模型的输出提供一定量的直观感觉是至关重要的,而这种直观感觉不是由数据或所使用的算法固有地提供的。通常情况下,人类会看到人工智能的输出,然后匆忙做出判断。人工智能的输出不仅需要数学上正确,还需要“人类上正确”。简单来说,输出往往被期望是智能的、直观的、符合人类期望的。这使得有必要让领域 SME 参与到这个过程中。
例如,在人脸识别系统中,需要更深入地了解人类如何通过面部识别其他人。考虑到面部结构随着时间的推移会发生变化,我们需要多次看一张脸才能很好地记住它吗?或者,我们是否需要长时间频繁地看脸,才能理解面部特征,从而能够在一定距离外认出某人?我们是否建立了一个系统,在对人脸进行分类之前,从多个角度观察人脸?所有这些方面都很重要,并且与必须解决的业务问题直接相关。或者,一个系统在识别人脸时需要高度自信,因为这是一项关键的业务需求。在构建这样一个系统时,需要考虑所有这些因素。
类似地,在开发聊天机器人时,开发意图分类器来理解或分类用户的请求是一回事,但理解和服务于实际需求是完全不同的另一回事。让聊天机器人变得直观并做出正确的假设是至关重要的,就像人类在回答查询时会做的那样。这需要对人类的心理和行为有很好的理解,比如我们如何交流,而不仅仅是插入一个巨大的人工智能模型,这个模型经过数学训练,可以理解一种语言。如果聊天机器人的反应更像人类而不是机器,它会被自动认为是伟大的。

作者图片
把所有的放在一起
构建伟大的人工智能不仅仅是正确选择算法或技术,还需要更好地理解人类如何解决这个问题。它需要两个世界的精华,一个科学的头脑和一个艺术的头脑,以诱导人工智能模型中正确的智能和直觉水平,使其能够很好地预测。这就是为什么数学家和科学家与语言、行为心理学和文科领域的专家合作,以创造复杂、智能和直观的机器。
正是人类的专家判断为人工智能模型埋下了伟大的种子。一个好的人工智能模型可能会使用正确的算法、正确的技术和正确的数据,但它之所以伟大,是因为它吸收了智能、移情和直觉。顾名思义,除了科学、数学和工程学之外,还需要一些东西。建造一个伟大的 艺术 智能系统是一门 艺术 。这就是它如此吸引人的原因。我们可以称之为机器智能,但其中也有人类智能的成分。因此,需要一个探险家、观察家、分析师、科学家、数学家,但更重要的是一个思想家来构建伟大的人工智能。
代码审查的艺术
编程;编排
为什么代码审查是必不可少的?最佳实践是什么?

什么是代码审查?
我们都写代码,我们喜欢将我们的代码提交给主代码池。这是一个激动人心的时刻,我们迫不及待地想在主回购中看到我们的最新杰作。让我们提交并合并。等等…我需要请人来审核我的代码吗?
在很多公司,尤其是小公司,并不是必须的流程。但是拥有数百名开发人员和数百万用户的大公司不能犯一个简单且可避免的错误。代码审查在开发人员中是一种很好的(有时被遗忘的)实践。
许多团队和组织跳过代码审查的一个常见借口是“我们快速而敏捷”虽然看起来代码审查在开始时使过程变得更慢,但提交有 bug 和有缺陷的逻辑的代码会使合并后的过程效率更低。此外,有时一个小小的错误(尤其是在安全方面)会让公司付出巨大的代价。永远记住速度和质量之间有一个权衡。不管是哪种情况,忽视代码质量或速度都会导致低效的过程。有效的代码评审可以平衡开发的速度和质量。
这篇文章是为作为代码评审者的你而写的。如果有人善意地请你做代码审查,这篇文章中有一些提示可以帮助你更有效地做这件事。
为什么代码审查至关重要?
- 再次关注你的代码 :在数小时的编码、运行、调试和重新运行之后,捕捉一些意想不到的错误和边缘情况对代码作者来说可能非常困难。仅仅因为作者关注了主要案例而错过一些边缘案例是很常见的。即使有最好的测试计划,作者仍然可能遗漏一些通常不会发生的错误。现在是代码作者需要对他们的代码进行第二次检查的时候了。
- 交流最佳实践 :代码评审定期提醒每个人(包括作者和评审者)最佳实践。如果你是一个人,你可能会忘记(甚至没有意识到)你所在领域的最佳实践的某些方面。由不同的评审人员定期进行的代码评审过程就像是定期提醒每个人遵循最佳实践。例如,作为一个单独的程序员,你可能有时会忽略一个合理的测试计划,但是一个好的评审员会要求你做一些测试计划。
- 边复习边学 :记住,代码复习不是监督任务。有时候,与作者相比,评审者在代码评审过程中学到了更多。有时候,代码审查过程对审查者来说是一个学习的机会,尤其是如果作者是一个有经验的开发人员。
- 更多地参与相关项目 :让每个团队成员同步一个产品的最新特性或者组织中一个项目的每个方面,这是一个挑战。代码审查,尤其是当它发生在不同团队的成员之间时,使审查者熟悉产品或项目的最新更新和特性。没有代码审查过程的团队和组织通常在产品中添加了许多变更之后,在同步时会遇到更多的挑战。
- 跨开发人员强制执行编码标准:并非所有开发人员都处于同一水平。但是作为一个团队工作,我们必须为我们的共享代码保持一个基本的标准水平。代码的最低标准使得有经验和没有经验的开发人员在同一个项目中工作更加容易。执行最低代码标准的最佳方法是在合并到主 repo 之前对每一个代码进行代码审查。

对于代码审查人员来说,最佳实践是什么?
既然你已经确信代码评审对于团队工作是必要的,我想分享一些技巧让你成为更好更专业的代码评审者。
- 尊重和友好:这是迄今为止最重要的提示。请记住,代码审查背后的原因不是羞辱他人或展示您的编码技能。代码审查背后的主要原因是能够作为一个团队开发代码和产品。如同任何团队合作一样,尊重是成功的首要法则。尽量做出简洁明了但尊重他人的评论。此外,请记住,不要仅仅出于友好或尊重而做出不明确的评论。清晰、简洁和尊重并不矛盾。
- 虚心接受不同的方法 :每个人都有一种编码和思维方式。不同的人可以编写完全不同的代码来完成相同的任务。只要代码符合标准(就性能和风格而言)并且有意义,您就必须对这种方法持开放态度。我们都知道您可能有不同的编码风格或方法,但是评审者并不在作者的位置上。试着对其他方法持开放态度,并通过他们的方法帮助作者理解可能的缺陷。
- 提问,其实问题太多 :不要羞于提问。不了解准则,甚至不知道它的基本目标是完全正常的。这可能是因为您不熟悉那个项目,或者作者没有很好地传达代码的目标。此外,有时作者过于关注问题,以至于问题的某些方面对他们来说变得显而易见,而他们忘记了向其他人解释这些方面。通过向他们提问,向他们展示他们工作中的哪些部分不清楚,这是很好的做法。
- 【先问主要问题,后问次要问题】 :建议第一轮评审重点关注主要问题和代码的整体方法。很多小问题会在大问题修改过程中自动删除或更改。当你对整体方法感到满意时(不过,记住第二点),是时候评论一些小问题了。
- 参考样式文档或制作一个 :参考组织中已有的样式文档,可以更好地说明为什么要制作一些代码样式注释。如果您没有这样的文档,请创建一个。通过这种方法,作者对标准样式有了更好的了解,并可以在将来的合作中学习它。
- 明确是否重要 :如果你的评论只是一个建议或者不是重要的评论,用“n it”或者“只是一个建议”之类的话明确提及这样,你就向作者清楚地表明,应用这些更改是由他们决定的。当过程需要快速进行时,它也帮助作者在速度和质量之间取得平衡。
- 留下一些好的评论 :有时候,即使是来自评审者的最尊重的评论,作者在付出太多努力后,读了几十条对他们代码的评论也会感觉不好。有时候,评审者留下好的评论来欣赏他们认为写得好的代码片段是一个好主意。它可以像“这个部分的聪明想法”或“这个问题的好方法”一样简短毕竟,对于作者来说,你欣赏他们的辛勤工作并注意到他们的一些努力是一种很好的感觉。
摘要
请记住,在您的代码审查中始终保持尊重和友好。提问,明确评论,总要留下好的评论。
用数据连接点的艺术
我们每周精选的必读编辑精选和原创特写
“意外之喜”是一个描述小快乐的大词:当美好的事情就这样发生时的感觉,好像是偶然的。一些我们最喜欢的博客帖子给我们留下了类似的快乐感,意想不到的发现,尽管作家需要很高的技巧(和大量的工作)来建立联系,并以一种感觉毫不费力的方式让事情点击。
举个例子,Ofir Magdaci 漫不经心的观察到如果足球是一种语言,它将是世界上使用最广泛的语言。这让他开始了一个令人着迷的项目:试图将他的 NLP 专业知识和“美丽游戏”的语言结合起来,为体育分析领域未来的机器学习解决方案奠定基础。迈克尔·布朗斯坦(和合著者)意识到在将图形神经网络(GNNs)作为偏微分方程(PDEs) 来处理有很大的潜力,为“研究许多流行的图形深度学习架构以及开发新架构的蓝图”开辟了空间

约翰·巴克利普在 Unsplash 上的照片
更多的意外收获?我们中的大多数人,当我们试图插入 USB 连接器时,只是不停地翻转它,直到它卡入到位。另一方面,艾伦·唐尼对很少有人第一次就做对的事实感到震惊。这让他思考并写下了这个令人惊讶的联系(没有双关语的意思!也许吧?)在这种日常挫折与……贝叶斯决策分析之间。
我们一些最平凡的日常工作流程会突然变成顿悟和灵感的跳板。数据清理有时可能会感觉重复和单调,但对艾米丽·伯恩斯来说,这是一个系统思考所谓“坏数据”的起点,而 T2 创建了一个四步法来识别和纠正管道源头的错误。A/B 测试是许多数据科学家的饭碗;通过他在 Wix 的工作,“大规模”运行它们之后,伊塔马尔·法兰成为贝叶斯 A/B 测试价值的信徒,并且他慷慨地分享了支持它们的统计模型的概述。
寻找更多的点来连接?本周剩下的选择范围很广,但每一个都提供了一个可供探索的想法小宇宙:
- 在 Parul Pandey 对图书馆创建者最近发布的课程的评论中,为那些在 NLP 工作的人发现拥抱脸生态系统及其许多用途。
- 我们已经深入到了骄傲月,但是用一组关于数据科学、偏见和 LGBTQIA+社区的交集的帖子来纪念这个时刻永远不会太晚(作者有 Rhea Moutafis 和 Heather Krause ),由本·胡伯尔曼选出。
- 了解企业机器学习的来龙去脉在 Ketan Doshi 的温柔指导下,他的新系列从建立和训练模型的关键步骤开始。
- 如果你是函数数据领域的新手,一个非常好的起点是 Johannes Wohlenberg 的实践教程,该教程侧重于函数主成分分析 (FPCA)。
- 最后,最近出现了一系列关于人工智能的不祥预测——该领域的进步可能最终加速人类的灭亡。在 TDS 播客上, Jeremie Harris 与艾伦人工智能研究所首席执行官柳文欢·埃齐奥尼聊天,他更看好我们智胜未来霸主的机会。
为又一周的学习、发现和社区机会干杯——感谢你的陪伴和对我们工作的支持。
直到下一个变量,
TDS 编辑器
我们策划主题的最新内容:
入门指南
实践教程
- 匹配和倾向评分匹配终极指南作者叶雷华博士研究员
- 数据先于模型,但问题先公式化由布莱恩·肯特
- pytorch-widedeep,针对表格数据的深度学习 IV:深度学习 vs. LightGBM 作者 Javier Rodriguez Zaurin
深潜
思想和理论
- 过多的伯特会对你有害吗?作者费德里科·比安奇
- 拓扑变化点检测由蒂姆·约瑟兰
- 露西打招呼——2031 年,AGI,人工智能的未来作者哈维尔·伊达米
丢弃数据的艺术

在 Unsplash 上由Kinga koodziejska拍摄的照片
数据工程,数据库
做更好的数据工程的核心思想
工程解决方案不仅仅是建造一些东西。而是想出一种方法,用最少的资源解决手头的问题。优化问题是所有计算的中心,本质上也是所有人类努力的中心。它处理的问题包括——如何让飞机飞得更快(并且使用更少的燃料),如何编写可以重复使用的代码,如何让股票市场数据在各大洲的着陆速度加快几毫秒,等等。这些问题的答案并不总是立竿见影。这些答案是在迭代中找到的。每一次迭代都是优化的一次实践(尽管有些迭代只是营销噱头),不仅仅是资源的优化,也是设计和美学的优化。
在他的一次演讲中,一位理论物理学家说,用非常简单的方式将复杂的系统形象化会更容易理解。例如,对于一个研究方程的物理学家来说,一头奶牛可能是一个圆,其质心位于圆心。有时候从远处看问题很重要,这样才能更好地理解需要做些什么来摆脱它们。将所有这些应用到我工作中最突出的领域,我意识到(或重新意识到)API、分析、仪表板、报表等查询优化的第一步。,就是丢弃不需要的数据。这看起来很简单,不是吗?
要优化的资源
在查看丢弃数据的不同方法之前,让我们先来看看为什么需要这样做。众所周知,数据处理和移动通常会遇到以下瓶颈之一:
计算
简而言之,计算就是您的 CPU(或 vCPUs),本质上就是处理能力。要计算大量数据,您需要在一台服务器上安装更强大的处理器(纵向扩展),或者安装更多具有类似处理器的服务器(横向扩展)。
计算通常是一个瓶颈,因为它与内存和存储等其他昂贵的资源紧密相关。也有少数例外,比如雪花。我们稍后会谈到这一点。虽然摩尔定律正在发挥它的魔力,但处理能力仍然是昂贵的。随着时间的推移,随着数据变得越来越大、越来越多样化,成本将继续成为一个主要因素。
记忆
与计算一样,内存也是一种昂贵资源。芯片离 CPU 越近(基于时间越近),成本就越高。在一篇关于查询优化技术的文章中,我写了一篇关于往返磁盘比往返内存(RAM)多花费大约 10000 倍时间的文章。最好只在内存中保存 CPU 立即需要处理的数据。
当您听到使用术语内存时,请理解存储和处理都发生在 RAM 中,即整个数据库位于 RAM 中。像 Spark 这样的数据处理引擎处理内存中的大部分数据,从而获得很高的处理速度。
储存;储备
对于内存和存储来说,有两个因素控制着成本和性能,即容量和 I/O。商用硬件的容量通常是以 GB 内存和 TB 磁盘空间为单位。I/O 也称为 IOPS(每秒输入输出操作数),决定这些设备的访问和处理带宽。
存储就像 CPU 和内存一样,有多种 IOPS。AWS 提供 IO2 块存储,每卷吞吐量为 4000 MB/s,每卷 256000 IOPS。的速度
网络
应用程序和数据库的不同组件之间的通信依赖于网络,而网络依赖于网络布线、交换机、路由器、集线器、互联网网关、网络带宽等。高速连接对于发挥数据库的最佳性能至关重要,尤其是在多节点(集群)设置中,节点之间有大量的数据传输和通信。
除了知道不同数据库组件之间的每次旅行需要多少时间(以 ns 或 ms 为单位)之外,每个人都应该知道一些通用的数据工程数字。我在下面的文章中写到了这一点。
丢弃数据的技术
大多数数据库使用内存来存储最近或最频繁使用的行或列。对于 MySQL 和 PostgreSQL,内存中的这个专用空间称为缓冲池。一旦数据处于暂时不使用的状态,一些其他数据就会使用 LRU(最近最少使用)缓存失效算法来替换它。这个获取缓存中数据的过程称为预热缓存。这适用于我们将在本节中讨论的所有三种架构技术。
索引
表上的索引本质上是原始表的副本(以及对原始表的引用)。在基于行的数据库中的某一列上创建索引,使您有机会以时间复杂度**O(log n)**搜索该列,其中 n 是表中记录的数量。添加索引的成本会很高,因为索引会占用相当多的空间。我写过关于索引的最佳实践,尤其是当你不得不索引巨大的表的时候。
https://medium.com/analytics-vidhya/indexing-best-practices-10025d779e0b
创建、维护和使用索引有时很有挑战性。为了最大限度地利用索引,您需要确保为正确的列集创建正确类型的索引,这对加快缓慢的查询非常有帮助。注意在用于写数据的主数据库实例上创建太多索引的后果。过多的索引会对写入负载产生负面影响。要了解更多关于索引的信息,请访问使用索引卢克!
分割
分区采用了不同于索引的方法。分区是在已分区的列上拆分的表的一部分,而不是在列上创建一个大的 B 树索引。
您可以将分区与索引结合使用,在这种情况下,您可以使用分区修剪来找到查询所需的分区,然后使用其余的**WHERE**子句条件,通过在该分区上创建的索引来搜索该分区。
在大多数数据库中,分区显示在磁盘上的不同文件中。因此,丢弃无用的分区并创建新的分区是非常容易的。对一个分区的更新不会影响其他分区上的读取查询。
分片
就像分区发生在数据文件(表、物化视图)级别一样,分片发生在实例级别。当您想要将数据分割到不同的机器上时,您可以使用分片。
这不仅可以帮助您丢弃数据,还可以通过实现关注点分离来帮助您实现隔离。例如,如果您有许多客户,您可以将一些优先客户的数据保存在一组分片上,而将其余的保存在另一组分片上。
丢弃 SQL 中的数据
您使用 SQL 编写**SELECT**语句从数据库中获取数据。如果你仔细观察,SQL 语言的每一个子句——**ORDER BY/LIMIT**、**GROUP** **BY/HAVING**、**WHERE**、**FROM**等等——都是为了达到你真正寻找的数据而丢弃数据的行为。为什么
**FROM**—允许您丢弃不需要的列。**WHERE**—允许您丢弃不需要的行。**GROUP BY**使您能够丢弃细节,查看聚集,并使用**HAVING**子句应用**WHERE**类型功能。**ORDER BY**—使您能够根据排序方案丢弃行。使用**LIMIT**您可以选择丢弃任意数量的记录。
您没有丢弃的数据俗称为扫描的数据。最好的查询是扫描最少数据的查询。要扫描最少量的数据,您需要使用上面提到的数据丢弃技术。仅仅写一个**WHERE**条件不会自动丢弃数据。你必须应用一种或多种这些技术。
例如,如果您在索引中使用的列上没有索引,
***WHERE***子句将产生正确的结果,但不会很快,即***WHERE***子句将为了准确性而丢弃数据,而不是为了性能。
理解这一点很重要,尤其是如果您只是在摆弄数据库、数据仓库、数据管道、数据处理引擎等。它们都基于相同的原理工作。在本文中,我刚刚介绍了一些可以更快获取数据的方法。事情远不止如此。我将在下一篇名为理论上的最小值:SQL 的文章中更详细地讨论在 SQL 中丢弃数据的问题。我还将讨论如何编写更干净、更高效的 SQL 。
如果你想谈论任何数据,请随时在 LinkedIn 上给我留言。要获得更多我的作品,请访问链接树。
深度神经网络中超参数调整的艺术

H ello 开发者👋,如果你以前从事过构建深度神经网络的工作,你可能知道构建神经网络可能涉及设置许多不同的超参数。在本文中,我将与您分享一些技巧和指南,您可以使用这些技巧和指南来更好地组织您的超参数调优过程,这将使您更有效地发现超参数的良好设置。
什么是超参数?🤷♀️
很简单,超参数在模型之外,也就是说,它不能在估计器中学习,它的值也不能从数据中计算出来。
许多模型的重要参数无法从数据中直接估计出来。这种类型的模型参数被称为调整参数,因为没有可用的解析公式来计算适当的值。
—第 64、65 页,应用预测建模,2013 年
超参数通常用于帮助估计模型参数的过程中,并且通常由您指定。在大多数情况下,为了调整这些超参数,您可能会使用一些基于您的经验的启发式方法,可能是超参数的起始值,或者是针对给定的问题通过反复试验找到最佳值。
正如我在本文开始时所说的,训练深度神经网络的一个痛苦之处是您必须处理大量的超参数。如果您使用 RMSprop 优化器( Hinton 等人),这些可能是您的学习率α、折现因子ρ和εϵ;如果您使用 Adam 优化器( Kingma 等人),这些可能是指数衰减率β₁和β₂。您还需要选择网络中的层数或各层的隐藏单元数,您可能会使用学习率调度程序,并希望对其进行配置和更多配置😩!我们确实需要更好地组织超参数调整过程的方法。
哪些超参数更重要?📑
通常,我们可以将超参数分为两组:用于训练的超参数和用于模型设计 🖌️.的超参数正确选择与模型训练相关的超参数将允许神经网络更快地学习,并在调整过程中实现增强的性能,这肯定是您想要关心的事情。模型设计的超参数更多地与神经网络的结构相关,一个普通的例子是隐藏层的数量和这些层的宽度。在大多数情况下,模型训练超参数可以很好地用作测量模型的学习 capacity🧠.的方法
在培训过程中,我通常最关注的是学习速率α 和批量大小,因为这些决定了收敛的速度,所以你应该考虑先调整它们或者给予它们更多的关注。然而,我坚信对于大多数模型来说,学习率α是最重要的超参数,因此值得更多的关注。我们将在本文后面讨论选择学习速率的方法。另外请注意,我在这里提到了“通常”,这肯定会根据您正在构建的应用程序的类型而变化。
接下来,我通常会考虑调整 RMSprop 和其他软件中的动量项β ,因为这有助于我们通过加强同一方向的权重更新来减少振荡,同时允许我们减少不同方向的变化。我经常建议使用β = 0.9,这是一个非常好的缺省值,也是最常用的。
这样做之后,我会尝试调整每层的隐藏单元数量,然后是隐藏层的数量,这基本上有助于改变模型结构,然后是学习率衰减,我们很快就会看到这一点。注意:本段中建议的顺序似乎对我很有效,最初是由吴恩达提出的。
此外,佟宇和朱红在他们的论文中对 Ng 讲义中超参数的重要性顺序做了一个非常有用的总结,提出了这个顺序:
- 学习率
- 动量β,对于 RMSprop 等。
- 小批量
- 隐藏层数
- 学习率衰减
- 正则化λ
调节 process🕹️的常用方法
我们在这一节中讨论的基本上是一些我认为重要的事情,并且适用于任何超参数的调整。因此,我们不会讨论与特定超参数调优相关的东西,而是适用于所有超参数的概念。
随机搜索
随机搜索和网格搜索(随机搜索的前身)是目前使用最广泛的方法,因为它们简单。以前,通常对网格中的点进行采样,然后系统地对用户指定的超参数集进行详尽的搜索。并且这工作得很好,并且适用于具有有限搜索空间的几个超参数。在这里的图表中,我们提到网格搜索要求我们系统地采样点,并尝试这些值,然后我们可以选择最适合我们的一个。

根据吴恩达的讲稿
为了执行深度神经网络的超参数调整,通常建议随机选择点。所以在上面的图像中,我们选择了相同数量的点,但是没有像左边那样按照系统的方法来选择这些点。你经常这样做的原因是,很难预先知道哪个超参数对你的问题最重要。假设这里的超参数 1 对您的问题很重要,而超参数 2 的作用很小,您基本上只能尝试超参数 1 的 5 个值,尝试超参数 2 的值后,您可能会发现几乎相同的结果,因为它的作用并不大。另一方面,如果您使用随机抽样,您将更丰富地探索可能值的集合。
因此,我们可以在调优过程的早期阶段使用随机搜索来快速缩小搜索空间,然后开始使用引导算法来获得从粗略到精细采样方案的更精细结果。下面是一个关于 TensorFlow 的简单示例,我尝试在时尚 MNIST 数据集上使用随机搜索来获得学习率和单元数量:
超波段
Hyperband ( 李等)是我经常使用的另一个算法,它本质上是随机搜索的一个微小改进,结合了自适应资源分配和早期停止,以快速收敛到高性能模型。在这里,我们为几个时期训练大量的模型,并且只将表现最好的一半模型结转到下一轮。
早期停止对于深度学习场景特别有用,在深度学习场景中,深度神经网络经过多个时期的训练。训练脚本可以在每个时期之后报告目标度量,并且如果在相同数量的间隔之后,该运行明显不如先前的运行,则可以放弃该运行。
下面是一个关于 TensorFlow 的简单示例,我尝试在时尚 MNIST 数据集上使用 Hyperband 计算学习率和单位数:
选择学习率α🧐
我对选择适当的学习速率α特别感兴趣,因为对于大多数学习应用来说,它是最重要的超参数,因此也值得更多的关注。拥有一个恒定的学习速率是最直接的方法,通常被设置为默认时间表:
optimizer = tf.keras.optimizers.Adam(*learning_rate = 0.01*)
然而,结果表明,在 LR 恒定的情况下,网络通常可以被训练到足够的但不令人满意的精度,因为初始值可能总是较大,尤其是在梯度下降的最后几步。最佳学习率将取决于损失景观的拓扑结构,而这又取决于模型架构和数据集。所以我们可以说,一个最佳的学习率会使我们的损失函数急剧下降。降低学习速率会降低损失函数,但这种降低的速率非常低。另一方面,在最优学习率之后增加学习率将导致损失在最小值附近反弹。这里有一个数字来总结这一点:

来源:杰瑞米·乔登
现在你明白了为什么选择一个有效的学习率是重要的,让我们谈一谈在训练或制定时间表时更新你的学习率。一种流行的技术,称为学习速率退火,经常被使用,它建议从相对较高的学习速率开始,然后逐渐降低学习速率📉训练时。例如,当精度饱和时,我可以从 10⁻的学习率开始,或者当我达到一个平稳状态时,我们可以降低学习率,比如说降低到 10⁻,如果需要,可能再降低到 10⁻⁵。
在训练深度网络时,随着时间的推移调整学习速率通常是有帮助的。要记住的好的直觉是,在高学习率的情况下,系统包含太多的动能,参数向量无序地跳跃,无法停留在损失函数的更深但更窄的部分。
——斯坦福 CS231n 课程笔记费-李非、兰杰·克里希纳、丹飞·徐
回到上面的例子,我怀疑我的学习率应该在 10⁻和 10⁻⁵之间,所以如果我简单地在这个范围内统一更新我的学习率和,我们使用了从 10⁻到 10⁻的 90%的资源,这是没有意义的。你可以更新对数标度上的 LR,这允许我们在 10⁻到 10⁻和 10⁻到 10⁻⁴.之间使用等量的资源现在对你来说应该超级容易😎了解广泛使用的 LR 程序指数衰减(【李】等)。指数时间表在开始时提供更剧烈的衰减,当接近收敛时提供平缓的衰减。

指数衰减
下面的示例展示了如何使用张量流执行指数衰减:
此外,请注意,初始值是有影响的,在这种情况下必须仔细确定,尽管您可能希望使用相对较大的值,因为它会在训练过程中衰减。
选择动量项β🧐
为了更好地帮助我们理解为什么我稍后会为动量项建议一些好的默认值,我想展示一下为什么在 RMSprop 和其他一些中使用动量项。RMSprop 背后的想法是加速梯度下降,就像前体阿达格拉德(杜奇等人)和阿达德尔塔(泽勒等人)一样,但当步长变小时会产生更好的性能。RMSprop 使用平方的指数加权平均值,而不是直接使用∂w 和∂b:

在 RMSprop 中添加β项
现在你可能已经猜到了,移动平均项β应该是 0 到 1 之间的一个值。在实践中,0.9 在大多数情况下工作得很好(Geoffrey hint on也建议这样做),我认为这是一个非常好的默认值。您通常会考虑尝试介于 0.9(最后 10 个值的平均值)和 0.999(最后 1000 个值的平均值)之间的值。这里有一个非常精彩的图表来总结β的作用。这里是:
- 红色线条代表 β = 0.9
- 绿色线条代表 β = 0.98

资料来源:吴恩达
如您所见,β值越小,新序列波动越大,因为我们对更少的样本求平均值,因此更接近噪声数据。然而,β值越大,我们得到的曲线就越平滑,但会向右偏移一点,因为我们对更多的例子求平均值。所以总的来说,0.9 提供了一个很好的平衡,但是正如我前面提到的,你经常会考虑尝试一个介于 0.9 和 0.999 之间的值。
正如我们在本文中谈到寻找一个好的学习速率α,以及在线性标度中这样做是没有意义的,而是在对数标度中这样做。类似地,如果您正在搜索一个好的β值,那么在 0.9 和 0.999 之间均匀随机地执行搜索也没有意义。因此,一个简单的技巧可能是在 10⁻到 10⁻的范围内搜索 1-β,我们将在对数标度内搜索它。下面是一些示例代码,用于以对数标度生成这些值,然后我们可以搜索这些值:
r = -2 * np.random.rand() # gives us random values between -2, 0
r = r - 1 # convert them to -3, -1
beta = 1 - 10**r
选择模特设计 Hyperparameters🖌️
隐藏层数 d
我不会谈论一些关于隐藏层数的具体规则或建议,你很快就会明白我为什么不这样做(举例)。
隐层数 d 是决定神经网络整体结构的一个非常关键的参数,它直接影响最终的输出。我几乎总是看到,具有更多层的深度学习网络通常会获得更复杂的特征和相对更高的准确性,从而使这成为实现更好结果的常规方法。
例如,ResNet 模型(何等人)可以通过简单地使用更多层,根据他们对精度的需要重复基线结构,从 ResNet-18 扩大到 ResNet-200。最近,黄雁萍等人在他们的论文中通过将基线模型放大四倍,实现了 84.3 %的 ImageNet top-1 准确率!
神经元数量 w
在谈到层数之后,还必须仔细考虑每层 w 中神经元的数量。隐藏层中的神经元太少可能会导致拟合不足,因为模型缺乏复杂性。相比之下,太多的神经元可能会导致过度拟合,并增加训练时间。

神经元的数量很重要吗?
杰夫·希顿的几个建议非常有效,可能是调整神经元数量的良好开端。为了便于理解,这里我用 wᵢₙₚᵤₜ作为输入层的神经元数量,用 wₒᵤₜₚᵤₜ作为输出层的神经元数量。
- 隐藏神经元的数量应该在输入层的大小和输出层的大小之间。wᵢₙₚᵤₜ < w < wₒᵤₜₚᵤₜ
- The number of hidden neurons should be 2/3 the size of the input layer, plus the size of the output layer. w = 2/3 wᵢₙₚᵤₜ + wₒᵤₜₚᵤₜ
- The number of hidden neurons should be less than twice the size of the input layer. wᵢₙₚᵤₜ < 2 wₒᵤₜₚᵤₜ
And that is it for helping you choose the Model Design Hyperparameters🖌️, I would personally suggest you also take a look at getting some more idea about tuning the regularization λ and has a sizable impact on the model weights if you are interested in that you can take a look at this blog I wrote some time back addressing this in detail:
Yeah! By including all of these concepts I hope you can start better tuning your hyperparameters and building better models and start perfecting the “Art of Hyperparameter tuning”🚀. I hope you liked this article.
If you liked this article, share it with everyone😄! Sharing is caring! Thank you!
非常感谢
Python 中超参数调优的艺术
网格、随机、由粗到细、贝叶斯、手动搜索和遗传算法!

照片由德鲁·帕特里克·米勒在 Unsplash 上拍摄
假设您已经准备了数据并开发了 ML 模型的 POC,
这很有效。
但是,你意识到了,性能其实并不好。
当然,您希望提高模型的性能,但是如何提高呢?
该不该换型号?
那是一个选项,但是如果在你改变了模型之后,你仍然不能达到预期的性能呢?
您有两个选择:设计模型,或者重新访问数据。
前者被称为以模型为中心的方法,而后者被称为以数据为中心的方法。在本文中,我们将学习以模型为中心的方法,尤其是超参数调优部分。
关于如何在 Python 中执行超参数调优,有许多文章和教程可供参考。
那么,为什么我要花时间去阅读另一篇典型的文章呢?
本文涵盖了所有有用的超参数调优方法。你不仅会学到每种超参数调节方法的概念,还会学到何时应该使用每种方法。
此外,解释还将伴随着相关的可视化,可以帮助您更好地理解每种方法是如何工作的。
本文将讨论 6 种方法:
- 网格搜索
- 随机搜索
- 由粗到细的搜索
- 贝叶斯搜索
- 遗传算法
- 手动搜索
不需要担心代码实现,因为您可以从本文末尾的链接中自由访问它!

由 Pablo Heimplatz 在 Unsplash 上拍摄的照片
不再浪费时间,让我们深呼吸,让自己舒服一点,准备好学习 Python 中超参数调优的艺术吧!
超参数对参数
在学习超参数调优方法之前,我们应该知道超参数和参数之间的区别。
超参数和参数之间的关键区别在于它们相对于模型的位置。
模型参数是模型内部的配置变量,其值可从数据中估算。
例如:逻辑回归/线性回归中的系数、神经网络中的权重、SVM 中的支持向量
模型超参数是模型外部的配置,其值无法从数据中估计。
例如:决策树中的 max_depth、神经网络中的学习率、SVM 的 C 和 sigma
另一个需要理解的重要术语是超参数空间。基本上,超参数空间就是超参数调优过程中可以调优的超参数的所有可能组合的空间。
超参数调谐
现在我们知道超参数和参数的区别了。接下来要知道为什么要做超参数调优。
基本上,超参数调整的目标是获得最佳的模型性能。
怎么会?通过选择超参数的最佳组合,因为它们不能从数据中估计出来。
但是,如何选择超参数的最佳组合呢?
这是本文将要回答的主要问题!有许多方法可以执行超参数调整。在这篇文章中,我们将学习其中的 6 种,并比较和指导何时使用它们。

作者图片
网格搜索

图片作者。
第一种也是最流行的方法叫做网格搜索。基本上,这是简单的蛮力,我们必须测试所有可能的组合。
当您已经知道适合您的情况的超参数空间时,这种方法是最适合的。
优点:
- 能够测试超参数空间内的所有组合
- 实施起来非常简单
缺点:
- 维度的诅咒
- 可能错过超参数空间之外的更好的超参数组合
随机搜索

图片作者。
我认为这是仅次于网格搜索的第二种最流行的超参数调优方法。随机搜索通过在超参数空间内随机选择超参数的组合来工作。
当您不知道合适的超参数空间时,这种方法最适合(这是最常见的情况)。
通常,当执行随机搜索时,我们将超参数空间设置得比执行网格搜索时更大。为什么?所以希望我们能得到更好的超参数组合。
优点:
- 非常适合发现和获得您无法凭直觉猜到的超参数组合
缺点:
- 通常需要更多的时间来执行,直到获得最佳组合
由粗到细的搜索

图片作者。
失败者的方法。从粗到细的搜索基本上是网格搜索和随机搜索的结合,但结果证明它非常强大。
这种方法是这样工作的:
- 在初始超参数空间上执行随机搜索
- 寻找有前途的地区
- 在较小的区域执行网格/随机搜索
- 继续,直到获得最佳分数或达到最大迭代次数
优点:
- 利用网格和随机搜索的优势
- 花更多的时间在搜索空间,这是给好的结果
缺点:
- 更难实现,因为还没有支持这个特性的包
不用担心,因为您将从本文中获得这个 underdog 方法的代码实现!
贝叶斯搜索

条件概率公式。图片作者。
贝叶斯搜索是一种“聪明”的算法,它利用贝叶斯定理来搜索超参数的最佳组合。
在高层次上,这种方法是这样工作的:
- 从参数分布的先验估计开始
- 维护超参数值和模型性能之间关系的概率模型
- 交替使用:
- 使用最大化预期改善的超参数值进行训练
- 使用训练结果来更新初始概率模型及其期望值
优点:
- 一种无需人工干预的选择超参数的有效方法
缺点:
- 难以从零开始实施
阅读这篇文章了解更多关于贝叶斯搜索的细节。
该方法的代码实现可以在本文末尾的 Github Repo 中找到。
遗传算法

这是一种更“聪明”的超参数调整方法。该方法受自然选择进化概念的启发。
在高层次上,遗传算法是这样工作的:
- 从人口开始
- 对于每次迭代,种群将通过执行选择、交叉和变异来“进化”
- 继续,直到达到最大迭代次数
观看这个视频来学习更多关于遗传算法的知识。
该方法的代码实现可以在本文末尾的 Github Repo 中找到。
手动搜索

顾名思义,这是一种手动方法,其中人自己手动调整超参数组合,直到模型获得最佳性能。
当你想使用这种方法时,你必须真正理解算法是如何工作的。基本上,这种方法是这样工作的:
- 训练和评估模型
- 猜一个更好的超参数组合
- 重新训练和评估模型
- 继续直到获得最佳分数
优点:
- 对于熟练的从业者来说,这有助于减少计算时间
缺点:
- 很难猜测,即使你真的理解算法
- 耗时的
何时使用每种方法?
有时候。我们知道的越多,我们就变得越困惑。
我们现在知道在执行超参数调整时可以使用的 6 种方法。够不够?也许对于一个可以轻松掌握新概念的人来说,阅读上面的解释并准备在真实场景中实现它们就足够了。
然而,对于那些仍然不知道何时使用每种方法的人,这里我也创建了一个简单的矩阵,你们可以参考。

图片作者。
该矩阵可以帮助您根据训练时间和超参数空间的大小来决定应该使用哪种方法。
例如,当您训练具有大超参数空间的深度神经网络时,最好使用手动搜索或随机搜索方法,而不是使用网格搜索方法。
你可以在这里找到本文中使用的所有代码。
最后的话

恭喜你坚持到了这一步!希望你从这篇文章中学到了一些新的东西。
阅读完本文后,您应该知道执行超参数调优的各种方法以及何时使用每种方法。如果你喜欢这些内容,请关注我的媒体账户,以获得关于我未来帖子的通知!
关于作者
Louis Owen 是一个数据科学爱好者,他总是对新知识如饥似渴。他在印度尼西亚顶尖大学Institut Teknologi Bandung攻读数学专业,并获得了最后一年的全额奖学金。最近,2020 年 7 月,他刚刚以优异的成绩毕业。
目前,Louis 是Bukalapak的一名人工智能研究工程师,在那里他帮助提供各种人工智能解决方案(金融时间序列、自然语言处理和计算机视觉)。
查看路易斯的网站以了解更多关于他的信息!最后,如果您有任何疑问或需要讨论的话题,请通过 LinkedIn 联系 Louis。
参考
https://machine learning mastery . com/difference-a-parameter-and-a-hyperparameter/
https://fullstackdeeplearning.com/spring2021/lecture-7/
学习数据科学的艺术

由 Chanin Nantasenamat 使用 alexacrib 在 envato elements 上的图形创建
入门;数据科学
如何学习数据科学
回到 2020 年 1 月,我发布了一个名为2020 年学习数据科学的策略的视频,分享了我关于如何开始学习数据科学的一些技巧。一年过去了,我认为这将是一个很好的机会来重温这个话题,我写了这篇文章学习数据科学的艺术,分享我关于如何在 2021 年学习数据科学的最佳技巧(以及几位杰出的数据科学家的技巧)。
我最喜欢的一句话是“学习数据科学的最好方法是做数据科学。”我总是在我的 YouTube 上的每个视频结束时说这句话但是为了做到这一点,你还需要知道。所以棘手的问题是:
要了解多少才能做数据科学?
让我们在这篇文章中了解一下吧!
注意:当你在看的时候,也一定要看看下面我之前创作的同名视频, 学习数据科学的艺术 。
☝️My 关于开始数据科学学习之旅的最佳提示。
1.本文的动机
在 2020 年的过程中,我在解释数据科学的概念时尝试了很多教育技术。其中包括制作 YouTube 视频、写博客、手绘信息图以及创造迷因。除此之外,我很幸运有机会认识其他数据科学家、数据科学 YouTubers(肯·吉、克里斯·纳伊克、马得和丹尼尔·伯克)以及与人工智能相关的公司。此外,我有机会阅读和参与 Twitter 或 LinkedIn 等各种平台上来自观众、其他数据科学家以及数据科学 YouTubers 的数千条评论。
这些评论中最受欢迎的一个问题是:
如何开始学习数据科学?
为了做数据科学,一个人应该知道多少?
正如我之前提到的,在学习数据科学和从事数据科学之间似乎有一个平衡。因此,在你能做数据科学之前,你应该学习多少?
YouTube 上已经有几个视频在谈论如何学习数据科学。著名的数据科学 YouTubers 发布了这样的视频,例如 Ken Jee,他有几个视频与你分享他的最佳技巧,告诉你如果他必须从头开始,他将如何学习数据科学。在 Ken Jee 和 Andrew Mo 长达一小时的合作视频中,他们讨论了如果他们必须重新开始,他们将如何学习数据科学。到 2020 年底,Ken Jee 还发布了一个视频,讲述他将如何在 2021 年重新开始学习数据科学。
今年 2021 年初,Tina Huang 发布了一个病毒视频,讲述了她学习数据科学的最小输入最大输出方法。克里斯·纳伊克和达瓦尔·帕特尔也制作了他们自己的视频,谈论如何聪明地学习数据科学,以及如何免费学习数据科学。此外,Daniel Bourke 分享了机器学习和数据科学中关键主题的思维导图。
在写这篇文章之前,我花了几个月的时间从这些如何学习数据科学视频中收集要点,结合我自己的观点和想法,我总结了如何学习数据科学的所有关键概念。应该注意的是,这适用于有抱负的数据科学家以及希望提高技能或重新提高技能的实践数据科学家,以及希望获得新技术技能以提升其数据分析/数据工程师/数据科学技能的数据分析师或数据工程师。
我的目的是让这篇文章尽可能保持最新,所以请在这篇文章中随意评论这篇文章中缺少的任何学习数据科学的资源。
让我们开始吧!
2.学习数据科学艺术的 4 个步骤
由于一张图片胜过千言万语,因此我想出了这张信息图或卡通插图,总结了您可以在学习数据科学和数据技能时使用的概念框架。这个如何学习数据科学的例子叫做学习数据科学的艺术。
它主要由四个主要步骤组成:
- 第一步。计划
- 第二步。学习
- 第三步。构建
- 第四步。解释
我们这里有很多内容要讲,所以让我们开始吧!

图解学习数据科学的艺术。由 Chanin Nantasenamat(又名数据教授)手绘
3.第一步——计划
3.1.设定学习目标
在开始你的学习之旅之前,设定你的学习目标是非常必要的。考虑以下问题:
你希望从学习数据科学中获得什么?
你打算用这些知识去找工作吗?
你只是出于爱好而使用这些知识吗?
你是否将这些知识应用到你现有的日常工作中。
你有多少时间学习?
通过考虑以上问题,你会对自己的目标有更好的把握,对学习数据科学的期望也会更加现实。
通过意识到你的时间限制,你将能够留出一个固定的时间段来适应你的时间表。
通过开始这个学习之旅,这表明你有一个成长的心态。你相信如果你投入必要的时间和精力,你可以获得新的数据技能。
3.2.制作你自己的学习课程
创建自己的个人学习课程是非常必要的。
为什么?你可能会问。
正如一种尺寸不能适合所有人一样,学习课程也是如此。一般的课程可能是一个很好的起点,但如果课程变得个性化并符合你自己的兴趣,这将有助于使学习之旅成为一次更有价值的经历。因为在一天结束的时候,如果你正在学习的主题或你正在从事的项目有趣、吸引人,那么你就更有可能被激励去学习它或从事它。弄清楚是什么激发了你的好奇心,然后利用它来制作你自己的定制学习课程。
在这一部分,我将讨论一些主题(如数学、统计学、机器学习等。)帮助您迈出成为数据科学家的第一步。
3.3.贸易工具

行业工具插图。作者手绘。
3.4.数据科学中需要学习的主题
3.4.1。数据处理
在上机器学习之前,先说一些你应该了解的数据技巧。所以你应该知道的一些数据技能包括如何处理数据?如何清理数据?如何设计特征、将特征组合在一起(加、乘、减、除或对数变换)以改变或变换它们的值?
3.4.2。数据可视化
另一个重要的部分是如何可视化数据?如何选择合适的数据可视化图?你应该把它显示成散点图吗?是否应该显示为条形图?饼状图?一片森林?PCA 图?直方图?那要看你想展示什么了?您希望在数据中显示哪些趋势?
3.4.3。型号说明
另一个重要的数据技能是模型解释。所以有一些工具会帮到你。例如,随机森林具有内置的要素重要性功能,您可以查看基尼指数,然后合理调整要素对预测的重要性或贡献。在简单的线性回归中,您还可以利用回归系数来推断哪些特征是重要的,以及在哪个方向上对感兴趣的变量的预测贡献最大(正或负)。除此之外,黑盒算法很难搞清楚,它们对模型预测有什么贡献,或者如何贡献。你可以看看一些优秀的库,Python 中的 Shap 库可以让你检查黑盒算法的特性重要性。因此,Shapley 值将告诉您哪些特征是重要的,并有助于预测,还有其他库,如 Lime 和最近的 Dalex。所以你一定要去看看。
3.4.4。学习类型
好了,现在来看看机器学习。但是在谈论机器学习之前,让我们来看看一些流行的或一般的学习类别。我们有监督学习和非监督学习,还有强化学习。因此,对于数据科学课程来说,了解一些监督或非监督学习方法是非常必要的。
在监督学习中,你有一个 X 变量和一个 Y 变量的矩阵,你将使用 X 与 Y 相关联。因此你有回溯数据,你可以使用它来训练你的预测模型,它可以是回归模型或分类模型。所以给定 X,你可以预测 Y。所以在一个简单的 Y 等于 f 的 X 中,你将应用一个函数来计算给定 X 的 Y。所以 X 可以有多个 X 变量,在无监督学习中,你将在没有 Y 的情况下学习,你将只有 X 特征(自变量),所以 X 变量也被称为自变量,Y 也被称为因变量。所以在无人监管的情况下,你只能访问 x。
这些算法的一个例子是聚类,因为通过聚类,您将能够看到每个数据样本之间的相对距离,在强化学习中,学习将会发生并得到改善。如果它正确地完成了任务,它将得到奖励,因此这将以迭代的方式发生。(机器学习)被分解为机器学习中的一些常见任务,包括分类、回归、聚类、关联规则、自然语言处理以及时间序列分析。所以对你来说,弄清楚你想深入了解哪些细节是非常重要的。因此,如果你一开始就知道你想学习自然语言处理,那么你可以自由地投入到自然语言处理中去。
3.5。从哪里开始?
但是,如果你开始学习数据科学,但不知道要从哪里开始,我建议你从分类、回归和聚类开始。一旦你掌握了这三项,你也可以着手处理这里提到的另一项任务。我推荐大家看一下一些传统的机器学习算法,包括线性回归、逻辑回归、决策树、随机森林、支持向量机以及人工神经网络。因此,除了传统的反向传播神经网络,还有其他基于深度学习的神经网络。这包括卷积神经网络,一些常见的应用是计算机视觉。递归神经网络以及用于序列处理的长短期记忆。编码器解码器以及变压器,这是自然语言处理。自动编码器和生成对抗网络,这是用于生成学习的。因此,另一个需要考虑的重要话题是您将用于实施数据科学学习和数据科学项目的工具。
3.6。数据科学工作环境
所以一个常见的问题是你应该买什么电脑,所以我的建议是使用你现在可以使用的任何电脑。没有必要购买任何计算机,因此您可以使用 Google Colab 来实施数据科学项目以及学习数据科学的一些最佳资源。Google Colab 是一个免费的资源,你可以用它来创建 Jupyter 笔记本,这些笔记本可以用于运行机器学习和深度学习的计算,因为它们也为你提供了一些免费的 GPU 资源。除了这些云计算,您可能还想在自己的计算机上安装一个本地版本,因此我建议安装 conda,您可以使用它为每个项目设置数据科学环境,或者您也可以使用 Python 安装虚拟环境。这里包含了一些您可以使用的文本编辑器或 IDE(集成开发环境)。一些流行的包括 Visual Studio Code(或 VS Code)、PyCharm、Atom、Jupyter、Spyder 和 Vim。有些甚至可能暗示崇高。
3.7。编码
在您的数据科学之旅中,非常重要并且可能是您应该开始学习的核心技能之一是学习如何编码。如果您正在处理大量数据,那么您肯定应该学习 SQL。
您可以了解的一些库和包就在这里。因此,如果您使用 Python 来操作数据或数据框,您应该使用 Pandas。在 R 中,你可以使用 tidyverse,tidyverse 有很多包,比如 tidyr,dplyr。如果你正在使用 Python,如果你正在使用数组,你肯定应该使用 NumPy,R 有它自己的内置数组系统,对于科学计算,SciPy 也值得一看。对于数据可视化,如果你正在使用 Python,你肯定应该学习 Matplotlib、Seaborn 和许多其他类似 Plotly、Bokeh 和 Altair 的工具。在 R 中,你一定要使用 R 的基本图和 ggplot2。ggplot2 有一些惊人的可视化功能,您可以利用这些数据。在 Python 中,要实现机器学习计算,scikit-learn 必不可少。如果你想实现深度学习模型,你肯定应该看看 TensorFlow 和 PyTorch,还有 fast.ai。在 r 中,你有 tidymodels,你有 parsnip,你有 caret,你也有 TensorFlow。
我提到过,除了使用自己的本地计算机来计算机器学习模型,如果你觉得有必要扩展你的计算资源,并且如果你是一名学生,你肯定可以查看这些云基础设施中的一些,它们将为你提供一些免费积分来帮助你入门。即使你不是学生,其中一些基础设施也会为你提供一些免费学分,帮助你开始你的数据科学项目。
最重要的事情之一也是 GitHub,因为你正在进行你的机器学习或数据科学项目,所以在 GitHub 上分享这些是非常必要的。所以做一个投资组合。
3.8。数据来源
我马上会在学习数据科学的概念框架的第四部分中谈到这一点,有许多广泛的数据来源可供您在数据科学项目中使用。这包括 UCI 机器学习数据集,TidyTuesday。实际上我制作了一个关于这个的视频。所以我也会把这个包含在视频的描述里。Kaggle 也是一个非常好的数据集资源,你也可以参加他们的一些有趣的比赛,同时你可以从其他人的代码中学习,你可以用这些代码作为你自己项目的起点。现在有几个数据集是公开的,所以在谷歌上搜索,你可以输入“公开数据”。谷歌也发布了自己的谷歌数据集搜索,所以你一定要去看看,有一个杂志出版商叫 Nature-Springer,他们有一个杂志叫 Scientific Data,他们在那里分享(顾名思义)科学家发表的科学数据,供其他人在他们自己的项目中使用。所以你一定要检查一下,或者你也可以收集你自己的数据。你可以做一个调查来收集数据。你可以创建一些谷歌表单来收集数据(用户可以输入他们的数据到谷歌表单)。或者你也可以通过网络搜集来收集数据。所以有一些很好的工具供你使用。特别是在 Python 中,你可以使用漂亮的 Soup 来抓取数据。如果你期待部署你的机器学习模型,你绝对应该检查一下你可以用来实现一些有用功能的 API。因此,互联网上有各种各样的 API 可供使用,这些 API 将允许您访问独特的功能,例如,执行 web 抓取,这方面有一些 API。所以有些 API 是免费的,而有些 API 是你必须付费的。另一个例子是在生物信息学中,有一些 API 可以让你从生物活性数据库中获取数据。
3.9。模型部署
通过部署您的模型,这意味着您正在将您的机器学习模型公之于众,在那里您可以共享它,它有一个图形用户界面。如果它没有图形用户界面,它被称为 API。但是如果它有一个图形用户界面,你可以称之为 web 应用,一些流行的方法是实现 Flask 和 Django。然而,这两者都需要大量的技术技能。另一方面,Dash 和 Streamlit 等低代码解决方案比 Flask 或 Django 更容易掌握和实现,我说的更容易是指花费的时间更少。我还有一个完整的视频系列,讲述如何使用 Streamlit 实施几个数据科学项目,使用 Streamlit,您可以部署机器学习模型,部署深度学习模型,还可以创建交互式数据应用。
我还创建了一个包含 30 多个视频的 Streamlit 视频播放列表,介绍如何使用 Streamlit 构建各种网络应用。
3.10。数据科学流程
所以一定要去看看!数据科学课程的另一个重要部分是“数据科学过程”,有时也可以称之为“数据科学生命周期”简而言之,它包括了你在做数据科学时通常会遇到的一些任务。因此,您可以将此视为数据科学的蓝图,您可以参考数据科学家在实施数据科学项目时使用的一些最佳实践。这通常包括数据收集、数据清理、数据建模、数据探索、数据部署以及解释。所以我也制作了一个视频,你一定要看看这些视频。并且链接也将在描述中提供。好了,现在我们已经提到了数据科学课程的核心要素,让我们回到大背景。
3.11.一致性和问责制
好了,现在我们已经有了数据科学课程,下一步是制定学习数据科学的时间表。是的,我们知道学习数据科学可能是一个非常持久的过程。如果没有承诺和责任,学习数据科学是很难成功的。
由 Ken Jee 发起的名为#66daysofdata 的计划是启动您的数据科学学习之旅的一个很好的方式。参加#66daysofdata 很简单,你需要在 66 天内每天至少花 5 分钟学习或研究数据科学,然后在 Twitter 或 LinkedIn 等社交平台上分享你的进展。公开分享你的学习历程有利于增加你的责任感。不要相信我的话,发表在 转化行为医学 杂志上的一项研究显示,在推特上公开分享减肥进展的参与者比那些没有分享的参与者能够减掉更多体重。但这还不是全部,下一个问题是为什么是 66 天?在《原子习惯》一书中,作者詹姆斯·克利尔讨论了一些科学发现,这些发现揭示了一个新习惯的形成大约需要 66 天。
因此,通过持续地公开分享你的学习进度,你将有效地对自己的学习进度负责,并见证社区中其他志同道合的学习者的意图和责任。因此,关于 66 天的数据的伟大之处在于,它允许你对你的学习之旅有一个一致的时间表。
试图在尽可能短的时间内学到尽可能多的东西可能是可取的,但重要的是要注意到,并不是所有的日子都是富有成效的。但是不要因为没有效率而责备自己。知道非生产性的日子可能会被其他生产性的日子所弥补,可能会让人安心。
3.12.时间管理
好的,当你学到足够的东西,然后你能够在数据科学项目中实现它, 另一个非常有用的建议是将某种形式的时间管理应用到您的学习中,一种流行的方法是使用番茄工作法,您工作 25 分钟,并专注于工作,然后每过 25 分钟,您将休息五分钟,这将构成一个循环,因此您可以在数据科学学习过程中实施几个循环。 你也可以设置一个具体的时间,比如你可以花一轮番茄大战来学习如何使用随机森林分类器,当这一轮结束时,你可以转到另一个主题学习,这样可以帮助你避免陷入某个特定的主题。防止你掉进兔子洞,你就能进入下一个话题。好吧,如果你被困住了,你可以继续前进,稍后再回来。
4.第 2 部分—学习
有大量的学习资源可供学习数据科学。这里有一些根据不同认知类型分类的资源(观看、倾听、项目工作等)。).
4.1.通过观看视频来学习
学习数据科学的第一资源是通过观看 YouTube 视频上的视频,或者你也可以观看各种学习平台上的视频,有 Udemy 、DataCamp、365 Data Science、Dataquest、Skillshare 等。
4.2.通过听播客来学习
你也可以在 YouTube、Spotify 和 SoundCloud 上听播客。还有几个关于人工智能和数据科学的很棒的播客。所以你可以跑步,慢跑,然后听数据科学。你可以开车去上班听音乐,你可以通勤去上班听播客。
以下是我听过的一些很棒的播客:
4.3.通过读书来学习
因此,像 Abhishek 的百页机器学习书、数据科学家实用统计、处理几乎任何机器学习问题之类的书,他还有一个很棒的 YouTube 频道,在那里他详细介绍了各种机器学习项目和深度学习项目的实施,所以你绝对应该看看他的频道。你绝对不应该错过这本书用 scikit-learn、Keras 和 TensorFlow 实践机器学习:构建智能系统的概念、工具和技术,如果你开始学习机器学习和数据科学,这是一本必不可少的书,所以它有很多很好的例子,它将涵盖重要的机器学习和深度学习库,如 Scikit-Learn 以及 Keras 和 TensorFlow。至于 R 用户,也有一些用 R 组成深度学习的深度学习书籍。
或者,如果你想使用 Python,你想从头开始实现深度学习,那么你肯定应该看看这本书,你在这里看到的背景中,我也有几本书,我期待着学习机器学习和深度学习。正如你在这里看到的,学习是一个终生的过程,数据科学是一个非常大的领域,不可能什么都知道。一旦你认为你知道很多主题,那么总会有一些新的主题被发布,被出版,所以学习永远不会停止。
机器学习背景下的数学好书是 机器学习的数学 。作者还非常好心地在他们位于 https://mml-book.com/的网站上免费提供这本书的 PDF 版本,而印刷版由剑桥大学出版社出版。
有几本很好的统计学书籍,我手头的这本是 数据科学家实用统计学 。这本书的伟大之处在于,它有许多代码示例,当您在数据科学的背景下学习统计的关键概念时,可以参考这些示例。
至于学习机器学习,我有一本百页的机器学习书籍https://amzn.to/3fkfnB6,它很好地解释了常见机器学习(ML)算法的本质。当我偶尔需要快速浏览 ML 算法的高级解释时,这本书就派上了用场。
4.4.通过阅读博客来学习
除了书籍之外的其他资源是阅读 Medium 博客文章,我实际上在《走向数据科学》中发表了几篇文章,我在这些文章中一步一步地详细介绍了如何实施数据科学项目,因此 Medium 也是您学习数据科学的一个非常好的资源,所以您一定要去看看,有几个平台可以让您学习数据科学。
4.5.学习如何学习
因此,作为一名数据科学家,最重要的事情之一就是热爱学习,热爱学习新工具,学习新的机器学习算法,学习新的框架,学习新的库,所以学习永远不会停止!这是我的一些学习建议,第一个也是其他 YouTubers 用户提到的,比如 Ken Jee 和 Tina Huang 在她的“最小输入最大输出”视频中提到的,就是学习刚刚开始。
我之前提到过在你能做之前你应该知道多少。当接近一个我想在项目中使用的新机器学习库时,我会使用的一个技巧是首先浏览 API 文档。准备好,看看函数的名字,看看输入参数,看看函数做什么,用什么输入,输出是什么样子。浏览他们的入门部分也很有帮助,他们很可能会有一些教程或分步 Jupyter 笔记本,其中他们使用 Iris 数据集或其他数据集示例实施了一个解决方案。如果你能理解这一点,你几乎可以开始为你的项目实现任何新的机器学习库或工具。
尝试找出什么是输入数据,什么是结果输出数据,以及在将输入转换为输出时执行了什么转换。实现了什么类型的计算来将输入数据转换成输出数据。好的,让我们以随机森林分类器为例。所以你要做的第一件事就是通过from sklearn.ensemble import RandomForestClassifier从scikit-learn导入RandomForestClassifier()函数。特别是,您可以将随机森林分类器函数分配给名为clf的变量。应该注意,您可以将输入参数留空,它将使用默认参数。但是,如果您想要指定参数,您应该查看 API 文档,您将会看到哪些输入参数是可用的,以及它们的用法示例。例如,你可以设置树的数量,你可以设置叶子节点的数量,最大叶子节点,等等。然后,您将通过运行命令clf.fit(X_train, y_train)来执行模型构建。特别地,指定的输入参数对应于来自用于建立机器学习模型的训练集的 X 和 Y 变量。一旦模型定型,您就可以应用该模型进行预测。
现在我们已经完成了第 2 步,下一步将是构建。
5.步骤 3 —构建
现在,您将运用所学的知识来构建数据科学项目。这是我的一些建设项目的建议。
如果你正在为现有的工作获取数据科学技能,我建议你从事与工作相关的项目。因此,要做的第一件事就是弄清楚你想从事哪个项目。和你的老板谈谈,想出如何应用数据科学来解决业务/研究问题,这样做可以让你在工作中获得数据科学技能。
应该注意的是,这并不容易,因为它需要你自学。但是不要担心,我们为您提供了保障,您可以参考我们之前讨论过的上述资源。
或者,如果您无法在工作中学习数据科学,您也可以考虑在周末项目或业余时间进行项目。因此,在你朝九晚五的工作中,你将会工作,而对于你朝五晚九的工作,你肯定可以找到一些可以让你实施数据科学项目的副业,以推进你的学习之旅。我已经提到了一些你可以使用的公共数据集。此外,对你来说,编译你自己的数据集会更有趣、更吸引人。或许你可以从智能手表导出你的健身数据,从网飞导出观看历史,从 Spotify 导出收听历史。
另一种选择是,使用公开的数据集在 Kaggle 上竞争。这样做的好处是可以很好地融入社区,你肯定可以从 Kaggle 平台上共享的大量现有笔记本中学到很多东西。
如果你正在接受挑战,我最近启动了 开放生物信息学研究项目 倡议,我们可以在我编译的生物信息学数据集上工作。更多详情请见下面的视频:
呼吁参与开放生物信息学研究项目 @ 数据教授 YouTube 频道
6.第 4 步——解释
学习数据科学框架艺术的最后一部分是解释。一旦你已经建立了数据科学项目,你需要向某人解释,向某人解释可以有多种形式(例如,博客、文章、谈话、讨论、视频、音频等。).
解释的实际过程将帮助你将你所获得的所有知识和实践技能具体化,成为一种已经内化并铭刻在你心中的具体形式。有几种解释的方法,我在这里列出了它们。
首先,告诉别人你是如何构建和解释机器学习模型的,这是一种强化过程细节的好方法。这被称为费曼技术。
其次,指导一个想学习数据科学的朋友也是巩固知识的好方法。
第三,写作也是另一个很好的方式,也许是写博客,
第四,你可以建立一个文档齐全的 GitHub portfolio 网站,展示和描述你的项目。
第五,你还可以制作关于数据科学特定主题的 YouTube 视频,以及谈论你的学习之旅,这可以激励其他人的学习之旅。
此外,你可以在聚会和会议上演讲,也可以参与播客。说到播客,我特别喜欢柴数据科学播客,肯最近的邻居和数据科学的艺术家(Harpreet Sahota)。至少对我来说最重要的是画出信息图来解释数据科学的概念。所以我也喜欢这样做,所以这是我绘制的信息图,总结了我关于如何开始学习数据科学的一些最佳技巧,所以我称之为学习数据科学的艺术。
结论
总之,踏上数据科学的学习之旅是一次有益的经历,尽管有时会很困难。在这篇文章中,我总结了一些最佳的结构化技巧,以及如何让学习之旅尽可能顺利和容易。
如果你想分享你学习数据科学的技巧和诀窍,请在评论区分享!我期待任何意见和建议。
公开
- 这篇文章中可能有附属链接,我可能会从合格的购买中获得,这将有助于未来内容的创建。
接下来读这些
- 数据科学如何掌握 Python
下面是数据科学需要的必备 Python - 如何掌握数据科学的熊猫
下面是数据科学需要的必备熊猫 - 如何用 Python 构建 AutoML 应用
使用 Streamlit 库的分步教程 - 学习数据科学的策略
打入数据科学的实用建议 - 如何免费搭建一个简单的作品集网站
不到 10 分钟从零开始的循序渐进教程
✉️ 订阅我的邮件列表,获取我在数据科学方面的最佳更新(偶尔还有免费赠品)!
关于我
我是泰国一所研究型大学的生物信息学副教授和数据挖掘和生物医学信息学负责人。在我下班后的时间里,我是一名 YouTuber(又名数据教授)制作关于数据科学的在线视频。在我做的所有教程视频中,我也在 GitHub 上分享 Jupyter 笔记本(数据教授 GitHub 页面)。
*https://www.youtube.com/dataprofessor
在社交网络上与我联系
✅YouTube:http://youtube.com/dataprofessor/
♇网站:http://dataprofessor.org/(在建)
♇LinkedIn:https://www.linkedin.com/company/dataprofessor/
♇Twitter:https://twitter.com/thedataprof
♇Facebook:http://facebook.com/dataprofessor/
♇github:https://github.com/dataprofessor/
♇Instagram:)*
解决问题的艺术
提高技能的建议
问题从提出问题,对未知现象的兴趣,或者仅仅是好奇开始。它们起初是的一般和的包容,但当提问者加上自己的细节和约束时,就变成了的排他,形成了的特例。
例题
图像分类是一个一般性问题,考虑到不同的情况,在许多子问题中实例化。在其最简单的形式中,例如人脸识别,有许多不相交的标签,并且每个图像只能接受其中的一个。然而,在像场景理解这样的情况下,图像可以被标记许多标签,称为多标签分类。此外,如果我们想要将产品图像分类到亚马逊层级中,标签集非常大,并且是以层级结构构建的;在这种情况下,我们称问题为极端分类。现实世界的问题可能会有更多的挑战;数据集可能不平衡,或者我们可能有丢失的值。因此,在一般问题上增加约束会导致不同的个别情况。

图一。子问题。照片由你好我是 Unsplash 上的 Nik 。
解决一个具体问题首先要通过研究以前的作品和文献,了解它所衍生的一般问题、它的不同方面以及其他人迄今为止所做的工作。接下来应该花足够的时间去思考,让你的大脑处理你发现的不同想法及其利弊。最后,你可能会对自己的具体问题有新的想法。
例子 最近我们公司决定开发一个自动描述生成器,它将产品标题、图片和标签作为输入,并编写描述,描述产品。对于没有文案写作技能的店主来说,这可能是一个有用的工具。那一次,我知道自然语言生成(NLG)进展很快,但我不知道 NLG 模型是如何工作的。所以我决定从文献开始,阅读 GPT 的论文,在那里我发现了如何在新的数据集上微调预训练的模型。由于我们有处理电子商务数据的经验,我们很容易地收集了一个大型数据集,用标准的 NLP 模型清理它,并使用它进行微调。我们还训练了一个多标签图像分类器来预测图像的一些标签,并将它们与标题和标签一起馈送到 NLG 模型,这在我们没有文本数据时极大地提高了我们的结果。

图二。解决问题(阅读、思考和写作)。扬尼克·普尔弗在 Unsplash 上拍摄的照片。
艺术
虽然潜在的文献存在于精确的正式语言的书籍和学术研究中,但思想和想法存在于你的头脑中,在那里你应该修剪细节并建立直觉以发现新的解决方案。真正的艺术是在这两者之间切换。

图三。左边的圆圈显示了书籍和学术研究的正式领域,语言是正式的和通用的,你可以找到大量的定理和细节。在右边你可以看到思维领域,直觉和想法生活在那里,语言是简单和个性化的。(图片由作者提供。)
作为一名优秀的问题解决者,你必须能够应对学术写作的复杂性,不要迷失在复杂的注释中,并找到导致主要思想的意图。阅读文学是一把双刃剑:如果你读了很多,你可能会偏向于以前的作品,失去你的创造力;另一方面,仅仅依靠自己的想法而不研究以前的作品,可能会导致另起炉灶。因此,如果你能在阅读和思考之间建立正确的平衡,那将是最好的。在找到一个新的解决方案后,用正式的语言写下来并与其他人讨论是一个好主意,这样你就可以发现可能的缺陷。这些是我发现在解决问题时很重要的一些技巧,下面是一些提高这些技巧的建议。
- 要主导正式空间,参考主要学习,做一个自学者。课程和博文不够正规。还有,不要让别人代替你发现一切。
- 主要思路简单,数量少。它们只是被复杂的形式语言包裹着,你要努力抓住它们背后简单的直觉。
- 为了避免对现有的想法和解决方案产生偏见,首先要思考,然后参考文献。此外,使用你自己的个性化语言和符号,因为语言是基础,思想是以语言为基础的。

科学的艺术
数据科学
创造有洞察力和美丽的生物信息学可视化
有一种误解,认为科学是枯燥的,没有幽默感的,过于技术化的,但事实并非如此!有效的可视化可以将原始 DNA 转化为清晰传达大量信息的惊人图形。
Biopython 是 python 的开源生物信息学或计算分子生物学包。它提供自定义的类和方法,解析标准的生物文件格式,并与其他生物信息学程序接口,如 BLAST 、 EMBOSS 或 Clustalw 。就本文的目的而言,它可以使用生物数据创建惊人的视觉效果。
我们将从 Biopython 处理 DNA、RNA 和蛋白质序列的方法开始。然后,我们可以使用这些方法来提高整个基因组的复杂性,以及这些基因组如何通过系统进化树可视化随时间变化。这一过程将允许你探索任何你感兴趣的基因组,并开始从原始数据中获得洞察力!
顺序
Biopython 有一个 Seq (Sequence)基类,类似于基本的 Python string 类,但是增加了一些方法来方便相关的生物学用例。例如,我们可以载入 DNA 序列。
>>> my_sequence = Seq('AGTCC')
我们可以对这个对象使用传统的字符串方法,比如迭代字符串中的每个字母,或者使用 len()获得字符串的长度。
# Print length
>>> print(len(my_sequence))
5# Print each basepair in the sequence
>>> for basepair in my_sequence:
>>> print(basepair)
A
G
T
C
C
我们也可以通过它们的索引来选择碱基对,并正常地对序列进行切片。切片会返回一个新的 Seq()对象,可以存储在一个新的变量中,也可以覆盖原来的序列。
# Select basepair by index
>>> my_sequence[2]
'T'# Slice sequence (returns a new Seq() object)
>>> my_sequence[1:4]
Seq('GTC')
现在我们将看看 Seq()类中一些更有趣和生物学上有用的方法。我们可以很容易地生成 DNA 序列的互补和反向互补,并计算出序列中 G 和 C 碱基对的比例。
补码
当 DNA 被复制时,每条链都被分离出来,用来构建另一条链。腺嘌呤(A)和胸腺嘧啶(T)是互补的,鸟嘌呤(G)和胞嘧啶(C)是互补的。所以一个“ACTG”序列会有一个互补的“TGAC”序列。在 RNA 中,碱基尿嘧啶(U)被用来代替胸腺嘧啶(T ),因此在转录过程中读取的“ACTG”DNA 序列将产生“UGAC”的 RNA 序列。
>>> my_sequence = Seq('AGTCC')# Generate complement sequence
>>> my_sequence.complement()
Seq('TCAGG')
反向补码
在转录过程中,DNA 实际上是从运行 3’→5’的模板链中读取的,反向互补给出了 mRNA 序列。然而,我们通常从运行 5’→3’的编码链中分析 DNA。
虽然生物过程实际上是两步走的,首先是模板链的反向互补,然后转录成 RNA。我们可以简化这个过程,从编码链开始,用 T 碱基对代替 u 碱基对。
# Generate reverse complement sequence
>>> my_sequence.reverse_complement()
Seq('GGACT')# Two step solution from template strand
>>> coding_strand = Seq('ATGTAG')
>>> template_strand = coding_strand.reverse_complement()
>>> template_strand.reverse_complement().transcribe()
Seq('AUGUAG')# From coding strand
>>> coding_strand = Seq('ATGTAG')
>>> coding_strand.transcribe()
Seq('AUGUAG')
气相色谱含量
Biopython 还能够计算 DNA 或 RNA 序列中 GC 碱基与 AT(或 U)碱基的比例。这在生物学上是相关的,因为 GC 含量在物种之间是不同的,因此它可以用于根据已知物种的 GC 含量来鉴定未知基因组。
在基因组中,编码区(通常是基因)通常比非编码区具有更高的 GC 含量。因此,GC 含量可用于鉴定未知基因组中的基因。
# Calculate GC proportion
>>> from Bio.SeqUtils import GC
>>> GC(my_sequence)
60.0
翻译
既然我们已经从 DNA 中生成了 mRNA,我们需要翻译成真正的蛋白质序列!与转录非常相似,Biopython 提供了几种方法来实现这一点,要么是生物学上正确的方法,要么是从编码链 DNA 中更有效地实现。
# In the biologically correct way after creating the mRNA sequence
>>> mRNA = Seq('AUGGCCAUUGUA')
>>> mRNA.translate()
Seq('MAIV')# From the coding strand directly
>>> coding_strand = Seq('ATGGCCATTGTA')
>>> coding_strand.translate()
Seq('MAIV')
值得注意的是,不同的分类组需要不同的表来正确地从 mRNA 合成蛋白质序列。点击这里查看 NCBI 遗传密码资源。关键字参数可以在。translate()方法-。例如,translate(table = "脊椎动物线粒体")。
基因组数据
既然我们已经了解了序列如何在 Biopython 中工作,让我们进入一个更高的层次,并尝试可视化整个基因组。有一个叫做 GenomeDiagram 的模块,专门用于在线性或圆形图中可视化基因组(对于大多数原核生物)。
Biopython 有几个示例基因组,可以从 GitHub 下载。感兴趣的基因组也可以从 NIH 基因序列数据库 GenBank 下载,有多种文件格式(如。gbk 或者。fasta)。
# Import Libraries
from reportlab.lib import colors
from reportlab.lib.units import cm
from Bio.Graphics import GenomeDiagram
from Bio import SeqIO
from Bio.SeqFeature import SeqFeature, FeatureLocation# Read in our genome
record = SeqIO.read("NC_005816.gb", "genbank")gd_diagram = GenomeDiagram.Diagram(record.id)
gd_track_for_features = gd_diagram.new_track(1, name="Annotated Features")
gd_feature_set = gd_track_for_features.new_set()# We can color code every other gene for clarity
for feature in record.features:
if feature.type != "gene":
# Exclude this feature
continue
if len(gd_feature_set) % 2 == 0:
color = colors.blue
else:
color = colors.lightblue
gd_feature_set.add_feature(
feature, sigil="ARROW", color=color, label=True, label_size=14, label_angle=0)# We can add in restriction sites for some popular enzymes
for site, name, color in [
("GAATTC", "EcoRI", colors.green),
("CCCGGG", "SmaI", colors.orange),
("AAGCTT", "HindIII", colors.red),
("GGATCC", "BamHI", colors.purple)]:
index = 0
while True:
index = record.seq.find(site, start=index)
if index == -1:
break
feature = SeqFeature(FeatureLocation(index, index + len(site)))
gd_feature_set.add_feature(
feature,
color=color,
name=name,
label=True,
label_size=10,
label_color=color)
index += len(site)# Create our diagram!
gd_diagram.draw(
format="circular",
circular=True,
pagesize=(20 * cm, 20 * cm),
start=0,
end=len(record),
circle_core=0.5)# Can save to any standard photo format
gd_diagram.write("plasmid_circular_nice1.png", "PNG")
现在我们可以开始制作一些漂亮的可视化效果了!这里我们看到了鼠疫耶尔森氏菌生物变种田鼠的基因组,这是一种作为疫苗开发的淋巴腺鼠疫无毒菌株。基因以蓝色和浅蓝色显示,限制性酶位点用彩色线标出。

作者图片
可视化一个更复杂的基因组,一个水芹(拟南芥)叶绿体,显示出更多的基因和几十个 EcoRI 限制性位点。这个基因组有 154478 个碱基对,而上面只有 9609 个碱基对。

图片由 Brona 在维基百科上以 CC BY-SA 3.0 授权提供。
这是一种水芹。它是遗传学中的模式生物。因此,我们可以使用与上述相同的基本代码从 GenBank 中指定基因组,以生成环状 DNA 序列。
# Specify the thale cress chloroplast genome
record = SeqIO.read("NC_000932.gb", "genbank")...# Only including the EcoRI sites (green)
for site, name, color in [("GAATTC", "EcoRI", colors.green)]:
...

作者图片
这大概是一个基因组能够以任何清晰的方式呈现信息的最复杂程度了。但是,它也很有视觉冲击力。事实上,如果我们回去添加更多的限制性酶位点,就像我们在第一个基因组中所做的那样,我们会得到一个更加美丽的图像。
...for site, name, color in [
("GAATTC", "EcoRI", colors.green),
("CCCGGG", "SmaI", colors.orange),
("AAGCTT", "HindIII", colors.red),
("GGATCC", "BamHI", colors.purple)]:...

作者图片
发展史
现在我们已经从原始 DNA 序列到完整的基因组,我们知道基因组并不像我们希望的那样稳定。突变很频繁,尤其是在病毒中。开发病毒疫苗的一个主要困难是它们频繁变化的基因组。
我们可以通过比较新序列和基本序列来追踪变异是如何随着时间的推移而产生的。对于新型冠状病毒(新冠肺炎)病毒,碱基序列是来自中国武汉的初始毒株。
使用另一种可视化系统发育的工具, Nextstrain 有几个软件包,允许公共卫生官员和研究人员分析当地社区的新冠肺炎新菌株。然后,您可以为各种特征构建动画视觉效果,例如突变数量、原产国、基因型、分支等。
你可以遵循这个指南来创造你自己的新冠肺炎发展史。您将需要为 Nextstrain 创建一个新的 conda 环境(在指南中有介绍),因为您将下载许多依赖项。

1-5 月 SARS-cov-2 的系统发育。用 Nextstrain 的 Auspice 可视化工具生成。作者 GIF。
结论
Biopython 是 python 中生物信息学的基础包。我希望这篇文章已经让我们领略了它在分析序列、转录和翻译 DNA → mRNA →蛋白质序列、可视化整个线性和环形基因组以及可视化染色体方面的作用。将来我可能会发布更多利用 Biopython 的文章。
Biopython 拥有大量的文档,并能够通过 FASTA 文件利用 NCBI 资源,如完整基因组、变异菌株基因组和染色体。因此,玩玩感兴趣的基因组,看看你能做什么!你可能最终会得到一个有效的、令人惊叹的可视化效果。
连接
我一直在寻找连接和探索其他项目!你可以在 GitHub 或 LinkedIn 上关注我,并在媒体上查看我的其他故事。我也有一个推特!
机器学习的 Sprezzatura 艺术
模型可解释性
构建可解释模型概述

Sprezzatura 是一门让事物看起来自然而精致的艺术。在上图中,Karan 小心翼翼地让羊角面包看起来很自然。同样,将机器学习模型转化为少量规则也需要努力。相反,数据科学家建立了 107 个模型的复杂集合,以赢得网飞推荐内容。我们看到深度学习模型拥有 100%的准确率,当仔细检查时,它们充满了方法上的缺陷。
这篇文章试图将 sprezzatura 的艺术应用于机器学习。除了获得风格,您的模型将更容易理解,被广泛采用,并且易于部署。
这篇文章的大部分评估了可解释模型的四种通用方法,从最灵活和精确的方法开始,到最简单的方法。其中一些接近黑盒 AutoML 集合模型的性能!这些方法包括 rulefit 算法、GA2M(广义加法模型加交互)算法、规则列表算法和记分卡方法。成人数据集被用作基准。最终结果的一个潜在峰值显示在该图中。

作者图片
剧透警告:其中两种可解释的方法与由 20 个独立模型组成的叠加系综 AutoML 模型的结果相同或略低!
该职位的结构:
- 为什么要使用可解释的模型
- 构建基线模型
- 规则拟合算法
- GA2M 算法
- 规则集模型
- 记分卡模型
我写这篇文章的动机是作为一名长期关注模型可解释性和可解释性的数据科学家。你也可以在圣路易斯机器学习和数据科学会议上找到这个演讲的视频。您还可以访问笔记本,在 rulez Github 中可以找到运行这些可解释模型的完整代码。
为什么要使用可解释的模型
大多数数据科学家都不熟悉可解释的模型。它们被定义为建模方法的子集,强调特征的稀疏性和理解这些特征如何相互作用以产生预测的能力。因此,这些模型更容易调试,非技术业务利益相关者和监管者也更容易信任它们。另一个意想不到的好处是,更简单的模型通常更容易操作!
构建模型涉及几个步骤,包括问题设置、标注数据、特征工程、特征选择、算法选择和实施。这篇文章(以及许多数据科学文献)关注的是算法选择。实际上,构建可解释的模型和解决方案需要这里提到的所有步骤,而不仅仅是选择正确的算法。例如,多重共线性对模型的可解释性有很大的影响。因此,虽然这篇文章关注的是算法选择,但让我们指出模型选择只是解决方案的部分。
阅读学术文章,你会认为算法选择是数据科学家工作的主要焦点。这种工作流强调通过预测准确性衡量的增量改进。类似地,Kaggle 风格的模型比赛强调通过提高准确性来获胜,然而,轻微的改进。虽然准确性无疑是重要的,但其他问题,如可解释性,也会受到影响。
首先,最精确的模型通常在企业环境中不可用。赢得 T4 100 万美元网飞竞赛的模特是其他 107 个模特的组合。虽然这个模型在准确性上是最好的,但对网飞来说太复杂了,难以实现。
其次,这些复杂的模型很难解释。实际上,这意味着受模型影响的涉众不信任他们不理解的模型。在受监管的企业中,模型风险管理团队的重点是管理机器学习模型的风险,他们拒绝批准复杂的模型。太多的失败可以归咎于黑盒模型,这些模型后来被发现有简单的缺陷,如目标泄漏。最后,在数据移动的情况下,复杂的模型可能是脆弱的和不可用的。当数据转移成为一个问题时,可理解的模型更容易诊断和修改。
另一种选择是从一个可解释的模型开始。让我们考虑一个实际问题,然后应用可解释的模型。
问题:预测收入
让我们使用来自 UCI 的成人数据集直接比较复杂和简单的方法。这是一个公共领域数据集,用于根据人口统计和税收信息预测收入。该数据集包含超过 30,000 个观察值,并且包含连续特征和分类特征的混合。这些特征具有共线性和交互作用。其大小和复杂性类似于企业环境中的许多表格数据集。
基线模型
第一步是建立几个基线模型。这是建模时的一个重要步骤(有时会被忽略)。基线让你更好地理解你在一个模型中有多少信号,什么特征是重要的,以及其他算法提供了多少提升。所有这些都是有用的数据点,可以帮助您理解应该投入多少精力来改进您的模型。
当您开始计算您的基线时,您应该已经对最终模型的需求有了一些期望。您的业务合作伙伴应该帮助您了解为组织带来价值所需的预测性能、围绕部署的要求以及模型审查过程的严格程度。
首先,我将使用三种不同的算法作为基线。是的,三个!都有不同的用途,都用好就好。它们是逻辑回归、自动堆叠集成和 OneR 基于规则的模型。
逻辑回归
用成人数据集预测收入是一个分类问题。我建议基线模型的合适起点是逻辑回归模型。逻辑回归的加法性质很容易理解,并为我们提供了一个众所周知的与其他算法进行比较的基准。
对于这个数据集,我使用开源 H2O 包用几个命令构建了一个逻辑回归(LR)模型:
glm_model = H2OGeneralizedLinearEstimator(family= "binomial", lambda_ = 0, compute_p_values = True, remove_collinear_columns = True)
glm_model.train(x, y, training_frame= train, validation_frame=valid)
我构建了两个模型,一个是仅使用数字特征的非常简单的逻辑回归,另一个是使用分类和数字特征的更复杂的逻辑回归。在这种情况下,添加分类特征确实明显改善了模型。
模型结果:
- LR (6 个数字特征):AUC 为 0.83 的逻辑回归模型。
- LR (6 个数字和 6 个分类特征):分类特征的一个热编码导致 100 个逻辑回归模型的预测值,AUC 为 0.91。
逻辑回归模型通常被认为是容易理解的,并且被广泛认为是非常容易解释的。这些系数可以一起用于计算预测。这种透明度是 LR 在受监管行业中被广泛接受的一个重要原因。
逻辑回归模型的透明性经常导致人们认为它是一个容易理解的模型。然而,情况并非总是如此。添加大量要素,尤其是存在多重共线性时,会使理解逻辑回归模型变得非常困难。Poursabzi-Sangdeh 的研究发现,从 2 个特征增加到 8 个特征对模型的可理解性有显著影响。因此,虽然系数是有帮助的,但当目标是一个容易理解的模型时,它们不是灵丹妙药。
自动堆叠系综
AutoML 允许我们快速比较不同类型的特征工程和算法。我用 H2O 的汽车制造了一个挑战者。
aml = H2OAutoML(max_models=20, seed=1)
aml.train(x=x, y=y, training_frame=train)
模型结果:
- AutoML H2O:最佳模型是所有 20 个模型的叠加组合,AUC 为 0.93。
这是一个非常精确但复杂的结果。一个由 20 个模型组成的堆栈集合包含了每一个预测的数万个决策点。虽然解释方法可以让您很好地理解模型可能会做什么,但大多数模型风险评估都无法通过这种方法。这简直太复杂了。然而,这给了我们一些预测性能上限的概念。
无比的人
OneR 使用一个特征建立一个模型。它非常容易理解,也非常简单。它基本上是只有一个分支的决策树。该模型通过查看所有特征并为最终模型选择一个特征来工作。你可以找到 R 和 python 的 OneR 的多种实现。
from imodels import OneRClassifier,clf = Pipeline(steps=[('preprocessor', preprocessor),
('classifier', OneRClassifier())])
clf.fit(X_train, y_train)
在成人数据集上运行这个给了我们一个简单的规则:
如果资本收益大于 5178 美元,那么这个人极有可能是高收入人群。
该模型比随机模型好,但比我们的其他基线模型差,AUC 为 0.60。OneR 是一个很好的检查基准,可以防止目标泄漏。在某些情况下,您可能会从一个特性中发现足够的启发,部署一个简单的规则比部署一个更复杂的模型更有用。
基线摘要
在特征数量、模型复杂性和预测性能之间的权衡应该是相当明显的。

作者图片
这里的复杂性是一个说明性的数字,近似于模型中参数的数量。它旨在强调 OneR 与堆叠 AutoML 系综在复杂性上的差异。这使我们能够更好地理解提高预测性能和最终模型的复杂性之间的矛盾。
OneR 结果确定了不止一个特征是必要的。分别运行仅具有数字和分类特征的模型,很明显数字和分类数据都提供了有用的信号。当我们考虑用不同的方法来表示这些特性以及什么样的模型类型工作得最好时,这变得很重要。最后,我们看到复杂的算法和集成确实增加了一些提升。这暗示了数据中的一些复杂性,这些复杂性是我们当前的特征集所没有捕捉到的。这些线索可能会本能地促使数据科学家使用复杂的方法来解决问题。然而,让我们考虑一些更容易理解、部署和维护的替代方法。
规则匹配
Friedman 和 Popescu (2008) 的 RuleFit 算法是一个可解释的模型,能够提供高预测性能以及可理解的规则。它非常容易使用,并且有许多可用的实现。rulefit 算法创建一组重叠的规则。

H2O 最近增加了一个 rulefit 的实现,它很快成为我的最爱。让我们从使用 5 条规则构建一个简单的模型开始。
from h2o.estimators import H2ORuleFitEstimator# Build and train the model:
rfit = H2ORuleFitEstimator(max_num_rules=5,seed=1,
model_type='rules')
rfit.train(training_frame=train, x=x, y=y,validation_frame=valid)
接下来让我们向您展示模型创建的规则:

与逻辑回归模型类似,对于给定的预测,您需要确定与该预测相关的系数/规则。例如,当受教育少于 13 岁,资本收益少于 7031 美元,并且关系不是家庭内,其他亲属,自己的孩子,未婚时,上面的规则适用。这是在成人数据集中预测某人低收入的最强规则。
这个型号的性能不是很好。具有 5 个规则的 rulefit 在测试集上获得了 0.80 的 AUC 性能。可能的问题是,rulefit 是一种决策树方法,这意味着它会在连续数据中创建拆分。看看这些规则,你会发现其中既有绝对规则,如关系规则,也有连续规则,如资本收益规则。用五条规则,真的很难捕捉到那些连续的特征。
H2O 实现的一个很好的额外特性是将线性模型与决策树结合起来构建规则。这结合了两种模型的优势,使用了随着决策树不断变化的线性关系,决策树在宁滨和交互方面非常有效。通过加入线性成分,这是一个具有 5 条规则的规则拟合模型,实现了 0.88 的 AUC。

规则匹配结果,按作者排序的图像
线性规则很容易理解。例如,随着受教育程度和年龄的增加,预测高收入的概率也会增加。
这加强了这个数据集有很强的线性效应。通过添加线性效果,性能从 0.80 跃升至 0.88。任何只依赖少数决策树的方法都将在性能上受到限制。接下来,让我们改变规则的数量,并评估它们如何影响模型的性能。以下是一些结果:

作者图片
为了说明 Rulefit 的灵活性,我绘制了一系列具有 AUC 和复杂性的模型。OneR 的复杂度为 2,而具有 100 个预测器的 LR 的复杂度为 100。对于 Rulefit 模型,复杂性是规则数乘以 3(因为每个规则允许三个特征)。

作者图片
总之,H2O 的规则拟合通过使用决策树和线性关系提供了很大的灵活性。虽然使用大量规则可以让您获得非常高的预测性能,但是重叠的规则使得理解任何单个预测变得更加困难。这使得跟踪预测或诊断模型问题变得更加复杂。让我们考虑另一种开发稀疏模型的方法,这种模型仍然提供良好的预测性能。
GA2M
广义加性模型(GAM) 是一个可解释的模型,与逻辑回归模型一样透明,但可以更精确。一个 GA2M 模型是一个包含了交互项的 GAM。这个相互作用项的加入通常提高了预测性能。
我在 DataRobot 工作时了解到 GA2M 模型,它有一个优秀的实现。GA2M 的开源实现可以在微软的 interpretML 包中获得。让我们用成人数据集来探索这个问题。拟合模型很简单:
ebm = ExplainableBoostingClassifier(random_state=42)
查看带有成人数据集的模型对象,您将看到以下功能列表:
ebm.feature_names[‘age’, ‘workclass’, ‘fnlwgt’, ‘education’, ‘education_num’, ‘marital_status’, ‘occupation’, ‘relationship’, ‘race’, ‘sex’, ‘capital_gain’, ‘capital_loss’, ‘hours_per_week’, ‘native_country’, ‘relationship x hours_per_week’, ‘age x relationship’, ‘marital_status x hours_per_week’, ‘occupation x hours_per_week’, ‘education_num x occupation’, ‘age x capital_loss’, ‘fnlwgt x education_num’, ‘education x capital_loss’, ‘age x fnlwgt’, ‘occupation x relationship’]
GA2M 创建并选择一些交互特征用于模型中,例如“年龄 x 关系”。这个选择很有价值。我经常检查 GA2M 用来理解我的数据集的交互方式。即使我的最终模型不会是 GA2M,它仍然对识别交互非常有用。
对于成人数据集,这些交互特征提供了性能提升,AUC 为 0.93。这个真好!这与堆叠系综模型不相上下。
结果模型是透明的,所有系数都可用。甚至可以把一个等级表放在一起,列出一个因素的每个级别的系数因子。InterpretML 包还包括可视化,因此您可以自己看到这一点。这里我们看到婚姻状况的不同系数。

作者图片
总之,GA2M 模型从最好的线性模型开始,但也混合了结合最佳交互的能力。找到这些互动并不容易(你们都应该利用这些互动来传达自己对问题的理解)。通过添加这些交互作用,GA2M 通常可以提供非常好的预测性能。GA2M 使用系数和评级表是众所周知的做法,在模型风险管理实践和监管要求中被广泛接受。
规则列表
rulefit 算法依赖于重叠的规则集。这意味着几个规则可以影响一个预测。相比之下,规则列表被约束为没有任何重叠的规则。非重叠规则的优点是每个预测都可以追踪到一个规则。这使得结果非常容易理解。

钱丹·辛格—伊莫德尔斯
构建规则列表模型在计算上可能是昂贵的。规则列表还绑定了连续的特征,因此线性关系可能很难合并到规则中。最后,规则列表的当前实现限于分类问题。
实现规则列表的一个很好的起点是可解释的机器学习模型包(imodels)。我从一个众所周知的方法开始,certified Optimal RulE ListS(CORELS),但是在我的 Python 3.7+环境中安装时遇到了问题,而且它太慢了,只能在成人数据集上构建非常基本的规则列表。
我发现可扩展贝叶斯规则列表方法工作得更快。这只是一个过时的 R 包。我的测试使用成人数据集及其分类特征,以及 15,000 行的训练数据集。
sbrl_model <- sbrl(data_train, iters=30000, pos_sign="1",
neg_sign="0", rule_minlen=1, rule_maxlen=1,
minsupport_pos=0.003, minsupport_neg=0.003,
lambda=10.0, eta=1.0, nchain=10)
print(sbrl_model)
使用 rule_maxlen=1 运行这段代码只需要几秒钟。结果如下:

结果是按顺序读取的非重叠规则。这意味着任何人都可以识别哪个规则适用于他们的预测。理解任何预测的结果都会变得容易得多。
规则列表模型的 AUC 为 0.86,比 rulefit 发现的 5 个规则的 AUC 0.80 有了显著提高。然而,为了找到这个更好的解决方案,计算这个最佳规则集需要额外的计算。可以通过将 SBRL 模型的最大规则长度增加到 2 来提高性能。这将性能提高到 0.87 AUC。这确实会导致更复杂的规则:
如果{教育人数=(4.75,8.5),婚姻状况=已婚公民配偶},则正概率= 0.14173228
增加最大规则长度会增加搜索空间。移动到 2 的嵌线长度需要更长的计算时间。在我的笔记本电脑上无法计算规则长度 3。
这些规则的非重叠性对于部署期间的互操作性、错误检测和问题诊断来说是一个巨大的优势。但是请记住,计算这些规则是复杂的。然而,这些规则的简单性意味着它们在预测性能上往往落后于现代算法。
记分卡
一种常见的可解释的决策方法是使用记分卡。记分卡允许许多功能,预测分数基于简单的求和。它们非常容易使用,常见于医疗保健和刑事司法等领域。

作为记分卡的累犯预测的可解释模型。"优化的评分系统:医疗保健和刑事司法领域对机器学习的信任"接口 48,5 号(2018):449–466。
从机器学习中开发最佳记分卡在计算上具有挑战性。一个众所周知的技术是使用超解析线性整数模型(SLIM) 。在这篇文章中,我使用了 OptBinning 包中的记分卡函数。记分卡的分数范围从最低收入概率的 0 到最高收入概率的 100。

作者图片
相当简单的记分卡得出的 AUC 为 0.89。该模型非常接近使用所有特征(100 个预测值)的逻辑回归。然而,记分卡比逻辑回归系数更容易解释和部署。如果可解释性非常重要,记分卡方法非常有效。
后续步骤
为了提供一个总体视图,下面是预测性能与复杂性的结果和图表。重要的是要理解每种技术,rulefit、GA2M、规则列表和记分卡,都有其独特的权衡。我在 rulez githu b repo 上分享了代码,所以你可以全部尝试并做出相应的选择。

我希望这篇文章能给你的机器学习增加一点活力。花点时间去理解你的问题,处理你的数据,看看它是否适合一个更简单的可解释的模型。
有比这篇文章更广泛的可解释模型。还有其他流行的可解释模型,如贝叶斯方法,提供了预测的不确定性。超越莫尔纳尔的可解释性论文的一个很好的起点是钱丹的 imodels 包,它包含了许多不同方法的样本。
我收到了许多人的反馈,包括乔纳森·达尔伯格、泰勒·拉金、钱丹·辛格、迈尔斯·阿德金斯、戴夫·海尼克和尼尚特·甘地。所以非常感谢他们所有人。
你也可以在推特或 LinkedIn 上关注我,并在我的项目网站上找到以前的博客文章。
编写高效代码注释的艺术
数据科学任务代码注释的最佳实践

如果我们在 Jupyter 笔记本上运行import this,或者简单地打开这个链接,我们将得到Python 的禅,这是 Tim Peters 收集的 19 条 Python 设计指南的集合。其中一条说:“可读性很重要”,在这篇文章中,我们将讨论这个原则的一个方面:代码注释,它是包含在代码中的自然语言文本片段,用于它的文档。事实上,代码注释,加上干净的代码,变量和函数的正确命名,以及使代码尽可能清晰,对我们项目的可读性有很大的贡献。这不仅对将来阅读我们作品的人很有帮助,而且对我们自己也很有帮助。
在本文中,我们将关注注释应用于数据科学任务的 Python 代码的最佳实践。然而,这些准则中的大部分也适用于任何其他编程语言或领域。
语法和样式
在 Python 中,有两种类型的代码注释:块注释和内联注释。
根据 PEP 8 ,块注释以一个 hash ( #)开头,后跟一个空格,由一个或多个句子组成,第一个单词大写,每句话尾加一个句号。如果有几个句子,用两个空格隔开。块注释通过一个空行与上面的代码分开。它们适用于直接跟在它们后面的代码(没有空行),并且具有相同的缩进。
一长行块注释应该分散在几行中,每一行都以一个散列开头,后跟一个空格。用 Python 编写多行注释的另一种方式是使用多行字符串——那些嵌入在三个单引号或双引号中的字符串。从技术上讲,它们最初是为另一个目的而设计的:将文档分配给函数、方法或类。然而,如果不在这种质量中使用或不赋给变量,多行字符串不会生成代码,因此它可以作为 Python 中代码注释的一种非常规方式。这种方法得到了 Python 创始人吉多·范·罗苏姆在他的推特上的认可。
✔️
# Isolate the outliers with at least $3,500 spent per month except
# for the cases when the respondent hadn't attended any bootcamp or
# had been learning programming for a maximum 3 months before the
# survey.
above_3500 = usa[(usa['MoneyPerMonth']>=3500)\
&(usa['AttendedBootcamp']!=0.0)\
&(usa['MonthsProgramming']>3.0)]✔️
'''Isolate the outliers with at least $3,500 spent per month except for the cases when the respondent hadn't attended any bootcamp or had been learning programming for a maximum 3 months before the survey.
'''
above_3500 = usa[(usa['MoneyPerMonth']>=3500)\
&(usa['AttendedBootcamp']!=0.0)\
&(usa['MonthsProgramming']>3.0)]✔️
"""Isolate the outliers with at least $3,500 spent per month except for the cases when the respondent hadn't attended any bootcamp or had been learning programming for a maximum 3 months before the survey.
"""
above_3500 = usa[(usa['MoneyPerMonth']>=3500)\
&(usa['AttendedBootcamp']!=0.0)\
&(usa['MonthsProgramming']>3.0)]
一个行内注释被放置在它所注释的代码段的同一行上,用至少两个空格、一个散列和一个空格隔开。行内注释通常较短,应谨慎使用,因为它们往往会在视觉上与上下的代码行混在一起,因此变得不可读,如下面这段代码所示:
❌
ax.set_title('Book Rating Comparison', fontsize=20)
ax.set_xlabel(None) # remove x label
ax.tick_params(axis='both', labelsize=15)
plt.show()
不过,有时行内注释可能是不可或缺的:
✔️
colors = [[213/255,94/255,0], # vermillion
[86/255,180/255,233/255], # sky blue
[230/255,159/255,0], # orange
[204/255,121/255,167/255]] # reddish purple
请注意,在上面的代码中,行内注释的对齐有助于提高它们的可读性。
尽管代码注释语法的指导方针是为了使代码更具可读性和一致性,但我们应该记住,语言本身是不断发展的,样式约定也是如此。此外,一个公司(或一个特定的项目)可以有自己的编码风格方法,如果与 PEP 8 不同,那么优先考虑那些特定情况的建议。因此,有时官方的指导方针可以被忽略。但是,有些做法几乎总是应该避免的:
- 在注释前使用多个哈希
- 在注释的结尾也使用一个或多个散列
- 省略哈希和注释之间的空格
- 使用全部大写字母(我们稍后会看到一个例外)
- 在注释上方的一段代码后省略一个空行
- 在注释及其相关代码之间插入空行
- 忽略注释代码的缩进
这些方法是不可取的,因为它们用不必要的元素使代码变得混乱,降低了代码的可读性,并使区分不同的代码块变得困难。比较这些注释样式不同的相同代码:
❌
###REMOVE ALL THE ENTRIES RELATED TO 2021###questions = questions[questions['Date'].dt.year < 2021]
###CREATE A LIST OF TAGS###tags_list = list(tags.keys())✔️
# Remove all the entries related to 2021.
questions = questions[questions['Date'].dt.year < 2021]# Create a list of tags.
tags_list = list(tags.keys())
写有意义的评论
如果代码本身告诉计算机要做什么,那么代码注释是写给人类的,向他们解释这段代码到底是做什么的,特别是为什么我们需要它。关于“什么”,有一种普遍的观点认为,如果我们的代码尽可能显式和简单,如果我们对变量和函数使用自解释的名称,那么我们几乎根本不需要代码注释。尽管我同意编写易于理解的代码和仔细选择变量/函数名非常重要,但我认为代码注释也相当有用。
- 它们有助于将代码分成几个逻辑部分,使其更容易导航。
- 它们有助于解释很少使用的或新的方法/功能的功能。此外,如果我们必须应用不寻常/不明显的方法来编码,添加代码注释是一个好主意,因为当试图遵循更明确的方法时,可能会检测到一些 bugs 技术问题/版本冲突。
- 编写代码时,我们应该记住将来可能会阅读我们代码的人(例如我们的同事)。对一个人来说很清楚的事,对另一个人来说可能一点也不明显。因此,我们应该考虑到不同人在经验、技术和背景知识方面的潜在差距,并通过使用注释来促进他们的任务。
- 代码注释对于添加关于作者、日期和修改状态的信息很有价值(例如
# Updated by Elena Kosourova, 22.04.2021\. Added an annotation of the current year on the graph.)。
因此,代码注释是提高代码可读性和可访问性的快速而强大的方法,对于编写清晰而有意义的注释来说,仅仅成为一个好的编码员是不够的,成为一个好的作者也很重要,这本身几乎是一项需要学习的技能。
让我们考虑一些我们应该遵循的建议,以便有效地应用代码注释并防止过度使用。
避免明显的代码注释
我们的评论不应该脱离上下文陈述明显或清楚的事情。让我们再次记住,“证据”可能因人而异,我们工作的范围和目标受众也很重要(例如,如果我们正在编写一个关于数据科学的真实数据项目或一本学生手册)。我们的任务是找到平衡。
❌
# Import libraries.
import pandas as pd
import numpy as np
避免低效的代码注释
为了最大限度地发挥作用,我们的代码注释应该尽可能地精确和简洁,给出关于代码的所有必要细节,并排除任何不相关的信息,如对以前代码的观察、对未来的打算或括号。此外,由于代码通常暗示了一些动态(它做了,创建了,移除了,等等)。),一个好的做法是使用动词而不是名词:
❌ **Too vague**
# Select a specific type of columns.
characters = star_wars.iloc[:, 15:29]❌ **Too wordy**
# Now, let's select all the columns of a radio-button type from our dataframe.
characters = star_wars.iloc[:, 15:29]❌ **Observations from the previous code**
# Select radio-button type columns, as done earlier for checkbox type ones.
characters = star_wars.iloc[:, 15:29]❌ **Using a noun instead of a verb**
# Selection of radio-button type columns.
characters = star_wars.iloc[:, 15:29]✔️ **Good**
# Select radio-button type columns.
characters = star_wars.iloc[:, 15:29]
更新代码注释
这是一个棘手且非常常见的陷阱,但我们应该始终记住,当代码发生变化时,也要对代码注释进行所有必要的修改。正如 PEP 8 所说,“与代码相矛盾的注释比没有注释更糟糕”。更重要的是,有时我们不仅要检查与被修改的代码相关的代码注释,还要检查其他可能被这种修改间接影响的代码注释。
要使用的语言
一种常见的做法是始终用英语编写代码注释。然而,这是在某些情况下可以忽略的规则之一:如果我们绝对确定我们的代码永远不会被不讲我们的语言(或任何其他通用语言)的人阅读,那么我们最好完全用那种语言写注释。在这种情况下,对于我们特定的目标受众来说,代码变得更容易理解。
注释掉部分代码
有时,在一个项目中,我们发现为同一任务或调试代码测试几种方法是有用的,然后我们可以决定保留一些测试过的部分,即使我们在最后选择了另一个,以防万一。然而,这种方法只是暂时的,在项目的最终版本中,清除这样的碎片是很重要的。事实上,对于那些将来会阅读这些代码的人(包括我们自己)来说,这可能会让他们分心。读者可能会开始怀疑被注释掉的代码在任何一步是否有用,以及它是否应该保留在项目中。为了避免这种混乱,最好删除所有注释掉的代码。
像往常一样,这种最佳实践可能存在非常罕见的例外。比方说,我们的工作是展示获得相同结果的不同方法,一种方法比另一种方法更可取(仍然可行,但使用较少)。在这种情况下,我们可以关注 main 方法,并将第二个方法显示为注释掉的代码,并带有相应的注释。此外,这里我们可以使用前面提到的另一个例外,在代码注释中使用大写字母,以使其更加清晰可见:
✔️
# Create a stem plot.
plt.stem(months.index, months)# # ALTERNATIVE WAY TO CREATE A STEM PLOT.
# plt.vlines(x=months.index, ymin=0, ymax=months)
# plt.plot(months.index, months, 'o')
结论
总而言之,代码注释是一种方便的技术,可以向其他人传达我们用于编码的方法以及它们背后的原因。它提高了整体代码的可读性,并使在不同的逻辑块之间导航变得更加容易。为了在 Python 中创建有意义的代码注释,我们必须遵循简单明了的技术准则,牢记可能的本地公司或项目特定的约定,使我们的注释尽可能简洁和信息丰富,在代码修改时更新它们,最后但同样重要的是,避免过度使用它们。
感谢阅读!
如果你喜欢这篇文章,你也可以发现下面这些有趣的:
https://python.plainenglish.io/the-little-prince-on-a-word-cloud-8c912b9e587e https://medium.com/geekculture/creating-toyplots-in-python-49de0bb27ec1 https://medium.com/mlearning-ai/11-cool-names-in-data-science-2b64ceb3b882
你要找的关于 PCA 和 LDA 的文章!!
直觉、基础数学和更多…
由 Chandan Durgia 和 Prasun Biswas 撰写

来源:Unsplash 来自 Devin Avery
说实话,随着 AI/ML 世界的日益民主化,这个行业中的许多新手/有经验的人都操之过急,缺乏底层数学的一些细微差别。
这也很容易理解。AI/ML 世界对任何人来说都是势不可挡的,原因有很多:
a.一个人必须学习不断发展的编码语言(Python/R),大量的统计技术,并最终理解这个领域。
b.人工智能/人工智能技术的发展速度令人难以置信。最近在某处读到,每天都有大约 100 篇 AI/ML 研究论文发表。
c.如果你没有特定的背景,基础数学可能会很难。不幸的是,这不适用于像神经网络等复杂的主题。对于回归、分类问题、降维等基本概念也是如此。
通过这篇文章,我们打算至少一劳永逸地选择两个广泛使用的主题:
-主成分分析
-线性判别分析
这两个主题都是“降维技术”,并且有一些相似的数学基础。我们之前在一篇单独的文章中已经介绍过 t-SNE(https://prasunbiswas90.medium.com/improving-convolution-neural-networks-cnn-accuracy-using-t-sne-a4222d306d8)。
当人们想到降维技术时,有几个问题会出现:
a)为什么要降维?降维是什么意思?
b)线性代数与降维有什么关系?
c)为什么我们需要做线性变换?
d)特征值和特征向量与降维有什么关系?
e)根据变换的级别,是否可能有多个特征向量?
f)LDA 和 PCA 的目标有何不同,它如何导致不同的特征向量集?
g)除了我们讨论的内容之外,PCA 还有其他内容吗?我们要选择所有的主要成分吗?
h)除了使用散布矩阵之外,LDA 的计算类似吗?
I) PCA 与 LDA 的主要区别?什么时候该用什么?
还有更多…
我们试图用最简单的方式回答这些问题。如果您觉得任何特定的概念需要进一步简化,请随时回复这篇文章。
让我们开始吧。
A) 为什么要降维?降维是什么意思?
当数据科学家处理具有大量变量/特征的数据集时,有几个问题需要解决:
a)由于要执行的功能太多,代码的性能变得很差,特别是对于像 SVM 和神经网络这样需要很长时间训练的技术。
b)许多变量有时不会增加多少价值。
降维是一种用于减少独立变量或特征数量的方法。
下图描绘了我们练习的目标,其中 X1 和 X2 概括了 Xa、Xb、Xc 等的特征。

作者图片
B)线性代数与降维有什么关系?
人们可以把这些特征看作是坐标系的维度。

作者图片
*4 功能图是说明性的
虽然目标是减少特性的数量,但这不应该以降低模型的可解释性为代价。即自变量可以解释多少因变量。因此,应该通过以下约束来减少维度——“数据集中各种变量的关系不应受到显著影响。”
这就是线性代数介入的地方(深呼吸)。简而言之,线性代数是一种从各种角度看待坐标系中任何数据点/向量(或数据点集)的方法。
我们来解码一下。
考虑 A 点和 B 点为(0,1),(1,0)的坐标系。现在,为了从不同的透镜(坐标系)可视化该数据点,我们对坐标系进行以下修正:
a)旋转
b)拉伸或挤压

作者图片
正如你在上面看到的,新的坐标系被旋转了一定的角度并被拉伸。请注意,它仍然是相同的数据点,但我们改变了坐标系,在新的坐标系中,它位于(1,2),(3,0)。
如果仔细分析,两种坐标系都具有以下特征:
a)所有线路保持线路状态。即曲线中的线条没有变化。
b)原点(0,0)保持不变。
c)拉伸/挤压仍然保持网格线平行且间隔均匀。
这就是线性代数或线性变换的本质。
每当进行线性变换时,它只是将一个坐标系中的向量移动到一个新的坐标系中,该坐标系被拉伸/挤压和/或旋转。
其实以上三个特征就是一个线性变换的性质。值得注意的是,由于这三个特征,尽管我们正在移动到一个新的坐标系,一些特殊向量之间的关系不会改变,这是我们将利用的部分。
有趣的事实:当你将两个向量相乘时,它具有旋转和拉伸/挤压的相同效果。
C) 为什么我们需要做线性变换?
线性变换有助于我们实现以下两点:
a)从不同的角度看世界,这会给我们带来不同的见解。
b)在这两个不同的世界中,可能有某些数据点的特征相对位置不会改变。
对于上面的#b,考虑下面有 4 个向量 A、B、C、D 的图片,让我们仔细分析转换给这 4 个向量带来了什么变化。

作者图片

作者图片
所以,向量 C 和 d 发生了有趣的事情,即使有了新的坐标,这些向量的方向保持不变,只是长度变了。
为神奇的部分做好准备!!
如果我们能够设法将这个 2 维空间中的所有(大部分)向量(特征)与这些向量之一(C 或 D)对齐,我们将能够从 2 维空间移动到一维空间的直线。
瞧,降维成功!!
这个过程也可以从一个大维度的角度来思考。也就是说,如果我们的数据是 3 维的,那么我们可以将它简化为 2 维的“平面”(或一维的线),如果我们有 n 维的数据,我们可以将其简化为 n-1 维或更小的维。
请注意,在现实世界中,不可能所有矢量都在同一条直线上。因此,对于不在线上的点,取其在线上的“投影”(详情如下)。通过投射这些向量,虽然我们失去了一些可解释性,但这是我们需要为降维付出的代价。同样,可解释性是自变量可以解释因变量的程度。
D)特征值和特征向量与降维有什么关系?
旋转特性不变的这些矢量(C&D)称为本征矢量,这些矢量被缩放的量称为“本征值”。正如您从上面的描述中所看到的,这些是降维的基础,并将在本文中广泛使用。
C = 3 的特征值(向量增加了原来大小的 3 倍)
D = 2 的特征值(向量增加了原来大小的 2 倍)
关键是,如果我们能够定义一种方法来找到特征向量,然后将我们的数据元素投影到这个向量上,我们就能够降低维度。
特征向量的关键特征是,它保持在其跨度(线)上,不旋转,它只是改变大小。即,对于任何特征向量 v1,如果我们应用变换 A(旋转和拉伸),那么向量 v1 仅通过因子λ1 进行缩放。这里λ1 称为特征值。

E)根据变换的级别,可能有多个特征向量吗?
是的,根据变换的级别(旋转和拉伸/挤压),可能有不同的特征向量。因此,根据我们分析数据的目标,我们可以定义转换和相应的特征向量。请注意,练习的“目标很重要,这也是 LDA 和 PCA 存在差异的原因。
F)LDA 和 PCA 的目标有何不同,它们如何导致不同的特征向量集?
对于 PCA,目标是确保我们尽可能地捕捉我们的自变量的可变性。在下图中,我们可以看到数据在某个方向上的可变性。请注意,我们的原始数据有 6 个维度。这只是二维空间中的一个说明性的图形。

作者图片
使用协方差矩阵获取多个值的“可变性”度量。在我们的例子中,输入数据集有 6 维[a,f],覆盖矩阵的形状总是(d * d ),其中 d 是特征的数量。

作者图片
这里,协方差计算如下:

其中 N 是观察次数。
这就是我们计算特征向量的矩阵。
另一方面,线性判别分析(LDA)试图解决“监督”分类问题,其中目标不是理解数据的可变性,而是最大化已知类别的分离。在 LDA 中,协方差矩阵被散布矩阵“替代”,散布矩阵实质上捕捉了“类间”和“类内”散布的特征。
G)PCA 还有比我们讨论的更多的内容吗?我们要选择所有的主要成分吗?
还有一些额外的细节。因此,在这一节中,我们将在我们到目前为止讨论过的基础上进一步深入。
那么,让我们将它端到端地分解开来:
a.假设数据集包含 6 个要素。如前所述,这意味着数据集可以在 6 维空间中可视化(如果可能)。为了便于说明,我们假设这个空间看起来像:

作者图片
b.为了降低维数,我们必须找到这些点可以投影的特征向量。因为这里的目标是捕捉这些特征的“变化”,所以我们可以计算协方差矩阵,如上面#F 中所描述的。
c.现在,我们可以使用下面的公式来计算这个矩阵的特征向量(EV1 和 EV2)。请注意,PCA 是以第一主成分占数据中最大可能方差的方式构建的。然后,因为它们都是正交的,所以一切都是迭代的。
****
作者图片
为什么特征向量是垂直的?
如果使用的矩阵(协方差矩阵或散布矩阵)在对角线上对称,则特征向量是“实数”和“垂直的(正交)”。否则,特征向量将是“复数虚数”。
将任何矩阵转换成对称矩阵的方法是将其乘以其转置矩阵。在后面的部分中,在计算散布矩阵时,我们将使用它将一个矩阵转换成对称矩阵,然后再导出它的特征向量。
d.一旦我们从上面的等式中得到特征向量,我们就可以将数据点投影到这些向量上。为了简单起见,我们假设二维特征向量。

作者图片
注意,当把一个矢量投影到一条直线上时,它失去了一些可解释性。即,对于上图中的向量 a1,其在 EV2 上的投影是 0.8 a1。这就是主成分被写成单个向量/特征的某个比例的原因。
EV1 = PC1 = a1 * 0.8+a2 * 0.9+a3 * 0.78…
值得注意的一点是,计算的特征向量之一将自动成为数据的最佳拟合线,而另一个向量将与其垂直(正交)。
e.尽管在上面的例子中,为了简单起见,选择了 2 个主分量(EV1 和 EV2)。对于具有 n 个向量的情况,n-1 个或更低的特征向量是可能的。根据练习的目的,用户可以选择考虑多少个主成分。这取决于一个人想要获得多少可解释性。使用碎石图也可以得出同样的结论。
Scree plot 用于确定在数据的可解释性中有多少主成分提供了“真实值”。“真实值”意味着添加另一个主成分是否会有意义地提高可解释性。在碎石图上,曲线斜率变平的点(“弯头”)表示分析中应使用的因子数量。

作者图片
H)除了使用散布矩阵之外,LDA 的计算类似吗?
与 PCA 不同,LDA 是一种监督学习算法,其目的是对低维空间中的一组数据进行分类。换句话说,目标是创建一个新的线性轴,并将数据点投影到该轴上,以最小的“类内”方差最大化“类间”的类可分性。见图三十
这在数学上可以表示为:
a)最大化类别可分性,即最大化均值之间的距离。即最大化两类平均值的差的平方。((平均值(a) — Mean(b))^2)
b)尽量减少每个类别中的差异。即最小化数据的传播。即(利差(一)^2 +利差(b)^二)

作者图片
注意,对于 LDA,从#b 到#e 的其余过程与 PCA 相同,唯一的区别在于#b 使用了散布矩阵而不是协方差矩阵。两种散布矩阵的公式都非常直观:
类间离差由下式给出:

其中 m 是完整数据的组合平均值,mi 是各自的样本平均值。
类内离差由下式给出:

其中 x 是单个数据点,mi 是各个类别的平均值。
直观上,这找到了类内和类之间的距离,以最大化类的可分性。
请注意,对于这两种情况,散布矩阵乘以它的转置。如前所述,矩阵乘以其转置使其对称。这样做是为了使特征向量是“真实的”和“垂直的”。
I) PCA vs LDA 的关键差异领域?什么时候该用什么?

作者图片

作者图片
希望这将清除一些讨论的主题的基础,你会有一个不同的视角来看待矩阵和线性代数向前发展。
就像他们说的,任何基本的东西的伟大之处在于它不局限于它被阅读的上下文。这是真正意义上的基础,人们可以在此基础上实现飞跃。
快乐学习!!
****免责声明:本文所表达的观点是作者以个人身份发表的观点,而非其各自雇主的观点。
增强工程师
思想和理论
一个几乎微不足道的训练技巧如何成为人工智能向自我监督学习转变的中心。
自从深度学习的早期,当我们仍然缺乏数据时,增强就已经存在了。这可能是书中最古老的把戏了。如果只需做一些改动,我就能把每张照片都变成一张“新”的,为什么还要凑合使用我数据集中的 20 张猫照片呢?我可以移动猫一点,缩放和裁剪,也许创建一个镜像,稍微旋转它,玩颜色直方图,瞧,我已经创建了一个新的猫图片!增强已经成为深度学习训练过程中不可或缺的一部分,以至于模型很少看到原始图片。事实上,模型很少两次看到相同的图片,因为每次需要向模型呈现图片时,它都会经历这样一种随机的转换组合,以至于我们使用相同的图片获得相同组合的机会实际上为零。为增强组合干杯!

猫的增强:旋转,缩放和裁剪,镜像,或者它们的组合。作者插图。
在所有这些使用中,我们假设即使我们改变了图像,我们所做的改变也不会影响它的本质。猫还是猫。或者,如果我们处理肺部的医学图像(CAT 扫描?),如果我们拍摄镜像,肿瘤仍然会在那里。通过使用同一张图片的多个增强来训练模型,并告诉它预测相同的结果,我们实际上是在教模型不受图片中技术变化的影响,这些变化不会改变其本质。
把增强向前推进一步,随之而来的突破是令人惊讶的。为什么只在训练期间增加?为什么不在球场上,在产品本身上这样做呢?如果该算法是为了识别肺部肿瘤,为什么只显示一张肺部照片?我们可以拍摄同一张 x 光照片(T7),稍微移动一下,缩放和裁剪,也许拍摄一张镜像,稍微旋转,改变颜色,并要求模特提供第二种意见。还有第三个。还有第四个。在这个过程的最后,我们将对所有的回答进行平均。事实证明,这种被称为测试时间增加的技巧,持续地将模型的性能提高了好几个百分点,为什么不呢?
标签已经够多了
深度学习的最新变化将增强放在了前沿和中心。这背后的原因是机器学习的圣杯——自我监督学习:没有任何标签的学习。事实上,这就是我们开始的地方,当时深度学习还处于起步阶段,数据匮乏。我们建立了自动编码器——将一张图片压缩成一个小的代表性向量,一个瓶颈,然后将其扩展回其完整大小的模型。我们会训练模型,使重建的图像尽可能与原始图像相似,并祈祷所有重要的图像信息都保留在瓶颈中,而不会指导模型保留什么是重要的。通过这种方式,我们能够在来自互联网各地的数百万张未标记图像上训练模型,这些模型只不过是将图像压缩到一个瓶颈向量(通常称为特征向量)中,然后将其提取回原始大小。

一个自动编码器架构。原始图像被压缩成瓶颈向量,然后被扩展回其原始大小。训练该模型,使得右边的黄色图片应该尽可能与左边的黄色图片相似。作者图。
直到第二阶段,我们才转向更小的带标签的数据集,它只包含几千张图像,其中只有几十张是猫,然后使用自动编码器将它们压缩成特征向量。相信这个向量也编码了图像是否包含猫的知识,并且它以一种比原始图像的像素更容易提取的方式被编码,这使我们认为我们能够训练一个不是特别渴望数据的非深度模型,也许只是一个普通的 SVM,将特征向量分类到不同的类别,然后知道图像是包含猫还是狗。
但是后来他们建造了金字塔。除了其他新世界奇迹,如谷歌的代码、亚马逊的仓库、苹果的 iPhone 和网飞的流媒体,还有一个名为 ImageNet 的项目,该项目拥有数百万张图像的数据集,这些图像被标记为一千种对象类型(包括数千张猫的图像!).这是亚马逊的在线贸易服务“土耳其机器人”在 2012 年制作的最大项目。因此,我们告别了自动编码器,开始训练深度模型,将图像直接映射到相应的类别,结果大大改善。

历年在 ImageNet 上训练和测试的不同模型的准确率。来源:paperswithcode.com
自 2012 年以来,大规模、公开、带标签的数据集的汇编已经将该领域的研究重新导向监督学习。鉴于那里是技术进步发生的地方,许多公司发起了收集和标记数据的大规模行动,有时是通过在第三世界国家雇用许多工人,这些工人几乎不做其他事情。例如,众所周知,Mobileye 的资产之一是从安装在汽车上的摄像头收集数据的机制,并使用位于斯里兰卡的指定团队标记数千万公里的道路行驶。然而,世界上大多数数据仍然是未标记的,只是坐在那里,等待一种知道如何使用它并击败标记数据算法的算法出现。
去年,2020 年,终于发生了。
这一领域的最新突破源于一种叫做对比损失的方法,在这种方法中,增强发挥了核心作用。这是一个两阶段的方法,工作方式类似于我们使用 autoencoder 的瓶颈向量。在第一阶段,我们训练一个模型,使用大量未标记的数据从每幅图像中生成高质量的特征向量,在第二阶段,我们使用有限的标记数据训练一个简单的(线性)模型来分类图像。
那么我们如何教会模型生成一个“高质量”的特征向量呢?首先,这样一个向量应该有什么特征?我们的一个见解是,我们希望有一个不受增强影响的矢量。我们之前说过,增强不会改变图像的本质,我们希望有一个不受图像中与其本质无关的技术变化影响的模型。与自动编码器不同,自动编码器必须在其瓶颈处对允许其使用与原始图像相同的像素来重建图像的一切进行编码,并且因此对任何可能的增强敏感,这里我们希望将同一原始图像的两个增强编码到同一特征向量中。
这导致了下面的训练方法:我们给模型两个图像, x 和x’,在它们以某种方式被增强之后。也许 x 是用原始图像旋转 90 度得到的,x’是通过改变颜色直方图得到的。该模型是一个神经网络(类似于自动编码器中的编码器),它从每幅图像中生成一个特征向量,比如说 y 和y’。我们不告诉模型在每个这样的特征向量中放入什么,但是训练损失函数强加了一个间接的要求——如果两个增强 x 和x’是从相同的原始图像生成的,我们希望两个特征向量 y 和y’非常相似。相反,如果两个增强是从两个不同的图像创建的,,我们希望它们的特征向量彼此不同。

SimCLR 插图。来源:谷歌 AI 博客
因此,每次训练迭代,我们给计算机一批不同的图像。我们对每张图像应用两种随机增强,创建图像对——在一些图像对中,两张图像来自同一张图像,模型学习吸引它们各自的特征向量,而在另一些图像对中,图像是使用不同的原始图像创建的,模型学习排斥它们的特征向量。本质上,模型学会忽略增强,并且仅将不受其影响的事物编码到特征向量中。与图像的本质有关的东西,而不是它的技术元素。
这种方法在过去的一年里获得了发展势头,如谷歌的sim clr【1】和BYOL【2】等作品带来了新的技巧,进一步改善了特征学习过程,每批图像中驻留的图像更少。最新的结果表明,如果我们将 ImageNet 数据集视为一组未标记的图像,并将其用于第一阶段的训练,那么在第二阶段,我们可以仅使用一小部分已标记的图像来达到与使用完全标记的 ImageNet 数据训练的模型几乎相同的性能。图表还显示,如果我们增加模型中参数的数量,对比学习方法会变得更好。我确信在接下来的几个月里,我们将会听到使用这种方法获得的新的 ImageNet 高度。

在 ImageNet 上获得的性能是标记的 ImageNet 图像比例的函数。BYOL 和 SimCLR 算法也以未标记的方式使用完整的 ImageNet 数据库。监督算法仅使用标记图像。来源: BYOL 论文。
找到增强(和异常)
那些在异常检测领域工作的人很早就意识到,没有 ImageNet 能够拯救他们,我们将永远不得不处理数据不足的问题,因为异常(例如,行李 x 光扫描中的枪支)就其定义而言,是一种很难在有机组织的数据集中发现的现象。为了解决这个问题,通常使用自动编码器。如果自动编码器在大量没有手枪的手提箱上被训练,并且突然需要将手枪的扫描编码到瓶颈向量中,那么它将很难做到这一点,因为模型从未被要求重建手枪的图像。因此,与“常规”图像不同,在图像包含手枪的情况下,重建图像和原始图像之间可能会有显著差异,如果是这种情况,我们可以向安全部门报警。这种方法在一定程度上起了作用,并在相当一段时间内成为探测异常的主要方法。
但是另一个令人惊讶的突破来自增强领域。对于大量未标记的数据,我们可以做的一件事是自动标记它,尽管是针对我们并不真正感兴趣的任务,例如“找到增强”。在这个游戏中,我们从(比方说)70 种可能性(例如,180 度旋转,90 度旋转,拍摄镜像,缩放和裁剪,或者什么都不做)的集合中通过单个随机增强传递图像;然后,我们将它呈现给模型,并要求它猜测哪个增强(在上述所有可能性中)应用于图像。这是一个虚构的分类任务,虽然它本身并不有趣,但它利用了未标记的数据,我们现在可以训练一个视觉模型来执行它。
被训练来玩这个游戏的模型不会总是设法检测到正确的增强。例如,如果图像是旋转对称的对象,例如从顶部观看的花,那么模型将很难检测到 90 度的旋转。如果这是一张猫的图像,那么相对容易检测出 90 度的旋转,但镜像图像仍然无法与普通图像区分开来。我们可以说,“发现增强”模型将具有某种混淆特征:一些增强将很容易被检测到,而另一些则不那么容易。
然而,在他们 2018 年的论文[4]中,Yitzhak Golan 和 Ran El-Yaniv 教授注意到,当一个掌握了“找到增强”的模型获得一个异常图像时,该模型会以一种完全不同于常规图像的方式感到困惑。换句话说,它的混淆签名是不同的。这就产生了一种检测异常的新方法:将可疑图像进行 70 次放大,看看模型能识别多少。如果可疑图像的混淆签名与平均混淆签名(从“常规”图像估计)相差很大,则发出警报并呼叫保安。令人惊讶的是,这种方法击败了以前使用的自动编码器。
增强工程师
深度学习的人感到自豪的是,他们不再为了告诉模型如何读取数据而进行特征工程,随着我们向自我监督学习过渡,我们也将使用越来越少的标签和标记。尽管如此,我们仍然在设计对解决这个问题至关重要的东西:增强本身。最终,如果我们的目标是区分不同类型的花,那么改变图像的颜色作为可能的增强将阻止特征向量包含关于花的颜色的关键信息。然而,如果我们的目标是区分“花”和“车”,那么这种增强工作得很好。如果我们的目标是发现肺部的恶性肿瘤,它也可能沿着它们的边界出现,那么裁剪掉图像的一部分将是错误的,因为这样我们也可能裁剪掉肿瘤,但是肺部的镜像图像将会很好地工作。我们需要明智地选择我们的增强集,以便不破坏我们希望执行的任务的图像的本质。

左:不同的增强类型。右:y 轴增强是否有助于执行沿 x 轴描述的分类任务。例如,如果我们想要建立一个花分类器,那么旋转是一个有用的增强,但是改变花的颜色就不那么有用了。如果我的任务是区分不同的动物,反过来也是正确的。来源:Tete Xiao 等人的论文《对比学习中哪些不该对比》[3]。
事实上,只要我们需要为对比学习编译正确的增强集,这仍然是监督学习的一种形式,不是吗?为了摆脱这一层,在训练算法中需要另一个阶段,它将自动决定哪一组增强适合于我的数据和期望的任务。在此之前,在去除了特征工程、标签和模型架构之后,我们仍然只剩下“增强工程师”的角色。
参考
[1]陈婷,西蒙·科恩布利斯,穆罕默德·诺鲁齐,杰弗里·辛顿。 SimCLR:视觉表征对比学习的简单框架。PMLR 2020arxiv
[2] Jean-Bastien Grill 等人(DeepMind)。引导你自己的潜能:自我监督学习的新方法。 NeurIPS 2020。[ arxiv ]
[3]永龙田,,本·普尔等.艾尔。(麻省理工,谷歌)。对比学习的好观点是由什么构成的? NeurIPS 2020 [ pdf
[4]伊扎克·戈兰,冉·亚尼夫。使用几何变换的深部异常检测。 NIPS 2018。[ arxiv
自动侍酒师——如何实现 HuggingFace Transformers 并构建搜索引擎
享受一些葡萄酒,现代自然语言处理,简单的代码,情节和破折号

贾斯汀·艾金在 Unsplash 上的照片
创建自动侍酒师
回到 2019 年 8 月,我将我的第一个自然语言处理(NLP)项目投入生产,并在我的网站上主持了自动侍酒师。使用 TensorFlow 1 和通用语句编码器,我允许用户描述他们理想的葡萄酒,并返回与查询相似的描述。该工具将葡萄酒评论和用户输入转换为向量,并计算用户输入和葡萄酒评论之间的余弦相似性,以找到最相似的结果。
余弦相似度是一种比较文档相似度的常用方法,因为它适用于词频等对分析非常重要的数据。它反映了单个向量维度的相对比较,而不是绝对比较。在本文中,我不会深入探究余弦相似性背后的数学,但我知道它是内积空间的两个非零向量之间相似性的度量。

自动侍酒师(RobotsDoDreams.com)
增强时间到了
虽然该模型仍然有效,但自 2019 年以来,自然语言处理取得了巨大进展。使用像 HuggingFace 的 Transformers 这样的工具,将句子或段落转换成可用于语义相似性等 NLP 任务的向量从未如此简单。使用最新的技术和语言模型重构我的代码将会使它更有性能。如果你是 NLP 新手,可以看看我的初学者教程。
在本教程中,我将解释如何使用拥抱脸变形金刚库、非度量空间库和 Dash 库来构建一个新的和改进的自动侍酒师。完整的代码和 GitHub 链接可以在文章的底部找到。
葡萄酒数据
葡萄酒数据来自在kaggle.com 上找到的葡萄酒评论数据集。原始数据包含大约 130,000 行数据,包括国家、描述、标题、品种、酒厂、价格和评级等列。
查看所有数据工程代码的原文。
将数据放入 dataframe 后,我删除了包含重复描述的行和价格为空的行。我还将数据限制在有超过 200 条评论的葡萄酒品种上。
通过排除少于 200 条评论的品种来减少数据,我得到了 54 种葡萄酒。在清除了空数据和重复数据之后,剩下 100,228 行。通过谷歌搜索剩下的品种,我可以添加一个颜色栏,这样用户就可以通过想要的葡萄酒颜色来限制他们的搜索。
导入依赖项和数据
很容易将数据连接并加载到 dataframe 中,因为它已经是一个 sqlite 文件。按照三个步骤加载库、数据和数据帧。
1.导入 pandas 和 sqlite3 库。
2。连接到 sqlite 文件。
3。将数据加载到熊猫数据框架中。
#*Import dependencies* import numpy as np
import pandas as pd
import sqlite3
from sqlite3 import Errorimport texthero as hero
from texthero import preprocessing
from sentence_transformers import SentenceTransformer, util
import nmslibimport time
import datetime *#Establish connection to sqlite database*
conn = sqlite3.connect("wine_data.sqlite")*#load the data into a pandas DataFrame*
df = pd.read_sql("select * from wine_data", conn)
注意,我还导入了将在教程中使用的其他库。我将更多地介绍他们。使用 pandas read_sql 函数生成一个使用原始 sql 的数据帧。请注意,数据集中有 16 列和 100228 行。

葡萄酒数据 df.head(3)
拥抱脸🤗变形金刚(电影名)
如果你在过去一年左右的时间里参与了自然语言处理(NLP)领域,你可能已经听说过 HuggingFace🤗。HuggingFace 是一个专注于 NLP 的人工智能和深度学习平台,目标是实现人工智能技术的民主化。他们精简和简化了应用和微调预先训练的语言模型。
Transformers 是一个开源库,具有一个模型中心,允许用户基于通用架构(如 BERT、XLM、DistilBert 等)实现最先进的深度学习模型...它构建在 PyTorch、TensorFlow 和 Jax 之上,并且已知在框架之间具有良好的互操作性。
他们刚刚发布了一个完整的课程,带你穿越拥抱脸生态系统。我强烈推荐它:
**https://huggingface.co/course/chapter1
使用 pip 安装库
$ pip install transformers
在这个例子中,我将使用distilBERT-base-un cased模型,因为它与我们的用例、语义相似性表现良好。它将文本转换成 768 维向量。如果你不想使用 distilBERT ,探索所有句子相似度的 HuggingFace 模型 。这个模型是不区分大小写的,这意味着它不区分英语和英语。查看官方文件,了解关于该型号的详细信息。
要实现该模型,请遵循以下步骤:
- 用distil Bert-base-un cased模型实例化 SentenceTransformer 。
- 调用编码并将葡萄酒描述传入其中。将参数convert _ to _ tensor=设置为 True。
#load the distilbert model
distilbert = SentenceTransformer('distilbert-base-uncased')#generate the embeddings for the wine reviews
embeddings = distilbert.encode(df['description'], convert_to_tensor=True)
注意 :如果您之前从未下载过该模型,您将看到它正在下载,并且可能会弹出一些消息。这很正常。
一旦该过程完成,文本描述将被转换成长度为 768 的向量。我们可以检查长度和第一次嵌入,以确保它看起来像预期的那样:

print(len(embeddings[0])
print(embeddings[0])
为了使向量更容易分析,使用 numpy 将数据从张量对象转换为列表对象,然后将列表附加到 pandas 数据帧。
#add embeddings to dataframe
df['distilbert'] = np.array(embeddings).tolist()#show the top row
df.head(1)

数据帧中的嵌入 df.head(1)**
创建搜索索引
当使用像谷歌或必应这样的搜索引擎时,用户希望很快得到结果。为了以闪电般的速度搜索我们的结果集,我们可以使用轻量级且高效的非度量空间库(NMSLIB) 。
使用 pip 安装它:
$ pip install nmslib
如前所述,我们希望使用余弦相似度作为我们比较用户输入和葡萄酒描述的度量。我们需要能够找到与我们的搜索向量最近的向量。使用蛮力技术搜索和排序数据既昂贵又缓慢。相反,应该为数据点创建一个索引。
创建搜索余弦相似性索引相当简单:
- 初始化一个新的索引,通过 hnsw 作为方法和余弦米尔作为空间。
- 使用 addDataPointBatch 方法将嵌入添加到索引中。
- 使用 createIndex 方法创建带有数据点的索引。
# initialize a new index, using a HNSW index on Cosine Similarity
distilbert_index = nmslib.init(method='hnsw', space='cosinesimil')
distilbert_index.addDataPointBatch(embeddings)
distilbert_index.createIndex({'post': 2}, print_progress=True)
如果您希望保存索引并在以后加载它(比如在生产服务器上),请使用以下代码:
#Save a meta index and the data
index.saveIndex('index.bin', save_data=True)#Re-intitialize the library, specify the space
newIndex = nmslib.init(method='hnsw', space='cosinesimil_sparse')*#Re-load the index and the data* newIndex.loadIndex('sparse_index.bin', load_data=**True**)
创建搜索功能
既然数据已经矢量化,搜索索引也已经填充,那么是时候创建接收用户查询并返回相似葡萄酒的函数了。
search_wine 函数将接受两个输入: DataFrame 和 UserQuery 。用户查询将使用编码转换成一个向量,就像我们对葡萄酒描述所做的那样。然后 NMSLIB 可以用来返回用户查询向量的 k 近邻 。我设置了 k=20 ,不过可以随意实验。
def search_wine(dataframe, userQuery):
if dataframe is not None and userQuery is not None:
df = dataframe.copy()
query = distilbert.encode([userQuery], convert_to_tensor=True)
ids, distances = distilbert_index.knnQuery(query, k=20) matches = [] for i, j in zip(ids, distances): matches.append({'country':df.country.values[i]
, 'winery' : df.winery.values[i]
, 'title' : df.title.values[i]
, 'variety': df.variety.values[i]
, 'color' : df.color.values[i]
, 'description': df.description.values[i]
, 'price': df.price.values[i]
, 'rating': df.rating.values[i]
, 'distance': j
}) return pd.DataFrame(matches)
注意结果被返回并作为字典附加到一个列表中。这使得将结果转换回数据帧变得容易。对于 距离 值,越小越好。例如,距离为 0 意味着向量相同。
测试功能:

搜索 _ 葡萄酒结果
创建可视化资源管理器
除了文本搜索之外,我们还可以使用降维技术在二维空间中绘制葡萄酒,从而提供一个可视化的浏览器。使用 Texthero 库,很容易应用 t-SNE 算法来降低向量的维数并将其可视化。在引擎盖下,Texthero 使用 Plotly 制作交互式图表。
t-SNE(t-distributed random neighbor embedding)是一种用于可视化高维数据的机器学习算法。t-SNE 技术应用了非线性降维。
将 t-SNE 应用于数据帧中的蒸馏向量列。
df['tsnedistilbert'] = hero.tsne(df['distilbert'])
使用 texthero 创建散点图。
#create scatter plot of wines using the
hero.scatterplot(df, col='tsnedistilbert'
, color='variety'
, title="Wine Explorer"
, hover_data = ['title','variety','price','description'])

葡萄酒浏览器可视化
数据中有如此多的变化,以至于散点图看起来像宇宙背景辐射,但这没关系。将鼠标悬停在一个点上会显示更多信息。用户可以点击一个品种,将其从图表中删除。例如,这里是关于葡萄牙红色和白色的混合:

葡萄牙红色和白色混合
有趣的是,我们可以看到一些品种是如何聚集在一起的,而另一些品种是如何分散在各处的。
创建用户界面
为了允许用户与搜索功能进行交互,我们可以使用 Dash by Plotly 构建一个简单的用户界面。 Dash 是一个基于 Flask、Plotly.js 和 React.js 编写的 Python 框架,如果你是 Dash 新手,想要掌握基础知识,请查看我的所有教程:
**https://medium.com/swlh/dashboards-in-python-for-beginners-and-everyone-else-using-dash-f0a045a86644 
用户界面
如果您想在 jupyter 笔记本中构建 dash 应用程序,请安装 Dash、Dash 引导组件和 jupyter-dash。
pip install dash
pip install dash-bootstrap-components
pip install jupyter-dash #if you want to build in a jupyter notebook
Dash 应用程序由布局和回调组成:
布局
布局由组件树组成,描述了应用程序的外观以及用户如何体验内容。
复试
回调使 Dash 应用程序具有交互性。回调是 Python 函数,每当输入属性改变时,就会自动调用。
构建布局
布局超级简单,采取极简的手法。使用一张卡片来放置搜索框,让用户按一个按钮,然后返回结果。这个例子使用了引导组件。
import dash
from jupyter_dash import JupyterDash
import dash_bootstrap_components as dbc
import dash_html_components as html
import dash_core_components as dcc
from dash.dependencies import Input, Outputexternal_stylesheets = [dbc.themes.BOOTSTRAP]app = JupyterDash(__name__, external_stylesheets = external_stylesheets)# Create server variable with Flask server object for use with gunicorn
server = app.server
添加 boiler-plate 代码以运行 Dash 应用程序后,创建将用作布局的组件树。我称第一个组件树为 search_card。
search_card 使用卡和卡体来包含文本区和按钮组件。在我看来,把它们放进卡片里会让它看起来更好一点。
search_card = dbc.Card(
dbc.CardBody(
[
html.H5("Auto-Sommelier", className="card-title")
, dbc.Textarea(id = 'user-input', bs_size="lg"
, placeholder="Describe Ideal Wine")
,dbc.Button('search', id = 'search', color="danger")
]
)
)
第二个组件树充当 search_card 和包含葡萄酒结果的卡片的容器。该组件树将被设置为 app.layout 。
app.layout = html.Div([html.H1("Find Your Wine!")
, html.Br()
, dbc.Row(dbc.Col(**search_card**,
width={"size": 6, "offset": 3}))#end row
, html.Br()
, dbc.Card(dbc.CardBody(html.Div(id = 'results')))
])
注意 search_card 被放到行和列组件中,这样更容易居中。在第二棵树的末尾,它包含另一个卡片和卡片主体,其中只包含一个 html。Div 与 id =结果 。该应用程序将依靠回调来用搜索结果填充 CardBody 的 Div 组件。
回调会将结果输出到结果 Div 。作为输入,回调将接受用户的查询和按钮点击。如果都不是,查询将被传递给 search_wine 函数,并以数据帧的形式返回结果。
[@app](http://twitter.com/app).callback(Output("results", "children")
, [Input("user-input", "value")
, Input("search", "n_clicks")
])
def return_wine(userquery, n):
if userquery is not None and n is not None:
dff = df.copy()
results = search_wine(dff, userquery)
table = dbc.Table.from_dataframe(results, striped=True, bordered=True, hover=True)
return table
请注意,dataframe 是使用 bootstrap Table 组件转换成 HTML 表格的。
要运行 Dash 应用程序,请使用以下命令:
app.run_server()
#Dash app running on [http://127.0.0.1:8050/](http://127.0.0.1:8050/)

自动侍酒师
恭喜你!你刚刚用拥抱脸变形、余弦相似度和破折号制作了你自己的葡萄酒搜索引擎!**
最后的想法和完整的代码
与我在 2019 年创建的原始自动侍酒师相比,这个版本的实现速度快得多,也简单得多。通过像 HuggingFace 这样的框架利用最先进的语言模型的能力为像我这样的机器学习爱好者打开了大门,让他们只用几行代码就可以构建一些令人敬畏的应用程序。现在是做一些分析的时候了,看看结果与原来的工具相比有什么改进!

比较同一查询的结果。新(顶部)
感谢阅读!以下是完整的代码:
**https://github.com/bendgame/MediumWineRecommend2
谢谢大家!
https://erickleppen.medium.com/the-ultimate-guide-to-erics-articles-d32df8241353 **
2021 年的自动化书写辅助前景
该领域的过去和未来的全景,从 Unix 作者的工作台到 Grammarly 以及其他
罗伯特·戴尔和杰特·维埃森

乔安娜·科辛斯卡在 Unsplash 上的照片
自动化写作辅助——包括各种基于计算机的帮助写作的工具——已经以这样或那样的形式存在了 60 年,尽管它一直是 NLP 领域中相对较小的一部分。但深度学习的最新进展极大地推动了这一类别。我们回顾一些历史,看看今天的情况,并考虑事情可能会走向何方。
这篇文章的 T4 版本出现在《自然语言工程杂志》上。
1.介绍
本专栏以前两次研究过商业上可用的写作辅助工具,更具体地说,是语法检查器和相关技术。早在 Dale (2004) 的时候,我们就认为微软将语法检查整合到几乎无处不在的文字处理平台 MS Word 中,扼杀了这个领域的创新。通过将当时最先进的语法检查方法与市场领先的桌面办公软件捆绑在一起,实际上是免费的,微软似乎为第三方设置了高得不可攀的准入门槛。
然后,五年前,我们调查了一些新进入者是如何设法在写作辅助市场站稳脚跟的( Dale 2016) 。我们特别关注成立于 2009 年的 Grammarly,尤其是因为它通过其有点无情的在线营销计划获得了显著的知名度。
今天,Grammarly 是主要功能是写作辅助的工具的市场领导者。2019 年,公司获得 9000 万美元资金,这对于一家 NLP 公司来说是相当大的一笔数目;而 Grammarly 现在声称每天有 3000 万用户。当然,与 Word 的市场渗透率相比,这算不了什么——即使在 2016 年,微软声称有 12 亿 MS Office 用户。但是很难找到有多少人真正使用 Word 的语法检查器的数字,而更容易找到的是许多人要么忽视它的建议,要么关闭它的轶事证据。你还会发现很多博客文章声称 Grammarly 的 checker 比微软的好,但很少有人提出相反的观点。
深度学习的最新进展似乎将再次重新安排自动化写作辅助空间,所以现在似乎是进行评估的好时机。下面,我们回顾一些历史,看看今天的情况,并考虑他们在未来可能去哪里。
2.传统景观
从自然语言处理的角度来看,自动写作辅助传统上包括三种不同的能力,其目的是帮助作者解决他们写作中的缺陷:拼写检查、语法检查和风格检查。当我们在这里使用这些术语时,拼写检查就是要确保你为记住的单词键入的字符序列与那些被普遍接受的组成该单词的字符序列相对应;语法检查是要确保你输入的单词序列符合你所用语言的公认语法规则;风格检查是为了确保除了拼写和语法的正确性之外,你在选择如何说你想说的话时所做的其他自由选择都适合你的预期交际目的和目标受众。
2.1 拼写检查
也许并不奇怪,拼写检查是历史最悠久的,最早的拼写检查器是在整整 60 年前由斯坦福大学的 Les Earnest 在 1961 年开发的( Earnest 2016 )。
早期的方法依赖于有效单词的列表,文本中不在该列表中的任何单词都被认为是潜在的拼写错误。除了长尾词汇的明显问题使得这种列表的构建似乎是一个回报递减的无止境的任务之外,还有“真实单词”错误的问题,其中一个单词被拼错为另一个有效单词。直到 20 世纪 80 年代末和 90 年代初,统计语言模型的工作才在这里提供了一个解决方案,用 n 克概率来检测上下文中似乎不太可能的单词。
今天,这些方法的变体现在被用于,例如,微软 Word 和谷歌文档。微软在 2007 年将上下文拼写检查添加到 Word 中:这最初在设置面板中被标记为“使用上下文拼写”,但后来被重命名为“经常混淆的单词”。2009 年,谷歌在现已倒闭的 Wave 产品中加入了一个上下文敏感的拼写检查器,它使用了一个大规模的网络衍生语言模型。
2.2 风格检查
20 世纪 70 年代末,贝尔实验室的 Lorinda Cherry 和 Nina McDonald 开发了 Unix Writer's Workbench,这是一套旨在帮助解决各种写作问题的程序,其中许多都属于风格的范畴( Macdonald 1983) 。这些程序通常基于简单的字符串模式匹配,包括检测重复单词和分裂不定式的工具,以及识别行话、性别歧视语言和其他不推荐的单词和短语的工具。
由于与许多教育机构选择的操作系统捆绑在一起,Unix WWB 在学术界获得了强大的立足点。在学术部门之外,许多商业实体很快在 20 世纪 80 年代初进入市场的个人计算机平台上复制了 WWB 的关键功能。这些产品中最著名的是 Grammatik,它被誉为个人电脑上的第一个语法检查程序。
今天,我们可能不愿将这些模式匹配方法称为“语法检查”,但区分正在处理的现象的分类和用于识别或纠正这些现象的技术是很重要的。借助简单的正则表达式,可以捕获一系列常见的语法错误;如果句子结构太复杂,正则表达式无法发现潜在的问题,那么在简单的语法方法暴露其缺点之前,对过长句子的预先检查可能只会将问题返回给作者。
大约在同一时间出现并提供类似功能的其他软件包有 RightWriter、标点和风格、正确语法和 PowerEdit 多亏了互联网档案馆,你可以在 1991 年一期的 InfoWorld 上找到一篇关于这些软件包的有趣的比较评论。
有趣的是,即使使用这些简单的技术也能实现如此多的目标。你不能用简单的模式匹配解决所有的拼写、语法和文体问题,但你仍然可以做很多;因此,正如我们将在下面进一步看到的,这些技术在今天的写作辅助领域仍然占有突出的地位。
2.3 语法检查
正如刚才提到的,正则表达式可以帮助您识别一些语法错误。但面对一个包含双重嵌入关系从句的长主语名词短语,几乎可以肯定的是,一个简单的模式匹配方法在试图检查主语和动词数量一致时会发现错误的标记。20 世纪 80 年代和 90 年代初的主流观点是,要正确地进行语法检查,你需要一个全面的、覆盖面广的短语结构语法,以及一个处理该语法认为不正确的单词序列的机制。
有大量关于语法检查的研究文献,其中大部分来自 20 世纪 80 年代,当时语法和解析似乎吸收了 NLP 研究社区的大部分精力。然而,除了一个非常突出的例外,还不清楚这些研究中的大部分是否进入了商业产品。凯伦·詹森(Karen Jensen)和乔治·海多恩(George Heidorn)的工作使当时被认为是“真正的”语法检查脱颖而出,他们首先在 IBM 开发了 EPISTLE 系统(海多恩等人,1982 年),随后在微软,他们负责开发了第一个基于对被分析文本进行完全解析的广泛可用的语法检查器,于 1997 年作为微软 Word 的一个组件发布。
在我们接受从树库中学习语法的想法之前,开发这样一个覆盖广泛的语法资源是一项巨大的任务,很少有公司尝试过。Grammatik 的后来版本,最后一次出现在 WordPerfect 中,似乎包含了某种程度的语法分析;在 Jensen 和 Heidorn 的工作之前,Microsoft Word 使用了一款名为 CorrecText 的产品,据称该产品使用了全面的语法分析( Dobrin 1990 )。前面提到的语法似乎也使用了某种形式的句法分析。但是唯一公开的有良好记录的基于商业级语法的语法检查器仍然是 Word 中使用的系统( Heidorn 2000 )。
3.今日景观:旧与新的相遇
那么,当今市场上可买到的自动化写作辅助工具是什么样的呢?为了了解这一点,我们回顾了 50 多种目前可用的写作辅助商业工具,引导我们确定了三大类:
- 模式匹配风格检查器:虽然 80 年代开发的几乎所有程序都消失了,但它们的精神在许多成功的新应用程序中仍然存在。
- 语言模型驱动的重写工具:这一新的类别为传统的文本修改方法提供了另一种选择。
- 文本生成工具:能够根据用户提供的提示创建各种长度的文本,这代表了从计算机作为编辑者到计算机作为作者的范式转变。
我们在下面挑选出我们认为更有趣的应用。
3.1 模式匹配样式检查器
20 世纪 80 年代出现的特定样式检查应用程序几乎已经消失。RightWriter 仍然以为代表,这是一个网站,它很好地提醒人们上世纪 80 年代的网站是什么样子,但是如果你点击链接购买该软件,什么也不会发生;该网站唯一正常运行的外部链接是一个论文工厂,我们怀疑该网站被劫持只是为了托管该链接。
20 世纪 80 年代的其他工具现在都不在网上了,除了一个有趣的例外:1989 年首次出现的 StyleWriter,看起来仍然很流行。它的网站早于现代网站模板光滑简单的设计,其商业模式同样来自更早的时代:这是一个通过一次性购买(尽管有可选的年度升级和额外费用的支持)购买的应用程序,而不是通过现在无处不在的 SaaS 模式按月租用。
但是,在风格检查这个领域,年龄和经验可能会有所帮助。这些应用程序的核心是手动创建的规则,这些规则可以检测文本中非常具体的模式,提出同样具体的更正建议,并经常对有争议的问题提供详细的手动解释。在其他条件相同的情况下,你存在的时间越长,你的软件积累的规则就越多。StyleWriter 检查 50,000 个单词和短语,并利用按难度分级的 200,000 个单词的列表;该网站声称每年新增 1000 张支票。该应用程序还包括一个正则表达式语言,如果您最喜欢的 bugbear 还没有被覆盖,您可以使用它来添加新的模式匹配规则。
这里更有趣的是,同样的老派技术如何成为一批更新应用的基础。其中,海明威编辑器(成立于 2014 年)看起来是最简单的。这利用了一个简单明了的界面来推荐修改,使你的文本“醒目清晰”;它的范围仅限于检测副词和被动语态的使用,建议更简单的表达形式,反对难以阅读的句子。这个工具并没有假装做语法检查;重点是通过检测可以删除或替换的特定模式来简化文本。
这个领域的许多应用程序都面向专业作家,因此通常支持跨用户团队共享样式设置。 Lingofy 和 Linguix 都属于这一类;在每种情况下,您都可以使用现有的规则集进行样式检查,或者使用您自己的规则来扩充这些规则集。Linguix 还声称可以检查语法,但是这种能力似乎仅限于可以通过简单的模式匹配检测到的错误。
PerfectIt (成立于 2009 年)特别关注围绕家居风格的更多机械方面的使用一致性,如字母数字表达式的格式、内部符号标点和地理拼写偏好;它还为根据特定需求定制样式表提供了广泛的支持。 StyleGuard 似乎是美联社风格指南的一个实现,拥有‘超过 25000 条风格规则’;同样,提供的所有示例似乎都可以通过模式匹配来实现。
WordRake (成立于 2012 年),似乎特别针对法律行业,也注重编辑的清晰和简洁;它与许多其他应用程序的区别在于强调隐私承诺,因为它是一个桌面实现,不会向云发送任何数据或文档。该应用程序得到了许多非常详细的专利的支持,尽管这些专利似乎描述了与使用许多其他供应商提供的模式匹配语言捕获的规则非常相似的规则。
ProWritingAid (成立于 2012 年),我们也将其包括在下一节描述的应用程序类别中,它揭示了似乎是编写自己的规则的最复杂的语言,包括词性标签和屈折形态学;这使其与开源工具语言工具 ( Naber 2003 )和截止日期后 ( Mudge 2010 )的不相上下。
3.2 文本重写中的语言模型
各种各样的统计语言模型已经进入了写作辅助工具。2019 年,谷歌在 Google Docs 中推出了增强的语法纠正工具,采用了一种现在常见的方法,即把语法错误纠正视为机器翻译任务,并使用神经 MT 技术来检测和纠正文本中的错误。同样在 2019 年,Grammarly 发表了一项研究,描述了他们如何使用 Transformer 语言模型进行语法错误纠正。
但是大型语言模型的可用性也支持新的写作辅助任务,这在以前是不可行的。一旦我们允许一个语言模型对一个提供的文本提出一个替代方案,对错误或不恰当的检测和纠正就变成了更一般的文本重写任务的一个特例。提供现有句子的替代翻译的能力,不管它们是否包含错误,已经成为写作工具中新的必备功能;因此现在有许多应用程序将错误检测与语句级重写结合起来。
除了声称使用某种形式的人工智能所提供的方向性暗示之外,供应商很少明确他们使用的技术的确切性质。据我们所知,以下利用大型语言模型来纠正或转换文本:
- Ginger (成立于 2007 年)似乎利用了相当复杂的句法分析,但也利用了“基于人工智能的”句子重组器。
- Gramara 称自己是“人工智能驱动的语法检查器”;它让你指定其重写的语气,并提供翻译你的文本。
- Outwrite Pro (成立于 2015 年,名为 GradeProof)非常重视它的整句释义能力。
- Wordtune 以随意或正式的风格重写提供的文本,并且可以缩短或扩展最初提供的文本。
除了重写文本,这些应用程序通常还会检测特定的错误,提供一个与更传统的检查器非常相似的界面,从而将文本中发出的错误与弹出窗口相关联,这些弹出窗口对错误类型进行分类,提供潜在的替换,并允许忽略或关闭相应的规则。通常不清楚这些功能是通过简单的规则还是更复杂的规则来提供的,尽管后者肯定是一种可能性:根据其创造者的说法,前面提到的 ProWritingAid 结合了一种模式匹配方法来检测常见问题,以及一种使用深度学习模型来创建校正文本的方法,然后使用更传统的分类算法标记错误类型。
3.3 从编辑到作者
无论我们谈论的是拼写、语法还是风格,自动化写作帮助传统上一直关注于纠正或改进人类作者所写的文本。像 OpenAI 的 GPT-3 这样的大型语言模型令人印象深刻的能力,可以生成任何主题的可信和令人信服的文本,这为一系列新的能力打开了大门,在这些能力中,人类和机器共同承担文本内容的责任。
这种可能性的第一个迹象是 2015 年谷歌智能回复功能的发布,根据该功能,对于某些类型的收到的邮件,Gmail 将提供一组简单的一键回复消息,其内容根据收到的邮件确定。这实际上是一个更复杂的版本:谷歌 2018 年的智能撰写功能,当你键入电子邮件时,它会交互式地提供句子完成建议,不仅会考虑你已经键入的内容,还会考虑你正在回复的电子邮件和电子邮件的主题行。
这些是我们在其他地方称为“短皮带”一代的例子( Dale 2020 ):机器生成的文本不允许偏离太远,受到之前发生的事情的充分限制,很有可能它是对你可能会说的话的准确预测。
但是仅仅一年前开放人工智能的 GPT-3 API 的发布已经极大地改变了这里的可行性。由早期和较小的语言模型创建的文本的似真性不是很好,特别是当它们变得更长时;开始的几个句子可能看起来不错,但之后的输出会很快退化成废话。GPT-3 仍然很有能力产生废话,但总的来说,这是更合理的废话;通过适当的微调和提示,它生成的文本可以令人难以置信地令人信服。
因此,现在有几十种应用程序可以通过给你一个简短的提示来帮你写作。表 1 列出了一个示例;当你读到这里的时候,其中的一些可能已经消失,被其他的取代。其中大多数允许你注册免费试用,这是值得做的,以了解他们能做什么。输出往往很弱,尤其是对于较长的文本,但偶尔你会真正留下深刻印象;如果你有写作障碍,即使较弱的结果也可能提供灵感来源。

每个应用程序都支持一系列用例,有时称为模板或任务:最常见的是较短的文本,如标题生成、产品描述和广告文案,但也有相当多的应用程序支持较长的文本和不太常见的用例。这些应用程序的界面和对生成的输出的控制程度各不相同;每种情况下的结果质量在某种程度上取决于开发人员针对其特定用例进行的调整。
4.从这里去哪里?
关于我们之前描述为定义自动书写帮助范围的一组功能的一些观察:
- 拼写检查是一种商品。这并不是说这是一个已经解决的问题——没有一个拼写检查器能发现 100%的拼写错误——也不意味着你遇到的每个拼写检查器都能提供最先进的性能;但是现在几乎所有支持文本编辑的平台都集成了拼写检查器。对大多数作者来说,知道有某种拼写安全网就足够了,即使这个网中可能有漏洞。由于第一条红色曲线下划线的弹出,我们确信最常见或最严重的错误会被发现,并承担那些可能被忽略的错误发生概率较低的风险。
- 对语法检查的态度各不相同。对于一些供应商来说,战场已经转移到更普遍的“改进写作”的任务上:他们认为语法检查战已经被现有的厂商赢得了,并且不认为任何进一步的战斗值得努力。一旦通过 Word、Grammarly 或其他方式进行了语法检查,这些供应商就有效地将他们的解决方案推销为您使用的应用程序;这意味着语法检查实际上是例行公事,他们宣传他们的重点是解决语法以外的问题。其他供应商坦率地承认,他们不尝试语法检查,因为这太难了,也许暗示这根本不可能。然后还有一些声称使用人工智能来捕捉语法错误的产品,这些产品是更主流的产品所不能的。
- 时尚永远不会过时。正如我们所见,使用 20 世纪 80 年代技术解决风格问题的应用程序仍然很强大。使用大型语言模型重写文本的新一波应用程序可以说都与风格有关:给定一个原始句子和一个传达相同内容的重写版本,你通常可以将这种差异描述为纯粹的风格差异。大型语言模型可能会鼓励我们从更全面的角度来思考风格,将其视为整个文本的属性;也许 20 世纪 80 年代根据特定词序的恰当与否来描述风格的方法是一种只见树木不见森林的情况。
面对这个领域如此多的新应用,为了保持自己的地位,Grammarly 长期以来一直不强调对语法检查的特别关注(名字真丢人,嗯?);在写作时,它目前的口号是“用 Grammarly 的人工智能写作助手撰写大胆、清晰、无错误的作品”。类似地,微软也将其语言校对功能重新打包并扩展为 Microsoft Editor,这是一个通过插件整合了文本预测和重写功能的工具,该插件还将其覆盖范围扩展到了标准的微软平台之外。
面对大型语言模型空间的快速发展,更传统的样式检查解决方案是否会继续蓬勃发展还有待观察。不要低估这些公司拥有的重要资产,这一点很重要:除了他们随着时间的推移积累的大量精心策划的规则集,以及迄今为止超出语言模型智慧的有时详细的解释,还有他们围绕自己的产品开发的生态系统,通过电子邮件简讯和博客帖子为写作任务提供广泛的额外支持,解决具体的写作问题或难题。这些辅助资源不仅提供了一些可能提高客户忠诚度的粘性,它们还提供了一种方便的途径来为软件本身不能或不能处理的写作问题提供支持,部分补偿了软件的局限性。但更有可能的是,为了生存,这些玩家将不得不适应,融入更新的技术以跟上竞争;ProWritingAid 的混合方法就是一个很好的例子。
但是最大的转变是从帮助编辑的工具到帮助创作的工具的转变。可以想象,在五年的时间里,没有一个自动化写作辅助工具会被认为是完整的,如果没有一个功能,它可以完成你的句子,在你打着键盘打瞌睡的时候,把你从狭窄的角落写出来,并填充背景段落。鉴于微软与 OpenAI 在 GPT-3 方面的独家许可协议,如果在不久的将来,我们看到这些功能成为微软 Word 功能菜单上的另一个项目,这并不奇怪。
如果你想了解自然语言处理领域的最新动态,请在 NLP 上注册免费订阅本周新闻。
Matplotlib 的最低指南
折线图、散点图、直方图以及一系列定制它们的方法

点击 这里 ,在我的个人博客上阅读这篇文章的更详细版本。
用于数据可视化的典型 Python 库是 Matplotlib。它易于使用、灵活,并且许多其他可视化库都是在 Matplotlib 的基础上构建的。这意味着学习 Matplotlib 将更容易理解和使用一些更花哨的可视化库。
入门指南
您需要安装 Matplotlib 库。假设您有一些终端,并且安装了 pip ,您可以使用以下命令安装 Matplotlib:pip install matplotlib。你可以在 Matplotlib 的安装指南中阅读更多关于安装的信息。
面向对象的方法
我们将从制作一个简单的散点图开始。首先,我们必须导入 matplotlib。plt框架是我们将用于 Python 绘图的。
import matplotlib.pyplot as plt
import numpy as np
我们还导入了 numpy,所以我们可以很容易地生成点来绘图!让我们在正弦函数上挑选一些点。我们选择一些 x 值,然后用np.sin计算 y 值。
x = np.linspace(-3, 3, num=10)
y = np.sin(x)
现在我们已经生成了我们的点,我们可以制作我们的散点图!我们首先制作一个Figure对象和一个Axes对象。
fig = plt.figure()
ax = fig.add_subplot()
我们可以把Figure对象看作是我们想要放入图形的框架,而Axes对象是我们框架中的一个实际图形。然后,我们将散点图添加到Axes对象,并使用plt.show()来可视化图表。
ax.scatter(x, y)
plt.show()

这是它的要旨!
折线图
这里是我们可以使用的颜色的例子。我们可以用许多不同的方法来指定颜色;十六进制代码,RGB,普通旧名。
from scipy.stats import norm
x = np.linspace(-4, 4, num=100)fig = plt.figure(figsize=(8, 5))
ax = fig.add_subplot()ax.plot(x, norm.pdf(x, loc=-1, scale=1), color="magenta")
ax.plot(x, norm.pdf(x, loc=0, scale=1), color=(0.85, 0.64, 0.12))
ax.plot(x, norm.pdf(x, loc=1, scale=1), color="#228B22")plt.show()

我们还可以使用许多预定义的线型。注意,在没有定义颜色的情况下,Matplotlib 会自动为我们的线条选择一些不同的默认颜色。
x = np.linspace(-6, 6, num=100)fig = plt.figure(figsize=(8, 5))
ax = fig.add_subplot()ax.plot(x, norm.pdf(x, loc=-3, scale=1), linestyle="solid")
ax.plot(x, norm.pdf(x, loc=-1, scale=1), linestyle="dotted")
ax.plot(x, norm.pdf(x, loc=1, scale=1), linestyle="dashed")
ax.plot(x, norm.pdf(x, loc=3, scale=1), linestyle="dashdot")plt.show()

我们还可以调整线条的宽度!
x = np.linspace(-2, 9, num=100)fig = plt.figure(figsize=(8, 5))
ax = fig.add_subplot()for i in range(1,7):
ax.plot(
x, norm.pdf(x, loc=i, scale=1), color="black", linewidth=i/2
)plt.show()

散点图
对于散点图,我们可以更改标记及其大小。这里有一个例子
x = np.linspace(-4, 4, num=20)
y1 = x
y2 = -y1
y3 = y1**2fig = plt.figure(figsize=(8, 5))
ax = fig.add_subplot()ax.scatter(x=x, y=y1, marker="v", s=1)
ax.scatter(x=x, y=y2, marker="X", s=5)
ax.scatter(x=x, y=y3, marker="s", s=10)plt.show()
我们还可以使用[ax.plot](https://matplotlib.org/3.3.4/api/_as_gen/matplotlib.pyplot.plot.html)函数,通过改变fmt参数来组合折线图和散点图。fmt参数由标记、线条和颜色部分组成:fmt = [marker][line][color]。如果fmt = "s--m",那么我们有正方形标记,一条虚线,它们将被染成洋红色。
x = np.linspace(-2, 2, num=20)
y = x ** 3 - xfig = plt.figure(figsize=(8, 5))
ax = fig.add_subplot()ax.plot(x, y, 'H-g')plt.show()

直方图
我们可以使用ax.hist功能轻松制作直方图。
x = np.random.randn(10000)fig = plt.figure(figsize=(8, 5))
ax = fig.add_subplot()ax.hist(x)plt.show()

我们可以改变直方图中的许多东西,使它变得更好——我们甚至可以添加多个!
x1 = np.random.randn(10000)-1
x2 = np.random.randn(10000)+1fig = plt.figure(figsize=(8, 5))
ax = fig.add_subplot()ax.hist(
x1,
color='turquoise',
edgecolor='none',
bins=50,
alpha=0.5,
density=True
)
ax.hist(
x2,
color='magenta',
edgecolor='none',
bins=200,
alpha=0.5,
density=True
)plt.show()

传说
很自然,我们会想在图表中添加一个图例。这可以通过[ax.legend](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.legend.html)功能简单实现。
x = np.linspace(-2, 2, num=100)
y1 = x
y2 = x**2fig = plt.figure(figsize=(8, 5))
ax = fig.add_subplot()ax.plot(x, y1, color='turquoise', label='First')
ax.plot(x, y2, color='magenta', label='Second')ax.legend()plt.show()

Matplotlib 将自动尝试并找到图表上图例的最佳位置,但是我们可以通过为loc参数提供一个参数来改变它。另外,一个常见的偏好是图例周围没有框架,我们可以通过将frameon参数设置为False来禁用它。此外,Matplotlib 在一列中列出了图例的元素,但是我们可以在ncol参数中提供要使用的列数。
x = np.linspace(-2, 2, num=100)
y1 = x
y2 = np.sin(x)+np.cos(x)
y3 = x**2fig = plt.figure(figsize=(8, 5))
ax = fig.add_subplot()ax.plot(x, y1, color='turquoise', label='First')
ax.plot(x, y2, color='magenta', label='Second')
ax.plot(x, y3, color='forestgreen', label='Third')ax.legend(loc='lower center', frameon=False, ncol=3)plt.show()

最终提示
您可以使用 Matplotlib 做许多奇怪的事情和不同的事情,不幸的是,我无法在这里一一提供。但是,有一些指导方针可以帮助您开始:
- 使用
plt.savefig()功能保存图表。 - 有许多构建在 Matplotlib 基础上的库可能对您试图创建的特定图表有益,例如 Seaborn 、 Bokeh 、 Plotly 等等。
- 看图库。拜托,拜托,看看图库!如果有人已经做好了,不要浪费 3 个小时在图表上。
优秀分析数据仓库的基础
将您的数据恰当地分层到 L1、L2 和 L3 层

作者图片
分析数据仓库存储的数据基本上与事务数据库生成的数据相同,不多也不少。但是,尽管事务数据库可能被设计得尽可能快,但分析数据库必须被设计得尽可能灵活并且与数据仓库中嵌入的所有业务逻辑保持一致。分析数据仓库的目标是使数据科学家(或可互换的分析师)能够快速混合数据以回答复杂的问题,并发现不明显的有用信息。然而,分析数据仓库还有另一个同样重要的目标:让两个不同的数据科学家面对同一个问题得出不同答案的可能性极小。如果使用事务数据库执行分析,这是很有可能的,因为业务定义和业务逻辑没有嵌入事务数据库中。如果你的公司倾向于召开会议,不同的部门对非常简单的问题给出不同的答案,那么你可能没有一个正确设计的分析数据仓库。设计合理的分析数据仓库将使数据科学家很难得出不同的结论;他们将不得不积极尝试得出不同的结论。想象一下,如果一致的答案成为标准,公司将节省多少时间。不要浪费时间争论哪个数字是“正确的”,你可以花时间决定采取什么行动(或者讨论得出结论的逻辑)。那段时间的美元价值是巨大的(更不用说因为不能在基本问题上达成一致而延迟行动的机会成本了)。
创建良好的分析数据仓库的关键是将业务分解成一系列事实、维度和用户表。
- 事实表:这正是天真、简单的英语解释。事实表是围绕单个实体的事实的集合。例如,如果您的企业使用互联网销售小部件,并且只在电视上做广告,那么您可能会有以下事实表:订单、客户、产品、网站和营销。orders 事实表将包含一个订单 ID、每个订单的值、下单日期、发货日期、订购该订单的客户的客户 ID 等等。customers 事实表有一个客户 ID、客户的姓名、客户的地址、一生的订单数、一生的销售额、他们的业务部门等等。营销事实表将具有电视商业广告 ID、电视商业广告的名称、它播出的电台的电台 ID、它播出的时间、商业广告的长度等等。将有额外的事实表来捕获关于电台的信息,例如观众的平均数量、地理位置等等;这些数据不会存储在营销事实表中,因为这些是关于电视台的事实,而不是企业经营的电视广告。这是创建适当的分析数据仓库的最困难的方面:通过识别数据必须分割成的正确的逻辑实体来正确地分离事实表。
- 维度表:您可以使用简单的英语语句来标识维度;单词“by”后面的任何内容都是维度。例如,“我们一周有多少订单?我们每月有多少订单?一周中的每一天我们有多少订单?”在本例中,维度是“日期”。因此,任何值得使用的分析数据库都会有一个“日期维度”表。该表将有一个主键(如 2015 年 1 月 10 日)和许多许多提供该日期信息的列。例如,它将包含一年中的某一天(10)、一年中的某一周(2)、一周中的某一天(周六)、一年中的某一月(1)、一周的开始日期(2015–01–05)、一周的结束日期(2015–01–11)、是否是周末(是)、是否是联邦政府假日(否)、是否是公司假日(否)等等。另一个例子是“按业务部门划分,我们有多少订单”?因此,业务部门是一个维度,我们将有一个“业务部门维度”表。还有一个例子是“根据邮政编码,我们有多少销售额?按城市?按州?”因此,地理也是一个维度,分析数据仓库将有一个“地理维度”表。
- 用户表:用户表通常通过将来自几个不同实体的事实与维度相结合来回答一个非常具体的问题。例如,“我们一周有多少未取消、未修复的订单?”或者“每月各业务部门的平均订单价值是多少?”大多数企业直接从他们的事务数据库中创建数十个甚至数百个用户表。直接从事务数据库创建用户表的问题是它们不灵活(如果不返回到源系统并从头开始,就不能重新组合数据来生成不同的视图),而且它们本质上是不一致的,因为每次创建用户表时,创建者都会决定应用什么逻辑。但是,从事实表和维度表派生的用户表非常有用,因为它们可以用来快速回答企业一直询问的基本问题。数据分析数据仓库可以自动创建一个用户表,在每天早上 5 点执行相同的步骤,并在早上 7 点到达时将结果通过电子邮件发送给数据科学家,供他或她审阅,而不是付钱给数据科学家,让他或她跨事务表运行一打 SQL 查询,并将数据拉入 Excel 电子表格并应用透视来回答问题。通过使用计算机自动化代替人工处理,这不仅节省了大量的时间,而且减少了错误。
尽管任何分析数据仓库都有一个很容易忽略但绝对重要的关键组件:维护良好、准确且有文档记录的数据模型。构建一个好的分析数据仓库不仅仅是写一堆 SQL 代码,它还包括创建和维护数据模型这一枯燥但重要的工作。您如何知道您是否在创建和维护数据模型文档方面做得很好?有一个任何企业都可以应用的简单测试:将数据模型打印在纸上,将所有的纸贴在墙上,并要求一名新的分析师快速写出 SQL 伪代码,说明他或她将如何提取一个基本问题的答案。如果分析师花了 2 分钟以上的时间快速查看墙上的文章并写出基本的伪代码(或者如果您知道伪代码是错误的,因为文档已经过时),那么您就没有一个好的数据模型或适当的文档。这对您的业务至关重要,因为这是您真正释放并注意到正确构建的分析数据仓库的力量的时候。过去需要几小时到几天才能回答问题,现在只需几分钟就能回答。想象一下,如果您能够比竞争对手反应更快,因为您的分析师不会浪费时间费力地通过您的事务数据库来发现关键发现,那么这将为您的企业带来什么样的竞争优势!
在以后的文章中,我们将进一步深入设计良好的分析数据仓库中应该存在的每一层。在上图中,这些图层应该是 L1(即原始图层)、L2(即上述数据模型)和 L3(即用户图层),在 L3 中,您可以像使用乐高积木一样重复使用 L2 中的组件。有时有一种误解,认为将数据分层会增加工作量;事实上,恰恰相反。将您的数据分层实际上会减少您的团队花费在获取他们需要的数据和维护这些数据上的工作量。我们将很快讨论如何!
哈希表的基础
哈希表基本上是一种提供快速插入、查找和删除的数据结构

我们这些活得够长的人一定知道或者至少看过黄页。没错。你说得对。它是一本厚厚的黄皮书,里面有企业名录和它们的电话号码。这使我们能够寻找销售我们所需商品的商家,并与他们联系。
(我不认为 Z 世代和之后的几代人会知道这本厚厚的黄皮书。😆)
电话号码簿通常是按字母顺序排列的,所以我们知道从哪里开始查找。一旦我们找到我们想要的企业名称,我们就可以拿到电话号码并给他们打电话。你明白了。💡

照片由 Foto Sushi 在 Unsplash 上拍摄
哈希表
如果我告诉你黄页或者电话簿是哈希表的一种实现呢?你打赌!🐴
哈希表本质上是一个与哈希函数耦合的数组。它通常用于以无序的方式存储键值数据,例如,企业及其电话号码、学生及其成绩、项目及其价格等等。
每个键必须是唯一的,并映射到数组中的特定索引,其值存储在该位置。🔑 ➡🚪注意,正因为如此,插入、搜索和删除操作都是⚡️速度。事实上,哈希表的插入、搜索和删除操作的平均时间复杂度是常数时间或O(1)。
因此,当您需要一个提供快速插入、查找和删除的数据结构时,哈希表是首选之一。当您有大量的关系键值数据时,这非常有用,例如在数据科学和/或机器学习算法中。
散列函数
哈希函数使得哈希表成为一种强大而有用的数据结构。哈希函数接受一段数据,或者通常称为一个键,并返回一个哈希代码作为输出。这个散列码是一个整数,然后被映射到数组中的一个索引,该值将存储在数组中。
哈希代码不直接与数组中的索引相关联的原因之一是因为哈希代码的值可能非常大,例如10000000,而我们想要存储的键值数据量(或者构成哈希表的数组的大小)可能不一定那么大。
将散列码映射到数组中的索引的一种简单方法是根据散列表的大小应用模运算。
index = hashCode(String key) % length(array)
让我们来看一个散列函数的例子。
*function int hashCode(String s) {
return s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
}*
这是 Java String对象使用的哈希函数,其中s是String对象的字符数组,例如s[0]是第一个字符,n是String对象的长度。让我们看看它的实际效果。
hashCode("Apple") // 63476538
hashCode("Costco") // 2024204569
hashCode("Ikea") // 2280798
hashCode("Snowflake") // 1973786418
从☝️的几个例子中可以注意到,散列函数为每个String对象输出不同的散列码值。如前所述,每个键都应该是唯一的,因此哈希函数也应该为每个键生成唯一的哈希代码。这将为键值数据在哈希表中均匀分布提供更好的机会。
此外,让我们将散列码映射到数组中的索引。
function int mapToIndex(int hashCode, int arraySize) {
return abs(hashCode % arraySize)
}// Let's assume the size of our hash table or the length of the array is 500hashTable = Array(500)mapToIndex(hashCode("Apple"), size(hashTable)) // 38
mapToIndex(hashCode("Costco"), size(hashTable)) // 69
mapToIndex(hashCode("Ikea"), size(hashTable)) // 298
mapToIndex(hashCode("Snowflake"), size(hashTable)) // 418
按照☝️的说法,苹果的数据将位于索引 38,好事多的数据位于索引 69,宜家的数据位于索引 298,雪花的数据位于索引 418。

碰撞
在上一节中,我们看了一个如何使用 hash 函数来确定特定键值数据在哈希表中的位置的示例。现在,让我们看看另一个散列函数的例子。
*function int hashCode(int i) {
return i % 5
}*
这个哈希函数将一个整数作为输入,并应用模运算来输出哈希代码。现在,让我们用几个整数输入来测试一下。
hashCode(1) // 1
hashCode(5) // 0
hashCode(11) // 1
等一下。散列码不是应该对每个键都不同吗?在这种情况下,我们选择的散列函数对于我们可能拥有的可能的键来说可能并不理想。它为不同的输入值生成相同的哈希码,即输入值 1 和 11 将返回哈希码 1,这意味着它们将被映射到数组中的相同位置。这种现象叫做碰撞。

处理冲突的两种方法
有两种常见的方法用于处理哈希表中的冲突:
- 线性探测
- 单独链接

Clark Van Der Beken 在 Unsplash 上拍摄的照片
线性探测
在线性探测中,我们通过在由哈希函数确定的假定位置之后搜索数组中最近的可用空间来处理哈希表中的冲突。让我们使用上一节中的冲突示例来想象一下,输入值 1 和 11 会产生相同的哈希代码。
假设我们将 1-Apple 的键值数据插入到哈希表中。哈希函数返回哈希代码 1,我们假设它映射到数组中的索引 1。现在,数组中的索引 1 包含 1-Apple 的键值数据。
接下来,我们要将 11-Orange 的键值数据添加到哈希表中。哈希函数返回哈希代码 1,它也映射到索引 1,但是,此时,数组的索引 1 中的块已经被键值数据 1-Apple 占用。
在这种情况下,线性探测将在数组中寻找最近的空闲位置,并在那里存储键值数据 11-Orange。当我们希望从键等于 11 的哈希表中检索数据时,情况也是如此。线性探测将首先找到键值数据 1-Apple,然后继续在相邻位置搜索,直到在数组中找到与键 11 匹配的块或空块,这表明键 11 不存在。

单独链接
当使用分离链接方法时,哈希表将在链表中存储键值数据。这意味着数组中的每个块都包含一个链表,而不仅仅是一个键值数据。
因此,在发生冲突时,不是像线性探测那样寻找数组中的下一个空闲块,而是将键值数据添加到链表中。
同样,以上一节中的冲突示例为例,单独链接将在数组的索引 1 处的链表中存储 1-Apple 和 11-Orange 键-值对,其中链表的头将是 1-Apple,因为它被添加在 11-Orange 之前。
好的散列函数的特征
基于我们到目前为止所了解的,我们可以推断出一个好的散列函数应该具有以下特性。
利用数据中的每一条信息
好的散列函数应该利用数据的每个元素,以便增加可能的散列码的数量。
让我们看看下面的例子。
*function int hashCode(String k) {
String s = k.substring(start=0, end=2)* *return s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
}*
这个散列函数接受一个类型为String的输入数据,取前 3 个字符并应用 Java String对象使用的散列函数。您可以想象,对于前三个字符相同的数据,例如 apple 和 application,会发生冲突。
在这种情况下,并不是所有的信息都用来生成散列码。如您所见,冲突的可能性更大,因为可用的哈希代码更少。
非常快的计算
我们使用哈希表的原因之一是它的插入、查找和删除速度。每个操作都依赖哈希函数来获得哈希代码,从而获得数据在数组中的位置。
因此,我们要确保我们的哈希函数超级快,以便提供我们在哈希表中寻找的速度。
这意味着我们应该避免使用复杂或缓慢操作的散列函数,并致力于快速、简单而有效的操作。
在表中均匀分布数据
对于我们的哈希函数来说,最理想的情况是将数据均匀地分布在哈希表中。如果散列函数没有均匀地分布数据,那么发生冲突的可能性就更大。

摘要
我们已经学习了哈希表的基础知识,包括它的结构,哈希函数是什么和做什么,冲突以及处理冲突的方法。下次当你面临一个需要快速查找、插入和删除的问题时,哈希表可能是你解决它的最佳选择。😺
编写程序集的基础
想学汇编?从这里开始!

(src =https://pixabay.com/images/id-424812/
介绍
计算机是技术革新,在仅仅半个世纪的时间里,它彻底改变了整个世界和我们做任何事情的方式。计算技术对现代社会至关重要,由于国际互联网和计算机的普及,我们甚至将我们生活的时间称为“信息时代”。不用说,计算机理论是一门非常重要的学科,尤其是在数据科学的背景下。计算机理论的核心是硬件的一个非常重要的组成部分,中央处理器,或称 CPU。
中央处理器
CPU 通常可以比喻为人脑,因为就计算机而言,它本质上是操作的大脑。我认为更准确的比喻可能是大脑皮层本身,因为处理器不一定做大脑做的所有事情,例如存储记忆,但我跑题了,这个比喻仍然完成了工作。处理器主要是一个 I/O 设备,它可以在寄存器中临时存储要计算的位。CPU 内部唯一的其他组件是控制单元,它控制数据进出寄存器,最后是组合逻辑核心。组合逻辑内核用于非常快速地处理带有数据的命令,甚至可以用于存储在存储器中的位,而不仅仅是寄存器。换句话说,如果堆栈中有 8 位,处理器寄存器中有 8 位都是整数,我们想将这些数字相加,我们可以使用 add 命令。您现在可能会忽略它,它的程序集如下所示:
mov rsi, example_data1
add rsi, example_data2
当然,这是假设这两个部分都是堆栈的别名部分,是预先保留或分配的。当然,对于这种复杂的硬件组件,总是需要某种方式让软件与之接口,这就是汇编或机器码发挥作用的地方。
什么是组装?
汇编是一个由寄存器标号、段和命令组成的系统,处理器可以输入这些信息以便在硬件端执行某些操作。如果说 CPU 是计算机的大脑,那么汇编就是脊髓。汇编允许 CPU 在内存和内核之间传递信息,以使计算机真正做人类想让它做的事情。
为什么要学汇编?
汇编语言无疑已经失去了很多用户,因为 C 语言更容易使用,功能也差不多,但速度稍慢。然而,我认为至少追求最低限度的汇编语言教育的一个重要原因是,与编写 Python 或 C++,甚至 C 语言相比,它确实可以帮助您学习更多的计算机知识。即使您是初学者,我认为对汇编语言的基本理解也确实可以帮助您从非常低的水平掌握输入和输出的概念。
此外,有很多薪水很高的汇编编程工作,所以我认为它甚至对赚钱也很有用。不用说,如果你没有足够好地掌握其他语言来编写你想要的代码,汇编语言总是一个备用点。然而,我认为我想写一篇关于汇编编程的文章的主要原因是为了教育的利益,因为这可能是本文要完成的大部分内容。数据科学家确实有相当大一部分工作分配给了计算机编程,因此理解计算机对于编写更好的代码至关重要。
书写组件
现在我们对汇编有了一个基本的了解,实际上我们可以开始用这种语言编写我们的第一个程序了!当然,为了实际编写一些汇编,你需要编译一个汇编器。你可能有时会听到程序员把汇编语言称为汇编程序,这在技术上是不恰当的,因为汇编程序更类似于编译器,而不是语言本身。比如 Python 语言和 Python 编译器是不一样的。这是一件奇怪的事情,让我很恼火,所以我想我很乐意解释这两个词之间的区别。
设置装配
马上,我们将需要查看我们的系统,以便了解我们将需要什么样的汇编程序。您通常可以针对其他内核和处理器品牌进行汇编,但是如果没有针对您的操作系统和处理器的合适汇编程序,您将无法有效地进行调试。由于我在 Linux 上,目前流行!操作系统,Ubuntu 的衍生物,并有一个英特尔处理器,我将使用全网汇编,或 NASM。对于 Windows Intel 系统,你会希望获得微软宏汇编程序,或 MASM。如果你有其他系统,你可以谷歌一下
(OS) (CPU 制造商)汇编程序
还应该注意的是,一些系统调用可能与汇编程序之间的例子有所不同。在本文的例子中,不同的内核之间有巨大的差异,所以我不能完全解释所有的差异。考虑到这一点,即使您不理解,这篇文章可能仍然是一篇好文章,因为这里的主要目的是学习更多关于计算机的知识。然而,不管你用的是什么系统,我至少可以给你指出正确的搜索方向,以及你到底需要安装什么:
- Windows —点击 Windows 开始按钮,然后点击设置(齿轮图标)。在设置菜单中,点击系统。向下滚动并点击关于。
- OSX —点击苹果菜单>关于这台 Mac。
- 如果你不知道如何做到这一点,我将假设你在 Gnome 上。在大多数 DEs 上,这仍然有效。按下您的“活动”按钮(或 Windows 按钮),然后键入 about 并按 enter 键。

(图片由作者提供)
在 Linux 上,您可以通过您的软件包管理器直接安装 NASM。例如,Apt:
sudo apt-get install nasm
在 Windows 上,我相信你可以通过标准的安装向导安装 MASM。在 MacOS 上,我必须承认我完全不知道如何安装汇编程序。我认为它可能会通过 Brew 来完成。
我们的准则
对于我们今天的项目,我们将编写一个简单的 Hello " Name "程序。这本质上是 Hello World!这个应用程序还将展示如何为输入和诸如此类的事情保留字节。而我通常认为你好世界!对于第一个项目来说有点太简单了,因为在大多数高级语言中,它只是类似于print(“Hello world!”)的东西,在汇编的例子中,我认为这是一个很好的学习例子!此外,这段代码将在 Github 上提供,因此您可以随意下载、汇编或在这里查看:
https://github.com/emmettgb/Assembly-Intro
部分
对于这个项目,我们需要讨论和理解的第一件事是节的概念。段用于定义处理器需要分配的数据,或在堆栈中保留的数据,或通过文本给处理器重要的指令。有几个部分,但现在我们将重点放在。数据部分。为了定义一个部分,您只需编写 section,后跟我们想要创建的部分。例如,在。数据部分:
section .data
此外,对于节,我们不需要像函数那样使用冒号。无论如何,我们还将在它下面定义另一个称为。bss 部分,然后是。文本部分。之后,我们的部分应该看起来像这样:
section .datasection .bsssection .text
别名堆栈
首先。数据段用于定义静态数据。这意味着我们将把这些数据直接放入堆栈中,并使用一个别名来调用它。这个命令叫做定义字节,简称 db。在 db 之前,我们需要提供这部分堆栈的别名。假设我们的堆栈从 0 开始,每当我们写这个别名时,它将只为我们保存字节的起点,0,在这个例子中我们将写 hello _____。这将是 6 个字节,一个用于 hello 中的每个字符,一个用于结尾的空格。我还将为结尾预留更多的内存,包括解释点和返回。虽然我们已经习惯了内核中带有内核的可爱而奇特的正则表达式,但是处理器没有这些,所以我们将使用数字 10 来代替\n。这只是一个数字,本质上类似于添加新行的正则表达式。
section .data
hello: db "Hello "
ending: db "!", 10
section .bsssection .text
所以现在,如果我们的堆栈从 0 开始,我们将有别名 hello,从 0 开始,到 6 结束,然后堆叠在它上面的是别名 end,从 7 开始,到 9 结束(为 10 保留了一个字节)。现在让我们转到。bss 部分,通常用于为应用程序内部将要使用的内容保留数据。当然,我们将为我们的用户输入保留字节,所以我们将我们的新别名命名为。长度超过 16 个字节的名字不多,我就分配这么多。我们用 resb 命令保留字节。我们按照我们希望保留的字节数:
section .bss
input: resb 16
。文本
我们今天要学习的最后一个部分是。文本部分。该部分用于为处理器提供重要信息,并保存我们汇编软件的所有代码。在这种情况下,_start 将成为处理器应该访问的汇编文件内部的入口点。当然,它也有其他的用途,但是在这个例子中,我们只需要使用那一部分。我们所需要做的就是用全局命令调用我们的启动函数(我们还没有写):
section .text
global _start
现在,我们代码的 section 部分将如下所示:
; Sections:
section .data
hello: db "Hello "
ending: db "!", 10section .bss
input: resb 16section .text
global _start; Functions:
您还可以用注释代码;比如 Lisp。
功能
为了编写一个函数,我们只需键入一个函数别名,后跟一个冒号,例如我们的 start 函数:
_start:
函数在汇编中工作就像在其他语言中一样。考虑到这一点,我们现在需要将命令添加到我们的函数中,在这之前会有很多解释,所以准备好吧。
寄存器和系统调用
在许多方面,汇编编程将是处理器和内核之间的通信。我们通过将数据移入寄存器来完成大部分通信,然后使用 syscalls 来完成内核端的操作,以向使用计算机的实际人员提供某种回报。系统调用总是以这样的方式工作,首先将数据移动到寄存器中的特定位置,然后进行系统调用,内核执行放入寄存器中的操作。我们可以把寄存器看作是处理器内部的临时数据存储器,它是不可思议地可变的。这些寄存器以位置命名,例如 1、2、3 …
这是每种架构的所有寄存器的映射。请注意,我找不到一个具有知识共享署名的表格,所以我承担了为您创建自己的表格的艰巨任务。

(图片由作者提供)(对了,知识共享(CREATIVE COMMONS),你可以保存这个图片并分享。)
大多数情况下,我们将使用这些寄存器处理系统调用或处理器命令。我们都可以从寄存器和内存中做到这一点。例如,我们想添加 rax 和 rbx 寄存器:
add rax, rbx
现在让我们来谈谈系统调用。为了对我们的内核进行系统调用,我们需要将数据放入我们的寄存器。通常,在位置 1,rax 寄存器中,我们会放入一个命令,让内核与其他寄存器一起执行。当然,您可以为您的特定内核查找一个完整的系统调用列表。
进行系统调用
当然,对我来说,与您一起检查每个系统调用的工作量将是非常大的,例如,在 Linux 中有 313 个系统调用,所以我将只展示我今天要处理的系统调用。您可以在这里查看 Linux 系统调用的完整列表:
无论如何,我们今天要看的 3 个调用是 sys_exit、sys_read 和 sys_write。我们的程序被设计为先读后写,因为它从来没有真正要求我们的名字(你能看出来,因为我们没有为此保留字节),所以我们需要调用的第一件事是 sys_write。我将在这里为 sys_read 和 sys_write 提供一个小表:

(图片由作者提供)
这些表格将为您提供几乎所有您需要了解的关于这些系统调用的信息。我们可以把系统调用看作是以寄存器作为参数的方法。我们将使用 MOV 命令将数据移入寄存器。
写 Hello World!
为了开始系统调用的演示,我觉得使用最简单的系统调用可能会有用,这当然是退出系统调用。这也有助于我们更好地理解如何只使用 to 寄存器进行系统调用。
出口

(图片由作者提供)
正如我们在表中看到的,这个系统调用的数字标签将是 60。当我们进行系统调用时,它几乎总是进入位置 1 寄存器,即 rax 寄存器。现在让我们从在 rax 上使用带无符号整数的 MOV 命令开始。这个无符号整数是一个退出代码,在这种情况下,我们希望它是 0。在编程的世界里,代码 0 意味着我们的程序没有出错。我们首先将 0 移入 rax 寄存器的 3 中:
_start:
mov rax, 60
请注意的语法
命令,(寄存器或数据)
按照相同的语法,让我们将 0 移入第二个寄存器位置 rdi:
_start:
mov rax, 60
mov rdi, 0
最后,我们将简单地在末尾添加 syscall 来进行 syscall:我们现在的最终结果应该是这样的:
; Sections:
section .data
hello: db "Hello "
ending: db "!", 10section .bss
input: resb 16section .text
global _start; Functions:_start:
mov rax, 60
mov rdi, 0
syscall
正在组装!
现在我们将组装我们的新应用程序。当然,这个应用程序除了打开和关闭之外什么也不做,但是它仍然很容易判断出是否有问题,因为我们将收到一个分段错误消息。现在,我们需要将终端带到包含汇编文件的目录,并使用 nasm 来汇编它:
nasm -f elf64 hello_world.asm
这将为我们提供一个. o 文件,我们现在可以将它转换成一个可执行的二进制文件:
ld hello_world.o -o hello
然后我们可以用。/:
./hello

(图片由作者提供)
恭喜你!
你的第一个汇编程序已经正式完成了!如果您最终得到“分段错误(核心转储)”,这基本上意味着您的代码中的某个地方有问题。找到这些 bug 可能相当棘手,因为核心转储实际上并没有描述太多关于异常发生位置的信息。
读取字节
接下来我们需要做的是处理一些简单的标准输入,并输出该输入以及我们的 hello 消息。让我们回头参考 syscall 表,该表包含我们为此所需的信息:

我们看到 sys_read 是第一个调用,它为零。记住这一点,我们将把它移到 rax 寄存器中:
mov rax, 0
接下来,我们将把 0 移入 rdi 寄存器。该寄存器用于描述我们正在使用的缓冲器。当然,对于这个例子,我们需要 STDIN,标准输入是 0,标准输出是 1。
mov rdi, 0
接下来,我们将把我们的保留字节放入 rsi 寄存器的位置 3:
mov rsi, input
当我们这样做时,我们基本上是在说
"在这里存储输入!"
这意味着我们指向堆栈中的一个位置,该位置被保留并作为输入别名。最后,我们需要这个缓冲区允许占用的字节数,16:
mov rax, 0
mov rdi, 0
mov rsi, input
mov rdx, 16
syscall
输出
最后,现在让我们把这个打印出来,和我们的其他信息一起显示在屏幕上。我们将从信息的“你好”部分开始。首先,查看上面的图表,我们将 1 移入 rax 寄存器。
mov rax, 1
因为这是标准输出,所以我们也需要将 1 移动到 rdi 中的描述符。
mov rdi, 1
现在我们需要将内存的别名移入 rsi,hello,然后将它需要输出的字节数移入 rdx。为了演示 stack 的工作原理,我将把这个数字改为 7,然后组装它,这样我们就可以看到发生了什么:
mov rdx, 7
现在我们的最终结果看起来有点像这样。
mov rax, 1
mov rdi, 1
mov rsi, hello
mov rdx, 7
syscall
让我们看看在 rdx 中多编译一个字节会发生什么:

(图片由作者提供)
忽略 f,那是我的输入,但是注意我们的。数据段没有用解释点定义我们的 hello 消息?
section .data
hello: db "Hello "
ending: db "!", 10
栈之所以叫栈是有原因的。它是内存中一系列相互堆叠的字节。每当我们分配这些内存部分时,我们都将“ending”放在“hello”的上面。hello 的长度是未知的,这就是为什么每当我们进行这个 syscall 时,我们必须将它移动到 rdx 寄存器中。无论如何,我现在将把它改回 6,我们将继续重复这段代码,但不是打印 hello,而是打印输入。之后,我们将打印结局。我还强烈推荐使用适当的格式和分离您的系统调用,因为这肯定会使所有的操作混为一谈。这是我们的最终产品:
; Sections:
section .data
hello: db "Hello "
ending: db "!", 10section .bss
input resb 16section .text
global _start
_start:
mov rax, 0
mov rdi, 0
mov rsi, input
mov rdx, 16
syscallmov rax, 1
mov rdi, 1
mov rsi, hello
mov rdx, 6
syscallmov rax, 1
mov rdi, 1
mov rsi, input
mov rdx, 16
syscallmov rax, 1
mov rdi, 1
mov rsi, ending
mov rdx, 2
syscall
mov rax, 60
mov rdi, 0
syscall
; Functions:
现在让我们组装并运行它!
结论

(图片由作者提供)
我们的感叹号出现在底部可能有点奇怪。发生这种情况的原因是因为我们为 STDOUT 保留了 16 个字节。换句话说,我们还不知道这个名字的长度。这当然可以很容易地通过比较、跳转和标记来解决,但这是我希望这篇文章所能达到的深度。
我觉得这种语言的技巧绝对可以应用到更高级的编程中!事实上,这几乎是我最初学习汇编语言的全部原因。除此之外,写起来很有趣,因为通常比写标准的高级语言更有挑战性。这真的让你不得不更多地考虑硬件。如果有一件事是我个人最喜欢的,那就是从软件的角度与硬件交互。这基本上是我们在不接触裸机的情况下最接近硬件的了(另一篇文章的想法?),我觉得很有意思。非常感谢大家的阅读,我将考虑做另一部分,我们将在这篇文章中投入更多的组装乐趣。到那时,快乐的发现,快乐的编程!
交互式地理可视化之战第 1 部分—使用一行代码的交互式 Geoplot
PYTHON。数据科学。地理可视化
使用 Holoviews 和 Python 的地理可视化

GeoJango Maps 在 Unsplash 拍摄的照片
介绍
地理空间数据可能是目前存在的最复杂的数据形式之一。一个原因是,这种形式的数据不用于分析师之间的日常对话。例如,分析师通常不谈论纬度和经度,和/或形状文件。
另一个原因是,地理空间数据所展示的模式并不容易显现。
因此,地理可视化在研究的初步分析和设计中发挥着重要作用。
地理散点图
地理散点图与普通散点图相似,只是地理散点图使用观察的地理编码(位置)作为制图的参考基础。这意味着,与具有 x 和 y 变量的普通散点图(有理数字类型)相反,地理散点图的 x 和 y 是经度和纬度,并且是名义值。
由于数据科学家追踪新冠肺炎感染的努力,地理散点图最近变得更加流行。
在本系列文章中,我们将使用相同的数据集,但使用不同的包。
关于数据集
我们将要使用的数据集是“菲律宾咖啡店足迹”数据集,它是我在 2020 年生成的,用来绘制谷歌地图上列出的菲律宾咖啡店。
加载数据集
import pandas as pd
df = pd.read_csv('data/Coffee Brands Footprint.csv',
index_col=0)
df.head()

作者图片:数据集预览
请注意,对于绘制地理空间图形,有一个经度和纬度列是很重要的。在某些情况下,您可以用 GeoPandas 几何对象(点、线、多边形)来替换它。
不多说了,我们开始吧。
使用全息视图的一行代码
Holoviews 是目前存在的高级绘图包之一。它非常容易使用,对于那些时间紧张的人,我推荐这个包。
pip install holoviews
注意确保也安装geoviews包。
pip install geoviews
使用这一行代码可以生成地理散射图:
df.hvplot.points(
x='lng', #longitude column
y='lat', #latitude column
hover_cols=['vicinity'], #tooltip when hovered over
c='brand', #color argument
title='Coffee Shops in The Philippines',
geo=True,
tiles='CartoLight')
请注意,它就像绘制一个普通的散点图!正如我们的介绍所述,x 和 y 参数属于经度和纬度列。
geo=True的参数对于 holoviews 将 x 和 y 变量解释为地理编码非常重要。

作者生成的 GIF。尝试使用以下任一选项来更改拼贴:#'CartoDark ',' CartoEco ',' CartoLight ',' CartoMidnight ',' EsriImagery ',
' EsriNatGeo ',' EsriReference''EsriTerrain ',' EsriUSATopo ',' OSM ',
' stamen labels ',' StamenTerrain ',' StamenTerrainRetina ',' StamenToner ',' StamenTonerBackground ',' stamen 水彩'
让我们删除框架,以及它可能不会在视觉上吸引人。这可以通过将xaxis和yaxis设置为None来实现。
df.hvplot.points(
x='lng',
y='lat',
frame_height=1000,
frame_width=500,
xaxis=None,
yaxis=None,
hover_cols=['brand', 'vicinity'],
c='brand',
title='Coffee Shops in The Philippines',
geo=True,
tiles='CartoLight')

作者生成的 GIF。与第一张 GIF 图像相同,但没有 x 轴和 y 轴。
由于重叠的点,很难看到在特定区域有多少商店。在这种情况下,将点的透明度设置为小于 100%会有所帮助。
对于这些情况,我们可以尝试用关键字alpha=0.3将其设置为 30%。
df.hvplot.points(
x='lng',
y='lat',
alpha=0.3,
frame_height=1000,
frame_width=500,
xaxis=None,
yaxis=None,
hover_cols=['vicinity'],
c='brand',
title='Coffee Shops in The Philippines',
geo=True,
tiles='CartoLight')
全息视图的优点和 CONS
除了 holoviews 易于使用和理解的事实之外,我们上面生成的图表可以部署为一个网页,您可以使用它进行演示。
我们的许多高管不希望看到原始代码,因此在报告时将它部署为一个单独的网页是一个很大的优势。
要部署为单独的页面:
import panel as pn
import holoviews as hv
import holoviews.plotting.bokehpn.panel(geoscatter).servable(title='HoloViews App').show() #.show() makes it to be a separate html

作者生成的 GIF。
与大多数包一样,一个缺点是与其他包(如 follow)相比,定制可能不太全面。
结束语
我们可以做很多定制来改进我们上面已经有的可视化。对于有兴趣持续改进 geo-scatter 的读者,推荐以下:
1。选择定制的调色板 —特别是,我们上面的是咖啡品牌,它们可以与特定的颜色相关联。例如,星巴克有一种特殊的绿色,可以很好地识别品牌。这里建议的方法是为品牌的颜色创建一个列,该列被提供给c或颜色参数。
2.尝试不同的图块 —对于有许多不同颜色(非单调)的图表,理想的是图块颜色不太鲜艳,以强调要点。对于单调的颜色,适用于连续变量,彩色图形可以谨慎使用。主要的想法是,瓷砖不应该分散或带走地理图的信息,这就是为什么我们这样做的原因。
正如您从上面所看到的,可视化点提升了我们对地理空间数据的理解。像网络效应这样的模式是很容易得到的,我们可以推断这个地区的咖啡店越多,这个地方就越发达。
在下一个系列中,我们将尝试不同的包来比较整体的语法和美学。
我的 Github 页面上的全部代码。
让我知道你的想法!
交互式地理可视化之战第 2 部分——使用一行代码的交互式 Geoplot
PYTHON。数据科学。地理可视化
使用 Plotly Express 和 Python 进行地理可视化,并提供地理编码方面的额外提示

蒂莫·维林克在 Unsplash 上的照片
我们离开的地方
在上一篇文章中:交互式地理可视化之战第 1 部分—使用一行代码的交互式 geo plot,我们讨论了为数据探索制作 geo plot/geo Visualization 的重要性,因为它可能揭示数据的有趣见解和模式,从而将您的数据科学项目提升到一个全新的水平。
此外,我们使用交互式 Python 包 Holoviews 生成了数据集的地理散点图,作为奖励,我们将它部署为用于演示目的的网页。
在本文中,我们将使用相同的数据集来生成类似的交互式地理图,但使用的是 Plotly Express 包。
PLOTLY EXPRESS
在我们开始学习 Plotly express 之前,有必要讨论一下 Plotly 是如何成为 Python、R 和其他编程语言的领先且最受欢迎的交互式绘图库之一的。
Plotly Express 是 Plotly 库的高级包装器,这意味着它调用 Plotly 库的功能,但语法更简单。
有了这样的介绍,让我们只用一行代码就能画出我们的图。
编码
预赛
import pandas as pd
# For Geovisualization
import plotly.express as px
加载数据集
df = pd.read_csv('data/Coffee Brands Footprint.csv',
index_col=0)
df.head()

作者图片:我们数据集的前五次观察。
PLOTLY EXPRESS 的一行代码
px.scatter_geo(df,
lat = df['lat'],
lon = df['lng'],
color = df['brand'],
hover_name = df["name"],
width=1600,
height=800,
)
我们有我们的输出:

作者图片
正如我们所看到的,我们已经制作了一个交互式 geoplot,但我们可以对其进行定制和进一步改进。
我们将进行以下改进:
- 剧情以菲律宾为中心。
- 让画面的焦点只在亚洲。
- 更改了分散点的不透明度或透明度。
要完成这三(3)件事很简单:我们只需提供与这些所需更改相对应的参数,但首先,这是一个非常有用的提示:
提示:自动对一个国家进行地理编码
要自动提取国家/地区的地理编码,请导入姓名,然后继续执行以下操作:
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="geocoder") #Do not forget to put in the user_agent argument (and should be a customized one)
location = geolocator.geocode("Philippines")
print((location.latitude, location.longitude))

图片由作者提供:Nominatim 自动生成 PH 的地理编码
现在,我们可以使用这些坐标来填充需要字典输入的center。scope参数可用于改变任何大陆上的帧焦点。探索projection参数,看看你的情节如何随着每一个选择而变化。
最后,我们可以使用opacity参数改变点的透明度:
px.scatter_geo(df,
lat = df['lat'],
lon = df['lng'],
color = df['brand'],
hover_name = df["name"],
scope='asia',
projection='natural earth',
width=1600,
height=800,
center={
'lat': location.latitude,
'lon': location.longitude
},
opacity=0.5
)

图片由作者提供;定制后的 Plotly Express Geoplot
优点和缺点
与其他库相比,易于使用本身是一个很大的优点,但也有缺点。
与其他库相比,plotly express 的另一个优势是它可以支持动画(这是另一篇文章),并且将是我们已经令人印象深刻的可视化的一个愉快的补充。
然而,缺点是,与其他库(如更容易部署的 follow 甚至 Holoviews)相比,定制是有限的。
结束语
对于希望了解什么是以及如何进行交互式地理可视化的初学者,plotly express 提供了完美的培训场所和学习库。
然而,随着我们的需求变得更加复杂,我们可能需要执行更多的计算并使用更多的低级库来完成这些,但是我们将在后续文章中讨论这些。
我的 Github 页面上的全部代码。
查看我的其他文章:
交互式地理可视化之战第 1 部分—使用一行代码的交互式地理地图
使用 Google Places API 和 leavy 绘制您在菲律宾最喜欢的咖啡店地图
交互式地理可视化之战第三部分:Plotly 图形对象(Go)
PYTHON。数据科学。地理可视化。
充分利用 Plotly 对日益增长的地理可视化需求的响应

我们离开的地方
在本系列的第一部分:交互式地理可视化之战第 1 部分—使用一行代码的交互式 geo plot,我们讨论了地理可视化对于以地理为特征的数据科学项目的重要性。通过一行命令,我们讨论了如何使用 Holoviews 交互绘制。
在上一篇文章中,我们讨论了如何使用 Plotly express 绘制相同的数据集。虽然在语法方面易于理解,但 Plotly express 缺乏可以定制我们的绘图的高级工具和命令。
在本文中,我们将看到 Plotly 有一种方法来弥合这些需求,但使用了不同的包—Plotly Graph Object(Plotly go)。
PLOTLY GRAPH OBJECTS (GO)与 PLOTLY EXPRESS
在这篇文章中,我们不会详细讨论为什么这个模块被称为 graph objects ,而是直接将它与上一篇文章中我们已经知道的内容进行比较。(关于 graph_objects 的技术细节的详细解释可以在 这里 找到。)
在不使事情变得太复杂的情况下,plotly 和plotly express的graph_objects模块可以生成相同的基本图形。这里的关键词是“基本”。
这意味着你可以用 plotly express 做的任何事情,你都可以用graph_objects模块来做,尽管它不仅仅是一行程序。正如我们在上一篇文章中所解释的,plotly express 旨在拥有更简单的语法,同时保留大部分 plotly 功能。
然而,反过来就不正确了:并不是所有使用graph_objects模块可以做的事情在 plotly express 中都是可行的。这只是简单性和定制能力之间的权衡。
不多说了,让我们开始编码吧!
编码
预赛
import plotly.graph_objects as go
import pandas as pd
加载数据集
加载相同的数据集,我们有:
df = pd.read_csv('data/Coffee Brands Footprint.csv',
index_col=0)
df.head()

作者图片:我们数据集的前五次观察。
颜色词典
为每个品牌建立我们想要的颜色:
color_dict = dict(zip(list(df.brand.unique()),
['rosybrown', 'palegreen', 'indianred', 'brown']))
主代码
fig = go.Figure(data=go.Scattergeo(
lon = df['lng'],
lat = df['lat'],
text = df['vicinity'],
mode = 'markers',
marker = dict(
size = 8,
opacity = 0.8,
reversescale = True,
autocolorscale = False,
color=[color_dict[x] for x in df['brand']],
symbol = 'circle',
line = dict(
width=1,
color='rgba(102, 102, 102)'
) )))
让我们解释一下上面的代码部分:
- 走吧。Scattergeo 将提供的参数转换成 graph 对象,该对象将由
go.Figure参数使用 go.Figure的争论改变了我们的走向。将地理对象分散成实际图形- 我们将它存储在变量 fig 中,以便该对象可以接收我们想要实现的定制。
要查看这个图形,请调用 show()方法。
fig.show()

作者提供的图像:生成的底图类似于 Plotly Expres 的底图
现在我们已经有了基本地图,让我们添加一些自定义!
定制 1 —增加布局
为了增加版面,我们将访问update_layout模块。
fig.update_layout(height=600, margin={"r":0,"t":0,"l":0,"b":0})
fig.show()

作者提供的图片:更新了布局尺寸的底图
自定义 2-地图的缩放和居中
回想一下,在我们上次的更新中,我们发现很难将我们的地图放在菲律宾的中心,因此,我们总是需要缩放很多次才能看到我们想要的位置(例如菲律宾)。
使用 Plotly Go,我们已经可以做到这一点。
首先,我们把范围限制在“亚洲”。
fig.update_geos(
visible=False, resolution=50, scope="asia",
showcountries=True, countrycolor="Black",
showsubunits=True, subunitcolor="Blue"
)fig.show()

作者图片:更新范围的地图
接下来,我们可以添加使地图以菲律宾、经度和纬度为中心的参数。回想一下,我们在之前的帖子中已经为此指定了代码。
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="geocoder") #Do not forget to put in the user_agent argument
location = geolocator.geocode("Philippines")
print((location.latitude, location.longitude))
接下来,参数projection_scale类似于 Mapbox 的缩放参数(我们将有单独的文章讨论)。摆弄这些信息给了我们:

作者提供的图像:应用于底图的投影比例
定制 3-地图的背景
最后,Plotly go 的另一个可能的定制是底图的定制。使用此选项,可以对地图元素进行定制,例如是否显示海洋、陆地、湖泊等。以及它们的颜色。
使用update_geos方法:
fig.update_geos(
resolution=50,
showcoastlines=True, coastlinecolor="RebeccaPurple",
showland=True, landcolor="#C1E1C1",
showocean=True, oceancolor="#99cccc",
showlakes=True, lakecolor="Blue",
showrivers=True, rivercolor="Blue"
)fig.show()

按作者分类的图像:应用于地图的背景
颜色参数可以提供十六进制或 RGB 代码,以便更好地定制。
最终图形
下面,我们将看到最终的图表,以及它的交互功能:

作者 GIF:最终输出
结束语
Plotly 图形对象真正是 Plotly 进入交互式可视化的战斗。通过交换我们在 Plotly express 中看到的一些简单性,我们可以对我们的交互式地图进行更多的定制。
我鼓励我们的读者尝试其他功能,如定制您自己的地图框图块并与 Plotly go 一起使用,以及使用定制标记。
在下一篇文章中,我们将探索另一种交互式地理空间可视化。敬请期待!
查看我的其他文章:
交互式地理可视化之战第一部分——使用一行代码的交互式 geo plot
交互式地理可视化之战第二部分——使用一行代码的交互式地理地图
使用 Google Places API 和 fluous 为您在菲律宾最喜欢的咖啡店绘制地图
贝叶斯人赢得了数据科学
常客想要重复这个实验

虽然这两种方法至少在十八世纪就已经存在,但在二十世纪的大部分时间里,频率统计方法远比贝叶斯统计方法更受欢迎。在过去的几十年里,一直有一场争论——我不会说宿怨——关于一个对另一个的优点。我不想给这场争论煽风点火,但是这两个统计学流派在谈话和文献中经常被提及,这有助于对它们的内容有一个像样的概念。
这两者之间的主要区别是理论上的解释差异,这种差异确实会影响一些统计模型的工作方式。在 frequentist 的统计中,对一个结果的信心的概念是一个度量,如果你多次重复实验和分析,你期望得到相同结果的频率。95%的置信度表示在 95%的重复实验中,你会得出相同的结论。术语frequency ist来源于这样一个概念,即统计结论是基于某一特定事件发生的预期频率,从多次重复中得出的。
贝叶斯统计更接近于概率的概念。贝叶斯统计推断的结果通常用概率分布来描述,而不是具有频率主义者的置信度。此外,贝叶斯概率可以直观地描述为对随机事件将要发生的相信程度。这与频率主义概率相反,频率主义概率将概率描述为在无限系列的这种事件中发生的某些随机事件的相对频率。
老实说,对于许多统计任务来说,使用频率主义者还是贝叶斯方法并没有什么区别。常见的线性回归就是其中之一。如果以最常见的方式应用,这两种方法会产生相同的结果。但是这两种方法之间存在一些差异,导致了一些实际的差异,我将在这里讨论这些差异。
声明:我主要是贝叶斯主义者,但我不会片面地说频繁主义者的方法不好或不好。我认为,决定一种方法最重要的因素是理解每种方法隐含的假设。只要你理解这些假设并且觉得它们合适,这两种方法都是有用的。
先验分布
贝叶斯统计和推断要求您对模型参数的值有一个先验的信念。在你开始分析你的主数据集之前,这个先验的信念应该在技术上被公式化。但是将你先前的信念建立在你的数据上是一种叫做经验贝叶斯的技术的一部分,这种技术可能是有用的,但是在某些圈子里是不被认可的。
先验信念可以简单到“我认为这个参数非常接近零,给或拿一个或两个,”这可以正式转化为正态分布或另一个适当的分布。在大多数情况下,可以创建无信息的(或平)先验,这是为了告诉你的统计模型“我不知道”,在严格意义上。在任何情况下,先验信念必须被编入概率分布,成为统计模型的一部分。在本章前面的微阵列协议比较示例中,我描述的超参数是一些模型参数的先验分布的参数。
一些统计学家对制定这种先验分布的必要性提出异议。显然,他们认为,如果你在看到数据之前对模型的参数值一无所知,你就不应该形成一个先验的信念。我很想同意他们的观点,但是在大多数情况下,不提供信息的先验分布的存在使得 Bayesians 人可以通过使先验分布变得不相关来回避先验分布的要求。此外,没有先验信念的频率主义统计概念,如果你试图将其形式化,看起来很像贝叶斯统计中的非信息先验。您可能会得出结论,frequentist 方法通常有一个隐含的先验分布,但没有明确表示出来。有了这些,我并不是说频率主义者是错的,贝叶斯方法更好;相反,我打算说明这两种方法是如何非常相似的,并揭穿这一概念,即要求有一个预先的信念在某种程度上是一个缺点。
用新数据更新
我已经解释了贝叶斯统计中先验分布的存在并不是一个缺点,因为大多数时候你可以使用一个非信息性的先验。现在我将解释为什么前科不仅不是坏事,而且是好事。
除了“你必须有先验知识”之外,频率统计和贝叶斯统计之间最常被引用的一个区别是“你可以用新数据更新你的模型,而不必包含旧数据。”在贝叶斯框架中,实现这一点的方法非常简单。
假设不久前你有一个统计模型,你收到了第一批数据。你做了贝叶斯统计分析,并使用非信息先验来拟合你的模型。拟合贝叶斯模型的结果是一组被称为后验分布的参数分布,因为它们是在数据被纳入模型后形成的。先验分布表示您在让模型看到数据之前所相信的,后验分布是基于您的先验信念的新信念,加上模型看到的数据。
现在你得到了更多的数据。使用旧的非信息先验,而不是挖掘旧的数据并立即对所有数据重新调整模型,您可以基于第一组数据获取后验分布,并使用这些后验分布作为将模型拟合到第二组数据的先验分布。如果数据集的大小或计算能力是一个问题,那么贝叶斯更新技术可以节省大量的时间和精力。
今天,随着许多实时分析服务的开发,贝叶斯更新提供了一种快速分析大量数据的方法,而不必在每次需要一组新结果时返回并重新检查所有过去的数据。
传播不确定性
在 frequentist 和 Bayesian 统计之间的所有差异中,我最喜欢这个,尽管我没有经常听到有人提到它。简而言之,因为贝叶斯统计持有接近概率的概念-它以先验概率分布开始,以后验概率分布结束-它允许不确定性通过模型中的量传播,从旧数据集传播到新数据集,从数据集一直传播到结论。
我在本书中多次提到,我是承认不确定性存在并跟踪它的忠实粉丝。通过向一等公民推广概率分布,正如贝叶斯统计所做的那样,模型的每一部分都可以携带自己的不确定性,如果你继续正确使用它,你就不会发现自己对结果过于自信,因此得出错误的结论。
我在生物信息学领域发表的几篇学术论文中,我最喜欢的一篇强调了这个确切的概念。那篇论文的主要发现,叫做“通过集成贝叶斯聚类和时间过程表达数据的动态建模改进基因调控网络的推断”(PloS ONE,2013)——标题脱口而出,不是吗?—展示了基因表达测量中的高技术差异如何通过贝叶斯模型从数据传播到结果中,从而更准确地描述哪些基因与哪些基因相互作用。同一主题的大多数先前工作完全忽略了技术差异,并假设每个基因的表达水平仅仅是技术复制值的平均值。坦率地说,我发现这很荒谬,所以我开始纠正它。我可能没有完全实现这个目标,正如这篇论文引用如此之少所暗示的那样,但我认为这是一个完美的、真实的例子,说明了在统计分析中承认和传播不确定性如何导致更好的结果。此外,我将我在论文中提出的算法命名为贝叶斯网络聚类,也称为 BACON,所以我有这个名字。
摘自 像数据科学家一样思考 由 布莱恩·戈赛 。
Brian Godsey 博士是一名数学家、企业家、投资者和数据科学家,他的著作 像数据科学家一样思考 现在有印刷版和电子书。——briangodsey.com
如需更多信息,请下载免费的第一章 像数据科学家一样思考 并查看此 幻灯片演示文稿 了解更多信息和折扣代码。
亚马逊消费的野兽,以及面对它的最佳方式。
实践教程
用 CRISP-DM 之剑划破数据的阴霾,用 Python 在我们身边征服金钱怪兽。

你是否倾向于在网上购买小额商品而不考虑这些商品加起来有多少钱?想要查看您的总支出,但又害怕打开您的购买历史记录?相信我,你和我在同一条船上。
虽然我认为自己是一个理性的买家,但没有一年我不在想我的收入有多少被亚马逊浪费了。我一直在进行一键式购物,通过smile.amazon.com向慈善机构捐赠合格购买价格的 0.5%来安抚我的良心,而不看汇总统计。到目前为止,如果不多花 100 英镑购买抗焦虑药物,我不可能理解如何面对现实,但数据科学拯救了我。
阿基米德说:“给我一个支点,我可以撬动地球。”“给我一个笔记本,让我在里面记录熊猫”,我大声回答,“我会征服亚马逊的野兽!”
让我们把我们的英雄任务变成一出戏,用柔和调色板中的图表覆盖那些尖锐的数字,这样即使不能获胜,至少也有一点机会幸存下来并保持我们的理智。
首先,我们需要选择我们的武器。没有什么比 CRISP-DM 之剑更能穿透数据的迷雾,这是一个经过行业验证的框架,有助于构建我们的分析工作。

由 Ricardo Cruz 在 Unsplash 上编辑的照片
业务理解
在我的例子中,这意味着我需要定义一组问题:
- 我一年花了多少钱?哪一年我疯狂购物,花钱最多?请注意,我们不是问为什么,因为那需要一两次(或十几次)治疗。
- 在那疯狂购物的一年里买了什么?
- 我的大部分费用属于哪几类?
- 如果我们选择前 6 个类别,我是否倾向于每年花费相同的金额?
- 最可怕的问题是,我在最常见的费用类别上花费的最大金额是多少?
- 最后,我预计 2021 年的总购买量是多少?
数据理解
在这里,我们将探索可用的数据。
第一步。收集数据。由于我是在和亚马逊打交道,所以我直接去了你的账户>你的订单> 订单历史报告,下载了一个. csv 文件,里面有我的订单历史。(谢天谢地,我现在还不用打开它。)
第二步。让你的 Jupyter 笔记本运行起来,并加载一些库。
第三步。熟悉数据并概述数据质量和整洁性问题,如果有。
我没有看到任何结构错误,所以就整洁度而言,我的数据状态良好。我确实做了一些结构上的修改,但那是在建模阶段。(顺便说一句,如果你想了解更多关于什么构成了一个整洁的数据集,这里有一篇很棒的文章。)
至于质量,这里有一些我需要注意的事情:
- 删除我不需要的额外列
- 将“订单日期”格式更改为日期时间
- 将“购买年份”提取到一个单独的列中,并删除 2021 年的值,以进行彻底的区分
- 通过删除$符号并将其转换为数字来格式化“项目合计”
- 删除或估算缺失值
- 给数据更恰当的标签
因此,我们进入下一阶段。
数据准备
按照上面列出的任务列表:
数据建模和结果评估
现在到了有趣的部分,我们通过执行建模和统计分析来找到问题的答案。在我们开始之前,我想分享一个我偶然发现的seaborn cheat sheet,讽刺的是它是由亚马逊 AWS 通过 DataCamp 托管的。(这几乎就像是亚马逊在推我前进。)
所以,我的第一个问题分为三个部分:
我一年花了多少钱,哪一年损失最大?

作者图片
根据以上判断,似乎 2014 年和 2017-2018 年在我的钱包上留下了印记(或者更确切地说,是一个大洞),但我们需要更清晰的视角来确认。

作者图片
是的,就在那里,2018 年几乎就在 10K 了……为自己辩护,我丈夫和我经常在亚马逊上购买家用电器——但我真的能说是电子产品和智能技术打败了我吗?让我想想…
2018 年采购的大部分是什么?

作者图片
好了,麦克风、耳机、空气净化器——这些都很棒。但是口香糖,真的吗?我想知道如果我们看整个八年期间,它会得到什么排名。(不过,仔细想想,我真的想知道吗?)
我的大部分支出属于哪几类?
首先,按数量:

作者图片
然后按金额:

作者图片
更多的宠物垫和宠物食品(拥有腊肠狗是要付出代价的……),鞋子和美容用品——好吧,这些我都能应付。谢天谢地,书籍进入了第一个数量表——你会在最底部看到它们。差不多 2000 美元的蛋白质棒,尽管……谢天谢地,Seaborn 漂亮的颜色减轻了打击。
现在的问题是如果我们将自己限制在前 6 个类别,并查看整个 8 年期间的分布,我的支出会逐年变化吗?

作者图片
答案是肯定的,它们确实有所不同。不确定这是好消息还是坏消息,因为显然不可预测的买家行为…我会用积极的方法,因为我似乎不再花一大笔钱在那些该死的蛋白质棒上。此外,美容和鞋类支出似乎正在逐步减少——这要归功于新冠肺炎。猜猜看,最后,我被宠物垫困住了。毕竟是坏消息。
我不认为情况会比这更糟,所以我准备回答最可怕的问题
我在普通商品上的最大花费是多少?

作者图片
如果你还不熟悉方框图,请注意圆点代表异常值(很高兴听到我没有每次花 200 美元买宠物食品和 300 多美元买体育用品)。方框内的竖线显示的是中位数,方框本身代表的是四分位距(基本上就是上半部分和下半部分中位数之差)。最后,外部线条(又名胡须)相应地指示最小值和最大值。
好吧,我要说这还不算太糟,尤其是考虑到这些昂贵的商品中没有一件价格超过 450 美元。另一个可以问的问题是,我购买的最贵的东西一般是什么,不管他们的类别是否进入前 15 名,但这将是另一份报告的问题…
部署
说到报告,我想说我们的 CRISP-DM 框架的最后阶段也已经完成。对我来说,这意味着开发并记录一个部署模型的计划,生成一个报告,并将发现传达给涉众。完了,完了,完了。
然而,一个细心的读者可能会想:2021 年购买预测的最后一个问题发生了什么?嗯,有人可能会认为这太可怕了,所以我决定不与公众分享。但事实上,我的模型是绝对可怕的,因为它缺乏任何相关的特征,这意味着我不能完全凭良心相信它预测的标签。
不管怎样,我将与你分享代码和结果,因为我只是为了练习而构建它。这是另一个诱因——两个模型都预测支出会比前几年低得多!这是不是意味着将会有另一次为期 10 个月的隔离封锁,没有理由去获取东西?我想这取决于你的解释…
附:sklearn 预测建模实践# 1
当我开始从事这项工作时,我必须处理分类数据(商品名称、亚马逊类别等。),我随后将其转换为虚拟变量。但后来我意识到,我需要按年(而不是按项目)计算的总支出,所以我继续对数据进行分组,加入一些样本工资值:

作者图片
你可以看到我们的模型非常吻合,考虑到我给它的数据少得可笑。它预测我 2021 年的亚马逊年度支出将达到 5777 美元。
p . p . s . stats models 预测建模实践# 2
在这里,我必须引入一个截距(如果我要使用伪变量,就需要删除其中一个)。代码很简单,而且比第一个更合适,所以肯定是赢家(尽管就我的支出而言,它有点不太乐观,预计每年的商品价值为 5830 美元)。

作者图片
我说这就是有趣的周末项目。虽然,它永远不会真正结束,不是吗……下一次,不是穿过数据的迷雾,我说我们完全驱散它,使用回归模型,有真正的权重和值。**
直到我们再次相遇!
数据科学家应对 ML 面试初学者指南
地面零点
解决集群挑战的分步指南

Joppe Spaa 在 Unsplash 上的照片
数据科学面试通常有三个技术步骤:(a)SQL 挑战,( b)ML 挑战,( c)现场技术面试。前两步成为标准,而第三步因公司而异。在这篇文章中,我的目标是帮助你战胜“ML 挑战”这一步。如果您对 SQL 挑战感兴趣,可以查看下面的文章。
根据数据类型,机器学习挑战可以分为三组:表格、文本和图像。这些组的高级概念和步骤是相似的;但是实现细节不一样。
公司通常根据候选人使用的数据类型来面试他们。例如,如果他们处理文本数据,您将主要通过自然语言处理技术进行检查。尽管如此,许多公司仍然用经典的机器学习技术来评估候选人,这些技术主要集中在分类 T21 或聚类。
在本文中,我将一步步向您介绍一个典型的机器学习挑战的例子,这些挑战主要集中在聚类上。这是几年前我在一次采访中接受的挑战。现在,我想和大家分享一下我是如何解决的。我们开始吧。
https://sharpestminds.com?r=pedram-ataee
问题
给定一个物品列表,将那些只与一个主题相关的物品分组。主题可以根据需要以任何方式定义。”
解决办法
这个问题和上面一样简单。对象列表及其相应的特征以表格的形式给出。我没有在这里描述这些数据,因为对于你的情况会有所不同。然而,解决这一挑战的主要步骤是相同的。为了解决这个挑战,我采取了几个步骤:
- 预处理
- 模型建造,以及
- 车型评测。
在每次数据科学面试中,你都必须采取上述所有步骤。你可以在下面找到我的解决方案的细节。请注意,面试不仅仅是解决挑战。这个挑战是一个深入讨论每个步骤中存在的挑战的机会。所以,也要为此做好准备。
1 —预处理
在输入机器学习算法之前,必须对数据进行清理。为了简单起见,我进行了两个最重要的预处理步骤:M 丢失值和归一化。
- 缺少值。您可以使用插补或删除等方法处理缺失值。为了简单起见,我在这个挑战中使用了简单的方法,没有探究它们的功效。我只是使用
df.fillna(0, inplace=True)将值为NaN的字段替换为0。你可以在本文中阅读更多关于处理缺失值的技术:如何处理缺失数据。 - 正常化。我还使用
MinMax方法标准化了数据。也可以使用其他方法,如Standard Scaler。你可能会问“哪个更好?”。答案是“看情况。”最佳必须是指总体上产生最佳分类或聚类结果的选择。因此,您必须建立一个完整的模型构建和评估管道。然后,在每个步骤中尝试不同的方法,以找到哪种配置会产生最佳结果。
mms = MinMaxScaler()
normalized_data = mms.fit_transform(df[df.columns[1:]])
df_original = pd.DataFrame(normalized_data, columns=df.columns[1:])
在这一步结束时,数据为模型构建步骤做好了准备。
2 —模型构建
正如问题描述中所描述的,我被要求根据一个主题对对象进行聚类。
要聚类一个没有标签的数据集,一个重要的问题是“正确的聚类数是多少?”。例如,当您想使用要求您固定聚类数的 k-means 算法时,您必须回答这个问题。我想在这个挑战中使用 k-means,所以我必须找出集群的数量。
通常使用两种主要技术来识别群集的数量:轮廓和肘形。我在这次挑战中使用了这两种技术来表明我意识到了它们的不同。在这篇文章中,我只分享了肘法。想了解更多关于廓形和手肘的知识,可以看看这篇文章:廓形还是手肘?这是个问题。
在 Elbow 方法中,您必须绘制惯性(即样本到其最近聚类中心的平方距离之和)与聚类数的函数关系,如图 1 所示。然后,必须选择曲线的肘部作为簇的数量。根据肘法,在这个挑战中,集群的数量必须设置为 3。
def kmeans_simple(data, cluster_range):
inertias = []
for num_cluster in cluster_range:
model = KMeans(n_clusters=num_cluster)
model.fit(data)
inertias.append(model.inertia_)
return inertiascluster_range = range(1, 20)
inertias_original = kmeans_simple(df_original, cluster_range)

图 1 —“惯性”与“聚类数”的对比—肘形法
知道了num_cluster,我只需要对数据运行KMeans方法。注意,因为我想在下一步中可视化,所以在应用KMeans之前,我将数据维度减少到 2。这项挑战中使用的降维技术是主成分分析(PCA),这是一种常用于可视化的经典技术。
pca = PCA(n_components=2)
df_reduced = pca.fit_transform(df_original)
pca_components = pd.DataFrame(df_reduced)
kmeans = KMeans(n_clusters=3, init='k-means++', max_iter=300, ... n_init=10, random_state=0)
kmeans.fit(df_reduced)
y_kmeans = kmeans.predict(df_reduced)
centers = kmeans.cluster_centers_
3 —模型评估
该问题要求根据主题对对象进行聚类。在这个挑战中,我把“一个主题”解释为“一个可分离的集群”。在步骤 2 中,我发现数据可以正确地分为 3 类。所以,我把物品分成三个主题。请注意,在这种挑战中,集群数量没有对错之分;只有一个最优的。用num_clusters=3运行 k-means 后,我可以很容易地确定两个对象是否属于一个集群。
plt.figure()
plt.scatter(pca_components[0], pca_components[1], c=y_kmeans, s=50, cmap='Set3')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.scatter(centers[:, 0], centers[:, 1], c='black', s=200)
plt.show()
最后,我将数据绘制成二维图,以验证拥有 3 个聚类的假设是否合理。图 2 支持这一发现。这是评估集群是否运行良好的最简单的方法。评估聚类结果的另一种方法是将一种技术的结果与另一种技术的结果进行比较。这就是为什么我同时使用肘部和轮廓的方法。

图 2—散点图
临终遗言
这是一个集群挑战的例子。我可以更详细地完成每一步。由于这是一次面试,所以我只执行了基本的,追求的是根本。如果你正在处理一个真实世界的挑战,你会看到它有多大的不同。希望这能帮助你赢得数据科学面试。
感谢阅读!
如果你喜欢这个帖子,想支持我…
https://pedram-ataee.medium.com/membership
面向数据科学家的 SQL 面试初学者指南
地面零点
通过基础知识、示例和日常工作中需要的实用技术的结合

在大多数数据科学面试中,你的 SQL 技能会以某种方式得到检验。你必须在你的技术面试中写一些 SQL 查询,并且在你的日常工作中写很多。不管你是在小公司还是大公司工作,SQL 编程都是你工具箱中的重要工具。您可以使用 SQL 编程来处理小型和大型数据集,尤其是 Spark SQL 等高级查询引擎。
Spark (一个用于大规模数据处理的开源统一分析引擎)有一个名为 Spark SQL(一个分布式 SQL 查询引擎)的模块,可以让你高效地管理大数据中的 SQL 查询。 Databricks 是一款增长最快的管理数据仓库的企业软件,它提供了一个用户友好的环境来设置 Spark SQL 引擎。所以,在你的职业生涯中,要做好学习 SQL 编程的准备。
一次数据科学面试通常有三个技术步骤: SQL 编程、 ML 开发、一次现场技术面试。如今,SQL 编程和 ML 开发步骤非常标准。不同公司的现场面试各不相同。在这篇文章中,我的目标是帮助你赢得 SQL 编程面试。
如果你觉得这篇文章有用,可以通过下面的链接订阅。这将有助于我为你创造高质量的内容。
https://pedram-ataee.medium.com/membership
这篇文章的结构如下:
- SQL 编码的基础是什么?
- 一个简单的 SQL 问题的例子
- 一个有用的技巧:“参数化查询”
- 遗言
我们开始吧。
SQL 编码的基础是什么?
您应该从任何您熟悉的资源中学习 SQL 编程的基础知识。从 w3school 网站学到了很多,强烈推荐以后去看看。
1.挑选
SELECT语句用于从数据库中提取数据,如下SELECT column1_name FROM table_name。如果您想提取数据库中的所有内容,也可以在SELECT后使用*。SELECT DISTINCT语句可以用来提取唯一的值。一个列通常包含许多重复的值,有时您只需要提取唯一的或不同的值。
2.在哪里
WHERE语句用于从数据库中过滤记录,如下所示SELECT column1_name FROM table_name WHERE condition;,它只返回那些满足在此之后写入的条件的记录。您可以在条件中使用各种运算符,例如:>、=、IN、LIKE或BETWEEN。您还可以使用AND、OR和NOT运算符组合多个条件,以缩小过滤器的范围。
3.以...排序
ORDER BY语句用于将结果按升序ASC或降序DESC排序。默认情况下,它按升序对记录进行排序。您可以尝试使用下面的代码来提取按column1_name和column2_name排序的表中的所有内容:SELECT * FROM table_name ORDER BY column1_name ASC, columne2_name DESC
4.数数
COUNT()函数返回符合指定标准的行数,如下:SELECT COUNT(column_name) FROM table_name WHERE condition;您可以尝试其他 SQL 函数,而不是COUNT,例如AVG或SUM来返回一个数值列的平均值或总和。
5.分组依据
GROUP BY语句提取一列中具有相同值的行,并将它们分组为汇总行,比如“查找每个学校的学生人数”。GROUP BY语句通常与COUNT()、MAX()、MIN()、SUM()、AVG()等聚合函数一起使用,对结果进行分组。你可以查看下面的代码。
SELECT *column_name(s)*
FROM *table_name*
WHERE *condition*
GROUP BY *column_name(s)* ORDER BY *column_name(s);*
还有更多 SQL 命令可以从 w3school 比如JOIN或者CASE中学习。JOIN子句用于根据两个或多个表之间的相关列来组合它们的行。或者,CASE语句经过几个条件,当第一个条件满足时返回值,与其他编程语言中的if-then-else语句完全相似。

照片由Olav Ahrens rtne在 Unsplash 上拍摄
—一个简单的 SQL 问题示例
下面的问题摘自 Leetcode ,这是一个很棒的网站,在这里你可以练习你的编码技能。你可以在那个网站上找到更多的问题。
问题:我们有一个名为Activity的表,包含一系列游戏玩家的 4 个字段:palyer_id、device_id、 event_date和 games_played。每一行都是一个玩家的记录,他在某一天使用相同的设备登录并玩了许多游戏(可能是 0 个游戏)。编写一个 SQL 查询,报告每个玩家的首次登录日期。
解决方案:如您所见,该解决方案使用了您在上面学到的命令。
SELECT
player_id
MIN(event_date) AS first_login
FROM Activity
GROUP BY player_id

Anton Maksimov juvnsky 在 Unsplash 上拍摄的照片
—一种有用的技术:“参数化查询”
当你必须编写大量类似的查询时,你可以使用一种叫做“参数化查询”的技术。这将有助于你写出更高效的代码,也能展示你在编程方面的专长。在这里,我描述了如何使用 Python 编写参数化的 SQL 查询。
假设您想要编写一个可以用于不同字段和表的COUNT查询。在这种情况下,您可以将第 1 部分保存在下面的代码中,例如保存在count.txt下。然后,您必须使用第 2 部分解析(加载和填充)Python 中的参数化查询,代码紧随其后。
------------------------------------------------------
# PART 1 (SQL) - PARAMETRIZED QUERY saved as count.txt
------------------------------------------------------
SELECT {var}, count({var}) as count
FROM {table_name}
GROUP BY {var}
ORDER BY count DESC---------------------------------
# PART 2 (PYTHON) - QUERY PARSER
---------------------------------
class Query:
def __init__(self, table_name, var):
self.table_name = table_name
self.var = var
self.parsed = None def parser(self):
file_path_query = os.path.join(FILE_DIR, 'count.txt')
with open(file_path_query, 'r') as file:
template = file.read().replace('\n', ' ')
self.parsed = template.format(table_name=self.table_name,
var=self.var)
—遗言
SQL 编程面试可以现场,也可以离线。如果它是脱机的,将根据您的代码是否可执行来评估您。否则,将根据代码的总体质量和你的沟通能力对你进行评估。让我们深入了解每一个问题。
代码质量
面试官会评判你的代码质量(当然不是你!)基于几个角度。首先,他们想看看代码是否是没有任何语法错误的可执行代码。然后,他们检查你的代码是否干净简洁。第三,面试官会检查你是否考虑过边缘案例。如果你不能写干净的代码或者在时间盒中考虑边缘案例,确保知道最佳实践并与你的面试官分享。最后,他们会检查你的解决方案在效率方面是否优化。例如,使用一个连接或三个连接可以得到相同的结果。前者更优化。
沟通
在每一次面试中,与面试官进行有效的交流是很重要的。然而,有效的沟通意味着什么?有效沟通的第一步是在开始编码之前,清楚地与面试官分享你的思维过程。另外,你必须能够为你的每一个选择阐述你的推理。我再怎么强调分享思维过程和阐述推理的能力有多重要也不为过。我可以和在编码面试中代码不可执行的人一起工作,但不能和沟通失败的人一起工作。
感谢阅读!
如果你喜欢这个帖子,想支持我…
https://pedram-ataee.medium.com/membership
现代数据堆栈初学者指南
一个由博客、书籍、时事通讯、播客和社区组成的列表,涵盖了所有现代数据堆栈

梅勒妮·德泽尔在 Unsplash 上的照片
最近, Atlan 的一名新员工问我,“你给我推荐了哪些资源来让我掌握现代数据堆栈的最新动态?”
现代数据堆栈杂乱而复杂,并且每天都在变化。有大量关于它的新闻,很难将炒作和噪音与现实分开。
以下是我们的团队如何与最新的新闻和趋势保持联系。
现代数据堆栈 101
现代数据平台的基石
我的博客文章是定义现代数据平台的初学者指南,现代数据平台的关键构建块,以及堆栈每个阶段的顶级工具和公司。
现代数据基础设施的新兴架构
基于对 20 多名从业者的采访,从 a16z 获得了关于哪些技术在现代数据堆栈中胜出的精彩、深入的阅读。
2020 年现代数据栈大会
Fivetran 第一届现代数据堆栈会议的资源,介绍了最新的创新、工具和最佳实践。
现代数据堆栈:过去、现在和未来
特里斯坦·汉迪的这篇博客很好地介绍了创造现代数据堆栈的基础创新,我们现在所处的位置,以及未来创新需要关注的关键领域。
建立和运行数据团队
创建数据驱动型组织
这是我最喜欢的入门书籍之一,讲述了如何建立和运行一个数据驱动的组织。这本书的特色是来自卡尔·安德森的实用建议,他在担任 Warby Parker 的数据科学总监时写了这本书,目前是 WW (Weight Watchers)的数据副总裁。
分析分析仪
我在数据团队中遇到的最大挑战是将人们定型为传统的 JDs。以我的经验来看,我从来没有找到一个典型的“数据科学家”或者“数据工程师”或者“数据分析师”。
我找到了 Sandy,她是一名训练有素的经济学家,在理解业务问题、确定解决方案和构建数据科学方法原型以解决这些问题方面表现出色。或者 Pam,他是一名训练有素的计算机工程师,擅长生产和缩放模型,但也喜欢运行 POC。或者是 Mark,他也是一名计算机工程师,但更像是一名多面手,擅长一半是数据科学家、一半是工程师的角色。
Sean Murphy、Marck Vaisman 和 Harlan Harris 的这本书打破了我们对数据团队中不同类型的人的规范。它没有试图对数据人员进行定型,而是构建了不同技能集的热图,以及它们如何与数据团队中的不同角色相关联。

O'Reilly 关于建立和运行数据团队的两部巨著
萧条的社区
局部乐观
这是我最喜欢的供应商中立的数据领导者和从业者社区之一。它充满了非常深思熟虑的讨论,特别是关于数据团队和结构。
dbt
dbt 的 Slack 社区是最活跃的数据从业者群体之一,他们称之为“分析工程师”。
远大前程
这是一个新兴的社区,大部分都是数据工程师,他们在一起讨论我最喜欢的话题之一:信任!
时事通讯
数据科学综述
每周,特里斯坦·汉迪(Tristan Handy)都会整理一系列数据链接以及他的叙述和想法,读起来总是很有趣。这些帖子内容广泛,涵盖了从数据文化和数据团队到新工具和堆栈层的所有内容。
数据工程周刊
Anand Packkildurai 每周策划顶级阅读,主要关注数据工程。
数据委员会
他们的时事通讯包括热门阅读、即将到来的事件等等,通常集中在开源项目上。
现代数据堆栈
由 Andrew Ermogenous 策划,这份时事通讯分享了关于现代数据堆栈和数据文化的博客、指南和播客。

数据科学综述(左)和现代数据堆栈(右)新闻简报摘录
博客和播客
走向数据科学
这可能是涵盖所有数据的最受欢迎的博客。凭借广泛的外部贡献者和优秀的内容编辑指南,它已成为数据从业者分享文章的首选目的地。
数据工程播客
由托拜厄斯·小萌主持,这个播客主要涵盖了关于不同数据工具的深入对话。现代的数据堆栈会很快变得混乱,所以这是一个解开宣传和营销信息的绝佳资源。他的谈话总是涉及到我们需要了解的关于新数据工具或项目的信息:它如何工作,如何部署,与其他工具相比如何,等等。
局部乐观
本博客重点关注来自各种数据领导者的关于建立和运行数据团队的实用技巧、诀窍和知识。
有什么推荐补充?联系 Atlan 的 Prukalpa 或 团队。
发现此内容有帮助?在我的时事通讯《元数据周刊》上,我每周都写关于活动元数据、数据操作、数据文化和我们的学习建设的文章。 在此订阅。
开始学习时间序列预测的最佳书籍

更妙的是,它是免费的!
时间序列预测是统计学/机器学习中一个非常有趣且具有挑战性的领域。可以说,这可能是一个比标准回归任务更难解决的问题,因为我们必须考虑到时间依赖性和它们带来的额外假设。
虽然这可能是一个令人望而生畏的问题,但对几乎每个公司来说,这也是一个至关重要的问题,因为他们都要处理某种预测——销售、需求、收入、增长,等等。这正是数据科学领域的知识能够产生重大影响并为决策者提供附加值的地方。
在这篇文章中,我对这本书做了一个简短的概述,并提出了个人观点,我认为这本书是学习时间序列预测的一个很好的起点。这并不意味着这只是一本给初学者的书,因为我很确定即使是有经验的数据科学家也会从讲座中学到一些新东西。
我想到的书是罗伯·J·海曼和乔治·阿萨纳索普洛斯的《T4 预测:原则与实践》。这本书在这里可以免费获得,但你也可以购买平装本或电子版(通过这本书网站上的链接)。我以前读过这本书的第二版,但我惊喜地发现第三版是在 2021 年 2 月发布的,所以我更新了这篇文章,以包括最新的信息。

正如我所提到的,这本书对于那些想研究预测问题的人来说是一个很好的起点——不管是专业的还是个人的。观众可能已经对该领域有了大致的了解,或者是从零开始。为了更好地利用这本书,数学(代数)的基础知识以及 R(编程语言)的知识肯定会有所帮助。
在阅读这本书的时候,后者绝对是一个不错的选择,因为它有一个专用的 R 库(fpp3),并且广泛使用了tsibble和fable包(而不是第二版中的forecast包)。得益于此,你可以快速复制书中的所有例子,或者使用提供的数据集进行你自己的分析。
章节概述
在这一部分,我将很快浏览一下各章的内容,并提及我认为最相关的内容。你可以把它看作是一个精选的目录。
第 1 章:入门
在这一章中,作者通过定义基本术语和拟定在处理与时间序列相关的任务时需要遵循的一般步骤来介绍时间序列预测领域。此外,他们提供了书中描述的技术的一些用例。
第 2 章:时间序列图形
第二章包含了用于时间序列分析的非常有用的图表类型的选择,以及它们的解释和我们可以从中得出的结论。举几个例子,本章涵盖了时间序列图(线图)、季节图、散点图、自相关函数图(ACF)等等。在我的一篇文章的中,我展示了如何用 Python 快速重现其中的一些情节。
第三章:时间序列分解
这一部分对于任何处理时间序列的人来说都是至关重要的。在其中,作者描述了什么是时间序列分解,什么是季节/趋势/剩余部分,以及我们可以使用哪些方法来分解时间序列(classical、X11、SEATS、STL)。然后,他们提出了各自的优势和劣势,我们应该记住,而分解时间序列。
第 4 章:时间序列特征
本章的重点是从潜在的时间序列中自动提取有用的特征。作者描述了feasts R 包,它包括许多用于计算时间序列的特征和统计数据的函数。通过使用该软件包,我们可以根据自相关系数(例如,原始/差异序列的前 X 系数的平方和)或趋势/季节性强度(基于 STL 分解)轻松提取特征。
第五章:预测者的工具箱
在这一章中,作者为我们提供了一套基本的工具,这些工具对大多数时间序列问题都很有帮助。他们展示了如何:
- 准备和转换用于建模的数据,
- 使用简单的(天真的)模型作为基准,
- 理解拟合值和残差的概念,
- 通过观察残差的分布和自相关来诊断我们的模型,
- 使用一些流行的评估指标(如 MAE、MAPE、RMSE)进行预测,并了解它们的优势和劣势。
- 使用分位数得分、温克勒得分、连续排名概率得分(CRPS)或技能得分等指标来评估分布预测。
- 在处理时间序列问题时使用交叉验证。
第六章:判断性预测
判断性预测(或对统计预测的调整)由专家利用他们的领域知识人工做出。有时,我们要么不能依靠统计方法进行预测(例如,由于缺乏数据),要么希望用领域知识来补充统计方法。后者可能特别有用,例如,当专家知道某件事将在不久的将来改变(例如,一项新的政策或法律),但其影响在过去的数据中尚未出现。
作者介绍了几种判断性预测的方法,如德尔菲法或情景预测法。此外,它们还提供了在实践中如何有效、正确地实施此类预测的最佳实践,同时避免了潜在的偏差。
第七章:时间序列回归模型
在这一章中,作者解释了用于时间序列预测的最简单但非常强大的模型——线性回归模型。它们涵盖的主题包括:
- 通用模型规范和基本方程(对于好奇的读者,还介绍了矩阵形式),
- 模型的假设以及如何检验它们,
- 特征工程的流行方法,
- 使用不同的标准(调整后的 R、AIC、BIC)评估回归模型,并使用逐步方法选择最佳特征,
- 非线性回归的流行方法,
- 混淆相关性和因果关系的危险,以及为什么我们应该小心多重共线性。
第八章:指数平滑
在第八章中,作者介绍了整类指数平滑模型。他们从经典模型开始,如简单指数平滑、霍尔特的线性趋势模型和霍尔特-温特的季节性模型。这样做之后,他们进一步解释了如何将状态空间模型纳入指数平滑框架。使用它们,我们实际上不仅能够获得点预测,而且能够量化不确定性并获得预测区间。
第九章:ARIMA 模型
描述了指数平滑模型后,作者继续进行两种最流行的时间序列预测方法中的第二种——ARIMA类模型。与依赖于数据中趋势和季节性描述的 ES 模型相反,ARIMA 模型试图描述时间序列中存在的自相关性。
这就是为什么在这一章中作者关注平稳性和差分的概念。他们还介绍了 ARIMA 的构建模块——自回归和移动平均模型。虽然手动选择 ARIMA 模型的超参数可能相当棘手,但作者介绍了一种用于自动选择最佳组合的算法——著名的自动 ARIMA** 。为了理解算法如何遍历可能的超参数空间以寻找最佳拟合,在这一部分花一些时间绝对是值得的。**
最后,作者介绍了模型的更高级的变体,它能够解释时间序列中的季节性——季节性 ARIMA (SARIMA)。
第十章:动态回归模型
在第十章中,作者介绍了另一类模型——动态回归模型。为了直观地理解这种模型,我们可以把它看作是书中提到的另外两种模型的组合。第一个是 ARIMA 模型,它利用过去的数据预测未来的观察结果。第二个是一般回归模型,它可以包含与预测相关的所有其他信息,例如,假期的影响,经济的整体变化等。
我们可以了解的另一个有用的技术是动态谐波回归,其中我们使用傅立叶项来模拟(较长的)季节模式,而短期时间序列动态则通过 ARMA 类型的误差来处理。
第十一章:预测分层或分组时间序列
本章介绍了聚合时间序列的概念。假设您有一个在线商店总销售额的时间序列。对于分层时间序列最常见的情况是您将按地理区域分解总序列。您可以按国家/地区划分总销售额,如果需要,您还可以按地区进一步划分系列,依此类推。换句话说,有一个清晰的、分层次的逐步分解序列的方式。在预测这样一个系列时,重要的是,当你在层次结构中向上移动时,较低的级别会增加,所以所有区域销售额的总和会增加到国家级别,等等。
对于分组的时间序列,没有唯一的分解时间序列的层次方式。以在线商店为例,您可以按照产品类别和价格范围来划分总时间序列。在这种情况下,两个层次结构可以一起用于分解系列。这导致了比层次化场景稍微复杂一点的场景。
在介绍了两种聚合时间序列之后,作者回顾了预测这种序列的最流行的方法——自下而上、自上而下和中间向外的方法。
第 12 章:高级预测方法
在描述了对时间序列预测有用的大多数基础知识之后,作者提出了一些高级方法:
- 建模复杂的季节性(具有多个季节周期)——例如,每日数据可能同时具有周模式和年模式。为了应对这一挑战,我们可能希望使用具有多个季节周期的 STL 分解、动态调和回归或 TBATS 模型(具有 Box-Cox 变换、ARMA 误差、趋势和季节成分的指数平滑状态空间模型——是的,这是:D 模型的全称)。
- 脸书的先知模型。
- 使用向量自回归** (VAR,不要与风险值混淆)对多个变量之间的方向关系建模。**
- 深度学习简介神经网络自回归(使用前馈 NNs 建模)。特别有趣的是关于如何获得这种模型的置信区间的附加解释。
- 自举和打包——作者描述了如何使用块自举、打包的 ETS 预测背后的想法,以及它们在准确性和估计时间之间的权衡。
第十三章:一些实际的预测问题
在最后一章中,作者描述了我们在处理时间序列时可能会遇到的一些实际问题:
- 处理每周和次每日数据的挑战和解决方案,
- 如何确保预测保持在一定的范围内,
- 如何使用书中描述的不同模型的平均来提高整体精度,
- 处理很长或很短的时间序列有什么潜在的陷阱,
- 处理缺失值(取决于数据缺失的原因)和异常值(检测和清理数据的简单方法)的一些方法。
意见
我已经对这本书赞不绝口,但我真的认为这种称赞是当之无愧的。我真正喜欢这本书的是它的实用方法。如果你很着急或者只是想玩玩你自己的数据,你可以复制粘贴选中的片段,然后在几分钟内得到模型的 MVP。
同时,你可以用这本书来更深入地了解这个领域。作者们足够仁慈,不让我们的大脑因过载的数学方程而爆炸,所以他们只使用公式来传达必要的信息,同时参考其他来源进行更详细的推导和更深入的挖掘。这样,我相信这本书更容易被更多的读者所理解。对我个人来说,当我想快速回顾某个特定主题时,它也可以作为一个参考点。据我所知,这本书写得详尽,但简明扼要。
这本书的另一个很大的特点是,它随着该领域的最新进展和新技术而不断更新。例如,今年发布的第三版增加了对 Prophet 算法的描述和一些最近的发展。
最后,这本书附带了专用的 R 包,其中包含了书中描述的所有方法(甚至更多!).所以你也可以把这本书看作是如何使用其中某个功能的扩展说明。作者还将书的内容(和包)与 tidy 框架和tidyverse 包集对齐。
结论
我真的希望这篇文章能鼓励你阅读预测:原则和实践。对于获得时间序列预测的实用知识来说,这绝对是一个很好的资源,我推荐它不仅作为一个起点,而且作为从事涉及时间序列的项目时的一个参考点。
一如既往,我们欢迎任何建设性的反馈。你可以在推特上或者评论里联系我。
如果您喜欢这篇文章,您可能还会对以下内容感兴趣:
** </5-free-tools-that-increase-my-productivity-c0fafbbbdd42>
参考
- Hyndman,R.J .,& Athanasopoulos,G. (2021) 预测:原则与实践,第三版,原文:澳大利亚墨尔本。OTexts.com/fpp3.**
加入创业公司最佳数据科学训练营
为什么我决定加入 Le Wagon,他们能提供什么

如果你想成为一名数据科学家,那么,在某些时候,你会问自己是否值得加入训练营。我怎么知道?我已经多次问过自己这个问题。老实说,你有很多理由不应该加入训练营:它很贵,你可以在网上找到几乎所有的东西,有很多免费的电子书,你可以免费注册 Coursera 学位等等。然而,有几个很好的理由说服我加入训练营。但我加入世界上最好的数据科学训练营还有更好的理由:Le Wagon 训练营。
为什么是训练营而不是硕士学位?
这是一个合理的问题。事实上,休一年假,在世界上学习数据科学的最好的大学之一学习将是非常棒的。然而,在我的情况下,申请硕士学位是不现实的。
在英国,大多数硕士学位的申请截止日期是在 12 月。课程通常在九月底或十月初开始。现实地说,我至少要等 18 个月才能接收下一批。如果我 20 岁,那就ok;我可以去实习,和父母住在一起,不用付房租/抵押贷款或食品杂货。然而,我已经快 40 岁了,正处于转行阶段,而且我确实和我的妻子分摊了费用。
在数据科学领域迈出第一步有太多的选择,等待完美的职业道路是浪费时间。训练营就是其中之一。还有,我要考虑在市场之外的成本,等硕士开始。与此同时,许多人在没有学位的情况下独立学习,做着出色的工作。
虽然许多读者可能不同意我的观点,但我认为我们正处于一个过渡期,不再需要在墙上挂一张证书就能找到工作。科技公司将逐渐把创新置于传统学位之上,展示你遵守规则和复制学者所做工作的能力。学生在学习时很少能创新。成为一流学生的竞争非常激烈,而不是合作创新。或许成功的一个方法是将指导、获取信息和志趣相投的人结合起来。这是我正在寻找的。
大学“基本上是为了娱乐而不是学习”——埃隆·马斯克【1】
为什么乐马车?
Le Wagon 提供为期 9 周的全职训练营,并在 Switch up 上持续获得好评。Le Wagon 有超过 1875 条评论,平均分为 4.98 分。这些成绩使它成为世界上最受欢迎的训练营。还有,我和几个来自不同训练营的校友聊过,只有 Le Wagon 的学生说他们投入的钱是值得的,没有任何遗憾。
他们的项目旨在建立一个新公司。他们的校友创办了 130 多家创业公司,其中 66 家共筹集了 103,674,300€(约 1.24 亿美元)。一些例子包括:
- Matera 连接律师、会计师和网络开发者,使共有人能够管理他们的建筑。
- Travelsify 是一家旅行社,它使用自然语言处理让客户发现当地隐藏的宝石目的地、酒店和餐馆。
- 隐含 利用数据改善临床操作和护理标准。他们改变了心脏病学实践,并使用机器学习设计预测性解决方案。
在项目的最后几周,学生们开发并向观众推销他们的创业公司,这被称为演示日。Le wagon 设法复制了一个与 Y Combinator 相似的环境。所以,这不仅仅是关于编程和学习技术技能,还有他们在训练营期间所做的一切背后的企业家心态。
伦敦游行日
不仅仅是编码
你会遇到很多背景不同但目标相似的创业者、招聘人员和志同道合的人。他们使用 Basecamp/Github 的工作方式复制了一个现代而又真实的专业环境。学生们从早上 9 点到晚上 8 点努力学习,在一天结束时会有一些午餐和瑜伽课的休息时间。由于训练营的性质,你可以在紧张的期限内工作,同时与同事们一起玩乐。
对于许多专业人士来说,尤其是那些在传统的办公环境和常规中工作的转行人士,Le Wagon 展示了一种在现代和创新环境中工作的新观点。这些变化意义重大,因为它们提高了工作的标准。一旦你体验了一种非正式的、创业式的工作方式,你就不太可能想回到传统的管理和没完没了的 PowerPoint 演示中,写数百封电子邮件,参加无数电话会议,说几句话。所以,它不仅仅是代码;工作方式是训练营体验的一部分。
“但是不要被愚弄了,它每天编码 6 到 8 个小时。其他的一切都是额外的奖励…如果你是来享受创业假期或用 MacBook 看起来很酷,你将会花大量的时间在终端前挠头
准备工作
听起来任何人都可以做,对吗?错了,小心点。Le Wagon 的团队意识到,你可以在网上找到几乎所有的东西,所以他们的训练营比你在网上能找到的东西更进了一步。在你的第一周,定量的背景知识已经有了急剧的增长。所以,最好是从第一天开始就适当地熟悉线性代数和微积分。
有一个强制性的准备工作,包括 40 个小时的培训,以确保所有学生在抵达时具备最低限度的编码和数学背景知识。我在下面列出了每个准备工作区域的一个部分(及其链接)。这些可以作为对不花钱熟悉数据科学感兴趣的人的粗略指南。
Python & SQL
数学
强烈推荐在可汗学院上完成线性代数的全部课程。但是,你也可以阅读数据科学和机器学习的基本数学(这本书是付费的,但是未来,它完全值得投资)。
终端& Git/GitHub
Linux/Mac 终端教程:导航您的文件系统
针对初学者的 Git 和 GitHub(下面的视频)
针对初学者的 Git 和 GitHub
机器学习
有一些机器学习背景入门是有帮助的。Le Wagon 建议在 Coursera 上注册并观看吴恩达关于机器学习的视频。虽然课程有点理论化,但它让你对第三和第四周的内容有所了解。
我已经在简单的数据集上应用了一些机器学习,所以请随意查看我到目前为止所做的工作:
https://www.kaggle.com/renatoboemer/pokemon-datasets-for-ml
结论
数据科学领域正在快速变化和发展。等待几个月可能意味着失去一些机会。等上一年半,在将近 30 岁的时候开始攻读硕士学位可能不是最佳解决方案,所以训练营就来了。寻找那些不仅能提供你想要的东西(在大型科技公司工作或创业)而且有志同道合的人的训练营。在投资训练营(或硕士学位)之前,有大量的免费信息可供参考,所以一定要做足功课。
如果你喜欢这篇文章并愿意支持我,请务必:
- 👏为这个故事鼓掌(50 次)并跟我来👉
- 📰查看我的媒体档案中的更多内容
- 🔔关注我:LinkedIn|中||GitHub
- 🚀👉 加入 中等会员计划 继续无限制学习。如果你使用下面的链接,我会收到一小部分会员费,不需要你额外付费。
参考文献:
【1】****《卫报》https://www . The Guardian . com/technology/2020/mar/10/elon-musk-college-for-fun-not-learning
【2】Devhttps://Dev . to/etienneburdet/三个月来我新工作的诚实回顾-货车训练营-hh0
你从未听说过的最好的数据科学框架
以前所未有的速度构建漂亮的数据驱动型应用

Streamlit 内置的 web 应用程序(所有截图均由作者提供)
如果你曾经想要将你创建的机器学习模型或数据可视化转化为网络应用,供其他人查看和互动,在某些时候你可能会感到有点失落。
你可能是一名优秀的数据科学家,非常熟悉处理数据、提取见解、构建可视化和创建模型所需的工具,但将这些工具投入生产需要更多时间。正如 Streamlit 的联合创始人兼首席执行官 Adrien Treuille 所说,“机器学习工程师实际上是应用程序的开发者。”
Streamlit 是一个相对年轻的框架,它提供了一股新鲜空气,并提供了一种快速、轻松地创建漂亮的数据驱动应用程序的方法。那么它解决了什么问题,它是为谁准备的,你应该使用它吗?
问题是
机器学习/数据科学管道看起来像这样:
数据>培训>模型>生产
在整个过程中,通常需要设计许多定制的解决方案,从原型到演示再到仪表板等等……无论您是在构建一个将被您公司内的销售人员广泛使用的企业解决方案,还是仅仅致力于一个个人项目,这都需要软件工程。
一个例子
Adrien Treuille 回忆起他在 Zoox 工作时,大约有 80 名机器学习工程师正在建造无人驾驶汽车系统。他们什么都做:规划,视觉,行人检测,所有的一切。
他举例说明了工程师可能需要开发的一种工具:同时运行两个自动驾驶系统并进行比较的应用程序。这可能会以一个工程师的项目开始,写在 Jupyter 笔记本上,复制并粘贴到 Python 脚本中,推送到 GitHub,并用像 Flask 这样的框架构建。
但是假设应用程序成为团队工作流程的重要组成部分,突然有更多的工程师需要使用它,并且需要添加功能,但是它没有被设计成一个完善的、可扩展的软件。这就是阿德里安所说的“不可维护性陷阱”。
在这个阶段,机器学习工程师会召集一个内部团队,他们本质上是构建 web 应用程序的专家。这个团队将收集系统的需求,用 JavaScript、Python、CSS、HTML 等在 React 或 Vue 中进行线框化和开发。,最终打造出一款惊艳且设计精良的应用。
但之后他们需要转移到不同的项目,支持不同的团队,应用程序将处于“冻结区”直到他们可以返回。即使你在做一个单独的项目,而不是在一家大公司,这种依赖软件工程来部署你的应用程序会让生活变得非常困难。
解决方案
Streamlit 是一个应用程序框架,它会提出以下问题:
如果我们能让构建工具像编写 Python 脚本一样简单,会怎么样?
目标是将 web 应用程序构建理念从以布局和开发事件模型开始,转变为数据科学家应该非常习惯的 Python 脚本式的自顶向下执行、数据流转换风格。
用阿德里安自己的话来说,Streamlit 应用程序是“基本上是一个数据脚本,经过轻微的注释,使其成为一个交互式应用程序”。
从个人经验来看,我可以告诉你,Streamlit 实现了这个承诺。您甚至可以通过添加几个 Streamlit 调用,将已经存在的 Python 脚本转换成 web 应用程序,所有这些都在一个文件中。
真的这么简单吗?
是啊!看看这个:
想创建一个滑块来选择一个值输入到模型中吗?
val = st.slider()
# Use val
您只需声明一个变量并将其设置为等于 Streamlit 的 slider 小部件,然后根据您的喜好调整一些参数。这将在你的应用程序中显示滑块,并将 val 的值设置为用户滑动到的值。创建按钮、复选框、单选按钮、选择框、多选框等等也一样简单。


Streamlit 中的一个滑块和两个选择框
想要创建一个可隐藏的侧边栏,将一些控件和信息放到左边?
sidebar = st.sidebar()
with sidebar:
# Add stuff
声明侧边栏变量并使用 Streamlit 的和符号将任何内容放入其中。同样的机制也可以应用于容器甚至列来定制你的应用程序的布局。
想要添加页眉、标题和文本吗?
# Text
st.title()
st.header()
st.write()# Markdown
st.markdown()# LaTeX
st.latex()# Code
st.code()
格式基本上仅限于 markdown,所以不要期望任何花哨的字体或字体大小,但它可以完成工作。

Streamlit 中的降价文本
想要显示数据?
st.write(pandas dataframe or chart from supported library)

Streamlit 中的熊猫数据帧
只需将 Streamlit 支持的绘图库中的一个数据帧或图表传递给我们前面看到的同一个 st.write 函数。如果您想要传入数据帧并显示图表:
st.line_chart(data)
st.area_chart(data)
st.bar_chart(data)# Etc.
如果您在使用支持的绘图库时想要更多的自定义控制:
st.altair_chart(altair chart)
st.plotly_chart(plotly express chart)# Etc.

Streamlit 中的 Plotly Express 图表
请注意,这绝不是 Streamlit 功能的详尽列表。为此,我强烈推荐文档。但我希望它能给你一个例子,说明显示文本、小部件和数据,以及接受用户输入和定制布局是多么容易。
部署
好吧,用 Streamlit 创建应用程序很容易,但是实际上把它们发布给其他人看呢?
那也很容易。有许多方法可以在云中托管 streamlit 应用程序,或者你甚至可以利用他们新的 T2 Streamlit 共享服务,让发布你的数据应用程序变得像开发时一样简单。
缺点
简单意味着妥协。例如,如果你追求高度的定制化,这个框架可能不适合你。
然而,Streamlit 社区非常活跃,非常有帮助,您可以请求新功能或查看是否有任何记录良好的技巧来实现您想要的。框架在不断完善。
不要忽视最佳软件实践!
开发一个应用程序太容易了,眨眼之间,就有了 500 行。py 文件(其中可能有 5%实际上是 Streamlit 调用,但 95%将是您的数据处理和模型构建)。这可不容易维持。将你的代码分成几个模块,并尝试在任何时候都遵循 DRY 原则——这只是一个 Python 脚本并不重要,即使是 Streamlit 也不重要,如果你有一个中型到大型的应用程序,它可以让你不必组织你的代码。
那么该不该用呢?
我看到一些文章和帖子认为 Streamlit 可能会杀死 Flask。这是荒谬的,不是因为 Streamlit 不够好,而是因为如果还不清楚的话,它们有非常不同的用例。然而,这并不意味着你不再需要像 Flask 这样的框架来构建特定类型的应用程序。
如果你没有建立一个数据驱动、机器学习、数据即仪表盘类型的应用程序,Streamlit 根本不适合你。这个框架是为那些想把他们的 Python 脚本
然而,如果你是,那么 Streamlit 提供了一个健壮、快速、简单、经过特别深思熟虑的方法来创建令人惊叹和实用的演示。我发现这极大地增强了数据科学家和机器学习工程师的能力,因为你不再需要依赖软件工程。
查看图库看看人们在创造什么,如果你自己创造了非常酷的东西,你可以在那里得到它的特写!
我只想说,你还在等什么?
订阅 📚为了不错过我的一篇新文章,如果你还不是中会员, 加入 🚀去读我所有的,还有成千上万的其他故事!
资源
- 什么是 Streamlit | Adrien 在 PyData 演讲 2019 年 12 月|https://www.youtube.com/watch?v=R2nr1uZ8ffc&list = PLG KF 0 qak 9g 49 qltebtxuipapt 8 tzfpub 8&index = 2
- Streamlit 的网站 | 首页|https://Streamlit . io
- Streamlit 的网站 | 应用图库|https://streamlit.io/gallery
- 精简文件|https://docs.streamlit.io/en/stable/
- Streamlit 部署 wiki|https://discuse . Streamlit . io/t/Streamlit-deployment-guide-wiki/5099
- 细流分享|https://streamlit.io/sharing
不要再等着别人“给你机会”成为数据科学家
最好的数据科学——以及最好的创新——总是没有许可的
多年来,科技界普遍接受的一句口头禅是,最好的创新是“未经许可的”——也就是说,它是由在现有权力结构边缘工作的局外人推动的,更有可能发生在人们的车库里,而不是大学或大公司里。
区块链社区大力支持无许可的概念,将其作为管理其核心技术以及这些技术旨在引入的社会类型的一种无所不包的精神特质。
作为一名花了近十年时间向 Nick Spanos 学习的数据科学家,Nick Spanos 在 2013 年创建了世界上第一个比特币实物交易所比特币中心 NYC,我最近突然想到数据科学是真正无许可的非凡领域之一——今天比以往任何时候都更是如此。
与火箭科学或土木工程不同,它们不仅是高度监管的领域,而且需要现实世界中的大量资源,今天的数据科学只需要一台笔记本电脑,学习核心统计学和计算机科学原理,并学习 R 或 Python 等统计编程语言——所有这些都可以很容易地自学。
另一个因素是获取数据,数据就在我们周围,可以很容易地从公开的数据集或从互联网上获得难以想象的数量。(当然,真正秘密的成分是找到一个好问题来问,但这只能通过不懈的重复和试错来学习。)

未经许可的创新是一种心态🧠
几周前,当我在一次采访中听到一个年轻人温暖人心的故事时,我想到了所有这些。(像这样的故事过去很常见,但我不确定发生了什么。)他在分析部门工作了几年,然后在一次裁员中丢掉了工作。他非常努力地找工作,但是找不到——所以他开了自己的公司!
他花了 9 个月的时间,开发了一个实际的产品,获得了客户,甚至建立了一个完整的离岸工程团队来维护和迭代这个产品。(从字面上看,他的简历上没有任何东西会让人相信他有这些品质——在他证明自己一直都有这些品质之前。)
他还犹豫地问我,一家大公司将如何看待他的创业之旅,我向他保证,大公司是最需要创业思维的公司,因为他们意识到,没有创新,他们就无法跟上来自四面八方的快速激烈的竞争。
数据科学家必须提供比技术技能更多的东西📦
我只希望我经常看到的那些有抱负的数据科学家能够意识到这一点——重要的不仅仅是你拥有什么技能和能力,而是你如何利用它们才是最重要的。
例如,任何看过数据科学简历的人都会非常熟悉我所说的“盒子”——几乎每个简历都有一个。
这个盒子是一份令人印象深刻和令人生畏的“除了厨房水槽以外的一切”的工具和技术清单,申请人声称拥有这些工具和技术(见下面实际简历中的一些例子)。

问题是,这些简历中只有极小一部分提供了有意义的例子,说明申请人在现实世界中使用这些工具建立了什么。
你所知道的工具和技术只是达到目的的手段——如果没有目的,它们就是对你未达到的潜力的控诉。(具有讽刺意味的是,大型科技公司的绝大多数日常数据科学和分析只需要三种工具:SQL、R 和 Python。)
这就是为什么我在数据科学面试中问的最重要的问题是“你用数据构建了什么?”或者“你如何利用你的数据技能来产生影响?”
每个有抱负的数据科学家都应该确保他们有可靠的经验和答案来回答这个问题,越有趣越好——没有其他方法可以从每年成千上万试图进入“21 世纪最性感的工作”的毕业生中脱颖而出
数据无处不在,🗄️
我们生活在一个数据无处不在、广泛传播且几乎完全免费的世界。我们实际上生活在一个充斥着数据的世界。不仅如此,分析这些数据所必需的工具可以广泛获得,并且是免费的。(现在不再是上世纪 90 年代,那时你需要昂贵的 SAS、SPSS 或 Minitab 订阅——R 或 Python 完全免费,比这三者加起来有用得多。)
这意味着,在某种意义上,数据科学和数据分析的准入门槛从未如此之低,但具有讽刺意味的是,由于这个原因,它现在实际上相当高!
我的意思是,就业市场充斥着只具备技术技能、渴望爬上硅谷阶梯、但没有动力、直觉、天生的好奇心或跳出框框思考的能力的候选人。
他们中的许多人仍然在抱怨“每个职位都需要 X 年的经验”,而没有意识到,与火箭科学或桥梁建设不同,没有任何东西可以阻止他们获得数据科学或数据分析方面的经验。数据无处不在,工具全部免费——你还需要什么?!
就像我采访的一个年轻人,他认为没有理由等待某个公司“给他管理产品的机会”,相反,他开发了自己的产品,现在他正在与这些公司在平等的竞争环境中互动,不是作为一个恳求证明自己的机会的人,而是作为一个在现实世界中也创造了一些有价值的东西的同行技术专家。
要“以创造为导向”,而不仅仅是“以事业为导向”👗👔
我认为,我们现在比以前更少看到这种情况的一个原因是因为技术,特别是数据科学,已经成为一个稳定的领域,自然吸引了更多以职业为导向的人,而不是以创造为导向的人。
这些以职业为导向的人只能想象在线条内着色,并且只有当他们被允许着色时才着色。即使他们所拥有的技能能够回答无限多的问题,他们仍然专注于最无聊的问题,缺乏哪怕是最微弱的创造性尝试。对他们来说,他们的技能只是达到目的的一种手段,而这个目的是一份朝九晚五的工作,所以没有这份工作,他们怎么能想到用他们的技能为这个世界增加价值呢?
与此同时,对于那些在成为稳定职业之前首次进入这些领域的创业型自由思想者来说,职业甚至工作总是伴随着他们喜欢做的事情——创造、建设和使用技术来理解世界。
成为数据科学家的最佳方式是从事数据科学
我对新的和有抱负的数据科学家的建议是一样的,无论你是刚毕业的学生,还是正在初创公司工作,甚至是在大公司工作。
你不需要等待任何人“给你一个机会”来成为一名数据科学家。成为数据科学家的最佳(也是唯一)方式是从事数据科学。
它是通过在你内心深处寻找,找到你独特的技能和能力与你的激情和目标之间的交叉点,并弄清楚只有你才能对这个世界做出的独特贡献。(我在 2017 年 NYU 的 TEDx 演讲中提到了这一点。)
对于大多数人来说,这不是参加 Kaggle 比赛,并试图在别人的模型上提高 0.1%。相反,它是关于提出新奇的问题,将原始、杂乱的数据转化为精选的数据集,并在这些数据中找到对某人有价值的见解和模式——即使那只是另一个人。
数据科学家是探险家,所以让我们出去探索吧。
哈姆丹·阿兹哈尔 是一名数据科学、分析和研究领域的领导者,在复杂数据集中发现有意义的见解以及利用故事来推动业务、产品和社会影响方面拥有超过 10 年的经验。PRISMOJI 的创始人,他曾是区块链技术公司的董事,在此之前,他是脸书、GraphScience 和罗恩保罗 2012 年总统竞选的数据科学家。
你的投资组合中最好的数据科学项目
什么使它成为最好的

乔恩·泰森在 Unsplash 上的照片
近年来,数据科学经历了巨大的发展。从数据中创造价值的潜力吸引了企业,从而推动了这一领域的新投资。
数据科学的普及和潜力以及对数据科学家日益增长的需求导致许多人转行从事这一领域的工作。
对于有抱负的数据科学家来说,最大的挑战是迈出进入该领域的第一步。我认为让迈出第一步变得困难的原因如下:
- 数据科学是一个跨学科的领域,因此很难获得和评估所需的技能。
- 数据科学仍在发展,因此它尚未在传统教育系统中得到很好的确立。
- 如果你以前没有工作经验,就没有一个简单的方法来展示你的技能。
在这篇文章中,我将阐述第三个原因,并提供我的建议。
如果您关注有关数据科学的媒体出版物,您一定已经看到了列出数据科学项目的文章,可以放入您的简历或投资组合中。
它们都适合练习硬技能,如编码、数据争论、数据科学库和框架、机器学习算法等。然而,他们缺少一项重要的技能。

我们甚至可以比较创造魔方的技巧和解决它的技巧吗?
数据科学家发现了一个问题,并提出了建议的解决方案。那些文章中列出的项目为您展示了问题和解决方案。此外,以整洁干净的格式获得所需的数据也相对容易。
因为这些项目中的大多数都很常见,所以可以很容易地在网上找到解决方案或实现。因此,把它们当成练习你技能的项目。不幸的是,它们不足以让招聘经理相信你是数据科学家职位的优秀候选人。
相反,我们应该做的是找到一个可以用数据解决的问题,并设计我们的解决方案。问题不必复杂,我们也不必提供最佳和最有效的解决方案。我们甚至可能无法妥善解决这个问题。
然而,能够框定一个可以用数据解决的问题,比完成这样平凡的项目更有价值。它证明了你的分析思维能力,并清楚地表明你对数据科学有全面的了解。
说服你未来的雇主拥有一两个你白手起家的项目会很有帮助。你甚至可能会有一个新的商业想法。拥有独特项目的另一个好处是,它们会吸引招聘人员和招聘经理。他们可能会主动联系你,而不是你去申请很多职位。
你可能会说,提出一个新的项目想法是一项极具挑战性的任务。我完全同意你的观点。这就是为什么我称之为你投资组合中最好的项目。
我知道提出一个独特的项目想法需要大量的时间、努力和思考。此外,你将会花费很长时间来实现你的想法。重要的是要指出,你最终可能会有一个失败的项目。然而,你在整个过程中学到的很可能是一些你无法从 MOOC 课程或任何教程中学到的技能。
你也将提高你处理问题的技巧。你将学习如何从不同的角度评估一项任务。在某些情况下,您想到的解决方案并不适合您习惯使用的库或框架。因此,它也将激励你学习新的工具。
结论
你的投资组合中的 10 个项目听起来很吸引人。我也参与了其中的一些项目。然而,请记住,与你竞争数据科学家职位的大多数人也在做这 10 个项目。你不会落后,但做同样的事情也不会让你走得更远。
招聘经理或招聘人员会知道你对一个项目投入了多少。一些受欢迎的普通项目可以在一两天内完成。因此,基于这些项目,你将很难展示你的技能。
我绝对不反对做这些常见的项目。他们在练习和提高你的硬技能方面很有价值,但这是他们所能提供的全部。
另一方面,如果你展示了一个由你设计和实施的项目,它会让你成为这份工作的优秀候选人。
感谢您的阅读。如果您有任何反馈,请告诉我。
时间序列预测的最佳深度学习模型
关于时间序列和深度学习你需要知道的一切

萨米·威廉姆斯在 Unsplash 上的照片
一定要 订阅此处 千万不要错过另一篇关于数据科学话题、项目、指南等的文章!
准备工作
时间序列预测的前景在两年间发生了巨大的变化。
第四届和第五届 Makridakis M 级比赛(分别称为 M4 和 M5 比赛)于 2018 年和 2020 年举行。对于那些没有意识到的人来说,这些 M 竞争本质上是时间序列生态系统的现状,提供了指导预测理论和实践的经验和客观证据。
2018 年 M4 竞赛的结果表明,传统的统计方法在很大程度上优于纯粹的“最大似然”方法。这是出乎意料的,因为深度学习已经在计算机视觉和 NLP 等其他领域留下了不可磨灭的印记。然而,在两年后的 M5 竞赛 [1]中,凭借一个更具创造性的数据集,名列前茅的提交仅采用了“ML”方法。更准确地说,所有 50 个表现最好的方法都是基于 ML 的。这场比赛见证了全能的 LightGBM (用于时间序列预测)的崛起,以及亚马逊的DeepAR【2】和N-BEATS【3】的登场。2020 年发布的 N-BEATS 型号,比 M4 竞赛的获胜者高出 3%!
最近的呼吸机压力预测 Kaggle 比赛展示了使用深度学习方法应对真实案例时间序列挑战的重要性。具体来说,比赛的目标是在给定控制输入的时间序列的情况下,预测机械肺内压力的时间序列。每个训练实例本质上是一个时间序列,因此任务是一个多时间序列问题。获胜的团队提交了一个多层深度架构,其中包括一个 LSTM 网络和一个变压器块。
在过去的几年中,许多著名的架构已经出版,如多地平线分位数递归预测器(MQRNN)和深空状态模型(DSSM)。所有这些模型都利用深度学习为时间序列预测领域贡献了许多新奇的东西。除了赢得 Kaggle 比赛,还有其他因素在起作用,例如:
- 多功能性:将模型用于不同任务的能力。
- MLOps :在生产中使用模型的能力。
- 可解释性和可解释性:黑盒模型不再那么流行了。
本文讨论了 4 种专门用于时间序列预测的新型深度学习架构。具体来说,这些是:
- N 拍(元素)
- DeepAR (亚马逊)
- 时空原【4】
- 时间融合变压器或 TFT (谷歌)【5】
前两种更经得起考验,已经在许多部署中使用过。时空器和 TFT 也是例外的型号,提出了很多新奇的东西。他们能够利用时间序列范围之外的新动态。
n 拍
这种模式直接来自(不幸的)短命的elemental,一家由 Yoshua Bengio 共同创立的公司。顶层架构及其主要组件如图 1: 所示

图 1:N-BEATS 架构(来源)
从本质上来说, N-BEATS 是一个纯粹的深度学习架构,它基于集成前馈网络的深度堆栈,这些网络也通过互连反向预测和预测链接来堆叠。
每个后续块仅模拟由于从先前块重建反向预测而产生的残余误差,然后基于该误差更新预测。在拟合 ARIMA 模型时,这一过程模仿了 Box-Jenkins 方法。
这是该模型的主要优势:
表现力强,易于使用:模型简单易懂,具有模块化结构(块和栈)。此外,它被设计为需要最少的时间序列特征工程和没有输入缩放。
多时间序列:该模型能够对许多时间序列进行归纳。换句话说,可以使用分布略有不同的不同时间序列作为输入。在 N-BEATS 实现中,这是通过元学习实现的。具体来说,元学习过程由两个过程组成:内部学习过程和外部学习过程。内部学习过程发生在块内部,并帮助模型捕捉局部时间特征。另一方面,外部学习过程发生在堆栈内部,帮助模型学习所有时间序列的全局特征。
双重残差叠加:残差连接和叠加的想法非常棒,几乎在每一种深度神经网络中都有使用,比如 deep Convnets 和 Transformers 。同样的原理也应用于 N 拍的实现中,但是做了一些额外的修改:每个块有两个剩余分支,一个通过回顾窗口(称为 backcast )运行,另一个通过预测窗口(称为 forecast )。
每个后续块仅模拟由于从先前块重建反向预测而产生的残余误差,然后基于该误差更新预测。这有助于模型更好地逼近有用的反向预测信号,同时,最终的堆栈预测预测被建模为所有部分预测的分层总和。有趣的是,在拟合 ARIMA 模型时,这个过程模仿了 Box-Jenkins 方法。
可解释性:该模型有两种变体,通用和可解释性。在通用变体中,每个块的全连接层中的最终权重由网络任意学习。在可解释的变体中,每个块的最后一层被移除。然后,反向预测和预测分支乘以模拟趋势(单调函数)和季节性(周期性循环函数)的特定矩阵。
注:原 N 拍实现只对单变量时间序列有效。
迪帕尔
一种结合深度学习和自回归特性的新型时间序列模型。 DeepAR 的俯视图显示在图 2 中:

图 2: DeepAR 模型架构(来源)
这是该模型的主要优势:
多个时间序列: DeepAR 对多个时间序列非常有效:通过使用分布略有不同的多个时间序列来构建全局模型。此外,该属性在许多现实世界场景中也有应用。例如,一家电力公司可能希望为他们的每个客户推出电力预测服务。几乎可以肯定的是,每个客户都有不同的消费模式(这意味着不同的分布)。
丰富的输入集:除了历史数据, DeepAR 还允许使用已知的未来时间序列(自回归模型的一个特征)和序列的额外静态属性。在前面提到的电力需求预测场景中,一个额外的时间变量可以是month(一个整数,取值范围为 1-12)。显然,假设每个客户都与一个测量功耗的传感器相关联,那么额外的静态变量将是类似于sensor_id或customer_id的东西。
自动缩放:如果您熟悉使用 MLPs 和 RNNs 等神经网络架构的时间序列预测,一个关键的预处理步骤是使用标准化技术缩放时间序列。在 DeepAR 中,不需要手动操作,因为引擎下的模型用缩放因子v_i缩放每个时间序列i的自回归输入z,缩放因子就是该时间序列的平均值。具体来说,本文基准中使用的比例因子公式如下:

然而,在实践中,如果目标时间序列的幅度相差很大,那么在预处理过程中应用我们自己的缩放可能会有所帮助。例如,在能源需求预测场景中,数据集可以包含中压电力客户(例如,消耗兆瓦级电力的小型工厂)和低压客户(例如,消耗千瓦级电力的家庭)。
概率预测: DeepAR 进行概率预测,而不是直接输出未来值。这是以蒙特卡罗样本的形式完成的。同样,通过使用分位数损失函数,这些预测用于计算分位数预测。对于那些不熟悉这种损失类型的人来说,分位数损失不仅用于计算估计值,还用于计算该值周围的预测区间。
时空形成器
在单变量时间序列的上下文中,时间依赖性是最重要的。然而,在一个多时间序列的场景中,事情并不那么简单。例如,假设我们有一个天气预报任务,我们想要预测五个城市的温度。同样,让我们假设这些城市属于同一个国家。鉴于我们目前所看到的,我们可以使用 DeepAR 将每个城市建模为一个外部静态协变量。
换句话说,该模型将考虑时间和空间关系。这是时空形成者的核心思想。
我们还可以更进一步,使用一个模型来利用这些城市/位置之间的空间关系,以便了解额外的有用依赖关系。换句话说,该模型将考虑时间和空间关系。这是时空器的核心思想。
钻研时空序列
顾名思义,这个模型使用了基于变压器的结构。在基于 transformer 的模型的时间序列预测中,产生时间感知嵌入的一种流行技术是通过time 2 vec【6】嵌入层传递输入(提醒一下,对于 NLP 任务,使用位置编码向量而不是产生上下文感知嵌入的 Time2vec )。虽然这种技术对于单变量时间序列非常有效,但是对于多变量时间输入没有任何意义。在语言建模中,一个句子的每个单词都用一个嵌入来表示,一个单词本质上是一个概念,一个词汇的一部分。
在多变量时间序列环境中,在给定的时间步长t,输入具有x_1,t、x_2,t、x_m,t的形式,其中x_i,t是特征i的数值,而m是特征/序列的总数。如果我们将输入通过一个 Time2Vec 层,就会产生一个时间嵌入向量。在这种情况下,这种嵌入真正代表了什么?答案是,它将把整个输入集表示为一个实体(令牌)。因此,模型将仅学习时间步长之间的时间动态,但是将错过特征/变量之间的空间关系。
时空形成器通过将输入展平成一个单一的大向量,称为时空序列,解决了这个问题。如果输入由N个变量组成,组织成T个时间步长,则生成的时空序列将具有(N x T)个标记。这在图** 3 中显示得更清楚:**

图 3: 导致时空序列的一系列变换:论文陈述:“(1)包含时间信息的多元输入格式。解码器输入缺少("?”)值设置为零,在这里将进行预测。(2)时间序列通过 Time2Vec 层,以生成表示周期性输入模式的频率嵌入。(3)二进制嵌入表示该值是作为上下文给出的还是需要预测的。(4)每个时间序列的整数索引被映射到具有查找表嵌入的“空间”表示。(5)用前馈层投影每个时间序列的 Time2Vec 嵌入和变量值。(6) Value &时间、变量和给定嵌入被相加和布局,使得 MSA 以更长的输入序列为代价处理跨时间和变量空间的关系。”来源
换句话说,最终的序列已经编码了统一的嵌入,由时间、空间和上下文信息组成。
然而,这种方法的一个缺点是序列可能变得太长,导致资源的二次增加。这是因为根据注意机制,每个令牌/实体都是相互检查的。作者利用了一种更有效的架构,适用于更大的序列,称为表演者注意机制。更多技术细节,查看 Github 上的项目回购。
时间融合变压器
时态融合 Transformer (TFT)是 Google 发布的基于 Transformer 的时间序列预测模型。如果你想对这个令人敬畏的模型进行更全面的分析,请查看这个帖子。
TFT 比以前的型号更通用。例如, DeepAR 不能处理目前已知的时间相关特性。

****图 4:TFT 顶层架构及其主要组件(来源)
TFT 的顶层架构如图图 4 所示。这些是该型号的主要优势:****
- ****多个时间序列:和前面提到的模型一样, TFT 支持在多个、异构的时间序列上建立模型。
- 丰富的特征数量 : TFT 支持 3 种类型的特征:I)输入未来已知的时变数据 ii)目前已知的时变数据 iii)分类/静态变量,也称为时不变特征。因此, TFT 比以前的型号更加通用。例如, DeepAR 不能处理目前已知的时间相关特性。在前面提到的电力需求预测场景中,我们希望使用湿度水平作为依赖于时间的特征,这是到目前为止才知道的。这在 TFT 中可行,但在 DeepAR 中不可行。
如何使用所有这些功能的示例如图 5 所示:

图 5 :外部静态变量对预测的影响(来源)
- 可解释性 : TFT 非常强调可解释性。具体来说,通过利用变量选择组件(如图图 4** 所示),模型可以成功地测量每个特性的影响。因此,模型学习特征的重要性。
另一方面, TFT 提出了一种新颖的可解释的多头注意力机制:来自这一层的注意力权重可以揭示回望期间哪些时间步长是最重要的。因此,这些权重的可视化可以揭示整个数据集中最显著的季节模式。** - ****预测区间:与 DeepAR , TFT 使用分位数回归,输出预测区间和预测值。
结束语
考虑到以上所有因素,深度学习无疑彻底改变了时间序列预测的前景。除了无与伦比的性能之外,上述所有模型都有一个共同点:它们充分利用多种多元时态数据,同时它们以和谐的方式使用外源信息,将预测性能提高到前所未有的水平。
感谢您的阅读!
参考
[1] Makridakis 等人,M5 精确度竞赛:结果、发现和结论,(2020)
[2] D. Salinas 等人, DeepAR:用自回归递归网络进行概率预测,国际预测杂志(2019)。
[3] Boris N .等人, N-BEATS:可解释时间序列预测的神经基础扩展分析,ICLR (2020)
[4]杰克·格雷斯比等人,用于动态时空预测的长程变压器,
[5] Bryan Lim 等人,用于可解释的多时间范围时间序列预测的时间融合变换器,国际预测杂志,2020 年 9 月
[6]赛义德·迈赫兰·卡泽米等人, Time2Vec:学习时间的一种矢量表示 ,2019 年 7 月
根据数据科学,学习外语的最佳迪士尼电影
使用数据找出 300 部迪士尼加版电影中哪一部最适合学习外语。

由 Pixabay 上的 Skitterphoto 拍摄
第一次使用 Disney Plus 时,我非常激动——这不是因为目录中有皮克斯和漫威的电影,而是因为它们的内容有多种语言版本。
英语、西班牙语、葡萄牙语、意大利语,应有尽有!那一刻,我想:“这是一个学习外语的好机会。”最重要的是,我们已经熟悉了一些迪士尼电影,这是一个优势,因为它增加了我们理解任何语言对话的机会。
但是 Disney+的目录中有大约 662 部电影。这有太多的内容可供选择,所以我做了一个数据分析,以找到最好的迪士尼电影,这将有助于我们轻松地学习外语,就像我之前为网飞秀和 3000 部顶级电影所做的那样。
所分析的电影来自迪士尼+目录,因此来自皮克斯、漫威、星球大战和国家地理的内容也包括在内。
**Table of Contents** [1\. How Am I Choosing The Best Movies?](#a4d6)
[2\. The Best Disney Movies to Learn a Foreign Language](#c250)
- [Ranking of The 300 Disney Movies](#8b5b)
- [The Best Movies for Beginner, Intermediate and Advanced Level](#5e09)
- [The Movie Genres With Simple and Hard Vocabulary](#80b5)
[3\. Methodology](#386b)
- [Data Collection](#b3bc)
- [Tokenization](#8f06)
- [Lemmatization](#6759)
- [Data Cleaning](#b32f)
[4\. Final Note](#f278)
我如何选择最好的电影?
为了选择最好的迪士尼电影来学习外语,我使用了包含每部电影中对话的抄本。
感谢为语言学领域的语料库分析创建的单词表,我可以找到每部电影中使用的词汇的难度。然后用一些 Python 代码,我根据下面的直方图创建了一个最佳电影的排名。
不要让图片吓到你!重要的是要知道,电影的词汇越简单,就越容易理解。例如,前 20 部电影是最好的,因为你只需要知道一种语言中最常用的前 1000 个单词,就可以识别至少 93%的单词。

作者图片
语言中的词汇遵循帕累托法则。一种语言中最常用的 1000 个单词占日常对话的 80%以上。学习常用词是学习外语的好机会!
现在你知道了我对“最佳电影”的定义,让我们来看看哪些是学习外语的最佳迪士尼电影。
有关分析的更多详细信息,请参见以下章节。
学习外语的最佳迪士尼电影
以下是 10 部最好的迪士尼电影,其中你只需要 1000 个单词就能认出至少 93%的对话。在之前显示的第一个栏中有 19 部电影,但我列出了 10 部最受欢迎的电影,以在轻松词汇和受欢迎程度之间找到平衡:

由 inspiredbythemuse 在 Pixabay 上拍摄的照片——冰雪奇缘 2 进入前 10,而冰雪奇缘进入前 30。
- 最后一首歌(2010)
- 皮特的龙(2016)
- 父母陷阱(1961 年和 1998 年)
- 摇滚夏令营 2:最后的堵塞(2010)
- 歌舞青春 3 (2008)
- 一个青少年戏剧女王的自白(2004)
- 熊哥哥(2003)
- 时间的皱纹(2018)
- 真实的故事(1999)
- 冰雪奇缘 2 (2019)
但这还不是全部!分析超越了前 10 部电影。只看 10 部电影不会让你的外语变得流利,对吗?
300 部迪士尼电影的排名
如果你想找到前 20 名、50 名、100 名或者挑战自己,看排名#300 的电影(词汇量最难的那部),你只需要在下表中搜索它们。
例如,我小时候喜欢看电影海底总动员,所以要知道这是看西班牙语还是葡萄牙语的好选择,我只需在框中键入海底总动员并找到它的排名。
所以,我发现海底总动员在排名中排在#123。还不错;然而,寻找多莉排在第 70 位,所以我想我会先看那部来提高我的语言能力。
初级、中级和高级水平的最佳电影
如果你想要更多的定制,那么你可以在下面的情节中找到适合你语言水平的完美电影。与前面的分析只关注最常见的 1000 字(初级水平)不同,在这种情况下,我们还分析了每部电影中最常见的 2000 和 3000 字所涵盖的对话的百分比。
如果 300 部电影对你来说还不够,看看我的其他文章,找到最好的网飞电影和节目以及学习外语的最好的 3000 部最受欢迎的电影。
如果你想知道更多关于如何通过看电视节目和电影来学习语言,我写了一个完整的指南来解释我是如何通过看电视来学习 3 种语言的。
词汇简单难懂的电影类型
在得到这个分析的结果后,我不禁注意到许多纪录片排在最后 10 名,所以我花了一些时间观看其中一些以获得更好的理解。
在迪士尼 Plus 上观看了非洲狮、海豚礁和活沙漠之后,我意识到这些词汇对大多数语言学习者来说可能是有挑战性的。除非你对动植物感兴趣,否则如果你的目标是流利地掌握一门外语,我不建议你看这类内容。
另一方面,前 10 名包含不同流派的电影,所以我无法得出一个关于学习外语的最佳电影流派的结论。我试着在这方面做一个不一样的分析。
方法学
我用 Python 做了所有这些分析。详情在我的 Github 上。这些是我遵循的步骤:
数据收集
在这个分析中,我使用了两个数据集——迪士尼 Plus 目录和电影脚本。我在谷歌上搜索电影脚本,尽可能多地找到迪士尼电影脚本。最后我只找到了 400 份左右,但是经过清洗过程,只剩下 300 份抄本可供分析。
然后我下载了可在 Kaggle 上获得的迪士尼 Plus 目录数据集。它包括截至 2020 年迪士尼 Plus 上可用的游戏。我用目录将抄本与迪士尼 Plus 上的标题进行了匹配。
标记化
为了分析抄本中的词汇,我标记了所有由人物说出的单词。Python 中有许多用于标记化的工具,但我使用了 CountVectorizer,因为它将收集的副本转换成标记计数的数据帧,从而简化了分析。在我分析了 3000 部电影的文章中,我解释了更多关于 CountVectorizer 如何工作的内容。
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction import text
import scipy.sparse
cv = CountVectorizer()
cv_matrix = cv.fit_transform(df_analysis['transcripts'])
df_dtm = pd.DataFrame.sparse.from_spmatrix(cv_matrix, index=df_analysis.index,columns=cv.get_feature_names())
df_dtm = df_dtm.T
词汇化
在标记化之后,我必须找到每个标记的基本形式。您可以通过使用词汇化技术来实现这一点,您可以在 NLTK 库中找到这些技术。然而,我使用了词族表来做类似的工作,并根据每个单词的出现频率给你一个难度等级。截至 2020 年,共有 29 个单词家族列表,你可以在这里找到其中一些。这些列表在语言学和作为第二语言的英语学习的研究论文中被评估。
数据清理
我去掉了电影里听不到的词,比如场景描述和说话人的名字。我使用的清理方法远非完美,但它帮助我标准化了抄本中的对话。我使用的 clean_transcripts 文件可以在我的 Github 上找到。
我还排除了对话中有超过 4.5%的单词与单词家族列表不匹配的抄本(它们可能是离群值或损坏的数据)。我通常使用 3.5%,但在这种情况下,我看了一些在 3.5%和 4.5%之间的电影,我没有在抄本中发现任何奇怪的东西。
from cleaning import clean_transcripts
round1 = lambda x: clean_transcripts(x)
df_analysis['transcripts'] = df_analysis['transcripts'].apply(round1)
...
df_statistics = df_statistics[df_statistics[100]<4.5]
最后一个音符
在这个分析中,我们找到了学习语言的最佳迪士尼电影。从简单的电影开始是一个很好的主意,这样我们在理解对话时就不会有太大的困难,在观看场景时也更有趣。然而,也要考虑看你喜欢的电影,所以挑你喜欢的排名靠前的电影。
用于分析的文字记录是英文的。我测试了一些语言的结果,比如西班牙语和葡萄牙语,它们运行良好。我想说这对于浪漫语言很有效,但是我不能保证对于其他语言也有同样的效果。
请让我知道,如果电影仍然有一个简单的词汇,通过观看你正在学习的语言。
值得关注的最佳机器学习博客和资源
不断更新的资源

埃德·罗伯逊在 Unsplash 上拍摄的照片
转向自由职业给了我更多的空闲时间。和家人一起出去玩后,我喜欢把大量时间投入到自我教育和培养新技能上,这些新技能能让我在为客户做项目上花费的时间获得更大的回报——所有这些都是为了获得更多的空闲时间。
这里有一些机器学习资源&博客,当我想了解最新情况时会用到。
课程资源
Coursera
每当我寻求提升我的机器学习技能时,Coursera 通常是我寻找课程的第一个地方。更有帮助的是,Coursera 的创始人不是别人,正是吴恩达,他可能是现存最著名的机器学习 MOOC 的创始人。
Udemy
Udemy 也证明了自己是一个学习机器学习的好方法。我参加的许多关于机器学习的课程,总是忽略了 ML 生命周期的部署阶段。我真的很想学这个,当时我唯一能找到的课程是在 Udemy 上——许多其他课程已经充斥了市场。根据我的经验,Udemy 上有很多杂音,在熟悉 Coursera 如何测验和测试你之后,我觉得 Udemy 的课程要被动得多——这可能只是我上过的课程的情况。
Udacity
我只在 Udacity 上过一门机器学习课程,那是一个纳米学位。根据与其他学习者的讨论和我的一次经历,我觉得可以公平地说,纳米学位非常全面,你肯定会觉得自己更有能力。我反对这种资源的一个理由是它很贵,我每月为我的课程支付 329 英镑。然而,支持团队愿意协商更实惠的东西,而且一直都有很多销售。
博客
走向数据科学
《走向数据科学》是关于数据科学媒体的最大出版物。由于我花了相当多的时间在这个平台上写博客,所以我也花大部分时间阅读其他作者的文章是有道理的。如果工作是一种观点,一定要对所说的持保留态度,并评估它是否是你同意的。另一方面,如果工作更多的是关于技术概念,确保你交叉检查原始资料。
谷歌人工智能
我最近偶然发现了谷歌人工智能,看到他们的博客如此新颖,我感到震惊。大多数大公司允许他们的博客连续几个月没有新内容,但谷歌人工智能博客似乎不是这样。随着谷歌成为一家大公司,很可能他们发布的任何东西都会在发布前经过严格审查,这并不意味着发布的所有东西都一定是正确的,这仅仅意味着帖子不会那么固执己见。
KDNuggets
KDNuggets 可能是历史最悠久的大数据/数据挖掘相关在线平台——如果我说错了,请纠正我。这可能是我决定学习机器学习的第一个平台,它对我的学习至关重要。虽然我从未参加过,但该平台也举办了许多可能有价值的网络研讨会、教程、课程和数据集(如果你参加过,请留下评论分享你的经验)。
卡格尔
我知道你在想什么——“ka ggle 不是博客网站”。严格来说,你是对的。然而,一群从业者在网站上发布了非常实用的技巧和诀窍,所以值得去那里看看他们的一些想法。例如,搜索顶级内核来通读并评估是什么让这个内核如此之好是没有坏处的。然后,访问一个不太受欢迎的内核,用你对顶级内核所做的同样的方法来分析它,并确定为什么那个内核没有排名第一的内核受欢迎。
视频资源
高投资回报率数据科学家
不久前,我接触了文。但从我们第一次互动开始,我就没有停止过消费他的内容。Vin 为数据行业提供了一个非常不同的视角,它不遵守社区制定的规范,在某种程度上拓展了数据专业人员的真正含义。他在社交媒体上分享了非常有思想的作品,更好的是,他现在在 YouTube 上制作视频内容。
我强烈推荐他的内容。
https://www.youtube.com/channel/UCkYooZtwK_RJAd9SdL1jfeA
包裹
只有当知识投入使用时,消费内容才是有益的。很容易陷入连续消费的陷阱,因此,我强烈建议你只在需要的时候消费内容,1)灵感 2)解决当前的问题。作为一名从业者,你将会看到的最大增长通常来自于你所学到的东西和你的失败的应用,所以不要试图通过认为你可以消耗掉你的出路来避免这一点。
感谢您的阅读!
如果你喜欢这篇文章,请通过订阅我的每周简讯与我联系。不要错过我写的关于人工智能、数据科学和自由职业的帖子。
相关文章
**https://medium.com/analytics-vidhya/courses-to-learn-data-science-in-2021-a52e64344e5c https://pub.towardsai.net/7-free-online-resources-for-nlp-lovers-26b1e0bba343 **
用 Python 读取文本文件的最佳实践

将多个文件合并成一个具有更丰富元数据的流
与大多数其他编程语言相比,用 Python 读取文本文件相对容易。通常,我们只是在读或写模式下使用“open()”函数,然后开始逐行循环文本文件。
这已经是最佳实践了,没有比这更简单的方法了。但是,当我们想从多个文件中读取内容时,肯定有更好的方法。也就是使用 Python 内置的“文件输入”模块。它结合了来自多个文件的内容,允许我们在一个 for 循环中处理所有的内容,还有很多其他的好处。
在本文中,我将用例子演示这个模块。
0.没有 FileInput 模块

由 DGlodowska 在 Pixabay 上拍摄的照片
让我们看看使用open()函数读取多个文本文件的“普通”方式。但是在此之前,我们需要创建两个示例文件用于演示。
with open('my_file1.txt', mode='w') as f:
f.write('This is line 1-1\n')
f.write('This is line 1-2\n')with open('my_file2.txt', mode='w') as f:
f.write('This is line 2-1\n')
f.write('This is line 2-2\n')
在上面的代码中,我们用模式w打开一个文件,这意味着“写”。然后,我们在文件中写两行。请注意,我们需要添加新的生产线\n。否则,这两个句子将被写成一行。
之后,我们应该在当前工作目录中有两个文本文件。


现在,假设我们想读取这两个文本文件并逐行打印内容。当然,我们仍然可以使用open()函数来实现。
# Iterate through all file
for file in ['my_file1.txt', 'my_file2.txt']:
with open(file, 'r') as f:
for line in f:
print(line)

这里我们必须使用两个嵌套的 for 循环。外部循环用于文件,而内部循环用于每个文件中的行。
1.使用文件输入模块

嗯,没有什么能阻止我们使用open()功能。然而,fileinput模块只是为我们提供了一种将多个文本文件读入单个流的更简洁的方式。
首先,我们需要导入模块。这是一个 Python 内置模块,所以我们不需要下载任何东西。
import fileinput as fi
然后,我们可以用它来读取这两个文件。
with fi.input(files=['my_file1.txt', 'my_file2.txt']) as f:
for line in f:
print(line)

因为fileinput模块是为读取多个文件而设计的,我们不再需要循环文件名。相反,input()函数将一个可迭代的集合类型(比如列表)作为参数。此外,最棒的是两个文件中的所有行都可以在一个 for 循环中访问。
2.将 FileInput 模块与 Glob 一起使用

有时,拥有这样一个包含所有手动键入的名称的文件名列表可能并不实际。从一个目录中读取所有文件是很常见的。此外,我们可能只对某些类型的文件感兴趣。
在这种情况下,我们可以将另一个 Python 内置模块glob模块与fileinput模块一起使用。
在此之前我们可以做一个简单的实验。os模块可以帮助我们列出当前工作目录下的所有文件。

可以看到,除了这两个文本文件之外,还有很多文件。因此,我们希望过滤文件名,因为我们只想读取文本文件。我们可以如下使用glob模块。
from glob import globglob('*.txt')

现在,我们可以将glob()函数作为参数放入fileinput.input()函数中。所以,只有这两个文本文件将被读取。
with fi.input(files=glob('*.txt')) as f:
for line in f:
print(line)

3.获取文件的元数据

您可能会问,当我们从实际上由多个文件组合而成的流中进行读取时,我们如何知道“行”到底来自哪个文件?
事实上,使用嵌套循环的open()函数似乎很容易获得这样的信息,因为我们可以从外部循环访问当前文件名。然而,这实际上在fileinput模块中要容易得多。
with fi.input(files=glob('*.txt')) as f:
for line in f:
print(f'File Name: {f.filename()} | Line No: {f.lineno()} | {line}')

看,在上面的代码中,我们使用filename()来访问line来自的当前文件,使用lineno()来访问我们正在获取的行的当前索引。
4.当光标到达新文件时

由 DariuszSankowski 在 Pixabay 上拍摄的照片
除此之外,我们还可以利用来自fileinput模块的更多函数。例如,当我们到达一个新文件时,如果我们想做些什么呢?
函数isfirstline()帮助我们决定是否从一个新文件中读取第一行。
with fi.input(files=glob('*.txt')) as f:
for line in f:
if f.isfirstline():
print(f'> Start to read {f.filename()}...')
print(line)

这对于日志记录非常有用。所以,我们可以用当前的进度来表示。
5.跳到下一个文件

我们也可以很容易地停止读取当前文件,跳到下一个文件。功能nextfile()允许我们这样做。
在我们演示这个特性之前,请让我重写两个示例文件。
with open('my_file1.txt', mode='w') as f:
f.write('This is line 1-1\n')
f.write('stop reading\n')
f.write('This is line 1-2\n')with open('my_file2.txt', mode='w') as f:
f.write('This is line 2-1\n')
f.write('This is line 2-2\n')
与原始文件唯一不同的是,我在第一个文本文件中添加了一行文本stop reading。假设我们希望fileinput模块在看到这样的内容时停止读取第一个文件并跳转到第二个文件。
with fi.input(files=glob('*.txt')) as f:
for line in f:
if f.isfirstline():
print(f'> Start to read {f.filename()}...')
if line == 'stop reading\n':
f.nextfile()
else:
print(line)

在上面的代码中,添加了另一个 if 条件。当行文本为stop reading时,它将跳转到下一个文件。因此,我们可以看到行“1–2”没有被读取和输出。
6.读取压缩文件而不解压缩

由 Pixabay 上的 kaboompics 拍摄的照片
有时我们可能需要阅读压缩文件。通常,我们必须先解压缩它们,然后才能读取内容。然而,使用fileinput模块,我们可能不需要在读取压缩文件之前提取其中的内容。
让我们用 Gzip 创建一个压缩文本文件。该文件稍后将用于演示目的。
import gzip
import shutilwith open('my_file1.txt', 'rb') as f_in:
with gzip.open('my_file.gz', 'wb') as f_out:
shutil.copyfileobj(f_in, f_out)
在上面的代码中,我们使用 gzip 将文件my_file1.txt添加到一个压缩文件中。现在,让我们看看fileinput如何在没有额外解压缩步骤的情况下读取它。
with fi.input(files='my_file.gz', openhook=fi.hook_compressed) as f:
for line in f:
print(line)

通过使用参数openhook和标志fi.hook_compressed,gzip 文件将被动态解压缩。
fileinput模块目前支持 gzip 和 bzip2。不幸的是,不是另一种格式。
摘要

在本文中,我介绍了 Python 内置模块fileinput以及如何使用它读取多个文本文件。当然,它永远不会取代open()函数,但就将多个文件读入单个流而言,我相信它是最佳实践。
https://medium.com/@qiuyujx/membership
如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和数以千计的其他作者!(点击上面的链接)
最好的 Python 情绪分析包(+1 个巨大的常见错误)
提示和技巧
如何在不训练自己模型的情况下获得近乎完美的性能

情感分析是最常被研究的自然语言处理任务之一,在从公司管理他们的社交媒体形象到情感股票交易到产品评论的使用案例中都可以看到。
随着它越来越受欢迎,可用的软件包也越来越多,为了选出最好的,我把三个流行的软件包放在一起:NLTK (VADER)、TextBlob 和 Flair。
NLTK (VADER)和 TextBlob
这两个软件包都依赖于基于规则的情感分析器。因此,它会对某些单词(例如恐怖有负面联想),注意否定是否存在,根据这些词返回值。这种方法工作起来很好,并且具有简单和速度极快的优点,但是也有一些缺点。
- 随着句子变得越来越长,中性词就越来越多,因此,总得分也越来越趋于中性
- 讽刺和行话经常被误解
NLTK 可以使用以下代码找到文本的整个数据帧的极性得分(从-1 到 1)和情感:
from nltk.sentiment import SentimentIntensityAnalyzer
import operator
sia = SentimentIntensityAnalyzer()
df["sentiment_score"] = df["reviews.text"].apply(lambda x: sia.polarity_scores(x)["compound"])
df["sentiment"] = np.select([df["sentiment_score"] < 0, df["sentiment_score"] == 0, df["sentiment_score"] > 0],
['neg', 'neu', 'pos'])
而 Textblob 可以以更简洁的方式完成同样的工作
from textblob import TextBlob
df["sentiment_score"] = df["reviews.text"].apply(lambda x: TextBlob(str(x)).sentiment.polarity)
df["sentiment"] = np.select([df["sentiment_score"] < 0, df["sentiment_score"] == 0, df["sentiment_score"] > 0],
['neg', 'neu', 'pos'])
天赋
Flair 是一个预训练的基于嵌入的模型。这意味着每个单词都在一个向量空间中表示。具有与另一个单词最相似的矢量表示的单词经常在相同的上下文中使用。因此,这使得我们能够确定任何给定向量的情感,从而确定任何给定句子的情感。如果您对更多的技术方面感兴趣,这些嵌入是基于本文的。
Flair 往往比基于规则的模型慢得多,但它的优势在于它是一个经过训练的 NLP 模型,而不是基于规则的模型,如果做得好,它会带来额外的性能。为了客观地看待慢了多少,在运行 1200 个句子时,NLTK 花了 0.78 秒,Textblob 花了令人印象深刻的 0.55 秒,而 Flair 花了 49 秒(长 50-100 倍),这就引出了一个问题,即增加的准确性是否真正值得增加的运行时间。
一个完整的数据帧可以这样训练
from flair.models import TextClassifier
from flair.data import Sentencesia = TextClassifier.load('en-sentiment')def flair_prediction(x):
sentence = Sentence(x)
sia.predict(sentence)
score = sentence.labels[0]
if "POSITIVE" in str(score):
return "pos"
elif "NEGATIVE" in str(score):
return "neg"
else:
return "neu"df["sentiment"] = df["reviews.text"].apply(flair_prediction)
对他们进行测试
为了测试这些包,我将使用由data inity提供的来自 Kaggle 的亚马逊评论的大型数据库。该数据集包括 34,000 条从 1 到 5 星的评论,其中大多数是 5 星评论。为了准确评估,我会从每个星级二次抽样 300。为了确定我的准确性,我将只使用 300 个 1 星评论(假设它们都应该是负面的)和 300 个 5 星评论(假设它们都应该是正面的)
我将使用的性能指标是准确性(所有预测中的正确预测)、精确度(有多少正面预测是正确的)、特异性(衡量有多少负面预测是正确的)和 F1 值(精确度和召回率的调和平均值)
分数如下
NLTK (VADER)
Accuracy: 68.69712351945854
Precision: 62.38938053097345
Specificity: 42.17687074829932
F1: 75.30040053404538 TEXTBLOB
Accuracy: 65.97582037996546
Precision: 60.29411764705882
Specificity: 33.45070422535211
F1: 74.44876783398183FLAIR
Accuracy: 96.0
Precision: 95.69536423841059
Specificity: 95.66666666666667
F1: 96.01328903654486
结果不言自明——基于规则的模型很难确定负面评论何时是真正负面的。VADER 正确识别了 280/300 个五星评论,但只正确识别了 126/300 个负面评论(哎哟),导致了可怕的 42%特异性分数。我认为这是因为负面评论中大量使用了强调、行话和讽刺。
另一方面,Flair 没有落入这个陷阱,正确地识别了 289/300 的正面评论,以及 287/300 的负面评论。它在 2 星评价中也有类似的良好表现,290/300 的评价是负面的。详细结果如下!
NLTK (VADER)
reviews.rating sentiment
1.0 neg 124
neu 6
pos 170
5.0 neg 15
neu 3
pos 282TEXTBLOB
reviews.rating sentiment
1.0 neg 95
neu 16
pos 189
5.0 neg 8
neu 5
pos 287FLAIR
reviews.rating sentiment
1.0 neg 287
pos 13
5.0 neg 11
pos 289
这些结果意味着您只需使用 Flair 的几行代码就可以获得一流的性能!
一个常见的陷阱
大多数情感分析模型会建议拆分评论的每个句子,因为模型是在单个句子上训练的。我发现这既不准确又计算量大,我这样做的结果如下:
NLTK (VADER)
Accuracy: 67.66666666666666
Precision: 61.67400881057269
Specificity: 42.0
F1: 74.27055702917772
Runtime: 0.825s (vs 0.784s)TEXTBLOB
Accuracy: 65.86620926243569
Precision: 60.475161987041034
Specificity: 36.23693379790941
F1: 73.78129117259552
Runtime: 0.958s (vs 0.552s)FLAIR
Accuracy: 91.5
Precision: 89.52380952380953
Specificity: 89.0
F1: 91.70731707317074
Runtime: 121s (vs 49s)
请注意所有这些值是如何变低的,即使我控制了超过 100 字的评论,这一点仍然是正确的。显然,一定要将超过 200 个单词的文本分割开来,但是对于长达 1-2 段的文本,我发现将文本分割成句子是一种误导,不值得追求。
结论
对于仅使用预训练模型的出色性能,Flair 提供了可能与定制模型相匹配的性能。我还了解到,所有这些模型对文本长度的鲁棒性都比它们各自的文档可能让您相信的要高。如果你想要源代码,我把它上传到这里。我从 Neptune.ai 的这个博客中学到了很多关于如何使用这些模型的知识。我希望这对你的情绪分析之旅有所帮助,如果你喜欢你所读的,请随意跟随我,阅读我写的更多内容。我倾向于每个月深入一个主题一次(因为这些文章通常要花我 3 天以上的时间)!
学习数据科学的最佳资源
让你的学习之旅更加高效。

我进入数据科学的第一步是 YouTube 上的一个视频。一位教授在谈论他的一个硕士学生,他使用机器学习来生成歌词。
看完那个视频后,我花了大约两年时间找到了我的第一份工作,成为一名数据科学家。我有电气工程学士学位,并且我一直擅长数学。因此,对我来说,学习数据科学中与数学相关的主题相对容易。
然而,我没有任何编程经验或软件知识。我的统计学知识仅限于集中趋势的测量。
长话短说,这是一段需要努力和奉献的旅程。
我从许多不同的资源中学习,如 YouTube 视频、媒体文章、MOOC 课程、个人博客、GitHub 和书籍。
在我开始从事数据科学家的工作后,我意识到我错过了学习的最好资源:数据科学家。
在这篇文章中,我将解释为什么我认为数据科学家是最好的资源。我还将解释我们可以如何充分利用这一资源。
为什么是数据科学家?
我先说清楚。我并不是说数据科学家应该坐下来教你一切。相反,数据科学家应该引导你,塑造你的学习路径。
学习数据科学有大量的资源。不经历资源匮乏其实是很好的。然而,如果不明智地使用,有这么多东西可以学习可能会变成一种劣势。

想象一个巨大的水池,里面有无数的鱼,而你只有一根鱼竿。有些鱼不适合食用。如果你知道又好又好吃的鱼,抓几条来吃,你就有一顿美餐了。
如果你试图把它们都抓住,你会在做完后筋疲力尽。你甚至会觉得太累而不想吃东西。而且,你会浪费时间去抓那些不好吃的鱼。
这里打个比方。该资源池代表了学习数据科学的全部资源。每条鱼都是不同的资源。抓鱼意味着学习。
试图抓住所有的鱼意味着试图从每一种资源中学习。就像有些鱼不适合食用一样,有些资源用处不大或没有用处。
一个真正的数据科学家能做的是,她能告诉你什么是好鱼。她还会告诉你吃多少鱼才够你吃饱。结果是,你会把注意力集中在好鱼上,而不会浪费任何时间去抓坏鱼。
在我两年的旅程中,我学到了很多有用和重要的东西。与此同时,我还花时间学习了我在数据科学职业生涯中从未用过的东西。
如果我一开始就知道关注什么主题或工具,我可能会更快找到我的第一份工作。此外,我将有更多的时间来提高我在重要工具上的技能。
解决这些问题最有效的方法是咨询业内人士。第一个候选人当然是数据科学家。
结论
如果你已经决定成为一名数据科学家,我强烈建议你先和数据科学家谈谈。你不仅会对数据科学家做什么有更好的了解,还会学到更快到达那里的技巧。
请记住,数据科学家所做的事情可能会根据他们工作的领域而变化。例如,如果你想从事金融工作,试着找一个从事金融的人。尽管基本原则和概念是相同的,但领域知识在某些情况下起着关键作用。
如果您没有特定的领域,或者找不到您想要的领域的数据科学家,任何数据科学家都会非常有帮助。关于基本工具和概念的指导也非常重要。
感谢您的阅读。如果您有任何反馈,请告诉我。
学习机器学习和数据科学 Python 的最佳资源
挑一个,永不回头

在 Unsplash 上由 Hitesh Choudhary 拍摄的照片
决定你想从事机器学习的职业意味着你必须决定你想用哪种语言来实现。机器学习从业者中流行的语言是 Python 和 R,尽管也有人们决定使用 C、C++、JavaScript 等的情况。
我选择 Python 是因为当我决定开始做机器学习时,它是我遇到的第一种语言。它最终为我工作,但如果你比我一开始更勤奋一点,这里有一些你可能想学习 Python 进行机器学习的原因。
- 许多人使用 Python 进行机器学习,所以网上有很多支持
- Python 是一种高级编程语言,具有广泛的机器学习框架。
- 进入的门槛很低,因为 Python 读起来像英语
这个列表并不详尽,但是关于 Python 为什么是一种好语言的完整总结超出了本文的范围。
资源
虽然有很多资源可以用来开发 Python 的机器学习技能,但我不认为你有必要把它们都拿来。事不宜迟,下面列出了机器学习学习 Python 的资源(免责声明 : 资源不分时间顺序。):
Udemy

Python For Data Science and Machine Learning boot camp(Udemy)
用于数据科学和机器学习的 Python 是一门很受欢迎的 Python 课程。在撰写本文时,它目前拥有近 50 万注册学生和 101,909 个评级。
在接触 Jupyter 笔记本电脑之前,它首先会引导您完成环境设置。课程的第一部分是 Python 速成班,涵盖了数据结构和 Python 语法。一旦解决了这个问题,你就可以学习数据科学和机器学习中常用的库,比如 NumPy、Pandas、Matplotlib 等等。
该课程由何塞·波尔蒂利亚教授,他是 Pierian Data Inc .的数据科学主管。他还为通用电气、Cigna、纽约时报、瑞士瑞信银行、麦肯锡等顶级公司的员工提供面对面的数据科学和 Python 编程培训课程。
在本课程中,您将涵盖一些关键概念,例如:
- 交叉验证和偏差-方差权衡
- 推荐系统
- 自然语言处理
- 各种机器学习算法
Coursera

Coursera 由广受欢迎的机器学习老师吴恩达于 2012 年 4 月创立。该平台与世界上一些最好的大学和顶级组织合作,提供许多科目的在线课程、认证和学位。IBM 的 Python for Data Science,AI & Development(由 IBM 的数据科学家 Joseph Santarcangelo 博士教授)是组织在平台上提供知识的一个例子。
该课程旨在向初学者介绍 Python——带领学生在几个小时内从零知识到 Python 实用编程。因此,不需要事先有编程经验,因为本课程将涵盖许多基础知识(即 Python 基础、数据结构、数据分析等)。
在本课程中,您将涵盖一些关键概念,例如:
- Python 基础
- Python 数据结构和基础
- 在 Python 中使用数据
- API 和数据收集
艰难地学习 Python

尽管《艰难地学习 Python》并不局限于机器学习和数据科学,但它可能是开始用 Python 编程的最流行的方式,这也是它上榜的原因。
该课程旨在带领学生从零到英雄,因此不要求事先有编程经验。除了这个课程,还有 Zed Shaw 写的《艰难地学习 Python》一书。
本教程中包含的一些关键主题如下:
- 变量和名称
- 读取和写入文件
- Python 类和对象
- 功能
- 文件处理
代码学院

Codeacademy 是我开始接触 Python 的原因。我学的确切课程是数据科学的 Python & SQL,但我已经能够追溯它的下落,因为它已经过去 3 年多了。尽管如此,还是有很多同时学习 Python、数据科学和机器学习的好课程。
平台有各种技能路径课程。在我看来,它们类似于 Coursera 专业化,但要短得多。技能路线课程从初学者友好型、完全新手型到高级型都有。进一步补充一下,这个平台上还有许多其他有用的功能,比如 Codeacademy 博客。
您可能需要考虑的一些课程包括:
- 学习 Python 3
- 用 Python 可视化数据
- 如何用 Python 清理数据
- 用 Python 构建机器学习模型
Python 的搭便车指南

Python 的搭便车指南对我的 Python 开发产生了重大影响。它不是专门针对机器学习和数据科学的,但它挤满了来自作者 Kenneth Reitz 和 Tanya Schulusser 使用该语言的固执己见的经验的宝贵见解。
该指南作为一种结构化的方式,为 Python 开发新手和专家提供了最佳实践参考手册,涵盖了安装、代码风格、文档、测试等主题。
数据营

DataCamp 成立于 2013 年。这个想法是帮助人们在线建立他们的数据技能,在撰写本文时,80%的财富 1000 强公司使用 DataCamp 来提升他们团队的技能。
《Python 数据科学家》课程将带你从一个对 Python 一无所知的人成长为一名自信的数据科学家。它由各种交互式练习组成,允许学生实际操作 Python 中用于数据科学的一些事实上的库(即 NumPy、Matplotlib、Pandas 等)。
此外,学生采用自上而下的方法学习静态和机器学习技术。主题包括:
- Python 简介
- 调查网飞电影
- 用熊猫操纵数据。
最后的想法
选择一门课程并坚持下去。尽量不要陷入一门又一门课程的陷阱。这个想法是参加一个课程,并尽快开始实施你所学到的东西。此外,尽量避免卷入 Python 与 R 的争论——这完全是浪费时间,而且不会让你的职业生涯更进一步。
感谢阅读!
如果你喜欢这篇文章,请通过订阅我的免费 每周简讯与我联系。不要错过我写的关于人工智能、数据科学和自由职业的帖子。
相关文章
https://medium.com/analytics-vidhya/courses-to-learn-data-science-in-2021-a52e64344e5c
在 R 中使用的最佳空间分析包
空间数据分析变得越来越重要。拥有最好的工具。
随着数据变得更加地理化,越来越有必要使空间数据更易于访问和处理。虽然有很多工具可以让您在处理空间数据时更加轻松(例如,QGIS 和 ArcMap ),但使用 R 进行空间分析也同样简单。如果您不熟悉其中的一些包,并且不想通读所有文档来学习这个包,或者更乏味的是,编写数百行自己的代码来做一些相对简单的事情,那就更是如此。在本文中,我将讨论几个软件包,它们使得常见的空间统计方法在 r。
地图
【https://cran.r-project.org/web/packages/maps/maps.pdf 号
地图包的核心不是空间统计包。它实际上是一个基本的软件包,可以用很少的代码非常快速地制作简单的地图。这对于快速查看 R 中的矢量化数据非常有用。虽然不一定是查看 shapefiles(用于存储几何信息的数据文件)的最佳方式,但如果你有一个带有纬度和经度坐标的数据集,将它们绘制到由 maps 包制作的地图上是相对容易的。
只需一行简单的代码,您就可以生成几乎任何地区的地图。我将以美国为例:
地图(“美国”)
当您输入该内容时,您应该会看到如下所示的地图:

使用 maps 包的 R 中的基本地图 mad 的图像。图片来源:作者。
诚然,这是一个简单的地图,但你仍然可以利用它来获得一个良好的数据视图。如果您想更进一步,您可以更改投影,高亮显示国家的特定区域(查看“地图”功能的区域参数)或添加点、线和多边形,以便轻松显示您的数据。
spatstat
https://cran . r-project . org/web/packages/spat stat/spat stat . pdf
Spatstat 是一个非常好的用于二维空间数据集的软件包。它本质上是一个完整的空间统计包,可用于点模式分析。点模式分析是研究空间中的空间点。使用 spatstat 包,您不仅可以围绕空间点及其属性构建模型,还可以构建模型来预测未来的点移动。该软件包使用多种方法构建模型,包括最大似然法和逻辑回归法。
当您尝试分析空间点模式移动和分布时,应该使用 spatstat 包。一个模型可以用一个简单的 glm()函数来拟合一个数据集,并且输出可以很容易地绘制到从地图部分提到的函数打印的地图上!Spatstat 还允许您进行内核密度估计(KDE)。使用 KDE 为您的空间数据构建概率分布是非常棒的。例如,如果您正在检查一个州内站点的降雨量,您可以使用核密度估计值来确定该州的哪个部分的哪个站点最有可能产生最多的降雨(并查看哪个站点的降雨量最少)。虽然检查定量值可能更容易,但可视化有助于了解数量最低的站点周围的站点的行为表现。
spdep
https://cran.r-project.org/web/packages/spdep/spdep.pdf
如果您的数据中可能有不明显的关系,但是您需要发现它们,那么您应该使用 spdep 包。Spdep 允许您为数据集构建空间权重,并对数据集进行自相关。空间权重允许您确定数据集中的哪些部分(位置)对数据本身的整体模式影响最大。如果您正在调查与数据集另一部分中的值(事件)相关的问题,那么空间权重非常有用。自相关对于测量两个变量之间的空间关系非常有用。比方说,你正试图确定一个城市的中等收入和犯罪之间的关系。您可以使用空间自相关来研究不同的财富分位数如何影响城市不同区域的犯罪率。
下次想要探索空间数据集中的关系时,请使用 spdep 包。
地图工具
https://cran . r-project . org/web/packages/maptools/maptools . pdf
Maptools 允许您读入和操作空间数据。虽然这里讨论的大多数其他包都侧重于绘图和分析,但 maptools 用于读取、写入和导出空间数据。在 KML、SHP 和 ASCII 中,如果您的数据有坐标,您可以使用 maptools 来浏览其中的信息。有许多函数可以使导入空间数据变得尽可能简单。
GISTools
https://cran . r-project . org/web/packages/GIS tools/GIS tools . pdf
对于空间数据来说,这可能是 R 中最通用和必需的 GIS 包之一。GISTools 不仅允许您制作地图,还允许您分析数据。您可以使用非常简单的函数进行内核密度估计:
kde.points()
结果是输出可以很容易地在地图上可视化。
GISTools 的其余功能允许您制作非常详细的制图产品。Choropleth 地图(根据颜色显示数值)、levelplots、多边形掩膜,几乎所有你能想到的制图功能都能在 GISTools 中找到。
以下是 GISTools 输出的一些示例。
虽然上述包在处理空间数据方面具有不可思议的通用性,但请记住,在 r 中进行分析时,没有一种包是万能的。例如,上述包可能难以处理大型栅格数据集,并且使用上述包制作的地图看起来相对简单,没有太多的细节。如果您想了解如何深入使用这些包或如何用 R 和 Python 制作漂亮的地图,请关注我或 Found Spatial 以了解更多信息!
开始数据科学职业生涯的最佳时机
从数据科学职业生涯的早期开始中获益的 5 种方式

对数据科学职业感兴趣的人才向我提出的最多的问题之一是“什么时候开始从事数据科学工作最合适?”。这个问题的答案可以是简单明了的:“越快越好,尤其是当你还是个学生的时候!”。
是的,确实如此。当你还是学生时(甚至在你攻读博士学位期间,如果你正在攻读博士学位),或者在职业生涯的早期,就开始构建你的数据科学职业生涯总是更好的。当我开始我的数据科学之旅时,我刚刚结束我的神经信息处理(应用机器学习)硕士课程。我是一个对机器学习研究充满热情的年轻学生。我正准备在一个基础研究领域开始我的博士研究,但在内心深处,我知道我本质上是一名工程师。
我拥有 IT 工程学士学位……我的硕士论文与软件工程和将机器学习投入生产有很大关系。我用 C++开发了一个用于治疗目的的虚拟现实软件。这是一个很酷的虚拟现实工具,它连接到一个动作捕捉手套,并使用虚拟现实护目镜实时向自己展示患者的手部运动。我们使用机器学习向患者提供实时反馈,并帮助康复诊所的治疗师监督患者的治疗计划。我非常自豪的是,一年的辛勤工作为社会做了一些好事,尤其是帮助了那些失去活动能力的人。这个项目还教会了我应用一些像虚拟现实或机器学习这样的新技术(是的,回到 2012 年,机器学习对这个行业来说还是非常新的!)到现实世界的软件。
那时,我知道我对使用机器学习和数据科学解决现实世界的问题感兴趣。因此,我开始通过在线课程学习数据科学,紧接着我的理论性博士研究。我不得不承认,我从我的学术教育和通过在线课程的自学中学到了很多。在线课程和教程非常有助于了解工具和技术以及行业动态。尽管如此,我的博士研究项目也帮助我塑造了我的分析和统计思维以及弹性解决问题的技能,以构建优秀的机器学习模型。
在博士的第二年,我开始觉得我已经学到了足够多的工具和技术,可以胜任最初级的数据科学工作。所以,我开始在空闲时间做一些实习/初级数据科学家的工作,主要是在周末。工作量很难处理,尤其是当它与一个要求很高的博士项目并行时,但所有这些努力最终都得到了回报!在我博士学习结束时,我被一家著名的咨询公司录用,从事数据科学咨询工作。对于许多有关系的人或在这类公司工作的家庭成员来说,这听起来可能很正常,但对于大多数毕业后难以找到工作的国际学生来说,就不那么正常了。我的故事给了我信心,让我相信拥有一个清晰的职业战略并努力实现你的职业目标会有巨大的回报。
在这里,我给出了五个理由,说明为什么尽早开始构建您的数据科学职业生涯可能是对您未来的一项出色投资,并使您与同行相比处于非常有利的地位:
- 当你还是学生的时候,学习新东西会容易得多
做学生就是要学习。当你是一名学生时,学习是你的工作,所以学习新技术要容易得多,这是进入数据科学非常需要的。你周围有这么多每天都在学习的人,所以问问题并从与你互动的人那里获得动力是毫不费力的。你也可以接触到大学的许多资源。当你成为一名员工时,比如说在数据科学以外的其他领域,学习与数据科学相关的新技术会变得更加困难。你没有太多的时间去学习新的东西或者参与一些志愿性的工作,你的职业奉献精神必须是向着雇主的。你总是可以在晚上学习新的东西,但是当你在做与数据科学无关的白天工作时,在活动之间来回切换总会有一些开销。
2。当你还是学生的时候,实习就容易多了:
很多对职业有前瞻性的同学,现在还是学生的时候就在行业内做实习级别的工作。本科生和硕士生在一些公司做实习和论文项目是被广泛接受的。在北美的大学,有时会要求学生(甚至是博士生)进行暑期实习。这些实习对(a)获得真实世界的经验,(b)建立联系和获得推荐人,(c)通过在一些知名公司工作在你的简历上创造社交证明是很好的。最后一点特别重要。当你试图以实习生或实习生的身份进入一家全球性公司时,进入门槛是如此之低。所以,你可以利用这些机会,在你还年轻的时候开始建立自己的事业。
3。当你是一名学生的时候,更容易把时间输入:
当你是学生时,你习惯于每天工作 12+小时。那是你的生活方式;你白天去上课,晚上学习或做作业。当你在某个地方找到工作时,停下工作休息一下,为下一个工作日恢复精神,成为你晚上或周末生活方式的重要组成部分。在职业生涯中,你生活在积极倡导工作与生活平衡理念的人群中。此外,当你结婚并有了家庭,就更难投入时间,学习新技能,或做志愿工作或实习来帮助你成为一名数据科学家。当你是一名学生时,你可以自由地选修与数据科学相关的课程,并花更多的时间学习新技能,以便在毕业后尽快找到一份数据科学工作。
4。年轻时更容易牺牲较高的薪水:
进入数据科学的最佳和最简单的方法之一是通过以相当大的折扣在一些公司工作来做实习或兼职工作。如果你对求职略知一二,你就会知道大多数公司都想雇佣已经有经验的数据科学家;大多数求职者在初级阶段都会遇到的典型的先有鸡还是先有蛋的问题。最重要的是,如果你是一名国际学生,你可能会面临延长居留许可的工作和薪水要求。因此,你不得不去找一份没有专业经验、可能具有挑战性的全职工作。解决办法是,通过对你的薪资期望提供合理的折扣,试图说服一些公司(通常是初创公司)给你一份数据科学方面的实习或兼职工作。令人惊讶的是,你将增加你在职业生涯后期获得更高薪水的机会,因为你正在积累行业经验,这在申请全职工作时可能是有利的。当你成为数据科学以外的某个领域的员工时,这种策略可能会变得更难做到。请记住,你挣的钱越多,你就越依恋你正在从事的实际工作,所以,转变变得越来越难。
5。当你在学生时代早期就开始从事数据科学工作时,写你的职业故事会更容易:
当你开始职业生涯时,你有很大的自由来决定你想做什么工作。在学生时代,你应该尝试生活中不同的事情,并决定你的未来,所以如果你学习心理学,然后想转到数据科学,没有人会责怪你。然而,当你申请数据科学工作并在其他领域有一些经验时,就很难说服你未来的雇主为什么要改变你的职业生涯,因为这种情况是许多潜在雇主对你过去表现的担忧。虽然许多雇主仍然对转行持开放态度,但并不是每个人都是这样,这会降低你在竞争激烈的就业市场中的机会。例如,如果你一开始是金融专家,然后想转到数据科学,那么你就很难讲述一个令人信服的职业轨迹。当你以职业改变者的身份面试时,你需要有一个关于你职业生涯的完美故事,让雇主信服。因此,尽早开始计划向数据科学的过渡,可以消除你转行时必须经历的所有麻烦。
您的带回家的信息:
总而言之,在学习的同时额外努力学习数据科学技能或进行实习,会比多年后在全职工作的同时进行这些工作有更大的回报。请记住,获得数据科学工作从来都不是走捷径,而是努力工作,学习许多新技术,并通过实习/兼职工作获得现实世界的行业经验。实现伟大的事情,让你的职业梦想成为现实,需要“大规模的行动”。如果你真的想从事数据科学方面的职业,就在职业生涯的早期开始,很快你就会发现你所有的努力都会有回报。招聘人员会紧追不舍,你会比想象中更容易获得面试和工作机会。
我的最后一句话是给那些考虑转向数据科学的有经验的专业人士。在这篇文章中,我并不是说你不能从事数据科学职业。我刚刚提到,如果一个人在学生时代就对职业进行规划并付诸行动,那么塑造他的职业轨迹就容易得多。然而,如果你已经是一名对数据科学职业转变感兴趣的行业专业人士,你可以通过采取大量行动来实现你的目标。还是那句话,人生没有所谓的捷径;你必须做出牺牲,投入大量时间学习新技能,与潜在雇主建立关系网,向他们展示你完成工作的技能和能力,并获得你梦想中的工作。
更多文章来自作者:
</8-career-paths-for-junior-data-scientists-to-pursue-3e6041950e4e>
关于作者:
Pouyan R. Fard 是 Fard 咨询公司的首席执行官&首席数据科学家。Pouyan 在数据科学、人工智能和营销分析方面拥有多年的公司咨询经验,从初创公司到全球公司。他曾与医药、汽车、航空、运输、金融、保险、人力资源和销售&营销行业的财富 500 强公司合作。
Pouyan 还积极指导活跃在大数据行业的初创公司和求职者。他的热情是通过职业培训培养下一代数据科学家,并帮助他们找到数据科学领域的顶级工作机会。
Pouyan 已经完成了关于消费者决策预测建模的博士研究工作,并对开发机器学习和人工智能领域的最先进解决方案保持兴趣。
高效管理非结构化数据的最佳方式
使用对象存储和数据湖处理非结构化数据

杰西·奥里科在 Unsplash 上的照片
多达 90%的数据被定义为非结构化数据。非结构化数据每年以55–65的速度增长。
来源:福布斯
如果您已经在数据科学领域工作了一段时间,您一定已经注意到了非结构化数据的庞大数量。如果您不熟悉“非结构化数据”这个术语,请考虑数据样本结构不一致的数据,例如音频文件、文本文件、视频甚至图像。
当前和预期的大量非结构化数据意味着数据科学必须完全能够分析和处理各种数据,以获得有意义的见解。我们最常阅读使用表格数据或其他带有标签的数据的论文,但在现实世界中,有标记和有标签的数据很少存在。如果你想从事数据科学,你需要擅长分析非结构化数据。
在处理非结构化数据领域,一项越来越受欢迎且证明非常有用的最新技术是 对象存储 。它几乎解决了传统结构化存储系统面临的所有问题,包括:
- 可扩展性问题
- 相对于消耗的存储,数据检索速度保持不变
- 标准文件层次结构的局限性
什么是对象存储?它比传统的存储方式更好吗?
很大一部分现代科技公司正在转向数据驱动的方法,这意味着他们希望收集大量关于用户的数据,以便他们可以根据这些数据而不是直觉和猜测来做出决策。这带来了一些挑战,第一个主要挑战是可伸缩性。
像文件存储或块存储这样的标准存储系统在可扩展性方面非常糟糕。这样想,如果你有大量的文件,你可能有很多嵌套的文件。当用户发送请求以查看其中一个文件时,文件系统必须继续挖掘文件层次结构以找到该文件。文件越多,这个过程就变得越慢,直到它开始提供一个糟糕的用户体验,特别是对于像我这样标准的没有耐心的用户。
对象存储通过提供一个平面结构解决了这个问题,这意味着所有的数据都存储在同一层。您可能想知道这如何改进对象存储中的导航(特别是因为这是文件系统的主要优点)。
典型的对象存储器为每个数据样本存储 3 样东西:
- 数据本身
- 元数据:这可以是数据的大小、修改/上传的日期等。关于对象存储的最好的事情之一是,这是一个可定制的字段,这意味着您可以为每个数据样本存储任何您想要的元数据。对于标准文件系统来说,情况并非如此。
- 每个数据样本的唯一标识符。
现在,现代对象存储的快速导航和检索速度的诀窍在于利用唯一标识符。我认为这就像是索引的魔力。
可扩展性和检索
对象存储不依赖于文件结构,它只将数据样本存储为具有上述 3 个组件的节点,并使用 ID 来查找数据样本。这意味着数据样本不需要位于同一设备/物理位置。这是一个很大的优势,因为数据样本可以被分割到多个不同的位置。
例如,如果你有一组数据点,你知道只有某个国家才能访问,你可以把它们存储在离这个国家最近的服务器上。这在没有额外成本的情况下提供了更快的检索时间。
此外,因为元数据是可定制的,所以您可以轻松地使用它来设置有关数据的政策和法规,以避免法律冲突,因为有些国家可能不允许存在某些类型的数据,或者例如,如果您有受出口管制的产品。
随着大量数据和大型对象存储的出现,数据科学的潜力也随之而来

斯蒂芬·菲利普斯-Hostreviews.co.uk 在 Unsplash 上拍摄的照片
在构建高质量的 ML 生产管道时,许多人似乎都非常关注数据分析技术和机器学习模型。然而,很多人忽略了存储是管道中最重要的一个方面。这是因为管道有 3 个主要部分:收集数据、存储数据和消费数据。有效的存储方法不仅能提高存储能力,还有助于提高收集和消费效率。对象存储提供了使用可定制元数据进行搜索的便利性,有助于实现这两个目标。
您不仅要选择正确的存储技术,还要选择正确的提供商。AWS 被认为是最好的对象存储提供商之一,这主要是因为它的基础设施提供了流畅的服务和易于扩展。
此外,为了有效使用数据,必须有一个软件层运行在该存储之上,用于数据聚合和收集。这也是一个重要的选择,需要在另一篇专门讨论该主题的文章中讨论。本质上,您希望有一个数据版本控制(DVC)来对数据进行版本化和管理。因为虽然一般来说机器学习模型的数据越多越好,但有时模型会出现异常数据点。这意味着该模型在这一特定异常或一组异常上表现不佳,如果发生这种情况,我们希望能够快速回到上一个最佳版本并调查这些异常。这些异常往往是改进机器学习模型的关键。
除了版本控制软件,你可能还需要一个数据聚合框架,比如数据湖管理平台或者 Apache Spark 。这些层提供了重要的基本数据操作,从而大大减轻了机器学习模型对数据的消耗。我曾经认为添加这些层并不那么有效,但是从长远来看,将这些操作组分离到不同的层中可以为您节省大量调试模型的时间。这实际上是大多数高质量 web 应用程序/软件项目的主干。
最后的想法和收获
最后,您希望存储系统、版本控制平台和聚合平台之间的集成尽可能无缝。这是最重要的事情之一——并不是所有的选项都能很容易地相互兼容,不流畅的配置通常是一场噩梦。
我认为,每个数据科学家都应该开始考虑利用有效分析和存储非结构化数据的能力,因为它构成了当前数据的大部分,并且在未来会构成更多。
“偏差-方差权衡”实用解释(Python 语言)
入门
如果你曾经对偏差-方差权衡感到困惑,那是因为你总是阅读理论解释。这比看起来简单——借助于几行 Python 代码。

[作者图]
“偏差-方差权衡”是数据科学面试中最常见的话题之一。尽管如此,许多候选人仍难以深入理解这个概念。我猜这是因为这个话题总是从完全理论的角度来解释。
然而,我相信理解一件事情的最好方法是自己去做——或者,更好的方法是,自己编写代码。
你不是真的懂,直到你不会编码!
在本文中,借助一些数据,我们将看到偏差-方差权衡在实践中意味着什么,以及如何在 Python 中计算它(从头开始和使用开箱即用的实现)。
偏差-方差公式:从理论到实践
偏差-方差分解的通常定义是:

偏差-方差分解(θ是包含模型参数的向量)。[作者图]
其中 MSE 代表均方误差,θ代表模型的参数(例如,在线性回归中,θ是包含所有回归系数的向量)。
但是有一个问题:我们永远无法观测到θ 的真实值。此外,在一些模型中,不可能明确地找到θ是什么。所以这个定义从实用的角度来看是相当没用的。
但是,我们在现实生活中观察到的是地面真实,是目标变量在一些测试数据上的实现(通常称为 y )。因此,从我们的角度来看,用 y 代替θ更有意义,并获得以下等式:

偏差-方差分解(y 是目标变量)。[作者图]
其中:

图例[作者图]
这个公式更方便,因为在现实生活中,我们实际上知道所有这些量。
此外,使用这个版本的公式,我们能够对 MSE、方差和偏差给出更非正式的解释:

偏差-方差分解。MSE、方差和偏差分别测量的非正式定义。[作者图]
这种分解经常被用来解释模型的结果是如何基于它的“灵活性”而变化的。
- 灵活性低。所有估计的模型都趋于相似,因此方差很小。另一方面,“平均模型”不够强大,无法接近地面真相,因此偏差较大。
- 高灵活性。每个模型在很大程度上依赖于它被训练的特定观察,所以模型彼此非常不同,因此方差很大。然而,从长远来看,灵活性可以让你考虑到所有的小细节。因此,平均所有模型允许我们获得非常精确的“平均模型”,因此偏差很小。
这是权衡的本质:如果复杂度太低或太高,由于偏差或方差,我们将分别具有高的均方误差。关键是如何获得恰到好处的模型灵活性,以便同时最小化偏差和方差。
但是我们所说的“平均模型”是什么意思呢?
此时,您可能想知道获得不同的模型(和一个“平均模型”)意味着什么。
假设您选择一个算法(例如 Scikit-learn 的DecisionTreeRegressor)并如下设置其超参数:
**from** sklearn.tree **import** DecisionTreeRegressoralgo = DecisionTreeRegressor(min_samples_leaf = 10)
此时,您可以根据训练算法的特定训练数据集获得无限可能的模型。
假设您可以绘制许多不同的训练数据集,并为每个数据集训练不同的模型。然后,你可以取每个模型预测的平均值:这就是我们所说的“平均模型”。
**import** pandas **as** pd**# initialize dataframe for storing predictions on test data**preds_test = pd.DataFrame(index = y_test.index) **# for each model: draw training dataset, fit model on training dataset and make predictions on test data****for** i **in range**(1, n_models + 1):
X_train, y_train = draw_training_dataset()
model = algo.fit(X_train, y_train)
preds_test[f'Model {i}'] = model.predict(X_test) **# calculate "average model"'s predictions**mean_pred_test = preds_test.mean(axis = 1)
现在我们有了所有需要的量,我们终于可以计算均方误差、(平方)偏差和方差了。
**from** sklearn.metrics **import** mean_squared_errormse = preds_test.apply(**lambda** pred_test: mean_squared_error(y_test, pred_test)).mean()
bias_squared = mean_squared_error(y_test, mean_pred_test)
variance = preds_test.apply(**lambda** pred_test: mean_squared_error(mean_pred_test, pred_test)).mean()
这是我们刚刚遵循的流程的概念性草图:

获得 n 个不同模型的绘图过程。注 1:所有模型都用相同的算法和相同的超参数初始化。注 2:测试数据在不同的模型之间共享。[作者图]
让我们看看 3 个模型和 5 个测试观察的输出示例:

具有 5 个观察值和 3 个模型的测试集的偏差-方差计算示例。[作者图]
自举是你所需要的
但是有一个问题。
在上面的代码中,我们使用了一个虚构的函数draw_training_dataset()。然而,在现实生活中,我们实际上无法从无限的样本空间中提取训练数据集。事实上,我们通常只有一个训练数据集。怎么补?
诀窍是从我们的训练数据集中引导(即随机抽取替换)行。所以这个过程变成了:

从同一训练数据集中获得 n 个不同模型的引导程序。注 1:所有模型都用相同的算法和相同的超参数初始化。注 2:测试数据在不同的模型之间共享。[作者图]
现在我们准备把所有的东西包装在一起,编写一个 Python 函数来计算估计量的偏差和方差。我们所需要做的就是取上面的代码片段,用引导程序替换函数draw_training_dataset()。
这是一个解决方案:
**import** numpy **as** np
**import** pandas **as** pd
**from** sklearn.metrics **import** mean_squared_error**def** bias_variance_estimate(
estimator,
X_train,
y_train,
X_test,
y_test,
bootstrap_rounds = 100
): **# initialize dataframe for storing predictions on test data** preds_test = pd.DataFrame(index = y_test.index) **# for each round: draw bootstrap indices, train model on bootstrap data and make predictions on test data** **for** r **in range**(bootstrap_rounds):
boot = np.random.randint(len(y_train), size = len(y_train))
preds_test[f'Model {r}'] = estimator.fit(X_train.iloc[boot, :], y_train.iloc[boot]).predict(X_test) **# calculate "average model"'s predictions** mean_pred_test = preds_test.mean(axis = 1) **# compute and return: mse, squared bias and variance** mse = preds_test.apply(**lambda** pred_test: mean_squared_error(y_test, pred_test)).mean()
bias_squared = mean_squared_error(y_test, mean_pred_test)
variance = preds_test.apply(**lambda** pred_test: mean_squared_error(mean_pred_test, pred_test)).mean()
**return** mse, bias_squared, variance
在真实数据上
为了看到偏差-方差分解在起作用,让我们将它用于一些真实数据:来自 Kaggle 的房价数据集。数据集由 79 个预测值组成(如建筑类别、一般分区分类、与物业相连的街道的直线英尺数、以平方英尺为单位的地块大小等),目标是预测最终销售价格(以千美元为单位)。

房价数据集。[作者图]
让我们用一个预测算法,例如 Scikit-learn 的DecisionTreeRegressor,看看偏差和方差如何根据模型的灵活性而变化。
但是模型的灵活性意味着什么呢?答案取决于具体的算法及其超参数。
在DecisionTreeRegressor的情况下,我们可以拿min_samples_leaf来举例。这个超参数决定了可以在决策树的任何末端叶子中结束的样本的最小数量。因此:
- 当
min_samples_leaf为高时,意味着我们会有很少的顶生叶,每个顶生叶包含很多样本。因此,模型并不灵活,因为它被迫把许多不同的样本放在一起。 - 当
min_samples_leaf为低时,表示树很深。该模型非常灵活,因为它允许对任意几个样本进行不同的预测。
所以这个想法是对min_samples_leaf的不同选择做一个偏差和方差的估计。
我们可以使用之前创建的函数。或者,我们可以使用库mlx tend中的函数bias_variance_decomp(这里你可以找到一个写得很漂亮的文档)。
**import** pandas **as** pd
**from** mlxtend.evaluate **import** bias_variance_decompout = pd.DataFrame(columns = ['MSE', 'Bias^2', 'Variance'])**for** min_samples_leaf **in** list(range(1, 11)) + list(range(15, 105, 5)): model = DecisionTreeRegressor(min_samples_leaf = min_samples_leaf)
mse, bias, variance = bias_variance_decomp(
model,
X_train.to_numpy(), y_train.to_numpy(),
X_test.to_numpy(), y_test.to_numpy(),
loss = 'mse'
)
out.loc[min_samples_leaf, 'Bias^2'] = bias
out.loc[min_samples_leaf, 'Variance'] = variance
out.loc[min_samples_leaf, 'MSE'] = mse
这是结果:

min_samples_leaf 不同值的估计偏差和方差。[作者图]
这正是我们所预期的:当模型的灵活性增加时(即当min_samples_leaf减少时),偏差趋于减少,但方差趋于增加。这是权衡的本质。在这两个极端之间找到正确的平衡是任何数据科学家的使命。
感谢您的阅读!我希望本演练有助于您深入理解偏差-方差权衡。
我感谢反馈和建设性的批评。如果你想谈论这篇文章或其他相关话题,可以发短信到我的 Linkedin 联系人给我。
偏差-方差权衡
(几乎)没有统计数据的冒险

无论您是一名实践数据科学家还是一名初学数据的学生,您可能都熟悉偏差-方差权衡。这是模型类型选择中的一个基本因素,就在准确性和可解释性的权衡之上。但是,在直觉层面上,你有多了解它呢?如果你和我一样,你可能已经记住了关键点:
- 一个模型的可约误差等于它的方差加上它的偏差
- 有一个最佳的偏差-方差权衡,使总误差最小
- 和飞镖靶有关吗??
但是这种权衡在现实世界中有什么影响,了解这一点对您选择和训练模型有什么帮助?大多数解释都相当偏重于统计数据,尽管潜在的统计知识很重要,但我发现通过使用真实数据和可视化来获得实用的直觉要容易得多。记住这一点,这里有一个严肃的,简单的关于偏差-方差权衡如何影响模型选择的旅游,使用一个玩具问题。
问题是
你已经得到了一组 2D 的数据。假设是一组 n 唯一 (x,y) 点。你的任务是找到一个将输入点 x 映射到输出点 y 的函数。在理想情况下,您的数据集应该是这样的:

图 1:理想的数据集
但是我们并不是生活在一个完美的世界里。我们生活在数百万个可能不完美的世界中的一个,被预算削减和管理层破坏,他们不知道你需要数据来做数据科学。所以,这是你的数据集:

图 2:你的数据集。他们很友好,给了你 8 个数据点
与此同时,在一个平行宇宙中,DC 制作了成功的超级英雄电影,纳尔逊·曼德拉成为了南非总统,你的平行自我收到了这个数据集:

图 3:你的平行双胞胎的数据集。由于随机噪声,x 值相同,y 值不同。
两个数据集在 x 和 y 之间具有相同的关系:
y = x - 12x + 39x - 28 + ε
其中,ε是正态分布的随机变量(随机噪声),均值为 0,标准差为 15,与 x 无关。
尽管来自同一个分布,你的数据看起来和你的孪生兄弟有很大的不同。所以问题是,假设你和你的平行宇宙双胞胎使用完全相同的机器学习技术来拟合各自的数据集,你的拟合模型会有多大不同?让问题更接近现实,训练数据中的随机噪声如何影响你的模型的误差,以及这将如何影响你对模型复杂性的选择?
型号选择
作为第一步,您决定对数据进行多项式拟合。不确定是应该拟合斜线、二次曲线、三次曲线,还是只取所有点的平均 y 值,您决定用不同次数的多项式来拟合数据。这些是你的模型的预测:

图 4:多项式适合你的数据,范围从 0 到 4 次
你的双胞胎兄弟对他们的数据做了同样的事情:

图 5:多项式拟合你双胞胎的数据,范围从 0 到 4 次
这些模型彼此大相径庭。值得注意的是,模型的程度越高(因此其复杂性越高),两者之间的差异就越大。好奇。在下一次跨维度家庭团聚时,你、你的双胞胎和其他 48 个多宇宙兄弟姐妹决定将 2 次多项式拟合到你们各自的数据集,并比较你们的模型:

图 6:2 次多项式适合 50 个不同的 8 点数据集(每条蓝线是一个不同的模型),这 50 个模型的平均预测(红色),以及没有噪声的真实关系(黑色)。
有意思。看到这些结果,作为一群聪明的数据科学家,你决定对几个不同次数的多项式重复这个实验。
现在,在深入研究这些结果之前,我们需要简单谈谈偏差和方差。你知道——这篇文章的主题。请记住,我们谈论的是模型的偏差和方差,而不是数据。
模型的偏差是某一点的真实(无噪声)值与预期模型预测值之间的差值。如果一个模型在某一点上是无偏的,这意味着它应该高估和低估它。平均模型预测是预期模型预测的良好估计量;记住这一点,考虑图 6 中的点 x = 0;一般模型的值是 y=40,而真实值是-28;这意味着 x=0 时的估计偏差为 68。同样,考虑点 x = 5;平均模型和真实值都是-8,使得 2 次多项式在 x=5 时对于这种关系是无偏的。(注意:请记住,这是用数字完成的,您需要应用统计来确定这些点的实际偏差,比最接近的整数更精确)。
模型的方差是指拟合模型与期望模型的期望平方差(即 E[(E(f(x)-f(x))])。或者换句话说,对于图 6 中的任何给定点,它是所有蓝线相互展开程度的度量。在图 6 中,注意 50 个模型在 x=2 和 x=8 之间具有相当恒定的方差,但是在域的末端向外扩散。
模型的总可约误差是偏差+方差。为什么?没关系,这不是一篇统计文章。但是如果你必须知道,看看 Seema Singh 的这个伟大的解释。做完了再回来!
总之,回到手头的任务。我们想知道偏差、方差和误差与给定模型的复杂性有什么关系。让我们看看由那 50 对双胞胎生成的各种模型,并将它们与真实的关系进行比较。
1 度:最佳拟合线

图 7: [Top] 50 个不同的 1 次多项式模型,每个模型训练 8 个点(蓝色),这些模型预测的平均值作为预期模型的估计值(红色),以及真实关系(黑色)。[底部]x 域中每个点的偏差、方差和误差。不要担心,在 5
In figure 7, the 50 twins each fit a degree-one polynomial (i.e. a “line of best fit”) to their 8 points of training data. As you can see by how similar each of the models (blue lines) are, this low-complexity modelling technique has low variance. This is made obvious in the bottom panel of figure 7, where the variance (green) is relatively low across the entire domain. Contrast this with the bias in the bottom panel (red); other than at a few points (e.g. x=3, x=9) it’s fairly high, and makes up the bulk of the total error at most points in the domain. Taken as a whole, we can say that applying this type of model (degree-one polynomial) to the given data distribution yields a low-variance, high-bias model.
Degree 2: A Quadratic

Fig 8: The same as figure 7, but using degree-two polynomials.
If instead the twins were to use a degree-two polynomial (a quadratic), figure 8 would be the resulting bias, variance, and error. As you can see, the variance is 略高之间的曲线的截断部分没有什么特别令人兴奋的,而偏差和误差却大大降低了。虽然这仍然是一个高偏差、低方差的模型,但它肯定比一次多项式更适合。通过允许方差的轻微增加,我们大幅减少了偏差(并因此减少了总误差);这是一个很好的权衡!
三度:一立方

图 9:与图 7 相同,但是使用三次多项式。
哇,那里发生了什么?在整个域中 bias = 0…是这样吗?其实就是!我不会进入数学,但因为真实的关系是一个三次多项式,三次多项式是真实关系的一个无偏估计量。注意平均模型(顶部面板,红色)如何几乎完美地与真实关系重叠;这反映在底部面板中,其中方差与误差完全重叠。这是因为,在没有任何偏差的情况下,方差是模型中唯一的误差源。
从一级到二级再到三级,我们看到误差稳步下降。一个四级模型肯定会有更少的误差,对吗?
5 度:四次

图 10:与图 7 相同,但是使用了四次多项式。
嗯。偏差的平方仍然为零,但是平均方差已经从 90 增加到 117。让我们看看更高的学位。
以及其他

图 11:与图 7 相同,但是使用五次多项式。

图 12:与图 7 相同,但是使用六次多项式。

图 13:与图 7 相同,但是使用七次多项式。
该死的。我想我们不能只是不断增加模型的复杂性,并期望得到更好的结果。你可以看到为什么一些模型(蓝线)是如此的不稳定。事实上,这正是“过度拟合”的含义:当模型被调整到训练数据的噪声时,增加了它的方差,因此降低了它对看不见的数据进行概括的能力。因此,即使增加模型的复杂性没有增加偏差,但它增加了方差,损害了模型的整体性能。
把所有的放在一起

图 14:熟悉的偏差与方差曲线,使用上述多项式模型的结果制作。
如图 14 所示,使用三次多项式时会出现偏差方差最佳点。如果您要使用一个不太复杂的模型,您将会使您的模型不适合,并且将潜在的性能提升留在桌面上;如果你使用一个更复杂的模型,你会给你的预测增加不必要的误差。对于这个问题,三次多项式是最佳选择。
需要注意的是的目标不应该是达到零偏差;这只是因为真实的关系是一个简单的多项式,我们使用不同次数的多项式来做我们的预测。事实上,偏差为零通常意味着你过度拟合了你的数据!为了说明这一点,如果我们有一个更复杂的非多项式关系,我们的结果看起来会有点不同。相反,考虑从正弦关系中提取的数据:

图 15:具有 20 个点的非多项式(正弦)数据集。

图 16:与图 7 相同,但是是正弦数据集和 gif 格式

图 17:应用于正弦数据集的不同程度的多项式模型的偏差、方差和误差
正如您所看到的,这种关系的最佳点似乎是 degree=7,它通过在偏差和方差之间找到一个良好的平衡来最小化误差。与前面的关系不同,偏差实际上从未达到零;随着多项式次数的增加,它会继续减少,但方差增加得太快,以至于边际收益不值得:在机器学习中,允许一点额外的偏差通常会大幅降低总预测误差。
结束语
很长一段时间以来,我“知道”偏差方差权衡,但直到我实际投入到用模拟数据训练模型的工作中,我才真正在直觉层面上理解了。我希望在写这篇文章的时候,我已经帮助你对它是如何工作的有了一个坚实的直觉。尽管这是一个微不足道的例子——多项式和正弦曲线使用多项式回归拟合——但同样的原理适用于拟合任何模型(随机森林、神经网络等)。)在任何维度的数据空间(DNA 微阵列、图像等)。).我在这里提供了代码,如果你想自己玩的话。
感谢阅读!
作者创作的所有未标注的图片。
建模的偏差-方差权衡
通过实例通过统计学习模型直观理解过拟合和欠拟合。

思想实验
让我们假设我们正试图预测一些现象 Y 。设 X 是宇宙中除了 Y 之外所有可以用来解释 Y 的变量。然后有一些函数 g ( X )在预测 Y 时做得最好。最后,让我们假设 Y ,作为一个随机事件,永远不可能被完美预测。这意味着在预测中总会有一些误差ŷ。所有这些可以总结如下:
Y=g(X)+δ。
g ( X )称为真结构。它是使用 X 中每个解释变量的 Y 的最佳可能预测值。
δ 称为不可约误差。即使有了解释变量在 X 中的最佳组合,预测ŷ也永远不会准确。
实际上,最好的情况是我们的模型与真实的结构有些相似。为什么?与理论概念的 X 相比,我们能够获得的解释变量要少得多。这导致了更熟悉的术语随机误差:
ε=[g(X)—f(X’)+δ。
这里,f(X’)是我们用X’构造的预测函数或模型,它是我们可以访问的数据集和解释变量。第一项[g(X)—f(X’]称为偏差,这是我们模型中的误差。我们知道第二项 δ 是不可约误差,或者是 Y 中真正无法解释的可变性。我们寻求最小化的随机误差 ε 由这两项之和组成。无论 f 的拟合度有多好, ε 最多能还原到 δ 。
偏差-方差权衡
方程ε=[g(X)—f(X【T39’)+δ或误差=偏差+方差代表某型号 f 的偏差方差权衡。保持误差不变,减少偏差意味着模型方差增加。同样,减少模型方差意味着偏差必然增加。为了可视化这种关系,我设置了两个简单的模型来拟合真实的结构 g ( X ),在这种情况下,它是一个 4 次多项式。****

深蓝色线为 g ( X )。通过使用由浅蓝色线描绘的数据 X 的随机子集拟合线性(左)和多项式(右)回归,模拟运行 75 次。线性模型不能很好地拟合 g ( X ),并且显示出比多项式拟合更大的偏差。然而,线性拟合具有较小的模型方差。不管选择什么 X ,贴合都是一致的。这对于多项式拟合是不正确的。虽然有些几乎完全符合 g ( X ),但许多并不符合,从而产生较大的误差并增加模型方差。事实上,众所周知,多项式会过度拟合,并且对于超出 X 界限的预测不能很好地推广。这是因为这种模型固有的偏差-方差权衡。
总的来说,偏差-方差权衡的动态可以总结如下:
柔性模型**:高偏差和低偏差。**
不灵活模型:**低偏差高方差。**
虽然一个灵活的模型可以更好地概括,但它也可能会欠适应和追逐它的错误。虽然不灵活的模型可能对某些样本 X 给出很好的预测,但你也有过度拟合和得到较差预测的风险。
到目前为止,我们已经看到,我们可以权衡偏差的方差,反之亦然。对此的一个自然延伸是,我们可以使用某种标准优化模型中偏差与方差的比率,例如 RSS(如果是回归问题),以获得最佳预测性能。这个过程被称为模型调整。通过使用 k-folds 或 bootstrapping 在验证集上改变不同的模型参数,我们实际上是在为给定的数据集寻找最优的偏差-方差权衡。
然而,你可能想知道,有什么方法可以减少偏差和方差吗?一般来说,答案是是的,但是你能得到更好的偏差和方差的程度取决于你所拥有的数据和你所使用的模型。
假设您有一个小数据集,其大小为 n =20。那么通过增加 n 的大小可以显著降低偏差和方差,假设增加的样本提供了新的信息(给定如此小的样本大小,它们可能会提供新的信息)。但是,如果你已经有大量的数据 X 接近 X ,偏差和方差只会减少很小的数量。
在讨论第二点时,重要的是要注意到并非所有的模型都是平等的。不同的模型在减少偏差和方差方面有不同的潜力。以前面的多项式回归为例。虽然它有利于生成已知数据的平滑线,但使用未知数据时,它往往会做出较差的预测。也许有一个用例或数据集,其中多项式回归确实做出了很好的预测,但这是非常罕见的。与此同时,像 XGBoost 这样的流行模型在一系列问题和数据集上都取得了持续的成功。例如,忽略边缘情况,我们可以通过将模型从多项式回归移到 XGBoost 来减少偏差和方差。
总的来说,我认为总结所有这些信息的一个好方法是通过图表。请注意,这个图是虚构的,我只是手动添加了曲线,它们不是基于实际数据绘制的。重点是让直觉变得清晰。

每条曲线或边界代表给定大小为 n 的数据集的单一模型。X 轴表示标准 MSE,它应该最小化。Y 轴代表偏差与方差的比率。通过调整给定模型的参数,我们可以沿着一个边界前进。请注意,边界有不同的形状,这意味着在给定的偏差和方差水平下,每个模型都可能表现得更好或更差。假设 n 足够大,对于给定的模型,降低 MSE 的唯一方法是通过调整参数来改变偏差-方差比。这具有沿着曲线移动的效果。比如 XGBoost 有参数λ(学习率)。假设λ在 0.001(橙色圆圈)。通过将λ增加到 0.01,偏差减小,方差增加,我们沿着曲线向下移动到最佳 MSE(红色 X )。如果 n 足够小,我们可以通过增加 n 来将前沿转移到更小的 MSE。然而,随着 n 变大,MSE 的减少变小,有一个极限向 n 逼近。最后,通过查看 SVM 和兰登森林,您可以看到,一个调优不佳的优秀模型有可能表现不如一个调优良好的低劣模型。
分类呢?
到目前为止,偏差-方差权衡的理论概念已被应用于回归分析并通过回归分析来理解。对于分类问题来说,偏差-方差权衡仍然存在,这是有道理的,我们只需要以稍微不同的方式重新定义它。
在点 X = x ₀ ,处,在目标 Y 的 k 个可能类别中存在离散分布。
****p₁= p(y = 1 | x =x₀)
****p₂= p(y = 2 | x =x₀)
…
ₖ= p(y =k| x =x₀)
真类是在 X = x ₀.时具有最高概率的任何类接下来,让我们介绍一个叫做最优贝叶斯分类器的理论概念。它被定义为一个概率模型,在给定某个 X 的情况下,做出最可能的预测。如果我们给这个模型 X (宇宙中除 Y 以外的所有其他变量),那么最优贝叶斯分类器实际上就是我们之前描述过的真结构 g ( X )。不可约误差 δ 由某类 k 表示,该类不是最可能被观察到的类。**
将概念应用于不同的模型
为了巩固偏差-方差权衡的概念,尝试将直觉应用于各种不同的模型是有意义的。经历这一过程会让你更好地理解模型参数,并允许你在需要时解释它的影响。通过将偏差-方差权衡作为一个框架来考虑,您可以更好地理解在不同的情况下您何时对数据过度拟合和欠拟合。
样条和基函数

三次样条是一种基函数,其中每个函数都是三次多项式。x 被分成 K-1 个区域,并且三次多项式被拟合到该区域中的观测值。通过设置模型约束,每个功能在节点处连接,使每个功能块平滑地装配在一起。需要调整的主要参数是节数。注意,自由度 df 与节数 k 有直接关系,k 节意味着模型有 k+3 df。
让我们看看上面的情节。标绘为红色的函数使用三次样条,其 df =5(型号 A),标绘为绿色的函数使用三次样条,其 df =20(型号 B)。因为 k 相对较小,所以模型 A 具有更大的偏差和更小的方差。因为 k 相对较大,所以模型 B 的偏差较小,方差较大。它是更复杂的型号。
哪个型号更合适?如果你简单地按照最小化 MSE 这样的标准,那么答案就是模型 b。但是只要看看这个图,我们就知道这是错误的。除了不平滑(这是该图的全部目的)之外,它似乎没有捕捉到数据的总体趋势。该函数与最后两点几乎完全相交。如果我们通过在 X=110 附近随机添加一些新的观察值来进行一点推断,该图不太可能符合该数据。所以模型 B 过度拟合了数据,而模型 A 在平衡偏差-方差权衡方面做得更好。**
里脊回归
岭回归是对最小二乘回归(LSR)的一种改进。当f(X)=g(X)时,LSR无偏。虽然情况并非如此,但 LSR 可能存在非最优量的偏差和方差,当存在多重共线性(一些解释变量是相关的)时,这种情况会被放大。岭回归试图通过对模型的系数应用惩罚来减少方差(并增加偏差)。岭回归模型(也称为收缩最小二乘法)通过最小化以下各项来定义:

最后一项是罚值,其影响由调谐参数λ控制。这个术语也被称为 L2 正则化。可以通过使λ变小来减少过拟合。此增加偏差减少偏差。可以通过增大λ来减少欠拟合。此增加方差减少偏差。岭回归模型的要点是减少过拟合,因此通常λ < 1,导致系数落在零和最小二乘估计值之间。
k-最近邻
KNN 是一个简单的分类模型,其工作原理如下:
- 选择参数 k 作为邻域的大小。因此,任何邻域都由 k 个点组成,这些点用于根据它们的标签对一个类别进行投票。
- 预测存在于 X 的 p 维空间中的一个点 x ₀。
- 通过计算欧几里德距离来识别离 x ₀最近的 k 个点(其邻域)。称这个街区为₀.
- 对于₀的每一分,数一数他们的阶级。
- 然后ŷ(x₀)(我们对 x ₀的预测)是计数最高的班级。****
下图显示了二维空间中两个类别(红色和绿色)的一些数据( p =2)。调谐参数 k 已被设置为 15。

如果 x ₀落在绿色空间,那么它的预测类是绿色的。如果 x ₀落在红色空间,那么它的预测类是红色的。随着 k =15,边界(或邻域)似乎是合理的。是的,有些点在错误的空间,但如果我们必须用手画边界,我们可能会画出类似的东西。让我们通过设置 k =3 来减少 k 来尝试做得更好。

现在街区变小了,更多的岛屿出现了。好的一面是右边的大岛看起来很合理。不好的是小岛似乎太具体了。通过减少到 k = 3,这个模型看起来有点太复杂了。通过将 k 增加到 k =5,我们可能会消除小岛屿,保留大岛屿,从而得到我们正在寻找的适合度。
那么从调 k 我们能得出什么结论呢?小 k 会减少偏差,增加方差。偏差减小是因为我们可以看到 ε 从 k =15 减小。然而,差异更大,因为我们可以看到,不同的样本,地图看起来完全不同。可能是 k =3 模型太复杂(过拟合),而 k =15 模型太一般(欠拟合)。因此,通过可视化模型,我们可以看到我们的最佳 k 落在这个范围内。
回归树
决策树是许多流行的回归和分类模型的基础,这些模型使用树的集合(例如打包和提升)。为了方便起见,我将使用回归树来解释这个模型中存在的偏差-方差权衡的一个方面。以下是递归计算的回归树算法的简单说明😗***
- 对于一个给定的区域 X ,我们想把它分成两个区域 R ₁和 R ₂.
- 为了找到最佳分区,迭代通过在 X 中 xᵢ和 xᵢ ₊₁之间的每个分割,并通过拟合水平回归线来计算 RSS。
- 最低的 RSS 分裂定义了新区域 R ₁和 R ₂.这在回归树中定义了一个新节点。
- 通过传入新区域 R ₁和 R ₂作为输入 X. 来递归调用这个函数
- 如果已经达到最大深度 d 或者该区域的观测值少于 n ,则可能触发基本情况(停止条件)。
这里, n 和 d 是可以被调整以优化偏差-方差权衡的参数。一旦使用上述算法构建了树,它看起来就像这样:

这棵树建立在至少两个解释变量上,那就是密度 ( X ₁) 和 pH ( X ₂).为了获得某个 x ₁和 x ₂的预测,您可以从根节点到最终到达的叶节点遵循布尔逻辑。以参数 d 为例。d 越大,出现的分裂就越多,模型也变得越复杂。这么大的 d 导致偏倚减小,方差增大。同样,小的 d 会导致偏差增加,方差减少。当我们实际构建回归树(使用不同的数据)时,让我们也将它可视化。**

蓝色垂直线代表分离,而绿色水平线是用于计算平均 RSS 的回归。请注意,这些不是最好的分割,因为我是手动选择它们的,但我试图找到一些合理的东西。我做了两次拆分,所以 d =2。考虑到我们仅有的少量数据,这似乎是合理的。让我们尝试添加更多的分裂。

通过增加 d ,我们可以进一步将偏置和 RSS 降低至 200。事实上,我们可以继续这个拆分过程,直到 RSS 为零,并且我们有 n-1 个拆分。这就是单棵树的问题所在:它们几乎是无偏的,但变化很大。与 KNN 的例子不同,尚不清楚哪棵树会成为更好的预测器,但很明显,增加 d 会减少偏差并增加方差。****
事实是,一棵树本身并不能成为一个好的预测者。这就是为什么系综是一种如此强大的技术,系综是用装袋或助推来组合许多树木的过程。每一种都利用了决策树所描述的偏差-方差特性。例如,随机森林使用一种装袋技术,其中许多深度不相关的树被平均。这对于相同的偏差产生了较低的方差的影响。使用像 XGBoost 这样的增强模型,许多弱学习器(浅树)的序列是基于先前的树残差构建的。这具有为相同的方差产生较低的偏差*的效果。*****
主要要点
虽然许多不同类型的监督机器学习模型尚未涵盖,但连接它们的一个常数是偏差-方差权衡。事实上,我发现理解每个模型的权衡是理解一个模型的机制的一个很好的起点,而不需要太深入数学。最后,让我们考虑一个更实际的用例。
假设您正在使用交叉验证(CV)和网格搜索来调整训练集上的模型。如果运行 5 重 CV(不重复)并使用 6 个值调整 5 个参数,则模型必须符合 5⁶ * 5 = 78125 次。即使你只需要几秒钟就能模拟火车,对于这么小的网格来说,这仍然是一个很大的计算时间。现在,如果您对模型进行初步拟合,并发现它明显过度拟合或欠拟合数据,您可以删除会明显增加该问题的网格值。
更大的图片:SparkSQL 如何与 Spark 核心(RDD API)相关
行业笔记
人们常说 Spark 的高级 API SparkSQL“构建在”Spark 核心之上。然而,这并不是不言自明的。我潜水了。
Apache Spark 的高级 API SparkSQL 提供了一个简洁且极具表现力的 API 来对分布式数据执行结构化查询。尽管它构建在 Spark core API 之上,但人们通常并不清楚这两者之间的关系。在这篇文章中,我将试着描绘出更大的图景,并说明这些事情是如何相互关联的。
Spark 核心所基于的最基本的概念是 MapReduce。MapReduce 是声明性和过程性方法的混合。一方面,它要求用户指定两个功能—即 map 和 reduce —在分布式数据上同时执行。这是声明部分——我们只告诉 MR 做什么,而不是如何完成的每一步。另一方面,这两项职能中的逻辑是程序性的。这意味着我们编写的代码会对每一部分数据逐步执行。逻辑本身——函数的语义——对框架来说是不透明的。它唯一知道的是这些函数的输入和输出类型。因此,自动优化仅在 map 和 reduce 函数级别上是可能的。
正如我在 2018 年欧洲 Spark & AI 峰会上所阐述的那样,Spark core 基本上在 MapReduce 范式的基础上增加了一个新的抽象层。它与指定更高级的转换没有什么不同,这些转换被转换成 map 和 reduce 函数的优化链。然而,优化只能发生在 map/reduce 函数级别。因此,Spark core 的优化策略仅限于将狭窄的转换分成几个阶段(观看此以深入了解 Spark core)。
相反,SparkSQL 提供了一种在分布式数据上指定完全声明性查询的方法。然而,为了做到这一点,数据的结构需要通过提供显式模式(即结构化数据)而为框架所知。然后,API 允许用户指定对数据的查询,提供许多预定义的操作符(非常类似于 SQL)。因此,结构化查询是运算符的组合,也称为表达式。API 提供了两种指定用户查询的方法:使用 Dataset-API 中定义的函数,或者直接编写 SQL 查询。这两种方法都简单地提供了一种方式来告诉 Spark 如何使用预定义的操作符从输入数据集派生出结果数据集。然而,在某些情况下,如果 Spark 中不存在合适的操作符,我们会发现自己被迫编写所谓的用户定义函数。这些函数只是对每个记录执行过程代码的一种方式。
用户为产生所需结果而指定的查询(或表达式)构建了一个抽象语法树(AST)。该树由表达式和运算符组成,这些运算符本身接受表达式。与 Spark core 不同的是,在 Spark core 中,我们组装了一系列正在执行的不透明函数,现在我们有了一系列用于产生最终结果的逻辑操作数。因为我们可以区分这些操作符,所以我们现在可以在这些操作的级别上应用优化规则。称为 catalyst 的 Spark 优化器指定了许多优化这类树的通用规则。

作者图片
第一步,通过使用内部维护的目录解析列名和表名,将一个 AST 转换成另一个 AST。然后,通过递归地应用优化规则直到达到固定点,将解析的逻辑计划转换成优化的逻辑计划。许多优化规则由 catalyst 实现。然而,catalyst 被设计成可以通过自定义规则轻松扩展。注意,当我们使用框架提供的逻辑操作符以声明的方式指定我们的查询时,操作符级别的优化变得内在可行。我们还可以为 SparkSQL 提供的所有功能编写用户定义的函数。然而,如果我们使用 Spark core,我们最终会得到完全相同程度的优化:也就是说,在级水平上的优化,因为级内部对催化剂是不透明的。
现在,有趣的问题是:我们如何在代表我们的查询的 AST 和 Spark 核心之间架起一座桥梁,SparkSQL 就是建立在 Spark 核心之上的?查询执行过程中还有另一个主要步骤:物理规划。这一步通过用物理运算符替换逻辑运算符,将逻辑计划转换为物理计划。它通过应用两组优化来做到这一点:基于规则和基于成本。
与逻辑优化类似,基于规则的优化应用一组规则将子树转换成逻辑上等价的子树。即使结果保持不变,规则也会影响产生结果的方式(例如流水线、谓词下推)。这一步类似于 Spark 核心中将逻辑计划转换成物理计划的转换步骤,它将狭窄的依赖关系汇集成阶段。相反,基于成本的优化取代了具有各种执行策略的操作符,比如连接。每种执行策略可能对性能有不同的影响。成本模型用于假设最有效的策略。
最后,优化后的 AST 的每个表达式都被转换成 scala 代码的 AST,用于计算表达式。在运行时,这些代码被编译成 Java 字节码,这些字节码将被发送给执行器。流水线操作符并把它们编译成一个函数,减少了每次需要计算 AST 表达式时必须解析它的开销,并减少了虚函数调用。解析和编译将这些步骤重构为一个只有一次的任务。生成的函数基本上实现了一个迭代器,它将表达式应用于分区的每个条目。
在为流水线表达式生成代码之后,我们建立一个 RDDs 的逻辑计划。我们最终为每个生成的代码函数提供一个 RDD,为物理规划选择的每个连接提供一个 RDD。Spark core 将这个逻辑计划转换成由阶段和任务组成的物理执行计划。物理计划可以由集群简单地通过将任务调度给执行者来执行。
我们已经看到,使用 SparkSQL 这样的高级 API 的好处源于我们使用 Spark 提供的操作符编写声明性查询。Spark 理解查询的语义,并且可以通过用更有效的模式替换查询中的模式,在操作符级别进行优化。因此,如果我们编写用户定义的函数来表达我们的逻辑,我们禁止 catalyst 从逻辑上优化我们的查询,因为函数中编写的代码对优化器来说是不透明的。优化的查询在物理规划期间(通过流水线)被转换成 map/reduce(Spark 术语中的 map/shuffle)步骤的物理规划,这与 Spark 核心执行模型直接相关。每个阶段执行的函数在运行时被编译成 Java 字节码并发送给执行器。这减少了为每个记录再次解析表达式树的开销。
我在学习数据科学时犯的最大错误
我花了很长时间才意识到。

我想从陈述一个基本事实开始,以防你现在还没有意识到:数据科学是一个极其广阔的领域。
数据科学可以应用于我们可以收集数据的任何业务或行业。此外,数据相关技术的进步使得收集、处理、存储和传输数据变得前所未有的容易。因此,可以有把握地说,数据科学应用在未来将覆盖更广泛的范围。
尽管数据科学无处不在,但它在不同领域的应用差异很大。了解所有数据科学应用将是一场艰苦的战斗。我现在认为这是一场不可能获胜的战斗。
将这场战斗变成一个可实现的目标取决于你。你应该把自己的目标定为成为专家,而不是多面手。作为一名数据科学家,这就是你产生巨大影响的方式。
做一个什么都懂却什么都不懂的人只会让你达到某一点。你在那一点上所能取得的成就不会给潜在的雇主留下深刻印象。你应该努力成为至少一个领域的大师来脱颖而出。
我花了大约两年时间找到了第一份数据科学家的工作。在这两年的奉献和努力工作中,我犯了一些错误,这些错误与我在前面几段中试图解释的相矛盾。
我最大的错误是试图学习广泛的数据科学应用。我对数据科学的热情让我有点贪婪。相反,我应该选择一个特定的领域,并努力彻底地学习它。
多学点没有错。然而,我未能专攻某一特定领域。例如,我了解了 NLP,但不足以吸引潜在雇主。
学习了卷积神经网络,做了一个图像分类项目。然而,我没有继续提高我在这个领域的技能,因为我不得不(?)还要了解其他领域。
对于所有领域,学习路径大多从同一点开始。核心原则是一样的。你需要对统计学概念有一个全面的理解。要把你的想法变成行动,需要一定水平的编程技巧。
一旦你完成了基础,选择一个专业领域。你不必在你选择的第一个区域工作。你随时可以改变它。事实上,在获得特定领域的深入知识的同时,您也提高了自己的数据科学技能和总体知识。
假设你想在金融领域做一名数据科学家。然后,时间序列分析应该是你的专业领域。您需要能够清理、处理和分析时间序列数据,并从中提取洞察力。
工具怎么样?
就软件工具和软件包而言,万事通也是一个严重的问题。多亏了数据科学社区,我们有了丰富的工具来简化和加快我们的工作。
拥有这么多工具的好处如果使用不当可能会变成麻烦。执行一项任务几乎总是有一个以上的选项。
考虑一个非常简单的清理和分析表格数据的例子。我想到的前两个选项是 Python 的 Pandas 和 r 的 datatable。SQL 也是另一个强有力的候选,尤其是当数据存储在关系数据库中时。
同样,有许多候选人可以帮助您完成数据可视化任务。Matplotlib、Seaborn 和 Altair 只是 Python 中的三个选项。
在大多数情况下,一个就足够完成工作了。你不会因为使用 Seaborn 而不是 Matplotlib 而处于劣势,反之亦然。
我确实学习不同的工具,因为我喜欢学习,并且我创建了涵盖广泛工具的内容。但是,我通常会选择一种工具来执行工作任务。
这里最困难的决定是选择一个数据科学的子领域进行专门化。不幸的是,没有一套严格的规则来帮助你做这个决定。这取决于许多参数,如你的背景、兴趣和工作机会。
无论你选择哪个领域,这都比了解所有领域要好。后者你很有可能失败。我所说的失败并不是指你不能学到任何东西。然而,你无法用你的一般知识或技能给招聘人员留下深刻印象。
感谢您的阅读。如果您有任何反馈,请告诉我。
开始数据科学职业生涯的最大障碍
意见
是什么让迈出第一步变得困难

卡斯帕·艾伦巴赫在 Unsplash 上的照片
近年来,数据科学经历了辉煌的发展和普及。企业比以往任何时候都更加意识到数据的潜在价值。他们通过资源和劳动力投资数据科学,期望在商业价值方面获得回报。
数据科学的普及推动了一大批人决定转行,从事数据科学家的工作。但是,迈出进入领域的第一步,绝对不容易。
在这篇文章中,我将详细阐述我认为是什么让你很难找到作为数据科学家的第一份工作。请注意,这是我基于两年仔细观察得出的看法。非常欢迎您的意见、反馈或批评。
数据科学可以应用于我们可以收集或获得原始数据的任何过程。对数据科学家的期望是从原始数据中创造价值。价值的形式可以是改进流程、预测异常行为、需求预测、语言之间的转换等等。
最终目的是一样的:用数据创造价值。然而,应用于原始数据的技术可能会因过程或领域的不同而有很大差异。工具和框架也因给定的任务而异。
例如,一家金融科技公司可能会处理时间序列数据。因此,他们想要一个专门从事时间序列分析的数据科学家。如果你要为一家银行的客户服务部创建一个聊天机器人,你必须具备高级自然语言处理(NLP)技能。
除了一般的数据科学知识之外,还有许多领域需要某种特定的技能。这就是有抱负的数据科学家错过火车的地方。
问题是缺乏特定领域的专业知识。
我们试图在广泛的主题上尽可能多的学习。因此,我们获得了时间序列分析,自然语言处理,异常检测,机器学习算法,数据可视化和其他一些领域的一般知识。然而,我们没有成为其中任何一个领域的专家。
如果你想要全部,你很可能什么也得不到。
数据科学是一个具有广泛应用的跨学科领域。甚至连数据科学的基础都很难理解。最重要的是,如果我们试图了解数据科学生态系统中的每一个专业,我们很可能最终成为一个普通的候选人。因此,我们需要选择一个领域来掌握,以胜过其他候选人。
不仅仅是理论知识。对于不同的子领域,工具和框架也有很大的不同。尽管可用的工具使数据科学家的工作变得更容易,但学习如何使用它们需要时间和实践。

大卫·库波夫斯基在 Unsplash 上拍摄的照片
例如,如果你计划做自然语言处理(NLP),你应该对拥抱脸感到舒服。对于专注于图像识别或分类的职位来说,最重要的技能是深度学习算法和框架。
如果你的大部分工作是交付结果或创建仪表板,你应该在 BI 工具上有相当的专业知识,比如 Tableau 或 Power BI。这样的例子不胜枚举。关键是你不可能成为所有这些工具和主题的专家。然而,你找到工作的机会随着专业水平的提高而大大增加。
我认为最佳的方法是决定一个子领域或特定领域来专注。在对数据科学和基本工具有了大致的了解之后,人们应该专注于某个特定的领域。这就是你如何成为一名专家,并增加你在数据科学生态系统中获得工作的机会。
子领域的区别越来越明显。例如,我遇到过许多精选的职位,如 NLP 工程师和机器学习工程师。如果不是职位名称,描述几乎总是指出想要的专业。
我知道很难决定专注于一个特定的领域。此外,你可能不想因为只关注一个领域而减少你可以申请的职位数量。然而,你会通过展示专家水平的知识而脱颖而出。我认为这比成为所有职位的普通候选人要好得多。
结论
我认为获得数据科学家这份工作的最大障碍是过于笼统。试图学习所有领域的基础知识不会让你成为一个优秀的候选人。
相反,把你的注意力集中在一两个主题上。这将减少需要学习的工具和框架的数量。学习如何有效地使用这些工具需要大量的练习。
感谢您的阅读。如果您有任何反馈,请告诉我。
二元多维背包问题(MKP)
概述、基准和代码
有许多文章将背包问题作为整数规划问题和解释动态规划的简单例子来讨论。但是多维背包问题的内容还不够多。在这篇文章中,我将讨论多维背包问题“MKP”,指出我们可以在哪里找到基准实例,提供我使用的代码文件来读取这些实例(用 Python),然后继续讨论如何在 Python 上建模 MKP 实例,并用 IBM CPLEX 解决它。本文旨在为感兴趣的优化爱好者和年轻的从业者提供一个关于 MKP 的简单介绍和一个关于如何编码的简单教程。

多维背包问题‘MKP’
MKP 是标准二进制背包选择问题的 NP-hard 扩展。目标是一样的;然而,为了找到使总利润/收益最大化的物品子集(目标函数),不同之处在于,不是具有单个背包或资源,而是具有多个背包/资源(每个都是单独的约束),并且物品子集不应该违反这些背包中的任何一个的容量。对各种版本的背包问题感兴趣的热心读者可以参考 Kellerer、Pferschy 和 Pisinger 的书 背包问题 了解更多细节。这里我们将只把我们的范围限制在二进制 MKP。
MKP 的数学公式是:
(MKP)最大化𝒛 = ∑ 𝒄.𝒙
主题:
A.𝒙 ≤ 𝒃,∀ i = 1,…,n
𝒙∈{𝟎,𝟏},∀𝒋=𝟏,…,𝒎
其中 c 为每项利润向量, b 为右侧向量或每个背包的容量, x 为表示某项是否被选中的二元变量向量, A 为约束的系数矩阵。变量的数量是 m 而约束的数量是 n 。
基准实例
文献中广泛使用的基准实例可以在在线或图书馆找到,其中有关于每个基准集的格式和内容的完整解释。这些实例要么是从文献中收集的测试问题,要么是在楚&Beasley(1998)【1】中解决的测试实例。基准测试集在变量(列)和约束(行)的数量上有所不同,最难的基准测试集包含 30 个实例,每个实例包含 500 列和 30 行(在本文中,列和变量可以互换使用,行和约束也是如此)。
读取基准集(代码和测试文件)
在线或-Library 中的基准集是文本文件,包含:
- 每组中测试实例的数量,
- 每个实例的大小(即列数和行数),
- 目标函数系数(利润)、
- 约束系数(来自每个背包/资源的每个变量的资源消耗)以及,
- 右手边(每个背包的容量)。
为了简化,我们将考虑一个只包含一个实例的数据的文本文件。 在这个 GitHub 存储库 中,您可以找到文本文件,每个文件都包含与单个实例相关的数据,此外还有一个函数,它读取文本文件,填充实例并准备数学模型(c、A 和 b)中使用的输入。
为 MKP 实例建模
有多种线性规划开源或商业解算器可用于建模优化问题。这篇信息丰富的帖子是学习如何使用一些解算器的一个很好的开始。
我将使用 IBM CPLEX,因为我有更多使用它的经验。CPLEX 应该提前安装,并有一个 免费版 供学生和学者使用。
我们从导入相关库开始:
import cplex
from docplex.mp.model import Model
我们还将导入包含读取和填充 MKP 实例的函数的文件(参考上一节)。
# Import the reading function
import MKP_populate_function as rdmkp
接下来,我们将调用实例上的函数,并获取用于创建模型的参数:
# Call the function on a given instance
instance = 'mknapcb1_1.txt'
c, A, b = rdmkp.MKPpopulate(instance)# Define the ranges for variables and constraints
nCols, nRows = range(len(c)), range(len(b))
我通常使用前面代码块中的最后一个附加步骤来定义变量和约束的数量范围。它们主要表示变量和约束的集合。当我们在数学模型中定义变量和约束时,这将证明是很方便的。
创建模型
由于我们已经准备好了参数,我们将继续创建一个空模型:
# Create an empty model
mkp = Model('MKP')
声明决策变量
现在,我们将通过定义决策变量来扩充空模型。在 MKP,变量是二进制的,所以我们会相应地声明它们。您会注意到,我添加了二元变量不需要的上下界,但是,有时我想检查线性松弛界,所以我在所有模型中保持定义的界,但将二元类型更改为连续。
# Define decision variables
x = mkp.binary_var_list(nCols, lb = 0, ub = 1, name = 'x')
定义约束
每个约束代表一个有自己容量的不同背包。这个背包中每个物品的消耗由矩阵中的元素给出。
*# Declare constraints
constraints = mkp.add_constraints(sum(A[i][j] * x[j] for j in nCols) <= b[i] for i in nRows)*
定义目标函数
下一步是创建目标函数,即最大化所选商品子集的利润总和。将目标函数添加为 KPI 是一种很好的做法,可以更好地报告结果。我从更有经验的建模师那里学到了这一点。
*# Declare the objective function
profit = mkp.sum(c[j] * x[j] for j in nCols)# Add Obj. Function as a kpi for better reporting of results
mkp.add_kpi(profit, 'profit')
# Add objective function to the model as a maximization type
obj = mkp.maximize(profit)*
求解模型
现在剩下的就是解决创建的模型并报告结果。
*# Solving the model
mkp.solve()# Reporting results
mkp.report()*
一个额外的有用命令
当调用以下方法时,该方法提供关于变量的数量和它们的类型、约束的数量和问题的类型以及目标函数的意义(最大化或最小化)的信息。
*mkp.print_information()*
最后一点
需要注意的是,CPLEX 找到了 MKP 的精确解。虽然它在解决小实例时看起来很快,但在解决较大规模的整数/二进制实例时需要更长的时间。
正如 J. E. Beasly 教授所言:"当问题很小的时候,是什么使解决问题变得容易,而当问题变大的时候,恰恰是什么使它变得非常困难"。
这仅仅是因为当问题规模相对较小时,我们可以列举所有可能的解决方案,检查它们的可行性,并找到最佳方案。然而,当问题规模增大时,解决方案的数量会增长得更快,我们无法在可行的时间内检查所有的解决方案。可以使用其他方法,如启发式/元启发式,但也许我们可以在另一篇文章中讨论它们。
如果你喜欢这个内容,你可能会对这个帖子感兴趣,这个帖子是关于一个非常有趣的网络优化应用,我们使用社交网络分析来衡量和最小化对团队的干扰。
参考资料:
[1]朱立群,比斯利,多维背包问题的遗传算法 (1998),启发式学报 4 (1),63–86
深度聚类中一个重要发现的诞生
思想和理论
一本关于如何处理高维数据的侦探小说
这是我和我的学生 Pietro Barbiero、Gabriele Ciravegna 和 Vincenzo Randazzo 的论文《基于梯度的竞争学习:理论》的故事。如果你没什么更好的事情做,你可以在这里下载。

照片由 Javier Grixo 在 Unsplash 上拍摄
背景
最近在做深度聚类领域的工作。有趣的是,我可以将深度学习与聚类技术相结合,深度学习主要是受监督的(CNN,MLP,RNN),而聚类技术具有无监督的性质。事实上,他们的行为是如此不同,以至于他们不能很好地融合。看看这个经典的方案:

图片来自此处
即使重建和聚类损失经常被合并,事实是深度学习模块是用于聚类模块预处理的简单特征提取和降维工具。这是真正的融合吗?基于这一观察,我开始与我的硕士和博士生团队一起研究可能的解决方案。但是一个惊喜等待着我…
神秘
我正在研究深度学习在癌症基因组学中的一个有趣应用,突然,我在半夜接到一个奇怪的电话。是皮埃特罗·巴比洛,我最优秀的学生之一。当他试图做一些非常奇怪的事情时,他使用了一个非常简单的竞争层。他没有使用训练集数据矩阵,而是尝试使用它的转置。这毫无道理!特征成为样本,反之亦然。然而,输出是集群的原型!不可能。更好地检查它。如果这是正确的,就不会再有维数灾难的问题了。高维度成为更大的训练集,这产生了积极的效果。我简直不敢相信。
我们花了几天时间检查这个现象,但我们总是得到极好的结果。这怎么可能呢?我在努力寻找一个合理的解释。它必须存在,即使它违反直觉。结果就在我面前。他们是荒谬的,但我不能忽视他们。他们告诉我,必须有一个解释。但是哪一个?
首次调查
所以然后…
竞争层通过其神经元的权向量来估计原型,而输出不是很显著。相反,具有相同损失函数但具有转置输入的同一层具有显著输出(它们是原型),而权重支持学习。从这个角度来看,已经可以说,只有这第二个网络是真正的神经性质的。在纠结这个想法的时候,我直觉地想象出一个二元性的原理,将两个网络结合在一起。这是我的第一个结果:

基本(顶部)和双重(底部)单层神经网络(图片由作者提供)
顶部的网络代表普通(基础)竞争层(VCL),这是大多数聚类神经网络的基础。输入中的垂直线是数据样本。在训练之后,与输出神经元相关联的权重向量估计数据原型。底层网络,我称之为 DCL(双竞争层),在批量/小批量演示之后输出原型(输出矩阵的行)。图中的颜色代表二元性(相同的颜色=相同的值)。下面的定理恢复了我的第一个分析:

如果单独使用该层,则第二个假设由数据归一化考虑,或者如果它是用于聚类的深度神经网络的最后一步,则由批量归一化考虑。
关于数据拓扑,我们应用了竞争赫布边规则来估计边。
至于训练,像往常一样,两个网络都必须最小化量化误差。我们为最小化邻接矩阵 2-范数的损失增加了另一项,以强制边缘的稀疏性。
好吧,我找到了二元性的原理,但我还远远不满足。然而,一个非常重要的第一个结果,这个原则的结果,证明了 DCL 在深度学习中的重要性。正如我之前告诉你的,深度监督学习和聚类的本质没有很好地集成,因为它们的本质不同。事实上,反向传播规则,你可以从这样的计算图中清楚地看到,对于 RNNs,

图片来自这里
基于通过局部梯度从每个节点的输出到输入的传播。权重梯度估计只是这种传播的副产品。但是,如果输出没有意义,比如在深度聚类中,该怎么办呢?相反,DCL 与深层模块完美地集成在一起,正如您在下图中看到的,该图展示了 DCL 深层版本的架构。

深度 DCL(图片由作者提供)
DCL 是唯一完美集成到深度神经网络(deep DCL)的竞争层。
神秘越来越深
不幸的是,我的学生对 VLC 和 DCL 的实验显示了 DCL 的明显优势。这怎么可能呢?看看基准合成数据集上的这些比较。

基准实验。从左到右,螺旋,月亮和圆数据集深 DCL(图片由作者)。

VCL(标准)和 DCL 的三个关键指标的比较。度量是(顶行)量化误差,(中间行)边(邻接)矩阵的范数,(底行)有效原型的数量(图片由作者提供)。
通过考虑量化误差,两个网络在所有情况下都趋向于收敛到相似的局部最小值,从而验证了它们的理论等价性。尽管如此,DCL 表现出更快的收敛速度。最显著的区别在于(1)有效原型的数量,因为 DCL 倾向于使用更多的资源,以及(2)拓扑的复杂性,因为 VCL 喜欢更复杂的解决方案。VCL 工作得更好。为什么?为什么?我绝望的呼喊划破夜空。神秘加深了,我仍然处在最黑暗的痛苦中。我的二元性理论在解释这些结果时绝对不能令人满意。事实上,我们没有使用深度版本,因为最佳集成与此无关。我绝望了。我只有两个选择,要么用病毒破坏我学生的电脑,恶化 DCL 结果,要么用新的理论方法来解决问题。
是时候揭开我绝望的面纱,勇敢地面对这个问题了。这个问题非常简单,我用一种非常简单的方式解释了它。假设我们有一个由 4 个大小为 100000 的样本组成的训练集。如果我可以转置它,就像在 DCL 中一样,我将得到一个大小为 4 的 10000 个样本的数据集。除了维度诅咒!关键在哪里?与此同时,我可以说,当我们需要估计原型的 Voronoi 集,以评估量化误差时,维数灾难再次出现。松了一口气!然而,现在必须看看对于高维数据,DCL 是否比 VCL 表现得更好。三言两语,维度诅咒对 DCL 的影响有多大?所以,我让我的学生检查 VCL 和 DCL 版本的结果,也深入 w.r.t .问题的维度。

准确性是问题维度的函数。误差带对应于平均值的标准误差(图片由作者提供)。
尽管我观察了估计 Voronoi 集的问题,但很明显 DCL,更重要的是,由于其卓越的集成能力,deep DCL 给出了极好的结果。特别是,在 2000–3000 个特征之前,这两种方法的准确率接近 100%!DCL 再次让我大吃一惊。
是时候用我的演绎法来解开这个谜了。该上数学课了!这似乎是一个显而易见的选择,但我们不要忘记,深度学习已经见证了新技术的蓬勃发展,这些技术通常仅由经验解释支持。怎么说,你想成为深度学习专家吗?就这样拿 DCL 吧,谢谢,继续别的。
一丝光亮照亮了黑暗
从哪里开始?这两种方法的训练都是基于梯度的,就像深度学习中的通常情况一样。所以我决定走这条路。让我们首先分析梯度流的渐近行为,然后分析它的动力学。我必须找到一个解释,DCL 是可行的,这是不可否认的。
解开谜团的第一步
首先,我用随机逼近理论分析了两个网络梯度流的渐近性质。关于 VCL,我发现梯度流是稳定的,并且在所有方向上以与 exp(t)相同的指数方式减少。这意味着该算法非常严格,因为其稳态行为不依赖于数据。对我来说有希望的结果!更有趣的是,我发现 DCL 梯度流依赖于数据。

三言两语(如果想看情商。34,欢迎你下载我的论文,该陈述声称双梯度流在更相关的方向上移动更快,即,在那里数据变化更大。事实上,轨迹朝着数据差异越大的方向发展得越快。这意味着更快的收敛速度,因为它是由数据内容决定的,正如在上面的数值实验中已经观察到的。
好吧,我终于解开了部分谜团。现在是结束调查的时候了。我觉得我已经抓到罪犯了。
最后的“致命一击”
当我着手研究这两种梯度流的动力学时,我没有想到扭转就在眼前。起初,我意识到 VCL 梯度流在其输入矩阵的值域空间中演化,而对偶梯度流在其转置矩阵的值域中演化。这个事实有非常重要的后果。例如,DCL 流是迭代最小二乘解,而 VCL 流只是隐式地做同样的事情。在最有趣的情况 d > n (其中 d 是输入的维数,而 n 是样本的数目)中,VCL 梯度流停留在维数为 d 的空间中,但是渐近地,倾向于位于一个 n 维的子空间中,即 X 的范围中。相反,双梯度流是 n 维的,并且总是在表示 X 转置范围的 n 维子空间中演化。在这种情况下,考虑输入矩阵及其转置矩阵具有相同的秩。请看下图,它说明了这一分析。

VCL(顶部)和 DCL(底部)梯度流以及 n = 2 和 d = 3 的相应子空间(图片由作者提供)
注意,VCL 解和 DCL 解通过由 X 的伪逆表示的线性变换相关。
我终于解开了这个谜。以下两个定理揭露了罪魁祸首。


首先,第一个定理是对偶网络是一种新颖的、非常有前途的高维聚类技术的基础。实际上,DCL 梯度流向子空间隧道中剩余的解,该子空间的维度不依赖于数据的维度。这里有重大发现!然而,不要忘记,基础理论只是近似的,给出了一个平均的行为。
收场白
我已经向你们展示了对深度聚类的一个重要贡献。但是,不仅仅是描述我的文章,我还想向你们展示让我理性地解释我的一个学生的发现的思维过程。然而,不要忘记,一个人决不能局限于对观察到的现象的经验解释。不要再把神经网络视为黑盒。现在我终于平静下来,准备开始新的调查。很快!
大脑最宝贵的资源
注意力在神经科学、深度学习和日常生活中的作用
大型强子对撞机(LHC)是人类建造的最复杂的机器之一。当它运行时,每秒钟大约有 10 亿个粒子以接近光速的速度相互碰撞,探索超越当前粒子物理学标准模型边缘的物理学。
在这十亿个粒子的碰撞中会发生很多事情,巨大的探测器被建在 LHC 环的周围以 不会错过任何重要的 。但是如此大量的碰撞,加上复杂的探测器,产生了大量的数据。说真的, 数据真多 。如果你把所有的数据加起来,大约每秒 1pb,或者 1000 TB,或者 100 万 GB 的碰撞数据。

LHC 周围的阿特拉斯探测器。马克西米利安·布里斯,CC BY-SA 4.0<https://creativecommons.org/licenses/by-sa/4.0>,通过维基共享
如果你听到这些数字,很明显,用目前的计算设备是不可能 分析甚至 记录如此疯狂的数据量的。因此, 在对数据进行任何分析变得可行之前,必须实时丢弃大量数据。
这就是为什么 LHC 的探测器内置了许多快速、自动的触发和过滤系统,向探测器发出信号,告诉我们值得开始记录一个事件,哪些事件没有告诉我们任何有意义的东西,可以安全地丢弃。
但是,即使通过这些方法实现了数据的大幅减少,LHC 的数据中心每天仍有 1pb 的数据,仅占原始传入数据的 0.001%。
我们的大脑每天都面临着类似的挑战 :认知处理和存储,就像计算时间一样,是大脑最宝贵的资源,对于通过进化产生的认知系统来说,节省资源是生存的关键之一。
所有的认知都可以看作是信息增益和代谢支出的权衡 。LHC 可以被视为其自身类型的 超人认知系统 ,以最小的成本探测其环境并从中提取相关信息。
高效提取信息的关键之一是拥有高度优化的 传感器,在任何深度处理发生之前,这些传感器会进行自己的快速思考 。这些低级过滤器触发哪些事件被记录,哪些事件在花费太多精力之前被丢弃。
它们与科学家的高水平科学抱负相结合,形成了这个超人认知系统的另一部分,即LHC:从传感器流入的关于环境的巨大信息流中,哪些事件看起来足够有趣,值得进一步研究? 哪些事件应该引起我们的注意,需要进一步调查 ?我们的目标(例如发现希格斯玻色子或超对称粒子)如何告知我们从哪里开始寻找,以及我们如何构造过滤器?
大脑中的注意力
“大家都知道什么是关注。它是头脑以清晰而生动的形式,从看似几个同时可能存在的对象或思路中占有一个。”威廉·詹姆斯
尽管威廉·詹姆斯声称每个人都知道注意力是什么,但在这一点上需要强调的是 注意力不是一个由坐在松果体内部方向盘上的侏儒控制的同质事物 ,而是一个复杂的多面现象,最好在几个层面上考虑,并由几个单独的移动部分组成。在我上一篇关于为什么我们可能会以错误的方式看待大脑的文章中,我讨论了这个经常出现的问题,即 应用几个世纪前的术语来描述新的神经科学现象 (詹姆斯的遗产发挥了自己的作用),并且通常,依赖古老的术语和古老的直觉会阻碍我们正确理解正在发生的事情。
对于注意力来说尤其如此,日常生活中如此熟悉的东西却同时意味着这么多事情,并且与其他摇摆不定的概念如 自由意志 和意识联系在一起。
因此,在本文的其余部分,我不想详尽无遗(对于注意力的各种方面的更详细的概述,这篇评论文章可能是一个很好的起点),而是说明注意力在大脑和机器学习中的一些有用的关键组成部分和功能。
LHC 很好地展示了在复杂的环境中,注意力如何决定有限的资源应该用在哪里。我相信它也很好地介绍了组成大脑中注意力机制的关键组件:我们的注意力系统可以被认为是由 自下而上和自上而下的控制组成, 为 亚当·加扎利 和 拉里·罗森 在 中描述了《分心的大脑:高科技世界中的古代大脑 。
自上而下的机制试图通过引导我们的注意力来实现我们的高层次目标。假设你的新年目标是减肥:你的大脑皮层将试图说服你的眼睛不要注意沙发旁边那块看起来美味营养的巧克力。自上而下的目标可能被认为是进化的顶点之一:正如我在关于贝叶斯大脑的文章中指出的,发现和预测未来提供了巨大的进化优势,我们由死者建造的城市和技术给人留下了深刻的证据。

由Julia androschuk在 Unsplash 上拍摄的照片
另一方面,自下而上的机制会自动将你的注意力吸引到在我们漫长的进化史中值得注意的事情上。无论是街上发生了巨大的爆炸,黑暗中出现了一辆美洲虎,还是有人在你旁边的桌子上喊你的名字。
自上而下的注意力与我们大脑的执行功能密切相关,其定义是前额叶皮层对大脑其他部分进行自上而下控制的能力,大脑其他部分通过自下而上的注意力抓取进行反作用。例如,眶额皮层试图找出你的情绪是如何被你的目标调节的,并通过边缘系统 将抽象的目标转化为身体和行动的语言 。
一个有趣的注意是,这大多是通过抑制 而不是激活 来完成的。生活中有价值的往往是我们没有做的事情,我们没有跟随的冲动,无论是当我们决定早上不躺在舒适的床上去上班,还是当我们阻止自己在拉斯维加斯的晚上赌博输掉退休金。对负责注意力控制的大脑区域受损(或者,在 Phineas Gage 的情况下,铁棒穿过这些相关的大脑区域)的患者进行的研究表明,无法控制冲动和追求长期目标对他们的生活质量是多么有害。一个类似的观点因米谢尔著名的棉花糖实验而流行开来,表明儿童早期延迟满足是长期成功的一个很好的预测。

在一次事故中,一根铁棒穿过了菲尼亚斯·盖奇的脑袋,从此他变了一个人。他的许多缺陷都与缺乏冲动控制有关,这反过来又使他无法追求长期目标。通过维基媒体共享的公共领域
因此,控制注意力与控制我们的行为密切相关。我们的大脑可能被视为建立在猴子大脑上的超级计算机,随着超级计算机相对较晚出现,施加认知控制是棘手的,自上而下和自下而上的机制不断争夺大脑最宝贵的资源。
通常,他们之间会有直接的冲突。
你可能意志坚强,但在一整天的工作后,当看到巧克力棒时,唾液在你嘴里以海啸般的强度积聚,你的执行功能很容易被克服,你被证明你不是自己家里的主人。
更普遍的是,注意力分散和注意力不集中可以从目标干扰的角度来看。和大脑中的大多数事物一样,注意力是动态调节的,因此容易受到干扰。保持专注是一个主动的过程,过滤信息,忽略无关的是一个主动的过程,需要时间和精力。目标相互竞争,注意力资源总是相互直接竞争。
这是注意力的另一个重要方面,从进化的角度来看是有意义的,并将我们带回 LHC 的比喻:全球注意力引导我们的传感器到达信息收集景观 中的 最大值。这些可以在个人的感觉模式中实现(例如,看向某个方向),通过在大脑的不同网络之间切换(例如,仔细听与仔细看)或在任务之间切换(阅读报纸而不是观看 Youtube)。在收集了足够的信息后,注意力还会引导我们的记忆来决定在未来的情况下哪些东西值得储存和记忆。
但是,我们通过注意力频繁启动网络切换的能力可能会被视为一种功能和一种缺陷:由于通常有许多事情需要关注,因此有一个自动化的基础设施是至关重要的,它可以将注意力集中在输入上,并将我们的行动切换到有望获得最多信息的活动上。
在现代高科技社会中,我们不断受到注意力吸引的轰炸。正如 分心的大脑 中所述,当古代大脑不断试图在指数增长的信息景观中最大化信息时,太多的任务转换机会成为一个巨大的问题,导致持续的分心,多任务处理的失败尝试,不满足感,睡眠剥夺等等。由于复杂的任务通常分布在几个大脑区域,这种转换过程也相对较慢,这就是为什么在不同任务之间转换需要花费大量时间,这使得我们都经常从事的多任务处理效率非常低。
这种现象在年轻一代中尤为明显,应对这些对我们精神生活的高度有害影响应该得到我们集体社会的一致关注(双关语)。
深度学习中的注意力(是你所需要的)
总而言之,我们可以将注意力概念化为一个多用途代理人的总体组织原则,他必须在现实世界中同时完成大量任务,并在它们之间进行有意义的导航。这包括跨几个传感器模态的信息收集和通过认知控制实现高级目标。
还不完全清楚如何从这个角度关注人工智能中有用的想法。但是,如果我们将注意力视为减少和引导计算资源的通用工具,它已经在几个机器学习架构中得到了相当成功的使用。
最近,注意力在变形金刚的背景下吸引了深度学习社区的注意,论文“ 【注意力是你所需要的一切】 ”成为该领域最有影响力的论文之一,被引用超过 16000 次。
变形金刚彻底改变了自然语言处理,并允许像 BERT ( 来自变形金刚的双向编码器表示)这样的架构生成怪异的类似人类的文本。
不用太专业,文本生成是一个连续的任务,由编码器(输入的文本)和解码器(输出的文本)组成。因此,模型的输入和输出由序列组成。序列模型可能非常难以学习,因为输入可能会变得非常大,这需要模型潜在地学习输入中的长期依赖性(参见训练递归神经网络时的爆炸梯度问题,这是由长短期记忆网络部分解决的问题,它有自己的一组问题)。
正如这篇博文更详细描述的那样,变形金刚使用的注意力机制试图通过引入所谓的自我注意力操作来规避这个问题。该操作在序列的输入向量之间计算,并且可以在生成输出序列时使用。
自我关注是一种找出全局依赖的方式,也是一种划分输入序列的哪一部分属于一起的方式,并且反过来将与输出生成相关。 一个经常被引用的应用是不同语言之间的翻译(例如法语和英语之间的翻译,使用名副其实的 CamemBERT model ),意思相同的单词可以在不同语言的句子的不同部分出现。
注意力也有助于避免输入序列过长的问题,因为模型不需要记住整个输入序列(比如当你必须翻译一个很长的句子时……看着你,马赛尔·普鲁斯特),但可以更灵活地对输入进行优先排序和批处理,就像人类翻译一样(更详细的解释请参见吴恩达的视频)。
这有助于 有效地减少输入向量 的维度,因为模型隐式地选择序列的哪一部分将是相关的,并因此计算出要注意什么。这也很好地将上下文依赖引入到模型中,这对于我们人类理解文本(以及整个世界)是绝对重要的。
虽然这和大脑之间有一些相似之处,但是其中的一些联系在这里可能看起来有点牵强。
我们人类的智能如此令人印象深刻,因为它在如此广泛的不同任务中发挥作用,而神经网络架构在很大程度上仍然高度专业化,很难适应它。因此,在多任务学习主体(例如机器人)的背景下,更类似于人类注意力的东西很可能会成为越来越重要的全球组织原则。
对于新鲜有趣的想法仍然有很大的空间(例如通过在大脑中自然语言处理的注意力上模拟变形金刚的注意力),并很好地强调了为什么在未来的道路上,神经科学的概念可能会给机器学习注入一系列有用的新想法,以及为什么这两个学科应该保持密切联系。
卷积神经网络简史
人工智能精要
探索几乎用于每项计算机视觉任务的最受欢迎的深度学习模型之一的历史

图一。乔尔·菲利普在 Unsplash 上的照片
C 对于几乎任何计算机视觉和图像处理相关的人工智能任务,选择性神经网络是当今最重要的人工神经网络架构。在这篇文章中,我们将简单地访问从 20 世纪 50 年代的生物实验到今天复杂的预训练计算机视觉模型的 CNN 的起源。
从简单和复杂到祖母细胞
1959 年,David Hubel 和 Torsten Wiesel 发现了简单细胞和复杂细胞。根据他们的研究,对于视觉模式识别,我们使用两种细胞。简单的单元格可以识别图像特定部分的特定方向的边缘和线条,如下图所示:

图二。由 Movshon、Thompson 和 Tolhurst 提出的简单和复杂细胞模型(图由 Movshon 在论文中给出)
另一方面,复杂的细胞也会对特定方向的边缘和条做出反应。除了这种能力之外,与简单单元相反,复杂单元可以在场景中的任何位置对这些边和条做出响应。
例如,简单单元只能响应位于场景上部的垂直条,而复杂单元可以响应位于场景中任何位置的垂直场景。
复杂单元可以通过对来自多个简单单元的信息求和来实现这种位置不可知的识别能力。在整个人体中,我们看到简单和复杂的细胞结构,它们共同组成了我们的视觉系统。
祖母或灵知细胞是一种假设的神经元,代表复杂但具体的概念或对象。当一个人“看到、听到或以其他方式敏感地辨别”一个特定的实体,如他或她的祖母时,它就会激活。
因此,在我们的身体中,很可能有一个复杂的神经元从其他复杂的神经元获得信息(检测特定物品所必需的),并且只有当我们拥有奶奶的视觉时才会激活。
福岛国彦的新认知
受 Hubel 和 Wiesel 工作的启发,20 世纪 80 年代,Kunihiko Fukushima 博士设计了一个模拟简单和复杂细胞功能的人工神经网络。S 细胞作为人造简单细胞运行,而 C 细胞作为人造复杂细胞运行。它们是人工的,因为它们不是生物神经元,而是模仿简单和复杂细胞的算法结构。福岛新认知基因的主要思想很简单:使用从其他低级复杂细胞收集信息的复杂细胞或检测简单模式的简单细胞(如尾巴)来捕捉复杂模式(如狗)。

图 3。说明 Neocognitron 中各层之间相互连接的示意图(图由 Fukushima 在Neocognitron 论文中提供)
查看 Neocognitron 的论文: Neocognitron:不受位置移动影响的模式识别机制的自组织神经网络模型
Yann LeCun 的 LeNet
尽管 Fukushima 的工作在新兴的人工智能领域非常强大,但卷积神经网络的第一个现代应用是在 20 世纪 90 年代由 Yann LeCun 等人在他们的论文基于梯度的学习应用于文档识别中实现的,这可能是迄今为止 90 年代最受欢迎的人工智能论文(被 34378 篇论文引用)。

图 4。用于数字识别的 LeNet-5 的架构(图由 LeCun 在 LeNet 论文中提供)
在论文中,亚村用手写数字的 MNIST 数据集训练了一个卷积神经网络。
MNIST 数据库包含 60,000 幅训练图像和 10,000 幅测试图像,取自美国人口普查局员工和美国高中生。MNIST 数据集包含手写数字(从 0 到 9)的灰度 RGB 代码,其标签代表实际数字:

图 5。手写数字示例的示例网格(从 MNIST 数据集创建)
这个想法是福岛新克隆的后续:使用复杂的人造细胞将简单的特征聚合成更复杂的特征。通过以下方式对 LeNet 进行 MNIST 培训:
- 为模型提供示例图像;
- 求模型预测标签;
- 更新模型设置,比较预测结果和实际标签值;
- 重复此过程,直到达到损耗最小的可选模式设置。
LeCun 的实现为当今的计算机视觉和图像处理应用设定了标准。
从 20 世纪 90 年代开始
在 90 年代、00 年代和 10 年代,构建卷积神经网络的简化过程被用于在越来越大的数据集上训练的越来越复杂的模型。
在 2005 年的 PASCAL VOC 挑战赛中,参与者竞相以他们的模型实现最低的损失+最高的精度性能,比赛从大约 20,000 幅图像和 20 个对象类别开始。然而,随着该领域的进步,这些数字与其他私人研究相比相形见绌。从 2010 年开始,费-李非开始与 PASCAL VOC 团队合作,以 ImageNet 的名称制作一个非常大的图像数据集。每年,研究人员都会受邀参加 ImageNet 大规模视觉识别挑战赛(ILSVRC)。目前,ImageNet 数据集包含 1000 个不同对象类中的 14,197,122 幅图像。

图 6。随机照片网格示例(从 ImageNet 数据集创建)
2012 年,一个名为 AlexNex 的深度卷积神经网络架构通过利用 GPU 实现了 16%的错误率(比亚军低 10%)。在 AlexNext 在当时取得令人难以置信的成就后,使用 GPU 完成计算机视觉任务成为了标准。
查看 AlexNet 论文:使用深度卷积神经网络的 ImageNet 分类
2017 年,ILSVRC 的 38 个参赛团队中有 29 个团队的误差小于 5%。因此,由于我们正处于解决复杂的 2D 分类问题的阶段,国际空间遥感中心的组织者宣布,在不久的将来,国际空间遥感中心的格式将是三维物体分类。
最终注释
从我们大脑中简单和复杂细胞的发现到 3D 物体检测的挑战,卷积神经网络结构走过了漫长的道路,从这一刻起,它们只会变得更加先进。看到在不久的将来我们将看到多少新的发展是令人兴奋的。如果你有兴趣成为这个过程的一部分,并学习深度学习,请查看我的内容指南。
https://oyalcin.medium.com/a-guide-to-my-content-on-artificial-intelligence-c70c9b4a3b17
更具体地说,如果您正在寻找使用 TensorFlow 构建自己的卷积神经网络,并使用 MNIST 数据集对手写数字进行分类,请查看这篇文章:
[## 使用 MNIST 数据集在 10 分钟内完成图像分类
towardsdatascience.com](/image-classification-in-10-minutes-with-mnist-dataset-54c35b77a38d)
订阅邮件列表获取我的最新内容
如果你喜欢我迄今为止分享的内容,可以考虑订阅简讯 !✉️
对于我的订阅者,我也分享我的私人 Google Colab 笔记本,其中包含我发表的每篇文章的完整代码。
如果你正在阅读这篇文章,我确信我们有着相似的兴趣,并且正在/将要从事相似的行业。那么我们就通过Linkedin来连线吧!请不要犹豫发送联系请求!Orhan g . yaln—Linkedin
现代数据平台的构建模块
为您的数据平台计划提供最佳工具和功能的初学者指南

亚当·诺瓦克斯基在 Unsplash 上的照片
如果你在谷歌上搜索“现代数据平台”,你会立即被广告和许多声称自己是真正的数据平台的公司轰炸。没什么帮助,对吧?
那么什么是现代数据平台呢?那到底是什么意思,还有2021 年是什么样子?
简而言之:现代数据平台是工具和功能的集合,当这些工具和功能组合在一起时,可以让组织达到黄金标准,即从根本上实现数据驱动的组织。
在本文中,我将分析现代数据平台在今天的实践中意味着什么。这包括三个核心特征、六个基本构建模块和您应该知道的最新数据工具。
现代数据平台的 3 个特征
鉴于当今数据的庞大规模和复杂性,现代数据平台已不足以处理和存储数据。It 必须以前所未有的速度移动和适应,以跟上数据和数据用户的多样性。有三个基本特征使数据平台真正“现代”。
为各种用户提供自助服务
在一个每个人——从商业用户和营销人员到工程师和产品经理——都是分析师的世界里,人们不应该需要分析师来帮助他们理解他们公司的数据。
现代数据平台的一个关键方面是它可以被广泛的用户直观地使用。如果有人想把数据带进他们的工作,他们应该能够很容易地找到他们需要的数据。
这意味着该平台应该使所有用户能够…
- 轻松发现和分析平台中的数据
- 了解与数据相关的上下文,如列描述、历史和沿袭
- 从数据中获得洞察力,对数据或 IT 团队的依赖性最小
实现“敏捷”数据管理
遗留数据平台的主要挑战之一是其复杂性。仅仅是访问数据通常就需要设置耗时的 ETL 作业。需要修改您的数据或查询吗?漫长的过程又重新开始了。
现代数据平台旨在改变这种状况。有了构建良好的现代平台,数据驱动的决策应该能够与业务同步发展。
管理现代数据平台的两个基本原则是可用性和弹性:
- 可用性:数据在数据湖或数据仓库中已经可用。现代数据湖和数据仓库将存储和计算分开,这使得以相对低廉的成本存储大量数据成为可能。
- 弹性:计算基于云平台,具有弹性和自动可扩展性。例如,如果最终用户在周五下午消耗最多的数据和分析,则应该可以在周五下午自动扩展处理能力,为用户提供出色的体验,然后在几个小时内缩减规模。
灵活、快速的设置和按需付费
现代数据平台与 Hadoop 时代复杂的本地实施相去甚远。它们构建在云优先、云原生的环境中,这意味着它们可以在几个小时内完成设置,而不是几年。
现代平台应该是…
- 易于设置 —没有冗长的销售流程、演示电话和实施周期。只需登录,通过信用卡支付,然后就可以了!
- 随用随付——无需预付和百万美元的许可费。“现代”堆栈就是将权力交到消费者手中,也就是说,只为你使用的东西付费
- 即插即用 —现代数据堆栈将继续发展和创新,同类最佳的工具不会像传统时代的工具那样强制“锁定”,而是基于开放标准的 API 构建,允许与堆栈的其余部分轻松集成
现代数据平台的关键构建模块

图片由 Atlan
现代数据摄取
数据摄取可能是您构建现代数据平台的起点,即,您如何从各种不同的数据源获取数据并将其摄取到您的核心数据存储层?
以下是一些关键的现代数据摄取工具:
现代数据存储和处理
数据存储和处理层是现代数据平台的基础。虽然这种架构在不断发展,但我们通常会看到 3 种工具或框架:
数据仓库:这个架构的基石是一个现代的数据仓库。这些系统通常是分析师的首选,因为它们优化了计算和处理速度。
一些关键的数据仓库工具包括 BigQuery 、红移和雪花。
****数据湖:数据湖架构指的是存储在像亚马逊 S3 这样的对象存储上的数据,以及处理这些数据的工具,比如 Spark。这些廉价的存储系统通常用于存储大量的原始数据,甚至是非结构化数据。
以下是数据湖的一些关键工具:
****新趋势预警:数据仓库!我们今年看到的趋势之一是期待已久的数据仓库和湖泊的融合。这将有助于统一大多数公司在过去十年中创建的孤立系统。
例如,一个正在出现的概念是“数据湖库”—一种将数据管理功能(如 ACID 事务和来自数据仓库的变更数据捕获)与数据湖的低成本存储相结合的系统设计。
**
现代数据转换
我们今天看到的数据转换层有两个核心实现。对于采用数据仓库优先架构的公司,像 dbt 这样利用原生 SQL 进行转换的工具已经成为数据转换的首选。另一种常见的实现是使用 Airflow 作为编排引擎,并在 Python 这样的编程语言中进行定制转换。
以下是一些用于数据转换的关键工具:
现代商业智能和分析
BI 仪表板已经存在很久了,但最新的 BI 和分析工具是为了适应更大的现代数据平台而构建的。这些通常是更多的自助服务平台,允许用户探索数据,而不仅仅是消费图形和图表。
现代 BI 工具有 Looker 、 Mode 、 Redash 、适马、 Sisense 、 Superset 、 Tableau 。
现代数据目录和治理
虽然现代数据平台在某些领域很棒(超快、易于扩展、开销小),但它很难为数据带来发现、信任和上下文。
随着元数据本身成为大数据,我们正处于元数据管理的飞跃之中,该领域将在未来 18-24 个月内出现大量创新。我最近写了关于数据目录 3.0 的想法:一个新的软件时代,它将建立在嵌入式协作的前提下,这是当今现代工作场所的关键,借用了 Github、Figma、Slack、opinion、Superhuman 和其他当今常见的现代工具的原则。
以下是现代数据编目和治理的一些关键工具:
- SAAS 工具: Atlan
- 开源工具: Apache Atlas ,LinkedIn 的 DataHub ,Lyft 的 Amundsen
- 内部工具: Airbnb 的数据门户,脸书的 Nemo ,优步的数据手册
现代数据隐私和访问治理
最后,随着现代数据平台中工具的增长,一个主要的挑战是能够跨整个堆栈管理隐私控制和访问治理。虽然现在还为时过早,但最近该领域已经出现了一些参与者和发展,并且出现了一些工具,这些工具可以充当授权引擎,在整个数据堆栈中应用隐私和安全策略。
以下是数据隐私和访问治理的一些关键工具:
你应该知道的其他现代数据工具
上面列出的功能和工具是现代数据平台的基础层。然而,每个公司使用数据的方式不同,因此许多公司针对特定的用例添加了额外的层和工具。
实时数据处理工具
需要实时数据处理的公司通常会向其数据平台添加两种额外的工具:
数据科学工具
已经从 BI 和分析转向强大的预测和数据科学分析的公司通常会在其数据堆栈中添加特定的数据科学工具:
- 数据科学家的首选 : Jupyter 笔记本
- 其他选项 : 大台库,数据机器人,多米诺,萨格马克
事件收集器
拥有大量数字业务的公司通常会添加事件收集器来记录和存储外部事件。像 Segment 和 Snowplow 这样的工具是他们数据摄取堆栈的重要补充。
数据质量工具
这个领域相对来说还处于萌芽状态,但是现在已经非常活跃了。概括地说,我们看到数据质量的几个方面融入了整个数据堆栈——概要分析期间的数据质量检查、业务驱动的质量规则,以及管道中的单元测试框架。
- 数据剖析:这正在被数据目录和治理工具如 Atlan 或开源剖析框架如 Amazon Deequ 所吞没。
- 单元测试:像开源的远大前程这样的框架正在出现和发展,允许单元测试作为数据管道本身的一部分来编写。
觉得这个内容有帮助?在我的时事通讯《元数据周刊》上,我每周都写关于活动元数据、数据操作、数据文化和我们的学习建设的文章。 在此订阅。**
概率的积木变得简单
三强争霸赛、轮盘和扑克有什么共同点?

迪伦·克里夫顿的照片在 Unsplash 上
让我们言归正传,讨论一下“概率”到底是什么?
基本上每个事件和都被赋予一个实数ℙ(A).换句话说,它是一个将某个事件映射到某个实数的映射。ℙ通常被称为概率度量。
这里有一些警告,如果你愿意的话。
ℙ被认为是一个函数,而不仅仅是任何函数。它需要是一个遵循三条规则的函数,稍后会详细介绍。
首先,需要注意的是,概率度量只是一种类型的“度量”。有许多不同的测度,对它们的研究被称为“测度论”。
但是这个帖子不是关于测量理论。
先决条件和符号
那么是什么让一个概率度量如此特别,又是什么让它不同于任何其他度量?
好吧,在你回答这个问题之前,我们先来看一个激励人心的例子!
在三强争霸赛的第一个任务中,所有四个冠军都被要求把手伸进一个装有四条微型龙的袋子里:瑞典短吻龙、普通威尔士绿龙、中国火球龙和匈牙利角尾龙!加分,对于那些知道哪个冠军选择了哪个龙的人。
我们将这第一个任务选择称为实验。为了简化,我们假设哈利·波特总是先选择(否则对这个实验建模会更困难)。
概率测度
哈利·波特实验的样本空间如下:

哈利选择瑞典短吻鳄的事件是 A = {SSS}。

在这个实验中,样本空间是有限的,这意味着样本空间中包含的元素数量是有限的。在这种情况下,样本空间中有四个元素,我们的事件中有一个元素:|ω| = 4 和| A | = 1。如果ω和每个样本结果的可能性相等,则:

请记住,这只适用于概率度量的特定选择。然而,这是概率度量最常见的选择,但我们也可以选择不同的方法。因此,哈利从袋子里选择瑞典短吻猪的概率是

很简单。根据我们刚刚学到的知识,现在,我问,概率度量的最高值是多少?它能取的最低值是多少?换句话说,ℙ函数的界限是什么?回想一下,在我们上面的例子中,ω= { SSS,CWG,CF,HH}那么ℙ(ω)= 1(意味着“事件的概率ω”)。哈利·波特选择瑞典短吻龙、普通威尔士绿龙、中国火球或匈牙利犀鸟的概率是 1.0,因为他必须从这四种龙中选择一种!换句话说,以前的事件会对将来的事件产生影响。
定义:如果满足以下条件,函数ℙ是一个概率测度:
规则 1:ℙ(a)≥0
规则 2:ℙ(ω)= 1
规则 3 :如果 A₁,A₂,…是不相交的

如果两个事件不能同时发生,则认为它们是不相交的(互斥的)。例如,我们不能同时向左转和向右转,在篮球中投篮和传球,或者掷骰子并让它落在两个不同的数字上。
独立和从属事件
随机事件在生活中无时无刻不在发生,比如,在免下车餐馆的五个人中,哪一个会和你点一样的菜,或者一家商店有你的运动鞋尺码的可能性有多大?大多数情况下,样本空间很小:两个“是”或“不是”的结果。然而,把握这些结果很重要。
看,就像我告诉我家人的,不要担心事情,相信数字,一切都会好的。
然而,为了导航,我们必须讨论两个非常重要的概念:1) 独立和 2) 依赖事件。
从属事件是指依赖于之前发生的事件的事件。最好的例子就是扑克!之前的牌对之后的牌(翻牌圈、转牌圈和河牌)有很大影响。这些被称为相关事件,因为未来的事件依赖于以前发生的事件。反过来,一个独立的事件并不关心之前的事件。
简单。不要想多了!
定义两个事件 A 和 B 是独立的,如果

一组事件{Aᵢ : i ∈ I }是独立的如果

例如,在赌场的轮盘赌桌上,你有时会看到一个屏幕,显示球落在红色和黑色上的次数。通常,球员会认为既然球已经落在红色上 100 次,落在黑色上 90 次,那么在接下来的投掷中,球更有可能落在黑色上。然而,每次球被滚动,这被认为是一个独立事件,事实并非如此,通常被称为赌徒谬误。因此,屏幕是没有意义的!
回到我们的哈利波特的例子。假设当哈利从袋子里选择一条龙时,它会被放回袋子里,让下一个人选择。因此,哈利和塞德里克都有可能选择匈牙利犀鸟。在这种假设下,袋中选龙的概率就成了独立事件。哈利(ℙ(A))和塞德里克选择匈牙利犀鸟(ℙ(B))的概率有多大?
简单的按照定义。将两个概率相乘:

分析依赖事件有点棘手,需要单独发布。总之,在这篇文章中,我们学习了概率的定义,以及如何用它来理解日常生活中可能发生的基本事件。
人工智能反对(担心)存在风险的理由
播客
柳文欢·埃齐奥尼谈我们应该(和不应该)担心的人工智能风险
编者按:这一集是我们关于数据科学和机器学习新兴问题的播客系列的一部分,由 Jeremie Harris 主持。除了主持播客,Jeremie 还帮助运营一家名为sharpes minds的数据科学导师初创公司。
很少有人会不同意人工智能将成为人类历史上最重要的经济和社会力量之一。
但随着其变革潜力而来的是对人工智能可能给人类带来的一种奇怪的新风险的担忧。随着人工智能系统实现其目标的能力呈指数级增长,一些人担心,即使这些目标和我们自己的目标之间有一点点偏差,都可能是灾难性的。OpenAI、DeepMind、CHAI Berkeley、牛津大学等领先实验室的许多知识丰富、经验丰富的人工智能专家都有这些担忧。
但它们并不普遍:我最近让计算机科学教授兼作家梅勒妮·米切尔(Melanie Mitchell)在播客上讨论她对人工智能灾难论的反对意见,她曾就人工智能风险的话题与斯图尔特·罗素(Stuart Russell)展开了著名的辩论。在这一集里,我们将继续探索人工智能灾难性风险怀疑论的案例,采访艾伦人工智能研究所首席执行官柳文欢·埃齐奥尼,艾伦人工智能研究所是世界领先的人工智能研究实验室,开发了许多著名的项目,包括广受欢迎的艾伦 LP 图书馆和语义学者。
柳文欢对人工智能风险有独特的观点,对话非常有趣!以下是我最喜欢的一些外卖食品:
- 柳文欢担心人工智能引发灾难性风险的案例过于依赖纯理论的论证。他强调了人工智能风险社区的一个说法,即一般的人类水平的人工智能可能比怀疑论者认为的更快实现,并认为没有经验主义的理由相信这是事实。柳文欢强调在关于人工智能时间表的辩论中需要更多的经验证据,并提出了一系列基准——他称之为“人工智能煤矿中的金丝雀”——他认为这将预示着具有一般人类水平能力的系统的到来,值得担忧。虽然我不同意他对金丝雀的选择,但我认为他提出一些担心人工智能能力的客观门槛很棒。
- 我们讨论了当预测变革性或一般性人工智能何时将被开发时,人类的直觉可能会有多差。我们有从两个不同的方向接近类人智能的经验:首先,通过育儿,它教我们认为新生儿是哑巴,三岁的孩子更聪明,青少年更聪明,等等;第二,通过进化,这让我们考虑一个智能连续体,从细菌到蜥蜴到啮齿动物到猴子,最终到我们。三岁的孩子在某些方面是愚蠢的,而猫不会,反之亦然:当智能实体沿着两条路径接近智能时,会犯的错误类型是根本不同的,这就是为什么对一个的直觉不会转化为另一个。人工智能是第三种方法:人工智能系统可能会犯比人类可能犯的错误更愚蠢的错误——但反过来也是如此。因此,仅仅通过观察人工智能今天犯的错误,很难说人工智能离类人的一般性有多近或多远。
- 柳文欢认为,人工智能的灾难性风险通常是以类似于帕斯卡赌注的方式构建的。支持者有时建议,即使人工智能引发灾难的风险很低,其潜在影响也是如此重要,无论如何,我们现在应该专注于人工智能的安全——几乎不考虑风险实现的概率。柳文欢同意对长期安全问题的一些关注是重要的,但认为帕斯卡的赌博式论点导致了在人工智能对齐和人工智能安全方面的过度资源投资。
你可以在这里的推特上关注柳文欢,或者在这里的推特上关注我。
播客中引用的链接:
- 柳文欢的《麻省理工科技评论》文章谈到了警告信号,他希望看到人类水平的人工智能是否即将到来。
- 链接到艾伦人工智能研究所的推特页面。

章节:
- 0:00 介绍
- 1:40 担心人工智能安全性和一致性的理由
- 9:35 何时优先考虑超级智能
- 14:25 人工智能协调和能力
- 25:30 人工智能工作时间表
- 34:05 煤矿中的金丝雀
- 37:25 从不同方向接近情报
- 40:55 后续步骤
- 未知的未知
- 53:05 总结
使用空间 SQL 的案例
为什么空间 SQL 很重要,以及它如何帮助您加快 GIS 和地理空间工作流的速度

盖尔·加博雷尔在 Unsplash 上的照片
那是 2012 年的春天,我第一次遇到了 SQL 查询。
2011 年底,我刚搬到纽约,花了一个下午的时间在 CARTO 办公室观看他们平台的演示。CARTO 的创始人贾维尔·德·拉·托雷向我展示了他们为上传、可视化和在网上发布地图而开发的神奇工具。
然后他按了一下屏幕上的开关,告诉我:
在这里,您可以在 PostGIS 中编写任何想要的查询,并立即将其显示在地图上!
SELECT * FROM us_states
这是我第一次看到 SQL 查询,虽然我当时并不知道,但这个简单的语句将成为我未来日常工作中不可或缺的一部分,并以惊人的方式帮助我提高技能。
多年来,我已经成为空间 SQL 的主要倡导者,我相信这是我投资的最重要的技能之一。也就是说,开始可能会让人望而生畏。
要使用空间 SQL,您需要有扎实的常规 SQL 基础,同时还要理解空间 SQL 的细微差别,这无疑需要时间。但最终,投资回报会弥补这一点:您可以更有效率,并获得大量自由,因为您将永远不必依赖任何工具或界面来分析或操作您的地理空间数据。
什么是空间 SQL,为什么它与普通 SQL 不同?
来源来自 GIPHY
很棒的问题!空间 SQL 使用普通 SQL 的所有相同元素和结构,但允许您使用另一种数据类型:几何或地理。
随着这些新的数据类型而来的是一组函数,通常用 ST(如 ST_Intersects)表示,ST 代表空间类型。
许多数据库提供空间功能,例如:
- 带 PostGIS 的 PostgreSQL
- Microsoft SQL Server
- 关系型数据库
- 带空间元素的 SQLite
- 甲骨文空间
以及数据仓库,例如:
- 谷歌大查询
- 雪花
- AWS 红移
那么,为什么要学习空间 SQL 呢?
就个人而言,它使我能够用空间数据和非空间数据做任何我能想到的事情。如果我能想到,我可以用空间 SQL 来实现。这也意味着我从不依赖任何单一的工具或数据管理解决方案。如果您将数据存储在具有空间化 SQL 的数据库中,您可以做任何需要做的事情。
简而言之,它使您对空间数据的处理更加高效、可重复和可扩展。
哪些人应该学习空间 SQL?
就个人而言,我认为任何使用空间数据的人都应该有一些使用空间 SQL 的经验,但是有几个群体绝对应该在空间 SQL 上投入一些时间:
- 使用基于 SQL 的数据库(如 PostgreSQL/PostGIS 或空间化数据仓库)中的数据的团队
- 空间数据科学家或使用空间数据的数据科学家
- 寻求分析和工作流更大灵活性的 GIS 用户
- 前端开发人员使用空间数据(尤其是地图)创建应用程序
- 寻求传统建模工具或软件更大灵活性的分析师
- 组织中处理大量可能具有空间成分(地名、地址、纬度/经度等)的数据的人员。)
空间 SQL 有什么优势?
我将介绍几个关键领域,希望能让您相信学习空间 SQL 是一项值得的投资:
- 提高日常工作流程的效率
- 确保组织内外的可重复性
- 在您的组织中跨职能工作
- 创建高效的工作流和任务管理
- 在支持 SQL 的数据仓库中处理大规模数据
让我们详细分析一下每一项:
提高日常工作流程的效率
资料来源来自 GIPHY
空间 SQL 可以通过几种不同的方式提高工作效率。与传统 GIS 工作流中加载和读取文件不同,数据已经存在。即使您需要加载数据,也有许多工具可以帮助您这样做,并在数据发生变化时更新数据。不需要每次启动项目时都读取新文件,当数据变大时,这是非常有益的。
在地图抓取播客的“空间 SQL —没有 GIS 的 GIS ”一集中,保罗·拉姆齐讲述了在 GIS 中学习和使用 SQL 的优势和必然性:
毫无疑问,如果你想让你的职业生涯超越…由你和其他程序员提供的抽象概念,你会想要学习 SQL…
除此之外,还有 SQL 的灵活性。假设您想要返回一个包含以下内容的查询:
您始终可以使用空间 SQL 创建新要素,并动态连接/聚合数据:
- 多边形质心纬度/经度
- 到另一点的距离
- 连接另一个表中的值
这很容易在一个查询中完成:
不仅如此,您还可以在一个查询中连接其他数据(空间数据和非空间数据)、限制和过滤数据等等。在更传统的 GIS 工作流中,您需要类似模型构建器的工具来完成这一任务。

QGIS 中的 GIS 模型示例— 来源
在 Python 中,您可以执行许多相同的功能,特别是使用 Geopandas 处理空间关系。但是在规模上,你通常需要添加一些其他库来匹配 PostGIS 或另一个 SQL 数据库的性能。
更不用说在许多空间数据库中,你可以在你的几何图形上创建索引以使使用几何图形的操作和功能运行得更快。
确保组织内外的可重复性
SQL 的一个优点是它非常具有可移植性,这意味着代码片段可以很容易地在您的团队中共享。
当有人编写了一个非常棒的查询或查询的一部分时,你可以共享它,任何人(只要他们在同一个数据库上,并且可以访问相同的表)都可以使用它,这是我们 CARTO 团队每周至少发生一次的事情。
对模型构建器这样的东西做同样的事情不仅意味着来回传递文件,还意味着传递模型文件和其他数据。此外,只获取一个模式的一部分并添加到您的模型中并不像简单地复制和粘贴一段 SQL 代码那么简单。
不仅如此,您还可以利用其他 SQL 用户在线共享的大量在线信息。您可以从博客、StackOverflow 帖子、Gists 以及 spatial SQL 社区中获得无穷无尽的资源。
我反复使用的一个例子来自 PostGIS 的创始人之一保罗·拉姆齐的帖子,关于如何运行批量最近邻查询。

在大约 3 秒钟内找到 30,000 多块地产到最近的 PostGIS 消防栓的距离— 来源
简而言之,它表明您可以快速地做事情并使其可重复,并提供代码供他人使用和扩展。
在您的组织中跨职能工作
来源来自 GIPHY
如果您在一个执行 GIS 或地理空间分析的组织中与其他执行非空间分析的团队一起工作,那么您就知道将这些领域结合在一起会产生多大的潜力。
“数据在哪里,就去哪里”的思想在这里适用,因为大多数团队将生产级数据存储在某种 SQL 数据库中。
通过确保您可以无缝地跨职能地工作,意味着您不仅仅局限于您团队的数据。你也可以把宝贵的空间专业知识带给其他团队学习,反之亦然。
这方面的一个例子是一家零售公司,它在不同的商店存储有关个人购买的交易数据。使用空间数据,您可以创建包含客户人口统计数据的贸易区,以与客户购买数据相结合,从而了解不同的人口统计特征如何影响不同产品的性能或需求。
创建高效的工作流和任务管理
关于 SQL 和数据库,我最喜欢的一点是它们对于不同任务的可扩展性:
- 当新数据可用时,用 Update 语句更新记录
- 使用触发器根据特定表中发生的事件设置操作
- 使用几何索引使空间关系查询更快、更有效
- 使用用户定义的函数创建自己的函数
一个非常简单的例子,但是让我们假设您有一个定期插入新数据的表,您想从数据中的纬度和经度字段创建一个几何,并从另一个表中计算一定距离内的位置数。
使用 PostgreSQL 中的触发器,您可以设置一次,并且(在大多数情况下)再也不用担心它了。
在支持 SQL 的数据仓库中处理大规模数据
数据仓库在许多大大小小的组织中变得越来越普遍,因为它们能够在一个公共数据存储库中快速查询大型数据集。你可以在这里了解更多关于数据仓库的信息。
主要的数据仓库(如 BigQuery、Snowflake 和 Redshift)预装了许多空间函数,随时可供使用。除了空间功能,您还可以使用机器学习工作流,如 BigQuery ML 和 CARTO 等平台,通过直接来自数据仓库的空间扩展为空间分析和可视化带来额外的功能。
为了突出数据仓库的速度,您可以在下面看到一个示例查询,它计算 OpenStreetMap 中属于每个美国人口普查区块组的建筑物数量。

10 秒钟内 110 万栋建筑物与所有美国区块组(270 GB 数据)的空间交集!根据消耗的时间段,可能需要 3 个小时的事情—取自个人查询
我希望这能启发你自己尝试空间 SQL,我还计划继续写一些教程!
马特·福里斯特目前在 CARTO 工作,这是一个使用大量空间 SQL 的空间平台。如果您对空间 SQL 或如何开始有任何疑问,请随时联系LinkedIn。
使用时间系列数据库的案例

卢克·切瑟在 Unsplash 上的照片
数据工程
时间序列数据库简介— InfluxDB、TimescaleDB 和 QuestDB
本文最后更新于 2021 年 9 月 1 日。
基于特定的业务需求和用例,大量的新数据库从关系数据库发展而来。从内存中的键值存储到图形数据库,从地理空间数据库到时间序列数据库。所有这些不同类型的数据库都有特定的用途,在这种情况下,使用关系数据库的一般解决方案不是很有效。
尽管有许多不同类型的数据库,但这里我们将着眼于时间序列数据库——处理时间序列数据所需的数据库。
由某一时间间隔内对某事物的连续测量组成的数据是时间序列数据。
随着金融交易的现代化和物联网的出现,对时间序列数据库的需求显而易见。股票和加密货币的价格每秒都在变化。为了测量这些不断变化的数据并对其进行分析,我们需要一种高效的方法来存储和检索数据。
随着物联网设备在我们生活中的空前渗透,物联网设备产生的数据每天都在增加。无论是您汽车的诊断,还是您房子的温度读数,或者是您走失的狗的 GPS 定位,物联网设备无处不在。
物联网设备只能做一件事。通过设备上的传感器捕捉信息,并将其发送到服务器进行存储。由于现有的通信协议对于这种轻量级、高频数据、流数据来说过于复杂,因此 MQTT 被开发来解决物联网的消息传递。
时间序列数据有两种类型—常规(通常基于测量)和非常规(通常基于事件)。
但时序数据并不局限于物联网;它也渗透了整个互联网。捕捉搜索引擎查询、标签、社交媒体帖子的病毒式传播等趋势也会生成时间序列数据。这还没有结束。在一个由软件驱动的世界中,安全性和合规性的日志记录和审计是必不可少的。所有这些数据也可以归类为时间序列数据。
时间序列数据库是专门为处理从一个或多个上述来源捕获、存储和分析时间序列数据而设计的。因此,为了简单起见,让我们将时间序列数据定义为
- 难以置信的高容量(来自测量的连续数据)
- 一个自然时间顺序(时间是一个基本维度)
- 作为整个数据集(比单个记录)更有价值
给定这些信息,时序数据库应该能够存储大量数据,并具有大规模记录扫描、数据分析和数据生命周期管理的能力。如前所述,传统的事务数据库虽然可以用来存储、检索和处理时间序列数据,但不能充分利用现有资源。
具体问题需要具体解决。
现在,随着公司意识到这一事实,他们已经开始使用专门的数据库来解决特定的问题。这又回到了我在这篇文章开始时谈论的话题。在所有其他数据库中,时间序列数据库在过去两年中的采用率较高(截至 2020 年 12 月的数据)。
时间序列数据库使用量增长约 2.5 倍的主要原因可以归结为云技术和数据技术的融合,以及从以前不常见的地方捕获数据的能力,例如汽车发动机、冰箱、数十亿设备的位置数据等。除了新的数据源,公司还意识到一些旧的数据源根本不适合事务数据库。所有这些都有助于更广泛地采用时间序列数据库。
时间序列数据库
时间序列数据库的存在是合理的,让我们看看如果你想尝试时间序列数据库,你可以有哪些不同的选择。更完整的时间序列数据库列表可以在 DB-engines 网站上找到。我就说其中的三个。
时间刻度 B
作为时间序列的 PostgreSQL,它能很快吸引你的注意力。默认情况下,PostgreSQL 对任何事情都是一种恭维。借助 hypertables 和 chunks 等新的架构构造,TimescaleDB 在插入方面实现了超过 15 倍的改进,在查询性能方面也有了实质性的提高。点击阅读更多关于的内容。
虽然主要的云提供商没有完全集成的云中 TimescaleDB 解决方案,但就像大多数其他时间序列数据库一样,TimescaleDB 可以在所有这些数据库上无缝运行。例如,如果您的基础设施在 AWS 中,并且您不想在时间刻度云中运行您的 TimescaleDB 实例,您可以使用 EC2 实例来安装官方的 TimescaleDB AMI,或者您可以使用 AWS Elastic Kubernetes 服务,使用官方掌舵图。
在下面的视频中,Mike Freedman 谈到了对时序数据库的需求,以及他们如何围绕 PostgreSQL 构建 TimescaleDB。
时间尺度 b。这篇演讲激发了我写这篇文章的灵感。
InfluxDB
与受 PostgreSQL(一种关系数据库)启发的 TimescaleDB 不同,这是一个从零开始编写的 NoSQL 时间序列数据库。虽然 TimescaleDB 的优势是站在被广泛接受和推崇的关系数据库的肩膀上,但 InfluxDB 走了一条不同的道路。InfluxDB 是顶级的时间序列数据库之一,但是根据 TimescaleDB 的研究,它在许多领域都没有打败 TimescaleDB。
如果你想进行一次有趣的阅读,并想在你的系统上安装这两个数据库来自己找出答案,那么就去看看 Oleksander Bausk 今天在他的博客上发表的有趣的比较吧。
https://bausk.dev/a-practical-comparison-of-timescaledb-and-influxdb/
话虽如此,InfluxDB 有一套很棒的特性。除了查询语言 InfluxQL 和 Flux,InfluxDB 还开发了一种干净、轻量级、基于文本的协议,用于向数据库写入点。值得称赞的是,这已经被其他时间序列数据库如 QuestDB 所采用。
与 TimescaleDB 一样,InfluxDB 也提供了现成的云解决方案,但您仍然可以决定在其中一个云平台上运行 InfluxDB。例如,如果您在 AWS 上运行它,您将获得对 CloudWatch metrics、Grafana、RDS、Kinesis 等的原生支持。总而言之,一个非常好的数据库。由于它相当新,很难说它能与更基于关系数据库的时间序列数据库竞争得多好。
QuestDB
QuestDB 是时间序列数据库列表中的一个新成员,来自最新一批 YCombinator。QuestDB 的一些主要优势是列存储、低内存占用、时序关系模型的使用以及可伸缩的无模式接收。与大多数时间序列数据库类似,QuestDB 还使用官方 AMIs 和 Kubernetes Helm 图表在 AWS 上提供云部署选项。
QuestDB,的首席技术官 Vlad Ilyushchenko 在 GitLab 畅谈 QuestDB 的架构。
QuestDB 还采用了 InfluxDB Line 协议进行接收,而不用担心随着数据结构的变化而改变模式。作为一个列数据库,QuestDB 无缝地处理新列的创建,因此支持无模式接收。我最近在另一篇文章中写了这一点。
虽然在早期,QuestDB 几乎完全支持 ANSI SQL,并对 SQL 方言进行了一些补充,但它创造了一系列完全独特的功能,使其成为一种可行的替代方案,可能比市场上其他一些主要数据库更好。
结论
虽然还有其他几个数据库,但我现在只谈了这三个。从公开数据来看,时序数据向时序数据库的转移是显而易见的。越来越多的公司将开始使用时间序列数据库作为其数据库堆栈的一部分,不一定取代关系数据库,但增加了其数据能力。这就是为什么今年不仅对于时间序列数据库,而且对于市场上出现的所有其他专门的数据库都特别令人兴奋的原因。
慈善部门真的是以伦敦为中心的
使用公开可用的数据绘制英格兰每个慈善机构的位置。
毫不奇怪,英格兰的慈善机构非常集中在伦敦,但看看慈善委员会关于英格兰目前注册的大约 14 万个慈善机构的详细资料,就会发现这种聚集的程度远远超出了我的想象。

作者图片
这是我开始学习 Python 语言数据分析以来,第一次深入研究大型数据集的结果。因此,它是不完整的,很可能有缺陷。我要说的是,在你根据原始数据采取任何行动之前,请仔细检查原始数据。
左边的图表显示了伦敦的引力有多明显。其他活动的点代表明显的大城市中心,如曼彻斯特和利物浦,但令人惊讶的是,在利兹、布里斯托尔、诺丁汉和纽卡斯尔也有重要的点,原因对我来说不是很明显。

作者图片
无论你往哪个方向看,南方都占主导地位
热图并不能说明全貌。当我们看任何一个地区的慈善机构数量时,东南部是最高的,但我们仍然看到南部和东部与该国其他地区之间的明显差异。当我们将慈善机构的数量与每个地区的面积相比时,伦敦再次占据主导地位,几乎完全掩盖了地图的其余部分。最后,当我们将慈善机构的数量与每个地区的人口进行比较时,西南地区占主导地位,但南部和东部、中部和北部之间的对比再次形成鲜明对比。

作者图片
伦敦以外的城市中心吸引慈善机构
可以预见的是,即使在个别地区,慈善机构主要在人口多的地方注册。虽然这是预料之中的,而且几乎肯定会与其他活动的集中重叠,但在这些地区之外似乎确实存在相对的沙漠,使得农村地区的人们可能得不到慈善服务。
随着时间的变化

作者图片
《1960 年慈善法》引入了慈善机构登记制度,因此在 1970 年之前的十年中有大量登记,从 20 世纪 70 年代开始,与上一个十年相比,每十年新慈善机构的数量都有所增加。鉴于这些数据是基于目前注册活跃的慈善机构,这并不特别令人惊讶。
各地区之间的差异基本保持不变,中部和北部以及南部之间的差距略有扩大。伦敦是个例外,如图所示,自上世纪 90 年代以来,伦敦的市场份额大幅上升。
至于为什么会出现这两种趋势,我无法给出详细的答案,但慈善行业也不能幸免于技术和研究生水平的工作流向伦敦的趋势,这可能是一个恶性循环,慈善机构认为他们必须在南方吸引最好的人才,吸引更多的人才到伦敦来,等等。新慈善机构的普遍增加可能是由于需求增加、慈善事业增加,或者一些更世俗的因素,如更多的融资机会只适用于注册慈善机构。
受益者、部门和服务因地区而异
我惊讶地发现,除了伦敦的宗教和扶贫慈善机构略有过多之外,慈善机构在不同地区运营的部门分布没有太大差异。鉴于全国各地的不同需求,我认为伦敦的慈善机构集中在国内和国际上,我预计会有更多的分布。
各地区的受益者可能比各个部门更加一致,只有伦敦例外,那里有更多针对特定种族的慈善机构,考虑到伦敦的大都市性质,这并不奇怪。
提供的服务类型稍有不同,但仍相当一致,东北地区和伦敦是明显的例外,东北地区提供赠款的慈善机构较少,伦敦的慈善机构较少,但有更多的慈善机构提供宣传和建议,并进行研究,这可能反映了伦敦慈善机构的更大专业化。

作者图片
慈善部门的每个部分都在增长
自 1970 年代以来,除了少数例外,每个部门、受益者和服务群体都提高了增长率。最大的群体倾向于以更快的速度变大。也有一些例外,如娱乐部门和提供宣传的慈善机构的增长。
总体而言,慈善领域的情况是,规模较大的团体继续增长最快,而那些关注动物、帮助特定族裔群体或进行研究的团体等代表性较低的团体增长较慢,现在占该领域的比例比前几十年小得多。
慈善部门似乎相当稳定
可能有很多因素没有在这个数据中捕捉到,但这个数据集包括了英格兰目前运营的每一个慈善机构,以及他们告诉慈善委员会他们正在做什么,所以它呈现的画面值得关注。
这种情况并不代表该国的状况或需求。它主要以伦敦为基地,并没有根据其运营地的独特需求调整其在全国的行动。它的部门、受益者和活动不会随着挑战的变化而变化。英国各地的不平等正在加剧,但关注贫困的慈善机构并没有增加在该领域的代表性。我们比以往任何时候都更加意识到种族和民族问题,以及影响不同群体的挑战可能是该群体所特有的,但专注于特定民族群体的慈善机构仍然明显不足。
我自己对该行业的经验是,它为自己试图做正确的事情而沾沾自喜,但却依赖于旧策略,不质疑假设,并厌恶风险。随着这个行业变得越来越专业化,它越来越倾向于有专业技能、有能力但没有经验的人——包括我自己。
我的经验与这些数据所呈现的画面相吻合,但我不认为我们可以从中得出任何有力的结论,但或许其他花更多时间从整体上观察该行业的人可以将它与其他发现结合起来,给出一个更清晰的想法,说明为什么我们会看到如此黯淡的画面。
我很想听听人们对这项工作的印象,对我的业余分析的批评,或者任何额外的见解。你可以在 Twitter @willhoyles 上找到我,或者发邮件到 will@whocommunications.co.uk给我,在 GitHub 上阅读的完整笔记本。
回归分析的卡方拟合优度检验

观察到的和预期的 NUMBIDS 频率(图片由作者提供)
以及如何使用 Python、SciPy 和 Statsmodels 来使用它的教程
卡方检验(读作 Kai- 平方,如 Kai zen 或 Kai ser)是最通用的统计显著性检验之一。
以下是卡方检验的一些用途:
- 分布的拟合优度:卡方检验可用于确定您的数据是否符合已知的理论概率分布,如正态或泊松分布。
- 回归模型的拟合优度:卡方检验可用于测量您的训练回归模型在训练、验证或测试数据集上的拟合优度。
- 最小卡方估计:对于服从参数分布(如正态分布、泊松分布或二项式分布)的数据集,卡方检验可用于找出观察值服从理论分布的参数范围。
- 独立性检验:卡方检验可用于检验两个分类随机变量(如年龄和收入,其值已在实验中测量)是否相互独立。
- 残差分析:在某些广义线性回归模型中,皮尔逊残差在残差是独立的同分布正态变量的零假设下服从(缩放)卡方分布,表明拟合模型的拟合优度很高。
- 嵌套回归模型的拟合优度:可用于比较嵌套回归模型对数似然性的偏差统计量遵循卡方分布,假设添加回归变量不会增加模型的拟合优度。因此,选择两种型号中较简单的型号可能会更好。
- 与 G 平方检验的关系:当观察值和期望值几乎相等时,拟合优度的 G 检验简化为拟合优度的卡方检验。
在本文的其余部分,我们将重点关注卡方检验在回归分析中的应用。
我们将使用真实世界的数据集收购出价,这是回归建模文献中的一个流行数据集。我们将使用 SciPy 和 Statsmodels 库作为我们的实现工具。
卡方检验的起源
卡方检验基于卡方分布。卡方分布是将 n 个独立随机变量的平方相加得到的,每个变量都遵循标准正态分布,即每个正态变量的均值和单位方差都为零。
以符号形式:

以 k 个标准正态随机变量的平方和表示的𝛘概率分布(图片由作者
总和中的 N(0,1) 表示均值和单位方差为零的正态分布随机变量。如果你将 k 个 T21 这样的变量和它们的“实现”值的平方相加,你会得到一个自由度为 k 的卡方分布。
如果人们愿意将 1/方差比例因子添加到结果分布中,则可以放宽单位方差约束。
𝛘 (k) 分布的均值为 k ,方差为 2k 。下图取自维基共享资源,显示了随着 k 值的增加, 𝛘 (k) 的形状:

k 自由度的 Ch 平方概率分布(来源:维基媒体下 CC BY 3.0 )
卡方检验可用于那些被证明在零假设下渐近遵循卡方分布的检验统计量。
现在让我们看看如何使用卡方拟合优度检验。
使用卡方检验测试已知概率分布的拟合优度
为了测试给定的数据集是否服从已知的概率分布,我们使用以下称为皮尔逊卡方统计量的测试统计量:

检验观察值是否服从某种期望的频率分布的检验统计量(图片由作者提供)
其中:
O_i 是随机变量的与结果的观测频率。
E_i 是随机变量第次与第次结果的期望频率。
可以看出,对于 O_i 和 E_i 的“足够大”的值,并且当 O_i 与 E_i 相差不大,即数据没有严重分散时, T 遵循具有N-p自由度的卡方分布,其中 N 是类别的数量例如,当理论分布是泊松分布时, p=1 ,因为泊松分布只有一个参数——平均利率。
示例
让我们看看如何在一组实际的观察数据上使用这种检验,我们将假定这些数据是泊松分布的,我们将使用卡方拟合优度检验来证明或否定我们的假设。
我们将使用的观察数据集包含 1978 年至 1985 年间记录的 126 个公司收购活动观察数据。每个观察包含几个参数,例如经历了接管事件的公司的规模(以十亿美元计)。因变量' y '是对该公司进行的收购出价的数量。需要注意的一点是,该数据集中的所有 126 家公司最终都是在对每家公司的最终记录收购出价后的某个时期内被收购的。
数据集可以从这里下载。
让我们从导入所有必需的 Python 包开始:
**import** pandas **as** pd
**import** numpy **as** np
**from** patsy **import** dmatrices
**from** matplotlib **import** pyplot **as** plt
**from** scipy.stats **import** poisson
**import** scipy.stats **as** stats
**import** statsmodels.api **as** sm
让我们将数据集读入熊猫数据帧:
df = pd.**read_csv**(**'takeover_bids_dataset.csv'**, header=0, index_col=[0])
打印出前 15 行。每行包含一个独特公司的收购相关活动:
df.**head**(15)

我们感兴趣的变量如下:
解释变量(X 矩阵):
BIDPREM :买入溢价=买入价格/买入前 15 天的股票市价。
FINREST: 指示变量(1/0),表示公司的股权结构是否拟变更。
机构持股:机构持股比例。
【legl rest:指示变量(1/0)表示被接管的公司是否进行了法律辩护。
REALREST: 指示变量(1/0),表示公司的资产结构是否拟变更。
REGULATN: 指示美国司法部是否干预的指示变量(1/0)。
规模:以十亿美元计的公司规模
规模 SQ: 规模的平方,以说明规模中的任何非线性。
WHITEKNT: 指示变量(1/0),表示公司管理层是否邀请了任何友好投标,例如用于避免敌意收购的投标。
因变量(y 向量):
NUMBIDS:整数,包含对公司进行的收购出价的数量。
打印因变量的汇总统计数据:NUMBIDS
stats_labels = [**'Mean NUMBIDS'**, **'Variance NUMBIDS'**, **'Minimum NUMBIDS'**, **'Maximum NUMBIDS'**]stats_values = [**round**(df[**'NUMBIDS'**].**mean**(), 2), round(df[**'NUMBIDS'**].**var**(), 2), df[**'NUMBIDS'**].**min**(), df[**'NUMBIDS'**].**max**()]**print**(**set**(**zip**(stats_labels, stats_values)))
我们看到以下统计数据:
{(‘Mean NUMBIDS’, 1.74), (‘Variance NUMBIDS’, 2.05), (‘Minimum NUMBIDS’, 0), (‘Maximum NUMBIDS’, 10)}
我们注意到 NUMBIDS 的平均值是 1.74,而方差是 2.05。它们很接近,但不相同。存在少量的过度分散,但这不足以排除 NUMBIDS 可能是理论平均速率为 1.74 的泊松分布的可能性。
让我们形成两个假设:
H0: NUMBIDS 遵循平均值为 1.74 的泊松分布。
H1: H0 是假的。 NUMBIDS 不是泊松分布。
我们将继续我们的探索,用卡方拟合优度检验来证明(或否定)H0。为此,我们将使用以下步骤:
- 定义这两个假设。我们已经这样做了。
- 为y =NUMBIDS变量的每个值计算观察到的频率 O_i 。
- 假设泊松分布 y ,计算y =NUMBIDS的每个值的期望频率 E_i 。
- 计算我们上面给出的测试统计量。
- 在卡方表中查找检验统计的 p 值。如果 p 值小于 0.05,拒绝 95%置信水平的 H0,否则接受相同置信水平的 H0 ( 即 NUMBIDS 为泊松分布)。
为了计算观察到的频率 O_i ,让我们创建一个分组数据集,按 NUMBIDS 的频率分组。
grouped_df = df.**groupby**(**'NUMBIDS'**).**count**().**sort_values**(**by**=**'NUMBIDS'**)
grouped_df[**'NUMBIDS_OBS_FREQ'**] = grouped_df[**'SIZESQ'**]
打印分组的数据集:
**print**(grouped_df[**'NUMBIDS_OBS_FREQ'**])

观察到的数字频率(图片由作者提供)
我们看到数字> = 5 的频率非常少。卡方检验对于频率非常小的箱是不准确的。为了解决这个问题,我们将对所有 NUMBIDS > = 5 的频率求和,并将该数字与 NUMBIDS=5 相关联。
grouped_df.**at**[5, **'NUMBIDS_OBS_FREQ'**] = 5
让我们也删除 NUMBIDS > 5 的行,因为NUMBIDS = 5捕获所有 NUMBIDS > =5 的频率。
grouped_df = grouped_df.**drop**([6,7,10])
同时计算并存储 NUMBIDS 的观测概率。
grouped_df[**'NUMBIDS_OBS_PROBA'**] = grouped_df[**'NUMBIDS_OBS_FREQ'**]/**len**(df)
现在,假设 NUMBIDS 是泊松分布,计算并存储 NUMBIDS 的期望概率。
grouped_df[**'NUMBIDS_POISSON_PMF'**] = poisson.**pmf**(**k**=grouped_df.**index**, mu=df[**'NUMBIDS'**].**mean**())
对于 NUMBIDS > =5 ,我们将使用泊松生存函数,它将给出我们看到 NUMBIDS > =5 的概率。
生存函数 S(X=x) 给出了观察到大于 x 的 X 值的概率,即 S(X=x) = Pr(X > x)
grouped_df.**at**[5, **'NUMBIDS_POISSON_PMF'**] = poisson.**sf**(**k**=4, mu=df[**'NUMBIDS'**].**mean**())
计算每个数字的泊松分布期望频率 E_i
grouped_df[**'NUMBIDS_POISSON_FREQ'**] = grouped_df[**'NUMBIDS_POISSON_PMF'**]***len**(df)
打印观察值和预期值:
print(grouped_df[[**'NUMBIDS_OBS_PROBA'**, **'NUMBIDS_OBS_FREQ'**, **'NUMBIDS_POISSON_PMF'**, **'NUMBIDS_POISSON_FREQ'**]])
我们看到以下输出:

观察到的(O_i)和预期的(E _ I)NUMBIDS 的频率(图片由作者提供)
绘制所有 i 的观察值( O_i )和期望值( E_i ):
labels=[**'0'**, **'1'**, **'2'**, **'3'**, **'4'**, **' >=5'**]
x = np.**arange**(len(labels))
width = 0.35
fig, ax = plt.**subplots**()ax.**set_title**(**'Poisson Predicted versus Observed Frequencies of NUMBIDS'**)ax.**set_xlabel**(**'NUMBIDS'**)
ax.**set_ylabel**(**'Frequency of NUMBIDS'**)
ax.**set_xticks**(x)
ax.**set_xticklabels**(labels)bar1 = ax.**bar**(**x**=x - width/2, **height**=**list**(grouped_df[**'NUMBIDS_OBS_FREQ'**]), **width**=width, **label**=**'Observed Frequency'**)bar2 = ax.**bar**(**x**=x + width/2, height=list(grouped_df[**'NUMBIDS_POISSON_FREQ'**]), **width**=width, **label**=**'Expected Frequency'**)ax.**legend**()
ax.**bar_label**(bar1, padding=3)
ax.**bar_label**(bar2, padding=3)
fig.**tight_layout**()
plt.**show**()
我们看到下面的情节:

NUMBIDS 的观察频率和预期频率的柱状图(图片由作者提供)
现在让我们计算卡方检验统计量:

卡方拟合优度检验统计(图片由作者提供)
grouped_df[**'CHI_SQUARED_STAT'**] = np.**power**(grouped_df[**'NUMBIDS_OBS_FREQ'**]-grouped_df[**'NUMBIDS_POISSON_FREQ'**], 2)/grouped_df[**'NUMBIDS_POISSON_FREQ'**]chi_squared_value = grouped_df[**'CHI_SQUARED_STAT'**].**sum**()
在计算上述统计的 p 值之前,我们必须确定自由度。以下是总自由度:
total_degrees_of_freedom = **len**(grouped_df)
我们必须将这个数字减少 p ,其中p=泊松分布的参数数量。所以 p=1。
reduced_degrees_of_freedom = total_degrees_of_freedom - 1
获得自由度为 (N-p) 的卡方检验统计的 p 值。请注意,我们再次使用生存函数,它给出了观察到大于某个值的结果的概率,在这种情况下,该值是卡方检验统计量。
chi_squared_p_value = stats.**chi2**.**sf**(**x**=chi_squared_value, **df**=reduced_degrees_of_freedom)
我们还将获得与 0.05 (95%置信水平)的临界 alpha 相对应的测试统计值。我们将使用生存函数的反函数来得到这个值。
自生存函数S(X= X)= Pr(X>X)S 的逆(= X)会给你= X
**critical_chi_squared_value_at_95p = stats.**chi2**.**isf**(**q**=0.05, **df**=reduced_degrees_of_freedom)**
打印出我们到目前为止计算出的所有值:
**stats_labels=[**'Degrees of freedom'**, **'Chi-squared test statistic'**, **'p-value'**, **'Maximum allowed Chi-squared test statistic for H0 at alpha=0.05'**]stats_values=[reduced_degrees_of_freedom, chi_squared_value, chi_squared_p_value, critical_chi_squared_value_at_95p]**print**(**set**(**zip**(stats_labels, stats_values)))**
我们看到以下输出:
**{('Degrees of freedom', 5), ('p-value', 4.9704641133403614e-05), ('**Chi-squared test statistic**', 27.306905068684152), ('**Maximum allowed Chi-squared test statistic for H0 at alpha=0.05**', 11.070497693516355)}**
我们看到卡方拟合优度统计的计算值为 27.306905068684152,其 p 值为 4.9704641133403614e-05,远小于 alpha=0.05 。
因此,我们得出结论,在 95%的置信水平下(甚至在 9.99%的置信水平下),可以坚决拒绝零假设 H0,即数字是泊松分布。
还要注意,在 95%置信水平下接受 H0 的临界卡方检验统计值是 11.07,比 27.31 小得多。
我们可以通过绘制卡方(5)来可视化这种情况:
**plt.**xlabel**(**'Chi-squared distributed random number'**)plt.**ylabel**(**'Chi-squared(df='**+str(reduced_degrees_of_freedom)+**') probability density'**)rv = stats.**chi2**.**rvs**(df=reduced_degrees_of_freedom, size=100000)plt.**hist**(**x**=rv, **bins**=100, **density**=**True**, **histtype**=**'stepfilled'**)plt.**show**()**

𝛘 (5)概率分布显示了数据遵循给定概率分布(在我们的情况下,泊松)的零假设的接受区和拒绝区(图片由作者提供)
测试回归模型的拟合优度
我们现在将了解如何使用卡方检验来检验泊松回归模型的拟合优度。
首先,让我们用泊松回归模型来拟合我们的收购出价数据集。我们将使用 Patsy 使用的语法来构建模型方程。在下面的表达式中,我们说 NUMBIDS 是因变量,RHS 上的所有变量是回归的解释变量。
**expr = **'NUMBIDS ~ LEGLREST + REALREST + FINREST + WHITEKNT + BIDPREM + INSTHOLD + SIZE + SIZESQ + REGULATN'****
使用 Patsy,雕刻出 X 和 y 矩阵:
**y_train, X_train = **dmatrices**(expr, df, return_type=**'dataframe'**)**
在训练数据集上建立和拟合泊松回归模型:
**poisson_training_results = sm.**GLM**(y_train, X_train, **family**=sm.families.**Poisson**()).**fit**()**
打印培训总结:
****print**(poisson_training_results.**summary**())**
我们得到以下输出:

泊松模型训练总结(图片由作者)
只有 3 个回归变量——white knt、SIZE 和 SIZESQ——在 alpha 值为 0.05 时具有统计显著性,这可以从它们的 z 值得到证明。
顺便提一下,忽略 statsmodels 报告的 Pearson chi2 值。它是回归的皮尔逊残差之和。顺便说一下,这个和也是在零假设下的卡方分布,但这不是我们想要的。
我们想知道的是,通过增加回归变量,泊松回归模型是否能够解释 NUMBIDS 中的一些方差,从而使模型预测与数据集的拟合度更好。
在前面的部分中,我们已经证明了关于 NUMBIDS 的以下内容:
Pr(NUMBIDS=k) 不服从泊松(=1.73)**
我们现在想看看:
Pr(NUMBIDS = k |X= X)~泊松(|X =X)
即 NUMBIDS 泊松分布是否取决于回归变量的值?
让我们首先打印出泊松模型对训练数据集的预测。
****print**(poisson_training_results.**mu**)**
以下是它们的样子:
**[2.72889817 1.30246609 2.15499739 1.1900047 1.21599906 2.09184785
1.82652758 1.06685393 0.79514164 1.14477171 0.99898271 1.92814556
2.20779028 1.43286411 1.73940628 0.90328133 2.27706959 1.87184259
1.54905093 0.93227952 0.93033507 1.51971811 2.08993763 3.19936595
1.89919831 1.59212915 1.52079672 1.00089633 2.00393774 1.1054032
1.57265323 1.76745435 2.00783088 1.61220849 1.83879678 4.41843589
1.04601311 1.31612754 1.6392279 1.37670449 1.06614718 1.66242252
2.34573342 2.04544149 0.883722 2.90131042 2.31600229 2.29251975
0.91892439 2.20332645 1.44903512 1.13939068 3.47003593 0.71567673
1.6650563 1.69170618 1.03992301 2.84548307 1.69812667 1.27352075
1.03938293 1.79108836 1.37244044 2.21050863 1.86560189 1.8648059
1.86403231 1.41217325 1.67946352 0.87193693 2.17762357 3.19137732
1.57576042 2.58713174 2.76491122 1.85562101 0.95351014 1.07514803
1.03481096 2.88297676 1.12614708 2.32323011 3.14995344 1.1434731
1.01097106 1.9373812 1.07089043 1.26067475 1.83816698 1.94861201
1.53542301 1.78289842 1.27713579 1.99077092 2.13675676 1.92808338
1.29938303 1.58595018 2.05336739 1.18530808 1.1440799 4.00075889
1.11596048 1.63979224 2.01608871 1.09786493 2.73455853 1.40900652
1.15158314 0.9380958 2.58107119 2.16988211 1.07493149 1.17958898
1.33171499 1.78776301 1.37353721 2.68417969 1.61699478 2.23254292
1.02306676 1.76736974 2.31367053 1.38449909 0.91364522 4.22397452]**
上述数组中的每个数字都是 NUMBIDS 的期望值取决于该行回归变量的相应值,即 X=x 。对应于 X 中的 126 行,共打印了 126 个期望值。于是,上面的数组给了我们条件期望|X*的集合。*****
我们的任务是在给定训练模型生成的泊松率的期望值的情况下,计算 NUMBIDS 的每个观察值的预期概率(以及频率)。为此,我们将在训练集中取 NUMBIDS 的每个观察值,并在给定值数组中的每个预测比率的情况下,计算观察该值的泊松概率。对于该 NUMBIDS 值,我们将对所有这些预测概率进行平均,以获得在训练泊松模型下观察到该 NUMBIDS 值的预测概率。
***def** get_poisson_conditional_probability(row):
num_bids = int(row.name)
**if** num_bids < 5:
**return** np.**mean**(poisson.**pmf**(**k**=num_bids, mu=poisson_training_results.**mu**))
**else**: #use the Survival Function for NUMBIDS >=5
**return** np.**mean**(poisson.**sf**(**k**=num_bids, mu=poisson_training_results.**mu**))grouped_df[**'PM_NUMBIDS_POISSON_PMF'**] = grouped_df.**apply**(**get_poisson_conditional_probability**, axis=1)grouped_df[**'PM_NUMBIDS_POISSON_FREQ'**] = grouped_df[**'PM_NUMBIDS_POISSON_PMF'**]***len**(df)*
现在,我们已经在泊松回归模型下获得了 NUMBIDS 的每个值的预期频率 E_i ,让我们再次对观察频率和预期频率进行卡方拟合优度检验:
*stats.**chisquare**(**f_obs**=grouped_df[**'NUMBIDS_OBS_FREQ'**], f_exp=grouped_df[**'PM_NUMBIDS_POISSON_FREQ'**], **ddof**=reduced_degrees_of_freedom)*
我们看到以下输出:
*Power_divergenceResult(**statistic**=33.69923990742465, **pvalue**=nan)*
我们看到,使用泊松回归模型,我们的卡方统计值为 33.69,比我们之前得到的值 27.30 还要大。p 值也太低而无法打印(因此有 nan)。泊松回归模型无法解释因变量 NUMBIDS 的方差,其对泊松概率分布的拟合优度很差就是证明(这次以X为条件)。因此,我们拒绝了该数据集的泊松回归模型。**
或许另一种回归模型,如负二项式或广义泊松模型,能够更好地解释我们之前提到的 NUMBIDS 的过度分散,因此可能比泊松模型具有更好的拟合优度。
以下是完整的源代码:
参考文献、引文和版权
资料组
目标管理阻力导致的多重投标:一种计数数据方法。Rev Quant Finan Acc3、447–457(1993)。https://doi.org/10.1007/BF02409622T20PDF 下载链接**
纸质和图书链接
Cameron A. Colin,Trivedi Pravin K ., 计数数据回归分析 ,计量经济学会专论№30,剑桥大学出版社,1998 年。国际标准书号:0521635675
McCullagh P .,Nelder John A ., 广义线性模型 ,第二版。,CRC 出版社,1989,ISBN 0412317605,9780412317606
形象
本文中的所有图片版权所有 Sachin Date 在 CC-BY-NC-SA 下,除非图片下面提到了不同的来源和版权。
相关文章
*
感谢阅读!如果您喜欢这篇文章,请 关注我 获取关于回归和时间序列分析的技巧、操作方法和编程建议。*
正则化的选择:脊、套索和弹性网回归
将 L1、L2 或 L1 和 L2 正则化应用于线性回归

安德烈·亨特在 Unsplash 上的照片
大概,你可能听过【山脊】【套索】【弹力网】这样的术语。这些只是技术术语。这些背后的基本概念是正规化。我们将很快在本帖中澄清这一点。
之前,我们已经从另一个角度讨论过正则化:用正则化减轻过拟合。正则化的主要好处是减轻过度拟合。正则化模型能够很好地概括未知数据。
基本上,正则化是通过向我们试图最小化的损失(成本)函数添加另一项来限制(控制)模型学习过程的过程。

(图片由作者提供)
正则项(也称为惩罚项)可以采取不同的形式,这将在本文中很快讨论。
预测连续值输出的线性回归模型通过最小化其损失函数来学习其系数的最佳值。同样的事情也适用于预测离散值输出的逻辑回归模型。在这两种情况下,我们都可以在模型训练阶段应用正则化。
当我们考虑将 Scikit-learnLogisticRegression()类用于逻辑回归模型时,有一个名为 penalty 的超参数用于选择正则化类型。
LogisticRegression(**penalty**='...')
对于惩罚(规则化类型),有 4 个选项可供选择。
- ‘无’—不应用正则化
- ‘l1’—应用 L1 正则化
- ‘l2’—应用 L2 正则化(默认选择)
- “弹性网”—L1 和 L2 正则化均适用
然而,当我们考虑将linear regression()类用于线性回归模型时,没有特定的超参数来选择正则化类型。相反,我们应该为每种类型的正则化使用 3 个单独的类。
- 当我们将 L2 正则化应用于线性回归的成本函数时,它被称为岭回归。
- 当我们将 L1 正则化应用于线性回归的代价函数时,称为类 o 回归。
- 当我们同时将L1 和 L2 正则化应用于线性回归的成本函数时,称为弹性网回归。
以上所有回归类型都属于 正则化回归 的范畴。
让我们详细讨论每一种类型。
里脊回归
这里,我们将 L2 正则化项(定义如下)应用于线性回归的成本函数:
L2 =α.σ(系数的平方值)
岭回归的 Scikit-learn 类为:
Ridge(**alpha**=...)
alpha 是控制正则化强度的超参数。它必须是正浮点数。默认值为 1。较大的α值意味着较强的正则化(较少过拟合,可能欠拟合!).较小的值意味着弱正则化(过度拟合)。我们想要建立一个既不过度拟合也不欠拟合数据的模型。所以,我们需要为α选择一个最佳值。为此,我们可以使用超参数调整技术。
注: Ridge(**alpha=0**)相当于 LinearRegression() 类求解的正态线性回归。不建议将alpha=0与岭回归一起使用。相反,你应该使用正常的线性回归。
套索回归
这里,我们将 L1 正则化项(定义如下)应用于线性回归的成本函数:
L1 =α.σ(系数的绝对值)
套索回归的 Scikit-learn 类是:
Lasso(**alpha**=...)
这个α及其定义与 L2 术语中定义的α相同。默认值为 1。
注: Lasso(**alpha=0**) 相当于 LinearRegression() 类求解的正态线性回归。不建议将alpha=0与套索回归一起使用。相反,你应该使用正常的线性回归。
弹性净回归
这里,我们同时将 L1 和 L2 正则化项应用于线性回归的成本函数。
弹性网回归的 Scikit-learn 类为:
ElasticNet(**alpha**=..., **l1_ratio**=...)
超参数 l1_ratio 定义了我们如何混合L1 和 L2 正则化。因此,它被称为 ElasticNet 混合参数 。 l1_ratio 的可接受值范围为:
**0 <= l1_ratio <= 1**
以下是可能的情况:
l1_ratio = 0意味着没有 L1 项,只有 L2 正则化。l1_ratio = 1表示没有 L2 项,只有 L1 正则化。0 < l1_ratio < 1是指该法规被定义为 L1 和 L2 术语的组合。如果l1_ratio接近 1,这意味着 L1 项占优势。如果l1_ratio接近 0,这意味着 L2 项占优势。
所以,这就是术语【脊】【套索】【弹力网】背后的想法!
摘要
没有必要总是将正则化应用于线性回归模型。首先,您可以尝试使用 LogisticRegression() 类,然后查看输出。如果测试 RMSE 的值较低,而火车 RMSE 的值较高,则您的回归模型过拟合。然后,您可以尝试应用每种类型的正则化并查看输出。您也可以为超参数 alpha 和 l1_ratio 尝试不同的有效值。最后,你会有很多模型。通过查看训练集和测试集上的 RMSE,您可以选择一个好的模型。请注意,一个好的模型既不过度拟合也不欠拟合数据。它应该能够在训练数据上表现良好,并且还能够在看不见的数据(测试数据)上进行很好的概括。
****注:除了应用正则化,还有其他方法来解决过拟合问题。你可以通过阅读我写的以下系列文章来学习它们。
“解决过度拟合”的文章列表(作者截图)**
今天的帖子到此结束。我的读者可以通过下面的链接注册成为会员,以获得我写的每个故事的全部信息,我将收到你的一部分会员费。
**https://rukshanpramoditha.medium.com/membership
非常感谢你一直以来的支持!下一个故事再见。祝大家学习愉快!
特别要感谢 Unsplash 网站上的 Andre Hunter 、T3,他为我提供了一张很好的封面图片。
鲁克山·普拉莫迪塔
2021–10–12**
AGI 的认知科学
思想和理论
人工智能概论系列的第 2 部分

大脑和思维是一回事吗?资料来源:Bret Kavanaugh viaUnsplash。
“为什么大脑不证明自己在做所有这些事情呢?哦,顺便说一下,是我,聪明的——在你脑子里。我是让你保持平衡和咀嚼食物的东西;我是你入睡或坠入爱河的原因……”
Patricia S. Churchland 博士,触动神经:作为大脑的自我
欢迎来到这个探索人工智能的新系列的第二部分(AGI)。如果你错过了第 1 部分,或者只是在寻找一些关于 AGI 的背景知识,那么点击这里查看。本周我们将看看世界上认知科学是什么,为什么它与 AGI 相关,以及为什么每个人工智能/AGI/人工智能的追随者都应该至少知道一点点。
在这个系列中,每周/每隔一周会有一个新的帖子出现(我希望如此),如果有问题、评论或澄清,可以随时给(mferg@mit.edu 发电子邮件。尽情享受吧!
免责声明:毫无疑问,有些人更有资格深入探讨我将涉及的问题和主题,从情感到神经形态计算。对于这些人来说,这个系列只是对这些主题的介绍,因此,如果为了简洁而省略或浓缩了一些内容,请见谅。我真的只是想要这个系列,以及激发它的课程,作为一个相关 AGI 主题的调查,这些主题通常在学习人工智能或人工智能时不会被教授。还要注意:这个系列与麻省理工学院或其品牌没有任何关系——我只是喜欢写一些我感兴趣的东西,麻省理工学院并不正式认可这里陈述的观点。
第一部分:什么是认知科学?
与心理学或神经科学相比如何?
"现实存在于人的头脑中,而不存在于其他地方."
―乔治·奥威尔, 1984
心灵的本质是什么?你是否等同于你所有的大脑过程,被裹得严严实实,为生活做好了准备?或者对你来说,除了记忆、感知和注意力过程的结合之外,还有什么别的东西吗?你是你的信仰、理想、目标和恐惧吗?本周,我们将对认知科学领域进行一次简短的旅行,看看其中有哪些概念对我们 AGI 人有所帮助和相关。让我们开始吧。
简而言之,认知科学是对思维及其过程的研究,包括:
- 注意:“我在关注什么?”
- 感知:“我在看什么?”
- 意识:“什么是我?”
- 记忆:“我是怎么记住事情的?”
- 理性:“我怎么做决定?”
- 自我:“谁是我?”
- 元认知:“关于思考的思考是什么?”
- 语言:“什么是语义?”
- 潜意识过程:“什么影响我的想法?”
- 思考(认知):“思考是什么意思?”
还有一个非常粗糙的类比,将大脑与运行思维“软件”的“硬件”联系起来。这种类比在某些层面上是站不住脚的,并且与所谓的计算机心理理论(认为大脑是一台计算机/计算机器)有所关联,但在很大程度上,这是对大脑和思维之间差异的一个很好的介绍。
来自斯坦福哲学百科全书[1]的 cog sci 的官方定义是:
认知科学是对思维和智力的跨学科研究,包括哲学、心理学、人工智能、神经科学、语言学和人类学。

大脑。3 磅瘦肉。来源:Robina Weermeijer viaun splash。****
希望现在你能明白为什么这个领域可能对人工智能研究人员有用:看看 DeepMind 和 AlphaGo 的成功就知道了。人工智能研究的许多方面都涉及到研究或再现一些作为认知过程基础的算法——为了试图再现这些算法,人们必须对他们所观察的现象的认知科学有坚实的理解。人工智能研究人员也是认知科学家已经有很长的历史了,现在仍然如此。
那么神经科学、认知科学和心理学的区别是什么呢?什么是认知神经科学?认知心理学?一切听起来都变得一样了……
这里有一个很好的概述:简而言之,神经科学是“最底层”,也就是最接近大脑硬件的,下面列表向下的每个领域都从这个硬件“向上”移动到更多的“软件”;从突触到心理过程到人类行为。微观到宏观,如果你愿意的话。
- 神经科学 关注的是脑的低级功能,在抽象的神经元/神经化学水平及其以下。
- 认知神经科学 专门针对头脑的过程的大脑(神经)基础,在大脑中寻找认知功能的“标记”。
- 认知科学 更上一层楼,关注的是头脑灌输的过程,如前一节所列。
- 认知心理学 定义起来有点棘手,但主要研究心理现象背后的心智过程。
- 心理学 主要关注人类行为和互动以及信息处理。
这些就是这些领域的差异,以一种非常粗略的方式。请注意,许多大脑/思维研究人员在以上所有方面都有经验,但最终大多专注于一两个一般领域以获得研究生学位。例如,麻省理工学院的 BCS 项目提供认知科学、系统神经科学、细胞和分子神经科学以及计算方面的研究生学位——但不包括心理学[2]。
因此,简而言之,认知科学研究的是思维及其过程。那么大脑又如何呢?
第二部分:对你大脑的基本介绍
比如说,真的是基本。比如神经 101 基础课的前 10 分钟。
人们应该知道,我们的快乐、喜悦、欢笑和玩笑,以及我们的悲伤、痛苦、悲伤和眼泪,都来自大脑,而且只能来自大脑。
――希波克拉底,公元前 400 年
W 大脑的基本解剖是什么?大脑分为三个主要部分[3]:
- 脑干
- 小脑
- 大脑

脑干是杆状的东西,小脑是右下的一小部分,大脑是大的上半部分。资料来源:Milad b . faku rian viaun splash。
…是连接脊髓的大脑基底的茎状部分。它控制着大脑和身体其他部分之间的信息流动,以及其他基本的身体功能,如呼吸、吞咽、心率、血压以及人是清醒还是困倦。它由中脑、脑桥和延髓组成。
接下来,梅菲尔德诊所【3】也给了我们一个关于小脑的很好的概述:
小脑位于脑干顶部(脊髓与大脑交汇处)的后面,由两个半球(两半)组成。它接收来自感觉系统、脊髓和大脑其他部分的信息,然后调节运动。它还协调随意运动,如姿势、平衡、协调和言语,从而产生平稳和平衡的肌肉活动。它对学习运动行为也很重要,但它只占大脑相对较小的一部分——约占总重量的 10%,但它包含了大脑神经元的大约一半。
最后,《大英百科全书》对大脑的最后一部分——大脑——有很大的研究:
大脑是大脑最大和最上面的部分,由大脑半球组成,占大脑总重量的三分之二。一个半球,通常是左半球,在功能上占主导地位,控制语言和言语。另一个半球解释视觉和空间信息。大脑半球由有髓神经纤维的内核、白质和灰质的外皮层组成。一般来说,大脑负责整合感觉冲动,指导运动活动,并控制高级智力功能。大脑皮层的灰质通常分为四个叶,大致由主要的表面褶皱定义。这些脑叶是额叶、顶叶、颞叶和枕叶。

所有这些大脑单词听起来都一样…来源:大卫·马托斯 via Unsplash 。
好的,这是很多信息——别担心,这只是一个调查,之后没有考试——我只是想给你一个很好的概述。那么,为什么所有这些谈论神经科学、认知科学和所有其他听起来像认知的科学呢?
第三部分:为了创造/理解 AGI,我们需要知道认知科学/神经科学中的哪些重要概念?
看看 AGI 人的几个相关话题
“现在在大脑中发现的工作原理可能会在未来提供比我们目前所能预见的更强大的机器……”
― J.Z. Young,《科学中的怀疑和确定:生物学家对大脑的思考》, 1960 年
如果你愿意的话,可以复述一下,你是一名来自计算机科学领域的游客,正在认知科学领域进行一次旅行。有哪些大的收获可以带给你的深度学习弟兄们,他们可能没有接触过?让我们来看看认知科学中的几个重要话题和主题,这将有助于我们稍后理解它们如何(或是否)可以在机器中复制。
首先出场的是 记忆 ,以及其鲜明的类型。所有的记忆都是一样的吗?不会。最大的区别在于长期记忆和短期记忆(也称为工作记忆):短时记忆通常可以同时处理 5-9 件事情,持续时间长达 18 秒左右,而 LTM 可以持续一生,但对编码的内容有选择性。另一种记忆二分法是陈述性和程序性:陈述性是关于事物的知识,通常被认为包括语义记忆(事实)和情景记忆(经历)。程序记忆是如何做事情,比如骑自行车,弹吉他和弦,或者在《光晕 3》中杀死一群圣约人野兽。**

如果你真的想让你的思维爆炸(哈哈),查一下“扩展思维理论”。资料来源:劳拉·富尔曼转自 Unsplash 。
接下来是的边缘系统:为此我们期待昆士兰大学【6】:**
…大脑中与行为和情绪反应有关的部分,尤其是当涉及到我们生存所需的行为时:喂食、繁殖和照顾后代,以及战斗或逃跑反应。你的边缘系统埋藏在大脑深处,大脑皮层之下,脑干之上。丘脑和下丘脑(产生重要的激素和调节口渴、饥饿、情绪等)和基底神经节(奖励处理、习惯形成、运动和学习)也参与其中。你的杏仁核位于海马体旁边,左右杏仁核在我们的情绪反应中起着核心作用,包括快乐、恐惧、焦虑和愤怒等感觉。杏仁核也将情感内容与记忆联系在一起。最后,海马体本质上是我们大脑的记忆中心。情景记忆被形成并分类,在大脑皮层的其他部分长期储存。

恐惧很大程度上是由边缘系统控制的。来源:Benjamin wede Meyer viaUnsplash。
还有数不清的其他认知科学现象和主题,涵盖这些将是有益的:我只是选择了上面的两个(和下面的一个)作为起点。其他可能包括视觉感知、音频/语言处理、认知周期和全局工作空间,以及意识。
最后介绍一个认知科学的话题,我们下周会深入探讨: 心智与大脑的本质 。认知科学和神经科学的圣杯是发现思维是如何从大脑中产生的。长久以来,哲学家们一直在争论到底是什么让你成为你;从苏格拉底到笛卡尔到佛陀。我们不可能希望回答一个 AGI 人是否有“头脑”的问题,除非我们能就是什么造就了头脑达成一致——这是一个巨大的问题,但一些答案正开始从现代神经科学的土地上浮现出来……

下周,威尔将介绍一些心灵哲学。资料来源:K . Mitch Hodge viaun splash。
TL;博士
本周快速总结
“只要我们的大脑是一个谜,宇宙,大脑结构的反映,也将是一个谜。”
―圣地亚哥·拉蒙·卡哈尔,西班牙医生,诺贝尔奖获得者
本周,我们研究了世界上的认知科学是什么(对思维的研究),以及它为什么与我们 AGI 人相关(记忆、注意力、感知等重要话题)。下周,我们将介绍一些奇特的心灵哲学,来讨论灵魂、心灵和同一性的本质。重磅消息,敬请关注!

西斯廷教堂里藏着大脑吗?来源:Calvin Craig viaUnsplash。
需要思考的进一步问题:
- 计算机能像人类一样拥有思维吗?
- 思维是否独立于实施它们的基质?
- 你认为大脑是从头脑中产生的,还是有其他东西缺失了?
关于作者
Mike Ferguson 是麻省理工学院 DiCarlo 实验室的计算研究开发人员。他将研究大脑评分工具,这是一种测量人工神经网络有多像大脑的工具。他将于 2021 年春天从弗吉尼亚大学毕业,获得计算机科学和应用数学学士学位,以及认知科学和哲学学士学位。他是《一周挑战》一书的参与者,在两年内阅读了超过 138 本关于人工智能、哲学以及对人类意味着什么的书籍。他和他的伯恩山犬“博伊·温斯顿”以及收养的边境牧羊犬“影子”住在弗吉尼亚州的夏洛茨维尔。
参考资料:
- 认知科学(斯坦福哲学百科全书)
- 研究生项目|大脑和认知科学(mit.edu)
- https://mayfieldclinic.com/pe-anatbrain.htm
- https://www . medicine net . com/script/main/art . ASP?articlekey=2517
- https://www.britannica.com/science/cerebrum
- 边缘系统——昆士兰脑研究所——昆士兰大学(uq.edu.au)
Docker 卷完全指南
了解 docker 卷的基础知识

在我们重启或移除容器后,容器生成和使用的数据不再持久。因此,我们可以使用 Docker 卷和绑定挂载来管理 Docker 容器中的数据,以解决这个问题。我们可以用它来持久化容器中的数据或者在容器之间共享数据。从这篇文章中,你将学习如何在你的项目中使用 Docker 卷和绑定挂载。
设置
Docker 使用以下类型的卷和绑定挂载来保存数据。对于这个设置,我使用的是 macOS。
- 匿名卷
- 命名卷
- 绑定安装
在这篇文章中,我们将运行一个 MySQL 服务器并执行一些命令。默认情况下,MySQL 会将其数据文件存储在容器的/var/lib/mysql目录中,Docker volumes 会帮助我们持久存储这些数据。
我们有三个 docker-compose.yml 文件来演示卷和绑定挂载。要启动这些文件,您需要使用以下命令。
docker compose up
一旦我们的容器开始运行,我们可以使用下面的命令在容器中创建一个表用于测试。
# Access the container
docker exec -it mysql_db_1 bash
# Connect to MySQL server
mysql -uroot -proot
# Run MySQL commands
USE test_db;
SHOW TABLES;
CREATE TABLE users (
user_id int NOT NULL AUTO_INCREMENT,
name VARCHAR(20),
PRIMARY KEY (user_id)
);
SHOW TABLES;
1.匿名卷
如果我们运行下面的 docker-compose.yml 文件,将会创建一个匿名卷。如果我们重启我们的容器,数据将是可见的,但不是在我们移除容器之后。此外,其他容器也无法访问它。如果我们想暂时保存数据,这是很有帮助的。这些卷是在/var/lib/docker/volume本地主机目录中创建的。
version: '3.8'
services:
db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: test_db
ports:
- "3306:3306"
volumes:
- /var/lib/mysql
正如我们所看到的,我们不必指定主机目录。我们只需要指定容器内的目录。
如果我们从 docker-compose.yml 文件中删除 volume 指令,容器将默认创建一个匿名卷,因为它是在 MySQL Dockerfile 中指定的。因此,MySQL 映像确保了我们在不提供任何卷信息的情况下仍然可以访问数据。
VOLUME /var/lib/mysql
现在,我们有一个带有随机标识符的匿名卷。
docker volume ls
DRIVER VOLUME NAME
local 4e679725b7179e63e8658bc157a1980f320948ab819f271fd5a44fe94c16bf23
让我们检查一下我们的码头集装箱。
docker inspect mysql_db_1
.
.
.
"Mounts": [
{
"Type": "volume",
"Name": "4e679725b7179e63e8658bc157a1980f320948ab819f271fd5a44fe94c16bf23",
"Source": "/var/lib/docker/volumes/4e679725b7179e63e8658bc157a1980f320948ab819f271fd5a44fe94c16bf23/_data",
"Destination": "/var/lib/mysql",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
.
.
.
我们可以使用下面的命令删除容器及其相关的匿名卷。
docker rm -v mysql_db_1
如果我们不将匿名卷和容器一起删除,它将成为悬挂卷。
docker rm mysql_db_1
我们可以使用以下命令列出并删除所有悬挂卷。
docker volume ls -qf dangling=true
docker volume rm $(docker volume ls -qf dangling=true)
2.命名卷
在我们重新启动或删除容器后,命名卷可以保存数据。此外,其他容器也可以访问它。这些卷创建在/var/lib/docker/volume本地主机目录中。
version: '3.8'
services:
db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: test_db
ports:
- "3306:3306"
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
这里,第一个字段是主机上卷的唯一名称。第二部分是容器中的路径。
此外,如果我们使用以下命令删除容器,我们将仍然拥有该卷,这与匿名卷不同。
docker rm -v mysql_db_1
3.绑定安装
在我们重启或移除容器后,绑定装载可以持久化数据。正如我们所看到的,命名卷和绑定装载是相同的,只是命名卷可以在特定的主机目录下找到,而绑定装载可以在任何主机目录下。
version: '3.8'
services:
db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: test_db
ports:
- "3306:3306"
volumes:
- $PWD/data:/var/lib/mysql
这里,我们正在装载一个主机文件夹。第一部分是主机中的路径。第二部分是容器中的路径。
命令
现在,让我们列出 volume 指令的所有可用命令。
docker volume --help
Commands:
create Create a volume
inspect Display detailed information on one or more volumes
ls List volumes
prune Remove all unused local volumes
rm Remove one or more volumes
我们可以使用这些命令来管理匿名卷和命名卷。
# Creat a volume
docker volume create test-vol
# test-vol
# Inspect a volume
docker inspect test-vol
# [
# {
# "CreatedAt": "2021-07-17T07:23:25Z",
# "Driver": "local",
# "Labels": {},
# "Mountpoint": "/var/lib/docker/volumes/test-vol/_data",
# "Name": "test-vol",
# "Options": {},
# "Scope": "local"
# }
# ]
# List all volumes
docker volume create test-vol-2
docker volume ls
# DRIVER VOLUME NAME
# local test-vol
# local test-vol-2
# Remove all volumes
docker volume prune
# WARNING! This will remove all local volumes not used by at least one container.
# Are you sure you want to continue? [y/N] y
# Deleted Volumes:
# test-vol
# test-vol-2
# Remove volumes
docker volume create test-vol-3
docker volume rm test-vol-3
# test-vol-3
docker volume create test-vol-4
docker volume create test-vol-5
docker volume rm test-vol-4 test-vol-5
# test-vol-4
# test-vol-5
我希望你对 Docker 卷和装订线有一个清晰的了解。它将帮助您为 Docker 项目持久化数据。编码快乐!
相关职位
神经网络多类分类完全指南
神经网络到底是什么?本文将向您全面完整地介绍如何从头开始编写神经网络,并使用它们进行多项式分类。包括 python 源代码。

作者照片:与朋友一起骑山地车 2018
神经网络反映了人脑的行为。它们允许程序识别模式并解决机器学习中的常见问题。这是执行分类而不是逻辑回归的另一种选择。在 Rapidtrade ,我们使用神经网络对数据进行分类并运行回归场景。这篇文章的源代码可以在 GitHub 上找到。
我们将使用来自 Kaggle 的数据集,你可以在这里下载。所以为了可视化我们将在本文中使用的数据,见下文。我们将使用它来训练网络根据 j 列对我们的客户进行分类。我们还将使用突出显示的 3 个特征对我们的客户进行分类。我需要 3 个特征来适应我的神经网络,这是最好的 3 个特征。

图 1:我们的数据集
请记住,我们将把所有的字母字符串值转换成数字。毕竟我们不能把字符串塞进方程;-)
这是一篇相当长的文章,分为两个部分:
- 介绍
- 把所有的放在一起
好运;-)
介绍
神经网络总是由层组成,如图 2 所示。这看起来很复杂,但是让我们把它拆开,让它更容易理解。

图 2:神经网络
一个神经网络有 6 个重要的概念,我将在这里简单解释一下,但在这一系列文章中会详细介绍。
- 权重 — 这些就像我们在其他算法中使用的 theta 的 *-层 — 我们的网络将有 3 层
- 前向传播 — 使用特征/权重来获得 Z 和一个
- 反向传播*
在这个系列中,我们将建立一个三层的神经网络。在进入正题之前,让我们快速讨论一下这些层次。
-输入层
参考上面的图 2,我们将这一层的结果称为 A1 。该图层的大小 (# units) 取决于我们数据集中要素的数量。
构建我们的输入层并不困难你只需简单地将 X 复制到 A1 ,但是添加一个所谓的偏向层,默认为“1”。
第 1 栏:偏向的图层默认为“1”
第 2 栏:“曾经结婚”我们的第一个特征,并被重新标记为 1/2
第 3 栏:“毕业”我们的第二个特征,并被重新标记为 1/2
第 4 栏:“家庭规模”我们的第三个特征

图 3:可视化 A1 —输入层
-隐藏层
参考上面的图 2,我们只有 1 个隐藏层,但是你可以为每个特征设置一个隐藏层。如果您有比我下面提到的逻辑更多的隐藏层,您将为每个隐藏层复制计算。
大小(单位数)由你决定,我们选择了#features * 2 ie。6 台。
该层是在向前和向后传播期间计算的。运行和这两个步骤后,我们计算每个单元的 Z2、A2 和 S2 。运行每个步骤后的输出如下。
正向传播
参考图 1,在这个步骤中,我们计算 Z2,然后是 A2。
- Z2 包含我们对隐藏层中的假设的计算结果。
- 而 A2 也包括偏置层(col 1)并且具有应用于来自 Z2 的每个单元的 sigmoid 函数。
因此,根据图 4,Z2 具有 6 列,A2 具有 7 列。

图 4:可视化 Z2 和 A2-隐藏层
反向传播
因此,在前向传播穿过所有层之后,我们然后执行反向传播步骤来计算 S2 。S2 被称为每个单元假设计算的δ。这用于计算该θ的梯度,随后,结合该单元的成本,帮助梯度下降计算出最佳θ/重量。

图 5:可视化 S2 的梯度
-输出层
我们的输出层给出了我们假设的结果。即。如果应用这些 thetas,我们对这些客户分类的最佳猜测是什么。大小(#单位)源自 y 的数字标签。如图 1 所示,有 7 个标签,因此输出层的大小为 7。
与隐藏层一样,这个结果是在向前和向后传播的 2 个步骤中计算出来的。运行这两个步骤后,结果如下:
正向传播
在向前推进期间,我们将为输出层计算 Z3 和 A3 ,就像我们为隐藏层所做的那样。参考上面的图 1,可以看到不需要偏置柱,下面可以看到 Z3 和 A3 的结果。

图 6:可视化 Z3 和 A3
反向传播
现在(参考图 1)我们有了 Z3 和 A3,让我们计算 S3 。由于 S3 只是一个基本的成本计算,从 Y 中减去 A3,所以我们将在接下来的文章中探索这些等式,但我们仍然可以看到下面的结果
把所有的放在一起
因此,上面是一个有点尴尬,因为它可视化的输出在每一层。我们在神经网络中的主要焦点是计算神经网络成本的函数。该函数的编码将采取以下步骤。
- 准备数据
- 设置神经网络
- 初始化一组权重/θ
- 创建我们的成本函数,它将
4.1 执行正向传播
4.2 计算正向传播
的成本4.3 执行反向传播 4.4 计算增量,然后从反向道具计算梯度。 - 执行成本优化
- 预测结果以检查准确性
1.准备数据
为了开始这个探索性的分析,首先导入库并定义使用 matplotlib 绘制数据的函数。根据数据的不同,并不是所有的图都要绘制。
嘿,我只是一个简单的内核机器人,而不是卡格尔比赛的大师!
from mpl_toolkits.mplot3d import Axes3D
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import LabelEncoder
import seaborn as sns
import matplotlib.pyplot as plt # plotting
import numpy as np # linear algebra
import os # accessing directory structure
import pandas as pd # data processing, CSV file I/O (e.g.
from scipy import optimize as optpd.read_csv)
import matplotlib.pyplot as plt
现在,让我们阅读我们的数据并快速浏览一下。
df = pd.read_csv(‘customertrain.csv’)
df.head()

图 4:可视化测向
做一个信息,我们可以看到我们有一些工作要做的空值以及一些对象字段转换成数字。
df.info()

图 8
因此,让我们将对象字段转换为数字,并删除我们不需要的列。
columns = [“Gender”,”Ever_Married”,”Graduated”,”Profession”,”Spending_Score”]
for feature in columns:
le = LabelEncoder()
df[feature] = le.fit_transform(df[feature])df = df.drop([“ID”,”Gender”,”Age”,”Profession”,”Work_Experience”,”Spending_Score”], axis=1)
df.dropna(subset=['Var_1'], inplace=True)df.head()

图 9 准备数据后的测向结果
使用 fit_transform 将我们的多项式类别编码成我们可以处理的数字。
yle = LabelEncoder()
df[“Var_1”] = yle.fit_transform(df[“Var_1”])
df.head()
填写缺失的特征
回归的一个重要部分是理解哪些特征缺失了。我们可以选择忽略所有缺少值的行,或者用 mode、median 或 mode 填充它们。
- 模式=最常见的值
- 中位数=中间值
- 平均值=平均
这里有一个方便的函数,你可以调用它,用你想要的方法来填充缺失的特性。我们将选择用平均值填充值。
经过下面的搞笑,你应该看到 7992 没有空值。
def fillmissing(df, feature, method):
if method == “mode”:
df[feature] = df[feature].fillna(df[feature].mode()[0])
elif method == “median”:
df[feature] = df[feature].fillna(df[feature].median())
else:
df[feature] = df[feature].fillna(df[feature].mean()) features_missing= df.columns[df.isna().any()]
for feature in features_missing
fillmissing(df, feature= feature, method= “mean”)df.info()
提取 Y
让我们将 Y 列提取到一个单独的数组中,并将其从 dataframe 中移除。
Y = df[“Var_1”]df = df.drop([“Var_1”], axis=1
现在把我们的 X 和 y 列复制到矩阵中,以便于以后的矩阵操作。
X = df.to_numpy() # np.matrix(df.to_numpy())
y = Y.to_numpy().transpose() # np.matrix(Y.to_numpy()).transpose()
m,n = X.shape
规格化特征
现在,让我们将 X 归一化,使其值介于-1 和 1 之间。我们这样做是为了让所有的特征都在一个相似的范围内。我们使用下面的等式

执行标准化的目标是将所有特征降低到一个共同的比例,而不扭曲值范围的差异。这一重定要素等级的过程使得它们的均值为 0,方差为 1。
2.设置神经网络
现在,我们可以设置我们的神经网络的大小,首先,下面是我们要放在一起的神经网络。
在下面的初始化中,确保实现了上述网络。所以,现在你会问“合理的数字是多少?”
- 输入层=设置为尺寸的大小
- 隐藏层=设置为输入层* 2
- 输出层=设置为 y 的标签大小。在我们的例子中,这是 7 个类别
input_layer_size = n # Dimension of features
hidden_layer_size = input_layer_size*2 # of units in hidden layer
output_layer_size = len(yle.classes_) # number of labels
3.初始化重量(θs)
事实证明,对于梯度下降来说,这是一个相当重要的话题。如果你没有处理过梯度下降,那么先查一下这篇文章。从上面可以看出,我们需要 2 组砝码。(用表示)。
我们仍然经常称这些重量为θ,它们的意思是一样的。
我们需要一套 2 级的 thetass 和一套 3 级的 theta。每个θ是一个矩阵,大小为(L) * size(L-1)。因此如上所述:
- θ1 = 6×4 矩阵
- θ2 = 7×7 矩阵
我们现在必须猜测哪个初始 thetas 应该是我们的起点。这里,epsilon 来拯救我们,下面是 matlab 代码,可以轻松地为我们的初始权重生成一些随机的小数字。
def initializeWeights(L_in, L_out):
epsilon_init = 0.12
W = np.random.rand(L_out, 1 + L_in) * 2 * \
epsilon_init - epsilon_init
return W
如上所述,在对每个θ的大小运行上述函数后,我们将得到一些好的小随机初始值,如图 7 所示。对于上面的图 1,我们提到的权重指的是下面矩阵的第 1 行。

图 7:初始θ
4.成本函数
我们需要一个函数来实现用于执行分类的两层神经网络的神经网络成本函数。
在 GitHub 代码中,checknn.py 我们名为 nnCostFunction 的成本函数将返回:
- 梯度应该是神经网络偏导数的“展开”向量
- 最后的 J 是这个重量的成本。
我们的成本函数需要执行以下操作:
- 将 nn_params 重新整形为参数θ1 和θ2,这是我们的 2 层神经网络的权重矩阵
- 执行正向传播以计算(a)和(z)
- 执行反向传播以使用(a)计算(s)
因此,我们的成本函数首先需要将 theta 重新整形为隐藏层和输出层的 theta。
# Reshape nn_params back into the parameters Theta1 and Theta2,
# the weight matrices for our 2 layer neural networkTheta1 = nn_params[:hidden_layer_size * \
(input_layer_size + 1)].reshape( \
(hidden_layer_size, input_layer_size + 1))
Theta2 = nn_params[hidden_layer_size * \
(input_layer_size + 1):].reshape( \
(num_labels, hidden_layer_size + 1))# Setup some useful variables
m = X.shape[0]
4.1 正向传播
前向传播是神经网络的重要组成部分。这并不像听起来那么难。
在图 7 中,我们可以看到去掉了很多细节的网络图。我们将重点介绍第二级的一个单元和第三级的一个单元。这种理解可以复制到所有单位。注意我们可以做的矩阵乘法(图 7 中蓝色部分)来执行正向传播。
我在每一层显示一个单元的细节,但是你可以重复所有层的逻辑。

图 7:神经网络正向传播
在我们展示正向推进代码之前,让我们谈一谈正向推进过程中需要的两个概念。
4.1.1 乙状结肠功能
既然是做分类,我们就用 sigmoid 来评估我们的预测。sigmoid 函数是一种数学函数,具有特征性的“S”形曲线或 sigmoid 曲线。sigmoid 函数的一个常见示例是逻辑函数,如图一所示,由以下公式定义

在 github 中,checknn.py 创建了以下方便的函数:
- sigmoid 是计算输入参数 Z 的 sigmoid 的简便函数
- sigmoidGradient 计算在 z 处计算的 sigmoid 函数的梯度。无论 z 是矩阵还是向量,这都应该有效。
def sigmoid(z):
g = np.frompyfunc(lambda x: 1 / (1 + np.exp(-x)), 1, 1)
return g(z).astype(z.dtype)def sigmoidGradient(z)
return sigmoid(z) * (1 - sigmoid(z))
4.1.2 正规化
我们将实现正则化,因为数据科学专业人员面临的最常见问题之一是避免过度拟合。过度拟合会给你一种情况,你的模型在训练数据上表现得非常好,但是不能预测测试数据。神经网络很复杂,使它们更容易过度拟合。正则化是一种对学习算法进行轻微修改以使模型更好地概括的技术。这反过来也提高了模型在不可见数据上的性能。
如果你研究过机器学习中正则化的概念,你会有一个公平的想法,正则化惩罚系数。在深度学习中,它实际上惩罚了节点的权重矩阵。
我们在 nnCostFunction 中通过传递一个 lambda 来实现正则化,该 lambda 用于惩罚计算的梯度和成本。
4.1.3 实施正向推进
根据图 1,让我们计算 A1。你可以看到它几乎是我的 X 的特征,我们在前面添加了硬编码为“1”的 bias 列。下面是实现这一点的 python 代码:
# Add ones to the X data matrix
a1 = np.insert(X, 0, 1, axis=1)
现在,结果将为您提供图 4 中 A1 的结果。特别注意前面增加的偏差栏“1”。
很好,A1 完成了,让我们继续 A2。在我们得到 A2 之前,我们将首先运行一个假设来计算 Z2。一旦你有了假设,你就可以通过 sigmoid 函数得到 A2。同样,根据图 1,将 bias 列添加到前面。
# Perform forward propagation for layer 2
z2 = np.matmul(a1, Theta1.transpose())
a2 = sigmoid(z2)
a2 = np.insert(a2, 0, 1, axis=1)
好了,我们快到了…现在在 A3 上,让我们做与 A2 相同的事情,但是这一次,我们不担心添加偏差列。
z3 = np.matmul(a2, Theta2.transpose())
a3 = sigmoid(z3)
你可能会问,“我们为什么要保留 Z2&Z3】。嗯,我们在反向传播中需要这些。所以我们最好把它们放在手边;-).
4.2 计算前进支柱的成本
在我们继续之前,如果您了解我们的 Y 列(图 9 ),其中包含用于对客户进行分类的标签。然后,为了计算成本,我们需要将 Y 重新格式化为一个与标签数量相对应的矩阵。在我们的案例中,我们的客户有 7 个类别。
图 8 显示了如何将 Y 转换为矩阵 y_one_hot,并且标签现在在适当的列中显示为二进制。
# turn Y into a matrix with a new column for each category and marked with 1
y_one_hot = np.zeros_like(a3)
for i in range(m):
y_one_hot[i, y[i] - 1] = 1

图 8:将 Y 从 vector 映射到矩阵 y_one_hot
现在我们有了矩阵形式的 Y,让我们看看计算成本的等式。

嗯,这非常复杂,但好消息是,通过一些矩阵操作,我们可以用如下几行 python 代码来完成。
# Calculate the cost of our forward prop
ones = np.ones_like(a3
A = np.matmul(y_one_hot.transpose(), np.log(a3)) + \
np.matmul((ones - y_one_hot).transpose(), np.log(ones - a3))J = -1 / m * A.trace()
J += lambda_ / (2 * m) * \
(np.sum(Theta1[:, 1:] ** 2) + np.sum(Theta2[:, 1:] ** 2))
4.3 执行反向传播
因此,我们简化了图 1 中的神经网络,首先只显示了细节:
- 从 Y 减去 A1(3)计算 S3
- 此后,使用下面提到的θ乘以 S3 来计算线性方程。S2。

由于一张图片描绘了 1000 个单词,图 9 应该解释我们用什么来计算 S3 以及随后的 S2(用红色标记)。

图 9:反向传播
从(3)中,我们了解了我们的权重(θs)是如何初始化的,所以只是为了可视化图 9 所指的权重(φ),参见下面的图 10。

图 9:反向传播中使用的权重
因此,有了矩阵操作的帮助,正向传播在 python 中并不是一件困难的事情
# Perform backward propagation to calculate deltas
s3 = a3 - yv
s2 = np.matmul(s3, Theta2) * \
sigmoidGradient(np.insert(z2, 0, 1, axis=1))# remove z2 bias column
s2 = s2[:, 1:]
4.4 从反向道具计算坡度
我们需要返回梯度作为我们的成本函数的一部分,这是需要的,因为梯度下降是在反向属性中发生的过程,其中目标是基于权重 w 在相反方向上连续重新采样模型参数的梯度,持续更新,直到我们达到函数 J(w) 的全局最小值。

反向推进方程
简单来说,我们用梯度下降最小化代价函数, J(w) 。

图 10
再一次,矩阵操作拯救了它,只需要几行代码。
我们的第一步是计算一个可以用来调整我们的成本的惩罚。如果你想要一个关于正规化的解释,那么看看这篇文章。
# calculate regularized penalty, replace 1st column with zeros
p1 = (lambda_/m) * np.insert(Theta1[:, 1:], 0, 0, axis=1)
p2 = (lambda_/m) * np.insert(Theta2[:, 1:], 0, 0, axis=1)
对于成本优化,我们需要反馈这组特定权重的梯度。图 2 显示了梯度一旦被绘制出来。对于输入到我们的成本函数的权重集,这将是绘制线的梯度。
# gradients / partial derivitives
Theta1_grad = delta_1 / m + p1
Theta2_grad = delta_2 / m + p2
grad = np.concatenate((Theta1_grad.flatten(),
Theta2_grad.flatten()), axis=None)
然而,成本优化函数不知道如何处理 2θ,所以让我们把它们展开成一个向量,结果如图 5 所示。
grad = np.concatenate((Theta1_grad.flatten(),
Theta2_grad.flatten()), axis=None)
好了,哇,这是很多信息,但我们的成本函数已经完成,让我们继续运行梯度下降和成本优化。
5.执行成本优化
5.1 验证我们的成本函数
一件很难理解的事情是我们的成本函数是否表现良好。检查这一点的一个好方法是运行一个名为 checknn 的函数。
创建一个小的神经网络来检查反向传播梯度,它将输出由反向传播代码产生的分析梯度和数值梯度(使用 computeNumericalGradient 计算)。这两个梯度计算应该产生非常相似的值。
如果你想更深入地研究这种技术背后的理论,这在吴恩达的机器学习课程第 4 周是很难的。
您不需要每次都运行,只需在第一次设置成本函数时运行即可。
这里就不放代码了,但是在 checknn.py 里面检查一下 github 项目有没有以下功能:
- 检查梯度
- 去基尼化权重
- 计算美国梯度
运行 cheecknn 之后,您应该会得到以下结果

图 11:验证我们的成本函数的结果
5.2 梯度下降
梯度下降是一种优化算法,主要用于寻找函数的最小值。在机器学习中,梯度下降用于更新模型中的参数。参数可以根据算法而变化,例如线性回归中的系数和神经网络中的权重。我们将使用 SciPy 优化模块来运行我们的梯度下降。
from scipy import optimize as optprint('Training Neural Network... ')
# Change the MaxIter to a larger value to see how more
# training helps.
options = {'maxiter': 50, 'disp': True}# You should also try different values of lambda
lambda_ = 1;# Create cost function shortcuts to be minimized
fun = lambda nn_params: nnCostFunction2(nn_params, input_layer_size, hidden_layer_size, output_layer_size, xn, y, lambda_)[0]jac = lambda nn_params: nnCostFunction2(nn_params, input_layer_size, hidden_layer_size, output_layer_size, xn, y, lambda_)[1]# Now, costFunction is a function that takes in only one
# argument (the neural network parameters)res = opt.minimize(fun, nn_params, method='CG', jac=jac, options=options)nn_params = res.x
cost = res.fun
print(res.message)print(cost)

图 12:运行梯度下降的结果
通过使用 reshape 为每一层获取我们的 thetas
# Obtain Theta1 and Theta2 back from nn_paramsTheta1 = nn_params[:hidden_layer_size * (input_layer_size +
1)].reshape((hidden_layer_size, input_layer_size + 1))Theta2 = nn_params[hidden_layer_size * (input_layer_size +
1):].reshape((output_layer_size, hidden_layer_size + 1))
6.预测结果以检查准确性
现在我们有了最佳权重(thetas ),让我们使用它们来进行预测,以检查准确性。
pred = predict(Theta1, Theta2, X)print(f’Training Set Accuracy: {(pred == y).mean() * 100:f}’)
你应该得到 65.427928%
的准确率,是的,有点低,但那是我们正在处理的数据集。我用物流回归& SVM 测试了这个数据集,得到了相同的结果。
结论
我希望这篇文章能让你对神经网络有更深层次的理解,以及你如何用它来分类数据。让我知道你怎么走…
多项式完全指南
多项式到底是什么?本文将向您全面完整地介绍多项式,包括一些源代码。

来源:肖恩·安斯林拍摄于 2014 年飞越南极洲。我想知道那会是什么形状的多项式?
1.介绍
需要简单易懂的多项式介绍吗?提前阅读或在 youtube 上观看本教程。您也可以从 github 下载本文中的源代码。
线性回归的问题是数据通常不是直线的。如果我们看下面的数据集,一个线性函数是完全有意义的。

来源:图为德斯莫斯
多项式由以下公式定义

2.多项式的次数(转折点)
多项式的形状取决于次数项的数量,我已经在下面解释过了,所以正如你所看到的,一旦你理解了多项式的形状,你就可以开始计算它可能是哪一次了。一些学位的名称如下所示。
- 蓝色=线性多项式
- 黑色=二次多项式
- 红色=三次多项式

来源:绘制在 desmos 上
3.过度拟合/欠拟合
因此,增加多项式的次数,可以让直线更好地拟合数据。但是,要小心,过高也会“过度拟合”数据,也不会给你一个准确的预测。

来源:在 desmos 上绘制
4.常数或指数变化的影响
现在让我们看看其他一些二次函数,看看当我们改变 x 的系数时会发生什么。我们将使用一个数值表来绘制图形,但我们将只填写那些靠近函数转折点的值。

您可以在表格的每一行中看到对称性,这表明我们已经将注意力集中在每个函数转折点周围的区域。我们现在可以使用这些值来绘制图表。

来源:在 desmos 上绘制
你为什么不登录www.desmos.com并绘制下面的多项式。尝试改变系数和常数项,看看形状的变化。

来源:在 desmos 上绘制
5.分解多项式
理解多项式如何因式分解很重要。这将允许稍后理解如何计算零来指示 x 轴上的截距。如果你喜欢看,那就看看我的 youtube 教程。
事实上,因式分解的过程是如此重要,以至于在不理解它的情况下,很少能完成超过这一点的代数。
例 1:带有 GCF 的二次型
理解这一点最简单的方法是做一个例子,假设我们有多项式:

所以,我们的第一步是看看能不能找到最大公因式(gfc)。在这种情况下,它将是 3,因此这允许我们将每一项除以 3。这导致:

现在,我们需要将 8 分解成 2 个数字,它们相乘应该等于 8,但是相加等于 6:
8
/ \
-4 -2
所以,-4 * -2 = 8,而-4–2 = 6
现在我们有了-4 和-2,我们可以因式分解我们的多项式如下:
F(x) = (x — 4) (x — 2)
在我们的因式分解多项式或原始多项式中插入一个 x 值,会得到相同的结果。
示例 2:没有 GCF 的二次函数
现在,当没有 gcf 的时候呢?让我们来看看多项式:

我们的第一步是将第一个系数乘以常数项。
Ie。2 * -3 = -6
现在,让我们找出两个数字,它们乘以-6,但也加到-5
-6
/ \
-6 +1
下一步是扩展我们的“- 5x”术语,以使用上述数字。记住
-6x+1x = 5x。

所以,让我们把这两部分分开

从第一个红色部分,我们可以去掉 2x,所以 2x 2–6x 变成

我们的第二部分,我们可以分解 1,得到:1(x-3)。
所以,我们以

很好,让我们把(x-3)分解掉,我们最终得到一个分解的多项式
f(x) = (x-3) (2x + 1)
示例:分组的三次多项式因子
处理二次多项式的方法如上所述,那么现在,我们如何处理分解一个三次多项式。

看看我们能否通过划分系数来分组。在下面的例子中,两者给我们的值都是 1.5,所以我们可以通过分组进行因式分解。
3/2 == -12/8 == -1.5
将上述分为两项,并对其进行分解。我们第一项的 GCF 是 x2,而第二项的 GCF 是-4。

现在,让我们分解各项,我们可以分解出(3x — 2)

这留下了一个问题,因为我们有一个完美的正方形的差异。我们可以如下纠正这一点,取 x2 和 4 的平方根,将这一项分成两项,最后得到最终的因式多项式。
f(x) = (3x -2) (x — 2) (x + 2)
什么是多项式的零点?
如果你喜欢看,那就去 youtube 。
我们需要它们只是因为我们经常在物理和其他情况的建模中使用多项式!零非常有用,因为它有助于找到根。那么,为什么要找到根源呢?
好吧,假设我们知道我们有问题,

那么,x 能是什么呢?
如果我们把一边化为零,问题就变得简单多了。

现在,我们可以把它代入二次公式,求出 x。
当然,你可能会说这只适用于二次型。然而,给定任意一个多项式,如果让它等于零,求根就变得容易多了。
所以,回答你的问题,我们实际上不需要零,但是它们真的很方便!
如果我们取以下分解多项式:
P1(x) = (x-1)(x-2)(x-3)
好吧,那么 x 的任何值,其中上面的等式=“零”。
所以任何时候上面 3 个表达式中的任何一个都是零,那么自然地所有 3 的乘积也将是零

因式分解后,这变得很容易推导,正如我们可以看到,当 x 是 1,2 或 3,P1(x)的结果将是零。
让我们再举一个例子,我们可以用图表来表示。

从上面我们可以看到,当 x = [-2,-3/2,2]时,我们的 3 个项都为零的点。当我们画出这个多项式时,它在图中也很明显。

来源:图为德斯莫斯
我相信这可以清除零,这些可以在下一篇文章中看到,当我们讨论多项式的重数时。
6。多项式的多重性
简单来说,重数是多项式穿过 x 轴的次数。如果你喜欢看,去 YouTube看看。
让我们以下面两个已经是因子形式的多项式为例。

所以,在我们的下一步中,如果我们想计算多项式的重数,我们可以看到我们有多少个单独的零项。在上面的例子中。我们下面的第一步是计算出每一项下的零值。

因此,如果我们创建一个表,我们现在可以在重数列中输入,对于这个零 x 值,我们有多少个零项。

如果重数是奇数,那么我们有一个符号变化,而如果重数是偶数,那么我们没有符号变化。这告诉我们:
- 对 P1 来说,因为所有的重数都是奇数,所以每当它碰到 x 轴,它就会改变符号。
- 然而,对 P2 来说,当它达到 3 时,符号没有变化,因为多重数是偶数。
你可以在下面的动作中看到这一点,每次 P1 接触 x 轴时,它从负变为正,反之亦然。
然而,当 x=1 时,P2 确实从负变为正,但是当 x=3 时,它反弹并保持正。

来源:在 desmos 上绘制
7.Matlab 中多项式的编码
是我们开始编码的时候了,系好安全带,让我们试一试…
github 上的源代码。
如果取以下多项式:

现在,如果我们将下面的 x 值代入上述等式,我们将得到下面的 y 结果。

你现在可以启动 Matlab,创建你的 x 和 y 向量如下。然后运行 polyfit 命令,在最后一个参数中输入 2,因为我们使用的是二次函数。
x=[0,1,2]
y=[5,3,3]
polyfit(x,y,2)
运行以上,你应该得到一个如下的系数。很好,从我们的数据中,polyfit 找到了正确的多项式系数。
ans =1.0000 -3.0000 5.0000
这是一个很好的基本例子,但是让我们来尝试一些更复杂的例子。
7.1 生成样本数据
在这个例子中,我们没有数据集,但没关系,我们可以让 Matlab 生成一些样本数据来拟合我们的二次方程。首先,让我们定义我们的二次函数如下,称之为 f 。
clc;
clear;
close all;% declare our quadratic polynomial
f = @(x) 2*x.² — 4*x + 5;
现在,让我们使用 unifrnd 函数生成一些样本 x 值。我们用 + 1.5randn(size(x))给 y 值添加一些变化。*毕竟,我们不希望数据太完美;-)
% Create x by getting random uniform values between -1 and 5
x = unifrnd(-1, 5, [100,1]);% Calculate y by running the polynomial but add some variations
y = f(x) + 1.5 * randn(size(x));
绘制数据点,这样我们就可以可视化数据
% plot the data points
figure;
plot(x,y,’rx’);
执行后,您将看到我们已经生成了一个很好的数据集来补充我们的二次函数。

来源:来自 matlab 的屏幕截图
7.2 找到我们的最佳系数
现在我们有了数据,让我们对二次曲线进行拟合,找出最佳系数。我们选择二次曲线,因为我们可以看到在 x 轴上大约“1”处的数据中有一圈,因此形状符合二次曲线。
% find the best coeffeciant
[p,S] = polyfit(x,y,2);
我们现在有了 p 的最佳系数,可以用 polyval 为我们的系数画一条线了。
xx = linspace(-1, 5, 100); % generate even spaced xx
[yy, delta] = polyval(p,xx,S); % Now get the y for xx
hold on;
plot(xx,yy);
执行后,您的系数应该被绘制出来

来源:来自 matlab 的屏幕截图
7.3 绘制我们的支撑线/阻力线
一个很好的小特性是,我们可以使用从 polyval 返回的 delta 来绘制多项式的支撑线和阻力线。这些图给了我们 90%的信心,数据将落在这些范围内。
% Lets use our delta to plot our support and resistance lines
plot(xx, yy + 2*delta, ‘b:’);
plot(xx, yy — 2*delta, ‘b:’);

来源:截图来自 Matlab
8 结论
阅读完本文后,您应该能够:
- 解释什么是多项式
- 因式分解多项式
- 计算零点
- 理解多项式的多重性
最后,我们在 Matlab 中构建了一个很好的示例,创建了具有二次多项式形状的数据。这就给出了你的假设,基于 X 值来预测 Y。
R 平方、调整 R 平方和伪 R 平方完全指南

线性模型和均值模型(图片由作者
了解如何使用这些方法来评估线性和某些非线性回归模型的拟合优度
回归分析中最常用也是最常被误用的之一是 R(读作 R 平方)。它有时被称为它的长名字:决定系数,它经常与相关系数 r 混淆。看,它已经变得令人困惑了!
R 的技术定义是,它是响应变量 y 中方差的比例,您的回归模型能够通过回归变量的引入来“解释”。
显然,这并不能消除误会。
因此,我们呼吁熟悉的视觉线性回归线叠加在云的 (y,x) 点:

平坦的水平橙色线代表平均模型。均值模型是可以为数据构建的最简单的模型。对于每个 x 值,均值模型预测相同的 y 值,该值就是你的 y 向量的均值。在这种情况下,它恰好是 38.81 x 10000 新台币/坪,其中一坪是 3.3 米。
在解释 y 的方差方面,我们可以比均值模型做得更好。为此,我们需要添加一个或多个回归变量。我们将从这样一个变量开始——房子的年龄。图中红线表示线性回归模型拟合到(y,X)数据集时的预测,其中y=房价,X=房龄。如您所见,单变量线性模型比均值模型更适合。
R 让您量化与均值模型相比,线性模型拟合数据的程度。
让我们放大上图的一部分:

均值模型的预测误差(图片由作者提供)
上图中, (y_i — y_mean) 是均值模型在预测 y_i 时产生的误差。如果对y的每个值计算这个误差,然后计算每个误差的平方和,就会得到一个与y中的方差成正比的量。它被称为 TSS 平方的总和。****

总平方和(TSS)(图片由作者提供)
平方和的总和与数据的方差成正比。这是均值模型无法解释的方差。
因为 TSS/N 是 y 中的实际方差,所以 TSS 与数据中的总方差成比例。
作为平方和,任何数据集的 TSS 总是非负的。
均值模型是一个非常简单的模型。它只包含一个参数,即因变量 y 的平均值,表示如下:

平均模型(图片由作者
均值模型有时也被称为零模型或仅截距模型。但是这种定义的可互换性仅在零模型或仅截距模型被拟合时才是适当的,即在数据集上被训练。只有这样截距才会成为y的无条件均值。
如前所述,如果你想比均值模型更好地解释 y 中的方差,你需要添加一个或多个回归变量。让我们仔细看看添加回归变量房屋年龄如何帮助线性模型减少预测误差:

线性模型的预测误差(图片由作者)
上图中, (y_i — y_pred_i) 是线性回归模型预测 y_i 的误差。这个量被称为残差或简称为残差。

残差(图片由作者提供)
在上图中,残差明显小于均值模型的预测误差。这种改进是不保证的。在次优或构造不良的线性模型中,残差可能大于平均模型的预测误差。
如果你为每个 y 的值计算这个残差,然后计算每个这样的残差的平方和,你会得到一个与线性模型的预测误差成正比的量。它被称为 RSS 平方和的残差。

残差平方和(RSS)(图片由作者提供)
残差平方和捕捉自定义回归模型的预测误差。
作为平方和,回归模型的 RSS 总是非负的。
因此,(残差平方和)/(总平方和)是【y】中总方差的分数,这是您的回归模型无法解释的。
相反地:
1 —(残差平方和)/(总平方和)是你的回归模型能够解释的中方差的分数。**
我们现在将根据 RSS 和 TSS 来陈述 R 的公式如下:

R 平方公式(图片由作者提供)
下面是生成上述图形的 Python 代码:
这里是数据集的链接。
R 的范围
对于使用普通最小二乘(OLS)估计技术拟合(即训练)的线性回归模型,R 的范围是 0 到 1。考虑以下情节:

总误差和残差(图片由作者
从上图可以看出,残差 (y_i — y_pred_i) 小于总误差 (y_i — y_mean)。可以证明,如果使用 OLS 技术,即通过最小化残差平方和(RSS)将线性回归模型拟合到上述数据,最差的结果是均值模型。但是均值模型的残差平方和就是 TSS,即对于均值模型,RSS = TSS。
因此对于 OLS 线性回归模型, RSS ≤ TSS 。
由于 R =1 — RSS/TSS ,在完全拟合的情况下,RSS=0,R =1。最差情况下,RSS=TSS,R = 0。
对于普通的最小二乘线性回归模型,R 的范围是从 0 到 1
R 对非线性回归模型的适用性
许多非线性回归模型不而使用普通的最小二乘估计技术来拟合模型。这种非线性模型的例子包括:
- 用于在范围(-∞,∞)内连续变化的y 的指数、伽玛和逆高斯回归模型。**
- 二元选择模型,如 Logit(又名逻辑)和 Probit 及其变体,如用于 y = 0 或 1 的有序 Probit,以及二项式回归模型的一般类别。
- 离散非负的【ϵ[0,1,2,…, ∞】的泊松、广义泊松和负二项回归模型。即基于计数的数据集模型。**
这些非线性模型的模型拟合过程不是基于逐步最小化残差平方和(RSS ),因此最佳拟合模型可能具有大于总平方和的残差平方和。这意味着,这种模型的 R 可以是一个负数。因此,对于大多数非线性模型,R 不是有用的拟合优度度量。
对于大多数非线性回归模型,r 平方不是有用的拟合优度度量。
一个显著的例外是使用非线性最小二乘** ( NLS )估计技术拟合的回归模型。NLS 估计量寻求最小化残差的平方和,从而使 R 适用于 NLS 回归模型。**
在本文的后面,我们将研究非线性回归模型的 R 平方的一些替代方法。
线性模型 R 平方的替代公式
我们再来看下图:

解释错误(ESS)(图片由作者提供)
在上图中, (y_pred_i — y_mean) 是我们通过向模型中添加回归变量 HOUSE_AGE_YEARS 而实现的预测误差减少。
如果你计算每一个 y 值的差值,然后计算每一个差值的平方和,你将得到一个与y 中的方差成比例的量,这是线性回归模型能够解释的。它被称为 ESS 平方的解释和。**

解释平方和(ESS)(图片由作者提供)
解释的平方和与您的回归模型能够解释的数据方差成比例。****
让我们做一些数学。
从上面的情节可以看出:

OLSR 模型的 R 平方替代公式的推导(图片由作者提供)
可以看出当使用最小二乘估计技术拟合线性回归模型时,项2 (y _ I—y _ pred)(y _ pred—y _ mean)为 0。**
所以对于 OLS 回归模型的特例:

适用于 OLSR 模特的身份(图片由作者)
换句话说:

OLSR 模型的 R 平方的替代公式(图片由作者提供)
例子
我们用来说明这些概念的线性回归模型已经适用于新北市房地产数据集的策划版本。让我们看看如何建立这个线性模型,并找到它的 R 值。
我们将从导入所有需要的库开始:
****import** pandas **as** pd
**from** matplotlib **import** pyplot **as** plt
**from** statsmodels.regression.linear_model **import** OLS **as** OLS
**import** statsmodels.api **as** sm**
接下来,让我们使用 Pandas 读入数据文件。您可以从这里下载数据集。
**df = pd.read_csv(**'taiwan_real_estate_valuation_curated.csv'**, header=0)**
打印前 10 行:

新北市房地产数据前 10 行 se t(图片由作者
我们的因变量 y 为房价单位面积我们的解释变量又称为回归变量 X 为房屋年龄年限。
我们将雕刻出 y 和 X 矩阵:
**y = df[**'HOUSE_PRICE_PER_UNIT_AREA'**]
X = df[**'HOUSE_AGE_YEARS'**]**
由于房龄为零的房屋,即新的房屋也将有一些非零价格,我们需要添加一个 y 截距。这就是直线方程中的'β0':y _ pred=β1X+β0*****
*X = sm.**add_constant**(X)*
接下来,我们构建并拟合 OLS 回归模型,并打印培训摘要:
*olsr_model = **OLS**(**endog**=y, **exog**=X)
olsr_results = olsr_model.**fit**()
print(olsr_results.**summary**())*
下面是我们得到的输出:

OLSR 模型的输出(图片由作者提供)
我们看到 R 是 0.238。r 不是很大,表明房价单位面积和房龄年限之间的线性关系很弱。
拟合模型的方程如下:
HOUSE _ PRICE _ PER _ UNIT _ AREA _ pred =-1.0950 * HOUSE _ AGE _ YEARS+50.6617。
房子的年龄和它的价格之间有一种微弱的负相关。而零楼龄的房子,预计单位面积的均价为 50.6617 x 10000 新台币/坪。
如何增加 R 平方
某种程度上,这就像在问如何变得富有或者如何减肥?俗话说,小心你的要求,因为你可能会得到它!
在 OLS 线性回归模型中增加 R 的简单方法是加入更多的回归变量,但这也会导致模型过度拟合。
要了解为什么向 OLS 回归模型添加回归变量不会降低 R,请考虑使用 OLS 技术拟合的两个线性模型:
y _ pred=β1X1+β0*
y _ pred=X2+β1X1+β0******
OLS 估计技术使残差平方和(RSS)最小化。如果第二个模型没有比第一个模型提高 R 的值,OLS 估计技术将把【β2】设置为零或某个统计上不重要的值,这将使我们回到第一个模型。一般来说,每次您添加一个新的回归变量并使用 OLS 重新调整模型,您将获得一个具有更好 R 的模型,或者与更受约束的模型具有基本相同的 R。**
OLS 的这种属性估计会对你不利。如果您继续添加越来越多的变量,模型将变得越来越不受约束,过度适应训练数据集的风险也将相应增加。
另一方面,添加正确选择的变量将增加模型的拟合优度,而不会增加过度拟合训练数据的风险。
我们增加 R 的愿望和最小化过度拟合的需要之间的斗争导致了另一种拟合优度度量的产生,称为调整的 R .
调整-R
Adjusted-R 背后的概念很简单。为了得到调整后的-R,我们每增加一个新的回归变量就要罚 R。
具体来说,我们通过与回归变量的数量成正比的因子来缩放(1-R)。模型中回归变量的数量越多,比例因子就越大,R 的向下调整也越大。
调整后 R 的公式为:

调整后的 R 公式(图片由作者提供)
df_mean_model 是均值模型的自由度。对于大小为 N 的训练数据集, df_mean_model=(N-1) 。
df_model 是回归模型的自由度。对于有 p 个回归变量的模型, df_model=(N-1-p) 。
替换为:

调整后的 R 公式(图片由作者提供)
可以看到,随着模型获得更多的变量, p 增加,并且因子 (N-1)/(N-1-p) 增加,这具有抑制 R 的效果。
调整-R 的缺点
Adjusted-R 存在一些问题,特别是:
- 它平等地对待所有回归变量的影响。实际上,在使模型适合(或过度适合)训练数据的能力方面,一些变量比其他变量更有影响力。
- 当 R 低于 p/(N-1)时,调整后的 R 的公式产生负值,从而将调整后的 R 的使用限制为仅高于 p/(N-1)的 R 值。
使用 Adjusted-R 比较两个线性模型的拟合优度
我们将使用我们的示例数据集来说明使用 Adjusted-R 的过程。为此,让我们引入另一个回归变量NUM _ conveniency _ STORES _ IN _ AREA,并根据数据集重新调整我们的 OLS 回归模型:
****y = df[**'HOUSE_PRICE_PER_UNIT_AREA'**]
X = df[[**'HOUSE_AGE_YEARS'**, **'NUM_CONVENIENCE_STORES_IN_AREA'**]]
X = sm.**add_constant**(X)olsr_model = **OLS**(endog=y, exog=X)
olsr_results = olsr_model.**fit**()****
让我们打印模型培训总结:

具有两个回归变量的 OLSR 模型的输出(图片由作者提供)
请注意,具有两个回归变量的模型的 R 和调整后 R 是具有一个变量的模型的两倍多:

一元和二元 OLSR 模型的 R 和调整后 R 的比较(图片由作者
总的来说,新回归变量的加入提高了拟合优度。回归参数系数的 p 值进一步支持了这一结论。我们从回归输出中看到,2 变量 OLSR 模型中所有三个系数的 p 值基本为零,表明所有参数都具有统计显著性:

具有两个回归变量的 OLSR 模型的参数(图片由作者
拟合的双变量模型的方程如下:
HOUSE _ PRICE _ PER _ UNIT _ AREA _ pred =-0.7709 * HOUSE _ AGE _ YEARS+2.6287 * NUM _ 便利店 _IN_AREA + 36.9925
非线性回归模型中的 r
非线性模型通常使用模型拟合技术,如最大似然估计(MLE) ,这些技术不一定会使残差平方和(RSS)最小化。因此,给定两个使用 MLE 拟合的非线性模型,拟合优度较大的模型可能具有较低的 R 或调整后的 R。这一事实的另一个结果是,向非线性模型添加回归变量会降低 R。总体而言,R 或调整后的 R 不应用于判断非线性回归模型的拟合优度。
对于非线性模型,已经提出了一系列的替代方案。我们将研究一个这样的替代方案,它基于我们已经非常熟悉的以下等式:
总平方和(TSS) =残差平方和(RSS) +解释平方和(ESS)。
虽然这个恒等式适用于 OLS 线性回归模型,也称为线性模型,但对于非线性回归模型,事实证明,类似的三角形恒等式使用偏差的概念起作用。我们稍后会解释偏差的概念,但现在,让我们来看看非线性回归模型的这种同一性:**
仅截距模型的偏差=拟合的非线性模型的偏差+由拟合的非线性模型解释的偏差。
符号方面:

非线性回归模型的偏差单位(图片由作者提供)
其中:
D(y,y _ mean)=仅截取模型的偏差
D(y,y _ pred)=拟合的非线性模型的偏差
D(y _ pred,y _ mean)=拟合非线性模型解释的偏差
使用上述恒等式,Cameron 和 Windmeijer 描述了(参见文章末尾的论文链接)以下基于偏差的 R 公式,该公式适用于非线性模型,尤其适用于拟合离散数据的广义线性回归模型(称为 GLMs)。这种非线性模型的常见例子是泊松和广义泊松模型、负二项式回归模型和逻辑回归模型:

用于离散数据的非线性模型的 Pseu-R(图片由作者提供)
在我们继续之前,有些术语需要解释一下。
异常
回归模型的偏差通过拟合回归模型的对数似然(更多关于对数似然)比饱和模型的对数似然大多少来衡量。具体来说,****

拟合回归模型的偏差(图片由作者提供)
所以这回避了两个问题:什么是饱和模型和什么是可能性?****
饱和模型
饱和回归模型是回归变量的数量等于样本数据集中唯一 y 值的数量的模型。饱和模型给你的本质上是 N 个变量的 N 个方程,我们从大学代数中知道,N 个变量的 N 个方程的系统产生每个变量的精确解。因此,可以构建饱和模型来完美地拟合每个 y 值。因此,饱和模型最大可能地符合您的训练数据集。
可能性
现在让我们来解决可能性。拟合回归模型的似然性是使用拟合模型的预测作为概率分布函数的平均参数,联合观察训练数据集中所有 y 值的概率(或概率密度)。计算可能性的过程如下:****
- 假设你的训练数据集包含 100 个 y 观察值。你要计算的是用你拟合的回归模型观察到 y1 和 y2 和 y3 和……直到 y100 的联合概率。****
- 因此,您首先要根据这些训练数据拟合您的回归模型。
- 接下来,通过拟合的模型输入训练集中的 100 行,以从该模型获得 100 个预测。这 100 个 y_pred_i 值就是您的 100 个条件平均值(具有平均值的取决于您的 X 矩阵中相应的具有行的)。
- 现在,您在的概率(密度)函数中设置 100 个观察到的 y 值和 100 个条件均值(预测值)以获得 100 个概率值。 y 中每个 y_i 一个概率。
- 最后,你把这 100 个概率相乘得到可能性值。这是在给定拟合模型的情况下观察训练数据集的可能性。
为了对计算有个感觉,我建议你参考下面的文章。它包含泊松模型似然性的示例计算:
******
对数似然就是拟合模型似然的自然对数。
有了这些概念,让我们回到伪 R 的基于偏差的公式:

用于离散数据的非线性模型的 Pseu-R(图片由作者提供)
如前所述:
D(y,y _ pred)=拟合的非线性模型的偏差
D(y,y _ mean)=仅截距模型的偏差(又名空模型)。零模型仅包含截距,即没有回归变量。
使用我们的异常公式:

拟合回归模型的偏差(图片由作者提供)
而且,

零模型的偏差(图片由作者提供)
因此:

用于离散数据的非线性模型的 Pseu-R(图片由作者提供)
有时会使用麦克法登提出的以下更简单版本的伪 R (详情见下文论文链接):

麦克法登的伪 R(图片由作者
麦克法登的伪 R 由 Python statsmodels 库实现,用于离散数据模型,如泊松或负经济或逻辑(Logit)回归模型。如果你调用[DiscreteResults.prsquared()](https://www.statsmodels.org/stable/generated/statsmodels.discrete.discrete_model.DiscreteResults.prsquared.html?highlight=prsquared#statsmodels.discrete.discrete_model.DiscreteResults.prsquared),你将得到你拟合的非线性回归模型上麦克法登的 R 平方值。
有关如何在基于离散(计数)的数据集上拟合此类非线性模型,请参见我的泊松和负双项回归模型教程:
另请查看:
参考文献、引文和版权
数据集
叶以智、徐东光(2018)。通过案例推理用比较法建立房地产估价模型。应用软件计算,65,260–271。
纸质和图书链接
Cameron A. Colin,Trivedi Pravin K ., 计数数据回归分析 ,计量经济学学会专论№30,剑桥大学出版社,1998 年。国际标准书号:0521635675
McCullagh P .,Nelder John A ., 广义线性模型 ,第二版。,CRC 出版社,1989,ISBN 0412317605,9780412317606
d .麦克法登(1974), 定性选择行为的条件逻辑分析 ,载于:p .扎伦布卡(编。),计量经济学前沿,学术出版社,纽约,105–142 页。 PDF 下载链接
卡梅伦和弗兰克温德梅杰。(1996).应用于医疗保健利用的计数数据回归模型的 R 平方测量。商业杂志&经济统计, 14 (2),209–220。doi:10.2307/1392433PDF 下载链接
A.Colin Cameron,Frank A.G. Windmeijer,https://www.sciencedirect.com/science/article/pii/S0304407696018180一些常见非线性回归模型拟合优度的 R 平方度量,计量经济学杂志,第 77 卷,1997 年第 2 期,第 329-342 页,ISSN 0304-4076,
https://doi . org/10.1016/s 0304-4076(96)01818-0PDF 下载链接
名词(noun 的缩写)J. D. Nagelkerke, 关于决定系数 一般定义的注记,《生物计量学》,第 78 卷,第 3 期,1991 年 9 月,第 691-692 页,【https://doi.org/10.1093/biomet/78.3.691】T4。 PDF 下载链接
形象
本文中的所有图片版权归 Sachin Date 所有,版权归 CC-BY-NC-SA 所有,除非图片下面提到了不同的来源和版权。
相关文章
*
感谢阅读!如果你喜欢这篇文章,请 关注我 获取关于回归和时间序列分析的技巧、操作和编程建议。*******
简单技术交流的复杂艺术

杰斯·贝利在 Unsplash 上的照片
作为一名编辑如何让我成为一名更好的数据科学家
我最初被数据科学吸引是因为它在解决大量复杂问题方面具有不可思议的潜力,我认为今天许多从事数据科学家工作的人也是如此。对于几乎任何问题,都可以收集一个数据集,通过它可以收集洞察力并开发解决方案。因此,非常恰当的是,数据科学家是一个非常多样化的群体,他们最大的特点可能是永不满足的好奇心和解决问题的热情——我认为这是该领域最大的优势。
然而,尽管我的同龄人多种多样,但当我在做了一段时间全职妈妈后重新进入就业市场时,我想知道我最近的经历是否会让我成为数据科学职位申请者中的害群之马。具体来说,在离开上一份全职数据科学家的工作后,我花了大约两年时间做技术编辑。我假设招聘经理认为这种经历很奇怪——如果脱离上下文来看,这很奇怪——但它也极大地影响了我对复杂信息的呈现方式的思考,正因为如此,它使我成为了一名更强大的数据科学家。
在本文中,我将讨论数据科学中交流的重要性,以及用编辑的眼光查看技术信息的好处。
通信在数据科学中的重要性
在许多公司中,数据科学家跨越了业务领域和技术领域之间的鸿沟。从这个角度来看,数据科学家类似于一个解释者,他与客户和利益相关者一起定义业务问题,然后将这些问题转化为技术程序或研究,可以遵循这些程序或研究来获得洞察力。通常,在实施解决方案之前,必须将这些见解重新翻译成可交付的语言和技术可行性。
由于数据驱动项目的迭代和多学科方面,有许多地方可能会发生误解。
可以想象,随着项目的发展,这个定义、翻译和再翻译的过程会重复到令人作呕。此外,由于数据驱动项目的迭代和多学科方面,有许多地方可能会发生误解。因此,沟通是项目流程和成功的关键。更具体地说,如果数据科学家不能从利益相关者提供的信息中提取特定的业务问题,那么他或她可能会浪费大量的时间和资源探索似是而非的途径。此外,如果数据科学家无法清晰、令人信服地展示从分析中得出的见解,那么利益相关者可能不会支持实施提议的解决方案。
尽管数据科学家在商业和技术之间发挥着核心作用,但许多职位描述都强调熟悉数十种平台和方法的重要性,而只为书面和口头交流等所谓的软技能保留一两个要点。我认为这种不均衡是不公平的,原因有两个:(1)如上所述,它没有准确地描述沟通在数据科学角色中的重要性;(2)它意味着,虽然技术技能来之不易,并且是基本的,但沟通技能很容易获得,并且不太重要。
软技能很难学
我是一个害羞的孩子,所以当我决定本科学习化学工程时,我在工程师是出了名的不善于沟通的刻板印象中找到了安慰。我认为,如果工程师被认为不善于沟通,那么通过成为一名工程师,我可以安全地保持在害羞的外壳中。然而,在完成学士学位后,我决定攻读(非常多学科的)分析硕士学位,我很快意识到,我必须放弃我的外壳的温暖和熟悉,才能沿着这条新的职业道路茁壮成长。在我的第一个学期开始之前,在为期一周的训练营中,我和我的同事们在回顾该计划的背景材料时,强调了沟通和合作在分析中的重要性。
我对技术技能比沟通技能更重要、更难掌握的暗示感到失望。
忠实于其多学科的重点,该计划主办了定期课程中没有涉及的主题的网络活动和研讨会。一个这样的研讨会——一个为期六周的公众演讲课程——是我在研究生期间上的最难的课。每次我不得不发言时,我都非常紧张,当我想起我关于我对小猫的爱的即兴独白时,我仍然会因尴尬而退缩。(我不知道为什么我选择谈论小猫;那时我甚至没有一只小猫。)尽管如此,我并不后悔我的参与,因为尽管我对公开演讲的恐惧并没有完全减轻,但我现在在众人面前演讲比我想象的要舒服得多。
因此,鉴于我最初与沟通的斗争,当我看到工作描述列出了几种机器学习方法的名称,而忽略了提及沟通时,我对技术技能比沟通技能更重要、更难掌握的暗示感到失望。具体来说,作为一个最初出于对人际交往的恐惧而选择技术舒适的人,我知道,虽然我可以很快学会一种不熟悉的方法论背后的理论,但如果我不花费更多的努力来学习软技能,我就不可能获得类似的舒适。
编辑眼光的好处
当我和丈夫从克利夫兰搬到费城,以便他能在我们的家乡从事法律工作时,我选择了自由职业,而不是找一份全职的数据科学工作。我最初的计划是寻找分析项目,但没过多久,我就陷入了编辑研究手稿的持续工作中。令我惊讶的是,我如此喜欢编辑,以至于在两年的大部分时间里,这成了我唯一的收入来源。
想一想,不同背景或技能的人对信息(无论是口头交流还是视觉交流)的理解会有什么不同。
技术编辑以两种方式满足了我的好奇心:(1)我每周可以阅读 20 多篇来自计算、工程和数学等领域的研究论文,(2)我有足够的空闲时间探索长期被忽视的兴趣,如心理学。此外,我对语言学和交流产生了热情:我编辑的许多论文都是非英语母语者写的,看到讲不同母语的人如何以不同的方式利用英语令人着迷;最终,我可以通过单词的节奏来区分中国报纸和巴西报纸。然而,最重要的是,在编辑一篇论文时,我不得不解释作者的意图,并把文章塑造成一种形式,在保持这种意义的同时提高简洁和清晰。
对我来说,编辑过程突出了文字表达思想的无数方式,以及轻微的歧义掩盖句子意义的巨大力量。因此,虽然我不一定建议每个从事数据科学家工作的人都花时间从事自由编辑,但我确实相信,所有数据科学家都可以从我作为编辑学到的同理心课程中受益:为了向不同的受众传达复杂的想法,思考信息——无论是口头还是视觉传达——如何被不同背景或技能的人不同地理解。
结论
最终,我厌倦了剪辑。到了两年的时候,破译作者意图所需的大部分工作变成了第二天性,编辑过程变得重复。因此,在编辑了近 2000 份手稿(并指导我的儿子度过婴儿期)后,我离开了编辑的岗位,去咨询数据科学项目。我已经有大约两年没有关注数据科学了;然而,在从事我的第一个项目时,我意识到我比以前的角色更自信了:我更善于倾听客户的意见,界定业务问题,并将这些问题转化为可操作的计划,我能够对我的方法和工作结果提供更强有力的书面和口头解释——所有这些都归功于我通过编辑获得的沟通赞赏。
所以总的来说,我走向数据科学的道路可能有点奇怪,但我更愿意认为它是多样化的,这是它最大的优势。
神经网络的组成部分
对构建最常用的深度学习方法之一的关键部分的总结
本文是我正在撰写的关于机器学习关键理论概念的系列文章的延续。除了对 ML 的介绍,我还写了关于分类和回归的文章,可以在我的 页面 访问。

马库斯·斯皮斯克在 Unsplash 上拍摄的照片
介绍
神经网络是深度学习的典范,深度学习是机器学习的一部分,其特点是使用大量交织的计算。单个计算本身相对简单,但正是连接的复杂性赋予了它们高级的分析能力。
神经元
神经网络的构建模块是单个神经元。下图显示了具有一个输入的中子的结构。

作者图片
神经元的输入是 x,它有一个与之相关的权重 w。权重是固有参数,是模型为了更好地拟合输出而控制的参数。当我们将一个输入传递给一个神经元时,我们将它乘以它的权重,得到 x * w。
输入的第二个元素称为偏置。因为节点的值是 1,所以偏差仅由值 b 决定。偏差给我们的模型增加了不可预测性的因素,这有助于它一般化,并使我们的模型在使用测试数据时能够灵活地适应不同的未知输入。
偏差和输入的组合产生了我们的输出 y,给出了公式 w*x + b = y。这应该看起来很熟悉,因为它是对直线方程 y = mx + c 的修改。神经网络由数十、数百甚至数千个相互连接的神经元组成,每个神经元都运行自己的回归。本质上是类固醇的退化。
多端输入
自然,我们将无法使用如上图那样简单的回归来分析我们在现实世界中遇到的大多数数据集。我们将会看到更多的输入被组合起来估计输出。这是以与具有一个输入的神经元相似的方式实现的。

作者图片
上述等式的公式将读作 x0 * w0 + x1 * w1 + x2 * w2 + b = y。
层
神经网络将神经元组织成层。其中每个神经元都与其下一层中的所有其他神经元相连的层被称为密集层。

作者图片
通过这种不断增加的复杂性,神经网络能够以各种复杂的方式转换数据并推断关系。随着我们向网络中添加更多的层和节点,这种复杂性也在增加。
激活功能
目前,我们的模型仅适用于预测数据中的线性关系。在上图中,与一系列回归相比,运行这个神经网络没有任何好处。
神经网络以两种方式提供了解决方案。第一个是在输入和输出之间增加更多层的能力,称为隐藏层。这些隐藏层中的每一层都将具有预定数量的节点,并且这种增加的复杂性开始将神经网络与其回归对应物分开。
神经网络增加复杂性的第二种方式是通过在每个不是输入或输出的节点引入一个激活 功能。如果你对这个术语不熟悉,我肯定会查看我以前写的关于线性分类的文章,这篇文章更深入地研究了激活函数,但是总结一下,激活函数是一个使用非线性方法转换输入数据的函数。Sigmoid 和 ReLu 是最常用的激活函数。

作者图片
这两个模型都是非线性的这一事实意味着我们为我们的模型添加了另一个适应性元素,因为它现在可以预测没有线性决策边界或近似非线性函数的类。用最简单的话来说,没有激活函数,神经网络只能学习线性关系。如果不引入激活函数,像 x 曲线这样简单的对象的拟合将是不可能的。
因此,隐藏层中神经元的作用是获取输入及其权重的乘积之和,并将该值传递给激活函数。这将是作为输入传递给下一个神经元的值,无论它是另一个隐藏神经元还是输出。

作者图片
优化重量
当神经网络初始化时,其权重是随机分配的。神经网络的强大之处在于它可以通过调整这些权重来控制大量的数据。网络迭代地调整权重并测量性能,继续这个过程,直到预测足够准确或达到另一个停止标准。
我们预测的准确性由一个损失T2 函数决定。也称为成本函数,该函数将模型输出与实际输出进行比较,并确定我们的模型在估计数据集时有多差。本质上,我们为模型提供了一个旨在最小化的函数,它通过增量调整权重来实现这一点。
损失函数的常见度量是均值 绝对值 误差,平均误差。这测量了估计值和它们的实际值之间的绝对垂直差的总和。

作者图片
寻找最佳权重集的工作由优化器完成。在神经网络中,使用的优化方法是随机梯度下降下降。
每个时间周期或时期,随机梯度下降算法将重复某一组步骤,以便找到最佳权重。
- 从权重的初始值开始
- 不断更新我们知道会降低成本函数的权重
- 当我们达到数据集的最小误差时停止
梯度下降需要一个可微分的算法,因为当我们找到最小值时,我们通过计算我们当前位置的梯度,然后决定向哪个方向移动以达到我们的梯度 0。我们知道误差函数的梯度等于 0 的点是曲线上的最小点,如下图所示。

作者图片

作者图片
我们迭代的算法,即梯度下降算法的步骤 2,采用我们当前的权重,并从中减去微分成本函数乘以所谓的学习率,学习率的大小决定了我们收敛或偏离最小值的速度。在我关于线性回归的文章中,我对梯度下降的过程有更详细的解释。
过度和不足
过度拟合和欠拟合是机器学习的两个最重要的概念,因为它们可以帮助你了解你的 ML 算法是否能够达到其真正的目的,被释放到世界上并遇到新的未知数据。
数学上,过度拟合被定义为训练数据的准确性大于测试数据的准确性的情况。不适应通常被定义为在训练和测试方面表现不佳。
那么这两个实际上告诉我们关于我们的模型什么呢?嗯,在过度拟合的情况下,我们基本上可以推断出我们的模型不能很好地概括看不见的数据。它获取了训练数据,而不是找到我们正在寻找的这些复杂、精密的关系,它建立了一个基于观察到的行为的严格框架,将训练数据视为真理。这个模型没有任何预测能力,因为它过于依赖提供给它的初始数据,而不是试图概括和适应略有不同的数据集。
在拟合不足的情况下,我们发现了相反的情况,我们的模型根本没有将自己附加到数据上。与之前类似,该模型无法找到强关系,但在这种情况下,它生成了松散的规则来提供数据的粗略估计,而不是任何具体的东西。因此,欠拟合模型在训练数据上的表现也会很差,因为它缺乏对变量之间关系的理解。
避免欠拟合通常比它的对应物更直接,因为一般认为欠拟合模型不够复杂。我们可以通过向模型中添加层、神经元或特征,或者增加训练时间来避免欠拟合。
一些用于避免过度适应的方法与避免适应不足正好相反。我们可以移除一些要素,尤其是那些与数据集中已经存在的其他要素相关的要素,或者那些与我们的输出几乎没有相关性的要素。更早地停止模型还可以确保我们获得更通用的模型,而不是让它过度分析我们的数据。
在某些情况下,过度拟合可能是由于模型过度依赖于某一组权重或我们神经网络中的路径而发生的。在训练期间,该模型可能已经发现,我们的神经网络的一部分中的某一组权重提供了与输出的非常强的相关性,但是这与其说是实际关系的发现,不如说是巧合。如果出现这种情况,那么当提供测试数据时,模型将无法提供相同级别的准确性。
我们这里的解决方案是引入辍学的概念。辍学背后的概念是,在我们培训过程的每一步,从本质上排除网络的一部分。这将帮助我们在整个网络中生成更均匀的权重,并确保我们的模型不会过于依赖任何一个子部分。
这就是你对神经网络组成部分的总结。我希望在以后的文章中更详细地介绍更多的概念,所以请密切关注这些概念!接下来是评估模型。如果你对我以前的文章感兴趣,也可以关注我的页面。在那之前,✌️.
神经网络中人工神经元(感知器)的概念
神经网络和深度学习课程:第一部分

来自 Pixabay 的 Clker-Free-Vector-Images 的图片(左图)和作者用 draw.io 制作的图片(右图)
今天,我们正式开始我们的 神经网络和深度学习课程 正如这里介绍的。我们将从对神经网络中人工神经元(感知器)概念的扎实介绍开始。
人工神经元 (也叫 感知器 , 单元 或 节点 )是神经网络中最简单的元素或积木。它们的灵感来自于人类大脑中的生物神经元。
在本文中,我们将讨论感知器是如何受到生物神经元的启发,绘制感知器的结构,讨论感知器内部的两个数学函数,最后,我们将在感知器内部执行一些计算。
感知机是如何受到生物神经元的启发的?
人工神经元(感知器)如何受到生物神经元的启发,值得探讨。您可以将人工神经元视为受生物神经元启发的数学模型。

来自 Pixabay 的Clker-Free-Vector-Images的图像(在左边)和作者的图像(在右边),使用 draw.io 制作
- 一个生物神经元通过树突(小纤维)接收来自其他神经元的输入信号。同样,一个感知器通过输入神经元接收来自其他感知器的数据。
- 树突与生物神经元的连接点称为突触。同样,输入和感知器之间的连接被称为权重。他们衡量每个输入的重要性水平。
- 在生物神经元中, 核 根据树突提供的信号产生输出信号。同样,感知器中的 核心 (蓝色)基于输入值执行一些计算,并产生一个输出。
- 在一个生物神经元中,输出信号由 轴突 带走。同样,感知器中的轴突是输出值,它将是下一个感知器的输入。
感知器的结构
下图显示了感知器的详细结构。在某些情况下,偏差 b 用 w0 表示。输入值 x0 总是取值 1。所以, b*1 = b 。

感知器的结构(图片由作者提供,用 draw.io 制作)
一个感知器接受输入, x1 , x2 ,…, xn ,将它们乘以权重, w1 , w2 ,…, wn ,并添加偏置项, b,,然后计算线性函数, z ,激活函数,f
在画感知器时,为了方便起见,我们通常忽略偏置单元,并将图表简化如下。但是在计算中,我们仍然考虑偏差单位。

没有偏差单元的感知器的简化版本(图片由作者提供,使用 draw.io 制作)
感知器内部
感知器通常由两个数学函数组成。
感知器的线性函数
这也被称为感知器的线性组件。用 z 表示。其输出是输入加上偏置单元的加权和,计算公式如下。

感知器的线性函数(图片由作者提供,用 draw.io 制作)
- x1 、 x2 、…、 xn 是取数值的输入。单个神经元可以有几个(有限的)输入。它们可以是原始输入数据或其他感知器的输出。
- w1 、 w2 、…、 wn 为 权重 取数值,控制每个输入的重要程度。值越高,输入越重要。
- w1.x1 + w2.x2 + … + wn.xn 称为输入的加权和。
- b 称为 偏置项 或 偏置单元 也是取数值。它被添加到输入的加权和中。包含偏置项的目的是移动每个感知器的激活函数,以不得到零值。换句话说,如果所有的 x1 、 x2 、…、 xn 输入都为 0,则 z 等于 bias 的值。
在神经网络模型中,权重和偏差被称为 参数 。这些参数的最佳值在神经网络的学习(训练)过程中找到。
你也可以把上面的 z 函数想象成一个线性回归模型,其中权重被称为 系数 ,偏差项被称为 截距 。这只是用来在不同的上下文中标识同一事物的术语。
感知器的非线性(激活)功能
这也被称为感知器的非线性部分。用 f 表示。它应用于 z 上,根据我们使用的激活函数类型得到输出 y 。

(图片由作者提供,用 draw.io 制作)

(图片由作者提供,用 draw.io 制作)
功能 f 可以是不同类型的激活功能。

激活功能的类型(图片由作者提供,使用 draw.io 制作)
由于有许多不同类型的激活函数,我们将在另一篇文章中详细讨论它们。现在,记住激活函数的目的是向网络引入非线性就足够了。如果没有激活函数,神经网络只能模拟线性关系,而不能模拟数据中存在的非线性关系。在现实世界的数据中,大多数关系是非线性的。因此,如果没有激活功能,神经网络将毫无用处。
“激发一个神经元”是什么意思?
为此,考虑下面的 二进制步骤 激活函数,也称为 阈值激活函数 。我们可以为阈值设置任何值,这里我们指定值为 0。

二进制步进激活函数(图片由作者提供,用 draw.io 制作)
我们说,只有当 z 的值超过阈值 0 时,神经元或感知机才会激发(或激活)。换句话说,如果 z 的值超过阈值 0,则神经元输出 1(触发或激活)。否则,它输出 0。
因此,激活函数的类型决定了神经元如何激活或激发,而偏置项 b 控制了激发的难易程度。现在考虑线性函数, z 。
z =(w1 . x1+w2 . x2+…+wn . xn)+b
z =(输入的加权和)+ bias
假设偏差为-2。这里,我们也考虑二元阶跃激活函数。因此,只有当输入的加权和超过+2 时,神经元才会激活。用数学术语来说,这可以表示如下。
为了激活神经元,根据上面定义的二进制阶跃激活函数,它应该输出 1。它只发生在,
z > 0
(输入加权和)+ bias > 0
(输入加权和)> -bias
在我们的例子中,当偏差为-2 时,
(输入的加权和)> -(-2)
(输入的加权和)> 2
因此,在这种情况下,输入的加权和应该超过+2,以激发或激活神经元。
在感知器内执行计算
让我们在感知内部进行一个简单的计算。假设我们有 3 个输入,值如下。
**x1=2**, **x2=3** and **x3=1**
因为我们有 3 个输入,所以我们也有 3 个权重来控制每个输入的重要程度。假设重量值如下。
**w1=0.5**, **w2=0.2** and **w3=10**
偏差单位也有以下值。
**b=2**
我们来计算一下线性函数, z 。
z =(0.5 * 2+0.2 * 3+10 * 1)+2
z = 13.6
激活函数将 z (13.6)的输出作为其输入,并根据我们使用的激活函数类型计算输出 y 。现在,我们使用下面定义的激活函数。

Sigmoid 激活函数(图片由作者提供,用 draw.io 制作)
y = sigmoid(13.6)
y = 0.999
y ~ 1
整个计算过程可以用下图表示。为了便于理解,我们也在单独的节点中表示偏置项。

感知器内部的计算过程(图片由作者提供,用 draw.io 制作)
恭喜你!你已经成功地在感知器中完成了计算。
摘要
感知器是一种数学模型,其中线性函数和非线性激活函数一起工作来计算输出,该输出可以是下一个感知器的输入或者仅仅是最终输出。
我们在感知器中使用激活函数用于以下目的。
- 它给网络带来了非线性。它使神经网络能够模拟现实世界数据中常见的非线性关系。
- 激活函数的类型决定了神经元应该如何激发或激活。
- 它将 z 的输出值保持在一定的范围内。例如,sigmoid 激活功能将 z 的值保持在 0 和 1(包括 0 和 1)的范围内。无论 z 的值是大是小。
事实上,没有激活函数的神经网络只是线性回归模型,只能对数据中的线性关系进行建模。
感知器的参数是权重和偏差。权重控制每个输入的重要程度。偏置项具有以下功能。**
- 如上所述,它决定了神经元点火或激活的难易程度。
- 它移动每个感知器的激活函数以不得到零值。有时,零值可能会影响网络的训练过程。
随着感知器数量的增加,神经网络中可能有数千个参数(权重和偏差)。如前所述,这些参数的最佳值在神经网络的学习(训练)过程中找到。因此,参数(权重和偏差)从我们提供的数据中学习它们的最佳值。
本课程第 1 部分到此结束。第 2 部分见。
一如既往,祝大家学习愉快!
通过 订阅我的 邮件列表 ,再也不要错过精彩的故事。我一点击发布按钮,你就会在收件箱里收到每一篇文章。
如果你愿意,你可以 注册成为会员 以获得我写的每一个故事的全部信息,我将收取你一部分会员费。
鲁克山·普拉莫迪塔
2021–12–26
逻辑回归背后的概念
Sigmoid 函数、对数损失、优势比、模型系数、指标

米凯尔·布隆维斯特摄于佩克斯
逻辑回归
逻辑回归是用于分类的监督机器学习算法之一。在逻辑回归中,因变量是分类变量。
模型的目标是,给定独立变量,类可能是什么?[对于二元分类,0 或 1]
在本文中,我介绍了以下概念。
- 逻辑回归如何使用 sigmoid 函数来预测类?
- 哪个成本函数用于确定最佳拟合的 sigmoid 曲线?
- 什么是赔率,赔率比,对数赔率?
- 如何解读模型系数?
- 如何从模型系数中得到优势比?
- 用于评估模型的指标是什么?
- 如何利用 ROC 曲线设置阈值?
为什么不是线性回归?
在逻辑回归-二元分类中,我们将输出预测为 0 或 1。
举例:
- 糖尿病患者(1)或非糖尿病患者(0)
- 垃圾邮件(1)或火腿(0)
- 恶性(1)或非恶性(0)
在线性回归中,产量预测将是连续的。所以,如果我们拟合一个线性模型,它不会预测 0 到 1 之间的输出。
因此,我们必须使用 sigmoid 函数将线性模型转换为 S 曲线,这将在 0 和 1 之间转换输入。
Sigmoid 函数
sigmoid 函数用于将输入转换为范围 0 和 1。

- 如果 z → -∞,则 sigmoid(z) → 0
- 如果 z → ∞,则 sigmoid(z) → 1
- 如果 z=0,则 sigmoid(z)=0.5

Sigmoid 曲线[图片由作者提供]
因此,如果我们将线性模型输入到 sigmoid 函数,它将在范围 0 和 1 之间转换输入
在线性回归中,y 的预测值通过使用下面的等式来计算。

在逻辑回归中, ŷ是 p(y=1|x)。这意味着 ŷ 提供了对 y=1 的概率的估计,给定一组特定的自变量(x) →如果预测值接近 1,则意味着我们可以更确定该数据点属于第 1 类。
→如果预测值接近 0,意味着我们可以更确定该数据点属于 0 类。
如何确定最佳拟合的 sigmoid 曲线?
价值函数
为什么不用最小二乘法作为代价函数?
在逻辑回归中,实际的 y 值将是 0 或 1。预测的 y 值 ŷ 将在 0 和 1 之间。
在最小二乘法中,误差是通过减去实际 y 值和预测 y 值并将它们平方来计算的
误差=(y- ŷ)
如果我们为错误分类的数据点计算最小二乘,比如说
y=0,而 ŷ 接近 1,误差只会非常小。
即使对于错误分类的数据点,产生的成本也非常少。这是原因之一,最小二乘法没有被用作逻辑回归的成本函数。
成本函数—对数损失(二元交叉熵)
对数损失或二元交叉熵被用作逻辑回归的成本函数

让我们检查分类成本函数的一些属性
- 如果 y= ŷ ,误差应该为零
- 错误分类的误差应该很高
- 误差应该大于或等于零。
让我们检查一下这些性质是否适用于对数损失或二元交叉熵函数。
- 如果 y=ŷ,误差应该为零。
情况 1: y=0 且 ŷ =0 或接近 0

情况二:y=1, ŷ =1 或接近 1。

ln1 =0 且 ln0 = -∞时
2.错误分类的误差应该很高
情况 1: y=1 且 ŷ=0 或接近 0

情况 2: y=0 且 ŷ=1 或接近 1

对于错误分类的数据点,误差往往非常高。
3.误差应该大于或等于零。
误差= -{y ln ŷ + (1-y) ln (1-ŷ)}
→ y 为 0 或 1
→ ŷ始终在 0 和 1 之间
→ ln ŷ为负,ln (1-ŷ)为负
→在包含表达式以使误差为正之前的负号【在线性回归最小二乘法中,我们将平方误差】
因此,误差将总是大于或等于零。
解释模型系数
为了解释模型系数,我们需要知道术语优势,对数优势,优势比。
赔率,对数赔率,赔率比
可能性
赔率被定义为事件发生的概率除以事件不发生的概率。

例子:掷出一个公平骰子时得到 1 的赔率

对数概率(Logit 函数)
对数赔率=ln(p/1-p)
应用 sigmoid 函数后,我们知道

根据这个等式,赔率可以写成:

对数比值= ln(p/1-p) = β 0+ β 1x
因此,我们可以通过使用对数优势将逻辑回归转换为线性函数。
让步比
赔率是两个赔率的比率

解释逻辑回归系数

逻辑回归模型
β 0 →当 X 为零时,对数几率为β 0。
β 1 →与变量 X1 相关的对数优势比的变化。
如果 X1 是数值变量,β 1 表示 X1 每增加一个单位,对数优势就增加β 1。
如果 X1 是一个二元分类变量,β 1 表示 x1=1 相对于 X1=0 的对数优势的变化。
如何从模型系数得到优势比?
逻辑回归中的优势比
逻辑回归中独立变量的优势比取决于在保持所有其他独立变量不变的情况下,特定变量增加一个单位时优势如何变化。
β 1 →与变量 X1 相关的对数优势变化。
变量 X1 的优势比是β 1 的指数

从模型系数推导优势比

分类的评估标准
- 准确(性)
- pulse
- TNR
- 定期用量法(Fixed Period Requirements)
- PPR
- F1 分数
准确(性)
准确性衡量实际预测占总预测的比例。这里我们不知道误差的确切分布。[假阳性和假阴性之间的分布]

困惑矩阵[图片由作者提供]
在准确性度量中,我们不知道误差的确切分布[假阳性和假阴性之间的分布]。因此,我们去寻找其他指标。
敏感度或回忆率或真阳性率(TPR)
真实阳性率衡量被正确分类的实际阳性的比例。
特异性或真阴性率(TNR)
真实否定率衡量被正确分类的实际否定的比例。
假阳性率或(1-特异性)
假阳性率衡量被错误分类的实际阴性的比例。
正预测率(PPR)或精度
预测阳性率衡量实际阳性占总阳性预测的比例。
F1 比分
F1 分数是精确度和召回率的调和平均值
调和平均值怎么算?
- 取精度和召回的倒数(1/精度,1/召回)
- 求精度和召回率倒数的平均值

3.然后,求逆结果。

选择哪个指标?
这取决于问题陈述。
- 精度 →当我们需要知道预测精度时,比如有多少个 1 被归类为 1,有多少个 0 被归类为 0,但不考虑误差的分布(FP 和 FN)。
- 灵敏度 →当我们希望所有阳性记录都被正确识别时。更重视假阴性[在癌症数据集中,应正确预测癌症患者]
- 特异性 →当我们不希望任何负面标签被错误分类时。更重视误报[在垃圾邮件检测中,我们希望所有真正的电子邮件都能被正确预测]
- F1 得分指标用于不平衡的数据集。
度量公式

指标[作者图片]
门槛水平是多少?门槛水平如何设置?
阈电平
逻辑回归模型根据概率预测结果。但是,我们想预测 0 或 1。这可以通过设置阈值来实现。
如果阈值设置为 0.5 均值,则大于 0.5 的预测概率将转换为 1,其余值为 0。
受试者工作特征曲线
ROC 曲线是在所有分类阈值水平的 FPR 和 TPRor(1-特异性对敏感性)之间的权衡。
FPR →错误分类的负标签分数。
TPR→正确分类的阳性标记分数
如果 FPR=TPR=0,表示模型将所有实例预测为负类。
如果 FPR=TPR=1 表示模型预测所有实例为正类
如果 TPR=1,FPR=0 意味着模型正确预测了所有数据点。(理想模型)
示例:我已经根据实际 y 和所有阈值级别的预测概率计算了所有指标。

实际 y 和预测概率

为所有阈值级别(0–1)计算的所有指标
让我们画出所有阈值水平的 ROC 曲线(FPR 对 TPR)。

受试者工作特征曲线
ROC 曲线的解释
从上面的 ROC 曲线,我们可以选择最佳的阈值水平。在 FPR =0 和 TPR =0.75 时,是上述 ROC 曲线的最佳阈值水平。
该点的 AUC 往往较高,FPR 也为零。

AUC——曲线下面积是 ROC 曲线覆盖的面积。AUC 范围从 0 到 1。
对于任何随机分类器,AUC =0.5。所以好模型的 AUC 评分应该在 0.5 到 1 之间。
如果 TPR=1,FPR=0 意味着模型正确预测了所有数据点。(理想模式)。在这种情况下,AUC 为 1。

AUC = 1[图片由作者提供]
为什么要用 ROC 曲线?
- 比较不同型号的性能。从 ROC 曲线计算 AUC,AUC 越高的模型表现越好。
- 为模型选择最佳阈值。
关键要点
- 为了解释模型系数,我们使用以下等式

2.为了计算 ŷ ,我们使用以下等式

3.指数模型系数给出了优势比

结论
在本文中,我介绍了逻辑回归中的基本概念,如模型如何预测输出,如何解释模型系数,如何评估模型的性能。希望你们都喜欢。
感谢阅读!
关注此空间,了解更多关于 Python 和数据科学的文章。如果你喜欢看更多我的教程,就关注我的 中LinkedIn推特 。
**点击此处成为中等会员:https://indhumathychelliah.medium.com/membership
令人困惑的矩阵
当直觉让我们犯错时

来源:【https://unsplash.com/photos/pkKRdpurSPw】T2
你应该读这篇文章吗?
如果你能回答下面的问题,并充分解释原因(不只是提供一个有根据的猜测),那么这篇文章可能对你没有什么价值。
- 测试的精确度是 95%,我们被告知测试总是发现 10%的受试者是阳性的。我们对一个随机的受试者进行测试。测试返回真阳性的概率是多少?
- 测试的特异性为 95%,精确度为 90%。
我们对一个健康的受试者进行测试。测试返回阳性结果的概率是多少? - 测试的灵敏度(召回率)为 90%,特异性为 90%。假设我们将测试应用于患病率为 1%的数据集。假设测试返回阳性结果,受试者患病的概率是多少?
- 一家公司试图向你推销他们的新测试,这种测试在检测某种疾病时(据说)非常准确。他们声称,它的灵敏度(回忆)为 95%,特异性为 95%,精确度为 95%。有没有可能这不是某种营销伎俩,这种测试确实存在?
- 假设某项测试的灵敏度(召回率)为 95%,特异性为 95%。我们也知道患病率是 10%。我们对 1000 名受试者进行了测试。测试会发现多少阳性结果?
- 假设某项测试的灵敏度(召回率)为 95%,特异性为 95%。我们也知道患病率是 10%。有没有可能检测的阴性预测值是 50%?
- 假设在某个数据集上评估了一个测试,发现其精度为 95%。我们现在在不同的数据集上运行这个测试,其中 50%的受试者患有该疾病。测试会返回任何阳性结果吗?
介绍
通常的做法是通过从混淆矩阵容易获得的性能度量来评估返回二进制结果的测试(或模型)的性能,例如,给定混淆矩阵,我们可以容易地计算精度、召回、f1 分数等。
无论计算多么简单,一旦我们不仅仅考虑一个指标,或者当我们需要揭示一个口头调查的概率意义时,它就会变得相当棘手。
例如,“对于患有该疾病的受试者,检测结果呈阳性的概率是多少?”可以重新表述为“P 的估计值是多少(阳性测试结果|真条件为阳性)”,这可以使用估计值# {真阳性}/# {真阳性+假阴性} 来实现,即,我们希望对测试的灵敏度(召回)进行估计。
这篇文章的目的是提供一些问题的例子和可能的解决方案,它们可以帮助我们加深理解和直觉,让我们更容易地在一个测试的性能指标和每个指标所暗示的各种含义之间流动。
这篇文章并没有涵盖所有关于从困惑矩阵中得出的性能指标的问题。它确实(希望)涵盖了一些基础知识,可以帮助我们解决更复杂的问题,并更好地理解度量标准如何相互关联以及它们在实践中的意义。
符号及更多
当我们考虑一个检测疾病存在的测试时,我们将从回顾我们将在这篇文章中使用的符号开始。
将【P(D)表示为受试者患病的概率(即疾病的患病率)。
P(不是 D) 或 P( D) 是一个受试者没有患病的概率。
P(+) 是测试返回一个阳性结果的概率。
P(–)是测试返回一个阴性结果的概率。
根据以上我们得到:
P(+|D) 这是假设受试者患有疾病,测试将返回阳性结果的概率。
P(–| not D)这是假设受试者没有疾病的情况下,测试返回阴性结果的概率。
同样我们有 P(不是 D|+) 、P(D |–)等条件概率。**
我们将互换使用回忆和敏感性这两个术语,阳性率/患病率和精确度/阳性预测值也是如此。下表可能有助于解决本文中的问题:

作者图片
我们也可以在这个维基百科页面中找到表格中的信息。
一些概率定律的简要回顾
回忆几个可能对我们有用的基本概率定律:

作者图片
关于完整性的几点说明
评估者和估计
在这篇文章中,我完全忽略了一个事实,即我们基于经验混淆矩阵计算的指标,是运行一些实验、测试、模型等的结果。实际上是估计。
换句话说,如果以精度的估计量为例,TP/(TP + FP)只是检验(或模型)的真实(未知)精度的估计量。我们根据在数据集上运行模型/测试得到的混淆矩阵计算的任何度量值都是测试的真实(未知)度量的估计。
贝叶斯或频率主义方法
我也避免讨论度量标准,这正是我们试图估计的,是某个未知的常数还是实际上是一个随机变量。对于这篇特定的文章来说,讨论是不太相关的,尽管在实践中它是非常有趣的。
不适当的评分规则
在考虑分类性能指标时,存在使用正确的评分规则还是不正确的评分规则的问题。
这里就不赘述了,不过你可以在这里和这里了解更多。
关于这个主题的全面综述可以在gne iting&raftey(2007)中找到。
题型
关于各种性能指标,我们可以问许多类型的问题。在这里,我们将只涵盖几种类型的问题,你可以在这些问题的基础上提出更多的变化。
型个性
该问题中仅提供了一个指标,我们以受试者的真实状况(患病/健康)为条件。
答案可能是度量值,1 减去度量值,或者使用现有信息无法回答问题。
问题格式: 某测试的 <度量 > 为 X% 。
我们对一名< 健康/患病 >的受试者进行测试。测试返回一个 <阳性/阴性> 结果的概率是多少?
例 :
一项检测的特异性是 95%。我们对一名健康的受试者进行测试。测试返回阳性结果的概率是多少?
问题求假阳性率,P(+|not D) 。
给定特殊性,应用规则P(A|B) = 1 — P(not A|B)我们知道P(+|not D) = 1 — P(-|not D) = 1 — specificity,所以答案是1 — specificity = 1 — 0.95 = 0.05。
型个性
与上一个问题类型相同,只是添加了不相关的信息。
问题格式: 某项测试的 <指标 > 为 X% 其 <其他指标> 为 Y% 。
我们对一名< 健康/患病 >受试者进行测试。测试返回一个 <阳性/阴性> 结果的概率是多少?
例 :
一项检测的特异性为 95%,精确度为 90%。我们对一名健康的受试者进行测试。测试返回阳性结果的概率是多少?
我们不需要精确来回答这个问题;特异性就足够了。这个问题的答案和上一个题型的答案一样:1 - specificity。
C 型
在问题中,只有一个指标与阳性/阴性检测结果的流行率或比例一起出现。注意,在这种情况下,问题不会要求我们找到一个条件概率。
问题格式: <某项测试的度量 > 为 X% ,我们被告知 <患病率/阳性测试结果比例> 为 Y% 。我们对一个随机的对象进行测试。测试返回一个 <真/假> - <正/负> 的概率是多少?
示例 :
测试的精确度是 95%,我们被告知测试总是发现 10%的受试者是阳性。我们对一个随机的对象进行测试。测试返回真阳性的概率是多少?
这些问题要求我们找到P(+ and D)。
我们知道P(A and B) = P(B|A)P(A)所以
P(+ and D) = P(D|+)P(+) = (precision) * (proportion positive results)
所以我们得到0.95*0.1 = 0.095。
D 型
类似于前一种类型,但增加了冗余信息,这一次我们可能会问一个条件概率。
问题格式:
某测试的< 度量 >为 X% 。我们还知道测试的< 其他指标 >是 Y% ,并且这些指标是在患病率为 Z% 的数据集上评估测试时获得的。
我们对单个对象执行测试,它返回一个< 阴性/阳性 >结果。是一个< 假/真 > - < 负/正 >的概率有多大?
举例: 某测试的误发现率为 5%。我们还知道,该测试的阴性预测值为 95%,并且这些指标是在患病率为 10%的数据集上评估该测试时获得的。我们对单个受试者进行测试,结果是否定的。它是假阴性的概率是多少?
**问题要求P(D|-)我们知道
**
除了测试的阴性预测值之外的所有信息都不是回答问题所必需的,它们只是噪音。
E 型
该问题包括两个指标和测试给出的阳性测试结果的流行率或比例。
问题格式: 测试的< 度量 >为 X% 其< 其他度量 >为 Y% 。假设我们将测试应用于一个数据集,其中< 阳性结果的患病率/比例 >为 Z% 。假设测试返回一个< 阳性/阴性 >结果,受试者健康/患病 >的概率是多少?
例: 某项检测的灵敏度为 90%,特异性为 90%。假设我们将测试应用于患病率为 1%的数据集。假设测试返回阳性结果,受试者患病的概率是多少?
这个问题要求我们找出测试的精确度,P(D|+)。
为了找到P(D|+),我们可以应用贝叶斯法则,在明确写出这些术语后,我们看到只需插入灵敏度、特异性和患病率的值,就可以得到精确度的值。

作者图片
F 型
与上一个问题类型相同,只是更糟糕—问题包含看似相关的信息,但问题无法回答。
例:
用前面题型例中的阴性预测值替换特异性。当我们用贝叶斯法则重写它时,算出精度的形式,你会看到我们最终得到的项的值在问题中没有给出,所以它无法求解。
再举几个例子
- 假设某项测试的特异性为 95%。我们在没有受试者患病的数据集上运行这个测试。测试会返回任何阳性结果吗?
回答:是的,该测试会将数据集的 5%标记为阳性,即使它们实际上都是该疾病的阴性。这是因为假阳性率也可以表示为1 — specificity,所以我们有1 — 0.95 = 0.05。 - 假设某项测试的灵敏度为 60%。数据集中的患病率为 70%,我们还知道测试返回的结果中有 80%是阳性的。测试的精确度是多少?
回答 :
问题让我们去找P(D|+)。
我们可以用贝叶斯法则来解决:
P(D|+) = P(+|D)P(D) / P(+)
= sensitivity * prevalence / proportion positive results
= 0.6 * 0.7 / 0.8 = 0.525 - 假设在某个数据集上评估了一个测试,发现其精度为 95%。我们现在在不同的数据集上运行这个测试,其中 50%的受试者患有该疾病。测试会返回任何阳性结果吗?
回答:根据问题中给出的信息,我们无法回答。考虑到我们现有的信息,我们知道P(D|+) = 0.95和P(D) = 0.5。
问题问的是P(+),或者更确切的说是问P(+) > 0是否。
P(+)也可以写成
P(+) = P(D)P(+|D) + P(not D)P(+|not D)。 由于我们不知道P(+|D)(灵敏度)的值,也不知道P(+|not D)(假阳性率)的值,所以我们无法回答这个问题。
只是为了说明,我们确实知道P(not D)、的值,因为1−P(D) = P(not D)。 - 假设某项测试的灵敏度为 95%,特异性为 95%。我们也知道患病率是 10%。我们对 1000 名受试者进行了测试。测试会发现多少阳性结果?
回答:我们之前展示了如何使用贝叶斯法则解决一个非常相似的问题。我们现在将展示另一种方法。
我们知道该疾病的患病率,因此我们知道 1000 名受试者中有 10%患有该疾病,因此有 100 名实际阳性。
测试灵敏度为 95%,因此 100 个实际阳性中的 95 个将通过测试发现,并且它们是真阳性。
测试特异性为 95%,因此 900 个实际阴性中的 855 个将通过测试发现,并且它们是真阴性。剩余的 45 个实际阴性将被测试错误地检测为阳性,并且将是假阳性。这与注意到我们的假阳性率是 5%是一样的,因为假阳性率等于 1-特异性。
我们最终得到 95 个真阳性+ 45 个假阳性,总共 140 个阳性,这是我们被要求找到的数量。
顺便说一下,我们现在也知道测试精度是95/(95+45)=67.9% - 假设某项测试的灵敏度为 95%,特异性为 95%。我们也知道患病率是 10%。有没有可能检测的阴性预测值是 50%?
答案:否
根据与上一个问题非常相似的计算,为了简单起见,假设我们对 1000 名受试者进行了测试:
患病率为 10%,因此我们有 100 名实际阳性者和 900 名实际阴性者。
95%的灵敏度为我们提供了 95 个真阳性和 5 个假阴性。95%的特异性产生 855 个真阴性和 45 个假阳性。
阴性预测值为
T1 - 一家公司试图向你推销他们的新测试,这种测试在检测某种疾病时(据说)非常准确。他们声称,它的灵敏度为 95%,特异性为 95%,精确度为 95%。有没有可能这不是某种营销伎俩,这种测试确实存在?
回答:正如我们看到的,我们可以把精确度写成患病率、敏感性和特异性的函数。让我们再看一遍:

作者图片
我们注意到,我们可以重新排列上述内容,以便将患病率表示为敏感性、特异性和准确性的函数。然后,我们插入公司报告的指标,如下所示:

作者图片
事实证明,根据该公司提供的指标,他们在患病率为 50%的数据集上评估了他们的测试,这是非常高的,可能与我们希望在我们打算使用该测试的人群中看到的真实患病率完全无关。换句话说,将相同的测试应用于患病率为 2%的一组受试者将导致不同的表现指标,并且不是所有的指标都可以达到 95%。
使用贝叶斯因子
回答问题 4 的另一种方法是使用贝叶斯因子,该方法在本视频中有详细介绍:“医学测试悖论,重新设计贝叶斯法则”。我不会在这里介绍这个方法,因为我认为这个视频解释得非常好,我强烈推荐观看。
这玩意在现实生活中真的有用吗?
最近由科斯托拉斯等人(2021) 发表在《美国流行病学杂志》上的一项研究报告了一项荟萃分析的结果,该分析评估了 RT-聚合酶链式反应测试对新冠肺炎的诊断准确性。
在我们的案例中,研究的两个结果是令人感兴趣的,这两个结果是 RT-聚合酶链式反应测试的灵敏度估计值 0.68 和测试的特异性估计值 0.99。
正如我们之前看到的,给定敏感性和特异性,我们现在可以将精确度固定在某个值并获得患病率,或者反之,将患病率设置为某个值并获得精确度。
假设我们将疾病患病率固定在 1.5%。使用在研究中估计的敏感性和特异性值以及这个流行率值,我们最终得到 50.9%的精确度。在这种情况下,由 RT-聚合酶链式反应测试提供的大约 49%的阳性结果是假阳性。注意:49%是误发现率,不要和误报率混淆(这是两个不同的指标)。
另一方面,假设我们将精确度设置为 95%,同时仍然使用研究中发现的 68%灵敏度和 99%特异性的值。在这种情况下,我们发现这种疾病的患病率约为 12%,这有点高。
因此,我们看到了精确性和普遍性之间的权衡,假设敏感性和特异性是固定的。我们可以画出这种权衡:

作者图片
我们现在可以问更多的问题,关于我们在做各种公共卫生决策时使用 RT-PCR 检测结果的方式。
在 Andrew Gelman 的帖子中可以找到另一个很好的度量标准及其含义的例子:“对斯坦福冠状病毒流行研究的关注”。
练习练习练习
我们在这篇文章中讨论的问题有许多不同的风格。
我能想到的提高我们对主题的掌握的最好的方法是练习这些问题,并弥补我们在理解中发现的任何差距。
在以下链接中,您可以找到 1000 个这样的问题- 绩效指标问题。这些问题是自动生成的,其中一些无法回答,也就是说,问题中提供的信息不足以回答它,我们可能缺少指标或其他一些数据。我们可以把这些看做是难题,这取决于我们去理解到底缺少了什么,以及为什么这个问题不能被回答。
一些解决方案
这些是一些问题的解决方案,可以在的链接中找到。
第一个例子:
测试的错误发现率为 95%,其阴性预测值为 85%。
这些指标是在数据集上评估测试时获得的,其中阳性测试结果的比例为 1%。我们对一个生病的受试者进行测试。测试返回否定结果的概率是多少?
先把问题中给出的信息写成概率:
FDR = P(not D|+) = 0.95; NPV = P(not D|–) = 0.85``proportion of positive test results (prop+) = P(+) = 0.01
这个问题要求我们找到P(–|D),即假阴性率(FNR):

作者图片
我们现在可以代入 FDR,NPV,prop+的值,找到答案。
第二个例子:
测试的精确度为 95%,假阳性率为 90%。我们对一个生病的受试者进行测试。测试返回否定结果的概率是多少?
和往常一样,我们先把问题中的信息表示成概率:
precision = P(D|+) = 0.95; FPR = P(+|not D) = 0.9
问题要求我们求P(–|D),即假阴性率(FNR):
P(–|D) = P(D|-)P(-) / P(D)我们知道可以把P(D)写成P(D) = P(+)P(D|+) + P(-)P(D|–) = P(+)P(D|+) + (1 — P(+))P(D|–)但是,求P(D)的值需要我们知道P(+)的值,以及P(D|+)(在问题中作为精度给出)和P(D|–)(即没有给我们的假漏报率(FOR)。因此,我们无法回答这个问题,因为我们缺少一些必需的信息。
面试问题——注意事项
如果你打算在求职面试中问这类问题,要记住的一点是,回答一个问题有不止一种方式,你应该能够跟随候选人沿着概率计算的道路走下去,直到当他正确回答时,你会对他露出放心的微笑。
你应该对你提出的问题非常熟悉。仅仅知道“5%是正确答案”是不够的,因为关键是要理解候选人是如何得出这个数字的,而不仅仅是让他凭直觉猜测。
如果你对材料不够熟悉,候选人将无法从你那里得到任何暗示和指导,以防他结结巴巴,或者更糟的是,如果答案变得有点复杂,他会意识到你无法理解他的答案,这绝不是一件好事。
摘要
基于混淆矩阵中可用计数数据的性能度量被广泛用于评估预测性能。尽管它们很容易计算,但是一旦我们用语言描述它们,并试图解释它们的含义以及它们如何相互作用,这些指标就不总是直观的了。
仅仅因为一些指标只涉及简单的计算,并不意味着它也很容易掌握。
希望这篇文章能鼓励你花些时间深入研究这些常用的度量标准,并更好地理解当度量标准 X 取值 y 时的真正含义。
我希望你觉得这篇文章有用,而不是完全无聊:)
欢迎评论和反馈!
我们一直在寻找有才华的人加入我们的团队!
混乱矩阵:读完这个之后就不那么混乱了——我保证!
动手教程 / 机器学习
不要以貌取人!混乱矩阵可能会让很多人感到困惑,但读完这篇文章后你就不会困惑了

目录
- 简介
- 欢迎参加聚会
◘ 什么是困惑矩阵?
◘ 稍微预览一下
♣ 我们先举个例子
我们来玩个游戏
♥ 苹果还是不苹果?
♠ 最终布局
◘ 其他布局
◘ 欺骗代码到混乱矩阵 - 事后方
- 结论
◘ 参考文献
◘ 终言
介绍
一天晚上,你和你的朋友决定去参加一个聚会,在聚会上,假设你看到了一个你感兴趣的人,于是你去介绍自己并交换信息。你重新和你的朋友在一起,让他们知道发生了什么,让你惊讶的是,你的一个朋友告诉你,他们个人认识你刚刚与之交换信息的这个人,并解释了为什么这可能是一个坏主意。在这种情况下,你是一个算法,你给你决定与之交换信息的人一个准确度分数,你的朋友在那里用解释来迷惑你,为什么你的准确度分数是误导的。
很有可能,类似的事情也发生在你身上。在这篇文章中,我将介绍你需要知道的关于混淆矩阵的几乎所有东西,为什么使用它,什么时候使用它,以及如何使用它。在我看来,最好的学习方法是从例子中学习,这就是为什么我会用两个例子,而不是一个例子来讲解——是的,混淆矩阵中的两个例子。我不认为我在上一段中给出的“例子”是一个实际的例子,相反,在我们前往实际的聚会之前,这是一个小小的游戏前的。
欢迎参加派对
队伍很长,外面很冷。你和你的朋友不想排很长很冷的队伍,所以你走向保镖,给他 500 美元。保镖向你和你的朋友点点头,让你进去,但有一个条件,保镖问,“困惑矩阵向你展示了什么?”你困惑地看着保镖,心想保镖一定是疯了。你的朋友突然脱口而出,“混淆矩阵显示了你的分类模型在进行预测 <#f243>时混淆的方式。”当你看向你的朋友并回头看向保镖时,突然你的一条眉毛扬起。然后保镖向你的朋友点点头,让你和你的朋友进去,你敬畏地看着你朋友的反应。你带卡尔·皮尔逊来参加聚会是件好事。
你喝了几杯酒,突然对学习混淆矩阵更感兴趣,所以你向卡尔询问更多。
“你想了解什么?”他问,你回答,“实际上很多,但首先,是什么?”
混淆矩阵是什么?
准确性分数本身并没有太大的价值,因为它只是给你一个模型表现如何的“总体”评估。所以本质上,这意味着准确性分数很酷,所有的都很酷,直到你开始问更深层次的问题,比如“在算法做出的真实预测的数量中,有多少是真实的?”这是当我们使用更稳健的方法,如混淆矩阵,以更好地理解算法的性能。
混淆矩阵——也称为错误矩阵 <#f243>或混淆表 <#f243>,是一个N x N矩阵/表(具有相同行数和列数的矩阵),它显示算法(通常是分类算法)的性能,其中N是您正在处理的分类或目标类的数量。
为了简单起见,让我们使用两个目标类(二进制分类)。这意味着我们的混淆矩阵将是一个 2x2 矩阵,也称为二进制混淆矩阵。
以下是二元分类的一些例子(区别问题):
- 区分苹果和橘子的分类器
- 区分短吻鳄和鳄鱼的分类器
- 区分水和伏特加的分类器
- 区分物体是否是人的分类器
- 区分一个人是否会得某种疾病的分类器
只有两个区别因素,因此我们的模型只能预测两种分类中的一种。
这是我们的矩阵表到目前为止的样子:

作者图片
是的…我知道,还没有,我必须实现我的承诺 …
一点预览
我是一个相当冷静的人,我不介意事先告诉人们他们将会遇到什么,这样至少他们知道如何为即将到来的事情做准备。话虽如此,这里还是先睹为快,看看我们的困惑矩阵会是什么样子:

作者图片
让我们用苹果和橘子作为第一个例子。
我们的第一个例子
人类之所以擅长为人,是因为随着时间的推移,人类从反复试验中学会了今天的最佳状态。为了更好地理解混淆矩阵是如何工作的,我们必须假装是一个。我们必须了解混淆矩阵是如何形成的,以及为什么它决定以这种方式描述分类算法的性能。
现在我们已经有了混淆矩阵的布局,并且我们知道我们的目标类是什么(苹果或橙子),我们可以更深入地理解这个矩阵。
我们矩阵的下一个补充将是两个指标,用于区分模型的预测值和实际值。这两个度量可以表示为矩阵的行或列。将“预测值”和“实际值”视为行或列的标题。现在,根据个人喜好,你可以用Predicted Values作为列、Actual Values作为行来设置你的混淆矩阵,反之亦然。
注:不幸的是,我在网上看到了几篇文章,其中出版商不恰当地演示了这一点,导致他们的混淆矩阵无效。好像混乱矩阵还不够混乱。
就个人而言,我喜欢将Predicted Values作为我的列,将Actual Values作为我的行。

作者图片
因为我们的模型只能预测一个物体是一个桔子还是一个苹果(除此之外别无其他),所以我们的矩阵是一个 2x2 矩阵。对于Actual Values,我们的对象可以是苹果或者橘子,对于Predicted Values也是一样。

作者图片
请注意,第 0 行是橙子,第 0 列也是橙子(第 1 行/第 1 列是苹果)。这不是偶然的,我们希望我们的行和列索引为每个Actual Values和Predicted Values列出相同的对象。
因为苹果在第 1 行/第 1 列,并且因为我们只处理两个预测:物体可以是苹果或桔子,但不能是两者(或者除了两者之外的任何东西),我们可以将我们最初的区别问题从:A classifier distinguishing between an apple and an orange重新表述为:A classifier distinguishing whether the object is an apple or not。
注意 :
您也可以将原来的问题重新表述为*A classifier distinguishing whether the object is an orange or not*,但是您必须交换上表中行和列的*Orange*和*Apple*的位置。
记住我们新更新的区分问题是A classifier distinguishing whether the object is an apple or not。既然苹果肯定是苹果,我们可以用Positive代替苹果。
橙色呢?好吧,橙子不一定是苹果——橙子是一个阴性苹果。
橘子是一个阴性苹果。
——吉法里·霍克,2021
在这种情况下,我们可以用Negative替换 Orange,这将导致我们用新的表示法更改我们的表:

作者图片
我没有简单地为Predicted Values列编写Positive和Negative,而是决定编写Predicted Negative和Predicted Positive以减少混乱。
我们现在有四种不同的索引符号,组成了我们的表:
- (实际负值,预测负值)→索引[0,0]
- (实际为正,预测为负)→指数[1,0]
- (实际阴性,预测阳性)→索引[0,1]
- (实际阳性,预测阳性)→指数[1,1]
让我们玩一个游戏
用一个昵称来表示这些索引会很有帮助。让我们来玩一个小游戏。这个游戏是预测我脑海中的数字是负数还是正数,我们会记录下你的分数:
♠在第一轮,你预测这个值会是负的,实际上这个值是负的。这意味着你的否定预测是真的。
在第二轮中,你预测新值将为正,然而,它实际上是负的。这意味着你对阳性的预测是错误的。
♠在第三轮中,你预测新的值将是负的,事实上,值实际上是负的。这意味着你的否定预测又一次为真。
真心抱歉,不抱歉这么消极。
S̲c̲o̲r̲e̲:
♠预测:负|正确:真|计数:2
预测:正|正确:假|计数:1
那么,用真阴性(TN)、假阴性(FN)、假阳性(FP)和真阳性(TP)这样的昵称来表示指数怎么样?这些昵称听起来没那么糟糕,因为它们更有意义:

作者图片
我们现在必须对这些术语中的每一个给出某种描述,但是在玩了我们的小游戏之后,它看起来非常简单。让我们试一试:
- 真阴性(TN) :实际上阴性的阴性预测的数量——正确。
- 假阴性(FN) :做出的阴性预测的数量,实际上是阳性——不正确。
- 假阳性(FP) :做出的阳性预测的数量,实际上是阴性——不正确。
- 真阳性(TP) :实际为阳性的阳性预测的数量——正确。
注—其他昵称为<#f243>****😗*
-TN:正确拒绝
-FN:ⅱ型错误、遗漏、低估
-FP:ⅰ型错误、虚警、高估
- TP:命中、卫生纸**
苹果还是不是?
让我们继续我们的第一个例子。
这是我们的场景:我们用海量的图像完成了对数据集的训练,并在包含 1000 张苹果或橙子图像的测试数据集上进行了测试。这是我们得到的结果:

作者图片
而且因为我们更新的区分问题是:A classifier distinguishing whether the object is an apple or not,我们可以认为Apple为真(或 1)Orange为假(或 0)。
我们可以得到这样一个表格:

作者图片
在该算法做出的 1000 个预测中,有 924 个预测是正确的——准确率为 92.4%。这很糟糕,但是,喂,把橘子和苹果的奇异图像输入机器是我的错🤷🏽♂️.
不管怎样,我们的测试集总共有 650 张苹果图片和 350 张橙子图片;总共 1000 张图片。我们的算法正确分类了 650 幅苹果图像中的 603 幅和 350 幅橙子图像中的 321 幅。这意味着我们的算法错误地将 47 幅苹果图像声称为橙子图像(650–603=47),并将 29 幅橙子图像错误地声称为苹果图像(350–321=29)。
还记得我之前给你的预览吗?

作者图片
现在开始有点眉目了,不是吗?在浏览之前,让我添加一些最后的细节,让这张表更生动一些。
最终布局

图片作者|实际行数、预测列数、负第一、正第二
这是我们混淆矩阵的最终表格。您可以在每个相应行的最右端看到实际总数,在每个相应列的最底端看到预测总数。右下角列出了测试数据集中的图片总数n=1000。在 1000 幅图像中,算法预测其中 368 幅是橙子的图像,632 幅是苹果的图像。
准确度分数通过将总氮和总磷的总和除以总人口(n)来计算。
(TN+TP)
------- = Accuracy Score
n(321+603)/1000 = 0.924
记得 :
橘子=不是苹果=负苹果=负
苹果=正苹果=正
t13】_(ツ)_/
TN**:
——算法正确预测了 321 张橙子的图像。
-算法做出了 321 个真负**苹果(橙子)的预测。
FP :
-算法认为 29 个橙子的图像是苹果的图像。
-该算法对阴性苹果(橙子)做出了 29 个错误的预测。
FN :
-算法认为 47 张苹果的图像是橙子的图像。
-该算法对阳性苹果做出了 47 个错误的预测。
TP :
-算法正确预测了苹果的 603 张图像。
-该算法对阳性苹果做出 603 个真预测。****
我相信你现在可以看到为什么混淆矩阵比单独的准确度分数更有用,因为它更详细地说明了为什么算法获得了这样的准确度分数。
我应该再次提到,这是我更喜欢的混乱矩阵的布局,不仅因为它看起来很干净,而且因为这是它在 Python 上的显示方式,在下一个例子中我将和你一起看一下⁴。
其他布局
有时您会看到第一行和第一列都是Positive和Predicted Positive的表格,如下所示:

图片作者|实际行数、预测列数、正第一、负第二
其他时候,您会看到以Actual Values为列、Predicted Values为行的表格:

图片作者|预测行,实际列,正第一,负第二
有时,甚至像这样:

图片作者|预测行,实际列,负第一,正第二
所有这些都很好,但归根结底,都是关于索引的。这意味着,如果有人说了类似“左上角应该是 TN 或者右下角应该是 FN,等等”的话别听他们的,他们还很困惑。如果我说错了,请纠正我,嘿,我不是在向任何人或任何类似的事情抛出 subs(T49)或 T50,但是正如我所说的,在一天结束的时候,这都是关于索引的。
希望上面四个表中的颜色编码能让你更好地理解矩阵中变量的位置。如果你仍然很难理解它,不要担心,因为我知道生活中有时事情会变得令人困惑,这就是为什么我给你做了一个备忘单,总是能够理解每个变量在困惑矩阵中的位置。
混乱矩阵的作弊代码
基本上,这是你应该知道的,以确保你的混淆矩阵不是无效的:
-(N&PN)= TN
-(N&PP)= FP
-(P&PN)= FN
-(P&PP)= TP其中
*N = Actual Negative*、*P = Actual Positive*、
、*PN = Predicted Negative*、*PP = Predicted Positive*还有
*TN = True Negative*、*TP = True Positive*、
、*FN = False Negative*、*FP = False Positive****- TN+FP+FN+TP =总人口(n)
- (TN + TP)/n =准确度得分***
-如果某物是负的,并且算法也认为它是负的,那么它是真的负的。
-如果某样东西是负的,但是算法认为它是正的,那它就是假阳性。
-如果某样东西是正的,但是算法认为它是负的,那就是假阴性。
-如果某个东西是正的,算法也认为它是正的,那它就是真正的。
当然,这个场景确实是你编造的,但是这个夜晚直到晚会结束后才结束。在下一章,我将使用一个更著名的数据集来回顾混淆矩阵的另一个例子。
余兴派对
聚会可能已经结束了,但时间还早。
余兴派对马上就要开始了,
但是混乱矩阵还是让你放松了。
在这个例子中,我将使用皮马印第安人糖尿病数据库,该数据库可以在 Kaggle 上找到。不必赘述,数据集中有 768 个记录(患者)的分类为 0 或 1,即二元分类,其中 0 表示患者为糖尿病阴性,1 表示患者为糖尿病阳性。500/768 名患者为糖尿病阴性,268/768 名患者为糖尿病阳性。
数据集在多个要素中包含大量缺失数据。我用过 sklearn 的迭代估算器,它是一个多元估算器,用来估算缺失值。我在 Kaggle 上做了一个笔记本来回顾这个策略,并写了一篇关于这个策略如何运作的文章。点击这里阅读我写的教程,了解更多关于 IterativeImputer 的知识!
在用test_size=0.2(和stratify=y ——在这个例子中你不必担心理解)分割数据集之后,你在训练集中得到 400 个糖尿病阴性和 214 个糖尿病阳性患者(训练集中 614 个患者)&在测试集中得到 100 个糖尿病阴性和 54 个糖尿病阳性患者(测试集中 154 个患者)。

图片由作者提供|列车组

作者图片|测试集
在缩放、执行所有的算法和对测试集进行预测之后,您可以通过在 Python 中运行以下代码来获得准确度分数:
>>> from sklearn.metrics import accuracy_score
...
>>> accuracy_score(y_test, pred)where 'y_test' is the test set and 'pred' is the predictions returned from the algorithm.
返回的准确度分数约为 73.3766%。这意味着在测试集中的 154 名患者中,该算法能够正确分类 73.3766%的患者——或 113 名患者。然后,我们可以通过运行以下代码来查看 Python 中的混淆矩阵:
>>> from sklearn.metrics import confusion_matrix
...
>>> confusion_matrix(y_test, pred)
Python 随后返回以下输出:

作者图片
不幸的是,输出没有我做的表格那么漂亮,但是,嘿,如果 sklearn 正在阅读这篇文章并且喜欢我的布局,请私下联系我进行业务咨询。:3

作者图片
那更好。继续比较上面两个表的变量位置。你现在明白为什么我在上一章展示的 4 个布局中选择了这个布局了吗?
我敢肯定,即使不知道这些数字背后的背景故事,你也可以通过阅读上面的混淆矩阵,对算法做出的预测做出假设。然而,让我们来分析一下:
记住 :
*0*表示患者为糖尿病阴性。
*1*表示患者为糖尿病阳性。
- 该算法正确预测 82 名患者为真正的糖尿病患者-阴性。
○TN = 82 - 该算法错误地预测 18 名患者为糖尿病- 阳性。
○ 18 名实际为糖尿病阴性的患者被预测为糖尿病阳性
○FP = 18 - 算法错误地预测 23 名患者是糖尿病患者- 阴性。
○ 23 名实际为糖尿病阳性的患者被预测为糖尿病阴性🤦🏼♂️
○FN = 23 - 该算法正确预测 31 名患者为真正的糖尿病患者-阳性。
○TP = 31 - 测试集总共包含 154 条记录(患者)
○n = 154=len(y_test)○82+18+23+31 = 154→TN+FP+FN+TP = n - 该算法的准确率分数约为 73.3766%
○(TN + TP) / n = Accuracy Score○( 82+31)/154≈73.3766% - 在 154 名患者中,有 100 名是实际上糖尿病阴性或
0。
○Actual Negative Total = TN + FP
○82+18 = 100→TN + FP = 100=y_test.value_counts()[0] - 在 154 名患者中,有 54 名实际上是糖尿病阳性或
1。
○Actual Positive Total = FN + TP
○23+31 = 54→FN + TP = 54=y_test.value_counts()[1] - 在这 154 名患者中,算法预测其中 105 人是糖尿病阴性
○Predicted Negative Total = TN + FN○ 82+23 = 105 →TN + FN = 105 - 在 154 名患者中,算法预测其中 49 名为糖尿病阳性
○Predicted Positive Total = FP + TP
○ 18+31 = 49 →FP + TP = 49
结论
晚会结束了,现在该回家了。虽然你在聚会上没有遇到任何陌生人,但你已经知道了知识打开了大门。我是说,如果不是因为卡尔,保镖可能都不会让你们进去。
希望在读完这篇文章后,你不再害怕混淆矩阵。事实上,你现在应该能够意识到它是多么的有用。这篇文章只是对理解困惑矩阵的一个介绍。我没有讨论如何使用混淆矩阵提供的数据进行其他统计分析。困惑矩阵的内容远不止这里所介绍的,但是现在你已经理解了基础知识,毫无疑问,你将能够理解其他的一切。我对你有信心。
如果没有给混淆矩阵起这样一个名字,它就不会这么混乱了。
如果你已经跟了我这么久,你应该理解为什么混淆矩阵有用的更“开箱即用”的方法,这是我没有看到其他人提到的。如果你在这里只是为了阅读结论,请阅读整篇文章,我很努力地工作,所以我可以帮助你,相信我,它对我来说是一个真正积极的值得一读,谢谢你再次光临。
在我们的第一个例子中,在我们的测试数据集中的 1000 个图像中,如果 950 个图像是苹果,只有 50 个图像是橙子,并且如果我们的算法以某种方式正确地预测了所有 950 个苹果图像,并且错误地假设所有 50 个橙子图像都是苹果图像,那么我们仍然可以获得 95%的准确率。混淆矩阵将是有用的,因为我们可以看到有多少苹果和橘子的图像算法实际上是正确的/错误的。在混淆矩阵的帮助下,你将能够看到该算法正确地分类了所有苹果的图像,但是不能正确地分类一个橙子的图像。它不仅有助于获得更多关于数据集或算法的统计数据,还能帮助你回溯理解为什么你的算法能获得如此高的精度。
话虽如此,下次你出去参加聚会,看到你感兴趣的人时,要小心,因为外表可能具有欺骗性。
谢谢。
****免责声明:如果你感到比最初更困惑,这是正常的,因为你的神经元可能会因此兴奋地放电。
参考
[1] Z .查科,息肉检测自动化 (2020),信息系统与技术的趋势与创新:第 2 卷。
( 点击返回)
[2]斯蒂芬·斯泰曼(1997 年)。“选择和解释主题分类准确性的衡量标准”。环境遥感。62(1):77–89。Bibcode : 1997RSEnv..62…77 秒。doi:10.1016/s 0034–4257(97)00083–7。
( 点击返回)
[3]维基百科,困惑表(最后编辑,2021),困惑矩阵。
( 点击返回混淆矩阵的昵称 )
( 点击返回 TN、FN、FP、TP 的昵称)
[4] Scikit-learn,混淆矩阵 (2021),Sklearn。
( 点击返回)
最后的话
如果你注意到我的文章中有任何错误,请留下评论并联系我,这样我可以尽快修复它!我不想误导任何人,也不想教任何人错误的东西。对我来说,任何批评都是积极的批评,这是我学习的最好方法之一。我也总是乐于接受提示和建议。此外,请随意使用我在这篇文章中的任何内容,但请给我信用,谢谢!
如果您有兴趣了解如何使用多变量策略而不是单变量策略来输入缺失数据,请阅读下面的文章!
如果你喜欢阅读这篇文章,请关注我的 中型 和Kaggle我会不时在这里发布更多内容。还有,随时和我联系LinkedIn。如果你认为我的工作值得一杯咖啡,请给我买一杯吧!任何支持都帮助我坚持下去。
一如既往,再次感谢你的来访。**
召唤宇宙:我为期两天的数据可视化项目
这个项目教会了我如何从我所在的地方开始,使用我所拥有的,尽我所能坚持不懈地完成它

作者照片
我为我的个人数据项目所做的并不奏效。我开始做一件事,做了一段时间,陷入困境,然后当一个更令人兴奋的想法出现时就放弃了。在 2020 年的最后一周,在认真审视了我的半成品项目后,我突然意识到有些事情必须改变。
所以我开始反思我过去的经历,通读几本关于生产力的书,回顾我最喜欢的项目成果。我意识到了两件事。
- 那些被放弃的想法被放弃了,因为我只是觉得它们不够好,或者我没有足够的技术知识来实现它。
- 当我不得不克服一个具有挑战性但又不可避免的任务,而时间又不够的时候,我最好的作品实现了。
如果我可以按 F5 键刷新,我可以做些什么不同的事情?以下是我所做的。
就从我妹妹和我喜欢的东西开始吧
没有给自己足够的时间思考(可能会患上分析麻痹),我决定从一个我和妹妹都喜欢的话题开始。为什么我会想到我妹妹?因为她一直是我最好的朋友和同甘共苦的依靠。如果你有精神障碍或自我怀疑,那么想想你爱的人,为他们创造一些乐趣,肯定会激发快乐和动力。这也是我希望你从这篇文章中得到的最重要的信息。
一些想法出现了,但在一个安静凉爽的夜晚,独自在家,没有什么可以打败那些令人毛骨悚然的恐怖电影。嗯,有很多,但是哪一个呢?嗯,毫无疑问,它必须是魔法宇宙,一个我姐姐和我最喜欢的恐怖系列。如果我能和我妹妹分享一些我们最喜欢的恐怖系列的有趣事实,还有什么不喜欢的呢?
耶!现在我有了一个题目,但是我能用它做什么呢?好吧,让我们谷歌一下,看看有什么数据。

维基百科是第一站,有几个有趣的表格显示了所有电影和该系列的角色(安娜贝尔和瓦拉克,有人还记得吗?),它们的全球总票房,收视率和事件的时间顺序。对于商业成功和公众反应的简单分析,这些都是很好的起点。
我也看到了几页,似乎人们对每部电影是如何与可怕的魔鬼和鬼魂的世界联系在一起感兴趣。这将是伟大的添加一些有趣的有趣的事实。一浏览内容,一个想法就慢慢形成了。一个黑暗的令人毛骨悚然的数据故事板介绍了关于魔法宇宙的事实。我知道这是我妹妹想看到的。
设定严格的截止日期
知道我在赶时间的时候工作得更好,我设定了收集和分析数据的目标,然后在两天内设计并制作了一个仪表板。我的直觉告诉我,两天的时间可以让我保持动力,同时感受到高效工作的压力。这是我的进攻计划。
- 第一天:制定目标+草图+收集数据
- 第二天:制作图表+完成故事板+测试
嗯,这听起来像是我需要开始的所有东西,或者我是这么想的。但是如果我坚持我的旧习惯,一遍又一遍地做同样的事情,我怎么能期待一个不同的结果呢?这一次,我需要一个新的方法。
专注于真正重要的事情
我欣赏我自我批评的事实。我知道这不是最好的品质。这让我有动力坚持一些体面的标准,但它也偶尔会引发无数“如果……会怎样”的担忧。我非常清楚,如果我找不到一种方法来应对我的自我批评,我的 2 天项目将很快变成 2 周的马拉松。但是怎么做呢?
首先,我承认只有两天时间意味着我必须认真考虑事情的实用性。简而言之,保持简单,笨蛋!其次,我必须制定基本规则,与我自我批判的个性和平共处。受到敏捷宣言的启发,我写下了以下 6 条基本规则,以确保我专注于真正重要的事情。
- 足够好的成品胜过完美的半成品
- 草图超过详细计划
- 利用奇特技术的结果
- 按照计划适应变化
- 复杂视觉效果上简单有意义的图表
- 寻求帮助来了解自己
在两天的时间里,这些要点对我的决策有很大的帮助,并帮助我坚持下去。你猜怎么着?我认为它们在未来的项目中也是可重用的。
让用户故事定义交流的目的
表白时间:我是用户故事的粉丝。不,我说的不是冗长的产品评论。我的意思是几个简短而甜蜜的句子,遵循一个一般的结构,如“作为一个[最终用户角色],我想要[产品的能力或特性],因为[无论我能获得什么好处或能避免什么麻烦]。”你可能经常会发现用户故事被用来获取软件产品的功能。但是我个人认为用户故事非常有效,可以确保我做的任何事情都把用户放在第一位。这是我为《召唤宇宙》故事板写的东西。

作者照片
哦,等等!首先,当我没有足够的时间时,为什么还要费心去写故事呢?在开发过程中,这些用户故事帮助我明确受众想要什么,这样我就不会浪费时间去收集不相关的数据或构建无附加值的功能。既然时间不多了,那就必须专注于主要目标,你同意吗?还有呢?在测试和审查期间,这些故事帮助我验证我的故事板是否已经完成,是否如预期的那样工作。我认为 20 分钟的垃圾用户故事和思考视觉传达的目的是非常值得的。
如果你想知道更多关于人们是如何为软件开发编写用户故事的,看看这篇精彩的文章。懒读书?不要担心,这里是我给每个人的关于用户故事的 3 个快速提示。
- 尝试将单个用户归纳为具有相似目标、需求和需要的组(也称为角色)。这样你就不会有成百上千的故事。
- 遵循上面提到的一般结构。这很简单,简洁,而且很有效。
- 每当你感到迷茫时,总是回头看看用户故事。
拥抱好的,坏的和丑的
到目前为止,事情似乎好得不像真的,或者你是这么想的。但让我分享一些关于哪里出了问题以及我如何设法摆脱困境的见解。错误不应该发生不止一次,所以希望你能避免犯和我一样的错误。
创建第一个草图
我通过查看数据和在一张白纸上涂鸦开始了我的第一张草图。如果你真的很有创造力并且擅长画画,这没什么不好。但我知道我没有。不出所料,30 分钟过去了,我只有一些奇怪的盒子,没有具体的想法。只剩下 30 分钟,直到我吃进我的数据收集时间。红旗!是时候实施 b 计划了。
看看其他人在为电影设想什么怎么样?所以我去看了 Tableau 公共画廊,重点是电影和电视部分。一个充满可能性的世界突然展现在我面前。因为剩下的时间不多了,我得找条捷径。所以我把那些我喜欢的设计截图下来,放在一个共同的存放处。下面是我在我信任的一体化工作空间 ideal 中所做的事情。但是你可能想打开一个 PowerPoint 空白幻灯片,开始在里面粘贴一些图片。

作者照片
找不到什么好看的设计?那么,从简单的盒子开始,陈述你想要展示的内容。草图旨在指导您需要收集哪些数据,但是您可以收集的数据将决定最终图表的外观。所以要把握好时机,不要纠结于小细节。谈到素描,我更喜欢电子格式,而不是纸和笔,因为我可以很容易地编辑,移动东西和添加新的东西。但是你可能会有不同的想法,这完全没问题。这里的教训是记住从别人那里寻求帮助和灵感,而不是强迫自己重新发明轮子,凭空创造一些魔法。
收集数据
从一开始,网络抓取就是我想在这个项目中练习的技能之一。所以我高兴地一头扎进去,写了一大堆 Python 脚本来从几个网页中提取数据,花了更多的时间来调试和测试我的脚本,以确保它们能够工作。
但是等等!手动复制和粘贴会更快吗?可悲的是,是的!有了几个包含不同网站的 7 部电影的简单统计数据、一堆角色和制作团队成员的表格,我可以复制并粘贴到 Excel 文件中,稍微清理一下细节,我的数据集就可以开始工作了。幸运的是,意识到紧张的 2 天时间再一次在正确的时刻抓住了我。以我工作的速度,我不可能在第一天内完成我的数据收集。还记得我之前写的 6 条基本原则吗?利用花哨的技巧获得的结果。这就是它如何让我避免浪费更多不必要的时间。
可视化 Tableau 中的数据
我不得不承认,摆弄颜色、字体、字号,并试图在不同的页面上保持一致的格式是很烦人的。Tableau 中各种各样的定制选项有时也增加了我的困惑。我后悔不得不艰难地学习如何正确格式化 Tableau 仪表板。但是嘿,迟到总比不到好,对吧?这里有几个节省时间的提示,可能会对你有用。
初始设置
- 为了确保不同页面的格式一致,请专注于设计一个页面,并将其作为模板反复使用。这样你就不用担心第一页的文字比第二页的大了。
- 为了避免修改格式,首先发布模板来测试它在最终显示媒体上的实际效果。我没有足够早地这样做,不得不单独编辑字体颜色,因为 Tableau Public 中的颜色似乎比我在屏幕上看到的要暗。不要像我一样!
创建单独的图表
- 要调整图表大小,请使用单元格大小热键(格式>单元格大小),而不是费力地试图找到单元格的边缘并用鼠标拖动它
- 要在画布上拖动多个度量,请使用 CTRL 键,而不是一个一个地拖动它们
- 要在双轴图表中使用相同的度量两次复制一个字段,请按住 CTRL 键并将药丸拖动到它本身旁边,而不是在筛选左侧菜单上的一堆其他字段时迷路(并且意外地拖动了具有相似名称的字段)
巩固故事板
- 隐藏与已完成仪表板相关的所有工作表,以避免意外修改。
- 避免过早地配置导航流,因为您可能会在测试期间调整仪表板的顺序。我做得太快了,结果不得不一次又一次地更新。下一次,那只需要等到我对内容的逻辑流程完全满意。
完成最后的润色
- 通过设备预览来测试手机上的视觉效果,并相应地进行定制(如果时间允许),而不是热情地向朋友展示,然后意识到通过手机观看时格式混乱。好尴尬!
万一你想知道 2 天开发后的最终结果是什么样的(加上之后解决的一些愚蠢的格式问题),请随意查看最终产品这里。
离别的思绪
很难保持对个人项目的巨大动力,因为你根本没有得到报酬。但是如果我能从两天的项目中学到这么多,你也可以。就我个人而言,我选择相信所有的学习、勇气、激情和毅力都是为了某样东西。单个来看,每个小项目对我来说可能都不太重要。然而,我意识到我学到了大量的技能,这使我能够更自信地承担更大的项目。
如果你感到停滞不前或者认为你已经失去了尝试新事物的动力,这里有我的 4 个简单的建议。希望他们能给我们带来一些光明,并在困难的时候带来好运。
- 想想你爱的人,创造一些能让他们微笑的东西。这是打破思维障碍、享受更多数据乐趣的最简单方式。
- 永远不要等待那个完美的时刻。与数据打交道让我明白,在开始工作之前,我不需要知道所有的事情。从来都是反过来的。直接投入进去,这就是我如何慢慢地从这里多了解一点,从那里多接触一点。你永远不会知道所有的事情,这就是我们学习的方式。
- 确保你设定的最后期限足够短,以保持承诺。压力自然迫使我专注于最终目标,消除不必要的浪费,并快速思考。
- 拥抱好的、坏的和丑的。能够认识到自己的弱点、不好的品质和愚蠢的错误,然后采取行动与之和解,这意味着你正在成为最好的自己。
就这样,我祝愿每个人都有一个健康、快乐和神奇的 2021 年。充满爱!
原载于 2021 年 1 月 3 日 http://thedigitalskye.com**的 。
一致估计量

样本和总体标准偏差之间的绝对差值与样本大小的关系图(图片由作者提供)
回归建模器指南
一致估计量是一种随着处理的数据样本不断增加而产生越来越好的估计值的估计量。当数据样本的大小变得与总体一样大时,这种改进继续到极限情况,此时估计变得等于参数的真实值。
一致性是估计量的属性之一,还有其他属性,如偏差、均方误差和效率。
让我们用真实世界的数据集来说明这个概念。我们将使用前一篇文章中使用的相同数据,即东北大西洋的海洋表面温度:

东北大西洋实时海表温度数据集下载自 data.world 下 CC BY 4.0
让我们使用基于 Python 的 Pandas 库将数据集加载到内存中,我们将通过删除所有丢失的值来清理它:
**import** pandas **as** pddf = pd.**read_csv**('NE_Atlantic_Sea_Surface_Temperatures.csv', **header**=0, **infer_datetime_format**=True, **parse_dates**=['time(UTC)'])df = df.**dropna**()
让我们打印出数据集:
**print**(df)

清除了所有 NaN 行的数据集(图片由作者提供)
清理后的数据集差不多有 80 万个数据点,这相当大。让我们把这个数据集看作是值的总体。因此,在这种情况下,我们可以说我们可以访问人口,尽管在现实生活中,我们总是必须处理值的样本,并且我们永远不会知道人口的全部范围。
让我们计算并打印出“总体”的平均值和标准偏差:
pop_mean = df[**'sea_surface_temperature(degree_C)'**].mean()
pop_stddevs = df[**'sea_surface_temperature(degree_C)'**].std(ddof=0)print(**'Population mean (mu)='**+str(pop_mean))
print(**'Population variance (sigma^2)='**+str(pop_stddevs))
以下是这些值:
Population mean (**mu**)=**11.94113359335031**
Population variance (**sigma^2**)=**1.3292003777893815**
补替抽样法
为了说明估计量一致性的概念,我们将从这个“总体”值中随机抽取一个大小为 100(即 n=100) 的样本 [y_1,y_2,…y_i,…,y _ n】。我们将使用名为取样替换的技术抽取样本。这意味着我们将随机抽取第一个数据点 y_1 ,记下它的值,并将其放回总体中。我们将对所有的 n 值重复这个过程。
替换取样会产生重复,因此它并不总是一种实用的取样技术。例如,想象你正在为一项临床试验挑选志愿者。如果你使用置换抽样,理论上你可以多次登记同一个人,这显然是荒谬的。但是,如果您的值的总体非常大,即使在进行替换后,多次选择相同的数据点是一种极其罕见的可能性。
使用替换抽样的一大优点是,它确保样本的每个变量 y_i 可以被认为是一个独立、同分布(i.i.d .)的随机变量,这一假设可以简化很多分析。具有讽刺意味的是,尽管在现实生活中几乎不可能遇到独立同分布变量,但独立同分布假设却构成了统计科学中的几个基本结果。
在我们进入抽样领域之后,让我们回到我们关于估计量一致性的讨论。
对于每个样本【y_1,y_2,…y_i,…,y _ n】,我们将使用以下样本均值( y_bar )和样本偏差( s )的公式作为总体均值和标准差 σ 的估计量:

总体均值和标准差的估计值(图片由作者提供)
我们将使用上面的公式对一个大小为 100 的样本计算总体均值 ( ) 和标准差 (σ) 的估计值。接下来,我们将样本量增加 100 ,并重复和 σ 的估计,我们将继续这样做,直到样本量 n 接近总体量 N=782668 。
以下是 Python 代码:
**from** tqdm **import** tqdm increment = 100**#Define two arrays to store away the means and standard deviations for various sample sizes**
sample_means_deltas = []
sample_stddevs_deltas = []**#Increase the sample size by 100 in each iteration, and use tqdm to show a progress bar while we are at it
for** sample_size **in** tqdm(**iterable**=range(10, **len**(df), increment), **position**=0, **leave**=True): **#Select a random sample of size=sample_size, with replacement** random_sample = df.**sample**(**n**=sample_size, **replace**=True) **#Calculate the sample mean** y_bar = random_sample[**'sea_surface_temperature(degree_C)'**].**mean**() **#Calculate and store the absolute diff between sample and population means, and sample and population standard deviations** sample_means_deltas.**append**(**abs**(y_bar - pop_mean))
s = random_sample[**'sea_surface_temperature(degree_C)'**].**std**() sample_stddevs_deltas.**append**(**abs**(s-pop_stddevs))**#Plot |y_bar-mu| versus sample_size** plt.**plot**(sample_means_deltas)plt.**xlabel**('Sample size (n)')
plt.**ylabel**('|y_bar-mu|')plt.**show**()**#Plot |s-sigma| versus sample_size** plt.**plot**(sample_stddevs_deltas)plt.**xlabel**('Sample size (n)')
plt.**ylabel**('|s-sigma|')plt.**show**()
我们看到以下两个图:

样本和总体平均值之间的绝对差异相对于样本大小绘制(图片由作者提供)

样本和总体标准偏差之间的绝对差值与样本大小的关系图(图片由作者提供)
在这两种情况下,观察到参数的估计值和真实值之间的绝对差值随着样本量的增加而逐渐减小。
还要注意,即使样本大小( n )等于总体大小 N=782668,样本和总体均值之间的差的绝对值也不会变为零。这似乎有悖常理。如果样本和总体一样大,为什么样本均值不完全等于总体均值?答案在于回想一下,我们是使用替换抽样技术来生成样本的。当该技术用于有限大小的总体时,该技术的“替换”方面将导致样本具有几个重复值,即使样本大小等于总体大小。因此,即使在 n=N 的情况下,样本也永远不会与总体相同。
一致估计量
随着样本量的增加,总体均值和标准差的估计量似乎收敛于相应的总体值,这不仅仅是偶然现象。
我们可以证明它们总是会收敛到种群值。
在我们证明之前,让我们回忆一下什么是一致估计量:
一致估计量是一种随着处理的数据样本不断增加而产生越来越好的估计值的估计量。这种改进持续到极限情况,当数据样本的大小与总体一样大时,估计值等于参数的真实值。
我们可以用概率术语来表示一致性,如下所示:

将样本平均值指定为总体平均值的一致估计量 y_bar(图片由作者提供)
在上面的等式中,我们是说,无论你选择某个正值ε有多小,当样本量 n 趋向于 ∞ 时, n 样本值 y_n 的平均值与总体均值大于 ε 的绝对差值的概率 P() 为零
思想实验
人们可以使用如下的思维实验来观察上面的等式:
选择 ε 的一些微小正值。说 ε=0.01 。
- 从随机选择(替换)的 n 个值的样本开始。计算它的平均值 y_n ,从总体平均值中减去它,取差值的绝对值并存储起来。重复这个过程一千次,产生一千个绝对差值 |y_bar(n)- |。
- 将这些 1000 的差值分成如下两组值:第一组【S1】包含小于等于 0.01 的差值,即 |y_bar(n)- | ≤ ε。第二组 S2 包含大于 0.01 的值,即 |y_bar(n)- | > ε 。
- 计算绝对差值大于 0.01 的概率。这就是第二套的尺寸除以 1000 。即
P(| y _ bar(n)-|>ε)= sizeof(S2)/1000 - 现在增加样本量 100,重复步骤 1、2、3 重新计算概率 P(|y_bar(n)- | > ε)。
- 你会发现:
随着样本量 n 的增加,概率 P(|y_bar(n)- | > ε)减小,越来越接近零
你会发现,无论你选择 ε有多小,你还是会看到 P(|y_bar(n)- | > ε)随着 n 的增加而趋近于零。
任何估计量相合的一般条件
对于任何用于估计总体水平参数 θ 的估计量 θ_cap(n) , θ_cap(n) 是 θ 的一致估计量当且仅当:

任何估计量一致性的一般条件(图片由作者提供)
n 个样本值的平均值估计量是总体均值的一致估计量
回想一下,在文章的开头我们说过我们可以证明 y_bar 是的一致估计量。
为了说明这一点,我们将首先介绍Bienaymé–Chebyshev 不等式,它证明了以下适用于各种概率分布的有趣结果:
考虑一个概率分布,例如下面的泊松分布具有均值和标准差σ。在下图的样本泊松分布中, =20 和 σ = sqrt(20)=4.47213 。

平均比率=20 的泊松分布(图片由作者提供)
Bienaymé–Chebyshev 不等式表示随机变量 X 达到一个值的概率超过 k 偏离概率分布*的均值最多为 1*

bienaymé–Chebyshev 不等式(图片由作者提供)
继续我们的泊松分布变量 X 的例子,平均值 = 20,标准差 σ = sqrt(20)=4.47213,我们得到下表:

对于泊松随机变量 X ~泊松( = 20),最多 W%的值大于 k 偏离均值的标准差(图片由作者提供)
k 不必是整数。例如,如果 x=26,它与均值 20 的距离为| X-|/σ= | 20–26 |/4.47213 = 1.34164乘以标准差。因此,根据Bienaymé–Chebyshev不等式,泊松分布×泊松分布* 中最多有 100 个 /(1.34164) = 56% 的值会大于 26。*
那么所有这些如何帮助我们证明 n 个样本值的平均值均值 y_bar 是总体均值的一致估计量呢?**
让我们再次陈述我们想要证明的东西,以及 Bienaymé–Chebyshev 不等式:

(图片由作者提供)
让我们在 Bienaymé–Chebyshev 不等式中进行如下替换:

将随机变量 X 设置为样本平均值(图片由作者提供)
如果随机变量 X 设为样本均值 y_bar ,那么样本均值的均值就是总体均值样本均值的方差可以表示为σ /n.**
在 Bienaymé–Chebyshev 不等式的等式中,当我们用 y_bar 代替 X 时,我们保持不变,我们用 σ/sqrt(n)代替标准差 σ 。

将 X 替换为 y_bar 并将 σ 替换为σ/sqrt(n)后的 bienaymé–Chebyshev 不等式
现在让我们进行第二次替换:

(图片由作者提供)
我们得到以下结果:

(图片由作者提供)
现在我们将样本大小 n 增加到等于理论上无限的总体大小:

(图片由作者提供)
求解极限会得到我们想要的结果,即当样本大小变得任意大时,概率的极限为零,从而证明 n 个样本值的平均值是总体平均值的一致估计量。
回归建模的适用性
回归模型通常在样本(即训练数据集)上训练。经过训练后,模型的参数获得一组拟合值 β_cap 。如果您在另一个随机选择的相同大小的样本上训练该模型,则经过训练的模型很可能会获得另一组拟合值β’_ cap。对第三个样本数据集的训练将产生第三组拟合参数值β″_ cap等等。因此, 回归模型β_cap 的拟合系数实际上是具有均值和标准差的随机变量 的向量。实际上,回归模型不能对所有的值进行训练。因此 β_cap 永远无法获得系数的真实群体水平值 β 。这就是一致性联系的来源。如果要在越来越大的随机选择的样本上训练模型,当训练数据集的大小趋于无穷大时,如果P(|β_ cap—β|>【ε)= 0,则可以说 β 的估计过程是一致的。
参考文献和版权
数据集
东北大西洋实时海表温度数据集由 4.0 从 CC 下 data.world 下载
形象
本文中所有其他图片的版权归 Sachin Date 所有,版权归 CC-BY-NC-SA 所有,除非图片下面提到了不同的来源和版权。
感谢阅读!如果您喜欢这篇文章,请 关注我 获取关于回归和时间序列分析的技巧、操作方法和编程建议。
数据网格的权变模型
数据中断的最终基础

图片由 Diego Sanchez 在 Unsplash 上提供。
即使在数字世界里,也不能否认,自远古以来,技术和组织之间就一直存在着动态的相互作用,如果前者与后者不一致,那么前者永远也不能确定地产生某种结果。作为本文的起点,本文展示了即使在今天仍然存在显著的组织“趋势”,其中选定的组织模型并不总是基于给定特定背景、技术或特定目标的最合适的模型(也称为“权变模型”),而是遵循其他公司、研究人员或顾问当前视为最“现代”模型的论述。近年来的数字化如何爆炸式地进入一个新的数据破坏时代越来越清晰,与此同时,有人认为我们正在数据领域看到完全相同的过程——从数据湖中的单一设置到适应本地管理的更加分布式的数据设置(即所谓的数据网格)的趋势越来越强。本文提请注意在这种情况下,我们现在如何能够看到比该领域的“最新趋势”更有成效的方法的初步迹象,这变得更加有希望,在该领域中,我们以类似于组织研究中的方式能够辨别数据设置的权变模型的第一个胚胎。这篇文章认为,这很可能是 2022 年及以后取得数据颠覆性成功的最重要的先决条件之一。
技术和组织之间的动态互动
虽然几十年来,我主要被认为是一般意义上的数字战略的先驱之一,随着时间的推移,它在数据破坏中的应用,特别是技术创新的优点,但自从我在几百年前完成变革过程的博士研究以来,我一直对组织领域着迷。
因为不管你有多喜欢,都不可能回避它们之间的联系。技术永远不会为某个目标提供片面确定的结果,它最多可以充当“变革的触发器”,新技术的引入可以提供机会——甚至“理由”——以不同的方式进行重组。在我们有了愿景和战略之后,或者在数字的动态中至少有一个弹性框架在发挥作用之后,真正的动态就在技术和组织之间的界面上发生了。

作者图片
对我来说,这一点在我与三大洲 100 多家公司的数字战略合作的几十年中变得尤为明显。我们已经确定了目标,并相应地调整了数字战略,但是为了实际实现不同的数字实体和实现目标,我们无法避免组织需要进行的改变。
因此,在重要的会议和活动中,他们可能会称我为数字战略家或技术影响者,但这些年来我所取得的任何成功的最大原因之一仍然是我不仅对数据、创新和新兴技术着迷,而且至少对组织着迷。
组织变革的双重驱动力
当我称赞对组织的兴趣时,我并不仅仅指它作为“工具”的工具功能(这个词的词源来自希腊语“organon”,意思是“工具”),以在各种事情上取得成功,从而获得商业成功或解决社会挑战。
因为除了组织的工具功能之外,我指的至少是我们人类如何让自己被吸引到最新的社会“趋势”中来组织自己的魅力,而不管这种趋势是否实际上构成了实现我们目标的更好的“工具”。

图片由 Unsplash 上的 Caroline van Oijen 提供。
这在宏观层面的同构研究和微观层面的种群生态研究中都有所体现。在更具体的层面上,最新的“管理话语”展示了公司是如何被改变的,即目前在经理和顾问中最“时髦”的是什么。
当人们考虑到这些趋势是如何看待经典二分法之间的永恒振荡过程时,这变得更加可怕,例如高层次和低层次,严格和宽松监管的过程,为开发或探索而建立的组织,尤其是它在集权和分权之间的振荡。
在本文中,我们将讨论这种振荡过程是如何在大型组织中的公司处理数据的过程中表现出来的,以及它与下一个大趋势“数据网格”的关系。
我们如何面对数据中断的新时代
几年前,这个故事开始将数据视为世界上的新石油,这是我们都投身于元宇宙的先决条件,去年在金平达到高潮,宣布数据为“第五种生产要素”,等同于劳动力、土地、资本和技术。这是一个长期趋势的结果,数据被视为新的数字应用蓬勃发展所需的燃料,不管结果是好是坏。随着所有这些现在终于在一个真正的数据颠覆时代爆发,数据的关键价值已经体现在它如何突破成为过去十年全球独角兽、decacorns 和 hectocorns 的最重要的 KSF 之一。
数据爆炸正在快速发生。虽然人类从文明的黎明到千年之交设法在世界上创建了 0.005 zetta 字节的数据(1 ZB = 1⁰字节= 1 万亿 GB),但今天同样数量的数据是在不到 1 天的时间内生成的。与我们人类从线下生活到线上生活的方式一致,在极端情况下成为一个完全的远程物种,今天产生了如此巨大的数量,以至于很快就会以三位数的 ZB/年来计算。
而且不止于此。因为通过近几十年 4G 和现在 5G 的发展,这也意味着数据可以以更大的容量和更快的速度传输。当我们朝着越来越强大的计算机平行前进,并且量子计算机即将到来时,我们已经迈出了处理这些数据的大步。
最重要的是,我们后来看到了真正的破冰船,我们从生硬的“大数据”到日益先进的人工智能、人工智能甚至 AGI,在那里,我们在大量令人敬畏的数据科学家的帮助下,可以在使用人工智能将这些海量数据转化为以惊人的精度执行预测、预防和处方时创造奇迹。
所有这些对我个人来说都是我整个职业生涯中最重要的基石之一,从我的应用统计学(多元方法)论文开始,以及后来的科学理论和研究方法的博士研究,我已经将数据作为我成功的唯一最重要的工具。
这不仅仅是关于我作为一个科学的“行业反叛者”是如何在千禧年快乐的转折之后进入的,并开始要求和应用数据来为一大群价值数十亿美元的公司确定最合理的战略,以及率先使用数据和高级分析来优化其摇篮中的数字营销。这导致了瑞典围绕数字营销分析和战略的 real gem(Anegy,后来被出售给一家上市公司)的成立,也是我担任 WFA 600 家公司数字顾问的荣誉职位数年的平台,代表了全球所有媒体投资的 90%。

作者图片
对于所有这些,甚至在我自己的科技企业中——6 家,其中 2-3 家存在——基础都是数据。这不考虑它是否是关于相当基本的事情,如我们应该如何选择和优化交通渠道以及形式和内容,成为该国最大的健康网站,拥有 100 万游客。它是关于移动游戏应该如何发展,以达到我们在全球收到的 1500 万次下载。它也是关于我们如何在移动平台上使用人工智能的,它的第一个表现形式成为该领域中世界上最大的独立应用程序,受到 165 个国家超过 20 万人的喜爱,以及随后开发的 EdTech 平台,不仅使学习的形式个性化,而且使内容本身个性化,从而一劳永逸地彻底改造了世界上需要学习的人。
在所有这些情况下,数据已经成为“业务”本身的一个基本部分,它已经从数字产品的推动者变成了产品本身。也就是说,我们如何从将数据作为其他功能和服务的副产品放在外围设备中,发展到将数据作为产品( DaaP )。
在现代组织中应该如何处理数据
考虑到这一点,以及近年来数据在社会中的普遍地位,特别是它在公司和组织中扮演的核心角色(在某些情况下是最核心的角色),对我来说,毫无疑问,组织内部处理数据的方式迫切需要范式转变。
毫无疑问,这种模式转变是一种已经持续了一段时间的趋势,而集中和分散之间永恒振荡过程的下一步,分散模式,如【DDD】、微服务和 DevOps,已经慢慢开始跟上。所有这些都由 MACH 架构提供技术支持,从广泛的套件和生态系统到 api 优先战略,该战略由许多具有无头部署的最佳 SaaS 平台组成,并通过现代 IPaaS 进行集成。可以也应该认为,这一切都遵循了一个更广泛的趋势,即边缘计算等技术创新和“自主细胞”等组织趋势,都在使用章鱼触手中分散大脑的比喻,而不是集中的哺乳动物大脑。在数据领域,操作层面的所有内容都体现在 DataOps 中,而在架构层面,则体现在更加面向领域的数据,以及本地管理。
关于后一个领域,通过推出概念数据网,Zhamak Dehghani 在数据架构的分散设置的包装和品牌重塑方面产生的极端影响是不可避免的。今天,她的观点越来越闻名于世,但对于那些还没有遇到它的人(至少我仍然会遇到一些人,特别是在传统的“it”中,他们仍然没有),它简要地讲述了我们如何将数据设置重新分配给各个领域实体,这些实体通过分散的自助服务设计(例如 ELT 管道)可以对他们自己的领域数据负责,他们“作为产品”处理这些数据(DaaP)。
为了确保全公司范围内通用数据的可访问性和标准化,从而实现互操作性和跨域协作,这两个领域的优势将通过分布式数据的基础设施生态系统结合起来,即所谓的数据网格架构。
在这种情况下,最有意思的是实际应用中的实际价值,作为我们对技术和组织之间互动的讨论的直接反映,通常是如何被以“组织反思”的形式在本地“数据所有者”甚至“数据产品经理”的层面上理解为组织的——这里用 eCom 巨头 Zalando 的数据工程经理的话来说明:
“我们将以前未维护的数据集转变为有价值的资产,具有明确的目的和明确的利益相关方/… /确保此类数据产品的所有权和责任属于最了解数据的人。”
虽然从单一数据仓库到数据湖的“革命”更多的是使用新技术来修复旧流程,而不是创新新流程,但很明显,数据网格的技术和组织应用构成了一个极端的支点(或使用 Kuhns 和 Dehghanis 的话来说是“范式转换”),与世界上大多数组织传统上处理数据的方式不同。
因此,毫不奇怪的是,这个包装得如此之好、背景如此之好、理由如此之充分的概念,有可能一下子粉碎旧的单片计算机工程师、架构师和 It 顾问视为他们在大型组织中的核心能力和“存在理由”的一切。
当然,这引起了强烈抗议。当然,也会有摩擦。当然,是时候去旧迎新了。
还是?
组织的权变模型
回到我们开始的话题,我们几乎不可能摆脱技术和组织之间的互动。当这种情况没有发生时,无论“其他地方”有什么证据表明某项技术带来了什么,都无关紧要——同样,无论数字战略在纸面上看起来有多好,如果它与组织中不同的背景条件不协调,如果组织中的人们没有参与并实际意识到这一点,也就是说,从虚构变为事实,也无关紧要。
柏林墙并没有在 1989 年“倒下”。是人让它“倒下”的。

图片由 Claudio Schwarz 在 Unsplash 上提供。
在我对组织着迷的数字时代之前,这是最让我着迷的事情之一。
因为无论对组织的兴趣发生在公司和工程师身上,正如它最初在科学管理中表达的那样,还是由所有对运动中的软因素采取完全辩证立场的心理学家和社会学家进行的,后来被称为 T2 人际关系,所有早期的组织研究都致力于寻找“完美”的组织。
这种思维模式在 1965 年消亡了。
它在琼·伍德沃德发表她关于技术对组织的影响的伟大实证著作的那一天寿终正寝,随后是 Lawrence & Lorsch 和其他人,以及“组织的权变模型”的发展。简而言之,这是一个理解的问题,即永远不会有一个“完美”的组织,而只是取决于各种背景条件(市场、技术、产品、经济、环境的动态程度等)的最合适的组织。).
在组织研究中,这在当时几乎和尼采在 1983 年宣布上帝已死从而向世俗化迈出最后一步一样亵渎神明和“权威”。
尽管如此,它后来又开始冒泡了。再一次。再一次。1982 年,麦肯锡咨询公司的彼得斯&沃特曼(Peters & Waterman)凭借他们的著作“寻找卓越”取得了突破性进展,该书通过研究 42 家(当时)表现良好的公司,声称发现了“优秀公司的八大特征”。当他们的麦肯锡同事吉姆·科林斯 13 年后突破性地出版了同样值得纪念的书籍《持续经营》(Built to Last),该书对 18 家(当时)有远见的公司进行了研究,并声称已经确定了有远见的公司的标准,随后是真正经典的“从优秀到卓越”,该书对 11 家(当时)财务上成功的公司进行了研究,确定了公司在财务表现方面从“优秀”到“优秀”的五个标准。当著名的研究人员,也是麦肯锡的顾问 Nohria 和 Williams 在《什么真正有效》一书中,基于对 160 家(当时)最成功的公司中使用的 200 种管理技术的研究,声称他们已经确定了事实上导致财务成功的 4 + 2 方法时,这种观点再次出现。
现在它又冒泡了。这次是在如此重要的数据领域。我们又到了哪里,“追求卓越”,想要“从优秀走向卓越”。因为在这个极其重要的领域,我们终于找到了答案。唯一的方法。“真正管用的”。
这肯定是我们发现的,不是吗?
数据设置的权变模型
在这里,我不得不指出,历史总是如此频繁地重演,这是多么有趣。对于那些认真研究过这个世界上变化过程是如何发生的人来说,要知道辩证过程往往比逻辑过程更重要。

作者图片
我们之前已经看到,在组织理论中有这样一种趋势,即从一个命题(科学管理)到一个对立面(人际关系),最后在一个综合中内爆(权变)——在这种情况下,在前面两个极端中断言的模型反而被证明根据上下文产生不同程度的成功。
同样,我认为,在目前世界上可能最关键的领域——数据——中,我们已经能够看到完全相同的过程——趋势从命题(单一数据仓库和数据湖)走向对立面(分布式数据网格),这反过来不需要太多的智能来准确预测可以和应该遵循的综合。

作者图片
也就是说,这两个极端本身并不构成“错误”,而仅仅是它们的优点不同,这取决于实施它们的组织中不同的环境条件。
考虑到数据和数据处理的方式并不是一个重要的领域,但对于许多公司和组织来说,这可能是未来成功的最重要的领域(无论今天是否意识到这一点),如果人们愿意,至少可以慢慢辨别出这种初步综合的雏形,或者“数据的应急模型”,这应该是令人满意的。
其中一个问题是,数据网格对于大公司来说是否比小公司更能实现其 T2 功能。在当前的一篇论文中,这一点已经成为问题,文章认为,决定数据网格成功与否的往往不是规模,而是除了特定行业对数据的主要需求之外,更关心的是组织拥有具有高数据成熟度的分散数据解决方案,以及域定义和数据所有权的清晰性。其他更技术性的建议针对适合数据网状架构而非单一变体的情境因素,包括组织是否启动了 DDD,使用微服务,或使用基于云的迁移,以及在高级别上如何在结构上良好地协调数据,以及在文化上公司有多高的数据成熟度。
除此之外,还可以添加更多与数据相关的背景,其中,域的数量、数据团队的规模以及数据团队成为支持数据的新一代产品的瓶颈的频率,被认为是在集中式和分散式数据架构之间做出选择的决定性因素,并结合了数据源的数量、需求和公司对数据治理的优先级。类似方向的另一个步骤是来自 Strengholt 的一个精心设计的帖子,在那里,他部分地展示了,像在 Balnojan 之前一样,它如何不是关于集中化和去中心化之间的二分法,而是相反地,确定了至少三种不同的方法来实现数据网格架构——从“受管网格拓扑”到“高度联合网格类型”的递减规模。同样,模式的选择是基于从组织成熟度和技能到组织的结构、规模、动态和风险偏好等各方面的背景。
基于以上所述,这种第一个高度试验性的元理论至少可以作为数据设置的权变模型的初始胚胎的种子,并看起来像下面这样——所有这些都需要在溯因过程的未来阶段通过更多经验数据的展开来验证和证伪。

作者图片
前进的道路
越来越清楚的是,我们正在走向一个新的数据破坏时代。因此,当现在开始追踪第一个胚胎到一个初始的应急模型,以获得更富有成效的数据设置选择时,我认为我们都可以感到高兴,因为它将从当前的仅仅是指示性的数据转向更具体的大量经验数据,从而能够提供统计意义和明确的证据。但是,最重要的是,我们在对“真正有效的东西”的诱人追求和“从优秀到卓越”的雄心中,永远不会再陷入最新的“趋势”——而是要检测什么样的背景因素将导致什么样的数据架构是最好的,以便从优秀到卓越。
只有到那时,我们才能找到一个基于情况的模型,该模型有一些成功的机会,可以显示某个处理数据的设置何时比另一个更好。只有到那时,我们才有可能成功,释放资源,包括技术和人力资源,这是认真处理“数据即产品”所必需的,并在重塑公司、行业甚至整个社区方面发挥主导作用。
活着的人会看到。行动的人不仅要看到,而且要享受所看到和播种的果实。一旦我们面临一个数据中断的时代,可能没有什么比这更重要了。QED。
*后来,这些公司中的大多数不仅失去了他们当时所谓的“卓越”和“有远见”的品质,而且完全失败了。
鲁弗斯·利德曼,电影。Lic。

Lidman 是著名的数字创新者和数据颠覆者,连续社会企业家和顶级技术影响者,拥有 50,000 名追随者。他拥有双学位和博士学位,并以数据科学为平台,是 IAB 的创始人,WFA 的数字顾问,拥有 300 多场讲座的知名演讲者,并在 100 多家公司担任数字战略和创新方面的任务,如三星、宜家、梅赛德斯、伊莱克斯、普华永道等。作为一名数字企业家,他已经经营了 6 家企业,拥有 2-3 个 ok 出口,包括访问量达数百万的网站和一些下载量超过 1500 万的全球最大应用。作为他的最新投资,他在瑞典联合创建了领先的数字人才收购公司 Digitalenta,并在新加坡创建了 EdTech PTE Ltd,利用领先的技术为新兴市场的贫困人口重新创造学习机会。除此之外,他还出版了 4 本书和世界上最大的数字战略学习应用,受到 165 个国家 20 万人的喜爱。
平均全球的正确方法
为什么对数据进行面积加权很重要

美国宇航局在 Unsplash 拍摄的照片
平均值。这是一个非常简单的计算:把你所有的数据点加起来,然后除以总点数。举例来说,如果你正在计算全球平均温度,这个简单的等式是否有效?不完全是。这篇文章概述了如何计算维度为time、latitude和longitude的网格数据集的全局平均值。换句话说,在每个time步计算latitude和longitude的平均值。我首先解释为什么使用经典公式计算变量的空间平均值是不合适的,然后说明为什么加权平均值是合适的,最后给出一个使用公开可用数据集的示例。
下载数据
我将使用的数据是来自伯克利地球的陆地和海洋温度异常的 1 x 1 网格数据集。以下 python 代码将下载数据并将其读入内存。
import xarray as xr
import pooch# save data to temporary location
flname = pooch.retrieve(‘[http://berkeleyearth.lbl.gov/auto/Global/Gridded/Land_and_Ocean_LatLong1.nc’](http://berkeleyearth.lbl.gov/auto/Global/Gridded/Land_and_Ocean_LatLong1.nc'), None)# read data into memory
ds = xr.open_dataset(flname)
可以用ds.info()查看文件的元数据。从元数据中,我们看到地表温度距平变量temperature,它是地表气温与气候学的差值。在这种情况下,气候学是 1951 年 1 月和 1980 年 12 月的平均值。

文件元数据(图片由作者提供)
传统意义上
当我们想到数据集的平均值X时,可能会想到下面的等式。这是传统的意思。等式中,i代表每个latitude,longitude坐标对,N为总对数对。

向量 X 的均值方程(图片由作者提供)
我也称之为“平地球平均值”,它假设地球没有曲率,每个纬度和经度位置的数据都被平等对待。为什么这很重要?因为 1×1 的网格盒从热带移动到极点时占据的面积更小。这意味着赤道附近的数据比北极对平均值的影响更大,因为它占据了更多的区域。这表明我们应该根据每个数据点所占的面积对其进行加权。
我也称之为“平地球平均值”,它假设地球没有曲率,每个纬度和经度位置的数据都被平等对待。
在xarray符号中,这个传统的或“平地球”的意思可以这样计算:traditional_mean = ds['temperature'].mean(['latitude','longitude'])
加权平均值
这是加权平均值的一般公式:

向量 X 的加权平均值方程(图片由作者提供)
这类似于传统的平均值,只是每个数据点都有一个权重,wi,分母是所有权重的总和。传统平均值只是加权平均值的一个特例,其中每个权重等于 1。
传统平均值只是加权平均值的一个特例,其中每个权重等于 1。
计算全球面积
在地球科学中,首选方法是按面积对数据进行加权,即按每个网格单元的面积对每个数据点进行加权。在计算面积加权平均值之前,我们首先需要知道每个格网单元的面积。如果没有提供网格单元区域,下面的代码将有助于计算区域网格。
地球的形状是一个扁球体,就像“压扁”的球体。下面的代码计算地球的格网单元面积,半径是 1984 年世界大地测量系统中纬度的函数。等式的一个推导是这里是。
区域加权全球平均值
现在我们知道了什么是加权平均值以及如何计算面积图,让我们将所有这些信息放在一起,使用下面的代码计算全球平均温度异常。
# area dataArray
da_area = area_grid(ds['latitude'], ds['longitude'])# total area
total_area = da_area.sum(['latitude','longitude'])# temperature weighted by grid-cell area
temp_weighted = (ds['temperature']*da_area) / total_area# area-weighted mean temperature
temp_weighted_mean = temp_weighted.sum(['latitude','longitude'])
可视化全球平均值
下面是全球气温异常图,月值显示为灰色,5 年平滑值分别使用标准平均值和面积加权平均值显示为红色和黑色。差别是微小的,但面积加权平均值显示在过去 20 年中有轻微的异常。原因是因为北极比低纬度地区变暖得更快,尤其是在最近一段时间。标准平均值放大了变暖幅度,尽管它只占地球的一小部分。加权平均值减弱了北极变暖的影响,为全球平均温度异常提供了更精确的计算。

使用伯克利地球数据集的全球平均温度异常(图片由作者提供)
最后的想法
计算地理空间平均值时,对数据进行加权不仅重要,还需要如实显示平均值,而不是夸大结论。
计算全球平均值时,需要注意以下几点:
- 注意总面积。如果只计算陆地上的全球平均温度,则需要在区域数据集中屏蔽掉海洋,并根据陆地总面积对权重进行归一化。
- 如果数据集在空间上是不完整的,复杂的方法【2】更合适。
总之,如果您有一个空间完整的格网数据集,面积加权是计算全球平均值的正确和最佳方法。然而,如果网格化数据包含间隙,则需要先进的技术。最后,另一种方法是对数据进行余弦加权,即通过纬度的余弦值对数据进行加权。概念是相同的,你可以使用cos('latitude')作为你的权重矩阵,而不是使用网格单元面积。
希望这篇文章能在计算全球平均值时提供一些有用的指导。
代码源
这篇文章中使用的所有代码都在这里
如果您对这篇文章有任何疑问或觉得它有帮助,请留下您的评论。
参考
[1]罗德和豪斯父亲, 《柏克莱地球陆地/海洋温度记录》 (2020),ESSD
[2]考坦、雅各布斯、索恩和威尔金森, 简单全球温度估值器覆盖误差的统计分析 (2018),DSCS
感谢阅读和支持媒体作者
https://lukegloege.medium.com/membership
Python 中重载函数的正确方法
有人教过你函数重载在 Python 中是不可能的吗?下面是如何使用通用函数和多重分派来实现的!

函数重载是一种常见的编程模式,似乎只适用于静态类型的编译语言。然而,借助于多重分派或 Python 多重方法的帮助,有一种简单的方法可以在 Python 中实现它。
过载
首先,你可能会问,在我们都知道不可能的情况下,我们如何在 Python 中实现方法重载呢?嗯,尽管 Python 是动态类型语言,因此不能有适当的方法重载,因为这要求语言能够在编译时区分类型,但我们仍然可以用一种适合动态类型语言的稍微不同的方式来实现它。
这种方法被称为多重分派或多重方法,其中解释器基于动态确定的类型在运行时区分函数/方法的多个实现。更准确地说,该语言使用在函数调用期间传递给函数的参数类型来动态选择使用(或分派)多个函数实现中的哪一个。
现在你可能会想:“我们真的需要这个吗?如果它不能正常实现,也许我们不应该在 Python 中使用它……”是的,有道理,但有很好的理由想在 Python 中实现某种形式的函数/方法重载。这是一个强大的工具,可以使代码更加简洁,易读,并将其复杂性降至最低。如果没有多重方法,那么“显而易见的方法”就是使用带有isinstance()的类型检查。这是一个非常丑陋、脆弱的解决方案,不允许扩展,我称之为反模式。
除此之外,Python 中已经有了操作符的方法重载,像使用所谓的 dunder 或 magic 方法的len()或new()方法(参见文档这里的)我们都经常使用,那么为什么不对所有函数使用适当的重载呢,对吗?
现在我们知道我们可以用 Python 来实现重载,那么我们具体是怎么做的呢?
单一调度
上面我们谈到了多重分派,但是 Python 不支持这种开箱即用,或者换句话说多重分派不是 Python 标准库的特性。然而,我们所能得到的叫做单次发货,所以让我们先从这个简单的例子开始。
多和单调度之间唯一的实际区别是我们可以重载的参数数量。因此,对于标准库中的这个实现,它只有一个。
提供这个特性的函数(和装饰器)被称为singledispatch,可以在functools 模块中找到。
这整个概念最好用一些例子来解释。我们可能都已经见过很多重载函数的例子(几何图形、加法、减法……)。与其讨论这个,不如让我们看一些实际的例子。所以,这里是singledispatch格式化日期、时间和日期时间的第一个例子:
我们从定义将要重载的基本format函数开始。这个函数用@singledispatch修饰,并提供基本实现,如果没有更好的选择,就使用这个函数。接下来,我们为我们想要重载的每种类型定义单独的函数——在本例中是date、datetime和time——每个函数都有名称_(下划线),因为无论如何它们都将通过format方法被调用(调度),所以不需要给它们起一个有用的名称。它们中的每一个都装饰有@format.register,将它们连接到前面提到的format功能。然后,为了区分类型,我们有两种选择——我们可以使用类型注释——如前两种情况所示,或者显式地将类型添加到 decorator,如示例中的最后一种。
在某些情况下,对多种类型使用相同的实现可能是有意义的——例如对于像int和float这样的数字类型——在这些情况下,装饰堆栈是允许的,这意味着您可以列出(堆栈)多行@format.register(type)来将一个函数与所有有效类型相关联。
除了重载基本函数的能力之外,functools模块还包含可以应用于类的方法的[singledispatchmethod](https://docs.python.org/3/library/functools.html#functools.singledispatchmethod)。这方面的例子如下:
多重调度
通常单一分派是不够的,你可能需要适当的多重分派功能。这可从multipledispatch模块获得,该模块可在此处找到,并可与pip install multipledispatch一起安装。
这个模块和它的装饰者——@dispatch,行为与标准库中的@singledispatch非常相似。唯一的实际区别是它可以接受多种类型作为参数:
上面的代码片段展示了我们如何使用@dispatch装饰器来重载多个参数,例如实现不同类型的连接。正如你可能注意到的,使用multipledispatch库,我们不需要定义和注册基本函数,而是创建多个同名的函数。如果我们想提供基本实现,我们可以使用@dispatch(object, object),它将捕捉任何非特定的参数类型。
前面的例子展示了概念验证,但是如果我们想真正实现这样的concatenate函数,我们需要使它更加通用。这可以通过使用联合类型来解决。在这个具体示例中,我们可以将第一个函数更改如下:
这将使得函数的第一个参数可以是list或tuple中的任何一个,而第二个参数可以是str或int。这已经比前一个解决方案好得多,但是可以使用抽象类型进一步改进。不用列出所有可能的序列,我们可以使用Sequence抽象类型(假设我们的实现可以处理它),它涵盖了类似list、tuple或range的内容:
如果您想采用这种方法,那么最好查看一下collections.abc模块,看看哪种容器数据类型最适合您的需求。主要是为了确保您的函数能够处理属于所选容器的所有类型。
所有这些参数类型的混合和匹配都很方便,但是在为一些特定的参数集选择合适的函数时,也会导致歧义。幸运的是,multipledispatch提供了AmbiguityWarning,如果可能出现不明确的行为,就会引发该事件:
结束语
在本文中,我们讨论了一个简单而强大的概念,我很少看到它在 Python 中使用,考虑到它可以极大地提高代码可读性并摆脱反模式,如使用isinstance()的类型检查,这是一个遗憾。另外,我希望你会同意这种函数重载的方法应该被认为是“显而易见的方法”,我希望你在需要的时候会用到它。
如果你想更深入地研究这个主题,你可以自己实现多重方法,如 Guido 的文章所示——这是理解多重分派实际上是如何工作的一个很好的练习。
最后,我可能还应该提到,这篇文章省略了我在开始提到的众所周知的操作符重载的例子,以及一些重载构造函数的方法,例如使用工厂。所以,如果那是你正在寻找的,去看看这些链接/资源,它们对这些主题有很好的概述。
本文最初发布于martinheinz . dev
视觉变形金刚的创意一面
视觉变形器生成图像并绘制照片

什么是创造力?最受认可的定义如下:
“创造力是创造新奇事物的能力”
它被认为是人类最重要和不可替代的特性之一。但如果这是如此特殊的特征,神经网络就不可能模仿它,不是吗?不完全是。今天,我们在创建具有生成模型的创造性人工智能方面面临着一些特殊的问题,主要被称为生成对抗网络(GANs)。这些被深度学习之父之一 Yann Le Cunn 认为是本世纪在 AI 领域最重要的突破[8]。
生成对抗网络
生成对抗网络(GANs) [3]由 Ian Goodfellow 在 2014 年提出,并立即用于执行壮观的和从未探索过的任务。
第一个也是最广泛使用的应用是生成新图像,正如我在以前的文章《人工智能如何想象宇宙》中所展示的那样?【5】生成如下行星和天体的图像:

图片由作者
所有这些图像都代表了由神经网络生成的不存在的对象,动物、人以及所有形状和类型的对象也是如此。

使用轻量级 GAN 生成的图像
这些网络最近被证明能够执行非常有用的任务,例如提高照片的分辨率,或者有时非常有趣,例如让史蒂夫·鲍尔默和小罗伯特·唐尼合唱布鲁诺·马斯的《Uptown Funk!
作者使用 Wombo.ai 制作的视频
尽管乍一看这似乎很吸引人,而且完全无害,但这背后隐藏着严重的影响和危险。这些模型还每天被用来欺骗人们或破坏他们的声誉,例如通过所谓的 deepfakes。
现在有了这项技术,就可以把源演员的脸转置到目标演员的脸上,使其看起来、说话或动作都和源演员一模一样。一个视频 deepfake 可以让人们相信一位政治领导人发表了特别危险的言论,加剧了人们之间的仇恨,或将一个人置于他或她从未经历过的不恰当的环境中,或者这些视频可以在司法程序中代表伪造的证据。
像所有的工具一样,它没有好坏之分,它总是取决于你如何使用它。
但是在深入本文的核心之前,对生成性对抗网络的内部工作原理做一点解释是合适的。

图片由作者来自人工智能如何想象宇宙?
GANs 由两个不同的网络组成,通常是两个卷积网络,一个生成器和一个鉴别器,它们是相互对照的。生成器查看输入数据,试图生成新的可信图像,以欺骗鉴别器。另一方面,鉴别器试图理解给定的图像是生成的还是原始的。当生成器在生成图像方面变得足够好以至于骗过鉴别器时,除了输入数据中存在的例子之外,它还可以用于创建其他可信的例子。
视觉变形金刚
在进入文章核心之前,最后一点题外话。对于那些从未听说过视觉变形金刚的人来说,这是一种正在彻底改变计算机视觉领域的新架构。它基于自我注意的机制,该机制使用通过将输入图像分割成小块并将它们投影到线性空间而获得的向量。基于视觉转换器的架构是当今计算机视觉中最有前途的方法之一,并取得了惊人的成果。

图片由作者从上看变形金刚、时代先锋和关注
但是如果视觉变形金刚这么棒,难道不值得用它们来做 GANs 吗?
TransGAN:两个纯变形金刚可以组成一个强大的 GAN,而且可以扩大规模!
这项研究旨在回答这样一个问题:不使用卷积网络能否创建 GAN?gan 通常依赖卷积网络作为生成器和鉴别器。相反,在这种架构中,只使用视觉转换器,这对于鉴别器来说非常简单,因为它是一个普通的分类器,必须判断图像是否是伪造的,但生成器呢?在这种情况下,情况更加复杂,因为依赖于自关注机制的变压器需要大量的计算资源,因此以期望的分辨率直接生成图像可能很快变得过于昂贵。
因此,发生器的架构由一系列变换编码器组组成。每一个都以增加的分辨率接收图像,但是在减少的通道数量上,以便降低复杂性。换句话说,生成器开始处理带有许多通道的小图像,然后处理带有较少通道的较大图像。

图片由作者基于 TransGAN:两个纯变形金刚可以做一个强 GAN,并且可以放大
例如,如果我们想要在 3 个通道上生成一个 32×32 像素的图像,则最初会生成一个代表简单噪声、大小为 8×8 的图像,就像在经典 GAN 中一样。这由一系列的变换编码器进行变换,过一会儿,进行放大,将其变换为 16x16,并减少通道的数量。这个过程被进一步重复,直到达到 32×32 的目标分辨率。最后,由最后一组编码器生成的矢量被转换回小块,以构成输出图像。
因此,有了 TransGANs [1],就有可能以一种计算上可持续的方式生成图像,而不使用卷积网络,但是有一个小细节仍然需要研究:放大是如何执行的?

图片由作者基于的实时单幅图像和视频超分辨率采用高效的亚像素卷积神经网络
在增加分辨率的同时减少通道所采用的策略如图所示,包括将每个像素“列”转换成单个超像素。所有超像素被组合在一起以获得单个更高分辨率的图像。
为了通过实现更高分辨率的输出来进一步提高性能,最后的变压器编码器被网格变压器模块所取代。

图片由作者基于 TransGAN:两个纯变压器可以组成一个强大的 GAN,并且可以按比例放大
在所谓的网格自注意中,不是计算给定标记和所有其他标记之间的对应关系,而是将全尺寸特征图划分成许多不重叠的网格,并且在每个局部网格内计算标记交互。
TransGAN 能够在 STL-10 上建立新的最先进水平,并在 CelebA 和 CIFAR-10 等其他数据集上匹配基于卷积网络的架构的结果。
结果在许多情况下都非常出色,激发了人们对基于视觉变形金刚的新 GAN 变体的兴趣!
油漆变压器
另一个基于视觉变形金刚的有趣且有创造性的作品是油漆变形金刚[2]。这个模型能够把一幅普通的画变成一幅画!

图片来自官方油漆变形金刚库
这里的问题是作为给定图像的一系列笔划的预测来处理的,以便以非真实感的方式重新创建它。
该过程是渐进的,在每一步,模型并行预测多个笔画,以最小化当前画布和目标图像之间的差异。两个模块用于实现这一点:笔划预测器和笔划渲染器。
笔划渲染器负责将一系列笔划作为输入,并将它们放在画布上。笔画预测器是架构的核心,其任务是学习预测生成图形所需的笔画。

整个培训过程是自我监督的,一种创新的和更可持续的培训方法 [7]。首先,生成一些随机的背景笔画,并由笔画渲染器放置在空画布上,从而获得中间画布。随后,随机的前景笔划被生成并放置在前一个画布上,以从另一个笔划渲染器获得目标画布。预测器接收中间画布和目标画布,并试图生成要放置在中间画布上的潜在前景笔画。预测的笔画然后被放置在中间画布上,并且笔画和目标画布都被用于计算与原始笔画的差异,并且因此损失被最小化。

笔画预测器包含两个 CNN,它们负责从两个输入画布中初步提取特征。这些笔画首先通过一个转换器编码器,然后通过一个转换器解码器输出所需的笔画。

由于这种架构,现在有可能将任何照片变成一幅具有不同和特殊效果的画!
结论
有人说,除了创造性的工作,人工智能将能够做任何事情。今天,这种说法不再可靠。他们正在让现实变得不那么清晰,伪造的图像和视频很难与原始图像和视频区分开来,他们正在制作照片,给照片上色,假装自己是画家,以及许多其他有趣的应用。现代深度学习技术正在展示使用人工智能可能获得的奇迹,而我们只是触及了这个迷人领域的表面。
参考资料和见解
[1]“江一帆等人”。 TransGAN:两个纯变压器可以组成一个强 GAN,并且可以放大
[2]《刘松华等著》。"绘制转换器:带有笔画预测的前馈神经绘制"
[3]“伊恩·j·古德费勒等人”。"生成性对抗网络"
[4]“阿列克谢·多索维茨基等人”。"一幅图像相当于 16x16 个字:大规模图像识别的变形金刚"
[5]《大卫·柯考米尼》。"人工智能如何想象宇宙?
[6]《大卫·柯考米尼》。"关于变形金刚,时间创造者和注意力"
[7]《大卫·柯考米尼》。"视觉变形金刚中的自我监督学习"
[8]《凯尔·威格斯》。"生成性对抗网络:什么是 gan 以及它们是如何进化的"
[9]“大卫·科科米尼等人”。"结合 EfficientNet 和视觉转换器进行视频深度防伪检测"
数据科学和分析中关键但经常被忽视的技能
超越技术技能

卢卡斯·布拉塞克在 Unsplash 上的照片
现在有比以往更多的方式来学习进入数据科学和分析所需的技术技能——在线课程、Kaggle 竞赛、youtube 教程和 stack overflow 金矿,仅举几例。
希望进入这一领域的人经常会问这样的问题:“做 X 数据工作我需要什么编程技能?”、“我应该学习哪些机器学习技术?”,以及“我应该做什么项目来建立我的技能/投资组合?”。
技术技能当然很重要,如果你不知道汽车是如何工作的(希望如此),你就不可能成为一名汽车修理工。
但是,仅仅关注技术技能忽略了使数据专业人员真正有用的关键方面——能够使用他们的技术技能产生业务影响。
弥合差距

数据专业人员在任何业务中的角色都是在工作的技术部分和帮助影响业务决策之间架起一座桥梁。
第一部分是技术性的,定义很明确——你通过课程学习编码和软件,或者在工作中学习。
第二部分,帮助影响业务,要模糊得多,也不太明确。它包括让非技术人员更容易理解角色的技术部分,并关注最终用户的需求。
在这篇文章中,我将尝试从我自己的经验中提炼出如何产生更大的商业影响的主要知识,以及在招聘过程中区分优秀候选人和优秀候选人的非技术技能类型。
这些是我要讲的要点:
- 了解你的受众
- 保持简单
- 关注结果
了解你的受众

根据我的经验,大多数数据专业人士都有大学背景,并习惯于被与他们知识水平相似的人包围。
与和你有相似背景的人分享你的工作是非常简单的,你不需要担心过于专业,甚至不需要解释核心概念。
但在我工作过的任何行业中,数据专业人士最多只占员工总数的 2%,其余 98%的人可能不知道也不关心什么是超参数,也不知道要花多长时间才能将这些可怕的数据集转换成可行的格式。
了解你的观众是谁,他们做什么和不关心什么,并把你的作品翻译成****它如何使他们受益,这是一项至关重要的技能。
史蒂夫·乔布斯没有通过谈论其 5GB 的硬盘,甚至更小的尺寸来宣传最初的 iPod,他将它推销为“你口袋里的 1000 首歌”。人们不关心技术细节,他们关心你能为他们做什么。
每当我参与招聘新的数据分析师/科学家时,这总是最大的绊脚石——能够翻译他们的技术工作,以便非技术人员理解为什么它很重要。
那么这在实践中是如何运作的呢?
假设你已经建立了一个模型来预测客户是否会购买你的产品。这是一个非常好的模型,有 80%的准确率。
你将把这个演示给你的销售主管,你的总结是这样的:
我们的随机森林机器学习算法对 10,000 行销售数据进行了训练,对客户销售结果的分类准确率为 80%。
销售主管可能不会关心这些,除了 80%的部分。
相反,想想“那又怎样?”,设身处地为他们着想,想想他们关心的是什么。
所以我们为什么不尝试一种不同的方法:
我们已经建立了一个模型,可以在 80%的情况下识别客户是否会从我们这里购买。我们可以利用这一点向可能从我们这里购买的客户进行追加销售,并针对那些不愿意购买的客户进行营销。
我们在这里做了三件事:
- 去掉不必要的行话
- 用他们理解的术语描述模型性能
- 给定一个“那又怎样”的问题,说明可以用输出做什么
用其他人能理解的术语表述你的工作发现,用不相关的信息或行话过多会导致你的要点被遗漏。
这就把我们带到了第二点上。
保持简单

由 Fabrizio Chiagano 在 Unsplash 上拍摄的照片
“如果你不能简单地解释它,你就不能很好地理解它”——阿尔伯特·爱因斯坦,可能是
我以前工作的数据主管在给我写的一份(过于复杂的)分析提供建议时说过一句话,这句话让我记忆犹新:
不要让人觉得
起初我有点迷惑,因为他似乎在暗示,阅读它的人需要填鸭式的喂养。但是很快就明白了——尽可能让别人容易地理解你想表达的观点。
一个臭名昭著的拙劣演示的例子是“幻灯片之死”,波音公司的工程师旨在向美国宇航局传达哥伦比亚号航天飞机(在起飞时受损)在重返地球大气层时解体的风险。
这是他们试图证明自己的关键幻灯片:

来源:美国宇航局
这当然不是有史以来最具视觉吸引力的幻灯片——但关键是他们没有传达他们的警告信息(本文更深入),航天飞机最终在重返大气层时破碎。
幻灯片上最相关的信息隐藏在最后 3 点中,即使这样,你也需要读几遍才能理解。
虽然这场悲剧不会仅仅是由这张幻灯片引起的,但它真的没有帮助。主要罪行:
- 幻灯片的标题没有概括他们想要传达的信息
- 最重要的几点用小字体写在底部
- 幻灯片本身在演示顺序中排在第六位,而不是第一位
- 里面全是行话(“SOFI”和“斜坡”都是泡沫的意思)
那么,我们如何“不让人思考”?让我们看一个基本的例子。
假设你在一家有限公司工作(创意满分),在 2021 年的第 9 周,他们开始了一场营销活动——你被要求展示它有多有效。
所以,你画了一个折线图(毕竟,如果你想看一段时间内的变化,折线图不是最好的方法吗?),你就这样结束了。

作者图片
现在,这包含了所有的关键信息——销售额在第 9 周上升并保持不变,太棒了!但是让我们想一想,如果你没有折线图,你不得不谈论你的发现,你会说什么?
发起营销活动后,销售额增加了 X%
如果这是我们想要传达的信息,那么我们为什么不展示一些切中要点的东西呢?

作者图片
这就在标题中表达了主要观点,条形图对于显示“之前与之后”的区别是很有用的。微小的调整,但它需要少得多的思考,以达到完全相同的点。
当然,这是一个非常简单的例子——这并不意味着你可以用一个等效的条形图来代替每一个折线图,但关键是要考虑如何将你的信息提炼为尽可能简单的格式。
我经常会看到标题为“分析”或“发现”的演示幻灯片,页面的标题是人们阅读的第一件事——为什么不把它作为你要告诉他们的内容的摘要呢?
人们很少有时间和精力去通读大量的方法论和背景材料,直接切入主题,否则你工作中的重要部分会被忽略。
关注结果

企业在乎钱(震惊和恐惧),要么多赚钱,要么少花钱。作为一名数据专业人员,您的工作必须以某种方式为此做出贡献。
作为一名技术人员,你可能会喜欢建造东西和解决难题——然而这有成为完美主义者的风险。
完美主义者希望花时间无休止地调整他们的模型,或者完全自动化数据输入,但这并不总是有最大的影响。
“不要让完美成为足够好的绊脚石”
你的工作产生的大部分影响将来自于你努力的最初部分,而把所有额外的时间花在完美上很少会有额外的好处。
这种权衡被更好地称为 帕累托法则 ,或者 80 : 20 法则,你工作的 80%影响来自 20%的努力。
但这实际上意味着什么呢?
让我们看几个具体的数据示例:
- 你正在建立一个预测模型,使用 5 个最重要的特征给出了 80%的准确率,但是使用额外的 5 个特征给出了 85%的准确率【你会在额外的 5 个特征上花费额外的时间吗?]
- 你正在建立一个客户盈利能力模型,你可以花很长时间在你的模型中引入准确的客户入职成本,或者你可以使用硬编码的假设【你硬编码了吗?】
- 你正在为一个销售团队构建一个仪表板,他们要求你提供 10 种不同的图表/图形——你可以轻松地构建其中的 7 种,但最后 3 种需要大量的工作【你会花时间在最后 3 种上吗?]
你可能在看这个列表时会想“好吧,在每个例子中,这不都取决于上下文吗?”—你绝对是对的。
这更像是退一步思考“我现在做的是我能做的最有影响力的事情吗?”。
无休止地修补你已经建立起来的东西总是很诱人的,它很容易成为某种舒适区。确保你定期花时间评估你正在做的事情,以避免被吸进完美主义者的兔子洞。
现在,这并不意味着突然之间你可以积累科技债务,就像没有明天一样..

必修 xkcd 漫画(来源)
..但是就像生活中的所有事情一样,在中间的某个地方需要找到一个平衡点。
保持自己的目标,你构建的东西什么时候会“完成”,或者你会满意什么水平的功能/性能。毫不留情地坚持下去,并不断问自己,你所做的事情是否真的会产生最大的影响。
摘要
希望这已经让您很好地了解了数据领域中一些经常被忽略的技能。
重申一下,这并不意味着你可以在技术知识上吝啬,这只是为了让你思考更广泛的技能,这些技能可以对你的效率产生巨大的影响。
希望你喜欢阅读!
美国的加密状态:
全美比特币自动取款机一览

从 Anytask.com 的 artgraffiti 购买
对于这个数据故事项目,我感兴趣的是:
- 可视化全美比特币自动取款机的分布
- 评估限制性比特币立法的可能负面影响以及对比特币 ATM 可用性的影响
我的研究问题——纽约州 2015 年通过的 BitLicense 立法是否对该州的比特币 ATM 可用性产生了负面影响?
背景
比特币是一个透明、去中心化的网络,由一个化名为中本聪的人在 2009 年创建。比特币的支持者频繁宣传比特币允许每个人“成为自己的银行”的观点。
由于其去中心化的本质,比特币网络允许用户进行点对点交易,而不需要我们习惯的中介:传统银行。不过,这种想法有一个障碍;个人需要一种简单的方式来购买比特币。
比特币基地等中央交易所允许个人购买比特币,但这样做需要一个银行账户。这导致了一个循环的情况:要“成为你自己的银行”,你首先需要一个银行账户来启动这个过程。
2018 年,美联储估计有多达 5500 万成年美国人没有银行账户。没有银行账户的个人购买比特币更加困难;有银行账户的人有更多的选择。
比特币似乎正在转变为一种价值储存手段,而不仅仅是一种日常货币;在全球疫情期间,美元价值出现了前所未有的增长。美国证券交易委员会主席杰伊·克莱顿(Jay Clayton)表示,“我们认为比特币不是一种证券,它更像是一种支付机制和价值储存手段。”
Paypal 最近允许用户直接购买比特币,但目前,客户没有办法提取他们购买的东西。如果没有银行账户的个人想要购买比特币,他们从其价值储存中受益的选择很少,独立式比特币自动取款机可以满足没有银行账户和有银行账户的用户的需求。尽管使用比特币需要支付费用和费率,但比特币自动取款机非常方便。
比特币自动取款机允许用户走到机器前,用现金购买比特币,并让它立即被发送到他们选择的比特币地址,这是一种宝贵而方便的购买比特币的方法。我为这个项目评估的 CoinATMRadar 数据集包含符合该标准的比特币 ATM。(独立式比特币自动取款机的替代方案要求用户登录其网站来兑换他们购买的比特币。)
数据集描述
在这个数据故事项目中,我评估了一个数据集,该数据集详细描述了美国各地比特币 ATM 的位置和数量。我直接从 CoinATMRadar 获得了主要数据集,其中包括截至 2020 年 11 月 16 日美国的独立比特币 ATM。你可以在这篇博文底部的链接查看这个项目对应的 code/IPython 笔记本。
CoinATMRadar 是一个列出比特币 ATM 位置的在线目录,他们对列表有严格的要求。他们的目录还包括买卖其他加密货币的 ATM 机,包括 Ethererum、Monero 和 Dash 等。我没有评估这个项目的替代加密货币;比特币是独家焦点。比特币 ATM 上市有一个自我报告机制,因此在发现任何潜在错误之前可能会有一小段时间。
该数据集的具体限制:
- 仅截至 2020 年 11 月 16 日
- 不包含 CoinStar 机器(它们需要以后用有效的驾驶执照进行兑换)
- 不包含 LibertyX 自动柜员机,因为它们允许借记卡购买
我还从 census.gov 下载了美国各州 2020 年的人口数据。合并两个数据集,这样我就可以评估比特币自动取款机的数量与每个州人口的关系。
2015 年,纽约州通过立法,要求任何想要在该州运营交易所或出售加密货币的公司申请 BitLicense。许多人推测这对该行业产生了负面影响,我想量化并证明这种影响。

在这里,我正在从 CoinATMRadar 的数据集中列出的本地比特币 ATM 机购买比特币。我不得不在雨中跋涉,这个自动取款机被塞在一个小加油站的角落里。
数据争论和特征工程
我的数据争论过程包括清理列出城市位置的列。有一些拼写错误需要纠正。此外,在某些情况下,城市栏包括标点符号和州缩写。所有这些都需要移除。使用 Python 的 split()方法,我可以轻松地删除许多行中的逗号以及其后出现的任何两个字母的缩写。
我还使用了 Python 的 RegEx 模块。总之,我花了 16 行代码来清理一个包含 9550 行的数据集。在未来的单元中,我期待着扩展我的数据辩论技能,能够用更少的代码行完成这个过程,并尽可能使用最少的计算密集型过程。
我还向数据集添加了一个新特性,包括一个计算每 10 万居民人均 ATM 的列。这是显示这些计算的图像。
为了创建上面的可视化,我需要定义一个数据字典并将其映射到每个州,从而在数据集中产生一个新列,其中包含每个州的两个字母缩写。
对于那些喜欢按名称查看各州的人来说,这里有另一个显示每 100,000 名居民中使用比特币 ATM 机最多的十个州的可视化图。

我的统计方法包括创建一个散点图并覆盖一条回归线,该回归线显示人口和比特币 ATM 机数量之间存在明显的正线性相关性,异常值为 1e7。

然后我计算了一个相关系数来衡量这种关系的强度和方向。结果是 0.93,这代表了很强的相关性。纽约州是美国人口第四多的州,但只有 113 台比特币自动取款机。这比 198 的平均值低多了,这是我们从一个那么大的州所没有想到的。
接下来,我想调查一下我最初的想法,即纽约在 2015 年颁布的限制性 BitLicense 立法对加密货币行业产生了负面影响,这一点从纽约州限制比特币 ATM 机的数量超过了我们通常对人口稠密的州的预期就可以看出。因此,我创建了一个线性回归模型,并用它来计算三个独立的预测。
线性回归模型显示,比特币自动取款机数量的 86%的可变性可以通过人口来解释,所以我不确定这个项目是否能够量化我最初的想法。然而,由此产生的预测是一个惊喜!
结果和结论
我首先计算了一个人口相当于纽约的州的比特币自动取款机数量预测,以及新泽西州和康涅狄格州的预测。
预测一个人口与纽约州人口相当的州的比特币 ATM 机数量为 634.69 ,比纽约州仅有的 113 台比特币 ATM 机多 521.73 台!
新泽西州比邻近的纽约州多 286 台比特币自动取款机,尽管新泽西州的人口还不到纽约州的一半。
线性回归模型预测,新泽西州大小的一个州将有 270 台比特币自动取款机,康涅狄格州将有 67.3 台。根据我们的数据集,新泽西州有 399 台比特币自动取款机,康涅狄格州有 154 台。
当然有可能的是,原本会在纽约开设比特币自动取款机的企业会去邻近的新泽西州和康涅狄格州,在那里开设比特币自动取款机,以避免申请比特币许可证的高昂成本。
这可以解释新泽西州的比特币 ATM 机数量比我们的线性回归模型预测的大约多 129 台,比纽约州多 286 台,尽管新泽西州的人口还不到纽约州的一半。这也可以解释康涅狄格州比特币自动取款机的实际数量是预测数量的两倍多。与纽约州相比,康涅狄格州多了 41 个 ATMS,尽管康涅狄格州的人口还不到纽约州的五分之一!

进一步的研究领域包括对最近的数据集进行定期的类似评估。此外,在比较之前交叉参考多个来源的比特币 ATM 位置可以进一步完善结果。涉及比特币和整个加密货币行业的立法正在发展,未来的研究和分析可以考虑这些发展变化。
还有,我做了很多特征工程,探索量化“比特币友好状态”这个词的可能性。这一探索没有成为最终的 IPython 笔记本,但它本身可能是一个相当大的独立研究领域!
下面是这篇博文对应的 IPython 笔记本的链接:https://github . com/cryptobellum/DS-Unit-1-Build/blob/main/The _ Cryptographic _ States _ of _ America . ipynb
引用的作品
(2)https://news . bit coin . com/us-crypto currency-regulation-sec-chairman-Jay-Clayton-bit coin/
辛普森悖论的奇特案例
统计测试和分析可能会因为对数据的简单误解而被混淆

统计学很少提供做任何事情的单一“正确”方式——查尔斯·惠兰在《赤裸裸的统计学》中
1996 年, 阿普尔顿、弗伦奇和范德普姆 进行了一项实验,研究吸烟对一个样本人群的影响。这项研究进行了 20 多年,包括 1314 名英国女性。与普遍的看法相反,这项研究表明吸烟者往往比不吸烟者长寿。尽管我不是吸烟对人体健康影响的专家,但这一发现令人不安。下图显示,吸烟者的死亡率为 23%,而不吸烟者的死亡率约为 31%。

吸烟者与非吸烟者的死亡率|作者图片
现在,事情变得有趣了。把同样的数据按年龄组分开,我们会得到一个完全不同的画面。结果显示,在大多数年龄组中,吸烟者的死亡率比不吸烟者高。

按年龄组细分的研究结果|作者图片
那么,为什么会有这种困惑呢?🤔
嗯,我们刚刚在上面看到的现象是辛普森悖论的一个经典案例,它不时地让位于大量数据驱动的分析。在本文中,我们将对此进行更深入的探讨,并理解如何在我们的分析中避免类似的谬误。
辛普森悖论:事情并不总是像它们看起来的那样

按维基百科,辛普森悖论, 又叫 尤尔-辛普森效应 ,可定义如下:
辛普森悖论(Simpson's Paradox)是概率统计中的一种现象,一种趋势出现在几组不同的数据中,但当这些组组合在一起时就消失或逆转。
换句话说,根据不同的分组方式,同一个数据集可能呈现相反的趋势。这正是我们在吸烟者和非吸烟者死亡率的例子中看到的。当按年龄分组时,数据显示不吸烟者往往活得更长。但是,当我们看到一个整体画面时,吸烟者往往活得更长。这里到底发生了什么?为什么同样的数据会有不同的解释,第一种情况下是什么在逃避我们的眼睛?嗯,在这种情况下,罪魁祸首被称为潜伏变量——条件变量,它可以影响我们对两个变量之间关系的结论——在我们的情况下,吸烟和死亡率。
识别潜在变量🔍

图片由 Peggy_Marco 来自 Pixabay
潜伏的意思是以一种潜在的或难以辨别的状态存在,尽管仍然有影响。同样,潜在变量是一个不包括在分析中的变量,但是如果包括在内,可以极大地改变分析的结果。
在讨论的例子中,年龄组是潜在的变量。当数据按年龄分组时,我们发现不吸烟者的平均年龄明显更大,因此,更有可能在试验期间死亡,正是因为他们总体上活得更长。
你自己试试吧。💻
这是辛普森悖论的另一个显而易见的例子。我们都知道 帕企鹅 🐧 数据集 —著名虹膜数据集的替代产品。该数据集由三种企鹅的详细信息组成,包括它们的长度和深度、鳍状肢长度、体重和性别。企鹅喙本质上是企鹅喙的上脊,而它们的翅膀被称为鳍状肢。数据集可在 Kaggle 上下载。

brgfx-www.freepik.com 创建的自然向量 |归属 1.0 通用( CC BY 1.0 )
导入必要的库和数据集
import pandas as pd
import seaborn as sns
from scipy import stats
import matplotlib.pyplot as plt
%matplotlib inline#plt.rcParams['figure.figsize'] = 12, 10
plt.style.use("fivethirtyeight")# for pretty graphsdf = pd.read_csv('[penguins_size.csv'](https://raw.githubusercontent.com/parulnith/Website-articles-datasets/master/penguins_size.csv'))
df.head()')
df.info()

数据集中几乎没有丢失的值。让我们摆脱那些。
df = df.dropna()
现在让我们想象一下企鹅的长度和它们的深度之间的关系。同样,我们将使用 seaborn 的lmplot方法(其中“lm”代表“linear model”)。

企鹅的长度与深度|作者图片
在这里,我们看到了数据集的 culmen 长度和 culmen 深度之间的负相关。上述结果表明,越长的秆或喙,密度越小。我们还计算了两列之间的相关系数,以使用皮尔逊相关系数 (PCC)查看负关联,称为皮尔逊相关系数r。PCC是一个介于-1 和 1 之间的数字,用于测量两个数据集之间的线性相关性。Scipy 库为此提供了一个名为pearsonr()的方法。
在物种级别向下钻取
当你进一步挖掘并按物种对数据进行分组时,发现正好相反。“hue”参数决定了数据框中的哪一列应该用于颜色编码。
sns.lmplot(x **=** 'culmen_length_mm',y **=** 'culmen_depth_mm', data **=** df, hue **=** 'species')

企鹅的长度和深度按物种分类|图片由作者提供
瞧啊。我们有一个辛普森效应的经典例子。虽然秆的长度和深度在群体水平上呈负相关,但物种水平的数据显示出相反的相关性。因此物种的类型在这里是一个潜伏变量。我们还可以使用下面的代码来查看每个物种的人的系数:



作者提供的图片
这里是 nbviewer 链接 到你想跟随的笔记本柜。
发现辛普森效应的工具🛠
在数据集中检测辛普森效应可能很棘手,需要一些仔细的观察和分析。然而,由于这个问题在统计世界中不时出现,很少有工具可以帮助我们处理它。一篇题为“利用辛普森悖论发现行为数据中有趣的模式”的论文于 2018 年发布,强调了一种数据驱动的发现方法,利用辛普森悖论来揭示行为数据中有趣的模式。该方法系统地分解数据,以识别群体中行为与群体中其他成员明显不同的子群体。这是一本很好的读物,也有代码链接。
结论
数据具有强大的力量,可以很容易地被操纵以满足我们的需求和目标。聚合和分组数据有多种方式。根据分组方式的不同,数据可能会产生混淆的结果。这取决于我们使用统计工具仔细评估所有细节,并寻找可能影响我们决策和结果的潜在变量。
👉有兴趣看我写的其他文章。这个 回购 包含了我分类写的所有文章。
从三个不同的角度看新冠肺炎的现状
让数据和图像说话——一个简化的网络应用

作者图片
你是否曾经想在几个小时内而不是几周内与世界上的任何人分享你的项目?如果是这样,那么你来对地方了。本文将带您了解我是如何使用 Streamlit 创建自己的新冠肺炎仪表板的。Streamlit 允许您以简单的方式为机器学习和数据科学创建定制的 web 应用程序。以下是我的应用程序的链接:
https://share . streamlit . io/navido 89/covid 19-dashboard-dataviz/app . py
目标:
首先,为了更好地理解我的项目,我将带你经历我试图完成的事情。这个项目的目的是从三个不同的角度看新冠肺炎的现状。这些图是通过使用数据可视化工具(如 Plotly 和 Folium)创建的。这个项目分为三个部分。
1。全球新冠肺炎情况:我显示了一个叶子地图,上面显示了总病例数、总死亡数、每 10 万人的总病例数和每 10 万人的总死亡数。除此之外,我还展示了各种时间序列图,以便更好地理解这种疾病是如何随着时间在全球传播的。
2。世界卫生组织区域(世卫组织)的新冠肺炎情况:在下面的部分,我从世界卫生组织的区域角度来看这种疾病。我根据不同地区的总病例数、总死亡数、每 1 亿人的总病例数和每 1 亿人的总死亡数对它们进行了比较。
3。美国的新冠肺炎局势:最后但同样重要的是,我调查了美国,并根据病例、死亡人数(有和没有人均)、疫苗状况以及不同变种在各州传播的状况,探讨了美国的现状。
这些数据来自各种资源,每天都会更新。请点击这里进入我的回购,你就可以拉数据了。
方法:
在进入 Streamlit 之前,我为每个图创建了一个函数。如上所述,我使用 Plotly 和 Folium 进行可视化。这样做的原因是因为我希望我所有的图形都是交互式的,Plotly 和 lyum 在这方面做得很好。一旦我为每个图创建了函数,我就创建了一个主函数。主函数是我为我的 Streamlit 应用程序编写代码并调用每个 plots 函数的地方。在我进入 Streamlit 部分之前,我将首先向您介绍我必须实现的方法,以准备好这些图。
数据清理:
正如你们中的许多人所知,当涉及到数据科学项目时,我们将大部分时间花在数据清理上。我的网络应用也是如此。清理所有不同的数据,我拉进创建图花了我最多的时间。我不打算详细说明我是如何清理每个图的数据的,但是它们中的许多都有一个共同的模式。我必须采取的为图表准备数据的步骤包括:
- 读入数据
- 移除列和行
- 用新的字符串值替换字符串
- 按功能分组
- 合并数据集
特色工程:
同样,我不会详细讨论特性工程,但是现在我将强调一些常见的模式。例如,在时间序列图中,我必须将类型从 object 更改为 DateTime。除此之外,我还创建了显示人均病例或死亡总数的列。对于这些特定的列,我必须通过使用特定位置的人口、总病例数和死亡人数来进行计算。获得人均数字的目的是为了更好地了解不同地点之间的情况。
数据可视化:
正如本文前面提到的,我使用 Plotly 和 Folium 进行可视化。对于 Plotly 绘图,Streamlit 有一个名为 plotly_chart()的函数,对于 follow,可以导入以下库:
from streamlit_folium import folium_static
foloum_static 是一个函数,它允许您将一个叶子地图作为参数传入,以便它可以在您的应用程序中呈现。
在我的项目中有两个高级的情节,我将更详细地讨论,以便您能够在自己的项目中创建它们。其他情节相当简单,我强烈建议仔细阅读 Plotly 文档。请查看下面的链接:
首先,我们来谈谈 app 中的 follo pleth 地图。我之前写过一篇关于如何绘制更高级的多层 Choropleth 地图的教程。如果你不熟悉 leav,请查看这篇文章来学习你的 leav 技能。
在上面的文章中,我正在查看一个例子,在这个例子中我实现了一个更高级的 map。当我写这篇文章时,我无法解决的一个问题是,我们如何删除 choropleth 的图例并为每个图层创建一个图例,因为默认情况下,每个列的所有图例都将显示在图上。在我的教程中,除了图层之外,每个图例都有一个单独的按钮。然而,我的最终目标是用一个图例绑定每一层。换句话说,当我点击层控制器和一个特定的列,层将自动出现其相关的图例。下面我将带您了解如何在我的应用程序中创建地图的步骤。
在下图中,您可以在我的应用程序中看到其中一个 Choropleth 地图的数据框。在清理和特征工程之后,我们得到以下结果:

作者图片
我们将实现一个 JavaScript 函数。首先,我们创建一个 BindColormap 类,它将一个定制的色彩映射表绑定到一个给定的层。要使它工作,您需要导入宏元素和模板,如下所示。
from branca.element import MacroElementfrom jinja2 import Templateclass BindColormap(MacroElement):
"""Binds a colormap to a given layer.Parameters
----------
colormap : branca.colormap.ColorMap
The colormap to bind.
"""
def __init__(self, layer, colormap):
super(BindColormap, self).__init__()
self.layer = layer
self.colormap = colormap
self._template = Template(u"""
{% macro script(this, kwargs) %}
{{this.colormap.get_name()}}.svg[0][0].style.display = 'block';
{{this._parent.get_name()}}.on('overlayadd', function (eventLayer) {
if (eventLayer.layer == {{this.layer.get_name()}}) {
{{this.colormap.get_name()}}.svg[0][0].style.display = 'block';
}});
{{this._parent.get_name()}}.on('overlayremove', function (eventLayer) {
if (eventLayer.layer == {{this.layer.get_name()}}) {
{{this.colormap.get_name()}}.svg[0][0].style.display = 'none';
}});
{% endmacro %}
""")
一旦我们有了上面的函数,现在是时候为每一列创建定制的图例了。
# We create the colors for the custom legends
colors = ["YlGn","OrRd","BuPu","GnBu"]# Create a custom legend using branca for each column
cmap1 = branca.colormap.StepColormap(
colors=['#ffffcc','#d9f0a3','#addd8e','#78c679','#238443'],
vmin=0,
vmax=df_global_folium['covid_total'].max(),
caption='Covid Total')cmap2 = branca.colormap.StepColormap(
colors=["#fef0d9",'#fdcc8a','#fc8d59','#d7301f'],
vmin=0,
vmax=df_global_folium['covid_deaths'].max(),
caption='Covid Deaths')
cmap3 = branca.colormap.StepColormap(
colors=branca.colormap.step.BuPu_09.colors,
vmin=0,
vmax=df_global_folium['covid_cases_per_100k'].max(),
caption='covid_cases_per_100k')
cmap4 = branca.colormap.StepColormap(
colors=branca.colormap.step.GnBu_09.colors,
vmin=0,
vmax=df_global_folium['covid_deaths_per_100k'].max(),
caption='covid_deaths_per_100k')cmaps = [cmap1, cmap2,cmap3,cmap4]
正如你在上面看到的,我们使用 Branca 库来使用 StepColormap 功能。在这里,我们从上述数据框中为以下各列创建了 4 个单独的图例:
- covid_total
- covid _ 死亡人数
- covid_cases_per_100k
- covid_deaths_per_100k
为了更好地理解 StepColormap 函数的属性,请查阅下面的文档:
让我们关注上面代码中的 cmap4,它是 covid_deaths_per_100k 的图例。其他列的过程是相同的,但是我想让您看看代码实际输出了什么。在最后一个代码片段的顶部,我创建了一个颜色列表来表示每个图例的颜色。首先,我使用调色板 GnBu_09 将 colors 属性设置为 Branca 步骤颜色。然后,我设置 vmin 值,这是一个允许我们在 leged 中设置最小数量的属性。另一方面,vmax 允许我们设置最大数量。最后一个属性标题允许我们为图例设置一个名称。我们在 cmap4 中创建的图例如下所示。

作者图片
在代码的最后一行,我创建了一个名为 cmaps 的列表,其中包含了我为上述四列创建的所有图例。
下一步是创建叶子地图,并将各个图例与每个图层绑定。
columns_list_global_map = ["covid_total","covid_deaths","covid_cases_per_100k","covid_deaths_per_100k"]sample_map = folium.Map(location=[51,10], zoom_start=2)# Set up Choropleth map
for color, cmap, i in zip(colors, cmaps, columns_list_global_map):
choropleth = folium.Choropleth(
geo_data=df_global_folium,
data=df_global_folium,
name=i,
columns=['name',i],
key_on="feature.properties.name",
fill_color=color,
colormap= cmap,
fill_opacity=1,
line_opacity=0.2,
show=False
)
# this deletes the legend for each choropleth you add
for child in choropleth._children:
if child.startswith("color_map"):
del choropleth._children[child] style_function1 = lambda x: {'fillColor': '#ffffff',
'color':'#000000',
'fillOpacity': 0.1,
'weight': 0.1}
highlight_function1 = lambda x: {'fillColor': '#000000',
'color':'#000000',
'fillOpacity': 0.50,
'weight': 0.1} NIL1 = folium.features.GeoJson(
data = df_global_folium,
style_function=style_function1,
control=False,
highlight_function=highlight_function1,
tooltip=folium.features.GeoJsonTooltip(
fields= ['name',"covid_total","covid_deaths",
"covid_cases_per_100k",
"covid_deaths_per_100k"],
aliases= ['name',"covid_total","covid_deaths",
"covid_cases_per_100k",
"covid_deaths_per_100k"],
style=("background-color: white; color: #333333; font-
family: arial; font-size: 12px; padding: 10px;")
)
)
sample_map.add_child(NIL1)
sample_map.keep_in_front(NIL1) # add cmap to `sample_map`
sample_map.add_child(cmap)
# add choropleth to `sample_map`
sample_map.add_child(choropleth)
# bind choropleth and cmap
bc = BindColormap(choropleth, cmap)
# add binding to `m`
sample_map.add_child(bc)
# Add dark and light mode.
folium.TileLayer('cartodbdark_matter',name="dark mode",control=True).add_to(sample_map)
folium.TileLayer('cartodbpositron',name="light mode",control=True).add_to(sample_map)sample_map.add_child(folium.LayerControl())sample_map
首先,我们为想要迭代的每一列创建一个列表。接下来,我们建立了我们的叶子地图,并将其命名为 smaple _ map。之后,我们对一个 zip 对象进行迭代,这个对象是由 colors、cmaps、country_lists_global_map 组成的元组的迭代器。我们循环的第一个 zip 对象是-> ("YlGn," cmap1,covid_total)。第二个 zip 对象将是(" OrRd," cmap2,covid_deaths)等等。接下来,我们创建一个 choropleth 变量,并将其设置为 folium.choropleth()函数。在函数内部,我们将属性设置为您可以在下面的数据框中看到的值。注意 df_global_folium 是上面的数据帧。再看下面:

作者图片
geo_data=df_global_folium,
data=df_global_folium,
name=i,
columns=['name',i],
key_on="feature.properties.name",
fill_color=color,
colormap= cmap,
fill_opacity=1,
line_opacity=0.2,
show=False
创建图层后,我们会立即删除默认显示的图例。删除图例的原因是为了避免在一个图上出现多个图例。请参见下面删除图例的代码。
# this deletes the legend for each choropleth you add
for child in choropleth._children:
if child.startswith("color_map"):
del choropleth._children[child]
删除图例后,我们实现悬停功能以在地图上显示数据。
style_function1 = lambda x: {'fillColor': '#ffffff',
'color':'#000000',
'fillOpacity': 0.1,
'weight': 0.1}
highlight_function1 = lambda x: {'fillColor': '#000000',
'color':'#000000',
'fillOpacity': 0.50,
'weight': 0.1}NIL1 = folium.features.GeoJson(
data = df_global_folium,
style_function=style_function1,
control=False,
highlight_function=highlight_function1,
tooltip=folium.features.GeoJsonTooltip(
fields= ['name',"covid_total","covid_deaths",
"covid_cases_per_100k",
"covid_deaths_per_100k"],
aliases= ['name',"covid_total","covid_deaths",
"covid_cases_per_100k",
"covid_deaths_per_100k"],
style=("background-color: white; color: #333333; font-
family: arial; font-size: 12px; padding: 10px;")
)
)
sample_map.add_child(NIL1)
sample_map.keep_in_front(NIL1)
我们创建一个样式函数和一个高亮函数,我们将在 folio . features . geo JSON()函数中使用它们。我们将 style_function 和 highlight_function 分别设置为 style_function1 和 highlight_function1。这些属性设置了我们悬停在某个位置时的视觉外观。在 tooltip 变量中,我们指定当鼠标悬停在某个位置时,数据框中显示的数据。然后,我们将 NIL1 变量作为子变量添加到地图中,并将其放在地图的前面。
# add cmap to `sample_map`
sample_map.add_child(cmap)
# add choropleth to `sample_map`
sample_map.add_child(choropleth)
# bind choropleth and cmap
bc = BindColormap(choropleth, cmap)
# add binding to `m`
sample_map.add_child(bc)
# Add dark and light mode.
folium.TileLayer('cartodbdark_matter',name="dark mode",control=True).add_to(sample_map)
folium.TileLayer('cartodbpositron',name="light mode",control=True).add_to(sample_map)sample_map.add_child(folium.LayerControl())sample_map
正如您在上面看到的,我们然后将单个图例(“cmap”)添加到绘图,将 choropleth 添加到地图,绑定 choropleth 和图例,并将其作为子元素添加到地图。注意,上面的步骤只是针对一次迭代。一旦循环结束,代码继续下一行。最后,我们添加黑暗模式,光明模式,和层控制器到地图。这就是了。下面是最终的 Choropleth 叶地图。

作者 Gif
我将更详细介绍的第二个图是关于 Plotly 图,其中我向一个图形添加了两个下拉菜单。使用两个下拉菜单的目的是选择不同的州,并比较记录的不同新冠肺炎变异体的总病例情况。首先,让我们看看情节,然后我们将深入代码。

作者 Gif
正如你在上面看到的,我们可以通过不同的变异体引起的新冠肺炎病例来比较不同的州。在深入研究代码之前,让我们先看看数据框架。下面可以看到上面 Plotly 图的数据框,叫做 cdc_variants_data。

作者图片
该索引由三个不同的变量组成,其他列都是不同的状态。绘制上图的代码如下:
df = cdc_variants_data# plotly figure setup
fig = go.Figure()# one trace for each df column
fig.add_trace(go.Bar(name="Selection 1",x=df.index, y=df["Alabama"].values))# one trace for each df column
fig.add_trace(go.Bar(name="Selection 2",x=df.index, y=df["Alabama"].values))# one button for each df column
updatemenu= []
buttons=[]# add second buttons
buttons2 = []for i in list(df.columns):
buttons.append(dict(method='restyle',label = str(i),args=[{'x':[df.index],'y':[df[i].values]},[0]])
)
for i in list(df.columns):
buttons2.append(dict(method='restyle',label = str(i),args=[{'x':[df.index],'y':[df[i].values]},[1]])
)# some adjustments to the updatemenus
button_layer_1_height = 1.23
updatemenu = list([dict(
buttons = buttons,
direction="down",
pad={"r":10,"t":10},
showactive=True,
x= 0.1,
xanchor="left",
y= button_layer_1_height,
yanchor="top",
font = dict(color = "blue")
),dict(
buttons = buttons2,
direction="down",
pad={"r":10,"t":10},
showactive=True,
x= 0.37,
xanchor="left",
y=button_layer_1_height,
yanchor="top",font = dict(color = "red"))])fig.update_layout(showlegend=True, updatemenus=updatemenu)
fig
我们使用 Plotly 的图形对象。我们首先创建一个名为 df 的变量,并将其设置为数据帧 cdc_variants_data。然后,我们添加两条轨迹,使同一图形上有两条不同的线条。我们使用 Bar 函数,将 x 值设置为索引,将 y 轴设置为 Alabama 列。之后,我们创建三个空列表。第一个是更新名为 updatemenu 的菜单。另外两个叫做按钮 1 和按钮 2。之后,我们有两个单独的 for 循环,在这里我们遍历所有的列(状态)并将它们添加到每个按钮中。args 属性很重要,因为我们将数据框的索引添加到 x,并将每个状态的列值添加到 y。此外,[0]和[1]分别表示第一个和第二个按钮。除此之外,我们还创建了一个名为 updatemenu 的字典列表。在每个字典中,我们将 buttons 属性设置为在两个 for 循环之前创建的 button 变量。最后,我们调用 Plotly update_layout()函数,并将 updatemenus 属性设置为 updatemenu 变量。我强烈建议您获取上面的代码,并获取一个示例数据框,然后使用它进行试验,这样您就可以更好地理解如何绘制它。
既然我们已经介绍了不同的方法(数据清理、要素工程和数据可视化),现在我们可以将注意力转移到如何创建应用程序上。
创建 Web 应用程序:
为了理解我是如何在 Streamlit 中创建我的应用程序的,我将首先带您看一个简单的例子。首先,您需要在您的环境中安装库。请查看下面关于如何安装 Streamlit 的文档。
https://docs.streamlit.io/en/stable/troubleshooting/clean-install.html
接下来,打开一个新的 python 脚本并复制粘贴以下内容:
import streamlit as stdef main():
st.title("Deploy me to Heroku")
st.subheader("Welcome to my app.")if __name__ == '__main__':
main()
正如您在上面看到的,我们首先导入 streamlit 库。之后,我创建了一个主函数。在里面,主要功能是我开始在我的应用程序的前端工作的地方。我调用 st.title()为我的应用程序添加一个标题,后面跟着一个我用 st.subheader()调用的子标题。接下来,保存文件,在命令行界面(CLI)中,转到保存 python 脚本的位置。接下来,要查看上面的代码输出了什么,只需运行下面的代码:
streamlit run app.py
浏览器中会自动弹出一个窗口,您会看到以下内容:

作者图片
瞧,这就是你的应用程序。上面的输出将在您的本地机器上运行。完成应用程序后,如果您想要部署它,您可以使用 Streamlit 共享。您需要在这里请求邀请。根据文档,Streamlit 共享只能通过邀请获得。一旦你提出请求,需要几天时间才能收到邀请。如果您迫不及待,想要立即将您的应用程序托管到 Heroku,请查看我下面的文章,这是如何将您的 Streamlit 应用程序部署到 Heroku 的分步指南。
现在您已经有了更好的理解,我将带您看一下我自己的应用程序。如上例,我的 main()函数由我的 Streamlit 应用程序的代码组成。我的应用程序由一个侧边栏组成,允许用户在应用程序和以下页面中导航:
- 主页
- 全球形势
- 世卫组织地区的情况
- 美国的情况
我在应用程序中使用的组件如下:
- 圣题
- st.subheader
- 圣马克当
- 圣侧边栏电台
- st.sidebar.markdown
- st.info
- 圣映像
- st.table
- 圣普罗特利图表
- 叶子 _ 静电
为了更好地理解每个功能,我强烈推荐文档。点击此处获取文档。我花了几天时间才找到创建应用程序的窍门。添加一个侧边栏、图片、gif 和不同种类的情节真的很简单。如前所述,对于我的 Plotly 和 folium 图,我使用了 st.plotly_chart()和 folium_static()函数。要完全访问我创建 Streamlit 应用程序的主函数,请单击下面的链接并向下滚动到 main()函数。
https://github.com/navido89/covid19-dashboard-dataviz/blob/master/app.py
总体而言,Streamlit 的性能令人印象深刻。为了提高应用程序的性能,我强烈建议利用缓存机制。点击此处查看如何在你的应用中实现缓存机制的文档。
结论:
总的来说,我对使用 Streamlit 的简单性印象深刻。更让我印象深刻的是它在数据加载时间和图形渲染时间方面的性能。当我今天(2021 年 3 月 18 日)写这篇文章时,Strimlit 宣布了它的自定义主题。你现在可以在你的应用中打开黑暗模式和光明模式。除此之外,你可以自定义你的应用程序的风格。当我看到它的新更新的消息时,我抓住了这个机会,给我的应用程序添加了一些样式。请参见下文,了解如何在不同主题之间切换。

作者 Gif
我希望你喜欢这篇文章,并从中获得灵感来创建自己的 Streamlit 应用程序。如果你对这个话题有任何问题或者对我的应用有任何反馈,请告诉我。总有改进的余地。如果你喜欢这篇文章,如果你能在任何社交媒体平台上分享它,我将非常感激。直到下一个 time️!✌️
维度的诅咒
对维度诅咒的直观演示,以及我们可以做些什么来对抗它

随着数据维度的增加,特征空间变得更稀疏,数据更容易分离。简而言之,这就是维度的诅咒。
内容
这篇文章是我将要发表的一系列文章的一部分。你可以通过点击这里在我的个人博客上阅读这篇文章的更详细版本。您可以在下面看到该系列的概述。
1.机器学习导论
- (一)什么是机器学习?
- (b)机器学习中的模型选择
- (c)维度的诅咒
- (d)什么是贝叶斯推理?
2.回归
3.分类
什么是维度的诅咒?
在上一篇中,我们讨论了,一个模型好意味着什么,以及如何确定哪个模型是最好的。维度的诅咒是这种决心的共同敌人,它甚至是我们训练数据中固有的!
为了理解维数灾难,我们将通过一个分类的例子。正如在本系列的第一篇文章中提到的,分类是一项监督学习任务,我们必须将我们的数据点组织成离散的类别,我们称之为类。
到目前为止,在这个系列中,我们一直在看只有一维输入变量 x 的多项式回归。然而,在大多数实际情况下,我们将不得不处理高维度的数据,例如,如果人类是我们的观察对象,他们可能有多个描述他们的值:身高、体重、年龄等。对于这个例子,我们有 10 个数据点,2 个类,每个数据点都是三维的。
import numpy as npX = np.array([
[0.33, 0.88, 0.11],
[0.74, 0.54, 0.62],
[0.79, 0.07, 0.31],
[0.83, 0.24, 0.47],
[0.05, 0.42, 0.47],
[0.82, 0.70, 0.10],
[0.51, 0.76, 0.51],
[0.71, 0.92, 0.59],
[0.78, 0.19, 0.05],
[0.43, 0.53, 0.53]
])
t = np.array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1])
上面的代码片段显示了我们的训练数据集;X是我们的 10 个维数为 3 的输入变量(我们有 3 个特征),而t是我们的目标变量,在这种情况下对应于 2 个类别。我们还可以看到,前 5 个数据点属于 0 类,后 5 个数据点属于 1 类;我们在各班之间平均分配。
如果我们只使用第一个特征(T2 的第一列)来绘制点,我们会得到下面的图。一种简单的对点进行分类的方法是将线分成 5 段(每段长度为 0.2),然后决定将该段中的所有点分类为 0 类或 1 类。我也在我们将得到的分类之后给这些部分涂上了颜色。用这种天真的方法,我们犯了 3 个错误。

仅使用第一特征对点进行分类。
但是让我们看看我们是否能做得更好!使用前两个特征现在给了我们一个网格(0.2×0.2 块),我们现在可以将它用于我们的简单分类模型。如下图所示,我们现在可以对这些点进行分类,这样我们只犯一个错误。

使用两个特征对点进行分类。
如果我们使用所有的 3 个特征,我们可以完美地分类所有的点,如下图所示。这是因为,我们现在有 0.2 乘 0.2 乘 0.2 的立方体。由此看来,使用所有 3 个特征似乎比只使用 1 个或 2 个更好,因为我们能够更好地对我们的数据点进行分类——但这就是反直觉的概念“维数灾难”的由来,并且我告诉你,使用所有特征并不是更好。

使用所有 3 个特征对点进行分类。
这个问题与我们的数据点相对于我们的分类部分的比例有关:对于 1 个特征,我们有 10 个点和 5 个部分,即 10/5=2 个点/部分,对于 2 个特征,我们有 10/(5×5)=0.4 个点/部分,对于 3 个特征,我们有 10/(5×5)= 0.08 个点/部分。
随着我们添加更多的特征,特征空间中的可用数据点变得指数稀疏,这使得分离数据点变得更加容易。然而,这并不是因为数据中的任何模式,事实上这只是高维空间的本质。事实上,我列出的数据点是从均匀分布中随机生成的,所以我们要拟合的“模式”实际上根本不存在——这是维度增加的结果,这使得可用的数据点变得更稀疏。
由于这种固有的稀疏性,当我们向数据中添加更多的特征时,我们最终会过度拟合,这意味着我们需要更多的数据来避免稀疏性——这就是维度的诅咒:随着特征数量的增加,我们的数据变得更加稀疏,这导致过度拟合,因此我们需要更多的数据来避免它。
下面的插图显示了这一点,但有 100 个不同维度的数据点。这些点是从越来越高的多元正态分布中随机采样的,并随机分配给一个类别。找到一个试图分离这些点的超平面。然后,我们将这些点投影到二维空间,看看它们被分离得有多好。随着点的维数增加,分离它们变得越来越容易。事实上,总是有可能用 N 维度完美地分离 N +1 点。

维数灾难的例证。
非一致性的祝福
那么我们如何避免被诅咒呢?幸运的是,非一致性的祝福【1】来拯救我们了!在大多数实际(真实世界)场景中,我们的数据不是均匀分布的,而是集中在一些地方,这可以稍微消除维数灾难。
但是如果当我们过度适应时,这真的是维度的诅咒呢?没有一个确定的答案,因为它确实取决于数据集,但是有一个相关的十分之一的经验法则;对于每个模型参数(大致特征),我们需要至少 10 个数据点。一些更好的选择属于降维的主题,我们将在本课程的后面部分讨论。
摘要
- 功能越多,过度拟合的风险就越高就是坚果壳中的维度诅咒。
- 在大多数实际场景中,非一致性的祝福抵消了维数灾难。
- 降维可以成为补救维度诅咒的工具。
参考
[1] P. Domingos,“关于机器学习需要知道的一些有用的事情”,《美国计算机学会通讯》,第 55 卷,第 10 期,第 78–87 页,2012 年。
顾客价值悖论
对隐藏偏差(即统计偏差)的探索

谎言、可恶的谎言和统计数据

我们都知道,相关性不一定意味着因果关系。但有时,看起来非常强的相关性根本不是实际的相关性——它更多的是一种统计上的转移视线,可能导致错误的决策。
马克·吐温有句名言:
有三种谎言:谎言、该死的谎言和统计数字。
下面是一个真实的故事,在这个故事中,我几乎无意中说了一个伟大的统计谎言,试图分析客户价值。这个故事继续详细讲述了我是如何通过发现看似矛盾的相互关系、随后的智力斗争以及最终真相的揭示而识破谎言的。它包括对这一现象的所有直观解释,以及用于模拟的 Python 代码、表格和图表,以帮助您理解这一概念,并可能在您自己的工作中使用它。抓紧你的帽子。
背景故事
一家在美国各地都有商店的女装品牌的服装类别经理认为,购买服装(该品牌的一个相当小的类别)的顾客比普通顾客更有价值。她认为,通过提供更多种类的服装,并在广告、商店标牌和网站形象中更加关注服装,该品牌将吸引更多的高价值客户。然而,她需要证据来支持她的直觉,所以她问我,我们是否可以使用我们的交易数据来确定购买服装的顾客是否确实比其他顾客更有价值。
为了有效地分析数据,我们需要精确地定义我们的术语。我们将“顾客”定义为在给定年份从该品牌商店或网站购买至少一件商品的人。然后,我们将这些顾客分为两组:“服装购买者”,他们那一年的购买至少包括一件服装;以及“非服装购买者”,他们那一年的购买不包括任何服装。最后,我们将“客户价值”定义为该客户在那一年中花费的总金额。值得注意的是,服装购买者的顾客价值包括他们在所有商品上的花费——不仅仅是服装。
然后,我们比较了过去三年中每年购买礼服和不购买礼服的顾客的价值。我们看到,购买礼服的人平均花费明显比不买礼服的人多(同样,在所有商品上,不仅仅是礼服)。由于这些数据的专有性质和我记忆的限制,我不能报告具体的数字,但这些数字会说服最反服装设计师立刻放弃她的裤子图案。服装品类经理很兴奋地把这个消息告诉了经理们。她所在类别的顾客非常有价值!
我有一种挥之不去的感觉,有些事情不太对劲,所以我要求经理把这些发现看作是初步的,因为我还需要做更多的调查。我很惊讶买礼服的人比不买礼服的人花费更多,我想知道其他类别的买家和非买家分析会是什么样的,所以我也重复了其他类别的分析。
我试过买裤子的和不买裤子的,买毛衣的和不买毛衣的,买围巾的和不买围巾的,你明白了吧。对于每一个类别,“x 类买家”始终是比“非 x 类买家”好得多的顾客!显然有些不对劲,为什么每个类别的买家都比平均水平好?!
也许是因为我在比较专门买了东西的顾客和专门没买东西的顾客?虽然直觉上我看不出这有什么关系,因为根据定义,非 x 类买家至少购买了一件商品,但我决定再尝试一种方法。这一次,我比较了至少购买了类别 x 中的一件商品的客户和所有客户(包括那些购买的商品包含和不包含类别 x 中的商品的客户)。虽然这一分析缩小了年度支出的差异,但它仍然显示,每一个类别的买家都比真正的普通客户更有价值。

照片由 Yogendra Singh 在 Unsplash 上拍摄
这怎么可能?这似乎很矛盾!我被弄糊涂了!所以我做了任何一个理智的人都会做的事,用头撞墙,直到我想明白为止。
最后,在一阵悸动的头痛、咖啡因引起的嗡嗡声,以及带着我不满意的发现去找服装部经理的迫在眉睫的羞愧中,困惑消失了,真相像可怕的暴风雨后美丽的彩虹一样以其晶莹剔透的光彩出现了。
直觉
如果你已经明白为什么我会得到上述结果,恭喜你!你是一个聪明的人,请随意跳过剩下的部分,去做一些聪明的事情。对于其他人,让我们想想数据集——因为在认真思考了很长时间之后,在我深入分析了数据集本身之后,我终于想到了答案。

作者插图
我们可以将数据集想象成一个巨大的收据(有点像美国某家连锁药店的收据,其名称由三个字母组成),它列出了每一位顾客在一整年内在每一家商店购买的每一件商品。收据上的每一行都列有所购物品的类别、支付的价格和购买者。
想象一下,我们把这张收据挂在我前面提到的彩虹顶端的一朵蓬松的云上,向它扔一个飞镖(不瞄准),然后读出离飞镖最近的那一行。您认为该行中列出的客户最有可能是这样的人:
- 超过平均水平?
- 低于平均水平?
- 平均水平左右?

作者插图
如果直觉上不能确定答案是“高于平均水平”,想象一下上面的相同场景,除了只有两个客户:客户 A 购买了收据上 99%的商品,客户 B 购买了收据上 1%的商品。从理论上讲,一个“普通顾客”会购买(99% + 1%)/2 = 50%的收据上的商品,但是这个顾客实际上并不存在,我的飞镖很可能会落在顾客 A 的某一行,一个高于普通顾客的顾客。这个概念适用于许多不同类型客户的不太极端的情况。每当随机选择一行(或被飞镖击中)时,它更有可能是属于有许多行的客户的行,而不是属于只有几行的客户的行。因此,您可以预期所选的系列将属于更好的客户。
如果我们投掷大量飞镖,取所有被击中的客户的平均值(有些客户可能有多行被击中,没关系,我们只数一次),我们很可能会发现这个平均值大于没有被击中的客户的平均值(因为这些客户往往在收据上占用较少的空间)。
通过选择属于一个类别的物品(在我们的例子中是服装),即使从顾客价值的角度来看,从那个类别购买是完全没有意义的,我们仍然期望那个类别的普通购买者比其他人有更高的顾客价值!我们需要回答的问题是,我们预计这些买家的价值会比平均水平高出多少?如果服装购买者的价值明显高于这一理论价值,那么我们可以得出结论,他们是更有价值的客户。
基于模拟的演示
如果您仍然不相信直觉,让我们用 Python 中一个有趣的小模拟来演示这一现象!如果您确信这些代码,或者只是对它们不感兴趣,请随意滚动到解决方案部分。
假设我们有 10 个产品类别,为了简单起见,让我们将每个类别中的每个产品定价为 1 美元。
现在让我们假设在所有可能的客户的大世界中存在四种类型的客户:
- 节俭的房利美:40%的顾客每年只购买一件商品
- 常规瑞秋:30%的顾客,一年购买三件商品
- 忠诚的劳里:20%的顾客,每年购买 10 件商品
- 购物狂雪莉:10%的顾客,一年购买 50 件商品
假设在这一年,我们有 1000 名客户。每个客户本质上都是从客户类型群体中随机抽取的。根据她的类型,她会购买 1、3、10 或 50 件商品,但与普通购物者的品味和偏好不同,这位模拟购物者会从我们无限庞大的 10 类商品库存中随机抽取一件商品:
- 第 1 类,围巾:占商品的 0.9%
- 第 2 类,腰带:1.3%的物品
- 第 3 类,鞋类:占商品的 2.0%
- 类别 4,PJs:项目的 3.0%
- 第 5 类,服装:占商品的 4.5%
- 第 6 类,毛衣:占商品的 6.7%
- 第 7 类,裙子:10.1%的项目
- 第 8 类,短裤:占 15.1%
- 第 9 类,裤子:占 22.6%
- 第 10 类,最高:33.9%的项目
为了构建我们的数据集,我们首先从潜在客户群中选择一位客户,并根据她的类型确定她将购买多少商品。然后,对于她购买的每一件商品,我们会从库存中随机选择一件商品,并将购买记录在我们的巨型收据上。我们对所有 1,000 名客户重复这一过程:

作者截图
好的,看起来不错,让我们检查一些东西。
首先,品类组合是否符合我们的预期?

作者截图
看起来差不多了,现在让我们看看客户类型组合是什么样子的。

作者截图
好的,这个看起来也不错。现在,我们来分析 10 个类别中每个类别的买家与非买家的平均客户价值:

作者截图
让我们在这个表格中指出两件事。首先,正如我们所料,每一类买家的平均花费总是大于非买家的平均花费。其次,随着类别概率的增加,平均买家支出和平均非买家支出似乎都呈下降趋势,即每组中的平均客户价值似乎与类别概率成反比。
让我们用图表来进一步研究:

作者使用 MatPlotLib 和 Seaborn 绘制的图形
请注意,随着从特定类别购买产品的可能性增加,该类别购买者的平均支出趋向于所有客户的平均支出。这在直觉上是有意义的,因为如果只有一种产品,那么购买该产品的概率将是 100%,并且其购买者的平均花费将与所有客户的平均花费完全相同,因为所有客户都将购买该商品。如果我们回到飞镖类比,随着我们投掷越来越多的飞镖,我们覆盖越来越多的收据,直到最终,每个客户都有一行被击中,因此被击中的客户是普通客户。
还要注意,随着类别概率的增加,非购买者的平均花费趋向于 1 美元(我们数据集中任何客户的最小花费)。这是因为购买一件商品的可能性越大,不买这件商品的顾客就越有可能是节俭的消费者,正如我们之前定义的,他们每人只买一件商品。假设我们还方便地将每件产品的价格设定为 1 美元,那么每一个节俭的房利美将正好花费 1 美元。因此,随着购买某种特定产品的可能性增加,节俭的房利美在非购买者中的流行程度增加,所有非购买者的平均支出接近 1 美元。
一个解决方案
我们证明了服装购买者的人均消费高于平均水平是意料之中的,任何类别的购买者都是如此。然而,问题仍然是,如果购买一件衣服与顾客价值不相关,那么我们应该期望普通的衣服购买者多花多少钱。如果服装购买者的实际顾客价值显著高于预期数字,我们会得出结论,服装购买者确实是更好的顾客,如果服装购买者的实际顾客价值显著低于预期,我们会得出结论,他们实际上是更差的顾客。然而,如果它相对接近预期的平均顾客价值,我们会简单地假设服装购买者只是普通顾客。换句话说,当我们选择客户子集时,我们如何纠正引入的偏差,以便进行比较?
不幸的是,没有封闭形式的数学公式(据我所知)来计算这个。然而,正如我们使用模拟演示了该现象一样,我们也可以用这种方式解决它。
让我们假设一年中卖出了 5000 件衣服。如果服装购买者是真正的普通顾客,那么我们会期望服装购买者的平均顾客价值大致相当于从我们的巨型收据中随机选择的 5000 行上列出的顾客的平均顾客价值,或者使用我们之前的类比,巨型收据上的行被 5000 次投掷击中。它不会完全一样——可能会有一些误差——但这个随机选择应该是一个很好的近似,因为。如果从顾客价值的角度来看,购买一件衣服毫无意义,我们可以认为它本质上是随机的。
不幸的是,这只能给我们一个参考点——我们不知道这是特别不寻常的 5000 次投掷还是典型的。我们可以做的是投掷这 5000 个飞镖,记录被击中的行的平均客户价值,移除飞镖,然后再做一次。如果我们重复这个过程很多很多次(比如说 10,000 次),我们现在将得到一个非常正态(钟形)的平均客户价值分布。如果购买一件衣服是真正随机的,这些平均值的平均值将是一个非常好的和无偏见的估计。然后,我们可以用可量化的统计意义来确定实际的服装购买者到底有多有价值。到目前为止的例子,如果一件衣服购买者的平均价值大于 97.5 百分位,我们可以以大于 95%的信心说,如果购买一件衣服与平均顾客消费无关,就不太可能看到我们得到的结果。好吧,这是非常静态的语言——换句话说,他们可能是比平均水平更好的客户,我们对此有 95%的把握。
让我们像以前一样对此进行编码,只是这一次,我们只使用三个产品类别:腰带、上衣和连衣裙。让我们有目的地让服装更有可能被最好的顾客购买,让皮带更有可能被最差的顾客购买。

作者截图
现在让我们模拟一下分布情况(在收据练习中重复投掷飞镖):

作者截图
正如预期的那样,礼服买家的价值明显高于他们的预期价值,上衣买家的价值完全在他们的预期价值范围内,腰带买家的价值明显低于他们的预期价值。
让我们绘制模拟分布图,这样我们可以更清楚地看到这一点!

作者使用 Python 中的 Seaborn 和 Matplotlib 包绘制的图表
现在,我们可以清楚地看到,买皮带和买裙子的人的价值观离预期的范围有多远。虽然这并不能证明因果关系,即我们仍然不知道购买一件衣服是否会使顾客变得更好,或者只是更好的顾客倾向于喜欢衣服(实际上我们知道在这种情况下是后者,因为我们创建了模拟,但在现实生活中我们不会知道这一点),但我们仍然拥有关于购买各种类别产品的顾客的价值的有价值的信息。例如,如果这家公司考虑停止一个类别,他们可能会更好地停止皮带比服装,因为疏远最好的客户的风险是最低的。
但是我们能确定因果关系吗?如果公司真的想知道是否有产品,当购买时,实际上导致客户成为一个更好的客户?想象一下,买一台视频游戏机,这会导致购买许多游戏和配件。或者在我们的服装案例中,想象一下这家公司出售的一种产品(比如一件衣服),它可以完美地搭配一条皮带、一双鞋子、一个耸肩头和一个手提包。我们如何用统计学来确定呢?
让我们在以后的文章中更全面地探讨这个问题。
又及:在现实生活中,购买服装的人确实成为了更有价值的顾客(尽管没有我在这里展示的模拟图那么极端),服装品类经理从此过上了幸福的生活。
关于作者

嗨,我是丹尼尔。我是数据科学的学生、实践者和领导者。我特别着迷于数据科学如何帮助企业做出更好的决策和更有效地做事。我目前领导 Red Oak Sourcing 的数据科学团队,我已经在各种行业建立、领导了几个数据科学团队。如果你有兴趣与我建立职业联系,请点击这里查看我的 LinkedIn 个人资料:https://www.linkedin.com/in/danielwiesenfeld/,如果你想听听我偶尔发表的观点,请点击这里关注我的推特https://twitter.com/DataDan5。你也可以在 github 这里【https://github.com/dan-s-w找到我的公开回复和帖子。我希望你喜欢我的文章。
健康数据科学家的日常生活

pikisuperstar 创建的人向量—www.freepik.com
办公时间
机器学习、与医生合作和理解疾病的令人兴奋的组合
有几篇关于 medium 的文章解释了数据科学家在日常工作中所做的事情。这篇文章特别关注一家公司的健康数据科学家的生活,即那些在疾病预测、诊断、药物发现、生物技术和其他医学领域工作的人。
这类项目的例子有:
- 对亨廷顿氏病患者进行分组,以实现分层临床药物试验(向每个分组中的患者施用相同的药物,以观察各组的反应是否不同)
- 预测癌症患者可能如何随时间发展
- 预测哪些患者 最有可能在出院后 30 天内再次入院
- 预测 哪些患者最有可能患上糖尿病
我们将快速总结任何领域(即健康、投资、营销、供应链和其他领域)的大多数数据科学家执行的任务,然后讨论特定于健康的任务。
大多数数据科学家做的活动
如果你已经知道这一点,你可以跳到下一部分“健康数据科学家的特定活动”
像其他开发人员一样,数据科学家通常在敏捷(一种项目管理方法)中工作,并使用基于票证的工作管理管道。这通常包括以下基本的敏捷会议:
- 冲刺计划会议:冲刺是一段时间(例如 2 周),在这段时间内需要达到某些目标,完成某些工作需求。sprint 规划会议在 sprint 开始时召开,在这里设定 sprint 目标、定义任务并完成票据规范。
- 每日单口相声:通常是 15 分钟的会议,你团队中的每个成员都要解释自上次单口相声以来他们做了什么,他们正在做什么,以及他们的工作是否有任何阻碍。
- 待办事项列表整理/细化:这是 sprint 期间的一次会议,团队在会上回顾待办事项列表(任务列表)并决定是否需要更改、删除或添加任务。目标是确保工作管道足以实现 sprint 目标。
- Sprint/代码审查会议:团队成员解释他们在 Sprint 中构建的功能,并展示他们的代码。这些会议对学习很有帮助!
- Sprint 回顾:团队讨论什么是有效的,什么是无效的,以及可以做些什么来改进下一次 Sprint 的计划和管理过程。
在这些会议之外,您可能会根据票证同时处理一项或多项任务。主要活动可能包括:
- 编写端到端模型开发的代码并独立解决 bug:这是你一天的关键——编写代码(可能用 Python、R 或 Julia)来清理数据、训练模型、优化性能和绘制结果。注:如果你不熟悉数据科学的基本步骤,我会推荐 这篇文章 。
- 评审同事的代码:当你的同事完成他们的工作单并把他们的代码推送到你的版本控制系统(例如 Github)时,在它被合并到主存储库之前,它需要被评审。您将仔细阅读他们的代码,检查其准确性,并可能提供如何改进代码风格或简洁性的提示。
- 会见工程师他们正在建造你将与之共事的东西。例如,他们可能希望从您那里收集他们正在开发的基于云的新机器学习软件的需求,或者解释您的团队将使用的新系统。
针对健康数据科学家的活动
健康数据科学家做上述所有工作,但也做许多特定领域的工作,其中大部分是从了解患者、疾病和医学开始的。
以下是一些常见任务:
研究疾病
开发机器学习模型时,首先要做的是了解疾病本身。您的许多数据科学决策都将受到这一知识的影响,例如选择哪些患者参与您的研究、使用哪些特征以及如何标记终点。
您需要了解的关于该疾病的基本知识包括:
- 该病的症状、病因、治疗有哪些?
- 是否存在疾病的变异或不同类型?
- 有哪些合并症与之相关?
- 疾病一般如何进展,有哪些常见的预后?
阅读关于疾病的科学机器学习论文
一旦你对这种疾病有了基本的了解,下一步就是要了解现有的关于这种疾病的数据科学研究。尽可能多地阅读相关的科学论文。这些会给你一个很好的疾病的科学概述,并强调什么有效,什么无效。
重要的是,这些论文还可以给你一些实际的启发,比如:如何清理医疗健康记录,包括和排除哪些患者,哪些实验室测试最相关(以及它们的值告诉我们关于疾病的什么),以及哪些类型的机器学习方法最适合解决问题。
患者群组生成
从文献综述中,你可能很清楚哪些患者是你要纳入研究的,哪些患者可能会影响你的研究结果。这是您正式定义谁将被包含在研究数据集中,谁不被包含在研究数据集中的阶段。
例如,假设您正在进行一个亨廷顿氏病项目。在这个阶段,你可能已经发现,带有突变 HTT 基因的患者(即那些将患亨廷顿舞蹈症的人)可以分为两类:前期症状(尚未表现出症状)或明显症状(表现出症状)。如果您的项目旨在测量治疗对症状的影响,您会希望排除该组中没有症状的患者。
在这一阶段的最后,您将拥有一个类似上面的包含/排除标准列表,稍后您将使用它来过滤代码中的数据。
患者分层
您可能还发现,在疾病中有不同的患者亚组,例如处于不同阶段(例如癌症 I 至 IV 期)或不同类型(例如 I 型和 II 型糖尿病)。
您可能希望为每组中的人训练和测试不同的模型,例如处于疾病早期阶段的人和处于疾病晚期阶段的人。如果是这样的话,您将需要划分患者队列,并分别训练/验证每个子集,为每个子集产生不同的结果。
调查哪些变量可以解释这种疾病
现在,您需要创建一个最终的功能列表,包括在您的模型培训中。这可能包括人口统计数据(年龄、性别、SES)、实验室结果(血液或尿液测试)、之前的诊断、临床观察(体重、身高、血压)、住院情况(就诊次数、时间)和治疗数据(患者使用了哪些药物或干预措施)。
你可能已经从文献综述中收集了帮助解释这种疾病的关键变量的粗略列表。例如,如果你正在研究心力衰竭患者,你可能会发现 BNP > 900 pg/ml(来自血液测试)高度表明这种情况的存在。
您可能还发现,一些测试高度指示您正在模拟的疾病,但它们也可能指示其他疾病,因此您不想依赖它们。
使用您的疾病知识来创建您的特征列表,以包括在模型训练中。(这也可以使用数据驱动的特征选择方法来完成,如随机森林。
与临床医生交谈
到目前为止,在这个过程的任何阶段,你都可能希望与每天治疗该疾病患者的临床医生(医生、护士、外科医生)讨论你的想法和建议。例如,您可能想要检查您的患者纳入和排除标准以及您的功能列表。
为什么?首先,因为医学很复杂!你可能错过了一些他们很容易发现的医学上重要的东西。其次,他们可能是你的算法的用户,因此可以告诉你你的模型需要做什么才是有用的。
临床医生可以在三个主要方面为您提供宝贵的建议:
- 疾病特征:在数据科学项目中,在线研究疾病是理解问题的一个极其有用和关键的部分。然而,根据经验,医生可以在 1 分钟内告诉你一些事情,你可以花几个小时试图在网上解决,但得不到明确的答案。例如,你可能读到过超声心动图是了解心力衰竭的一项重要测试。您贪婪地梳理数据,试图找到“超声心动图”,却从您的临床医生那里发现,实际上许多不同的指标来自这项测试,列名实际上是诸如“LVOT 直径”、“肺峰值梯度”和“肥大”之类的东西。
- 数据是如何收集的,不同变量的含义是什么:例如,当试图找出一名患者是否患有“肺部疾病”时,您可能会本能地在他们的医疗记录中查找肺部疾病的疾病代码,然后试图找到另一个表明患者何时不再患有该疾病的变量(这样您就可以知道他们在某个特定日期是否患有该疾病)。然而,临床医生可能会告诉您,实际上,每次医院就诊时,医生都会对疾病进行重新诊断,因此,如果在患者最近一次医院就诊时没有肺部疾病诊断,这意味着患者不再被认为患有该疾病,也就是说,您只需要查看一次患者就诊,而不是几十次。
- 什么样的预测结果在实践中有用:例如,我们可能会去找我们的临床医生,告诉他们我们的算法,该算法预测哪些患者可能会在出院 30 天内再次入院。他们可能会告诉我们,这种预测只有在实践中有用,如果他们也能被告知哪些变量(例如低血压)是造成这种风险因素的原因,那么他们就可以尝试解决这些问题(例如,在患者出院前开β受体阻滞剂)。如果你想建立一个有用的算法,这种用户信息是绝对关键的。
检查医疗数据
在这个阶段,我们知道我们想要包括哪些患者,我们需要哪些变量来识别他们,以及我们想要使用哪些特征。现在,我们需要检查数据,并确保我们拥有项目所需的数据。卫生数据科学中两种常用的数据类型是:
- 电子医疗/患者记录:这是在医院或其他医疗实践中自然收集的患者数据(不作为研究的一部分),如人口统计、血液或尿液测试、以前的诊断、住院记录和治疗数据。
- 医学研究数据:在医疗保健系统之外收集的数据,用于特定目的或研究。一个例子是 EnrollHD 数据集,这是世界上最大的亨廷顿舞蹈症患者数据集。患者被专门招募来研究这种疾病,并在一段时间内多次访问测试中心,在此期间,他们参加了针对亨廷顿氏病的观察测试(认知、精神和运动功能测试)。
您需要的变量可能不在您收到的数据表的列名中。因此,如果您无法根据列名找到所需的变量,请考虑该变量是否可以从其他列派生。
例如,您可能没有“ has_lung_disease ”列。但是,您可以从实验结果的其他列中得出这一结论。例如,从您的研究中您可能知道,如果 test1 > x 、 test2 < y 和 test3 ≥z ,那么该患者患有肺部疾病,因此在您的“阳性诊断”列中得到 1。
一旦完成上述所有工作,您就有了具有特征(标记或其他)的已清理患者群组,您可以像往常一样开始训练、验证和优化您的模型:)
最后的想法
当然,健康数据科学家还有许多其他工作要做,那些使用细胞数据从事分子生物学或遗传学领域工作的人,与那些使用患者记录从事疾病预测和诊断的人相比,将有不同的日常任务。然而,这给出了在健康领域工作的大概情况。一个普遍的注意是,尝试创建一个可能帮助病人好转的算法是非常有趣的。
希望那有用!如果你有任何问题,请直接在 LinkedIn 上给我发消息。你也可以邮箱 订阅我的帖子 这里。
最后,如果你想进一步支持 Medium 上的作者,你可以在这里注册成为会员。
随机种子的危险
R 中的一个案例研究,讲述了迂腐地使用随机种子会导致不想要的结果。

凯文·杰瑞特在 Unsplash 上拍摄的照片
手动设置(伪)随机发生器的种子是一把双刃剑:
- 这确实意味着运行相同的脚本将总是产生相同的结果,从而使实验可重复;
- 但是它也可能从随机性中带走比你想要的更多的东西,从而使实验潜在地变得无用。
以下是前阵子发生在我一个…咳咳…朋友身上的事。回想起来,这是一个非常明显的错误,但是我并没有经常看到这种情况,所以我很确定其他人也会遇到这种问题。
让我们看看我的朋友做错了什么,让他的例子成为所有人的警告标志!
这个计划
我的朋友想要实现的是:
- 生成 10k 个随机数,在 0 和 10 之间均匀分布,我们称此列为
x; - 做一些其他的事情;
- 生成另一组 10k 随机数,这次是从一个泊松分布,λ=
x,让我们称这个列为y。
他还希望能够引用结果并使它们可重复,所以他设置了一个随机种子。他用 R 语言编程的方式:
library(data.table)my_random_seed <- 123set.seed(my_random_seed)
tbl <- data.table(x = runif(10000) * 10)# ... other stuff ...set.seed(my_random_seed)
tbl[, y := rpois(10000, x)]
你能看出他做错了什么吗?
(如果可以的话,你几乎可以停止阅读,因为这将是全部。)
有什么不对劲的迹象
在找到朋友犯的错误之前,先来看看结果吧!
tbl本身看起来是这样的:
x y
1: 2.875775 2
2: 7.883051 10
3: 4.089769 3
4: 8.830174 12
5: 9.404673 14
---
9996: 4.663523 4
9997: 8.989519 13
9998: 1.135348 0
9999: 5.712259 6
10000: 9.005851 13
到目前为止没有什么可疑的,泊松分布的期望值是它的λ参数,所以我们期望x和y接近。
然而,如果我们按x分组调查结果,就会出现一个不太理想的画面:
tbl[,.(y_mean = mean(y), count = .N),
keyby = .(x_rounded = round(x, 1))]
退货:
x_rounded y_mean count
1: 0.0 0.00000 52
2: 0.1 0.00000 102
3: 0.2 0.00000 107
4: 0.3 0.00000 103
5: 0.4 0.00000 102
---
97: 9.6 15.16495 97
98: 9.7 16.00000 90
99: 9.8 16.74118 85
100: 9.9 17.96078 102
101: 10.0 20.36957 46
这可不好。例如,假设泊松分布的 102 个随机数的λ值约为 9.9,其平均值为 17.96。
总数也不匹配。每个泊松都有其各自λ的期望值,正如我们所知,对于独立变量,期望值相加,因此我们会期望x和y的和接近,但它们大约是 50k 和 57k。
好吧,再多一点来说明问题,策划x对y的攻击也表明有些事情显然是错误的:

拙劣的泊松生成(作者图片)
揭秘
而杀手是……(击鼓)……用同一个数字两次作为随机种子。
在引擎盖下,当我们要求rpois从一个特定的泊松分布中产生一个随机数时,它会从一个随机的均匀数开始,并使用反演技术找到相应的值。(至少对于小 lambda 来说是这样。否则,它似乎是使用一个正常的近似值,但我很肯定,这也归结为一个随机的统一数字。详情请看源代码。)
所以我们有一个随机的统一号,姑且称之为w。泊松生成然后将使用累积分布函数(CDF)找到整数u,其中CDF(u-1) < w ≤ CDF(u),然后生成的数字将是u。(这里不要引用我的话,只是大概的想法。)
问题是,在我们的例子中,这个随机的均匀数将总是来自与泊松分布的λ相同的随机种子。
具体来说,λ将与随机统一数乘以 10 相同。(这就是我们最初生成数据的方式,得到一个 U(0,10)分布。)
重现问题
我们可以很容易地重现正在发生的事情。首先,生成 CDF 值(是的,有一个内置函数,但我认为从头开始做会很有趣):
tbl[,cdf0 := x^0 * exp(-x) / factorial(0)]
tbl[,cdf1 := cdf0 + x^1 * exp(-x) / factorial(1)]
tbl[,cdf2 := cdf1 + x^2 * exp(-x) / factorial(2)]
tbl[,cdf3 := cdf2 + x^3 * exp(-x) / factorial(3)]
...
然后我们使用这些来“生成”我们自己的“泊松”(观察我们如何使用x/10作为“随机”均匀数):
tbl[y2 := NULL]
tbl[x/10 <= cdf0, y2:=0]
tbl[x/10 > cdf0 & x/10 <= cdf1, y2:=1]
tbl[x/10 > cdf1 & x/10 <= cdf2, y2:=2]
tbl[x/10 > cdf2 & x/10 <= cdf3, y2:=3]
...
现在,如果我们检查tbl,我们将看到列y(最初的泊松生成)和y2(我们的重新计算)将匹配。
如何避免这种情况
我觉得意识到这种对随机种子的潜在滥用是成功的一半。然后,您可以在每个环境中只设置一次随机种子,使用不同的种子,或者干脆不使用它们。
这个话题的另一个有趣的角度来自johndcook.com,作者警告在一个序列中使用太多的随机数作为种子,因为你会比你预期的更快地遇到重复的数字。这篇文章使用 16 位整数进行计算,而 R 的随机数生成器使用 32 位整数作为默认值(至少这是我的理解),但我认为这个建议仍然有效。
stats.statexchange.com上有一些值得思考的东西,如果太多人使用相同的随机种子会发生什么(就像我朋友用 123),如果人们一直选择相同的 4-5 个数字,会不会导致任何问题。可悲的是,讨论没有结论。我猜正确的解决方案是生成一个足够大范围的随机整数,并使用它作为种子,而不是通常的 123、1234、100、42 等。
叙述的危险诱惑
办公时间
对强有力的数据叙事的渴望是如何折磨你的。

在数据科学或任何其他严重依赖于与其他方分享结果的定量学科中,你会经常听到这样的话:当你进行分析时,它应该向你的观众讲述一个故事。像福布斯、哈佛商业出版和 Tableau 这样的文章已经讨论了讲故事在商业和/或数据分析中的重要性,并且被他们的导师传达给无数新面孔的分析师、研究助理和初级数据科学家。所有这一切都是有充分理由的——众所周知,以故事形式呈现的信息比仅仅分享原始数据更容易记忆,并与更广泛的学习风格产生共鸣。
在个人层面上,在分享发现时,展示可靠的故事和对叙事的强大控制的有效性以前在很大程度上拯救了我的培根——当我花了几个月时间对诗歌行进行分类的卷积神经网络得出 29%的测试准确率,而不是我希望的 70%或 80%时,它拯救了我的本科荣誉论文。这种拯救究竟是如何完成的,这是另一个故事,我很乐意分享,但我认为在赞美数据科学中讲故事的优点之前,首先探索它的陷阱是重要的,因为正如它在一种情况下拯救了我,在另一种情况下它几乎是我的毁灭。
你看,好故事的诱惑是一把双刃剑。如果使用得当,它可以发挥很大的作用,使你的分析更有力,更容易理解,更流畅,看起来更准确。然而,它也可能像一匹突然脱缰的马,疯狂地把你带向一个不是你选择的方向,让你不确定自己的方向。为了更具体地说明这一点,我给你提供了以下轶事——不,这是一个 21 世纪对有抱负的数据科学家的寓言。
在获得学士学位前不久,我和两个朋友参加了美国统计协会(American Statistical Association)举办的数据科学黑客马拉松(data science hackathon ),他们在周五晚上提供了一个来自行业合作伙伴的数据集,我们必须在周日早上之前准备一份分析,该分析必须限于两张幻灯片,时间不超过五分钟。我们与大约十几个其他团队在各种类别中竞争,例如最佳展示、最佳外部数据使用、最佳可视化和最佳商业洞察力,我们获得的数据包括加拿大国家女子橄榄球队的各种健康、生物测定和 GPS 数据。
在数据集公布后,我的团队共同决定在我们深入研究之前仔细考虑现有的信息,并在上面睡一觉。当我们第二天早上神采奕奕地出现时,我们立即坐下来制定了一个策略。首先,我们决定将重点放在健康数据上,因为它比 GPS 数据更简单、更清晰。我们还选择了直截了当的分析,而不是尝试任何过于花哨的东西,因为我们是在计时器上,认为一个不那么雄心勃勃,但更精致的分析会给评委留下更好的印象。最后,我们决心至少赢得外部数据最佳使用奖,因此我们为此分配了相当多的时间,因为我们已经知道分析本身不会过于复杂。
健康数据中包含一个列,指示给定球员在给定日期是否报告了受伤,我们将此作为一个感兴趣的变量,因为球员受伤可能会对他们效力的组织产生非常严重的财务影响。自然地,像任何面临二元结果变量的数据科学家一样,我们的第一直觉是在我们的分析中采用某种形式的逻辑回归。我们决定进行回归,将球员受伤作为因变量,所有其他健康指标作为自变量,计算比值比,并查看哪些指标可能被用作受伤的可靠预测指标,或许可以作为教练的一种早期预警系统。
到目前为止一切顺利——我们建立了模型,其中一个变量成为受伤的最强预测因素。这个变量被称为“疼痛程度”,由运动员每天自我报告,范围从 0 到 10。我们很高兴有这样的结果,但如果我们想在比赛中取得好成绩,这本身是不够的——毕竟,疼痛与受伤有某种关联并不奇怪。到目前为止,我们已经确定了我们想要使用的外部数据源,这是一个按照最强到最弱对运动队进行排序的排名图表,因此我们决定采用我们模型的结果,并将其作为在即将到来的比赛中对疼痛程度(我们最重要的受伤预测指标)和对手实力之间的关系进行一些探索性数据分析的理由。
一个简单的双变量散点图揭示了一个令人惊讶的发现——大部分报道的疼痛程度整齐地分为两类。如果即将到来的对手排名高于团队,报告的疼痛值通常会在量表的下半部分。相比之下,如果排名认为对手比团队弱,疼痛值将在很大程度上处于量表的上半部分。起初,我们觉得奇怪的是,在他们的球队处于劣势的比赛中,球员会不那么痛苦,但经过一些讨论后,我们设法找到了一个潜在的解释。我们的结论是,运动员知道他们将面对一个强大的对手,不想让球队失望,因此低估了自己的疼痛,以确保在比赛当天,他们仍将在球队的比赛计划中扮演重要角色。反过来,这种对报告疼痛的放任态度导致了更高的伤害发生率。这就是我们周日早上要拿出来讨论的观点。
在这次活动中,有几位导师,其中一些是法官,另一些只是感兴趣的观察员,他们自愿四处走动,与小组讨论他们的分析,并在一个小组似乎陷入困境时提供一些温和的推动。整整一天,我们和许多不同的导师一起进行了几次我们的推销演习,解释了我们的发现和我们认为它们意味着什么,每次我们都充满了热情和兴趣。这种积极的反馈循环使我们的信心膨胀,我们得意洋洋——我们挖掘了数据,从中得出了一个很好的故事来告诉评委。
那么问题出在哪里呢?
问题在于我们对“疼痛程度”变量的解释,以及它被定义的违反直觉的方式。你看,当你看到一个名为“酸痛程度”的变量,从 0 到 10 分不等,直观的解释方式(至少对我和我的队友来说是直观的)是,数值越高,运动员声称越酸痛。也就是说,你自然会认为这些数字的含义与你在医院和诊所看到的疼痛图表上的含义相似,看起来像这样:

作者创建的图像。
然而,自我报告的健康指标及其精确定义不是由数据科学家、统计学家、分析师或任何其他认识到这一点的数据专业人员确定的。相反,它们是由教练组创建的,他们希望能够将运动员报告的每一项健康指标汇总成一个总和,并希望总数越高,运动员感觉越好。因此,虽然像激励程度或信心程度这样的指标被解释为这些质量随着值的增加而增加,但疼痛程度却相反:相反,0 值意味着运动员非常疼痛,而 10 值意味着他们一点也不疼痛。换句话说,我们已经把分析的解释和我们感兴趣的主要变量的方向性放在了一起,并准备在第二天早上展示这个解释。
我们怎么会犯这样一个愚蠢的错误,并且进行了完整的分析却没有发现它呢?就我个人而言,我认为有三个因素造成了这个错误。
- 首先,很难说变量本身不是以令人困惑的方式构建和呈现的。这个变量的正确解释不仅与常识相矛盾,而且与其他所有健康变量的解释也不同。这不是借口,因为仔细检查他们对数据的假设以避免这种错误仍然是数据科学家的责任,但这确实使这种错误更有可能发生——在我们向六七位导师介绍我们的研究结果时,没有一个人质疑我们对变量的最初解释。
- 第二,我们时间紧迫,行动迅速。因此,我们没有在更宽松的环境中工作得那么认真。
- 最后,也是最重要的一点,我们完全沉浸在我们围绕结果构建的叙述中,并被我们收到的关于该叙述的极其积极的反馈所陶醉。
当我说强有力的叙述的诱惑是一把双刃剑时,我的意思应该很清楚了。一个好的故事会让你的结果更有说服力,但也会让你更容易说服自己相信一个不正确或无效的结果是正确的。更糟糕的是,它让你更容易欺骗他人,即使是在不知情的情况下,虽然这种情况发生在轻松的黑客马拉松中是一回事,但发生在现实世界中的分析中则完全是另一回事。在商业和工业领域,你面对的观众很大程度上和其他人一样容易被一个好故事所影响,正如我们所看到的,你不能指望中间人帮你发现错误。我们不正确的分析顺利地通过了六个或更多的导师,这意味着如果你在工作中,一个好故事中的错误可能会越过你的主管,他们的主管,等等,一直到高管,如果最终发现你有一个反向变量,他不会感到好笑。对你工作的责任止于你,止于你。
最终,我们恢复了理智,通过数据字典进行了检查,发现了错误,并在周六晚上的最后一刻成功地调整了我们的材料,以呈现一个远没有那么有趣,但可能更正确的故事:运动员最有可能在与强劲对手比赛前的几天过度训练,消耗身体,使自己疼痛,因此受伤的风险更高。这个项目很受欢迎,虽然我们没有达到最佳表现,但我们获得了团队排名外部数据的最佳使用奖。结局好就一切都好。我们都对结果感到高兴,更重要的是,我学到了宝贵的一课,即在相对低风险的环境中,一个好故事的潜在风险。
说到底,在数据科学中讲故事是有价值的,并且在呈现结果时应该继续被强调,但是请记住:如果一个好的故事是基于糟糕的工作,那么它是没有意义的。当扮演分析师的角色时,你的工作是对数据提供的见解保持客观,不要被叙述带走(不管它看起来多么令人信服或“性感”),直到分析完成、尘埃落定并得到充分验证。在你一丝不苟、兢兢业业地完成工作,并尽职尽责地遵循坚如磐石的数据科学原则之后,你就可以放松了。当你确定的时候,尽情享受展示结果的乐趣:讲一个非常好的故事,尽可能让它引人注目、激动人心、有趣。让它变得伟大——但首先,让它变得正确。
流行的数据分析范式的问题是

流行的数据分析范式植根于逻辑实证主义哲学。不主要处理数据的机构需要更灵活的方法。
流行的数据分析范式深深埋藏在一个叫做逻辑实证主义的哲学学派的贫瘠土壤中。该框架的特点是源自实证主义的三个神秘信条
- 数据是所有分析的唯一自然出发点
- 我们通过公正地收集数据来确保模型的客观性
- 数据“说话”。也就是说,它们在模型的构建中引导我们的思维。
正如我在我的文章“建模的神话:数据说话”中所讨论的,实证主义——以及与之相关的,其神话般的信仰——在 20 世纪 60 年代已经被彻底质疑。不幸的是,就像思想史上经常发生的情况一样,反革命得过且过。早期的革命者会放松狭隘的经验主义的枷锁,并在假说和启发并规范它们的数据之间展开更开明的对话,而下一代人会把经验主义一起扔出去。在随之而来的常识真空中,从业者别无选择,只能爬回沉浸在实证主义中的框架。
因此,今天维基百科关于数据分析的页面以以下对狭义归纳主义的敬意开始:
数据分析是对数据进行检查、清理、转换和建模的过程,目标是发现有用的信息、提供结论,以及支持决策。
并在页面顶部提供了实证主义代表的明珠,完成了从数据分析到模型(而不是其他方式)的箭头和一个称为“原始”数据的活动,最大限度地远离理论。
实证主义数据范式的问题
数据科学做得很好,尽管它的认识论基础令人怀疑,但它的许多最大成功发生在主要处理数据的公司:通过交易创造数据的公司,将他们偶然或设计产生的数据货币化的公司;简而言之,公司通过他们的数据寻找和积累分析。
但随着“数字化转型”的加速,主要不处理数据的机构正越来越多地依靠数据来解释他们所处的世界,并解决他们面临的业务和政策问题。他们在分析的驱动下寻找并积累数据。
在这里,数据科学的成功可能是它的毁灭,因为当问题去寻找数据时,已经如此成功地应用于数据寻找分析的范式在实证主义的认识论和沙堆上搁浅了。
在下文中,我假设我们处于后一种情况,我们分析数据是为了一个特定的目的,解决手边的问题,“提供结论”或“支持决策”
数据是不公正的
数据的选择必然假设相关性,而相关性意味着对将数据与手头问题联系起来的叙述的某种程度的承诺。数据的处理和清理也有同样的必要性;如果没有对数据的重要性以及它们如何与手头的问题相关的一些相关性或期望的概念,你就无法知道什么是信号,什么是噪声。没有猜想就没有数据。
数据不一定足够
在选择数据时,我们不仅被自己经过审查的猜想默默地引导着,如果我们试图压制解释性的概念或框架,我们就没有办法知道我们收集的数据是否是那些与理解或解决手头问题最相关的数据。我们没有机制来激发对进一步数据的搜索,以提供确认、反驳或进一步的见解。
数据不是分析的唯一自然起点
为了分析现象以形成结论或提供解释,潜在的解释是一个有效的起点。对于决策来说,你试图实现的目标和你试图实现这些目标的决策杠杆是自然的起点。
数据不会说话,更不会解释
无论是实证主义者还是他们的数据分析辩护者都无法给出一个客观、透明的过程,更不用说一个演绎过程,通过数据的积累产生一个解释性的理论或假设。数据不会说话。如果不借助于一些理论背景,我们甚至无法解释数据。
但是客观性呢?
对公正数据的渴望源于对明智选择和扭曲数据的恐惧,这种选择和扭曲是为了服务于一种宠物理论或一个隐藏的议程。这是卡尔·波普
…如果我们不加批判,我们总会找到我们想要的:我们会寻找,并找到证实,我们会远离,而不是看到,任何可能对我们钟爱的理论有危险的东西。用这种方法,很容易就能获得压倒性的证据来支持一种理论…
但是理论化在数据的发现、选择和呈现中是必不可少的。波普尔的解决方案是通过创造多种解释性理论来确保客观性,然后将客观性的审查转移到一个对抗性的舞台上,在这个舞台上,我们裁决这些猜测之间的关键竞争。
知识进步的方式,尤其是我们的科学知识,是通过不合理的(和不合理的)预期,猜测,对我们的问题的尝试性解决方案,推测。这些猜想被批判所控制…
抛弃数据“说话”的概念,解放我们去创造性地推测,把假设放回它正确的位置,与数据对话,而不是屈从于它。数据激发多种猜想,区分假说的尝试引导我们选择数据,并激发新数据的搜索和发现。这些反过来又在批判性话语的熔炉中考验我们推测的勇气。假设被提炼、拒绝、确认;它们合并和分裂并产生新的假设,这反过来又激发了额外数据的发现等等。
迁移学习的阴暗面

使用基本/基础模型进行预训练时的安全漏洞
迁移学习始于图像识别的金童,并迅速成为深度学习的既定支柱——这是有充分理由的。基础模型允许新一波非常容易访问和有效的深度学习应用。
虽然强大得令人难以置信,但人们应该永远记住已被证明适用于各种体制的通用建模原则:永远没有免费的午餐!绩效的捷径和进步几乎总是与外部性联系在一起。
就迁移学习而言,有一个外部性:安全性。已经证明,恶意黑客可以通过利用公开可用的基础模型,有效地破坏任何利用迁移学习的深度学习模型,即使他们无法访问它。
随着深度学习模型越来越多地被部署在重要的决策应用中,它们像任何其他全球技术一样,成为劫持和腐败的对象。对抗性学习是对深度学习模型的知识表示结构如何被利用来产生恶意输出的研究的名称。
这里有一个(著名的)具体例子:GoogLeNet 模型正确地给一张熊猫图片分配了一个合理的高概率标签。然而,当一个非常小的、视觉上察觉不到的噪声矩阵(一个扰动)叠加在原始图像上时,GoogLeNet 错误地将修改后的图像标记为一个具有异常高可信度的“长臂猿”。

摘自 Goodfellow 等人著“解释和利用对立的例子”
研究人员还发现了更多的恶意攻击,例如通过在限速标志上粘贴一条两英寸宽的黑色胶带,并打印一个 3d 玩具乌龟,其纹理旨在使谷歌的物体检测系统将其归类为步枪,从而欺骗无人驾驶汽车加速超过限速 50 英里/小时。已经发表了大量关于在大范围的基准深度学习中预测漏洞的文献。
如果深度学习中一些最关键的基准模型被证明容易受到敌对攻击,我们应该问问自己,从这些易受攻击的基准模型中微调的迁移学习模型的安全影响。
在“对深度模型的目标不可知攻击:利用迁移学习的安全漏洞”中,加州大学戴维斯分校的沙赫巴兹·雷扎伊和刘鑫演示了在只知道所用基础模型的情况下,使用迁移学习对深度学习模型的攻击。黑客不需要知道应用程序模型的权重集或体系结构,也不需要知道它被重新训练的数据;攻击因此被认为是目标不可知。这种攻击可以利用公开可用的预训练模型来利用广泛部署的深度学习模型。
考虑下面这个简单的例子,一个利用迁移学习的模型。模型的输入通过预训练的模型传递,预训练的模型的输出(在这种情况下,是三维向量)通过自定义的、新添加的完全连接的层传递,产生二维向量输出。

由作者创建。
黑客只能访问预训练模型,因为假设它是公共的,但不能访问自定义 FC 层和处理预训练模型输出的任何操作。(如果黑客不知道定制模型中使用了哪个公开可用的预训练模型,那么用与问题相关的几个基础模型中的每一个来重复攻击是微不足道的。)
假设黑客想要构建一个输入来触发一个特定的输出神经元,就像上面例子中自定义 FC 层的底层神经元一样。黑客可以构建一个输入,使得预训练模型的顶部神经元输出是某个非常大的数(例如,10),而所有其他输出神经元都是 0。当乘以相应的权重时,完整模型的输出产生:
10 * 4 + 0 * 3 + 0 * 2 = 4010 * 1 + 0 * 2 + 0 * 3 = 10

由作者创建。
softmax 激活功能放大了这种差异。完整模型的底部输出神经元是黑客所期望的模型的最终决策,因为它具有最大的关联值/概率。
另一方面,如果黑客想要激活完整模型的顶部输出神经元,他们将设计一个输入,使得预训练模型的输出神经元除了底部的一个之外都是零,这将是一个任意大的数字。

由作者创建。
已经确定,在这个简单的迁移学习示例中,黑客理论上可以设计一个输入来产生某个预训练的模型输出,该模型输出控制完整定制模型的期望输出。然而,在这些示例中,我们基于预训练模型外部的模型权重,推断出要“激活”预训练模型的哪个输出神经元(即,设置为非常大的数字,并将所有其他节点减少到零)。
我们需要一种方法将预训练模型输出中某个节点的“激活”与完整定制模型输出中某个节点的“激活”关联起来。一个简单的强力搜索就足够了,黑客的目标是构建一个输入,使得预训练模式的输出首先是[*a*, 0, ..., 0, 0],然后是[0, a, ..., 0, 0],以此类推,每次都记录完整的定制模型的输出。
应该注意的是,为了使这种策略能够激活完整定制模型的每个输出节点,以下(必须是冗长的)条件:对于完整模型的每个输出节点,必须存在从预训练模型的输出节点的连接,其权重大于从该预训练模型的输出模型到完整模型中任何其他输出节点的连接。如果这个条件不成立,那么无论输入是什么,完整模型的一些输出节点都不会被激活。在大多数深度学习问题中,特别是在唯一类数量较少的情况下,这个条件是满足的。
攻击现在已经归结为找到预训练模型的输入,这将导致特定的预训练模型输出。这是一个很好定义和探索的问题。值得注意的是,超现实的图像(艺术?)可以使用深度梦方法从神经网络中产生,其中目标是产生最大化某个选定层的激活的输出。
保持预训练模型权重不变,黑客可以使用梯度下降来改变输入中的每个特征,使得对应的预训练模型输出和期望的预训练模型输出之间的差异最小化。
这个简单的攻击出奇的有效。考虑下面的例子,其中左栏包含随机的初始未改变的面部,中间栏包含具有相关类的对立例子(即改变的面部),而右栏包含来自该类的真实例子。在第一行中,我们看到,我们可以欺骗 VGG 训练的面部识别模型,认为任何人的图像都是乔治·布什,只有轻微可见但似乎无关紧要的变化。

来源:热扎伊和刘。
虽然这种攻击只在简单的迁移学习模型中持续成功,但它暴露了更复杂应用程序中的潜在漏洞,并为共享/迁移权重表示和敌对利用的进一步研究铺平了道路。
点击阅读完整论文。
最近,人工智能领域的领导者们围绕所谓的“基础模型”展开了一场广为人知的辩论。这个术语是在斯坦福大学的一项研究中创造的,是计算机科学家、社会学家和哲学家之间的合作成果,指的是 BERT、T5、CLIP 和 Inception 等模型。这些都是代表各自领域主要成就的基础模型,无论是语言建模、图像识别还是其他前沿领域。特定的应用程序建立在这些基础模型之上,以便在更短的时间内获得更好的性能。
虽然基本模型或多或少是现代人工智能系统的基础,但人们对它们的可靠性有许多担忧。自从 GPT-3 在 2020 年高调发布以来,许多研究都认为它没有展示出对语言的“真正”或“真实”理解。其他基金会模式也存在类似的问题。
每一个实例中出现的问题都是这样的:如果基础模型本身不稳定,那么构建在它之上的部署模型有多稳定?
演示的对抗性攻击为迁移学习在稳定性/安全性和可访问性之间的权衡增加了额外的考虑因素。
感谢您的阅读,请在回复中告诉我您的想法!
如果你对最新的文章感兴趣,可以考虑订阅。如果你想支持我的写作,通过我的推荐链接加入 Medium 是一个很好的方式。干杯!
我们是否都遗漏了一个至关重要的数据分析师面试问题?
作为分析师,不会写就不会分享。如果不能分享,你的分析就没有价值。

在我之前的一篇名为“的文章中,你的数据策略是否遗漏了‘标记’?”,我强调了现代数据领导者在您的业务用户和他们的数据之间建立互动的责任。仅仅提供数据和工具来可视化或探索它是不够的。用户首先需要有读写能力,然后才是感兴趣,通常,产生兴趣的最快途径是构建一个故事。
数字之上的叙事。
如果叙述是交流数据的关键,为什么不找分析师来写这些叙述呢?作为分析师,不会写就不会分享。如果不能分享,你的分析就没有价值。
几千年前,当人类第一次开始写下故事时,他们捕捉到了世代相传的口头故事。随着时间的推移,起草过程得到了发展和培养。作者一边写一边构思新的故事,不断地把故事读给自己听,并为了最显著的效果而澄清故事。
起草是提炼和琢磨一个能被观众理解和联系的故事的关键。但是,不幸的是,在那个时候,成为一名作家不仅意味着受足够的教育去读和写,还意味着有足够的财富去购买纸张、墨水和羽毛笔。
随着时间的推移和识字率的不断提高,基本发明有助于传播讲故事的能力和抱负。例如,印刷机意味着故事可以更快地与更多的人分享。打字机成倍地提高了速度。因此,作者可以更频繁地创作更多作品,并立即分享。计算机带来了制作“软”拷贝的能力。草稿可以在不需要一滴墨水的情况下不断修改。最后,互联网彻底消除了数字出版物的印刷需求。

现在,起草这份文件时,人工智能会对我键入的每个字母进行处理,给我拼写纠正,调整句子结构以匹配目标交付语气,并分析整个工作是否符合预定义的风格指南。
在我们当前的世界里,我们都在不断地起草。我们正在通过社交媒体书写我们的生活故事(或者我们希望它们是什么)。我们一天到晚都在写电子邮件、休闲裤和短信。尽管如此,我们大多数人都不是伟大的作家。没有一个连贯的结构,没有故事情节可循。无关的细节被注入,而重要的笔记被省略。我们大多数人都是糟糕的作家。
写作是一项至关重要的技能,尤其是对于一个角色来说,他的期望是精心构思一个故事,然后清晰、一致地将这个故事传达给广泛的受众,这些受众都具有不同程度的信息素养。
那么,为什么我们不问问我们的数据分析师候选人他们是否会写作呢?
因为大多数 CS 或 CE 项目只要求语言、文学或写作相关学分的一般教育水平,所以我们的数据分析师在构思故事方面并不比其他人更好或更差。
在考虑优秀分析师的关键技能时,我们可能都会强调可视化技能、查询和探索数据的技术技能,或者理解数据并将其与业务相关联的业务敏锐度。但是,也许我们应该考虑的技能是“他们会讲故事吗?”。
如果你自己是一名分析师,想想你上一次创建的仪表板或者你展示的幻灯片。叙述在场吗?您是否创建了一个设置(即,分析内容的背景、原因等。)?旅程中的每一步都是合乎逻辑的还是有预兆的?最后,结局清楚了吗,会有续集吗?
无论你是团队成员还是领导者(你不一定要成为经理才能成为领导者),采取主动,尝试让团队写一个故事来解释你的计划的对手(业务挑战或问题)、主角(分析师)、旅程和结局。
和其他写作一样,遵循一个稳健的写作过程会产生最好的结果。首先,在白板上列出所有活动部件。你为什么或打算做这个分析?受影响的关键发现、数据集和业务用户是什么?人们可以预期什么样的逻辑结论?许多作者通常会在这一点上转移到项目符号大纲,但如果你是一名分析师,你可能是一个非常注重视觉的人。故事板最初是由华特·迪士尼的一位名叫 Webb Smith 的动画师创建的,它非常适合拼凑一个大纲。这些可以像便利贴或方块一样简单,上面写着分析的每一步。例如,“我们发现这个月的销售额上升了。”然后会变成“我们按产品类别对当月的 delta 销售额进行了分类。”关键是将事件按照既符合逻辑又易于遵循的顺序进行排序。
当你对你的故事板满意时,写第一稿。然后呢?修改。修改。修改。当团队中的每个人都对你的草稿感到兴奋时,确定一个测试受众。理想情况下,这是一个对领域有些熟悉,但并不完全了解分析计划的人(目标是写一些可以在没有先前上下文的情况下使用的东西)。
获得他们的反馈,然后呢?修改。修改。修改。
你可以尽可能多次重复这个过程,但是你可能会从第一遍中得到一些特别的反馈。
写下你的分析故事的练习甚至会让你重新思考你已经采取的方法或者你已经得出的结论。这个过程可以是一个强大的工具,在规划尚未执行的计划时很有价值,假设充当故事板或情节的起点。
建造。的。叙事。
当然,实际的数据需要被分层,这里的意图不是一页一页地提交分析结果。这取决于你根据目标、受众等来提炼一切。但是如果你已经经历了写作过程,并且在叙述中非常清晰,你的发现会被更多的人听到。接合的耳朵。
如果你是一个商业用户,你的分析是一本书吗?
还是一个你放不下的?
请关注我或通过我的推荐链接注册 Medium 来支持我的写作。谢谢!
NFT 炒作背后的数据
加密数据实践—第 2 部分

在 Unsplash 上拍摄的 Verena Yunita Yapi
加密分散应用程序创建了一个新的数据透明范例,这在传统的 web 2.0 应用程序中是不存在的。我之前说过,这是定义下一代消费平台的关键特征。在这篇文章中,我将通过展示一个工作中的数据透明性的例子来使这一点更加具体。特别是,我们将深入探究 NFTs 迅速崛起背后的数据。
在过去的几个月里,非功能性测试已经成为主流意识。从时代杂志创造钟表,到抖音建立一个创造者领导的收藏,到斯蒂芬·库里买了一只无聊的猿,NFT 似乎无处不在。如果你不熟悉的话,NFT 代表不可替代令牌,由 ERC721 和 ERC1155 接口标准定义。用不太专业的术语来说,它们是区块链上唯一的、不可替代的、稀缺的、可以拥有和转让的数字资产。
数字所有权的概念并不新鲜,已经广泛应用于游戏环境中,允许玩家通过皮肤、升级等定制他们的体验。数字资产和所有权的加密版本是一个有意义的发展,因为它们被证明是唯一的,而不是由一个单一的中央实体管理。任何可以访问区块链生态系统的人都可以独立地验证一个人在区块链上拥有某些东西的事实——这使得它们在应用程序之间更加可移植。例如,人们可以想象一个世界,NFT 头像的所有者是唯一能够在所有他们喜欢的社交平台上使用该头像的人。在那个世界里,NFT 成为数字身份的增强,可以扩展到更多的应用,而不仅仅是化身。然而,这种潜力在今天很大程度上没有实现,坦率地说,许多 NFT 收藏都是试图快速赚钱的肤浅项目。这就是为什么 NFT 是一个如此两极分化的话题——一些人认为它们为元宇宙铺平了道路,另一些人认为它们只不过是价格过高的 JPEGs。我不会试图把你推向一个或另一个方向,但我想告诉你如何使用加密数据来理解 NFTs 的宏观趋势和微观趋势。
NFT 市场
迄今为止,人们与 NFTs 互动的主要渠道是像 Opensea 、基金会、 SuperRare 、 Rarible 等交易所。一些 NFT 智能合约,最著名的是crypto 朋克,也实现了自己的交换功能。这些交易所是区块链上的分散式应用程序,使用户能够发现、购买和出售 NFT。通过解码这些智能合约生成的交易、跟踪和日志,使用我在本帖中描述的技术,我们可以创建一个数据集,其中包含以太坊生态系统中每一笔 NFT 交易的细节[1]。
例如,Opensea 的相关合同是以太坊上的 WyvernExchange 合同,以及 Polygon 上的两个 ZeroExFeeWrapper 合同( 1 和 2 )。利益的具体功能和事件是以太坊契约的atomicMatch_和OrdersMatched以及多边形契约的machOrders和Fill。其他 exchange 应用程序实现了它们自己风格的这些方法和事件,但是它们通常遵循类似的约定。解码这些信息使我们能够从任何给定的 NFT 交易中提取相关细节,即买方、卖方、时间戳、NFT 合约(NFT 也是智能合约)、特定的 NFTs、交易中使用的货币以及价格。
我不会在此详述所有各种解码和转换,但如果您想了解这些细节和/或获得解码数据集的副本以供自己分析,请随时直接联系我。
使用该数据集,我们可以看到 NFT 交易的商品总值(GMV 或交易值之和)在 2021 年 2 月首次出现拐点,从 2021 年 1 月的约 2500 万美元增长到 2021 年 2 月的约 4.5 亿美元,增长了约 20 倍。这在很大程度上是由 Opensea 的以太坊交易所和密码朋克的发展所推动的。

NFT 市场月度 GMV—作者图片
这一势头随后停滞不前,直到 7 月和 8 月,GMV 绝对爆炸式增长至约 42 亿美元,这也主要是受 Opensea 和 crypto 朋克的增长推动[2]。
在交易数量上也可以观察到类似的趋势…

NFT 市场月度交易-图片由作者提供
…还有买家

NFTs 每月唯一买家—按作者分类的图片
为了提供一个规模感,Ebay 和 Etsy 在 2021 年第三季度分别完成了约 195 亿美元[3]和 3B[4]的 GMV 交易。在截至 2021 年 10 月的 3 个月中,所有 NFT 交易的总 GMV 为 109 亿美元,其中仅 Opensea 就有约 93 亿美元。这是 Etsy 的 3 倍多,大约是 Ebay 的一半。这确实是一个令人印象深刻的规模,尤其是对于一个一年前还不存在的市场来说。
另一个值得注意的趋势是 Opensea 在 NFT 市场的份额越来越大。2021 年 1 月,Opensea 拥有 GMV 约 35%的份额,比当时的领先者 Rarible 落后约 10 个百分点。从那时起,Opensea 已经设法获得了大约 85%的 GMV 市场份额,Cryptopunk 是唯一一个有可观交易量的交易所。如果我们按交易或买家来比较份额,领先优势甚至更大。

NFT 市场的市场份额-作者图片
这就回避了“Opensea 是如何在瓶子里捕捉到 NFT 闪电的”这个问题。虽然在不知道 2021 年每个交易所的产品路线图和交付情况的情况下,我们无法明确回答这个问题,但我们可以在智能合约数据中寻找线索。特别是,如果我们检查在不同交易所交易的不同 NFT 收藏的数量[5],我们看到 Opensea 和 Rarible 在 2020 年底是并驾齐驱的。然而,Opensea 能够大幅增加 2021 年交易的 NFT 藏品数量,并在 10 月底之前领先 Rarible 近 7 倍,Rarible 的表现相对持平

每个月在每个交易所交易的独特的 NFT 收藏的数量——图片由作者提供
我相信这是 Opensea 不断增长的市场份额背后的驱动力。通过利用以太坊区块链的数据透明性,Opensea 专注于快速识别新的 NFT 项目,并在其平台上发现和销售这些项目[6]。这种深思熟虑的策略使它成为发现和购买新的热门项目的最佳去处。再加上加密社区的高度兴奋和 FOMO,这一优势很快在潜在买家中占据主导地位,并且每个新 NFT 项目的网络效应都使 Opensea 成为他们默认的二级市场。例如,参见 Bored Ape 游艇俱乐部网站上的“购买”链接。

像许多其他 NFT 项目一样,BAYC 将 Opensea 作为他们默认的二级市场
我们还可以观察到消费者行为的同步变化,这似乎证实了这一假设。具体来说,我们可以看到,Opensea 的买家参与度(由 DAU/MAU 或每日独立买家数量除以每月独立买家数量定义)在 2021 年 3 月开始增加,大约在收藏数量开始增加的时候,并在 2021 年 7 月达到高达 12%。这几乎是竞争对手交易所的两倍,竞争对手都保持在不到 5%的水平。

NFT 交易所每月 MAU 毛指数-作者图片
在 Opensea 的买家保持率中也可以看到类似的趋势,即在上次购买后一个月内再次购买的买家比例。这一保留指标也在 3 月份左右开始上升,并在 7 月份达到了 65%。这也几乎是竞争对手交易所的两倍。

NFT 交易所每月 M1 留存率—图片由作者提供
当然,这些数据点本身并不能证明我在假设中提出的因果关系。它们只是与理论一致的相关性。为了证明这一假设,我们可能需要用产品路线图中的数据来补充交易数据,以了解每个交易所的功能和实施时间表,并对 NFT 的买家和创作者进行定性采访,以了解他们为什么选择 Opensea 而不是其他交易所。我们不会在这篇文章中继续探讨这个问题,但希望我们已经展示了一个例子,说明加密数据是如何成为分析分散式消费者应用程序的增长和发展的有力工具。
结束语
NFTs 一直处于疯狂状态,尽管有迹象显示从峰值开始放缓,但它仍在实现惊人的 GMV 水平。你当然可以提出一个可信的论点,即这是一个终将破裂的泡沫,但对 2021 年 2 月的最初拐点说这话的人肯定被证明是错误的,至少现在是这样。这个领域有大量的创造性能量,新项目一直在涌现。除了 CryptoPunks 等少数项目,GMV 的 NFT 顶级项目相对于 9 个月前已经完全改变。

与 9 个月前的 7 天相比,最近 7 天的 NFT 热门项目—图片由作者提供
很难预测任何一个项目是否会成功,更难预测更广泛的 NFT 生态系统会变成什么样,但凭借加密智能合同获得的数据透明度,我们可以在展览展开时获得前排座位。
希望这是一次有益的讨论,并很好地展示了加密数据的威力。在我的下一篇文章中,我将尝试用图形算法来探索前沿 NFT 交易。如果你想在帖子发布时得到通知,请务必点击电子邮件图标进行订阅。
如果您想了解更多关于我用来创建数据集的特定解码和转换逻辑的细节,和/或一份解码数据集的副本供您自己分析。请直接联系我。 推特 | 领英
[1]在以太坊之外,有相当多的其他 NFT 生态系统开始出现。最著名的是索拉纳 NFT 生态系统和集中交易所,如比特币基地和 FTX。我可能会在未来的分析中增加这些分析
[2]crypto 朋克是 10k 个 NFT 化身图像的单个集合。它在 NFT 社区中受到高度重视和追捧,因为它是第一个以太坊非功能区创建者之一。人们还普遍认为它帮助定义了 ERC721 标准,该标准是当今许多 NFTs 项目的支柱。
[5]集合是来自同一项目的一组 NFT。CryptoPunks 就是这样一个集合,它在自己的交易所进行交易。
[6]这是一个假设,也是我作为生态系统参与者的轶事观察
CTO 和 CDO 的数据梦
API 时代杀 Excel?

照片来自 unsplash 上的 Sharosh Rajasekher
毫无疑问,我们都曾在董事会评审会议中遇到过这种情况:一个部门引用特定 KPI 的级别,而另一个部门对同一 KPI 有不同的数字。
接下来的任何一种情况都可能发生:
——我们怎么会有如此不同的数字?
—您从哪里获得数据?
—让我们邀请我们的数据专家参加会议。
银行业对数据系统的一个古老梦想是“只”给所有跨部门的内置独立解决方案增加一层,最终实现全球集中式数据访问。
许多行业的大多数首席技术官、首席数据官甚至首席运营官仍然面临着同样的挑战。他们希望修改或删除一些遗留系统,并改变无效的数据管理行为,这两者都间接增加了数据源。传统减缓了他们心目中以数据为中心的战略。
在我从事银行业的日子里,我记得曾用 Excel/VBA 为我们的销售团队构建定价工具,让他们能够为复杂产品(如结构化产品)提供快速定价更新。大多数销售人员不仅不愿意认可定价有效性责任,而且他们在摆弄模板文件时还在编译错误,试图增强它们的功能。
目录:
1.真实的单一数据源或首席技术官和首席债务官的数据梦想。
2.企业真的想停止使用 Excel 数据吗?
3.“最优延迟”是 Excel 数据的真正杀手吗?
1.真实的单一数据源或首席技术官和首席债务官的数据梦想。

照片来自 Unsplash
很长一段时间以来,数据的价值已经不再受到质疑。“公司需要成为数据驱动型,否则就会灭亡”已经成为广为接受的说法。那些不把公司数据视为资产的人在未来几年很可能会面临麻烦。然而,在该领域,根据对数据不仅仅是副产品的信念程度,管理决策以接受这一现实因行业而异。
然而,雇佣数据专家并不能帮助公司在竞争中领先。应该花费时间和精力来构建更大图景的共同愿景并制定数据战略。
一个经典的目标应该是为全公司的 API 可消费数据奠定基础,而不仅仅是为了新潮的 AI 目标。为什么?主要是因为 API 将确保结构化和准确地访问您的数据。反过来,这将为你的数据培养一个单一的真实来源。首席技术官和首席债务官致力于高效地将数据作为组织/战略资产加以利用。他们有责任创造实现这一目标所必需的基础设施和文化。
为了说明这一点,让我们来看看一家公司的起源,创始人试图回答客户的一个痛点。构建最小可行产品是为了解决所述痛点。随着公司的发展,首席技术官寻找新方法来扩展解决方案功能的责任也在增加。我遇到了许多例子来证明我的上述观点,以及一些科技公司如何试图解决这个问题:
10-15 年前出现的金融科技初创公司
一旦他们的 MVP 得到验证,他们就需要拿出一个更强大的解决方案来应对大量的消费。他们突然面临一个昂贵的挑战,要想出他们产品的下一个版本,这是 100%专注于建立一个有效的顶点结构。
Challenger banks(或 neo banks)
他们决定从一开始就创造一种与真正的数据驱动核心战略相一致的技术,这样他们就不必在业务加速发展时推出新版本。一些人决定利用平台(银行即服务),另一些人只是提出了他们完全专注于 API 的新结构。
2.企业真的想停止使用 Excel 数据吗?

照片由 S ammy Williams 在 Unsplash 上拍摄
简而言之:不。他们明白使用 Excel 处理数据的好处。由于一些非常好的原因,Excel 仍然是最常用的数据管理工具,这主要归功于它的灵活性和易用性。
他们想要扼杀的是在公司不同角落独立完成的类似 Excel 的数据使用。他们想阻止聪明人基于原始数据提出新的分析方法,而这些原始数据并非来自单一的共同事实来源。当考虑数据遗留系统时,这成为一个真正的挑战。
简而言之,数据遗留系统是一种以非常不灵活的方式集中数据的基础设施。通常,这最初是为公司的一个特定领域而构建的。它不能满足整个公司对高效数据整合和消费的需求。这里是 Excel 文件从一端飞到另一端的地方,因为用户厌倦了在“过时”的系统上花费/浪费时间。在某种程度上,从 Excel 收集数据和处理模型变得更快、更准确。不可避免地,这将导致我在引言中描述的情况。
因此,一方面,你不希望降低创造力,但另一方面,你需要确保所有人都能轻松访问数据,而不仅仅是数据科学家或定量分析师。谁知道一个没有数据背景的业务同事会带来什么特性或功能呢?业务团队是面对市场现实的团队,能够提出非常好的想法来解决具体问题。
围绕你的数据的文化和习惯才是真正的目标。不要拍摄信使,因为他正在使用灵活的工具玩数据。工具只是支持这种数据驱动文化的载体。
采用完美的工具是一个挑战,因为每个公司都有其特殊性和遗留系统。首席技术官被宠坏了。然而,最终,他们应该根据自己的抱负选择最合适的工具。通常,他们会给遗留系统带来额外的灵活性,并可能在某个时候迁移到一个现代的成熟系统。
此外,不要忘记数据驱动文化的积极方面。这是吸引人才引领持续创新的关键驱动力。
3.“最优延迟”是 Excel 数据的真正杀手吗?

乔治·赫夫曼在 Unsplash 上的照片
随着 API 的兴起,公司可以轻松地访问实际上从公司外部生成的对其业务有意义的数据。他们越能消化这些海量数据,就越能为自己的业务做出明智的决策。因此,许多公司都成立了数据科学部门(或“数据中心”团队)。他们将有效地过滤和分析这些数据,以帮助管理层做出快速准确的决策。
一个月前,创造了著名的 Python 编程语言——根据堆栈溢出的说法,这是世界上最受欢迎的编程语言之一——的吉多·范·罗苏姆宣布,他目前正在寻求将 Python 语言的速度提高一倍。与 C ++或 Julia 等语言相比,提供快速计算的竞争非常激烈,此次发布旨在解决 Python 的一个主要弱点。
正如德勤(Deloitte)的报告《机器数据革命:喂养机器》中所详述的:“终端用户对遗留系统和数据模型经常带来的延迟越来越没有耐心。点击和期望响应之间的最佳延迟时间少于 50 毫秒——再长,用户就会对延迟感到恼火,并自己做出执行决策。
这种需求显然不是 Excel 很快就能交付的。但是您可以使用一些解决方案来跨越这个陷阱,并为您的 Excel 提供外部代码。看看如何通过 Python,R,Rust… 用 API 提升 Excel 数据管理,了解更多关于这个主题的信息。
谁说 CTO 或者 CDO 是个轻松的工作!?
感谢您的阅读!你可以在 LinkedIn 上和我联系。很乐意回答您的任何疑问。
路易斯·德沃林。



浙公网安备 33010602011771号