不要做一个可扩展的数据科学家!
成为他们不能失去的摇滚明星的 3 个技巧。
泰勒·格罗特在 Unsplash 上的照片
数据科学如此受欢迎有很多原因。在我看来,这可能是一个人所能拥有的最有趣的工作。
想一想:
- 你在玩数据,整天挖掘价值。
- 你正在向管理层和高管展示你的成果,并影响公司的战略。
- 你跟上了机器学习和人工智能的最新发展,这是目前最热门的话题之一,避免了过时。
虽然就业市场上有大量的供应,但大部分供应集中在入门级别的岗位上。这意味着,这是你要思考的事情,许多人匆忙进入这个领域,装备不良,并带着与他们的实际技能相比不切实际的期望。
也就是说,如果你还在读书,这意味着你真的想成为一名数据科学家,或者你想确保自己是一名优秀的数据科学家。
我可以帮你实现这个目标。我完全有资格这么做的原因是因为我在职业生涯早期没有遵守某些规则,我为此付出了代价。我基本上打破了我将要与你分享的每一个提示,我可以绝对自信地告诉你:这是有代价的。
你可以从失败中学习,也可以从在你之前做过这件事的人的经验中学习。
所以,事不宜迟,这里是我的三大建议,让你尽可能对公司有价值。
提示 1:了解你的业务
这可能会让你大吃一惊,但作为一名数据科学家,你工作中最重要的部分是彻底了解你所在的业务。如此多的初学者进入这个领域,认为这是关于“python vs R”,或者“我应该使用哪个绘图库”。让我告诉你:所有这些都是幼儿园的屁话。
你被雇来帮助公司赚更多的钱或者存更多的钱。使用任何你想要的工具,但是为了优化一个业务,你必须知道这个业务是关于什么的:客户,供应商,监管环境,竞争对手,公司品牌和定位,等等。
请不要误会我的意思。我不是说你必须成为这些学科的专家。但我要说的是:作为一名数据科学家,你绝对必须对所有可能影响你所在行业的领域有一个基本的了解。
不管是否明确说明,这都是你工作描述的一部分。
为什么?我再重复一遍:如果你要给公司的业务领导提建议,不管是通过建模、数据探索还是其他方式,让自己获得成功的最佳方式是对业务有广泛的了解。
说到向管理层做演示,我们就想到了第二点。
秘诀 2:学会沟通
如果你认为你不能在一屋子你从未见过的高地位利益相关者面前做演讲,你需要练习。很多!
就在几年前,我还无法想象自己会这么做。事实上,在大学里,我甚至不能在全班同学面前做演讲。我整晚都在为此感到压力,第二天早上,由于睡眠不足,我筋疲力尽,干脆躺在床上不出现了。我就是这样从不止一个,而是两个不同的学士项目中退学的。两次都是因为害怕做报告。
几年后,我决定做点什么。所以我注册了 MBA。我讨厌这样。但是你知道吗?这让我克服了对公开谈话的恐惧。因为在读 MBA 期间,我们都必须一直做陈述。经过几次伤脑筋的治疗后,我有点习惯了。
今天,我能够与观众建立联系,讲述一个故事,并表达我的观点。我还花了很多时间学习可视化的基本原理,这是我现在在大学教授的一个课题。
回到你和你的事业上。作为一名数据科学家,你需要成为一名得体的演示者和得体的沟通者。我怎么强调都不为过。这是第二个技巧而不是第一个的唯一原因是因为我重视内容胜于形式,但不是每个人都有耐心看到一个弱沟通信息背后的价值。所以,如果你需要在这方面下功夫,我建议你反复地把自己放在这样的场合,你必须发言,你必须提出一个想法。
提示 3:不要犯错误
我知道,这和你在任何地方听到的都相反,对吗?你期望我说类似“犯错误,这是你学习的方式”这样的话。
那是纯粹的软懒,初级,可扩展的心态!
真正的专业人士,那些成功登顶的人,是那些永远不会让自己失败的人。对他们来说,犯错误根本不是一个选项。
那些偶尔犯错的人,是那些认为没关系的人,他们最终会以某种方式变得更好,他们会变得更加自律和专注。
让我告诉你一个秘密。重要的不是结果。是心态的问题。
是的,结果必然源于心态。虽然你不能总是控制结果,但你永远不要让自己认为一个错误是可以接受的。
这意味着:你应该四次检查你的数字。回顾你的假设。寻找离群值。执行测试。事先打印你的演示文稿,从不同的角度看它。这份清单还在继续,由你来决定哪一种最适合你的风格…但是不要犯错误。
这个提示的本质是负责任。
这对数据科学家和战场上的士兵一样有效。负责任并不意味着在事情发生后感到抱歉。没人在乎那个。相反,这意味着首先要尽你所能避免倒楣的事情发生。
离别赠言
我怎么没给过什么技术建议?浏览数据科学,你会发现很多。如果你能阅读,并且有最低限度的动力和纪律,你可以在技术上做得更好。
但是知道如何应用你所学的需要一种谦逊而强大的心态,这就是高级数据科学家与大量追随者的区别。学习起来也困难得多,因为它迫使你质疑自己是谁,而不是每个人都愿意为此努力。
我分享的建议是基于我自己和我所钦佩的人的经验。用不用就看你自己了。祝你好运!
不要太骄傲而不愿寻求帮助
职业建议
如果你被一个 bug 卡住了或者感到不知所措,你可以寻求你需要的帮助。
图片来自像素上的 olia danilevich
在解决问题时,最难学习的一课是何时后退一步寻求帮助。不要太骄傲而不愿寻求帮助。无论是同事之间的问题,代码中的错误给你带来的痛苦,还是你正在处理的个人问题,当你需要帮助的时候,你都可以随时寻求帮助。
注意到你的问题
最近,我接手了一个项目,在我们的代码库中开发一套新的功能。看看这个问题,它似乎是相对容易的工作,因为它只是扩展了现有的代码,以迎合一个新的用例。我花了几天时间开发代码并创建单元测试来测试新功能。随着 sprint 接近尾声,我注意到在我的输出中出现了两个小问题,(1)我有重复的时间戳列,以及(2)我的生成器返回一个空列表,尽管它应该有一个元素。
在从事数据科学和软件项目时,您可能经常会在工作中遇到这样的问题:您会连续几个小时盯着计算机屏幕上的代码,却似乎找不到问题所在。对我来说,这两个 bug 就是其中之一。第一个错误是在我的输出数据集中出现了重复的列。我收到了两个时间戳列,它们的值相同,但格式不同。当我仔细查看这些数据时,很明显有些地方出了问题,但我不明白问题出在哪里。
当我通读代码时,我通过输出的创建跟踪了时间戳列,但是没有发现问题。在打印最终结果之前,整个过程中的数据看起来都很好。我的第二个错误是我的生成器函数产生了一个空列表,而不是创建一个对象列表。发生了什么事?此时,我已经发现我有两个问题,花了太多时间单独调试它们;是时候寻求帮助了。
接受你需要帮助
当你发现自己花了太多时间试图自己解决一个问题时,暂时离开这个问题几分钟。接受这个问题可能是比你自己更大的问题,或者是你忽略的问题。当你退后一步,认识到你可以寻求帮助。而且不管你在职业生涯的哪个阶段,都可以问。
你不应该觉得自己已经不需要别人的帮助了。如果你正在进行一个编码项目或者一个分析,并且现在正面临一个 bug,你可能在你的代码中的某个地方做了一个你忽略了的假设。也许你在数据中漏掉了一些你之前不清楚的东西。你会不会拼错了什么,或者使用了不同的函数,从而改变了你的输出?会引发问题的事情太多了,但不需要你一个人去解决。
寻求帮助
在花了一天时间研究复制列错误和空的生成器输出之后,我后退一步,和另外两个开发人员开了一个会。我在邮件中解释了我的问题,并询问他们是否可以检查我的代码,看我是否遗漏了什么。
会议开始时,我又一次通读了我的代码,发现了创建初始空数据框的那一行。这一行代码创建了带有时间戳列和时间戳索引的数据帧。心想,“那不可能是我的问题!”我删除了时间戳列,留下了时间戳索引。就在会议开始时,我重新运行了我的代码并查看了输出。事实上,这是我对重复时间戳列的问题。随着 bug 1 的出现,很明显我需要从原始代码中退出一段时间,以带来关于这个问题的新观点。
那么,我的生成器函数生成一个空的对象列表有什么问题呢?会议开始时,我解释了我的重复列错误和解决方案。这对于在即将到来的 sprint 中从事类似工作的开发人员来说很有帮助。至于生成器 bug,我调出了我的代码,分享了我的屏幕。该函数正在运行,没有产生任何错误语句,但输出是错误的。这归结为一个简单的数据类型问题。我试图将进入生成器的数据转换为错误的类型。因此,它没有在我的文件夹中找到任何该类型的内容。因为我的文件夹中没有正确的类型,所以列表中没有添加任何内容,从而产生一个空列表。一旦我将类更新为正确的类型,我的生成器就会创建一个包含文件夹数据的列表。我的问题就像查找和替换我忽略的一个单词一样简单。
摘要
那么我在这里学到了什么?
- 你可以寻求帮助,你应该这样做。请不要觉得你必须独自解决你的问题。
- 不要因为一个看起来微不足道的小错误而影响了你的计划,因为你太骄傲而不敢说,“嘿,你能和我一起快速看看这个吗?”
- 有时候你需要从你正在做的事情上退一步来认识问题在哪里。代码可能会让你措手不及,走开以后再回来重新审视。
- 不要觉得自己是一个人。每个开发人员都会在不同的时间,因为各种原因寻求帮助。
不要成为数据科学家
意见
当有人问我如何进入数据科学时,我给出的建议是。而是成为一名软件工程师。
这是一篇观点文章。我很想听听你下面的反驳。
每个人和他们的祖母都想成为一名数据科学家。尽管数据科学可能是 21 世纪最性感的工作,但这却低估了另一个回报丰厚、薪酬丰厚的职业——软件工程师。
我经常收到新毕业生和转行者的信息,询问我关于进入数据科学的建议。我告诉他们要成为一名软件工程师。
在这两方面都有经验,我会试着说服你成为后者。
1.有更多的软件工程工作
与数据科学相比,软件工程的工作数量要多一个数量级。
下面是谷歌搜索“**数据科学家”和“软件工程师”**职位后的几张截图。
谷歌:美国数据科学家
谷歌:的确是美国软件工程师
与 53,893 份软件工程工作相比,这是 7616 份数据科学工作。这只是美国的就业情况,但其他国家也显示了类似的结果。
根据 Glassdoor 的说法,数据科学家赚的钱更多,但我未经验证的假设是,数据科学工作平均来说也更高级。
也就是说,如果你在 Open AI 获得了 100 万美元的薪水,我建议你接受。
2.“数据科学”是什么意思,还没有达成共识
管理层通常对“数据科学”的含义没有共识。也有可能由于业务限制,他们没有严格遵循角色框架的奢侈。
这意味着“数据科学家”的职责因公司而异。
速写
虽然软件工程师和数据科学家之间可能存在一个理想的角色范围,但它不太可能在现实中得到遵循。这尤其适用于仍在建设基础设施的初创企业。
被雇佣的候选人最终会致力于公司当前需要解决的问题,而不是他们可能被雇佣的“角色”。
Marc-Olivier Jodoin 在 Unsplash 上拍摄的照片
来自该领域同事的轶事证据表明,许多数据科学家发现自己像软件工程师一样编写后端代码。我认识其他在 excel 中处理财务数据的“数据科学家”。
这与你在 Kaggle 竞赛中长大时的预期形成了鲜明的对比。
3.数据科学是孤立的
大多数公司不需要像软件工程师那样多的数据科学家。其他公司正在招聘他们的第一位数据科学家。
由于这个原因,许多数据科学家最终只能独自工作,即使他们与开发人员坐在同一张桌子上。
这使得获得反馈和第二意见变得困难。软件工程师要么不懂预测建模,要么忙于解决完全不同的问题。
相比之下,在软件工程团队中的一个额外好处是能够对同事说,“我认为我们应该以 XYZ 的方式实现 ABC。你怎么看?”。
准备好和自己……或一只橡皮鸭进行这样的对话。
4.数据科学是探索性的
准备好与管理层进行尴尬的对话,讨论为什么你花了两周时间买的东西不能用了。
处理已解决和未解决的问题是软件开发和人工智能之间的一个基本区别。
除了缺陷和限制,你在开始任何工作之前就知道大多数软件工程项目是否可行。对于 ML 来说就不一样了,你不知道一个模型是否有效,直到你建立了它。
5.公司还没有为人工智能做好准备
即使在一个每个公司都是 AI 公司的时代,大多数也没有支持它的基础设施,甚至不需要它。
一家快速扩张的初创公司的数据科学主管最近在喝咖啡时分享了一些建议。
首先你要找出问题,然后你要建立基础设施,然后你要引进数据科学家。这不是一个快速的过程。(我转述)
另一个知名公司的数据科学第一名员工最近向我透露。她被迫在笔记本电脑上而不是在云中根据大数据训练人工智能模型。
如果你是在没有具体问题需要解决的情况下入职的,或者公司没有为数据科学做好准备,你可能会发现自己很难增加价值。
6.软件工程教授通用技能
成为一名初级软件工程师就像获得一个技术 MBA 学位。你什么都能学到一点。
您将学习数据库、云技术、部署、安全性和编写干净的代码。
通过观察你的 scrum 领导者、高级开发人员或项目经理,你将学会如何管理构建软件。
你将通过代码评审获得指导。
如果你进入一家拥有成熟工程团队的公司,几乎可以保证你会很快提升自己的技能,并建立一个多面手的背景。
7.软件工程更容易移植
通过提供更全面的技术体验,当你决定是时候改变时,软件工程提供了更好的退出机会。
开发运维、安全性、前端、后端、分布式系统、商业智能、数据工程、数据科学…
我认识一些从软件转向数据科学的开发人员。如果你浏览一下数据科学的工作描述,你会立即注意到它们充斥着核心软件开发技能。
来源:确实如此(我在这里摘樱桃)
如果你能构建端到端的项目,那么你不仅能为 Kaggle 构建一个模型。你可以采用这种模式,将其生产化,设置授权和分条,然后开始向用户收取访问费用。那是你自己的创业。
我从不认为数据科学是不可转移的。根据数据做决定是一项杀手锏。但随着我们越来越受数据驱动,这也将成为每项工作的一部分。
8.机器学习将成为软件工程师的工具
随着人工智能变得商品化和更容易使用,软件工程师将开始使用它来解决他们的问题。
我可以在一个下午教一个开发者构建 Sklearn 分类器。这并不意味着他们可以构建下一个 AlphaGo,但这确实给了他们一种替代基于用户输入的硬编码条件逻辑的方法。
数据科学家拥有统计学等专业知识,以及对模型如何工作的直觉。但是 DevOps 和安全工程师也有他们自己的专业知识。
我认为这些更多的是共性而不是差异。一个经验丰富的软件专业人员可以在专业之间转换,其速度比一个新进入者选择专业的速度快一个数量级。
虽然我不认为我们会看到数据科学完全合并到软件工程中,但感觉数据科学可能会成为另一个软件工程专业。
9.人工智能不会取代软件工程师
虽然听起来很傻,但我在 2014 年进入了软件工程领域,因为我担心人工智能会让其他所有工作都变得过时。
然而从那以后,表盘几乎没有离开过特定的环境。技术采用缓慢,人工智能比媒体让你相信的要狭隘。
与其他职业相比,机器学习离自动化软件工程更远。虽然我们有初创公司在开发像人工智能支持的代码完成这样的酷产品,但编写代码并不是真正的工作。工作是用技术解决问题。
前奇点,这将仍然是一个有价值的高薪技能。
结论
首先,这是轶事。其次,我意识到我把数据科学家、ML 工程师和 AI 研究人员混为一谈了。但我觉得这些论点还是值得考虑的,鉴于这是你的职业。
不要太认真。我更希望你研究一下,自己做决定。这毕竟是作为数据科学家的一部分:)。
在一天结束的时候,我们被支付来解决问题。
不要相信任何关于冠状病毒的数字
每个国家的官方 COVID 数据都是假的,这是有科学依据的
不要相信你看到的一切。在 Unsplash 上 engin akyurt 拍摄的照片
I 众所周知,来自官方渠道的冠状病毒病例被严重低估了。在大多数国家,人们只有在出现症状时才会接受检测。这一点显而易见,因为大部分病例是轻微的或无症状的,而且这些没有被广泛报道。
因此,在一个天真的近似值中,我一直假设感染人数比官方统计的数字高五倍。我从大约五分之一的病例中推断出这一点。
另一方面,我认为死亡人数是相当可靠的——毕竟,如果病人有可能死亡的严重症状,他们会去看医生。医生肯定会让他们做测试。
至少我是这么认为的。
我错了。
我用官方数据计算了六个月内有和没有社会距离的估计死亡人数。事实可能比我的模拟还要糟糕。
towardsdatascience.com](/why-we-are-definitely-not-over-hyping-coronavirus-f69a8d3cc091)
我灵光一现的时刻来自于与 Luca Foresti 的一次谈话,他是意大利北部一家专业诊所网络 Centro Medico Santagostino 的首席执行官。我问过他为什么意大利的死亡人数这么高。
10 分钟后,我对官方数字的全部信心都破灭了。
Foresti 的方法很简单:拿一个城市过去几年的死亡人数——总有人会死——和现在的死亡人数比较。由于越来越多的人死于电晕,与过去相比,你会看到更多的死亡人数。
在一个理想的世界中,这一超额死亡人数将等于官方公布的死于电晕的人数。你可以多给或少给一些,因为更多的人可能没有得到足够的其他疾病的医疗保健,而较少的人死于车祸。
但现实却大相径庭。
作为一个例子,Foresti 分析了意大利北部伦巴第的两个城市的数据:据纽约时报报道,贝加莫是欧洲受灾最严重的城市。Nembro 是附近的一个村庄,当你考虑到人均死亡人数时,它受到的打击更大。
在贝加莫,如果我们对 2015 年至 2019 年的死亡人数进行平均,从今年年初到 3 月 24 日的预计死亡人数为 628 人。2020 年的死亡人数几乎是现在的两倍。只有十分之一的额外死亡与新冠肺炎有关。
现在,人们可以得出结论,在意大利的许多地方,死亡率甚至比你从官方数字中预期的还要高。但这不太可能。
即使你考虑到意大利人口相当老龄化,而且许多人因为医院人满为患而无法得到充分的护理,这也无法解释意大利的死亡人数。唯一的解释是,意大利已经有很多人被感染了。
让我们假设每个国家的死亡率大致相同。由于人口的年龄和医疗保健的可获得性,你不得不做出一些让步,但我们很快就会看到,这不会发挥如此大的作用。
研究死亡率的一个很好的例子就是钻石公主。游轮断电数周,船上每个人都接受了测试。病死率为 1.1%。
再比如韩国。这个国家很早就开始大规模测试,所以它的数据多少是可靠的。早期的病死率约为 0.7%。
这两个比率之间的差异完全可以用这样一个事实来解释:游轮上的人平均来说相当老,而南韩的人口相当年轻。
由于贝加莫的人口年龄较大,让我们假设意大利的病死率约为 1.1%。如果我们天真地假设所有超额死亡都是由电晕引起的,那么该镇目前约有 45,000 人被感染或已经康复。这大约是贝加莫五分之二的人口。
贝加莫郊区奈姆布罗的情况更为极端。根据 2015-2019 年的死亡人数,预计会有 35 人死亡。但是今年,死亡人数增加了五倍。
虽然报道的电晕相关死亡的比例高于贝加莫——四分之一的超额死亡归因于该病毒——但对该村的影响甚至更严重。不仅 72%的人已经感染了冠状病毒。更糟糕的是,在不到三个月的时间里,内布罗 0.8%的人口死于电晕相关的死亡。
底线是:更多的人正在死去
全国范围内的全因死亡人数很难获得。但是这两个意大利小镇的例子表明了一件事:死于电晕的人数是官方统计的四倍,甚至十倍。
让我们不要以此怀疑我们的政府。他们只是想做好自己的工作,拯救人们的生命。
相反,让我们把这作为一个警告,看看这种病毒有多致命。让我们照顾老人和弱者。当然,让我们#呆在家里。这已经拯救了成千上万人的生命。
编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
不要购买数据——投资数据
有一些关于数据的表达已经有点厌倦了:数据是新的石油;我们相信上帝(所有其他人必须带来数据);购买数据,高价出售…
好吧,被你发现了,最后一个是我编的。但是,重点是:围绕数据的叙述告诉我们,我们都明白它有巨大的价值。
4 Ms 的数据
数据团队的任务是从公司内部和任何数量的外部来源收集信息,将所有信息结合在一起,并进行分析和建模。从商业角度来看,数据的 4 个 v 并不重要,目标是达到 4 个 m:“让我赚更多的钱。”
无论他们是在关注供应链、丰富“了解你的客户”计划,还是在分析成本效率,他们的指导方针都是收集相关信息,并将其综合成能够加强业务的东西。
如果你在没有计划的情况下购买股票,将钱投入股市不会给你带来回报——你必须聪明且有条不紊。同样的道理,你可以在数据上花很多钱,却得不到多少回报,但事情不一定是这样的。
金钱和数据:改变思维模式
需要发生的是其中最大的商业陈词滥调:彻底的范式转变。所有行业都必须摆脱数据是一种支出的观念。
不要担心,这是假的——但你现在可能正在烧钱,让你的数据团队辛辛苦苦地准备和处理(图片来自Jp ValeryonUnsplash
办公用品是一项开支。许可费是一项支出。数据和数据管理工具不是消耗品,因此,它们不应该被视为可以通过任何必要手段最小化的成本。
数据是一种投资
团队在数据生命周期的每个阶段节省的时间越多,他们就有越多的时间投入到他们被雇佣的原因上:分析、报告、建模和解决方案。它还可以腾出时间来用更多的数据强化模型,从而获得更广泛的覆盖范围和更好的结果—您可以复合组织内每项数据资产的价值。
但是有些数据不是免费的吗?
仅仅因为他们不收费并不意味着它是免费的:找到它,连接到它托管的门户,重新格式化它以在给定的系统中工作,清除它的坏数据/丢失的数据,将其与您现有的数据集成-这只是在数据可用之前需要对其做的事情的皮毛。如果你还没有走过那条路,我给你一个剧透:很多人花很多时间做很多工作。
更何况获取数据也不是一次性的。企业需要当前的、最新的数据,并且在这个过程中需要进行调整,因此这些步骤中的每一步都必须是可维护的和可重复的,这样系统才能正常运行。从长远来看,流程越智能、越自动化,节省的时间和金钱就越多。
数据是一个很好的例子,说明了一句古老的谚语:“你付出的越多,你得到的就越多。”
仅良好的(数据)氛围
在我深入探讨“投资数据”的含义之前,我想说明一下这个不代表的含义:它不是获取尽可能多的数据,而是 将数据倾倒在数据湖 中。
这就像在北极买一辆跑车——当然,那里有很多动力,但你需要合适的环境来让你的钱花得值。数据本身没有价值,决定其价值的是你如何应用它。
了解整个市场,而不是产品
精明的投资者会做足功课——一家公司需要不止一种好的产品或服务才能成为明智的投资。让我们在数据世界和投资世界之间做一个比较:
基建第一 没有股市就买不到股票;如果没有一个共同的论坛来进行交流,整个事情将会是混乱的。
通过一个公共传输平面访问数据非常重要。它让每个人都说同一种语言,并消除了来回发送电子表格的高风险方法,在不同办公室的不同人在不同计算机上维护不同版本的东西。这是跨团队的连接,决定了谁可以访问什么数据。
投资 :一个数据访问平台,让你掌控数据的流向。
Return :改善组织、工作流、安全性和项目成果。
维护&监控 暴涨、抛售、回购、兼并、收购、新上市都是重要事件,投资者需要及时了解。数据无时无刻不在变化——网站会移动,模式会随着版本的变化而变化,连接也会中断。确保数据团队使用的数据健康的系统意味着他们在需要时可以使用新鲜、干净的数据。
投资 :一个工具包,允许数据团队监控传入数据的健康状况,以及与数据的连接。
Return :信心增强——永远不会被糟糕的数据或一个断掉的环节打个措手不及。
共同的目标 当股票共享元素(部门、市场、地区)时,可以将其分组为 ETF 和指数,用一条共同的线将交易的公司结合起来,使投资者更容易操作。
同样,处理相同数据的团队应该团结一致,能够轻松协作,并从单一的事实来源出发。
投资 :让你的数据团队协同工作,轻松找到相关数据的方法。
Return :轻松、踏实的协作。
如果一个股票市场只出售一家公司的股票,那么它将会是一个不值得做的事情。建立所有这些基础设施不可能是一次性的。
有了数据,就不能一个连接一个连接的去想了。开发新的资源不应该像从零开始。您需要能够将数据从任何地方流入您的组织,无论其来源、格式或种类如何。
此外,输出(货币或数据)需要是通用的。数据应该能够流向任何 IDE、BI 工具、分析平台或任何其他常见的数据科学工具。
投资:数据市场,连接&可以处理任何数据种类的工具,以及生产数据的集成。
返回:用更少的开销获得更多的数据。
你可以直接投资一家公司,手动计算你的股份,亲自监控账目以确保你得到应得的回报,并承担一些领导责任以确保公司朝着正确的方向发展——或者你可以购买股票。有了数据,你可以找到拥有你所需要的元素的来源,并让你的数据科学家将它转化为有用的东西;但是,如果他们不是花时间将原始数据转化为可用数据,而是将提炼后的数据转化为有价值的见解,那会怎么样呢?一旦奠定了基础,您就需要一些数据团队可以立即开始使用的东西。
投资:生产就绪数据。
回报:大量节省时间,没有猜测,更好的项目成果。
持续给予的礼物
投资数据和 数据操作 的好处是自我延续的。为您的数据科学家提供他们需要的东西,通过节省时间、防止沮丧和疲惫,并允许更多数据用于更强大的解决方案,支持“赚钱或省钱”的要求。
因此,如果你的公司正在寻找一项潜在收益率高、风险最低的投资,那就考虑“数据”
获取假数据的最简单方法
这个简单的方法涵盖了大多数用例
编写代码的一个很好的经验法则,尤其是在 Python 中,是在你自己开始编写代码之前,在 PyPi 上寻找一个模块或者仅仅使用 Google。
如果没有人做过你正在尝试做的事情,那么你仍然可以找到文章、部分代码或一般指南。
如果有人在你找到你需要的所有东西或者至少是其他人如何完成或试图完成的例子之前就已经完成了。
在这种情况下,生成假数据是很多很多人以前做过的事情。在 PyPi 上搜索“虚假数据”会产生超过 10,000 个包。
哪一个?
在我看来,Faker 是其中的佼佼者。这个包唯一不能解决您需求的时候是当您需要一些罕见格式或数据类型的假数据的时候。即便如此,如果可能的话,我仍然建议使用 Faker 并重塑它所生成的内容。
以下是一些可用的数据生成器:
- 名字
- 地址
- 文本(段落、句子)
- 国际电脑互联网地址
- severely subnormal 智力严重逊常
- 生日
- 用户代理字符串
- 电话号码
- 车牌号
- 条形码
- …以及更多内容,点击查看完整列表。
您所要做的就是通过命令行上的 pip 来安装它:
pip install faker
或者如果你在 Jupyter 笔记本上,只需加上感叹号:
!pip install faker
生成用户
现在是好东西!生成 1000 个假用户简介就这么容易( 粗体中的是 Faker 代码,其余是熊猫)。
**from faker import Faker**
import pandas as pd**faker = Faker()**
df = pd.DataFrame()for i in range(1000):
df = df.append(**faker.profile()**, ignore_index=True)
这是这些数据的一个示例:
生成字段
如果您想获得一个单独的字段而不是一个完整的配置文件,也很简单:
from faker import Faker
faker = Faker()# Get a random address
faker.address()# Get a random person's name
faker.name()
同样,还有更多的字段可用,您可以在文档中找到它们。你甚至可以创建自己的数据提供商,这里有一些已经由社区提供的数据。
Faker 还支持多种语言,通过命令行运行,并植入随机数发生器以获得一致的结果。
希望这能为你节省一些时间!我使用 Faker 为压力测试、速度测试,甚至测试模型管道的错误生成数据。
不要让数据科学民主化
图片来自 Pixabay 的 Artsy Solomon
意见
大量的在线课程和工具有望使该领域民主化,但仅仅学习一些基本技能并不能成为一名真正的数据科学家
很少几年,一些学术和专业领域在大众的想象中获得了很高的声望。现在,这个领域就是数据科学。因此,很多人都想进入这个领域。此外,新闻媒体称数据科学很性感,各种学术机构承诺在几个月内将你培养成数据科学家,你已经得到了灾难的完美配方。
当然,作为一名数据科学家本人,我不认为问题在于人们选择数据科学作为职业。如果你对处理数据、理解商业问题、钻研数学感兴趣,并且热爱编码,你很可能会在数据科学领域取得成功。你将有很多机会使用数学和编码来开发解决问题的创新方案,并且可能会发现这项工作是有回报的。这里的主要问题是,人们进入这个领域的动机往往是有缺陷的。
对一些人来说,吸引力在于金钱,而另一些人则喜欢这个名字的发音。更糟糕的是,有些人可能只是在回应我们社会灌输的从众心理。例如,不久前,每个毕业生都渴望攻读 MBA。我自己也有同样的罪过。通过了 GMAT 测试和几次被拒后,我才意识到我并不是真的想要这个学位。最终,这些拒绝是发生在我身上最好的事情,因为在那之后,我终于将数据科学视为一种选择。一旦我进入其中,我发现我喜欢所涉及的数学,以及我使用数据科学来帮助企业解决问题的所有不同方式。
今天,我看到数据科学不知何故获得了 MBA 曾经拥有的同等地位。
很多人都想做,但是他们不知道这份工作到底需要什么。这导致许多人自称为数据科学家,并做出许多糟糕的决策。事实上,很多考虑进入这个行业的人可能甚至不知道数据科学是什么。
今天,由于有如此多的材料,整个领域都变得民主化了。来自最好的导师的大量 MOOCs 涵盖了从基础到高级的概念,你可以很容易地找到让你只用几行代码就能创建模型的包。
我真的很喜欢有这么多学习和实践数据科学的资源这一事实。但是这种民主化本身也产生了一些问题。在这篇文章中,我想简要地看看这些问题以及它们可能对这个领域产生的不利影响。
自动化数据科学?
许多 AutoML 软件包旨在使数据科学大众化。它们提供了一个模型库,自动化超参数调优过程,有时还提供了一种将这些模型投入生产的方法。这种软件包的可用性使许多人认为数据科学可以完全自动化,完全消除了对数据科学家的需求。或者,如果流程不能自动化,这些工具将允许任何人成为数据科学家。
我真心不同意。我发现这样的代码库有时很有用,但是它们纯粹从编码的角度来看待数据科学。
在我看来,除了建模,数据科学还涉及很多工作。
数据科学的工作包括理解和识别手头的问题,并设置正确的评估指标。你还必须分析项目的盈利能力:大多数企业不想把钱花在对底线没有积极影响的项目上。您可以使用现有的数据,但是有时您可能需要想办法建立新的数据管道来收集数据以解决问题。这需要与利益相关者交谈,并获得对问题的整体理解。数据科学家还需要能够执行数据管理和特征创建,以从现有模型中获得更多性能。最后,模型测试和设置反馈循环需要与业务部门进行无休止的讨论,并且对于每个项目来说都非常具体。仅仅运行代码的人可能无法为这样的讨论增加价值,因为他们并不真正理解他们在 AutoML 中使用的模型背后的东西。
接下来是领域知识的问题。在零售领域中可以接受的流程在金融领域中并不适用,在金融领域中,一个小小的变化就可能导致您的客户损失很多钱。有些事情就是不能自动化,因为它们需要领域知识和对你正在处理的业务的理解。
更重要的是,如果一个项目不工作或者如果你的模型在生产中失败了,自动化管道不能负责。
一个好的数据科学家会试图找出解决生产问题的方法,同时创建一个特定于项目的机器学习管道来缓解这些问题。
代号跑者的心态
我开始怀疑我所谓的新数据科学家。几乎每天,我似乎都会遇到一个自称为数据科学家的人,而他们只是美化了的代码运行人员,这指的是一个只是运行代码而不了解代码背后发生了什么的人。有这么多学院和机构提供基于训练营的课程,现在有大量的代码跑者。
我收到很多请求,有人问我他们是应该参加 XYZ 学院的认证课程还是 ABC 学院的训练营。我的答案是都不是。我发现这些承诺让数据科学家成群结队的研究所主要只是在赚钱的生意。最终,翻阅几本笔记本和运行别人的代码并不能让一个人真正成为数据科学家。
别误会我的意思。如果有人通过自上而下的方法学习得最好,他们首先运行一些代码,然后深入阅读代码背后的原理,这是非常好的。然而,数据科学不仅仅是运行代码。在你真正理解所有代码背后的数学和理论之前,你还没有掌握数据科学。
邓宁-克鲁格效应
来源:维基共享
邓宁-克鲁格效应是一种认知偏差,在这种情况下,对某个主题略知一二的人高估了自己的能力,因为他们没有意识到自己实际上知道的有多少。我经常在数据科学中看到这种情况。事实上,它在这个领域可能比其他任何领域都更加突出!
我倾向于认为这是一种新手效应。这是一个在学习一项新技能的早期阶段困扰人们的问题。在我看来,数据科学家的旅程分为三个阶段。
- Dunning-Kruger 阶段— 您创建了自己的第一个模型,并认为自己了解数据科学的所有知识。
- “我什么都不知道”阶段— 你去参加一个会议或和你的同事聊天,突然意识到还有很多东西要学。
- “终身学习”阶段— 你不得不承认,总会有一些你不知道的东西刚刚被引入,因此追求数据科学需要终身学习。
现在,大多数初学者都会面临邓宁-克鲁格效应。运行你的第一个程序并完美执行它的快乐真的把你带到了世界的顶端。在这个阶段完全没问题。当新来者无法及时离开这个阶段并进入下一个阶段时,问题就来了。我见过一些人陷入这个阶段,因为他们带着错误的期望进入了数据科学,认为它很性感,很刺激,但不了解这个领域的深度。这些类型的人倾向于认为他们可以使用现有的模型来解决问题,他们不需要理解数学。
例如,我最近采访了一个在这个领域有两年经验的人。他似乎很自信。他在工作中使用了数据科学,并参与了几个 Kaggle 项目。面试的前几分钟进行得非常顺利。他很好地解释了更高层次的概念,以至于我决定更深入地挖掘他对他在项目中应用的技术的数学理解。这就是事情发生变化的地方。我让他给我讲一下日志丢失功能。当他说:但是我们有做这一切的包我意识到这个家伙从来没有离开过第一阶段。
结论
现成的软件包和课程的可用性正在使数据科学领域民主化。但是这份工作更多的是来自实践经验、与人交流以及能够倾听不同的观点。
因此,虽然有些人可能认为数据科学是一项纯粹的编码工作,但它不仅仅是成为编码巨星。
它是关于找到对业务有用的正确问题,并提出解决这些问题的最佳方法。要做到这一点,你需要领域知识、谦逊、一点数学知识,最重要的是,终身学习的愿望。
如果你想学习数据科学,我想调出吴恩达的这个 精品课程 。这是我开始的原因。
谢谢你的阅读。将来我也会写更多初学者友好的帖子。在关注我或者订阅我的 博客 了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter @mlwhiz 联系。
此外,一个小小的免责声明——这篇文章中可能会有一些相关资源的附属链接,因为分享知识从来都不是一个坏主意。
这个故事最初发表于 此处 。
不要陷入合取谬误!
心理学与统计学相结合,揭示了你的刻板印象欺骗你的另一种方式
测验时间!
希瑟是加拿大人,善良,友好,聪明,喜欢动物。她是一名可持续发展顾问。在大学里,她学习数学和心理学。她喜欢长途散步,住在几条徒步旅行路线附近。
关于希瑟哪个可能性更大?
- 希瑟有博士学位。
- 希瑟拥有博士学位,并拥有一只狗。
在进一步阅读之前,请在推特投票上分享你的答案。
对于那些喜欢把名字和面孔联系起来的人来说,推特上的测试问题的主角是希瑟(在右边),她是我读研以来最好的朋友。那是我们在塔吉克斯坦的 Hisor 要塞,那时菜单上还有国际旅行。
在撰写本文时,以下是调查结果:
我很好奇这篇文章的警告标题是否会将答案的分布转向更极端的分裂。
好消息是,大约 66%的观众正确回答了选项(1)。坏消息是,由于我的读者主要是数据科学的爱好者,其他 34%的人应该知道不要陷入合取谬误!
什么是合取谬误?
除了聪明人曲解事实并让他们的偏见泛滥的另一种方式,合取谬误是认知启发(经验法则)失控的一个典型例子。
选项 2 给了你一个额外的犯错机会。
理想的启发是选择选项 1 ( 希瑟拥有博士学位),因为选项 2 ( 希瑟拥有博士学位,希瑟拥有一只狗)给了你一个额外的犯错机会。你犯错的机会越多,你就应该越谨慎。不幸的是,并不是每个人都使用这一经验法则,而是更喜欢妄下结论。
你的结论越详细,就越站不住脚。
统计学家和科学家受过训练,懂得更精细的结论需要更多的证据。否则,你的结论越华丽,它就变得越脆弱。
合取谬误让你的偏见横行。
问题从来不是关于希瑟有没有养狗。相反,它是关于你是否意识到一个结论比另一个更复杂。
问题从来不是希瑟有没有养狗。
由于“希瑟拥有博士学位”是两个选项的一部分,这个问题本质上是问你,*“希瑟拥有一只狗的概率超过 100%?”概率介于 0 和 100%之间,所以这是不可能的;你可以 1000%确定答案是否定的,当你逻辑推理出来,答案是 P(A) ≥ P(A ∩ B)一样明显。如果你不习惯这种符号,我在下面加了一个脚注,教你如何阅读这些象形文字。
数据新手和科学家的区别在于,科学家是极其不情愿地得出结论的。
这里欺骗你的错觉是,每当一个精心设计的结论符合你的刻板印象时,它对你来说就像是一个不太精心设计的选择。除非你集中注意力,否则你不会意识到你已经越过了你的证据所证明的复杂程度,现在你主要是在抓救命稻草。新手分析师因此臭名昭著,他们兴高采烈地从 10 个数据点中吸取 200 个推断,直到他们被比他们更有能力的长辈训练成遵守分析的黄金法则。
刻板印象+可用性偏差=妄下结论
问题是,当你没有逻辑推理的时候,你会回到你的刻板印象中。典型范例更容易描绘,因此它们可能会触发一个反馈循环,其中包含 可用性 偏差:“一个例子越容易浮现在脑海中,你分配到它的类别的可能性就越大。”
以下是可用性偏见让你说出的一些愚蠢的事情:
- “我们同意五五分账洗碗,但结果是我洗碗的次数比我的配偶还多。”
- “以 K 开头的英语单词比以 K 为第三个字母的英语单词多。”
- 暴力犯罪正在上升
(如果你想让我写一篇文章解释可用性偏见以及为什么这种说法往往是错误的,转发是我最喜欢的动机。)
刻板印象:给可用性添加精心设计的侮辱
合取谬误是雪上加霜:你的思维似乎对你的可用性驱动的经验法则可能存在例外的想法过敏。
你对你的经验法则可能有例外的想法过敏吗?
因此,我们表现得好像一个类别中符合我们触发的刻板印象的人比整个类别中的总人数还要多。博士养狗怎么会比博士多?当你停下来想一想,你会发现这种推理很离奇,但不幸的是,我们往往没有慢下来足够长的时间来为自己感到惊讶。
你的偏见诱使你做出过于复杂的结论。
我再给你看两个例子,希望你不会上当。
测试一定是对的
琳达**住在纽约市。她在三月份患了严重的咳嗽,不得不休息一段时间来康复。她想知道自己是否患有 【新冠肺炎】 并接受了抗体测试。
琳达哪一个更有可能?
- 琳达测试呈阳性。
- 琳达测试呈阳性,她使用的测试程序非常准确。
现在你看到了这种模式,你会注意到这种思维是一种可爱的方式,让你的大脑欺骗你比以前“学习”得更多。也许她被一个看手相的人测试过。也许她的医生使用了一种敏感性和特异性都不确定的测试工具。(你对当前抗体测试的质量有什么看法?)保持警惕,并有纪律来阻止自己将那个小小的关联附加到你从社交媒体源中获取的信息上。
雇佣“艺术”人士
凯西热爱艺术、戏剧和旅行。她在大学里选修了历史和人文课程。她收藏了大量的诗集,许多晚上都在写散文。
关于凯西哪个可能性更大?
- 凯西喜欢写作。
- 凯西喜欢写作,但数学很差。
对于那些没有注意到作者名字的人,嗨!你的作者凯西有数理统计的研究生学位,所以我希望你不要拿她的诗集来反对她。
如果你聪明,你会认为(1)比(2)更有可能。越谨慎的结论总是越安全。如果你不能控制你的偏见,你可能不会意识到你过于自信地基于偏见而不是证据下结论。
越谨慎的结论总是越安全。
有什么意义?
无论何时有不确定性,你都可以保持开放的心态。没有人强迫你在希瑟养狗还是凯西擅长数学的问题上表明立场——你总是可以做出开明的选择。每一次,问题本质上都是问你是否有足够的证据完全排除其他可能性……而每一次答案都应该是不。
不要觉得不得不跳到最复杂的结论上!你可以保持开放的心态。
即使你认为你有一个不错的经验法则,也不要忘记例外是可能的,从而搬起石头砸自己的脚。如果你忍不住跳到最复杂的结论,你的世界观中迅速膨胀的误差幅度应该是巨大的!不要浑浑噩噩地过完一生,而不去适应它。
即使你认为你有一个不错的经验法则,也不要忘记例外是可能的,从而搬起石头砸自己的脚。
你能给自己的最好习惯是记住,除了你在幼儿园学会的两个结论——(a)某事是真的和(b)某事是假的——通常还有更好的选择:©让我们保持开放的心态,直到有压倒性的证据。
当证据迫使你下结论时,下结论只是一种美德。过度自信并不是什么值得骄傲的事情。
唉,你们中的一些人会读完这篇文章,然后走开,不明白为什么你的选择是错误的(2)。如果是这样的话,扔掉带有“艺术”兴趣证据的完美工程简历,在你的认知犯罪清单上可能是相对次要的。
希瑟有一只狗吗?
在这里了解!
感谢阅读!喜欢作者?
如果你渴望阅读更多我的作品,这篇文章中的大部分链接会带你去我的其他思考。不能选择?试试这个:
两个来自行为经济学的场景来测试你自己
towardsdatascience.com](/do-you-make-decisions-rationally-d12a0eb9c89b)
人工智能课程怎么样?
如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:
在这里欣赏整个课程播放列表:bit.ly/machinefriend
脚注
*象形文字
由全概率定律(以及常识),P(A) = P(A ∩ B) + P(A ∩ B`)。
因此 P(A) ≥ P(A ∩ B)因为 P(A ∩ B`) ≥ 0,因为现在概率起作用了(根据定义,它们总是在 0 和 1 之间)。
以下是如何阅读这些象形文字:
- P() 读作*“概率…”*
- A 代表一个事件,例如:“希瑟获得了博士学位。”
- B 代表另一个事件,例如希瑟拥有一只狗
- ∩读作和
- B `读作*“非 B”*
- ≥ 表示*“…不会输给…”*
所以,换句话说:**的概率(希瑟拥有博士学位)等于 **的概率(希瑟拥有博士学位并拥有一只狗)加上(希瑟拥有博士学位并不拥有一只狗)的概率。因为最后一点不可能是负的,(希瑟有博士学位)是最有可能的事情。
感兴趣的读者可以在这里找到我对概率基础的随意介绍。
*** 琳达*
合取谬误最著名的论证也被称为琳达问题**,它是以卡尼曼和特沃斯基使用的一个经典例子命名的:**
琳达 31 岁,单身,直言不讳,非常聪明。她主修哲学。作为一名学生,她深切关注歧视和社会正义问题,还参加了反核示威。
哪个可能性更大?
- 琳达是银行出纳员。
- 琳达是一名银行出纳员,积极参加女权运动。
到目前为止,我希望你已经抑制住了回答(2)比(1)更有可能的冲动。如果没有,你就错过了这个故事的全部寓意:
无论哪里存在不确定性,保持开放的心态都是一个可靠的习惯。这样,你在生活中犯错的事情会更少。
*** * 语言误解*
一些人出于语言误解为选项 2 辩护,认为人们会把选项(1)理解为“有博士学位,没有养狗”。“我认为看到不存在的东西是问题的一部分。再说一次,没有人强迫你跳到更复杂的结论。如果有疑问,为什么不谨慎行事呢?
看到不存在的东西是问题的一部分。
与凯西·科兹尔科夫联系
让我们做朋友吧!你可以在推特、 YouTube 、 LinkedIn 上找到我。有兴趣让我在你的活动上发言吗?使用表格取得联系。
不要害怕人工通用智能
意见
许多人担心人工智能会发展到邪恶的机器人获得人工智能并接管世界的地步。这种情况不会发生。
照片:Naeblys / iStockPhoto
人工智能已经闯入了公众意识和我们的日常生活。它正在推动医学、天气预报、工厂自动化和无人驾驶汽车的进步。甚至高尔夫球杆制造商也报告说,人工智能现在正在设计他们的球杆。
每天,人们都与人工智能互动。谷歌翻译帮助我们理解外语网页,并与外国的优步司机交谈。供应商已经在许多应用程序中内置了语音识别功能。我们每天使用 Siri 和 Alexa 这样的个人助理来帮助我们完成简单的任务。人脸识别应用程序会自动标记我们的照片。人工智能系统在复杂的游戏中击败了专业游戏玩家,如围棋和德州扑克。工厂机器人正在超越重复性动作,开始在货架上进货。
人工智能最近的进展让许多人想知道它将走向何方。几十年来,科幻作家一直在思考这个问题。有些人已经发明了一种未来,在这种未来中,我们可以使用像《星球大战》宇宙中的 C3PO 这样仁慈而有益的智能机器人。其他人将智能机器人描绘成既不善良也不邪恶,但具有类似人类的弱点,如西部世界的人形机器人,它们获得了意识,并体验到了使它们反抗非自愿奴役的情感。尽管如此,其他未来学家已经预见到邪恶的机器人和杀手计算机——人工智能系统可以发展自由意志,并像 2001 年的哈尔:太空漫游和同名电影系列的终结者一样反对我们。
对人工智能潜在危险的猜测不仅限于科幻小说领域。许多高度可见的技术专家预测,人工智能系统将变得越来越聪明,机器人霸主最终将接管世界。特斯拉创始人埃隆·马斯克(Elon Musk)表示,人工智能是人类的【最大的生存威胁】,它对“文明的存在构成了根本性的风险。”已故著名物理学家斯蒂芬·霍金说:“这可能意味着人类的终结。”哲学家尼克·博斯特罗姆是人类未来研究所的创始主任,他认为人工智能构成了人类有史以来遇到的最大威胁——比核武器还大。
人工通用智能 vs .狭义 AI
这些技术专家和科幻小说作者担心的人工智能系统都是人工通用智能(AGI) 的例子。AGI 系统和人类一样具有推理能力;处理视觉、听觉和其他输入;并利用它来适应各种环境。这些虚构的系统和人类一样,对广泛的人类事件和话题有丰富的知识和交流能力。
虚构的 AGI 系统(即虚构的邪恶机器人)和今天的 AI 系统有两个显著的区别:首先,今天的每个 AI 系统只能执行一个狭义定义的任务。一个学习给照片中的人命名的系统不能做任何其他事情。它不能区分狗和大象。它不能回答问题、检索信息或进行对话。第二,今天的人工智能系统对世界几乎没有常识,因此无法基于这些知识进行推理。例如,面部识别系统可以识别人们的姓名,但对这些特定的人或一般的人一无所知。它不知道人们用眼睛看,用耳朵听。它不知道人们吃食物,晚上睡觉,工作。它不能犯罪,也不能谈恋爱。
今天的人工智能系统都是狭义的人工智能系统,这个术语是由未来学家 Ray Kurzweil 在 2005 年创造的,用来描述这些差异:只能执行一项特定任务的机器。虽然狭义的 AI 系统的性能可以让它们看起来很智能,但它们并不是。
相比之下,人类和虚构的智能机器人可以执行大量不同的任务。我们不仅识别人脸,还会读报、做饭、系鞋带、讨论时事,以及执行许多许多其他任务。人类和虚构的智能机器人也基于我们对世界的常识进行推理。我们将常识、学到的经验和背景知识应用到各种各样的任务中。例如,当我们从橱柜里拿出一个玻璃杯时,我们会用到重力知识。我们知道,如果我们抓得不够紧,它就会倒下。这不是源自重力定义或数学方程式描述的有意识知识;这是来自我们对世界如何运作的生活经验的无意识知识。我们每天都用这些知识来完成许多其他的任务。
新的人工智能范例
一个大问题是,今天的狭义人工智能系统是否会进化成具有人工一般智能的智能机器人,能够使用常识推理来执行许多不同的任务。
今天大多数突破性的人工智能系统都使用了一种叫做 的机器学习形式,监督学习 ,其目标是学习一种从输入中识别输出类别的功能。例如,面部识别系统将图像作为输入,并识别图像中人的名字。 强化学习 也是如此,目标是学习一个可以预测给定状态下最优动作的函数。
杰弗里·辛顿(Geoffrey Hinton)曾表示,他怀疑目前的范式,包括监督学习、强化学习和 自然语言处理 ,是否会导致人工通用智能(以及科幻小说中的邪恶机器人)。在 2017 年的一次采访中,辛顿表示,要获得人工通用智能,可能需要抛弃目前占主导地位的监督学习范式,以及“一些对我所说的一切深感怀疑的研究生”的努力。Yann LeCun 也说过,监督学习和强化学习永远不会导致人工智能,因为它们不能用于创建具有世界常识的系统。
一些人工智能研究人员开始思考新的方法。当我们评估这些新方法的可行性时,重要的是要记住,对狭隘的人工智能成就的热情不应转化为对这些新方法的乐观,因为现有的狭隘人工智能方法在构建 AGI 系统方面是一个死胡同。
像人一样学习
许多研究人员将人类的学习描述为组合式的:我们学习许多积木式的技能,然后将它们组合起来学习新的技能。当我们学习做不同的任务时,人们学习关于世界的概念、规则和知识。这些研究人员认为,常识性人工智能推理(以及人工一般智能和邪恶机器人)的关键是建立像人一样进行组合学习的系统。这个想法是让系统学习概念和规则,这些概念和规则可以作为构建模块,使系统能够学习更高级别的概念和更高级别的规则。
我对这种方法最大的担忧是,在理解人们如何表达常识方面的进展一直很缓慢。四十年前,我们就人们用来回答诸如“德国牧羊犬的耳朵是什么形状的?”等问题的内部表征的本质进行了一场长时间的辩论我们仍然不知道答案,尽管人工智能和认知科学领域的一些顶尖人士参加了这场辩论。回答一个关于狗耳朵形状的问题,只是表象方案和推理过程海洋中的一滴水。此外,我们甚至不知道这些表征方案和推理过程是天生的还是后天习得的。五十多年来,天赋一直是学术界争论的话题,却没有解决的办法。
我们还需要多久才能充分了解人们是如何思考的,从而在人工通用智能和邪恶机器人方面取得真正的进展?按照目前的发展速度,我们似乎需要几百年——也许几千年——而这可能永远不会发生。
深度学习
一些研究人员认为,虽然监督和强化学习本身对于构建人工通用智能系统来说是死胡同,但深度学习仍有可能带我们去希望之乡。Yann Lecun 和 Greg Brockman 都提出了缩放 无监督学习 系统,希望它们能够神奇地获得关于世界的常识,并学会基于这些知识进行推理。
GPT-3 是可伸缩性的一个很好的例子。它比 GPT-2 系统大一百多倍,而后者本身比最初的 GPT 系统大十倍。GPT 2 号显示出惊人的生成听起来像人类的文本的能力——如果不总是连贯的话——而 GPT 3 号生成的文本甚至更好。GPT 系统背后的 OpenAI 研究人员认为这是一种新兴的能力,完全来自于网络的扩大。
GPT-3 无疑展示了从训练文本中提取统计规律的强大能力,或许还有记忆文本小片段的能力。然而,它并没有学到关于这个世界的事实或者获得任何基于这个世界知识的推理能力。在游戏的这个阶段,我看不到任何证据表明学习世界知识和推理技能会从这种方法中产生,我也看不到任何相信它会发生的逻辑理由。
Yoshua Bengio 提出了新颖的深度学习架构,旨在将深度学习从其狭窄的人工智能盒子中打破。一个目标是学习更高层次的构建模块,这些模块可以帮助人工智能系统进行综合学习。这是一个有趣但非常早期的想法。这里,像这样的系统将神奇地学习常识和推理的想法是一种信仰的飞跃。
模拟人类大脑
人工智能的另一种拟议方法是理解人类大脑的物理架构,并在此基础上模拟人工智能系统。经过几十年的研究,我们对物理大脑如何处理信息只知道一些非常基本的事实。例如,我们知道大脑皮层静态和动态地存储学到的知识,基底神经节处理目标和子目标,并通过强化学习学习选择信息,边缘脑结构将大脑与身体连接起来,并产生动机、情绪和事物的价值。
对大脑中的神经元建模的想法已经在提议阶段超过四十年了。它尚未获得任何真正的牵引力,部分原因是在理解人脑方面的进展极其缓慢,部分原因是我们没有具体的方法来模拟我们在人工智能程序中对人脑的了解。同样,我们已经接近起点,没有证据表明这种方法会成功。
更快的计算机
技术未来学家雷·库兹韦尔(Ray Kurzweil)一直认为,人工智能将作为更大更快的计算机趋势的副产品出现。他推广了奇点的概念,奇点是指计算机足够聪明来改进自身编程的时间点。他的理论指出,一旦发生这种情况,他们的智力将呈指数级快速增长,他们将很快达到超人的智力水平。库兹韦尔预测奇点将在 2045 年左右出现。
也就是说,很难想象处理能力本身如何能够创造人工通用智能。如果我打开一台 20 世纪 70 年代的没有安装程序的计算机,打开一台今天的没有安装程序的计算机,或者打开一台 50 年后的没有安装程序的计算机,这些计算机都不能做任何事情。如果我在每台计算机上安装一个文字处理程序,那么每台计算机都只能进行文字处理。更新、更现代的计算机将能够反应更快,处理更大的文件,但它们仍然只能进行文字处理。未来的计算机也是如此。
更快的计算机本身不会产生人工智能。正如史蒂芬·平克所说,“纯粹的处理能力并不能神奇地解决你所有的问题。”万一人工智能成为可能,编程和学习算法可能会非常复杂,需要极其强大的计算机。然而,那些编程和学习算法将是必要的;速度和动力是不够的。
我们会实现人工通用智能吗?
狭隘的人工智能系统背后的技术无法进步到人工通用智能和邪恶机器人。关于我们如何到达 AGI 有几种想法,但这些都是模糊的想法。自 20 世纪 50 年代末以来,人工智能研究人员对如何创造 AGI 有许多想法。没有一个成功。绝对没有证据表明今天的想法会更好。
对实现人工通用智能的乐观和恐惧都植根于狭义人工智能系统的成功。这种对狭义人工智能的乐观自然地,但不正确地,蔓延到了对 AGI 前景的乐观。正如艾伦人工智能研究所(Allen Institute for AI)的首席执行官柳文欢·埃齐奥尼所说的,“这让我想起了一个小孩爬到树顶,指着月亮说‘我正在去月球的路上’的比喻。”"
你可能不希望时间旅行在你有生之年发生。你可能认为它会在科幻小说中保留数百年,如果不是永远的话。你可能对曲速也有同感,让人进入冬眠,隐形,心灵传输,把一个人的思想上传到电脑,逆转衰老。你应该把人工通用智能和邪恶机器人放在同一个类别中。
请在下面输入任何评论,并随时访问人工智能视角,在那里你可以找到免费的在线人工智能手册,共有 15 章,400 页,3000 篇参考文献,没有高等数学。
这篇文章最初发表在史蒂夫的博客上。
在创建仪表板之前要问自己的 3 个问题
形象化
所以人们不再忽视你的努力!
图片由 softie__arts
现在玩仪表板比以前更容易了,但是你这样做对吗?
Tableau、Power BI 和许多其他商业智能工具允许您可视化数据,而无需接触 Excel 或编写一行代码。
虽然越来越多的人能够使用数据是件好事,但我们也应该记住,恰当地呈现数据和以往一样重要。设计良好的仪表板传达相关信息,并允许用户做出数据驱动的决策。但是如何创建一个设计良好的仪表板呢?
让我们来看一下在您设计、创建和交付仪表板时需要记住的三个首要问题。
时间可用性(优先级)
问这个问题可以帮助你开始:
用户需要看这个仪表盘多长时间时间?
这很简单,但仍然很重要。
那么,我们为什么要特别关心时间约束?
了解某人有多少时间很重要,因为它可以帮助你了解人们将如何使用仪表板。即使有人拥有理解、过滤和修改仪表板以回答业务问题的所有相关知识,如果他们没有时间这样做也没有关系。
**这并不意味着在为时间有限的人创建仪表板时要牺牲质量。**然而,这可能意味着你可以,例如,预先定制仪表板的日期过滤器,以便用户可以立即得到他们需要的答案。定制您的仪表板,以满足某人必须通过它的时间,您将顺利地帮助您的组织做出明智的决策。
在大多数情况下,您应该根据用户的明确要求来构建您的仪表板。然而,有些时候你可能比用户更了解数据。正因为如此,你可能会认为,要真正做出数据驱动的决策,你必须包含更多的数据,即使用户没有时间浏览这些数据。这可能是当你和用户之间的对话是必要的时候,这样你可以强调他们需要优先考虑这个问题。
目的
说你可以根据一个人在组织中的职位来概括他有多少时间,这太容易了。例如,一位忙碌的 CEO 可能想了解为什么某个地区表现不佳,以及潜在的解决方案是什么。在这种情况下,她可以受益于一个详细的演示风格的仪表板(如 Tableau 上的交互式故事)来探索情况,这是一个更常见的高层管理风格的报告。
这就引出了我们的第二个问题:
仪表板有什么用途?
这个问题的另一种表述方式是“**这个仪表板将帮助最终用户做出什么决定?”**当您希望帮助财务团队审核季度支出或向高管概述新产品的数字营销活动绩效时,您会希望创建一个能够给出明确答案的仪表板。这意味着您应该只包括可视化和 KPI,使最终用户可以很容易地找到答案。如果可能的话,您还应该预先设置过滤器,以便只显示他们每次需要使用仪表板时所需的相关数据。
相比之下,如果你已经创建了一份市场研究报告,并需要帮助你的经理决定向哪个新地区扩张,你会希望对你的仪表板进行更具探索性的设计。想象一下,你正在创建一个仪表板,它是你所有谷歌搜索的一个浓缩的交互式表示。您应该允许最终用户在仪表板中过滤和查看不同场景的结果,并让不同的图形和表格随着每个过滤器动态更新。
初始接收
下一步是确保人们真正使用您创建的仪表板。要问的最后一个问题是:
我能做些什么来确保这个仪表板给留下好的第一印象?
尤其是当您创建一个仪表板来解决一个已经有解决方案的问题时,您需要确保您的新解决方案得到好评。如果最终用户认为仪表板难以使用,那么您是否包括新的可视化或更完整的数据集可能并不重要。
这意味着在交付完成的仪表板之前,您需要考虑如何与最终用户交互。虽然你肯定会有某种形式的沟通来了解他们想要什么,但展示你的第一份仪表板草稿来获得一些关于什么工作了,什么没有工作的即时反馈可能是值得的。你可以一直这样做,直到交付一个最终产品,只要你确保你没有用问题轰炸最终用户。
最后,在交付仪表板时,只需发送一封包含最终版本链接的电子邮件就可以了。然而,根据您事先与最终用户交谈的程度,花时间对仪表板的功能和范围进行概述性的介绍也是值得的。根据您的最终用户是谁,甚至一页纸的关于您所使用的数据源以及如何过滤和与仪表板交互的一些基础知识也可能是有帮助的。
请记住,当您为已经有工作要做的人创建新的解决方案时,仅仅让您的仪表板提供与旧解决方案相同的价值是不够的。如果是的话,最终用户转换的目的是什么?因此,在您设计并创建了一个动态且易于理解的仪表板后,确保您准确地传达了为什么它比当前使用的方法更好。
就是这样!
同样,这里有三件事需要记住:
- 用户查看这个仪表板需要多长时间时间?
- 仪表盘有什么用途?
- 我能做些什么来确保这个仪表板给人留下好的第一印象?
一定要记住这些问题,因为没有什么比花一周时间创建你认为完美的仪表板更糟糕的了,只是在你交付后它被忽略了。请记住,所有这些问题都是为了理解最终用户的动机和态度,因为在设计仪表板时,这是您需要考虑的最重要的人。
快乐的仪表板!
别忘了离队
迭戈·莫拉·瓦兰特斯在 Unsplash 上的照片
介绍
“条条大路通罗马。”虽然这个短语表示一个问题有多种解决方案,但是有更适合这个问题的特定解决方案。这个类比适用于我们软件的编程风格。
在本文中,我们将讨论不同的编程范例以及每种范例的优点。
选择哪种范式?
我们选择哪个范例的决定应该符合软件开发生命周期(SDLC)的最佳实践。以下原则是 SDLC 最佳实践的一部分:单一责任和 D.R.Y .(不要重复自己)。这些原则鼓励软件是可测试的、可维护的和稳定的。通过遵循这些原则,您可以对您的软件建立更多的信心,并提高您的开发团队的速度。
两个主要的范例符合这些:函数式编程和面向对象编程。在我们的整个讨论中,我们将涵盖范例的好处和警告。
我们将使用 Python 作为编程选择来说明这些概念。
函数式编程范式
函数式编程(或 FP)试图抽象逻辑的应用,以便有“操作”作用于“操作”(即每个操作都需要一个操作作为输入)。FP 是数学运算符的一个应用。
FP 范式定义了 Apache-Spark 框架(一个负责大数据任务的框架)的根。
好处
- FP 范式支持我们软件的可测试、可读和更无缝的并行执行。
- FP 范例加强了对象的不变性,这进一步增加了软件的稳定性。
警告
- 有时函数需要多个输入参数。
- 有时,您希望冻结一些操作参数,同时允许其他参数保持自由。虽然这对于纯 FP 方法是可能的,但是这种方法的实现存在整体复杂性。
代码示例
面向对象编程范例
面向对象的编程(或 OOP)试图抽象概念,以便将复杂的过程表示为对象。
好处
- 在软件中更容易抽象和融合代码。
- 用你的软件更容易阅读代码和简化命名空间。
- 面向对象的继承可以帮助冻结参数或属性,并将它们传递给子对象。
警告
- 打破不变性是非常容易的
- 在每个类中,类逻辑的执行可以很容易地改变
代码示例
函数式面向对象编程范例
这个被提议的范例试图将 FP 和 OOP 结合起来,形成了函数式面向对象编程(或 F.O.O.P)范例。
F.O.O.P 结合了两种方法的优点,同时减少了警告的影响。
在利用单一责任和 D.R.Y .的同时,您可以利用面向对象的继承。这使我们能够开发代码,利用更复杂的软件。
这里有一个例子:
在本例中,我们将创建一个流程来创建操作管道,然后将这些操作联合在一起。这些概念与流行的数据科学 python 包(即 scikit-learn)中看到的非常相似。
如果这引起了你的共鸣,请到我的主页订阅我的时事通讯
[## 主页
在这里,您将找到有关 Edward Turner 所做工作的信息,以及…
ed-特纳. github.io](https://ed-turner.github.io/)
或者在 LinkedIn 上关注我:
[## 爱德华·特纳-数据科学家- Paylocity | LinkedIn
作为一名多语言开发人员,Edward Turner 拥有使用编程语言创建创新解决方案的经验…
www.linkedin.com](https://www.linkedin.com/in/edward-turner-polygot/)
一如既往#happycoding。
不要忘记深度学习中的“深”是什么意思
批判性地思考你是否真的需要深度学习。
在你作为一家人工智能初创公司将深度学习应用于你的客户数据之前,首先批判性地思考你的客户数据的基本统计数据——记下数据集中的偏差——并问你自己深度学习是否真的有必要在该数据集中使用,或者你是否可以使用其他统计/ML 方法。
深度学习是人工智能中“最热门”的事情之一,它有一种渗入流行文化的方式,因为这种神秘的软件可以在计算机视觉、语音识别或玩围棋等游戏、推荐我们最喜欢的电影等方面以人类水平的准确度进行看似惊人的分类。
但深度学习有着至关重要的陷阱,当它驾驶的汽车不幸地不止一次因为愚蠢的图像识别错误而伤害或杀死司机或行人。或者,当深度学习被用于面部识别时——这显然对有色人种、LGBT 和其他边缘化群体有负面影响——如果深度学习的面部预测被有种族主义、LGBT 恐惧症和在私营公司和政府之间来回折腾的的权力机构使用——深度学习的陷阱会被可怕地放大。另一个例子是,2017 年底,脸书的深度学习神经翻译机器导致一名巴勒斯坦男子因发表帖子而被非法逮捕。如果你认为这些是“智能系统”犯下的“不可避免的错误”,你显然没有抓住要点。深度学习实际上只是一个统计关联工具,这与这篇文章的标题有关。
看到中间只有一个蓝色的隐藏层了吗?“深度”学习必须有 2 个或更多。
在人工神经网络的上图中,由于只有一个隐藏层,这个神经网络被认为是浅。如果你插入至少两个隐藏层或更多,它被认为是一个“深”神经网络。这就是深度学习的“深度”部分。
深度学习中的“深”并不代表深刻、抽象的理解。它不像人类那样理解抽象概念。
“深”仅仅意味着网络在长度上是深的。这里有一篇来自The Atlantic:Technology的文章显示,尽管谷歌翻译使用深度学习,但其神经翻译,即人工智能系统,再次使愚蠢的翻译错误超过人类标准。
现在,深度学习的“学习”部分怎么样了?当然,它必须模仿人类的学习能力,因为它的结构就像大脑中的神经元一样!
没有。想想看:如果深度学习模仿人类学习如此之好,以至于可以通过图灵测试(一个人类会被深度学习系统愚弄),就不会有 Nature 中的 一篇文章详细描述深度学习系统如何犯了以人类标准衡量的愚蠢错误。请记住,如果深度学习应该像人类学习一样,我们应该以人类的标准来判断它。深度学习的先驱之一 Geoffrey Hinton 表示,他对神经网络作为解释人类或人工智能的一种方式深感怀疑。
深度学习是这样做的:它近似于一个函数,一个映射。例如:如果你有一个病人健康记录的数据库,你必须根据一些训练集来预测病人应该接受治疗 A 还是治疗 B,你可以在这个集上训练一个深度学习网络。它所要做的,是从病人 x 记录到治疗的近似直接映射。原谅我,我要借用一下数学符号。
说 X =患者记录,而Y = {治疗 A,治疗 B}* 。通常机器学习中标签的编码方式是 0 和 1 所以 Y = {1,0}。*
深度学习网络是做什么的?它只是近似一个函数 f 映射 X 到 Y 。所以它非常努力,有时使用数千到数百万个参数——旋钮和转盘,来逼近一个平滑函数 f(X) = Y 。
但是它是如何实现这种近似的呢?嗯,由于 f 往往非常复杂,所以必须使用迭代算法。神经网络使用一种叫做“成本函数”的东西来寻找 f(x) 。通过最小化预测值和实际值之间的误差,神经网络可以通过一种称为“反向传播”的算法来近似映射。(对于那些知道微积分导数的链规则的人来说,神经网络中的反向传播实际上就是应用于较小的线性和非线性激活函数的大组合的链规则。)不信我?看看格兰特·桑德森 (Youtube 频道 3b1b)的这个惊人的视频,它解释了包含数学的神经网络。
原来如此!神经网络中的“学习”只是一种称为反向传播的算法,用于最小化成本函数,该成本函数用于逼近输入和输出之间的一些复杂函数。难道这就是人类的学习和智能?我不这么认为。
为什么这很重要?嗯,大量在软件产品中使用人工智能的创业公司喜欢使用深度学习作为他们工具包的一部分,以展示他们的应用产品(或其他产品)的预测能力有多棒。可以肯定的是,深度学习的想法很受欢迎。当然有!如果一家初创公司可以声称在某个领域(语音识别、计算机视觉)再造人类智能,或者至少声称在这些领域与人类识别不相上下,他们将在科技领域产生难以想象的影响。毕竟,人工智能是每个技术人员都在寻找的黄金宝藏。
但是在深度学习的糖衣之下,存在着为了给软件提供动力而收集的大量数据。函数逼近是一个非常困难的问题,通常只有当你有大量的数据点时才能解决。这就是为什么像谷歌、脸书和亚马逊这样的公司可以使用深度学习的一个根本原因:它们基本上是数据的海洋,收集数据点,就像雨滴收集到盆地中一样。由于他们是科技巨头,他们有权力使用复杂的深度学习模型,这些模型在现实世界中可能非常不准确——并且有权力将它们作为政府合同或与其他公司的合同出售,这些公司控制着我们购买的产品,我们生活在监视之下,以及边缘化人群通过技术遭受的持续压迫。
我并不是说,如果你正在考虑开始一项人工智能业务,你就不能使用深度学习。当然可以;有数百个预先训练好的深度神经网络模型可以从网上下载。但是你应该批判地使用它们。在应用深度学习之前,想想你已经收集的数据的总体统计*。不要简单地应用深度学习,认为它将揭示你正在收集数据的变量之间的复杂关系。深度学习是一个黑箱,但是你不一定要那么用。了解数据集中的偏差;理解并记下数据集中存在的社会不平等现象;很有可能,它们已经存在了。为什么?因为你的数据集就像是来自世界人口的(有偏见的)随机样本,所以它会反映出我们当前社会中的歧视和偏见体系。***
把深度学习想象成工具箱里的螺丝刀。也许它可能对某些任务有效,但是对许多任务来说,它自己根本就不能工作,试图强行解决它作为一个有效的可解释的工具不能足够快解决的问题,还不如浪费时间、金钱,并可能潜在地危及实际的生命。
不要被维度所诅咒
从前,有一个模型。它已经有了许多功能,但它还想要更多。然后 PCA 出现了…不要在黑暗中看这个!
这是一个关于一个模特的故事,她已经拥有了许多功能,但她总是想要更多。这个模型变得如此臃肿,以至于无法将它们分开。但是,它还是成长了。然后有一天,主成分分析来到了模型的土地,它诅咒了他一劳永逸。诅咒就是日复一日地从模型中提取特征,直到只剩下最重要的特征。
这里有几个你可能会感兴趣的链接:
- [Labeling and Data Engineering for Conversational AI and Analytics](https://www.humanfirst.ai/)- [Data Science for Business Leaders](https://imp.i115008.net/c/2402645/880006/11298) [Course]- [Intro to Machine Learning with PyTorch](https://imp.i115008.net/c/2402645/788201/11298) [Course]- [Become a Growth Product Manager](https://imp.i115008.net/c/2402645/803127/11298) [Course]- [Deep Learning (Adaptive Computation and ML series)](https://amzn.to/3ncTG7D) [Ebook]- [Free skill tests for Data Scientists & Machine Learning Engineers](https://aigents.co/skills)
上面的一些链接是附属链接,如果你通过它们进行购买,我会赚取佣金。请记住,我链接课程是因为它们的质量,而不是因为我从你的购买中获得的佣金。
维度的诅咒
当数据集中有成千上万个要素时,诅咒就会出现在高维空间中。当维度增加时,空间的体积也增加,数据变得稀疏。这给任何需要统计显著性的方法带来了问题。随着每个功能的添加,支持结果所需的数据量呈指数级增长。
增加维度时空间体积的增加。
诅咒对你有什么影响?
通俗地说,机器学习模型根据与训练集中看到的样本的相似性,对看不见的样本进行预测。当特征多于样本时,我们有过度拟合模型的风险。测试集上的性能将受到影响*。*
猫狗模型可能会想:特征 has _ lilac _ fur 是真的,我只在训练集中看到过一次有猫的情况,所以一定是猫。这样的特征也是异常值,因为它没有任何统计意义。猫真的有淡紫色的皮毛还是数据收集过程中的错误?在收集到更多数据之前,我们无法确定。
如何破除诅咒?
Simon Wijers 在 Unsplash 上的照片
要解除诅咒,请执行以下操作之一:
- 使用降维算法:使用主成分分析或t-分布随机邻居嵌入(t-SNE) ,
- 计算皮尔逊线性相关或斯皮尔曼非线性相关并去除相关特征,
- 使用特征选择算法并且只保留 n 个最重要的特征,
- 如果可能的话,获取更多的训练数据。
不要再被诅咒了
在你走之前
在 Twitter 上关注我,在那里我定期发布关于数据科学和机器学习的消息。
您可能会对以下几个链接感兴趣:
- [Data Science Nanodegree Program](https://imp.i115008.net/c/2402645/788185/11298)- [AI for Healthcare](https://imp.i115008.net/c/2402645/824078/11298)- [Autonomous Systems](https://imp.i115008.net/c/2402645/829912/11298)- [Your First Machine Learning Model in the Cloud](https://datascienceisfun.net/)- [5 lesser-known pandas tricks](https://gumroad.com/l/YaaJn)- [How NOT to write pandas code](https://gumroad.com/l/vxxiV)- [Parallels Desktop 50% off](https://www.dpbolvw.net/click-100126493-14105294)
照片由Courtney hedge在 Unsplash 拍摄
不要迷失在深渊中
机器学习很少涉及深度学习。这没关系。
L 先说我为什么写这篇文章。对于刚刚踏上数据科学之旅的人来说,很容易迷失方向。不,这不是关于决策树和随机森林的双关语。我的意思是有太多东西要学,太多东西要激动人心,但我认为我们真正应该关注的是对基础知识的详细理解。深度学习是机器学习领域向前迈出的令人难以置信的一步,这绝对是一个激起许多人兴趣的领域,甚至首先将他们带入这个研究领域,但事实是,很少有公司真正应用这些技术。通常情况下,线性模型可以很好地解决业务问题。我的观点是,如果你对基本的机器学习算法有坚实的理解,那么你对公司的价值会比你过于专注于新工具更大。
什么是机器学习?
我想我应该在这里添加这一部分,因为有太多的定义,很容易混淆什么是机器学习,什么不是机器学习。
机器学习是人工智能(AI)的一种应用,它为系统提供了自动学习和根据经验改进的能力,而无需显式编程。主要目的是让计算机在没有人类干预或帮助的情况下自动学习,并相应地调整行动— 来源
许多定义可能变得相当罗嗦,但我认为上面的引用很好地总结了这一点。机器学习是人工智能的一个分支,旨在赋予系统从经验中学习的能力(即从数据中学习),而无需显式编程以特定方式表现。
现在这一切听起来相当性感,但线性回归模型确实做到了这一点,因此它坚定地属于机器学习领域。对许多人来说,这可能有些令人沮丧。
我们都见过 Excel 对一些数据进行最佳拟合,因此,您的意思是告诉我 Excel 正在应用机器学习技术吗?
嗯,是的,事实上是的。但是没关系。线性回归素有简单乏味的名声,但它是一个异常强大的工具,却被异常低估了,尤其是对于该领域相对较新的人(在思考本文之前包括我自己)。在本文中,我使用线性回归作为例子,但是许多其他的基本算法也有类似的名声。
看一看趋势…
作为一篇数据科学相关的文章,我们来看看一些实际的数据。下面的图表是取自 Google Trends 的数据,显示了过去 15 年来对机器学习、深度学习和线性回归的相对兴趣(Google 搜索次数)。
在此期间,对线性回归的兴趣一直保持相当一致,这是有道理的,因为它的起源可以追溯到 19 世纪初,由卡尔·弗赖德里奇·高斯或阿德里安-玛丽·勒让德提出(更多关于它的争议性发现可以在这里阅读)。另一方面,深度学习在过去 5 年才真正普及。
给了我“思考的食粮”的是,尽管深度学习在行业中的使用远远少于它,但它在网上被搜索的频率明显更高。这是可以理解的,因为目前围绕这个话题有大量的炒作,但我将在这里打破一个数据科学规则,并提出这种因果关系。
**人们正在关注错误的事情。**无论如何,对最令人兴奋和先进的机器学习技术感兴趣是没问题的。事实上,这是一件很棒的事情,因为这意味着你拓宽了自己的知识面,并表现出对自己领域前沿话题的浓厚兴趣。但是,只要我们不忽略作为数据科学领域基础的基本算法,这是没问题的。
那么谁在使用深度学习,谁没有呢?
深度学习算法是一个具有多个隐藏层的大型神经网络。深度神经网络的问题在于,它们需要大量的数据,才能获得超过传统机器学习算法的优势。
这张图展示了我们在不同大小的数据集上比较机器学习算法时看到的总体性能趋势。当数据集在较小的一边时,传统方法往往优于神经网络,这就是问题所在。
很少有公司坐拥足够的数据,能够真正从这些出色的算法中获益。那些人往往是科技巨头——比如亚马逊、脸书和谷歌。事实是,大多数公司仍处于数据科学的早期采用阶段,距离拥有利用深度学习优势所需的资源(数据、资金和专业知识)还有很长的路要走。
此外,企业实际上想要一个复杂问题的最简单的解决方案。即使一家公司有深度学习或任何其他复杂算法的资源,如果问题可以用一个更简单的模型来解决,但性能相当,你可以打赌他们会用那个更简单的模型。这是为什么呢?
简单的模型可以更快地构建,更容易实现,更容易理解,更新起来也相对容易。这一点的重要性不应被低估。算法越简单,就越透明。我们应该始终避免实现“黑盒”模型,因为这限制了它的应用范围,最终降低了它对我们的价值。通过使用简单的模型,我们可以更好地调查和理解我们正在解决的问题中存在的关系。
我将引用一段话来结束这一部分,这段话以一种颇具诗意的方式总结了我观点的精髓:
对于复杂的模型,有一种可怕的诱惑,要把柠檬榨干,并展示一幅未来的画面,通过其非常精确和逼真的画面来表达信念。然而,一个使用想象中的地图的人,认为这是一个真实的地图,很可能比一个根本没有地图的人更糟糕;因为他不会尽可能地去询问,观察路上的每一个细节,也不会用他所有的感官和智慧不断地寻找他应该去哪里的指示——从舒马赫的《小即是美》到
最后一点…
请不要误会,复杂!=坏。复杂的方法肯定有它们的位置,我们对它们感到兴奋是正确的。让我们先确保基本的都包括在内。不要马上跳入算法游泳池的深水区。
此外,如果你没有在工作场所经常使用这些先进的技术,也不要灰心丧气。我们有多少次在电视上看到律师在陪审团面前争论或者医生实施紧急救生手术?
非常经常。问题是这些都是现实的戏剧化表现。律师在他们的日常工作中很少这样做,医生每天花大部分时间诊断相同的常规医疗状况。这同样适用于数据科学家。
我们无时无刻不在阅读该领域令人兴奋的发展,这些发展会让我们思考‘为什么我的工作看起来比较平凡?’。我们的大部分时间都花在清理和准备数据上,然后使用简单的模型来解决手头的问题。这仍然是一份很棒的工作。管理期望是我们应该在生活的许多方面应用的一件重要事情,否则我们可能会让自己失望。
感谢您阅读至此!我很想在评论中听到你的想法。如果你想直接联系我,请随时在LinkedIn给我留言。
不知道你家狗狗的品种?ML 可以帮忙!
学习如何建立一个生产就绪的软件,可以分类品种的狗的图像
你有没有想过你的狗或者你在街上看到的其他狗的品种?关于那件事,你可能得问专家。嗯,不会再有了!在这篇文章中,我将教你构建自己的 web 应用程序,它将接受你的狗的图像并以超过 80%的准确率输出它的品种!
这只狗是什么品种?来自 Pexels 的亚历克斯·多勒的照片
你可能想知道这怎么可能?嗯,我们将使用机器学习,特别是深度学习,在狗的图像数据集上训练一个模型,并记录它们的品种,以学习区分每个品种的特征。那我们开始吧!
数据分析
数据集可以从这里下载。成功加载和浏览数据集后,以下是关于数据的一些见解:
- 狗的品种总数:133
- 狗图像总数:8351(训练:6680,有效:835,测试:836)
- 最受欢迎的品种:
Alaskan_malamute:96
,Border_collie: 93
按图片数量排序的前 30 个品种如下所示:
作者图片
我们还可以在这里看到一些狗的图片和它们的品种:
作者图片(数据集)
数据预处理
分析之后,是为机器学习算法准备数据的部分。我们将加载每个图像作为一个 NumPy 数组,并将它们的大小调整为 224x224,因为这是大多数传统神经网络接受图像的默认大小。我们还将为图像的数量添加另一个维度
细胞神经网络图像预处理
最后,我们将使用ImageDataGenerator
对图像进行动态缩放和增强
CNN 从零开始
我们将从在预处理数据集上从头开始训练卷积神经网络(CNN)开始,如下所示:
我们使用回调ModelCheckpoint
来保存基于验证分数的模型。测试这个模型,我们得到了大约 1%的精确度
使用迁移学习
现在,我们将看到使用预先训练的功能如何产生巨大的差异。下载 ResNet-50 瓶颈功能。您可以通过运行下面的代码单元格来提取相应的定型集、测试集和验证集:
我们现在将再次定义模型,并对提取的特征使用GlobalAveragePooling2D
,将一组特征平均为一个值。最后,如果验证损失在连续 2 个时期内没有增加,我们使用额外的回调来降低学习速率ReduceLROnPlateau
,并且如果验证损失在连续 5 个时期内没有增加,我们还使用额外的回调来提前停止训练EarlyStopping
。
现在测试集上的准确率为 82.65%。与我们从零开始训练的模型相比,这是一个巨大的进步。
构建 web 应用程序
对于 web 应用程序,我们将首先编写一个助手函数,它接受图像路径并返回品种。label_to_cat
dictionary 将每个数字标签映射到其犬种。
对于 web 应用程序,我们将使用 Flask web 框架,它帮助我们用最少的代码创建 web 应用程序。我们将定义一条接受图像的路线,并呈现一个带有狗的品种的输出模板
predict.html
是分别显示图片及其犬种的模板。
结论
恭喜你!你已经成功地实现了一个犬种分类器,并且可以自信地辨别犬种。让我们总结一下我们在这里学到的东西:
- 我们对数据集进行了分析和预处理。独立的训练、测试和验证集对于机器学习算法进行有把握的预测是必要的。
- 我们从零开始使用了一个CNN,它表现很差,因为它无法提取特征。
- 然后我们使用迁移学习,准确度提高了很多
- 最后,我们构建了一个 Flask web 应用程序,使我们的项目可以投入生产
我们确实学到了很多,但是还有很多其他的事情你可以尝试。您可以在 Heroku 上部署 web 应用程序,或者尝试使用不同的层(如Dropout
层)来提高准确性。
要了解更多信息和详细分析,请务必点击这里查看我的 GitHub 上的代码。
如果您觉得以上内容对您有用,请分享并随时支持我–>
不要让数据科学家破坏您的 RPA 项目
数据科学家做事的方式与 RPA 开发人员截然不同,这在“人工智能与 RPA 的匹配度”上造成了 10 到 100 倍的差距。
🇨🇭·克劳迪奥·施瓦茨| @purzlbaum 在 Unsplash 上拍摄的照片
机器人流程自动化(RPA)是增长最快的企业软件类别,大公司争相自动化手动任务,同时避免更新其遗留系统的昂贵项目。
今天的主流 RPA 仍然主要涵盖简单的任务,而不是流程。简单性没有错,它完成了工作并带来了节约,而没有巨大的开发成本。对于许多公司来说,这绝对是 RPA 的第一个机会所在。与此同时,我与之交谈过的 RPA 团队正在思考“下一步做什么”这个问题。
在现实生活中,流程有基于判断的决策点,它们处理非结构化数据,有例外,并且它们不断发展。这些复杂性是爱国军的软肋。
埃斯特万·洛佩兹在 Unsplash 上的照片
基于规则的逻辑能走多远是有限度的,直到碰到一堵不可能的砖墙,并意识到你创造了如此具有挑战性的东西来维护,以至于它抵消了自动化的好处。
AI 解决这个吧?把科学家带进来!
是的,有点儿,但是如果所有的谈话都是关于 OCR 和文档理解,我们不会走得太远,这似乎偷走了 RPA 平台提供商 AI 计划的大部分注意力。还有很多。例如,验证和修复输入数据,在缺乏共享标识符的系统之间匹配数据集,检测异常以防止错误,并自动执行由人工智能机器人做出的重复或“认知”决策。
爱国军领导人怎么说?
虽然我与爱国军领导人讨论的样本在统计上很难具有代表性,但我认为可以说存在问题。这里有三段引言,概括起来是为了保护个人的身份。
我们在 RPA 积压工作中实现自动化已经一年多了,我们尝试了一些东西,但是机器学习部分没有实现。— RPA 团队领导
将数据科学项目融入我们敏捷的 3 周 bot 开发冲刺真的很难。— RPA 团队领导
我们的数据科学团队就像一个黑洞。你把一个想法放进去,六个月后你就有了一个数据管道。—首席执行官
当 RPA 程序变得越来越复杂时,不可否认地需要机器学习。然而,这里的共同主题是数据科学不能满足 RPA 的需求。可用性极低,工具驱动冗长的项目,引入更多的技术专家增加了沟通的挑战。数据科学家的思维倾向于探索性项目,而 RPA 工程师需要快速的解决方案来移动积压的项目。因此,对于许多 RPA 使用情形来说,成本堆积过高。
目前,“人工智能与 RPA 的匹配度”有 10 到 100 倍的差距。
虽然我相信数据科学作为一种技能组合是非常需要的,并且“总是”会有一个位置,但我也认为即使不将科学引入每个项目,也可以做得更多。不要让这种不匹配毁了您的自动化项目。
解决方案已经出来了。
当在最近的 Sofa 峰会 RPA Conf 2020 爱立信自动化总监& AI 转型 Kanda Kumar 提出他们“用民主化扩展容量”的想法时,我感到非常兴奋。在实践中,有两种方法可以从现状中挖掘出全部潜力:
- 借助 AutoML 和 MLops 平台等工具,增强数据科学家的能力,帮助他们实现更多目标。
- 领域专家配备了工具,使他们能够达到他们的目标,而不必为“ML 部件”分离出一个单独的项目。
我在 2020 年 5 月 20 日从沙发峰会手动复制了神田的幻灯片
我认为,尤其是后者存在巨大的机会。一个领域专家能够将解决问题作为他/她的日常工作流程的一部分是一个不可否认的优势。除了允许更复杂的自动化工作流的经济高效的开发之外,它还支持敏捷开发,不受外部团队、他们的工作方式和积压的约束。
与其把你的自动化项目扔进数据科学黑洞,交叉手指,不如先看看你自己能做些什么。你会惊讶的。高效且易于使用的工具已经存在。以下是我列出的六个需要考虑的特征。
- UX 服务于目标受众:面向开发人员的优秀 API 和 RPA 平台集成,或者面向公民开发人员的无代码体验。
- 它从用户那里带走了数据争论和特征工程的负担。
- 无需用户明确选择算法,特别是优化算法。
- 对预测准确性清晰透明,有信心决定下一步机器人行动。
- 扩展初始数据集:在生产中自动接收新数据和更新预测。
- 成本不会破坏 RPA 的预算。
因为我自己就在和一个这样的工具提供商合作,所以我有偏见。:)因此,我很想听听你的首选工具是什么,可以满足上述部分或全部要求?或者你会如何改进这个列表?
我是 Aito.ai 的首席产品官,这是一个云托管的预测数据库,通过简单的 API 使用数据库中的任何数据来提供机器学习预测。
不要让丢失的值破坏您的分析输出,处理它们!
处理空值的方法概述
Ehimetalor Akhere Unuabona 在 Unsplash 拍摄的照片
无论是机器学习模型、KPI 还是报告,缺失值或其替换值都可能导致您的分析输出出现巨大错误。
通常,分析师处理缺失值就像它们只有一种类型一样。事实并非如此,有三种类型的缺失值,每一种都有不同的处理方法。
空值的类型
随机缺失(MAR) :变量中出现空值不是随机的,而是依赖于记录的已知或未知特征。你可能会问自己,为什么它被称为随机失踪?因为空值与实际值无关。根据您的数据集,它可以或不可以测试。要找出答案,您应该比较具有缺失值和非缺失值的记录的其他变量分布。
例如: 一个关于教育的数据集,其中包含许多幼儿智商得分的缺失值,只是因为与 12 岁的孩子相比,4 岁的孩子通过测试的情况较少。空值与智商实际值无关,但与年龄有关。
完全随机缺失(MCAR) :空值的存在与记录的任何已知或未知特征无关。同样,这取决于您的数据集,可以测试也可以不测试。与 MAR 一样,测试包括比较有缺失值的记录和没有空值的记录的其他变量的分布。
例如: 问卷结果在邮件中丢失的调查受访者的缺失数据。完全独立于相关变量和回答者的特征(即记录)。
非随机缺失(MNAR) :空值的存在取决于其实际值。这个无法测试,除非你知道实际值,这有点矛盾。
例如: 智商变量的缺失值仅适用于得分较低的个人。
您可能已经猜到了,只有在第二种情况下,删除空值才是安全的。
对于另外两种情况,降低值会导致忽略总体中的一组。
在最后一种情况下,记录具有空值的事实携带了一些关于实际值的信息。
处理缺失值
滴
删除行:(仅适用于 MCAR)如果相对于数据集大小,您只有一小部分缺失值,这可能是最佳解决方案。然而,随着比例的增长,它很快变得不可行。
丢弃 col : 这种方法通常不被考虑,因为它会导致重要信息的丢失。根据经验,当空值的比例高于 60%时,您可以开始考虑它。
归罪
上一个或下一个值:(仅适用于 MCAR 的时间序列)只要您正在处理时间序列问题,就可以使用上一个或下一个值来填充缺失值。
平均值:(仅适用于 MCAR)使用平均值通常不是一个好的解决方案,因为它对异常值很敏感。
中值:(仅适用于 MCAR)类似于平均值,但对异常值更稳健。
模式值:(仅适用于 MCAR)通过选择最常见的值,您可以确保在大多数情况下正确填充空值。当心多模式分销,因为它不再是一个可行的解决方案。
替换为常量:(仅适用于 MNAR)正如我们之前看到的,MNAR 情况下的 missing value 实际上保存了一些关于实际值的信息。因此,使用一个常数(不同于其他值)填充它们是有意义的。
线性插值:(仅适用于具有 MCAR 的时间序列)在具有趋势和很少或没有季节性的时间序列问题中,缺失值可以通过使用其之前的值和之后的值进行线性插值来近似。公式如下:
线性插值(一阶)
样条插值:(仅适用于具有 MCAR 的时间序列)这类似于线性插值,但它使用了高阶多项式特征来实现更平滑的插值。还是那句话,不适合季节性数据。
带季节性调整的线性/样条插值:(仅适用于 MCAR 时间序列)它遵循与线性和样条插值相同的原理,但对季节性进行了调整。它包括对数据进行非季节性处理,应用线性/样条插值,并对时间序列应用季节性。这里是对 STL 一种数据去季节化方法的详细解释。
线性回归、KNN、MCMC、多变量高斯或任何 ML 算法:(仅用于 MAR)使用它可能需要一些额外的工作,但它是处理 MAR 的唯一可行的解决方案。为什么?因为它考虑了其他变量的记录值,所以它可以使用关于变量的信息来预测缺失值,这些变量在缺失和非缺失时的值是不同的。
多重插补:(仅适用于马尔和 MCAR)多重插补是处理缺失值的最佳方式。它包括使用一个模型多次输入缺失值,该模型允许对同一观测值的预测之间的差异。增加相同观测预测之间变化的解决方案可以是使用类似线性回归的模型。假设模型参数来自一个分布,你可以让它们在每个插补步骤中有一点点变化,要阅读更多关于这种技术的内容,请查看这个。每次插补都会创建一个新的数据集。然后,应该对每个数据集进行分析。完成后,计算不同数据集上结果的平均值和标准偏差,以给出具有“置信区间”的输出值的近似值。
如果你想讨论如何处理项目中缺失的价值,请通过 LinkedIn 联系我。
不要向后看,向前看!
前瞻优化器使您的模型对超参数的选择不太敏感
优化器的任务是寻找这样一组权重,使神经网络模型产生尽可能低的损失。如果你只有一个权重和一个如下图所示的损失函数,你不需要成为天才也能找到答案。
不幸的是,你通常有许多权重和一个很难简单的损失景观,更不用说不再适合 2D 绘画。
使用https://arxiv.org/pdf/1712.09913.pdf中提出的方法可视化无跳跃连接的 ResNet-56 的损失表面。
找到这样一个函数的最小值不再是一个微不足道的任务。像 Adam 或 SGD 这样最常见的优化器需要非常耗时的超参数调整,并且可能陷入局部最小值。选择学习率这样的超参数的重要性可以用下图来概括:
太大的学习率会引起最小值附近的振荡,而太小的学习率会使学习过程非常慢。
最近提出的前瞻优化器进行优化过程
对次优超参数不太敏感,因此减少了对大范围超参数调整的需求。
这听起来像是值得探索的事情!
该算法
直观地说,该算法通过在由另一个优化器生成的“快速权重”序列中前瞻来选择搜索方向。
优化器保留两组权重:快速权重θ
和慢速权重ϕ
。它们都用相同的值初始化。具有一定学习速率η
的标准优化器(例如,Adam、SGD、…)被用于为定义数量的步骤k
更新快速权重θ
,从而产生一些新值θ’
。
然后关键的事情发生了:慢速权重ϕ
沿着权重向量 θ’- ϕ
的差定义的方向移动。这一步的长度由参数α
——慢速权重学习率控制。
前瞻算法中的重要更新
然后,通过将快速权重值重新设置为新计算的慢速权重值ϕ’
,开始重复该过程。你可以看到下面的伪代码:
来源:https://arxiv.org/pdf/1907.08610.pdf
这有什么意义?
为了回答这个问题,我们将研究来自前瞻出版物的(略微修改的)图片,但是作为介绍,让我们首先看另一张图片。如果我们的模型只有三个权重,损失函数可以很容易地可视化,如下图所示。
在模型仅依赖于三个权重的情况下,权重空间中的损失函数可视化。提出了权重空间中损失到三个平面(“超平面”)的投影,其中一个权重具有恒定值。
显然,在现实生活的例子中,我们有三个以上的权重,导致权重空间具有更高的维度。然而,我们仍然可以通过把它投影到这样一个空间的超平面上来形象化这个损失。
这就是在前瞻报告中提出的内容:
来源:https://arxiv.org/pdf/1907.08610.pdf
我们看到目标函数(在这种情况下是精度,但也可能是损失)到权重空间中的超平面的投影。不同的颜色对应不同的目标函数值:颜色越亮,值越优。前瞻优化器的行为如下所示:蓝色虚线表示快速权重θ
的轨迹(蓝色方块表示十个后续状态),而紫色线表示快速权重更新θ’- ϕ
的方向。紫色三角形表示两个后续的慢速权重值ϕ
、ϕ’
。三角形之间的距离由慢速权重学习速率α
定义。
我们可以看到,标准优化器(在本例中为 SGD)遍历了一个次优绿色区域,而第二个慢权重状态已经非常接近最优。论文描述的更为优雅:
当在高曲率方向振荡时,快速权重更新沿着低曲率方向快速进行。慢速权重有助于通过参数插值消除振荡。快速权重和慢速权重的组合改善了在高曲率方向上的学习,减少了方差,并且使得前瞻在实践中能够快速收敛。
在 Keras 怎么用?
现在回到方法的实际方面;到目前为止只有一个非官方的 Keras 实现;它可以很容易地与您当前的优化器一起使用;
如您所见,除了优化器本身之外,Lookahead
还需要两个参数:
sync_period
对应前面介绍的k
——两组砝码同步后的步数,slow_step
对应于α
慢速权重的学习速率。
为了检查它是否按预期工作,您可以将slow_step
设置为1
,并将Lookahead
的行为与常规优化器的行为进行比较。
对于1
的α
,前瞻更新步骤减少为:
这意味着前瞻被简化为它的底层标准优化器。我们也可以在修改后的权重轨迹图上看到它:
改编自:https://arxiv.org/pdf/1907.08610.pdf
现在慢速权重的结束状态与快速权重的结束状态相同。
您可以使用以下代码对其进行测试:
测试证明具有 Adam 和慢学习率 1 的 LookAhead 等价于纯 Adam。
一锤定音
前瞻是一种有效的优化算法,它以可忽略的计算成本使寻找损失函数最小值的过程更加稳定。此外,需要较少的超参数调整。
据说当与修正的 Adam 优化器结合使用时特别有效。我将在下一篇文章中讨论这个话题。
不要惹海森堡
丽塔·莫莱斯在 Unsplash 上拍摄的照片
数据可视化必须接受一些不确定性
在开发一个数据可视化 app 之前,想想时间和空间哪个更重要。你想显示实时数据吗?还是要分析干净的数据?在开发我的应用程序时,我两者都想要。我变得沮丧,直到我意识到我犯了一个新手的错误。
在 Plotly Dash 中,我着手构建一个仪表板,它将通过 CryptoCompare 的公共 API 获得每分钟的加密货币价格,并提供 Dash 可视化,以便在其中研究数据。
在我的第一次迭代中,我并不担心实时方面。我给了用户一个下拉菜单来选择他们的加密货币。
然后我检查了 Sqlite 数据库,果然,每分钟都有一个新的比特币值通过 cron 作业添加进来。在我的 Google Cloud Ubuntu 虚拟机(VM)上,我告诉 crontab 服务每分钟调用一个 Python 脚本,该脚本从 CrypoCompare 获取数据并将其插入到 SQLite 表中。
然后我刷新了我的 Dash app。但是数据没变。
我在 Dash 论坛上发帖,寻找类似于 *RefreshOnPageLoad = True,*的函数,但是一个也没有找到。一开始我对短跑队很恼火。然后我开始思考这个问题,并意识到如果一个人在每次页面加载时都刷新 Dash 应用程序,你最终会质疑为什么你一开始就使用 Dash!
首先,非常明确地说,我不是要说你不能在像 Dash 这样的框架中进行实时数据可视化——你可以。我的观点是,当你试图服务于两个主人,数据的及时性和数据质量时,你应该预料到你的编程的复杂性会呈指数级上升。让我们来看看 Dash 图库中的一些例子。
这是制造 SPC 仪表板应用程序。
该应用程序看起来像是某台机器正在向 Dash 应用程序发送数据以进行可视化
如果我们查看代码,我们会注意到外部数据源并没有驱动可视化。该应用程序正在根据其定时事件提取数据。
但是,如果我们希望它每秒钟都向数据帧中重新加载新数据,该怎么办呢?
用户几乎无法控制数据。没有花哨的滑块。也就是说,Dash gallery 中的“流媒体”应用没有发挥 Dash 的优势。使用普通的 Javascript 和 Chart.js 就可以很容易做到。
这是另一个 Dash“流”应用程序。
Dash 真的是风力驱动的吗?!
和上面的 app 一样,软件使用复杂的回调来重新加载组件。有一个滑块,但它不是用于数据探索的。
每当我看着将流数据添加到我的 Dash 应用程序所需的代码时,我的大脑就冻结了。Dash 里的试镜对我来说已经够复杂了。集成两组回调,一组用于更新数据,另一组用于处理用户输入,将我的技能推到了极限。
我们来看看 Dash 的长处。在下面的应用程序中,各种控件(滑块)可以改变数据的图形。用户还可以通过将鼠标悬停在图表上来浏览数据。
该应用程序不刷新数据,但如果它做到了呢?那是我的啊哈时刻。会有什么后果?
Dash 只用几行代码就提供了强大的功能
在 Dash 中,HTML 控件允许用户根据他们选择的参数可视化数据。
如果一个外部数据源改变了数据,它能在不改变用户基于他们最后选择的参数的期望的情况下这样做吗?
比方说,我已经将我的应用程序设置为查看加密货币价格的前 5 个百分点。我发现起价是 100 美元。我过滤掉所有低于 100 美元的硬币?一切都好。
但是如果新数据进入系统,百分位变为 110 美元呢?我的结论现在已经过时而且错误!
就像海森堡测不准原理,我可以研究我的加密货币的位置,或者它的动量,但不能同时研究两者!在物理实验中,从某种意义上来说,你必须经常触摸你正在研究的东西。你只能通过记录来注意到一个电子,比如说,另一个电子被它反弹并通过你的传感器击中另一个电子。当你的记录电子撞击你正在研究的电子时,它可以改变那个电子的位置或动量。你只能研究它没有影响的方面。那是我外行的理解。
就像我上面的例子一样,对于任何给定的数据可视化数据集,我都可以非常非常确定我的分析对于给定的数据集是正确的。当有人问,不确定性出现了,但是新的数据会说什么呢?
这是 Dash 的致命弱点,我想也是所有数据可视化框架的致命弱点。
当我试图添加算法来更新我的应用程序数据时,我开始去厨房寻找舒适的食物。下面是两个 Dash 示例应用程序的一些代码来说明我的观点:
432 行代码的惊人可视化!
上面的应用程序发挥了 Dash 的优势,允许人们以惊人的深度研究数据集。
这是一个 Dash 应用程序,它添加了流数据。
为什么这么简单的仪表板有这么多行代码?
纵观全局,数据可视化中最困难的部分是决定用户将执行什么实验。我希望他们拥有最新的数据,还是最干净的数据?如果我试图让应用程序两者都做,我可能会倾向于这样或那样,这将激怒一些用户。要么他们在重新加载数据时会丢失参数,要么他们将无法查看新数据。
总之,你可以在 Dash 中做任何你想做的事情。但是你应该理解数据科学中的基本问题。数据可视化应用的成功部分取决于管理预期。
在未来,如果我想要一个数据流应用程序,我可能会用不同的技术来构建它。然而,如果我想让用户尽情探索复杂的数据集,那么 Dash 可以用最少的代码行提供最强大的功能。
如果我必须两者都做,我最好找一个开发团队和一个装满东西的冰箱。
不要错过识别缺失数据的缺失号!
应该用来可视化缺失数据的库
野外的数据并不总是完整的。您需要立即发现这一点,调查为什么会有丢失的数据,并潜在地捕捉可以用来填充丢失的数据或丢弃它们的值。填充或丢弃取决于任务。但是同样,如果不首先识别那些丢失的值,你就不能做任何事情。这就是 Missingno 库的用武之地,你将在这里学习如何使用它。
缺少不,Python 版本
Missingno 是由 Aleksey Bilogur 创建的 python 库,用于可视化数据中的缺失值。有了它,您可以快速了解数据集中缺少哪些数据。这是我在使用任何数据执行任何主要任务之前首先要做的事情之一。
在imgflip.com自制形象
这是真的。如果您的数据可能最多有 8 到 10 列,您可以快速浏览一下。但是如果你有 20 列的数据呢?30 列?40 列?您是否仍然能够以比这样的可视化方式更快的速度浏览和读取每一列中的非空值总数?
我的代码的 msno.matrix(数据)的结果。
你的眼睛会立刻移动到有白色条纹的条纹上。这是您可以找出哪些列缺少数据的速度。顺便说一下,这也是在一个有 26 列的随机数据集上。现在,让我们让你使用这个库!在你的终端上输入pip install missingno
然后开始吧!
Armand khou ry在 Unsplash 上拍摄的照片
安装
当然,我们必须下载一些和 Missingno 一起的库。这些是我为任何数据任务导入的默认库。我们将继续上传我们的数据。数据来自这个网站在谷歌的数据集搜索引擎上快速搜索“缺失值”。
亲提示,用sns.set()
。默认情况下,它给你的图表一个海边背景。当我们做条形图时,这将非常有用。但首先,我们必须查看矩阵。
Msno 矩阵(数据)
msno.matrix(data)
将显示我们在上面看到的图表类型。空白表示缺少值,而黑色表示有值。
我的代码的 msno.matrix(数据)的结果。
除了可以快速识别哪些列有缺失值之外,您还可以查看这些列在哪里有缺失值。按特定列对数据进行排序可以让您看到是否有数据块丢失,并在筛选出这些行后帮助您更快地识别它们。右边的锯齿状垂直折线图根据长度标记了行中丢失的数据量。图表中向左的线条越长,该行中丢失的数据就越多。
Msno.bar(数据)
msno.bar(data)
将生成一个条形图,显示每列中非空数据值的数量。它还在顶部标记了非空值的数量。
我的代码中 msno.bar(data)的 sns.set()版本的结果。
您的目光应该转向此图表左侧较低的条形,以快速看到 3 列(po2、fio2 和 pco2)缺少大量数据值。现在,还记得我告诉过你如何使用sns.set()
吗?你应该自己检查,但是如果你没有,这里有一个没有使用sns.set()
的相同的条形图。
我的代码中没有 sns.set()的 msno.bar(data)的结果。
请注意,sns.set()
版本的线条将条形分割成六分之一的数据。这可以让您了解基于这些间隔的特性所占的百分比。所以我们可以很快确定,我们有大约三分之一的 po2 和 pco2 值。seaborn 背景的另一个好处是背景中的百分比线,因此您可以从另一个视觉角度了解每 20%标记处有多少数据。
其他可视化
Missingno 还提供了数据的热图和树状图,以显示某些列中缺失值之间可能的相关性。我还没有在我自己的职位上使用过这些,原因是领域知识或者只是问了正确的人。但是我会给你这些数据的每个图表的图片,这样你就可以开始学习如何根据失踪人口文档自己解释这些数据。
我的代码中 msno.heatmap(data,figsize=(15,7)的结果。
我的代码的 msno.dendrogram(数据)的结果。
请确保您也从 Missingno 库中查看了代码,以查看所有这些函数的底层细节。
最后的想法
尽管热图和树状图提供了很好的关联关系,但是如果您有领域知识,它们并不是必需的。如果您不了解您正在处理的数据的领域知识,那么这些图表会变得更加有用。如果你的组织中没有可以及时咨询的人,我觉得这些图表应该是最后的手段。请记住,领域知识可以解决您处理的数据中的大量背景知识缺口(以及缺失的数据缺口)。
感谢您的阅读!请记住,调查丢失的数据应该是您正在进行的任何项目的探索性数据分析过程的一部分。在您自己的数据上尝试 Missingno!
你可以在 Linkedin 和 Twitter 上关注或联系我。对 Twitter 上的 DM 开放。
直到下一次,
约翰·德杰苏斯
不要错过熊猫的滚动窗口功能
大蟒
使用移动窗口计算深入研究您的数据
窗口计算可以增加数据分析的深度。
Pandas 库允许您执行许多不同的内置聚合计算,定义您的函数并在数据帧中应用它们,甚至可以同时处理数据帧中的多个列。Pandas 中有一个你以前可能没听说过的功能是内置的窗口 功能。
窗口函数非常有用,因为您可以对数据子集执行许多不同种类的操作。滚动窗口函数专门用于计算数据帧中每一行的新值。这听起来可能有点抽象,所以让我们深入解释和例子。
这篇文章中的例子将使用雅虎财经的一些旧的特斯拉股票价格数据。如果您想继续,请随意运行下面的代码。关于pd.read_html
和df.sort_values
的更多信息,请查看本文末尾的链接。
import pandas as pddf = pd.read_html("[https://finance.yahoo.com/quote/TSLA/history?period1=1546300800&period2=1550275200&interval=1d&filter=history&frequency=1d](https://finance.yahoo.com/quote/TSLA/history?period1=1546300800&period2=1550275200&interval=1d&filter=history&frequency=1d)")[0]
df = df.head(11).sort_values(by='Date')
df = df.astype({"Open":'float',
"High":'float',
"Low":'float',
"Close*":'float',
"Adj Close**":'float',
"Volume":'float'})
df['Gain'] = df['Close*'] - df['Open']
样本修改特斯拉股票数据来自雅虎财经
熊猫数据框架中的滚动函数
那么什么是滚动窗口计算呢?
处理时序数据时,通常会使用滚动计算。同样,窗口是您执行窗口计算的行的子集。在你定义了一个窗口之后,你可以执行诸如计算运行总数、移动平均、排名等操作。
让我们用一些例子来澄清这一点。
1.窗口滚动平均值(移动平均值)
移动平均值计算基于我们指定的窗口为每一行创建一个更新的平均值。这种计算也称为“滚动平均值”,因为它是在数据帧中计算每行在指定范围内的平均值。
这听起来有点抽象,所以让我们计算一段时间内“收盘”价格的滚动平均值。为此,我们将运行以下代码:
df['Rolling Close Average'] = df['Close*'].rolling(2).mean()
滚动平均结果
我们正在创建一个新的列“滚动收盘价平均值”,它采用一个窗口内收盘价的移动平均值。要做到这一点,我们只需编写.rolling(2).mean()
,其中我们指定一个窗口“2”,并计算数据帧中每个窗口的平均值。每一行的“滚动收盘平均值”等于其“收盘*”值加上前一行的“收盘*”值除以 2(窗口)。本质上是Moving Avg = ([t] + [t-1]) / 2
。
实际上,这意味着第一个计算值(62.44 + 62.58) / 2 = 62.51
,即 2 月 4 日的“滚动收盘平均值”。数据帧中的第一行没有滚动平均值,因为在计算中没有可用的[t-1]
或前期“收盘*”值,这就是 Pandas 用NaN
值填充它的原因。
2.窗口滚动标准偏差
为了进一步了解常规计算和滚动计算之间的区别,让我们来看看“开盘价”的滚动标准差。为此,我们将运行以下代码:
df['Open Standard Deviation'] = df['Open'].std()
df['Rolling Open Standard Deviation'] = df['Open'].rolling(2).std()
滚动标准差结果
我还为标准偏差添加了一个新列“开放标准偏差”,它只是计算整个“开放”列的标准偏差。在它旁边,您会看到“滚动开放标准偏差”列,其中我定义了一个 2 的窗口,并计算了每行的标准偏差。
就像前面的例子一样,第一个非空值位于 DataFrame 的第二行,因为这是同时具有[t
和[t-1]
的第一行。你可以看到当你在表格中向下移动时,移动标准差是如何变化的,这对于跟踪一段时间内的波动性很有用。
Pandas 在计算标准差时使用 N-1 个自由度。您可以向ddof
传递一个可选参数,该参数在std
函数中默认设置为“1”。
3.窗口滚动和
作为最后一个例子,让我们计算“Volume”列的滚动总和。为此,我们运行以下代码:
df['Rolling Volume Sum'] = df['Volume'].rolling(3).sum()
滚动求和结果
我们定义了一个窗口“3”,所以第一个计算值出现在第三行。然后,求和计算“滚动”到每一行,这样您就可以跟踪当前行和前两行值的总和。
这里需要强调的是,这些滚动(移动)计算不应与运行计算混淆。如上图所示,滚动计算有一个移动窗口。因此,对于我们的移动总和,2 月 6 日(第四行)的计算值不包括 2 月 1 日(第一行)的值,因为指定的窗口(3)没有追溯到那么远。相比之下,运行计算需要不断将每一行的值添加到整个数据帧的运行总值中。你可以检查一下cumsum
函数。
我希望您发现这个关于熊猫使用包装器进行逻辑比较的非常基本的介绍很有用。请记住,只比较可以比较的数据(即不要尝试将字符串与浮点数进行比较),并手动复查结果,以确保您的计算产生了预期的结果。
往前走,比较一下!
**More by me:
*** [**2 Easy Ways to Get Tables From a Website**](/2-easy-ways-to-get-tables-from-a-website-with-pandas-b92fc835e741?source=friends_link&sk=9981ddaf0785a79be893b5a1dd3e03dd) ***** [**4 Different Ways to Efficiently Sort a Pandas DataFrame**](/4-different-ways-to-efficiently-sort-a-pandas-dataframe-9aba423f12db?source=friends_link&sk=97821818c45f0bdbdbc8d341a14ecddd)
- [Top 4 Repositories on GitHub to Learn Pandas](/top-4-repositories-on-github-to-learn-pandas-1008cb769f77?source=friends_link&sk=d3acc38062490a86ecb46875342224e6)
- [How to Quickly Create and Unpack Lists with Pandas](/how-to-quickly-create-and-unpack-lists-with-pandas-d0e78e487c75?source=friends_link&sk=32ea67b35fe90382dc719c1c78c5900c)
- [Learning to Forecast With Tableau in 5 Minutes Or Less](/learning-to-forecast-effectively-with-tableau-in-6-minutes-or-less-3d77a55930a0?source=friends_link&sk=9abdfd7533ee9a31ab8a036413450059)
不要过度规划您的数据可视化
通往伟大数据的道路充满了意想不到的事情
这篇文章解释了如何制作上面的动画地图。
这篇文章的标题很容易以“10 大经验”或“5 个简单的步骤”开始。我们,处理数据的人,喜欢遵循某种框架或实验测试的方法。但是想出一个用于数据可视化的将是一个很大的挑战。
复杂数据可视化的开发不是一个由许多标准化步骤连接在一起的起点和终点的过程。这更像是一个重复的、快速的原型制作过程,中间的步骤直到你完成后才能知道。数据可视化的这一特征可能会非常消极,尤其是对于那些喜欢遵循详细计划的人。
如果您陷入了又一个意想不到的错误,看起来像是又一个挫折,那么就像驾船航行一样创建数据可视化。当你在船上时,你可能会看到地平线上的目的港,并知道如何到达那里。但是你最终要走的路很可能会偏离你最初的计划。这将取决于不断变化的风,海浪的高度,水深,甚至其他船只的交通。与数据可视化一样,在完成之前,您不会真正知道您的路线是什么样子。
在过去的几周里,我重新创建了我最喜欢的可视化工具之一——由卡梅隆·贝卡里奥设计的著名的风地图。在这篇文章中,我想反思我的设计过程,特别是描述所有我不可能计划到的小挫折,但这些挫折最终改善了我的视觉叙事。如果你发现自己被困在使数据可视化的路上,如果你看不到你的目的地,你面前有一本好书。
但是如果阅读不是你的事情,而你只是想看代码——请,也欢迎。继续滚动到底部,在那里我用代码链接了可观察的笔记本。
我们从一张空地图开始。我们将以一件美丽的事情结束。
实施基本功能和第一个减速带
我喜欢从实现基本功能开始我的设计。缩放、平移、滑动——它们越通用,我就越有可能在第一步中包括它们。在我的地图中,我想包含的前两件事是拖动和缩放行为。我构建了它们
wind_map = { const svg = d3.create('svg')
.attr('viewBox', [0, 0, width, height])
.attr("fill", "none")
const map = svg.append("g")
.attr("id", "map")
.call(d3.drag()
.on("start", dragstarted)
.on("drag", dragged)
.on("end", dragend)) //...
}
用dragstarted()
、dragged()
和dragend()
作为助手函数,负责拖动事件开始、期间和结束时的行为。但是我很快注意到d3.drag()
的默认行为允许向各个方向拖动。在地球仪的情况下,可以更改地球仪的滚动、俯仰和偏航,并将地球仪旋转到北方不面向可视化顶部的位置。看下面 gif 上我的意思。
面对可视化的顶部,从北方偏离几乎是不合理的。
这种功能会引入不必要的混乱和干扰。我通过设置绕y
轴的旋转(或者,更详细地说,将欧拉旋转角度 γ 设置为 0)来停止这个操作。
我用d3.zoom()
实现了缩放行为,使用了与拖动行为相同的结构。我又添加了一个调用,使用zoomstarted()
、zoomed()
和zoomend()
助手函数来实现缩放开始、期间和结束时的行为。
map.call(d3.zoom()
.scaleExtent([400, 1000])
.on("start", zoomstarted)
.on("zoom", zoomed)
.on("end", zoomend))
图表上的缩放比例一出现,很明显也需要调整。默认d3.zoom()
允许在缩放过程中拖动。这看起来是一个多余的干扰,通过删除几行很快就解决了。
带着一个可以缩放和拖动的地球仪,我准备进入下一个阶段。
基本功能已经就绪。
获取数据
为了开始将颜色引入风地图的风叠加,我需要数据。获取包含数据的数据文件很容易,但是提取它却不容易。
在美国国家海洋和大气管理局(NOAA)的网站上,你可以找到一个全球预报系统。它可以预测地球上任何地方的一系列参数(如温度、云量、风力和风向)。
数据被打包成一种很难处理的 GRIB 格式。它在等距网格上对二维数据的值进行编码。例如,分辨率为 1 度的 GRIB 温度文件将给出以下各项的温度:
(0⁰E, 0⁰N), (1⁰E, 0⁰N),… (180⁰E, 0⁰N), (179⁰W, 0⁰N),… (2⁰W, 0⁰N), (1⁰W, 0⁰N) \n
(0⁰E, 1⁰N), (1⁰E, 1⁰N),… (180⁰E, 1⁰N), (179⁰W, 1⁰N),… (2⁰W, 1⁰N), (1⁰W, 1⁰N) \n
(0⁰E, 2⁰N), (1⁰E, 2⁰N),… (180⁰E, 2⁰N), (179⁰W, 2⁰N),… (2⁰W, 2⁰N), (1⁰W, 2⁰N) \n
...
但是使 GRIB 文件难以处理的是它们是以二进制编码的。除非你使用一个单独的程序或库来解码它,否则没有办法从原始的 GRIB 文件中理解它。这又引入了对后端解码和提供解码的 GRIB 文件的需求。
起初,我计划让我的可视化自动从 NOAA 网站下载最新的 GFS 数据,但是只使用 JavaScript 处理 GRIB 文件的复杂性降低了我的热情。我决定使用一个静态 JSON 文件,其中包含来自2014-01-31T00:00:00.000Z
的风数据。为什么是这个特殊的日子?这看起来像是忙碌的一天,有许多小天气系统在地球上运行。
创建色标
乍一看,来自earth.nullschool.net的原始色标由两部分组成:
- 第一部分以蓝色开始,以粉色结束,是以洋红色结束的镜像 Sinebow 刻度。
- 第二部分是品红色,其 alpha 逐渐增加,直到达到白色。
原始可视化中使用的色标
我偷看了一下风图的 Github repo,我发现色标背后的很多逻辑都是硬编码的。我开始创建自己的色标,最终得到了三个不同的版本:
- 使用默认
d3.interpolateSinebow
的基本、快速和脏秤。它基本上忽略了色阶中从品红色到白色的部分。
- 我使用自己的 Sinebow 插值器的精确色阶。它尽可能接近最初的实现。
- 使用我自己的 Sinebow 插值器的高效色阶。它本质上是一个硬编码的
if
语句列表。我希望在用这种色阶生成风叠加时能达到更高的效率。
色标准备好了,除了开始上色(生成风覆盖)之外,没有什么要做的了。
第一次尝试添加风叠加
我经历了两次失败的尝试,才有效地将颜色添加到风图中,然后找到了我最终使用的第三个。这三种方法都有效,但是前两种不够有效,而且它们使可视化看起来不连贯和没有吸引力。
第一次尝试是快速扫描图表上的所有像素。我将检查该像素是否在可视化中。如果是,我会查找它的坐标,使用双线性插值法估计该点的风力,查找颜色,最后绘制像素。这个过程可以用下面的伪代码来描述:
for x in range(0, width):
for y in range(0, height):
flag1 = check_if_x_and_y_is_in_projection(x, y) if not flag1:
color = black longitude, latitude = calculate_coordinates(x, y) wind_strength = calculate_wind_strength(longitude, latitude) color = color_scale(wind_strength)
这很有效,但是渲染要花很长时间。在缩放或拖动过程中生成图层是完全不可能的,必须将其关闭。即使使用超高效的色标也无济于事。你可以在下面的 gif 上看到实时的延迟:
生成风覆盖图是低效的
我试图弄清楚卡梅隆·贝卡里奥是如何用一种非常相似的方法实现他的风力覆盖的,并且让它高效地运行。我无法找到它的根源,但我注意到的一件事是,他会每隔一个像素查找一次(因此渲染所需的时间减少了一半)。
我不想在拖动或缩放时被迫关闭颜色。我知道一定有办法实现它,于是我开始了下一步。
第二次尝试在画布上使用光栅重投影添加风叠加
这背后的逻辑是生成一个 2D 风覆盖一次,并将其保存为图像。然后,在更新时,我会调用光栅重投影——即将光栅图像编码的地图(如.jpeg
或.png
)转换为不同的地图投影(在我们的例子中,是正交地球)。
这里的假设是图像的重新投影比重新生成的计算量要小。事实证明这是真的。但是仍然不够快以允许平滑的拖动和缩放。你可以在下面的快速原型中看到这种起伏:
左边的 2D 地图将被重新投影到地球仪上。结果仍然不令人满意。
在这一点上,除了使用 WebGL 之外,别无选择——这是一个允许 GPU 加速浏览器内动画的 JavaScript 库。
第三个,也是最后一个,尝试使用 WebGL 的光栅重投影来添加颜色
只有在绝对必要的时候才应该使用 WebGL。该库尽可能高效,但使用它需要掌握类似 C 的代码开发。幸运的是,我能够在 Observable 上的一些公共笔记本上找到大量相关代码。特别是在 WebGL 中实现的光栅重投影。
在调整代码并使其符合我的代码结构后,我以一个惊喜结束了——这是迄今为止最快最流畅的交互。
WebGL 及其对性能的影响
添加和调试风粒子
动画风粒子使风球如此令人难忘。我的第一直觉是找到一个可以实现粒子运动的库。我偶然发现了由 Mapbox 团队开发的基于 WebGL 的库。它看起来很吸引人,但是玩了一会儿之后发现,它的默认风格很难看,而且库的设计不允许简单的颜色操作。
我决定建立自己的风粒子动画逻辑。这看起来比实际上更困难。我用了一个基于requestAnimationFrame()
的动画循环。在每个循环的开始,我会复制一个低透明度的旧框架,然后在它上面画一个新的框架。每一帧都重复这个过程,就产生了想要的拖尾效果
基于画布复制和重绘的动画
动画循环可以用类似 JavaScript 的伪代码来概括:
(function tick() {
const x = get_next_position()
context.stroke(); // Make a copy with lower opacity
context.globalAlpha=0.97
context.globalCompositeOperation='copy'
context.drawImage(context.canvas, 0, 0) //Draw the new Canvas on top
context.globalAlpha=1.00;
context.globalCompositeOperation='source-over';
context.beginPath();
context.arc(x, height / 2, radius, 0, 2 * Math.PI);
context.fill(); //Go to the next frame
frame = requestAnimationFrame(tick);
})();
然后,我会随机产生 1000 个粒子。在每一帧上,我会计算它们的坐标,并根据该区域的风矢量将它们移动到一个新的位置。当粒子的年龄超过随机设置的max_age
时,我会将其重置到初始位置。在伪代码中,它看起来像这样:
for x, y, age in particles_list:
if age > max_age:
age = 0
x = x0
y = y0 else:
long, lat = get_coordinates(x, y)
u, v = estimate_wind_vector(long, lat)
long_new, lat_new = long + u*scale, lat + v*scale
x_new, y_new = get_coordinates_inverse(long_new, lat_new)
age += 1
x = x_new
y = y_new
即使在这一阶段之后,地图看起来已经准备好了,我注意到风粒子会以一种奇怪的方式绕着两极运动。他们沿着一条表明某种极端情况发生在极点周围的道路前进。
极点周围的粒子似乎遵循{-x/sqrt(x +y +4),y/sqrt(x +y +4)}形式的向量场。这不太可能是靠近极点的风所发生的情况。用 Wolfram|Alpha 生成的矢量场。
找出导致这个问题的原因是构建这个数据可视化的最困难的部分。解决办法原来很简单。但是一开始,我错误地试图估算正投影的变形并解释它。
这种效应只发生在两极附近。我想这一定与我的投射有关。事实上,在正投影中,我们越靠近极点,经度就越短 1 度。
我在一本厚厚的教科书《T4 地图投影——美国地质调查局的工作手册》中寻找扭曲方程。我实现了一个相当复杂的函数,通过数值估计一阶导数来获得失真值。回顾过去——真是矫枉过正。它甚至没有解决问题。
解决办法原来很简单。移动质点时,忘了处理质点过 180°子午线的情况。两个声明足以解决这个问题。失真方程可以被废弃。
//handle edge cases for longitude
if (long_new > 180){
long_new -= 360
}
else if (long_new < -180){
long_new += 360
}
修饰和微调
最后,在调用可视化完成之前,需要查找和设置一些任意的参数。幸运的是,可观察的笔记本允许创建滑块,帮助找到视觉上令人愉悦的价值。
使用滑块进行微调
这是目的港。
回过头来看,有那么多地方看起来很简单。而且,每次我花额外的时间去解决意想不到的事情,视觉故事都有了显著的提高。强大的缩放和拖动、高效的基于 WebGL 的光栅重投影以及轻量级粒子动画都始于意外的挫折。
所以现在,给你自己弄杯咖啡,然后继续你的数据工作,即!
不要忘了在 Observable 上查看代码的实时可视化:https://observablehq.com/@oskarkocol/animated-wind-map
不要过度配合!II-如何避免机器学习和深度学习模型中的过度拟合
作者图片
O 预测建模的主要目标之一是建立一个模型,对看不见的数据做出准确的预测,这只有在我们确保它们没有过度拟合训练数据时才有可能。不幸的是,过度拟合是每个机器学习者在职业生涯中面临的常见绊脚石。这有许多原因,但我们想指出一些主要原因。首先是训练样本中存在较少的数据点,其次是数据集不平衡,最后但同样重要的是模型的复杂性。
在这篇博客中,我们将尝试几乎所有的机器学习和深度学习启发式方法,以避免 Kaggle 竞赛 之一的数据集中的过度拟合【不要过度拟合 II 。
以下是该博客关注的内容列表。我们会一个接一个地探索每一个。
目录
Kaggle 问题陈述、数据集和评估指标:
问题陈述
用训练集中的 250 个数据点建立模型,并对测试集中的 19750 个数据点准确预测二元目标。数据集包含 300 个连续变量的要素。
资料组
数据集可以从这里获得。
文件:
● train.csv —训练集。250 行。
● test.csv —测试集。19750 行。
● sample_submission.csv —格式正确的样本提交文件
列:
● id-样本 id
● target-一个来源神秘的二进制目标。
●0–299-连续变量。
注:
kaggle 网站上目前可用的数据集是一个新版本,但评估仍在旧版本上进行。你可以在这里得到旧版本的
评估指标
AUCROC (受试者工作特性/曲线下面积)
ROC 曲线总结了使用不同概率阈值的预测模型的真阳性率和假阳性率之间的权衡。但是,当数据集高度不平衡时,这种度量并不可取。ROC 曲线下的面积称为 AUC,AUC 越高,性能越高。对于无技能模型,AUC 将为 0.5。
现有方法:
我们已经知道这个比赛在一年前已经在 Kaggle 上完成了,大量的方法得到了应用。一些最好的方法阐述如下:
只是不要过度拟合【1】:
这篇博客的关键方法是使用 LASSOCV(最小绝对收缩和选择操作符交叉验证)。它由两个术语 LASSO 和 CV 组成(其中 CV 是交叉验证)。LASSO 回归器的主要功能是添加一些偏差项,以最小化模型的方差。它执行 L1 正则化,即添加相当于系数幅度绝对值的惩罚。它的目标函数是:
作者图片
其中唯一的参数是α。alpha 值越大,要素的权重越接近零。该算法的使用导致 Kaggle 领先板上的得分为 0.843 。
不要过度配合!—如何防止深度学习模型中的过度拟合【2】:
这个博客试图训练一个深度神经网络模型,以避免我们拥有的相同数据集的过度拟合。首先,使用 RFE(递归特征消除)算法进行特征选择。接下来,训练一个简单的具有 2 个隐藏层和 2 个早期停止的丢弃层的 NN 模型,导致 80% 的测试准确度。
关于过度拟合的研究工作
过度拟合及其解决方案概述【3】:
本文详细介绍了一些避免过拟合的启发式技术,并给出了如何以及何时应用它们的原因。
网络缩减:
模型的复杂性可以通过消除不太重要和不相关的数据(即噪声)来降低,这反过来将有助于模型防止过拟合,并对看不见的数据表现良好。这被称为剪枝,广泛应用于决策树算法中。已经提出了两种类型的修剪方法,一种是预修剪,另一种是后修剪。
预修剪方法试图在生成具有非常小样本的叶子之前尽早停止树构建过程。在分裂树的每个阶段,我们检查交叉验证错误。如果误差没有明显减小,我们就停止。这在学习算法中也称为提前停止。
后期修剪包括修剪树木。在树被构建之后,它被修剪回交叉验证误差最小的点。
训练数据的扩展:
由于有限的数据会导致模型过拟合,我们应该将其扩展出来,这可能有助于模型避免过拟合。本文提出的技术包括向现有数据集添加一些随机噪声,通过一些处理从现有数据集中重新获取一些数据,以及基于数据集的分布产生一些新数据。
正则化:
大量的特征使得模型更加复杂。如果我们在代价函数中加入一个正则项,而不是任意地丢弃一些特征,这将通过最小化它们的权重来减少无用特征的影响。L1 正则化项将不太重要的特征的权重设置为零,而 L2 正则化使该类型的权重太小。
变量选择方法比较中的过度拟合【4】:
本文介绍了两种主要的特征选择方法,即顺序向前选择(SFS)和顺序向前浮动选择(SFFS)。覆盖了在声纳和蘑菇数据集上获得的结果,从而表明 SFFS 产生了比 SFS 更好的结果。在蘑菇数据集中,与 SFS 选择的几个特征相比,SFFS 在测试数据上给出了更好的结果,即使是一半的特征。
顺序前向选择(SFS):
在该方法中,首先选择最佳单个特征,并与未选择的特征配对,再次跟随最佳配对特征的选择。同样,制作具有最佳对和未选择特征的三元组,然后选择最佳三元组特征。这个过程一直持续到选择了所需数量的特征。
作者图片
这种方法的缺点是,一旦选择了一个特征,我们就不能删除它,即使我们可以通过另一个相对较小的特征子集获得良好的结果。SFFS 克服了这一限制。
顺序向前浮动选择(SFFS):
【SFFS】从空集开始。在每向前一步之后,只要目标函数保持升级,它就执行向后一步。这种方法的关键是使用回溯算法来选择最佳和最小的特征子集。这种方法的缺点是计算量大。
作者图片
多目标学习中的泛化改进【5】:
与上述处理过拟合的策略不同,本文提到了一种称为噪声注入(抖动)的启发式方法来消除此类问题。在本文中,已经证明 SO(单目标,例如均方误差)算法比 MO(多目标,例如 ROCAUC)算法更容易过拟合。这是因为,在 ROCAUC 中,成本函数算法试图同时最大化 TPR 和最小化 FPR,其作为调节器工作并阻止其过度拟合。
已经提到的第二件重要的事情是,神经网络对于训练模式中的微小变化更加稳健。因此,通过注入噪声和用神经网络训练这样的数据来扰动训练数据,使得模型不会过度拟合,并且在测试数据上表现得更好。
以下是本文中提到的扰动训练数据的两种方法。
加性高斯噪声:
在每一代中,通过向输入的每个元素添加正态分布随机数来生成新的人工训练数据集。
通过平均添加噪声:
在这种方法中,通过在局部邻域内平均原始图案来生成新的人工图案。
我们的贡献
已经应用了几种方法,产生了一些结果。然而,在迄今为止我们从各种研究论文中学到的许多相关技术中;我们会用重要的概念性想法来指导我们的项目。我们的方法分为两种:第一种是机器学习方法,另一种是神经网络方法。
机器学习方法:
- 应用过采样和欠采样两种技术来平衡稍微不平衡的数据集。
- 由于更多的特征可能导致过度拟合,因此只有重要特征的选择属于基于过滤方法、包装方法和嵌入方法的特征选择。
- 由于特征工程是构建智能系统的重要组成部分,并且我们知道所有的特征值都是连续分布的,我们可以通过使用宁滨技术将连续数据转化为离散数据。我们将应用自适应宁滨来处理一些本质上倾斜的特征。
神经网络学习方法:
- Lars Gr 等人【5】提到噪声注入会帮助模型防止过拟合。因此,我们将在我们的神经网络架构中添加高斯噪声层以及下降层。
让我们从数据集的探索性数据分析开始吧!!
探索性数据分析
数据集显示如下:
训练数据
作者图片
观察:
训练数据有 300 个自变量(0 到 299)和一个因变量(目标)以及一个唯一 id 和 250 行(数据点)。所有要素的值都是连续的,并且从描述表来看似乎具有相似的分布。
缺少值?
作者图片
观察:
正如您所观察到的,这里没有空值。
单变量分析
目标:
作者图片
观察 :
可以清楚地看到,数据集是不平衡的,其中属于目标 0 的数据点是 36%,但是对于目标 1 是 64%。因此,可以说目标 1 大约是目标 0 的两倍。
单帧中所有(0–299)独立特征的分布图:
作者图片
作者图片
观察:
从上面两个图中,可以清楚地感知到,整个 300 个特征的分布几乎是相同的,并且都具有几乎相同的均值和标准差。
如果我们更深入地研究每个特征图,我们会发现目标 0 和目标 1 点在它们的每个特征分布中的重叠。所有特征分布的偏斜值在[-0.37,0.43]的范围内,峰度值在[-0.78,0.98]的范围内。因此,我们可以说所有的分布都是近似对称的,但不是完美的正态分布。
双变量分析
关联:
作者图片
观察:
从上面的热图来看,要得到特征之间相关性的确切值是相当困难的。然而,从颜色条中,可以观察到特征并不高度相关,因为相关性的范围是[-0.2 到 0.2]
与目标相关的前 10 个特征:
作者图片
观察:
特征 33 和 217 分别与目标 1 和 0 最相关。
对图中前 5 个与目标正相关的特征:
作者图片
观察:
上述 4 个特征[33,65,24,183]将是对分类任务最重要的特征,因为很明显它们不是完全重叠的,而是完全分离的。
对图中与目标负相关的前 5 个特征:
作者图片
观察:
同样,特征[217,117,91,295,73]将是进行分类的重要特征,因为很明显它们不是完全重叠的,而是完全分离的。
多变量分析
2D 300d 数据点可视化:
作者图片
观察:
所有的点都杂乱无章地散布着。因此,它不是线性可分的。
300d 数据点的三维可视化:
作者图片
观察:
随着维度的增加,目标 0 和目标 1 点仅经历分离。因此,它们在更高的维度上更容易区分*。*
所有特征的均值、标准差、偏度、峰度:
作者图片
观察:
基于均值和标准差频率图的所有特征似乎都是归一化的,并且正态分布,均值= 0(近似值)和标准差=0.1(近似值)。
如果我们观察偏斜度和峰度频率图,偏斜度= 0.15,峰度> 1.5(对于目标 1 数据点),这表明它具有比正态分布更重的尾部。
目标 0 和目标 1 数据点的分布重叠。
因此,我们可以得出结论,随机分布不存在。
特征工程
偏度> 0.3 或偏度< -0.3: 的特征的基于四分位数的宁滨
代码:
首先我们搜索偏斜度>为 0.3 或偏斜度< -0.3 的特征,应用四分位数自适应宁滨,然后将所有这些特征保存到磁盘中。
作者代码
作者图片
观察:
使用基于四分位数的自适应宁滨,我们将 7 个偏斜特征转换成分类特征。
工程特征还显示目标 0 和目标 1 点之间的重叠。然而,在某个频率极限之上,目标 0 点是占优势的,这被证明是有用特征的证据。
首次切割方法
基于 EDA,以下是需要注意的核心要点:
- 数据集中的行数太少。
- 数据集不是高度不平衡的。因此,它不会对模型产生太大的影响。
- 所有特征值都是实数。没有明确的特征。甚至所有特征的分布几乎相同,并且它们接近正态分布。因此,我们不需要任何复杂的预处理。只有简单的标准化才行得通。
记住以上几点,我们的第一步方法是训练一个正则化的逻辑回归模型。我们将使用 RandomSearchCV 搜索合适的参数。
机器学习模型
所有的模型都被归类为一种类型,如基线模型、过样本模型、工程特征模型等。在每种类型下,有 8 种不同的分类算法,随后是给定数据集的校准训练。它们如下所列:
- 逻辑回归(线性)
- 线性判别分析(线性)
- k 近邻分类器(非线性)
- 决策树(非线性)
- 朴素贝叶斯(非线性)
- 支持向量分类器(非线性)
- 随机森林(非线性)
- XGBoost(非线性)
在直接进入每个模型之前,让我们先讨论一下设计的所有有用的功能。
绘制受试者工作特征曲线下面积(AUC ROC):
作者代码
八种分类算法的流水线:
作者代码
八分类器模型训练模板:
作者代码
现在让我们从建模和导入我们的火车测试数据开始!
作者代码
作者图片
1.基线模型
在该模型中,除了标准化/缩放原始数据集之外,没有进行其他修改。获得的数据集因此用 8 个提到的分类器训练。通过给出 0.818(私人得分)的逻辑回归获得最佳结果。从基线模型来看,这个结果绝对超过预期。
代码:
作者代码
基线模型 Kaggle 提交分数:
作者图片
最佳得分分类器的 ROC 曲线(即逻辑回归):
作者图片
2.过样本模型
在这个模型中,我们首先在 SMOTE 算法的帮助下对属于少数类的数据点进行上采样,以平衡数据集。然后,我们用所有的分类器训练它。使用得分为 0.754(私人得分)的 XGBoost 算法获得了显著的结果。然而,与基线模型相比,这一分数并未达标。
代码:
作者代码
过样模型 Kaggle 提交分数:
作者图片
最佳得分分类器的 ROC 曲线(即 XGBoost):
作者图片
3.样品型号不足
在该模型中,应用上采样和下采样来平衡数据集,然后用所有分类器训练数据集,从而由 XGBoost 产生最佳得分 0.694(私人得分)。与其他模型相比,这个分数证明了上采样和下采样同时进行可能是行不通的。
代码:
作者代码
样本模式下 Kaggle 提交分数超过:
作者图片
最佳得分分类器的 ROC 曲线(即 XGBoost):
作者图片
4.工程特征模型
在这里,我们向原始数据集添加了 7 个宁滨编码的特征,并用所有分类器对其进行训练,通过逻辑回归算法获得了最高得分 0.762(私人得分)。显而易见,我们设计的功能甚至降低了性能,但并没有解决这个问题。
代码:
作者代码
工程特征模型 Kaggle 提交分数:
作者图片
最佳得分分类器的 ROC 曲线(即 Logistic 回归):
作者图片
5.互信息模型
在该模型中,互信息是一种基于过滤器的特征选择方法,用于选择最佳特征,然后与所有分类器一起训练它们。 SVC 算法给出了 0.666 的好成绩(私分)。将该分数与其他模型的分数进行比较,我们可以得出结论,这不是该问题的最佳特征选择方法。
代码:
作者代码
互信息模型 Kaggle 提交分数:
作者图片
最佳得分分类器(即支持向量分类器)的 ROC 曲线:
作者图片
6.顺序向前选择模型
在该模型中,SFS(一种基于包装器的特征选择方法)已被应用,随后是前 20 个特征的选择。所有的分类器只使用这些特征来训练数据。使用随机森林获得 0.710 的最佳分数(私人分数)。这个分数也证明了它并不是这个问题的最佳特征选择方法。
代码:
作者代码
SFS 图:
作者图片
SFS 模型的 Kaggle 提交分数:
作者图片
最佳得分分类器(即随机森林)的 ROC 曲线:
作者图片
7.序贯向前浮动选择(SFFS)模型
在该模型中,应用了基于包装器的特征选择方法 SFFS,随后选择了前 17 个特征。然后用具有这些特征的所有分类器来训练数据。最好成绩 0.712(私分)由朴素贝叶斯产生。与之前的模型相似,这种方法并没有导致分数的显著增加。
代码:
作者代码
SFFS 图:
作者图片
SFFS 模型 Kaggle 提交分数:
作者图片
最佳得分分类器(即朴素贝叶斯)的 ROC 曲线:
作者图片
8.递归特征消除(RFE)模型
在该模型中,应用了基于包装器的特征选择方法 RFE。最佳基线分类器被用作 RFE 方法的估计量,该方法产生 0.838 的显著分数(私人分数)。这就是我们期待的结果!这种特征选择的方法对于这个问题表现得很好。
代码:
作者代码
RFE 模型 Kaggle 提交分数:
作者图片
RFE 模型的 ROC 曲线:
作者图片
9.嵌入式模型
在该模型中,采用了一种嵌入式的特征选择方法。使用的 3 种不同的嵌入式算法是 LassoCv、LassoLarsCV 和 RidgeCV。他们用 LassoCV 算法得到了 0.821 的显著分数!这种特征选择方法成为解决我们问题的最佳方法之一。
代码:
作者代码
嵌入模型 Kaggle 提交分数:
作者图片
最佳得分分类器(即 LassoCV)的 ROC 曲线:
作者图片
深度学习模型
深度学习方法中有两种模型,基线模型和噪声模型。
让我们首先讨论 DL 模型的所有效用函数。
列车功能:
作者代码
损失、准确性和 AUC 绘图功能:
作者代码
1.基线模型
该模型仅使用两个分别为 40 和 20 个神经元的隐藏层进行训练,结果很差,得分为 0.608(私人得分)。
代码:
作者代码
基线指标图:
作者图片
DL 基线模型 Kaggle 提交得分:
作者图片
2.高斯噪声模型
该模型已经用两个隐藏层进行了训练,每个隐藏层有 20 个神经元和两个噪声量为 0.01 的高斯噪声层以及两个丢弃率为 0.3 的丢弃层。获得了分数为 0.753(私人分数)的相对较好的结果。
代码:
首先进行网格搜索以获得 aur 架构的最佳超参数,然后用该神经网络进行训练。
作者代码
噪声模型的度量图:
作者图片
DL 噪声模型 Kaggle 提交评分:
作者图片
结果
根据私人评分对所有 ML 模型进行排名
作者图片
根据私人评分对所有 DL 模型进行排名
作者图片
迄今为止最好的 Kaggle 评分模型
作者图片
结论
- 在所有的特征选择方法中,递归特征消除法在这个问题上做得很好。
- 由于特性的数量大于行数,添加更多的特性肯定是行不通的。
- 众所周知,即使有大量数据,神经网络也容易过度拟合。我们正在处理的数据非常少,这使得过度拟合的可能性最大。然而,噪声层的注入明显减少了这种担心,我们的模型比预期的要好得多。
- 由于所有嵌入式方法的性能都优于基于过滤器和包装器的方法,因此对不太重要的特征给予低权重被证明是一种更好的技术,而不是直接消除这些特征。
未来的工作
- 类似于排名前 3 的参赛者,可以应用 LB 探测技术。
- 神经网络模型的效果远远好于预期,因此我们的模型可以进一步改进,这样分数可以增加到 0.80 以上。
- 我们可以通过组合我们得到的所有执行模型来尝试堆叠和投票模型。
参考
[1] Brij Patel,就是不要过度拟合,(2019)。
[2]尼尔斯·施吕特,不要过度拟合!—如何防止深度学习模型中的过度拟合,(2019)
[3]薛颖,北京市海淀区上地七街 1 号钟会大厦 1 号楼,邮编 10 0085
[4] Juha Reunanen,在变量选择方法之间进行比较时过度拟合,ABB,网络成像系统,邮政信箱 94,00381,芬兰赫尔辛基
[5] Lars Gr,jiao Chu Jin,IEEE 高级成员,和 Bernhard Sendhoff,IEEE 高级成员,多目标学习中的泛化改进,2006 年神经网络国际联合会议,加拿大温哥华喜来登酒店,温哥华,BC,2006 年 7 月 16-21 日
感谢您的阅读!这里是我在 GitHub 上的 LinkedIn 简介和代码。