TowardsDataScience-博客中文翻译-2021-二十九-
TowardsDataScience 博客中文翻译 2021(二十九)
原文:TowardsDataScience Blog
协议:CC BY-NC-SA 4.0
数据科学:研究生院还是认证?
原文:https://towardsdatascience.com/data-science-grad-school-or-certification-f188a818701d?source=collection_archive---------35-----------------------
意见
哪个选项最适合你?
瓦西里·科洛达在Unsplash【1】上拍摄的照片。
目录
- 介绍
- 研究所
- 证书
- 摘要
- 参考
介绍
本文面向已经获得本科学位并希望转向数据科学的人,或者对了解每种教育方式的好处感兴趣的人。随着数据科学、机器学习、人工智能和深度学习成为几乎任何行业的热门工作,研究生课程也应运而生,以满足需求。然而,出于各种原因,还有一个选择可能更具吸引力,那就是数据科学证书。如果你想知道两者之间的区别,对两者的期望,以及研究生院和数据科学认证的好处,请继续阅读下面的内容。
研究所
照片由普里西拉·杜·普里兹在Unsplash【2】拍摄。
研究生院可以有多种形式,无论是面对面教学还是完全在线教学,或者两者兼而有之。这个选择需要更多的承诺,但反过来,可能会激励你完成并收获它的许多好处。
以下是为您的数据科学教育选择研究生院的好处:
- 你可以亲自见你的同学,在大多数节目中(甚至在线节目也提供一些面对面的会面)。
- 你可以提供更加复杂的顶点/最终项目,你也可以亲自出席峰会或会议,最终让你与声誉良好的公司建立联系。
- 它们很贵——虽然这是一个缺点,正如我们将在下面提到的,但它也可以被视为一个优点,因为你做出了巨大的金钱承诺,坦率地说,这将迫使你学习,这样你就不会浪费。
- 内在信任 —数据科学的研究生院通常来自久负盛名的大学,因此你可以相信它们的项目结构是有竞争力的、有益的。
- 对于一些公司来说,拥有数据科学的研究生学位比证书更受欢迎(T3 )( T4)。
以下是选择研究生院的一些缺点:
- 它比大多数认证都要贵**。**
- 这比大多数认证花费的时间要长得多。
- 除了目前的工作之外,每周还要上多门课程,这可能会让你不堪重负。
- 课程有时会落后于数据科学趋势。
- 有时候会太笼统**。**
- 有时候你不得不等待程序开始,然后你才想。
如您所见,从研究生院获得数据科学学位有很多好处。虽然有一些缺点,但最终还是要由你来决定它们是否大于优点。
证书
Avel Chuklanov 在Unsplash【3】上拍摄的照片。
认证有点棘手。它可以是多项认证,也可以是一项认证,通常由认证公司进行认证。然而,仍然有无数的知名认证,随着时间的推移,它们被视为在数据科学领域找到工作的途径。
以下是为您的数据科学教育选择认证的好处:
- 这可能比读研快得多,也许是几周/几个月而不是几年。
- 它往往要便宜得多。
- 因为项目更短,课程可以随着时间的推移而改变,这意味着,与研究生院不同,认证可以快速重新设计他们的课程**,用于趋势数据科学包和 CatBoost 等机器学习算法。**
- 它提供了更多的专业知识,例如,你可以选择一个只有梯度推进算法的证书,而在研究生院,它倾向于简单地有一个算法的通用课程。
- 他们更加灵活,你可以建立自己的项目,选择多种你真正喜欢的课程。
- 你可以跳过你不需要的课程,一些研究生院包括并要求的课程,如
intro to SQL
、intro to coding
、intro to statistics
,如果你已经知道这些,你可能会浪费一整个学期的时间。
以下是选择证书学校的一些缺点:
- 它们有时不如研究生院有声望。
- ****很难相信如果证书实际上是在教你正确的信息,数据科学方面的证书比研究生院多得多,所以要知道选择参加哪一个( s )可能会让人不知所措。
- 当你完成了“全面教育”时,可能会更加难以知道(T7),比如在研究生院,你的主要学习有一个明确的终点(当然,你总是可以学习,但对于你最初接触数据科学到你找到工作的时间来说,不知道你何时准备好认证是一种压力)。
写完这些优点后,我惊讶地发现认证能提供多少好处。当然,还是有一些缺点的。再说一次,最终,还是要由你来权衡每一个,每一个具体的研究生院项目和证书的利弊。
摘要
我希望这篇文章能阐明是什么让这两种教育选择不同,以及两者的优缺点。两者都是令人惊叹的选择,只要你学习并花时间积累你在数据科学方面的知识和经验,你就会成功。
总而言之,以下是每个选项的一般优势:
**Graduate School:** reputable, networking, and trustworthy**Certifications:** flexible, quicker, and cheaper
我希望你觉得我的文章既有趣又有用。如果您同意或不同意数据科学中每个教育选项的利弊,请随时在下面发表评论。你还能想到哪些优点和缺点?根据我的经验,我选择了研究生院的路线,我也尝试了认证路线,虽然我仍然在学习,但我发现很难集中精力并让自己对完成 X 数量的认证负责,以达到相同的研究生教育水*。但是,那是我,而 你 可能很不一样——所以我希望我上面讨论的能给你一些信息,让你做决定。
请随时查看我的个人资料和其他文章,也可以在 LinkedIn 上联系我。
参考
[1]2018 年瓦西里·科洛达在 Unsplash 上拍摄的照片
[2]Priscilla Du Preez 在 Unsplash 上拍摄的照片,(2018)
[3]照片由 Avel Chuklanov 在Unsplash(2019)拍摄
数据科学:不知道 2021 年还刺激吗
原文:https://towardsdatascience.com/data-science-i-wonder-if-its-still-sexy-in-2021-b68006c78f71?source=collection_archive---------78-----------------------
了解数据科学是否仍然令人兴奋,它是否适合你
胡安·鲁米普努在 Unsplash 上的照片
介绍
每年产生的数据的增加是一个挑衅性的姿态,启发企业采取更多的行动并使用他们所掌握的数据。尽管数据驱动的决策在 2012 年之前就已经存在,但发表在《哈佛商业评论》上的一篇著名文章吸引了许多人的注意。
“它们在商业领域的突然出现反映了这样一个事实,即公司现在正在努力应对从未遇到过的种类和数量的信息。”——哈佛商业评论,2012 年。
有了 数据科学家:21 世纪最性感的工作 *,*这样的标题,就不难理解为什么这份工作可能是今天许多人想成为数据科学家的一个影响因素。然而,随着我们迅速接*原始文章发表后的十年,我很想确定数据科学是否已经失去了它的吸引力,以及它是否是一个值得追求的好职业。
什么是数据科学?
取决于你问谁,你可能会得到一个完全不同的答案。例如,美国统计学家 Nate Silver 认为数据科学只是统计学的另一个名称,而同样是美国统计学家(哥伦比亚大学统计学教授)的 Andrew Gelman 将统计学描述为数据科学的非必要部分。
尽管存在困惑,但我相信我们都同意数据科学专注于使用科学方法、流程、算法和系统从数据集中提取知识和见解,从而包含分析,确保数据处于足够好的状态以供分析,然后提供见解以通知高层决策。
理想工作的 5 个要素
如果我们想知道数据科学是否会是一个好职业,我们定义好职业的组成要素是很重要的。
许多人通常会认为,找到合适的职业包括通过灵光一现找到自己的激情,或者决定报酬最高的最轻松的工作。然而,根据名为 的 2017 年职业指南,我们回顾了 60 多项关于理想工作的研究。下面是我们发现的 ,没有证据支持这些说法。
相反,从他们的研究中,他们能够提出 5 个关键因素(实际上是 6 个,但我觉得第 6 个有点重复),这些因素可以用来创造理想的工作,我将使用这些因素来确定数据科学在 2021 年是否仍然是一个好的职业。
#1 吸引人的工作
与普遍的看法相反,薪水、地位和一个人可能工作的公司类型对工作是否有吸引力并没有人们想象的那么重要。事实上,决定工作是否吸引人的是日常工作。
“引人入胜的工作是吸引你、吸引你的注意力、给你一种流动感的工作。”——本杰明·托德,《八万小时》的作者
仔细想想,这很有道理——想想当我们在玩一个有趣的游戏时,时间是如何呼啸而过的。我们发现游戏很吸引人,因为我们拥有:
- 决定如何执行任务的自由感
- 要完成的明确任务或目标
- 要做的各种任务
- 反馈来了解你做得有多好
回到上下文中来,数据科学家的日常任务通常围绕着数据,这并不奇怪。人们经常说,数据科学的大部分工作是收集、分析或清理数据,将其转换成合适的格式,以便做进一步的工作。然而,这项工作的全部范围不止于此,还有其他与上面列出的技术任务同样重要的活动,例如与非技术利益相关者交流,以及跟上该领域的变化。
许多人会同意,数据科学是一门科学,也是一门艺术,因此为实践者提供了执行手头任务的自由。问题是,世界上所有的自由并不意味着像我们过去看到的那样,价值正在被创造。2017 年有一篇流行的文章——大数据战略以 85%的失败率令人失望——该文章主要声称数据项目未能实现公司所期待的预期转型。
如果我指出这是数据项目高交付率的绝对原因,那将是犯罪,然而,为了这篇文章,重点将放在延长的周转时间和巨大的努力上,而没有看到潜在的价值,因为这涵盖了参与的关键点——反馈。
数据科学项目需要大量的努力,尽管缺乏对项目最终结果及其商业价值的可见性。传统项目可能需要很长时间才能完成,直到可以评估结果,延迟的反馈可能会令人沮丧,尤其是在投入所有努力和资金后,项目失败了。
此外,如果你在一家小公司工作,你就不太可能参与各种各样的项目,因为他们可能不愿意在可能成功也可能失败的事情上投入这么多的投资。
我的评价(从事的工作):3/5
#2 帮助他人的工作
游戏可能会提供高水*的参与,但它缺乏的是帮助他人的能力——尽管这种情况正在开始转变,因为许多人发现观看他人的游戏有很大的娱乐性,这可以被视为一种帮助形式。
越来越多的证据表明,帮助他人在我们的生活满意度中发挥着重要作用,如果是这样的话,这就是数据科学蓬勃发展的地方。—关于这方面的更多信息,你可以阅读由伦敦大学学院出版的关于更多慈善支持的帮助他人的 10 个好处,尽管我确信利用商业支持他人的人也会获得同样的好处。
数据是由人产生的,如果数据科学是利用这些数据来发现知识和见解,做出明智的决策来帮助他人,那么我认为数据科学的本质就是帮助他人。当然,当项目没有失败的时候。
我认为这在 Youtube、亚马逊和网飞等*台上最为突出,这些*台使用推荐系统来帮助用户提高效率,并提供人们可能从未明确搜索过但仍然非常有价值的资源。
我的评价(帮助他人的工作):4/5
#3 发挥你的特长
绝对没有人喜欢不断被打屁股。包括他们的工作。当你擅长你所做的事情时,它会给你一种成就感,这也被认为是生活满足感的重要组成部分。
当你擅长你所做的事情时,它可以作为杠杆:
- 协商一份令人满意的工作的组成部分
- 从事更有意义的项目
- 承担更多吸引人的任务
- 获得更高的报酬
我们在这方面的困境是,绝对没有人一开始就擅长自己的工作。事实上,几乎可以肯定的是,你在一个新角色中的最初几次尝试都是不成功的。因此,为了正确评估这一类别,我们必须假设对成为数据科学家感兴趣的人是渴望改进的人,然后我们可以开始考虑他们可以改进的选项数量。
当数据科学在商业中扮演相当新的角色时,许多早期采用者不得不依靠教科书来开始他们的数据科学之旅。随着时间的推移,数以千计的数据科学 MOOCs 已经开发出来,并有了可访问的书籍,无需谈论伟大的开源社区。这也有助于将数据科学工作流程的一个关键方面,即正在使用的编程语言,缩小到 R 和 Python 之间的争议——不像软件工程那样,许多编程语言都有自己独特的时间表、优点和缺点。
在这方面,我想说的是,如果你想在数据科学方面变得优秀,那么有足够的资源来发展你自己,并将你的技能提升到一个新的水*。你能否成为一名优秀的数据科学家,唯一的因素就是你自己。就这一点而言,我给你的工作打五分。
我的评分(你擅长的工作) : 5/5
#4 与支持你的同事一起工作
如果你有你完全不喜欢的同事,而你的老板表现得像是被撒旦雇佣来折磨你,那么你很可能不会对你的工作满意。
当我们讨论充实生活的话题时,良好的关系是一个主要因素,因此,我们能够与我们工作的少数人建立友谊是至关重要的。这并不意味着每个人都必须成为朋友,相反,重要的是当你陷入一项任务时,你能够得到帮助。
支持你的同事本质上不会是一个害怕告诉你你的工作是一堆垃圾的大软蛋。美国心理学家亚当·格兰特会告诉你,最好的员工实际上并不是令人愉快的员工。
“令人讨厌的给予者是那些表面上粗鲁、强硬,但内心深处却为他人着想的人。[…].他们是那些愿意给你批评性反馈的人,那些你不想听但你不得不听的反馈”——亚当·格兰特
你是否有支持你的同事完全取决于你所在的组织,所以这不是衡量这个因素的好方法。相反,我将把数据科学社区作为一个整体来进行评估,一般来说,你会听到它是技术领域最好的社区之一,因为人们愿意分享他们的研究。
然而,我觉得这个领域缺乏的是多元化部门。你经常会发现,最令人讨厌的人通常是那些与我们截然不同的人,只要他们把我们的最佳利益放在心上,他们的反馈往往是非常有价值的。作为技术领域中代表性不足的少数民族的一员,我觉得大数据正在世界上发生许多重大转变,而受影响最大的人获得的投入最少。
我的评分(你擅长的工作) : 4/5
# 5 缺乏主要的负面因素
为了让工作真正令人满意,这份工作应该没有让工作不愉快的东西,比如:
- 长途通勤
- 长时间
- 不公*的报酬
- 工作不稳定
通勤时间对个人来说是主观的,尽管在疫情中,我确实相信我们正处于一个过渡阶段,远程工作将变得更加突出(特别是对于技术角色),因此使这一标准可能过时。
我找不到太多关于实际数据科学家*均工作多长时间的数据,但我确实找到了一个非常有趣的子编辑,它讨论了一周中有 25 个小时花在等待工作上,10-15 个小时是花在实际工作上的时间——这使得一周大约有 40 个小时。我确实相信,在大多数组织中,设置任务和实际接收数据之间的延迟是相当普遍的。
在我看来,数据科学的工资差距很大。由于在商业中没有明确的区别,经常有人在另一个组织中做了比其他人多得多的工作却得到了更少的报酬。
来源 : 玻璃门工资
工作不稳定是另一个棘手的问题。从我个人的经验来看,我已经意识到数据科学与软件工程非常不同,因为数据科学需要更多的自由流动,并且可能很难区分明确的目标,而软件工程有一个需要达到的明确目标。因此,作为一名数据科学家,有时看起来你似乎没有真正做任何事情,特别是当你没有太多东西可以展示你所做的事情时——如果我们放弃了这一点,那么我会说工作保障不是数据科学最具魅力的吸引力之一。
我的评价(缺少重大负面):3/5
包裹
我给数据科学的性感总分大概是 19/25,相当高。我要说的是,推动商业发展的大部分炒作正在慢慢消退,更多有价值的产品正在开发。我肯定会向任何渴望从事数据科学的人推荐这一职业。但是我建议任何考虑这个职业的人做好准备,致力于发展自己,随着这个领域的快速发展,不断学习新的东西。
需要注意的是,所有的评级都是基于我的观点,并不确定。如果你对我评价不同的东西进行评价,请留下回复,分享你对我想知道的东西的评价。
在 LinkedIn 和/或 Twitter 上与我联系
您可能喜欢的其他文章:
💔-traits-all-great-data-scientist-have-c43ab2de6e64>
2022 年及以后的数据科学
原文:https://towardsdatascience.com/data-science-in-2022-and-beyond-51b944c8a1a9?source=collection_archive---------17-----------------------
对未来工作的大胆设想
图片由来自 Pixabay 的杰洛特拍摄
在 20 世纪 80 年代和 90 年代,发生了两件永远改变工作的事情。第一次是个人电脑(PC)进入商业领域。在 20 世纪 80 年代之前,计算机对于商业领域来说还是非常新的事物,使用它们需要对计算机硬件有高度的理解。
第二次是微软在这些电脑上发布了新的 Windows *台。Windows 实现了更加用户友好的体验,使员工能够利用计算机的能力满足自己的需求。
对工人生产力的影响在许多未来学家的预言中显而易见,他们开始大胆地宣称到 2000 年大多数工作将被计算机取代。因此,不言而喻,由于这两种影响,工作的性质永远改变了。
现在用“人工智能”代替“计算机”这个词,古老的预言听起来很熟悉,对吗?事实上,数据科学的最新进展以及这些进展对人工智能(AI)应用的贡献重新点燃了这些担忧。
这是人类工作结束的标志吗?不太可能。正如世纪之交没有带来完全自动化的劳动力(实际上恰恰相反),人工智能的进步也将努力使人类失业。
这也不意味着这些警报毫无意义。面对巨大的不可控制的变化,人类倾向于预测即将到来的未来的可怕警告。因此,这些警钟可能只是预示着劳动力市场即将发生的另一场变化。
正如工作在 80 年代和 90 年代发生了根本性的变化一样,我们目前也正处于工作性质的另一场大变革的风口浪尖。正如个人电脑的引入需要对劳动力的培训方式进行重大变革一样,下一阶段的工作也是如此。正如计算机创造了更多的工作岗位,而不是更少,下一个变化也将为未来的工作带来新的令人兴奋的机会。
我们站在边缘的这个变化是什么?这种变化是通过数据科学、机器学习和人工智能的方式来实现的。在我们新的数字时代,工作人员将不再脱离组装预测模型和将数据科学技术部署到他们自己的流程中的复杂任务。相反,像计算机一样,人工智能的无处不在将要求工人们更好地理解该技术如何工作,以确保他们在未来保持相关性。
在这篇文章的剩余部分,我将审视我们工作生活中这种变化的本质,并提出一些步骤供我们所有人考虑,如果我们想走在已经到来的事情的最前沿。想要一窥工作的未来,请继续阅读!
改变是现在
但是,未来工作的变化并不遥远,我们很难看到。相反,变化已经在这里,当我写这些文字的时候,我们正在见证它的形成。
当吴恩达与达芙妮·柯勒共同创建 Coursera 并于 2012 年推出时(不到 10 年前),第一批走红的课程之一是 Ng 的机器学习课程。不久之后,ng 还提出了人工智能是“新电力”的想法,以此来类比人工智能对人类的未来影响。
Ng 在 Coursera 上的最新课程是什么?“AI for Everyone。”以下是来自网站的课程介绍:
“人工智能不仅仅是工程师的专利。如果你希望你的组织在使用人工智能方面变得更好,这是告诉所有人——特别是你的非技术同事——要参加的课程。”
不仅仅是像 Ng 这样的创造性思想领袖,他们认识到向所有员工教授人工智能技能的重要性。李维斯为其所有员工推出了一个人工智能训练营,其大胆的愿景是最终用数据科学的工具和技术提升其全球员工的技能。
变革的力量
这一变化的核心是几股力量。第一,AI 越来越无处不在。电“人工智能线”正在铺设,人工智能现在以一种或另一种方式触及几乎每个人。这也意味着企业正面临新的压力,需要通过寻找将传统系统与新的人工智能技术集成的方法来进行创新。因此,我们劳动力变化的第二种和第三种核心力量是人才(或人才缺乏)和竞争。
当像 IBM 和 Apple 这样的公司首次将计算机引入劳动力市场时,它们仍然需要高度的技术理解才能有效地使用。直到更友好的用户界面如微软视窗进入市场,技术含量较低的日常工作人员才开始利用这些新的复杂机器的能力。
数据科学在技术可用性方面也取得了显著进步。像 Data Robot、DataIku 和主要云提供商(AWS、GCP、Azure)这样的公司都在致力于改善终端用户访问的界面,以构建数据科学解决方案。许多相同的产品使用自己的嵌入式人工智能来进一步帮助用户为他们的业务开发定制的人工智能。
结果是,低代码、无代码的解决方案意味着越来越多的人可以开始获得这些数据科学技术提供的能力。
帮助缩小技能差距不仅可以确保越来越多的企业能够利用数据科学,还可以确保构建的数据科学解决方案将产生越来越有用的业务影响。通过培训更广泛的员工在工作中使用数据科学,企业将能够更好地解决竞争漏洞,这些漏洞通常被更了解数据科学的初创公司所利用。
要付出什么代价?
确信很快每个人都需要对现代劳动力中的人工智能和数据科学有所了解?识别迹象是一回事,但找到提升自己或员工技能的方法是完全不同的任务。在我看来,当人们和企业制定战略以将数据科学更多地嵌入到他们的 DNA 结构中时,他们需要关注 3 个关键领域。
这三个重点领域是思维模式、技能组合和数据集。每个领域最终适用的员工数量不同,心态是最广泛的技能提升领域,其次是技能组合,然后是数据集。下图说明了这些关系:
作者图片
心态
从最广泛的技能提升领域开始,心态指的是培训员工更像数据科学家一样思考。数据科学是科学思维和好奇心与技术应用的完美融合。像数据科学家一样思考要求我们理解数据;如何捕捉它,存储它,访问它,并使用它来解决问题。
像数据科学家一样思考还需要知道基于规则的思考和基于统计的思考之间的区别。我们知道规则(if,then 语句)很简单,但不能很好地概括。我们知道太多的规则会变得难以管理,而统计在管理不确定性方面做得更好。
教导员工以这些新的方式看待和思考数据变得越来越重要,因为现在的世界比以往任何时候都更加数字化。
技能组合
一旦确定了关键的思维技能,下一步就是考虑员工需要学习什么技能来利用这种新的思维方式。对于个人或小团队面临的小规模、不太复杂的问题,适用的数据科学技能可能不同于那些涉及更大规模、更复杂的业务流程的问题。了解这些不同层次的业务问题有助于将合适的人与合适的提升技能的机会联系起来。
正如企业仍然有支持企业应用程序的低级 c++程序员一样,他们也有点击式电子表格专家,可以为他们的团队创建更高效的流程。使用数据科学,一个整天审查扫描的电子邮件以确定在哪里跟进的小团队可能会明白,他们的审查可以通过简单的计算机视觉应用程序自动进行,这些应用程序可以从他们过去的决策中学习。为这些团队提供工具来解决他们自己的用例,进一步将数据科学嵌入到公司的核心。
资料组
但是拥有技能和拥有工具也是两个非常不同的问题。最后一项技能提升被称为数据集,因为它指的是用于构建和部署数据科学解决方案的特定工具。为了有效地利用这一新的未来,公司需要确定最佳的*台,以允许跨技能水*和企业的集成。
对于从事高度复杂和大规模数据科学或人工智能解决方案的低级开发人员来说,这意味着启用 Python、Java 或 C+。对于高级的、更符合业务的用户,这意味着低代码或无代码的解决方案,允许更容易地访问复杂的统计预测的能力。这些不同技能水*之间的整合越好,企业提升技能的努力就越成功。
结论
总之,人工智能继续快速改变人类以及我们如何使用技术来支持正在发生的人类问题。我们的全球现代劳动力没有什么不同,个人和企业对数据科学的理解越好,这些个人和企业就越有能力应对这个超数字时代带来的巨大变化。
比如参与学习数据科学、职业发展或糟糕的商业决策?加入我。
充满不确定性的世界中的数据科学
原文:https://towardsdatascience.com/data-science-in-a-world-of-radical-uncertainty-4782edb1e234?source=collection_archive---------22-----------------------
《彻底的不确定性》一书中的 5 个教训
纽约公共图书馆在 Unsplash 拍摄的照片
作者约翰·凯和默文·金将所有的不确定性分为“可解决的不确定性”和“根本的不确定性”。“可解决的不确定性”是一种可以被征服的东西,要么通过研究(“我不确定冰岛的首都,所以我会查一下”)要么通过概率分布(“我不确定轮盘赌的球会落在哪个数字上,但有大约 50%的机会它会是红色”)。“彻底的不确定性”不可能这么容易被驯服。
极端不确定性的极端是未知的未知。例如,2020 年的大多数经济模型没有考虑全球疫情的风险,因此当新冠肺炎出现时,结果证明是相当不准确的。
然而,彻底的不确定性也延伸到已知的未知领域。历史学家强调,全球流行病似乎每 100 年左右就会出现一次。出于这个原因,许多人意识到了风险(正如像这样的文章所证明的),所以对他们来说,Covid 不是一个未知的未知。但是如何回答“2020 年全球疫情发生的概率有多大?”正如作者所强调的,这类问题的唯一准确答案是“我不知道”。这样的概率意味着什么?如果你可以将 2020 年运行 1000 次,其中有多少次会出现全球疫情,有多少次不会?这样说起来似乎很可笑。然而,这并没有阻止人们在事后试图创造这样的人物。
作为数据科学家,我们经常要尝试和建立模型,进行预测和辅助决策。在所有这些情况下,掌握彻底的不确定性至关重要。这是知道什么时候信任一个模型和什么时候不信任之间的区别,是给出对变化有鲁棒性的建议和天真乐观地认为事情会如预期那样的建议之间的区别。因此,我从这本书中获得了巨大的价值,我试图总结出对数据科学家来说最重要的 5 条经验。
第一课:理解谜题和谜团的区别
美国宇航局/JPL 加州理工学院拍摄的“坚持号”在火星上着陆的插图
谜题有规则和答案,而神秘事物没有。当美国国家航空和宇宙航行局将“坚持”号探测器降落在火星上时,他们已经提前几个月知道了着陆的确切日期和时间。这是因为物理定律(在这种情况下)提供了明确的规则。NASA 的工程师理解这些规则,他们有一个非常明确的任务;“让这辆漫游车去火星”。这是一个难题,工程师们成功地解决了。他们的计算和模型能够做出精确的预测,正因为如此,他们的任务以成功告终。
数据科学充满了难题,数据科学家可以从解决这些难题中获得很大的满足感。无论是试图加载和争论一组新的数据,还是试图将一个模型部署到生产中,都有一套清晰的规则,您将知道自己何时取得了成功。
谜题也是应用机器学习的大问题。规则是你的模型试图获得的关系,在你开始之前,你通常有一个正确的解决方案,它是一个带标签的训练集。如果你正试图预测房价,或识别手写数字,有一个正确的答案。
另一方面,神秘事物更难处理,这是因为人类的行为通常不能用一套规则来定义。如果你公司的首席执行官问“我们是否应该在国际上开设新的分支机构?”你可以尝试很多方法来帮助他们做决定。但是你没有办法量化每一个风险,以至于你可以说“60%的时候,你最好在国际上开设一个新的分支机构”。此外,你永远也不会有反事实,你永远也不会确定所做的决定是否正确。除此之外,还有更大的谜团,你甚至不知道所有可能的答案是什么,比如“10 年后科技行业会是什么样子,我们现在应该投资什么?"
不仅仅是企业试图解开谜团。政府问的一些最大的问题是神秘的。"我们如何降低失业率?",“我们如何应对气候变化?”以及“我们该如何应对日益加剧的两极分化?”都是谜。
这并不是说当你面对一个谜时你什么也做不了。你可以做的一件事就是试着把它分解成拼图。在上面的例子中,如果你试图回答关于开设国际分支机构的问题,你可以在不同的国家进行调查,或者尝试建立土地和劳动力成本模型。你可以试着计算机会成本,而不是在某个地区开一家新的分支机构。重要的一点是要认识到,对于一个谜,没有完美的答案,也没有单一的模型或分析会告诉你该怎么做。
对我来说,逐渐理解神秘事物既无法解决又普遍存在,帮助我认识到让人们在极端不确定性面前做出决定的重要性,无论他们是政治家还是首席执行官。
第二课:使用和误用概率
廷杰律师事务所在 Unsplash 上拍摄的照片
这本书给出了许多概率被误用的例子。
它发生在法庭上,如起诉谬误。将犯罪现场的 DNA 与随机数据库中的人进行比对,找到了匹配的人。公诉人辩称,因为两个 DNA 图谱偶然匹配的概率是万分之一,那么这个人肯定有罪。这忽略了一点,如果数据库中只有 20,000 人,那么即使他们都是无辜的,匹配的概率也大约是 86%!
这发生在经济学中,预测和模型预测被当作事实,人们有不合理的高信心,因为市场崩溃的概率被预测为 0%。
但这如何适用于美国数据科学家呢?概率和统计是我们的面包和黄油!我们不会误用它们,我们理解它们。我们很聪明,会保留训练数据,这样我们就可以在真正看不见的数据上测试我们的模型。我们不会高估我们模型的能力,因为我们的度量标准,我们确切地知道它有多好,并且我们将它打印在模型的侧面,让所有人都可以看到。
鉴于数据科学社区中有如此多的冒名顶替综合征,我怀疑你们中的许多人有那么大的傲慢,但我肯定你们中的一些人有这样的想法:“所有这些错误都是由不理解统计的人造成的,所以这不适用于我”。让我告诉你我从书中的信息中得到的教训:
- 人们(包括我们)并不总是对概率和统计有很好的直觉。正因为如此,你工作中任何概率的交流都必须非常仔细地考虑。如果您创建了一个准确率为 99%的欺诈检测模型,并且您自豪地宣称这一事实,那么当您的利益相关者认为如果该模型标记了一个案例,则该案例有 99%的可能性是欺诈时,请不要感到惊讶。对于不*衡足够大的类,真实的百分比可能低至 0%(这也是选择正确的评估指标的一个教训!不要像我们例子中控方误导陪审团一样,无意中误导你的利益相关者。
- 不要太相信你的模型的精确输出。你现在的客户流失模型可能有很高的准确度,但情况会一直如此吗?如果系统受到冲击(来自竞争对手的一场伟大的公关活动)并且客户流失暴涨怎么办?传达你对自己的预测有 99%的信心可能会导致过于自信的计划,现在公司陷入了困境。没有预测到这次冲击会是你的错吗?当然不是。但在对未来的预测中表现出过度自信会影响决策,并反过来伤害你,就像我们例子中的经济学家一样。
模型的讨论很好地将我们带到了第 3 课:
第三课:地图不是地形,模型也不是世界
照片由 Unsplash 上的 Tamas Tuzes-Katai 拍摄
我们刚刚看到,对模型的过度自信会导致问题。但是这种过度自信从何而来,我们又如何避免误用我们的模型呢?
首先,我们应该问自己为什么模型是有用的。在基本层面上,世界和其中的系统是复杂的。这使得理解决策的影响和制定未来计划变得非常困难。模型允许我们将世界简化为问题的关键因素,并开始解开它们之间的关系。
假设您构建了一个基于代理的模型来模拟 Covid 在购物中心的传播。你可以制定规则,规定人们需要多*才能传播病毒,以及如果他们戴着口罩,情况会如何变化。您可以根据购物中心有多少人以及是否有单向系统来创建场景。通过多次运行该模型,您可以开始了解 Covid 是如何传播的,以及不同假设(社区中有多少人拥有 Covid)和干预措施(是否强制使用口罩)的影响,这可以有意义地帮助决策过程。
在模型内部,事情表现得非常好,它们遵循你的规则。这本书把这称为一个小世界,在这个世界里,根本不存在不确定性。表现良好让你可以非常精确地描述这个小世界。例如,该模型可能会向您显示“只要不到 1%的人有 Covid,就可以安全地开设购物中心”或“有一个单向系统可以在 90%的时间内将 Covid 的传播减半”。重要的是,这个小世界不是我们生活的世界,对现实世界做出同样的断言是错误的。在我们的计算机模拟中,人类行为和病毒传播的动力学比移动的代理要复杂得多。
所以如果我们不能做出这些声明,这个模型怎么会有帮助呢?让我们考虑一下在这种情况下政府官员可能需要做出的一些现实决策。
- 他们应该强制使用口罩和单向系统吗?
- 购物中心的最大容量应该是多少?
即使该模型不能准确量化口罩和单向系统的影响,它也可以显示它们是否对病毒的传播有影响。
即使该模型不能给出真实世界最大值的答案,它也可以表明购物中心太多的人有病毒不可控传播的风险,但足够低的人数可以控制局面。
我们展示的是,该模型可以突出风险,并帮助决策者了解可能的结果以及他们可以做些什么来影响这些结果。
我将引用作者的一句名言来结束这一部分:
最后,一个模型只有在使用它的人明白它并不代表“真实的世界”,而是一个探索决策可能出错或不出错的工具时才是有用的
第四课:机器学习模型只从展示给它们的东西中学习
这似乎是显而易见的,但当我们考虑到极端的不确定性时,它有非常大的影响。
我们可以很容易地进入努力创建最准确的机器学习模型的思维模式。然而,当我们将这些模型付诸实践时,它们的表现如何是一个函数,既取决于模型有多好,也取决于被建模的世界有多稳定。
照片由 Ludemeula Fernandes 在 Unsplash 上拍摄
让我们假设你已经建立了一个模型来识别照片中的猫,这个模型在一些测试数据上表现很好。你决定做一个应用程序,让公众可以上传他们自己的照片,起初,这个模型看起来做得很好。鉴于进化的缓慢,你可以相当自信地说,猫不会在一夜之间改变它们的外貌,但这是否意味着你应该自信地说,准确率会一直很高?对你来说不幸的是,虽然猫本身可能是稳定的,但是输入到你的模型中的照片可能不那么稳定。如果手机摄像头变得更好,而你的模型没有经过高分辨率图像的训练,该怎么办?或者,如果你的应用程序在不同的大陆流行,并且包含了你的训练数据中没有的猫的品种,那该怎么办?
这两个事件都会大大降低你的模型的表现。如果这个问题得不到及时解决,你想拥有 10 亿用户并通过 Instagram 赚钱的梦想很快就会破灭。哪里出了问题?这个模型的使用方式并不稳定,因为你没有向它展示这个不同世界的更高分辨率或不同品种的猫,当它遇到它时,它没有办法准确地处理它。
我们可以通过考虑自动驾驶汽车来从一个愚蠢的例子变成一个非常严肃的例子。这些需要能够基于图像准确理解正在发生的事情。如果一辆汽车在白天测试时能够始终准确识别一名骑自行车的人,那当然很好,但如果一辆自动驾驶汽车在晚上遇到一名骑自行车的人,会发生什么呢?如果图像检测模型没有看到足够多的这些例子,那么它可能会失败,这可能会产生可怕的后果。
这是在你考虑那些故意想让你的模型失败的恶意行为者之前。有可能对像停车标志这样的东西做出非常小的具体改变,并让它不被自动驾驶汽车发现**。这些敌对的攻击已经被很好地记录下来,并且有难以想象的多种方式可以用这种攻击造成大量的损失。这些攻击成功的原因和猫应用失败的原因是一样的;模型看到了一些它的训练数据中没有的东西。**
尼克·赖特在 Unsplash 上拍摄的照片
你现在可能会问的问题是*“我们能对此做些什么吗?”*幸运的是,我们有办法让我们的模型更加稳健。
一种方法是问自己“如果我现在离开我的模型,一年后再回来,事情会变得多么糟糕?”这被称为预分析,是一种发现弱点的伟大技术,而不必等待它首先出错。如果你在推出你的猫应用程序之前问了这个问题,你可能已经能够在公众发现自己的缺陷之前,在更高分辨率的图像或更多品种的猫上训练模型。
然而,正如我们现在所知道的,极端的不确定性意味着我们不会提前得到所有的答案。幸运的是,您也可以应用一些技术技巧来帮助提高健壮性。你可以有目的地在你的训练数据中加入噪音,这可以帮助模型学习重要的模式,忽略不重要的。您还可以进行错误分析,找出您的模型表现不佳的具体示例(例如夜间骑自行车的人),然后出去寻找或创建更多此示例的训练数据。如果模特没见过它,那它就学不会!
第五课:拥抱彻底的不确定性
照片由阿梅恩·法赫米在 Unsplash 拍摄
鉴于目前你所读到的一切,如果你认为极端的不确定性只会让你的生活和工作更加努力,这是可以理解的。我知道我发现自己在想“如果一切都是一个谜,那会容易得多”。我想以关于极端不确定性的积极信息作为结尾,这本书很好地强调了这一点。这种极端的不确定性不仅仅是理解起来很重要,而且我们应该对此心存感激。
一个没有极端不确定性的世界意味着…
一个没有人类的世界。我们不是完全理性的,我们的行为不受规则的支配。历史上有些时候,人们的行为似乎就是如此,尤其是极权主义政权。然而,是人类突破了,让世界天翻地覆。我们赋予人类的许多积极特征,从创造力到爱,创造并要求彻底的不确定性。
一个没有创新的世界。从蒸汽机到万维网,想想每一项创新的影响。当这些发生时,系统会受到冲击,看似稳定和可预测的情况不再如此。此外,创新需要冒险,当事情稳定且可预测时,就没有太多冒险的动机了。创新创造了彻底的不确定性,彻底的不确定性创造了创新的空间。
…一个没有激情的世界。正如电影《土拨鼠日》所展示的那样,一个你对每一天都很确定的世界(因为你一次又一次地生活在同一天)不会给你带来*静的心境,而是带来绝望。极端的不确定性是生活情趣的关键成分。
结论
人们很容易相信根本不存在不确定性。在这个假装的幻想中,我们对世界的理解更加完整,我们可以对我们的模型和我们对未来的预测更加自信。然而,这种想法实际上是一个陷阱,会导致无法在现实世界中生存的决策,并可能带来可怕的后果。
“彻底的不确定性”这本书指导我们理解彻底的不确定性如何影响我们生活的方方面面,以及为什么它是一种好的力量。
我从这本书中学到了很多,我给其他数据科学家的前 5 课可以总结如下:
- 将谜团分解成难题,理解为什么你组织中的决策者很难应对极端的不确定性
- 仔细考虑如何传达统计数据和模型评估指标,以免误导利益相关者并影响他们的决策
- 模型并不代表“真实的世界”,而是探索决策可能出错或不会出错的方法的工具
- 机器学习模型只能从它们看到的东西中学习,因此你可以增加或修改训练数据来提高鲁棒性
- 拥抱极端的不确定性,将其视为一种积极的力量,为创新创造空间,让生活变得有价值
营销中的数据科学:初学者指南
原文:https://towardsdatascience.com/data-science-in-marketing-a-beginners-guide-f23423d2ee68?source=collection_archive---------12-----------------------
通过获取领域知识在雇主面前脱颖而出
活动发起人在 Unsplash 上的照片
介绍
作为数据科学家,我们被教导与数字打交道,并使用数学模型进行预测。
然而,在实践中,数据科学与学术环境中教授的材料非常不同。
除了复杂算法的知识,你还需要能够从海量数据中快速获取价值。
在医药、金融、保险和安全领域,数据专业人员有很多机会。作为这些行业的数据专业人员,要真正增加价值,您需要具备领域知识。
只有理解了背景,你才能在数据中找到有意义的模式,得出有价值的观察结果。
像数据收集和特征选择这样的步骤需要大量的人工判断。你需要理解每个变量对于手头问题的重要性。否则,你的模型将无法解释,毫无意义。
例如
让我们举一个营销领域的简单例子。
你在一家大型连锁餐厅 ABC 餐厅工作。您需要建立一个聚类模型来研究不同的客户群。有些变量对您的模型来说比其他变量更重要。
你更感兴趣的是顾客特征— *,比如他们通常的消费金额、购买次数、他们经常光顾的竞争对手品牌、*等。
你对像性别和年龄这样的属性不太感兴趣。虽然它们确实为你的模型增加了价值,但你希望你的细分市场主要根据行为属性来划分。
这意味着您必须为不同的变量添加权重,因此值越高的变量对您的模型的影响越大。
对某些变量需要具有更高权重的理解来自于领域知识。这提高了模型的质量,使其更适用于您试图解决的问题。
为什么要学数据科学做营销?
公司对数据科学家的最大抱怨是无法从建立的模型中获取价值。
虽然这些模型在技术上是合理的,并且使用了最先进的算法,但是它们并不符合业务需求。这些模型经常被当作黑箱,结果令人费解。
得出的见解是不可操作的,将这样的模型投入生产是有风险的。
如果你是一名尚未找到工作的数据科学有志之士,在申请之前获取领域知识是一个好主意。
与医疗保健或金融等行业相比,在营销或商业分析等领域更容易获得领域知识。
如果你既懂数据科学又懂市场营销,你在这些领域找工作会容易得多。
对具备这些技能的人有很高的需求——这些人有足够的营销领域知识来理解获得新客户的过程,以及足够的技术知识来提出数据驱动的解决方案。
在本文中,我将为您提供一些资源,您可以使用这些资源来学习营销数据科学。我还将分解一个营销数据科学家的工作范围,以及你每天要建立的模型种类。
学习资源
- 利用 Python 进行营销分析— Datacamp
如果您已经参加了初级数据科学课程,并对机器学习模型有了基本的了解,您可以考虑参加 Datacamp 课程。
它由 7 门课程组成,带您了解用 Python 分析营销活动、情感分析、客户流失预测、购物篮分析和 A/B 测试等概念。
与其他营销分析课程相比,本课程的一个优势是它教给你数据收集等概念。
通常,当你在市场营销等领域工作时,你不会得到一个预制的数据集来分析客户行为。您需要通过 web 抓取等技术或使用 API 来获取外部数据。
该数据营课程包含的课程涵盖了营销分析中的广泛主题,从外部数据收集到利用机器学习模型做出商业决策。
2。 营销分析— Coursera
上面的 Datacamp 课程范围更广,涵盖了广泛的材料。这是一个很好的市场营销数据科学领域的入门课程。
然而,如果你想更深入地了解营销领域,并理解客户终身价值、保留率和各种业务指标等概念,本课程非常适合你。
本营销分析课程不包括编程或机器学习模型的使用(回归分析除外)。
这是一门面向希望更好地理解该领域的个人的课程,以及可以针对不同业务用例进行的分析类型。
如果你已经有扎实的编程和机器学习基础,我建议你上这门课。本课程将为您提供将数据科学技能与营销领域相结合的能力。
数据科学在营销中的应用(+教程)
数据科学家能够提出对营销专业人士来说并不总是显而易见的建议。他们能够发现数据中的趋势,并展示可操作的见解,而这些见解对人类来说并不总是直观的。
一些流行的营销数据科学应用包括:
购物篮分析
借助购物篮分析,数据科学家能够根据客户销售数据确定经常一起购买的商品列表。
这可以帮助营销团队提出捆绑包和折扣。
这里有一个市场篮子分析教程,你可以跟着一起编码。
客户细分
客户细分是将公司的受众分成不同群体的做法。每个群体都有共同的特征。
在聚类等数据科学技术的帮助下,客户细分可以自动化并快速执行。
这些通常是基于距离的算法,可以发现人类可能忽略的观众亚群体之间的相似特征。
这是我创建的一个客户细分教程,你可以跟着它一起编码。
流失预测
客户流失率是在一定时间内停止使用公司产品的客户的百分比。
流失预测模型是一种数据科学模型,旨在预测客户是否会流失。基于这种预测,营销团队可以改变他们的策略,以留住他们即将失去的人。
正如我上面提到的,模型可解释性是数据科学的一个非常重要的方面。
如果你有一个作为黑盒算法的模型,并且能够准确地预测客户什么时候会离开,但是你不能理解为什么,那么这个模型是没有用的。
这里有一个简单的客户流失预测模型,你可以根据它来编码。
渠道优化
渠道优化是一个过程,通过这个过程,营销团队通常会提出改善客户体验和增加互动的技术。
这方面的一个例子可以是优化公司 Instagram 帖子上的标签,选择正确的关键词,并提出目标机制以获得新的线索。
数据科学家可以在这一过程的每一步提供帮助,根据过去行之有效的方法提出建议。
情感分析
情感分析是理解用户与品牌互动的过程,并衡量他们所做陈述背后的潜在情感。
这在大规模执行时非常有用,例如:
ABC 餐厅希望了解其竞争对手品牌的痛点,这样他们就可以利用这一点来获得新客户。最好的方法是通过情感分析。
收集访问过竞争对手的人的评论可以帮助他们了解消费者正在努力解决什么问题,以及他们如何解决这些问题。
我用从 Twitter 上收集的数据创建了一个情绪分析教程,所有的代码都可以让你跟随。
结论
数据科学是一个在各个领域都有应用的领域。为了从你建立的模型中获得最大价值,理解你试图解决的问题是至关重要的。
领域知识将优秀的数据科学家与伟大的数据科学家区分开来。如果你真的了解你工作的领域,你将能够用你的数据技能提出解决该领域问题的技术。
正如上文所述,数据科学家在营销领域有巨大的发展空间。消费者每天都会产生大量数据,利用这些数据实现公司收入最大化的可能性无穷无尽。
拥有营销和数据科学领域的技能将使你从只拥有数据技能的人中脱颖而出,并使你成为对雇主更有吸引力的候选人。
注:
本文包含附属链接。这意味着,如果你点击它,并选择购买我上面链接的课程,你的订阅费的一小部分将归我所有。
作为一名创作者,这有助于我成长并继续创作这样的内容。
不过,我只推荐我觉得好的课程。我几乎参加了上面提到的所有课程,它们对我向数据科学的过渡至关重要。
感谢您的支持!
本文到此为止,感谢阅读!本文原载此处。
生产中的数据科学:在 Apache Airflow 中构建自动化数据/ML 管道
原文:https://towardsdatascience.com/data-science-in-production-building-automated-data-ml-pipelines-in-apache-airflow-1fa6d434aeb8?source=collection_archive---------22-----------------------
实践教程
封面由 Jay Kachhadia 在 Canva 上设计
自从我写了关于‘全栈数据科学:下一代数据科学家群体’的博客以来,已经有 5 个月了,这篇博客在社交媒体上获得了数百次分享,并得到了来自世界各地的人工智能社区和公司的提及。此外,我在第九届数据科学 UA 大会上发表了关于同一主题的演讲(链接)。在那之后,我明白了在学校或大学里没有人教的工具和技术的需要,即使你是数据科学专业或计算机科学专业的,这在行业中产生了巨大的人才缺口。因此,我从一个关于生产中的数据科学的系列文章开始,介绍数据科学行业中使用的一些工具和技术。第一部分是构建 Flask APIs 来服务 ML 模型,而第二部分是构建 DASH webapp 来展示你的 ML 项目。
阿帕奇气流
Apache Airflow 是一个开源的工作流管理*台。感谢 AirbnbEng 的人们,他们开源了这个项目。我爱气流!它可以帮助你实现数据管道和 ML 管道的自动化,在行业中得到广泛应用。你可以摄取、执行 ETL、执行 ML 任务,并自动完成日常工作。
在这篇博客中,我们将在本地系统上设置气流,并构建一个数据管道,该管道将获取在早上 7 点到 8 点之间发布的关于机器学习的推文,并将 JSON 文件转储到所需的位置。
设置您的环境
第一步通常是建立您自己的项目环境,这样您就可以将您的项目库及其版本与本地 python 环境隔离开来。有两种方法可以专门为你的项目设置 python 环境: Virtualenv 和 Conda 。只是为了保持一致,我将在整个项目中使用 Python 3.6,但你可以使用任何版本,这应该没问题。
用 pip 和 virtualenv 创建虚拟环境
用 Conda 创建虚拟环境
在您的终端中执行上述任何命令后。您将处于项目自己的虚拟环境中。如果你想在虚拟环境中安装任何东西,它就像普通的 pip 安装一样简单。在您从事任何项目时,创建虚拟环境始终是业内的标准做法。
进入虚拟环境后,您可以安装 airflow:
确保您正确设置了 AIRFLOW_HOME
接下来的步骤是初始化数据库,并启动您的 airflow 服务器和调度程序。Airflow web 服务器为您提供了一个 UI 来管理 air flow 可以做的大部分事情,并查看所有活动。Airflow scheduler 监控所有任务和 Dag,然后在任务实例的依赖性完成后触发它们。
可以去 http://localhost:8080/ 访问气流仪表盘。现在你已经准备好了!
气流仪表板
有向无环图
在 Airflow 中,DAG 是您想要运行的所有任务的集合,以反映它们的关系和依赖性的方式组织。DAG 是在 Python 脚本中定义的,它将 DAG 结构(任务及其依赖项)表示为代码。
我们将要创建的 dag 的代码可以在https://github.com/jkachhadia/airflowdags101获得
https://github.com/jkachhadia/airflowdags101
在本博客中使用之前,我们将使用这种方法来解释事情。
我们的第一只狗
让我们开始编码我们的第一个 dag,它将是一个自动数据管道,用于获取和存储用户在美国东部时间早上 7 点到 8 点之间发布的推文。
如果你正确地完成了上面的步骤,那么在你给出的气流路径中。您将已经创建了一些新文件和文件夹。如果你有类似 airflow.cfg 的文件,那么你就可以开始了。如果没有名为“dags”的文件夹,可以在那里创建一个。
让我们在 dags 文件夹中创建一个名为“firstdag.py”的文件,并开始处理代码。首先,我们将进口所有我们需要的东西,作为这个项目的一部分。
你需要的所有进口商品
厉害!让我们开始编写一些代码,基本上获得我们的 dag 所在的目录和根目录,如果我们需要与本地文件系统进行交互,在我们的情况下,我们需要这样做。
我们现在已经整理出了根目录和应用程序目录。让我们以一种标准的约定来命名我们的 dag,这样我们只需要知道它的名字就可以知道它的含义。我们将把它命名为“tweets_morning_ml_daily”。
连接
现在,我们将利用连接,在其中您可以存储 JSONs 以及一些您不想公开的可变信息,因为它是特定于这个 dag 的。我们将从这个连接中获取代码中使用的所有配置变量。在这里可以找到连接的很多其他用法。
dag 名称和连接名称
现在,让我们从气流 UI 创建连接。
点击管理>连接
然后,我们可以创建一个新的连接,如下所示:
我们将 twitter 的 api 调用信息存储在这里,这样,如果您想更改查询或从 twitter API 获取的字段,就不必更改代码。
现在,我们将编写一个函数,基本上使用来自 airflow 的 BaseHook 来获取这个连接存储的 JSON。
获取连接配置的函数
变量
我们现在将使用气流变量来存储可以由多个 Dag 共享的信息,例如 twitter 的 API 的帐户令牌。你也可以从https://developer.twitter.com/en那里得到你的不记名令牌。很容易应用并让开发者访问 twitter 的 API。
现在让我们从 Admin>Variables 为 API 令牌创建一个变量
变量中的键和值对
我们将使用已经编写好的函数来获取连接变量和泛型变量,并创建一个字典来存储所有内容,这样就可以很容易地传递函数或任务。
连接和变量
让我们从一些将进入我们的气流任务的代码开始。我们将为这段将被多次使用的代码创建函数,就像包装 twitter API 的 get 请求一样。
现在,如果我们想一想,我们的数据管道将有多少个主要步骤?然后,首先是收集数据,其次是以 JSON 的形式存储/转储数据。
让我们开始编写第一步的代码,这基本上是使用上面已经以字典的形式定义的变量,进行 api 调用,收集数据并将其存储在一个列表中。
XComs
在这里,我们将使用 XComs 进行通信。一旦第一步将 tweets 信息存储在一个列表中,那么它将不得不将该信息放入一个 XCom 变量中,该变量可以在另一个任务中检索。因此,当下游任务之间需要通信时,就使用 XComs。
第一步
最后,您会看到我们如何将变量推入 Xcom 变量,我们将在后面的任务中使用该变量。你一定注意到了 ds 变量。这是气流在运行时提供的一个变量,还有其他一些与日期和时间相关的变量。
现在,我们将编写第二步,每天将 JSON 转储到一个特定的位置。此外,在 dags 文件夹之外,您可以创建一个转储文件夹,dag 可以在其中每天转储文件。
我们现在将开始定义 dag 及其结构,从默认参数开始,其中我们有开始日期和所有者,但我们还可以有更多,您可以在文档中查看。你将开始日期设置为两天前,这样,当你轻推它时,它就会自动开始。
让我们用计划间隔和标准超时来定义 dag。Schedule interval 是一个 cron 表达式,从自动化的角度来看,它将为气流调度程序提供关于 dag 需要运行的频率和时间的信息。
现在,我们必须定义所有任务并将其附加到 dag。我们将在开始和结束任务中使用虚拟操作符,它不会做任何事情。对于其他两个任务,我们将使用 python 操作符,这将是我们在上面创建的函数,其中我们也传递我们首先创建的 params 字典。
您可以在这里获得更多关于气流概念的信息,这将提供更多关于我们所用变量的见解。重要的是 depends_on_past,这意味着它依赖于前一次运行的任务执行,python_callable 是要调用的函数,如果有函数变量,则可以在 python 运算符内的参数 op_kwargs 中定义这些变量。
现在,我们将创建所有这些任务的气流,在气流中有许多方法可以做到这一点,但我更喜欢这一个,因为它不那么混乱。
写完这段代码,当你保存它的时候,你应该准备好了!等待几分钟,让 scheduler 选择任务,然后它应该会显示在仪表板中。
一旦它显示出来,你点击它。您将会在 dag 结构中看到类似这样的内容。
一旦你轻推你的 dag 'ON ',它就会启动引擎,从今天开始运行。您可以在定义 dag 以从 start_date 开始时添加 catch_up=True。
在它开始运行之后。您将看到任务经历不同的阶段。如果你点击一个任务,你会看到下面弹出,可以点击日志。
让我向您展示执行后第一个和第二个任务的日志。
第一个任务的日志
第二个任务的日志
在我们的转储文件夹中输出 JSON
Wohoo!我们在气流中创造了第一个 dag。你可以调整很多东西,气流在做很多复杂的事情上很棒。
如果你想看到真实世界的气流例子,那么你可以看看照明,这是我在计算和数据科学中心工作的一个研究项目,我负责该项目的整个数据工程和 ML 基础设施。你可以在这里查看详细的博客。
</2020-us-elections-how-we-use-data-science-to-unfold-ad-strategies-of-biden-and-trump-with-200095dd369a>
照亮 2020 的气流仪表板
类似地,您可以部署模型并在您的管道中使用它。气流是可怕的,现在是任何数据科学家、数据工程师或 ML 工程师的工具箱中的一个好工具。
在 gmail dot com 的[我的名字][我的名字]上提问,或者在的 LinkedIn 上联系。
半导体制程良率中的数据科学
原文:https://towardsdatascience.com/data-science-in-semiconductor-process-yield-a6da6a37253c?source=collection_archive---------5-----------------------
使用机器学习提高晶圆厂产量和盈利能力
劳拉·奥克尔在 Unsplash 上的照片
在疫情的这个阶段,对各种半导体芯片的需求激增,半导体工厂正在努力跟上步伐。传统 IC 客户现在正与新计算应用(如人工智能和自动驾驶)的需求竞争,以制造他们的定制设计晶片。不幸的是,增加半导体工厂的晶圆产能以应对新一波的需求是非常昂贵和具有挑战性的。一旦决定增加晶圆厂的产能,可能需要几个月的时间来购买新工具,将它们安装到晶圆厂,并使它们符合生产条件。
在这种情况下,更好的选择是提高产量,即每个晶片中“好”芯片与总芯片的比率,以从现有产能中获得更多芯片。提高产量也会直接增加晶圆厂的利润率,即使产量的微小提高也会带来巨大的利润——所以,让我们提高芯片产量吧!说起来容易做起来难。
在数据科学在半导体行业兴起之前,设备工程师会有条不紊地搜索可用数据,寻找任何线索或与产量的相关性。作为人类,我们喜欢结果可以归因于单一因素的问题。我们希望产量和一个特定的工艺参数有很强的相关性——薄膜沉积速率、蚀刻速率、光刻尺寸公差或数以千计的工艺参数。不幸的是,这种情况几乎从未出现过。用于制造现代半导体芯片的工艺不断相互结合。
需要新型器件和产量工程师来处理不断增加的工艺复杂性和计量数据量——对器件物理和制造工艺的深刻理解必须与数据科学工具相结合,才能找到真正的产量触发因素。
变量重叠
为了帮助理解这个问题,考虑一个铝布线层。在这个简单的过程中,我们有一个铝沉积步骤,光刻图案,等离子体蚀刻,以确定特征,然后清洗。如果我们有一个简单的产量故障,如邻*的线路短路,两个最有可能的候选是铝沉积得比预期的厚(阻止蚀刻完全分离线路),或蚀刻速度比预期的慢。然而,在大多数过程控制的工厂中,最常见的答案是两个过程都在统计过程控制(SPC)系统的范围内,因此在可接受的范围内运行。那么是什么原因呢?在这种情况下,沉积比正常情况下厚一点点和蚀刻比正常情况下慢一点点的汇合可能成为产量杀手。提取变量的哪个组合导致了失败,这是一个为机器学习而设置的完美问题。事实上,如果我们的问题像这个铝布线案例一样简单,我们就相当幸运了——它通常会变得更糟。
由 Unsplash 上的 Maxence Pira 拍摄的照片
考虑在高级节点(16 纳米或更低)工艺上运行的新 IC 设计。像电路短路或电路开路这样的物理故障很简单。然而,由于电路时序路径阻止芯片执行其期望的功能,器件可能无法让步。也许晶体管的导通电压没有达到目标?可能结电容高,增加 RC 积,引入延迟?在一个包含数百个工艺步骤的半导体工艺流程中,我们如何找到根本原因?
行动(或活动、袭击)计划
数据科学方法的好处是能够同时评估许多变量的影响。在这种情况下,我们可以引入四种主要类型的变量:
- :在晶圆片加工过程中对晶圆片进行的物理测量,包括薄膜厚度和密度、光刻尺寸精度和对准、污染物颗粒缺陷等。
- 生产线末端电气测试 :切割前,生产线末端测试的离散划线设备(印刷在芯片之间的街道上的设备)的数据。scribe 中的各个器件旨在梳理出某些工艺依赖性,并提供独特的工艺见解(如开尔文接触电阻)。
- 工具工艺认证运行 :工具定期在可直接测量的测试晶圆上运行一套工艺(与生产工艺相同或非常相似)。诸如沉积速率、蚀刻速率或不均匀性的结果在统计过程控制(SPC)系统中被跟踪,并具有相关的日期戳。
- 产品电路性能 :根据芯片和询问芯片所需的测试设备类型,在生产线末端(切割前)、切割后或后封装时对产品芯片进行测试。无论如何,这种性能或产量是我们试图优化的因变量。这可以基于通过/失败标准(分类)、性能宁滨(也称为分类)或原始性能(回归)。
将所有四种变量类型结合使用,使工程师能够获得结果(测量的性能)并深入到物理根本原因,使工程师能够通过工艺工具调整直接影响产量。
偏移与优化
下一步去哪里真的取决于我们的主要目标是什么。给定的晶圆或批次的芯片成品率是否大幅下降?在这种情况下,我们知道无论发生什么,都发生在晶圆级。当我们玩侦探游戏时,这大大简化了我们的数据准备过程。在这里,我们正在寻找晶圆级变量的变化,这意味着我们可以按晶圆对所有四种变量类型取*均值,并且仍然找到确凿的证据。使用类似于插入符号 (R)中的varImp()
或 Scikit-learn (Python)中的feature_importances_
这样的函数进行简单的检查,可以快速洞察哪些变量对产量有直接影响。
相反,如果我们有一个相当稳定的工艺,但每个晶片上只有 70%的芯片是功能性的(或有足够高的性能可以出售),我们就有机会进行优化。从更高的层次来看,故障芯片是随机分布在整个晶片上,还是全部集中在晶片的一个物理区域?仅这一点就可以告诉我们,故障是基于缺陷(如粒子在工艺过程中落在晶片上),还是基于工艺不均匀性,这使我们能够过滤许多潜在的变量。
需要注意的是,晶圆级工艺往往具有独特的非均匀性特征。许多将是放射状的,但梯度轮廓是常见的,甚至可以出现草帽形轮廓。这些工具流程概况如何与我们的产量相匹配是一个极好的工具。但是如果多个过程重叠,人眼只能分辨出这么多,这又是数据科学的拯救。
作者照片-常见晶圆级工艺简介
然而,在此之前,我们还要为晶圆级产量工程做更多的数据准备工作。虽然我们可能有与每个产品芯片相关的线尾划线测试数据和计量数据,但要找到与工具鉴定(也称“qual”)数据的类似关联是很困难的,因为这些数据通常是在具有均匀分布的 9、13 或 39 点径向坐标图的未构图晶片上测量的。对于我们的数据,我们需要将每个芯片映射到物理上最接*的测量值,这通常包括以下步骤:
- 在我们的 qual 数据中,我们将(半径,θ)坐标转换为(x,y)笛卡尔坐标,并确保数据收集日期采用正确的
datetime
格式。 - 在我们的产品数据集中填入批次通过的处理日期/时间,每个处理都有相关的质量数据。
- 对于给定的批次/晶圆,我们将迭代我们的 qual 数据以过滤到具有最接*可能日期的运行,并找到最接*产品芯片坐标的测量。
一旦我们的数据以这种方式结合起来,我们就有了一个内容非常丰富的变量数据集,我们可以自动寻找任何变量和因变量(产品芯片性能)之间简单的 1:1 相关性。然而,要真正深入到变量之间的相互联系,我们需要深入到创建机器学习模型。
系统模型化
在这一步中,目标不是创建最高精度的模型,而是创建一个能够合理预测产量,并且产量工程师能够轻松解释的模型。在这里,我们将坚持像决策树,线性/逻辑回归,套索回归,或朴素贝叶斯算法。一旦我们找到了合适的算法,我们就可以深入到可视化中,了解我们的模型如何“思考”并推动工厂的行动以提高产量。
预测产量
下一个飞跃来自数据科学的预测能力。如果我们能在晶圆片完成加工之前预测其产量,会怎么样?这种信息可以促使利益相关者做出重要的批次决策,例如:
- 触发返工过程(恢复并重复某个步骤)
- 向客户提供一份里程碑式的报告,说明很多产品都处于良好状态
- 报废一批以减少损失并防止将来在“报废”的一批上使用工具
- 启动一个“补充”批次来替换低产量批次,以最大限度地减少向客户交付的延迟。
与产量提高步骤不同,我们在这里寻求尽可能精确的模型。可解释性是一个遥远的“美好事物”,因此我们能够探索更广泛的模型。一旦我们选定了一个模型,我们还可以使用变量重要性和递归特征消除等工具来查看哪些数据真正推动了我们的产量检测能力。有了这些数据,我们可以消除一些现有的计量数据收集,以进一步降低成本和缩短流程周期。
有了一个足够好的模型,我们还可以进行虚拟过程开窗——我们可以改变一个过程的可接受 SPC 范围,以了解扩大或收紧控制限制如何影响产量。反复进行,晶圆厂中每个工艺的控制极限可以直接与晶圆产量联系起来。这影响了预防性维护的执行方式、新工具引入生产线的方式,甚至质量程序的频率,所有这些都会影响晶圆厂的成本。
所以我们有它!利用数据科学的力量,我们可以重塑我们调查产量偏差的方式,提高整体生产线产量,并在晶圆完成加工之前预测晶圆产量。在了解制造物理的半导体器件工程师的手中,这些预测建模能力对晶片工艺产量和制造利润有着巨大的影响。感谢阅读!
云中的数据科学
原文:https://towardsdatascience.com/data-science-in-the-cloud-bcdee3c519e7?source=collection_archive---------35-----------------------
数据科学家云服务简介
作者图片
什么是云?
云听起来像一个神奇的地方,数据生活在现实的结构中。这是一个漂亮的品牌,因为现实远没有那么令人兴奋。大多数人都听说过数据中心,大型科技公司使用的装满计算机(俗称服务器)的仓库。许多人忽略的是,云和数据中心是一体的。当你将照片保存到云中时,你是在将它们发送到一个数据中心,存储在那里的一个服务器上。当你想看你的照片时,你的手机会向数据中心发送一个请求,让数据中心将照片发回给你。同样,如果您想计算下班回家的最快路线,您可以从手机向数据中心发送计算请求。数据中心存储了所有的地图数据,处理能力比你的手机强得多,因此它可以快速进行计算,并将结果发送回你的手机。这就是当你失去手机信号时,你的地图应用程序无法计算新路线的原因。
长话短说,云是可以存储数据和执行强大计算的计算机的集合。这应该会让数据科学家们竖起耳朵。
为什么使用云?
云吸引数据科学家有几个原因。
*计算能力:*当你在训练深度神经网络时,你需要很强的处理能力,这样你的模型才能在合理的时间内运行。这很容易超过您的本地计算机,但一个充满针对这些类型的计算优化的强大 GPU(图形处理单元)的数据中心可能会快速完成这一工作。
*存储数据的集中位置:*数据科学家面临的主要挑战之一是聚合数据以用于分析。如果你用云来存储你所有的数据,这个问题就大大简化了。任何计算机都可以在任何地方访问任何数据。当您从许多数据源(咳咳物联网)收集数据时,这一点尤其重要。使用数据湖或数据仓库等架构,聪明的数据科学家也可以将看似不相关的业务数据纳入他们的分析中。
*大数据:*我们生活在大数据时代。正如他们所说,数据是新的熏肉。要存储所有这些,你需要很多硬件。如果您想要备份,您需要两倍的硬件。将所有这些数据下载到您的本地计算机上来运行计算可能不是一个选项。在云中工作可以避免这种情况。
*IT 支持/开发运维/服务器管理:*如果您使用本地服务器解决了上述一些问题,您的数据团队将需要 IT 支持来管理这些服务器。处理网络问题可能超出了您的数据团队的专业范围。云提供商通常可以选择为您处理具体的工作。
*易于共享的结果和应用:*将分析结果存储在云中可以让人们更容易贡献或复制结果,因为他们将始终在相同的环境中工作。您还可以将结果发布为仪表板或网页,便于企业领导访问或与第三方共享。您还可以部署持续运行的应用程序,这比部署应用程序让您的队友在他们自己的本地计算机上运行要容易得多,并且提供了持续运行计算的能力。
我如何使用云?
数据团队可以通过几种方式利用云,从最简单到最复杂。
Google Colab :云托管笔记本电脑,如 Google Colab,允许数据团队轻松合作进行分析,并利用云提供商提供的计算能力。
云托管数据科学服务:几家开源数据科学公司(如 RStudio)通过提供服务帮助数据团队在云上托管工作来赚钱。使用这种方法提供了云托管提供商的所有优势,但数据团队可以专注于他们的分析,而不是服务器管理的混乱细节。
向云提供商部署应用:你可以随时使用 AWS、GCP、微软 Azure 或其他公司的托管服务来部署你自己的应用。这将需要某个人的“开发工作”,但这些提供商中的大多数都有有用的资源和支持,可以让数据团队跟上速度。
这对我意味着什么?
如果您发现自己抱怨计算机完成一项分析所花费的时间,或者您想要一种更好的方式在笔记本电脑上协作并共享结果,那么将您的工作流从笔记本电脑迁移到云是值得研究的。构建一个仪表板并将其部署到 RStudio 云,运行 Google Colab 笔记本,或者从头构建一个托管在 AWS 上的应用程序,都可以真正改变您的数据体验。此外,如果你想大规模部署你的产品,你需要熟悉云服务,所以你可能想现在就开始试水。
数据科学访谈深度挖掘:交叉熵损失
原文:https://towardsdatascience.com/data-science-interview-deep-dive-cross-entropy-loss-b10355eb4ace?source=collection_archive---------19-----------------------
什么使它成为事实上的多类分类器损失函数
要在重要的数据科学/机器学习面试中胜出,有很多东西需要学习和掌握。本文是一系列文章的一部分,这些文章试图通过介绍结构、使用可视化解释和保持事物的相关性来使准备过程变得更容易和不那么令人生畏。
照片来自 Pixabay
动机
T 正确选择损失函数对于成功训练机器学习模型至关重要。因此,关于他们的问题通常会在面试过程中被招聘人员提出来。问题可能来自多个方面和角度,但只要你抓住核心概念,你会发现它们不会是太大的挑战。交叉熵损失是多类别分类问题中最基本和最广泛使用的损失函数之一。为什么这么受欢迎?核心好处是什么?如何正确应用它们?
让我们开始吧。
用一分钟解释一下
照片由 Tim Gouw 在 Unsplash 上拍摄
在面试中,你经常会被要求在一分钟内解释一个概念。这是为了测试你简洁地表达复杂概念的能力。毕竟只有你完全掌握了,才能简洁明了的解释,对吧?所以我们先从 **TR 开始;博士:
交叉熵损失是一种广泛用于多类分类问题的损失函数。它建立在交叉熵的概念上,交叉熵是两个概率向量的度量(通常其中一个是数据集中的热点编码标签)。当距离目标太远时,用对数曲线惩罚预测的误差(当距离变大时损失急剧增加,类似于*方误差)。交叉熵损失通常与软最大激活函数一起使用。
我们将把这四个句子的每一个展开成单独的部分,以便深入探讨。然后我们可以再看一遍,看看我们的理解有没有提高。
用在哪里?
T 交叉熵损失函数通常被认为是多类别分类的事实损失函数,其中模型必须预测许多类别中的一个。例如,大多数图像识别模型使用软最大激活函数以及交叉熵损失函数来预测图像属于哪个类别。这里值得一提的多类分类的一个子集是二元分类问题,它也使用交叉熵损失函数。二元分类模型需要预测目标是 0 还是 1 ,并且实际上是多标签分类问题的基础,为此我们通过将每个类别的二元交叉熵损失加在一起来计算损失。
因此,简而言之,交叉熵损失用于:
多类别分类
二元分类
多标签分类
交叉熵,一步一步解释的直觉
由杰斯温·托马斯在 Unsplash 上拍摄的照片
要有一个易于消化的交叉熵的直觉,最好的办法是遵循这样的逻辑路线:
惊奇 ➡️ 熵 ️ ➡️ ️ 交叉熵 ➡️ 交叉熵损失函数
令人惊讶的
简单地说,惊奇是你看到结果时有多惊讶。如果我们进入一个森林试图找出我们遇到的第一个动物,一只熊猫🐼会有很高的惊奇价值,因为我们不太可能看到一只,而一只鸟🐦可能很少有惊喜。见下文:
惊奇——作者创造的人物
熵
惊奇是衡量一个结果会给我们带来怎样的惊喜的好方法。如果我们有一个随机事件,它有多种可能的结果,那么我们可以很容易地计算出我们对这个随机事件的惊讶程度,方法是将每个结果的惊讶程度和概率相乘,并将它们加在一起。结果和你猜的一样,是 熵 。见下文:
熵——作者创造的图形
关于信息熵概念的更深入的解释,请看这个视频:
信息熵
交叉熵
现在,如果我们知道每种结果的概率,熵可以很容易地计算出来。如果我们不知道确切的数字,但只是猜测(或预测概率)呢?衡量我们有多惊讶的方法是计算 交叉熵 值,将一个结果的真实概率乘以我们预测或猜测的惊讶值。举一个极端的例子,我们有一个装了子弹的硬币,它有 99%的几率出现正面和反面,但是我们认为这是一个装了子弹的硬币,它有 99%的几率出现反面和反面。交叉熵将会非常大,因为大多数时候我们会非常“惊讶”(我们认为它总是给我们尾巴,但总是给我们头)。这里需要注意的一点是,即使我们的概率预测没有那么远,交叉熵仍然总是大于熵(只有当你完美预测时才相等)。
交叉熵——作者创造的图形
请注意,为每个标签计算的惊喜是基于预测值的概率,而不是事实。毕竟,你有多惊讶取决于你对结果的看法。Quora 里的这个回答对交叉熵做了更详细的介绍。
交叉熵损失
一旦我们理解了交叉熵是什么,我们就很容易理解交叉熵损失。损失函数计算我们的模型预测的概率向量和基础事实(目标变量,通常以独热编码向量的形式)之间的交叉熵值。
这里,预测的概率向量通常来自 softmax 激活函数,并且目标(基础事实)向量是一个独热编码向量。见下图:
交叉熵损失—由作者创建的图表
与正常交叉熵相比,唯一的区别是,通常对于多标签分类数据集,目标是一次性编码的,这意味着只有一个标签是真的。所以交叉熵损失只关心这个特殊标签的惊喜。然而,情况并非总是如此。像 Mixup 和标签*滑这样的最新技术已经生成了非一键编码的目标概率向量,然而交叉熵在这种情况下仍然完美地工作!
数学时间,大家都来算一算!
在 Unsplash 上拍摄的 ThisisEngineering RAEng
W 抛开直觉,我们可以更深入地钻研数学,并计算出所有这些。我们将尝试使用一些示例来指导我们完成计算过程。
惊喜:
惊奇——作者创造的人物
比方说我们遇到熊猫的几率🐼森林中的是 0.001 ,那么令人惊奇的是:
熵
熵——作者创造的图形
现在,如果我们真的遇到三种动物,【熊猫,鸟,狗】,概率为**【0.2,0.3,0.5】**,这个事件的熵是:
交叉熵(损失)
交叉熵——作者创造的图形
交叉熵将预测的概率与地面真实情况进行比较,因此假设我们有一个来自 SOFTMAX 激活函数的预测向量,用于一幅图像:【熊猫,鸟,狗】->【0.1,0.2,0.7】。这意味着模型非常确信(70%)这是一只狗,并且它也被标记为一只狗,这意味着地面真实向量是:【0,0,1】。
作者创造的形象
从上面的计算可以看出,真正重要的是正确的类,不管我们有没有大概率预测。
二元交叉熵
交叉熵损失的一个特例是二进制交叉熵损失,其中只存在两个类别。可以通过下面的公式进行计算:
二元交叉熵损失——由作者创建的图表
而' p0 如果图像是猫,则为 1,否则为 0,' q0 '是图像是否是猫的预测概率。
为什么交叉熵
现在我们对交叉熵是什么以及如何计算它有了很好的理解。百万美元的问题来了:
为什么选择交叉熵作为多类分类的代价函数?
为了回答这个问题,我们可以看看在我们减去目标标签和该标签的预测概率时,如果我们不使用交叉熵损失的情况。由于我们对 softmax 激活函数的预测介于 0 和 1 之间,因此损耗也将介于 0 和 1 之间。这是非常有限的。我们希望在预测关闭时惩罚模型,因此最好有一个更大的范围,例如对数函数。让我们看看真实标签= 1 时的对数损失图。
作者创造的形象
当模型预测正确,逼* 1 时,损失相当小,逼* 0。但是预测的概率离 1 越远,损失越大,接*正无穷大。这显然更有效。
另外需要注意的是cross-entropy(a,b)
的梯度实际上是softmax(a)-b
,意味着梯度与激活输出的线性,这将使训练*滑。你可以在这篇漂亮的文章中找到梯度计算。
TL;博士,再来一次
为了提醒你,我在下面放了“一分钟营销”来提醒你。希望现在对它们的含义有了更深的理解,它会对你更有意义。
交叉熵损失是一种广泛用于多类分类问题的损失函数。它建立在交叉熵的概念上,交叉熵是两个概率向量的度量(通常其中一个是训练中的热点编码标签)。当距离对数曲线的目标太远时,它惩罚预测的误差(当距离变大时损失急剧增加,类似于*方误差)。交叉熵损失通常与软最大激活函数一起使用。
考验你的知识!
Nguyen Dang Hoang Nhu 在 Unsplash 上拍摄的照片
在你离开之前,请允许我给你提几个模拟问题。它有望测试你是否掌握了本文的所有内容。即使你这样做了,它也能起到记忆更新的作用:
- 熵是什么?什么是交叉熵?他们之间是什么关系?
- 交叉熵损失函数在机器学习/深度学习中的哪些领域/模型应用广泛?为什么?
- 交叉熵损失函数的数学特征是什么?它对模特培训有什么好处?
- 对于目标向量[1,0,0]上的概率预测向量为[0.7,0.2,0.1],计算交叉熵损失。
- 多标签交叉熵计算怎么做?和多类单标签分类问题有什么不同?
觉得这篇文章有用?在 Medium 上关注我(李立伟)或者你可以在 Twitter @lymenlee 或者我的博客网站【wayofnumbers.com】T4 上找到我。你也可以看看我下面最受欢迎的文章!
数据科学越来越面向工具。会不会扼杀背后的科学?
原文:https://towardsdatascience.com/data-science-is-becoming-more-tool-oriented-will-it-kill-the-science-behind-9026b451bd9b?source=collection_archive---------17-----------------------
不要越过必需品变成负担的临界点。
丹-克里斯蒂安·pădureț在 Unsplash 上拍摄的照片
数据科学的目标就是从数据中创造价值。实现这一目标的主要组成部分是:
- 用数据解决的问题
- 数据(显然)
- 探索和理解数据的能力
- 工具
我所说的工具是指在数据科学工作流程中被证明有用的整套软件工具。
Excel 是应用广泛的一种。Python 是数据科学中最常用的编程语言。SQL 是我们用来管理关系数据库的。Tableau 允许我们创建令人惊叹的仪表板。数据块使我们能够处理大量的数据。
针对特定任务和操作的更具体的工具还有很多。
越来越多的软件工具和软件包不断推出。我认为创建这样的工具主要有三个动机:
- 我们处理的数据量不断增加,因此新工具应运而生,以更高效地处理大规模数据
- 为了简化日常操作
- 行业内的竞争。例如,AWS、微软和谷歌正在竞争从“云”馅饼中获得更大的份额。
很明显,我们需要软件工具来执行数据科学。它们使我们能够将想法转化为行动。然而,不断增加的软件工具和软件包有时会让我感到疲惫不堪。
照片由亚当·温格在 Unsplash 上拍摄
在某些情况下,一组特定工具的性能没有显著差异。一个公司可以只喜欢一个而不喜欢另一个。因此,我们需要学习哪种工具只取决于我们工作的公司。
无论我们使用什么工具,数据科学的基础都是一样的。这些产品基于相同的原理和理论。统计学、贝叶斯定理、线性回归和相关性不会因我们使用的工具而改变。
但是,我们使用特定工具的方式可能与其他工具有很大不同,因此我们需要花一些时间来学习它。
时间是最宝贵的资源,而且是有限的。即使我们有学习新工具的动机,我们也可能没有足够的时间。
假设我工作的一部分是创建仪表板,我在目前的公司使用 Tableau。我因为某种原因换了工作,我的新公司更喜欢 Power BI。
在这种情况下,学习 Power BI 并没有给我的仪表板创建技能增加显著的价值。我刚刚成为一名员工,可以用两种不同的工具执行相同的任务。
所以,我首先担心的是不能有效地利用时间。
我的另一个担忧是,你可以使用的工具数量可能被认为比你的数据科学知识更重要。这种情况导致对数据科学家的评估是基于工具知识,而不是科学。
如果出现这种情况,这将是一个严重的问题。软件工具就是用来将想法转化为行动或价值的。
这些想法来自数据科学家,他们融合了分析思维、创造力、统计和理论。如果数据科学家被迫学习尽可能多的工具,他们可能会忽略这一点。
由于有了高度先进的工具,他们会很快完成任务。然而,这不足以从数据中创造价值。
导致创造价值的首先是定义一个可以用数据解决的问题。一旦定义了问题并设计了解决方案,就需要工具来完成任务。
我想你会同意,没有问题和解决方案,高级软件工具就没有用。
总而言之,我们绝对需要软件工具和软件包来执行数据科学。它们使我们能够快速有效地处理大量数据。
然而,我觉得工具的数量可能会超过必要的。学习各种工具的要求给数据科学家带来了额外的压力。
花费大量时间学习新工具可能会导致数据科学家对真正重要的东西不够重视。
成为 Medium 会员可以在 Medium 上访问无限数量的文章。
https://sonery.medium.com/membership
感谢您的阅读。如果您有任何反馈,请告诉我。
数据科学不会在 10 年内灭绝,你的技能可能会
原文:https://towardsdatascience.com/data-science-is-not-becoming-extinct-in-10-years-your-skills-might-aed618dd0c91?source=collection_archive---------2-----------------------
意见
数据科学存在的 4 个原因,以及你需要做些什么来确保你的技能满足需求。
迈克尔·波德格在 Unsplash 上的照片
作为一个在数据科学领域工作了十多年的人,看到有人预言该领域将在 10 年内灭绝,令人沮丧。给出的典型理由是新兴的 AutoML 工具将如何消除从业者开发自己的算法的需要。
我发现这种观点特别令人沮丧,因为它阻止了初学者认真对待数据科学,从而在这方面出类拔萃。坦率地说,看到这种对一个需求只会进一步增长的领域的预言,对数据科学界是一种伤害!
为什么任何一个心智健全的人会把有限的时间和精力投入到学习一些很快就会灭绝的东西上呢?
让我告诉你一些事情。如果有一个领域是你最有机会真正退休的,那就是数据科学。我将给出数据科学不会很快灭绝的四个关键原因。我还会给你我的建议,以确保你在 10 年内站在数据科学的正确一边。
数据科学不会灭绝,但如果你跟不上它的步伐,你的技能可能会灭绝。让我们开始吧。
1。数据科学已经存在了几个世纪
先说理科。我不需要让你相信科学已经存在了几个世纪。科学的本质是从数据中学习。我们观察世界上的事情(收集数据),然后我们创建一个模型(传统上称为理论),可以总结和解释这些观察结果。我们创造这些模型来帮助我们解决问题。
数据科学的本质也恰恰如此。收集数据,通过创建模型从中学习,然后使用这些模型来解决问题。多年来,不同的学科已经开发并改进了几个这样的工具。根据该领域的关注点,不同的名称被用来描述这套工具和程序。目前最受关注的 术语 是数据科学。
然而,以前的时代和现在的区别在于数据量和我们可用的计算能力。当我们只有几个数据点和几个维度时,可以手动将它们写在纸上,并拟合一条直线(回归)或识别模式。现在,我们可以从多个来源(多特征)廉价地收集大量数据。当您拥有大量数据点和维度时,拟合一条直线(或聚类)是不可能的,也是不可行的。
如果收集数据,并开发模型来解释它的做法已经存在了几个世纪,为什么你认为它会在未来 10 年内灭绝?
如果有的话,我们将收集更多种类的数据,我们将需要新的方法来创造性地结合它们来解决问题。
2。开发模型是真实项目的一小部分
“自动化机器学习旗下的几个工具正在获得牵引力,其中一些可能会导致数据科学的民主化。然而,大多数这样的工具将有助于加速对 净化的 数据输入的不同算法的测试和实现。
但是将干净的数据放入模型的能力一点也不简单。
事实上,一些与数据科学相关的调查已经指出,任何数据科学家在收集和清理数据上花费的时间都不成比例。例如,Anaconda(数据科学家使用的领先发行版之一)的年度调查表明,数据科学家将 66%的时间用于数据加载、清理和可视化,仅将 23%的时间用于模型训练、选择和评分。我个人在外地工作十几年的经历也是类似的。
学习算法如何在引擎盖下工作并理解它们的细微差别一点也不简单,许多在线课程花时间解释这些是正确的。然而,这种对算法的关注只会造成一种错误的错觉,好像数据科学就是关于模型的。许多有经验的从业者开始看到以数据清理为代价的对模型的过度强调。吴恩达(该领域的领先专家)一直鼓励数据科学界转向以数据为中心的方法,而不是我们大多数人目前在数据科学项目中采用的以模型为中心的方法。在他的深度学习时事通讯中,他指出:
一个常见的笑话是,80%的机器学习实际上是数据清理,好像这是一个次要的任务。我的观点是,如果我们 80%的工作是数据准备,那么确保数据质量就是机器学习团队的重要工作。
像 Kaggle 这样的网站进一步加剧了这种情况,在这些网站上,参与者被提供干净的数据,任务被限制在开发不同的模型,目的是最大化预先确定的绩效指标。 (Kaggle 因其用途而令人敬畏!)
一个真实世界的项目处理几个问题,这些问题并不是从仔细清理的数据或定义的问题开始的。在大多数项目中,我们先验地不一定知道什么特性是相关的,多久收集一次数据,以及什么是需要回答的正确问题。欢迎来到现实世界!
新的自动化工具的出现将继续使不同模型的实现变得容易和容易。然而,它不能解决现实项目中更具挑战性的问题。许多这样的问题是依赖于上下文的,自动化还不成熟。
**3。**现实世界的数据科学项目需要迭代开发
也许是受数据科学炒作的驱使,我遇到过这样的情况,有人告诉我他们有数据,并希望我应用“数据科学”来解决他们的问题(这可能也没有明确定义)。我敢打赌,许多不是数据科学家的人认为它是某种魔法(一种工具,你可以使用它在一端输入数据,在另一端获得输出)。
远非如此,真正的项目都有需要权衡的取舍。这需要一个迭代的方法,首先部署一个初始模型,然后随着更多数据的收集,对性能进行监控,以便进一步改进。
任何部署的模型只有在按预期使用时才是有用的。这不能保证。需要有一个有技能的人来继续监控和诊断已部署模型的使用,并提出适当的解决方案来改进它。然而,监控部分不一定是自动化的,甚至是定量的。可能会发生你无法预料的非常意外和怪异的事情。
伦敦大都会面部识别系统
不久前,伦敦警察厅测试了一个实时面部识别系统。该系统有摄像头,可以扫描商场和公共广场上的人,提取各种面部特征,然后与观察名单上的嫌疑人进行比较。然后,系统会显示任何匹配,供官员审查,并决定是否需要阻止任何嫌疑人(在某些情况下,逮捕)。一份关于该系统运行的独立报告提出了重大关切,并强调了几个局限性。在 6 次试验中确定的 42 名嫌疑人中,只有 8 名(不足 19%)被证明是正确的匹配。
有许多记录在案的例子表明数据科学算法存在偏见,这使得它们不够完善,需要进一步开发。就目前情况来看,我们甚至还没有达到广泛部署和使用模型的阶段。因此,我们甚至没有足够的模型漂移或出错的用例来进一步自动化这样的工具。到目前为止,我们最好是在部署模型时识别问题(例如银行业、医疗保健、警务)。
这是最先进的技术。 我们开发并部署了模型,但结果证明它们是不充分的,不符合目的。我们现在所处的阶段只是看到了使用不合适的模型的早期后果。有什么自动化的解决方案来处理这个问题吗?没有!
即使是手动的,我们也在接受挑战!
4。数据科学之所以是科学是有原因的
这是我最喜欢的一点。*凡的、重复的、非认知需求的任务有自动化的风险已经有一段时间了。然而,这种破坏只会带来更多需要人类创造力和解决问题能力的工作。我们的记忆很差,但是我们人类在识别解决问题的模式方面非常出色。
“你的头脑是用来有想法的,而不是持有想法的。”大卫·艾伦
数据科学之所以是 科学 是有原因的。是为了解决问题。我们面临的问题,需要创造性的,巧妙的解决方案。这正是我们所擅长的,一项非常令人向往的技能。数据科学的使用案例只会越来越多。这仅仅是因为我们正在收集更多的数据,我们有更多的计算能力在小芯片上实现复杂的数学运算。
让我向你展示如今实现最知名的机器学习算法是多么可笑的琐碎。
假设您已经仔细清理了输入变量( X )和输出变量( Y ),准备进入模型。使用Scikit-learn(Python 中一个众所周知的开源机器学习库),我们可以用下面两行代码实现决策树:
**from** **sklearn** **import** tree
tree.DecisionTreeClassifier.fit(X,Y)
我们可以用下面两行代码实现支持向量机:
**from** **sklearn** **import** svm
svm.SVC.fit(X,y)
你看到模式了吗?我们所要做的就是改变函数名,这样你就有了模型。真正的数据科学家不会坐着从头开始重新实现这些算法。他们最终会使用业内成熟的库,如 Scikit-learn。
但是你真的认为大多数数据科学家都是这样做的,并因此而被雇佣吗?改变模型中的一个单词,点击 run 然后报告结果?不要!
然而,作为一名数据科学家,如果这就是你关注的全部,那么对这种技能的需求不久就会消失。
实现一个模型是大多数人都可以做的事情,如果他们知道工具的话,并且很容易让人们接受培训。困难的部分是:
- 知道何时使用某种工具
- 为什么某个工具表现不好
- 哪些步骤可能有助于提高绩效
- 在一个给定的问题中,什么样的权衡是重要的
- 将上述所有内容与总体目标联系起来的洞察力和能力
- 具备与领域专家交流的技能
前面提到的技能是通过在现实世界中富有挑战性的项目中工作而获得的。它们需要时间,而且学习过程对认知要求很高。然而,随着我们收集更多的数据,面对行业特有的挑战,面对即将到来的更多竞争,这些技能将变得越来越重要( 而不是 )!).
我上面列出的技能属于解决问题和创造力的永恒领域。这些技能将继续受到高度追捧,因为它们无法自动化。
最终想法
无论如何,你都应该有一个可以学习的工具,当你获得更多的经验时,你应该精通这个工具,并且理解它的来龙去脉。然而,确保你抓住机会,让你从事有挑战性的项目,在那里你可以锻炼你的创造力和解决问题的技能。
不用担心数据科学会很快灭绝。这种担心只会让你无法享受你的旅程,你会带着半心半意的信念接*这个领域。如果你相信这样的末日预言,你将无法利用有希望的机会,让你的技能停滞不前。事实上,你的需求将会消失!
“不管你认为你能,还是你认为你不能,你都是对的。”亨利福特
然而,如果你继续从事具有挑战性的数据科学项目(从数据收集到模型部署),10 年后你将站在这个领域的右边,你的需求只会增加!
选择权在你。🙂
https://ahmarshah.medium.com/membership
数据科学不是你唯一的职业选择。
原文:https://towardsdatascience.com/data-science-isnt-your-only-career-option-2b02787cca22?source=collection_archive---------0-----------------------
2021 年高薪数据相关职业细分
安妮·斯普拉特在 Unsplash 上的照片
我希望每次听到有人说他们想成为数据科学家时,我都能得到一分钱。
从计算机编程专业到机械工程专业毕业生,每个人都想打入数据科学行业。
这是可以理解的,因为这一领域承载着高薪和弹性工作时间的承诺。
然而,在数据行业还有许多其他不太受欢迎的职业选择,薪酬非常高。其中一些领域的发展速度甚至超过了数据科学。
在本文中,我将提供数据行业内不同职业选择的分类。
数据工程师
数据工程师是为数据科学家和分析师构建管道和准备数据基础设施的人。
数据工程是当今世界上发展最快的职业之一,在过去的一年中,对数据工程师的需求有了巨大的增长。
大中型公司开始雇用更多的数据工程师,因为这些公司需要一个框架来处理大量数据。
数据工程师的角色会一直存在。没有适当的数据管道,数据科学家就不可能运行查询和建立机器学习模型。
数据工程师是数据科学生命周期中最重要的部分,因为没有他们就不可能进入下一阶段。
想想您过去处理过的所有数据——以 csv 文件、Excel 表格或 MySQL 数据库的形式。您可能已经创建了可视化,构建了模型,或者对这些数据执行了一些分析。
现在,想象一下扩大规模。想象一下,处理一亿行用户数据,所有这些数据都是相互关联的。每当用户执行新的操作时,都需要更新这些数据。
这是数据工程师的工作。
数据工程师构建一个管道,能够在每次数据进来时收集、清理和转换这些数据。他们需要尽可能以最高效、最结构化的方式完成这项工作,以便数据科学家和分析师能够更轻松地根据需要提取数据。
数据工程师的日常工作技术性很强。要成为一名数据工程师,你需要具备很强的编程技能和数据库知识。你需要有一些数据结构的知识,并且理解分布式系统的基础。
数据分析师
数据分析师操纵数据以获得创造商业价值的洞察力。数据分析师经常与数据科学家混淆,因为他们的工作流有很多重叠,但他们之间有一个主要区别。
数据分析师不建立机器学习模型,也不做任何类型的预测建模。
例如,如果你是 Zara 的数据分析师,想要了解 H&M 的客户,你可以从 H&M 的社交媒体网站和客户评论页面提取数据。
然后,您可以进行分析,以了解通常在 H&M 购物的人群类型、围绕该品牌的总体公众情绪以及他们的营销策略。
这通常是在一些编程和可视化工具的帮助下完成的,因此数据分析师需要知道如何用至少一种语言进行编码,并且应该知道如何使用 Tableau 这样的工具。
数据分析师不需要了解机器学习或预测建模。
数据科学家
如果你正在阅读这篇文章,你可能已经知道数据科学家是做什么的。有可能,你是一个有抱负的数据科学家,试图评估他们在行业内的职业选择。
数据科学家做数据分析师所做的一切-他们提取和清理数据,预处理数据,构建可视化,并试图获得洞察力以创造商业价值。
唯一的区别是他们也做预测建模。他们建立机器学习模型。
让我们回到 H&M 分析的例子。数据科学家会做上面提到的所有事情来获得竞争对手的洞察力。然后,他们还将建立一个模型,预测最有可能停止从 H&M 购买并转向其他品牌的用户。
许多公司雇佣同一个人来扮演数据科学家和数据分析师的角色。
要成为一名数据科学家,你需要具备编程和可视化技能、统计知识以及构建预测模型的能力。
机器学习工程师
机器学习工程师是部署机器学习模型的人。此人将数据科学家构建的模型投入生产。
你以前建过音乐推荐系统吗?
给定唯一用户 id 的数据集,您需要确定应该推荐给每个人的艺术家和音乐。
这听起来像是一个数据科学家可以轻松完成的任务。
然而,想象一下在 Spotify 这样的音乐流媒体应用上部署这样的模型。
这就是事情变得复杂的地方。
Spotify 拥有数百万用户。每次新用户注册到应用程序时会发生什么?每次有人点新歌或新艺人听?
机器学习模型需要立即处理所有这些新数据,并为每个用户提出建议。
数据科学家构建的模型需要到达最终用户。需要部署这些模型,以便它能够实时处理用户数据并做出预测。
一个机器学习工程师做这个。他们对机器学习模型进行缩放,并将其投入生产,并确保模型可以被大量用户访问。
要成为一名机器学习工程师,需要具备很强的编程和软件工程技能。你还需要对机器学习框架有一个基本的了解。
结论
数据科学可能是目前最热门的数据相关职业,但它肯定不是唯一的。
数据产业只会越来越大。每天都有超过 1.14 万亿 MB 的数据生成。
随着行业的发展,对数据相关职业的需求也会增加。
为了利用这些数据,行业需要的不仅仅是数据科学技能。任何成功的数据科学项目都需要数据工程师、分析师和机器学习工程师。
这个故事最初发表于这里。
数据科学求职——什么对我有用?
原文:https://towardsdatascience.com/data-science-job-search-what-worked-for-me-c60a1df222b5?source=collection_archive---------37-----------------------
“从别人的错误中吸取教训。你不可能活得足够长,让它们都是你自己做的。”―埃莉诺·罗斯福。
纽约| Shravankumar Hiregoudar
根据来源,一些最受欢迎的工作搜索引擎网站是;
- 的确
- 领英
- 玻璃门
- 事业建设者
根据研究,LinkedIn 拥有超过 7.6 亿用户,月活跃用户超过 2.6 亿。该网站上列出了 2000 多万家公司和 2000 万个空缺职位,发现 87%的招聘人员经常使用 LinkedIn 并不奇怪。LinkedIn 和实际上是一起占据主导地位,每月有超过 2.5 亿的独立访问者。
但是,这些是完成工作的唯一*台吗?可能,不会。由于这些应用程序中的活跃用户数量很高,因此应用程序/作业比率也很高。我们的简历被招聘人员看到的机会变少了(但不是零)。
根据我的求职经验,我想分享一些不太受欢迎的技巧,以方便求职和获得面试。
此博客的索引:
1.天使列表
2.萧条的社区
3.LinkedIn 黑客
4.很少策划黑客
—在线状态
—行动项目
—连接
AngelList
AngelList 是一个面向初创公司、天使投资人和希望在初创公司工作的求职者的网站。一些对求职有用的特征是,
“赞助商签证”过滤器
对于在美国的国际学生来说,“担保签证”是一个节省时间的选项。启用此过滤器允许您向担保签证的公司申请。令人惊讶的是,我没有在其他任何网站上看到过这种滤镜。
AngelList 求职首页(截图)
招聘联系信息
工作详细信息包括描述、地点、工作类型(全职、兼职、实习)、签证赞助、预计/实际薪酬、所需经验以及招聘联系信息。
招聘联系信息将帮助你根据他/她在公司的角色定制你的简历和求职信。在申请之前,最好对公司和最*的工作和进展有所了解,这样你才能写一封好的求职信。在 AngelList 上申请职位后,我会在 LinkedIn 上搜索招聘联系人,介绍自己,表明我对这家公司的兴趣。这是一个非常有效的方法。
AngelList 应用页面(截图)
萧条的社区
2021 年将加入八个数据科学 Slack 社区(截图)
检查这些博客的各种松弛渠道;
- 2021 年将加入八个数据科学 Slack 社区
- 400 个 Slack 社区的完整列表
这些 slack 社区由数据爱好者、学生和专业人士组成。许多讨论围绕当前的技术、技术新闻、项目、出版物、聚会、事件等展开。这些社区也有与职业相关的频道,如:
- *简历审核:*你可以发布简历,相关领域的人会审核并提供反馈。一双新鲜的眼睛总是有帮助的。此外,该渠道由人力资源和人才团队人员组成,他们的意见很有价值。
- *工作机会:*这个渠道包含两类人,寻求者和给予者。如果你是求职者,写一份好的电梯推介,并提供你的联系方式。一般来说,如果他们的组织中有类似的机会,人们会做出反应。另一组人(雇主/ HR)发布职位详情,你可以直接联系他们。
LinkedIn 黑客
LinkedIn 每月有超过 2.6 亿活跃用户,它是联系雇主/人力资源的最佳媒介之一。
使用布尔搜索
布尔搜索可以节省时间。假设你想和雇佣数据科学家的人联系。使用布尔表达式(招聘或人力资源或人才)和(数据科学家或数据工程师)。这种搜索的结果比常规搜索 更准确
LinkedIn 上的布尔搜索(截图)
与招聘人员联系
用简短而有说服力的电梯间推介来传达连接请求。优化这个介绍,因为有字数限制。
一旦这种联系被正式接受,介绍你自己,多谈谈公司和这个领域。耐心等待回复,因为对方可能不会马上出现。请看看他们公司的招聘页面,列出一些职位。给出一个很好的解释,为什么你认为你很适合这个职位和公司。如果你没有得到任何回应,不要为难自己。提高你的推销技巧,联系更多的招聘人员。仅仅通过与招聘人员交谈,我就获得了许多面试机会。机会比网上申请高,但你必须超级耐心和坚持。对我来说,招聘人员的良好回应率是 1/30。
你可以找到很多这样的方法来增加你的机会,但主要的方法是坚持不懈,不断改进和定制你的简历以适应这个角色,并与尽可能多的人联系。
招聘激增,Glassdoor 的一个有用选项。瞄准那些公司,利用需求。
很少策划黑客
在线状态
当招聘人员在 LinkedIn/Indeed 中搜索相关关键词时,建立你的整体档案并提供你的技能和成就的可见性是至关重要的。实现这一点的一些简单方法是,
- 在 LinkedIn 上发布内容
- 参加活动和网络研讨会(与演讲者交流)
- 写博客并发布在社区/出版物上。
- 准备好强有力的电梯推销。
- 冷冰冰的邮件招聘人员。
行动项目
维护一个 Trello 板/ OneNote 来跟踪进度和任务。如果工作描述要求一个特定的工具/技术/语言,把它放在事物中,我可以学习并开始学习。
特雷罗策划示例(截图)
记录面试。写下你认为自己做对的三件事,以及在所有面试中你可以改进的三件事。它有助于理解失败。
在 Excel 上记录面试(截图)
一些建议:
- 不要把你的脚从油门上拿开。
- 如果事情对你不利,继续改善你的个人资料。
- 妥善处理压力(在 Trello 上写下来,当你处理压力时扔掉它们)
- 记录你的进步和失败。
- 每天听播客和网络研讨会。它让你在学习新东西的同时放松。
- 招聘人员信息列表
结论:
"选择人迹罕至的道路。"如果你只把 30%的精力和时间花在流行的求职网站(LinkedIn,实际上是 Glassdoor)上,并通过公司网站申请,那会有所帮助。
剩下的时间在 LinkedIn 和 Slack 社区上与人联系。尽可能多地阅读职位描述,了解需要改进的地方。这是一个充满压力的过程,但一旦你找到合适的人和公司,这一切都是值得的。祝你好运!
2021 年数据科学学习路线图
原文:https://towardsdatascience.com/data-science-learning-roadmap-for-2021-84f2ba09a44f?source=collection_archive---------3-----------------------
构建自己的学习轨道,掌握应用数据科学的艺术
高级数据科学路线图
虽然除了日期之外没有什么真正改变,但是新的一年让每个人都充满了重新开始的希望。增加一点计划,精心设想的目标和学习路线图是充满增长的一年的好方法。
这篇文章旨在通过为您提供一个学习框架、资源和项目想法来加强您的计划,以建立一个展示数据科学专业知识的可靠工作组合。
免责声明 : 定义的路线图是根据我在数据科学方面的一点经验准备的。这不是最重要的学习计划。路线图可能会改变,以更好地适应任何特定的领域/研究领域。此外,这是在牢记 python 的基础上创建的,因为我个人更喜欢使用 python。
什么是学习路线图?
以我的拙见,学习路线图是课程的延伸,它绘制了多层次的技能图,详细说明了你想要磨练哪些技能、你将如何衡量每个层次的结果,以及进一步掌握每项技能的技术。
我的路线图根据现实世界中应用程序的复杂性和通用性为每个级别分配权重。我还增加了初学者完成每个级别的练习/项目的估计时间。
下面是一个金字塔,按照复杂性和在行业中的应用顺序描述了高级技能。
按复杂程度排列的数据科学任务
这将标志着我们的框架的基础,我们现在必须深入到这些层中的每一层,以更具体、更可测量的细节来完成我们的框架。
具体性来自于在每个层次和资源中列出关键主题,以参考和掌握这些主题。
我们可以通过将学到的主题应用到一些现实世界的项目中来衡量它。我添加了一些项目想法、门户和*台,您可以用它们来衡量您的熟练程度。
Imp 注:一天一次,一天一个视频/博客/章节。它涵盖的范围很广。不要压倒自己!
让我们从底部开始,深入研究每一层。
1.编程或软件工程
(预计时间:2-3 个月)
首先,确保你有良好的编程技能。每一份数据科学的工作描述都会要求至少一种语言的编程专业知识。
具体话题包括:
- 常见的数据结构(数据类型、列表、字典、集合、元组)、编写函数、逻辑、控制流、搜索和排序算法、面向对象编程以及使用外部库。
- SQL 脚本:使用连接、聚合和子查询查询数据库
- 熟练使用终端、Git 中的版本控制和 GitHub
python 的资源:
- learnpython.org【免费】——初学者的免费资源。它从头开始涵盖了所有基本的编程主题。您将获得一个交互式 shell 来并排练习这些主题。
- Kaggle 【免费】——一个免费的交互式学习 python 的指南。这是一个简短的教程,涵盖了数据科学的所有重要主题。
- YouTube 上 freecodecamp 的 Python 课程【免费】——这是一个 5 小时的课程,你可以跟随它练习基本概念。
- 中级 python 【免费】Patrick 在 freecodecamp.org 推出的另一门免费课程。
- Coursera python for Everybody 专门化【fee】—这是一个专门化,包含初级概念、Python 数据结构、从 web 收集数据,以及使用数据库和 Python。
Git
- Git 指南和 GitHub 指南【免费】:完成这些教程和实验,以便更好地掌握版本控制。这将有助于您进一步为开源项目做出贡献。
SQL
- Kaggle 上的SQL 介绍和高级 SQL 。
- Datacamp 也提供许多关于 SQL 的课程。
通过解决大量问题和构建至少两个项目来衡量你的专业知识:
- 在这里解决很多问题: HackerRank (初学者友好型) LeetCode (解决轻松或中级问题)
- 从网站/API 端点提取数据——尝试从允许像*soundcloud.com 一样抓取的网页中提取数据,并编写 python 脚本。*将提取的数据存储到 CSV 文件或 SQL 数据库中。
- 像石头剪刀布,旋转纱线,刽子手,骰子滚动模拟器,井字游戏等游戏。
- 简单的网络应用程序,如 youtube 视频下载器、网站拦截器、音乐播放器、剽窃检查器等。
将这些项目部署在 GitHub 页面上,或者简单地将代码托管在 GitHub 上,以便学习使用 Git。
2.数据收集和争论(清理)
(预计时间:2 个月)
数据科学工作的一个重要部分是围绕着寻找可以帮助您解决问题的适当数据。你可以从不同的合法来源收集数据——抓取(如果网站允许的话)、API、数据库、公开可用的存储库。
一旦掌握了数据,分析师就会发现自己经常清理数据框架,处理多维数组,使用描述性/科学计算,操纵数据框架来汇总数据。
数据很少是干净的和格式化的,以便在“真实世界”中使用。Pandas 和 NumPy 是两个库,您可以随意使用它们从脏数据转换成可供分析的数据。
当你开始对编写 python 程序感到舒适时,可以开始学习使用库的课程,比如熊猫和 numpy 。
资源:
- 使用 pandas 进行数据操作【费用】datacamp 的一门互动课程,可以让你快速上手使用 pandas 进行数据操作。学习添加转换、聚合、子集化和索引数据帧。
- Kaggle pandas 教程【免费】——一个简短的实践教程,将带你了解常用的数据操作技巧。
- ka ggle 的数据清洗过程。
- 关于学习 Numpy、pandas、matplotlib、seaborn 的 freecodecamp 课程【免费】。
- Coursera 关于 Python 中数据科学介绍的课程【费用】——这是应用数据科学中第一门 Python 专业化的课程。
项目思路:
- 从您选择的网站/API(向公众开放)收集数据,收集数据,并将数据转换为将来自不同来源的数据存储到聚合文件或表(DB)中。示例 API 包括 TMDB 、 quandl 、 Twitter API 等。
- 挑选任何公开可用的数据集;在查看数据集和领域后,定义几组您想要探讨的问题。使用熊猫和 NumPy 讨论数据,找出这些问题的答案。
3.EDA、商业头脑和讲故事
(预计时间:2-3 个月)
下一个需要掌握的层次是数据分析和讲故事。从数据中提取洞察力,然后用简单的术语和可视化的方式与管理层交流,这是数据分析师的核心职责。
讲故事的部分要求你精通数据可视化和优秀的沟通技巧。
具体话题:
- 探索性数据分析 —定义问题、处理缺失值、异常值、格式化、过滤、单变量和多变量分析。
- 数据可视化—使用 matplotlib、seaborn 和 plotly 等库绘制数据。选择正确的图表来传达数据发现的知识。
- 开发仪表盘——相当多的分析师仅使用 Excel 或 Power BI 和 Tableau 等专业工具来构建仪表盘,汇总/汇总数据以帮助管理层做出决策。
- 商业敏锐度:努力提出正确的问题来回答,这些问题实际上是针对商业指标的。练习撰写清晰简洁的报告、博客和演示文稿。
资源:
- 数据分析职业轨迹 —由 datacamp 提供。一个很好的互动课程列表,你可以参考他们在教学中使用的真实案例研究。但是在完成专业化之后,一定要做自己的项目。
- 用 Python 进行数据分析——IBM 在 Coursera 上。本课程涵盖争论、探索性分析和使用 python 的简单模型开发。
- 数据可视化 —由 Kaggle 完成。另一个互动课程,让你练习所有常用的情节。
- 电子表格中的数据可视化、 Excel 、 Tableau 、Power BI——随便挑。
- 用这些书打造产品感和商业敏锐性: 衡量什么最重要解码征服破解 PM 面试 。
项目创意
- 对电影数据集进行探索性分析,找出制作盈利电影的公式(以此为灵感),使用来自医疗保健、金融、世卫组织、以往人口普查、电子商务等领域的数据集。
- 使用上面提供的资源构建仪表板(jupyter 笔记本、excel、 tableau )。
4.数据工程
(预计时间:4-5 个月)
数据工程通过让大数据驱动型公司的研究工程师和科学家可以访问干净的数据来支撑 R&D 团队。它本身就是一个领域,如果你想专注于问题的统计算法方面,你可以决定跳过这一部分。
数据工程师的职责包括构建高效的数据架构、简化数据处理和维护大规模数据系统。
工程师使用 Shell(CLI)、SQL 和 python/Scala 来创建 ETL 管道、自动化文件系统任务,并优化数据库操作以实现高性能。另一个关键技能是实现这些数据架构,这需要精通云服务提供商,如 AWS、Google Cloud Platform、Microsoft Azure 等。
资源:
- 【本书】安德烈·布尔科夫的《机器学习工程》——这本书捕捉了在生产环境中部署/监控模型的真实场景。
- uda city 的数据工程 nano degree——就已编辑的资源列表而言,我还没有遇到过结构更好的数据工程课程,可以从头开始涵盖所有主要概念。
- 数据工程简介—Data camp。这是一个很好的资源,可以帮助您开始使用大量工具构建 ETL 管道。
- GCP 专业化认证上的数据工程、大数据和机器学习 —你可以在 Coursera 上完成谷歌提供的专业化认证,该认证将带你浏览 GCP 提供的所有主要 API 和服务,以构建一个完整的数据解决方案。
要准备的项目创意/认证:
- AWS 认证机器学习(300 美元) —由 AWS 提供的监考考试,为您的个人资料增加一些权重(但不保证任何东西),需要对 AWS 服务和 ML 有相当的了解。
- 专业数据工程师—GCP 认证。这也是一个监考考试,评估您设计数据处理系统、在生产环境中部署机器学习模型、确保解决方案质量和自动化的能力。
5.应用统计学和数学
(预计时间:4-5 个月)
统计方法是数据科学的核心部分。几乎所有的数据科学面试都主要关注描述性和推断性统计。
人们开始编写机器学习算法时,并没有清楚地理解解释这些算法工作的底层统计和数学方法。
你应该关注的话题:
- 描述性统计——能够总结数据是强大的,但并不总是如此。了解描述数据的位置估计值(*均值、中值、众数、加权统计值、修剪统计值)和可变性。
- 推断统计 —设计假设检验、A/B 检验、定义业务指标、使用置信区间、p 值和 alpha 值分析收集的数据和实验结果。
- ****线性代数、单变量和多变量微积分理解机器学习中的损失函数、梯度和优化器。
资源:
- **[Book] 数据科学实用统计 **(强烈推荐)——所有重要统计方法的全面指南,以及简洁明了的应用程序/示例。
- 【书】裸统计 —一个非技术性但详细的指南,帮助理解统计对我们日常事件、运动、推荐系统以及更多实例的影响。
- Python 中的统计思维 —帮助你开始统计思维的基础课程。这门课还有第二部分。
- 描述性统计简介 —由 Udacity 提供。由视频讲座组成,解释广泛使用的位置和可变性测量(标准差、方差、中位数绝对偏差)。
- 推断统计学,Udacity —该课程由视频讲座组成,教育你从可能不会立即显而易见的数据中得出结论。它侧重于发展假设,并使用常见的测试,如 t 测试,方差分析和回归。
项目思路:
- 解答以上课程中提供的练习,然后尝试浏览大量公共数据集,以便应用这些统计概念。问一些问题,比如“在 0.05 的显著性水*上,是否有足够的证据证明波士顿产妇的*均年龄超过 25 岁。”
- 尝试与你的同龄人/小组/班级一起设计和运行小实验,让他们与应用程序互动或回答一个问题。一段时间后,一旦有了大量数据,就对收集的数据运行统计方法。这可能很难实现,但应该非常有趣。
- 分析股票价格、加密货币,并围绕*均回报或任何其他指标设计假设。确定你是否可以拒绝零假设,或者使用临界值拒绝零假设。
6.机器学习/人工智能
(预计时间:4-5 个月)
在仔细研究了前面提到的所有主要概念之后,您现在应该准备好开始使用这些有趣的 ML 算法了。
有三种主要的学习方式:
- 监督学习——包括回归和分类问题。学习简单线性回归、多元回归、多项式回归、朴素贝叶斯、逻辑回归、KNNs、树模型、集合模型。了解评估指标。
- 无监督学习 —聚类和降维是无监督学习的两个广泛应用。深入研究 PCA、K 均值聚类、层次聚类和高斯混合。
- 强化学习(可以跳过)——帮助你建立自我奖励系统。学习优化奖励,使用 TF-Agents 库,创建深度 Q 网络等。*
大多数 ML 项目需要你掌握一些我在博客中解释过的任务。
资源:
- [book] 用 Scikit-Learn、Keras 和 TensorFlow 实践机器学习,第二版——我一直最喜欢的机器学习书籍之一。不仅涵盖了理论上的数学推导,而且通过例子展示了算法的实现。你应该解答每章末尾的练习题。
- 吴恩达的机器学习课程——任何试图学习机器学习的人的入门课程。把手放下。
- 机器学习简介—ka ggle 的互动课程。
- 游戏人工智能和强化学习简介——Kaggle 上另一个关于强化学习的互动课程。
- 使用 Python 的监督学习——data camp 提供了大量可以学习的机器学习课程。所有这些都有 4 个小时长,可以帮助你对 ML 的应用有一个很好的理解。
深度学习专业化由 deeplearning.ai
对于那些有兴趣进一步深入深度学习的人,可以从完成 deeplearning.ai 和动手书提供的专业开始。从数据科学的角度来看,这并不重要,除非您计划解决计算机视觉或 NLP 问题。
深度学习应该有自己的专用路线图。我将用所有的基本概念来创建它
跟踪你的学习进度
https://www . sension . so/Data-Science-learning-tracker-0d3c 503280d 744 ACB 1b 862 a1 DDD 8344 e
我还为你创建了一个学习跟踪器。您可以根据自己的需要定制它,并使用它来跟踪您的进度,轻松访问所有资源和您的项目。
wiplane.com 威*学院
如果你觉得这有用,我已经策划了一个课程,为你提供数据科学& ML 的第一步。在过去的 3 个月里,我将这门课程变成了一门成熟的课程,为你的职业生涯打下坚实的基础
- 数据分析师
- 数据科学家
- ML 从业者/工程师
因此,我在这里向您介绍数据科学的 基础或 ML—学习数据科学和 ML 的第一步
这是一门全面而紧凑且负担得起的课程,不仅涵盖了谷歌推荐的所有基本要素、先决条件和准备工作,还解释了如何通过计算和编程(用 Python 语言)来使用每个概念。
不仅如此,我还会根据您的意见每月更新课程内容。
点击了解更多。
早鸟优惠!
我很高兴启动本课程的预售,因为我目前正在录制和编辑 2-3 个模块(15-20 个讲座)的最后部分。这些也将在 9 月的第一周上线。
抢早鸟优惠,有效期仅至 2021 年 8 月 30 日。
数据科学课程我们学得不够快
原文:https://towardsdatascience.com/data-science-lessons-were-not-learning-fast-enough-83ead4827735?source=collection_archive---------12-----------------------
商业科学
令人失望的是,新数据科学家犯的错误与专业人士犯的错误非常相似
NeONBRAND 在 Unsplash 上的照片
在过去的一年里,我有机会向许多学生介绍数据科学。在 ESCP教授大数据 MBA 课程和与都灵理工大学的学生合作开发一种算法来预测时尚趋势,作为 CLIK(连接实验室和创新厨房)T11 商业挑战的一部分,我已经能够与学生分享我们所做的事情,否则他们可能不会考虑它的价值。看到他们理解为什么数据科学是未来令人欣慰。
在这个过程中,我越来越适应人们在应用、开发和使用数据科学时所犯的错误类型。有时这些纯粹是技术错误,但更多的时候,这些错误是由于对我们如何最好地利用越来越多的海量数据产生了更深刻的误解。
当你开发一个算法时,错误是正常的,甚至是可取的。你从这些错误中学习,创造出更好的最终产品。作为一名学生或新的数据科学家,错误对于培养技能至关重要。
但是一遍又一遍地重复那些错误?那是另外一个故事。
我与他们合作得越多,就越意识到新数据科学家犯的错误与专业人士犯的错误非常相似。数据科学家没有从我们早期的失误中吸取教训,而是挖掘并拒绝学习关键的经验教训,这些经验教训决定了数据驱动决策的增量收益和系统转型之间的差异。
我们必须从数据科学家不断犯的三个关键错误中吸取教训,以便更好地开展工作:
错误 1:假设*乎完美的数据
每个专业的数据科学家都知道,在智力层面上,你永远不会有完美的数据。数据将不完整、肮脏、容易出错,并且充满噪音。处理杂乱的数据是我们日常工作的一部分,也是我们最常见的抱怨。
当你第一次开始时,你对这个现实的实际经验较少。当我给我的 MBA 学生布置一项任务,要求他们选择要使用的数据集时,他们默认使用最相关的信息。从表面上看,这是有道理的:数据越相关,其影响就越大。
实际上,这种假设放大了数据中的每个问题。算法没有足够的数据来进行适当的学习,并克服数据集中的错误。尽管传统回归模型在面对海量数据集时会失败,但随着数据的增加,机器学习会蓬勃发展。假设数据完美,我的学生可能已经通过他们的选择取得了理想的结果,但在现实世界中,他们没有足够的数据来实现他们的目标。
**传统模式学得慢。**图片致谢: Evo 定价 (CC 带归属)
该领域的数据科学家应该更清楚。毕竟,他们花了这么多时间清理数据集,这是不可能忽视的!
不幸的是,许多数据科学家害怕提供太多的噪音,并默认为更安全的选择。他们看到了额外数据集的收益递减,并认为这种努力不值得。
这是一个致命的错误。
例如,在供应链预测中,最关键的信号来自产品特性、交易、可用性和流量等数据。来自社交媒体、人口统计和天气的信息提供的价值较小。
**在信号海洋中选择价值驱动的数据集。**图片致谢: Evo 定价 (CC 带归属)
而不是零值。对于概念验证,最相关的数据可能是最有价值的。尽管如此,次要影响对生产有重大影响,尤其是考虑到对一家大型国际零售商来说,利润增加 1%的货币价值。
数据科学家在选择数据时小心谨慎是正确的,但我仍然看到太多因谨慎行事而减少的结果。表面上看起来可能不一样,但他们正在犯和我的学生一样的错误:假设他们选择的数据足够接*完美。
最终,数据越多越好。让机器从你喂给它们的东西中学习,并找到自我补偿错误的方法。我们将有更健壮、更敏捷的模型来给我们更好的建议。
错误 2:误解你所在行业的驱动力
如今,对于任何数据科学家来说,行业知识都和技术知识一样重要。这些知识引导我们提出正确的问题,并利用数据来解决最紧迫的问题。当我们缺乏这种洞察力时,我们就会陷入困境。
以 CLIK 挑战为例。对时尚产业如何运作几乎一无所知的学生被期望找到创新的解决方案来满足他们的生产需求。可以理解的是,许多人一开始都很难确定时尚公司实际上需要什么样的趋势预测。公司需要了解的是颜色、风格还是其他因素?这种对时装生产周期运作方式的专业知识的缺乏起初让学生们感到困惑。
在第一稿中,许多提议的项目都很有趣,但最终都没有找到一个在时尚行业行得通的实用解决方案。他们有数据,科学是有效的,但目标是有缺陷的。即使成功实施,也不会显著帮助时装公司更好地计划生产和采购。学生们不得不重新分组。
在这样的挑战中,知识差距是可以理解的,也是意料之中的。在特定行业全职工作的专业数据科学家就不一样了。他们应该对所服务的行业和公司的需求有更深入的了解。
然而,太多的数据科学家不知道他们的客户的关键问题在哪里。
最*,我和一家俄罗斯大型食品连锁店的首席执行官讨论了这个问题。该连锁店长期以来一直使用一种被认为是同类最佳的需求预测和零售规划软件来使用其数据进行更有效的补货。这通常是可以接受的,但随着时间的推移,它越来越显示出它的根本缺陷:它系统地制造了库存过剩。
在杂货店,有针对性的本地促销是实现竞争优势的常用策略。
“很难预测我们每周的促销活动对需求的影响。有些折扣会成倍地增加销售额,而另一些折扣影响甚微。为了确保足够的产品供应,我们倾向于积压促销商品。这些库存过剩造成了巨大的浪费和周期性降价压力。我们需要一个更可持续的解决方案。”
促销品缺货对品牌不利,但经常性的库存过剩会造成大量浪费。促销品的不良补充是不可持续的,而且成本高昂:这是困扰杂货业的一个核心供应链痛点。
尽管如此,许多需求预测未能关注这一领域,而是在其他领域实现了增长。简单地解决这种脱节会带来巨大的收益:在这种情况下, +23%的库存效率。
**促销后剩余库存的影响。**图片致谢: Evo 定价 (CC 带归属)
在这种情况下,即使几个百分点也能对底线产生巨大影响,这些数字是压倒性的。但它们都可以归因于针对错误问题的健全制度。忽视行业知识的整体作用是熟练的数据科学家经常犯的错误,会带来灾难性的后果。
如果你使用所有的数据和精心设计的算法来解决次要问题,你就复制了一个破坏性的错误。作为数据科学家,我们必须做得更好。
错误 3:试图预测而不是推动结果
最后一个错误,也是我最常看到的一个错误:预测性而非规定性的方法。
新数据科学家听到“预测”,他们自然明白预测是他们的首要目标。从语言学上来说,这是对他们作品最精确的定义。然而,从战略的角度来看,这些初学者缺乏理解他们真正目标是提高 KPI,而不是预测准确性的背景。我见过许多新的数据科学家为实现了高精度而骄傲,幸福地意识到这种精度的投资回报对用户来说实际上是不存在的。
当你开始时,这种天真是正常的,但可悲的是,很少有数据科学家超越这种思维模式。我见过一些公司在业务相对正常的时候,骄傲地吹嘘自己的准确性,但在危机面前,他们的模型失败了,让他们措手不及。
例如,在新冠肺炎疫情的早期阶段,许多使用预测人工智能的数据科学家看到他们的模型分崩离析。那些继续提供可操作的建议,并让公司成功转向降低危机影响的公司?几乎总是规定型。
太多时候,人工智能模型的设计主要是基于稳定的条件来预测未来,而不是以最佳方式实现未来的目标。我已经写了无数篇过去的文章来告诉 T2 为什么这是一个问题。太多的不确定性限制了你的回报。
这个错误的核心在于商业哲学:一个预测结果而不是推动结果的公司太被动了。
最成功的公司不是专注于发现将会发生什么,并成功地适应。他们是希望知道如何实现目标的市场领导者。
**分析方法的演变。**图片致谢: Evo 定价和neuraldesigner.com(CC 带归属)
预测分析限制了你的努力所创造的价值。预测性建议告诉你对可能发生的事件的最佳反应;规范性建议告诉你如何实现你的目标,不管你的道路上有什么障碍。
数据科学家必须停止犯同样的错误,相信他们正在建立预测引擎。他们真正的角色是自动化决策,并通过规定的方法获得更好的结果。
如何从我们的错误中吸取教训
照片由蒂姆·莫斯霍尔德在 Unsplash 上拍摄
我们不能老是原地打转,一遍又一遍地犯这些错误。作为数据科学家,这些坏习惯阻碍了我们的研究领域。
数据科学家必须认识到他们是如何反映职业生涯早期犯下的错误的,以调整并最终克服这些错误。我们第一次犯错,是件好事。我们可以学习,下次做得更好。当我们重复犯那个错误,没有注意到我们的错误时,我们就有问题了。我们从错误中吸取教训的唯一方法是拥抱一条新的道路。
我们应该已经吸取了这些教训:是时候超越初学者的错误了。随着我们的前进,我们肯定会犯新的错误。拥抱他们!他们会带我们走向更大的成功,而不是让我们停滞不前。
PS 更多商业科学来自我的写作:
Monthly Business Science in your inbox, new software, and University-level learning:[**Free access**](https://evouser.com/register)Questions? Please reach out on [Linkedin](https://www.linkedin.com/in/fabrizio-fantini/)
数据科学、意义和多样性
原文:https://towardsdatascience.com/data-science-meaning-and-diversity-bb842602e55d?source=collection_archive---------24-----------------------
思想和理论
更好地做数据科学的认知谦逊和立场理论
图片来自 PublicDomainPictures 来自 Pixabay
数据科学基本上是关于数据的科学。它试图通过研究数据来产生关于世界的可操作的知识。所谓“可操作的知识”,我指的是可以被其他研究人员和政策制定者用来继续推进社会如何与世界互动和理解自身的知识。因此,我假设科学调查通常寻求产生可以采取行动的知识。然而,我们在数据科学背景下处理数据的方式将影响分析是否会产生与现实世界相关的可操作知识。在这篇文章中,我为立场理论提出的认知谦逊和多样性的必要性进行辩护,因为数据有助于实践科学知识。
这个职位的结构如下。在第一部分,我介绍了数据的四个特征,因为它与整个科学相关。这四个特性回答了以下问题:什么使数据有意义?然后,我详细阐述了数据科学中出现的四个特征。在第二节中,我阐述了提供四个特征的数据所固有的三个问题。在第三节中,我介绍了认知谦逊和立场理论作为缓解已发现问题的工具。在第四部分,我为支撑这篇文章的两个假设辩护:(1)多学科性可能是有问题的,以及(2)数据既与科学期望有关又与代表现象的有关。
1.数据科学中的数据
在之前的一篇文章中,我指出了数据的四个特征,它们可以使数据变得有意义:
- **解释:**数据通过被解释而具有意义——没有独立于思想的数据(在我对数据的描述中);
- **具体化:**对于数据的解释,它们必须采取某种“有形”的形式——这可能是. jpg 文档、笔记本上的涂鸦、墙上的砖块……——以便进行分析和操作;
- **背景:**了解数据点需要我们关注它们如何与数据集内甚至数据集外的其他数据点互动——了解某个社区的人均收入相对较低,与关注其居民如何受到制度性种族主义的影响截然不同(例如:Razai 等人,2021);和
- **元数据:**这些是用更容易理解的语言表达的关于数据的信息,同时也提供了关于数据本身的更多细节——例如,收集日期、原始格式、文件大小等等。
这四个特征的目标是让数据在科学中发挥有用的作用。“有意义”的要求回应了一种对科学的解释,即科学寻求更好地理解世界,而不是为了理解世界,而是帮助人类更好地与他人和环境互动。虽然科学研究确实可以回应不太值得称赞的愿望,但科学通常会促进人类知识,因此可以改善人类生计。
在数据科学的背景下,这四个特征受到审查,但提出的问题可能与其他学科不太相关。
例如,数据科学中的解释提出了一个重要的问题:谁来解释?虽然科学很容易更广泛地回答这个问题——是研究团队解释数据——但数据科学通常是多学科的努力。数据科学家通常是我所谓的多学科认知团体的一部分(更多关于 MEGs 这里)。在这些小组中,数据科学家与其他领域的专家合作,这些专家在大数据分析方面知识较少。相反,数据科学家不知道如何充分利用其他领域的理论基础。为此,数据的解释由数据科学团队和他们所从事领域的专家(我们称之为其他领域的专家)共同提供。这是假设两个团队都有大量的专业知识,并且两者之间没有太多的重叠。考虑到这一限制(这一假设在大量数据科学工作中并不成立),其他领域的专家会对他们提供给数据科学家的“原始数据”进行解释。其他领域的专家对原始数据进行分类、标记等等——他们在这方面更有经验。然后,数据科学家“清洗”数据,并将其标准化,以对其进行计算、数学和统计分析。一旦完成,他们就向其他领域的专家返回一种新形式的数据——带有进一步的见解。其他领域的专家提供了一个新的解释层,因为他们将新的见解整合到他们领域的理论框架中。
数据的物化在数据科学中是一个至关重要的方面,因为必须收集数据并将其物化用于计算分析。事实上,数据科学与计算工具一起工作,这些工具可能要求数据采用特定格式并满足其他标准。数据科学项目中提出的问题还要求数据符合特定的规范。考虑到这一点,在数据科学的背景下,我将数据理解为可量化的信息单位。数据是从世界中提取的信息,是由其他领域的专家“收集”的,并且为了他们通过定量方法进行分析的目的而提取的。对于数据科学家来说,当数据是可量化的,并且可能只具有数学特征时,它们就被物化了。这对数据科学如何理解数据的背景产生了影响。
数据的上下文由于数据科学工具和方法的性质而丢失。这可能是一个大胆的主张,但它承认了数据收集后的数据争论过程的重要性。数据必须被处理以满足计算方法的标准。考虑对一个国家的人口普查的研究,其中个人根据性别、年龄、年收入等类别成为价值。应用于人口普查的数据科学除了提供一些与*均值的比较之外,对任何一个人都没有什么有意义的说法,但是数据科学从来没有告诉我们人们的身份。这没有问题——人口普查不应该为人口中的个人提供深刻的见解——但它确实突出了数据科学家研究的数据和它们产生的背景之间的距离(艾伦图灵研究所数据女权主义 的作者对此做了更多的说明)。火上浇油的是,数据科学方法和工具的设计甚至不需要依赖于“真实”数据的收集。创建此类工具的现代方法依赖于所谓的“合成数据”。合成数据相当于包含我们在“真实数据”中期望的某些特征的数据。合成数据有助于人工智能系统和机器学习模型弥补数据量不足或难以匿名的数据。简而言之,合成数据是通过反映出现在“真实数据”中的单个(“不真实”)数据点参数而产生的人工产物。当综合分析时,合成数据反映了与我们在“真实数据”中发现的类似的那些参数的分布。我不想再深入研究合成数据(即使我尝试了,我也做不到),但提到它只是为了强调,数据科学可以处理真正抽象和脱离上下文的数据。
元数据可能为数据科学提供一个克服去上下文化问题的机会。毕竟,元数据是关于被分析数据的数据。然而,元数据通常仅限于描述数据点的输入日期、大小、格式等等。理论上,元数据可以提供背景——我甚至建议元数据可以包括关于项目伦理考虑的信息。数据科学中数据物化的特殊形式也强调了元数据的重要性(这里的是我试图以一种创造性的方式阐明这一点)。
2.数据科学中的数据问题
数据科学中数据的上述四个特征对该领域提出了三个挑战。简单概括一下:
- 多学科问题与数据科学家需要与其他领域的专家合作有关,反之亦然。由于各自在各自领域的专业程度不同,两人都无法完全理解对方对数据的看法;
- 抽象问题出现在需要清理的数据中,以便适合数据科学家使用的工具;和
- 与此相关的去语境化问题来自数据的数学化,否则这些数据可能对更广泛的公众有意义。
这些问题都错综复杂地联系在一起。考虑到数据科学方法和工具日益专业化和复杂化。这意味着更少的其他领域的专家可以参与其中,因此多学科问题恶化了,数据被进一步抽象和操纵以用于日益复杂的工具,并且它们的上下文被留得更加混乱。
这里最大的问题是数据科学研究的东西——数据——与我们期望科学帮助我们理解的现实脱节。我称之为数据科学的本体论问题(并希望在其他地方写这个问题)。为了部分克服这一点以及上述三个问题,我现在介绍对更准确的科学交流和数据“锚定”的需要。
3.在数据科学中求解数据
我们已经看到,元数据作为数据的一种特性,可能会为数据科学家分析的数据提供急需的上下文。然而,元数据通常只有知道在哪里可以找到它们的科学家同事才能访问。元数据也不经常以我上面建议的方式使用。他们的潜力往往得不到利用。
克服一些问题的另一种方法是通过提高数据科学所能实现的透明度。我们可以称之为“认知谦逊”;粗略地说,承认数据科学的局限性。这可以通过三种相互关联的方式表现出来。首先,数据科学可以承认他们分析的数据的特别抽象的本质。这可以帮助数据科学家更清楚地传达他们的发现属于抽象概念,而不是世界上更有形的现象。这有助于数据科学中认知谦逊的第二种形式:范围限制。目前,数据科学被视为在所有领域推进人类知识的全能工具。虽然这有一定的道理,但交流其发现的抽象性质可以帮助其他领域的专家更加谨慎地对待数据科学——数据科学最终不是银弹。第三,在多学科合作中对自己的专业知识更加谦逊,可以让其他领域的专家对自己的分析更加自信。这种合作中的解释阶段(如第 1 节中所介绍的)必须与相应的专家坐在一起,如果他们没有在彼此的学科中受过训练的话。虽然对话对于理解其他领域专家提出的科学问题是必要的,但当数据科学家展示他们的发现时,对彼此专业知识的大量信任也是必要的,而这种信任最好来自谦逊的立场。
对这三个问题的另一个解决方案是我所说的“锚定”。锚定可以说是数据再次被语境化和“非抽象”的过程。锚定的要点是让数据科学家将他们分析的数据视为更常见的突出现实的参考。锚定是记住数据是更重要的世界和经历的抽象。从某种意义上来说,“重新语境化”和“去抽象”你没有完全抓住这里正在发生的事情。让我们后退一步。
最终,数据是世界上各种现象的表示(正如前面提到的,合成数据不是这种情况)。它们以某种方式从世界中提取出来,然后抽象成可量化的信息单位,以供分析之用。锚定归结为承认这个过程留给我们的数据是“唯一的”表示。锚定的过程是关于记住数据代表什么;它允许数据科学家在分析时考虑周全。这种更多的考虑,反过来又考虑到了我们在讨论更透明的科学交流时已经描述过的好处。
我所说的锚定的意义是受女权主义认识论的启发。女权主义认识论的一个分支是 T2 立场理论。简而言之,立场论无意为这个丰富的哲学领域提供注释,而是试图为那些传统上被边缘化的人提供一个声音。立场理论承认,对世界有大量的理解是科学探究中所没有的。这正是因为边缘化。然而,这并不是说任何在社会中被边缘化的人都可以因为他们被边缘化而获得有科学价值的知识。必须让科学界听到被边缘化的声音,这些声音来自于那些了解到自己被压迫的处境、了解到塑造了他们的生活和世界观的不公正结构的人。为此,数据科学中的立场理论允许两种有用的转换。
首先,具有社会意识的边缘化声音可以重视他们分析的数据,因为这些数据在涉及他们的社区和生活经历时具有更多意义。例如,考虑一个科学项目,该项目分析关于特定边缘化群体的一些行为模式的数据。该项目将从与该社区的研究人员的合作中获益匪浅,这些研究人员已经意识到维持其社区边缘化地位的不公正的权力结构。突然之间,已经被抽象和量化的数据得到了更多的关注。如果不承认这一点的数据科学家进行分析,它们所代表的重要现象就失去了意义。
其次,同样重要的是,通过认识到数据科学在整个科学中日益增长的重要性,应该可以清楚地看到,在一个如此受理论驱动的世界中,数据科学拥有巨大的力量。人工智能、机器学习等成果融入了我们日常生活中使用的技术,这意味着数据科学在世界上占据了主导地位。数据科学有能力表现当前的不公正,并将其投射到未来。允许数据科学主要招募那些历史上拥有权力的人是错误的。事实上,女权主义认识论者让我们注意到系统的不公*,边缘化和歧视的表演性质。如果我们允许数据科学继续建立在不公正的假设上,并向那些使世界不公正永久化的不灵活的技术提供信息,很难想象数据科学能够提供多少知识来帮助我们更好地理解和参与我们的周围环境。
4.一些细微差别
到目前为止的想法总结如下:
- 当数据被解释、物化和语境化,以及用元数据澄清时,数据在科学中变得有用。
- 数据科学中的数据被从现实中提取和成可量化的信息单元。
- 数据科学中的数据提出了多学科、抽象和去语境化的问题。
- 认知谦逊和立场理论强调了数据科学多样性的价值,因为它有助于克服这三个问题。
还有两个更深层的假设值得一提。首先,有一个多学科的问题,以及数据科学家和其他领域的专家是否真的没有共同的理解。第二,这意味着在整个文本中,数据“仅仅”是现实的代表,而不是任何更有意义的东西。
在多学科问题上,我确实提供了一个过度简化的例子。然而,值得澄清的是,这样做并不是为了削弱数据科学家或其他领域专家的专业知识。这一假设来自于科学社会学文献,这些文献清楚地表明,学术人员和研究人员在培训中需要将专业知识置于知识广度之上(见等,Poteete et al ., 2010 )。当然,这并不包括那些拥有数据科学以外的某个领域的背景,然后接受数据科学方法和工具培训的研究人员。就这一点而言,我必须说,在我看来,数据科学上升到了它自己的一个领域,而不是一个人在前进的道路上获得的一套工具和方法。不过,现在我必须澄清,这并不是贬低那些在其他领域接受广泛培训后成为专家、数据科学家的人。然而,我将坚持这一立场,即这些特殊的研究人员在他们的训练中是跨学科的,因此在他们的工作中也是跨学科的。在这篇文章中,当谈到“数据科学家”时,我并没有想到他们。最后,为了推进本文的论点,我有必要确定一些多学科的基本概念。对于社会学家和科学哲学家来说,探索数据科学中多学科、跨学科和跨学科的精确本质仍然是一个有趣的问题。
关于我引用数据的方式,这与莱奥内利的( 2016a ) 关系账户相差不远,其中数据的“可移植性”和“重要性”是突出的方面(参见莱奥内利、 2016b )。通过这个账户,数据也被收集,期望成为关于世界的主张的证据(同上 : 197)。然而,我把数据说成是“代表”现象,莱昂内利认为这是不同的、代表账户。根据这种说法,实质性。比如说,jpg 格式是一种特征,而不是数据的核心价值。根据代表性的说法,数据在整个时间和空间中都有意义,因为它们涉及世界上的现象,不管它们的格式如何。然而,莱昂内利解释说,这种解释是有问题的,因为它限制了数据可以引用的内容。的确,它们只能代表个别现象。在数据科学的世界里,这是不成立的,数据是通过科学模型抽象和分析的,而这些模型可能并不代表数据的初始现象。但是这种抽象正是我在这篇文章中所质疑的。也许我应该澄清一下,这个案例并不是为了避免将数据抽象到新模型 tout court 中,而是为了尽可能地承认数据的来源和表示价值。
5.结束的
这篇文章介绍了科学中的数据是有意义的,因为它有四个属性:解释、物化、语境化和元数据。与数据科学相关的这四个属性提出了多学科、抽象和脱离上下文的问题。我认为,一方面,这三个问题可以通过认知谦逊来解决;另一方面是多样性。相应地,认知上的谦逊相当于承认一个人专业知识的局限性;多样性是作为女权主义立场理论所规定的那种而引入的。然后探讨了两个强有力的假设:科学家专业知识的狭隘性,以及本文对数据的描述。正如社会学家和科学哲学家所研究的那样,专业知识的狭隘性是在学术基础设施的基础上得到辩护的。这篇文章对数据的描述后来被发现模糊了关系型和代表型描述之间的界限,但讨论有助于澄清我的总体主张:如果我们在寻求可操作的知识,承认数据科学中数据的来源和代表价值是重要的。
进一步阅读
关于认知谦逊,参见 Medina,J. (2013) 主动无知、认知他人和认知摩擦,DOI:10.1093/AC prof:oso/9780199929023 . 003 . 0001
关于立场理论,参见英特曼(2010) 25 年的女性主义经验主义和立场理论:我们现在在哪里?,DOI:10.1111/j . 1527–2001 . 2010 . 01138 . x
在多学科方面,我有一份不错的阅读清单——所有的我都有显然阅读——在我写硕士论文的地方的最上面,在“参考资料”部分:https://hackmd.io/IqPngF_XS1uDwDg50sE9Zw?view#Resources
谢谢大家!
乔纳森·舒尔特(Jonathan Schulte)令人沮丧的严谨的哲学输入——我期待你对数据的看法!
到 Maria Eriksson 的冗长聊天,并确保我不会被无端的认知傲慢冲昏头脑!
至阿瑞尔·贝内特和马尔维卡·莎兰的深刻而广泛的评论!
关于认知上的谦逊…
我花了很大的力气来写上面的内容。主要是因为我不是数据科学家,也因为数据科学提出了大量的问题,我简直无法理解。例如,这篇文章以前的版本提到了“作为本体论的数据科学”。可笑的事情比合成数据更让我困惑!(我希望我没有犯太大的错误,并且它对完全不属于数据科学的人是有用的)。
在艾伦图灵研究所,我周围都是才华横溢的人,他们在做着令人着迷的工作,但我可以看到,更广泛地说,数据科学作为解决方案的提供者是理所当然的。
我最*开玩笑说,科学进步越来越快,嗯,需要停下来闻闻花香。我想我实际上问的是数据科学家什么时候有机会接触科学哲学。或者科学哲学家如何更有意义地参与数据科学。
实际上,我想说的是:我希望你——已经看完了我的文章——感到有勇气去质疑传统的做事方式。听听关于在数据科学方面做得更好的专题讨论,看看关于的纪录片,看看人工智能和类似的东西对的反应,和比我知道得多的人交流!但也谢谢你。我真的很感谢你抽空过来!
数据科学。措施
原文:https://towardsdatascience.com/data-science-measures-213521b6a878?source=collection_archive---------24-----------------------
如何使用描述性统计来查看数据显示的内容
有很多工程师从未涉足统计学或数据科学领域。但是,为了构建数据科学管道或者将数据科学家产生的代码重写为适当的、易于维护的代码,工程方面会出现许多细微差别和误解。对于那些数据/ML 工程师和数据科学家新手,我做这个系列的帖子。我将尝试用简单的英语解释一些基本方法,并在此基础上解释一些数据科学的基本概念。
在统计学中,我们在我们的数据中看到的东西不是我们自己感兴趣的,而是评估它来自哪里(人口)。为了评估和描述特征,我们需要知道一些事情。首先是这些特性的值,这些值对于所研究的分布来说是典型的。其次,只要这些值是不同的(分散的),它们有多少是典型的这样的分布。
第一个任务是通过集中趋势的措施来解决的。第二个任务是通过测量变化来解决的。
集中趋势测量
为了研究集中趋势的各种措施,我们将创建数据,让它们以故事的形式出现。
想象一个场景,5 个人坐在一个酒吧里,收入 4 万。坐在酒吧里的人*均收入 4 万。
data = [40, 40, 40, 40, 40]
利用这些数据,我们现在将转向理论。
*均
概率论与随机变量的研究有关。为此,计算描述其行为的各种特征。随机变量的主要特征之一是均值(其他人也称之为数学期望或*均值),这是可用数据的一种*均值。
*均值给我们一个概括的估计,可以帮助我们做决定。例如,一家公司的*均收入给我们一个大概的估计,我们可以雇用多少新员工,一家餐馆的*均支票帮助我们决定是否去那里。
*均值是一个简单的度量,其公式如下:
其中 Xi——随机变量,pi——它们的概率
从公式中可以看出,随机变量的*均值是权重等于相应概率的值的加权和。
例如,如果您计算投掷两个骰子时点数之和的*均值,则得到数字 7。但是在这里,我们确切地知道所有可能的可接受值及其概率。如果没有这些信息呢?只有一些观察的结果。该怎么办呢?答案来自统计学,它允许我们得到一个*均值的*似值,从可用的数据中进行估计。
数理统计为估计*均值提供了几种选择。主要的一个是算术*均值,有一些有用的属性。例如,算术*均值是一个无偏估计,即*均期望等于估计期望。
因此,算术*均数是由任何学生都知道的公式计算出来的。
其中 Xi——随机变量,n——数值个数。
def mean(x):
return sum(x) / len(x)mean(data) # 40
这种方法的缺点是对样本中不同的偏差和异常值敏感,即容易受到严重偏离分布中心的异常值的显著扭曲。
如果任何其他人带着 4 万美元的收入来到我们想象的酒吧,酒吧里人们的*均收入将保持不变。
data1 = data + [40]
mean(data1) # 40
如果杰夫·贝索斯走进一家收入为 100 亿美元的酒吧,酒吧的*均收入会上升到1700
,尽管前 4 个人的收入没有变化。
data2 = data + [10000]
mean(data2) # 1700
为了处理这个问题,还有其他集中趋势的度量:截尾均值,众数,中位数。
方式
另一个简单的方法。模式只是数据集中最常见的值。
可能有几种模式。而多模态的存在也是待观察数据的某种特征。这表明数据有一些内部结构,可能有一些子组在性质上彼此不同。也许不把这种分布作为一个整体来看是有意义的,而是把它分成小组,分别来看。
def mode(x):
"""returns a list, might be more than one mode"""
counts = Counter(x)
max_count = max(counts.values())
return [x_i for x_i, count in counts.iteritems() if count == max_count]mode(data) # [40]
Mode 对于定性变量是必不可少的,对于定量变量用处不大。它还帮助我们估计数据样本的最典型的值。
中位数
中心趋势不仅可以被认为是具有零总偏差(算术*均值)或最大频率(模式)的值,还可以被认为是将有序数据分成两个相等部分的某个标记(分析特征的某个水*)。也就是说,它的值中有一半的初始数据小于这个标志,另一半大于这个标志。这是中值。
众数和中位数是重要的衡量指标,它们反映了数据结构,有时用来代替算术*均值。
def median(v):
"""finds the 'middle-most' value of v"""
n = len(v)
sorted_v = sorted(v)
midpoint = n // 2
if n % 2 == 1:
# if odd, return the middle value
return sorted_v[midpoint]
else:
# if even, return the average of the middle values
lo = midpoint - 1
hi = midpoint
return (sorted_v[lo] + sorted_v[hi]) / 2
median(data) # 40
median(data2) # 40
显然,在对称分布中,将样本分成两半的中间点就在正中心,与均值和众数在同一位置。可以说,当众数、中位数和均值重合时,这是一种理想的情况。然而,生活并不像正态分布那样对称。
要了解数据采样特征是如何表现的,光知道均值是不够的,光知道这些特征的典型值是不够的,还需要知道它们的可变性。也就是说,我们不仅要知道什么是典型的,还要知道与*均值有多大的不同,与*均值不相似的值有多大的不同。为此,我们有变异的度量。
让我们回到我们想象的情况。假设我们现在有两个小节:
data1 = [40, 40, 40, 40, 40]
data2 = [80, 40, 15, 25, 40]mean(data1) # 40
mean(data2) # 40
median(data1) # 40
median(data2) # 40
mode(data1) # [40]
mode(data2) # [40]
他们看起来在我们所观察的特征上是相似的,但是数据实际上是不同的。
范围
最简单和最直接的可变性测量是范围。该范围是最小和最大特征值之间的距离。
def data_range(x):
return max(x) - min(x)data_range(data1) # 0
data_range(data2) # 65
一方面,产品系列可以提供丰富的信息,非常有用。比如一个城市一套公寓的最高价和最低价之差,一个地区的最高工资和最低工资之差等等。另一方面,范围可以很大,没有实际意义。
这个度量显示了样本中的值有多大的变化,但是它并没有告诉我们关于分布本身的任何事情。
差异
如果*均值反映了随机值的中心,方差给出了的特征,数据围绕中心展开,并考虑了所有对象值的影响。
方差的公式如下:
其中 x —随机 variables,^x —*均值, n —数值个数。
对于每个值,我们将从*均值中提取一个偏差,将它们竖立在一个正方形中,然后除以样本中值的数量。
我们为什么要把它做成方形?
负变化和正变化之和为零,因为负变化和正变化相互抵消。为了避免这种相互抵消,使用分子中这种测度的*方。至于分母,我们用n
除。然而,使用不同于 n 的值以不同的方式改进了估计。分母的总值消除了偏差。
def de_mean(x):
"""translate x by subtracting its mean (so the result has mean 0)"""
x_bar = mean(x)
return [x_i - x_bar for x_i in x]def sum_of_squares(y):
"""the total squared variation of y_i's from their mean"""
return sum(v ** 2 for v in de_mean(y))def variance(x):
"""assumes x has at least two elements"""
n = len(x)
deviations = de_mean(x)
return sum_of_squares(deviations) / (n - 1)variance(data1) # 0
variance(data1) # 612
因此,我们考虑了每一个偏差,总和除以对象的数量给出了可变性的估计。
这里有什么问题?
我们*方的事实给了我们测量的倍数增加。也就是说,如果在第一种情况下,我们的工资是以美元,以千美元为单位,那么当我们*方它时,我们就开始以百万甚至数十亿美元为单位进行操作。这使得关于组织中的人获得的具体工资的信息变得更少。
标准偏差
把方差回归现实,也就是把它用在更实际的用途上,从中提取*方根。就是所谓的标准差。
这就是公式:
def standard_deviation(x):
return math.sqrt(variance(x))standard_deviation(data1) # 0
standard_deviation(data2) # 24.7
标准差也是可变性测量的特征,但现在(与方差相反)它可以与原始数据进行比较,因为它们具有相同的测量单位(这从计算公式中可以清楚地看出)。
例如,的三西格马规则指出,正态分布的数据在*均值的 3 个标准偏差内有 997 个值。标准差作为一种不确定性的度量,也涉及到许多统计计算。它可以用来确定各种估计和预测的准确性。如果偏差非常大,那么标准差也会很大,因此预测也会不准确,这将表现为,例如,非常宽的置信区间。
结论
这些是数据工程师应该知道的基本度量,但不是全部。它们将在本系列的下一部分中使用,其中将引入一些新的度量。
感谢您的阅读!
有什么问题吗?请在下面留下您的评论,开始精彩的讨论!
查看我的博客或者来打个招呼👋在 Twitter 或订阅我的电报频道。规划好自己!
数据科学将基础设施视为代码
原文:https://towardsdatascience.com/data-science-meets-infrastructure-as-code-d2f62328646c?source=collection_archive---------48-----------------------
奥斯卡·伊尔迪兹在 Unsplash 上拍摄的照片
使用软件工程的最佳实践,数据科学功能集成的最新发展为许多数据科学家带来了 Docker、Jenkins、REST APIs 等工具的知识,尽管这些知识使他们中的大多数能够部署他们的数据科学项目,为他们所插入的业务增加价值,但当项目在本地构建,然后被重新考虑部署到云中时,会有一些警告和妥协。
意识到这些警告,我撰写本文的主要目的是将数据科学知识(及其工具)与基础设施(如 Packer 和 Terraform 等代码工具)相结合,以确保创建一个数据科学环境,帮助同时使用 R 和 Python 的用户在云中调配基础设施,并利用许多大数据工具(如 AWS EMR)来分析和处理大量数据。
尽管本文是使用 AWS 堆栈创建的(由于整个基础设施超出了 AWS 免费层,因此可能会产生成本),但它也可以用于其他云提供商,只需对打包映像创建和部署机器的 Terraform 进行适当的修改。这项工作的进一步更新应该会为项目带来对更多云的支持。
TL;速度三角形定位法(dead reckoning)
这个项目(在 Github 中可用)的主要目标是创建一套工具,允许使用 Packer 和 Terraform 部署数据科学堆栈。它包括以下基础设施:
- 创建一个 packer 映像,其中 JupyterHub 托管在端口 8000 中,RStudio 服务器托管在端口 8787 中,这个 Packer 映像的结果将是一个 Amazon 机器映像,可以在将来多次使用。
- 创建 VPC 和必要的子网,以确保堆栈所需的所有基础架构都可用。
- 最后,当所有这些都创建好后,目标将是在 EC2 实例中部署这两个服务(JupyterHub 和 RStudio Server)。
构建要使用的自定义图像
通过使用 Packer 和创建要在任何云中部署的定制机器映像来利用映像的定制,我们还使用 Ansible 来创建行动手册,以允许定制应该在机器中安装什么。通过使用单个源创建这个映像,并指定添加到机器映像中的许多特性,我们可以确保一旦构建了映像,它将在其整个生命周期中保持不变,这意味着安装在机器上的任何包和依赖项都不应在其日常使用中进行更新。
这使得用户,无论是数据科学家还是数据分析师,都可以确信一旦一个项目建立在一个定制的 AMI 之上,任何依赖关系都不会随着时间而改变。当用户自己使用依赖项管理器,比如 R 的 Renv ,或者使用 Python 的环境中的 requirements.txt 时,这种再现性特性也可以得到增强。
可以定制映像的创建来添加或删除特性,比如安装或不安装 RStudio Server,或者部署安装或不安装 Anaconda 的映像,在 Packer 和 Ansible 最终构建 AMI 之后,它将可以多次使用。
这个项目正在构建的 AMI 主要关注 RStudio 服务器的安装和配置,以及带有 conda 的 Jupyterhub。
使用自定义图像
许多用户在开始使用云提供商部署强大的机器来训练模型或分析大量数据时,并不使用允许以可再生和可扩展的方式提供这种基础架构的工具(很多时候,这些资源最终会在月底形成一大笔云账单)。这就是 Terraform 出现的原因,因为它帮助用户使用代码部署定制的基础架构,并在工作完成后销毁相同的基础架构。
这个项目的 terraform 模块包含一个简化版本的基础设施,但与 Packer 一样,如果需要,用户可以添加更多的模块。安全模块控制将使用自定义 AMI 部署的机器使用的入口和出口端口,而网络模块控制机器将使用的网络和网关,IAM 设置该机器在云提供商中可以拥有的权限,EC2 模块实际部署机器。
Terraform 带来的许多优势,以及它对基础设施作为代码的定位,允许使用 Git 跟踪基础设施随时间的变化。在 Terraform 部署结束时,用户将拥有机器的 IP 地址,因此它可以连接并使用其资源(以及 Packer 先前安装的应用程序)、托管在端口 8787 中的 RStudio 服务器和端口 8000 中的 Jupyterhub(这些端口先前在安全组模块中是允许的)。
进一步发展
尽管这个项目本身可以作为一个可以轻松部署到云的数据科学堆栈,但我们也可以将这个自定义 AMI 用于 EMR 集群,从而加快其配置,因为我们可以取消一些通常在集群配置的引导步骤中执行的安装。
此外,这并不取代任何允许数据探索和模型创建以及部署的数据科学堆栈的正式和官方版本,如 Sagemaker、Google AI Platform 或 Azure Data Studio,而是这些解决方案的替代方案,因为它允许用户完全定制他们需要的东西,并将其部署在他们想要的任何云中。
数据科学需要重构、教程、案例研究、技巧和诀窍
原文:https://towardsdatascience.com/data-science-needs-refactoring-a-tutorial-case-study-tips-tricks-8fff8f38acbb?source=collection_archive---------60-----------------------
实践教程
放慢速度会让你更快,方法如下
你也可以很快!确保你重构了…照片由莎莉·法约米在 Unsplash 上拍摄
TLDR
如果你引入了写得很差的代码,并且没有重构你的工作,不管你是否意识到,你都在无形中减慢你自己的速度,让你的生活更加艰难。重构是有趣的,它让你的代码更快,让你写代码更快,你写的代码更容易维护,一旦你不得不清理干净,它帮助你在第一时间写出更好的代码。
技术债务是一种无形的粘合剂,随着你每一次未经检查的提交,你的代码库就会增加更多的技术债务,你的进展最终会停滞不前。每次都是这样,不管你有多努力去逃避。
学习重构从学习如何在不改变输出的情况下重写现有代码开始,但是要提高代码的易读性、性能、简单性、可维护性或者以上的任何组合。“一次写得很差,以后再也没碰过代码”和仅仅重构过一次的代码之间的区别,使你的软件在质量和易扩展性上从 a 2 级变成了 a 7 级。每个人(包括几天后你遇到自己以前写的代码时的自己)都会因此而喜欢你。
如果你计划花几天时间开发一个软件,重构需要成为你故事的一部分。如果你花了几个小时写了一个脚本,然后就扔掉了,这是一个警告,你可以放心大胆地写代码,自由自在地生活。看看你以前写的一个小脚本,并借鉴其中的一些重构技巧,这可能是一个有趣的练习!
让我们开始吧…
什么是重构
比我聪明的人已经为我们定义了这一点,请看下面马丁·福勒的至理名言。
一种规范的技术,用于重组现有的代码体,改变其内部结构而不改变其外部行为
照片由 Shifaaz shamoon 在 Unsplash 上拍摄
介绍
重构是一个不受欢迎的习惯,它永远会带来回报,我希望有更多的数据科学投资者将它纳入他们的编程习惯组合中。这是任何优秀软件工程师的习惯,但在数据从业者的世界中并不经常出现,我想改变这一点,从这篇博客开始。
前几周,通过做一些简单的重构(我将在下面带您看一下),性能提高了 113 倍,将数据管道处理时间从大约 84 小时减少到 45 分钟。
这并不是说你的代码会变得多快,这仅仅是我的经验,我觉得这是一个值得分享的故事。
这也是用一个小时左右的简单工作完成的。仍有改进的空间,不知道能快多少。重构对你的代码的影响可能是更多数量级的代码改进,或者你可能没有性能问题,只是在阅读你上周写的东西时有一个头疼的问题。重构通常对两者都有帮助。
限制
我想指出的是,这是一个穷人版的 Raymond Hettingers talk(底部链接)的弗兰肯斯坦博客,一个案例研究,一个教程和我漫无边际的想法。Raymond 的演讲让我对重构和解决问题的体验从一件苦差事变成了一种爱好。我在这一页末尾的“比我聪明得多的人”部分记下了他的讲话。请去观看并在 twitter 上关注他,他是核心 python 开发团队的一部分,他在这个星球上投入了大量的智慧和爱,他需要不惜一切代价得到保护。
我声称速度提高了 113 倍,这与我前几周在工作中为一位同事重写函数的经历有关,当然,这与重构对您的情况有多大帮助没有关系。我也用 python 写所有东西,所以我的风格、行为和建议偏向于 python 和熊猫。
球赛
照片由 CHUTTERSNAP 在 Unsplash 上拍摄
从杰瑞米·霍华德和雷切尔·托马斯以及他们的教学风格中汲取灵感,而不是从基础和建设开始,重要的是首先看到最终结果,这样就有一个明显的结果来努力。在教我怎么踢球之前,先给我看一场 AFL 的比赛。
然后,我们可以分解实现目标的思路、步骤和工作,以及为什么这一过程如此重要。
我们案例研究的目标
因此,我们的情况涉及两个数据帧的样本:
- 参考数据集:包含主数据集中某个要素的信息、其条柱和我们关心的特殊值。
一些参考值
- 主数据集:我们需要放入参考箱中的值,并将幻值附加到这些箱中的值。
一些主要价值观
因此,对于主数据集中每个要素的每个观测值,参考数据集中都会有一组条目,其中包含要将这些主数据集值放入其中的条柱以及该条柱的相应特殊值。我们的目标是将每个主数据集条目连接到一个 bin,然后这个 bin 再连接到我们的特殊值,然后让所有这些都可以在主数据集中使用。
请注意,我们只显示了单个变量的解决方案,但是通过将我们的解决方案打包成一个循环等方式,解决 1 个特征会解决 n 个特征。
下面是我们期待的最终结果
最后会是这个样子
既然我们已经有了既定的最终目标,现在让我们看看代码…
代码
参见下面的 3 个要点,第一个是设置虚拟数据帧,第二个是花了大约 85 个小时在完整数据集上运行的旧代码,第三个要点是产生相同输出的重构重写。第二个要点用于大约 3000 个特征,几百万行花费了大约 85 个小时。这是我们正在研究的样本的替代品。我们将使用模拟样本,但变化仍然是一样的。我还加入了一些关于我不喜欢的错误的评论,以及为什么我认为重构的代码行更好管理的原因。
我们将针对最简单的情况(一个要素)来解决这个问题,然后可以针对主数据集中存在的尽可能多的要素进行循环/扩展。我发现在解决一个问题时,解决最简单和最小的方向跳跃是有效的,然后慢慢扩展和迭代到你的结果。
设置数据帧代码
上述内容不言自明,您可以看到引用数据帧为 ref_df,主数据帧为 main_df,我们在上面有截图示例。
可怕的老方法
这是我们可怕的原始方法,我前几周研究过。花点时间想想你是否能理解它,或者作者是如何试图实现我们的既定目标的。不要担心它是否令人尴尬或难以理解,它是,它是。我们将从头开始重写这个问题,并讨论如果我们坚持使用当前形式的方法,我们可以就地修改代码的方法。你会注意到我在代码的右边写了 sins 作为注释。
漂亮干净的 10 号内胆!
这是实现相同目标的最后 10 艘班轮。我已经在上面几行的右边加入了一些行为,这些行为是我比较这个要点和旧的代码要点时喜欢的。
另外,如果你想了解这 10 条线背后的想法,可以看看这个 colab 笔记本。见下文,我也把它放在了我的参考资料的末尾。
https://colab.research.google.com/github/nglillywhite/blog_resources/blob/main/Refactoring%20Resources-checkpoint.ipynb
那么我们如何从第二个要点转向第三个要点呢?!乍一看,这似乎是一个巨大的飞跃,中间没有故事,但我保证魔术中有简单。
乔尔·穆尼斯在 Unsplash 上拍摄的照片
分解问题
所有的程序和问题通常都可以分解成输入、对这些输入的处理和一些输出。在问题解决和重构的开始设置阶段是一个很好的方法,可以让你理清思路,提炼手头的问题。让我们在案例研究中快速完成,因为这将揭示我们在几行代码中采取的步骤。
一旦你把一个问题分解成简单的输入、输出和中间的步骤,你就可以逐步完成每一步并到达你的目的地。试图同时做每件事太难了,而且你也没有足够的心智记录来做这件事(提示:看看雷蒙德的精彩演讲,他谈到了心智记录和你脆弱的人类思维极限)
输入
- 参考数据框架
- 主数据框
处理
- 创建箱子|第 1–4 行
- 将容器添加到参考数据框|第 6–8 行
- 将箱子添加到主数据框|第 10–12 行
- 合并 bin 类别上的数据集。第 14 行
输出
- 单个数据帧,其参考特殊值与入库的参考值相关联
思维模式和行为
这比试图吃掉呈现给我们的原始方法要容易管理得多。有了上面的参考,我可以更清楚地解决我头脑中的问题,而不是试图解释原来的方法和实现。如果你觉得游戏,开始单元测试,并再次提炼你的代码,以进一步改善你重新写的东西。
一遍又一遍地这样做来提炼和提炼你的代码,本质上就是重构。只要你提高了易读性、性能、简单性或易用性,那么你就在正确的道路上。代码被阅读的次数比它被编写的次数多,所以要为读者而不是你这个作者进行优化。要有同理心,因为你可能会在一周内读到它,但你已经忘了你是在第一时间写的。
迭代和调整
最好的起点是对代码进行小的但是有方向的改进。这可以带来任何好处,例如易读性、简单性、简洁性、使用库而不是手写过程等。让我们看看下面的一个小例子。查看第 1–5 行和第 7–11 行,它们是来自原始大型方法的相同代码片段的原始版本和重构版本。
1–5 是原始代码| 7–11 是我们的修改版本。发现差异!
我将在下面快速列出这些变化:
- " out_val =" → "return out_val "
- " if PD . ISNA(x)= = True:"→" if PD . ISNA(my _ df):"
- x → my_df
- 改进的注释
这些都很好,原因如下:
- 向读者发出信号,这是期望的输出&一旦找到所需的值就返回函数,而不是继续计算不需要的代码
- 如果你能用更少的代码做同样的事情(removing = = True ),那就去做吧!Python 有一种“真”和“假”的行为,这种行为造就了像这样干净的语法。如果对您来说是新的,请阅读该堆栈溢出以了解更多信息。
- 使用更好的变量名,my_df 并不完美,但它至少表明了数据类型。“x”是如此的不明确,我必须找到声明或者调试它,才能知道这个变量是什么数据类型。
- 写一个注释,意思是如果我不想读代码,我可以不读。我的评论并不完美,但它比之前的评论更好。
所以我知道以上是一点点的区别,但也有一些微妙的改进。像这样的小调整可能感觉不到神奇或强大,但是当你迭代、迭代、迭代同一个片段,并将其浓缩成一些东西时,它通常是非常好的代码!我们还没有达到上面的例子,但我想展示一小部分。
拆除策略
这是一个完全重写的例子,其中没有考虑旧的代码,通过分解问题并回归基础,构建了一个全新的解决方案。有时候,如果你正在处理一个你有信心解决的问题,那么拆除现有的东西并重新开始会更快。要小心,因为这通常不是最好的途径,通常有人已经对他们写的东西进行了长时间的思考,值得花时间了解在你之前的人和他们的想法。然而,在这种情况下,有太多的花园路径要走,对于一个问题来说太复杂了,当你后退一步,实际上是非常简单的,并会受益于重写。
尝试一下,跟着做
去看看 colab 笔记本,看看我是如何完成这个解决方案并产生第二个要点的。如果你想知道如果我没有足够的勇气从头开始写它,并试图在代码质量上做出方向性的改进,我会如何修改原来的方法,请继续阅读。
重构技巧和诀窍
参考最初的方法,让我们看看这些小错误,当它们加在一起时,会使代码难以理解、缓慢且难以更改或维护。我还将公布如何解决这些问题。我弹出了一张截图,后面是我发现的一些罪恶。
看到什么了吗?你认为应该改变什么?
- 编写有用的方法和变量名,它们应该简短、易记且信息丰富。“x”不是一个好的变量名…
- 为你的方法写 docstring,我喜欢谷歌的 docstring 风格,它包括参数和清晰的缩进等。文档字符串是大多数 autodoc 工具的动力,如 Sphinx 。“他们也停电了??"jupyter 笔记本中的魔法命令,当你想偷看一个你想使用的方法时非常有用。第 7 行以后没有 docstring,这个方法如此复杂,当然需要一个。这种方法不包括。
- 在适当的范围内使用变量。如果您发现自己到处都在编写全局变量并引用代码库其他部分的变量。尝试重构和封装您的代码,以便相关的数据片段靠*需要它们的功能。否则,您可能会有杂乱的代码和混杂的变量,您不知道它们是如何在其他地方或被其他函数使用的。该方法不必要地使用了全局变量。
少可以多
- 让事情尽可能简单,如果你不必写一些东西来达到同样的效果,就不要写,除非它增加了上下文或者不清楚的信息。
一次做一件事。
- 一次做一件事。上面这条线太多了。根据“START”列调用 pd.isnull,然后根据该数据帧的输出提取“my_var ”,然后提取第一行的 iloc。这在一行中太多了,为了可读性,可以分成多行。玩 codegolf 如果你想写复杂的一行程序解决方案,通过写他们喜欢读的简单代码行来让你的同事们省心。
out_val 赋值 3 次,只返回一次。如果你有你的值,返回你的函数。
- 如果可以的话,尽早从一个函数中返回,这样可以通知读者并且更快。如果你已经在一个方法中找到了你的答案,并且不需要做更多的工作,直接返回。您可以在一个方法中编写多个 return 语句,遇到的第一个语句将从该方法/堆栈框架中退出代码执行,并且您不必继续处理已有的答案。这也让读者明白,这些语句是最终的,如果他们在查看特定的代码路径,他们可以停止读取并从该方法返回,但如果变量正在被赋值,他们必须不必要地继续读取代码,以便找到它最终返回的时间。
太多决定了!停下来想一想你是否写了这么多 if 语句
- **每种方法都应该做一件事,并且把这件事做好。**如果你发现自己编写了一个包含 5 个以上 if else 语句/决策点的方法,你很可能在这个方法中做了不止一件事,你应该将你的问题分解成几个不同的步骤。软件工程师通常称单一责任原则或 SRP 在这个场景中被违反。如果您想在一个方法中编排多个目标,请编写完成一件事情的多个函数并一起引用它们。深度嵌套的 if else 语句很难调试和理解。比起一个庞大的方法一次完成所有的事情,你最好写许多可以实现不同目标的方法,这些方法可以综合在一起。当你的方法超过 10-15 行时,开始流汗,重新思考你写的东西,以便更容易阅读。这条规则总有例外,但我敢打赌它是对的,而不是错的。
能不这样就不要这样。令人头痛的燃料
- 不要把一行代码写得太长,要分成 3 行以上才能读懂。你可能一次又一次地做了太多的事情,你可以把问题分解成步骤,并有清晰明确的步骤。它也非常非常难以阅读和理解,你已经给跟随你的每个人带来了头痛,通常是你自己。你不会真的想让自己头疼吧?当然也有例外,但在大多数情况下,多行代码通常不是好兆头。
- 几乎所有你想用数据做的事情都已经被构建到像 pandas 和 spark 这样出色的库中。如果没有必要,不要重写宁滨逻辑,熊猫比你想的要快得多,也聪明得多。上面的代码片段就是这样做的一个尝试,它比让熊猫做要慢几个数量级。维护起来也困难得多。
兰姆达斯是有目的的,不是这个。
- 兰姆达斯是善变和分裂的生物。非常有用和聪明,但一旦使用 lambda 锤子,许多程序员开始将所有东西与 map、filter 和 reduce 函数结合起来看,就像是 lambda 钉子。它们被定义为匿名函数,只使用一次,不会被再次引用。如果你发现自己传入指定的函数,并在 pd.apply 函数中做一些有趣的事情,比如 pd.apply,那么你会有惊人的创造力,但是你会让下一个看到你写的东西的人感到头疼。将你的问题简化成步骤,如果某件事需要做多次,创建循环/生成器来迭代。迭代器是很棒的东西,Raymond Hettinger 有很多关于这个主题的资源和讲座。
虽然这个评论在这种情况下是不言自明的,但它是一个很好的开始
- 最后,**在你的代码中为下一个人写一些有用的注释和参考,这样他们的生活就容易了。**以这段代码为例,我敢肯定它是在几个小时内匆忙写成的,但我花了很多时间写博客,自己对它进行了重构,你正在阅读这篇关于这段代码的博客,阅读这段代码的时间比写这段代码的时间要长得多。花在阅读和理解代码上的时间比花在编写代码上的时间要多得多,确保你为读者进行了优化。你可能会花更长的时间来写,但移情是一个很好的特质,代码是表达这种美德的散文。无论如何,你都会经常感谢自己,所以即使你很自私,这也是对你最有利的。
更多博客
我喜欢在这个博客中有什么有趣或无用的反馈和评论,以帮助推动进一步的写作。我正在考虑做一个关于单元测试的小教程,这会让重构变得更加有趣。你有一个测试工具来保护你的屁股,你有可证明的证据,给定相同的输入,你得到相同的输出。您可以编辑和重构自己喜欢的内容,因为您没有引入奇怪的行为。我对这篇文章中可能提出的任何想法都持开放态度,欢迎并鼓励任何评论。
要知道这只是解决问题的一种方式,你可以随意写下你自己对这个问题的解决方案,或者重写你对另一个问题的解决方案。我的解决方案甚至还有重构和缩减的空间。重构永远不会结束,总有办法简化、提炼、改进和精炼你的工作!
比我聪明的人&额外的资源
特别感谢科尔荣鼓励我开始写作。我总是感谢他的指导、鼓励、问题和同志情谊。我强烈推荐他的作品,这是很棒的东西,在很大程度上是我开始写博客的灵感。
这里有一个完整的跑步笔记本,如果你想看上面的要点和一些额外的评论,你可以参考:
https://colab.research.google.com/github/nglillywhite/blog_resources/blob/main/Refactoring%20Resources-checkpoint.ipynb
这是科林,我喜欢和他一起工作,我可能会永远缠着他要知识和陪伴
https://col-jung.medium.com/
这是 Raymond 的演讲,让我爱上了重构&让我用不同的方式思考解决问题。
这是乔尔,他是一个了不起的作家,他的顶级博客,如关于编码的博客,非常精彩。
https://www.joelonsoftware.com/
马丁·福勒是另一位我非常喜欢的伟大作家,他写了大量关于重构的文章
https://martinfowler.com/
这是他关于重构的页面!
https://refactoring.com/
杰瑞米·霍华德 & 雷切尔·托马斯是我的两个英雄,雷切尔在 fast.ai 深度学习程序员课程中鼓励每个人创建博客并开始写作,所以我也将这个博客的创建部分归功于她。我想把它们分享给每个人,因为它们很棒。他们制作了《T4》fast . ai 以及其他一些东西,非常棒。对于所有与伦理和实用神经网络相关的东西,去那里尽情享受他们制作的精彩内容。
https://www.fast.ai
r .区块链上的数据科学第一部分:阅读区块链
原文:https://towardsdatascience.com/data-science-on-blockchain-with-r-afaf09f7578c?source=collection_archive---------10-----------------------
数据科学家进入区块链的窗口。
密码朋克是 NFTs 的最早版本(www.larvalabs.com/cryptopunks)。图片由 https://commons.wikimedia.org/wiki/File:Cryptopunks.png 的修改而来。
Thomas de March in(pharm Alex 统计和数据科学高级经理)和 Milana Filatenkova(pharm Alex 统计和数据科学经理)
简介
什么是区块链: 区块链是一个不断增长的记录列表,称为块,它们使用加密技术链接在一起。它用于记录交易、跟踪资产以及在参与方之间建立信任。区块链主要以比特币和加密货币应用而闻名,现在几乎用于所有领域,包括供应链、医疗保健、物流、身份管理……数百个区块链存在,它们有自己的规范和应用:比特币、以太坊、Tezos……
***什么是 NFT:***不可替换的令牌用来表示唯一物品的所有权。他们让我们将艺术品、收藏品、甚至房地产等事物符号化。他们一次只能有一个官方所有者,并且他们受到区块链的保护,没有人可以修改所有权记录或复制/粘贴新的 NFT。你可能听说过艺术家皮普尔,他以 6900 万美元的价格卖出了他的一件 NFT 艺术品。
什么是 R: R 语言在统计学家和数据挖掘者中被广泛用于开发数据分析软件。
为什么在区块链做数据科学: 随着区块链技术的蓬勃发展,越来越需要能够阅读、理解和总结这类信息的工具和人员。
***什么是 API:***API 是一种软件中介,允许两个应用程序相互对话。API 旨在帮助开发人员向另一个软件发出请求(即下载信息),并以预定义的易读格式获得结果,而不必了解该软件的工作原理。
在 R 中已经有几篇关于区块链数据分析的文章,但是大部分集中在价格预测上。获取加密货币价格的数据非常简单,互联网上有许多数据库。但是如何真正读懂区块链呢?在这篇文章中,我们将重点阅读区块链交易。并非所有交易,但特别是与 NFTs 相关的交易。我们将阅读以太坊区块链,可能是用来交易非功能性交易的顶级场所。有几个市场可以作为 NFTs 的交易*台:OpenSea,Rarible……我们将在这里集中讨论 OpenSea,目前 NFT 最大的交易*台。
阅读区块链的原著是可能的,但是很难。首先,您必须设置一个节点并下载区块链的内容(在撰写本文时大约 7TB)。同步可能需要一段时间…其次,数据是按顺序存储的,这需要开发特定的工具来跟踪事务。第三,块的结构特别难读。例如,以太坊网络上的典型交易如下所示。每个块有 200 到 300 个事务,在编写本文时,我们处于块 12586122。
图 1:链中的每个块都包含一些数据和一个“哈希”,即使用加密技术从块中包含的数据生成的数字指纹。每个块还包括来自前一个块的散列。这成为用于创建较新块的散列的数据集的一部分,这就是块被组装成链的方式。图片来自 ig.com。
图 2:事务的结构。
幸运的是,有一些 API 可以方便我们的工作。
*# First, let's load a few useful packages*
**library**(tidyverse)
**library**(httr)
**library**(jsonlite)
**library**(scales)
**library**(waffle) #install.packages("waffle", repos = "[https://cinc.rud.is](https://cinc.rud.is)")
**library**(ggrepel)
OpenSea API
OpenSea 提供了一个 API,用于根据一组查询参数获取不可替换的 ERC721 资产。让我们来看看:
*# Retrieve sold NFTs*
resOpenSea <- GET("https://api.opensea.io/api/v1/events",
query = list(limit=300, *#number of events to retrieve*
event_type="successful", *#retrieve only the sales*
only_opensea="true")) *#retrieve only sales from the opensea website*
*# Convert the raw unicode (not human friendly) into JSON format*
*# Don't forget the option flatten=TRUE, otherwise the objects will be a complex list of list of list, impossible to work with*
dataOpenSea <- fromJSON(rawToChar(resOpenSea$content), flatten=TRUE)[[1]]
*# There are a lot of columns. We have to clean a bit.*
*# Let's start removing the one containing only NA values*
dataOpenSea <- dataOpenSea %>%
select_if(~!all(is.na(.)))
OpenSea 网站上并没有太多关于这个数据集内容的解释。因此,我选择了几个似乎包含有趣信息的专栏(至少是我能理解的)。
*# Let's select a few columns with interesting information*
dataOpenSea <- dataOpenSea %>% select("collection_slug",
"contract_address",
"id", "quantity",
"payment_token.name",
"total_price",
"seller.address",
"transaction.timestamp",
"winner_account.address",
"payment_token.usd_price",
"payment_token.eth_price",
"asset.asset_contract.schema_name")
*#"asset.asset_contract.address", "asset.asset_contract.asset_contract_type", "asset.asset_contract.created_date", "asset.asset_contract.name"*
*# Get a glimpse of the data*
glimpse(dataOpenSea)
我的猜测是——这里我们有:
- collection_slug: 项目所属的集合
- contract_address: 所有的销售都由一个合同(一段代码/一个软件)来管理,它将 NFT 发送给中标者。这是公海合同的地址。我们可以看到,所有销售只有一个地址,这意味着所有销售都由同一个合同管理。
- id: 每笔交易的唯一标识符
- **数量:**每笔交易售出的商品数量(参见下面的可替代/半可替代)。和在超市一样,你可以买 1 个苹果或者 20 个。
- payment_token.name: 用于购买物品的加密货币。
- total_price: 中奖者支付的费用。对乙醚来说,这是用乙醚的最小单位卫来表示的。1 以太= 10 亿魏(10
- **卖家地址:**卖家的地址
- **交易.时间戳:**交易的日期
- winner_account.address: 买家地址
- payment_token.usd_price: 用于以美元进行交易的代币价格
让我们来看看货币的分布:
dataOpenSea %>%
group_by(payment_token.name) %>%
summarise(n=n())
我们看到大多数销售是在乙醚中进行的(注意,包裹的乙醚可以被认为与乙醚相同),让我们在文章的其余部分重点关注这些乙醚销售。
*# Change the format of some columns to something more adapted than character*
dataOpenSea <- dataOpenSea %>%
mutate(quantity=as.numeric(quantity),
total_price=as.numeric(total_price),
transaction.timestamp=as.Date(transaction.timestamp),
payment_token.usd_price=as.numeric(payment_token.usd_price))
*# filter on sales in ETH*
dataOpenSea <- dataOpenSea %>%
filter(payment_token.name %**in**% c("Ether", "Wrapped Ether"))
*# Convert the price in Ether and then USD. We divide by the quantity as one sale can contain multiple items and then divide by 10^18 to convert the price from Wei to ETH (see above).*
dataOpenSea <- dataOpenSea %>% mutate(priceUSD = total_price / 10^18 * payment_token.usd_price / quantity)
*# Let's visualize this*
*# Histogram of the price distribution (with a log scale as prices are quite spread)*
pHistoOpenSea <- ggplot(dataOpenSea, aes(priceUSD)) +
geom_histogram() +
labs(x="Price (USD)") +
scale_x_log10(labels = comma)
ggsave("figures/histoOpenSea.png", pHistoOpenSea, height=7, width=7)
pHistoOpenSea*# Pie chart*
dataOpenSea$cut <- cut(dataOpenSea$priceUSD, breaks = c(0, 10, 100, 1000, 10000, 100000, 1000000),
labels = c("0-10USD", "10-100USD", "100-1000USD", "1000-10000USD", "10000-100000USD", "100000-1000000USD"), include.lowest = TRUE)
dataPieChartOpenSea <- dataOpenSea %>%
group_by(cut) %>%
count() %>%
ungroup() %>%
mutate(percent=`n`/sum(`n`)) %>%
arrange(desc(cut)) %>%
mutate(label=scales::percent(percent))
pPieChartOpenSea <- ggplot(dataPieChartOpenSea, aes(x="", y=percent, fill=cut))+
geom_bar(width = 1, stat = "identity") +
coord_polar("y", start=0) +
geom_text_repel(aes(y = cumsum(percent) - percent/2, label=label)) +
theme_void()
ggsave("figures/pieChartOpenSea.png", pPieChartOpenSea, height=7, width=7)
pPieChartOpenSea*# Waffle chart*
pWaffleOpenSea <- waffle(dataPieChartOpenSea, rows = 8, reverse=TRUE)
ggsave("figures/waffleChartOpenSea.png", pWaffleOpenSea, height=5, width=7)
pWaffleOpenSea
图 3:每笔销售价格的直方图。来自 OpenSea API 的数据。
图 4:每笔销售价格的饼图。来自 OpenSea API 的数据。
图 5:每笔销售价格的华夫饼图表。来自 OpenSea API 的数据。
这看起来很好,但有一个很大的缺点… OpenSea API 限制事件的数量为最后 300 个事务。如果我们使用他们的 API,我们对此无能为力。此外,下载的交易是由 OpenSea 预处理的数据,而不是区块链本身。这已经是获得关于事务的信息的良好开端,但是如果我们想要读取块呢?我们之前已经看到,直接从区块链检索数据可能相当复杂。希望有像以太扫描这样的服务,让你以一种简单的方式探索以太坊街区。你猜怎么着?他们还开发了一个 API!
以太扫描 API
以太网扫描是一个块浏览器,它允许用户查看提交给以太坊区块链的交易信息,验证合同代码,可视化网络数据…因此我们可以用它来读取任何涉及 NFTs 的交易!EtherScan 在其免费版本中将事务数量限制为 10000,这比 OpenSea API 好得多,如果需要更多,您仍然可以订阅。
我们从哪里开始?我们再来关注一下 OpenSea:从上面提取的数据中,我们看到他们的合同地址是“0 x7be 8076 f 4 ea 4a 4 ad 08075 c 2508 e 481d 6 c 946d 12 b”。如果我们在以太网扫描中输入该地址,并过滤已完成的交易(即通过网络验证的交易,而不是等待批准的交易),https://etherscan.io/txs?a = 0 x7be 8076 f 4 ea 4a 4 ad 08075 c 2508 e 481 D6 c 946d 12 b,我们看到了不可思议的数量(撰写本文时为 848,965。)当然也不全是和销售有关的。
让我们看看我们能利用这些数据做些什么。
# EtherScan requires a token, have a look at their website
EtherScanAPIToken <- "Your token"*# Retrieve the last 10000 transactions (maximum allowed by Etherscan) from the OpenSea contract*
resEtherScan <- GET("https://api.etherscan.io/api",
query = list(module="account",
action="txlist",
address="0x7Be8076f4EA4A4AD08075C2508e481d6C946D12b",
sort="desc",
apikey=EtherScanAPIToken))
*# Convert the raw unicode (not human friendly) into JSON format*
*# Don't forget the option flatten=TRUE, otherwise the objects will be a complex list of list of list, impossible to work with*
dataEtherScan <- fromJSON(rawToChar(resEtherScan$content), flatten=TRUE)$result
dataEtherScan <- dataEtherScan %>%
mutate(value=as.numeric(value), *# Convert price in numeric*
timeStamp=as.POSIXct(as.numeric(timeStamp), origin="1970-01-01")) *# Convert the timestamp to a date*
*# There are many transactions with a value of 0 ether. Among them, not all are directly linked to sales. We won't go into details here, but there are many other types of actions that can be recorded as transactions (publishing a sale, maintenance of the contract...). Among those that are linked to sales, some involve a token transfer (wrapped ETH for instance) instead of ether directly. To keep things simple, let's keep only transactions involving transfer of some ether.*
dataEtherScan <- dataEtherScan %>%
filter(value>0)
*# Convert ETH price in USD*
*# For this, we first need to obtain the last USD price*
resEtherScanPrice <- GET("https://api.etherscan.io/api",
query = list(module="stats",
action="ethprice",
apikey=EtherScanAPIToken))
dataEtherScanPrice <- fromJSON(rawToChar(resEtherScanPrice$content), flatten=TRUE)$result$ethusd %>% as.numeric()
dataEtherScan <- dataEtherScan %>%
mutate(value=value/10^18) %>% *#We divide by 10^18 to convert the price from Wei to ETH (see above).*
mutate(priceUSD=value*dataEtherScanPrice) *# convert in USD*
*# Let's visualize this*
*# Histogram of the price distribution (with a log scale as prices are quite spread)*
pHistoEtherScan <- ggplot(dataEtherScan, aes(priceUSD)) +
geom_histogram() +
labs(x="Price (USD)") +
scale_x_log10(labels = comma)
ggsave("figures/histoEtherScan.png", pHistoEtherScan, height=7, width=7)
pHistoEtherScan*# Pie chart*
dataEtherScan$cut <- cut(dataEtherScan$priceUSD, breaks = c(0, 10, 100, 1000, 10000, 100000, 1000000),
labels = c("0-10USD", "10-100USD", "100-1000USD", "1000-10000USD", "10000-100000USD", "100000-1000000USD"), include.lowest = TRUE)
dataPieChartEtherScan <- dataEtherScan %>%
group_by(cut) %>%
count() %>%
ungroup() %>%
mutate(percent=`n`/sum(`n`)) %>%
arrange(desc(cut)) %>%
mutate(label=scales::percent(percent))
pPieChartEtherScan <- ggplot(dataPieChartEtherScan, aes(x="", y=percent, fill=cut)) +
geom_bar(width = 1, stat = "identity") +
coord_polar("y", start=0) +
geom_text_repel(aes(y = cumsum(percent) - percent/2, label=label)) +
theme_void()
ggsave("figures/pieChartEtherScan.png", pPieChartEtherScan, height=7, width=7)
pPieChartEtherScan*# Waffle chart*
dataPieChartEtherScan <- dataPieChartEtherScan %>%
mutate(n=n/20)
pWaffleEtherScan <- waffle(dataPieChartEtherScan,
rows = 10,
reverse=TRUE,
xlab = "1 square = 20 sales")
ggsave("figures/waffleChartEtherScan.png", pWaffleEtherScan, height=5, width=7)
pWaffleEtherScan
图 6:每笔销售价格的直方图。来自以太扫描 API 的数据。
图 7:每笔销售价格的饼状图。来自以太扫描 API 的数据。
图 8:每笔销售价格的华夫饼图表。来自以太扫描 API 的数据。
请注意,从 ETH 到 USD 的价格转换并不完全正确。我们使用当前的 ETH/USD 价格,而一些交易是在一段时间以前完成的。即使在一天之内,价格也会有很大的变化!这可以通过检索历史 ETH/USD 价格轻松解决,但这需要一个 EtherScan Pro 帐户。
结论
本文介绍了如何阅读区块链并获得可以分析和可视化的事务数据。这里,我们展示了一个简单分析区块链交易的例子——NFT 销售价格的分布图。这是一个良好的开端,但我们还可以做得更多!在第二部分中,我们将研究如何更进一步。例如,我们可以跟踪特定的非功能性食物,探索它们在释放后被占有的时间以及它们随后被重新获得的比率。请让我知道你可能会对哪些属性感兴趣。
注意,用于生成本文的代码在我的 Github 上有:https://Github . com/tdemarchin/datascienceonblockschainwithr-PartI
如果你想帮助我订阅一个 EtherScan Pro 帐户,并能够检索更多的交易,请不要犹豫,向我的 ETH 地址捐款:0 xf 5 fc 137 e 7428519969 a52c 710d 64406038319169
参考
https://docs.opensea.io/reference
https://www.dataquest.io/blog/r-api-tutorial/
https://ethereum.org/en/nft
https://influencermarketinghub.com/nft-marketplaces
https://www.r-bloggers.com/
https://etherscan.io/
https://en.wikipedia.org/wiki/Blockchain
r .区块链上的数据科学第二部分:跟踪 NFT
原文:https://towardsdatascience.com/data-science-on-blockchain-with-r-part-ii-tracking-the-nfts-c054eaa93fa?source=collection_archive---------10-----------------------
关于节点和顶点的故事
怪异鲸鱼 NFT 的例子。这些 NFT(令牌 ids 525、564、618、645、816、1109、1523 和 2968)属于集合的创建者便雅悯·艾哈迈德(贝诺尼),他允许我们在本文中展示它们。
托马斯·德·马尔钦和米拉娜·菲拉滕科娃
Thomas 是 Pharmalex 的高级数据科学家。他对区块链技术让世界变得更美好的不可思议的可能性充满热情。你可以在 Linkedin 或者Twitter上联系他。
Milana 是 Pharmalex 的数据科学家。她对分析工具发现我们周围世界的真相和指导决策的力量充满热情。你可以在Linkedin上联系她。
此处 提供这篇文章的 HTML 版本 。用来生成它的代码在我的Github上有。
1.介绍
什么是区块链: 区块链是一个不断增长的记录列表,称为块,它们使用加密技术链接在一起。它用于记录交易、跟踪资产以及在参与方之间建立信任。区块链主要以比特币和加密货币应用而闻名,现已用于几乎所有领域,包括供应链、医疗保健、物流、身份管理……一些区块链是公共的,任何人都可以访问,而一些是私有的。数以百计的区块链都有自己的规范和应用:比特币、以太坊、Tezos……
***什么是 NFT:***不可替换的令牌用来表示唯一物品的所有权。他们让我们将艺术品、收藏品、专利甚至房地产等事物符号化。他们一次只能有一个正式的所有者,他们的所有权记录在区块链上是安全的,没有人可以修改或复制/粘贴一个新的 NFT。
什么是 R: R 语言在统计学家和数据挖掘者中被广泛用于开发数据分析软件。
什么是智能合约: 智能合约就是存储在区块链上的程序,当满足预定条件时运行。它们通常用于自动执行协议,以便所有参与者可以立即确定结果,而无需任何中介的参与或时间损失。他们还可以自动化工作流,在满足条件时触发下一个操作。智能合约用例的一个例子是彩票:人们在预定义的时间窗口内购买彩票,一旦到期,就会自动选出一名中奖者,并将钱转移到他的账户上,所有这一切都没有第三方的参与。
这是关于使用 r 与区块链进行交互的系列文章的第二篇。第一部分重点介绍与区块链相关的一些基本概念,包括如何阅读区块链数据。如果您还没有阅读,我强烈建议您阅读一下,以便熟悉我们在第二篇文章中使用的工具和术语:第一部分。
听说加密货币受黑手党欢迎并不罕见,因为它是匿名和保密的。这只是部分正确。虽然我们不知道某个地址背后到底是谁,但每个人都可以看到该地址进行的交易。除非你非常小心,否则几乎有可能通过跨数据库来确定谁是该地址的幕后操纵者。现在有公司专门从事这项工作。这是通向一个更加透明和公*的世界的突破性道路。区块链有可能解决世界面临的与缺乏可追溯性和问责制相关的主要问题。以象牙海岸的可可文化为例。在过去的 25 年里,尽管农业综合企业正式参与到与森林砍伐的斗争中,该国已经失去了超过 60%的“受保护”森林。当前保护野生森林的策略效率低下的主要原因是追溯可可豆的原产地极其困难,现有的追溯解决方案很容易被操纵。区块链可以帮助解决这个问题。在制药业,区块链也有潜力改善药品生产行业的某些方面。例如,这项技术将提高制造过程和供应链的透明度,以及临床数据的管理。
本文涉及的主题是如何提取和可视化区块链事务。我们将探索 R 上的一些可用工具来做到这一点。为了避免与黑手党搅在一起,让我们把注意力集中在区块链技术的一个更良性但目前非常流行的应用上:艺术 NFTs。我们将更具体地观察怪异的鲸鱼。这里描述的方法当然可以扩展到存储在区块链上的任何东西。
怪异鲸鱼项目是一个由 3350 只鲸鱼组成的集合,这些鲸鱼是通过编程从组合的海洋中产生的,每只鲸鱼都有其独特的特征和特性:https://weirdwhalesnft.com/。这个项目是由 12 岁的程序员便雅悯·阿迈德创建的,他在著名的 NFT 市场 OpenSea 上出售。根据这个感人的故事,3350 只计算机生成的怪异鲸鱼几乎立即销售一空,便雅悯在两个月内赚了 40 多万美元。鲸鱼最初以大约 60 美元的价格出售,但从那以后,它们的价格已经翻了 100 倍……阅读这篇来了解这个令人难以置信的故事。
这篇文章的 HTML 版本以及用来生成它的代码可以在我的 Github 上找到。
2 数据
该部分专用于下载销售数据,包括哪些代币被转移到哪个地址以及销售价格。这是一个非常有趣的话题,但也有点技术性,因此如果您仅对数据分析感兴趣,可以跳过这一部分,直接进入第 3 部分。
2.1 转让
所有智能合约都是不同的,理解它们以解码信息是很重要的。通过阅读源代码和使用像 EtherScan 这样的块探索者进行逆向工程通常是一个好的开始。这些怪异的鲸鱼由以太坊区块链的一个特殊的智能合同管理。这份合同存放在一个特定的地址,你可以在这里阅读它的代码。
为了更容易地从区块链中提取信息,由于它在分类账中的存储方式,这可能相当复杂,我们可以读取事件。在 Solidity 中,用于在 Ehtereum 上编写智能合约的编程语言,事件被分派为智能合约可以触发的信号。任何连接到以太坊网络的 app 都可以监听这些事件,并据此采取行动。以下是最*的怪鲸事件列表:https://ethers can . io/address/0x 96 ed 81 C7 f 4406 eff 359 e 27 BFF 6325 DC 3c 9 e 042 BD #事件
我们最感兴趣的是一种特定类型的事件:转移。每次发生令牌传输时,事件被写入区块链,其结构为:Transfer (index_topic_1 地址从,index_topic_2 地址到,index _ topic _ 3 uint 256token id)。正如其名称所示,该事件记录了令牌传输的起始地址、目的地址和令牌 ID,从 1 到 3350(因为生成了 3350 条怪异的鲸鱼)。
因此,我们将提取所有与怪异鲸鱼有关的转移事件。为此,我们过滤该事件的散列签名(也称为主题 0)。通过对 ethers can(https://ethers can . io/tx/0xa 677 CFC 3 b 4084 f 7 a 5 f 2e 5 db 5344720 bb 2c a2 c 0 Fe 8 f 29 c 26 b 2324 ad 8 c 8d 6 c 2 ba 3 # event log)做一点逆向工程,我们看到这个事件的主题 0 是“0x ddf 252 ad 1 be 2c 89 b 69 C2 b 068 fc 378 DAA 952 ba 7 f 163 C4 a 11628 f 5
下面,我们概述了创建包含怪异鲸鱼贸易数据的数据库的过程。我们使用 EtherScan API 下载数据,更多详情参见第一部分。EtherScan 的 API 被限制为每次调用 1000 个结果。这不足以分析怪异的鲸鱼交易,因为只有铸造(在区块链上创建令牌的过程)生成 3350 个交易(每个铸造的 NFT 一个交易)。而且这还不包括所有后续的转账!这就是为什么我们必须使用一个肮脏的 while 循环。请注意,如果您准备支付一点,有其他区块链数据库没有限制。例如,以太坊数据库可以在 Google BigQuery 上找到。
这是传输数据集的外观:
2.2 销售价格
虽然转让和销售都可以由同一个合同管理,但在 OpenSea 上是以不同的方式完成的。销售由主要的 OpenSea 合同管理,如果它被批准(达到要求的价格),第一个合同调用第二个 NFT 合同,这里是怪异鲸,然后触发转让。如果我们想知道 NFT 的销售价格(除了上面讨论的转让),我们需要从主合同中提取数据(https://ethers can . io/address/0x7be 8076 f 4 ea 4a 4 ad 08075 c 2508 e 481d 6 c 946d 12 b)。销售额由一个名为 OrderMatch 的事件记录。
请注意,这个循环可能需要一段时间来运行,因为我们下载了 OpenSea 上所有 NFT 销售的所有销售价格,而不仅仅是怪异的鲸鱼。鉴于在撰写本文时,OpenSea 上*均每分钟有 30 个事务,下载可能需要一段时间…这个代码块与上面的代码块非常相似,所以如果您不确定一行代码具体做什么,请阅读上面的代码注释。
如果我们查看 orderMatch 事件结构,我们会看到价格在数据字段中以 uint256 类型编码。它前面是另外两个字段,buyHash 和 sellHash,都是 bytes32 类型。uint256 和 bytes32 类型的长度都是 32 个字节,因此有 64 个十六进制字符。我们对 buyHash 和 sellHash 数据不感兴趣,只对价格销售感兴趣。因此,我们必须检索最后 64 个字符,并将它们转换成十进制,以获得销售价格。
图 orderMatch 事件的结构
2.3 将两个事件结合起来
现在让我们通过怪异鲸鱼转账的交易散列来合并这两个数据集。
2.4 将 ETH 价格换算成美元
因为我们在区块链以太坊工作,所以交易价格是以以太坊给出的。以太币/美元汇率波动很大。如果我们试图将 ETH 转换为 USD,我们不能只应用乘法因子。因此,我们必须下载历史 ETH USD 价格。这一次,我们将从 Poloniex 交换下载数据,而不是 EtherScan(你需要一个专业帐户)。Poloniex 交易所提供免费的 ETH-USD 兑换服务。
我们将使用样条函数*似来*滑和插值转换率。这是因为交易事件的时间戳以秒为单位,而历史价格数据集的分辨率要低得多,它们*均每 30 分钟记录一次。因此,我们必须插入历史价格来涵盖交易事件。
图 2:历史汇率。红线:样条。
现在,让我们使用交易时价格的内插值,将怪异鲸交易的 ETH 转换为美元。
2.5 最终数据集
请注意,如果您无法从 EtherScan 下载所有数据,您可以加载 github 上的数据集。
这是最终数据集的样子:
3 分析
3.1 描述性统计
下面我们通过计算一些描述性统计数据对数据集进行总结:
表 1:数据集内容的汇总统计。
另一个有趣的练习—我们可以确定每个地址的事务数量。第一个地址(0x00..)不是一个真实的地址—它指的是 NFT 的铸造。其中的交易数量就是在区块链上注册的 NFT 的总数。此外,我们看到一些地址在交易怪异鲸鱼方面相当活跃,因为它们已经参与了数百次交易!
现在让我们把交易价格想象成时间的函数,而不考虑令牌 ID。在最初的几天,我们看到价格的高度可变性。接下来是一段相对*静的时期,我们在八月的最后几天看到了上升趋势的开始。随着怪异鲸鱼创造者的故事成为病毒,价格上涨恰逢社交媒体上的密集活动。一笔交易飙升至 25000 美元,与最初的 45 美元相比,这相当于增加了约 55555%!
图 3:怪异鲸 NFTs 交易的销售价格(美元)演变。
3.2 可视化网络
到目前为止,我们已经查看了交易价格摘要。现在,知道每个 NFT 都是独一无二的,需要与其他的区分开来,如何可视化事务呢?我们需要的工具是一个网络。我们收集的数据集非常适合绘制成网络。网络由顶点(或节点)和边(或链接)来描述。这里我们将对钱包地址使用节点表示。我们要构建的网络会显示所有曾经交易过怪鲸的钱包地址。顶点之间的连接,即所谓的边,将代表事务。
在 R 中有几个类和相应的包可以用来绘制网络,最著名的是网络和 igraph 。请查看参考资料部分,了解一些关于该主题的精彩教程。我个人偏好的是网络包,因为它提供了通过网络动态和 ndtv 包创建互动剧情的可能性。除此之外,还开发了其他的包来方便对这些对象的操作和绘制,例如gg graph包,它将熟悉的 ggplot2 框架引入到网络类中。
让我们试一试!我们将首先创建一个简单的静态(即没有时间维度)网络,并使用 ggraph 包绘制它。在一张图中显示的数据太多,因此我们将通过仅绘制涉及 7 个以上交易的 NFT 来划分数据子集。
我们现在可以绘制我们的网络。我们看到所有代币的所有交易都源自单个铸造地址(1)。一些地址涉及多个交易,这就是为什么我们看到这些交易有几个(弯曲的)边。我们还看到,一些令牌被传输到一个地址,但却被发送回发送方。
图 WheirdWhales NFTs 事务的静态网络。每个地址由一个节点(圆圈)表示,事务由边(线)表示。边缘颜色指的是令牌 ID。这里有一个高分辨率的图可用https://tdemarchin.github.io/DataScienceOnBlockchainWithR-PartII//DataScienceOnBlockchainWithR-PartII.html。
现在让我们使用事务的时间戳为我们的网络添加一个时间维度。这将允许我们可视化网络随时间的演变。为此,我们将使用令人惊叹的 networkDynamic 包。
我们可以创建一个时间线图来显示事务活动的频率。我们看到大多数(约 2/3)的交易发生在 NFT 诞生后不久。接下来是一个相对*静的时期,然后在 1000 点左右出现一个活动高峰。
图 5:显示事务频率的时间线图。
下面,我们创建一个可以直接从浏览器启动的动画。可以点击边和顶点来显示关于相关地址和交易令牌的更多信息。
图 6:whe ird wheels NFTs 交易的动画网络。每个地址由一个节点(圆圈)表示,事务由边(线)表示。边缘颜色指的是令牌 ID。可以点击边和顶点来显示关于相关地址和交易令牌的更多信息。互动版可用 此处 。
4 结论
希望您喜欢阅读这篇文章,并且现在对如何可视化区块链交易有了更好的理解。这里,我们展示了一个如何下载和绘制与 NFTs 相关的交易网络的例子。我们看到,一旦有了数据,分析和绘制交易就很容易了。另一方面,以适当的格式获取数据需要对区块链有深刻的理解,尤其是在使用智能合同时。
在接下来的文章中,我们将探索泰佐斯区块链,一个新的进行非功能性交易的地方。我们还可以挖掘氦区块链,这是一种物理分散的无线区块链供电网络,用于物联网(IoT)设备。如果你想了解更多,请在 Medium 、 Linkedin 和/或 Twitter 上关注我,这样你就会得到新文章发布的提醒。感谢您的阅读,如果您有任何问题或意见,请随时联系我们。
这篇文章的 HTML 版本带有高分辨率的数字和表格,可在这里获得。用于生成它的代码可以在我的 Github 上获得。
如果您希望帮助我们继续研究和撰写关于区块链的数据科学,请不要犹豫,向我们的以太坊地址(0 xf 5 fc 137 e 7428519969 a 52 c 710d 64406038319169)或 Tezos 地址(tz 1 ffzlhbu 9 adcobxmd 411 ufbdcvgrw 14 mbd)捐款。
敬请期待!
5 参考文献
由 Etherscan.io 和 Poloniex APIs 支持:
https://etherscan.io/
https://docs.poloniex.com/
常规:
https://ethereum.org/en
https://www.r-bloggers.com/
网络:
https://kateto.net/network-visualization
https://www.jessesadler.com/post/network-analysis-with-r/
https://programminghistorian . org/en/lessons/temporal-network-analysis-with-r
https://ggraph.data-imaginist.com/index.html
数据科学管道:窥视 Scikit-Learn 管道
原文:https://towardsdatascience.com/data-science-plumbing-peeking-into-scikit-learn-pipelines-f9233ad638e?source=collection_archive---------23-----------------------
实践教程
您是否想过如何从 scikit-learn 管道中提取信息?
照片由米卡·鲍梅斯特在 Unsplash 上拍摄
斯科特·a·亚当斯和阿莫迪尼·古普塔撰写
介绍
Scikit-learn 管道是非常有用的工具,可以为数据科学项目提供额外的效率和简单性(如果您不熟悉 scikit-learn 管道,请参见 Vickery,2019 获得详细概述)。管道可以在单个对象中组合和构建从数据转换到建模的多个步骤。尽管它们总的来说很有用,但是使用它们需要一个学习过程。特别是,窥视单个流水线步骤并从所述步骤中提取重要的信息片段并不总是最直观的过程。因此,我们写了这篇文章,作为创建一个简单管道并在其中获得几条相关信息的简要指南。
获取数据
我们使用加州住房数据,这是一个常用的实践数据集,提供了 1990 年加州的街区群体层面的住房市场信息(见 Géron,2017)。对于此工作流程,目标是使用 scikit-learn 管道生成一个线性回归模型,使用 3 个特征预测median_house_value
的目标:
median_income
——街区组家庭收入中位数(万美元),popbin
—区块组的分组人口分为 3 个四分位数(小,,大,),ocean_proximity
—区块群靠*海洋的程度( < 1H 海洋、内陆、*洋、*湾、岛)。
请注意,以下代码通过随机移除 10%的数据集值引入了人为缺失数据,以展示 scikit-learn 管道的插补实施。如果您运行此代码,请注意,由于缺失数据分配过程中的随机性,分配给缺失数据的实际观测值可能与您的数据不同。我们还将数据分为训练和测试数据,以更好地模拟实际的机器学习工作流程。有关将管道适当应用于训练和测试数据的更多信息,请参见 scikit-learn 入门页面。
设置管道
准备好数据集后,下一步是应用适当的数据转换,以便数据集可以在机器学习模型中使用。对于本文中使用的示例,我们使用[ColumnTransformer](https://scikit-learn.org/stable/modules/generated/sklearn.compose.ColumnTransformer.html)
估算器为多种数据类型实现数据转换过程,如插补、编码和缩放。
为了对数据集进行适当的转换,需要为不同的数据类型分别定义ColumnTransformer
估算器的转换步骤。在下面的示例中,为该数据集中的数值、序号和分类度量建立了不同的数据转换过程(有关数值、序号和分类度量方案的更多信息,请参见这里的),然后将它们合并到管道中。一旦建立,单独的数字、序数和分类数据转换管道就充当完整管道中ColumnTransformer
的步骤,其中完整 管道指的是结合数据转换和建模的管道。现在让我们仔细看看数据转换的步骤。
数字数据
如果决定估算数值数据中的缺失值(在本例中为median_income
),可使用SimpleImputer
估算缺失数据。在我们的例子中,我们使用中位数作为数值数据的插补值。处理完丢失的值后,是时候调整数值数据了。这里,[StandardScaler](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html)
将median_income
重新调整为*均值为 0,单位方差为。请注意,StandardScaler
在本例中用作说明,在真实世界的设置中,您可能想要尝试其他的变换技术如MinMaxScaler
,这取决于您的特征分布。
以下为有序列和分类列建立数据转换步骤的示例遵循与数值转换管道相同的总体结构,即缺失值插补后进行适当的转换。请注意,在所有这些步骤中,我们使用SimpleImputer
进行说明,但是根据您的数据,您可能会发现另一种处理缺失数据的技术更合适。
序数数据
SimpleImputer
可以用各个列中出现频率最高的值来填充缺失的数据,这对于像popbin
这样的顺序列很有用。在输入丢失的值之后,我们使用[OrdinalEncoder](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OrdinalEncoder.html)
对popbin
列进行顺序编码,这样转换后的列呈现从 0 到 *k-1、*的整数值,其中 k 是原始popbin
列中唯一值的数量。
分类数据
一键编码为分类列中的每个唯一值创建一个新列。然后,给定的观察值在对应于原始分类列中的观察值的列上被编码为值 1,并且在从原始分类列生成的所有剩余列上被编码为值 0。
我们从下面的SimpleImputer
开始分类转换过程,用新的字符串值'missing’
填充ocean_proximity
上所有缺失的值。输入缺失值后,OneHotEncoder
会对ocean_proximity
列进行一次热编码,这也会为新输入的'missing'
值创建一个单独的列。
安装管道
一旦为每种数据类型定义了上述步骤,这三个单独的数据转换管道就被聚合到transformer_steps
中,然后在ColumnTransformer
中被声明为transformers
参数。
我们现在可以创建完整的管道,包括标记为'transformation’
的ColumnTransformer
步骤和标记为'linreg'
的线性回归模型步骤。然后需要在训练集上拟合完整的管道,我们可以将这个拟合的管道分配给一个名为lm
(用于“线性模型”)的变量。
这条管道里塞满了信息!让我们看看可以提取的一些最重要和最有用的信息。
闯入管道
查看管道的所有步骤
我们刚刚构建了一个漂亮的管道,但是有没有一种方法可以在不参考建立管道的代码的情况下看到管道的所有步骤呢?还好答案是肯定的!我们所要做的就是将named_steps
应用到安装好的管道的名称上(将steps
应用到管道上也将提供必要的输出,只是格式略有不同)。
不幸是,管道输出并不容易阅读。作为替代,我们可以将管道打印成 HTML 文件,并使用以下代码在 web 浏览器中查看。
这是呈现的 HTML 文件的样子。
现在让我们更深入地看看在各种管道步骤中使用的实际标签和值。
获取数值和序数数据的插补值
挖掘管道的一个原因是提取数值和序数数据的估算值。让我们从数字列开始,其中中值用于替换缺失的数据。Pipeline
属性named_steps
输出一个类似于字典的对象的键值对,帮助我们解析管道中的步骤,而ColumnTransformer
属性named_transformers_
输出一组键值对,帮助我们解析ColumnTransformer
中的步骤。对于这个例子,用于识别数字列转换的步骤名为num
。因此,从num
步骤调用imputer
会输出用于数字列的插补信息。
要查看用于估算缺失数字数据的实际值,我们可以从imputer
调用statistics_
属性。
通过将named_transformers_['num']
中的num
替换为ord
,上述代码也可用于获取用于估算序数列popbin
中缺失数据的值。
请注意,由于为数据分配缺失值的随机性,插补步骤和一些后续步骤的输出可能会略有不同。
获得用于标准化的*均值和方差
如下面的代码所示,为数值列提取标准化步骤中使用的*均值和方差值与前面从数值转换器的数值步骤中提取中值的步骤非常相似。我们只需要将imputer
替换为normalize
,将statistics_
替换为mean_
或var_
。
提取数字列和序号列的功能名称
ColumnTransformer
有一个transformers_
属性,它为每个匹配的转换器返回一个元组,由(1)转换器的标签,(2)转换器本身,以及(3)应用了转换器的列组成。
数字列和序号列的特征名提取的目标是对输出进行切片,以获得数字列和序号列的名称。
数字列:因为我们将
num
指定为transformer_steps
的第一个元素,所以num
transformer 管道是transformers_
输出中返回的第一个元组。感兴趣的实际列名是给定转换器的元组中的第三项,因此我们需要输出第一个transformers_
元组([0]
)的第三项([2]
,如下所示(记住 Python 是零索引的)。顺序列:顺序转换器是
transformers_
输出的第二个元组,这里使用的顺序列名是这个元组中的第三项。
提取独热编码列的功能名称
这个有点不同,因为 one-hot 编码用指定变量中每个类别的一组新列替换了原来的分类列。幸运的是,OneHotEncoder
有一个方法get_feature_names
,可以用来获得描述性的列名。所以这里的目标是首先在数据转换管道中访问OneHotEncoder
,然后调用get_feature_names
。
为了使列名前缀更具描述性,我们可以将原始的一键编码变量的列名作为参数传递给get_feature_names
。
查看回归模型的系数
LinearRegression
有一个属性coef_
,存储回归系数(关于线性回归的概述以及如何解释回归系数,请参见。因此,要查看系数,我们需要从整个管道访问linreg
步骤,并调用coef_
属性。
同样,请注意,由于为数据分配缺失值的随机性,您的输出可能会略有不同。
结论
Scikit-learn 管道是组织和有效执行数据转换和建模任务的好工具。正如我们自己的经验所表明的,有时候从管道的各个步骤中提取特定的信息是有帮助的,这也是我们写这篇文章的动机。例如,我们可能想要创建一个定制的表/特性重要性结果的可视化,需要提取列名(包括单个的独热编码列名)和模型参数。或者,我们可能正在起草一份关于模型的报告,需要包括用于在插补步骤中替换缺失数据的方法或中位数。或者,也许我们只是好奇,想看看流程中特定步骤的结果。在这些场景中,知道如何从管道中的特定步骤中提取相关信息将被证明是有用的。
感谢您花时间阅读这篇文章。你可以在活页夹上的 Jupyter 笔记本中运行全部代码。如果你觉得这篇文章的内容有用,请留下一些掌声。此外,请随时提出任何建设性的意见。
参考
Géron,A. (2017)。使用 Scikit-Learn 和 TensorFlow 进行动手机器学习:构建智能系统的概念、工具和技术。奥莱利媒体。
Vickery,R. (2019 年 2 月 5 日)。sci kit-learn 管道的简单指南。维克数据。https://medium . com/vick data/a-simple-guide-to-sci kit-learn-pipelines-4 ac0 d 974 bdcf
本文提供的内容由作者开发,不一定反映任何其他个人、实体或组织的观点。任何错误和遗漏都是我们自己的。
从雇主的角度看数据科学产品组合
原文:https://towardsdatascience.com/data-science-portfolio-from-employer-point-of-view-840a111a96c9?source=collection_archive---------14-----------------------
公司希望从您的数据科学产品组合中获得什么?
凯利·西克玛在 Unsplash 上的照片
如果你喜欢我的内容,并想获得更多关于数据或作为数据科学家的日常生活的深入知识,请考虑在这里订阅我的时事通讯。
*年来,公司意识到利用他们的数据来获得对竞争对手的优势是多么重要。从公司、初创公司到小型企业,都已经开始使用数据项目来改善他们的业务。这反过来又增加了对合格数据人员的需求,这种需求直到现在还在持续增长。
随着热门行业的兴起和需求的增加,许多人试图学习数据科学以进入这一领域-这造成了激烈的竞争。为什么需求增加,但竞争仍然激烈?因为这个领域还是新的,许多公司都在寻找有经验的人,而不是更新鲜的人。这也是为什么数据科学岗位入职岗位成为瓶颈的原因。那么,你如何在申请者的海洋中脱颖而出呢?一种方法是调整你的投资组合,以满足雇主的需求。
在本文中,我想概述一下我从潜在申请人数据科学组合中寻找什么的经历。让我们开始吧。
结构化投资组合
有什么比看到一堆乱七八糟的数据科学作品集更让人不爽的?故事不清楚,结论也不存在——如果您让所有的编码和数据探索组合保持原样,就会发生这种情况。乱七八糟的项目是我经常看到的问题:人们已经知道你想做什么样的数据科学项目,并试图解决;然而,他们没有从你的投资组合中创建一个结构,让人们能够消化这个过程。
例如,一个人想要通过创建一个模型来预测欺诈并实现良好的指标,从而解决欺诈问题。由于这种欺诈模式,此人设法获得了面试机会,但没有形成一个关于该模式如何发展以及如何帮助公司的良好结构故事。这个人没有得到聘用,因为面试官觉得这个人不能清楚地解释工作流程,并担心这个人在工作期间会一团糟。
这个例子在我的经历中很常见。人们只是关注他们的结果,而不是详细说明过程——根本没有结构。雇主想看的不是你创造的模型有多好,而是你实现这个模型的思维过程。创建结构化数据科学产品组合以脱颖而出非常重要。
结构可以是多种多样的,取决于您自己的数据科学项目。然而,它应该总是从头到尾讲一个故事——即使它在你的笔记本里。常见的结构是:
- 解释你想解决的问题
- 解释这些数据以及你是如何获得的
- 数据探索
- 建模过程
- 结果和结论
通过这五个步骤,您已经可以创建一个结构良好的数据科学投资组合。你可以使用 presentation、Git、Notebook 或任何媒介来创建它——只要它讲述了一个好故事。在我看来,如果你能通过应用你的项目解释详细的好处,那就是加分。
解决业务问题
开发一个惊人的神经模型,可以准确预测某人的面部特征和穿着,这是一种很棒的感觉,但这个项目能解决你申请的公司的任何实际问题吗?有可能,但会有很多延伸——这不太可能出现在当前的面试阶段。
该公司聘请数据科学家来解决他们的业务问题,而每个公司都会有不同的问题。招聘广告通常只列出技术要求(有些是特定领域的),但很少详细说明他们需要解决什么样的问题。当你用一般的投资组合申请这种工作时,它可能会起作用,但也可能不起作用;因为许多申请人会提交“相似”的简历和数据科学作品集。
那怎么脱颖而出呢?成为公司想要的!那就是解决他们的业务问题。尝试创建解决业务问题的特定数据科学产品组合;例如,您申请金融行业的数据科学家职位,这意味着您可以创建一个数据科学组合来解决该行业的常见问题,如投资、欺诈、风险等。
我喜欢看到申请人至少对他们申请的公司做了调查,因为他们做的调查意味着他们愿意花额外的时间去了解这家公司。与不了解业务或公司的人相比,雇佣了解业务或公司的人肯定符合公司的最佳利益,这就是为什么如果您的数据科学产品组合解决了公司的业务问题,它会让您脱颖而出。
有创意
这与您的数据科学产品组合应该如何解决业务问题有关。当你决定你的项目时,不要使用你从课程或书本上学到的固定项目 —相反,你应该基于你自己的创造力建立数据科学组合。
想象一下,你正在用泰坦尼克号或 iris 项目申请银行行业的数据科学家职位;会是什么样子?
**首先,**这是每个人都做的项目。
**其次,**那些项目不需要商业(也许是历史学家或生物学家?).
第三,这会破坏你的机会,因为雇主会认为你懒惰。
您可以做许多其他项目来展示您在构建数据科学组合时的创造力。创意可以通过多种方式表现出来,包括:
- 你试图解决什么商业问题
- 你如何处理这个问题
- 你探索数据和总结见解的方式
- 开发模型并解决技术问题
- 对您的数据科学产品组合做出总结
还有很多。创造力意味着你不局限于课程或惯例,而是你如何从中突破。
根据我的经验,当我探索申请人的数据科学产品组合时,我会尝试观察他们如何解决他们决定解决的问题。许多人倾向于陷入类似的模式,但是当我发现有人可以给我不同的东西(以一种好的方式),我会变得兴奋。
我记得许多申请人使用类似的数据集作为他们的数据科学组合,并试图解决相同的问题;然而,只有一个脱颖而出。他之所以突出,是因为他总结见解的方式与众不同。许多人把洞察力总结为特性并不重要。尽管如此,这个人设法做了更深入的分析,并发现实际问题在于复合问题——这需要创造性思维才能知道这就是问题所在。
在某种程度上,创造性可能需要更多的练习,因为它与批判性思维有关。尽管如此,一旦你习惯了从多方面看问题,我确信许多雇主会渴望你的创造力。
结论
数据科学是一个仍在崛起且竞争激烈的行业。要成功获得该职位,您需要有一个良好的数据科学组合。然而,雇主从你的投资组合中寻找什么?
在本文中,我从雇主的角度解释了我从数据科学组合中寻找的经验。它们是:
- 结构化投资组合
- 解决业务问题
- 有创造力
希望有帮助!
如果您不是作为中等会员订阅,请考虑通过 我的推荐 订阅。
在我的 LinkedIn 或 Twitter 上访问我。
数据科学产品经理应该影响变更管理
原文:https://towardsdatascience.com/data-science-product-managers-should-influence-change-management-fb3159dc631e?source=collection_archive---------28-----------------------
产品经理应采取的 4 项关键行动,以推动数据科学项目的成功采用
弗兰基·查马基在 Unsplash 上拍摄的照片
COVID 和高级分析功能给零售业务带来了颠覆性的变化,原本需要几年时间才能实现的功能现在只需几个月就能推出。一如既往,商业界将人工智能视为应对零售业所有挑战的灵丹妙药。尽管商业模式正在被颠覆,但一个不变的因素将永远是人以及他们是否有能力适应新的工作方式。采用数据科学算法不仅仅是转向一项新技术,它还涉及思维和问题解决方式的改变。虽然数据科学被用作解决所有问题的通用短语,但激励企业重新思考他们开展业务的方式并采纳分析建议仍然具有挑战性。通常在项目管理路线图中,有一个单独的泳道来关注变更管理。确保产品采用的责任完全在于商业利益相关者和变更管理组织。但是,由于迫切需要实施事实驱动的建议来提高准确性,将变更管理视为单独的活动而不是基本的产品管理责任将导致时间表延迟和采用率降低。
已经有多个公司在人工智能上投入巨资的案例,只是建立了一个原型,很少投入生产。这主要是因为业务部门不愿意让算法做出影响损益的决策。尽管在业务构思会议上花费了大量时间来研究问题并研究合适的模型来推荐解决方案,但情况仍然如此。数据科学产品经理在弥合业务和工程之间的差距时,应在项目早期积极考虑变更管理,并在流程的每个步骤中继续扮演业务客户的角色,以提高采用率。
**与能够支持您的产品的业务用户建立关系:**虽然定期与业务利益相关方进行演示是一种常态,但产品经理应该与能够影响其同行并为数据科学建议带来更多可信度的业务用户保持更多接触。仔细选择在其业务领域有广泛背景的用户,并继续经常与他们接触。与业务客户召开小组会议,了解他们对数据科学建议的疑虑。在绞尽脑汁想出解决方案之前,真诚地倾听并从他们的担忧中学习。拥抱这学习的时刻;打开思维,从借给你的商业光学中去看世界,将有助于从商业中获得信任。建立这种伙伴关系并说服这些业务冠军对于产品推出期间更广泛的认同至关重要。
**在算法中建立透明度:**业务用户对使用分析推荐持怀疑态度的原因之一是,逻辑对他们来说是一个黑箱。安排多次会议来解释细节只会增加业务团队对这种转变的挫败感。对算法透明绝对不意味着让用户浏览 python 代码。为了创建正确的约定并理解算法,构建输入变量和输出的可视化表示是有帮助的。一个好的叙事完全没有深奥的分析典故,更粗略是有效的。一个组织良好的分析可视化表示有助于业务涉众快速确定这个框架是否符合需求。熟悉启发法对于长期以来以某种方式做事的商业用户来说可能是创新的障碍。突出相关性和趋势的视觉效果可能是一个良好的开端。根据不同的用例,建立一个建议的概念验证,并允许用户使用假设场景,可以说服他们重新考虑他们的方法。最终提出能引起利益相关者强烈共鸣的见解是在用户中建立信心的关键,高级分析模型可以基于电子表格无法实现的多个信号提供更精确的输出。
**筑小胜:**投资机器学习项目,应该认为是一次远征;为了使这一旅程的成果更加丰硕,需要在数据分析、数据科学家的研究以及机器学习工程师的扩展和优化方面投入更多的时间和资金。但是,对于希望在短时间内进行彻底战略变革的组织来说,等待成熟的数据科学模型似乎不是一个有吸引力的解决方案。为了建立可信度,可以设定一些小目标,专注于实现长期数据科学战略的某个方面。如果最终目标是建立一个预测需求的机器学习模型,请与数据分析师合作,在一个月内推出时间序列模型,而数据科学家则研究影响需求的外部因素。不要等待工具通过高级分析来自动化业务流程,而是构建一个 power bi 或 tableau 报告,向业务用户展示数据科学见解。看到结果而不被迫使用分析建议将大大减少阻力,并允许用户以自己的速度摄取输出;同时还向数据科学家提供反馈。
**构建强大的数据驱动文化:**在当今的环境中,业务用户精通数据并掌握分析知识并不罕见。尽管人们对数据科学感兴趣,但对于它所带来的破坏,总会有一些尖刻的怀疑。此外,在业务用户已经在应对大量创新的组织中,在他们的流程中引入分析模型将被视为增加了复杂性。即使有更有效的改进流程,动摇稳定的日常程序也会产生怨恨和抵触情绪。虽然发现会议和设计思维研讨会将有助于数据科学和产品团队了解当前的业务流程和战略,但业务用户接受分析解决方案培训也很重要。促进面向业务用户的分析 101 会话,该会话涵盖监督与非监督模型的基础知识,可以帮助获得一些兴趣。产品经理可以与数据分析师合作,提出与业务相关的数据集,用于演示简单的聚类或回归分析。为业务用户配备易于使用的 BI 工具,如 SAS enterprise miner 或 Alteryx,并指导他们建立预测模型,也有助于突出采用先进的机器学习算法的好处,该算法基于多个数据信号进行推荐,而不是基于历史 KPI 进行简单分析。
成功的产品管理之旅不会止步于产品实施,而是追求并实现 100%的采用率和目标投资回报率。业务合作对于任何新技术都至关重要,但对于数据科学项目来说尤其重要,因为数据科学项目会挑战业务用户快速而直观的思维,有时甚至会推翻这种思维。在商界找到一个能够游说这项事业的盟友是很重要的。第一步是通过倾听和向你的商业伙伴学习来建立信任。通过展示视觉效果来简化数据科学的各个层面,让企业了解解决方案并增强信心。关注短期行动,通过推出概念证明和仪表板在用户群中建立信誉。摆脱推动前数据科学时代进程的认知偏见和 1 型思维并不容易,但通过分析培训使分析技能集民主化将允许用户自己创造挑战其方法的见解。这反过来又建立了一种事实驱动的文化,这种文化将对新的工作方式和发现洞察力更加开放。
数据科学项目—营销分析和数据驱动的解决方案
原文:https://towardsdatascience.com/data-science-project-marketing-analytics-data-driven-solutions-72d050084642?source=collection_archive---------1-----------------------
使用 Python 进行 EDA、执行统计分析、可视化洞察,并向公司的首席营销官展示数据驱动的解决方案
作者照片
语境
“我是一名数据分析师,首席营销官告诉我,以前的营销活动没有达到预期的效果。我需要分析数据集来理解这个问题,并提出数据驱动的解决方案。”-上下文从到这里进行了解释和调整。
(澄清:以上内容引自并调整自 Kaggle 数据集。我想把这个项目的背景、想法和许多灵感归功于这个 Kaggle 数据集提供商。感谢分享这个令人惊叹的项目创意和与之相关的背景资料!)
数据集概述
这个项目的数据集由 Omar Romero-Hernandez 博士提供。它被授权为 CC0: Public Domain,声明“你可以复制、修改、分发和执行该作品,即使是出于商业目的,都无需征得许可”你还可以在这个 Kaggle 页面上看到许可状态并下载该数据集。
分析过程
1.评估和清理数据
2.探索性数据分析
3.执行统计分析
4.数据可视化和进一步分析
5.形成数据驱动的解决方案
6.向公司的首席营销官做 8 分钟的陈述
注意:本文不是要解释每一行代码,而是每个分析步骤中最重要的部分。因此,您可能会发现一些部分只是对结果的描述。如果你对代码本身感兴趣,请在这里勾选https://github.com/YuehHanChen/Marketing_Analytics。
步骤 1:评估和清理数据
我们先来看特征信息:
- ID:客户的唯一标识符
- Year_Birth:客户的出生年份
- 教育:客户的教育水*
- 婚姻状况:客户的婚姻状况
- 收入:客户的家庭年收入
- 儿童之家:客户家庭中的儿童数量
- Tennhome:客户家庭中青少年的数量
- Dt_Customer:客户在公司注册的日期
- 最*:自客户上次购买后的天数
- MntWines:过去两年在葡萄酒上花费的金额
- 水果:过去两年在水果上花费的金额
- MntMeatProducts:过去两年在肉类上花费的金额
- MntFishProducts:过去两年在鱼上花费的金额
- MntSweetProducts:过去两年在糖果上花费的金额
- MntGoldProds:过去两年在黄金上花费的金额
- NumDealsPurchase:打折购买的数量
- NumWebPurchase:通过公司网站购买的次数
- NumCatalogPurchase:使用目录进行购买的次数
- NumStorePurchase:直接在商店购买的数量
- NumWebVisitsMonth:上个月公司网站的访问量
- AcceptedCmp3:如果客户在第三次活动中接受了报价,则为 1,否则为 0
- AcceptedCmp4:如果客户在第四次活动中接受了报价,则为 1,否则为 0
- AcceptedCmp5:如果客户在第五次活动中接受了报价,则为 1,否则为 0
- AcceptedCmp1:如果客户在第一次活动中接受了报价,则为 1,否则为 0
- AcceptedCmp2:如果客户在第一次活动中接受了报价,则为 2,否则为 0
- 回答:如果客户在上一次活动中接受了报价,则为 1,否则为 0
- 投诉:如果客户在过去 2 年内投诉,则为 1,否则为 0
- 国家:客户所在地
这个数据集有 28 列,2240 行,0 个重复行。
作者照片
作者照片
评估数据后,我发现了几个问题:
1.在收入栏名称前面有一个空格
2.有美元符号的是收入栏的数值
3.“收入”列有 23 个缺失值
4.收入的类型是字符串
5.Dt_Customer 的类型是字符串
因为数据清理不是这个项目的主要部分,所以让我们进入下一步。(你可以在这里找到清理这些问题的代码)
步骤 2:探索性数据分析
在这个数据集的 Kaggle 页面中,有一些数据发布者建议遵循的 EDA 方向,我决定选择以下三个问题进行探讨:
- 有没有异常值?你将如何处理他们?
- 有没有什么有用的变量可以用给定的数据来设计?
- 你注意到数据中的任何模式或异常吗?你能画出它们吗?
现在我们一个一个来看问题。
1。有没有异常值?你会如何处理他们?
我使用箱线图来可视化所有的数字特征,它将显示数据的 5 个数字:不是异常值的最小数字,Q1(第 25 个百分点),Q2(第 50 个百分点),Q3(第 75 个百分点),以及不是异常值的最大数字。
作者照片
许多列都有异常值,但大多数看起来像是来自总体的自然异常值。相比之下,Year_birth 中的异常值似乎是输入错误,因为 1900 年之前出生的人不可能还活着。因此,我将删除 Year_birth 中的异常值。
异常值意味着它们低于或高于*均值的 3 个标准差。
作者照片
2。有没有什么有用的变量可以用给定的数据来设计?
在评估数据集之后,我列出了我认为对最后的分析有用的新特性。例如,如果我们知道普通人成为客户的*均月份和星期几,那么当我们在那一天或那一个月开展活动时,它可能有助于增加更多的首次客户。
- Join_month:该人成为客户的月份,可以从“Dt_Customer”设计
- Join_weekday:这个人成为客户的那一天,可以从“Dt_Customer”设计
- Minorhome:他们家未成年人总数,可以通过 Kidhome 和 Teenhome 相加获得。
- Total_Mnt:最*两年花费的总金额,可以通过合计所有与“Mnt”相关的列获得
- Total_num_purchase:最*两年采购的总次数,可以通过将所有与“num”相关的列相加得到
- Total_accept:客户在所有营销活动中接受报价的总额,可以通过合计所有与“接受”相关的列和“回应”列来获得
- “AOV”:AOV 代表每个客户的*均订单量,可以通过将总数量除以总购买数量来计算
作者照片
3。你注意到数据中的任何模式或异常吗?你能画出它们吗?
我们可以使用热图来查看每个变量之间的相关性。当天气变得更蓝时,它们更正相关,当天气变得更红时,它们更负相关。
作者照片
调查结果:
图案: 1。高收入人群倾向于花费更多,购买更多。
—倾向于比其他人更少地访问公司网站。
—倾向于购买少量打折商品
2.家里有孩子的人倾向于少花钱,少购物。
—倾向于购买大量打折商品
3.*均订单量高的人
——倾向于购买更多的葡萄酒和肉制品
——倾向于使用目录进行大量购买
——倾向于不访问该公司的网站。
异常: 1。凭直觉,我认为顾客的投诉越多,他们在我们商店的消费可能就越少,但过去两年的投诉数量与过去两年的总消费金额几乎没有相关性。= >进一步调查数据后,我发现是因为我们最*两年投诉的客户只有 20 个,但我们总共有 2200 个客户。所以,因为不*衡的比例,它们没有关联。公司的客户服务部在过去的两年里工作出色。
第三步:进行统计分析
在这个数据集的 Kaggle 页面中,有一些数据发布者建议回答的统计分析问题,我决定选择以下三个问题进行探讨:
- 哪些因素与店铺购买次数显著相关?
- 你的主管坚持认为买黄金的人更保守。因此,在过去 2 年里购买黄金数量高于*均水*的人会有更多的店内购买。使用适当的统计测试证明或反驳这种说法
- 鱼含有对大脑有益的欧米伽 3 脂肪酸。因此,“已婚博士候选人”与花在鱼上的钱有显著关系吗?
现在我们一个一个来看问题。
1。哪些因素与店铺购买次数显著相关?
我们可以使用随机森林来预测商店购买,然后利用模型的功能重要性分数来对因素进行排序。
结果:
*均绝对误差:0.78703125
均方误差:1.4546007812500001
均方根误差:1.
NumStorePurchases 的范围是 13,均方根误差只有 1.2(不到范围的 10%),这意味着它是一个可靠的模型。
现在,让我们使用 random forest 的功能重要性分数来查看哪些因素对 NumStorePurchase 的影响最大。
我们现在可以看到前 7 个因素是
1\. Average order volume
2\. Total amount spent in the last two years
3\. Total number of purchases in the last two years
4\. Amount spent on wine in the last 2 years
5\. Number of purchases made using a catalog
6\. Number of visits to company's web site in the last month
7\. Total number of purchases through website in the last two years
但是,我们无法判断每个因素与商店购买次数是正相关还是负相关。我们可以用 SHAP 来解释。
有一篇由塞缪尔·马赞蒂写的著名文章解释了什么是 SHAP。请点击查看。
作者照片
调查结果:
- 商店购买次数随着更高的总消费金额(Total_Mnt)、更高的总购买金额(Total_num_purchase)、更高的 AOV 和更高的葡萄酒购买金额(MntWines)而增加。
- 商店购买次数随着网站访问量(NumWebVisitsMonth)、通过目录购买次数(NumCatalogPurchases)和通过网站购买次数(NumWebPurchases)的增加而减少。
总结:主要在商店购物的人倾向于购买更多的葡萄酒,*均订单量更高,通过互联网或目录购物的人更少。
2。你的主管坚持认为买黄金的人更保守。因此,在过去两年里,在黄金上花费高于*均水*的人会有更多的商店购买。使用适当的统计测试证明或反驳这种说法。
为了从统计上验证这一说法,我们需要使用相关性测试来查看 MntGoldProds 和 NumStorePurchases 是否正相关。首先,让我们看看这两个变量的散点图。
作者照片
正如我们所看到的,有一个非常模糊的趋势,即随着 MntGoldProds 的增加,NumStorePurchases 也会增加。现在,让我们看看相关性测试。
Pearson correlation (r): 0.38326418634704296
Pearson p-value: 3.4668974417790955e-79
我们得到的皮尔逊相关系数为 0.38,p 值几乎为零,这表明它们在统计上是显著的,并且具有正相关性**。(如果 p 值为> 0.05,我们将无法拒绝零假设,因为它们不相关。)**
3。鱼含有对大脑有益的欧米伽 3 脂肪酸。因此,“已婚博士候选人”与花在鱼上的钱有显著关系吗?
为了从统计上验证这些,我首先将数据分为两组。一个是已婚博士群体,其余的。然后,我们可以用一个箱线图来可视化这两组,看看他们是否不同。最后,我们可以使用 t 检验来检验它们的*均值是否相似。
作者照片
该图显示,其余客户在鱼产品上花费更多,因为其第 50 百分位高于已婚博士组。现在,让我们来看看 t 检验。
T-test p-value: 0.005297012242158541
由于 p 值小于 0.05,我得出结论,我们拒绝零假设,这意味着他们的均值是不同的,但已婚博士的均值低于其他人,从图表中可以看出。
步骤 4:数据可视化和进一步分析
以下是我将使用数据可视化探索的问题:
- 哪个营销活动最成功?
- 这家公司的普通客户是什么样的?哪些产品表现最好?
- 调查最成功的活动与其他活动在客户特征和购买行为方面的差异。
现在我们一个一个来看问题。
1。哪个营销活动最成功?
作者照片
回应是指最后一次营销活动,也是最成功的一次。除了第二次竞选,它的表现几乎是前两次竞选的两倍。
2。这家公司的普通客户是什么样的?哪些产品表现最好?
使用后。均值(),我发现一个普通客户…
- 年收入为 52200 美元
- 49 天前购买的
- 拥有 26.8 美元的 AOV
- 已经花了 605 美元
- 已经购买了 20 次
- 6 月中旬成为客户
- 周四成为顾客
- 花在葡萄酒上的钱最多(300 美元),其次是肉制品(165 美元)
- 在水果(26 美元)和甜食(27 美元)上花费最少
3。调查最成功的活动与其他活动在客户特征和购买行为方面的差异。
现在我们已经知道最后一个活动是最成功的,我们可以进一步调查最成功的活动、最后一个活动以及活动 1-5 中其他活动之间的客户特征和购买行为(如下所列)的差异。
****
作者照片
与前几次活动吸引的客户相比,上一次活动在 AOV、花费总额和购买总量方面吸引了更多有价值的客户。
就产品类别而言,上一次活动的顾客在肉制品和葡萄酒上的花费是前一次活动顾客的*两倍。
关于购买渠道,上一个活动中的客户通过商店、网站和目录购买的更*均,而前一个活动中的客户主要通过商店和网站购买。
上一个活动中的客户比上一个活动中的客户多挣 20%的工资。
让我们看看每个国家从以前的运动到最成功的运动的比例变化。
作者照片
西班牙的顾客相对较多(增加了 4%),而印度吸引到上一次活动中的顾客较少(减少了 3%)。
第 5 步:形成数据驱动的解决方案
让我们回顾一下这个项目的主要目标
我是一名数据分析师,首席营销官告诉我,以前的营销活动并不像预期的那样有效。我需要分析数据集来理解这个问题,并提出数据驱动的解决方案。
为了形成数据驱动的解决方案,我首先总结了从分析中获得的所有见解,然后利用这些见解形成了可操作的策略。
见解总结:
1 .上一个战役的表现几乎是前几个战役的两倍
与前几次活动吸引的客户相比,上一次活动在 AOV、花费总额和购买总数方面吸引了更多有价值的客户。
西班牙的顾客相对较多(4%),印度的顾客较少(3%)
就产品类别而言,上一次活动的顾客在肉制品和葡萄酒上的花费是前一次活动顾客的*两倍。
就购买渠道而言,上一次活动的客户通过商店、网站和目录购买的比例更*均,而前一次活动的客户主要通过商店和网站购买。
上一个活动中的客户比上一个活动中的客户多挣 20%的工资。
2 .大多数客户通过实体店购买,在那里人们倾向于每次购买花费更多。原因可能是当顾客在商店里看到其他类似的产品时,他们会更冲动地购买。
3。家里有孩子的人是不太有价值的顾客,因为他们……
倾向于减少购买
倾向于购买大量打折商品
4。普通顾客……
成为周四的顾客
6 月中旬成为客户
可行的数据驱动解决方案
关于收购:
- 继续使用上次活动中相同的营销技巧,但重点是推广肉制品和葡萄酒
- 在西班牙投入更多营销预算,在印度投入更少
- 在周四有一个品牌折扣日,或者在六月有一个品牌折扣月来吸引新顾客
关于增加收入:
- 开展营销活动,将主要在网站或目录上购物的客户转化为店内购买者,因为大多数店内购买的*均订单量很高。
- 建立忠诚度计划,让高收入客户尽可能长久地保持忠诚度
第六步:给公司的首席营销官做一个 8 分钟的陈述
我在这个视频中也解释了这个数据集的背景和基本信息,所以如果你想看演示,请跳到 2:20。
https://www.youtube.com/watch?v=3Nij8BCQ0ig
谢谢你看完!如果你对这个项目的完整代码感兴趣,请查看 my Github 。另外,我喜欢反馈。如果有任何不清楚的地方或应该做得更好的地方,请联系我。这是我的 LinkedIn 或者通过我的电子邮件联系我(yuehhanchen@gmail.com
数据科学项目,以提高您的业务理解
原文:https://towardsdatascience.com/data-science-project-to-improve-your-business-understanding-776386abbf63?source=collection_archive---------7-----------------------
业务是数据科学的核心
斯科特·格雷厄姆在 Unsplash 上拍照
数据科学项目总是与改进业务流程有关。改善可以是任何方面——增加收入、消除滞后时间、留住客户等。您的数据科学项目总是将改进作为您需要实现的主要 KPI。
问题是,我看到的许多数据科学教育都不足以解决业务理解部分。大多数时候,这是一种事后的想法,学生被引导专注于编程和机器学习部分。这是一个遗憾,因为商业理解技术无疑会帮助学生更容易地获得数据就业。
我不是在谈论理解整个商业领域,因为这需要大量的经验,而且每个组织都是独一无二的。我更关注的是数据科学家的心态,只关注技术部分,不考虑业务。你可以拥有世界上最好的模型,但如果这个模型没有考虑到商业方面,那它就是无用的。
业务理解是理解我们的数据科学项目如何影响业务的过程;这意味着我们需要获得尽可能多的信息来构建我们的数据科学项目。在实际业务中,我们总是可以与业务用户讨论,以获得更好的洞察力。我们可以询问的信息示例:
- 什么是业务目标,我们如何衡量这个目标?
- 业务流程是什么样的?
- 数据集位于何处?
- 我们是否需要一个机器学习模型,或者简单的统计学就足够了?
- 使用该模型会引发任何隐私或道德问题吗?
我们还可以问更多的问题。这是转换齿轮对我们的工作至关重要的时候。
因为我希望每个人都有商业思维,所以我想举一个项目实践的例子来提高你的商业理解能力。对业务的理解可能不像编程或统计那样技术性,但你可以为此接受培训。这就是为什么本文中介绍的所有项目都很简单,但是我们会从不同的角度来看待它们。让我们开始吧。
旅游保险客户线索
我们要处理的项目是旅游保险客户线索。预测哪些客户有兴趣购买产品是经典的数据科学项目之一,但它仍然受到每个公司的追捧。每个公司都需要他们的客户作为收入来源;这就是为什么预测项目适用于所有公司——反过来,这也是一个学习商业理解的好项目。
对于客户导向项目示例,我将使用来自 Kaggle 的数据集。该数据集旨在**建立一个预测模型,预测哪些客户有兴趣购买旅游保险。**许多人最初会想探索数据并创建分类模型,但在实际业务中,我们会从业务理解部分开始。
旅游保险客户线索
你可能会想,“我不是保险行业的,对这个领域不感兴趣,我怎么可能做业务理解呢?”—没错,要进行深入的商业分析,你可能需要这个行业的经验;然而,这并不意味着我们不能实践和创造性地理解我们不属于的业务。
商业假设
通常,我们会与业务用户一起工作,但是我们没有业务用户;我们可以询问我们案例中的业务问题。让我们利用现有的有限信息,尝试根据这些信息做出假设。我们可以从数据集获得的业务上下文是:
- 该公司是一家提供旅游保险套餐的旅游公司。
- 新的一揽子保险还包括新冠肺炎保险。
- 该公司想知道哪些顾客会购买旅游保险套餐。
- 所用数据来自 2019 年客户历史数据。
商业理念看似简单;用户想要一个机器学习模型来预测客户是否会对旅游保险感兴趣。然而,根据我们掌握的信息,你认为**这个想法有什么问题吗?**我已经发现了一些问题。
例如,我们指的是新客户还是现有客户?旅游保险套餐的什么细节?你会为这份保险卖多少钱?企业会有具体的活动吗?还有很多我能想到的问题。你也可以试着自己去找其他人。
我们可以根据手头的信息进行假设,并做出创造性的猜测来回答前面的问题。假设客户是现有客户,目标客户是收入较高的常旅客。那么,如果企业已经有了这个目标,目标预测会改变吗?绝对的。标记目标定义变得不同,您需要重新定义它。这是现实商业世界中通常会发生的事情。
商业理解实践
这里我想强调的是简单的想法并没有那么简单。开发机器学习模型很容易,但你总是需要考虑业务方面。这是一个商业理解练习,使用我可以给你的数据集。
- 尝试假设业务流程。如果太难,尝试简单的,如业务市场目标和保险价格。如果你做一些研究,假设整个过程会更好。
- 选择具有商业合理性的建模特征。例如,毕业与否,根据教育水*将某人排除在旅游保险之外可以吗?这只是为了实践,但我们在为机器学习模型选择特征时,会尝试进行逻辑思考。
- 当选择一个机器学习指标时,尝试评估它将如何给企业带来好处。比如准确率 70%,会对销量产生怎样的影响?如果预测下降了 30%,会对销售产生什么影响?多少钱?尝试创建一个模拟来处理这个问题。
- 你可能想创建一个仪表板预测或报告分析来展示你的数据分析能力和机器学习发展。尽量拥有企业可能想知道的所有商业信息。证明你为什么选择这些图或信息。
- **解释力 vs 预测力。**你能有一个机器学习模型来解释为什么预测模型创建现有的预测吗?你可能有最好的模型,但是可解释性将帮助你解释业务的结果。
- 如果你对保险行业感兴趣,从各种来源研究商业问题。它将帮助您创建一个数据科学项目来满足保险业务的需求。如果没有,试着找一个自己感兴趣的行业。
花时间思考业务问题,并在过程中保持创造性。一旦你对业务有了理解,你就可以更容易地继续进行各种项目。展示你在商业理解方面的能力会让你在公司和商业用户的眼中脱颖而出。
就材料而言,这里有一些你可能想要阅读的阅读材料,以及遵循业务流程的项目示例。
https://github.com/cornelliusyudhawijaya/Cross-Sell-Insurance-Business-Simulation
结论
虽然开发机器学习模型对于数据科学家来说至关重要,但我们必须记住,我们的工作是为业务服务的。因此,发展我们对商业的理解对我们的工作和脱颖而出变得非常重要。
在这篇文章中,我为您概述了一些实践,以提高您的业务理解。
希望有帮助!
在我的 LinkedIn 或 Twitter 上访问我。
如果您喜欢我的内容,并希望获得更多关于数据或数据科学家日常生活的深入知识,请考虑在此订阅我的 简讯。
如果您没有订阅为中等会员,请考虑通过 我的推荐 订阅。
数据科学 Python 面试问题演练
原文:https://towardsdatascience.com/data-science-python-interview-question-walkthrough-5a679c6351ef?source=collection_archive---------19-----------------------
办公时间
在本文中,我们展示了如何处理和解决旧金山市的一次采访中提出的一个具有挑战性的数据科学问题。如果您想在从地址字符串中提取信息方面做得更好,您会发现这很有用。
图片来自 Canva
根据各种消息来源,旧金山市和县雇用了 3.5 万至 4.5 万人。这些职位分布在许多部门,如金融、卫生、交通、执法、博物馆甚至旧金山国际机场。这包括受雇于技术部或在其他部门担任辅助角色的数据科学家。
一般来说,要成为旧金山市的一名数据科学家,需要具备使用 SQL、Python 库(例如 NumPy 和 pandas)和大数据工具(例如 Hadoop MapReduce 和 Spark)进行数据挖掘、数据处理和探索性数据分析的经验。尤其是在 Python 中编程和开发算法的知识是一个主要要求。数据科学家的工作包括假设检验、回归、分类、聚类、时间序列分析、自然语言处理、特征工程和预测建模。
面试问题中测试的技术概念
在本文中,我们讨论并解决了数据科学面试问题中的一个问题,该问题需要对地址进行字符串操作和信息提取。这个例子代表了旧金山市数据科学问题的很大一部分,因为在许多情况下,候选人被要求从与城市治理相关的数据中提取信息或总结数据,如商业注册、人口普查数据、统计数据、工资单等。
在许多这样的问题中,任务包括从文本中提取信息,比如从名称中提取企业类型,从地址中提取邮政编码或街道名称,或者从职位名称中提取部门。像这样的作业需要操作字符串、构造条件语句和将方法应用于大型数据集的知识。此外,他们测试不特定于任何特定编程语言的技能,例如,识别和解决边缘情况。
数据科学面试问题:每条街道的健康检查
这个问题曾被问及到旧金山市参加求职面试的人,题目是“每条街的健康检查”。这是一个很难回答的问题,因为处理地址时处理所有的边缘情况总是很棘手。
问题链接:https://platform . stratascratch . com/coding/10181-health-inspections-per-street?python=1
截图来自 StrataScratch
我们被要求查找分配了风险类别值的每个街道名称的检查次数。我们将看到数据,并马上找出风险类别值。它还说我们应该输出结果和街道名称,并根据检查的数量按降序排列结果。
这已经告诉我们,我们需要从一个地址中提取一个街道名称,第二段给了我们如何做的进一步说明。它正确地意识到很难抓住街道名称的每一种写法。这里有一个例子:您的代码应该跳过只包含一个字母的街道名称,如 295 B Orizaba Ave 中名为“B”的街道。字母“B”是“门牌号”的一个元素,而不是街道名称。应该返回 Orizaba,而不是提取 b。
这个问题警告我们的是,不要简单地假设我们可以找到地址字符串中的第一个空格,并假设空格之前的所有内容都是门牌号,之后的所有内容都是街道名称。有一些边缘案例,比如门牌号为 295B 的案例,我们需要在解决方案中加以考虑。
解决问题的框架
在我们开始设计解决方案之前,让我与您分享解决任何数据科学问题的三步通用框架。考虑到压力,这对于解决面试任务特别有用,有一个系统的方法来处理任何问题是救命的,但它在一般情况下也很有用,例如在你的数据科学职业生涯中。
- 理解您的数据:
a )列出您对数据列的假设,这样您就知道使用哪些列了
b )如果您仍然对自己的数据不够了解,请查看数据的前几行(单个或多个表)。或者,如果在面试中,询问一些示例值,以便理解实际数据,而不仅仅是列。它将帮助您识别边缘情况,并将您的解决方案限制在您的假设范围内。 - 制定你的方法:
a )写下你要编程/编码的逻辑步骤。
b )确定你将使用/实现来执行逻辑的主要功能。
c )面试官会看着你;他们会在需要时介入,确保你要求他们澄清任何模糊之处,他们还会指定你是否可以使用现成的函数,或者你是否应该从头开始写代码。 - 代码执行:
a )构建你的代码,不要过于简单,也不要过于复杂。
b )根据与面试官概述的步骤,分步骤构建。这意味着代码可能效率不高,但没关系。你可以在最后和面试官谈优化。
c )最重要的一点是,不要在每个代码块中使用多个逻辑语句和规则,使代码过于复杂。代码块可以定义为 CTE 或子查询,因为它是自包含的,并且与代码的其余部分相分离。
d )在你写代码的时候大声说出来,因为面试官会评估你解决问题的能力。
了解您的数据
让我们先来看看我们现有的解决这个问题的数据。通常,在面试中我们不会得到任何实际记录,相反,我们会看到有哪些表格或数据框,以及这些表格中的列和数据类型。
在这个问题中,我们可以看到我们只有一个数据框,“SF _ restaurant _ health _ violations”,但它有很多列。似乎这个数据集中的每一行都对应一次违规。最后 3 列描述了每个违规。它是在某次检查中识别的,其中检查有一些 ID、日期、分数和类型。最后,通过前 10 列确定的特定业务来识别每个违规。因为我们只是对数据做了一些假设,所以与面试官分享所有这些并与他们确认你的假设是否正确总是一个好主意。
截图来自 StrataScratch
截图来自 StrataScratch
幸运的是,我们实际上不需要担心所有这些列来解决问题。这是一个很好的实践,回到问题上来,想想哪些列可能是有用的。我们需要找到检验的数量,因此我们需要计算‘inspection _ id’列的数量。“风险类别值的分配位置”表明我们需要使用“风险类别”列过滤数据。最后,“输出结果和街道名称。”告诉我们将注意力集中在应该包含街道名称的“business_address”列上。
制定你的方法
熟悉这些数据后,重要的是要想出几个通用步骤,我们在设计这个面试问题的解决方案时会遵循这些步骤。在我们的例子中,我们可以遵循以下步骤:
- 编写一个从“business_address”列的字符串中提取街道名称的方法。我们需要假设地址以街道名称开头,在这种情况下,我们需要从字符串中提取第一个单词,或者以一个数字开头,后跟一个字母,在这种情况下,我们应该提取字符串的第二个或第三个单词。
- 有了这个方法,我们可以用它向数据集添加一个新列——街道名称
- 在第三步中,我们将过滤数据,只留下分配了风险类别的这些行,换句话说,只留下“risk_category”列不为空的记录
- 接下来,我们可以使街道名称的格式一致,让它们在所有情况下都以小写字母开头。这一步确保每个街道名称在最终输出中只出现一次。
- 最后一步是按照面试问题中的指示准备最终输出:
a )我们将只有两列:街道名称和检查次数。因此,我们需要按照街道名称对结果进行分组,这样我们就可以计算每个街道名称在数据集中出现的次数。
b
代码执行
制定了方法之后,我们现在可以实际编写将产生预期输出的代码了。我们将使用 Python 编程语言,因此我们可以假设数据存储为名为“SF _ restaurant _ health _ violations”的熊猫数据帧。Pandas 是用于查询和操作数据集的流行 Python 库。我们可以从导入开始,以便以后使用。
import pandas as pd
现在让我们遵循我们之前制定的方法。第一步是从地址中提取街道名称的方法,所以我们可以从编写这个方法开始。现在,我们不关心数据集或任何特定的地址,我们将只编写一个 Python 函数,给定某个地址 x,它将返回街道名称。我们可以从键入以下内容开始:
def street(x):
我们希望从 x 中提取街道名称,其中 x 是包含地址的字符串。我们可以从检查字符串第一部分的第一个字符是数字还是字母开始。如果第一部分以字母开头,我们可以假设它是一个街道名称,并返回第一个单词。我们可以使用 split()函数,当它应用于一个字符串时,会根据我们可以选择的分隔符将字符串分成几部分。
if str(x.split(' ')[0][0]).isdigit() == True:
# first part is a number
else:
return x.split(' ')[0]
让我们检查一下这段代码。我们使用 x.split(' ')将我们的地址字符串分成几个部分,用空格键作为分隔符。例如,如果 x 是' 295 B Orizaba Ave ',那么使用 x.split(')会将它转换为一个列表,其中第一个元素是 295,第二个是 B,第三个是 Orizaba,第四个是 Ave。我们现在只对字符串的第一部分感兴趣,所以我们编写了 x . split(')[0],它对应于列表中的第一个元素,即第一个空格键之前的字符串中的所有内容。请记住,在 Python 中,第一个元素的索引是 0。在我们的例子中,它只是一个数字 295。然而,我们不仅对第一部分感兴趣,而且特别对第一部分的第一个字符感兴趣,这就是为什么我们添加另一个[0]来实现 x . split(')[0][0]。我们现在可以使用一个函数。isdigit(),当应用于一个字符时,如果该字符是数字,则返回布尔值 True,否则返回值 False。然而,我们需要小心,因为。isdigit()只能应用于字符数据类型。但是如果我们的第一个字符确实是一个数字,我们就要冒 Python 会自动将其转换成数字数据类型的风险,例如 integer。在这种情况下。isdigit()会导致错误,因为它不能应用于整数。为了避免这种情况,我们可以通过将字符转换为字符串来确保字符被视为字符串而不是数字。这就是为什么我们有 str()函数。
所以这段代码 str(x . split(')[0][0])。如果字符串的第一个字符是数字,isdigit()返回 True,如果是字母,则返回 False。如果是后者,那么当地址中的第一个字符是一个字母时,我们可以假设第一个单词确实是一个街道名称,并使用 return x . split(')[0]返回它—这样我们就输出了地址字符串中第一个空格键之前的所有内容。
在另一种情况下,当第一个字符是一个数字时,我们知道地址的第一部分是门牌号,而不是街道名称。我们将忽略它并返回第二个或第三个单词。哪一个?这取决于第二个单词是只有一个字母还是更多。如果它比一个字母长,那么我们可以假设它是一个街道名称,并返回第二个单词。否则,如果它只有一个字母,那么它就是数字的一部分,我们需要返回第三个单词。
if len(x.split(' ')[1]) > 1:
return x.split(' ')[1]
else:
return x.split(' ')[2]
在这段代码中,我们使用 len()函数返回对象的长度,在本例中是字符串中的字符数。我们也只将它应用于地址字符串的第二部分(在 Python 中索引为 1),所以我们计算第一个和第二个空格键之间的字符数。如果长度大于 1,那么我们可以返回第二个单词作为街道名。否则,我们返回第三个单词,也就是索引为 2 的那个。现在,从地址字符串 x 中提取街道名称的整个函数如下所示:
def street(x):
if str(x.split(' ')[0][0]).isdigit() == True:
if len(x.split(' ')[1]) > 1:
return x.split(' ')[1]
else:
return x.split(' ')[2]
else:
return x.split(' ')[0]
我们可以通过几个例子来验证这个函数是否有效。如果地址是' 295 B Orizaba Ave ',那么第一个 If 语句返回 true,因为第一个字符是一个数字,第二个 if 语句返回 false,因为 B 不超过 1 个字符,所以我们返回第三部分,Orizaba,它确实是街道名称。如果地址是' 700 Sutter St ',那么第一个 If 语句再次返回 true,因为第一个字符是一个数字。但是现在第二个 if 语句也返回 true,因为 Sutter 不止一个字母,所以我们返回 Sutter 作为街道名。最后,如果我们只输入“百老汇街”作为地址,那么第一个 if 语句返回 false,因为第一个字符不是数字,所以我们立即返回第一个单词,在本例中是“百老汇”。
现在,我们可以将刚刚编写的方法应用到数据框中:
sf_restaurant_health_violations['street_name'] = sf_restaurant_health_violations['business_address'].apply(street)
此代码将创建一个新列“street_name ”,这样,在对“street”列应用 street()方法后,该列的内容将等于“business_address”列的内容。我们用熊猫来实现它。对“business_address”列应用()函数,并使用我们的函数名,因此将“street”作为参数。
我们已经介绍了方法的前两步。我们有从地址中提取街道名称的方法,并且我们已经将列添加到数据框中,其中包含从地址中提取的街道名称。它是“街道名称”列。下一步是过滤数据,只留下分配了风险类别的行。我们可以用下面一行代码来实现:
assigned_risk = sf_restaurant_health_violations[]
这将创建一个新的数据框“assigned_risk ”,该数据框将根据条件仅包含原始数据框中的一些值。我们现在将在方括号内添加条件。条件是风险类别需要赋值,换句话说‘risk _ category’一栏不能说‘null’。幸运的是,有一个 Pandas 函数 notnull()可以做到这一点。因此,条件将如下所示:
SF _ restaurant _ health _ violations[' risk _ category ']。notnull()
数据框“SF _ restaurant _ health _ violations”中的“risk_category”列不能为“null”。然后,我们可以将这个条件添加到前面的代码中:
assigned_risk = sf_restaurant_health_violations[sf_restaurant_health_
violations['risk_category'].notnull()]
这种重复“SF _ restaurant _ health _ violations”名称的结构乍一看可能很奇怪,但这是一种完全正常的过滤熊猫的方式。
过滤结果后,下一步是确保格式的一致性。特别是,我们希望确保所有街道名称都以小写字母开头。为此,我们需要更新我们最*创建的列“street_name”。
assigned_risk['street_name] = assigned_risk['street_name'].str.lower()
基本上,lower()函数可以应用于一个字符串,并强制第一个字母小写。我们需要使用这个构造. str.lower()来指定我们想要将 lower()专门应用于“street”列中的字符串。
我们快到了。最后一步是根据面试问题中的说明准备输出。我们需要按街道名称对结果进行分组,计算每个街道名称出现的次数,然后按降序对结果进行排序。令人惊讶的是,使用熊猫,我们只用一行代码就可以完成所有的工作。让我们从创建一个新变量“结果”开始,现在,让我们将它设置为等于我们的过滤数据框“assigned_risk”。
result = assigned_risk
要按街道名称对结果进行分组,我们可以使用 Pandas groupby()函数。我们需要指定它应该根据哪一列对结果进行分组,在我们的例子中,我们将说“street_name”。然后,我们需要告诉它以什么方式对结果进行分组。我们希望计算每个街道名称出现的行数,这可以使用 Pandas groupby()来实现。size()函数。
result = assigned_risk.groupby(['street_name']).size()
上面的代码将成功地对结果进行分组,但是它将只返回每个街道名称出现的次数——只有一列数字,没有街道名称。此外,“result”已经变成了一个系列 Dataframe 中的另一种数据类型,它只允许存储一列数据。我们想把它转换回熊猫数据帧,并显示街道的名称。我们可以首先使用 Pandas 函数 to_frame()将一个系列转换成一个数据帧。顺便说一下,我们可以在这里为包含违规数量的列指定一个名称,比如说“number _ of _ risky _ restaurants”——这看起来比没有名称的列要好。然后,我们还将使用一个函数 reset_index()。在此之前,Pandas 将街道名称视为索引,不会在数据框中将它们显示为单独的列。使用此函数将变回数字索引,并将街道名称显示为一列。
result = assigned_risk.groupby(['street_name']).size().to_frame
('number_of_risky_restaurants').reset_index()
最后,我们要对结果进行排序。面试问题说根据检查次数降序排列结果。此外,我们可以添加一个二级排序规则,这样当几条街道具有相同数量的检查时,它们将按字母顺序排序。我们可以通过使用函数 sort_values()来实现这个结果。
result = assigned_risk.groupby(['street_name']).size().to_frame
('number_of_risky_restaurants').reset_index().sort_values
(['number_of_risky_restaurants', 'street_name'])
然而,这个输出有一个问题。默认情况下,函数 sort_values()按升序对所有内容进行排序。这意味着它将数字从最小到最大排序,并将文本按字母顺序排序。我们需要它有点不同,这个问题特别要求按降序或从最大到最小排列数字。但是对于基于街道名称的二级排序,我们仍然需要字母顺序。要对此进行编码,我们只需向 sort_values()函数添加一个布尔参数‘ascending ’,并为主要规则将其设置为 False,为次要规则将其设置为 True。
result = assigned_risk.groupby(['street_name']).size().to_frame
('number_of_risky_restaurants').reset_index().sort_values
(['number_of_risky_restaurants', 'street_name'], ascending=[False, True])
这非常长的单行代码足以产生所需的输出。下面是解决这个 Python 数据科学面试问题的完整代码:
import pandas as pd
def street(x):
if str(x.split(' ')[0][0]).isdigit() == True:
if len(x.split(' ')[1]) > 1:
return x.split(' ')[1]
else:
return x.split(' ')[2]
else:
return x.split(' ')[0]
sf_restaurant_health_violations['street_name'] = sf_restaurant_health_violations['business_address'].apply(street)
assigned_risk = sf_restaurant_health_violations[sf_restaurant_health_violations['risk_category'].notnull()]
assigned_risk['street_name'] = assigned_risk['street_name'].str.lower()
result = assigned_risk.groupby(['street_name']).size().to_frame
('number_of_risky_restaurants').reset_index().sort_values
(['number_of_risky_restaurants', 'street_name'], ascending=[False, True])
此外,查看我们之前在 上发布的关于数据科学家职位 的 Python 面试问题,找到针对初学者或寻求更具挑战性任务的人的问题。
结论
就是这样,我们已经成功地写出了来自旧金山市的“每条街道的健康检查”这一面试问题的解决方案。Python 编程语言的使用让我们只用几行代码就能编写出整个解决方案,但最困难的部分可能是提出通用方法。特别是,考虑地址字符串的所有可能变化是至关重要的。当从字符串中提取信息时,尤其是从地址中提取信息时,经常会出现这种情况,我们首先需要仔细检查数据,并尝试捕捉尽可能多的边缘情况,然后还要找出如何在代码中涵盖所有这些情况。
但是,请记住,在采访中,我们通常不会得到准确的数据,只有列名、数据类型和一些例子,就像本例一样。这就是为什么,为了解决这个问题,我们需要依靠一些假设,虽然假设事情是完全可以的,但绝对重要的是要与面试官沟通清楚,让他们知道你何时做出任何假设。在编写代码时,与面试官沟通也是一个关键,这是一个很好的实践,在你编写代码时解释这些步骤,并谈论你正在使用的最重要的功能——这样你不仅向面试官展示你可以解决这个任务,而且更重要的是,你总体上掌握了编程语言。
最后,不要忘记坚持解决任何数据科学问题的框架,这将使你的面试和生活变得更加容易。同样,您从检查和理解数据开始,然后制定您的方法——解决问题所需的几个一般步骤。最后,基于这两点,你可以一步一步地编写你的代码。
最初发表于https://www.stratascratch.com。
数据科学快速提示#012:用 FastAPI 创建机器学习推理 API
原文:https://towardsdatascience.com/data-science-quick-tips-012-creating-a-machine-learning-inference-api-with-fastapi-bb6bcd0e6b01?source=collection_archive---------25-----------------------
与你分享如何使用 FastAPI 构建一个机器学习推理 API
你好,朋友们!我们又回来了,带来了另一篇关于用 Docker 和 FastAPI 创建机器学习推理 API 的半快速文章。说实话,我写这篇文章是为了我自己。虽然我已经非常熟悉 Docker,但我个人过去一直使用 Flask 来构建我的 ML 推理 API。这并不是说 Flask 一定有什么问题,但是看起来 FastAPI 正在迅速成为行业标准。FastAPI 的一些优势包括…
- 比 Flask 更快:说实话,我试图使用蝗虫工具演示 Flask 和 FastAPI 之间的速度测试,我发现它们的性能相当。当然,我测试的模型是一个非常基本的泰坦尼克号分类模型,所以也许我的测试一开始就不是一个好的测试。无论如何,我只是相信人们的话,FastAPI 比 Flask 快
- 内置的 Swagger 文档:如果你不熟悉 Swagger 是什么,它是人们记录如何正确使用他们的 API 的主要行业标准方法之一。这在 Flask 中根本不存在,所以这绝对是一个受欢迎的好处。
- 内置数据验证 : FastAPI 允许一个非常简单的方法来实现对你的传入 API 调用的数据验证,这非常好。我们肯定会在稍后的帖子中对此进行报道。
如果您以前使用过 Flask,您会发现这种向 FastAPI 的转移非常容易。这两个框架在 Python 代码中的实际实现非常相似。在本帖中,我们将创建一个 API,为经典的 Iris 数据集提供逻辑回归模型。这个模型一点也不花哨,但它将演示如何使用 FastAPI 轻松地服务于您自己的机器学习模型。
和往常一样,如果你想了解这篇文章中显示的代码,你可以在我的个人 GitHub 中找到这个。
让我们开始吧!
训练虹膜模型
在我的 GitHub repo 中,我实际上已经创建并导出了 Iris 逻辑回归模型,您可以随意使用,但是如果您想训练自己的模型,下面是我为此创建的脚本:
# Importing the required Python libraries
import numpy as np
import pandas as pd
import pickle
from sklearn import datasets
from sklearn.linear_model import LogisticRegression# Loading the iris dataset from Scikit-Learn
iris = datasets.load_iris()# Converting the iris dataset into a Pandas DataFrame
df_iris = pd.DataFrame(data = np.c_[iris['data'], iris['target']],
columns = iris['feature_names'] + ['target'])# Separating the training dataset (X) from the predictor value (y)
X = df_iris.drop(columns = ['target'])
y = df_iris[['target']]# Instantiating a Logistic Regression (LR) model
lr_model = LogisticRegression()# Fitting the dataset to the LR model
lr_model.fit(X, y)# Saving the model to a serialized .pkl file
pkl_filename = "../model/iris_model.pkl"
with open(pkl_filename, 'wb') as file:
pickle.dump(lr_model, file)
再说一次,我们在这里没有做任何花哨的事情。因为 Iris 数据集本身是一个非常干净的数据集,所以我所做的唯一一件事就是加载原始形式的数据集,并立即将其输入到 Scikit-Learn 的逻辑回归模型中。一旦模型被训练,我们就把它作为一个序列化的.pkl
文件转储出来,这就是我们将用于模型推理的精确文件。
这一节到此为止!让我们开始使用 FastAPI 来构建我们的 API。
用基本 GET 端点实例化 FastAPI
好的,在我们开始之前,我们需要从 PyPi 快速安装我们将要使用的 Python 库。幸运的是,这非常简单:
pip3 install fastapi uvicorn
安装fastapi
对你来说可能是显而易见的,但是你可能对uvicorn
很好奇。Flask 和 FastAPI 都需要一种网关接口。Flask 需要一个类似于gunicorn
的 WSGI 服务器,而uvicorn
本质上是 WSGI 的“精神”继承者,也就是所谓的 ASGI 服务器。如果这有点令人困惑,请不要担心。你需要知道的主要事情是,当我们在终端中启动 FastAPI 时,我们实际上将使用uvicorn
来执行它。
正如你在我的 GitHub 脚本中注意到的,整个 API 非常容易上手。让我们从一个非常基本的 GET 端点开始。与 Flask 一样,FastAPI 利用位于函数之上的 Python 装饰器来提供不同的端点。这里的语法将用这个单一的 GET 端点创建一个超级简单的 API。
from fastapi import FastAPI, Request# Instantiating FastAPI
api = FastAPI()# Defining a test root path and message
@api.get('/')
def root():
return {'message': 'Hello friends!'}
信不信由你,这实际上是一个全功能的 API。它显然什么都不做,但是如果您想看看它目前的运行情况,让我们启动 FastAPI 来看看这个小东西的运行情况。为此,我们将执行以下命令:
uvicorn api:api --host 0.0.0.0 --port 5001 --reload
这是在寻找一个名为api.py
的 Python 文件,然后寻找一个名为api
的 FastAPI 实例。然后我们将它绑定到端口5001
上的主机0.0.0.0
,最后一个--reload
标志只是在您更改api.py
脚本时重新加载您的 API。这对于测试来说很好,但是我建议您在生产环境中去掉最后一个标志。
现在您的 API 在一个终端窗口中运行,打开另一个终端窗口并执行下面的curl
命令:
curl 0.0.0.0:5001
因为我们没有指定任何路径,它将默认为主要的'/'
路径,因此应该返回我们的小“Hello friends!”给你回信息。整洁!现在,打开浏览器,前往 http://localhost:5001/docs。这是你应该看到的:
作者截图
正如您所看到的,Swagger 已经在这里编目了我们的基本 GET 端点,甚至允许您做一点测试触发器来测试这个端点。现在这里没有太多内容,但是随着我们在这篇文章中的继续,您将看到这是如何成为一个非常强大的工具,用于快速记录您的机器学习推理 API。不错!
好了,现在我们的 API 已经有了一个很好的开始,让我们继续用 Iris 模型创建一个基本的推理端点。
基本推理终点
好了,我们现在准备开始围绕我们在前面部分中训练的 Iris 模型构建一个端点!首先,让我们首先导入我们需要的其他 Python 库,并加载模型本身:
import pandas as pd
import pickle# Loading in model from serialized .pkl file
pkl_filename = "../model/iris_model.pkl"
with open(pkl_filename, 'rb') as file:
lr_model = pickle.load(file)
好了,这里的lr_model
对象与我们之前针对 Iris 数据集训练的逻辑回归模型相同。就像我们处理任何其他 Python 脚本一样,我们将通过调用模型的.predict()
函数将数据传递给该模型进行推理。
对于 Flask 用户来说,这是我觉得有点奇怪的地方。我不想解释 Flask 是如何工作的,但它就是…与众不同。在 Flask 中,我习惯于直接从请求体获取 JSON,这就是我们在这个基本端点中要做的。(剧透:有一个比这更好的选择,我们将在下一节演示,但如果您想尽可能地与 Flask 保持一致,这就是您要寻找的模式。
这里是我们的/basic_predict
端点的完整代码:
from fastapi import Request# Defining the prediction endpoint without data validation
[@api](http://twitter.com/api).post('/basic_predict')
async def basic_predict(request: Request):
# Getting the JSON from the body of the request
input_data = await request.json()
# Converting JSON to Pandas DataFrame
input_df = pd.DataFrame([input_data])
# Getting the prediction from the Logistic Regression model
pred = lr_model.predict(input_df)[0]
return pred
FastAPI 是围绕 Python 新的异步特性构建的,因此我们在这里看到了async
和await
关键字。为了实际使用请求体中的 JSON,我们必须首先从 FastAPI 导入Request
类对象,然后将它作为参数传递给这里的basic_predict
函数。(再说一次,这可能不是你在 Flask 中所习惯的。)幸运的是,从这里可以很快地从我们的虹膜模型中得到预测的推论。我们从请求体中取出 JSON,将其转换成 Pandas 数据帧,将数据帧传递给逻辑回归模型以产生一个推断,最后将该推断返回给用户。
好吧!现在我们来试试这个。为了方便起见,我创建了一些 shell 脚本来快速测试我们的端点。它们可以在这个 GitHub repo 目录中找到。您可以简单地通过运行bash script_name.sh
来执行这些。例如,运行bash basic_predict.sh
脚本实际上是在做以下事情:
curl --request POST \
--header 'Content-Type: application/json' \
--data [@test_json/test_data](http://twitter.com/test_json/test_data).json \
--url [http://0.0.0.0:5001/basic_predict](http://0.0.0.0:5001/basic_predict)
通过我们的模型运行这个脚本应该会返回一个“0.0”值。不错!现在让我们回过头来检查一下我们的 Swagger UI,看看事情发生了怎样的变化。下面是您现在应该看到的:
作者截图
除了我们原来的 GET 端点颜色为蓝色之外,我们现在看到我们的基本 predict POST 端点颜色为绿色。因为这是一个非常基本的端点,所以您会注意到这里没有多少文档。这是可以增强的,我们不仅要用我们的最终端点来增强它,还要添加最后一个非常酷的功能:数据验证。
带数据验证的推理端点
好了,虽然我们的基本预测端点如预期的那样工作,但我们现在将通过向传入请求添加数据验证来提高性能。数据验证确保我们的模型被正确地传递期望值。如果调用者传递了不正确的内容,则向用户返回一个响应,告诉他们由于数据验证错误,请求无法处理,并且还向用户具体描述了哪里出错了。
FastAPI 通过与一个名为 Pydantic 的框架合作,在他们的BaseModel
类的基础上构建 Python 类来实现这一点。对于我们的 Iris 数据集,下面是我们将为验证构建的数据模型:
from pydantic import BaseModel # Creating the data model for data validation
class Iris(BaseModel):
sepal_length: float
sepal_width: float
petal_length: float
petal_width: float
(注意:默认的 Iris 数据集以不同的方式命名其特征,并包含空白。我一辈子也想不出如何用包含空格的特性名称创建这个 Pydantic 数据模型,所以我适当地更改了特性的名称。这也反映在我们的测试 JSON 文件中。)
我在这里描述的验证非常简单。使用这个Iris
数据模型的端点期待一个具有这四个特性的请求,并且所有这些特性都应该是float
数据类型。这是非常基本的,但是您可以通过数据验证进行深入研究。您甚至可以具体定义每个特性的期望值范围。例如,如果您定义了一个期望值范围在 0 到 366 之间的days
特性,那么当用户试图传递一个值为 367 的days
时,FastAPI 将返回一个验证错误。
为了在端点中实际使用这个Iris
数据模型,下面是它的语法:
# Defining the prediction endpoint with data validation
[@api](http://twitter.com/api).post('/predict')
async def predict(iris: Iris):
# Converting input data into Pandas DataFrame
input_df = pd.DataFrame([iris.dict()])
# Getting the prediction from the Logistic Regression model
pred = lr_model.predict(input_df)[0]
return pred
这与我们的/basic_predict
端点非常相似,但是现在,FastAPI 将自动传递传入的请求,并在我们的模型处理它之前对它执行数据验证。
让我们付诸实践吧!为了方便起见,我提供了两个测试 JSON 文件:一个包含正确的信息,另一个包含错误的信息。好的那个看起来是这样的:
{"sepal_length":5.1,"sepal_width":3.5,"petal_length":1.4,"petal_width":0.2}
这是坏的那个的样子:
{"sepal_length":"dkhundley","sepal_width":3.5,"petal_length":1.4,"petal_width":0.2}
正如你所看到的,我把sepal_length
改成了我名字的string
值,这应该无法通过我们设置的数据验证,因为我们期望的是float
值。通过用这些坏数据发出 curl 命令(可以用我的test_bad_predict.sh
脚本完成),FastAPI 告诉我们:
作者截图
我的截图被剪掉了一点,但是你可以看到 FastAPI 指出sepal_length
应该是一个浮点数。如果您正在调用 API,而您自己不是开发人员,那么这非常清楚地描述了您出错的地方。不错!
传入正确的数据(可以用我的test_predict.sh
脚本来完成)会产生我们期望的推断值。
作者截图
好吧,让我们最后看一眼我们的招摇文件来结束这篇文章。你现在应该看到一些新的东西了!首先,看一下“模式”部分:
作者截图
在这里,您可以看到我们的Iris
数据模型,包括所有预期的特性和预期的数据类型。现在,让我们来看看我们的/predict
端点文档:
作者截图
与我们的/basic_predict
端点相比,我们现在可以看到一些额外的东西。也就是说,我们现在看到了一个端点所期望的样本,此外,FastAPI 提供了一个虚拟数据集,您可以从 Swagger UI 随时随地对其进行测试。非常好!
朋友们,今天的帖子到此结束!尽管我很喜欢 Flask,但我个人将来会将 FastAPI 用于我所有的机器学习模型。我很清楚为什么数据科学社区很快采用 FastAPI 而不是 Flask。这是一个非常简洁、功能丰富的工具!感谢你查看这篇文章。请继续关注机器学习和数据科学的最新进展。
一个方便的数据科学相关资源列表,用于学习、面试和职业发展
原文:https://towardsdatascience.com/data-science-resources-for-learning-interviewing-and-professional-development-4530898d789c?source=collection_archive---------14-----------------------
学习编码,为面试做准备,以及为初学者提供其他有用的数据科学资源和信息
数据科学家本世纪最性感的工作
大家好,我整理了一份有用的网站和信息列表,以帮助您处于该过程的任何阶段,无论您是开始数据科学之旅、面试公司、谈判报价,还是只是希望继续了解更多信息。
这包括面试准备资源、面试后薪酬研究等。随着我在旅途中找到更多的资源,我也会继续更新这个列表。
以下是您将在下面找到的目录:
1。对于对数据科学感兴趣的初学者
a)学习 Python、R 和 SQL 的免费资源
b)为统计释放资源
b)学习数据科学的付费渠道
c)机器学习资源
d)在哪里可以找到数据集
2。面试准备
a)个人守则实践
b)现场代码实践
c)备忘单
3。求职中的
4。岗位面试
a)薪酬信息
b)谈判
5。职业发展
a)实现出色的可视化
b)学习技巧和窍门/其他很酷的东西
对于对数据科学感兴趣的初学者
任何人都可以做数据科学。安·trần 在 Unsplash 上拍摄的照片
如果你认为这是你想从事的领域,作为一个开始,看看这个非常酷的信息图名为“通过 8 个简单步骤成为数据科学家”。
你的旅程将占用大量时间和个人投资,所以如果你准备好了,这里有一些资源供你培养数据科学家的技能。编码、SQL、机器学习算法和统计学是你需要学习的基本技能。
学习 Python、R 和 SQL 的免费资源
有很多免费的资源可以教初学者如何用 Python 和 r 编程,谷歌搜索会给你很多结果。我在下面列出的是我认为能一步一步带你走过的网站。
- Python、R 和 SQLhttps://www.datacamp.com/
- Python、R 和 SQLhttps://www.udacity.com/
- Python、R 和 SQL【https://www.dataschool.io/
- https://swirlstats.com/[r](https://swirlstats.com/)
- SQLhttps://www.w3schools.com/sql/
当你开始做项目时,看看我的文章Git的简单入门指南可能会对你有所帮助。Git 是一个用于项目的版本控制软件。
免费资源统计
- 基础统计如果你想从头开始https://www.udacity.com/course/intro-to-statistics-ST 101
- 有很多例子的概率https://www . int math . com/counting-probability/counting-probability-intro . PHP
- 强烈推荐这本书(R 中带应用的统计学习入门),即使你不使用 R。它是免费的。http://faculty.marshall.usc.edu/gareth-james/
- “StatQuest 将复杂的统计和机器学习方法分解成易于理解的小块。”https://www.youtube.com/channel/UCtYLUTtgS3k1Fg4y5tAhLbw
学习数据科学的付费渠道
如果独自练习不太适合你的学习风格,还有其他选择。你可以参加训练营或者获得硕士学位。
我实际上参加了旧金山的一个名为激励的数据科学训练营,那是一个课堂环境,我非常喜欢面对面的互动。如果你最终选择了激励,你可以用我作为推荐人,这给了你学费折扣。
也有网上训练营,有些会保证你会得到一份工作。做你的研究,找到适合你的,因为每个训练营都有优点和缺点。有些提供工作保障。有些可能会提供指导。例如,目前我是 Springboard 的分析训练营的导师,我每周与一名学生进行半小时的电话会谈,回答问题并复习课程。如果你想查看跳板的节目, 点击这里 。
照片由元素 5 数码在 Unsplash 上拍摄
如果你有时间和金钱,如果你想更深入地了解这些材料,硕士课程可能是一个选择。训练营往往提供更多的广度而不是深度。我目前正在乔治亚理工学院攻读硕士学位,这是一个比其他大多数项目都更好也更便宜的选择。
如果你对训练营或我的硕士项目有任何疑问,欢迎在下面发表评论。
我想指出的另一件很酷的事情是 Coursera 开始的一些新东西。一旦你在编码方面有了良好的基础,你可以通过尝试一个指导的项目来练习,在两个小时内由一个主题专家学习一项与工作相关的技能。注意,这不是免费的。https://www.coursera.org/courses?query=guided%20projects
机器学习和其他资源
对于那些对机器学习感兴趣的人来说,这里有一些有用的网站。
- 以清晰的方式教授机器学习https://machinelearningmastery.com/
- 关于机器学习和深度学习的吴恩达课程https://www.coursera.org/learn/machine-learninghttps://www.coursera.org/specializations/deep-learning
- 深度学习https://www.fast.ai/
- 直观地解释—“一个让难以理解的想法变得直观的实验”https://setosa.io/ev/
- 自然语言处理http://www.nltk.org/book/ch01.html
一旦你学会了机器学习模型,你就可以开始参加比赛了。Kaggle 是一个很好的方法来实践你在实际问题中学到的东西。https://www.kaggle.com/competitions
哪里可以找到数据集
如果您正在寻找用于顶点项目的数据,这里有一个列表,可以作为一个很好的起点。
- Kaggle 是一个很好的数据资源,但一定要寻找可用性得分高的数据集,这表明它是一个相对干净和良好的数据集。https://www.kaggle.com
- UCI 有一个机器学习知识库,这是一个寻找数据集的热门地方。它甚至提供了数据集的任务类型(分类、回归或聚类)https://archive.ics.uci.edu/ml/datasets.php
- 人口普查可以提供关于人口和经济的数据。https://www.census.gov/data.html
- 新冠肺炎数据集https://github . com/owid/新冠肺炎-数据/树/主/公共/数据/
面试准备
数据科学职位的面试与其他职位有很大不同,需要做大量的准备工作。
一般来说,会有多轮面试,包括带回家的作业、招聘人员面试、技术面试和现场编码面试。
下面是一些你可以练习 SQL 或 Python 或其他编程语言的网站。我还附上了一些备忘单,可能对你的准备工作或工作有用。
我准备好面试了吗?假的!问题是,这次面试我准备好了吗?斯蒂芬妮·勒布朗在 Unsplash 上的照片
顺便说一句,我听说盖尔·麦克道尔的《破解编码面试》这本书非常有帮助。它包含了大型科技公司提出的* 200 个编程问题和答案。
个人代码实践(顺便说一下,这些都是免费的)
- Leetcode 有超过 800 个问题可供你选择,它们有不同的难度,从简单到中等到困难不等。【https://leetcode.com/problemset/all 号
- Codewars 有点像一个结构化的程序,当你完成挑战时,你会经历不同的等级。https://www.codewars.com/
- HackerRank 是一个竞争性的*台,在这个*台上,你的解决方案将根据准确性进行评分,你将与其他用户进行比较。https://www.hackerrank.com/
现场代码实践
- 我建议您尝试一下,与您的同事一起练习现场模拟面试和编码问题。这让它感觉更像一个真实的面试环境,这将是一个很好的练习。 Pramp 免费使用。https://www.pramp.com/#/
- 或者,你也可以和你申请的公司的人一起练习模拟面试。(免费,但目前新冠肺炎需要付费。)https://interviewing.io/
- 当然,不要忘记练习在白板上编写问题代码。随便找个朋友冒充面试官!
备忘单
为了提高你的工作效率,有备忘单作为参考总是好的。这里有一些我喜欢的。
SQL
- 关于基础知识,请参见https://learnsql.com/blog/sql-basics-cheat-sheet/
- 一旦你学会了基础,我会检查窗口功能。https://learnsql.com/blog/sql-window-functions-cheat-sheet/
R
- 查看 RStudio 的许多伟大的小抄https://www.rstudio.com/resources/cheatsheets/
Python
- 我很喜欢 Datacamp 制作的备忘单。请参阅 Numpy、Pandas、Seaborn、Scipy 等的备忘单。https://www.datacamp.com/community/data-science-cheatsheets
杂项
- 数据科学面试问题、答案和其他有用资源https://ds-interviews.org/
在找工作
如果你准备好开始申请和面试,你可以先去热门网站,比如 Indeed、ZipRecruiter 和 Google,也可以在这里查看这些资源。
- 获得顶级科技公司的推荐【https://repher.me/
- 在这里寻找创业工作【https://angel.co/
- 轻松申请数百家使用 LinkedIn 的公司https://www.linkedin.com/jobs/linkedin-jobs/
- 别忘了,你最好的选择是向你的朋友和家人寻求推荐!
最后,我听说了一个名为 Blind 的新网站,通过验证的员工可以匿名提问和回答问题。你可以对文化进行研究,也许还可以了解薪水。https://www.teamblind.com/
我得到的一个建议是,先从你不感兴趣的公司开始实习,把你真正感兴趣的公司留到你实习之后。
面试后
既然你得到了一份工作,你准备好谈薪水了吗?
这是什么,蚂蚁的工资?水晶钻在 Unsplash 上拍照
薪酬信息
公司给这种职位的工资是多少?做你的研究,这样你就知道市场的价格。
我通常从 Glassdoor.com 开始,看是否能找到薪水信息。其他几个提供评估的网站包括https://www.salarylist.com/和https://www.payscale.com/
这里有几个我认为也不错的网站
- 直接从 https://www.bls.gov/ooh/劳动统计局找到数据
- 薪酬数据https://www.levels.fyi/comp.html?track=Data%20Scientist#
- 从 https://h1bdata.info/ 1B 招聘公司找到实际工资信息
谈判
谈判总是值得的!**照做就是了。**问问真的没坏处。
- 查看这篇关于女性谈判的优秀文章http://women forhire . com/negotiating _ salary _ benefits/negotiating _ salary _ 101 _ tactics _ for _ better _ compensation/
专业发展
学习是一个持续的旅程。为了更好地创建可视化,获得新知识,或者只是学习技巧和诀窍,请查看下面的一些内容。
Woohoo,职业发展。Jimmy Conover 在 Unsplash 上拍摄的照片
制作出色的可视化效果
- 我真的很喜欢《华尔街日报》图形团队的可视化效果。查看它们,为你自己的视觉效果寻找灵感。https://graphics.wsj.com/
- Tableau Public 有大量的创意仪表盘。看看https://public.tableau.com/en-us/gallery/?tab =当日即时&type =当日即时
- 这篇文章给出了一些非常好的提示,告诉你如何用你的数据创建更好的可视化效果。https://depictdatastudio . com/how-to-create-a-data-visualization-style-guide-to-tell-great-stories/
- 这是一个关于用汉斯·罗斯林的视觉材料讲故事的标志性演讲。https://www . ted . com/talks/Hans _ rosling _ the _ best _ stats _ you _ ve _ ever _ seen # t-297730
- 颜色是视觉化的一个重要部分,但人们并不总是注意它。Colorbrewer 是一个为你的图形选择好的配色方案提供建议的工具。https://colorbrewer2.org/
学习技巧和窍门/其他很酷的东西
- 每周一次的 Python 播客,包含采访、编码技巧以及与来自 Python 社区的嘉宾的对话https://realpython.com/podcasts/rpp/
- 使用 R 软件的博客作者的博客集【https://www.r-bloggers.com/
- 生成虚拟 JSON 数据【https://www.mockaroo.com/
如果你有任何问题或任何网站/信息想与他人分享,请在下面留言!
祝您的数据科学之旅好运!
你能行的!照片由 Unsplash 上的 Prateek Katyal 拍摄
数据科学短片:分解
原文:https://towardsdatascience.com/data-science-shorts-decomposition-a40bdd6826aa?source=collection_archive---------29-----------------------
有时用最简单的方法也能获得可观的收益
(来源:https://pixabay.com/)
在一系列短文的第一篇中,我想概述一下关于输入数据的关键见解:分解我们的训练特征并提取组成它们的更基本的特征,这使我们能够大大提高模型的预测质量。
为了说明我们的观点,假设我们正在尝试生成一个任意时间序列的未来值的预测。为了简单起见,我们将使用线性模型来提供预测。这个概念对于更复杂的模型也是有效的。
从线性模型生成预测可以通过将时间序列训练数据视为特征空间内的向量集合来完成。如果我们将每个向量的标量值视为时间的函数,我们可以拟合回归模型,通过沿回归线外推来预测该特征向量在未来任何时间的值。然后,可以将每个特征的未来值作为因子,使用第二个回归模型预测目标变量(即预测目标),这次是通过沿回归线插值这些值。
第一个回归模型(左图)让我们可以将每月的水果销量作为时间的函数进行外推。这允许我们使用第二个回归模型(右图)将收入作为水果销售的函数进行插值。(图片由作者提供)
例如,我们可以使用售出的水果数量作为训练数据来预测杂货店的月收入。我们可以扩充训练数据(滞后数据、非线性变换……),但这些都源于一个单一的特征:我们卖了多少水果。在训练第二个回归模型时,我们收敛到一个等式,该等式将收入表示为销售水果的函数:
线性回归模型的标准公式
这就是我们的见解——水果销售可以进一步细分。例如,如果我们的商店卖橘子和甜瓜,我们的水果总销售额将是卖出的橘子数加上卖出的甜瓜数。
水果销售额是橙子和甜瓜销售额的总和
即使是简单的水果种类分解也会显示出不同的季节模式。橙子的销售高峰在冬天,而甜瓜的销售高峰在夏天。但是将橙子和甜瓜的销售数据视为一个特征迫使模型赋予它们相同的权重:
请注意,β1 在等式的右侧出现了两次——如果不进行分解,模型无法学习橙子和甜瓜销售的单独权重。
通过分解水果销售,模型可以为每个特征分配不同的权重,从而提高预测质量:
分解允许我们分配单独的权重。
在我工作中使用的样本数据集(B2B 营销数据-通过与销售团队的互动次数预测新客户)上测试这一点,我们可以将通过互动总数的预测与通过每次互动发生的渠道(例如 LinkedIn、直接呼叫……)细分的预测进行比较
左图:通过与销售团队的互动次数预测 B2B 客户获取量。右图:同样的预测,将互动次数考虑在内,按渠道分解。(图片由作者提供)
结果显示,仅通过分解我们的数据,预测质量就提高了40%(使用*均-*均比例误差测量)。整洁!
感谢阅读,敬请关注本系列的后续文章:)
数据科学技能是任何工作的新基准
原文:https://towardsdatascience.com/data-science-skills-are-the-new-baseline-for-any-job-2c155636ea2f?source=collection_archive---------37-----------------------
数据科学正变得无处不在
照片由 Unsplash 上的 Aziz Acharki 拍摄
我教数据分析和数据科学。2020 年,我所在班级的注册人数大幅增加。虽然我认为失业是增长的主要原因,但我需要分享一个关于我班上学生的有趣事实。他们中的大多数人并不想成为数据科学家。
公司结构正在全球范围内发生变化。分析工作正从集中的部门转移到特定学科的团队。销售代表自己提取数据,而不是销售人员向他们的分析部门寻求见解。销售人员使用自助 BI 工具,如 Tableau 或 Power BI,收集自己的见解。
整个公司层级中的部门也是如此,只剩下高管依赖陈旧的集中分析团队。推动这种转变的有两个因素:专业知识和效率。
当数据科学首次在企业中获得动力时,刚从学校毕业的数据科学家被大量雇用。尽管他们都是非常聪明的人,但新聘用的数据科学家和业务环境之间存在差距。从事数据工作的聪明人根本没有产生最佳结果所需的商业经验。
当然,业务专家不具备产生结果的数据科学技能。公司需要的是具备商业知识和数据科学能力的人。
除了缺少业务环境之外,由于在有限的资源上有大量的请求,集中式数据科学部门通常会导致瓶颈。这种情况与大多数 IT 部门面临的情况没有什么不同,工作量太大,人手太少。
走进今天的学生。
这些都是非传统的学生,无论男女,他们都在想方设法学习所需的数据科学技术,以便在其现有的专业领域产生必要的见解。
在这种新的分散模型中,主题专业知识的问题很容易解决,因为执行数据科学工作的人也是他们部门特定数据的专家。效率问题通过工作分配得以解决。每个部门都可以管理自己的洞察需求,并相应地确定优先级,而不是由一个部门来处理所有的分析请求。
我班上的学生主要是在增加他们的个人技能。他们打算留在目前的职位或领域,并将新获得的技能应用到现有的工作中。文化和学生行为的转变导致了新的招聘趋势。
公司内的所有角色都开始形成与数据打交道的期望,并乐于从数据中获得真知灼见。再过几年,人力资源板块的这种移动将在就业市场建立一种新的规范。
数据科学技能将在公司内的每个角色中变得无处不在。
寻求具有数据科学技能的助手。
寻求有数据科学经验的销售代表。
寻找拥有数据科学知识的产品专家。
寻找具有数据科学能力的营销人员。
虽然这是一件好事,但这将意味着数据科学家这一角色的工作定义将开始减少。许多数据科学家将被迫转向另一个工作领域,在那里他们可以将数据科学技能集中在一个利基业务上。
最好的计划是抢先一步。如果你目前没有数据科学技能,有许多在线和本地的渠道可以开始学习诀窍。如果你已经是一名数据科学家,你应该找另一个你感兴趣的学科。在你的数据科学工作之外学习它。
无论你需要向哪个方向扩展你的知识,从今天开始。
Rod Castor 帮助公司获得正确的分析!他帮助国际组织和小型企业改善他们的数据分析、数据科学、技术战略和技术领导力。除了咨询,Rod 还喜欢公开演讲、教学和写作。你可以在 rodcastor.com**和通过他的 邮件列表 了解更多关于 Rod 和他的工作。
数据科学入门套件
原文:https://towardsdatascience.com/data-science-starter-kit-2d8e2291914b?source=collection_archive---------7-----------------------
由 envato elements 的 alexacrib 使用图像创建(经许可)。
数据科学 | 机器学习
数据科学入门指南
T 本文向您展示了数据科学入门工具包,它将作为自助指南,帮助您开始数据科学之旅。不,我不会卖给你一门课程。它也不会是一个神奇的公式,可以毫不费力地向您灌输数据科学知识和技能。
这个数据科学入门套件将会让你零成本(尽管这里提到的学习服务提供商会这么做)。这个初学者工具包可以为您提供一个框架,帮助您找到正确的方向,并帮助您迈出第一步。
这将是一段艰难的旅程。你甚至可能想放弃,但是只要有毅力和正确的心态,你就能做到。这里有很多内容要介绍,废话不多说,让我们开始吧!
数据科学的重要性
数据科学可以定义为一个从数据中获取可行见解的多学科领域。它通过应用科学方法以及包括数学、统计、编程、机器学习和数据可视化在内的基本技术和分析技能来做到这一点。
数据科学的流行可以归功于托马斯·达文波特和 DJ·帕蒂尔在哈佛商业评论上发表的一篇文章中引人注目的标语:
数据科学家:21 世纪最性感的工作
几乎所有的财富 500 强公司都聘请了数据科学家、数据工程师和数据分析师以及机器学习研究人员和机器学习工程师,以帮助组织充分利用数据。
您知道*“数据是新的石油”*,它还可以帮助您做出数据驱动的决策。但问题是,在学习如何进行数据科学的过程中,你如何准确地开始并迈出第一步。
心态
有时我们被各种可能性淹没,这导致了犹豫不决。这种情况被称为分析瘫痪。考虑以下我们在开始时都可能面临的常见场景。
- 我们该走哪条路?
谷歌数据分析或者 Coursera 的 IBM 数据科学证书。 - 学哪种语言?
R vs Python - 哪个数据可视化工具?
画面或力量匕
这种过度思考可能会阻碍生产力,让我们无法前进。我们之所以不愿意只选择一个,继续前进,是因为我们害怕做出错误的决定或采用次优的解决方案。
丹尼尔·伯格在 Unsplash 上拍摄的照片
一句流行的中国谚语曾说:
“种树的最佳时间是 20 年前。第二好的时机就是现在。”
因此,要在学习数据科学的旅程中前进,您必须行动起来,而且必须现在就行动起来。时间是至关重要的。所以以上问题的答案是选择一个,试一试,如果不成功,你可以随时换另一个试试。没有什么能阻止你尝试所有的选择。
数据科学技能集
任何学习旅程中的一个基本问题是弄清楚你想学习哪些课程。为了帮助你开始,我整理了一份基本数据科学技能的列表,并将其浓缩为下图所示的信息图。
资料图作者绘制。
下面的信息图概括了数据科学家的基本技能。对于一个全面发展的数据科学家来说,这基本上包括技术技能和软技能。
数据科学的技能组合包括使用:
- 数据收集,
- 数据预处理,
- 探索性数据分析,
- 数据可视化,
- 统计分析,
- 机器学习,
- 编程和
- 软件工程。
我在 YouTube 上制作的关于如何成为一名数据科学家的视频 (所需的学习路径和技能组合) 中提供了关于数据科学技能组合的更详细的讨论。
https://youtu.be/jhImgx8I8oI
任何一个数据科学家在工作中实际需要的确切技能高度依赖于他们工作的公司类型。
例如,在一家科技初创公司,数据科学家可能被期望或被他们的角色要求涵盖信息图中涵盖的广泛技能集。所以说,他们最终可能成长为全栈数据科学家。就我个人而言,我最初是一名生物学家,是机器学习软件的最终用户,比如基于 GUI 的 WEKA 数据挖掘工具。随着时间的推移,我开始获得信息图中包含的其他技能集,如编码(Python 和 R ),并慢慢接受了每个技能集簇。至于那些在更大的科技公司工作的人,他们的职责范围可能会更窄,也更明确。例如,大科技的数据科学家可能专注于开发新的机器学习算法、工具或框架。
同样重要的是各种软技能,帮助数据科学家讲述好的数据故事、解决问题、设计创造性的解决方案等。 Rebecca Vickery 写了一篇很棒的文章,涵盖了数据科学的 软技能 这一主题,她涵盖了怀疑主义、独立、创造力、商业敏锐度和沟通。随着数据科学家在职业阶梯上的晋升,这些软技能变得越来越重要,因为它们向组织的关键利益相关者传达数据驱动的见解,并使用这些软技能来管理不断增长的数据专业人员团队。
数据科学的学习资源
作为一名非技术出身的人,我知道开始接触数据科学是多么令人生畏。这并不是说学习数据科学的资源很少,相反,资源太多了。如前所述,这可能导致分析瘫痪。
以下是学习数据科学的一些可用资源:
- 训练营——数据科学道场,拉姆达学校
- 会议 — 数据化会议,开放数据科学会议
- 工作坊——NVIDIA 数据科学工作坊,加州大学柏克莱分校数据科学教育全国工作坊
- 比赛——卡格尔
- 本科或研究生学位项目——UT Dallas、 U Penn MCIT 等。
- 在线课程及证书 — 365 数据科学、数据营、 Coursera 、 DataQuest 、 Udemy 、 Udacity 或 Skillshare 以及免费的 Kaggle Learn
- 书籍——用 Scikit-Learn、Keras、TensorFlow 进行动手机器学习、 R 进行数据科学、建立数据科学事业等。
- YouTube——数据教授,肯吉,克里斯纳伊克, codebasics ,丹尼尔伯克,蒂娜黄, StatQuest ,数据化等。
- 中——查宁·南塔塞纳马特肯·吉苦仁·陈里士满·阿拉克西雅图·达塔盖伊丽贝卡·维克里特伦斯·申等。
- 播客——肯氏*邻,柴时代数据科学,走向数据科学,拉维特秀
- 社交*台 —关注 Twitter 上的# 66 days ofdata、Twitter 上的# 100 days ofcode、LinkedIn 上的# 66 days ofdata和 LinkedIn 上的# 100 days ofcode
如您所见,这些学习资源提供了广泛的选项,您可以利用这些选项来学习数据科学。上述每一种资源都是可行的方法,不用说,它们可能适合不同的生活情况和环境,这些情况和环境可能因人而异。
例如,如果你急于尽快找到一份数据科学的工作,并且你有时间和财力通过训练营来支持自己,那么这可能是你的选择。
或者,您的公司支持您学习数据科学,并且您有能力参加研讨会或讨论会,那么这可能是您的一条可行之路。
对于那些想从一个完全不同的领域转型的人来说,你可能正在自学,因此允许你在家学习的在线资源可能是你的途径。
或者,如果你很早就知道自己热爱数据科学,并且已经注册了一个数据科学的本科学位项目,那也很好!
根据我自己的个人经验,我经常发现从事我感兴趣的项目很有帮助。首先,如果这个主题很有趣,那么通过研究这个项目来理解数据将会很有趣,很吸引人。事实上,我期待着一天中我开始学习或从事项目的那段时间。作为一名生物信息学副教授,我朝九晚五地工作,晚上我会从事内容创作,要么为教程编码,要么拍摄教程视频,要么为 Medium 写教程博客。谁知道呢,也许有一天我会完全投入到内容创作中。
五金器具
任何数据科学项目的一个重要组成部分是硬件。让我们熟悉一些对任何数据科学项目都有帮助的硬件。
由于计算机(笔记本电脑或台式机)对于执行各种资源密集型机器学习(或深度学习)模型构建非常重要,因此可能会有一种误解,即如果我们无法获得昂贵的硬件,可能很难开始学习数据科学。虽然缺乏这些资源可能会阻碍数据科学项目的进展,但免费云资源的可用性是一个游戏改变者。
然而,如果有预算,你问我有什么建议,我会建议你买一台 MacBook Pro,我认为这是目前市场上最好的笔记本电脑,可以完成任何与编码相关的任务,以及一般的工作效率和内容创作任务。由于 MacBook 的操作系统是 OSX,它本质上是建立在与 Linux 相似的 BSD UNIX 之上的。这样做的好处是你会熟悉 Linux 命令,因为在电脑上安装一些机器学习软件或工具可能需要侵入苹果的 Xcode 和 T2 的 Homebrew。另一个好处是,如果连接外部显示器、键盘和鼠标,笔记本电脑可以兼作台式机。
Google Colab 和 Kaggle Notebook 都是免费且功能强大的云资源,授予任何用户访问 CPU 和 GPU 计算资源的权限。仅配备一台基本的笔记本电脑,您也可以访问强大的计算资源,足以训练任何模型。
谷歌 Colab 笔记本截图。
然而,应该注意的是,对于 Google Colab 来说,对高端 GPU 计算资源的访问并不总是有保证的,因为它是在庞大的用户群中共享的,但是具有持久性。特别是,简单地刷新几次浏览器,你就可以访问更高层次的英伟达 T4 GPU 卡,而不是旧的英伟达 K80 GPU 卡。
Kaggle 笔记本截图。
至于 Kaggle 笔记本,每周使用 GPU 有 30 小时的限制。关于 Kaggle Notebook 的一个很好的想法是它对 Python 和 R 的原生支持,而 Google Colab 目前只支持 Python,而暂时支持 R 甚至 Julia 也是可能的。将 Google Colab 和 Kaggle Notebook 区分开来的一个区别是与 Kaggle 相关的内置社区。特别是,如果 Kaggle 上的笔记本对社区有用或有价值,它们也可以被投票支持。
除了这种云,虚拟专用服务器还提供了额外的场所,我们可以利用这些场所在几分钟或几秒钟内获得强大的计算能力。这些云服务提供商包括:
- 亚马逊网络服务
- 谷歌云*台
- 微软 Azure
软件
没有合适软件的好硬件对你没有好处。有各种各样的软件和工具可以提高你的生产力。让我们看看这些。
规划你的学习计划
有条理和有一个结构良好的计划可以帮助你消除时间,否则可以更好地利用。例如,如果在学习数据科学或从事数据科学项目时,您有一个清晰的学习或工作时间表可以参考,那么与匆忙地弄清楚今天、明天或后天您想要学习什么或想要从事什么项目相比,您将处于优势。
我用概念开发的生物信息学研讨会的大纲截图。
用一个清晰的时间表和学习计划武装自己,它可以让你在检查和加强你的生产力方面走得很远。想象一下当你没有购物清单就去杂货店购物的情况。虽然你可能会在飞行中发现你需要什么。当你回到家的时候,你可能会发现你可能忘记了购买一些重要的物品。因此,你记下的购物清单可能有助于防止这种情况发生。
同样,在您的数据科学学习之旅中,列出您想要了解或深入了解的主题。你可以从做一个简单的清单开始。你可以使用的一个很好的工具是观念,我很快会在我的 YouTube 频道 数据教授 上制作一个关于它的视频。
在我最*在一个生物信息学研讨会上教的在线教程中,我使用了 idea 来创建一个可共享的课程大纲。一件很棒的事情是,创建的教学大纲可以通过点击一个按钮作为网页共享。
集成开发环境(IDE)
IDE 可能是任何数据科学项目的支柱,因为它可以被认为是您的数据和代码的家。
显示文本编辑器的 Notepad++ 网站截图。
IDE 可以有多种形式,从简单文本编辑器到功能齐全的 IDE。此外,Jupyter 笔记本和它的变体可以被认为是这个系列中的另一个 IDE。
显示 IDE 的 Atom.io 网站截图。
一个简单的文本编辑器,比如 Notepad++和Atom 的基础版本是轻量级的,可以帮助你完成简单的项目。应该注意的是,Atom 是可定制的,因此附加的包和主题可以将您的文本编辑器升级到成熟的 IDE。
许多开发人员都熟悉的一个强大的 IDE 是 Visual Studio 代码或简单的 VS 代码。除了语法突出显示,它还支持在集成终端中运行代码、通过 Git 进行版本控制等。应该注意的是,在安装额外的包时,Atom 也支持这些特性。
显示 IDE 的 VS Code 网站截图。
VS Code 和 Atom 不仅支持 Python,它们同样可以很好地处理其他编程语言,如 C、C++、Java、Javascript、HTML、Julia 等。此外,两者都有跨*台支持,可以在 Windows、Linux 和 OSX 上运行。
其他流行的 Python ide 还包括 Spyder 和 PyCharm 。
展示其 IDE 的 Spyder 网站截图。
我非常喜欢 ide 的一个很棒的特性是变量浏览器功能,这是 Spyder 的一个核心特性,让人想起了 MATLAB。这可能是 IDE 最方便的特性之一,因为在变量浏览器中查看变量值的能力消除了在交互式命令行中不断打印变量值的需要。
我还喜欢的另一个功能是绘图窗口,在这里我们可以看到绘图的预览,而不必先将它写入文件。现在,其他 ide 也提供插件来支持这些特性。
显示其 IDE 的 PyCharm 网站截图。
正如前面提到的 Atom,VS Code,Spyder 和 PyCharm 的用户允许您通过安装额外的插件来进一步定制 IDE。
我发现一个特别有用的插件是来自 Kite 的免费 AI 驱动的代码完成,它目前支持所有主要的 ide。
Kite 分析代码的上下文,并通过人工智能建议下一步的行动,即建议你接下来可能输入的代码行。这里节省几秒钟,那里节省几秒钟,久而久之就会像滚雪球一样越滚越大。
Kite 网站的截屏显示了它在代码完成中的作用。请注意,在键入代码时,建议的代码块是一个下拉列表。
一致性
2020 年末,我的好朋友、杰出的数据科学家 YouTuber Ken Jee ,启动了 66 天数据 计划,旨在为有抱负的数据科学家灌输良好的学习习惯。
#66daysofdata 挑战赛旨在帮助培养良好的数据科学学习习惯。除了这些习惯,你还将加入一个欣欣向荣的社区,在那里你可以和其他志同道合的人一起学习和工作。
参加挑战很简单。只有两部分。
- 连续 66 天每天学习数据科学。你应该每天至少学习 5 分钟。
- 使用#66daysofdata 标签在您选择的社交媒体*台上分享您的进步。
正如 Ken 解释的那样,这有 3 个主要好处(阅读更多相关信息):
- 你养成了每天学习的习惯,这对你在数据科学和机器学习职业道路上的成功是不可或缺的。
- 你习惯于分享你的工作,这可以帮助你为自己创造许多机会。
- 社区认为你有责任。这通常是许多希望学习这些技能的人所缺少的部分。
从事数据项目
阅读、观看和聆听是被动的学习,有助于获取新概念,但要真正内化和具体化新获得的知识,将它们转化为行动是必不可少的。为什么通过从事数据项目。
做什么项目?
- Kaggle — Kaggle 是一个探索可以应对哪些数据挑战的好方法。此外,您还将有机会一瞥由 Kagglers 同事创建的公共笔记本,从而激发您自己的实现。
- 个人数据项目——环顾四周,看看什么能激发你的兴趣。例如,如果你是 Medium 上的博客作者,你可以下载你可以分析的用户数据。其实卓媒写祖烈 Rane 写过一篇文章 如何用 R 分析你的 Medium Stats。同样,你也可以分析你的网飞观看活动。为此,Saul Buentello写了 探索你在网飞与 R 的活动:如何分析和可视化你的观看历史 。有这么多你可能感兴趣的数据,因为如果是这样的话,你会更有可能发现它很有趣,很吸引人。
数据源
- 玩具数据集 —几个 Python 库包括某种形式的玩具数据集,您可以在设置数据项目时进行试验。
—Scikit—learn
—tensor flow
—Seaborn - 谷歌数据集搜索 —是一个搜索引擎,搜索互联网上各种存储库中的数据集。
- Data Repository @ Data Professor GitHub—我会偶尔向这个 repo 添加新的数据集供您使用。许多数据集来自我的教程视频,比如你可以自己从头构建的生物信息学数据集。如果你对此感兴趣,那么看看《T21》的 6 集《从头开始的生物信息学》系列播放列表。
分享你的知识
如上所述,强烈建议您将所学分享给志同道合者的数据社区,以便养成日常学习和负责任的习惯。除了在 Twitter 或 LinkedIn 上发布简短的帖子,你还可以在 Medium 上以博客的形式分享你所学到的东西。
还有什么比写下你的知识更好的方式来分享你的知识呢(或者甚至制作一个关于它的视频并在 YouTube 上分享)。写一个辅导博客是巩固你所学知识的好方法,也可以帮助其他人学习。
让你开始写第一篇博客的一些关键资源是考虑以下视频/文章:
- 由 TDS 编辑为走向数据科学撰稿
- 昆西·拉森(freeCodecamp 创始人)的技术博客文章
- 让我们从零开始写一篇数据科学博文
作者阿卡什(Jovian 的联合创始人兼首席执行官) - 媒体博客入门:由祖列·雷恩 ( 媒体作家和 YouTuber )为媒体新手
准备的 4 部分演练
建立你的作品集和作品集网站
投资组合有助于您展示您的数据科学项目,这些项目可能会吸引潜在的雇主,并允许您存档您在数据科学方面学到的专业知识。共享您的数据科学项目的代码和数据也可能对数据社区,尤其是其他有抱负的数据科学家大有裨益。那么,您在哪里共享项目的数据和代码呢?推荐的*台是 GitHub ,尽管也有类似的替代*台,如 BitBucket 或 GitLab 。
GitHub 知识库用于用 Python 构建生物信息学 Web 应用。
左边的截屏显示了一个 GitHub 库的例子,这是我在 YouTube 频道上制作的关于 用 Python 构建生物信息学 Web 应用的教程。
如您所见,所有代码和数据都在 GitHub 知识库上公开共享(以促进研究的可重复性),这将允许其他人构建该项目。
我还制作了一个视频,在视频中,我在上一步一步地演示了如何在 GitHub 上创建自己的数据科学组合。
除了拥有 GitHub 个人资料来分享您的数据科学项目之外,portfolio 网站还可以被视为一张数字名片,您可以用它来打造自己的个人品牌。作品集网站当然会包含项目信息,但也可能会提供你希望分享的额外信息(如教育背景、工作经验等)。).
订阅我的邮件列表,获取我在数据科学方面的最佳更新(偶尔还有免费赠品)!
关于我
我是泰国一所研究型大学的生物信息学副教授和数据挖掘和生物医学信息学负责人。在我下班后的时间里,我是一名 YouTuber(又名数据教授)制作关于数据科学的在线视频。在我制作的所有教程视频中,我也在 GitHub 上分享 Jupyter 笔记本(数据教授 GitHub page )。
***https://www.youtube.com/dataprofessor
在社交网络上与我联系
✅YouTube:http://youtube.com/dataprofessor/
♇网站:http://dataprofessor.org/(在建)
♇LinkedIn:https://www.linkedin.com/company/dataprofessor/
♇Twitter:https://twitter.com/thedataprof
♇Facebook:http://facebook.com/dataprofessor/
♇github:https://github.com/dataprofessor/
♇insta gram:【t2t***
数据科学的超能力:缺失数据
原文:https://towardsdatascience.com/data-science-superpowers-missing-data-d814ede9d423?source=collection_archive---------48-----------------------
使用最大似然预测输入缺失值
马库斯·斯皮斯克在 Unsplash 上拍摄的照片
数据并不总是漂亮的…
…好吧,让我们面对现实:数据几乎从来都不漂亮。
丢失数据是非常常见的事情,有许多方法可以解决这个问题。有时删除缺少值的条目没问题,其他时候使用*均值、中值或众数进行输入是一种方便的策略。
但是还有一个办法!
DS 超级大国:用 ML 预测填充缺失值!
因此,您正在进行一个项目,在这个项目中,您将要预测一些事情(假设house_price
),并且您在预测列中遇到了一些丢失的数据。
在我们预测y
之前,先预测一下x
!
史蒂文·卡梅纳在 Unsplash 上拍摄的照片
示例:设置
导入库。
# Import libraries
import pandas as pd
import numpy as np
from sklearn.datasets import make_regression
from sklearn.ensemble import RandomForestRegressor
创建玩具数据集。
# Set random_state variable.
R = 2020# Set up phony names for features.
x_vars = [
'year_built',
'bedrooms',
'bathrooms',
'sqft',
'lot_size'
]
y_var = ['sale_price']# Make a toy dataset.
X, y = make_regression(
n_samples=1_000,
n_features=5,
n_targets=1,
random_state=R)# Convert to pandas.
X = pd.DataFrame(X, columns=x_vars)
y = pd.DataFrame(y, columns=y_var)# Set 30 random missing values in `year_built` column.
X.loc[X.sample(30, random_state=R).index, 'year_built'] = np.nan
我们现在有两只熊猫数据帧:X
和y
。这些列已经有了名称——尽管这些名称对于数据值来说毫无意义,但是我们将使用它们进行演示。
重要的是,我们在整个year_built
列中遗漏了一些值。我们希望使用 ML 来填充这些值,而不是丢弃它们或使用*均值。
>>> X.shape, y.shape
((1000, 5), (1000, 1))>>> X.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 5 columns):
year_built 970 non-null float64
bedrooms 1000 non-null float64
bathrooms 1000 non-null float64
sqft 1000 non-null float64
lot_size 1000 non-null float64
dtypes: float64(5)
memory usage: 39.2 KB
根据我们的数据,事情看起来是有条不紊的。让我们开始有趣的部分吧!
示例:流程走查。
这很简单,只需从缺少值的列中分离出预测列,实例化一个模型,拟合它,并将其预测设置到数据框架中!先一步一步来,然后功能化。
- **确定哪个 X 列将用于预测,哪个 X 列是新的临时目标。**在我们的例子中,我们将使用
X_cols = ['bedrooms', 'bathrooms', 'sqft', 'lot_size']
和y_col = 'year_built'
。
2.实例化并拟合模型。我喜欢使用随机森林模型,因为它们不容易过度拟合,并且可以获取未缩放的数据。
rf = RandomForestRegressor(random_state=R)# Filter data that does not include rows where `y_col` is missing.
rf.fit(
df[~df[y_col].isna()][X_cols],
df[~df[y_col].isna()][y_col]
)
3.获得预测并设置到数据帧中。
y_pred = rf.predict(df[df[y_col].isna()][X_cols])df.loc[df[y_col].isna(), y_col] = y_pred
就是这么回事!简单!
当然这个过程是喊着要功能化的,那就干吧!我们还应该给出一些详细信息,并检查森林的适合程度。
用 RF:函数填充缺失值
def fill_missing_values_with_rf(df: pd.DataFrame,
X_cols: list,
y_col: str,
astype: type,
random_state: int,
verbose=True):
"""
Replace missing values from `y_col` with predictions from a
RandomForestRegressor.
"""
if not df[y_col].isna().sum():
if verbose:
print(f'No missing values found in `{y_col}`.')
return df
df = df.copy()
# Instantiate and fit model.
if verbose:
print('Instantiating and fitting model...')
rf = RandomForestRegressor(random_state=random_state)
rf.fit(
df[~df[y_col].isna()][X_cols],
df[~df[y_col].isna()][y_col]
)
if verbose:
print('\tModel fit.')
r2score = rf.score(
df[~df[y_col].isna()][X_cols],
df[~df[y_col].isna()][y_col]
)
print(f'\tModel `r^2`: {round(r2score, 3)}')
# Get predictions.
if verbose:
print('Predicting values...')
y_pred = rf.predict(df[df[y_col].isna()][X_cols])
# Set values in df.
if verbose:
print('Setting values...')
df.loc[df[y_col].isna(), y_col] = y_pred
# Set dtype.
df[y_col] = df[y_col].astype(astype)
if verbose:
print('Complete!')
return df
我们现在可以看到运行中的函数:
>>> new_df = fill_missing_values_with_rf(
X,
['bedrooms', 'bathrooms', 'sqft', 'lot_size'],
'year_built',
float,
R)
Instantiating and fitting model...
Model fit.
Model `r^2`: 0.844
Predicting values...
Setting values...
Complete!>>> new_df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 5 columns):
year_built 1000 non-null float64
bedrooms 1000 non-null float64
bathrooms 1000 non-null float64
sqft 1000 non-null float64
lot_size 1000 non-null float64
dtypes: float64(5)
memory usage: 39.2 KB
看起来棒极了!
我们研究了一个成熟的过程,即获取带有缺失值的数据,并用我们最擅长的方法智能地填充它们:建模!
这种数据处理无疑是 DS 的一大优势。我们可以预测未来、过去和未知——我们应该利用这一点!
用任何方法填充缺失数据都要用心。
非数据科学家如何为人工智能项目带来价值的 5 个技巧
原文:https://towardsdatascience.com/data-science-survival-guide-for-non-technical-colleagues-4ec0792ad434?source=collection_archive---------52-----------------------
面向非技术同事的数据科学生存指南
安德里亚斯·瓦格纳在 Unsplash 上拍摄的照片
我之前的文章技术性很强,主要面向数据科学家同事,相比之下,我这次决定写一篇针对其他团队角色的文章,这些角色经常出现在数据科学项目中,我们作为数据科学家与之合作。
无论你是一名产品经理、一名领域专家、一名 scrum master ,甚至是一名没有多少数据科学经验的开发人员,如果你参与了一个数据科学项目并真正关心其结果,我将尝试给你一些提示,告诉你该期待什么、如何进行,以及一般来说如何理解实际发生的事情。
“人工智能”
让我先澄清一些进入项目时可能出现的误解。“人工智能”这个流行语经常以多种方式和语境使用,这可能会导致不适当的期望。它最初可能被认为是一个神奇的盒子,可以解决你所有的问题,你只需要问一下。不幸的是,这与现实相去甚远。
事实是,开发一个可靠工作的人工智能系统花费的时间和精力与开发任何其他软件一样多,甚至更多。此外,这条路并不总是像经典软件开发中那样直截了当,而且可能会一路走来。这个过程通常需要做多次实验,根据实验结果决定下一步行动。这也意味着很难提前计划并给出合理的时间估计。
此外,你应该意识到,在某些情况下,使用人工智能的方法实际上可能不是你的问题的正确解决方案,也不是值得追求的东西。确保在真正投入之前也考虑其他选择,如果你决定继续,请准备好人工智能可能不一定按照你想象的方式工作。
秘诀 1:正确设定你的期望,考虑所有的选择。
输入和输出
接下来,团队就需要解决的任务达成一致是至关重要的,并在项目的整个过程中牢记这一点。乍一看,这似乎是显而易见的,但现实往往不同。
真正需要的是具体说明人工智能系统的输入是什么,更重要的是,它的输出是什么。给你一个例子,想象你正在建立一个狗分类系统,它能够告诉你,图片中是否有狗。这个系统的输入是一个图像,输出是 y es 有狗或者 no 没有。
一个狗分类器的例子,展示了它的输入和输出。图片作者。
输入和输出决定了整个系统如何工作,需要什么样的数据来构建它,以及最终如何评估解决方案。因此,在项目中间改变它们(例如在图片中也检测到一只猫)几乎总是会有负面结果,并且实际上将项目重置回开始。
技巧 2:仔细指定任务的输入和输出,不要改变它们。
数据
一般我们说一个 AI 系统=数据+代码。这意味着数据本身是系统的一部分,并定义了系统如何工作。虽然数据科学家可以独自处理所有的编码,但是没有数据,无论他多么熟练和有经验,他也做不了什么。
数据需要与您试图解决的任务相对应,这意味着它们必须以您定义的相同方式包含输入和输出信息。在最好的情况下,包含这两种信息的数据在项目开始之前就已经收集好了,这意味着数据科学家已经可以开始构建系统了。
也可能发生这样的情况,您只有输入信息可用的数据,而您遗漏了输出。回到我们的狗分类器,一个例子是我们有很多动物的图片,但是我们不知道哪些是狗,哪些不是。在这种情况下,我们人类需要自己查看图片,并手动分配正确的输出标签——这一过程称为数据标签。系统需要输出标签,以便学习将它们分配给给定输入的任务,因此,在标记数据时非常精确非常重要,因为您实际上是在教导系统。
最后一个场景是你没有任何数据对应于我们任务的输入和输出。如果发生这种情况,明智的做法可能是重新考虑是否一开始就开始这个项目。一个可行的方法是尝试在网上找到一些合适的数据集,并使用它们。然而,你的任务越独特,就越难完成。
技巧 3:定义人工智能系统应该如何使用数据工作。
估价
在您设法收集到合适的数据集之后,数据科学家可以开始训练和评估系统。
其工作方式是将数据集分成**个训练集和测试集。**不出所料,训练集用来训练系统,测试集用来评估系统。您将听到的所有指标都将在测试集上进行计数,系统在训练期间实际上从未看到这些数据,就像它从未看到未来将用于生产的数据一样。这使得评价公*并反映了现实。
你将听到的得出的数字和指标有时可能具有欺骗性。从经验来看,如果一些报告的数字说 99.8%或类似的准确性,很可能有问题。因此,不要只是听和看这些数字,希望它们尽可能的高,而是试着理解它们到底是如何计算的,以及它们代表了什么。不要犹豫,请数据科学家解释任何给定的指标,他或她会很乐意这样做。
此外,您可以并且应该影响实际报告和优化的指标。数据科学家对领域的了解没有你多,这可能是你最初参与项目的原因。这是你大放异彩的机会。通常情况下,系统所犯的某些类型的错误会比其他错误对你的伤害更大。回到我们的狗分类器的例子,当你说某样东西是狗,而它实际上不是(假阳性错误),这可能比你不说某样东西是狗,而它实际上是(假阴性错误)更伤害你。这些都可以反映在使用的指标中,因此,在开始时就使用的指标达成一致是一个好的做法,就像您就输入和输出达成一致一样。
显示 dog 分类器错误类型的矩阵。图片作者。
技巧 4:优化反映现实的、每个人都理解的指标。
误差分析
一旦系统经过培训和评估,而您对其性能仍不满意,就需要找到改进它的方法。数据科学家对此可能并不总是有直接的答案,因此,您需要进行错误分析。
这意味着手动查看系统正在犯的错误,并试图确定为什么会这样。您通常会对实际的错误感到惊讶,但也会对系统在生产中可能出现的故障有一个总体的感觉。再次使用我们的狗分类器,错误可能是例如图像太模糊,狗的一部分被另一个对象遮挡,或者图像包含一只与狗相似的狼。另一种错误可以是,人类赋予的标签根本就是错误的,系统其实是正确的。当数据标注任务完成得非常快,或者没有具体的指导方针时,通常会发生这种情况。
不要被一个错误冲昏了头脑,而是试着找出模式并量化它。分析的输出不应该是“我看到有一只狼被分类为狗”,而是“30%的错误是狼被分类为狗,20%是模糊的图像,5%是错误的标签等。”。并非所有类型的错误都可以轻易修复,量化它们可以帮助确定哪些是真正值得追求的,以及如果你成功了,潜在的性能增益是多少。
技巧 5:系统地进行错误分析,关注模式而不是单个例子。
结论
这是我认为你的角色可以带来最大价值的项目的 5 个技巧和阶段。我希望它能让你的项目运行得更顺利,让数据科学家和其他团队成员更开心。
感谢您的阅读!
</1-to-5-star-ratings-classification-or-regression-b0462708a4df>
数据科学:推动可持续销售和增长的秘密
原文:https://towardsdatascience.com/data-science-the-secret-to-driving-sustainable-sales-and-growth-7ac7bda56fff?source=collection_archive---------42-----------------------
数据科学和机器学习是用来从花哨的风投那里筹集资金的时髦词汇吗?不完全是。了解如何以及为什么您需要通过数据科学增强销售引擎的能力。
斯蒂芬·菲利普斯-Hostreviews.co.uk 在 Unsplash 上的照片
加 a 变,加 C'est La Même 选了
让·巴普蒂斯特·阿方斯·吉田
万一你不会说法语(或者你几乎忘了高中学的所有东西——看看你们加拿大人!).永恒的谚语;“事物越是变化,就越是保持不变”,这意味着无论我们经历怎样的动荡变化,现状都会得到巩固。
我们首先想到的是销售运营。在过去的几十年里,销售运作已经取得了长足的进步。以前,当我们很多人想到销售的时候,首先映入我们脑海的是一个肮脏的二手车推销员,试图在每个角落向你搜刮钱财。或者那个戴软呢帽的家伙,挨家挨户地推销下一个最好的吸尘器或特百惠餐具。甚至在过去的一年里,我们已经看到销售业务发生了重大转变,从面对面销售转变为几乎完全通过 Zoom 来满足我们的潜在客户。
我们的观点是,随着时间的推移,销售流程发生了很大变化。不管市场的趋势和变化如何,销售运营总是围绕卖得更好、卖得更快和卖得更多。这毕竟是资本主义市场经济。
2021 年的销售运营
公*地说,在过去的几十年里,销售变得更加困难了。
信息可以更广泛地获得。竞争更加激烈。由于这个原因,现代顾客有更高的期望,在购买之前必须有信任感。在当今社会,建立牢固、诚实的关系对于推动销售至关重要。
我们也正在经历第四次技术革命。技术已经席卷了销售业务,并简化了我们的许多日常流程。似乎有一种服务或工具可以满足你的任何想象。然后你眨眼,不知何故,有人创造了另一种工具,使你的业务更有效率。
尽管有各种令人惊叹的软件服务和解决方案,许多销售团队仍然生活在石器时代。或者被称为…超级明星文化。
巨星文化销售
是高度个人主义的。依靠几个人带领团队达到销售配额。精力和资源都倾注在少数几个似乎能把世界扛在肩上的销售奇才身上。与此同时,销售团队的其他成员没有得到改进流程所需的支持。
这种文化不好有两个原因。首先,销售超级明星并不常见。他们知道自己的价值,如果他们离开公司是为了一份更好的工作,你最好祈祷另一份工作。
其次,当焦点集中在销售奇才上时,销售团队的其他人就被遗忘了。他们没有得到成长为下一个销售奇才所需的辅导或指导。他们也知道自己的价值,如果缺乏工作文化,他们也会消失。没有人想要一个流失和燃烧的文化。
数据科学技术阻止巨星文化。
*年来最大的技术变革之一(我们
将数据科学技术集成到销售流程中。这完全改变了决策。而不是根据观察和意见做决定。我们可以更加自信地根据数据和数字做出决策。我们不会被迫依靠几个销售超级明星来维系。
数据科学结合了领域专业知识、编程技能以及数学和统计知识,以从数据中提取有意义的见解。
通过采用数据科学方法,我们选择了一种科学驱动的文化。
科学驱动的文化优先考虑:
- 技术被用来提高我们日常工作的效率。它也是收集必要数据以做出明智决策的重要工具。
- 流程就是你的团队正在做的事情,让销售漏斗中的机会下移。通过对流程进行优先排序,责任被放在销售漏斗步骤的功能上,而不是个人。当发现问题时,我们关注的是如何修复流程,而不是人。
- 团队合作对科学驱动的文化至关重要。所有的过程都需要记录并在组织内共享。当犯了错误或发现了最佳实践的见解时,他们不应该作为个人的秘密。相反,它们应该被共享,以使每个人和整个组织受益。
- 当我们从错误和成功中学习时,我们就获得了技能。这是一个持续的过程。当我们不断收集数据并获得反馈时,我们能够在最困难的地方学习和改进。
科学驱动的文化是基于数字和数据的持续反馈、学习和决策。它是关于修复薄弱的过程,而不是修复人。
数据科学的工作原理
数据科学依赖于数字。不是意见。不是直觉。而是冰冷、坚硬、可计算的数字。
指标必须是可测量的和客观的。如果你的衡量标准是主观的,基于观察和个人经验——把它们当作一种意见。恕我直言,观点并不重要,也不能保证结果。没有数字和数据,你的衡量标准是没有意义的,还会有争议。
让我们使用主观方法将科学方法应用于销售漏斗:
- 观察:我们没有完成销售配额:(
- 问题:为什么我们没有完成销售配额?
- 假设:嗯,看起来销售代表打得不够多。
- 预测:如果销售代表打更多的电话,我们就会卖出更多。
- 测试:销售代表打更多电话
- 结果:仍未达到销售配额。
- 提炼:嗯,那没用。可能是 ______。(并重复)。
使用主观方法(也就是我们的直觉),我们倾向于进行观察,做出假设,并测试它。当你的第一个假设不是问题时,冲洗并重复步骤 3-7。重复这些步骤是对时间和资源的巨大浪费。
然而,当我们使用数据科学并认识到漏斗中的某个地方存在性能差距时。只要看看这些数字,就能很容易地找出问题所在。没必要玩猜谜游戏。从那里可以提供反馈,并可以针对销售漏斗中的确切问题制定具体的解决方案。这意味着解决问题的周转时间大大加快。而不是重复第 3-7 步,直到你准备放弃并试图解决下一个问题。
这对个人和组织都是有益的。从个人主义的角度来看,我们可以分析一个表演者在哪里成功,在哪里挣扎。这种反馈是个性化的,可以帮助个人改进他们需要的地方。
在更大的范围内,组织可以使用这些数据来制定更高效的销售流程,并为未来客户的下一步最佳行动提供有价值的见解。
拿到数据了吗?
大多数组织一旦达到一定的规模,就会有一个正式的销售流程,并且正在收集数据。这确保了它们可以继续扩展。典型的销售报告分解了基本的关键绩效指标(KPI)。电话/邮件数量、转化率、失去的机会、利润率、客户获取成本等等。并不是说这些都是不好的指标。它们对每个企业都是必要的。问题是他们并没有讲述整个故事。
KPI 往往很高。他们忽略了更好的指标,这些指标可以让我们更准确地了解到底发生了什么。了解你所在的行业,知道哪些 KPI 与你试图解决的问题相关,这一点很重要。此外,如果您希望在销售运营中采用基于科学的方法,关键是要有人知道如何提出正确的问题,能够提取必要的数据并提出有意义的解决方案。
作者:
莎拉·韦斯特伯里 是 integrityCo 的一名人类学地下转需求生成专家。凭借以人为本的学术和工作背景,Sarah 热衷于与她的网络建立有意义和信任的关系。虽然数据科学、人工智能是一个高度技术性的领域,但 Sarah 努力使这些服务简化和可访问,以帮助公司实现他们的目标。
Hamid Omid 是 integrityCo 的创始人,在数据科学、机器学习、产品管理领域拥有多年的经验,极具幽默感,Hamid 喜欢帮助公司识别有价值的变革机会,专注于数字产品和大数据。随着行业开始了解人工智能等新技术的未开发资源,高管们正在寻找创新战略,并从他们的数据中创造价值。哈米德分享了他的专业知识,以帮助公司规划成功的人工智能产品,并实现其成功的最大潜力。
基于 4 年 Kaggle 调查的数据科学趋势
原文:https://towardsdatascience.com/data-science-trends-based-on-4-years-of-kaggle-surveys-60878d68551f?source=collection_archive---------23-----------------------
从 2017 年到 2020 年,数据科学领域的多样性、工资以及使用的工具和算法发生了怎样的变化?
自 2017 年以来,网站Kaggle.com对数据科学家和其他对数据科学和机器学习领域感兴趣的人进行了年度调查。调查问题从性别和高等教育水*等人口统计问题,到有关编程语言、工具和使用的机器学习算法的问题。每年调查的完整描述以及结果可以在 Kaggle 的网站上找到 2017 、 2018 、 2019 和 2020 。
因为现在是年底,而且现在有四年的调查结果,我认为看看过去几年该领域的趋势会很有趣。新的算法和技术还在继续发展,所以看看新技术是否会取代旧技术,或者只是与现有技术一起使用,这将会很有趣。
每年接受调查的人数,每种颜色代表一个不同的职位。“未就业”类别包括那些被认定为“学生”的人。
受访者人数一直居高不下,每年约有 17,000 至 24,000 人参与。其中,每年约有 2,400 至 4,100 名调查受访者将自己的职位称为“数据科学家”。左边是回答者人数的图表,按他们报告的职位分类。
许多受访者拥有数据科学家之外的头衔。出于本文的目的,我将“业务分析师”和“数据分析师”合并为一类。由于某种原因,“机器学习(ML)工程师”只在 2017 年和 2020 年的调查中作为选项出现,因此在 2018 年和 2019 年的结果中缺少这一类别。
在深入研究结果之前,有许多问题只在一两次调查中被问到,所以我在此不包括这些信息。在四年的调查中,至少有三年一致的问题是人口统计学问题(如年龄、职称等。)以及关于工作中积极使用的编程语言和机器学习算法的问题。
此外,这里的重点是查看数据科学在行业中的实践趋势,事实上,Kaggle 调查中的许多问题都是针对工作专业人员的。因此,我将重点放在受雇于该领域的受访者身上。
多元化、薪酬和教育
就受雇为数据科学家或从事与数据科学相关工作的人而言,绝大多数是男性。在过去的几年里,非男性的比例略有提高,但除了数据和商业分析师,该领域的男性比例一直稳定在 80%以上。
每个领域中被调查者认为是男性的百分比。
大多数职位的年薪总额中值(即工资加奖金)都略有增加,只有“软件工程师”职位除外,其工资保持不变。
五类在职专业人士(数据科学家、软件工程师、机器学习工程师、数据和业务分析师,以及职称不同于上述任何一类的人)的总薪酬中值(工资+奖金)。这里显示误差线是因为 2017 年后,受访者被要求选择一个工资范围,而不是给出一个具体的数字。
职称为“数据科学家”的调查受访者获得的最高学位分布。
我在这里看到的最后一个人口趋势是数据科学家接受的正规教育。有趣的是,既没有博士学位也没有硕士学位的数据科学家的比例略有增加,从 27%增加到 32%。数据科学和机器学习方面的在线课程以及训练营已经激增。也许,这些调查显示的趋势反映了越来越多的人通过这种非正规教育进入这个领域。此外,拥有研究生学位的员工比例稳步下降,这在拥有除“数据科学家”之外的其他职称的受访者中普遍存在。
使用的编程语言
对于那些进入数据科学领域的人来说,一个常见的问题是他们应该学习哪种编程语言。查看数据科学家、软件工程师和机器学习工程师使用的编程语言,超过 78%的人在调查的四年中报告在工作中使用 Python。对于数据和业务分析师来说,使用 Python 的比例显著增加,从 61%增加到 87%。
使用所列编程语言的不同职位类别的调查受访者的百分比。调查对象可以选择他们所使用的编程语言。
使用 R 的数据科学家仍然有一个坚实的阵营,但是,在现场使用 R 的数据科学家的比例正在迅速下降。对于数据科学家和数据分析师来说,使用 R 的员工比例下降了 33 个百分点以上(数据科学家从 64%下降到 23%)。
在问数据科学从业者正在积极使用什么编程语言的同时,Kaggle 还问受访者,他们最建议有抱负的数据科学家学习哪种语言。总体而言,推荐 Python 的百分比有所增加,其中 R 语言的相应减少幅度最大。
不同职位类别的调查受访者中推荐有抱负的数据科学家学习所列编程语言的百分比。每位受访者只能选择一种语言。
另一个有趣的趋势是使用 SQL 的数据科学家和数据分析师的比例下降了大约 30 个百分点。然而,尽管如此,推荐有抱负的数据科学家首先学习 SQL 的数据科学家的比例实际上略有增加(从 3%增加到 7%)。
对于机器学习工程师来说,不同编程语言的使用量一直保持持*,甚至略有下降。这可能是因为机器学习工程师越来越专注于单一语言,而较少使用各种语言,或者他们使用的其他语言比调查中包括的一些语言更多。虽然,就语言机器学习工程师推荐学习而言,推荐 Python 的百分比略有增加。
对于职称不同于图中所示的人,也有类似的趋势,Python 的使用增加了,而 R 的使用减少了。
使用的机器学习算法
最后,数据科学的核心是用于分析数据和做出预测的技术。在某些年份的调查中,存在关于一般技术以及在数据科学工作流程的不同部分花费多少时间的问题。然而,在四次调查中有三次出现的一个问题是专门关于所使用的机器学习算法的(由于某种原因,这个问题没有出现在 2018 年的调查中)。
使用所列机器学习算法的不同职称类别的调查受访者的百分比。调查对象可以选择他们所使用的算法。
也许让有抱负的数据科学家放心的是,更“基本”的线性和逻辑回归方法在从业者中仍然非常流行,超过 80%的数据科学家说他们在工作中使用这些方法。
一般来说,机器学习算法的第二个最受欢迎的类别是决策树和随机森林。尽管梯度推进机器(如 XGBoost)越来越受欢迎,但这些方法的受欢迎程度一直保持稳定。
另一种广泛使用的算法是卷积神经网络(CNN),它通常用于图像数据。对于每一类职位,CNN 的使用率增加了 20 个百分点。对于机器学习工程师来说,这种方法仍然像线性和逻辑回归一样受欢迎。
虽然不像 CNN 的使用那样引人注目,但用于时间序列和序列数据(如单词序列)的递归神经网络(rnn)的使用也有所增加。
有趣的是,标准密集神经网络的使用在过去四年中实际上已经减少了。也许,这是由于越来越多的使用更专门的神经网络,如 CNN 和 RNNs。
本次调查中遗漏的一类机器学习算法是无监督的学习方法,如聚类和维度缩减技术。看到这些技术的使用趋势也是很有趣的。
摘要
经过四年的 Kaggle 调查数据,以下是数据科学中一些值得进一步研究的重要趋势:
- 在过去几年里,拥有研究生学位的数据科学家的比例在缓慢下降。
- Python 仍然占主导地位,大约 80%或更多的人在他们的工作中使用它。甚至在业务和数据分析师中,越来越多的员工使用 Python 进行报告。
- 数据科学从业者和数据分析师使用 SQL 的减少表明,人们越来越多地使用其他方法来访问、存储和操作他们的数据。
- 数据科学从业者继续积极地使用更基本的线性和逻辑回归方法,至少在他们的一些工作中。
- 在过去几年中,卷积神经网络(CNN)和递归神经网络(RNNs)等专用神经网络的使用迅速增加,而传统密集神经网络的使用在同一时期有所下降。
希望 Kaggle 在未来几年继续进行这项调查,以便我们可以继续研究这些趋势,并随着数据科学领域的不断发展,发现一些新趋势。
这里需要注意的是,我没有对通货膨胀进行调整,所以由于通货膨胀的影响,工资的增长可能没有看起来那么显著。
[2]我只包括美国受访者的工资,因为 2017 年的调查要求受访者以本国货币提供工资,而后来的调查要求受访者以美元范围回答。因此,在本文涵盖的四年中,货币兑换的趋势可能会影响数据中出现的任何趋势。
三种算法预测 2014 年预期寿命的准确性比较
原文:https://towardsdatascience.com/data-science-tutorial-project-37c8fecd8432?source=collection_archive---------26-----------------------
多元线性回归、随机森林或 XGBoost 在 R、MSE 和 RMSE 方面会显示出最好的结果吗?
阿诺德·多格里斯在 Unsplash 上的照片
GitHub 资源库链接:https://GitHub . com/nazaryaremko/Data-Science-Tutorial-Project
随着统计模型的不断发展及其快速计算机化,数据科学家可以使用越来越多的工具来从公开可用的数据集中提取有价值的信息。过去需要数百行代码和数小时来理解如何实现一个模型,现在只需要几行代码就可以实现强大的统计库的功能。许多大学数据科学家在分析公共数据集时面临的一个问题是使用什么工具-当有这么多工具可用时,我们如何确保选择合适的算法来解决具体的任务?
在本文中,我将实现三个不同的模型来解决一个回归问题:多元回归、随机森林和 XGBoost。具体来说,我将使用世卫组织的公共 Kaggle预期寿命数据集,其中包含来自 193 个国家的数据。我们试图预测的因变量将是每个国家的*均预期寿命。有 X 个预测因子,包括每 1000 人口中的成人死亡率(两性)和每 1000 人口中的婴儿死亡率。
探索性数据分析
在实现模型之前,我执行了一个简单的探索性数据分析,以显示我正在处理哪种数据集。我从上传数据集开始,过滤掉所有不是 2014 年的行。我选择专门处理 2014 年的数据,因为我想从数据集中选择最*的数据,而 2015 年的行中有很多缺失的数据。
life_expectancy = pd.read_csv(io.BytesIO(uploaded['Life Expectancy Data.csv']))life_expectancy = life_expectancy[(life_expectancy.Year == 2014)].iloc[:,0:]
此外,我运行了以下命令来显示结果数据框的形状和头部:
life_expectancy.shape
图片作者。
life_expectancy.head(10)
图片作者。
print(" \nCount total NaN at each column in a DataFrame : \n\n",life_expectancy.isnull().sum())
图片作者。
数据预处理
根据 EDA 结果,我们可以看到大约一半的列中有缺失值。处理缺失值的一种常见而简单的方法是用相应列的中位数或均值来替换所有缺失值。这种方法的一个问题是,它大大降低了属性的方差,这可能导致预测不佳(Kubara,2019)。因此,我采用了另一种方法——迭代插补。迭代插补是一种使用数据集中的其他特征来估计给定特征中缺失值的方法。这一过程是连续进行的,因此新的估算值可以作为模型的一部分用于预测其他特征,并反复提高估计值的准确性(Brownlee,2020)。
为了实现这个方法,我使用了 sklearn 库中的 IterativeImputer 方法。然后,生成的数据集用于模型拟合和预测。
多变量回归
回归是数据科学中最常用的方法之一。回归用于从数学上量化独立变量(或多元回归中的多个变量)对因变量(多元回归,未注明)的影响。在我们的例子中,我们有 18 个可能的预测变量,我们的目标是找到它们的组合,以产生最高精度的模型。在选择预测变量之前,我将数据集分为训练集和测试集,并使用训练集拟合线性模型。此外,我根据测试集中自变量的值预测了因变量的值。最后,我计算了 MSE、RMSE 和 R 值来评估我们模型的性能:
图片作者。
为了挑选预测变量的最佳组合,我决定使用 R 中的 leaps 库,它对独立变量的最佳组合进行彻底搜索,以预测线性回归中的因变量。我将数据集导入到 R 中,并运行以下命令
regsubsets.out <-
regsubsets(Life.expectancy ~ Adult.Mortality + infant.deaths + Alcohol + percentage.expenditure + Hepatitis.B +
Measles + BMI + under.five.deaths + Polio + Total.expenditure + Diphtheria + HIV.AIDS + GDP + Population +
thinness..1.19.years + thinness.5.9.years + Income.composition.of.resources + Schooling,
data = data,
nbest = 1,
nvmax = NULL,
force.in = NULL, force.out = NULL,
method = "exhaustive")plot(regsubsets.out, scale = "adjr2", main = "Adjusted R^2")
此代码的输出是一个预测值组合表,以及带有相应预测值组合的模型的调整 R 值。
图一。多元回归模型中不同预测变量组合的调整 R 值。图中的每一行都有黑盒(模型中使用了该变量)和白盒(未使用该变量),它代表一个单独的多变量模型,具有自己的 R 值。图片作者。
我们需要考虑该表的两个方面,即预测值的数量和 R 值。我们的目标是选择一个既省钱又有高精度的模型。我们可以测试一些变量组合,它们都具有较高的 R 和少量的变量:
- 模式 1:成人死亡率、艾滋病毒/艾滋病、资源的收入构成(ICR);
- 模型 2:成人死亡率,艾滋病毒/艾滋病,ICR,总支出;
- 模型#3:成人死亡率、艾滋病毒/艾滋病、ICR、总支出、乙型肝炎;
为了测试这些模型的性能,我重复了前面描述的相同步骤,并计算了 MSE、RMSE 和 R:
图片作者。
正如我们所见,根据所选指标的值,模型#3 具有最佳性能。
图二。不同国家预期寿命的实际值与预测值。通过在数据集的测试部分拟合多元回归模型来计算预测值。图片作者。
图片作者。
随机森林
随机森林是一种监督学习算法,使用多个决策树进行分类和回归任务(Yiu,2021)。随机森林是最准确的学习算法之一。该算法的一个重要方面是,其中涉及的所有决策树彼此并行运行,并且返回所有树之间的*均预测(在回归任务中)或类别模式(在分类中)。这导致减少过度拟合、方差和结果的更高精度(随机森林完全指南,2021)。
为了实现随机森林模型,我使用了 sklearn 库中的 RandomForestRegression 函数。首先,我使用所有可用的预测变量来拟合模型。这导致了以下度量值:
此外,我还使用了 SelectFromModel 函数,它标识了模型中最重要的变量。我只使用了在训练集上训练的模型,以避免过度拟合。这项职能的产出包括成人死亡率、艾滋病毒/艾滋病、ICR、学校教育。然后,我再次拟合相同的随机森林模型,但仅包括这四个变量,从而得出以下结果:
图 3。不同国家预期寿命的实际值与预测值。预测值是通过在数据集的测试部分拟合随机森林模型来计算的。图片作者。
图片作者。
正如我们所看到的,结果稍微好一些,我们将模型减少到只有四个变量。
XGBoost
XGBoost 或极端梯度提升是一种机器学习算法,最*因其在执行回归和分类等常见任务方面的高效率而受到欢迎(Brownlee,2021)。像 Random Forest 一样,XGBoost 也使用决策树来估计模型参数,但是,有一个关键的区别,即 XGBoost 是以连续的方式使用它们,这意味着它适合一个模型,然后使用其残差来适合下一个模型,依此类推。总体而言,XGBoost 是一种梯度提升算法(它使用梯度下降算法来最小化损失函数),使用决策树作为其预测器(Morde,2019)。它非常适用于结构化的表格数据,这也是它有望在世卫组织数据集上产生良好结果的原因。
为了将 xgboost 算法应用于我们的回归问题,我将使用 XGBoost 库中的 XGBRegressor 函数。这个库的一个很大的特点是,在拟合模型之后,它给我们提供了关于特征重要性的信息。
图 4。XGBoost 模型中不同自变量的重要性。所有的重要性总和为 1,重要性最高的变量对因变量的影响最大。图片作者。
正如我们所见,特性 11 和 16 的重要性最高,其次是特性 17、0 和 15。该库还有一个非常有用的 SelectFromModel 函数,它可以根据提供的特征重要性阈值选择最佳预测值组合。为了检查模型在不同阈值下的表现,我对 xgb . feature _ importances _ function 的输出进行了排序,并拟合了 18 个模型,从所有变量开始,在下一步中丢弃一个重要性最低的变量。根据模型指标,表现最佳的模型有以下 15 个预测变量:
图片作者。
并产生以下模型度量结果
图片作者。
图 5。不同国家预期寿命的实际值与预测值。预测值是通过在数据集的测试部分拟合 XGBoost 模型来计算的。图片作者。
正如我们所看到的,XGBoost 算法产生了最好的结果,将艾滋病毒/艾滋病和 ICR 作为其最重要的预测因素。
使用时间序列数据的结果验证
基于三个不同模型的 MSE、RMSE 和 R 值,XGBoost 在预测预期寿命方面达到了最高的准确度。此外,如图 4 所示,与其他变量相比,有两个变量的重要性值明显更高——艾滋病毒/艾滋病和 ICR。这两个变量也是多元回归和随机森林模型中最重要的变量。
在该数据集中,艾滋病毒/艾滋病被定义为“每 1 000 名活产儿中艾滋病毒/艾滋病死亡人数(0-4 岁)”,ICR 被定义为“根据资源收入构成的人类发展指数(指数范围为 0-1)”。虽然第一个变量在预测预期寿命方面的重要性似乎相当明显,但有趣的是,在其他死亡率变量中,如“五岁以下儿童死亡率”或“成人死亡率”,特别是艾滋病毒/艾滋病相关死亡率对因变量的影响最大。
为了了解这些变量的重要性是否反映在这些变量的时间趋势中,我使用了 2000 年至 2015 年“艾滋病毒/艾滋病”、“资源的收入构成”和“预期寿命”的数据,并绘制了一些简单的可视化图形。
图 6。2002 年和 2015 年预期寿命与艾滋病毒/艾滋病的散点图。预期寿命与艾滋病毒/艾滋病呈中度负相关,与冰呈中度/强正相关。图片作者。
我们可以看到,在 2002 年和 2015 年,预期寿命与艾滋病毒/艾滋病呈中度负相关,与 ICR 呈中度正/强正相关。
图 7。2000 年至 2015 年的时间序列预期寿命和 ICE 数据。两个变量都以各自的比例显示。图片作者。
在一个时间序列中,预期寿命和 ICR 的增长率似乎非常相似。这种趋势在许多国家都很普遍。
图 8。2000 年至 2015 年的时间序列预期寿命和艾滋病毒/艾滋病数据。两个变量都以各自的比例显示。图片作者。
就预期寿命和艾滋病毒/艾滋病而言,正如所料,在许多国家,我们观察到相反的趋势。
结论
在这个项目中,我实现了三个算法来执行一个回归任务。具体来说,我使用了多元回归、随机森林和 XGBoost 来预测不同国家的 2014 年预期寿命。根据 MSE、RMSE 和 R 的值,在三种算法中,XGBoost 的表现最好。ICR 和艾滋病毒/艾滋病这两个独立变量在预测预期寿命方面表现出最高的重要性。对 2000 年至 2015 年数据的进一步研究证实了自变量和因变量之间的密切关系。每年,预期寿命与艾滋病毒/艾滋病呈中度负相关,与 ICR 呈中度/高度正相关。此外,在时间序列图中,正如预期的那样,预期寿命的增加对应着 ICR 的增加和艾滋病毒/艾滋病的减少。这些结果表明,ICR 和艾滋病毒/艾滋病可能会影响一个国家的*均预期寿命。虽然并非所有国家都有相同的趋势,并且发现了多个异常值,但需要对每个个案进行探索和更仔细的分析,才能得出可靠的结论。
参考
j .布朗利(2020 年 8 月 18 日)。机器学习中缺失值的迭代插补。机器学习精通。检索于 2021 年 11 月 3 日,来自https://machine learning mastery . com/Iterative-attraction-for-missing-values-in-machine-learning/#:~:text = Iterative % 20 attraction % 20 reference % 20 to % 20a,其中% 20 missing % 20 values % 20 is % 20 predicted。
j .布朗利(2021 年 2 月 16 日)。应用机器学习 XGBoost 的温和介绍。机器学习精通。2021 年 11 月 5 日检索,来自https://machine learning mastery . com/gentle-introduction-xgboost-applied-machine-learning/。
随机森林算法完整指南。内置的。(2021 年 7 月 22 日)。检索于 2021 年 11 月 5 日,来自https://builtin.com/data-science/random-forest-algorithm.
k . ku bara(2019 年 6 月 24 日)。*为什么对缺失数据使用*均值不是一个好主意。替代插补算法。*中等。2021 年 11 月 3 日检索,来自https://towards data science . com/why-using-a-mean-for-missing-data-is-a-bad-idea-alternative-attu lation-algorithms-837 c 731 c 1008。
莫尔德五世(2019 年 4 月 8 日)。 *XGBoost 算法:愿她统治长久!*中等。检索于 2021 年 11 月 5 日,来自https://towardsdatascience . com/https-medium-com-vishalmorde-xgboost-algorithm-long-she-may-rein-edd 9 f 99 be 63d。
多元回归。精彩的数学科学维基。(未注明)。检索于 2021 年 11 月 5 日,来自https://brilliant . org/wiki/Multivariate-regression/#:~:text = Multivariate % 20 regression % 20 is % 20a % 20 method,responses)% 2C % 20 are % 20 linear % 20 相关。&text = A % 20 数学% 20 模型% 2C %基础% 20 和% 20 其他% 20 更多% 20 复杂% 20 问题。%2C%20are%20linearly%20related.&text=A%20mathematical%20model%2C%20based%20on,and%20other%20more%20complicated%20questions.)
k . rajar Shi(2018 年 2 月 10 日)。预期寿命(世卫组织)。卡格尔。检索于 2021 年 11 月 3 日,来自https://www.kaggle.com/kumarajarshi/life-expectancy-who.
(2021 年 9 月 29 日)。了解随机森林。中等。2021 年 11 月 5 日检索,来自https://towards data science . com/understanding-random-forest-58381 e 0602d 2。
数据科学 vs 人工智能。区别就在这里。
原文:https://towardsdatascience.com/data-science-vs-artificial-intelligence-heres-the-difference-534b82ee9ac4?source=collection_archive---------6-----------------------
意见
真实工作描述的比较
附身摄影在Unsplash【1】上拍照。
目录
- 介绍
- 数据科学
- 人工智能
- 摘要
- 参考
介绍
数据科学和人工智能经常互换使用。许多人对每个人的定义有不同的看法。为了解决正在进行的辩论,我不会比较定义,而是比较数据科学家和人工智能工程师的真实工作描述。这样就有真实的例子可以对比,让你在一个专业的设定下就能知道区别。这些差异可能不是全部,也不代表所有数据科学或所有人工智能。然而,我认为重要的是通过职位描述概述实际招聘人员和招聘经理对这些差异的看法。下面,我将描述从职位描述中收集的每个角色的目标和技能,以及我自己申请这两个职位的个人经验。
数据科学
由万花筒在Unsplash【2】上拍摄。
作为一名数据科学家,你可以在工作描述中看到各种所需的技能和工具[3,4,5]。我将尽我所能在下面总结一些主要的技能、工具以及数据科学的一般目标。描述的这些属性是公司所关注的,所以需要注意的是这两个角色之间也有交叉,以及所使用的特定工具之间的相似性。
目标:
建立问题陈述,理解业务需求,并利用数据分析和机器学习算法来解决问题。然后,能够将你建立的模型的结果可视化,并展示发现或见解。
例如,作为一名数据科学家,你可以执行以下任务:
发现手动分类产品图片存在问题。然后,你不仅要为自己,还要为产品经理、业务分析师和其他利益相关者创建一个完善的问题陈述或假设:
手动对图像进行分类耗时太长,我们将使用机器学习算法来完成这一过程,最终节省时间和金钱等资源。
然后,您将通过与数据工程师等人员合作来获取必要的数据,通常在笔记本中导入您的数据框架,应用探索性数据分析、特征工程和模型比较。在项目结束时,您将创建一个显示模型结果的仪表板,可能会应用特定的分组和过滤器。你将经常向利益相关者和高管展示并接受反馈,要么继续另一个项目,要么改进当前的项目。
技能:
- Python 还是 R
- Jupyter 笔记本
- 张量流
- 统计数字
- NLP ( 自然语言处理
- 结构化查询语言
- Tableau 或其他类似的可视化工具
- 在高管面前展示的自信
- 向非分析专家或技术专家传达高级分析
这些只是作为一名数据科学家,你可以期望获得的一些技能。你可能已经注意到了解决一个复杂问题的主题,重点是将你的模型和发现展示给公司的高管或利益相关者。也就是说,沟通是一项关键技能,可能不会在研究生课程或在线训练营中教授,但应该强调并练习。
人工智能
由万花筒在Unsplash【6】上拍摄。
人工智能或许是一个比数据科学更热门的话题。它被用于各种行业。我们也看到人工智能和数据科学以及机器学习之间的大量交叉。他们有共同的目标和技能,但我将在下面强调这两个热门职位之间的更多差异。
目标:
专注于新算法的研究,利用当前的神经网络,在大型数据集上部署和自动化整个过程和公司的人工智能解决方案。就像数据科学家一样,人工智能工程师可以研究一个问题,获取数据,并找到算法解决方案。然而,人工智能工程师也有额外的工作来提出一种新的算法,并进行研究,以对不总是预先打包的东西进行建模。重点还在于在应用程序中部署这些模型,通常包括神经网络和深度学习实践。这种差异意味着每个角色之间有不同的库。例如,数据科学家可能倾向于使用 sklearn 最多,而人工智能工程师可能更多地使用 TensorFlow 和 PyTorch。
技能:
- Java、Python 或 C++
- 人工智能系统
- 深度学习与 TensorFlow,PyTorch
- 与研究和工程团队合作
- 确认硬件要求
- 生产中的部署模型
- 计算机科学
- 设计或交付云解决方案
- 火花
- 斯卡拉
这些技能与数据科学的不同之处在于,它们更侧重于软件工程、以研究为中心以及以部署为中心。例如,人工智能工程师可以更多地研究深度学习和神经网络等算法,而不是采用回归和决策树。与数据科学的另一个区别是,人工智能工程师往往需要博士学位,而数据科学家一般需要硕士学位。
如你所见,这两种立场有很大的不同。然而,重要的是要记住,就像这些职位的描述有重叠一样,甚至职位名称本身也有重叠。例如,你可能会看到“数据科学,人工智能工程师”的职位名称,或者类似“机器学习/人工智能工程师”的职位名称。
摘要
总的来说,对我来说,通过研究这些工作描述和申请这些类型的职位,看起来人工智能比数据科学更复杂。然而,这两个角色之间仍然有大量的相似之处和重叠之处,正如你从职位描述中看到的那样,每个角色的要求真的是由公司决定的。我们已经讨论了数据科学和人工智能之间的一些主要差异,并强调了它们之间的一些相似之处。
总结一下,以下是数据科学家和机器学习科学家的主要区别:
*** Data scientists:** Python, R, statistics, visualization tools, perhaps faster-paced, simpler use cases*** Artificial intelligence en:** software engineering, deep learning, automation, research-focused, perhaps slower-paced, more involved use cases
如果你想看数据科学家(3-5)和人工智能工程师(7-9),我还附上了一些真实的工作描述[3,4,5,7,8,9]。这也会让你从专业环境中看到自己的不同。
我希望你觉得我的文章既有趣又有用。请随意在下面评论你认为这两种立场之间的相似或不同之处。如果你不同意或同意数据科学家和人工智能工程师之间的这些差异,请在下面评论。
请随时查看我的个人资料和其他文章,也可以通过 LinkedIn 联系我。我不隶属于上述任何公司。
参考
[1]由附身摄影在 Unsplash 上拍摄,(2018)
[2]由万花筒在 Unsplash 上拍摄的照片,(2018)
[3]的确和 IBM 一样, IBM 数据科学职位描述,2021)
[4]确实与 Zilliant, Zilliant 数据科学岗位说明书,(2021)
[5]确实与可保性,可保性数据科学岗位说明书,(2021)
[6]由万花筒在 Unsplash 上拍摄的照片,(2018)
[7]的确和 IBM 一样, IBM 人工智能工程师职位描述(2021)
[8]果然和鄂尔多斯·米勒一样,鄂尔多斯·米勒人工智能工程师岗位说明书(2021)
[9]果然和耐克一样,耐克人工智能工程师(2021)
数据科学与商业智能:区别在于
原文:https://towardsdatascience.com/data-science-vs-business-intelligence-heres-the-difference-a805b99710ca?source=collection_archive---------6-----------------------
意见
这两个受欢迎的技术角色之间的异同
照片由克里斯蒂娜@ wocintechchat.com在Unsplash【1】上拍摄。
目录
- 介绍
- 数据科学
- 商业智能
- 摘要
- 参考
介绍
在数据科学工作突出之前是商业智能领域。虽然他们以前可能是非常相似的职位,但随着这两个角色变得越来越受欢迎,角色也变得更加明确。话虽如此,仍然需要注意的是,根据你最终的工作地点,这些职位之间可能会有相当多的重叠。我将讨论我从自己的职业生涯以及真实的工作描述中看到的差异和相似之处。如果你想了解数据科学和商业智能职业的主要定义特征,以及它们之间的比较,请继续阅读。
数据科学
照片由 Fitore F 在Unsplash【2】上拍摄。
从我自己的经历以及在其他公司的面试,到查看工作描述,我汇编了一份对数据科学的总结性解释,我将在下面描述它,以及它与商业智能的不同和相似之处。
以下是数据科学职业的主要概念、技能和期望:
还包括一些示例工具——但不仅限于这些技能。
- 与利益相关者一起开发用例及问题陈述
- 从各种来源获取数据
- 使用
SQL
和Python
创建数据集 - 探索性数据分析(
*with* Pandas *usually*
)和特征工程 - 模型探索和比较(
scikit-learn
、TensorFlow
、T14、、T5) - 最终模型
- 部署
- 讨论结果和影响
如您所见,这只是作为一名数据科学家的一小部分期望,然而,它可以很好地代表任何数据科学家将执行的主要过程。如果你只看上面的第一点和最后一点,这些也是商业智能工作的主要开始和结束部分。甚至第二、第三和第四点中的一些也可以成为商业智能分析师日常工作的一部分。
然而,这里的主要区别是关注模型探索、比较、最终模型和部署,这也是关注机器学习算法和机器学习操作的数据科学过程的一部分。
这一点可能是数据科学和商业智能之间的最大区别,尽管一些商业智能分析师会执行回归分析、预测和预报。
另一个区别可能是对Python
/ R
或另一种编程语言的关注,在这种语言中,面向对象的概念被用于数据科学。
以下是数据科学家*【3】的* 示例工作描述。
除了上面的工作描述和我自己的个人经验,这里有一个我作为数据科学家会采用的具体流程:
- 开发一个用例:“这些产品可以用机器学习算法更好更快地分类。
- 我们需要来自各种来源的数据来创建这个算法,比如我们的产品目录。
- 我们可以
SQL
查询我们的数据库,现在我们已经有了必要的数据,并使用Pandas
和Python
把它拉进来。 - 现在我们有了数据,我们可以识别缺失值、异常值、描述性统计、*均值/最小值/最大值以及其他简单但有用的函数,如
df.describe(), df.head(), df.tail(), and df.column_name.value_counts()
——它根据每个箱中显示的实例数量对数据进行分组。 - 删除不必要的功能,并通过简单地将两列分开来创建一些新的功能,在这个用例中使用的一个特定的好功能将是产品的描述—例如,黑色橙色的 颜色 ,XL 高筒衬衫 尺寸 , 条纹 —这些是模型可以解释为成人万圣节衬衫产品的特征。
- 使用
scikit-learn
库利用Random Forest
算法创建分类器。 - 使用
Amazon SageMaker
作为您的部署*台来部署模型。 - 创建分类器结果的仪表板,包括模型的准确性。
正如你所看到的,有相当多的数据分析与机器学习结合在一起。话虽如此,如果你喜欢面向对象编程以及机器学习操作,我推荐数据科学家这一角色,因为这一角色可以为公司带来巨大的价值,将自动或不准确的流程转换为自动、更准确和更快速的流程。
现在,让我们更深入地了解商业智能的组成,以及它和数据科学之间的异同。
商业智能
DocuSign 在Unsplash【4】上拍摄的照片。
这个领域已经存在了很长时间,可以看到许多与数据科学的重叠,但是,最大的相似之处是两个角色的目标。两个职位或领域都致力于开发用例并解释结果。最终检索这些结果的方法可能有些不同。例如,商业智能分析师可能更关注Excel
、Google Sheets
、Tableau
和SQL
。
以下是商业智能职业的一些主要概念、技能和期望:
还包括一些示例工具——但不仅限于这些技能。
- 与利益相关者一起开发用例。
- 使用
Excel
、VLOOKUPs
和SUMIFs
执行数据分析。 - 使用
SQL
获取数据。 - 用
SQL
/更复杂的查询功能分析数据。 - 有时—在
Excel
或其他工具中预测或预报。 - 在可视化工具中显示结果,如
Tableau
或Looker
。 - 与利益相关者或高管讨论结果。
两种角色之间的一些工具重叠,但是,与此要点总结不同的主要概念是,商业智能中不涉及机器学习算法或部署。另一个区别是每个职位所需的教育程度。这两种角色都需要硕士学位,当然,每个角色都需要与各自的职位更相关的学位,但是,随着远程工作和教育的变化,有更多的角色以训练营、在线学位和在线认证的形式向教育开放。
下面是一个 商业智能分析师【5】的工作描述示例。
除了上面的工作描述和我自己的个人经验,这里有一个我作为商业智能分析师会采用的具体流程:
- 确定某拼车公司在晚上 11 点有异常数量的用户。
- 获取用户数据和时间数据,以创建要分析的数据集。
- 用
Excel
和/或SQL
汇总这些数据。 group by
在SQL
了解到晚上 11 点有某个统计数据。- 使用回归预测并测试这种情况是否每天都会发生。
- 发现这一群人也在晚上结束时有艺术家聚会的地方分享活动数据。
- 为艺术家创建一个推广活动,告诉其他艺术家也分享,并给予折扣。
- 用
Tableau
展示促销对该客户群的影响结果。
如你所见,这个角色非常注重SQL
和业务探索。我向那些寻求将SQL
技能、可视化以及与非技术利益相关者的协作完美结合的人推荐这个职位。你也可以跳过像Python
这样可能需要更长时间学习的编程技能,从而更快地申请这个职位。这些职位导致更快的项目带来价值,然而,在数据科学中,项目持续时间超过几个月,而在商业智能中可能只有一周。也就是说,商业智能分析师或开发人员可以为公司提供很多价值,比如可以降低成本的见解和分析,以及与数据科学家合作,后者可能会根据你的发现创建一个模型。
摘要
这两个角色起初看起来非常相似,甚至非常不同,但是,分析每个职位的来龙去脉,以及每个角色在日常工作或项目中的预期是很重要的。目标可能是最相似的,因为数据、见解和结果都包含在项目干系人的讨论中。除了数据科学在所有方面都明显侧重于机器学习之外,更多SQL
与更多Python
/ R
侧重技能等方法也有所不同。
总而言之,以下是对每个角色的一些主要期望:
*** Data Science:** data acquisition, Python, as well as machine learning algorithms and deployment*** Business Intelligence:** Excel or Google Sheets, SQL, data analysis, and forecasting
感谢您的阅读!如果您有任何问题,请联系我,如果您有任何经验、共识或不同意上面讨论的相似性和/或差异,请在下面评论。在每个单独的角色中,你还有哪些其他的技能、概念或期望?您是业务分析师还是数据分析师,您是否也经常比较或对比这些角色——您认为所有这些角色之间有哪些相似或不同之处?
我不隶属于上述任何公司。
参考
[1]照片由克里斯蒂娜@ wocintechchat.com在Unsplash(2019)上拍摄
[2]照片由 Fitore F 在Unsplash(2019)上拍摄
[3]迪厅,数据科学真实岗位描述示例,(2021)
[4]照片由文件设计在Unsplash(2021)上拍摄
[5]沃尔玛,商业智能真实工作描述示例,(2021)
数据科学家 vs 计算机科学家。区别就在这里。
原文:https://towardsdatascience.com/data-science-vs-computer-science-heres-the-difference-4b560de655f7?source=collection_archive---------1-----------------------
意见
专业数据科学家对这两个突出领域和角色之间差异的看法。
奥占·阿克多安在Unsplash【1】上的照片。
目录
- 介绍
- 数据科学家
- 计算机科学家
- 异同
- 摘要
- 参考
介绍
数据科学和计算机科学经常是齐头并进的,但是真正使它们不同的是什么呢?他们有什么共同点?在不同的公司体验了几个不同的数据科学角色后,我认识到了数据科学过程的一般主题,以及计算机科学如何融入该过程。重要的是要注意这两种立场之间的差异,以及何时一方需要另一方,反之亦然。通常情况下,一个数据科学家首先学习计算机科学,然后专攻机器学习算法,会受益匪浅。然而,一些数据科学家在学习如何编码之前直接进入统计学,专注于数据科学和机器学习算法的理论。这就是我的方法,之后学习计算机科学和编程。话虽如此,数据科学家需要了解计算机科学吗?简单的回答是肯定的。虽然计算机科学可以包含数据科学,特别是在人工智能中至关重要,但我认为计算机科学的主题是软件工程。如果你想了解更多关于(和这两个角色的不同之处,以及他们各自的相似之处,请继续阅读。我还将深入探讨这些职位的重点,包括常用工具、技能、语言、步骤和概念。
数据科学家
照片由马库斯·斯皮斯克在Unsplash【2】上拍摄。
那么,数据科学家实际上是做什么的呢?我们经常听到科技行业的流行词汇,但这些真的是我们日常工作中使用的关键词吗?答案是肯定的,也是否定的。毫无疑问,有许多主要的工具和语言,我至少每天都在使用。作为一名数据科学家,我需要探索公司的数据,同时还要联系数据如何影响产品。最终,数据科学家将被鼓励研究当前数据,发现新数据,解决业务和产品问题,所有这些都使用机器学习算法(例如,随机森林)。一些同样的问题也可以被计算机科学家解决。但为了职称,有一个人专门专注于机器学习算法是必不可少的,因为这种方法使原本人工进行的过程不仅更有效,而且更准确。
以下是数据科学家可能会采用的数据科学流程的一些步骤:
- 探索当前数据,以及发现新数据
- 使用 SQL 查询和理解公司数据
- 使用 Python 或 R 来探索数据帧中的数据(或类似的)
- 执行探索性数据分析(使用像 pandas_profiling 这样的库)
- 隔离业务问题和模型对成功的可能影响
- 搜索并运行基础机器学习算法,以与空的或当前的过程进行比较
- 优化最终或整体算法以获得最佳结果
- 以某种可视化方式显示结果(如 seaborn,Tableau )
- 也许和一个计算机科学家或者一个军事工程师一起工作
- —在公司生态系统中部署和预测您的最终模型
- 最后,总结你的进步
如您所见,这个过程有时可以与其他人共享,如人工智能工程师、数据工程师、计算机科学家、MLOps 工程师、软件工程师等等。数据科学家角色的独特之处在于机器学习理论及其对业务问题的影响。
以下是数据科学家可能会用到的一些工具:
- 结构化查询语言
- r,SAS
- 计算机编程语言
- (舞台上由人扮的)静态画面
- Jupyter 笔记本
- PySpark
- 码头工人
- 库伯内特斯
- 气流
- AWS/谷歌
虽然数据科学过程更像科学过程一样是一成不变的,但数据科学家使用的工具需要更多的解释。也就是说,我会说大多数数据科学家专注于使用 SQL、Python 和 Jupyter 笔记本(或类似的)。这种关注是因为这些工具或语言可以应用于任何业务。然而,一些公司会有某些偏好或要求,例如允许你选择 Google Data Studio 而不是 Tableau。接下来,我们将具体谈谈计算机科学家的角色。
计算机科学家
卡里·谢伊在Unsplash【3】上的照片。
虽然计算机科学领域比计算机科学家的头衔更受欢迎,但仍然有一些角色只关注这个角色名称。也就是说,劳动力中的计算机科学倾向于特别针对软件工程。计算机科学家下面的其他角色包括但不限于:数据库管理员、硬件工程师、系统分析师、网络架构师、Web 开发人员和大量的 IT 角色。这种多样性使得计算机科学家的定义更加难以定义,有点像数据科学可以包括机器学习操作、数据工程、数据分析等等。最终,你和你工作的公司将决定你在计算机科学中的角色。当然,工作描述是了解具体子角色的简单方法。
以下是计算机科学家可能会采用的计算机科学过程的一些步骤:
- 了解业务、数据、产品,当然还有软件
- 对于特定的问题,定义需求
- 理解并设计系统和软件
- 实现过程和单元测试
- 软件将如何集成以及它如何影响系统
- 最后是运营和维护
尽管这一过程与专业数据科学家的过程并不完全相似,但它仍然分享了更具技术性的过程的一些更广泛的方面,包括但不限于理解软件、数据和实施改进,然后分析和报告其效果。
以下是计算机科学家可能会用到的一些计算机科学工具和语言:
- IDE 的
- 测试软件
- Python 和其他面向对象的编程语言
- 松弛的
- 亚马孙
- 笔记
- 原子
- 可视化工作室
- 微软 Azure
- 开源代码库
- 亚特兰蒂斯人
计算机科学家可以使用无数的工具和语言。再说一次,这真的取决于你所关注的——是软件工程,还是网络分析,是吗?希望有一个角色适合你,不仅是你有资格胜任的,而且是你喜欢的。接下来,我将深入探讨数据科学和计算机科学家职位之间的异同。
异同
埃里克·普劳泽特在Unsplash【4】上的照片。
既然我们已经讨论了这两个角色的主题和期望:数据科学和计算机科学,我们现在将强调它们之间的相似性和差异。当然,还有更多的问题需要讨论,但这些都是我从经验中想到的主要问题。
以下是这两个角色之间的相似之处:
- 两者都需要对业务及其产品的理解
- 两者都需要公司的数据工作知识
- 这两种角色通常意味着能够熟练使用 Git 或 GitHub
- 两者总体上都遵循科学主义过程的系统方法
- 两者都有望成为科技领域的领导者
- 两人通常都精通一种编程语言
- 两者都可以从另一个角色开始并切换到另一个角色
- 两者都是跨职能的
角色之间的相似性突出了这些角色所处的技术领域。
以下是这两种角色之间的不同之处:
- 数据科学家更关注机器学习算法
- 计算机科学家更加关注软件设计
- 作为一个角色,计算机科学家包含了更多的种类
- 两者之间的教育是不同的,通常是计算机科学学位和数据科学学位
- 数据科学家有统计学背景
- 计算机科学家有计算机工程的背景
- 计算机科学家更加注重自动化和面向对象
- 数据科学家通常更多地与产品经理或其他面向业务的角色合作
因为这些角色都非常包容其他子角色,所以它们在一家公司可能会有很大的不同,而在另一家公司可能会惊人地重叠。
摘要
如你所见,这些职位需要不同的技能、工具和语言;然而,它们也有一些相同方面的共同特征。数据科学家的主要概念是使用机器学习算法解决业务问题,而计算机科学家的主要主题要么是面向对象编程和软件工程的方向,要么是需要计算机所有方面的通用工作知识的方向。
总的来说,这两个角色总结如下:
**Data Scientists:** business analysis, research, data, statistics, and Machine Learning algorithms**Computer Scientists:** programming, Software Engineering, productionaliztion, DevOps, automation, IT, Networking, Database Administration, Hardware, Systems Analytics, and Web Development
我希望你觉得这篇文章既有趣又有用。请记住,本文基于我对这两种角色的看法和个人经历。如果你不同意或同意,请在下面随意评论为什么以及你想补充的具体内容。你更喜欢做数据科学家,还是更喜欢做计算机科学家?你认为他们应该合并成一个角色吗?真的有区别吗?作为一名计算机科学家,你的关注点是什么?是 it 还是网络之类的东西?从其他人那里获得一些见解会很有趣,这样每个人都可以向其他人学习,以便找出数据科学和计算机科学之间的相似之处和不同之处的最佳代表。T 感谢您的阅读,欢迎随时查看我的个人资料或阅读其他文章,如果您对其中任何一篇有任何问题,请联系我。
如果你想查看我的个人资料以了解更多关于数据科学的信息,请随意,也可以查看我的另一篇关于数据科学与机器学习运营工程师【5】的类似文章。它强调了数据科学和 MLOps 之间的差异和相似之处,两者共享大量工具和经验,但也有所不同:
谢谢!
参考
[1]照片由ouzhan akdo an在Unsplash(2019)上拍摄
[2]2018 年 Markus Spiske 在 Unsplash 拍摄的照片
[3]照片由 Kari Shea 在Unsplash(2017)上拍摄
[4]Eric prou zet 在 Unsplash 上拍摄的照片(2020 年)
[5] M.Przybyla,数据科学家 vs 机器学习运营工程师。区别在这里。, (2021)
数据科学 vs 冠状病毒
原文:https://towardsdatascience.com/data-science-vs-coronavirus-e2d18f155c47?source=collection_archive---------50-----------------------
卓越方法和特殊实践概述
由 Unsplash 上的融合医学动画拍摄的照片
根据维基百科,数据科学是*“一个使用科学方法、流程、算法和系统从许多结构化和非结构化数据中提取知识和见解的跨学科领域。”我已经在这个领域工作了三年,在希腊比雷埃夫斯大学攻读博士学位。我总是着迷于将从数据中提取的知识应用到卫生领域的前景,以及硬件和算法设计的重大进步使应用成为可能的。*
几个月来,我们面临着冠状病毒爆发的前所未有的局面。因此,数据科学界试图在这一场景中承担自己的角色,并为抗击其引发的疾病新冠肺炎做出贡献。此外,来自不同学科和公共组织的科学家通过开源病毒的基因组和其他数据集来承认数据分析的重要性,希望找到人工智能指导的解决方案。
在接下来的部分,我将讨论这些贡献可能是什么,并表达我的个人观点。
学习率是为那些对 AI 和 MLOps 的世界感到好奇的人准备的时事通讯。你会在每周五收到我关于最新人工智能新闻和文章的更新和想法。在这里订阅!
形象化
可视化一个数据集允许科学家获得洞察力和更深入的研究;特征如何相互关联,要做的建模假设等。此外,一幅图像胜过千言万语,设想一个问题是解释和体现复杂概念并使意图合理化的好方法。
“拉*曲线”是最*的一个流行短语。此外,指数增长是一个我们难以理解的概念。向公众分析和展示这两者的最佳方式是利用可视化的力量。
如何“拉*曲线”
为此, Harry Stevens 整理了一篇关于的奇幻文章《为什么冠状病毒这样的疫情呈指数级传播,如何使曲线变*》《华盛顿邮报》的这篇文章展示了为什么指数增长让专家担忧,以及这种疾病是如何按照不同的模拟模式传播的。最后,他举例说明了强制隔离和社会距离等措施如何有助于缓解这一问题。
这篇文章是一篇必读的文章,也是一个很好的例子,展示了可视化在教育中的力量以及采用正确的行为模式。
研究
当谈到研究和流行病时,我们主要想到的是疫苗和药物。数据科学和机器学习可能有助于发现新药,但我们仍然离实现这一潜力很远。
然而,需要指出的一些前景是 DeepMind 预测蛋白质结构的努力和创新想法,这些想法有助于准确而不引人注目地对受感染的人进行大规模筛查。谷歌的 DeepMind 将最新版本的“alpha fold”——一种预测蛋白质结构的神经网络——投入到这项任务中,并发布了与冠状病毒有关的几种正在研究的蛋白质的结构预测。虽然这些结果还没有得到实验的验证,但是人们希望它们可以作为未来开发治疗方法的实验工作的基础。
在另一条道路上,在来自 Yunlu Wang 等人的一篇新论文中,作者试图通过观察患者的呼吸模式来识别可能表明感染的呼吸急促病例。
实时异常呼吸模式分类系统的演示视频
使用深度相机和深度学习,研究人员能够对六种具有临床意义的呼吸模式(呼吸暂停、呼吸急促、呼吸缓慢、Biots、Cheyne-Stokes 和中枢性呼吸暂停)进行分类,准确率、精确度、召回率和 F1 分别为 94.5%、94.4%、95.1%和 94.8%。
应用程序
中国*安保险公司推出了一款新冠肺炎智能图像读取系统,帮助控制应用前端的疫情。该方法利用计算机视觉进步和深度神经网络从计算机断层扫描(CT)图像中诊断死亡。许多医生已经使用 CT 图像来诊断新冠肺炎,像这样的系统有助于有效和准确的预测。由于从世界各地的医院收集类似的数据的运动正在进行,更多类似的想法被期待。
另一方面,网络科学研究所使用更传统的建模方法来绘制冠状病毒的社交网络。从历史上看,试图了解病毒及其流行的科学家专注于病毒本身,模拟其内部运作。但是病毒需要宿主才能生存,需要个人接触才能传播。因此,在过去十年中,科学家开始将社交网络纳入他们的模型,以确定可能增加或抑制即将到来的大流行影响的个人行为模式。这种建模为政策建议提供了信息,例如,我们是否应该关闭学校,其影响会是什么?
结论
在大数据时代,数据科学和机器学习在像这次爆发这样的情况下可以发挥重要作用。它的一些应用对传递正确的信息至关重要,而其他应用对所应用的政策有重大影响。
另一方面,辅助应用程序是有用的,但仍然需要大量的工作来实现其潜力。例如,虽然 CT 智能图像读取系统可以帮助医生远程诊断疾病,但它存在特异性问题。此外,它要求患者进行胸部扫描,这使得它在昂贵的医疗设备不可用的地方不太相关。对于追踪患者呼吸模式的系统,也会出现同样的特异性问题,因为呼吸急促与许多情况有关。此外,研究人员仍在努力填补所需的大量训练数据和稀缺的真实世界数据之间的差距。
关于作者
我叫迪米特里斯·波罗普洛斯,我是一名为阿里克托工作的机器学习工程师。我曾为欧洲委员会、欧盟统计局、国际货币基金组织、欧洲央行、经合组织和宜家等主要客户设计和实施过人工智能和软件解决方案。
如果你有兴趣阅读更多关于机器学习、深度学习、数据科学和数据运算的帖子,请关注我的 Medium 、 LinkedIn 或 Twitter 上的 @james2pl 。请访问我的网站上的资源页面,这里有很多好书和顶级课程,开始构建您自己的数据科学课程吧!
数据科学 vs 深度学习
原文:https://towardsdatascience.com/data-science-vs-deep-learning-e91aaedde826?source=collection_archive---------36-----------------------
意见
区别就在这里
在 Unsplash 上由 bruce mars 拍摄的照片。
目录
- 介绍
- 数据科学
- 深度学习
- 摘要
- 参考
介绍
当搜索数据科学与深度学习时,结果令人惊讶。出现的大多数文章都在将数据科学与机器学习进行比较,这当然是有用的,但不如将其直接与深度学习进行比较相关。也就是说,这就是本文的目的——直接比较这两个热门的研究领域。虽然有比较,但我想从我的经验中给出我的专业比较——因此,这篇文章的标签是观点。如果你想知道为什么这两个领域不同,是什么使它们相似,请继续阅读下面的内容。
数据科学
照片由布鲁斯·马斯在Unsplash【2】上拍摄。
首先,数据科学非常普遍——这可能是它和深度学习之间的最大区别。另一种思考这种比较的方式是,深度学习实际上是数据科学的一部分。话虽如此,那么,数据科学的其余部分是什么呢?数据科学的主要概念是根据数据做出明智的决策。然而,我确实认为一般的定义需要改进。
如果让我用一句话或者更规范的新定义来概括数据科学,那将是以下(当然,这个定义并不完全适用于每一个案例/工作,而是来自我的个人经验):
- 数据科学家是以业务为导向的专业人士,他揭示了一个问题,这个问题可以通过在算法中训练过去的数据来自动预测未来的目标,从而用数据集来解决
我想说的是,大多数定义都与数据分析师或业务分析师的定义过于相似。他们确实有很多相同的技能和目标,但是,数据科学通常需要用 R 或 Python 这样的语言编程,以及算法的使用。但是,这个定义的一个重要部分是算法。这部分定义就是深度学习的用武之地,它是数据科学的一部分,更具体地说,是机器学习的一部分。
为了更好地了解数据科学家的日常工作或项目工作,以下是预期步骤的概述:
- 了解业务—它做什么,它有什么问题,它有什么数据,它的客户是谁
- 例如,分析数据或与产品经理等业务利益相关者合作,以了解有哪些具体问题最终可以通过数据科学来解决
- 定义项目的目标,如改进通用 KPI(关键绩效指标)
- 从单一来源或多个来源构建数据集
- 确定要测试并包含在数据科学模型中的功能
- 了解并确定您是否需要回归算法或分类算法等,您预测的是连续目标还是分类目标/类别?
- 通过分享结果总结最终模型,并最终自动部署到业务中
如您所见,数据科学家使用使用数据的算法( s )来引导问题的解决方案。大多数时候,数据科学家也在尝试自动化一些之前需要手动完成的工作。
深度学习
法库里安设计在Unsplash【3】上拍照。
既然我们已经通过示例了解了数据科学家做什么,以及数据科学通常是什么,那么让我们深入了解什么是深度学习。深度学习是数据科学的一个方面,也是机器学习算法的一个方面(我说算法是因为我认为外面很多被称为 ML 工程师的工作实际上是帮助部署算法的软件工程师——就像围绕算法和最终模型的操作。深度学习的独特之处在于它在人工神经网络中实现了层。当您使用 GPU 处理大数据时,您往往会选择深度学习特定算法,因为许多数据科学模型可以令人惊讶地获得仅使用传统机器学习算法的好处。
传统的机器学习算法包括决策树、随机森林、XGBoost 等,而深度学习更具体,包括以下算法:
- 卷积神经网络( CNN
- 递归神经网络( RNN )
- 长短期记忆网络( LSTM )
因此,与数据科学家相比,深度学习工程师实际上可能是一回事。大多数时候,数据科学角色可以在其中包含深度学习的特定要求,因此日常流程与数据科学家非常相似。主要的区别是使用了独特的深度学习算法,并且可能更多地考虑了成本、效率,因为这些算法可能更复杂和昂贵。
摘要
当我们比较这两个热门领域和工作时,我希望你能更好地理解它们的相似之处和不同之处。关于这些领域所使用的工具和所需的知识还有很多要说的,但总的来说,它们实际上只是彼此的一部分。你可以是执行深度学习的数据科学家,也可以是深度学习工程师专员。
总而言之,下面是这篇文章的要点:
* You can be a data scientist who performs deep learning* Or, you can be a deep learning engineer specialist
我希望你觉得我的文章既有趣又有用。如果你同意或不同意我对这两个热门领域的解释,请在下面随意评论。为什么或为什么不?这些当然可以进一步澄清,但我希望我能够阐明一些主要的差异,以及在解释这些差异时的常见错误,尤其是在提到职称时。感谢您的阅读!
请随时查看我的个人资料、 马特·普日比拉 和其他文章,也可以在 LinkedIn 上联系我。
参考
[1]照片由 bruce mars 在Unsplash(2018)上拍摄
[2]照片由布鲁斯·马尔斯在 Unsplash 上拍摄,(2019)
[3]照片由法库里安设计在Unsplash(2021)上拍摄
数据科学家 vs 软件工程师薪资
原文:https://towardsdatascience.com/data-science-vs-software-engineer-salary-2411e532185f?source=collection_archive---------0-----------------------
更新的美国薪资深度挖掘,了解您 2022 年的职业决策和兴趣
照片由 NeONBRAND 在Unsplash【1】上拍摄。
目录
- 介绍
- 软件工程师
- 数据科学家
- 摘要
- 参考
介绍
本文的目标是展示两个流行的技术角色之间的差异和相似之处。这些信息有助于决定你想从事哪种工作。弄清楚这些职位之间关于薪水的一些假设也是很有趣的。我们将深入探讨按城市和技能划分的*均薪资(美元)。
免责声明:
正如我在本系列的前几篇文章中所说的,这篇文章的目的不是比较一个人是否应该得到更多的钱,而是让这两个领域的专业人士根据他们当前或预期的工资进行评估。请记住,这些工资值是比较笼统的,没有一个网站足以评估你的价值。正是这些价值观的方向,可以作为你未来处理薪资问题时的工具。
软件工程师
照片由 Alexandru Acea 在Unsplash【2】上拍摄。
软件工程师的角色可以有很多不同的含义。有些软件工程师是严格意义上的后端、前端、全栈,甚至是机器学习工程师。也就是说,基于各种各样的因素,工资也会有很大的波动。
注:该薪资信息最后一次更新时间为 2021 年 12 月 15 日
以下是一些不同资历级别的软件工程师和他们各自的薪水【3】(四舍五入):
- 普通软件工程师→
$88k
- 普通入门级软件工程师→
$77k
(≤ 1 年) - 普通的早期职业软件工程师→
$86k
(1-4 年) - 中等职业生涯的软件工程师→
$97k
(5-9 年) - 普通的后期职业软件工程师→
$108k
(10-19 年)
我同意这些数字吗?
号码
我觉得他们太低了,尤其是入门级的工资。然而,有些城市的工资可能会高得多。
话虽如此,以下是一些热门城市和其他一些城市对早期职业软件工程师的*均薪资(*均值为 86k):
- 纽约,纽约州→107,845 美元
- 华盛顿州西雅图→109061 美元
- 德克萨斯州奥斯汀→89398 美元
- 佐治亚州亚特兰大→84004 美元
正如你所看到的(和期望),当你更新到一个特定的城市时,有一个相当大的跳跃。现在,让我们添加最受欢迎的技能,可以为该城市带来最高的工资。
下面是这些城市的详细情况,这些城市都具备一定的技能:
- 纽约,纽约→ $135,197 带 Apache Hadoop
- 华盛顿州西雅图→ $127,424,目标是 C
- 德克萨斯州奥斯汀→ $121,500,带微服务
- 佐治亚州亚特兰大→109,927 美元,采用云计算
根据 PayScale 的说法,这里的要点是,当你增加不一定直接以软件工程为重点的技能时,你可以期望赚更多的钱。
数据科学家
活动创作者在Unsplash【4】上的照片。
以我个人的经验来看,数据科学家的工资可能会有一个相当大的范围(我们将在下面概述具体的范围)。当然,这取决于多种因素,比如你的工作经验年限、你所居住的城市,或者你所具备的特定技能。也就是说,让我们来看看这些资格/特征的变化,看看*均工资是如何更新的。
注:该薪资信息最后一次更新时间为 2021 年 12 月 14 日
以下是数据科学家的一些不同资历级别和他们各自的薪水【5】(四舍五入) :
- *均总体数据科学家→
$97k
- 普通入门级数据科学家→
$85k
(≤ 1 年) - 普通早期职业数据科学家→
$96k
(1-4 年) - 中等职业生涯的数据科学家→
$110k
(5-9 年) - 职业生涯后期的普通数据科学家→
$122k
(10-19 年)
这个工资数据是从 PayScale 收集的,如果你想要一个更具体的估计,那么你可以使用工资调查 [6]。
我同意这些数字吗?
基本上是的。
我认为这个数字应该更高,但这些都是*均值,所以可能会有更小的城市或更多的农村地区不那么昂贵,这些城市可能比那些成本更高的城市构成更多的估计。
话虽如此,以下是一些热门城市和其他一些城市各自对早期职业数据科学家的*均薪资(*均为 96k):
- 纽约,纽约州→107,092 美元
- 华盛顿州西雅图→111,882 美元
- 德克萨斯州达拉斯→92724 美元
- 佐治亚州亚特兰大→92758 美元
现在,让我们添加最受欢迎的技能,可以为该城市带来最高的工资。
下面是这些城市的详细情况,这些城市都具备一定的技能:
- 纽约,纽约→117,186 美元,带阿帕奇蜂巢
- 华盛顿西雅图→**亚马逊网络服务(AWS)**120,533 美元
- 德克萨斯州达拉斯→算法开发112,500 美元
- 佐治亚州亚特兰大→ $99,750 配有 Apache Hadoop
对我来说,最大的惊喜是德克萨斯州达拉斯添加算法开发技能的崩溃,从92k 到112k。这个跳跃对于增加一个技能来说是相当大的。我也不确定这个技能到底意味着什么——这让我想到了一个重要的问题——
一定要研究你知道的所有技能,并把它们写进你的简历,因为它们可能是决定你薪水的最大因素
摘要
正如所料,城市和技能会影响软件工程师和数据科学家的报告工资。然而,某些技能导致了工资的惊人增长,而这些只是我们研究的特定城市和技能。在使用这个 PayScale 工具时,还可以发现其他组合。
以下是软件工程师和数据科学家的薪资汇总:
* Average Overall Software Engineer → $88k* Average Overall Data Scientist → $97k* Data scientists may have a higher overall salary, but we saw that for the cities we investigated, their opportunity to increase salary by adding specific skills actually lead to a smaller average early-career salary than software engineers* Several factors contribute to salary, the most important most likely being seniority, city, and skills
我希望你觉得我的文章既有趣又有用。如果你同意或不同意这些工资比较,请在下面随意评论。为什么或为什么不?关于薪水,你认为还有哪些重要的因素需要指出?这些当然可以进一步澄清,但我希望我能够阐明软件工程师和数据科学家之间的工资差异。
最后,我可以再问一次同样的问题,你如何看待薪资受到远程职位的影响,尤其是当城市是决定薪资的一个如此重要的因素时?
我与这些公司都没有关系。
请随时查看我的个人资料、 马特·普日比拉、和其他文章,并通过以下链接订阅接收我的博客的电子邮件通知,或通过点击屏幕上方的订阅图标 的 ,如果您有任何问题或意见,请在 LinkedIn 上联系我。
订阅链接:https://datascience2.medium.com/subscribe
引荐链接:https://datascience2.medium.com/membership
(如果你在上注册会员,我会收到一笔佣金)
请记住,对于这篇文章,这些数字不是我的工资,而是由 PayScale 和其他实际的数据科学家和软件工程师报告的。因此,本文反过来围绕真实数据展开讨论,旨在让您更好地了解是什么让一个角色( ,一般是 )根据某些因素增加或减少薪资金额。
参考
[1]照片由 NeONBRAND 在 Unsplash 上拍摄,(2017)
[2]由 Alexandru Acea 在 Unsplash 上拍摄的照片,(2018)
[3] PayScale,Inc .,软件工程师*均工资等级,(2021 年 12 月 15 日)
[4]2018 年活动创作者在 Unsplash 上的照片
[5] PayScale,Inc .,数据科学家*均工资等级,(2021 年 12 月 14 日)
[6] PayScale 公司, PayScale 薪金调查,(2021)
数据科学——它到底意味着什么?
原文:https://towardsdatascience.com/data-science-what-does-it-really-mean-d6e976d6b630?source=collection_archive---------23-----------------------
图片由皮克斯拜的 Gerd Altmann 提供
“数据科学”一词出现在大约 10 年前,并最终演变成当今世界上最热门的词汇之一。从学术界到政府组织,再到几乎每个行业的公司,都在不断投入越来越多的努力来充分利用信息技术,并因此创造了许多新的职位,如数据科学家和数据工程师。
那么这个术语代表什么呢?是什么让它如此特别?
虽然这些角色所涵盖的职责有一些通用的定义(如 10 种不同的数据科学职位及其含义中概述的定义),但我们不难发现,不同市场的需求导致了这些定义的一些差异,甚至可能导致对这两个问题的不同回答。我将尝试在这里提供我对它的理解,这可能有希望帮助其他人在更大的画面上获得更多的见解。
什么是数据科学?
顾名思义,数据科学是数据的科学。正如过去十年或二十年所证明的那样,随着技术的进步,这一定义下的内容显然会发生变化。在当前的技术框架下,这包括从数据收集端到所有存储和分析方法,一直到利用结果的各种渠道。这种类型的数据处理链现在通常被称为数据流水线。
数据管道
数据管道通常代表数据操作组件的有序集合,从收集数据到呈现从中提取的有用信息,以及这之间的一切。就像生产链一样,每个组件负责以特定的方式处理提供的输入数据,产生的输出数据用作下一个组件的输入。虽然该术语通常指的是组件的长期实现,以便尽可能自动化该过程,但临时分析通常遵循非常相似的方法。这个处理链可以有效地分为四个主要类别:
数据收集
该过程的第一(实际)阶段为进一步分析准备数据。在此之前通常会有一个头脑风暴阶段,用问题/难题来引导需要收集什么样的数据。它有时可能首先涉及一些(通常是自动的)数据收集过程,无论是网络搜集还是通过移动网络来自远程传感器的数据。根据不同的方法,这可能涉及编码一些网络爬虫,或者从一些 API 数据源收集脚本。
数据存储
然后,它们被导入某种数据存储*台,可以是云或本地数据库。这种通道通常涉及一些数据格式转换(有时包含在数据工程定义中),以便结果与通常为高效数据提取而优化的存储兼容。这种数据存储*台的结构通常是为相关联的应用而专门设计的,并且通常由数据工程师负责,其通常的职责还包括编写(通常是 SQL)提取数据优化以用于期望的进一步分析的函数。
事实上,大多数原始数据集包含大量需要清除的噪声。数据工程师通常负责准备数据以备分析,这通常包括实施一些程序,尽可能高效地实现上述大部分清理、收集和存储程序的自动化。
数据分析
这一阶段的主要目标是提取数据中固有的趋势和模式。根据数据类型以及项目的最终目标,有许多不同的方法可以做到这一点。它通常涉及使用现有数据建立模型,使用的技术从回归、时间序列分析到各种类型的机器学习算法,如聚类和神经网络。这种模型的应用范围可以从商业和金融部门的时间序列数据预测到肿瘤分类和自动驾驶技术的图像识别。
介绍会;展示会
这是最终结果被利用的阶段。它们要么出现在某种报告/演示中,要么是集成到系统中的完整数据管道。
通常对于特别分析,获得的结论以报告或幻灯片的形式呈现给风险承担者。很有可能利益相关者对管道的技术细节知之甚少。数据专家的角色非常类似于这里的销售人员,主要目标是说服利益相关者所做的工作是值得的,并且对利益相关者非常有益。
良好的数据 可视化是交付分析结果的关键(在这种情况下,“一张图胜过千言万语”这句名言通常是一种保守的说法)。数据是美丽的和数据是丑陋的是两个子 reddits,其中包含了许多有趣的例子,人们可能会发现这些例子对创建它们非常有帮助。
最终结果可能是某种报告/演示,或者是集成到系统中的完整数据管道,该系统将以高度自动化的方式继续工作
作者图片
摘要
为了优化这些组件可以创造的价值,数据科学专业人员通常需要以顾问的身份与利益相关者一起开始工作,通常称为“业务问题方法”。在这一阶段,数据科学专家从利益相关方那里收集信息,以确定:
- 项目的最终目标——涉众希望通过投入时间和金钱实现什么。
- 收集什么数据—这通常由最终目标决定。
- 精度要求——对于一些项目来说,牺牲一点精度来换取响应性能并不罕见,例如实时系统。
- 需要额外的硬件—如果有足够的基础设施来利用项目的最终产品。我在另一篇文章中概述了这一点— 对数据科学有用的计算机知识
确保每个方面都达到令人满意的水*,与数据管道中每个组件的最终性能一样重要。所有这些因素带来的良好表现和效率是最终成功的关键,就像我从 NBA 传奇人物那里借用的一句话:
"一个人可能是团队中至关重要的组成部分,但一个人无法组成团队。"—卡里姆·阿卜杜尔·贾巴尔
美国宇航局在 Unsplash 拍摄的照片
为什么数据科学突然流行起来了?
我们已经有了很长时间的数据,以及用来分析这些数据的方法。例如,线性回归早在 19 世纪就出现在勒让德(1805)和高斯(1809)的工作中[1],为什么数据的“科学”直到最*十年才出现?以下是我发现的几个因素:
互联网
自从互联网服务在 20 世纪 90 年代后期开始流行以来,世界各地每天都在产生大量的数据,特别是当社交媒体和智能手机从 2000 年代中期开始流行时。许多组织和公司已经利用了这种数据资源,并从不同类别的人群中提取行为趋势和模式。这些结果对于提高许多部门的效率变得极为宝贵,从电子商务到基础设施分析等领域。
计算能力
由于计算能力的提高,许多机器学习方法,如 20 世纪 90 年代早期开发的支持向量机[2]已经变得流行起来。商业级机器最终强大到足以让更多的人使用这些方法,通常允许一些更复杂格式的数据(如声音、图像和视频)以多种方式进行分析,这在以前是不可能的。
云计算
互联网和计算能力进步的结合不可避免地带来了云计算。在云计算于 2010 年左右开始流行之前,已经有网格计算(如 LHC 计算网格)等技术广泛应用于科学研究等专业领域。这样做的最大好处显然是,我们可以自由地拥有为我们工作的硬件,而且无法远程控制的东西允许我们启动工作,关闭我们自己的计算机和灯,去我们去的酒吧,同时知道我们仍然是“高效的”。
结论
显然以上这些因素也是纠结在一起,一路走来相互恭维。早在数据科学成为一个时髦词之前,它的许多概念就已经存在了,比如回归和数据管道。随着新技术的出现,这些核心概念中的一些仍将存在,而我们可能只是通过更聪明的工具以更聪明的方式使用它们。这也是为什么数据科学的课程仍然在强调这些概念,而不是在一些具有机器学习功能的商业软件的界面上找到点击按钮的原因。
最后,所有数据相关流程的黄金法则始终是“垃圾进,垃圾出”。
[1]斯蒂格勒,斯蒂芬·M,《统计学的历史:1900 年以前不确定性的测量 (1986),剑桥:哈佛。ISBN0–674–40340–1。
[2] Cortes,Corinna 和 Vapnik,Vladimir N, 支持向量网络 (1995),机器学习。20(3):273–297。citeserx 10 . 1 . 1 . 15 . 9362。doi:10.1007/BF00994018。S2CID 206787478。
数据科学与谷歌工作表
原文:https://towardsdatascience.com/data-science-with-google-sheets-2723eb96a873?source=collection_archive---------37-----------------------
我如何使用 Google Sheets 进行小型数据集成和分析任务
所罗门·OFM 在 Unsplash 上的照片
您的大部分数据将通过流或批处理传输到您的数据仓库或数据湖中。您将选择稳定的 ETL 或 ELT 流程,从您的遗留系统、CRM、ERP、IOT 等中获取大多数和最相关的数据。
然而,在数据科学和自助式 BI 的世界中,您的数据分析师/科学家和 BI 用户还需要来自外部系统、开放式 API 的数据,以及来自表单、网站等的数据。因此,像 Google Sheets 这样的工具可能是轻松实现数据流的一个很好的解决方案。这篇文章应该让你初步了解如何将 Google 强大的 BigQuery 与易于使用的 Googles Sheets 及其“无尽的附加组件”结合起来。
谷歌云
通常情况下,你可以将 Google Sheets 连接到 BigQuery,并将表格数据加载到工作表中,以条形图、饼状图等形式显示出来。但是您也可以使用工作表作为 BigQuery 的源,反之亦然。你不必担心连接器等。已经有内置的和现成的。
Google Sheets 和 BigQuery 的集成——作者图片
一些例子和启示
在我的工作经历中,我遇到了 Google Sheets 和它的“伟大插件”,它们为我提供了 BigQuery 的自动化数据处理的可能性:
从网站或文件中获取数据
有了内置函数,你可以从任何网站获取数据(如 HTML 表格)或链接文件,如 CSV 或 TSV [1]。
通过 IMPORTDATA-function 导入 CSV 数据的示例—作者图片
转换您的数据
为了对我的地址数据进行地理编码,我曾经不得不将三列合并成一列,用逗号隔开。因此,我使用了床单的附件电动工具:
Google Sheets 和 Power Tools 转换数据——图片由作者提供
有了这个伟大的插件,您可以轻松地合并和组合数据,找到重复,随机化数据和更多没有任何编码。对于没有深入了解 SQL 的用户来说,这可能是一个很大的优势。因此,您不必在 BigQuery 中转换数据(每次查询都要花费成本),您可以事先完成这一步,将数据加载到 BigQuery 中,并通过 Data Studio 等工具将其可视化。
地理编码数据
在转换我的数据后,我想对它进行地理编码。另一个很棒的插件出现了:由 Awesome 表进行地理编码【2】
通过 Awesome 表进行地理编码以从地址数据中获取纬度和经度-按作者分类的图像
所以这个插件为我提供了获取地址的经度和纬度的服务。这是一个很好的特性,因为对于地图可视化来说,你经常需要坐标。
从 API 获取数据
有很多开放的 API 可以用来获取数据湖中还没有的数据。我搜索了一个 API 来获取某些单词的同义词——将它们与 BigQuery 中的 ERP 数据结合起来,并找到可疑的预订。我还使用 Google Sheets 通过 HTTP 请求调用 API。例如,你可以自己使用应用程序脚本,也可以使用插件,这里我喜欢 API 连接器[4]。
通过 HTTP 请求获取数据的 API 连接器插件—图片由作者提供
统计和机器学习
另一个用例可能是统计和机器学习。Google Sheets 可能是这些领域的合适解决方案吗?是的,可以。以下两个工具非常有用:
- 求解器: 用于高级统计运算
- BigML: 通过拖放进行机器学习[3]
结果也可以加载到 BigQuery 中,并使用来自其他来源的数据进行丰富。
限制和注意事项
请记住,Google Sheets 是一个电子表格程序,应该主要用于这个原因——它不适合大量数据加载过程。还可以考虑实现一个基于应用程序脚本(如果插件没有提供)的数据自动刷新,这样从 sheets 到 BigQuery 的数据流总是提供最新的数据。
对于他们自己的使用,也可以让业务用户通过上述方式获得他们想要的数据。然而,当考虑通过数据湖将数据传播给其他消费者时,通过 Google Sheets 的数据集成应该由 IT 部门或者至少是技术高级人员来监控甚至实现。提到的一些附加服务也是付费使用的服务,有一定的奖励范围。
摘要
Google Sheet 作为 Excel 的一个更便宜、完全 SaaS 的替代品,具有一些很酷的功能来实现较小的数据工程和科学任务和项目。您可以将它与 BigQuery 和许多有用的插件结合使用。当然,对于较大的项目,其他架构也有意义,但是要快速实现某些东西,尤其是对于 PoC,Google Sheets 是一个非常实用的工具。
资料来源和进一步阅读
[1]谷歌,导入数据 (2021)
[2] Google Workspace Marketplace,由 Awesome 表进行地理编码 (2021)
[3] bigml,谷歌表单 bigml 附加软件 (2021)
[4]谷歌工作空间市场, API 连接器 (2021)
数据科学不会改善你的商业决策。这就是威尔。
原文:https://towardsdatascience.com/data-science-wont-improve-your-business-decisions-here-s-what-will-c2745e67c350?source=collection_archive---------13-----------------------
迈克尔·泽兹奇在 Unsplash 上的照片
决策智能是大多数项目中缺失的一环
数字化转型是当季的味道。每家公司都加快了数字化运营、收集情报和快速响应不断变化的市场的步伐。
麦肯锡高级合伙人 Kate Smaje 说组织现在在 10 天内完成了过去需要 10 个月的工作。她说,随着数据推动更好更快的决策,复苏之路是由数据铺就的。
因此,大多数组织都在尝试采用数据驱动的决策。他们正在雇用数据科学家,购买最好的工具,并为大爆炸分析项目开绿灯。
加倍数据不会改善您的业务决策。
然而,光靠这些努力是不会有结果的。它们会导致活动、期望和费用的增加,但是业务成果不会奇迹般地发生。高达 80%的数据科学项目失败。想知道为什么吗?这些计划缺少一个关键要素:决策智能。
Johannes Plenio 在 Unsplash 上拍摄的照片
决策智能是数据科学在业务问题环境中的应用,它是通过考虑利益相关者的行为来影响采用和决策制定而实现的。
决策智能为数据科学增加了两个学科,这两个学科在涉及数据时经常被忽略:社会科学和管理科学。只有当你将这三个学科——数据科学、社会科学和管理科学——的所有原则和技能结合起来,你才能做出商业决策。有必要将数据洞察与组织环境中的社会行为联系起来,以便做出决策。
决策智能如何帮助您?
许多数据科学项目失败的原因是 IT 领导者没有应用所有这三个学科。决策智能将这三个学科结合在一起,以解决故障点。
以下是每个学科扮演的角色:
社会科学
为了帮助你的目标受众做出正确的决定,你必须首先努力理解他们。超越他们的直接提问,了解他们的想法、感受和行为。这种在社交环境中理解用户行为的尝试将帮助你收集正确的数据。获得的知识将帮助你调整你的见解,并使之适应特定的社会和组织环境。请记住,这是一个持续的旅程,需要更软的技能,它比在项目开始时收集用户需求要深入得多。
数据科学
凭借对用户和业务环境的深刻理解,数据科学为您提供了一套技术工具,帮助您提出正确的数据问题。无论您选择应用简单的描述性分析还是更深入的预测性分析,您都必须确保业务洞察力是有用的和可操作的。最后,利用信息设计的原则,使洞察力以可视数据故事的形式变得可消费。
管理科学
你的工作不仅仅是向你的目标受众提供相关的商业建议,你还必须通过采用解决方案来帮助他们根据这些建议采取行动。这通常需要改变业务工作流程,并需要培训利益相关者来管理组织变革。在持续的基础上计划各种干预,以便从管理的角度进行管理、监控和纠正。通常,这些在组织中被完全忽略或被视为事后的想法。
只有当你将数据科学、社会科学和管理科学这三个学科的原则和技能结合起来时,你才能做出商业决策。
利用决策智能改善商品价格交易结果
由 Timelab Pro 在 Unsplash 上拍摄的照片
这一切在现实世界中是如何进行的?考虑这个来自一家从事农产品交易的大型企业集团的例子。该公司有一个很好的数据分析用例:它希望预测未来价格并提高其交易决策的质量。
我们的咨询公司花了几周时间收集数据,整理数据,并构建了各种机器学习算法。这些方法从简单的预测技术到更复杂的算法,比如可以预测未来一周预期价格的神经网络。
在处理数据之后,模型提供了超过 95%的准确性,我们的可视化层为业务用户推荐了相关的操作。该解决方案看起来很有前景,团队对结果感到兴奋。
然而,一旦业务用户查看了推荐的操作,兴奋感就开始消退了。结论是这些建议是不可行的,提议的计划是不可用的,因为解决方案的精确度不足以做出交易决定。
虽然这令人震惊,但团队忍住了花更多时间调整算法以提高准确性的冲动。他们重新开始。
缺少的是决策智能。
将社会科学和管理科学融入解决方案
在 Unsplash 上由 Anderson Rian 拍照
我们的团队后退一步,研究了业务流程、历史交易和过去的决策结果。他们采访了商业用户,以发现哪些信息对他们做出决策至关重要——应用了重要的社会科学学科。他们学会了如何在技术解决方案上教育用户,以及如何赢得他们的信任和认可——运用所有重要的管理科学学科。
这一次他们的发现令人惊讶:他们意识到预测未来几周的准确价格并不重要,这与之前的假设相反。相反,他们发现知道价格可能会上升还是下降就足够了——这是对变化方向的预测。
由于该组织持有实物库存,这种洞察力可以帮助他们决定是出售库存还是再持有几天。有了这些来自商业分析和社会科学方法的输入,团队重新审视了数据科学技术。在这种替代方法中,新的机器学习技术的准确率略低,为 88%。然而,关于是出售还是持有库存的建议是可靠的,可操作的。
最后,该团队启动了从管理科学角度来看所需要的干预措施。他们将算法建议合并到业务工作流中,并与利益相关者合作,以影响采用所需的更改。
仅有数据科学是不够的。决策智能有助于提出一种全面的方法来交付预期的业务成果。
随着数据洞察推动业务决策,该团队在接下来的几个月中监控进度,以衡量节省和投资回报。在生产部署的第一个季度内,利用决策智能开发的修订解决方案带来了 3.2%的直接归因于定价的收入增长。
仅有数据科学是不够的。决策智能有助于提出一种全面的方法来交付预期的业务成果。
决策智能促进数据驱动的决策
作为数字化转型工作的一部分,在您为数据和分析支出预算之前,请了解它将如何带来更好的决策。
你的团队关注用户和他们的社会行为,而不仅仅是洞察力吗?从长远来看,你的团队是否致力于帮助用户按照建议行动并管理采用?
要做出更好的商业决策,你需要的不仅仅是数据和分析。你需要决策智能。
这篇文章最初是由 发表在 企业家项目上。增加了插图。
数据科学工作流程—实验跟踪
原文:https://towardsdatascience.com/data-science-workflow-experiment-tracking-609e649973a3?source=collection_archive---------22-----------------------
使用 Git 流探索数据科学假设
数据科学是一个研究驱动的领域,探索一个问题的多种解决方案是一个核心原则。当一个项目变得越来越复杂时,我们需要比较结果,看看什么方法比其他方法更有前途。在这个过程中,我们需要确保我们不会忘记项目的组成部分或错过关键信息。此外,我们需要有能力重现结果和管理过去的实验,以便不浪费时间探索相同的假设两次。为此,有必要使用结构化的工作流程来探索新的实验。
在这篇博文中,我们将讨论以下主题:
- 数据科学项目中的主要挑战以及克服这些挑战所需的能力。
- 来自软件开发工作流程的见解。
- 运行新实验的推荐工作流程。
数据科学工作流程中的主要挑战
为了更好地理解实验跟踪工作流程中的挑战,让我们首先定义一个典型项目中涉及的步骤:
- 了解手头的业务问题。
- 收集原始数据。
- 探索、转换、清理和准备数据。
- 基于数据创建和选择模型。
- 训练、测试、调整和部署模型。
- 监控模型的性能。
数据科学项目生命周期,作者图片
上面概述的工作流提供了将机器学习模型部署到生产并监控它的路线图。正如我们所见,数据科学项目中的大部分过程都是基于试错法的。数据科学家运行测试,比较结果,重新运行测试,比较结果,等等。因此,我们必须应对三大挑战。
挑战: 管理不同的实验/方法来解决问题。
在从事数据科学项目时,我们经常需要探索不同的方法来解决问题——超参数调优、模型架构、数据处理方法等。每种方法都可能不同,甚至相互正交。此外,每种方法都有子实验,挑战研究者选择最佳结果。
所需功能: 比较工具,呈现不同的结果,并通过各种参数进行比较。
挑战: 用项目的所有组件重现之前的实验结果。
在探索子实验的时候,我们说不清什么时候达到了想要的结果。可能在第一次实验,第 x 次,或者最后一次。因此,我们需要有能力重现代码、数据和实验模型,并得到最好的结果。
期望的能力 : 用实验的结果封装项目的所有组件。
挑战: 并行工作,同步项目的各个组成部分。
在生产环境中工作时,最大的挑战之一是与其他数据科学家协作。在同时进行各种实验的同时,管理代码、数据和模型变成了一项痛苦的任务,而不是一种工作状态。
期望的功能: 版本项目的所有组件。
从软件开发中学习
由于软件开发和数据科学之间的相似性,并且由于团队中的软件开发有更多的时间来成熟,让我们看看如何适应和应用来自该领域的方法,并使用它们来定义数据科学领域中的高效工作流。
软件开发工作流是一个广泛的学科。我想把我们的注意力放在“Git 特性分支工作流”上,它定义了一个严格的分支模型。它为管理拥有大量开发人员的大型项目提供了一个健壮的框架。为了简单起见,我不会在这篇博文中讨论开发和发布分支的用法。
Git 流—功能分支工作流,作者图片
在特性分支工作流程中,我们将在主分支上存储项目的生产版本,并在不同的分支上存储开发的特性。Git 将为每个分支隔离工作环境,因此开发人员可以编辑、暂存和提交对功能分支的更改,而不会影响产品版本。
如果使用 Git 托管*台(例如 GitHub、BitBucket、GitLab),当特性准备好时,开发人员不会简单地将其合并到主分支,而是会创建一个 pull 请求(PR)。这时,他将把它分配给他的同事,以审查整个工作和变化。
最后,当特性准备好进行部署时,开发人员会将特性的分支合并到主分支中。然后,CI/CD 工具将获取新版本,构建它,并将其部署到生产环境中。
该工作流使许多团队能够并行工作,并有效地管理他们的项目。通过一些修改,我们可以将其应用于数据科学,以克服前面描述的挑战。让我们探索一下如何做到这一点。
实验跟踪工作流程
基于这篇博文中提到的挑战、期望的功能和传统的软件开发工作流程,我们建议一种新的方法。
核心要素
实验跟踪工作流程—核心要素,作者图片
上面的每一个元素都建立在前一个元素的基础上,通过组合它们,它们创建了一个整体的解决方案。
这个工作流的基础是数据和模型版本。跟踪项目的所有组成部分使得复制以前的工作更加容易。此外,当在团队中工作时,它使我们能够更有效地管理项目,并在不同的组件上并行工作。几个 MLOps 工具支持数据版本,它们包括 DVC ,MLflow 和 Pachyderm。
第二个元素是封装了 E 实验 的组件和结果。为了重现实验结果,我们需要能够检索代码、数据的版本,并对产生它们的模型进行建模。我们将使用上述工具之一来版本化数据和模型文件,并使用 Git 来版本化代码文件。我们建议将实验的参数和度量记录到一个开源可读文件中,并使用 Git 跟踪它们。
第三个要素是指实验的隔离。这个元素的灵感来自于软件开发工作流,其中产品代码保存在主分支上,而演进的特性存储在不同的分支上。在我们的例子中,项目最好的部分将在主分支上进行,每个实验将在另一个分支上进行。这样,管理和跟踪各种实验,回顾每个实验的结果,而不是两次收获同一个实验,就变得容易了。
第四个也是最后一个元素是数据科学投票请求(DSPR) 。当创建一个软件开发项目的 PR 时,唯一需要评审和合并的元素是代码。然而,数据科学项目有更多的组成部分。因此,为了能够对实验的全貌进行有效的审查,DSPR 将包括代码、数据、模型和实验结果。
实验跟踪工作流程,图片作者
实验跟踪工作流程
- 为实验创建一个分支,并将其签出。
2.在分支上运行子实验,并跟踪项目组件的定性结果。
- 并行方法 —对于每个子实验,创建一个新的分支,并在其上运行实验。当有多个实验时,这种方法会变得难以管理。
- 顺序方法 —对于每个子实验,创建项目版本的新提交。这种方法允许您选择想要跟踪和过滤噪音的实验。
3.比较不同实验的结果,选择最好的一个。
4.如果最佳实验结果优于主分支上的模型结果。
- 并行方法 —检查存储实验最佳结果的分支。
- 顺序方法 —检查具有最佳结果的提交,并将其分支到新的分支。
5.创建包含所有项目组件(代码、数据、模型和实验)的数据科学调查请求。
6.审查 DSPR 及其批准后,将文件合并到主分支。
Git 流
Git 流程—顺序方法,作者图片
Git 流—并行方法,作者图片
总结
使用上面的工作流程和元素,探索一个新的假设成为一个更容易管理的任务。我们可以很容易地比较实验结果,并确定哪种方法更有效。如果你尝试过这个工作流程,并且对你有所帮助——我很乐意通过 Twitter 或 LinkedIn 了解它。如果你有优化的建议,我们可以在我们的不和谐频道谈论。
数据科学工作流—从笔记本到生产
原文:https://towardsdatascience.com/data-science-workflows-notebook-to-production-26afc13442bb?source=collection_archive---------13-----------------------
图片来自 PixaBay
使用各种 MLOps 工具和技术缩短从研究到生产的时间。
将在笔记本中开发的项目重构到生产就绪状态是一项挑战,会消耗我们的时间和资源。在 DagsHub,我们采访了来自数百家公司的数据科学从业者和 ML 工程师,试图了解他们的工作流问题和解决方案。在这篇博客中,我将把我们两年的研究构建成一个结构化的工作流,它将帮助您使用 MLOps 工具和技术减少研究和生产之间的迭代时间。
将模型部署到生产环境时的注意事项
实现 DagsHub 的产品剧本,我想通过思考我们在将模型部署到生产时的考虑来开始我们的旅程。
当我想到生产时,首先想到的是将产品交付给不同的团队——在公司内部或外部。因此,我们希望我们的结果是可靠的,而且在许多情况下,是可以解释的。我们还想降低生产中出现错误的风险;因此,我们的项目应该是可测试的,不仅是代码,还有模型、数据、管道等。当产品中出现错误时,我们需要一种方法来重现产品的状态。这意味着不仅可以访问所有不同的组件,还可以访问相关的版本。最后,我们希望部署过程尽可能自动化,减少研究团队和 MLOps 团队之间的摩擦。
基于这些考虑,让我们回到起点。我们通常会通过测试和原型化我们的假设来开始一个项目,我们的工具将是笔记本。
Jupyter 项目
诞生于 2014 年的IPython,项目 Jupyter 已经在数据科学界得到了热烈的采用,成为原型开发事实上的标准工具。它的影响在 2017 年得到了正式认可,当时被选为 ACM 软件系统奖,这是一项与 Unix 、 Web 、 Java 等分享的荣誉。
“Jupyter 项目”的谷歌趋势,作者图片
然而,如果你探索一些数据科学社区,你会得到这样的印象,笔记本是万恶之源。我不同意。我认为笔记本很棒!它们为我们提供了一种处理代码的交互方式。包括 DagsHub 在内的许多公司都选择笔记本界面来存放他们的教程和交互式手册。它们有内置的可视化功能,有利于与技术同事或不太懂技术的利益相关者交流您的工作。所有这些都意味着它们非常适合快速原型制作。
在生产中使用笔记本电脑的缺点
然而,当您的项目发展并变得越来越复杂时,更不用说进入生产阶段了,您很可能会碰壁。根据我们的研究,我们绘制了数据科学家面临的五个核心困难:
- 再现性 —使用笔记本电脑,我们可以运行乱序代码,并在运行一次后编辑单元格。这对于可再现性来说是一个巨大的缺点,这使得我们在执行实验时要花很多精力来跟踪内核状态。
- 版本控制 — Jupyter 笔记本基本上都是很大的 JSON 文件,Git 不容易区分,很难审核(更不用说合并)变更。
- 调试 —笔记本有一个调试器工具,但是随着笔记本越来越长,使用起来就变得很痛苦。
- 测试&重用 —笔记本单元中托管的代码不能从外部位置调用,也不容易测试。
- CI/CD —缺乏适当的 CI/CD 工具来自动化部署流程。
如果您在使用笔记本电脑时遇到了其他挑战— 我很乐意听到这些挑战!
有些人甚至将笔记本电脑投入生产,在我看来,这是不推荐的。它无视行业标准、工作流程和最佳实践。此外,我们仍然缺少适当的 CI/CD 工具来支持部署生命周期,笔记本电脑需要大量清理和打包数据科学家技能集之外的库,并且在生产中使用其他工具时很难运行。
“但是你好,网飞将他们的笔记本投入生产”,这是一个在 MLOps.community 中经常使用的论点。是的,一些大公司在生产中使用笔记本电脑,但他们投入了大量资源来支持这样的工作流,在大多数情况下,你不会有或不想转移这项任务。
承蒙哈默尔侯赛因许可
解决方案的组成部分
考虑到上述挑战和生产方面的考虑,我将行业中目前使用的最佳实践收集到一个基于六个组件的结构化工作流中。
- 转换成脚本 —将代码转换成脚本中托管的函数。
- Monorepo 战略 —使用“monorepo for data science”结构来降低复杂性并扩展我们的工作。
- 版本化一切 —版本化所有项目组件——代码、数据、模型等。
- 实验跟踪 —自动记录实验过程,以帮助我们理解项目历史,并使人们能够查看高级结果。
- 导出逻辑 —将逻辑步骤移至外部脚本,以避免在生产中使用笔记本,并维护一个代码库。
- 单元测试——编写项目组件的测试,投入更多精力测试低层次的组件,为其他组件奠定基础。
如果你找到了克服我们面临的挑战的其他方法,我很乐意再一次听到这些方法。
示例场景
在我们的示例场景中,团队领导刚刚与董事会通过电话,漏斗中有一个新项目——“拯救世界”。他们刚刚发送了数据集,很明显,他们希望模型尽快投入生产!所以我们打开一个新的笔记本,尝试一下。
项目结构,按作者分类的图像
转换成脚本
我们的第一步可能是探索手头的数据。例如,检查特征分布。
Jupyter 笔记本伪代码,图片由作者提供
现在,我们需要进行的最重要的观念转变来了。在让最初的一段代码做了它被设计要做的事情之后,我们将它重构为一个 python 函数,这个函数不依赖于任何全局变量,而是把一切都作为参数。我们将在笔记本之外的 python 脚本中存储该函数,这将使它可以从项目中的任何地方调用。
IDE 伪代码,图片由作者提供
接下来,我们将把该功能导入笔记本并使用它。
Jupyter 笔记本伪代码,图片由作者提供
解锁功能
- 代码版本控制 —使用标准工具对我们的代码进行版本控制。
- 无隐藏状态 —功能的输入和输出定义清晰,没有副作用。代码更清晰,可测试,可重复。
- 保持干爽(不要重复自己) —在这个项目或者其他任何地方重用代码。
- Lint —使用静态代码分析工具,一种行业标准,来标记编程错误、bug、风格错误和可疑结构。
单一回购策略
既然我们已经使我们的项目更加模块化,我们希望利用它,并通过实施良好的旧 monorepo 策略变得更具可扩展性。mono repo(“mono”意为“single”,“repo”是“repository”的缩写)是一个基于主干的开发实现,其中许多项目的代码都存储在同一个存储库中。知名公司都采用这种策略,比如谷歌、脸书、微软等等。
monorepo 与数据科学有什么关系?
数据科学项目可以分为完全独立的阶段,例如 EDA、数据处理、建模等。如果我们将每一步作为一个独立的部分来处理,我们将能够将项目划分为实际上是子项目的子任务。使用这种心态,我们将能够通过在不同的团队成员之间划分任务来扩展我们的工作,这些成员将彼此独立,同时征服项目。
我们会注意到,每一级都只依赖于前一级的输出。例如,建模步骤只需要处理阶段的输出。这就是为什么我们想通过产生一个最小的有价值的管道,MVP 来打开瓶颈,并让每个子团队开始工作。一旦一个团队开发出一个有用的产品,他们就会发布他们产品的更新。
现在,我们将为每个独立的子任务提供一个 python 模块,并作为项目管道中不可或缺的组件。此外,我们将为每个任务准备一个笔记本,而不是为整个项目准备一个长长的笔记本。
项目结构,按作者分类的图像
解锁功能
- 扩展 —我们可以扩展项目合作者的数量,增加我们的[产品/时间],并以 X 倍的速度投入生产。
- 维护、检查&调试——拥有更短的面向任务的笔记本,将更容易维护、检查&调试它们。
- 入职 —项目的清晰结构使得入职流程更加容易。
版本控制
一旦到了我们与其他人合作的地步,它只敲响了一个钟——版本控制。对于这个任务,我们将使用 Git ,这是一个业界广泛采用的开源工具,对于并行工作建模和代码文件版本控制非常有用。Git 使我们能够使用标准的 CI/CD 工具,通过点击一个按钮来恢复以前的工作,隔离工作环境,等等。如果你想深入研究数据科学的 Git,Martin 在他的文章中完美地解释了这一点。
但是非代码工件呢?
假设数据处理团队创建了一个新的数据集;他们应该改写旧版本吗?或者通过创建一个新文件夹并给它一个有意义的名称(例如 new_data_v3_fixed_(1)_best.csv)来对它进行石器时代版本化?这两种选择都不合适。这就是为什么我们也想对我们的大文件进行版本控制。
Git 是为管理软件开发项目和版本化文本/代码文件而设计的。因此,Git 不处理大文件。Git 发布了 Git LFS (大型文件系统)来克服大型文件版本控制,比 Git 更好,但在伸缩时失败。此外,Git 和 Git LFS 都没有针对数据科学工作流进行优化。为了克服这一挑战,*年来出现了许多强有力的工具,如 DVC 、三角洲湖、湖沼等等。
达格舒布 x DVC——经许可,由达格舒布提供
在 DagsHub,我们与 DVC 整合,我喜欢使用它。首先,它是开源的。它提供管道功能,并支持许多云提供商进行远程存储。此外,DVC 作为 Git 的扩展,允许您在工作中继续使用标准的 Git 流程。如果你不想两个工具都用,我推荐使用 FDS ,一个开源工具,让机器学习快速&的版本控制变得容易。它将 Git 和 DVC 结合在一起,负责代码、数据和模型版本控制。(偏见警告:DagsHub 开发了 FDS)
解锁功能
- 再现性 —拥有一个版本下所有项目组件的状态使我们能够通过点击一个按钮来再现结果。
- 避免由文件名完成的临时版本控制。代码输出到同一个文件并对其进行版本化。
- 避免因为小错误而覆盖工作并具有轻松恢复文件的能力。
- 共享&同步版本使与其他人的协作更加容易。
实验跟踪
将我们的代码转移到函数中可以更容易地控制它们得到的输入。这有助于我们管理每次运行的配置,并轻松跟踪每次实验的超参数。我们将把配置移动到一个外部文件中,每个模块将导入它的相关变量。
但是可以想象,用 Git 跟踪每个实验会变得很麻烦。我们希望自动完成每次运行的日志记录过程。与大文件版本控制一样,*年来出现了许多实验日志工具,如 W & B 、 MLflow 、 TensorBoard ,不胜枚举。在这种情况下,我相信,你选择用哪把锤子去敲钉子并不重要,只要你把它打穿就行。
请注意,当使用外部工具时,您只能记录实验信息,而不能再现它。因此,我建议在工具和用例之间混合 n' Match。建立一个新假设的原型可能不会提供有意义的结果;因此,我们将使用外部工具来记录实验。然而,在得到一个有意义的结果后,我们将对所有的项目组件进行版本化,并将它们封装在一个 Git commit 下,这样只需点击一个按钮就可以重现。
解锁功能
- 研究历史 —自动化实验跟踪过程将确保记录所有的研究历史,使我们能够理解高水*的结果,并避免重复我们的工作两次。
- 分享 —与团队分享实验结果,同时能够进行比较。
- 再现性 —再现实验(在某种程度上。)
- 避免实验的临时记录,这将因团队成员而异。
将逻辑导出到脚本
在部署到生产环境之前,我们希望将笔记本中存储的所有逻辑步骤转移到 python 脚本中。然而,我们不想失去笔记本电脑的功能;因此,我们将它们重新导入笔记本。
解锁功能
- 在生产中只使用脚本,这是行业标准,更容易处理。
- 维护一个代码库,而不是同时在笔记本和脚本中。
- 继续使用笔记本并利用它们的优势。
单元测试
与软件开发一样,我们希望确保我们的代码/模型做它被设计要做的任何事情。它伴随着数据处理、建模和所有流水线阶段。在编码过程中编写测试实际上会让你整体工作得更快。因为你得到了一个紧密快速的反馈循环,可以及早发现错误,所以调试问题会容易得多,因为你可以单独调试每个单元,而不是调试整个运行的系统。
解锁功能
- 生产中的错误更少,睡眠时间更长。
摘要
Jupyter notebook 是一个用于原型和探索性分析的优秀工具,毕竟它赋予了我们超人的能力。然而,当在以生产为导向的环境中工作时,它的局限性就显露出来了。当一个新项目进入漏斗时,我强烈建议考虑生产方面的考虑,在项目中应该使用什么工具,以及如何使您的工作更加高效。您可能通过模型的性能来衡量您的工作,但是您是通过产品的迭代时间和质量来衡量的。
如果你正面临着我在这篇文章中没有提到的挑战,或者正在思考克服它们的更好的方法——我很乐意听到这些!你可以随时联系 LinkedIn 和 T2 Twitter。
R 中目标包的数据科学工作流:包含代码的端到端示例
原文:https://towardsdatascience.com/data-science-workflows-with-the-targets-package-in-r-end-to-end-example-with-code-1e31318074c4?source=collection_archive---------5-----------------------
结构化且可重现的分析方法
马库斯·斯皮斯克在 Unsplash 上的照片
介绍
我们在工作中或日常杂务中所做的任何任务都很有可能是重复性的。这并不是说任务会完全保持不变,在这个过程中可能需要改变,但是组织子任务来更有效地完成总体目标,并且以最少问题的精简方式总是理想的。
随着时间的推移,我们已经开始在数据任务中采用这种类似于装配线的概念(例如,数据加载、数据准备、模型构建、结果展示等。是在工作流和管道中构建的),由此带来的改进为这种方法提供了有力的支持。事实上,由于我们工作中的迭代性质和思维能力需求,数据科学家在处理此类任务时必须具备一定程度的组织和精简能力。
为什么推荐工作流程/管道和再现性?
为什么我们需要将代码组织成结构化的工作流/管道格式?有什么帮助?
- 数据科学工作计算量大,需要时间运行— 过程中的任何更改都可能意味着整个代码或部分代码的重新运行。由于时间和计算的成本影响,有必要有一种简化的方法来重新运行,其中只运行更新的代码和工作流中与更新的代码相互依赖的那些部分。智能高速缓存和存储功能应该使结果的再生更容易、有效和无错误。
- 容易迷路— 你看到的数据科学工作流上的大多数图形都会有一个循环元素。这种迭代的性质来自于所涉及的各方,例如,领域专家、数据科学家、工程师、业务涉众等。几乎所有的数据科学项目都经历了一轮变革,不仅在目标方面,而且在数据、模型、定义、参数等方面。这可能对迄今完成的工作产生下游影响。在所有这些变化和没有结构的粗糙代码中,很容易在多次更新中迷失。虽然像 Github 这样的工具可以帮助您管理代码版本,但是为您的所有分析建立一个管道结构并将其模块化以便更好地管理整个工作流仍然是非常重要的。举一个例子,在下图中,即使只是准备和执行探索性数据分析(“EDA”),从数据中提出商业案例和关于人工智能解决方案的建议,这项工作也可能是非常迭代的,直到我们获得最终结果。这从下面几乎每个阶段的循环中可以看出。
图片来源:作者
- 干净的代码和 协作— 通过将您的代码变成更小的模块化功能块,您可以将代码分解成小任务,按照逻辑顺序组织它们,并减少代码中的混乱和噪音。这通常是一种好的做法。此外,当在团队中工作并复制完全相同的结果时,这样的实践对于调试、检查和纠正变得至关重要。
德雷克和塔吉特百货公司的套餐
虽然 Python 一直被认为在这一领域更先进,但 R 一直在快速追赶。这里第一个受欢迎的包是德雷克。它分析您的工作流程,用最新的结果跳过步骤,并用可选的分布式计算协调其余步骤。最后,drake
提供了你的结果与底层代码和数据相匹配的证据,这增加了你信任你的研究的能力。
图片来源:作者
2021 年 1 月,德雷克被更强大、更容易使用的目标取代。它处理了围绕数据管理、协作、动态分支和并行效率的大量空白。这里有更多关于 Drake 上的目标的增强和好处的细节。
Targets 的主要增强之一是元数据管理系统,它只在管道实际运行时更新全局对象的信息。这使得了解对代码的哪些特定更改可能会使您的结果无效成为可能。在运行时间很长的大型项目中,这个特性极大地有助于再现性和安心。下面给出的流程示例显示了最新或过期的工作流部分(基于用户更改)。这是实时检测的,并在工作流程中更新。我们将在下面的图片中看到这一点,这些图片显示了工作流的简化视图,在实际的现实世界数据科学项目中,工作流可能会变得非常复杂和冗长。因此,数据科学家将会欣赏快速可视化和理解变化和依赖性的能力。
走查示例
在我们的例子中,我们将使用流行的 Titanic 数据集。虽然工作流可以根据用户的工作需要而细化和复杂,但是为了说明目标的效用,我们将保持它的简单性和标准性。我们的工作流程包括:
A. 加载数据
B. 数据预处理
C. EDA markdown 笔记本生成
d .Xgboost在 markdown 中对模型诊断的一些结果进行测试集的建模和预测
这些步骤涵盖了科学家遵循的标准过程数据,但是在每个阶段都有迭代,我们将通过下面的例子说明目标的不同方面。
- 文件夹结构 让我们用下面的结构创建一个名为“目标”的根文件夹(这是一个例子,不同的数据科学家可能遵循不同的做法)。在目标范围内,我们有:
来源:作者
这里需要注意的重要一点是_Targets.R
应该在根文件夹中。
2。创建在目标 中使用的函数在这里,我们创建一些函数作为开始,它们将成为我们工作流的一部分。作为示例的一部分,请参考下面加载和预处理数据的函数(步骤 A 和 B)。
3。定义、可视化和执行工作流 首先,我们创建一个仅包含任务 A 和 B 的管道,即加载和预处理数据。
目标确定后,让我们来看看流程:
tar_glimpse()
这给出了目标的有向非循环图,并且不考虑元数据或进度信息
图片来源:作者
tar_visnetwork()
这给出了目标、元数据或进度信息、全局函数和对象的有向非循环图。正如我们在下面看到的,Targets 已经自动检测到了依赖项,以及到目前为止还没有使用的函数,例如,bar_plot
。我们还看到,以下所有内容都已过时,因为我们还没有运行目标,这将是我们的下一步。
图片来源:作者
除了上面的命令,您还可以使用tar_manifest()
来确保您已经正确地构建了您的管道。
现在我们运行管道:
tar_make()
图片来源:作者
这将按照正确的顺序运行正确的目标,并通过创建新的 folder _targets 将返回值存储在根文件夹中。这个文件夹会有_targets/objects
和_targets/meta
。现在,当我们使用tar_visnetwork()
可视化管道时,所有的目标都被更改为“最新的”。
图片来源:作者
4。访问文件 要访问文件,您可以使用目标包中的tar_read()
或tar_load()
。
这为我们提供了以下数据集:
图片来源:作者
如前所述,文件也存储在对象部分:
图片来源:作者
您还可以指定您想要存储文件的格式,例如rds
。目标可以返回多个文件,这些文件可以存储为一个列表,在目标中返回,然后作为target_loaded_file@..
进行检索
5。工作流程的变更 I. 同一工作流程内的变更
首先让我们从对整个工作流程进行变更开始。例如,在加载数据集函数中进行更改:
一旦我们完成了更新并通过tar_visnetwork()
检查了工作流,我们可以在下面看到 Targets 自动检测依赖关系并相应地更新所有后续目标。在tar_make()
中,它将相应地重新运行所有过时的目标。
图片来源:作者
类似地,举例来说,如果我们在步骤 B 中对流程数据代码进行更改,并删除na.omit()
然后查看工作流程:
图片来源:作者
我们只能看到“流程数据培训”和“流程数据测试”已经过时,需要重新运行。因此,目标将跳过tar_make()
中之前的组件。
图片来源:作者
二。添加到工作流:EDA 现在让我们将一个简短的 EDA markdown 笔记本(步骤 C)添加到工作流中。下面是一个示例代码:
这可以在_Targets.R
中添加如下:
这反映在新的工艺流程中:
图片来源:作者
这给了我们训练数据集的 EDA 降价。通过简单地改变代码中加载的源目标数据并在_Targets.R
中创建一个新的目标,这也可以很容易地被测试数据集重用。
图片来源:作者
三。工作流的补充:建模降价和预测 与 EDA 降价类似,我们现在可以创建一个降价来创建一个模型(也可以放入一个单独的函数中)并显示我们的模型结果。下面给出了一个示例Rmd
(构建模型,生成模型诊断图像,对测试进行预测并保存结果),接着是新的流程:
我们将它添加到目标流中。
图片来源:作者
最终的降价如下所示:
图片来源:作者
在目标页面上有许多其他功能可以帮助排序、优先排序、摧毁目标,还有更多功能可以找到。
关于renv&Docker的说明—实现完全的再现性和生产化 为了确保您的工作最终可以投入生产,还会涉及到一些组件,最好掌握这些组件的工作知识,以便在开发或部署阶段掌握再现性。
- Renv 带来了项目本地的 R 依赖管理,使您的同事和评审人员能够重新创建与您的开发相同的环境,从而轻松地产生您的结果。考虑到各种软件包的众多版本和更新,r 用户可以理解这一点。我的同事刘写的一篇精彩的博客教程提供了如何使用 renv 的细节。
- Docker 是最后一步,与 renv 配合得非常好。以前,当我们想用 docker 封装 R 代码用于生产/部署时,我们需要创建一个单独的 R 代码,列出所有的
install.packages
命令。现在我们可以使用 renv 方便地呼叫 code⁴的一条线路。上面我同事写的文章也涵盖了 Docker。
将类似管道的工具包(如 Targets)与依赖和容器化工具包(如 renv 和 Docker-R)作为一种语言,在生产就绪部署领域进展迅速。
一些其他选项和参考:
Targets 上有一些其他的(虽然不是很多)资源,但是 Drake 上有更多,这是一个更老的包。在 Targets 上,作者的一些好的视频可以在这里访问,另外一个好看的是布鲁诺的这个视频。
除了目标之外,还有其他一些可以探索的包,比如改造包。虽然看起来与 Targets 非常相似,但我还没有使用这个包来进行评论。
另一个选项是 Ruigi ,它类似于 Python Luigi 中的对应项。Python 用户,跳到 R 可能更喜欢这个包。
最后,有关不同语言和工作方面的管道工具包的详细列表,请参考:
https://github.com/pditommaso/awesome-pipeline
结束语
虽然上面的例子相当简单,可能没有反映数据科学工作可能具有的复杂性、迭代和输出范围,但它反映了目标的效用,并且只显示了随着工作变得越来越复杂和代码变得越来越混乱,它会有多么有用。
参考
- https://books.ropensci.org/targets/
- https://towards data science . com/this-is-what-the-ultimate-r-data-analysis-workflow-looks-like-8e 7139 ee 708d
- 【https://rstudio.github.io/renv/articles/renv.html
- https://6 Chao ran . github . io/data-story/data-engineering/introduction-of-renv/
- https://SW 木工. github . io/R-新手-炎症/02-func-R/
数据科学零年:你的第一份工作
原文:https://towardsdatascience.com/data-science-year-zero-514653f5b212?source=collection_archive---------38-----------------------
在你的第一份数据科学工作中超越期望的可行指南。
由斯科特·格雷厄姆在 Unsplash 上做东西
一句话:一些即将毕业的大学生向我咨询如何获得数据科学&分析职位。在这篇文章中,我将总结过去一年我学到的经验教训,希望你能从中找到一些价值。
目录:
1。我开始
2 的时候缺什么。学习的技巧和工具
3。先学哪个技能
4。职场建议
我开始时所缺少的(你也是)
弄清楚“Prod”是什么意思,花了我很尴尬的时间,比我想承认的要长。当我终于弄明白的时候,那确实是一个灵光一现的时刻,因为几分钟之内,几年的问题就有了答案。
我从来都不太关心软件开发,我相信 CSV 和 Kaggle 竞赛都让我很不爽。当我开始的时候,我觉得我还没有准备好在一个“真实环境”中工作,在这个环境中,你不需要每次都下载一个 Parquet 并把它加载到 PySpark 中来完成一些事情。
软件工程师在进入公司的第一天就了解了 Prod 环境。然而,数据科学仍然在大多数年轻的组织中找到立足点,除非他们出售数据驱动的产品。工程师认为你在那里是为了商业智能(BI),而业务团队认为你已经在“技术方面”打下了基础。
我没有,也许你也没有!
在这里,我整理了我作为唯一的数据科学人员在 SmartServ 工作的第一年所学到的东西(因此也是错误), SmartServ 是一家 SaaS 的初创公司,面向美国和加拿大的非办公桌工作人员。其中一些可能不是你——刚从大学毕业——所期望的,但是因为这篇文章恰好是关于“脱颖而出”,所以我把我所知道的一切都包括进来了。在我开始之前,我什么都不知道,也许你应该知道。
排名不分先后:
由 Kumpan Electric 在 Unsplash 上拍摄
生产:掌握“生产环境”是一种范式转变。你总是想知道在网飞的事情必须如何运行,因为他们不能合理地依赖于每次电影推荐时加载和下载 CSV。但是 Kaggle 和 AnalyticsVidhya 只为最后的 10-20%做准备,也就是说,读取预处理数据&用它来拟合 ML 模型。这些也是一次性的过程——既不可重用也不可扩展。数据&管道工程是在现实世界中是如何完成的。
- 更大的公司雇佣专门的角色。然而,在一家初创公司,你需要端到端的项目。这(大致)包括:
- 感知数据
-获取数据(从数据湖或 OLTPs ) - 提取(反规范化、清理并准备使用)
-将其移动到 OLAP
-建立仓库
-创建 ML 模型
环境的简单介绍:
- 感知数据
https://medium.com/swlh/environments-in-software-development-cf84adbbf197
伊恩·泰勒在 Unsplash 上的照片
- 一旦你完成了《T2 》,我如何把它投入生产?’,你会遇到“为什么这个没有在生产中运行?它在我的机器上工作!!”。管理跨环境的依赖关系是一件令人头疼的事情,了解基本的Docker/Kubernetes实现会让你受益匪浅。Docker 容器类似于虚拟环境(就像 Python3 中的- virtualenv ),它们冻结了应用程序将要运行的环境的当前状态(包括所有依赖项)。然后将它部署到生产环境中,在升级和废弃所包含的环境变量时,它保持不变。
- 在更大的组织中,您可能会找到专门的 DevOps 人员来做这件事,但是全栈总是更好。码头工人可以做的比我提到的多得多,但我会把这些留给专家。
提示 : Dockers 还可以帮你为自己搭建一个便携的个人开发环境,你可以在旅途中使用。Docker 分步指南:
斯蒂芬·菲利普斯-Hostreviews.co.uk 在 Unsplash 上拍摄的照片
- 数据库:吸收功能性数据库概念。你应该至少知道一种关系语言 (MySQL/PostgreSQL)和一种非关系查询语言 (MongoDB/CassandraDB)。一旦你找到了一个,剩下的就很容易了。查询日志和优化绝对是加分项,然而,它们不太可能被认可或欣赏。有许多文章可以帮助您开始使用 DBMS。
照片由EJ·斯特拉特在 Unsplash 上拍摄
- ETL :我一直没有注意到 ETL ,直到它需要我的时候。除非你的产品利用有意的数据传输(IDT),否则你无法逃避这一点。ETL 是提取-转换-加载的首字母缩写,这是一个你必须重复执行的过程,可能一周要为一百个不同的任务执行几百次。ETL 应用程序允许您模板化整个过程(称为“管道”,使用代码或 GUI),甚至安排它在指定的时间间隔运行,无需干预。
- 我的工程主管向我推荐了 Pentaho DI Community Edition(早期的 Kettle),这是一个非常好的应用程序。备选方案包括 Matillion(对云数据源的广泛支持)、Talend 和 Informatica。精明的数据科学家更喜欢使用 Bash 进行底层控制,所以你可以选择。Pentaho DI 指南:
https://medium.com/ai-in-plain-english/getting-started-with-pentaho-data-integration-kettle-and-its-components-ef1e71101323 https://medium.com/whispering-data/the-end-of-etl-as-we-know-it-92166c19084c
提示**:你最终会想要升级到一个成熟的工作流管理系统(比如 Luigi,Apache Airflow)。此刻我正试图承受气流,这是一个痛苦的世界。但是看起来确实值得,一站式解决。**
克里斯·里德在 Unsplash 上拍摄的照片
- 脚本:报道不是你永远不会放弃的东西。虽然 SQL 本身就很强大,但了解一门脚本语言经常会派上用场。脚本语言允许您在运行时执行指定的任务,并按顺序解释它。
- Python 是事实上的,这就是我用于报告(和工作流管理)的东西。我从 R(我个人最喜欢的)转移到 Python ,因为:
-人们不熟悉 R。因此,他们抵制它。- R 有并行化限制(扩展性差),并且部署不友好。这是高度抽象的。因此,调试很快变得具有挑战性。每个人都能读懂 Python3 代码。可重用性提高了,把它传递给新人变得更容易了。
利亚姆·查默尔在 Unsplash 上的照片
- ML/DL/Visualization: 这是你的堡垒。你会不断积累其他技能,但在内心深处,你永远是一个 ML/DL 奇才或可视化爱好者。然而,在最初几年,项目可能并不总是如你所愿。你可能无法建立统计模型或花哨的推荐引擎。你需要通过从事个人项目或参与开源项目来满足自己的需求。当你找到一个你的技能对产品/公司有用的窗口时,赶紧进去。请参考下面的'工作场所知识'。你的准备将确保你在需要的时候脱颖而出。
- 你必须已经熟悉 ML/DL 的 TensorFlow 、 MXNet 或 Torch 以及可视化的 ggPlot2 、 Bokeh 、plottly。NVIDIA 有一个很棒的开源项目,你可以参与其中:
https://github.com/NVlabs/few-shot-vid2vid
礼貌:教程道场
- 云计算:*对于任何数据分析师/科学家来说,这是你的武器库中的顶级技能。大多数开发人员和 DevOps 人员不习惯数据驱动的应用程序(记住,你可能是第一个或第五个数据科学雇员;团队需要时间来适应你的需求)这就是为什么你想尽快开始学习 CC 的诀窍。
- 幸运的是,有太多的托管*台 (AWS、GCP、Azure、DataBricks)让你构建、测试和部署你的 ML 应用程序变得无比容易。此外,托管 ML 服务 s(例如 SageMaker)可以帮你减少你可能不想投入的辅助工作。
以下是我关于 AWS 数据科学云计算解决方案的个人笔记:
由卢克·切瑟在 Unsplash 上拍摄的照片
- 版本控制(Git):当你在大型团队中工作时,不可避免地会有多人同时参与项目。这将需要协作和某种历史以及代码库的变更跟踪。Git 帮助多人在同一个项目上协作,甚至跟踪对代码库所做的所有更改。它可以做得更多,但这是一个过程,随着经验的积累,你会变得更好。我还在纠结 Git。
TL;大卫:你应该先学什么
在我看来:
必备技能: DBMS &脚本> > Git
技能脱颖而出:【云计算、ETL】>>Docker>>your forté
工作场所学习:
- 明智地使用统计数据:有权威的人只相信他们理解的事情(这就是为什么他们是做决定的人)。过分使用数字或复合指标,你可能会失去它们,如果没有数字,你将无法支持自己。用基本原理推理*衡数字是一门手艺,我还没有掌握,也许你可以早点开始。
- 你无法逃避繁重的工作:你有无数的理由不能,接受它并努力完成它。除非你是专门担任 ML 工程师的角色(这对毕业生来说毫无意义),否则你需要做所有的事情。你将负责所有面向数据的任务。有时,忘记“数据科学”中的科学部分有助于减轻痛苦。
- 要坚定不移:要把事情做好,你需要有人站在你这边,最好是支持你和你的想法的资深人士。如果你的团队里没有冠军,去外面找一个冠军。由于上述原因,在最初的几个月里,我很难完成任何事情。其他人会推行他们的想法,而我站在那里等待事情向我走来(他们从来没有)。有点斗志昂扬,而不仅仅是有点固执。把你的事做完!
结论
数据科学角色不是纯粹的技术角色。在一天结束时,你在那里迎合产品及其需求。敢于走出数据科学社区创造的泡沫,我们可能会在某个时候成为优秀的领导者,这完全是因为数据科学在产品-业务组合中的独特地位。
本文到此为止。我会试着在其他帖子中分别讨论这些问题。如果你有任何反馈或者任何你想让我在接下来的帖子中提到的东西,请告诉我。我在 SmartServ 工作,我们总是在那里寻找新的人才。寻找任何空缺职位 或者顺便打个招呼!
谷歌数据科学家面试流程
原文:https://towardsdatascience.com/data-scientist-interview-process-at-google-ef70a749cb75?source=collection_archive---------5-----------------------
了解谷歌数据科学家职位的文化、期望和面试流程
照片由米切尔罗在 Unsplash
每个数据科学家都梦想在大型科技公司工作,谷歌是其中的佼佼者。谷歌已经拥有广泛的服务和庞大的客户群,所有这些每天都会产生万亿字节的数据。因此,本质上他们需要许多数据科学家来处理和解释如此庞大的数据。
数据科学家岗位说明书
照片由斯科特·格雷厄姆在 Unsplash 上拍摄
不过在申请之前,你一定要看一下工作描述和期望的工作,这主要是为了让你了解你是否喜欢在那里工作。谷歌数据科学的角色是主要是一个专注于指标和实验的分析角色。这与谷歌也存在的机器学习和产品分析师角色截然不同,后者分别更侧重于工程和产品方面。在团队中,角色会有一些变化,但是,一般来说,更多的是在分析方面。
所需技能
由 Branko Stancevic 在 Unsplash 上拍摄的照片
在你开始认真准备之前,先了解他们在寻找什么,以及你是否符合这些大的类别。他们通常更喜欢在分析或相关领域有两到三年工业经验的候选人。他们确实更喜欢新毕业的博士来担任一些高级职位。一些重要的资格(摘自谷歌职业网站)如下:
- 数量学科的硕士学位或同等的实践经验。
- 2 年数据分析或相关领域的经验。
- 具有统计软件(如 R、Python、Julia、MATLAB、pandas)和数据库语言(如 SQL)的经验。
- 经验阐明业务问题,并使用数学技术,以达到利用现有数据的答案。将分析结果转化为商业建议的经验。
- 能够根据数据分析问题选择正确的统计工具。
申请工作
为了申请这份工作,最好是从你认识的在这家公司工作的人那里获得推荐。他们可能是朋友、亲戚、朋友的朋友等。推荐使你的申请更容易被公司认可。你必须在谷歌的求职网页上申请,它会要求你提供简历、学术成绩单和数据科学家职位的求职信。
我发现一些对简历有用的建议:
- 在简历中加入你的 Github、Linkedin、Kaggle、Medium(如果你主动写的话)个人资料链接
- 提及你的出版物,因为它们对这个角色非常重要
- 保持你的观点简明扼要
- 关注你的成就,而不是在简历上写满你曾经做过的一切。
写求职信时,请记住,它应该反映出你过去的经历如何激励你担任这一职位,以及谷歌是如何帮助你在未来实现这些目标的。如果你包括一点关于你能回馈谷歌的东西,以及作为一名潜在员工你能给公司带来什么好处,那就加分了。因为求职信是个人的,所以最好写你自己的,不要读那些会影响你观点的样本。一定要让你的朋友、亲戚,可能还有给你推荐的人或者有 2-4 年经验的人来核实。
数据科学面试流程
克里斯蒂娜@ wocintechchat.com 在 Unsplash 上的照片
在你在求职页面上提交申请后,如果你通过了他们的初步筛选,那么谷歌的招聘人员就会联系你。他们通常会告诉你谷歌数据科学的工作,并试图了解你如何融入谷歌文化。之后,会进行一次技术筛选,由数据科学家或招聘经理问你几个问题。如果你熬过了这一关,他们会打电话给你进行现场面试(但通常是远程面试)。让我们详细讨论每个阶段。
技术筛选
这个过程包括一次面试,数据科学家或招聘经理会问你一些关于统计、编码、概率和一些量化能力的问题。但它更倾向于讨论你过去的工作经验,项目,以及你解决项目的方法。他们试图分析你解决问题的能力,判断你是否有足够的经验和知识来胜任这个职位
现场面试
它通常由 5 个一对一的面试组成,用于评估你在编码、解决问题、统计学、机器学习、建模、实验、ML 设计问题、行为问题等方面的技能。所有的采访都是一个小时左右。
网上有很多文章分享了面试中的一些问题。通读这些内容,对面试中提出的问题有所了解是非常可取的。
希望这篇文章能帮助你更好地了解谷歌数据科学家的期望,以及他们的面试过程。要了解更多关于不同数据科学概念和其他公司面试流程的信息,请关注我们的 medium 。
成为 介质会员 解锁并阅读介质上的许多其他故事。
数据科学家还是数据分析师?
原文:https://towardsdatascience.com/data-scientist-or-data-analyst-5121e8f41748?source=collection_archive---------3-----------------------
差异以及如何选择最适合自己的。
Benjamin Balázs 在 Unsplash 上的照片
在从事任何需要处理数据的工作之前,你需要回答的一个令人困惑的问题是,我应该选择哪条职业道路?哪一个最符合我的个性和愿望?
回答这些问题是困难的,因为有些术语不容易与其他术语区分开来,所以如果你不知道它们的区别,你怎么能做出决定呢?在我看来,最难区分的角色是数据科学家和数据分析师。
在很长一段时间里,当我开始我的数据科学之旅时,我认为它们是同一件事,但有不同的说法。数据科学是一个模糊、宽泛的术语,这一事实对我的困惑没有帮助。在大量的阅读和研究之后,我终于理解了数据科学和数据分析之间的微妙区别。
事实是,数据科学和数据分析是相互关联的术语;这两个术语有许多重叠之处。然而,每一条道路都需要稍微不同的学习路径,并且将提供不同的结果。
为了帮助您避免任何进一步的混淆,我决定撰写本文,澄清这两个术语在定义、所需技能和角色职责方面的区别。事不宜迟,让我们开始吧…
数据科学
数据科学不仅仅是一个角色,事实上,它是一个涵盖不同术语和子分支的总括术语,如自然语言处理、计算机视觉、机器学习、深度学习等。
然而,如果我们想把一个数据科学家所做的事情用语言表达出来,那将是一件接*于;数据科学家是一个有着好奇的头脑的人,他喜欢问问题以解决一些问题。他们依靠数据来设计算法、开发代码和构建模型,以从这些原始数据中获得可操作的见解。
任何数据科学项目的主要目标都是探索数据,发现模式和趋势,并使用这些信息来预测未来的模式和趋势,使用不同的工具和技术,其核心往往是机器学习算法。
</6-web-scraping-tools-that-make-collecting-data-a-breeze-457c44e4411d>
所需技能
由于数据科学是一个跨学科的领域,为了成为一名成功的数据科学家,您需要掌握几项技术和软技能。但是掌握需要很长的时间;如果你对构建任何项目所需的基础知识很熟悉,你就可以开始你的职业生涯。这些基本技能是:
- 数学和统计知识。
- 编程和软件开发。
- 数据收集、清理和探索。
- 数据可视化和讲故事。
- 熟悉机器学习的核心算法。
- 对商业模式及其发展的基本理解。
工作职责
作为数据科学家或其任何子领域的专家,您将被期望使用收集的数据来分析、清理、探索、建模和测试,从而解决复杂的问题。你的工作角色将主要是使用不同的算法或设计新的算法来高效快速地解决手头的问题。
从您的模型中收集的见解将用于增强或构建新的业务模型。所以,你的工作对于一些公司的成功和他们可能获得的利润是至关重要的。
数据分析
与数据科学类似,术语数据分析也涵盖不同的子领域,如数据库分析师、业务分析、销售分析、定价分析师、市场研究分析师等。
作为一名数据分析师,你的主要目标是使用提供给你的数据来回答不同的业务问题,比如,什么产品卖得最好,为什么?如果收入下降,为什么会发生,公司如何克服,等等。
为了找到这些问题的答案,数据分析师需要能够对数据集进行统计分析,创建工具来收集和组织数据,并在未来从中提取类似的信息。简而言之,数据分析师的工作是根据数据的当前状态回答答案未知的问题,并推动立即采取行动。
</5-data-science-programming-languages-not-including-python-or-r-3ad111134771>
所需技能
为了成为一名成功的数据分析师,你需要熟悉不同类型的知识。要成为一名数据分析师,你不需要任何类型的官方学位,但是,如果你选择从事数据分析,拥有以下技能背景是必不可少的:
- 数学和统计学的基础知识。
- 数据挖掘和数据仓库技能。
- 熟悉数据建模技术。
- R,SAS 和 SQL 的基本编程知识。
- 数据库设计和管理。
- 统计分析的基础。
工作职责
如果你决定从事数据分析的职业生涯,你的工作职责将围绕设计和管理高效的数据库,使用现有的统计工具来分析和解释一些数据集,并根据你的发现回答一些与业务相关的问题。
另一个数据分析师的重要角色职责是,你能够以最简单的方式高效地报告你的发现,传递你的信息,因此掌握一些科学交流技巧可以大有帮助。
外卖食品
进入数据科学是一项具有挑战性的任务,但当您不知道该领域中不同术语的含义时,这将变得更加具有挑战性,不仅是在该领域内,而且是该领域本身的名称。也许最令人困惑的术语是数据科学和数据分析。
</5-online-data-science-courses-you-can-start-now-748e4a2b5403>
这两个术语是如此的相互关联,以至于他们混淆了任何新手和这个领域的人。由于这两个术语之间的相关性,很难对它们进行简明、清晰的区分。
但是,尽管有相似之处,这两个术语是完全不同的;他们有不同的工作职责,也有不同的获得工作所需的技能。在这篇文章中,我们讨论了这些差异,希望能让事情变得更清楚,这样当你决定职业道路时,你就能确切地知道你需要什么才能成功。
数据科学家还是数据产品经理?为什么你两者都需要
原文:https://towardsdatascience.com/data-scientist-or-data-product-manager-whats-the-difference-e5c703485ce6?source=collection_archive---------20-----------------------
确保您的数据项目真正为正确的团队带来价值
玛丽·阿尔夫海姆授权通过 Shutterstock 获取图片
在过去的几个月里,我发现自己多次支持数据产品经理的角色,即使是作为一个跨越数据和分析领域如此多角色的 100 多人团队的一部分。这个角色有什么不同?当我们迫切需要更多的数据工程师时,我们为什么要雇佣这个职位呢?这算是全职工作吗?现在,将这些问题与我们看到的所有关于“大数据”或甚至更昂贵的“机器学习”项目在推动其组织价值方面失败的文章联系起来。我们应该问的问题是,我们如何创建和推出客户需要的数据产品?这就是数据产品经理的用武之地,释放数据科学家的力量。
让我们从这些角色的不同和完全互补开始。数据科学家可以有很多种口味,这个术语可以涵盖从数字分析师、统计学家到机器学习工程师的所有人。我喜欢把这个角色的人看作是三种关键才能的交汇点;商业头脑,统计学和计量经济学,以及软件工程。这些人了解他们被要求解决的业务问题,并且具有技术知识,知道如何提取、转换数据并将数据加载到允许他们回答该问题的环境中。他们熟悉不同种类的统计测试及其解释,能够建立预测结果的模型或对客户的购买可能性进行评分。一些人能够提前预测结果,而另一些人能够建立模型,表明营销渠道的最佳组合。更高级的数据科学家也对工程有很好的理解。例如,他们能够将他们的模型放入可以与应用程序或网站连接的实际管道中,为用户提供个性化体验,或者放入区分营销信息的其他*台中。
如果这听起来像很多工作,那是因为它是。一旦很好地定义了业务问题,收集、清理或转换了数据,然后对这些模型或输出进行了测试和调整,通常就到了转移到下一个问题或重新访问旧问题的时候了。这没有错。这些人是专家,你想让他们担心改变曲线下面积的度量、奖励函数或不太正确的方差膨胀因子。这是他们擅长的地方。但是,这意味着没有足够的时间和精力在项目开始时实际定义这些业务优先级,或者确保在项目结束时采取行动。输入您的数据产品经理。
像其他产品经理一样,数据产品负责人应该代表客户与利益相关者一起为业务定义最佳路线图。他们总是首先想到顾客!我们应该做的第一个项目是什么,为什么?我们应该如何对它们进行优先排序?我们希望达到的范围是什么?这是否可行和可取,并有实际的预期投资回报率?虽然这些听起来像是基本问题,但项目生命周期的这个关键部分在分析中经常被匆忙处理或忽略。我们当然需要做机器学习!个性化推荐!然而,在许多组织中,没有人停下来说,收集关键数据事件或购买支持这种规模所需的数据*台实际上需要放在首位。相反,你会遇到另一个受阻的、昂贵的、引人注目的失败。数据产品经理应该已经预料到了这一点,并引导组织走向奠定正确基础的路线图。
一旦设定了路线图,并定义了需求,数据科学家就可以开始工作了。一旦模型或产品完成,无论如何,对于第一次迭代,数据产品所有者然后处理他们工作的第二部分;确保工作得到有价值的使用。这可能意味着教育和指导合作伙伴理解倾向模型如何帮助他们找到最佳线索,并帮助他们围绕它设计一个活动。这可能意味着使用自助服务分析工具,这样他们也可以在自己的时间里了解客户的行为。这也可能意味着促进 A/B 测试*台的测试和学习议程的开发。最重要的是,它需要衡量数据科学的影响或预测影响。这应该加以说明,并定期与合作伙伴进行讨论。
总之,数据产品经理和数据科学家可以分头行动,共同应对业务挑战。作为合作伙伴,与他们的利益相关者一起,他们可以定义和执行最有可能产生最大价值的路线图。每个人都是周期的一部分,需要能够区分他们如何花费时间来实现这些目标。
保险行业的数据科学家前景
原文:https://towardsdatascience.com/data-scientist-prospect-in-the-insurance-industry-1af297d2abc8?source=collection_archive---------46-----------------------
数据科学家如何提升他们在保险行业的职业生涯
朱丽安·利贝曼在 Unsplash 上的照片
当我问“你想在哪里工作?”我几乎找不到想从事保险行业的人,更别说学数据科学了。我甚至可以问我的任何一个读者一个问题。请阅读下面的问题。
“当你学习数据科学时,你希望在哪个行业担任数据科学家?”
我敢肯定,保险不会成为第一选择,甚至不会成为第二选择,这并不奇怪。
我是一名数据科学家,在保险行业工作,在我年轻的时候,我从未想过会在保险行业工作。我总是梦想成为一名生物学家,或者在学术界度过我的时间,但是事情并不像我想象的那样。
但是,在保险行业工作让我比以前的经历更有成就感。事实证明,新的经历对我来说是一条更好的途径。
本文希望分享 Data Scientist 的保险行业前景,以及它在 2021 年可能会出现的情况。
一般保险业
我想每个人都已经知道保险是什么了。保险不同于另一种产品,在那种情况下,你一付钱就能得到产品;相反,如果发生了什么事,你只能得到一些承诺(通常是金钱上的)。这是保险业产品的主要前提,如果某个事件发生,给你保障。
有许多保险产品:人寿保险、健康保险、财产保险、宠物保险、车辆保险等。只要说出它的名字,你就可能找到它。
虽然有很多种保险,但并不是每个人都需要所有的保险。这取决于他们居住的国家、经济状况、婚姻状况等。毕竟每个人的胃口都不一样。虽然,有一点可以肯定;每个人在人生的某个阶段都需要保险。
终身保险的必要性(图片由作者创建)
上图举例说明了我们在人生的每个阶段都需要什么样的保险。从收入保障到长期护理保险,总有一天我们会需要保险。
保险行业对于数据专业
保险数据科学家
我不是来卖保险的,而是作为一名数据专家来解释保险前景。乍一看,保险行业可能没有医疗保健或技术领域那样的炒作,但我想向你展示另一面。
从关于保险的一般解释中,我已经解释了保险涵盖了人生的每一个阶段。在每个阶段,必要性也是不同的。
在过去,保险公司会根据上级的决定或公司的感觉来调整每个阶段的产品。但是,大数据时代的到来改变了一切。保险不仅仅是一个基于本能的古老行业;数据有助于决策。
让我们来看看这个过程是如何随着时间的推移而变化的。最简单的例子是保险核保流程(保险公司评估潜在客户承担金融风险并收取费用)。传统上,核保流程需要基于某些数据的客户评估;例如性别、年龄、职业等。随着时间的推移,我们意识到评估客户仅限于人口统计,但它可以是任何东西。我们可以从以下方面评估它们:
- 健康可穿戴设备数据
- 社交媒体数据
- 选民名册数据
- 信用报告数据
- 网站分析数据
- 政府统计数据
- 卫星数据
还有很多。关键是我们看待保险问题的方式不会局限于一件事,而是依赖于很多方面。保险数据科学家需要了解很多方面;金融、技术、政府、医疗保健等。我并不是说我们需要成为所有这些领域的专家,但伟大的数据科学家肯定会精通所有这些领域。
为什么选择保险行业?
这看起来有点吓人,但回报也很高。数据驱动的决策和人工智能实施在保险行业仍被认为是一个新事物,但它正在慢慢走向数据文化。
对于许多数据爱好者来说,保险业可能是你进入数据科学世界的一个切入点。我认为这个行业的人才稀缺程度已经够高了(如果没有招聘冻结,我甚至会尝试寻找新的数据科学家)。
此外,随着最*进入保险业,只要对公司有利,你可以在数据项目上激发你的创造力。当然,如果管理层不了解数据的好处,工作可能会更加困难;不过话说回来,我觉得每个公司都会这样。
如果您不确定保险行业内有哪些数据项目,我可以给你举几个例子:
- 风险评估
- 欺诈检测
- 索赔自动化
- 客户 360
用例不限于我上面提到的。你可以试着想想你能做的更疯狂的项目。极限毕竟是天空。
现在人们趋向于购买保险,尤其是新冠肺炎疫情的健康和人寿保险。相信我,当我说在疫情的情况下,保险销售数字呈指数增长。出于保密原因,我可能不会展示这些数据,但我相信人们已经意识到健康是多么珍贵。
我试图用数据来评估形势,在更长的时间里,保险业会更加繁荣。随着需求的增加,需要更多的人才来评估形势。如果你在这个行业已经有经验,你可以很容易地在数据领域前进。
结论
当你成为一名数据科学家时,保险行业可能不是你最初认为的行业。尽管如此,对于一些人来说,这可能是一个选择,因为这是一个相对较新的行业,引入了数据文化。为什么保险行业:
- 可能成为有抱负的数据科学家的切入点
- 展示你的创造力因为这是一个新的数据领域
- 疫情的保险业正呈指数级增长
- 如果你想跳槽,保险行业数据领域的经验在另一个行业也是可行的。
如果您喜欢我的内容,并希望获得更多关于数据或数据科学家日常生活的深入知识,请考虑在此订阅我的简讯。
如果您没有订阅为中等会员,请考虑通过我的推荐订阅。
数据科学家工具包 SQL 简介
原文:https://towardsdatascience.com/data-scientist-toolkit-introduction-to-sql-f45521990493?source=collection_archive---------12-----------------------
在数据科学领域,SQL 是一个强大的工具。在创建奇特的模型之前,必须对数据进行辩论。本文给出了几个 SQL 示例的分解。
照片由 XPS 在 Unsplash 上拍摄
数据科学并不全是花哨的统计模型和魔法(我们预测未来的尝试失败了😂).我任务的一个重要部分是数据和预处理。
B 在任何 python 编码和花哨的模型之前,数据科学家必须从数据开始。在现实世界的应用程序中,数据不是经过整理的 CSV 文件。相反,它以某种原始格式存在于数据库中。结构化查询语言(SQL)就派上了用场。SQL 是数据科学工具包的重要组成部分。本文将向读者提供 SQL 的高级概述。
什么是 SQL?
SQL 是一种查询语言,用于管理存储在关系数据库中的数据。这对于结构化数据很有用——行/列和独立表之间的关系。SQL 有许多不同的风格(MySQL、SQL Server、Oracle、Spark SQL 等。)具有不同的语法。在很大程度上,基础是相同的。
总*面图
下面我们将介绍构成 SQL 数据库的一些基本组件:
1\. *Schema*: It is a container that stores collections of tables, procedures and metadata.2\. *Table:* Structure data in a tabular form (such as an excel table). a. Primary Key: A column that uniquely identifies each row.
b. Foreign Key: A column that maps a table to another through the relationship between primary key – foreign key.
来源:史蒂文·洛艾萨
加入
下面是一些广泛使用的连接的可视化表示(蓝色阴影区域是连接后返回的集合)。有关连接的更多信息,请参见 GitHub 。
注意 : 根据软件的不同,连接类型的命名规则可能会有所不同。
来源:史蒂文·洛艾萨
主题
以下示例将利用源自 leetcode 的 SQL 相关问题。
我遇到的任何问题我总是想:
我怎样才能把这个问题分解成更小的步骤?也不要忘记沿途测试。
例一。删除重复邮件***self-join***
***delete***
任务:删除重复的邮件,保留最小Id
的邮件。预期的结果是返回第 1 行和第 2 行。
资料来源:史蒂文·洛艾萨
细分:
这些任务可以分为两部分。
- 找到重复的
- 从表中删除它
我们可以在电子邮件匹配的地方将表格连接到自身。
*SELECT tbl1.*
FROM
Person as tbl1
JOIN Person as tbl2
ON
tbl1.Email = tbl2.Email*
我们知道重复的电子邮件会有不同的Id
。根据说明,我们希望保留最小Id
的电子邮件。因此,我们要选择最大的Id
。下面的查询将显示具有相同的Email
和更高的Id.
的行
*SELECT tbl1.*
FROM
Person as tbl1
JOIN Person as tbl2
ON
tbl1.Email = tbl2.Email
AND tbl1.Id > tbl2.Id*
因为我们的任务是删除行,而不是选择行。我们可以用一个DELETE
语句代替SELECT
语句。
***# FINAL SOLUTION**
DELETE tbl1.*
FROM
Person as tbl1
JOIN Person as tbl2
ON
tbl1.Email = tbl2.Email
AND tbl1.Id > tbl2.ID*
___________________________________________________________________
例二。第 n 大工资 distinct
limit
offset
ifnull()
任务:从提供的表中查询第二大工资
资料来源:史蒂文·洛艾萨
细目:
- 返回第二大值
- 错误处理:如果没有第二高的薪水,假设有一行,第一个代码窗口中的查询将失败。
处理错误是数据处理的一部分。该误差是可预测和可管理的。因此,当它发生时,我们应该明确地处理这些情况。
我们利用DISTINCT
返回唯一的薪水值。如果我们有[100,100,200]的薪水,有[100,200]就足以得出结论,200 是第二大的。DISTINCT
会给我们足够的信息,OFFSET
会跳过指定的行数,LIMIT
会返回指定的行数。
*SELECT
DISTINCT Salary
FROM
Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1;*
用函数 IFNULL()包装上面的查询。如果第一个元素(查询)没有返回结果,函数将返回第二个元素,在本例中为 NULL。
***# FINAL SOLUTION** SELECT IFNULL(
(SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1),
NULL)
as SecondHighestSalary;*
___________________________________________________________________
例 3。重新格式化部门表 max
case()
groupby
任务:格式化表格,使每个月都有一个部门id
列和一个总和revenue
列。
资料来源:史蒂文·洛艾萨
细分:
- 根据
month
列的条件提取revenue
- 求和
revenue
- 按
id
对结果分组
CASE
类似于 IF-ELSE 方法。当满足第一个条件时,它将返回值。如果某个月份出现在month
列中,我们希望返回收入。
*# Pseudo Example
CASE
WHEN "***column meets some condition***" THEN "**return this**"
ELSE "***when condition is not met, return something else***"
END # Actual Syntax Example
CASE
WHEN month = ‘Jan’ THEN revenue
ELSE null
END*
CASE
语句应该嵌套在 sum 函数中,以便合计收入。
*SUM(
CASE
WHEN month = ‘Jan’ THEN revenue
ELSE null
END
) AS Jan_Revenue*
现在将其形式化为 select 语句。此外,将SUM
按id
列分组,确保对每个id
进行求和。否则,它将错误地合计一月份的所有收入。
*SELECT
id,
SUM(
CASE
WHEN month = ‘Jan’ THEN revenue
ELSE null
END
) AS Jan_Revenue
FROM
Department
GROUP BY id;*
最后,写下所有 12 个月的案例陈述。
***# FINAL SOLUTION**
SELECT
id,
SUM(CASE WHEN month = ‘Jan’ THEN revenue ELSE null END) AS Jan_Revenue,
SUM(CASE WHEN month = ‘Feb’ THEN revenue ELSE null END) AS Feb_Revenue,
SUM(CASE WHEN month = ‘Mar’ THEN revenue ELSE null END) AS Mar_Revenue,
SUM(CASE WHEN month = ‘Apr’ THEN revenue ELSE null END) AS Apr_Revenue,
SUM(CASE WHEN month = ‘May’ THEN revenue ELSE null END) AS May_Revenue,
SUM(CASE WHEN month = ‘Jun’ THEN revenue ELSE null END) AS Jun_Revenue,
SUM(CASE WHEN month = ‘Jul’ THEN revenue ELSE null END) AS Jul_Revenue,
SUM(CASE WHEN month = ‘Aug’ THEN revenue ELSE null END) AS Aug_Revenue,
SUM(CASE WHEN month = ‘Sep’ THEN revenue ELSE null END) AS Sep_Revenue,
SUM(CASE WHEN month = ‘Oct’ THEN revenue ELSE null END) AS Oct_Revenue,
SUM(CASE WHEN month = ‘Nov’ THEN revenue ELSE null END) AS Nov_Revenue,
SUM(CASE WHEN month = ‘Dec’ THEN revenue ELSE null END) AS Dec_Revenue
FROM
Department
GROUP BY id;*
结论
这篇文章是一个起点,但对于任何新事物,实践是必不可少的。许多交互式环境允许你自己尝试问题。我鼓励你看看他们(Leetcode,Datacamp)。
我将继续撰写与 SQL 相关的文章,并根据我的经验添加一些真实世界的内容。我希望涵盖的一些主题是事务数据库和通过 spark 的并行计算。
一如既往感谢您的阅读。你可以通过LinkedIn联系到我!
数据科学家与业务分析师的薪酬
原文:https://towardsdatascience.com/data-scientist-vs-business-analyst-salary-454b6ed901ad?source=collection_archive---------4-----------------------
这两种流行的技术/数据角色有什么区别?
瑞安·昆塔尔在 Unsplash 上拍摄的照片。
目录
- 介绍
- 数据科学家
- 商业分析员
- 摘要
- 参考
介绍
注意:
本文是第四篇,是关于热门数据/技术角色间报告薪酬系列的一部分。其他三个我会在文末链接。
正如我在本系列的前几篇文章中所说的,这篇文章的目的不是比较一个人是否应该得到更多的钱,而是让这两个领域的专业人士根据他们目前的工资进行评估。无论多么老生常谈,在要求更高的薪水时,记住这两件事仍然很重要:提出要求没有坏处,有时,你不会得到你没有要求的。请记住,这些是更一般的统计数据,因为你可以根据自己的意愿来具体确定你的薪水应该是多少。相反,这些值是供您使用的方向指南。
数据科学家和业务分析师的相似之处在于,他们可能是迄今为止被比较过的最广泛的角色。具体来说,这两个角色都有广泛的预期或要求的技能和工作职责。这意味着更重要的是对每一份工作描述都要有所保留。例如,这两个职位可能都需要使用 SQL,而有些公司对这两个职位都不需要这种技能。话虽如此,让我们看看其他具体的例子,从真实的报告数据与各种技能和其他因素,有助于整体工资。
数据科学家
由奥斯汀·迪斯特尔在Unsplash【2】上拍摄的照片。
由于这是我第四次写关于数据科学家薪水的文章,我将快速总结这一角色的预期*均值,并进入一些新的示例,包括不同的因素组合,以查看它们对薪水的影响。
作为一名数据科学家,你可能会看到一些预期的头衔,这些头衔的薪酬也可能会有重大变化:
入门级数据科学家→数据科学家→高级数据科学家
首席数据科学家—数据科学经理—数据科学总监
除了这些头衔,还有一些资历级别,如 I、II 和 III。
下面,我将按职位显示薪资范围,以及他们各自所需或预期的年数。
请记住,这些角色是基于美国的*均水*(基于工资等级 [3】):
- *均总体数据科学家→
$96,455
- 普通入门级数据科学家→
$85,312
(1 年) - 普通早期职业数据科学家→
$95,121
(1-4 年) - 中等职业生涯的数据科学家→
$109,696
(5-9 年) - 普通经验丰富的数据科学家→
$136,051
(10-19 岁)
我相信这些*均值总体上处于较低水*,但由于它们确实是*均值,它们可能更有意义,因为不同的城市会有明显不同的*均值(如预期的),不考虑技能和其他因素。
也就是说,让我们看看下面这个系列中我们还没有看到的具体城市的*均水*:
- 俄亥俄州哥伦布市→
$84,233
- 山景→
$133,957
- 田纳西州纳什维尔→
$93,795
- 俄克拉荷马州俄克拉荷马城→
$69,570
- 密歇根州沃伦市→
$90,824
如你所见,同样的职称和级别,范围还是挺大的。低端在 6 万美元左右,高端在 13 万美元左右(仍然是*均值——每个城市的*均值都有低端和高端)。
现在让我们来看看拥有特定技能的城市的*均值:
- 俄亥俄州哥伦布市+ R →
$89,437
- 山景+ SQL →
$126,000
- 田纳西州纳什维尔+ Python →
$91,686
- 俄克拉荷马州俄克拉荷马城+数据分析→
$50,000
- 密歇根州沃伦+阿帕奇火花→
$97,440
当添加特定技能时,你会看到一些工资实际上下降了。我相信要得到最准确的报告,你需要包括你所有的技能,而不仅仅是一项。但是,仍然有少数例子表明,仅仅通过增加一项技能,工资确实增加了。
同样,这些工资数据是从 PayScale 收集的,如果你想要一个更具体的估计,那么你可以使用工资调查【4】。
商业分析员
Adeolu Eletu 在Unsplash【5】上拍摄的照片。
现在,让我们深入到业务分析师的工资细节。一些公司利用这两种角色,而一些较小的公司可能只有其中一种角色,因此可以看到一些技能重叠,如 SQL、Tableau、Excel 等。
对于这些*均值,我们将关注“未指定类型”的业务分析师。这个标签已经向你表明,这个范围可能是所有技术/数据角色中最大的。
我将使用薪级表 [6]来支付这些薪水:
- *均整体业务分析师→
$61,955
- 普通入门级业务分析师→
$56,915
(1 年) - 普通早期职业商业分析师→
$60,692
(1-4 年) - 中等职业生涯商业分析师→
$66,750
(5-9 年) - 普通有经验的商业分析师→
$70,632
(10-19 岁)
这些工资是低端的,但这可能是意料之中的,因为这些是在“*未指明类型”*的职位类别中。话虽如此,让我们看看两个不同的城市范围,以及不同的,但更多的技术技能范围的角色。
- 纽约,纽约→
$68,954
- 马萨诸塞州波士顿→
$66,049
- 德克萨斯州达拉斯→
$63,204
- 加州旧金山→
$79,077
所有这些城市都高于*均水*,但让我们更好地了解以下更具技术技能的角色:
不幸的是,可供查看的技术技能最多的是 SQL,所以我认为,如果有一个角色拥有像 Python 这样的另一种技术技能,报酬可能会高得多。
- 纽约,纽约+ SQL →
$70,386
- 马萨诸塞州波士顿+ SQL →
$67,296
- 德克萨斯州达拉斯+ SQL →
$55,971
- 加州旧金山+ SQL →
$80,223
就像数据科学家的薪水随着技能的不同而增减一样,SQL 业务分析师也是如此。这一观点表明,研究各种技能,更新你的具体工作经验,有望增加你的期望工资。
再次重申,这些职位是一种不具体的业务分析师角色类型,所以我想添加一个示例来说明当您是一名 IT 类型角色的业务分析师时会发生什么:
- 纽约,纽约商业分析师,IT →
$79,461
正如你所看到的,当角色被指定为 IT 而不是未指定时,这个薪水增加了一万多美元。
摘要
总的来说,这些职位的薪水可能会因各种因素而有很大变化,有时这取决于你做自己的研究,看看你的价值是什么,以及你独立于一份公司报告的想法。其他需要考虑的因素包括面试本身、简历本身、谈判技巧、奖金、股份、教育和证书。
总而言之,以下是数据科学家与业务分析师薪酬的一些关键对比:
* Average US data scientist salary → $96,455* Average US business analyst (unspecific type) salary → $61,955* These roles are both very broad and the salaries depend on a variety of factors* Several factors contribute to salary, the most important most likely being seniority, city, and skills
我希望你觉得我的文章既有趣又有用。如果你同意或不同意这些工资比较,请在下面随意评论。为什么或为什么不?关于薪水,你认为还有哪些重要的因素需要指出?这些当然可以进一步澄清,但我希望我能够阐明数据科学家和业务分析师之间的工资差异。
最后,我可以再问一次同样的问题,你如何看待薪资受到远程职位的影响,尤其是当城市是决定薪资的一个如此重要的因素时?
感谢您的阅读!
我与这些公司都没有关系。
请随时查看我的个人资料、 Matt Przybyla 、和其他文章,并通过以下链接订阅接收我的博客的电子邮件通知,或通过点击屏幕顶部的订阅图标 的 点击订阅图标,如果您有任何问题或意见,请在 LinkedIn 上联系我。
订阅链接:https://datascience2.medium.com/subscribe
我也写过类似的文章,在这里讨论数据科学家与数据工程师的工资【7】,在这里讨论机器学习工程师的工资与数据科学家的工资【8】,在这里讨论数据科学家与数据分析师的工资【9】。这些文章概述并强调了各自薪资的相似特征。请记住,对于所有这些文章,这些都不是我的工资,而是由 PayScale 和其他实际的数据科学家、业务分析师、数据工程师、数据分析师和机器学习工程师报告的。因此,这些文章是围绕真实数据展开的讨论,旨在让您更好地了解是什么使一个角色( 一般为 )基于某些因素增加或减少薪资金额。
参考
[1]照片由 Ryan Quintal 在 Unsplash 上拍摄,(2019)
[2]由奥斯汀·迪斯特尔在 Unsplash 上拍摄的照片,(2019)
[3]薪级表,数据科学家工资,(2021)
[4] PayScale, PayScale 薪资调查,(2021)
[5]图片由 Adeolu Eletu 在 Unsplash 上拍摄,(2016)
[6] PayScale,商业分析师(未指明类型),(2021)
[7] M. Przybyla,数据科学家与数据工程师的薪酬,(2021)
[8] M.Przybyla,数据科学家 vs 机器学习工程师薪酬,(2021)
[9] M. Przybyla,数据科学家与数据分析师的薪酬,(2021)
数据科学家与数据分析师最佳实践
原文:https://towardsdatascience.com/data-scientist-vs-data-analyst-best-practices-7d5d8c725123?source=collection_archive---------13-----------------------
意见
在这些受欢迎的技术岗位上成为专业人士的最佳方式
安德里亚斯·克拉森在Unsplash【1】上拍摄的照片。
目录
- 介绍
- 数据科学家
- 数据分析师
- 摘要
- 参考
介绍
作为一个在这两个行业都工作过的人,我学到了一些帮助我更好地完成工作的最佳实践、流程或技巧。数据科学家和数据分析师的工作有一些相似之处,也有明显的不同,这也与最佳实践有关。在本文中,我将重点介绍每个职位的三个最佳实践示例。话虽如此,如果你想了解一些我所学到的东西,以便在你的职业生涯中应用它,或者如果你有兴趣听到每个角色的一些最佳实践,请继续阅读。
数据科学家
由克里斯托弗·高尔在Unsplash【2】上拍摄。
数据科学家的职责通常比教育项目中讨论的要多得多。例如,学习时对数据科学的主要关注点是各种各样的流行算法。当然,机器学习算法是您的数据科学知识的关键,但还有一些其他方面仍然很重要,它们最终将帮助您将算法实现为您公司/业务的可用模型。
以下是数据科学家的三个最佳实践:
- 利益相关方问题陈述
当作为一名数据科学家工作时,最有可能的是,你实际上不会与其他数据科学家一起工作(当然,有一些公司有几名数据科学家,但即使这样,你也可能被孤立在单独的特定项目上)。你通常会和利益相关者一起工作,通常是产品经理或类似角色的人。第一步是用简单的方式定义问题,不用担心数据科学。一旦它被提炼和强化,你就可以专注于数据科学是如何解决问题的。
以下是您和您的利益相关者将定义的问题陈述的示例:“手动将优步驱动程序分配给客户需要很长时间”。很清楚,只是讨论问题而已。
- 利益相关方工作分析
接下来的两个最佳实践是相关的。第一部分描述了您应该大致了解一个数据科学项目需要多长时间,包括完整的时间表、所需的数据资源、其他员工资源、应用程序使用、工程师/后端设计/前端设计/端点使用等。定义数据科学项目所需工作量的因素有很多。最好明确对项目的期望,以便有足够的时间来完成数据科学模型。
- 数据科学模型资源
就像我上面说的,你需要意识到你即将到来的项目的顶级资源。分析数据科学模型资源时要考虑的一些事情有:*所需的时间、精力、工具和*台、使用的编程语言、重复培训——您需要多频繁地培训您的模型、所需的数据、所需的其他工程师、预期所需的其他主题等。*如您所见,在为您的数据科学模型分配和请求资源时,有许多事情需要考虑。
当您开发模型时,所有这些最佳实践都是一些需要记住的非技术步骤。尽管如此,这些实践仍然非常重要,并将塑造您的数据科学模型和机器学习算法向前发展。
数据分析师
卡斯帕·卡米尔·鲁宾在Unsplash【3】上的照片。
在大多数情况下,数据分析项目通常在较短的时间内完成,但是,它们可能会更频繁。这一考虑将为数据分析师塑造一个略有不同的最佳实践。
以下是数据分析师的三个最佳实践:
- 查询和仪表板过滤器重要性
当数据分析师收到查询或仪表板请求时,在与请求这些任务的风险承担者合作时,需要考虑一些事情。您可能会从一个完整数据集结果的查询开始,但是随后,当您与利益相关者反复讨论时,您会意识到您真正需要的是,比如说,三个过滤器或 SQL 代码中基本上三个WHERE
语句。同样的道理也适用于将您的 SQL 代码绑定到一个带有过滤器按钮选项的仪表板。当然,添加一个过滤器甚至会产生非常不同的结果,因此最佳实践是立即与利益相关者合作,以确保您与您实际想要返回的数据保持一致。
- 设定利益相关方的期望
与利益相关方工作分析和数据科学模型资源类似,作为数据分析师,您需要与时间表预期保持一致。这一步很重要,这样你就不会同时有这么多的请求,并且可以专注于正确地完成你的任务。
- 枣,枣,枣
日期是很棘手的,而且似乎总是你要处理的几乎每个数据分析师的请求。它们很棘手,因为如果您正在创建一个查询或仪表板,您将希望确保您获取的结果来自上一个完整的小时或天,等等。这种查询技术对于仪表板也很重要,这样您就可以正确地显示比较结果。例如,您可以显示每周指标,但是如果您在当前的一周,这可能会产生误导,因为这一周并未完成。您可能希望在查询、仪表板、报告等中注明这一点。,或者只返回完整的小时/天/周等。
正如您所看到的,所有这些最佳实践都需要与其他人(您的利益相关者)进行互动,因此需要注意的是,简单地完成一个请求并不是您唯一的要求,还需要与利益相关者进行讨论。
摘要
总的来说,这些最佳实践的趋势和焦点都集中在这两个角色的利益相关者协作上。你工作的这一方面至关重要。话虽如此,我想强调这些角色的一部分,因为更多的技术最佳实践似乎被讨论,而这些往往被忽视。
总而言之,以下是数据科学家与业务分析师最佳实践的一些关键要点:
*** Data Scientist***Stakeholder Problem Statement**Stakeholder Effort Analysis**Data Science Model Resources**** Data Analyst***Query and Dashboard Filter Importance**Setting Stakeholder Expectations**Dates, Dates, Dates*
我希望你觉得我的文章既有趣又有用。如果您同意或不同意这些最佳实践比较,请随时在下面发表评论。为什么或为什么不?关于最佳实践,您认为还有哪些重要因素需要指出?这些当然可以进一步澄清,但我希望我能够阐明数据科学家和业务分析师的最佳实践。
感谢您的阅读!
我与这些公司都没有关系。
请随时查看我的个人资料、 Matt Przybyla 、和其他文章,并通过以下链接订阅接收我的博客的电子邮件通知,或通过点击屏幕顶部的订阅图标 点击关注图标 的订阅图标,如果您有任何问题或意见,请在 LinkedIn 上联系我。
订阅链接:https://datascience2.medium.com/subscribe
参考
[1]图片由 Andreas Klassen 在 Unsplash 上拍摄,(2017)
[2]照片由克里斯托弗·高尔在Unsplash(2017)上拍摄
[3]照片由 Caspar Camille Rubin 在 Unsplash 上拍摄,(2017)
数据科学家 vs 数据分析师教育
原文:https://towardsdatascience.com/data-scientist-vs-data-analyst-education-99814eefc11e?source=collection_archive---------6-----------------------
意见
有什么不同和相同?
金伯利农民在Unsplash【1】上拍摄的照片。
目录
- 介绍
- 数据科学家
- 数据分析师
- 异同
- 摘要
- 参考
介绍
数据科学家和数据分析师有许多相同的工作职责,但在日常工作中也有一些相当大的差异。当然,一家公司可以称某人为数据科学家,他们主要从事数据分析师的工作,反之亦然,虽然不太常见,但仍然非常存在。例如,一家非常受欢迎的科技公司有一个数据科学家描述,描述或要求没有机器学习算法经验。这个例子很重要,因为它也将决定你的教育经历。然而,最好是了解一下每个角色的*均水*,以及你在每个领域的具体兴趣——例如,数据科学家的自然语言处理( NLP )将是你可以专攻的一个具体领域。话虽如此,让我们举一些例子来说明成为数据科学家或数据分析师的教育途径之间的异同。
数据科学家
照片由 Arseny Togulev 在Unsplash【2】上拍摄。
教育要求和经历总是在变化,也许对这个特定的角色来说变化最大。数据科学可以遵循更传统的路线,同时也可以遵循新的、更快的路线。我将在下面讨论这些路线,并举例说明在开始数据科学职业生涯时可以遵循的路线。
传统路线
- A →最传统的路线实际上对大多数职业来说更传统,但在数据科学中并不普遍。这条路线将是数据科学的本科学位,尤其是最*我看到了这个学位的出现。
- B →也许更受欢迎的其实是数据科学的研究生学位。我认为,这种方式更为常见,因为人们会继续攻读传统的数学、商业、经济甚至生物等本科学位,然后决定在原来的职业生涯中工作后,他们想要一些不同的和新的东西,这将是数据科学的研究生学位。这并不一定意味着你必须学习数据科学总共 6 年,但实际上是 1-2 年。
现代路线
- A →一个在线训练营对于软件工程和数据分析来说已经存在了一段时间,但对于数据科学家来说才刚刚变得更受欢迎。如果你想有一个更快、更便宜的教育体验,这种方法会被采用。你可能会说它不如学位有声望,但我确实认为这种转变已经发生了,雇主不在乎你如何学习,只在乎你已经学会了,并且可以通过口头面试、课后测试和有趣的编码来测试你的知识。
- B →一个在线训练营,在那里你已经有了技术背景。这条道路面向已经拥有数据分析、软件工程或数据工程背景的人,他们可以参加更短的训练营或在线课程和认证的组合,以最快的方式进入数据科学职业(但前提是你在之前已经调查过技术/数据职位)。
现在,我们已经研究了作为数据科学家可以采取的 4 种可能的教育途径,我们可以研究一下数据分析师的具体途径。但首先,让我们快速总结一下我们上面讨论的这些路线:
- 数据科学(或软件工程)的传统本科学位
- 数据科学的传统研究生学位
- 现代完整的数据科学在线训练营
- 数据科学方面的现代精简训练营/课程/认证
数据分析师
马里奥·高在Unsplash【3】上的照片。
数据分析师的角色已经存在了一段时间,并且是一个非常受欢迎的角色,但是,对于数据分析师来说,没有太多的传统路线。我们仍然可以研究更传统的路线,如数据科学,以及一些现代路线。
传统路线
- 答→最传统的途径可能实际上是一个不完全是数据分析的学位。这条途径可能是商业、经济学或统计学的本科学位。
- B →一个更*的,但仍然是传统的途径是数据分析的研究生学位。我已经看到了这种趋势,即这些迎合数据科学和数据分析的学位首先从研究生院开始,然后申请本科学位。这几乎让你怀疑四年制学校是否有必要,因为它已经被 1-2 年的研究生课程所证明。
现代路线
- 答:一个在线训练营已经存在了一段时间,通常包含您在日常工作中最常用的技能,如 SQL 和数据可视化。
- B →一个在线训练营,在那里你已经有了技术背景。这条道路是为已经有软件工程、数据工程甚至产品管理背景的人准备的,他们可以参加更短的训练营或在线课程和认证的组合,以最快的方式进入数据分析师职业(但前提是你在之前已经调查过技术/数据职位)。
就像我们在上面的数据科学家教育路线中所做的一样,让我们做同样的事情来总结您可以采取的数据分析教育路线:
- 商业、经济、统计等传统本科学位。
- 数据分析的传统研究生学位
- 数据分析的现代完整在线训练营
- 数据分析方面的现代精简训练营/课程/认证
异同
照片由hkon grim stad在Unsplash【4】上拍摄。
现在,我们已经对你在这些角色中可能选择的路线有了一个更好的背景(是的,还有无数更多的路线,但这些是我个人认为最普遍的),让我们稍微深入一点 这些角色的一些 的相似之处和不同之处。
类似
- 两人都将学习业务方面,比如关键绩效指标(KPI)的(T20)关键绩效指标(T21)
- 既会学习数据可视化
- 两人都将学习沟通 ( 向非技术受众传达技术概念)
差异
- 数据科学家通常会学习Python(面向对象编程-OOP ),而数据分析师会学习 R ( 有时)
- 数据分析师将特别学习 SQL
- 数据分析师将学习 Tableau/Looker 或类似的东西
- 数据科学家将专注于机器学习算法
- 数据科学家将专注于机器学习操作 ( 部署等。)
同样,这两种职业都没有一条完美的路线可以满足每个人的期望和要求。也就是说,最终取决于你想在这些领域学习什么。这些决定也会影响你获得的角色类型,例如,你选择专注的特定技能可以开启一条专业化的道路。
摘要
如你所见,你可以选择几条不同的道路来从事这两种职业,无论是 4 年制学位还是几个月的快速在线认证。一些人喜欢学得更快,而另一些人喜欢花更长的时间专注于学习更多的东西。再说一次,你选择什么样的教育道路取决于你自己——但首先,知道你有什么选择是很重要的,这也是我写这篇文章的原因。
概括来说,以下是两种角色都可以采用的一些方法:
* Traditional undergraduate degree* Traditional graduate degree* Modern, longer bootcamp* Modern, shorter bootcamp/courses/certifications
我希望你觉得我的文章既有趣又有用。如果您同意或不同意这两种角色的教育路线,请在下面随意发表评论。为什么或为什么不?关于教育,你认为还有哪些重要的因素需要指出?这些当然可以进一步澄清,但我希望我能够阐明数据科学家和数据分析师教育路线之间的异同。
感谢您的阅读!
我不属于这些公司中的任何一家。
请随时查看我的个人资料、 Matt Przybyla 、和其他文章,并通过以下链接订阅接收我的博客的电子邮件通知,或通过点击屏幕顶部的订阅图标 的 ,如果您有任何问题或意见,请在 LinkedIn 上联系我。
订阅链接:https://datascience2.medium.com/subscribe
参考
[1]金伯利农民在 Unsplash 上拍摄的照片,(2017)
[2]2019 年 Unsplash 上 Arseny Togulev 拍摄的照片
[3]照片由马里奥·高在 Unsplash 拍摄,(2018)
[4]照片由hkon grim stad在 Unsplash 上拍摄,(2020)
数据科学家 vs 数据分析师工资
原文:https://towardsdatascience.com/data-scientist-vs-data-analyst-salary-b0b3060e2529?source=collection_archive---------0-----------------------
这两个热门科技角色有什么区别?
瑞安·昆塔尔在 Unsplash 上拍摄的照片。
目录
- 介绍
- 数据科学家
- 数据分析师
- 摘要
- 参考
介绍
这篇文章的目的不是比较一个人是否应该得到更多的钱,而是一个指南,让这两个领域的专业人士根据他们目前的工资进行评估。无论多么老生常谈,在要求更高的薪水时,记住这两件事仍然很重要:提出要求没有坏处,有时,你不会得到你没有要求的。请记住,这些是更一般的统计数据,因为你可以根据自己的意愿具体说明你的薪水应该是多少。相反,这些值是供您使用的方向指南。
对一些人来说,这些角色可能看起来非常相似,而对另一些人来说,它们可能看起来非常不同;他们各自的薪水也是如此。影响薪水的因素有很多,比如资历、地点、教育、技能、谈判、行业、公司等等。因此,当考虑到这些特征时,你可以看到每个角色的工资范围。知道你能提供什么是很重要的,因为这将最终决定你在面试过程中的最终薪水。
除了上述特征之外,薪酬中还有其他一些部分可以构成整体薪酬方案。这些包括基本工资本身、奖金、股票和其他福利。总的来说,你的薪水可能比其他人高得多,但这可能有些误导,因为薪酬方案中的某些部分取决于你或公司的表现。最后,需要注意的是,招聘人员可能并不完全了解市场薪资,因此,根据上述特征,你知道该要求什么是至关重要的。话虽如此,让我们深入了解这两个热门角色的薪酬。
数据科学家
附身摄影在Unsplash【2】上拍照。
我最*写了一篇文章,比较了数据科学和机器学习工程师的工资,因此我将尽量不在这一部分重复,但是,如果你还没有阅读那篇文章,我仍然会在这里包括一些有用的统计数据和讨论。
作为一名数据科学家,你可能会看到一些预期的头衔,这些头衔的薪酬也可能会有重大变化:
入门级数据科学家→数据科学家→高级数据科学家
首席数据科学家—数据科学经理—数据科学总监
除了这些头衔,还有一些资历级别,如 I、II 和 III。
下面,我将按职位显示薪资范围,以及他们各自所需或预期的年数。
请记住,这些角色是基于美国的*均水*(基于工资等级【3】):
- *均总体数据科学家→
$96,455
- 普通入门级数据科学家→
$85,312
(1 年) - 普通早期职业数据科学家→
$95,121
(1-4 年) - 中等职业生涯的数据科学家→
$109,696
(5-9 年) - 普通经验丰富的数据科学家→
$136,051
(10-19 岁)
我同意这些数字吗?
号码
我相信这些薪水应该比这里报道的要高。例如,我认为职业生涯中期的*均水*应该是职业生涯早期的预期水*(可能是第二年左右,而不是第一年,这取决于其他因素)。
正如你所看到的,相同的经历有相当大的范围,取决于你住在哪里,伊利诺伊州的农村城市在低端,旧金山在高端(随机查看,农村,受欢迎的城市)。
接下来,我们将讨论数据分析师的工资,以及地点、资历和技能的变化。
数据分析师
照片由 Myriam Jessier 在Unsplash【4】上拍摄。
基于几个因素,数据分析师可以预期看到他们的工资有很大的差异。一些分析师可能更专注于过去的分析或静态数据,而一些分析师可能专注于预测建模,这与数据科学家更相似。由于每份独特工作的这些差异,在你职业生涯的早期到晚期,以及在你的知识基础上增加某些技能,薪水会显著增加。
作为一种观点,根据个人经验,以及我们稍后将从 PayScale 的真实数据中看到的内容,如果您看到数据分析师的工作描述中包含以下词语/技能:
- Python、R、SQL、编程、A/B 测试、预测建模(等。)
你可以期待这个职位比工作描述更集中在以下几个方面支付更高的薪水:
- Excel、PowerPoint/Google 幻灯片、Tableau ( 等。)
让我们深入了解数据分析师的各种资历级别以及他们各自的薪水【5】:
- *均总体数据分析师→
$61,754
- 普通入门级数据分析师→
$56,383
(1 年) - 普通早期职业数据分析师→
$61,179
(1-4 年) - 中等职业生涯数据分析师→
$69,251
(5-9 年) - 普通有经验的数据分析师→
$71,512
(10-19 年)
这个工资数据是从 PayScale 收集的,如果你想要一个更具体的估计,那么你可以使用工资调查【6】。
我同意这些数字吗?
号码
我相信这些薪水应该比这里报道的要高。例如,我认为,对于一个入门级的数据分析师来说,即使是有经验的水**均也太低了。
如你所见,所有这些估计都比数据科学家的估计要小得多。我也觉得这些总体来说比较低端。然而,如果你住在大城市,并拥有我上面讨论的技能,那么你可以期待更高的工资,可以达到或超过数据科学家的工资,稍后还会看到特定技能的增加。让我们深入了解一些不同的城市,而不仅仅是美国的*均水*。
以下是一些热门城市和一些农村城市,以及它们各自的职业中期数据分析师*均薪资:
- 旧金山→98627 美元
- 奥斯汀→70485 美元
- 洛杉矶→71487 美元
正如我们从上面看到的,相同资历级别的数据分析师有相当大的范围。现在让我们看看这三个城市,并应用一个包含各种技能的过滤器:
- 旧金山→ $110,000—“数据建模”
- 奥斯汀→$ 90249—“Python”
- 洛杉机→ $81,951—“统计分析”
这些差异是巨大的。这些都是同样的城市,有着同样的资历,但是有着更接*数据科学家或软件工程师的额外技能。有了这些信息,你就能明白,你经历中的一些小小的改变,对你挣更多的钱或更高的薪水有多么重要。
摘要
知道自己的价值很重要,更好地了解你现在拥有的技能,以及你可能拥有的技能,会对你的薪水产生巨大的影响。也就是说,基于你所拥有的技能,同等资历的数据分析师或数据科学家可能会与其他人的薪资不相上下,甚至超过他们。
总结一下,以下是数据科学与数据分析师薪酬的一些关键对比:
* Average US data scientist salary $96,455* Average US data analyst salary $61,754* Data scientists can be more predictive, while data analysts can focus more on past/static data* Several factors contribute to salary, the most important most likely being seniority, city, and skills
我希望你觉得我的文章既有趣又有用。如果你同意或不同意这些工资比较,请在下面随意评论。为什么或为什么不?关于薪水,你认为还有哪些重要的因素需要指出?这些当然可以进一步澄清,但我希望我能够阐明数据科学和数据分析师工资之间的差异。
最后,我可以再问一次同样的问题,你如何看待薪资受到远程职位的影响,尤其是当城市在决定薪资方面是一个如此重要的因素时?
感谢您的阅读!
我与这些公司都没有关系。
请随时查看我的个人资料、 Matt Przybyla 、和其他文章,并通过以下链接订阅接收我的博客的电子邮件通知,或通过点击屏幕顶部的订阅图标 点击关注图标 的订阅图标,如果您有任何问题或意见,请在 LinkedIn 上联系我。
订阅链接:https://datascience2.medium.com/subscribe
我也写过一篇类似的文章,讨论机器学习工程师的工资与数据科学家的工资在这里【7】。这篇文章概述并强调了每种工资的相似特征。请记住,对于这两篇文章,这些都不是我的工资,而是由 PayScale 和其他实际的数据科学家、数据分析师和机器学习工程师报告的。因此,这些文章是围绕真实数据的讨论,旨在让您更好地了解是什么使一个角色( ,一般为 )基于某些因素增加或减少薪资金额。
参考
[1]瑞安·昆塔尔在 Unsplash 上拍摄的照片,(2019)
[2]照片由附身摄影于Unsplash(2018)
[3]薪级表,数据科学家工资,(2021)
[4]Myriam Jessier 在 Unsplash 上拍摄的照片,(2020)
[5]薪级表,数据分析师工资,(2021)
[6] PayScale, PayScale 薪资调查,(2021)
[7] M.Przybyla,数据科学家 vs 机器学习工程师薪酬,(2021)
数据科学家 vs 数据工程师薪资
原文:https://towardsdatascience.com/data-scientist-vs-data-engineer-salary-bbf147d1fa99?source=collection_archive---------5-----------------------
这两个热门科技角色有什么区别?
瑞安·昆塔尔在 Unsplash 上拍摄的照片。
目录
- 介绍
- 数据科学家
- 数据工程师
- 摘要
- 参考
介绍
注意:
本文是第三篇,是一个持续系列的一部分,报道了流行的数据/技术角色之间的薪酬。我会在本文结尾把另外两个联系起来。
这篇文章的目的不是比较一个人是否应该得到更多的钱,而是一个指南,让这两个领域的专业人士根据他们目前的工资进行评估。无论多么老生常谈,在要求更高的薪水时,记住这两件事仍然很重要:提出要求没有坏处,有时,你不会得到你没有要求的。请记住,这些是更一般的统计数据,因为你可以根据自己的意愿来具体确定你的薪水应该是多少。相反,这些值是供您使用的方向指南。
数据科学家和数据工程师彼此分享某些技能和经验,但是,有一些关键的差异,这些差异会导致不同的工资。话虽如此,下面让我们从真实数据中直接进入这两种角色的一些薪资示例。
数据科学家
照片由哥白尼在Unsplash【2】上拍摄。
由于我已经写了几篇关于数据科学薪水的文章,我将在这里包括最重要的信息,以及几个不同的例子。
作为一名数据科学家,你可能会看到一些预期的头衔,这些头衔的薪酬也可能会有重大变化:
入门级数据科学家→数据科学家→高级数据科学家
首席数据科学家—数据科学经理—数据科学总监
除了这些头衔,还有一些资历级别,如 I、II 和 III。
下面,我将按职位显示薪资范围,以及他们各自所需或预期的年数。
请记住,这些角色是基于美国的*均水*(基于工资等级 [3】):
- *均总体数据科学家→
$96,455
- 普通入门级数据科学家→
$85,312
(1 年) - 普通早期职业数据科学家→
$95,121
(1-4 年) - 中等职业生涯的数据科学家→
$109,696
(5-9 年) - 普通经验丰富的数据科学家→
$136,051
(10-19 岁)
我同意这些数字吗?
号码
如果你读过以前的文章,下面是我将包括不同城市的报告工资,以及不同的技能组合。
- 密歇根州安阿伯市→
$88,197
- 马萨诸塞州剑桥→
$110,213
- 科罗拉多州丹佛市→
$92,924
以下是具体城市和技能:
- 北卡罗来纳州夏洛特+自然语言处理(NLP) →
$70,000
- 北卡罗来纳州夏洛特+ Tableau 软件→
$79,096
- 佐治亚州亚特兰大+爪哇→
$80,000
城市的*均工资本身似乎更符合现实,而与城市相关的特定技能似乎太低。我相信原因在于,当你根据特定技能进行过滤时,你会剥离掉所有其他技能。因此,一个变通的办法可能是找到城市的*均工资,然后比较上述技能之间的差异,以获得更现实的工资估计。
我确实认为 NLP 技能不如 Tableau 有利可图这一点很有趣,但是,我认为 NLP 可能太具体了,可能更少被误解,而 Tableau 被广泛理解,大多数数据科学家不认为应该将这一点添加到他们的简历中,因为它更面向数据分析师-当你意识到你的工资或编辑你的简历时,应该记住这一点-长话短说,不要做假设,并在你的技能组合中寻找独特性。
我不知道有多少使用 Java 的数据科学家,但我确实认为这些报告中包含的数据将该技能作为一个选项是很有趣的,因此,出于我不确定的原因(也许是软件工程师向数据科学家过渡),Java 可能有市场。
数据工程师
照片由 Fotis Fotopoulos 在Unsplash【4】上拍摄。
现在,我们对数据科学的工资有了一个很好的认识,包括不同的因素,如位置和技能,让我们更深入地探讨更具体的数据工程师的工资是什么样的。
在所有这些工资比较中,数据工程师和数据科学家似乎有一个更相似的范围,正如我们将在下面看到的。
作为一名数据工程师,你可能会看到一些预期的职位,这些职位的薪水也可能会有很大的变化:
数据工程师→高级数据工程师→数据工程经理
首席软件工程师——数据科学家(是的,数据工程专业)
除了这些头衔,还有一些资历级别,如 I、II 和 III。
下面,我将按职位显示薪资范围,以及他们各自所需或预期的年数。
请记住,这些角色是基于美国的*均水*(基于工资等级 [5】):
- *均总体数据工程师→
$92,519
- 普通入门级数据工程师→
$77,350
(1 年) - 普通早期职业数据工程师→
$87,851
(1-4 年) - 中等职业生涯数据工程师→
$103,467
(5-9 年) - 经验一般的数据工程师→
$117,918
(10-19 年)
我同意这些数字吗?
号码
我认为每个头衔至少应该换一次,因为在职业生涯早期,薪水应该是职业生涯中期或有经验的数据工程师的薪水,这也取决于你住在哪里——所以让我们更深入地了解具体的*均位置。
- 纽约,纽约→
$104,615
- 华盛顿西雅图→
$105,076
- 加州旧金山→
$123,859
- 德克萨斯州奥斯汀→
$96,290
这些城市*均值比总体*均值更有意义。最有趣的是旧金山的不同,然而,仍然在意料之中,因为那里的生活成本高得令人难以置信。
现在,让我们来看看这些城市的具体技能:
- 纽约,纽约+ Scala →
$121,755
- 华盛顿西雅图+大数据分析→
$107,442
- 加州旧金山+ Apache Hadoop 技能→
$123,672
- 德克萨斯奥斯汀+亚马逊网络服务( AWS ) →
$97,436
在所有这些工资中,旧金山市在增加一项技能时工资有所下降——这句话重申了在查看您的个性化报告时,您可能希望增加您的所有技能,而不是一项。纽约见证了 Scala 的最大飞跃,我个人同意这一点,因为它是一项很好的技能,很难掌握。
摘要
工资有几个特征,可以允许它增加或减少。我们刚才讲了两个因素,经验年限,地点(城市)和技能。还有其他因素需要考虑,包括但不限于:面试本身、简历本身、谈判技巧、奖金、股份、教育和认证。
总而言之,以下是数据科学家与数据工程师薪酬的一些关键对比:
* Average US data scientist salary $96,455* Average US data engineer salary $92,519* These two roles share perhaps the most similar salary ranges* Data scientists focus more on creating models from existing, packaged machine learning algorithms in Python, while data engineers focus more on utilizing SQL for ETL/ELT with regards to data* Several factors contribute to salary, the most important most likely being seniority, city, and skills
我希望你觉得我的文章既有趣又有用。如果你同意或不同意这些工资比较,请在下面随意评论。为什么或为什么不?关于薪水,你认为还有哪些重要的因素需要指出?这些当然可以进一步澄清,但我希望我能够阐明数据科学家和数据工程师之间的工资差异。
最后,我可以再问一次同样的问题,你如何看待薪资受到远程职位的影响,尤其是当城市是决定薪资的一个如此重要的因素时?
感谢您的阅读!
我与这些公司都没有关系。
请随时查看我的个人资料、 Matt Przybyla 、和其他文章,并通过以下链接订阅接收我的博客的电子邮件通知,或通过点击屏幕顶部的订阅图标 点击订阅图标 ,如果您有任何问题或意见,请在 LinkedIn 上联系我。
订阅链接:https://datascience2.medium.com/subscribe
我也写过一篇类似的文章,讨论机器学习工程师的工资与数据科学家的工资这里【6】,以及数据科学家和数据分析师的工资这里【7】。这篇文章概述并强调了每种工资的相似特征。请记住,对于这两篇文章,这些都不是我的工资,而是由 PayScale 和其他实际的数据科学家、数据工程师、数据分析师和机器学习工程师报告的。因此,这些文章是围绕真实数据的讨论,旨在让您更好地了解是什么使一个角色( ,一般为 )基于某些因素增加或减少薪资金额。
同样,这些工资数据是从 PayScale 收集的,如果您想要更具体的估计,那么您可以使用工资调查 [8]。
参考
[1]照片由瑞安·昆塔尔在Unsplash(2019)上拍摄
[2]照片由哥白尼在Unsplash(2020)拍摄
[3]薪级表,数据科学家工资,(2021)
[4]照片由 Fotis Fotopoulos 在 Unsplash 上拍摄,(2018)
[5]工资表,数据工程师工资,(2021)
[6] M.Przybyla,数据科学家 vs 机器学习工程师薪酬,(2021)
[7] M. Przybyla,数据科学家与数据分析师的薪酬,(2021)
[8] PayScale, PayScale 薪资调查,(2021)
数据科学家 vs 机器学习工程师薪资
原文:https://towardsdatascience.com/data-scientist-vs-machine-learning-engineer-salary-918769de715c?source=collection_archive---------7-----------------------
这两个热门科技角色有什么区别?
瑞安·昆塔尔在 Unsplash 上拍摄的照片。
目录
- 介绍
- 数据科学家
- 机器学习工程师
- 摘要
- 参考
介绍
这篇文章的目的不是比较一个人是否应该得到更多的钱,而是一个指南,让这两个领域的专业人士根据他们目前的工资进行评估。尽管老生常谈,但当要求更高的薪水时,记住这两件事仍然很重要:要求没有坏处,有时你不会得到你没有要求的。请记住,这些是更一般的统计数据,因为你可以根据自己的意愿具体说明你的薪水应该是多少。相反,这些值是供您使用的方向指南。话虽如此,让我们讨论一下这两个角色在每个资历级别的薪酬,这样你就可以更好地了解你与其他数据科学家和机器学习工程师相比应该处于什么位置,也便于招聘人员评估他们公司的薪酬待遇。除了上述内容,我还将讨论我是否同意这些数字,所以如果你想了解更多关于数据科学家与机器学习工程师工资的信息,请继续阅读。
数据科学家
照片由莱昂在Unsplash【2】上拍摄。
数据科学家的工作描述似乎更加模糊,而机器学习工程师则更加一致和具体。这些角色的资历级别也略有不同——数据科学使用自己的级别,而机器学习工程师可以更多地遵循软件工程头衔。
例如,数据科学家的典型职业道路如下(您也可以期望头衔中的数字代表资历,如 I、II 和 III):
入门级数据科学家→数据科学家→高级数据科学家
根据你具体想做什么,数据科学领域有更高的职位:
首席数据科学家—数据科学经理—数据科学总监
其中,这些都可以在同一水*,但它最终取决于你的公司。例如,一些公司可能都是同一个角色,而在另一个公司,这三个角色可能遵循您在上面看到的层次结构。现在我们知道了不同的头衔,让我们看看他们各自的薪水。
请记住,这些角色是基于美国的*均水*(基于工资等级 [3]):
- *均总体数据科学家→
$96,455
- 普通入门级数据科学家→
$85,312
(1 年) - 普通早期职业数据科学家→
$95,121
(1-4 年) - 中等职业生涯的数据科学家→
$109,696
(5-9 年) - 普通经验丰富的数据科学家→
$136,051
(10-19 岁)
我同意吗?号
我相信这些都是低端的,需要转移一个级别,所以我会将职业生涯中期的工资转移到职业生涯早期,等等。
现在,让我们看看几个特定城市的一些极端情况,以了解这些城市在早期职业生涯方面的差异(我觉得大多数数据科学家都属于这一类):
- 纽约市→104,705 美元
- 奥斯汀→98269 美元
- 洛杉矶→100,234 美元
- 佐治亚州阿尔法雷塔→86476 美元
- 旧金山→122,634 美元
- 伊利诺伊州皮奥里亚→83524 美元
正如你所看到的,相同数量的经历有相当大的范围,取决于你住在哪里,伊利诺伊州的一个农村城市在低端,旧金山在高端(随机查看,农村,受欢迎的城市)。
除了地点之外,以下是你评估薪资时需要考虑的其他因素:
- 奖金、股份、技能、认证、教育、合同/全职、行业
所有这些工资数据都是从 PayScale 收集的,如果你想对“当前工作”、“工作机会”或“只是探索”有更具体的估计,那么你可以使用工资调查【4】。现在,我们对数据科学的薪资范围有了一个概念,让我们深入研究下一个角色。
机器学习工程师
由 Max Duzij 在Unsplash【5】上拍摄的照片。
机器学习工程师通常操作数据科学家创建的东西——模型方面,技能更多地与软件工程相关。
机器学习工程师角色的一些例子是
机器学习工程师→高级机器学习工程师
然而,在一些公司,机器学习工程师可能实际上被称为“软件工程师”,并可以使用各自的头衔,如Staff
、Principal
等。
这里有一些机器学习工程师的美国*均工资的例子(你也可以期望头衔中的数字代表资历,比如 I、II 和 III)
- *均整体机器学习工程师→
$113,143
- 中等职业水*的机器学习工程师→
$138,189
我同意吗?是的。
我相信这些数字也更符合数据科学的发展方向。
只要比较一下机器学习工程师和数据科学家的总体和职业生涯中期工资,你就可以看到有显著的增长。例如,一般的机器学习工程师比数据科学家多$17,000
,在职业生涯中期,有一个$30,000
的差异。您还应该看到特定城市增长或下降之间的相似性,就像我们看到的数据科学家一样。
我认为,在相同的相对资历水*下,薪酬存在巨大差异的原因是,机器学习工程师的角色往往是软件工程和数据科学的混合体——情况并非总是如此,但我认为这可以解释薪酬的飙升。
造成这种差异的另一个因素是,一些数据科学角色实际上是数据分析师角色,这让我在面试时感到惊讶,因为我一直认为数据科学是利用机器学习算法,但有时它可能更侧重于 SQL/数据分析/报告,这取决于公司。
摘要
总的来说,有无数因素可以影响这些角色的工资,特别是如果你现在已经是一名数据科学家或机器学习工程师,你可以理解你需要的不仅仅是几个特征来解释你的目标(在这种情况下是工资值)的差异。
总而言之,以下是数据科学与机器学习薪酬的一些关键点:
* Average US data scientist salary $96,455* Average US machine learning engineer $$113,143* Data scientists can be more analytical/product-focused, while machine learning engineers can be more software engineering focused* Several factors contribute to salary, the most important most likely being seniority and city
我希望你觉得我的文章既有趣又有用。如果你同意或不同意这些工资比较,请在下面随意评论。为什么或为什么不?关于薪水,你认为还有哪些重要的因素需要指出?这些当然可以进一步澄清,但我希望我能够阐明数据科学和机器学习工程师工资之间的差异。
最后,你如何看待薪资受到远程职位的影响,尤其是当城市是决定薪资的一个如此重要的因素时?
感谢您的阅读!
我与这些公司都没有关系。
请随时查看我的个人资料、 马特·普日比拉、和其他文章,并通过以下链接订阅接收我的博客的电子邮件通知,或通过点击屏幕顶部的订阅图标 点击订阅图标 ,如果您有任何问题或意见,请在 LinkedIn 上联系我。
订阅链接:https://datascience2.medium.com/subscribe
参考
[1]瑞安·昆塔尔在 Unsplash 拍摄的照片,(2019)
[2]照片由 Leon 在 Unsplash 上拍摄,(2019)
[3]薪级表,数据科学家工资,(2021)
[4] PayScale, PayScale 薪资调查,(2021)
[5]由 Max Duzij 在 Unsplash 上拍摄的照片,(2019)
[6]工资表,机器学习工程师工资,(2021)
数据科学家 vs 机器学习工程师技能。区别就在这里。
原文:https://towardsdatascience.com/data-scientist-vs-machine-learning-engineer-skills-heres-the-difference-93eb2f4f6f98?source=collection_archive---------5-----------------------
意见
深入了解 2021 年这两个受欢迎的技术角色
克里斯多夫·高尔在Unsplash【1】上的照片。
目录
- 介绍
- 数据科学
- 机器学习
- 摘要
- 参考
介绍
这两个受欢迎的技术角色之间的重叠肯定会发生,所以让我们深入探讨这两个角色都需要什么技能,以及是什么使它们不同。一般来说,数据科学家可以期望更多地在建模方面工作,而机器学习工程师往往专注于同一模型的部署。数据科学家专注于算法的细节,而机器学习工程师则致力于将模型运送到与用户互动的生产环境中。如果你想进一步了解这两个职位在所需技能方面的区别,请继续阅读。
数据科学
照片由在Unsplash【2】上绘制。
我将在 2021 年以亲身经历描述这些顶级技能。我已经看到很多文章交流数据科学家使用的其他技能和工具,但我想描述一下我认识的大多数人,包括我自己,日常使用的那些。虽然流行技能总是层出不穷,但以我的经验来看,这三个都是值得投资的突出技能,无论是时间还是金钱。
Python/R
数据科学家几乎每天都会使用流行的编程语言 Python [3】,而其他一些人则使用 r。他们往往有相同的目的,目标是获取数据、探索数据、处理数据、特征工程、模型构建以及交流结果,所有这些都只需使用 Python。
Jupyter 笔记本/或流行的 IDE
数据科学家经常使用这个工具,因为它是编码、编写文本和查看各种输出(如结果和可视化)的中心位置。Jupyter Notebook 是数据科学家的首选,我认为这种情况不会很快改变。还可以添加一些扩展,以使您的编码变得简单一些。其他一些更专注于编码的流行 IDE 包括 PyCharm 和 Atom 。
结构化查询语言
结构化查询语言对于数据科学家来说至关重要,因为数据是机器学习算法的基础,而机器学习算法最终将成为最终数据科学模型的一部分。数据科学家需要在数据科学流程的第一部分使用 SQL,例如查询第一批数据、创建新要素,然后在数据科学流程的最后,在运行和部署模型后,结果将保存在您公司的数据库中,当然,该数据库使用 SQL。有太多不同的 SQL 数据库/*台,如 MySQL 、 PostgreSQL 和微软 SQL Server——这通常取决于你具体将与哪家公司合作,然而,所有的都非常相似。
如果你能掌握这三项基本技能,你就能成为一名伟大的数据科学家。作为一名数据科学家,你当然可以学习更多的技能,但在工作中学习技能并不罕见,因为各公司共享不同的工具,需要不同的技能。要考虑的主要问题是,您需要大体了解以下内容:
* a programming langauge* an IDE/visualization platform* a querying language
机器学习
照片由 h heyerlein 在Unsplash【5】上拍摄。
机器学习工程师通常在数据科学家建立模型后开始发挥作用。他们的主要焦点是深入研究代码及其发布。这个过程也称为部署。例如,机器学习工程师不一定需要知道随机森林是如何工作的,但他们需要知道如何自动保存和加载文件,然后可以在生产环境中预测该文件。总的来说,他们更倾向于软件工程。
计算机编程语言
数据科学家和机器学习工程师都应该懂 Python。然而,即使这种编程语言有相似之处,他们也需要接受更多的 Python 培训。机器学习工程师更专注于 Python 中的面向对象编程 ( OOP ),而数据科学家往往不会像 OOP 那样**——主要是因为他们的工作是构建模型,专注于相关的分析和统计,而不一定是所有的代码。当然,有些数据科学家和机器学习工程师在这两方面都很棒,一些公司会将这作为一项要求,对此你需要与他们确认,以便你知道你是更专注于统计的数据科学家还是更专注于软件工程和机器学习的数据科学。**
GitHub/Git
大多数工程师使用 Git 和 GitHub 来版本化和存储代码库。这个代码管理工具和*台对于机器学习工程师来说是必不可少的,以便进行代码更改和拉式请求。通常,数据科学家和机器学习工程师在这方面都很擅长,但是,机器学习工程师通常更关注 git 和 GitHub。
部署工具
这种技能可能是机器学习工程师和数据科学家最不同的地方。虽然,是的,一些数据科学家知道如何部署模型,一些公司需要它,但如果角色是机器学习工程师,你可以期待你工作的主要部分专注于部署数据科学模型。像 AWS 、 Google Cloud 、 Azure 、 Docker 、 Flask 、 MLFlow 、 Airflow 这样的工具,不一而足。
我发现,当头衔是机器学习工程师时,它实际上意味着 机器学习运营工程师 ,这可能会产生误导,因为你会期望机器学习工程师只关注机器学习算法如何工作——所以要确保你将申请的角色要么专注于算法,要么专注于运营( MLOps )。
摘要
虽然一些公司更喜欢既能从事数据科学又能从事机器学习(操作)的全面发展的科学家,但许多公司更喜欢某一领域的专家,因为他们的团队会将这两种角色分开。一个人从头到尾做所有的事情是很困难的,所以有两个指定的人,一个专注于模型构建,一个专注于模型部署,通常是更有效的方法。
总而言之,以下是每个角色的关键技能,请记住,它们还有很多,然而,这些技能仍然很重要:
Python/RJupyter Notebook/IDESQLGitHub/GitDeployment Tools
我希望你觉得我的文章既有趣又有用。如果你作为数据科学家或机器学习工程师拥有这些技能,请随时在下面发表评论。现在对你的数据科学或者机器学习事业有帮助吗?你同意还是不同意,为什么?
请随时查看我的个人资料和其他文章,也可以通过 LinkedIn 联系我。
参考
[1]照片由 Christopher Gower 在Unsplash(2017)上拍摄
[2]照片由this engineering RAEng在Unsplash(2020)上拍摄
[3] Python 软件基础,主页,(2001–2021)
Jupyter 项目,主页,(2021)
[5]照片由 h heyerlein 在Unsplash(2017)上拍摄
数据科学家 vs 机器学习运营工程师。区别就在这里。
原文:https://towardsdatascience.com/data-scientist-vs-machine-learning-ops-engineer-heres-the-difference-ad976936e651?source=collection_archive---------10-----------------------
意见
深入探讨 Data Scientist 和 MLOps 的异同。
LinkedIn 销售导航员在Unsplash【1】上的照片。
目录
- 介绍
- 数据科学家
- 机器学习运营工程师
- 异同
- 摘要
- 参考
介绍
虽然我写过关于数据科学和机器学习工程角色的文章,但我想比较数据科学家和机器学习运营工程师(通常被称为 MLOps 工程师)的具体职位。机器学习本身可以非常广泛,因此,一个新的职业出现了,它只专注于操作,而不是算法本身背后的研究。具有讽刺意味的是,数据科学家比 MLOps 工程师更关注机器学习算法。你甚至可以说 MLOps 工程师是传统意义上的软件工程师,他在整个数据科学流程中加入了部署和生产部分的专业化。我将更深入地探讨这两个职位,所以如果你想了解这两个杰出职业之间的共同差异和相似之处,请继续阅读。
数据科学家
由Á·阿尔瓦罗·伯纳尔在Unsplash【2】上拍摄的照片。
随着数据科学领域出现更多专业化,数据科学家的角色也变得越来越广泛。因此,你可以期待我的经历包含一些与你或你的期望不同的东西。然而,我研究了各种形式的数据科学,并希望给出该职位的最佳概述,以及将其与 MLOps 角色区分开来的关键点。数据科学家最好被描述为专注于业务的科学家,他用机器学习算法研究、发现和解决公司内部的问题。你的主要目标通常是使一个过程与以前相比更加准确和高效。这个定义听起来非常类似于软件工程的角色,然而,这个职位当然更关注算法和它们如何作为解决方案工作,而不是更多的手工制作和面向对象的编程代码解决方案。
以下是数据科学家在他们公司可能会经历的几天到几个月的一般流程:
- 探索贵公司的数据和产品
- 会见之前已经确定了企业内部或外部棘手问题的利益相关者
- 想出一个业务问题陈述,突出手头的问题
- 以某种方式获取数据,通常是使用 SQL 或者与数据工程师一起从其他新的来源中提取新的数据
- 对您选择的数据集执行探索性数据分析
- 将几个模型与基准模型进行比较
- 选择您的主要算法
- 识别关键特性—特性工程
- 删除多余和不必要的功能
- 可能创建整体或逐步算法过程
- 考虑异常值
- 保存您的模型并在开发环境中测试
- 提供准确性或误差指标的详细信息
- 展示你能为公司节省多少,以及你如何能让产品变得更好
有时,我在上面列出的数据科学过程中的这些步骤可能会不时发生变化。你要记住,所有的业务都是不同的,但如果你遵循一个数据创建、算法比较、测试和结果呈现的流程,你将成为你公司的伟大数据科学家。
现在,第 14 步之后会发生什么?这就是下一个角色发挥作用的地方。但是,也请记住,不是每个公司都能够负担得起或认为有必要在数据科学家旁边配备一名 MLOps 工程师。但是,如果您足够幸运,有一个更完整的数据科学团队,您可以专注于上面的那些步骤,而 MLOps 工程师可以专注于我将在下面描述的后续步骤。当然,如果你能两者兼而有之,那就太好了,很多人都身兼两职。虽然有时,如果数据科学家更专注于机器学习算法,而 MLOps 工程师专注于您的数据科学模型的部署、管道和生产化,这可能会更有益。当您不必担心将实际模型实现到您的业务、电话应用程序和公司软件的其他部分的软件工程繁重方面时,它可以帮助您提高模型的准确性或减少其错误度量。
机器学习运营工程师
物流工程师
照片由杰佛森·桑多斯在Unsplash【3】上拍摄。
机器学习运营工程师这一角色,通常被称为 MLOps 工程师,对于您的数据科学团队来说非常重要且有益。如果你目前是一名软件工程师,并且希望跨职能工作,特别是机器学习算法,或者你可能是一名了解算法如何工作的数据科学家,但希望更多地关注软件工程、数据工程和模型部署,你可能会发现自己正在转换到这一角色。当你作为一名 MLOps 工程师工作时,你可能首先会得到一个由数据科学家开发的数据科学模型。你还将研究如何优化一些数据科学代码,因为你将更加专注于软件工程,具有更加面向对象的编程经验(同样,这种经验对你或你的公司来说可能是不同的,但总体而言,我已经看到 MLOps 更加精通编程)。
因此,总的来说,作为一名 MLOps 工程师,您可以期望与数据科学家合作,通过数据工程和 DevOps 工具的实践来连接您公司软件中从测试到生产的差距。
下面是一个 MLOps 工程师在他们公司可能会经历几天到几个月的一般过程:
- 研究所使用的机器学习算法的一般概念( s
- 了解业务问题和数据科学解决方案
- 了解模型需要多长时间训练、测试和部署一次
- 你会做多少次预测,什么时候做?
- 但更重要的是(数据科学家也可以处理第 2-4 步),看看你如何利用你的专业知识来自动化整个工作流程
- 此外,在您公司的应用程序或软件中实现模型()例如,每小时将模型结果插入一个表,该表显示在消费者看到的用户界面中
- 最终使用数据存储和 OOP 改进等数据工程技术优化模型本身
- 致力于版本控制(如 Git/GitHub )和训练/预测的监控
- 代码库创建或效率
如您所见,整个数据科学流程的一些步骤在数据科学家和 MLOps 工程师之间有所重叠。他们经常紧密合作,以实现公司运行有益的机器学习算法或数据科学模型的最终目标。
异同
由维罗妮卡·贝纳维德斯在Unsplash【4】上拍摄的照片。
你可以预期这些角色会因公司而异,但是,总的来说,这两个职位之间有一些关键的相似之处和不同之处,它们几乎可以应用于任何地方。如果您能够同时执行这两项任务,那就太好了,但在某种程度上,可扩展的方法需要数据科学和 MLOps 工程两者协同工作,而不是一个人来完成。
这是两个角色之间的相似之处
- 双方都需要了解业务、问题和解决方案(至少是高层次的概述)
- 两者都需要很好地了解公司的数据,如果需要的话,还需要去哪里寻找更多的数据
- 两人通常都精通 SQL 和 Python
- 两者通常都使用 Git 和 GitHub ( 版本控制和存储库)
- 两者都需要了解培训和测试的概念
以下是这两种角色之间的不同之处
- 数据科学家通常在他们的 Jupyter 笔记本或类似的东西上工作或开发
- 数据科学家往往更注重研究,而…
- MLOps 专注于生产就绪代码和编程
- MLOps 与 Docker 和 CircleCi 等 DevOp 工具一起工作
- 以及 AWS/EC2、Google Cloud 或 Kubeflow
- MLOps 更倾向于面向对象
- 数据科学家必须知道实际的机器学习算法是如何工作的(,例如梯度下降、正则化、参数调整等。)
- 数据科学家专注于选择和创建算法(),例如,它是有监督的、无监督的、回归的还是分类的?)
- 学校教育/教育是不同的。通常,为数据科学家提供数据科学硕士学位,为 MLOps 工程师提供软件工程学士学位— 越来越多的本科学校正在开设数据科学学士学位。
- 在认证或其他形式的短期教育经历方面,为数据科学家提供软件工程专业,为 MLOps 提供机器学习专业也是有益的,这样两种角色都更加全面,可以更好地合作。
以上只是数据科学家和机器学习运营工程师的一些关键异同。还有更多,如果你目前正处于这些角色中的一个,你可能会经历一些与我描述的相似或不同的事情。总的来说,如果你处于一个不同的角色,并且在这两者之间做出选择,你就不会出错。这最终取决于你的喜好和你擅长什么。例如,我会将数据科学总结为统计学、机器学习和业务分析,对于机器学习运营工程,我会将角色总结为软件工程、机器学习部署专业知识、数据工程和 DevOps 的组合。数据科学家专注于手头的算法,而 MLOps 致力于算法的部署和自动化。
摘要
如您所见,这两个角色需要一些不同的技能,并有不同的目标,但同时,他们共享大量的技能,最终主要目标是相同的。与 MLOps 相比,我个人更喜欢数据科学家的角色,但是,我发现自己每天都在学习越来越多的 MLOps 工具和实践。我确实努力去了解一个 MLOps 人员所知道的一切,这样我就可以慢慢变得更有效率(而且很有趣)。这两个职位对公司都非常重要,所以如果你想对公司产生积极的影响,那么追求其中一个职位将是一个好主意。
总的来说,这里总结了两种角色
**Data Scientists:** business analysis, research, data, statistics, and Machine Learning algorithms**MLOps Engineer:** programming, Software Engineering, productionaliztion, DevOps, and automation
*我希望你觉得这篇文章既有趣又有用。*请记住,这篇文章是基于我对这两个角色的看法和个人经历。如果你不同意或同意,请在下面随意评论为什么以及你想补充的具体内容。你更喜欢做数据科学家,还是更喜欢做 MLOps 工程师?你认为他们应该合并成一个角色吗?真的有区别吗?从其他人那里获得一些见解将是有趣的,这样每个人都可以向其他人学习,以便找出数据科学和机器学习运营工程之间的异同的最佳代表。T 感谢您的阅读,欢迎随时查看我的个人资料或阅读其他文章,如果您对其中任何一篇有任何问题,请联系我。
这是我写的另一篇文章,涉及数据科学与商业分析 [5]:
参考
[1]照片由 LinkedIn 销售导航员在Unsplash(2020)上拍摄
[2]照片由Á·阿尔瓦罗·贝尔纳尔在Unsplash(2019)上拍摄
[3]Jefferson Santos 在 Unsplash 上拍摄的照片,(2017)
[4]照片由维罗妮卡·贝纳维德斯在Unsplash(2017)拍摄
[5] M.Przybyla,数据科学家与业务分析师。区别就在这里,(2020
数据科学家 vs 机器学习科学家:区别就在这里。
原文:https://towardsdatascience.com/data-scientist-vs-machine-learning-scientist-heres-the-difference-f82446dbc63e?source=collection_archive---------8-----------------------
意见
两个流行角色的异同
在un splash【1】上由 Fitore F 拍摄的照片。
目录
- 介绍
- 数据科学家
- 机器学习科学家
- 摘要
- 参考
介绍
这两个角色在招聘人员中有时是可以互换的,但是,如果你是其中一个角色的专家,你就会知道这是有区别的。这两个角色都关注机器学习算法,但他们的日常工作可能会非常不同。数据科学家往往更关注信用卡欺诈检测、产品分类或客户细分等用例,而机器学习科学家则关注信号处理、物体检测、汽车/自动驾驶和机器人等用例。下面,我将描述数据科学家和机器学习科学家在工作目标、奉献精神和技能方面的更具体的差异。
数据科学家
照片由斯蒂芬道森在Unsplash【2】拍摄。
数据科学家可能会看到更一致的工作描述,以及他们各自的教育和所需的技能。典型的数据科学家通常会与利益相关者一起定义问题,建立数据集,比较各种机器学习算法,输出结果,并解释和展示这些结果。数据科学家角色关注利益相关者之间的业务和协作。他们建立的模型往往不像机器学习科学家那样需要很长时间,比如几个月甚至几周,这取决于项目。
以下是作为一名数据科学家,你可以期望获得的一些教育和技能:
教育
- 本科或硕士学位
- 数据科学
- 统计数字
- 商业分析
技能
- Python 还是 R
- 数据分析
- Tableau 或其他可视化软件
- Jupyter 笔记本
- 结构化查询语言
- 回归
- 模型结构
- 倾向于 更简单的用例,如即席分类、时间序列分析等。
数据科学家通常会有商业或数据分析的基础,然后他们将能够使用代码(通常是 Python 或 R 语言)来使用这些编程语言的机器学习库自动进行预测。
通往数据科学家或机器学习科学家职位的道路也可能不同。例如,也许一名数据科学家开始是一名统计学家、业务分析师、数据分析师或商业智能分析师,然后成为一名数据科学家。对于一个机器学习科学家来说,这可能是一条路径,你开始是一名计算机科学家,软件工程师,物理学家,机器人工程师,或一般的工程师,然后成为一名机器学习科学家。当然,典型的路径不是必需的,你可以以自己的方式获得这些职位中的一个,记住你自己对机器学习的个人目标。
机器学习科学家
Bram Van Oost 在Unsplash【3】上拍摄的照片。
虽然数据科学家可以更专注于建立模型并将结果呈现给利益相关者,但机器学习科学家通常更专注于算法本身,以及围绕实现模型的软件工程。机器学习科学家在他们的头衔中也经常有单词“ 研究 ”。这意味着,在实现更简单的方法之前,您可能会更多地关注于研究一般的算法。总的来说,这些角色在不同的公司可能是相同的,所以无论你什么时候看职位描述,最终都要靠你自己来认识到它们的不同。最大的收获是,数据科学角色似乎更受欢迎,也更一致,这意味着他们的工作描述不像机器学习科学家那样变化多端,所以对这些技能要有所保留。
一些差异存在于所需的教育和技能上,我将在下面指出:
教育
- 面向博士学位
- 机器学习
- 计算机科学
- 机器人学
- 物理学
- 数学
技能
- 大量研究
- 信号与分布式系统
- OpenCV
- C++还是 C
- 质量保证
- 自动化
- 模型部署
- Unix 操作系统
- 人工智能
- 倾向于 更复杂的用例,比如自动驾驶汽车、自动机器人等。
机器学习科学家所需的技能往往包括更多的软件工程重点,例如 C++,以及更多的自动化和部署重点。此外,在一些工作描述中,我们会看到可能会有像物理或机器人这样的专业。
摘要
本文概述了这两个角色之间的一些差异和相似之处。有一点重叠,也有一些更清晰的区别。我也想发布这篇文章,希望人们能评论他们在这两种角色中的经历,因为我知道对于一些公司和员工来说,这两种角色可能完全相同,也可能截然不同。我亲自看到了这些差异,然而,这并不意味着对你来说也是如此。也就是说,我鼓励你探索这两个职位——不仅仅是文章,还有职位描述本身,因为这是你获得最准确和最适用信息的地方,尤其是每个公司。
总结一下,以下是数据科学家和机器学习科学家的主要区别:
*** Data scientists:** Python, R, statistics, visualization tools, perhaps faster paced, simpler use cases*** Machine learning scientists:** software engineering, research-focused, perhaps slower paced, more involved use cases
如果你想看机器学习科学家的例子,我还附上了一些真实的职位描述[4,5,6],因为我知道这些职位往往很少见。这也会让你自己看到不同之处。
我希望你觉得我的文章既有趣又有用。请随意在下面评论你认为这两种立场之间的相似或不同之处。如果你不同意或同意数据科学家和机器学习科学家之间的这些差异,请在下面发表评论。
请随时查看我的个人资料和其他文章,也可以通过 LinkedIn 联系我。我不隶属于上述任何公司。
参考
[1]2019 年在 Unsplash 上拍摄的照片
[2]Stephen Dawson 在 Unsplash 上拍摄的照片,(2018)
[3]Bram Van Oost 在 Unsplash 上拍摄的照片,(2019)
[4]的确,机器学习科学家/工程师(MLSys 2021)职位描述(2021)
[5]的确,机器学习研究科学家职位描述(2021)
[6]的确,机器学习科学家职位描述(2021)
数据科学家和企业机器学习:第 1 部分
原文:https://towardsdatascience.com/data-scientists-and-enterprise-machine-learning-part-1-79fde66d8461?source=collection_archive---------36-----------------------
介绍在生产中缩放和维护模型
机器学习模型的生产化,通常称为 MLOps,是每个分析项目的关键组成部分。作为一个概念,它相对较新,但自从它被引入以来,它已经飙升到机器学习词典中。这篇博客深入探讨了 MLOps(机器学习模型)和 ModelOps(基于规则的模型)的概念,揭示了它们为什么成为企业战略的重要组成部分,并关注数据科学家,因为他们在组织大规模部署这些模型时不断发挥关键作用。
Arif Riyanto 在 Unsplash 上拍摄的照片
数据科学家不是应用程序开发人员或软件工程师,或者他们这么说。然而,不知何故,数据科学家总是同时扮演多个角色,工作过于分散,而且往往管理着他们甚至没有创建的模型。与 DevOps 不同,数据科学家需要考虑多个因素—mlop、ModelOps、AIOps 和 DataOps(处理数据变化)。
成功 MLOps 的关键人物
机器学习/MLOps 生命周期涉及不同的角色和阶段,最常见的误解是数据科学家是唯一从中受益的人。主题专家(SME)、数据工程师、软件工程师、开发人员、经理和 ML 架构师是构成 MLOps“世卫组织”的人的例子。在这篇博客文章中,重点将是数据科学家及其在将机器学习模型投入生产中的角色和职责,以及 MLOps 每个阶段的流程描述。
数据科学家和操作人员
首先,MLOps 是一种方式,数据科学家可以通过它来了解模型在部署(或)到生产中后的行为,以及接受 A/B 测试的模型。数据科学家必须处理孤立的数据、工具和流程,这使得他们很难扩展他们的工作。MLOps 的概念正是为了在这方面扭转局面。大多数人/组织将数据科学家视为模型构建者,但事实远不止如此。数据科学家应该从一开始就参与进来,与主题专家一起构建业务问题和解决方案,而不仅仅是“训练和测试”模型。另一方面,现实是数据科学家与业务部门隔离开来,而强大的 MLOps 流程正好解决了这个问题以及随之而来的其他挑战。
就“谁”管理 MLOps 而言,问题的关键在于,绝不仅仅是数据科学家在管理这个项目。它需要整个组织中的一组不同的专家,他们在 ML 的生命周期中以这样或那样的方式发挥作用。
数据科学家通常在模型构建、测试和部署期间介入。一旦模型被部署,他们的角色是集中于监控模型质量,并确保它在生产中工作,正如它最初被设定的那样。顶级 MLOps 流程应允许数据科学家从测试中灵活选择最佳模型,并轻松部署它们。需要记住的另一个关键点是,无论模型是由谁构建的,数据科学家能够在需要时对数据管道进行调整和评估是至关重要的。数据科学家在模型方面的顾虑是数据总是在变化的。在某个时间点用于模型的训练数据不一定反映在另一个实例中出现的数据。这是一个机器学习问题,数据科学家应该能够判断模型性能是否随着时间的推移而下降。但是他们怎么知道呢?
地面实况与输入漂移
在不需要快速反馈的情况下,“基础事实”足以评估模型性能。地面实况将模型预测与实际事件进行比较。例如,在推荐系统中,基本事实是检查客户是否真的点击了推荐的项目。但是,如果数据科学家必须每天监控性能,这可能会有问题。此时,输入漂移可能是更好的方法。输入漂移基本上告诉我们模型训练的数据和通过的数据是否是真实世界的准确反映。这实质上意味着,如果训练数据和部署的模型之间存在显著差异,则模型已经受到损害。
MLOps 的组件
机器学习生命周期由五个关键部分组成。
- 发展
- 部署
- 监视
- 迭代和
- 管理
在 Unsplash 上由 Austin Distel 拍摄的照片
模型开发(EDA +特征工程)
作为一名数据科学家,建立能够监控模型性能的业务目标非常重要。换句话说,像“将欺诈活动减少到< 0.5%”这样简单的业务目标,对于数据科学家监控生产中的模型来说,与 KPI(关键性能指标)一样有用。
一旦完成,就数据和机器学习模型而言,有几个关键问题需要解决。像*‘有相关数据来建立模型吗?’、‘数据准确吗?’、‘从数据中可以得出什么样的特征?’、‘是否需要使用基本事实来标记数据(或者无监督学习是否足够?’、‘如何衡量关键绩效指标?*非常重要,也是 ML 生命周期中最艰难的部分。由于当今的大多数模型都是数据驱动的,所以只有执行探索性的数据分析来围绕数据构建一些假设才有意义。这通常使用统计技术或可视化来完成,如果不是两者都用的话。另一方面,特征工程获取原始数据,将其转换为更好地代表手头问题的特征,并将其用于机器学习模型。所有这些最终导致模型训练本身,其中其他重要步骤如特征选择、超参数调整和测试开始发挥作用。对于数据科学家来说,再现性是最重要的因素(能够再现在生产中表现良好的模型)。
模型部署和监控
模型部署通常有两种类型:模型即服务和嵌入式模型。模型即服务通常部署在一个框架中,以提供 API 端点(REST ),并在嵌入式模型打包到应用程序中并发布时实时响应请求。等待部署的模型通常是代码(例如 Python)以及一些与数据相关的工件。容器通常用作将机器学习模型部署到生产中的解决方案。像“Docker”这样的容器有助于在自包含的环境中部署,从而符合模型的特性。一旦模型投入生产,组织的不同成员就有不同的关注点。例如,DevOps 相关人员关心的是模型是否能快速完成工作,或者它是否使用了可接受的时间和内存。另一方面,业务关注点可能是检查该模型是否为组织增加了价值,或者该模型的收益是否超过了产生的成本。
迭代和治理
迭代模型是有原因的,有时是如上所述的数据漂移,或者在其他情况下——数据科学家刚刚找到了设计更好解决方案的方法。在任何情况下,它都是机器学习生命周期的重要组成部分。用新数据重新训练模型是迭代模型的完美例子。在每一次迭代之后,我们的想法是将模型度量与最*的“活动”模型度量进行比较。在数据漂移的情况下,数据科学家必须评估如何在模型中使用当前的训练数据(可能会删除某些功能或对数据进行采样),以使其得到更好的调整。在这种情况下,A/B 测试起着至关重要的作用,这将在第 2 部分中详细讨论。这篇博文不会深入探讨治理的概念。但是,对于数据科学家来说,要记住的关键事情是数据治理因素,如“PII(个人身份信息)的使用”和“所用数据的准确性”。
外卖食品
数据驱动的团队和组织无法回避这样一个事实,即在有效组织分析解决方案方面,MLOps 是一个显而易见的工具。同时,在不了解人员/流程/技术之间的相互作用的情况下,他们也不会同意实施这些措施。这篇文章旨在介绍 MLOps 的概念以及数据科学家在有效简化这一过程中所扮演的角色。
第 2 部分将通过关注 MLOps 实现的真实例子,深入探讨 MLOps 的“如何”以及在这篇博客文章中定义的过程。欢迎在下面留下您的评论或在 github 这里联系。
数据科学家其实只是产品经理。原因如下。
原文:https://towardsdatascience.com/data-scientists-are-really-just-product-managers-heres-why-b3e699c8296f?source=collection_archive---------25-----------------------
意见
冷门观点?
由 Icons8 团队在un splash【1】上拍摄的照片。
目录
- 介绍
- 业务和产品理解
- 利益相关者协作
- 摘要
- 参考
介绍
如上所述,这篇文章的标题可能是一个冷门的观点,但让我把它摆出来给你,看看你用新的视角怎么看。如果你还在上学,这种说法可能听起来很令人惊讶,但是,如果你已经在科技行业工作了几年,这种说法可能不会让你感到惊讶。当然,这种说法并不总是适用于所有人,但是当你指出这两个产品角色之间的相似之处时,它就变得非常接*了。也就是说,我将在下面概述数据科学和产品经理角色、所需技能和目标之间的一些相似之处。
业务和产品理解
雨果·罗查在Unsplash【2】上的照片。
当你作为一名数据科学家工作时,你必须了解业务、它的目标以及它的缺点,产品经理也是如此。这些角色之间的主要区别是实现其特定目标的方法,但总的来说,主要目标是相同的。这里有一个例子:
数据科学目标:
- 识别产品中的问题
- 使用数据科学模型作为产品问题的解决方案
- 将数据科学模型作为产品使用
- 用算法分析数据以预测未来数据
产品经理目标:
- 识别产品中的问题
- 对最关心的问题进行排序
- 查看数据以了解未来的数据趋势
当然,数据科学可以关注编码,但是如果没有对业务和产品的理解,数据科学模型可能是完全无用的。对这两种角色都有这样的理解是很重要的,因为这种知识是你如何提出后续步骤、流程、问题诊断和最终解决方案的基础。
在公司结构层面,你会看到数据科学家往往是部门之间的桥梁,或者是工程和产品两者的一部分。这一陈述本身就可以表明有相当多的重叠。
以下是这两种角色共有的一些技能:
- 数据探索
- 问题诊断
- 可视化工具( Tableau,Looker,Lucidchart 等。)
- 查询( SQL
除了角色之间共享的一些技能之外,还有一个类似的流程:
- 产品问题隔离或产品改进
- 数据分析
- 当前流程分析
- 解决方案(这是数据科学与众不同的地方,因为数据科学将创建模型,产品经理将组织这一步骤,包括结果、成本、时间表以及它将如何最终影响业务,但数据科学家也可以分担一些工作
- 结果展示
- 测试
- 行政批准/一般批准
- 履行
如您所见,一些技能、流程步骤以及数据科学和产品管理目标是共享的。有时,小公司没有产品经理,因此,数据科学家也必须担任这个角色。
利益相关者协作
照片由米米·蒂安在Unsplash【3】上拍摄。
当你作为一名数据科学家工作时,你将不得不与业务的几个垂直领域及其各自的利益相关者合作。产品经理也可以这么说。数据科学家和产品经理本身也可以是利益相关者。
以下是这些角色分享利益相关者协作的地方:
- 与软件工程师、数据分析师和高管等一起验证概念。
- 与上述角色相同的工作水*分析,等等
- 为这些角色安排会议
- 在步骤上更新这些角色
- 给别人分配工作
总的来说,数据科学家和产品经理都可以证明他们的工作是跨职能的,以及他们与谁合作,无论是数据分析师、销售人员还是软件工程师(等等。)。
摘要
本文的目的不是说一个角色比另一个角色好,而是强调两个角色在日常任务、所需技能、合作对象和总体目标方面有相当多的重叠。更具体的说,也许数据科学家只是有特殊技能,专注于算法的产品经理。
总而言之,数据科学家和产品经理有一些相似之处:
* Business and Product Understanding* Stakeholder Collaboration
我希望你觉得我的文章既有趣又有用。如果您同意或不同意这些角色之间的比较,请随时在下面发表评论。为什么或为什么不?你认为还需要指出哪些比较(或差异)吗?这些当然可以进一步澄清,但我希望我能够阐明数据科学家和产品经理之间的一些共同之处。感谢您的阅读!
我与这些公司都没有关系。
请随时查看我的个人资料、 Matt Przybyla 、和其他文章,并通过以下链接订阅接收我博客的电子邮件通知,或通过点击屏幕左侧的 的 订阅图标,如果您有任何问题或意见,请在 LinkedIn 上联系我。
订阅链接:https://datascience2.medium.com/subscribe
参考
[1]图片由 Icons8 团队在 Unsplash 上拍摄,(2018)
[2]Hugo Rocha 在 Unsplash 上拍摄的照片,(2019)
[3]照片由米米·蒂安在 Unsplash 上拍摄,(2018)
数据科学家不会很快离开
原文:https://towardsdatascience.com/data-scientists-arent-going-away-anytime-soon-ae97c1c5eb14?source=collection_archive---------38-----------------------
鉴于 OpenAI 的 GPT 的出现,程序员变得过时了
我花了一周的时间阅读 GPT x 模型,以及他们将如何革命性。我在屏幕前花了几个小时看人们在诗歌、编程、机器人对话、小说等领域取得的非凡成果。尽管很兴奋,但我还是半信半疑地阅读了一些文章和新闻,它们声称 GPT 模型将终结程序员和程序员的时代,一篇文章甚至编造了一个术语——狂热的程序员——并预言属于这一群体的人将悲惨地死去。
一个定格的故事!图像是使用上下文无关的语法生成的,通过这种方法,我们宇宙中的许多现象得到了控制,例如树木的生长。事实上,大自然可以制造简单的东西,也可以制造复杂的东西,比如人类和动物,这表明就教导机器而言,我们现在离那个过程还很远(图片由作者提供)
*权力越大,责任越大;*如果你是一名数据科学家,那么你必须采用经验科学方法来获取知识并得出结论。否则,又有什么意义呢!!!这些文章已经激起了我的兴趣,我决定在我简陋的机器上训练一个模型。我仍然在 GPT-3 的等候名单中,所以我最终使用了 GPT-2。 你可以阅读我在本文 中训练出来的哲学家的幽默成果。
训练人工智能哲学家非常有趣(有些人需要理解有趣的定义并获得生活),我不认为我在训练中做得很好,但整个练习提供了一个窗口,让人们了解这些强大的模型以及它们的能力。
是的,我钦佩他们背后纯粹的蛮力和他们产生的结果,但是称他们为程序员的死亡使者还为时过早。
以下是我根据自己的经验得出的看法:
可扩展性问题?
GPT-3 是巨大的(1750 亿个参数),GPT-2(15 亿个参数)也不小,所以关于模型的实时使用有两个因素要考虑:
1.程序员有多容易接触到它们?
2.他们训练起来有多容易,在生产模式下部署时表现如何?
第二个因素是我非常固执于在本地机器上训练模型而不使用 Colab 或 Paperspace 的想法。我的机器是不起眼的 Macpro-16”没有 GPU 支持(感谢 Nvidia 的 CUDA!不是!!)尽管调整超参数非常简单,但是所花费的时间随着时期的增加而呈指数增长。粗略估计,200 步训练需要 25 分钟。
OpenAI 有承认 这个问题的可扩展性和更大的公司的统治地位和从这样的技术中获益的关联问题。
数据科学家到底是做什么的?
如果你说这是简化论的宣传
Data Scientist = Programmer + some bit of Statistician + some bit of Data Modeler
是的,所有这些都是你在工作描述中找到的典型角色和职责,但是解决问题和业务方面呢?
理解问题陈述,使其具体化,制定解决问题的策略是更难的问题,不能藏在地毯下面。
你可以让一个复杂的模型来设计一个蓝盒子,但是为什么要设计蓝盒子(或者任何颜色的盒子)以及在解决周期的哪个阶段是重要的步骤。
我们信任机器了吗?
问问你自己,你准备好让电脑来处理你的日常生活了吗?我参加了一个符号学研讨会,客户最常见的抱怨是“ 我想和一个真人 说话”。North Face 最终将其客户代表从聊天机器人改为人类,他们看到了客户满意度的积极增长。
这告诉我们人类的倾向,以及同样的情况如何间接地适用于程序员。
即使人类不是一贯正确的,但机器也有一个不切实际的期望,这就是为什么在人类和机器和谐相处之前需要做大量的工作。
自动化不是已经存在了吗?
我遇到的大多数 GPT 生产代码的例子就像一个自动化的过程。你告诉机器你需要完成什么,机器就会帮你完成。到目前为止一切顺利!
自动化已经指日可待,并一直试图为自己创造一个空间,但至今没有成功。是的,有一些组织吹嘘建模过程的自动化,但是 更多的时候,甚至线性回归也是由人类在初始阶段 进行的;一旦达到稳定状态,自动化就开始了。
结论
1.尽管 GPT 模型令人难以置信,人类能够为机器提供如此程度的复杂性也很棒,但这些模型将使数据科学家和程序员过时,现在说这些还为时过早。是的,也许从长远来看这是可能的,但在未来 5 年内——不太可能。
2.见鬼。我们仍在努力解决猫和狗的识别问题,能够达到 97%准确率的模型相当笨重。GPT 模型也是如此,使用它们是资源密集型的。
3.我同意这些模型有它们的位置,并且肯定可以在解决问题的许多领域取代大量的人力,但是我们需要记住,在解决方案产生之前,复杂的问题涉及更多的组成部分,例如思考、澄清和结构化。在这种情况下,人类的智慧目前仍占上风:)
数据科学家的火的洗礼
原文:https://towardsdatascience.com/data-scientists-baptisms-of-fire-f99302d8b145?source=collection_archive---------34-----------------------
数据科学家的旅程中最重要的转折点是什么?
不要让树木阻止你看到森林。波兰 2021。作者照片。
很难判断一名数据科学实习生何时会成为真正的数据科学家。不像在军队里,我们没有与资历相关的明显的军衔。数据科学家的职业道路也不是线性的。在电子商务企业工作的数据科学家有物理学背景或医学领域的机器学习专家来自金融领域并不罕见。
在过去的几年里,也有越来越多的数据科学专家从专门提供机器学习或数据科学相关领域学位的大学毕业。这些项目自然旨在让候选人为职业生涯中可能发生的事情做好准备,尽管像往常一样,生活会很快验证他们的准备。而现实可能会在某个时候狠狠打击你。
在这篇文章中,我试图收集一些“转折时刻”,我看到这些时刻提升了我周围几个人的技能……包括我自己。我称之为“数据科学洗礼”的这些时刻是那些特殊的时刻,人们走出舒适区,将自己提升到新的技能、洞察力、能力和自信水*。
当你离开训练营的时候
当你离开训练营时,你满脑子都是理论。除非你是一个十岁就编写电脑游戏的书呆子,否则你的经验主要来自于解决实践练习和你在学校解决的挑战。您使用代码“完成任务”,但是您的模型在 Jupyter 笔记本上训练和生活。你还需要什么?
然后是第一份工作,第一个要求你将技能付诸实践的任务。不像在学校的挑战,这是真实的。它服务于一个真正的商业目的。你马上就会被扔进深水里。
合作
刚开始工作就被分配一个单独的任务是很少见的。以它为目标也不伟大。为什么?这是因为与更有经验的人合作会给你最快的成长。
对于一个早期的数据科学家来说,这个机会在几个层面上实现了自己。首先,你有希望看到正确的代码。创建的和经过深思熟虑的代码代表了一个做出伟大产品的谨慎决策过程。其次,你见证了交付和交流结果的过程。从代码审查、反馈、交叉检查到验证和展示结果,您开始理解标准和高质量的重要性。最后,通过参与一个合作项目,你会学到从长远来看能提高你生产力的工具。当有“好方法”或“你的方法”时,请选择第一种。
就我而言,合作在我的职业生涯中来得太晚了。这些年来,人们把相当不典型的任务委派给我。我的作品有强烈的个人特色。这种感觉很棒,功劳是我的,但在这场比赛中只有“我的方式”。结果,我变成了一个能解决很少有人能解决的问题的人,但却付出了不能解决其他人都能解决的问题的代价。坏主意。
为模特服务
创建一个基于准备充分且干净的数据的模型是一项简单的任务。许多图书馆会很乐意为你做这件事。当你想把模型从笔记本中分离出来,让它成为一个软件时,挑战就开始了。除非你是一名普通的软件开发人员,并且最*拓宽了你对机器学习的兴趣,否则决定代码结构和选择正确的抽象层次本身就是一项任务。
你看,你对数据科学越着迷,你的工作就越像软件工程。这种转变是学习在不造成“附带损害”的情况下更好地构建解决方案的自然结果毕竟,在这种情况下,你把时间花在解决你本来不会遇到的问题上是缺乏软件工程技能的表现。
对我来说,当我被要求为现有模型设计一个 API 并将其作为微服务时,那一刻就到了。“这不是我的工作。”——我以为。但是,当你坚持只做“你的工作”时,你的“工作”不复存在只是时间问题。
推向生产
当你第一次做的时候,把东西推向生产是一次令人激动的经历。这是一种直接的责任感。这意味着走出愉快舒适的沙盒,比如你的笔记本。
想象你正在发射一枚火箭。即使你的模型是一个简单的决策树,而不是 Elon 的最新怪物,它也打算实时服务于真实的人类。你检查所有的控制,确保一切都准备好了,然后再检查一遍……也许还要再检查一遍(以确保万无一失)。
我发现我的信心水*与部署过程的成熟度成正比。信任部署脚本就像信任用于攀爬的绳子一样。
思维分析
别再说软件了!虽然软件工程是数据科学家工作的重要组成部分,但编写软件并不是这个角色的本质。数据科学有一个独特的“探索性”方面,如果我错了,请纠正我,这是你进入这个领域的原因。
这种好奇心驱使的行为会让最聪明的人变得疯狂。不仅目标通常不明确,而且分析的对象(复杂的医疗数据、错综复杂的电子商务规则等)也不明确。)有时候会繁琐到五次方。即使有深厚的利基专业知识,图片可能是极其难以捉摸的。尤其是当您面对混合了数据不一致性、高容量和高维度空间的多个级别的分支逻辑时,甚至很难知道从哪里开始。
没人会告诉你航向。这是你的工作。你自找的!
说到航向
说到标题,“你对数据科学了解得越多”,你就越有可能找到我们应该去的地方。从技术上讲,这通常归结为设计数据管道和定位策略。通过开发、数据处理和数据分析的交错阶段,您可以构建您的第一个端到端系统,其中模型只是拼图中的一块。这是项目领导的起点。
这是一个重要的时刻——你被信任到足以负责一个技术解决方案的时刻。对我来说,因为我的创业经历,这件事发生得更早。这就是为什么我强调观察他人并向他们学习最佳实践的重要性。最后你可能会选择不走推荐的路,但是你要知道推荐的是什么。
管道标题和管道的标题
下一步是什么?那是我还没去过的地方。然而,根据观察,成熟或资历似乎是看模式的艺术。在您多次交付端到端解决方案后,您会看到什么?也许你会提取最方便和省时的路径,简化复杂的东西,提炼不复杂的东西。
大型科技公司(不仅仅是科技公司)经常引入新框架的原因是他们有机会观察他们的解决方案被广泛使用。作为普通工程师,我们是这些框架的消费者。那些在梯子顶端拥有技能和经验的人是框架的生产者。所以…不要让树木阻止你看到森林。
也许假以时日,我们也能成为一些流行框架的作者。当谈到我希望在技术上提供什么时,我会将它视为巅峰,尽管我完全知道技术之旅是一个永无止境的故事。总有东西要学。应该有。
数据科学家,不要把第一份工作放在创业公司
原文:https://towardsdatascience.com/data-scientists-dont-work-at-startups-for-your-first-job-45274957c3d6?source=collection_archive---------16-----------------------
数据科学体验
你会学到很多东西,但大部分可能都是错的
迪米特里·豪特曼在 Unsplash 拍摄的照片
“Oh,别担心,这个模型通常需要 8 个小时才能完成。”我当时的经理在我在这家人工智能初创公司工作的第二天告诉我。他让我在等待完成的时候做一些代码重构。
对于大型机器学习模型来说,八个小时听起来可能很正常,但这不是一个大型模型,它只是模型微调,而不是从头开始训练。
出于好奇,我输入了nvidia-smi
来查看我们用什么样的 GPU 来训练模型。然而,令我惊讶的是,我遇到了命令未找到错误。
我去找我的经理,提出了关于服务器没有任何用于培训的 GPU 的问题。“真的吗?不过服务器确实有 GPU,你能和 Tom 核实一下吗?”
果然,他确认我们的服务器是一个 AWS EC2 G4 实例,配备了一个英伟达 T4 GPU。
服务器确实有 GPU,但他们没有安装驱动程序来实际使用它进行模型训练。
我安装了驱动程序并重新运行了模型训练脚本。
模型在 5 分钟内完成训练。
还有另外两个数据科学家,他们都没有注意到 GPU 没有用于训练模型。其中一个是前软件工程师,刚刚转到数据科学,另一个是应届毕业生。
有些东西没有加起来,因为代码写得出奇的好,而且评论也很好。对于不理解你需要设置驱动程序来使用 GPU 进行模型训练的人来说,这太好了。
但是,在深入了解之后,我发现代码编写人员已经在系统迁移过程中离开了公司。之前,该公司从未使用过 GPU,但当他们改用新的更重的 ML 模型时,他推动了 GPU 辅助培训。
代码编写者是前独一无二的数据科学家,他修改了关于所需服务器类型的文档。但是,他对离职前安装英伟达驱动的事情只字未提。
我的发现发生在离开后六个月。
或许不出所料,这甚至不是我在这家公司工作一段时间后发现的最大问题。
以下是我在小型创业公司工作期间想强调的 3 个主要难点。
数据一切
在你的聘用合同中,他们可能会写下你是数据科学家。然而,大多数时候,如果你在一家年轻的公司工作,这意味着你也是一名数据工程师、数据分析师,有时甚至是数据输入专家。
或者,我喜欢称之为全栈数据科学家。
当然,坏的一面是你需要做很多(无薪)加班。另一方面,如果你仅仅作为一名数据科学家在大公司工作,你会有很多你永远不会得到的经验。
在我以前的工作中,我不必关心如何捕获和存储数据库中的数据,也不必关心如何设置基础设施来部署模型。我们有一整个部门来照顾他们。
现在,我也必须照顾这些事情,因为我们没有任何数据工程师或机器学习工程师。
亲身经历这些事情很有趣。这让我对整个系统的运作有了更深的理解。
最重要的是,我还被要求为我们的印度尼西亚客户创建新的测试案例,因为我是唯一一个会说印尼语的人。
第一次是令人兴奋的,但是随着我作为数据科学家的责任增加,这些杂七杂八的事情开始变得令人讨厌。期望越来越高,工作量越来越大,工作时间保持不变,即使我提出了我的担忧,也没有人帮助我,因为据管理层说,我自己“做得很好”。
好处是你可以感受到做数据科学以外的事情。也许你更喜欢做数据工程师,而不是数据科学家。我认识一个前同事,因为这个转了数据工程师。
工作-工作*衡
不,你不会有任何工作与生活的*衡,所以准备好接受工作与工作的*衡吧。
这个问题可能不适用于软件工程师,因为大多数初创公司至少有多个工程师一起工作,或者至少审查彼此的拉式请求。
对于数据科学家来说,这是一个完全不同的故事,因为周围通常很少有数据科学家。
较小的公司通常只有一个人负责一个特性、功能,甚至是系统中的整个组件。
我是主要部件的唯一开发者。即使代码通过了 PR 评审,我们也举行了关于组件的知识分享,猜猜如果出了问题会联系谁?
有一段时间,我工作了三个周末,并在周五休了一天年假去度假。在长时间加班后,我把我的工作笔记本电脑留在了工作岗位上。
可悲的是,我的手机上仍然安装了 Slack。
下午 2 点左右,我收到一个报告,说一个客户端的组件启动失败,该客户端的 PIC 就此与我联系。我向她解释说,我没有带工作用的笔记本电脑,但我很乐意指导某人如何解决这个问题。显然,这还不够好,因为每个人都很忙,她希望我尽快解决这个问题。
新加坡没那么大。你可以在一个小时内到达岛上的任何地方,但这并不意味着取我的笔记本电脑并把它带到酒店就不那么烦人了,我最终还是这样做了。
想起这个故事,我仍然很生气。我工作过的其他公司对年假或其他假期更加尊重。当有人休假时,我们会尽量不联系,除非是紧急情况。
证明文件
公司缺少文档让我很惊讶。
我们的 Confluence 页面有一些内容,但是大多数并不是真正的技术文档,而是试图向业务团队解释 ML 模型是如何工作的。
当我问及此事时,其他团队成员说,CEO 要求用通俗易懂的语言在文档中解释系统,以便业务团队在推广产品时使用。
好吧,对我来说很有道理,但这并没有回答一个更重要的问题。
为什么我们没有更具技术性的文档供数据科学团队自己使用?
工作几个月后,首席执行官问我正在做什么,因为他有一个新项目给我。
当他知道我花了两天时间来写我完成的一个新功能的文档时,他非常生气。他大言不惭地说他付给我多少钱,还说我写文档并没有为公司创造任何收入,这让我的工作浪费了时间和金钱。
不要误会,我在其他小的创业公司工作过,从来没有经历过这种情况。听到这种心态也让我震惊,但现在我想一想,从商业角度来看,这有点道理。
我试图向他解释,一份写得很好的技术文档会为公司节省资金,因为新加入者能够更快地理解系统,使他们能够更快地独立工作,但他不想听这些。
他不知道,在不久的将来,他需要雇用一名新的数据科学家。
结论
当我跳槽到一家新的创业公司时,我的朋友会说“你真幸运!你可以学到很多如何发展公司的知识。”是的,我相信你可以在小的创业公司学到很多东西,但要小心你学到的东西。
对我来说,最大的因素是在公司内部工作的人。更具体地说,是你工作时一起共事的人。公司文化也会塑造你的工作道德,以及你如何与同事互动,尤其是在你的第一份工作中。
成为一名全栈数据科学家从来都不是一件坏事,但你更有可能成为一名通才,而不是数据科学方面的专家。保持工作与生活的*衡对避免精疲力尽至关重要。作为程序员,尤其是数据科学家,编写文档应该是你的第二天性。
我的建议是,如果可以的话,先去比较知名的公司实习。通常,他们会有一些指导方针和标准,你可以从中学习并养成习惯。
记住,不同的创业公司会给你不同的体验。并非所有的初创公司都比更成熟的公司差,反之亦然。在加入他们之前,试着多了解一下这家公司。
学习一个新习惯比忘记一个旧习惯更容易。
这就是为什么最好立即学会如何正确地做事。一旦你学会了更正确的做事方式,你就可以将这些知识传授给更年轻的创业公司,甚至创建自己的创业公司。
尽管如此,不要把第一份工作放在创业公司。
数据科学体验是一系列关于我作为数据科学家和机器学习工程师的个人经历和观点的故事。 获得定期更新 上新故事和 成为中等会员 阅读无限故事。
https://chandraseta.medium.com/membership
感谢阅读!这里有一些我的其他文章,你可能会喜欢。
</5-things-i-learned-from-my-first-time-working-with-big-data-a6193deb982f> </5-questions-to-ask-yourself-before-deciding-to-become-a-data-scientist-c266172eb7af>
数据科学家:适应压力
原文:https://towardsdatascience.com/data-scientists-get-comfortable-being-stressed-192dd974a848?source=collection_archive---------57-----------------------
探索成为数据科学家的压力因素
路易斯·维拉斯米尔在 Unsplash 上的照片
介绍
我们常说有人“被爱情蒙蔽了双眼”,因为他们太迷恋自己所爱的人,以至于忽略了严重的危险信号。从本质上说,他们忘记了一个简单的事实,那就是他们也是人,和他们一样。
亲密关系并不是我记录这一壮举的唯一地方。我也在工作场所看到过这种情况。好吧,我们可能不会称之为“被爱情蒙蔽了双眼”,但“被炒作蒙蔽了双眼”听起来如何?互联网泡沫、2007 年金融危机、2017 年比特币崩盘,我会继续下去,但我相信你明白我的意思——人们越来越看好某件事,却没有太多考虑市场可能偏离均衡有多远。
哪里有炒作,哪里就一定有人群。我是不是无意中说了围绕人工智能和大数据有很多炒作?当然,这可能是数据科学被称为 21 世纪最性感工作的结果。然而,我不是说的是避免卷入人工智能和大数据。
大数据和人工智能将在本世纪人类的进步中发挥重要作用,我希望有更多不同背景的人出于正确的原因参与这一历史关键时刻,例如为他人提供必要的资源以提高生产力,人类的爱,以及解决世界上一些最困难问题的纯粹快乐。
对于一些受激情驱动的人来说,所谓的“压力因素”只会成为增长的燃料,而不是障碍,因为所有伟大的数据科学家都学会了接受他们工作中的黑暗面,这使他们能够在自己的载体中不断茁壮成长。在这方面,作为数据科学家,您将面临以下一些挑战:
问题解决
最明显的部分是,如果你不喜欢为了学习而犯错,那么数据科学可能不适合你。解决问题包括以有序的方式使用通用或特定的方法来寻找问题的解决方案(来源:维基百科)。尽管解决问题是缓解压力的一种方式,但任何由于炒作而决定成为数据科学家的人都会在工作的第一天被扇耳光。
作为一名数据科学家,每天都会带来新的挑战。一天之内,您可能会面临一系列问题,例如:
- 我们需要什么数据?
- 我们可以在哪里找到数据?
- 这个数据合适吗?
- 什么度量标准是合适的?
- 为什么我的代码不起作用?
- 为什么我的模型在测试集中失败了?
老实说,我真的可以永远继续下去!许多事情在数据项目中不起作用——这可能包括实际的项目本身。在我们找到工作流程中某个问题的来源之前,也可能需要几个月的时间,并且不要忘记在此期间,您仍然有其他利益相关者和团队成员在密切关注您的反馈或结果。
数据收集
许多人在 Kaggle 等竞争网站上获得了他们对数据科学的第一次体验。我不能指责这个*台,因为我自己也使用 Kaggle,因为我相信我可以从这个*台上获得很多价值。然而,这些竞争网站没有告诉我们的是,现实世界的问题需要更多的努力,然后我们才能开始尝试将模型拟合到任何数据或进行特征工程。
在现实世界中,团队的任务不仅是阐明问题并提出各种评估指标,而且当所有这些都完成后,您还必须收集必要的数据。
这怎么会是压力因素呢?
很棒的问题!在从事数据科学项目时,数据通常很少位于一个组织有序的位置。您必须从各种来源获得支持,并可能与多个团队协调,以获得访问所请求数据的必要批准。
“您对数据执行的分析只能与收集的数据一样好”
我们在数据科学领域的大部分时间并没有花在特性工程和构建酷的集成上。相反,您会发现 80%的时间都花在了收集和预处理数据上——这可能是工作流中最无聊的部分,但也是工作流中最重要的部分之一,因为如果出错,一切都会失败。
本质上,你将不得不把 80%的时间投入到数据科学工作流程中最无聊的活动上:)。
崇高的期望
数据科学已经被谈论了很多年了。当我们看到一个角色被宣传为利用令人兴奋的机器学习算法解决复杂问题的机会,可以对商业产生巨大的积极影响时——让我们不要忘记薪水——谁不会被说服呢?
人工智能在商业上仍处于萌芽阶段,这意味着在任何人开始解决这些问题之前,已经有相当多的基础设施事先到位,这意味着你可能会发现自己在做一些不一定在你的工作描述中的额外工作。
注意:我知道这是一个敏感的话题,因为有些人会争辩说他们的工作没有报酬,所以他们应该得到更多来完成任务(这一点非常有道理)。
此外,由于围绕数据科学的大肆宣传,新员工可能渴望利用他们的技能对业务产生重大影响。不幸的是,除非公司的核心产品是基于机器学习的,否则这种情况并不常见。如果没有,只期望给公司带来渐进的进步,这也许有一天会带来重大的影响。
故事的寓意:学会管理你的期望。
包裹
看起来,我似乎在试图讲述成为一名数据科学家的真实感受,但老实说,这不是我的本意。当你解决一个问题时的成就感——即使这个问题很小,只是找到合并 2 个表的代码。当你清理的数据开始变得有意义时,你感到的喜悦。当你交付给公司增加价值的项目时。你看到的成千上万的人想要成为数据科学家的竞争,不断地激发你的发展欲望。我相信所有这些都是真正让数据科学家变得美好的东西。
你越是接受这些“压力因素”,你的事业就越会兴旺。
在 LinkedIn 和/或 Twitter 上与我联系
如果你喜欢这个,你可能也会喜欢:
💔-traits-all-great-data-scientist-have-c43ab2de6e64> </5-hacks-to-overcome-data-science-imposter-syndrome-47cc45032e96>
数据科学家的 Python 高效编码指南
原文:https://towardsdatascience.com/data-scientists-guide-to-efficient-coding-in-python-670c78a7bf79?source=collection_archive---------1-----------------------
更好的程序员
我每天用来编写干净代码的技巧和窍门
在这篇文章中,我想分享一些我在过去一年里学到的编写更简洁代码的技巧——主要来自结对编程。总的来说,将它们作为我日常编码程序的一部分,帮助我生成了高质量的 Python 脚本,随着时间的推移,这些脚本易于维护和扩展。
想过为什么高级开发人员的代码比初级开发人员的代码看起来好得多吗?继续读下去,弥合差距…
我将给出真实的编码场景,而不是给出如何使用这些技术的一般例子,在这些场景中,我已经实际上使用了它们!这是 Jupyter Colab 笔记本如果你想跟着去的话!
1.使用for
回路时使用tqdm
。
想象一下在一个大的 iterable(列表、字典、元组、集合)上循环,并且不知道代码是否已经运行完毕!倒霉蛋,右!在这种情况下,确保使用tqdm
结构在旁边显示一个进度条。
例如,当我通读 44 个不同目录中的所有文件时,为了显示进度(这些文件的路径已经存储在一个名为fpaths
的列表中):
from tqdm import tqdmfiles = list()
fpaths = ["dir1/subdir1", "dir2/subdir3", ......]for fpath in tqdm(fpaths, desc="Looping over fpaths")):
files.extend(os.listdir(fpath))
将 tqdm 与“for”循环一起使用
注意:使用 *desc*
参数为循环指定一个小的描述。
2.使用type hinting when writing functions.
简单地说,这意味着在 Python 函数定义中明确声明所有参数的类型。
当我在工作中使用类型提示时,我希望我能提供一些具体的用例来强调这一点,但事实是,我经常使用它们。
这里有一个函数update_df()
的假设例子。它通过追加包含来自模拟运行的有用信息的行来更新给定的数据框,例如所使用的分类器、准确度得分、训练测试分割大小以及该特定运行的附加备注。
def update_df(**df: pd.DataFrame**,
**clf: str**,
**acc: float**,
**split:float** = 0.5,
**remarks: List[str] = []**
) -> **pd.DataFrame**: new_row = {'Classifier':clf,
'Accuracy':acc,
'split_size':split,
'Remarks':remarks} df = df.append(new_row, ignore_index=True)
return df
需要注意的几件事:
- 函数定义(
def update_df(.......) **->** pd.DataFrame
)中->
符号后面的数据类型表示函数返回值的类型,即本例中的熊猫数据帧。 - 默认值(如果有的话)可以像往常一样以
param:type = value
的形式指定。(例如:split: float = 0.5
) - 如果一个函数不返回任何东西,请随意使用
None
。例如:def func(a: str, b: int) -> None: print(a,b)
- 例如,要返回混合类型的值,假设一个函数可以在设置了标志
option
的情况下打印一条语句,或者在没有设置标志的情况下返回一条int
:
**from typing import Union**
*def* dummy_args(**args*: list[int], *option* = True) -> **Union[None, int]**: if *option*: print(*args*) else: return 10
注意:从 Python 3.10 开始, *Union*
就不需要了,可以简单的做:
*def* dummy_args(**args*: list[int], *option* = True) -> **None | int**: if *option*: print(*args*) else: return 10
- 在定义参数类型时,您可以想怎么具体就怎么具体,就像我们对
remarks: List[str]
所做的那样。我们不仅指定它应该是一个List
,而且它应该只是一个str
的列表。
为了好玩,试着在调用函数时向remarks
传递一个整数列表。您将不会看到任何错误返回!为什么会这样?因为 Python 解释器不会基于你的类型提示强制执行任何类型检查。
除了添加文档之外,类型提示对你的代码没有任何影响。
但是,包含它仍然是一个很好的实践!我觉得写函数的时候更清晰。此外,当有人调用这样一个函数时,他们会看到一个漂亮的提示,要求输入参数。
调用带有类型提示的函数时提示
3.对于参数数量未知的函数使用 args 和 kwargs.
想象一下:您想要编写一个函数,将一些目录路径作为输入,并打印每个目录路径中的文件数量。问题是,我们不知道用户会输入多少路径!可能是 2 也可能是 20!所以我们不确定在函数定义中应该定义多少个参数。显然,编写像def count_files(file1, file2, file3, …..file20)
这样的函数是愚蠢的。在这种情况下,args
和(有时是kwargs
)就派上用场了!
Args 用于指定未知数量的位置参数。
Kwargs 用于指定未知数量的关键字参数。
一个参数名
下面是一个函数count_files_in_dir()
的例子,它接受project_root_dir
和任意数量的文件夹路径(在函数定义中使用*fpaths
)。作为输出,它打印每个文件夹中的文件数量。
def count_files_in_dir(project_root_dir, *fpaths: str): for path in fpaths: rel_path = os.path.join(project_root_dir, path)
print(path, ":", len(os.listdir(rel_path)))
统计 Google Colab 目录中的文件数量
在函数调用中,我们传入 5 个参数。由于函数定义期望一个必需的位置参数,即project_root_dir
,它自动知道"../usr"
必须是它。所有剩余的参数(本例中为 4 个)被*fpaths
吸收,并用于计算文件数。
注意:这种吸收技术的正确术语是“参数打包”,即剩余的参数被打包到 **fpaths*
。
夸尔斯
让我们看看必须接受未知数量的关键字参数的函数。在这种情况下,我们必须使用kwargs
而不是args
。这里有一个简短(无用)的例子:
def print_results(**results): for key, val in results.items():
print(key, val)
用法与*args
非常相似,但是现在我们能够向函数传递任意数量的关键字参数。这些参数作为键值对存储在**results
字典中。从现在开始,使用.items()
很容易访问该字典中的条目。
我在工作中发现了kwargs
的两个主要应用:
- 合并字典(有用但没那么有趣)
dict1 = {'a':2 , 'b': 20}
dict2 = {'c':15 , 'd': 40}merged_dict = {**dict1, **dict2}*************************
{'a': 2, 'b': 20, 'c': 15, 'd': 40}
- 扩展一个现有的方法(更有趣)
def myfunc(a, b, flag, **kwargs): if flag:
a, b = do_some_computation(a,b)
actual_function(a,b, **kwargs)
注:check outmatplotlib 的 plot 函数使用 [*kwargs*](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.plot.html#matplotlib-pyplot-plot)
为一个图指定可选的修饰,如线宽和标签。
下面是我最*的一个项目中使用**kwargs
扩展方法的一个实际用例:
我们经常使用 Sklearn 的train_test_split()
来拆分X
和y
。在 GANs 项目中的一个项目中,我必须将生成的合成图像分割成相同的训练测试分割,用于分割真实图像及其各自的标签。此外,我还希望能够传递通常会传递给train_test_split()
的任何其他参数。最后,stratify
必须总是被通过,因为我正在处理一个人脸识别问题(并且希望所有的标签都出现在训练集和测试集中)。
为了实现这一点,我们创建了一个名为custom_train_test_split()
的函数。我已经包括了一堆打印语句来显示到底发生了什么(为了简洁省略了一些片段)。
def custom_train_test_split(clf, y, *X, stratify, **split_args): *print("Classifier used: ", classifier)
print("Keys:", split_args.keys())
print("Values: ", split_args.values())
print(X)
print(y)
print("Length of passed keyword arguments: ", len(split_args))* trainx,testx,*synthetic,trainy,testy = train_test_split(
*X,
y,
stratify=stratify,
**split_args
) *######### OMITTED CODE SNIPPET #############
# Train classifier on train and synthetic ims
# Calculate accuracy on testx, testy
############################################* *print("trainx: ", trainx, "trainy: ",trainy, '\n', "testx: ",
testx, "testy:", testy)* *print("synthetic: ", *synthetic)*
注意:在调用这个函数时,为了便于理解,我没有使用实际的图像向量和标签(见下图),而是用虚拟数据来代替。然而,该代码也应该适用于真实图像!
图 A 在函数定义中使用 kwargs 调用函数
一些需要注意的事情:
- 函数调用语句中使用的所有关键字参数(除
stratify
外的**)(如train_size
和random_state
)将作为键值对存储在**split_args
字典中。(要进行验证,请检查蓝色的输出。)
你可能会问,为什么不是stratify
?这是因为根据函数定义,它是一个必需的关键字专用的参数,而不是一个可选的参数。** - 函数调用中传递的所有非关键字(即位置)参数(如
"SVM"
、labels
等)。)将存储在函数定义中的前三个参数中,即clf
、y
和*X
(是的,它们的传递顺序很重要)。然而,我们在函数调用中有四个参数,即"SVM"
、labels
、ims
和synthetic_ims
。我们将第四个存储在哪里?
记住我们在函数定义中使用*X
作为第三个参数,因此传递给函数的前两个参数之后的所有参数都被打包(浸泡)到*X
。(要进行验证,请检查绿色输出)。 - 当在我们的函数中调用
train_test_split()
方法时,我们实际上是使用*
操作符(*X
和**split_args
)将X
和split_args
参数解包,这样它的所有元素都可以作为不同的参数传递。
也就是说,
train_test_split(*X, y, stratify = stratify, **split_args)
相当于写作
train_test_split(ims, synthetic_ims, y, stratify = stratify, train_size = 0.6, random_state = 50)
- 当存储来自
train_test_split()
方法的结果时,我们再次将synthetic_train
和synthetic_test
集合打包到单个*synthetic
变量中。
为了检查里面有什么,我们可以使用*
操作符再次打开它(查看粉红色的输出)。
注意:如果你想深入研究使用 ***
操作符进行打包&的话,一定要看看这篇 文章 。
4.使用预提交挂钩.
我们写的代码通常是混乱的,并且缺乏适当的格式,例如尾随空格、尾随逗号、未排序的导入语句、缩进中的空格等。
虽然手动修复所有这些是可能的,但是使用预提交钩子,您将会节省自己大量的时间。更简单地说,这些钩子可以通过一行命令— pre-commit run
为您执行自动格式化。
下面是一些来自官方文档的简单步骤来开始使用,创建一个 [.pre-commit-config.yaml](https://pre-commit.com/index.html#2-add-a-pre-commit-configuration)
文件。它将包含钩子来处理你所关心的所有格式问题!
作为一个纯粹的个人偏好,我倾向于保持我的.pre-commit-config.yaml
配置文件简单,坚持使用 Black 的预提交配置。
注意:需要记住的一点是,在您执行 *pre-commit run*
之前,文件必须被暂存,即 *git add .*
,否则,您会看到所有文件都将被跳过:
5.使用。存储常数的 yml 配置文件.
如果您的项目包含许多配置变量,如数据库主机名、密码、AWS 凭证等。使用一个.yml
文件来跟踪所有这些。您以后可以在任何 Jupyter 笔记本或脚本中使用该文件。
鉴于我的大部分工作旨在为客户提供一个模型框架,以便他们可以在自己的数据集上再次训练它,我通常使用配置文件来存储文件夹和文件的路径。这也是一个很好的方法,可以确保客户端在运行您的脚本时只对一个文件进行更改。
让我们继续在项目目录中创建一个fpaths.yml
文件。我们将存储图像必须存储的根目录。此外,文件名、标签、属性等的路径。最后,我们还存储合成图像的路径。
image_data_dir: path/to/img/dir*# the following paths are relative to images_data_dir*fnames: fnames_fname: fnames.txt fnames_label: labels.txt fnames_attr: attr.txtsynthetic: edit_method: interface_edits expression: smile.pkl pose: pose.pkl
您可以像这样阅读该文件:
# open the yml filewith open(CONFIG_FPATH) as f:
dictionary = yaml.safe_load(f)# print elements in dictionaryfor key, value in dictionary.items():
print(key + " : " + str(value))
print()
注:如果你想深入了解,这里有一个精彩的 教程 让你开始使用 yaml。
6.额外收获:有用的 VS 代码扩展.
虽然对于 Python 编辑器来说确实有很多不错的选择,但我必须说 VSCode 无疑是我迄今为止看到的最好的(抱歉,Pycharm )。为了更好地利用它,可以考虑从市场上安装这些扩展:
- 括号对上色器 —允许用颜色识别匹配的括号。
- 路径智能感知 —允许自动完成文件名。
- Python Dockstring generator—允许为 Python 函数生成文档字符串。
使用 VScode 扩展生成文档字符串
Pro-tip:生成 docstring(使用 *"""*
) 在 之后你已经使用类型提示编写了函数。这样,生成的 docstring 将包含更丰富的信息,如默认值、参数类型等。(见右上图)。
- Python 缩进——(我的最爱;由发布由凯文·罗斯发布)允许对多行运行的代码/括号进行适当的缩进。
来源: VSCode 扩展市场
- Python 类型提示 —允许在编写函数时自动完成类型提示。
- 待办事项树 : ( 第二喜欢的)在一个地方记录所有在编写脚本时插入的
TODO
。
跟踪插入到项目中的所有 TODO 注释
- Pylance —允许代码完成、参数建议(以及更快地编写代码)。
恭喜你离专业 Python 开发人员又*了一步。当我学到更多酷的技巧时,我打算继续更新这篇文章。一如既往,如果有更简单的方法来做我在本文中提到的一些事情,请让我知道。
直到下次:)
我喜欢写循序渐进的初学者指南、操作指南、面试问题、解码 ML/AI 中使用的术语等。如果你想完全访问我的所有文章(以及其他媒体上的文章),那么你可以使用 我的链接这里 注册。
* https://podurama.com/ https://varshitasher.medium.com/membership *
数据科学家:如何推销你的项目和你自己
原文:https://towardsdatascience.com/data-scientists-how-to-sell-your-project-and-yourself-41e44685cfc0?source=collection_archive---------10-----------------------
Canva 上 JohnnyGreig 的照片
遵循以下公式获得完美的电梯推介
在数据科学行业,仅仅成为一名熟练的数据科学家是不够的,你需要推销你的项目和你自己。推销想法或你自己的第一步是开发一个可靠的电梯推销,提供你的价值主张以及你的项目与其他项目的不同之处。在这篇博文中,我们将讨论电梯间推介的工作原理、内容,以及面向数据科学家的电梯间推介示例。
1.什么是电梯间推介
你和一位高管被困在电梯里,你只有 15 秒的时间来给自己和你的项目留下良好的第一印象。你说什么?你正在参加一个社交活动,一位行业领袖请你向她介绍你的项目。你能以简洁而有说服力的方式描述你的项目/产品吗?
在你的脑海里,你想说的是“你即将和我一起踏上一次将永远改变你一生的冒险。我是你一直在问自己的所有问题的答案,更重要的是,你需要一个确切了解你需要什么的伴侣”。对吗?但是我们知道这样做并不正确。你有 15 秒钟来吸引他们的注意力。我们需要能够提供紧密开发的电梯间推介。
2.为什么你需要知道如何做好电梯营销
出于两个原因,您应该学习如何为您的项目进行有效的电梯推介。首先,你可能想在工作或面试时展示一个项目。第二,对复杂的主题和想法进行简洁的描述是一种很好的练习——这正是数据科学家所做的!你可能不认为知道如何推销自己会让你更有效地完成工作,但电梯推销是进行演示和让数据科学项目听起来对他人有吸引力的绝佳练习。
3.成功的电梯间推介的要素
你会发现关于如何发展电梯营销的无穷无尽的建议和意见。然而,我认为我们应该系统地处理它,这意味着公式应该基于证据和研究。因此,这个公式来自市场研究领域…他们知道如何营销!!
您需要两个高级组件。你必须提出你的价值主张和你的差异化。
价值主张:
1)具体说明您的项目所针对的目标细分市场。很难让别人相信你正在做的事情会对每个人都有帮助。它还设置了项目的背景。
2)由谁对当前环境不满意来描述问题。
3)描述你正在开发的产品/服务,以及它正在解决的具体问题。
您的差异化:
1)描述备选方案(可能是您的竞争对手或目前可用的产品/服务)
2)描述不同于当前可用产品/服务的特定(非全部)功能或特性。
4.升降舵俯仰公式
对于[目标客户群/用户],
谁对[当前可用的产品/服务]不满意
我们的产品/服务是一种[新产品类别]
这提供了一种[关键的解决问题的能力]
与[产品/服务选择]不同,
我们已经组合了[针对您的特定应用的关键产品/服务功能]
5.我如何使用它们的例子
例一:
为政治选举的竞选经理、
对传统民调产品不满的人,
我们的应用程序是一种新型的轮询产品
这为提供了在 24 小时内设计、实施和获得结果的能力。
不同于其他需要 5 天以上才能完成的传统投票产品,
我们组装了一个快速、更经济但相对准确的投票产品。
例 2:
对于一线刑侦人员来说,
对显示过多不必要信息的通用仪表盘不满的人,
我们的应用是一种新型的智能产品
这提供了一个高度定制的、支持机器学习的风险评估工具,使调查者能够发现潜在罪犯的隐藏网络。
不像当前的仪表盘提供的信息通常不是很有用,
我们组装了一个智能产品,让他们能够在感兴趣的已知和未知演员之间建立联系。
这些是我用过的真实例子。这很有效,当然也抓住了他们的注意力。让我知道你的想法。
数据科学家——软技能太软,学会如何建立信任
原文:https://towardsdatascience.com/data-scientists-soft-skills-are-too-soft-learn-how-to-build-trust-6869a1fdcd13?source=collection_archive---------38-----------------------
你不需要人们喜欢你,但他们需要信任你。
西点军校奖杯点附*的“信任”长椅。戴夫·洛来自 Unsplash.com 的照片
“你不需要人们喜欢你,但他们需要信任你。”当我对一群学生大声说出这句话时,我有点惊讶。回顾我的数据科学职业生涯,建立信任可能是我需要在工作中不断磨练的最重要的技能。作为数据人员,你不会总是有好消息,而且有很多人知道如何操纵数据,所以人们为什么要信任你?
我记得我们花了 6 个月的时间让人们从说“你的 AB 测试*台有一个 bug”变成“你能帮我理解这些数字吗?”。我记得我被放在 10 多个农场运营经理面前,向他们解释这个模型是如何推荐管理他们的农场的。我记得报道过一个资深会员的产品发布会(即他们的工作宝贝!)她们休产假的时候。我记得我跟一个财富 100 强公司的高管说过,为什么他的宠物项目不适合机器学习。我记得把某人放在一个绩效改进计划(PIP)上,在那里他们确实感觉得到了支持(这是独立验证的)。这些都需要我过去的同事给予我极大的信任,对此我永远心存感激。另一方面,这些都是我工作描述的一部分,也是我被雇佣去做的。所以我应该小题大做吗?
事实证明,其中许多都是由其他数据科学家抛给我的。如果有团队说你的*台不靠谱怎么办?如果养殖管理者不相信你的推荐怎么办?如果我在你休假的时候对你的产品做些调整呢?如果这位高管当场解雇了我,那么有人会告诉他情况并非如此,那该怎么办?如果 PIP 有法律问题怎么办?每一个都有可能演变成更混乱的局面。
这就是我不喜欢推广软技能的原因——因为我遇到过能言善辩的数据科学家,他们可以描绘出一个关于数据的美丽故事,但我不会相信他们的任何一句话。在我关注数据科学文章的过程中,您一定已经看到了关于最后一英里问题的文章以及更多关于软技能的文章。实际上,我认为这些观点没有切中要害,因为数据科学家最终会发现自己处于软技能可能适得其反的境地。要么是因为你不想得罪某人,不想传达坏消息,或者不想处理善后事宜。我认为软技能通常被定义为旨在实现某些目标的人际交往技能。我要求我们在信任背后统一目标。不是最小化冲突,不是最大化联系,不是加速晋升,而是建立信任。
在构建产品时,信任可以引导数据科学家与他们的职能同行建立健康的推拉关系。我们都做出了一些妥协和贡献的产品往往是最健壮的。工程为规模而构建,设计专注于体验,数据科学为数据建模(即从看似冲突的数据中找出意义),产品执行愿景。当单一功能主导产品路线图时,事情往往会在以后出错。
我认为,通常的数据科学软技能是建立信任的间接方式:讲述有凝聚力的故事、在不同层面进行沟通、制作信息丰富的图表等。这些都是为你的想法争取支持的方法,但是你想要支持是因为人们信任你还是因为你说服了他们?根据我的经验,当人们没有按照我的想法行动时,这可能是由于人们无法表达的许多原因。但是我相信数据科学家的工作就是给这些直觉赋予精确性(是的,这叫做建模)。也许他们不相信它比其他选择更好,也许他们不相信如果出了问题你会支持他们,也许他们不相信市场需要你的产品,也许他们不信任你的数据来源,等等。找出不信任的来源将会对你大有帮助。
那么,如何建立信任呢?好吧,让我们向那些你不信任的人学习。他们做了什么让你不信任他们?就我个人而言,我遇到过:
- 说“你知道我的意思”的人很多。这让我觉得他们希望有人能为他们阐明一个更具体的例子。
- 绕圈子说话的人。这让我觉得他们不知道自己在说什么。
- 不先看就写报告的人。这总是让我怀疑他们是否理解他们正在制作的报告。
- 那些报告好得令人难以置信的数字,但不愿分享其代码或论文的人。这通常是数据窥探的第一个迹象。
- 人们不知道他们的数据来自哪里,他们的标签是如何定义的,或者收集数据有多难。
- 那些认为一旦拥有“所有数据”就不需要领域专家的人。这显示了对数据是如何创建的业余理解。
- 说跟进就不跟进的人。要么我们的项目不够重要,要么你没有组织能力。这两种情况都不会让你对合作产生信心。
- 那些反复证明他们没有注意你所说的话的人。
- 不承认错误的人。如果出了问题,我怎么知道你们是否会共同承担责任?
- …
有些问题比其他问题更严重,但它们似乎都有一个简单的解决方案。也就是说,我会第一个承认我不是无辜的。如果你想一直保持简洁明了的话,前两条是很难做到的。但这也是为什么建立信任是一项需要不断磨练的技能。
对于那些认为上述案例过于抽象的人,我多年来为自己开发了一些培训模块:
- 我能预测您在回答问题时会说的下两张幻灯片或句子吗?这表明我已经真正理解了你的信息。
- 当我发现自己漫无边际的时候,我可以用最多两句话来总结自己和他人吗?
- 对于我给出的每一个反馈,我可以举一些具体的例子吗?特别是如果我的面试反馈或者绩效考核被泄露,我会有什么感受?
- 我可以为新员工(他们问了很多问题)、支持团队(他们在第一线)和我的经理(他们需要弹药)总结一份报告吗?
- 有人问我问题吗?我是否愿意让别人来澄清我所做的选择?
- 我能主动提出能说服怀疑论者的必要结果吗?
- 如果需要完成我分配给其他人的任务,我能看到自己在做这些任务吗?
- …
还有很多其他的例子,但关键是从反面例子中学习,并通过行动证明为什么别人应该能够信任你。
尽管如此,我在职业生涯中获得晋升的道路并不*坦。虽然我以前的老板告诉我,人们只是认为我已经被提升了,但我确实认为在现实中,当涉及到提升时,“讨人喜欢”很重要。因此,鉴于不引发人们的即时防御反应应该是建立信任的一个要素,我肯定有改进的空间。但那是以后的事了,到目前为止,我不后悔。
数据科学家们,2021 年你们在学什么技能?
原文:https://towardsdatascience.com/data-scientists-what-skills-are-you-learning-in-2021-b52e72621eaf?source=collection_archive---------35-----------------------
TDS 聊天
由克里斯·本森在 Unsplash 上拍摄的照片
我希望听到您和 TDS 社区中所有人的意见!本周,我们想问你:
“你希望在 2021 年学到什么数据科学技能?”
我们很想知道你正在学习什么,如果我们能知道你为什么想学习这些技能以及你想用它们做什么就更好了?
欢迎在评论中分享你的想法和观点——我们期待着您的回复!
快点说!
数据科学家将在 10 年内灭绝
原文:https://towardsdatascience.com/data-scientists-will-be-extinct-in-10-years-a6e5dd77162b?source=collection_archive---------0-----------------------
为什么这不是一件坏事
Levi Bare 在 Unsplash 上拍摄的照片
随着人工智能的进步继续突飞猛进,基础层面的数据科学的可访问性变得越来越民主化。随着新数据初创公司的不断涌现(有些公司每天只需支付一杯咖啡的费用),以及所有强大的云计算消除了对昂贵的现场硬件的需求,传统的进入该领域的障碍(如缺乏数据和计算能力)已经被一扫而光。完成三位一体的先决条件是实现的技能和知识,这可以说已经成为数据科学最普遍的方面。人们不需要找很远就可以找到兜售标语的在线教程,如“在几秒钟内实现 X 模型”,“用几行代码将 Z 方法应用于您的数据”。在数字世界,即时满足已经成为游戏的名称。虽然可访问性的提高从表面上看并无坏处,但在令人眼花缭乱的软件库和闪亮的新模型之下,数据科学的真正目的变得模糊不清,有时甚至被遗忘。因为它不是为了运行复杂的模型而运行复杂的模型,也不是为了优化任意的性能指标,而是用来作为解决现实世界问题的工具。
一个简单但相关的例子是虹膜数据集。有多少人用它来演示一种算法,而不考虑萼片是什么,更不用说我们为什么要测量它的长度了?虽然这些对于初露头角的从业者来说似乎是微不足道的考虑,他们可能更有兴趣在他们的剧目中添加一个新的模式,但对于植物学家埃德加·安德森来说却不是微不足道的,他将问题中的属性分类,以了解鸢尾花的变化。尽管这是一个人为的例子,它证明了一个简单的点;主流越来越关注“做”数据科学,而不是“应用”数据科学。然而,这种错位不是数据科学家衰落的原因,而是一种症状。为了理解问题的根源,我们必须后退一步,鸟瞰一下。
数据科学有一个奇怪的特点,它是为数不多的让从业者没有领域的研究领域之一。药学生成为药剂师,法学生成为律师,会计生成为会计。数据科学的学生因此必须成为数据科学家?但是什么样的数据科学家?数据科学的广泛应用被证明是一把双刃剑。一方面,它是一个强大的工具箱,可以应用于任何生成和捕获数据的行业。另一方面,这些工具的普遍适用性意味着用户很少会在事实发生之前拥有所述行业的真正领域知识。然而,在数据科学兴起期间,这个问题并不重要,因为雇主们急于利用这项新生技术,而没有完全了解它是什么,以及如何将其完全集成到他们的公司中。
然而,*十年后,企业及其经营环境都发生了变化。现在,他们与大型根深蒂固的团队一起努力实现数据科学的成熟,并以既定的行业标准为基准。迫切的招聘需求已经转移到问题解决者和批判性思考者身上,他们了解企业、各自的行业及其利益相关者。浏览几个软件包或重复几行代码的能力不再足够,数据科学从业者也不再被编码能力所定义。无代码、autoML 解决方案如 Data Robot、Rapid Miner 和 Alteryx 的日益流行就是证明。
这是什么意思?
数据科学家将在 10 年内灭绝,或者至少这个职位将会灭绝。展望未来,统称为数据科学的技能集将由新一代精通数据的业务专家和主题专家承担,他们能够用自己深厚的领域知识进行分析,无论他们是否会编码。他们的头衔将反映他们的专业知识,而不是他们展示专业知识的方式,无论是合规专家、产品经理还是投资分析师。我们不需要回溯很久就能找到历史先例。在电子表格出现期间,数据输入专家是非常令人垂涎的,但如今,正如 Cole Nussbaumer Knaflic(《用数据讲故事》的作者)恰当地指出的那样,精通微软办公套件是最低限度的。在此之前,用打字机打字的能力被认为是一种专业技能,然而随着个人电脑的普及,这种能力也成为了一种假设。
最后,对于那些考虑从事数据科学职业或开始学习的人来说,经常参考你肯定会遇到的维恩图可能对你有好处。它将数据科学描述为统计学、编程和领域知识的融合。尽管每一个都占有相同份额的交叉区域,但是一些可能保证比其他的更高的权重。
免责声明:观点是我自己的,基于我的观察和经验。如果你不同意也没关系,欢迎富有成效的讨论。
没有数据工程技能的数据科学家将面对严酷的事实
原文:https://towardsdatascience.com/data-scientists-without-data-engineering-skills-will-face-the-harsh-truth-ff482a223ddc?source=collection_archive---------2-----------------------
意见
让自己为现实世界做好准备。
本·怀特在 Unsplash 上的照片
你可能读过一篇关于数据科学家和数据工程师之间区别的文章。我一直认为区别很明显。数据工程师准备好数据供使用,然后数据科学家处理这些数据。
然而,在我开始作为一名数据科学家工作后,我对这种区分的看法发生了巨大的变化。
数据科学的一切都是从数据开始的。你的机器学习模型和输入其中的数据一样好。垃圾进,垃圾出!没有适当的数据,数据科学家就不能变魔术来创造有价值的产品。
数据科学家并不总是容易获得正确的数据。在大多数情况下,将原始数据转换成适当的格式是数据科学家的责任。
除非你在一家拥有独立的数据工程师和数据科学家团队的大型科技公司工作,否则你应该具备处理一些数据工程任务的能力和技能。这些任务涵盖了广泛的操作,我将在本文的剩余部分对此进行详细阐述。
到底有什么区别?
我想就数据工程师和数据科学家的工作之间的关系发表我的看法。
数据工程师就是数据工程师。数据科学家应该既是数据科学家又是数据工程师。
这似乎是一个有争议的声明。但是,我想强调的是,在我开始从事数据科学家工作之前,我的看法是不同的。我曾经认为数据工程师和数据科学家是独立的实体。
在文章的剩余部分,我将尝试解释我所说的数据科学家应该既是数据科学家又是数据工程师是什么意思。
例如,数据工程师做一组称为 ETL(提取、转换、加载)的操作。它涵盖了从一个或多个数据源收集数据、应用一些转换,然后加载到不同数据源的过程。
如果一个数据科学家被期望执行 ETL 操作,我绝对不会感到惊讶。数据科学仍在发展,大多数公司没有明确区分数据工程师和数据科学家的角色。因此,数据科学家应该能够执行一些数据工程任务。
如果你只期望用现成的数据来运行机器学习算法,那么在你开始作为数据科学家工作后,你将很快面对残酷的事实。
您可能需要用 SQL 编写一些存储过程来预处理客户端数据。您也有可能从几个不同的来源接收客户端数据。这将是你的工作提取和组合它们。然后,您需要将它们加载到一个单独的源中。为了编写高效的存储过程,您需要大量的 SQL 技能。
ETL 过程的转换部分涉及许多数据清理和操作步骤。如果处理大规模数据,SQL 可能不是最佳选择。在这种情况下,分布式计算是更好的选择。因此,数据科学家还应该熟悉分布式计算。
你在分布式计算中最好的朋友可能是 Spark。它是一个用于大规模数据处理的分析引擎。我们可以将数据和计算分布在集群上,以实现显著的性能提升。
如果您熟悉 Python 和 SQL,您将不难习惯 Spark。您可以通过 PySpark 使用 Spark 特性,py Spark 是 Spark 的 Python API。
说到使用集群,最佳环境是云。有各种各样的云提供商,但 AWS、Azure 和谷歌云*台(GCP)是领头羊。
尽管 PySpark 代码对于所有云提供商都是相同的,但是您设置环境和创建集群的方式在它们之间是不同的。它们允许使用脚本或用户界面创建集群。
集群上的分布式计算是一个完全不同的世界。这和在你的电脑里做分析完全不同。它有非常不同的动力。评估集群性能并为集群选择最佳的工作线程数量将是您最关心的问题。
结论
长话短说,作为一名数据科学家,数据处理将是你工作的重要部分。我说的大量,是指你 80%以上的时间。数据处理不仅仅是清理和操作数据。它还涉及 ETL 操作,这被认为是数据工程师的工作。
我强烈建议熟悉 ETL 工具和概念。如果你有机会练习的话,会有很大的帮助。
认为你作为一名数据科学家只会从事机器学习算法的工作,这是一个天真的假设。这也是一项重要的任务,但它只会消耗你一小部分时间。
感谢您的阅读。如果您有任何反馈,请告诉我。
数据科学家,你需要知道如何编码
原文:https://towardsdatascience.com/data-scientists-you-need-to-know-how-to-code-9142b2dc74e8?source=collection_archive---------5-----------------------
不仅仅是代码,还要写出好的代码
罗曼·辛克维奇在 Unsplash 上拍摄的照片
我知道你在想什么——“我当然知道怎么编码,你疯了吗?”
你每天在 Jupyter 笔记本上写大量代码,数百行。显然,你可以编码。这并不是说你在手工或 Excel 中训练机器学习模型(尽管这是可能的)。
那么我可能是什么意思呢?
我不想打断你,但是科学家做的大多数编码数据我都不认为是真正的编程。您正在使用编程语言作为探索数据和构建模型的工具。但是,只要你创建的程序能完成工作,你就不会真正去想它。
你的代码通常是混乱的,甚至可能不会按顺序运行(多亏了笔记本)。您可能从未编写过任何单元测试,并且对如何编写良好的、可重用的函数知之甚少。
但是,随着数据科学越来越多地嵌入到实际产品中,这种类型的代码将不会削减它。你不能信任糟糕的代码,把你不信任的代码放到产品中会导致大量的技术债务和糟糕的用户体验。
“好吧,好吧,但是,我是数据科学家,不是软件工程师”,你说。我构建模型,清理代码是其他人的问题。虽然这可能在一些公司行得通,但就目前而言,我坚信一个更好的模式是让数据科学家学会如何编写更好的代码。你可能永远成不了精英级别的软件工程师,但数据科学家可以通过一些工作写出可信的代码并投入生产。
从你的功能开始
当学习如何提升你的代码时,从你如何写函数开始。大多数代码只是一系列函数(或者潜在的类),如果你能学会写相当好的函数,那将对提高你的代码质量大有帮助。
您的职能至少应该:
- 只做一件事
- 有文档
- 使用好的变量名
虽然有整本书都在讲述如何编写干净的函数,但这三项是一个很好的起点。
永远不要让一个函数感觉它在试图做一件以上的事情。一些迹象表明您的功能可能做得太多:
- 它比单个屏幕长,或者大约 30 行代码长(以我的经验来看)。
- 很难清楚地给你的函数命名,因为它做了太多的事情
- 它包含了 if/else 块中的大量代码,这些代码实际上应该被分解成独立的函数
只做一件事的函数很重要,因为它使你的代码更容易理解、管理和测试(稍后将详细介绍测试)。
任何发布到产品中的函数都应该有一个文档字符串,该字符串应该描述该函数的功能,给出关于输入参数的信息,并可能提供一些如何使用该函数的简单示例。将来,当您拥有记录良好的函数时,您会感谢自己,而其他人理解您的代码会容易得多。
最后,请使用易于理解和有帮助的变量名。太多的数据科学家不喜欢使用变量名,如“a”、“a1”和“a2”在试验时,输入简短、无用的变量名会更快,但是在将代码投入生产时,要确保你的变量名会帮助其他人理解你的代码。
删除打印报表
数据科学家经常使用打印报表来显示正在发生的信息。但是,在生产中,如果不再需要这些打印语句,则应该将其删除,或者将其转换为日志语句。
日志应该是您交流代码中的信息和错误的方式。Loguru 是一个很好的 Python 库,可以用来简化日志记录。它自动处理关于日志记录的大部分烦人的部分,感觉更像是使用打印语句。
使用样式指南
编程中的风格指南是用来让许多人更容易地处理同一个代码,但是让代码看起来更像是由一个人编写的。
为什么这很重要?
当你有一个一致的风格时,导航和理解代码就容易多了。令人惊讶的是,当使用样式指南时,发现一个 bug 是多么容易。遵循编写代码的标准方式将使您更容易浏览该代码以及其他代码。这意味着您不必花费太多时间来解释代码是如何格式化的,而是可以专注于代码做什么以及它是否正确和良好地执行。
PEP 8 可能是 Python 使用最广泛的风格指南。不过,外面有很多。另一个流行的风格指南来源是谷歌,因为他们已经公开了他们的内部风格指南。
重要的是你选择一个并努力坚持下去。一种更简单的方法是让您的 IDE 检查样式错误,并设置样式检查,以便在没有遵循样式指南的情况下阻止代码被推送。您还可以通过使用自动格式化程序来进一步提交,该程序会自动为您格式化代码。这些允许你写你想写的代码,然后在运行时自动格式化你的代码以符合标准。Python 的一个流行颜色是黑色。
编写测试
我发现大多数数据科学家害怕测试,因为他们不知道如何开始测试。
事实上,许多数据科学家已经在运行我所说的临时测试了。我发现数据科学家在他们的笔记本上快速运行一些新功能的“健全检查”是很常见的。您通过一些简单的测试用例,并确保函数按预期运行。
软件工程师称之为过程单元测试。
不过,唯一的区别是,数据科学家通常会删除那些临时测试,然后继续前进。相反,您需要保存它们,并确保它们在每次代码被推送之前都运行,以确保没有任何东西被破坏。
要开始使用 Python,我会选择 pytest。使用 pytest,您可以轻松地创建测试,并一次性运行它们以确保它们通过。一个简单的入门方法是创建一个名为“tests”的目录,在该目录中有以“test”开头的 Python 文件。例如,您可以使用“test_addition.py”
*# content of test_addition.py*
**def** add(x, y):
**return** x + y
**def** test_add():
**assert** add(3, 2) == 5
通常,您会在另一个 Python 文件中拥有您的实际函数,并将它导入到您的测试模块中。您也永远不需要测试 Python 加法,但这只是一个非常简单的例子。
在这些测试模块中,您可以保存您的函数的所有“健全性检查”。一般来说,不仅要测试常见案例,还要测试边缘案例和潜在的错误案例,这是一个很好的实践。
注意:有许多不同类型的测试。我认为单元测试是数据科学家开始测试的最佳测试。
做代码审查
最后,同样重要的是,在我们的列表中,为了写出更好的代码,最重要的事情是代码评审。
代码评审是指在您将代码提交到主分支之前,另一个擅长在您的领域中编写代码的人对您的代码进行评审。这一步确保遵循最佳实践,并有希望捕获任何不良代码或错误。
审查你的代码的人最好至少和你一样擅长写代码,但是即使让一个资历更浅的人审查你的代码也是非常有益的。
懒惰是人之常情,很容易让这种懒惰蔓延到我们的代码中。知道有人会审查你的代码是花时间写好代码的巨大激励。这也是我发现的最好的提高方法。让一个更有经验的同事审查你的代码并给你改进的建议是无价的。
为了让那些审查你的代码的人更容易,尽量保持新代码的数量少。小规模、频繁的代码审查效果很好。不频繁的大规模代码审查是很糟糕的。没有人希望被发送 1000 行代码来审查。这些审查往往提供更差的反馈,因为这个人不能花必要的时间一次真正理解那么多代码。
提高你的编码水*
我希望这篇文章能启发你花时间学习如何编写更好的代码。这并不一定很难,但是需要时间和努力去提高。
如果你遵循这 5 条建议,我相信你会发现你的代码质量有了很大的提高。
你未来的自己和你的同事会感谢你的。
查看我关于如何部署机器学习模型的免费课程。
数据科学可视化中的数据*滑
原文:https://towardsdatascience.com/data-smoothing-for-data-science-visualization-the-goldilocks-trio-part-1-867765050615?source=collection_archive---------1-----------------------
进入 LOWESS 和 B-spline 的温和之旅,并说明原因
股票图片来自https://pix abay . com/photos/wires-computer-wire-power-wire-3702104/
第一部——分段讲和
我们都听说过信息很美。但是生活发生了,我们发现自己试图美化现实中的混乱。这在数据争论中是正常的,但在可视化中也是如此,这取决于可视化所扮演的角色。这只是预测模型的探索性工作吗?还是一种事后呈现结果的方式?或者有时更多,例如,取决于我们对数据的期望。
如果我们考虑像维生素 D 血清水*在几个月和几年内波动这样的事情(见下文),我们有充分的理由在这个世界上——字面上是世界——期待它以一种可预测的方式波动,因为地球可以预测地围绕太阳旋转,而且地球大气也有更长期的趋势。我们可以预期,这是通过带有正弦函数项的最小二乘线性回归,或者通过其他一些单一的整体方程来实现的。那么我们的可视化本质上是包含在我们的线性回归模型的保护伞下。在这种情况下,我们的预测模型是,或者变成了,我们的*滑器。虽然更吵闹,但同样可以说是经济波动,它聚集了无数个人的活动,从而洗去了他们个人的意图。
维生素 D 血清水*,来自 Kasahara、Singh 和 Noymer (2013) ,经许可使用
然而,有时这些都不是事实,相反,我们试图想象一个单独的代理人按照自己的自由意志行动,或者一个类似的团体与这样的代理人一起行动。因此,正如他们所说,数据是非参数的,我们不一定期望通过一组系数来预测它是合理的。尽管如此,我们仍然希望或需要在我们的视觉化中*滑它,以便更好地解释它。这是我多次遇到的情况。令我惊讶的是,我的谷歌搜索从来没有出现过对一般问题的讨论,相反,我不得不分别搜索诸如洛斯*滑,或贝塞尔曲线等主题,直到我意识到它们是相关的,但不知道它们如何相互关联。经过一番努力,我现在知道了答案,所以我在这里分享它,这样它可能会帮助其他人:在我看来,数据*滑中需要解决的更普遍的问题。
公共领域https://snappygoat.com/
考虑一只鸟的飞行,也许是受本能的制约,但仍然按照自己的自由意志移动,或者甚至一群鸟跟随任何时候在前面的鸟。没有理由期望用一组系数来模拟轨迹是合适的,因为鸟(或鸟群)可能会在飞行中途改变其意图。
知识共享许可,来源https://en . Wikipedia . org/wiki/Hawking _(birds)
下面是一些对应于这种情况的 python 代码。重要的是,它使用了一个叫做分段的漂亮的 NumPy 函数。这很方便,因为 piecewis e 的广义概念似乎是数据*滑偏离线性回归等参数数据分析方法的决定性标准。而且,就时间序列数据而言,分段的想法在某种程度上代表了——或者至少与——整个变化原理在某个点被打乱的情况,因为代理人已经改变了主意,或者出于某些其他原因,所以之前的与之后的必须被不同地建模,而不是使用相同的一组系数。
第一部分包含两个函数:鸟儿改变飞行计划前的轨迹的曲线 1 ,以及之后的曲线 2 。
如果分别绘制,两条曲线将如下所示:
作者创建的图像
我构建的特定分段函数有两个部分:第一部分基于三次多项式(红色),后一部分基于同一个三次多项式和正弦函数(蓝色),生成我们假设的鸟的飞行。也许这只鸟正在盘旋,以捕捉花朵或树枝上的一些猎物(在零时间捕捉),之后它上下猛扑,然后飞走。我们将把这个时间序列作为我们假定的基本事实。
请特别注意这一行:
它允许一系列 lambda 运算符作用于数据范围的不同部分,对低于 0.2 的范围实现函数 curve1 ,对高于 0.2 的范围实现函数 curve2 。
作者创建的图像
如果这些数据点是从高帧速率的视频中提取的,那么信息就已经很漂亮了,你不需要做任何数据*滑。您可以将其绘制成简单的散点图,或者这些散点图点的线性插值(线性样条),如下面的代码和附图所示。
作者创建的图像
作者创建的图像
哎呀——这根本不是我承诺要讨论的混乱局面。相反,这些数据开始时就像雪佛兰科尔维特的轮廓一样漂亮,没有必要大惊小怪。然而,我们已经为鸟类飞行路径的这个特定实例建立了地面事实,当我在下一节中讨论混乱时,我会回头参考它。它考虑了一群嘈杂的数据和稀疏的样本数据,即金发三重奏(接下来是深入 lowess 和 B 样条*滑的部分)。
第 2 部分-*稳和不*稳的味道:金发三重奏
照片由 Pixabay 从像素拍摄
在上一节中,我阐述了一般的数据*滑问题,它有时不同于预测建模、预测建模的准备或预测建模的演示。有时这两者都不是,我们仍然希望*滑。一只鸟的飞行路线就是这种情况的例子,它可以在飞行中改变它的意图。意向改变前的与意向改变后的由一个 NumPy 分段函数建模,该函数使用一个 lambda 算子列出两个要应用的曲线函数:一个用于较低范围(意向改变前),另一个用于较高范围(意向改变后)。分段的思想是通过普通(整体)回归*滑和其他*滑(或建模)方法(非参数)之间的区别的核心,这些方法没有在整体意义上预测的意图。
为了提醒您,这里有一个通过分段函数生成的基本事实的图表(上面显示了它的 python 代码)。
作者创建的图像
正如我在上面提到的,如果这些数据点是从高帧率视频中的帧中提取的,那么信息就已经很漂亮了,你不需要做任何数据*滑。
但是,如果不是一只鸟,而是一群鸟呢?假设,作为我们的地面真相,与上面相同的轨迹(而不是照片中有趣的漩涡),下面是一些 python 代码来综合这一点,并将其绘制为散点图。
Airwolfhound(CC BY-SA 2.0)
为了模拟这种群集的情况,我们使用与前面相同的基本原理,用上面相同的 python 代码来设置这种情况。
下一个代码块使用 NumPy 的随机数生成器生成噪声,它修饰了我们已经有的分段曲线。
这是它的图表,正如上一节所示:
作者创建的图像
现在数据是有噪音的。为了美化它,我们必须把它弄光滑。更多信息请见下文。
另一种情况是,相对于地面真实数据的曲率,我们对数据的采样过于稀疏,例如较低帧速率的视频或定格摄影。这就是你在下面的照片中看到的,这是一只鸟在飞行中不同时间的帧的合成。
单只鹈鹕飞行的单个帧(动作序列)的合成(唐·麦卡洛CC执照
在 python 代码中,这很容易模拟。我们可以通过 NumPy 数组索引的步进增量来实现,如下面的代码所示:
…后面是生成图形的常用代码:
作者创建的图像
请注意,这个散点图的印象并不*滑。我们不能真正在视觉上“连接这些点”,因为这仅仅提供了对地面真相的粗略追踪。同样,我们需要*滑它。
金发女孩三人组:太吵,太稀疏采样,或者‘刚刚好’
现在让我们把所有这些放在一起看。当谈到视觉化时,有三种关于*滑度的情况。要么是*滑,要么是噪音太大,要么是采样太稀疏。如果是后两者中的任何一个,我们必须应用适当的*滑器来使它“恰到好处”。换句话说,在某种程度上,我们的地面真理是*滑的,基本上有两种方式它无法在我们呈现的数据中体现出来。
金发三重奏,关于*滑:太吵,太稀疏采样,刚刚好(图片由作者提供)
为了*滑这些数据,我们必须首先猜测和评估这种不*滑是通过哪两种方式发生的,然后部署适当的方法,通过消除我们现有数据的不*滑来进行*滑,也就是说,通过恢复、重建或重新增强丢失的*滑。我们将在下一节(第 3 部分)开始讨论这个问题,这一节将考虑*滑噪声数据的方法。
照片由Eli Solidum(CC BY-SA 4.0)
**重构代码:**在开始*滑噪声数据的方法(如下)之前,我在这里展示一个 python 代码的重构,这样我们就不必在每次绘图时都重新编写所有的 matplotlib 设置。相反,我给出了一个名为 graph 的函数,其描述在文档字符串中提供。正如你将看到的,这种重构也有助于聚焦我们将尝试的所有*滑方法之间的精确区别,包括那些成功的方法。
使用此功能,前三个图形(如上所示):
作者创建的图像
简单编码如下:
接下来的三个图表(上面显示的是最*的情况)
作者创建的图像
编码如下:
第 3 部分-噪音将是噪音
托尼·阿姆斯特朗-斯莱https://www.flickr.com/photos/tonyarmstrong/46262738422,知识共享许可
在上面的第一部分中,我们考虑了通过*滑来美化杂乱数据的整体问题。这可以用一个时间序列来解释,这个时间序列代表一只假设的鸟的飞行轨迹,这只鸟的意图可能会改变,因此期望一组系数来模拟它的整个飞行是不合适的,然而我们仍然可能希望*滑数据来代表它,以便进行视觉检查。在第二部分中,显示了由于两个不同的原因,数据可能是不*滑的:(1)不是一只鸟,而是实际上一群鸟,因此一些随机波动区分了鸟群中许多鸟的飞行路径;或者(2)对一只鸟的飞行取样太少。连同*滑的地面真相,我称之为金发三重奏,因为我们的视觉渴望*滑的‘恰到好处’状态(而不是嘈杂或过于稀疏采样)。*滑需要识别这些情况中的哪一个在起作用。
绘制噪音图
假设是鸟群的情况。所以数据噪音太大。让我们考虑一些处理这个问题的方法,一些尝试*滑数据的方法。
线性插值
如果您只是将噪声数据放入 matplotlib 线图函数(或按 Excel 中的线图按钮),就会发生这种情况。我没有重复整个 matplotlib 设置,而是使用了我在前一节(第 2 部分)末尾介绍的有点通用的 graph 函数。这样,我们只需要两个相关的函数调用:
作者创建的图像
除非我们试图绘制一只精神分裂蚊子的轨迹,否则这个简单的线性插值图似乎完全不合适——远非*滑移动。然而,我们至少可以借此机会观察一下这里到底发生了什么,因为这在下面的后面部分会派上用场(我保证)。正如我们所见,每对连续点中有一条直线直接连接两点,这条直线带有斜率(y₂-y₁)/(x₂-x₁).当然,它连接了点,从一个数据点到下一个数据点的直线显然是*滑的。然而,这不是我们想要的那种光滑。
线性回归
如果你读到这里,你可能已经沉浸在数据科学中,足以知道你几乎不能打开它的大门而不被最小二乘线性回归击中,这是最方便和最通用的数据建模方法之一。在这种情况下,没有必要进行交叉验证和正则化的整个兔子洞,让我们看看当我们试图使用它*滑我们的数据时会发生什么,使用 NumPy 提供的简单线性回归(polyfit
),它提供了我们可以绘制的斜率(m
)和 y 截距(b
)。
作者创建的图像
如果这种情况敲响了警钟,你可能在安斯科姆的四重奏中听到过(或看到过)类似的东西。尽管对于这些数据点来说确实存在一条最佳拟合的直线,但是这条线缺少*滑这些数据所需的特定曲率——这条线严重地低于其。在这种情况下,线性回归就像一头公牛径直穿过瓷器店。因此,如果你想为这一鸟群建模,简单的线性回归不是你要找的 boids 。
三次(及更高次)多项式回归(多项式回归)
但是等等,线性回归可以做曲线!加入一个二次或三次项。现在我们实际上有了一个关于鸥群轨迹的像样的描述。(如果您还记得生成地面真实数据的 NumPy 代码包含一个三次多项式,这就不足为奇了。)图表(下图)在开始时有一个浅的隆起,在后半部分逐渐*滑地向上弯曲。到目前为止一切顺利。然而,考虑一下这张图遗漏了多少我们的基本事实轨迹。在 t =1 之后的明显凸起,更不用说就在 t =4 之前的轻微向下倾斜。我们真的只能做到这样吗?还是我们没有给这群人应得的?
作者创建的图像
现在让我们试着用一个奢侈的 20 次多项式来深入到轨迹的所有角落。将其与地面真实散点图进行比较。并将其与三次多项式图进行比较。
作者创建的图像
前半段的浅驼峰:检查,在那里。在 t =1 之后的明显凸起(我们的三次线性回归没有捕捉到)——是的,现在就在那里:检查。就在 t =4 之前的轻微向下倾斜?是的,它在那里。嗯,算是吧。请注意它是如何滑稽地俯冲直下地面,就好像整群鸟突然选择了神风敢死队集体自杀。不仅如此,开头(这里 t =-3)有一群鸟突然像一群直升机一样直直地向上飞。这是过度拟合的多项式回归的一个已知问题:拟合在数据的极端边缘必然会有很大的变化。边缘并非不真实,因为只是样本框架的任意性导致这些特定数据点位于边缘。尽管它捕捉了其轨迹曲率的一些独特的细微差别,但 20 次多项式回归并没有*滑数据,相反,如果考虑边缘,则描绘出它比它更不稳定(相对于假设的地面事实来考虑)。
Pixabay 许可——免费用于商业用途——无需署名
关于数据*滑背景下回归的注释
关于数据*滑与建模和预测的关系,还有一个更大的问题。每个回归(线性、立方和 20 次)都试图提供一个单一的方程(一组系数)来预测整个轨迹。这个数据是一个自由行动的代理人的行为的数字表示,或者在任何时候都有一个领头鸟在前面的团体。我们真的认为这种自由行动的主体(像鸟或鸟群)不能改变他们选择飞行路线的想法吗?(回归模型似乎暗示他们的命运是注定的。)更重要也更实际的是,对他们的数据进行*滑处理是否必然需要这种假设?
好像不是。相反,这个假设对于手头的任务来说是多余的。正如我将要展示的,数据可视化技术在这里为您提供了支持。有一些方法可以*滑鸟的数据,而不需要假设鸟是没有自由意志的机器人,也就是说,不需要一套系数来控制整个飞行。事实上,追踪一只鸟(或多只鸟)的行为超越了标准回归提供一套系数的效用。因此,尽管我们可以用多项式项对线性回归进行特征设计,以产生一些紧密拟合的*滑曲线,但这必然会使所有数据的超集过拟合,包括在飞行中做出不同决定的鸟(或鸟群)。因此,试图通过回归建模来进行*滑实际上是不明智的,或者主要是不真诚的,或者两者兼而有之。
移动*均线
因此,现在让我们把它调低一点,尝试一种技术上更温和的*滑方法,这可能是许多曾经关注过数字数据的人所熟悉的。移动*均线是另一个常用的方法。这里,我们有一个移动窗口,每次滑动一定数量的数据点(比如一次 5 个),在每个连续位置计算算术*均值,并绘制成一个点。或者换句话说,你可以把它想象成水流过一个管道,这个管道在任何给定的时间都有一定量的水。如果你在任何给定时间重复测量管道中所有水的温度,那也将是从头到尾流经管道的所有水的温度的移动*均值。
作者创建的图像
注意好处。曲线上没有变化很大的部分。也没有试图用一组系数来确定鸟的代理自由的迹象。相反,移动*均线是完全分段的。是啊!我们到了!(有吗?)或者我们已经兜了一圈——从良好的意义上来说——因为我们知道我们的基本事实(一只领先的鸟在飞行中改变它对飞行路径的想法以及模拟它的相应 NumPy 函数)确实是分段的,无论是在原则上还是在数据点如何计算的相应技术意义上。
请注意主要的缺点。它不是很光滑。它仍然是锯齿状的,尽管它的锯齿状没有简单的线性插值那么明显。但它并不光滑。它充满了锋利的边缘,就像一群愤怒的痉挛机器鸟。
在下一节中,我将讨论稀疏采样的数据,并在随后的章节中按照承诺使用 lowess 和 B 样条*滑。
第 4 部分-*滑的不同方向
https://pix abay . com/photos/parrot-blue-macaw-fly-bird-wing-2796743/pix abay 牌照
提醒一下,作为一个考虑可视化数据*滑方法的例子,我们选择了一只鸟的飞行,它的飞行意图可能会在飞行过程中发生变化,因此我们不能假设整个飞行路径可以用一组系数来预测(如果我们用线性回归建模,甚至用多项式“特征”来建模,我们就会这样假设)。下面是假设的鸟类飞行地面真相的散点图:
作者创建的图像
如上所述,这不需要*滑。然而,我们拥有的数据可能会有足够的噪声来保证*滑(例如,如果它是一群鸟),或者采样过于稀疏,因此它也保证*滑(例如,如果它是从低帧率视频镜头中获得的数据)。
最后一节考虑了噪声数据情况下有缺陷的*滑方法。这个考虑了数据过于稀疏采样的情况。本节总结了*滑的总体策略,同时考虑到噪声和稀疏情况。
照片由穆罕默德·马利克拍摄——https///www.flickr.com/photos/malikdhadha/502497373
采样过于稀疏的数据
让我们看看当我们使用简单的线性插值来*滑稀疏采样数据时会发生什么。回想一下,我们可以通过在数组步长操作符中使用大的sampling_increment
来生成(或模拟)稀疏采样,如下所示:
正如上面第二部分末尾所介绍的,我将使用一个自制的 graph 函数来避免每次都重复相同的 matplotlib 设置代码。
作者创建的图像
当然,在有些情况下,这种敷衍的表情是完全令人满意的,例如,如果我们对我们所拥有的数据点之间可能发生的事情不做任何假设。因为鸟是一种在实际物理空间中移动的生物,所以这不是其中的一种情况。相反,我们期望这只鸟在我们拥有的不充分的数据点之间以一种稍微*滑的方式移动。我们绘制的简单线性插值代替了推断——强加!—对鸟不适当的急动。它不是令人满意地*滑。
与上一节讨论的噪声数据一样,我们也可以使用这种稀疏样本数据尝试最小二乘线性回归:
作者创建的图像
结果还是不令人满意。直线严重不足。显然,它根本没有捕捉到真实的鸟飞行轨迹的轮廓。
多项式回归(具有多项式特征的线性回归)
让我们看看三次多项式回归捕捉飞行轨迹曲线的能力有多强:
作者创建的图像
至少这呈现了一条*滑的曲线。然而,它缺少地面真相在 t =1 之后的凸起和在 t =2 之后的下降。
如果我们尝试一个 6 次多项式呢?
作者创建的图像
当然,这在某些方面稍好一些,但远不能令人满意。虽然它捕捉到了紧接在 t =1 之后的凸起,随后是在 t =2 处的俯冲,但它让鸟在 t= -3 处直线下降到地面,在 t =3 处钻入地下,然后立即突然进入*流层。
在这一点上,我们可能会考虑我们是否仅仅被稀疏度本身所困扰,从而将*滑度推得遥不可及。因此,让我们将采样增量从15
缩小到9
。
作者创建的图像
作者创建的图像
随着采样增量越来越小,三次多项式没有提供任何改进。6 次多项式实际上仍然不足。它增加了一些细微差别,但仍然错过了 t =2 之前的凸起和凹陷,并且——像通常的过度拟合多项式回归一样——开始偏离标记(鸟突然从地面出现,而不是像地面上那样水*飞行)。
移动*均线
为了完整起见,让我们考虑将移动*均线作为稀疏采样数据的潜在*滑器。
作者创建的图像
尽管移动*均图捕捉到了这只鸟轨迹的一些重要特征,但与其说它*滑,不如说它不*稳。回到我们最初的,更加稀疏的采样率sampling_increment=15
给了我们一个稍微*滑的轮廓,但是没有我们的鸟的飞行路径的所有明显的凸起和俯冲。
作者创建的图像
回顾
通过前四节(包括这一节),我们已经考虑了一只鸟(或一群鸟)的飞行轨迹,记住我们不能假设一组系数模拟了它的全部,因为原则上鸟的意图会改变,因此根本不一定是可预测的。我们遇到了两种情况,其中我们拥有的数据是不*滑的,因此我们倾向于*滑它。一种情况是数据有噪声(如在一群鸟中),另一种情况是数据采样过于稀疏。对于这两种情况,我们尝试了许多可靠的*滑方法:
- 线性内插法
- 线性回归
- 多项式回归(具有多项式特征的线性回归)
- 移动*均数
我们发现所有这些方法都不足以完成*滑的任务,无论是对于有噪声的数据(鸟群)还是对于数据采样过于稀疏的情况。
由布罗肯·伊纳荣耀——自己的作品,CC BY-SA 3.0,https://commons.wikimedia.org/w/index.php?curid=2154634
现在怎么办?
将要解释的适当的方法将利用这些方法的最一般的方面,特别是聚集或插值、,但是以更定制的方式。具体来说,我们的方法将由这种情况与我们的金发女孩比喻的关系来指导:
金发三重奏:太吵,太稀疏,和“刚刚好”(*滑)。(图片由作者提供)
具体来说,在数据过于嘈杂的情况下,我们会通过某种细致入微的聚合来*滑数据。当数据采样过于稀疏时,我们将通过某种细微的插值来*滑数据。通过聚合我指的是回归和移动*均的方面,它将多个数据点提取为更少的数据点(这些数据点是合成的而不是实际的)。通过插值,我指的是线性插值的一个方面,即在每对连续的实际数据点之间创建多个数据点(线性连接)。通过这些不同的方法,适当地选择,我们将使不*滑的数据“恰到好处”
作者创建的图像
具体来说,下一节解释我们如何使用 lowess 来*滑噪声数据。
第 5 部分-无应力下限
布莱恩·罗伯特·马歇尔 (CC BY-SA 2.0)
在前面的四个部分中,我们把一只鸟(或一群鸟)在飞行过程中改变其飞行意图的轨迹视为基本事实数据。尽管在单一系数集的意义上,飞行路径抵制纯粹的预测建模,但是如果它(1)有噪声(一群鸟)或(2)采样太稀疏,我们可能想要*滑它。我们考虑了线性插值、线性和多项式回归以及移动*均等方法,发现所有这些方法都不足以应对这种情况。
现在我们可以考虑一种适当的方法来*滑噪声数据。回想一下,我们的原始地面实况的散点图和线性插值如下所示:
作者创造的形象
作者创造的形象
局部加权散点图*滑
在深入研究其背景和细节之前,让我们先来看看 lowess 对我们的噪声数据的应用:
作者创造的形象
请注意它与地面真实轨迹有多相似。它在 t < 0 处有一个浅凸起。在 t =1 后有凸起,在 t = 2 后有低谷,接*并超过 t = 3 的陡坡,接* t= 4 的斜坡有轻微的缓和。此外,它没有我们在前面的移动*均线图中看到的抖动。这张图是*滑的,正如我们从一只鸟或一群鸟的飞行中所期待的那样。这是因为,像原始地面真值生成的方式一样, lowess 是分段计算的。它与线性回归和移动*均线(两种聚合类型)有共同的方面,尽管它与两者都不同。在一些背景和技术解释之后,我将展示和讨论 lowess 的 python 实现。
关于局部加权散点图*滑的基本事实
- 由传奇人物约翰·图基和多产的爱德华·塔夫特在贝尔实验室的同事威廉·克里夫兰于 1979 年开发。
- 与黄土 ( 局部估计散点图*滑)相关,克利夫兰对多元数据的推广,由 Savitzky-Golay 滤波器于 1964 年预测。
- Lowess(以及黄土)是非参数的,这意味着它没有对预测变量和因变量之间的模式做出任何假设。
- Lowess 是作为一系列最小二乘线性回归来计算分段的,每个最小二乘线性回归都基于数据的最*邻子集。(移动子集由超参数控制,该超参数将窗口大小指定为整个数据集的一部分。)
- 在每次回归中,最*邻窗口内的点按其邻*程度进行加权。它可以是二次加权,尽管黄土通常使用三次权函数,其中 d 代表距离,每个点的权重定义为: w(x) = (1-| d |)
- 可能会遍历个数据点中的个。
洛斯是如何工作的?
lowess 的概念是简洁优雅。它结合了移动*均的分段宁滨(移动窗口)方面和线性回归的线性斜率估计方面。特别是, lowess 是单个最小二乘线性回归的从左到右分段串联,有一个重要的警告:不是一个条柱中的所有数据点都被同等加权(就像它们在移动*均和普通最小二乘线性回归中一样),而是通过它们与条柱中中心点的接*程度来加权。
为了形象化这是如何工作的,有几个动画可用,这使得这个过程非常生动。大卫·罗宾逊的“方差解释”提供了一个动画黄土图的演示(用 R 编程)。Robinson 页面的底部显示了黄土曲线的四个面板。
四条黄土曲线,出自大卫·罗宾逊的《方差解释》 (CC 许可)
查看黄土曲线的四个面板,观察以下内容:
- 如上所述,不是根据点的数量来指定面元(移动窗口)的大小,而是使用 lowess (和黄土)来指定面元大小占整体的比例。所以在 Robinson 的左上图中,面元大小超参数是整体的 1/4;右上方是一半。左下角是 3/4,右下角是每次计算时考虑的整个数据集。(在我上面展示的图表中,我将 bin 大小设置为 12%和 20%。)
- Robinson 的 R 脚本激活数据点,使它们变暗,根据它们与移动中心点的接*程度指示它们的移动权重,移动中心点的曲线斜率和高度在序列的每次计算中被估计。其中的每一个,也就是每一个局部加权的线性回归,都用 Robinson 的蓝线来表示。由于其中每一个都是由一个充满全套系数的线性方程定义的,因此它不仅可以聚合,还可以在计算出的聚合之间进行插值,从而使红色曲线成为*滑的轨迹(这是移动*均值所做的,而不是所做的)。
- 超参数(将 bin 大小定义为一个比例)是使用 lowess 进行有效*滑的关键(也是区别 python 实现质量的东西,我将在下面解释)。如果这个超参数设置得太小,你就有过度拟合的风险(过度增加方差)。由于黄土和黄土没有假装整体预测全部数据(在给定范围之外)(用一组系数),在这种情况下过拟合表现为在可视化中缺乏适当的*滑度;我们会看到表面上*滑的过度拟合变得参差不齐,就像移动*均线一样(例如在 Robinson 的左上图中)。另一方面,如果比例超参数设置得太高,就会有拟合不足的风险(将偏差增加得太多),这表现为未能捕捉到基本事实的关键特征(例如在 Robinson 的右下面板中)。
- 泰勒·泰尔在他的 YouTube 视频中展示了一个关于黄土和黄土的方差-偏差权衡的极好例子。⁴·泰尔演示了如何使用验证误差来确定最佳拟合的超参数设置。另一个由
Mizanur Khondoke r 制作的动画生动地展示了仅用 30 秒钟移动比例超参数的效果!⁵
正如我一直暗示的那样, lowess,是分段计算的,难道不是用一组系数来模拟全部数据。相反,就像一群可以在飞行中随时改变意图的鸟一样,在 lowess 中沿着路线(从左到右)的每个点都有自己的一组系数,这些系数决定了在轨迹中该点处与光滑曲线接触的直线的切线斜率。
https://pix abay . com/photos/bird-热带-鸟嘴-多彩-异域-3433106/https://pixabay.com/service/license/
LOWESS 的 Python 实现
如前所述,我现在将讨论 lowess 的 python 实现。我最初在 python 中部署 lowess 的尝试只是断断续续地成功。我很快意识到我第一次尝试使用的软件包的局限性。
考虑到 Seaborn 的输出在许多可视化情况下是多么完美,很容易尝试将它用于黄土地块,尤其是如果您已经在 pandas 数据框架中有了数据。下面是代码和使用 Seaborn 生成的 lowess 图。Seaborn 的implot试探性地提供了一个lowess=True
参数。
作者创建的图像
我用一把大锤的微妙之处对图表进行了注释,因为 Seaborn 对 lowess 的实现相对于 python 数据科学包的总体质量,特别是 Seaborn 的质量,以及更好的替代方案的可用性是多么糟糕。然而,首先请注意,这条曲线缺少我们想要的一切:(1)它严重欠拟合,未能捕捉到鸟群轨迹的明显凸起和俯冲;(2)它甚至不是很*滑。显然,这些限制的出现是因为在 Seaborn 的实现中,没有规定指定比例(跨度)超参数。
Lowess的 python Statsmodels 实现
相反,我推荐 Statsmodels 实现。它只需要一点点小心,但很容易使用。第一个参数是 y 数组,在本例中是我们的noisy_data
,后面是 x 数组,在本例中是in_array
。指定每次回归中要汇集的数据比例的超参数称为frac
。需要记住的关键点是 Statsmodels lowess 返回一个 n 乘 2 的数组,其中第一列是 x 值序列,第二列是 y 值序列。所以我们必须适当地将这个数组切片,放入 matplotlib 的plot
函数中,其中lowess_tight[:,0]
和lowess_tight[:,1]
分别是 x 和 y 数组。在这种情况下,由于我们实际上绘制了两条 lowess 曲线(一条紧曲线和一条松曲线),这意味着将所有这些切片适当地放入列表中,然后我们将把该列表作为前面定义的自定义 graph 函数的最终参数。下面是代码和图表:
作者创建的图像
无论您选择更紧(frac=0.12
)还是更松(frac=0.20
)的曲线,这里的 lowess 曲线都胜过我们之前*滑噪声数据的所有尝试。请注意,它与上面显示的地面真实线性插值非常相似。
Lowess 应用于稀疏采样数据
以免你想象 lowess 回答了所有的数据*滑祈祷,让我们看看当我们将它应用于稀疏采样数据时会发生什么。
作者创建的图像
也许令人失望的是,lowess 没有成功地*滑稀疏采样的数据。因为我们只有七个数据点,20%的面元大小复制了稀疏数据的原始线性插值的角度形状(显示为蓝绿色)。事实上,将frac
设置为小于 0.6 会产生相同的形状。设置frac=0.6
导致一个不足够浅的曲线,就像我们看到的是由 Seaborn 制作的。
结果是我们需要一种不同的方法来*滑稀疏采样的数据。下一节将讨论 B 样条*滑的主题。
第 6 部分-让它用 B 样条发光
RebeccaVC1 — (CC BY-SA 2.0)
当我们的数据过于稀疏采样,我们做简单的线图,我们最终得到类似下面的东西,称为*线性样条,*不*滑。
作者创建的图像
然而,重要的一点是,这样的图形提供了连续数据点之间的插值。插值、或样条、实际上是我们想要的——在不同的数据点之间绘制连接。此外,这种线性样条是连接连续数据点的分段直线。因此,恰当地说,他们没有为整个数据集假定一个潜在的模式或规则;它们不需要预先确定鸟的预定飞行路线。这里唯一的问题是直线没有考虑到曲率,这导致地面真实鸟飞行方向的每次变化。然而,有一个补救办法,即 B 样条。
B 样条
b 样条是一种曲线样条,它是连续点之间的分段多项式插值,称为节点。⁶ 下面是一些 python 代码产生的地面真实曲线(再次)后面跟着一条 b 样条曲线。为此,我们使用了 scipy 包。我们为它的make_interp_spline
方法提供稀疏的 x 和 y 数组(sparse_input
和sparse_data
)以及一个多项式次数参数,在本例中,我们将二次多项式的次数参数设置为 k=2。(如果我们将其设置为 k=1,我们会看到上面已经看到的线性插值。)方法make_interp_spline
产生一个BSpline
对象,然后给它输入x_interp
,允许它呈现适当数量的要绘制的数据点。如你所见,它相当接*我们的地面真实曲线。
作者创建的图像
它确实缺少末端向下的钩子。然而,这仅仅是由于使用了特定的采样增量 15。如果我们将采样增量减少到 9,我们会得到我们想要的特定*滑曲线:
作者创建的图像
什么是 B 样条曲线,它是如何工作的?
B 样条,如上面所示的二次样条,使用与线性样条相同的分段原理,只是增加了一个确保连续性的功能。
作者创建的图像
在二次样条中,分段插值不是直线,而是二次多项式。每个段都是不同的(有自己的系数):
每个节点到节点插值的不同分段多项式(图片由作者提供)
二次样条(或一般的 B 样条)通过以下增加的特征实现*滑度:尽管每个样条有其自己的一组系数,但是这些系数被选择为使得对于每对连续的样条,它们的曲线在它们共享的节点处的切线具有相同的斜率,换句话说,相同的一阶导数。这被形象化为:
共享结上具有相同斜率的切线(图片由作者提供)
B 样条的优点和局限性
LOWESS 和 B 样条之间的一个重要区别是,LOWESS 曲线可能不会穿过任何一个数据点,相反,B 样条曲线保证会穿过所有的数据点。
为什么不将 B 样条用于噪声和稀疏样本数据?下面是尝试这样做的代码。其图表显示在地面实况图和稀疏采样数据的 B 样条图下。
作者创建的图像
正如你所看到的,尽管 B 样条在应用于稀疏数据时效果很好,但在应用于噪声数据时却是一场灾难;它不能使一切变得*稳;这只会加重它的噪音。
结论
那是一次长途飞行,但是我希望你喜欢旅途。我们认为鸟的飞行仅仅是一个例子,在这种情况下,我们不能假定一组系数作为预测因子的有效性。我们只能在有限的数据范围内对因变量(本例中为海拔高度)的波动进行建模。而且只做分段才有意义。为了最好地解释我们所拥有的数据,我们可能希望它是*滑的,因为鸟类的飞行包括在空间中的连续运动。正如我们已经看到的,如果我们的数据缺乏*滑性,无论是回归(线性、多项式等)还是移动*均都无法补救这一点,以实现我们期望的*滑可视化。
然而,如果我们的轨迹数据有可能被直观地解释,它可能缺乏*滑性,主要有两个原因:要么是噪音(如在一群鸟中),要么是采样太稀疏。要在可视化中达到想要的*滑度,答案很简单:如果数据有噪音,不要有压力;应用 LOWESS。如果数据采样太稀疏,不要发牢骚;使用 B 样条。如果数据既有噪声又有采样过于稀疏,那么*滑不会使其更具可解释性——这一点很好理解。最有可能的是,如果你已经有*滑数据的倾向,这是由你已经在图表中看到一些模式的感觉所激发的。你只是想让这种模式的视觉化符合你的直觉,那是一条连续的曲线。在这种情况下,LOWESS 和 B 样条是你的工具箱的必需品。
图片由作者提供,使用“吉姆”的照片,由 Nconwaymicelli 上传。CC 许可
该分析在 Metis 数据科学训练营 完成,代码发布在此处 。
在 LinkedIn 上访问我
[1]卡萨哈拉·阿克,辛格·RJ,诺姆·阿(2013)美国维生素 D (25OHD)血清季节性。PLOS 一 8(6): e65785。https://doi.org/10.1371/journal.pone.0065785https://journals.plos.org/plosone/article?id = 10.1371/journal . pone . 0065785
[2] 威廉·克利夫兰。1979.“稳健的局部加权回归和*滑散点图”,《美国统计协会杂志》,第 74 卷(368): 829- 836 页。
[3]大卫·鲁宾逊。2016,‘用 gganimate 创作一部黄土动画’方差解释。
[4] 蒂尔·泰勒。2020.什么是黄土,我应该什么时候使用它?精算数据科学家。YouTube。
Mizanur Khondoker。2013.非参数回归(Lowess)' YouTube。
[6]分段多项式是基 函数的一个例子。参见 Sing,Gurchetan,2018。 ' 回归样条函数介绍(带 Python 代码)' Aanalytics vid hyahttps://www . analytics vid hya . com/blog/2018/03/Introduction-Regression-Splines-Python-codes/
b 样条与贝塞尔曲线有关,如果你曾经在计算机图形设计软件包中操作过曲线,或者在文字处理器中试验过绘图工具,那么除了名字之外,它可能大家都很熟悉。这里有一个表格解释了如何区分它们:https://www . geeks forgeeks . org/difference-between-spline-b-spline-and-bezier-curves/。
网上有许多演示,允许通过鼠标移动操纵贝塞尔曲线。以下是其中的一些:
http://math.hws.edu/eck/cs424/notes2013/canvas/bezier.html
**
https://tholman.com/bezier-curve-simulation/
数据软件即服务:混合部署架构的案例
原文:https://towardsdatascience.com/data-software-as-a-service-the-case-for-a-hybrid-deployment-architecture-c696ceaf9ef1?source=collection_archive---------26-----------------------
介绍构建安全且可扩展的数据产品的新方法
图片由作者提供。
由Lior GAVI sh、联合创始人兼 CTO、 蒙特卡洛 、 凯文·斯汤普夫 、联合创始人兼 CTO、 泰克顿 ,以及 巴尔·摩西
作为构建旨在帮助团队实现数据承诺的解决方案的公司的创始人,我们知道我们想要为客户构建易于部署和管理的优秀产品。
我们还知道,由于我们将与客户的数据堆栈集成,我们需要提供最高级别的安全性和合规性。问题是:我们如何建造它们?SaaS?内部部署?还有别的吗?
为了实现这些目标,我们选择了 混合部署架构 ,这是一种将本地安全性与 SaaS 便利性相结合的新方法。原因如下。
随着贵公司接收和存储的数据比以往任何时候都多,以及对这些数据的访问和使用方式的审查越来越严格,在您现有的数据基础架构中加入任何类型的新的第三方解决方案都会带来相应的安全问题。
事实上,在 GDPR、CCPA、HIPAA 和许多其他重要缩写词的时代,管理复杂的数据系统和保持敏感数据的安全是两个截然不同的问题,没有放之四海而皆准的解决方案。
对于数据领导者来说,选择要解决的问题就像是在选择毒药。
传统的内部部署模式
第三方软件在客户环境中运行的本地部署架构以速度和运营效率为代价提供了更高的安全性。图片由作者提供。
内部部署(on-prem)是指传统的部署模式,在这种模式下,软件在客户的环境中运行,通常在专用的 VPC 中运行。特别是,服务存储或处理的所有数据都保留在客户的云中。
利益
当供应商编写代码时,客户保持对数据的完全控制和所有权。
内部解决方案为客户提供二进制文件和许可证密钥(对于许可软件),客户管理部署。这是无数软件产品选择的传统部署模型。例如,MemSQL 和 Splunk 的早期本地产品依赖于客户的工程和 IT 团队来处理部署。与 SaaS 解决方案相比,本地*台通常会根据客户需求提供更多定制和配置。
对于客户来说,选择利用本地体系结构的供应商的一个明显优势在于感知的安全性和合规性。通过将数据保存在客户的环境中,内部架构不会向外部方暴露任何连接。此外,供应商无法访问任何敏感信息,因为所有数据和软件都存放在客户的云中。
挑战
内部部署模式要求客户承担大部分运营开销。客户必须对灾难恢复情况进行故障排除,例如应用程序中断和数据停机,这可能非常耗时,并会导致糟糕的体验。
内部模型的第二个限制是缺乏部署速度,包括基线软件和任何未来的产品更新。由于软件存在于客户的环境中,升级可能是一个繁琐的过程,需要大量的权限和额外的资源。
SaaS 模式
软件即服务(SaaS)解决方案提供了托管在供应商云中的现成软件,客户可以即时供应和使用这些软件。在这种模式下,软件由供应商运行和管理,客户数据存储在供应商的云中。由 Salesforce 开创的、来自数据世界的值得注意的最*的例子包括雪花、段和图表。
SaaS 模式托管在供应商的云环境中,允许快速部署和轻松更新,但也带来了对数据安全性和访问的额外担忧。图片由作者提供。
利益
SaaS 模式使供应商可以轻松地进行更新,推出新功能,并大规模解决常见的棘手问题,而不是推动单个客户环境的变化。对许多人来说,这创造了一个更愉快的用户体验,通常成本更低。这也延伸到软件的维护,这是外包给最了解软件的供应商。
挑战
当您将数据加入其中时,SaaS 模型会变得更加复杂,尤其是当它涉及到法规遵从性要求和数据锁定时。
尽管任何有自尊的 SaaS 提供商都会对您的静态数据进行加密,但它仍然被锁定在供应商的环境中。因此,许多客户不愿意(或出于法规原因,无法)完全放弃数据的管理和存储。
即使客户愿意放弃在其环境之外安全存储数据的责任,他们仍然必须接受这样一个事实,即数据现在已经完全锁定,并处于供应商的控制之下。
那么,如何才能获得本地解决方案的合规性和灵活性优势以及 SaaS 供应商的易于部署性和便利性呢?
我们相信现代数据产品有更好的发展方向:混合架构。
混合部署模型
在过去的十年中,我们看到了软件工程的兴起,各行业的 DevOps 团队利用混合云架构来管理基础设施即服务应用,包括 New Relic 和 Atlassian 。最*,许多数据软件供应商做出了类似的设计决定。
混合架构模式利用软件工程和 DevOps 架构的最佳实践,将本地安全性与 SaaS 部署的便捷性相结合。图片由作者提供。
为了结合现代数据堆栈的 SaaS 世界和本地世界的精华,数据软件的购买者应该考虑采用混合架构的解决方案。这种方法由两部分组成:(1)由供应商管理的控制*面,以及(2)客户环境中的数据*面。
控制*面
控制*面通常承载软件的大部分业务逻辑,并处理不敏感的元数据。它与数据层通信,并将敏感操作(如处理、存储或删除数据)委托给数据层。控制*面还提供 web 和 API 接口,并监控数据*面的运行状况。控制*面完全在供应商的环境中运行,通常遵循多租户架构,尽管一些供应商提供在客户专用的完全隔离的 VPC 中运行的单租户控制*面(通常价格较高)。
数据*面
数据*面通常处理和存储所有客户的敏感数据。它必须能够从控制*面接收指令,并传回有关其操作和健康状况的元数据。从技术上讲,控制*面和数据*面之间的接口通常由在客户环境中运行的瘦代理来实现。一些供应商甚至能够完全跳过代理,充分利用跨云客户 IAM 角色。
从本质上讲,将客户的数据与受管软件分离,可以为客户提供 SaaS 产品的灵活性、本地解决方案的合规性和数据所有权,并始终将客户数据保存在客户的云环境中。
更快的入职和价值实现时间
混合架构使客户能够快速部署软件,而且通常只需很少的人工开销。
同时,这种快速的入门允许客户从产品中获得*乎即时的影响,并在短期内从他们的数据或 ML 模型中获得*乎即时的价值。
作为这种部署模式的一部分,拥有混合解决方案的供应商通常会提供随叫随到的支持,这是他们产品的一个关键特性,几乎就像是他们客户的嵌入式 SRE 团队。
独立管理复杂的基础架构和敏感的客户数据
混合模式的最大优势之一是,它使客户无需配置或维护供应商的复杂基础架构,同时让客户能够完全控制自己的数据。
一种方法是让供应商通过代理或交叉帐户角色访问“数据*面”,提取元数据、查询日志和汇总统计数据等信息。与许多 SaaS 产品不同,没有任何个人记录或 PII 从客户的数据仓库、湖泊或 BI 工具中取出并存储在供应商的云上。
混合方法还有助于添加控制供应商帐户权限范围的“旋钮”(即,越宽松,客户方的管理越少,反之亦然)。这让客户在数据访问和安全方面拥有更大的代理权,这对金融科技和医疗保健等行业至关重要,这些行业存在大量敏感数据,可接受的误差幅度很低,甚至不存在。
通过让供应商管理服务的计算资源,还可以确保供应商可以快速解决产品的任何问题,而不会给客户带来负担。数据代理解决了这个问题,并确保供应商的基础设施可以很容易地维护、调试和更新,而无需客户的努力或资源。
**给正在阅读本文的供应商的提示:**我们建议您尽早获得 SOC2 认证,稍后您会感谢我们的。许多企业,尤其是 GDPR、HIPAA 和 SOX 合规行业的企业,在考虑与您合作之前都会有此要求。
快速持续的软件升级
混合部署模式在客户云中保留稳定的云原语,如 S3、EMR、DynamoDB,在托管云中保留所有不断改进、快速发展的基础架构(即产品本身)。因此,客户可以更轻松地将新解决方案集成到他们的数据堆栈中,因为尝试和开始使用混合模式供应商的成本要比复杂的本地软件低得多。与托管在客户的私有云相比,在供应商的环境中托管服务还可以更轻松、更无缝地为所有客户推出更新。
在供应商的环境中托管服务意味着客户可以获得新功能,确保创新和产品开发不会各自为政。客户甚至不再需要知道不同的软件版本和缓慢的升级周期,他们可以放心,他们将始终使用最新和最好的版本,完全自动。
混合模式为客户提供了选择产品使用方式的灵活性,例如,如果他们希望在整个堆栈中部署该产品或仅在少数选定的数据环境中部署该产品,并且可以根据需要轻松添加或减少服务实例。
为灵活、安全的数据堆栈指明前进的道路
虽然我们在创建蒙特卡洛和泰克顿时并不认识对方,但我们最终为我们的产品选择了类似的架构。这种混合模式最终对我们支持数据和 ML 组织的能力至关重要,同时也得到了安全团队的认可。
通过利用混合 easy 本地架构,解决方案提供商可以构建易于部署、代表客户几乎不需要运营开销的数据产品,促进完全的数据所有权,而且最重要的是,确保最大的数据安全性和合规性。
说到底,为什么不能两者兼得呢?
有兴趣了解更多?联系到Lior GAVI sh蒙特卡洛 或Kevin Stumpf联合创始人兼 CTO
参加我们在 4 月 21 日和 4 月 22 日举办的 apply()—ML 数据工程会议。这是一个免费的虚拟活动,为 ML 从业者讨论数据工程的挑战和应用 ML。注册 这里的 。
用于模型评估的数据分割
原文:https://towardsdatascience.com/data-splitting-for-model-evaluation-d9545cd04a99?source=collection_archive---------8-----------------------
是时候回归基本面了。数据分割,或训练测试分割,是一个如此基本的概念,以至于我们有时会忘记它的重要性。
由 Unsplash 上的 Karsten Winegeart 拍摄
数据分割,或通常称为训练-测试分割,是将数据划分为子集,分别用于模型训练和评估。
2017 年,吴恩达领导的一个斯坦福研究小组发表了一篇关于从胸部 x 光片中检测肺炎的算法的论文。的原始论文称,他们使用了“30,805 名不同患者的 112,120 张正面 X 射线图像”,“我们将整个数据集随机分为 80%的训练和 20%的验证”。这促使一些人质疑在训练、验证和测试集之间是否有患者重叠。在重叠的情况下,这可能会大大高估模型性能。直到后来,研究小组才在他们的论文中澄清没有重叠。但这是一场本可以避免的不必要的争论。
在 Kaggle 上,许多人会经常参考流行的笔记本进行学习和参考。不幸的是,有时即使是经验丰富的 Kagglers 也可能在训练测试分割之前对整个数据应用特征工程而犯数据分割错误。
在这篇论文中作者是朱孙等人。艾尔。,发现在顶级会议上发表的 85 篇抽样推荐论文中,只有 12%使用固定时间戳来训练测试拆分数据。伊通纪等。艾尔。推断忽略全局时间线不适于评估推荐系统,并且可能导致向用户推荐“未来项目”的不合理场景。
提出上述案例研究的目的不是批评任何人。事实上,我自己也犯过数据分割错误。相关的一点是,数据分割是数据科学中的一个基本概念,我们有时会低估或忘记它的重要性。我们在进行“简单的”训练测试分割时会错过重要的细节,从而导致对模型性能的不准确评估。
在本文中,在进行案例研究之前,我们列出了在数据分割过程中需要注意的 5 个问题。
不*衡数据集
问题:如果我们随机分割一个数据集,其中 99%为负类,1%为正类,会出现什么问题?
一个潜在的结果是,在我们的训练数据中,正面类甚至更少或者没有。一切听天由命可能不是分割不*衡数据集的理想方式。
更好的方法是在类别标签上分层。我们值得信赖的 scikit-learn 的 train_test_split 有一个分层参数,允许我们以分层的方式分割数据。即使我们没有不*衡的数据集,对类别标签和感兴趣的其他重要子类进行分层也是一种很好的做法,以确保我们的测试和训练数据分布彼此相似。
有限的数据
问题:在数据有限的实验中,如果我们执行简单的训练测试分割,可能会出现什么样的模型评估问题?
在数据有限的情况下,确保测试和训练数据分布彼此相似是非常具有挑战性的。如果我们为训练分配了太多的数据,那么我们将会以太少的测试数据来结束良好的代表性,并且模型结果可能不可概括。
一个潜在的解决方案是 k-fold 交叉验证,其中数据被分成 k 个子集(或折叠)并执行以下程序。
- 使用 k -1 折叠的训练模型
- 在未用于培训的剩余折叠上验证模型
- 对每个褶皱组合重复上述两个步骤,并计算模型结果的*均值
五重交叉验证|作者图片
该方法使模型能够在数据集中的各种数据上进行评估,以导出*均模型结果,该*均模型结果将比仅在少量测试数据上进行评估更准确地估计模型性能。
特征工程泄漏
问题:在进行列车测试分割之前,对整个数据进行标准化有什么问题吗?
当我们在训练测试分割之前对整个数据进行标准化时,我们通过*均值和标准偏差将测试数据分布的信息“泄漏”到模型中。这篇文章有一个很好的实验,展示了训练测试分割之前的特征工程如何影响模型评估。
特征工程泄漏的一个更明显的例子是当我们使用整个数据集执行缺失数据的热卡插补时。这可能导致测试数据点被估算为训练数据点,反之亦然。
群体泄漏
问题:如果在训练、验证和测试集之间有患者重叠,为什么模型性能可能被大大高估?
在大多数 X 射线数据集中,同一个病人会有多张 X 射线,它们显然是高度相关的。该模型可以简单地结束学习识别人(即,将训练数据标签分配给同一患者的测试数据中的 X 射线),而不是检测疾病,从而导致夸大的模型性能。
我曾经有一个项目,目标是使用微波图像识别物体的类型。当我们的模型准确率达到 99%时,红旗就升起来了!原来,数据收集器扫描了同一物体的多个图像,尽管与物体的距离和角度不同。我们在做一个普通的火车测试。Facepalm…
在这种情况下,正确的方法是按对象标识符而不是按数据点或图像进行分割。
时间泄漏
问:随机分割时间序列数据有什么问题吗?
是的,当我们的任务是预测未来,而我们的模型在预测之前已经显示了未来的一部分。
在最简单的情况下,正确的方法是确保测试数据在时间上晚于训练数据。
时间序列训练-测试分割|作者图片
一种更复杂的方法是使用一种前推验证。
具有 3 个分割的嵌套式步行验证|按作者排序的图片
但不管怎样,我们总是确保模型看不到它未来的试卷。
案例研究—🏡房价预测
有时候事情并不那么明显。
问:给定一个关于个人房价的数据集和一个预测房价的目标,你会如何分割这些数据?
我的谷歌搜索结果中的大部分文章都使用了随机训练测试分割法。如此多的人做了随机列车测试分裂,我严重怀疑自己。也许我的担心是多余的,如果是这样的话,我希望看到这篇文章的人能帮我解释一下。但是,我们是否不需要考虑以下两个数据拆分标准?
- 房屋出售的日期 —如果我们在明天出售的房屋上训练我们的模型来预测明天出售的房屋的价格,我们不会有时间泄漏吗?
- 房屋单元 —如果我们的数据集包含在短时间内多次出售的同一栋房屋的数据点,我们不会面临群体泄漏的风险吗?
在上述两个标准中,我认为更大的问题是时间泄漏,因为在短期内多次出售相同房屋的数量应该很少。我们还认识到,许多住房数据集不允许我们识别单个住房单元。
所以我决定进行实验来验证我的假设,也就是说,如果我们简单地做一个随机的训练测试分割,会有时间泄漏吗?
实验是在两种不同的设置中使用新加坡的转售单位价格来预测房价,并比较模型结果。
- 第一次设置—随机训练-测试分割
- 第二次设置—临时训练测试分割(即,考虑房屋出售日期的数据分割)
在这两种设置中,我们尽可能保持相同的东西,包括测试数据的大小和算法。
使用新加坡转售单位价格的一个好处是,集团漏损应该是不存在的或微不足道的,因为新加坡有一项法规要求最低占用期为 5 年。
实施实验的笔记本可以在这里访问。下面我们就来分享一下结果。
随机分割与时间分割的 MAPE |图片作者
上图显示了随机分割与时间分割设置的*均绝对百分比误差(MAPE)。测试数据是两种设置中的公共测试数据点。
我们可以看到,在随机分割设置中训练的模型通常比在时间分割设置中训练的模型具有“更好”的性能。我们也将测试的时间周期改为其他年份,但结果保持不变。
因此,我们的结论是很可能存在时间泄漏。我们的猜测是,在不同的时间段存在影响房价的宏观经济条件,通过执行随机的训练测试分割,我们正在向模型泄露一些我们在训练时无法知道的宏观经济影响。
一个“简单”的列车测试分离也许根本就不那么简单。
感谢阅读,我希望这篇文章对你有用😄如果您有任何问题或建议,也请随时发表评论,尤其是关于房价预测的案例研究。
参考
- https://ai Ukraine . com/WP-content/uploads/2018/09/12 _ 00-塞维多夫-Guts-Target-Leakage-in-Machine-Learning-。pdf
- https://en . Wikipedia . org/wiki/Leakage _(machine _ learning)
面向娱乐和非营利组织的数据堆栈—第三部分
原文:https://towardsdatascience.com/data-stacks-for-fun-nonprofit-part-iii-dcfd46da9f9f?source=collection_archive---------17-----------------------
在本教程中,我们将介绍 DS4FNP 堆栈的每一步。
面向娱乐和非营利组织的数据堆栈是一系列文章和教程,旨在使用开源和开放核心组件设计和实现现代数据堆栈。DS4FNP 堆栈旨在为教育目的提供足够的可访问性(在成本和笔记本电脑可部署性方面),但作为一个成熟的分析架构,适合各种规模的组织进行扩展。
在之前的一篇文章中,我描述并概述了由 Postgres、Meltano、Airflow、dbt 和 Apache 超集组成的本地可部署堆栈背后的基本原理。Postgres 数据库可以替换为其他数据库引擎,如 SQLite 和 MySQL,而不会有太大的影响。这种设置允许我们在本地环境中使用完整的数据栈,然后当我们准备好扩展到像 BigQuery 或 Snowflake 这样的云托管数据仓库时,这样做只是简单地切换一些配置文件。
我们现在准备好了一个实践教程,演示如何设置堆栈的每个组件和一些示例内容。我们将遍历堆栈中每个组件的设置,提取数据并将其加载到数据仓库中(好吧,现在实际上只是一个本地数据库),并设计一些基本的分析仪表板。
找一些数据!
在开始之前,我们需要想出某种目的或场景来激励我们选择数据源和目标。这总是为如此多样的潜在用例设计教程的最困难的部分,因为你想尝试呈现一些与所有用例相关的东西。我认为一个理想的场景应该是涉及连续生成的数据,如体育统计数据或服务器日志,因为这些数据将允许我们根据定期安排的工作流和纵向图进行思考。然而,为了在我们跑之前学会走路,让我们把这些场景留到以后的教程中,现在集中在一些移动较慢的数据上。
过去几个月一直被关于 2020 年美国大选的新闻所占据,最终的回报现在可以从通常的来源获得,所以这似乎是一个及时而合适的主题。从分析的角度来看,让我们把兴趣放在比较最*和历史的选举结果上。
也许毫不奇怪,事实证明美国选举的数据分散得令人难以置信,在哪里找到或如何获得并不总是显而易见的,也缺乏任何一种共同的标准。有一些公共机构和学术研究人员勇敢地收集和发布了一些数据集,其中许多我已经开始在 https://github.com/andrewcstewart/awesome-democracy-data 进行分类和策划。如果你对与选举、选举改革和民主政治制度有关的数据感兴趣,我鼓励你去看一看!
我们将在本教程中使用的主要数据源来自麻省理工学院选举数据+科学实验室。具体来说,我们对收集美国众议院、参议院和总统选举团候选人的历史选举结果感兴趣。
使用 Meltano 收集数据
本教程需要以下内容:
- 下载并安装 PostgreSQL 。
- 你可以使用 SQL 客户端:我推荐 TablePlus 或者 pgcli 。
- 栈中的大多数组件都依赖于 Python3 。
- 我还推荐使用 IDE,比如 VS Code (以及 vscode-dbt 扩展。)
我们开始吧!如果你只是想跟着做,在本教程中生成的所有代码/配置都可以在https://github.com/andrewcstewart/ds4fnp找到。由于我们将要安装的许多(如果不是全部)组件都是通过 python 实现的,我强烈建议创建一个虚拟环境。
mkdir ds4fnp
cd ds4fnp
python3 -m venv .venv # create your virtual environment
source .venv/bin/activate # activate your virtual environment
我们将使用 Meltano 来管理我们的 ELT(而不是 ETL!)管道,每个管道将从某个源提取数据,并将数据加载到目标数据库中。如果我们手工开发自己的 ETL 解决方案,我们可能会为每个数据提取和加载过程编写大量的定制 python 代码,但幸运的是,开源的 Singer 标准将这些过程组合成可互换的“tap”(数据源)和“targets”(加载目的地)。Meltano 有助于抽象出许多配置细节,并提供了一个方便的执行层。Meltano 还可以处理下游的转换(通过 dbt)和编排(通过 Airflow)步骤,使它成为整个项目的方便的顶层控制器,但是出于说明的目的,我们将只使用 Meltano 进行提取和加载步骤。
设置 Meltano
设置 Meltano 很简单,只需安装它并创建一个新项目。
pip3 install meltano
meltano init ./meltano
cd ./meltano
如果你做了一个ls
,你会注意到已经创建了几个子目录,还有一个meltano.yml
文件。这个文件是我们要做大部分工作的地方,还有 Meltano 的 CLI。我建议浏览一下 Meltano 的文档,以便更好地了解项目配置文件是如何工作的。在大多数情况下,我们将使用 CLI 在meltano.yml
中生成部分,然后根据需要手动编辑配置选项。
配置用于提取的源
现在我们已经建立了一个项目,我们可以添加和配置一些提取器(taps)和一个加载器(target)。Meltano 提供 Singer taps,从 Google Analytics、Zendesk、Salesforce 等,到简单的 CSV 文件或 SQL 数据库;然而,也有数不清的其他第三方歌手水龙头在野外为各种不同的数据来源。在本教程中,我们只是从 URL 中提取一些 CSV 文件,所以我们只需要将[tap-spreadsheets-anywhere](https://meltano.com/plugins/extractors/spreadsheets-anywhere.html#getting-started)
插件添加到我们的项目中。这是一个非常通用的 tap,可以让我们从许多来源提取 CSV 和 Excel 文件,包括 http/s、s3、sftp 等等。
meltano add extractor tap-spreadsheets-anywhere
这个命令将在我们的项目中安装插件,并向我们的meltano.yml
添加一个配置部分。有些 tap 在 CLI 中配置起来很简单,但是对于tap-spreadsheets-anywhere
,我们需要在tables:
下创建很多嵌套的项目,所以手动编辑文件可能更容易。tap 的文档描述了如何配置 tap 以读取特定源。
为了演示,我们将从 MIT Dataverse 添加三个数据集的 URL,以便 tap 从中提取:
- 美国众议院选举:https://dataverse.harvard.edu/api/access/datafile/4202836
- 美国参议院选举:https://dataverse.harvard.edu/api/access/datafile/4300300
- 美国总统选举:https://dataverse.harvard.edu/api/access/datafile/4299753
这些 URL 中的每一个都解析为一个制表符分隔的文件,所以我们将告诉 tap 期待一个“csv”文件,但是带有“\t”分隔符。我们的meltano.yml
看起来像这样:
version: 1
send_anonymous_usage_stats: true
project_id: xxx
plugins:
extractors:
- name: tap-spreadsheets-anywhere
variant: original
pip_url: git+https://github.com/ets/tap-spreadsheets-anywhere.git
capabilities:
- catalog
- discover
- state
config:
tables:
- path: [https://dataverse.harvard.edu/api/access/datafile/](https://dataverse.harvard.edu/api/access/datafile/)
name: mit__house_elections
pattern: "4202836"
start_date: '2010-01-01T00:00:00Z'
key_properties: []
format: csv
delimiter: "\t"
- path: [https://dataverse.harvard.edu/api/access/datafile/](https://dataverse.harvard.edu/api/access/datafile/)
name: mit__senate_elections
pattern: "4300300"
start_date: '2010-01-01T00:00:00Z'
key_properties: []
format: csv
delimiter: "\t"
- path: [https://dataverse.harvard.edu/api/access/datafile/](https://dataverse.harvard.edu/api/access/datafile/)
name: mit__president_elections
pattern: "4299753"
start_date: '2010-01-01T00:00:00Z'
key_properties: []
format: csv
delimiter: "\t"
配置要加载的目标
接下来,我们需要添加一个 Singer 目标来告诉 Meltano 我们希望它将数据加载到的 Postgres 数据库。在此之前,我们需要在 Postgres 中创建一个数据库和权限。出于本教程的目的,我们将创建一个名为“ds4fnp”的 db,以及一个同名的用户。
create database ds4fnp;
create user ds4fnp with password 'ds4fnp';
grant all privileges on database ds4fnp to ds4fnp;
然后我们可以将target-postgres
加载器添加到我们的项目中,类似于我们添加 taps 的方式。
meltano add loader target-postgres --variant meltano
安装插件后,meltano.yml
现在包含了一个loaders
部分,包含了我们的特定目标。我们可以将目标配置为使用我们刚刚创建的数据库和凭证。
loaders:
- name: target-postgres
pip_url: git+https://github.com/meltano/target-postgres.git
config:
user: ds4fnp
host: 127.0.0.1
port: 5432
dbname: ds4fnp
运行 ELT 工作流
提取器和加载器都准备好了,我们现在可以定义和运行管道了。使用 Meltano 的 CLI,我们只需运行meltano elt [TAP] [TARGET]
,就像这样:
meltano elt tap-spreadsheets-anywhere target-postgres
这将运行一段时间,因为 Meltano 从我们的源中提取所有数据并加载到我们的数据库中。在我们的ds4fnp
数据库中,我们现在有了一个以 tap 命名的新模式,它包含了我们在meltano.yml
中指定的所有目标表。比如ds4fnp.tap_spreadsheets_anywhere.mit__house_elections
。为了验证一切顺利,我们可以使用我们选择的 SQL 浏览器在我们的仓库中查找这些表。
我们可以使用pgcli
通过运行以下命令来浏览数据库:
pgcli postgresql://ds4fnp:ds4fnp@127.0.0.1/ds4fnp
或者如果你喜欢更直观的体验,我们可以使用 TablePlus:
Meltano (TablePlus SQL 客户端)新加载的数据。
太好了!我们现在有一些原始数据加载到我们的数据库中。我们称之为“原始”数据,因为它包含许多不完美和不确定的质量,最终我们希望将其提炼为更直接有用的产品。整个原油管道的类比在这里非常适用。这就是转型的切入点。我们希望通过数据转换来处理的问题类型的一些示例:
mit__house_elections
表格中的所有字符串字段都是大写的,而在其他表格中则不是。我们应该与大写保持一致。- 有些字段使用“名字,姓氏”,而有些字段使用“姓氏,名字”。我们应该保持名称格式的一致性。
- 在分析过程中,有许多我们可能不关心的元数据字段。我们可以把这些过滤掉。
- 这些选举结果的粒度级别非常低,而我们可能希望处理更高级别的聚合数字。
然而,我们将在下一步处理转换。实际上,将原始数据保持为最初加载的状态,并将转换视为原始数据的衍生物是有价值的。这样做有助于我们保存数据的来源(T2 ),一个可审计的数据历史记录。它还允许我们重新访问和修改我们的转换任务,如果我们不保存原始数据,我们就不能这样做。
正如我前面提到的,Meltano 实际上可以将 dbt 作为一个转换层合并到它自己的项目配置中,但是现在我们将自己一步一步地完成 dbt。
使用 dbt 转换和建模数据
dbt 代表“数据构建工具”。它是一个开源项目,为定义和管理数据仓库中的分析工作流提供了一个开发环境。Singer(通过 Meltano)从一个或多个外部源将数据加载到数据库中,而 dbt 将数据从一个或多个现有的表(例如,原始数据表)转换到一个新的表中。这是通过用基本的 SQL 查询定义数据模型来实现的,这些查询利用 Jinja 模板系统来动态引用其他表。如果您曾经在 Flask 这样的框架中创建过 web 应用程序,您可以在其中以编程方式填充内容模板化的 HTML,这与 SQL 的情况非常相似。当您运行 dbt 时,所有这些模板化的查询和元数据都被编译成表/视图定义,并在我们的目标数据仓库上执行。花点时间在这里阅读更多。
设置 dbt
设置 dbt 和梅尔塔诺很像。我们从 pip 安装,并用 dbt CLI 创建一个新项目。
cd .. # go back to the ds4fnp base pathpip3 install dbt # install dbt
dbt init dbt # create a new dbt project called 'dbt'
cd dbt #
我们现在有了一个新的项目框架,包括几个子目录和一个类似于meltano.yml
配置文件的dbt_project.yml
配置文件。简而言之,dbt 项目由以下组件组成:
- sources 是对我们的数据仓库中现有位置的引用,我们的加载流程将原始数据存放在这些位置。这些在
models
目录下定义。 - 模型是模板化的查询,它定义了 dbt 将在我们的数据仓库中具体化为新表/视图的选择和转换。模型可以从源中选择,也可以从其他模型中选择。这些也在
models
目录下定义。 **data**
是一个包含 CSV 格式的*面文件的目录,dbt 会自动将这些文件加载到我们的数据仓库中;这对于小型不可变的查找表很有用。**macros**
包含模板引擎在定义查询时可以使用的函数。我们不会在这里过多地讨论宏,但是它们提供了 dbt 背后的真正力量。**analysis**
查询类似于模型,只是 dbt 只将它们编译成呈现的 SQL,而不在数据仓库中执行它们。我发现这些对于测试新的查询想法很有用,而不需要将它们合并到我的整体数据模型中,并且可以预先生成查询,用于下游分析和 BI *台。**docs**
包含 dbt 生成的完整静态文档网站。这是 dbt 的一个非常棒的特性,也是让同事能够访问您的数据仓库的关键。**tests**
提供一种将单元测试概念应用到项目设计中的方法。**snapshots**
提供一种捕获和保存不维护自身历史的源的历史记录的方法。**target**
是 dbt 在对目标数据仓库执行之前编写已编译查询的地方。
在大多数情况下,我们将只触及其中的几个组件;即来源和模型。
我们还需要配置一个profiles.yml
文件,它将包含我们的数据库凭证,默认情况下位于项目目录之外的~/.dbt/profiles.yml
下。我建议阅读关于配置文件配置的文档。
您可以配置多个概要文件,然后轻松地针对多个目标部署您的 dbt 项目。例如,出于开发目的,您可以部署到本地 postgres 数据库,然后部署到 BigQuery 作为生产数据仓库。这里有一个例子profiles.yml
让我们开始:
# For more information on how to configure this file, please see:
# [https://docs.getdbt.com/docs/profile](https://docs.getdbt.com/docs/profile)ds4fnp:
outputs:
local:
type: postgres
host: 127.0.0.1
user: ds4fnp
pass: ds4fnp
port: 5432
dbname: ds4fnp
schema: public
target: local
有了我们的概要文件设置,接下来我们要做的事情是转向项目配置。在 dbt 项目中,我们将基本上处理三个不同的文件:
dbt_project.yml
-该文件通知 dbt 项目的结构,以及一些通用的配置选项。schema.yml
-数据模型是通过 yaml 和 sql 文件的目录结构定义的。schema.yml
文件列举并描述了每个模型的元数据。*.sql
-每个模型由一个 jinja 模板化的 SQL 文件定义。除了对数据库对象的直接引用将被模板引擎使用的宏所取代之外,这些文件看起来与您可能见过的大多数 SQL 文件非常相似。
与其一步一步地设计整个项目配置,不如让我们看一个完整的配置。我将把dbt_project.yml
文件的基本概述留给正式的文档。
# Name your project! Project names should contain only lowercase characters
# and underscores. A good package name should reflect your organization's
# name or the intended use of these models
name: 'ds4fnp'
version: '1.0.0'
config-version: 2# This setting configures which "profile" dbt uses for this project.
profile: 'ds4fnp'# These configurations specify where dbt should look for different types of files.
# The `source-paths` config, for example, states that models in this project can be
# found in the "models/" directory. You probably won't need to change these!
source-paths: ["models"]
analysis-paths: ["analysis"]
test-paths: ["tests"]
data-paths: ["data"]
macro-paths: ["macros"]
snapshot-paths: ["snapshots"]target-path: "target" # directory which will store compiled SQL files
clean-targets: # directories to be removed by `dbt clean`
- "target"
- "dbt_modules" # Configuring models
# Full documentation: [https://docs.getdbt.com/docs/configuring-models](https://docs.getdbt.com/docs/configuring-models)# In this example config, we tell dbt to build all models in the example/ directory
# as tables. These settings can be overridden in the individual model files
# using the `{{ config(...) }}` macro.
models:
ds4fnp:
staging:
+schema: staging
+materialized: view
# marts:
elections:
+schema: elections
+materialized: view
除了几处编辑之外,这几乎是 dbt 在初始化期间为我们生成的常用配置文件。我们更改的主要内容是将profile:
指向我们上面创建的概要文件,以及models:
部分下的所有内容。有几种方法来构建您的数据模型,但是这里我们将保持事情相当简单。我只定义了两个模式:
staging
将包含对我们数据源的引用。elections
将包含我们将在下游使用的转换模型。
定义来源和临时表
首先让我们在models/staging/schema.yml
中定义我们的分段模式。从 Meltano,我们将三个不同的来源加载到我们的仓库中(众议院、参议院和总统选举结果)。
version: 2sources:
- name: mit
loader: meltano
database: ds4fnp
schema: tap_spreadsheets_anywhere
tables:
- name: mit__house_elections
description: MIT house election data
- name: mit__senate_elections
description: MIT senate election data
- name: mit__president_elections
description: The data file `1976-2016-president` contains constituency (state-level) returns for elections to the U.S. presidency from 1976 to 2016\. The data source is the document "[Statistics of the Congressional Election](http://history.house.gov/Institution/Election-Statistics/Election-Statistics/)," published biennially by the Clerk of the U.S. House of Representatives.
columns:
- name: candidate
description: name of the candidate
- name: candidatevotes
description: votes received by this candidate for this particular party
- name: district
description: None
...
models:
- name: stg_us_house_election_results
description: US House election results
- name: stg_us_senate_election_results
description: US Senate election results
- name: stg_us_president_election_results
description: US President election results
在这个文件中,我们在sources:
下定义了源表的位置,但是我们也在models:
下定义了一组相应的“staging”模型。每个name:
字段的值必须对应一个.sql
文件,我们也将创建这个文件。我们为每个数据源定义分段模型的原因是,我们可能希望在多个数据模型中使用同一个数据源,但是我们不一定希望在每个实例中定义相同的过滤和数据清理。有了分段模型,我们可以在一个地方一次性定义这些转换,这样对数据源的任何修改都可以反映在引用它的每个下游模型中。schema.yml
文件还允许我们描述和记录表中的字段,这将在以后派上用场。
定义数据模型
对于模型定义,我只使用众议院选举作为例子,因为其他两个看起来相似,完整的代码可以从前面提到的 Github 库中获得。我们将在models/staging/stg_us_house_election_results.sql
中定义众议院选举结果的阶段模型:
select
to_date(year::VARCHAR, 'YYYY') as year,
INITCAP(candidate) as candidate,
INITCAP(party) as party,
INITCAP(state) as state,
state_po,
COALESCE(district, '1') as district,
candidatevotes::INTEGER as candidate_votes,
totalvotes as total_votes,
ROUND(candidatevotes::numeric / totalvotes::numeric * 100, 2) as vote_pct
from {{ source('mit','mit__house_elections') }}
where writein::BOOLEAN is False
从这个分段模型中我们可以看到,dbt 中的模板化 SQL 与常规 SQL 非常相似,只是我们在查询的from
子句中使用了一个{{ source() }}
宏。当 dbt 运行时,它将使用项目配置中的适当信息填充宏。在这个 staging 模型中,我们基本上是按原样选择源表,只是我们限制了返回的字段,并对其中的一些字段执行了一些转换。例如:
- 我们已经将
date
字段转换为实际的日期戳类型。 - 我们用
INITCAP()
函数修正了很多字段的全大写字符串。 - 我们在
district
列中插入了一些缺失的值。
仅举几个例子。然后,我们对参议院和总统选举数据来源重复这一过程。既然我们已经定义了我们的源和阶段模型,我们可以开始设计我们计划在未来的分析和超集中使用的数据模型。原始数据提供了每一个候选人(包括非推荐候选人、小党派等)和每个州/地区的选举结果,让我们在党派层面总结结果。对于这些模型,我们将在models/elections/schema.yml
下创建一个新的模式:
version: 2models:
- name: us_house_party_seats
description: Seats in the US House of Representatives by party.
- name: us_senate_party_seats
description: Seats in the US Senate by party.
- name: us_president_popular_vote
description: Popular vote in US presidential elections by party.
这应该类似于我们上面定义的阶段模型。为了总结众议院的结果,让我们定义一个数据模型查询,该查询根据收到的选票对候选人进行排名和筛选,然后最终汇总每个选举年每个政党赢得的席位数。
WITH
sub1 AS (
SELECT
*,
rank() OVER (PARTITION BY year,
state,
district ORDER BY candidate_votes DESC) AS rank
FROM {{ ref('stg_us_house_election_results') }}
),
sub2 AS (
SELECT
*,
rank = 1 AS winner
FROM sub1
)SELECT
year,
party,
count(*) as seats
FROM sub2
WHERE winner = True
GROUP BY year, party
我们的查询看起来与 staging 模型中使用的非常相似,主要区别是使用了{{ ref() }}
宏而不是{{ source() }}
宏。其他查询可以在 Github 存储库中找到。
运行 dbt
配置好项目后,我们现在可以运行 dbt 了!请注意,在实践中,您可能希望在验证您的工作时经常运行项目。为此,我们只需从命令行运行dbt run
。我将在下面的代码片段中包含终端输出:
dbt runRunning with dbt=0.18.1
Found 6 models, 0 tests, 0 snapshots, 1 analysis, 138 macros, 0 operations, 0 seed files, 3 sources14:08:49 | Concurrency: 1 threads (target='local')
14:08:49 |
14:08:49 | 1 of 5 START view model dbt_staging.stg_us_house_election_results.... [RUN]
14:08:49 | 1 of 5 OK created view model dbt_staging.stg_us_house_election_results [CREATE VIEW in 0.23s]
14:08:49 | 2 of 5 START view model dbt_staging.stg_us_senate_election_results... [RUN]
14:08:49 | 2 of 5 OK created view model dbt_staging.stg_us_senate_election_results [CREATE VIEW in 0.08s]
14:08:49 | 3 of 5 START view model dbt_staging.stg_us_president_election_results [RUN]
14:08:49 | 3 of 5 OK created view model dbt_staging.stg_us_president_election_results [CREATE VIEW in 0.08s]
14:08:49 | 4 of 5 START view model dbt_elections.us_house_party_seats........... [RUN]
14:08:50 | 4 of 5 OK created view model dbt_elections.us_house_party_seats...... [CREATE VIEW in 0.09s]
14:08:50 | 5 of 5 START view model dbt_elections.us_senate_party_seats.......... [RUN]
14:08:50 | 5 of 5 OK created view model dbt_elections.us_senate_party_seats..... [CREATE VIEW in 0.07s]
14:08:50 |
14:08:50 | Finished running 5 view models in 1.26s.Completed successfullyDone. PASS=5 WARN=0 ERROR=0 SKIP=0 TOTAL=5
厉害,我们的项目编译运行成功!您可以在 dbt 运行时跟踪进度,如果出现问题,它通常会提供有用的诊断信息。在我们深入数据仓库查看 dbt 生成的所有内容之前,让我们快速回顾一下生成 dbt 的文档。我们只需要另外两个命令就可以做到:
dbt docs generate
dbt docs serve
这将生成您的数据仓库的文档,并启动一个临时 web 服务器,以便您可以查看它。花几分钟时间在浏览器中浏览生成的站点。
dbt 的自动生成文档。
dbt 的一个很棒的特性是站点右侧的图形,它允许您可视化各种视图和表之间的关系。注意,与您可能在其他地方看到的 ERD(实体关系图)不同,这里的表之间的关系是沿袭的;即哪些表是其他表的源。随着项目复杂性的增加,这些图表和自动生成的文档通常会变得非常有价值。
dbt 自动生成的文档中的谱系图。
此时,您还可以检查在本地 postgres 数据仓库中生成的表。我们将在下一节中更直接地研究它们。
使用超集分析和可视化数据
最后,我们准备好对新填充的数据仓库做一些事情。通常情况下,任何分析项目都会有某种 BI 层,具有交互式数据可视化,可以根据我们仓库中的数据进行动态更新。当然,在本教程中,我们有意使用不经常更新的数据源(美国大选每两年才举行一次)。然而,我们可以设置 Apache 超集来演示如何完成这个一般任务。
我们将再次在终端运行一系列命令:
pip3 install apache-superset # install superset
superset db upgrade # initialize superset's db
superset fab create-admin # create an admin user
superset init # set a bunch of defaults
superset run -p 8088 --with-threads --reload --debugger # run it!
其中一些步骤可能涉及到一些交互,之后您应该有一个正在运行的超集实例,您可以从浏览器的 http://localhost:8088 访问它。此时,我还建议快速浏览一下超集的文档。因为本教程的其余部分与命令行无关,所以我将首先列出在超集中创建仪表板的步骤,然后我们将逐一介绍。如果你使用过商业 BI 工具,比如 Tableau 或者 Looker,这看起来会非常相似。
Configure a data source
Create datasets
Create charts
Create dashboards
如果你想直接跳到成品,你可以导入我已经导出到 Github 库的superset
目录下的数据和仪表板配置:
superset import-datasources -p datasources.yml
superset import-dashboards -p dashboards.json
配置数据源
我们只需要建立到仓库的连接作为数据源。您可以通过“数据”菜单下的“数据库”添加新的连接。超集使用 SQLAlchemy 来管理数据库连接,因此您的连接字符串将如下所示:postgresql+psycopg2://ds4fnp:ds4fnp@localhost:5432/ds4fnp
在超集中配置数据源连接。
在我们进入数据可视化之前,值得指出的是,超集有一个方便的内置 SQL 客户端,称为“SQL Lab”。一旦添加了数据源,就可以使用 SQL 实验室来浏览数据库表并运行 SQL 查询。这对于运行特别分析非常有用,也有助于 Meltano 和 dbt 的开发。
超集中的 SQL 实验室接口。
创建数据集
“数据”菜单下还有“数据集”,通常是从您的仓库中选择的表。要创建一个,您需要选择数据库、模式和表,然后单击 save。
在超集中设置数据集。
创建图表
图表是超集的核心。创建一个数据集包括指定要使用的数据集,然后将各种视觉美感映射到数据集中的字段。我们将在这里创建一个非常简单的示例:
- 创建新图表。
- 选择“dbt _ elections . us _ house _ party _ seats”作为数据集,选择“面积图”作为图表类型。
- 选择
year
作为时间列,以及时间粒度。 - 将时间范围设置为“无过滤器”。
- 在 metrics 下,选择
seats
作为列,选择SUM
作为聚合。 - 选择
party
进行分组。
我还把 Customize 下的配色改成了“Google Category 10c”,大多是把民主党映射成蓝色,共和党映射成红色。
超集的图表编辑器。
重复此过程,为参议院和总统选举结果创建类似的图表。
注意:是的,我意识到在总统选举图表中,民主党是红色的,共和党是蓝色的。为了解决这个问题,我们可能希望在表中创建一个额外的标准化 party 字段,以便控制分组和排序的工作方式。
创建仪表板
超集中的仪表板提供了一个画布,用于将图表和其他工件组装到一个方便用户查看和交互的页面中。超集使得创建新的仪表板和将图表拖放到画布上变得非常容易。查看超集仪表板上的 Preset.io 文档,了解如何定制所有各种仪表板功能的更多信息。
对于本教程,我简单地创建了一个新的仪表板,并将我们刚刚创建的每个图表拖到它上面。
超集仪表板编辑器。
一旦你有了你想要的仪表板,只需保存它并点击“草稿”开关将仪表板设置为已发布。
我们在超集中发布的仪表板!
这看起来是一个很好的开始!从这里开始,您可以尝试创建更多的图表和仪表板。您可能还想回到您的数据模型,并创建可以支持其他类型图表的附加表/视图。如果您觉得特别大胆,您甚至可以尝试在 Meltano 中添加额外的加载器,并在您的 dbt 项目中组合多个数据源。
包扎
概括地说,在本教程中,我们有:
- 安装并配置了 DS4FNP 堆栈的每一部分。
- 创建了一个 postgres 数据库作为我们的本地开发仓库。
- 用 Meltano 从外部来源提取的数据加载我们的仓库。
- 使用 dbt 将原始数据转换成精确的数据模型。
- 从超集中的数据模型创建可视化。
希望您现在已经很好地掌握了堆栈中的技术,以及它们是如何结合在一起创建现代数据分析系统的。我们所涵盖的绝不是开发一个完整的生产质量系统所涉及的范围,但它确实建立了一个基础。
在本教程中,我们只是使用了一个运行在本地机器上的简单 postgres 实例,这样做对于本地开发目的来说确实是完全有效的,但是在某些时候,我们希望利用一个可扩展的基于云的仓库,比如 BigQuery 或 Snowflake。幸运的是,从本地开发仓库到云生产仓库的过渡非常容易。假设我们有一个在某处运行的预配实例,我们只需将它的连接和凭证添加到 Meltano 和 dbt 中的项目配置中。这些工具使得在部署目标之间切换变得非常容易。
对于真实的生产环境,您可能也不想从本地机器上运行这些工具。相反,您会希望使用基于云计算的方式来执行您的管道。你可以手工推出自己的解决方案,但幸运的是,现有的云*台易于使用。例如,dbt 的创建者将 dbt Cloud 作为托管服务提供,该服务“配备了对调度作业、CI/CD、服务文档、监控&警报和集成开发环境(IDE)的交钥匙支持。”
说到 CI/CD,通过配置和代码定义数据仓库的一个好处是,您可以使用版本控制系统(如 git)来管理这些文件,并将管道的执行视为类似于以仓库为构建目标的构建过程。如果你现在还不明白这些是什么意思,我们将在后面的教程中讨论一些 DevOps 主题。
虽然您的数据管道只能在需要时运行(无论是触发的还是),但您很可能希望超集连续运行,以便可以在需要时访问它。在生产环境中,您可能希望将它部署为托管 web 服务。类似于 dbt Cloud 如何提供运行 dbt 的托管服务, Preset.io 提供运行超集的托管服务。
我们在本教程中使用的示例有些过于简单,以便呈现整个堆栈和过程的概览,但后续教程将进一步深入到特定方面,并包括其他主题。其中包括配置 CI/CD 工作流、更高级的数据源提取、工作流与气流的协调、设计指标以及使用云仓库。
希望你觉得这个教程有用!
数据讲故事指南:用情感说服你的听众
原文:https://towardsdatascience.com/data-storytelling-guide-persuade-management-ee8270809dde?source=collection_archive---------23-----------------------
数字很无聊,人很有趣——汉斯·罗斯林
在 Unsplash 上由 Austin Distel 拍摄的照片
即使使用世界上最好的数据,你也不总是令人信服的。大多数人并不觉得统计数据或者事实有什么说服力。
一个引人注目的数据故事,你需要的是一个有同理心的主角,观众想要帮助他。
统计数据为什么打动不了决策者?
人们很少被统计数据所感动。大多数人都会做出情绪化的决定。后来他们用事实来解释他们的决定。你必须利用这种情感联系在你的听众中建立共鸣。这种同理心是利用其他人类甚至动物建立起来的。
零售商一直在使用这一策略,并取得了非凡的成效。一家零售商通过简单地改变策略,提高了销售额并减少了客户流失。他们最初的重点是创造满意的客户。这个策略没有得到他们想要的结果。
是什么原因导致成绩提高的?当公司从满足顾客转变为建立情感联系时。他们致力于完善人类最关心的东西。
通常,当数据专业人员考虑数据时,他们看不到“数据中的人”甚至不明白为什么听众需要这个话题。
你必须使你的数据人性化,以产生影响并创造情感联系。
而这个“人类”甚至可以是一条名叫玛丽·李的大白鲨。詹姆·达戈德出色地建立了对顶级掠食者的同情。
每一行数据都是某人的故事
几年前,我听到大卫·麦克肯多斯谈论采矿数据。他不喜欢“数据是新的石油”这种说法,他更愿意将数据视为“新的土壤”
这一点引起了我的共鸣。
是啊!数据使组织能够发现问题、解决问题和改进流程。我们不要忘记,这些数据行中有许多都与人有关。
在我每天使用的数据集中,每一行都有一个人。有人在为她孙子的聚会取钱。一个男人点击一个关于他梦想中的家的网络链接。有人对他已经偿还的债务进行投诉。
这些表格有数百万行——数百万种情感。
当一个数据故事凸显了其他人的痛苦时,我们会受到影响。毕竟,我们大多数人都不希望伤害降临到别人身上。我们不想让他们受苦;我们不想自己也这样。任何关于这些话题的故事都会吸引我们的注意力。
在罗斯林的 Ted 演讲中, *数字是无聊的。*人很有趣;他用自己来证明他的观点。他通过披露自己为了在家陪孩子而牺牲职业目标的故事,鼓励观众改变他们对家庭的看法。
更多的时候,他把人们作为说服者,而不是统计数据,来解释为什么这个想法对整个社会来说是个好主意。罗斯林博士已经不在了,但我们怀念他精湛的故事讲述。
增加人力来说服管理层
一名质量工程师在一个需要改变部门工作流程的团队中。没有人使用现有的,因为它很麻烦。这给下游用户带来了问题。
最好的解决办法是投资一些新设备。这看起来就像是一张幻灯片,上面有分解流程问题的图表。提交给管理层,等待下逐客令。所需的设备很昂贵。这不会是一次轻松的销售。
该团队采取了不同的方法,从数据表中提取员工姓名。他们就所面临的问题采访了每一个人。工人们有一些常识性的理由不遵循这个过程。
他们不是不服从;事实上,尽管过程失败,人们仍在努力完成工作。最终的演示强调了每位员工的体验。该小组熟练地展示了数据来支持这一叙述。
这种讲故事的技巧像魔术一样奏效。
管理团队更好地理解了问题的人性方面。请注意,华而不实的图表和统计数据没有说服任何人;是数据故事——数据中的人类。管理团队同情工人。他们想解决这个问题来创造一个更好的工作环境。
讲述一个强大的数据故事
当你创造你的数据故事时,要把人放在心上。
人类是你与观众建立情感联系的方式。查看您的数据,并找出其中的主要人物。当你向别人解释什么需要改变以及改变的原因时,你可以讲述他们的故事。
人口可视化的数据故事
原文:https://towardsdatascience.com/data-storytelling-with-population-visualizations-5734b72329d6?source=collection_archive---------15-----------------------
思考诺伍德·维维亚诺的艺术
在接种新冠肺炎疫苗后,我想做的第一件事就是去参观博物馆(当然,带着面具和社交距离),我的第一次参观是在得克萨斯州休斯顿的美术博物馆。
逛画廊的时候,我立刻被一个名为城市:背离和偏离的诺伍德·维维亚诺的展览所吸引。该展览的核心是对代表 24 个城市人口长期变化的时间序列数据的可视化。在过去两年的工作中,我一直专注于时间序列数据,这位艺术家成功地将这种数据类型可视化得如此之好,以至于它实际上属于博物馆,这让我很感兴趣。
图片作者。摄于德克萨斯州休斯顿的美术博物馆。代表诺伍德·维维亚诺的《城市:背离与偏离》
每个城市都由自己的玻璃吹制钟摆来代表,钟摆的长度代表时间,宽度代表人口,颜色的变化代表重大事件。因此,每个城市的人口趋势都以独特的 3D 可视化方式捕捉,让人想起小提琴的情节。大多数钟摆包含 3 个数据点,形成相当长的*滑形状。
该展览以其清晰的线条和现代的灰度有效地吸引了观众,甚至在你看到真实数据的表现之前就变得很明显。这是这种可视化的一个方面,我认为它非常强大——美术博物馆的观众比通常寻求数据可视化的观众更广泛,博物馆观众可以有效地被这个展览吸引和接触到。在你意识到之前,你会试着去思考这些人口趋势的巨大变化,并考虑当地的工业是如何改变来创造你所看到的模式的。视觉化是极简主义的,但是它的影响让你想要寻找更多的信息。
作为一名数据人员,这个展览也让我思考它遗漏了什么——维维亚诺做了什么决定以及这些决定的含义是什么。普通人不会花时间去思考数据的细微差别,事实证明,他们会过于迅速地相信数据和数据驱动模型的 T2 输出。我倾向于相信,对于城市这样的可视化来说尤其如此——干净的灰度外观会让你认为它的表现是绝对真实的。
但是正如我们数据人所知(或者至少应该知道),数据并不代表单一的内在真理。它们可能会被精心挑选和突出,以讲述特定的故事,即使在透明度方面做出了最大的努力,也可能会遗漏重要的细节或替代角度。在“城市:偏离和背离”展览中,我不禁想知道这些干净的玻璃线条可能隐藏了什么趋势和事件。
我决定观察其中 10 个城市的人口趋势,但取而代之的是包括我能找到的所有人口数据。我很好奇这种模式与维维亚诺的可视化有什么不同,他选择讲述的故事中可能遗漏了什么。要明确说明的是,我绝不是为了批评维维亚诺的作品而进行这个项目的。据我所知,他所陈述的所有数据都是准确和真实的。此外,当他用玻璃吹制这些作品时,期望他表现 20 个不同时间点的变化是不合理的。即使他可以,我个人认为,一个更微妙的形状会从他的钟摆的惊人的性质。毕竟,他是一个艺术家,可以自由地对待他的作品。
然而,我确实认为,在这些数据的引擎盖下看一点是一个有用的练习,提醒我们自己,数据并不是真理的全能力量。从完全相同的数据中可以得出不同的结论和讲述不同的故事,这取决于谁在分析它们以及他们想说什么。
方法
我做了合理的努力来寻找维维亚诺使用的相同数据以及任何其他可靠的人口估计。我使用的数据绝大多数来自美国人口普查,该普查每 10 年进行一次,尽管完整的数据引用可以在本文末尾找到。我分析的这十个城市是基于我自己对它们历史的一般兴趣而选择的,而不是由于数据中的任何预期发现。
虽然乍一看 Viviano 的钟摆看起来确实像小提琴图,但实际的小提琴图在这里并不可用,因为它们代表分布(像箱线图或直方图),并且不是以传统的 2D 形式设计来代表尺度随时间的变化。因此,我用简单的线形图捕捉了这些趋势,尽管为了更容易与维维亚诺的钟摆进行视觉比较,在线条下方画了阴影。如果你将一个钟摆纵向一分为二,并把它放在切割面上,你会看到类似于这些线图的趋势。所以,要比较这些线图和钟摆,最简单的方法可能是画出阴影区域的镜像以及曲线图本身。
城市
1.纽约
图片作者。摄于德克萨斯州休斯顿的美术博物馆。代表诺伍德·维维亚诺的《城市:背离与偏离》
我对纽约市的人口历史特别感兴趣,因为这是我称之为家的城市。总的来说,我认为我的线图所讲述的故事与维维亚诺的钟摆所讲述的故事非常同步。然而,由于没有包括 1850 年至 2010 年之间的数据点,从钟摆来看,似乎人口增长在 1850 年开始发生剧烈变化。然而,看一下线图,似乎这种变化实际上是从 1890 年左右开始的(进一步的研究表明,纽约市实际上在 1898 年扩大了它的边界,这可能解释了这种增加)。此外,1980 年人口有一个有趣的下降,但钟摆没有注意到。也就是说,我认为维维亚诺钟摆的 3D 特性比线形图更有效地捕捉了纽约经历的人口增长的绝对规模。
图片作者。数据来源见下文。
2.纽瓦克
图片作者。摄于德克萨斯州休斯顿的美术博物馆。代表诺伍德·维维亚诺的《城市:背离与偏离》
代表纽瓦克的钟摆很好地突出了该市直到 1950 年的持续增长和随后直到 1990 年左右的人口下降。然而,也许这个钟摆最擅长的是透视纽约市的人口总量。虽然这些钟摆的长度相当相似,但这些(几乎)相邻城市之间的相似之处也就到此为止了。代表纽约最*人口规模的巨大的碗绝对让在同一时期捕捉纽瓦克人口的细管相形见绌。纽瓦克的人口下降尤其引人注目,因为它与纽约市的钟摆并列,这有效地凸显了距离纽约仅半小时车程的另一座城市几十年来一直蓬勃发展。
图片作者。数据来源见下文。
3.波士顿
图片作者。摄于德克萨斯州休斯顿的美术博物馆。代表诺伍德·维维亚诺的《城市:背离与偏离》
然而,我认为波士顿人口变化的确切时间表因为只包括这三个数据点而有点丢失。虽然钟摆描绘了从 1640 年到 1950 年稳定、持续的增长,但看一下线图,实际上似乎人口增长率在 19 世纪初显著增加了。钟摆无疑突出了 1950 年开始的人口急剧下降,但完全忽略了自 1900 年代后期以来人口规模的小而稳定的增长。显然,维维亚诺更感兴趣的是让观众思考自 1950 年以来可能导致波士顿人口减少的因素,但我个人认为,思考这座城市如何以及为什么能够在*几十年来扭转这一人口趋势更有趣。
图片作者。数据来源见下文。
4.芝加哥
图片作者。摄于德克萨斯州休斯顿的美术博物馆。代表诺伍德·维维亚诺的《城市:背离与偏离》
代表芝加哥人口的钟摆特别有效。它与线图吻合得很好,在这种情况下,我不认为简化的设计丢失了任何重要的趋势(也许除了 1880 年左右人口增长率的适度增长)。事实上,我认为钟摆简单、干净的形状实际上比线形图更清楚地讲述了人口随时间变化的故事。
图片作者。数据来源见下文。
5.休斯敦
图片作者。摄于德克萨斯州休斯顿的美术博物馆。代表诺伍德·维维亚诺的《城市:背离与偏离》
代表休斯顿人口的钟摆是基于两个数据点构建的,但它仍然非常有效。正如你从钟摆图或折线图中看到的,休斯顿的人口自 1850 年以来一直在稳步增长,没有任何明显的停滞或人口数量的减少。事实上,钟摆可能比折线图更好地代表这些数据,尽管它的粒度增加了。钟摆的圆锥形状清楚地显示了 19 世纪休斯顿人口的快速增长,但这些增长在折线图中并不明显。这是因为,考虑到 y 轴延伸到 200 万,即使人口规模增加 100%,导致新人口数低于几千,也完全是小巫见大巫。
图片作者。数据来源见下文。
6.费城
图片作者。摄于德克萨斯州休斯顿的美术博物馆。代表诺伍德·维维亚诺的《城市:背离与偏离》
代表费城的钟摆完全掩盖了 1850 年左右发生的一些重大变化(可能是 1854 年的合并法案,根据该法案,费城吸收了几个周边地区)。看一下这个曲线图,在 1950 年之前似乎有两个人口增长时期:一个是从 1683 年到 1850 年左右的适度增长时期,另一个是从 1850 年以后的快速增长时期。虽然钟摆很好地捕捉到了 1683 年至 1950 年间的人口增长规模,但这种变化似乎并不像光滑的玻璃锥形所暗示的那样呈线性发生。然而,1950 年至 2010 年间的人口下降似乎得到了很好的体现,钟摆的形状非常有效地突出了这一点。
图片作者。数据来源见下文。
7.洛杉矶
图片作者。摄于德克萨斯州休斯顿的美术博物馆。代表诺伍德·维维亚诺的《城市:背离与偏离》
代表洛杉矶人口的钟摆是另一个通常相当有效的钟摆,在这种情况下,显示了这座城市自 19 世纪以来稳定而快速的增长。然而,我不太确定维维亚诺试图捕捉的变化是什么,因为白色圆锥与黑色圆锥相遇的点(1950 年)并没有通过线形图中增长率的变化反映出来。相反,线形图显示了至少自 1900 年以来相当一致的增长率。
图片作者。数据来源见下文。
8.凤凰
图片作者。摄于德克萨斯州休斯顿的美术博物馆。代表诺伍德·维维亚诺的《城市:背离与偏离》
这个钟摆又是一个类似的故事:城市的整体持续增长被很好地捕捉到了,但根据线图,似乎 1950 年的突破可能提供了凤凰城人口随时间变化的更全面的图片。
图片作者。数据来源见下文。
9.旧金山
图片作者。摄于德克萨斯州休斯顿的美术博物馆。代表诺伍德·维维亚诺的《城市:背离与偏离》
旧金山特别有意思。钟摆图和折线图都讲述了一个相似的故事,即在 20 世纪后半叶,总人口出现了短暂的下降。尽管这两种可视化类型可能是一致的,但它们都掩盖了这座城市历史上可能最有趣的人口变化:1848 年至 1849 年间,人口增长了 2500%,这与加州淘金热有关。如果你知道你在寻找什么,你肯定能识别这种变化。钟摆的底部有一个代表这种增加的小圆锥,线形图的第一个小而尖的部分也多少捕捉到了这种变化。然而,在这两种设想中,居住在旧金山的人口从 1,000 人突然增加到 25,000 人的规模与代表更*的人口水*所需的规模相比,绝对相形见绌。这个城市人口历史上的重要时刻只在我收集人口数据时看到的一个表格中引起了我的注意,这个表格计算了旧金山每一年人口数据之间的百分比变化。2500%的增长远远高于我在这个项目中见过的任何其他增长,因此它立即引起了我的注意。就像表格在视觉上不能有效表现随时间的变化一样,在这种情况下,一个简单的表格能够引起大多数钟摆图或折线图的观众的注意。
图片作者。数据来源见下文。
10.西雅图
图片作者。摄于德克萨斯州休斯顿的美术博物馆。代表诺伍德·维维亚诺的《城市:背离与偏离》
这最后一个钟摆,代表了西雅图的人口,是我发现非常有效的另一个例子。虽然线形图中一些明显的细微差别消失了,但清晰的线条和对比色传达了西雅图人口随时间变化的非常有效的叙事。
图片作者。数据来源见下文。
最后
在许多方面,维维亚诺的工作都非常有效。主要趋势传达得很清楚,在某些情况下比传统的折线图更清楚。
这个展览的 3D 特性可能是它最大的优势。用体积捕捉人口给观察者一种清晰、切实的比例感,这是其他可视化类型所缺乏的。然而,3D 方法的最大好处是它有助于城市之间的比较。折线图有一种趋势,使一切看起来好像是在同一尺度上。上面的每一个线形图在 x 轴上包含的年数方面有所不同,而 y 轴变化如此之大,以至于有些以千为单位,有些以百万为单位。虽然对所有这些地块使用标准化的坐标轴肯定是可能的,但这将使它们更加难以阅读,同时仍然被 Viviano 的方法所掩盖。并排观察这些钟摆,并根据钟摆的相对长度立即了解哪些城市存在的时间最长(或拥有的可用数据量最少),同时清楚地了解这些城市之间的规模差异(再以纽约和纽瓦克为例),是非常容易的。虽然线图倾向于让一切看起来好像是在相同的尺度上,但钟摆实际上是在相同的尺度上。
也就是说,任何数据可视化都不可能是完美的。钟摆遗漏了一些趋势和重要的数据点,但是如前所述,观众可能仍然会接受这些可视化,作为一个更完整的故事的代表。更令人担忧的是,如果一个观察者没有用批判的眼光去看这些钟摆或我的线图,他可能会忽略这两种可视化最重要的问题:数据本身的质量。我使用的大部分数据来自美国人口普查,据我所知,维维亚诺自己也使用了大部分数据。人口普查是一个非常有价值的公开数据来源,并提供了一些我们所拥有的最好的人口估计,但它也是出了名的有问题。在人口普查中,许多人口很可能会被少算,因此在上面的可视化中,包括儿童、租房而非自住的个人、无证件的人以及居住在保留地上的美洲原住民。
我赞扬 Viviano 以一种新颖、有创意的方式将数据可视化,这种方式可能会影响到广泛的受众。但他的工作也提醒了我继续谈论数据复杂性的重要性,以及质疑一组给定数据中可能隐藏的其他故事以及数据本身有效性的绝对必要性。
人口数据来源
注意:虽然下面有更多关于原始数据来源的信息,但我使用的绝大多数数据最初来自美国人口普查。
纽约市:
- https://www1 . NYC . gov/assets/planning/download/pdf/data-maps/NYC-population/historical-population/1790-2000 _ NYC _ total _ foreign _ birth . pdf
- https://www1 . NYC . gov/assets/planning/download/pdf/planning-level/NYC-population/historical-population/NYC _ total _ pop _ 1900-2010 . pdf
纽华克:
- https://en.wikipedia.org/wiki/Newark,_New_Jersey
波士顿:
- http://www.iboston.org/mcp.php?pid=popFig
- http://censusviewer.com/city/MA/Boston
芝加哥:
- http://physics . bu . edu/~ redner/projects/population/cities/Chicago . html
- http://censusviewer.com/city/IL/Chicago
休斯顿:
- https://www . Houston tx . gov/planning/Demographics/docs _ pdf/Cy/hist _ pop _ 1900 _ 2017 . pdf
- https://en.wikipedia.org/wiki/Houston
费城:
- https://en.wikipedia.org/wiki/Philadelphia
洛杉矶:
- https://en.wikipedia.org/wiki/Los_Angeles
凤凰:
- https://en.wikipedia.org/wiki/Phoenix,_Arizona
旧金山:
- https://en.wikipedia.org/wiki/San_Francisco
西雅图:
- https://en.wikipedia.org/wiki/Seattle
上图编译的数据和代码见 本 GitHub 回购。
数据层
原文:https://towardsdatascience.com/data-strata-6bc0d8484381?source=collection_archive---------34-----------------------
揭示数据可视化的中立性和透明性
这篇文章探讨了数据可视化设计中的中立性和透明性问题。更具体地说,它分解了数据可视化的生产和消费中涉及的几个“数据层”,其中,在数字和视觉中,设计者也是其中之一;并随后提出每个阶层应该如何将数据及其可视化视为主观而非客观的实践。最后,它触及了设计者的责任和读者在参与数据可视化设计时的责任。
图片由作者提供,灵感来自地质剖面图和数据可视化图(原文图片在文末)
数据可视化:一个中间环节
数据可视化通常被描述为结合了许多学科的元素:来自地图学的地图设计原则,来自统计学的在图表中显示数字数据的惯例,来自图形设计的使用类型、布局和颜色的最佳实践,以及来自新闻学的写作和讲故事的原则,等等(Cairo 2013: 23)。虽然这是有利的,因为它允许大量的扩展和变形,但这也意味着数据可视化嵌入了某些预定的期望。主要地,这些与数据可视化的中性(在数据中)和透明(在视觉上)的普遍认知有关。在最*出版的《社会中的数据可视化》(2020)一书中,Kennedy、Weber 和 Engebretsen 将这两个维度定义为数字阶层和视觉阶层 (172)。
关于数字阶层,如何和为什么收集数据的问题可以追溯到最早的笔记实践(git Elman 2013);然而,数据科学和数据可视化的相关性越来越强,这促使人们质疑我们对数据本身的理解,以及我们如何表述真理的主张(Braun 2017: 9)。在统计学和数据科学领域,数据通常被描述为“原始”状态,因为它代表了从人类代理收集的具有脱离实体性质的现象。而且这种数据往往是数值型的,反过来质疑我们对数字是否中性的认知。18 世纪科学革命在数学真理中的中心地位意味着事实是普遍的,因此永远是预先存在的(Rock 2013: 48),使得数字“在历史上是可信的,因为它们看起来是普遍的、非个人的和中立的”(Kennedy,Weber,Engebretsen 2020: 172)。随着摄影中机械客观性的兴起,这种看法得到了加强,正如吉特曼指出的那样,“只是在十九世纪中叶才成为科学中的主导理念”——随着第一次摄影过程的出现,“观察者对人类在产生栩栩如生的图像中的作用的明显位移感到震惊”(2013: 5)。这种简单的摄影——一种视觉表现——一种中立感:机械摄影是一种不偏不倚的代理人,而人工绘画则不是。这一点后来受到质疑,但仍然存在于对客观数字的理解和数据可视化的视觉本质中。借用 git Elman(2013)的表述,没有所谓的原始数据:这是一种矛盾修饰法。
至于视觉层,首先是*面设计中的形式/内容话语,质疑视觉在*面表现中的“可见”或透明程度。这一点的缩影是 Beatrice Warde 在 1930 年提出的排版要透明,不要妨碍其内容和文本(比喻为一个水晶高脚杯,不会模糊好酒的质量)。外推至数据可视化领域,这相当于爱德华·塔夫特在他有影响力的著作《定量信息的可视化显示》(2001 年)中提出的内容:对他来说,透明性是一种信念,即可视化应该是数据的客观表示,而不是阻碍或扭曲它。但正如迈克尔·洛克指出的,焦点一直错误地集中在高脚杯上,而实际上,一切都是为了酒 (2013: 92)。第二,就视觉领域而言,图形与视觉有很大关系,从这个意义上说,它与写作的关系大于与口语的关系。正是“文字的视觉本质导致了在口头文化中不可能出现的客观想法”,因为文字“将知者与被知者分开”(Rettberg 2020: 37)。卡尔弗特也认为,语言的口头质量长期以来“被认为是文学审美的核心(……),而视觉在很大程度上被认为是审美和语义无关的”(2012: 314)。作为图形表示,一方面,数据可视化嵌入了对书写和图形的不信任,另一方面,嵌入了形式透明而不混淆内容的理想。
无论是允许分析和客观立场的视觉,还是数据可视化的定量性质,“赋予他们这种权威感”(Rettberg 2020: 39),正如 Goatley 在前面段落的大部分讨论中所证明的那样,“这不是美学的问题,而是本体论的问题:图形不会透明地揭示数据——它们创造了对数据的新的主观解释”(2019: 25)。事实上,就像数据不同于它所测量的一样,任何信息的图形表示在现象上都不同于信息本身。
设计师阶层
在试图分解数据可视化中的中立性和透明性的含义时,上述论点集中于分析数字和视觉层次。然而,正如 Alberto Cairo 所指出的,在将数据转化为结构化信息的过程中,有一个沟通者赋予了“数据形状”(2013: 16)。通过设计可视化,设计者是整个过程中的一个代理,并且不可避免地是另一个数据片段。就像数字和数据不仅仅存在一样,数据可视化也不存在:它们是为了特定的原因,有目的,由某人创建的。把这个数字带到表面是有意义的,因为是代理人将的数字阶层精确地解释为的视觉阶层,并且,同样地,在这些话语的中心——设计师阶层本身。他们的角色包括围绕数据和图表的全部或部分思考、收集、记录、绘制、分析、思考、翻译、综合和总结。
设计师作为作者
把设计者想象成一个代理人会引起权威性的问题。正如 Michael Rock 指出的那样,在*面设计的论述中,作者身份允许“在一个传统上与交流而不是信息来源更相关的职业中理解设计过程”(2013: 46)。此外,可以认为信息的交流本身就是一种发起行为,因为它意味着由交流者决定的一系列决定。有趣的是,科学和艺术在数据可视化中的相似之处可以在作者的概念中找到。洛克认为,直到最*,文学作品中的无作者文本比有作者的文本更有真实性。他接着说,另一方面,科学文本,“至少在文艺复兴时期,需要作者的名字作为验证”(Rock 2013: 47)。这是因为科学是基于主观发明和科学家的权威,而不是基于客观事实。然而,随着科学革命在数学真理中的中心地位,情况发生了逆转:文学是由作者创作的,而科学是匿名客观性的产物。这种对文本的所有权和授予文学作者的权威“助长了 20 世纪对作者身份的痴迷”(Rock 2013: 48)。图形艺术与文字和图形的本质相关联,采用了许多这样的话语——图形设计也是如此。
数据可视化设计者因此继承了科学家和图形艺术家的无作者性。这种权威的缺乏可以说促成了数据可视化作为客观真理的想法。尽管作者的概念是一个需要考虑的重要因素,因为它将作品背后的某人的形象带到了最前面,但更重要的是对这个人如何塑造作品的理解才是最需要分析的。无论他们是内容的创造者还是推动者,在我看来,正是设计师的世界观塑造了他们的设计,这可以被称为一种创作模式。设计师是一个交流者,在他们转化为视觉形式的信息中有影响力。
作为数据的设计器
设计师阶层给数据阶层带来了什么?作为创造性的实践者,我们把自己带到我们做的每一件事上:正如弗里德曼所说,设计师不是“设计过程本身的中心”,而是“他或她个人感知过程的心理中心”(2001: 39)。我们还“与我们创作的作品有着密切的物理联系,不可避免的是,我们的作品带有我们的印记”(Rock 2013: 95)。同样,这个个人感知过程也会影响数据可视化的中立性和透明性。正如 Gitelman 指出的,“不同的可视化效果是不同的,设计得好或不好,所有数据集都可以被多重可视化”(2013: 12)。个人设计,以及关于设计的想法,与更广泛的价值观有关。
正如 Kennedy 和 Engebretsen 所说,“符号资源所承载的潜在意义取决于文化习俗和特定的使用情况,包括人类参与者的背景和动机”(2020:25);同样,吉尔·辛普森认为数据可视化具有“情境性”(2020: 162)。正如研究人员需要反射性地意识到他们的实践社区如何作用于他们以及他们如何作用于他们(Crouch,Pearce 2012: 42),设计师也应该对他们的图形制作采取反射性的立场。所有这些影响主体以观众可能看不到的方式塑造了设计,但却带着设计师的印记。
认识到我们都是我们个人生活经验的产物(不忽视我们在更广泛的人类群体中的地位),是否值得考虑一种更柔和的方法来看待数据可视化设计师?将他们理解为“材料-符号故事讲述者”(沃德 2008: 5),而不是真理揭示者,设计师是“被赋予创造形式、解决问题、做出判断和赋予意义的能力的专家”(Lupton,Abbot-Miller 1996: 70)?这种反思的立场也应该包括责任,为了产生信任,数据可视化者可能需要相应地开放他们的选择。Lauren Klein 和 Catherine D'Ignazio 发起的“数据女权主义”运动的原则之一是拥抱多元主义,提出自我表露和拥抱多元主义如何能够揭露有助于创建数据可视化的决策,以这种方式从当前对客观性的强调转向有利于促进通向多重真理的设计(2020: 125)。也许问题不在于真实性,而在于可靠性,因此设计师可以拒绝透明的话语,而是积极地采取一种反思的立场,在这种立场上,他们能够理解自己和他人在交流和意义构建行为中的意识形态假设之间的关系。
朗读者
最后,包围数据层的是一层:读者,这一层的意义制造设备的生产是原因。强调读者作为消费者的责任是很重要的:与其要求数据可视化者一方透明,他们应该承认是否参与数据可视化设计的选择最终取决于他们自己,而且他们必须知道他们不仅在消费其他人的思想产品,还在消费更广泛的讨论的产品。正如 Rock 指出的那样,任何翻译都“反映了原作的特征和当代的精神以及译者的个性”(2013:54)——在最好的情况下,*面设计“只是反映了整个文化已经感受到的情感”(Stinson 2018: np)。正是之前讨论过的与数据、数字、图形和作者的麻烦关系,似乎将设计师与其他知识生产者区分开来,认为作为知识生成的一部分,可视化应该是中立的。但它们就像任何其他人为事件一样,是不完美、主观和复杂的数据的另一个实例(Lupi 2017)。作为读者,挑战在于理解构成设计语言的多种方法,以及决定“如何在我们的设计选择中表达我们个人身份的细微差别”(Rawsthorn 2018: 75)。作为读者,我们也会对自己的选择产生反思。
数据层
不要把数据可视化理解为数字和视觉层次的集合,这些层次据称是中立和透明的,合并后更是如此,而应该把重点放在考虑它是一个重新措辞、重新解释和重新呈现内容的独特实体。无论是数据、数据的可视化,还是数据的可视化者,都“不代表先验的真理,而是提供构建的、易错的、主观的世界观”(Goatley 2019: 25)。尽管数据可视化因其继承的历史而在真实性方面受到怀疑,但它越来越成为我们传递信息的一种方式。作为人类,我们所做的一切都是试图理解事物,因此现在“解除怀疑的禁令,充分发挥视觉的潜力,以产生和编码知识作为解释”(德鲁克 2014: 11)。应该更加强调倡导更多的“数据素养”吗?正如 Johanna Drucker 在她的书 Graphesis 中漂亮地提出的那样,我们认识到我们的生活在多大程度上是由数据可视化调节和塑造的,这是至关重要的,这需要对我们不断参与的图形领域有更好的理解。我们不应该期待中立和透明的数据可视化的生产和消费,而应该培养更重要的思维,以指导我们所有人处理批判性地参与我们周围的图形设备的能力。
本文开头的图片是一个建议的图表,它映射了文章中概述的数据可视化所涉及的所有元素。它使用地质“地层”的比喻来证明所有的层,并引用数据可视化与地图制作和图解结构的联系。它基于 Alberto Cairo 的图表从现实到人们的大脑 (2013: 16,图 1.8),以及地球上早期的地质层图表。
地质地层图。来源
阿尔贝托·开罗,“从现实到人们的大脑”,来自《功能艺术》。来源
注释
- 因为它们代表数据或信息——也就是说,所使用的数据本身是中立的、无偏见的和客观的。
- 假设它们是图形性质的(在视觉上映射、渲染、显示、理解和推理信息),也就是说,所使用的图形设备不应该混淆它们显示的内容。
- 认识到数据可视化作为探索数据和解释数据的手段的双重角色,这个人物也可以被认为是设计者,甚至是数据本身。
参考文献
布劳恩,s。) (2017).成功的数据可视化。维多利亚图像出版集团。
开罗(2013 年)。功能艺术。旧金山:新骑手。
卡尔弗特,S. (2012),‘素材,文本-图像’,创作实践写作杂志 4: 3,第 309–328 页,doi: 10.1386/jwcp.4.3.309_1
克劳奇,皮尔斯,J. (2012 年)。做设计研究。ProQuest 电子书中心。于 2021 年 1 月 10 日在 UAL 创作。布卢姆斯伯里出版公司。
j .德鲁克(2014 年)。字形。哈佛:哈佛大学出版社。
D'Ignazio,c .,Klein,L. (2020 年)。数据女权。麻省理工学院出版社。
弗里德曼(2001 年)。创造设计知识:从研究到实践。IDATER 2000:设计与技术教育研究和课程开发国际会议。
吉特尔曼,l。) (2013).“原始数据”是一个矛盾修饰法。坎布里奇:麻省理工学院出版社。Goatley,W. (2019)。批判性数据美学:走向数据美学的批判性反思实践。苏塞克斯大学博士论文。
h .肯尼迪、w .韦伯和 m .恩格布雷森(2020 年)。新闻中的数据可视化和透明度。在肯尼迪 h .和 Engebretsen M .(编辑。),社会中的数据可视化(第 169–186 页)。阿姆斯特丹:阿姆斯特丹大学出版社。doi:10.2307/j.ctvzgb8c7.17
Lupi,G. (2017 年 1 月 30 日)。数据人本主义:数据可视化的革命性未来。印刷杂志。检索自 http://www . print mag . com/information-design/data-humanism-future-of-data-visualization。
艾博特-米勒(1996 年)。设计写作研究。伦敦费登。
Rawsthorn,A. (2018 年)。设计作为一种态度。苏黎世:JRP·林格。
Rettberg,J. (2020 年)。数据可视化的认知方式。在 Engebretsen M .和 Kennedy H .(编辑)、社会中的数据可视化(第 35–48 页)。阿姆斯特丹:阿姆斯特丹大学出版社。doi:10.2307/j.ctvzgb8c7.8
洛克,硕士(编辑) (2013).多重签名:针对设计者、作者、读者和用户。纽约:里佐利。
Stinson,L. (2018) 千禧一代的极简主义正在退场吗?,AIGA 设计之眼,2021 年 1 月 25 日访问。
沃德,m .,威尔基,A. (2008)。关键制造:设计注意事项。设计网络:设计历史学会会议。
数据策略:让数据有价值
原文:https://towardsdatascience.com/data-strategy-make-data-count-fa42b42d409?source=collection_archive---------39-----------------------
创建一个让您的数据扬帆起航的战略
托姆·米尔科维奇在 Unsplash 上拍摄的照片
T4 数据正在推动我们的经济。企业正在利用数据做出更好的决策、优化运营并创造新的收入来源。或者他们是?
公司每天都在积累大量的数据。尽管他们的工资单上的数据专业人员的数量(和种类)每年都在增长。然而,数据技术并不是免费的——大型科技公司营收的飙升就证明了这一点。
“希望不是策略。”本杰明·奥拉·阿坎德
虽然许多公司都在向数据、数据专业人员和数据技术投入大量资金,但高德纳公司和其他公司不断报告数据科学项目的灾难性失败率。
显然,在数据上投入金钱和人才是不够的,数据可能是非常有价值的商业资产。致命的 80%及以上的失败率甚至可以消除最明智的投资。这不仅让比尔·施马尔佐发疯了!
那么,问题是什么呢?
简单来说,缺乏数据策略。
约吉·贝拉将这种数据脱节完美地解释为:“如果你不知道你要去哪里,你会到达另一个地方。”
什么是数据策略?
数据策略听起来像一个无聊的公司文件。但原则上,它遵循一个非常简单的方法来最大化数据的好处。我认为数据战略有三个部分:
- 你想解决什么业务问题?
- 那你需要做什么?
- 你打算如何完成这件事?
在高层次上,很难对这种通用的问题解决方法提出异议,但是让我稍微扩展一下。
1.你想解决什么商业问题?
每个数据策略都需要有针对性。对于数据将如何支持业务,需要有一个清晰的愿景,以及在(比如)未来两到三年内要实现的明确目标。数据战略需要与业务战略保持一致。它必须考虑业务和运营需求,以及公司的道德原则。
业务目标可能是最小化下行风险、支持业务目标或两者的结合。您的公司可能希望增加收入、盈利能力或客户满意度,或者降低成本。或者,它可能希望检测和限制欺诈,或者更好地管理财务或供应商数据。
目标越具体越好。例如,增加收入是一个很好的目标。增加*均票价更好。增加*均购物篮尺寸甚至更多。原因是它有助于缩小数据团队的关注范围,减少误解的空间。
2.你需要什么来做到这一点?
众所周知,要实现数据的价值,您需要:
- 技术,
- 人,
- 分析,自然地,
- 数据。
当考虑需要什么来实现第 1 点中概述的问题的解决方案时,考虑所有这些方面。我发现在深入今天的现实之前快速思考“蓝天”是有帮助的。
想想你需要什么数据来解决你定义的问题。你能在哪里得到他们,他们的格式是什么,质量如何?你能多快获得它们,花多少钱?事实一次又一次地证明,拥有合理质量的相关数据要优于大量的数据。
接下来,考虑构建解决方案并将其交付到生产中所需的技术。最终游戏——实际部署解决方案并解决业务问题——绝对至关重要。MLOps 领域的最新发展表明,建立一个解决商业问题的模型仅仅是个开始。将它部署到产品中,监控它,确保数据、模型和代码的质量至少同样重要。
设计数据基础设施的正确架构,使您能够收集、处理、分析和交付数据。没有人知道未来会是什么样子,所以尽量不要锁定任何架构或供应商。
考虑您可能需要在解决方案中使用哪些分析。这也常常决定了对技术、数据和人员的要求。
接下来,想想你需要在数据团队中有什么角色和个性,数据团队应该在组织中处于什么位置,以及他们应该如何运作。
最后,不要忘记组织中的其他人,可能还有其他人,如客户或供应商,他们可能会参与您的数据策略或受其影响。考虑你需要从他们那里得到什么样的合作,你希望他们如何表现,责任、角色和治理规则是什么?
3。你打算怎么做?
一旦你知道你在解决什么,你在哪里,你想去哪里,是时候把它分解成可操作的步骤了。这绝不容易。
人们需要创建一个包含一系列项目的路线图,快速交付价值,打开未来的机会,并最终(尽可能多地)解决最初的问题。
我倾向于并行运行多个流,每个流侧重于:
- 商业和分析问题;
- 数据基础设施;和
- 人员——包括数据团队和更广泛的组织内的人员。
第一个项目符号的示例可能是推荐引擎或需求预测模型的版本 1。第二种可以通过实现能够部署所述推荐引擎或需求预测模型的技术来表示。第三项要求雇佣、培训和发展数据团队,以及与组织建立桥梁——理解业务问题以及解释数据和分析能做什么和不能做什么。
只要有可能,把网撒得更大一点也是明智的。收集手头问题所需的数据和更多的数据,将解决当前问题的技术放在一起,并为未来的提供灵活性。这样,在解决问题的同时,你也为将来(不可避免的)复杂情况做好了准备。分析也给了公司学习和适应的优势。
如何创建数据策略
数据策略的创建是一个协作过程。这不可能在真空中完成。它需要首席数据官、高管和其他相关人员之间的密切合作。
需要几周的时间来了解当前的情况(或“现状”),讨论业务目标,概述解决方案以及如何实现它。数据战略正式确定后,需要与时间表、里程碑和预算一起获得批准。
不要忘记什么—数据战略的执行
现在变得有趣了。拥有数据策略固然很好,但是布丁的好坏还得靠吃——成功地执行策略才是最重要的。
让我来分享与数据策略的执行相关的三个要点,它们是数据策略本身所包含的重要内容。
- 数据策略原则
- 项目管理的细节
- 成功的度量和测量
在数据策略中包含有意义的原则有两个好处。首先,当面临运营决策时,它为数据团队提供指导,而不需要一次又一次地在每个细节上保持一致。其次,创建原则的过程提供了业务和数据团队之间的初始一致性。
众所周知,管理数据科学项目要求很高,很大程度上是因为科学部分(需要创造力,并且通常有不确定的时间表)。在数据策略中认识到这一点,并概述最大限度地减少延迟和沟通失误的方法,是很好的第一步。
需要从一开始就同意、设计和跟踪成功的度量和措施。超过 80%的失败率根本没有其他办法。首席数据官以及首席执行官和其他高管需要知道数据战略的执行是否在正轨上,取得了哪些成果,哪些没有奏效。请记住,数据战略不是一成不变的,应该定期与高层管理人员以及数据团队讨论进展和最新发展。
请参考下面的文章,了解执行数据策略的更多技巧。
结论
拥有一个数据战略从根本上改变了对数据的期望。务实地思考 你想解决什么商业问题;你需要做什么;以及你将如何完成这件事 就是它所需要的。确保您的数据战略涵盖所有与数据相关的杠杆: 业务、数据基础设施、数据和分析,以及人员 。
此外,数据项目管理的细节也应在数据战略中得到认可和解决,使其成为一个动态文档,并定期跟踪数据团队和高级管理人员的进展,以真正实现您组织中的数据承诺。鉴于我们正处于新日历年的开端,现在是启动战略起草流程或拿出去年的战略进行更新的最佳时机。祝你好运!
和以往一样,我无限感激 切尔西·威尔金森 耐心地将我的想法塑造成可出版的格式。
感谢阅读!
欢迎在评论中分享你的想法或观点。
跟我上 中LinkedIn和 推特 。
数据科学中的数据结构和算法问题讨论
原文:https://towardsdatascience.com/data-structure-and-algorithm-questions-in-data-science-a-discussion-c53cd38d2079?source=collection_archive---------28-----------------------
假阳性还是假阴性?
除了数据操作、分析见解和业务沟通,将数学和统计数据转化为代码来建模或探索问题的能力是伟大的数据科学家的标志之一。
数据分析的一个众所周知的方面是,更多的数据=更好的洞察力,但是为了随着数据集大小的增加编写高效的代码,我们需要理解数据结构和算法。在不考虑时空复杂性的情况下处理数十亿甚至数兆字节的数据,通常会在数据管道中等待很长时间,无论是训练机器学习模型还是只是进行一些简单的数据清理。
这是在招聘数据科学家时可以筛选的东西(你好,Leetcode 和 HackerRank),但这是一个很好的能力指标还是只是一个错误的肯定/否定?
一如既往,这取决于你在寻找什么。
马库斯·温克勒在 Unsplash 上的照片
好人
数据结构和算法问题真正出彩的地方在于允许候选人展示编码能力和解决问题的能力。为了很好地解决算法问题,需要以下内容:
- 所选语言中可用数据结构和操作的知识
- 快速理解和分解问题的解决问题能力
- 理解和思维过程的交流
- 将解决方案转化为高效代码的能力
- 以上都是在压力下实时完成的
坏事
虽然以上是必备的分析技能,但仅仅解决算法问题并不能定义一名优秀的数据科学家。这可能会导致误报和漏报,因为它通常不会测试大多数此类角色的实际要求:
- 利益相关者管理和项目(包括特别问题)优先排序
- 编排、管道和查询优化(数据工程技能)
- 事实表、维度表和非规范化表(分析工程技能)
- 数据可视化、沟通和战略洞察力(数据分析技能)
- 模型原型、开发和评估(数据科学技能)
结论
虽然学习时空复杂性并花时间熟悉数据结构无疑拓宽了我的数据科学工具箱,提高了我的整体编码和问题解决技能,但以上只是一些技能的例子,这些技能不能通过仅仅依靠数据结构和算法问题来测试。
作为围绕这一主题的讨论的一部分,我认为,如果使用这类问题,只应将其视为候选人整体能力的一部分,理想情况下,应将其与知识、基于项目和方法类型的问题混合在一起。更老的学校方法是设置反映职位要求的工作的带回家的任务,这可能是对技术能力更有用的评估,但在这种情况下,应该注意尊重候选人的时间。我支持设定一个 3-6 小时的时间限制,以标准化候选人所用的时间,同时给他们展示技能的机会。
题外话:大 O 符号
在 Unsplash 上由 Aron 视觉拍摄的照片
对于那些以前没有遇到过时空复杂性的人,这里有一个快速的旁白。
考虑到时空复杂度,算法的最坏情况时空复杂度用大 O 符号描述,其中空间复杂度包括输入使用的空间(辅助空间仅指算法使用的额外空间)。大 O 符号是以 *O(复杂度)*的形式,其中复杂度是根据输入 n 的大小来写的。
例如,如果一个名字列表有 n 个条目,从列表的开始到结尾搜索一个名字具有 O(n) 的时间复杂度,因为最坏的情况是该名字是列表中的最后一个值。空间复杂度是 O(n) ,因为输入的长度是 n ,但是使用的辅助空间是 O(1) ,这正好是存储目标名称以便与列表条目进行比较所需的空间。
无论输入的大小如何,都需要恒定的时间的算法通常是数据结构操作,如访问数组索引、将节点插入链表或推入堆栈。
使用 Python 的数据结构和算法—在 10 分钟内学会堆栈、队列和队列
原文:https://towardsdatascience.com/data-structures-and-algorithms-with-python-learn-stacks-queues-and-deques-in-10-minutes-e7c6a2a1c5d5?source=collection_archive---------20-----------------------
掌握 Python 中的数据结构和算法。包括源代码。
照片由罗汉 G 在 Unsplash 上拍摄
今天的文章是关于 Python 的数据结构和算法的介绍。我们将从简单的开始,在这个过程中,您将了解三种基本的数据结构——堆栈、队列和队列。
此外,您将学习如何从头开始实现它们。开始吧!
这篇文章的结构如下:
- 大量
- 行列
- 德克
- 最后的话
大量
先说最简单的。您可以将堆栈视为有序的数组,其中条目的添加和移除都发生在同一端。堆栈基于后进先出原则(后进先出)。这意味着最先删除的是最*的项目。
让我们来看一个示例图:
图 1 —堆栈图(来源:computersciencewiki.org)
正如你所看到的,LIFO 原则是栈数据结构的本质。堆栈开始处的项目(称为基)在堆栈中最长。
堆栈示例*:web 浏览器中的后退按钮。*当你浏览页面并想返回时,最*的网站被关闭,或者弹出一个堆栈。
就实现而言,Stack
类将需要三个方法(加上构造函数):
push(value) -> None
—将值添加到堆栈中pop() -> Any
—从堆栈中删除最*的值is_empty() -> bool
—检查堆栈中是否有项目
下面是用 Python 从头开始实现堆栈的代码:
让我们做几个测试:
正如您所看到的,堆栈数据结构像宣传的那样工作。让我们探索下一个。
行列
与堆栈不同,向队列添加项发生在数组的开头(索引位置 0),而移除发生在相反的一端。这个原则更广为人知的是 FIFO ( 先进先出)原则。因此,最*添加的项目必须等待其他项目被处理。
让我们来看一个示例图:
图 2 —排队图(来源:computersciencewiki.org
看一下上面的图表应该会有一些印象,因为它看起来和日常情况很相似。
排队举例 :基本上你站在的任何一条线上——从杂货店、自助餐厅,到医生办公室——第一个排队的人最先出队。
就实现而言,Queue
类将需要四个方法(加上构造函数):
enqueue(value) -> None
—将新项目添加到队列的末尾dequeue() -> Any
—删除队列中的第一个项目is_empty() -> bool
—检查队列中是否有项目peek() -> Any
—返回队列中的第一个项目,但不删除它
下面是用 Python 从头开始实现队列的代码:
让我们做几个测试:
这就是全部了。您可以自由地实现额外的方法或执行进一步的检查,但是脚本中的方法应该足够了。
德克
deque 数据结构与前两种非常相似,但不需要 LIFO 或 FIFO 排序。与堆栈和队列不同,deques 有两端,您可以在任一端添加和移除项目。
让我们来看一个示例图:
图 3 —德克图(来源:programiz.org)
总而言之,deque 是一种混合数据结构,它实现了堆栈和队列的所有功能。
就实现而言,Deque
类将需要五个方法(加上构造函数):
add_front(value: Any) -> None
—将新项目添加到队列的前面add_rear(value: Any) -> None
—在队列末尾添加一个新项目remove_front() -> Any
—从队列中返回第一个项目并删除它remove_rear() -> Any
—返回队列中的最后一个项目并删除它is_empty() -> bool
—检查队列中是否有项目
下面是用 Python 从头开始实现队列的代码:
让我们做几个测试:
这都是关于德克人的!接下来让我们总结一下。
最后的话
今天,您已经学习了三种基本的数据结构——栈、队列和 deck——并在 Python 中从头开始实现了它们。根据您试图实现的逻辑,这些对于解决不同的编程任务会很方便。
还有,从零开始实现这些或者基于它们执行一些操作,有时候会成为一个编码面试问题,所以适当学习一下也无妨。
请继续关注 Python 系列的其余数据结构和算法,其中我们将探索不同的主题,如链表、递归、树、搜索、排序等。
感谢阅读。
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
https://medium.com/@radecicdario/membership
了解更多信息
- 我作为数据科学家卖掉我的 M1 Macbook Pro 的三大理由
- 如何使用 Cron 调度 Python 脚本——您需要的唯一指南
- Dask 延迟—如何轻松并行化您的 Python 代码
- 如何使用 Python 创建 PDF 报告—基本指南
- 即使没有大学文凭也要在 2021 年成为数据科学家
保持联系
- 关注我在媒体上的更多类似的故事
- 注册我的简讯
- 在 LinkedIn 上连接
使用 dplyr 语法的 data.table speed with!
原文:https://towardsdatascience.com/data-table-speed-with-dplyr-syntax-yes-we-can-51ef9aaed585?source=collection_archive---------37-----------------------
当你可以同时拥有速度和可读性时,为什么要在两者之间选择呢?
萨姆·皮尔斯-瓦里洛在 Unsplash 拍摄的照片
r 有很多很棒的数据辩论工具。其中两个是 dplyr 和数据表包。虽然 dplyr 具有非常灵活和直观的语法,但 data.table 在某些情况下可以快几个数量级。
其中一个场景是在大量组上执行操作时。例如,在处理 CRM 数据时会发生这种情况,其中每一行都描述了一个接触点或交易,并且人们对计算每个客户的行数、每个客户的所有交易的货币价值等感兴趣。
最* Rstudio 发布了 dtplyr 包版本 1.0.0,为 dplyr 提供了数据表后端。
使用 dtplyr 几乎不需要学习额外的代码。使用lazy_dt
函数启动数据表序列,之后写入常规 dplyr 代码。只有在调用as_tibble
(或as.data.frame
等)时,代码才会执行。
因此,举例来说,一个利用 dtplyr 进行多组操作的简单管道应该是这样的:
mtcars %>%
lazy_dt() %>%
filter(wt < 5) %>%
mutate(l100k = 235.21 / mpg) %>% *# liters / 100 km*
group_by(cyl) %>%
summarise(l100k = mean(l100k))## Source: local data table [?? x 2]
## Call: `_DT1`[wt < 5][, `:=`(l100k = 235.21/mpg)][, .(l100k = mean(l100k)),
## keyby = .(cyl)]
##
## cyl l100k
## <dbl> <dbl>
## 1 4 9.05
## 2 6 12.0
## 3 8 14.9
##
## # Use as.data.table()/as.data.frame()/as_tibble() to access results
唯一的警告是,和所有其他类似接口一样,一些更复杂的操作可能不被支持。
有趣的是,虽然 data.table 有很多基准测试,但我找不到任何关于 dtplyr 的基准测试。所以我决定自己进行一个快速的基准测试。
在这篇文章中,我将检查 dtplyr 相对于 dplyr 改进了多少,以及它的性能是否足够接*数据表以被视为有效的替代方案。
为此,我将重现 data.table 作者 Matt Dowle 在 2018 年 12 月完成的一些基准测试。
基准点包括:
- 5 简单的查询:不同类型的不同列上的大组和小组。类似于数据分析师在实践中可能做的事情;即当数据被探索和调查时的各种特别聚集。
- 每个包都在其自己的新会话中单独测试。为此,我在为每个包运行基准代码之前重启了我的机器。
- 每个查询立即重复一次。这是为了隔离缓存效应并确认第一次计时。绘制了第一和第二总经过时间。
我的分析在以下几个方面与原文不同:
- 我来对比一下数据表、 dtyplr 和 dplyr 。我还将检查用
data.table
而不是data.frame
启动 dtplyr 管道如何影响性能(下面称为 dt_dtplyr ) - 我将使用我的个人笔记本电脑,而不是运行虚拟机
- 我正在生成一个更小的数据集(~4.9 Gb)。我认为这代表了我在内存中处理过的一些较大的数据集(对于较大的数据集,我通常会切换到 Spark)。
除此之外,代码基本相同。你可以在这篇文章的底部找到它。
现在,事不宜迟,让我们来看看结果:
我们可以看到,使用 dtplyr 大大提高了性能,尽管仍然没有 data.table 快。然而,看起来最大的区别是需要将data.frame
对象转换成data.table
对象。例如,在读取文件时,可以这样做一次。因此,最终牺牲性能来获得整洁语法的额外好处(对于那些喜欢整洁的人来说)似乎并不太糟糕。
就我个人而言,我迷上了 tidyverse,而 dtplyr 包只是继续使用它的另一个原因,即使是对大量组的操作。
dtplyr 基准代码
会话信息
sessionInfo()## R version 3.6.2 (2019-12-12)
## Platform: x86_64-apple-darwin15.6.0 (64-bit)
## Running under: macOS Mojave 10.14.6
##
## Matrix products: default
## BLAS: /Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libRblas.0.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libRlapack.dylib
##
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] data.table_1.12.8 pander_0.6.3 dtplyr_1.0.0 forcats_0.4.0
## [5] stringr_1.4.0 dplyr_0.8.5 purrr_0.3.4 readr_1.3.1
## [9] tidyr_1.0.3 tibble_3.0.1 ggplot2_3.3.0 tidyverse_1.3.0
## [13] pacman_0.5.1
##
## loaded via a namespace (and not attached):
## [1] tidyselect_1.1.0 xfun_0.12 haven_2.2.0 lattice_0.20-38
## [5] colorspace_1.4-1 vctrs_0.3.0 generics_0.0.2 htmltools_0.4.0
## [9] yaml_2.2.1 utf8_1.1.4 rlang_0.4.6 pillar_1.4.4
## [13] glue_1.4.1 withr_2.1.2 DBI_1.1.0 dbplyr_1.4.2
## [17] modelr_0.1.5 readxl_1.3.1 lifecycle_0.2.0 munsell_0.5.0
## [21] blogdown_0.17 gtable_0.3.0 cellranger_1.1.0 rvest_0.3.5
## [25] evaluate_0.14 labeling_0.3 knitr_1.27 fansi_0.4.1
## [29] broom_0.5.3 Rcpp_1.0.4.6 scales_1.1.0 backports_1.1.5
## [33] jsonlite_1.6.1 farver_2.0.3 fs_1.4.1 hms_0.5.3
## [37] digest_0.6.25 stringi_1.4.6 bookdown_0.17 grid_3.6.2
## [41] cli_2.0.2 tools_3.6.2 magrittr_1.5 crayon_1.3.4
## [45] pkgconfig_2.0.3 ellipsis_0.3.1 xml2_1.2.2 reprex_0.3.0
## [49] lubridate_1.7.8 assertthat_0.2.1 rmarkdown_2.0 httr_1.4.1
## [53] rstudioapi_0.11 R6_2.4.1 nlme_3.1-143 compile
原载于https://iyarlin . github . io2020 年 5 月 26 日
数据到模型到 API:一种端到端的方法
原文:https://towardsdatascience.com/data-to-model-to-api-an-end-to-end-approach-9343f2dde848?source=collection_archive---------35-----------------------
了解如何将 ML/DL 生命周期阶段的整个结构缝合在一起。
ML/DL API/模型服务架构(图片由作者提供)
在这篇博客中,我们不打算讨论强大的擎天柱,而是要经历一个基于机器学习的用例的整个旅程。我们将从数据处理开始,继续构建数据管道,使用 Tensorflow 为训练模型提供数据,使用高级 tf.keras API 构建模型架构,最后使用 FastAPI 为模型提供服务。此外,我们将使用另一种更易维护的方式来服务 ML 模型,TFX 服务于 Tensorflow APIs 的扩展特性。本文不讨论优化 ML 模型,因为这里的目的是从头到尾学习 ML 模型的可操作性方面。
文章的流程如下:
- 问题陈述
- 数据预处理
- 构建数据管道
- 模型设计、培训和评估
- 使用 TFX 服务的模型部署(REST API)
问题陈述
我们需要找到一种方法来评估给定推文的情绪,即推文是正面情绪还是负面情绪。
现在,在不使用任何 ML 技术的情况下解决这个问题的最基本的方法是,在使用可用的注释数据分别去除两个类别(正面和负面)的无关紧要的停用词之后,制作单词的频率字典。然后,对于每条推文,在删除停用词后,就像我们在构建频率字典时所做的那样,将推文中的词与它们在两个类中各自的频率进行映射,最后,我们可以对所有词的总频率进行求和,包括正面和负面,无论哪个类的值更高,我们都会将该类分配给该推文。尽管这种方法在可伸缩性方面确实是廉价且高效的,但是这种方法的性能不会很好,原因如下:
- 我们正在定义非常严格的界限,根据单词的频率总和给推文分配标签。大多数情况下,两个类别中单词的频率和之间的差异可以忽略不计,这种方法是多余的。
- 如果对于一条推文,两个类别中单词的频率总和相等或为零,会发生什么?这是否意味着该推文具有中性情绪,如果是的话,与该情绪相关联的概率是多少?我们不能用这种方法来估计与任何推论相关的概率。
即使我们试图通过手工创建自己的特性来使用 ML 解决这个问题,我们也不知道哪些潜在的特性可能会真正破解这个问题。在为我们的模型创建特性时,我们只是基于我们自己的假设进行操作。而且,这种方法仍然没有考虑 tweet 中单词和句子之间的相对上下文。这种方法不能解决各种各样的问题,例如意义、上下文、词义消歧以及同音异义词等等。
输入单词嵌入。最大似然算法只能理解数字,而对于这个问题,我们只有文本。因此,我们需要想出一种方法来将我们的文本转换成数字,同时保留文本的含义和上下文。现在,这就是单词嵌入的实际作用,单词嵌入是密集的向量,实际上有助于将我们文本的上下文表示到 n 维多维空间中,维数是在创建向量时选择的。足够的理论,让我们直接进入如何创建我们自己的模型,可以给我们的文本数据点向量。
数据预处理和分析
预处理
在开始这个数据预处理的旅程之前,这里有几个我们将用来预处理我们的文本的特殊库的快速回顾,现在,我们可以编写我们自己的逻辑来做这个库做的事情,但是这里有一个黄金法则,永远不要浪费你的时间去编写一段别人已经通过投入时间和精力编写的代码。但是我建议您在实现任何随机库或 StackOverflow 的一段代码之前,应该完全理解它的作用。所以,我们开始吧:
!pip install wordninja contractions emoji
!wget [http://cs.stanford.edu/people/alecmgo/trainingandtestdata.zip](http://cs.stanford.edu/people/alecmgo/trainingandtestdata.zip)
!unzip trainingandtestdata.zipimport numpy as np
import pandas as pd
import re
import os
import string
import tensorflow as tf
from sklearn.model_selection import train_test_split
import wordninja, contractions, emoji
在数据中,我们只对包含 tweet 文本和情感值的两列感兴趣。“0”代表消极情绪,“1”显然代表积极情绪,因为这是一个二元分类问题。让我们看看数据是什么样的:
# Data IO and Check
train = pd.read_csv("training.1600000.processed.noemoticon.csv", encoding='latin-1', usecols=[0,5], names=['sentiment','tweet'])
test = pd.read_csv("testdata.manual.2009.06.14.csv", encoding='latin-1', usecols=[0,5], names=['sentiment','tweet'])
print(train.sentiment.value_counts()/train.shape[0])
print(test.sentiment.value_counts()/test.shape[0])OUTPUT:4 0.5
0 0.5
Name: sentiment, dtype: float644 0.365462
0 0.355422
2 0.279116
Name: sentiment, dtype: float64
数据概述
由于我们在测试数据中有额外的离散极性,我们将去除它们以保持数据集之间的非冗余性,并将我们的标签转换为“0”和“1”。一条推文可能包含表情符号、标签和个人资料标签,需要正确处理才能捕捉推文的含义。因此,下面是我们要做的几个预处理步骤:
- 移除所有人物标签、表情符号、网址,并将标签拆分成有意义的单词。比如# programmingismeditation 会变成“编程即冥想”
- 将所有的简写形式,如“I'd”和“we 're ”,分别转换成它们的词根形式,如“I would”或“I had”和“we are”。基本上,我们要扩大所有的收缩。
和一些基本的文本清理步骤,这些步骤将在代码中变得显而易见:
''' Since we are working on a binary classification problem, we would remove all intermediate polarities from test data
and only work on highly polarized sentiment data points. '''test = test[test.sentiment!=2]
test.sentiment.value_counts()/test.shape[0]def **strip_emoji**(tweet):
new_tweet = re.sub(emoji.get_emoji_regexp(), r"", tweet)
return new_tweet.strip()def **strip_urls**(tweet):
new_tweet = re.sub(r'(https|http)?:\/\/(\w|\.|\/|\?|\=|\&|\%)*\b', '', tweet, flags=re.MULTILINE)
return new_tweet.strip()def **remove_tags**(tweet):
return " ".join([token for token in tweet.split() if not token.startswith("@")])def **preprocess_tweet**(tweet):
tweet = remove_tags(strip_emoji(strip_urls(tweet)))
tweet = contractions.fix(" ".join(wordninja.split(tweet)))
tweet = [token.lower() for token in tweet.split() if (len(set(token))>1)]
return " ".join(tweet)# Preprocessing tweets data
train.tweet = train.tweet.apply(preprocess_tweet)
test.tweet = test.tweet.apply(preprocess_tweet)# Preprocessing Labels
train.sentiment = train.sentiment.apply(lambda value: 1 if value==4 else value)
test.sentiment = test.sentiment.apply(lambda value: 1 if value==4 else value)
分析
现在我们已经完成了数据预处理,让我们进入下一个重要的事情,即对于一个好的模型来说非常重要,这比超参数调整更重要。这是估计每个实例中输入模型的词汇大小和向量序列长度。现在,我们通过分析手头的训练数据分布来做到这一点。我们将绘制训练数据中推文长度的分布图。Tweet length 就是 tweet post 预处理中的字数。下面是这样做的代码:
# Estimating vocab size and max sequence length to allow in vectorization layer.
def **tweet_length**(tweet):
return len([token for token in tweet.split()])import seaborn as sns
tweet_lengths = [tweet_length(tweet) for tweet in train_tweets.tolist()]
sns.distplot(tweet_lengths)
推文长度分布
上面的 viz 将帮助我们决定实例的最大序列长度。接下来,我们需要编写代码来估计词汇量:
# Unique words
unique_words = set([token for tweet in train_tweets for token in tweet.split()])
print("Total Unique Words:", len(unique_words))# Counting Total Words and Stop Words
import nltk
nltk.download("stopwords")
from nltk.corpus import stopwords
stop_words = stopwords.words("english")
total_words = [token for tweet in train_tweets for token in tweet.split()]
total_stop_words = [token for tweet in train_tweets for token in tweet.split() if token in stop_words]
print('Total Stop Words', len(total_words))
print('Total Stop Words', len(total_stop_words))
print('Ratio of Total Words to Total Stop Words:', len(total_words)/len(total_stop_words))OUTPUT:Total Unique Words: 75553
[nltk_data] Downloading package stopwords to /root/nltk_data...
[nltk_data] Unzipping corpora/stopwords.zip.
Total Stop Words 17861874
Total Stop Words 7690978
Ratio of Total Words to Total Stop Words: 2.322445077856158
使用上面这段代码,我们将估计词汇量。看起来在*均 10 个单词的 tweet 中,我们几乎有 4 个停用词。而且,由于我们正在执行情感分析,删除一些停用词(如“not ”)会完全颠倒文本的意思,并且有许多这样的词(您可能想自己检查“nltk”包中的“停用词”)。因此,我们避免删除它们(除了单字单词,以避免词汇中有无用的单词)。
根据上面的分析,我们将把最大序列长度固定为 50,词汇大小固定为 75000。
构建数据管道
我们已经预处理了数据,估计了最大序列长度和词汇大小。现在,我们需要开发一个管道,将数据批量输入到模型中。当您的 GPU 数量有限,并且不想一次性将整个数据集加载到 GPU 中并训练模型时,这非常有用。利用这一点,我们将数据一批一批地加载到固定大小的 GPU(模型也将在这里被训练)上来训练模型。我们使用 TF 数据集 API 来做到这一点:
# Data Pipeline Function using TF Dataset API
def **data_input_fn**(texts, labels, batch_size=32, is_training=True):
# Convert the inputs to a Dataset.
dataset = tf.data.Dataset.from_tensor_slices((texts,labels))
# Shuffle, repeat, and batch the examples.
dataset = dataset.cache()
if is_training:
dataset = dataset.shuffle(1000, reshuffle_each_iteration=True)
dataset = dataset.repeat()
dataset = dataset.batch(batch_size, drop_remainder=True)
# Return the dataset.
return dataset# Data pipelines for 3 different datasets
training_dataset = data_input_fn(train_tweets, train_labels, batch_size=1024)
validation_dataset = data_input_fn(val_tweets, val_labels, batch_size=128, is_training=False)
test_dataset = data_input_fn(test.tweet, test.sentiment, batch_size=8, is_training=False)
模型设计、培训和评估
文本矢量化层
通常,我们首先对文本进行矢量化,然后将其提供给模型进行训练或推理。但是,如果我告诉你,我们不必再单独完成这一步,会怎么样呢?因此, tf.keras 已经添加了文本矢量化 API 来帮你做这件事。我们是这样做的:
# Creating Vectorization Layer
max_features = 75000
max_len = 50vectorization_layer = tf.keras.layers.experimental.preprocessing.TextVectorization(
max_tokens=max_features, output_sequence_length=max_len)
vectorization_layer.adapt(train_tweets.values)
我们简单地创建一个 TextVectorization 层的对象,然后调用一个方法将该层调整到我们的训练数据(“adapt”方法)。接下来,我们在模型设计步骤中使用这一层。
设计
下面代码设计了一个使用“TF . keras”API 的深度学习模型。代码完全是不言自明的。
# Create Model Func
def **create_model**():
words = tf.keras.Input(shape=(1,), dtype=tf.string)
vectors = vectorization_layer(words)
embeddings = tf.keras.layers.Embedding(input_dim=max_features+1, output_dim=128)(vectors)
output = tf.keras.layers.LSTM(256, return_sequences=True, name='LSTM_1')(embeddings)
output = tf.keras.layers.LSTM(256, name='LSTM_2')(output)
output = tf.keras.layers.Dropout(0.3)(output)
output = tf.keras.layers.Dense(64, activation='relu', name='Dense_3')(output)
output = tf.keras.layers.Dense(1,activation='sigmoid', name='Output')(output) model = tf.keras.models.Model(words,output)
return model
这段代码中唯一的新东西是前两行函数。输入形状是一个秩为 1 的数组,因为我们将传递给模型的是一个句子/tweet,而不是一个向量(因此,形状是(1,)。接下来,我们之前开发的矢量化层在这里用于将单词映射到 vocab,然后进一步用于训练嵌入层等等。
训练
现在我们训练模型。这里,模型只训练了 3 个时期,因为这篇文章不是关于模型性能的,我是在 Colab 上做的(顺便说一下,它总是崩溃!).但是,请随意根据您的选择进一步调整,并在评论中告诉我您的实验。
batch_size = 1024
epochs = 3
steps_per_epoch = train_tweets.shape[0] // batch_size
model = create_model()
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])# Fitting the model
model.fit(training_dataset, epochs=epochs, batch_size=batch_size,
steps_per_epoch=steps_per_epoch, validation_data=validation_dataset)OUTPUT:
Epoch 1/3
1402/1402 [==============================] - 288s 199ms/step - loss: 0.4545 - accuracy: 0.7738 - val_loss: 0.3984 - val_accuracy: 0.8193
Epoch 2/3
1402/1402 [==============================] - 283s 202ms/step - loss: 0.3814 - accuracy: 0.8293 - val_loss: 0.3966 - val_accuracy: 0.8224
Epoch 3/3
1402/1402 [==============================] - 283s 202ms/step - loss: 0.3509 - accuracy: 0.8455 - val_loss: 0.4079 - val_accuracy: 0.8202
<tensorflow.python.keras.callbacks.History at 0x7fde2aae2c10>
您还可以添加模型检查点,并使用 Tensorboard 来监控模型性能。接下来,我们需要在磁盘上持久化模型:
# Saving Model
import os
MODEL_DIR = "/content/drive/MyDrive/TextSummarizerModel/SentimentAnalysis/Model"
version = 1
export_path = os.path.join(MODEL_DIR, str(version))
print('export_path = {}\n'.format(export_path))tf.keras.models.save_model(
model,
export_path,
overwrite=True,
include_optimizer=True,
save_format=None,
signatures=None,
options=None
)# Check the path
print('\nSaved model:')
!ls -l {export_path}# Using SavedModelCLI to check if model is persisted properly
!saved_model_cli show --dir {export_path} --all
评估
我们使用测试数据集,我们必须在看不见的数据上测试模型性能:
# Loading and Evaluation of Model
model = tf.keras.models.load_model(export_path)
model.evaluate(test_dataset)OUTPUT:
44/44 [==============================] - 7s 5ms/step - loss: 0.4386 - accuracy: 0.8153
[0.43862035870552063, 0.8153409361839294]
输出列表中的第一个值是测试数据的最终损失,第二个值是准确度。假设输出数据集是*衡,0.81 是很高的精度,几乎不需要模型调整。由于就情绪分析而言,手头的数据完全是奶油,因此可能仍有巨大的改进潜力,但这是改天再喝的一杯茶。如果你想了解用于评估各种分类模型的各种度量标准(如本文),这里的是我的另一篇文章可以提供帮助。
使用 TFX 服务的模型部署(REST API)
TFX 发球设置
以下命令将帮助您在您的计算机上设置 TFX 服务。确定是 Linux,因为会让你的生活更轻松。
# Updating apt repo for tensorflow-model-server
!echo "deb [http://storage.googleapis.com/tensorflow-serving-apt](http://storage.googleapis.com/tensorflow-serving-apt) stable tensorflow-model-server tensorflow-model-server-universal" | tee /etc/apt/sources.list.d/tensorflow-serving.list && \
curl [https://storage.googleapis.com/tensorflow-serving-apt/tensorflow-serving.release.pub.gpg](https://storage.googleapis.com/tensorflow-serving-apt/tensorflow-serving.release.pub.gpg) | apt-key add -
!apt-get update# Installing Tensorflow Model Server
!apt-get update && apt-get install tensorflow-model-server
据我所知,在运行上面的命令时,您应该不会遇到任何错误,但是如果您遇到这种情况(可能性极小),请随意“StackOverflow”它,因为每个人都是这样做的。
TFX 服务休息 API
既然已经建立了 TFX 服务,那么是时候将我们的模型作为 REST API 来提供服务了。为此,我们需要使用以下命令:
# Setting Env Variable Model Path
os.environ["MODEL_DIR"] = MODEL_DIR# Model to Server RUN
%%bash --bg
nohup tensorflow_model_server \
--rest_api_port=8501 \
--model_name=sample_model \
--model_base_path="${MODEL_DIR}" >server.log 2>&1OUTPUT:
Starting job # 0 in a separate thread.!tail server.log # Check if server is up & runningOUTPUT:
2021-07-25 07:24:07.498478: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:190] Running initialization op on SavedModel bundle at path: /content/drive/MyDrive/TextSummarizerModel/SentimentAnalysis/Model/1
2021-07-25 07:24:07.566753: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:277] SavedModel load for tags { serve }; Status: success: OK. Took 479864 microseconds.
2021-07-25 07:24:07.579310: I tensorflow_serving/servables/tensorflow/saved_model_warmup_util.cc:59] No warmup data file found at /content/drive/MyDrive/TextSummarizerModel/SentimentAnalysis/Model/1/assets.extra/tf_serving_warmup_requests
2021-07-25 07:24:07.583893: I tensorflow_serving/core/loader_harness.cc:87] Successfully loaded servable version {name: sample_model version: 1}
2021-07-25 07:24:07.585131: I tensorflow_serving/model_servers/server_core.cc:486] Finished adding/updating models
2021-07-25 07:24:07.585235: I tensorflow_serving/model_servers/server.cc:367] Profiler service is enabled
2021-07-25 07:24:07.585748: I tensorflow_serving/model_servers/server.cc:393] Running gRPC ModelServer at 0.0.0.0:8500 ...
[warn] getaddrinfo: address family for nodename not supported
2021-07-25 07:24:07.586243: I tensorflow_serving/model_servers/server.cc:414] Exporting HTTP/REST API at:localhost:8501 ...
[evhttp_server.cc : 245] NET_LOG: Entering the event loop ...
如果一切顺利,你应该得到上面的输出,如果没有,在评论中写给我,或者更好;跳上 StackOverflow。回到上面我们所做的,在运行 TensorFlow 模型服务器时,我们使用了一些参数,如模型名称、路径等。“model_base_path”是您将在其中部署模型的增量版本的目录的路径。现在我们在那个目录中只有我们模型的一个版本,但是在将来,可能会有更多的版本。其次,我们有“model_name ”,它是您想要在 API 中显示的模型的名称。其余的不言自明。默认情况下,它将在本地主机上运行(这是显而易见的!).您可以通过传递参数“rest_api_host”的值来类似地指定主机。
服务 API
现在,这是我们期待已久的时刻。我们提供了 API,现在我们用它来做一些预测。
# Testing the API
import json
instances = [
['The dinner was ok.'],
['I really hated the dinner.'],
['That was a really great movie, we should definitely consider watching it again.'],
["We've been using this for a long time and it's a really good one but the handle is not that great. Only use if you don't want to move it around much."],
]
data = json.dumps({"signature_name": "serving_default", "instances": instances})# Testing the API
import requests
headers = {"content-type": "application/json"}
json_response = requests.post('[http://localhost:8501/v1/models/sample_model:predict'](http://localhost:8501/v1/models/sample_model:predict'), data=data, headers=headers)
predictions = json.loads(json_response.text)
print(predictions)OUTPUT:
{'predictions': [[0.762461543], [0.0516885221], [0.976486802], [0.567632318]]}
预测与实例的顺序相同。我们可以看到,根据实例的上下文,情绪预测几乎是正确的。当我们得到中性情绪时,它更接*于 0.5,否则高度极性情绪对于消极和积极情绪分别接*于 0 或 1。
结论
我们经历了 ML/DL 实验的整个生命周期。尽管这种循环会持续下去,因为我们并不是针对一个问题只训练一次模型。当数据分布变化、词汇变化等时,我们会不断地重新审视它。在生产中监控模型是我们在这里没有讨论的,它是整个 MLOps 生命周期的关键部分。请关注我未来的文章,因为它们肯定会在这里出现。整个实验都是在谷歌实验室完成的。你可以在这里访问这篇文章的 jupyter 笔记本。
3 种常见的数据转换技术
原文:https://towardsdatascience.com/data-transformation-and-feature-engineering-e3c7dfbb4899?source=collection_archive---------9-----------------------
如何为您的数据选择合适的
数据转换概述(图片作者来自www.visual-design.net
数据转换是将原始数据转换为更适合建模和数据发现的格式或结构的过程。这是特征工程中必不可少的一步,有助于发现洞见。本文将介绍数字数据转换的技术:对数转换、裁剪方法和数据缩放。
为什么需要数据转换?
- 当数据分布有偏差时,算法更有可能出现偏差
- 将数据转换为相同的比例允许算法更好地比较数据点之间的相对关系
何时应用数据转换
在实现监督算法时,训练数据和测试数据需要以相同的方式进行转换。这通常是通过提供训练数据集来构建数据转换算法,然后将该算法应用于测试集来实现的。
基础特征工程和 EDA
在这个练习中,我使用来自 Kaggle 的营销分析数据集。
如果您想访问完整的代码,请访问我的网站。
首先,我执行了一些基本的特征工程,使数据更整洁、更有洞察力。
# 1\. Transform Year_Birth into Age
from datetime import date
df['Age'] = date.today().year - df['Year_Birth']# 2\. Transform Dt_Customer into Enrollment_Length
df['Year'] = pd.DatetimeIndex(df['Dt_Customer']). year
df['Enrollment_Length'] = date.today().year - df['Year']# 3\. Transform Currency format into numbers
df['Income$'] = df[' Income '].str.replace(',', '').str.replace('$', '').str.replace('.', '').fillna(0).astype(int)
df['Income_M$'] = df['Income$'].apply(lambda x: round(x/1000000, 2))
print(df[['Income_M$', 'Income$']])
1。将出生年份转换为“年龄”
从 Year_Birth 中减去当前年份。
2。将客户注册的日期(“Dt_Customer”)转换为“Enrollment _ Length”
它与上面的类似,只是从日期特性中额外提取了年份部分。
3。将货币(“收入”)转换为数字(“收入 _ M $”)
这包括四个步骤:1)通过删除字符“,$”来清除数据 2)将空值替换为 0;3)将字符串转换成整数;4)将数字缩小到百万美元,这有助于可视化数据分布
现在,让我们用一种简单的单变量 EDA 技术——直方图来直观显示当前的数据分布。不难看出,大多数变量都严重倾斜。
# select numeric variables
numeric_vars = ['Age', 'Enrollment_Length', 'Income_M$', 'Recency', 'MntWines', 'MntFruits', 'MntMeatProducts', 'MntFishProducts', 'MntSweetProducts', 'MntGoldProds', 'NumDealsPurchases', 'NumWebPurchases', 'NumCatalogPurchases', 'NumStorePurchases', 'NumWebVisitsMonth']# create histograms for each numeric variable
fig = plt.figure(figsize=(24, 15))
for i in range(len(numeric_vars)):
var = numeric_vars[i]
sub = fig.add_subplot(3, 5, i + 1)
sub.set_xlabel(var)
df[var].plot(kind = 'hist')
EDA(图片由作者提供)
如果你想了解更多关于数据清理、特征工程和探索性数据分析(EDA)的知识,我整理了一个可能有用的列表:
- 特征选择
2。 探索性数据分析
3。 数据可视化
4。 地址缺失数据
https://medium.com/analytics-vidhya/how-to-address-missing-data-531ed964e68
1.对数变换-右偏数据
当数据样本遵循幂律分布时,我们可以使用对数标度将右偏分布转化为正态分布。要实现这一点,只需使用 np.log() 函数。在这个数据集中,大多数变量都属于这个类别。
转换前(图片由作者提供)
## log transformation - power law distribution ##log_var = ['Income_M$', 'MntWines', 'MntFruits', 'MntMeatProducts', 'MntFishProducts', 'MntSweetProducts', 'MntGoldProds', 'NumDealsPurchases', 'NumWebPurchases', 'NumCatalogPurchases']fig = plt.figure(figsize = (24,10))for j in range(len(log_var)):
var = log_var[j]
transformed = "log_" + var
df[transformed] = np.log10(df[var]+1)sub = fig.add_subplot(2, 5, j + 1)
sub.set_xlabel(var)
df[transformed].plot(kind = 'hist')
经过对数变换后,这些特征变得更加正态分布。
经过对数变换后,这些特征变得更加正态分布。
转换后(图片由作者提供)
2.裁剪-处理异常值
当数据集中有异常值时,这种方法更合适。Clipping 方法设置了上下限,所有数据点都将包含在该范围内。
我们可以使用 quantile() 来找出大部分数据量的范围(0.05 百分点到 0.95 百分点之间)。任何低于下限(由 0.05 个百分点定义)的数字都将向上舍入到下限。类似地,高于上限(由 0.95%定义)的数字将向下舍入到上限。
## clipping methods - handle outliers ##clip_var = ['Age', 'NumWebVisitsMonth']for i in clip_var:
transformed = 'clipped_'+ i# upper limit - .95 quantile
upper_limit = df[i].quantile(0.95)# lower limit - .05 quantile
lower_limit = df[i].quantile(0.05)df[transformed] = df[i].clip(lower_limit, upper_limit, axis = 0)
print(df[i].describe())
print(df[transformed].describe())
plt.figure(figsize = (5,5))
df[i].plot(kind = 'hist')
plt.figure(figsize = (5,5))
df[transformed].plot(kind = 'hist')
从 EDA 过程中的直方图可以看出,变量“ *Age”和“numwebvisitsmooth”*存在异常大的异常值。所以我将只对这两列应用剪辑。
因此,两个字段的最大值都显著下降:
- 年龄从 128 岁到 71 岁
- NumWebVisitMonth :从 20 日到 8 日
对年龄应用剪辑方法
对 NumWebVisitsMonth 应用剪辑方法
3.缩放变换
在日志转换和处理异常值之后,我们可以通过 scikit-learn 预处理库将数据转换成相同的标度。这个库包含了一些有用的函数:最小-最大缩放器,标准缩放器和健壮缩放器。每个定标器都有不同的用途。
最小最大缩放器—归一化
MinMaxScaler() 通常在数据集没有失真时应用**。它根据以下公式将数据标准化为 0 到 1 之间的范围:**
x ' =(x—min(x))/(max(x)—min(x))
标准定标器—标准化
当数据集符合正态分布时,我们使用标准化。 StandardScaler() 根据 z-score 公式将数字转换为标准形式均值= 0,方差= 1 :
x' = (x —均值)/标准差。
鲁棒定标器
RobustScaler() 更适用于具有偏斜分布和离群值的数据集,因为它根据中位数和分位数转换数据:
x = (x —中位数)/四分位间距。
为了比较这三个缩放器是如何工作的,我使用一个迭代来缩放剩余的变量和裁剪变换后的那两个变量,分别基于 StandardScaler()、RobustScaler()、MinMaxScaler() 。
## data scaling methods ##from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import RobustScalerscale_var = ['Enrollment_Length', 'Recency', 'NumStorePurchases', 'clipped_Age', 'clipped_NumWebVisitsMonth']
scalers_list = [StandardScaler(), RobustScaler(), MinMaxScaler()]for i in range(len(scalers_list)):
scaler = scalers_list[i]
fig = plt.figure(figsize = (26, 5))
plt.title(scaler, fontsize = 20)
for j in range(len(scale_var)):
var = scale_var[j]
scaled_var = "scaled_" + var
model = scaler.fit(df[var].values.reshape(-1,1))
df[scaled_var] = model.transform(df[var].values.reshape(-1, 1))sub = fig.add_subplot(1, 5, j + 1)
sub.set_xlabel(var)
df[scaled_var].plot(kind = 'hist')
如图所示,定标器不改变数据分布的形状,而是改变数据点的分布。
缩放器比较(图片由作者提供)
以“NumStorePurchases”为例,MinMaxScaler()将值严格转换为 0 到 1 之间的值,StandardScaler()将数据集转换为 mean = 0,而 RobustScaler()将数据集转换为 median = 0。
NumStorePurchases
在这个数据集中,这五个变量既不是扭曲的,也不是正态分布的,因此在这三个标量中选择一个 MinMaxScaler()就足够了。
既然所有的特性都已经按照它们的属性转化成了。让我们再次想象它们。我们可以看到,数据看起来更有组织,失真更少,因此更适合输入模型和生成见解。
改造前
改造后
希望你喜欢我的文章:)。如果你想阅读更多我关于媒体的文章,请使用这个附属链接(https://destingong.medium.com/membership)注册媒体会员。
带回家的信息
本文将带您踏上转换数据的旅程,并演示如何根据数据属性选择合适的技术。
- 数据清理:转换数据类型并删除不必要的字符
- 右偏斜数据的对数变换
- 处理异常值的裁剪方法
- 数据缩放:最小最大缩放器、标准缩放器、鲁棒缩放器
原载于 2021 年 7 月 27 日 https://www.visual-design.net*。*
更多这样的文章
* *
数据转换方法
原文:https://towardsdatascience.com/data-transformation-methodologies-bb0acec7e25f?source=collection_archive---------42-----------------------
标准化和数据简化方法,以充分利用您的 ML 模型
本文是我正在撰写的关于机器学习关键理论概念的系列文章的延续。本系列其他文章在我的 页面 均有。
马库斯·斯皮斯克在 Unsplash 上拍摄的照片
机器学习是从信息中学习的算法的开发。他们研究呈现给他们的数据之间的关系,并以此来预测未知结果的性质。就像我们人类一样,计算机通过经验学习。因此,计算机需要高质量的信息来做出正确的假设。因为传统的机器学习模型没有能力根据不同的数据质量调整它们的预测,所以作为程序员,我们的工作是确保数据得到良好的呈现,以便模型有最好的机会做出准确的预测。我们以多种方式做到这一点。
预处理
考虑以下数据集:
作者图片
我们有 4 个解释变量,分别用 xi 和 1 个目标变量 y1 表示。在一个典型的最大似然问题中,我们希望找到一种方法,通过解释变量来解释目标变量。对此我们可以使用的最简单的模型是线性回归。假设我们运行一个简单的线性回归,并在下表中显示每个解释变量的系数。
作者图片
仅从初步观点来看,我们可能会从这些系数中得出以下结论:
变量 x3 是最能解释目标值的变量。此后,变量的影响顺序是 x1,然后是 x4,然后是 x2。
然而,这个结论是错误的。当我们查看范围时,就可以理解为什么会出现这种情况。x3 的系数是 x1 的 3 倍,而 x3 的范围是 x1 的 10 倍。正因为如此,任何 x3 值都将主导我们对 x1 的回归,仅仅因为这些值更大。范围的不同意味着系数是不可比的,所以我们不能像以前那样发表声明,除非我们所有的变量都在一个公*的竞争环境中。
这就只需要在将数据集传递到模型之前对其进行一次预处理。为了获得准确的见解,我们刚刚确立了我们确实需要变量具有可比性。除此之外,较大的范围可能会分散模型对较小变量的注意力,而较小变量可能会给我们提供对目标的更好解释。
那么我们如何解决这个问题呢?一种方法是****常态化**。此方法使用以下公式将所有属性转换到范围[0,1]内:**
作者图片
最小-最大归一化有一个异常值的问题,因为它在变换的每一步中都包含了异常值。如果我们的数据集中存在显著的异常值,最小-最大归一化方法会将我们数据的重要中间部分压缩到一个非常小的范围内,从而导致大量信息的丢失。如果我们遇到异常值,我们需要一种不使用数据集的最小值或最大值的方法,为此,我们求助于 z 值 归一化。z 得分归一化使用以下公式将所有值转换为*均值为 0、标准差为 1 的典型正态分布:
作者图片
作者图片
选择正确的数据归一化方法很重要,这样我们可以保持变量的可比性,但不会减少到关键关系丢失的程度。
数据整理
数据缩减包括减少传递给 ML 算法的数据量。虽然直觉上,这可能没有太多意义;我们希望模型从尽可能多的信息中学习,以便它们可以适应任何情况,减少输入数据的一些元素有助于我们整理信息,为我们的模型提供更清晰的视图,以了解我们希望预测的内容,并确保它不会受到不必要的变量的干扰。
我们可以使用离散化方法将连续变量转化为离散变量。离散化将获取一系列数据点和预定数量的组,并将数据集分成相等的部分,然后将每个点分类到各自的组中。最简单的方法可能是以类似于我们在直方图中生成条块的方式来考虑这个过程。我们将数据集分成 x 个箱,然后根据每个数据点属于哪个箱,给每个数据点一个介于 0 和 x-1 之间的值。
一般来说,这是我们在运行一次模型并评估其性能后可能会考虑的一个过程。如果我们认为我们的一些特性给我们的模型增加了太多的复杂性,我们可能希望通过将它们分组来稍微简化它们。除此之外,如果我们看到我们的组和我们的目标变量之间有很强的相关性,这将进一步表明离散化的好处。然而,我们必须意识到,通过离散化值,我们确实删除了它们呈现的许多信息,我们必须管理这种权衡。
特征 选择是数据简化的另一种方法,也是 ML 工作流中最重要的概念之一。特征选择是我们在 ML 过程的评估阶段进行的另一个过程,就像我们在离散化过程中进行的一样,一旦我们已经运行了一个模型,并且希望提高它的准确性。进行特征选择时,我们在数据集中寻找以下条件:
- **低方差特征
*低方差特征为我们的模型提供了非常小的预测能力
*如果一个值变化不大,它可以被认为是一个固定值,显然我们不能用它与目标变量建立任何关系
我们希望变量波动一个合理的量,因为正是方差为我们提供了预测能力
然而,这在一定程度上是正确的。 因为一个特定类别内的高方差将导致问题,因为我们将无法在自变量和因变量之间建立强有力的推论 - **相关特征
*多个高度相关的特征不应出现在同一个数据集中
这里的问题是,由于我们的特征是相关的,我们的模型可能会错误地将系数分配给变量,从而削弱我们的模型在不可见数据上的成功程度
我们也可能会对数据集的某个部分赋予比实际更大的重要性
理解您的数据的重要性是无与伦比的。如果它们不存在,ML 算法就无法找到关系,也不能指望它们筛选大量不必要的信息,以找到做出良好预测所需的关键位。这是典型的“大海捞针”场景。GIGO——垃圾输入,垃圾输出,总是一个值得记住的缩写。如果你不给你的模型明确的数据,它就不会给你明确的结果。
直到下一个,✌️
数据转换方法:表格数据的深度神经网络
原文:https://towardsdatascience.com/data-transformation-methods-deep-neural-networks-for-tabular-data-8d9ebdeacc16?source=collection_archive---------20-----------------------
深度学习模型的未征服城堡
阿瑟尼·托古列夫在 Unsplash 上的照片
深度学习最*取得了大量成功,特别是在同质数据集上。他们在图像/音频的分类和数据生成方面表现突出。然而,对于深度神经网络模型来说,表格数据集仍然是一个未征服的城堡。
表格数据是异构的,可能导致密集的数字和稀疏的分类特征。此外,特征之间的相关性弱于图像或语音数据中的空间或语义关系。
然而,我们看到异构数据在许多关键应用中的普遍使用,包括医疗诊断、金融应用预测分析和点击率预测。
用表格数据学习的挑战
表格数据或异构数据不同于同构数据,因为它们包含各种属性,包括连续属性和分类属性。由于深度学习模型无法实现相同水*的预测质量,因此存在不同的研究挑战或原因。
不适当的训练数据
数据质量是表格数据集中的主要问题之一,正因为如此,我们在表格数据中发现了许多缺失值。它们通常包含异常值,并且相对于从数据中生成的高维特征向量而言具有较小的大小。
复杂的不规则空间依赖
在表格数据集中,我们无法找到变量之间的空间相关性。大多数情况下,依赖关系是复杂和不规则的。所以像卷积神经网络这样的方法无法对表格数据建模。
广泛的预处理
另一个重要的挑战是表格数据中分类属性的转换。大多数情况下,一次性编码方案用于转换分类数据。然而,它产生一个稀疏矩阵,并可能引发维数灾难。此外,数据扩充对于表格数据的应用也非常具有挑战性。在这篇博客中,我们将针对这一挑战。
模型灵敏度
与基于树的方法相比,深度神经网络对输入数据的微小变化极其敏感。因此,深度神经网络具有高曲率决策边界。与基于树的方法相比,深度学习模型中的超参数数量也很高,这使得调整的计算成本很高。
数据转换模型
大多数深度学习方法用于转换表格数据的任务。表格数据的挑战在于分类属性的存在,因为神经网络只接受实数作为输入。因此,需要一种方法将这些类别转换成数字格式。为此使用了两种不同的形式,包括确定性和自动技术。
确定性技术
标签或顺序编码是最常用的确定性技术,其中每个类别都映射到特定的数字。例如:{ '芒果','菠萝' }编码为{0,1}。然而,这产生了对神经网络无用的人工排序。
另一种方法是通过一热编码进行编码。在我们的例子中,“芒果”到(1,0),而“菠萝”到(0,1)。这种方法导致稀疏的特征向量,并可能引发维数灾难。
二进制编码是用于对类别进行编码的另一种机制。扩大我们的例子,如果我们添加另一种水果:“香蕉”到我们的类别。二进制编码会是这样的:(01),(10),(11)。在这种情况下,只有*日志(类别)*新增栏目。
最常用的方法是留一编码。该技术由 Micci-Barreca (2001 年)提出[1]。在这种方法中,每个类别都被该类别的目标变量的*均值所代替,并且当前行被排除在计算之外,以避免过拟合。这种方法也用在 CatBoost 算法中。
还使用了另一种称为基于散列的编码的策略,它通过散列函数来转换固定大小的值。哈希函数也是确定性的。
自动编码
有不同的自动编码方法用于编码分类属性。Yoon 等人[2]提出的 VIME 方法就是其中之一。VIME 最初确定哪些值是损坏的样本。使用生成二进制掩码向量和输入样本的掩码发生器来创建损坏的样本。注意,输入样本是从未标记的数据集生成的。
作者确保损坏的样本是表格形式的,并且类似于输入分布。然后,被破坏的特征被传递到编码器,该编码器生成特征表示。然后,特征向量估计器和掩码向量估计器分别生成恢复的特征和掩码。
Sun 等人[3]的 SuperTML 是使用卷积神经网络对表格数据进行自动编码的另一种方法。SuperTML 将数据转换成可视数据格式,即 2D 矩阵或黑白图像。这些图像随后被输入微调后的 2D CNN 模型进行分类。该过程自动处理表格数据中的分类数据和缺失值。Zhu 等人[4]采用了另一种类似的方法,利用卷积神经网络将表格数据转换成图像。
图来自孙等人的论文[3]
数据转换是对表格数据建模的主要挑战之一。在这个领域有重大进展,包括确定性和动态方法。然而,这一领域的新想法也很受欢迎。
感谢阅读我的文章。直到下一次…
快乐阅读!
学分:
内容灵感来自瓦迪姆等人的论文:深度神经网络和表格数据:调查,(2021)。
参考资料:
[1] Micci-Barreca 和 Daniele,分类和预测问题中高基数分类属性的预处理方案 (2018),ACM SIGKDD 探索通讯 3
[2]尹金松、张尧、詹姆斯·乔登和米哈埃拉·范德沙尔、维梅:将自我和半监督学习的成功扩展到表格域 (2020),神经信息处理系统进展
[3]孙,,,,,张,,董,杨,董, Supertml:预知结构化表格数据的二维单词嵌入 (2019),IEEE/CVF 计算机视觉与模式识别研讨会论文集
[4]朱、、Thomas Brettin、夏芳芳、Alexander Partin、Maulik Shukla、Hyunseung Yoo、Yvonne A. Evrard、James H. Doroshow 和 Rick L. Stevens,用卷积神经网络将表格数据转换成用于深度学习的图像 (2021)《自然科学报告》
数据科学中的数据类型
原文:https://towardsdatascience.com/data-types-in-data-science-ddb1171bf900?source=collection_archive---------13-----------------------
定量和定性数据差异快速指南
有很多工程师从未涉足统计学或数据科学领域。但是,为了构建数据科学管道或者将数据科学家产生的代码重写为适当的、易于维护的代码,工程方面会出现许多细微差别和误解。对于那些数据/ML 工程师和数据科学家新手,我做这个系列的帖子。我将尝试用简单的英语解释一些基本方法,并在此基础上解释一些数据科学的基本概念。
整个系列:
定义您正在处理的变量类型始终是数据分析过程的第一步。稍后,这使得确定哪种类型的分析是最合适的变得容易。
在最一般的形式下,数据可以分为定量和定性。
量化顾名思义,是一种数据类型,其中数字具有数学值,它们表示数量、金额或某个特性的度量。
当我们进行定量测量时,数字本身就有意义。也就是不需要额外的信息:1.5 就是 1.5,5 就是 5,100 就是 100。
离散秤是一种定量秤,但它不会占据所有空间。我们以家庭的孩子数量为例——我们可能有 1 个孩子、3 个孩子、5 个孩子甚至 10 个,但我们不可能有 1.5 个或 3.75 个。也就是这些是一些点状的离散值。
一个连续的音阶是一个占据所有空间的音阶,它可以是从-∞到+∞,可以是分数。例如,我们可以用天、小时、秒、毫秒等等来度量时间。连续标度由所有可能的值决定。
定性变量是反映对象属性或质量的变量。这里的数字不是指它们本身,如在定量的情况下,而是指物体的一些质量或性质。换句话说,它们充当某些类别的标记。
例如,假设我们将生活在一个州的人与生活在另一个州的人进行比较。我们可以用 1 来编码加利福尼亚人,用 2 来编码纽约人,1 和 2 除了表示这些类别之外没有任何意义,这是我们分析的中心。
定性变量分为名义变量和序数变量。
让我们仔细看看每种类型的含义。让我们从名义变量开始,这是最基本、最简单的尺度。它包含的唯一信息是关于属于某个类或组的对象的信息。这意味着这些变量只能根据属于一些显著不同的类别来衡量,而你将无法确定这些类别的顺序。
例如,我们可以研究来自不同州的人,或者不同眼睛颜色的人——蓝眼睛、绿眼睛、棕色眼睛。这些都是名义变量——不管你的眼睛是什么颜色——这些值没有顺序。
序数变量与名义变量略有不同,因为出现了顺序。因此,值不仅将对象分为类或组,而且还以某种方式对它们进行排序。
例如,我们在学校有分数——A、B、C、D、f。在这种情况下,我们可以肯定地说,得 A 的人比得 f 的人更有可能为考试做好准备。在这种情况下,我们不能说在多大程度上,但我们可以肯定地说 A 比 D 好。
材料
- 揭开假设检验的神秘面纱
- 数据科学从零开始【附属】
- 数据科学【附属】
感谢您的阅读!
有什么问题吗?请在下面留下您的评论,开始精彩的讨论!
查看我的博客或者来打个招呼👋在 Twitter 或订阅我的电报频道。规划好自己!
BigQuery 中的数据仓库:如何创建和管理主数据的表
原文:https://towardsdatascience.com/data-vault-in-bigquery-how-to-create-and-manage-tables-for-master-data-cd043cc9c55e?source=collection_archive---------18-----------------------
为主数据创建中心和卫星表
劳拉·奥克尔在 Unsplash 上的照片
在我之前的帖子中,我写了关于建立一个数据湖和企业中过时的数据思维。嗯……最*,我们决定为我的雇主评估 Google BigQuery 中的数据仓库模型。在这样做的过程中,我想与大家分享我们小小的成功故事。在本文中,我想与您分享一个例子,说明我们如何将主数据从源系统加载到 Data Vault 模型中。
基础
什么是集线器表?
集线器包含唯一标识一个实体的键(业务键)。例如,这些可以是账号或客户号。对于每个键,您创建一个代理键,比如一个散列业务键。除了密钥之外,加载时间戳和源也被存储。
什么是卫星桌?
描述性信息存储在卫星中。像地址、年龄、出生日期或其他任何信息。卫星中没有商业密钥。使用代理键。所有描述性列被散列在一起,并存储在每个记录的表中,以检测新输入记录中的变化。
开发数据仓库模型
设置强制表
在我们的实验中,我们考虑将客户数据从源系统加载到一个数据仓库模型中。那么我们需要哪些桌子呢?
- 作为我们源系统的客户表
- 枢纽表 管理业务和代理键
- 卫星表 持久化客户的所有描述性数据
由作者创建
请注意卫星表中的 hash_diff。hash_diff 包含由描述性列组成的散列。
加载客户数据的 SQL 脚本
下面您可以看到两个 BigQuery SQL 脚本,分别用于将客户数据加载到 Hub 和 Satellite。
我们将按照下面的工作流程加载卫星表。
由作者创作[灵感来自 blog.scalefree.com]
由作者创建
以下代码显示了 Hub 表的加载脚本。工作流程类似于第一个。
由作者创建
结果
在下图中,您可以看到带有一些示例数据的工作流。
由作者创建
结论
我希望你喜欢这个小帖子,我也希望它能让一些人开心。尤其是在 BigQuery 环境中,你不会发现太多关于 Data Vault 的内容。请不吝赐教。
数据可视化原理第 1 部分 Altair 中的一个实际例子
原文:https://towardsdatascience.com/data-visualisation-principles-part-1-a-practical-example-in-altair-b6e16f665fc6?source=collection_archive---------34-----------------------
数据可视化
关于如何在 Python Altair 中构建、定制和添加注释到简单条形图的实用教程
图片来自 Leni_und_Tom 来自 Pixabay
数据可视化,这是数据科学项目的最后一步,非常重要,因为它传达分析或探索的结果。因此,一个优秀的数据科学家至少应该知道数据可视化的基本原理。
在我之前的文章中,我讨论了数据可视化的基本原则,包括空白、字体、文本和颜色。
在本教程中,我实现了一个如何应用已经分析过的基本原则的基本示例。详细地说,我描述了如何使用 Altair Python 库构建和定制一个简单的条形图。本教程分为四个步骤:
- 构建基本图表
- 字体
- 颜色
- 文本
作为示例图,我加载了 2018 年至 2020 年意大利的混合动力汽车注册量,手动构建。
所有代码都可以作为 Jupyter 笔记本从我的 Github 库下载。
加载数据
首先,我导入将在教程中使用的库:altair
和pandas
。
import altair as alt
import pandas as pd
现在,我将数据集构建为一个字典列表,包含成对的字典(Year,Value)。然后我从这个基本列表中构建一个数据框架。
data = [ { 'Year' : 2018, 'Value' : 4800},
{ 'Year' : 2019, 'Value' : 12400},
{ 'Year' : 2020, 'Value' : 32000}]df = pd.DataFrame(data)
df.head()
作者图片
构建基本图表
在构建条形图之前,我将一些基本参数定义为变量:
width
:图表的宽度,以像素为单位height
:图表的高度,单位为像素。
width = 300
height = 300
现在我可以通过调用Chart()
类的mark_bar()
函数来构建基本的条形图。Chart()
类接收要显示的数据帧df
作为输入。为了指定数据和图形视觉方面之间的映射,altair
库提供了encode()
函数。通过这个函数,我指定了轴和数据之间的映射。我还指定哪些信息必须显示在工具提示中。
bar = alt.Chart(df).mark_bar().encode(
alt.Y('Value'),
alt.X('Year:N', title='Anno'),
tooltip=[alt.Tooltip('Year:N', title='Anno'), alt.Tooltip('Value', format=',', title='Immatricolazioni')]
)
bar
作者图片
字体
基本图形可以定制,以便立即向读者传达某种信息。例如,我可以让读者注意到这样一个事实,即从 2018 年到 2020 年,混合动力汽车的注册量有了令人难以置信的提高。
我可以通过以下参数自定义轴和图形标题:
font
:要使用的字体系列。axis_config
:关于两个轴的一些altair
属性,包括字体系列、字体大小和标签旋转。关于轴,altair
库提供了两种类型的文本:标签和标题。标签是指与数据相关联的每一个标签,例如国家的名称。标题是指轴的标题,比如国家。对于每种类型的文本,altair
库允许配置许多属性,比如字体大小和字体系列。scale
:关于要使用的 y 轴刻度的一些altair
属性。我将最大域值设置为 40,000,即大于最大数据值的值。title
:条形图的标题。
font = 'utopia-std, serif'
axis_config = alt.Axis(labelAngle=0,labelFont=font,titleFont=font, labelFontSize=16, titleFontSize=18)
scale_config=alt.Scale(domain=[0, 40000])
title='Immatricolazioni Auto Ibride'
颜色
然后,我可以将读者的注意力集中到最后一年(2020 年),用比其他条形更强烈的颜色突出显示相应的条形。作为颜色,我可以用一种绿色,来标志生态汽车正在增加的事实。我通过一个condition()
设置了color
属性。
bar = alt.Chart(df).mark_bar(tooltip=True).encode(
alt.Y('Value', axis=axis_config,title=title,scale=scale_config),
alt.X('Year:N', axis=axis_config, title='Anno'),
color=alt.condition(
alt.datum.Year == 2020, # If the Year is 2020,
alt.value('#154734'), # highlight a bar with green.
alt.value('lightgrey') # And grey for the rest of the bars
),
tooltip=[alt.Tooltip('Year:N', title='Anno'), alt.Tooltip('Value', format=',', title='Immatricolazioni')]
)
bar
作者图片
文本
现在,我可以通过计算百分比增长并将其作为注释添加到图表中,明确显示从 2018 年到 2020 年的改善情况。
df['Value'][2]/(df['Value'][2] - df['Value'][0])*100
它给出了以下输出:
117.64705882352942
百分比增长约为 117%,因此我可以在图表中添加一个包含此信息的文本。我利用了Chart()
类的mark_text()
函数。我还指定了字体和其他样式参数。
text = alt.Chart(df
).mark_text(x=width/2, y=20, dx=-5,fontSize=30, color='green',text='+117% nel 2020',font=font
).encode()text
作者图片
现在我建立了一条连接 2018 年和 2020 年的虚线。我构建了一个数据框架,其中包含四条线的点。
df_line = pd.DataFrame([
{'Year': 2018, 'Value' : df['Value'].min()},
{'Year': 2018, 'Value' : 35000},
{'Year': 2020, 'Value' : 35000},
{'Year': 2020, 'Value' : df['Value'].max()}
])
df_line.head()
作者形象
然后,我通过Chart()
类的mark_line()
函数构建线。注意,在这种情况下,Chart()
类接收df_line
数据帧作为输入。
line = alt.Chart(df_line).mark_line(color='#154734').encode(
alt.Y('Value', axis=axis_config,title=title,scale=scale_config),
alt.X('Year:N',axis=axis_config, title='Anno', ),
)
line
作者形象
最后,我可以简单地通过对它们求和来组合前面的三个图形。我还可以指定最终图表的一些属性,如标题、宽度和高度。
final_chart = bar + line + text
final_chart = final_chart.configure_title(
fontSize=25,
dy = -15,
font=font,
).properties(title=title,width=width,height=height)final_chart
作者形象
最后,我将图形保存为一个 HTML 页面,它可以包含在网站的任何地方。
final_chart.save('html/auto_ibride.html', embed_options={'actions': False})
摘要
在本教程中,我举例说明了如何在 Python altair
中实现的简单条形图中设置颜色、字体和文本。
如果你想了解我的研究和其他活动的最新情况,你可以在推特、 Youtube 和 Github 上关注我。
相关文章
[## 如何改进带有注释的 D3.js 图
towardsdatascience.com](/how-to-improve-d3-js-graphs-with-annotations-252fbb9c5bb5)
数据可视化原理第 1 部分:空白、文本和颜色
原文:https://towardsdatascience.com/data-visualisation-principles-part-1-white-space-text-and-colour-13f520f90ce9?source=collection_archive---------22-----------------------
数据可视化
基本图形设计原则入门。
图片来自PixabayKrzysztof-m
数据可视化是数据科学的最后一步。这非常重要,因为它允许向最终用户展示分析结果。因此,关注图形的每个方面是非常重要的,比如形状、文本和动画。
有了这篇文章,我将开始一系列文章,解释一些视觉化的基本图形设计原则,使其对用户非常有吸引力和可读性。
在本教程中,我涉及以下几个方面:
- 空格
- 文本
- 颜色
1.空格
空白是图形组成元素之间的空白。对空白的良好使用会增加可读性,并集中读者的注意力。例如,在一个文本中,空格将大块的文本分割成小段落,这使得它们更容易理解。此外,留白可以增强和突出视觉效果的某些元素,从而强调主要内容。
在观想中,存在两种类型的空白:
宏空格— 主要内容周围的所有空格,如图形后面的空白。在下面的示例中,宏空格用粉红色标记。
作者图片
在绘制信息图时,通常有一个想法,即所有的宏空白都必须满足。然而,这种策略可能会导致信息过载,这可能会在目标用户中产生混淆。因此,*衡宏观空白非常重要。
微小空格— 文本中数字之间、轴与文本之间或条形图中条与条之间的所有空格。下图显示了一些粉红色的微小空白:
作者图片
2.文本
在视觉化中使用文本有助于读者理解上下文。图表中的文本示例有轴标签、标题和一些注释。与文本相关的主要图形设计原则有样式(如粗体、斜体、下划线文本)字号、字体族、行距和段落分割。这最后一个方面在一个图中并不常见,除非该图给出了一些长注释。
选择前面几个方面的正确组合,会使图表或多或少地具有可读性和趣味性。例如,下图中的字体大小和字体系列(Monotype Corsiva)非常小且复杂,因此无法立即阅读。
作者图片
3.颜色
颜色是传达情感和感觉的最有力的工具。在选择颜色的时候,尊重标准是非常重要的,比如红色代表危险的情况,绿色代表一切正常等等。
每种颜色都有三个特征:
- 色调是一种“纯”色,也就是说,在光的光谱中只有一种波长。
作者图片
- 亮度指颜色的强度,通过混合色调的阴影量来区分。
作者图片
- 饱和度指的是颜色的强度,通过混合一种色调的白光量来区分
作者图片
在一个可视化中,颜色可以组合起来生成一个和谐的图形。有许多工具可以生成调色板,例如以下工具:
- 颜色搜索,允许生成多种颜色的调色板
- Pine Tools ,允许生成单色调色板
- 谷歌艺术调色板,允许从图像生成调色板。
摘要
在这篇简短的教程中,我阐述了数据可视化的一些基本原则。这些原则包括:空白、文本和颜色。
请注意,所有数据可视化的设计都应考虑目标受众及其潜在情绪。此外,数据可视化最重要的原则之一是图形一致性,也就是说,图形组合的每个元素都必须以最自然的方式遵循和增强组合的对象,不得混淆。
在本系列的下一篇文章中,我将讨论其他数据可视化原则,比如动画。敬请关注,了解更多详情:)
如果你想了解我的研究和其他活动的最新情况,你可以在 Twitter 、 Youtube 和 Github 上关注我。
相关文章
https://medium.com/@angelica.loduca/getting-started-with-d3-js-maps-593d4e68338c
数据可视化原理第 2 部分:布局和重点
原文:https://towardsdatascience.com/data-visualisation-principles-part-2-layout-and-emphasis-d682bbc38217?source=collection_archive---------32-----------------------
数据可视化
基本图形设计原则入门。
图片来自皮克斯拜
许多新的数据科学家特别关注数据分析,从而忘记了数据可视化的重要性。
通过数据可视化,我们可以交流我们的研究结果。因为这个原因,治愈我们观想的所有方面是非常重要的。在我之前的文章中,我处理了一些基本原则,包括空白、文本和颜色。简单来说:
- 对空白的良好使用将会增加可读性,并集中读者的注意力。
- 选择正确的文本样式组合会使图表更具可读性和趣味性。
- 色彩是传达情感和感觉的最有力的工具。
在本文中,我阐述了另外两个数据可视化原则:布局和重点。
布局
布局是事物的各个部分被安排或布置的方式(来自牛津语言的定义)。一个数据可视化可以包括多个图形(和表格),因此以正确的方式排列它们是很重要的。
以下是一些好的布局技巧:
- 为你的布局采用独特的风格。图表的所有部分使用相同的字体。
- 选择一个单色方案,并在可视化的所有图形中只使用它。另外用浅色或非常亮的颜色替换深色用线条较细的字体替换较粗的字体。
- 在布局内重复相似的形状。
对图形使用相同的样式:例如,如果您选择黑白,所有图像都必须是黑白的。如果它们有边框/框架,它们必须都有相同的边框/框架。
类似于网站布局,在绘制可视化之前,你应该定义它的布局。例如,你可以用手或者通过一些工具画一个原始的图形,比如miro.com。在这里,你可以找到一个简短的教程,开始在米罗线框。该教程是为网站设计的,但它可以很容易地适应数据可视化草案。
强调
重点定义了数据可视化的焦点。你应该选择哪些元素最能引起用户的注意,哪些元素应该放在背景中。
焦点的选择显然取决于你想传达什么。
因此,在强调这个或那个元素之前,有必要进行分析:你观想的目标是什么?你想传达什么信息?布局的哪些元素与最终目的最相关?
在你想要给出的大量信息中,不要用视觉上沉重的方式强调多个元素来让用户感到震惊是很重要的。
某些部分的强调引导用户正确阅读内容。
观想的坏例子
以下是一些不好的观想例子:
- 三维条形图
- 包含 2-3 个以上元素的饼图
- 用于表示离散数据的连续折线图
我将在本系列的下一集深化这方面的内容。敬请期待:)
摘要
在这篇简短的文章中,我描述了数据可视化原则的两个基本方面:布局和重点。
如果没有设计一个好的观想布局和对一些元素的强调,你可能会产生一个非常糟糕的观想。
如果你想了解我的研究和其他活动的最新情况,你可以在 Twitter 、 Youtube 和 Github 上关注我。
相关文章
机器学习之前的数据可视化
原文:https://towardsdatascience.com/data-visualization-before-machine-learning-dd75941685f1?source=collection_archive---------7-----------------------
学分 Unsplash
你有没有问过自己为什么你的机器学习模型没有被使用?为什么很少有人真正相信机器学习的力量,而不是这些旧的仪表盘?
当我在的一家足球俱乐部工作时,我制作了一个显示球员赛季表现的数据可视化。这是一个真正的简单的瓷砖情节。但当足球界人士在我的屏幕上看到它时,他们很快就投入了。他们问了一些具体的问题;如果有可能定期得到这张图表,等等…
这个情节比我从那以后制作的任何机器学习模型都更吸引人。对于非技术人员来说,在图表上提问比在机器学习模型上提问容易得多。
让我们看看如何通过数据可视化来绕过机器学习项目。
机器学习的问题是
机器学习非常强大。它能比任何人更好地解决复杂的问题。
尽管如此,它仍有许多问题。
首先,这很难实现。今天,它们是许多开发、编排、部署和监控机器学习模型的工具。但是使项目成功所需的协调仍然是重要的。
真正的机器学习项目不是单个数据科学家在笔记本上做一些晦涩难懂的数据操作。您必须与业务人员一起确定项目范围,理解用例,预测边缘情况,对模型的部署和监控有一个愿景。
所有这些都意味着来自不同领域的人们之间的协调。硬东西。
这不是唯一的问题。
为您的问题获取干净和良好的数据总是最困难的部分。
在笔记本上做概念验证似乎很容易。但是当你不得不设计你的系统使其在生产状态下工作时,你将会面临许多令人头痛的问题。
长期收集标准化数据是困难的。你必须监控你的特征,以防止分布中的任何漂移。你必须知道数据的来源以及数据收集背后可能存在的偏见。大多数时候,这些资产都没有实时反馈回路。
即使您的数据编排设置良好,您也将不得不处理更专注的机器学习任务:
- 为相应的问题找到一个好的模型。
- 在模型性能和预测可解释性之间找到一个*衡点。
- 对数据建模以提取有用的特征。
- 根据卷和环境资源调整数据。
典型机器学习工作流程中涉及的核心步骤(ml-ops.org)。
将所有这些东西投入生产需要 IT 方面的许多资源。根据你公司的规模,你将不得不与软件、系统工程师、安全政策、商业评论等打交道
技术栈很复杂,几乎没有人是端到端管道的专家。
最终,你会明白为什么利益相关者必须真正相信数据驱动的问题解决方案。任何机器学习项目——从开始到结束——都需要数周或数月的开发,才能达到对公司实际有用的状态。
任何机器学习项目的第一条规则:不要做机器学习。
另一个选择:数据可视化
我们经常忽略机器学习。
大多数机器学习项目都是为了预测趋势或 KPI 并做出决策。其他被忽略的决策工具是仪表板。所谓的“数据驱动”决策。
仪表板对决策不是很有用,但对探索数据是。
当谈到数据可视化时,我指的是嵌入在更大的讲述故事的项目中的静态图形或交互。
这些真的能推动决策。
首先,它们“容易”创建。
在开始任何图表之前,你通常对它的终结有一个很好的想法。最终用户想通过这个图表了解什么?你想突出什么?
数据可视化产品有更清晰的界限。
与机器学习项目相反,数据可视化不依赖于大型技术堆栈。
没有性能基准。没有那么多复杂的数据建模。没有监控。没有系统工程师,数据安全政策等…
寻找一个好的数据可视化的过程更加线性:你有一个想法,测试,和/或与终端用户讨论,你迭代,然后发布。
比机器学习过程静态多了。
从设计上来说,一个图形的制作是为了提高观众的参与度,并以最简单的方式展示数据:这样就更容易做出决定。
我可以使用什么工具?
你喜欢的那个!
在现实中,创建数据可视化有很多可能性:GUI 软件( Microsoft Excel )、编程语言( R with ggplot 、Python、 D3.js )、设计工具(Adobe Illustrator/Photoshop、 Figma )等等……
如何使创建的数据可视化?
好问题。从设计上来说,一个好的图表是你的读者会参与的。相应地选择颜色、设计和复杂程度。先做简单的事情,如果需要的话再重复。
寻找灵感?下面是大师和有思想的出版物:
- 塞德里克·舍雷尔——数据可视化专家
- 邓肯·吉尔——信息设计师
- 阿尔贝托·开罗——记者兼设计师
- 南丁格尔——数据可视化学会杂志
- 提升会员资格—提升您的数据可视化技能
- 我们信任的信息——如何用数据激励世界
机器学习还是数据可视化?
因此,你在一个数据团队中,你的角色是推动决策。数据方式。
停止你的仪表盘、你的笔记本或者你的模特训练。
下次有人要求数据驱动的决策时:问问自己为什么数据可视化行不通?可能是吧。
作者图解。
我是一名全栈数据科学家,曾在新闻、零售、职业体育和音乐等多个行业工作过。我明白了,分享我们自己的经历是帮助他人和发展自己的一种强有力的方式。如果你也有这种想法,并且你正在寻找伟大的数据资源,请 订阅我的简讯——来自一个工程师的视线。
数据可视化黑客——来自 538 个图表的教训
原文:https://towardsdatascience.com/data-visualization-hack-lessons-from-fivethirtyeight-graphs-e121080725a6?source=collection_archive---------11-----------------------
PYTHON。数据可视化。图表
仅使用 Matplotlib 包创建专业外观的图形
粘土银行在 Unsplash 拍摄的照片
介绍
FiveThirtyEight (有时写为 538),是一个分析政治、经济和体育等民意调查主题数据的网站。它的名字来自美国选举团的选举人数。
但是有助于它们受欢迎的一个因素是它们在转播民意测验结果时的可视化效果。
我们可以学习一两件事来改善我们的视觉化,让它看起来更专业,更迷人。
在本文的其余部分,我们将把 FiveThirtyEight 创建的图称为 FTE 图。
在本文中,我们将转换这个看起来简单的图表:
图片由作者提供:由一行代码生成的原始 Matplotlib 图
变成了一张看起来像 FTE 的图表:
作者图片:最终/目标图
所以,事不宜迟,让我们进入我们的图形改造。
数据集—电影预算
我是一个超级电影迷,所以毫不奇怪,我发现关于电影预算的数据集很有趣。
例如,假设我们想要检查不同类型电影的预算是如何随时间变化的。为此,让我们使用从 Kaggle 获得的数据集。
检查这些年的预算可能会揭示制作一部特定类型电影的偏好和复杂性的变化。
一步一步的图形改造
预赛
首先,让我们导入必要的包来完成这个任务。
import pandas as pdimport matplotlib.pyplot as plt
import matplotlib.style as style%matplotlib inline
导入数据集
df = pd.read_csv('data\movies.csv', encoding='latin-1')
df.head()
数据预处理
# Data preprocessing
trial = df.groupby(['year', 'genre'])['budget'].sum().reset_index()
trial.head()trial = trial.pivot(index="year", columns="genre").dropna(axis = 1, how="any").reset_index()
默认图表
由 matplotlib 生成的默认图形可以使用以下代码轻松生成:
initial_graph = trial.plot(x ='year', y = 'budget')
作者图片
以此为基础图,让我们一个接一个地改进元素,产生上面的 FTE 图。
注意:当我们进行增量调整时,理想情况下,整个代码都在一个单元格中,因此调整可以应用于绘图对象。
第一步——改变风格
Matplotlib 带有内置样式,这些样式为它生成的图形布局提供了一些默认设置。
要查看可用的样式:
style.available
#To start, using the set style allows us to easily elevate the level of our visualization
style.use('fivethirtyeight')
在使用' fivethirtyeight '样式后(顺便说一下,您只需要调用一次),我们可以使用我们的原始代码在同一个图上调用,添加 figsize 参数:
fte_graph = trial.plot(x ='year',
y = 'budget',
figsize=(12,8))
作者图片
使用内置样式可以立即对 matplotlib 的基础图进行改进。其中一些如下:
- 背景颜色
- 网格线
- 字体
- 线条粗细
- 移除顶部和右侧的刺
我们可以通过一个的例子来考察一个理想的 FTE 图:
摄五三八——典型的 FTE 曲线图
为了让我们更接* FTE 图的风格,我们仍然需要以下组件:
- 标题
- 小标题
- 签名栏
- 用内嵌标签替换图例
对图表的其他微小调整可能包括以下内容:
- 刻度标签的字体大小
- Y 轴的主要刻度标签
- 移除 X 轴标签
- 在 y=0 处放置一条粗线
- 选择合适的配色方案
步骤 2-将图表存储在变量中
将图形存储在变量中使我们更容易访问它们的属性,并对对象应用一些函数。
fte_graph = trial.plot(x ='year',
y = 'budget',
figsize=(12,8))
注意:先进行小的调整
在标题、副标题、签名栏和图例之前先做一些小的调整是很重要的。正如后面将要详细介绍的,这些元素需要一些手动调整,最好是小调整到位,以尽量减少我们的工作。
步骤 3-X 刻度和 Y 刻度格式
在我们开始手动调整之前,回顾一下关于 matplotlib 的术语可能会有所帮助,因为我们将使用它们来调用调整。
照片摄于matplotlib.org
通过以下代码修改主要刻度大小和标签大小:
#Accessing the tick parameters and modifying the size
fte_graph.tick_params(axis = 'both', which = 'major', labelsize = 18)# Customizing the tick labels of the y-axis
fte_graph.set_yticklabels(labels = [-1000000000, 0, '$1 Billion ', '$2 Billion ', '$3 Billion ', '$4 Billion ']);
我们希望我们的标签与刻度线之间有一些空间,因此,在我们的标签中,我们放置一些空白。在我上面的代码中,我使用了两个空格键来获得我想要的空间。
步骤 4 —在 Y=0 处加粗线条
# Generate a bolded horizontal line at y = 0
fte_graph.axhline(y = 0, color = 'black', linewidth = 2, alpha = .7)
作者图片
步骤 5-添加额外的垂直线
通过调整 x 轴的范围添加一条额外的垂直线,因为 x 轴的主要刻度是 5,将 xlimits 设置为 1984 和 2016,在我们的图表中提供了一些急需的空间,特别是这样我们的刻度标签看起来不会太压缩。
fte_graph.set_xlim(left = 1984, right = 2016)
步骤 6-移除 X 轴标签
这一步可以通过将 x.axis.label 对象的 set_visible 方法设置为 false 来完成。
#Remove the label of the x-axis
fte_graph.xaxis.label.set_visible(False)
第 7 步—签名栏
签名栏具有以下特征:
- 位于底部栏
- 签名栏的背景是深灰色的
- 作者的名字写在栏里
- 数据来源如下
- 文本颜色与'五个三十八个'样式的颜色一致
添加签名栏需要我们做一些努力。然而,一旦我们完成了,它会把我们的视觉效果和其他的区别开来,当然会让它看起来更专业。
图表的 text 方法的 background 参数将突出显示整个文本。这就是我们制作签名“酒吧”所需要的。但是,这种背景只会突出文字的长度。因此,为了产生我们想要的对齐,这必须意味着我们将在文本中使用空白。
因此,要总结签名栏的重要步骤,我们需要以下内容:
- 通过反复试验,使用带有空格的 text 方法将签名与我们之前创建的 tick 标签对齐;
- 签名栏的位置(理想情况下低于最低 y 值)也是通过反复试验完成的。
- 需要注意的是标题、刻度标签和签名栏的垂直对齐是 FTE 图表的关键。因此,选择 x 值来将签名栏与刻度标签对齐。
# The signature bar
fte_graph.text(x = 1979.8, y = -1000000000,
s = ' ©Francis Adrian Viernes Source: Data Collected by TMDB and GroupLens Accessed via Kaggle ',
fontsize = 14, color = '#f0f0f0', backgroundcolor = 'grey');
作者图片
第 8 步—标题和副标题
正如我们对签名栏的放置所做的一样,标题和副标题组件是“文本”元素。位置必须通过图表的 x 和 y 坐标的反复试验来完成。标题和副标题位于图表的顶部,因此理想情况下,这些文本的 y 坐标超过数据集中最高 y 值的 y 坐标。
因为我们关心我们的标题和副标题与我们的签名栏的垂直对齐,我们使用一个靠*我们的签名栏的 x 值(,但不是精确的值来说明文本对象的边距/填充)。
#Code to find the maximum y-value
trial.to_numpy().max()
由于 y 的最大值约为 47.9 亿美元,我们可以尝试检查一下将标题设置为 52 亿美元是否合适。如果是,那么我们在它下面找到一个值来放置副标题。
#Title and Subtitle Placement
fte_graph.text(x = 1980, y = 5200000000, s = "Movie Budget Across Genres Through the Years",
fontsize = 26, weight = 'bold', alpha = .75);
fte_graph.text(x = 1980, y = 4900000000,
s = 'A Peak Into Which Movie Genre Has Become More Expensive To Produce Within The Last 30 Years',
fontsize = 18, alpha = .85);
作者图片
看起来没问题。所以还是留着吧。
第九步——选择合适的配色方案
从技术上来说,这可以在更早的步骤中完成,并且不会改变我们已经完成的任何调整。
借用我们正在关注的基础文章的观点,并从这个来源中,选择适合色盲读者的颜色不仅提高了可访问性,而且也是一个良好的图形设计实践。RGB 的代码已经由我们的原始文章源准备好了,幸运的是,它与我们上面的类型有相同的编号。
# Colorblind-friendly colors
colors = [[0,0,0], [230/255,159/255,0], [86/255,180/255,233/255], [0,158/255,115/255],
[240/255,228/255,66/255], [0,114/255,178/255], [213/255,94/255,0], [204/255,121/255,167/255]]fte_graph = trial.plot(x ='year',
y = 'budget',
figsize=(12,8),
color= colors,
legend= False) #instead of choosing a colormap, we handpick our colorsfte_graph.tick_params(axis = 'both', which = 'major', labelsize = 18)
fte_graph.set_yticklabels(labels = [-1000000000, 0, '$1 Billion ', '$2 Billion ', '$3 Billion ', '$4 Billion ']);
fte_graph.axhline(y = 0, color = 'black', linewidth = 2, alpha = .7)
fte_graph.set_xlim(left = 1984, right = 2016)
fte_graph.xaxis.label.set_visible(False)#Signature Bar
fte_graph.text(x = 1979.8, y = -1000000000,
s = ' ©Francis Adrian Viernes Source: Data Collected by TMDB and GroupLens Accessed via Kaggle ',
fontsize = 14, color = '#f0f0f0', backgroundcolor = 'grey');#Title and Subtitle Placement
fte_graph.text(x = 1980, y = 5200000000, s = "Movie Budget Across Genres Through the Years",
fontsize = 26, weight = 'bold', alpha = .75);
fte_graph.text(x = 1980, y = 4900000000,
s = 'A Peak Into Which Movie Genre Has Become More Expensive To Produce Within The Last 30 Years',
fontsize = 18, alpha = .85);
作者图片
步骤 10-用内嵌标签替换图例
与签名栏、标题和副标题一样,这一部分包括文本位置的反复试验。
现在,在图表中放置简单标识线条或条形的文本,而不是图例,是一种常见且被接受的节省空间的方式。
首先,让我们通过将图例合并到主代码中来删除它。
fte_graph = trial.plot(x ='year',
y = 'budget',
figsize=(12,8),
color= colors,
legend= False) #instead of choosing a colormap, we handpick our colorsfte_graph = trial.plot(x ='year',
y = 'budget',
figsize=(12,8),
color= colors,
legend= False) #instead of choosing a colormap, we handpick our colorsfte_graph.tick_params(axis = 'both', which = 'major', labelsize = 18)
fte_graph.set_yticklabels(labels = [-1000000000, 0, '$1 Billion ', '$2 Billion ', '$3 Billion ', '$4 Billion ']);
fte_graph.axhline(y = 0, color = 'black', linewidth = 2, alpha = .7)
fte_graph.set_xlim(left = 1984, right = 2016)
fte_graph.xaxis.label.set_visible(False)#Signature Bar
fte_graph.text(x = 1979.8, y = -1000000000,
s = ' ©Francis Adrian Viernes Source: Data Collected by TMDB and GroupLens Accessed via Kaggle ',
fontsize = 14, color = '#f0f0f0', backgroundcolor = 'grey');#Title and Subtitle Placement
fte_graph.text(x = 1980, y = 5200000000, s = "Movie Budget Across Genres Through the Years",
fontsize = 26, weight = 'bold', alpha = .75);
fte_graph.text(x = 1980, y = 4900000000,
s = 'A Peak Into Which Movie Genre Has Become More Expensive To Produce Within The Last 30 Years',
fontsize = 18, alpha = .85);
作者图片
最后,我们手动放置文本,这些文本用它们的特定类型来标识这些行。
#Colored Labels Indentifying the Line
fte_graph.text(x = 2010, y = 3500000000, s = 'Action', color = colors[0], weight = 'bold',fontsize=16, rotation = 42,
backgroundcolor = '#f0f0f0');fte_graph.text(x = 2015, y = 600000000, s = 'Adventure', color = colors[1], weight = 'bold',fontsize=16, rotation = 52,
backgroundcolor = '#f0f0f0');fte_graph.text(x = 2014, y = 1200000000, s = 'Animation', color = colors[2], weight = 'bold',fontsize=16, rotation = 52,
backgroundcolor = '#f0f0f0');fte_graph.text(x = 2016, y = 500000000, s = 'Biography', color = colors[3], weight = 'bold',fontsize=16, rotation = 52,
backgroundcolor = '#f0f0f0');fte_graph.text(x = 2004, y = 1400000000, s = 'Comedy', color = colors[4], weight = 'bold',fontsize=16, rotation = -58,
backgroundcolor = '#f0f0f0');fte_graph.text(x = 2016, y = 100000000, s = 'Crime', color = colors[5], weight = 'bold',fontsize=16, rotation = 52,
backgroundcolor = '#f0f0f0');fte_graph.text(x = 2002.8, y = 800000000, s = 'Drama', color = colors[6], weight = 'bold',fontsize=16, rotation = 65,
backgroundcolor = '#f0f0f0');fte_graph.text(x = 2016, y = -200000000, s = 'Horror', color = colors[7], weight = 'bold',fontsize=16, rotation = 52,
backgroundcolor = '#f0f0f0');
可以看出,我们为此使用的另一个参数是用于正确放置标签的“旋转”参数。
在所有这些步骤之后,我们最终得到了下图:
作者图片
以下是完整代码,供您参考:
# Colorblind-friendly colors
colors = [[0,0,0], [230/255,159/255,0], [86/255,180/255,233/255], [0,158/255,115/255],
[240/255,228/255,66/255], [0,114/255,178/255], [213/255,94/255,0], [204/255,121/255,167/255]]fte_graph = trial.plot(x ='year',
y = 'budget',
figsize=(12,8),
color= colors,
legend= False) #instead of choosing a colormap, we handpick our colorsfte_graph.tick_params(axis = 'both', which = 'major', labelsize = 18)
fte_graph.set_yticklabels(labels = [-1000000000, 0, '$1 Billion ', '$2 Billion ', '$3 Billion ', '$4 Billion ']);
fte_graph.axhline(y = 0, color = 'black', linewidth = 2, alpha = .7)
fte_graph.set_xlim(left = 1984, right = 2016)
fte_graph.xaxis.label.set_visible(False)#Signature Bar
fte_graph.text(x = 1979.8, y = -1000000000,
s = ' ©Francis Adrian Viernes Source: Data Collected by TMDB and GroupLens Accessed via Kaggle ',
fontsize = 14, color = '#f0f0f0', backgroundcolor = 'grey');#Title and Subtitle Placement
fte_graph.text(x = 1980, y = 5200000000, s = "Movie Budget Across Genres Through the Years",
fontsize = 26, weight = 'bold', alpha = .75);
fte_graph.text(x = 1980, y = 4900000000,
s = 'A Peak Into Which Movie Genre Has Become More Expensive To Produce Within The Last 30 Years',
fontsize = 18, alpha = .85);#Colored Labels Indentifying the Line
fte_graph.text(x = 2010, y = 3500000000, s = 'Action', color = colors[0], weight = 'bold',fontsize=16, rotation = 42,
backgroundcolor = '#f0f0f0');fte_graph.text(x = 2015, y = 600000000, s = 'Adventure', color = colors[1], weight = 'bold',fontsize=16, rotation = 52,
backgroundcolor = '#f0f0f0');fte_graph.text(x = 2014, y = 1200000000, s = 'Animation', color = colors[2], weight = 'bold',fontsize=16, rotation = 52,
backgroundcolor = '#f0f0f0');fte_graph.text(x = 2016, y = 500000000, s = 'Biography', color = colors[3], weight = 'bold',fontsize=16, rotation = 52,
backgroundcolor = '#f0f0f0');fte_graph.text(x = 2004, y = 1400000000, s = 'Comedy', color = colors[4], weight = 'bold',fontsize=16, rotation = -58,
backgroundcolor = '#f0f0f0');fte_graph.text(x = 2016, y = 100000000, s = 'Crime', color = colors[5], weight = 'bold',fontsize=16, rotation = 52,
backgroundcolor = '#f0f0f0');fte_graph.text(x = 2002.8, y = 800000000, s = 'Drama', color = colors[6], weight = 'bold',fontsize=16, rotation = 65,
backgroundcolor = '#f0f0f0');fte_graph.text(x = 2016, y = -200000000, s = 'Horror', color = colors[7], weight = 'bold',fontsize=16, rotation = 52,
backgroundcolor = '#f0f0f0');
结束语
制作一个专业外观的图表,虽然需要在代码方面做一些努力,但最终会吸引我们的观众。
按照上面的步骤,以最小化我们的工作为最终目标,我们应该处理微小的调整和元素,这些调整和元素不太可能随着进一步的修改而改变。这指的是我们的什么:
- 背景或风格
- 刻度线
- 配色方案和
- 其他微小的调整,如在某些数据点上加一条粗水*线。
文本元素需要一点精确性和与对齐的协调性,理想情况下应该在最后完成。
最后,不要害怕混淆一些元素,尝试使用其他图表和数据集。你甚至可以发挥创意,在这里插入图片。
让我知道你的想法。我的 Github 页面上的全部代码。
参考
制作 538 剧情
色盲友好的配色方案
数据可视化:如何选择正确的图表[第 2 部分]
原文:https://towardsdatascience.com/data-visualization-how-to-choose-the-right-chart-part-2-fb32ed14c7be?source=collection_archive---------11-----------------------
为您希望受众完成的任务选择正确的图形或图表样式。
摩根·豪斯尔在 Unsplash 上的照片
这是关于数据可视化的两部分系列文章的第二部分。如果你还没有读过这个系列的第一部分 ,我推荐你去看看!
在本系列的第 1 部分中,我们介绍了前三个数据可视化功能:关系、随时间变化的数据和排名图。如果你需要快速复习:
- 关系:我们使用关系方法来显示两个或多个变量之间的联系或相关性。我们经常使用散点图或热图来显示关系方法。
- 一段时间内的数据:这种可视化方法显示一段时间内的数据,以发现一段时间内的趋势或变化。折线图或面积图通常用于表示连续时间跨度内的数据。
- 排名:可视化方式显示数据值的相对顺序。条形图通常用于呈现数据点或比较不同数据子组的指标值。
对于第二部分,我们将讨论最后两个数据可视化功能:分布和比较。
分布图
15.直方图
16。带直方图的密度曲线
17。密度图
18。箱线图
19。带状图
20。小提琴情节
21。人口金字塔
比较图
22.气泡图
23。项目符号图
24。饼状图
25。网饼状图
26。圆环图
27。树形图。叉杆
29。Choropleth 地图
30。气泡图
免责声明:我根据数据可视化的目的对图表进行了分组,但它并不完美。例如,散点图和气泡图对于快速识别数值变量之间的关系非常有用。然而,与散点图不同,气泡图上的每个点都被分配了一个标签或类别。气泡图对于数据点之间的比较也很有用。此外,时间可以通过将它作为一个轴上的变量来显示,也可以通过动画显示数据变量随时间的变化来显示。因此,气泡图对于关系、一段时间内的数据和比较非常有用。出于这些原因,我认为这是根据分析目的或交流需要选择图表的指南。
分配
分布图用于显示变量如何随时间分布,有助于识别异常值和趋势。
当评估一个分布时,我们希望找出模式的存在(或不存在)及其随时间的演变。
15.柱状图
直方图是描述一组数据分布的垂直条形图。直方图中的每个条代表每个间隔/区间的列表频率。
N 注:
- 直方图绘制定量数据,将数据范围分组为箱或区间,而条形图绘制分类数据。
- 条形图在列之间有间距,而直方图没有。
直方图显示了变量的分布,绘制了定量数据,并确定了在一个值的范围内发生的频率。换句话说,直方图有助于估计值集中在哪里,极值是什么,以及是否有任何差距或异常值。它们对于给出概率分布的粗略视图也是有用的。
如果我们只考虑一个变量,最好的可视化方法是直方图。因为直方图允许我们将连续数据分组到箱中,所以它提供了观察集中位置的良好表示。如果考虑两个变量,我们使用之前描述的散点图。
Python 实现
在这里,我们要呈现幸福分数的分布。
plt.hist(happy['Score'], edgecolor = 'black')
作者图片
16.带直方图的密度曲线
直方图也可用于将数据分布与理论模型(如正态分布)进行比较。这需要使用垂直轴的密度标度。
sns.distplot(happy['Score'], hist=True, kde=True,
hist_kws={'edgecolor':'black'},
kde_kws={'linewidth': 4})
作者图片
17.密度图
密度图(也称为核密度图或密度轨迹图)用于观察变量在数据集中的分布。
此图表是直方图的*滑版本,用于相同的概念。它使用核密度估计来显示变量的概率密度函数,通过消除噪声来实现更*滑的分布。因此,这些图在各个条块之间是*滑的,并且不受所创建的条块数量的影响,从而创建了更明确的分布形状。密度图的峰值有助于显示值在间隔内的集中位置。(详见)
密度图优于直方图的一个优点是,它们更善于确定分布形状,因为它们不受所用条柱数量的影响(典型直方图中使用的每个条柱)。
密度图用于研究一个或几个变量的分布。一旦得到一个新的数据集,逐个检查变量的分布可能是我们应该做的第一件事。它传递了大量的信息。存在几种分布形状;下面是六个最常见的例子。
Python 实现
这里,我们希望以升(displ
)为单位可视化发动机排量的概率密度
我们使用kdeplot
函数来可视化连续变量的概率密度。它描述了连续变量中不同值的概率密度。我们可以为多个样本绘制一个图表,这有助于更有效的数据可视化。
# simple density plot
sns.kdeplot(car['displ'], shade=True)
作者图片
密度图还允许我们比较一些变量的分布。然而,我们不应该比较超过三个或四个,因为这将使数字混乱和不可读。
cty
城市驾驶每加仑英里数创纪录。这里,我们想对两个类进行比较:compact
和suv
for class_ in ['compact', 'suv', 'midsize']:
# extract the data
x = car[car['class'] == class_]['cty']
# plot the data using seaborn
sns.kdeplot(x, shade=True, label = '{} '.format(class_))
作者图片
18.箱形图
箱形图或须状图总结了一组在区间尺度上测量的数据。这种类型的图形显示了分布的形状、中心值及其可变性。
作者图片
箱线图显示数据是基于五个数字的统计摘要分布的。小“方框”表示大部分信息都在一个一致的范围内,而大方框则显示数据分布更广。
- 将方框分成两部分的线代表数据的中值。例如,中值等于 5,意味着低于和高于 5 的数据点数量相同。
- 方框的两端显示了上(Q3)和下(Q1) 四分位数。如果第三个四分位数等于 10,75%的观察值低于 10。
- Q1 和 Q3 之间的差异被称为四分位数间距 (IQR)
- 极端线显示 Q3+1.5 iqr 到 Q1–1.5 iqr(排除异常值的最高和最低值)。
- 超出极限线的点(或其他标记)表示潜在的异常值。
我们在描述性数据分析中使用箱线图,表明分布是否偏斜以及数据集中潜在的异常观察值(异常值)。
当涉及到大量的观察数据和比较两个或多个数据集时,箱线图也非常有用。
箱线图的一个缺点是它们强调分布的尾部,这是最不具体的数据集点。他们还隐藏了发行的许多细节。
Python 实现
这里,我们要呈现车辆类别的分布。
plot1 = ax.boxplot(vects,
notch=False, vert=True,
meanline=True,showmeans=True,
patch_artist=True)
作者图片
19.带状图
带状图是散点图,其中一个变量是分类的。带状图是直方图或密度图的替代物。它通常用于小型数据集(直方图和密度图通常适用于大型数据集)。
来源: Seaborn
带状图可以单独绘制。不过,在我们希望显示所有观察结果以及一些基本分布的情况下,它也是对盒图或小提琴图的一个很好的补充。
Python 实现
箱线图是研究分布的一个极好的方法。然而,某些类型的分布可以隐藏在同一个盒子下。因此,并排绘制带状图和箱线图有助于显示箱线图上的每个观察结果,确保不会错过任何有趣的模式。
jitter=True
有助于展开重叠的点,这样所有点就不会落在物种上方的单一垂直线中
ax = sns.boxplot(car['class'], car['hwy'],boxprops=dict(alpha=0.75))
ax = sns.stripplot(car['class'], car['hwy'], jitter=True, edgecolor="gray")
作者图片
20.小提琴情节
有时中值和*均值不足以理解数据集。这就是小提琴情节的由来。小提琴图是一个混合的方块图和密度图旋转,并放置在每一边。它用于可视化数据的分布及其概率密度。
小提琴图的“小提琴”形状来自数据的密度图。我们将密度图转向一边,放在箱型图的两边,相互镜像。小提琴的每一面都是一个密度估计,以显示数据的分布形状。阅读小提琴形状正是我们阅读密度图的方式:小提琴图的截面越宽,代表人口成员接受给定值的概率越高;越细的部分表示概率越低。
箱形图在很多统计学课程中都有很好的解释,而小提琴图很少被提及。小提琴情节的一个缺点是它不为许多读者所熟悉,我们在使用小提琴情节时应该考虑谁是我们的目标读者。
Python 实现
这里,我们想要比较不同车辆类别的公路行驶每加仑英里数的分布。
sns.violinplot(car['class'], car['hwy'],
scale='width', inner='quartile')
作者图片
21.人口金字塔
人口金字塔是检测人口模式变化或差异的理想工具。当观察按年龄和性别划分的群体时,人口金字塔是可视化人口构成的重要图表。
这是一对背靠背的直方图(针对每种性别),显示了所有年龄组和两性的人口分布。x 轴用于绘制人口数量,y 轴列出所有年龄组。人口金字塔的形状可以用来解释人口。例如,一个底部宽阔顶部狭窄的金字塔暗示着一个高生育率和高死亡率的社区。顶部较宽、底部较窄的金字塔表明人口老龄化,生育率较低。
人口金字塔也可以用来推测人口的未来发展。这使得人口金字塔可用于生态学、社会学和经济学等领域。
Python 实现
假设我们想要显示给定人口的年龄-性别分布。这是人口中居民的形象描述。左侧/右侧显示性别,y 轴显示年龄,x 轴显示人数。
ax[0].barh(range(0, len(df)), df['Male'], align='center', color='#4c85ff')
ax[0].set(title='Males')
ax[1].barh(range(0, len(df)), df['Female'], align='center', color='#ff68b3')
ax[1].set(title='Females')
作者图片
比较
在分析我们的数据时,我们可能会对比较数据集感兴趣,以了解数据点或时间段之间的差异或相似之处。我将最常用于比较一个或多个数据集的图表进行了分组。
比较问题询问数据中不同的值或属性如何相互比较。
N 注:
- 条形图可以列在比较组下,因为我们可以使用水*条形图来比较同一时间段内的不同组。
- 表格有助于您相互比较精确的值。柱形图和条形图展示不同类别之间的比较,而折线图擅长显示一段时间内的趋势。
22.泡泡图
气泡图在二维图中显示多个气泡(圆圈)。它是散点图的推广,用气泡代替了点。
像散点图一样,气泡图使用笛卡尔坐标系沿网格绘制点,其中 x 轴和 y 轴是独立的变量。但是,与散点图不同,每个点都被分配了一个标签或类别(显示在图例旁边或图例上)。然后,每个标绘点通过其气泡面积代表第三个变量。我们可以用颜色来区分类别或用来描述一个附加的数据变量。时间可以通过将它作为一个轴上的变量来显示,也可以通过动画显示随时间变化的数据变量来显示。
我们可以使用气泡图来描述和显示数字变量之间的关系。然而,标记大小作为一个维度允许在三个变量之间进行比较,而不仅仅是两个变量。在单个气泡图中,我们可以进行三种不同的成对比较(X 与 Y、Y 与 Z、X 与 Z)和整体三向比较。需要多个双变量散点图才能获得相同数量的洞察;即便如此,推断数据点之间的三向关系也不会像在气泡图中那样直接。
过多的气泡会使图表难以阅读,因此气泡图的数据容量有限。这在某种程度上可以通过交互性来弥补:点击或悬停在气泡上以显示隐藏的信息,可以选择重新组织或过滤分组的类别。
px.scatter(happy, x="GDP", y="Score", animation_frame="Year",
animation_group="Country",
size="Rank", color="Country", hover_name="Country",
trendline= "ols")
作者图片
23.项目符号图
项目符号图通常用于显示性能数据;它们类似于条形图,但伴随着额外的视觉元素,以包装在更多的背景下。最初,子弹图是由 Stephen first 开发的,作为仪表盘仪表的替代品。这是因为它们通常显示的信息不足,空间利用率低,并且堆满了“图表垃圾”
作者图片
主条的长度编码了图表中间的主要数据值,称为*特征度量。*垂直于图形方向的线条标记被称为 c 比较度量,并被用作与特征度量值进行比较的目标标记。因此,如果主棒已经通过了相对小节位置,我们知道我们达到了目标。
特征测量后面的分段彩色条显示定性范围分数。每种色调(上例中的三种灰色)指定一个绩效范围等级,例如低、中、优秀。使用项目符号图时,我们通常将最大范围数保持在五个。
fig = ff.create_bullet(
data, titles='label', subtitles='sublabel', markers='point',
measures='performance', ranges='range', orientation='h',
measure_colors=['#1e747c', '#7ac7bf'],
range_colors=['#F5E1DA', '#F1F1F1']
)
作者图片
24.圆形分格统计图表
饼图是显示群体构成的经典方式。饼图是一个分成若干部分的圆形图。切片越大,它所代表的总量就越重要。
但是,通常不建议使用,因为饼图部分的面积有时会产生误导。因此,在使用饼图时,强烈建议明确写下每个饼图部分的百分比或数字。
饼图最适合描绘整体的各个部分:数据的比例分布。然而,饼图的显著缺点是:
- 不适合大量数据:随着显示的值的数量增加,每个段/切片的大小变得更小,更难读取。
- 不太适合在饼图组之间进行精确的比较。
- 无法显示一段时间内的比例分布。
Python 实现
假设我们想展示一个特定客户的消费习惯。
labels = 'Food', 'Housing', 'Saving', 'Gas', 'Insurance', 'Car'
spend = [800, 2000, 500, 200, 300, 250]
p = plt.pie(spend, # Value
labels=labels, # Labels for each sections
explode=(0.07, 0, 0, 0, 0, 0), # To slice the perticuler section
colors=colors, # Color of each section
autopct='%1.1f%%', # Show data in persentage for with 1 decimal point
startangle=130, # Start angle of first section
shadow=True # Showing shadow of pie chart
)
作者图片
25.网状饼图
嵌套饼图更进一步,将每个饼图的外层分成更小的组。在内圈中,我们将每个数字视为属于它的组。在外面的圆圈中,我们将他们标为其原始群体的成员。
Python 实现
我们首先生成一个要处理的数据帧。在内圈中,我们将每个数字视为属于它的组。在外面的圆圈中,我们将他们标为其原始群体的成员。
甜甜圈形状的效果是通过wedgeprops
参数设置饼图的楔形宽度来实现的。例如,我们可以传入wedgeprops = dict(linewidth=5)
来设置楔形边框线的宽度等于 0.5
# get the data
size = 0.3
labels = 'Food', 'Housing', 'Saving', 'Gas', 'Insurance', 'Car'
spend = [800, 2000, 500, 200, 300, 250]
vals = np.array([[300., 500.], [1800., 200.], [500., 0.],[200., 0.], [150., 150.],[150., 50]])
in_labels = 'At Home','Out', 'Rent','Utilities','Saving','', 'Gas','','Car','Health','Tires','Mai# outer level
ax.pie(vals.sum(axis=1), # plot the total [60., 32.] = 92
radius=1, # Radius to increase or decrease the size of pie chart
labels=labels, # Labels for each sections
colors=outer_colors, # Color of each section
wedgeprops=dict(linewidth=5,width=size, edgecolor='w') # Add edges to each portion/slice of the pie
)# inner level
patches, texts = ax.pie(vals.flatten(), # using flatten we plot 60, 32 separetly
radius=1-size,
labels=in_labels,
labeldistance=0.8,
colors=inner_colors,
wedgeprops=dict(linewidth=3,width=size, edgecolor='w'))
作者图片
26.圆环图
圆环图本质上是一个中心区域被切掉的饼图,看起来像一个圆环。由于环形图被掏空,没有中心点来吸引你的注意力。你的眼睛转到哪里去了?
作者图片
如果我们像大多数人一样,我们的眼睛在圆周上游走,根据长度来判断每一块。因此,我们也可以把环形图想象成一个自身卷曲的堆叠条形图。
饼图和圆环图通常用于可视化选举和人口普查结果、按产品或部门划分的收入、回收数据、调查回复、预算细目、教育统计、支出计划或人口细分。
正如我们上面所讨论的,饼状图的一个缺点是它对于在饼状图组之间进行精确的比较是没有用的。由于读者关注的是切片之间的比例面积以及整个图表,因此很难看出切片之间的差异,尤其是在一起比较多个饼图时。
圆环图解决了这个问题,因为读者往往更关注于阅读弧线的长度,而不是比较切片之间的比例。
Python 实现
trace = go.Pie(labels=labels,
values=spend,
marker=dict(colors=colors),
hole=0.3)
作者图片
27.树形图
树状图类似于饼状图,它在不误导每个小组的贡献的情况下工作得更好。树形图允许我们将整体分成层次,然后显示每个层次的内部分解。在最简单的情况下,它们以适合其值的大小显示形状,因此较大的矩形代表较高的值。
我们经常使用销售数据的树形图。它们捕获数据类别的相对大小,允许对一个类别内和多个类别之间的相似性和异常性进行快速、高层次的总结。
当我们的数据不能分成类别和子类别时,树形图就不适合了。
此外,当我们用颜色的面积和强度对数据进行编码时,我们的眼睛并不能很好地察觉这些维度中相对较小的差异。如果我们的数据是这样的,我们的受众需要在类别之间进行精确的比较,当类别没有与公共基线对齐时,就更加麻烦了。我们不应该让我们的观众做不必要的工作来理解一个图表!
Python 实现
Python 允许我们快速创建这些图表,因为它会计算每个矩形的大小,并以合适的方式绘制。我们还可以将我们的 treemap 与 Matplotlib 库针对变量缩放颜色的能力结合起来,用 Python 制作出好看且易于理解的图。
这里,我们想显示每种类型汽车的价值。
确保你安装了squarify
!
import squarify# plot the data using squarify
squarify.plot(sizes=label_value.values(), label=labels, color=colors, alpha=0.6)
作者图片
28.发散图
发散条形图是一种条形图,其中某些维成员的标记指向上或右,而其他维成员的标记指向相反的方向(分别为下或左)。
注意:
- 向下或向左流动的标记不一定代表负值。
- 发散线可以表示零,但也可以分隔二维成员的标记。
我们使用分叉棒线来查看项目如何基于单个指标变化,并直观显示这种变化的顺序和数量。如果我们的主要目标是比较每个维度成员的趋势,发散条形图是一个不错的选择。
使用发散条形图的缺点是不容易使用分组条形图比较维成员的值。
Python 实现
# plot using horizontal lines and make it look like a column by changing the linewidth
ax.hlines(y=health.index, xmin=0 , xmax=health['x_plot'], color=colors, linewidth=5)
作者图片
29.等值区域图
[地图](https://en.wikipedia.org/wiki/Choropleth_map#:~:text=A%20choropleth%20map%20(from%20Greek,each%20area%2C%20such%20as%20population) 是专题地图的一种。一组预定义的区域与表示每个区域内地理特征的汇总的统计变量成比例地被着色或形成图案。通常情况下,色标值越大越暗,值越小越亮。
我们使用一个 choropleth 图来可视化一个测量值在一个地理区域内是如何变化的,或者它显示了一个区域内的可变性水*。例如,我们可以使用 choropleth 图来显示各地区失业人口的百分比,颜色越深表示失业人口越多。
注意:
大区域并不意味着有色统计比小区域更重要。较大区域的统计数据可能与该区域的人有关,而不是与该区域本身有关,因此我们应该小心大小会扭曲我们的解释。
Python 实现
world_map_1 = go.Figure(data=[happiness_rank], layout=layout)
作者图片
30.气泡图
气泡图使用不同大小的圆圈来表示区域中的数值。它为每个地理坐标显示一个气泡,或为每个区域显示一个气泡。
我们通常将气泡图用于具有以下特征的数据集:
- 一列地理坐标(经度和纬度)和一个数字变量控制着气泡的大小。
- 具有属性值和已知边界的区域列表。在这种情况下,气泡图将取代通常的 choropleth 图。
注:气泡图可以避免在 choropleth 图中由不同的区域面积引起的偏差。(在观察过程中,大区域往往具有更大的权重)。
Python 实现
fig = px.scatter_geo(
df_today, # provide the Pandas data frame
locations='countryCode', # indicate locations
color='continent',
hover_name='country', # what to display when the mouse hovering on the bubble
size='cases', # how large the bubble is
projection='equirectangular',
title=f'World COVID-19 Cases for {today}'
)
作者图片
我的笔记涵盖了我认为数据可视化所必需的所有内容。数据可视化不会很快消失,所以无论您最终使用什么工具或软件,都必须建立一个可以随身携带的分析、讲故事和探索的基础。掌握一项技能需要几个月,有时几年,所以不要停止学习!如果你想更深入地研究这个特定的主题,这里有一些很好的起点。
- Python 中的直方图和密度图
2.Python 中数据可视化的下一个层次
3.使用 Seaborn / Matplotlib 创建高级 Python 数据可视化的分步指南
- Matplotlib 备忘单
大数据时代的仪表板技术综述
原文:https://towardsdatascience.com/data-visualization-in-2021-an-overview-of-dashboarding-technology-in-the-age-of-big-data-79d490beffcf?source=collection_archive---------1-----------------------
将洞察力转化为影响力,并一路给你的老板留下深刻印象。
斯蒂芬·道森在 Unsplash 上拍摄的照片
TL;速度三角形定位法(dead reckoning)
- 如果你的工作是在笔记本上进行的,那么从一个预定托管的拖放式笔记本仪表板开始,比如 Deepnote ,然后如果你需要分布式计算级别的规模,那么迁移到 Python + Streamlit 或 Python + Plotly Dash 这样的分布式框架。
- 如果收集的数据类型经常变化,并且您有数据工程师支持您的分析和管理团队,请使用 Looker。
- 如果您的数据集模式已经成熟,并且您希望最大化分析师的能力,请使用 Tableau+SQL 的前端。Tableau 在情节类型和风格方面是最具特色的,但代价是更陡峭的学习曲线。SQL 前端允许视图快速迭代到您的数据中。如果你自己设置 Redash 有问题,有一些直接的替代方案你可能要考虑。
- 如果你没有专门的数据分析师,并且已经支付了微软的订阅费,Power BI 是最用户友好的。然而,Power BI 通过放弃某些功能来实现这一点,并且与 Looker 或 Tableau 的功能不太匹配。
预计阅读时间:15 分钟🕒
数据分析完全是为了发现洞见,并做出业务战略和运营决策。虽然最具挑战性的部分是找到新的见解,但最重要的部分是将这些见解打包成可消费的、可再生的、可更新的东西,并跟踪变化的效果。
进入仪表板,这是一个(通常)交互式的可视化集合,与数据有实时联系,并随时间更新。随着数据科学/分析领域的爆炸式增长,仪表板产品和工具也出现了爆炸式增长,包括传统上不被认为是仪表板的产品和工具。
本文探讨了其中的一些工具,并最终给出了在给定用例的情况下应该使用哪种工具的建议。这里介绍的工具将会是
- 商业智能(无/低代码)工具— Microsoft Power BI、Tableau、Looker
- 托管笔记本仪表盘应用程序— Deepnote 仪表盘、十六进制数据应用程序
- 具有自动绘图功能的 SQL 前端——Redash、Deepnote、Hex、Databricks 等。
- Python web 应用程序— Plotly Dash,Streamlit
此处介绍的仪表板工具,图片由作者提供
企业商业智能—主要参与者
像 Tableau、Power BI 和 Looker 这样的商业智能工具是为那些将成熟数据存储在漂亮的关系表中的公司设计的。它们提供了从几乎任何数据库管理系统中提取数据的简单方法,支持无代码绘图,并且可以安排自动刷新和 ping 需要查看仪表板的人员。它们都可以托管在云中,或者部署在本地,Looker 在本地拥有最复杂的安装过程。
对于已经清理的数据,需要提交给更高级别的管理层,可以使用这些工具。他们创建的仪表板看起来令人惊叹,具有直观的用户界面,并支持以任意分辨率深入数据。
这些工具之间的主要区别在于它们的目标受众,这主要反映在它们的可用性上。
Tableau 是为专业数据分析师设计的。这是非常丰富的功能,并鼓励每个情节的极端水*的定制。正因为如此,它有一个相当陡峭的学习曲线。为了充分利用 Tableau,您需要您的分析师能够投入时间来了解它的特性。
Tableau 是许多大型企业的默认选项,这是有充分理由的。如果你有可以“生活”在 Tableau 中的分析师,他们会有难以置信的生产力,他们的工作几乎可以立即以演示或报告的形式发布。如果你正在制作的情节和见解可以在 Excel 中完成,尽管需要付出极大的努力,Tableau 可能是你工作流程的正确工具。
Tableau 创建漂亮的仪表盘,仪表盘由扎克赵发布在 Tableau Public 上
Looker 试图将数据分析的洞察生产部分民主化,使企业的所有成员都能构建仪表盘。它将看数据作为一种产品,由技术强大的数据分析师/软件工程师提供给整个企业。这意味着理解旁观者的体验需要分成两个部分;首先是分析师/软件工程师设置外观,其次是商业用户。
Looker 的内部语言 LookML 实际上是 SQL 的语法糖,在规模上更容易管理。因为这是软件工程师的想法,它有很好的版本控制,DevOps 实践(从开发到生产)和方便。然而,由于 Looker 使数据分析师更接*于生产供内部使用的软件的软件工程角色,这些分析师将需要更强的技术能力,他们的统计知识将相对不那么重要。这可能意味着您企业中的分析师可能不太适合这个角色,可能需要再培训。这也意味着使用 Looker 需要一大笔前期安装费用。
观看者交互图——来源——在麻省理工学院开源许可下
业务用户在简单性方面做得很好,但肯定倾向于以牺牲普遍可访问性为代价来实现功能齐全。Looker 的 UI 比 Tableau 的更直观,但是业务用户会希望精通技术,并且会从以前做过的少量 SQL 中受益匪浅。如果你是一家中型或大型科技企业,拥有技术人员,Looker 可能是最适合你的工具。
微软的 Power BI 是最简单的企业工具,面向没有数据分析/技术背景的人。尽管如此,它仍然非常强大,如果我在本地机器上查看我的数据子集,这是我个人使用的第一个工具。对于小数据集,它的用户界面比 Tableau 更简洁,并且有许多相同的集成和特性。
简而言之,一旦统计数据被计算出来,Power BI 已经完全取代了 Excel 来调查和绘制我的数据。如果您正在尝试为学校报告快速绘图,或者目前使用 Excel,我强烈建议您尝试 Power BI,看看它是否可以取代您的 Excel 工作流程。
集成仪表盘的托管笔记本电脑
随着笔记本电脑在数据科学领域的崛起,内置 SQL、Python、R 和 Julia(仅举几例)解释器,我们看到 Deepnote 和 Hex Technologies 等产品增加了一项功能,允许仪表板/数据应用程序功能。我认为这是一个很好的开始方式,可以快速原型化对下游用户有用的数据和交互。
这种方法简单而有效;笔记本输出可以添加到仪表板,然后可以通过调整大小和拖放来*铺显示。然后,通过内置的Input Cell
类型进行输入。
一个仪表板的 Deepnotes 实现允许添加,然后移动和调整任意单元格输出,作者的图像
这允许仪表板中的任意复杂性,因为逻辑后端只是 Python。然而,这也意味着所有的逻辑都必须由仪表板创建者显式编写,而不是由内置在 Tableau 之类的服务中的后端来处理。
在我的业务中,我们经常来回发送笔记本,并重新运行笔记本来查看更新的可视化。对于这个已经完成所有分析工作的工作流,转换到这样的仪表板几乎不需要时间投资,并且允许在业务中发送更少的数据和更多的信息密集型产品。
处于发布状态的仪表板,图像+按作者的仪表板
对于分析师来说,这是一个制作仪表板的好地方,他们可以将仪表板发送给其他分析师,同时尝试将最佳视图迭代到数据中。也就是说,我并不认为这些软件可以替代需要向管理层展示的功能齐全的仪表板软件,也不认为这些软件会被频繁地派生和修改。
SQL 前端— Redash
Redash 是一个非常棒的工具,它允许直接从 SQL 查询中自动可视化,然后将它们放在您喜欢的任何网格中,就像托管笔记本解决方案一样。
Redash 最*被 Databricks 收购,并决定停止运行他们的云服务器。这使得它的使用局限于拥有专用 IT 基础设施来管理更新和设置本地服务器的企业。
虽然 Redash 很棒,但他们被 Databricks 收购意味着 Databricks 正在将大部分功能纳入 Databricks SQL 仪表板,与上述托管笔记本解决方案直接竞争。如果你已经在使用 Databricks 而不是 Redash,你很快就会得到一个很酷的特性!除此之外,它的功能正被迅速添加到许多竞争对手的笔记本电脑解决方案中。
如果你自己设置 Redash 有问题,有一些直接的替代方案你可能要考虑。
Python 库— Streamlit + Dash
最后的仪表板技术是 Python 库,如 Streamlit 和 Plotly Dash。这些给了你对 web 应用框架的完全访问权(或多或少)。例如,Streamlit 允许用户上传可以处理的任意文件,而 Dash 允许您完全访问 HTML 来定位元素。虽然这些工具非常强大,因为它们可以使用 execute arbitrary Python,但我要说的是,它们让用户很难生成他们自己没有看到的见解,因为您必须将每个视图设计到数据中。
就我个人而言,我经常将一个个人数据故事项目变成一个 Streamlit web 应用程序,并将其放在 Heroku 上供朋友们玩。或者,在一个季度末,我会收集我所有的发现,并把它们写在一个收集和运行新数据的 Streamlit web 应用程序中,这样,如果我回来看到我正在处理的数据是最新的。我发现这比托管在内部 wiki(即 Confluence)上的静态页面有用得多,并且以编程方式更新内部业务页面比构建 Streamlit 应用程序要麻烦得多。
这是一个内置在 Streamlit 中的示例应用程序
生成下图的代码由作者生成
Strealmit 应用程序编写简单快捷,图片由作者提供
这些也有目前为止最高的技术标准,Dash 迫使你明确地理解 HTML 如何定位元素,并迫使你自己去做。此外,Streamlit/Dash 还能生成非常有趣的仪表盘,其功能是其他工具所没有的。
对于两者之间的详细比较, JP Hwang 的比较是一个很好的阅读材料,其摘要被简化了,以定制为代价(专注于快速迭代)更容易,而 Dash 允许企业级仪表板(专注于定制)。
概观
构建良好的仪表板是每个数据分析师工作流程的重要组成部分,随着数据产生越来越多的价值,它变得越来越重要。为了满足这些需求,一个完整的产品行业应运而生,每种产品都专门针对特定类型的分析师/业务工作流。这意味着人们不得不选择在哪里集中学习,企业不得不选择在哪里投入时间和金钱。在这里,我们看了仪表板的四个不同类别,并探讨了该领域一些领导者之间的差异。
我希望这能让你对现代数据分析中的仪表板世界有所了解,如果能在评论中听到你的想法,那就太好了!
大数据中的数据可视化
原文:https://towardsdatascience.com/data-visualization-in-big-data-623357ac4d1a?source=collection_archive---------30-----------------------
如何洞察新的可视化技术
尼古拉·马斯洛夫在 Unsplash 上的照片
在大数据世界中,随着数据越来越多地用于重要的管理决策,数据可视化工具和技术对于分析大量信息和做出数据驱动的决策至关重要。因此,有一种趋势是从直觉和情感决定转向基于数字的理性选择。因此,报告和可视化必须易于理解和有意义。
大数据的影响
越来越多的专业人士能够利用数据来做出决策,并通过视觉来讲述故事,传达数据如何告知人、主题、时间、地点和方法的问题[1]。在大数据领域,由于数据量巨大,可视化带来了新的方法和挑战。因此,必须创建新的可视化技术,以使数据量对用户来说更加有形。
入门工具集
在接下来的大数据领域新的可视化可能性的例子中,我使用了 Google 的 BigQuery 和 Data Studio。对于 BigQuery 的免费层,您可以在这里简单地注册和使用公共数据集[2],这无疑属于大数据标签。Data Studio 是免费的,是 MS Power BI、Qlik 和其他 BI 工具的一个很好的替代品。由于你可以免费获得整个可扩展的数据仓库技术和 BI 层,我发现 Google 作为你在大数据可视化领域迈出第一步的沙箱非常合适。
可视化示例
这里有几个我在表示大数据领域使用和看到最多的可视化示例。
树形图 树形图或*铺图用于可视化层次结构,由嵌套的矩形表示。这样,通过选择与要显示的数据单元的尺寸成比例的矩形面积,可以生动地显示尺寸比。
树状图示例—按作者分类的图像
在这里,我可视化了自 2012 年 1 月 1 日起,零售商在爱荷华州批发购买酒类并出售给个人的情况。这个例子再次显示了这种图表是如何完美地显示大小关系的。
说到州,地图是另一种表示大量数据的好方法。在这里,相同的数据以不同的方式可视化,就像地图一样。气泡的大小可以代表售出的瓶子数量,当然也可以是任何其他度量。
作为仪表板的地图-按作者分类的图像
地图的优势在于它们是通用的。人们知道如何阅读地图,因此观众相对容易理解。
规格图可以很好地表示状态,状态有不同的评价,需要用颜色来表示。这个图表是基于一个简单的饼图。仪表图特别适合于测量关键数字、客户满意度或质量测量的目标/实际比较。
仪表图—图片由作者提供
这里,举例来说,一家公司的销售额与整体*均水*的关系如图所示。
旭日图是显示分层数据的理想选择。层次结构的每个级别都由一个环或圆来表示,最里面的圆表示层次结构的顶级。具有多个类别级别的旭日图显示了外环与内环的关系。旭日图特别有助于显示一个环是如何被分成不同的组成部分的,而另一种类型的图,树形图,特别有助于比较相对大小[3]。
旭日东升——作者图片
其他有用的即
当然,在大数据领域还可以使用其他常见的图表,例如:
- 热图
- 单词云
- 符号地图
- 系统树图
- 网络模型
摘要
大量数据带来了可视化数据的新挑战。因此,需要不同的技术和图表,而不是通常使用的可视化,如表格、条形图等。在最好的情况下,有可能创建一个简单明了的可视化,并且仍然不会让任何信息落到桌面下。在本文中,我展示了一些例子和一个很好的工具集,从 BigQuery 和 Data Studio 开始。无论如何,这些新的基于云的技术是处理如此大量数据的先决条件。
资料来源和进一步阅读
[1]Tableau,手册 zur Datenvisualisierung:定义,beispile und Lernressourcen(2021)
[2]谷歌,在谷歌云上解决真正的业务挑战 (2021)
[3]微软,Erstellen eines sun burst-diagrams in Office(2021)
使用 Python 在 Excel 中实现数据可视化
原文:https://towardsdatascience.com/data-visualization-in-excel-using-python-94feeacda2fc?source=collection_archive---------3-----------------------
使用 ExcelWriter 通过 Python 代码在 Excel 中创建可视化效果
来源:作者
Excel 被广泛用于数据分析,并且具有许多用于分析、操作、可视化等的功能。使用 excel 应该是数据分析师、产品分析师和业务分析师的主要技能之一。它有助于理解数据以及我们如何使用它来生成有用的见解。
Python 也广泛用于数据分析目的,并且克服了 Excel 的缺点。了解一点 Python 知识,我们可以增强我们的数据分析技能,也可以产生更多有用的见解。
将 Excel 和 Python 结合起来会很有成效,并使数据分析变得更有趣。ExcelWriter 用于使用 Python 执行不同的 Excel 操作。它提供了各种各样的功能,如创建 Excel,将数据写入 Excel 表,在 Excel 中创建可视化效果等。
在本文中,我们将探索 ExcelWriter 并使用它创建一些可视化。
让我们开始吧…
安装所需的库
Excelwriter 是在 Pandas 中定义的,所以我们不需要单独安装它。
导入所需的库
在这一步中,我们将导入使用 Python 读取 Excel 和在 Excel 中创建可视化所需的所有库。
import pandas as pd
import numpy as np
正在加载数据集
在这篇文章中,我们将从网上下载著名的糖尿病数据集。此外,我们将使用 excel writer 创建一个 excel 文件,我们将在其中创建可视化效果。
df = pd.DataFrame(pd.read_csv("/content/test.csv"))
writer = pd.ExcelWriter('diabetes.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1', startrow=2)
在 Excel 中创建可视化
在这一步中,我们将创建不同类型的可视化,将它们写入我们创建的 excel 文件,然后保存可视化。在创建可视化之前,我们还将为作者创建用于进一步操作的对象。
下面给出的代码将创建对象和不同的图形,即条形图、散点图、折线图和面积图。
book = writer.book
sheet = writer.sheets['Sheet1']# Title
bold = book.add_format({'bold': True, 'size': 24})
sheet.write('A1', 'Diabetes', bold) format1 = book.add_format({'font_color': '#E93423'})
sheet.conditional_format('B4:E8', {'type': 'cell', 'criteria': '<=', 'value': 0, 'format': format1})# Bar Chart
chart = book.add_chart({'type': 'column'})
chart.add_series({'values': '=Sheet1!B4:B90', 'name': '=Sheet1!B3', 'categories': '=Sheet1!$A$4:$A$8'})
chart.add_series({'values': '=Sheet1!C4:C90', 'name': '=Sheet1!C3'})
chart.add_series({'values': '=Sheet1!D4:D90', 'name': '=Sheet1!D3'})
chart.add_series({'values': '=Sheet1!E4:E90', 'name': '=Sheet1!E3'})
sheet.insert_chart('K2', chart)# Scatter Chart
chart = book.add_chart({'type': 'scatter'})
chart.add_series({'values': '=Sheet1!F4:F90', 'name': '=Sheet1!B3', 'categories': '=Sheet1!$A$4:$A$8'})
sheet.insert_chart('K20', chart)# Line Chart
chart = book.add_chart({'type': 'line'})
chart.add_series({'values': '=Sheet1!F4:F90', 'name': '=Sheet1!B3', 'categories': '=Sheet1!$A$4:$A$8'})
chart.add_series({'values': '=Sheet1!G4:G90', 'name': '=Sheet1!C3'})
chart.add_series({'values': '=Sheet1!H4:H90', 'name': '=Sheet1!D3'})
chart.add_series({'values': '=Sheet1!I4:I90', 'name': '=Sheet1!E3'})
sheet.insert_chart('S2', chart)# Area Chart
chart = book.add_chart({'type': 'area'})
chart.add_series({'values': '=Sheet1!A4:F90', 'name': '=Sheet1!B3', 'categories': '=Sheet1!$A$4:$A$8'})
chart.add_series({'values': '=Sheet1!B4:G90', 'name': '=Sheet1!C3'})
chart.add_series({'values': '=Sheet1!H4:H90', 'name': '=Sheet1!D3'})
chart.add_series({'values': '=Sheet1!I4:I90', 'name': '=Sheet1!E3'})
sheet.insert_chart('S20', chart)writer.save()
可视化(来源:作者)
在这里,您可以清楚地看到我们使用 excel writer 创建的不同类型的图表。我们直接在 excel 表格中创建了这些可视化效果,因此您需要打开 Excel 来可视化这些图形。尝试使用不同的数据集,创建不同的可视化效果,并在回复部分告诉我您的意见。
本文是与 Piyush Ingale 合作完成的。
在你走之前
感谢 的阅读!如果你想与我取得联系,请随时通过 hmix13@gmail.com 联系我或我的 LinkedIn 个人资料 。可以查看我的Github简介针对不同的数据科学项目和包教程。还有,随意探索 我的简介 ,阅读我写过的与数据科学相关的不同文章。
使用 ggplot2 的数据可视化:值得了解的 5 个特性
原文:https://towardsdatascience.com/data-visualization-using-ggplot2-5-features-worth-knowing-c0447a760335?source=collection_archive---------30-----------------------
使用 ggplot2 包提高 dataviz 效率的技巧
马文·迈耶在 Unsplash 上的照片
W 无论你是在做你的学校项目、学期论文、硕士论文还是商业报告,如果数据以一种有意义且美观的方式呈现,那么数据的质量会很好地传递给观众。虽然从数据中得出一个有影响力的数字很有挑战性,也很耗时,但是一些小技巧如果实施得当,可以使工作流程更简单,从长远来看可以节省很多时间。
在这篇文章中,我将讨论 5 个我认为有用的技巧或特性,并在使用 ggplot2 包时定期实现。也许你们中的一些人已经知道他们,对一些人来说,这将是新的东西。
给大家一点关于 ggplot2 的背景,它是基于图形的语法开发的,简称 gg 。该情节由三个基本部分组成,即:
1.数据:由数据帧组成
2.美学:定义 x 和 y 变量,并详细说明数据点的颜色、大小和形状
3.几何图形:定义图形的类型,如条形图、折线图、散点图、直方图等。
所以,让我们来看看我想与你分享的对我非常有用的 5 个特性/技巧。出于演示的目的,我将使用内置的 R 数据存储库中的 USArrests 数据集。
提示#1:在给变量分配 ggplot 函数时使用括号
ggplot2 包中很酷的一点是圆括号的使用。一般来说,当使用 ggplot 函数绘图时,如果我们将它赋给一个变量,那么为了绘图,该变量将在下一行执行。所以,这是一个两步走的过程。通过在赋值时将 ggplot 函数放在括号中,有助于直接绘制图形,而无需再次执行变量。
# two step way to plot
plot <- USArrests %>% ggplot(aes(States, Murder)) +
geom_bar(stat = "identity")
plot# one step way to plot using parentheses
(plot <- USArrests %>% ggplot(aes(States, Murder)) +
geom_bar(stat = "identity"))
提示#2:通过切换数据最小化重复的 ggplot 函数
在 EDA 阶段,当我尝试绘制不同的变量集来理解它们之间的关系时,这个命令非常有用。比起一次又一次地编写 ggplot 命令,我更喜欢使用 tidyverse 包中的%+%。通过使用%+%我们可以用新数据覆盖当前数据。
# lets define a temporary variable
temp <- USArrests[,c(1,3)] %>% rename(Murder = Assault)# switching the current data with the temp variable using %+% operator
plot2 <- plot %+% temp# plotting the new graph
plot2 + ylab("Assaults per 100,000")
作者图片
警告:要使%+%起作用,请确保新数据的列名与被替换的数据集的列名相匹配。
小贴士#3:在美学中自由使用色彩
ggplot2 软件包的美观性允许在颜色/色彩/色彩之间自由选择,以将色彩分配给绘图。所以,不管你用英式英语还是美式英语,都被 ggplot 覆盖了。
# plotting the same data using col/color/colour in aesthetics using green/blue/red colors to distinguishplot3 <- USArrests %>% ggplot(aes(States, Murder)) +
geom_bar(stat = "identity", col = "green") +
theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
ylab("Murders per 100,000") +
xlab("USA States") +
#scale_y_discrete(limits=c(0:10)) +
theme_bw()plot4 <- USArrests %>% ggplot(aes(States, Murder)) +
geom_bar(stat = "identity", color = "blue") +
theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
ylab("Murders per 100,000") +
xlab("USA States") +
#scale_y_discrete(limits=c(0:10)) +
theme_bw()plot5 <- USArrests %>% ggplot(aes(States, Murder)) +
geom_bar(stat = "identity", colour = "red") +
theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
ylab("Murders per 100,000") +
xlab("USA States") +
#scale_y_discrete(limits=c(0:10)) +
theme_bw()plot3 + plot4 + plot5 + plot_layout(ncol = 3)
作者图片
提示#4:使用 fct_reorder() 对数据进行重新排序
为了做出美观的图,一般来说,我们大多数人使用 group_by()、summarize()和 arrange()函数来排列数据。这是一个很长的步骤,可以用 forcats 包中一个名为 fct_order()的函数来代替。
plot6 <- USArrests %>% ggplot(aes(x = fct_reorder(States, Murder, .desc = FALSE), y = Murder)) +
geom_bar(stat = "identity", colour = "red") +
theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
ylab("Murders per 100,000") +
xlab("USA States") +
theme_bw() +
coord_flip()
作者图片
提示 5: ggsave()用于保存地块
ggsave()函数为希望为出版物、演示或打印保存高分辨率图像的用户提供了灵活性。ggsave 功能具有调整图像大小、定义分辨率和调整图像背景透明与否的功能,并且可以灵活选择不同的文件扩展名。
ggsave(
filename = "trial.png",
device = png(),
path = NULL,
scale = 1,
width = 5,
height = 5,
units = "in",
dpi = 600,
limitsize = TRUE,
bg = "transparent"
)
这是我在用 ggplot2 包绘图时经常使用的 5 个特性。
- 将 ggplot 函数赋给变量时使用括号
- 通过切换数据最小化重复的 ggplot 函数
- 在美学中使用色彩的自由
- 使用 fct_reorder()对数据重新排序
- ggsave()用于保存图
实现以上 5 个特征的最好方法是坚持练习,这就是我所做的。你尝试的不同场景越多,你就会发现越多的潜力。在那之前,祝你编码愉快。
你们觉得这些功能/技巧有趣吗?其中有你不熟悉的吗?请在评论中分享你的想法,以及这里没有提到的任何关于绘图的技巧/窍门。
链接到代码。
你可以在 LinkedIn 上联系我。
使用语法图形的数据可视化
原文:https://towardsdatascience.com/data-visualization-using-grammar-graphics-a600379d0d22?source=collection_archive---------31-----------------------
使用 Plotnine 进行数据可视化
(来源:作者)
数据可视化是可视化地表示数据,以便找出某些模式或异常值。它有助于发现数据集不同属性之间的关系。它是数据的图形表示。
Plotnine 是一个基于 ggplot2 的开源库,是图形文法的一个实现。使用 plotnine 使用语法创建图很容易,因为它使自定义图变得容易,并且还可以创建简单的图。
在本文中,我们将了解如何使用 plotnine 创建不同的条形图和图表。
让我们开始吧…
安装所需的库
我们将从使用 pip 安装 Plotnine 开始。下面给出的命令可以做到这一点。
pip install plotnine
导入所需的库
在这一步中,我们将导入所需的库和函数来创建图。
from plotnine import *
from plotnine.data import *
创建地块
现在我们将开始一个接一个地创建情节,看看如何创建它们
- 散点图
(ggplot(mtcars, aes('wt', 'mpg'))
+ geom_point())
散点图(来源:作者)
#Scatter Plot with differnt theme
(ggplot(mtcars, aes('wt', 'mpg', color='factor(gear)'))
+ geom_point()
+ stat_smooth(method='lm')
+ facet_wrap('~gear')
+ theme_xkcd())
散点图(来源:作者
2.线条图
(
ggplot(economics, aes(x='date', y='uempmed'))
+ geom_line() # line plot
+ labs(x='date', y='median duration of unemployment')
)
线条图(来源:作者)
3.直方图
(
ggplot(diamonds, aes(x='carat'))
+ geom_histogram()
)
直方图(来源:作者
4.堆叠 条形图
import pandas as pd
df = pd.DataFrame({
'variable': ['gender', 'gender', 'age', 'age', 'age', 'income', 'income', 'income', 'income'],
'category': ['Female', 'Male', '1-24', '25-54', '55+', 'Lo', 'Lo-Med', 'Med', 'High'],
'value': [60, 40, 50, 30, 20, 10, 25, 25, 40],
})
df['variable'] = pd.Categorical(df['variable'], categories=['gender', 'age', 'income'])
df['category'] = pd.Categorical(df['category'], categories=df['category'])#Plotting Data
(ggplot(df, aes(x='variable', y='value', fill='category'))
+ geom_col()
)
条形图(来源:作者)
这就是我们如何使用 plotnine 创建不同的条形图和曲线图。继续尝试不同的数据集,并让我知道您在回复部分的评论。
本文是与皮尤什·英格尔合作完成的。
在你走之前
感谢 的阅读!如果你想与我取得联系,请随时通过 hmix13@gmail.com 联系我或我的 LinkedIn 个人资料 。可以查看我的Github简介针对不同的数据科学项目和包教程。还有,随意探索 我的简介 ,阅读我写过的与数据科学相关的不同文章。
使用 Matplotlib 和 Seaborn 实现数据可视化
原文:https://towardsdatascience.com/data-visualization-using-matplotlib-seaborn-97f788f18084?source=collection_archive---------13-----------------------
数据可视化
着眼于增强可视化的定制选项,并检查一些鲜为人知的绘图功能
数据可视化通过地图或图形提供了一个可视化的环境。在这样做的时候,它将数据转换成一种更自然的形式,以便人类大脑理解并挑选出感兴趣的模式或点。一个好的可视化有助于信息的传递或作为数据展示(讲故事)的一部分的行动号召。
作者图片|用于搞笑,用于专业演示时风险自担。
这个潜在项目的想法部分是在几年前维护 iaito 订单记录时受到启发的。我选择这个数据,因为我觉得这可能是一种将数据科学(可视化和分析)与传统艺术(Iaido)联系起来的方式,也是一种可视化实践。该数据集是关于 2013 年至 2021 年 iaito 订单详情以及 iaito 规格和成本(JPY)的数据。出于隐私原因,敏感信息,如送货地址、姓名等。从一开始就没有记录在数据中。
Iaito 是练习用的仿武士刀。Koshirae 指的是 iaito 上的配件— (Fuchi,Kashira,Kojiri)。剑条指的是剑卫。长度的测量系统基于日本单位(即长度测量用的日本单位);为了便于解释,这些单位随后被转换成公制单位。从初学者到高级的模型是 Shoden-Chuden-Okuden。
内容
- 图书馆
- Matplotlib 和 Seaborn 方法
- 带代码的可视化示例
- 最后的想法
图书馆
Matplotlib 和 seaborn 是 Python 中可视化数据的常用工具。在本文中,使用这两个库生成了一些可视化效果,并简要介绍了绘图功能。
Matplotlib 和 Seaborn 方法
使用 matplotlib 时,有两种方法:函数接口和面向对象接口。作为初学者,我们通常会看到更多的前一种情况。随着人们对使用这个库绘图越来越熟悉,后一种方法开始发挥作用,用于可伸缩性和更复杂的定制。
# Example
x = smthg
y = smthg# plt interface
plt.figure(figsize=(9,7)
plt.plot(x,y)# object-oriented interface
fig, ax = plt.subplots()
ax.plot(x, y)
对于 seaborn 来说,也有两种方法。它们是轴级函数和图形级函数。轴级函数采用一个显式的 ax 参数,并返回一个 Axes 对象。对于图形级别的函数,这些函数需要对绘制的图形进行整体控制。因此,需要传入一个“数字级别”的参数。一个例子是通过高度和长宽比值定制图形尺寸。
# Typical object-oriented style (seaborn)
f, (ax1, ax2) = plt.subplots(2)
sns.regplot(x, y, ax=ax1)
sns.kdeplot(x, ax=ax2)# Figure-level
sns.catplot(data=df, x='x_variable', y='y_variable', hue='hue', height=8, aspect=12)
没有意识到一个特定的 seaborn 情节是哪一级功能可能会在很多时候出错(我当然是其中之一)。如果卡住,检查绘图类型。
各个功能的曲线图示例:
- “轴级”功能:regplot、boxplot、kdeplot。
- “图形级”功能:relplot、catplot、displot、pairplot、jointplot。
带代码的可视化示例
这些示例展示了创建地块以及特定自定义的各种方法。最初,我采取的是“如果有效,那就好”的心态。为了可维护性和在试验新概念时的一致性,我对代码进行了几次重构。例如,标题、轴、刻度标签和图例的一致代码结构通常适用于所有地块。此外,我还考虑了潜在的受众,以及让可视化流行起来的方法。其中一些方法包括使用配色方案和形状。在颜色方面,有三种主要的调色板可供选择:
- 定性的
- 连续的
- 分歧
为了便于生成配色方案,我使用了来自数据颜色选择器的工具。为了重复使用,还创建了字体大小的通用占位符。
# create placeholder for fontsizing
# x & y label fontsize
xls = 14
yls = 14# x & y tick fontsize
xts = 13
yts = 13# title fontsize
ts = 15# legend fontsize
ls = 13
用 pyplot 接口绘制相对简单。对于下面的折线图示例,fig.autofmt_date()提供了定制轴刻度标签的替代方法。旋转刻度标签的常见原因要么是单位名称太长(可以通过选择缩写的表示单位来缓解),要么是因为日期。正如函数名所暗示的,它执行日期刻度标签的自动旋转和对齐(将 y 刻度标签更改为“ydate”)。
# Establish the size of the figure.
fig = plt.figure(figsize=(16, 6))plt.plot(df_fedex['postage'], linewidth=2,color='blue')# Customize
plt.title('Postage over time',fontsize=ts)
plt.ylabel('Price (JPY)', fontsize=yls)
plt.yticks(size=yts)
plt.xticks(size=12)# Rotate and align the tick labels so they look better.
fig.autofmt_xdate()
plt.show()
作者图片
饼图通常被过度使用,可能会扭曲所呈现的信息(即没有刻度)。
图片由作者提供|是的,为这些图表的上下文信息添加了比例。|工具:imgflip.com
尽管如此,它在可视化中还是有一席之地的——用于呈现一些类别及其数量/百分比。谨慎使用,利用注释、配色方案和形状,它仍然可以产生影响。对于下面的饼图,我采用了可重复使用的颜色方案,并在图表注释中添加了百分比和绝对订单数量。添加一个圆形将饼图转换成一个环形图,以增强视觉效果。
# Create figure
fig, ax = plt.subplots(figsize=(6,6), subplot_kw=dict(aspect="equal"))# Standarizing color scheme for the Iaito models
palette = ['#6d91ad','#004c6d','#416e8c','#99b6ce','#c6ddf1' ]def make_autopct(count):
def my_autopct(pct):
total = sum(count)
val = int(round(pct*total/100.0))
return f'{pct:.1f}% ({val:d})'
return my_autopctax = df_pie['count'].plot(kind='pie',fontsize=ls,autopct=make_autopct(count),pctdistance=0.6, colors=palette)ax.set_ylabel("")
ax.set_title("Distribution of Iaito models",fontsize=ts)# Add a white circle to center of pie chart
centre_circle = plt.Circle((0,0),0.80,fc='white')
fig = plt.gcf()
fig.gca().add_artist(centre_circle)plt.show()
作者图片
继续使用面向对象的绘图方法,下面的箱线图结合了这种方法和前面提到的配色方案概念。默认的箱形图是垂直的,但是可以通过交换 x 和 y 输入来重新排列。
# boxplot, models are organised in ascending order
palette_box = ['#c6ddf1','#99b6ce','#6d91ad','#416e8c','#004c6d']fig, (ax1,ax2) = plt.subplots(2,1,figsize=(14,8), sharey=True)
sns.boxplot(data=df2, y='model', x='model_price',ax=ax1, palette=palette_box)
sns.boxplot(data=df2, y='model', x='iaito_total_price',ax=ax2, palette=palette_box)ax1.set_ylabel('')
ax2.set_ylabel('')
ax1.set_xlabel('')
ax2.set_xlabel('price (JPY)',fontsize = yls)
ax1.set_title('Base price by model', fontsize = ts)
ax2.set_title('Overall price by model', fontsize = ts)
ax1.tick_params(axis='x', labelsize='large')
ax1.tick_params(axis='y', labelsize='large')
ax2.tick_params(axis='x', labelsize='large')
ax2.tick_params(axis='y', labelsize='large')plt.tight_layout
plt.show()
作者图片
该配色方案也可用于替代 seaborn 地块中的色调。在下面的示例中,lmplot(图形级函数)配色方案(通过分类类&PLT . use . style(gg plot)的色调的组合调用)可以通过为 seaborn 设置调色板来覆盖,如下所示:
# Set your custom color palette
palette = ['#6d91ad','#004c6d','#416e8c','#99b6ce','#c6ddf1' ]
sns.set_palette(sns.color_palette(palette))# Consistent grey background
plt.style.use('seaborn-darkgrid')# Lmplot is a figure-level function plot
ax = sns.lmplot(x='model_price', y='iaito_total_price',data=df,
fit_reg=False, #no regression line
hue='model',height=7, aspect=1.2, legend=False,legend_out=False)
plt.title('Iaito model price vs total price', fontsize=ts)
plt.ylim(30000,None)
plt.yticks(np.arange(35000, 210000, step=10000), fontsize=yts)
plt.ylabel('Iaito total price (JPY)',fontsize=yls)
plt.xticks(rotation=45, fontsize=xts)
plt.xlabel('Iaito model base price (JPY)',fontsize=xls)
plt.legend(fontsize=ls)plt.show()
作者提供的图片
Violin 图可用于表示不同 iaito 模型中不同“类别”(如本例中的 Kojiri 和 No kojiri)的变量分布(或样本分布)的比较。
ax= sns.catplot(x="model", y="custom_design(cost)", data=df_ko, hue="kojiri",
kind="violin", split=True, inner="stick", palette="mako", linewidth=1,
height=4,aspect=2.5)
ax.fig.suptitle('Kojiri & associated additional costs across models', fontsize=ts)
ax.fig.subplots_adjust(left=0.1, top=0.9)
ax.set_xlabels('')
ax.set_ylabels('price (JPY)', fontsize=yls)
ax.set_xticklabels(fontsize=xts)
ax.set_yticklabels(fontsize=yts)
ax._legend.set_title('Kojiri')plt.show()
作者图片
matplotlib 和 seaborn 的通用性相互支持。分组条形图可从 plt.bar 或 plt.bar()或 seaborn(如 catplot)绘制。在 matplotlib 的情况下,这可以通过将轴索引偏移指定的条形宽度来实现。
# seaborn catplot (horizontal grouped bar chart)
ax = sns.catplot(y="kojiri", data=df_ko,
kind="count", hue="model",
palette=palette_box, edgecolor=".6",
height=5, aspect=2,legend=False)
ax.fig.suptitle('Iaito with & without kojiri (by model count)', fontsize=ts)
ax.fig.subplots_adjust(left=0.15, top=0.9)label = np.arange(0,20)ax.set_xlabels('')
ax.set_xticklabels(fontsize=xts)
ax.set_ylabels('Kojiri', fontsize=yls)
ax.set_yticklabels(fontsize=yts)
ax.add_legend(fontsize=ls)
plt.show()
作者图片
# Setting the data
years = [2013,2014,2015,2016,2017,2018,2019,2020,2021]
Sho = [0,0,0,0,0,0,1,1,1]
Chu_M = [0,0,0,0,1,2,2,2,2]
Chu_S = [1,2,4,7,8,18,18,20,22]
Oku_Nosyu = [0,0,0,1,1,3,4,4,4]
Oku_Shin = [0,0,0,0,3,4,8,10,10]# set bar width
width=0.15# axis index
years_index = np.arange(len(years))# clear reset plt style
plt.style.use('default')
plt.style.use(['ggplot'])
plt.figure(figsize=(8,5))# plt interface approach for bar charts
plt.bar(years_index-2*width, Sho, color='#c6ddf1', label='Sho', width=width, linewidth=0.4,edgecolor='darkgrey')plt.bar(years_index-width, Chu_M, color='#99b6ce', label='Chu_M', width=width)plt.bar(years_index, Chu_S, color='#6d91ad', label='Chu_S', width=width)plt.bar(years_index+width, Oku_Nosyu, color='#416e8c', label='Oku_Nosyu', width=width)plt.bar(years_index+2*width, Oku_Shin, color='#004c6d', label='Oku_Shin', width=width)plt.legend()plt.title('Iaito model ownership',fontsize=ts)
plt.xlabel('Year',fontsize=xls)
plt.xticks(ticks=years_index, labels=years)
plt.ylabel('Count',fontsize=yls)
plt.yticks(list(np.arange(df_cumsum['count'].max()+1)))plt.show()
作者图片
根据数据传达的信息、数据的特征和目标受众,某些情节可能更适合。例如,下面的 catplot 可能会传达五种型号的 saya 设计数量及其额外成本。但是随着数据点数量的增加,这可能是不可扩展的。最好将消息拆分,例如,根据 saya 设计价格的数量和分布来划分 saya 设计的受欢迎程度。这就是我对后一个方向的径向图所做的。代码片段在 catplot 之后。
ax = sns.catplot(x="model", y="saya(cost)", data=df_saya1,
hue="saya", palette= 'tab20b', kind="swarm", s=10,
height=4.5, aspect=2.5)
ax.fig.suptitle('Saya across models',fontsize=ts)
ax.fig.subplots_adjust(left=0.1, top=0.9)
ax.set_xlabels('')
ax.set_ylabels('price (JPY)', fontsize=yls)
ax.set_xticklabels(fontsize=xts)
ax.set_yticklabels(fontsize=yts)
ax._legend.set_title('Saya')plt.show()
作者图片|随着数据点的增加,可扩展性成为一个问题
# replicating saya color is impractical from experience. Use a sequential color scheme
palette_saya = ['#7eedff','#6dd7ed','#5dc2dc','#4dadc9','#3e99b7','#3085a5','#217192','#125e7f','#004c6d',
'slateblue','rebeccapurple','purple','indigo']# initialize the figure
plt.figure(figsize=(10,10))
ax = plt.subplot(111, polar=True);
plt.axis('off')
plt.title('Saya ranked by price (JPY)',y=.9,fontsize=ts)# set coordinate limits
upperlimit = 100
lowerlimit = 30# compute max and min of dataset
max_ = df_saya2['saya(cost)'].max()
min_ = df_saya2['saya(cost)'].min()# compute heights (conversion of saya_charge into new coordinates)
# 0 will be converted to lower limit (30)
# max_ converted to upper limit (100)
slope = (max_ - lowerlimit)/max_
heights = slope * df_saya2['saya(cost)'] + lowerlimit# width of each bar
width = 2*np.pi / len(df_saya2.index)# compute angle each bar is centered on
indexes = list(range(1, len(df_saya2.index)+1))
angles = [element * width for element in indexes]# draw
bars = ax.bar(x=angles, height=heights, width=width, bottom=lowerlimit,
linewidth=1,edgecolor="white",color=palette_saya)# padding between bar and label
labelPadding = 1000# label
for bar, angle, height, label in zip(bars,angles,heights,df_saya2['saya_']):
# specify rotation in degrees
rotation = np.rad2deg(angle)
#flip some labels upside down for readability
alignment = ""
if angle >= np.pi/2 and angle < 3*np.pi/2:
alignment = "right"
rotation += 180
else:
alignment = "left"
# add label
ax.text(x=angle, y=lowerlimit + bar.get_height() + labelPadding,
s=label, ha=alignment, va='center', rotation=rotation, rotation_mode="anchor",size=12)plt.show()
作者图片|非常规,但在这种情况下有效
最后但同样重要的是,xkcd 风格。xkdc 的情节以其幽默、科学术语和视角的*衡在许多人的脑海中占据了特殊的位置。这种绘图风格可以通过 plt.xkcd() 从 matplotlib 中调用,就像这样。输出是本文的第一幅图像。令人惊讶的是,xkcd 风格的简单图形需要大量的计划和思考,尤其是注释位置和箭头位置。
# create a dataframe for 2019-11-01 date
# anchoring annotations and like laterdata = {'date': ['2019-11-01','2017-01-01'],
'value': [22600,17500]}
df_dt = pd.DataFrame(data, columns = ['date', 'value'])
df_dt['date'] = pd.to_datetime(df_dt['date'])# Create the postage chart in xkcd style
plt.style.use('default')
plt.xkcd()# create yticks for labeling
yticks = np.arange(5000,25000,2500)# Establish the size of the figure.
fig, ax = plt.subplots(figsize=(12, 6))
plt.plot()
# Scatter plot
ax.scatter(df_fedex['date'],df_fedex['postage'], s=40,color='blue')
# vertical line
ax.vlines(df_dt['date'][0],5000,df_dt['value'][0],linestyle='-.',linewidth=1,color='r')# annotate
ax.text(df_dt['date'][0],7500,'covid emerges',fontsize=18)
ax.annotate('4.5x increase!', fontsize=18,
xy=(df_fedex['date'][df_fedex.index[-1]],22516),
xytext=(df_dt['date'][1],17500),
arrowprops=dict(arrowstyle='-|>',
connectionstyle='angle3,angleA=0,angleB=-90')
)# Title & labels
ax.set_title('One more reason to mask up',fontsize=18)
ax.set_ylabel('Postage (JPY)', fontsize=yls)
ax.set_yticks(ticks=yticks)
ax.set_yticklabels(labels=yticks,size=yts)
plt.xticks(size=14)# Rotate and align the tick labels so they look better.
fig.autofmt_xdate()
plt.tight_layout()
plt.show()
最后的想法
通过这个项目,我发现情节的结构是高度情境化的——目标受众、数据的性质和颜色等方面都发挥了作用。贯穿探索性数据分析和博客的情节组织也可能遵循非常不同的思路。总而言之,整个项目是一个数据发现、处理数据清理、分析、代码重构和实验的迭代过程。该流程还发现了数据采集上游的几个问题。为了提高数据质量,需要进行更多的日语翻译,并对项目代码(例如,tsuba 代码)进行标记,这一工作已经完成(见后注)。进一步的项目扩展可能是对与刀剑相关的主题进行分析。尽管这些例子和方法并不详尽,但希望您能够获得一些见解,从而在定制 pyplot & seaborn 可视化时减少潜在的障碍。
感谢阅读!
后注:2021 年 5 月 22 日——关于剑条家具的细节。数据集和代码可以在 这里 访问
使用 PyGal 实现数据可视化
原文:https://towardsdatascience.com/data-visualization-using-pygal-ebd26869d6bf?source=collection_archive---------26-----------------------
使用 PyGal 在 Python 中使用可伸缩可视化
(来源:作者)
数据可视化有助于理解隐藏的数据模式和分析数据想要表达的内容。通过创建不同类型的图表和绘图,我们可以了解不同数据集与目标变量之间的关联和共线性。
Python 提供了大量像 Seaborn、Matplotlib 等数据可视化库。这些库的问题是我们创建的可视化是不可扩展的,这意味着它只能以 PNG 和 JPEG 格式使用。有时,由于它们的局限性,使用这些可视化变得很有挑战性。
PyGal 是一个开源 Python 库,用于创建数据可视化,可以下载并在各种应用程序中使用。使用 PyGal 的主要优势之一是创建的可视化可以以 SVG 格式下载。
在本文中,我们将探索 PyGal 并使用它创建一些可视化效果。
让我们开始吧…
安装所需的库
我们将从使用 pip 安装来安装 PyGal 开始。下面给出的命令将使用 pip 安装 PyGal。
pip install pygal
导入所需的库
在这一步中,我们将导入创建数据可视化所需的所有库。
import pygal
import seaborn as sns
正在加载数据集
在本文中,我们将使用 seaborn 著名的 Tips 数据集。
df = sns.load_dataset('tips')
创建可视化
现在我们将从使用 PyGal 创建一些基本的可视化开始。我们还将创建想要可视化的数据集。
- 简单条形图
bar_chart = pygal.Bar()
bar_chart.add('Tip', df['tip'])
bar_chart.render_to_file('bar_chart1.svg')
条形图(来源:作者)
2。双条形图
bar_chart.add('Tip', df['tip'][:10])
bar_chart.add('Total Bill', df['total_bill'][:10])
bar_chart.render_to_file('bar_chart2.svg')
双条形图(来源:作者)
3。折线图
line_chart = pygal.Line()
line_chart.add('Total Bill', df['total_bill'][:15])
line_chart.render_to_file('line1.svg')
折线图(来源:作者)
4。双线图
line_chart.add('Total Bill', df['total_bill'][:15])
line_chart.add('Tips', df['tip'][:15])
line_chart.render_to_file('line2.svg')
来源:作者
5。箱形图
box_plot = pygal.Box()
box_plot.title = 'Tips Dataset'
box_plot.add('Tips', df['tip'])
box_plot.render_to_file('box1.svg')
方框图(来源:作者)
6。漏斗图
funnel_chart = pygal.Funnel()
funnel_chart.title = 'Total Bill'
funnel_chart.add('Total Bill', df['total_bill'][:15])
funnel_chart.add('Tip', df['tip'][:15])
funnel_chart.render_to_file('funnel1.svg')
漏斗图(来源:作者)
在这里,您可以清楚地看到我们使用 PyGal 创建的不同图表和绘图。继续尝试不同的数据集,创建不同的可视化效果,并让我知道您在回复部分的评论。
本文是与 Piyush Ingale 合作完成的。
在你走之前
感谢 的阅读!如果你想与我取得联系,请随时通过 hmix13@gmail.com 联系我或我的 LinkedIn 个人资料 。可以查看我的Github简介针对不同的数据科学项目和包教程。还有,随意探索 我的简介 ,阅读我写过的与数据科学相关的不同文章。
熊猫的数据可视化
原文:https://towardsdatascience.com/data-visualization-with-pandas-1571bbc541c8?source=collection_archive---------14-----------------------
这不仅仅是简单的数字
马库斯·温克勒在 Unsplash 上的照片
Pandas 可以说是最流行的数据分析和操作库。它使得处理表格形式的数据变得极其容易。Pandas 的各种功能构成了一个强大而通用的数据分析工具。
数据可视化是探索性数据分析的重要组成部分。在提供数据的概述或总结方面,它比简单的数字更有效。数据可视化有助于我们理解数据集中的底层结构或探索变量之间的关系。
Pandas 不是一个数据可视化库,但它能够创建基本的绘图。如果您只是创建用于探索性数据分析的地块,Pandas 可能非常有用和实用。对于此类任务,您不必使用额外的数据可视化库。
在本文中,我们将仅使用熊猫创建几个地块。我们的目标是探索 Kaggle 上可用的墨尔本房产数据集。
让我们从导入库和将数据集读入数据帧开始。
import numpy as np
import pandas as pddf = pd.read_csv("/content/melb_data.csv", usecols = ['Price', 'Landsize','Distance','Type','Regionname'])df = df[df.Price < 3_000_000].sample(n=1000).reset_index(drop=True)df.head()
(图片由作者提供)
我只看过原始数据集的一小部分。read_csv 函数的 usecols 参数允许只读取 csv 文件的给定列。我还过滤掉了价格方面的异常值。最后,使用 sample 函数选择 1000 个观察值(即行)的随机样本。
我们可以从创建价格和距离列的散点图开始。散点图主要用于检查两个连续变量之间的相关性。
我们可以使用熊猫的绘图功能来创建许多不同类型的可视化。绘图类型由 kind 参数指定。
df.plot(x='Distance', y='Price', kind='scatter',
figsize=(10,6),
title='House Prices in Melbourne')
(图片由作者提供)
我们没有观察到价格和距离之间有很强的相关性。但是,对于价格较低的房子,有轻微的负相关性。
探索性数据分析中另一种常用的绘图类型是直方图。它将连续变量的值域划分为离散的箱,并计算每个箱中的观察值(即行数)。因此,我们得到了一个变量分布的结构化概览。
下面的代码生成 price 列的直方图。
df['Price'].plot(kind='hist', figsize=(10,6), title='Distribution of House Prices in Melbourne')
(图片由作者提供)
大多数房子的价格在 50 万到 100 万英镑之间。正如您所注意到的,我们将 plot 函数应用于一个系列(df['Price'])。根据绘图类型,我们可以对数据帧或系列使用 plot 函数。
箱线图可以展示变量的分布。它们显示了值是如何通过四分位数和异常值分布的。我们可以如下使用熊猫的 boxplot 函数。
df.boxplot(column='Price', by='Type', figsize=(10,6))
(图片由作者提供)
这个箱线图代表了房价的分布。“by”参数根据给定的列对数据点进行分组。我们将 type 列传递给 by 参数,这样我们可以分别看到每种类型的分布。
“h”型的房子一般比其他的要贵。异常值(即极值)用圆点表示。方框的高度与数值的分布成正比。因此,较高的方框表示更多的差异。
使用 Pandas 创建可视化的一个优点是,我们可以将数据分析功能和绘图功能链接起来。这在某种程度上简化了任务。例如,groupby 和 plot.bar 函数可用于创建不同地区*均房价的条形图。
我们首先按地区名称对价格进行分组,然后计算*均值。然后,对结果应用 plot.bar 函数。
df[['Regionname','Price']].groupby('Regionname').mean().sort_values(by='Price', ascending=False).plot.bar(figsize=(10,6), rot=45, title='Average house prices in different regions')
(图片由作者提供)
sort_values 函数可用于按升序或降序对结果进行排序,以使绘图看起来更好。最昂贵的房子位于南部大都市地区。
结论
我们已经看到熊猫如何被用作数据可视化工具。它远远超出了 Seaborn 和 Matplotlib 等专用的数据可视化库。然而,Pandas 提供了一种在探索性数据分析过程中创建基本地块的更实用的方法。
您可以随时一起使用 Pandas 和数据可视化库。这没什么坏处。但是,在某些情况下,你可以用熊猫更容易更快地完成工作。
感谢您的阅读。如果您有任何反馈,请告诉我。
使用 SwiftUI 的数据可视化:条形图
原文:https://towardsdatascience.com/data-visualization-with-swiftui-bar-charts-599de6c0d79c?source=collection_archive---------29-----------------------
在 SwiftUI 应用中构建漂亮的图表
照片由卢卡斯·布拉塞克在 Unsplash 上拍摄
苹果在 2019 年推出了 SwiftUI,作为一种轻量级和易于使用的方式来创建用户界面。本文是探索 SwiftUI 框架如何帮助我们构建干净、简单和令人惊叹的数据可视化工具的系列文章的第二篇。今天,焦点落在了一个老古董——条形图上。
什么是条形图?
条形图是一种处理分类数据的可视化数据。该图表为所有变量呈现一个矩形条,每个变量的高度与它们所代表的值成比例。
上面的文字听起来不错,但是在普通人的语言中它是什么意思呢?
分类变量只是一个允许我们根据一组标签对其进行分类的变量。标签不需要内部排序,并且可以与零个、一个或多个数据点相关联。例如,我们可以根据出具收据的商店对收据进行分类。商店没有内部排序,这意味着我们不能说一个比另一个小或大(至少在没有定义另一个指标进行比较的情况下)。
条形图的想法是可视化一些与我们的标签相关的顺序变量。我们可以选择表示从每个商店收到的收据数量或在那里消费的总金额。由于这些度量符合顺序度量尺度,我们可以将它们相互比较。在我们的条形图中,我们为更大的指标绘制了一个更高的条形图。
我们在本文中构建的条形图的一个例子。
这种类型的可视化可能适用于以下情况:
- 比较贵公司的年度利润。
- 创建一个你在衣服、鞋子、食物等上面花了多少钱的概览。
- 想象你一年中每月的工作时间。
我们需要什么?
就像在雷达图文章中一样,我们需要对Paths
和Shapes
有一个扎实的理解。我们还需要了解一点关于Stacks
的情况。由于我们在前一篇文章中介绍了Paths
和Shapes
,我们直接开始学习Stacks
。
SwiftUI 提供了多种风格的Stacks
,比如VStack
、HStack
和ZStack
。这些组件是布局元素,它们唯一的任务是以一种整洁的、堆栈式的方式一个接一个地布局它们的子元素。HStack
水*放置孩子,VStack
垂直放置,而ZStacks
沿着 Z 轴堆叠他们的孩子(所以,一个在另一个上面)。当我们想要呈现多个相邻的条时,或者当我们想要在这些条后面放置一个网格时,这些属性就很方便了。
我们怎么给这东西编码?
让我们从图表的基础开始,即BarChart
视图。
这个坏小子包含了很多定制点。让我们从头到尾看一遍,弄清楚这一切。
body
首先将图表及其附带的类别封装在一个垂直堆栈中,确保标签呈现在条形下方。图表区由一个可选的BarChartGrid
、一个BarStack
和一些包含在ZStack
中的BarChartAxes
组成,将它们放置在彼此之上。
在 body 上方定义了两个计算属性(minimum
和maximum
)。这些计算我们的数据的最小值和最大值。他们还为这些值添加了一点缓冲,这样最小的数据点就不会呈现一个不可见的条。
让我们也来看看BarChartGrid
和BarChartAxes
:
这个Shapes
够直截了当的。BarChartGrid
在图表区域中呈现设定数量的水*线。BarChartAxes
为我们绘制一个 X 轴和一个 Y 轴。
绘制数据
我们正在进入正题。该画实际数据了!看看BarStack
的代码:
这里发生了很多事情,所以让我们来分析一下。
主体创建了一个HStack
来将我们的栏排列成一个漂亮的行。它使用一个ForEach
组件为每个数据点创建一个线性梯度。由于线性渐变占用了所有可用的空间,我们使用一个 BarPath 形状将其裁剪到合适的大小。从下面的代码中可以看出,BarPath
只是一个包装了RoundedRectangle
的花哨包装。最后但同样重要的是,我们撒上一些阴影和填充。
最后,让我们快速看一下LabelStack
:
与BarStack
非常相似,LabelStack
使用HStack
将所有标签排成一行。由于我们使用相同的方法,这些将与条形很好地对齐(假设我们在传递数据点时使用相同数量的类别)。
把所有的放在一起
本文中开发的条形图应该可以使用了。只需插入您的数据,进行任何您想要的定制,然后点击运行!
你有兴趣学习更多关于软件开发的知识吗?
关注我,在我发布新文章时获得通知。
在下一次之前,您可以阅读本系列的第一篇文章:
https://medium.com/better-programming/data-visualization-with-swiftui-radar-charts-64124aa2ac0b
你可以回顾一些如何解决复杂问题的指导方针:
https://medium.com/swlh/how-to-code-when-you-dont-have-a-clue-daa842cfd6ea
或者你可能想得到一些在家工作时如何保持理智的建议:
https://medium.com/swlh/how-to-stay-sane-as-a-remote-developer-48377bae99d3
SwiftUI 数据可视化:饼图
原文:https://towardsdatascience.com/data-visualization-with-swiftui-pie-charts-bcad1903c5d2?source=collection_archive---------17-----------------------
在 SwiftUI 应用中构建漂亮的图表
照片由 Tran Mau Tri Tam 在 Unsplash 上拍摄
苹果在 2019 年推出了 SwiftUI,作为一种轻量级和易于使用的方式来创建用户界面。本文是探索 SwiftUI 框架如何帮助我们构建干净、简单和令人惊叹的数据可视化工具的系列文章的第三篇。这次,我们来看看如何制作饼状图!
什么是饼图?
饼图,也称为圆形图,是一种数据可视化,将每个数据值表示为圆形的一个按比例大小的切片。像条形图一样,它们处理分类数据,如果不同类别之间的比率对于传达是必不可少的,那么它们是一个很好的工具。
我们在本文中构建的饼图的一个例子。
这种类型的可视化可能适用于以下情况:
- 想象一下公司每个部门的年度预算是多少。
- 试着了解一下你的月薪是如何在支付房租、食物和购买涵盖 SwiftUI 的教育书籍之间分配的。
- 在你所在的城市的不同区域,列出出租公寓和共管公寓的比例。
我们需要什么?
为了制作一个饼图,我们需要 SwiftUI 的Path
、Shape
和ZStack
类型。因为我们在本系列的前几篇文章中已经讨论了所有这些,所以我们直接进入实现。我们走吧!
我们怎么给这东西编码?
让我们从主要组件开始,即 PieChart 结构。
这个结构包含了相当多的帮助函数,其中一些做了一些乍一看可能很吓人的数学运算,但是我们将对其进行详细介绍。
因为我们将数据表示为扇形,所以我们需要计算它们的开始和结束角度。我们使用startAngle(for:)
和endAngle(for:)
方法来完成这些任务,它们以弧度返回它们的值。
方法textOffset(for:in:)
方法看起来更复杂。然而,在现实中,它与角度方法非常相似。它的任务是在我们的圆上计算一个点,在这个点上我们可以放置标签来描述不同的圆扇区所代表的内容。这些计算有两个值得一提的性质:
- 他们把标签放在圆心和圆周之间的三分之二处。
- 他们将标签放置在位于其相关扇形中心的一个角度上。
现在,让我们看看body
属性,看看它是如何构造的。层次结构从将我们所有的内容包装在一个GeometryReader
中开始。该组件提供了对包含矩形的信息的访问,我们需要它来正确放置标签。
在GeometryReader
的内部是一个ZStack
,它允许我们将几个组件放置在彼此的顶部。ZStack
拥有一个ForEach
视图,它依次为我们所有的数据点创建PieSlice
组件和PieSliceText
。注意,ForEach
每次运行都会实例化两个PieSlice
对象。在撰写本文时,SwiftUI 没有提供一种好的方法来描边和填充单个Shape
,迫使我们创建两个对象——一个用于填充,一个用作轮廓。
最后要注意的是,我们指定了PieSliceText
的 Z 索引,以确保它们呈现在任何其他组件之上。
绘制数据
PieChart
视图在计算所有封闭组件的角度和位置方面做了大量繁重的工作。得益于此,实现PieSlice
Shape
和PieSliceText
标签是一件轻而易举的事情。看一下PieSlice
的代码。
PieSlice
实例化时以开始角度和结束角度作为参数。在三角学的帮助下,它画出了一个在这些角之间的扇形。这里没有什么新奇的东西——只是普通的古老的直角三角形数学。
最后要检查的是PieSliceText
组件。它唯一的工作就是将两个文本标签叠放在一起——这项任务它可以精确无误地完成。
把所有的放在一起
我们在本文中整理的PieChart
视图可以按原样使用。您所要做的就是将文件复制到项目中,并实例化一个新对象。请随意试验这些组件,添加新组件,并赋予图表您自己的个人风格。我迫不及待地想看看你用这个创造了什么!
您有兴趣了解更多关于软件开发和数据科学的知识吗?
关注我,当我发布新文章时会收到通知。
直到下一次,您可以阅读本系列的第一篇和第二篇文章:
https://medium.com/better-programming/data-visualization-with-swiftui-radar-charts-64124aa2ac0b
或者你可以回顾一下如何解决复杂问题的一些指导方针:
https://medium.com/swlh/how-to-code-when-you-dont-have-a-clue-daa842cfd6ea
数据即遭遇死亡
原文:https://towardsdatascience.com/data-viz-meets-death-a481498f7a58?source=collection_archive---------22-----------------------
变更数据
通过数据可视化探索生者和死者之间的互动
图 1:通过转换个人数据和开花数据的组合制作的 2D 和樱花的 3D 形式。记忆开花是生者和死者一生记忆的集合,在日本文化中代表着对春天的庆祝。
数据可视化能帮助我们更好地理解和应对我们的死亡率吗?有没有超越圆形或时间线的一维表示的方式来想象死亡?我们能利用大规模数据集讲述个人的、亲密的故事吗?这些都是我在制作 记忆开花一个数据可视化对象,同时也作为对死者的纪念对象时问自己的问题。使用数据人文主义和生成设计方法,Memory flowers旨在通过将围绕我们死亡率的个人数据与自然和地球周期的大规模数据联系起来,引发对死亡的对话和思考。本文将探索记忆开花背后的设计过程,它被设计在其中的日本文化背景,我希望,将展示数据可视化如何帮助处理像死亡这样重大而可怕的主题,并将其转化为人们可以更舒适地保留空间的东西。
初步研究:探索数据人文主义
由于研究死亡的私密性和易受伤害性,我受到启发,通过设计师 Giorgia Lupi 和斯蒂芬妮·波萨维克在亲爱的数据中提出的数据人文主义的视角,开始了我的数据可视化研究。从本质上讲,数据人文主义是基于数据不仅仅是数字这一事实。数据与人类的故事紧密相连,通过创造性的可视化,可以传达同理心、不完美和其他人类品质。
我通过记录和绘制我自己的数据集来开始这个过程,主题包括我与人互动的次数或我读过的书的数量。我用小学美术用品在 5" x 7 "的卡片上制作手绘数据可视化。这些最初的研究揭示了一个重要的模式,这个模式对这个项目的后续发展至关重要:可视化都是以循环的形式进行的,我意识到这对于我们如何研究死亡有着更大的影响。
图 2:手工制作的数据草图。(左)我和人交往过多少次?(对)过去 13 年我读过的书的数量。
核心洞察力:复合循环形状作为一种形式来可视化死亡率
循环形状意义重大,因为它们被用来表示时间,而死亡率和死亡与时间的本质密切相关。人类的寿命通常由一维的圆或线来概念化,就像显示一个时钟或历史时间线。但是通过我构建的循环的、多变量的数据可视化,我意识到我想拓展数据可视化显示时间的边界。在这个项目中,Memory flowers将时间视为*行的多个圆圈,试图展示我们的寿命如何与我们祖先的寿命以及我们周围自然的生命周期相互关联。
图 3:我认识到我们的寿命被包裹在几代人的寿命中,就像一个复合圆中的一个圆。
概念发展:樱花作为一个造型隐喻
我建立了循环视觉化时间的概念,通过一个圆形的组合,将它与日本春天的象征花:樱花联系起来。作为日本人,我从小就把樱花和日本的复兴联系在一起。这种花与日本人的记忆紧密相连,因为全国各地的毕业典礼在三月底举行,入学典礼在四月初举行,正好是樱花盛开的时候。樱花也是对死亡的一种反映,因为樱花的美丽在于它的季节只有很短的一段时间,而花期只有一周。有了这个比喻,我看到了一个机会,可以用大规模的自然数据集,特别是樱花数据集,讲述一个关于死亡的新故事。
图 4:用 D3.js 构建的 2D 数据可视化樱花
数据可视化:年龄和盛花期创造出曲线花瓣形状
该过程的下一步是找到相关的数据集。
关于樱花的生命周期,一组科学家 Yasuyuki Aono、Keiko Kazui 和 Shizuka Saito 收集了从公元 800 年到 2021 年日本京都樱花开花的物候数据系列。下面是根据他们收集的数据绘制的樱花盛开日期的散点图,我用这些数据制作了樱花的形状。
图 5:公元 800 年至 2021 年京都樱花盛花期散点图。
图 6:公元 800 年至 2021 年京都樱花盛花期的放射线图。
樱花于是成了雷达图的诗意版本。绕着开花径向图的外圈移动,我们会发现不同的年份,比如我母亲的,我祖母的,以及我自己的寿命。当我们从圆心向外移动时,我们会找到樱花盛开的日期。最后,花上花瓣的数量与这个人的寿命有关。年轻的人花瓣少,年长的人花瓣多。例如,下面的樱花放射状图表布局是 3 月 29 日至 4 月 17 日期间开花高峰期的可视化,跨越了 1988 年至 2017 年的生命周期。虽然这个原型使用了日本京都的盛花期日期,但我可以根据每个人的位置对他们应用不同的数据集。
图 7:樱花放射状图表布局和易读性键。
生成设计:构建数字形式
Grasshopper 3D 和 Rhinoceros 3D 等生成式设计工具可以使用日本多个地点的数据创建各种樱花,每个地点都有自己的开花日期。
图 8:三维数据可视化樱花。(中上)我的樱花。(左下)我妈的樱花。(右下)我奶奶的樱花。
图 9:樱花正面示意图。
这一点很重要,因为樱花通常首先在日本南部地区开放,那里的气温上升更早,开花向北推进,如图 9 所示。
虽然Memory flowers是一个通过日本樱花自然生命周期的镜头反映人类寿命的原型,但使用生成设计工具,可以将它应用于其他环境。例如,对于与美国风景有关的人,可能有一个版本基于玫瑰或其他植物类型的开花周期,与特定人的故事有关。
你的花朵:创造你自己的
*总之,*记忆开花,通过数据生成,让生者以更舒适的方式与逝者互动。这也引发了生者的反思。它不断提醒我们,由于我们的死亡,我们的生命是多么的美丽和脆弱。最终,它提醒我们使用个性化数据的生成设计的意图之一,可以是通过挑衅的形式来可视化我们自己的版本。
图 10:用 D3.js 构建的内存开花生成器。
我用 D3.js Observable 构建了一个内存开花生成器*。你可以用你喜欢的调色板和时间段来创造你自己的记忆之花。*
它可以是给家人、朋友和你心目中的任何人的礼物。请访问我的可观察笔记本并下载您的个性化版本。
没有亚历山大·伦吉佛和我在设计学院一起学习的同事们的支持,我不可能写出这篇文章。
数据仓库:2021 年你需要知道的基本概念
原文:https://towardsdatascience.com/data-warehouse-basic-concepts-you-need-to-know-in-2021-b07e7e46a209?source=collection_archive---------26-----------------------
理解大数据
当你手头只有分散在各处的未经处理的原始数据时,你如何获得商业洞察力?
作者图片
80 年代出生,40 岁左右还在算。这就是数据仓库,它需要大量的投资,可能需要几年的时间来构建。然而,失败的可能性极高。快进到 2021 年,数据仓库一直在与时俱进,并将继续成为世界各地组织的业务洞察力的支柱。那是什么呢?为什么我们首先需要数据仓库?作为一名数据专家,您至少需要了解数据仓库的哪些知识?
在这篇文章中,你将学到:
- 大图:业务中对数据的两种不同需求
- 传统与现代数据仓库
- EL vs ELT vs ETL vs 变更数据捕获:如何将数据放入数据仓库
大图:业务中对数据的两种不同需求
如果没有关于组织对数据的需求如何围绕两个主要目的发展的简短叙述,数据仓库的定义将是不完整的。
数据捕捉
**在企业数据开始的时候,它的唯一目标是为运营记录捕获交易数据。**考虑所有客户的联系方式、销售订单、发票、工资单等等。创建该数据库有两个目的。
- 以数字方式快速记录和跟踪业务活动(这样我们就不必处理到处乱飞和永远丢失的文件)
- 帮助业务用户更有效地完成他们的日常任务(例如,订单是否已经发货或我们有多少库存)
简而言之,关注当下,确保业务交易尽可能顺利进行这就是我们过去的数据世界。
数据分析
然而,企业很快意识到活在当下还不够好。新的问题出现了。与上个月相比,我们的表现如何?为什么上两个季度收入下降了?自年初以来,我们的客户经常抱怨什么?获取所有运营记录的需求仍然是不可或缺的,但现在有了另一个同样重要的目标:分析历史数据以用于决策。
不幸的是,曾经为捕获交易数据而构建的数据库不适合为管理层提供足够的事实和历史信息来做出明智的决策。由于捕获当前记录和跨各种数据源存储历史数据以进行分析之间的巨大差异,我们需要另一种工具。因此,数据仓库诞生了,剩下的就是历史了。
十秒钟外卖
数据仓库的诞生是为了服务于业务需求,即存储来自多个数据源的历史数据,用于业务洞察和决策。
传统与现代数据仓库
传统的数据仓库
数据仓库就是为来自各种来源的历史数据创建一个单一的真实版本,并使其易于访问,以一种可用的格式快速查询业务洞察力。通过这种方式,商业分析师和管理层可以迅速发现有关商业表现的趋势、模式或异常情况,并决定怎么做最好。
基于这一点,以下是传统数据仓库的 9 个关键需求,摘自 Ralph Kimball 的书《数据仓库工具包》。
作者图片
现代数据仓库
信不信由你,数据仓库的体系结构最早是在 20 世纪 80 年代开发的。进入 2021 年,三个主要趋势无疑改变了企业对待数据资产的方式,并塑造了新一代数据仓库。
- 大数据导致需要在单个数据仓库中处理数 Pb 的数据,以获得业务洞察。
- 云计算创造了接*无限的低成本存储,具有可扩展的计算能力,以现收现付的方式分析数据。
- 数据科学和机器学习的兴起要求在数据仓库、ETL 和数据处理工具以及数据可视化工具之间进行更紧密的集成以实现用于决策的*实时分析。
毫不奇怪,数据仓库的概念也必须发展以适应新的现实。因此,除了上述要求之外,现代数据仓库还应满足以下要求。
作者图片
数据仓库 vs 数据湖 vs 数据库
我个人认为,如果没有快速触及数据仓库、数据湖和数据库之间的区别,这篇文章是不完整的。所以让我们把事情放在一个角度来看。
虽然这三种解决方案都存储数据,但它们的用途非常不同。
- 数据库记录企业进行的日常交易,例如在线销售交易、订阅时事通讯的新客户、赊销的商品、通过在线预订系统预订的酒店房间等。它是为处理日常操作而不是分析洞察力而构建的。
- 一个数据湖存储所有来自不同来源的原始的、未加工的数据。因此,数据可能是结构化的、非结构化的或半结构化的,可能无法使用,而分析方法尚未确定。
- 数据仓库在一个位置存储处于可用状态的经过处理的数据,以便业务用户可以方便地访问、查询这些数据,从而快速了解情况并做出决策。
十秒钟外卖
为了继续为高级分析和机器学习提供商业洞察力,现代数据仓库必须能够处理数 Pb 的批量和流式数据,并与基于云的环境中的大数据生态系统的其他组件紧密集成。
EL vs ELT vs ETL vs 变更数据捕获:如何将数据放入数据仓库
正如我们所希望的那样,来自各种来源的数据不会神奇地将自己转换成清晰可用的格式,然后整合到一个单一的集中位置。为了在数据仓库中拥有好的数据,我们说数据需要一步一步地转换。将来自多个数据源的原始数据加工成数据仓库中有用信息的一系列步骤称为数据管道。
重要提示:数据管道总是被建模为有向无环图(DAG ),它从一个阶段流向另一个阶段,但从不循环回前一个节点或自身。
我们将探讨数据仓库管道中的 4 种常见模式,如下所示。
提取和加载(EL)
EL 可能是最简单的数据管道,因为不涉及数据转换。只有满足以下两个标准时,这种类型的数据管道才是合适的。
- 数据源和数据仓库的模式是相同的。
- 数据是绝对干净的,并且可以以有用的格式随时用于特别查询。
实际上,除了批量加载历史数据之外,很少将数据以原样格式导入数据仓库。因为原始数据不太可能是干净的和现成的,所以我们需要转换原始数据,这就带来了 ELT 和 ETL。
提取、加载和转换(ELT)
在 ELT 过程中,来自多个数据源的原始数据被立即加载到数据仓库中,而不进行任何转换。然后,用户将利用数据仓库本身进行转换操作,以执行基本的数据质量检查和描述性统计。在以下情况下,ELT 是一个很好的选择。
- 将数据加工成可用格式所需的所有转换都非常简单,可以通过基本的 SQL 操作来处理。
- 业务用户更喜欢立即访问原始或未整合的数据,以便在决定需要如何进行转换之前,先进行试验来检查质量或探索数据集。
提取、转换和加载(ETL)
对于 ETL 管道,数据在被存储到数据仓库之前,在管道中被转换(也称为在数据仓库之外的临时区域中)。每个转换步骤都可以用 Python、Java 或脚本编写,或者通过更直观的拖放式用户界面进行配置。与 EL 和 ELT 相比,ETL 无疑更为复杂,在应对以下挑战时应该用到它。
- 数据需要复杂的转换,如分组、展*、分区、计算或繁重的清理步骤来解决数据质量问题。
- 出于法规遵从性或安全性目的,在将敏感信息加载到数据仓库之前,需要将其删除。
因为复杂的转换发生在加载到数据仓库之前,所以数据量越大,业务用户在访问数据之前需要等待的时间就越长。与 ELT 相比,这可能是 ETL 最大的缺点之一。
变更数据捕获(CDC)
CDC 方法与 EL、ELT 和 ETL 非常不同。传统上,数据通常是从各种来源成批提取的。在某些情况下,一个数据库不能同时支持企业应用程序(支持日常业务事务)和对数据仓库的批量提取。
那么,只在非工作时间或者生产不会受到严重影响的任何时候复制数据库怎么样?不幸的是,只在规定的时间内更新分析数据意味着数据会在最需要新鲜见解的工作时间内迅速过时。这在我们这个永远在线的世界中越来越不可接受,因为数据将失去其价值。那怎么做呢?
另一种方法是将源系统中的增量数据变更捕获到数据仓库中。换句话说,不是复制数据库中的每一行,而是只将行更改(如插入、更新、删除以及元数据更改)加载到数据仓库。CDC 方法带来了两个主要好处。
- 能够捕获一段时间内的所有变化,而不仅仅是数据提取时数据源的状态,而不会中断业务运营
- 支持在数据仓库(或其他流分析应用程序)中捕获最新数据,以便在业务需要时更快地做出接*实时的战术决策
如果你有兴趣了解更多关于 CDC 方法的信息,请查阅这篇文章或丹·波特等人的名为“流变化数据捕获”的书。艾尔。
十秒钟外卖
将数据加载到数据仓库的方法取决于所需的转换量,以及持续捕获增量数据变化是否比基于固定时间表复制整个数据源更好。
包扎
原来如此!诚然,任何基本的东西可能都不会特别令人兴奋,尤其是考虑到所有花哨的技术和先进的数据处理技术。然而,通过介绍数据仓库的基本概念,我想让你对数据处理有一个稍微大一点的看法:在直接进入任何高级分析和机器学习之前,我们需要将分散在各处的所有相关数据收集到一个单一版本的真理中,然后使其易于访问,质量有保证,格式可用,并能快速查询。数据仓库可能只是达到目的的一种手段,但是正确使用它将决定您的见解是否对业务有任何价值。
感谢您的阅读。如果你觉得这篇文章有用,可以看看我在thedigitalskye.com的博客,或者在 LinkedIn 和 Twitter 上关注我,了解我关于数据、商业以及这两者之间任何事情的激动人心的故事。下次见!
参考
- Keith d . Foote 的《数据仓库简史》
- 拉尔夫·金博尔的数据仓库工具包
原载于 2021 年 2 月 3 日http://thedigitalskye.comT22。
数据仓库:实践
原文:https://towardsdatascience.com/data-warehouses-the-practice-f4615972d7b?source=collection_archive---------19-----------------------
真正的交易
约翰·汤纳在 Unsplash 上拍摄的照片
在一个理想的世界里,理论和实践之间的差距并不大,或者至少对项目的生命周期影响不大。然而,在现实世界中,尤其是在处理数据时,人们知道事实并非如此。数据存储,尤其是长时间存储的数据,可能会变得混乱,并导致脏表,在某些时候需要处理和整理这些脏表,以便进行更好和更有效的分析,因此需要 ETL 管道。在这篇文章中解释的理论经验法则,加上由于数据不一致而导致的较小(或较大)的调整,可以产生非常干净和有用的数据仓库,这对公司来说有很大的价值。数据的不一致性可能相当大,因为其中大多数是人为错误造成的;然而,尽管人们对他们所犯的错误很有创造力,但是在做 ETL 时所面临的问题类型是很常见的。
每个 ETL 管道都要经历三个主要步骤:
- 数据分析:彻底分析 AS IS,目的是理解需要应用的转换。
- 模型定义:定义好表格以及表格之间的关系。
- ETL 实现:模型的实际实现,从数据源获取数据,产生设计的数据模型。
数据分析
这一步的重要性是双重的:
- 业务需求:在业务单元的指导下,了解正在实施的数据仓库需要从数据源的海洋中恢复的信息
数据仓库可以基于放在一起的许多不同的数据源,也可以只基于一个数据源,但只包含它所包含的表的子集。业务需求可能有两种情况:一种情况是他们确切地知道他们随后将使用数据仓库做什么样的分析,另一种情况是他们没有非常具体的想法。无论哪种方式,对于这一步,任务是理解哪些表将用于设计数据模型,更具体地说,这些表的哪些属性是有用的。黄金法则是设计一个满足必要条件的 DWH,如果它们存在的话,为这些必要条件将来可能的扩展留出空间。如果没有定义特定的必要条件,一个解决方案可以是确定对所讨论的数据进行分析的最流行的场景,然后为这些场景准备数据。不过,后一种情况非常罕见,因为一家公司几乎不会投资于不能带来中短期收入的项目。
- 数据质量:了解将要使用的数据源的当前状态
一旦确定了表,就该深入分析了:分析这些表及其属性。这实际上意味着考虑每个表的属性。可能有超过 150 个属性的表,但不是所有的属性都有用,也不是所有的属性都填充了值。首先要做的检查是寻找 缺失值 以及有多少缺失数据。一个 90–95%为空的属性很难用于分析或任何报表可视化,因此可以丢弃。对于多年的数据收集,表 中可能存在 不一致。数据不一致的另一个来源可能是来自不止一个数据源的同一个表(是的,这不是一个好的做法,但是现实世界是一个扭曲、复杂的地方)。对于这类问题,重要的是理解不一致背后的逻辑,看看是否可以修补。解决方案取决于分析:对于 DWH,如果旧数据不再相关,则可以丢弃旧数据,或者如果可能,可以应用变换来获得数据的一致性。数据质量需要考虑的另一个方面是如何让许多不同的来源相互交流,并在汇总时获得一致的结果。
在这一步结束时,由于数据清理和业务需求,当您开始处理大量数据时,您最终会得到一个池。
模型定义
模型定义可以归结为划分维度和事实表中的表,以及设置这些表之间的关系。
- 尺寸:当谈到尺寸替代时,要考虑的是它们是否是 缓变尺寸(SCD) ,选择最适合自己需求的 SCD 类型。2 型 SCD 是最常见的。
- 事实:一个关键的方面是已经 实现了 KPI用于进一步的分析,在最低的粒度级别,为任何种类的聚合留下了空间。可视化工具可能会限制您的数据转换可能性,或者使其变得非常困难,因此在 DWH 实施级别推动这种计算会使其变得更加容易,并且简化了未来可视化分析的实施。
- 关系:这两个类别的区别非常简单,但是设置 关系 可能会变得棘手,其中一个主要问题是当有更多的事实表出现时,这种情况会经常发生,并且这些事实表还需要与其他维度进行对话。基本规则是避免两个事实表之间的关系,始终坚持星型模式,这可能导致数据仓库中有多个星型模式。
- 命名约定:选择一个命名约定,并坚持下去。
- 暂存区:考虑为你的源数据表做一个复制层。
- 索引和分区:为了提高查询效率,根据正在构建的表的大小,如果必要的话,可以考虑并实现分区。此外,选择合适的索引也会对查询性能产生很大的影响。
- 技术属性:虽然添加和维护这些属性可能会很麻烦,但是跟踪诸如记录插入的时间戳、更新或导致更新的原因等信息在将来会很有帮助。
- 更新频率:根据分析的必要性,DWH 更新的时间安排可以从每天到一周几天不等。更新所需的时间会对此产生影响,因此在安排更新时需要考虑到这一点。
- 可扩展性:使模型易于扩展,适应变化。一直都是。
ETL 实现
最后一块拼图:实际实现。如果前两步做得很彻底,这一步会很容易,你会面临一些在前面的分析步骤中可能错过的惊喜。
用于实现 ETL 的工具将对实现设计模型的工程师产生最大的影响,而不是最终产品。现在有很多工具可以完成这项工作,但是 ETL 实现软件的选择很大程度上取决于许多不同的因素,比如公司使用的其他软件、*台和编程语言,项目的预算等等。
不管使用什么工具来构建管道,最重要的步骤是测试。当一切都实现后,通过进行 测试 来检查整个过程的正确性。需要检查每个表,并注意每个表的所有属性,以便最终结果是正确的,并与初始要求一致。制定一个详尽的测试用例计划(插入、更新或记录取消是最基本的)可能看起来令人望而生畏,但这是确保模型有效性的最佳方式。
谨记在心
如果你仔细想想,数据仓库的设计和开发是一个相当机械的过程。业务人员的参与推动了分析,而分析推动了流程的其余部分。模型的设计和实现是需要评估和实现的事情的清单。一个设计良好的模型可以使未来的数据分析和仪表板开发变得非常简单。
数据争论基础——为什么 Python 中的 Regex 前面有字母 r?
原文:https://towardsdatascience.com/data-wrangling-basics-why-regex-in-python-preceded-by-the-letter-r-a9fa93ab7dad?source=collection_archive---------35-----------------------
解释 Python 中正则表达式的工作原理
克里斯·迪诺托在 Unsplash 上拍摄的照片
用 Python 语言写正则表达式(regex)时,我们总是以 字母 r 开头。在本教程中,我们将通过回答以下问题来理解使用它的原因:
- 转义序列是什么?
- Python 解释器如何解释有或没有 字母 r 的转义序列?
- Python 语言中的正则表达式是如何工作的?
- 正则表达式中使用 字母 r 的重要性
1.转义序列是什么?
转义序列是在文本定义中使用时不代表自身的字符集。它被翻译成一些其他字符或字符集,否则很难在编程语言中呈现。例如,在 Python 语言中,字符集\n 表示新行,而\t 表示制表符。字符集\n 和\t 都是转义序列。
Python 解释器理解的标准转义序列列表及其相关含义如下:
2.Python 解释器如何解释有或没有字母 r 的转义序列?
为了理解它对转义序列的影响,让我们看一下下面的例子:
**#### Sample Text Definition**
text_1 = "My name is Ujjwal Dalmia.\nI love learning and teaching the Python language"
print(text_1)**#### Sample Output**
My name is Ujjwal Dalmia.
I love learning and teaching the Python language**#### Sample Text Definition**
text_2 = "My name is Ujjwal Dalmia.\sI love learning and teaching the Python language"
print(text_2)**#### Sample Output**
My name is Ujjwal Dalmia.\sI love learning and teaching the Python language
在上面的 text_1 中,示例使用了 \n 字符集,而 text_2 使用了 \s 。从第一节分享的转义序列表中,我们可以看到 \n 是 Python 语言中标准转义序列集的一部分,而 \s 不是。因此,当我们打印这两个变量时,转义序列 \n 被 Python 解释器解释为新的行字符,而 \s 保持原样。请注意,text_1 和 text_2 的定义不包括字母 r 。
让我们更进一步,在文本定义中包含了字母 r*。*
***#### Sample Text Definition (with letter "r")**
text_1 = r"My name is Ujjwal Dalmia.\nI love learning and teaching the Python language"
print(text_1)**#### Sample Output**
My name is Ujjwal Dalmia.\nI love learning and teaching the Python language**#### Sample Text Definition (with letter "r")**
text_2 = r"My name is Ujjwal Dalmia.\sI love learning and teaching the Python language"
print(text_2)**#### Sample Output**
My name is Ujjwal Dalmia.\sI love learning and teaching the Python language*
*包含字母 r 对 text_2 没有影响,因为 \s 不是 Python 语言中标准转义序列集的一部分。令人惊讶的是,对于 text_1 *,Python 解释器并没有将 \n 转换成新的行字符。这是因为字母 r 的出现将文本转换成了一个原始字符串。简单来说,字母 r 指示 Python 解释器保持转义序列不变。
3.)正则表达式在 Python 语言中是如何工作的?
为了理解正则表达式在 Python 语言中是如何工作的,我们将使用 sub() 函数( re Python 包),该函数基于正则表达式驱动的模式匹配*,用新文本替换旧文本**的一部分。让我们用一个例子来理解这一点:*
***#### Importing the re package**
import re**#### Using the sub function**
re.sub("\ts","s", "\tsing")**#### Sample Output**
'sing'*
在本例中,我们试图用独立的 字母 s 替换前面带有制表符的字母 s* 。从输出中可以看出,文本***\青*** 转换为 唱 。让我们参考下面的流程图来理解sub()函数 如何产生想要的结果。在流程图中,我们将 到 称为 正则表达式,字母 s 称为新文本,和\青 称为旧文本。*
使用标准转义序列的替换(图片由用户提供)
说明
在前面的例子中,我们使用了字符集 \t, ,这是 Python 语言中标准转义列表的一部分。因此,在第一步中,Python 解释器在正则表达式文本和旧文本中都用 标签 替换了转义序列。由于正则表达式模式与上一步中的输入文本相匹配,所以发生了替换。
在下一个例子中,我们将使用一个不同的字符集, \s,,它不是 Python 语言中标准转义列表的一部分。
***#### Importing the re package**
import re**#### Using the sub function(this time with a non-standard escape sequence)**
re.sub("\ss","s", "\ssing")**#### Sample Output**
"\ssing"*
在本例中,我们试图用独立的字母 s* 来替换前面带有\s 的字母 s 的任何实例。显然,输入文本没有变化,输出仍然与旧文本相同。同样,在流程图中,我们将 \ss 称为正则表达式, s 称为新文本,和*\ ss称为旧文本。让我们从下面的流程图中理解这种行为背后的原因:
使用非标准转义序列替换(图片由作者提供)
说明
在步骤 1 中,由于\s 是而不是标准的转义序列,Python 解释器既没有修改正则表达式也没有修改旧文本,而是让它们保持原样。在第 2 步中,由于\s 是一个代表空格的元字符,它得到从\ss 转换为 空格 s 的*。因为在旧文本中, 空格 s 不存在,没有正匹配,因此旧文本保持不变。***
从这一部分我们可以得出两个结论:
旧文本和新文本的转义序列评估仅由 Python 解释器完成。对于 Python 和 regex 解释器的正则表达式。因此,对于新旧文本,步骤 1 的结果是它们的最终版本,对于 regex,是步骤 2。
在文本和正则表达式模式只包含标准转义序列(Python 语言的一部分)的场景中,我们得到了想要的结果。然而,当有额外的元字符时,结果可能不符合预期。
4.)在正则表达式中使用字母 r 的重要性
从上一节的第二个例子中,我们看到正则表达式没有产生预期的结果。为了找到正确的解决办法,让我们倒推。
自下而上的解决方案(图片由作者提供)
说明
*为了用 **字母 s ,*替换旧文本中的 \ss ,我们希望步骤 3 中的正则表达式模式匹配我们想要替换的文本。
为了实现这一点,我们需要正则表达式模式在第二步结束时变成 \ss 。当正则表达式解释器遇到这种模式时,它会将元字符双反斜杠转换为单反斜杠,步骤 2 的输出将是 \ss。
最后,为了确保步骤 2 中的正则表达式是 \ss ,我们在步骤 1 中传递 \\ss 。这是因为双反斜杠是 Python 语言的标准转义序列,根据第 1 节*、中的表格,Python 解释器会将双反斜杠转换为单反斜杠**。为了获得作为步骤 1 的输出的 \ss ,我们提供 \\ss 作为我们的第一个正则表达式。Python 解释器将把 \\ss 文本模式转换成 \ss 。*
因此,上述问题的解决方案代码如下:
***#### Importing the re package**
import re**#### Using the sub function with the modified regex**
re.sub("\\\\ss","s", "\ssing")**#### Sample output**
'sing'*
我们现在有了问题的解决方案,但是剩下的问题是,我们在哪里使用了字母 r ?前面讨论中得出的正则表达式是一个候选解决方案。在简单的正则表达式需求中,可以使用上述方法,但是考虑一个场景,其中正则表达式规定使用多个元字符和 标准转义序列。这需要我们:
- 首先区分标准和非标准转义序列
- 然后,每当我们遇到转义序列或元字符时,适当地放置正确数量的反斜杠。
在这种麻烦的情况下,采用以下方法会有所帮助:
用字母 r 替换多个转义字符(图片由作者提供)
我们在这里所做的唯一更改是将四个反斜杠替换为两个前面的字母 r 。这将确保在步骤 1 中,Python 解释器将正则表达式视为原始字符串,并保持不变。将正则表达式转换为原始字符串将确保:**
- 我们不用担心记住 Python 标准转义序列的列表。
- 对于标准转义序列或任何元字符的存在,我们不必担心反斜线的正确数量。
综上所述,我们最终最合适的解决方案如下:
****#### Importing the re package**
import re**#### Using the sub function with the modified regex**
re.sub(**r**"\\ss","s", "\ssing")**#### Sample Output**
'sing'**
结束语
每当编写下一个正则表达式时,请注意这个 字母 r 。我希望这篇教程能让你更好地理解正则表达式的工作原理。
快乐学习!!!!
初学者的数据争论 Python 语言的一个独特特性
原文:https://towardsdatascience.com/data-wrangling-for-beginners-a-unique-feature-of-python-language-53bd9f1cd166?source=collection_archive---------50-----------------------
在循环中使用 If-Else 条件
在 Unsplash 上由 Hitesh Choudhary 拍摄的照片
我们大多数人都在这样或那样的编程语言中使用过 if-else 条件块。Python 更进一步,支持在循环结构中使用 else 条件块。在这个**,**教程中,我们将看到在 while 和 else 循环结构中使用 else 条件块。
先决条件
请注意,理解 Python 中的循环和条件是本教程的先决条件。如果你是 Python 语言的新手,并且想在你的系统上设置它,请阅读本教程。
让我们开始吧
1.在 while 循环中使用 else 条件
在我们开始使用 else 条件块 之前,让我们快速回顾一下 while 循环。在下面的例子中,我们将模拟一个登录页面场景,其中用户有有限的输入正确密码的尝试次数。
**### Syntax**
while condition:
action**### Example** trial = 1
while trial <= 3:
pwd = input("please enter the password: ")
if pwd == "abcd":
print("Valid Password. Login Successful")
break
else:
trial += 1**### Execution**
please enter the password: 123
please enter the password: abd
please enter the password: asd1### **Output
Given the user enters incorrect passwords, the code execution stops without any output**
- 我们期望用户在三次尝试中输入有效的密码()ABCD)。
- if-else 构造验证密码**,while 关键字跟踪用户尝试的次数**。
- 如果密码有效,代码将打印成功消息。如果输入的密码不正确,代码会将计数器加 1。
- 输入正确的密码后,程序会打印成功消息并终止循环,但是如果用户用完了尝试次数,代码会在不打印任何失败消息的情况下终止。这就是别的 条件可以派上用场的地方。让我们用一个例子来理解这一点:
**### Syntax**
while condition:
action_1
else:
action_2
--------------------------------------------------------------------**### Example 1 - Else Condition Executes** trial = 1
**while trial <= 3:**
pwd = input("please enter the password: ")
if pwd == "abcd":
print("Valid Password. Login Successful")
break
else:
trial += 1
**else:** print("Invalid password entered 3 times. Login Failed")**### Execution (while loop doesn't encounter the break statement)**
please enter the password: 123
please enter the password: abc
please enter the password: abc1### **Output (because condition after while keyword failed)** Invalid password entered 3 times. Login Failed
--------------------------------------------------------------------**### Example 2- Else Condition Doesn't Executes** trial = 1
**while trial <= 3:**
pwd = input("please enter the password: ")
if pwd == "abcd":
print("Valid Password. Login Successful")
break
else:
trial += 1
**else:**
print("Invalid password entered 3 times. Login Failed")**### Execution (while loop encounters the break statement)**
please enter the password: 123
please enter the password: **abcd**### **Output** Valid Password. Login Successful
- 只有当 break 语句没有终止循环时,while 循环后出现的 else 块才会执行。
- 在示例 1 中,用户未能在允许的尝试次数内输入正确的密码。在这种情况下,while 循环没有遇到 break 语句,而 Python 执行了 else 构造中的代码。
- 在示例 2 中,while 循环遇到了一个 break 语句(在第二次试验中打印成功消息之后),else 构造中的代码块没有被执行。
2.将 else 与 for 循环一起使用
与 while 循环类似, else 构造也可以与 for 循环一起使用。下面的代码块演示了同样的情况:
**### Syntax**
for variable in iterable:
action_1
else:
action_2**### Example
for i in range(3):**
pwd = input("please enter the password: ")
if pwd == "abcd":
print("Valid Password. Login Successful")
break
**else:**
print("Invalid password entered three times. Login Failed")**### Execution**
please enter the password: 123
please enter the password: abc
please enter the password: abc1### **Output** Invalid password entered three times. Login Failed
- 与 while 循环部分的例子类似,程序希望用户在允许的三次尝试的限制内输入有效的密码。
- 给定执行场景,由于 for 循环没有遇到 break 语句,程序执行 else 构造中的代码块并打印失败消息。
结束语
在 Python 语言中,你认为我们还能在哪里使用 else 条件?谷歌出来,并通过评论与读者分享。
如果这个故事对你有帮助,请不要忘记鼓掌。
快乐学习!!!!
数据争论解决方案—切片数据帧时动态创建变量
原文:https://towardsdatascience.com/data-wrangling-solutions-dynamically-creating-variables-when-slicing-dataframes-fc5613c46831?source=collection_archive---------34-----------------------
让 Python 变得简单
布莱克·韦兰在 Unsplash 上拍摄的照片
在从事数据科学项目时,我们花了 70%以上的时间来调整数据以满足我们的需求。在管理数据时,我们会遇到许多在像 pandas 这样的标准库中没有现成解决方案的情况。
一个这样的场景是当我们不得不从一个数据帧中创建多个数据帧。当我们有一个分类变量时,我们会遇到这种情况,我们希望根据这个变量的不同值来分割数据帧。这种情况的直观表示如下:
示例场景(图片由作者提供)
鉴于上述情况,可以建议手动分割数据帧。是的,这是一个可能的解决方案,但是只有当变量中的类别数量很少时。当分类值的数量达到数十或数百时,问题变得具有挑战性。在 Python 中,我们没有任何现成的函数来解决这个问题。因此,我们将提供一个使用 Python 字典的变通解决方案。该字典中的键将是变量的不同类别。字典的值组件将是数据帧切片本身。
实施此解决方案的逐步方法详述如下:
假设和建议
动手是掌握编程的关键。我们建议您在完成教程的过程中继续实现这些代码。样本数据和关联的木星笔记本在的文件夹场景 _1 中这个 GitHub 链接的中。
如果你是 GitHub 新手,从 这个教程 学习它的基础知识。此外,要在您的系统上设置 Python 环境并学习 Anaconda 发行版的基础知识,请参考本教程。
****本教程假设读者至少具备使用 Python 和相关包(如 Pandas 和 Numpy)的中级知识。以下是本教程中使用的 Python 概念和 pandas 函数/方法的列表:
熊猫功能
- 阅读 _csv
- 分组依据
Python 概念
- 元组
- 字典
解决办法
步骤 1 —准备好数据
在本教程中,我们将使用著名的 cars.csv 数据集。数据集包含大约 400 种车型的里程、马力、重量等细节。我们的目标是根据变量 year 将这个数据帧分割成多个数据帧。这个数据集和样本数据快照的字典如下:
- 型号—汽车型号的名称
- 实际 MPG——汽车型号的里程
- 气缸——汽车模型中气缸的数量
- 马力——汽车模型的功率
- 重量——汽车模型的重量
- 年份—制造年份
- 原产地——制造国
样本数据快照(图片由作者提供)
步骤 2——在 Python 中导入 pandas 包和数据集
一旦有了可用的数据,下一步就是将其导入到 Python 环境中。
***#### Sample Code
#### Importing Pandas** import pandas as pd**#### Importing Data File - Change the Windows Folder Location** imp_data = pd.read_csv("C:\\Ujjwal\\Analytics\\Git\\Data_Wrangling_Tips_Tricks\\Scenario_2\\cars.csv")*
我们使用 Pandas 的 read_csv 函数来读取 Python 中的数据。
步骤 3——创建 groupby 对象
一旦我们读取了数据,将 groupby 方法应用于数据帧。使用与要用于分割数据帧的参数相同的列。
***#### Create a groupby object**
groupby_df = imp_data.groupby("Year")*
默认情况下,Pandas 中的 groupby 对象有两个主要组件:****
- 组名— 这些是用于分组的分类变量的唯一值
- 分组数据— 这是对应于每个组名的数据帧本身的切片
步骤 4 —将 groupby 对象转换为元组
通过将 groupby 对象转换成一个元组,我们打算将分类值和它们相关的数据帧结合起来。为此,将 groupby 对象作为参数传递给 Python 函数 tuple 。
***#### Sample Code**
tuple_groupby_df = tuple(groupby_df)**#### Checking the values of a tuple object created above** print(tuple_groupby_df[0])*
样本元组输出(图片由作者提供)
注意 tuple 对象的两个组件。第一个值 70 是制造年份,第二个值是切片数据帧本身。
步骤 5—将元组转换成字典对象
最后,我们将使用 python 函数 dict 将 tuple 对象转换成一个字典。
***#### Converting the tuple object to a dictionary** dictionary_tuple_groupby_df = dict(tuple_groupby_df)*
上一步中创建的字典是我们在教程中提到的变通解决方案。该解决方案与手动创建实际变量的唯一区别在于变量名。为了使用切片数据,而不是使用变量名,我们可以使用带有正确键值的字典。让我们了解如何:****
***#### Manual creation of variables (slicing cars data for year 70)**
cars_70 = imp_data[imp_data["year"] == 70]**#### Checking the shape of the sliced variable**
cars_70.shape**#### Output** (29, 7)**#### Checking the shape using the dictionary we have created**
dictionary_tuple_groupby_df[70].shape**#### Output**
(29, 7)*
在上面的代码中,当使用 shape 属性时,我们使用了 dictionary 对象,而不是使用特定的变量名。
结束语
您是否知道,通过掌握数据争论技巧,您可以将模型构建生命周期缩短 20%以上?我希望上面介绍的解决方案是有帮助的。
敬请关注未来教程中更多的数据争论解决方案*。***
快乐学习!!!!
数据争论解决方案—处理日期—第 1 部分
原文:https://towardsdatascience.com/data-wrangling-solutions-working-with-dates-part-1-1cb2c33b2ef5?source=collection_archive---------19-----------------------
读取包含日期列的文件。
Elena Mozhvilo 在 Unsplash 上的照片
这里讨论的主题是每个有抱负的数据科学家/分析师在开始数据科学之旅时都会遇到的挑战。这个问题的挑战在于,你会在这样或那样的场景中不断遇到它,而每次你这样做的时候,你都会搜索以找到解决方案。在本教程和接下来的几个教程中,我们将学习如何使用日期数据类型。
假设和建议
动手是掌握编程的关键。我们建议您在完成教程的过程中继续实现这些代码。样本数据和关联的木星笔记本在场景 _5 文件夹的这个 GitHub 链接 中。
如果你是 GitHub 新手,想学习它,请通过 这篇 教程。要在您的系统上设置一个新的 Python 环境,请阅读本 教程中的 。
以下是本教程中使用的 Python 概念和 pandas 函数/方法的列表:
熊猫功能
- 阅读 _csv
挑战和解决方案
下面列出了读取日期列的各种挑战及其相关解决方案。但是,在开始之前,让我们了解一下我们用于此目的的数据集。
了解数据集
我们创建了一个虚拟数据集,它包含一个数据字段的多个版本, release_date 。这个虚拟数据集的数据字典如下:
- 发布日期 —删除了第一个日期值的实际日期栏。
- release_date_int —包含日期信息但为整数格式的另一列,例如,日期2020–02–12 以 YYYYMMDD 格式表示为 20200212。
- release_date_text —包含文本格式的**日期的列,**和 # 作为分隔符。格式代码为 YYYY#DD#MM 。
- 年 —仅包含日期数据的年值的列。
- 月 —仅包含日期数据的月值的列。
- 日 —包含日信息的列
数据集的快照共享如下:
样本数据快照(图片由作者提供)
挑战 1— 读取包含日期列的 Excel/CSV 文件
在这个场景中,我们试图读取数据集,其中焦点在 release_date 列上。下面的示例代码演示了 read_csv 如何以普通形式读取日期列。
**#### Sample Code
#### Importing Pandas** import pandas as pd**#### Importing Data File - Change the Windows Folder Location** imp_data = pd.read_csv("C:\\Ujjwal\\Analytics\\Git\\Scenario_5\\Date_Dataset.csv")**#### Checking the dataset information** imp_data.info()**#### Sample output**<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3000 entries, 0 to 2999
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 release_date 2999 non-null object
1 release_date_int 3000 non-null int64
2 release_date_text 3000 non-null object
3 year 3000 non-null int64
4 month 3000 non-null int64
5 day 3000 non-null int64
dtypes: int64(4), object(2)
memory usage: 140.8+ KB
观察 info 方法的输出。熊猫将 release_date 列读取为对象数据类型。为了将其作为日期对象读取, read_csv 函数提供了使用附加参数的选项。有关解决方案,请参考下面修改后的代码
**#### Sample Code
#### Importing Pandas** import pandas as pd**#### Importing Data File - Change the Windows Folder Location** imp_data = pd.read_csv("C:\\Ujjwal\\Analytics\\Git\\Scenario_5\\Date_Dataset.csv", **parse_dates = ["release_date"]**)**#### Checking the dataset information** imp_data.info()**#### Sample output**<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3000 entries, 0 to 2999
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
**0 release_date 2999 non-null datetime64[ns]**
1 release_date_int 3000 non-null int64
2 release_date_text 3000 non-null object
3 year 3000 non-null int64
4 month 3000 non-null int64
5 day 3000 non-null int64
dtypes: datetime64[ns](1), int64(4), object(1)
memory usage: 140.8+ KB
说明
- release_date 列现在作为日期-时间对象可用。
- parse_dates —该参数希望我们将所有日期列名作为一个列表传递。如果这些列中的日期值正确,它会将这些列解析为日期-时间数据类型。
挑战 2—读取包含年、月和日列的 Excel/CSV 文件
在这个场景中,我们将尝试将年、月和日这三个单独的列读入一个日期列。从 read_csv 函数的普通用法中,我们知道 read_csv 将三列作为整数读取。在下面修改过的代码中,我们再次使用了 parse_dates 参数来获得想要的结果。
**#### Sample Code
#### Importing Pandas** import pandas as pd**#### Importing Data File - Combining 3 columns into a single date field** imp_data = pd.read_csv("C:\\Ujjwal\\Analytics\\Git\\Scenario_5\\Date_Dataset.csv", **parse_dates = ["release_date", ["year","month","day"]]**)**#### Checking the dataset information** imp_data.info()**#### Sample output**<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3000 entries, 0 to 2999
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 year_month_day 3000 non-null datetime64[ns]
1 release_date 2999 non-null datetime64[ns]
2 release_date_int 3000 non-null int64
3 release_date_text 3000 non-null object
dtypes: datetime64[ns](2), int64(1), object(1)
memory usage: 93.9+ KB
说明
- 注意新的datetime 64【ns】列year _ month _ day的创建。该函数将 release_date 列作为日期-时间对象读取。
- parse_dates —在上面分享的代码中,除了传递 release_date 列之外,我们还传递了另一列年、月和日列名(日期数据的单个组件)。函数 parse_dates 已将该列表转换为日期列。
要点—除了传递列名,我们还可以使用列号传递给 parse_dates 参数。我们可以使用所有三个日期组件(年、月和日),也可以只使用两个组件(年和月)。它不接受任何其他参数组合。列名可以是任何名称,不必是日期组件的名称。最后,列表中列的顺序应该是年、月&日期,否则列将作为对象数据类型可用。
挑战 3—读取包含年、月和日列的 Excel/CSV 文件并添加自定义列名
在上一个挑战中,我们成功地将年、月和日列解析为一个日期列,但无法自定义其名称。对上面的代码稍加修改就可以帮助我们实现这一点。
**#### Sample Code
#### Importing Pandas** import pandas as pd**#### Importing Data File - Combining 3 columns into a single date field** imp_data = pd.read_csv("C:\\Ujjwal\\Analytics\\Git\\Scenario_5\\Date_Dataset.csv", **parse_dates = {"combined_date":["year","month","day"]}**)**#### Checking the dataset information** imp_data.info()**#### Sample output**<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3000 entries, 0 to 2999
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 combined_date 3000 non-null datetime64[ns]
1 release_date 2999 non-null object
2 release_date_int 3000 non-null int64
3 release_date_text 3000 non-null object
dtypes: datetime64[ns](1), int64(1), object(2)
memory usage: 93.9+ KB
说明
- 注意新的datetime 64【ns】列combined _ date的创建。
- parse_dates —这一次,我们没有将年、月和日这三列作为列表的列表来传递,而是将这些列的列表作为一个字典。字典的关键字是新的列名,值组件是要组合的列的列表。
结束语
挑战三的解决方案的输出中,少了一小块。确定它及其相关解决方案,并在下方进行评论。答案就在通过 GitHub 资源库分享的 Jupyter 笔记本里。
在本教程中,我们学习了如何读取包含日期信息的列。在下一个教程中,我们将学习如何将非日期时间格式的日期数据转换为日期时间格式。
快乐学习!!!!
数据争论解决方案—处理日期—第 2 部分
原文:https://towardsdatascience.com/data-wrangling-solutions-working-with-dates-part-2-58a4393c8218?source=collection_archive---------26-----------------------
将列从非日期数据类型转换为日期数据类型
斯坦纳·恩格兰在 Unsplash 上拍摄的照片
在 上一期教程 中,我们看了读取包含日期时间变量的数据文件的各种方法。在本教程中,我们将讨论如何处理现有数据帧 的列,该数据帧包含日期-时间数据,但仍被 Python 作为对象数据类型读取。
假设和建议
动手是掌握编程的关键。我们建议您在完成教程的过程中继续实现这些代码。样本数据和关联的木星笔记本在的文件夹Scenario _ 6this GitHub link****中。
如果你是 GitHub 新手,想学习它,请通过 这篇 教程。要在您的系统上建立一个新的 Python 环境,请阅读本教程。
以下是本教程中使用的 Python 概念和 pandas 函数/方法的列表:
熊猫功能
- 阅读 _csv
- 截止日期时间
挑战和解决方案
了解数据集
正如上一篇教程中所解释的,我们已经创建了一个虚拟数据集,它包含一个数据字段的多个版本, release_date 。这个虚拟数据集的数据字典如下:
- 发布日期 —删除了第一个日期值的实际日期栏。
- release_date_int —包含日期信息但为整数格式的另一列,例如,日期2020–02–12 以 YYYYMMDD 格式表示为 20200212。
- release_date_text —包含文本格式的**日期的列,**和 # 作为分隔符。格式代码为 YYYY#DD#MM 。
- 年 —仅包含日期数据的年值的列。
- 月 —仅包含日期数据的月值的列。
- 日 —包含日信息的列
数据集的快照共享如下:
样本数据快照(图片由作者提供)
在下面解释的所有场景中,我们假设这个虚拟数据文件是使用普通的 read_csv 实现在 Python 中读取的。读取伪数据和每列信息的代码如下:
**#### Sample Code
#### Importing Pandas** import pandas as pd**#### Importing Data File - Change the Windows Folder Location** imp_data = pd.read_csv("C:\\Ujjwal\\Analytics\\Git\\Scenario_6\\Date_Dataset.csv")**#### Checking the dataset information** imp_data.info()**#### Sample output**<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3000 entries, 0 to 2999
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 release_date 2999 non-null object
1 release_date_int 3000 non-null int64
2 release_date_text 3000 non-null object
3 year 3000 non-null int64
4 month 3000 non-null int64
5 day 3000 non-null int64
dtypes: int64(4), object(2)
memory usage: 140.8+ KB
挑战 1 — 将包含文本格式的日期时间数据的列转换为日期时间对象
在这个场景中,我们试图将release _ date _ text列从对象数据类型转换为日期-时间数据类型。演示这一点的示例代码如下:
**#### Sample Code
#### Datatype Conversion (Assuming the data is already read into a dataframe)** imp_data["release_date_text_converted"] = **pd.to_datetime(imp_data["release_date_text"], format="%Y#%d#%m")****#### Checking the dataset information** imp_data.info()**#### Sample output**<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3000 entries, 0 to 2999
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 release_date 2999 non-null object
1 release_date_int 3000 non-null int64
2 release_date_text 3000 non-null object
3 year 3000 non-null int64
4 month 3000 non-null int64
5 day 3000 non-null int64
**6 release_date_text_converted 3000 non-null datetime64[ns]**
dtypes: datetime64[ns](1), int64(4), object(2)
memory usage: 164.2+ KB
说明
- 新列release _ date _ text _ converted现在可以作为日期-时间对象使用。
- to_datetime —该函数期望第一个参数是我们要将转换为日期-时间对象的列(熊猫系列)。作为的第二个参数**,我们必须向提供数据当前存在的格式。**
在我们的例子中,数据的格式是***【YYYY # DD # MM***。在这种格式中,我们将年成分表示为 %Y *,*月成分表示为 %m ,,日期成分表示为 %d 。
挑战 2 — 将包含整数形式的日期的列转换为日期时间对象
这个场景与前一个略有不同。这里,源列不是文本格式的,而是整数格式的。实现该解决方案的代码如下:
**#### Sample Code
#### Datatype Conversion (Assuming the data is already read into a dataframe)** imp_data["release_date_int_converted"] = **pd.to_datetime(imp_data["release_date_int"], format="%Y%m%d")****#### Checking the dataset information** imp_data.info()**#### Sample output**<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3000 entries, 0 to 2999
Data columns (total 8 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 release_date 2999 non-null object
1 release_date_int 3000 non-null int64
2 release_date_text 3000 non-null object
3 year 3000 non-null int64
4 month 3000 non-null int64
5 day 3000 non-null int64
6 release_date_text_converted 3000 non-null datetime64[ns]
**7 release_date_int_converted 3000 non-null datetime64[ns]**
dtypes: datetime64[ns](2), int64(4), object(2)
memory usage: 187.6+ KB
说明
- 新列release _ date _ int _ converted现在可以作为日期时间对象使用。
- to_datetime —除了对格式参数的输入之外,本解决方案中的代码保持不变。由于日期部分之间没有分隔符,我们使用的修订格式是 %Y%m%d 。
挑战 3 — 手动向数据帧添加一个具有固定日期值的新列
有时,情况需要我们创建一个新的日期列,其中包含一些固定值。对上面的代码稍加修改就可以帮助我们实现这一点。
***#### Sample Code
#### Datatype Conversion (Assuming the data is already read into a dataframe)** imp_data["new_constant_date_column"] = **pd.to_datetime("1985-17-03", format="%Y-%d-%m")****#### Checking the dataset information** imp_data.info()**#### Sample output**<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3000 entries, 0 to 2999
Data columns (total 9 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 release_date 2999 non-null object
1 release_date_int 3000 non-null int64
2 release_date_text 3000 non-null object
3 year 3000 non-null int64
4 month 3000 non-null int64
5 day 3000 non-null int64
6 release_date_text_converted 3000 non-null datetime64[ns]
7 release_date_int_converted 3000 non-null datetime64[ns]
**8 new_constant_date_column 3000 non-null datetime64[ns]**
dtypes: datetime64[ns](3), int64(4), object(2)
memory usage: 211.1+ KB*
示例输出(图片由作者提供)
说明
- 观察包含常量日期值的新列new _ constant _ date _ column*。*
- to_datetime —这一次,我们没有传递包含日期-时间对象的列,而是向函数传递了一个常量日期值。格式参数也相应调整。
结束语
根据我们在本教程中采用的方法,您能想出一个将三个日期列:年、月和日转换成一个日期列的解决方案吗?参考通过 GitHub 库共享的 Jupyter 笔记本,了解解决方案。
在本教程中,我们学习了如何将 dataframe 列从任何数据类型转换为日期时间对象。在下一个教程中,我们将讨论与日期-时间列相关的各种数据争论活动。
快乐学习!!!!
数据争论解决方案—处理日期—第 3 部分
原文:https://towardsdatascience.com/data-wrangling-solutions-working-with-dates-part-3-b8b5caccc4ed?source=collection_archive---------33-----------------------
从包含日期时间数据的列中提取信息。
在 Unsplash 上由 Waldemar Brandt 拍照
在上两个教程中,我们从 导入包含日期列的数据 到 将它们 从非日期时间数据类型转换为日期时间数据类型。在本教程中,我们将介绍一些在处理日期时间列时遇到的数据争论场景及其解决方案。
假设和建议
如果您想在遵循教程的同时实现代码,请使用示例数据和关联的 Jupiter 笔记本,它们位于 的 Scenario_7 文件夹这个 GitHub 链接 中。
要了解 GitHub,请通过 这篇 教程。 这个 教程将帮助你建立一个新的 Python 环境,如果它还没有建立的话。
以下是本教程中使用的 Python 概念和 pandas 函数/方法的列表:
熊猫功能
- 阅读 _csv
- 截止日期时间
- 日期偏移
- 日期存取器
挑战和解决方案
了解数据集
正如上一篇教程中所解释的,我们已经创建了一个虚拟数据集,它包含一个数据字段的多个版本, release_date 。这个虚拟数据集的数据字典如下:
- 发布日期 —删除了第一个日期值的实际日期栏。
- release_date_int —包含日期信息但为整数格式的另一列,例如,日期2020–02–12 以 YYYYMMDD 格式表示为 20200212。
- release_date_text —包含文本格式的**日期的列,**和 # 作为分隔符。格式代码为 YYYY#DD#MM 。
- 年 —仅包含日期数据的年值的列。
- 月 —仅包含日期数据的月值的列。
- 日 —包含日信息的列
原始数据集的快照共享如下:
样本数据快照(图片由作者提供)
在下面解释的所有场景中,我们都假设这个虚拟数据在 Python 环境中被成功读取或转换为 DateTime 变量。读取数据的示例视图如下:
Python 中读取的示例数据(图片由作者提供)
挑战 1 — 创建一个比现有列提前 n 天/月/年的新列。
这是我们在处理数据集时经常遇到的情况之一。为了实现这个目标,我们将使用 Pandas 的内置函数, DateOffset 。在下面的示例代码中,我们使用现有的日期列创建一个新列,其中的日期值提前 7 天:
**#### Sample Code
#### A view to existing columns** imp_data["release_date_text"].head()**#### Output** 0 2019-03-17
1 2004-08-06
2 2014-10-10
3 2012-03-09
4 2009-02-05**#### New column 7 days ahead** imp_data["release_date_text_7daysplus"] = **imp_data["release_date_text"] + pd.DateOffset(days=7)**
示例输出—提前日期(图片由作者提供)
说明
- 新列release _ date _ text _ 7 days plus是使用 DateOffset 函数创建的。
- 日期偏移 —该函数将日期值偏移 n 个周期 。 n 的值可以是任意整数,和周期可以是年、月、周、日和小时等等。根据偏移周期类型,我们应该使用相关的关键字作为参数(在我们的示例中,它是 days)。完整的关键词列表,参考这个 链接 。
挑战 2 — 提取日期列的各种组件
其中一个理想的场景是从日期中提取像工作日、星期几这样的信息。我们可以在 Pandas 中使用由 dt 表示的日期访问器来实现这一点。下面的示例代码将演示我们如何使用其中一个日期列提取工作日。
***#### Sample Code
#### A view to existing columns** imp_data["release_date_text"].head()**#### Output** 0 2019-03-17
1 2004-08-06
2 2014-10-10
3 2012-03-09
4 2009-02-05**#### Extracting Weekdays**
imp_data["Weekdays"] = **imp_data["release_date_int"].dt.dayofweek**
imp_data["Weekdays"].head(3)**#### Ouput**
0 6
1 4
2 4
Name: Weekdays, dtype: int64**#### Extracting year**
imp_data["year"] = imp_data["release_date_int"].dt.year
imp_data["year"].head(3)**#### Ouput**
0 2019
1 2004
2 2014
Name: year, dtype: int64*
说明
- 观察包含工作日和年份信息的新列。
- 日期访问器 —日期访问器(表示为 dt)提供了现成的方法,用户可以使用这些方法从日期时间对象中提取特定的组成部分。请注意,我们只能将日期时间访问器应用于 dataframe 系列(单列)。有关这些组件的完整列表,请参考此 链接 。
挑战 3—寻找日期差异或对两个不同的日期列使用逻辑运算
对于熊猫来说,这个任务就像增加或减少 2 列一样简单。让我们直接看下面的例子来理解:
***#### Sample Code
#### Finding difference between 2 dates**
imp_data["days_difference"] = **imp_data["release_date_text_7daysplus"] - imp_data["release_date_text"]**
imp_data["days_difference"].head()**#### Sample Ouptut** 0 7 days
1 7 days
2 7 days
3 7 days
4 7 days
Name: days_difference, dtype: timedelta64[ns]**#### Comparing Dates**
imp_data["Is_bigger"] = **imp_data["release_date_text_7daysplus"] > imp_data["release_date_text"]**
imp_data["Is_bigger"].head()**#### Sample Output** 0 True
1 True
2 True
3 True
4 True
Name: Is_bigger, dtype: bool*
请注意,在上述所有场景中,操作的输出是一个 series 对象,如果我们想进一步使用它,我们应该将它作为一个新列存储在 dataframe 中。
结束语
*我们现在以一个示例问题结束本教程。**利用我们在过去三个日期时间教程中学到的知识,您能想出一个解决方案来手动更正数据帧单元格中出现的错误日期吗?*答案参考通过 GitHub 资源库分享的 Jupyter 笔记本。
快乐学习!!!!
数据库索引反模式
原文:https://towardsdatascience.com/database-indexing-anti-patterns-dccb1b8ecef?source=collection_archive---------11-----------------------
由乌列尔 SC 在 Unsplash 上拍摄的照片
数据工程
数据库索引的设计和实现通常会出现什么问题
介绍
索引设计是使用数据库时最重要的事情之一。有效的索引设计会对数据库性能产生巨大的影响。设计良好的索引可以让你的数据库超级快速高效。设计糟糕的索引会让你的数据库很糟糕,很慢,会让你付出很大的代价。在本文中,我们将讨论一些新手犯的错误以及一些常见的索引设计反模式。考虑索引的方法是将它们视为指向原始表的表的部分、重新排列的副本。为什么是局部的,为什么是重新排列的?先来回答这两个问题。
在构建产品时,我们需要确保用户体验是最好的。为了让用户获得最佳体验,软件需要很快。想象一下,如果你的亚马逊或网飞页面每次更换过滤器都要花 5 秒钟。这不会给你作为买家注入太多的信心。
应用程序不仅仅需要有很大的写吞吐量;他们还需要非常快的读取吞吐量。在一系列数据访问模式中,读取吞吐量应该或多或少是一致的。我们原始表的设计和定义可能不足以处理这种数据访问模式。为了解决这个问题,我们在表中引入了索引、分区或者两者的组合。现在让我们只讨论索引。
在我们将数据存储到数据库中之后,我们还需要对数据进行重新排列,以便能够快速获取数据。
虽然您知道通过创建索引,您可以迎合不同的数据访问模式来加快应用程序的速度,但是如果您没有充分考虑应该设计索引以获得最佳效果的不同方面,您可能会最终陷入索引地狱。性能增强实际上会成为性能杀手和成本膨胀者。记住这一点,让我们看看在数据库中创建和维护索引时一些常见的反模式。
反模式
指数混沌
当您创建各种随机索引而没有检查哪些索引已经存在、哪些索引已经被使用等等时,就会发生这种情况。创建和维护索引是一件成本高昂的事情。每个新的索引都会给 SQL 优化器带来额外的负载,占用更多的空间,甚至会降低写入速度,而不一定会提高读取速度。
为了防止自己陷入这种混乱状态,你需要创建索引,记住一个简单的原则。创建尽可能少的索引来覆盖大多数查询。在创建索引之前,看看是否可以重新利用现有的索引来满足额外的查询。
索引的内部实现因数据库而异。因此,在修改索引之前,总是在 dev 中测试对覆盖索引的更改,以确保任何更改都不会影响该索引所覆盖的现有查询。
不可用的索引
由于与数据类型、排序规则、字符集等相关的一些特定于数据库的问题,一些数据库索引不可用或保持未使用状态。有时,您可以通过显式地强制优化器使用索引来使索引工作。
如果你不注意这些问题并解决它们,你的索引将永远不会被使用,即使你的查询被设计来使用它们。所有这些都给优化器和数据库服务器带来了压力,让它们不断更新索引。
https://www.mongodb.com/developer/article/schema-design-anti-pattern-unnecessary-indexes/
陈旧索引
任何一段代码都有保质期。它是不断变化的。查询随着业务需求的变化而变化。当查询发生变化时,一些最初为这些查询设计的索引现在可能完全不相关了。理想情况下,这些索引要么应该重新调整用途以满足不同的查询集,要么应该被删除。
然而,有时人们会将这些索引留在原处,要么是希望将来会用到它们,要么是忘记删除它们。这就是自动化陈旧索引删除过程非常重要的原因。优化器通过引用数据库服务器维护的统计信息来使用索引。统计数据可以指导我们找出一个索引是否被使用。如果不是,我们可以简单地编写一个存储过程来删除索引。
如果没有正确测试,从生产中删除索引可能会有问题。因此,消除这些索引的另一种方法是发送一封电子邮件或一个 Slack 通知,让您通过手动触发气流作业或类似的方式删除过时索引列表。
错误的索引类型
虽然这不是一个经常出现的问题,但是留心它是有好处的。一些数据库提供了各种类型的索引,您可以根据自己的读取访问模式创建这些索引。大多数关系数据库现在都支持全文索引。
现在,如果您没有执行全文搜索的用例,并且您的用例只需要正则表达式搜索,那么您最好拥有一个简单的索引。全文索引的开销要大得多,因为它们占用的空间要大得多,更新起来也要花更多的时间。
庞大的指数
拥有数十亿行和许多列的表上的巨大索引确实很难管理。它们也可能非常慢。这就是您可以使用分区这一美丽概念的地方——本质上是将表分成许多部分,并使用一种称为分区修剪的现象来查询您绝对、最肯定需要的分区。一旦删除了不需要的分区,表中就只剩下小块的索引,即更小的索引、更少的管理开销、更快的索引查找。在我不久前写的这篇文章中可以读到更多的相关内容。
结论
编写软件是一项协作工作,编写数据库模型、查询、管道和支持软件。开发数据库时的协作极其重要。数据库会很快成为瓶颈,即使对于性能最好的软件也是如此。有效地协作,遵循最佳实践,并留意上面列出的一些反模式,你会没事的。
如果你觉得我的文章有用,请订阅并查看我的文章🌲 Linktree 。你也可以考虑用我的推荐链接购买一个中级会员来支持我。干杯!
https://kovidrathee.medium.com/membership
数据库规范化
原文:https://towardsdatascience.com/database-normalization-8bba077d12db?source=collection_archive---------12-----------------------
规范化技术的概念性描述。
托拜厄斯·菲舍尔在 Unsplash 上的照片
“DATA”是每个软件应用的核心。因此,任何软件的成功和可用性都高度依赖于数据的组织方式。根据软件所处理的业务用例的类型,可以有多种方法来组织数据。例如,大多数事务性应用程序或 OLTP 应用程序使用 【规范化】 数据结构来存储数据。在讨论规范化的细节之前,让我们先了解一下 OLTP 的概念。
联机事务处理
OLTP 或在线事务处理是指对“事务”的支持和处理。想象你去网上书店购物。你选择这本书,把它放入你的购物车,结账,用你的信用卡或借记卡付款。你收到一张发票。这本书会以 PDF 格式发送到您的电子邮件中。这些行为被称为“交易”。应用程序的顺利运行取决于数据库存储是如何设计或建模来处理事务数据的。OLTP 应用无处不在。诸如网上银行、购物、销售点终端、机票预订等日常应用都涉及到在线交易处理。交易的主要特征如下:
- 交易频繁。例如,在网上购物商店的例子中,可能有多个客户订购多种产品,导致许多支付交易,其中许多交易同时发生。因此,数据变化非常频繁。有许多插入、更新、删除操作需要快速、频繁地执行
- 数据更改由多个用户执行
这种 OLTP 应用程序的数据库设计应该考虑事务的上述特征。这就是正常化概念的由来。这些概念最适合于以行和列的表格形式存储数据的关系数据库系统。
正常化
规范化是以一种高效的方式处理事务的方式来组织数据库中的数据的过程。有规则才能实现常态化。每个规则被称为“范式”。
为了理解不同的范式,让我们以一个学生数据为例。我们有几个学生注册了由一个或多个老师教授的一门或多门课程。此类数据的原始形式如下所示:
作者图片
第一范式(1NF): 以第一范式存储数据的基本原则是-
- 消除每个表格中重复的数据组。
- 为每组相关数据创建一个单独的表
- 标识表中的主键
在上面的例子中,我们不应该让课程在同一个表中重复。应该为学生和课程创建单独的表。
作者图片
第二范式(2NF): 表中的属性在功能上应该依赖于主键。不应该有冗余。在上面的例子中,每个学生都有多个课程值。从功能上讲,课程不依赖于学生,因此应如下所示:
作者图片
第三范式(3NF): 表中的属性应该“只”依赖于主键。不应该有相互依赖。在上面的例子中,教师房间依赖于教师,但不直接依赖于学生 Id。因此,应该有一个单独的表将这种依赖关系移出。
作者图片
标准化的总结可以表述为-
表的属性应该依赖于主键,依赖于整个键,除了键什么都不是。
请参考下面的文章,深入了解数据建模概念:
数据库复制说明 2
原文:https://towardsdatascience.com/database-replication-explained-10ff929bdf8a?source=collection_archive---------7-----------------------
第 2 部分—多领导者复制
介绍
在现代互联网时代,数据复制无处不在。从银行账户到脸书个人资料,再到你心爱的 Instagram 图片,人们认为重要的所有数据几乎肯定会在多台机器上复制,以确保数据的可用性和持久性。在本文中,我们将探讨一种最常见的复制策略,称为多领导者复制。
多主复制是一种基于单主策略的方法,用于提高数据库的可伸缩性和可用性。单个领导者方法的一个问题是,所有写入必须通过同一领导者(对于同一分区)。对于像 YouTube 这样的大规模服务,单一领导者意味着来自遥远地区(例如,印度和美国)的喜欢点击同一视频的客户必须与同一领导者交谈。为了避免长距离通信带来的延迟以及由此带来的不良用户体验,可以使用多领导者复制作为替代方案。
理论
下图描述了多主复制的数据流。为了解决上面提到的问题,将多个节点放在不同的数据中心,每个节点响应相邻的客户端。当接收到写请求时,处理领导者将同步或异步地将该请求转发给其他领导者。
图 1 —多领导者复制,按作者分类
与单领导者设置相比,多领导者复制提供了更好的可扩展性和容错能力。然而,人们已经发现了使用多领导复制的其他有趣的方法。例如,具有与远程服务器同步的本地数据库的应用程序可以被视为多领导者复制的极端场景,其中如果客户端离线进行更改,同步可能需要几天时间。
深潜
冲突解决
多领导者复制最突出的问题是冲突解决。虽然在单个领导者设置中也会出现冲突,但这种情况很少发生,因为裂脑和故障转移是可以检测和修复的。在多领导者设置中,会发生冲突,因为客户端可以向多个领导者发送并发写入请求。考虑以下情况:
图 2 —按并发性划分的冲突,按作者划分的数字
在这个场景中,有两个并发更新被发送到数据库。我们称它们为并发,因为两者都不知道对方,而且没有明确的顺序。系统无法知道哪个值实际上是最新的(假设时间是通用的。抱歉爱因斯坦!)因为没有两台电脑的时钟是完全同步的。我们能做的最好的事情是避免图 2 中灾难性的、永久的不一致状态。以下是一些有用的想法:
最后一次写入成功及其变体:
正如我提到的,对于并发写入,没有明确的顺序。如果我们可以人为地引入排序呢?例如,每次写入都有时间戳,系统会保留最新的时间戳。另一种方法是不使用时间戳,而是使用随机生成的 ID。系统通过选择具有较大 ID 的写入来解决冲突。
这个想法非常简单,乍一看,您可能会开始寻找极限情况。你是对的;即使是因果相关的请求,最后一次写入成功也会导致数据丢失。如果我们依赖服务器的本地时钟,一切都会失控,如图 2 所示。
图 3-LLW,按作者分类
图 3 显示,如果服务器的时钟有偏差,LLW 可以丢弃后续更新。有 NTP 等校准服务器时钟的方法,但任何通过互联网的校准都不是 100%准确的(也许有一天我们可以用量子纠缠解决这个问题,只是抛出一个想法)。
固定路由:
这是思考为什么单领导者复制没有排序问题的好时机。它是精确的,因为所有的更新都是由同一个领导者处理的,他隐式地给请求分配了顺序。也许同样的哲学可以用在这里。如果同一个记录上的所有写入都由同一个领导者使用粘性路由来处理,会怎么样?
图 4-固定路由,按作者分类
固定路由非常接*于单个领导者复制,因为来自不同区域的客户端必须与同一个领导者对话。但是,与单个领导者相比,它确实提供了更好的可用性,因为其他领导者可以在节点出现故障时介入(例如,使用一致散列来重新分配请求)。
自定义算法:
尽管我们在服务器端尽了最大努力,但如果不牺牲一些东西,冲突解决就无法完美解决。也许现在是我们扭转局面,请客户解决冲突的时候了。
想法很简单;服务器不会尝试解决冲突。当接收到并发写入时,服务器会保留这两个值。在读取时,所有冲突的值都被返回给客户端,读取器负责找出该做什么。
图 5 —带有冲突切换的自定义算法,由作者提供
图 5 描述了一种被称为读取修复的方法。冲突的值都返回给客户机,客户机更了解数据语义。一旦制定了决议,最终值将广播给所有领导。
拓扑
到目前为止,我们已经讨论了多领导复制的注意事项。还有另一个需要考虑的重要问题—复制拓扑。当收到一个请求时,它是如何传递给其他领导的?
图 6 —拓扑,按作者分类
最直观的方法是广播,也称为全连接拓扑—收到写请求的领导者向所有其他领导者发布命令。你可以想象,这会导致网络上成吨的聊天者,当你有越来越多的领导者时,情况只会变得更糟。消息的总数是 O(N),其中 N 是领导者的数量。此外,如果两个领导者之间的链路变得拥塞,它会妨碍整体性能。
另一种替代方法称为环形拓扑。每个领导者只向另一个领导者发送消息,如图 5 所示。消息总数为 O(N),比完全连接少得多。然而,如果任何节点发生故障,整个通信链路都会被切断,这使得它不那么健壮。
最后,星型拓扑。乍一看,您可能会注意到中间的节点—单点故障。你是对的。这个瓶颈使得拓扑变得脆弱(也可以配置故障转移,但是它增加了额外的复杂性)。然而,星型拓扑也不是一无是处。两个节点之间的任何通信最多只需两跳,比环形拓扑快得多。
摘要
像许多工程设计一样,选择正确的复制策略需要权衡利弊。使用多引线架构时,您应该仔细评估以下问题,以得出最佳配置:
- 使用什么冲突解决方案?在这种情况下,你无法解决冲突。有一些算法,如最后写入获胜或智能路由,可以通过牺牲数据持久性或可用性来自动解决冲突。此外,自定义冲突解决方案可用于处理客户的艰难选择。在做出任何决定之前,您应该仔细评估系统的 SLA。
- 领导之间用什么沟通拓扑?如果领导的数量很少,也许你更适合全连接拓扑。否则,星形和环形拓扑会在复杂性和可靠性之间进行权衡。
数据库复制说明 3
原文:https://towardsdatascience.com/database-replication-explained-3-32d6deceeca7?source=collection_archive---------7-----------------------
提示和技巧
第 3 部分-无领导复制
在现代互联网时代,数据复制无处不在。从银行账户到脸书个人资料,再到你心爱的 Instagram 图片,人们认为重要的所有数据几乎肯定会在多台机器上复制,以确保数据的可用性和持久性。之前我谈到过单领导复制和多领导复制。在本文中,我们将探讨一种最常见的复制策略,称为无领导复制。
无领导复制采用与基于领导的复制相反的理念。无领导设置中的节点被视为对等节点,它们都接受来自客户端的写入和读取。没有处理所有写请求的领导者,无领导者复制提供了更好的可用性。
理论
图 1 展示了无领导复制的基本数据流。在写入时,客户端将请求广播到所有副本,而不是特定节点(领导者),并等待一定数量的 ack。读取时,客户端会联系所有副本,并等待一定数量的响应。因为客户端等待许多响应,所以这种方法也称为仲裁。正如我们将在后面看到的,我们如何配置 quorum 是至关重要的,因为它决定了我们数据库的一致性。
图一。法定人数,按作者分列
图 1 中的写请求完成了向客户端发送 ACK 的三个副本中的两个。当三个副本中的一个返回最新值时,读取请求完成。到现在为止,您可能已经注意到,读写数字完全是由应用程序选择的超参数。自然的问题是我们如何确定读/写数。
深潜
首先,我想为简明的讨论定义一些参数。将读取数表示为 r ,写入数表示为 w ,总副本数表示为T例如,图 1 中的法定数为 r=1,w=2,T=3 。
图 1 中使用的法定配置存在严重缺陷,因为它可能会返回过时的值。考虑以下情况:
图二。弱一致性法定人数,按作者列出的数字
如您所见,即使在成功更新后,选择不当的 r 和 w 也会导致过时读取。那么,我们如何配置定额来实现更好的一致性呢?
严格法定人数
如果有人将三个苹果放入五个桶中,每个桶的容量为一个苹果,我需要检查多少个桶才能得到一个苹果?最好的情况是,如果我幸运的话。在最坏的情况下,我需要检查不超过三个桶。现在将上下文更改为数据库。如果我成功更新了 T=5 中的 w=3 个副本,我需要联系多少个节点( r )来获取更新后的值?答案是 r=3 。
严格法定人数是一种需要 w + r > T 的配置类型。严格的法定人数意味着,由于具有更新值的节点和返回读取请求的节点之间的重叠,读取一致性几乎可以得到保证(不是 100%,我将在后面解释)(图 3)。
图三。严格法定人数,按作者分列
无领导复制高度可用,因为所有节点都接受读/写。通过严格的定额,当 min(T-w,T-r) 节点关闭时,系统仍然工作。例如,图 3 中的配置可以容忍min(3–2,3–2)= 1节点中断。
草率的法定人数和暗示的移交
虽然严格 quorum 提供了高可用性和低延迟(只等待速度最快的几个节点),但是在网络分区期间,客户端肯定有可能与许多节点断开连接,从而无法到达 quorum。对于对停机时间容忍度更低的系统,松散的仲裁可能是一个不错的选择。
图 4,提示切换,按作者分类
在一个大型系统中,有许多节点( N )服务于数据库的不同分区,每行数据在 T 个节点上复制。如果太多的主节点停机,导致法定人数不足,那么剩余的( N-T )节点中的其他节点将临时介入以接受写请求,直到主节点重新联机(切换)。
在图 4 中,当节点 2 和 3 不可达时,节点 195 接受写请求。一旦它们重新加入集群,集群管理器将要求节点 195 将所有写入转移到主节点。
需要注意的是,对于读取请求,有两种选择。我们可以实施严格的仲裁(从主节点只读),这提供了更好的一致性。如果需要更高的可用性,也可以为读取启用松散的仲裁(例如,Riak 就是这样做的)。然而,这种权衡导致潜在的过时读取,因为 W + R > T 不能保证写入和读取之间的重叠。
W 和 R 如何影响可用性
w 和 R 是两个需要调整的有趣参数。当 W/R 较大时,系统需要更长时间来完成请求,因为它必须等待来自更多节点的 ACK。对于在线聊天应用程序等读写比率均衡的系统,将 W 和 R 设置为 T/2 + 1 以获得良好的性能是明智的。但是,对于读取量大的系统,我们可以选择小 R 大 w。
冲突处理
像多领导者复制一样,冲突是由无领导者体系结构固有的缺乏请求排序引起的。我在上一篇关于多领导复制的文章中解释了一些冲突解决技术——读取修复、反熵和自定义算法(版本矢量、兄弟)。等等)
无领导复制的警告
强烈一致性的错觉
图 5。强烈一致性的图像,由作者绘制
严格的法定人数可能会给人留下一种错觉,以为这是强一致性(线性化)的保证。虽然严格的法定人数确实可以确保更新读取,但在网络延迟的情况下,它也会表现得很奇怪。考虑以下情况:
强一致性(线性化)要求不允许版本翻转(读取两次,首先获取新值,然后获取旧值)。即使有严格的法定人数,当网络不稳定时,系统也不能保证线性化。
棘手的故障处理
无领导复制的另一个复杂因素是故障处理。考虑这样一种情况,所有节点都接收到一个写请求,但是一些 ACK 被延迟(图 6)。写请求被认为是失败的,但是客户端可能仍然能够看到脏值。这个问题是无领导架构所固有的,因为单个节点没有关于请求状态的全局信息。对于节点 2,失败的请求与任何其他请求没有什么不同。
图六。故障处理,由作者绘制
实现事务是解决这个问题的有效技术。然而,事务会多次放大节点间的抖动,并显著增加系统延迟。
总结
像许多工程设计一样,选择正确的复制策略就是要权衡利弊。使用多重引线架构时,应仔细评估以下问题,以得出最佳配置:
- 使用什么冲突解决方案?在这种情况下,你无法解决冲突。有一些算法,如最后写入获胜或智能路由,可以通过牺牲数据持久性或可用性来自动解决冲突。此外,自定义冲突解决方案可用于处理客户的艰难选择。在做出任何决定之前,您应该仔细评估系统的 SLA。
- 可用性有多重要?如果可用性对您的系统至关重要,请考虑使用无领导复制,甚至使用带有提示切换的松散仲裁。
- 一致性有多重要?严格的法定人数不能保证线性化。您可以部署同步读取修复之类的策略来确保强一致性,但这会降低系统的整体可用性。
数据库复制说明
原文:https://towardsdatascience.com/database-replication-explained-5c76a200d8f3?source=collection_archive---------11-----------------------
第 1 部分—单领导者复制
介绍
在现代大数据时代,数据复制无处不在。从银行账户到脸书个人资料,再到你心爱的 Instagram 图片,人们认为重要的所有数据几乎肯定会在多台机器上复制,以确保数据的可用性和持久性。在本文中,我们将探讨一种最常见的复制策略,称为单领导者复制。
单主复制,也称为主-辅备份,是一种提高数据可用性和持久性的简单方法。假设你让一个大学生设计一个复制策略。在这种情况下,她可能会提出类似的东西——单个节点(领导者)处理所有流量,并主动广播给其他节点(追随者)。
理论
下图描述了单主导复制的数据流。这个想法很简单——客户端将所有的写请求发送给领导者(我们稍后会详细讨论读)。然后,领导者向所有追随者广播该请求。一旦跟随器处理了写操作,ACK 就被发送回客户端。
图 1 —单个领导者复制,按作者分类的图像
深潜
单领导者复制是一个简单的想法,但它并不像看起来那么简单。在选择单主导复制之前,工程师应该了解大量的考虑因素。我在最后一段中忽略了一些细节,我们将仔细检查它们。
同步还是异步,这是个问题。
首先,我们什么时候向客户端发送 ACK?领导者是否等待所有追随者处理请求(同步复制)?这种策略对某些应用很有效,但是它固有地降低了系统的可用性。如果领导者和追随者之间的网络中断,领导者可能需要等待很长时间,这在公共网络基础设施中经常发生(图 2)。更糟糕的是,想象一下如果一个追随者在同步复制设置中死亡会发生什么。领导者不能处理任何请求,仅仅是因为它从死跟随者那里得不到 ACK。
图 2 —响应时间长的同步复制,按作者排序的图像
谁开始营业了?
我们知道所有的写请求都发送给了领导者,但是读请求呢?这里有两种选择,要么让领导者也提供阅读,要么将追随者暴露给客户端。将所有压力都放在领导者身上对于读负载的应用程序来说不是一个好主意(如果模式主要是写,那么没有太大的区别)。但是,如果允许追随者服务于读请求,就会对一致性造成损害,如下图所示。
图 3——关注者提供的阅读信息损害了一致性,图片由作者提供
图 3 揭示了可用性和一致性之间的基本权衡,如 CAP 定理所规定的。由于异步复制引入的领导者和跟随者之间不可避免的复制滞后,问题就出现了。然而,我们仍然有一些技巧来实现更强的一致性保证。
技巧 1:使用时间戳实现写后读一致性。
在许多应用程序中,我们希望确保编写器永远不会看到过时的值(例如,如果您单击 like 按钮并刷新,您肯定不希望看到它被撤消)。这种保证可以通过强制客户端记住上次写入时间戳来实现。数据库只返回比该时间戳更早的值。
技巧 2:用于单调读取一致性的粘性路由。
通过简单的实现,客户端可以从任何副本中读取值。这有时会产生问题,因为不同的副本有不同的数据版本。客户端可能会在连续读取中获得不同版本的数据:从客户端 A 获得版本 2,然后从客户端 B 获得版本 1,然后再次从客户端 A 获得版本 2。为了解决这个问题,可以使用粘性路由负载*衡器来确保每个客户端只能从一个跟随者读取(如果它死了,当然是从另一个跟随者读取)
谁是被选中的人?
第三,领导者失败怎么办?当前的设计完全依赖于领导者节点的健康。在大型数据中心中,服务器停机经常发生。如果主节点停止工作,则会发生故障转移,因为为了可用性,必须提升从节点来处理写请求。
就数据持久性而言,同步复制设置中的故障转移不是大问题。但是,在完全异步的设置中,主节点故障可能会导致数据丢失,因为从节点没有最新的写入。对于客户来说,他们的作品就像凭空消失了一样。更糟糕的是,想想如果老领导重新加入这个团体会发生什么。它很可能与新领导发生写冲突,新领导已经处理了额外的请求
图 4 —异步复制可能导致数据丢失,按作者排列的图像
另一个有趣的事情是人们所说的裂脑,这是一种由于网络中断而导致两个节点成为领导者的情况。这确实是一种危险的情况,因为多个领导者总是会导致相互冲突的写作。没有适当的冲突解决代码,系统将永远不会达成任何共识,从而破坏数据。
图 5-当网络被分割时,分裂的大脑,图片由作者提供
没有简单的方法可以自动避免裂脑。最常见的解决方案是通过拔掉旧 leader 的电源线进行手动故障转移。不过,如果你是那些喜欢算法的人,有几个工具可以试试。
招数:定额和击剑。
如果一个网络被划分为两个子集,则具有大多数节点的子集保持活动,同时通过向电源控制器发送特殊信号来拍摄少数子集(这不是我编的,这种方法字面上称为 STONITH,拍摄另一个节点的头部)。
总结
像许多工程设计一样,选择正确的复制策略就是要权衡利弊。使用单引线架构时,您应该仔细评估以下问题,以得出最佳配置:
- 一致性与可用性?为关注者提供阅读服务是一把双刃剑。如果您选择它,应用程序代码必须仔细设计,以处理陈旧读取和其他一致性问题。
- 可用性与耐用性?异步复制速度很快,但当主设备出现故障时,可能会导致数据丢失。同步复制以时间换取持久性,但对于某些应用程序来说,这可能并不划算。有些人决定留在中间——拥有一个同步副本和一堆异步副本。
- 人工 vs .自动化?处理主节点故障一点也不好玩。工程师不想在凌晨 3 点工作。然而,自动故障转移是一个永远存在的兔子洞。裂脑、写操作冲突、数据丢失,应有尽有。
数据库与流处理——这对数据管理的未来意味着什么
原文:https://towardsdatascience.com/database-vs-stream-processing-what-it-means-for-the-future-of-data-management-63042d047ae1?source=collection_archive---------27-----------------------
公司如何从数据库转移到事件流,为什么事件流本身对您的应用程序来说是不够的
由作者提供
当我们想到数据时,我们通常认为数据给人类提供了做出更好决策的洞察力。因此,存在诸如数据库的应用程序来与 UI 应用程序交互,以了解当前状态。
然而,数据可以帮助我们做出更好的决定,并帮助其他软件做出更好的决定,从而将人类从系统的关键路径中移除。
想想网飞——他们的业务是从出租 DVD 服务开始的,你去网飞租 DVD,他们会通过邮政服务寄送 DVD。2021 年,网飞已经成为一个纯软件*台,用户只需点击一个按钮就可以观看任何电影。
Airbnb 最初是像 Craiglist 这样的网站,没有支付提供商——你通过网站与主机连接,然后你实际支付主机。2021 年,Airbnb 已经成为一个纯软件*台,用户只需点击一个按钮,就可以租到任何房子并体验。
业务变得越来越自动化——业务流程变得更像自动驾驶仪。
我们也开始看到许多应用程序,其中用户界面是整个软件包中较小的一部分。我们看到公司创建软件来服务我们的最终用户,人类,并开发系统来与另一个系统对话。
当我们考虑数据管理系统时,有两样东西:流处理和数据库。了解两者的区别可以帮助我们知道如何为自己创造更好更高效的系统。
主动和被动数据
数据库和流处理是相似的,因为它们都是存储数据的容器。但是,它们的数据移动方式不同。
如果你想用数据库积累的内存来存储大量的数据,你可以使用 Cassandra。如果要存储包含实体间关系的数据,可以使用 Neo4J 这样的图形数据库;如果想拥有主动查询功能,可以使用弹性搜索。
这个数据库为我们关于数据的问题提供了答案。它们被构建为与包含 UI 的用户进行交互。因此,存储在这个数据库中的数据是被动的——它等待您对它们进行一些处理,而我们对它们进行的查询是主动的。如果我们——人类,在特定时间停止与数据库的交互,它不会做任何事情。
另一方面,流处理是异步的。他们最终用户不是我们——人类——而是其他软件。它们也像数据库一样存储数据,但是数据是活动的。通常触发的操作基于信息本身。它们帮助我们在系统内实现流程自动化。换句话说,查询(动作)被动地等待被触发。
你去过的地方和你现在的地方
数据库帮助我们回答关于我们在应用程序的当前状态的问题。数据库表表示单个时间点的当前状态。你不知道之前发生了什么。一个英语语法的类比将是一个数据库表更像一个名词。它有助于告诉你你现在在哪里。
另一方面,事件流更像一个动词。事件流回答了状态发生的历史。它记录了你手机里的移动,鼠标的悬停,或者订单的进度。它将每一个动作记录成一个事件,可以及时回放。你会得到更多关于发生了什么的信息。如果是棋局,可以知道对方的棋是不是聪明棋。
可变性与不可变性
我们可以认为流处理和数据库表的作用是一样的,但性质不同。事件流是一种特殊的表,它是不可变的——你不能改变它。数据库表通常是可变的,它使我们能够插入、删除和更新它的元素。
事件流中的每个事件就像一个事实。如果你订购了一个项目,你想取消它。系统会在订单状态的顶部添加取消状态—您可以倒回历史来查看您所做的事情。它就像一本账本。仅追加的好处之一是,我们与之交互的数据移动速度很快。当您想要更新当前状态时,另一个服务已经使用了它并执行了一些操作。因此,它需要创建一个补偿事件链来将所有这些操作传播给它的订阅者。
另一方面,数据库会将状态从订单更新为取消。您可以编辑数据移动到的行。它为系统提供了应用程序当前状态的真实来源。
数据库和事件流服务于具有不同受众的不同用途的应用程序。对于数据库来说,我们人类是它的最终用户。因此,将数据库设计为同步、被动的数据并将其标记为单个真实源是有意义的。对于事件流,最终用户不是人,而是软件。如果最终用户不是人类,我们可以利用异步来优化我们的资源。这些数据成为触发其他软件执行特定操作的数据。
尽管事件流和数据库在不同的用例中表现不同,但是团队不需要采用其中之一。更多的应用程序需要流和数据库来更好地了解其内部系统。这意味着我们在需要处理同步和异步的现代应用程序中会看到更多。因此,更多的企业应用程序使用面向流的数据库的混合方法。有几个活动数据库,如 MongoDB、CouchbaseDB 和 RethinkDB。也有可以充当数据库表的流处理器,比如 Flink 和 Hazelcast Jet。无论您的应用程序使用哪种混合方法,了解其中的差异都有助于我们理解采用哪种系统架构意味着什么。
资源
- 超越数据库,超越流处理器:数据管理的下一步是什么?
- 视频版
【https://edward-huang.com】最初发表于https://edward-huang.com/distributed-systems/architecture/stream-processing/2021/02/04/database-vs-stream-processing-what-it-means-for-the-future-of-data-management/。
数据库:如何从数据管道中获得更好的性能。
原文:https://towardsdatascience.com/databases-how-to-get-better-performance-from-your-data-pipeline-e21ee669b1b9?source=collection_archive---------17-----------------------
理解大数据
关系数据库可能是你争论数据的最大盟友之一。让我们离开人迹罕至的地方去学习如何做。
试图找出他们的查询运行缓慢的原因的人——来自 Pexels 的 cottonbro 摄影
我与开发人员和工程师一起工作了很长一段时间,我已经开始期待和依赖一些共性。我观察到的一个比较一致的真理是,经常会出现一种狭隘的观点。我的意思是,如果一个开发人员是一个前端人员,大多数解决方案都侧重于试图用前端焦点来处理一切。如果开发人员更关注中间件,他们希望将该层用于所有事情。如果一个开发人员是“全栈”的,那么他们就会回到他们最舒适的领域。
这本身并不是一件坏事。这只是一句古老格言的现代应用:如果你只有一把锤子,那么一切看起来都像钉子。但是,我们不仅仅局限于锤子。我们可以在众所周知的工具箱中增加更多的工具。
软件中往往缺少的一点是老式的关系数据库的流畅性。就像我们工具包里的 10mm 插座。我们可能有一些东西可以在紧要关头发挥作用,让我们度过难关,但它不是这项工作的完美工具。
因此,在我脱离类比的轨道之前,让我们深入研究一下。
注 :对于这个讨论,我会处于一种思考 PostgreSQL 的心理状态。我很喜欢 Postgres。我鼓励每个人都能流利地使用它。但是,这些概念中的大部分都会不同程度地转移到其他数据库引擎上。
问题
如果您是软件或数据人员,并且不知道基本的 SQL 查询集(选择、插入、更新、删除),那么就此打住,去温习一下。当你有了那种理解的时候再回来。我保证,不会拉文章。
如此多与数据有关的人似乎对关系数据库有狭隘的看法。这包括不少负责数据管理的人,甚至包括我一路上遇到的一些数据库管理员。
当然,他们的 SQL-fu 很强大。他们知道何时使用左连接而不是自然连接。他们甚至可能记住了 UNION 的大部分语法。但是还有更多。
如果你在数据科学领域(数据科学家、数据分析师、数据工程师等)。),在您的生产力工具箱中,没有比精通数据库更强大的工具了。
这是一个大胆的声明——我知道。我敢肯定,中间件之神的怒火现在正在锻造一些雷电来打击我。但是,这是我的反驳:
我在 1985 年上了我的第一堂计算机课,老师教给我们的第一件事就是 GIGO。垃圾进,垃圾出。从很久以前的那一天开始,我就一直在和垃圾做斗争。大多数处理数据的人也是如此。
数据库提供了控制垃圾流的工具。它可以在进来的时候进行预处理,在出去的时候进行提炼。这个函数,就其本质和设计而言,使它很有价值,并避免了我们在分析的后数据检索阶段经常发生的许多争论。
想象一下,如果一些小技巧可以让你的生活变得更轻松?这难道不值得知道吗?
概念
很久以前,我是一名数据库管理员,在一家非常小的开发公司工作。我们的资源非常有限,而且在 AWS 出现之前已经过了很长时间。
这种稀缺性使得一个人必须更有创造力才能最大限度地利用他们所拥有的资源。这没有什么不同。
当时,我们试图通过我们的应用服务器推动大量的处理和前端转换。我们在前端的一些处理将机器上的负载推得很高,并且开始达到令人担忧的水*。
有一天,当我们以一种更宏观的方式来审视一切时,我们意识到,当我们的应用服务器受到重创时,我们的数据库服务器却像枕头的另一面一样冷静。现在说出来是显而易见的,但是在最激烈的时刻,我们经常忘记数据库是受 IO 限制的,而不是受 CPU 限制的。
这就产生了一个想法。让我们看看如何将一些处理从更困难的转换中卸载到数据库中,并让数据更接*成品地返回,而不是在应用程序逻辑中完成。
将* 20 年后,我在这里写这篇文章。
视图
你们中有多少人使用视图?你可以老实说,我不会告诉任何人。
许多人认为视图只是一个存储的查询。幸运的是,他们没有错,但也仅此而已。
视图的一大优势不仅仅在于复杂的查询可以被轻松地存储和引用,还在于查询计划也可以被存储。你说,查询计划是什么?
每一个数据库引擎的背后都有一个神奇的调味汁。这实际上取决于规划器,它提供了存储和检索数据的最有效方式。因此,对于执行的每个查询,规划者必须评估被询问的内容,并计算最佳路径。
正如您可能想象的那样,复杂的查询通常需要付出相当大的努力来开发计划(在计算环境中)。预先计划这一点是有好处的,因为它在很大程度上允许返回后续查询,除了数据检索之外,在处理过程中几乎没有摩擦。
速度是我们的朋友。
视图也是重构数据以更好地满足我们的需求的一种很好的方式,而不需要求助于分析代码中的大量查询。只要付出一定的努力,我们就可以为 access 创建完整的新数据格式层。对每个视图应用一些权限,就可以创建一个几乎存在于金属中的非常健壮的界面。
如果您正在与初级分析师或前端开发人员一起工作,他们对没有框架支持的 SQL 经验有限,这可能是理智与疯狂之间的区别。
功能
我喜欢数据库功能。它们通常是处理数据的最佳途径,但也很容易被误解。
当我们想到数据库时,我们倾向于以一种包含的方式来思考。我们被训练去概念化交易功能。选择查询返回笛卡尔积。更新处理数据集的修改。插入操作会添加新行。删除操作会删除它们。
我们甚至通常也以这种方式思考函数。我们有文本操作功能来处理数据。我们有聚合和数学函数来处理检索到的数据。
但是,当我们谈论用户定义的函数时,有两个关键概念会改变游戏规则:
- 函数可以返回任意数据集。只有一个结果—函数可以返回它。有一行数据—函数可以返回它。需要一个连接所有表并一次性返回整个数据库的函数吗?是的,一个函数可以做到这一点。但是不要那样做——真的。
- 函数可以执行逻辑的、编程的流程。就像处理一个数据帧或多个数据帧一样,您的函数可以从各种表中提取数据,而不考虑连接,并执行您需要执行的任何操作。然后你可以对这些数据做任何你想做的事情。
想一想这意味着什么。您可以使用函数在内部执行大量的预处理。而且你不仅仅局限于 SQL。
对于 Postgres,肯定有 SQL 函数,它对于简单的任务非常有用。然后他们有 pl/pgsql,这是他们自己对 Oracle 的 pl/sql 的理解。但是,也支持用 Python、Perl、Java、Php 和其他语言编写的函数。
考虑到语言库和功能的广度,没有理由不去研究数据领域。它可以让你的生活更轻松。在那些被困在 ORM 前的可怜的工程师中,它也有很高的书呆子信誉。
扳机
当你运行函数时,它们很棒,但是当它们在事件上运行时,它们甚至更好。那是我们的朋友扳机。
触发器最简单的形式是一个不返回数据但执行任务的函数。然后,将该函数绑定到一个对象,并给出它应该何时运行的条件。
坏数据不见了!
我有好几次都在处理令人讨厌的不一致的数据。这些问题通常很难在一开始就发现,但是一旦进入数据库就简单了。
例如,我有一个正在运行的数据收集流程。出于某种原因,它喜欢偶尔将只应该放在一个表中的数据放到另一个表中。听起来很奇怪,但我认为这是系统运行的时间问题。
现在,我可以追踪它并弄清楚发生了什么。这是负责任的做法。然而,我知道至少要花一个小时的时间来解决这个问题,而且在数据库层很容易解决。所以,我创造了一个触发器,继续我的生活。
我的触发器只是运行一个查询来查看插入过程是否出错,如果出错,它会隔离出有问题的记录并删除它们。这发生在插入之后,并且永远不会看到坏数据。
修复的总时间大约是 10 分钟,包括重新给我倒咖啡。
但是仔细想想。功能的强大与事件驱动执行的强大相结合。一想到这些可能性,我就不寒而栗,我已经这样做了很久了。我只能希望您能理解为什么深入数据库领域绝不是浪费时间。
甚至更高级
我想这是我大脑的战略方面,但当我设计程序和过程时,我总是试图确保我有一条前进的道路。这也适用于数据库工作。
创建一个应用程序或生命周期有限的快速数据库并不少见。但是,它经常会变得越来越大,成为您的数据湖的长期居民。不可避免的是,随着时间的推移,它会继续增长,你的青少年数据库不再像以前那样快速灵活。
增长往往会降低性能。
这就是理解绩效路径至关重要的原因。你如何更新你笨拙的数据库?
你知道解释吗?这是一种将您的查询作为假设来运行的方式,以了解计划者对此的看法。它将显示系统获取数据并返回数据的过程。但是,这只是一个假设。它很快,但并没有真正做什么。
你知道解释分析吗?添加 ANALYZE 关键字告诉规划者不仅要武断地说明它将做什么,还要实际运行查询并显示结果。
这将显示索引被命中的位置——或者没有被命中的位置。您可以逐步执行并重新优化基本和复杂的查询。
然后您可以看到如何将这些查询放到视图中。你的数据可能会得到更快的回报。
你的观点不再给你所需要的动力了吗?可能是时候将这些视图合并到函数中了。函数的执行优先级不同,处理方式也不同。你可能会看到更多的性能。
最后,在重组整个数据模型之前,还有一条路可走。如果您对 C/C++有一定的了解,您可以创建一个函数,作为编译对象加载到数据库中(当然是 Postgres)。这是表演的纯粹本质所在。尤其是如果您只需要从设计糟糕的数据模型中挤出一些马力来努力跟上的话。
理想情况下,您将第一次就做对,但是设计数据模型远远超出了我今天想要讨论的范围。
结论
希望这些都是对你的回顾,你已经点头同意了。如果不是,也没关系。希望你学到了一些东西来做一些研究。
重要的是,不管我们用什么来工作,我们都有很多工具可以使用。如果我们有效地使用它们,我们经常可以使我们的生活变得更加容易和顺利。
一个数据人员可以做的最好的、实际的投资之一是学习如何更有效地处理他们的数据库。据估计,我们 80%的工作时间都花在了争论数据上——如果我们能减少 10%或更多,那么我相信你能计算出影响。
对 Databricks 笔记本爱恨交加
原文:https://towardsdatascience.com/databricks-notebooks-a-love-hate-relationship-8f73e5b291fb?source=collection_archive---------3-----------------------
在这篇文章中,我给出了我对这个工具的看法,以及根据你的团队的技能和成熟度,你可以使用它来交付解决方案的各种方法。
自从两年前我开始使用 Databricks 以来,我一直对笔记本有一种奇怪的又爱又恨的关系。你们中有些人可能也有同感。
凯利·西克玛在 Unsplash 上的照片
笔记本正在使“大数据”民主化
笔记本电脑将留在数据领域。从经典的 Jupyter 笔记本电脑到 Databricks 和 Azure Synapse Analytics 等其他 SaaS 解决方案推动的“在生产中运行”方法。
我曾经认为笔记本是一个超级强大的工具,它可以让没有或很少编程知识的开发人员构建复杂的数据集和 ML 模型。
看到它们在一些云提供商(如 Azure)中与 Data Factory 等工具集成得如此之好,让 ETL 编排变得超级简单、可视化和直观,这真是太棒了。特别提及笔记本参数和输出,它们确实有助于模块化数据管道。
Databricks 笔记本很容易成为大多数非高级数据用户在云上运行数据处理代码的事实方式。事实是,Databricks 消除了让代码在云上运行的大部分摩擦和复杂性,因为使用 Databricks 的用户已经在使用它了。因此,没有更多的“但它在我的笔记本电脑上工作”这样的借口。
总之,多亏了笔记本电脑,用户可以非常快速地传递价值,而不会遇到工程瓶颈。不幸的是,所有这些好的特性都是有代价的。
易用性是一把双刃剑
为了能够在笔记本电脑上运行代码,您需要一个集群来进行计算。因此,即使用户只想使用 Pandas 编写一些简单的数据处理代码,您也必须为集群虚拟机和 dtu 付费。如果团队中的任何人都有权创建集群,那么也很容易以过大的集群而告终,并毫无理由地增加成本。
“这个数据集非常大,大约有 4GB 但是不要担心,我已经用 3 个工人创建了这个群集,所以我认为这足以启动,但是如果需要,我们可以在以后添加更多。顺便说一下,我用熊猫是因为我不想学习 PySpark 😄”
我们必须记住,Databricks 主要是作为一个托管*台构建的,用于在云上运行 Spark,而不是在单个节点上运行代码。直到一年前,甚至没有一个单节点集群选项可用(只有将 workers 设置为 0 的变通方法)。
另一方面,当你需要做的不仅仅是 SQL 查询或一些简单的脚本时,你开始感觉到使用笔记本的痛苦。
试图将良好的编程实践应用到笔记本中是相当困难和令人沮丧的。没有办法用基本的“import”命令导入你自己的类,你被迫使用官方的 hacky 变通办法,如“%run”从其他笔记本加载代码。调试封装的代码简直是一场噩梦,因为没有调试器,唯一的方法就是使用 print 语句(欢迎来到 80 年代)。关于单元测试,嗯……你需要非常有创造力!
这时,你会开始考虑跳到一个合适的 IDE,比如 PyCharm 或者 VS Code(在 Python 的情况下),重新开始编写健壮的软件。可能是个好决定。不幸的是,一旦您执行了这一步,设置的复杂性就会增加,结果,您可能会失去一些人。不是每个人都有处理这种复杂性所需的软件工程技能。
找到最佳点
选择何种方式编写代码将取决于开发团队的成熟度和技能。越是成熟和先进,他们就越有能力应对复杂性。从评估开始,以衡量当前的团队技能。大多数团队成员主要是具有多年关系数据库工作经验的 SQL 开发人员,但很少或根本没有编程技能吗?还是大部分团队成员都非常精通软件工程和 CI/CD 实践?或许介于两者之间?
作者图片
如果你想建立一个面向未来的项目,找到适合所有团队成员大部分能力的中庸工作方式是必须的。否则事情会出错。这并不是第一次因为创建项目的人离开了公司,而团队中没有其他人有能力让项目继续下去而导致项目中断。
选择适合您团队的方法
在与不同技能的人一起参与不同的项目并分析了不同的可能性之后,我想到了下面一套方法,你可以根据你的团队能够处理的复杂程度来应用这些方法。
选项 1:仅笔记本电脑
Databricks 中开箱即用的代码开发体验。只需在单元格中编写代码,必要时结合语言。
提供一套笔记本模板对加快解决方案的开发非常有帮助。此外,它将有助于建立一个标准的代码组织,有助于保持代码的有序性和易读性。
- **优点:**对所有数据开发人员来说简单明了。
- **缺点:**没有 IDE 开发,没有代码重用,只有试错调试,没有单元测试,代码会很快变得乱七八糟。
选项 2:笔记本+作为笔记本的一套实用功能
与前一个选项相同,增加了一组捆绑在笔记本中的实用程序功能,可以从其他笔记本导入(%run)。这些功能可以包括从 SQL 数据库或增量表中读取或写入数据的功能…任何可以轻松重用的功能。
与以前几乎相同的复杂性,一切都保留在 Databricks 工作区内,实用程序功能对所有开发人员完全透明,如果需要,可以在现场轻松更改。
在这种情况下,为一些笔记本提供关于如何使用该实用程序功能的示例是非常有帮助的,或者更好的是,将它们合并到笔记本模板中。
- **优点:**对所有数据开发人员来说简单明了,对效用函数代码重用,效用函数透明,易于现场更改。
- **缺点:**没有 IDE 开发,只有试错调试,没有单元测试,运行笔记本导入代码感觉不对。
方案三:笔记本+一套实用功能代码包
与前面的方法相比,主要的区别是捆绑效用函数的方式。在这种情况下,开发一个可以使用“import”语句导入的自定义代码包。
在这种情况下,复杂性增加得更多,因为解决方案的代码不仅存在于 Databricks 工作区中。代码包需要在本地机器上开发,这为使用 IDE、合适的调试引擎甚至包括单元测试提供了可能性。这也意味着,将代码提交到 Git 存储库,并包含一个 CI/CD 管道来发布包,以便可以从 Databricks 笔记本中使用它。
至于其余的开发人员,他们只需要相信这些实用功能完成了他们的工作,并专注于其余的逻辑。同样,提供一些使用示例将对代码包的采用非常有帮助。
- **优点:**通过 IDE 开发、适当的调试和单元测试对实用函数进行代码重用,使用“import”语句导入代码。
- **缺点:**代码包需要通过 CI/CD 构建和发布,代码变得不那么透明,用户只需信任它的功能。
选项 4:笔记本作为“主”功能+转换&实用功能作为代码包
在这种情况下,我们在复杂性上更进一步。数据转换的逻辑现在也可以成为代码包的一部分。使用笔记本作为编排函数运行和注入参数的“主要”代码。
这种方法带来了充分的测试可能性,因为所有的代码都可以在本地机器上开发。另一方面,缺乏软件工程技能的数据开发人员被排除在开发之外。但是,它们仍然可以提供 SQL 查询作为参数传递给 spark.sql()。
这种设置的另一个缺点是在本地机器上工作时失去了与 Hive Metastore 的连接。因此,如果你的组织大量使用它,这可能是一个大问题。变通办法是使用 Databricks Connect 将您的代码发布到 Databricks 集群(如果您可以忍受已知的限制),或者,在您的本地机器中存储数据集的样本,也可以用样本模拟 Hive Metastore。
- **优点:**代码可重用性、IDE 开发、正确的调试,以及对所有代码的单元测试,将笔记本电脑作为可用于编排的“主要”设备。
- **缺点:**代码包需要通过 CI/CD 构建和发布,不适合没有软件工程技能的人,无法从本地机器访问 Databricks Hive Metastore。
选项 5:仅代码包
这是硬核的方式。在本地机器上将所有逻辑编写在一个代码包中。你还记得火花峰会的命令吗?在 Hadoop 时代,它总是有效的,所以你为什么要改变它呢?
在这种情况下,前面方法的所有问题也适用。同样的代码应该可以应用于任何 Spark 集群,不管它是托管在 Databricks、Kubernetes 还是其他什么地方。
- **优点:**代码可重用性、IDE 开发、正确的调试和所有代码的单元测试,相同的代码可以在任何 Spark 集群中运行(无论它托管在哪里)。
- **缺点:**代码包需要通过 CI/CD 构建和发布,不适合没有软件工程技能的人,无法从本地机器访问 Databricks Hive Metastore。
向前移动
我希望你能把前面的方法作为灵感的来源,而不是唯一的选择。我相信你能想出更好的方案来满足你团队的需求。
当然,选择其中一个选项并不意味着你必须永远坚持下去。只要团队在成长,技能组合就会扩大,团队就越有可能转移到更复杂、更健壮的设置。
在我看来,我会推荐从选项 2 开始,因为这是一种非常直接的方式来编写具有一定可重用性的代码,同时还涉及到 SQL 开发人员。复杂性的降低有助于更快地交付 MVP。这将满足涉众,他们将给出反馈并要求新的需求。稍后,您可以在“工业化”阶段将重点放在代码的健壮性上,转移到选项 3 和 4,同时团队继续扩展和开发处理更多复杂性所需的技能。
结论
笔记本时尚将会持续下去,不仅是 Databricks,其他 SaaS 的替代产品,如 Azure Synapse Analytics,都在推动将笔记本部署到生产中。它们扩展了数据开发人员的视野,允许没有编程技能的数据管理员利用“大数据”技术的可能性。
如果你有一个良好的软件工程基础,你会很快发现笔记本电脑的局限性,你可能迟早会想摆脱它们。幸运的是,有一些折中的解决方案可以帮助在不落下任何人的情况下两全其美,并且您可以根据您的团队技能进行微调。
感谢您的阅读,我希望您发现这是有帮助的!
数据块部件
原文:https://towardsdatascience.com/databricks-widgets-20483229e84e?source=collection_archive---------10-----------------------
如何使用 DataBricks 小部件和中间的其他东西
图片来自 Unsplash
介绍
在过去的两个月里,我开始更频繁地使用 DataBricks,对此我有过许多情绪波动。前一分钟我还超级感动,后一分钟我又厌恶它。公*地说,许多关于它的负面情绪都与它需要一些时间来适应这一事实有关,我发现自己缺乏这样做的时间。
但是什么是数据块呢?
简而言之,DataBrick 就像 Jupyter 笔记本,但更多的是类固醇。它在以下方面胜过 Jupyter 笔记本
- 能够在一台笔记本上运行 spark SQL、scala、r 和 python 代码,只需使用%符号后跟语言名称,例如
%sql
、%python
等。 - 它具有出色的文件组织,有利于团队笔记本访问和知识转移,即如果您的团队使用 DataBricks,您可以通过 DataBricks 中每个人的电子邮件地址工作区访问他们的笔记本。
- 用户可以通过集群调整计算能力。
什么是 DataBricks 小部件?
把一个小部件想象成一个过滤器。比如 SQL 中的where
子句或者 Tableau 中的 filter 部分。
在数据块中,有三种主要类型的小部件
- 文本小部件——它在你的笔记本顶部创建一个文本框,用户(也就是你)可以在你的栏或数据中键入你只想看到的类别。
- 下拉单选小部件—在笔记本顶部创建一个下拉框,在您的列中显示预定义的默认字段。这种类型的小部件也有两种风格:下拉列表和组合框。
- 下拉多选小部件—这也类似于下拉单选小部件。唯一的区别是,您可以一次单击多个字段,而不是一个。
如何在 SQL 中创建小部件
在 DataBrick 中创建任何类型的小部件都有一个典型的代码模式,可以分为四个部分。
- 从
CREATE WIDGET
条款开始 - 后跟小部件的类型
- 然后指定一个小部件名称来标识小部件变量。
- 最后,一个
DEFAULT
命令和默认的选择词。默认单词是将作为默认单词出现在小部件图标中的单词。
小部件 SQL 查询如下所示
CREATE WIDGET <widget type> <widget variable name> DEFAULT <Default category word>
注意:确保 默认类别词 在双/单引号内
因为下拉小部件类型需要指定一个选择列来反映正确的类别,所以在默认单词之后添加了一个select
语句。
这个 select 语句看起来像这样
SELECT DISTINCT <<column name>>
FROM <<tablename>>
下面是所有四个小部件及其视觉效果的示例代码
为文本小工具
CREATE WIDGET TEXT Policy_product_name DEFAULT 'Car Classic'
为下拉菜单
CREATE WIDGET DROPDOWN policy_product_name DEFAULT 'Car Classic' CHOICES
SELECT DISTINCT product_name
FROM train_csv
用于组合框
CREATE WIDGET COMBOBOX policy_product_name DEFAULT 'Car Classic' CHOICES
SELECT DISTINCT product_name
FROM train_csv
用于多选
CREATE WIDGET MULTISELECT policy_product_name DEFAULT 'Car Classic' CHOICES
SELECT DISTINCT product_name
FROM train_csv
注意,在上面的示例代码中,我们假设要查询的表名为 train_csv,要动态过滤的列名为 product_name。根据您的使用情况进行定制。
注意:小部件下拉框和文本框出现在笔记本工具栏的正下方。
图片来自作者
如何利用小工具
创建小部件是利用小部件的一个步骤。第二步是将微件链接到数据/表以控制过滤器动态
下面是一个链接小部件的示例查询
SELECT *
FROM <table name>
WHERE <column name> = getArgument(<widget name>)
注意: 小工具名称 应该用双/单引号
- 在这种情况下,where 子句指定了要作为筛选依据的列或字段。
- where 子句还有一个名为
getArgument()
的附加函数,它将小部件的名称作为输入。
注意:创建的小部件过滤器中的选项/列应该对应于 where 子句中的列
**总之,**使用小工具分为两步
步骤 1: 创建小部件
**第二步:**将创建的小部件链接到您想要查询的表格
移除小工具
要删除一个小部件,只需输入以下查询
REMOVE WIDGET <name>
其中
上面的代码适用于所有的小部件类型,但是如果有许多小部件需要删除,您需要多次运行它并调整小部件的名称。
要一次删除所有小部件,您可以键入以下查询
%pythondbutils.widgets.removeAll()
在这种情况下,您需要通过在代码前使用%python
命令来切换到 python。
使用数据砖块小部件的技巧
- 默认情况下,widget 设置通常是在模式下运行笔记本。这意味着每次您更改过滤器类别时,无论是下拉选项还是书面文本,它都会自动运行笔记本中的每个单元格。这有时会很烦人。您可以通过单击左上角的设置图标来调整小部件设置,该图标仅在创建小部件时出现。点击之后,你会看到一个弹出的窗口小部件面板设置对话框。有三种模式可供选择。这是界面的样子
图片来自作者
您可以根据需要调整设置
2.虽然您可以同时使用所有三种小部件类型(如果出现用例),但请记住按名称区分它们,因为默认情况下,您的笔记本会在每次更改小部件选项时运行。如果两个不同的小部件类型存在一个名称,则最后运行的查询将覆盖之前的查询。
我的两分钱
- 我个人不使用文本小部件或多选小部件,因为我还没有它的用例。我的定位窗口小部件类型是下拉列表或组合框。
- Dropdown 和 Combobox 之间也没有明显的区别。区别主要在于小部件接口。
- 如果您想做一个快速的可视化演示,您可以使用一个小部件和 DataBricks 中的仪表板功能。
数据化和个性化
原文:https://towardsdatascience.com/datafication-and-personalization-the-netflix-way-to-extend-value-creation-for-customers-70948ad2239f?source=collection_archive---------31-----------------------
为客户拓展价值创造的网飞方式
20 多年前,网飞以 DVD 租赁公司起家。以个性化为核心,网飞向顾客推荐和邮寄 DVD。当时,它的个性化算法只有很少的数据点——过去的租赁历史,DVD 持有的时间长度,也许还有一些额外的人口统计信息。
快进到网飞推出流媒体服务的时候,它陷入了用户行为的数据化,捕捉客户的浏览历史,客户按下前进、后退或暂停的点,添加到愿望清单的标题,等等。网飞已经把它的顾客分成了几千个微群,这些微群本质上是味觉社区,每个人都可能是多个味觉社区的一部分。现代流媒体和互联网世界中的这种数据化帮助网飞更好地了解其客户,以提供更个性化的体验——为每个客户定制主页,以及超个性化的“推荐给你”和“因为你观看了 ABC 标题”。
La Casa de Papel 又名金钱抢劫
图片来自 Unsplash
犯罪惊悚片《La Casa de Papel》于 2017 年在西班牙制作并播出,这为其在黄金时段的强势开局奠定了基础。然而,在第一个两季的运行中,收视率持续下降,该节目在西班牙被总结为失败。
来源:T4 法院
2017 年 12 月,网飞为 La Casa de Papel 购买了国际流媒体版权,将其翻译成英语,重命名为 Money Heist,并将其放入其他众多外语节目的目录中。在没有任何推广的情况下,Money Heist 在网飞启动,只是受到算法的摆布,可能有正确的标签和分类。就在这里,像我这样对犯罪惊悚片情有独钟的人,把《金钱大劫案》加入了网飞推荐名单。
与此同时,在 2018 年初,该剧的演员开始在他们的 Instagram 个人资料上观察到一个不寻常的现象——他们的粉丝只是在攀升,演员不再是匿名的了。在全球推出的四个月内,该节目成为网飞最受关注的外语系列节目,该节目于 2018 年 4 月续签了两季,预算大幅增加。不用说,接下来的两季受到了粉丝们的极大欢迎,在开播的第一周就有 3400 万人观看。
如何发生——推荐系统的科学
这里发生的是纯数据科学和机器学习。网飞用“电视惊悚片、悬疑片、刺激片”等标签发布了这个节目其他一些具有类似标签的节目包括《越狱》、《缉毒警》、《绝命毒师》。在其微聚类中,网飞可以识别出喜欢电视惊悚片和《金钱大劫案》的顾客,并开始出现在他们的推荐名单上。随着越来越多的人观看该节目,并提供了很好的评论,该节目增加了推荐。通过网飞对其客户进行的所有数据化、分类和聚类,该节目被推荐给正确的客户群。稍后我会写一篇关于推荐系统的详细文章。
未来—跨公司的数据集成
如果在一个假设的情况下,网飞和 Instagram 走到一起,利用彼此的数据化成果,两者都可以为各自的客户创造额外的价值。Instagram 了解网飞的聚类,可以提出新的连接,向一个聚类中的客户显示类似的广告,等等。
网飞可以识别客户在 Instagram 上喜欢/关注的演员,然后将这些受欢迎的演员的照片作为不同标题的缩略图,为每个客户定制一张照片,以获得快速关注。如果我在 Instagram 上关注了Á·阿尔瓦罗·莫特(金钱大劫案的教授),那么他的照片就会出现在 Mirage 上,成为我的网飞推荐的缩略图。
现在,如果网飞要创作一部新的惊悚片,就像它最*在创作自己的内容一样,它会通过 Instagram 在其目标观众群中找出受欢迎的惊悚片类型演员。答对了。网飞有了下一部作品的演员阵容。
摘要
数据是新的石油!更多的数据、更好的算法和更好的产品带来更多的数据创造——飞轮继续支持商业模式创新和为客户创造价值。公司不得不开始数据化之旅,从业务中自然进行的活动和交易中系统地提取数据,建立数据管道,以高速处理大量数据,同时捕捉足够多的变化。像谷歌和亚马逊这样的公司已经达到了他们目前的地位,不仅是通过世界级的产品,而且是通过对客户的深入了解。
DataJob 简介—在 AWS 上构建和部署无服务器数据管道
原文:https://towardsdatascience.com/datajob-build-and-deploy-a-serverless-data-pipeline-on-aws-18bcaddb6676?source=collection_archive---------17-----------------------
用几行代码将您的代码部署为一组 Glue/Sagemaker 作业,并用 Step 函数编排它们
https://unsplash.com/photos/Q1p7bh3SHj8
动机
数据工程师的核心活动之一是构建、部署、运行和监控数据管道。当我在数据和 ML 工程领域工作时,我缺少一个工具来简化在 AWS 服务上部署我的数据管道的过程,如 Glue 和 Sagemaker ,以及如何用步骤函数轻松编排我的数据管道的步骤。这让我开发了 DataJob !🚀
在本文中,我将向您展示如何安装 DataJob,引导您完成一个简单的示例,并展示 DataJob 的几个特性。
为了继续我的开发,我希望从社区中获得一些反馈,要么继续并添加额外的服务(lambda、ecs fargate、aws batch 等),要么改变方向,要么放弃这个开源项目。
请回复我!🙏
https://github.com/vincentclaes/datajob
数据作业安装
您可以从 PyPI 安装 DataJob。DataJob 使用 AWS CDK 来提供 AWS 服务,所以请确保也安装它。如果您想学习这个例子,您当然需要一个 AWS 帐户🙂
**pip install --upgrade pip
pip install datajob**# take latest of v1, there is no support for v2 yet
**npm install -g aws-cdk@**[**1.134.0**](https://www.npmjs.com/package/aws-cdk/v/1.134.0)
简单的例子
我们有一个简单的数据管道,由两个打印“Hello World”的任务组成,这些任务需要按顺序编排。任务被部署到 Glue,并由 Step 函数进行编排。
我们将上述代码添加到项目根目录下名为datajob_stack.py
的文件中。该文件包含配置 AWS 服务、部署代码和运行数据管道所需的一切。
要继续,请复制该存储库并导航至示例。
**git clone** [**https://github.com/vincentclaes/datajob.git**](https://github.com/vincentclaes/datajob.git) **cd datajob/examples/data_pipeline_simple**
配置 CDK
要配置 CDK,您需要 AWS 凭据。如果您不知道如何配置您的 AWS 凭证,请遵循这里的步骤。
**export AWS_PROFILE=default**# use the aws cli to get your account number
**export AWS_ACCOUNT=$(aws sts get-caller-identity --query Account --output text --profile $AWS_PROFILE)****export AWS_DEFAULT_REGION=eu-west-1**# bootstrap aws account for your region
**cdk bootstrap aws://$AWS_ACCOUNT/$AWS_DEFAULT_REGION** ⏳ Bootstrapping environment aws://01234567890/eu-west-1...
CDKToolkit: creating CloudFormation changeset...
✅ Environment aws://01234567890/eu-west-1 bootstrapped.
部署
使用包含您的代码的粘合作业和将编排粘合作业的 Step Functions 状态机创建 DataJob 堆栈。
**cdk deploy --app "python datajob_stack.py" --require-approval never**data-pipeline-simple:deploying... [0%] start: Publishing
[50%] success: Published
[100%] success: Published data-pipeline-simple: creating CloudFormation changeset...
✅ data-pipeline-simple
当cdk deploy
成功完成时,服务被配置并准备好执行。
执行
触发将编排数据管道的步骤函数状态机。
**datajob execute --state-machine data-pipeline-simple-workflow** executing: data-pipeline-simple-workflow
status: RUNNING
view the execution on the AWS console: *<here will be a link to see the step functions workflow>*
终端将显示一个到 step functions 网页的链接,以跟进您的管道运行。如果您单击该链接,您应该会看到如下内容:
破坏
一旦您的数据管道完成,将其从 AWS 中移除。这将为您留下一个干净的 AWS 帐户。
**cdk destroy --app "python datajob_stack.py"** data-pipeline-simple: destroying...
✅ data-pipeline-simple: destroyed
数据作业的一些功能
1。使用 Glue Pyspark 作业处理大数据
在示例中找到更多信息。
2.部署隔离管道
在 CDK 中将阶段指定为上下文参数,以部署隔离管道。典型的例子有dev
、prod
、...
cdk deploy --app "python datajob_stack.py" --context stage=dev
3.并行编排步骤功能任务
为了加速数据管道,您可能希望并行运行任务。这可以通过 DataJob 实现!我借用了气流的概念,您可以使用操作符>>
来协调不同的任务。
with StepfunctionsWorkflow(datajob_stack=datajob_stack, name="workflow") as sfn:
task1 >> task2
task3 >> task4
task2 >> task5
task4 >> task5
DataJob 指出哪些任务可以并行运行,以加快执行速度。
一旦我们部署并触发,您将在步骤功能执行中看到并行任务。
在示例中找到更多信息。
4.出错/成功时通知
在一个StepfunctionsWorkflow
对象的构造函数中为参数notification
提供一个电子邮件地址。这将创建一个 SNS 主题,该主题将在失败或成功的情况下触发。该电子邮件将在其收件箱中收到通知。
with StepfunctionsWorkflow(datajob_stack=datajob_stack,
name="workflow",
notification="email@domain.com") as sfn:
task1 >> task2
5.将您的项目打包成一个轮子,并将其发送到 AWS
传送您的项目及其所有要粘附的依赖项。通过在 DataJobStack 的构造函数中指定project_root
,DataJob 会寻找一个轮子(。whl 文件)放在 project_root 的dist/
文件夹中。
current_dir = str(pathlib.Path(__file__).parent.absolute())with DataJobStack(
scope=app, id="data-pipeline-pkg", project_root=current_dir
) as datajob_stack:
在示例中找到更多信息
6.添加 Sagemaker 以创建 ML 管道
使用 Glue、Sagemaker 和 Step 函数查看 GitHub repo 上的端到端机器学习管道的新示例。
⚠️ 给我一个回复,告诉我你喜欢什么,不喜欢什么,以及你希望在 DataJob 中看到的其他服务! ⚠️
https://github.com/vincentclaes/datajob
文森特·克拉斯
👋如果您想了解更多关于 ML 工程和 ML 管道的信息,请关注我的 Medium 、 Linkedin 和 Twitter 。
使用 Pytorch 深度学习框架的序列和图像数据集的数据加载器
原文:https://towardsdatascience.com/dataloader-for-sequential-data-using-pytorch-deep-learning-framework-part-2-ed3ad5f6ad82?source=collection_archive---------11-----------------------
教程使您能够使用 PyTorch 为任何类型的数据集编写数据加载器
塔米姆·汗在 Unsplash 上拍摄的照片
深度学习和机器学习算法正在统治这个世界。PyTorch 是最常用的深度学习框架之一,用于实现各种深度学习算法。另一方面,基于学习的方法本质上需要一些带注释的训练数据集,模型可以使用这些数据集来提取输入数据和标签之间的关系。为了向神经网络提供数据,我们定义了一个数据加载器。在这篇博客中,我们将看到如何在 PyTorch 框架中为不同的数据集编写数据加载器。
影像数据集的数据加载器
我们将致力于狗和猫的图像分类问题。我们必须对给定的图像是猫还是狗进行分类,数据集可以从这里下载。训练数据集总共包含 25,000 幅图像。由于这是一个分类问题,狗的标签是“ 0 ”,猫的标签是“ 1 ”。
让我们从导入所有需要的库开始。
import os
from PIL import Image
import torch
from torch.utils.data import DataLoader, Dataset
import torchvision.transforms as transforms
import torch.nn as nn
PyTorch 框架的数据集类被定义为一个类,其基本结构如下
class data(Dataset):
def __init__(self, param1, param2):
#the function is initialised here
def __len__(self):
#the function returns length of data
def __getitem__(self, index):
#gives one item at a time
- 这个类的最终目的是使用函数 getitem,一次提供一个数据点。这是通过使用索引完成的,索引在内部传递给函数,使用 Dataloader 中定义的采样器函数(将在接下来的博客中讨论)。
- 当初始化数据集的对象时,调用函数 init 。在这里,您可以传递多个对编写 getitem 有用的参数。
- len 函数用于返回数据集的总长度。在此基础上,将生成索引,然后提供给 getitem 。
狗与猫数据集的格式如下:
data/
- dog_1.jpg
- dog_2.jpg
...
...
...
- cat_1.jpg
- cat_2.jpg
...
...
...
现在,我们已经了解了编写数据加载器所需的组件,让我们更深入地研究我们的用例。
class data(Dataset):
def __init__(self, path, transform):
self.files = os.listdir(path)
self.transform = transform
self.path = path def __len__(self):
return len(self.files) def __getitem__(self, index):
filename = self.files[index]
input = Image.open(os.path.join(self.path, filename))
label = 0 if filename.find("dog")>=0 else 1
img_as_tensor = self.transform(input)
return img_as_tensor, labeltransformations = transforms.Compose(
[transforms.Resize((224,224)),transforms.ToTensor()]
)
path = "./data"
train_dataset = data(path, transformations)
dataloader = DataLoader(train_dataset, batch_size=Train_Batch_Size, shuffle=True)
- 我们先来了解一下 init 这个函数。类数据用两个参数初始化,路径和转换,它们作为参数传递给 init 。当我们声明这个类的一个对象时,它在内部调用 init ,其中存储了文件名列表 self.files 、 self.transform 中的转换和 self.path 中的路径。
- 由于 len 用于返回整个数据集的长度,所以我使用了 len(self.files) 来返回相同的长度。
- 函数 getitem 是最关键的,它加载图像,然后调整大小,再转换成张量。这里要注意的一件重要事情是,提供给神经网络的数据应该总是被归一化。我们使用转换来处理规范化。ToTensor() 。最后, getitem 返回两个东西,对应数据点的 image_as_tensor 和 label 。
在初始化类数据之后,我们使用一个数据加载器函数,该函数自动将所有数据批处理到一个定义的批处理大小。因此,如果您的原始数据点大小为(3,224,224)(从 getitem 获得),则数据加载器的每一项都将具有大小( batch_size ,3,224,224),即它会自动采样 batch_size 个数据点。这在我们的例子中是可能的,因为图像的大小是恒定的,所以 DataLoader 函数能够自动创建批处理。然而,在像自然语言处理这样的情况下,当大小不恒定时,我们需要编写自己的批处理函数。
顺序数据集的数据加载器
让我们处理顺序数据集,即句子、时间序列、音频等。现在。这里 getitem 将不再给我们相同大小的数据点。例如,考虑情绪分类的任务(这里解释),那么一句话可以是“航班服务非常好”,另一句话可以是“我没有把行李放在传送带上,可怜的服务。”这里两个句子的长度不同。
为了解决这个问题,让我们先回答三个问题。
- 什么是批处理?—批处理意味着将多个数据点的张量合并成一个张量
- 为什么我们需要批处理?—批处理用于加快计算速度,因为通过批处理,我们可以一起处理多个数据点,而不是一次只处理一个。
- 批处理是如何完成的?—因为我们在这里合并了多个张量,所以张量在每个维度上的大小需要相同。因为我们的数据点大小不一,所以我们面临一个问题。
我们现在主要需要解决配料问题。
出于我们在这里讨论的目的,我们将使用 IMDB 数据集,它是一个审查数据集,可以从这里下载。由于我们在这里处理的是句子,处理数据集的方式会有所不同。由于神经网络只理解数字,而不是单词,我们必须将每个单词转换成数字。为了做到这一点,我们必须建立一个词汇表,如下面的代码所示。
- 函数 reader 用于读取全部数据,它返回所有句子和标签的列表,负面评论为“ 0 ,正面评论为“ 1 ”。
- 函数 build_vocab 将数据和最小字数作为输入,并将每个单词到唯一数字的映射(名为“ word2id ”)作为输出。对于向前的每个未知单词,对应的数字将是 1。
继续为顺序数据集编写数据集类。我们的目标是在给定索引的情况下,一次输出一个项目。
由于上面已经讨论了不同功能的功能,我将简要回顾一下。
- 函数 init 采用 word2id 映射和 train_path 。然后 init 调用阅读器获取句子对应的数据和标签。
- 函数 len 返回整个数据集的长度,即自身数据
- 函数预处理将输入的句子转换成一个数字张量,其中每个数字对应于句子中的单词。
- 函数 getitem 用于在索引的帮助下,一次输出一个已处理的数据点。
接下来解决每个数据点大小不同的问题。以下代码定义了 collate_fn 。该函数用于处理不同大小的批处理数据点。
train_dataset = Dataset_seq(word2id, train_path)
train_dataloader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True,collate_fn=collate_fn)
这里要注意的一点是,在元组列表中,每个元组可以具有不同的大小,但是在张量中,沿着所有维度的大小需要相同,以便合并它们。
自动给 collate_fn 一个名为data的输入,这是一个长度等于批处理大小的元组列表。每个元组包含数字的十进制数( seq 从 getitem 返回)和它们对应的标签。为了简单起见,我们将分别称它们为序列和标签。因此,最终我们必须转换每个序列,使它们的大小保持不变。为此,我们执行零填充,如上面的代码所示。由于零填充统一用于整个数据集,因此模型知道它没有多大用处,它只是表示浪费值。
我们已经达成了一个解决方案,但问题仍然存在,这是一个最佳的解决方案吗?如果所有序列的原始大小相差很大,或者换句话说差异很大,我们最终会浪费大量填充零的 GPU 内存,这最终是没有用的。必须有一个更好的方法来最小化零填充的需求!这个问题及其解决方案在这里讨论。
成为 介质会员 解锁并阅读介质上的许多其他故事。关注我们的 中的 ,阅读更多此类博文。
Datameer —简单转换
原文:https://towardsdatascience.com/datameer-simple-transformations-8773709d7e42?source=collection_archive---------18-----------------------
苏珊·d·威廉姆斯在 Unsplash 上的照片
我的一个数据工程团队成员正在处理一项新的业务需求。他碰巧遇到了一个相对较新的 SaaS 工具,来自一个已经建立的数据播放器“ Datameer ”。
该工具相当新,支持“拖放”功能。
不管怎样,我们开始吧。首先,让我向您展示一些我今天正在处理的样本数据。在我的雪花数据库帐户中,我有两个表,一个维度和一个事实。
D_Tracks :
作者图片
F_Streams :
作者图片
今天的目标是简单地找出一首歌每天播放了多少次。从技术上讲,我们只需要三列,即日期、曲目名称和计数。此外,我们只想要那些每天播放不止一次的歌曲——我们感兴趣的是一首歌的受欢迎程度。
假设您已经用 Datameer SaaS 配置了雪花,让我们看看代表/实现上述需求的解决方案有多容易:
步骤 1 :将数据集导入 Datameer SaaS 工具
作者图片
第二步:点击“新建转换”按钮,选择“公式”
作者图片
第三步:将 Time_Stamp 转换成日期
作者图片
出现提示时,选择“Time_Stamp”列并输入以下公式:
TO_DATE(来源。时间戳)
步骤 4 :用“F_STREAMS_WITH_DATES”重新命名新“配方”
作者图片
第五步:点击“F_STREAMS_WITH_DATES”后的新建转换按钮,这次选择“Blend”
作者图片
请注意,我们正在尝试在“Tracks_Key”列的“F_STREAMS_WITH_DATES”和“D_TRACKS”之间执行内部连接。
为此,请执行以下操作:
作者图片
这将帮助我们创建一个新的“配方”,如下一个流程图所示。
作者图片
步骤 6 :现在添加一个新的聚合转换
作者图片
这个想法是根据日期和曲目名称对唱片进行分组。此外,我们将创建一个计数列,这将有助于我们过滤掉播放次数少于两次的记录。
为了实现上述目标,只需浏览下图:
作者图片
需要注意的是,数据现在看起来如下:
作者图片
第 7 步:删除计数≤ 1 的数据
作者图片
这次一定要选择“过滤器”转换。
作者图片
非常简单,向数据集添加一个新的过滤器,只返回计数大于 1 的记录。
第八步:根据日期对记录进行排序
作者图片
最后,我们需要选择“SQL”转换,在我们的食谱上编写标准的 ANSI SQL,并返回按日期升序排序的结果。
我们的流程目前看起来如下:
作者图片
这是按如下方式完成的:
select * from F_STREAMS_DATES_TRACKS_AGG_G1 AS FG1
ORDER BY FG1.TIME_STAMP;
32 条记录的最终数据集如下所示:
作者图片
现在,如果我们想要编写完整的 SQL 代码,我们可以在同一个工具的 SQL 输入选项中执行以下操作:
SELECT TO_DATE(FS.Time_Stamp) as Stream_Date, DT.Track_Name, COUNT(FS.Streams_Key)
FROM EDW.FACTS.F_STREAMS as FS
INNER JOIN EDW.DIMS.D_Tracks DT ON FS.Tracks_Key = DT.Tracks_Key
GROUP BY TO_DATE(FS.Time_Stamp), DT.Track_Name
HAVING COUNT(FS.Streams_Key) > 1;
我们对 data meer——简单转换——的讨论到此结束。如果你有任何问题,请随时联系我。
https://www.datameer.com/blog/datameer-offers-innovative-new-saas-data-transformation-solution/?utm_campaign=Transform%20Data%20in%20Snowflake&utm_source=SnoCo&utm_medium=Organic&utm_term=Post&utm_content=Simple-transformations
DataOps 自动化——使用 Bicep 创建与 git 集成的 Azure 数据工厂
原文:https://towardsdatascience.com/dataops-automation-creating-azure-data-factory-with-git-integration-using-bicep-376fd3b5bc81?source=collection_archive---------10-----------------------
Azure Data Factory 的一个重要特性是 git 集成,它允许我们将 Azure Data Factory 工件置于源代码控制之下。这是在以后实现持续集成和交付的必要步骤,那么为什么不用 Bicep 以完全自动化的方式将基础设施作为代码来配置呢?
作者准备的图像
在微软官方文档中有一个很好的主题,解释了如何通过 Azure 门户将 Azure 数据工厂与 git 集成。在这篇文章中,我将解释如何使用 Bicep(Azure 的新 IaC 语言)来实现这一点,以便将这一步包含到您的 CI/CD 流程中,以及如何只在需要的环境中部署。
Azure 数据工厂 Git 集成
好的,但是为什么我需要在 ADF 上使用 git 呢?为了解释这一点,我将列出 git 集成提供的一些优势,摘自微软的文档:
源码控制
随着您的数据工厂工作负载变得至关重要,您可能希望将您的工厂与 Git 集成,以利用如下几个源代码控制优势:
- 跟踪/审计变更的能力。
- 能够恢复引入错误的更改。
部分保存
针对数据工厂服务进行创作时,不能将更改保存为草稿,所有发布都必须通过数据工厂验证。无论您的管道没有完成,或者您只是不想在计算机崩溃时丢失更改,git 集成都允许数据工厂资源的增量更改,而不管它们处于什么状态。配置 git 存储库允许您保存更改,仅当您测试了您满意的更改后才发布。
协作和控制
如果您有多个团队成员为同一个工厂工作,您可能希望让您的团队成员通过代码审查过程相互协作。您还可以设置您的工厂,这样不是每个贡献者都有相同的权限。一些团队成员可能只被允许通过 Git 进行更改,只有团队中的某些人被允许将更改发布到工厂。
更好的 CI/CD
如果您正在使用连续交付流程部署到多个环境中,git 集成使得某些操作变得更加容易。这些行动包括:
- 将您的发布管道配置为在您的“开发”工厂发生任何更改时自动触发。
- 定制工厂中可作为资源管理器模板中的参数的属性。只保留所需的一组属性作为参数,并对其他所有内容进行硬编码是非常有用的。
更好的性能
一个集成 git 的普通工厂的加载速度比一个针对数据工厂服务的创作快 10 倍。这种性能改进是因为资源是通过 Git 下载的。
Git 集成仅适用于开发环境
微软推荐了两个流程来在 ADF 上执行 CI/CD,(你可以在这篇文章上查看),在这两种情况下,开发仅发生在开发数据工厂工作区中,并且工件通过 CI/CD 部署来提升。这意味着我们不应该为非开发环境(如 UAT 或生产环境)创建这种集成。我还将介绍如何识别环境并为您的开发环境创建集成:)
逐步为 Azure 数据工厂创建 Bicep 模板
为了使解释简单,我将展示二头肌文件的每个阶段。每个阶段都是一个可部署的文件,您可以使用命令单独执行
*az deployment group create -f <your file>.bicep -g <your resource group>*
最后,我们将有完整的文件可供使用。
创建数据工厂工作空间
在第一阶段,我们只创建具有最基本配置的工作区。您可以看到,对于位置,我们使用的是执行此部署的资源组的位置。
链接 GitHub 和 Azure 数据工厂
在这个阶段,我们实现了这篇文章的第一个目标:创建 **git 集成。**我包含了与 GitHub repo 连接所需的参数,然后是“属性”部分。现在让我们检查参数:
- 帐户名 - 这是你的 GitHub/Azure DevOps 帐户名。
- repositoryName -你的存储库的名称,注意开头不需要你的帐户名。
- collaborationBranc -将用于集成您的特性分支的分支。这将取决于你的分支策略。对于 git 流应该是开发分支,对于 GitHub 流应该是主/主。
- root folder——您的 repo 中的文件夹,databricks 工件将在其中进行版本控制。
- projectName -该参数仅用于 Azure DevOps。这是您的 repo 的团队项目名称。
- 类型——这个参数定义你的回购是托管在 GitHub 还是 Azure DevOps 上。对于 GitHub,该值必须为:
FactoryGitHubConfiguration
对于 Azure Devops,该值为:
FactoryVSTSConfiguration
作者准备的图像
检查环境
如上所述,我们必须只在开发环境中创建 git 集成。如果你只使用 GitHub 或者 Azure DevOps,这个阶段对你的场景应该足够了。要检查这一点,我们需要以下步骤:
- 一个环境参数。
- 将 repoConfiguration 的内容提取到外部变量。
- 使用三元 if 来检查提供的环境是否是开发。如果是,则使用该变量,如果不是,则使用空组。
作者准备的图像
这个阶段的二头肌锉刀:
将 GitHub 或 Azure DevOps 链接到 Azure 数据工厂
如果在你的场景中你既有 Azure DevOps 又有 GitHub,你可以准备你的模板来支持它。这个模板更加灵活,可以用在更多的场合。让我们检查一下与上一个的不同之处:
- 包括一个“用户友好的”参数来指示回购的类型。
- 检查类型参数并创建一个具有预期值的变量。
- 创建两个配置,一个用于 GitHub,一个用于 Azure DevOps。
- 如果嵌套在第一个三元组中,则包含另一个三元组
作者准备的图像
下面你可以查看最终的二头肌模板:
现实生活中的例子
为了在更现实的情况下检查这些例子,我一直在 GitHub 的一个存储库中工作,使用管道配置和工作的例子。你可以在 DevOps Nights GitHub 这里查看:【github.com】DevOps Nights/azuredevops-YAML-quick start-templates
在这篇文章中,我展示了如何将这个二头肌模板用于 Azure DevOps 管道。
我希望这篇文章能帮助你以更自动化的方式创建你的 ADF,下一篇文章再见!
参考
源代码管理— Azure 数据工厂|微软文档
工厂—配置工厂回购— REST API (Azure 数据工厂)|微软文档
Microsoft.DataFactory/factories 2018–06–01—ARM 模板参考|微软文档
Datapane 的新特性:用几行代码用 Python 创建一个漂亮的仪表板
原文:https://towardsdatascience.com/datapanes-new-features-create-a-beautiful-dashboard-in-python-in-a-few-lines-of-code-a3c44523292b?source=collection_archive---------18-----------------------
Datapane 现在支持 Pandas Profiling、代码、图像、定制布局等等!
作者图片
动机
在清理数据、创建漂亮的可视化效果并获得一些有用的见解后,您希望与您的社交网络、朋友或经理分享您的发现,但发现使用 Jupyter Notebook 很难做到这一点。
你可以使用 Binder 或 GitHub 来分享你的笔记本,但是它们不是交互式的,而且你需要时间来做这件事。
有没有一种方法可以使用 Python 用几行代码为您的发现创建如下所示的报告?
由作者创建
这时 Datapane 就派上用场了。
什么是 Datapane?
Datapane 是一个 API ,面向用 Python 分析数据的人,他们需要一种方式来分享他们的结果。我在上一篇文章中解释了 Datapane 的一些基本组件,例如:
- 熊猫数据帧
- 来自 Python 可视化库的绘图,如 Plotly 、 Bokeh 、 Altai r 和fo 叶
- 降价
但是自从我的上一篇文章以来,Datapane 已经引入了更多的组件,包括:
- 数据表
- 代码、HTML 和文件
- 布局、页面和选择
要安装 Datapane,请键入
pip install -U datapane
在 D atapane 上注册以获得您自己的令牌,并使用该令牌登录 Datapane:
import datapane as dp dp.login('YOUR_TOKEN')
数据表
DataTable 块将 pandas 数据帧呈现为报表中的交互式表格,以及高级分析选项,如 SandDance 和 Pandas Profiling 。
让我们使用数据表块为虹膜数据集创建一个报告。使用dp.DataTable
创建一个表格。使用dp.Report(table).publish()
为您的报告创建一个网站。
输出:
点击https://datapane.com/u/khuyentran1401/reports/iris/查看报告。单击该链接时,您应该会看到类似如下所示的内容:
点击“在 SandDance 中分析”,如下图所示。
作者 GIF
点击“熊猫概况”从熊猫数据框架生成概况报告。您应该会看到如下所示的内容。
作者 GIF
通过使用 DataTable,你不仅在网站上有一个漂亮的表格,还可以使用 SandDance 或 Pandas Profiling 分析数据,而无需添加任何代码!
文件和代码
图像
您可以使用datapane.File
在报告中呈现图像或文件:
密码
有时,您可能不仅想显示输出,还想显示用于创建该输出的代码片段。要在报告中呈现代码,只需将datapane.Code
放在代码周围。
您的报告中将会呈现如下美丽的代码!
布局、页面和选择
Datapane 报告的默认视图很好,但是如果您想进一步定制它,您可以使用 Group、Page 和 Select 等组件。
选项卡和选择
如果您想在报告中的多个块之间交互切换,比如在输出和源代码之间切换,您可以使用dp.Select
。
上面的文字云图是分析这篇链接文章的结果。
现在你可以点击“WordCloud”标签查看图片,点击“源代码”标签查看源代码!
组
如果您想让两个或三个组件并排,您可以使用dp.Group
现在你的表和图应该像下面这样并排放置!
页
与 Select 和 Group 相比,Page 是更高级别的组件。页面允许您在一个报告中有多个页面。
和
通过运行上面的代码,您的报告应该有 2 页,如 WordCloud 和 Iris,如下所示!
奖励:使用 Datapane 的端到端项目
就是这样!如果您想使用 Datapane 的组件查看一个完整的项目,我创建了一个端到端的项目,它可以生成一个报告,总结一篇文章,查找关键词,并获取这篇文章中最常见的单词。
以下是该项目的报告。在这里随意玩的源代码。
https://datapane.com/u/khuyentran1401/reports/analyze-article/
结论
恭喜你!您刚刚学习了如何使用 Datapane 的新特性在 Python 中创建漂亮的报告。现在,您可以创建一个报告来展示您的分析结果,并与您的队友、利益相关者或您的社交网络共享,而不是共享枯燥的代码!
我喜欢写一些基本的数据科学概念,并尝试不同的数据科学工具。你可以在 LinkedIn 和 Twitter 上和我联系。
如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如:
数据准备。清理:加速数据清理
原文:https://towardsdatascience.com/dataprep-clean-accelerate-your-data-cleaning-83406b4645bf?source=collection_archive---------27-----------------------
清理数据的更好方法
摄 Unsplash 上的创意交流
作者: 布兰登洛哈特 和 爱丽丝林
DataPrep 是一个旨在提供用 Python 准备数据的最简单方法的库。为了解决数据准备中繁重的数据清理步骤,DataPrep 开发了一个新组件: DataPrep。清洁。
数据准备。Clean 包含简单有效的函数,用于清理、标准化和验证数据帧中的数据。这些函数使用统一的界面来执行各种类型数据所需的通用数据清理操作。
本文演示了如何使用 DataPrep。清理以简化和加速数据清理任务。
不正确或不一致的数据会导致错误的结论。因此,数据科学家必须清理他们的数据,以确保结果的准确性。然而,数据清理消耗了数据科学家很大一部分工作时间——根据最*的一项调查显示占 26%——并且通常被认为是单调乏味的工作。
数据清理任务通常涉及编写正则表达式以确保值遵循允许的模式,以及编写脚本来转换和标准化值,这可能很困难且容易出错。此外,这些任务通常是特定于数据或领域的,并且需要针对每个数据集重新执行。
为什么是 DataPrep。干净?
DataPrep 有三个原因。Clean 是 Python 中数据清理的理想工具:
- 统一的 API: 每个函数遵循简单的命名约定,
clean_*type*()
和validate_*type*()
,其中 type 是感兴趣的语义数据类型。 - **效率:**使用并行计算库 Dask 处理数据,实现快速性能。
- **透明度:**执行清洗功能后,会生成一份报告,描述对数据所做的更改。
让我们从 DataPrep.Clean 开始。
装置
您可以使用以下命令安装带有pip
的 DataPrep:
pip install -U dataprep==0.3.0a0
这是一个 alpha 版本,DataPrep 版即将发布。
加载数据集并开始使用
我们将使用来自 DataPrep 内部数据集存储库的数据集waste_hauler
。让我们从加载 DataPrep 开始。将函数和数据集清理到 pandas 数据框架中:
from dataprep.clean import *
from dataprep.datasets import load_dataset
df = load_dataset('waste_hauler')
让我们来看看数据集:
df.head()
请注意,列标题中的单词是大写的,并用空格分隔。然而,使用 snake case 样式的标题更容易,因为在输入标题时不需要按住 shift 键,并且可以将每一列作为 DataFrame 的属性直接访问(例如,df.local_address
)。要转换标题,我们可以使用函数clean_headers()
,该函数将数据帧作为输入,并以所需的样式返回带有标题的数据帧:
df = clean_headers(df)
df.columns
clean_headers()
默认情况下将标题转换成蛇盒,然而,也支持许多其他样式。查看用户指南了解更多信息。
数据标准化
数据准备。Clean 提供了解析、重新格式化和标准化列中的值的简单函数。这些函数遵循命名约定clean_*type*()
,其中 type 是要清理的列的数据类型(比如电话号码或电子邮件地址)。DataFrame 和列名作为输入传递,DataFrame 返回一个包含指定列的清除值的新列。数据也可以通过指定参数inplace=True
就地清除*。*
让我们看看如何使用 DataPrep.Clean 标准化电话号码和街道地址。
电话号码
我们来看看专栏phone
:
df.phone.head()
正如我们所见,电话号码有不同的格式。为了标准化它们的格式,我们可以使用函数clean_phone()
,默认情况下,该函数会将所有电话号码转换为 NPA-NXX-XXXX 格式。clean_phone()
接受一个 DataFrame 和要清理的列的名称作为输入,它返回原始 DataFrame,并添加了一个包含标准化电话号码的新列phone_clean
。
df = clean_phone(df, 'phone')
df[['phone', 'phone_clean']].head()
此外,在调用clean_phone()
之后,会打印一份摘要报告,描述为清理列而对数据进行的更改以及结果列中数据的质量:
要以(NPA) NXX-XXXX 格式输出电话号码,我们可以将output_format
参数设置为national
:
df = clean_phone(df, 'phone', output_format='national')
df[['phone', 'phone_clean']].head()
有关clean_phone()
的更多信息,请查阅用户指南。
街道地址
接下来,我们来看看local_address
栏目:
df.local_address.head()
这些地址表示中有几处不一致。例如,用“AVE .”(索引 0)和“AVENUE”(索引 1)表示“大道”,或者用“EAST”(索引 3)和“E”(索引 4)表示“东”。为了标准化这些不一致,我们可以使用函数clean_address()
:
df = clean_address(df, 'local_address')
df[['local_address', 'local_address_clean']].head()
现在列local_address_clean
中的每个地址都有相同的、一致的格式。
我们可能还想从地址中提取成分,比如城市和州。我们可以通过将参数split
设置为True
来实现这一点,这将在数据帧中为每个地址组件创建一个新列。让我们用split=True
调用clean_address()
,看看新的列:
df = clean_address(df, 'local_address', split=True)
这些单独的组件使用户可以轻松地根据需要设置地址格式,或者对城市和州执行汇总分析。
有关clean_address()
的更多信息,请查看用户指南。
数据有效性
数据验证是指确保数据是正确的和正确表示的过程。数据准备。Clean 提供了验证各种数据类型的函数。数据验证函数遵循命名约定validate_*type*()
,其中类型是要验证的语义数据类型的名称。
每个验证函数都将一个数据序列作为输入,并返回一个布尔序列,指示每个值是否属于指定的数据类型。例如,让我们在系列df['email']
上使用函数validate_email()
:
df['valid_email'] = validate_email(df['email'])
df[['email', 'valid_email']].head()
正如我们所看到的,email
列中的一些值是有效的电子邮件地址,其他的不是,并且validate_email()
适当地返回 True 和 False。此外,我们可以过滤数据集,以识别电子邮件地址不正确的记录:
df[~validate_email(df['email'])].dropna()
正如我们所见,email
列的这些行错误地包含了文本和日期。因此,validate_email()
支持快速识别这些值,以便数据科学家可以根据需要删除或更正无效的电子邮件地址。
数据类型检测
接下来,我们将看到 DataPrep。Clean 可用于语义数据类型检测。虽然数据集经常伴随着指示各自列中数据类型的信息性列名,但有时并非如此,标识每一列的数据类型会很有用。或者,您可能有大量的列或多个数据集,并且希望标识具有特定数据类型的列,这可能很困难并且很耗时。
下面是一个识别每一列的数据类型的函数,专门检查电话号码、电子邮件地址、街道地址和日期。
def detect_data_types(df, thresh):
ls = []
for col in df.columns:
n = len(df[col].dropna())
if validate_phone(df[col].dropna()).sum() / n > thresh:
ls.append((col, "phone"))
elif validate_email(df[col].dropna()).sum() / n > thresh:
ls.append((col, "email"))
elif validate_address(df[col].dropna()).sum() / n > thresh:
ls.append((col, "address"))
elif validate_date(df[col].dropna()).sum() / n > thresh:
ls.append((col, "date"))
return pd.DataFrame(ls, columns=["Column Name", "Data Type"])
detect_data_types()
将数据帧df
和阈值thresh
作为输入。对于df
中的每一列,validate_*type*()
函数用于确定该列中有多少值满足每种数据类型。如果满足该类型的值的比例大于thresh
,则该列被确定为该类型。
让我们调用阈值为 0.8 的detect_data_types()
:
df_types = detect_data_types(df, thresh=0.8)
df_types
正如我们所看到的,地址、电话和电子邮件数据类型被正确识别。此外,列created
被标识为包含日期,这对于从列名中推断是很重要的。
结论
随着许多领域的数据收集呈指数级增长,不同技能水*的用户需要从数据中获得洞察力。为了避免垃圾入,垃圾出的老生常谈,需要执行数据清理,这可能是困难的、耗时的和乏味的。
数据准备。Clean 通过其简单的 API 有可能将数据清理从每个数据科学家存在的祸根变成一个快速而简单的过程。
数据准备。Clean 目前包含以下功能:
- 列标题
- 国家名称
- 日期和时间
- 电子邮件地址
- 地理坐标
- IP 地址
- 电话号码
- 资源定位符
- 美国街道地址
并且目前正在开发更多的功能。
了解更多关于 DataPrep 的信息。清洁,查看用户指南和 API 参考。
数据准备。连接器:从 API 检索数据的最简单方法
原文:https://towardsdatascience.com/dataprep-connector-the-easiest-way-to-retrieve-data-from-apis-ea50422268a1?source=collection_archive---------23-----------------------
数据准备。连接器使得从流行的 API 获取数据变得轻而易举。如果不支持某个 API,只需几个简单的步骤就可以自己添加了!
迪米特里·卡拉斯泰列夫在 Unsplash 上的照片
摘要: 数据准备。Connector 是 Python 的 DataPrep 库的一个组件,可以加速数据加载。该工具减少了在项目中设置数据加载所需的开销。它功能强大且高效,允许开发人员以快速、熟悉且可重复的方式加载数据。
数据加载瓶颈
数据科学家 19%的工作时间花在加载数据上[1]。收集数据的开销占用了不必要的时间,并且是重复性的。从数据库或通过 API 检索数据所需的代码几乎总是相同的。数据收集很耗时,但也不尽然。数据准备。Connector 是一个易于使用的、开源的、轻量级的库,可以帮助您快速地从 web 资源中获取数据。
介绍 DataPrep。连接器
数据准备。连接器(或连接器)通过对开发人员隐藏实现细节来加速数据加载。从 web API 加载典型的数据需要设置身份验证和授权,发出 HTTP 请求,并牢牢掌握 API 文档。让这些任务的开销适应不同的 API 会很快失控。
图 1:在没有连接器的情况下,将多个服务合并到您的项目中所产生的组合爆炸
Connector 是一个工具,它包装 web 数据源,并使它们在一个直观、快速且可重复的工作流中工作。将数据加载到项目中需要更少的时间和代码。
让我们来看看连接器的运行情况。假设我们想从 Spotify 中检索 Kanye West 的所有专辑。有三个简单的步骤。
第一步:创建开发者账户
登录 Spotify 开发者仪表盘,向他们注册一个项目。这将允许您获得调用 API 所需的授权。获得正确的 auth 是 Connector 不能为您做的一件事,并且您将需要它用于大多数 API。
第二步:安装 DataPrep
您终端中的一个简单的 pip 命令将为您解决这个问题。
pip install dataprep
第三步:运行代码!
from dataprep.connector import Connectorclient_id = “your_client_id”client_secret = “your_client_secret”spotify = Connector(“spotify”, _auth={“client_id”:client_id, “client_secret”:client_secret})kanye = await spotify.query(“album”, _q=”kanye west”)display(kanye)
将这个简单的代码与不使用图 2 中的连接器时需要的代码进行比较。
图 2:使用和不使用连接器的相同任务所需的代码(图片由作者提供)
连接器功能强大
连接器不仅仅是一个包装器。您所熟悉的包装器,如 Spotipy 和 Tweepy 在减少与数据加载相关的开销和重复方面做得很好。但是连接器做得更多。它是统一的,可以更快地获取结果。
统一
连接器是一个统一的包装器。与特定 API 的特定包装器(例如专门为 Spotify API 工作的 Spotify)不同,Connector 可以包装任何 web API。这是可能的,因为连接器是开源的。任何人都可以向项目贡献配置文件来支持新的 API(关于配置文件的更多内容将在本文后面介绍)。这意味着 Connector 将在未来不断增加对更多 API 的支持,并将所有 API 调用统一到一个简单的工作流中。
图 3:使用多个 API 的连接器。最大的区别在于 _auth 参数(图片由作者提供)
分页
Web APIs 通常对一次调用可以检索的结果数量有限制。这要求用户了解这些限制,并在结果数量高于限制时处理案例。连接器为用户提供了一个计数参数,该参数允许连接器在后台处理这项工作。为您想要检索的结果数量指定一个值,Connector 将处理其余的结果。
图 4:这些片段显示了 count 参数用于返回结果的精确数量(图片由作者提供)
并发
一些为 count 指定了较大值的请求可能需要很长时间。比方说,如果结果限制是 50,而您的项目需要 250 个结果。当指定计数为 250 时,连接器将一个接一个地调用 API 5 次。这可能需要一段时间。连接器允许您通过 concurrency 参数指定您希望在并行中发出的请求数量。这允许更快地获取结果,因为现在调用不必等待上一个调用完成。
图 5:正在使用的并发参数。请注意检索相同数量的结果所用的时间差异(图片由作者提供)
连接器是怎么做到的
连接器是开源的,这就是为什么它可以支持任何 API。连接器从配置文件库中提取。每个 API 都有自己的配置文件,每个文件都由贡献者编写。如果连接器不支持用户想要访问的 API,他们可以很容易地创建配置文件并将其添加到存储库中。然后,连接器将支持该 API,所有开发人员都可以使用它。如果您有兴趣做出贡献,请查看我们的 APIConnectors 资源库。
连接器的未来
目前,连接器只从 web APIs 加载数据。DataPrep 团队目前正在研究更多访问数据源的方法,比如数据库。用户提供的配置文件也将有助于连接器的发展,我们正在通过直观的 GUI 使添加配置文件变得更加容易。我们在 PyData 2020 上讨论了连接器和其中的一些变化(点击这里查看我们的讨论!)。连接器是 DataPrep 的一个组件,这个库使得准备数据变得轻而易举。还有 DataPrep 的其他组件,比如 DataPrep。EDA 和 DataPrep.Clean。
图 DataPrep 如何处理部分数据准备周期(图片由作者提供)
DataPrep 正在开发更多的特性和组件,以进一步改进数据准备。随着 DataPrep 的增长,Connector 也将增长,加载数据将比以往更加容易。在我们的网站上了解更多关于我们的信息,并关注我们即将发布的版本!
参考文献
[1] Anaconda,2020 年数据科学状况 (2020),2020 年数据科学状况报告
DataPrep v0.3.0 已经发布
原文:https://towardsdatascience.com/dataprep-v0-3-0-has-been-released-be49b1be0e72?source=collection_archive---------20-----------------------
由米卡·鲍梅斯特在 Unsplash 拍摄的照片
DataPrep v0.3.0 上线了!
DataPrep 是一个针对 Python 的开源数据准备库。这是准备数据最简单的方法。DataPrep 为您带来了一套工具,用于数据准备过程的每一步——从收集、清理到可视化,DataPrep 完成了所有工作。在 0.3.0 版本中,它做得更多!
安装
您终端中的一个简单的 pip 命令将为您安装 DataPrep。
pip install dataprep
发布详情
DataPrep 的这个版本为您带来了更多的交互式方法来可视化和比较数据,支持清理更多类型的数据,甚至在获取数据时提供了更好的可用性。
让我们看看 DataPrep 的每个组件在这个版本中都带来了什么。
EDA
数据准备。EDA 是 DataPrep 的探索性数据分析组件。它允许您绘制和可视化数据,并从可视化中收集见解。
EDA 在这个版本中经历了一些大的和显著的变化。现在,您可以比较数据集、可视化地理数据,并更好地控制查看数据的方式。数据准备。EDA 也经历了性能改进。
比较 DataPrep 的 create_report(df)的运行时间。EDA 和 Pandas——通过改变数据大小进行分析(图片由 Weiyuan Wu 拍摄
新功能
- plot_diff():这个新函数允许您比较两个独立的数据集
train = load_dataset(“house_prices_train”)
test = load_dataset(“house_prices_test”)
plot_diff([train, test], progress=False)
plot_diff()的一些输出的快照(图片由作者提供)
- plot()现在支持地理数据的热图!
df = pd.read_csv(“data.csv”)
plot(df, “country”, “Population in thousands (2017)”)
带有地理数据的 plot()输出(图片由作者提供)
可用性
- EDA 团队已经改变了参数定制的方式。它们现在位于配置字典中。这是为了让我们更容易推出新的特性和参数,而不改变整个 API 的构成。让我们看看这是如何工作的:
from dataprep.eda import plot
from dataprep.datasets import load_dataset
df = load_dataset("countries")
plot(df, "Country")
上面的代码产生了下面的图。让我们看一下饼图,看看有哪些参数可供我们配置。这里,我们将选择生成的饼图扇区的数量。然后,我们修改我们的原始代码以包含这种重新配置,如下所示。
从 plot()的输出中检索饼图切片数的参数(图片由作者提供)
from dataprep.eda import plot
from dataprep.datasets import load_dataset
df = load_dataset("countries")
plot(df, "Country", config = {'pie.slices': 3})
更改配置的结果如下所示。
将饼图切片数更改为 3 后的结果(图片由作者提供)
清洁
数据准备。Clean 是 DataPrep 的数据清理工具,允许您清理和标准化不一致或不完整数据集中的多种形式的数据。
Clean 增加了对更多数据类型的支持,使得这个版本的库更加全面。这些功能中的许多已经开发了一段时间,现在 Clean 比以往任何时候都更加全面!
新支持的数据类型
- clean_address() :清理并规范美国街道地址!除了其他功能之外,还支持选择您的首选输出格式以及对地址必须包含的内容的限制。
from dataprep.clean import clean_address
clean_address(df, “address”)
clean_address 的输出(图片由作者提供)
- clean_headers() :清理并标准化列标题。你可以选择你的大小写,替换标题,处理空标题等等
from dataprep.clean import clean_headers
clean_headers(df)
未清理的邮件头(作者图片)
clean_headers()对上一张图片的头的输出(图片由作者提供)
- clean_duplication() :创建一个用户界面,用一组支持的聚类方法清除重复或不一致的数据
具有一些看似重复的值的数据帧
下面的代码生成一个界面,供用户选择如何检测重复项
from clean_duplication import clean_duplication
clean_duplication(df, “city”)
选择语音-指纹聚类方法生成的界面和结果
- clean_date() :清除并标准化日期
- clean_df(): 对数据帧数据执行清理和标准化操作的集成解决方案
- 要了解更多关于 Clean 的最新功能,请点击 查看布兰登和爱丽丝的文章
可用性
- 我们做了一些优化和改进,以保持 Clean 运行顺畅。优化后,所有功能的运行速度比初始实现快 600%到 5000%。
- 文档已经更新,去看看吧
即将到来的变化
- 清理团队正在开发清理整个数据帧的功能。敬请期待!
连接器
数据准备。连接器是 DataPrep 的数据收集组件。通过 DataPrep,您能够以最小的开销轻松地从多个 API 中检索数据。
在这个版本中,Connector 做了一些可用性更新,为即将推出的新功能做准备。
可用性更新
- 我们添加了大量的配置文件来支持更多的 API!我们现在总共支持 30 个常用 API,如果没有我们了不起的贡献者的帮助,我们不可能添加这些 API!如果你想贡献我们支持的 API,请查看我们的 GitHub 。
- 我们还将配置文件 repo 的名称从 DataConnectorConfigs 更新为 APIConnectors,使其更加直观
- 我们网站上的文档已经更新!
即将到来的变化
- 连接器团队目前正致力于通过添加连接器 X 来扩展连接器。ConnectorX 使用户能够以最快和最节省内存的方式将数据从数据库加载到 Python 中。请留意这方面的更多新闻!(我们正在开发一个实验工具,从数据库中收集数据,更多信息请见下文)
感谢您阅读我们对 DataPrep 的最新更新。一如既往,查看我们的网站获取最新消息。
数据的巨大影响
原文:https://towardsdatascience.com/datas-big-whiff-72ed84302752?source=collection_archive---------35-----------------------
行业笔记
如何逃离我们的仪表盘老鼠赛跑,从数据中学习,并再次热爱这份工作。
西格蒙德在 Unsplash 上拍照
愚弄我一次,你真可耻。愚弄我两次,我感到羞耻。愚弄我一千次,我可能是一名数据科学家,回答我一个月前回答的同样的特别问题,想知道为什么我仍然没有从事更有趣的项目,尽管我建造了比福特工厂更多的仪表板,编写了足够的文档来在月球上着陆一辆高尔夫球车。
对于许多数据团队来说,这是土拨鼠日:我们建立仪表板和自助工具,让我们从回答世俗问题中解脱出来,并承诺一旦我们支付了运营费用,就着手制定战略计划。但那一天永远不会到来。不管我们建了多少,永远都不够。我们一直在“为未来投资”,但我们却被困在了现在,被重复的临时问题所占据,我们回答问题的速度和忘记问题的速度一样快。
我们注定要永远进行这种无休止的斗争吗?不,但是我们在错误的地方寻找解决方案。
野生动物在哪里
分析团队可以将他们的工作分成两个粗略的部分。第一个,包括制作仪表板,是关于建立让人们回答问题的系统。它包括为“业务用户”(甚至是狂热的用户)维护商业智能工具,为管理人员创建仪表板,以及在组织中支持一些自助分析的概念。
当我们创造这些工具时,我们试图系统化地去做。我们为我们的工具定义了可读取的治理数据模型;我们监控这些模型的管道,这样我们就可以可靠地检测异常情况;我们策划发现*台,帮助人们找到相关的数据和仪表板。我们甚至创建了一个角色——分析工程师——来拥有和维护这个系统。
虽然我们不一定擅长这个桶里的所有东西,而且很多 T2 人现在对它的实际价值有争议,但 T4 肯定觉得它很有价值。一个很大的原因是,一句话,营销:商业智能及其相关应用程序是作为*台销售的。它们是基础设施,在此基础上可以建造更多的东西。建立这个系统就是投资于组织你的数据,回报是一个更有生产力和数据驱动的未来。
这对我们自己和那些给我们预算的人来说都是一个简单的推销。我们可以主张扩展系统,而不必为构建仪表板或报告进行辩护。我们不是在建造单个的房子;不,我们正在铺设道路和管道,使未合并的土地成为城市;我们在教化未开化的人。对我们所有人来说——尤其是渴望控制的高管——这很有情感吸引力。所以我们扩张;我们建造;我们“投资”
我们的另一半工作是直接做分析。这项工作通常被称为特别分析,[1]尽管有些人称之为高级分析,或者决策科学,或者仅仅是“回答问题”这大概是我们想要做的,而不是建造我们抱怨的仪表盘;我们建立自助工具,我们说,这样我们就可以专注于这种类型的工作。Looker 直接推销这一承诺:“Looker 有助于简化流程,节省宝贵的时间,解放数据科学家,让他们专注于工作中更有价值的方面。”
我们更喜欢这项工作,部分是因为比在仪表板上添加第 1000 个过滤器要简单,部分是因为*这是真正重要的工作。*临时分析旨在支持临时决策。几乎可以说,这些决策是公司做出的最重要的决策——它们是你只能做一次的决策。杰夫·贝索斯著名的单向门是特别分析的东西,而不是 BI 报告或自助仪表板。
然而,没有官方认可的系统来存储这些结论或查找以前做过的事情。它很少存在于我们投入大量时间构建的自助系统的文明围墙之内。是的,它有时建立在支撑 BI 工具的基础元素之上,比如治理 dbt 模型。但它的最终产品——包含分析及其相关建议的材料——通常分散在分析师的电脑中,埋藏在电子邮件和松散的帖子中,建立在不受控制的查询和 Python 笔记本之上,将开发工作与最终建议融为一体。[2]
说得更直白一点,最有价值——也最有趣!—我们作为分析师创造的东西生活在荒野中,而我们精心策划系统来支持垃圾板,它们的建造者讨厌建造,它们的用户不使用。
结果是毁灭性的,它超越了炸毁 数据科学家。仪表板和 BI 报告是用于立即做出决策的操作工具。它们的用处转瞬即逝;它们不能提供持久的价值。我们需要汽车仪表板来驾驶,但我们今天并不是更好的司机,因为我们昨天使用了我们的仪表板。我们从他们身上学到的东西没有一样是持久的。
这是一个令人沮丧的讽刺。我们构建的 BI 系统不会产生价值。特别分析——我们学到的东西,实际上使我们变得更聪明的东西,比如对我们可以采取的行动进行分析,以改善我们的驾驶——确实如此,但我们没有捕捉它的系统。我们投资于转瞬即逝的事物,而抛弃了永恒。
对于一群自以为是科学家的人来说,我们可能不应该忽视科学中最令人厌倦的陈词滥调。[3]但是我们有,因为我们不能站在我们记不起也找不到的东西上。
更好的仪表板,更好的躺椅
我不是唯一一个对此感到沮丧的人,有时候,其他人也很生气。但到目前为止,大多数专注于仪表板和 BI 的解决方案都是不完整的改进。无论我们在系统中做什么——无论我们给予仪表板什么样的新形式,或者我们在它们之上添加多少观察和治理——我们仍然在解决一个无关紧要的问题。真正的问题发生在系统之外:临时性的工作是必不可少的,本质上是不受管制的。再多的“重新想象躺椅”也无法让我们的泰坦尼克号继续航行。
为了逃离我们的仪表板老鼠赛跑——更重要的是,为了帮助我们的组织实际学习和建立持久的知识——我们应该从组织我们的特别分析开始。
不幸的是,对于如何最好地做到这一点,还没有任何明确的答案。充其量,我们已经产生了一系列间接的解决方案。像 Airbnb 的 Knowledge Repo 这样的旧框架,尽管对大多数组织来说可能过于笨重和以研究为导向,但可以作为更容易获得的方法的起点。像 Select Star 和 Workstream 这样的监管工具并不能很好地管理临时工作,尽管它们可以组织它。我们可以从其他学科吸取经验教训,包括支持团队用来构建知识库的流程和为 Reddit 等社交*台提供动力的机制。
对此我有一些其他的想法,我会留到以后的文章中。与此同时,我建议开展一个更简单——甚至可能更有影响力——的活动作为起点:我们不再称特别分析为特别分析。
文字成就工作
1929 年,在加那利群岛进行实验时,德国心理学家 Wolfgang k hler发现他可以向人们展示无意义的形状和单词,人们会一致地将相同的形状和相同的单词配对。
来源:维基百科。
亚当·奥尔特引用了 2103 年《纽约客》一篇关于名字力量的文章中的研究,提出了语言学上的海森堡原则:“一旦你给一个概念贴上标签,你就改变了人们对它的看法。”这个想法超越了通常的说法,即给事物命名会使其具体化;这表明名字可以改变事物本身。
从这个角度来看,即席分析被低估并经常被抛弃也就不足为奇了— 它的名字告诉我们要这样做。
对于作为公司最重要决策背后的智力支持的一类工作来说,“临时”一词有很多不好的含义。这表明这种工作是暂时的,就像草图一样,意在勾勒出一个想法,然后为了更永久的东西而被丢弃。如果你没有沉浸在分析师的语言中,不知道我们的代码,你看不到投资特别分析及其保留的必要性是可以原谅的。想象一下,一个工程师说他们想优先考虑特定的项目,或者一个营销人员正在进行特定的活动。这些事情感觉像是分支,与主要目标无关。难怪我们总是找不到时间去做这件事。
情况变得更糟。“临时”一词不仅削弱了它的价值,而且——按照科勒的说法——它改变了作品本身。通过把它命名为临时的,我们使它成为临时的。把它称为存在于系统之外的东西,我们就把它置于系统之外。我们原谅我们缺乏组织,因为它是由它的无序定义的。
这些影响相互促进。因为临时工作被认为是一次性的,我们没有投资让它持久。因为我们没有投资让它耐用,它被认为是一次性的。为了打破这种循环,我们需要重塑品牌。
一个新名字应该实现三个目标。首先,我们需要强调这项工作的重要性。例如,“战略分析”表明这不是一个次要的项目,而是我们工作中最重要的部分。
第二,我们需要将这项工作放在系统内部,而不是外部。一个组织了一些结果而失去了另一些结果的系统是不组织的;任何地方不受治理的工作都会破坏任何地方的治理。“核心分析”不能成为附属品。
最后,我们需要证明这种类型的工作不是要被丢弃,而是应该被积累。经过一年发现新的结果,我们应该在组织上更聪明,更有见识。[4]“分析研究”不是要被抛弃,而是要被编目、组织和扩展。
我个人不爱这些名字中的任何一个(我不是营销人员;我是一个廉价增长黑客。但是,我们当然可以比特别分析做得更好。我们提出了大数据;我们提出了数据科学;我们提出了决策科学、数据网格和深度学习。作为一个领域,我们不害怕用含糊不清、难以理解的时髦吹捧来装扮 20 年前的技术,这更适合《星际迷航》的场景,而不是公司的单口相声。[5]但在最重要的时候,我们退缩了,选择了低调的拉丁法律术语。
因此,无论如何,让我们停止构建仪表板。但是首先,为了让每个人——包括我们自己——相信我们应该建造的东西的价值,让我们想出一些更好的技术术语。
[1] Gleb 将分析工作流分为三类:自助分析、仪表盘和即席分析。我认为前两类没有太大区别。
[2]是的,在《风尚》中。
[3]我们是一名不关心伤害的医生。我们是一名民权律师,拒绝根据人们的性格来评判他们。我们是一个牧师,对别人做的事从来不会考虑我们希望别人怎么对我们。
[4]这指出了我们目前如何管理特别分析的一个最致命的问题。由于您已经完成的分析,您的组织变聪明了多少?有多少未来的决策会因为你过去做的分析而变得更好?分析应该努力不只是回答一个问题,而是给我们一个下一个问题的开端。
[5]“我们扫描了数据网,舰长。读数发现了与新生命形式一致的异常,星际舰队的决策科学计算机说可以安全调查。但是深度学习扫描,先生——他们没有发现新的东西。事实上,神经网络和十年前的扫描是一样的。先生,我想——我想我们以前来过这里。”
数据集偏见:制度化的歧视还是足够的透明度?
原文:https://towardsdatascience.com/dataset-biases-institutionalized-discrimination-or-adequate-transparency-ae4119e2a65c?source=collection_archive---------32-----------------------
对美国抵押贷款披露法案所做努力的回顾
由谢恩和宾亚明·梅利西从派克斯拍摄的照片合成的图像。
[……]我们为什么需要这样一部法律?在国会于 1975 年颁布 HMDA 法案之前,公众对一些城市居民区(通常是少数民族居民区)的抵押贷款——或者更重要的是,缺乏抵押贷款——表示了相当大的担忧。某些地区似乎在衰落,部分原因是这些地区的居民无法获得房屋抵押贷款。( ClevelandFed )
这是 20 世纪 70 年代某些美国人口中心的悲惨现实之一。获得资本仍然困难,高风险社区的社会流动性几乎不存在。一些人认为银行系统中的制度化种族主义加剧了这一困难。“国会认为,一些金融机构未能以合理的条款和条件向合格的申请人提供足够的住房融资,导致了一些地区的衰落。”( 百科 )
因此,一项动议被提交给国会,以支持所有贷款业务的透明度。他们通过了 1975 年的住房抵押贷款披露法案,强制报告所有贷款申请,然后通过了 1977 年的社区再投资法案,鼓励金融机构帮助满足当地社区的信贷需求。
正如 Investopedia 所解释的那样,HMDA 的使命非常明确:
总的来说,《住房抵押贷款披露法》和《条例 C》的主要目的是监测抵押贷款人的地理目标,为任何掠夺性贷款行为提供识别机制,并向政府提供抵押贷款市场的报告统计数据。
HMDA 帮助支持政府方案发起的社区投资倡议,HMDA 通过统计报告帮助监督这些倡议。HMDA 还帮助政府官员识别任何可能影响抵押贷款发放的掠夺性贷款行为。
HMDA 提交的资料还提供了一种分析政府资源分配的方法,并确保资源被适当分配以资助社区活动。
因此,金融机构必须报告他们的贷款实践,不仅要报告发放的所有贷款,还要报告每一笔贷款申请以及申请人的相关元数据,如种族、性别和社区,以及贷款是被批准还是被拒绝。
从监管的角度来看,现在有了一个镜头,通过这个镜头可以跟踪违反社会*等的行为并实施处罚。这也意味着数据中存在一种有意的偏见——银行业中制度化的种族主义及其所有表现形式。
探索数据
让我们从美国档案馆的房屋抵押贷款披露数据文件(1981 年至 2014 年)中了解一下报道了什么,以及为什么。
(如果你想在家里研究这个数据集,你还需要几个数据集,比如相关的人口普查数据。幸运的是,美国档案馆的超级图书管理员团队为我们将所有东西打包在一个 单页 中。感谢你当地的图书管理员。)
1981–1990
通过研究这些数据,我们发现 1981-1990 年期间主要关注的是追踪退伍军人,他们中的许多人是从越南回来的。更多的问题和数据与退伍军人事务部的申请人有关,如果他们申请贷款时要求财政支持。
编码格式非常简单,只需要一点映射:
[{'NAME': 'respondentName', 'START': 0, 'STOP': 28, 'LENGTH': 28},
{'NAME': 'respondentID', 'START': 28, 'STOP': 36, 'LENGTH': 8},
{'NAME': 'reportMSA', 'START': 36, 'STOP': 40, 'LENGTH': 4},
{'NAME': 'censusTract', 'START': 40, 'STOP': 46, 'LENGTH': 6},
{'NAME': 'state', 'START': 46, 'STOP': 48, 'LENGTH': 2},
{'NAME': 'county', 'START': 48, 'STOP': 51, 'LENGTH': 3},
{'NAME': 'supervisoryAgencyCode', 'START': 51, 'STOP': 52, 'LENGTH': 1},
{'NAME': 'censusValidityFlag', 'START': 52, 'STOP': 54, 'LENGTH': 2},
{'NAME': 'VA_FHA', 'START': 54, 'STOP': 55, 'LENGTH': 1},
{'NAME': 'vaNumLoans', 'START': 55, 'STOP': 59, 'LENGTH': 4},
{'NAME': 'vaTotalLoans', 'START': 59, 'STOP': 68, 'LENGTH': 8},
{'NAME': 'convLoansFlag', 'START': 68, 'STOP': 69, 'LENGTH': 1},
{'NAME': 'convNumLoans', 'START': 69, 'STOP': 73, 'LENGTH': 4},
{'NAME': 'convTotalLoans', 'START': 73, 'STOP': 82, 'LENGTH': 9},
{'NAME': 'hiFlag', 'START': 82, 'STOP': 83, 'LENGTH': 1},
{'NAME': 'hiNumLoans', 'START': 83, 'STOP': 87, 'LENGTH': 4},
{'NAME': 'hiTotalLoans', 'START': 87, 'STOP': 96, 'LENGTH': 9},
{'NAME': 'multiFlag', 'START': 96, 'STOP': 97, 'LENGTH': 1},
{'NAME': 'multiNumLoans', 'START': 97, 'STOP': 101, 'LENGTH': 4},
{'NAME': 'multiTotalLoans', 'START': 101, 'STOP': 110, 'LENGTH': 9},
{'NAME': 'nonFlag', 'START': 110, 'STOP': 111, 'LENGTH': 1},
{'NAME': 'nonNumLoans', 'START': 111, 'STOP': 115, 'LENGTH': 4},
{'NAME': 'nonTotalLoans', 'START': 115, 'STOP': 124, 'LENGTH': 9},
{'NAME': 'recordQuality', 'START': 124, 'STOP': 125, 'LENGTH': 1}]
总的来说,很多 VA 的考虑。
1990–2014
1989 年,跟踪优先级发生了重大变化。从到 FFIEC :
“[……]1989 年,美联储委员会修订了条例 C,纳入了《金融机构改革、恢复和执行法》中的修正案。《金融改革法》修正案实现了以下目标:扩大了 HMDA 的覆盖范围,将与存款机构或控股公司无关的抵押贷款人包括在内;除了有关贷款发放和购买的数据之外,还要求报告有关抵押贷款和住房改善贷款申请处理情况的数据;并要求大多数贷款人确认贷款申请人和借款人的种族、性别和收入
正如预期的那样,文件映射发生了显著变化,bt 现在遵循一种可使用到 2014 年的模式:
[{'NAME': 'ASOF_DATE', 'START': 0, 'STOP': 4, 'LENGTH': 4},
{'NAME': 'RESP_ID', 'START': 4, 'STOP': 14, 'LENGTH': 10},
{'NAME': 'AGENCY_CODE', 'START': 14, 'STOP': 15, 'LENGTH': 1},
{'NAME': 'LOAN_TYPE', 'START': 15, 'STOP': 16, 'LENGTH': 1},
{'NAME': 'LOAN_PURPOSE', 'START': 16, 'STOP': 17, 'LENGTH': 1},
{'NAME': 'OCCUPANCY', 'START': 17, 'STOP': 18, 'LENGTH': 1},
{'NAME': 'LOAN_AMOUNT', 'START': 18, 'STOP': 23, 'LENGTH': 5},
{'NAME': 'ACTION_TYPE', 'START': 23, 'STOP': 24, 'LENGTH': 1},
{'NAME': 'PROPERTY_MSA', 'START': 24, 'STOP': 28, 'LENGTH': 4},
{'NAME': 'STATE_CODE', 'START': 28, 'STOP': 30, 'LENGTH': 2},
{'NAME': 'COUNTY_CODE', 'START': 30, 'STOP': 33, 'LENGTH': 3},
{'NAME': 'CENSUS_TRACT_NUMBER', 'START': 33, 'STOP': 40, 'LENGTH': 7},
{'NAME': 'RACE_APPLICANT', 'START': 40, 'STOP': 41, 'LENGTH': 1},
{'NAME': 'RACE_COAPPLICANT', 'START': 41, 'STOP': 42, 'LENGTH': 1},
{'NAME': 'SEX_APPLICANT', 'START': 42, 'STOP': 43, 'LENGTH': 1},
{'NAME': 'SEX_COAPPLICANT', 'START': 43, 'STOP': 44, 'LENGTH': 1},
{'NAME': 'APPLICANT_INCOME', 'START': 44, 'STOP': 48, 'LENGTH': 4},
{'NAME': 'PURCHASER_TYPE', 'START': 48, 'STOP': 49, 'LENGTH': 1},
{'NAME': 'DENIAL_REASON_1', 'START': 49, 'STOP': 50, 'LENGTH': 1},
{'NAME': 'DENIAL_REASON_2', 'START': 50, 'STOP': 51, 'LENGTH': 1},
{'NAME': 'DENIAL_REASON_3', 'START': 51, 'STOP': 52, 'LENGTH': 1},
{'NAME': 'EDIT_STATUS', 'START': 52, 'STOP': 53, 'LENGTH': 1},
{'NAME': 'SEQUENCE_NUMBER', 'START': 53, 'STOP': 60, 'LENGTH': 7}]
这意味着,对于每种应用,我们现在都可以知道:
- 申请人的种族和性别;
- 共同申请人的种族和性别;
- 他们所在的街区;
- 贷款的目的(房屋或维修);
- 贷款可能被拒绝的原因列表;
- 需要提交的表格总数;和
- 申请过程中的每一天。
贷款申请是故意拖延的吗?本应被批准的家庭维修被否决了吗?同性共同申请人呢?全部可见。
(注意:我们还没有公布我们处理过的数据,因为我们仍在处理和调查它。有许多报告错误,如州缩写而不是州代码,错误的人口普查轨道,以及许多其他问题,仍然需要大量的数据预处理,才能理解几十年来社会规范的变化。在这个时候得出任何结论都是不明智的。)
多年来,大多数银行都越来越坚持该计划。席卷美国的数字化浪潮年复一年地得到验证。越来越少的抵押贷款申请也出现了明显的下降趋势,这很可能是由次贷危机引起的:
2008 年前后,抵押贷款申请的总数有了明显的变化。
到目前为止很棒,不是吗?现在,这个数据是一把双刃剑:
如果数据科学家不理解他们正在使用的数据,那么可以用来保护公民免受掠夺性银行做法侵害的相同数据可能会被用作针对他们的歧视性武器。
为什么这个数据集现在包含了所有偏见、优惠待遇以及错误或恶意拒绝的贷款申请。每一个可能的歧视事件都被永久记录下来。这种数据没有消毒的可能。
HMDA 数据集是有偏见的——绝对有。
应该由数据科学家来理解什么是该问的问题,更重要的是,什么是不该问的问题。
这些数据应该存在吗?
无论用什么标准来衡量,这个数据集都可以被认为是具有侵犯性和歧视性的。加拿大,通常被认为是一个(稍微)更宽容的国家,有一种不同的方法来追踪种族和种族主义。如对话中所述:
加拿大的反种族主义战略,借鉴了几十年的研究成果,声明种族是一种社会建构。根据种族对人进行分类是没有依据的,但是种族偏见和歧视有非常真实的影响。问题是:我们如何从人口普查和其他调查中获得系统性种族主义影响的相关数据?
加拿大统计局试图在不直接询问种族的情况下收集这些信息。加拿大统计局的多样性专家 Jean-Pierre Corbeil 说,需要基于种族的数据。但他怀疑这是否真的需要在人口普查中提及种族。
从历史上看,政府一直不愿意直接询问种族问题,这导致缺乏分类数据。第二次世界大战后,人口普查使用间接方法,通过语言或民族文化渊源等种族替代物来估计非白人、非土著人口。
(注:对作为公民社会支柱的加拿大多元文化主义的主要抱怨之一是,它允许人们在自我分配的许可结构的面纱下,根据种族或国籍对他人进行分类,但这是以后的话题。)
因此,这意味着一些国家拒绝跟踪银行贷款申请人的种族和性别,因为衡量种族主义从根本上放大了将人们分类的分裂性。所以,回头看看 HMDA 的数据,可以问的问题是,“这些数据应该存在吗?”
我相信答案是肯定的。该法案为公众提供了巨大的保护,尤其是在 2005 年的一次重大调查中。来自布法罗新闻:
纽约司法部长埃利奥特·斯皮策(Eliot Spitzer)发起了最新一轮攻势,对该州八大银行的抵押贷款行为展开初步调查,其中包括汇丰银行美国分行。[…]
调查人员正试图确定银行如何为贷款定价,费用和利率是否公*,或者是否存在种族歧视。[…]
花旗集团在 2002 年已经同意支付 2 . 15 亿美元来解决美国联邦贸易委员会指控的 Associates First Capital corp——花旗集团在 2000 年收购了该公司——从事掠夺性贷款。2002 年,Associates 的竞争对手 Household International(于 2003 年被汇丰控股有限公司收购)支付了 4 . 84 亿美元,解决了所有 50 个州的类似指控,这是有史以来最大的消费者和解。
然而,尽管这些数据已经取得了成功,但数据科学家应该明白什么是该问的问题,更重要的是什么是不该问的问题。例如,试图从这些数据中建立一个抵押贷款审批管道是一个可怕的想法——你现在有一个种族主义者,仇视同性恋的机器人。然而,如果你希望通过调查离群值来调查制度化歧视的本质,那么你有一个巨大的武器供你使用。
如何使用这种武器取决于你自己。
补充阅读
- 重访 CRA:社区再投资法案的前景,波士顿和旧金山美联储银行的联合出版物,2009 年 2 月。
- 住房抵押贷款披露法案数据存储系统隐私影响评估,美国美联储理事会,2020 年 11 月。
- 我写了一部被彭博归咎于金融危机的法律。他错了。,罗伯特·库特纳(Robert Kuttner),2020 年 2 月 15 日《华盛顿邮报》专栏版。
- HMDA 的历史,联邦金融机构考试委员会,2018 年 1 月。
咨询愉快!
马特。
如果您对本文或我们的 AI 咨询框架有其他问题,请随时通过LinkedIn或通过email联系。
你可能喜欢的其他文章
- AI 如何创造价值?
- 实施企业人工智能战略
- 离群点感知聚类:超越 K 均值
- 深度学习图像分类器的罗夏测试
数据集的行为应该像 git 存储库一样
原文:https://towardsdatascience.com/datasets-should-behave-like-git-repositories-9acb83a0dae5?source=collection_archive---------18-----------------------
创建、维护和贡献一个长期存在的数据集,该数据集将跨项目自动更新。
从数据中出现的问题在研究和行业中都很常见。那些问题是作为我们项目的一部分来处理的,但是我们通常不会费心去解决它们的根源。我们在本地修复一次数据,然后继续我们的项目。在某些情况下,这当然是一个有效的方法,但是当我们在项目之间共享数据越来越多的时候,我们发现我们自己随着时间的推移在团队之间重复相同的过程。对于许多人共享的公共数据集来训练许多机器学习模型,这个问题尤其如此。我将向您展示如何使用 git 和 DVC 作为版本控制系统,使用 DAGsHub 作为数据集的宿主,来创建、维护和贡献一个能够跨项目自动更新的长期数据集。
我的数据集上的迭代
更改数据集是一个常见的过程
我记得在我本科学习期间,我必须使用分割的叶子、黄瓜和花的自定义数据集来生成黄瓜植物部分的实例分割模型。在很早的时候,我发现我无法用最初给出的数据得到合理的结果。我决定自己给大约十几张图片加上注释。不出所料,这解决了我 80%的问题。这是一个说手工数据劳动被低估的好机会。投资几个小时修复数据是我能为这个项目做的最好的事情。然后,当然,我继续我的生活,把固定的数据集留在实验室的电脑上,但我知道最终,我的修复会消失。
自然,这个过程是渐进的。我从原始数据集开始,然后修改了一部分注释。在某个时候,我添加了全新的图片,决定重做其中的一些。随着时间的推移,我通过多次操作对数据进行迭代。我将其中的许多视为“调试试错法”,自然不会严格跟踪我的工作目录。在那些迭代过程中,我运行培训课程,同时尽最大努力详细记录我的“经历”。如果你还在读,你大概就明白我在说什么了。从那时起,世界已经发生了变化,许多数据版本化工具已经发展到可以提供帮助。这是一个很好的机会来推荐我们在 2020 年底发布的这个数据版本控制工具对比。
什么是数据版本化?
虽然我的项目在数据方面一塌糊涂,但是 git 很好地跟踪了它的代码。原因是我可以运行下面这些人人都知道的神奇命令:
git add .
git commit -m "fixed training input directory"
那时候,我不能对我的数据做任何这种神奇的命令。现在,随着世界上有了 DVC 和 DAGsHub,情况不再是这样了。没有理由不至少建立一个简单的代码和数据版本控制系统。如果你不熟悉 DVC,我推荐你阅读这篇基础数据版本教程,但它是而不是理解这篇文章其余部分的先决条件。你真正需要知道的是,现在我们有了一个新的、神奇的命令:
dvc commit
这将创建被跟踪数据的快照,而不会增加您的 git 存储库。
介绍实时数据集
虽然数据版本化解决了在您的机器学习项目环境中管理数据的问题,但它带来了一种管理数据集的新方法。这种方法,在这里也被称为数据注册,包括创建一个完全专用于管理数据集的 git 存储库。这意味着,与研究人员、学生、kagglers 和开源机器学习贡献者经常在冻结的数据集上训练模型不同,你可以将你的项目链接到数据集(或任何文件),并将其视为依赖关系。毕竟,数据可以也应该被视为代码,并遵循审查过程。你可以在另一篇关于数据错误以及如何修复它们的文章中读到更多。
警告——如果你觉得受到知识的威胁,就不要继续阅读了!
通过 GIPHY
我是在开玩笑,当然,这根本不会是火箭科学。事实上,我将演示如何在一个类似于我大学项目的项目中使用这样一个活体数据集。
创建一个数据注册中心,将其作为一个动态数据集使用
为了展示这种生活数据集的新概念,我自己建立了一个,以及一个使用它作为依赖的机器学习模型。
存储库 A——也就是动态数据集,将是一个简单的项目,拥有神奇的元数据文件,指向存储在专用存储中的真正的大文件。我可以将数据集文件组织到目录中,添加带有utils
函数的代码文件来使用它,或者任何我认为合适的方式来存储和呈现我的数据集给任何想要使用它的人。
储存库 B——又名机器学习项目,是我想使用存储在我的生活数据集中的文件的地方。这个存储库将使用 DVC 从存储库 A 导入一个目录,这将使该目录可管理和可更新。
要创建数据注册中心,只需创建一个 git + DVC 目录。
mkdir my-dataset && cd my-dataset
git init
dvc init
恭喜你。你的活体数据集是活的。现在我们需要给它添加一些文件。
via GIPHY
在我的例子中,我从一个喜爱的电视节目中截取了一些截图,并使用令人敬畏的开源项目 COCO annotator project 对其中我最喜欢的角色进行了注释。
作者(向迪士尼+致谢)
在注释了大约 40 张图片后,我知道这对于一个预先训练好的具有 ResNet50 主干的 Mask-RCNN 来说足够了,可以给出不错的结果(15 张可能也足够了,但是太有趣了,不能停下来)。我导出了一个.json
注释文件,把它和我拍摄的截图放在我的存储库中。此时,我的工作目录如下所示:
.
├── annotations
│ └── grogu.json
└── images
├── 000.png
├── 001.png
.
.
.
├── 206.png
└── 208.png
然后我运行神奇的命令开始跟踪数据文件。
dvc add annotations
dvc add images
git add . && git commit -m "Starting to manage my dataset"
由于我喜欢可视化,我在这个 python 笔记本中写了一个脚本,将我的数据集的预览渲染到一个预览目录中,这个目录也会被 DVC 跟踪。然后,我将代码和数据推送到我的远程存储库,这样我就可以从任何地方访问它们,并与我的合作者共享。
git push origin master
dvc push -r origin
注意:我跳过了在 GitHub / DAGsHub 上打开存储库和设置远程存储的部分,教程应该会涵盖这部分内容。
在机器学习项目中使用活体数据集
现在是时候在我的机器学习项目中使用我的数据集作为依赖项了。我将无法在学校重新创建我的黄瓜项目,因为我无法访问这些数据,所以我将用上面那个可爱的虚构人物来代替黄瓜。
我希望我的项目目录如下所示:
.
├── data
│ ├── preprocessed
│ └── raw
└── src
我想从我的数据集中导入一个目录,并将其视为raw
文件。我可以从我的存储库内部运行:
mkdir -p data/rawdvc import -o data/raw/images \
https://dagshub.com/Simon/baby-yoda-segmentation-dataset \
data/imagesdvc import -o data/raw/annotations \
https://dagshub.com/Simon/baby-yoda-segmentation-dataset \
data/annotations
这将专门从我的数据集存储库中下载目录images
和annotations
,并保存关于如何继续跟踪其中所做更改的信息。关于跟踪变更的更多内容将在后面解释,但差不多就是这些了。
按作者
在上图中,你可以看到它是如何工作的。箭头指向依赖关系。每当我知道数据集发生变化时,我只需运行命令
dvc update
上面的命令将检查存储库的被跟踪 ref 中的变化,并将它们拉到我的本地目录中。然后,我从头开始重新运行我的管道——训练我的模型,保存最好的一个,并提交我的结果。注意,如果我们想的话,我们可以使用dvc import
+ dvc update
的方法来获得输出模型,作为另一个项目中的依赖项。
呼吁合作
首先,我想感谢你一起阅读,我希望你喜欢它。该项目仍在进行中(但什么项目不是呢?).因此,如果你在数据集或模型中发现了错误或需要改进的地方,那就贡献出来吧!派生存储库、提取数据、推送数据和合并数据相当容易。尤其是有了数据科学拉取请求。该过程可以很容易地适应任何分割数据集,所以也可以随意这样做。
特别感谢 Asher 和或,我最初分割项目的同学们给了我这个迷你项目的灵感。
这里有一些结果只是为了好玩!
作者(向迪士尼+致谢)
SQL 与 NoSQL 数据库:何时使用,如何选择
原文:https://towardsdatascience.com/datastore-choices-sql-vs-nosql-database-ebec24d56106?source=collection_archive---------0-----------------------
照片由郄佳朝&阿夫松在 Unsplash
数据工程
SQL 和 NoSQL 数据库的区别。深入研究、决策树和备忘单,从 12 种数据库类型中选择最适合您的数据类型和用例。
免费版:SQL vs NoSQL
你如何选择一个数据库?也许,您评估用例是否需要关系数据库。根据不同的答案,选择您最喜欢的 SQL 或 NoSQL 数据存储,并让它工作。这是一个谨慎的策略:已知的魔鬼比未知的天使更好。
选择正确的数据存储可以简化您的应用程序。错误的选择会增加摩擦。本文将通过对各种数据存储的深入概述,帮助您扩大已知恶魔的列表。它包括以下内容:
- 定义数据存储特征的数据库部件。
- 数据存储按数据类型分类:深入了解数据库中的非结构化、结构化(表格)和半结构化(NoSQL)数据。
- 差异在 SQL 和 NoSQL 数据库之间。
- 数据存储专用于各种用例。
- 决策备忘单了解本地和云数据存储选择的前景。
目录:
- 数据库内
- 非结构化数据的 Blob 存储
- *<#67be> **-OLTP:关系型或面向行的数据库
- OLAP:列型或面向列的数据库***
- ***半结构化数据的 NoSQL 数据存储
- 键值数据存储
- 宽列数据存储
- 文档数据存储
- 图形数据存储***
- SQL 与 NoSQL 数据库对比
-SQL 与 NoSQL 的区别
-SQL 与 NoSQL 的性能和伸缩性 - ***NoSQL 用例专门化
- 内存中键值数据存储
- 时序数据存储
- 不可变分类帐数据存储
- 文本搜索数据存储***
- SQL vs NoSQL 决策树&云备忘单
在数据库中
对数据库如何工作的高层次理解有助于评估备选方案。数据库有 5 个组件:接口、查询处理器、元数据、索引和存储:
- 接口语言或 API: 每个数据库定义一种语言或 API 与之交互。它涵盖了数据和事务的定义、操作、查询和控制。
- ****查询处理器:数据库的“CPU”。它的工作是处理传入的请求,执行所需的操作,并返回结果。
- ****存储器:存储数据的磁盘或内存。
- ****索引:在存储中快速定位查询数据的数据结构。
- ****元数据:数据的元信息,存储。和索引(例如,目录、模式、大小)。
查询处理器对每个传入的请求执行以下步骤:
- 解析请求并根据元数据进行验证。
- 创建利用索引的高效执行计划。
- 读取或更新存储。
- 更新元数据和索引。
- 计算并返回结果。
要确定数据存储是否符合您的应用需求,您需要仔细检查:
- 接口支持的操作*。如果您需要的计算是内置的,您将需要编写较少的代码。***
- 可用的索引*。它将决定查询运行的速度。***
在接下来的几节中,让我们检查各种数据类型的数据存储中的操作和索引。
数据库组件:接口语言、查询处理器、存储、索引和元数据;以及由查询处理器执行的步骤。图片由作者提供,并在Creative Commons BY-NC-ND 4.0 International许可下发布。
非结构化数据的 Blob 存储
文件系统是最简单和最古老的数据存储。我们每天都用它来存储各种数据。Blob 存储是文件系统的超大规模分布式版本。用于存储非结构化数据。**
Blob 的 backronym 是二进制大对象。你可以存储任何类型的数据。因此,blob 数据存储在解释数据方面没有任何作用:
- Blob 支持文件级的 CRUD(创建、读取、更新、删除)操作。
- 目录或文件路径*就是索引**。***
因此您可以快速找到并读取该文件。但是在一个文件中定位某些东西需要顺序扫描。文档、图像、音频和视频文件存储在 blobs 中。
结构化数据的表格数据存储
表格数据存储适合存储结构化数据。每条记录(行)具有相同类型的相同数量的属性(列)。**
有两种应用:
- 在线事务处理( OLTP ):实时捕获、存储和处理来自事务的数据。
- 在线分析处理( OLAP ):分析来自 OLTP 应用程序的聚合历史数据。
OLTP 应用程序需要支持低延迟读取和写入单个记录的数据存储。OLAP 应用程序需要支持对大量(只读)记录进行高吞吐量读取的数据存储。
OLTP:关系或面向行的数据库
关系数据库管理系统是最早的数据存储之一。数据组织在表格中。表格被规格化以减少数据冗余和更好的数据完整性。
表可能有主键和外键:
- 主键 是唯一标识表中一条记录(行)的最小属性(列)集。
- 外键 建立表之间的关系。它是一个表中的一组属性,引用另一个表的主键。
使用标准查询语言(SQL)对查询和事务进行编码。
关系数据库针对事务操作进行了优化。事务经常更新多个表中的多条记录。索引针对 ACID 事务的频繁低延迟写入进行了优化:
- ****原子性:任何更新多行的事务都被视为单个单元。一个成功的事务执行所有的更新。失败的事务不执行任何更新,即数据库保持不变。
- ****一致性:每个事务都将数据库从一种有效状态带到另一种有效状态。它保证维护所有数据库不变量和约束。
- ****隔离:多个事务的并发执行使数据库处于相同的状态,就好像事务是顺序执行的一样。
- ****持久性:提交的事务是永久的,即使系统崩溃也不会被破坏。
有很多选择:
- 云不可知:Oracle、Microsoft SQL Server、IBM DB2、 PostgreSQL 和 MySQL
- AWS:在关系数据库服务(RDS) 中托管 PostgreSQL 和 MySQL
- 微软 Azure:托管 SQL 服务器作为 Azure SQL 数据库
- Google Cloud:在 Cloud SQL 中托管 PostgreSQL 和 MySQL,还横向扩展 Cloud Spanner
OLAP:柱状还是面向列的数据库
事务是在行(记录)上进行的,而分析属性是在列(属性)上计算的。OLAP 应用程序需要对表进行优化的列读取操作。
实现这一点的一种方法是向关系数据库添加面向列的索引。例如:
- 微软 SQL Server 中的列存储索引
- PostgreSQL 中的列存储索引
然而,主要的 RDBMS 操作是低延迟、高频率的 ACID 事务。这无法扩展到分析应用中常见的大数据规模。
对于大数据,存储在 blob 存储 数据湖 变得流行起来。部分分析汇总在 OLAP 立方体 中计算和维护。柱状存储在规模和性能方面的进步使得 OLAP 立方体被淘汰。但是这些概念仍然与设计数据管道相关。
现代的 数据仓库 是建立在 柱状 数据库之上的。数据按列存储,而不是按行存储。可用的选项有:
- AWS: 红移
- Azure: 突触
- 谷歌云: BigQuery
- 阿帕奇:德鲁伊,库杜,比诺
- 其他:点击屋、雪花
Databricks Delta Lake 对存储在数据湖中的数据提供类似柱状的性能。
RDBMS 与列式:面向行的数据库用于 OLTP,面向列的数据库用于 OLAP 应用程序。图片由作者提供,并在Creative Commons BY-NC-ND 4.0 International许可下发布。
半结构化数据的 NoSQL
NoSQL 数据存储支持半结构化数据类型:键值、宽列、文档(树)和图形。
键值数据存储
键值存储是一个字典或散列表数据库。它是为 CRUD 操作设计的,每个记录都有一个唯一的键:
- Create(key,value):向数据存储添加一个键值对
- Read(key):查找与键相关联的值
- Update(key,value):更改键的现有值
- Delete(key):从数据存储中删除(key,value)记录
这些值没有固定的模式,可以是从原始值到复合结构的任何值。键值存储是高度可分区的(因此可以水*扩展)。Redis 是一个受欢迎的键值存储。
宽列数据存储
宽列存储包含表、行和列。但是对于同一个表中的每一行,列的名称和类型可能不同。在逻辑上,它是一个版本化的稀疏矩阵,具有多维映射(行-值、列-值、时间戳)。它就像一个二维的键值存储,每个单元格的值都有一个时间戳。
宽列数据存储高度可分区。它有一个存储在一起的列族的概念。单元格的逻辑坐标是:(行键,列名,版本)。物理查找如下:区域字典列系列目录行关键字列系列名称列限定符版本。因此,宽列存储实际上是面向行的数据库。
Apache HBase 是第一个开源的宽列数据存储。查看 HBase in Practice ,了解宽列数据存储的核心概念。
文档数据存储
文档存储用于存储和检索由嵌套对象组成的文档。像 XML、JSON 和 YAML 这样的树结构。
在键值存储中,值是不透明的。但是文档存储利用值的树结构来提供更丰富的操作。MongoDB 是文档存储的一个流行例子。
图形数据存储
图形数据库类似于文档存储,但它是为图形而不是文档树设计的。例如,图形数据库将适合于存储和查询社会联系网络。
Neo4J 是一个优秀的图形数据库。在宽列存储上使用 JanusGraph 类型的索引也很常见。
SQL 与 NoSQL 数据库的比较
非关系型 NoSQL 数据存储受欢迎有两个原因:
- RDBMS 没有针对大数据进行水*扩展
- 并非所有数据都符合严格的 RDBMS 模式
NoSQL 数据存储以各种 CAP 定理折衷提供水*扩展。根据上限定理,分布式数据存储最多可以提供以下三种保证中的两种:
- ****一致性:每次读取都会收到最*的写入或错误。
- ****可用性:无论节点的状态如何,每个请求都会得到一个(无错误的)响应。
- ****分区容错:尽管网络在节点之间丢弃(或延迟)了任意数量的消息,集群也不会失败。
注意,CAP 定理和 ACID 事务中的一致性定义是不同的。ACID 一致性是关于数据完整性的(数据在每次事务处理后在关系和约束方面是一致的)。CAP 是关于所有节点的状态在任何给定时间都彼此一致。
只有少数 NoSQL 数据存储区是耐酸性的。大多数 NoSQL 数据存储支持基本型号:
- ****基本可用:数据被复制在许多存储系统上,并且大部分时间都可用。
- ****软态:副本始终不一致;所以状态可能只是部分正确,因为它可能还没有收敛。
- ****最终一致:数据在未来的某个时刻会变得一致,但不保证什么时候。
SQL 和 NoSQL 的区别
RDBMS 和 NoSQL 数据库之间的差异源于它们对以下方面的选择:
- 数据模型: RDBMS 数据库用于严格遵循关系模式的规范化结构化(表格)数据。NoSQL 数据存储用于非关系数据,例如键值、文档树、图形。
- ****事务保证:所有 RDBMS 数据库都支持 ACID 事务,但大多数 NoSQL 数据存储提供基本事务。
- CAP 权衡: RDBMS 数据库优先考虑强一致性。但是 NoSQL 数据存储通常优先考虑可用性和分区容忍度(水*扩展),并且只提供最终一致性。
SQL 与 NoSQL 性能对比
RDBMS 是为在具有复杂完整性约束的表上更新多行的快速事务而设计的。SQL 查询具有表达性和声明性。可以重点关注 一笔交易要完成 什么。RDBMS 会弄清楚怎么做。它将使用关系代数优化您的查询,并找到最佳的执行计划。**
NoSQL 数据存储旨在高效处理比 RDBMS 多得多的数据。数据没有关系约束,甚至不需要表格。NoSQL 通常通过放弃强一致性来提供更高的性能。数据访问主要是通过 REST APIs 进行的。NoSQL 查询语言(如 GraphQL)在设计和优化方面还没有 SQL 成熟。所以你需要同时考虑做什么和如何才能高效地完成。**
****RDBMS 纵向伸缩。您需要升级硬件(更强大的 CPU、更高的存储容量)来处理不断增加的负载。
NoSQL 数据存储水*扩展。 NoSQL 更擅长处理分区数据,所以你可以通过添加更多的机器来扩展。
SQL 与 NoSQL:NoSQL 和 SQL 数据库的区别。图片由作者提供,并在Creative Commons BY-NC-ND 4.0 International许可下发布。
NoSQL 用例专门化
各种类型的 NoSQL 数据存储之间的界限很模糊。有时,甚至 SQL 和 NoSQL 之间的界限也很模糊( PostgreSQL 作为键值存储而 PostgreSQL 作为 JSON 文档 DB )。
通过为另一种类似的数据类型添加索引和操作,可以对数据存储进行变形以服务于该数据类型。最初的柱状 OLAP 数据库是具有列存储索引的 RDBMS。支持多种数据类型的 NoSQL 商店也是如此。
这就是为什么最好考虑使用案例并选择适合您的应用程序的数据存储。服务于多个用例的数据存储可能有助于减少开销。
对于分析用例,表格列数据库通常比 NoSQL 数据库更合适。
具有适合该用例的内置操作的数据存储库是首选(而不是在每个应用程序中实现这些操作)。
内存中的键值数据存储
与键值存储相同,但数据在内存中,而不是在磁盘上。它消除了磁盘 IO 开销,并充当 fast cache。
时序数据存储
时间序列是一系列数据点,按时间戳进行索引和排序。时间戳是时间序列数据存储中的关键。
时间序列可以建模为:
- ****键值:关联的时间戳和值对
- ****宽列:用时间戳作为表的键
带有编程语言中的日期时间函数的宽列存储通常用作时间序列数据库。
在分析用例中,列数据库也可以用于时序数据。
不可变分类帐数据存储
不可变分类帐用于维护由中央可信机构拥有的不可变的和(密码地)可验证的事务日志。
从存储的角度来看,宽列存储就足够了。但是数据存储操作必须是不可变的和可验证的。目前很少有数据存储库(例如亚马逊 QLDB 、 Azure SQL Ledger 和 Hyperledger Fabric )满足这些要求。
地理空间数据存储
地理空间数据库是存储地理数据(如国家、城市等)的数据库。).它针对地理空间查询和几何操作进行了优化。
具有地理空间查询的宽列、键值、文档或关系数据库通常用于此目的:
- 对 PostgreSQL 的扩展
- MongoDB 中的 GeoJSON 对象
在分析用例中,柱状数据库可能更适合。
文本搜索数据存储
在非结构化(自然)或半结构化文本上的文本搜索是许多应用中的常见操作。文本可以是纯文本或富文本(例如 PDF),可以存储在文档数据库中,也可以存储在 blob 存储中。弹性搜索已经成为一种流行的解决方案。
何时使用 SQL 与 NoSQL:决策树和云备忘单
考虑到如此多的数据类型、用例、选择、应用考虑因素和云/本地限制,分析所有选项可能会非常耗时。下面的备忘单将帮助你快速筛选出几个候选人。
等待学习到做出选择所需的一切是不切实际的。这张备忘单会给你一些合理的选择。它在设计上被简化了,缺少一些细微差别和选择。它针对召回率而不是精确度进行了优化。
何时使用 SQL 与 NoSQL:在 AWS、Microsoft Azure、Google Cloud Platform 和云不可知/本地/开源上选择数据库的决策树和云备忘单。图片由作者根据Creative Commons BY-NC-ND 4.0 International许可发布。
摘要
本文向您介绍了各种数据存储选择,并解释了如何根据以下因素进行选择:
- 应用:交易或分析
- 数据类型(SQL 与 NoSQL):结构化、半结构化、非结构化
- 用例
- 部署:主要云提供商、内部部署、供应商锁定注意事项
资源
- AWS 上的数据库服务
- AWS 白皮书:亚马逊网络服务概述——数据库
- 如何选择合适的数据库— AWS 技术内容系列
- 了解 Azure 数据存储模型
- Azure 上的数据库类型
- 谷歌云数据库服务
- 谷歌云*台上的数据生命周期和数据库选择
如果您喜欢,请:
原载于ML4Devs.com。
Python 中 K-Means 聚类评估的 Davies-Bouldin 索引
原文:https://towardsdatascience.com/davies-bouldin-index-for-k-means-clustering-evaluation-in-python-57f66da15cd?source=collection_archive---------37-----------------------
在本教程中,我们将探索 Davies-Bouldin 索引及其在 Python 中 K-Means 聚类评估中的应用。
目录
- 介绍
- 戴维斯-波尔丁指数
- 步骤 1:计算组内离差
- 步骤 2:计算分离度量
- 步骤 3:计算聚类之间的相似性
- 步骤 4:为每个聚类 i 找到最相似的聚类
- 步骤 5:计算戴维斯-波尔丁指数
- Python 中的 Davies-Bouldin 索引示例
- 结论
介绍
戴维斯-波尔丁指数(DBI)是聚类算法的评价指标之一。它最常用于通过 K-Means 聚类算法对给定数量的聚类评估分割的良好性。
简言之,分数(DBI)被计算为每个聚类与最相似的聚类的*均相似性。*均相似度越低,聚类分离得越好,执行聚类的结果也越好。
在下一节中,将通过几个示例详细描述计算 DBI 的过程。
戴维斯-波尔丁指数
聚类分离度量的研究早在 1979 年就发表了。所提供的材料描述了作为群内分散和群间分离的函数的群间相似性的度量。
在这一部分中,我们将介绍计算的每一步,并提供有意义的示例来帮助更好地理解公式。
步骤 1:计算组内离差
考虑由 Davies,d .,& Bouldin,D. (1979)定义的下列方程,该方程计算集群 i 的分散:
其中:
i:特定识别的簇
T_i:簇IX _ j:j簇IA _ I:簇 i 的质心
基本上,为了获得类内离差,我们计算类内每个观察值与其质心之间的*均距离。
注意:通常值 q 被设置为 2 ( q = 2),它计算聚类的质心和每个单独的聚类向量(观察)之间的欧几里德距离。
假设对某个数据集执行的 K 均值聚类生成了三个聚类。使用上面的公式,将为每个集群计算集群内离差,并且我们将得到S1、S2和S3的值。
步骤 2:计算分离度量
考虑由 Davies,d .,& Bouldin,D. (1979)定义的下列方程,该方程计算集群 i 和 j 之间的间隔:
其中:
A _ :k-N的第个分量-维质心A _ I
A _ :k-N的第个分量-维质心 A_j
N:总簇数
上述公式也可以写成:
注意:当 p 设置为 2 ( p = 2)时,上式计算的是簇 i 和 j 的质心之间的欧氏距离。
继续假设我们正在处理三个集群。使用上面的公式,我们将计算两个集群的每个可能组合的分离度量: M_{11} 、 M_{12} 、 M_{13} 、 M_{21} 、 M_{22} 、 M_{23} 、 M_{31} 、
当然我们还有M _ { 12 }=M _ { 21 },M _ { 13 }=M _ { 31 },M _ { 23 }=M _ { 32 }。
步骤 3:计算聚类之间的相似性
考虑由 Davies,d .,& Bouldin,D. (1979)定义的下列等式,该等式计算集群 i 和 j 之间的相似性:
其中:
S_i:簇的簇内离差 i
S_j:簇的簇内离差 j
M_:簇的质心 i 和 j
基本上,我们在这里将聚类之间的相似性计算为两个聚类内离差之和除以分离度。 R_ 越大,相似簇 i 和 j 越多。你可能已经知道最好的情况是当这些数字尽可能低的时候。
类似于步骤 2 中的逻辑,继续假设我们正在处理三个集群。使用上面的公式,我们将计算两个集群的每个可能组合的相似性: R_{11} , R_{12} , R_{13} , R_{21} , R_{22} , R_{23} , R_{31}
这里,R _ { 11 }=R _ { 22 }=R _ { 12 }是每个簇与自身的相似度。而且我们还有R _ { 12 }=R _ { 21 }、R _ { 13 }=R _ { 31 }、R _ { 23 }=R _ { 32 }。
步骤 4:为每个聚类 i 找到最相似的聚类
戴维斯博士和波尔丁博士(1979 年)定义:
有:I≦j
对于每个集群 i ,我们从所有计算的 R_ 中找到最高的比率。
例如,对于集群 i = 1,我们计算了 R_{11} 、 R_{12} 和 R_{13} 。继续 R_{12} 和 R_{13} (由于 R_{11} 不满足约束I≦j,将集群与自身进行比较没有意义)。
现在,有了 R_{12} (这是聚类 1 和 2 之间的相似性)和 R_{13} (这是聚类 1 和 3 之间的相似性)。从这两个度量值中,我们将选择最大的一个,并将最大度量值称为 R_{1} 。按照同样的逻辑,我们会发现 R_{2} 和 R_{3} 。
步骤 5:计算戴维斯-波尔丁指数
将戴维斯-波尔丁指数计算如下:
其简单地是每个聚类与最相似的聚类的相似性度量的*均值。
注意:聚类的最佳选择是*均相似性最小化的地方,因此较小的 R 条代表定义更好的聚类。
Python 中的 Davies-Bouldin 索引示例
在这一节中,我们将通过一个例子来计算 Python 中 K-Means 聚类算法的 Davis-Bouldin 指数。
首先,导入依赖项:
您可以通过下面的代码使用任何数据。为了简单起见,我们将使用内置的虹膜数据集,特别是前两个特征:【萼片宽度】和【萼片长度】:
让我们从 3 个集群的 K 均值目标开始:
并检查上述结果的戴维斯-波尔丁指数:
您应该会看到结果分数: 0.7675522686571647 或大约 0.77 。
为了更好地理解集群的外观,让我们将它们形象化:
我们应该看到以下 3 个集群:
看起来有些集群比其他集群定义得更好。
到目前为止,我们只计算了 3 个团簇的戴维斯-波尔丁指数。这种方法与肘方法类似,有助于确定最佳的聚类数。
我们可以对大于或等于 2 的任意数量的集群进行计算。让我们尝试多达 10 个集群:
想象一下:
虽然在这个例子中,度量彼此非常接*,但是我们仍然可以观察到选择 3 个聚类最小化了相似性度量。
结论
在本文中,我们讨论了如何使用 sklearn 库在 Python 中计算用于聚类评估的 Davies-Bouldin 指数。
如果你有任何问题或者对编辑有任何建议,欢迎在下面留下评论,并查看我的更多 Python 编程文章。
参考文献:
戴维斯博士,&波尔丁博士(1979)。一种聚类分离度量。IEEE 模式分析和机器智能汇刊,PAMI-1(2),224–227。https://doi.org/10.1109/TPAMI.1979.4766909
原载于 2021 年 6 月 2 日https://pyshark.com。
黎明合唱团,更多的猪肉猫头鹰,和捕食者控制
原文:https://towardsdatascience.com/dawn-chorus-morepork-owls-and-predator-control-107e5ca38fd?source=collection_archive---------37-----------------------
变更数据
使用鸟鸣指数新西兰自然的本地健康
新西兰 tui凯利贝内特 。
新西兰的自然声景回荡着鸟鸣。不幸的是,这一自然奇观目前仅限于该国的一些地区,这些地区受到保护,免受外来食肉动物的侵害。新西兰政府保护部(DOC)和社区团体已经开始实施一项雄心勃勃的计划,名为“新西兰 2050 年无捕食者”,以尽可能多地消除该国引入的破坏自然鸟类生活和静音声景的捕食者。邻里团体通过诱捕或毒杀老鼠、鼬鼠、刺猬和刷尾负鼠来将它们从花园和自然区域中移走。在许多情况下,计数被记录并公布在公共数据库上(例如,见<http://trapdoor.omegatech.co.nz>)。诱捕成功与否由 DOC 和保护组织进行评估。像新西兰鸟类地图集和新西兰花园鸟类调查这样的大规模公民科学项目对鸟类的数量进行了追踪。但是对于许多社区团体来说,除了陷阱中死亡人数的上升之外,他们的努力并没有成功的指标,而且在许多情况下也没有记录。此外,很难量化毒饵的成功,因为尸体不容易计数。
量化诱捕成功的一种方法是监测鸟鸣声水*的变化。杂音项目鸟类监测器结合了软件、手机和麦克风来监测鸟鸣。鸟鸣指数可以用来代表监测点附*的鸟类数量。迄今为止的结果是有希望的,研究记录了该设备的开发(Steer 2010 年),更多猫头鹰叫声的物种识别(Hunt 等人 2019 年),以及鸟类监测方法的比较(库蒂尼奥 2021 年)。更多最新信息可以在不和谐的项目博客<https://www.2040.co.nz/blogs/news>上找到。
本文的目的是展示新的开源 R 代码,以分析由不和谐的鸟监控器产生的鸟鸣声记录。该代码加载并清理数据,为绘图做准备,并创建一个有用的汇总绘图面板。这些可以用来自不和谐项目服务器的新数据更新,因为它们是从通过无线连接到互联网的鸟监控器上传的。这些图从鸟鸣数据中得到各种有用的度量。每周的箱线图总结了黎明合唱以及白天和夜晚鸟鸣的水*和变化。不和谐的项目自动识别更多的猪猫头鹰(Ninox novese elandie)呼叫最*得到了改善(见<https://www . 2040 . co . NZ/blogs/news/moreporks-自动识别>)并且每周指数来自识别的呼叫数量。你可以在 22 周后的莫尔波克猫头鹰图中看到识别能力提高的效果。从整个数据集绘制出周日时间序列,并通过*滑回归显示和总结按日期划分的完整时间序列。这种新的 R 代码填补了计算鸟鸣指数和识别猫头鹰叫声的不和谐项目软件与需要可以快速方便更新的数据的方便摘要的用户之间的空白。
鸟类鸣声指数每周汇总一次,以追踪更多猫头鹰黎明时的合唱和夜间的叫声。请注意 22 周后对更多猪肉呼叫的改进检测的效果。为了清楚起见,日夜通话按月汇总。日变化模式是从所有数据中推导出来的。
密码
导出鸟类记录数据会产生一个文本文件,这对于在 r 中使用有点不方便。第一个清理步骤是将杂音指数(鸟叫指数)字符串分离成单独的变量:
*### plot_cacophony_index.R
#####################################
library*(tidyverse)
*library*(lubridate)
*library*(scales)
*library*(gridExtra) *#####################################
## load and clean data
# #####################################
# load raw data* rec <- *read_csv*("../data/recordings.csv")*# make the string of cacophony index values into separate variables* tt <- *str_replace_all*(rec$`Cacophony Index`, ";", ",")*write.table*(tt, "../data/cacophony_index_only.csv", sep=",", col.names=FALSE, row.names=FALSE)
然后您可以使用 Linux 例程' sed '【http://www.gnu.org/software/sed/manual/sed.html><来方便地删除引号:
*# remove the quotes with system command to sed
system*("pwd")
*system*("ls -al")
*system*("sed 's/\"//g' ../data/cacophony_index_only.csv > ../data/edited_cacophony_index_only.csv")
*system*("mv ../data/edited_cacophony_index_only.csv ../data/cacophony_index_only.csv")*# read the cleaned up data* rec2 <- *read_csv*("../data/cacophony_index_only.csv", col_names=*c*("index1","index2","index3"))
*system*("rm ../data/cacophony_index_only.csv")
需要为绘图准备数据:
*#####################################
## prepare data for plotting
#####################################
# convert date and time to a time index* dt <- *paste*(rec$Date, rec$Time, sep=" ")
rec$date_time <- *ymd_hms*(dt, tz = "Pacific/Auckland")
*# add the separated index variables to the data frame* rec3 <- *cbind*(rec, rec2)*# calculate mean cacophony index* x <- *c*(rec3$index1,rec3$index2,rec3$index3)
rec3$index <- *apply*(rec2, 1, mean)
rec3$index
*#subset index > 30 to remove artificially low values* rec3 <- *with*(rec3, rec3[index >=30, ])*# subset dawn chorus data (between 4AM and 7AM)* dawn <- *with*(rec3, rec3[*hour*(Time) >=4 & *hour*(Time) <= 7, ])
dawn$month <- *format*(dawn$Date, "%m")
dawn$week <- *format*(dawn$Date, "%V")*# subset day data (between 10AM and 4PM)* day <- *with*(rec3, rec3[*hour*(Time) >=10 & *hour*(Time) <= 15, ])
day$month <- *format*(day$Date, "%m")
day$week <- *format*(day$Date, "%V")
day$type <- *rep*("day", *length*(day$week))*# subset night data when morepork occur (between midnight and 3AM)* night <- *with*(rec3, rec3[*hour*(Time) >=0 & *hour*(Time) <= 2, ])
night$month <- *format*(night$Date, "%m")
night$week <- *format*(night$Date, "%V")
night$type <- *rep*("night", *length*(night$week))*# prepare morepork call index* rec3$species <- *as.factor*(rec3$"Species Classification")
rec3$morepork_calls <- *str_count*(rec3$species, pattern = "morepork")
rec3$morepork_calls <- rec3$morepork_calls/ 20 *# 3 sec listen in each minute of recording* rec3$month <- *format*(rec3$Date, "%m")
rec3$week <- *format*(rec3$Date, "%V")
现在,图已指定:
*#####################################
## create plots
#####################################
# plot dawn chorus weekly boxplot time series* Dawn_Cacophony_Index_box <- *ggplot*(dawn, *aes*(x=week, y=index)) +
*geom_boxplot*(fill = "#95B9C7") +
*xlab*("Week of the year") +
*ylab*("Mean Cacophony Index") +
*ggtitle*("Dawn chorus 04-08h") +
*theme*(axis.text.x=*element_text*(angle=60, hjust=1)) +
*theme*(text = *element_text*(size=14)) +
*ylim*(25,85)
*# plot day and night data weekly boxplot time series on same graph* rec3_type <- *rbind*(day, night)
Day_Night_Cacophony_Index_box <- *ggplot*(rec3_type, *aes*(x=week, y=index, fill = type)) +
*geom_boxplot*() + *scale_fill_manual*(values = *c*("#82CAFF", "#0000A0")) +
*guides*(colour = "colorbar", size = "legend", shape = "legend") +
*xlab*("Week of the year") +
*ylab*("Mean Cacophony Index") +
*ggtitle*("Day 10-16h, Night 00-03h") +
*theme*(axis.text.x=*element_text*(angle=60, hjust=1)) +
*theme*(text = *element_text*(size=14)) +
*ylim*(25,85)
*# plot morepork index weekly boxplot time series* Morepork_Index_box <- *ggplot*(rec3, *aes*(x = week, y = morepork_calls)) +
*geom_boxplot*(color = "#0000A0") +
*xlab*("Week of the year") +
*ylab*("Morepork Index (calls/ min)") +
*ggtitle*("Morepork owl calls") +
*theme*(axis.text.x=*element_text*(angle=60, hjust=1)) +
*theme*(text = *element_text*(size=14)) +
*ylim*(0,1.5)
*# plot diurnal time series* Cacophony_Index_daily <- *ggplot*(rec3, *aes*(x=Time, y=index)) +
*geom_point*(color="orange", size=0.5) +
*xlab*("24 hour Time") +
*ylab*("Mean Cacophony Index") +
*ggtitle*("Diurnal period") +
*theme*(axis.text.x=*element_text*(angle=60, hjust=1)) +
*theme*(text = *element_text*(size=14))Cacophony_Index_daily_trend <- Cacophony_Index_daily + *stat_smooth*(color = "red")
*# plot entire time series* Cacophony_Index_full_ts <- *ggplot*(rec3, *aes*(x=date_time, y=index)) + *geom_point*(color="orange", size=0.5) +
*xlab*("Date") +
*ylab*("Mean Cacophony Index") +
*ggtitle*("Full time series") +
*theme*(axis.text.x=*element_text*(angle=60, hjust=1)) +
*theme*(text = *element_text*(size=14))Cacophony_Index_full_ts_trend <- Cacophony_Index_full_ts +
*stat_smooth*(color = "red")
CacIdx_full <- Cacophony_Index_full_ts_trend +
(*scale_x_datetime*(breaks=*date_breaks*("7 day")))
最后一步是从图中创建面板:
*# layout plots on the page* widths <- *c*(1,1,1,1,2)
*grid.arrange*(Dawn_Cacophony_Index_box, Day_Night_Cacophony_Index_box, Morepork_Index_box, Cacophony_Index_daily_trend, CacIdx_full, layout_matrix = *rbind*(*c*(1,2,3),*c*(4,5,5)))
完整的 R 代码可以在这里找到【http://u.pc.cd/f0nrtalK><。这是可能会改变的实时代码,也许会随着时间的推移而改进。
后续步骤
下一步是获得更多的鸟类监测器,以便在 Huia (Waitakere Ranges)陷阱内的陷阱和控制区进行适当控制的科学研究。新西兰足迹<https://trap.nz/project/1106292/info>。在诱捕组中,我们有两个在过去 3 年中被密集诱捕的相邻房产,以及其他几个被轻度诱捕的相邻房产。有了 6 个鸟类监测器,我可以监测两个级别的高诱捕努力、两个级别的低诱捕努力和两个控制区域。或者四级高诱捕努力和两个控制区域,考虑到可变性,这可能更好。毫无疑问,鸟鸣的一些波动是由于天气的变化,可能主要是温度、风和雨。考虑到这种可变性,有必要安装一个气象站来监测当地的情况,这样,天气变量就可以在统计上与鸟类鸣声指数的可变性相关联。
结论
杂音项目鸟类监测器提供了一个令人兴奋的新工具,应该可以让我们评估新西兰当地鸟类丰富的邻里诱捕的有效性。我们提供了一些新的开源 R 代码,用于以信息格式绘制数据。当数据被收集并上传到互联网上不和谐的服务器时,代码可以方便地显示几个有用的指数。预计随着时间的推移,也许几年后,如果附*的诱捕和毒饵能有效地降低捕食者的密度,就有可能检测到鸟类鸣叫声的增加。一个有趣的区别可能是,如果更多的猪猫头鹰严重依赖老鼠为食,它们的叫声可能会减少。大自然充满了惊喜。
这个项目部分由生态事务爱你的邻居基金资助。
参考
J.Steer,新西兰鸟类的生物声学监测(2010),Notornis 57,75–80。
T.D. Hunt、M. Nikora 和 C. Blackbourn,“使用永久定位的移动电话记录的更多猪肉发声的分析”(2019 年),发表于 10 月 9 日至 11 日在新西兰纳尔逊举行的全国计算资格咨询委员会第 32 届年会上。
南阿尔维斯·库蒂尼奥,SCIE393 Report — WWW Document (2021),https://drive . Google . com/file/d/1 kskrul _ mjlg 4 LDV 1 tfjxwsko 4 daqfofh/view?USP = embed _ Facebook(6 . 23 . 21 访问)。
DBSCAN 聚类算法——如何构建强大的基于密度的模型
原文:https://towardsdatascience.com/dbscan-clustering-algorithm-how-to-build-powerful-density-based-models-21d9961c4cec?source=collection_archive---------7-----------------------
机器学习
对有噪声的应用程序使用基于密度的空间聚类的详细指南
DBSCAN 聚类算法。图片由作者提供。
介绍
如果你想成为一名成功的数据科学家,你需要了解不同机器学习算法的细微差别。
这个故事是我深入研究这种算法如何工作的系列文章的一部分。这包括可视化和现实生活中的数据示例,以及完整的 Python 代码,供您在自己的数据科学项目中使用。
内容
- DBSCAN 属于哪一类算法?
- 有哪些不同类型的聚类算法?
- DBSCAN 算法是如何工作的?
- 对真实数据使用 DBSCAN 的 Python 示例。
DBSCAN 属于哪一类算法?
随着时间的推移,机器学习算法的总数不断增长,创造了许多分析数据的方法。我尝试收集数据科学社区最常用的算法并进行分类。请务必浏览下面的互动旭日图👇通过点击不同类别的显示更多。
请注意,在许多情况下,相同的算法可以用于解决多种类型的问题。例如,可以使用神经网络进行分类、回归或作为强化学习的一部分。
机器学习算法分类。由作者创建的交互式图表。
如果你喜欢数据科学和机器学习 ,请 订阅 每当我发布一个新的故事,你都会收到一封电子邮件。
如上图所示,顾名思义(带噪声的应用基于密度的空间聚类),DBSCAN 是一种聚类算法,属于机器学习的无监督分支。
通常,人们会根据所选特征的相似性,使用聚类来识别不同的客户、对象或其他类型的数据组(也称为聚类)。
聚类算法的类型
并非所有的聚类算法都是一样的。不同的聚类算法对如何最好地对数据进行聚类有不同的想法。有 4 个主要类别:
- 基于质心的 —使用欧几里德距离将每个点分配到最*的聚类中心。例:K-表示
- 基于连通性的 —假设附*的对象(数据点)比远处的对象更相关。例如:层次凝聚聚类(HAC) 。
- 基于密度的 —将集群定义为由低密度区域分隔的密集空间区域。示例:带噪声的应用程序的基于密度的空间聚类(DBSCAN)。
- 基于分布的 —假设数据中存在指定数量的分布。每个分布都有自己的均值(μ)和方差(σ ) /协方差(Cov)。例子:高斯混合模型(GMM) 。
DBSCAN 算法是如何工作的?
定义参数
如上所述,基于密度的算法通过识别由不太密集的区域分隔的空间中的密集区域(即,填充有许多数据点)来工作。为了使算法能够找到这些密集区域,我们首先需要建立我们认为足够密集的区域。我们通过指定两个超参数来做到这一点:
- ε(ϵ,sk learn:EPS)——定义该点与任何其他点之间的最大距离的点周围区域的半径,其中一个点被视为另一个点的邻域。简单来说,就是你在下面的 gif 图中看到的圆的半径。
- 最小点数 (MinPts,sk learn:Min _ samples)-邻域中形成聚类所需的最小点数。
例子
让我们看看下面的例子,其中 eps=2.5 单位,MinPts=4。注意,这里的迭代是指一个算法迭代通过每个点,并将其分配到一个类别(噪声、核心点、边界点)。
DBSCAN 过程。图片由作者提供。
- 迭代 0 —尚未访问任何点。接下来,该算法将随机选择一个起点,将我们带到迭代 1。
- 迭代 1 —点 A 只有一个邻居。由于 2 个点(A+1 个邻居)小于 4(形成聚类所需的最小值,如上所述),A 被标记为噪声。
- 迭代 2 —点 B 在其邻域内有 5 个其他点。因为 6 个点(B + 5 个邻居)大于 4,所以识别第一个聚类的开始,其中 B 成为核心点。同时,先前被认为是噪声的点 A 被重新标记为边界点,因为它位于核心点 b 的邻域内
- 迭代 3 到 6 —点 C、D、E、F 被标记为核心点,并被分配给聚类 1。
- 迭代 7 —点 G 被标记为边界点,因为它在核心点 E 和 F 的邻域内,但没有达到被标记为核心点的最小数量 4 个点。
- 迭代 8 —点 H 被标记为噪声(异常值),因为在其邻域内没有其他点。
- 迭代 9 到 12 —识别并标记新的聚类,包含 4 个核心点(I,J,K,L)。
与其他聚类方法相比,DBSCAN 的优缺点
- 优点: 1)很好地识别任意形状的簇;2)可以识别异常值,这可能是练习的主要目标。
- 缺点:由于 Epsilon 和 MinPts 是固定的,所以当数据中存在变化的密度时,它不能很好地工作。
DBSCAN 集群的 Python 示例
现在我们已经了解了 DBSCAN 算法,让我们用 Python 创建一个集群模型。
设置
我们将使用以下数据和库:
- 【Kaggle 的房价数据
- sci kit-学习库用于
1)特征缩放(最小最大缩放器);
2)识别最佳超参数(轮廓得分);
3)执行 DBSCAN 聚类 - 用于数据可视化的 Plotly 和 Matplotlib
- 熊猫进行数据操作
让我们导入所有的库:
接下来,我们下载并读入将用于构建 DBSCAN 集群模型的数据。
(来源:https://www . ka ggle . com/quant Bruce/real-estate-price-prediction?select = Real+estate . CSV)
来自 Kaggle 的房价数据。图片由作者提供。
我们将使用以下 3 个特征对观察结果进行聚类:
- “X3 距离最*的捷运站”
- 《X2 房子时代》
- 单位面积的房价。
请注意,此数据旨在用于根据可用功能预测房价。这就是为什么字段名以 X 和 Y 开头,表示什么应该是特征,什么应该是目标。然而,由于我们将它用于不同的目的(例如,集群),我们可以忽略命名约定。
让我们在三维图上绘制观察结果。
住房数据的 3D 散点图。图表作者作者。
数据准备—特征缩放
对于聚类,尤其是基于密度的方法,在将数据放入模型之前准备数据是至关重要的。虽然您可能希望执行多个变换,但最常见的是缩放。
当您的要素分布具有非常不同的范围时,就会进行缩放。例如,在这个例子中,离最*的 MRT 站的距离在 0 和 6,488 之间,而房屋年龄在 0 到 44 之间。因此需要对它们进行缩放,以使它们符合相同的范围。否则,为 epsilon 选择一个值就不容易了,并且一个特征可能最终单独负责聚类的结果。
让我们画出这三个特征的分布图。
三个特征的分布。图片由作者提供。
现在让我们应用最小-最大缩放,并再次绘制它。
最小-最大缩放后三个特征的分布。图片由作者提供。
如您所见,最小-最大缩放并没有影响要素的基本分布。相反,它缩小了范围,所以它们现在都在 0 到 1 之间。
在某些情况下,您可能还想对分布应用转换。例如,到最*的 MRT 的距离看起来类似于对数分布,这意味着大多数房屋都位于车站附*,很少有房屋离车站较远。
因此,如果您对区分靠* MRT 的所有房屋更感兴趣,而对较远的房屋不太感兴趣,那么您可以应用对数变换来展开它们。
DBSCAN 聚类-选择超参数值
现在我们已经准备好了我们的特性,让我们决定 epsilon 和 MinPts 的值。为此,我们将使用 sklearn 库中可用的剪影乐谱。以下是从其文档中直接引用的一段话:
轮廓系数是为每个样本定义的,由两个分数组成:
a: 一个样本与同一类中所有其他点之间的*均距离。
b: 样本与下一个最*的聚类中所有其他点之间的*均距离。单个样品的轮廓系数 s 为:
一组样本的轮廓系数是每个样本的轮廓系数的*均值。
让我们使用 epsilon 和 MinPts 的不同组合创建多个 DBSCAN 模型,并绘制轮廓分数。
不同ε和 MinPts 的剪影分数。图片由作者提供。
看上面,我们可以看到 eps=0.08 产生最高的分数。一些组合最终具有非常相似的分数,这表明这些组合的聚类输出也是相似的。
我们将选择两种不同的组合来说明超参数选择的结果如何不同。我们将对第一个模型使用 eps=0.08 和 MinPts=3,对第二个模型使用 eps=0.06 和 MinPts=6。
DBSCAN 聚类-运行算法
让我们构建模型并打印分类标签:
DBSCAN 模型集群标签。图片由作者提供。
注意,-1 表示模型将该点定义为异常值(噪声)。
您可以立即看到,第一个模型(eps=0.08,MinPts=3)的聚类较少,聚类 0 和 1 比其他模型大得多。同时,第二个模型(eps=0.06,MinPts=6)产生了更多的簇,这是选择更小的ε的直接结果。
为了使结果更加直观,让我们使用不同的颜色创建相同的 3D 散点图。
首先,让我们将聚类标签合并回数据框。
用 DBSCAN 簇标签存放数据。图片由作者提供。
为第一个模型绘制 3D 图表(eps=0.08,MinPts=3)。
第一个 DBSCAN 模型的 3D 散点图。图表作者作者。
然后我们运行相同的代码,但是用['DBSCAN Clusters 66']替换['DBSCAN Clusters 83']。
第二个 DBSCAN 模型的 3D 散点图。图表作者作者。
如您所见,第二个模型进一步将两个大集群分成了几个小集群。
第一个模型中两个大集群的形成是由位于 MRT 站附*的大多数房屋驱动的(见分布图)。虽然我们提到可以使用对数变换来展开这些观察结果,但我们在第二个模型中采用了不同的方法,而是降低了ε值。
结论
当您具有任意形状的聚类或者您对查找数据中的异常值感兴趣时,基于密度的聚类是您应该考虑的方法。
尽管如此,本文的主要观点应该是集群没有唯一正确的答案。因此,在生成最终的聚类模型之前,考虑数据的多种预处理方法并测试一系列不同的超参数值非常重要。
我希望我的 Python 代码和详细的算法演练已经让您对 DBSCAN 有了很好的理解。此外,如果您希望继续了解这个主题,我还列出了一些可选聚类算法的链接。
干杯!👏
T3【索尔·多比拉斯】T4
如果你已经花光了这个月的学习预算,下次请记得我。 我的个性化链接加入媒介是:
https://solclover.com/membership