作为数据科学家,你必须了解的 3 个 Python 可视化库
在现实生活中,数据预处理对于大多数数据科学家来说确实是一件痛苦的事情。但是在数据可视化库的帮助下,玩起来会很有趣。
以我为例,我经常处理医疗行业的数据,通常面对稀疏、误标记和遗留的数据集(oops)。一种优秀的可视化技术可以让您快速深入了解数据,有时甚至在训练之前,或者更好地表示现有的模型解释和提取。
如标题所示,我们将快速地用 Python 编写三个最令人兴奋的可视化库,并帮助您看穿劣质数据的伪装。
概述:
- Matplotlib :底层详细开发工具,自由编码
- Seaborn :“统计数据可视化”,基于 Matplotlib
- Missingno :一个小巧轻便的 NaN 表示工具
环境设置:
我们正在利用 熊猫 和 Numpy 的力量。如果您手中没有这些工具,只需单击上面的链接并按照说明进行操作。我个人推荐使用 Anaconda 来安装这两个依赖项,在 Anaconda 提示符下键入以下命令,就大功告成了!
conda install -c anaconda pandasconda install -c anaconda numpy
然后,设置我们的五个可视化库:
Matplotlib:
conda install -c conda-forge matplotlib
Seaborn:
conda install -c anaconda seaborn
缺失编号:
conda install -c conda-forge missingno
现在,一切都准备好了!
数据设置:
我正在使用来自 Kaggle open dataset 的数据,并在 Colab 中设置。我不会用 API 调用和设置的细节来烦你,如果你需要帮助,你可以给我发邮件,我会帮你完成的!如果你真的想在 Colab 工作,这些文档可能会有帮助,我也在这里 分享我的工作空间 。
这个脚本用于 Colab,在本地 env 上创建一个工作区,从 Kaggle 获取数据,然后安装 missingno。我们使用的数据是 ka ggle“ka ggle Learn 用户的房价竞争”,这是一个记录良好的开源数据集。
现在,我们导入所有依赖项,读取数据,浏览数据集的前几行
整个数据集
然后,出于演示的目的,我们仅使用整个数据集的子集
选择感兴趣的列
所选列的标题()
希博恩-马特普罗特里布公司
正如我们上面提到的,Matplotlib 是一个支持所有绘图功能的低级绘图工具。我们通常结合 Seaborn 和 Matplotlib 的力量来获得更好的表示。Seaborn 中一些常用的图形:
- 热图:
我们通常使用heatmap
来绘制特征之间的相关性,但它也可以用来绘制 3D 轮廓图中任意三个特征之间的关系(至少一个必须是数字字段)
列之间关联的热图
只有带有dtype!=string
的数据才会计算相关性。我们看到变量YearBuild
和YearRemodAdd
之间的高度相关性
2.配对图:
pairplot
也是一个非常方便的数据汇总工具。您不仅可以看到特征之间的成对关系,还可以看到单变量图、概率质量图等。
子集数据的配对图
随特征“景观”变化的数据对绘图
3.紫罗兰花:
violinplot
一般用于分布可视化和分布比较。对于只有两个唯一条目的不同特征,我们使用split=True
在它们之间进行比较
小提琴在’土地斜坡’,'空地’和’街道’之间
如图所示,我们看到LandSlope
和LotArea
只受Street
影响,它只有两种类型的入口: Pave 和 Grvl 。板变量选择该图的颜色主题和对应于每个数据集条目的inner=”stick”
missingno & Matplotlib
Missingno 是一个很小但很棒的数据可视化库。它有像 Seaborn 一样的常规图表,如heatmap
、Bar Chart
,但也有一些独特的图表,如空图Matrix
和Dendrogram
。
在医学数据中,经常会有大量的空数据,这些空数据用零空间表示非常直观,不推荐!
缺少矩阵号
缺少的数字用横条表示数据,缺少横条表示空值。我们看到特性Alley
非常稀疏,而特性LotFrontAge
有相当数量的有用数据。因此,对于数据预处理,我们可以决定丢弃Alley
并估算LotFrontage
关于如何处理数据科学中的缺失数据,可以参考这篇文章:
预处理对于现实生活中的机器学习非常重要,通常我们会看到一个数据集包含很多…
medium.com](https://medium.com/@haoyanjiang0709/real-life-machine-learning-deal-with-missing-values-in-raw-data-29c5e9b6f00d)
下一步及以后:
这三个库非常基础,但在数据科学领域非常强大,足以满足行业中 95%的数据可视化工作。一些下一级工具,如 Plotly 或 Bokeh ,也建立在 Matplotplib 之上,让您能够构建交互式绘图并在 Web 应用程序上提供服务。当我学习了更多关于 Python 后端技术和前端工程的知识后,我将进入这个领域👊
如果你正在考虑获得计算机科学学位,要问的 3 个问题
自从我在早先的一篇文章中分享了关于重返校园攻读计算机科学学位的内容后,一些读者联系我说他们正在考虑走同样的路。他们中的许多人也已经在数据科学/工程领域或完全不相关的领域工作,但觉得他们可能仍然想学习——不管出于什么原因。
因此,我写下这篇后续文章,与你分享我对在即将完成大一学业后攻读计算机科学第二个本科学位的“精炼”意见。希望我能告知并帮助你做出自己的决定。在本文的最后,我还列出了一些免费资源供您参考。这可能是一个好的开始。
我自己的简史:我有经济学学士学位和硕士学位。在获得计算机科学的第二个学士学位之前,我已经工作了 3 年。它是在线交付的(期末考试除外),这使我能够将学习与我目前在普华永道的工作结合起来。
好吧,你在想 CS 学位是否适合你,尤其是当你已经工作的时候。这是一个很难的问题,涉及到你生活中很多不同的方面,但是我们不要让它变得比它应该的更难。这里有几个简单的问题可能会有帮助。
1.你想从一个 CS 学位中获得什么价值?
才能胜任那份该死的工作?
我怕可能不值得。
信不信由你,我们大多数人不需要一个 CS 学位就能得到我们真正想要的工作。到目前为止,我只听说过谷歌的一些工程职位明确不雇佣没有计算机科学本科学位的人(这可能会改变)。因此,如果这是你的唯一目标,你最好去上在线课程,阅读书籍,建立一个好的投资组合。你实际上可以在网上找到整个 CS 学位(我在本文末尾列出了一些有用的资源)。这可能会节省你大量的时间和金钱。
但是如果一个学位能让你在这个领域更加自信和全面,那就去做吧!
满足你的好奇心?
我们中的一些人有幸(或被诅咒)拥有前所未有的好奇心。
我们重视知识和理解胜过很多东西——包括学习和为考试而学习的艰苦经历。如果你对编程和抽象的东西非常感兴趣,你可能会发现自己处于学习计算机科学的最佳位置。
我可以告诉你,最终理解互联网和计算机是如何工作的是非常令人满意的,尽管我们大多数人认为它们是理所当然的。熟知不同的计算机算法也是非常令人满足的。
也就是说,任何 CS 项目的一部分都会让你厌烦。有一天,你可能会发现自己在阅读那些疯狂抽象的计算理论,这些理论可能会让你觉得毫无兴趣,毫无意义。
如果你觉得自己有足够的好奇心去学习,这是一个非常好的动力。也就是说,你也可以自学所有的东西,唯一不同的是有人指导你,支持你,和你一起学习,最后你会拿到学位。
更有创造力,更善于解决问题?
你可能从学位中获得的另一个价值是从老师和同学那里获得大量的想法和资源。你有机会创造一些非常酷的应用程序、游戏或工具。这些通常是作为不同模块的一部分的项目,它们真的很有趣。
您还将学习解决许多不同类型的问题,不仅通过编码实践,还通过概念理解和设计技巧。
计算机科学是一门奇怪的学科——人们基本上是凭空创造东西。因此, 如果你热爱创造现实世界的技术应用 并从技术角度解决问题,你可能会发现攻读计算机科学学位是一次非常有益的经历。
也就是说,我绝不是说 CS 学位是发挥创造力的唯一途径。但我确实相信它能帮助你敞开心扉接受新的概念和想法;最棒的是,你还知道如何用你的知识和解决问题的技巧来实现它们。
接受更多的机会?
一个 CS 学位大概是中最通用的学历了。它可以为一些非常令人兴奋的职业奠定良好的基础,从软件工程师、机器学习工程师、全栈开发人员到技术作家。
这里有一份关于计算机科学专业的 100 种职业的列表。
你认为自己几年后会从事这些工作吗?有许多工作可能还不存在,所以如果你还没有找到理想的职业,不要失望。
老实说,我自己仍然没有一个确切的答案,比如说,5 年后我将从事什么类型的工作,但我可以看到自己修补软件、数据、安全,并思考它如何帮助我们人类。或者我可能最终成为一名作家或艺术家——当计算机最终取代我们的工作,我们不再需要工作时:)。
这让我想到了下一个大问题。
2.你想在职业生涯中有怎样的感受?
鉴于计算机科学学位可能会扭曲你的职业道路,值得考虑你在工作和职业中的感受。这个想法来自丹妮尔·拉波特和欲望地图。他们建议我们应该更多地关注我们在职业和工作中的感受,而不是我们想做什么。
你喜欢处于心流状态吗?
你喜欢感觉对别人有帮助吗(以一种书呆子的方式)?
在解决重要问题时,你喜欢感觉自己有能力吗(用逻辑、软件、算法和数据)?
在某些情况下,你会因为某些事情而感到有动力吗?
你喜欢被某些类型的人包围吗?
当你想诚实地看待你想从计算机专业的职业生涯中得到什么和期望时,这些可能是有用的问题。
3.你权衡过潜在的成本吗?
时间和精力
攻读学位不是一件容易的事。工作量很大,尤其是如果你像我一样几乎是全职工作的话。这意味着您需要做好准备:
工作时间比大多数人都长:
是的,听起来很残忍。但这是一个可悲的现实。除了 8 个小时的工作时间,准备好每天学习 1-2 个小时,否则你将不得不在周末学习很多。我发现每周 10 小时的学习对于我所学的课程来说已经足够了,但是这可能会在考试期间延长。此外,你很快会发现很多你可能对 CS 项目之外的新东西感兴趣。
上学期我上了一门网络开发课程。不知何故,我对深入了解这一领域如此感兴趣,以至于我最后又花了 30 个小时在 Udemy 上学习了高级 Javascript 和 T2 的 Web 开发者入门课程。除了课本,你可能还想阅读某些模块的相关书籍,这将很快增加所需的时间。
有些人加快学习速度,每学期少选一些课程,这样他们就可以轻松地将学习融入繁忙的生活。我的步调几乎正常(作为一名全日制学生),所以说实话,我可能比我应该抱怨的更多😉。
我也尽量高效地管理工作和学习。这包括:
- 保持一个良好的笔记系统(对我来说,这只是简单地意味着采取可以理解的手写笔记和索引)。
- 保存每天/每周的待办事项和可能要做的事情清单
- 提前做好计划(有时仍在为此挣扎,因为我总是倾向于把事情留到最后一分钟)
- 同时应用不同的策略,如以两倍的速度播放视频,专注于最重要和最有价值的核心知识,以及一系列生产力技巧。我曾经不喜欢 hacks,因为它们听起来有点“廉价”,我的骄傲尖叫着“我这辈子不需要黑任何东西”。但是,他们工作了!
机会成本:
你可能已经知道没有什么是真正免费的。经济学教授喜欢称之为“机会成本”。我们只有有限的时间、精力和金钱。当你把钱花在某件事情上时,你就牺牲了做其他事情的机会。
如果你不是在攻读学位,你有什么更想做的事吗?
思考你是否处于职业生涯和生活的低机会成本时期也是有用的。
这类似于漫长工作周之后的一个慵懒的周五下午,你只是懒洋洋地坐下来,看看 YouTube 和网飞,或者清理一下邮箱。这是一个低机会成本的时刻,风险很小,这意味着你可以将它投入到更有意义的事情中。
同样,如果你在职业生涯和生活的某个阶段有时间做 却没有更好的事情做 ,那么学习就是一个非常好的选择。但是,如果你有孩子或打算这么做,或者如果你想专注于你的人际关系,或者如果你想追求其他的努力和副业,那么你需要权衡学习的成本和收益。
金融
一个学位会花掉你一大笔钱,即使在线课程可以减少一半的费用。如果你在工作,你可能有更好的选择:让你的雇主赞助你的学习。大多数情况下,这是有条件的。比如要求你在公司待一定时间,除非你偿还学习费用。
学习 CS 的一些有用资源:
我希望这篇文章能为你做出自己的决定提供一些启发。感谢您的阅读。
原载于https://www.thuhienvu.com*。*
通过问自己以下三个问题,轻松完成任何数据可视化项目
作为一名数据分析师,我的大部分时间都用来为不同的利益相关者可视化数据集。数据可视化可以采取多种形式。它们可以是简单的 Google Sheets 图表、Python 笔记本上的一些可视化内容,或者是复杂的 Tableau 仪表板。在可视化任何数据集之前,我总是会问自己以下三个问题。
你的目标受众是谁?
这无疑是问自己最重要的问题。涉众是技术还是非技术受众?他们对您要可视化的数据的熟悉程度如何?他们是你的同事还是管理层的经理?您是否为不同的受众群体或特定团队可视化数据?在考虑可视化数据之前,充分了解你的目标受众有助于你取得一半的成功。
我经常通过回答上面的所有问题来记录我的观众档案。我有不同的可视化方法来适应不同的观众类型。例如,如果我的读者是要求我做一些探索性分析的非技术人员,我会想到一些 Google Sheets 图表,而不是 Tableau 仪表板。这样,我也可以轻松地与他们共享数据集。他们可以根据需要调整图形或图表。例如,他们可能后来意识到,他们只对上个月的数据感兴趣,而不是最初询问的 6 个月的数据。
如果我知道我将要向一个庞大而多样化的群体展示一些视觉化的东西,我会更加注意在视觉化的东西中加入更多的解释。例如,“日活跃用户”或“留存率”可能一开始听起来微不足道。然而,这些指标在不同的业务或行业中可能有非常不同的定义。我会在我的图表下面添加一个简短的标题来解释我是如何计算这些指标的。
这种可视化的目的是什么?
在了解了我的听众之后,我通常会和他们展开一个简短的讨论,以了解他们的期望。简单地问“你的目标是什么?”可能行得通,但并不总是像看起来那么容易。然而,我仍然建议非常直截了当地询问他们的需求和期望。然后,我问一些试探性的问题,归结为我需要满足的最重要的需求。
例如,客户成功团队希望更多地了解客户投诉及其团队绩效。在最初的对话中,我会核实他们是否需要临时分析或深入的仪表板。在第一种情况下,一些 Excel 图表应该足以解决他们的燃眉之急。在第二种情况下,我需要构建一个显示各种指标的仪表板,以帮助他们全面了解历史数据、当前性能和未来趋势。
假设他们想要一个仪表板。然后,我们一起集思广益,列出他们希望看到的指标。在头脑风暴阶段,我与我的利益相关者分享,他们不应该担心可行性或优先级。让我们考虑尽可能多的指标。之后,我们根据优先级对指标进行排序。如果我们确切地知道什么应该放在优先列表的首位,这个任务就很容易。否则,我们会为每个指标分配相对分数,然后选择前三名或前五名。一旦确定了优先级,我们就开始讨论可行性。有些指标很容易构建,有些则不容易,主要是因为用于构建这些指标的相关数据还不可用。
我提到的过程可能需要一到两次 30 分钟的会议。排名指标的列表保存在一个共享的 Google Docs 文件中,该文件是可共享的,并允许其他人进行评论。对于如何理解他们的期望和需求有一个清晰的结构有助于您更容易地浏览数据可视化过程。
数据背后有什么故事?
如果这些数据没有引起你的注意,也许你需要花些时间更深入地思考。例如,您可能会对显示按类别细分的客户投诉数量的堆积条形图感到非常自豪。图表看起来很清晰,有所有必要的标题。调色板看起来很棒。然而,通过查看这个图表,您发现了哪些真知灼见?你可能会意识到一个类别可能会支配其他类别。在这种情况下,按降序对字段进行排序是最有帮助的操作。当查看您的图表时,观众可以很容易地在第一时间发现主导类别。
一些类型的数据可视化在开始时看起来是最好的选择,但是直到你思考数据背后的故事时才知道。当您处理时间序列数据时,很容易认为折线图是一个显而易见的答案。然而,你认为有时条形图是更好的候选吗?条形图不仅能帮助你看到趋势,还能帮助你更快地发现异常值,这要归功于这些条形图相对于其他条形图的突出优势。
让我们回到客户成功仪表板的例子。假设您正在可视化一段时间内客户服务票据的数量,x 轴是周期,y 轴是票据的数量。折线图强调你对整体趋势的关注。然而,条形图可能会将您的注意力转移到 8 月份门票数量出现峰值的几周。在做了一些研究后,你可能会发现根本原因是在那几周有新产品发布。由于顾客对新产品不熟悉,他们问了很多问题,这增加了门票的数量。因此,团队意识到他们应该添加更多关于新产品的说明,以减少该产品的标签数量。
结论
这三个问题是我在做任何数据可视化项目之前的自制清单。这帮助我非常有效地浏览流程,为每个人节省时间,并使我的工作流程更加结构化。我给你的建议是创建你的清单。如果您觉得有帮助,请随意添加更多步骤。我希望您在交付任何数据可视化时能够更加自信。
原载于 2020 年 10 月 16 日【http://baovinhnguyen.com】。
创建数据可视化时,你应该问自己的 3 个问题
和 3 个记忆它们的迷因
作为一名有抱负的数据分析师,我一直热衷于创建各种数据可视化。虽然我的第一次试验非常基础(如果我想完全诚实的话,相当难看),但我发现自己在进入任何数据可视化的图形执行之前开发了一个简单的方法。在图形创建的概念阶段,我问了自己 3 个主要问题。在构思、构建和分享图表时回答这些问题,将有助于我了解我构建这个图表的目的。我希望这些技巧能帮助你创建有洞察力的漂亮的图表!
以下图为例,让我带你了解这 3 个技巧。如果你愿意,你可以在我的 GitHub 页面 找到这个图背后的代码。
玛丽·勒费夫尔
1.你的图表回答了一个有趣的问题吗?
在你开始创建你的梦想图表之前,问自己这个简单的问题:我的图表会引起某人的注意吗?要回答这个问题,你需要迈出关键的第一步:确定这个图表是写给谁的。一旦你确定了你的目标受众(难怪我在这里使用营销术语),你应该设身处地为你的受众着想,提出一个能引起他们兴趣的问题——一些能让他们看你的图表超过半秒钟的问题。为了让你的读者相信他们应该花些时间在你的图表上,你需要创造出我称之为的“Mhmh”效应**——这种“mh”是一种响亮的反射噪音。**
就我而言,我一直对一个群体的感知回收行为和这个群体的实际回收行为之间可能存在的差距感兴趣。一些调查或意见晴雨表经常显示一个国家人口的自我报告再循环率。然而,这些数字并不一定与当地政府公布的实际回收率相符。因此,问题来了:欧盟 28 个国家自我报告的回收率有多接近现实?我制作的图表告诉我们的不仅仅是简单地显示市政当局的回收利用率,或者一项调查的结果。通过结合两种数据来源,它向读者展示了哪些国家的实际回收率与调查报告的回收率之间存在显著差异(以及差异的方向)。
使用 Imgflip 创建
2.你的图表真实吗?
一旦你确定了你想回答的有趣问题,你必须确保你会如实回答。这主要取决于你收集数据和处理数据的方式。
苹果和橘子:比较什么是可比较的
首先,检查你的数据集的可靠性。如果您使用的是来自企业的内部数据或您自己构建的数据集,那么您将使用的数据很可能是一致的。即使这听起来很愚蠢,在继续下一步之前,也要检查一下是否确实如此。如果您正在寻找开源数据集,确保数据源的可靠性和可比性的第一步是非常重要的。
对我来说,主要的挑战是从专注于欧洲的开源平台上找到可比较的数据集。此外,我必须找到一些关于欧洲国家实际回收利用率的数据,以及一些关于其人口回收习惯的数据(例如,来自机构报告或人口调查)。最后,两套数据必须涵盖相同的国家和相同的时间范围。经过一番研究,我在两个不同的网站上发现了一致的数据——耶!一份来自欧洲环境署,涵盖 2014 年和 2017 年的 34 个国家,另一份来自欧盟开放数据门户,涵盖 2017 年的 28 个国家。因此,结合两个数据集使我能够在一个一致的数据库上工作。
少即是多:注意你的图形选择可能产生的影响
你要仔细观察的第二件事与你所做的图形选择有关。构建一个图表是许多决策和设计选择的结果。确保你所有的图形选择服务于你可视化的数据的真实性。特别是,我想提醒您注意以下几点,这将防止图形表示中的偏差,并确保您的图形真实地代表所选数据:
- 数字单位和刻度:您会使用百分比还是绝对值?如何在同一个图上表示不同刻度的值?在哪里显示图表中使用的单位和比例?
- 颜色:读者会如何看待所选的颜色?你应该使用连续色标还是离散色标?我的图表会导致哪些误导性的解释?
- 投影:对于一张地图,你会使用哪种地球投影?3D 形式或阴影等视觉效果是否会影响您对图表的理解?线条粗细等设计元素在你的图表可读性中扮演什么角色?
- 辅助元素:你将如何在图表周围安排框架和文本元素?你使用哪种文字字体和风格?如何在图表上和图表周围的过多和过少信息之间找到正确的组合?
至于我的图表,我选择了常用的地球投影和专注于欧洲的比例,以便符合所显示国家的地理现实,而不是通过在地图上显示不相关的国家来误导读者。我选择了三种我认为和谐的颜色,这有助于强调我的关键信息:我选择橙色代表实际回收率低于自我报告的回收率的国家,紫色代表中性色,绿色代表实际回收率高于感知回收率的国家。最后,我故意留下了额外的帧或视觉效果,因为它们会妨碍对图形的平滑读取。
使用 Imgflip 创建
3.你的图表以一种清晰的方式教授了一些新的东西吗?
教新东西…
这与第一个问题“你的图表回答了一个有趣的问题吗?”。在你吸引了读者的注意力之后,你必须保持他的注意力,并最终导致某种“啊哈!”效果 —当你意识到图表真正表达了什么,以及这可能会产生什么后果时的这种反应。
**我想通过我的图表传达的信息是,**大多数国家报告的回收利用率比实际回收利用率高,而且这种趋势在一些国家比其他国家更高。为了避免对这个话题的任何判断,我用图表展示了欧洲不同国家的实际回收率和自我报告的回收率之间的差距。我用颜色来传达我的信息,并用标题、图例和旁注中的有用信息来补充图表本身,以帮助读者快速理解我的图表所展示的内容。
…以明确的方式
如果你的图表提出的问题真的很有趣,那么答案可能是多方面的。但是你应该选择一个清晰的信息,而不是试图在一张图上传达太多的想法。如果你想传达许多彼此相关的想法,你可以将一个复杂的信息分成两个或三个图表,每个图表包含一个有效的关键信息。这确实是伟大的数据可视化的秘密。
在我的例子中,我想显示每个国家的实际回收率的值,以及这个实际回收率和自我报告的回收率之间的差距。但是这个图表的地理维度加上一个色阶构成了我能用一个图表传达的最大信息量**——增加每个国家的实际回收率会使图表超载,关键信息会丢失。因此,我回到了我最初的问题“欧盟 28 个国家自我报告的回收率有多接近现实?”。对此给出最明确答案的图形决策是在地图上显示一个色标,用适当选择的颜色突出实际和自我报告的回收率之间的差距。**
使用 Imgflip 创建
受《权力的游戏》启发的 3 种快速简单的数据可视化
回答问题:我在看什么?
由mauricio Santos在 Unsplash 上拍摄的照片
又被隔离了一个下午。我决定通过玩一些有趣的数据来提高我的视觉化技能。在这篇文章中,你会发现:
- Seaborn 图书馆提供的热图
- 由 Plotly Express 提供的条形图
- 散点图(带注释!)动力 Seaborn
我会揭开浏览量、收视率、每集死亡人数和史诗战役之间的关系!剧透警告:如果你认为你知道大量观众喜欢什么,请三思!
使用的数据集
用于收集每集收视率和浏览量的第一个数据集可以在Kaggle这里找到。
我使用的第二个数据集总结了每集的死亡人数和可以在数据世界 这里找到。
关于我是如何根据季节和剧集连接这两个数据帧的更多信息可以在下面找到。
IMDb 评级所有季节
我希望能够看到的第一件事是每集的收视率,以及它在不同季节的变化。为此,我使用了 Seaborn 热图。
df1=pd.read_csv("Data/Heatmap_GOT.csv"**,** index_col=**0**)sns.heatmap(df1**,** annot=True**,** cmap='RdPu'**,** annot_kws={"size":**8**}**,** linewidths=**.5**)plt.title('Game of Thrones - Rate IMDb'**,** fontsize=**15**)
plt.show()
我们可以清楚地看到,《权力的游戏》前七季的收视率非常出色,每一季的最后几集收视率都明显较高。当我们到达第八季时,出现了相当大的下降。我不喜欢批评…但是这里有几个可能导致低收视率的原因…
每季浏览量
最后一季的收视率明显较低,这是否意味着观看人数减少?
让我们通过绘制每个季节的点击率来看一下。该柱状图是使用 plotly express 绘制的。这里是如何使用这个最近更新的新库的一步一步的教程。
条形图在试图可视化少于 10 个类别的分类数据时非常有效。多了这些,剧情就会杂乱无章,难以理解。在处理分类数据时,我更喜欢使用条形图,因为我们可以通过简单地查看条形的大小来轻松地可视化类别之间的差异。此外,我们可以按颜色分类。
views =df.groupby(['Season']).mean().reset_index()
fig = px.bar(views,
x='Season',
y= 'views',
color='Season',
title = "Views (in millions) per season")
fig.show()
从第一季的 230 万到第八季的 1200 万,浏览量直线上升。这解释了为什么预算从第一季的 600 万美元增加到最后一季的 1500 万美元。不幸的是,我提出的假设被证明是错误的,因为收视率最低的那个季节有最多的浏览量!
每集死亡人数—假设检验 v.1
我的一个假设是,有更多动作的剧集会转化成更多的观看次数,并且会从公众那里获得更高的收视率。为了形象化这种关系,我决定实现一个散点图,将浏览量和收视率联系起来。
散点图非常适合显示多个变量之间的关系,因为我们可以看到原始数据的分布。通过对各组进行颜色编码,我们可以查看不同数据组之间的关系。为了形象化三个变量,我们创建了另一个参数,比如点的大小,或者颜色。
我做的第一件事是合并两个数据帧(视图和死亡)。我创建了一个公共列,对季节和情节进行编码。以第一季第二集为例,结果采用这种格式(1,2)。
df["episode"] = df["Season"].astype(str) + ","+df["Number in Season"].astype(str)
deaths["episode"] = deaths["death_season"].astype(str) + ","+ deaths["death_episode"].astype(str)
merged = pd.merge(df**,** deaths**,** on='episode'**,** how='inner')
使用 groupby 函数,我对剧集进行排序,并保存“浏览量”、“收视率”和“死亡人数”这三列。
new_merged = merged.groupby(['episode'**,**'views'**,**'Rating'**,** 'Season'**,** 'Death_Count']).size().reset_index(name='deaths')ax = sns.scatterplot(data=new_merged**,** x="views"**,** y="Rating"**,** hue="deaths"**,** size="deaths")
plt.show()
情节上的每个圆圈代表系列中的一集。大小和颜色与事件中重大死亡的数量成线性关系。这种观想所提供的信息并没有导致任何结论性的结果。这一集的内容一定会强烈影响收视率,而且不仅仅是死亡**!这是我将在下一节研究的内容。**
每集战斗—假设检验 v.2
我的第二个假设是观众喜欢战斗。谁不喜欢穿着闪亮盔甲的男人和女人为他们所爱的人而战。让我们看看这是否可以用数据来佐证。
我找不到包含该系列主要战役的数据集。我决定手动创建一个,用下面的网站花了大约 8 分钟。
# Create dataframe with main battles
battles = {'Name': ["Frozen Lake Battle"**,** " Loot Train Attack"**,** "Battle of Blackwater"**,** "Battle of Castle Black"**,** "Battle of the Bastards"**,** "Fall of King’s Landing"**,** "Battle of Winterfell"**,** "Dance of Dragons"**,** "Stormbron"]**,** 'Episode': [**6, 4, 9, 9, 9, 5, 3, 9, 2**]**,** 'Season': [**7, 7, 2, 4, 6, 8, 8, 5, 7**]
}
battles = pd.DataFrame(data=battles)
我将“战斗”数据帧与包含视图和评级的数据帧合并。我决定保持散点图的可视化,但是为包含一场战斗的每一集增加了一个标记。
battles["episode"] = battles["Season"].astype(str) + ","+ battles["Episode"].astype(str)
d.drop(['Season'**,**'Episode' ]**,** axis=**1,** inplace=True)
merged = pd.merge(df**,** battles**,** on='episode'**,** how='outer')
merged = merged.replace(np.nan**,** ''**,** regex=True)
p1=sns.scatterplot(data=merged**,** x="views"**,** y="Rating"**,** hue = 'Season')for n in range(**0,** merged.shape[**0**]):
p1.text(merged.views[n] + **0.2,** merged.Rating[n]**,** merged.Name[n]**,** horizontalalignment='center'**,** color='black'**,**weight='semibold'**,** fontsize=**9**)
plt.show()
清澈见底,不是吗?有战斗的剧集收视率一直较高。唯一的例外仍然是排名较低的最后一季剧集,这可以从对应于该季的每个点的颜色看出。
感谢阅读!
如果你喜欢我的作品,我会非常感激你跟随我来到这里。
如果您对如何改进有任何问题、建议或想法,请在下面留下评论或通过 LinkedIn 这里取得联系。
Github 知识库
所有代码都可以在 Github 这里的gameoftrones . py文件中找到!
在神经网络上使用随机森林的 3 个理由——比较机器学习和深度学习
由于几个主要原因,随机森林是比神经网络更好的选择。下面是比较机器学习和深度学习需要知道的。
神经网络已被证明在许多行业领域胜过许多机器学习算法。它们不断地学习,直到得出最佳特征集,以获得令人满意的预测性能。然而,神经网络会将你的变量换算成一系列数字,一旦神经网络完成学习阶段,这些特征对我们来说就变得无法区分了。
如果我们关心的只是预测,那么神经网络将是一直在使用的事实上的算法。但是在一个行业环境中,我们需要一个能给利益相关者赋予特征/变量意义的模型。这些利益相关者很可能是除了具有深度学习或机器学习知识的人之外的任何人。
随机森林和神经网络的主要区别是什么?
随机森林和神经网络是学习方式不同的不同技术,但可以用于类似的领域。随机森林是机器学习的技术,而神经网络是深度学习的专属。
什么是神经网络?
一个神经网络是一个松散地基于人类大脑皮层功能的计算模型,用于复制相同类型的思维和感知。神经网络被组织成由互连节点组成的层,这些节点包含计算网络输出的激活函数。
神经网络是机器学习的另一种方式,其中计算机通过分析训练样本来学习执行任务。由于神经网络松散地基于人脑,它将由数千或数百万相互连接的节点组成。一个节点可以连接到它下面的层中的几个节点,它从这些节点接收数据,也可以连接到它上面的几个节点接收数据。每个输入的数据点接收一个权重,然后相乘并相加。如果加权和等于零,则添加偏差,然后传递给激活函数。
神经网络的体系结构
神经网络有 3 种基本架构:
- 单层前馈网络
- 它是最简单的网络,是感知器的扩展版本。它在输入层和输出层之间有额外的隐藏节点。
2.多层前馈网络
- 除了输入和输出之外,这种类型的网络具有一个或多个隐藏层。它的作用是干预输入和输出层之间的数据传输。
- 递归神经网络与上述类似,但被广泛用于预测序列数据,如文本和时间序列。最著名的递归神经网络是“长短期记忆”模型(LSTM) 。
什么是随机森林?
随机森林是决策树的集合,其中最终/叶节点要么是分类问题的多数类,要么是回归问题的平均值。
随机森林将生长许多分类树,并且对于来自该树的每个输出,我们说树’为该类投票’。使用以下步骤来生长树:
- 将为每棵树从训练数据中随机抽取行样本。
- 从步骤(1)中获取的样本中,将获取一个特征子集用于在每棵树上进行分割。
- 每个树都增长到参数指定的最大程度,直到达到该类的投票。
为什么应该使用随机森林?
使用随机森林而不是决策树的根本原因是将许多决策树的预测合并到一个模型中。逻辑是,由许多平庸的模型组成的单个 even 仍将优于一个好模型。鉴于随机森林的主流表现,这是有道理的。因此,随机森林不太容易过度适应。
像决策树这样的灵活模型可能会出现过拟合,其中模型会记忆训练数据并学习数据中的任何噪声。这将使其无法预测测试数据。
随机森林可以通过将许多树组合成一个集成模型来减少来自决策树等灵活模型的高方差。
什么时候应该使用随机森林而不是神经网络?
随机森林的计算成本较低,并且不需要 GPU 来完成训练。随机森林可以给你一个不同的决策树解释,但性能更好。神经网络需要比普通人手头更多的数据才能真正有效。神经网络会简单地降低要素的可解释性,以至于对性能而言变得毫无意义。虽然对某些人来说这听起来很合理,但这取决于每个项目。
如果目标是在不考虑变量的情况下创建一个预测模型,那么尽一切可能使用神经网络,但是这样做需要资源。如果需要了解变量,那么不管我们喜欢与否,在这种情况下通常会发生的情况是,性能将不得不受到轻微的影响,以确保我们仍然能够了解每个变量对预测模型的影响。
我在这里遗漏了什么吗?
请让我知道,我很乐意把它加进去。
我喜欢成为数据科学家的 3 个原因
这一切都归结于马尔科姆·格拉德威尔在他的书《局外人》中解释的“有意义的工作”的概念。
在马尔科姆·格拉德威尔的《局外人》一书中,他解释了比尔·盖茨和披头士等伟大人物的成功,涵盖了教育、价值观甚至出生日期等话题,以确定一个人是否具备成为局外人并取得成功的要素。他还谈到了是什么让工作充满成就感和动力,让我们每天早上醒来寻找下一个挑战。
在 60 年代中期,甲壳虫乐队有了重大突破,他们已经演奏了疯狂的小时数。1959 年,他们搬到德国汉堡,在一家脱衣舞俱乐部里表演了很多年,每周 7 天,每天 8 小时,几乎拿着最低工资。他们全身心地投入到自己热爱的事情中,努力追求自己的梦想。
比尔·盖茨十几岁的时候,接触电脑不仅仅是一件商品。他第一次发现计算机是在湖边学校的计算机俱乐部,一台 ASR-33 电传打字机终端,他被迷住了。后来,他的同学保罗·艾伦发现华盛顿大学健康中心的一台主机在凌晨 2 点到 6 点是免费的。尽管是凌晨时分,这两个朋友还是开始去大学使用大型机,将他们的身心完全投入到探索计算世界中。盖茨会离家出走,在大学里通宵编程。几年后,当他的母亲听到这个故事时,她终于明白了为什么早上把他从床上叫起来这么难。
我们如何解释他们的动机和火花,激发他们不顾任何障碍投入如此疯狂的时间和精力?正如马尔科姆·格拉德威尔所说,他们相信有意义的工作的概念,这个概念的基石是,如果你付出努力和工作,你会得到回报(T21)。更确切地说,有意义工作的概念由三个支柱组成:
- 自主:掌控我们自己的决定。
- 复杂:受到任务难度的挑战。
- 努力和回报之间的联系。
大多数人都会同意,自主性、复杂性以及努力和回报之间的联系这三点是工作要令人满意必须具备的三个品质。"
马尔科姆·格拉德威尔,局外人:成功的故事
1 —自主
在我们生活的这个时代,成为自己的老板变得前所未有的容易。即使在企业界,也出现了向更大自主权的转变,以推动创新。作为一名数据科学家,尽管你在工作,但你有很多机会开发自己的项目,因为你是这艘船的船长。
它可以是一场 Kaggle 比赛,一个由人工智能驱动的应用程序,甚至是互联网上的出版物或教程。我们不需要征得任何房东或老板的同意。我们可以自由开发,随心所欲地创造和分享。
更大的自主权意味着更大的责任,你发展了一套新的技能,让你能够以创造性的方式面对挑战。你自己做决定,并从中学习;您知道您的选择会对业务和团队产生影响。有了自主权,你可以建立自尊和自我意识,这是成功人士的关键能力。
它不需要是一个巨大的项目、突破性的技术或重大的创新。开始一个副业,你自己的项目。做决定,失败学习,然后继续。参加 Kaggle 竞赛,开始在 Medium 上发布,开发自己的项目并在 Github 上共享代码,创建自己的应用程序。机会是无止境的,从小处着手,往大处想。
2 —复杂性
如果我给你一个选择,要么做一名建筑师,年薪 75,000 美元,要么在收费站工作一辈子,年薪 100,000 美元,你会选哪个?
马尔科姆·格拉德威尔,局外人:成功的故事
金钱是我们社会的一大动力,但不是最强大的动力。能够以新的方式挑战自我和克服困难是我们最大的快乐。
作为一名数据科学家,你需要具备三种技能。首先,你需要学习数学来理解像反向传播、卷积神经网络或递归神经网络这样的概念。这些概念需要与技术技能联系起来,如编程、数据库管理,甚至云计算或 DevOps,这些创造了第二个支柱,即计算机科学。最后,这两种技能只是达到目的的手段,而不是最终的结果。你需要一个应用这些技能的领域专家。很明显,在这三个领域超越他人是很困难的,但是你需要在这三者之间保持一定程度的平衡。
为了让你的工作有意义,它需要带你到新的极限,挑战你。当然,并不是一切都应该是痛苦和困难。你想发现在困难的情况下你能走多远,从山顶回首过去,为你为了达到现在的位置所付出的巨大努力和取得的成就而自豪。每个人都能爬山,但不是每个人都能爬喜马拉雅山。它需要专业知识,领域特定的知识和勇敢的个性来面对障碍。
3——努力和回报之间的联系
第三点背后的想法很简单,你付出的努力越多,得到的回报就越多。
我来自西班牙南部,那里到处都是橄榄园和农田。从事农业的人知道,即使你愿意工作很长时间,尽你最大的努力,也有一个点,你不能推动事情向前发展。植物的生长需要时间和一系列条件,如果它们不匹配,你可以想多早醒来就多早醒来,或者尽你所能努力工作,但植物不会长得更快或更大。从事农业是一件艰难的事情,如果你想让你的事业发展,你还需要培养耐心和尊重自然。
作为一名数据科学家,我们没有这种限制,没有一个季节用于训练模型,另一个季节用于测试,下雨或寒冷不会阻止你的发展,你可以贡献尽可能多的时间,你会得到奖励。当然,这并不是简单的投入一定的时间获得一定的回报,这取决于你的技能,你组织工作的能力或你的能力。
努力和回报之间的这种积极关系让那些愿意投入工作的人有机会脱颖而出,有所作为。如果你管理好自己的时间,专注于重要的事情,你就有机会成为一名伟大的数据科学家。
结论
数据科学家是一个非常复杂和具有挑战性的工作,但你可以从中获得一个最重要的回报,那就是工作有意义的感觉。一份能让你成长和拓展能力的工作,一份值得骄傲的工作,不管有什么困难,如果你付出了努力,就会得到回报。你不需要请求许可,你可以自主设计和开发你自己的项目。而且是对当今社会影响较高的工作,处于创新生态系统的最前沿。
[## 如何建立一个编码器解码器翻译模型使用 LSTM 与 Python 和 Keras。
按照这一步一步的指南来建立一个编码器和解码器模型,并创建自己的翻译模型。
towardsdatascience.com](/how-to-build-an-encoder-decoder-translation-model-using-lstm-with-python-and-keras-a31e9d864b9b) [## 我从人工智能中学到的关于生命的 3 件事
当你意识到你的生活是由算法管理的时候,重新获得控制权的唯一方法就是像算法一样思考。
medium.com](https://medium.com/@dbenzaquenm/the-3-things-i-learned-from-artificial-intelligence-about-life-355713237e59)
我推荐你先学习 Python 的 3 个理由
马库斯·斯皮斯克在 Unsplash 上的照片
如果你想从数据科学开始而不是先学 R
P ython 和 R 是数据科学和机器学习领域最常用的语言。两种语言各有优势。
在过去的两年里,我已经在我的数据科学和机器学习项目中使用了这两种语言。如果你想在这个领域起步,我强烈建议你先开始学习 Python,几个月后你已经习惯了,你可以学习 r。相信我,你会意识到这两种语言都有简单易学的语法。
原因
为什么我推荐你先学 Python,而不是两个都学?以下是我认为你应该首先学习 Python 的 3 个理由,然后我会给你我对 R 语言的看法,不建议你先学习它。
Python 有很多应用
Python 是计算机科学的流行语言。这种语言非常流行,因为它有简单的语法,而且是开源的。这意味着这种语言是由世界各地的社区贡献的,你可以通过使用它来制作任何东西,例如制作游戏、web 应用程序、自动化非常无聊的事情,以及进行数据科学。
对于新人来说,Python 很难但是值得学
对于第一个进入数据科学领域的人来说,您可能没有使用任何编程语言的经验。从计算机科学的角度来看,Python 很容易学,但是我知道您可能认为这并不容易。在转到另一种语言之前,先花时间学习编程语言是没问题的,例如 r。在你习惯了它之后,你就可以探索任何其他语言了。但是记住,只学习基础知识,然后用它做你自己的项目。
深度学习库主要工作在 Python 上
这就是我认为的 R 语言的缺点。也许它有一些可以用于深度学习的库,比如 Keras 和 TensorFlow,但它的后端仍然需要 Python。如果你也对深度学习感兴趣,我真的建议你先学习 Python,然后花上几个月的时间。
这是我能给你的为什么你应该首先学习 Python 的主要原因,即使你是编程语言的新手或者你是数据科学领域的新手。
比较
那么,如果你是数据科学或者编程的新手,为什么我不建议你先学习 R 呢?
我不想让你先学习 R 的主要原因是因为它的语法太容易学了,尤其是在他们的数据科学库上,例如 ggplot2,dplyr,tidyr 等。看看我最近收到的很多笑声的推文,
另一个,
可能你现在还不明白,尤其是那些数据科学的新手,但这只是因为这些推文而让我的一天变得美好。我得说他们刚才说的是真的,我是说真的。
原因是 dplyr 和 ggplot2 包具有独特且易于学习的语法,而不是像 pandas 和 matplotlib 这样的 python 库。
让我举一些例子,特别是关于如何使用 Python 和 r 操作数据和可视化数据。这次我将使用约翰·霍普斯金大学的冠状病毒数据集向您演示这两种语言是如何完成这项任务的。
假设我们要绘制一个线图,其中包含全球确诊率最高的 10 个病例。
这是如何在 Python 上实现的,
**# Import the data**
import pandas as pd
df = pd.read_csv("[https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv](https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv)")**# Get the columns**
get_top_10 = df.iloc[:,[0, 1, 2, -1]]**# Summarize by country/region**
get_top_10 = get_top_10.groupby(['Country/Region']).sum().reset_index()**# Sort by the value and get the top 10**
get_top_10 = get_top_10.sort_values('5/17/20', ascending=False)**# Convert it as an array**
countries = get_top_10.iloc[:10, 0].values**# Melt (Pivot) the table**
df_tidy = df.melt(id_vars=df.columns[:4], var_name='date')**# Set the date column type as datetime**
df_tidy['date'] = pd.to_datetime(df_tidy['date'])**# Group by countries and dates**
df_tidy = df_tidy.groupby(['Country/Region', 'date']).sum().reset_index()**# Filter it by top 10 countries**
df_tidy = df_tidy[df_tidy['Country/Region'].isin(countries)]
df_tidy.head()**# Create the plot**
import seaborn as sns
import matplotlib.pyplot as plt
sns.lineplot(x='date', y='value', hue='Country/Region', data=df_tidy)
这是结果,
然后,看看 R 是怎么做的,
**# Import the data**
library(readr)
confirmed <- read_csv("[https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv](https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv)")
head(confirmed)**# Get the 10 most confirmed cases countries**
library(dplyr)
get_top_10 <- confirmed %>%
select(`Country/Region`, "5/17/20")
colnames(get_top_10) <- c("country", "total")get_top_10 %>%
arrange(desc(total)) %>%
top_n(10) %>%
select(country)countries <- c("US", "Russia", "United Kingdom", "Brazil", "Spain", "Italy", "France", "Germany", "Turkey", "Iran")**# Make the data prepared for analysis by tidying it**
library(tidyr)
confirmed_tidy <- confirmed %>%
pivot_longer(5:(length(colnames(confirmed))), names_to = "date", values_to = "total")
colnames(confirmed_tidy) <- c("province", "country", "lat", "long", "date", "total")
confirmed_tidy$date <- as.Date(confirmed_tidy$date, format="%m/%d/%y")
confirmed_tidy**# Summarize for countries that have province on it**
library(ggplot2)
confirmed_tidy %>%
group_by(country, date) %>%
summarise(total = sum(total)) %>%
ungroup() %>%
filter(country %in% countries) %>%
**# Create line plot from it**
ggplot(aes(x=date, y=total, color=country)) +
geom_line()
这是结果,
那么,基于这些例子,你更喜欢用哪一个呢?r 还是 Python?请在下面的评论区告诉我!
结论
总之,Python 和 R 各有各的功能。先学哪个,我会推荐你先学 Python 而不是 r。
除了我上面给出的所有理由之外,Python 比 R 更具有面向对象的语法,使用函数来完成它,但是两者具有相同的功能。如果你花更多的时间学习 python,那么你会对编程语法,尤其是面向对象的编程语法很熟悉。如果你在 R 上投资很多,可能你会喜欢它的语法,但是不要一开始就学,因为你不会有面向对象编程的感觉。
我不想劝阻你学 R,但是如果你先学 R 而不学 Python 你懂吗?看看吧,它的语法比 Python 好得多,不是吗?
尽管如此,我还是建议你先学习 Python,因为当你学习 Python 的时候,你可以很容易地学习其他语言。
感谢您阅读我的文章。我在这里发表过其他文章。下面是我以前的文章:
NumPy 如何简化您的代码,同时提高其性能。广播和 SIMD 来救援了!
towardsdatascience.com](/matrix-computation-with-numpy-a865ebaf2005) [## 如果我有自己的时间,我会这样学习数据科学
感觉不知所措和筋疲力尽让我在释放数据科学技能方面表现不佳。这个…
towardsdatascience.com](/this-is-how-i-will-learn-data-science-if-i-got-back-my-own-time-e9148c909ce9) [## 更高的准确性并不意味着更好的机器学习模型性能
我们可以定量地衡量机器学习模型的性能,但不仅仅是准确性,还有很多…
towardsdatascience.com](/greater-accuracy-does-not-mean-greater-machine-learning-model-performance-771222345e61)
聪明的 CEO 立即开始机器学习项目的 3 个原因
InsideAI
虽然大多数首席执行官都在努力应对新冠肺炎,但有些人利用数据,以不同的方式做事
今天,利用数据比过去容易得多……[图片由 NCI 在 Unsplash 上拍摄]
新冠肺炎危机全力打击组织。这只黑天鹅向首席执行官们提出了独特的领导力挑战。自疫情爆发以来,我亲身经历了领导者和员工的挣扎——他们中的许多人无法适应急剧变化的环境。
然而,过去六周与我们共事过的一些首席执行官正在以不同的方式行事。除了确保他们社区的健康,他们还能够通过启动或提升他们的机器学习(ML)活动来塑造他们濒危业务的未来。原因如下。
1.ML 激活了公司和顾客
危机本身创造了一个全新的机会空间。行动的紧迫性创造了倾听的意愿,减少了惰性,并培养了员工的开放性。最重要的是,它创造了完成事情的动力!
所谓的人工智能长期以来在德国的员工中遭到抵制(相信我,我和许多认为它就像区块链一样的人谈过)。如果做得好,现在不再是这样了。首席执行官可以通过让他们的员工推动 ML 项目并让他们为企业的未来做出贡献来引导动力。你不会相信现在这样做的员工有多有权力和责任感。
与我们合作的一家钢铁加工公司的首席执行官知道,他的组织将受到新冠肺炎后果的沉重打击。尽管如此,他并没有退出我们的合作,而是利用这一势头进一步加强了他的核心业务。现在,我们共同开发了一个推荐系统的原型(类似于亚马逊的“喜欢这个的客户也喜欢……”)。我们的系统会就客户的需求提出建议——尤其是在危机期间。这确保了他的销售额下降幅度大大低于预期。
2.ML 项目在家就能完美工作
嗯,看看下面这张图就知道了。那曾经是我们数据科学负责人的办公室(别担心,他回来了,很安全)。Alessandro 几乎无所不在——冲浪、玩 Hang(如果你不知道它是什么,去查一下)和编码。是的,尽管有时旅行,我们从来没有感觉到他走了。这也是由于像 GitHub 这样的平台允许在分布式团队中开发 ML 模型和原型。
对于数据科学家和机器学习工程师来说,远程工作是(旧的)常态。其实这是他们习惯了的。聪明的首席执行官知道,ML 项目可以很容易地远程实施。最重要的是,他们清楚地意识到,他们的组织可以通过与那些真正知道如何做的人密切合作来提高其虚拟协作能力。很简单:ML 项目在新冠肺炎时代也有效!
我们的数据科学主管 Alessandro 在巴厘岛的前“办公室”
3.ML 即使没有多少钱也很强大
在过去的几年里,我遇到的最大的误区之一就是 ML 贵得惊人。直到今天,我还不明白这是怎么发生的。先说清楚:不一定是这样。我的观察是,聪明的首席执行官通过原型思维来保持低成本。只有在值经过验证的情况下,它们才会缩放。
坚持上面的例子:对于钢铁加工公司,我们一开始没有全面地做推荐系统。我们开始时只使用一小部分数据和工具,但很快就和销售人员一起验证了我们模型的建议是否有用——或者这个项目是否容易失败。我们不介意杀死原型!
另外,从我个人的经验来看,我认为大约三分之一的 ML 社区是真正使命驱动的。这组开发人员和创新经理都相信,在创造商业价值的同时,有能力让社会变得更好。所以不管有没有大预算,人家都愿意支持!
聪明的首席执行官现在开始机器学习项目的最大原因可能是他们无论如何都必须这样做。为了保持成功,ML 迟早要成为每个组织的基本支柱。你开始得越早,你的组织就能做得越好——这就是数据的好处。
时机可能比你想象的要好。
你应该拥有数据科学博客的 3 个理由
我认为写博客对你有利的原因
普里西拉·杜·普里兹在 Unsplash 上的照片
“开一个博客来巩固你学到的东西。当你以博客的形式教授你所学的东西时,你可以看到你知识中的差距并填补它们。”——我的经理(2019)
我第一次开始写博客是在 8 个月前,当时我的经理在工作中建议我这样做,作为巩固我学到的新东西的一种方式。他说“当你以博客的形式教授你所学的东西时,你可以看到你知识中的缺口,并在中填补它们”。快进 8 个月,我现在已经是 Medium 人工智能类别的顶级作家,同时也是该平台上收入最高的 5%到 8%的人之一——公平地说,以这种方式巩固我的知识已经产生了一些非常酷的副产品,这些副产品也为我打开了许多大门。
我会像我的经理告诉我的那样告诉你…
开一个博客来巩固你的知识。当你以博客的形式教授你所学的东西时,你可以看到你知识中的缺口并填补它们!
我相信我可以在这里结束这篇文章,但如果你仍然不相信,我会给出一些理由,说明为什么我认为开设数据科学博客对你来说极其重要,即使你是一名有抱负的数据科学家,昨天开始了他/她的第一门课程。
注意:这只是你将要开展的最伟大的数据科学项目的一个方面。查看下面的链接,了解更多关于您必须完成的最重要的数据科学项目的信息。
每个数据科学家都必须做的项目
towardsdatascience.com](/the-most-important-data-science-project-458d016ef8a6)
建立你的在线足迹/个人品牌
我要你在键盘上按下 Ctrl + T 键,在谷歌(或者任何你喜欢的搜索引擎)上输入你的名字。出现了什么?什么都没有?好的,输入你最喜欢的艺术家的名字。出现了什么?他们的背景,他们的专辑,他们的巡演和其他与他们联系的渠道,等等。
如果你想成为一名摇滚明星数据科学家,人们至少应该知道在哪里可以找到你的作品——Kurtis Pykes
是的,你可能会觉得在谷歌(或者你喜欢的搜索引擎)上输入自己的名字很别扭,我不怪你,我会怪你。然而,对于你申请的大多数公司来说,他们很可能会这样做。或者,如果你搜索自己的名字,出现大量数据科学文章,你基本上已经给了他们第二份简历,他们可以根据你的工作对你产生印象。雇主有机会在他们坐下来和你谈工作之前向你请教,这会给你比其他候选人更强的竞争优势。
此外,你可以开始将自己树立为你所写主题的专家,你发表的任何东西都可以被认为是知识产权。酷的壮举!
注意:仔细考虑你决定发布的东西是很重要的,因为你会和你写的东西联系在一起。
软技能发展
让我们来看看 4 项被高度视为促进职业发展的软技能,并将它们与数据科学博客的帮助联系起来——有 4 项以上的软技能,但关键是要认识到拥有一个数据科学博客是你应该做的事情。
情商
情商是指识别他人情绪和管理自己情绪的能力。作为一名数据科学作家,提高本身就意味着了解人们的情绪和他们的行为之间的联系,从而让你能够设身处地地为目标受众着想,这为你提供了一个平台来影响他们实现共同的目标。例如,你可以把自己放在一个初学者的位置,学习一个非常困难的技术主题,并且能够用一种非常简单的方式把它分解,让目标受众理解。
成长心态
成长心态是相信你对自己的能力有最终的控制权,并且可以学习和提高。我认为这是不言自明的。如果你不想在写作的主题上耗尽灵感,你就必须不断学习——就这么简单。
对反馈的开放性
反馈是工作环境中的一项重要技能。开放并能够接受发展反馈对任何工作的成功都至关重要。你猜怎么着?从你发表文章公开你的作品的那一刻起,你就向反馈敞开了大门。例如,我记得当我对线性回归的假设犯了一个错误时,在 LinkedIn 上引起的剧变——是的,我在讨论有史以来最简单的机器学习算法之一时犯了一个错误。虽然人们可能会认为这是一个公开的尴尬,人们分享的许多评论都是火上浇油,但相反,我感到有更大的责任感来适当地研究我写的任何东西,我很快就和那个叫我出来帮助我变得更好的人成为朋友。
“把纠正你错误的人视为希望你尽可能做到最好的人,并和他们交朋友!”
职业道德
如果你真的想在工作中获得成功,你需要投入时间、努力和精力来实现你的目标。开始(和维护)你自己的数据科学博客不是先决条件,事实上,你不必必须。然而,如果你决定不仅向你周围的每个人表达你的职业道德,你也要发展你自己的职业道德。有些人这样做是因为想要通过他们的博客达到金钱目标,有些人是出于社会目标(即拥有 3000 名粉丝),还有一些人是为了确保他们保持自律(即确保每周发布 3 次)。不管是什么原因,你培养了自己的勇气,这是一种值得珍惜的生活技能。
机会
通过您的数据科学博客,您本质上是在营销自己,良好的营销将吸引愿意的客户。换句话说,如果你很好地描述了你所拥有的技能和品质,人们会注意到你并就这些事情接近你。请注意,这并不仅仅是工作机会,但它可能是一些重要的事情,让你遇到有工作机会的人,或者遇到你继续创业的人,比如让你成为播客的客座演讲人,在那里你可以讨论你写的博客帖子,或者为出版商写作——谁知道呢?
“做能增加你成功机会的事情”
包裹
关于为什么你应该有一个数据科学博客,我可以添加更多的理由,但我希望这 3 个理由足以说服你开始。总的来说,我认为拥有一个博客的总体目的应该是学习新的令人兴奋的东西,然后你可以继续教授这些东西。然而,考虑写博客的好处可以作为一种有效的激励工具,帮助你处理写博客所需的棘手工作。
谢谢你看完。如果你喜欢这篇文章,你可能会喜欢下面链接的一些文章:
在媒体上创建技术职位的更有效方法
towardsdatascience.com](/publishing-to-medium-from-jupyter-notebooks-53978dd21fac) [## 用 4 个步骤开始您的数据科学之旅
开始数据科学职业生涯的自以为是的路径指南
towardsdatascience.com](/start-your-data-science-journey-in-4-steps-f5b5a6e7e80b) [## 为您的数据科学事业保持动力
我们可以长期保持动力。
towardsdatascience.com](/staying-motivated-for-your-data-science-career-e845f18421e1)
如果你想和我联系,最好在 LinkedIn 上联系我!
[## 人工智能作家 kurtis Pykes——走向数据科学| LinkedIn
在世界上最大的职业社区 LinkedIn 上查看 Kurtis Pykes 的个人资料。Kurtis 有一个工作列在他们的…
www.linkedin.com](https://www.linkedin.com/in/kurtispykes/)
你不应该成为数据科学家的 3 个理由
意见
在转行之前,一定要了解这三点。
21 世纪最热门的工作可能并不适合你。我并不是说学习数据科学不值得(恰恰相反),但是如果你确实有一些你试图解决的问题,最好还是参与到这个领域中来。
Joshua Rawson-Harris 在 Unsplash 上拍摄的照片
作者注: 这是一个观点片,所以大概有一定程度的偏颇。你所在国家的工作和你的技能可能会有所不同。我们用不同的眼睛看世界。请在评论区留下你的想法和经历。
在进入这个行业一段时间后,我每天花 10-12 个小时探索这个领域,写了近 100 篇关于数据科学的文章,我觉得自己有资格谈论一些非常令人失望但在我的研究中从未提及的事情。
对我来说,实用数据科学是最有趣的领域之一——尤其是随着深度学习的进步。
**那又怎样?**仅仅为了数据科学而做数据科学有什么意义?嗯,如果你不是一名研究人员,全职从事这个领域几乎没有意义。
你花时间训练一个模特的原因是什么?是因为你计划在网络和/或移动应用中部署它吗?是要解决一些现实问题吗?还是只会闲置在笔记本里?
一段时间以来,我一直觉得数据科学正在成为软件开发的另一个分支。这不一定是一件坏事,因为模型训练和优化现在已经非常自动化了(可以使用正确的工具),作为一名“数据科学家”,你唯一要做的就是以正确的方式准备数据,并向上级展示你的工作。
对我来说,这很好,因为我可以花更多的时间做有趣的事情,如应用程序开发,从而交付整个包并实际解决问题,而不是让模型闲置在我的笔记本电脑上。
但是如果你计划从 9 点到 5 点为别人工作,那么一定要阅读这篇文章,因为它会谈到一些不太好的方面。此外,正如我以前的一篇文章所述,你应该知道在这个领域注册的好处,并想了解可能的缺点。
好了,废话不多说,让我们来看看第一个原因。
#1 -你不关心业务
我给你讲个故事吧。除了在 Medium 和 TDS 写博客之外,我还有一份全职工作,即数据科学家。我工作的公司并不专注于该行业的任何一个分支,它只是一家主要专注于咨询的 it 公司。
马文·迈耶在 Unsplash 上的照片
**这对我意味着什么?**这意味着我不是在一个项目或一个产品上工作,而是在不同行业的 3-5 个不同项目上工作。如你所料,我不是这些领域的专家。
这就是你可能最终不喜欢你的数据科学工作的地方——因为你不太了解你正在工作的领域,但也不急于了解它,因为它让你厌烦透了。
现在,对于在感兴趣的领域工作的数据科学家来说,情况可能不是这样。假设你在 X 领域受过教育,但也非常了解数学和统计学,所以你被雇佣在你的领域做更多的数据密集型工作。那是完全不同的。
这里我说的是通才数据科学家,那些从一个项目跳到另一个项目的人从来不觉得他们实际上在做贡献。
#2 -你看不到全局
与前面的原因不同,这个原因适用于数据科学领域的通才和专家。
假设你被一个项目团队邀请参加一个会议,因为他们的应用可以从你的“数据科学魔法”中受益。诸如此类的问题在所难免:“你的模型能做到这一点吗?”,“你能在我们的 10KB 数据集上实现这些现代神经网络吗?”。也许不是确切意义上的最后一个,但如果有人需要一个预测模型,而只有 30 行数据,也不要感到惊讶。
这就是问题所在,因为不知何故,你应该在对项目及其结构一无所知的情况下立即交付一个最先进的解决方案——因此出现了大图问题。祝你好运。
对于专业数据科学家来说,这里的情况又变得更好了,因为至少拥有一些领域专业知识,并知道自己如何适应全局,会让你更容易正确地完成工作。
# 3——你的老板是个商人
或者女商人。
关键是,你的上司并不是任何数据相关领域的专家,他对数据科学的了解和普通人从新闻中了解的一样多。
作者注: 这一原因的影响程度可能因国家而异,因为工作和生活文化可能会有很大差异。
这就带来了一个潜在的问题,因为你的团队可能会被赋予一项需要数月研究的任务,但根据业务的需要,这是不可能的。
希望你会有一个部门经理,他/她了解一个特定的解决方案需要多少时间和工作,并且他/她能够和他的上级谈一些道理,但是你不能指望这种假设。
这就是拥有出色的人际交往能力的用处。解释为什么要花一两个月的时间找出 100 个不起作用的东西并不是一件愉快的事情,但拥有这些人和演示技巧可能会扭转局面。
结论
首先,这是一篇观点文章。请务必在下面的评论区留下你的想法。
在我看来,知道很多关于数据科学和预测建模的知识应该会让你成为一名合格的员工,但前提是要解决与数据科学相关的实际问题。
归根结底,数据科学只是一种技能组合,如果不应用于业务问题,它就毫无价值。如果你不关心那件事,或者只是不知道你如何适应,事情可能不会有那么好的结局。
感谢阅读。
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
[## 通过我的推荐链接加入 Medium-Dario rade ci
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@radecicdario/membership)
人们实际关注的仪表板的 3 条规则
大多数仪表盘都没用,让我们来解决这个问题。
1)仪表板应该简单。
在我的职业生涯中,有人要求我为几家公司设计仪表板。令我惊讶的是,世界上最大的技术公司之一的营销团队要求我的团队为他们开发仪表板。我以为大型科技公司已经想通了所有这些事情。特别是这家公司,有一整个部门致力于营销分析和测量,并有数百个仪表板供他们使用。
问题是,没有人使用它们中的任何一个。
图片来源:https://www . pexels . com/photo/business-charts-commerce-computer-265087/
当我最终看了一下团队已经准备好的仪表板时,不难发现为什么。没有人使用仪表盘,因为没有人知道他们在看什么。请注意,这些是我见过的最漂亮、最复杂的仪表盘——它们充满了许多 KPI、高级图表、统计数据、仪表和表格。这些仪表板是根据最高程度的技术熟练程度和分析能力构建的,但它们未能解决它们应该解决的问题:为业务提供可操作的信息。
不要陷入复杂性=复杂性这一常见陷阱。做得多肯定不一定好。我真的相信莱昂纳多·达芬奇的这句话:“简单是终极的复杂”在你的仪表盘上遵循这个信条(以及你做的几乎所有事情)。如果业务用户不能清楚地理解仪表板给他们带来的价值,他们将永远不会看它。它需要简单易用,让企业用户没有它就无法运营他们的业务。
不幸的是,即使是业务方面的人也可能被非常漂亮的图表和图形所蒙蔽——您甚至可能因为自己构建的极其复杂的仪表板而受到业务部门的称赞。但是这种认可仅仅是企业认可你的技术能力,而不是对你解决了他们的问题感到满意。乍一看,他们会认为你已经解决了他们的问题,因为一切看起来都很棒。但是想都不用想,他们会在一个月之内回到数据透视表和手动数据提取。
2)仪表板用于跟踪和测量,而不是分析。
将大量信息放在仪表板上的诱惑是对数据分析的总体渴望的一部分——业务用户希望获得洞察力,以使他们更好地完成工作。问题是,仪表板是最糟糕的数据分析工具之一。它们不是为回答有关数据的深层问题而设计的,但它们非常适合跟踪和测量。
仪表板擅长回答以下类型的问题:
- 我表现最好的营销活动是什么?
- 我们这个月赚了多少钱?
- 哪些活动的投资回报率最高?
- 我们表现最好的产品是什么?
- 有多少物品的库存很低?
仪表板不擅长回答以下类型的问题:
- 为什么我们的搜索活动胜过我们的社交活动?
- 明年我们应该在每个渠道上花多少钱做广告?
- 我们的高价值电子商务客户最常购买的产品是什么?
- 哪些客户最有可能再次购买我们的产品?
开发你的仪表板,着眼于那些可以 a) 长期跟踪和 b) 根据某些东西衡量的指标。不要只是将数字形象化,将它们与目标、历史时间表或竞争产品进行比较。可视化不仅要回答“什么”的问题以及“什么时候?”而是“跟什么比?”
仪表板应该衡量重要的事情,而不是容易的事情。
工作理论不仅教授如何创新的框架,还教授如何围绕“要做的工作”建立你的组织,并确定重要的衡量标准。工作理论的创始人 Clayton Christensen 博士将这些指标称为“客户利益指标”——换句话说,这些指标表明你的产品或服务在多大程度上解决了它设计解决的工作(与运气竞争,第 161 页)。不幸的是,“客户利益指标”背后的数据通常难以收集。随后,作为分析专家和数据科学家,我们默认使用最容易获得和最容易获得的数据。为了努力让自己感觉有所成就,我们引入、透视并分析了数百个数据源,创建了复杂的模型和令人惊叹的可视化效果,虽然看起来很美,并展示了我们的技术技能,但最终还是达不到目标,即尽可能为企业提供最重要、最有价值的信息。
减少制作仪表板小部件、精美图表或创建新数据管道的时间,将更多时间用于定义最重要的 KPI。然后,制定策略来获取对您的业务真正重要的数据。
规则:
- 仪表板应该简单。
- 仪表板跟踪和测量,它们不进行分析。
- 仪表板应该衡量重要的事情,而不是容易的事情。
有问题或意见吗?你可以给我发电子邮件,地址是 cwarren@stitcher.tech,或者在 Linkedin 上关注我,地址是https://www.linkedin.com/in/cameronwarren/
我还提供数据服务,你可以在 http://stitcher.tech/的了解更多。
每个数据科学家都需要的 3 种简单的异常值/异常检测算法
深入了解异常值检测,以及如何在 Python 中实现 3 种简单、直观且强大的异常值检测算法
斯科特拍摄的照片。在 Flickr 上的 T
我相信你已经遇到了以下几种情况:
- 你的模型没有像你希望的那样运行。
- 你会不由自主地注意到,有些地方似乎与其他地方大相径庭。
恭喜你,因为你的数据中可能有异常值!
什么是离群值?
照片可以在证券交易所找到
在统计学中,异常值是与其他观察值显著不同的数据点。从上图中,我们可以清楚地看到,虽然大多数点位于线性超平面中或其周围,但可以看到一个点与其他点有所不同。这个点是一个离群点。
例如,看看下面的列表:
[**1**,35,20,32,40,46,45,**4500**]
在这里,很容易看出 1 和 4500 是数据集中的异常值。
为什么我的数据中有异常值?
通常,异常值可能发生在以下情况之一:
- 有时它们可能是偶然发生的,可能是因为测量误差。
- 有时它们会出现在数据中,因为数据很少是 100%干净的,没有任何异常值。
为什么离群值是一个问题?
以下是几个原因:
- 线性模型
假设你有一些数据,你想用线性回归来预测房价。一个可能的假设可能是这样的:
作者照片
在这种情况下,我们实际上对数据拟合得太好了(过拟合)。然而,请注意所有的点是如何位于大致相同的范围。
现在,让我们看看当我们添加一个离群值时会发生什么。
作者照片
很明显,我们看到我们的假设是如何改变的,因此,推论会比没有异常值时更糟糕。线性模型包括:
- 感知器
- 线性+逻辑回归
- 神经网络
- KNN
2.数据输入
Ehimetalor Akhere Unuabona 在 Unsplash 拍摄的照片
一种常见的情况是丢失数据,可以采取以下两种方法之一:
- 删除缺少行的实例
- 使用统计方法估算数据
如果我们采用第二种选择,我们可能会有有问题的估算,因为异常值可以极大地改变统计方法的价值。例如,回到我们没有异常值的虚构数据:
# Data with no outliers
np.array([35,20,32,40,46,45]).mean() = 36.333333333333336# Data with 2 outliers
np.array([1,35,20,32,40,46,45,4500]).mean() = 589.875
显然这个类比很极端,但是想法是一样的;数据中的异常值通常是一个问题,因为异常值会在统计分析和建模中导致严重的问题。然而,在这篇文章中,我们将研究一些方法来检测和对付它们。
解决方案 1: DBSCAN
图片来自维基百科
对有噪声的应用程序进行基于密度的空间聚类(或者更简单地说,DBSCAN)实际上是一种无监督的聚类算法,就像 KMeans 一样。然而,它的用途之一是能够检测数据中的异常值。
DBSCAN 之所以受欢迎,是因为它可以找到非线性可分的聚类,而这是 KMeans 和高斯混合所做不到的。当集群足够密集并且被低密度区域分隔开时,它工作得很好。
DBSCAN 如何工作的高级概述
该算法将聚类定义为高密度的连续区域。算法非常简单:
- 对于每个实例,它计算有多少实例位于距离它很小的距离ε (epsilon)内。这个区域被称为实例的 ε-邻域。
- 如果实例在其ε-邻域中有超过个 min_samples 实例,那么它被认为是一个*核心实例。*这意味着实例位于高密度区域(内部有许多实例的区域)。)
- 核心实例的ε-邻域内的所有实例都被分配到同一个集群。这可能包括其他核心实例,因此一长串相邻的核心实例构成一个集群。
- 任何不是核心实例或者不位于任何核心实例的ε-邻域中的实例都是离群值。
DBSCAN 正在运行
由于 Scikit-Learn 的直观 API,DBSCAN 算法非常易于使用。让我们来看一个运行中的算法示例:
fromsklearn.cluster import DBSCAN
from sklearn.datasets importmake_moonsX, y = make_moons(n_samples=1000, noise=0.05)
dbscan = DBSCAN(eps=0.2, min_samples=5)
dbscan.fit(X)
这里,我们将使用 0.05 的ε-邻域长度来实例化 DBSCAN,5 是将一个实例视为核心实例所需的最小样本数
记住,我们不传递我们的标签,因为这是一个*无监督算法。*我们可以看到标签算法使用以下命令生成的标签:
dbscan.labels_OUT:
array([ 0, 2, -1, -1, 1, 0, 0, 0, ..., 3, 2, 3, 3, 4, 2, 6, 3])
注意一些标签的值等于-1:这些是异常值。
DBSCAN 没有预测方法,只有 fit_predict 方法,这意味着它不能对新实例进行集群。相反,我们可以使用不同的分类器来训练和预测。对于这个例子,让我们使用一个 KNN:
from sklearn.neighbors import KNeighborsClassifierknn = KNeighborsClassifier(n_neighbors=50)
knn.fit(dbscan.components_, dbscan.labels_[dbscan.core_sample_indices_])X_new = np.array([[-0.5, 0], [0, 0.5], [1, -0.1], [2, 1]])knn.predict(X_new)OUT:
array([1, 0, 1, 0])
这里,我们在核心样本和它们各自的邻居上拟合 KNN 分类器。
然而,我们遇到了一个问题;我们给出了没有任何异常值的 KNN 数据。这是有问题的,因为它将迫使 KNN 为新实例选择一个集群,即使新实例确实是一个离群值。
为了解决这个问题,我们利用 KNN 分类器的杠杆 kneighbors 方法,该方法在给定一组实例的情况下,返回训练集的 k 个最近邻居的距离和索引。然后我们可以设置一个最大距离,如果一个实例超过了这个距离,我们就把它定义为离群值:
y_dist, y_pred_idx = knn.kneighbors(X_new, n_neighbors=1)
y_pred = dbscan.labels_[dbscan.core_sample_indices_][y_pred_idx]
y_pred[y_dist > 0.2] = -1
y_pred.ravel()OUT:
array([-1, 0, 1, -1])
这里我们讨论并实现了用于异常检测的 DBSCAN。DBSCAN 很棒,因为它很快,只有两个超参数,并且对异常值很鲁棒。
解决方案 2:隔离森林
照片由作者
IsolationForest 是一种集成学习异常检测算法,特别适用于检测高维数据集中的异常值。该算法基本上执行以下操作:
- 它创建了一个随机森林,其中决策树随机生长:在每个节点上,随机选取特征,并选取一个随机阈值将数据集一分为二。
- 它继续切割数据集,直到所有实例都相互隔离。
- 异常通常远离其他实例,因此,平均而言(在所有决策树中),它变得比正常实例孤立的步骤少。
隔离森林在行动
再次感谢 Scikit-Learn 的直观 API,我们可以轻松实现 IsolationForest 类。让我们来看一个运行中的算法示例:
from sklearn.ensemble import IsolationForest
from sklearn.metrics import mean_absolute_error
import pandas as pd
我们还将引入 mean_absolute_error 来度量我们的误差。对于数据,我们将使用可以从 Jason Brownlee 的 GitHub 获得的数据集:
url='[https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv'](https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv')df = pd.read_csv(url, header=None)data = df.values
# split into input and output elements
X, y = data[:, :-1], data[:, -1]
在拟合隔离森林之前,让我们尝试对数据拟合一个简单的线性回归模型,并获得我们的 MAE:
from sklearn.linear_model import LinearRegressionlr = LinearRegression()
lr.fit(X,y)mean_absolute_error(lr.predict(X),y)OUT:
3.2708628109003177
相对较好的分数。现在,让我们看看隔离林是否可以通过移除异常来提高分数!
首先,我们将实例化我们的 IsolationForest:
iso = IsolationForest(contamination='auto',random_state=42)
算法中最重要的超参数可能是污染参数,它用于帮助估计数据集中异常值的数量。这是一个介于 0.0 和 0.5 之间的值,默认设置为 0.1
然而,它本质上是一个随机化的随机森林,因此随机森林的所有超参数也可以用在算法中。
接下来,我们将使数据符合算法:
y_pred = iso.fit_predict(X,y)
mask = y_pred != -1
请注意我们如何过滤掉预测值= -1,就像在 DBSCAN 中一样,这些预测值被视为异常值。
现在,我们将为 X 和 Y 重新分配异常值过滤后的数据:
X,y = X[mask,:],y[mask]
现在,让我们尝试用线性回归模型来拟合数据,并测量 MAE:
lr.fit(X,y)
mean_absolute_error(lr.predict(X),y)OUT:
2.643367450077622
哇,成本大大降低了。这清楚地表明了隔离林的威力。
解决方案 3:箱线图+塔克法
虽然箱线图是识别异常值的一种非常常见的方法,但我真的发现后者可能是识别异常值最被低估的方法。但是在我们进入 Tuckey 方法之前,让我们谈谈箱线图:
箱线图
图片来自维基百科
箱线图本质上提供了一种通过分位数显示数字数据的图形方式。这是一个非常简单而有效的方法来可视化离群值。
上下须显示分布的边界,任何高于或低于的都被认为是异常值。在上图中,任何高于 80 和低于 62 的都被认为是异常值。
箱线图如何工作
基本上,盒状图的工作原理是将数据集分成 5 个部分:
照片来自 StackOverflow
- Min :分布中排除任何异常值的最低数据点。
- Max :分布中排除任何异常值的最高数据点。
- Median ( Q 2 /第 50 百分位):数据集的中间值。
- 第一个四分位数(Q1/25 个百分点):是数据集下半部分的中位数。
- 三分位数( Q3 /第 75 百分位):数据集上半部分的中位数。
四分位距(IQR)很重要,因为它定义了异常值。本质上,它如下:
**IQR** = Q3 - Q1**Q3**: third quartile
**Q1**: first quartile
在箱线图中,测量出 1.5 * IQR 的距离,并包含数据集的较高观察点。类似地,在数据集的较低观察点上测量出 1.5 * IQR 的距离。任何超出这些距离的都是异常值。更具体地说:
- 如果观察点低于(Q1 1.5 * IQR)或箱线图下须线,则被视为异常值。
- 类似地,如果观察点高于(Q3 + 1.5 * IQR)或箱线图上须,,那么它们也被视为异常值。
图片来自维基百科
行动中的箱线图
让我们看看如何使用 Python 中的箱线图来检测异常值!
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as npX = np.array([45,56,78,34,1,2,67,68,87,203,-200,-150])
y = np.array([1,1,0,0,1,0,1,1,0,0,1,1])
让我们绘制一个数据的箱线图:
sns.boxplot(X)
plt.show()
作者照片
根据我们的箱线图,我们看到我们的数据中有 50 个中值和 3 个异常值。让我们去掉这几点:
X = X[(X < 150) & (X > -50)]sns.boxplot(X)
plt.show()
作者照片
在这里,我基本上设置了一个门槛,所有小于-50 大于 150 的点都会被排除在外。而结果;平均分配!
Tuckey 方法异常检测
tuckey 方法异常值检测实际上是盒图的非可视化方法;方法是一样的,除了没有观想。
我有时更喜欢这种方法,而不是箱线图的原因是,有时看一看可视化并粗略估计阈值应该设置为什么并不真正有效。
相反,我们可以编写一个算法,它实际上可以返回它定义为离群值的实例。
实现的代码如下:
import numpy as np
from collections import Counterdef detect_outliers(df, n, features):
# list to store outlier indices
outlier_indices = [] # iterate over features(columns) for col in features:
# Get the 1st quartile (25%)
Q1 = np.percentile(df[col], 25)
# Get the 3rd quartile (75%)
Q3 = np.percentile(df[col], 75)
# Get the Interquartile range (IQR)
IQR = Q3 - Q1 # Define our outlier step
outlier_step = 1.5 * IQR # Determine a list of indices of outliers outlier_list_col = df[(df[col] < Q1 - outlier_step) | (df[col] > Q3 + outlier_step)].index # append outlier indices for column to the list of outlier indices
outlier_indices.extend(outlier_list_col) # select observations containing more than 2 outliers
outlier_indices = Counter(outlier_indices)
multiple_outliers = list(k for k, v in outlier_indices.items() if v > n)return multiple_outliers# detect outliers from list of features
list_of_features = ['x1', 'x2']
# params dataset, number of outliers for rejection, list of features Outliers_to_drop = detect_outliers(dataset, 2, list_of_features)
基本上,该代码执行以下操作:
- 对于每个特征,它获得:
- 第一个四分位数
- 第三个四分位数
- IQR
2.接下来,它定义了异常值步长,就像在箱线图中一样,它是 1.5 * IQR
3.它通过以下方式检测异常值:
- 查看观察点是否为< Q1 — outlier step
- Seeing if the observed point is Q3 + outlier step
4. It then checks selects observations that have k 异常值(在这种情况下,k = 2)
结论
总之,有许多离群点检测算法,但我们通过 3 个最常见的:DBSCAN,IsolationForest 和 Boxplots。我鼓励你:
- 在 Titanic 数据集上尝试这些方法。哪一个检测异常值最好?
- 寻找其他异常值检测方法,看看它们的性能比您最初尝试的方法更好还是更差。
我真的很感激我的追随者,我也希望不断地写作,给每个人提供很好的精神食粮。然而现在,我必须说再见;}
为什么在做其他事情之前应该首先可视化数据的 3 个简单原因
由西部边界摄影 chris gill 在 Unsplash 上拍摄
我们大脑处理的 90%的信息是视觉的,我们大脑处理视觉的速度比文本快几千倍。为什么不利用一下呢?
介绍
当我在中学解决几何问题时,我总是做的第一件事是将可用的数据可视化,尤其是那些只有文字描述的问题。把它放在一个环境中,假设小学生要解决下面的假设问题。
三角形的边长分别是 3 厘米、4 厘米和 5 厘米。最大的角度是多少度?
A. 85 度
b .90 度
c .95 度
对于开始上四五年级的小学生来说,他们可能还不知道勾股定理。他们解决这个问题的最好办法是画一个精确尺寸为 3、4 和 5 厘米的三角形(希望如下),然后测量最大的角度。他们应该能发现最大的角度是 90 度。
边长分别为 3、4 和 5 厘米的三角形—作者
做数据科学不仅仅是处理三个数据点。对于更复杂的数据,可视化数据对于理解我们的数据更加重要。在这里,我看到了许多优秀的文章,它们介绍了各种方便的数据可视化工具(例如 Tableau 和 Python 模块,如matplotlib
和seaborn
)以及各种用于不同场景的精美图表(例如热图、蜘蛛图),主要用于结果报告。
令人惊讶的是,据我所知,在数据科学项目的早期阶段,很少有人讨论数据可视化的重要性。缺乏广泛的讨论可能是因为 1)经验丰富的数据科学家认为这是他们懒得谈论的例行步骤,2)新数据科学家可能没有意识到可视化数据作为关键预处理步骤的必要性。
在这篇文章中,我想与您分享为什么我们应该在开始任何后续数据处理和分析步骤之前可视化我们的数据的三个主要原因。在我们开始之前,有四件事需要注意。
- 为了提供概念证明,我将使用模拟相关数据模式的合成数据,这些数据模式在现实世界中可能会遇到,也可能不会遇到。如果您愿意,请随意使用您的数据。BTW:你可以在 GitHub 上找到本文使用的代码。
- 只有当分辨率合理时,可视化才有意义。因此,对于一个庞大的数据集,您必须运行一些迭代来逐段查看数据,以生成清晰的图表。
- 本文面向初级到中级水平的数据科学家。优先考虑使用 Python 及其相关模块(例如 Pandas)的知识,但是这里介绍的原理仍然适用于使用其他数据处理和可视化工具。
- 这篇文章并不详尽。对于下面讨论的每一个原因,都有其他可视化方法来实现相同的目标。此外,在运行任何分析或构建模型之前,我们应该可视化我们的数据还有其他原因。
1.理解缺失模式
由于各种原因,真实世界的数据存在缺失问题。由于种族和收入等隐私问题,受试者拒绝回答具体问题。受试者意外输入了不正确的数据(例如,电话号码中缺少一个数字)。在纵向研究中,一些受试者因退出或死亡而退出研究。
因此,了解我们数据的缺失是很重要的,尤其是那些从现实生活研究中收集的数据。事实上,我们可以用描述性统计来计算缺失的数据,但是可视化数据是生成数据缺失的总体印象的一种强大而直接的方法。
合成数据的生成
在上面的代码片段中,我们生成了随机数的数据帧。然后我们注入一些缺失的数据。了解总体缺失模式的最简单方法是使用热图,如下所示。浅米色的每个单元格代表一个缺失值。
热图揭示的缺失模式
根据这张热图,我们可以得出以下观察结果。1)总体来说,这个模拟数据集的缺失度还不错。为了找出每个变量的确切数量,我们可以使用一些描述性统计。2).如果每行代表一个纵向研究中受试者的数据,似乎有些受试者在不同的时间点退出了研究。我们可以对照他们的数据图表。3).两栏中缺少所有受试者的数据,这非常令人担忧。工作人员可能误解了该方案,因此没有按预期收集这些数据。或者,这些数据可能还没有输入数据库。
使用这个简单的热图可视化丢失的数据有助于我们理解这个数据集的丢失模式,**,更重要的是,它可以引导我们回到数据源以恢复一些丢失的数据。**最后,我们可以减少数据中的遗漏,我们都知道完整的数据集对任何数据科学项目来说有多么重要。
2.识别异常值
数据预处理的一个早期步骤是处理离群值,离群值是与数据集中的其他数据值明显不同的数据值。它们的发生至少有两个原因。第一,数据输入错误。例如,缺少一个小数会使值增大 100 倍(10.24 对 1024)。第二,数据集有真正的离群值。例如,在健康人群的生理学研究中,大多数受试者的静息心率为 60-100 BPM,但出于某种原因,受试者的心率为 130 bpm,这可能是一个真正的异常值。
我们会知道异常值对数据分析的负面影响。这里有一个真实的例子,我不知道它是否被研究过。考虑研究大学辍学对一个人在商业上成功的影响。我们可能会错误地得出这样的结论:与在哈佛读完四年相比,从哈佛退学会大大增加你成为亿万富翁的可能性。为什么会这样?这都是因为比尔·盖茨和马克·扎克伯格这两个真正的异类都从哈佛退学了。
玩笑归玩笑,数据可视化是识别数据集中可能的异常值的强大方法。根据数据结构的性质,有不同类型的图表可以显示异常值。在这里,我只是给大家展示一些常见的。
要使用单变量方法可视化异常值,箱线图在大多数情况下都适用。 如下图所示,我生成了 10000 个正态分布的随机数。使用箱线图,我们可以看到这个数据集有异常值,我们必须处理。处理异常值可能是未来一篇文章的另一个主题。
箱形图
如果我们要研究两个连续变量之间的关系,我们在大多数情况下可以使用散点图。 如下图,我生成了两个一维的随机数数组,它们之间有一个投影的线性关系。我人为地添加了一些可能的异常值。如您所见,这四个异常值明显远离散点图中的其他点。请注意,对于真实世界的数据集,如果可能的话,我们需要回到数据源,以验证这些数据是在没有任何人为错误的情况下收集的有效值。
散点图
3.产生有意义的假设
在我正在进行的数据科学或神经科学研究中,利用现有数据开发一些可测试的假设至关重要。类似地,在机器学习设置中,总是需要形成一些假设,并用训练数据集开发一些有意义的模型,我们希望在测试数据集中运行模型时能够保持这些假设。
类似于离群值的识别,给定数据集的特定数据结构将决定我们在进行任何测试之前如何可视化数据。例如,如果您试图确定两个连续变量之间可能的线性关系,您可以从散点图开始,如上一节所示。既然您已经看到了,我将向您展示另外两种类型的图,以针对特定的研究需求生成其他潜在的假设。
**如果你试图在纵向研究中找出一个趋势,最好从折线图开始。**在下面的例子中,我从 Kaggle 下载了烟草使用数据。为简单起见,我只将全国平均数据归入日常吸烟者和戒烟者类别。因为百分比数据是作为字符串读取的,所以为了绘图的目的,我将它们转换为浮点数。从线图中,我们可以观察到每日吸烟率下降的趋势,而以前吸烟者的流行率保持不变。通过确定这一趋势,我们可能会产生一个假设,即 2010 年后,每日吸烟率将继续下降。
线形图
**如果您试图研究两个变量(连续和/或分类)之间的关系,有几个选项可用,例如散点图(我们在上一节中用于线性关系的那个)、热图和条形图。**为了向您展示一些不同的东西,我将向您展示蜂群图,它有助于检查分类变量和连续变量之间的关系,并显示了后者的分布。
典型的例子包括比较两组之间特定测量的差异,以及比较同一组手术前后的差异。很大程度上,这就像是独立 t 检验和从属 t 检验。
群体图和箱线图
假设我们想要研究性别(生物医学研究中使用的一种生物因素,而不是使用性别,这具有一些社会影响)是否影响新冠肺炎的特定严重性度量 ABC。上图显示了使用seaborn
模块混合盒状图的群体图的数据模拟和生成。有了这个数字,我们可以假设男性的 ABC 因子水平可能比女性高,这个假设我们可以在以后用更大的人群进行测试。
结论
数据预处理是一门艺术,它将顶尖的数据科学家与平庸的科学家区分开来。数据预处理步骤中的一些关键部分是缺失值和异常值的识别和处理。我们必须仔细观察数据,以确保数据本身的质量。如果条件允许,回到数据源验证数据完整性,从源头上消除人为错误总是一个好主意。
除了检查我们数据的文本描述之外,在我们数据处理步骤的早期阶段可视化数据,而不是保存可视化工具以便稍后展示最终产品,这是非常有用的。这种可视化提供了一种基本的方式来告知数据质量并为接下来的分析步骤生成可能的有意义的假设。
传达数据见解的 3 个简单步骤
使数据可操作的简单框架。
在 People Analytics 工作时,我经常发送数据,尤其是以仪表板的形式。仪表板很棒,因为它们能以简洁的方式直观地显示大量信息。我喜欢构建仪表板,因为它可以让我发挥创造力,以直观的方式显示不同类型的数据。
对我来说,这些仪表盘充满了等待实施的见解。我非常兴奋,全心全意地投入到这些吸盘中,并高兴地将它们发送给利益相关者。然后,什么也没发生。而且令人心碎。
经过一段时间的哀悼,我开始挖掘哪里出了问题。我不明白我是如何将所有这些伟大的数据交到需要它们的人手中,但他们却没有使用它们。你还想从我这里得到什么?!
问题是,人们被仪表盘弄得不知所措,不知道从哪里开始。我看到了数据但那又怎样?我在数据上花费了太多的时间,以至于有时我忘记了大多数人并没有这样做。虽然解释数据对我来说已经变得很直观,但那些没有整天、每天忙于数字的人需要花更多有意识的努力来解释。
我发现一个非常简单的交流数据的公式非常有用。我开始自己使用这个公式,然后开始把它教给其他人,这样他们就可以从他们的数据中得出自己的见解。
[性能]与[性能指标评测]= >[操作]
- 选择一个基准
- 情境化表演
- 行动计划
完成这些步骤后,您就可以交流从数据中获得的见解。根据我们的基准,我们的表现如何?我们应该做些什么?
1.选择一个基准
让我们从选择一个基准开始。在我们知道自己表现如何之前,我们首先需要知道什么是“好”。我们需要把我们的表演放在上下文中。
假设我们正在查看一个营业额仪表板,并希望向领导报告结果。有几种方法可以选择要比较的基准:
- 行业标准。其他公司客服员工平均离职金额是多少?
- 内部组比较。一个部门的营业额与整个公司的营业额相比如何?一个办公地点的营业额与另一个办公地点的营业额相比如何?
- 历史对比。这个团队去年的营业额是多少?
- 公司目标。我们公司的目标是将营业额保持在 25%以下。
决定使用哪种类型的比较的关键是,你希望它足够相似,这样才有意义。例如,如果您正在查看两个完全不同的办公地点(例如,不同的员工数量、不同的角色等),则内部组比较可能没有意义。).类似地,如果在过去的一年中发生了显著的变化(例如,您的规模扩大了一倍),那么历史比较可能没有意义。虽然苹果和苹果的比较几乎是不可能的,但我们希望避免苹果和长颈鹿的比较。
除了上述考虑,使用公司目标应该谨慎。目标理论又是一堆令人着迷的蠕虫,但请记住,这些目标通常需要灵活。这个目标对这个部门有意义吗(即,这是一个我们可能有不同期望的特定类型的部门吗)?考虑到当前背景(如组织变革、就业市场等),此目标是否有意义。)?
2.周边绩效
一旦我们选择了我们的基准,我们就可以将我们的表现联系起来。这可能非常简单。我们本质上需要与领导者沟通,如果他们需要坚持到底,或者如果他们需要做出改变。
以下是一些将我们的表演放在上下文中使用的形容词示例:
- 更高或更低
- 更好还是更坏
- 更快还是更慢
- 赛道上还是赛道外
假设我们将发送一封电子邮件给 Jolly,他是我们位于棒棒糖森林的客户服务呼叫中心的领导。我们决定使用内部组比较作为我们的基准:甘草泻湖一个类似规模的客户服务呼叫中心。
在我们的示例中,假设甘草泻湖的年初至今周转率为 18%,棒棒糖伍兹的年初至今周转率为 24%。简单来说,你可以简单地说棒棒糖伍兹的营业额比我们的对照组高,或者更低。这至少给了领导者一个衡量他们营业额表现的标准。
如果我们想更进一步,我们可以使用多个基准测试。喔,小心。我们可以说棒棒糖伍兹的营业额高于我们的对照组,也略高于他们去年的营业额。这是令人兴奋的东西!现在我们开始深入研究我们该做些什么。
3.行动计划
现在,我们知道了与我们的基准相比我们的表现如何,我们需要知道如何去做。
拥有一个潜在行动计划库是一个很好的做法,您的组织愿意为各种情况做出承诺(例如,如果我们的人员流动率高,我们的参与度低,等等,我们准备采取什么行动)。).例如,一个降低流动率的潜在行动计划是给每个人加薪 100 万美元,但这对你的公司可行吗?(如果是,请打电话给我)。这样,当我们准备好从我们的数据中提取见解时,我们可以根据我们的绩效和基准选择最佳的预先审核的行动计划。
也许我们已经了解到以下做法有助于降低离职率:与员工进行职业对话、轮岗计划、增加学习机会。一旦我们有了可用的可能选项库,我们就可以根据绩效和环境选择适当的行动计划。
如果我们回到棒棒糖森林的例子,我们知道我们的营业额高于去年,也高于我们的对照组。我们在棒棒糖森林的营业额偏离了轨道。
我们来看看我们的银行降低流动率的潜在行动计划。在查看我们的行动计划时,我们知道我们目前没有增加学习机会的预算,所以我们现在忽略这一点。在考虑其他选择时,我们可能不知道员工是愿意进行更多的职业对话还是愿意参加轮岗计划。
如果我们需要更多信息,我们可以查看对离职调查的回复(如果我们有),或者我们可以与员工组成焦点小组,讨论目前是什么让他们留在自己的岗位上,以及什么会让他们对组织更加忠诚。
在查看了离职调查的反馈后,我们发现大多数离开公司的员工表示,他们离开公司是因为他们觉得在公司内没有明确的职业发展道路。正因为如此,你决定与员工进行职业对话,讨论他们的目标是什么,他们在组织中的下一步是什么,这是解决棒棒糖森林中人员流动增加的最佳行动方案。
现在,我们已经选择了最合适的行动方案,我们准备完成给我们的领导 Jolly 的电子邮件。
今年迄今为止,棒棒糖森林的营业额高于去年,也高于对照组。为了让棒棒糖森林的营业额重回正轨,我建议我们与所有员工进行职业对话。这些对话旨在通过确保员工感觉到他们有一个清晰的职业道路和在组织中成长的方向来增加保留率。
灯光,摄像机,开拍。
摘要
只要记住,和领导分享数据洞察的时候,不需要很复杂。领导者需要知道他们是否需要继续做他们正在做的事情,或者他们是否需要做一些不同的事情。按照以下步骤开始:
- 选个标杆
-行业标准
-集团内部对比
-历史对比
-公司目标 - 将表现
-更高或更低
-更好或更差
-更快或更慢
-在轨或离轨 - 行动计划
-有银行
-考虑背景
-获得更多反馈
继续用你的头撞墙,这样会好很多!
我是一名工业组织心理学家,在 People Analytics 工作。我相信工作应该是有趣的,龙舌兰酒应该被认为是药用的,数据应该民主化。
3 个简单的步骤来大幅改善你的代码
编写更干净代码的快速指南。
Mahmudul Hasan Shaon 在 Unsplash 上拍摄的照片
“当我在解决一个问题时,我从不考虑美。但当我完成后,如果解决方案不漂亮,我知道它是错的。”— 巴克明斯特富勒
现在是下午晚些时候。你有一个你已经做了一整天的功能,你被一个你无法解决的 bug 卡住了——你知道这种 bug 会产生这样的想法:“也许我应该把整个电脑扔掉,去做桌子谋生”听起来是个好主意。但是你咬紧牙关,挺过去了。
你终于找到了解决办法。这是丑陋的地狱,你知道这一点,但它的工作…目前。
作为开发人员,我们都对此感到内疚。我们制定了一个可行的计划,但不幸的是,这是对我们工匠精神的嘲弄。
我将与你分享我获得的 5 个简单的技巧,它们将对你的代码质量产生巨大的影响。
命名你的函数来反映你的意图
写程序时,函数的命名是非常重要的。它会对理解代码的难易程度产生巨大的影响。
一个名副其实的函数可以传达你的意图,让你的代码看起来更像自然语言。而命名不当的函数会掩盖程序员的真实意图。
这里有一个简单的例子来说明我的观点。你能告诉我这个函数在做什么吗?
handleEdit = (e) => {
// Prevent navigation to axios post.
e.preventDefault();
// Get user id from context
const userId = this.context.user._id;
// Get updated user info from state
let user = {
fname: this.state.fname,
lname: this.state.lname
}
// Send PUT request to edit route using updated user
axios.put(`http://localhost:3000/user/edit/${userId}`, user)
.then( res => {
if ( res.status === 200 ){
this.setState({ successMessage : res.data });
this.context.user.fname = res.data.fname;
this.context.user.lname = res.data.lname;
this.toggleInputs();
}
}).catch( err => {
console.log(err);
});
}
逐行阅读代码后,您可能会认为代码试图更新用户。标题 handleEdit 回避了“我们到底在编辑什么?”
现在来看看这个名字更新后的例子。
updateUser = (e) => {
// Code here
}
你看到了吗?代码不需要确定这个函数在做什么。这是一个将会更新用户的功能。这个名字清楚地表明了我的意图。
这就引出了下一点。
命名您的变量以反映您的意图
命名变量以反映您的意图会对您的代码产生很好的影响。
考虑这个例子。这段代码旨在让用户确认他们想要停用他们的帐户。这是原始代码。
var deactivationResponse = window.confirm("Are you sure you would like to deactivate your account?"); if( deactivationResponse ){
doSomething()
}
还不错。它确实传达了我们正在依赖某种回应。但是它可以自动阅读。这是更新的版本。
var userConfirmsDeactivation = window.confirm("Are you sure you would like to deactivate your account?");if( userConfirmsDeactivation ){
doSomething()
}
这样好多了。你甚至不需要阅读原始变量来完全理解我们正在检查的条件。
去掉那些臭评论!!
评论有多种形式。有些是有用的,提供了丰富的上下文和信息,这些信息可能是非常特定于领域的,并且可能难以置信地难以通过单独的代码进行交流。这些注释很重要,可以为您和其他必须编写代码的人节省宝贵的时间。
但是,大部分评论都是训练轮。当我们为变量和函数留下一串无意义的名字时,我们依靠注释来帮助我们找到一个有效的程序。
注释帮助我们对写得不好的代码感觉更好,或者更糟的是,它们重述了显而易见的事实。你应该尽可能地写好你的代码,因为当你的代码读起来像自然语言的时候,注释就会碍事。
软件开发既是一门科学,也是一门艺术。作为开发人员,我们最崇高的目标是编写不仅仅是工作的代码——而是编写我们可以毫无压力地阅读的代码,易于维护的代码,以及我们可以引以为豪的代码。
我想以对罗伯特·塞西尔·马丁(Robert Cecil Martin)的快速点头作为结束,他是*《干净的代码:敏捷软件工艺手册》*的作者,这篇文章的灵感很大程度上来自于测试他的作品中分享的设计原则对我来说是多么有效。如果你觉得这篇文章有用,我强烈建议你把这本书加入你的阅读清单!
理解数据变化的 3 个简单步骤
数据分析师探索数据的框架
今天,深入分析数据分析中的变化。图片来源:艾米·李斯特。
“每周购买量下降了!!为什么??怎么会??救命啊!!"—如果你是一名数据分析师,你肯定以前从苦恼的同事那里听说过类似的事情。变化是每项业务的一部分,并且发生在所有时间范围内。它可以影响许多领域,如网站上的每周购买量、生产的单位数量或天气。当人们看到变化时,他们会被驱使去理解是什么导致了变化,这样他们就可以制定合适的行动计划。作为分析师,我们应该促进这种理解,并概述核心问题。
在这篇文章中,我们将探索一些常见类型的变化进行分析。我们还将讨论您可以用来理解这些变化的方法。这些是数据分析师使用的基本描述性(或诊断性)分析方法,但任何对利用数据感兴趣的人都可以应用它们。
请注意,当某个值或指标与之前的值不同时,我们定义了该值或指标的变化。除了时间之外,维度也会发生变化,比如位置的变化。可以将下面讨论的许多方法应用于这些其他类型的方差。
我们将遵循这个粗略的结构:
- 考虑系统环境中的指标,以及其他可能相关的指标。
- 按不同维度分解指标,检查总体变化。
- 寻找可能引起变化的事件,发现相互关系。
我们将采取的分析变化的步骤的概要。虽然我通常会建议遵循这里描述的顺序,但是从一个开始并在另一个停止肯定是可能的。
第一步:查看其他指标
当查看正在变化的特定指标时,我们倾向于采用狭隘的观点。我们专注于这个单一指标,以及它是如何上下波动的。这对于那些严格跟踪既定指标的成熟团队来说尤其如此。查看指标时要记住的一个关键点是,所有指标都有缺陷。虽然一个给定的度量标准对某些用例可能是好的,但它在其他用例中可能会失败。一个指标可能很好地代表了一种行为,但却无法捕捉到另一种行为。因此,最好的第一步是查看其他指标,看看它们是如何受到影响的。
最好的第一步是查看其他指标,看看它们是如何受到影响的。
您可以从查看竞争指标开始。竞争指标是指在竞争相同资源时会向相反方向移动的指标。Youtube 视频上的赞和评论就是一个例子。一个引起人们注意“喜欢”按钮的产品变化会增加喜欢,但会减少评论。在这里,这两个功能争夺用户的注意力,以获得留下反馈的方法。当然,随着总浏览量的增加,喜欢和评论可能会一起上升。其他例子包括不同服装品牌的销售额或使用不同应用程序的时间。对于您的分析,您可能会发现,当您的典型指标下降时,另一个指标却上升了。这甚至可能对业务有益!
其他值得关注的指标是组成指标。组成指标是由其他指标“组成”的指标。拿某电商网站上的购买次数来说;这可以用一种方式分解为:
purchases = no. visitors x sign-up rate x sign-up to purchase rate
。
在分析每个指标时,可以看到后两个指标是恒定的,而访问者的数量却下降了。总的来说,组成指标通过将指标分解成更小的块,为您提供了另一种研究指标的方法。
与分支根类似,组成指标可以以多种不同的方式组合起来,组成一个被研究的指标。图片来源:佩里克利斯 Lolis 。
请注意,在选择如何分解指标时,有许多可能的选项。通常有些并不比其他的更明显,这使得做出正确的决定成为一种艺术。在这种情况下,拥有强大的业务经验是相当有价值的。例如,对于某些业务来说,一些指标会有内在的利益。当然,如果你能调查所有的指标,那是最好的。通过使用脚本和警报的更加自动化的方法,这当然是可以实现的。
在这个过程中,其他指标没有以预期的方式变化也变得很明显。这通常是引起警报的原因,因为问题可能是由数据跟踪错误引起的。
无论是组成指标、竞争指标还是其他指标,停下来想想其他可能影响系统变化的指标。通常,通过分析其他指标,我们可以检测到更强的信号,从而显著降低分析的难度。
第二步:分析不同的维度
一旦你有了你确定要分析的指标,是时候深入细节了。检测变化的下一步是分析数据中的各个维度。我们所说的维度指的是数据点的各种属性。你可以考虑用户有不同的维度,比如年龄、性别、设备、国家和语言。这些维度描述了用户,并允许我们将数据分成不同的组。
检测变化的下一步是分析数据中的各个维度。
客户细分是数据分析的经典之一。
通常我们把用户组(或者任何东西,真的)称为细分。对于数据分析师来说,确定业务的关键部分非常重要。这可以通过业务驱动的方法来实现,例如,我们了解不同国家的用户有不同的行为,或者通过应用一些统计分析(数据科学),如用户聚类。识别不同的细分市场后,就可以分析指标的相应变化。这可以显示更改如何影响不同的用户,并缩小搜索范围。
另一个需要注意的关键是混合换档。在混合移位的情况下,段的混合有一个移位。这有点棘手,所以让我们考虑一个电子商务商店的例子,它销售两种产品,下面是两个不同时期的数据。
Product A: 100->200 Sales, 5% CVR
Product B: 200->200 Sales, 10% CVR
老板注意到网站的整体转化率(销售/用户)有所下降,并要求分析师进行调查。根据以上所学,分析师决定按产品进行分解。他们很快发现每个产品都有稳定的转化率——这怎么可能呢?这是一个典型的混合换档案例。由于 A:B 的产品比例(组合)已从 1:2 变为 1:1,因此转换率较低的产品 A 现在对总指标有更大的影响。实际上,我们的销售有所增长,两种产品都卖得很好,我们只是看到了衡量标准的假象。
理解 Mix-shift 很重要,因为它通常可以将坏的变化转变为中性的,甚至是好的变化(正如我们在本例中看到的)。在分析长期趋势(如同比变化)时,许多宏观事件会影响分析结果,这种情况也很常见。
理解关键维度以及它们如何变化通常有助于理解事物为什么会发生变化并缩小搜索范围。
**最后一步:**确定原因
确定并理解了指标和细分后,最后一步是找出导致变化发生的确切原因。用更专业的术语来说,我们在寻找指标和一些潜在事件之间的相关性。获取事件列表的常见位置有:
- 产品发布历史;例如新的推荐算法、界面更新
- 所采取的营销或业务发展行动的清单;例如,新的广告活动开始,新的产品列表添加到库存中
- 和世界大事;例如公共假日或自然灾害。
总的来说,从一个组织内的不同团队收集信息,找出可能与问题相关的东西,是有启发性的。理想情况下,上述所有内容都已被记录下来,以便轻松利用,但如果没有,最好开始记录!
确定并理解了指标和细分后,最后一步是找出导致变化发生的确切原因。
在一个理想的世界中,我们可能会看到类似下面第一幅图的东西:一个独特的事件导致了一个显著的、值得注意的变化。这种情况可能发生在低噪声环境或有较大变化的环境中(这里我们关心的是信噪比),但在日常实践中非常罕见。我们通常看到的更像是第二幅图,我们有相同的指标平均差异,但噪声要高得多。
来自单一事件的度量阶跃变化的两个示例。在左图中,潜在的变化或噪声相当低,因此变化非常明显。在右图中,变化是相同的,但是潜在的噪声要高得多,使得用肉眼和任何平稳性分析都很难检测到这种变化。
对于第一种情况,让某人相信变化是由特定事件带来的是相当容易的。在第二种情况下,我们可以通过一些统计显著性测试来达到这个目的。一种常见的方法是平稳性测试,例如增强的 Dickey-Fuller 测试。
也可能不是单个事件导致了度量的变化,它可能是一个累积的过程,在上面讨论的方法中是检测不到的。在这种情况下,及时做一个相关性分析可能是有建设性的。一种方法是识别竞争对手,并将您的指标与其他平台的日常指标进行对比。根据公司的规模,您可能会看到正相关或负相关,随着时间的推移,这些指标会以显著的方式相互移动。这将告诉您,变化的一部分是由于相关的指标。
其他要考虑的事情
在进行数据分析时,需要考虑更多的事情(否则我们就失业了),其中一些包括设置假设、将数据放在上下文中并纳入更广泛的理解。
在以上各点中,我们一直在含蓄地做出假设。这是值得明确的,因为陈述你的假设创造了一个更科学和可重复的方法。创建假设也有助于避免持续的挑选数据的风险,在这种情况下,选择数据是为了找到一个结论,但我们没有找到数据的负面情况会被忽略。
我们经常没有花足够的时间坐下来思考潜在的假设。一开始就投资这一次真的很值得,因为它可以在以后省去很多痛苦。投入的时间也可以提高对产品的总体理解。做的时候尽量不要做这个表情就好!图片来源:布鲁斯·马尔斯。
我们应该始终努力将数据放入背景中。在执行分析时,说某个指标下降可能很容易,但为什么要止步于此呢?如前所述,大多数企业都有许多相互交织的指标,因此如果一个指标下降,另一个指标可能上升。值得检查其他关键指标,并标记是否有任何其他原始请求者可能没有注意到的意外差异。也许这次下跌意味着另一次上涨,这将对企业产生整体的良好影响。同时,记录下你分析过的所有其他领域也很有用,因为这些问题不可避免地会出现。
变化本身,就是变化。虽然我们可能会看到指标的变化,但未来的预期行为是什么样的?该指标会稳定在新值,还是会继续发展?这对于产品的变化特别有意思。你可以想象一个类似 Snapchat 过滤器更新的功能。当过滤器被更新时,许多用户将与它交互,并且最初的分析可能显示出改进,但是随着用户对该特性感到厌倦,它将再次开始改变。在大多数情况下,预测长期行为并不容易,但值得注意的是它是否可能发生,并计划在以后重新分析。
当我们谈论基于时间的事件时,我们没有进入季节性的话题。由于月与月之间的波动,指标以相对可预测的方式上下波动是很常见的。执行分析时,最好通过将指标值与您预期的指标值进行比较来调整这种季节性。预测可以是单纯基于去年的简单预测,也可以是使用像脸书的预言家这样的模型进行更详细的预测。
这篇文章中的语言集中在坏的变化上——但是我们不要忘记事情并不总是在下降,它们也会上升。然而在商业中,我们倾向于关注消极的一面,试图理解哪里出了问题,而不是正确的一面。同样重要的是,花时间了解事情为什么会上涨,这样这些知识就可以用于进一步发展业务。
结论
分别考虑上面讨论的每一点是很重要的。它们各有千秋,可以帮助构建更全面的数据视图。我们讨论了在系统的上下文中考虑指标,按照不同的维度分解指标,以及搜索可能导致变化的事件。
在整个数据中,我特别提到了数据分析师作为受众,但在现实中,许多工作现在都是数据驱动的,我认为对数据分析和如何思考变化的基本理解对我们所有人都是必要的。因此,如果你有同事可能从中受益,请与他们分享!或者,如果你有没有提到的你喜欢使用的技术,让我们来讨论一下。
更好地构建 SQL 查询的 3 个简单技巧
以及立即应用它们的实际例子
卡斯帕·卡米尔·鲁宾在 Unsplash 上的照片
SQL 代表结构化查询语言。不幸的是,这并不意味着一旦你开始用这种计算机语言编程,你就会自然而然地写出一段结构完美的代码。
作为一名数据分析师,我不断地应用三个简单的规则来更好地组织我的 SQL 查询。它们不仅让我避免了从数据库中查询的错误,还为我自己和与我分享查询的同事节省了时间。让我向您展示这些技巧,并用一个真实的例子来说明它们。
1.可视化您的查询输出
高效地构建 SQL 代码始于牢记您想要实现的结果。问自己这个简单的问题:我希望我的输出表看起来像什么?
特别要注意以下几点:
- 粒度级别:您希望您的输出表处于哪种聚合级别?换句话说,每行应该对应什么?
- 输出字段:根据查询生成的表格,您将使用哪些字段?换句话说,每一列应该对应什么?
- 输入变量:你的数据从哪里来?换句话说,您将在查询中处理的变量的性质是什么?
让我们用一个例子来实践第一个技巧。想象一下,你的老板刚刚让你分析上个月销量的演变。为此,您将需要检索每天(粒度级别)的产品数量(输出字段),知道您可以访问一个数据库表,该表汇总了客户在过去几个月中所做的购买(输入变量)。
因此,您的查询输出应该如下表所示:
玛丽·勒费夫尔
2.使用 WITH 子句
要生成所需的表,您需要采取许多步骤。当我开始用 SQL 编码时,我的第一反应是从关键字“SELECT”开始。但有了经验,我现在系统地从“用”这个关键词入手。乍一看,使用 WITH 子句可能会让您认为这会使您的查询看起来过于复杂。但是我可以向你保证即使对于相对简单的查询,它也可以让你组织你的思维,让你的查询更容易阅读和理解。
WITH 子句的另一个主要优点是,您可以构造一系列子查询,每个子查询都可以引用(或不引用)前一个子查询。通过这样做,您将避免在主查询中编写无穷无尽的嵌入式子查询,从而减少失去思路的风险。使用 WITH 子句允许您在代码底部编写主查询之前,首先检索并计算主查询中请求的所有字段。
让我用前面的例子来说明这一点。编写获得所需输出所需的代码的第一种方法是:
使用 WITH 子句的另一种方法是:
请注意,这两个查询具有相同的性能,并且具有相同的代码行数。然而,第二段代码向读者展示了通向主查询的逻辑步骤:首先从表“sales”中检索原始字段,在适当的级别对它们进行计算,然后在主查询中使用它们。虽然对于这个示例,第一个版本对大多数用户来说可能已经足够清楚了,但是您可以很容易地想象到,对于更复杂的查询,不使用 WITH 子句可能会导致大量的嵌入式子查询,从而导致代码的高度复杂性。
3.勤奋写作
在行动最激烈的时候,你可能没有花时间以最干净的方式编写代码。不关心代码中的每一个语法规则的诱惑确实很大。协调一段代码也可能是痛苦的,似乎是浪费时间,特别是如果原始代码正确运行并做了它应该做的事情。
然而,我建议你在把你的代码放在一边之前花点时间仔细检查一下——也许六个月后再回来问自己“这部分代码应该做什么?”。首先,即使你现在确信你将永远记住你的代码的逻辑,你以后可能会回想起它,并且不记得它是如何被构造的。如果做得好,你会节省很多时间。第二,其他人可能需要阅读和重用你的代码。除非你确定你或其他任何人以后都不会使用你的作品,否则请考虑以下部分。
协调你的代码语法并确保其风格的一致性并不意味着你必须花费数小时来重写你的代码。一些免费工具允许你根据广泛使用的标准或者你自己定义的格式化规则来重新格式化你的代码。它们可以是您的查询工具中的功能(例如 Google 的 BigQuery 控制台中的“格式查询”)、在线工具(例如像 Poor-SQL 或 sql-format 这样的网站)或您的文本编辑器中的附加包(例如 Sublime Text 的“SqlBeautifier”)。
校对您的代码时,请注意以下元素的一致性:
- 缩进:对齐所有具有相同性质并且处于相同聚合级别的字段,可以更容易理解代码背后的逻辑。
- 大小写:对所有 SQL 关键字使用相同的大小写规则(通常为大写)和另一种独特的字段大小写逻辑(例如 camelCase、snake_case 或 PascalCase)可以更容易地理解每个单词在查询中扮演的角色。
- 注释:用来注释一段代码的字符可能会根据你使用的数据库管理系统(RDBMS)而有所不同(双连字符、斜杠、hashtag…),因此,调整整个代码中用来注释它的语法是至关重要的。
如果回到前面的例子,您会注意到我对 SQL 关键字使用了大写,对字段名使用了 snake case。由于我习惯于 BigQuery 中的标准 SQL,所以我使用双连字符来添加注释。
结论
如果您处于 SQL 编程的初级阶段,这些技巧将有助于您更加自信地编写查询,因为它们鼓励您组织自己的思维,并通过这样做,使您编写的代码更加清晰。
如果您在 SQL 掌握方面处于更高级的水平,这些技巧将鼓励您更好地组织代码,并使其易于被其他人理解,而不管他们的背景和 SQL 熟练程度如何。
你喜欢阅读这篇文章吗? 成为 的一员,加入一个不断成长的充满好奇心的社区吧!
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
marie-lefevre.medium.com](https://marie-lefevre.medium.com/membership)
强化学习(RL)前需要掌握的 3 项技能
你需要能够训练神经网络,将搜索视为规划,并理解学术论文。
当我在搜索强化学习的掌握时,通过所有的教程和课程,有一些他们认为你知道的常用工具。最终,你要应用的领域中的小弱点会变成大错误。
来源——作者在俄勒冈州本德的冒险经历。
1.监督学习
现代强化学习几乎完全专注于深度强化学习。短语深度强化学习中的单词 深度 暗示了在算法的核心方面使用神经网络。神经网络在学习过程中进行一些高维近似。也就是说,模型不需要有许多层和特性,这是一个常见的误解,即深度意味着许多层。
几乎所有的课程和教程都会假设你能够微调简单的神经网络来逼近状态值或者创建最终的策略。这些模型在历史上对以下所有训练参数高度敏感:学习率、批量大小、模型参数、数据标准化等等。再加上难以解决的任务,调试 RL 可能会非常困难,就像一个二元的它工作或它不工作。通过了解所有的次近似都达到标准,消除混淆的尾巴。最好的方法是学习监督学习,然后让一个 AutoML 工具为你完成这项工作。
从一些代码开始,破坏一切,然后重新构建。这样做几次,你应该很好去。监督学习也是一项技能,在未来十年里,它将转化到计算机科学的几乎所有领域,所以,努力追求它吧。
在使用现代人工智能系统时,你会经常看到这个草图。
2.人工智能中的搜索方法
RL 是策略空间中的搜索问题。近年来最具影响力的报纸一直从过去的搜索问题中获得严肃的灵感。让我们来看看最近 RL 最有影响力的三篇论文:
- 迄今为止最主流的强化学习成果: Deepmind 用 at-scale 强化学习对很多游戏的掌握。最近的结果是使用规划网络来探索未来行动的长链。
- 基于模型的 RL 的最新发展水平:基于模型的策略优化 (MBPO)。MBPO 正在状态-动作空间的附近区域进行搜索,以获得系统动力学的更完整的知识。这种模拟的知识就像一种肤浅的、面包优先的搜索。
- 无模型 RL 中的艺术状态:软演员-评论家(SAC)。SAC 以结合高效探索和高峰性能而闻名。它通过最大化策略上的熵项来做到这一点。直接策略搜索是 RL 作为搜索问题的最关键的方面。
RL 中的规划对于基于模型的强化学习的子领域(相对较小,但正在增长)来说是一个巨大的胜利,该子领域试图学习离线规划的环境模型。
*你问:我在哪里可以重温一下**搜索的概念?*这里是我学习的地方:加州大学伯克利分校的和麻省理工学院的人工智能课程简介。然后做一两个代码项目,挑战自己。
来源——我们在 CS188 的一次讲座。
3.理解学术论文
请注意,我没有说阅读学术论文。关键是要能够理解他们。
学术领域变化很快,活跃的 Twitter 社区每天都有论文发布(说真的,关注几个著名的研究人员——这对让你跟上进度很有帮助)。你需要学习的是区分有影响力的论文和噪音以及进度和炒作*。*
现在不是转发或引用的问题——尽管我承认引用是一个很好的替代——而是实质性的实验。机器学习的出版周期是粘性的,研究人员预计一年出版多次。你应该看的是实验:它们是遵循一个问题、实验、然后解决的弧线,还是只是逐步改进另一个人的方法?最好的论文是在寻找真理,而不是数字。
最好的研究寻找最重要的问题,不管学术讨论的浪潮如何。学会辨别这些信号,你就能跟上这个领域,成为下一个十年有价值的人力资源。
来源,我在机器人学和 ML 方面的 3 篇论文
我已经写了很多在强化学习中建立基本技能的教程,见下面的大纲。
了解大多数强化学习问题中使用的模型。
towardsdatascience.com](/what-is-a-markov-decision-process-anyways-bdab65fd310c) [## 强化学习的隐藏线性代数
线性代数的基础如何支持深度强化学习的顶点?
towardsdatascience.com](/the-hidden-linear-algebra-of-reinforcement-learning-406efdf066a) [## 强化学习的基本迭代方法
学习价值和策略迭代能掌握多少强化学习?很多。
towardsdatascience.com](/fundamental-iterative-methods-of-reinforcement-learning-df8ff078652a) [## 强化学习算法的收敛性
有什么简单的收敛界限吗?
towardsdatascience.com](/convergence-of-reinforcement-learning-algorithms-3d917f66b3b7)
继续学习!
更多?订阅我关于机器人、人工智能和社会的时事通讯!
一个关于机器人和人工智能的博客,让它们对每个人都有益,以及即将到来的自动化浪潮…
robotic.substack.com](https://robotic.substack.com/)*
给 Julia 的 3 个流畅的语法技巧
用这些令人兴奋的技巧最大化你的语法!
(茱莉亚标志由 http://julialang.org/提供)
伟大的代码编写艺术,尤其是像 Python 和 Julia 这样的高级语言,是一种相当容易学习的东西——但却难以掌握。即使非常熟练的程序员也有可能在他们的语法中犯看似基本的错误。然而,拥有清晰简洁的代码不仅在可读性标准上很重要,而且在做错的时候也会产生非常严重的影响。学习一些伟大的技术和快捷方式来执行操作,这绝对是一个让你的代码发光并让你的同事喜欢你的绝妙方法。幸运的是,有成千上万的小技巧可以用来增强你的代码。
№1:布尔逆
让我们来看看下面的场景:
mutable struct light
status
end
function turn_on(light)
light.status = true
return(light)
end
function turn_off(light)
light.status = false
return(light)
end
在这个例子中,我们可以使用 turn_on 和 turn_off 方法打开或关闭灯光。
如果我们想把两者结合成一个功能呢?
对于条件语句来说,这是一项显而易见的工作,许多程序员会这样处理这个问题:
function use_switch(light)
if light.status == true
light.status = false
else
light.status = true
end
end
首先,我们检查灯光是否设置为 true。这将首先需要来自处理器的 MOV 指令,其中由变量 light.status 表示的数据将被移动到注册表核心中进行比较。接下来,还需要将 true 移动到注册表核心中。然后,将执行一个 CMP 指令来比较这两个值,这将改变一个标志—(但在这种情况下,他们可能会使用 JNE 条件转移来代替。)
接下来,计算机需要将我们的 false 移动到当前保存 light.status 变量数据的内存中。如果我们的标志从未被更改,那么下面将有一个部分,它将在代表 light.status 变量的地址处移入我们的内存。
因此,如果 light.status 为真,这个条件语句至少需要 4 条指令。如果是假的,最少需要 6 个指令。幸运的是,在 Julia 中,我们有一个用于反转 bool 类型的操作符。为了在 Julia 中这样做,我们可以使用=!。
function use_efficient_switch(light)
light.status =! light.status
return(light)
end
现在让我们建立一个小的性能测试,并测量这两种方法之间的差异。我构造了两个函数在 for 循环中调用这些不同的方法。然后我用@time 宏运行这两个函数,看看这个小小的改进会带来什么样的不同。
function flick(bulb, iters)
for i in 1:iters
use_switch(bulb)
end
end
function flickeff(bulb, iters)
for i in 1:iters
use_efficient_switch(bulb)
end
end
显然好多了
由于需要移动到内存中的值更少了,我们浪费的时间更少了,甚至减少了分配。不仅如此,还有这个:
看起来比这好多了:
№2:调度一切!
如果您是 Julia 的新手,您可能会很高兴了解到该语言有一个多态分派,允许您基于某些标准(如类型或值)来路由方法。下面是调度用法的一个基本示例:
从两个函数开始,在这个例子中,我们想要打印一个数组的每个元素,或者打印一个整数。下面是实现这一目的的两个函数:
function handle_array(arr)
[println(i) for i in arr]
end
function handle_int(int)
println(int)
end
需要明确的是,迭代地执行 println()和在一行上打印数组是有区别的。
我们还从 for 循环中得到一个有趣的三元素 nothing 返回。如果您想取消它,您总是可以添加一个;到循环的终点。我们可以将这些合并到一个函数中,通过使用 Julia 的调度来处理这两种类型,如下所示。为此,我们只需使用=运算符。
inlineprint(arr::Array) = handle_array(arr)
inlineprint(arr::Int64) = handle_int(arr)
结果是:
现在我们可以就此打住,这本身就是一个强大的工具,但重要的是要记住,函数只是一个有着花哨名字的类型。朱莉娅的伟大之处在于我们能够利用这一点。首先,你应该理解语法表达。这些当然是朱莉娅语法的一大部分,而且是一种只因为分派而存在的能力。让我们举一个速度的例子:
mutable struct car_stats
distance
time
speed
end
honda_civic = car_stats(25, 40, nothing)
在这个特定的场景中,我们知道汽车行驶的距离,以及汽车行驶那么远所用的时间。我们缺少这辆车的速度数据,我们需要找到它。如果你还记得的话,这个公式就是距离除以时间得到速度。所以与其写这样一个函数:
function speed(carstat)
mph = carstat.distance / carstat.time
return(mph)
end
我们可以用 Julia 返回时间的调度创建一个语法表达式:
我们甚至可以更进一步,使用 dispatch 将这些方法作为一种类型的子方法,这是非常不可思议的!为此,我们首先需要创建另一个分派函数来返回我们的类型:
typemaker(speedfunc,civic) = ()->(speedfunc;civic)
然后,我们将为变量分配相应的方法和速度统计类型:
d = typemaker(speed,honda_civic)
现在我们可以跑了
d.speedfunc(d.civic)
作为一个新的 Julia 开发人员,你可能犯的最大错误之一就是没有利用 Julia 的调度并充分发挥它的潜力!
№3:滤镜!
Filter 可能是来自 Julia 库的最有用和最通用的工具之一,尤其是如果你像我一样,经常发现自己在对大量数据进行排序。您可以花费数小时构建循环来确定数据中是否满足某些条件,或者您可以只使用 filter!Filter 是 Python 的 Pandas 的条件屏蔽的 Julian 等价物,然而,它被合并到语言的基础中,使它更快并且与语言的其余部分的语法非常一致。
在数据操作中,过滤是实现各种不同目标的一种很好的方法。毫无疑问,能够有效地使用这种方法将会使您在 Julia 中管理数据时受益匪浅。考虑以下数据:
x = 1:10
使用过滤器!,我们可以根据每个 dim 是否满足特定条件来决定包含或排除哪些数据。比方说,我们只想得到能被 3 整除的值:
filter((x) -> x % 3 == 0, x)
虽然这是一个相当不实用的例子,但它确实以最基本的方式展示了 filter 的用法。在基本的统计测试中,这可能会派上用场。在 Julia 中有许多方法可以做到这一点,但是 filter 始终是一种非常有效的方法。
结论
在 Julia 语言中,有很多很酷的小技巧可以用来升级语法,让事情变得更简单。从像操作符和多态调度这样令人惊奇和复杂的工具到像过滤器这样简单的基本功能!,使用 Julia 语言总有一些很好的东西可以让你的代码更快更简洁。
学习数据科学的 3 个阶段
了解学习的 3 个阶段,以及我们如何将其应用于学习数据科学
本·怀特在 Unsplash 上的照片
人们常说数据科学是 21 世纪最性感的工作。在这方面,在某种程度上,为什么这么多人想学习数据科学是有道理的。
数据科学是一个巨大的领域,通常将它作为一门非学术学科来对待是极其令人生畏的。我哪里知道?看看我的 LinkedIn 个人资料…
[## Kurtis Pykes -人工智能博客-走向数据科学| LinkedIn
在世界上最大的职业社区 LinkedIn 上查看 Kurtis Pykes 的个人资料。Kurtis 有两个工作列在他们的…
www.linkedin.com](https://www.linkedin.com/in/kurtispykes/)
我已经从一名送信员到一名房间助理,再到作为一名机器学习工程师的实习,为了让你更加放心,在那之前我在职业水平上踢足球,如果我们再往前追溯,在某个阶段我已经准备好成为一名主要的跆拳道战士——我知道,这是很大的变化,少谈我没有分享的东西,但也许我可以在以后的帖子中详细介绍。
我最大的技能是我的学习能力。我一直都知道这个。我从来不相信我学不到东西,但我从来不知道为什么或如何做到这一点。我花时间研究和思考我是如何学会走到现在这一步的,并认为我应该与我的同行分享我发现的信息,这样我们就可以一起将数据科学领域提升到难以想象的高度。因此,为了加速数据科学的发展,我有责任与尽可能多的有兴趣的人分享我是如何学习数据科学的。
该过程
学习有一个过程。为什么这很重要?知道有一个过程是很重要的,因为过程描述了事情是如何完成的。如果我们知道事情是如何完成的,那么这将为我们提供关注和使过程变得更好的潜力。如果我们能够改进流程,我们就更有可能取得成功。
如果你以正确的方式关注正确的过程,你就能设计出通往成功的道路。—我不知道这是否是其他人的真实引用,但如果不是,我要求第一 dabs!
听过“爱上过程这句话吗?是的,这很常见,但是我们很少思考我们说的话。我会证明,爱上下一个你见到的陌生人。我这么说是为了向你证明,爱上一个你不了解的东西是非常困难的,所以我们要想爱上过程,就需要了解过程。我们知道精通需要时间。它需要持续一段时间的计划和专注。考虑到这一点,我们可以开始…
为了有效地规划您的数据科学职业生涯,重要的是要知道您想要去哪里,然后弄清楚您想要如何到达那里。这里有一些你可能想回答的问题:
我的目标是什么?
我想去哪里?
为了弄清楚如何到达那里,知道你目前在哪里是很重要的。你可能会问自己:
我有什么技能?
要达到我的目标,我需要哪些技能?
在回答这些问题时,你做了两件对获得新技能至关重要的事情。首先,你给了自己一个方向感,其次,尽管如果你是一个领域的新手,可能需要一些研究来知道你需要什么技能,但你给了自己一条可以遵循的路线。把你的精力用在你需要学习的每一项技能上,可以被认为是实现总体目标的动力。
“要到达你要去的地方,你必须知道你在哪里”——鲍勃·普罗克特
学习的三个阶段
当我们获得新技能时,我们会经历 3 个阶段,作为一名数据科学家,有许多技能是必需的,理解这些阶段是学习令人兴奋的原因。为什么?因为当你回顾这些阶段时,你可以指出你在哪里,这将使你更清楚地知道你需要做什么。
认知阶段
*问题:*在这个阶段,我们要解决的问题是理解我们要做什么。
在没有获得关于你所学内容的先验知识的情况下,学习一个主题是非常困难的。
许多人决定上大学,许多人喜欢书本,许多人喜欢在线课程。他们都有什么共同点?有一个人,一名教师,积累了该主题的先验知识,他们正在将他们的经验传授给你——我看到许多人问学习数据科学是否需要博士或硕士学位,我认为这是主观的。你必须评估你的目标来做决定。
*特点:*你可以期待在有很多不一致的情况下,在你的表现中体验到巨大的收益。在这个阶段,指导是必要的,反馈也是必要的。
一个与数据科学相关的指令的例子可以是每周学习 2 个算法,并从头开始对它们进行编码。这项任务的反馈可以通过对照工作实现测试您的解决方案来给出,以查看您的得分是否相同。
目标:这一部分的目标是以一种可转移的格式吸收和有意义地组织信息,以便在下一阶段使用。
由 Robina Weermeijer 在 Unsplash 上拍摄的照片
关联阶段
问题:这个阶段我们要解决的问题是把潜在的动力转化为现实的动力。
我们都听说过这样一句话:知识就是力量。在信息时代的崛起中,我们通过一两次点击就可以获得大量的信息,事实证明知识并不是真正的力量。知识是潜在的力量,因为知道一些事情并不一定会影响变化。
我们在认知阶段积累了我们想要学习的技能,在这个过程中积累了大量的潜在能力。要认识到这种力量,我们必须付诸行动。
练习,练习,再练习!
正如你从我上面的简历中看到的,我在两个方面都是运动员,我能回忆起这个阶段的一件事是进入这个阶段的重复时间。我会花一个小时表演同样的反踢,或者当我踢足球时,我会花几个小时练习任意球来完善我的技术(如果我找不到我的视频,如果有足够多的人要求观看,我可能会把我的靴子挂起来)。
就数据科学而言,这可能只是简单的特征工程。想做好人?利用您在认知阶段学到的关于特征工程的知识,有意识地将它们应用到不同的数据集,并评估它如何影响您的模型的结果。在这样做的过程中,你可以了解什么样的策略对不同的数据集是有效的,并从本质上消除那些不起作用的东西。
这是我关于特征工程的文章,可以帮助你开始…
工程数值的技巧
towardsdatascience.com](/feature-engineering-for-numerical-data-e20167ec18)
*特点:*这个阶段需要大量有意识的努力。事实上,开始的时候可能会感觉非常别扭,需要做很多小的调整来提高你的表现。完成任务可能比有经验的人多花你几个小时、几天或一周的时间,但关键是要记住,从前他们也像你一样,他们也经历过这个阶段。
目标:这里的目标是把许多小技能放在一起,这些技能反过来会积累起来,让你在将来不被你的同龄人认出来。
自治阶段
呜…流动的状态。
戈登·威廉姆斯在 Unsplash 上的照片
我们在播客、TED 演讲等中听说过它。我们都渴望的心流状态。
在这种状态下,我们可以以最高的熟练程度进行表演。我们不太关注技能,因为我们可以自动做到这一点——这意味着我们不必去想它,它只是流动。
这在数据科学中有什么用?这样想,你有没有见过当一个新的比赛在 Kaggle 上开始时,总是同一批人直接冲到排行榜的顶端?是的,他们!他们在流动。他们已经学会了在 Kaggle 上竞争,什么可行,什么不可行。他们在无数的比赛中一遍又一遍地练习,现在你所看到的当他们冲向顶峰时是他们劳动的成果。
这项技能已经被编入你的潜意识中,现在你可以将注意力集中到表演的其他方面。
结论
这个过程可能需要很长时间,但是相信这个过程会让旅途变得轻松。尽管要记住的一件关键事情是,自动阶段会强化任何在这个过程中养成的坏习惯,而坏习惯是很难改变的。从经验丰富的专业人士那里学习最佳实践,永远是最好的开始方式,而不是从头开始。
如果您认为我遗漏了什么或不同意某些观点,您的反馈很有价值。发个回应!如果你想和我联系,我是 LinkedIn 上最活跃的,我也很乐意和你联系。
[## Kurtis Pykes -人工智能博客-走向数据科学| LinkedIn
在世界上最大的职业社区 LinkedIn 上查看 Kurtis Pykes 的个人资料。Kurtis 有两个工作列在他们的…
www.linkedin.com](https://www.linkedin.com/in/kurtispykes/)
这里是我的一些其他文章,你可能会觉得有趣…
使用 ARIMA 模型预测沃尔玛的销售数据
towardsdatascience.com](/forecasting-with-stochastic-models-abf2e85c9679) [## 有效的数据可视化
构建有效的数据可视化的技巧可以简化为 3 个简单的步骤
towardsdatascience.com](/effective-data-visualization-ef30ae560961) [## 特征选择入门
选择有用功能的初学者指南
towardsdatascience.com](/getting-started-with-feature-selection-3ecfb4957fd4)
数据科学面试中你应该知道的 3 个统计学概念
你应该知道的基本统计概念
由故事创建的数据向量—www.freepik.com
数据科学家基本上是现代统计学家。以下是你在数据科学面试中最有可能遇到的 3 种常见的统计学问题。出现如此频繁的原因是,它们是许多数据科学应用程序的基本构建模块,如贝叶斯机器学习或假设检验。
请记住,有许多许多统计概念是重要的,例如,我没有包括中心极限定理,但在谈论概率分布时,这仍然是一个重要的概念,所以从这里拿走你想要的东西。
说到这里,我们开始吧!
除此之外我推荐的另一个资源是StrataScratch。它有数百个数据科学面试问题,并帮助我提供了像这样的资源!所以查一下 这里 。
1.贝叶斯定理/条件概率
简单明了,你需要了解贝叶斯定理和条件概率(方程见下文)。最流行的机器学习算法之一 Naive Bayes 就是建立在这两个概念之上的。此外,如果你进入在线机器学习领域,你很可能会使用贝叶斯方法。
贝叶斯定理
条件概率
例题:你即将登上飞往西雅图的飞机。你想知道你是否应该带一把伞。你打电话给住在那里的三个朋友,分别问他们是否在下雨。你的每个朋友都有 2/3 的机会对你说真话,1/3 的机会用谎言来搞乱你。三个朋友都告诉你“是的”下雨了。西雅图真的下雨的概率有多大?
回答:你可以看出这个问题与贝叶斯理论有关,因为最后一个陈述本质上遵循这样的结构,“给定 B 为真,A 为真的概率是多少?”因此,我们需要知道西雅图在某一天下雨的概率。假设是 25%。
P(A) =下雨的概率= 25%
P(B) =三个朋友都说在下雨的概率
P(A|B)假定他们说在下雨的概率
P(B|A)假定在下雨的情况下三个朋友都说在下雨的概率= (2/3) = 8/27
第一步:求解 P(B)
P(A | B)= P(B | A) * P(A)/P(B),可以改写为
P(B)= P(B | A)* P(A)+P(B |非 A)* P(非 A)
P(B)=(2/3)* 0.25+(1/3)* 0.75 = 0.25 * 8/27+0.75 * 1/27
第二步:求解 P(A | B)
P(A | B)= 0.25 *(8/27)/(0.25 * 8/27+0.75 * 1/27)
P(A | B)= 8/(8+3)= 8/11
因此,如果三个朋友都说在下雨,那么有 8/11 的几率是真的在下雨。
更多类似问题,查看我的免费资源 这里 !
2.计数应用程序
如果你从事网络安全、模式分析、运筹学等工作,组合和排列是非常重要的。让我们再来回顾一下这两者分别是什么:
排列
定义:n 个元素的排列是这 n 个元素按照确定的顺序的任意排列。有 n 个阶乘(n!)排列 n 个元素的方式。注意粗体字:顺序很重要!
一次取 r 的 n 个事物的排列数被定义为可以从 n 个不同元素中取出的 r 元组的数目,并且等于以下等式:
例题:一个 6 位数的车牌有多少种排列?
回答
组合
定义:在顺序不重要的情况下,从 n 个对象中选择 r 的方式数。
一次取 r 个的 n 个事物的组合数定义为一个具有 n 个元素的集合中具有 r 个元素的子集的数目,等于以下等式:
例题:从一副 52 张牌中抽出 6 张牌有多少种方法?
回答
请注意,这些都是非常非常简单的问题,可能会比这复杂得多,但是您应该很清楚上面的例子是如何工作的!
3.概率分布/置信区间
人们很容易在概率分布中迷失方向,因为概率分布太多了。也就是说,如果我必须选择五个主要的发行版,它们是:
- 正态分布
- 泊松分布
- 二项分布
- 指数分布
- 均匀分布
例句问题:苏格兰的凶杀率从前一年的 115 下降到了去年的 99。这种报道的变化真的值得注意吗?
回答:由于这是一个泊松分布问题,所以均值=λ=方差,也就是说标准差=均值的平方根。
- 95%的置信区间意味着 z 值为 1.96
- 一个标准偏差= sqrt(115) = 10.724
因此置信区间= 115+/- 21.45 = [93.55,136.45]。由于 99 在这个置信区间内,我们可以假设这个变化不是很值得注意。
感谢阅读!
仅此而已!我希望这对你的面试准备有所帮助,并祝你在未来的努力中好运。读完这篇文章后,希望你对这三个概念有一个基本的理解。如果你觉得你需要更多地研究这些概念,我会查看我的免费数据科学资源,它涵盖了概率基础和概率分布。
特伦斯·申
- 如果你喜欢这个, 跟我上 Medium 了解更多
- 我们来连线一下LinkedIn
- 检出StrataScratch