用于生成真实假数据的免费资源
了解如何为您的数据科学项目创建模拟和虚拟数据
沃尔坎·奥尔梅斯在 Unsplash 上拍摄的照片
我们都知道数据是必不可少的。问题是很多时候我们没有足够的钱。当我们开发数据应用程序或管道时,我们需要用类似于生产中可能看到的数据来测试它们。
很难手动创建足够数量和种类的真实数据集(例如,不同的数据类型、特征)。此外,手工创建的数据容易受到我们潜意识和系统性偏见的影响。
幸运的是,有免费的在线资源可以生成逼真的假数据供我们测试使用。让我们来看看其中的一些:
(1)Faker(2)Mockaroo(3)generated ATA
(1)造假者
术语“Faker”是模拟数据生成的同义词,因为有许多针对不同编程语言的 Faker 数据模拟库(例如, NodeJS , Ruby , PHP , Perl )。这里精选的 Faker 库是 Python 版本下的库。
Faker 是一个帮助你生成假数据的 Python 库。从文档中,我们可以看到,可以很容易地安装以下命令:pip install Faker
安装完成后,我们实例化一个 Faker 类对象并调用各种方法来生成我们想要的模拟数据类型:
来自 Faker GitHub Repo 的截屏图|根据 MIT 许可使用的图片
此外,Faker 有自己的pytest
插件,它提供了一个可以在测试中使用的faker
夹具。
链接
(2)摩卡鲁
Mockaroo 允许您根据您定义的规范,快速方便地下载大量随机生成的测试数据。
这个平台的奇妙之处在于不需要编程,您可以下载许多不同格式的文件(例如 SQL、XML、JSON、CSV)直接加载到您的测试环境中。注册后,您还可以创建并保存您的模式以备将来重用。
有了 Mockaroo,你可以设计自己的模拟 API并通过利用 Mockaroo docker 镜像将它们部署在你的私有云中。
Mockaroo 主页截图|图片经 Mockaroo 许可使用
链接
(3)生成数据
GenerateData 是一款免费的开源工具,可以让你快速生成大量的自定义数据。像 Mockaroo 一样,该网站提供了一个易于使用的界面(带有快速启动功能),用于创建各种格式的大量不同类型的数据。
在 GPL3 许可下使用的生成数据(V4) |图像的屏幕截图
在主网站上测试完演示之后,你还可以下载免费的、功能齐全的 GNU 许可版本。如果您需要的模拟数据超过了每次运行 100 行的最大值,那么 20 美元的小额捐款就可以让您一次生成并保存多达 5,000 条记录。
在撰写本文时,GenerateData (V4)的新版本接近测试版,所以请查看 GitHub repo 以获取更新。
链接
- 生成数据网站 (最新版本— v4)
- 生成数据网站 (旧版本— v3)
- 生成数据 GitHub
(4) JSON Schema Faker
JSON 文件格式是存储和传输数据对象最流行的方式之一。因此,生成假数据和定义数据结构的 JSON 模式将是有益的。
JSON 模式伪造者将 JSON 模式标准与假数据生成器结合起来,允许您生成符合模式的假数据。
该网站有一个用户界面供您定义模式。您可以选择并构建已经为您准备好的示例列表,而不是手动编写模式。
JSON Schema Faker 工具|在麻省理工学院许可下使用的图像截图
链接
(5) FakeStoreAPI
到目前为止,您应该已经遇到了相当多的通用(即 Loren Ipsum)类型的模拟数据。这就是 FakeStoreAPI 改变事情的地方。
它是一个免费的在线 REST API,用于为电子商务或购物用例创建伪真实数据,无需运行服务器端代码。模拟数据将与需要 JSON 格式的零售相关数据(例如,产品、购物车、用户、登录令牌)的项目高度相关。
只需几行 API 调用代码,就可以轻松创建或修改模拟数据:
截图来自 FakeStoreAPI 网站|图片经 FakeStoreAPI 许可使用
链接
- FakeStoreAPI 网站
- 【T42FakeStoreAPI GitHub**
(6)素甲鱼
Mock Turtle 是一个用户友好的基于 GUI 的平台,用户可以在 JSON 模式中生成假数据。
该工具模仿 JSON 树结构,您可以在每次点击时直接看到模式的变化。
除了 JSON 模式解析,它还允许免费生成嵌套结构和大型数据集。
截图来自素甲鱼网站|图片经素甲鱼许可使用
链接
知道其他优秀的模拟数据生成器吗?请在评论区告诉我。
在你走之前
*欢迎您来到**加入我的数据科学学习之旅!*点击此 Medium 页面,查看我的 GitHub ,了解更多精彩的数据科学内容。同时,享受生成假数据的乐趣吧!
* *
自由意志和人工智能(AGI)
关于人工智能的课程来自于关于我们大脑的课程。专注于自由意志的本质。
两年来,我一直试图通过冥想来训练我的大脑。对我来说,你能注意到大脑的实际工作方式不同于感知的工作方式的频率和容易程度是不寻常的。像在你的视野上叠加图像,注意到任意选择是如何做出的(它们出现了),甚至是自我想象的负面情绪的短暂性质都可以很容易地挑战我们的现状。
唤醒应用有一个新的系列,简洁地描述了自由意志的短暂感觉。毫不奇怪,我们如何看待我们通过自己的主观经验创造的人工智能。也就是说:我们通过我们如何思考和看待世界来看待人工智能。我们的思想和景象并不完全反映现实,当你冥想和检查现实的本质时,你可以观察到的差距就是我们决定是否要向我们的机器创造灌输的差距。
最终,大脑的本质使其感觉像是有人类的感觉,这可能是硬连线在代码中的,以确定它如何成为一个人工智能。一些感觉在代码中设置起来更直观,一些代表了人工智能研究中的开放问题。在硬币的另一面,我们可以让没有承载或期望的人工智能感受到我们作为人类时经常体验到的任何感觉。在这篇文章中,我将带你看一下《自由意志》在山姆·哈里斯的 90 分钟课程,重点是它对人工智能的意义。
- 第四节 1。原因&效果, 2。没有思想者的思想, 3。选择、理由、&知识和 4。爱&恨与创造智能计算机系统关系最大,所以我会在那里花更多的时间。
- 最后三课 5。罪名&刑罚, 6。责任的悖论和 *7。为什么做任何事?*根据这些心理结构,与伦理和功能社会的创建有更多的关系。这三个将不是关于创造人工智能,而是人工智能如何更好地融入这个社会。
在写这篇文章的时候,很多主题都提到了人工智能(AGI)和计算机意识。提出的观点是早期的探索,我怀疑随着我们了解更多,这些主题将被重新审视。
照片由来自 Pexels 的 nicollazzi xiong 拍摄。
预赛
我在这篇文章中频繁使用的一些术语可能有多种含义,但在这篇文章中,我认为它们是:
- 冥想:研究心灵本质的行为,通常通过安静地专注于意识的个别方面(比如呼吸)。
- 自由意志:主观感觉,你的决定、生理以及主要是你的自我感觉在某种程度上决定了你的行动。
- 人工智能:推理并与世界互动的智能体。
作为一个说明性的精神练习(冥想),让你对自由意志的幻觉有所了解,请密切关注这项随意的任务,以及你的大脑是如何得出结论的:在过去的一个月里,你读过的最喜欢的文章是什么?
(停下来仔细想想发生了什么)
现在,想想另一篇文章。
你能控制想到哪些文章吗?这种感觉是,随机的建议似乎是你当前状态的结果。这是一个明显的例子,说明我们没有自由意志,实际上,我们欺骗自己的幻觉是一种幻觉,即自由意志的幻觉根本就存在。我绝不期望你在做了这些之后认为你是一个自治的实体,这可能只是启发性的,让你想要进一步调查。
自由意志幻觉的核心幻觉和欺骗我们的人工智能
仔细研究心灵的本质,显示出我们对于经验的主观力量。存在的主观性是我们的联系,我们制造的机器主要反映了这一概念。就像上面的例子一样,我们大脑中的幻觉实际上是存在自由意志的幻觉——也就是说,当我们仔细检查正在发生的事情时,自由就消失了。
考虑这些状态和普通操作对于在回路中使用强大的人工智能进行规划是至关重要的。现在,我将从 Sam 身上学到一些东西,以及我们可以从中学到什么。
第一课。因果关系
考虑电话响铃的原因——一些数字信号被传输到扬声器(在此之前还有许多数字信号),电振荡产生声波。电话铃响的原因可以有不同的解释(在工程链上),人类的思维也存在同样的模糊性。不同之处在于:在人类的思维中,除了我们自己,我们不会真正考虑其他可能的原因。最终,人类大脑中的启动(一组神经元对刺激做出反应)和代码中的中断触发动作几乎没有区别。在对人脑的认识上,我们受到神经科学的限制,而在计算机上,我们已经消除了大部分捏造的不确定性。对一个系统的基本科学理解的差异并不排除不确定性在高层次上表现相同。
对人工智能的影响:改变软件中因果的概念
对于人工智能来说,接受事件的原因实际上会更容易——我们希望我们的代理人根据他们拥有的信息采取行动(除非我们添加更多抽象的幻觉)。 我们可以很容易地连线一个 AI,让它察觉到许多事件都是它自己造成的 。这将通过用外部程序更新它的先验(任何信念的分布)来完成,但是让计算机认为这是它自己的成果。
第二课。没有思考者的思考
我们有两种行动和精神调查的模式,自愿的和非自愿的——只有前者(自愿的)表示思想。如果你重新考虑预备课程中提出的关于选择的冥想练习,很容易证明认同思想不是自由意志。认同思想与其说是控制,不如说是注意(这是许多冥想练习的第一课之一)。短语没有思考者的思考指的是我们都经历过许多想法,但仔细观察,我们的意识中没有一个思考者(以思考者的形式,对出现的大部分信息做出反应和策划)。
对人工智能的影响:人工数据流的分级人工智能
我们可以让机器人真正以其思想真正与思考者相关联的方式行动,但我认为这混淆了直接计算的好处(在一些研究好奇心中)的功效。一个具体的组织可以是一个具有计算结构的人工智能,因此似乎有两个计算级别:一个是控制,一个是信息进展的环境——有点像一个具有独立多模态数据处理单元的 RL 循环(在这一点上,我很明显,我们没有术语来讨论这些东西看起来会是什么样子)。这种结构可以反映人类对思想者和意识的感知。
第三课。选择、理性和知识
没有自由意志,推理行为和知识的实质就会受到质疑。运气似乎是对随机性的心理反应,而不是真正的属性。据我所知,对目标的推理是一种自我价值的更新,而不是一种选择。最终的决定不会直接在你的控制之下。本质上,有些违背直觉,缺乏自由使得推理成为可能。这个世界反对自由选择,因为它们可能是错误的(就科学等法律而言)并会受到惩罚。真正的自由是认识到你不能控制先前认同的经验。
对人工智能的影响:操纵计算机与随机性的关系
人工智能可以对运气(随机性和不确定性)以及它如何与其智力结构相结合有不同的理解。这种更直接的人工智能方法利用了计算的优势,但如果我们寻求创造意识,拥有将命运与随机性联系在一起的人工智能可以提供强大的自我来源。就像自我意识一样,在我们目前如何看待人工智能的问题上,知识的表述似乎不是很实用,这让我认为这可能是最大的改进机会之一。
第四课。爱与恨
我们如何体验不同类型的情感,以及为什么体验不同类型的情感,这种二分法是人类魅力的一部分。很难描述发生了什么,但我们都感觉到了。爱是一种不可思议的感觉,它看起来像是偶然发现的,而仇恨则让人难以置信地专注。爱是对人或事物的一种感觉(而不是他们如何做决定),而仇恨是非常具体的自由意志和行动判断(认为他们应该采取不同的行动)。自由意志的争论从这里开始引入伦理讨论,考虑这样的场景,比如原谅那些被证明犯下滔天罪行的人,部分原因是退化的生物学,比如脑瘤。
对人工智能的影响:更容易制造爱计算机
乍一看,很难制造出同样仇恨的人工智能。人工智能可以被制造成想要优化,但是真正的仇恨代表了一种复杂的“如果”( what if)思维结构。让我们为爱机器人的人敞开大门吧——当机器人完美地完成任务,成为更大系统的一部分时,我们就会爱上它。这两者都有将人类价值提取为数字近似值的复杂问题,但经过这次分析,我比我最初想象的更加乐观。
photo bycotton brofromPexels。
幻想、设计、陷阱
机器学习研究人员已经通过研究大脑的结构学到了很多东西。基于头脑的感知本性来设计系统要复杂得多,但我认为这能让我们更深刻地理解感觉聪明意味着什么。很可能我们设计的变得普遍智能的人工智能将而不是具有反映人类大脑的精神行为(注意:这取决于 AGI 研究如何进行,全脑仿真是研究的一个选项,但这需要神经科学的巨大进步,所以有些人持怀疑态度)。
我工作过的所有学习系统都形成了智能,作为探索和近似的迭代计算设备。对我来说,现在还不可能考虑体验这样一个系统的世界会是什么样子。
清楚地理解给予人工智能的计算、引用和开发的本质对于减轻任何潜在的危害是至关重要的。我会说,我们希望让我们的人工智能在上面讨论的大多数轴上明显非人类(人性往往意味着矛盾和不确定性,但也创造了爱的能力),以便明确量化这些试剂的潜在有害影响。
我非常感兴趣的是,我们可以从我们的存在本质中学到什么,以及它如何影响我们构建的系统。在我的第一篇关于基于模型的强化学习的文章中,我讨论了它与大脑结构和心理规划的内在联系。如果你认为我错过了什么或者想讨论这个,请留下评论或者联系我。将来我可能会更详细地探索冥想和计算机智能之间的联系。这有点像我们如何创造一个自由意志机器人的建议可能会导致意识仿真。
现在谈谈自由意志课程的其余部分。
来源——作者(普莱西德湖)。
幻觉的含义
我们的社会实际上是在个人拥有自由意志的假设下构建的。当有更多的人工智能明显缺乏自由意志时,看看它们是否被永久地视为与人类不同的独立实体类型将是有趣的(至少在减轻风险方面,法律先例很难远离自由意志的概念)。人工智能可以潜在地教会我们一些事情,比如减少对通过生物机会危害社会的人的惩罚,而是消除危险。在经历了互联网的黄金时代后,我将关注的下一波浪潮是与人工智能的互动如何重构我们社会的习惯、文化和法律。
第五课。犯罪与惩罚
如果一个人在森林里被一只熊和一个人攻击,责备的反应会非常不同。会因为自由意志而更加憎恨那个男人。这种直觉相当于我们对有计划的惩罚的反应——那些有自由意志幻觉的人应该有更多的控制权。我们能学到的是消除社会保护彼此免于个人错误指责的责任的歧义,尤其是当我们知道生物结构的失败会导致人类的行为时。
注:有趣的是,律师在中世纪曾代表动物!老鼠因为吃猫可以上法庭,陪审团被告知老鼠太忙无法出席( 例 , 例 2 )!
第六课。责任的悖论
从自由意志的角度来看,真正的随机会支持个人控制。跟随你的道路的行动不那么自由;我们更偏向。对于一个职业高尔夫球手来说,错过一次推杆更令人震惊,因为他们的线路肯定出了什么问题——但有一个原因是可以辨别的。理论上,打高尔夫球的人应该承担更少的责任,因为它看起来更随机。
现在,计算机计算似乎与神经计算完全不同,但是随着大脑模型的改进,同样程度的决定论也很容易被观察到。大脑中事实的主观性(人类偏见)允许自由意志的主观性,但原因不会改变预先设置的神经组成。没有科学证据反驳我们在相同的神经状态和环境下会做出不同的决定;我们生命中的每一刻都是 起因 。
如果人们不那么负责任,如果这种邪恶的疗法是有疗效的,那我们把它给谁呢?有没有我们认为“太邪恶”而无法治愈的人?
第七课。为什么做任何事?
结论回答了这个问题:如果我们没有自由意志,我为什么要做任何事情?没有自由意志,我们意识到我们是环境和我们相处的人的产物。没有自由意志,我们就是集体的一部分——一个共同更新每个人的集体。这一群人可以将社会最佳利益与过失分开,并可以驱散骄傲和羞耻的观念(通过意识到它们是有意识的构造)。更新是我们大脑和我们经验的生物学先验。
机器人是集体的一部分
仍然做任何事情的原因是因为你的行为创造了你周围的人。这成为了一个富有同情心的反馈循环,你让你周围的人变得有能力,他们也让你变得有能力。关键是,我们是集体的一部分,没有自由意志,许多是的负面因素就不存在。
通过探索这一点,我觉得人工智能可能比个人更符合集体观念。如果这是真的,这将是数字世界的一股有趣的力量。
如果你想支持这个:赞,评论,或者伸手!
像这样?原来是贴在我的 简讯 民主化自动化 上的。订阅❤.
自由数据科学家?彻底忘掉“2021 年学习指南”
学习新的库还是最终做客户想要的?
独立专家的战略和战术
插图来自上卷
远程工作是当今的一种新常态。离开办公室的头几个月相当有趣,但那份工作还是那份工作:依赖固定的薪水/时薪,有限的机会,失去温暖工作的风险。我们很多人都尝试过单干,在网上寻找客户,学习新的热门技能。然而,你可能会注意到,你好不容易征服的新客户不会为 Udemy 证书和 Tensorflow 技能付钱——他们只想要尽可能便宜的两周内 99%准确的解决方案。别忘了还有那个时间追踪"。因此,对你来说——更多的压力,更少的钱,更少的满足感 来自所谓的独立、创造性和鼓舞人心的工作。在这篇文章中,我想总结一下我在维罗纳大学会议上详细谈到的实用见解,它将帮助你建立一个独立的专家职业生涯。另外,我邀请你参加下周的俱乐部聊天,我们可以一起更详细地讨论我们的经历,并互相帮助:
https://www.joinclubhouse.com/event/Md0N42wq
客户真正想从你这里得到什么
商业的建立是为了满足多种目标:创收、社会和环境影响、关系(用美元衡量)、创造就业机会、空气质量等。为了最大限度地提高上述数字,创始人和经理们创建了这样一种结构,在这种结构中,每个人都有自己的位置来完成合格的工作。作为一名员工,你产生了这个结果的一部分(在我们的例子中是技术),但有时结构并没有像预期的那样做。
作为一名独立专家,你不会与工资单上符合该职能的受雇数据科学家竞争。那你为什么一直做和他们一样的事?
这就是使用外部帮助的地方,提供资金、关系、专业知识或任何其他资源来实现结果。在这里,你作为独立专家可以介入提高数字,因为系统不能。而一个体制内的被雇佣者和独立专家的区别在于工作的侧重点:两者都可以写代码,但是第一个向直接经理汇报通过 CI/CD 测试,18:00 离职,第二个向所有者汇报收入的增长,并对其负责。你想成为哪一个?你现在在做什么?
改变你的心态
图片来自http://think apps . com/blog/post-launch/how-start-startup-competition-losers/
听起来很吓人,对吧?如果你只是一个技术专家,你如何承诺业务增长?有三种典型的心理障碍会导致你和客户都不满意的结果:
- “我不够好”。如果你用 FAANG 的标准来比较自己,他们有从 1 到 10 的等级——也许吧。但是,只有当你的目标是有一份稳定的工资单,并且是系统中的一个功能时,这才重要。从技术角度来看,你实际上可以为 4/10 的客户提供更多价值,但与拥有 10/10 的技术技能、4/10 的业务知识和 4/10 的独特性的人相比,你了解 10/10 的客户业务并拥有 10/10 的独特价值主张。
插图来自https://libraryofconcepts . WordPress . com/2017/10/29/当今人类发展的三个最相关阶段-kegan-13/ 。雇员通常坐在“社会化思维”的队列中,自雇者是“自我创作”,企业家是“自我改造”。这个例子显示了思维上的差异:雇员希望符合群体规范,个体户希望与众不同,企业家了解他们所有人并把他们联系起来
- “不敢多问”。忘掉金钱谈判中的情绪——这完全是关于投资回报的。如果你能在一个月内为你的客户赚到 100,000 美元,对客户来说要价 20,000 美元是一笔划算的交易:5 倍的投资!谁在乎在你的国家一个数据科学家的月薪是 3000 美元——他们满足于做一个功能,你决定提供结果!
来自https://www.consultingsuccess.com/consulting-fees的插图显示,当然还有其他更经典的顾问收费财务模型,但我强烈建议你成为“基于价值和投资回报率”的那一组。这是顶级的!
- “我会失去我现在所拥有的”。最常见也是最不相关的拦截器。如果你在做你喜欢的事情,并且做得很好,你可以每周工作 10-20 小时来取得成果。没有必要为了成为独立专家而辞职。法律上这也是不被禁止的(但是检查你的合同和当地法律)。你有晚上和周末的时间和新客户一起工作,之后,你可以决定哪种生活方式更适合你和你最亲近的人。
你是否已经看到你需要关注什么了?是网上全新的 ML 课程还是别的?让我知道:)
改变你的战略和战术
满足于你擅长的事情
有不同的技巧可以帮助你理解自己独特的竞争优势(通常被无耻地宣传为有目的的探索):
来自https://zek luu . com/en/self-development-iki Gai-El-sentido-de-la-vida/的插图显示,为了避免竞争并建立一个独特的、独立于其他技能和业务的平台,你需要在你的才能(你所热爱的)、你所训练的技能、经济价值和世界的要求的交叉点上努力
简而言之,你应该利用你的才能(而不是社会教条行为)在一个高薪且有影响力的专业领域使用你擅长的技能**(再次强调,而不是被认为很酷的东西**(而不是在别人告诉你的地方工作)。关于这个话题,我写了一整篇文章,请大家看看:
https://medium.com/@alexrachnog/from-developer-to-entrepreneur-what-is-your-way-up-497fd5512b9c
利用你的网络
这仍然是获得好客户的最简单的方法,几乎没有人使用这种方法,因为“这很酷”,而不是与你已经认识的人建立关系。你的家人、学校和大学的同学、老师、同事和老板、邻居和熟人——他们都认识认识其他人的人。开始对他们的生活感兴趣,帮助他们,告诉他们你的新的独特主张。如果你做的事情明显是你(为他人)擅长的,并且是受欢迎的和有影响力的领域,你会更快地得到你的项目,并且会和欣赏它并信任你的人一起做完全适合你的事情。
公开展示你的专业技能
我知道你的关系网可能是有限的,或者不包括你想工作的地区的人。怎么去?**开始对网上陌生人有用!**正如我们所商定的,你在人才、技能和业务领域的独特交汇处工作,因此开始帮助他人回答专业社区中的问题,参与讨论和在线会议,分析行业新闻,展示见解和案例研究。Hubspot 的销售之王也同意这一点(查看“权威消息”):
https://blog.hubspot.com/marketing/using-content-marketing-professional-services
在媒体上积极主动(选择你喜欢的一个),你的网络会爆炸。
衡量你自己和你的努力
作为一名数据科学家,你明白,如果你根据垃圾数据进行建模和决策,结果将会是这样。衡量你的财务(甚至用 Excel),你的工作努力(用 Toggle 之类的东西),你的内容的参与度,作为一个最小的活动集。我建议将客观的关键结果作为设定目标和衡量后续进展的方法:
https://rework.withgoogle.com/guides/set-goals-with-okrs/steps/introduction/
现在你是一家单人企业,所以你集所有关键“角色”于一身:首席执行官、首席财务官、首席技术官、CMO。你在这些方向上所做的一切都必须被定期跟踪和反思,以便改进。
承担责任并寻求反馈
现在我们开始讨论你需要学习什么,而不是技术指南。问问你的客户哪些事情进展顺利,哪些事情不太规律,并专注于此!你的成功将只取决于你所帮助的人的满意度,这通常表现为节省或赢得的时间、金钱、健康、信息、关系和机会。对这些结果负责并关注它们,而不是你写的代码,你会发现你真正需要学习的包括:
- 业务模式和流程:因为你需要衡量你对客户业务的影响
- 销售和营销:因为你需要推销你独特的专业知识
- 沟通与谈判:因为你需要了解你的客户,建立双赢的关系
稍后,你会意识到所有的编码部分都可以由其他人来完成,这些人实际上只专注于此并彻底地阅读每一篇“202x 数据科学指南”,但这是另一篇博文的故事:)
结论
事实上,我这里有一个稍微长一点的演示,包含了一点更广泛的经济学和社会学观点,但是它的要点你已经在这篇文章中读到了:
我希望这篇文章可以向您展示,对于独立/自由职业的数据科学专家来说,技术技能、热门课程和书籍是很好的选择,但对于希望在公司内部建立职业生涯的人来说,这些并不重要。你可以用线性回归做更多的影响,知道在哪里应用它,而不是做非常复杂的事情,最终可能被遗忘。你可以选择自己的生活方式和人际关系。
我想再次提醒你下周俱乐部会所的谈话。我们人不多,团结互助吧:)
https://www.joinclubhouse.com/event/Md0N42wq
附言
如果你觉得这个内容有用,有观点,可以在 Bitclout 上支持我。你也可以在脸书博客或 LinkedIn 上与我联系,在那里我会定期发布一些对媒体来说太短的人工智能文章或新闻,并在 Instagram 上发布一些更私人的内容。如果你期待成为一名人工智能企业家并解决具有挑战性的问题,ping 神经元实验室,我们正在与顶级人工智能自由职业者合作:)
自由职业、自学和明智选择项目的重要性
作者聚焦
数据科学是不是该“分手”了?
在 Author Spotlight 系列中,TDS 编辑与我们社区的成员谈论他们在数据科学领域的职业道路、他们的写作以及他们的灵感来源。今天,我们很高兴与 Kurtis Pykes 进行对话。
照片由 Kurtis Pykes 提供
Kurtis 是一名前邮递员转行的博客写手和数据科学家,对自然语言处理(NLP)有浓厚的兴趣。他目前是 Upwork 的自由职业者,涵盖从技术写作到各种 NLP 任务的项目。Kurtis 是一位多产的 TDS 贡献者,热衷于利用机器学习和数据科学的力量来帮助人们变得更有生产力和效率。
是什么让你考虑将数据科学作为职业?
我是一名邮递员。我讨厌我的工作,但我不得不做它来资助我读完大学。每当我在岗位上走动时,我都会听一些我崇拜的人的采访。有一天,我碰巧在听比尔·盖茨的采访,听众中有人问他,如果他没有创建微软,他会做什么。他回答说“我会用自然语言数据来测试极限”,他会成为一名人工智能研究员。请注意,这是我第一次听说这些事情,所以我回去做了一些研究。
浏览了一段时间后,我总结道:“是的,不适合我。不够聪明。”然后,大约一个星期后,我的雇主告诉我,我是“多余的要求。”既然是代理工作,就意味着立即生效。我很沮丧,我就这样被解雇了。我对自己发誓要获得一项不需要体力劳动的技能,这样我就能经得起未来的考验。当时唯一能想到的就是比尔盖茨访谈,于是买了几本书开始学习。剩下的就是历史了。
自学和从零开始建立职业道路听起来令人生畏!一路走来,你学到的最重要的一课是什么?
在休假了大约六个月后,我决定做一些公益工作,为我的简历积累一些经验,以应对最糟糕的情况——被裁员。与此同时,我知道请求我服务的人正在招聘,但预算有限,所以我想如果我给他们留下深刻印象,我就有可能确保我的未来。
当我接到任务时,我不明白目标是什么,但我真的想展示我有一点点聪明。史上最糟糕的选择。进展不顺利。一个月后,给我这份工作的人建议我去学校接受更多的教育——这是这么长时间以来我的自尊心受到的最大伤害。作为回应,我开始在独立项目上严格工作,特别是在一个类似于我在公司被设定的任务的项目上。
我向任何想进入数据相关领域的人提出这个建议,确保你做的是项目。现在,作为一名自由职业者,我尽我所能去了解客户的确切目标是什么,他们希望如何实现这些目标,以及他们希望的时间框架。我不会留下任何怀疑的余地。
一旦你进入了新的工作领域,是什么激励你开始为广大读者写这方面的文章?
我的第一份技术工作的直线经理建议我写下我所学到的一切,因为这有助于我理清思路。我听从了他的建议,尝试了一下。起初保持一致非常困难,但后来我开始看到一些进步。人们在 LinkedIn 上联系我,告诉我他们多么感谢我的文章。那种感觉——知道我在帮助别人——真的引起了我的共鸣,所以从那时起,我决定为我正在做的工作承担更多的责任。我相信这是博客最棒的部分。
你经常写的话题之一是作为数据科学自由职业者的生活。你是如何成为其中一员的,你最喜欢它的什么?
自由职业对我来说是偶然发生的。我从来没有打算成为一名自由职业者,但自从这件事发生后,我觉得自己好像更加享受生活了。我是那些被规章制度束缚时感到窒息的人之一,当你从事全职工作时,这种情况有时会发生。因此,作为成为自由职业者的结果,我能够享受的自由对我来说是非常令人耳目一新的——我更喜欢这样的想法:“我不必做这件事,但我会做,因为我想做。”
如果有人在考虑做自由职业者,我建议你做好准备,维持至少六个月的生活(当然,如果你像我一样陷入困境,那么你真的别无选择)。此外,一定要确保你的营销方式能吸引你想要的客户,否则你会得到一堆随机的工作建议。例如,当我第一次创业时,我收到了很多创业公司的技术写作职位的邀请,而我脑海中一直浮现的都是,“Hellooo!我其实也是一名数据科学家。”
我意识到我并没有真正向人们展示我的技术能力或者我是如何解决特定任务的。现在我已经开始多做一点了,慢慢地但肯定地,潮流开始转变了。
从你的角度来看,你希望在数据科学社区看到什么变化?
我很乐意看到社区里更多的人专攻。数据科学中有太多需要学习的东西,对于一个试图进行职业转型的新人来说,这可能会让人不知所措。如果你决定专攻某一领域,还有很多东西要学,但不同的是你可以有一个固定的焦点,这将使技能的获得成为一个更加无缝的过程。
更广泛、更有结构性的发展呢?
听起来很疯狂,我希望看到数据科学被打破。术语“数据科学”涵盖了广泛的任务,因此特定公司对一个角色的要求不一定会转化为另一个。这使得从业者的工作转变更加困难。我相信在数据科学的保护伞下拥有预定义的任务将会产生具有更合理要求的工作规范。
想了解更多关于 Kurtis 的工作和数据科学的兴趣吗?你可以在 NLP、自由职业者网站上找到他的文章,以及更多关于和他的媒体简介的文章。以下是我们最近最喜欢的一些。
- 为什么我停止申请数据科学工作 ( TDS ,2021 年 4 月)
Kurtis 的最新病毒式帖子详细介绍了他成为自由职业者的道路,特别是关于建立投资组合和声誉,以健康的速度产生入站查询。 - 作为一名远程数据科学家蒸蒸日上 ( TDS ,2020 年 12 月)
即使疫情已经在我们身后(但愿有一天!),远程工作是要留在这里的,最好是越早越好。 - 如何撰写 Upwork 求职信,赢得合同 ( 数据驱动投资者,2021 年 2 月)
像 Upwork 这样的自由职业者平台竞争非常激烈,因此优化你个人资料的每个细节至关重要——在这篇文章中,Kurtis 将重点放在永远重要的求职信上。 - 克服数据科学骗子综合症的 5 种方法 ( TDS ,2020 年 11 月)
无论教育水平或工作经验如何,数据科学作为一个领域的广阔性意味着掌握其中的任何领域都是一项重大事业,并可能导致信心的丧失。在这篇文章中,Kurtis 分享了他作为一名自学成才的数据科学家所学到的经验。
请继续关注我们的下一位特色作者,即将推出!如果你对你想在这个空间看到的人有建议,请在评论中给我们留言!
频繁模式挖掘、关联和相关性
利用 Apriori 算法识别数据集的频繁模式并通过 Weka 软件关联数据集
马文·迈耶在 Unsplash 上的照片
在数据挖掘中,频繁模式挖掘是一个主要关注点,因为它在关联和相关性中起着重要作用。首先要知道什么是频繁模式?
频繁模式是在数据集中频繁出现的模式。通过识别频繁模式,我们可以一起观察强相关的项目,并容易地识别它们之间的相似特征和关联。通过进行频繁的模式挖掘,它导致进一步的分析,如聚类、分类和其他数据挖掘任务。
在开始挖掘频繁模式之前,我们应该关注“支持度”和“置信度”这两个术语,因为它们可以提供一种衡量关联规则对于特定数据集是否合格的方法。
支持:给定规则在被挖掘的数据库中出现的频率
置信度:给定规则在实践中被证明为真的次数
让我们通过一个样本数据集来练习一下;
作者图片
支持计算-按作者分类的图像
可信度计算-按作者排序的图像
示例:一个可能的关联规则是 A => D
交易总数(N) = 5
Frequency(A,D)= > A 和 D 的实例总数为 3
频率(A)= > A 中出现的总次数
支持= 3 / 5
信心= 3 / 4
在对支持度和置信度这两个术语有了清晰的概念之后,我们可以转向频繁模式挖掘。频繁模式挖掘,有两类要考虑,
- 利用候选生成挖掘频繁模式
- 无候选生成的频繁模式挖掘
本文主要研究利用关联挖掘中常用的 Apriori 算法挖掘频繁模式并生成候选模式。让我们用一个例子来理解 Apriori 算法,它将帮助你清楚地理解它背后的概念。让我们考虑上面提到的样本数据集,假设最小支持度=2 。
- 生成候选集 1,进行第一次扫描,生成一个项目集
在这一阶段,我们获得样本数据集,并对每个个体进行计数,得到频繁项集 1(K = 1)。
候选集 1
“候选集 1”图显示了单个项目的支持计数。因此,最小支持度是 2,并且基于此,项目 E 将作为不频繁项目(不合格)从候选集合 1 中移除。
第一次扫描的频繁项目集
基于最小支持值的频繁项集将在图“第一次扫描的频繁项集”下显示为“一项集”。
2。生成候选集 2,进行第二次扫描并生成第二个项目集
通过这一步,您创建了频繁集 2 (K =2 ),并获得了它们的每个支持计数。
候选集 2
“候选集 2”图形通过连接候选集 1 生成,并取相关出现的频率。因此最小支持度是 2,项目集 B,D 将作为非频繁项目集从候选集 2 中移除。
第二次扫描的频繁项目集
“第二次扫描的频繁项目集”是基于最小支持值的频繁项目集,它将生成“第二个项目集”。
3。生成候选集 3,进行第三次扫描并生成第三个项目集
在这个迭代中,创建频繁集 3 (K = 3)并计算支持度。然后与来自候选集合 3 的最小支持值进行比较。
候选集 3
如您所见,我们将候选集 3 与生成的第三个项目集的最小支持值进行了比较。第三次扫描的频繁集与上述相同。
4。生成候选集 4,进行第四次扫描并生成第四个项目集
通过考虑频繁集,我们可以通过连接候选集 3 来生成候选集 4。那么可能的候选集合 4 是;最小支持度小于 2 的[A,B,C,D]。因此我们必须从这里停止计算,因为我们不能再进行迭代了。因此,对于上述数据集,频繁模式是**【A,B,C】和【A,C,D】**。
通过考虑频繁集之一为{A,B,C}和如下可能的关联规则;
- A => B,C
- a,B => C
- a,C => B
- B => A,C
- b,C => A
- C => A,B
然后我们假设最小置信度= 50%,并计算每个可能关联规则的置信度,然后我们可以识别最小置信度小于 50%的不合格关联规则。那么剩下的置信度大于或等于 50%的关联规则就是合格规则。
作者图片
正如你在 Apriori 算法中看到的,每一步它都在生成候选项,当候选项列表变大时,它会花费很多时间。
下面是 Apriori 算法的伪代码;
图片来自关于用于优化数据挖掘过程的算法的研究问题 (2010)
现在让我们关注如何使用 Weka 进行关联。您可以遵循以下步骤。
- 打开 Weka 软件,点击“探索”按钮。
Weka 初始图形用户界面—作者图片
点击“浏览器”按钮后,你会看到一个名为“Weka 浏览器”的新窗口。
Weka Explorer —作者图片
2.打开首选数据集
Weka Explorer > Preprocess > Open File
按照上面的顺序,您可以通过选择一个内置数据集或任何想要应用于 Apriori 算法的数据集来加载数据集。
打开选定的文件后,您可以在预处理选项卡下看到属性和其他统计信息。然后,您可以单击“编辑”按钮,在查看器中打开当前数据集进行编辑。
预处理选项卡中的编辑按钮—按作者排序的图像
需要注意的是,您的数据集包括数值数据,您可以使用“预处理”选项卡下名为“离散化”的过滤器将其离散化
3.转到“关联”选项卡,使用“选择”按钮选择“先验”。
选择 Apriori 算法—作者图片
4.左键点击先验并选择“显示属性”
显示属性-按作者显示图像
5.自定义算法属性,然后点击“保存”
配置算法属性-按作者排列的图像
例如,在关联完成后,我们可以更改您从数据集中获得的规则数量。
6.点击“开始”按钮
作者图片
T4:请注意,如果没有选择进行关联的离散数据,则不能启用“开始”按钮,这一点很重要
7.观察结果
Associator 输出如下,在这种情况下,算法已经为所提供的数据集找到了 10 个最佳规则。
应用关联后的最终结果—图片由作者提供
结论
这篇文章提供了一些你可能知道的关于频繁模式挖掘、Apriori 算法、支持度、置信度以及如何通过 Weka 软件进行关联的事实。希望这篇文章能帮助你提高对上述几点的认识。
感谢您的阅读🤗!!!!!
参考
[1]扬·伦古,亚历山大·皮尔詹,关于用于优化数据挖掘过程的算法的研究问题 (2010)
Frequentist A/B 测试说明
本文将解释 A/B 测试的 frequentist 方法,并提供一个何时以及如何使用它的示例代码
A/B 测试通常用于所有行业,以在业务的不同方面做出决策。从撰写电子邮件,到选择登录页面,实施特定的功能设计,A/B 测试可用于根据统计分析做出最佳决策。本文将涵盖 A/B 测试的 frequentist 方法的基础,并概述如何通过 A/B 测试得出决策的示例。我还将为一个特定的示例提供代码的相关 Python 实现。
目录
- 什么是 A/B 测试
- 频率主义方法
-零&替代假设
-样本均值估计
-置信区间
-检验统计量- P 值
- 例子
- 结束语
- 资源
什么是 A/B 测试
推断统计学通常用于根据对总体样本的观察来推断总体的某些情况。A/B 测试是推理统计学在研究用户体验中的应用。它由 A 和 B 两个变量的随机实验组成[1]。一般来说,通过测试每个变体的用户响应,可以找到统计证据证明一个变体比另一个更好,或者你可以得出结论,选择 1 而不是另一个没有统计学意义。一个公司必须进行 A/B 测试的常见应用将是做出决定来提高他们的用户的转化率,提高他们的产品的适销性,增加他们的日常活跃用户,等等。
频繁主义方法
这是更传统的统计推断方法,通常在大学的基础统计学课程中介绍。这种方法的简单概述可以是以下方式。
- 确定无效假设和替代假设
- 无效假设:指定人群之间没有显著差异,任何观察到的差异都是由于采样或实验误差造成的。
- 替代假设:与原假设相反的假设
- 计算样本量以达到统计显著性(通常为 95%)
- 计算测试统计数据,并将其映射到 p 值
- 根据 p 值是否小于/大于 p 临界值,接受或拒绝零假设
无效&替代假设
确定要测试的假设通常是通过你给定问题的领域知识。零假设通常是关于被认为是真实的总体的陈述。替代假设是与原假设相反的陈述。一个简单的例子可以概括在下面的场景中;你想通过增加一个独特的功能来提高用户访问你网站的转化率。无效假设是,在网站上添加这一独特的功能不会对转化率产生影响。另一个假设是,添加这个新功能会影响转化率。
样本均值估计值
一组观察值的样本均值估计实质上是总体均值的估计[2]。它可以用下面的公式表示:
其中 N 代表样本中的项目总数,xi 代表事件发生的次数(图片由西瓦·加比【3】提供)
在理想情况下,我们希望方差(A 和 B)的样本均值估计值之间的差值较高。两者之间的差异越大,表明测试统计数据之间的差距越大,这意味着变量之间会有明显的赢家。
置信区间
置信区间是这样定义的值的范围,使得参数值有一个特定的概率位于其中。它可以用下面的公式来概括:
u 代表样本均值估计值,t 是置信水平值,sigma 是样本标准差,N 是样本大小(图片由 Siva Gabbi 提供【3】)
测试统计
检验统计量是正态分布上的一个点值,它显示了检验统计量与平均值的差距(以标准偏差的数量表示)。基于样本大小和其他因素,有各种各样的检验统计公式。下图中可以看到该公式的一些变体。
图片来自克里斯塔·金【6】
根据测试统计产生的值,可以将测试统计映射到 p 值,并根据 p 值是高于还是低于 p 临界值来接受或拒绝假设。
P 值
在统计学中,p-值是零假设(被测试的理论是错误的)给出的特定实验结果发生的概率。p——值也叫概率值。如果p-值很低,零假设不太可能,并且该实验作为不同理论的证据具有统计学意义[4]。在许多领域,一个实验必须有一个小于 0.05 的p-值,才能被认为是替代假设的证据。简而言之,低 p 值意味着零假设为假的可能性更大。如上所述,一旦确定了 p 值,解释结果就相当简单了。
例子
一家大型银行的抵押贷款部门对首次借款者的贷款性质感兴趣。这些信息将用于定制他们的营销策略[5]。他们认为,50%的首次借款人会比其他借款人获得更少的贷款。他们进行假设检验,以确定该百分比是否与 50%相同或不同。他们对 100 名首次借款人进行了抽样调查,发现其中 53 笔贷款的规模小于其他借款人。对于假设检验,他们选择 5%的显著性水平。
零假设 : p = 0.5
备选假设 : p!= 0.5
这将作为双尾测试运行。
假设我们的显著性水平是 5%,并且这是一个双尾检验,我们的置信区间将是 1–0.05/2 = 0.975。通过运行上面的代码,您将得到 p 临界值 1.96
根据上面的代码,我们注意到测试统计量是 0.6。这仅仅是零的标准正态分布的平均值。就标准差而言,样本比例和假设比例实际上没有区别。
检验统计量在临界值内,因此我们不能拒绝零假设。这意味着,在 95%的显著性水平上,我们不能拒绝零假设,即 50%的首次借款人拥有与其他借款人相同规模的贷款
结束语
总之,A/B 测试的频率主义方法用于根据结果的统计显著性做出有利于两个变量 A 或 B 之一的决定。这是通过识别与测试相关的无效和替代假设、识别样本大小和计算某个置信区间的测试统计来完成的。一旦获得了检验统计量,我们就可以确定 P 值,并得出我们是接受还是拒绝零假设的结论。
资源
- [1]https://en.wikipedia.org/wiki/A/B_testing
- [2]http://www . stat . Yale . edu/Courses/1997-98/101/samp Mn . htm #:~:text = The % 20 sample %20mean%20 from % 20a,estimate % 20of % 20the %人口% 20 mean % 20。&text = For % 20 example % 2C % 20 假设%20the%20random,(70%2C5))。.)
- [3]https://www . dynamic field . com/lesson/frequentists-approach-to-ab-testing/
- [4]https://simple.wikipedia.org/wiki/P-value
- [5]https://opentextbc . ca/introbusinessstatopenstax/chapter/full-hypothesis-test-examples/
- [6]https://www . kristakingmath . com/blog/test-statistics-for-means-and-proportions
如果你喜欢读这篇文章,下面是我写的一些你可能也会喜欢的文章:
[## 贝叶斯 A/B 测试解释
towardsdatascience.com](/bayesian-a-b-testing-explained-344a6df88c1a)
频繁主义者和贝叶斯推理
统计在不同的情况下有不同的用途。例如,描述统计学是一个分支,处理汇总现有的数据样本。描述统计学处理的是样本本身——不需要任何推断。然而,在现实世界中,我们必须经常解决的一个更具挑战性的问题是使用样本来推断样本所来自的人群的一些情况。例如,假设您掷骰子 10 次,并看到以下结果:
4 5 2 6 1 5 6 5 3 1
描述性统计可以告诉你,被滚过三次,5 就是你的样本的“众数”。但这可能还不够。我们可能会问这样一个问题“这是一个公平的死亡吗?”试着根据我们看到的滚动骰子有限次的例子来回答这个问题。回答这类问题是推理统计学的工作。
然而,推理统计学有两个对立的分支,试图使用不同的假设、理论基础和某种程度上的哲学信念来回答这些问题:频率主义统计学和贝叶斯统计学。这篇文章旨在解释这两个分支,以及这两个分支之间争论的主要来源。
频繁推理
频率主义统计学主要是在 20 世纪发展起来的,并逐渐成为当时占主导地位的统计范式。直到今天,它仍然是科学文献中使用的更流行的方法——我在我的上一篇文章中描述的概念,如 p 值和置信区间属于频率主义范式。
其核心是,frequentist 统计是关于可重复性和收集更多的数据。概率的频率主义解释是可重复实验的长期频率。例如,假设一枚硬币正面落地的概率为 0.5,这意味着如果我们抛硬币足够多次,我们将有 50%的机会看到正面。
根据这个定义,你不能真正定义不可重复事件的概率。例如,在 2018 年国际足联世界杯之前,假设你在某处读到巴西赢得比赛的概率是 14%。这个概率真的不能用纯粹的频率主义者的解释来解释,因为实验是不可重复的!2018 年世界杯只会发生一次,不可能在完全相同的条件、球员和之前的事件下重复完全相同的实验。
根据 frequentist 推论,我们得出的概率估计中的任何不确定性都被认为是由于抽样误差造成的,即实际人口和最终抽取的样本之间的差异。所以对于常客来说,大样本解决了大多数问题,因为你的样本变得更接近真实的人口分布。
值得注意的是,常客们不相信被估计的参数有任何潜在的概率分布。例如,如果你试图估计一枚硬币正面朝上的概率,这个参数是一个固定的常数,我们不知道,但它不是固有的概率。我们只是不能确定它的价值,因为我们在处理一个样本,而不是人口本身。
置信区间是一个频率主义者的概念,似乎与这一观点相矛盾。例如,我们可以说硬币 p(H)的正面概率由一些特定值以 95%的概率限制:
L < p(H) < U,其中 L 和 U 取决于样本
这种情况下 p(H)不是概率性的吗?实际上并非如此——p(H)是固定且未知的,随机变量实际上是 L 和 U 的边界。L 和 U 是根据您绘制的样本计算的,因此这只是说,如果您不断绘制样本并每次都计算 L 和 U,则真实、固定、未知的参数在 95%的时间内都在这些边界内。并没有说 p(H)本身是概率性的!
现在,在上个世纪的大部分时间里,p 值和置信区间已经形成了跨越大多数学科的科学过程的支柱。然而,频率主义推理的一个关键问题是缺乏上下文和对抽取样本的完全依赖。正如我在以前的帖子中提到的,盲目使用 p 值会导致一系列问题,尤其是大量的“假阳性”——这些结果似乎是统计上的显著影响,但实际上并不是。但是我们如何将“语境”带入推理的问题中呢?这就是贝叶斯统计的用武之地。
贝叶斯推理
“贝叶斯推理”这个名字来自贝叶斯定理,而贝叶斯定理又是以 18 世纪英国统计学家托马斯·贝叶斯的名字命名的。事实上,大约在同一时期,贝叶斯定理背后的关键思想也被法国学者皮埃尔·西蒙·拉普拉斯独立使用。贝叶斯和拉普拉斯是非常不同的人——贝叶斯是长老会的牧师,而拉普拉斯现在被认为是不可知论者或无神论者。然而,他们都同意一个关键点——世界是完美的和确定的。
对这一观点最好的说明是著名的思想实验,被称为拉普拉斯的恶魔。这个想法是,如果有一个全知的实体知道宇宙中每一个粒子的位置和速度,它就能够知道过去发生的一切和未来将要发生的一切,只需要使用经典力学的定律(并且大概使用足够的计算能力)。这个恶魔是科学决定论的一个例子。
现在,这可能看起来和概率本身的概念有点不一致。如果这个世界是确定性的,那么我们得出的不确定性和概率性估计在哪里呢?对贝叶斯和拉普拉斯来说,概率更多的是由于我们对世界的不完善的知识,而不是世界本身的任何潜在的不确定性。所以在贝叶斯的世界观里,概率本质上代表了我们对某件事的相信程度,这大概更接近大多数人对概率的直观想法。
所以让我们来看看它的核心。假设你想评估一个假设 H,基于你在实验中采集的一些数据 D。贝叶斯定理的公式表述为:
P(H|D) = P(D|H)*P(H) / P(D)
P(D)是一种归一化常数,虽然有很多关于计算它的有趣想法,但这不是本文的重点。让我们看看其他的术语。
P(H|D) ~ P(D|H)*P(H)
P(H|D)是你想计算的概率,叫做后验概率。这是假设为真的条件概率,假设你看到了这个特定的数据。
P(D|H)被称为可能性,是假设假设为真,你得到这些数据的概率。这个术语实际上是我们在一个常客设置中唯一感兴趣的术语。如果假设为真,P 值被计算为观察数据至少达到这一极限的概率,其计算方式类似于 P(D|H)的计算方式。
贝叶斯定理的一个重要元素是 P(H)项——先验,这是贝叶斯主义者和频率主义者之间争论的主要来源。这是在我们看到数据之前,我们赋予假设为真的概率。这可能是一个难以理解的概念,这是有充分理由的。假设的概率正是我们想要计算的,对吗?在看到数据之前,我们怎么知道它是什么?
这就是你把“背景”正式带入问题的地方。先验知识代表了你过去的知识和经验的组合,包括你或学术界以前可能进行的实验的任何结果。其核心是,贝叶斯定理是基于最新数据更新你的信念。使用贝叶斯定理计算后验概率 P(H|D)后,实际上可以在下一个实验中使用这个后验概率作为先验概率!所以你不断收集新数据,每次都更新你的信念,希望随着时间的推移,有了足够的数据,你会向真理靠拢。
然而,你可以理解为什么常客们反对这个想法。先验不会只是代表实验者的偏见吗?根据我们选择的先验,我们会得到不同的结果吗?这些都是有效的问题,但先验是贝叶斯推理的关键部分,选择一个好的先验本身就是一个完整的研究领域。我们将在下一节看一个先验的例子。
比较这两种方法
首先,让我们谈谈贝叶斯推理解决的频率主义方法的一些缺点。一个是假阳性的问题。考虑一个试图在 1000 人中检测一种罕见疾病的测试。这种疾病只发生在 1%的人口中,也就是说 10 个人。该测试本身相当准确——当一个人患有疾病时,它保证能检测出来,而当这个人没有疾病时,它有 99%的机会正确识别他们没有疾病。如果你对所有人进行这个测试,会发生什么?
对于 10 个患有这种疾病的人,它会正确地识别出这一点。对于没有患病的 990 人,它会正确地识别出其中 99%的人,但对于其中 1%的人(9.9,因此大约 10 人),它会将他们错误地分类为患有疾病。乍一看,这些似乎是合理的——测试做得很好,对吗?但是考虑一下这个。如果你做了测试,结果呈阳性,那么你真的患病的几率有多大?10 个人在实际患病时得到了阳性结果,但另外 10 个人在没有患病的情况下得到了阳性结果——所以阳性结果实际上意味着你患病的可能性只有大约 50%!尽管测试有 99%的准确率,但是哪里出错了呢?
这是检测人群中发病率低的任何东西的基本问题——频率主义者的推论不善于解释这种低发病率。在本例中,您可以用所有可能运行的实验来替换“人群”,用能产生具有科学意义的实际阳性结果的实验来替换“疾病”,用我们的标准 p 值/统计显著性测试框架来替换“测试”。真正的阳性结果可能很少,我们的统计显著性测试通常允许 5%的假阳性率(高于本例)。如果我们对前面的例子进行类似的分析,我们会再次得出这样的结论:也许许多发表的“有统计学意义的”科学研究只是假阳性。在一天结束的时候,频率主义者的推断在很大程度上只是给你一个二元的是/否,关于你的结果是否重要(尽管像置信区间这样的东西可以有所帮助)。如果你最终得到一个“是”,考虑到积极结果的罕见性,你的结果实际上有多大的可能性?频繁主义者的推论并没有试图回答这个问题。
现在,我们之前得出 50%的方法实际上是使用贝叶斯定理!换句话说,我们计算出:
P(疾病|阳性检测)= P(阳性检测|疾病)*P(疾病)/P(阳性检测)
之前的计算可能看起来非常直观,那是因为贝叶斯定理只是形式化了一个非常直观的想法。因此,贝叶斯推断可以通过考虑潜在发病率(这里是 P(疾病))较低的事实来帮助解释这些假阳性。频率主义者的推理并不试图计算像 P(疾病|阳性测试)这样的量,因为在频率主义者的概率定义中,你要么患有疾病,要么没有——这里不涉及“概率”。
一如既往,这个想法的一个最简单的表现是在 XKCD 漫画中捕捉到的:
来源: XKCD
这可能是一个极端的例子,但这触及了频繁主义者推理的潜在问题的核心。太阳自发爆炸的可能性很低,所以这两个骰子出现的可能性比太阳爆炸的可能性大得多。由于频率主义者的推断没有考虑太阳爆炸的可能性(唯一重要的数据是掷骰子),采取纯粹的频率主义方法可能会遇到这样的问题。虽然在这里很容易发现问题,但在科学研究这样的背景下,很难发现这可能发生在你的实验中。
因此贝叶斯推理更容易解释和推理,因为它帮助我们计算我们感兴趣的概率(频率主义者的推理并不试图计算)。然而,它也有自己的缺点,如前所述,这些缺点主要归结为先验的选择。
在这些先前的例子中,要么先验是清楚的(人群中疾病的发病率),要么我们知道它足够低而不重要(太阳爆炸的概率)。但是计算这个先验并不总是容易的。例如,在学术出版的情况下,获得正面结果的先验概率是多少?甚至很难定义这个数量意味着什么。
有时当很难找到一个好的先验时,我们可以使用所谓的“无信息”先验。例如,如果我们试图根据数据评估两个潜在的假设,但在观察数据之前我们不知道这两个假设的可能性有多大,我们可以给每个假设设定 50%的概率。乍一看,这似乎是合理的,但是尽管没有提供任何信息,这种先验知识实际上可能会以你可能没有意识到的方式影响你的计算。在疾病的例子中,如果你不知道潜在的疾病发生率,并决定使用一个不提供信息的先验,将你患或不患疾病的概率(50%)放在一起,你的结果将会大相径庭。
从根本上说,这就是贝叶斯推理的问题。先验被认为是编纂主观信念,但在一个严格的科学过程中,真的有主观信念的位置吗?如果我们能够使用贝叶斯推断说我们的假设为真的概率是 70%,而其他人用不同的先验进行了相同的研究,得出的概率是 40%,我们如何确定哪个结果是可信的?谁有“更好”的优先权?这些都是具有挑战性的问题,不一定有好的答案。因此,你的结果对先验选择的稳健性是贝叶斯方法的一个重要方面。
结论
我相信贝叶斯方法的部分吸引力在于它是一种非常基本的人类思维过程的正式表示。有一个预先存在的信念,然后根据新的数据更新这个信念的想法——有一些非常自然的东西。如果我们先前的信念非常坚定,我们可能不会改变我们的观点,不管数据有多么令人信服(就像太阳爆炸的例子)。但是,如果我们持观望态度,那么基于新数据更新我们的信念肯定能让我们更接近真相。我们可能不会通过每天计算先验和后验项来明确地应用贝叶斯定理,但我们确实在生活的许多方面在精神上使用它。这也是其结果在疾病例子中如此直观的部分原因。将此与频率主义推理中使用的 p 值进行比较——它们一点也不直观,我们看到采取严格的频率主义方法会导致麻烦。
与此同时,将这种主观性的概念引入科学过程似乎一开始就有一点缺陷,即使量化你的主观性是关键所在。如果我们为谁拥有正确的先验知识而争吵不休,科学怎么会进步呢?与此同时,如果科学中的再现性危机是由于不适当地应用频繁推理的思想而引起的,那么转换到不同的框架可能无助于解决所有的问题。如果你可以误用频繁主义推理来得到你想要的结果,你当然可以对贝叶斯推理做同样的事情。
这两种方法可能更适合不同的问题,并且有许多混合技术正在考虑中,它们结合了两种框架的最佳方面。所以没有正确的答案,就像大多数事情一样,如果有是1,那么它很可能在中间的某个地方。
参考
[1] 统计学中的频率主义和贝叶斯方法
[2] 频率主义者和贝叶斯推理的比较
[4] 贝叶斯 vs 频率主义者方法
常客 vs 贝叶斯统计
用 Python 进行参数估计的实用介绍
参数估计是统计推断、数据科学和机器学习工作流的关键组成部分。尽管这个主题可能很复杂,但我们还是用一些理论和代码介绍了比较两种方法的过程。
演职员表:https://unsplash.com/@cgbriggs19
无论是尚未发生的结果,还是我们尚无法一瞥的现实,我们都沉迷于了解未知。我们花费巨大的资源,希望对未来做出更准确的预测,并欣赏那些预测一贯正确的人。在过去的一个世纪里,新兴的统计推断领域已经为这些不可知的结果和关系提供了一个更强大的工具集。统计推断的目的是使用可观察的数据来推断一个随机变量 (RV)的性质。术语“随机”可能会引起混淆,它并不意味着一个变量完全随机地取值,而是它取不同的值,这些值是由潜在的概率分布决定的。
在这篇博文中,我们将使用一个最简单的 RVs,即抛硬币的结果,来理解推理的一个基本方面,即参数估计。虽然硬币是一个简单的 RV,因为它可以取两个值-正面或反面,但您可以考虑其他 RV,如骰子滚动(在 6 面骰子的情况下可以取 6 个值)或股票价格(理论上可以取任何正值)。
在统计推断中,我们希望了解 RVs 之间的关系,以便了解和预测我们周围的世界。控制不同 RVs 之间关系的实体称为参数,通常用希腊字母θ (theta)表示。我们可以用以下方式用数学方法写出这种关系:
y 是我们的因变量(或结果变量),X 是我们的独立变量(或预测变量)。θ是参数空间,包含所有决定 Y 和 x 之间关系的潜在值。
虽然一个参数的真实值根据定义是未知的,我们可以用它的近似值来工作。在这篇博文中,我们将探讨两种不同的方法。我们将从使用最大似然估计(MLE)的频率主义者(或经典方法)开始,然后我们将继续讨论贝叶斯框架。但在此之前,让我们简要讨论一下二项式分布,这是一种相对简单但却非常重要的分布,每个数据科学家都应该知道,以及如何通过编写 Python 代码来模拟它。
二项式分布
我们将围绕抛硬币的例子进行讨论(这是任何统计文本都必须的)。具体来说,我们感兴趣的是在一次给定的投掷中硬币正面朝上的概率。在这种情况下,我们抛硬币的结果是我们的 RV,它的值可以是 0(反面)或 1(正面)。
我们可以将单次抛硬币的结果表示为伯努利过程,这是一个有趣的术语,它表示 Y 是一个有两个潜在值的单个结果。形式上,我们有:
在这个上下文中, p 是硬币正面朝上的概率,这是我们感兴趣的参数。我们的任务将是尽可能精确地估计 p。
因此,我们有:
那么,给定一枚硬币,我们将如何估计 p ?我们可以只抛一次硬币,但这不会提供太多信息。想象一下,真相是 p=0.5 (硬币是公平的,有相等的概率翻转正面或反面),一次翻转后我们观察到一个正面。如果我们只依赖于那一次翻转,我们可能会得出 *p=1,*所以翻转头部的概率是 100%,我们会一直翻转头部,这听起来很可疑。
我们要做的是观察大量的翻转。当一个伯努利过程重复多次时,它被称为*二项式过程。*二项式过程建立在所有试验的假设之上,或者在我们的例子中是掷硬币,都是独立的——无论你现在掷的是正面还是反面,都不会对后面的迭代产生影响。
假设现在我们掷硬币 n 次。在这些 n 次投掷中,总的人头数 Y 是一个带有参数 n 和 p 的二项式随机变量。n 表示试掷或掷硬币的次数, p 表示成功的概率,或投掷人头的概率。最后,二项式分布的概率质量函数(PMF)给出了对于每一个 p 值,在 n 次试验中准确观察到 Y 个头的概率。
形式上,我们有:
既然我们对参数估计和将要使用的分布有了理论上的理解,我们就可以开始编码了。
模拟一些数据
现在让我们假设有人给了我们一个有 60%概率翻转正面的有偏硬币,但是我们不知道我们想自己估计这个概率。
我们可以使用scipy.stats
库从二项式分布中得出结果。模拟是非常有用的,因为我们可以硬编码“真实”的参数,然后允许我们比较不同的框架在近似它方面的比较。
让我们模拟 10000 次抛硬币,观察一些结果。
import numpy as np
import scipy.stats as stats
from matplotlib import pyplot as pltnp.random.seed(42) # set seed for reproducibility# Set the probability of heads = 0.6
p = 0.6# Flip the Coin 10000 times and observe the results
n_trials = 10000data = stats.bernoulli.rvs(p, size = n_trials)# plot results
plt.hist(data);
10000 次抛硬币的直方图
sum(data)# 6108 coin flips out of 10000 are heads, since heads are coded as 1s and tails are coded as 0s
正如预期的那样,正面和反面的比例接近 60/40,在 10000 次掷硬币中有 6108 次是正面,这只是因为我们告诉虚拟硬币翻转器,硬币有 60%的机会是正面!
现在我们有了数据,让我们比较频率主义者和贝叶斯方法如何获得感兴趣的参数: p 。
频繁主义者的方法
频率统计使用最大似然估计(MLE)。虽然对极大似然估计的全面处理超出了这篇博文的范围,但它的工作就在它的名字里:它符合一个模型,这个模型最大化了观察到的观察数据的可能性。
对于二项分布,MLE 是成功的样本比例[1]。这仅仅意味着,在频率主义框架下,我们假设 p 的真实值是所有掷硬币中正面的数量:如果我们在 10 次掷硬币中有 6 次正面,那么我们认为 p 应该接近 6/10,或者 60%。
最大似然估计是成功的样本比例
在获得 p 的估计值后,下一步是量化该估计值的不确定性。记住,我们永远不知道它的真实价值,所以我们也必须量化它的全部潜在价值。这个范围称为置信区间,很容易计算出二项分布。首先,我们计算参数的标准误差,即其标准偏差乘以√N(样本大小)。然后,我们可以通过将标准误差乘以 95% Z-stat(等于 1.96)来找到我们的 95%置信区间。
总之,我们有:
捕捉二项分布的不确定性
让我们看看当我们投掷 10 枚硬币时会发生什么。在下图中,绿线表示 p 的“真实”值,我们在模拟数据时决定该值为 0.6。红色虚线表示最大似然估计,蓝色虚线表示置信区间,即 p 所在的可信值范围。
MLE 估计 10 次抛硬币
因为我们观察了 5 个头,MLE 是 0.5(回想一下 p 的真值是 0.6)。不确定性被置信区间捕获,置信区间表明 p 的真实值有 95%的概率在~ 0.2 和~ 0.8 之间。由于置信区间与样本大小成正比,我们可以预计它们会随着抛硬币次数的增加而缩小——我们拥有的数据越多,我们对自己的预测就越有信心。为了说明这一点,让我们看看当我们翻转越来越多的硬币时会发生什么。
随着 n 的增加,MLE 和 CI 估计值
在上面的图中,我们在 1 次翻转、10 次翻转、25 次翻转等多达 10,000 次翻转后拍摄结果的快照。这些图让我们了解了当我们掷硬币的次数越来越多时,我们的估计值以及我们对这些估计值的信心是如何变化的。
随着我们一遍又一遍地继续抛硬币,我们获得了越来越多的关于硬币性质的信息。因此,我们应该期待我们的估计会变得越来越精确,也越来越准确。当我们只抛硬币几次(比如 1 到 100 次)时,我们可以看到我们的置信区间相当宽。这是因为我们还没有看到足够的信息来排除头部的真实概率位于我们当前最大似然估计两侧的可能性。然而,随着我们继续抛硬币,观察到越来越多的关于我们感兴趣的参数的证据,我们看到我们的置信区间开始变窄并接近 MLE。当我们把硬币抛了 10,000 次后,我们的置信区间只是稍微偏向我们的最大似然估计。
让我们凭直觉思考这个问题:随着我们获得更多的证据,我们应该对我们的估计越来越有信心。此外,最重要的是,我们应该期待我们的估计越来越接近事实!这是大数定律:随着样本量的增加,其参数 estimand 越来越接近总体的真实值。我们将正面的真实概率设置为 0.6,这一点得到了证实,事实上,我们在翻转 1000 次后的最大似然估计为 0.61,并且在此之后不再波动(只是置信区间变窄)。
贝叶斯方法
本节素材——尤其是模拟代码,大量亏欠https://tinyheero . github . io/2017/03/08/how-to-Bayesian-infer-101 . html[2]。
回顾一下,贝叶斯定理通过将模型参数建立为基于我们观察到的数据的分布条件来估计模型参数。
贝叶斯定理
- P(θ)是我们模型参数的先验分布,它代表了我们在看到任何数据之前对结果和预测变量之间关系的看法。
- P(X|θ)是似然项,表示先验数据与观测数据的拟合程度。
- P(X)是预测变量的边际分布。换句话说,它代表观察到给定所有θ可能值的数据的概率。当处理离散分布时,P(X)可以通过对θ的所有值求和得到;在连续情况下,它是通过对θ积分得到的。
院长
贝叶斯工作流程的第一步是指定我们对结果变量的先验信念。对于这个例子来说,这意味着对我们关于抛硬币正面朝上的概率的信念进行编码:没错——我们把一个概率放在一个概率上。
上面的代码块创建了先验分布。首先,np.linspace
函数创建 11 个介于 0 和 1 之间的值,间隔为 0.1。其次,我们硬编码了与先验分布中每个值相关的概率。随意使用不同的概率值——只要它们的总和为 1!
θ的先验:翻转头部的概率
先验分布概括了我们在没有看到任何数据的情况下对击中头部的概率的想法。为简单起见,我们将允许θ从 0 到 1 只取 10 个 0.1 增量的值。我们假设我们不知道硬币是有偏差的,也没有任何迹象表明它会有偏差。
因此,让我们建立一个峰值为 0.5,值为 0.2 的分布:我们说有 20%的机会硬币是公平的。我们也在考虑硬币可能不公平的可能性,这反映在θ从 0.1 到 0.9 的概率上。我们认为唯一不可能的情况是 p 等于 0(没有机会永远不摇头)或 1(没有机会永远不摇头)。
可能性
既然我们已经定义并编码了我们先前的信念,贝叶斯方法的下一步就是收集数据并将其纳入我们的估计。这一步与我们在 Frequentist 方法中所做的没有什么不同:我们将观察完全相同的数据,并再次使用似然函数来提取关于参数空间的信息。唯一的区别是,我们现在不仅仅是在 MLE 之后,或者我们在 Frequentist 方法中得出的点估计,我们需要参数空间中每个值的似然值。
可能性可能是一个难以理解的复杂概念,但它所做的基本上是返回一个数字,告诉我们某个值 p 符合数据的程度。一组 p 的高似然值意味着它们“适合”数据,反之亦然。我们基本上是在问:对于任何给定的 *p,*我们能确信它确实产生了我们所见证的数据吗?
二项式可能性的等式是其概率质量函数(PMF) [3]。
二项式似然函数
让我们解开上面的等式。我们说:给定 n 次投掷和 y 次投掷,与 p 相关的可能性是多少?对于θ中的每个 p 值,似然性评估该 p 值的概率。举个例子,如果我们观察到 1 个头像,那么 p= 0 的可能性一定是 0——因为我们观察到至少 1 个头像,那么永远不会翻转头像的可能性一定是 0。另一个例子,虽然不太可能(看我在那里做了什么?)将见证 10 次翻转中有 10 次正面朝上。在这种情况下,可能性将测量值 p = 1 是极有可能的,并且很可能分配它接近 100%的概率。
现在让我们计算可能性,并将其可视化。我们将保留前一个示例中的前 10 个数据点,因此 10 次翻转中有 5 次是正面。
观察 10 次抛硬币中 5 次正面的可能性
您会注意到,可能性在 0.5 左右达到峰值,离它越远,值就越小。这是有道理的:这种可能性用数据更新了我们之前对θ的信念,数据显示,10 次翻转中有 5 次是正面——根据我们观察到的数据,θ最有可能的真实值是 0.5。因此,0.5 将获得最高的可能性。反之亦然,像 0.1 和 0.9 这样的值不太可能是真实值,我们看到图表中相应地反映了这一点。反过来,极端值没有得到数据的证实,因此给出了非常小的似然值。
然而,需要注意的是可能性不是有效的概率分布。你可以自己检查一下,把θ的所有概率加起来,结果不等于 1!这就是归一化常数/分母的用武之地:将每个可能性概率除以归一化常数(它是一个标量)得到一个有效的概率分布,我们称之为后验概率。
后验分布
现在我们已经计算了似然值,我们通过将它们与先前的值相乘来获得贝叶斯定理的分子,这产生了θ和 x 的联合分布。反过来,分母通过对所得向量求和来获得(忽略θ)。
您可能已经看到,分母常常使贝叶斯推理在计算上难以处理。后面的博客文章将解释为什么会这样,但是对于这个场景,我们的优势是使用离散的参数空间(求和比积分容易),并且只取 10 个值,所以计算分母是完全可行的。
在下一篇博文中,我们将讨论当我们使用连续发行版时会发生什么。现在,请注意我们推导 X 的边际分布的能力是可能的,因为我们使用的是一个变量,而这个变量只有很少(11)个值。这使得对参数空间中的所有值求和变得容易,而如果我们处理的是可能有数千个(或无限个)预测值的多个预测值,情况就不一样了!如在连续的情况下)值的数量。
后验分布是可能性和先验之间的折衷
那么后验分布是怎样的呢?它反映了我们对我们感兴趣的参数的信念,包含了我们可以获得的所有信息。它是两个部分的产物:我们对θ的先验信念,以及反映我们从观测数据中获得的信息的可能性或证据。结合这两部分,我们得到了我们感兴趣的参数的概率分布。这是区分贝叶斯和频率主义方法的关键。在 frequentist 方法论中,我们的答案以点估计的形式表示(有一个置信区间)。然而,在贝叶斯方法中,我们的答案以概率分布的形式表达,允许我们对每个潜在的 p 正确的概率进行赋值。
在上面的例子中,在观察了 10 个翻转和 5 个头部之后,我们的先验分布已经被向θ= 0.5 的可能性挤压,这似乎越来越成为最有可能的答案。但是,我们还没有看到足够的信息来排除θ位于 0.5 一侧某处的可能性,所以我们将继续观察更多的数据。类似于我们在 frequentist 讨论中所做的,让我们看看当我们看到越来越多的数据时,我们的贝叶斯结论是如何变化的。
把所有的放在一起
现在让我们看看在贝叶斯框架下,随着抛硬币次数的增加会发生什么。下图覆盖了后验分布(蓝色,左侧 Y 轴上的值)和可能性(红色,右侧 Y 轴上的值)。
n 增加时的后验概率和可能性
让我们从分析我们已经抛过一次硬币并观察到正面的情况开始。在 frequentist 方法中,我们看到,在这种情况下,我们对 p = 1 的估计,显然是一个不正确的结论,然而我们没有其他方法来回答这个问题。在贝叶斯世界中,我们的答案非常不同。因为我们定义了我们的先验信念,即θ最可能的值是 0.5,所以我们只受到第一次翻转的轻微影响。凭直觉想一想,如果你真的相信一枚硬币是公平的,你抛了一次,硬币正面朝上,这足以证明这枚硬币不公平吗?大概不会!
当要处理的数据相对较少时,贝叶斯方法比频率主义方法表现得更好。频率主义者答案的可行性依赖于大数定律,因此在缺乏大量数据的情况下,结果并不总是可靠的。
然而,随着我们开始观察更多的硬币翻转,我们开始看到我们的贝叶斯答案变得非常清楚,最终我们将所有的鸡蛋放在 p = 0.6 的篮子里。仅仅翻转 100 次后,我们给不等于 0.6 的值分配了一个非常小的概率,最终我们分配给 0.6 的概率收敛到 1,或者大约 100%。这意味着我们接近 100%确定,60%的时间,我们的硬币将是正面。
在背景中,可能性(或观察到的数据)开始支配我们一开始建立的先验信念。这是因为证据是压倒性的,所以我们更依赖它。如上图所示,随着 n 的增加,似然性和后验分布收敛(注意,X 轴和 Y 轴上的比例不同,因为似然性不是概率分布)。当我们观察到更多的数据时,先验的影响会被冲掉,数据会自己说话。
结论
在这篇博文中,我们研究了估计未知参数的两种不同方法。在 Frequentist 方法中,我们让数据说话:我们通过建立一个尽可能符合观察数据的模型来估计 X 和 Y 之间的关系。这给了我们一个单点估计,最大似然估计,不确定性被模型的标准误差捕获,它与样本大小成反比。因此,典型的 Frequentist 努力收集尽可能多的关于感兴趣的参数的数据,以便达到更精确的估计(至少在理论上)。
在贝叶斯方法下,我们从变量之间的关系的概念开始分析:先验分布。然后我们观察我们的数据并更新我们对参数分布的信念:这给出了后验分布。贝叶斯框架下的一个重要但微妙的区别是,我们将参数视为随机变量,以捕捉其真实值的不确定性。这需要在建模过程的每个阶段都使用发行版。
如果我们回忆一下我们展示的频率主义方法的图表,我们会发现,随着样本量的增加,贝叶斯和频率主义的答案是一致的,这是理所应当的!随着我们获得关于我们感兴趣的参数的更全面的信息(即观察更多的数据),我们的答案应该变得更加客观。
所以你可能会想,如果他们最终给出相同的答案,那么采用不同的方法又有什么意义呢?这实际上取决于用例。我们认为,在你有很多很多数据的情况下,部署一个完全成熟的贝叶斯框架可能是多余的。在数据较少的情况下,例如在社会科学中,处理后验分布的能力是非常有洞察力的。此外,在频率主义者的方法中,我们完全受制于数据的准确性。如果我们的数据不准确或有偏差,那么我们的估计也会如此。在贝叶斯方法中,我们可以通过设置更强的先验来抵消这种影响(例如,对我们先前的信念更有信心)。我们还认为,贝叶斯分析在简单性方面的不足,在整体精度方面得到了弥补,在许多情况下,向客户或同事展示后验分布比点估计更能提供信息。
在这篇博文中,我们将先验空间视为相对简单的空间,只有 11 个 p 可以取的任意值。但是如果 p 可以取 0 到 1 之间任何可能的值呢?当我们开始处理参数空间的连续分布时,事情变得有点不确定,这将是下一篇博客文章的主题,我们将了解为什么使用马尔可夫链蒙特卡罗近似法——敬请关注!
我们意识到有很多东西需要打开,所以这里有一个 TLDR 给你:
Frequentist 方法使用最大似然估计(MLE)来估计未知参数:在给定我们观察到的数据的情况下,点估计是参数最可能的真实值。
Frequentist 答案完全由观察到的数据形成,并以单点估计的形式交付。这使我们受到数据准确性和质量的支配。
-贝叶斯方法将先验概率分布与观测数据(以似然分布的形式)相结合,以获得后验概率分布。
-虽然贝叶斯方法也依赖于数据,但其估计值结合了我们关于感兴趣参数的先验知识 ,其答案以感兴趣参数的概率分布的形式给出。我们可以通过设定更强的先验来抵消对数据的依赖。
-随着样本量的增加,统计推断变得客观,频率主义者和贝叶斯估计开始彼此相等。
完整代码
https://github . com/gabgilling/Bayesian-Blogs/blob/main/Blog % 20 post % 201% 20 final . ipynb
引文
[1]https://online.stat.psu.edu/stat504/lesson/1/1.5
[2]https://tinyheero . github . io/2017/03/08/how-to-Bayesian-infer-101 . html
承认
感谢我们在 IBM 的同事:Alexander Ivanoff、Steven Hwang、Dheeraj Aremsetty 和 Lindsay Sample 的校对和评论!
从 0 到数据网格:Kolibri Games 打造数据驱动型公司的 5 年历程
数据网格案例研究
一家初创公司从零开始构建数据网格和数据驱动文化的经验教训。
总部位于柏林的 Kolibri Games 经历了一段疯狂的旅程,从 2016 年一家基于学生宿舍的初创公司飙升至 2020 年被育碧公司收购的头条新闻。
虽然五年来发生了很多变化,但有一点始终未变:该公司致力于建立一种洞察驱动的文化。随着几乎每周一个新版本的发布,他们的移动游戏不断变化并产生大量数据——每天处理 40 种不同事件类型的 1 亿个事件,有些事件有数百个触发器。
一路走来,该公司的数据组织从一个营销分析师团队发展到 10 多名工程师、分析师和科学家,他们负责确保数据运营的可靠性、可扩展性和自助性。为了推动这种爆炸式增长,该团队正在构建一个 数据网状架构 ,以数据驱动的文化为后盾,这将让成千上万更成熟的公司羡慕不已。
最近,我们与该公司的数据工程负责人 António Fitas 坐在一起,讨论 Kolibri Games 的数据故事,分享他们的数据组织如何在每一步发展,包括他们使用的技术,他们雇用的团队成员,以及他们面临的数据挑战。
他们的故事非常吸引人,对于那些开始数据网格之旅的人来说,这是一个很好的资源。让我们开始吧。
2016 年:首次数据需求
2016 年,Kolibri Games 的创始人开始在德国卡尔苏赫理工学院的学生公寓里一起开发一款游戏。他们凭借自己的第一款手机游戏闲散矿工大亨取得了早期的成功,创始人建立了一些与数据相关的基本目标和目的。
数据目标和目的
建立基本的商业报告,以确定游戏是否正常运行,以及公司是否赚钱,方法是:
- 报告应用内购买收入
- 报告广告收入
- 报告特定于游戏的 KPI
- 报告崩溃和错误
数据团队和技术团队
图片由 Kolibri Games 提供。
作为一家精益初创企业,创始人完全依赖第三方工具,包括:
- 脸书分析公司
- 广告合作伙伴
- Firebase(帮助修复应用程序崩溃和错误)
- 游戏分析(针对游戏内关键绩效指标,如留存率)
数据挑战
- 跨不同工具的分散分析
- KPI 的计算方式不透明
- 报告不同工具之间的不一致
- SDK 集成带来的技术问题
- 技术限制,例如更深入地挖掘指标和缺乏灵活性
“这种方法远非完美,但这不是我们首先要解决的问题,”安东尼奥说。“我们很幸运,我们有很多玩家有机地加入了游戏,但我们希望得到更多。为此,我们希望借助数据提升我们的营销和用户获取运营。”
2017:追求效果营销
随着“无所事事的矿业大亨”越来越受欢迎,运营公司所需的团队也越来越受欢迎——搬出学生公寓,搬进卡尔斯鲁厄一间合适的办公室。随着该组织专注于获取新客户,该团队建立了数据功能来衡量和改善绩效营销。
数据目标和目的
加强绩效营销,让更多用户加入游戏,同时通过以下方式确定哪些活动是有利可图的:
- 计算活动的广告支出回报(roa)
- 创建简单的用户终身价值(LTV)预测
- 构建付费广告竞价脚本以优化活动绩效
数据团队
图片由 Kolibri Games 提供。
还没有招聘数据——一位营销经理负责绩效营销。
数据技术堆栈
图片由 Kolibri Games 提供。
为了深入了解 ROAS 和 LTV,该团队在他们的武器库中添加了第三方移动测量合作伙伴(MMP)工具 AppsFlyer。这个工具帮助营销经理了解哪些用户获取活动表现良好,花费了多少,以及新获得的玩家产生了多少收入。AppsFlyer 还通知本地运行的脚本来优化投标管理操作。
数据挑战
- 缺乏透明度
- 易出错的
- 没有版本控制
- 数据更加分散
“我们基本上被蒙住了眼睛,”安东尼奥说。“我们没有任何版本控制或工程最佳实践来管理我们为设定出价而运行的代码。”
尽管如此,Kolibri Games 第二年的年收入仍超过 1000 万欧元。为了更上一层楼,是时候投资一些改进了。
2018:专业化和集中化
在第三年,这家年轻的公司搬到了柏林,雇佣了更多的开发人员和设计师,安东尼奥也及时加入了 5000 万下载量的庆祝活动。与另一名数据工程师和营销团队一起,一个专业的数据组织开始形成。
数据目标和目的
通过创建一个工具来收集所有信息,提供透明度,并通过以下方式更深入地挖掘数据,从而实现数据集中化和绩效营销专业化:
- 投资专有的自有解决方案来集中数据
- 收集原始数据
- 建立中央数据仓库
- 设置仪表板
数据团队
图片由 Kolibri Games 提供。
António 和另一名数据工程师致力于构建初始技术堆栈,而一名营销分析师则专注于构建仪表盘以实现绩效营销。
数据技术栈
图片由 Kolibri Games 提供。
António 和他的团队构建了他们的数据平台的第一个版本,他们将 Azure 用于几乎所有的服务。他们建立了事件遥测技术,为游戏中的特定事件或动作生成数据点,建立了批处理作业,将 API 中的数据集成到他们的数据湖中,并做出了他们的第一次技术转换:从 Power BI 迁移到 Looker,以获得另一层数据操作和现成的功能,如版本控制。
- 数据工厂(Azure)
- 活动中心(Azure)
- 流分析(Azure)
- 数据湖分析(Azure)
- 权力 BI,然后 Looker
- SQL 数据库
数据挑战
- 查询性能
- 稳定性和可靠性
- 保持系统的活力
António 说:“我们的 SQL 数据库正在成为一种限制。“在我们的仪表盘运行的同时,集成数据的工作正在写入数据,或者分析师正在进行即席查询,基本上,整个服务开始变得非常不可预测和非常缓慢。我们开始发现我们的一些工作经常失败,而且我们的警报或监控很有限。我们决定以数据为导向,开始解决我们遇到的一些问题。”
2019:面向数据
随着又一次成功的游戏发布、品牌重塑和全球认可,Kolibri Games 在 2019 年迎来了更大的增长。该公司在 7 月份达到了 1 亿次下载和 100 名员工的双重里程碑。随着更多的用户和更多的产品,产生了更多的原始数据,安东尼奥和他的团队知道他们只是触及了数据如何推动公司前进的皮毛。
数据目标和目的
通过了解玩家行为、进行数据支持的实验,以及通过以下方式完善数据技术体系,为游戏创造洞察力:
- 建立一个货币化仪表板,显示公司通过优惠、商店和广告赚了多少钱
- 构建进度和参与度仪表板,以了解玩家如何与游戏互动(例如他们何时离开以及他们如何与某些功能互动)
- 运行 A/B 测试
- 提高仓库的性能和数据管道的可维护性
数据团队
图片由 Kolibri Games 提供。
安东尼奥知道他们需要更多的人来让他们的海量数据变得有用。他们在数据平台团队中增加了一名游戏数据主管和两名 BI 开发人员。数据工程师与基础设施密切合作,维护系统、集成新工具和维护流用例,同时为 BI 开发人员构建框架,以处理数据集成、数据建模和数据库可视化。
数据技术栈
图片由 Kolibri Games 提供。
不断增长的数据团队需要更大的灵活性和更简单的协作,因此 António 用 Databricks 替换了一些 Azure 服务。他们尝试使用 Spark 来利用他们的数据湖作为他们的数据仓库,但发现在该平台上工作的人更喜欢 Python 和 SQL——他们在使用 Spark 时没有看到他们期望的 Looker 性能。因此,安东尼奥和他的团队最终用雪花取代了他们的 SQL 数据库,雪花成为他们所有分析的主要计算引擎。
数据挑战
- A/B 测试很难设置,缺少透明度,并且无法显示或演示
- 游戏中没有数据驱动的决策
安东尼奥说:“大多数决定仍然是根据直觉和社区反馈做出的。“我们继续生成更多数据,但我们知道我们可以更多地利用这些数据,并围绕这些数据构建更多使用案例。”
2020 年:实现数据驱动
2020 年初,Kolibri Games 被法国游戏巨头育碧收购。随着资源的增加,António 的团队继续发展,将机器学习功能分层到他们的平台中,并从关于数据网格架构和特定领域数据所有权的对话中受到启发。为了开始构建数据驱动的文化,他们引入了 特定于数据的服务级别协议(SLA),并专注于增加对数据的自助式访问。
数据目标、SLA 和目的
做出完全由数据驱动的决策,以释放公司游戏的全部潜力,特别是让产品经理帮助跟踪:
- 90%的闲置矿业大亨决策需要数据支持
- 90%的问题的洞察时间需要少于 1 小时
- 90%的变更需要通过分析进行验证
为了实现这一目标,数据平台团队将:
- 改进 A/B 测试流程,以帮助对要实现的功能和更改做出明智的决策
- 通过为玩家群体创建游戏配置来提高个性化
- 使用预测分析来预测 LTV 和流失,以相应地调整游戏
- 让人们能够回答与数据相关的问题,而无需咨询数据分析师
数据团队
图片由 Kolibri Games 提供。
由于数据组织专注于特定领域的数据所有权,因此让新聘分析师直接融入产品团队是有意义的,他们与产品经理密切合作,了解需求并调整优先级,以反映产品的实际需求。第三名数据工程师和两名数据科学家也加入了数据平台团队,专门从事 ML 算法和 A/B 测试数据管道的工作。
数据技术栈
图片由 Kolibri Games 提供。
António 的团队将数据仓库架构添加到雪花中,更好地定义了他们应用业务逻辑的地方。他们也从做 ETL 转到了 ELT,直接在雪花里做清洗和转换。他们将其与数据转换工具 dbt 结合起来,在平台上工作的每个人之间进行协作,增加透明度和可见性。
数据工程团队还专注于抽象数据管道,以便产品分析师可以与游戏开发团队一起设计和定义新的数据事件。通过遵循数据工程师制定的指导原则,他们现在可以将数据放入仓库并对数据建模,而不需要数据工程师。António 和他的团队还引入了 Airflow 作为数据集成、所有 dbt 模型和数据验证的主要编排。
数据挑战
- 数据信任
- 软件稳定性
- 扩展个性化
“我认为,当我们试图衡量‘我们是否真的在利用数据进行产品开发’时,这项工作做得非常好。”安东尼奥说。“让这些 KPI 围绕我们的问题,并衡量这些事情,真的有助于人们更多地考虑它,并推动它。我认为,就让更多的人思考数据而言,这项工作本身证明是卓有成效的。但此时发生的情况是,我们获得了更多的数据,更多围绕数据的新用例,以及许多新模型,但监控所有这些并确保事情正确变得越来越困难。”
2021 年:构建数据网格
随着今年的展开,安东尼奥和他的团队专注于建立 数据信任和可靠性——这对于他们实现具有特定领域数据所有权的数据网状架构的使命至关重要。
数据目标和目的
帮助公司利用可靠的数据进行扩展,同时构建数据网状架构,提高开发速度和减少事故,减少事故数量,并通过进一步的高级分析提高玩家个性化。安东尼奥和他的团队计划通过以下方式实现这一目标:
- 提高测试能力
- 构建通用的发布和开发流程
- 实施更多监控和警报
- 专注于高级分析
- 围绕数据监控和工程最佳实践协作扩展数据平台功能
- 构建领域跨职能团队
数据团队
受数据网格概念的启发,该公司计划通过增加项目经理来扩展嵌入产品和营销的领域团队,项目经理将帮助他们的团队和 BI 开发人员定义工作,以帮助集成新的和维护现有的数据源。中央数据平台团队将继续专注于构建解决方案、框架、维护基础设施和高级分析。
数据技术栈
今年,数据团队正在努力集中开发和发布流程,以便数据平台、营销和产品团队都遵循相同的合并请求并发布到生产流程中。
Kolibri Games 还增加了一个新工具 Monte Carlo,用于端到端、全自动的 数据可观测性 和血统。在尝试构建自己的数据监控定制解决方案后,他们意识到需要一名全职人员来构建一个框架,以将其扩展到不同的用例并监控所有数据资产。数据可观察性通过使用机器学习来监控数据仓库中所有数据的质量,并提供自动生成的端到端数据血统来加快故障排除和 事件解决 来帮助解决这个问题。
5 年数据之旅的 5 个关键收获
归根结底,建立一家数据驱动的公司是一场马拉松,而不是短跑。
对于 António 来说,实施数据网格和实现端到端数据信任是其团队旅程的顶点。以下是他在组建数据团队(无论其形状或规模如何)以在每个发展阶段取得成功时的关键要点。
- “构建您自己的数据堆栈是值得的,因为它为您提供了所有这些功能,并使您能够在产品开发或团队工作中以数据为导向。”
- “我们的数据平台已经经历了多次迭代,因此您必须选择并能够理解何时是改变技术的合适时机,针对哪种数据量,针对您正在运行的哪种流程。”
- “如果您想建立对数据的信任,拥有更高程度的数据质量和数据可观察性非常重要。重要的是,当出现问题时,你能够理解,并且能够很容易地指出来。”
- “在升级到更高级的数据应用程序之前,掌握基本知识非常重要。在我们的情况下,我们应该早点聘请分析师来更多地利用数据。”
- “建立数据驱动的文化非常重要,有时甚至比建立正确的技术堆栈更重要。”
随着越来越多的组织采用数据网格和分布式架构,创新、效率和可伸缩性的机会从未如此之大。尽管如此,重要的是要认识到,当涉及到实现数据网格和建立分布式数据团队时,技术和过程只能让您走这么远。归根结底,成为数据驱动型企业总是始于文化,也终于文化。
有兴趣了解数据可观察性如何促进数据网格架构?巴尔 和 其余的蒙特卡洛团队 了解更多
还有别忘了 RSVP 对于 的影响:2021 年 11 月 3 日的数据可观测性峰会 听听 扎马克 ,数据网的创始人,以及其他数据界的领军人物!
特别感谢安东尼奥和他的团队分享他们的故事!
从初学者的角度:理解可视化和用 Tableau 构建图表
了解可视化的背景,并使用 Tableau 构建仪表板
米利安·耶西耶在 Unsplash 上拍摄的照片
简介
作为一名在数据科学和分析领域工作的顾问,我经常不得不处理大量的数据,构建模型并从中获得见解。然而,当涉及到与他人交流数据和发现时,以纯文本、excel 文件或电子表格的形式呈现结果对于其他人来说不容易快速掌握和理解所发现的信息。这就是数据可视化的价值所在——通过图形或地图以可视化的方式呈现数据,并突出显示数据中的关键见解、趋势或模式。
在本文中,我将分享数据可视化的含义,以及我们如何使用 Tableau 开发交互式可视化。工具“Tableau”是一种可视化工具,目前被许多组织广泛使用。Tableau 附带了一个用户友好的界面,这是一个拖放界面,这使它成为组织使用的一个很好的选择,因为组织中的任何人都可以很容易地掌握这项技能。
[**Table of Contents:**
(1) What does Data Visualization mean?
(2) Tableau Overview
(3) Tableau Interface & Connecting to Data Sources
(4) Understanding Our Data Set
(5) Building Visualization
(6) Building a Final Dashboard](http://x)
(1)数据可视化是什么意思?
确定 A 组和 B 组中“8”的数量(图片由作者提供)
让我们从一个简单的活动开始,如上图所示,我们有两组随机字符的盒子——A 组和 B 组。现在让我们通过计算 A 组和 B 组中 8 的数量并比较所用时间来计时。你会注意到,与集合 A 相比,识别集合 B 中的数字“8”要容易得多,也快得多,因为它已经进行了颜色编码。
表格形式的销售额(图片由作者提供)
现在,让我们来看看这个包含区域 A 和区域 B 每月销售额的表,您能快速确定哪个月的销售额达到峰值或下降吗?
将地区销售额绘制成图表(图片由作者提供)
上面的折线图展示了 A 区和 B 区的销售情况,您能从折线图中看出哪个月的销售额达到峰值或下降得更快吗?从折线图中,我们可以很快注意到,A 地区的销售高峰出现在 9 月和 10 月,而 B 地区的销售高峰出现在 7 月和 8 月。
这些活动解释了可视化的目标,即更容易、更快地看到数据中的模式。数据可视化有助于人类更好地进行可视化,因为与口头/文本信息相比,人脑处理视觉格式信息的速度要快得多。使用带有正确颜色的图形格式来可视化数据有助于人类大脑轻松理解和处理信息,而不是花费时间缓慢而仔细地检查大量的文档、电子表格和报告。
“能够可视化数据并利用数据讲述故事是将数据转化为可用于推动更好决策的信息的关键。”——Cole Nuss baumer kna flic
(2) Tableau 概述
Tableau 是在“2003 年”由帕特·汉拉汉、克里斯蒂安·沙博特和克里斯·斯托尔特创建的,当时他们在斯坦福从事一个计算机科学项目。Tableau platform 提供了一系列产品,从数据准备到数据可视化,再到与他人共享您的可视化,此外还添加了治理和数据管理,以便为全周期的自助分析提供支持。用于建筑可视化的 Tableau 产品包括:
- Tableau Desktop —最适合开发者开发仪表盘、故事、报告。
- Tableau Server —最适用于将使用 Tableau Desktop 创建的仪表板、故事、报告发布到服务器,供其他人分析报告。(Tableau 管理员可以为每个用户设置权限,允许他们仅查看或通过编辑报告进行更改)。
- Tableau Online —在完全托管在云中的分析平台上构建仪表盘、故事、报告,跳过软件安装和升级的设置时间。
除了上面提到的产品,Tableau 还有其他产品,如数据准备工具 Tableau Prep,一个任何人都可以免费在线探索、创建和共享数据可视化的公共平台,等等。如果你很好奇,想了解更多 Tableau 提供的产品,可以参考他们的官网。
我将在本文中使用的平台是 Tableau Online ( 如果这是您第一次使用 Tableau ,您可以注册 14 天的试用版)。
(3) Tableau 接口&连接数据源
在 Tableau 上构建报告之前,您需要在 Tableau 工作区中做的第一件事是创建一个项目,该项目存储所开发的报告的工作簿。
创建项目和工作簿(作者图片)
在菜单栏上—选择“浏览”→创建“项目”→在创建的项目中创建工作簿。
数据连接器列表(图片由作者提供)
第一次打开新工作簿时,Tableau 会提示您连接到数据。Tableau 提供的一个很棒的功能是不同连接器的列表,允许您连接到各种数据源,无论数据是本地文件、文本文件、本地数据库还是云中的数据,如 Google Big Query、Cloudera Hadoop 等。可用连接器列表可在“连接器”选项卡上查看。此外,单个 Tableau 工作簿可以连接到来自不同数据源的多个数据集。这些多个数据集可以在 Tableau 中使用“Join”表功能相互连接,或者在不同的工作表上单独使用。
我们将使用 Tableau 平台提供的可用公共数据集—超级商店数据样本。超级商店数据示例包含按类别、子类别、销售额、利润等分类的产品信息。如果您想下载数据并手动导入,您可以从 Kaggle 下载 CSV 文件。
连接到超级商店数据源(Gif by Author)
在“连接到数据”对话框中,选择“超级商店数据源”并单击“连接”。连接到数据源后,将打开一个新的工作表,这是一个空白的工作表,您可以在其中开始开发您的第一个可视化视图。
数据源(作者 Gif)
要更好地查看导入的数据,请选择“数据源”选项卡进行导航。在 Data Source 选项卡中,我们可以查看连接的数据源和关于数据的其他详细信息,例如列的类型和值。数据网格提供了默认情况下连接的前 100 条数据记录的示例视图。
现在,让我们开始回到工作表视图,以便更好地理解开发可视化的界面。
了解 Tableau 工作区界面(图片由作者提供)
上图显示的是“Sheets”视图,这是我们构建可视化的地方。让我们来看一下界面上可用的组件:
(1)数据来源:
- 单击 Data Source 选项卡会将您带到 Data Source 页面来查看您的数据集。
(2)工作表/仪表板/故事选项卡:
- 工作表标签表示工作簿中的工作表,并表示用于开发可视化的工作空间(也表示特定的可视化,如条形图、饼图等)。)
- 仪表板标签代表一个区域,用于组合从多个工作表创建的可视化。
- story 选项卡可以像故事书一样包含顺序排列的表或仪表板的组合,以故事格式与他人共享信息。
(3)菜单:
- 菜单栏由各种不同的命令组成,如文件、数据、工作表、仪表板等。
(4)工具栏:
- 工具栏允许执行各种功能,如保存工作簿、添加新数据源、添加新工作表、复制工作表、清除当前工作区、按升序或降序对图表排序等。
(5)数据窗格:
- 数据源连接和数据字段显示在数据窗格部分。
(6)分析窗格:
- 分析窗格附加分析功能,如添加参考线、平均线、箱线图、分布带、趋势线、预测等。通过将分析窗格中的函数拖放到视图上,可以轻松地将它们添加到视图中。
(7)维度:分类值
- 由我们的数据集中被 Tableau 视为分类的列/字段组成。分类值允许我们对数字数据进行分割。(注意分类值的图标颜色为蓝色)
(8)测量/度量:连续值
- 由我们的数据集中被 Tableau 视为数字的列/字段组成。(注意数值图标颜色为绿色)
提示:如果分配错误,您可以通过右键单击字段并选择“转换为度量”来手动将字段从分类转换为度量,反之,也可以将字段从度量转换为离散或维度。
(9)货架和卡片:
- 这些是行架、列架、页架、过滤器架或标记卡。根据添加的数据,将列从数据窗格拖到卡片和架子上会在视图区域中创建可视化效果。
(10)视图:
- 这是创建可视化的工作区的画布。
如果您想了解工作区环境的更多细节,如按钮参考、状态栏等,您可以参考 Tableau 帮助页面上的文档。
(4)了解我们的数据集
超市数据源(图片由作者提供)
Tableau 附带的示例超级商店数据源是一家销售家具、办公用品和技术产品的全球零售连锁店,每行包含每个订单的订单详细信息和信息,如运输模式、客户名称、地区、城市、州、产品类别、子类别等。这个数据集中总共有 20 个字段和 9994 行或记录。
现在,假设我们在一个场景中,您扮演商店经理的角色,利益相关者希望获得以下信息:
(1)哪个品类的产品最赚钱?
(2)哪个类别在各个地区/州的表现更好?
(3)随着时间的推移,利润&销售趋势如何?
让我们看看如何从我们的数据集中获得利益相关者要求的信息,并构建一个图表来可视化它们并获得答案!
(5)建筑可视化
我们将从所需的最简单的信息开始构建— 哪一类产品最有利可图?
图表 1:按类别划分的利润(按作者划分的 Gif)
我们将构建一个高层次的概览来查看所有商店按类别细分的总体利润。
步骤 1:将列[ category ]从数据窗格拖到列架中。
第 2 步:将[sum(profit)]从数据窗格拖到行架上。
~请注意 Tableau 如何基于所选的测量名称&值自动创建视图
步骤 3:在右上方,有一个演示选项,它是 Tableau 根据所选的测量名称和值提供的关于可以使用的其他选项的建议。例如,在我们的场景中,建议使用饼图、条形图、打包气泡图等。单击“打包气泡”选项,查看图表如何变换。
第 4 步:将[sum(profit)]添加到标记架下的标签图标,以在图表中显示利润值。
- 调整标注文本大小-右键单击标记架下的标注并选择编辑标注,高亮显示文本并选择字体大小。
第 5 步:使用图表颜色——右键单击标记架下的颜色,然后选择编辑颜色,选择您喜欢的颜色。
第 6 步:通过点击文本重命名标题,重命名为——按类别盈利。
步骤 7:从工具栏上的 fit 图标将视图设置为整个视图,将可视化效果置于中心。
图表 1:按类别分类的利润(按作者分类的图片)
从包装泡沫图中,我们可以立即看出,根据泡沫的大小,“技术”类别的利润最高,而“家具”类别的利润最低。这表明超市的盈利能力高度依赖于科技产品,其次是办公用品。
祝贺你,你刚刚完成了你的第一个可视化画面!🤗
接下来,让我们更深入地探讨一下,在每个地区/州,哪个类别的表现更好?在新的工作表中构建这个新视图,通过底部的图标添加一个新的工作表。
图表 2:各州各地区分类销售情况(作者 Gif)
层次结构概念可用于确定按地区和按州的销售业绩。例如,在我们的场景中,可以根据位置从较高的级别创建层次结构:区域→州→城市。
步骤 1:将[国家/地区]、[地区]、[类别]列从数据窗格拖到列架上。
第 2 步:将列[sum(Sales)]从数据窗格拖到行架上。
步骤 3:根据类别向图表添加颜色—将[类别]拖到标记架下的颜色图标上。
Tableau 工具栏(图片由作者提供)
第 4 步:交换行和列——Tableau 有一个快速功能,可以立即将行切换到列,将列切换到行。要执行这些更改,只需选择工具栏上的“交换行和列”图标。
第 5 步:根据类别内的销售总额对条形进行降序排序——要执行这些更改,只需选择工具栏上的“降序排序”图标。
Tableau 中的层次结构(图片由作者提供)
步骤 6:通过单击字段[国家/地区]中的(+)按钮,从进入状态视图。
第七步:通过点击文本重命名标题,重命名为——各州各地区分类销售。
图表 2:各州各地区的分类销售额(图片由作者提供)
从层次结构图中,我们可以用一种交互式的方法来查看地区、州甚至城市的销售额。这使我们能够快速识别每个状态下哪些类别的表现更好。例如,技术产品在阿拉巴马州有更好的销售,家具在亚利桑那州表现更好。这让我们更好地了解每个州的不同需求,并有助于资源规划。
干杯!我们完成了第二个可视化的构建,并学习了如何使用层次结构来深入查看更详细的视图。😎
我们的下一个可视化添加了一个小的时间序列,用于确定— **利润&销售随时间的趋势是什么?**同样,从底部的图标为我们的第三次可视化添加一个新的工作表。
利润和销售趋势(作者 Gif)
该可视化引入的概念是参考线和趋势线,它们是“分析”选项卡下提供的功能。参考线向视图添加参考点。(例如:如果您正在查看几个产品的每月销售额,添加一条参考线作为平均销售额标记可以让您快速查看每个产品相对于平均值的表现)。趋势线突出显示趋势并显示基于数据的总体趋势,Tableau 提供不同的趋势线算法,包括—线性、对数、指数、多项式&幂。然后,Tableau 将根据选择的算法构建一个线性回归模型。现在让我们进入构建第三视图所需的步骤。
步骤 1:将列[Year(Order Date )]从数据窗格拖到列架中(注意,日期字段从年份开始,因为 Tableau 会自动为日期属性创建一个层次结构)。
步骤 2:向下钻取到月份字段并删除季度字段。
步骤 3:将[sum(Sales)]和[sum(Profit)]列从数据窗格拖到行架上。
第四步:切换到分析标签,并添加平均线和趋势线。
- 将“平均线”从“分析”选项卡拖到视图中,然后选择“表格”
- 将趋势线从分析选项卡拖到视图中,并选择“线性算法”
第五步:在马克卡下面为利润和销售额图表选择一种颜色。
第六步:通过点击文本重命名标题,重命名为——利润和销售趋势。
图表 3:利润和销售趋势(图片由作者提供)
在这张图表中,我们可以看到销售额和利润呈上升趋势,利润和销售额在接近年底时逐渐增加。此外,高层视图显示,每年 10 月份的销售额都会有所下降。这是一个可以被研究以识别新的商业机会的领域。
太好了!我们完成了第三次可视化的构建,并学习了如何使用 analytics 选项卡上的可用功能。😜接下来,我们将创建第一个仪表板,它将所有 3 个视图合并成一个仪表板。
(6)构建最终仪表板
首先,我们没有添加新工作表,而是从工作区底部的图标中选择“添加新仪表板”。
在 Tableau 中添加新仪表板(图片由作者提供)
仪表板是一种很好的方式来呈现一个或多个视图,包括在每个工作表、文本、图像、网页等中开发的可视化。请注意,在仪表板页面上,我们可以看到左侧已经开发的所有三个表单。要将所有 3 个视图添加到仪表板中,只需将工作表拖动到仪表板区域。
构建仪表板(Gif by Author)
第 1 步:将所有 3 张表拖动到仪表板区域。
- 请注意,第一个视图会自动填充整个仪表板区域。
- 调整每个可视化的大小
使用“文本”添加标题(图片由作者提供)
步骤 2:通过将文本对象拖入仪表板视图来添加标题。给一个标题:超市利润和销售仪表板。
向视图添加过滤器(按作者排列的图像)
步骤 3:添加过滤器
- 要添加过滤器,请导航回我们的第三张可视化工作表。
- 将[订单日期]拖至过滤器架,并选择按年份过滤。
- 右键单击属性[YEAR(Order Date)]并选择 show filter,一个交互式过滤器将被添加到右侧的视图中。
- 请注意,工作表中被筛选的内容也将反映在仪表板工作表中。
在仪表板视图中添加过滤器(按作者排序的图像)
步骤 4:从仪表板筛选
- 切换回仪表板选项卡,通过选择第三个可视化效果→过滤器→订单日期年份上的下拉选项来添加过滤器
- 试着摆弄一下过滤器,你注意到了什么?该过滤器仅适用于利润和销售趋势图。
- 要使过滤器也适用于其他可视化,只需选择“订单年数据过滤器”→“下拉选项”→“应用于工作表”→“全部使用此数据源”。
第五步:此外,美化你的仪表板,从布局选项卡添加颜色,边框,填充。
构建最终仪表板(图片由作者提供)
干得好!我们最终构建了一个仪表板,它将我们的可视化结合到一个添加了交互式过滤器的视图中。😄
除了在 Tableau 中构建仪表板,用户还可以选择将他们的视图组合成一个故事。Tableau 中的故事是一个或多个工作表或仪表板的遍历,每个视图或仪表板都被视为一个故事点。如果你想了解更多关于 Tableau 的故事,你可以参考 Tableau 帮助页面上的文档。
结论:
数据可视化仍然是数据科学家需要的一项重要技能,我认为这是一项容易学习的技能,但要成为一名优秀的讲故事者需要时间来掌握,方法是构建一个能够吸引观众注意力并传递正确信息的可视化工具。为了培养这些技能,需要大量的实践、阅读、观察和参考其他仪表板设计。最后,在您开始学习数据可视化之前,了解您正在使用的工具,熟悉该工具,从那时起,您可以慢慢提高您的技能。
感谢你阅读我的文章,如果你喜欢并愿意支持我:
参考和链接:
[2]科尔·努斯鲍默·克纳弗利奇(2015)。用数据讲故事:商业专家数据可视化指南
从数据科学访谈到开源 GitHub 项目
社区笔记
我分享了我的故事以及从这次旅程中学到的教训
由 Avel Chuklanov 在 Unsplash 上拍摄的照片
一切从几年前的一次数据科学面试开始。这次采访没有让我找到工作,但帮助我建立了一个开源项目,现在已经有几个贡献者,在过去的一年里,它的媒体白皮书每天都有超过百次的浏览量。我们所有人在生活中都会经历失败。那不重要。重要的是从失败中吸取教训,并把它变成有影响力的事情。我们可以用积极的态度从失败中建立一个发射台。然而,这篇文章并不具有激励性。相反,我分三集分享了我构建这个开源项目的故事,以及一些可能对你的职业道路有所帮助的经验教训。
[第 1 集]获得数据科学面试
几年前,我面试了一家科技公司的数据科学家职位。作为带回家的作业,我被要求解决一个典型的旅行推销员问题。在问题描述中,据说该解决方案将在超过 100 个节点的数据集上进行测试,执行时间最多为 5 分钟。从描述(尤其是时间限制)中,我可以猜到面试官期待一个为行业量身定制的创意解决方案。
我对这家公司感到兴奋,喜欢这种挑战。我发现一种叫做 2-opt 的优化方法被强烈推荐给 TSP,主要是因为它的启发式算法与问题相关。我以前曾经使用过启发式优化技术,而且,完整地说,它们是我的最爱!我决定实施 2-opt 算法,这样我就能在面试中胜出。那是一个周末。我呆在家里,完美地完成了作业。几天后,我见到了我的采访者,他们都对这个实施感到惊讶。面试进入了下一轮,由于一些内部政治,我的申请被停止了。这对我来说不是一个快乐的时刻,但我必须离开。
你的时间和精力是有限的。你不能奢侈地花掉它们而没有回报。总是考虑一个应急计划。
[第 2 集]创建了一个 GitHub 项目,构建了一个 PyPi 包
面试几个月后,我决定把这个带回家的作业做成一个 Github 项目。最后,拥有一个 Github 项目是向外界展示我的编码技能和知识的最好方式之一。同时,我相信一个不符合软件开发最佳实践的 Github 项目是不值得的。所以,我决定让它更专业。怎么会?通过编写好的文档,开发几个测试,构建 CI/CD 管道,并在项目中进行最佳的编程实践。
https://github.com/pdrm83/py2opt
我还构建了一个名为 py2opt 的 PyPi 包。我以前用过很多社区开发的 Python 包。所以,我在想为什么我不应该回报。在这次旅行中,我学到了很多东西。在 PyPi 包的第一个版本发布几个月后,我收到了一封来自 10000 英里外的学生的电子邮件,感谢我并问了我一个问题。感觉很好。你可以感觉到你开发的东西解决了某人的问题。
如果你想创建一个 Github 项目,请注意所有的细节。仅仅将代码推送到一个随机的存储库是不会有任何结果的。
https://pypi.org/project/py2opt/
【第三集】写了一篇中等文章,并使之官方化!
在确信 py2opt 包的质量之后,我写了一份白皮书解释我的实现。我将 2-opt 算法与动态规划和模拟退火进行了比较,并展示了我的实现执行得有多好。这对我来说是一个转折点。白皮书已经被 Google 通过搜索关键词“如何解决 TSP”索引到wikipedia.com
、math.uwaterloo.ca
等多个合法网站之上。这有助于我的文章和 Github 库获得非常稳定的日访问量(大约 100 次/天)。
持续的每日流量有助于我的开源项目获得社区的关注。我的 2-opt 实现高效而快速。然而,在一个公共拉请求中,实现变得更快了。谢谢, Clawsoon !这就是社区的力量。目前,我正在到处宣传这个项目,以确保更多的人了解这个项目。
如果没有适当的公告,即使是最好的开源项目也可能无法吸引社区的注意。一篇 TDS 文章有助于获得这一点。
最后,看看克劳森在他的个人主页上的留言。我也非常感谢你,克劳森!
感谢对 2-opt 算法的精彩介绍!这篇文章和代码对我都很有帮助。
我找到了一个优化,使得我的旧的、慢的机器上的较大数据集更快。我意识到该算法只需比较交换中涉及的距离,而不是每次都重新计算整个路径长度。这使得我计算 1000 个随机生成的城市的 2-opt 路径的时间从 10 分钟减少到了 5 秒。
我希望你会发现我的贡献有用!请随意纠正你看到的任何错误。
遗言
在 py2opt 项目之后,我又开发了三个开源项目,尤其是其中一个名为 sent2vec (一个很酷的 NLP 工具)的项目吸引了社区的更多关注。然而,我的旅程是从 py2opt 开始的,我永远不会忘记看到其他开发人员对项目的贡献时的感受。我相信这个简单的工具甚至可以为大项目做很多事情。
如果你想找一个数据科学的职位,我建议你创建一个开源项目,或者参与其中。尝试在项目中使用(并展示)你的编程技能。它或者帮助你找到一份理想的工作,或者建立一些你几年后会引以为豪的东西。谁知道呢!
感谢阅读!❤️
如果你喜欢这个帖子,想支持我…
https://pedram-ataee.medium.com/membership
从 A*到泥灰(第一部分——MAPF)
几个机器人,绝望地等待算法来建议他们如何在这个世界上行动。图片来自 Unsplash 。
对人工智能规划理论与当前多智能体系统强化学习研究之间的联系的直观高层次概述
在过去的十年中,强化学习和多智能体强化学习算法的研究取得了迅速的进展。有人可能会认为这是由于深度学习的兴起及其架构在 RL 任务中的使用。虽然在某种程度上这是真的,但 RL 的基础在于人工智能规划理论(已经发展了 50 多年),RL 可以被认为是被公式化为学习系统的规划问题。然而,RL 和规划理论之间的联系似乎很模糊,因为前者主要与当今大多数从业者的深度学习有关。
这一系列文章旨在从经典的寻路问题开始,对我们正在处理的世界进行严格的假设(确定性的、集中式的、单代理等)。)和逐渐放弃假设,直到我们以泥灰问题结束。在这个过程中,我们将看到几种适合不同假设的算法。然而,我们总是假设代理是合作的。换句话说,他们一起行动来实现一个共同的目标。
值得注意的是,本系列将集中在从 A*到 MARL 的“多代理系统路径”上。这将通过阐明我们想要解决的问题和我们对我们所处的世界所做的假设来实现。它当然不会是对所有算法及其在每个主题上的改进的深入回顾。
具体来说,我将回顾最优多智能体寻路(第 1 部分)、经典规划(第 2 部分)、不确定性下的规划(第 3 部分)以及部分可观测的规划(第 4 部分)。然后,我将结束我们在 RL 的旅程,并将其推广到多智能体系统(第 5 部分)。我将挑选有代表性的算法和想法,并在需要时向读者推荐深入的评论。
第 1 部分—路径查找
A 和 b 之间的两条最短路径图片来源。
寻路的根本问题是寻找两点之间的最短路径。具体来说,在寻路中,我们假设我们要为一个单智能体解决问题。此外,我们假设:
- 时间是离散的,一次只能采取一个动作。
- 动作是确定性的和无持续时间的,即应用动作是即时的,并且它将通过确定性函数来改变状态。
- 我们对世界有全面的了解,即障碍物在哪里,有多少个点,等等。
当然,我们还做了其他假设(即代理是合作的,而不是自利的)。然而,我的目标是只明确地写出那些我们很快就会试图放弃的假设。
人工智能中用于解决寻路问题的经典算法是 A*。给定一个加权图,A维护一个从起始节点开始的路径树,并根据启发式算法一次扩展这些路径的一条边,直到到达目标。如果您对图、试探法和 A还不熟悉,请点击链接查看对图和 A* 的精彩介绍。
推广到多智能体路径发现(MAPF)
A*解决了单智能体寻路问题。但是,在许多现实世界的应用中,我们要处理多个代理。因此,MAPF 举例说明了为所有代理找到最短路径以到达他们的目标而没有冲突的问题(即,没有几个代理可以同时在同一位置)。
我们所说的“最短”是什么意思?
对于单个代理,我们寻找它需要执行的最少数量的动作来达到它的目标。对于多个代理,目前有两个主要的路径长度度量标准:
- 成本总和 —听起来,简单地将所有代理路径的成本相加。
- 最大完工时间 —取最大单个代理成本。
显然,针对每个度量进行优化将会产生不同的最短路径解决方案。我将把重点放在优化成本总和的算法上。
指数搜索空间
幸运的是,A*时间复杂度是多项式的(给定一个好的启发)。通常,在计算机科学中,多项式运行时间被认为是有效的。能不能推广到多智能体,保持多项式时间复杂度?
首先,我们需要记住一个* 分支因子。图的分支因子是每个节点的子节点数。对于具有单个代理的 A*,其中代理在每个时间步执行一个动作(来自 b 动作),分支因子是 b 。对于有 k 个代理的 A*,在每个时间步,我们需要考虑所有代理(k)的所有可能行动(b),留给我们一个 b^k 的分支因子。对于一个有 5 个可能动作(等待,或向右/向左/向上/向下移动)的简单网格世界,20 个代理的分支因子是 5 ⁰ =95,367,431,640,625。显然,把 A*简单地推广到 MAPF 是不可行的。此外,MAPF 已经被证明是 NP 难的。
A*改进
那么,我们如何解决这个指数分支因子呢?早在 2010 年,Stanley提出了一个简单而强大的想法——让我们试着将问题分成更小的子问题,并解决每个子问题!具体来说,他提出了一个名为独立性检测(ID) 的迭代算法,该算法首先为每个代理单独搜索最短路径,并检查冲突代理。当发现几个冲突的代理时,它们被合并成一个组。重复这个重新计划和合并组的过程,直到所有组的计划之间没有冲突。尽管该算法没有改善 A*的最坏情况时间复杂度,但事实上,它通过最大独立子问题中的代理数量将运行时间减少到指数级。
然而,对于仅由几十个代理组成的依赖组的问题,我们仍然有一个非常昂贵的搜索空间来探索。
所以斯坦德利建议修改搜索空间。正如我们现在所知,在 A的每个时间步,我们为所有代理的所有可能动作生成节点。然后,我们扩展具有最小 f 值(当前路径成本和未来成本的启发式预测之和)的节点。生成的成本高于最优成本的节点称为**剩余节点。**对 A的一个重要增强是避免生成多余的节点。
斯坦德利避免产生多余节点的方法叫做算子分解(OD) 。OD 建议为代理商申请订单。当扩展一个节点时,OD 只应用第一个代理的移动,引入一个中间节点。在中间节点,仅考虑下一个代理的移动,从而产生进一步的中间节点。当最后一个代理动作被展开时,生成一个常规节点。
所以基本上,算子分解用树的宽度换取深度,希望一个好的启发式算法可以避免多余节点的产生。
另一个解决剩余节点生成问题的算法是 增强型部分扩展 A (EPEA)** **。*尽管这里没有解释 EPEA,但重要的是要注意,实际上已经表明,给定关于域的先验知识,EPEA*在避免生成过剩节点的任务上优于 OD。
移动到另一个空间
以上所有算法都在代理状态空间上执行 A*。尽管 A*增强确实显著提高了算法的性能,但对于具有许多代理(超过 100 个)的大型地图,通常计算量仍然很大。因此,过去十年开发的两种 MAPF 算法试图改变它们搜索的状态空间。两者都可视为两级解算器。
ICTS 结合了高层次和低层次的求解器。高级求解器搜索**递增成本树(ICT)。**在 ICT,每个节点包含每个代理路径允许的长度为 k 的成本向量。ICT 根节点包含一个向量,该向量具有每个代理的最短路径长度的成本(不考虑其他代理)。然后,低层求解器的工作是验证是否可以通过在高层求解器定义的成本下为每个代理单独规划来找到联合解决方案。值得注意的是,ICTS 低级解算器不为代理一起规划,而是只检查给定成本下单个代理路径之间的冲突。
如果低级解算器未能在给定成本向量下找到不冲突的最短路径,则高级解算器通过生成 k 个 ICT 节点来扩展 ICT 根,其中每个节点对应于将一个代理的成本增加 1。高级解算器执行 ICT 的广度优先搜索(这保证找到最优解)。
3 个代理的 ICTS 算法图解。摘自 罗尼斯特恩的 幻灯片。
对我来说,ICTS 会做得更好,这感觉很奇怪,但是通过对低级解算器的良好实现(使用 MDD )和对 ICT 节点的修剪技术,ICTS 可能会胜过其他最优 MAPF 算法。
值得注意的是,ICTS 并没有神奇地消除时间复杂性的指数因素。它仍然是指数级的,但取决于另一个因素——信息和通信技术的深度。因此,直观地,当单独规划时,由于最优解单代理路径成本将进一步远离单代理路径成本,高级求解器将需要建立更深的 ICT。ICTS 时间复杂度与深度成指数关系。
CBS 也是一个两级求解器,在不同的状态空间中搜索。具体来说,它在冲突空间中搜索。
CBS 将代理与**约束相关联。**为特定的代理人 (a) 定义一个约束,一个他必须在特定的时间步( t )避开的位置( v )。一个约束由一个元组( a , v,t )表示。
对于每个单个代理,CBS 低级解算器搜索在给定一组约束的情况下一致的最短路径。CBS 高级解算器搜索**约束树(CT)。CT 是一棵二叉树,其中每个节点包含一组约束和一个与约束一致的解(一致意味着满足所有约束)。低级解算器为每个单个代理找到一致的解决方案。**然后,CBS 高级解算器检查单代理最短路径中的冲突。如果没有发现冲突,我们就找到了最优方案。然而,如果发现冲突,高级解算器分割相应的 ct 节点并生成具有避免我们发现的冲突的约束的节点。在 CT 上执行最佳优先搜索可以保证找到最优解。
一个典型的 MAPF 例子。CBS 将在时间步长 2 的位置 C 为其中一只老鼠生成一个带有约束的节点,然后将找到一个最佳的连接路径。图片来自哥伦比亚广播公司的论文。
在 CBS 开发的 6 年间,它作为一种强大的 MAPF 算法出现,并被建议进行许多改进。正在解决的主要缺点是它的运行时间与它需要解决的冲突数量成指数关系。因此,在有许多冲突的拥挤问题中,它将表现不佳。
将 MAPF 归结为另一个 NP 难问题
MAPF 的另一个有趣的工作是通过简化到其他 NP 难题。其背后的想法是,在过去的几十年里,研究人员已经为其他 NP 难题开发了强大的算法。因此,我们不需要开发 MAPF 算法,只需要减少 MAPF,使用现有的解算器。
我不会深究这些减少的细节,但我会声明这一系列的研究最近被证明可以产生非常强大的 MAPF 算法。成功解决 MAPF 约简的 NP-Hard 问题的部分列表包含布尔可满足性 (SAT)、混合整数规划 (MIP)、约束规划 (CP)。
那么…我应该使用什么 MAPF 算法呢?
嗯,看情况。基本上,如果你知道你的 MAPF 域的具体性质(它是一个大图吗?有多少特工?代理人拥挤吗?),目前的研究有一些关于使用什么算法的指导方针。然而,为 MAPF 问题选择最合适的算法目前正在研究中。最近,对不同的 MAPF 算法进行了全面的分析,并指出一些算法优于其他算法的情况。
动态问题需要不同的算法
一个自主交叉路口模型,其中每辆车都是一个代理。交集旨在最小化由几个代理之间的协调引起的延迟。视频来自 瞄准项目 。
MAPF 的动态变体将其扩展到广泛有趣的实际问题(如自主路口管理)。这是 MAPF 的一个非常有趣的变体。但是,在这一系列文章中,我们将重点放在从 A*到 MARL 的“多代理路径”上,不会深入探讨。我鼓励好奇的读者阅读关于在线 MAPF 和终身 MAPF 的论文。
结论
我们从单个智能体的最短路径搜索这一基本问题出发,将其推广到多智能体的路径搜索问题。我们看到,即使对于那个相对“简单”的问题,我们假设对世界、离散时间和确定性行为有全面的了解,找到一个最优解也是困难的,甚至可能是棘手的。然后,我们听到了 MAPF 对动力学问题的有趣概括。当然,MAPF 还有许多其他有趣的变体,比如自利的代理人,但我关注的是经典的 MAPF 问题。
接下来,我们将看看 AI 规划的广义问题,这是当我们的代理可以做的不仅仅是移动,而且需要完成更复杂的目标时的情况。然后,我们将继续去除越来越多的假设,直到我们最终得到多智能体强化学习。
确认
我要感谢我的理学硕士论文导师罗尼·斯特恩。我对这一领域和本博客系列的大部分内容的兴趣源于他在本古里安大学教授的关于多代理系统的精彩课程,我有幸参加了该课程。
从 A*到 MARL(第二部分——人工智能规划)
许多智慧生物一起计划。人造的也能做到吗?图片来自 Unsplash 。
对人工智能规划理论与当前多智能体系统强化学习研究之间的联系的直观高层次概述
在过去的十年中,强化学习和多智能体强化学习算法的研究取得了迅速的进展。有人可能会认为这是由于深度学习的兴起及其架构在 RL 任务中的使用。虽然在某种程度上这是真的,但 RL 的基础在于人工智能规划理论(已经发展了 50 多年),RL 可以被认为是被公式化为学习系统的规划问题。然而,RL 和规划理论之间的联系似乎很模糊,因为前者主要与当今大多数从业者的深度学习有关。
这一系列文章旨在从经典的寻路问题开始,对我们正在处理的世界进行严格的假设(确定性的、集中式的、单代理等)。)和逐渐放弃假设,直到我们以泥灰问题结束。在这个过程中,我们将看到几种适合不同假设的算法。然而,我们总是假设代理是合作的。换句话说,他们一起行动来实现一个共同的目标。
值得注意的是,本系列将关注从 A*到 MARL 的“多代理系统路径”。这将通过阐明我们想要解决的问题和我们对我们所处的世界所做的假设来实现。它当然不会是对所有算法及其在每个主题上的改进的深入回顾。
具体来说,我将回顾最优多智能体寻路(第 1 部分)、经典规划(第 2 部分)、不确定情况下的规划(第 3 部分)和部分可观测的规划(第 4 部分)。然后,我将结束我们在 RL 的旅程,并将其推广到多智能体系统(第 5 部分)。我将挑选有代表性的算法和想法,并在需要时向读者推荐深入的评论。
第二部分——人工智能规划
在第 1 部分中,我们处理了寻路问题,我们的目标是为一组代理找到从起点到终点的最短路径。在这篇文章中,我们将讨论人工智能规划,它可以被认为是 MAPF 问题的推广。总的来说,计划的任务是找到一系列动作,这些动作将把开始状态转变为目标状态。我们将从单智能体规划问题开始,并推广到多智能体,类似于我们上一篇文章中的路径。
人工智能规划简史
从早期开始,人工智能规划的圣杯就是创造一个独立于领域的问题解决者。这个独立于领域的问题求解器有望解决所有类型的规划问题,从玩游戏到制作 cookies。1959 年, GPS 论文介绍了一种通用问题求解器,可以解决由良构公式表示的问题。它是为定理证明而设计的。然而,由于几个原因,它不太适合规划问题。例如,如何表达并发事件和生成的计划的偏好是不直观的。
这项工作激励了斯坦福研究所的研究人员,他们已经在机器人Shakey上工作,开发了一种适合于规划的格式良好的语言和领域独立的规划算法,称为 STRIPS 。几年来,其他几种语言和规划者被提出。具有不同表达能力的几种不同语言的发展,使得规划者之间的比较成为一项困难的任务。一项标准化人工智能规划的尝试在 1998 年完成,叫做 PDDL。
机器人 Shakey,60 年代的一个高影响力研究项目。哦,你问为什么是“Shakey”?嗯,“抖得厉害,绕着转。图片来自维基百科。
经典人工智能规划假设
在经典规划问题中,我们处理可以完全观察到的确定性环境。目前,我们还假设只有一个代理。
规划领域定义语言(PDDL)
PDDL 是一种我们用来定义初始状态、目标状态和我们的代理可以执行的动作的语言。本质上,PDDL 问题是由条件、动作、初始状态和目标状态定义的。一组条件描述了一种状态,以及由它们引起的效果和它们适用的先决条件所定义的动作。
一个著名的规划例子是空运货物装载问题。我们将关注一个简单的问题,有两个城市(TLV 和纽约),两架飞机(P2 的 P1)和两种不同的货物(C2 的 C1),我们希望在这两个城市之间中转。在我们的初始状态,我们在 TLV 有 C1 和 P1,在纽约有 C2 和 P2。我们的目标是让 C1 在纽约,C2 在 TLV。让我们在 PDDL 写吧。
Init(At(C1, TLV) ∧ At(C2, NYC) ∧ At(P1, TLV) ∧ At(P2, NYC))Goal(At(C1, JFK) ∧ At(C2, SFO))
现在是时候定义行动了。基本上,我们希望我们的飞机能够装载货物,在城市之间飞行,然后卸载货物。非常简单。它可以简单地定义为:
action(LOAD(cargo,plane,city),
precondition: At(cargo,city) ∧ At(plane,city)
effect: ¬At(cargo,city) ∧ In(cargo,plane))action(FLY(plane,from,to),
precondition: At(plane,from)
effect: ¬At(plane,from) ∧ At(plane,to))
请注意,即使这可能是不直观的,一旦飞机装载货物,货物就不再被定义为在城市,如“装载”动作的效果所定义的。此外,您可能已经注意到“卸载”操作不见了。你自己能想出来吗?
重要提示— 为了全面定义 PDDL 的问题,我们需要正确定义我有意跳过的其他一些东西。例如,我们需要定义我们正在使用的类型(货物、飞机等。).你会在真实的 PDDL 问题定义中遇到这种情况,但我相信这并不是理解一个经典人工智能问题的本质所必需的。如果你对完整的定义感兴趣,我写在纸条上——瞎搞。你可以解决它,找到 6 步解决方案!
人工智能规划算法
既然我们知道如何定义我们的计划问题,是时候学习如何解决它了。解决规划问题的简单方法是首先将所有适用的动作应用于初始状态,以创建一组后续状态。然后,我们将继续对这些后继者应用所有适用的动作,直到我们达到目标状态。然而,由于适用的动作数量可能相当大,这种幼稚的方法是不切实际的。它是否让你想起了不知情的图搜索算法,比如 BFS/DFS?是的,就是这样。因此,人们可能会要求遵循一个 A知情的方法,并使用启发式。事实上,从经典的寻路中,我们知道添加一个好的可接受的启发式算法对于有效地解决大型状态空间问题是必不可少的。还有,我们记住,对于 A到保证最优性,启发式必须是https://en.wikipedia.org/wiki/Admissible_heuristic#:~:text=In computer science%2C specifically in,current point in the path.(即永远不要高估达到目标的成本)。
独立于领域的计划者的试探法
然而,一个问题出现了。我们怎样才能提出一种启发式方法,以一种独立于问题的方式,对特定问题的知识进行编码?我们需要一种方法,从 STRIPS 问题定义中自动生成一个可接受的启发式函数。一种简单的方法是将我们的规划问题 P 简化为一个更简单的问题 P ,计算 P
的最优成本,并将其用作启发式算法。P 的一个可能的放松是移除所有动作“负面影响”(即,使条件为假的所有影响)。例如,在 p '中,即使在将货物装载到飞机上之后,它也停留在机场中。尽管这种方法确实会产生可接受的启发式算法,但是计算它可能仍然是 NP 难的,这错过了启发式算法的目标,即有效地通知搜索朝向目标**。**
1998 年, HSP 算法提出了一种近似启发式的方法。本质上,它建议解耦目标条件,并计算来自给定状态的动作数量,以分别满足每个条件。那么,启发值将是实现所有条件的所有动作的总和。
状态 s 中的启发式值是实现目标 g 的每个条件 p 的动作的总和。
为了计算满足每个条件的动作数量,我们迭代地更新下面的函数,直到观察到其值没有变化:
达到一个条件的动作数 p 迭代更新,直到函数不变。
在每一次迭代中,我们应用其相应的前提条件在当前状态下成立的所有动作。
假设目标条件是独立的,并且解决宽松的 p '问题结果给我们提供了信息启发,正如在各种 AI 规划竞赛中所示,这对于解决大型问题是有用的。然而,这些假设是有代价的。这种试探是不允许的,因为独立的目标条件可能包含多余的行动。
然而,如果我们选择用解决问题的数量来换取最优化,我们可以创造一个信息量较少但可接受的启发。我们可以采用上述启发式算法的一种变体,称为“最大启发式算法”。基本上,我们不是对所有独立的目标条件求和,而是取要满足的动作数量最多的条件。
通过计算实现目标的一个独立条件的最大动作数,给出一个可接受的启发。
倒退!
无论我们使用的是允许还是不允许的启发式算法,我们仍然需要为每个状态计算它,以便在启发式搜索算法中使用它,例如 A。为每个状态计算这个启发式算法消耗大约 80%的搜索时间*。一个简单而有效的解决方案是反转搜索方向。向后搜索,从目标状态到起始状态,称为回归搜索。**
直观上,回归法就是“我要吃饭,所以我需要做晚饭,所以我需要有吃的,所以我需要买菜,所以我需要去商店”的过程。在每一步,它选择一个可能有助于满足目标条件之一的动作。
使用回归方法的关键点是初始状态在搜索过程中不会改变,因此我们可以利用已经计算的启发式算法,并且更有效地执行搜索。关于使用 HSP(表示为 HSP-r)的回归方法的实现,我忽略了一些微妙的地方。更多细节可在 HSP-r 文件中找到。
超越搜索算法
正如我们之前了解到的,在 MAPF 问题中,为一个问题开发的算法可能对解决另一个问题有用。在人工智能规划中也是如此,通过将规划问题转化为一个布尔可满足性问题 (SAT)来给出一个强大的规划器。一个这样的计划者叫做 SatPlan 。
快速回顾
在继续讨论多代理系统之前,让我们快速回顾一下。我们看到了一种语言来表示规划问题及其相应的领域,称为条形或 PDDL。然后,我们看到了为这些规划问题构建独立于域的求解器的几种方法。其中一些是天真的不知情的搜索算法,其他的稍微复杂一点。当然,这只是现有算法中试图解决人工智能规划问题的一小部分。查看关于人工智能规划的章节,了解更多详情。
推广到多智能体规划(MAP)
在我们的物流玩具示例中,有 2 架飞机。我们可以很容易地想象现实世界中数百架或更多飞机的物流问题。正如我们之前在 MAPF 的上下文中所学的,对多智能体系统的简单概括会导致相对于智能体数量而言更加困难的问题。地图也是如此。因此,我们需要找到一种有效的方法来利用现实生活中多代理系统的一个共同事实——不同的代理可能是松散耦合的。这种将规划问题分解成子问题并合并其解决方案的重复出现的主题是大多数多智能体系统的核心的基本思想。事实上,我们已经在 MAPF 看到了它,我们也将在下一篇关于 MMDP 的文章中看到它。
此外,现实生活中的多智能体规划可能涉及几个不同的团体,它们合作实现一个共同的目标,但是希望保持某些信息(即,动作和条件)的私密性**。考虑一个军事秘密任务,其中多个机器人在敌后协调工作。我们不希望每个机器人包含所有其他机器人的完整信息(例如机器人的数量、位置、设备等)。),因为它可能会受到损害。我们也可以想到几家企业为了一个特定的使命而合作,不想泄露私人信息。**
目前,据我所知,在多智能体规划领域,多智能体规划的隐私保护算法是一个非常活跃的研究领域。虽然它的动机是隐私保护,但它对分布式多智能体规划是有用的,这为松散耦合的多智能体规划问题提供了有效的算法。这是一个有趣的工作,但我们将跳过它,继续我们的道路上的泥灰岩。我建议好奇的读者去读一下脱衣舞娘、 MAFS 和安全 MAFS 。
结论
我们从独立于领域的规划问题的定义开始。在快速的历史回顾和一个条状玩具问题之后,我们学习了基于搜索的算法,如何从规划问题中自动提取启发,以及搜索方向的重要性。然后,我们看到了解决规划问题的非基于搜索的算法。我们研究了广义 MA-STRIPS 问题的情况,并看到了它在分布式规划者和隐私保护条件下的应用。
下一个,我们将继续我们的 MARL 之路,因为我们将放弃关于确定性动作和状态的全部知识的假设。特别是,我们将讨论马尔可夫决策过程(MDP)和部分可观测 MDP (POMDP),正如我们将在后面看到的,它们是基于模型的 RL 的基础。
确认
我要感谢我的理学硕士论文导师罗尼·斯特恩。我对这一领域和本博客系列的大部分内容的兴趣源于他在本古里安大学教授的关于多代理系统的精彩课程,我有幸参加了该课程。
从 A*到 MARL(第三部分——不确定性下的规划)
在计划的时候,我们不应该只依靠好运气。我们如何为不确定性做计划?图片来自 Pixabay 。
对人工智能规划理论与当前多智能体系统强化学习研究之间的联系的直观高层次概述
在过去的十年中,强化学习和多智能体强化学习算法的研究取得了迅速的进展。有人可能会认为这是由于深度学习的兴起及其架构在 RL 任务中的使用。虽然在某种程度上这是真的,但 RL 的基础在于人工智能规划理论(已经发展了 50 多年),RL 可以被认为是被公式化为学习系统的规划问题。然而,RL 和规划理论之间的联系似乎很模糊,因为前者主要与当今大多数从业者的深度学习有关。
这个博客系列旨在从经典的寻路问题开始,对我们正在处理的世界进行严格的假设(确定性的、集中式的、单代理等)。)和逐渐放弃假设,直到我们以泥灰问题结束。在这个过程中,我们将看到几种适合不同假设的算法。然而,我们总是假设代理是合作的。换句话说,他们一起行动来实现一个共同的目标。
值得注意的是,本系列将关注从 A*到 MARL 的“多代理系统路径”。这将通过阐明我们想要解决的问题和我们对我们所处的世界所做的假设来实现。它当然不会是对所有算法及其在每个主题上的改进的深入回顾。
具体来说,我将回顾最优多智能体寻路(第 1 部分)、经典规划(第 2 部分)、不确定条件下的规划(第 3 部分)和部分可观测的规划(第 4 部分)。然后,我将结束我们在 RL 的旅程,并将其推广到多智能体系统(第 5 部分)。我将挑选有代表性的算法和想法,并在需要时向读者推荐深入的评论。
第 3 部分——不确定情况下的规划
前一章讨论了确定性世界中的计划,计划者可以生成一系列行动,知道如果它们以正确的顺序执行,目标将必然产生结果。现在,我们转向非确定性世界的情况,在这里我们必须解决当事情不按预期发展时该怎么办的问题。
有人可能会对这个问题提出天真的解决方案。例如,我们可以(通过一些传感器)监控“故障”,并在这种情况下启动重新计划。然而,对于许多现实世界的应用程序来说,在每次失败时重新计划是不可取的,因为这样太慢了。另一方面,我们可以为计划执行过程中可能出现的每一种可能情况制定一个反应计划。它将生成一个快速且健壮的计划,然而为具有许多状态的非平凡域找到该计划将是非常昂贵的。因此,我们寻求在规划时处理不确定性并产生稳健计划的算法。
几乎任何事物都存在某种程度的不确定性。规划的时候怎么才能考虑进去呢?图片来自 makeameme 。
在上一篇文章中,我们学习了如何用长条/PDDL 来表示一个规划问题。我们用一组动作和条件定义了域。具体问题用初始状态和目标状态来定义。然而,如何扩展这种语言以包含不确定性并不简单。
规划社区采用了马尔可夫决策过程(MDP) 对问题建模。MDP 定义如下:状态、动作、转移函数、和奖励函数。状态和动作很简单,本质上与经典规划问题相同。转移函数为(s1,a,s2)的每个三元组分配一个概率。它定义了在状态 s1 应用动作 a 后,在状态 s2 结束的概率。****奖励功能简单地分配处于一种状态并执行一个动作的奖励。
将规划问题建模为 MDP 的关键假设是 马尔可夫属性 。基本上,它说鉴于现在,未来独立于过去。这就是为什么我们只能用(s1,a,s2)的三元组来定义它,认为(s1,a)是现在,s2 是可能的未来。如果我们不做这样的假设,我们将很难定义转移函数,因为我们需要将每条可能的路径与概率联系起来。然而,对于一个给定的问题,确定马尔可夫性质是否成立并不容易。一个玩具的例子将从这个 MSE 答案考虑一个有两个红色球和一个绿色球的骨灰盒。两次抽签都是从骨灰盒中进行的,没有更换。只知道最后一次抽球的颜色与知道两次抽球包含的信息不同。然而,在这篇文章中,我们将假设马尔可夫性质成立。我建议好奇的读者去读读马尔科夫或者不读马尔科夫。
形式上,根据马尔可夫性质,转移函数定义为:
过渡函数。它模拟了在状态 Si 中应用动作 Ak 时到达状态 Sj 的概率。
假设问题公式化为由状态、动作、奖励函数和转移函数组成的 MDP,我们需要定义什么是该 MDP 的最优解?经典的规划问题是从初始状态到目标状态的一系列动作。然而,单一的动作序列不适用于不确定性问题。因此,我们寻求一个从状态映射到行动的策略**。最优策略是使期望报酬最大化的策略。换句话说,在所有可能的政策中,遵循每个州的最优政策平均会产生**的最高回报。当我们以这种方式定义最优策略时,你看到我们所做的隐含假设了吗?在某种程度上,我们假设了一个理性的代理人。****
你们中的一些人可能想知道 MDP 是如何概括规划问题的?嗯,典型的经典规划问题可以被视为 MDP,其中世界是确定的,并且只有一个目标(例如,除了目标状态为 1 之外,所有状态的回报都为 0)。
在继续研究旨在为 MDP 找到最佳策略的算法之前,请注意,我们现在处理的不确定性仅源于控制误差,而非传感器误差。我们假设我们完全观察到状态,并且在观察中有确定性。
寻找最佳策略
求解 MDP 的算法旨在找到最优策略。我们把它定义为平均来说,从每个州获得最高回报的政策。在数学上,我们希望找到最大化一个价值函数整体状态的策略。对于策略(由 π 表示)在状态 s 的价值函数是:
策略 π 的值函数,在状态 s 评估
寻找最优策略归结为解决以下优化问题:
最优策略是为每个状态选择最大化价值函数的行动的策略。
如果阅读这些公式感觉令人生畏或不直观,就想一想它们的基本意思。他们建议,为了找出在每个状态下采取什么行动来实现最优政策,我们只需要对所有可能的状态进行平均,从该状态开始遵循政策,收集奖励,并根据出现的概率来衡量每个奖励。在你的头上运行它,它会突然看起来像一个非常天真的蛮力解决方案。
重要提示—
- 通常,会使用该公式的一个变体,将其扩展到考虑折扣奖励。折扣奖励基本上意味着提前获得的奖励比推迟获得的奖励更有价值,这是许多现实世界问题的情况。
- MDP 可以分为两类——有限和无限时域 MDP。简单来说,有限时域 MDP 处理的是执行时间跨度有限的问题,无限时域 MDP 处理的是“永远运行”的问题。在这篇文章中,我主要关注有限的 MDP。
这个优化问题最常见的算法,名为价值迭代和策略迭代,使用的是动态规划。主要思想是通过递归地将问题分解成更简单的子问题来解决问题。
值迭代&策略迭代
策略迭代算法在两个阶段之间交替——策略评估和策略改进。在评估阶段,我们将当前策略视为固定的,并计算每个状态的值函数。在改进阶段,我们根据上一阶段评估的价值函数修改策略,为每个状态选择最佳动作。我们执行几个评估和改进步骤**,直到策略没有变化**。换句话说,改进步骤不会改变在每个状态下要采取的行动。执行的阶段顺序如下:****
由策略迭代算法执行的一系列评估和改进阶段。
值迭代算法建议将这两个阶段合并为一个阶段。从设置为零的初始值函数开始(即,所有状态都具有值 0),它通过迭代每个状态的所有可能的动作并选择最大化当前奖励加上下一状态值函数的动作来更新值函数。它这样做,直到所有状态的值函数都没有变化。然后,使用最优值函数,通过选择使每个状态的值函数最大化的动作来构造最优策略。
因为这两种算法都是众所周知的,所以我不会深入算法实现的细节。我建议您查看一些简单而又不错的策略迭代和值迭代算法实现。此外,尽管这些算法倾向于在相对较少的迭代中收敛,但是每次迭代都要求计算时间至少与状态空间的大小成线性。这通常是不切实际的,因为状态空间随着感兴趣的问题特征的数量呈指数增长。这个问题有时被称为“维数灾难”。****
推广到多代理 MDPs
将我们描述的 MDP 推广到多智能体的情况,需要我们记住一个关于智能体本质的重要假设。我们假设他们是合作的,因为他们一起行动来实现一个共同的目标。关于非合作智能体的研究是介于博弈论和人工智能之间的一个令人兴奋的研究领域。它着重于两个(或更多)具有不同兴趣的主体,通过它们的报酬函数形式化,共存于同一个世界,并且它们的行为可以影响彼此的报酬。这是题外话,但我希望下次再写。
回到我们的多智能体 MDP (MMDP)与合作智能体的操作,以最大化联合奖励功能,有人可能会问,为什么我们不能把它建模为一个“大 MDP”,其中行动空间是所有智能体的联合行动空间,状态空间是所有智能体的联合状态空间。这当然是可行的,但是做了一个关键的假设,这个假设对于许多多智能体系统是不合适的。它假设存在一个中央实体**,该实体为所有代理导出计划并向他们发送各自的最优策略。因此,研究人员将注意力集中在分散的情况下,在这种情况下,每个代理人都应该得出自己的最优策略。在这种情况下,主要的挑战是如何将多个单独的最优策略组合成一个最优的联合策略。**
事实上,MMDP 为多智能体系统指定了一个分散的 MDP,其中每个智能体都知道完全问题 MDP** (所有状态,所有动作,以及所有智能体给定动作的状态之间的相应转移函数)。因此,每个代理都可以通过自己求解完全 MDP 来找到最优策略。从这些最优政策中,人们可以组成**联合政策。联合策略是每个状态到每个代理动作之间的映射。然而,从几个单独导出的最优策略构建一个联合策略能确保最优吗?不幸的是,没有。既然最优策略不是唯一的,我们怎么能确定所有的代理都遵循相同的最优策略呢?下面是一个简单而著名的例子,它说明了由于以分散的方式得出多个最优策略而需要协调。两个代理(命名为 A 和 B)解决联合 MDP。当两个代理移动到相同的位置(G1 或 G2)时奖励是 1,当他们移动到不同的位置时奖励是 0。这个 MDP 有两个最优策略,第一个是双方都选择去 G1,第二个是双方都选择去 G2。然而,如果代理人 A 选择了第一个最优策略,而代理人 B 选择了第二个,会发生什么呢?
一个双代理协调问题。图片来源。
这个问题一般被称为协调问题。解决这个问题主要有三种途径。首先,我们可以假设代理的能力是 沟通 (“让我们左转!”).第二, 共享约定 可以被定义,这将导致对所有代理的最优策略的一致选择(“按字典顺序选择动作。如果左右都可选,那就选左!”).第三,如果没有给出共享约定或通信,代理可以 学习协调 是否可以玩几个游戏(“啊-啊。我看到你在这种情况下选择向左。下次见!”).我们不会深入研究解决协调问题的不同算法。我鼓励你点击上面的链接获取更多信息。
然而,即使我们假设要解决的协调问题,让每个代理解决完整的 MDP 带来了很高的计算成本。正如我们在 MAPF 和多智能体规划中已经看到的,如果天真地对待多智能体问题,智能体数量的线性增长会导致计算复杂性的指数增长。一般来说,对于有多个代理的系统,求解每个代理的完全 MDP 是很困难的。此外,所有代理都知道所有其他代理、状态和动作的假设在许多现实世界系统中并不成立。
因此,建议采用 DEC-MDP (分权 MDP)的模式。与 MMDP 相反,它不假设每个代理都知道完整的 MDP。它只假设联合 MDP 状态可以从所有智能体的状态集合中导出。但是我们怎样才能最优地解决一个 MDP 问题呢?不幸的是,已经证明分散的多代理 MDP 很难最优求解 (NEXP-Complete)。然而,已经有人提出了几种尝试,以一种易于处理的方式为特定情况的分散化 MDP 建模。
例如, 变迁独立(TI-MDP)是 DEC-MDP 的一个特例,其中一个代理的状态变迁独立于其他代理的状态和动作。本质上,当一个代理采取的行动不影响其他代理时就是这种情况。注意,这并不意味着我们可以将 n 个代理人的 MDP 分解成 n 个不同的 MDP。只有当我们进一步假设**奖励独立,时,我们才能分解它,这基本上意味着奖励函数可以表示为 n 个不同奖励函数的总和,其中每个奖励函数只知道单个代理的行为。一个激励人心的例子是一组机器人一起扫描一个领域来寻找东西。如果另一个代理人之前已经扫描了一块给定的土地,那么扫描这块土地的奖励会更低,因此奖励不是独立的。TI-MDP 的最佳算法在他们的论文中有详细描述。**
虽然 IT-MDP 和 DEC-MDP 的其他子类产生最优策略,但一般的 DEC-MDP 并非如此。因此,许多研究致力于寻找近似解。
DEC-MDP 的近似解
寻找 DEC-MDP 的近似解可以分为两种方法。第一种方法通过测量它们的解与最优解相比有多差来建议保证解质量的算法。Bernstein 在 2005 年的博士论文中提出了一种收敛到ε-最优解的算法。第二种方法提出了没有性能保证的算法。我们将在下一章讨论 DEC-POMDPs 的算法时,看到这种方法的算法。
结论
MARL 的一个重要里程碑是本文中介绍的不确定性概念。首先,我们定义了如何使用 MDP 对规划问题的不确定性进行推理,以及什么是不确定性下的最优概念。然后,我们学习了旨在找到最优策略的算法。最后,我们看到了几个将 MDP 推广到多代理设置的框架。这些框架的不同之处在于几个假设,如中央权威的存在和代理之间的相互依赖性。一般来说,分散多主体 MDP 的最优解很难找到,我们简要讨论了寻找近似解的方法。
接下来,我们将放弃另一个关于可观测性的关键假设,引入部分可观测 MDPs (POMDP)框架。类似于我们在本章中所做的,我们将看到这个 POMDP 框架对分散式多代理情况的推广。然后,我们将准备在马尔结束我们的旅程。
鸣谢
我要感谢罗尼·斯特恩,我的理学硕士论文导师。我对这一领域和本博客系列的大部分内容的兴趣源于他在本古里安大学教授的关于多代理系统的精彩课程,我有幸参加了该课程。
从精算师到数据科学家——我是如何做到的
没有编码背景如何成为数据科学家
在 Unsplash 上由 Austin Distel 拍摄的照片
如果你像我一样——喜欢科技和数据。在这个数字时代,人们开始意识到技术正在给人类带来疯狂的好处,而驱动这种好处的是人类。
是的,没错,我听从了我的召唤。
人们把军队称为国家的第一道防线,医生和护士是医疗的第一线。嗯,我们称自己为创新的最前沿。
Gif 作者Reddit.com
我相信在某些时候,你会对如何进入数据行业有点好奇。需要哪些技能,如何开始?
业内人士必须分享他们的经验,这样想进入数据领域的局外人才不会感到害怕。而你很幸运,我在这里和你分享在没有任何编程知识的情况下,我是如何成为一名数据科学家/工程师的。
背景
我最近转向了数据工程。在此之前,我有 2 年多的数据科学经验。为了真正理解我是如何做到的,我们必须从头开始。
高中时,我擅长科学和数学,毕业时获得了保险精算学位。我是你的平均水平,学习成绩略高于平均水平。在大学期间,我甚至有几门课不及格。我从未写过一行代码,直到我的第一堂课——
编程入门——Java,并不完全是最好的入门语言。我没有在课堂上挣扎,但我也没有爱上编程。我只是把它当成了我在其他课堂上的表现。
重要的是你选了一门与编程相关的课程,并且不讨厌它。我知道有些人无法忍受阅读 5 行代码,他们会立即想吐,这完全可以理解。混乱的代码令人厌恶,如果你是从 Java 开始的,它也没有帮助,语法不是最友好的。
取而代之的是,尝试上一堂 Python 或 HTML CSS 的入门课。把你的脚弄湿,看看感觉如何。如果你能连续花两个多小时想出如何打印“Hello World!”并且觉得自己发明了第一个灯泡,恭喜,这说明你并不厌恶代码。有机会可以进入数据科学。
Gif by Max
实习
这是我进入数据科学的主要原因之一。
由于这是一个新行业,当时没有任何数据科学学位或某种学术证明证明我是数据科学实践方面的大师。
我所有的就是我的激情,那是最起码的。
如果你没有经验证明自己,实习是最优解。我很幸运地加入了我国一家最大银行的数据仓库团队,这是通过我的一个朋友牵线搭桥实现的(稍后会有更多介绍)。在那里的时候,我知道了自己喜欢什么,不喜欢什么。
这也是了解这个行业的一个好方法,你的日常工作是什么样的。据《金融时报》报道,机器学习工程师和数据科学家是在本领域之外寻找新工作的首选职业。这不是一个健康的迹象。
其中一个主要原因是期望和现实之间的差异。
因此,在投身数据行业之前,先帮自己一个忙,在数据行业实习。通常情况下,如果你的表现达到预期,公司会在几个月后将你转为永久职位,是的,我是根据经验来说的。
Miguel 发来的 Gif
SQL 和 Python
现在我们在谈话。在数据实践中有几种编程语言。但是发光的肯定是 SQL 和 Python 。这些语言是必须学习的,好的一面是它们非常容易掌握。
在我实习之前,我从来没有写过一行 SQL 或者 Python。在资深同事的帮助下,我很幸运地通过实习学会了这一点。我也通过免费的在线资源学到了很多,比如 Youtube 和 Udemy。
另外,StackOverflow 是你最好的朋友。
来自期限的 Gif
在问你的同事一个 SQL 问题之前,你的问题的答案很有可能已经在 StackOverflow 上了。你不妨早点和它建立关系,StackOverflow 会在你的数据之旅中陪伴你很久很久。学会有效浏览。
有人说 SQL 甚至不是一种编程语言。我同意这一点。 SQL 或结构化查询语言是数据库的语言,对于与数据打交道的人来说,你可以想象你会经常使用它。
SQL 现在被低估了。能够编写高效、优化和复杂的 SQL 的人越来越少。记住我的话,这将是成为数据科学家最起码的技能。
在 SQL 上,学习—
- 加入
- 案例时
- 凡条件
- 分区依据
它将设置您运行至少 80%的所需数据提取。这里有一些额外的 SQL 函数,你可以学着玩玩。
</5-bigquery-sql-commands-you-probably-didnt-know-about-ebfd9d0dc160>
获得数据后,你需要对其施展某种数据科学魔法,包括—
- 数据操作
- 数据可视化
- 数据建模
向你的客户提供某种结果。
要做到这一点, Python 就是游戏的名字。
Python 和 R 从一开始就主导了数据科学领域,但是随着最近在数据科学领域对 Python 支持的增加,很明显每个人都在使用 Python。
对 Python 的支持是疯狂的。Youtube 上有很多很好的免费课程,可以帮助你入门。对于 Python,学习—
- 熊猫
- Numpy
- Matplotlib,Seaborn,Plotly
- Scikit-Learn
为了让你开始,这里有一个关于熊猫的免费指南。
面试
照片由 Amy Hirschi 在 Unsplash 上拍摄
要想在面试中表现出色,你必须先得到它。
抛开所有显而易见的建议,比如整理你的简历(1 页),我给你留下一个立即获得工作面试的最强大的资产——人脉。
花时间去了解你的同事,甚至你大学的朋友。真诚地对待他们。谁知道呢?他们中的一个可能会在你梦想的公司找到一份工作,而你的工作可能只需要打两个电话就能搞定。
事实——我通过一个朋友得到了我的前两个角色。
经理们每天都会收到数百份简历。他们不想全部看完。如果他们的一个同事推荐你,他们会立刻给你一个机会——你可以相信我的话。
数据项目
在参加面试之前,确保你有一些作品要展示。不要谈论你做的那个项目,而是展示给他们看。
做一些有趣的东西,并在某个地方举办。
可以参考kaggle.com获取灵感。
我个人从零开始建了一个 网站 来托管我所有的作品,免费!
我已经在这里写下了所有相关内容—
所以,你已经得到了面试,你有工作要展示。这一切都归结到最后一部分,沟通。如果你的目标是成为一名优秀的数据科学家,沟通是关键。
想想吧…
在你建立了完美的模型,或者进行了深入的分析之后,会发生什么呢?你工作的全部意义在于将数据发现传达给每个人,这需要很好的沟通。
因此,能够在面试中很好地表达自己是一个巨大的优势。我知道面试官正在寻找这样的机会。
为了完善面试的艺术,最好的建议是不断练习。在得到第一个角色之前,我被拒绝了很多次。不要放弃。
寻求反馈如果被拒绝了,我相信他们会很乐意帮你解决的。
结论
如果你还在这里,你一定对数据很认真。感谢你阅读我的经历。
总之,以下是我对进入数据科学的建议—
- 参加编程课程,最好是 Python 或 HTMLCSS
- 获得数据科学相关的实习机会
- 学习 SQL 和 Python,特别是与数据相关的库
- 从事与数据科学相关的项目
- 与同事交流
- 提高你的面试技巧
- 要有激情!
这听起来很简单,但确实有效。祝你好运!
和往常一样,我以一句名言作为结束。
学习数据科学的最佳方式是去做数据科学— Chanin Nantasenamat
订阅我的时事通讯,保持联系。
我们的数据之旅还没有结束。我正在撰写更多关于数据行业的故事、文章和指南。你绝对可以期待更多这样的帖子。与此同时,可以随时查看我的其他 文章 来暂时填补你对数据的饥渴。
感谢 的阅读!如果你想与我取得联系,请随时联系我在 nickmydata@gmail.com 或我的 LinkedIn 个人资料 。也可以在我的Github中查看之前写的代码。
从 AlexNet 到 NASNet:卷积神经网络的简史和介绍
用 Keras 实现了一个简单的 ResNet
向昨天学习,为今天而活。
——阿尔伯特·爱因斯坦
历史上,图像上的机器学习一直是一个巨大的挑战,直到 2012 年, AlexNet 赢得了 ImageNet 竞赛的一等奖,并得到了公众的关注。从那以后,卷积神经网络或 CNN 发展得如此之快,以至于 AlexNet 很快就成为了过去。在图像处理方面,CNN 已经大大超过了人类的表现。
然而,CNN 的概念早在 30 多年前就已经提出并付诸实践。CNN 或深度学习变得如此有效和流行的主要原因是过去十年数据和计算能力的丰富和民主化。
在接下来的几节中,我将首先谈谈为什么 CNN 要处理图像。然后,我将简要地向你介绍各种 CNN 类型,沿着时间和架构的演化轴。我还会讲一下 AlexNet,VGGNet,InceptionNet,MobileNet,ResNet,NASNet 这些有代表性的架构。最后,我将用一个我在 Keras 中实现的 ResNet 的简单实现来演示。
1.为什么 CNN 关注图像
1.1 图像上正常神经网络的问题
每幅图像都有成千上万个像素,每个像素都被视为一个特征,这意味着对于一幅 1000 * 1000 的图像,有 1,000,000 个特征。对于正常的前馈神经网络,每一层都与前一个输入层全连接。
假设例如我们使用一个具有一百万个神经元的单层的普通前馈神经网络来处理图像,所需的参数数量是 1000 * 1000 * 10⁶ = 10。普通神经网络进行图像学习所需的参数太多了。
但是网络中参数太多的问题是什么?首先,它很容易过度训练,并且需要大量的数据来进行适当的训练。其次,训练和预测需要更多的内存和计算。
1.2 CNN 为什么工作
让我们回到图像的主要特征。使 CNN 作用于图像的图像特征主要有两个,分别是特征定位和特征独立于位置。
**特征定位:**每个像素或特征与其周围的其他像素密切相关。例如,鼻子上的像素的相邻像素很可能也是鼻子的像素。
**特征位置无关:**每个特征都是相同的,不管它在图像中的什么位置。例如,不管鼻子在图像上的位置如何,它仍然是鼻子。
CNN 利用局部连通网络 ( 特征定位)的共享参数 ( 特征位置独立)解决了参数过多的问题,也称为卷积网。在前面的示例中,使用卷积网络可以将参数的数量从 10 个减少到 10 个。
1.3 CNN 的主要组件
CNN 有 3 个主要组成部分,分别是卷积、汇聚和全连接层。
卷积层由滤波器和步长组成。过滤器是本地连接的网络,每个网络学习图像的一些特定特征。每个滤波器以配置的步长(称为步幅)在图像周围移动。例如,对于步长为 1 的大小为 10 * 10 的过滤器,每次过滤器窗口都会覆盖一个面积为 10 * 10 像素的图像,以计算像素值和参数之间的内积。并且它将在图像上水平和垂直移动 1 个像素(步幅),直到它覆盖整个图像。
典型的池层有两种类型,分别是最大池层和平均池层。最大池层从每个窗口中选取最大值,平均池层从每个窗口中计算平均值。池层的直觉是增加滤镜的弹性。它还进一步减少了参数的数量,并施加了某种程度的正则化来减少过拟合。
完全连接层展平最后一个卷积层,并将神经元完全连接到输出层。你可以有多个完全连接的层。然而,全连接层的参数数目比卷积层的参数数目多得多。在典型的 CNN 中,来自全连接层的参数数量是整个网络的 60%到 80%。
2.CNN
自从 AlexNet 引起公众的注意以来,CNN 的发展经历了三个阶段,主题分别是我所说的越深越好、建筑工程和 AutoML 。每个阶段都有其代表性的网络架构。
CNN 的演变
2.1 越深越好
2.1.1 AlexNet
2012 年 AlexNet 参加 ImageNet 比赛以 15.3%的错误率击败第二名 10.8% 。
AlexNet 的架构。摘自 AlexNet 论文
AlexNet 由 5 个卷积层、3 个最大池层和 2 个全连接层组成。AlextNet 的结构是用 2 个 GPU 拆分的,部分原因是因为当时的 GPU 内存不够大。
激活功能
AlexNet 是第一个使用 ReLU 作为激活功能,而不是Sigmoid功能的 CNN。ReLU 作为激活函数的引入大大提高了深度学习网络的训练速度。
ReLU vs 乙状结肠(虚线)。摘自 AlexNet 论文
辍学
AlexNet 还在全连接层中使用了 Dropout 。AlexNet 的退出使每个训练时期 50%的神经元失效。直觉上,辍学带来了两个好处。首先,它使每个神经元更加独立。其次,它就像每次训练一个子网络,最终结果是子网络的集合,这比单个大网络要好。
AlexNet 对全连接层应用 Dropout 的原因是,如前所述,来自全连接层的参数数量比来自卷积层的参数数量多得多。在完全连接的层上应用 Dropout 带来了一些正则化效果并减少了过度拟合。
数据扩充
AlexNet 输入图像的大小为 224 x 224,这些图像是从 ImageNet 的 256 x 256 图像中随机采样的。通过在比赛中进行这样的采样,AlexNet 将他们的训练数据量增加了 2048 倍。
2.1.2 VGGNet
VGGNet 也在 2014 年的 ImageNet 比赛中声名鹊起。它的卷积层数比 AlexNet 多得多。
除了更深层次的架构之外,VGGNet 的一些引人注目的新概念是:卷积层大量使用的 3 x 3 滤波器(取代 5 x 5 或 7 x 7 滤波器,以具有更宽的扫描区域并减少参数数量),非线性变换的 1 x 1 滤波器,在每个池层之后加倍通道数量,以恢复池层中丢失的信息。
2.2 建筑工程
2.2.1 ResNet
当 CNN 的网络层数增加到一定数量时,CNN 的性能反而下降。原因是更深的网络更难优化,因为众所周知的消失/爆炸梯度问题。
CNN 的性能随着层数的增加而降低。摘自 ResNet 论文
有没有办法在避免渐变爆炸/消失问题的同时增加卷积层数?2015 年,发明了 ResNet 来解决这个问题。
ResNet 引入了一个叫做剩余学习的概念。直观上,每个剩余卷积层的输出至少与输入一样好。即。F(x) + x ≥ x。这种架构被证明可以很好地解决梯度问题。ResNet 的卷积层数最大可超过 1000 层。
2.2.2 收入网
在 InceptionNet 之前,大多数改进 CNN 的方法是增加更多的卷积层。受益于谷歌卓越的工程实力, InceptionNet 通过在卷积层中使用各种大小的滤镜,扭曲了卷积层的结构。
很难对所有图像都有一个最佳的过滤器尺寸,因为同一物体在不同的图像中可能具有非常不同的尺寸。InceptionNet 的主要思想是对同一对象使用不同大小的过滤器。直觉上,这个网络变得“更宽”而不是“更深”。
InceptionNet 架构。摘自创意网论文
InceptionNet 经历了从 v1 到 v4 。除了 v1,它的 v2 到 v4 版本通过各种巧妙的技术降低了计算复杂度,提高了性能。它还与 ResNet 联合创建了 InceptionResNet ,使网络既“更宽”又“更深”。
2.2.3 移动互联网
MobileNet 是谷歌的另一个 CNN 架构,试图将 InceptonNet 应用于移动设备。目的是减少参数和计算的数量,同时尽可能地保持性能。
MobileNet 中的深度可分卷积。摘自 MobileNet 论文
MobileNet 推出了一种称为深度方向可分离卷积的滤波器架构,其主要思想是为不同的输入通道提供不同的滤波器。MobileNet 显著减少了参数的数量,因此所需的计算量通常仅为原始网络的 1/9,精确度略有下降。
2.3 AutoML
2.3.1 NASNet
配备了丰富的计算能力和工程天才,谷歌推出了 NASNet ,将寻找最佳 CNN 架构的问题框定为强化学习问题。
基本上,想法是搜索给定滤波器尺寸、输出通道、步长、层数等的搜索空间的参数的最佳组合。在这种强化学习设置中,每次搜索动作后的奖励是在给定数据集上搜索到的架构的准确性。****
NASNet 在 ImageNet 竞赛中取得了最优秀的成绩。然而,NASNet 所需的计算能力如此之大,以至于只有少数公司能够利用相同的方法。
示例:Keras 中的 ResNet 实现
我已经在 Keras 中从头实现了 ResNet 34,并使用它在 CIFAR10 数据集中进行了训练和测试。参考请参考笔记本。
尽管有类似的实现,我仍然手动实现它,因为我想得到一些关于它的编码实践。我也想向你们展示和解释 ResNet 的内部运作。
剩余块
ResNet 的核心是剩余块。ResNet 中有两种基本残差块,一种输出通道数不变,另一种输出通道数加倍。
在通道数量保持不变的情况下,输入图像将通过 2 个 Conv2D 层,其大小保持不变,然后输出(残差)将添加到原始输入图像,作为该块的最终结果。
对于通道数量加倍的情况,输入图像将通过 Conv2D,输出图像宽度和长度减半。为了进行残差学习,原始输入图像的宽度和长度需要减半,其通道数通过填充增加一倍。直觉上,通道加倍和图像尺寸减半同时使得残余块能够以更大的粒度捕获特征。
def _residual_block(self, x, num_output_channel):
num_input_channel = K.int_shape(x)[-1] if num_output_channel == num_input_channel * 2:
# number of output channel doubled. 3 things will happen:
# 1\. The output image' width and length will be halved
# 2\. The input image will go through a pooling layer with its width and length will be halved too
# 3\. pad the number of channels of the input images for residual learning
output_channels_doubled = True
strides = (2, 2)
elif num_input_channel == num_output_channel:
# number of output channel remain the same
# go through 2 convolution layers without changing image' size
output_channels_doubled = False
strides = (1, 1)
conv1 = Conv2D(num_output_channel,
kernel_size=(3, 3),
strides=strides,
padding='same',
activation='relu')(x) conv2 = Conv2D(num_output_channel,
kernel_size=(3, 3),
strides=(1, 1),
padding='same',
activation='relu')(conv1) if output_channels_doubled:
pooled_x = AveragePooling2D(pool_size=(2, 2),
strides=(2, 2),
padding = 'same')(x) padded_x = tf.pad(pooled_x,
[[0,0],
[0,0],
[0,0],
[num_input_channel // 2, num_input_channel // 2]]) else:
padded_x = x #residual learning
output_x = conv2 + padded_x return output_x
ResNet 配置
ResNet 34 具有 4 层残差块,每层分别具有 3、4、6 和 3 个残差块。对于每一层,输出通道的数量(num_filters)加倍,但是在该层内,每个残差块具有相同的数量。
num_residual_blocks_arr=[3, 4, 6, 3],for num_residual_blocks in num_residual_blocks_arr:
num_filters = num_filters * 2
for _ in range(num_residual_blocks):
conv = self._residual_block(last_layer, num_filters)
last_layer = conv
在网络的末端,最后一个块被展平并连接到一个全连接的图层,用于标注输出。
CIFAR10 上的结果
我已经在我的笔记本电脑中用 5 个纪元在 CIFAR10 数据集上训练了 ResNet。在测试集上准确率在 75%左右。
Epoch 1/5
391/391 [==============================] - 2343s 6s/step - loss: 2.0021 - accuracy: 0.2924 - val_loss: 1.3157 - val_accuracy: 0.5139
Epoch 2/5
391/391 [==============================] - 2123s 5s/step - loss: 1.2212 - accuracy: 0.5572 - val_loss: 1.0442 - val_accuracy: 0.6267
Epoch 3/5
391/391 [==============================] - 2220s 6s/step - loss: 0.9501 - accuracy: 0.6587 - val_loss: 0.9108 - val_accuracy: 0.6772
Epoch 4/5
391/391 [==============================] - 2196s 6s/step - loss: 0.7628 - accuracy: 0.7299 - val_loss: 0.8016 - val_accuracy: 0.7155
Epoch 5/5
391/391 [==============================] - 2109s 5s/step - loss: 0.6145 - accuracy: 0.7821 - val_loss: 0.7327 - val_accuracy: 0.7482
结论
在这篇文章中,我沿着时间和架构的演化轴简要地讨论了各种 CNN 类型。我还用一个我在 Keras 中实现的 ResNet 的简单实现进行了演示。
CNN 是当今许多人工智能技术的基石,例如自动驾驶汽车和所有其他与图像或视觉相关的工业人工智能应用。CNN 的历史是一部用机器学习和工程技术对抗过度拟合的历史。尽管 CNN 的自动分类还处于初级阶段,但它将在 CNN 的发展中扮演越来越重要的角色。