TowardsDataScience-博客中文翻译-2020-四-
TowardsDataScience 博客中文翻译 2020(四)
关于数据,开发者可以教给我们的 4 件事

“到 2022 年,只有 20%的分析洞察会带来业务成果。”—高德纳[1]
数据在两个世界之间建立了一个家。最常见的情况是,数据团队夹在业务的技术层面和运营层面之间。虽然这常常会让我们觉得自己是格格不入的,但它实际上让我们处于一个不可思议的位置,在我们自己的领域中利用这些世界中最好的东西。
在过去的 2 年里,我在一家小型初创公司工作,整天都被夹在我们的开发团队和运营团队之间。作为唯一的数据人员,我不得不开始从我周围的人那里学习我能学到的东西——并在这样做的过程中了解其他领域,如软件开发,如何教会我如何大幅改善我的数据团队的运营。我很快意识到这些原则可以让所有数据团队受益。
这个数据团队效率的概念已经有了一个名字— DataOps 。它源于它年长、成熟的表亲 DevOps。DevOps 和敏捷方法论的出现是为了对抗软件开发人员在工作时面临的低效率。他们专注于:
- 如何更有效的协作,
- 如何快速部署事情
- 如何保持高水平的质量
DevOps 原则非常成功,现在几乎世界上每个软件团队都在使用它们。数据操作呢?嗯,那还在找它的脚。但是随着对数据需求的持续增长,这是我们很快需要考虑的事情。为什么不从我们能从邻居身上学到的开始呢?
这是我认为数据团队应该尽快融入我们工作方式的 4 件事。
1.版本控制
将其用于:协作和质量

【分支合并…懂了吗?]照片由派恩瓦特在 Unsplash 上拍摄
即使您不是开发人员,您也会非常熟悉缺乏版本控制的痛苦。回想一下你和你的团队最后一次尝试一起编辑电子表格的情形。
在过去的十年中,版本控制一直是软件开发人员的英雄(尽管这个概念比那要古老得多),然而它在大多数数据团队中仍然相对缺席。在我之前的角色中,我拥有的最接近版本控制的东西是我放在桌面上的一个名为“The OG 的 SQL 查询,我将用它作为我所有其他 SQL 查询的起点。
虽然版本控制正慢慢地被用于数据科学模型和 ETL 脚本,但我们可以,也应该做得更多。这两个领域最类似于软件代码,但是数据管道的其余部分是…混乱的。像报告这样的东西是如何得到版本控制的?而数据呢?你能控制它的版本吗?而自助工具呢?他们需要版本控制吗?
答案是肯定的,各位。如果昨晚你的报告更新时,上游出了问题,所有东西都坏了。应该有办法还原到昨天的报告(或数据)。或者,如果您的新员工只是想下载您的 SQL 查询的副本,但实际上更改了实时版本,现在没有回头路了,该怎么办?现在我们明白为什么我把 OG 放在我身边了。这些是我们经常面临的问题,但是我们还没有对它们采用版本控制解决方案……还没有。
2.同行审查
用它来:协作,和质量

约翰·施诺布里奇在 Unsplash 上的照片
每当开发人员提交一段代码时,它所经历的许多步骤之一就是同行评审。团队中的其他人亲自阅读他们的代码,并对其进行评论。最终,他们必须在投入生产前批准它。有些人可能会认为这很突兀,甚至是低效的。但是我爱死它了。
我从未对我的任何数据角色进行过这种级别的审查;仪表板可能被掩盖了,SQL 查询在我的肩膀上看着,但是团队中几乎没有人知道我在做什么,更不用说它是否达到了某种标准。
在数据团队中工作最糟糕的事情之一(至少对我来说)是你几乎没有和任何人一起工作过。你们很少一起解决问题。你肯定是在一个跨职能团队中,但是数据问题是你的,而且是你一个人的问题。这个简单的添加同行评审的行为增加了一个协作层,而这个协作层以前并不存在。
团队合作和质量+2。再加上这个不一定需要什么技术。当然,技术可以改进它,但是你可以很容易地在你的工作流程中增加一个步骤,允许你的每个报告或查询在发送之前得到团队中另一个成员的批准。
3.自动化测试
用它来:质量,速度

开发人员被告知他们工作的 10-20%应该被指定用于设计和实现他们工作的自动化测试[2]。如果这些测试失败了,你的客户就是最终测试你代码的人。他们往往会在这样做太多次后离开。这些测试通常是好的开发团队(和好的产品)的标志。
最棒的是这一切都是自动完成的!如果代码没有通过这些测试,它将不会被合并。伙计们,我们要建一堵墙。
数据也应该如此。当我过去为我的报告构建 SQL 查询时,甚至当我编写数据科学模型时,我的代码所经历的测试级别总是由我决定。我可以选择大力抽查结果,并尝试不同的模型版本,直到我感到满意,如果有必要,我可以捍卫它。但更多的时候,是最终客户发现了错误。这些交互中的每一个都会削弱数据和业务之间的信任。您的数据客户不应该发现您的错误。所以让我们建起那堵墙吧![高质量测试墙,非常清楚。]
4.连续交货
用于:质量,速度
这个想法指的是产品变化的速度。代码库将被迭代,并经历小的增量变化。
数据恰恰相反。项目往往需要很长时间,而且有很多一次性的请求。一旦发货,它就完成了,脱离了我们的控制,除了一些后续的请求。
我们需要更快地发布信息和迭代直到我们的数据和报告变得有用。这确实是我们让数据对业务更有价值的唯一方法,并有望在令人震惊的 20%的统计数字上有所提高。
我们如何做到这一点?
就像我上面提到的,其中一些已经发生了,但几乎只发生在数据工程和数据科学工作流中。这正在创建我们自己的数据孤岛,与最初带来 DevOps 的数据孤岛没有什么不同。我们需要将这些想法扩展到我们领域中最像软件的部分之外,并着眼于将这些想法应用到像报告、可视化和特别查询这样的事情上。
我们世界的这些部分与软件非常不同,所以这不会像将它们所有的过程和工具复制粘贴到我们的环境中那么简单。
为了利用这些知识,我们需要对它们进行调整。幸运的是,这不仅与流程有关,也与技术和工具有关。
关于流程
这些是立竿见影的效果。
- 在向客户发布之前,向所有报告添加同行评审流程是简单的第一步。你团队中的一些人可能会对增加的工作量犹豫不决,但是你需要确保相应地分配时间。
- 开始做更多的连续交付。这将需要重新设定内部客户的期望,但我希望他们会欢迎在输出中有更多发言权的机会。
关于工具
我两年前加入的那家初创公司实际上一直在试图建立一种数据工具,以优先考虑这些数据操作原则。我们已经将 DevOps 原则应用于数据,如版本控制和自动化测试。此外,它的设计考虑到了分析师和非分析师,因此数据管道的所有部分都可以在不知道如何编码的情况下做出贡献(但如果您愿意,您可以这样做)。
我们在这一领域刚刚起步,正如您所看到的,还有很大的发展空间。如果你想一起来,你可以在这里了解更多:
组合、组织和可视化数据的最快方式。Count 是您和您的……
count.co](https://count.co?utm_medium=blog&utm_source=Medium&utm_campaign=cm&utm_content=de)
参考
[1] A. White,“我们的顶级数据和分析预测 2019 年”(2019),Gartner
[2] C. Bergh,“数据厨房中的数据操作 vs 开发操作—第 73 集”(2019),数据工程播客
[3] C. Caum,“连续交付与连续部署:有什么不同?(2013),puppet.com
我从贝叶斯推理招聘中学到的 4 件事

马尔科姆·莱特曼在 Unsplash 拍摄的照片
一步一步地演示如何使用贝叶斯定理来改善你的招聘过程。
R 最近,我写了一篇关于如何雇佣开发人员的文章,我以一个笔记开始,我预计几年后我会重温它。这是 51 天后的总数,我已经有所补充了。
我最近一直在思考贝叶斯推理,以及它如何应用于各种环境。它的力量在于,给定一个环境和一条新信息,你可以计算这条新信息有多重要。寻找新开发人员的过程正是遵循这种模式。起初你对他们一无所知,然后你收集更多的信息来帮助你做决定。
贝叶斯推理的飞行之旅
贝叶斯推理的核心思想如下:
- 你有一个基本概率。在这种情况下,不管你有什么关于他们的具体信息,一个申请人成为一个好的开发人员的基本几率是多少?即。如果你接受了第一个申请这份工作的人,那么这个人有多大的机会是好的?
- 然后,当你得到一个新的信息时,你会考虑它如何改变你的基线概率。在这种情况下,你的新信息可以是一份简历。通常人们会高估这些新信息的重要性,这也是下一步的切入点…
- 你要考虑假阳性和真阴性的概率。即。他们给你一份很棒的简历,但是一个糟糕的开发人员搞砸了一份好看的简历,或者一个好的开发人员不擅长自我推销,并且把它搞砸了,这种可能性有多大呢?
贝叶斯用数学公式表达了上述内容。

在惠普 Autonomy — mattbuck(类别)/CC BY-SA(https://creativecommons.org/licenses/by-sa/2.0)的办公室里,一个蓝色的霓虹灯招牌显示着贝叶斯定理的简单陈述
具体的计算我就不探究了,因为这是关于这个设置中的应用,其他地方很多地方都有涉及——像维基百科的。
市面上有一些方便的计算器——比如这个——可以省去“数学”工作。
贝叶斯推理如何工作,即使是主观数字
"如果我必须自己想出概率,那么这个公式给了我什么?"
的确,我们这里没有硬数字。在大多数情况下,你必须运用你对概率的主观看法。这个过程的力量在于将你的直觉和数学推理结合起来,产生比任何一种方法单独使用都更准确的东西。正如生活中的许多事情一样,诀窍不在于知道答案,而在于知道该问什么样的问题。贝叶斯推理提供了正确的问题。
贝叶斯推理在实践中
让我们假设你正试图招聘一个通用的职位“开发人员”。首先,你需要知道找到一个好的开发人员的几率——如果你是随机选择的话。根据你的位置、薪水等,你会有不同的答案。根据我的经验,我们看到的概率大约是 0.1。
接下来你收到他们的简历,看起来不错。你自己有一个假设。
这个人是一个好的开发人员,因为他们有一个好的简历。
但是等等,还有两个问题你需要问自己。首先,假设他们是一名优秀的开发人员,他们拥有这么好的简历的可能性有多大?我觉得大约是 0.75。第二,假设他们是一个糟糕的开发人员,他们有这么好的简历的可能性有多大?我倾向于 0.5 分——简历通常会误导人。
很好,你已经得到了所有你需要的信息,现在你可以把它代入等式了。当你这样做的时候,你会得到如下结果:0.144285。
你可能会对此感到惊讶,也可能不会。当你看到一份优秀的简历时,你很容易得出这个人会一直走下去的结论。贝叶斯告诉我们的是,他们成为你要找的人的可能性从随机的 10%上升到现在的 14%。不是一个很大的跳跃,但是正如你从上面看到的,你还没有得到太多关于他们的信息。
我们从中可以学到的主要一点是,你不应该花太多时间看简历。你永远也不会从 it 部门雇佣人,你只是略读一下,看看是否有什么东西把他们完全排除在外;一份好的或糟糕的简历不会使可能性从基线的 10%有很大的变化。除了彻底的灾难,你还需要收集更多的信息…
接下来我们进行电话采访。我从上一步得到我的基线。我目前看到的概率是 0.14。电话面试也很棒?继续假设 2。
这个人是一个很好的开发人员,因为他们进行了一次很好的电话面试。
好的,同上。假设他们很好,我会说他们有 0.8%的机会进行一次好的电话面试——允许有一点紧张的空间。假设他们不好,我给他们大约 0.4 的机会——他们可能会虚张声势,但我希望抓住他们。再次插入它,我们有一个新的数字:0.24561403508。
还是很低吧?我们有很棒的简历,很棒的电话面试,我们仍然只有 25%的信心他们是合适的人选。
接下来我们进入技术测试,或者说面对面面试的技术部分。我们现在开始例行公事了。他们做了很好的技术测试。假设 3。
这个人是一个好的开发人员,因为他们有一个很好的技术测试。
以我的经验来看,这是整个过程中最具启发性的部分。如果他们表现好,我会说有 0.8%的机会,但如果他们表现不好,我会说只有 0.2%的机会。这个很难唬住。基线是我们从电话采访中得到的 0.25。插上电源,砰:0.5742857142。
我们达到了 57%。好多了!现在形势对他们有利。尽管如此,他们仍有 43%的可能不会成功。有足够的空间犯下代价高昂的错误。
我们终于面对面了。再说说进展顺利吧。
这个人是一个好的开发者,因为他们面试得很好。
这很难。我知道有些人跳过了这个过程的其他部分,认为他们可以从这一步得到他们需要的一切。以我的经验来看,他们的招聘更多的是碰运气。我们在这里必须小心。这是我们无意识偏见最有可能影响我们判断的一步。关于面试如何在第一个 x 秒结束的理论比比皆是——这只是的一个例子——基于服装、肢体语言等等。我不是说第一印象不重要。例如,如果你正在招聘一名销售人员,这将是至关重要的。但重要的是要把它放在上下文中。
我要用和我的电话面试相似的权重。0.8 对 0.3。插上电源:0.80922803904。
81%
非常好。它不像我希望的那样自信。根据这些几率,你会认为五分之四的招聘是好的。
结论
通过这种方式,我学到了 4 条重要的经验。回想起来,它们现在看起来都很明显,但有时需要通过它来拼写出来。
- 贝叶斯推理非常清晰地向我们强调了一件事,即最能增强我们信心的事情是好的开发人员肯定会做对的事情,而坏的开发人员肯定会出错的事情——在这种情况下,你不太可能得到假肯定和真否定。如果你能想出一个符合描述的问题,你可以跳过整个面试过程,只问那个问题。这个问题必须能够捕捉到他们的理论/实践经验、他们的团队适应度和抱负。
- 另一点我们可以从这里学到的是,我们希望尽早带来那些精辟的问题。你越早调整胜算,你就越不可能在未来浪费时间。
- 不要在简历上花太多时间。你在略读,看看是否肯定不行。
- 我从中得出的最后一个见解是,如果你跳过了这些步骤中的任何一个,那么要么你很有可能找错了人,要么你在这个阶段遇到了一系列非常尖锐的问题。我总是建议至少做上面提到的几个阶段。你花了几天时间去认识新的人。现在多花几个小时面试——确保你雇佣了正确的人——可以节省你更多的入职时间。
祝一切顺利,
缺口
雇用数据科学家时要考虑的 4 件事

顶尖数据科学候选人每天都会收到许多机会选项。为了避免候选人被遗漏,你必须考虑这四件事。
作为一家人事代理机构,我们的专业之一是数据科学,我们知道在招聘数据科学人才时应该注意什么。
数据科学仍然是 2020 年技术领域的热门词汇之一,但让我们回到过去,看看这一切是从哪里开始的。
2012 年,《哈佛商业评论》( HBR)称,数据科学家是 21 世纪最性感的工作。近十年后,可以说它更加性感了。
LinkedIn 以 37%的年增长率将其列为 2020 年新兴工作的第三名。随着人工智能(AI)和大数据现在成为我们日常对话的一部分,无法想象数据科学消亡的世界。这是大家关注的重点。难怪这个角色登上了 Indeed.com 的“2020 年最佳角色”榜单。
所以我们知道需求是存在的,问题是:当招聘一名数据科学家时,你在寻找什么,你在和谁竞争?
数据科学家的预算应该是多少。
嗯,有几个因素会影响数据科学职位的预期薪资。正如你所料,最大的贡献者之一是他们的技能。本质上,他们如何实现投资回报?
数据科学的问题是没有足够的合格候选人来填补空缺职位(即使在经济困难时期)。在候选人驱动的市场中,很难找到精英数据科学家,而在雇主驱动的市场中,你可能会浪费几个小时来筛选不合格的简历,从而找到几份值得面试的。
有数百名候选人拥有这一头衔,但缺乏与之匹配的技能。2011 年,麦肯锡数字公司估计,到 2018 年,数据科学家将短缺约 14 万至 19 万人。他们是对的。2018 年,领英报告称,数据科学家短缺 151,717 人。
但这正是好消息的来源——当具备合适资格的申请人出现时,他们拥有更大的谈判能力。他们可以获得高薪和丰厚的福利。
在美国,大多数数据科学家(54%)至少拥有硕士学位,其中 23%拥有博士学位。他们通常有物理学、数学、统计学或工程学的背景。略占多数(57%)的数据科学家精通脚本和建模,而 43%的数据科学家更擅长生产和工程。
根据威斯康星大学的数据,截至 2019 年,数据科学家的基本工资中值为 13 万美元。对于有一到三年经验的一级科学家来说,他们的预期工资约为 95,000 美元,而经验丰富的专业人士和管理人员的工资可以从 146,000 美元到 257,000 美元不等。

图片由布列塔尼·福克斯拍摄
至于数据科学经理,根据经验水平的不同,工资中位数在 146,000 美元至 257,000 美元之间。
数据科学家最有收入潜力的州:

图片由布列塔尼·福克斯拍摄
至于福利,众所周知,IT 专业人员拥有一些最好的福利。因此,如果你从事 IT 行业,你已经进入了正确的行业。这些是数据科学家获得的一些最常见的好处:
- 远程工作
- 弹性工时
- 购股选择权
- 签证担保
- 通勤援助
- 无限带薪休假
数据科学家很难留住
像大多数 IT 职位一样,数据科学职位非常适合那些不断寻找新刺激的人。数据科学家往往会在一家公司工作一到三年后离开,然后去寻找更好的机会——更具体地说,是更高的薪水。
Big Cloud 进行的一项调查显示,数据科学家发现找新工作非常容易。他们通常愿意搬到任何地方,并期望加薪 11%至 20%。
这项研究还显示,拥有“数据科学家”头衔的受访者中,近一半(42%)对自己目前的职位不满意。所以问题来了,如何留住数据科学家,让他们不去找别的地方?
数据科学家寻找新机会的常见原因包括:
- 更好的工作/生活平衡。
- 从事有意义项目的机会。
- 职业发展机会。
- 更好的文化契合度。
能够向他们的数据科学团队提供上述内容的公司可能会击败统计数据。数据科学家寻找更好机会的另一个重要原因是缺乏公司内部的支持。通常,公司在没有完全理解其含义的情况下就对雇佣数据科学家感到兴奋。这可能会赶走合格的专业人员,他们(理所当然地)不愿意加入没有其他科学家、工程师或建筑师支持项目的公司。
这就是为什么公司必须对他们的人才需求有一个清晰的认识,以便能够留住他们。
寻找什么样的技能组合以及如何给它们定价。
主生产级编码
成为数据科学家的好处在于,根据行业和公司的不同,这个角色可能需要不同的专业知识。例如,一些数据科学家专注于分析数据和开发预测模型。然后,一些数据科学家专门研究模型的部署和集成。
大多数数据科学家属于第一类。然而,最近出现了对数据科学家的需求,他们知道如何做到这两者,并能编写生产级代码,即模块化、可读、经过测试和优化的代码。他们被称为“全栈”数据科学家,这个术语来自 web 开发世界,用来描述精通该领域所有领域的人。
如果你能向未来的雇主展示这种多才多艺,那就更容易谈成更高的薪水。
技术&技能
作为一名数据科学家,Python、R 和 SQL 应该已经是你的拿手好戏了。但是如果你想走得更远,增加一些可以提高你的价值。
让我们来谈谈数字——据《跳板》报道,像 Spark 和 Scala 这样的学习工具可以带来 1.5 万英镑的加薪。以下是一些影响数据科学薪酬的流行技能和工具:
技能:
- Apache Hadoop
- Hadoop
- 机器学习
- 大数据分析
- 数据挖掘
- 斯堪的纳维亚航空公司
工具:
- 张量流
- (舞台上由人扮的)静态画面
- 神谕
- 储备
- D3.js
- BigQuery
- Hadoop
- 朱皮特
- 亚马逊网络服务
- 蔚蓝的
拥有博士学位的候选人
如上所述,大多数数据科学家至少拥有硕士学位。2019 年的数据显示,拥有博士学位的数据科学家将比只有硕士学位的人多赚大约 11,000 美元——这是在所有经验水平上。
然而,对于数据科学经理来说,对于零到三年管理经验的新经理来说,获得博士学位只会产生 6K 美元的差异。
软技能——有效沟通他们的行话
理解数据是一回事,能够解释数据是完全不同的另一回事。作为一名数据科学家,很多工作都是技术性很强的。然而,他们直接团队之外的人不太可能理解他们的模型。这就是为什么他们必须有沟通技巧和商业头脑来与利益相关者讨论他们的发现。
如果你不能把数据转化成可以理解的东西,你总是会遇到障碍。说到底,如果没有人能够理解数据见解,那么这些数据见解又有多大帮助呢?
数据科学家想在哪里工作,为什么
确定具有竞争力的薪酬以吸引顶尖人才的最佳方式是,查看提供最具竞争力薪酬的行业和/或公司。在全球范围内,技术是对数据科学家需求最高的行业。
在美国,我们知道技术引领潮流,其次是教育/学术领域。
如果你想要顶尖的数据科学人才,重要的是要明白你正在与 IBM、亚马逊、微软和脸书等公司竞争,众所周知,这些公司为专注于数据的角色提供最好的福利和薪水。
总之,在你开始招聘的时候考虑这四件事会给你带来优势。你需要了解每个职位的市场价格,以准备可靠的报价。你还需要了解如何留住顶尖人才的心理学(我们提供了如何留住顶尖人才的指南)。最后,了解大多数数据科学家的工作目标会让你知道你能提供什么好处和服务。
关于 Python 函数你可能不知道的 4 件事
Python 函数远比你想象的有趣

来源:https://unsplash.com/photos/feXpdV001o4
Python 作为一种多范式编程语言,因其符合任何程序员风格的能力而备受喜爱,这无疑使它成为世界上最流行的编程语言之一。尽管函数的性质千变万化,但它仍然是语言必不可少的一部分,真正理解语言的这一部分对掌握语言本身大有帮助。这就是为什么在本文中,我将讨论 Python 函数的四个鲜为人知的方面,这将有望让您对 Python 的威力有新的认识,无论您是 Python 老手还是完全的新手。
1.反思你的功能
在编程上下文中,自省是检查您用更多代码编写的代码。这里要记住的关键是 Python 函数本质上是对象,这意味着它们有相关联的属性和方法,这些属性和方法可以给你关于函数本身的信息。这些属性中的大多数是在声明函数时创建的,但是您也可以在事后添加新的属性,就像您对任何其他对象所做的那样。
def example():
""" This is an example docstring
through which I can provide more information
about the function
""" print("Hello World")example.__doc__ #Returns the docstring attribute
example.__annotation__dir(example)#['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']# These are all the built-in function attributes
事实上,我们定义的任何函数都包含了大量的属性。要查看所有这些函数,只需将您的函数传递给 dir()函数(如上所示),就会返回所有可用方法和属性的数组。
一些有趣的属性如下:
- 功能。defaults:返回所有默认参数值的元组
- 功能。doc:返回文档字符串
- 功能。name:以字符串形式返回函数的名称
- 功能。globals:返回一个字典,其中包含函数可以访问的所有全局变量
- 功能。code:返回 code 对象,该对象本身具有各种参数,与函数中的实际代码相关(使用 dir()函数来检查该对象的所有相关方法和属性)。
用函数自省可以做的事情还有很多,我无法用一篇文章的篇幅来介绍,所以一定要打开你的 IDE,开始深入研究你自己的函数!
2.函数类型注释
Python 的灵活性部分来自于它作为动态类型编程语言的本质,在函数的上下文中,这意味着您可以传入任何类型的参数(字符串、整数、数组、布尔值),并且错误只会在运行时出现(例如,如果您试图将字符串添加到函数中的数组,此时您的程序将会抛出一个 TypeErrror)。
这是一种更灵活的编程方法,因为在静态类型的语言中,如 Java 和 C++,函数参数的类型必须预先确定,并且事后不能更改。这使得编程更加严格,需要更多的远见,但它有利于在运行时消除错误,并节省运行时错误检查的性能成本。
然而,一些 Python 程序员选择使用函数注释,通过为所有函数输入和输出提供建议的类型,来帮助 Python 表现得更像静态类型语言(尽管代码仍然是动态类型的)。例如:
def a_function(a: 'Int', b: 'String') -> "Repeats a String":
return a * b# The annotations inside the brackets indicate what type each argument should be. (Notice the use of colons, as opposed to the equals signs, as in the case of argument defaults)# The annotation after the function indicates the type of the return valuea_function.__annotations__#{'a': 'Int', 'b': 'String', 'return': 'Repeats a String'}
# Returns a dictionary of all the associated annotations
通过使用注释,您仍然可以将不正确的数据类型传递给函数,但是您至少可以得到正确类型的指示,从而减少用户出错的机会。您还可以通过在函数上运行 help()函数来访问这些注释,或者等效地,使用 Jupyter 笔记本中的 Shift + Tab 快捷键,它会返回文档字符串、注释和其他函数信息。
3.Args,Kwargs,参数排序和可迭代解包
在解释*args 和**kwargs 的值和用法之前,我需要先解释一下 Python 中打包和解包的概念。
假设我们有一个值数组,我们希望将每个值存储到单独的变量中。我们可以这样写:
a, b, c = [1,2,3]#a = 1
#b = 2
#c = 3
然而,当数组的长度未知时,这个操作变得更加棘手,因为我们不知道需要多少个独立的变量。此外,我们可能希望将第一个值存储为单个变量,但将其余的值保存在一个新数组中。这就是 Python 中解包功能的来源。使用' * '符号,我们可以将剩余的值存储在一个数组中,如下所示:
a, *b = [1,2,3,4,5,6]# a = 1
# b = [2,3,4,5,6]
星号基本上是说:“取任何尚未赋值的值,并将其存储到一个变量中”。这种技术适用于任何可迭代对象,但在函数中打包参数的情况下尤其有用。它允许我们拥有不确定数量的位置和关键字参数,然后我们可以在函数表达式中索引/迭代这些参数。例如:
def my_func(*args, **kwargs):
sum(args) # Note that although it is convention to use the variable names args and kwargs, you can name the variables whatever you'd like
请注意,当谈到函数参数时,我们必须按照特定的顺序放置参数:
- 位置参数
- *参数
- 关键字参数
-
- *克瓦查
这意味着,在我们将 a *args 放入函数参数之后,后面的参数将被自动视为关键字参数。另一个例子很好地说明了这一点:
def myfunc(a, b, *args, kw, **kwargs):
print(args)
print(kwargs)myfunc(1, 2, 3, 4, 5, kw = 6, kw2 = 7, kw3 = 8)# (3, 4, 5)
# {'kw2': 7, 'kw3': 8}
如您所见,所有在前两个位置参数(a 和 b)之后但在第一个关键字参数(kw)之前的位置参数将存储在一个元组中,该元组可以作为变量“args”引用。*args 参数实际上用尽了所有剩余的位置参数。同样,kw 之后的所有关键字参数都将存储在一个字典中,可以用变量“kwargs”引用该字典。
*Args 和**Kwargs 在您不确定一个函数将接受多少个参数作为输入的情况下非常有用,并且允许您在用 Python 编写函数时更加灵活。
4.利用 Lambda 表达式
Lambda 函数是 Python 对匿名函数的实现。如果您不熟悉这个概念,匿名函数本质上是普通函数的单一使用版本,没有名称,通常用于传递给更高阶的函数。
创建 lambda 函数的语法如下:
lambda [parameters]: expression#for example:lambda x: x + 3# Takes a value x, and returns x + 3
lambda 关键字表示您正在创建一个内联函数。然后,向 lambda 函数提供参数,类似于在函数定义的括号中提供的内容。最后,在冒号之后,编写表达式本身,在调用 lambda 函数时对其求值。
lambda 函数的一个很好的用例是在 map 或 filter 中,因为它有助于编写高度 Pythonic 化和紧凑的代码。例如,如果我们要过滤数组中大于 10 的值:
arr = [1,3,6,2,13,15,17]list(filter(arr, lambda x: x > 10))# the above function will return a new list where the array values are greater than 10
这就是我所说的将函数传递给高阶函数的意思,因为这里我们将 lambda 函数传递给 filter()函数,后者将 iterable 和函数作为位置参数。
实际上,您也可以使用 lambda 函数创建一个常规函数,只需将它赋给一个变量名。该函数现在可以像任何其他函数一样被重用和调用。
我希望你能从这篇文章中学到一些新的东西,如果你对我写的东西有任何问题,欢迎在下面发表评论!
如何在你的第一份数据分析师工作中提升的 4 个技巧
这是一个令人害怕又令人兴奋的新世界,但是这些建议将帮助你踏上成功之路。

由 Adobe Stock 通过 epiduare 授权
如果你正在读这篇文章,那么恭喜你。你阅读了所有关于如何学习 SQL、Python、R 等的中级文章。数据分析世界的注意事项,现在你得到了你的第一份数据分析工作。
这是通过大量艰苦工作和耐心取得的巨大成就,但现在你需要利用一套不同的技能来加速并充分利用这个新机会,克服我们在进入一个新的未知空间时都会感觉到的冒名顶替综合症。
这里有四个快速提升新工作的小贴士。
1.开始和工作中的人联系
当我开始我的第一份数据分析师工作时,我感到非常幸运,因为我的老板没有把我扔在没有游泳池浮动的深水区,而是给我安排了第一个任务,与公司内的关键人物会面。这让我一开始就接触到了所有合适的人。如果我有关于如何连接到特定数据源的最简单的问题,或者什么是连接两个表的最佳方式,我已经有了一个起点。
如果你的老板没有给你分配和某些人联系的任务,问问他们你应该在第一天和哪些人联系。如果你需要更明确的表达,请询问以下类型的人:
- 曾经使用过许多与您将要使用的表和数据库相同或相似的表和数据库的分析师。
- 熟悉如何构建模式和表的工程师。
- 一名出色地交付报告、仪表板和其他文档的员工。
- 众所周知,员工在公司内人脉很广或非常合群。
与这些人建立关系网将有助于你回答开始新工作时可能会遇到的许多问题。从最佳实践、系统权限和设置,以及如何进一步与能够提供帮助的其他人联系,无所不包。
当我开始这些会议时,我会保持简短,最多 30 分钟。我首先简单介绍一下我是什么时候开始的,我的角色包括什么,然后我请他们分享他们的角色,以及你如何帮助他们完成他们的工作。这就形成了一种相互理解,即尽管你是新来的,但你愿意尽可能地提供帮助和分享信息。这对在工作场所建立牢固的关系大有帮助。
2.了解你的客户
我所说的顾客,并不是指你公司的销售对象。你的客户是你必须向其交付产品或服务的任何人。每月向副总裁汇报 KPI?副总裁是你的客户。
了解你的客户在任何工作中都是至关重要的。您的成功取决于您向客户交付产品的质量。
你的客户可能是你的老板,也可能是其他部门的人。例如,我必须计算我们团队的支出,并在每个月初提交给会计部门,以便他们计算他们的应计费用。因此,我看到他们,把他们当作我的顾客。我确保了解他们想要什么,如何想要,以及何时想要。我尽我所能让我的顾客满意。
尽早识别和联系你的客户是很重要的。在开始的时候,你可能看不出你的团队之外还有其他客户,但是由于你对数据的访问和接近,你最终会有一些你必须支持的辅助任务。最好提前认识到这些客户和任务,这样当您计划工作负载时,就可以将与交付给所有客户相关的时间考虑在内。
3.了解你的行业
知道如何访问和解释数据是数据分析师的第一步。充分利用你所掌握的数据来了解这个行业,以及是什么让它前进是你的下一步。是的,你的经理和团队会帮助你快速了解这家公司,他们的收入模式等等。这取决于你去深入挖掘,找出所使用的行业标准,什么是可以影响你的行业的市场因素,管理你的公司活动的法律和法规。
如果你在一家上市公司工作,最好的第一步是查看公司的年度和季度文件,也就是 10-K 和 10-Q。这里有一个谷歌 2019 款 10-K 的例子。需要逐字读吗?不,但你应该阅读第一部分的大部分内容,以更好地理解你公司的目标和风险,阅读财务数据会让你对你所在行业的重要指标有一个很好的了解。
如果你的公司没有上市,尽量找一个相关的已经上市的公司。例如,Squarespace 不是上市公司,但他们的竞争对手 Wix 是。您可以查看 Wix 的 10-K,了解哪些指标对行业很重要。
了解这些信息对于您如何执行分析以及如何展示您的发现至关重要。如果你能把你的发现以一种真正考虑到你的公司、行业和市场的方式联系起来,这将是一个巨大的增值。
4.写一份计划来提升你的技能
我的第一份数据分析师工作是通过学习 SQL 并从我能找到的任何与 SQL 相关的小工作中获得经验。得到这份工作是巨大的第一步,但还有更多的步骤要走。如果你想成为一名数据分析师,那么你需要制定一个路线图,告诉你下一步该学什么,以及如何应用你所学的知识。为了获得最好的结果,花几个月的时间在工作上,并记下事情如何改进。有没有可以自动化的报告?您是否经常收到可以转变为自助仪表盘的请求?如果有人来要求你证明你的工作,你所有的数据来源的完整性和准确性能得到验证吗?看看现在什么与你的工作相关,然后在此基础上制定一个学习计划来帮助满足这些需求或满足这些需求。
你的工作不会随着你的日复一日而结束,你需要继续学习、应用和成长,以摆脱骗子综合症的感觉。如果 SQL 是你到目前为止唯一学到的东西,下面是一些接下来要解决的主题的想法:
- 使用 Python 进行分析/统计建模(学习熊猫和 NumPy 库)
- Tableau 和 Looker 等数据可视化工具
- 使用 MatPlotLib 和 Seaborne 的 Python 数据可视化脚本
- 机器学习入门课程
- 当地社区大学的应用统计学课程
以下是我目前正在参加的 Udacity 课程,旨在进一步提高我在数据分析方面的知识和技能,并进一步增强我现有的技能(下面的链接是一个附属链接,如果你报名参加课程,我可能会得到报酬):
[## 在线数据分析师课程| Udacity | Udacity
纳米学位计划与下载教学大纲的先决知识,你应该有工作经验…
www.jdoqocy.com](https://www.jdoqocy.com/click-100010396-13953679)
第一步总是最难的,现在你已经翻过了第一座山。你有知识和经验去走得更远,没有什么可以阻挡你。不断学习,不断成长。祝你一切顺利!
快乐学习。
如果你觉得这篇文章很有帮助,并且正在寻找更多类似的建议,那么考虑在这里注册我的每月简讯。
增强数据科学项目演示的 4 个技巧
赢得数据科学面试

之前读大学的时候,我是那么想进入数据科学领域。
我继续学习大量的统计学,希望能在数据科学面试中胜出。
但是,我一直失败。
在那之后,我花了一些时间,试图回忆是否有大多数招聘经理都在寻找的共同领域。
我发现我实际上没有一个好的数据科学项目可以展示。
因此,我花了一些时间,试图设计一个数据科学项目,并认为这次我会成功。
然而,我还是失败了。因为我没有注意到项目的一些细节。
在一次又一次地改进我的项目后,我终于设法获得了一份数据科学实习。
在本文中,我将向您介绍我所做的一些改进,这些改进带来了一个数据科学实习机会。
1.理解你的机器学习模型
你可能认为实现一些奇特的模型会增加你赢得面试的机会。事实上,如果不真正理解你的模型,它实际上会伤害你。
例如,你实现了一个非常复杂的深度学习模型。然而,你知道它为什么工作。你只是从 GitHub 上克隆了别人的作品,得到了很高的准确率分数。
然后,当面试官要求你解释你实现的模型,或者在哪种场景下,你的模型不会很好地工作时,你会愣住,然后离开面试。
以下是我想分享的信息。
你需要准备一些招聘经理会问你的关于模特的问题。如果你没有太多时间准备数据科学面试,但至少要确保你清楚地理解了你所使用的模型。
下面是一些你可以准备的问题的例子。
- 有没有什么基准业绩可以比较?
- 在什么情况下你的模型不能给出准确的结果?
- 如果你有更多的时间,你会对你的模型做什么样的改进?
您可以将此作为演示幻灯片或您将要演示的 markdown 文件中的旁注。两种方式都可以!
2.保持你的分析简洁
当你在做项目时,总会有一些你感兴趣的见解。你将花一些时间,绘制不同种类的图表,并希望给招聘经理留下深刻印象。
绘制一些图表是很棒的。然而,一定要画出一些重要的图表。例如,绘制一些与您的结果或模型的特征相关的图表,或者您的训练示例中每个类别的分布。
有一点要注意的是,也要为你的情节或分析准备一个故事。
例如,不要只是说,五月的销售高峰。相反,你可以说,在 5 月份,每个渠道的销售转换率都要高得多,因此会导致销售激增。
当你发现一些有趣的发现时,花点时间去找出背后的原因。
3.解释你为什么选择这些功能
特征对我们的机器学习模型极其重要。有了正确的特征,您就可以在不使用复杂模型的情况下获得出色的准确性。
会有各种各样的功能供你选择。解释选择可用特征子集的潜在原因将表明你知道特征提取在机器学习中的重要性。换句话说,你不是随机输入,然后把它们扔给模型。
此外,您可能希望包括选择正确功能的过程。例如,你试图预测房价。你正在考虑使用的特征包括,到最近的公共交通站的最小距离,卧室的数量,房子的大小等等。
假设您发现到最近的运输站的最小距离并不是一个重要的特性。它损害了你的模型的性能。请务必在您的数据科学项目报告中包括这一点。数据科学不仅仅是最终结果,有时,寻找解决方案的过程才是最重要的。
4.准备 Powerpoint 幻灯片和 Jupyter 笔记本
你可能会问,为什么我们两个都要准备?
我没有时间两者都准备好,我想向面试官展示代码就足够了?
这实际上取决于你的情况。对我来说,两者兼得更好。例如,当你使用 PowerPoint 幻灯片演示时,面试官想知道你是如何处理数据的,出于某种原因,你没有将这些信息放在演示幻灯片上。
如果你已经准备了你的代码和注释,你就可以当场展示给他或她看。
另一种情况是,你只准备 Jupyter 笔记本,并期望向面试官逐行解释代码。根据我的经验,这不是一个好的表达方式。面试官只是想知道你是如何解决问题的,因此,用 PowerPoint 总结你的思维过程会是一个更好的主意。
因此,我的建议是使用 PowerPoint 作为主要的演示材料。同时,准备好你干净整洁的 jupyter 笔记本作为辅助材料。
最终想法

拥有一个出色的数据科学项目来展示无疑是从其他候选人中脱颖而出的最重要因素之一。
在准备项目的过程中,你会发现有很多工作需要投入。虽然你已经付出了很多努力,但不要忽略一些重要的细节,因为这可能会毁了你的演示。
所有这些建议都是根据我的经验提供的。如果您有任何问题或其他不同的想法,请随时评论!
谢谢你一直读到最后,下期帖子再见!
关于作者
Low 魏宏是 Shopee 的数据科学家。他的经验更多地涉及抓取网站,创建数据管道,以及实施机器学习模型来解决业务问题。
他提供爬行服务,可以为你提供你需要的准确和干净的数据。你可以访问这个网站查看他的作品集,也可以联系他获取的抓取服务。
在媒体上阅读低纬鸿的作品。数据科学家|网络抓取服务:https://www.thedataknight.com/.每…
medium.com](https://medium.com/@lowweihong?source=post_page-----6bef8cb1477a----------------------)
加速数据科学写作的 4 个工具
用这四个工具实现你的写作目标

我在 Medium 上写数据科学已经两年多了。写作,尤其是技术写作可能很费时间。你不仅需要想出一个主意,写好,编辑你的文章的准确性和流动性,并进行校对。对于技术文章,你通常还需要编写代码来说明你的解释,确保它是准确的,并将代码从你用来编写它的工具转移到你的文章中。
我试着一周发表一两次。当我第一次开始写作时,我发现这个过程非常耗时,而且很难在一份全职工作中保持这个时间表。
随着时间的推移,我发现一些工具大大加快了我创作和发表文章的时间。尤其是包含编码示例的那些。以下工具帮助我实现了每周围绕我的其他生活承诺发表一到两篇文章的目标。
1.Jupyter 到 Medium
在 jupyter_to_medium 的帮助下,直接从您的笔记本中将 Jupyter 笔记本发布为中型博客文章。你……
pypi.org](https://pypi.org/project/jupyter-to-medium/)
这个工具今年 5 月才由 Ted Petrou 发布,但是如果你在 Jupyter 笔记本上写代码,它将会改变游戏规则。使用这个 Python 包,您可以将笔记本的全部内容作为博客文章直接发布到您的 Medium 帐户中。
要使用这个工具,首先您需要将它 pip 安装到您的项目环境中。
pip install jupyter_to_medium
您可能还需要在启动笔记本的环境中安装此扩展。
jupyter bundlerextension enable --py jupyter_to_medium._bundler --sys-prefix
安装完成后,当你打开 Jupyter 笔记本并导航到文件> >部署为时,你会发现一个选项来部署为中型文章。

当你选择这个选项时,你会看到一个表格。在顶部,它要求一个集成令牌。如果您是 Medium 上的常规作者,您可以在 Medium 帐户的设置中访问此内容。如果您的设置中没有令牌,您需要通过此电子邮件地址 yourfriends@medium.com 联系 Medium 申请一个令牌。
根据我的经验,你会很快得到回复,通常在 1 到 2 天内。
您可以每次都将您的集成令牌粘贴到该表单中,或者为了避免重复访问,您可以将令牌保存为一个文件和目录,并以下面的方式进行标记.jupyter_to_medium/integration_token。

Jupyter to Medium 将以文本形式发布您的降价信息,以代码块形式发布代码,并以草稿形式直接将图像发布到 Medium。我发现你通常只需要做最少的编辑就可以发表一篇博文。
2.Github Gists
此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…
gist.github.com](https://gist.github.com/)
Github 有一个名为 Github Gists 的工具,可以让你轻松地将代码片段直接嵌入到你的博客文章中。在您的文章中使用 Gists 而不是代码块的好处是,它们可以更好地保留代码的格式,它们可以提升您的 Github 帐户,并且读者可以更容易地访问您的代码,亲自尝试这些示例。
你需要一个 Github 帐户来创建一个 Gist。一旦你有一个简单的导航到 Gists 页面在gist.github.com。创建一个要点非常简单,只要给它一个名字,粘贴你的代码,点击发布。发布后,您将看到此页面。要将要点嵌入到你的文章中,只需将网址编码在“嵌入”下面,然后粘贴到你的文章中。

代码显示在您的媒体文章中,如下所示。
3.Jovian.ml
[## Jovian:所有数据科学项目的平台——Jovian 文档
对于你的数据科学项目、Jupyter 笔记本、机器学习模型、实验等等,Jovian.ml 是一个更好的地方
jovian.ml](https://jovian.ml/docs/index.html)
Jovian.ml 是一个在线托管 Jupyter 笔记本的工具,对于从您的本地环境外部共享分析非常有用。Jovian 最近发布了一项功能,可以将整个笔记本、代码片段、单元格输出和 markdown 直接嵌入到你的中型帖子中。
要开始使用 Jovian,你需要在 jovian.ml 上创建一个账户。免费层给你无限的公共项目,这是理想的,如果你使用它来分享通过一个中型博客。然后,您需要将 pip 安装到本地环境中。
[p](https://www.jovian.ml/)ip install jovian
要将本地 Jupyter 笔记本上传到您的在线 Jovian 帐户,只需在您的笔记本中运行以下命令。
import jovian
jovian.commit()
这将提示您输入一个 API 密钥,您可以在您的帐户中找到它。

在单元格中嵌入特定的代码片段。导航到您已上传到您的在线帐户的笔记本和包含您要共享的代码的单元格。点击嵌入单元格。

这将给你一个链接,你可以粘贴到你的媒体文章。

这将显示如下。
4.语法上
加入数百万作家的社区。Grammarly 受到学生、专业作家、商业人士的信任…
app.grammarly.com](https://app.grammarly.com/)
Grammarly 是一个相当知名的应用程序,它可以检查你的内容中的拼写错误、语法错误,甚至是你文本的情感。虽然这是一个显而易见的写作工具,但我花了一段时间才开始使用它,而且它对我的文章的编辑时间产生了如此大的影响,所以我认为它值得在这里分享。
Grammarly 可以作为浏览器扩展安装,本地作为桌面应用或移动应用。为了最大限度地利用我的时间,我在许多不同的环境中写作,所以如果我离线写作,在我的浏览器中安装语法是有用的,如果我在移动中写作,则在我的浏览器中安装语法。
如果你对关于数据科学写作的文章感兴趣,你可能会发现我以前写的关于这个主题的文章也很有用。
撰写数据科学(或任何其他主题)的顶级技巧
towardsdatascience.com](/how-i-write-a-data-science-blog-62e4108fe478) [## 我为什么写数据科学博客
写博客加速了我在数据科学方面的学习,原因如下
towardsdatascience.com](/why-i-write-a-data-science-blog-7726c3c7d3d9)
感谢阅读!
我每月都会发一份简讯,如果你想加入,请点击此链接注册。期待成为您学习旅程的一部分!
将在 2020–2021 年扰乱您的数据和分析战略的 4 种趋势
持续智能、数据操作、数据民主化和数据网状化是我最近观察到的数据分析的四大趋势。所有这些都可能在 2020-21 年与你的业务相关,不是因为它们是“最新的东西”,而是因为有三种主要的潜在力量推动这些趋势向前发展。他们会以这样或那样的方式来找你。

Analytics &数据战略:三种力量,数据需求、数据增长和复杂性增长伴随着四种趋势。图片由作者提供。
在这篇文章中,我将解释:
- 定义未来十年分析策略的三大力量是什么。
- 这三种力量目前形成的四种趋势是什么,将在 2020-21 年相关。
- 趋势是什么在有些细节有资源链接,比我能更好地解释它们。
让我们来了解一下会扰乱您的分析策略的三种力量和四种趋势!
趋势概述
我一次又一次地偶然发现了四个趋势,我相信它们将在 2020-21 年与分析领域的几乎所有人相关。这四个趋势是
- 数据网格:数据不是副产品,而是实际产品。生产团队的所有权。 ThoughtWorks 推出的一个概念。
- 数据民主化:公司中的每个人都可以访问大量数据,包括非技术员工,例如 AirBnB(采用率接近 50%)。
- 持续智能:通过机器学习和大量持续数据摄取&处理进行自动近实时决策支持&。
- DataOps :专注于通过数据传递价值,并将现在常见的软件工程实践,如持续集成(CI) &持续交付(CD)等引入数据管道。
但是为什么这四个趋势会变得如此重要呢?我觉得会的,因为有三股主要力量在推动这些趋势。
推动这些趋势的潜在力量
据我所知,推动这些趋势的潜在力量将在未来 10 年内继续发展。这就是我相信这些趋势还将持续相当长一段时间的原因。
不断增长的数据需求:随着机器学习者、数据科学家和其他人发现越来越多的应用,对作为产品的数据的需求正在飙升。4 年前,几乎任何公司的数据科学家和机器学习工程师都很乐意将数据作为副产品,从他们能找到的任何地方提取出来。现在,越来越多的公司拥有 100 多名数据科学家&机器学习工程师,他们都需要适当的数据。公共 API 的使用正在爆炸式增长。出于数据科学目的的公共和公司内部数据集也是如此。
不断增长的海量数据:可用数据以及数据采集设备的数量正在飞速增长,而且似乎每三年翻一番。

(来源:数据时代 2025,https://www . Forbes . com/sites/tomcoughlin/2018/11/27/175-zetta bytes-by-2025/# 7f 03 b 9085459)
市场越来越复杂:我确实相信,市场和我们所处的竞争环境会变得越来越复杂。例如,在本书“Edge:价值驱动的数字化转型”中给出了定性原因。我也相信知识的增长与世界的复杂性相关,因此学术论文的指数增长可能是另一个观察复杂性增长的好点。

(来源:金哈,Arif。(2010).5000 万篇:对现存学术文章数量的估计。学过出版。23.258–263.10.1087/20100308.)
所有这些力量本质上为掌握处理数据并将其转化为决策和行动的公司带来了巨大的竞争优势。让我们来详细探讨有助于建立这种竞争优势的四种趋势。
趋势 1:持续的详细情报
持续智能是现在存在的一种可能性,以前是不存在的。
使从数据到决策的循环成为可能&行动是连续的,而不是“一次性的”!
事实证明,一个在Amazon.com上向你展示产品推荐的基本“推荐引擎”可以对用户行为的变化或 A/B 测试的结果做出极快的反应。这些推荐引擎已经完成了从数据到行动的循环,形成了一个连续的流程。
但是这种技术,在变体中,可以应用于几乎任何类型的动作和任何类型的数据。它可能以其他形式出现,如“决策支持”或统计,但它确实存在。
在其他公司,这种循环只是一次性的线性事情,但在一些公司,这已经变成了巨大的竞争优势。比如搜索中的 Google,推荐中的 Amazon,二手车定价中的 wirkaufendeinauto.de 等等。
智能循环是将行动产生的原始数据再次转化为新的决策和行动的方式。思想作品是这样描述的:

#1 如何应对这一趋势:将你的公司置于智能成熟度模型之上。然后花一分钟思考一下你所在行业的其他公司在这个领域可能处于什么位置。这真的决定了你是在追赶,还是能够获得竞争优势。

#2 不评价这个趋势的理由:我觉得没有不评价这个趋势的理由。持续智能已经应用于您不会想到的行业、医院、工业组织,以优化机器吞吐量并发现错误或损坏机器,以及整个行业。如上所述,数据呈指数级增长,随之而来的是其他公司破坏您的数据的机会。不过,我确实认为贵公司的时间框架取决于你们的竞争环境以及你们的内部情况。
#3 首先考虑其他趋势的理由:如果你没有投入任何努力使数据在你的公司可用,不要认为自己是数据驱动或数据启发的,那么你可能要首先考虑其他趋势。
#4 其他资源: ThoughtWorks 提供了关于这个主题的大量资源,很好地解释了机器学习连续循环是如何工作的,以及决策支持是如何工作的:
- ThoughtWorks 智能企业系列第 1 部分。
- 智造企业系列第二部。
- ThoughtWorks 智能企业系列第三部分。
趋势 2:详细数据操作
数据操作是一种趋势的名称,现在已经有了适当的形式。这是将产品和价值观点以及软件工程的最佳实践整合到通常的数据工作中的趋势。
这一趋势是由数据操作宣言、数据厨房、数据砖块和数据砖块推动的。
DataOps 意味着我们应用 DevOps 思维,结合精益制造的常用方法和敏捷思维来处理数据。主要模型包括下面描述的数据和想法管道的想法:

(来源:(https://medium . com/data-ops/data ops-is-not-just-devo PS-for-data-6e 03083157 b 7)
#1 为什么这一点现在如此重要?这三种力量都在挤压数据&分析部门专注于在快速变化的环境中提供价值。实际上,dataOps 只是将需要做的事情整理成文,以获得正确的关注。
#1 评估这一趋势的理由:如果你的公司&你的竞争环境变得越来越复杂,你的数据世界也会随之而来。
评估这一趋势的第二个理由:如果你的数据分析团队正努力在像 SCRUM 这样的敏捷框架中工作,因为他们应该这样做。如果你没有产品经理负责你的分析数据团队,因为你应该有。
#3 进一步的资源:这种趋势还没有形成系统,但是一些信息是可用的,比如宣言和一些博客帖子。这是其中的两个:
数据民主化的细节
数据民主化用一句话来说就是“把数据访问权给所有人”。Airbnb、Zynga、易贝和脸书等公司多年来一直在积极实践数据民主化。这些公司有很多陷阱,也有很多值得我们学习的地方,这就是为什么我已经写了这些:

(资料来源:我在一篇关于数据民主化的文章中写的)
#1 为什么这一点现在如此重要?世界变得越来越复杂,这意味着决策实际上需要更多的数据。没有它,在一个日益复杂的世界里,另一种决策方式——直觉——迟早会失灵。不断增长的数据量实际上意味着有更多的数据你必须给人们访问。
#2 评价这种趋势的理由:你们公司有多少人可以接触到数据?30%或更少?那么你肯定低于采取行动的门槛(行业平均水平在 30-40%之间)。
#3 不评估这一趋势的理由:您有大型自助分析设置?直接 SQL 访问或贵公司大多数人可比拟的东西?那就没有理由去深究这个趋势了。
#4 资源:
详细数据网格
DDD,微服务在过去的十年里改变了我们开发软件的方式。然而,分析部门的数据却赶不上这一速度。为了在采用现代开发方法的公司中加快基于数据的决策制定,分析软件团队需要改变。
(1)软件团队必须将数据视为产品,他们为其他所有人服务,包括分析团队
(2)分析团队必须以此为基础,停止囤积数据,转而按需获取数据
(3)分析团队必须开始将他们的数据湖/数据仓库也视为数据产品。
数据网格可能看起来像这样:

(来源:z . Dehghani:https://Martin fowler . com/articles/data-monolith-to-mesh . html)
#1 考虑构建数据网格的理由:复杂的领域、庞大的组织结构、大量的数据以及不断增长的内部数据需求都是考虑这一趋势的好理由。
#2 不考虑数据网格的理由:如果你觉得你的领域仍然很简单,很容易由一个分析部门来管理,那么我看不出有什么理由要转向数据网格。正如微服务一样,数据网格是灵活性(通过数据网格获得)和复杂性(通过数据网格增长)之间的权衡。如果复杂的成本不值得,保持一个中心的方法。**
#3 资源:基于数据网格的资源基础在不断增长,我想在这里强调三个。
- 来自 ThoughtWorks 的 Z. Dehghani 的原始数据网格文章。
- 一个更实用的版本我就这个题目写了。
- Zalando 网络研讨会解释了他们与 ThoughtWorks 一起实施的数据网格版本。
- Zalando 解释了他们的数据网格版本。
就是这样!
我希望听到一些关于我可能错过的其他趋势的反馈,你认为这三种力量如何推动未来的分析策略。
您应该知道的用 Pandas read_csv()解析日期列的 4 个技巧
一些最有用的熊猫把戏

布莱斯·巴克在 Unsplash 上拍摄的照片
导入数据是任何数据科学项目的第一步。通常,您会处理 CSV 文件中的数据,并在一开始就遇到问题。
在这些问题中,解析日期列是最常见的。在本文中,我们将讨论以下最常见的解析日期列问题:
- 从 CSV 文件中读取日期列
- 日首格式(日/月、日/月或日-月)
- 将多个列组合成一个日期时间
- 自定义日期解析器
请查看我的 Github repo 获取源代码。
1.从 CSV 文件中读取日期列
默认情况下,从 CSV 文件加载数据时,日期列表示为对象。
例如 data_1.csv
date,product,price
1/1/2019,A,10
1/2/2020,B,20
1/3/1998,C,30
使用默认的read_csv()将 日期 列读取为对象数据类型:
df = **pd.read_csv('data/data_1.csv')**
df.info()RangeIndex: 3 entries, 0 to 2
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
**0 date 3 non-null object**
1 product 3 non-null object
2 price 3 non-null int64
dtypes: int64(1), object(2)
memory usage: 200.0+ bytes
为了正确读取 日期 列,我们可以使用参数parse_dates来指定日期列的列表。
df = pd.read_csv('data/data_3.csv', **parse_dates=['date']**)
df.info()RangeIndex: 3 entries, 0 to 2
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
**0 date 3 non-null datetime64[ns]**
1 product 3 non-null object
2 price 3 non-null int64
dtypes: datetime64[ns](1), int64(1), object(1)
memory usage: 200.0+ bytes
现在,数据帧应该看起来像这样:

2.日首格式(日/月、日/月或日-月)
默认情况下,parse_dates参数会先读取月( MM/DD 、 MM DD、或 MM-DD )格式的日期数据,这种安排在美国是比较独特的。
在世界上大多数其他地方,首先写的是日期( DD/MM 、 DD MM 或 DD-MM )。如果你想让熊猫先考虑日子而不是月份,你可以将参数dayfirst设置为True。
pd.read_csv('data/data_1.csv',
parse_dates=['date'],
**dayfirst=True**)

或者,您可以定制一个日期解析器来处理第一天的格式。请查看" 4 中的解决方案。定制日期解析器”。
3.将多个列组合成一个日期时间
有时日期被拆分成多列,例如, 年 , 月 ,以及 日
year,month,day,product,price
2019,1,1,A,10
2019,1,2,B,20
2019,1,3,C,30
2019,1,4,D,40
为了将它们组合成一个日期时间,我们可以将一个嵌套列表传递给parse_dates。
df = pd.read_csv('data/data_4.csv',
**parse_dates=[['year', 'month', 'day']]**)
df.info()RangeIndex: 4 entries, 0 to 3
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
**0 year_month_day 4 non-null datetime64[ns]**
1 product 4 non-null object
2 price 4 non-null int64
dtypes: datetime64[ns](1), int64(1), object(1)
memory usage: 224.0+ bytes
注意,列名year _ month _ day是自动生成的。为了指定一个定制的列名,我们可以传递一个字典来代替。
df = pd.read_csv('data/data_4.csv',
parse_dates=**{ 'date': ['year', 'month', 'day'] }**)
df.info()RangeIndex: 4 entries, 0 to 3
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
**0 date 4 non-null datetime64[ns]**
1 product 4 non-null object
2 price 4 non-null int64
dtypes: datetime64[ns](1), int64(1), object(1)
memory usage: 224.0+ bytes
4.自定义日期解析器
默认情况下,使用来自dateutil.parser.parse的 Pandas 内置解析器解析日期列。有时,您可能需要编写自己的解析器来支持不同的日期格式,例如, YYYY-DD-MM HH:MM:SS :
date,product,price
2016-6-10 20:30:0,A,10
2016-7-1 19:45:30,B,20
2013-10-12 4:5:1,C,20
最简单的方法是编写一个 lambda 函数,它可以读取这种格式的数据,并将 lambda 函数传递给参数date_parser。
from datetime import datetimecustom_date_parser = lambda x: datetime.strptime(x, "**%Y-%d-%m %H:%M:%S**")df = pd.read_csv('data/data_6.csv',
parse_dates=['date'],
**date_parser=custom_date_parser**)
df.info()RangeIndex: 3 entries, 0 to 2
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
**0 date 3 non-null datetime64[ns]**
1 product 3 non-null object
2 price 3 non-null int64
dtypes: datetime64[ns](1), int64(1), object(1)
memory usage: 200.0+ bytes
现在,熊猫数据框中的日期栏已被正确读取。

好了
感谢阅读。
源代码请查看我的 Github 上的笔记本。
如果你对机器学习的实用方面感兴趣,请继续关注。
一些相关文章
- 你应该知道的 6 个熊猫技巧,以加速你的数据分析
- 数据科学项目开始时应该包括的 7 个设置。
您的数据科学投资组合中必须包含 4 类项目
获得一份 DS 工作并不容易,但拥有这些项目可能会增加你的机会。

在数据科学领域找到一份好工作可能是一项极具挑战性的艰巨任务。尽管数据科学正在快速发展,但对该领域感兴趣或出于财务原因加入的人数正在呈指数级增长。
因此,尽管对优秀数据科学家的需求很高,但找到一份数据科学家的工作却极其困难。为了得到一份工作,你需要从成百上千的申请者中脱颖而出。
一个好的数据科学家有很多方面,有些是技术方面,有些不是。作为一名数据科学家,你需要有一个强有力的投资组合,清楚地展示他们的技术技能,以及他们的软技能。最重要的是,他们的作品集需要证明他们有一颗渴望学习的心。
数据科学不仅仅是数据
towardsdatascience.com](/4-essential-skills-often-underestimated-by-data-scientists-4650a7c11eee)
数据科学是一个非常广泛的领域,统称“数据科学”涵盖了许多主题。它涵盖了机器学习、计算机版本、人工智能和自然语言处理的所有子领域。
尽管有各种各样的主题,为了证明你作为数据科学家的价值,你只需要展示你在数据科学核心概念方面的能力。
本文讨论了 4 种类型的数据科学项目,它们可以让你的投资组合脱颖而出,增强你的技能组合,增加获得理想工作的机会。
开启数据科学未来的 10 步路线图
towardsdatascience.com](/a-learning-path-to-becoming-a-data-scientist-56c5c2e8ae3f)
数据清理
作为一名数据科学家,您可能会花将近 80%的时间清理数据。你不能在一个不干净和没有组织的数据集上建立一个有效和可靠的模型。
当您清理数据时,可能需要花费数小时的研究来弄清楚数据集中每一列的用途。有时候,经过几个小时甚至几天的清理后,您会发现您正在分析的数据集并不真正适合您想要实现的目标!然后,你需要重新开始这个过程。
清理数据可能是一项非常令人沮丧和令人畏惧的任务。然而,这是每个数据科学工作中非常重要的一部分,为了让它不那么令人生畏,您需要练习。
那里有数据集,你可以用来练习数据清理。当您为数据清理项目寻找一个好的数据集候选者时,您需要确保
- 数据集分布在多个文件中。
- 有许多细微差别、空值和许多可能的清理方法。
- 需要大量的研究才能完全理解。
- 最重要的是,它需要尽可能接近现实生活中的应用。
好的清洗数据集——或者我称之为非常杂乱的数据集——通常可以在收集和聚合数据集的网站上找到。这些类型的网站从各种来源收集数据,而不会吃掉它们。这使它们成为清洁项目的绝佳候选。
这类网站的例子有:
- Data.world 。
- Data.gov。
- Reddit 数据集。
探索性数据分析
一旦您的数据是干净的和有组织的,您将需要执行探索性数据分析(EDA)。EDA 是每个数据科学项目中的重要步骤之一。执行 EDA 有许多好处,例如:
- 最大化数据集洞察力。
- 揭示潜在模式和结构。
- 提取重要信息。
- 检测异常情况。
我们可以遵循许多技术来实现高效的 EDA,其中大多数技术本质上都是图形化的。这背后的原因是,当数据以可视化的方式呈现时,更好地发现数据中的模式和异常。EDA 任务中使用特定图形技术非常简单,例如:
- 绘制原始数据以获得初步见解。
- 绘制原始数据的简单统计数据,如均值图和标准差图。
- 将分析集中在数据的特定部分,以获得更好的结果。
用引人注目的视觉效果讲述您的数据故事。
towardsdatascience.com](/data-visualization-101-7-steps-for-effective-visualizations-491a17d974de)
您可以从许多来源学习 EDA 的基础知识,并培养探索和投资数据模式的直觉;关于这个话题,我最喜欢的课程之一是约翰霍普金斯大学在 Coursera 上提供的课程。
数据可视化
当数据科学家构建任何类型的数据科学项目时,他们通常是为了揭示秘密和信息,从而以某种方式帮助改进或理解数据。
大多数时候,这是以学术或商业为导向的方式进行的。每个数据科学家必须掌握的技能之一是用他们的数据讲述一个令人信服的故事的能力。
讲述一个故事的最好方式是,把它形象化。
有许多公开可用的数据集可用于实践数据可视化、构建仪表盘以及用数据讲述故事。我最喜欢的几个包括:fivethirtyeeight、 Google 的数据集搜索、数据是复数,当然谈数据集不能不提 Kaggle 。
为了脱颖而出,你需要成为一个善于讲故事的人。您的数据需要有效地可视化。幸运的是,有许多资源可以让您学习和练习数据可视化技能。你可以阅读关于可视化的文章,或者浏览有效的可视化课程。
[## 用 Pygal 实现 Python 中的交互式数据可视化
一步一步的教程,创造惊人的可视化
towardsdatascience.com](/interactive-data-visualization-in-python-with-pygal-4696fccc8c96)
机器学习
决定你能否获得数据科学工作的因素之一是你机器学习的流利程度。有时,当新人加入这个领域时,他们往往会跳过基础知识,直接进入这个领域更高级的“行话”。
但是,
在深入研究这些高级主题之前,你需要确保你已经打下了坚实的机器学习基础。掌握基础知识不仅会巩固你的技能基础,还会给你必要的知识,让你更快更轻松地掌握任何先进的新概念。
确保拥有涵盖所有机器学习基础的项目,例如回归(线性、逻辑等。)、分类算法和聚类。我最喜欢的一些机器学习基础资源是深度学习书籍的机器学习基础章节、和 CodeAcademy 机器学习课程。
以下是一些简单而强大的机器学习项目想法:
倾听你的数据,追随你的目标…
towardsdatascience.com](/how-to-choose-the-right-machine-learning-algorithm-for-your-application-1e36c32400b9)
外卖食品
由于大量的申请者和对该领域感兴趣的人,在数据科学领域找到一份好工作可能相当具有挑战性。为了脱颖而出,您的投资组合需要证明您对数据科学的基本概念有坚实的基础。
强大的基础意味着你将能够轻松地学习、实现和适应新的模型和算法。这篇文章列出了 4 种类型的数据科学项目,可以帮助你增加获得理想工作的机会。这 4 类项目是:
- 数据清理项目。
- 探索性数据分析项目。
- 数据可视化项目(最好是交互式项目)。
- 机器学习项目(聚类、分类和 NLP)。
有这些项目就证明你有扎实的数据科学基础。然而,拥有这些项目并不足以让你得到一份工作;你还需要提高你的软技能,比如沟通、讲故事和对基本商业模式的理解。以及一些显示你知识程度的高级项目。
4 种类型的树遍历算法
在 7 分钟内你需要知道的关于树遍历的一切(带动画)

DFS 和 BFS 算法||由阿南德·K·帕尔马设计
如果你是一名职业程序员或者在软件行业工作多年,那么这个话题对你来说可能显得很琐碎。但是这种算法的用例以及不同的变体可能会在初学者的头脑中造成混乱。因此,我试图把所有你需要知道的关于树遍历的知识放在这篇文章中(带动画)。
”动画可以解释人类大脑所能想到的一切。这种功能使它成为迄今为止为大众快速欣赏而设计的最通用、最明确的交流方式。”―华特·迪士尼
这篇文章不仅仅是关于这些算法的理论,你还将学习如何通过代码实现这些算法。
时间表
- 树形数据结构
- 树遍历-简介
- 让我们开始吧——实用指南
- 有序遍历
- 前序遍历
- 后序遍历
- 层次顺序遍历
- 最终注释
1.树形数据结构
在进入树遍历算法之前,让我们先将树定义为一种数据结构。这将帮助你以一种有意义的方式掌握概念。
Tree 是一种分层数据结构,它以分层的形式自然地存储信息,不像线性数据结构,如链表、堆栈等。树包含不应形成循环的节点(数据)和连接(边)。
以下是树形数据结构的几个常用术语。
节点— 节点是一种结构,它可以包含一个值或条件,或者表示一个单独的数据结构。
根— 树中的顶层节点,主要祖先。
子节点— 离开根节点时直接连接到另一个节点的节点,即直接后代。
父母— 孩子的相反概念,直系祖先。
叶— 没有子节点的节点。
内部节点— 至少有一个子节点的节点。
边缘— 一个节点与另一个节点之间的连接。
深度— 节点与根之间的距离。
级别— 节点和根之间的边数+ 1
高度— 节点和后代叶子之间最长路径上的边数。
宽度— 叶子的数量。
子树— 树 T 是由 T 中的一个节点及其在 T 中的所有后代组成的树。
二叉树— 是一种树形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。
二叉查找树 —是一种特殊类型的二叉树,具有以下属性。
- 节点的左子树只包含键小于该节点键的节点。
- 节点的右边子树只包含键大于节点键的节点。
- 左侧和右侧的子树都必须是二叉查找树。
注意:为了简单起见,我们将以二叉树为例来理解树遍历算法。但是这些算法也可以推广到其他类型的树。
2.树遍历-简介
在计算机科学中,树遍历(也称为树搜索)是图遍历的一种形式,指的是访问(检查和/或更新)树数据结构中的每个节点,恰好一次的过程。这种遍历按照节点被访问的顺序进行分类—维基百科
Wikipedia 定义不言自明,可以理解树遍历的含义。但是我想详细说明定义的最后一行,这将有助于我们理解树遍历的类型以及它们之间的区别。
根据节点被访问的顺序,树遍历算法可以大致分为以下两类:
- 深度优先搜索(DFS)算法:它从根节点开始,首先尽可能深地访问一个分支的所有节点,在回溯之前,它以类似的方式访问所有其他分支。这下面有三个子类型,我们将在本文中介绍。
- 广度优先搜索(BFS)算法:它也从根节点开始,在移动到树中的下一个深度之前,访问当前深度的所有节点。我们将在下一节讨论一种 BFS 类型的算法。
3.让我们开始吧——实用指南
是时候用实际的方法来理解这个概念了。我将使用 Java 编程语言来解释代码。但是这些算法可以用你喜欢的编程语言编写,就像我们用 Java 编写一样。
下面是我们的节点类的蓝图,它将作为树数据结构的原子成员。我们将称之为 TreeNode ,它将数据保存为一个整数值,左右是相同类型的子节点(TreeNode)。您可以使用任何其他数据结构将 as 数据保存在 TreeNode 下。
4.有序遍历
Inorder 遍历是 DFS(深度优先搜索)遍历树的一种最常用的变体。
正如 DFS 所建议的,我们将首先关注所选节点的深度,然后再去关注该级别的广度。因此,我们将从树的根节点开始,以递归的方式越来越深入到左边的子树。
当我们通过上面的步骤到达最左边的节点时,我们将访问当前节点并转到它的右边子树的最左边的节点(如果存在的话)。
应该以递归方式遵循相同的步骤来完成有序遍历。这些步骤的顺序如下(在递归函数中)…
- 转到左侧子树
- 访问节点
- 转到右侧子树

顺序遍历||由阿南德·K·帕尔马设计
重要事实: Inorder 遍历二叉查找树总会给你节点排序的方式。
5.前序遍历
前序遍历是 DFS 的另一种变体。其中递归函数中的原子操作与顺序遍历相同,但顺序不同。
这里,我们首先访问当前节点,然后转到左边的子树。在覆盖了左侧子树的每个节点之后,我们将向右侧子树移动,并以类似的方式进行访问。
这些步骤的顺序如下…
- 访问节点
- 转到左侧子树
- 转到右侧子树

前序遍历||由 Anand K Parmar 设计
6.后序遍历
后序遍历也是如此。其中我们在递归中访问当前节点之前先访问左子树和右子树。
因此,这些步骤的顺序将是…
- 转到左侧子树
- 转到右侧子树
- 访问节点

后序遍历||由 Anand K Parmar 设计
7.层次顺序遍历
这是一个不同于我们上面所讨论的遍历。层次顺序遍历遵循 BFS(广度优先搜索)来访问/修改树的每个节点。
正如 BFS 所建议的,树的广度优先,然后向深度移动。简而言之,我们将从左到右逐个访问同一级别的所有节点,然后移动到下一个级别,访问该级别的所有节点。

层次顺序遍历||由 Anand K Parmar 设计
与上面三个遍历相比,这里的实现稍微有点挑战性。我们将使用队列(FIFO)数据结构来实现层次顺序遍历,其中在访问一个节点后,我们简单地将它的左右子节点按顺序放入队列。
这里,在队列中添加孩子的顺序很重要,因为我们必须在同一级别从左到右遍历。查看以下要点以获得更多理解。
8.最终注释
树遍历算法可以大致分为两类:
- 深度优先搜索(DFS)算法
- 广度优先搜索(BFS)算法
深度优先搜索(DFS)算法有三种变体:
- 前序遍历(当前-左-右)-在访问左或右子树中的任何节点之前,先访问当前节点。
- in order Traversal(left-current-right)-在访问左侧子树中的所有节点之后,但在访问右侧子树中的任何节点之前,访问当前节点。
- 后序遍历(左-右-当前)-在访问左、右子树的所有节点后访问当前节点。
广度优先搜索(BFS)算法有一个变种:
- 层级顺序遍历—在同一层级以从左到右的方式逐层访问节点。
查看我的 Github 库获取详细代码。
重要事实:还有其他的树遍历算法,既不是深度优先搜索,也不是广度优先搜索。一种这样的算法是蒙特卡罗树搜索,它集中分析最有希望的移动,基于搜索空间的随机抽样扩展搜索树。
您的机会…
加入我的部落后,获得我的个人 Java 收藏清单作为免费的欢迎礼物。 马上获取!
关于作者
Anand K Parmar 是一名软件工程师,热爱设计和开发移动应用程序。他是一名作家,发表关于计算机科学、编程和个人理财的文章。在 LinkedIn 或 Twitter 上与他联系。下面是他的最新文章。
理解计算机科学基础的简单指南
medium.com](https://medium.com/swlh/differences-between-data-structures-and-algorithms-eed2c1872cfc)
管理不平衡分类场景的 4 种独特方法
内部 AI
大多数业务案例都与预测少数群体事件有关,如欺诈、联合检测等。基于不平衡数据训练的机器学习模型对罕见事件的预测精度非常差。

在数十亿笔金融交易中,只有少数涉及欺骗和欺诈。在公路上行驶的数百万辆汽车中,只有少数在公路中间抛锚,其余的都开得很好。如果我们密切关注我们的日常活动,那么也可以发现一些例外事件。相同的倾斜数据存在于许多数据点中,其中一个或几个类别覆盖了大多数情况。
当我们向机器学习算法提供这些不平衡的数据点时,少数多数类会以忽略少数类为代价产生严重影响。大多数业务案例都与预测少数群体事件有关,如欺诈、联合检测等。在不平衡数据上训练的机器学习模型对罕见事件的预测精度非常差。
在本文中,我将讨论处理不平衡数据集和提高少数类预测准确性的四种独特方法。此外,我们还将了解为什么仅考虑分类指标分数(如 F1 分数或准确度)会误导罕见事件预测中的模型预测性能。
我们将使用 Scitkit-Learn 中的 make_classification 方法来生成不平衡数据集。
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import f1_score,accuracy_score
from sklearn.metrics import plot_confusion_matrix
import matplotlib.pyplot as plt
我们将学习五种独特的方法来处理 5000 个样本的不平衡数据集,其中一个类包含 98%的案例。
X, y = make_classification(n_samples=5000,weights=[0.02, 0.98],
random_state=0,n_clusters_per_class=1)ycount=pd.DataFrame(y)
print(ycount[0].value_counts())

样本数据集中多数类和少数类的比例(上面代码的输出)
在 5000 个样本记录中,我们有 4871 个 1 类记录和 129 个 0 类记录。让我们考虑等级 1 表示正常交易,等级 0 表示欺诈交易。
样本数据集分为两部分,即。训练和测试设备。训练集是训练机器学习模型,测试集是检验模型的预测。
我们将使用 80%的样本数据集来训练模型,剩余的 20%模型以前没有见过的记录保留给测试集。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,random_state=42,stratify=y)
为了理解不平衡数据集甚至对像随机森林分类器这样的复杂算法的影响,让我们首先用不平衡训练集直接训练标准随机森林分类器,并且没有任何权重参数。
clf =RandomForestClassifier(max_depth=2,random_state=0).fit(X_train, y_train)print("F1 Score is ", f1_score(y_test,clf.predict(X_test)))
print("Accuracy Score is ", accuracy_score(y_test,clf.predict(X_test)))
经过训练的随机森林分类器模型在测试数据集上的 F1 分和准确率分都很高。但是,在不平衡数据集的情况下,仅考虑这些度量来判断模型的预测性能可能是非常误导的。

F1 和在不平衡数据集上训练的随机森林分类器的准确度分数(上述代码的输出)
仅基于这两个指标部署这样一个模型,而不了解分类模型在哪些方面出错,成本可能会非常高。
像混淆矩阵这样的视觉指标在几个方面胜过其他指标。我们可以即时了解模型在分类方面的性能,以及模型的优势和需要微调的方面。基于业务用例,我们可以从假阳性、假阴性、真阳性和真阴性计数中快速判断模型是否准备好进行部署。
您可以在文章准确性可视化:监督机器学习分类算法中深入了解混淆矩阵
fig=plot_confusion_matrix(clf, X_test, y_test)
plt.show()
正如预期的那样,多数类已经完全影响了模型,并且经过训练的模型已经将测试数据集中所有记录的分类预测为多数类。在罕见的欺诈检测或罕见的恶性疾病预测的情况下,这种错误分类预测是非常有害的。

通过在不平衡数据集上训练的随机森林分类器预测测试数据集的混淆矩阵(上述代码的输出)
幸运的是,Random Forrest 分类器有一个参数“class_weight ”,用于在不平衡数据集的情况下指定每个类的权重。
在样本数据集中,类 1 比类 0 普遍大约 38 倍。因此,我们将按这样的比例提及“类权重”,以便算法在训练期间进行补偿。
weighted_clf = RandomForestClassifier(max_depth=2, random_state=0,**class_weight={0:38,1:1}**).fit(X_train, y_train)print("F1 Score for RandomForestClassifier with class_weight parameter is ", f1_score(y_test,weighted_clf.predict(X_test)))print("Accuracy Score for RandomForestClassifier with class_weight parameter is ", accuracy_score(y_test,weighted_clf.predict(X_test)))
具有类别权重补偿的随机森林分类器模型的 F1 分数和准确度分数也很高,但是我们可以通过检查混淆矩阵来确定真实性能。

F1 和在具有 class_weight 参数的类优化数据集上训练的随机森林分类器的准确度分数(上述代码的输出)
我们可以看到,大多数类还没有完全超越权重调整的随机森林分类器模型。
fig=plot_confusion_matrix(weighted_clf, X_test, y_test)
plt.show()
在测试数据集中总共 1000 条记录中,它只错误分类了 14 条记录。此外,它还对测试数据集中 26 个少数类记录中的 20 个少数类样本记录进行了正确分类。

在权重优化数据集上训练的随机森林分类器预测测试数据集的混淆矩阵(上述代码的输出)
我们学习了在随机 Forrest 分类器中处理带有 class_weight 参数的不平衡数据集的方法,提高了少数类的预测精度。
接下来,我们将学习使用不平衡学习库中的 BalancedRandomForestClassifier 管理不平衡输入训练数据集的不同方法。
用 pip 安装不平衡学习库
pip 安装不平衡-学习
在下面的代码中,我们用训练数据集训练了 BalancedRandomForestClassifier,然后检查了测试数据集上的指标得分。
from imblearn.ensemble import BalancedRandomForestClassifierbrfc = BalancedRandomForestClassifier(n_estimators=500,
random_state=0).fit(X_train,y_train)print("F1 Score for Balanced Random Forest Classifier is ", f1_score(y_test,brfc.predict(X_test)))print("Accuracy Score for Balanced Random Forest Classifier is ", accuracy_score(y_test,brfc.predict(X_test)))
和前面两个例子一样,它也表示高 F1 和准确度分数。

F1 和训练的平衡随机森林分类器的准确度分数(上述代码的输出)
我们可以在混淆矩阵中看到,与没有 weight_class 参数的 RandomForestClassifier 相比,BalancedRandomForestClassifier 在内部很好地处理了类权重。
fig=plot_confusion_matrix(brfc, X_test, y_test)
plt.show()
在 1000 个测试记录中,它正确地预测了 968 个记录的分类。通过正确地分类少数类中 26 个记录中的 21 个记录,它也比具有 class_weight 的随机 Forrest 分类器表现得稍好。

平衡随机森林分类器预测测试数据集的混淆矩阵(上述代码的输出)
接下来,我们将使用完全不同的过采样方法来管理训练数据集中的少数类。
接下来,我们将使用完全不同的过采样方法来管理训练数据集中的少数类。基本思想是在少数类中随机生成示例,以获得更平衡的数据集。
from imblearn.over_sampling import RandomOverSampler
ros = RandomOverSampler(random_state=0)
X_resampled, y_resampled = ros.fit_resample(X_train, y_train)
print("Number of records for X_train is ", X_train.shape)
print("Number of records for X_resampled oversampling is ",X_resampled.shape)
之前,我们将 5000 条记录的样本数据集分为分别具有 4000 条和 1000 条记录的训练数据集和测试数据集。
RandomOverSampler 上的训练数据集 fit 随机生成少数类记录,重采样的平衡训练数据有 7794 条记录。

使用过采样策略随机生成的少数类记录对训练数据集进行计数,以平衡训练数据集(上述代码的输出)
一旦训练数据集被人工平衡,那么我们可以在没有“class_weight”参数的情况下训练标准随机森林分类器。
oclf = RandomForestClassifier(max_depth=2, random_state=0).fit(X_resampled, y_resampled)
我们看到,在过采样的人工平衡训练数据集上训练的标准随机森林分类器可以很好地预测。
过采样有助于随机分类器克服多数分类器的影响,以高精度预测测试数据记录类。

由在过采样数据集上训练的随机森林分类器预测的测试数据集的混淆矩阵(上述代码的输出)
在 1000 个测试记录中,它正确地预测了 985 个记录的分类。它的性能也几乎与 BalancedRandomForestClassifier 相当,对少数类中的 26 个记录中的 20 个进行了分类。
最后,我们将了解处理不平衡数据集的欠采样策略。这是一种与我们之前学习的过采样完全不同的方法。随机删除多数课上的例子。关键思想是随机删除多数类记录,以获得更平衡的数据集。
from imblearn.under_sampling import RandomUnderSamplerrus = RandomUnderSampler(random_state=0)
X_resampled, y_resampled = rus.fit_resample(X_train, y_train)print("Number of records for X_train is ", X_train.shape)
print("Number of records for X_resampled undersampling is ",X_resampled.shape)
随机删除的多数类记录的数量,以便用 4000 条数据记录中的 206 条记录来平衡训练数据集。

使用欠采样策略的训练数据集计数。随机删除多数类记录以平衡训练数据集(上面代码的输出)
一旦训练数据集达到平衡,我们就可以直接使用它来训练模型,就像前面讨论的过采样策略一样。
uclf=RandomForestClassifier(max_depth=2,
random_state=0).fit(X_resampled, y_resampled)
似乎欠采样策略能够像本文中讨论的其他策略一样以相似的精度预测罕见的少数类事件,但与其他策略相比,它在预测多数类方面表现得相当差。它错误地预测了测试数据集中的 82 个多数类记录。
fig=plot_confusion_matrix(uclf, X_test, y_test)
plt.show()

由在欠采样数据集上训练的随机森林分类器预测的测试数据集的混淆矩阵(上述代码的输出)
关键要点和我的方法
大多数机器学习分类算法期望训练数据集是平衡的。在用数据训练机器学习模型之前,检查训练数据集是否不平衡并采取适当的预处理措施至关重要。
GIGO —垃圾输入和垃圾输出:如果我们用不平衡的数据训练一个模型,那么这个模型很有可能会错过对生产中少数类的预测。
数据是非常有价值的。我不喜欢欠采样策略,因为它会强制删除与多数类相关的数据。我们看到,由于这一点,即使该模型能够以与本文中讨论的其他策略几乎相同的精度预测少数类记录,但它在预测多数类记录时表现很差。
我更喜欢带' class_weight '参数的随机森林分类器和不平衡学习库中的 BalancedRandomForestClassifier。
我建议您在为您的项目选择任何一个策略之前,用本文中讨论的所有策略检查训练样本的性能。
您可以通过探索性数据分析深入了解不平衡的数据集。要了解更多信息,请阅读文章- 探索性数据分析(EDA)的 5 种高级可视化
如何计算熊猫的组内百分比?
和其他分组提示

伊洛娜·弗罗利希在 Unsplash 上的照片
(这个帖子的所有代码你可以在我的 github 里找到)
( #2 关于熊猫的帖子提示:如何显示熊猫数据帧的所有列/行?)
你好!Pandas 是数据科学中最重要的 Python 库之一。Groupby 是对熊猫进行分析的最强大的功能之一。它类似于 SQL 的 GROUP BY。
在我作为数据科学家的日常生活中,我发现了一些非常有用的分组技巧。但是熊猫群是什么?
分组依据
正如 Pandas 文档中所指出的,Groupby 是一个涉及以下一个或多个步骤的过程:
- 根据某些标准将数据分组。
- 将函数独立应用于每个组。
- 将结果组合成数据结构。
在大多数情况下,我们希望将数据分成组,并对这些组做一些事情。通常是聚集,转化,过滤。
我将使用这个玩具销售数据框架来说明这些技巧:

玩具销售数据框架
每组内的相对频率
这是我用的最多的功能。很多时候我使用 Groupby 来汇总一些值,我想知道每个组中的值所占的百分比,而不是所有数据中的百分比。
如果我们在汇总数据框中直接计算百分比,将使用所有数据计算结果:
groupped_data = df.groupby(['week', 'day']).agg({'sales': 'sum'})
groupped_data["%"] = groupped_data.apply(lambda x: 100*x / x.sum())
groupped_data

每天和每周的销售额,但百分比是使用全部数据计算的
例如,第一行的百分比(19.23%)是 10 除以 52(所有销售额的总和)。要计算与每周相关的百分比,我们必须使用 groupby(level = 0):
groupped_data["%"] = groupped_data.groupby(level=0).apply(
lambda x: 100*x / x.sum()
)
groupped_data

每天和每周的销售额,但百分比仅使用每周的数据计算
现在,第一行中的百分比(55.55%)只比较 a 周的销售额,groupby("level=0 ")选择层次索引的第一级。在我们的例子中,第一级是天。
累积和
很多时候我想做一个累加和。在我们的示例中,验证我们每天完成了多少销售。为此,我们需要使用 cumsum()函数:
groupped_data.cumsum()

销售的累计总额
要计算每周的累积和,您可以使用上一个主题的相同技巧(groupby(level = 0)):
groupped_data.groupby(level=0).cumsum()

每周的累计销售额
更改聚集度量的名称
如果希望在聚合时更改聚合指标的列名,只需传递一个包含新列名和聚合函数的元组:
df.groupby("week").agg(
{"sales": [("max_sales","max"), ("mean_sales","mean")]}
)

具有不同列名的聚合列。
如果您想删除级别 sales ,这可能会很有用:
groupped_data.columns = groupped_data.columns.droplevel()

移除数据帧的一个级别
将值放入列表中
如果你想把一个组的所有值放入一个列表,你只需要这样做:
pd.DataFrame(df.groupby('week')['sales'].apply(list))

每周的销售额都在列表中
它将应用函数在每周的每个组的销售列中创建一个列表。
来源
- https://pandas . pydata . org/pandas-docs/stable/user _ guide/group by . html
- https://stack overflow . com/questions/23377108/pandas-percentage-total-with-group by
- https://stack overflow . com/questions/22219004/grouping-rows-in-list-in-pandas-group by
目前就这样。但我会回来发布更多关于熊猫和其他数据科学主题的文章。请随意添加您的评论
分析疫情数据的 4 种方法(新冠肺炎)
从数据科学的角度来看,跨地区和大洲

新冠肺炎互动统计制图(点击此链接
自从在中国发现一组不寻常的呼吸道病例以来,直到本文撰写之日,有两件事已经很清楚了。
第一,我们将在与我们的亚微观地球居民共存方面学到一个重要的教训。
第二,实现这种学习所需的数据将是丰富的。
在世卫组织官方宣布疫情的几个月前,许多国家和机构已经在收集和公开发布与新冠肺炎有关的数据。所有这些都是为了鼓励国际合作应对这一病毒威胁。
从数据科学的角度来看,这既有趣又令人沮丧。
有趣的,因为它提供了一个从不同领域(流行病学、公共卫生、社会行为等)跨受影响地区进行分析和统计比较的机会。
令人沮丧的因为许多信息渠道利用一维数据点的切片得出不负责任的结论并传播错误信息。例如,不应将一个国家确诊感染病例的绝对数量与另一个国家的绝对数量进行比较,而不考虑一个适当的时间因素,即这些国家目前所处的流行病生命周期阶段。
这篇文章的目的是建议和说明在组合和分析新冠肺炎数据集的不同观点。
内容:
1.新冠肺炎和人口数据
2。数据可靠性和测试的重要性
3。社交搜索趋势和健康意识
4。政府对新冠肺炎的回应
你可以在这里找到我的完整的 互动新冠肺炎统计跟踪器 。
1。新冠肺炎和人口数据
流行病的研究,恰当地称为流行病学,是研究疾病在人群中的分布。
就已经发展成为全球性疫情的新冠肺炎而言,需要进行跨国和跨区域的比较,以便更好地了解这种疾病的特性。然而,为了做到这一点,必须进行一些标准化以增加可比性。
一个国家/地区的总人口数量和平均人口密度,都会影响给定地区传染病的传播速度。这是因为它增加了在规定时间内人类宿主之间近距离接触的次数,以及在“封闭”环境中暴露于疾病的最大人类总数。

按正常确诊病例排名的国家(点击此链接
截至本文撰写之日(2020 年 4 月 17 日),上图显示了按人口密度标准化的新冠肺炎确诊病例总数。
惊讶于这与你在电视上看到的普通图形相比有多么不同吗?
根据人口规模进行调整后,瑞士和比利时突然成为每百万人口中确诊病例数最高的前三名。美国尽管拥有最高的确诊病例绝对数量,但由于其相对较大的人口规模,现在排名第七。
思考什么是有意义的,以及哪些因素会影响被衡量的结果。例如,如果您希望按城市来比较传染病传播,那么调整城市和农村地区之间的人口密度可能也是有意义的。
2。数据可靠性和测试的重要性
对于我们所有人心中的怀疑者(或大或小)……
另一个要考虑的角度是我们的计算和成功(或失败)标准所基于的度量的可靠性。显而易见,这是由于该疾病而被确认感染或死亡的人数。
报告的确诊病例数的可靠性取决于严格和广泛的检测。
这是有意义的,因为测试做得越多,你就能发现越多的病例。根据这一推理,进行较少检测的国家报告的病例数也可能相应减少,换句话说,报告的数字估计数偏低。

测试数据从ourworldindata.org获得
正如预期的那样,对 57 个国家进行的快速相关性分析发现,总检测数和总确诊病例数之间存在 0.88 的强相关性。
感染估计越可靠,国家在协调遏制努力方面就越有能力。
测试:确认比率
那么有没有办法建立可靠性的基准呢?
是的有。我们可以期待那些已经采取了早期检测措施的国家,并根据它们的检测实践和确诊病例数建立一个衡量标准。
介绍‘测试:确认比率’
以确诊病例数为分母,任何国家的理想比值都将远大于 1。看看这是如何绘制成下图的:

测试互动图解:确认比率(点击此链接
对数图显示了各国通过已进行检测的数量(x 轴)与确诊病例数量(y 轴)的相对位置。
右下象限的国家尽管确诊病例相对较少,但仍进行了大量检测。
你注意到“浅色”国家的趋势线了吗?这能帮助我们指出我们的可靠性基准吗?
这条无形趋势线上的 7 个国家(南韩、澳洲、阿联酋、南非、纽西兰、巴林和立陶宛)的平均检验:确认比率为的 43.91 。也就是说,每确诊一名感染者,就有 44 人接受了检测。
3。社交搜索趋势和健康意识
疫情的另一个研究视角是人类的社会行为。正如我们最近观察到的,拥有世界上最好的医疗保健系统之一并不能保证成功缓解失控的病毒群。
人们在危机时期的行为(或不当行为)对结果的影响要大得多。协议只有在被遵守的情况下才有效。
下面的简单图表显示了与 Covid/冠状病毒(橙色)相关的术语的确诊病例(蓝色)相对于谷歌搜索流行度的增长时间表。

请注意,尽管确诊病例激增,但整个 2 月份公众的搜索兴趣(表明意识)仍然相对较低。
搜索量仅在 2020 年 3 月 12 日左右达到峰值,当时世卫组织宣布了疫情级别的威胁。
尽管全球病例激增,但公众反应却滞后了整整一个月,你对此感到惊讶吗?
按洲搜索兴趣
下一个互动观想没有上面那个重要,但看起来更有趣。
如果你点击提供的链接中的互动【播放】按钮,你会看到一幅有趣的图片,展示了与 Covid 相关的谷歌搜索在各大洲的变化。

与新冠肺炎相关的谷歌搜索的互动插图(点击此链接)
垂直段=大陆
气泡=国家(气泡大小:确诊病例总数)
x 轴=与 Covid 相关的谷歌搜索(对所有搜索进行归一化)
y 轴=新冠肺炎确诊病例总数
政府对新冠肺炎的回应
另一个需要考虑的重要角度是政府对新冠肺炎的反应。流行病学研究的结果经常被用来为政府政策的改进提供信息。
一段时间内的政府行为
下图显示了世界各国政府在过去几个月采取的限制性措施。

全球政府反应图解(点击此链接
观察哪些限制是先实施的,哪些是后实施的,以及这些限制是如何随着时间的推移而变化的。这个顺序有意义吗?
中间的方框标志着我所说的“关键行动期”,左边是世卫组织宣布 2020 年 1 月 30 日进入全球紧急状态,右边是世卫组织宣布疫情级别的威胁。
政府回应
和这篇文章中的其他分析一样,有一个指标让我们能够快速比较不同国家采取的措施是很有用的。
为此,我提出了一个衡量政府对新冠肺炎反应的准备时间的方法:政府反应度。为了保持这篇文章的技术性,我将省略计算。****
该指标的一个用途是让我们测试在什么时间实施的哪种形式的政府应对措施(以及与特定关键事件相关的延迟)对测量 Covid 感染率最重要。

跨洲计算的政府响应度指标(点击此链接)
上图汇总了 9 种政府行为在洲一级的响应度。浅色方框表示政府管理部门迅速采取先发制人的行动,而深色方框表示反应较慢。
请注意,为了便于说明,我特意在洲一级进行了汇总。这解释了为什么大洋洲作为一个国家较少的大陆,在颜色模式上有更多的极端变化。
感谢阅读!
如果你觉得这篇文章有用,请分享!如果你想看我以上实验的更多故事,请告诉我。
数据来源 COVID 案例报告——约翰霍普金斯 CSSE
人口数据——世界银行 wbdata API
检测数据——ourworldindata.org 社交搜索行为——谷歌 pytrend API
政府响应——牛津新冠肺炎政府响应跟踪器
编者注: 走向数据科学 是一份以研究数据科学和机器学习为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
增强体验再现的 4 种方法
让代理记住重要的事情

开始做事
经验回放是政策外学习的重要组成部分。它让代理人获得最大的“性价比”,从过去的经历中挤出尽可能多的信息。然而,与更复杂的采样方法相比,从重放中均匀采样已被证明具有次于标准的结果。在本文中,我们讨论了四种不同的体验回放,每一种都可以根据上下文提高学习的鲁棒性和速度。
1.优先体验重放(PER)
上下文:最初是为双 DQN 算法设计的,以提高采样效率,但自然也适用于任何 RL 算法。
PER 利用了这样一个事实,即代理人可以从某些经验中学到比其他人更多的东西。有些过渡可能很少但很重要,所以应该给予更多的关注。有些过渡可能是多余的,并且已经学习过,所以代理的时间最好花在学习其他东西上。
并非所有的经历都是平等的
直觉上,我们希望对模型中损失较大的点进行采样,因为损失越大,代理学习的空间就越大。因此,我们使用一个转换的时间差(TD)误差来衡量它的重要性。

双 DQN 中的 TD 误差
然而,我们不想天真地在每次迭代中选择具有最高 TD 误差的转换。请记住,在迭代算法中,TD 误差会缓慢减少,因此我们会将大部分时间用于重放的一小部分,冒着过度拟合的风险。因此,我们提出一种采样方法,其中转移采样概率与 TD 误差成比例。

过渡抽样概率
其中α是 0 到 1 之间的可调参数。我们还定义了变量:

将变量 P 定义为绝对 TD 误差加上小值
注意,α值越低,我们越接近均匀采样。因此,我们可以将 alpha 视为一个参数,用于调整“我们希望优先处理具有较高 TD 误差的转换的程度”
有一个问题。用这些优先化的样本训练代理可能导致偏差错误,从而导致可能的训练不稳定。我们通过将过渡的渐变更新乘以一个权重来纠正这一点,该权重定义为:

校正偏差误差的权重
其中 N 是重放中的样本数,β是可调超参数。β是一个介于 0 和 1 之间的值,表示我们希望补偿偏置误差的程度。论文[1]建议将β退火为 1,因为无偏更新在训练周期结束时比开始时更重要。作者还建议将每个权重除以所有更新权重的最大值,以获得“标准化”效果。

更新步骤如[1]所示
1.5.分布式优先体验重放
背景:分布式强化学习方法(同步和异步)。虽然最初是为分布式 DQN 和 DPG 变体 Ape-X 提出的,但它自然适合同一伞下的任何算法。
顺便提一下,PER 有一个适应分布式设置的变体!典型地,分布式算法有相同环境的几个实例。虽然我们仍然训练一个单个代理,我们给每个环境一个代理的副本。然后,来自所有这些环境的经验被汇集成一个单一的重播。最后,我们从优先重放中采样(类似于 PER)并训练学习代理,偶尔用原始的更新参数更新每个副本。
通过这种方式,我们可以利用不同的策略积累更多的经验。虽然 Ape-X [2]有更多的细微差别,但使用单一、共享的经验回放的想法在学习中提供了许多好处。
2.马后炮经验回放(她)

背景:主要是通过鼓励更有意义的探索,而不是漫无目的的游荡,来解决回报微薄的问题。选择与之耦合的 RL 算法是任意的。
假设一个代理被给予一个带有某个目标的任务 g. 然后,假设每一个没有导致我们的目标状态的转换都有一个-1 的奖励,否则为 1。这是一个回报很少的环境(或者说,就回报而言,大多数转型看起来都很相似的环境)。对于普通的 RL 算法,在这些环境中学习是非常困难的。她试图解决这个问题。
假设我们训练了政策和价值函数,它们不仅以国家为目标,还以为目标。我们定义奖励函数,如果目标没有实现,返回负奖励 r ,否则返回任意更高的奖励。然后,存储到体验重放的过渡将如下所示:

体验目标回放过渡
然而,我们仍然有稀疏的问题!如果我们很少达到目标,我们很少看到回报的变化。她背后的想法是:用子目标来分割任务。换句话说,不是只存储一个带有总目标 g 的转换,我们也存储相同的转换,但是用一些其他子目标g’替换目标 g !通过这种方式,代理可以更频繁地看到一些奖励差异。

体验带有子目标的重放转换
但是,这有什么用呢?在我们只关心一个目标的任务中,这是如何工作的?我们可以把生成这些子目标看作是将我们的代理人“圈”向最终目标的一种方式。我们会留下一些饼干屑让探员追踪。
然后,问题来了,我们如何选择我们的子目标。我们不想明确地告诉代理子目标是什么,因为这需要特定领域的知识。另外,它不能推广到多项任务。

她的结果如[3]所示
论文提出选择 k 子目标g’来代替目标g论文[3]提出了选择这些子目标的各种方法:
- 最终:在剧集中使用单个最终状态
- 未来:从当前和下一集采样 k 状态
- 事件:从当前事件中取样 k 状态
- 随机:从迄今为止观察到的所有情节中采样 k 个状态
换句话说,将过渡存储到体验重放中的整个过程看起来像这样:
- 收集一集的过渡
- 使用原始目标 g 存储该集的所有过渡
- 使用上述方案之一选择 k 子目标
- 对于剧集的每个过渡,通过用每个 k 子目标替换 g 来存储新过渡**
在机械臂运动的背景下测试 HER 的效果,每个选择方案的结果如上图所示。

如[3]所示,与她一起存储过渡的一集
3.强调近期经验(ERE)

山姆·麦克格在 Unsplash 上的照片
上下文:最初是为支持软演员评论家(SAC)收敛速度而设计的。可以说,可以应用于大多数算法和任务,这些算法和任务天生受益于更快地学习最近的经验(如具有多个部分的任务)
通常,我们的代理能够很好地适应学习过程中早期发现的转变。因此,从这些早期过渡中统一取样对我们的政策没有好处。ERE 创建了一个简单而强大的采样方法,允许代理强调最近的转换,同时不忽略从过去学到的策略。
假设,在更新阶段,我们抽样了 K 个小批量。然后,更新每个小批量的模型参数。ERE 提出了一个方案,我们只从体验回放的**子集进行采样,而不是全部。换句话说,对于第个小批量,我们从最近的 c_k 点均匀采样:**

ERE 的采样点
其中 c_min 是我们可以从中采样的最近数据点的最小数量,N 是我们的经验重放的大小,nu 是一个可调的超参数,用于确定我们对最近观察的优先程度。
请注意在由 K 小批量组成的更新中,早期的样本允许对早期的过渡进行训练,而后期的样本则更加强调最近的过渡。换句话说,我们从最近的经历中学到更多,但永远不会忘记过去。
论文[4]建议将 nu 设置为. 996 对于所有环境都是一个好的值。此外,建议随着训练的进行,将 nu 的值退火为 1。这是用来在早期阶段允许更快的训练,并在后期阶段鼓励更慢、更仔细的训练。

ERE 的表现如[4]所示
有些人可能会问:为什么不直接使用 PER?这两种方法似乎在做类似的事情,对数据的训练将使代理人受益最大。这里的美在于它的简单。虽然 PER 需要额外的实现(特殊的数据结构以提高计算效率),但 ERE 不需要。尽管已经表明将 PER 和 ERE 结合使用通常会产生更好的结果,但是单独使用 ERE 的效果是相似的或者只是稍微差一些。

帕特里克·塞林在 Unsplash 上拍摄的照片
4.重复体验回放
上下文:最初是为循环分布式代理设计的,尤其是那些涉及部分可观察性的代理。然而,它可以应用于大多数基于值的算法,无论它是否是分布式的。
在许多方法中,我们可以用 n 步前视训练 Q 值。在经典 Q-learning 中,目标是通过使用一步前瞻产生的;我们以一个时间步长扫视了未来。对于大于 1 的 n ,我们在 n 的组中收集经验,并“展开”转换,为我们的值更新获得更明确的目标值。

n 步展开的 Q 值目标
本文[5]提出代理存储固定长度( m = 80)的状态-动作-回报观察值序列。除此之外,我们还强加了:
- 相邻序列只能重叠四十个时间步长
- 序列不能跨越幕式边界
然后,当我们对这个序列进行采样时,我们在同一组状态上“展开”价值和目标网络,生成价值估计和训练目标。
然而,我们首先如何对这些序列进行采样呢?这种方法从优先体验重放(PER)中获得灵感,但通过使用两个不同值的加权和来调整标准。假设我们使用的值 n 小于 m,第一项是包含在 m 长度序列内的 max 绝对值n-步长 TD 误差。第二个是序列的平均值绝对值n-步长 TD 误差:

按 P 值替换,如[5]所示
其中 nu 是 0 到 1 之间的可调超参数。论文[5]建议将 nu 设置为. 9,从而产生一种更积极的采样方法。在贪婪的一方犯错误直觉上是有道理的,因为平均往往会抵消和消除较大的错误,从而很难挑出有价值的转变。

结束语
当然,还有许多其他采样方案和经验重放变化。虽然我们在这里只概述了一些,但总有其他版本比其他版本更好地适应某些环境。我们只需要实验、探索和分析。尽管体验重放不是一个“要么成功,要么失败”的交易,但它可以在我们的 RL 代理的最优性、健壮性和收敛特性中发挥重要作用。这绝对值得我们关注一下。
参考
[1] T. Schaul,J. Quan,I. Antonoglou,D. Silver,优先化经验回放 (2016)。
[2] D .霍根,j .全,d .布登,g .巴斯-马龙,m .赫塞尔,h .哈塞尔特,d .西尔弗,分布式经验回放 (2018)。
[3] M. Andrychowicz,F. Wolski,A. Ray,J. Schneider,R. Fong,P. Welinder,B. McGrew,J. Tobin,P. Abbeel,W. Zaremba,后见之明经验回放 (2017)。
[4] C .王(C. Wang),k .罗斯(K. Ross),助推软演员-评论家:强调近期经验不忘过去 (2019)。
[5] S. Kapturowski,G. Ostrovski,J. Quan,R. Munos,W. Dabney,分布式强化学习中的递归经验重放 (2019)。
从经典到最新,这里有讨论多代理和单代理强化学习的相关文章:
让电脑看到更大的画面
towardsdatascience.com](/hierarchical-reinforcement-learning-feudal-networks-44e2657526d7) [## DeepMind 的虚幻代理如何比 Atari 上的专家表现好 9 倍
最佳深度强化学习
towardsdatascience.com](/how-deepminds-unreal-agent-performed-9-times-better-than-experts-on-atari-9c6ee538404e)*
提供分析的 4 种方式,而不是仪表板或 PowerPoint 幻灯片
提供强大的分析不仅仅是仪表盘和演示
维基百科将分析学定义为“对 数据 中有意义模式的发现、解释以及 交流 ”这个短语很好地抓住了分析专家和数据科学家日常工作的本质。在定义分析的三个要素中,沟通可能是最重要的。大多数时候,获得洞察力的分析师或数据科学家实际上并不做任何决策,而是将洞察力传递给决策者。随后,沟通不畅将在很大程度上抑制分析师所发现和解释的有意义模式的有效性。
这一挑战催生了数十种完全致力于数据通信的商业智能产品和公司:Tableau、PowerBI、Looker 和 Domo 只是其中的佼佼者——市场上有数十种用于仪表板的软件包和工具。让我们不要忘记提到最初的仪表板解决方案——功能强大的微软 PowerPoint。PowerPoint 仍然是分析师数据沟通工具集中的重要工具。
仪表板和幻灯片都是非常好的工具,对良好的分析至关重要。然而,它们并不能解决所有问题。仪表板的倾向和易用性使它们容易被无用的 KPI 和过于复杂的图表填满。让我们面对现实吧,真的有人喜欢幻灯片吗?大多数人不正确地使用卡片(作为信息存储,而不是作为通信设备),它们的静态性质使它们很快变得无关紧要,经常被放在某人笔记本电脑的文件夹中,再也看不到了。
幸运的是,有其他方法来交流数据中的有趣模式,而不涉及仪表板或甲板。在本文中,我将分享我在我的公司 Franklin Sports 以及多年来与我合作的其他组织中部署的四个。
1)基于事件的电子邮件
您所工作的许多团队可能都有需要密切关注的特定事件,以便做好他们的工作。这里有 4 个来自电子商务世界的例子,但还有更多:
- 缺货的产品
- 更改项目的名称
- 支出的大幅增加/减少
- 你的网站/亚马逊页面上的新评论
- 异常网站活动
让我们看第一个例子——您可以构建一个仪表板来显示低库存或零库存产品的运行列表。但问题是,用户知道发生了什么的唯一方式是通过查看仪表板。在这种情况下,创建一个仪表板,虽然旨在帮助解决问题,但实际上增加了更多的工作——用户必须每天/每周检查它,以与低库存的产品保持一致。
自动电子邮件解决了这个问题,它只在用户需要更仔细地查看数据时才向用户发送直接信息。这种解决方案的美妙之处在于,你不需要在电子邮件中放入太多信息——只要足以让用户知道他们需要仔细查看即可。如果你需要给出更多的背景信息,你可以在邮件中放置一个与当前问题相关的实时仪表盘链接。任何脚本语言都可以处理数据的接收,Outlook 和 Gmail APIs 也很容易使用。可以使用简单的 CRON 作业来设置自动化。
这种方法的简单会让你忽略它,但是不要!这种简单的格式可以极大地改善商业用户的生活,我一直对有这么多的用例感到震惊。
2)动态共享电子表格
许多商业用户想要操作他们自己的数据,但是缺乏必要的技术技能。他们可能还需要非常特殊格式的数据,这种格式很难手动复制。多个用户可能需要访问相同的数据集。所有这些都很难用仪表板来实现,用 excel 附件或 PowerPoint 演示板是不可能的。
通过利用共享驱动器或 Google Sheets(Microsoft Graph API for Sharepoint 或 Sheets API),您可以通过自动将预先清理的新数据推送到共享位置来解决这个问题。在 Franklin Sports,我们使用这种方法来帮助我们的预测分析师和买家一起工作,使用始终位于同一位置的干净、动态更新的数据来完成新订单。当新订单到来时,Python 脚本会提取新订单数据,添加额外的列,对其进行清理和格式化,然后将其推送到指定的共享驱动器位置。这一流程为两个团队节省了数百小时的人工收集数据和发送一次性电子邮件以就购买决策进行沟通的工作。
3)可重复生成或共享的 IPython 笔记本/R 脚本
当我们谈论民主化数据时,我们通常指的是仪表板。但是真正的数据民主化允许业务用户使用他们熟悉的工具深入研究数据。这种工具通常是 Excel,但是对于稍微有点技术能力的商业用户来说,可重用的 IPython 笔记本或 R Script 甚至更强大。
考虑这样的情况,当用户想要可视化、图形化或分析数据透视表甚至复杂仪表板之外的动态数据时。例如,在 Franklin Sports,营销团队利用 RStudio 脚本对 AdWords 活动和关键词进行深入分析。这种分析需要在半一致的基础上再现,并且需要旋转和非旋转数据,以及生成多个图表等。这种类型的分析很难在 Excel 中重新生成,仪表板也不够灵活——这正是 IPython 或 RStudio 的优势所在。通过一些设置脚本的帮助和一些培训,商业用户知道如何运行它——IPython 笔记本和 R 脚本可以非常强大。
这种方法的好处是双重的:1)商业用户能够成为他们自己的分析师。2)业务用户对高级工具越熟悉,分析团队的工作量就越少,从而将他们从更复杂的统计分析、建模或数据工程中解放出来。
4) 长格式文件(2 页以上)
在这一点上,众所周知亚马逊不使用 PowerPoint 。背后的原因很简单——写文档迫使你清楚地表达你的立场或想法。根据关于这个主题的几十篇文章,亚马逊会议从一份文件(有时长达 6 页)开始,在会议实际举行之前,每个人都有机会了解会议组织者的立场或想法。据亚马逊员工称,这种技术极大地提高了会议的质量。

长格式文档在商业中多少会受到一些非议,但它们在传达复杂思想方面非常出色。来源:https://www . pexels . com/photo/people-discuse-about-graphs-and-rates-3184292/
根据我的经验,当复杂的分析或想法需要交付给企业时,长格式的文档比 PowerPoint 更好。当我为 USAA 银行的预测建模团队做顾问时,我亲身体会到了这一点。对于 USAA 的建模分析师开发的每个模型,都需要编写一个文档,将该模型的目的、设计和实现传达给企业。这种方法不仅为建模过程的技术方面增加了急需的严格性,而且迫使分析师和业务更紧密地合作,以使业务目标与建模结果保持一致。高度技术性的数据科学家被迫将他们复杂的模型简化成企业容易理解的文档。这一政策不仅极大地改善了会议,而且提高了建模和数据科学团队与业务之间关系的整体质量。
拓展你的沟通方式
虽然 PowerPoint 面板和仪表板可能很棒,但还有许多其他方法可以改进您或您的团队交付优秀分析的方式。我希望我今天概述的一些方法能够启发你扩展如何在数据中交流有趣的模式。
有问题或意见吗?你可以给我发电子邮件,地址是 cwarren@stitcher.tech,或者在 Linkedin 上关注我,地址是https://www.linkedin.com/in/cameronwarren/
改善你的绘图的 4 种方法
使用 Plotly 的 Python 库提升您的数据可视化技能

注:发布后,我注意到 Plotly 的 embeds in Medium 存在一些问题。因此,您需要点击链接来查看图表的外观。为了更好的阅读体验,请看我的网站 上的 原版。
最近几周,我一直在使用 Dash 和 Plotly 开发一个应用程序。如果你想快速得到一些东西,这些工具是很棒的。但是,像往常一样,没有神奇的make_beautiful_graphs参数可以默认设置为True。
如果你想在你的应用程序中有漂亮的和定制的可视化效果,你需要花一些时间在 Plotly 的图形属性的广泛列表上玩。我想拥有比默认外观更好的东西,所以我查阅了 Plotly 的文档、我拥有的旧代码片段和堆栈溢出问题。
这不是我第一次发现自己这样做。然而,这一次我决定跟踪我在用 Plotly 制作图表时经常做的事情。这样,下次我就不需要阅读相同的文档或浏览相同的堆栈溢出问题了。
在本文中,我列出了我在使用 Plotly 构建数据可视化时经常做的事情。放心,我在数据相关岗位工作过一段时间,所以你不会发现如何制作 3D 饼状图之类离谱的东西。虽然这些改进是基于一个例子,但我经常看到其他人应用类似的想法。
我将重点放在适用于大多数基本图表的实用而简单的改进上:散点图、折线图、条形图和一些统计图。在这里你会发现像删除网格线这样的事情,而不是像为你的 4D 等高线图选择最佳颜色这样的事情。
首先,我将简要介绍如何使用 Plotly 构建图形。接下来,我将提供一个改进列表及其背后的原因。最后,我将给出我发现在使用 Plotly 和其他绘图库时有用的其他建议。
如何使用 Plotly 制作图形
关于 Plotly 的内部运作,你需要知道三件事:
首先,在 Plotly 中制作图表本质上是填充一个 Python 字典。这本字典通常被称为图。
二、图字典中有两个键:布局和数据。在布局中,你定义了图形的外观,如排版、标题和轴。在 data 键中,您设置将要绘制的轨迹的值和信息。这可能类似于 X 的[1,2,3],Y 的[5,3,9]和条形图类型。
最后,一旦您填充了图字典,它就会被序列化(转换)成一个 JSON 结构。然后,Plotly JavaScript 库使用这个结果数据结构来绘制图表。
就是这样。
那么,如何做出一个图?
做这件事有多种方法。最底层的方法是使用 Python 字典,最高层的方法是使用 Plotly Express 接口。我倾向于使用一个叫做图形构造器的中级接口。比使用 Python 字典更容易调试,比 Plotly Express 更灵活。
使用图形构造器制作图形的代码如下:
import plotly.graph_objects as go
import numpy as np
np.random.seed(42)
# Simulate data
returns = np.random.normal(0.01, 0.2, 100)
price = 100 * np.exp(returns.cumsum())
time = np.arange(100)
# Generate graph using Figure Constructor
layout = go.Layout(
title="Historic Prices",
xaxis_title="time",
yaxis_title="price"
)
fig = go.Figure(
data=go.Scatter(x=time, y=price),
layout=layout
)
fig.show()
这是结果图:
[## 历史价格|由 Dylanjcastillo 制作的散点图| plotly
编辑描述
chart-studio.plotly.com](https://chart-studio.plotly.com/~dylanjcastillo/627/#/)
改进列表
以下是我通常用来改善 Plotly 图形的一系列事情:
-
1:去除网格线和背景色
-
2:保持图表颜色一致
-
3:使用峰值线来比较数据点
-
4:移除浮动菜单,禁用缩放并调整点击行为
#1:去除网格线和背景色
网格线是穿过图表以显示坐标轴刻度的线。它们帮助查看者快速可视化未标记数据点所代表的值。然而,在处理交互式图形时,网格线不是很有用。您可以将鼠标悬停在数据点上并查看其值。因此,在使用 Plotly 时,我通常会删除网格线。
你可以这样做:
import plotly.graph_objects as go
import numpy as np
np.random.seed(42)
# Simulate data
returns = np.random.normal(0.01, 0.2, 100)
price = 100 * np.exp(returns.cumsum())
time = np.arange(100)
layout = go.Layout(
title="Historic Prices",
plot_bgcolor="#FFF", # Sets background color to white
xaxis=dict(
title="time",
linecolor="#BCCCDC", # Sets color of X-axis line
showgrid=False # Removes X-axis grid lines
),
yaxis=dict(
title="price",
linecolor="#BCCCDC", # Sets color of Y-axis line
showgrid=False, # Removes Y-axis grid lines
)
)
fig = go.Figure(
data=go.Scatter(x=time, y=price),
layout=layout
)
fig.show()
这就是 looks:
[## 历史价格|由 Dylanjcastillo 制作的散点图| plotly
编辑描述
plotly.com](https://plotly.com/~dylanjcastillo/627/)
使用类别时,人们通常喜欢做两件事。首先,他们想给每个组分配一些特定的颜色。例如,如果您正在分析美国的选举结果,您可能希望使用特定的蓝色和红色变体来识别民主党和共和党。
#2:在 graphs保持一致的颜色
第二,您希望这种颜色在所有图表中保持一致。例如,如果您正在分析一些现实世界中的公司,您可能希望使用它们与众不同的颜色来绘制它们的价格,但在分析它们的回报时也是如此。
以下是如何使用 Plotly 实现这一点:
import plotly.graph_objects as go
import numpy as np
np.random.seed(42)
# Simulate data
returns_A = np.random.normal(0.01, 0.2, 100)
returns_B = np.random.normal(0.01, 0.2, 100)
returns = np.append(returns_A, returns_B)
prices_A = 100 * np.exp(returns_A.cumsum())
prices_B = 100 * np.exp(returns_B.cumsum())
prices = np.append(prices_A, prices_B)
companies = ["A"] * 100 + ["B"] * 100
time = np.append(np.arange(100), np.arange(100))
df = pd.DataFrame({
"company": companies,
"time": time,
"price": prices,
"returns": returns
})
# Build graph
COLORS_MAPPER = {
"A": "#38BEC9",
"B": "#D64545"
}
layout = go.Layout(
title="Performance of A vs. B",
plot_bgcolor="#FFFFFF",
barmode="stack",
xaxis=dict(
domain=[0, 0.5],
title="time",
linecolor="#BCCCDC",
),
yaxis=dict(
title="price",
linecolor="#BCCCDC"
),
xaxis2=dict(
domain=[0.6, 1],
title="returns",
linecolor="#BCCCDC",
),
yaxis2=dict(
anchor="x2",
linecolor="#BCCCDC"
)
)
data = []
for company,col in COLORS_MAPPER.items():
time = df.loc[df.company == company, "time"]
price = df.loc[df.company == company, "price"]
returns = df.loc[df.company == company, "returns"]
line_chart = go.Scatter(
x=time,
y=price,
marker_color=col, # Defines specific color for a trace
legendgroup=company, # Groups traces belonging to the same group in the legend
name=company
)
histogram = go.Histogram(
x=returns,
marker_color=col, # Defines specific color for a trace
legendgroup=company, # Groups traces belonging to the same group in the legend
xaxis="x2",
yaxis="y2",
showlegend=False
)
data.append(line_chart)
data.append(histogram)
fig = go.Figure(data=data, layout=layout)
fig.show()
上面的代码片段允许您在处理共享相同类别的多个图表时保持一致的颜色。关键部分是COLOR_MAPPER字典及其在添加新轨迹时的使用。这本字典是您将在图表中使用的类别和颜色的映射。
每当你添加一个轨迹到一个图中,你可以通过从COLOR_MAPPER字典中获得正确的颜色来分配给marker_color属性。
结果图看起来像 follows:
[## Dylanjcastillo 制作的 A 与 B |散点图的性能| plotly
编辑描述
plotly.com](https://plotly.com/~dylanjcastillo/671/)
#3:使用峰值线来比较数据点
尖线是悬停在数据上时出现的垂直线或水平线。这对于比较折线图和散点图中的值很有用。这就是你如何使用 Plotly 添加这些:
import plotly.graph_objects as go
import numpy as np
np.random.seed(42)
# Simulate data
returns_A = np.random.normal(0.01, 0.2, 100)
returns_B = np.random.normal(0.01, 0.2, 100)
returns = np.append(returns_A, returns_B)
prices_A = 100 * np.exp(returns_A.cumsum())
prices_B = 100 * np.exp(returns_B.cumsum())
prices = np.append(prices_A, prices_B)
companies = ["A"] * 100 + ["B"] * 100
time = np.append(np.arange(100), np.arange(100))
df = pd.DataFrame({
"company": companies,
"time": time,
"price": prices,
"returns": returns
})
# Build graph
layout = go.Layout(
title="Performance of A vs. B",
plot_bgcolor="#FFFFFF",
hovermode="x",
hoverdistance=100, # Distance to show hover label of data point
spikedistance=1000, # Distance to show spike
xaxis=dict(
title="time",
linecolor="#BCCCDC",
showspikes=True, # Show spike line for X-axis
# Format spike
spikethickness=2,
spikedash="dot",
spikecolor="#999999",
spikemode="across",
),
yaxis=dict(
title="price",
linecolor="#BCCCDC"
)
)
data = []
for company in ["A", "B"]:
time = df.loc[df.company == company, "time"]
price = df.loc[df.company == company, "price"]
returns = df.loc[df.company == company, "returns"]
line_chart = go.Scatter(
x=time,
y=price,
name=company
)
data.append(line_chart)
fig = go.Figure(data=data, layout=layout)
fig.show()
这是结果图:
[## Dylanjcastillo 制作的 A 与 B |散点图的性能| plotly
编辑描述
plotly.com](https://plotly.com/~dylanjcastillo/700/)
#4:移除浮动菜单,禁用缩放并调整点击行为
我不太喜欢默认情况下自动添加到图表中的浮动菜单。它让图形看起来酷,但是我很少看到人们使用它。它有如此多的选项,以至于对于第一次看图表的人来说很困惑。通常,我会移除它。
另外,我喜欢重新定义另外两个用户交互参数。我更喜欢限制用户放大和更改单击图例中的轨迹的行为的能力。在 Plotly 中,默认情况下,如果您想单独检查一个轨迹,您必须双击该轨迹,而不是只单击它。这不是很直观,所以我倾向于颠倒这种行为。
这是您应用这些更改的方式:
import plotly.graph_objects as go
import numpy as np
np.random.seed(42)
# Simulate data
returns_A = np.random.normal(0.01, 0.2, 100)
returns_B = np.random.normal(0.01, 0.2, 100)
returns = np.append(returns_A, returns_B)
prices_A = 100 * np.exp(returns_A.cumsum())
prices_B = 100 * np.exp(returns_B.cumsum())
prices = np.append(prices_A, prices_B)
companies = ["A"] * 100 + ["B"] * 100
time = np.append(np.arange(100), np.arange(100))
df = pd.DataFrame({
"company": companies,
"time": time,
"price": prices,
"returns": returns
})
# Build graph
layout = go.Layout(
title="Performance of A vs. B",
plot_bgcolor="#FFFFFF",
legend=dict(
# Adjust click behavior
itemclick="toggleothers",
itemdoubleclick="toggle",
),
xaxis=dict(
title="time",
linecolor="#BCCCDC",
),
yaxis=dict(
title="price",
linecolor="#BCCCDC"
)
)
data = []
for company in ["A", "B"]:
time = df.loc[df.company == company, "time"]
price = df.loc[df.company == company, "price"]
returns = df.loc[df.company == company, "returns"]
line_chart = go.Scatter(
x=time,
y=price,
name=company
)
data.append(line_chart)
fig = go.Figure(data=data, layout=layout)
fig.show(config={"displayModeBar": False, "showTips": False}) # Remove floating menu and unnecesary dialog box
这是结果图:
[## Dylanjcastillo 制作的 A 与 B |散点图的性能| plotly
编辑描述
plotly.com](https://plotly.com/~dylanjcastillo/716/)
其他建议
我发现有三件事对学习如何更好地实现数据可视化很有用:
- 从你的听众那里获得反馈:这并不总是可能的。但是如果可以的话,总是优先考虑从那些将使用你的数据可视化的人那里获得输入。如果你在一个仪表板上工作,你应该做的第一件事是理解你的仪表板解决什么问题。然后看到用户与之交互。对你的时间有最高的投资回报率。
- 查看 Cole Knaflic 的用数据讲故事:如果你想提高你的数据可视化设计技能,这是一本很棒的书。它提供了许多实用的建议和引人注目的用例。
- plotty 的图参考:习惯 plotty 的图参考和 plotty 的文档。你会经常用到它。总的来说,Plotly 的文档非常优秀。
结束语
我希望这些想法对你有用。可能会有一些事情和你没有共鸣,或者其他你觉得缺失的事情。如果是这样的话,请在下面的评论中告诉我。我很乐意更新这个并添加其他有价值的建议。
你可以在这里找到我写的其他文章,或者如果你想了解我正在做的事情,你可以在 Twitter 或 LinkedIn 上关注我。
本文原载于 我的博客 。
在新冠肺炎期间用数据引导的 4 种方法
定义疫情期间数据领导者的角色

在新冠肺炎疫情期间,数据领导者的角色变得更加重要。随着企业面临新的和不可预见的挑战,数据已成为决策的重要支柱。在这些强大的管道和原始见解背后,首席数据官(CDO)、首席信息官(CIO)和其他数据领导者肩负着推动企业战略的任务。
我们采访了 SAP 的企业数据战略和转型负责人 Maria Villar,以更好地了解数据领导者在这一动荡时期对其组织的影响。在她数十年的职业生涯中,Maria 亲眼见证了高质量数据对于设定明确的优先事项和在不确定性面前引导组织变革的价值。她甚至在 YouTube 上讲授一门关于这个主题的热门课程,即结果驱动的数据策略大师课。在我们的谈话中,Maria 分享了一些有用的想法和问题,作为面对新冠肺炎的数据领导者,我们应该问自己。
1。成为新冠肺炎响应团队的一员。
许多组织组建了所谓的快速反应小组来应对这一前所未有的时刻。如果你还不是其中一员,那就努力争取一个席位,因为你的组织希望利用内部和外部数据来了解业务变化,并做出明智的回应。尤其是现在有大量的数据涌入,其中一些数据位于常规模式之外,因此更加需要了解这些数据,并将其与业务对新冠肺炎的响应联系起来。以下是向你的团队提出的一些问题,以确保你在非常时期以及当事情(希望最终)恢复正常时,能抓住这些联系:
- 我们了解数据的来源以及它们之间的联系吗?
- 我们有合适的数据质量吗?否则,在我们对新冠肺炎响应产生影响之前,需要进行数据质量补救。
- 我们数据的有效来源在哪里?我们应该如何将它整合到我们的仪表板和响应中?
- 我们需要额外的信息来源吗?这将从何而来?
你对数据了解得越多,回答这些基本问题的能力越强,你就能更好地为公司服务。没有这些基本面,你会无所适从。
2。把这些点联系起来。
在危机时期,更重要的是做出数据驱动的决策——好时光有时会隐藏糟糕的决策和糟糕的流程。因此,这个具有挑战性的时刻实际上可以成为您更广泛的组织的一个主要学习机会,因为他们可以切实看到“盲目飞行”和使用高质量数据之间的价值。但是,数据素养是一项技能,这意味着你和你的团队需要帮助教育公司的其他人做出决策。当你思考如何在推动决策的过程中带领组织前进时,请考虑以下问题。
- 我们应该使用什么样的可视化技术来负责任地表示数据?
- 我们如何根据这些数据做出决策?
- 我们试图解决的问题是什么?为了做出明智的决策,我们需要哪些信息?
仅仅告诉组织数据在哪里,或者把数据放在盘子里端上来是不够的;相反,专注于将点点滴滴联系起来,这样每个人都明白如何正确使用数据,并能充分理解(好的)数据是如何为王的。
3。保持战略重点。
当响应事件发生时,从战略数据的角度对其进行评估是很重要的——但是太容易陷入事件的紧迫性中。如果您了解您的实际数据差距,并努力构建可重用、可预测的数据流程,运营和技术将能够更好地应对未来的问题。
- 首先,有策略地应对出现的数据问题。我们现在需要做什么来解决这些问题?
- 然后,转回来做一个事后分析:如果将来发生这种情况,我们需要建立什么样的能力?
4。强调数据伦理。
随着数据在危机等转折点成为组织决策的中心,从一开始就建立正确的价值观和控制非常重要。毕竟,如果不负责任地使用数据,数据既可能带来好处,也可能带来坏处,因此,作为公司的数据领导者,请确保你是这些基本对话的中间人。
- 以道德的方式使用数据意味着什么?
- 我们是否有一套关于数据使用的政策?尤其是从人工智能的角度?
- 我们最常见的数据场景是什么?
- 我们如何进行数据跟踪和自动化?
与整个公司的团队一起组织一个持续的数据道德委员会 作为一个跨职能小组,了解您的数据是如何用于消除偏见的。确保包括法律、营销、数据战略、隐私和安全团队的成员。组织中的不同团队会从不同的角度看待数据,但是保持一致性是至关重要的。
将您的公司转变为数据驱动的组织从未如此重要,这反过来使其缺点更加明显。有效管理数据需要一个全面的数据战略来构建所有的数据能力,使组织不仅能够快速应对新冠肺炎危机,还能应对未来的危机。如果还没有的话,这个话题现在应该成为董事会讨论的话题。数据领导者将确保这一点。
4 种降低数据维度的方法
降维方法概述——相关、主成分分析、t-SNE、自动编码器及其在 python 中的实现

照片由 Avel Chuklanov 在 Unsplash 上拍摄,使用 Pixlr 编辑
降维是减少数据集中特征或变量数量的过程。它是将数据从高维空间转换到低维空间,以便低维表示保留原始数据的一些有意义的属性。
为什么降维很重要?
在现实世界的数据集中,数据中经常有太多的变量。要素数量越多,数据的可视化和处理就越困难。有时,这些特征中的大多数是相关的,因此是多余的。这就是降维算法发挥作用的地方。
有多种方法可以降低数据的维数,在本文中,您可以了解其中的一些方法:
- 特征选择方法:使用相关系数方法
- 矩阵分解
- 流形学习:SNE
- 自动编码器

特征选择方法:
一些数据集具有大量的要素,而这些要素中只有一些与目标类标注相关。特征选择技术使用评分或统计方法来选择保留哪些特征和删除哪些特征。
用于通过选择顶部特征来减小尺寸的技术或算法有:
- 皮尔逊相关系数(数值输入,数值输出)
- Spearman 相关系数(数值输入,数值输出)
- 卡方检验(分类输入,分类输出)
- 肯德尔τ检验(数值输入,分类输出)
随机变量之间的关系。
towardsdatascience.com](/pearson-and-spearman-rank-correlation-coefficient-explained-60811e61185a)
根据训练数据的特征是数字的还是分类的,以及目标类别标签是数字的还是分类的,可以从上述列表中选择不同的特征。
获取来自 UCI ML 知识库的葡萄酒样本数据集。目标类别标签是分类的,其余的训练数据具有数字特征。因此,我们可以使用 Kendall Tau 测试找到与目标类别标签(“Customer_Segment”)高度相关的顶级特征。
(作者代码)

(图片由作者提供),上面代码片段的第 4 行输出
从具有目标类标签“Customer_Segment”的数据集中的每个特征的上述 Kendall 系数,可以确认特征“Flavanoids”、“OD280”和“Total_Phenols”是具有最大模值的前 3 个特征。您可以通过取系数值的模来挑选前 x 个特征。
矩阵分解:
矩阵分解方法可用于降维。主成分分析(PCA)是一种矩阵分解技术,用于将高维数据降维。PCA 保持方差最大的方向。
PCA 应遵循的步骤:
- 给定数据集 X 的形状(n 行,d 要素)
- 标准化数据集 X
- 计算协方差矩阵

- 从协方差矩阵中找出特征值和特征向量。
- 为了挑选前 f 个特征,挑选具有相应的前 x 个最大特征值的特征向量。
(作者代码)
对于取自 UCI ML 知识库的葡萄酒样本数据集,最初,数据集有 13 个特征,经过 PCA 算法后,维数减少到 2 维,可视化结果如下图所示。

(图片由作者提供),来自 PCA 算法的二维数据的可视化
多方面学习:
高维度统计的技术也可以用于降维。使用流形学习并用于创建高维数据的低维投影。这通常用于数据可视化。
t-分布式随机邻居嵌入( t-SNE )是一种流形学习技术,用于将高维数据投影到低维(主要是 2 维或 3 维)进行可视化。t-SNE 是一种邻域保持嵌入技术,它能最好地保持低维数据中的显著结构或关系。
(作者代码)
对于取自 UCI ML 知识库的葡萄酒样本数据集,最初,数据集有 13 个特征,在应用 t-SNE 算法后,维数减少到 2 维,可视化结果如下图所示。

(图片由作者提供),来自 t-SNE 算法的二维数据的可视化
自动编码器:
Auto Encoders 是一个人工神经网络模型,用于执行维度缩减。自动编码器有两个组成部分,压缩和扩展。形状的初始数据集(n 行,d 维)被传递到自动编码器神经网络模型,并被编码到较低维的隐藏层。然后,它试图从简化的编码中生成尽可能接近其原始输入的表示。

(图像源),自动编码器架构
以上是基于单层感知器的自动编码器,它参与了多层感知器(MLP)——具有输入层、输出层和连接它们的一个或多个隐藏层。输出层中的节点数量与输入层中的节点数量相同,并且通过最小化输入和输出之间的差异来重构其输入。
输入和输出层有 d 个神经元(d 是原始数据集的维数)。中间隐藏层有 f 个神经元(f 是降维后的维数)。
结论:
在本文中,我们讨论了 4 种不同的降维技术,每种技术都有各自的优缺点。没有最好的降维技术。相反,最好的方法是使用系统的受控实验,并发现哪些降维技术与您选择的模型结合使用时,会在数据集上产生最佳性能。
感谢您的阅读
数据科学家的 40 个统计面试问题和答案
为你的面试复习统计知识的资源!

来自 admiralmarkets.com 的照片
鉴于我的文章、 Google 的数据科学面试脑筋急转弯、亚马逊的数据科学家面试练习题、微软数据科学面试问答、数据科学家常见的 5 个 SQL 面试问题的受欢迎程度,我在网上收集了一些统计数据科学面试问题,并尽我所能地进行了回答。
我对数据科学了解得越多,就越意识到基本的统计知识对成功至关重要。因此,我浏览了网页,找到了四十个数据科学家的统计面试问题,我将回答这些问题。开始了。
1.你如何评估一个洞察力的统计意义?
您将执行假设检验来确定统计显著性。首先,你要陈述零假设和替代假设。其次,您将计算 p 值,即假设零假设为真,获得测试观察结果的概率。最后,您将设置显著性水平(alpha ),如果 p 值小于 alpha,您将拒绝 null 换句话说,结果具有统计显著性。
2.解释什么是长尾分布,并提供三个有长尾的相关现象的例子。为什么它们在分类和回归问题中很重要?

长尾分布的例子
长尾分布是一种重尾分布,它有一条(或多条)逐渐渐近消失的尾巴。
3 实际例子包括幂定律、帕累托原则(通常称为 80-20 法则)和产品销售(即最畅销的产品与其他产品相比)。
在分类和回归问题中注意长尾分布是很重要的,因为出现频率最低的值构成了总体的大多数。这最终会改变您处理异常值的方式,并且它也与一些假设数据正态分布的机器学习技术相冲突。
3.什么是中心极限定理?解释一下。为什么重要?

来自维基百科
统计学如何为 CLT 提供了最好的定义,这就是:
“中心极限定理表明,无论总体分布的形状如何,随着样本量的增加,样本均值的抽样分布接近正态分布。”[1]
中心极限定理很重要,因为它用于假设检验和计算置信区间。
4.统计力是什么?
“统计功效”是指二元假设的功效,即假设替代假设为真,测试拒绝零假设的概率。[2]

5.解释选择偏差(关于数据集,而不是变量选择)。为什么重要?丢失数据处理等数据管理程序如何使情况变得更糟?
选择偏倚是指在选择个人、群体或数据进行分析时,没有实现适当的随机化,最终导致样本不能代表总体的现象。
理解和识别选择偏差是很重要的,因为它会严重扭曲结果,并提供关于特定人群的错误见解。
选择偏差的类型包括:
- 抽样偏差:非随机抽样导致的有偏差样本
- 时间间隔:选择支持预期结论的特定时间范围。例如,在临近圣诞节时进行销售分析。
- 暴露:包括临床易感性偏倚、原发性偏倚、适应症偏倚。此处阅读更多。
- 数据:包括摘樱桃、压制证据、证据不全的谬误。
- :流失偏倚类似于生存偏倚,即只有那些在长期过程中“幸存”的人才会被纳入分析,或者类似于失败偏倚,即那些“失败”的人才会被纳入分析
- 观察者选择:与人择原理相关,人择原理是一种哲学上的考虑,即我们收集的关于宇宙的任何数据都要经过过滤,为了使它可以被观察到,它必须与观察它的有意识和有智慧的生命兼容。[3]
处理缺失数据会使选择偏差变得更糟,因为不同的方法会以不同的方式影响数据。例如,如果您用数据的平均值替换空值,您就增加了偏差,因为您假设数据并不像实际可能的那样分散。
6.提供一个简单的例子,说明实验设计如何帮助回答一个关于行为的问题。实验数据和观测数据如何对比?
观察数据来自观察研究,即观察某些变量并试图确定它们之间是否存在关联。
实验数据来自实验研究,即当你控制某些变量并保持它们不变,以确定是否存在因果关系。
实验设计的一个例子如下:将一组分成两个。对照组正常生活。测试组被告知在 30 天内每天晚上喝一杯酒。然后可以进行研究,看看酒是如何影响睡眠的。
7.缺失数据的均值插补是可接受的做法吗?为什么或为什么不?
均值插补是用数据的均值替换数据集中的空值的实践。
均值插补通常是不好的做法,因为它没有考虑特征相关性。例如,假设我们有一个显示年龄和健康分数的表格,并假设一个 80 岁的老人缺少健康分数。如果我们从 15 岁到 80 岁的年龄范围内取平均健康分数,那么 80 岁的人看起来会有一个比他实际应该有的高得多的健康分数。
第二,均值插补减少了数据的方差,增加了数据的偏倚。由于方差较小,这导致模型不太精确,置信区间较窄。
8.什么是离群值?解释如何筛选异常值,如果在数据集中发现异常值,您会怎么做。此外,解释什么是内联体,如何筛选内联体,如果在数据集中发现了内联体,你会怎么做。
异常值是与其他观察值显著不同的数据点。
根据异常值的原因,从机器学习的角度来看,它们可能是坏的,因为它们会降低模型的准确性。如果异常值是由测量误差引起的,那么将它们从数据集中移除是非常重要的。有几种方法可以识别异常值:
Z 值/标准偏差:如果我们知道一个数据集中 99.7%的数据位于三个标准偏差内,那么我们可以计算一个标准偏差的大小,乘以 3,并确定超出该范围的数据点。同样,我们可以计算给定点的 z 分数,如果它等于+/- 3,那么它就是异常值。
注意:使用这种方法时需要考虑一些意外情况;数据必须呈正态分布,这一点不适用于小数据集,并且过多异常值的存在会影响 z 值。

*四分位距(IQR): IQR,用于构建箱线图的概念,也可用于识别异常值。IQR 等于第三个四分位数和第一个四分位数之差。然后,如果一个点小于 Q1-1.5 * IRQ 或大于 Q3 + 1.5IQR,则可以确定该点是否为异常值。这达到大约 2.698 个标准偏差。

照片来自迈克尔·加拉尼克
其他方法包括 DBScan 聚类、隔离森林和稳健随机采伐森林。
一个内联者是一个数据观察,它位于数据集的其余部分,是不寻常的或者是错误的。由于它位于数据集中,通常比异常值更难识别,需要外部数据来识别它们。如果您发现了任何内联者,您可以简单地将它们从数据集中删除以解决它们。**
9.你如何处理丢失的数据?有什么插补技巧推荐?
有几种方法可以处理丢失的数据:
- 删除缺少数据的行
- 均值/中值/众数插补
- 分配唯一的值
- 预测缺失值
- 使用支持缺失值的算法,如随机森林
最好的方法是删除缺少数据的行,因为这样可以确保没有偏差或差异被添加或删除,并最终产生一个稳健而准确的模型。但是,只有在开始时有大量数据并且缺失值的百分比很低的情况下,才建议这样做。
10.您有呼叫中心通话时长的数据。为如何编码和分析这些数据制定一个计划。解释一下这些持续时间的分布情况。你如何测试,甚至是图形化地测试,你的期望是否实现了?
首先,我会进行 EDA——探索性数据分析,以清理、探索和理解我的数据。见我关于 EDA 的文章 这里 。作为我的 EDA 的一部分,我可以构建一个通话持续时间的直方图来查看潜在的分布。**
我的猜测是,呼叫的持续时间将遵循对数正态分布(见下文)。我认为它是正偏的原因是因为下限被限制为 0,因为调用不能是负秒。然而,在高端,很可能有一小部分通话时间相对较长。

对数正态分布示例
您可以使用 QQ 图来确认通话时长是否符合对数正态分布。参见 此处 了解更多 QQ 剧情。**
11.解释管理数据集和从实验研究中收集的数据集之间可能的差异。管理数据可能会遇到什么问题?实验方法如何帮助缓解这些问题?它们带来了什么问题?
行政数据集通常是政府或其他组织出于非统计原因使用的数据集。
管理数据集通常比实验研究更大,更具成本效益。假设与管理数据集相关联的组织是活动的并且正在运行,那么它们也会被定期更新。与此同时,管理数据集可能无法捕获用户可能需要的所有数据,也可能不是所需的格式。它还容易出现质量问题和遗漏条目。
12.您正在为每月上传的用户内容编写一份报告,并注意到 10 月份的上传量出现了峰值。特别是图片上传的高峰。您可能认为这是什么原因造成的,您将如何测试它?
照片上传数量激增的潜在原因有很多:
- 一项新功能可能已经在 10 月份实施,它涉及上传照片,并获得了用户的大量关注。例如,提供创建相册能力的功能。
- 同样,有可能之前上传照片的过程不直观,在 10 月份得到了改善。
- 可能有一场病毒式的社交媒体运动,包括持续了整个 10 月的上传照片。八月天,但更具扩展性的东西。
- 这有可能是因为人们上传了自己穿着万圣节服装的照片。
测试的方法取决于尖峰的原因,但是您可以进行假设测试来确定推断的原因是否是实际原因。
13.你即将登上去西雅图的飞机。你想知道你是否应该带一把伞。你打电话给住在那里的三个朋友,分别问他们是否在下雨。你的每个朋友都有 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 | not A) P(not 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 的几率是真的在下雨。
一定要 订阅 千万不要错过另一篇关于数据科学指南、诀窍和技巧、生活经验等的文章!
14.有一个盒子——有 12 张黑色和 12 张红色卡片,第二个盒子有 24 张黑色和 24 张红色卡片;如果你想从 2 个盒子中随机抽取 2 张卡片,哪个盒子获得相同颜色的概率更高?你能直观地说出为什么第二个盒子有更高的概率吗
有 24 张红卡和 24 张黑卡的盒子获得两张同色卡片的概率更大。让我们走过每一步。
假设你从每副牌中抽出的第一张牌是红色的 a。
这意味着在有 12 个红和 12 个黑的牌组中,现在有 11 个红和 12 个黑。因此,你再抽一张红色的几率等于 11/(11+12)或 11/23。
一副牌中有 24 个红和 24 个黑,那么就有 23 个红和 24 个黑。因此,你再抽一张红色的几率等于 23/(23+24)或 23/47。
由于 23/47 > 11/23,所以卡数较多的第二副牌有较大概率得到相同的两张牌。
15.什么是:提升、KPI、稳健性、模型拟合、实验设计、80/20 法则?
提升:提升是针对随机选择目标模型测量的目标模型的性能的度量;换句话说,lift 告诉你你的模型在预测事物方面比没有模型时好多少。
KPI: 代表关键绩效指标,这是一个可衡量的指标,用于确定公司实现其业务目标的情况。错误率。
健壮性:健壮性通常指系统处理可变性并保持有效的能力。
模型拟合:指一个模型对一组观察值的拟合程度。
实验设计:也称为 DOE,它是在假设反映变量的条件下,旨在描述和解释信息变化的任何任务的设计。[4]本质上,实验的目的是根据一个或多个输入(独立变量)的变化来预测结果。
80/20 法则:又称帕累托原理;80%的结果来自 20%的原因。80%的销售额来自 20%的顾客。
16.定义质量保证,六西格玛。
质量保证:一项或一组活动,旨在通过减少错误和缺陷来维持期望的质量水平。
六西格玛:一种特定类型的质量保证方法,由一套用于过程改进的技术和工具组成。六西格玛流程是指所有结果的 99.99966%没有缺陷。
17.给出既不是高斯分布也不是对数正态分布的数据的例子。
- 任何类型的分类数据都不会有高斯分布或对数正态分布。
- 指数分布——例如,汽车电池的持续时间或地震发生前的时间。
18.什么是根本原因分析?如何识别原因和相关性?举例说明
根本原因分析:用于确定问题根本原因的解决问题的方法[5]
相关性衡量两个变量之间的关系,范围从-1 到 1。因果关系是指第一个事件似乎引发了第二个事件。因果关系主要看直接关系,而相关性可以看直接和间接关系。
例句:在加拿大,较高的犯罪率与较高的冰淇淋销售额有关,也就是说,它们是正相关的。然而,这并不意味着一个导致另一个。相反,这是因为当室外温度较高时,这两种情况发生得更多。
您可以使用假设检验或 A/B 检验来检验因果关系。
19.请给出一个中值比平均值更好衡量的例子
当有许多异常值正或负地扭曲了数据时。
20.给定两个公平的骰子,得分总和为 4 的概率是多少?到 8?
滚动 a 4 有 4 种组合(1+3,3+1,2+2):
P(滚动 a 4) = 3/36 = 1/12
有滚安 8 的组合(2+6,6+2,3+5,5+3,4+4):
P(滚安 8) = 5/36
21.什么是大数定律?
大数定律是一种理论,它指出随着试验次数的增加,结果的平均值将越来越接近期望值。
正面硬币 100,000 次的翻转次数应该接近 0.5 次而不是 100 次。
22.你如何计算所需的样本量?

误差幅度公式
您可以使用误差幅度(ME)公式来确定所需的样本量。
- t/z =用于计算置信区间的 t/z 分数
- ME =期望的误差幅度
- S =样本标准偏差
23.当你取样时,你造成了什么样的偏见?
潜在的偏见包括:
- 抽样偏倚:由非随机抽样引起的有偏倚的样本
- 覆盖偏差:采样太少的观测值
- 生存偏差:忽略没有通过某种形式的选择过程的观察的错误。
24.你如何控制偏见?
你可以做很多事情来控制和减少偏见。两种常见的方式包括随机化,参与者被随机分配,以及随机抽样,每个成员被选中的概率相等。**
25.什么是混杂变量?
混杂变量或混杂因素是一种既影响因变量又影响自变量的变量,导致虚假关联,即两个或更多变量相关但无因果关系的数学关系。
26.什么是 A/B 测试?
A/B 检验是假设检验和双样本假设检验的一种形式,用于比较单个变量的两个版本,即控制变量和变量。它通常用于改善和优化用户体验和营销。
27.医院的感染率高于每 100 人-日 1 例感染的风险被视为高。某医院在过去的 1787 人/天中有 10 例感染风险。给出医院是否低于标准的正确片面检验的 p 值。
由于我们查看的是给定时间段内发生的事件数量(感染数量),因此这是一个泊松分布问题。

在一个区间内观察到 k 个事件的概率
零(H0):每人每天 1 例感染
备选方案(H1): >每人每天 1 例感染
k(实际)= 10 次感染
λ(理论)= (1/100)1787
p = 0.032372 或 3.2372% 计算使用。excel 中的 poisson()或 R 中的 ppois*
由于 p 值< alpha (assuming 5% level of significance), we reject the null and conclude that the hospital is below the standard.
28. You roll a biased coin (p(head)=0.8) five times. What’s the probability of getting three or more heads?
Use the General Binomial Probability formula to answer this question:

General Binomial Probability Formula
p = 0.8
n = 5
k = 3,4,5
P(3 头以上)= P(3 头)+ P(4 头)+ P(5 头)= 0.94 或 94%
29.随机变量 X 是具有平均值 1020 和标准偏差 50 的正态变量。计算 P(X>1200)
使用 Excel…
p =1-norm.dist(1200,1020,50,true)
p= 0.000159
30.假设出现在公交车站的人数为泊松分布,平均值为 2.5 人/小时。四小时内最多出现三人的概率是多少?
x = 3
平均值= 2.54 = 10*
使用 Excel…
p = poisson.dist(3,10,true)
p = 0.010336
31.艾滋病毒检测的灵敏度为 99.7%,特异性为 98.5%。患病率为 0.1%的人群中的受试者获得阳性测试结果。测试的精确度是多少(即他是 HIV 阳性的概率)?

精度方程(PV)
精度=阳性预测值= PV
PV =(0.001 * 0.997)/[(0.001 * 0.997)+((1–0.001)(1–0.985))]
PV = 0.0624 或 6.24%*
更多关于这个方程的内容请看 这里 。
32.你正在竞选公职,而你的民意调查者调查了上百人。他们中的 60 个人声称他们会投你的票。你能放松吗?
- 假设只有你和另一个对手。
- 另外,假设我们想要 95%的置信区间。这使我们的 z 值为 1.96。

置信区间公式
p-hat = 60/100 = 0.6
z * = 1.96
n = 100
这就给了我们一个[50.4,69.6]的置信区间。因此,给定 95%的置信区间,如果你可以接受最糟糕的捆绑情形,那么你可以放松了。否则,你不能放松,直到 100 分中有 61 分说是。
34.苏格兰的凶杀率从前一年的 115 下降到了去年的 99。这种报道的变化真的值得注意吗?
- 因为这是一个泊松分布问题,均值=λ=方差,这也意味着标准差=均值的平方根
- 95%的置信区间意味着 z 值为 1.96
- 一个标准偏差= sqrt(115) = 10.724
因此置信区间= 115+/- 21.45 = [93.55,136.45]。由于 99 在这个置信区间内,我们可以假设这个变化不是很值得注意。
35.考虑双亲异性恋家庭的流感流行。假设父母中至少有一方患病的概率是 17%。父亲感染流感的概率为 12%,而母亲和父亲都感染该疾病的概率为 6%。母亲感染流感的概率有多大?
利用概率中的一般加法法则:
P(母亲或父亲)= P(母亲)+ P(父亲)— P(母亲和父亲)
P(母亲)= P(母亲或父亲)+ P(母亲和父亲)— P(父亲)
P(母亲)= 0.17+0.06–0.12
P(母亲)= 0.11
36.假设 35-44 岁男性的舒张压(DBPs)正态分布,平均值为 80(毫米汞柱),标准差为 10。随机选择一个 35-44 岁的人,其 DBP 低于 70 的概率是多少?
因为 70 比平均值低一个标准差,所以取一个标准差左边的高斯分布的面积。
= 2.3 + 13.6 = 15.9%
37.在感兴趣的人群中,9 名男性的样本产生了 1,100cc 的样本平均脑容量和 30cc 的标准偏差。这个新群体的平均脑容量的 95%学生 T 置信区间是多少?

样本的置信区间
假设置信度为 95%,自由度等于 8,t 值= 2.306
*置信区间= 1100±2.306 (30/3)
置信区间= [1076.94,1123.06]
38.在六周的时间里,给 9 名受试者服用减肥药。体重的平均差异(随访-基线)为-2 磅。要使 95% T 置信区间的上端点达到 0,体重差异的标准偏差必须是多少?
上限=平均值+ t 得分(标准偏差/sqrt(样本大小))
0 =-2+2.306 (s/3)
2 = 2.306 * s/3
s = 2.601903
因此,标准偏差必须至少约为 2.60,95% T 置信区间的上限才能达到 0。
39.在一项关于急诊室等待时间的研究中,调查人员考虑了一种新的标准分流系统。为了测试系统,管理员选择了 20 个晚上,并随机分配新的分流系统在 10 个晚上使用,标准系统在其余 10 个晚上使用。他们计算了每晚看医生的平均等待时间(MWT)。新系统的平均 MWT 为 3 小时,方差为 0.60,而旧系统的平均 MWT 为 5 小时,方差为 0.68。考虑与新系统相关的平均 MWT 差异的 95%置信区间估计。假设方差不变。间隔是多少?按此顺序减去(新系统—旧系统)。
查看此处获得寻找两个独立样本的置信区间的完整教程。

置信区间=平均值+/- t 分数标准误差(见上文)***
均值=新均值-旧均值= 3–5 =-2
给定 df = 18(20–2)和 95%的置信区间,t 得分= 2.101

标准误差= sqrt((0。⁶ 9+0.⁶⁸ 9)/(10+10–2)) sqrt(1/10+1/10)
标准误差= 0.352*
置信区间= [-2.75,-1.25]
40.为了进一步测试医院的分流系统,管理员选择了 200 个晚上,随机分配了一个新的分流系统用于 100 个晚上,一个标准系统用于其余的 100 个晚上。他们计算了每晚看医生的平均等待时间(MWT)。新系统的平均 MWT 为 4 小时,标准偏差为 0.5 小时,而旧系统的平均 MWT 为 6 小时,标准偏差为 2 小时。考虑与新治疗相关的平均 MWT 降低的假设。相对于这一假设,方差不等的 95%独立组置信区间说明了什么?(因为每组有如此多的观察值,所以用 Z 分位数代替 t 分位数。)
假设我们按照这个顺序减去(新系统—旧系统):

两个独立样本的置信区间公式
均值=新均值-旧均值= 4–6 =-2
z 得分= 1.96 95%的置信区间

st. error = sqrt((0。⁵ 99+ 99)/(100+100–2)) sqrt(1/100+1/100)
标准差= 0.205061
下界=-2–1.96 * 0.205061 =-2.40192
上界= -2+1.960.205061 = -1.59808**
置信区间= [-2.40192,-1.59808]
参考
【1】中心极限定理,定义及例题步骤简单,统计如何**
[2] 电力,统计,维基
【3】人择原理,百科
[4] 实验设计,维基百科
[5] 根本原因分析,百科
感谢阅读!
如果您喜欢这篇文章,请务必点击 订阅此处 或至我的 独家快讯 千万不要错过另一篇关于数据科学指南、技巧和提示、生活经验等的文章!
更多相关文章
一些亚马逊面试问题的演练!
towardsdatascience.com](/amazon-data-scientist-interview-practice-problems-15b9b86e86c6) [## 微软数据科学面试问答!
微软面试中一些数据科学问题的演练
towardsdatascience.com](/microsoft-data-science-interview-questions-and-answers-69ccac16bd9b) [## 更多微软数据科学面试问题和答案
微软面试中一些数据科学问题的另一个演练
towardsdatascience.com](/more-microsoft-data-science-interview-questions-and-answers-f9ee8337072c) [## 谷歌的数据科学面试脑筋急转弯
作为谷歌数据科学面试的一部分,他们喜欢问一些他们称为“解决问题”的问题…
towardsdatascience.com](/googles-data-science-interview-brain-teasers-7f3c1dc4ea7f) [## 数据科学家的 5 个常见 SQL 面试问题
帮助您发展 SQL 技能,在任何面试中胜出
towardsdatascience.com](/5-common-sql-interview-problems-for-data-scientists-1bfa02d8bae6)***
41 个问题来测试你对 Python 字符串的了解
如何通过掌握字符串基础来碾压算法题

我在 LeetCode 和 HackerRank 上做算法题的时候已经开始跟踪最常用的函数了。
成为一名优秀的工程师并不是要记住一门语言的功能,但这并不意味着它没有帮助。尤其是在面试中。
这是我的字符串 cheatsheet 转换成一个问题列表来测试自己。虽然这些不是面试问题,但是掌握这些将帮助您更轻松地解决现场编码问题。
你对 Python 字符串了解多少?
1.如何确认两个字符串具有相同的身份?
如果两个名字指向内存中的同一个位置,is操作符返回True。这就是我们谈论身份时所指的。
不要把is和==,混淆,后者只测试平等性。
animals = ['python','gopher']
more_animals = animalsprint(animals == more_animals) #=> True
print(animals is more_animals) #=> Trueeven_more_animals = ['python','gopher']print(animals == even_more_animals) #=> True
print(animals is even_more_animals) #=> False
请注意上面的animals和even_more_animals虽然相等,但身份却不同。
此外,id()函数返回与名称相关联的内存地址的id。具有相同身份的两个对象将返回相同的id。
name = 'object'
id(name)
#=> 4408718312
2.如何检查字符串中的每个单词是否以大写字母开头?
istitle()函数检查每个单词是否大写。
print( 'The Hilton'.istitle() ) #=> True
print( 'The dog'.istitle() ) #=> False
print( 'sticky rice'.istitle() ) #=> False
3.检查字符串是否包含特定的子字符串
如果一个字符串包含子串,in操作符将返回True。
print( 'plane' in 'The worlds fastest plane' ) #=> True
print( 'car' in 'The worlds fastest plane' ) #=> False
4.在字符串中查找子字符串第一次出现的索引
有两个不同的函数将返回起始索引,find()和index()。他们的行为略有不同。
如果没有找到子串,则find()返回-1。
'The worlds fastest plane'.find('plane') #=> 19
'The worlds fastest plane'.find('car') #=> -1
index()会抛出一个ValueError。
'The worlds fastest plane'.index('plane') #=> 19
'The worlds fastest plane'.index('car') #=> ValueError: substring not found
5.计算字符串中的字符总数
len()将返回一个字符串的长度。
len('The first president of the organization..') #=> 19
6.计算字符串中特定字符的个数
count()将返回特定字符出现的次数。
'The first president of the organization..'.count('o') #=> 3
7.将字符串的第一个字符大写
使用capitalize()功能来完成此操作。
'florida dolphins'.capitalize() #=> 'Florida dolphins'
8.什么是 f 弦,你如何使用它?
f 字符串是 python 3.6 中的新特性,它使得字符串插值变得非常容易。使用 f 弦类似于使用format()。
f 弦在开盘价前用一个f表示。
name = 'Chris'
food = 'creme brulee'f'Hello. My name is {name} and I like {food}.'
#=> 'Hello. My name is Chris and I like creme brulee'
9.在字符串的特定部分搜索子字符串
index()还可以提供可选的开始和结束索引,用于在更大的字符串中进行搜索。
'the happiest person in the whole wide world.'.index('the',10,44)
#=> 23
注意上面是如何返回23而不是0。
'the happiest person in the whole wide world.'.index('the')
#=> 0
10.使用 format()将变量插入字符串
format()类似于使用 f 弦。虽然在我看来,它对用户不太友好,因为变量都是在字符串的末尾传入的。
difficulty = 'easy'
thing = 'exam''That {} was {}!'.format(thing, difficulty)
#=> 'That exam was easy!'
11.检查字符串是否只包含数字
如果所有字符都是数字,则isnumeric()返回True。
'80000'.isnumeric() #=> True
注意标点符号不是数字。
'1.0'.isnumeric() #=> False
12.拆分特定字符上的字符串
split()函数将在给定的一个或多个字符上拆分一个字符串。
'This is great'.split(' ')
#=> ['This', 'is', 'great']'not--so--great'.split('--')
#=> ['not', 'so', 'great']
13.检查字符串是否全部由小写字符组成
仅当字符串中的所有字符都是小写时,islower()才返回True。
'all lower case'.islower() #=> True
'not aLL lowercase'.islower() # False
14.检查字符串中的第一个字符是否小写
这可以通过在字符串的第一个索引上调用前面提到的函数来完成。
'aPPLE'[0].islower() #=> True
15.Python 中的字符串可以加整数吗?
在一些语言中这是可以做到的,但是 python 会抛出一个TypeError。
'Ten' + 10 #=> TypeError
16.反转字符串“hello world”
我们可以将字符串拆分成一个字符列表,反转列表,然后重新组合成一个字符串。
''.join(reversed("hello world"))
#=> 'dlrow olleh'
17.将一系列字符串合并成一个字符串,用连字符分隔
Python 的join()函数可以连接列表中的字符,在每个元素之间插入一个给定的字符。
'-'.join(['a','b','c'])
#=> 'a-b-c'
18.检查字符串中的所有字符是否都符合 ASCII
如果字符串中的所有字符都包含在 ASCII 码中,isascii()函数返回True。
print( 'Â'.isascii() ) #=> False
print( 'A'.isascii() ) #=> True
19.整个字符串大写或小写
upper()和lower()返回所有大写和小写的字符串。
sentence = 'The Cat in the Hat'sentence.upper() #=> 'THE CAT IN THE HAT'
sentence.lower() #=> 'the cat in the hat'
20.字符串的第一个和最后一个大写字符
像在过去的例子中一样,我们将针对字符串的特定索引。Python 中的字符串是不可变的,所以我们将构建一个全新的字符串。
animal = 'fish'animal[0].upper() + animal[1:-1] + animal[-1].upper()
#=> 'FisH'
21.检查字符串是否全部大写
类似于islower(),isupper()仅在整个字符串大写时返回True。
'Toronto'.isupper() #=> False
'TORONTO'.isupper() #= True
22.什么时候使用 splitlines()?
splitlines()在换行符处拆分字符串。
sentence = "It was a stormy night\nThe house creeked\nThe wind blew."sentence.splitlines()
#=> ['It was a stormy night', 'The house creeked', 'The wind blew.']
23.举一个字符串切片的例子
分割一个字符串需要 3 个参数,string[start_index:end_index:step]。
step是字符应该返回的间隔。所以步长 3 将在每第三个索引处返回字符。
string = 'I like to eat apples'string[:6] #=> 'I like'
string[7:13] #=> 'to eat'
string[0:-1:2] #=> 'Ilk oetape' (every 2nd character)
24.将整数转换为字符串
为此使用字符串构造函数str()。
str(5) #=> '5'
25.检查字符串是否只包含字母表中的字符
如果所有字符都是字母,则isalpha()返回True。
'One1'.isalpha()
'One'.isalpha()
26.替换字符串中子字符串的所有实例
不导入正则表达式模块,可以使用replace()。
sentence = 'Sally sells sea shells by the sea shore'sentence.replace('sea', 'mountain')
#=> 'Sally sells mountain shells by the mountain shore'
27.返回字符串中的最小字符
大写字符和字母表中较早的字符具有较低的索引。min()将返回索引最低的字符。
min('strings') #=> 'g'
28.检查字符串中的所有字符是否都是字母数字
字母数字值包括字母和整数。
'Ten10'.isalnum() #=> True
'Ten10.'.isalnum() #=> False
29.移除字符串左侧、右侧或两侧的空白
lstrip()、rstrip()和strip()删除字符串末尾的空格。
string = ' string of whitespace '
string.lstrip() #=> 'string of whitespace '
string.rstrip() #=> ' string of whitespace'
string.strip() #=> 'string of whitespace'
30.检查字符串是以特定字符开头还是结尾?
startswith()和endswith()检查字符串是否以特定的子字符串开始和结束。
city = 'New York'city.startswith('New') #=> True
city.endswith('N') #=> False
31.将给定的字符串编码为 ASCII
encode()用给定的编码对字符串进行编码。默认为utf-8。如果一个字符不能被编码,那么抛出一个UnicodeEncodeError。
'Fresh Tuna'.encode('ascii')
#=> b'Fresh Tuna''Fresh Tuna Â'.encode('ascii')
#=> UnicodeEncodeError: 'ascii' codec can't encode character '\xc2' in position 11: ordinal not in range(128)
32.检查所有字符是否都是空白字符
isspace()仅当字符串完全由空格组成时才返回True。
''.isspace() #=> False
' '.isspace() #=> True
' '.isspace() #=> True
' the '.isspace() #=> False
33.一个字符串乘以 3 是什么效果?
该字符串被连接在一起 3 次。
'dog' * 3
# 'dogdogdog'
34.将字符串中每个单词的第一个字符大写
title()将字符串中的每个单词大写。
'once upon a time'.title()
35.连接两个字符串
附加运算符可用于连接字符串。
'string one' + ' ' + 'string two'
#=> 'string one string two'
36.举一个使用 partition()函数的例子
partition()在子字符串的第一个实例上拆分字符串。返回拆分字符串的元组,但不移除子字符串。
sentence = "If you want to be a ninja"print(sentence.partition(' want '))
#=> ('If you', ' want ', 'to be a ninja')
37.Python 中字符串不可变是什么意思?
string 对象一旦创建,就不能更改。“修改”该字符串会在内存中创建一个全新的对象。
我们可以用id()函数来证明。
proverb = 'Rise each day before the sun'
print( id(proverb) )
#=> 4441962336proverb_two = 'Rise each day before the sun' + ' if its a weekday'
print( id(proverb_two) )
#=> 4442287440
串联‘ if its a weekday’在内存中用新的id创建一个新的对象。如果对象实际上被修改了,那么它会有相同的id。
38.定义一个字符串两次(与两个不同的变量名相关联)会在内存中创建一个还是两个对象?
比如写animal = 'dog'和pet = 'dog'。
它只会创造一个。我第一次遇到它时就发现这不直观。但这有助于 python 在处理大字符串时节省内存。
我们将用id()来证明这一点。注意两者有相同的id。
animal = 'dog'
print( id(animal) )
#=> 4441985688pet = 'dog'
print( id(pet) )
#=> 4441985688
39.举一个使用 maketrans()和 translate()的例子
maketrans()创建从字符到其他字符的映射。然后应用这个映射来翻译字符串。
# create mapping
mapping = str.maketrans("abcs", "123S")# translate string
"abc are the first three letters".translate(mapping)
#=> '123 1re the firSt three letterS'
注意上面我们是如何改变字符串中每个a、b、c和s的值的。
40.从字符串中删除元音
一种选择是通过列表理解来迭代字符串中的字符。如果它们与一个元音不匹配,那么将它们重新组合成一个字符串。
string = 'Hello 1 World 2'vowels = ('a','e','i','o','u')''.join([c for c in string if c not in vowels])
#=> 'Hll 1 Wrld 2'
41.什么时候使用 rfind()?
rfind()类似于find(),但是它从字符串的右边开始搜索,并返回第一个匹配的子字符串。
story = 'The price is right said Bob. The price is right.'
story.rfind('is')
#=> 39
结论
正如我经常向一位老产品经理解释的那样,工程师不是存储方法的字典。但是有时候少点谷歌可以让编码更加无缝和有趣。
我希望你粉碎了这个。
如果你觉得太容易了,你可能会对我的另一篇文章感兴趣, 54 个 Python 面试问题。
45 对 KMeans 和 KMedoids 无监督学习聚类的广泛研究的观察
在数据集中发现模式或聚类是人类智能的基本能力之一。如果我们要接近或超过人类的智能,我认为它必须是半监督学习,或者更好的是,无监督学习。我对选择无监督学习聚类模型的“最佳实践”并不满意。利用机器学习框架 Photonai ,我们探索了 KMeans 和 KMetroids 集群模型的异同。我们改变聚类数、每个聚类的点数、聚类大小和目标聚类形状。最后,我们尝试在一个“真实世界”数据集上进行聚类。

k 是指以各种细胞计数密度对细胞(小球形斑点)进行计数。50 和 300 个细胞的细胞计数为-2%。1000 个细胞的细胞计数为+6.5%。瑞秋·科特曼的动画
k 均值和k 均值聚类模型比较的目的
理解、评估和利用已识别聚类的最基本步骤是对它们进行定量比较。—来自
聚类是理解复杂数据的最通用的方法之一。集群的一个关键方面…
www.nature.com](https://www.nature.com/articles/s41598-019-44892-y)
上面的引用触及了我们为什么从比较kme means和 KMedoids 集群开始的核心。
我们可以一起对广泛的 KMeans 和 KMetroids 星团模型进行广泛的成对研究。我们想要观察这些聚类模型之间的差异和相似之处。
此外,我们希望在未来用其他聚类模型完成类似的广泛研究。我们尝试回答以下任何一个问题。
- 我们能开发一个区分每个聚类模型的观察结果的“备忘单”吗?
- 我们能否查看数据并缩小我们应该使用的聚类模型的选择范围?
- 在我们研究的某个阶段,我们能找到一个元算法或一套规则来选择一个聚类模型吗?
- 我们的研究能指导我们得到更好的聚类模型吗?
我们的答案可能是 对这些问题的部分或全部 不。然而,我们不会放弃;无监督学习聚类模型是一个活跃的研究领域。
我们将一起探讨这些问题。让我们看看我们走了多远。
什么是集群?
“恩恩德的伯德和色弗洛克和弗赖在一起。——威廉·特纳(公元 1545 年)《拯救罗米什·福克斯》
物以类聚,人以群分。(近似现代英语翻译)
根据相似性将事物分成不同的组是一种古老的能力。它可能早于自我意识,因为史前生命会对太阳或不太阳做出反应,然后吃或不吃。
通常(也许总是),聚类是一个无监督的机器学习问题。数据没有标签(无监督)来将数据点划分为聚类。
聚类通过数据特征的相似性来区分。
我们需要一个例子!好吧,狗、猫和灰鲸怎么样。我们最初的猜测是有三个不同的集群。
如果你有两个特征:长度和体重,那么狗和猫的数据点聚类由于高度重叠而不明显。在猫狗群里,大型犬也有异常值。(好吧,我猜狮子可以算是大型家猫。)数据点的灰鲸群集明显地与狗-猫群集分开。
据我所知,任何聚类模型都会找到两个聚类。
你可能会说:错了!如果你这样做了,那是因为你使用了比长度和重量更多的特征来区分一群猫和一群狗。
想象一个二维图,其中纵轴是长度测量值,横轴是重量测量值。您可能会得到两个不同的聚类,其中成对的点(任意两点的对)距离是数据点的二维(2-D)向量长度,坐标为长度和权重。
你可能想在狗-猫-灰鲸聚类任务中使用缩放。(我们稍后将讨论缩放。).然而,如果长度和重量都放在一个范围从 0.0 到 1.0 的单位轴上,它仍然不会将狗-猫聚类分开。
例如,如果我们有细菌、老鼠和灰鲸,以及两个特征:长度和重量,我们将得到不同的集群(在双对数图上)。
观察#1:为您的聚类选择一组可测量的区别特征是至关重要的。
观察#2:(有时)如果你改变可测量的特征的数量,你就改变了你观察的集群的数量。
注意:观察#2 不是一个“硬性规定”。在上面的两个例子中,您能想到哪些特性会或不会创建更多的集群吗?
注:之所以称之为 无监督 学习,是因为你应该而不是监督 学习。没有监督,在某种程度上, 没有 很难做到。如果你以任何方式监督,,你可以引入隐藏的偏见和假设。
例如,将对象聚类成是而不是一个比萨饼切片严重偏向于特征选择,以至于它是监督的学习,即使你使用传统的非监督的模型。
观察#3:从一组可衡量的显著特征开始。聚类之后,在改变可测量的特征时要小心。这可能是监督,应该记录下来。
注意:在两个阵营中有一个很大的争论,我称之为"实干"阵营和"纯粹主义"阵营。在这篇文章中,我使用了“纯粹主义者”的 camp 方法。然而,我有时会在现实世界或游戏竞赛中加入“努力完成”阵营。我(试图)用前者来证明我的假设。
欢迎你采用你自己的立场作为“完成”“纯粹主义者”或者其他完全不同的阵营。
什么是相似?
我们可以引入术语相似度,它(通常)是两个数据点(对)之间的距离。在上面的例子中,每个数据点都是测量的长度和重量。
我们发现,根据相似性的定义,即数据点对越接近,它们具有越高的相似性分数。相距较远的数据点对具有较低的相似性得分。
观察#4:如果相似度是两个数据点之间距离的度量,那么我们就不能使用范畴特征。分类值的值是不明确的。
星期一离星期二有一天的距离还是六天的距离?a 卡是 0 还是 1 还是 11 还是最高?这取决于你玩的游戏。
注意:在以后的文章中,我们将发现将分类特征转换成连续特征的方法。我们还将讨论将连续特征转换为分类特征的方法。
他们定义聚类模型距离的方式不同吗?
是的,有不同的方法来定义距离。如何定义或测量数据点之间的距离通常决定了分类模型。
对于本文,我们使用欧几里德距离,距离= sqrt(x + y)。
k - < x >系列,其中 KMeans 和 KMedoids 是其成员,要求距离不同。如果是差异的,那么优化器会使 k - < x >系列成为现有的执行速度最快的集群模型之一。
注意:k 表示有多种变化。如 KMedian ,组成 k - < x >家族。
注意:微分是微积分的一部分。理解这篇文章的任何部分都不一定要知道区分的机制。有许多优化版本的 k - < x >系列,你不需要关心实现。
注意:我们在这项研究中集中使用 k - < x >家系。
什么是休伯特和阿拉比调整后的兰德指数(HAARI)?
我们在预测的数据点聚类标签和实际的“真实的”数据点聚类标签之间测量聚类算法的“优度”。
数据点标签数量正确预测与T30地面数据点标签数量之比就是精度。
*accuracy* = (*correct-predicted)/ground-truth*
我们测量聚类标签的预测有多好。尽管如此,无监督的学习,因为我们不是用基本事实标签训练聚类模型。
我们需要一个比数据点分配(准确性)更好的度量来比较聚类结果。我们可以使用的第一个指标是休伯特和阿拉比调整后的兰德指数(HAARI) 。
k-
- 一个数据点只能位于一个群集中;
- 每个聚类中的数据点数量必须相同;
- 并且每个簇必须具有相同的大小。
用人工数据集创建者,make-blobs,
- 每个数据点被分配给一个聚类;
- 每个聚类可以具有相同数量的数据点;
- 并且每个簇具有相同的大小。
在一个调用配置中使用make-blobs,,我们不会陷入 HAARI 的偏差陷阱。然而,使用make-blobs,使用不同的调用配置,我们会违反偏差#2 和#3..
HAARI 从精度中减去给定聚类的数据点随机分配。HAARI 使用超几何分布作为随机性(噪声)的模型。
注意:使用超几何分布,假设基础数据点分布近似为高斯形状。自然过程产生的数据的良好近似值,其数据点计数相对大于聚类计数 20 倍或更高。换句话说,如果每个聚类至少有二十个数据点。(中心极限定理)。
数学课上的概率问题,你需要的概率要么给你,要么相对容易…
towardsdatascience.com](/hypergeometric-distribution-explained-with-python-2c80bc613bf4)
想象掷一枚硬币,它的边数不是 2 而是当前的簇数。抛硬币。它着陆,面朝上的一侧是分配的群集标签。
注意:如果一便士是两面的(抵制一个糟糕的双关语),那么超几何分布就变成了二项式解。
总之, HAARI 是测量预测聚类标签的“优度”与减去了“随机噪声”**的“真实值”聚类标签的比率。警告:如果哈里的已知偏差不适用。
注意: HAARI 范围在 0.0(随机)到 1.0(完美)之间。
注意:其他 xARIs 使用其他随机性分布。
注意: HAARI 分数可能会因随机分配的种子而略有不同。
你可以在这里详细阅读关于 HAARI 的。
注:
*sklearn.metrics.ari*不执行休伯特和阿拉比调整后的兰德指数( HRARI ) 。
什么是以元素为中心的相似性(ECS)聚类指标?
一种纠正聚类比较中偏差的方法是在聚类的随机集合的背景下考虑聚类相似性。这种机会纠正使用由随机模型指定的聚类之间所有成对比较的预期相似性来建立基线相似性值。然而,机会修正方法有严重的缺点 : (i) 它强烈依赖于为聚类假设的随机模型的选择,这通常是高度不明确的,以及(ii) 没有提出用于重叠或分层聚类的随机模型…来自
聚类是理解复杂数据的最通用的方法之一。集群的一个关键方面…
www.nature.com](https://www.nature.com/articles/s41598-019-44892-y)
上面的引用来自发明 HAARI 的一些人。他们提出了一个比 HAARI 更健壮的聚类指标,这并不奇怪。
我将这个新的度量标准称为 ECS。
以元素为中心的相似性( ECS )聚类度量比 HAARI 具有更少的偏差。当我们使用make-blobs时,当我们没有触发 HAARI 偏差,因此 HAARI 产生的分数应该接近 ECS 分数。
观察#5:群集度量 ECS 比 HAARI 具有更少的偏差,并且据报告 更好。T39
注意:25 个聚类指标需要标签,超过 5 个聚类指标不需要标签。一个优秀的计算集群度量的软件包是 clusim 。
注意:在此讨论中,我们仅使用 HAARI 和 ECS 。
什么是make-blobs?
我在回避一个有如下描述的数学。make-blobs创造n_features (or n_cluster),以N为中心。每个中心用n_samples (or n_data_points).创建一个数据点集群,每个点从中心以随机距离分布,随机距离选自标准偏差为cluster_std.的高斯(正态)分布
注:也许我应该用一个方程来解释?
注意:聚类中心的距离选自具有较大标准差(std)的高斯(正态)分布。
注意:距离= sqrt(x + y)
我们也可以用三个例子来回答make-blobs创造了什么。
- 没有每簇不同数据点的k-
族和 HAARI 偏差的触发。下面对 make-blobs的调用有 21 个集群,每个集群的标准差为 1.0,有 30 个数据点。
*from sklearn.datasets import make_blobs
data_X, data_y= make_blobs(n_samples=30, n_features=21, cluster_std=1.0, random_state=0)*
2.触发每簇不同数据点计数的k - < x >族和 HAARI 偏差。下面对make-blobs的调用有 3 个集群。第一个聚类的数据点数为 3,第二个聚类的数据点数为 30,第三个聚类的数据点数为 300。这 3 个聚类每个都有 1.0 的标准偏差。
*from sklearn.datasets import make_blobs
data_X, data_y= make_blobs(*n_samples=[3,30,300]*, n_features=3, cluster_std= 1.0, random_state=777)*
3.触发不同簇大小的k - < x >族和 HAARI 偏置。下面对make-blobs的调用有 3 个集群。第一个聚类的标准偏差为 0.3,第二个聚类的标准偏差为 0.66,第三个聚类的标准偏差为 1.0。每个集群中有 300 个数据点。
*from sklearn.datasets import make_blobs
data_X, data_y= make_blobs(n_samples=300, n_features=3, cluster_std=[0.3, 0.66, 1.0], random_state=777)*
注意:我们将处理人工数据和真实世界测量数据。在这两种情况下,聚类标签是已知的。
稍后我们将深入探讨kme means和 KMedoids 模型的方式(或许还有一点原因)。
现在,让我们找点乐子。
让我们通过以下方式来探索k 方法和k 方法
- 改变聚类的数量,并改变每次运行的数据点的数量。对于每次运行,每个聚类都有相同数量的数据点。我们不应该引发一个 k - < x >家族或者 HAARI 的偏见;
- 改变集群大小;我们触发了 k - < x >族和 HAARI 偏置,即每个簇必须具有相同的大小;
- 并且将簇的形状从圆形改变为椭圆形。给定"distance = sqrt(x+y)"measure 预测球状星团,我们会触发隐藏偏差吗?
改变每个聚类的数据点的数量和改变圆形聚类(斑点)的数量对聚类算法 KMeans 和 KMedoids 的影响
我们来看看kme means和 KMedoids 在改变数据点数量和聚类数量方面的表现。标准偏差( std )在第 1 和第 2 个动画图中为 0.3 std ,在第 3 和第 4 个动画图中为 1.0 std 。人造数据点是由make-blob创造的。
注意:std 决定了所形成的集群的包络的大小。

k 表示聚类,其中改变每个聚类的固定数据点,用于 std = 0.3 的 3 个聚类。瑞秋·科特曼的动画

对于 std = 0.3 的 3 个聚类,v 改变每个聚类的固定数据点计数的k 均值聚类表。
观察# n(1):k 意味着:数据点计数越高,斑点越圆。
簇中的点越多,由make-blobs创建的簇的圆形包络就越多。

**图中的k 表示对于 std = 0.3 的 21 个聚类,改变每个聚类的固定数据点计数。动画由 雷切尔·科特曼

对于 std = 0.3 的 21 个聚类,k 表示 聚类,改变每个聚类的固定数据点 t 计数。
观察# n1:k 意味着:数据点计数越高,斑点越圆。
观察# N2:k 均值:3 和 21 个聚类,std = 0.3,我们看到圆形聚类的良好分离,没有共享数据点。
注意:由于没有偏差触发,我们预计大小为
std = 0.3的k 均值的 HAARI 和 ECS 得分接近 1.0。

**图中的k 表示对于 std = 1.0 的 3 个聚类,改变每个聚类的固定数据点数进行聚类。动画由 雷切尔·科特曼 ≤

*表*k 表示 聚类,对于 std = 1.0 的 3 个聚类,改变每个聚类的固定数据点计数
观察# n3:k 意味着形状偏离圆形,簇重叠越多。**
观察#n4: 对于重叠的聚类,KMeans 的 HAARI 和 ECS 分数低于 1.0。

**图中的k 表示 聚类,对于 std = 1.0 的 21 个聚类,改变每个聚类的固定数据点计数。动画由 雷切尔·科特曼 制作

*表*k 均值 聚类,对于 std = 1.0 的 21 个聚类,改变每个聚类的固定数据点计数。
观察# n3:k 表示形状偏离圆形。群集重叠越多。**
观察#n4: KMeans 在聚类计数正确时,对于重叠的聚类,其 HAARI 和 ECS 得分低于 1.0。
观察# n5:k 均值具有 HAARI,并且当每个聚类计数的数据点为 21 时,ECS 分数低于 1.0。
观察#n6: 当每个聚类计数的数据点为 30 或更大时,k 均值的 HAARI 和 ECS 分值的值等于 0.1%。

图 KMediods 聚类,其中改变 std = 0.3 的 3 个聚类的每个聚类的固定数据点计数。瑞秋·科特曼的动画

KMediods 聚类表,对于 std = 0.3 的 3 个聚类,改变每个聚类的固定数据点计数。
观察#n7:当聚类被很好地分离并且不重叠时,KMedoids 具有 1.0 的 HAARI 和 ECS。

图KMediods聚类,对于 std = 1.0 的 3 个聚类,改变每个聚类的固定数据点计数。动画由 雷切尔·科特曼 制作

KMedoids 聚类表,针对 std = 1.0 的 3 个聚类,改变每个聚类的固定数据点计数。
观察#n8: KMedoids 当聚类没有很好地分离和重叠时,HAARI 和 ECS 得分低于 1.0。
我们可以理解较低的 HAARI 和 ECS 分数,因为 KMedoids 从数据集中选择质心。每个聚类的数据点计数越低,一个聚类具有也是该聚类的理想中间点的数据点的概率就越低。(仅对称形状的簇。)
观察#n9: KMedoids 有 HAARI 和 ECS 的值相差 1.5%到 7%。
推理同 观察#n(13)。 KMedoids 从数据集中选择一个质心。每个聚类的数据点计数越低,一个聚类具有也是该聚类的理想中间点的数据点的概率就越低。(仅对称形状的簇。)
观察#n10: KMedoids: T 数据点计数范围左端的低点计数效应和数据点计数范围右端的聚类重叠似乎为 ECS 分数彼此平衡。
我们观察到,随着数据点计数的增加, HAARI 低于 ECS,

图 KMediods 聚类,其中改变 std = 0.3 的 21 个聚类的每个聚类的固定数据点计数。瑞秋·科特曼制作的动画

表 KMedoids 聚类,每个聚类的数据点计数不同,有 21 个聚类,std = .3。瑞秋·科特曼的动画
观察#n11: KMeans 聚类模型,std =0.3,具有比 KMedoids ,std =0.3,聚类模型更高的 HAARI 和 ECS 分数。

图 KMediods 聚类,其中改变 std = 1.0 的 21 个聚类的每个聚类的固定数据点计数。由瑞秋·科特曼制作的动画

KMedoids 聚类表,对于 std = 1.0 的 21 个聚类,改变每个聚类的固定数据点计数。
观察#n12: KMeans 聚类模型,std =1.0,具有比 KMedoids ,std =1.0,聚类模型更高的 HAARI 和 ECS 分数。
观察 n13:对于 KMeans 和 KMediods 聚类模型,数据点越多,聚类计数对实际聚类计数越好,因此 HAARI 和 ECS 得分越高。
当有监督和无监督的机器学习被给予更多的数据点时,就有了更好的模型来预测未来的数据点。
观察#n14: KMeans 似乎比 KMedoids 有更高的 HAARI 和 ECS 分数。
如果【n14】的观测成立,我们将发现其他扰动,如星团的大小和形状。
各种圆形斑点簇大小对模型 KMeans 和 KMedoids 的影响。

图 表示对于基数 std=0.25 的 21 个集群,使用各种圆形斑点集群大小进行集群。瑞秋·科特曼的动画
聚类标准偏差(小标准偏差)为[0.2,0.45,0.55,0.63,0.7,0.75,0.84,0.86,0.91,. 95,1.0,1.03,1.07,1.10,1.14,1.17,1.2,1.23,1.26,1.29,1.32],导致不同的聚类大小。

对于基数 std=0.25 的 21 个聚类,具有各种圆形斑点聚类大小的k 均值聚类表。
观察# S1:**不同大小的簇上的 KMeans 比固定大小的簇上的 KMeans 具有更低的 HAARI 和 ECS 分数。

图 表示对于基数 std=0.50 的 21 个聚类,使用各种圆形斑点聚类大小进行聚类。瑞秋·科特曼的动画
聚类标准偏差是:[0.2,0.7,0.90,1.06,1.2,1.31,1.42,1.52,1.61,1.7,1.78,1.85,1.93,2.00,2.07,2.13,2.2,2.26,2.32,2.379,2.43]导致不同的聚类大小。

观察# S1:**不同大小的簇上的 k 均值比固定大小的簇上的 k 均值具有更低的 HAARI 和 ECS 分数。
观察# S2:**较大的不同大小的簇上的 k 均值比较小的不同大小的簇上的 k 均值具有较低的 HAARI 和 ECS 分数。

图 KMediods 对于基数 std=0.25 的 21 个聚类,使用各种圆形斑点聚类大小进行聚类。瑞秋·科特曼的动画
聚类标准偏差为 n_cluster_std [0.2,0.45,0.55,0.63,0.7,0.75,0.84,0.86,0.91,0.95,1.0,1.03,1.07,1.10,1.14,1.17,1.2,1.23,1.26,1.29,1.32],导致不同的聚类大小。

基 std=0.25 的 21 个聚类的具有各种圆形斑点聚类大小的 KMediods 聚类表。
观察#s3: 不同大小的簇上的 kmediod 比固定大小的簇上的 kmediod具有更低的 HAARI 和 ECS 分数。**

图 对基数 std=0.50 的 21 个聚类进行具有各种圆形斑点聚类大小的 KMediods 聚类。瑞秋·科特曼的动画
注意:标题框不正确。对于
N_points = 3, CLUSTERS_FOUND =19; N_points = 30, CLUSTERS_FOUND =21; N_points = 100, CLUSTERS_FOUND =15; N_points = 300, CLUSTERS_FOUND =17.
聚类标准偏差[0.2,0.7,0.90,1.06,1.2,1.31,1.42,1.52,1.61,1.7,1.78,1.85,1.93,2.00,2.07,2.13,2.2,2.26,2.32,2.38,2.43]导致不同的聚类大小。

基 std=0.50 的 21 个聚类的具有各种圆形斑点聚类大小的 KMediods 聚类表。
观察#s3: 不同大小的簇上的 kmediod 比固定大小的簇上的 kmediod 具有更低的 HAARI 和 ECS 分数。
观察# S4:**不同大小的簇上的较大的 kme dids 具有比较小的不同大小的簇上的kme dids更低的 HAARI 和 ECS 分数。**
每个椭圆形斑点的不同数量的数据点对聚类模型 k 均值和 k 均值的影响

数字k 表示对于 std = 0.3 的 3 个聚类,每个椭圆聚类的数据点计数变化*。瑞秋·科特曼的动画*

**表中的k 表示对于 std = 0.3 的 3 个群,每个椭圆群具有不同的数据点计数
观察#e1: 椭圆形聚类上的 k 均值将一些数据点分配给错误的聚类。**
观察#e2: 椭圆形簇上的 KMeans 比圆形相同大小簇上的 KMeans 具有更低的 HAARI 和 ECS 分数。
观察#e1 和观察#e2 源于基于距离的相似性,导致导出的聚类的圆形包络以质心为中心。
观察# E3:k 均值聚类随着预测的聚类形状偏离圆形而退化。

图k 表示对于 std = 0.3 的 21 个群,每个椭圆群的数据点数不同*。瑞秋·科特曼的动画*

对于 std = 0.3 的 21 个集群,每个椭圆集群具有不同数据点计数的k 均值表。
观察#e1: 椭圆形聚类上的 k 均值将一些数据点分配给错误的聚类。**
观察#e2: 椭圆形簇上的 KMeans 比圆形相同大小簇上的 KMeans 具有更低的 HAARI 和 ECS 分数。
观察# E3:k 均值随着集群形状偏离圆形而退化。
观察#e4: 计数为 21 的椭圆形簇上的 KMeans 比计数为 3 的较大椭圆形簇上的 KMeans 具有更低的 HAARI 和 ECS 分数。

**数字k 表示对于 std =1.0 的 3 个群,每个椭圆群具有不同的数据点计数。动画由 雷切尔·科特曼 制作

表k 均值* 对于 std =1.0 的 3 个聚类,每个椭圆聚类具有不同的数据点计数*
观察#e1: 椭圆形聚类上的 k 均值将一些数据点分配给错误的聚类。**
观察#e2: 椭圆形簇上的 KMeans 比相同大小的圆形簇上的 KMeans 具有更低的 HAARI 和 ECS 分数。
观察# E3:k 均值聚类随着聚类形状偏离圆形而退化。
观察#e5: 椭圆形簇上的 KMeans 比更大尺寸的椭圆形簇上的 KMeans 具有更低的 HAARI 和 ECS 分数。
观察#e6: KMeans 对具有三个数据点的椭圆形聚类预测了错误的聚类数。

**图k 表示对于 std = 1.0 的 21 个群,每个椭圆群具有不同的数据点数 动画作者 雷切尔·科特曼

表k 均值* 对于 std = 1.0 的 21 个聚类,每个椭圆聚类具有不同的数据点计数*
观察#e1: 椭圆形聚类上的 k 均值将一些数据点分配给错误的聚类。**
观察#e2: 椭圆形簇上的 KMeans 比圆形相同大小簇上的 KMeans 具有更低的 HAARI 和 ECS 分数。
观察# E3:k 均值聚类随着聚类形状偏离圆形而退化。
观察#e4: 具有 21 个聚类的椭圆形上的 k 均值比具有 3 个聚类的更大尺寸的椭圆形上的k 均值具有更低的 HAARI 和 ECS 分数。****
观察#e5: 椭圆形簇上的 KMeans 比更大尺寸的椭圆形簇上的 KMeans 具有更高的 HAARI 和 ECS 分数。

图 KMedoids 对于 std = 0.3 的 3 个群,每个椭圆群具有不同的数据点计数。瑞秋·科特曼的动画

对于 std = 0.3 的 3 个集群,每个椭圆集群具有不同数据点计数的 KMedoids 表
观察#e7: 椭圆形聚类上的 KMediods 将一些数据点分配给错误的聚类。
观察#e8: 椭圆形簇上的 kme dids的 HAARI 和 ECS 分数低于圆形相同大小簇上的kme dids。****
观察#e9: KMediods 聚类随着聚类形状偏离圆形而退化。
观察#e10: 具有 3 个簇的椭圆形上的 KMediods 比具有 3 个簇的更大尺寸的椭圆形上的 KMediods 具有更高的 HAARI 和 ECS 分数。

图 KMedoids 对于 std = 1.0 的 3 个聚类,每个椭圆聚类的数据点计数不同。瑞秋·科特曼的动画

对于 std = 1.0 的 3 个集群,每个椭圆集群具有不同数据点计数的 KMedoids 表。
观察#e7: 椭圆形聚类上的 KMediods 将一些数据点分配给错误的聚类。
观察#e8: 椭圆形簇上的 KMediods 比圆形、相同大小的簇上的kme ads具有更低的 HAARI 和 ECS 分数。**
观察#e9: KMediods 聚类随着聚类形状偏离圆形而退化。
观察#e10: 具有 3 个簇的椭圆形上的 KMediods 比具有 3 个簇的更大尺寸的椭圆形上的 KMediods 具有更高的 HAARI 和 ECS 分数。

对于 std = 1.0 的 21 个群,图 KMedoids 具有每个椭圆群的不同数据点计数。瑞秋·科特曼的动画

对于 std = 1.0 的 21 个集群,每个椭圆集群具有不同数据点计数的 KMedoids 表
观察#e7: 椭圆形聚类上的 KMediods 将一些数据点分配到错误的聚类。
观察#e8: 椭圆形簇上的 KMediods 比圆形、相同大小的簇上的 Kmeans 具有更低的 HAARI 和 ECS 分数。
观察#e9: KMediods 聚类随着聚类形状偏离圆形而退化。
观察#e11: 具有 21 个团簇的椭圆形状上的 KMediods 比具有 3 个团簇的更大尺寸的椭圆形状上的 KMediods 具有更高的 HAARI 和 ECS 分数。
观察#e12: 椭圆形上的 kme dids具有比 KMeans 更低的 HAARI 和 ECS 分数。**
什么是 Photonai?
Photonai 将 Scikit-Learn 和其他机器学习(ML)或深度学习(DL)框架与一个统一的范例相结合。 Photonai 采用 Scikit-Learn 的 Estimator和Transformer类方法架构。
Photonai 有元素,有 Photonai 术语即的意思是Estimator或Transformer,通过将前学习器和后学习器算法转换成带有参数签名的元素来减少人工编码和错误。元素的例子是数据清理器、定标器、估算器、类平衡器、交叉验证器、超参数调谐器和集成的几种选择。
Photonai 的一个很酷的架构特性是,它提供了一种无代码的方式来添加元素(如果元素可被 Python 调用)。我添加了聚类算法sklearn.cluster.KMeans和sklearn_extra.cluster.KMmediods。
PCA, t-SNE, K-Fold(cross-validation), hyperopt (hyper-parameter tuning), and StandardScaler (scaling)已经是注册的元素,我们可以在机器学习框架 Photonai 中自由使用。
所有这些不同的机器学习技术,比如PCA, t-SNE, K-Fold...,在参考资料部分的文章中都有详细的讨论。
Photonai 具有registry.list_available_elements()功能,逐项列出 Photonai 中所有当前可用的 元素 。
*from photonai.base.photon_elements import PhotonRegistry
registry = PhotonRegistry(custom_elements_folder=custom_elements_folder)
registry.activate()registry.list_available_elements()output ==>
PhotonCore
ARDRegression sklearn.linear_model.ARDRegression Estimator
AdaBoostClassifier sklearn.ensemble.AdaBoostClassifier Estimator
.
.
PhotonCluster
KMeans sklearn.cluster.KMeans Estimator
KMedoids sklearn_extra.cluster.KMedoids Estimator*
在群集模型中控制我们基于光的研究
*CLUSTER_ALGO = 'KMedoids'
C_SHAPE ='ellipse' # for cells C_SHAPE ='circle'
N_CLUSTERS = [21] # for cells N_CLUSTERS = [50,300, 1000]
CLUSTERS_STD = 0.3 # for cells CLUSTERS_STD = 0.1
N_P_CLUSTERS = [3, 30, 300, 3000] # for cells N_P_CLUSTERS = [5]
INNER_FOLDS = 5
OUTER_FOLDS = 5*
CLUSTER_ALGO确定使用哪个聚类模型。C_SHAPE确定聚类的形状和包含所有聚类的包络的形状。N_CLUSTER确定生成的簇的数量。CLUSTER_STD调节生成的簇的大小。N_P_CLUSTERS调节每个聚类的数据点数量。INNER_FOLDS确定进行超参数搜索的次数,这将产生由 t he 调整的 Rand 指数(ARI)确定的最佳超参数集。OUTER_FOLDS决定 ARI 的 K 倍交叉验证。这里 K 给定为OUTER_FOLDS.结果是 ARI 的均值和 std 。
通过将INNER_FOLDS 和OUTER_FOLDS 设置为三或更大,我们更有信心优化 KMeans 和 KMedoids 的拟合。聚类模型针对每次INNER_FOLDS*OUTER_FOLDS运行进行了超参数优化。
K-fold 交叉验证(CV) 通过将数据划分为多个折叠,并确保每个折叠都作为一个测试集,为这个问题提供了一个解决方案。来自…
评估机器学习模型可能非常棘手。通常,我们将数据集分成训练集和测试集…
medium.com](https://medium.com/datadriveninvestor/k-fold-cross-validation-6b8518070833)
这项研究使用的主要 Photonai 函数
本研究使用的所有代码都可以从 github 下载。
def hyper_cluster(cluster_name):
if C_SHAPE == 'ellipse' :
yield_cluster = yield_parameters_ellipse
else:
yield_cluster = yield_parameters
n_p_clusters = N_P_CLUSTERS
for data_X, data_y,n_cluster in yield_cluster(n_p_clusters):
simple_output('CLUSTER_ALGO:', CLUSTER_ALGO)
simple_output('C_SHAPE:',C_SHAPE)
simple_output('n_cluster:', n_cluster)
simple_output('INNER_FOLDS:', INNER_FOLDS)
simple_output('OUTER_FOLDS:', OUTER_FOLDS)
simple_output('n_points:', len(data_y))X = data_X.copy(); y = data_y.copy()
# DESIGN YOUR PIPELINE
settings = OutputSettings(project_folder='./tmp/')
my_pipe = Hyperpipe('batching',
optimizer='sk_opt',
# optimizer_params={'n_configurations': 25},
metrics=['ARI', 'MI', 'HCV', 'FM'],
best_config_metric='ARI',
outer_cv=KFold(n_splits=OUTER_FOLDS),
inner_cv=KFold(n_splits=INNER_FOLDS),
verbosity=0,
output_settings=settings)my_pipe += PipelineElement(cluster_name, hyperparameters={
'n_clusters': IntegerRange(floor(n_cluster*.7)
, ceil(n_cluster*1.2)),
},random_state=777)logger.info('Cluster optimization range:', floor(n_cluster*.7), ceil(n_cluster*1.2))
print('Cluster optimization range:', floor(n_cluster*.7), ceil(n_cluster*1.2))# TRAIN PIPELINE
my_pipe.fit(X, y)debug = Truey_pred=cluster_plot(my_pipe, X, n_cluster, PALLET)print(pd.DataFrame(my_pipe.best_config.items()
,columns=['n_clusters', 'k']))print('train','\n'
,results_to_df(my_pipe.results.metrics_train))
print('test','\n'
,results_to_df(my_pipe.results.metrics_test))# turn the ground-truth labels into a clusim Clustering
true_clustering = Clustering().from_membership_list(y)
kmeans_clustering = Clustering().from_membership_list(y_pred) # lets see how similar the predicted k-means clustering is to the true clustering# output all available similarity measures
row_format2 ="{:>25}" * (2)
for simfunc in sim.available_similarity_measures:
print(row_format2.format(simfunc, eval('sim.' + simfunc+'(true_clustering, kmeans_clustering)')))elsim = sim.element_sim(true_clustering, kmeans_clustering)
print("Element-centric similarity: {}".format(elsim))
如何获得 Photonai?
注意:我只给出了基于 Python- 的集群模型示例,但是这些集群模型在其他语言中也是可用的。
注意:Photonai 是一个公开发布包,我已经对它进行了修改,以包含集群模型。
如果你的机器学习项目涉及到聚类,你将需要使用我的 Photonai 代码。很快,我打算添加 xgboost 和 lightgbm 。你可以从可克隆的 GitHub 获得我的增强功能。我建议每月更新,因为 Photonai 是一个正在进行的项目。
注意:我已经服从了 Photonai 的外部 API 调用签名。
注 :当前文档仍然适用。我的改进只记录在代码和以前关于 中 的博客中。
注:所有改动我都写了测试。
您可以使用以下命令将 Photonai 1.3.0 放在本地项目目录中
git clone [https://github.com/bcottman/photon.git](https://github.com/bcottman/photon.git)
注:如果你愿意,你可以通过以下方式将光子包含在笔记本中:
import sys, o
old__file__ = !pwd
__file__ = !cd ../../../photon ;pwd
__file__ = __file__[0]sys.path.append(__file__)
print(sys.path)
os.chdir(old__file__[0])
!pwd
您将针对您的特定目录结构更改__file__ = !cd ../../../photon 。
注 : 光子有一个 **..photon/photonai/docker**,用于构建一个 Docker 容器。该目录中指定了两种不同的 Docker 虚拟环境。dev具有 Jupyter 和 Jupyter 扩展所需的包版本。此配置在以下章节中有详细说明:
[## 将 Jupyter 笔记本扩展添加到 Docker 映像
我们的 Jupyter Python 和 R 用户的 Docker 映像要求他们在每隔…之后设置他们的 Nbextensions 首选项
towardsdatascience.com](/adding-jupyter-notebook-extensions-to-a-docker-image-851bc2601ca3)
注意:你可以造一个重量更轻的 Docker 集装箱(test),没有 Jupyter ,而且是行李。该配置在中有详细说明
我们收到了大量关于 Docker 解决方案 0.0.2 版本的反馈。反馈有一个共同的主题:只有 R&D…
medium.com](https://medium.com/@dr.bruce.cottman/a-docker-solution-for-the-test-groups-use-cases-8e8ed6c28e11)
当您使用本文中的示例代码或您的基于的 photonai- 项目时,您可以通过使用两个 Docker 映像中的任何一个来省去安装 20 多个包和更改(破坏)您的环境的麻烦。
什么是 KMeans 聚类算法?
k 均值算法如下:
- 首先,我们随机初始化 k 个中心点,称为质心。
- 我们将每个数据点聚类标记到其最近的质心。然后,我们更新质心的坐标,这是到目前为止该聚类中包含的所有数据点的平均值(表示)。
- 我们对给定的迭代次数重复该过程,直到数据点的聚类分配不变为止。
Photonai 具有函数registry,该函数详述了一个元素 Photonai ,调用可更改的签名或超参数。
registry.info("KMeans")output ==>
----------------------------------
Name: KMeans
Namespace: sklearn.cluster
----------------------------------
Possible Hyperparameters as derived from constructor:
n_clusters n_clusters=8
init init='k-means++'
n_init n_init=10
max_iter max_iter=300
tol tol=0.0001
precompute_distances precompute_distances='auto'
verbose verbose=0
random_state random_state=None
copy_x copy_x=True
n_jobs n_jobs=None
algorithm algorithm='auto'
----------------------------------
什么是 KMedoids 聚类算法?
KMedoids 型号与 KMeans 型号有一个显著的区别。k 形心必须来自数据集中的任何数据点。
在 KMeans 中,质心是数据点的平均值,而在 KMediods 中,质心必须是数据点之一。有趣的是,一个簇中的数据点越多,越接近 HAARI 和 ECS 的得分 KMeans 和 KMdiods ( 中心极限定理 )。
KMedoids 的 Photonai 主叫签名为:
registry.info("KMedoids")
output ==>
----------------------------------
Name: KMedoids
Namespace: sklearn_extra.cluster
----------------------------------
Possible Hyperparameters as derived from constructor:
n_clusters n_clusters=8
metric metric='euclidean'
init init='heuristic'
max_iter max_iter=300
random_state random_state=None
----------------------------------
使用 KMeans 和 KMedoids 进行细胞( 圆形斑点 )计数
给医学实验室一个细胞样本,要求得到一个细胞计数。让我们看看 KMeans 和 KMedoids 在这项任务中表现如何。

数字k 表示各种细胞计数密度的细胞(小球形斑点)计数。瑞秋·科特曼的动画

k 表是指各种细胞计数密度的细胞(小球形斑点)计数。
英寸。

数字 KMedoids 细胞(小球形斑点)以各种细胞计数密度计数。瑞秋·科特曼的动画

各种细胞计数密度的 KMedoids 细胞(小球形斑点)计数表。
观察#cc2:在圆形细胞上,KMeans 的细胞计数误差小于 KMedoids 。
观察#cc3: KMediods 具有圆形细胞,计数范围从 1%到 16%。
观察#cc4: KMediods 不如 KMeans 对 圆形细胞计数可靠。
使用 KMeans 和 KMedoids 进行单元椭圆斑点计数

表k 表示细胞(小椭圆形斑点)在不同细胞计数密度下的计数。
观察# cc5:k 均值模型不应用于计数 椭圆形细胞计数。**

图 KMedoids 细胞(小椭圆形斑点)以各种细胞计数密度计数。瑞秋·科特曼的动画

不同细胞计数密度的水母细胞(小椭圆形斑点)计数表
观察#cc6: KMediods 模型不应用于计数 椭圆形细胞计数。
使用 KMeans 和 KMedoids 模型对 Isis 数据集进行聚类

图k 表示*模型对 Isis 数据集进行聚类。瑞秋·科特曼的动画*

Isis 数据集的 KMeans 模型聚类得分表。
上图显示了由 KMeans 聚类的原始 Isis 数据集。
Isis 数据集的特征(列)处于原始比例,因此由每个特征的值形成的轴具有不同的长度。
不同长度的轴形成一个椭球形状,我们知道k 意味着不擅长聚类。
Iris 数据集通过StandardScale,进行变换,使得每个特征具有相同的单位长度(范围),从 0.0 到 1.0。形成一个椭球体,所有轴的长度都相同。
观察# i1:k 均值模型聚类得分通过先用* StandardScaler.变换数据集来提高*
接下来,我们添加了 PCA (主成分分析)以将 5 个特征(5 维)Isis 数据集缩减为 2 个主轴(2 维)数据集。
观察#i2: PCA 没有改变k 均值模型聚类分数。**
观察# i3:k 均值模型未能找到 Isis 数据集的 3 个聚类。**
观察# i4:ECS 指标正确地测量了 3 个数据点集群分配中的 2 个。
观察#i5:添加 PCA 对这个 KMeanss 聚类没有影响。

图 KMedoids 模型聚类 Isis 数据集。瑞秋·科特曼的动画

Isis 数据集的 KMedoids 模型聚类得分表。
第一个显示了由 KMeans 聚类的原始 Isis 数据集。
Isis 数据集的要素(列)处于其单位比例,因此由每个要素的值形成的轴具有不同的长度。
不同长度的轴形成一个椭球形状,我们知道k 意味着不擅长聚类。
虹膜数据集通过StandardScaler, 进行变换,使每个特征具有相同的轴长,从而成为一个椭球体。
观察#i6: KMediods 模型聚类得分通过先用 StandardScaler.变换数据集来提高
接下来,我们添加了 PCA (主成分分析)以将 5 个特征(5 维)Isis 数据集缩减为 2 个主轴(2 维)数据集。
观察#i7: PCA 没有改变 KMediods 模型聚类分数。
观察#i8: KMediods 模型找不到 Isis 数据集的 3 个聚类。
观察#i9:应用缩放时,ECS 指标正确测量了 3 个数据点集群分配中的 2 个。
观察#i10: PCA 伤害这个 KMedoids 聚类。
资源
我从 35 年的多个项目的多语言编程中总结了这些技术。那里…
medium.com](https://medium.com/swlh/21-techniques-to-write-better-python-code-3029f6562483) [## 我的代码审查清单中的 17 项基本技术
现在是代码审查时间。你们中的一些人宁愿避免代码审查过程。无论你是编程新手还是…
medium.com](https://medium.com/@dr.bruce.cottman/seventeen-basic-techniques-from-my-code-review-checklist-8d5f0f7c4bbc) [## 如何有效地使用 t-SNE
一种流行的探索高维数据的方法叫做 t-SNE,是由范德马滕和辛顿提出的…
istill.pub](https://distill.pub/2016/misread-tsne/) [## 主成分分析
主成分分析是一种无监督学习类的统计技术,用于解释数据在高…
medium.com](https://medium.com/datadriveninvestor/principal-components-analysis-pca-71cc9d43d9fb) [## 交叉验证—为什么和如何
交叉验证在机器学习中的重要性
towardsdatascience.com](/cross-validation-430d9a5fee22) [## Python 中超参数优化。第二部分:远视。
在这个博客系列中,我将比较 python HPO 库。在阅读这篇文章之前,我强烈建议你阅读…
towardsdatascience.com](/hyperparameter-optimization-in-python-part-2-hyperopt-5f661db91324) [## 标准缩放器()
现在还是星期天,是#weeklypython 的时间了!
medium.com](https://medium.com/@yhpf/standardscaler-fd4bef76411d)
摘要
本文中 KMeans 和 KMedoids 、各种运行的所有笔记本都可以在这里找到。
当我用这些笔记本进行实验时,代码发生了变化。更先进的笔记本有:
我们进行了 45 次观察,总结如下:
- ECS 是比 HAARI 更健壮的聚类度量。
K-意味着优势
- 在大多数机器初学者课程中讲授;
- 比大多数其他聚类算法更快;
- 技术访谈中常见的实施问题。
- 适用于分离的、大小相等的球形集群,其中集群数为 50 或更少。
- 足以计数在培养物中均匀分布的细胞。
K-均值偏差
- 在非球形集群上性能不佳。
- 不同规模的集群性能不佳。
- 每个集群的不同数据点计数性能不佳。
- 群集未分离时性能不佳。
- Isis 数据集性能不佳。
K-Mediods 优势
- 没有。K-methods与 KMeans 在我们执行的所有实验中的性能相同或更差。
在以后的文章中,我们将探索凝聚、线索、光学、 DBSCAN 、 Birch 、深度学习集群模型,以及其他出现的模型。
我们将通过配对其他集群模型并比较它们的相似性和差异来继续这种乐趣。最后,我们将举行一场比赛,为给定数据集的给定可检测行为找到冠军聚类模型。
总之,我们希望在回答这些问题方面取得进展:
- 我们能开发一个观察的“备忘单”来区分每个聚类模型吗?
- 我们能否查看数据并缩小我们应该使用的聚类模型的选择范围?
- 我们能找到一个元算法,或者一套规则来找到或者选择一个集群模型吗?
- 我们的研究能指导我们得到更好的聚类模型吗?
接下来的研究,我们比较 Cure 和 DBSCAN 无监督学习聚类模型。
Cure 承诺解决 K- < x > 簇性能不佳,大小不一致或非球形簇。
DBS can(Den sity-basedspartialclustering ofaapplications withnoise)是最常见的聚类算法之一。我们将看到为什么(或为什么不)。
通过我们的第一项研究,我们开始了对无监督学习聚类模型的详细研究之旅。***
48 小时见成效:加州新冠肺炎模式背后的故事

图片来自 @cagovernor
你能想象在没有天气预报的情况下计划登陆日吗?没有吗?那么,如何在不预测疾病传播的情况下阻止其快速传播呢?这种情况是加利福尼亚州在州长纽瑟姆于 2020 年 3 月 19 日制定最初的新冠肺炎留在家中令的前几天发现自己的情况。
为了让事情有个背景,考虑一下那一周的世界状况。加州试图在一个他们只有部分的、不完整的和矛盾的信息的环境中理解新冠肺炎。当时,加州只有 18 人死亡,而美国死于该疾病的人数不到 500 人。中国政府已经隔离了武汉,意大利北部的医院人满为患,纽约市的医院正在争夺足够的床位。虽然旧金山已经制定了在家呆着的命令,但这种疾病的致命性尚不清楚,难以想象一个拥有 4000 万选民和第五大经济体的州会进入部分封锁状态。
加州实际上是盲目飞行。大规模测试不可用,因为 CDC 尚未批准测试,COVID 的模型存在许多问题。这些问题包括仅在总体州一级而不是在具体县一级的解决方案,没有预测社会距离等缓解措施如何影响疫情,没有对 ICU 床位和呼吸机等关键资源进行建模。
在两天内,一群来自加州公共卫生官员、约翰霍普金斯大学流行病学家和硅谷工程师的乌合之众聚集在一起,改造并实施了一个相对复杂的疫情模型——提供了一个关于政策干预如何影响传播和分配 ICU 床位和呼吸机等关键资源的视线。这一信息有助于制定该国第一个居家命令的决定,研究显示,到 2020 年 4 月 6 日,T2 可能已经在加利福尼亚州避免了多达 170 万例病例。此外,该模型已被用于帮助许多州和国家政府,并迅速扩大规模,以便在国家一级提供快速预测。仅在 2020 年 5 月,它就使用了超过 1 亿个计算机小时进行预测。
该模型支持特定地理边界内的细粒度缓解方案,并计算感染预测和医院容量。举例来说,一种干预情景可能是适度的社会距离和城市地区学校停课四周,加上农村地区的遮光。人们可以通过与 CalCAT COVID 评估工具互动来了解这个政策制定工具的一部分。真正喜欢冒险的人可以仔细阅读模型源代码,它是开源的。

CalCAT COVID 评估工具的屏幕截图
2020 年 3 月 16 日,在留在家中的决定发布前四天,加州拥有的只是过时的内部预测和来自外部研究实验室的有限的州级预测。我们的团队最初由来自加州政府的代表以及一些硅谷志愿者技术专家组成。幸运的是,一位州流行病学家与约翰霍普金斯大学彭博公共卫生学院有联系,那里的传染病动力学小组设计了一个 COVID 模型,这是我们的最佳选择。它将允许我们开发县一级的预测,并创建不同的情景,如在家订单的遵守率。不幸的是,该模型没有针对加州的人口统计数据进行调整,并且花费了半天多的时间进行计算,这耗费了宝贵的时间来应对呈指数增长的病毒。我们需要一个加州每个县的模型,它能足够快地计算并随着疾病的发展而改进,并且能以我们能想到的最快速度测试各种情况。
我们已经被剥夺了睡眠,我们设定 48 小时为交付第一批结果的最后期限,这反映了快速发展的疫情所必需的紧迫性。在这些时间限制下,我们必须快速识别角色和职责,并且每小时迭代一次。我们没有时间创建组织结构图;我们的主要目标是找到最有资格承担任务的人,然后尽我们所能支持他们。
到第一天晚上,我们已经建立了我们的团队,并设计了最初的可交付成果:如果指数增长继续不受抑制,加州将超过其医院容量多少,我们能做些什么?考虑到紧迫性,我们高度关注数量级差异,并确定了三种主要情景:不采取激烈措施的完全情景,这提供了一个上限;强制隔离的武汉式封锁,这在民主国家是不现实的,但提供了一个下限;还有一个折中的解决方案——旧金山式的部分封锁。那座城市几天前就开始了早期隔离。我们没有旧金山的数据,所以流行病学小组创造性地根据 1918 年西班牙疫情流感的堪萨斯城模拟了旧金山,这是第二好的可比数据。
软件团队优化了模型,并在云计算资源上执行了提升和转移,以将模拟扩展到数千台计算机上。
对 ICU 床位和呼吸机等关键公共卫生资源的需求进行建模和预测需要了解每家医院的能力。不幸的是,在搜索了各种政府机构后,我们得知这些数据并不存在。为了得到它,我们在短时间内建立了一个协调的程序,定期给医院打电话,并将这些信息捕获到电子表格中。整个努力类似于“流行病学奥林匹克”,团队在最高水平上应用了本科生所学的相同的著名流行病学技术和软件缩放原则。
在 2020 年 3 月 18 日星期三的傍晚,我们团队的模型产生了加州的第一组结果,我们将这些预测提交给了加州的 COVID 响应团队。这是决策者第一次看到这种粒度级别的模型,其含义非常可怕。第二天,州长纽瑟姆宣布了加州的居家命令。几个星期后,4 月 10 日,州长举行了一次记者招待会,向公众展示了这个模型,并吹捧建模的价值。
模型的预测区间相当大,这是一个挑战,而且有必要在任何政策反应中内化。我们对这种疾病的了解在不断提高,从了解传播媒介到住院结果,这将使估计更加精确。更重要的是,人类行为的变化会极大地影响任何疫情预测的结果,并且是一个巨大的随机因素。人类将改变他们的行为来支持任何预测的负面结果,使预测无效。
像所有好的模型一样,结果激发了丰富的讨论,并需要更深入的预测(例如,在哪些县我们应该鼓励使用口罩?).随着疫情的进展,政策问题也发生了变化,自那时以来,我们对模型进行了大量更新,并根据不断变化的局势,研究了新的和更复杂的情况。这些持续更新对于向政策制定者提供紧迫的相关信息是必要的,因为该模型继续为加利福尼亚州、其他州以及国际合作伙伴的政策决策提供信息。
特设加州新冠肺炎工作组由以下人员组成(按字母顺序排列):
- 文章作者: 萨姆·沙阿
- 志愿者:伊恩·张伯伦、凯瑟琳·卡明斯基、鲍勃·科彻、瑞安·麦考维、托德·帕克、DJ·帕蒂尔、基特·鲁道夫、萨姆·沙阿、乔希·威尔斯
- 加利福尼亚州 : 曼维尔·博拉,慈善院长,帕姆·哈斯,卡洛琳·诺德斯特龙,安德里亚·帕里奥特,亚当·里德黑德,艾米·童,杰森·瓦戈,迈克尔·威尔肯宁 &来自加州的扩展团队
- 约翰·霍普金斯传染病动态 : 胡安·登特·赫尔斯,雅各布·菲克斯尔,基拉·h·格兰茨,约书亚·卡明斯基斯蒂芬·a·劳尔,伊丽莎白·c·李贾斯汀·莱斯勒,汉娜·r·梅雷迪思,肖恩·a·特鲁洛夫
- EPFL : 约瑟夫·勒迈特
- 犹他大学: 林赛·基冈
- 亚马逊网络服务 : 皮埃尔-伊夫·阿奎兰蒂,卡希克·拉曼,阿伦·苏布拉马尼扬,格雷戈·瑟萨姆,安·特兰
用 Kepler.gl 实现 4D 数据可视化
数据可视化
教程 Kepler.gl 以新冠肺炎数据集为例显示时态数据

在 Kepler.gl 中可视化德国新冠肺炎数据(作者)
Kepler.gl is 是优步于 2018 年推出的一款针对大规模数据集的强大开源地理空间分析工具。它是数据科学家探索和分析地理空间数据的绝佳工具。
在本文中,我将展示一个非常简短的教程,介绍如何准备和可视化四维数据:位置(纬度、经度、高度)和时间。例如,下图显示了德国一段时间内新增新冠肺炎确诊病例数的可视化示例:

在 Kepler.gl 中可视化德国新冠肺炎数据(作者—来自 RKI 的数据集)
第一步。数据准备📝
为了在 2D/3D 地图上可视化数据,我们需要确保我们的数据包含纬度和经度的地理空间字段,以映射每一行数据。如果数据源是 shapefile、geojson 这样的地理空间格式,那么我们就不需要担心这个问题。但是,如果它是表格格式并且没有地理空间字段,那么我们可以在 GIS 软件中运行地理编码器,或者使用一些地理编码器脚本,如 Python 和地理编码器库,如下例所示:
***import* geocoder
g = geocoder.google('Stuttgart', key="<Your Google API Key>")
print(g.latlng)** >> [48.7758459, 9.1829321]
或者,您也可以运行使用 GeoPandas 来完成这项工作。数据集中的日期/时间列是可选的,它允许应用程序显示及时的数据。例如,我从 RKI 下载了德国新冠肺炎数据集。(从此处下载)然后准备如下所示的数据集:

Cleaned _ RKI _ covid 19 _ Dataset . CSV(作者—来自 RKI 的数据集)
第二步。将数据集加载到 Kepler.gl🔃
这一步很简单。我们可以简单地将准备好的数据集拖放到中。csv 、。json ,或。geojson 到 Kepler.gl 应用程序中。或者,如果您是 Python 和 Jupyter 的爱好者,那么您可以在将熊猫加载到开普勒地图之前,将它们加载到您的轻松加载数据集。
**from keplergl import KeplerGl
import pandas as pd****map = KeplerGl(height=500)
df = pd.read_csv(f'<your dataset>')
#...........................................
#... pandas data manipulation if needed ....
#...........................................****map.add_data(data=<df_cleaned>, name='<data_named>')**
第三步。开普勒地图设置🔨
现在,让我们来看看开普勒地图吧!😊
- 选择你想要的地图类型(在上面的第一个 gif 例子中,我使用了 Hexbin)

开普勒. gl 中的图层类型(作者)
- 定义位置(纬度/经度)列。
- 指定颜色主题、比例、选定列的聚合方法、过滤器和不透明度。

Kepler . GL 中的颜色设置(作者)
- 调整网格大小,开普勒会自动为你聚合数据!

在 Kepler.gl 中调整网格大小(作者)
- 启用基于选定列的高度。在本例中,我选择通过对新冠肺炎案件编号求和来汇总数据。

在 Kepler.gl 中调整网格高度属性(作者)
- 最后,让我们通过添加图层过滤器并选择日期/时间列来启用时态可视化。然后,我们将得到动画地图,显示随着时间的推移,网格高度的新冠肺炎案件。🎉🎉

启用 Kepler.gl 中的时间过滤器(作者)
结论:
本文展示了如何使用 Kepler.gl 在 4D 可视化和浏览数据集的分步教程。您可以使用 Kepler.gl 来体验许多功能,如热点图图层、旅行图层等。在 https://kepler.gl/检查一下。我希望你喜欢这篇文章,并发现它对你的日常工作或项目有用。如果您有任何问题或意见,请随时给我留言。
关于我&查看我所有的博客内容:链接
安全健康健康!💪
感谢您的阅读。📚
Itertools 中的 5 个高级函数简化了 Python 中的迭代

使用 itertools 模块,使一些复杂的迭代变得更加容易
介绍
干燥原则
一个基本的编码原则是 DRY (即不要重复自己),这也适用于 Python 编程。例如,假设我们需要处理一系列具有相同数据结构的 csv 文件。如果没有实现 DRY 原则,我们可能需要编写一些 Python 代码,如下所示。
没有干燥原理的重复操作
如你所见,由于违反了 DRY 原则,我们无法重用代码的某些部分。此外,当需要改变每个文件的操作时,我们必须更新程序中的多个地方,这是一个容易出错的过程。
下面的代码怎么样?它用上面的代码做了完全相同的事情,但是更加简洁。
根据干燥原理重复操作
代码不仅通过组合所有单个文件的公共操作而具有更好的可读性,而且具有更好的可维护性,因为如果以后我们决定对每个文件进行不同的操作,我们只需更改一个地方的代码。
如您所知,这段代码利用了 Python 中实现的迭代特性,这是一个遵循 DRY 原则的良好实践。迭代背后的基本思想是为特定序列的单个项目提取公共动作,这被称为可迭代的(关于可迭代的更多信息,请参考我以前关于这个主题的文章。
内置迭代函数
如上面的最后一段代码所示,我们通常使用for循环来实现迭代,这使得我们可以方便地遍历可迭代对象来执行特定的操作。下面是一些在大多数情况下各种用法的例子。
内置迭代函数
如上面的代码片段所示,除了使用range()的基本迭代,我们还利用三个关键函数,包括enumerate()、reversed()和zip(),来改进我们的循环逻辑。要了解更多关于迭代中使用这些内置函数的技巧,你可以参考我以前关于这个主题的文章。
itertools 模块
在本文中,我将重点介绍五个高级函数,它们将在更复杂的场景中简化迭代。具体来说,我们将探索itertools模块。作为标准 Python 库的一部分,itertools模块提供了各种工具,允许我们高效地处理迭代器。
如果你想继续学习本教程,请先运行import itertools让这个模块在你的程序中可用。重要的是,为了提供适当的使用环境,您可以在以后自己参考,这些函数都有一个实际的例子。
accumulate()
这个函数accumulate(*iterable*[, *func*, ***, *initial=None*])通过指定func参数来构造一个迭代器,该迭代器返回二进制函数(即带有两个参数的函数)的累积结果。可选的initial参数是在输出 iterable 的开头设置一个额外的值。乍一看,这个函数可能听起来有点混乱,但是下面的例子将帮助您理解它。
假设你花 5 万美元买了一辆特斯拉汽车,月供 2000 美元,月息 0.3%。我们想跟踪每月的余额。下面的代码展示了我们如何使用accumulate()函数来实现这一点。需要注意的一点是,我们使用一个 lambda 函数,它正好接受两个参数,作为二元函数来处理连续的元素以产生累加的结果。
使用 accumulate()的迭代
The groupby()
这个函数groupby(*iterable*, *key=None*)接受一个 iterable 和一个 key,这个函数指定 iterable 中的元素应该如何分组。需要注意的一点是,如果元素没有事先排序,这个groupby()函数不会像您预期的那样使用 key 函数对元素进行分组。换句话说,在使用groupby()函数之前,通常需要使用相同的函数对 iterable 进行排序。
假设我们有一些新员工参加了他们的入职培训,我们想按他们姓氏的首字母对他们进行分组,这样他们就可以更快地签到以获得他们的徽章。下面的代码展示了我们如何使用groupby()函数来获得想要的结果。
使用 groupby()的迭代
The combinations()
这个函数combinations(*iterable*, *r*)接受一个 iterable 和一个整数,并返回长度为 r 的元素子序列。有一点需要注意,这些元组中元素的顺序将反映它们在初始 iterable 中的原始顺序。
假设我们有一些不同面值的硬币,我们想用一定数量的硬币找出所有可能的组合。眼熟吗?你说得对——我是从我 8 岁女儿的数学作业中得到这个想法的。请随意将代码用于您的内部辅导工作。
使用组合的迭代()
product()
这个函数product(**iterables*, *repeat=1*)接受一个或多个可迭代对象,并返回这些可迭代对象的笛卡尔积。这个函数非常像嵌套的for循环,它创建了一个迭代器来“展平”嵌套的循环。可选的repeat参数是为指定的数字重复唯一的输入迭代器。换句话说,product(a_list, repeat=3)与product(a_list, a_list, a_list)相同。
假设你将有一个侄子,你姐姐让你给这个男孩取名。我们知道他会姓汤普森。我们有两个名单,分别是名字和中间名。让我们找出可能的组合。最后,我们可能会选择约翰·埃利奥特·汤普森这个名字,因为 JET 这个首字母对一个男孩来说很酷:)
使用产品的迭代()
The permutations()
这个函数permutations(*iterable*, *r=None*)接受一个 iterable 和一个整数,并从 iterable 返回连续的 r 长度的元素排列。如果省略可选的r参数,该函数将返回指定 iterable 的所有可能排列。这个函数与combinations()相似,都产生元素的组合。区别在于顺序在permutations()函数中很重要,但在combinations()函数中不重要。请看下面的插图。
>>> numbers = [1, 2]
>>> print(list(itertools.combinations(numbers, 2)))
[(1, 2)]
>>> print(list(itertools.permutations(numbers, 2)))
[(1, 2), (2, 1)]
在一个实际的例子中,假设南美的四个国家在世界杯预选赛中处于同一组,我们想知道所有可能的比赛。每支球队都将与其他球队进行一场主场和客场比赛,因此每支球队配对的顺序至关重要。所以我们可能要用permutations()功能。
使用排列的迭代()
外卖食品
本教程向您展示了五个高级函数,我们可以用它们来简化我们在实际项目中可能遇到的一些复杂的迭代。当然,我们可以用自己的代码来实现这些迭代需求,但是可能需要复杂的逻辑来实现这些功能,并且我们的项目可能会因为涉及更多的代码而出现错误。因此,只要适用,我们应该考虑使用这些函数,因为它们已经被特别优化来处理各种迭代需求。
要加快你的项目进度,除了干原则,编程中的另一个原则就是不要多此一举!因此,学习 itertools 模块中的这些高级函数和更多函数,如其官方文档中所列,并在任何适用的时候使用它们。
附加阅读
感谢阅读这篇文章。这里有一些关于这个主题的额外读物供感兴趣的读者阅读。
几个可以改善循环逻辑的函数
medium.com](https://medium.com/better-programming/how-to-use-for-loops-better-in-python-1dfbc3d9e91f) [## 理解 Python 的迭代器和可迭代对象,并创建自定义迭代器
迭代是 Python 中最重要的概念之一。与迭代相关的两个术语是迭代器和…
medium.com](https://medium.com/swlh/understand-pythons-iterators-and-iterables-and-create-custom-iterators-633939eed3e7) [## itertools -为高效循环创建迭代器的函数- Python 3.8.2 文档
这个模块实现了许多受 APL、Haskell 和 SML 启发的构件。每个都是…
docs.python.org](https://docs.python.org/3.8/library/itertools.html)
5 个高级 Pytest 技巧
实践教程
Pytest 是一个非常强大的工具,但是很多项目没有利用它提供的所有特性。

作者图片
我们编写测试是因为它们帮助我们建立对代码的信心。它们还帮助我们编写干净和可维护的代码。然而,编写测试需要一些努力。幸运的是,我们可以利用一些库。例如,Pytest 附带了许多经常不被使用的便利特性。在这篇文章中,我将向你介绍其中的 5 种。
用 caplog 设备测试测井
有时,日志记录是您的功能的一部分,您希望确保以预期的日志记录级别记录正确的消息。
您可以利用一个名为 caplog 的内置设备。这个固定装置允许你访问和控制日志捕获。
让我们通过一个基本示例来看看它的实际应用。假设你有一个函数可以将一种语言中的动物名称翻译成另一种语言。如果翻译词典中缺少一种动物,您需要确保记录该动物,以便最终将其添加到词典中。
这里我们使用了record_tuples,一个由记录器名称、级别和消息组成的元组列表。这是一个简单的例子,但是你可以做得更好。
引发了测试异常
测试允许您验证代码在面临边缘情况时的行为。当涉及到边缘情况时,您经常会抛出异常。Pytest 帮助您验证异常是否如预期的那样被引发。
让我们用一个真实的例子来看看它是如何工作的。比方说,您想要编写一个 CLI 应用程序的身份验证层。验证电子邮件地址格式可能是个好主意。
您的 CLI 应用程序使用 Click ,这是一个帮助您更快构建 CLI 应用程序的包。Click 附带了很多便利的功能,比如通过输入进行输入验证。然而,电子邮件地址不是内置的点击类型,所以我们需要自己进行输入验证。我们将使用验证回调。
因此,您所要做的就是使用pytest.raises()上下文管理器,然后调用函数,Pytest 会处理剩下的事情!
测试时间相关函数
操纵日期总是困难的。编写测试可以给我们很大帮助。然而,当你调用像today()或now()这样的方法时,你会遇到测试依赖于时间的棘手情况。为了解决这个问题,你可以使用 pytest-freezegun 插件,而不是从标准库中打补丁。这个插件让事情变得简单。
又是一个例子的时候了!这一次,您需要实现一个函数来计算自用户订阅您的服务以来的天数。幸运的是,你已经阅读了这篇文章,并且知道了pytest-freezegun插件😉
用不同的参数组合测试相同的函数
大多数时候,您希望针对不同的输入来测试您的函数。在这种情况下,最简单的解决方案是为所有参数组合复制代码。但是,这不是一个好的做法,你应该避免这样做。假设你想对你的测试做一个小的调整,你需要复制你的代码多少次就复制多少次。第二,在性能方面,测试是顺序运行的,速度很慢。您可以并行执行。
避免这些常见问题的解决方案是使用参数化测试。让我们回到电子邮件验证的例子。你可能想过“很多情况没有覆盖”。嗯,我同意,是时候解决这个问题了!
看,你可以用pytest.mark.parmaetrize来描述你的输入,避免代码重复。
如果您运行这个测试,您将看到它失败了,这很好,因为它证明了我们的测试是有用的,并且有很好的覆盖率!
额外小费
因为你几乎一直读到最后,我想给你一个额外的提示来感谢你🙂
上一个例子中的一种情况导致测试失败。现在您想要更正代码并重新运行失败的测试。如果您有一个大型的测试套件,重新运行整个测试套件是非常耗时的。相反,您可以运行:
pytest --last-failed test_parametrized.py
它将只执行最后一个失败的测试,从而允许您快速迭代并修复那个 bug。一旦测试通过,不要忘记运行所有测试以避免任何回归。
结论
这是一个总结!Pytest 非常强大,一篇博文太短,无法涵盖所有特性。这是另一个教程的绝佳机会!🤗
参考
[1] Pytest 官方文档
[## 完整的 pytest 文档
测试中断言的编写和报告
docs.pytest.org](https://docs.pytest.org/en/stable/contents.html)
[2] Dane Hillard,有效的 Python 与 Pytest (2020),真正的 Python
[## 用 Pytest - Real Python 进行有效的 Python 测试
在本教程中,您将学习如何使用 pytest 将您的测试提升到一个新的水平。你将负责中级和…
realpython.com](https://realpython.com/pytest-python-testing/)
5 个高级 PyTorch 工具提升您的工作流程

从开发到生产
PyTorch 太棒了。自成立以来,它已经成为仅次于 TensorFlow 的领先深度学习框架之一。它的易用性和动态定义的性质在研究人员中特别受欢迎,他们能够比以往任何时候都更快地进行原型设计和实验。
从一开始,它就经历了爆炸性的发展,变得不仅仅是一个快速原型的框架。在这篇文章中,我的目标是向您介绍五种工具,它们可以帮助您使用 PyTorch 改进开发和生产工作流程。
为了给你一个快速的纲要,我们将看看这些。
- 挂钩
- PyTorch 闪电
- 量化
- 修剪
- TorchScript + JIT
钩住
首先,让我们谈谈钩子,它是 PyTorch 中最有用的内置开发工具之一。你是否曾经用打印语句和断点来处理那些讨厌的张量形状不匹配或随机层中出现的神秘 NaN?
好消息是:你不必这样做。有一个简单而优雅的解决方案。一个钩子是一个功能,可以附加到某些层上。它在向前传递(或向后传递,取决于您附加它的位置)之前接收层的输入,允许您存储、检查甚至修改它。
在下面的例子中,您可以看到如何使用钩子简单地存储 ResNet 模型的每个卷积层的输出。
如果你想了解更多的细节,我已经写了一个关于钩子的详细指南。
钩子如何显著改善你的工作流程
towardsdatascience.com](/the-one-pytorch-trick-which-you-should-know-2d5e9c1da2ca)
PyTorch 闪电
如果你用过 Keras,你就会知道一个好的界面可以让训练模型变得轻而易举。最初,PyTorch 没有这个功能。然而 PyTorch Lightning 被开发出来填补了这个空白。虽然不是 PyTorch 的官方部分,但它目前是由一个非常活跃的社区开发的,最近获得了很大的关注。
为了演示它如何帮助您消除通常出现在 PyTorch 中的样板代码,这里有一个简单的例子,我们在 MNIST 上训练了一个 ResNet 分类器。
此外,Trainer类支持多 GPU 训练,这在某些场景中可能很有用。在官方文档中有更多的例子。
在 Medium 上有一篇作者 William Falcon 的精彩介绍,如果你感兴趣,我强烈推荐。
[## 从 PyTorch 到 py torch Lightning——一个温和的介绍
这篇文章对使用 PyTorch 和 PyTorch Lightning 实现的 MNIST 进行了对比。
towardsdatascience.com](/from-pytorch-to-pytorch-lightning-a-gentle-introduction-b371b7caaf09)
量化
随着神经网络结构变得越来越复杂,它们的计算需求也增加了。这使得某些模式在实践中不可行。您可能希望在移动应用程序中运行神经网络,这有很强的硬件限制。正因为如此,人们正在做出巨大努力来克服这些障碍。
其中最有希望的是网络的量子化。本质上,量化就是简单地用 uint8 代替 float32 或 float64。这使得网络更小,计算更快。即使在准确性和大小/速度之间有一个折衷,如果做得好,性能损失可以是最小的。
PyTorch 支持三种量化工作流程:
- 动态量化,在计算过程中将权重和输入转换为 uint8。这使得它更快,但权重和输出仍然存储为浮点型。(因此,更快的 uint8 内存访问不会加速。)
- 训练后静态量化。这转换了整个训练过的网络,也提高了存储器访问速度。但是,这可能会导致性能下降。
- 量化感知训练。如果训练后量化导致次优性能损失,则可以在训练期间应用量化。
如果你的目标是生产,量化是非常值得探索的。(请记住,它目前是一项实验性功能,可能会有所变化。)
延伸阅读:
- PyTorch 量化文档
- PyTorch 博客上的量子化介绍
修剪
除了量化之外,还有更多加速/缩小神经网络的技术。即使中等规模的卷积网络也包含数百万个参数,使得训练和推断的计算成本很高。由于经过训练的网络本身就很稀疏,因此简单地删除不必要的神经元以减小规模和提高速度是一种自然的想法。
减肥似乎不是一个好主意,但却是一个非常有效的方法。只要想想卷积层实际上是一个线性层,有一堆零权重。在 PyTorch 中,torch.nn.utils.prune模块中实现了几种修剪方法。要使用它们,只需对要修剪的图层应用修剪功能:
prune.random_unstructured(nn.Conv2d(3, 16, 3), "weight", 0.5)
这为模块添加了一个修剪前向预挂钩,它在每次前向传递之前执行,屏蔽了权重。因此,由于权重的稀疏性,这一层中的计算将会更快。
延伸阅读:
火炬脚本+ JIT
如你所知,PyTorch 的内部其实是用 C++实现的,使用了 CUDA、CUDNN 等高性能计算工具。这就是为什么它真的很快。你用来训练的只是一个 C++张量库之上的 Python 包装器。这有一些缺点,例如它增加了计算的开销。Python 对于开发来说非常方便,但是在生产中,你并不真正需要这种便利。
你需要的是一种快速运行你的模型的方法。TorchScript 和 JIT 正好提供了这一点。它将您的模型转换成中间表示,可用于在 Python 之外的环境中加载它。此外,这种表示可以进一步优化,以实现更快的性能。
要翻译您的模型,您可以使用
torch.jit.trace
或者
torch.jit.script
追踪需要一个示例输入,它被传递到您的模型,同时在内部表示中记录操作。但是,如果您的前向传递计算控制流,比如if语句,那么表示就不正确。如果描摹仅触及分支的一部分,其他分支将不会出现。在这些情况下,应该使用脚本,它直接分析模型的源代码。
更多资源:
- PyTorch 火炬脚本教程
- 研究到生产:PyTorch JIT/TorchScript 更新作者:Michael Suo
- 从研究到生产,杰夫·史密斯在 QCon New York 2019 上的演讲
你在工作中使用过这些吗?你知道什么最佳实践或很棒的教程吗?请在评论中告诉我们!😃
在那之前,让我们提升 PyTorch 技能,建造一些令人敬畏的东西!
如果你喜欢把机器学习概念拆开,理解是什么让它们运转,我们有很多共同点。看看我的博客,我经常在那里发表这样的技术文章!
5 个高级 sci kit-了解将改变您编码方式的特性

很少有软件包能成功达到 sklearn 所达到的水平。这不仅是因为它们提供了几乎所有常用的 ML 算法,也是因为它们提供这些算法的方式。Sklearn 的核心代码是用 Cython 编写的,提供了优化的性能。他们的 API 被设计成提供一致性、可读性和可扩展性。在核心的 ML 算法之上,sklearn 为您提供了创建端到端管道的附加功能。如果有一个形容词可以形容这个包,它应该是“”。
如果你曾经和 sklearn 合作过,你大概会对 fit,predict,transform 等常用方法比较熟悉。也许您还会熟悉一些其他的预处理方法。但是这个软件包的功能远远超出了常用的功能。
这篇文章的目标是 突出 sklearn 的一些非常强大但不太为人所知的特性。这些功能将使您能够释放 sklearn 的最大潜力。您将快速了解这些功能是什么以及如何使用它们。将提供一个非常短的代码片段,随后是更多详细信息的参考。代码片段的目的只是为了说明的功能和语法*。这些片段并不代表完整的工作流程。最后,使用了 0.22.1 。*
1.管道
您的模型将总是由多个连续阶段组成,其中一个阶段的输出将是下一个阶段的输入。例如,高维输入的分类器通常包括归一化、维度减少和分类模型。
Sklearn 的管道提供了一个优雅的包装器来链接这些连续的步骤。当您将使用管道时,您将不必担心管理中间对象。您需要做的就是指定步骤并调用fit方法。在持久化你的模型的时候,你只需要 pickle 一个对象,就是管道。使用管道将提高代码的可读性,减少错误,并减轻训练模型的持久性。
2.内嵌目标转换器
在某些情况下,在训练你的模型之前,你可以从目标的非线性变换中受益匪浅。例如,对于重尾目标的对数变换通常是非常明智的步骤。当使用模型预测新数据时,您需要确保您对预测的这个转换进行逆运算。
这里有一些好消息:您不需要使用 Pandas 或 Numpy 来创建这些转换。您可以使用 Sklearn 直接应用目标变换,如下图所示:
下面的事情会在引擎盖下自动发生: 一边训练: regressor.fit(X,func(y)) 一边预测: inverse_func(regressor.predict(X))
3.特征联合
即使使用 sklearn 提供的顺序步骤,您也不会被每个步骤只有一个转换器所限制。你可以使用多个变压器和连接的结果在一个单一的步骤。
在上面的流水线示例中,我们在训练之前使用了单个 PCA 来转换标准化数据。让我们举一个例子,除了线性 PCA 之外,我们还想使用内核 PCA:
也可以在管线中插入特征联合。当然,你也可以编写自己的变形金刚。
4.滚动预测的链接模型
有时您会面临这样的情况,您需要链接多个模型,例如第一个模型的输出是第二个模型的输入。这种链接的一个非常常见的用例是在时间序列模型中:如果我们需要预测两个时间步,y(t+1)的预测将是在y(t+2)进行预测的输入。
使用 sklearn,您可以选择自动创建链接。功能为RegressorChain或ClassifierChain。您的y将不是一个数组,而是一个包含多个相关目标的矩阵。RegressorChain将自动包括前一个目标,以预测下一个。在预测过程中,该链将根据上一个目标的预测来预测下一个目标。您需要做的就是像往常一样使用fit和predict方法。
5.使用排列的特征重要性
特征重要性通常是我们能够拥有并呈现给最终用户的最重要的建模洞察力之一。但是,根据您使用的算法,获取它们并不总是直截了当的。
置换可用于推断每个特征的重要性,而不考虑建模方法。背后的核心思想非常直观:单个特征被随机洗牌,模型得分的降低被量化。变化越大,特性越重要。
现在轮到你了:在 Sklearn 中分享另一个让你的代码变得更好的高级方法。把这个方法写在下面的评论里
Python 中的 5 种高级字符串方法

在 python3.8 中使用 f-string 符号格式化漂亮的字符串
F 弦符号介绍
格式化字符串是编程的一个基本但重要的部分。F-Strings(python 3.6 中引入)提高格式化丰富字符串的简单性和直观性。
F-字符串符号 (格式化字符串)要求在字符串的开头有一个f(例如。f”hello”)。有许多高级方法可以用来格式化漂亮的字符串,下面将讨论 5 种这样的方法。
1.字符串中的变量
在适当的位置插入/替换变量。
name = "Alexander Hamilton"
print(f"hello {name}")
# hello Alexander Hamilton
2.字符串中的变量格式
就地格式化变量,如整数。
2.1 打印一个带逗号的大整数:
x = 2*10**5
print(f"You have ${x:,} in your bank account")
# You have $200,000 in your bank account
2.2 打印指定位数的浮点数:
pi = 3.1415926535897932384
print(f"The first 5 digits of pi are {pi:.5f}")
# The first 5 digits of pi are 3.14159
3.原地布尔逻辑:
也许你想根据几个条件格式化一个字符串。F-string符号允许使用布尔参数,正如你对 lambdas 的期望。
new_user = False
user_name = "Alexander Hamilton"
print(f"{'Congrats on making your account' if new_user else 'Welcome back'} {user_name}!")
# Welcome back Alexander Hamilton!
4.打印变量名和值
从 python 3.8 开始,f 字符串符号允许打印变量名及其值——这是一个特别有用的调试工具:
max_price = 20000
min_price = 4000print(f"{max_price=:,} | {min_price=:,})
# max_price=20,000 | min_price=4,000
5.格式化预填充字符串中的变量(邮件合并)
字符串格式允许替换预先填充的字符串中的变量。
这对于允许外部用户格式化程序将填写的电子邮件信息特别有用。
5.1 字符串。格式化方法(首选)
my_message = "Welcome to our platform {FNAME}! Your favorite ice cream flavor is {FLAVOR}."FNAME = "Alexander"
FLAVOR = "Mint Chocolate Chip"my_message_formatted = my_message.format(**{"FNAME":FNAME, "FLAVOR":FLAVOR})print(my_message_formatted)
# Welcome to our platform Alexander! Your favorite ice cream flavor is Mint Chocolate Chip.
5.2 F 字符串方法(带评估)
这里有一个 f 字符串符号不符合的例子(仅仅因为它打算在代码中使用…)
my_message = "Welcome to our platform {FNAME}! Your favorite ice cream flavor is {FLAVOR}."FNAME = "Alexander"
FLAVOR = "Mint Chocolate Chip"my_message_formatted = eval(f”f’{my_message}’”)print(my_message_formatted)
# Welcome to our platform Alexander! Your favorite ice cream flavor is Mint Chocolate Chip.
结论
F-string 符号是一种格式化漂亮字符串的简单方法。上面演示了 python3.8 中格式化字符串的 5 种高级方法。
考虑在 python 代码中实现这些方法。
如果你有其他值得注意的字符串方法,请在评论中分享!
5 探索性数据分析(EDA)的高级可视化
每个业余或专业数据科学家都应该擅长探索性数据分析。这是为了看看数据能告诉我们什么,而不仅仅是正式的建模或统计分析。

用作者在本文中提到的代码生成的图
清晨,一位女士来见夏洛克·福尔摩斯和华生。甚至在这位女士开口并开始讲述她来访的原因之前,夏洛克就可以通过他纯粹的观察和推理能力来了解一个人。同样,在复杂的建模和将数据输入算法之前,我们可以推导出许多关于数据和特征之间关系的信息。
目标
在本文中,我将讨论五个高级数据可视化选项,以执行高级 EDA 并成为数据科学的福尔摩斯。目标是用最少的编码和最快的内置选项推断出不同数据点之间的关系。
步骤 1: 我们将使用 seaborn 包内置的数据集和高级选项来演示高级数据可视化。
import seaborn as sns
import matplotlib.pyplot as plt
步骤 2: Seaborn 软件包附带了一些内置数据集,可以快速构建可视化原型,并使用自己的数据点评估其对 EDA 的适用性。在本文中,我们将使用 seaborn“企鹅”数据集。从在线 seaborn 存储库中,使用 load_dataset 方法加载数据集。我们可以用 get_dataset_names() names 方法获得所有内置 Seaborn 数据集的列表。
在下面的代码中,在 FacetGrid 方法中,数据集名称(即“bird”)、我们希望用来组织数据可视化的特征(即“island”)以及我们希望用来分组的特征(即作为“specifies”的色调)作为参数被提及。此外,在“地图”方法中,散点图的 X 轴和 Y 轴,即“脚蹼 _ 长度 _ 毫米”,以及下面示例中提到的“身体 _ 质量 _ 克”。
bird= sns.load_dataset("penguins")
g = sns.FacetGrid(bird, col="island", hue="species")
g.map(plt.scatter, "flipper_length_mm", "body_mass_g", alpha=.6)
g.add_legend()
plt.show()
基于上述代码的数据集可视化绘制了按“岛”组织并按“物种”进行颜色编码的数据点。
只要看一眼,我们就能推断出“巴布亚”物种只存在于“比斯科”岛上。巴布亚物种比其他物种更重,鳍状肢也更长。“阿德利”物种在所有三个岛上都有,“下巴颏带”只在“梦”岛上有。你可以看到,只用 5 行代码,我们就可以在没有任何建模的情况下获得如此多的信息。
我鼓励你对我们从下面的视觉化图像中推断出的其他信息发表评论。

第三步: 我们想快速了解企鹅按物种和岛屿的体重范围。另外,确定重量范围的浓度。
通过带状图,我们可以绘制出每个岛屿按物种分类的企鹅重量。
sns.stripplot(x="island", y="body_mass_g", hue= "species", data=bird, palette="Set1")
plt.show()

只要图中没有过多密集的数据点,带状图有助于获得洞察力。在岛内“梦”点在剧情中密集分布,想要从中获取有意义的信息有点困难。
群聚图有助于直观显示每个岛屿非重叠点上不同物种企鹅的体重范围。
在下面的代码中,我们在带状图中提到了类似的信息。
sns.swarmplot(x="island", y="body_mass_g", hue="species",data=bird, palette="Set1", dodge=True)
plt.show()
在数据密集的情况下,这极大地提高了对数据点的理解。我们一眼就可以推断出“阿德利”的体重大约在 2500 到 4800 克之间,一个典型的巴布亚物种比下颚带物种要重。我会让你根据下面的群体图进行其他探索性的数据分析。

第四步: 接下来,我们要根据企鹅的性别来了解每一个岛上企鹅的体重和身长之间的关系。
在下面的代码中,在我们有兴趣识别的 x 和 y 参数特征中,提到了关系。色调被称为“性别”,因为我们想分别了解雄性和雌性企鹅的关系。
sns.lmplot(x="body_mass_g", y="culmen_length_mm", hue="sex", col="island", markers=["o", "x"],palette="Set1",data=bird)
plt.show()
我们可以推断,比斯开岛企鹅的体重和体长的关系对于雄性和雌性都是相似的。相反,在《岛梦》中,雄性和雌性企鹅的关系趋势完全相反。《岛梦》中企鹅的体重和身长关系是线性还是非线性?
我们可以通过在 lmplot 方法中指定参数顺序来可视化多项式关系。

在人口高度密集的数据点的情况下,我们可以进一步扩展我们的探索性数据分析,通过为每个岛屿分别可视化男性和女性的身体质量和身高的关系。
可视化是由代码中提到的 col 和 row 参数组织的。
sns.lmplot(x="body_mass_g", y="culmen_length_mm", hue="sex", col="island",row="sex",order=2, markers=["o", "x"],palette="Set1",data=bird)
plt.show()

第五步: 将散点图和直方图并排显示有助于获得数据点分布的整体视图,同时也有助于观察频率。联合地块是描绘它的有效方式。在下面的代码中,x & y 参数是我们试图识别的特征之间的关系。由于数据点密集,因此我们将绘制六边形图,而不是散点图。“种类”参数表示绘图的类型。如果你想知道更多关于 hexbin 的情节,那么请参考我的文章 5 强大的可视化与熊猫的数据预处理。
sns.set_palette("gist_rainbow_r")
sns.jointplot(x="body_mass_g", y="culmen_length_mm", kind="hex",data=bird )
plt.show()

根据直方图,我们可以推断大多数企鹅的体重在 3500 到 4500 克之间。你能推断出企鹅最常见的长度范围吗?
我们还可以用下面的代码在 hexbin 图中绘制各个数据点(如右侧图所示)。
g = sns.jointplot(x="body_mass_g", y="culmen_length_mm", data=bird, kind="hex", color="c")
g.plot_joint(plt.scatter, c="w", s=30, linewidth=1, marker="+")
g.set_axis_labels("Body Mass (in gram)", "Culmen Length ( in mm)")
plt.show()
第六步: 最后,我们来了解一下各个岛屿不同特征之间的传播和关系。散点图非常便于显示不同特征之间的散点图。特征“岛”作为色调被提及,因为我们想要基于它对情节进行颜色编码。
sns.pairplot(bird, hue="island")
plt.show()
我们可以从视觉化图像中看到,在比斯开岛,大多数的企鹅都有浅的顶点深度,但是比其他岛屿的企鹅要重。类似地,我们可以得出结论,对于比斯开岛的大多数企鹅来说,鳍状肢的长度更长,但是具有较浅的鳍状肢深度。

我希望你在开始任何复杂的建模练习之前,将这些高级可视化用于探索性数据分析,并了解数据点之间的关系。我很想听听你最喜欢的 EDA 可视化图,以及我们可以从本文中举例说明的例子中得出的结论列表。
了解 Scikit-Learn 于 2020 年 5 月推出的复合估算器和管道的交互式可视化。
如果您想学习使用 pandas 进行数据可视化,请阅读关于 5 使用 Pandas 进行数据预处理的强大可视化的趋势文章。
此外,在文章深度学习中的准确性可视化中了解关于张量板和深度学习模型可视化的更多信息。
如果你有兴趣学习不同的 Scikit-Learn 定标器,那么请阅读我的文章特性缩放——不同 Scikit-Learn 定标器的效果:深入探讨
"""**Full Code**"""**import seaborn as sns
import matplotlib.pyplot as plt****bird= sns.load_dataset("penguins")
g = sns.FacetGrid(bird, col="island", hue="species")
g.map(plt.scatter, "flipper_length_mm", "body_mass_g", alpha=.6)
g.add_legend()
plt.show()****sns.stripplot(x="island", y="body_mass_g", hue= "species", data=bird, palette="Set1")
plt.show()****sns.swarmplot(x="island", y="body_mass_g", hue="species",data=bird, palette="Set1", dodge=True)
plt.show()****sns.lmplot(x="body_mass_g", y="culmen_length_mm", hue="sex", col="island", markers=["o", "x"],palette="Set1",data=bird)
plt.show()****sns.lmplot(x="body_mass_g", y="culmen_length_mm", hue="sex", col="island",row="sex",order=2, markers=["o", "x"],palette="Set1",data=bird)
plt.show()****sns.set_palette("gist_rainbow_r")
sns.jointplot(x="body_mass_g", y="culmen_length_mm", kind="hex",data=bird )
plt.show()****g = sns.jointplot(x="body_mass_g", y="culmen_length_mm", data=bird, kind="hex", color="c")
g.plot_joint(plt.scatter, c="w", s=30, linewidth=1, marker="+")
g.set_axis_labels("Body Mass (in gram)", "Culmen Length ( in mm)")
plt.show()****sns.pairplot(bird, hue="island")
plt.show()**
商业的 5 个人工智能陷阱&如何避免它们
实现人工智能商业成功,而不仅仅是技术成功
由于人工智能在商业世界仍处于起步阶段,人工智能有很多方式会出错。关于如何避免人工智能陷阱的广泛知识仍然有限。
许多是技术性的,但有些不是。商人可以在标记风险方面发挥重要作用,尤其是那些具有重大商业影响的风险。
这篇文章列出了一些与人工智能业务利益相关者相关的重要人工智能陷阱,以及避开它们的技巧。它们是本可以做得更好的人工智能项目的轶事、个人和公开经验的结果。

商业在避免人工智能陷阱中的作用
如果人工智能项目出现问题,最好的情况通常是浪费投资或错过机会。比如,跟不上竞争对手。在更糟糕的情况下, AI 可能会对你业务的某些方面造成损害。损失可能包括销售增长、客户满意度、品牌或运营效率。
AI 团队的业务成员对很多 AI 项目问题无能为力。这是因为他们需要数据科学或技术专业知识。但是让他们参与——或者至少意识到——那些具有重大商业影响的事情是合理的。
问对问题可能就足以降低很多问题发生的可能性。然而,如果问题不明确,你很容易因过度谨慎或不相关的顾虑而使项目陷入困境。教育自己什么样的事情会出错,为什么会出错,是保持建设性的好方法。
以下是商务人士应该注意的 5 个常见人工智能陷阱的概述。它们直接关系到工作的业务方面,以及整体的业务成功。
AI 商业陷阱 1: 考虑不周的商业问题
一个常见的人工智能陷阱是从人工智能工作的结果中得出不正确、不恰当或无效的结论。与所有统计和数据科学工作一样,需要进行解释才能赋予数据意义。如果做得不好,结果很容易被误解和不当使用。这种情况在企业领导人有现成的决策或直觉,并希望用数据证明其合理性时尤为普遍。
这通常不是故意的结果。这很可能是因为匆忙、含糊不清或对人工智能解决方案所提业务问题的误解而发生的。
如果有快速产生结果的压力,就很容易过度简化你要求 AI 做的事情。最初,通常有可能将一个项目提炼为一个总体目标和相关的人工智能“大问题”。但是当你深入细节时,复杂性会变得令人生畏。
假设每个人都真诚地寻求“正确”的答案,那么这个人工智能陷阱出现在两个主要的项目步骤中:
- 最容易发现的是“全局”人工智能问题有缺陷的时候。在最高级别上,这是业务部门希望从人工智能那里了解到的解决问题的信息。这个问题的糟糕选择使得很难或不可能从人工智能结果中获得实际的商业价值。
- 更棘手的领域是设计解决方案内部工作方式的人工智能问题,通常是算法。如果业务结果令人失望,原因可能并不明显。
一个有缺陷的“全局”人工智能问题的例子
比方说,你正在努力留住客户。让你的人工智能团队识别将要离开的客户是很有诱惑力的。如果你知道这一点,你可以做些什么来阻止他们,这似乎是合理的。
当他们问你希望如何准确地识别他们时,一个自然的回答可能是“尽可能准确”,理想情况下是 100%。
这里的缺陷是,如果顾客因为不开心而离开,那么离开的可能性会随着不满意而增加。你越准确地预测客户将会离开,答案就越晚出现。
换句话说,你可以最好地预测他们会在最不满意的时候离开。不幸的是,到那时再做什么都为时已晚了。
再看一下“大局”问题,发现不满情绪增加的早期迹象会更有用。这转化为使用人工智能来“评分”客户未来离开的可能性。知道了这一点,你可以更早地尝试不同的干预来改变想法。
人工智能设计中有缺陷问题的一个例子
对于第二种类型的“错误问题”人工智能陷阱,这个陷阱最初并没有出现。这是因为该解决方案最初会产生有用的结果。只有经过长期的验证、测试或使用,缺陷才会出现。
招聘中一个令人痛苦、证据充分的例子是使用人工智能筛选简历或评估候选人。
使用人工智能从过去成功的员工中推断理想候选人的特征时,问题就出现了。这将鼓励公司“按照自己的形象”雇佣未来的员工。新员工应该做得很好,因为他们和那些已经做得很好的人相似。
缺陷在于,人工智能逻辑不会只是复制现有员工的优点。它还可能强化不太理想的行为。不经意间陷入这种困境的公司在招聘过程中植入了预先存在的偏见和成见。在最糟糕的情况下,这包括与种族或性别相关的违法行为。
这里的根本原因还在于业务对 AI 团队提出的问题。这表现在它对人工智能解决方案设计和长期结果的影响上。一个典型的有缺陷的问题可能是“确定将在我们的组织中取得成功的候选人”。没有进一步的限定和约束,就导致了这种问题。但是问题要比第一种晚很多才会出现。最初看起来效果不错,能挑选出适合公司的候选人。
缓解措施
一种缓解措施是留出足够的时间来模拟不同的数据科学方法,以生成可能的答案。此外,确保您理解业务术语中的基本逻辑和假设。让企业参与评估中期结果,并从企业的角度对其进行“意义检验”。
避免这种困难的另一种方法是展示人工智能结果将如何在商业术语中使用。这应该一直持续到实现收益。同样值得尝试推断更长期的情况。这意味着设想解决方案实施几个季度,然后几年后,业务会有什么不同。
在人工智能解决方案设计中,有一些有用的技术可以帮助避开这个问题。其中包括商业原型和场景规划。
人工智能商业陷阱 2: 未量化或未陈述的商业目标
有大量的文章、会议和书籍描述人工智能如何帮助商业。但是对于如何量化这些好处却知之甚少。当人们公开谈论或写下他们的人工智能好处时,数字并不经常被提及。
这导致企业在人工智能上的支出陷入两难境地。没有基准和可量化的好处,人工智能商业案例不太可能达到与其他预算相同的标准。但当每个人似乎都在谈论人工智能将如何改变商业时,不做人工智能工作似乎值得怀疑。即使这些数字模糊不清或者不太合理。
即使困境的原因是众所周知的,人们的反应也不太容易理解。当话题是人工智能时,一些企业开始从事潜在的昂贵工作,但不清楚他们希望从中获得什么。一些人认为这是合理的,因为人工智能在未来很可能具有重要的战略意义。但可以说,这使得设定目的地变得更加重要。
然而,许多人工智能从业者的经验是,相当多的公司这样做。毫不奇怪,这可能会导致对人工智能的失望或怀疑,并暂停新生的人工智能计划。
减轻
有几种方法可以解决这个问题。一种是将支出与现有投资和成本中心(如 R&D 或能力建设)进行分组。另一个是设定“软”商业目标,有意识地接受更多衡量结果的自由度。第三种是使用初始项目为未来的业务案例创建相关度量的基线。
解决这个陷阱有两个部分,应该分别对待:
- 从商业角度选择有意义的东西来衡量。使它们与人工智能工作成果的联系显式化;
- 决定作为人工智能工作的结果,业务度量的预期改进水平(如果有)。
这两个问题都很棘手,而且很少有有用的行业报告或基准来提供快速的答案。但每一个都是可以实现的,那些坚持不懈的人会发现自己领先于大多数竞争对手。
AI 业务陷阱三: 单独 AI 开发&业务实现
人工智能商业项目为商业人士创造输出,用于解决商业问题或改善商业活动。
为了解决问题或改进活动,您需要修改日常工作以利用人工智能的输出。因此,决定一个企业将如何使用人工智能输出应该是人工智能工作的一部分,这似乎是显而易见的。
不幸的是,在实践中并不一定如此。
这并不是说人工智能团队没有意识到业务变化需要发生。在许多组织中,这不是他们的职责。在其他情况下,人工智能团队没有知识或权力对此做任何有意义的事情。当然,有时候 AI 团队就是不感兴趣。或者他们知道这很难,所以把它留给别人。
与人工智能工作的其他方面一样,常规的 IT 工作也有很好的类比。在这两种情况下,经常会发现业务团队和 it 团队似乎在相互对抗。原因可能是政治的、人的或历史的,但结果是团队似乎不为同一个组织工作。人工智能技术工作更难理解,其长期影响也不太清楚,这也于事无补。因此,这种分歧在人工智能项目中可能会更加明显,特别是如果业务团队感到人工智能的威胁。
减轻
不可能笼统地规定你的人工智能项目应该如何处理业务实现。它因组织、解决方案类型甚至部门而异。但是你可以为整个组织的人工智能业务实施建立一些原则。这些可以成为你所有人工智能工作方法的一部分。
两个例子是:
- 清除人工智能业务实施风险的一个好方法是早期讨论。即使细节不清楚,在日常工作中使用人工智能输出的早期业务参与也是有帮助的。
- 人工智能项目状态可以包括作为标准报告项目的业务实施。即使最初没有什么可报告的,随着人工智能产出的加强,这种情况也会改变。
目的不是完美的做 AI 业务实现。这是为了确保你不会忽略业务实现或者把它放在事后考虑。
AI 商业陷阱 4: 投资错误的技巧
如果你的组织并不真正理解人工智能,那么决定为你的人工智能工作雇佣或使用什么技能是很困难的。此外,决定你需要什么技能是你可能还没有做出的战略决策的功能。
这些因素导致了两种与技能相关的人工智能陷阱:
- 首先是在你决定内部与外包人工智能开发的角色之前,投资于内部人工智能技能。两者你都需要人工智能技能,但是细节会改变,就像你如何利用它们一样。
- 第二是没有让你的招聘团队具备做出有效人工智能招聘决定的正确知识。一种变化是用错误的团队来雇佣人工智能。
内部与外包人工智能工作的技能
如果你计划使用第三方进行人工智能工作,你将需要内部人工智能技能来委托和管理工作。你还需要他们来评估那些你付钱去做的工作。相反,如果你让人工智能在内部工作,你将需要一个内部人工智能团队,有非常不同的配置文件。
如果你还没有在两者之间做出决定,就很难知道你需要什么技能。一个可能的例外是人工智能领导者做出这样的决定和相应的计划。
人工智能的招聘更加棘手,因为对于人工智能团队或部门应该是什么样子,人们几乎没有共识。甚至还有关于人工智能应该在公司中占据什么位置的争论。
在你的人工智能技能建设的早期,一个缓解选择是为你的初始雇员关注更广泛的人工智能知识。这可以让你避免过度专业化的长期雇佣,直到你明确长期的技能需求。在建立清晰性的同时,使用合同或交叉培训的现有 IT 人员来完成更详细的任务,尤其是技术开发。
装备雇佣团队来招募人工智能技能
就像任何其他专业一样,没有上下文,高级别的标签(例如数据科学家或数据工程师)通常毫无意义。如果你没有区分事实、夸张和虚构的知识,评估一个人的能力是很棘手的。在选择人工智能供应商来构建您的人工智能解决方案时,也存在类似的挑战。
将人工智能雇佣或采购委托给没有足够人工智能知识来克服这些挑战的人将是危险的。你还需要给他们足够的指导来评估和比较候选人。
- 一个迹象是缺少主要列出技术和语言的招聘规范。
- 另一个原因是缺乏有意义的面试结构和候选人评分表。
AI 商业陷阱五: 为了 AI 而 AI
一个容易触犯的人工智能陷阱是开始人工智能工作主要是因为想要使用人工智能。这通常伴随着对要解决的问题的思考不足。
这导致人工智能项目没有业务重点,或者试图解决“错误”的问题。这包括人工智能不适合或无法帮助解决的问题。
我不会在这里详细说明什么是人工智能的正确问题。有清单和其他资源来帮助你确定在一个问题中寻找什么来评估它对人工智能的适用性。这里的重点是确保你已经仔细考虑了你选择的人工智能项目和问题。重要的一点是,已经有人针对手头的问题看了《为什么是 AI》。如果他们认为这是一个有效的匹配,这种解释应该是商业领导可以理解的,而不仅仅是人工智能专家。
减轻
理想情况下,你会选择正确的问题,事情会进展顺利。但是,如果尽管努力了,他们还是没有成功,不要灰心丧气。团队在选择正确的业务问题时会犯错误,尤其是在一个组织采用人工智能的早期。但随着时间的推移,情况会有所改善。这是将人工智能信息转化为知识的几乎不可避免的一部分。
为了避免这个陷阱,寻找使用人工智能的欲望正在推动一个项目的症状。或者,可能更容易发现缺乏合适的业务问题。
- 一个常见的问题是完全缺乏商业案例,甚至是一个古怪的案例。
- 另一个原因是缺乏任何解释为什么这个问题适合人工智能的信息。它可能是项目范围文档中的一个段落,或者某处的 Powerpoint 幻灯片,但是它应该存在。
- 第三个可能是对人工智能略知一二的高管。一种反应是坚持认为该公司在人工智能方面有所作为,但没有提供更多具体信息。
人工智能本身并不总是一个问题
人工智能本身就是一个陷阱。然而,值得注意的是,作为学习练习的人工智能项目会有好处。这些因素本身就足以证明这种方法是正确的。
如果你走这条路,投资人工智能学习项目应该是一个明确的决定。此类投资的商业案例非常不同,衡量和实现成功的标准也是如此。
商业中的人工智能陷阱:总结
人工智能在商业上仍处于早期阶段,行业仍在寻找基本问题的答案。一个是始终如一地构建有效的人工智能商业解决方案的最佳方式。另一个是如何从人工智能工作中实现可衡量的业务改进。第三是决定你的企业在人工智能世界中竞争所需的技能。请记住,将这些技能融入现有的组织结构并不一定简单。
理解什么出错了和知道什么运行良好一样重要
结果是,很多 AI 项目没有“成功”,也许是大多数。所以今天,知道如何避免人工智能陷阱可以说与知道如何建立人工智能商业解决方案一样重要。
许多陷阱本质上是技术性的,而商人对此有所作为的机会有限。但另一些则与人工智能工作的商业方面直接相关,商业利益相关者可以强烈影响它们。
我们在这里已经讨论了五个。四个是关于为正确的商业原因做人工智能工作,并确保人工智能工作产生可衡量的商业结果。第五是关于企业所需人工智能技能的重大组织意义。
让人工智能专注于商业是关键
企业为商业利益而做人工智能工作通常是理所当然的。但这并不总是人工智能团队的重点,尤其是在处理技术和数据问题时。团队甚至可能将业务问题视为不受欢迎的干扰。
作为人工智能业务的利益相关者,一个关键的责任是确保人工智能项目中适当的业务重点。这应该从一开始就到位,并在整个过程中保持敏锐——包括项目结束后。注意这里讨论的陷阱应该有助于实现这一点。
【www.aiprescience.com】本文最初发表于T5
理解生成性对抗网络的 5 篇文章

莫里茨·金德勒在 Unsplash 上拍摄的照片
了解目前最有前途的深度学习技术之一
介绍
生成式对抗网络(GAN)是一种生成式网络架构,能够生成新的内容,如图像和音频,使其看起来更真实。它们可以用于生成电影中的特殊效果、小数据集的新数据以及加速照片编辑。
生成网络在甘斯之前就存在了,但“敌对”部分实际上增加了许多价值和新的视角。新颖之处在于,在这个框架中,我们同时训练了两个模型:生成模型和判别模型。生成模型试图捕捉数据分布,而判别模型估计一些内容是由生成模型生成的,而不是来自实际数据的概率。然后,生成模型试图通过最大化出错的概率来愚弄判别模型。
这两种模式之间的竞争是 GANs 如此强大的原因。这就像在开发 It 安全性的同时培训黑客一样:黑客越熟练,您的 IT 安全性就越能抵御攻击,IT 安全性开发得越多,黑客就越能克服它。
现在让我们来看一下你应该阅读的 5 篇文章,以便更好地理解 GANs 以及如何使用它们。
文章
生成对抗网
最初的论文由蒙特利尔大学的一组研究人员(包括 Ian Goodfellow)在 2014 年撰写,介绍了 GAN 框架,并为未来的工作奠定了基础。它实际上非常简洁:在简短的介绍之后,它解释了 GANs 及其理论结果,然后展示了一些实验,最后评论了它的优点和缺点,并以结论结束。这是你应该读的关于这个主题的第一篇文章。
NIPS 2016 教程:生成性对抗网络
这篇文章其实是总结这篇教程的报告,作者也是 Ian Goodfellow(原论文作者),所以两者之间会有很多冗余。然而,它给出了一个更详细的关于 GANs 的观点,它们的应用,甚至是最后的一些练习。如果第一篇文章对你来说不够清楚,试试这篇教程。
生成对抗网络综述:算法、理论和应用
【2015 年的这篇论文是理解 GAN 的完美下一步:它将带你了解 GAN 的主要变体,解释它们之间的理论和实际差异,并展示一些应用,让你领略 GAN 的强大。通过阅读它,你还可以从不同的角度回顾 GANs 背后的数学,如果你没有从第一篇文章中得到它,这可能会对你有所帮助。
RANDGAN:检测胸部 X 线新冠肺炎的随机生成对抗网络
这篇文章发表于 2020 年 10 月,它展示了如何使用 GANs 以半监督方式检测肺部图像中的新冠肺炎,而无需标记图像。这在处理流行病时特别有用,因为新疾病的标记数据并不总是容易收集的。在阅读了什么是 GANs 以及它们是如何工作的之后,本文将向您详细展示它的许多可能的用例之一。
包容性 GAN:改进生成模型中的数据和少数群体覆盖
在许多数据集中,少数民族在种族、性别甚至年龄方面的代表性不足。
GANs 的另一个有趣的应用是生成新的训练数据,在本文中,我们看到了如何通过用 GANs 生成人工数据来扩大少数民族覆盖率。以前已经有解决这个问题的方法,但是,根据这篇文章,GANs 似乎比那些最好的还要好。
额外收获:Coursera 上的生殖对抗网络专业化
好的,这并不是一篇真正的文章,但是在获得文章给出的理论背景之后,这可能是学习如何实际实现 GANs 的最好方法之一。完成 3 门课程总共需要 10 周时间,你应该有很好的 Python 水平,包括深度学习框架的经验。
如果你喜欢这篇文章,你可能也会喜欢这些:
了解最流行的算法之一是如何工作的,以及如何使用它
towardsdatascience.com](/xgboost-theory-and-practice-fb8912930ad6) [## 使用 R 的地质统计学实践
如何使用带有 R 的地理定位数据进行估计
towardsdatascience.com](/geostatistics-in-practice-using-r-4b7d32b7840d)
如果你想进一步讨论,请随时通过 LinkedIn 联系我,这将是我的荣幸(老实说)。
为您的下一个数据科学项目增压的 5 个自动化工具
用人工智能做人工智能

自动化已经改变了世界各地的许多行业。从超市的自助结账到汽车制造机器人,技术解决方案正不断侵入曾经是人类专属领域的工作领域。
作为数据科学家,我们也不能幸免。每天都有新产品被开发出来,以实现数据科学生命周期的自动化。
数据争论
他们说数据科学是 80%的准备,20%的分析和建模。但是,新工具正在蚕食这 80%的份额,让我们可以在数据科学过程的最后将更多时间花在高价值的工作上。
Automunge 使得为机器学习准备表格数据的过程变得更快更容易。以一个“整洁”的数据集作为输入(整洁意味着每列一个要素,每行一个观测值),它根据每个要素的类型对其进行分类,并根据需要进行变换。
例如,数值经过 Z 分数归一化,分类变量经过一键编码,缺失值可以使用自动机器学习进行估算。
这减少了在开始建模之前需要做的一些耗时的准备工作。它还有一个额外的好处,那就是帮助你标准化你的方法,降低出错的风险。
特征工程
Featuretools 是一个用于自动化特征工程的开源 Python 包。使用称为深度要素合成的技术,通过组合现有要素的变换和聚合来创建要素,直到某个深度。
例如,考虑一个包含客户 ID、日期和交易金额的交易表。Featuretools 能够使用聚合功能来扩充现有数据,例如按客户划分的交易数量、按日期划分的总交易价值以及每天唯一客户的数量。“原始”转换可以自动堆叠,以创建更复杂的功能,如“每个客户上个月的平均交易数”。这使您只需要少量的配置就可以访问大量可能的功能。
当然,这并不一定取代手工设计功能的需要。需要一点定制处理的特征总是需要手工创建(例如,在著名的泰坦尼克号数据集中分割“客舱”字段)。此外,很可能大量特征中的许多是高度相关的,因此可能还需要执行维度缩减。彻底理解您正在处理的数据,而不只是盲目地使用“暴力”方法,这一点始终很重要。
AutoML
如果我们可以用机器学习来做机器学习会怎么样?
按 H2O.ai …
AutoML 是自动化算法选择、特征生成、超参数调整、迭代建模和模型评估的过程。
AutoML 承诺通过允许没有机器学习专业知识的人训练和评估模型,来填补数据科学经验的差距,并使机器学习民主化。
虽然具体的技术是多种多样的,但是基本思想是创建大量的模型,并且或者选择性能最好的一个,或者将该组模型的输出馈送到产生最终输出的集合模型中。
这减少了所需的人工时间,但代价是在训练期间或以后使用模型时增加了计算时间。
超参数优化
超参数是用于配置模型学习方式的值。它们因不同的模型类型而异(例如,随机森林具有最大的树深度,而神经网络取决于“学习率”),选择正确的超参数可以极大地影响模型的训练速度和最终性能。
超参数优化包括在超参数向量空间中搜索,以便为手头的任务找到最佳(或“足够好”)值。
有多种策略可用于搜索这一领域,以找到好的解决方案:
- 网格搜索 —一种强力方法,彻底扫描超参数空间的子集。因为任务的大小随着超参数的数量呈指数增长。但是,并行运行也非常容易。
- 随机搜索 —从超参数空间中随机取样,在一定时间后返回最佳选项。不能保证这种方法会产生接近最优的结果,但是它具有成本优势,能够控制它运行的时间。此外,由于一些超参数可能比其他参数更重要,随机搜索减轻了网格搜索遭受的“维数灾难”,因为它在每个参数上独立采样。例如,如果一个模型有 10 个超参数,但其中只有一个对模型的质量有影响,网格搜索将浪费大量时间迭代每个组合,而随机搜索将快速找到单个重要超参数的有效值。
- 贝叶斯优化 —未知函数优化的通用算法。该算法将从超参数到结果模型的验证集精度的映射视为一个函数。通过从超参数集中采样,我们迭代地将高斯过程拟合到该函数,并根据“改进预期”选择下一个样本,这平衡了开发与探索。随着样本数量的增加,我们很可能会收敛到最优解。托马斯·胡伊斯肯斯更彻底的解释是这里的。
- 和许多其他的——梯度下降,基于进化的方法,这个列表还在继续…
上述每种技术都涉及计算时间和最终精度之间的权衡。因此,在上述方法之间进行选择需要仔细考虑,特别是考虑到它们都有自己的一组超参数!
以上实现可以在 Scikit-learn 、 H2O.ai 和Scikit-optimize中找到。
神经结构搜索
AutoML 中的一项重要技术是神经架构搜索 (NAS),它构成了 谷歌的 AutoML 产品的一部分。NAS 包括使用一个神经网络来搜索一个能够很好地解决你的问题的人工神经网络结构。它通过根据启发式函数评估大量候选架构来实现这一点——评估该架构对当前问题的适合程度。这种方法已经产生了最先进的神经网络,有时可以超越人类设计的架构。
然而,这种方法假设每个机器学习应用都有一个高度专业化的神经网络架构。因此,这可能需要大量的数据,并且计算成本很高,因为你必须从头开始训练你闪亮的新神经网络。对于像图像分类这样的标准神经网络应用,使用预训练模型(如 ResNet)的迁移学习可能更合适。
数据科学自动化—我的工作怎么办?
很有可能,目前由数据科学家执行的许多活动将在未来几年受到自动化的影响。很难预测这会对行业内的人才需求产生什么影响。
当然,对这个 10 年前几乎不存在的领域的工作保障的担忧可能有点杞人忧天。数据科学家是不断变化的世界的最新受益者,让你成为一名优秀数据科学家的态度和努力将在接下来的任何变化中为你服务。
最重要的是,数据科学不是关于特定的技巧或技术。而是用数据解决问题。平台和工具将会在数据科学堆栈中进进出出,但该领域的核心竞争力将会保留。使用自动化工具可以让我们去掉工作中无聊的部分,专注于更有趣的问题解决,最终提供更多的价值,增加我们的价值。
5 个关于 Python、机器学习和深度学习的超棒的计算机视觉项目创意!
项目创意
讨论 5 个很酷的计算机视觉项目,学习新的技能,增强你的简历

西蒙·米加吉在 Unsplash 上的照片
C 计算机视觉是人工智能的一个领域,通过处理图像和图片来解决现实生活中的视觉问题。计算机识别、理解和识别数字图像或视频以自动化任务的能力是计算机视觉任务寻求成功完成和执行的主要目标。
人类识别周围的物体和环境没有问题。然而,对于计算机来说,识别和区分环境中的各种模式、视觉、图像和物体并不容易。出现这种困难的原因是因为人脑和眼睛的解释能力不同于计算机,计算机解释大多数输出为 0 或 1,即二进制。图像经常被转换成由红色、蓝色、绿色组成的三维阵列。它们的取值范围是从 0 到 255,使用这种传统的数组方法,我们可以编写代码来识别图像。随着机器学习、深度学习和计算机视觉方面的技术进步,现代计算机视觉项目可以解决复杂的任务,如图像分割和分类、对象检测、人脸识别等等。
我们将着眼于两个项目,让初学者开始学习计算机视觉,然后我们将着眼于另外两个中级项目,通过机器学习和深度学习来获得更坚实的计算机视觉基础。最后,我们将看一个使用深度学习的高级计算机视觉项目。对于每个项目,我们将简要讨论与特定项目相关的理论。在此之后,我们将了解如何处理和优化这些项目。我会尽量提供至少一个资源链接,帮助你开始这些项目。

丹尼尔·库切列夫在 Unsplash 上的照片
初级计算机视觉项目:
1.颜色检测—
这是初学者入门计算机视觉模块 open-cv 的基础项目。在这里,你可以学习如何准确地区分不同的颜色。这个入门项目也有助于理解遮罩的概念,非常适合初级计算机视觉项目。任务是区分各种颜色,如红色、绿色、蓝色、黑色、白色等。并只显示可见的颜色。该项目使用户能够更好地理解掩蔽如何准确地用于更复杂的图像分类和图像分割任务。这个初学者项目可以用来学习更详细的概念,即 numpy 数组的这些图像是如何以 RGB 图像的形式准确堆叠的。您还可以了解图像从彩色形式到灰度图像形式的转换。
通过使用深度学习模型(如 UNET 或 CANET)来解决更复杂的图像分割和分类任务以及每个图像的遮罩,可以通过相同的任务实现更复杂的项目。如果你想了解更多,有各种各样的复杂项目可以利用深度学习方法。
网上有很多免费资源,可以帮助你开始你所选择的颜色检测项目。在研究和查看了各种资源和选择后,我发现下面的参考是非常理想的,因为它有一个 YouTube 视频以及代码的详细解释。启动代码和视频演示都由他们提供。
[## 检测颜色(Hsv 颜色空间)- Opencv 和 Python - Pysource
我们将在这个视频中看到如何使用 Python 在 Opencv 上通过 HSV 颜色空间检测颜色。我们进口…
pysource.com](https://pysource.com/2019/02/15/detecting-colors-hsv-color-space-opencv-with-python/)
2.光学字符识别(OCR) —
这是另一个最适合初学者的基础项目。光学字符识别是通过使用电子或机械设备将二维文本数据转换成机器编码的文本形式。你使用计算机视觉来阅读图像或文本文件。读取图像后,使用 python 的 pytesseract 模块读取图像或 PDF 中的文本数据,然后将它们转换为可以在 python 中显示的数据字符串。
pytesseract 模块的安装可能会稍微复杂一些,所以请参考好的指南来开始安装过程。您还可以查看下面提供的资源链接,以简化整个安装过程。它还引导您直观地了解光学字符识别。一旦您对 OCR 的工作原理和所需的工具有了深入的了解,您就可以着手计算更复杂的问题了。这可以使用顺序对顺序注意力模型将 OCR 读取的数据从一种语言转换成另一种语言。
这里有两个链接可以帮助你开始使用谷歌文本到语音和光学字符识别。查看光学字符识别链接中提供的参考资料,了解更多概念,并以更详细的方式了解 OCR。
[## 如何使用 Python 开始使用 Google 文本到语音转换
从零开始的文本到语音转换简介
towardsdatascience.com](/how-to-get-started-with-google-text-to-speech-using-python-485e43d1d544) [## 使用 Python 开始光学字符识别
对光学字符识别从无到有的直观理解和简要介绍
towardsdatascience.com](/getting-started-with-optical-character-recognition-using-python-e4a9851ddfab)
中级计算机视觉项目:
1.使用深度学习的人脸识别—
人脸识别是对人脸以及用户授权姓名的程序性识别。人脸检测是一个更简单的任务,可以被认为是一个初级水平的项目。人脸检测是人脸识别的必要步骤之一。人脸检测是一种将人脸与身体的其他部分和背景区分开的方法。haar 级联分类器可以用于面部检测的目的,并且准确地检测帧中的多个面部。正面人脸的 haar 级联分类器通常是一个 XML 文件,可以与 open-cv 模块一起使用,用于读取人脸,然后检测人脸。一种机器学习模型,如定向梯度直方图(H.O.G ),可与标记数据和支持向量机(SVM)一起使用,以执行此任务。
人脸识别的最佳方法是利用 DNN(深度神经网络)。在检测到人脸之后,我们可以使用深度学习的方法来解决人脸识别任务。有各种各样的迁移学习模型,如 VGG-16 架构、RESNET-50 架构、face net 架构等。这可以简化构建深度学习模型的过程,并允许用户构建高质量的人脸识别系统。你也可以建立一个定制的深度学习模型来解决人脸识别任务。为人脸识别建立的现代模型非常准确,对标记数据集的准确率几乎超过 99%。人脸识别模型的应用可以用于安全系统、监控、考勤系统等等。
下面是我使用 VGG-16 迁移学习的方法建立的人脸识别模型的例子,用于在通过 haar 级联分类器执行人脸检测之后进行人脸识别。请查看它,了解关于如何构建自己的人脸识别模型的更详细的解释。
建立高精度人脸识别模型
towardsdatascience.com](/smart-face-lock-system-6c5a77aa5d30)
2.物体检测/物体跟踪—
这个计算机视觉项目很容易被认为是一个相当先进的项目,但是有这么多免费的工具和资源可供使用,你可以毫不费力地完成这项任务。对象检测任务是在识别的对象周围绘制边界框,并根据确定的标签识别识别的对象,并以特定的精度预测这些标签的方法。与对象检测相比,对象跟踪略有不同,因为您不仅要检测特定的对象,还要跟随周围有边界框的对象。对象检测是一种计算机视觉技术,它允许我们在图像或视频中识别和定位对象。通过这种识别和定位,可以使用对象检测来计数场景中的对象,并确定和跟踪它们的精确位置,同时准确标记它们。这种情况的一个例子可以是在道路上跟随特定的车辆,或者在任何体育比赛中跟踪球,如高尔夫、板球、棒球等。执行这些任务的各种算法有 R-CNN(基于区域的卷积神经网络)、SSD(单次检测器)和 YOLO(你只看一次)等等。
我将提到两位天才程序员的两个最佳资源。一种方法更适合像 raspberry pi 这样的嵌入式系统,另一种方法用于 PC 相关的实时网络摄像头对象检测。下面这两个资源是开始使用对象检测/对象跟踪的一些最佳方法,它们也有详细解释它们的 YouTube 视频。请务必查看这些资源,以便更好地理解对象检测。
[## edjee electronics/tensor flow-Lite-Android-and-Raspberry-Pi 上的对象检测
本指南展示了如何训练 TensorFlow Lite 对象检测模型,并在 Android、Raspberry Pi 和
github.com](https://github.com/EdjeElectronics/TensorFlow-Lite-Object-Detection-on-Android-and-Raspberry-Pi) [## 代码/对象检测 API
Yolov3 是一种使用深度卷积神经网络来执行对象检测的算法。此存储库…
github.com](https://github.com/theAIGuysCode/Object-Detection-API)
高级计算机视觉项目:
1。人类情感和手势识别—
这个项目使用计算机视觉和深度学习来检测各种面孔,并对特定面孔的情绪进行分类。这些模型不仅对情绪进行分类,而且还相应地对所识别的手指的不同手势进行检测和分类。在区分人的情绪或姿势之后,由训练的模型分别提供对人的情绪或姿势的准确预测的声音响应。这个项目最好的部分是你可以选择的广泛的数据集。
下面的链接是我通过使用计算机视觉、数据增强和 TensorFlow 和 Keras 等库的方法来建立深度学习模型而完成的一个深度学习项目的参考。我强烈建议观众查看下面的两部分系列,了解如何计算以下高级计算机视觉任务的完整分解、分析和理解。此外,请务必参考上一节中提供的 Google 文本到语音链接,以了解文本到语音的有声文本转换是如何工作的。
了解如何从零开始构建具有深度学习的人类情感和手势检测器。
towardsdatascience.com](/human-emotion-and-gesture-detector-using-deep-learning-part-1-d0023008d0eb) 
安娜斯塔西娅·彼得罗娃在 Unsplash 上的照片
结论:
这是跨越不同难度的 5 个令人敬畏的计算机视觉项目想法。相应地提供了每个概念的简要理论以及一些有用资源的链接。我希望这篇文章能帮助观众深入到计算机视觉这个令人惊奇的领域,探索 stream 提供的各种项目。如果你对学习机器学习的一切感兴趣,那么请随意查看我的教程系列,通过参考下面提供的链接,从零开始解释关于机器学习的每个概念。该系列的部分将每周更新一次,有时甚至会更快。
阅读《走向数据科学》中关于 Ml 的文章。共享概念、想法和代码的媒体出版物。
towardsdatascience.com](https://towardsdatascience.com/tagged/All About ML)
谢谢你们坚持到最后,我希望你们喜欢这本书。祝你有美好的一天!
5 个了不起的项目磨练你的深度学习技能

约书亚·阿拉贡在 Unsplash 上拍摄的照片
实践中学习
深度学习是一个非常多样化的领域,事物发展迅速。为了在游戏中保持领先,你需要不断提高你的技能。最有效的学习方法是边做边学。说到这一点,没有什么比亲身体验更好的了。为了在这个过程中帮助你,我收集了五个很棒的项目想法,你可以马上去做,让你的技能更上一层楼。在这些当中,你会发现其他的更实际,而其他的更理论化。然而,共同的事情是,你会从他们每个人身上学到很多东西。此外,如果你想找一份机器学习方面的工作,优质的项目组合是非常有益的。
为了使学习最大化,我建议你不要先看完整的项目就去尝试。当然,如果你陷入困境,参考现有的解决方案是有用的——我甚至会指出其中的一些——但是失败是学习的重要部分。
还是看项目本身吧!
1.从头开始实现卷积神经网络
在生产环境中,我们通常依赖高级框架和库来避免重复劳动并保持高效。这对快速产生结果很重要,但是它对你隐藏了底层的细节。我的经验是,确切地知道神经网络和反向传播如何工作就像一种超能力。不是很多人知道所有的细节,但它给人一种非常深刻的洞察力。
首先,我推荐斯坦福大学著名的 CS231n:视觉识别卷积神经网络课程。出于我们的目的,最重要的模块如下。
如果你对神经网络还没有一个较低层次的理解,我建议你在开始编码之前浏览一下。如果你被卡住了,我已经写了一个详细的指南,附带 GitHub 库。
通过从头开始构建神经网络来理解神经网络的细节
towardsdatascience.com](/how-to-build-a-diy-deep-learning-framework-in-numpy-59b5b618f9b7)
此外,Andrej Karpathy 最近的一个作品是 micrograd 库,这是一个极其简洁但功能强大的亲笔签名引擎。这也绝对值得一试!
当你从零开始构建你的第一个神经网络时,你会更加欣赏你最喜欢的深度学习框架。他们为你做了这么多工作!
2.卷积网络的可视化探索
对神经网络的一个普遍批评是,所得到的模型是不可解释的。这并不完全正确,尽管它们不像决策树那样容易解释。例如,如果我们谈论卷积网络,卷积层本质上是过滤器的集合。每个过滤器代表一个单独的图像处理操作。这些很少像经典的那样容易处理,例如用于平滑的高斯滤波器,但是如果你从正确的角度看它们,它们仍然可以揭示很多东西。
衡量滤波器表现的一种常用方法是构建一幅响应最大化的图像。让我们快速考虑一个例子。

什么图像可以最大限度地激活这个过滤器?稍加思考后,很容易看出这将是一个仅由强周期性垂直线组成的图像。(而带有水平线的图像根本不会激活此滤镜。)事实上,这个滤波器就是众所周知的 Sobel 算子,用于检测垂直线。总之,过滤器寻找的模式可以通过优化找到。一般来说,卷积网络的过滤器会随着你的深入逐渐学习发现越来越复杂的模式。以下是由在 ImageNet 上训练的 GoogLeNet 模型学习的特征的可视化。

GoogLeNet 特征可视化。来源:特征可视化作者:克里斯·奥拉,亚历山大·莫德文采夫和路德维希·舒伯特。发布于distilt,通过 3.0 US 许可在 CC 下可用。
如果您想更深入地探索您训练的模型,这里有两个很好的起点。
- 特征可视化由克里斯·奥拉、亚历山大·莫德文采夫和路德维希·舒伯特制作
- 卷积网络如何看待世界Francois Chollet
3.为您的深度学习模型构建 API
只有当数据科学家将模型交给开发人员时,模型的生命才开始。为了将它发布到产品中并向用户公开,应该提供一个简单统一的接口。如果没有这一点,模型的用户将不得不知道模型使用的确切框架,并相应地格式化他们的输入。这不仅不切实际,如果技术堆栈中存在差异,这还可能是一个严重的技术障碍。相信我,你不会想从 JavaScript 函数调用 Python 脚本的。
通常的处理方式是将模型放在 API 后面,并将其作为独立的服务进行部署。API 的用户(即希望使用您的服务的客户端,可以是移动应用程序、智能相机等)发送数据并以 HTTP 请求的形式接收答案。API 为模型正确格式化数据,调用预测函数,并以 HTTP 响应的形式返回答案。

用 Python 编写的模型的 API 的高级概述
在 Python 中,有几种构建 API-s 的框架
对于简单地打包你的模型,我不会推荐 Django,因为它没有这些轻量级。我个人最喜欢的是最近的 FastAPI,它非常适合这个任务。
如果你想看一个完整的例子,我用 FastAPI、Docker 和 GitHub 动作写了一个详细的指南和示例代码。
FastAPI、Docker 和 GitHub 操作实用指南
towardsdatascience.com](/how-to-properly-ship-and-deploy-your-machine-learning-model-8a8664b763c4)
4.为开源框架做贡献
在整个深度学习堆栈中,一个经常被忽视的方面是创造东西并使它们对其他人可用。如果你想一想,几乎所有的进步都是由于用户友好的开源机器学习框架的广泛采用而成为可能的。在我看来,熟悉投稿流程是所有机器学习工程师必备的软技能。它需要清晰的交流,并作为一个(可能非常大的)开发团队的一部分工作,这是一个很重要的经历。此外,您将看到您最喜欢的框架在幕后是如何工作的,这是增强您的知识的一个很好的方式。
在开始编码之前,请确保您熟悉框架的贡献准则。这些文件概述了应遵循的流程。要找到需要解决的问题,可以去存储库的问题页面。如果你刚刚开始,寻找good first issue标签,这通常很容易让你熟悉贡献工作流程。
您可以开始的一些项目:
贡献也是一种熟悉生态系统的好方法,也是结识志同道合者的好机会。
5.纸质复制品
扩大知识面的另一种方法是复制研究论文的结果。有些人足够幸运,可以以此为生(或者甚至发表研究论文),但即使这不是你的工作,也有很多好处。正如我们现在已经确定的那样,深刻的知识来自于构建事物,而不是阅读它们。即使你从高层次上理解了一个结果,也有很多重要的细节,只有当你把手弄脏了才会显露出来。了解这些是掌握一门特定学科的标志。
复制研究论文有各种各样的困难。有些比较简单,但有些需要付出很多努力和辛苦。这里有一个简短的完全主观的列表,可以帮助你开始。(我的主要领域是计算机视觉,所以偏向那个。)
初级水平
- U-Net:生物医学图像分割的卷积网络
- 用于图像识别的深度残差学习何、、任、
- 可视化神经网络的损失景观作者:郝莉、徐征、加文·泰勒、克里斯托夫·斯图德、汤姆·戈尔茨坦
中间能级
- 关于自适应学习率的方差及超越刘丽媛等人(修正的亚当论文)
- 使用循环一致对抗网络的不成对图像到图像翻译作者:朱俊彦、朴泰成、菲利普·伊索拉、阿列克谢·埃夫罗斯
- 伊恩·j·古德菲勒等人的生成对抗网络。
优等
- 面具 R-CNN 作者:明凯·何、乔治娅·格基奥萨里、彼得·多拉尔、罗斯·吉斯克
- 用于深度网络快速适应的模型不可知元学习作者:Chelsea Finn,Pieter Abbeel,Sergey Levine
最后的想法
我希望你已经发现这些想法很有趣,你已经准备好投入工作了!(收集真正的知识来自于你自己的创造,而最好的创造是那些对社会有益的东西。
让我们开始建造东西吧!
如果你喜欢把机器学习概念拆开,理解是什么让它们运转,我们有很多共同点。看看我的博客,我经常在那里发表这样的技术文章!
5 关于数据分析的基本数据质量检查
数据清理
一份全面的清单,这样你就不会错过任何重要的东西

在数据驱动的一代中,我们决定具体的数据分析报告。
这个决定的后果可能不值一百万美元。
在采取任何大的行动之前,数据总是让你感到自信和舒适。然而,如果你的分析是错误的呢?那会是什么呢…
事实上,数据验证是从报告、仪表板到建模的任何数据操作的关键过程。如果你处理有缺陷的数据,你不能指望它会有任何正确的行动。如果有人用它来做决定,你也会感到痛苦。
我曾在工作期间犯过一次分析错误。幸运的是,我有机会修复它
但是也许你没有我幸运。
这就是为什么我总结了我自己以前在这些数据质量问题上所面临的情况,以指导你们进行任何分析。在你错过它之前记住它。
分析单位

一旦获得数据,您就可以从一个简单的业务问题开始任何分析。之后,您可以根据需要对数据进行探索性的数据分析。当你只有一个数据集的时候,这就容易多了。
但是,如果您必须将几个数据集连接在一起,该怎么办呢?分析单位在这里起着重要的作用。
让我们从简单的例子开始;您有客户数据,每行代表一个客户。您想知道每个客户持有多少张信用卡。您需要将客户数据(每个客户一行)与会员信用卡数据(每张卡一行)连接起来。
需要记住的一点是,1 个客户可以持有多张信用卡。当我们将两个数据集连接在一起时,您需要小心地跟踪行号。因为您的数据集将不再停留在客户级别,而是在信用卡级别。无论是左连接、右连接、内连接还是外连接。这将导致你的分析结论。
这个例子看起来没什么好担心的,只要你能跟踪每个数据集的级别并知道你在做什么。如果您有足够的时间来理解每个数据集的分析单位,这可能不是问题。
但是,如果您必须在 3 小时内完成临时分析,并向高级经理汇报。此外,你从来没有看一眼数据集。
这时候问题就出现了,随时可能发生在你身上。相信我;我必须在有限的时间内完成许多意想不到的临时任务。
如今,当我对数据进行切片和切块时,这是我必须记住的第一件事。许多人在这一点上犯了一个错误,这是每个人在向其他人展示你的分析之前都必须知道的事情。
缺失值

缺失值可以是从空白、非空格、NULL、NaN 等范围内的任何值。基于你的数据集和工具(pandas,spark,excel 等),可能性是无限的。)你用于数据分析。有时它已经用一个数值编码了,比如-999,999999 等等。
如果你不熟悉你处理的数据集或系统,这会让你很头疼。在某些情况下,您可以简单地假设这些空白值就是缺失值。但是,对于编码,您可以猜测它应该是什么,或者询问数据源人员这些奇怪值的含义。
最糟糕的情况是你没有人可以求助。有时候,甚至没有人知道这件事。
此外,如果您通过了缺失值验证的第一步,缺失值仍然会导致您得出错误的结论。
例如,如果你使用熊猫图书馆来处理数据,有一个“值计数”方法,我通常在分析过程中使用很多。此方法的默认行为不考虑缺少的值。
这是你在彻底使用任何工具之前需要了解的。您可能报告了每个不同值的数量,但是您忘记报告在该列中大约有 80 %丢失了。
这导致了最后不同的结论。
此外,对于建模任务,您需要选择在中做什么,因为许多实现的算法不支持数据集中的缺失值。而且,你对它的处理在某些情况下会导致预测偏差。
我写了一篇关于过去那种缺失数据的文章。请随意看一看。解决这个问题没有简单的答案。如果你能通过询问和与他人确认来让事情变得更清楚,那将是最好的。分析团队和用户可以就该主题达成共识。
重复记录

切斯特·韦德在 Unsplash 上的照片
数据采集可以根据业务操作过程而变化。
源系统捕获数据的方式可能会导致重复。
假设您在不使用 count distinct 方法的情况下处理数据。你永远也不会知道。重复可以发生在不同的层次上。复制级别取决于您有多少列以及您想要做的分析单位。
假设您想要检查信用卡级别的重复。如果您删除 customer_id 和 credit_card_number 上的重复项,效果会更好。但是如果你只对 customer_id 感兴趣,就没有必要把 credit_card_number 带进来。
最近刚自己面对数据重复。我收到了在我工作的大楼里停车的数据集。由于源系统的原因,原始数据将被入口和出口交易捕获。
然而,入场交易似乎是一个模型。这里介绍了复制。
没有关于入口交易的有用信息,并且它可以导致建筑物中真实交易的数量翻倍。我很幸运有运营团队过去用来对比的基准数据。删除这些行后,我可以得到类似的结果。
不幸的是,当我收到数据时,没有人告诉我其中有这样的重复。我不得不自己重新检查,这种情况下我是幸运的。
想象一下,我在不知道数据中存在重复的情况下报告了数字。在我的职业生涯中,这将是一件非常可怕的事情。
好奇心是这里重要的一部分。在分析过程中,你应该经常问自己。根据其他数字,这个数字对你有意义吗?
例如,您有一个大约 2000 个空位的停车位,但是您有大约 4000 个客户的会员。有可能吗?可能会,也可能不会。你是那个必须找到答案的人。
数据有意义吗?

加里·巴特菲尔德在 Unsplash 上的照片
数据分析是你不得不在几方来回奔波的任务。每一方都有自己对数据的理解。他们从不同的角度看待它。大多数时候,他们头脑中有一个熟悉的数据数字。你的责任是把这些数字联系起来。把每一条信息做成一幅大图。
困难的是你可能不熟悉通常的数据数量。这就是为什么我在这里提出数据对你有意义吗?
我建议你要一直怀疑数字是否正确。从前面的数据复制示例中,您可以看到,即使乍一看这个数字对您来说似乎是正确的,它也可能不是 100 %正确。除非你问自己一个问题,否则你永远不会知道这个值是对还是错。
我发现这个数字对你来说可能有些意义,但对其他人来说却没有意义。
业务团队是与运营紧密合作的团队。他们必须每天或每周跟踪度量值。
我建议您先与运营团队核对每个结论的数量,然后再最终确定给管理团队进行每个数据分析。
我曾经信任这些数据,并进一步分析它们,直到有机会与业务团队讨论。然后,事实给了我很大的打击,我的结论是不可能的。这种场景在真实的操作过程中应该不会发生。因此,我花了更多的时间来调查数据发生了什么。
甚至最后一切似乎都是对的。但是,它可能从一开始就错了。
经常问自己一个关于数字的问题,不要自己假设什么大的事情。你的好奇心和与他人的交流在这里是必要的。
真理随着时间而改变。

由 Unsplash 上的 Vlad Sarge 拍摄的照片
我曾经把分析提交给我的领导。两个星期后,他回来问我目前的分析结果。我重新运行了分析并报告了更新后的数字。但是,我得到了问题。
为什么这个数字在两周内变化这么大?
这个简单的问题花了我好几天才解决。问题是那天之后,我提交了分析。数据工程团队已经修补了数据湖中的表。这导致了一些行中的数字变化,这导致了我的更新的不同数量。
但是这个分析的正确数字是多少呢?答案是取决于你查询数据的日期。这些数据在两周前的那个时候是有效的,但是现在有了更多的有效数据。
数据的真实性会随着时间而改变
你是唯一一个遭受这个问题的人,因为你必须保证你的分析的有效性。如果您单独保存查询数据,您可以复制结果来证明您的可信度。有时候,业务团队不会理解这一点,导致对你未来分析的信任度降低。
那么,如何解决这个问题呢?
基于这个问题,有一个设计数据湖的最佳实践。你可以在 Robert Chang 写的数据工程初学者指南—第二部分中找到它。这叫做强制等幂。我真的建议你看看这篇文章。它在高超的解释水平上,解决了我们前面谈到的那些问题。
但是如果你没有一个数据工程团队来处理这个问题。我可能会建议您备份您的数据源。这只是为了确保你能重现过去的数字。有时候,它会挽救你的信誉。
最后
我们已经讨论了许多话题。在每一部分里,我都分享我过去做错了什么。有一个坚实的方法来解决一些问题,但你需要记住,并自己评论一些。数据分析是一项非常需要你关注的任务。
代码中的一个错误会导致可怕的结果。
当你与他人打交道时,信誉是一个重要的因素。如果你保持高水平的信用,会让其他人基于你的报告做出决定。
但是,如果你犯了错误,你需要勇于承认并修正自己。
这是你如何成长为职业生涯中的高管或更高职位的一部分。你要为自己的所作所为负责!我们可以通过摔倒来学习。每个人都是从自己的错误中成长起来的,就像历史上那句名言。
唯一不犯错误的人是从不做事的人。——罗斯福总统。
不要害怕去做!
每个机器学习工程师都应该知道这 5 种算法
机器学习算法
学习这些基本算法可以增强你的理解和技能

克里斯·本森在 Unsplash 上的照片
机器学习 (ML)是一种自动建立分析模型的数据分析方法。它是一个技术分支,允许计算机系统从大量数据中学习,识别图像和文本中的模式,并在最少的人工干预下做出统计决策。
最基本的, 机器学习 使用预编程的算法,接收和分析输入数据,在可接受的范围内预测输出值。随着新数据输入这些算法,它们学习并优化它们的操作以提高性能,随着时间的推移发展“智能”。
选择正确的 机器学习 算法取决于几个因素,如数据大小、质量和多样性,以及支持我们预测的业务目标。我已经编辑了一个十大最常用的机器学习算法列表,这将有助于为任何特定的挑战找到最合适的用例。
线性回归
线性回归 是监督学习的一部分,它试图通过将线性方程拟合到观察到的数据来模拟任意两个变量之间的关系。一个变量被认为是解释变量,另一个被认为是因变量。线性回归线具有形式为 Y = a + bX 的方程,其中 X 是解释变量, Y 是因变量。直线的斜率为 b , a 为截距。
一旦线性回归模型被拟合到一组数据,残差(拟合线与观察值的数据点偏差)的检查允许建模者调查他或她存在线性关系的假设的有效性。
拟合线性回归线最常用的方法是最小二乘法。该方法通过最小化每个数据点到直线的垂直偏差的平方和来计算观察数据的最佳拟合直线(如果一个点正好位于拟合直线上,则它的垂直偏差为 0)。
k 近邻
k 最近邻算法(k-NN)是一种基于实例的学习方法。它被认为是所有机器学习算法中最简单的一种。k-NN 的合理性在于相似样本属于同一类的概率大。k-NN 算法的关键思想是首先为每个测试样本选择 k 个最近邻,然后使用学习的 k 个最近邻来预测该测试样本。

k-NN 经常被说是‘懒学习’的一部分。懒惰学习意味着算法不进行归纳。这意味着存储所有的训练数据,并等待直到产生测试数据,而不必创建学习模型。因此,当使用 k-NN 时,所有的训练数据都用于测试。
下面的知识库解释了如何使用 k-NN 在流行的 Iris 数据集中对不同类型的花进行分类。
使用 Kaggle 笔记本探索和运行机器学习代码|使用鸢尾物种的数据
www.kaggle.com](https://www.kaggle.com/skalskip/iris-data-visualization-and-knn-classification)
距离度量
k-NN 算法基于与测试样本最接近的 k 个最近邻中的大多数相似样本对未标记的测试样本进行分类。这是通过使用所谓的“距离度量”来完成的,其中测试样本和每个训练数据样本之间的距离被确定。在通常的实践中,使用欧几里德距离。

研究人员可能对 k-NN 的某些特性感兴趣:
- 对于多类分类问题易于实现
- 不同的距离标准可供选择(例如欧几里德距离、汉明距离等。)
- 不需要假设,因为 k-NN 是一个非参数算法。
支持向量机(SVM)
支持向量机 (SVM)是一种由分离“超平面”形式定义的判别分类器。换句话说,给定带标签的训练数据(监督学习),算法输出最佳超平面,该超平面根据分类目标将新示例分类到多个组中。
SVM 旨在通过将超平面训练到最佳量来优化表示两个类之间垂直距离的线性判别模型。
在 Python 中,有很多常用的库来实现 SVM ,其中最流行的是 scikit-learn 。它是一个广泛用于实现机器学习算法的库。Scikit learn 有大量内置应用程序(导入库、对象创建、拟合模型和预测)来帮助使用 SVM 创建预测类。

支持向量机具有强大的理论基础和优秀的实证成功。它们已经被应用于各种任务,例如手写数字识别、图像/对象识别、文本分类、自然语言处理等等。
随机森林分类器(或决策树)
随机森林是最流行、最强大的机器学习算法之一。它是一种类型的集成机器学习算法,称为 Bootstrap Aggregation 或“bagging”。该算法构建了一个“森林”,它本质上是多个决策树的集合。

随机森林的一个显著优点是它可以用于分类和回归问题。
随机森林是一种平均多个深度决策树的方法,在同一训练集的不同部分进行训练,旨在减少方差。这是以偏差略有增加和可解释性有所损失为代价的,但通常会显著提高最终模型的性能。
随机森林就像是决策树算法工作的集合——许多树的协同工作将提高单个随机树的性能。尽管不太相似,森林给出了 K 倍交叉验证的剩余效应
随机森林算法有相当多的几个特点比如:
- 它可以在不删除变量的情况下处理数千个输入变量。
- 它有一个有效的方法来估计缺失数据,并在大部分数据缺失时保持准确性。
- 它计算事例对之间的邻近性,这些事例对可用于聚类、定位异常值或(通过缩放)给出有趣的数据视图。
- 其算法将避免过拟合的常见问题。
- 它有在类总体不平衡数据集中平衡错误的方法。
- 它提供了一种实验性的方法来检测变量间的相互作用。
逻辑回归
逻辑回归或有时称为逻辑模型或 logit 模型分析多个自变量和一个分类因变量之间的关系,并通过将数据拟合到逻辑曲线来估计事件发生的概率。逻辑回归有两种模式——二元和多项式回归。
二元逻辑回归主要用于测量因变量,自变量或者是连续变量,或者是分类变量。逻辑回归不需要基于最小二乘法的线性回归模型的许多主要假设。
逻辑回归还可以处理因变量和自变量之间的非线性关系,因为它应用了线性回归的非线性对数变换。
用 Python 从头开始实现逻辑回归
github.com](https://github.com/perborgen/LogisticRegression/blob/master/logistic.py)
最后
在机器学习领域,有大量算法非常重要。然而,在机器学习中,你不必知道所有可用的算法。
如果我已经设法让你注意到这一点,请留下你的评论,如果你对这个系列有任何建议,因为它将大大增加我的知识,改善我的写作方式。 普雷姆·库马尔 是一个无私的学习者,对我们身边的日常数据充满热情。如果你想谈论这个故事和等待的未来发展,请在 上与我联系。
2020 年及以后人工智能领域的 5 个最佳职业
人工智能是向前发展的领域

图片:iStock
许多人担心机器人和人工智能(AI)系统会抢走他们的工作。在一定程度上,这些担心是有根据的。根据麦肯锡全球研究所的数据,到 2030 年,多达 7300 万个美国工作岗位可能会实现自动化。
虽然这只是表面上的问题,但许多人忽略了自动化实际上是一件好事的事实。它使工人远离有害环境,加快生产线速度,并为更好的整体机会铺平道路。机器人和人工智能接管某些工作并不意味着不会有其他工作可供选择。
尽管如此,让你的工作被机器人抢走的想法还是令人害怕。这就是为什么许多人都在寻找一个面向未来的职位。按照这种逻辑,没有比人工智能更好的工作领域了。即使机器接管了无数的工作,人类仍然有必要对算法进行编程。
此外,人工智能领域的工作报酬丰厚,因为公司需要最聪明的头脑来创造未来的解决方案。无论你是刚准备开始你的职业生涯,还是正在重新掌握一个新的职位,这五个人工智能工作都是最好的。以下是你如何被录用的方法。
机器学习工程师
在其核心,人工智能依赖于一种被称为机器学习的技术。它涉及到精心制作的算法和软件平台,使人工智能能够完成它的工作。当然,那些需要有人去创造。
机器学习工程师能够胜任这项任务——他们的努力带来了114,000 美元的中位工资。他们主要负责构建和管理这些平台。那些具有数据科学背景并精通多种编程语言的人是该职位的理想候选人。
机器学习工程师可以预期使用预测模型、自然语言处理、大规模数据集和各种其他开发工具。就教育程度而言,大多数公司寻找拥有数学或计算机科学硕士或博士学位的人。
对于没有这些学历的人来说,一份普通软件开发员的工作是一个很好的起点。这不仅能让你获得所需的编程技能,还能让你获得解决问题和分析技能的宝贵经验。
数据科学家/工程师
任何熟悉人工智能领域的人都知道,数据胜过一切。它是每个算法和应用程序的核心。因此,非常需要知道如何处理数据的人。数据科学是一个广阔的领域,但由于两者之间的相似性,它与人工智能领域紧密交织在一起。
那些从事数据科学家工作的人有望获得年薪 113,000 美元的中位数工资。然而,这些职位不是任何人都能胜任的。公司希望数据科学家拥有计算机科学的硕士或博士学位。
值得注意的是,成为一名数据科学家可能非常适合那些对从头开始编程不感兴趣的人。担任数据科学角色的个人通常使用大数据工具,如 Hive、Hadoop、MapReduce、Pig 和 Spark。然而,这并不意味着编程不是工作的一部分。深入了解 Perl、Python、Scala 和 SQL 等语言也是必要的。
鉴于数据科学家的工作要求很高,大多数人不会在毕业后立即找到工作。在相关职位上有多年工作背景的人通常会被优先考虑。
人工智能研究科学家
没有研究就没有人工智能领域的进步。因此,人工智能研究科学家非常受欢迎。希望担任其中一个职位的个人,年薪中值可达 77,000 美元。虽然这并不像前面提到的两个职位那样有利可图,但研究领域充满了赚钱的方法。
例如,一项重大突破可能价值数百万。同样,那些敢于创建自己的人工智能研究公司的人可能会被以数百万甚至数十亿美元的价格收购或并入一家更大的公司。
人工智能研究科学家需要拥有多个人工智能学科的专业知识。这些领域包括应用数学、机器学习、深度学习和计算统计。虽然高学历通常是有利的,但许多研究机构和公司也看重相关领域的经验。
自然语言处理
虽然人工智能几乎在每个行业都有用途,但大多数面向消费者的产品都围绕语言。这些包括从聊天机器人到虚拟助手到视频游戏的一切。显然,计算机不像人类那样交流。然而,人工智能可以用自然语言处理来弥合这两者之间的差距。它涉及使用机器学习来教会计算机像人类一样理解和说话。
这也是一个不断发展的领域。有技能获得自然语言处理工作的人应该期望年薪在 107,000 美元左右。有计算机科学的高级学位更好。大多数人还寻求与语言学和人机界面相关的额外资格。
商业智能工程师
虽然成为一名软件工程师是计算机科学“性感”的一面,但对不那么迷人的一面也有着惊人的需求。商业智能工程师使用人工智能来分析复杂的数据,以确定商业趋势。这些人在帮助公司提高利润率和效率方面发挥着关键作用。
商业智能工程职位的平均工资通常为 81,000 美元。有兴趣追求这样一个职位的人应该有很强的分析能力。他们还需要能够与不是来自技术或计算机背景的同事进行有效的沟通。
值得注意的是,商业智能工程师通常不需要高等学位。拥有学士学位通常就足够了。然而,在职经验和证书是可取的。
随着人工智能继续扩展到新的行业,这一领域的工作将变得更加丰富。那些现在能够找到工作的人将会在十年后成为行业专家。
原载于 2020 年 6 月 8 日 https://www.theburnin.com**的 。
Python 专业面向对象编程的 5 个最佳实践
处理异常的最好方法是编写文档、类继承的装饰器和自动清理代码的包。
构建 Python 类总是很有趣。但是为了效率、外部使用和文档化,对它们进行适当的打包是非常重要的。在本文中,我将介绍记录、维护和测试 Python 类的五种最佳实践。这些方法包括处理异常、编写文档和文档测试、类继承和数据管理的装饰器、抽象类以及清理和格式化代码的自动化包的最佳方式。

来源: Unsplash
1 -异常处理
构建 Python 类很酷。但同样重要的是,要确保当不正确的输入被输入到函数中时,你正在引发正确的错误。这里有一个例子:假设你正在构建一个函数来接受一个整数“n ”,并用它来构建一个大小为 n×n 的数组。下面是代码的样子:
现在,让我们运行这个函数,但是我们将输入一个字符串“a”而不是一个整数。以下是我们得到的结果:

TypeError 不是帮助调试问题的最直观的消息,尤其是如果您的包将被广泛的受众使用。让我们对我们的原始代码做一点修改。
上面的代码检查输入的整数是否是整数。如果不是,它将引发一个带有定制消息的 TypeError。它还检查整数是否为非负。如果不是,它会引发一个 ValueError,要求用户必须提供一个正整数。
以下是一些测试案例:


为什么这很重要?提出正确类型的直观消息对于构建易于调试的包极其重要。如果用户不能理解或调试你的包的需求,他们就不会使用它。
用户可以引发各种各样的内置错误,如 SystemError、FileNotFoundError 等。你可以在这里阅读更多关于它们的信息。通过调试这些错误,用户为包构建用例。这就把我们带到了下一步——文档。
2 —文件
曾几何时,我们常常在代码中编写注释来恰当地解释它。但是注释并不是记录工作流的最结构化或最具视觉吸引力的方式。您应该使用带三个撇号的结构化文档来为您的代码编写结构化文档。这里有一个例子:
在上面的代码中,我们已经将所有的信息转移到我们在函数开始时写的一个段落中。所有信息都包含在开头的三个撇号和结尾的三个撇号中。大多数 Python 包都是用这种技术记录的。
3 —测试(Doc 测试)
在大多数 python 文档中,开发人员还包括该函数的文档化用例。这些用例也被用作“测试”,以确保函数提供正确的响应。利用我们在上面学到的文档技术,我们还可以编写文档测试,既可以用作用例,也可以在函数上运行测试。在这些测试中,我们指定了预期的输出。如果实际输出与预期输出不匹配,doctest 就会失败。下面是一个生成随机 id 的函数中的文档测试示例:
def random_id(length):
"""
This function creates a random configuration
key for a given length. Inputs:
- length (Type: int and positive)
Outputs:
- ID (Type: str)
DocTest 1
>>> len(random_id(50)) == 50
True
DocTest2
>>> random_id('hello')
Traceback (most recent call last):
...
TypeError: The input must be a positive integer.
""" if type(length) != int or length < 1:
raise TypeError('The input must be a positive integer.') choices = '0123456789abcdefghijklmnopqrstuvwxyz' id = '' for _ in range(length):
id += random.choice(choices)
return id
在上面的文档中,文档测试由符号“> > >”表示。该符号之后的 python 代码由 doctests 编译器执行。预期产出显示在该线下方。如果是错误,会在第二个 doctest 中指出,如上所示。让我们用 doctest 库运行这个文件。
您需要在。包含上述代码的 py 文件:
if __name__ == "__main__":
import **doctest**
doctest.testmod()
现在,让我们用下面的 bash 命令运行 doctest:(我已经将我的文件命名为 random_id.py)
python random_id.py -v

所以我们的代码通过了所有的文档测试。但是这些 doc 测试非常简单。您也可以编写更复杂的 doc 测试。当您继续编辑和维护 Python 类时,确保没有任何会导致 doc 测试失败的错误或问题是很重要的。
4 —遵循 pep8 指南
pep8 指南是 Python 包的编码约定。虽然这些约定并不严格,也不影响代码的正确性,但是它们对于发布易于阅读、理解和维护的代码是有价值的。一些最突出的准则如下:
- 每行代码不得超过 80 个字符。如果代码行超过了这个长度,您可以使用' \ '符号在下一行继续编写代码。如果在函数中指定输入,就不需要使用反冲,因为 Python 保持代码连续。这只是字符串的问题,这就是' \ '有用的地方。
- 所有库必须在开始时一起导入,不能有任何重复。为什么?如果存在依赖问题,它会被提前突出显示,而不是在代码执行的时候。
- 冗余变量或中间变量(不执行进一步的操作)应该被删除以节省内存。
但是您不必手动实现所有这些准则。有一个名为 pycodestyle 的 python 包,它将一个 python 文件作为输入,并突出显示它的每个问题。
让我们在同一个 random_id.py 文件中运行 pycodestyle。该消息强调了两个函数之间没有足够的行(推荐的空行是 2 行),并且第 6 行太长。

您还可以运行一个名为 autopep8 的包,它获取一个 python 文件,并根据 pep8 准则自动对其进行重新格式化。点击此处了解更多关于 autpep8 的用法。
5 —使用抽象类和继承
在面向对象编程中,人们应该减少他们必须做的编码量。这意味着编码者应该构建抽象的类,并且更普遍地适用于广泛的对象。例如,我正在构建一个桌子的模拟,我需要编写代码来模拟钢笔、笔记本、铅笔、橡皮、卷笔刀等对象。但是我们不会为每一个对象编写另一个类。我们将编写一个名为“Table_Object”的抽象类,如下所示:
abstractclass 装饰器是一个特殊的函数,它表示对象的类型。现在,让我们定义另一个类,它用 object_type 的特定函数继承这个类的所有数据。
在这里,我们定义了两个类,它们从 Table_Object 类“继承”,然后成为与成为表对象的主要思想相关的专用继承类。类继承允许减少代码的重复性,也允许类的层次结构对于不是专家的程序员来说是有意义的。
您在 Table_Object 中看到的“@”符号称为装饰符。装饰器是另一个简单的函数,它允许你为不同的函数添加一个特殊的特性。Python 类中还有另一个装饰器,叫做静态方法。这些方法是“静态”的,调用时不会继承该类。它们通常用于保持类的一部分不受变化的影响。
对于专门的数据驱动类,您应该使用 dataclass 装饰器。在这里阅读更多关于他们的信息。
我希望你喜欢阅读这篇文章。如果你有任何问题,请随时通过 LinkedIn 联系我。编码快乐!
带有完整代码片段和有用链接的 5 个最佳 Python 项目创意!
为 Python 和机器学习创建一份令人敬畏的简历的 5 个最佳项目想法的代码片段和示例!

乔尔·霍兰德在 Unsplash 上拍摄的照片
Python 是一种优秀的编程语言,适合从初学者到高级用户。它正在成为一种非常流行的语言,同时也是当今谈论最多的编程语言,这要归功于它的灵活性。
编码语言 python 不仅易于学习和实现,而且在保持简单性的同时提供了广泛的多样性。Python 作为一种总体上易于入门和实现顶级项目的语言,为我们提供了执行各种选项的空间。
今天,我们将讨论 5 个项目想法,我们将在 python 的帮助下实施这些想法。我已经提到了 2 个初级项目的想法,另外 2 个中级项目的想法,最后,1 个复杂项目的想法。
我将用必要的代码、示例、基本指南和有用的链接来彻底讨论每个项目想法,以帮助您开始构建提到的 python 项目。
简单的介绍结束后,让我们深入到本文有趣的部分,详细讨论每一个项目,这样您就可以马上开始工作了!
基本启动项目
1.从简单到高级的计算器:

作者截图。参考— GitHub
这个要实现的基本项目可以用你选择的任何方式来完成。让我们分析一下这个简单的计算器项目是如何针对每一类难度执行的。我将从简单计算器的初学者实现开始,但即使你有基本的编程知识,也要坚持到本节的下一部分,因为我有一些建议,可以让这个项目更上一层楼,如上图所示。
如果你是一个初学者,刚刚开始使用 python,那么请参考下面提供的入门代码,这是你理解 python 中函数使用的最好方法之一。
通过上面显示的简单代码,您已经成功地创建了四个函数来计算计算器的四个基本操作。要从用户处获取两个输入用于计算目的,可以使用下面的代码块赋值。
在执行下面的代码块之后,我将为我的两个数字赋值,比如 5 和 2,用于解释计算。你可以根据你的要求随意声明你想要的任何数字。下列作业的答案应该如下:
Enter the first number: 5
Enter the second number: 2
The Sum is: 7
The Difference is: 3
The product is: 10
The answer is: 2.5
这部分完成了简单的计算器程序。然而,这还没有接近尾声。使用各种技术可以做出大量的改进。让我们讨论一下如何完成这项任务。对于中级程序员,我强烈建议您通过使用函数可用的*args 选项,超越两个输入整数,使用更高的 n 元素方法。然后,尝试使用类来更精确地理解这个概念,并开发一个更复杂的计算器。
对于同一个项目的更高级或专家级的构建,可以查看像 Tkinter 这样的图形用户界面库。使用这个模块,用户可以为你的计算器开发一个很棒的 GUI 结构。也有其他图形模块可以使用,但我个人推荐 Tkinter 作为一个很好的起点。参考上图中 GitHub 链接中编程知识用户提供的惊人代码片段,获得计算器开发的简明指南。
2.没有机器学习库的矩阵乘法;

作者截图和图片
python 和机器学习的一个重要方面是理解这些概念背后的数学,并了解机器学习库中的一些代码。为了更好地掌握这些概念,有必要实践在 numpy 和 scikit 等科学模块中实现的思想——自学。一个这样的编程应用是在不使用任何 ML 库的情况下执行矩阵乘法运算。
要完成这项任务,主要要求是了解矩阵是如何工作的。完整的解释和指导可以从我下面的文章中获得。但是,如果您只是对这个编码问题的基本要点感兴趣,并想尝试自己解决这个问题,那么使用下面的参考段落来帮助您开始。
[## Python 从头编码:没有任何机器学习库的矩阵乘法!
从零开始了解如何在没有任何机器学习库的情况下实现矩阵乘法!
towardsdatascience.com](/python-coding-from-scratch-matrix-multiplication-without-any-machine-learning-libraries-463624fe8726)
我解决这个问题的方法是从用户那里获取所有的输入。这些是第一和第二矩阵的行数和列数。同样,根据每个矩阵的行数和列数,我们将相应地分别填充备选位置。
在做任何矩阵乘法之前,第一步是检查两个矩阵之间的运算是否实际可行。这可以通过检查第一矩阵的列是否匹配第二矩阵的行的形状来完成。这可以表述为:
→矩阵 1 中的列数=矩阵 2 中的行数
这应该是你入门的一个很好的起点。
中级项目:
3.从头开始构建您选择的游戏:

我的第一个项目的作者过时的 GIF
你们在上面看到的过时的 GIF 是我三年前在 pygame 的帮助下完成的第一个项目。如果你想要一个更简洁的关于如何用 python 从头开始构建的指南,请告诉我。但是这里的主要思想是用 python 自己从头开始构建一个游戏。从一些简单的游戏开始,比如蛇游戏,或者井字游戏,然后通过强化学习进行更高级的游戏,比如 flappy birds。
完成这项任务背后的想法更多的是个人观点和偏好。我相信掌握任何编程语言的最好方法之一就是从一个有趣和令人愉快的项目开始。我也有点沉迷游戏。为了开始与 python 相关的游戏项目,我强烈推荐使用 Pygame 库模块来执行这类程序。
使用 pygame 模块,您可以用 python 构建一些简单有趣的游戏。然而,不要期望任何过于花哨的东西,因为它有其局限性。不管怎样,这是一个很好的开始方式,下面是开始代码。只需用一个简单的 pip 命令安装 pygame,然后使用下面的 import pygame 命令。成功导入模块后,将出现以下消息。
pygame 1.9.6
Hello from the pygame community. [https://www.pygame.org/contribute.html](https://www.pygame.org/contribute.html)
根据安装时间的不同,版本可能会有所不同,所以不要太担心。在任何情况下都使用更新的版本。我将介绍一些你应该知道的基本命令以及它们是如何工作的。下面是 pygame 入门所需了解的所有重要方面的完整代码块。
#imports the pygame library module
import pygame# initilize the pygame module
pygame.init()# Setting your screen size with a tuple of the screen width and screen height
display_screen = pygame.display.set_mode((800,600))
# Setting a random caption title for your pygame graphical window.
pygame.display.set_caption("pygame test")# Update your screen when required
pygame.display.update()# quit the pygame initialization and module
pygame.quit()# End the program
quit()
我强烈建议你看看 YouTube 上的一些视频,以便更好地理解和学习制作一些游戏。pygame 模块的文档虽然有点冗长,但可能是了解这个模块更多信息的最佳资源之一。
4.文本到语音和光学字符识别:


作者提供的图片— 1。GTTS 语音合成| 2。OCR 流程
我们将关注的下一个中级水平是拥有 python 编程知识的最酷的方面之一。复杂的任务,如文本到语音的转换和 python 的光学字符识别,只需要理解为此目的创建的 python 库模块就可以完成。
文本到语音(TTS)是将单词转换成有声音频形式的过程。程序、工具或软件从用户处获取输入文本,并使用自然语言处理方法,理解所使用语言的语言学,并对文本执行逻辑推理。该处理后的文本被传递到下一个块,在那里对处理后的文本执行数字信号处理。随着许多算法和转换的使用,这个处理过的文本最终被转换成语音格式。这整个过程包括语音合成。
光学字符识别是通过使用电子或机械设备将二维文本数据转换成机器编码的文本形式。二维文本数据可以从各种来源获得,例如 PDF 文件之类的扫描文档、具有以下格式的文本数据的图像。png 或者。jpeg、路标(如交通标志)或任何其他带有任何形式文本数据的图像。光学字符识别有广泛的有趣应用。
下面是两篇文章的列表,对于您熟悉用于语音翻译的 Google 文本到语音模块和用于光学字符识别的 pytesseract 模块非常有用。请参考下面的文章,获得全面的入门指南,并一起使用它们执行项目。
[## 如何使用 Python 开始使用 Google 文本到语音转换
从零开始的文本到语音转换简介
towardsdatascience.com](/how-to-get-started-with-google-text-to-speech-using-python-485e43d1d544) [## 使用 Python 开始光学字符识别
对光学字符识别从无到有的直观理解和简要介绍
towardsdatascience.com](/getting-started-with-optical-character-recognition-using-python-e4a9851ddfab)
您可以在更高级的项目中充分利用这些模块,例如将它们用于序列对序列,注意构建机器翻译的深度学习模型等等。体验和探索这些库的乐趣。
高级项目:
5.从头开始虚拟助手:

Brannon Naito 在 Unsplash 上拍摄的照片
在虚拟助手项目中,你的计算机会听你的每一个命令,并执行你所有想要的任务。这个项目将有助于用一个简单的声音命令来控制你的所有活动。
你可以在用你的声音打字后执行像电子邮件自动化这样的操作,虚拟助手会自动完成所需的自动更正。你也可以命令你的虚拟助手浏览互联网,或者打开任何网站,或者购物,或者做任何你想做的事情。我将检查我的一个虚拟助理项目,但你可以自由创新,也可以尝试任何你自制的想法。所有参考链接也可在本节的相应部分找到。
首先,我希望我的虚拟助理只允许我或我选择的成员访问。我建了一个智能面锁系统只允许我进入。我利用深度学习技术和 python 构建了人脸识别模型。这个项目的完整的简明反馈可以从下面的链接获得。
建立高精度人脸识别模型
towardsdatascience.com](/smart-face-lock-system-6c5a77aa5d30)
我希望我的虚拟助手做的下一件事是在我的脑海中自动预测下一个单词,并执行下一个单词的预测任务,以更快的速度完成我的消息,而不需要太多的努力。使用 python 的自然语言处理和深度学习的下一个单词预测模型完成了这个任务。
下面是实现下一个单词预测模型的完整、简明的指南,它深入地涵盖了所有这些概念。
使用 LSTM 设计单词预测系统
towardsdatascience.com](/next-word-prediction-with-nlp-and-deep-learning-48b9fe0a17bf)
我的虚拟助手项目的最后一部分是聊天机器人的实现。我希望有一个伙伴能和我说话,理解我说的话,并做出适当的回应。我用一个讽刺的数据集设计了我的聊天机器人,这使得聊天机器人回复充满讽刺的有趣消息。下面是使用 Python 和深度学习从头开始构建聊天机器人的完整而简明的指南。
从头开始使用深度学习和 Conv-1D 层构建聊天机器人
towardsdatascience.com](/innovative-chatbot-using-1-dimensional-convolutional-layers-2cab4090b0fc)
你可以随意做同样的事情,我已经实现了我的上述想法或尝试一些独特的和创新的与你的风格指南的虚拟助理项目的实施。
GIF 来自 GIPHY
结论:
本文中提到的这五个项目对所有级别的程序员都有用,不管您是刚刚入门还是已经掌握了中级到高级的 Python 知识。如果你对本文提到的这五个项目有任何疑问,请随时联系我。
人工智能正在崛起,我们甚至接近征服整个宇宙。有了这些 python 项目和对诸如稀疏等概念的理解,我们都可以学习并发展到一个更加进化的现代时代。
如果您对涵盖令人惊叹的项目想法的类似文章感兴趣,请查看我以前的一篇文章,其中涉及 5 个可以用 python、机器学习和深度学习实现的令人敬畏的计算机视觉项目。
[## 5 个关于 Python、机器学习和深度学习的超棒的计算机视觉项目创意!
讨论 5 个很酷的计算机视觉项目,学习新的技能,增强你的简历
towardsdatascience.com](/5-awesome-computer-vision-project-ideas-with-python-machine-learning-and-deep-learning-721425fa7905)
查看我的其他简明指南,了解更多关于 python 的知识,并理解您需要了解的关于 python 的一切,以便习惯用它为机器学习项目编程。
了解精通机器学习的基本要求
towardsdatascience.com](/starting-your-journey-to-master-machine-learning-with-python-d0bd47ebada9) [## 机器学习所需的 Python 基础知识及其库模块
学习 python 数据结构的基础知识,对机器所需的每个库有直观的理解…
towardsdatascience.com](/basics-of-python-and-its-library-modules-required-for-machine-learning-51c9d26026b8) [## 5 个常见的 Python 错误以及如何避免它们!
从初学者到专家,每个人在 python 和机器学习中都容易出现这些错误。
towardsdatascience.com](/5-common-python-errors-and-how-to-avoid-them-63d9afc1a58f) [## 10+牛逼 Python 编辑器的简明指南,以及如何选择最适合你的编辑器…
帮助您在各种 python 开发环境中进行选择的简明指南
towardsdatascience.com](/a-concise-guide-of-10-awesome-python-editors-and-how-to-choose-which-editor-suits-you-the-best-465c9b232afd)
谢谢你们坚持到最后。我希望你喜欢读这篇文章。祝大家有美好的一天。
您[可能]不知道的 5 个 Bigquery SQL 命令
将对您的数据科学职业生涯有巨大帮助的 5 个 SQL 技巧

作者图片
读者好。
如果你正在阅读这篇文章,你可能是一名数据从业者,或者渴望成为一名数据从业者。欢迎来到数据世界,在这里放松一下,你将会花相当多的时间学习新的东西。
随着数据科学领域工作需求的增加,人们渴望掌握该职业所需的技能。Python、机器学习、数据可视化,不胜枚举。然而,一项经常被忽视的技能是…
结构化查询语言
SQL 一直是所有数据库的首选查询语言,而且它不会很快走向任何地方。所有数据科学家都必须从某个地方获取数据。通常情况下,它来自 SQL 关系数据库。
快进到今天,我们可以在自己的公司中运行 SQL 相关的数据仓库。这些是 OLAP(在线分析处理)数据库,通常允许复杂的查询和与数据可视化工具的协作,同时不会干扰生产数据库。
著名的有 Google Bigquery,Amazon Redshift,Azure SQL 数据仓库,不胜枚举。
在这篇文章中,我们将讨论一些独特的 SQL 命令,这些命令你可能不知道,但是当你碰到类似的砖墙时,它们将会有很大的帮助。
让我们开始吧。
1.JSON 列到表

作者图片
如图所示,这是一个命令,我们用它将一个属于 JSON 字符串类型的 Bigquery 列转换成一个完整的表。您可能会在执行数据工程任务(通常来自外部数据源)时遇到这种情况。
这里,我们可以使用 JSON_EXTRACT_SCALAR Bigquery 命令。
**JSON_EXTRACT_SCALAR(<JSON COLUMN>, $[<PARENT>])**
在这个命令中,JSON 字符串被拆分成父、子和子。
函数是这样工作的:
JSON _ EXTRACT _ SCALAR(JSON _ STRING," $[' PARENT_NAME ']")将得到子值。对于数据工程师来说,可以把它看作是一种键值的概念。
在本例中,
我们使用 JSON _ EXTRACT _ SCALAR(saved _ fields," $[' email ']"),这将在 JSON 字符串中产生一列所有电子邮件。很酷吧。
来自鹳的 Gif
如果孩子是在一个列表格式中,就像这个例子中的父 language_skill 一样,该怎么办?
我们可以使用 JSON _ EXTRACT _ SCALAR(saved _ fields,“$。language_skill[0]"),这将为您提供列表中的第一个元素作为列。
差不多就是这样。为了提取该列中的所有信息,我们使用
**SELECT** JSON_EXTRACT_SCALAR(saved_fields, "$['email']") **as** email, JSON_EXTRACT_SCALAR(saved_fields, "$['name']") **as** **name**, JSON_EXTRACT_SCALAR(saved_fields, "$['phone']")**as** phone, JSON_EXTRACT_SCALAR(saved_fields, "$['gender']")**as** gender, JSON_EXTRACT_SCALAR(saved_fields, "$['nationality']")**as** nationality, JSON_EXTRACT_SCALAR(saved_fields, "$['birthday']")**as** birthday, JSON_EXTRACT_SCALAR(saved_fields, "$['experience_seeker']")**as** experience_seeker, JSON_EXTRACT_SCALAR(saved_fields, "$.language_skill[0]") **as** language_skill_1, JSON_EXTRACT_SCALAR(saved_fields, "$.language_skill[1]") **as** language_skill_2, JSON_EXTRACT_SCALAR(saved_fields, "$.language_skill[2]") **as** language_skill_3, JSON_EXTRACT_SCALAR(saved_fields, "$.language_skill[3]") **as** language_skill_4, JSON_EXTRACT_SCALAR(saved_fields, "$.language_skill[4]") **as** language_skill_5, JSON_EXTRACT_SCALAR(saved_fields, "$['highest_edu_qualification']")**as** highest_edu_qualification, JSON_EXTRACT_SCALAR(saved_fields, "$['job_cv']")**as** job_cv **from** dataset.**table**
2.划分依据

作者图片
这个命令不仅是这个列表中最常用的,而且在数据科学访谈中也经常被提到。
当谈到数据聚合时,许多经验丰富的数据科学家会自动求助于 Group By,这是聚合数据最常用的命令。
但是,您可能会遇到按分组不够的情况。
Group By函数要求你按列对数据进行分组,但是如果你不想分组呢?如果您希望在聚合数据的同时保留所有现有的行,该怎么办?
我能描述它的最好方式是给你一个面试问题:
分组依据
Given customerID, date and revenue columns.
For **EACH** date, how do I show the total revenue value for **EACH** customer?
诸如此类的问题可以由小组通过来解决
Select
date,
customerID,
sum(revenue)
from dataset
group by date, customerID
该命令按日期和 customerID 对数据进行分组。
这实质上意味着对于每个日期,我们将为每个 customerID 提供 1 行。
划分依据
当您希望在执行聚合后保留所有行时,Partition By 就派上了用场。对于上面的同一个问题:
Given customerID, date and revenue columns.
For **EACH** date, how do I show the total revenue value for **EACH** customer while keeping all the rows?
您可以通过以下方式实现这一点
Select
date,
customerID,
revenue,
sum(revenue) over (partition by date,customerID) as revenue_per_day
from dataset

作者图片
注意所有的行在聚合后是如何被保留的。这里有一个我经常得到的更实际的例子。
Given customerID, date and revenue columns.
For each date, how do I show the highest revenue row for each customer?
使用 partition by 命令,您可以通过以下方式轻松实现这一点
Select
date,
customerID,
revenue,
sum(1) over (partition by date order by revenue desc rows unbounded preceding) as row_num
from dataset
having row_num = 1

作者图片
该命令正在执行:
- 对于每个日期和 customerID,每次出现一行时,将行号+1,按收入值排序(降序)
- 仅筛选 row_num=1 的行,这将返回每个客户每个日期的最高收入行
我希望现在你意识到通过命令分割是多么强大。****
3.拥有
****有条款。
如果你熟悉 Where 子句,那是极其相似的。
当根据布尔表达式进行评估时,它过滤返回真值的行。
唯一的区别是对于有子句的,它:****
- 工作查询中必须有一个按分组的或任何聚合****
- 发生在任何表示的聚合之后,order by 之前。另一方面, Where 子句出现在任何聚合之前
您已经可以使用嵌套的 where 子句实现这一点:
#Looking for revenue > 100Select * from(
Select
date,
customerID,
sum(revenue) as revenue_sum
from dataset
group by 1,2)
where revenue_sum > 100
但是,当你可以选择编写更专业、看起来更酷的代码时,为什么要这样做呢?
Select
date,
customerID,
sum(revenue) as revenue_sum
from dataset
group by 1,2
having revenue_sum > 100
来自 wiffleGif 的 gif
4.正则表达式
Regex 是正则表达式的缩写,是 NLP 领域中一个非常流行的术语。正则表达式被定义为一系列定义搜索模式的字符。它主要用于处理文本、数字和标点符号。****
下面是 Regex 上的 文档 。
你可以在正则表达式中做很多事情,比如查找特定的文本,删除数字或标点符号,替换某些字符等等。下面是如何在 Bigquery SQL 中实现的。
Bigquery 中有 3 个主要的 Regex 命令:
正则表达式包含
如果提供的字符串(值)与正则表达式(REGEXP)部分匹配,则 REGEXP_CONTAINS 返回 TRUE。
REGEXP_CONTAINS(value, regexp)
这里有一个例子,我们想要过滤 customerID 以‘P’字符开始的数据。我们可以通过以下方式实现这一目标
#^P means string starts with the character P
Select
*
from dataset
where REGEXP_CONTAINS(customerID, '^P')
正则表达式 _ 替换
REGEXP_REPLACE 从提供的字符串(值)中搜索特定的正则表达式模式,并用您指定的内容替换它。
REGEXP_REPLACE(value, regexp, replacement)
与上一个示例类似,让我们将所有以字符‘P’开头的 customerID 替换为‘以 P 开头’。
select
*,
REGEXP_REPLACE(customerID,'^P','Starts with P')
from dataset
正则表达式 _ 提取
REGEXP_EXTRACT 从提供的字符串(值)中返回与指定的 Regex 模式匹配的第一个子字符串。
REGEXP_EXTRACT(value, regexp)
类似于前面的例子,让我们提取第一个字母子串。
select
*,
REGEXP_EXTRACT(customerID,'[a-zA-Z]')
from dataset
5.随着
带有子句的包含子查询,每次后续的 SELECT 语句运行时都会运行这些子查询。它可以在查询的任何地方被引用,包括联接、联合、和where。****
带有子句的对于可读性非常有用,它也有助于数据从业者对所编写的查询有一个高层次的理解。****
WITH q1 AS (my_query)
SELECT *
FROM
(WITH q2 AS (SELECT * FROM q1) SELECT * FROM q2)WITH q1 AS (my_query)
SELECT *
FROM q2 a
left join my_query b on
a.id = b.id
注意,在同一个 With 子句中引入的别名必须是唯一的,但是同一个别名可以使用多次。如果有相似的别名,带子句的将自动取最新引用的别名。****
WITH q1 AS (my_query)
SELECT *
FROM
(WITH q2 AS (SELECT * FROM q1), # q1 resolves to my_query
q3 AS (SELECT * FROM q1), # q1 resolves to my_query
q1 AS (SELECT * FROM q1), # q1 (in the query) resolves to my_query
q4 AS (SELECT * FROM q1) # q1 resolves to the WITH subquery
# on the previous line.
SELECT * FROM q1) # q1 resolves to the third inner WITH subquery.
结论

干得好!如果你已经做到了这一步,我想你已经对 SQL 有所了解了。在本文中,我们浏览了这些 SQL 命令:
- JSON 列到表
- 划分依据
- 拥有
- 正则表达式
- 随着
让它留在你的脑海里,因为我发誓你以后会经常用到它。
在你走之前
我们的数据之旅还没有结束。敬请关注,我正在撰写关于更多数据科学项目,以及更多数据行业的故事、指南和经验。与此同时,请随意查看我的其他文章,以暂时填补您对数据的渴望。
一如既往,我引用一句话作为结束。
从数据中学习几乎是普遍有用的。掌握它,你将在任何地方受到欢迎。Splunk 首席技术官托德·帕帕约安努
订阅我的时事通讯,保持联系。
也可以通过 我的链接 注册一个中等会员来支持我。你将能够从我和其他不可思议的作家那里读到无限量的故事!
我正在撰写更多关于数据行业的故事、文章和指南。你绝对可以期待更多这样的帖子。与此同时,可以随时查看我的其他 文章 来暂时填补你对数据的饥渴。
感谢 的阅读!如果你想与我取得联系,请随时联系我,地址是 nickmydata@gmail.com 或我的 LinkedIn 个人资料 。也可以在我的Github中查看之前写的代码。
5 本书将教你机器学习背后的数学

约翰·莫塞斯·鲍恩在 Unsplash 上拍摄的照片
机器学习的美丽数学世界指南
答在开源机器学习和深度学习框架的爆炸式增长之后,这个领域比以往任何时候都更容易进入。由于这一点,它从研究人员的工具变成了广泛采用和使用的方法,推动了我们现在经历的技术的疯狂发展。理解算法的实际工作方式可以给你在设计、开发和调试机器学习系统方面带来巨大的优势。由于它的数学本质,这项任务对许多人来说似乎令人望而生畏。然而,这并不是必须的方式。
从高层次来说,机器学习有四大数学支柱。
- 线性代数
- 概率论
- 多元微积分
- 最优化理论
这需要时间来建立一个坚实的基础,并了解先进的机器学习算法的内部工作原理,如卷积网络,生成对抗网络和许多其他算法。这不会是一个下午的项目,但是如果你坚持不懈地为此投入时间,你可以在很短的时间内走得很远。有一些很棒的资源可以指导你一路走来。在这篇文章中,我选择了对我最有帮助的五个。
谢尔登·埃克斯勒正确地完成了线性代数

如果线性代数是以“经典”的方式教授的话,对初学者来说,它是一门美丽而艰难的学科,首先是行列式和矩阵,然后是向量空间。然而,当反过来做的时候,它是惊人的直观和清晰。这本书以一种非常友好和有见地的方式介绍线性代数。我希望我是从这本书中学到的,而不是用老方法。
你可以在这里找到关于这本书的作者页面。
概率:给热情的初学者

大多数机器学习书籍没有恰当地介绍概率论,它们使用令人困惑的符号,经常混淆密度函数和离散分布。如果没有坚实的概率背景,这是很难做到的。
这本书将为你提供:一个详细的,数学上正确的,但用户友好的主题介绍。这适合以前没有任何概率知识的学习者。
如果你想了解概率到底是什么,我从一个更抽象的角度写了一篇概率导论。
测度论导论
towardsdatascience.com](/the-mathematical-foundations-of-probability-beb8d8426651)
Denis Auroux 的多元微积分(来自麻省理工学院开放式课程)
我在这里作弊了一点,因为这不是一本书,而是麻省理工学院多元微积分的实际大学课程,被记录下来并向公众开放。在我所知道的所有资源中,这是迄今为止对该主题最好的介绍。有一元微积分的背景没有坏处,但是没有它也可以继续上课。
你可以在这里找到完整的课程。
这门课没有涉及到的一点是梯度下降算法,它是神经网络的基础。如果你想了解更多,我写了一篇关于这个主题的介绍性文章,解释了梯度下降。
关于如何最小化具有数百万个变量的函数的简要指南
towardsdatascience.com](/the-mathematics-of-optimization-for-deep-learning-11af2b1fda30)
安德鲁·特拉斯克的《探索深度学习》

这本书可能是我最喜欢的。我喜欢他们所有人,但是如果你只有时间读一本,读这本。
它包含对神经网络内部工作的完整实践介绍,代码片段涵盖了所有材料。即使不是专门面向高等数学,到本书结束时,你会比 95%的数据科学家、机器学习工程师和其他开发人员更了解深度学习的数学。
您还将从头开始构建一个神经网络,这可能是您可以进行的最好的学习练习。在开始机器学习时,我也在 pure NumPy 中从零开始构建了一个卷积网络。如果你感兴趣,我写了一个详细的指南,告诉你如何自己做。
通过从头开始构建神经网络来理解神经网络的细节
towardsdatascience.com](/how-to-build-a-diy-deep-learning-framework-in-numpy-59b5b618f9b7)
伊恩·古德菲勒、约舒阿·本吉奥和亚伦·库维尔的《深度学习》

这里是你所学的所有理论汇集的地方。它是由机器学习领域的一些最伟大的人物撰写的,这本书综合了数学理论,并将重型机器投入使用,为最先进的深度学习方法(如卷积和递归网络、自动编码器等)提供了坚实的指导。
最棒的是这本书在网上免费提供给每个人。鉴于这是深度学习研究人员和开发人员的头号资源,这是非常棒的。
在我这里列出的所有资源中,这可能是最难阅读的。理解深度学习需要你用概率的观点来看待算法,这可能很难。如果你想学习如何将一个问题转化为概率和统计的语言,我已经为你写了一个详细的指南,在那里我以初学者友好的方式解释了最重要的细节。
超越函数拟合的视角
towardsdatascience.com](/the-statistical-foundations-of-machine-learning-973c356a95f)
让我们开始学习吧!
正如我所提到的,你可能无法在一个下午的时间里看完所有这些资源。你需要努力工作,但将来会有回报的。积累知识是最好的投资。在未来,这将为您构建机器学习系统带来巨大优势。且不说机器学习背后的理论很美。
如果你喜欢把机器学习概念拆开,理解是什么让它们运转,我们有很多共同点。看看我的博客,我经常在那里发表这样的技术文章!
塑造我职业道路的 5 个职业决策
首席数据科学家的旅程

凯勒·琼斯在 Unsplash 上拍摄的照片
最近,一位年轻的专业人士询问了我在通往领导岗位的道路上的职业实践和决策。最近这个问题似乎经常出现,所以我决定把它们写下来,与大家分享。我不是职业专家,但我希望我的职业生涯将激励和鼓舞你在你选择做的任何事情上都做到最好。我相信,我们通过自己的选择和实践来塑造自己的职业生涯。
1。在多个领域工作。我的职业生涯把我从洛斯阿拉莫斯国家实验室的实验工作带到了华盛顿特区,担任华尔街的技术顾问和首席数据科学家。在每一次转变中,我都会问自己,如果抓住这个机会,我会获得多少新知识,因为在评估不断变化的领域时,区分机会和诱惑是至关重要的。机遇将帮助你成长为个人和专业人士,通过成长,你可以为任何组织做出更有影响力的贡献。机遇会激发你成为终身学习者的内在动力。他们迫使你审视自己的生活和职业目标,因为我们都想过有所贡献的生活。贡献是你如何发现你所做的事情的意义,以及你如何过上成功的生活。当我把一个新的专业领域添加到我的工具带上时,我职业生涯中最具决定性的时刻到来了。对我来说,当你在学习和接受挑战时,生活会更加精彩。
2。记录你的工作。在洛斯阿拉莫斯工作的这些年里,我记录了每一次计算、编写的代码、发表的论文或实验设计。当然,这些都是 100%非机密的笔记,在我离职时就被销毁了。通过记录您的工作,您将能够回忆起决策的基本原理、所做的假设、解决问题所遵循的逻辑,或者您的建模方法的原因。当面临失败时,你可以回顾你的笔记,以帮助你确定你的思考过程失败在哪里,或者更重要的是,哪些假设是错误的。如果你是对的,当你在做类似的事情或需要回忆为什么事情有效时,你可以用笔记作为参考,走捷径。如今,人们在 YouTube、博客、推特、Instagram 和其他平台上记录他们的生活,但这是一种不同类型的记录,不会促进学习。如果你是一名数据科学家或定量分析师,并且想从这篇文章中学到一样东西,请记录你的代码。大多数人似乎不理解好文档的重要性。如果你决定离开这份工作,确保你的代码是可读的,容易理解的,并且可以被其他人维护。有人为你的代码付了一笔可观的薪水,他们应该拥有你工作的足够的文档。正如有些人可能会说的那样,没有代码是不言自明的。做一个好公民。你的同事和老板会因此感激并记住你。这是你品牌的一部分。
3。地理问题。无论你决定做什么,要成为最好的,你需要在那个领域寻找最好的。从我决定本科学习核工程的那一刻起,我就想在洛斯阿拉莫斯国家实验室工作,因为它是核研究的发源地,吸引着全国最优秀的科学家。洛斯阿拉莫斯拥有世界上最高的人均博士数量。我遇到了这个领域最聪明的人,并向他们学习。有时,工作很辛苦,竞争也很激烈,但最终总是值得的。当我想学习并参与政策制定时,我决定接受换个地方,搬到华盛顿特区。我一直喜欢华盛顿特区的活力和公共服务意识。不管政治倾向如何,我觉得华盛顿特区的大多数人都在努力为国家做出最好的决定。当我最终决定进入金融业时,我搬到了纽约,去体验金融和市场的中心。一开始我并不太喜欢纽约,因为这里没有空间和隐私。离开 DC(我喜欢的地方)搬到纽约是很困难的。我在金融界的第一个角色很卑微,我有很多东西要学。我认识到有一个好老板的重要性。我在 JP 摩根的第二任老板非常棒,我从他身上学到了很多东西。我以前领导过别人,但他向我展示了如何成为更好的领导者。他精通技术,善良,风趣,乐于助人。所以,如果你想成为最好的人,地理很重要。
4。选择硬路径。当我还是分析师时,甚至现在,我总是选择最具挑战性的项目。那些很可能失败的项目。为什么?很多原因。首先,困难的问题会把你推到舒适区之外,让你对这个话题有更多的了解。第二,它们有助于提高你的技能。第三,他们强迫你寻求帮助、建议或指导。一位好心的同事建议我不要选择我的论文题目,因为这是一篇实验性的论文,而且有人已经在这个问题上研究了好几年。这是有道理的,因为众所周知,实验性论文需要数年时间,而且很可能不会产生预期的结果。但按照我的逻辑,如果我失败了,那也是意料之中的事,因为这是一个复杂的实验,取决于许多我无法控制的因素。但是如果我成功了,它会引起我的组织内外许多人的注意。这就是所发生的事情;我的工作导致了国内和国际演讲的参与,就像一个刚毕业的博士一样。另一方面,当一个项目失败时,我会奖励自己尝试一些困难的事情,有勇气失败和成长,并学到一些否则我不会学到的东西。把自己推向失败是必要的,因为它给你精神上的信心和纪律,让你在事情不顺利的时候继续前进。我明白了,大多数老板尊重并欣赏那些不畏艰险的人。记住,你只需要一击就能成功创业,找到一个可爱的伴侣,或者变得为人所知。作为一名经理,我鼓励我的员工接受具有挑战性的项目,即使他们的能力已经达到 100%。最近,一名员工在工作和周末加班解决一个大多数同事告诉他行不通的问题。猜猜那年谁得到了最高的奖金之一。
5。在你的专业领域之外学习。如果你是数据科学家,挑一些组织管理、行为科学方面的书,或者学跳舞。只是做一些你专业领域之外的事情。就在我的博士论文答辩后,我被邀请在俄罗斯发表一篇关于缓发中子测量的论文。我喜欢参观杜布纳和奥布宁斯克的设施,但令我难过的是,许多科学家,有些有两个博士学位,正在努力寻找有意义的角色。这次访问是在苏联解体几年后,当时这个国家仍在努力寻找自己在世界上的位置。无论如何,见到这么多科学家失业或拿不到工资,让我反思我的教育,我决定一有机会就去读 MBA。我原以为,与只有博士学位的同事相比,拥有 MBA 学位会让我更有市场。与我的科学家或定量分析师同事相比,获得 MBA 学位让我接触到了不同类型的人和性格。它让我接触到了会计、市场营销、书籍以及我专业领域之外的人。我的一位 MBA 教授让我看了 TED 视频。这是在 TED 的早期,我欣喜地观看了许多不同主题的视频。当然,TED 现在是主流,不像早年那样小众。通过超越你的核心技能,你可以带来其他领域的见解,从多个角度看待问题。请注意,我并不主张获得 MBA 学位,但我的意思是要在你的舒适区和专业领域之外学习。
最后一个想法,我们都是一个人的实验品,所以我的一些职业选择对你来说可能没有意义。我建议你选择适合你个性和职业抱负的元素。那些真正能引起你共鸣的元素,忽略其余的。但是一定要遵循一条有目的的道路,因为生活正发生在你身上。
作为数据科学家,你今天需要知道的 5 个分类编码技巧
完整的 Pythonic 编码教程

Jezael Melgoza 在 Unsplash 上拍摄的照片
对于大多数高级数据科学项目,无论是开发机器学习模型还是商业分析,分类编码都是探索性数据分析(EDA)中的一个基本步骤。包括 scikit-learn 在内的大多数库都使用各种数据编码方法。由于数据量很大,找到在 python 中获得最佳分类编码的技巧对于成为独角兽数据科学家来说是一个巨大的优势。在本文中,我们将回顾 5 个最成功的开源短 python 代码行,它们可以组合在一起生成一流的分类编码报告。

照片由大卫·格林伍德-黑格在 Unsplash 拍摄
在本文中,我们将分析您可以在这里找到的巧克力棒评级数据集样本:巧克力棒。
简介
许多场景都在处理分类数据,传统方法包括检测具有分类值的单元格,计算它们的数量,并理解它们的类型(二进制、多值等)。在大多数 Kaggle 比赛中可以找到五种主要方法,让我们来回顾一下:
1.一键编码
一种热编码是将分类变量编码成虚拟变量的过程。这种数据处理方法将二进制分类列(是/否、男性/女性等)转换为 0/1 二进制向量,其中 0 表示不存在属于该类别的行。如果用于非二进制多维变量,这种方法可能会很棘手,因为这会导致添加无用的列。例如,如果我们有一个表示 x 种颜色的列,一个热编码将导致 x 个额外的列(colors_green,colors_blue,…)。
热编码的最佳分类变量由 2-4 个值的独立特征组成,对于更多维度,可以容易地应用替代方法。
完整的文档可以在 GitHub 上找到。现在,让我们从手头的案例开始,按如下方式加载:
**# import libraries**import pandas as pd**# Hot encoding the variables salt, sugar, sweetener_without_sugar**a = pd.get_dummies(choc.salt)b = pd.get_dummies(choc.sugar)c = pd.get_dummies(choc['sweetener_without_sugar'])**# Concatenate new variables with the dataframe**choc = pd.concat([choc,a,b,c], axis = 1)**# Drop non encoded binary variables**choc = choc.drop(['salt', 'sugar','sweetener_without_sugar'], axis = 1)choc

一键编码表示(图片由作者提供)

2.计数编码
计数编码包括用分类列中的计数填充列中的分类值。例如,如果值“绿色”在“颜色”列中出现 5 次,那么每个“绿色”都将被替换为数字 5。
计数编码的最佳分类变量由超过 4 个值的独立特征组成。完整的文档可以在 GitHub 上找到。我们开始吧:
**# Create the encoder**import category_encoders as cecat_features = ['lecithin']count_enc = ce.CountEncoder()**# Transform the features, rename the columns with the _count suffix, and join to dataframe**count_encoded = count_enc.fit_transform([cat_features])data = choc.join(count_encoded.add_suffix("_count"))
data

计数编码表示(图片由作者提供)

Louis Mornaud 在 Unsplash 上拍摄的照片
3.留一(Loo)编码
留一编码是一种基于标签的编码器。该方法包括:如果从数据集中删除了值 B,则用值 B 的标签平均值替换测试数据集的分类列中的标签值。编码值范围创建一个倾向于更好地概括的模型。完整的文档可以在 GitHub 上找到。让我们编码:
a = choc.drop('review_date', axis = 1)X = a.iloc[:,0:2800]y = choc.iloc[:,-1]**# Split the data**from sklearn.model_selection import train_test_splitX_train, X_test,y_train,y_test = train_test_split(X, y, test_size=0.3)**# Create the encoder**from category_encoders import TargetEncoderenc = TargetEncoder(cols=['country_of_bean_origin'])**# Fit the encoder**training_set = enc.fit_transform(X_train, y_train)training_set

留一(Loo)编码表示(图片由作者提供)

4.标签编码
这种方法包括将列中的每个值转换为数字。考虑一个桥梁数据集,该数据集具有一个名为 bridge-types 的列,该列具有以下值。尽管数据集中会有更多的列,但为了理解标签编码,我们将只关注一个分类列。完整的文档可以在 GitHub 上找到。让我们编码:

标签编码表示(图片由作者提供)

5。 证据的权重
这种方法衡量违约或还贷客户之间的差异。这种监督编码方法考虑了目标(标签)变量,以提高预测质量。完整的文档可以在 GitHub 上找到。让我们编码:
**# Create the encoder**from category_encoders import WOEEncoderenc = WOEEncoder(cols=['specific_bean_origin_or_bar_name','company_location','country_of_bean_origin','beans','company'])**#Fit the encoder**training_set = enc.fit_transform(X_train, y_train)training_set

证据权重编码表示法(图片由作者提供)

照片由 Gaby Yerden 在 Unsplash 上拍摄
结论
如果你有空闲时间,我建议你看看这个:
[## 每个数据科学家都应该知道的最佳防弹 Python 要素选择方法
用几行代码实现 5 种最佳特征选择方法
towardsdatascience.com](/best-bulletproof-python-feature-selection-methods-every-data-scientist-should-know-7c1027a833c6)
总结
参考此链接分类编码,了解使用这些工具对巧克力棒评级的完整分类编码。
这个简短的概述提醒我们在数据科学中使用 python 来使用正确的分类编码方法的重要性。这篇文章涵盖了制作完整探索工作流的 5 个基本 Python 分类编码工具,以及有用的文档。

莎伦·麦卡琴在 Unsplash 上的照片
希望你喜欢,继续探索!!!
5 Chrome 扩展,让您作为数据科学家的生活更加轻松
这些扩展对于流畅的工作流是必须的

chrome 扩展是一种奇妙而有用的软件,如果你使用 Chrome,你可以把它添加到你的 Chrome 浏览器中,以加速和方便日常任务。
作为一名数据科学家,您可能需要做一些网络搜集、一些正则表达式匹配或搜索,当然,还要为您的机器学习模型浏览或编写一些数学方程。
你还会读到一些学术论文或报告,你可能会想在工作中引用它们。如果你必须手工完成,所有这些任务都会很麻烦。有时你需要处理电脑上的多个窗口,并在它们之间切换以完成不同的任务。
对我们来说幸运的是,有 chrome 扩展可以让你快速流畅地完成这些任务。
这里是我的五大 chrome 扩展,让你的工作流程变得更快,没有麻烦或增加工作量。
№1: DECS —代码片段管理器
当我们编写代码来收集数据、分析数据或清理数据时,我们经常发现自己一遍又一遍地重复相同的代码片段。用于机器学习模型和数据管道的数据处理的脚本通常是固定的。
代码片段管理器是一个 chrome 扩展,设计时考虑到了数据科学家的安全性和生产力。DECS 团队开发这个扩展是为了给开发者提供最大的安全性。CSM 使用默认的加密方案为您的敏感数据(如 API 密钥和数据库凭证)提供全面保护。
基本特征
- 您可以将所有代码片段保存在一个安全的工作区中。
- 只需轻轻一点,你就可以从网页中存储任何你想要的片段,如堆栈溢出,以供将来使用。
- 将您所有的凭证、API 密钥和证书存储在安全的加密下,并严格管理它们。
用法示例

作者的屏幕录制
№2:刮刀
当我们开始一个新的数据科学项目时,我们需要经历数据收集阶段。我们经常使用一些网络抓取技术来做到这一点。
前 5 个库的概述以及何时使用它们。
towardsdatascience.com](/choose-the-best-python-web-scraping-library-for-your-application-91a68bc81c4f)
Web Scraper 是一个 Chrome 扩展,为你做那些繁琐的数据收集工作。使用这个扩展,你可以制作一个网站地图,帮助你决定如何浏览网站。创建站点地图后,Web Scraper 将遍历站点树并提取您想要的数据。
它可以在几分钟内为你收集、编号、文本和图像数据。Web 抓取可用于各种类型的应用,如品牌监控、电子商务和 web 内容抓取。
基本特征
- 从多个网页抓取和提取数据。
- 从动态页面抓取数据。
- 浏览抓取的数据。
- 将从网站收集的数据导出到 Excel。
用法示例

作者的屏幕录制
№3:等式
处理数学方程总是很麻烦,从写它们到把它们嵌入你的文档。
方程式让处理数学方程式变得轻而易举。它允许你直接在键盘或触摸屏上输入或手写任何数学表达式。一旦你这样做了,你就能以多种格式导出你的方程,而不需要与任何复杂的代码或编程语言交互或编写任何复杂的代码或编程语言。
使用 EquatIO 使数学数字化,帮助各级教师和学生快速轻松地创建数学表达式。
基本特征
- 用最少的努力和打字轻松创建数学方程。
- 通过键盘或触摸屏接受输入。
- 允许您输入/提取公式的 LateX 代码。
- 大声说出你的数学方程式。
- 将您的方程式导出为一些图像格式,以便以后使用。
用法示例

作者的屏幕录制
№4:提取网络监视器
我们生活在一个信息时代。我们周围的数据,也就是我们经常用来建立数据科学的数据,变化很快。我们总是需要跟上这种变化。
当我们从一个特定的网页中提取信息时,我们通常称之为数据提取自动化。然而,如果页面所有者决定重塑或改革他们的数据,我们的模型将会崩溃。我们需要检查新的网页,并相应地改变我们的模型。
听起来不怎么样,是吧?尤其是当网页被更新或改变时,你必须保持跟踪。
distilt Web Monitor通过为我们跟踪特定的网页,为我们省去这些麻烦。该扩展将在您的浏览器中运行,以检查受监控页面的更改。一旦检测到更改,立即获得提醒。
基本特征
- 从任何网页中选择您想要监控的内容。
- 显示历史变化并突出显示变化。
- 设置更改后的通知提醒。它支持各种类型的通知,如电子邮件、短信和弹出通知。
用法示例

作者的屏幕录制
№5: MyBib:免费引用生成器
作为一名数据科学家和研究人员,我讨厌跟踪引用,但不喜欢格式化它们。将引文转换成任意格式并不总是一件容易的事情;我们并不都记得不同的风格指南。
MyBib 以各种类型的样式收集、存储和样式化你的引用,比如 MLA、APA、哈佛、芝加哥等等。您可以将生成的引文直接复制到论文中,或者保存到参考书目中以备后用。
您还可以将它们导出到其他引文管理器中,如 Zotero 或 Mendeley,打印它们,或将其保存为 BibTeX。
基本特征
- 一键直接创建引文。
- 支持超过 6000 种引用方式。
- 允许您保存、导出或复制生成的引文。
用法示例

作者的屏幕录制
拥有可以帮助用户降低工作量要求的工具总是一件好事。它让我们专注于工作的关键方面,而不是在不太重要的任务上浪费宝贵的时间。
先做,再做对,再做得更好。—艾迪·奥斯马尼
抓取任何有请求和美丽声音的网页
towardsdatascience.com](/a-step-by-step-guide-to-web-scraping-in-python-5c4d9cef76e8)
提高组织中数据科学团队效率的 5 种有效方法
了解摩擦的根本原因并学习如何克服它们可以帮助数据科学团队成为他们的最佳团队
概述:
作为一名数据科学家,您是否曾经因为利益相关者看不到您带来的价值而感到沮丧?你可能会问自己,“在解释我所做的工作或者我的模型在做什么的时候,我应该走多远?”如果这听起来像你,那么请密切关注这篇文章和下一篇,因为它们都是关于改善数据科学家和其他利益相关者之间的合作。
这是一篇由两部分组成的帖子: 第一部分 涵盖了导致数据科学家和利益相关者之间摩擦的底层假设和差距;第 2 部分 提供了更好的协作和提高生产力的具体步骤。
第一部分:

照片由 Sandeep Singh 在 Unsplash 上拍摄
可理解性:
机器学习(ML)模型天生复杂,难以解释。数据科学家知道,数据输入和输出生成之间的事件不容易映射到一个可解释的过程。在采用 ML 技术之前,世界要简单得多;更容易解释输出是如何产生的。当时,决策科学是在基于规则的系统上运行的;事实上,它仍然如此,尽管现在的规则更加复杂。
治理:
更重要的是,在 ML 模型出现之前,规则在整个过程中都是由利益相关者控制的。(请注意,我对“利益相关者”一词的使用范围很广……可能是总经理、企业主、营销主管、产品经理等。虽然不再是这种情况,但利益相关者在洗钱过程中仍然有很多发言权。例如,在许多环境中,涉众仍然掌握着输入数据的关键。有时他们甚至拥有导致数据输出的大部分过程。
投资:
此外,缺乏理解会导致误解,损害双方之间的信任。这种信任的缺乏会严重阻碍数据科学家在整个端到端的模型构建过程(即,收集、构建、部署和迭代模型)中提供正确支持级别的能力。
为了从 ML 模型中获得更好的结果,通常需要管理层对资源/时间/资本分配的支持。没有这样的投资,ML 模型的结果要么是不合格的,要么更糟,是浪费时间。记住,预测准确率为 50%的模型是没有用的。
以上是从利益相关者的角度(POV)来看的一些主要差距,它们导致了不一致的期望和缺乏信任。虽然这些差距会影响到所有相关方,但从数据科学家的角度来看,这里有一些影响。
缺乏支持和指导:
我曾听数据科学家表示,当公司开始组建数据科学团队或雇佣新的数据科学家时,人们非常兴奋;然而,他们最初感受到的支持和热情在几个月或几个季度后就动摇了。当然,并不是说所有的公司都是一样的,但是当公司开始将数据科学原理/技术融入其产品/流程的旅程时,这种痛苦是最常经历的。同样,如果利益相关者觉得由于沟通问题他们没有得到他们想要的,数据科学家最终会感到失望和/或被忽视。
错位的期望:
公司经常为一个项目雇佣错误类型的数据科学家或错误级别的资历。这通常发生在公司开始使用数据科学,并且不清楚自己想要从这个团队/角色/个人那里得到什么的时候。这种不一致最终会进一步恶化关系,同时浪费所有人的时间和精力。
上面列出的一组间隙确实是可以修复的。这需要时间、努力、学习和建立一些框架,以便两个实体(数据科学家和利益相关者)能够促进更好的合作并一起实现更多。查看第 2 部分中提出的一些解决方案。
第二部分:
这一部分是关于提高数据科学团队的效率,以及改善数据科学家和利益相关者之间的协作以获得更好的结果。

调整目标:
不管具体的项目是什么,在开始工作之前就预期的结果和目标达成一致是一种最佳实践。但是随着机器学习(ML)模型的出现,双方都应该讨论给定项目成功的关键衡量标准。使用目标关键结果(OKRs)这样的框架是实现目标和期望一致的一个很好的方法。
了解问题/业务背景:
一些公司有机地这样做,而另一些公司不这样做。如果数据科学团队是公司的新人,他们应该对问题空间有一个基本的了解。利益相关者必须解释他们想要达到的目标,以及为什么它现在如此重要。产出消费模式的具体情况是这一讨论的主要部分。以下是两种常见的产出消耗情景:
a.由外部方使用(例如,投资者做出信贷决策,客户根据您的欺诈预测改进他们的产品以提供给最终用户,网站/电子商务上的推荐,最终用户与结果进行交互)。
b.由内部客户使用(例如,您的销售团队可以使用销售线索评分模型来确定下一个致电对象,决定向每位销售人员支付多少奖金,改进客户支持的致电路线,或者通过正确的渠道向正确的用户提供正确的内容以提高用户参与度)。
在上述所有情况下,理解什么是可能的,输出是什么样的,以及接收方涉众/团队将如何消费输出是至关重要的。涉众需要花时间,根据需要就问题背景对数据团队进行培训。这一步将避免进一步的灾难——了解背景有助于数据团队在问题背后提出正确的问题,并快速获得答案,而无需原地打转。
分享样本结果和使用:
一旦目标/度量标准被确定并达成一致,最好是让涉众在进入项目之前适应样本结果。现在不是讨论模型本质细节的时候,因为现在还为时过早——在这一点上,您可能已经简单地理解了问题的背景,但还没有找到最适合您的场景的 ML 模型。此外,花太多时间去解决细节可能意味着浪费时间和机会。
如果输出是一个概率,一个介于 0 和 1 之间的值,考虑提供一系列这样的值,并观察它如何转化为业务决策。当你分享输出将是 0 到 1 之间的范围时,这是否让你的利益相关者感到不舒服,或者他们理解吗?如果他们从座位上跳起来,他们会问你更多的问题还是只是不同意?如果是后者,回到上一步;如果是前者,通过提供业内可比的选项,帮助他们理解如何使用输出。如果这对你来说太难了,那么这是一个向更有经验的专业人士寻求帮助的好时机。
模型理解:
有几种方法可以让利益相关者了解你的模型,而不用直接解释它复杂的过程。你不需要把它变得模糊,但是公平地说,甚至你也不确定一个模型选择了哪条特定的路径来得到它的结果。如果你使用的是模型集合,那么情况就更复杂了。
那么,这里有什么可以帮忙的呢?当然,有几种模型和几种形式的输出,如线性回归对逻辑回归对二元分类器对 RNN 对 CNN 等。更重要的是,要有一些通俗易懂的方式来解释模型,通过建立信任的过程来建立信任和促进相互协作。以下是一些例子:
- 分享一个你公司外(或内)广为人知的用例 : 你的用例,以及模型,与别人的有什么不同(例如,一个亚马逊的产品推荐系统)。这可以让利益相关者采取不同的观点,因为他们不会根据你更熟悉的商业背景来判断你。
- 解释输入和数据源 : 让人们了解构建输出的过程。这也有利于其他两个原因——(a)要求进一步投资以完善输入,如收集更多数据、新数据、更高质量的数据源等。(b)设定对超出模型构建范围的工作的期望;有时人们忘记了数据收集,而不是模型本身,是最重要的部分(取决于上下文)。
- 排除误译几率: 一个概率值并不等同于一个排名分数。帮助利益相关者理解不仅仅是输出,还有输出中出错和变化的机会。
- 在历史数据集上运行模拟: 为了建立信任,在将模型投入生产之前,您可以通过共享历史数据旧流程的输入/输出与新流程(也称为 ML 模型)的输入/新输出来获得信任。假设结果是可比较的,那么它可以带来信心。
- 定期举办路演: 通过内部路演和演示来分享你和你的团队正在取得的进步是一个很好的做法。这为您的流程建立了可见性和透明度,并进一步增加了与其他部门协作的机会。
持续协作和改进:
与任何模型构建工作一样,它不是简单的一次性工作,而是迭代的。如果模型从一开始就没有按预期执行,让涉众知道可以帮助你得到急需的反馈循环。为了让您的模型完成它的工作或者验证您是否选择了正确的模型,您需要从您的生产系统中获取知识。这可能进一步需要您的最终用户、内部客户和利益相关者的帮助。公司可能存在严重的预算限制,因此了解模型可以提供多少改进是数据科学团队和利益相关者共同做出的决定。
希望以上是数据科学团队与其他利益相关者合作并开始影响关键业务指标的一些有用的原则和步骤。合作愉快!
5 常见的机器学习安全风险以及如何克服它们

阿里安·达尔维什在 Upsplash 上拍摄的照片
我仍然记得软件开发行业刚刚起步的日子。许多人担心软件漏洞和利用,他们当时是对的,因为黑客利用这些利用并开始实现他们的恶意设计。每次数据泄露和网络安全攻击都被主流媒体广泛报道,包括印刷和电子媒体。
重点更多的是清除个别的错误,而不是识别问题的根本原因。几年后,我们意识到唯一的解决方案是构建安全的软件。几十年后,软件安全已经成为网络安全计划不可或缺的一部分。
随着今天的软件和应用程序使用机器学习和人工智能,保护您正在使用的机器学习和人工智能系统非常重要。不要误会我的意思,机器学习在图像分类、翻译、玩和赢国际象棋等复杂游戏以及其他视频游戏等任务方面比人类做得好得多。
尽管有其优势,一些企业仍然不愿意使用基于机器学习的系统,因为它们存在安全风险。如果你以一种随意的方式采用机器学习,你更有可能增加你的安全风险。这就是为什么对于考虑采用机器学习的企业来说,了解其附带的安全风险非常重要。
在本文中,您将了解五种常见的机器学习安全风险,以及如何降低这些风险。
机器学习安全挑战
保护机器学习系统的最大障碍之一是,机器学习系统中的数据在安全方面扮演着外部角色。这使得保护你的机器学习系统更加困难。在大多数情况下,机器学习系统接受训练的数据集占 60%的风险,而学习算法和源代码占 40%的风险。
这就是为什么对于企业来说,将所有的精力转移到架构风险分析上是很重要的。根据一份报告,架构风险分析是企业需要采取的保护其机器学习系统的重要第一步。该报告进一步强调了与机器学习系统相关的 70 多种风险。保护已经成为机器学习模型不可或缺的一部分的数据是另一个巨大的挑战。
1。愚弄系统
对机器学习系统最常见的攻击之一是通过给出恶意输入来欺骗它们做出错误的预测。简而言之,它们是机器的视错觉,机器向它们展示了一幅现实世界中并不存在的画面,并迫使它们基于此做出决定。覆盖面和关注度都很大,这使得它比其他机器学习安全风险的威胁要大得多。这种类型的攻击通常以机器学习模型为目标。
2。数据中毒
机器学习系统依赖数据进行学习。这就是为什么确保数据的可靠性、完整性和安全性对企业来说非常重要,否则,您可能会得到错误的预测。黑客知道这一点,并试图锁定机器学习系统使用的数据。他们操纵、破坏和毒害数据,以至于让整个机器学习系统陷入瘫痪。
商家应该特别注意,把风险降到最低。机器学习专家应该通过最小化网络罪犯可以控制的训练数据量和控制程度来防止损害。更糟糕的是,你必须保护所有的数据源,因为攻击者可以操纵你可能用于训练机器学习系统的任何数据源。如果你做不到这一点,你的机器学习训练失控的风险就会急剧增加。
3。在线系统的操作
大多数机器学习系统连接到互联网,尤其是在操作使用期间,因为它继续学习。这给了攻击者可乘之机。网络犯罪分子可以通过给错误的系统输入,将机器学习系统误导到错误的方向,甚至更糟的是,慢慢地重新训练它们按照命令行事,做错误的事情。
操纵一个在线机器学习系统不仅容易,而且非常微妙,受害者甚至不会意识到他们的机器学习系统正在别人手里玩。机器学习工程师可以通过选择正确的算法、维护数据所有权记录以及简化和保护系统操作来解决这个问题。
4。转移学习攻击
大多数机器学习系统利用已经训练好的机器学习模型。这种通用的机器学习模型经过调整,通过提供专门的培训来实现特定的目的。这时迁移学习攻击可能是致命的。如果你选择的模型是流行的,攻击者可以发起攻击,甚至可以欺骗你的任务特定的机器学习模型。
始终关注可疑和意外的机器学习行为,以识别这些类型的攻击。由于机器学习算法是在转移过程中有意使用的,这增加了风险,尤其是如果学习转移发生在预期用途之外。最好选择集团发布模型,因为它们清楚地定义了系统的功能以及如何控制风险。
5。数据隐私和保密
如前所述,机器学习算法使用数据进行训练和学习。确保这些数据的隐私和机密性至关重要,尤其是当这些数据被构建到机器学习模型中时。黑客可以发起可以在雷达下飞行的数据提取攻击,这可能会使您的整个机器学习系统面临风险。
即使这些攻击失败,网络罪犯也可以发起更小的子符号函数提取攻击,这不仅需要更少的努力和资源来执行,而且还可以帮助他们执行其他类型的攻击,例如带有恶意输入的对抗性攻击。这意味着你不仅要保护你的机器学习系统免受数据提取攻击,还要防止函数提取攻击。
你如何克服机器学习的安全问题?欢迎在下面的评论区与我们分享。
5 个常见的 Python 错误以及如何避免它们
从初学者到专家,每个人在 python 和机器学习中都容易出现这些错误

JESHOOTS.COM在 Unsplash 上拍照
简介:
Python 是一种出色的编程语言。它使用简单,并提供有效的结果。集成开发环境(ide)有很多选项,如 Pycharm、visual studio code、Jupyter notebooks 等。即使是简单的 Python IDLE 对于初学者来说也是一个非凡的可解释环境。无论您选择哪种开发,都可能会遇到一些错误。这些错误和问题的发生主要是由于判断失误,缺乏对特定主题的深入了解,或者只是一个可能发生在任何人身上的愚蠢错误。
今天,让我们讨论五个最常见的错误,从初学者到专家,任何人都可能由于缺乏注意力、知识或预防措施而犯这五个错误。我们还将讨论打印的错误类型。然后理解其中的原因以及如何避免特定的错误。所以事不宜迟,让我们从五个最常见的 python 错误以及如何防止它们开始。
5 个常见错误及其相应的修复方法:
1.缩进—
缩进是指代码行或代码块开头的空格数。这种缩进空格可能出现在条件语句(如 if-else 语句)之后或函数之后。通常的缩进量是使用空格键按钮缩进四个空格,或者按一次 Tab 键。缩进在 python 中非常重要。在其他编程语言(如 C、C++或 Java)中,缩进可以替代花括号“{}”。
你会得到下面的缩进错误—
- 当您忘记在函数或代码块的起始行进行缩进时,就会出现此错误。
**IndentationError:** expected an indented block
- 当代码块或程序中没有出现缩进时,会出现此错误。当您在所需的代码块中给出两个空格,而该特定行的描述不适合整个代码时,通常会发生这种错误。
**IndentationError:** unindent does not match any outer indentation level
- 代码中的一行没有与所有其他缩进对齐。
**IndentationError:** unexpected indent
当您试图盲目地将代码从网站复制并粘贴到您的工作环境中时,也会出现这些错误。这个问题的主要解决方案是确保间距的一致性,并通过查看出现的每个错误的描述来解决这些问题。
2.保存与模块名相同的文件名—
当您保存的文件名类似于模块名,并且您正在利用该特定模块调用您各自程序中的函数时,通常会出现此错误。这个错误会导致导入错误,因为您的 python 文件替换了实际存在的库模块。因此,当您试图在运行模块时调用函数时,它根本不起作用。在下面给出的代码块中可以看到这种错误的一个例子。在这里,我将文件保存为 gtts.py,这是我得到的—
ImportError: cannot import name 'gTTS' from 'gtts'
这个错误有一个简单的修复方法。只是不要将文件名保存为模块名,将会用到它。如果您想保留特定的模块名,只需在文件名末尾添加一个简单的下划线或数字,就可以修复您的错误。😃
要以更简洁的方式理解 gTTS 模块,请查阅我以前的一篇文章。
[## 如何使用 Python 开始使用 Google 文本到语音转换
从零开始的文本到语音转换简介
towardsdatascience.com](/how-to-get-started-with-google-text-to-speech-using-python-485e43d1d544)
3.把括号弄乱—
基本上有三种类型的支架,每种都有特定的用途。方括号“[]”用于列表和索引,花括号“{}”用于字典或集合,圆括号“()”用于元组操作。初学者有可能经常会对要使用的正确括号感到困惑,从而导致一些可能发生的错误。
- 用变量声明列表的一种方法是 a = []。声明列表的另一种方法如下:a = list()。然而,当你把这里的括号搞乱成= list[],你最终会得到下面的语法错误。
**SyntaxError:** invalid syntax
- 在处理列表或元组的索引时,我们总是使用方括号“[]”。在使用像 x = [1,2,3]这样的列表或像 x = (1,2,3)这样的元组,并像 x(1)那样写入索引时,将导致以下错误。
**TypeError**: 'list' object is not callable
或者
**TypeError**: 'tuple' object is not callable
解决这个问题的简单方法是确保您总是使用方括号来获取特定索引的值。
这个问题可以用 x[1]来解决,你会得到值 2。

4.打印数字形状时尝试使用括号—
阐述并稍微深入下一个与前一个非常相似的错误。当你试图利用 numpy 模块进行机器学习时,下一个问题更像是初学者或新手的错误。需要注意的是,numpy 中的 shape 是一个属性,而不是一个函数。它返回一个由 numpy 数组的形状组成的元组。元组中的形状值可以通过寻址所需上下文的相应索引来访问。理解此错误的示例如下。
这会导致以下错误。
**TypeError**: 'tuple' object is not callable
解决这个问题的简单方法是使用不带括号的 a.shape。此修复将提供实现完美解决方案所需的精确结果。

5.局部和全局变量—
局部变量是在特定代码块或代码语句中定义的变量。这个局部变量只能在那个特定的代码块中访问,而不能在其他地方访问。形式参数标识符也表现为局部变量。这些也是在函数中被定义为虚拟变量的变量。
全局变量是在主程序中定义的,而不是在函数或特定代码中定义的。这个变量在整个程序中都是可访问的。试图访问主程序中的局部变量时出现名称错误。
**NameError**: name 'x1' is not defined
最好的办法是在代码块中使用局部变量,如果你想在整个程序中使用这个变量,那么就使用全局变量格式。

结论:
这是我在开始学习 python 和机器学习时最常犯的五个错误。我毫不羞愧地承认,即使在今天,我偶尔也会弄糟这些愚蠢的事情。然而,我希望我们都了解了这些错误发生的原因,以及如何准确地预防它们。希望我们将来都能避免这些错误。至少,不要被卡住,跳到堆栈溢出来寻找解决问题的方法。如果我遗漏了从初学者到专家的任何其他常见错误,请告诉我,我将确保在下一篇文章中涵盖这些错误。
我强烈建议所有观众看看下面两篇文章,开始你掌握机器学习的旅程。它们将不断更新,本系列将从头开始涵盖与 python 进行机器学习相关的每个主题和算法。
了解精通机器学习的基本要求
towardsdatascience.com](/starting-your-journey-to-master-machine-learning-with-python-d0bd47ebada9) [## 机器学习所需的 Python 基础知识及其库模块
学习 python 数据结构的基础知识,对机器所需的每个库有直观的理解…
towardsdatascience.com](/basics-of-python-and-its-library-modules-required-for-machine-learning-51c9d26026b8)
感谢大家阅读这篇文章。祝大家度过美好的一天!
每个数据科学家都应该知道的 5 项常见技能
意见
仔细看看我作为数据科学家所使用的流行技能。

目录
- 介绍
- 结构化查询语言
- Python 还是 R
- Jupyter 笔记本
- 形象化
- 沟通
- 摘要
- 参考
介绍
数据科学和机器学习经常需要大量的技能。然而,作为一名数据科学家,我在几家公司工作了几年,我想强调数据科学家应该知道的五项常见技能。作为一名数据科学家,你可能会在职业生涯中用到这些技能。我将概述 SQL、Python/R、Jupyter Notebook、可视化和通信。
当然,在工作过程中,您会遇到更多必需的技能和有益的技能,但我希望这些能作为一个良好的开端,或增强您目前作为数据科学家的旅程。
结构化查询语言
作为一名正在学习的数据科学家,甚至是一名专业的数据科学家,您可能会惊讶地看到这第一项技能。它通常与数据分析师相关联,而数据科学家则专注于编程语言和机器学习算法。然而,为了开始使用 Python、R 或您的机器学习算法,您需要收集数据。作为一名数据科学家(以及我认识的其他数据科学家),这些年来我能想到或亲身经历的最流行的技能是 SQL。大多数公司都有一个数据库,里面有你可以查询的表格。查询结果可能是您用于数据科学模型的数据集。虽然通常情况下,成为一名成功的数据科学家并不需要成为 SQL 专家,但是您应该熟悉一些关键的 SQL 概念和命令。
我遇到的最流行的 SQL 概念是:
SelectInner JoinsLeft JoinsWhereGroup ByOrder ByAliasCase WhenSubqueries Common Table Expression
例子
下面是一个简化的查询示例,我将运行该查询来获取我的数据科学数据集。
*select t1.column_1, t1.column_2, t2.column_3**from table_1 t1**inner join table_2 t2 on t2.shared_id = t1.shared_id**where date > ‘2020–08–01”**group by t1.column_1**order by t1.column_1*
Python 还是 R
我在学校学过 R,并在一些项目中使用它,但我主要使用 Python,所以我将讨论 R 之上的语言。数据科学家可能使用的另一个工具是 SAS。然而,Python 是有益的,因为大量的库或包已经包含了常见的数据科学和机器学习算法。您可以使用准备好的库,这些库涵盖了广泛的模型,如随机森林、逻辑回归、决策树等。除了访问大量重要信息并使您的数据科学更加高效之外,您还可以在 Python 中使用面向对象的格式(类、方法或函数、模块等)。)。这种格式有助于使您的模型更有效地运行,同时还创建了一个可伸缩的部署框架。此外,当处于 OOP 格式时,它帮助您的模型变得更容易部署,因为您可以自己完成或者与软件工程师、数据工程师或机器工程师就您的部署进行交流。
Python 中一些有用的库包括,但不限于:
NumPySciPyPandasKerasTensorFlowSciKit-LearnPyTorch
我可能在探索性数据分析期间使用 NumPy 和 Pandas 最多,在数据科学的模型建立期间使用 SciKit-Learn,在更多的机器学习和深度学习练习中使用 Keras 和 TensorFlow。我自己没有用过 PyTorch,但听说它很受欢迎。
Jupyter 笔记本

照片由JESHOOTS.COM在Unsplash【2】上拍摄。
使用 Python 时,还可以使用流行的 Jupyter Notebook 工具来组织和研究数据集,并执行主要的代码集。在导入数据集、应用探索性数据分析、特征工程和模型构建时,我通常首先使用 Jupyter 笔记本。我认为它是一个地方,在将我的代码最终确定为最终将被集成和部署的 OOP 格式之前,有我的草稿。在单元格中添加注释以及创建标题和项目符号很好,这样您就可以轻松地与其他数据科学家合作,或者如果您希望在将来回到您的模型并找到记录良好的单元格,也很好。
下面是Jupyter 笔记本【3】:
Jupyter 笔记本是一个基于网络的交互式计算平台。该笔记本结合了现场代码,方程式…
jupyter.org](https://jupyter.org/)
形象化
能够可视化数据科学过程的几个部分非常重要。您可能希望可视化业务问题、数据集以及可视化模型本身。也许数据科学中最流行的可视化时间是在模型建立之后。当你向利益相关者解释你的结果时,你将描述复杂的想法和输出,这些可以更好地用视觉来解释。它还可以帮助您自己和团队中的其他人更好地了解模型正在执行什么,以及当您添加可视化时它是如何工作的。
您可以用于数据科学流程的一些可视化工具包括但不限于:
TableauLookerPowerBIPython Libraries (Matplotlib, Plotly, Seaborn)
我个人倾向于使用 Tableau 和 Seaborn,但它们都是用于数据科学的非常有用的工具。
沟通
除了视觉化,你还可以期待交流。
沟通是一项技能,在数据科学教育或训练营中没有教授多少,但作为一名数据科学家,这是一项至关重要的技能。
在开始编码的数据科学过程之前,您必须与几个不同的利益相关者和主题专家交谈。您可能需要说服他们,对于特定的情况,数据科学首先是必要的。一旦您成功完成了流程的这一部分,您将会看到模型本身的优势、关键点和更新,以及最终模型的结果和影响。
在数据科学过程的这些部分,你可以期望使用沟通:
Business problem with stakeholdersProof of concept with subject-matter expertsUpdates on modelResults and impact of the model
摘要

照片由克里斯蒂娜@ wocintechchat.com在Unsplash【4】上拍摄。
如您所见,数据科学家应该知道几项关键技能。你可以花几个小时来描述技能,但最好是一天一天地开始学习,不要不知所措。您应该知道的五项常见数据科学技能是:
- SQL
- Python 或者 R
- Jupyter 笔记本
- 可视化
- 交流
如果您能想到您使用的任何通用技能,以便其他数据科学家可以在进入就业市场时进行预测,或者作为当前的数据科学家提升自己,请在下面发表评论。
感谢您的阅读!
参考
[1]由托马里克在 Unsplash 上拍摄的照片,(2018)
[2]JESHOOTS.COM 在 Unsplash 上拍摄的照片,(2017)
[3]朱庇特项目,朱庇特项目|首页,(2020)
[4]照片由克里斯蒂娜@ wocintechchat.com在Unsplash(2019)上拍摄
数据科学家的 5 个常见 SQL 面试问题
帮助您发展 SQL 技能,在任何面试中胜出

虽然这并不是这份工作中最吸引人的部分,但对 SQL 有深刻的理解是在任何以数据为中心的工作中取得成功的关键。事实是,除了 SELECT FROM WHERE GROUP BY ORDER BY 之外,SQL 还有很多其他方式。你知道的函数越多,你就越容易操作和查询任何你想要的东西。
本文有两点希望学习和交流:
- 学习和教授基本基础之外的 SQL 函数
- 经历一些 SQL 面试练习问题
这些问题不是别人,正是取自 Leetcode!如果你还没有,就去看看吧!
目录
问题 1:第二高的薪水
编写一个 SQL 查询,从 *Employee* 表中获取第二高的薪水。例如,给定下面的雇员表,查询应该返回 *200* 作为第二高的薪水。如果没有第二高的薪水,那么查询应该返回 *null* 。
+----+--------+
| Id | Salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
解决方案 A:使用 IFNULL,OFFSET
- IFNULL( 表达式,alt ) : ifNULL()如果为 null 则返回指定值,否则返回预期值。如果没有第二高的薪水,我们将用它返回 null。
- OFFSET : offset 与 ORDER BY 子句一起使用,忽略您指定的前 n 行。这将是有用的,因为你想得到第二排(第二高的薪水)
SELECT
IFNULL(
(SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1
), null) as SecondHighestSalary
FROM Employee
LIMIT 1
解决方案 B:使用 MAX()
这个查询说选择不等于最高工资的最高工资,相当于说选择第二高的工资!
SELECT MAX(salary) AS SecondHighestSalary
FROM Employee
WHERE salary != (SELECT MAX(salary) FROM Employee)
问题 2:重复的邮件
编写一个 SQL 查询,在一个名为 *Person* 的表中查找所有重复的电子邮件。
+----+---------+
| Id | Email |
+----+---------+
| 1 | a@b.com |
| 2 | c@d.com |
| 3 | a@b.com |
+----+---------+
解决方案 A:子查询中的 COUNT()
首先,创建一个子查询来显示每封电子邮件的频率计数。然后在计数大于 1 时过滤子查询。
SELECT Email
FROM (
SELECT Email, count(Email) AS count
FROM Person
GROUP BY Email
) as email_count
WHERE count > 1
解决方案 B: HAVING 子句
- HAVING 是一个子句,本质上允许您将 WHERE 语句与 aggregates (GROUP BY)结合使用。
SELECT Email
FROM Person
GROUP BY Email
HAVING count(Email) > 1
问题#3:温度上升
给定一个 *Weather* 表,编写一个 SQL 查询来查找与前一个(昨天的)日期相比温度更高的所有日期的 id。
+---------+------------------+------------------+
| Id(INT) | RecordDate(DATE) | Temperature(INT) |
+---------+------------------+------------------+
| 1 | 2015-01-01 | 10 |
| 2 | 2015-01-02 | 25 |
| 3 | 2015-01-03 | 20 |
| 4 | 2015-01-04 | 30 |
+---------+------------------+------------------+
解决方案:DATEDIFF()
- DATEDIFF 计算两个日期之间的差异,并用于确保我们将今天的温度与昨天的温度进行比较。
简单地说,该查询是说,选择某一天的温度高于昨天温度的 id。
SELECT DISTINCT [a.Id](http://a.id/)
FROM Weather a, Weather b
WHERE a.Temperature > b.Temperature
AND DATEDIFF(a.Recorddate, b.Recorddate) = 1
问题 4:部门最高工资
*Employee*表包含所有员工。每个雇员都有一个 Id,一份薪水,还有一个部门 Id 列。**
*+----+-------+--------+--------------+
| Id | Name | Salary | DepartmentId |
+----+-------+--------+--------------+
| 1 | Joe | 70000 | 1 |
| 2 | Jim | 90000 | 1 |
| 3 | Henry | 80000 | 2 |
| 4 | Sam | 60000 | 2 |
| 5 | Max | 90000 | 1 |
+----+-------+--------+--------------+*
*Department*表包含公司的所有部门。
**+----+----------+
| Id | Name |
+----+----------+
| 1 | IT |
| 2 | Sales |
+----+----------+**
编写一个 SQL 查询来查找每个部门中工资最高的雇员。对于上面的表,您的 SQL 查询应该返回下面的行(行的顺序无关紧要)。
**+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT | Max | 90000 |
| IT | Jim | 90000 |
| Sales | Henry | 80000 |
+------------+----------+--------+**
****解决方案:在条款中
- 子句中的允许您在 WHERE 语句中使用多个 OR 子句。例如,country = 'Canada '或 country = 'USA '与 WHERE country IN ('Canada ',' USA ')相同。****
- 在这种情况下,我们希望筛选 Department 表,只显示每个部门的最高工资(即 DepartmentId)。然后我们可以连接两个表,其中 DepartmentId 和 Salary 位于筛选的 Department 表中。
**SELECT
Department.name AS 'Department',
Employee.name AS 'Employee',
Salary
FROM Employee
INNER JOIN Department ON Employee.DepartmentId = Department.Id
WHERE (DepartmentId , Salary)
IN
( SELECT
DepartmentId, MAX(Salary)
FROM
Employee
GROUP BY DepartmentId
)**
问题 5:交换座位
玛丽是一所中学的老师,她有一张表 *seat* 存储着学生的名字和他们相应的座位号。列 id 为连续增量。玛丽想给相邻的学生换座位。
你能写一个 SQL 查询来为 Mary 输出结果吗?
**+---------+---------+
| id | student |
+---------+---------+
| 1 | Abbot |
| 2 | Doris |
| 3 | Emerson |
| 4 | Green |
| 5 | Jeames |
+---------+---------+**
对于样本输入,输出为:
**+---------+---------+
| id | student |
+---------+---------+
| 1 | Doris |
| 2 | Abbot |
| 3 | Green |
| 4 | Emerson |
| 5 | Jeames |
+---------+---------+**
注: 如果学生人数为奇数,则无需换最后一个座位。
解决方案:CASE WHEN
- 想一个例子,当 THEN 语句类似于代码中的 IF 语句时。
- 第一个 WHEN 语句检查是否有奇数行,如果有,确保 id 号不变。
- 第二个 WHEN 语句为每个 id 加 1(例如 1,3,5 变成 2,4,6)
- 类似地,第三个 WHEN 语句将每个 id 减 1(2,4,6 变成 1,3,5)
**SELECT
CASE
WHEN((SELECT MAX(id) FROM seat)%2 = 1) AND id = (SELECT MAX(id) FROM seat) THEN id
WHEN id%2 = 1 THEN id + 1
ELSE id - 1
END AS id, student
FROM seat
ORDER BY id**
就是这样!如果有任何不清楚的地方,请在下面评论,我将尽我所能澄清任何事情——谢谢!
感谢阅读!
如果你喜欢我的工作,想支持我…
- 支持我的最好方式就是在媒体T2 上关注我。
- 在推特** 这里成为第一批关注我的人之一。我会在这里发布很多更新和有趣的东西!**
- 此外,成为第一批订阅我的新 YouTube 频道 这里!
- 在 LinkedIn 这里关注我。
- 在我的邮箱列表** 这里报名。**
- 查看我的网站,terenceshin.com。
更多相关文章
为你的面试复习统计知识的资源!
towardsdatascience.com](/40-statistics-interview-problems-and-answers-for-data-scientists-6971a02b7eee) [## 亚马逊的数据科学家面试实践问题
一些亚马逊面试问题的演练!
towardsdatascience.com](/amazon-data-scientist-interview-practice-problems-15b9b86e86c6) [## 微软数据科学面试问答!
微软面试中一些数据科学问题的演练
towardsdatascience.com](/microsoft-data-science-interview-questions-and-answers-69ccac16bd9b) [## 更多微软数据科学面试问题和答案
微软面试中一些数据科学问题的另一个演练
towardsdatascience.com](/more-microsoft-data-science-interview-questions-and-answers-f9ee8337072c) [## 谷歌的数据科学面试脑筋急转弯
作为谷歌数据科学面试的一部分,他们喜欢问一些他们称为“解决问题”的问题…
towardsdatascience.com](/googles-data-science-interview-brain-teasers-7f3c1dc4ea7f)**
5 计算机视觉和深度学习基础
需要更好地理解最新的 CV & DL 项目是如何工作的

马里乌斯·马萨拉尔在 Unsplash 上的照片
当我整理我以前的深度技术项目列表,然后谈论每个项目时,我意识到,编写一个简单易懂的指南,涵盖计算机视觉和深度学习的基础知识,以便非技术读者可以更好地了解最新的深度技术项目,这可能是一个好主意。第一部分是关于图像处理的基础知识(传统的计算机视觉技术,今天仍然适用),然后第二部分是深度学习的相关内容:)
为什么计算机视觉很重要?
我个人把它理解为我们所知的虚拟世界和物理世界之间的桥梁。正是我们植入机器的眼睛让它们“获得意识”并以前所未有的智能方式导航我们的世界。它实际上用于:
- 机器人,
- 自动驾驶汽车,
- 智能商店(像亚马逊 Go ),
- 优化营销内容,
- 面部识别应用,
- 医疗成像/手术、军事、娱乐等行业
现在有大量其他计算机视觉项目正在进行,毫无疑问,计算机视觉应用将激增,然后无缝集成到我们的日常生活中——改变我们的生活方式。所以废话不多说,
我们开始吧!ᕙ(▿-ᕙ)
数字图像基础

作者创建的图像
参考上图,假设我们有一个尺寸为 400 x 400 的数字图像,这意味着我们的图像是 400 像素行(x 方向)和 400 像素列(y 方向)。所以数字图像是用二维矩阵来表示的。每个单独的像素将包含信息(如强度、数据类型、alpha 值等),计算机将理解如何基于这些信息解释或处理图像。
传统计算机视觉
自 20 世纪 70 年代以来,计算机视觉算法就已经存在,图像操作大体上可以分为两个主要类别— 空间域和频域。了解哪些图像处理方法是可用的可能是有帮助的,因此可以在将图像馈送到深度学习算法之前进行图像预处理,以便产生更好的结果。
空间域方法 —我们按原样处理数字图像(原始数字图像已经在空间域中)。参考上图,因为每个像素都包含一组特定的信息,所以我们可以基于特定的技术来操作和更改这些信息,以获得特定的结果。方法包括:
- 点处理变换(对图像的每个单独像素应用变换函数),
- 区域/掩模处理变换(对图像中的像素邻域应用变换函数),
- 几何变换(如旋转、缩放和扭曲),
- 帧处理转换(输出像素值是基于涉及两个或更多图像的操作生成的)
频域方法 —与空间域方法不同,我们首先将图像转换为频率分布(使用傅立叶变换、拉普拉斯变换或 z 变换等方法),然后处理图像。在这之后,我们执行逆变换,然后在空间域中得到新的图像。

作者的图表,左边的图片取自作者在 CZ4003 课程中的作业
如果我们看上面的图表,我们可以看到左边的原始数字图像非常嘈杂(对角线穿过图像)。如果我们对该图像应用傅立叶变换,我们可以看到右侧的图像(应用了 fftshift,因此零频率分量位于阵列中心)在图像中间有亮点(“峰值”)。这些峰值对应于左边的噪声模式(那些穿过图像的对角线/边缘)。

作者的图表,右边的图片取自作者在 CZ4003 课程中的作业
如果我们将这些亮点的强度设置为 0,然后进行傅里叶逆变换,我们可以看到一些对角线(噪声)逐渐消失。
如本例所示,我们可以利用图像处理技术(空间域方法或频率域方法)首先对图像进行预处理,然后再将其输入到深度学习模型中。此外,一些最流行的传统计算机视觉技术包括:
- 突出边缘、线条和显著区域的图像过滤和变换技术,
- 尺度不变特征变换( SIFT ),
- 加快了健壮的功能( SURF ),
- 来自加速分段测试(快速)的特征,
- 二元鲁棒独立基本特征(简称),
- 定向快速旋转简报(圆球)
我已经包含了链接,所以你可以点击它,阅读更多关于每个算法。接下来,我们将看看一些常见的计算机视觉任务,如果传统的计算机视觉技术不足以解决问题,深度学习可以帮助我们(并且正在该领域广泛探索)。
具有深度学习的计算机视觉
简而言之,深度学习是受人脑神经网络的启发和松散建模的——神经元相互连接,接收一些输入,然后根据权重和偏差值发出输出。深度学习帮助我们完成的常见计算机视觉任务包括——图像分类、定位/显著性检测、对象识别、检测和跟踪、人脸识别、场景理解、图像生成和图像分析。一些最流行的深度学习技术(监督、非监督、半监督)包括:
- 卷积神经网络(CNN,或 ConvNet),
- 生成对抗网络(GAN),
- 深度信念网络(DBNs)和深度波尔兹曼机器(DBMs),
- 堆叠式自动编码器,
- 深度强化学习(DRL),
还有很多。我将尝试快速概述卷积神经网络(CNN)的工作原理(以使本文相对简短易读)。如果你想了解更多关于其他深度学习技术的信息,请尝试谷歌搜索——甘真的很酷,这是人们试图用来产生艺术的东西:)无论如何,这里是(CNN):

简而言之,这就像通过一系列“东西”(更具体地说是卷积层、RELU 层、汇集或下采样层,然后是全连接层例如)来传递一系列数字图像,这些层将提取和学习关于图像的最重要信息,然后建立神经网络模型。然后,一旦这个模型被训练,我们可以通过这个模型传递测试图像,如果这个模型产生良好的结果,它应该能够预测它是什么。如果你不想训练你自己的模型,网上也有各种预训练的模型。
稍微不相干的旁注——我仍然记得在学校图书馆用 Google Collab 训练一个神经网络模型,然后因为他们不得不关门而把我赶出去的时候,我就站在图书馆门口等待我的模型完成训练,因为我需要无线网络(ㆆ_ㆆ).所以,重点是,如果你没有硬件(比如 GPU)来训练你的模型,你可以考虑谷歌协作笔记本。你只需要无线网络。
关于数据集的快速说明—通常,我们使用数据集来训练、验证和测试我们的模型。使用的流行数据集:
- COCODataset(查看他们的演示
- CIFAR-10 或 CIFAR-100(链接此处)
- MNIST(手写数字,链接此处)
- 时尚 MNIST(链接此处)
- ImageNet(链接此处)
- IMDB-Wiki 数据集(链接此处)
- 打开图像(链接此处)
- 更详尽的名单,请点击这里
本文到此为止!正如在各种文章中提到的,我认为将传统的计算机视觉方法与深度学习技术相结合将更好地帮助我们解决我们的计算机视觉问题。此外,我知道你们中的一些可爱的读者是深度技术研究人员和从业者,他们比我更有经验和经验——如果有任何需要纠正的地方或您对此有任何想法,请随时告诉我。
快乐的计算机视觉!
每个数据科学家都应该知道的 5 个概念
意见
多重共线性、编码、抽样、误差和故事讲述。

照片由un splash【1】上的rom son preech wit拍摄。
目录
- 介绍
- 多重共线性
- 一键编码
- 抽样
- 误差度量
- 讲故事
- 摘要
- 参考
介绍
我已经写了一些数据科学家在职业生涯中可能会用到的常用技能,所以现在我想强调一些数据科学的关键概念,这些概念对了解和以后使用会有所帮助。我可能正在讨论一些你已经知道的,和一些你不知道的;我的目标是提供一些专业的解释,为什么这些概念是有益的,不管你现在知道什么。多重共线性、一键编码、欠采样和过采样、误差指标,最后,讲故事,是我在考虑专业数据科学家的日常时首先想到的关键概念。最后一点可能是技能和概念的结合,但我仍然想强调它对作为数据科学家的日常工作生活的重要性。我将在下面阐述所有这些概念。
多重共线性

Unsplash 上创意交流的照片[2]。
虽然这个词有些长,不好说,但是当你把它分解开来,多重共线性就简单了。多意味着多,共线性意味着线性相关。多重共线性可以描述为两个或多个解释变量解释相似信息或在回归模型中高度相关的情况。这个概念引起关注有几个原因。
对于某些建模技术,它会导致过度拟合,最终导致模型性能下降。
数据变得冗余,并且模型中不需要每个特征或属性。因此,有一些方法可以找出应该移除哪些构成多重共线性的要素。
- 方差膨胀因子(VIF)
- 相关矩阵
这两种技术在数据科学家中普遍使用,尤其是相关矩阵和图——通常以某种热图的形式可视化,而 VIF 则鲜为人知。
VIF 值越高,要素对回归模型越不可用。
对 VIF 来说,一个伟大而简单的资源是:
统计定义>方差膨胀因子您可能想先阅读这篇文章:什么是多重共线性…
www.statisticshowto.com](https://www.statisticshowto.com/variance-inflation-factor/)
一键编码
模型中这种形式的特征转换被称为一键编码。您希望通过对分类特征进行编码来用数字表示它们。尽管分类特征本身具有文本值,但一键编码会转置该信息,以便每个值都成为特征,并且行中的观察值被表示为 0 或 1。例如,如果我们有分类变量性别,一键编码后的数字表示看起来像这样(之前是性别,之后是男/女):

一键编码前后。作者截图[4]。
当您不仅要处理数字特征,还需要创建带有文本/分类特征的数字表示时,这种转换非常有用。
抽样
当你没有足够的数据时,过采样可能被建议作为一种补偿形式。假设您正在处理一个分类问题,并且您有一个少数民族类,如下例所示:
class_1 = 100 rowsclass_2 = 1000 rowsclass_3 = 1100 rows
如您所见, class_1 的数据量很少,这意味着您的数据集是不平衡的,将被称为少数类。有几种过采样技术。其中一种叫做SMOTE【5】,代表 合成少数过采样技术 。SMOTE 工作的方式之一是利用 K-neighbor 方法寻找最近邻来创建合成样本。对于欠采样,有类似的技术使用相反的方法。
当您的类或回归数据中存在异常值,并且您希望确保您的采样是您的模型将来运行的数据的最佳表示时,这些技术非常有用。
误差度量
在数据科学中,分类和回归模型都使用了大量的误差指标。根据 sk learn【6】,这里有一些你可以专门用于回归模型的:
[**metrics.explained_variance_score**](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.explained_variance_score.html#sklearn.metrics.explained_variance_score)
[**metrics.max_error**](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.max_error.html#sklearn.metrics.max_error)
[**metrics.mean_absolute_error**](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_absolute_error.html#sklearn.metrics.mean_absolute_error)
[**metrics.mean_squared_error**](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_squared_error.html#sklearn.metrics.mean_squared_error)
[**metrics.mean_squared_log_error**](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_squared_log_error.html#sklearn.metrics.mean_squared_log_error)
[**metrics.median_absolute_error**](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.median_absolute_error.html#sklearn.metrics.median_absolute_error)
[**metrics.r2_score**](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.r2_score.html#sklearn.metrics.r2_score)
[**metrics.mean_poisson_deviance**](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_poisson_deviance.html#sklearn.metrics.mean_poisson_deviance)
[**metrics.mean_gamma_deviance**](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_gamma_deviance.html#sklearn.metrics.mean_gamma_deviance)
从上面回归的两个最流行的误差度量是 MSE 和 RMSE:
MSE: 概念是→平均绝对误差回归损失(sklearn)
RMSE: 概念是→均方误差回归损失(sklearn)
对于分类,您可以使用准确性和 AUC(曲线下面积)来评估模型的性能。
讲故事

我想添加一个独特的数据科学概念,那就是讲故事。我怎么强调这个概念的重要性都不为过。它可以被视为一种概念或技能,但这里的标签并不重要,重要的是你在商业环境中如何清晰地表达你的问题解决技巧。许多数据科学家将只关注模型的准确性,但却无法理解整个业务流程。该流程包括:
- 是什么生意?
- 什么问题?
- 我们为什么需要数据科学?
- 这里数据科学的目标是什么?
- 我们什么时候能得到可用的结果?
- 我们如何应用我们的结果?
- 我们的结果有什么影响?
- 我们如何分享我们的结果和整体流程?
如你所见,这些点都不是模型本身/准确性的提高。这里的重点是你将如何使用数据来解决你公司的问题。熟悉利益相关者和你最终将与之共事的非技术同事是有益的。您还将与产品经理一起工作,他们将与您一起评估问题,并与数据工程师一起在运行基本模型之前收集数据。在建模过程结束时,您将与关键人员分享您的结果,这些人通常希望看到模型的影响,最有可能是某种视觉表现形式( Tableau、Google 幻灯片等)。),所以能够展示和交流也是有益的。
摘要
数据科学家和机器学习工程师应该知道很多关键概念。本文中讨论的五种方法是:
MulticollinearityOne-hot encodingSamplingErrorStorytelling
请在下面随意评论一些您日常关注的数据科学概念,或者您认为其他人应该了解的概念。感谢你阅读我的文章,希望你喜欢!
下面是一些参考资料和链接,可以提供关于本文中讨论的主题的更多信息。
我还想强调我写的与本文相关的另外两个故事[8]和[9]:
仔细看看我作为数据科学家所使用的流行技能。
towardsdatascience.com](/5-common-skills-data-scientists-should-know-3247b2b12318) [## 每个数据科学家都应该知道的 5 个专业项目
客户细分、文本分类、情感、时间序列和推荐系统。
towardsdatascience.com](/5-professional-projects-every-data-scientist-should-know-e89bf4e7e8e1)
这两篇文章强调了作为一名专业数据科学家,您需要了解或熟悉并期望最终聘用的关键技能和项目。
参考
[1]照片由罗姆森·普里查维特在Unsplash(2020)拍摄
[3]统计如何,方差膨胀系数,(2020)
[4] M.Przybyla,一键编码截图,(2020 年)
[5] G .勒迈特,f .诺盖拉,d .奥利维拉,c .阿里达斯修订版 12b2e0d2, imblearn.over_sampling。击打,(2016–2017)
[6] scikit-learn 开发者, 3.3。度量和评分:量化预测质量(2007–2020)
[8] M.Przybyla,每个数据科学家都应该知道的 5 个通用技能,(2020)
[9] M.Przybyla,每个数据科学家都应该知道的 5 个专业项目,(2020)
5 个具体的真实项目来构建您的数据科学组合
独特性是关键,而不是花哨

克拉克·蒂布斯在 Unsplash 上拍摄的照片
你想进入数据科学领域吗?恭喜你!那(仍然)是正确的选择。
市场目前变得更加艰难。所以,你必须对漫长的 T4 招聘之旅和许多拒绝做好心理准备。我假设您已经阅读了数据科学组合至关重要,以及如何构建它。大多数时候,你会做数据处理和争论,而不是应用花哨的模型。
我不断被问到的一个问题是关于酷数据的具体数据源和构建这样一个投资组合的项目机会。
我为你的数据科学投资组合提供了以下五个想法,以及一些关于开发独特性的提示。
数据科学项目的五个具体想法
1。当地非营利组织的客户分析
非营利组织的一个基本任务是在正确的时间、正确的地点找到正确的人,通过正确的方式为慈善活动捐款。当这一点得到优化时,非营利组织可以筹集更多的资金,开展更多的活动。
是什么让这个项目变得有趣?
首先,大多数非营利组织拥有大量数据,不一定是数字化形式的,而且往往质量不高。主要任务是建立一个数据库,数据处理,并获得可用形式的数据。你要学会组织整个混乱的数据,这仍然是数据科学工作的 80%。
第二,你为当地社区做了一些好事,你表现出了你的社会责任感。你和不是数据专家的人交流。两者都显示了数据科学职位所需的软技能。
除了我的专业工作之外,我还自愿为一个帮助贫困儿童的组织和一个为老年人提供家庭护理的组织做这些项目。拥有这些经历可以建立对你个人的信任,并且为许多其他令人兴奋的项目打开大门。
最后,非营利组织的工作与私人银行或财富管理相同。他们还必须在正确的时间获得正确的客户,通过正确的活动为他们带来金钱。我可以告诉你。这些数据的质量也不比非营利组织的好。你可以直接利用你在其他行业的经验。
如何开始?
我通过我的网络找到了非营利组织。你的家人、亲戚和朋友中总会有人加入非营利组织。然后,我同意了第一次了解会议,并向他们解释了我的技能以及这些分析的价值。我给他们举了谷歌和脸书的例子。我还搜索了其他非盈利组织的公开信息,以提供线索。在我给他们几天时间考虑之后,在每种情况下,他们都回来同意做这个项目。然后,我开始了整个数据处理工作。
当数据准备好使用时,您可以完成传统的描述性、预测性和规范性分析周期。
2。 CERN
CERN 主要以其领先的粒子物理基础研究和全球最大的粒子实验室而闻名。
通常不为人知的是,CERN 将其开发并用于研究的大部分数据、代码、算法和工具公之于众。他们拥有复杂的算法测试工具箱,并提供 1 维、2 维、3 维和 4 维图像。他们拥有更多。
欧洲粒子物理研究所并不称之为“创新”。不,这些只是执行他们“真正的”创新任务的“工具”:粒子物理学的新前沿。
我只能强烈建议投入一些时间,浏览他们的网页,探索所有可用于数据分析的数据和工具。这是他们的核心业务之一,而且非常复杂。我今天仍然学到很多东西,得到很多新的想法。
网页是嵌套的。请不要失去你第一次浏览它的激情!
在 CERN 开放数据门户上,你可以找到 2pb 的粒子物理数据,用于开始你自己的分析。
是什么让这个项目变得有趣?
当你作为一名数据科学家开始一个项目时,你通常只知道在某个地方有一些数据。首先,您必须探索哪些数据是可用的,在哪里可以找到这些数据,这些数据是否有冗余,谁了解并可以访问这些数据,等等。
从 CERN 的数据开始,当你不熟悉所有的粒子物理实验时,任务是一样的。幸运的是,我的数据科学团队中总是有来自 CERN 的科学家,这使得理解起来容易多了。
第二,简历上有“CERN”总是一个优势,前提是已经做了一些严肃的工作。通过物理课、出版刊物、网络研讨会和讨论,你可以成为社区的一部分。CERN 在现场雇佣了大约 2500 名员工,在全球拥有大约 17500 名贡献科学家。许多创业公司的创始人都有 CERN 社区背景。
最后,您有稀疏的数据,这意味着数据中表示的重要信息很少。在成千上万的数据点中,你只需要寻找一些模式来发现和识别。找到这样的稀疏信号在许多领域都是必不可少的:预测性维护,找到准备投资你的基金的亿万富翁,或者精准医疗。
如何开始?
首先通过浏览他们的网页和维基百科来熟悉欧洲核子研究中心正在做什么。在开放数据门户上,你有一个文档链接,在那里可以找到很多背景信息,包括 GitHub 的链接和教程。还有一个专门的数据科学节点。看看欧洲核子研究中心的科学家已经做了什么,向他们学习,并开始用你自己的方法分析单独选择的数据集。
处理欧洲核子研究中心的数据不是一个快速的项目,但非常有启发性。除此之外,你还可以学到很多关于物理学前沿的话题。
3。 奥姆德纳
Omdena 称自己是一个协作的 AI 平台。它将 30-50 名项目人员聚集在一起,用数据和人工智能解决这个世界上真实存在的问题。
与 Kaggle 竞赛不同,这是一个真正的端到端项目,其中包含所有项目斗争。你在一个拥有不同技能的团队中工作,面临着所有的人际挑战。你可以产生真正的影响,因为所有项目都与联合国 17 个可持续发展目标之一相关联。
我的一个有着 20 多年数据科学专家经验的好朋友平均为 Omdena 项目贡献了 20%的时间。甚至他也说他总是在学习很多新东西。
Omdena 需要人工智能、数据科学和机器学习领域的广泛技能和专业知识水平。你必须经历一个申请过程,就像申请实习一样,最大的不同是,我们寻找的不是竞争性的个性,而是具有团队精神的人。他们不仅仅寻找专家。这是协作的精神。
是什么让这个项目变得有趣?
你是现实世界数据科学项目的一部分。没有糖衣任务、数据和结果。It“只是”必须用数据驱动的方法解决实际问题。您正在熟悉整个数据科学项目周期,您可以体验不同的阶段和角色。
其次,与有经验的人并肩工作并得到他们的指导是令人兴奋的。仅在一个项目中,你就能学到比你所有 10 次 MOOCs 和 Kaggle 比赛还多的东西。
最后但同样重要的是,你将获得项目证书。是的,它是除了你的 Coursera、Udacity 和大学学位之外的另一个证书,但它证明了你的实际经验。
如何开始?
查看已完成、正在进行和即将进行的项目。熟悉 Omdena 的方法,如果有兴趣参与,请遵循此处的指南。
4。 国际及政府组织
许多国际和政府发展组织现在都在数据驱动下工作。其中包括联合国、世卫组织、世界银行、国际金融公司、美洲开发银行和欧洲复兴开发银行。此外,大多数政府都有专责小组负责任务驱动的数据和人工智能项目,并建立一个生态系统。
除了提供带薪或不带薪的实习机会,大多数合同都是为期几个月到三年的定期合同。
此外,许多数据科学和人工智能初创公司正在与政府部门合作。
在过去的 12 个月里,我支持两个前团队成员找到了这样的项目。其中一个人是半个泰国人,他去了泰国,在一家大数据初创公司工作,该公司正在与泰国政府合作。
另一个人浏览了所有的工作简历,向这些国际组织提交了简历,并联系了一些人,最终在国外的一家开发银行获得了一份为期 4 个月的固定期限项目合同。
是什么让这个项目变得有趣?
这些工作和项目往往在国外。除了实际的数据科学经验之外,还可以获得许多关于外国文化的经验,以及如何在国际外交环境中表现的经验。这给了你在职业阶梯上前进的重要软技能。
你可以从一开始就承担责任。小团队,与决策者的互动,在领导面前的演示,是大多数项目的一部分。你经常会接触到该领域的顶尖专家并得到他们的指导,因为他们经常为国际组织和政府组织提供建议。
最后,这些项目是独特的,并且与研究相关,这为新的实验提供了空间。此类项目的示例包括对某个发展中国家的道路死亡事故进行分析,该国政府希望采取措施减少道路死亡事故,或者对空气污染进行地理空间原因分析,因为政府希望制定法律来限制空气污染。这些分析综合了许多社会经济因素。
如何开始?
第一项任务是研究空缺职位,正在进行的项目,以及重要的是,与这些组织合作的初创公司。
职位可以在 UNjobs 上找到——不仅来自联合国,还来自所有组织,如前所述,以及 Coursera 等。此外,在官方主页上搜索关键词“数据科学家”。
如果没有合适的实习或短期工作,无论如何都要提交简历。如果他们有项目,他们会将其与数据库中已有的简历进行比较,如果你的个人资料匹配,他们会与你联系。
第二,寻找与政府合作的创业公司。如果创业公司有与联合国可持续发展目标相关的项目,他们很可能与政府合作。
另一个迹象是在处理社会利益时,如水资源、更安全的社区,如预防交通事故或暴力、平等方面、抗击艾滋病毒或疟疾等疾病或减少污染。
尽早开始寻找这样的项目。这需要一点时间和坚持。
但是我可以强烈推荐。这样的任务为你的职业生涯打开了许多大门,与你所从事的行业无关。我最近可能会跳槽到一家全球知名智库担任项目负责人。得到这样的职位是一生难得的机会。他们为什么问我?因为我过去做过这样的项目。
5。 埃德加数据库
EDGAR 是电子数据收集、分析和检索的缩写,它是一个数据库,包含法律要求公司和其他人向美国证券交易委员会提交表格的所有提交内容。
你有丰富的与商业相关的数据和文本信息。此处提供了一个快速介绍。
是什么让这个项目变得有趣?
你首先学习如何访问、下载和提取网络数据库中的信息,这些信息主要由文本组成。这可以用 Python 来完成,而且已经有了 OpenEDGAR,一个用 Python 写的开源软件。但是我会推荐其他语言,比如 Perl。它是专门为文本处理而设计的,即从指定的文本文件中提取所需的信息并将其转换为不同的形式。比 Python 快多了。而如果你想在银行工作,还是有很多数据库是用 Perl 设置的。
这是一个很好的情绪分析数据库,可以用来预测公司和股票的价格表现。许多填充物都被编码了,因为公司想发光,而不给竞争对手足够的信息。所以,这个数据库对于自然语言处理来说是一个很好的学习资源。
最后,这些都是开自己博客的好话题,可以是关于投资,也可以是 NLP。认真做,你可以让公众知道你的数据科学工作,这大大增加了你获得梦想中的数据科学工作的机会。
如何开始?
选择一家你想分析的公司。拿一个存在至少十年的来说。从预测这些公司的股票是该卖还是该买的目标开始。
熟悉埃德加的不同形式。从 10-K(公司最近的年度报告)和 8-K(股东应该知道的事件的“当前报告”)开始。
做过去几年的普通情绪分析,看看积极、消极和净情绪趋势。将这些曲线与股价的发展进行比较。此外,这些声明还包含前瞻性信息。分析他们,这将会给你趋势。
提示:前瞻性陈述中的语言包含诸如“将”、“应该”、“可能”、“可能”、“打算”等词语。
通过查看同一行业的其他公司,并整合新闻和宏观经济数据等不同来源,用更复杂的 NLP 和情感算法来开发它。将其与股价和财务比率进行比较。对于一个博客来说,所有这些分析和丰富的内容是没有限制的。
连接圆点
我知道建立一个冷静的数据科学投资组合是一项艰巨的工作。有了这样一个集合,你可以在那个领域取得高于平均水平的进步,获得很多乐趣,并获得你的数据科学梦想工作。
我不仅向数据科学领域的新手推荐这种方法,也向资深数据科学家推荐这种方法。它在你的职业生涯中开辟了许多新的道路,不仅因为这些项目,还通过新获得的网络。
这些想法向你展示了广泛的可能性,并提供了跳出框框思考的想法。
对我和我的朋友来说,学习因素和乐趣是必不可少的。这是我们致力于此类项目时的主要关注点。
我们已经建立了一个令人兴奋的和独特的投资组合,只是一个废物。
构建内部数据科学平台之前的 5 个考虑事项
构建还是购买:来自多年构建机器学习平台的见解

我和我的商业伙伴作为数据科学顾问已经工作了多年,帮助企业将人工智能融入他们的商业模式。我们合作过的每个数据科学家都有自己的工具偏好,使用自己的语言,利用自己的开源工具。对于某些项目,我们也非常重视我们的流程。当我在所有工作中使用 Python 时,我的同事使用 r。当我对我的深度学习框架深信不疑时,我的同事更喜欢 Keras 的易用性。问题是,我们理解对工具灵活性和定制化的需求。当一个组织构建自己的内部平台时,他们可以根据团队的需求来构建。而且,很好玩!你可以找到创造性的方法来解决问题,这是数据科学家最喜欢的。唯一的困境是,大多数时候你不是被雇佣来构建和管理数据科学平台的。你可能被雇佣来构建和部署高影响力的机器学习模型。
尽管如此,您可能仍然喜欢从头开始构建自己的数据科学平台。在多年开发、迭代和测试数据科学平台之后,我想分享一些见解,供开始这一旅程之前考虑。
建筑融入了我们的血液
作为数据科学家,我们天生就是建设者和问题解决者。如果我们想解决一个问题,我们只需建立自己的解决方案。在大多数情况下,我们拥有这样做的技能、工具和知识。我们合作的许多客户都有内部数据科学系统,或者正在创建一个。随着他们对平台的需求变得越来越复杂,他们决定寻求替代解决方案。他们决定投入更多时间来建立模型和解决复杂问题,而不是建立一个全栈数据科学平台。
因此,当您考虑构建自己的内部数据科学解决方案时,需要考虑以下几点:
1.无限的工具灵活性
毫无疑问,有太多的开源工具供我们使用。但是管理所有不同的工具以便能够利用它们是一个挑战。

无论是 R、Python、SQL、Scikit-learn、Hadoop、spark、Tensorflow、Keras、Jupyter——这个列表还在继续——您都需要一个中心位置来将数据科学难题的所有部分集中在一起。
光是想到下载 Tensorflow 就带来巨大的痛苦。也许这看起来很熟悉:

安装张量流时出错

堆栈溢出常见问题
创建一个系统,可以轻松集成团队所需的所有工具。此外,工具也在不断地适应和发展。一定要通过构建能够集成新工具的开放基础设施来规划未来。
2.再现性
有许多手动系统,公司可以在其中支持可再现的数据科学。公司已经使用 Excel 文件、笔记本、Docker、Git 等。不幸的是,人类是不完美的,有时会在记录工作时错过一些关键元素。让所有数据科学活动集中在一个位置有助于解决跟踪问题。通过自动记录和存储每个过程,数据科学家能够回溯和重现项目,并审查研究的有效性。
3.小组管理
人们常说,数据科学家在孤岛中工作。团队面临的一个挑战是统一和同步他们的工作。任务管理、职责转换、报告和进度跟踪等简单的团队组织如果集中化,都可以加快数据科学进程。考虑交流的方法,并创建简单的用户界面来实现无缝转换将节省时间。不仅如此,它还会避免团队成员的挫败感。根据您的团队,项目可能涉及研究人员、数据工程师或机器学习工程师,甚至开发人员或 IT 人员。任务之间的平稳过渡会带来沟通障碍和技术低效。这意味着构建可以与团队共享的组件,以节省编码时间并支持可重用的机器学习。这样,团队成员,无论他们是否是数据科学家,都可以快速构建新模型。重要的是要考虑平台元素,这些元素可以无障碍地执行整个工作流程。并且,建议在这个任务中使用产品经理来咨询,以便正确地完成它。尽可能集成 mlop,以减少机器学习管道中的摩擦。
4.资源管理和可扩展性
无论您是在构建机器学习模型还是在生产中运行模型,计算能力都是不可避免的。一个有组织的计算资源管理系统将会改变游戏规则。添加到内部平台的一个重要组件是在团队成员之间共享计算资源的方法。不仅如此,管理计算预算和监督计算使用的方法可以节省大量资金。
其次,做好最好(或最坏)的准备。对于您的平台来说,能够连接到现有计算并立即自动扩展到云而无需配置是至关重要的。准备资源,让您的数据科学家能够一次运行数百个实验。更重要的是,对于任何成功的生产模型,都要做好模型流量意外激增的准备。它可以将你的生产模型从完全崩溃中拯救出来。无法扩展计算会扼杀促销的动力和业务的成功。
5.可用性和设计
对于数据科学平台,功能是第一位的。但是,必须考虑用户体验。无论是简单的功能,如搜索和标记实验,还是复杂的直观用户界面。内部平台可以根据团队的需要慢慢构建。唯一的问题是,它几乎永远不会是故意的。设计超越功能的工作流并真正最大化效率需要计划、时间和努力。有时候你会发现,商业产品比你先知道你可能需要什么。以苹果公司为例。在苹果之前,大多数手机只需要打电话、发短信和偶尔拍摄像素化照片的功能。今天,你能想象你的手机没有全球定位系统,互联网搜索,Siri 或你最喜欢的播客随时可用吗?走在路边,预测机器学习工作流。
建造智能机器
制造智能机器是我们——数据科学家——最擅长的事情。当决定是否建立一个内部数据科学平台时,考虑一下你受雇做什么。作为一名数据科学家,为了给公司带来价值,你需要拿出成果。数据科学平台的目标是帮助数据科学家专注于魔法——算法。下一步是考虑你的备选方案。自从我和我的商业伙伴开始以来,数据科学平台已经有了巨大的发展,并且具有广泛的功能。在分析商业机器学习平台或开源工具时,也可以使用这 5 个考虑因素。确保你考虑了所有的方面,你将会在机器学习的道路上取得突破。
用于部署端点和 FullStack 的 Django 和 Flask 的 5 个很酷的替代方案
不用 Flask 或 Django 部署 API 的有用框架。

(烧瓶标识 src =https://palletsprojects.com/p/flask/姜戈标识 src =https://www.djangoproject.com/
如果你曾经用 Python 部署过一个端点或者创建过一个网站,那么你很可能听说过 Flask 和 Django。Flask 和 Django 是 Python 中的行业标准,几乎可以用 Python 中的 HTTP 协议做任何事情。Flask 通常用于不需要太多功能的轻量级应用,而 Django 填补了 web 应用领域的空白。两者都是很好的工具,但是在一些特殊的环境下,使用类似的 web 框架而不保留 Flask 和 Django 的特性会更好。
瓶子

(src =https://bottlepy.org/)
Bottle 是 Python 中一个非常轻量级的 WSGI 微框架。它是在麻省理工学院的许可下出版的,修改和发布完全免费。使用 Bottle 的一个很大的优点是,它存储在一个单独的小 Python 模块中,没有依赖性。当您准备好部署 API 时,这使得事情变得极其简单和无缝。
我真正喜欢瓶子的一点是它非常容易使用和轻便,没有像 Flask 和 Django 那样的额外绒毛。有时候,极简主义是关键,Django 和 Flask 有时会因为一个小 API 的所有动态部分开始发挥作用而变得有点势不可挡。轻量级的另一个显著优势是 Bottle 的内置服务器。Bottle 自带网络服务器,这意味着不需要配置 Gunicorn3,但这并不是说你不能使用 Gunicorn3。Bottle 支持 Paste、fapws3、gae 或任何其他 WSGI 兼容的服务器。
在语法方面,Bottle 模糊了其自身和 Flask 之间的相似性,只有很少的语法差异。例如,Hello world:
**from** **bottle** **import** route, run, template
**@route**('/hello/<name>')
**def** index(name):
**return** template('<b>Hello {{name}}</b>!', name=name)
run(host='localhost', port=8080)
涡轮齿轮

我喜欢使用的另一个很酷的 web 框架是 GNU TurboGears。坦白地说,我喜欢 TurboGears,部分原因是它是在 GNU GPL 许可证版本 2 下发布的,但这并不是说 TurboGears 不是一个很好的框架。奇怪的是,TurboGears 实际上是建立在其他几个框架之上的,包括 Django 和 Rails。也就是说,TurboGears 离类似 Bottle 的东西只有一步之遥,当然它的位置更像 Django。
TurboGears 被设计成一个全栈框架,当然也应该这样使用。TurboGears 的一大优点是它的可扩展性,可以使用各种简单的 WSGI 插件来扩展这个框架。此外,它还支持水平数据分区或分片。从语法上来说,TurboGears 可能与任何 Python 程序员所习惯的完全不同。代码倾向于更加关注面向对象的范例,这是一种与大多数其他框架完全不同的方法。例如,这里是 hello world:
**from** **tg** **import** expose, TGController
**class** **RootController**(TGController):
**@expose**()
**def** index(self):
**return** 'Hello World'
**from** **tg** **import** MinimalApplicationConfigurator
config = MinimalApplicationConfigurator()
config.update_blueprint({
'root_controller': RootController()
})
**from** **wsgiref.simple_server** **import** make_server
print("Serving on port 8080...")
httpd = make_server('', 8080, application)
httpd.serve_forever()
web2py

(src =http://www.web2py.com/
Web2py 是这个列表中的一个框架,我想我们都很熟悉。Web2py 是另一个主要关注全栈方面的模块。然而,与 bottle 类似,Web2py 在 Python 标准库之外没有依赖关系。Web2py 给我留下深刻印象的是,它能够完成与 Django 和 TurboGears 等框架类似的目标,同时更加轻量级和易于使用。Web2py 是在 GNU GPL 版本 3 许可下发布的,这意味着您可以使用它做任何事情,而不必担心许可问题。
Web2py 的卖点很可能是它的全功能 IDE,它允许你在部署后从任何浏览器修改你的网站。考虑到这一点,使用这个软件的主要优势就是你可以用它快速地进行创作。与 Django 和类似的框架相比,Web2py 无疑要简单和快捷得多,但是以我的经验来看,与更现代的选择相比,它可能有点欠缺和过时。

(https://cherrypy.org/的 src =
CherryPy 是另一个我非常喜欢的框架,可能是我在这个列表中最喜欢的。
(在樱桃和瓶子之间)
CherryPy 以一种更类似于 TurboGears 的方式来处理 web 开发,但是以一种更类似于 Bottle 的方式来处理方法论。CherryPy 轻得令人难以置信,被认为是极简主义的 web 框架。尽管它很轻,但是 CherryPy 仍然设法塞进了许多非常有用的特性,包括认证、会话和缓存等等。CherryPy 还拥有一个有趣而独特的插件系统,可操作性极强…嗯…
一切!
CherryPy 是在 FreeBSD 许可下许可的, BSD 许可是一种低限制类型的许可用于开源软件,不要求再分发,这意味着与大多数其他框架类似,它是免费和开放使用的。与 TurboGears 相似,CherryPy 采用非常面向对象的方法进行 web 开发。这里是 hello world:
import cherrypy
class HelloWorld(object):
**@cherrypy.expose**
def index(self):
return "Hello World!"
cherrypy.quickstart(HelloWorld())
堂吉诃德(西班牙作家塞万提斯所著《堂吉诃德》中的主人公)
堂吉诃德是另一个与面向对象范式紧密结合的框架。该框架主要关注速度和灵活性,但是很难进入。堂吉诃德并没有强制执行表示逻辑和“后端”逻辑的分离。这可以看做是优点也可以看做是缺点。我要说的是,这个框架是高度可操作的,但与 Python 程序员可用的其他选项相比,肯定要难用得多。
这个框架会遇到的另一个问题是,
缺少文档。
鉴于这些缺点,我想说这个框架只推荐给需要从头开始构建的应用程序。尽管由于构建时间的原因,它可能不适合很多应用程序,但它肯定有自己的位置,并且能够以其他框架无法完成的方式完成工作。
结论
虽然 Flask 和 Django 肯定是很棒的工具,但我认为看看竞争对手也很棒,因为偶尔拥有灵活性肯定会派上用场。我在框架中寻找的东西不一定是其他人寻找的东西,也可能完全取决于我想要创建的东西。毫无疑问,这个列表中我最喜欢的是 CherryPy,因为我经常寻找一个非常轻量级的选项,因为我通常使用 Pythonic web 框架。我的大部分 web 部署都是简单的 API,不需要大量的维护或代码,但同时需要足够安全和稳定,以根据需要提供数据,CherryPy 非常适合这一点。我很想知道其他工程师在他们的框架中寻找什么,他们会选择哪一个。Web 框架可能不是地球上最复杂的东西,但是拥有一个好的框架肯定会让你的生活简单很多!
每个数据科学家都应该知道的 5 种数据挖掘技术
如何在混乱中找到模式?

来自 Pexels 的 ThisIsEngineering 摄影
数据科学是跨学科领域之一。作为一名数据科学家,你需要具备一些数学和统计学的基础知识,以及一些基本的编程技能。你还需要了解一些商业和科学传播知识,以便能够将你的工作传递给更广泛的受众。最重要的是,你需要对模式和趋势有敏锐的眼光。
为了通过数学和计算算法找到模式和异常,对大量原始数据进行结构化、分析和公式化的过程被称为 数据挖掘 。

作者图片(使用 Canva 制作)
每个想要在职业生涯中更进一步并获得强大技能的数据科学家都需要——至少——了解数据挖掘的基础知识。通过学习数据挖掘技术,人们可以利用这些知识来产生新的见解和发现新的趋势。
挖掘数据的过程可以分为三个主要部分:收集、收集和清理数据,对数据应用数据挖掘技术,以及验证该技术的结果。
分析、预测和分类
towardsdatascience.com](/statistics-in-data-science-8ee52459e282)
有许多技术可以用来执行数据挖掘,然而,在本文中,我将重点关注个人和大公司现在使用的五大数据挖掘技术。我们将介绍的技术包括:
- MapReduce。
- 聚类。
- 链接分析。
- 推荐系统。
- 频繁项目集分析。
MapReduce

作者图片(使用 Canva 制作)
MapReduce 是一个用于并行收集和处理大量数据集的编程模型和实现。换句话说,MapReduce 接受一些数据块,将其划分到不同的硬件上进行处理,然后从所有硬件上收集信息并得出结论。
MapReduce 在不同领域都有应用,例如奇异值分解(SVD)、文档聚类、统计机器翻译和各种机器学习应用。像谷歌这样的大公司已经起诉 MapReduce 通过替换更新索引的特别程序并对结果进行不同的分析来重新生成它的 WWW 索引。
MapReduce 程序由三个步骤组成:
- 一个贴图步骤: 执行过滤和排序。这一步的结果是一组(键,值)对,它们代表我们试图挖掘的数据的映射。
- 混洗步骤 :混洗状态作为 map 和 reduce 状态之间的中间状态。它唯一的工作是对(key,value)集合进行排序,以便 reduce 阶段获得所有相同的键。
- 一个 减少步骤: 执行一个汇总操作(比如统计同一个键的不同值)。
使用 MapReduce 的一个例子是试图统计大量文档中出现的单词。在这种情况下要做的是,将文档划分到不同的计算机上。所以,如果我们有 10,000 个文档和 10 台计算机,每台计算机将分析 1000 个文档。
我必须提到,通常在地图阶段,不同的计算机之间没有通信。每台计算机将独立完成这项工作。
我们可以使用 Python 构建单词计数示例的简单实现,以实现两个主要功能:mapper 和 reducer。
使聚集

作者图片(使用 Canva 制作)
聚类是对一组项目进行分组的任务,以便一个组中的项目以某种方式连接起来。每个组称为一个集群。聚类经常用于探索性数据挖掘和统计数据分析。您可以在许多应用程序中找到聚类,如模式识别、计算机视觉、数据合成和生物信息学。
执行聚类操作的目标是获得彼此接近的点的聚类。当几个点彼此相距很小的距离时,它们将落在同一簇中,而如果它们相距很远,它们将具有不同的簇。通常使用的距离度量是欧几里德、余弦、雅克卡、汉明和编辑。
可以使用两种策略中的一种来进行聚类:
- 层次聚类: 这里,每个数据点都以自己的聚类开始。然后,该算法开始加入彼此距离很近的聚类,直到 in 达到指定的限制。这个限制可以是一组集群数,也可以是一组不同集群的规则。
- 点分配: 每个数据点被分配到一个预定义的聚类中,该聚类是基于它最适合的。这些算法的一些变体允许聚类分裂或聚类加入。有一些流行的点分配算法,如 k-means 和 BFR (布拉德利,法耶兹,雷纳)。
可能最著名的聚类算法是 k-means 算法,它可以使用 Python 和 Sci-kit 轻松实现。
链分析

作者图片(使用 Canva 制作)
链接分析是一种基于数学分支图论的数据挖掘技术。图论将不同的对象(节点)以及它们之间的关系(边)表示为一个图。链接分析可用于定向和非定向数据挖掘。
在可以轻松观察不同数据点之间关系的情况下,链接分析非常有用。然而,随着观察的增加,自动化方法是首选,因为它们将产生更快的结果。在这种情况下,链接分析工具可能相对便宜,并且代表了进入数据挖掘的经济切入点。
链接分析通常分 4 步进行:
- 数据处理: 使用不同的算法收集和操纵数据,如排序、聚合、分类和验证。
- 转换: 将数据从一种格式或结构转换成另一种格式或结构,以便简化数据分析过程。
- 分析: 一旦数据被转换,现在可以使用不同的分析策略来提取有用的、想要的信息。
- 可视化:交流信息的最佳方式是使用可视化的方法。
链接分析有不同的算法,如 PageRank 和 Link Sapna 和 TrustBank。可以使用 PythonNetworkX库轻松实现和分析图形数据。
下面是一个使用 Python、Scikit 和 pagerank_fast 模块的 PageRank 算法的简单实现。
推荐系统

作者图片(使用 Canva 制作)
推荐系统是一类应用程序,涉及使用机器学习和数学模型来预测用户对不同选项集的反应。
你每天都会遇到推荐系统。你用亚马逊吗?网飞?Spotify?所有这些大公司都使用推荐系统来为用户提供下一步购买/观看或收听什么的选项。
ML、CV 和 NLP 中的线性代数
towardsdatascience.com](/5-applications-of-linear-algebra-in-data-science-81dfc5eb9d4)
推荐系统的核心概念是线性代数。更准确地说,是一个叫做效用矩阵的方面。推荐系统通常的工作方式是收集用户和产品——或者歌曲或节目——的数据,然后以矩阵形式对这些信息之间的关系进行编码。然后,这个矩阵被用来预测用户对类似产品的喜爱程度。
实现推荐系统有不同的方法,最常用的 4 种方法是:
- 协作系统: 这种方式结合了不同的用户和对象,是亚马逊使用的主要方式。例如,如果你买了一个包,亚马逊会推荐其他产品,那些和你买了同样商品的人也会考虑。
- 基于内容的系统: 这种方法主要关注你以前经历的内容。比如你经常在 Spotify 上听流行歌曲,它会推荐更多的流行歌曲给你欣赏。
- 风险感知系统: 这种方法使用内容和协作技术,但在此基础上又增加了一层。这个新的层将根据用户的位置或年龄来计算推荐特定内容的风险。这是为了避免推荐可能导致用户停止使用该服务的项目。
- 混合系统: 混合系统是指利用不同的推荐技术来提高推荐的准确性,确保更高的用户满意率的系统。
您可以使用 Suprise Scikit 库在 Python 中实现推荐系统。
频繁项目集分析

作者图片(使用 Canva 制作)
频繁项集分析是用于购物篮模型数据的分析方法。市场篮是一种数据模型,用于描述多对多关系的常见形式。这个数据模型用于连接两种类型的数据点,项目和购物篮。每个篮子都有一组项目,也就是项目集,通常认为项目集的大小小于项目的总数。
频繁项集分析可用于对不同种类的应用进行分类和分析,例如,假设我们有一些文本文档,我们想要从中挖掘特定的单词,我们可以使用:
- 相关概念:让物品成为文字,让篮子成为文件。如果我们想要寻找在许多文档中出现的一些单词,则集合将由文档中最常见的单词主导,例如停用词或连接词。我们可以忽略这些单词来查看文档中最常用的单词。
- 剽窃:在这种情况下,条目将是文档,而篮子将是文档中的句子。如果句子在文档中,则项目是篮子的一部分。如果我们想检测抄袭,那么我们就要努力寻找在两个不同文档的几个篮子中同时出现的成对项目。如果我们找到这样的一对,那么我们有 2 个文档共享几个共同的句子,这意味着抄袭是存在的。
我们可以使用 Pandas 和 MLXtend 库在 Python 中执行频繁项集分析。
这些技术是经常用于预测一些数据的未来实例的属性的技术的一个例子,或者简单地理解该数据的当前属性。
数据挖掘是可以转变你的能力并让你成为数据科学家的技术之一。如今,了解挖掘数据、发现模式和可视化这些模式的不同方法是一项非常需要的技能。
作为一名数据科学家,我们必须始终跟上未来的技术和趋势,数据挖掘是保持我们的技能相关和最新的一种方法。
我做的 5 个完全无用的数据图
使用 R 中的制图包创建无目的的绘图
你的分析应该会揭示一些新的东西。它应该揭示对趋势或异常模式的洞察。数据科学工作的雇主希望看到你的分析有用且有影响力。
不过是无聊罢了。相反,我们可以制作完全无用的图表,这就是我花了几个小时在做的事情。
R 中的制图包帮助你将数据转化成引人注目的地图。例如,R 带有北卡罗来纳州婴儿猝死综合症死亡的数据集。使用 shapefile(提供北卡罗来纳州县边界的几何数据),您可以创建婴儿猝死综合症死亡率最高、婴儿猝死综合症死亡率最低等县的地图。
像那样的地图很有用。我正要反其道而行之,给你们看一堆我用 R 制图学软件包做的没用的图。
1.加州各县按县名中的字母数排列

获得加利福尼亚(我的家乡)的 shapefile 非常容易。它在加州政府网站上,还有一些有用的数据集,从犯罪到 COVID。但是我们现在对这些数据集不感兴趣。令人欣慰的是,我们也可以使用这个 shapefile 来绘制无用的图,比如用县名的长度来着色的县图。我们只需要为名称长度创建一个新列:
# add new column based on county name length
library(stringi)
ca$NAME_LENGTH <- stri_length(ca$NAME) - stri_count_fixed(ca$NAME, " ")
#using stri_length and stri_count_fixed removes spaces from the count. For example, "Santa Barbara" is counted as 12 letters instead of 13.
在那里,我使用 ggplot 来可视化数据。添加了geom_sf图形来填充县,添加了来自 ggthemes 包的theme_map图形来使我们的地图看起来更好一些:
ggplot(data=ca) +
geom_sf(aes(fill=NAME_LENGTH), size=.5) +
scale_fill_gradient(low="#98BAFF", high="#354057") +
labs(title="california counties by number of \nletters in the county's name", fill="length") +
theme_map() +
theme(panel.background = element_rect(fill = '#F0F0F0', colour = 'white'))
现在我们有了我们的情节,我们可以看到圣伯纳迪诺县正在杀死它,而约洛县需要收拾它名字长度上的懈怠。
2.加州各县的圣地亚哥动物园数量

终于,我们有了答案。几十年来,我们加州人一直想知道哪个县有最多的圣地亚哥动物园,结果答案是圣地亚哥县,有一个圣地亚哥动物园。
对于这个图表,我创建了一个名为 SD_ZOOS 的新列,将每个县的值设为 0,然后手动将圣地亚哥县的值更改为 1:
#initialize all SD_ZOOS values to 0
ca$SD_ZOOS <- 0
#set SD_ZOOS value to 1 for san diego county
ca <- ca %>%
transform(SD_ZOOS = if_else(NAME==”San Diego”, 1,0)))
据我所知,这是第一次可视化圣地亚哥动物园位置的数据,希望如果你想去加州旅行,这将帮助你找到离你最近的圣地亚哥动物园。
3.加州各县橄榄园餐厅的数量

这个图花了最长的时间来制作,因为我找不到加利福尼亚所有橄榄园位置的原始数据集。我手动找到了每个县的数字,方法是点击“查找离你最近的橄榄园!”网站,并跟踪加州所有 72 个地点的城市。然后,我将每个县的橄榄园数量相加,并将结果导出为 csv 文件,以便更容易地手动添加到 r 中的数据框中。
然而,把这个图放在这里是一个艰难的决定,因为它几乎是有用的。如果有什么不同的话,我们现在知道洛杉矶县到处都是面包条(它有 17 个橄榄园)。通过插入命令sum(ca$OG==0),我们发现有 32 个加州县没有一个橄榄园。
4.加州各县的橄榄园数量加上县名中的字母数量

由于橄榄花园图有点太有影响力,我决定通过添加任意的数学来使它无用。幸运的是,R 允许您基于一些简单的算法创建新的列。因此,如果您有一个橄榄园位置列(ca\(OG)和一个名称长度列(ca\)NAME_LENGTH ),您可以这样做:
ca$OG_LENGTH <- ca$OG + ca$NAME_LENGTH
洛杉矶县从它的 17 个橄榄园位置仍然是强有力的,但是“圣伯纳迪诺”的名字的影响不是睡觉。
5.除了阿拉米达县的颜色来自完全不同的调色板之外,每个县都被赋予一种随机的颜色

很简单,没有理由需要这个数据图。这个情节绝对没用。这正是我想要的。
我使用which命令在数据表中找到了阿拉米达县的索引:
which(ca$NAME=="Alameda")
r 带有一些内置的调色板,允许你随意选择颜色。我使用了热调色板,重新分配了阿拉米达县的颜色,并相应地绘制了:
cols <- heat.colors(58, a=1)
# reassign alameda county's color
cols[42] <- "#0D26FF"#plot
ggplot(data=ca) +
geom_sf(fill=cols) +
labs(title="california counties where each county is assigned a random\ncolor except alameda county's color is from a completely \ndifferent palette") +
theme_map() +
theme(panel.background = element_rect(fill = '#F0F0F0', colour = 'white'))
这张图故意让阿拉米达县看起来格格不入。您没有理由需要这样做。这张图表毫无用处。
如果这篇文章照亮了你的一天,或者甚至帮助你学习了一点关于制图包的知识,我会很感激,尽管我真诚地希望你使用自己的数据科学技能使图表比这些更有用。也许你甚至能找到一个我为什么要把阿拉米达县变成蓝色的理由。我可以肯定地说,这会对我产生影响。谁知道呢,也许有一天有人需要知道所有的橄榄园在哪里。我们已经掩护他们了。
5 种数据追求,让你不再去想疫情
给副业一个让你感觉更好和练习技能的机会

由 Unsplash 上的 ConvertKit 拍摄
在家工作真好。我喜欢自己家里的舒适,喜欢我收藏的茶叶,喜欢穿着舒适的衣服工作。尽管如此,它有时还是会影响到我。每天都开始有同样的感觉,时间过得很快。在互联网上,每个人都在谈论、写作和思考同样的事情,这也于事无补。
这就是为什么我想把一些小的个人追求或数据冒险列在一起,这样你就可以忘记当前的事件。请将它们视为练习数据获取和数据理解技能的练习。
声明:我没有列出 Kaggle,主要是因为几乎每个人都知道它。还因为它现在充满了新冠肺炎数据集。我想谈谈处理与疫情相关的数据集的一些替代方法。
1.分析你的谷歌地图历史
如果你启用了它,惊喜吧,谷歌一直在收集你去过的地方的信息。如果你没有意识到这一点,但从好的方面来看,现在你有了过去几年你去过的所有地方的数据,意识到这一点是非常令人毛骨悚然的。这是你可以处理的大量数据。你可以在地图上显示这些数据,分析你经常去的场馆,或者只是观察你的日常活动。
如何:
要下载您的位置历史,请前往 https://www.google.com/maps/timeline

不幸的是,我从未给予许可,所以我没有收集任何数据。
在右下角,点击齿轮图标并选择下载您所有数据的副本。如果你对这些数据感到不舒服,也可以选择要求删除你的数据。
2.利用驱动数据为良好的事业处理数据
这个网站举办数据科学竞赛,发布数据集。在这个意义上,它类似于 Kaggle,但驱动数据为慈善机构和非营利组织做这件事。参加这些比赛,你不一定要成为一名优秀的数据科学家。只需下载数据,理解数据集,并开始利用您的想象力进行构建。
我认为在驱动数据上有很好的开放式问题的例子。在寻找解决方案或从原始数据中创造见解时,这是一个练习创造力的好机会。我会说,试试看。
如何:
参观 https://www.drivendata.org/,选择你感兴趣的案例

尤其是如果您正在寻找真实的用例,驱动数据是一个不错的选择。
3.在 Reddit 上找到你的梦想数据集
Redditors 请求并共享许多不同的数据集。就我个人而言,当我需要数据集时,我会首先在这里寻找。偶尔访问这个 subreddit,谁知道呢,也许你会对你的下一个个人项目有所启发。
如何:
去 https://www.reddit.com/r/datasets/的

您可以使用排序选项来获取最流行的数据集。
4.从社交媒体平台下载您的数据
谷歌不是唯一一个你可以下载从自己身上收集的数据的地方。所有其他社交媒体渠道一直在收集我们的数据,以定制他们的平台,并能够提供个性化的推荐。由于最近的数据隐私法和数据所有权讨论,现在,公司有义务给人们一个选项,以获得从他们身上收集的数据的副本。
使用这些数据集对你来说是一个体验杂乱数据的好机会。你可能无法用它们预测任何事情,但是和它们一起玩总是很有趣的。我的建议是试着把数据整理好,看看你能从中获得什么样的见解。也许你会发现自己以前没有意识到的事情。谁知道呢。
如何:
商务化人际关系网
- 从你的提要中点击你的小照片,然后选择设置&隐私。
- 选择隐私>LinkedIn 如何使用您的数据。
- 点击获取您数据的副本,选择您想要包含的内容,然后点击请求存档。
- 你可能需要提供你的密码,然后你就可以下载你的数据。
更多信息请访问他们的官方网站。

脸谱网
- 转到https://www.facebook.com/settings.
- 在左侧点击您的脸书信息。
- 从菜单中选择下载您的信息。
- 再次选择您想要包含的数据并点击创建文件。
更多信息请访问他们的官方网站。

推特
- 从您的 Twitter feed 中选择更多 > 设置和隐私。
- 在账户下,选择你的 Twitter 数据。
- 在下输入您的密码,下载您的 Twitter 数据。
- 点击请求存档。
- 当你的数据可以下载时,Twitter 会给你发一封邮件。
更多信息请访问他们的官方网站。

- 在 iPhone 上:转到您想要下载的聊天,点击联系人姓名,向下滚动,点击导出聊天
- 对于 Android 访问他们的官方网站。
5.建立一个漏斗从你自己/你的朋友那里收集数据
有很多数据集可供你下载和使用。但是,如何创建自己的数据集以供将来分析呢?是的,我们不是数据收集方面的专家,所以我们不应该期望从中获得惊人的结果,但这很有趣,它会让你体会到数据收集的挑战。有人做到了: 我追踪了一年来每天的快乐状况
你所要做的就是设置一个谷歌表单,每天通过电子邮件发送给你(或者你想包括的任何人),或者以你希望的任何频率发送,然后收集答案。你可以把你的朋友也包括进来,让它成为一个更大规模的项目。一个例子就是追踪你的情绪和相关因素。尤其是现在我们花了很多时间在家里,看看是什么让你感觉更好或更差,如果你能察觉出来,这将是非常有趣的。也许你能看出那天你是否外出和你的情绪之间的关系。有一点需要注意的是,你需要有一个谷歌账户才能按照这里给出的说明进行操作。你准备好了吗?一开始听起来很复杂,但实际上很简单。
如何:
创建表单
1.转到谷歌表单。
2.创建一个新的表格,并填写您的问题。

3.转到“回应”选项卡,然后单击 Google Sheets 图标。

4.为您的回应电子表格填写您想要的名称,然后单击创建。这确保了当您收到回复时,它会被保存到这个新创建的电子表格中。
现在来设置每日发送功能
1.将表格发送给自己。
2.打开您发送给自己的电子邮件。
3.点击三个点(Gmail ),然后点击显示原文查看这封邮件的原始版本。

4.向下滚动并复制标签之间的所有内容。

5.如果它被编码使用这个网站来解码 html 代码。
6.复制解码后的代码。
7.创建一个新的 Google 电子表格,名称无关紧要。
8.打开电子表格,进入工具 > 脚本编辑器。

9.创建一个新的 HTML 文件,名称无关紧要。
10.删除所有内容,并将解码后的 HTML 代码粘贴到那里。
11.1.将以下内容粘贴到。gs 文件。
11.2.如果你想发送给多人,请使用此代码。
13.请确保更改电子邮件地址,并键入您创建的 html 文件的名称。
14.单击运行以测试电子邮件发送是否正确。
15.要安排它每天运行,单击编辑 > 当前项目的触发器。

16 岁。点击添加触发器。
17.根据需要设置选项,然后单击保存。

18 岁。现在,您的脚本将按照您的要求运行,并将 Google 表单发送到您的收件箱,这样您就可以填写表单并收集数据。
这些是我在思考简单的个人项目时想到的一些想法。我做一些小的兼职项目来让我忘记世界上或我的生活中正在发生的事情。我试着养成一种习惯,专门做我不擅长的事情,增加额外的挑战,学习新的东西。
让我知道你是否使用这些选项来创建一个个人项目,或者你是否有什么要添加到这个列表中!

您是否打算转行从事数据科学职业,但不确定从哪里开始? 通过我的网站免费参加我的数据科学入门课程。
本课程旨在帮助您:
- 阐明您的数据职业目标,
- 明白努力的方向,
- 了解必要的技能,
- 在您的学习旅程中做出明智的决定
此外,我每周发表文章、采访数据专业人员和免费资源,以帮助专业人员有效地将他们的职业生涯转向数据科学。如果你对你需要学习的东西感到迷茫,对所有声称自己是最好的课程感到困惑,觉得没有一门课程对你的目的来说足够完整,我的网站就是为你准备的。
我犯过的 5 个数据科学面试错误
你能从我的错误中学到什么。

目录
- 介绍
- 讨论同一个过去的项目
- 没有问足够多的问题
- 假设面试官知道我过去的经历
- 不考虑业务影响
- 没有概述整个数据科学过程
- 摘要
- 参考
介绍
我面试了几家公司,一路上都有一些重复和关键的错误。因此,我从他们那里学到了东西,并通过数据科学职位的工作机会获得了成功。我将强调的一些错误尤其适用于数据科学家,而一些错误几乎适用于任何面试。我的目标是让你跳过在无数公司面试的反复试验,这样你就可以专注于为你的目标公司和目标数据科学职位改进和执行一次出色的面试。
讨论同一个过去的项目
有时候,作为一名面试数据科学家,你会遇到几个面试官会问类似的问题。我认为这意味着我应该对每个人给出相同的答案。我还认为新的问题可以追溯到相同的过去的项目。然而,重要的是要注意,这些面试官最终会在你的面试结束后进行讨论。这意味着他们会看到,你只是针对类似的问题和不同的问题谈论了相同的教育或专业数据科学项目,所以这限制了他们如何判断你。因为你谈论的是同一个项目,所以看起来你的经验更少。这一点我其实是被叫出来的。他们告诉我,我不断回到同一个例子,他们想知道其他情况,以及我如何处理这些问题。
我确实认为,对类似的问题说类似的答案不一定是一个大错误——在这种情况下,你应该确保为每个问你同样问题的新人添加一些细节。
对于另一点,回过头来看,我确实认为这个错误更大,你应该考虑一些重要的建议。我认为这一点更重要的原因是,我让面试官告诉我这是一个问题。
然而,我不确定是否所有的公司都有这种感觉,因为我倾向于对一个项目感到自豪,并对每个新问题谈论同一个项目。我还认为,让所有这些答案都基于同一个例子是很独特的,这样面试官就可以更好地了解我作为数据科学家的整个过程。
我的错误是对不同的问题讲得如此相似,以至于好像我一整年都只在一个项目上工作。你可以想象这不会给面试官留下深刻印象。
很难百分之百肯定地说这个错误是你应该避免的,但是我可以告诉你,它是作为一个错误向我提出来的,所以它是我在下一次面试中学习和改进的东西。
没有问足够多的问题

这一点可能不像上面的观点那样独特,但它是更广泛的,我相信大多数公司都会同意这一点是一个常见的错误。
提问不够说明了几件事:
- 你对公司不感兴趣
- 你注意力不够集中,没有提出问题
- 可能显示你过于自信
- 可能表明你很难共事
没有人愿意和一个过于自信的无所不知的人一起工作。同样,没有人愿意与对公司或其目标以及各自的数据科学项目不感兴趣的人合作。最重要的是,当你没有问足够多的问题时,听起来好像你不够关心去听。最终,你没有向面试官提问,这表明你不是一个合作的好人选。
同样重要的是,这个错误不仅仅与数据科学家有关,大多数职业领域也是如此。
假设面试官知道我过去的经历
这个错误是我经常犯的,不仅仅是在采访中,在讲故事时也是如此。你和面试官一起做的就是——讲故事。我犯的一个常见错误是假设面试官知道一些关于我项目背景的信息。
他们很可能什么都不知道——有些人甚至不会看你的简历。
这一评论可能会让你感到震惊,但可能只有一个或几个来自该公司的面试者深入研究了你的简历——这并不是说你不应该在面试前概述你的简历,因为他们很可能会从你简历中的一个细节中问你一个相当具体的问题。
但是,回到讲故事,您需要在回答问题时为您执行的数据科学项目提供基本信息。这种类型的解释将向面试官展示你可以与利益相关者和其他非数据科学人员合作。
要调出的一些要点有:
- 业务问题是什么?
- 或者你当初为什么想做这个项目?
- 谁参与了?(产品经理、软件工程师等。)
- 流程是怎样的?
- 你是怎么做到的?
- 这个项目在企业的大计划中处于什么位置?
- 结果如何?
- 人们是如何看待他们的?
- 你帮助了多少人/节省了多少钱/节省了多少时间?
一旦你用这种格式概述了你过去的项目,它将更好地描绘出你的答案。
不考虑业务影响

Riccardo Annandale 在Unsplash【3】上拍摄的照片。
按照上面讲故事的观点,你必须确保考虑你的模型的商业影响。我相信这个错误对于数据科学家来说特别普遍,因为他们只关注模型及其性能,而没有提到业务是如何受到影响的。
你希望以一种准确但更重要的方式突出你的结果,即有影响力的。你很可能取得了有影响力的结果,但你可能没有让面试官知道这一点。你可以这样表述你的答案:
- “我研究了决策树模型,该模型自动化了一个手动过程,节省了 50%的时间和 50%的金钱,为改进产品创造了时间和金钱。”
如果你经常提到你 99%的准确率,但没有提到它的影响,你可以预期面试官会认为你不知道如何在企业中工作,更注重教育。有时,如果整个过程在某种程度上更快、更有影响力,甚至更低的精度也更好。
假装你正在雇人——你想知道他们能帮助你的生意。
没有概述整个数据科学过程
就像本文中的第一个错误一样,我也因为这个错误而被特别点名——没有概述整个数据科学过程。这一点意味着我没有包括在主要数据科学项目之前和之后发生的围绕数据工程和机器学习组件的讨论。
面试想知道:
- 你是如何得到数据的
- 你如何预处理它
- 如何将模型转换成面向对象的编程格式
- 如何进行测试
- 如何部署
- 它是如何集成到您的产品中的
这些要点可能不是你自己执行的,但面试官知道每个数据科学家并不都是数据工程师、机器学习工程师或软件工程师。他们测试你的是,你是否知道从开始到结束的整个过程,以及谁在做什么。如果你正确回答了这个问题,那么公司将会看到你进入了一个更专业的数据科学角色,并可能了解数据科学过程的开始或结束部分。
摘要

乔纳森·博尔巴在Unsplash【4】上拍摄的照片。
我希望你从这篇文章中学到了一些真正新的建议。我已经涵盖了我在数据科学职位面试过程中遇到的五个主要错误。你可能会因为避免了我的错误而获得工作机会,也可能不会,但它们可能在某种程度上对你很重要。也许,在这些问题上加上你自己的想法会让成为数据科学面试中最适合你的。
总结一下,这是我犯过的五个数据科学面试错误:
Discussing the same past projectNot asking enough questionsAssuming interviewers know my past experiencesNot considering the business impactNot overviewing the whole Data Science process
请随时在下面发表评论,并讨论您在数据科学职位面试过程中犯的一些常见错误,以便我们可以互相学习。
感谢您的阅读!
参考
[1]2017 年 Unsplash 上Estee 扬森斯拍摄的照片
[2]照片由艾米丽·莫特在Unsplash(2017)上拍摄
[3]照片由 Riccardo Annandale 在Unsplash(2016)上拍摄
[4]照片由 Jonathan Borba 在Unsplash(2019)上拍摄
如果你想成为一名数据科学家,在 R 语言中要掌握 5 种数据结构
了解如何掌握基本数据类型和高级数据结构,如因子、列表和数据框。

要成为一名 R 数据科学家,您需要掌握这种广泛使用的开源语言的基础知识,包括因子、列表和数据框架。掌握这些数据结构后,您就可以开始自己的第一次数据分析了!
这五种数据结构是:
- 矢量
- 矩阵
- 因素
- 数据帧
- 列表
一直读到数据类型的备忘单的末尾。
基本数据类型
在我们开始讨论数据结构之前,了解一下组成这些数据结构中的一些元素的基本数据类型是很重要的。
主要类型有:
- 数字 —十进制值,如
4.5,或整数值,如4。 - 逻辑值 —布尔值(
TRUE或FALSE) - 字符 —文本(或字符串)值,如
"medium"(注意这些是区分大小写的)
# Here are some variables being assigned these basic data types
my_numeric <- 9.5
my_logical <- TRUE
my_character <- "Linda"
如果您想更深入地了解 R 中的基础知识,请查看我写的这篇文章,这篇文章教您如何计算、分配变量以及使用基本数据类型。它也包括练习题!
向量
Vectors 是一维数组,可以存储任何基本的数据类型,包括数字、逻辑和字符。
创建向量
要创建一个向量,使用组合功能 [c()](https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/c),用圆括号之间的逗号分隔元素。
my_vector <- c(elem1, elem2, elem3)
numeric_vector <- c(1, 2, 3)
character_vector <- c("a", "b", "c")
命名一个向量
给向量命名就是给向量元素命名。可以使用名称功能names()来完成。
# Without names, its not clear what data is being used
some_vector <- c("Linda", "Data Scientist")
names(some_vector) <- c("Name", "Profession") # Output
> some_vector
Name Profession
"Linda" "Data Scientist"
从向量中选择
如果我们想从一个向量中选择一个元素,我们只需在方括号中输入我们想要选择的元素的索引。
my_vector[i]
# my_vector is the vector we are selecting from
# i is the index of the element# To select the first element
# Note that the first element has index 1 not 0 (as in many other programming languages)
my_vector[1]
要从一个矢量中选择多个元素,使用方括号中的矢量指示应该选择哪些元素。
# For example, to select the first and fifth element, us c(1,5)
my_vector[c(1,5)]# For example, to select a range, we can abbreviate c(2,3,4) to 2:4
my_vector[2:4]
我们也可以使用元素的名称来代替它们的数字位置。
weekday_vector["Monday"]
如果你想更深入地了解向量,看看这篇我写的关于如何创建、命名、选择和比较向量的文章。结束时,你将学会如何使用向量分析游戏结果!
矩阵
矩阵是排列成固定数量的行和列的相同数据类型(数字、字符或逻辑)元素的集合。二维矩阵仅适用于行和列。
创建矩阵
函数[**matrix()**](https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/matrix)创建一个矩阵。这个函数有三个重要的参数:
**vector**—这是将被排列到矩阵行和列中的元素的集合。该参数是可选的;如果我们把这个参数留空,矩阵就不会被填充,但它可以在以后被填充。我们可以使用已经创建的向量。**byrow**—表示矩阵是按行(byrow=TRUE)还是按列(byrow=FALSE)填充。默认设置为FALSE。**nrows**—表示所需的行数。
# A matrix containing the numbers 1 to 9, filled row-wise, with 3 rows.
matrix(1:9, byrow=TRUE, nrow=3)
# 1 2 3
# 4 5 6
# 7 8 9
命名矩阵
为了给行和列添加名称,我们可以使用函数colnames()和rownames()。
rownames(my_matrix) <- row_names_vector
colnames(my_matrix) <- col_names_vector
我们也可以使用dimnames属性,在创建时直接命名矩阵。
my_matrix <- matrix(vector, byrow=some_logical, nrow=some_number
dimnames = list(row_names_vector, column_names_vector)
添加到矩阵
我们可以使用[cbind()](https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/cbind)将矩阵和/或向量按列合并在一起,向矩阵中添加一列或多列。
big_matrix <- cbind(matrix1, matrix2, vector1, ...)
要添加一行,我们使用[**rbind()**](https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/cbind) 函数获取一系列向量或矩阵,并按行组合它们。
big_matrix <- rbind(matrix1, matrix2, vector1, ...)
计算总数
我们可以用rowSums()计算每行的总和,用colSums()计算每列的总和。
rowSums(my_matrix)
colSums(my_matrix)
选择矩阵元素
方括号[]用于从矩阵中选择一个或多个元素。因为矩阵是二维的,所以需要逗号来分隔行和列。
my_matrix[row, column]# Select element on the first row and second column
my_matrix[1,2]# Returns a matrix with the data on rows 1 through 3, and columns 2 through 4
my_matrix[1:3, 2:4]# To select all elements of a column, no number is needed before the column
# Select all elements of the first column
my_matrix[,1]# To select all elements of a row, no number is needed after the row
# Select all elements of the first row
my_matrix[1,]
如果您想更深入地了解矩阵,请查看我写的这篇关于如何创建、命名、选择矩阵以及用矩阵进行基本计算的文章。它甚至包括练习题要做!
因素
一个因子用于存储分类变量。分类变量属于有限数量的类别(例如,“男性”、“女性”)。它们与连续变量相反,后者可以对应于无限数量的值。
创建因子
要创建一个因子,使用[**factor()**](https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/factor)函数,它将一个向量编码为一个因子(也称为“类别”或“枚举类型”)。
# Creates a gender factor with the categories "Female" and "Male"
gender_vector <- c("Male", "Female", "Female", "Male", "Male")
gender_factor <- factor(gender_vector)
名义分类变量没有隐含顺序(例如“Elephant”、“Monkey”、“Horse”)。有序分类变量具有自然排序/排名(例如“Low”、“Medium”、“High”)。
r 以不同的方式构造和打印它们。默认情况下,factor()函数将向量转换成一个无序因子。要创建有序因子,我们需要两个额外的参数:
**ordered**—设置为TRUE,表示因子已排序。**levels**—以正确的顺序设置因子的值。
# Constructs a factor with nominal categorical variables
animal_vector <- c("Elephant", "Monkey", "Horse")
animal_factor <- factor(animal_vector) # Constructs a factor with ordinal categorical variable
temperature_vector <- c("High", "Low", "High", "Low", "Medium")
temperature_factor <- factor(temperature_vector, order = TRUE, levels = c("Low", "Medium", "High"))
对于顺序变量,使用<指示顺序。
# Output for nominal variables
# Animals
[1] Elephant Giraffe Donkey Horse
Levels: Donkey Elephant Giraffe Horse# Output for ordinal variables
# Temperature
[1] High Low High Low Medium
Levels: Low < Medium < High
重命名因子级别
有时,出于清晰或其他原因,更改数据集中特定因子级别的名称会有所帮助。例如,假设来自调查的原始数据包含一个关于回答者性别的问题,只记录了两个类别:"M"和"F"。在数据收集过程中记录缩写可能很方便,但在分析过程中可能会变得混乱。我们可以通过使用[**levels()**](https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/levels) 功能来改变关卡的名称:
levels(factor_vector) <- c("name1", "name2", ...)# Specify the levels to "Male" and "Female" instead of "M" and "F"
survey_vector <- c("M", "F", "F", "M", "M")
survey_factor <- factor(survey_vector)
levels(survey_factor) <- c("Female", "Male")
注意:分配等级的顺序很重要。levels(survey_factor)输出[1] "F" "M"。如果在创建过程中未指定因子等级,它们将自动按字母顺序分配。为了正确地将"F"映射到"Female"和"M"映射到"Male",需要按照特定的顺序将电平设置为c("Female", "Male")。
总结一个因素
[**summary()**](https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/summary) 函数给出了变量内容的快速概览。它可用于因子,以确定我们的向量中每个因子级别有多少个响应。
summary(my_factor)# Example
summary(survey_factor)# Output
Female Male
2 3
如果您想更深入地了解因素,请查看我写的这篇关于如何创建、子集化和比较因素的文章。它包括练习题,这样你可以练习你新开发的技能。
数据帧
数据帧类似于矩阵,但元素不必都是相同的数据类型。数据框以变量为列(如 married, age),以观察值为行(如respondent1, respondent2 , …)。
married age
Respondent1 TRUE 24
Respondent2 FALSE 18
Respondent3 FALSE 28
检查数据帧
我们可以通过使用以下函数显示整个帧的一小部分来检查元素:
[**head()**](https://www.rdocumentation.org/packages/utils/versions/3.6.2/topics/head)—显示数据帧的第一部分[**tail()**](https://www.rdocumentation.org/packages/utils/versions/3.6.2/topics/head)—显示最后一部分。
我们还可以使用[str()](https://www.rdocumentation.org/packages/utils/versions/3.6.2/topics/str)函数来显示框架的结构,得到以下信息:
- 观察总数
- 变量总数
- 变量名的完整列表
- 每个变量的数据类型
- 第一次观察
创建数据框
为了构建数据框,我们使用了[data.frame()](https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/data.frame)函数,将数据向量作为不同列的参数传递。请注意,数据帧中的每一列都具有相同的长度,因此传递的向量也应该具有相同的长度。但是它们不需要相同的数据类型。
my_df <- data.frame(vector_variable1, vector_variable2, ...)
选择数据框元素
类似于向量和矩阵,我们用方括号[]来选择元素。逗号用于指示分别从行和列中选择什么。
# Select the value at the first row and second column
my_df[1,2]# Select rows 1 to 3, and columns 2 to 4
my_df[1:3, 2:4]# Select all elements in row 1
my_df[1,]# Select all elements in col 3
my_df[,3]# Select the first three elements from the age column
my_df[1:3, "age"]# Select all elements of the married column
my_df[,"married"]
my_df$married # Notice that we can use the $ sign as a short-cut
subset(my_df, subset = married) # We can also use the subset function
对数据帧进行排序
我们可以使用[**order()**](http://www.rdocumentation.org/packages/base/functions/order) 函数根据某个数据框变量对数据进行排序。
# Sorts data frame by age (youngest to oldest)
positions <- order(my_df$age) # Use order() to create positions
my_df[positions,] # Use positions to sort df
如果您想更深入地了解数据框,请查看我写的这篇关于如何创建、选择和排序数据框的文章,通过练习问题来进一步巩固您的学习。
列表
列表可以保存不同对象的组件,如矩阵、向量、数据帧和其他列表,以有序的方式聚集在一个名称(列表的名称)下。这些对象不需要以任何方式相关联,因此,实际上任何东西都可以存储在一个列表中。
创建列表
我们使用函数[**list()**](http://www.rdocumentation.org/packages/base/functions/list) 来构造一个列表:
my_list <- list(comp1, comp2, ...)# Constructs a list with different elements
my_list <- list(my_vector, my_matrix, my_df)
命名列表组件
我们可以给列表中的组件命名,这样就不会忘记它们所代表的含义。我们既可以在构建列表时命名它们,也可以在之后命名它们。举个例子,
# Name components directly during list construction.
my_list <- list(name1 = comp1, name2 = comp2)# Use names() function to name list after construction
my_list <- list(comp1, comp2)
names(my_list) <- c("name1", "name2")
选择列表元素
我们可以使用组件的编号位置以及双方括号[[]],而不是用于向量和矩阵的单方括号[]。
# Select the first component (position 1)
my_list[[1]]# Select name2 from the list
my_list[["name2]]
my_list$name2# Select first element from name2 component
my_list[["name2"][1]]
my_list$name2[1]
r 数据结构备忘单

创建和选择不同数据结构的备忘单。
笔记
所有图片,除非特别注明,均归作者所有。横幅图像是使用 Canva 创建的。
你现在可以使用的关于新冠肺炎的 5 个数据集
开放数据集可用于改进预测模型、预测和分析新冠肺炎的影响或调查 Twitter 上传播的信息。

冠状病毒爆发及其导致的疾病新冠肺炎席卷了全世界。新闻编辑室每天过滤大量信息——文章、官方简报、专家采访等。医务人员每周都要努力跟踪数百份科学出版物,涉及药物研究、流行病学报告、干预政策等等。此外,社交网络平台需要减少噪音,推广经过验证的故事,以避免培养误导和恐惧的用户。
在这场斗争中,我们很幸运地生活在一个充分了解数据价值的世界,并且在收集和提炼这些数据方面有许多努力正在进行中。因此,问题是如何利用它们来提取价值和智慧,从而影响政策的制定和警报的触发。
在这个故事中,我展示了六个精心策划的数据集,它们在某种分析光线下可以证明非常有用。它们的主要可能应用从改善流行病学预测模型和预测各种干预政策的影响,到自然语言处理和 Twitter 上的信息传播。对于已经存在的应用,我邀请您阅读下面的故事。
卓越方法和特殊实践概述。
medium.com](https://medium.com/swlh/how-data-science-can-help-with-outbreaks-like-coronavirus-a042de25efa1)
学习率是为那些对 AI 和 MLOps 的世界感到好奇的人准备的时事通讯。你会在每周五收到我关于最新人工智能新闻和文章的更新和想法。在这里订阅!
nCoV-2019
我们考虑的第一个数据集发表于 2020 年 3 月 24 日,标题为“来自新冠肺炎疫情的流行病学数据,实时病例信息”[1]。它从国家、省和市卫生报告中收集个人信息,并从在线报告中收集额外知识。所有数据都进行了地理编码,并包含进一步的输入,如症状、关键日期(发病、入院和确诊日期)和旅行记录(如果有)。你可以在这里找到相关的 GitHub 回购。

新冠肺炎疫情可视化使用nCoV-2019
nCoV-2019数据集能够产生模拟疾病爆发的实时方法。这种机制支持公共卫生决策,并协助决策者执行知情的指导方针。
新冠肺炎(新型冠状病毒肺炎)
新冠肺炎[2]可以说是收集冠状病毒爆发信息的最大努力。几乎所有读过关于即将到来的疫情的文章的人都看过它提供的仪表盘。

新冠肺炎·JHU 仪表板
数据集包含两个文件夹;一个记录每日病例报告,另一个提供每日时间序列汇总表,包括确认的新病例、死亡和康复。新冠肺炎数据集为研究人员、公共卫生机构和普通公众提供了一个直观、用户友好的工具来跟踪疫情的发展。你可以在这里找到相关的 GitHub repo。
绳索-19
艾伦人工智能研究所(Allen Institute for AI)与几个研究小组一起准备并发布了新冠肺炎开放研究数据集(CORD-19) [3]。该数据集汇集了 44,000 篇关于新冠肺炎和冠状病毒家族的学术文章,供全球研究界使用。
该数据集已经有了一个相关的 Kaggle challenge ,数据科学家被要求开发文本和数据挖掘工具,以帮助医疗界开发高优先级科学问题的答案。此外,已经有一个 CORD-19 Explorer 工具,它提供了一种熟悉的方式来浏览 CORD-19 语料库。
世卫组织 COVID-2019
世界卫生组织(世卫组织)也在进行类似的努力。世卫组织每天通过手动搜索相关期刊的目录来更新数据集。此外,他们追踪其他相关的科学文章,丰富了数据集。
你可以下载整个数据集或通过作者、关键词(标题、作者、期刊)、期刊或一般主题在这里进行搜索。
新冠肺炎推文 ID
新冠肺炎推特 IDs 数据集收集了数百万条与冠状病毒爆发和新冠肺炎病相关的推特[4]。这个数据集中的第一条推文可以追溯到 2020 年 1 月 22 日。
作者使用 Twitter 的 API 来搜索和关注相关账户,并收集多种语言的带有特定关键词的推文。在此之前,下面给出了语言分类。
| Language | ISO | No. tweets | % total Tweets |
|------------- |----- |------------ |---------------- |
| English | en | 44,482,496 | 69.92% |
| Spanish | es | 6,087,308 | 9.57% |
| Indonesian | in | 1,844,037 | 2.90% |
| French | fr | 1,800,318 | 2.83% |
| Thai | th | 1,687,309 | 2.65% |
| Portuguese | pt | 1,278,662 | 2.01% |
| Japanese | ja | 1,223,646 | 1.92% |
| Italian | it | 1,113,001 | 1.75% |
| (undefined) | und | 1,110,165 | 1.75% |
| Turkish | tr | 570,744 | 0.90%
你可以在该项目的 GitHub repo 这里下载数据集以及更多信息,包括如何水化它(即一条推文的完整细节)。
结论
数据社区在冠状病毒爆发时做出了反应,生成了各种数据集,这些数据集可以加快新疗法的研究,为政策制定者提供信息,或创建预测模型,以更好地预测当前疾病的表现或触发对未来事件的警告。
剩下的问题是数据科学家将如何使用这些数据集,以及将产生什么工具。无论如何,我们的武器库中似乎多了一件对抗这种病毒的武器。
我叫 Dimitris Poulopoulos,是希腊比雷埃夫斯大学BigDataStack的机器学习研究员和博士(c)。我曾为欧洲委员会、欧盟统计局、国际货币基金组织、欧洲中央银行、经合组织和宜家等主要客户设计和实施人工智能和软件解决方案。如果你有兴趣阅读更多关于机器学习、深度学习和数据科学的帖子,请在 twitter 上关注我的**LinkedIn或@ james2pl。******
参考
[1]徐,b,Gutierrez,b,Mekaru,S. 等来自疫情的流行病学数据,实时病例信息。 Sci 数据 7、 106 (2020)。https://doi.org/10.1038/s41597-020-0448-0
[2]董,e,杜,h .,,加德纳,L. (2020).实时跟踪新冠肺炎的交互式网络仪表板。柳叶刀传染病。https://doi . org/10.1016/s 1473-3099(20)30120-1**
[3]新冠肺炎开放研究数据集(CORD-19)。2020.版本 2020-03-20。从年月日访问的 https://pages.semanticscholar.org/coronavirus-research.检索。https://doi.org/10.5281/zenodo.3727291
[4]陈,e .,勒曼,k .,,费拉拉,E. (2020)。新冠肺炎:第一个公开的冠状病毒推特数据集。arXiv 预印本 arXiv:2003.07372
启发您下一个数据科学项目的 5 个数据集
寻找一个数据集来使用?不要再看了…

弗兰基·查马基在 Unsplash 上拍摄的照片
开始一个新的数据科学项目有两种方式,要么你有一个想要实现的想法,所以你查找数据集来实现你的愿景。或者,你偶然发现一个令人兴奋的数据集,激发你开始一个新项目。
通常,作为一个初学者,你可能会有点迷失,四处寻找开始一个项目的好地方。对我来说,一个好的起点总是找到一个有趣的数据集来触发我的好奇心。
嗯,这篇文章是关于寻找数据集来启发你。当你偶然发现一个有趣的数据集,它有如此多的潜力来激发你的创造力,你会情不自禁地使用它来创建一些伟大的东西。
无论您处于数据科学之旅的哪个阶段,是刚刚起步,还是试图提高技能并建立新技能,没有比实践更好的方法来提高技能了。你建立的项目越多,你在数据科学方面就会越熟练,你的个人资料也会变得越好,越有吸引力。
为了提高您的数据科学技能,并建立一套建立强大档案所需的良好技能,您需要解决数据科学的 5 个方面:
- 深度学习
- 自然语言处理
- 大数据
- 机器学习
- 图像处理
在本文中,我将向您展示数据集的五个选项,分别针对数据科学的五个方面。我将谈一点关于数据集的构造,它的格式,以及一些可能的想法,关于如何使用它来构建一些奇妙的项目。
这些数据集可用于构建数据科学多个方面的项目。所以,发挥你的创造力,开始建立你的个人档案——或者扩大它。
MNIST 数据集
没有比从最著名的数据集集合——MNIST 数据集——开始更好的地方了。在这里,我们将讨论两个 MNIST 数据集:
- 手写数字的 MNIST。
- 时尚-MNIST。
手写数字的 MNIST
MNIST 数据集是手写数字的集合。该数据集包含 60,000 幅图像的训练集和 10,000 幅图像的测试集,可用于模型评估。数据集中的数字已经过大小标准化,并在固定大小的图像中居中。
该数据集非常适合想要尝试学习技术和模式识别方法的初学者,以及想要在真实世界数据上测试其模型同时花费最少精力进行预处理和格式化的中间数据科学家。
对于绝对的初学者来说,这个数据集的原始格式可能有点混乱;幸运的是,这个数据集也有一个易于处理的 CSV 格式的。
时尚-MNIST
时尚-MNIST 是 Zalando 文章图片的数据集。就像原始数据集一样,这个数据集也由 60,000 个样本的训练集和 10,000 个样本的测试集组成。
每个数据条目是一个 28x28 灰度图像,与来自 10 个类别的标签相关联。训练和测试图片的结构是相同的。
如何使用 MNIST 数据集?
- MNIST 数据集在帮助初学者理解和学习不同的机器学习和模式识别技术方面非常有用。
- 数据集包含定型数据和测试数据,因此不需要拆分数据。
- 该数据集可用于为时尚数据集中的手写、数字识别和服装识别构建图像识别应用程序。
- 您可以使用该数据集来学习和练习卷积神经网络(CNN)的不同方法和技术。你可以离开使用 Keras 和建立你的模型。
亚马逊产品数据集
亚马逊产品数据集包含来自亚马逊的产品评论和元数据,包括 1996 年 5 月至 2014 年 7 月期间的 1.428 亿条评论。该数据集包括评论(评级、文本、有用性投票)、产品元数据(描述、类别信息、价格、品牌和图像特征)和链接(也查看过/也购买过的图表)。
该数据集将让您对实际业务问题有一个基本的了解,并帮助您理解和提取多年来的销售趋势。
如何使用亚马逊产品数据集?
- 您可以使用该数据集来分析情感,这是自然语言处理(NLP)最受欢迎的应用之一。
- 这个数据集是一个文本处理数据,您可以使用它来构建各种类型的 NLP 模型。
- 您还可以使用该数据集构建产品趋势模型,并基于该模型预测未来趋势。
YouTube 视频统计数据集
YouTube 在平台上维护着一份持续更新的热门视频列表。为了选出年度热门视频,YouTube 使用了各种因素,包括衡量用户的互动(观看、分享、评论和喜欢的数量)。
YouTube 视频统计数据集是热门 YouTube 视频的每日记录。
如何使用 YouTube 视频统计数据集?
- 对不同类型的视频进行情感分析,寻找模式。
- 根据评论和统计数据对 YouTube 视频进行分类。利用这些结果,你可以建立你自己的数据库,其中的视频更能吸引观众。
- 训练像 RNNs 这样的机器学习算法来生成 YouTube 评论。
- 使用前几年的热门视频列表来建立一个机器学习模型,预测未来的热门视频列表。
垃圾短信数据集
如今,我们被垃圾邮件,垃圾邮件,垃圾广告和垃圾短信所包围。垃圾短信数据集包含一组 5574 条英文短信,标记为垃圾短信。
该数据集将不同的垃圾邮件表示为 CSV 文件的条目,以便于阅读和提取。数据集 CSV 文件包含两列,一列用于邮件是否为垃圾邮件的分类,另一列是邮件的原始文本。
如何使用垃圾短信数据集?
- 您可以使用机器学习分类算法来构建垃圾邮件分类器,然后对一些邮件进行测试,以将它们标记为安全邮件或垃圾邮件。
- 您可以在此数据集上构建模型并进行训练,以预测和检测垃圾邮件。
COCO 数据集
COCO 是一个大规模的对象检测、分割和字幕数据集,由微软创建,由许多其他大公司赞助。缩写 COCO 代表上下文中的公共对象。这个数据集包括许多特性,例如 80 个对象类别的 150 万个对象实例,33 万张图像,91 个物品类别,以及每张图像的 5 个标题。
COCO 拥有令人惊叹的文档,在你决定下载之前,你可以使用浏览器在线浏览数据集。
如何使用 COCO 数据集?
- COCO 可用于训练和建立机器学习模型,以检测和分类不同的对象。例如,您可以使用它来分类不同的可行类型。
- 本质上,使用 COCO 使您能够构建不同的图像处理应用程序,例如图像分割和压缩。
- 您还可以使用 COCO 训练您的模型通过检测人/动物来分析来自安全摄像机的镜头数据。
- COCO 还可以用于非数据科学项目,比如机器人学中的物体检测。
外卖
开始一个新项目可能有些棘手,尤其是如果你刚刚开始研究数据科学。当我刚开始时,我不能决定一个项目,简单地说,因为我没有足够的知识来选择一个项目和一个数据集。
对我有帮助的事情之一是,浏览数据集网站(例如 Kaggle )并阅读不同数据集及其使用方法。这给了我启动新项目所需的灵感。我现在仍然这样做。
唯一一次我不需要探索和浏览不同的数据集,是当我有一个带有特定数据集的 set 项目时。如果我受雇于一家公司或一个客户,情况就是这样。
随着我的知识基础的增长,我对好的数据集以及如何看到它们的潜力有了自己的看法。数据总会讲述一个故事,你只需要去听。
所以,我希望这篇文章能激发你去建立一个新的项目,或者浏览网页寻找令人兴奋的数据集,激发你去建立一些令人敬畏的东西。
5 天做别人的 Python 作业
所有的家庭作业都很酷,不仅仅是你自己的

看起来你想让别人帮你做作业…
让我帮你做作业吧!家庭作业应该让你学习你正在做的主题。做别人的作业只是让别人摆脱困境,他们也会错过学习的因素,对不对?
通常你会皱眉说“看起来你只是想让某人做你的作业……”,但是做别人的作业会很有趣!如果他们不想学,我当然想学。
我没有感到有点恼火,而是跳上车开始做作业!所有这些都可以在各种脸书团体中找到。我保持帖子匿名,但如果你看到你的帖子,并希望得到信任,请给我留言,我会将它添加到文章中。
第一天—用面向对象编程创建疫情:
让我们以最彻底的一个开始这一周。

这涉及到面向对象编程的使用。我想画出这些课程的草图,看看它们是如何联系在一起的,但是看着作业,我不认为我们需要太多。这可能是一个只有字典而没有课程的任务。然后你需要把它全部转换成包含类。这是一种强制使用的类赋值。
起初,我在寻找一个City类的用法。你可以在这里使用一个城市类,但是真的没有必要。我们可以创建一个Pandemic类并将城市存储在 dict 中。
pandemic.py
def add_city()
这个方法只是在self._city_overview = {}字典中添加了一个城市。作业说城市的数据应该是一个序列。这通常是一个列表或一个元组,但是字典在这里更好,所以我们为用户添加到主字典中的键创建一个新字典,就像这样。
self._city_overview = {'Oslo' : {infected:0 , recovered:0 , deaths:0} }
这样,我们就完成了添加带有默认值的城市的任务。
def edit_city()
此方法编辑主概览字典中的现有城市。
因为我们只接受整数,所以我们首先检查是否所有的输入都是整数。由于 input 首先返回一个字符串,我们可以使用.isdigit()来检查用户是否输入了有效的数字。
我们也可以使用int(input(‘’))来强制一个 int,但是我不喜欢这种方法,因为如果你输入一个字符串,它会使程序崩溃。
def 显示 _ 所有 _ 城市 _ 统计()
这个方法只是显示我们拥有的数据。因为这是一个 dict with dicts,我们需要在这里做一些循环。
要打印城市名,这是一个键,我们只需要循环遍历这些键。我们可以在 dict 上使用key()方法来获得这些
for key in self._city_overview.keys():
对于 city 键中的 dict,我们需要键和值。这里我们可以使用items()方法
for inner_key,inner_value in self._city_overview[key].items():
print (f'{inner_key} : {inner_value}')
如果我们使用列表库,看起来会更漂亮。你可以在我关于作家分析的文章中看到这些漂亮表格的例子:
用数据分析为什么三位顶级作家如此成功
medium.com](https://medium.com/better-marketing/7-ways-you-can-find-the-magic-formula-of-great-successful-writers-d32001d6ac4e)
如果你觉得大胆,你可以在这里找到 400 万个城市的名单:
我们自豪地提供一个简单、准确和最新的世界城镇数据库。我们从…构建了它
simplemaps.com](https://simplemaps.com/data/world-cities)
使用csv模块填充项目。
def get_city_overview()
以防万一,你曾经需要抓住任何东西的概述字典
main.py
让我们来看看完成所有交互的主程序。没什么大不了的,但我会把它分解。
您要做的第一件事是导入您的疫情类。
我们首先创建电晕疫情,然后我们将user_choice设置为‘y’,以确保我们进入了 while 循环,在这里我们请求用户输入。
作业说我们需要考虑到‘Y’和‘y’。通过使用lower(),我们确保输入总是小写。这样我们只需要检查‘y’就可以了。
如果用户说‘y’,我们要求城市。如果城市在字典中,我们可以使用。edit_city()方法。
如果城市不存在,作业希望我们用默认值添加城市。我们为此使用了.add_city()方法,如果用户想要立即编辑新的城市,我们在新创建的城市上使用edit_city()。
您可以将数据输入到疫情方法本身,而不是在 main 中运行两次。这可能是一个好主意,看看…
第 2 天—器械包的经典用法:
让我们更轻松地做下一个来喘口气。

我喜欢作业中有错误的时候…这经常发生。预期的结果不会返回您期望从为解决问题而编写的程序中得到的结果。
作业希望我们得到一个序列中的值的列表(我猜要么是一个列表,要么是一个逗号分隔的字符串。)然后,它希望我们删除任何重复项,并返回排序后的列表。
有许多方法可以获得逗号分隔值的列表。对用户来说,最简单的方法可能是写一个单词,按回车键,然后再写一个。你可以创建一个菜单,直到你按下“q”或其他键。对于这个项目,我选择让用户一次按顺序输入所有内容。因为这个方法,我们需要解决另一个。如果用户在任何地方输入空格,我们需要删除它们。
你可能还想使用lower()来确保“红色”和“红色”被同等对待。
为了解决这个问题,我们可以使用多种内置方法。这背后的基本思想是:
1) get a list of strings comma separated.
2) kill the duplicates
3) sort what's left
4) return sorted representation
我们允许用户输入单词,所以它是多才多艺的。我们还添加了一个条,这样我们可以在用户添加空格时考虑错误。

互动
split_user_words = [word.strip() for word in user_words.split(',')]
我们使用列表理解去除列表元素中的所有空格。拆分版的话,加strip()。这将创建一个去掉空格的新列表。
clean_user_words = set(split_user_words)
这将创建一个set,您可能知道,一个set不能有同一个单词的多个实例。这对这项任务来说再合适不过了。
print (','.join(sorted(clean_user_words)))
为了确保我们根据任务文本正确输出打印结果,我们可以使用.join()。这将使用列表中的所有元素,并将它们连接成一个字符串。‘,’告诉 join 用逗号将它们连接起来。猜猜(sorted(clean_user_words))是干什么的。
第三天——理解代码并以 pythonic 的方式重写代码

正如函数名所示,代码将接受一个 iterable 并返回第二大的 iterable。在这种情况下,我们传递一个列表。
它是以一种混乱的方式写的,但是让我们看看我们得到了什么。
largest = nums[0]
second_largest = num[0]
这里,代码将列表的第一个数字分配给最大和第二大的变量。当我们遍历列表的其余部分时,它准备看看是否有更大的数字进来。
for i in range(1,len(nums)):
if nums[i] > largest:
second_largest = largest
largest = nums[i]
好的,如果下一个数字大于largest,它会将当前最大的数字加到变量second_largest中,并将新的更大的值赋给 maximum。这样它就把数字推到了一边。
elif nums[i] > second_largest:
second_largest = nums[i]
如果该数字不大于largest,但大于second_largest,则应该将其从变量中推出并保持最大值。
return second_largest
替代代码:
我觉得上面的代码很笨拙。看起来写它的人来自非 Python 背景。手动工作太多,无法抓住要点。
下面是我如何编写相同的函数:
def get_second_largest(number_list):
return sorted(number_list)[-2]def main():
my_nums = [44,11,8,29,25,76,88]
print (f'second highest number: {get_second_largest(my_nums)}')main()>>> second highest number: 76
或者,您可以使用.sort(),但是如果我不需要就地修改列表,我更喜欢使用 sorted。
#alternative:
def get_second_largest_sort(number_list):
number_list.sort()
return number_list[-2]
第四天——石头、布、剪刀

是的…大多数“截图”都是这样贴出来的。
我注意到最近在脸书问题上石头、纸、剪刀有所增加。我不知道这是不是因为几个人在做同一个作业,但我认为尝试解决这个问题是个好主意。
我不想用一长串 if/else 来解决这个问题,所以我开始寻找一种实现规则的方法,并找到了一种写一个简短而可靠的版本的方法。
定义菜单()
这是返回一个长字符串并将其用作菜单的简单方法。我想把它放在一个独立的函数中,这样它就很容易改变,并且和游戏本身是分开的。
def 随机计算机选择()
该函数使用导入模块,并根据该随机数返回计算机选择。
该数字生成索引,并使用备选项列表返回一个选项。
定义节拍 _ 检查()
这个函数允许我们不依赖一堆如果问题。
字典保存节拍值。这意味着键“石头”将击败值“剪刀”。
我使用了.get()方法,而不是dict[key]方法来获取键的值。通过使用.lower(),我们也确保捕捉到岩石对岩石。
Jonathan Hsu 有一篇很好的文章讲述了这是如何工作的:
[## 在 Python 中,停止使用方括号符号来获取字典的值
超越传统方法,保护您的代码
我们不是在检查打字中的实际错误。您应该将这一点融入代码和交互循环中。
def main()
这里没什么特别的…我们有电脑选择和玩家选择。然后我们让他们互相比赛,看谁赢了。
这里唯一的额外部分是检查它是否是一个领带。
升级程序
为了让这个游戏更具互动性,你可以尝试创建一个循环,这样玩家就可以想玩多久就玩多久。
第五天——只想学 Python

嗯,他的范围很广,我对此没有很好的答案。不过,我想链接一些关于 Python 的好资源。下面是我用过的资源和被推荐的资源的随机列表。欢迎在评论区添加您的收藏。
用 Mosh 编程— Python 全教程
Andrei Neagoie——2020 年的完全 Python 开发者:零到精通,
我的课程
zed Shaw——艰难地学习 Python
ISBN-10:1593279280
ISBN-13:978–1593279288
Eric Matthes——Python 速成班第二版:基于项目的编程入门实践
ISBN-10:1593279280
ISBN-13:978–1593279288
YouTube——科里·谢弗
YouTube——卡勒·哈尔登
最后
这是一个非常有趣的练习,我希望你能学到一两个技巧。我正在考虑创作一个名为“允许我做你的作业”的系列。我接触初学者的地方。我们会看到这有多受欢迎。
谢谢你坚持和我在一起!
-M
在你的机器学习面试中脱颖而出的 5 个衍生物
机器学习背后的微积分:回顾导数,梯度,雅可比和海森

就业市场对机器学习工程师及其对数学的深刻理解存在整体怀疑。事实是,所有机器学习算法本质上都是数学框架——支持向量机被表述为对偶优化问题,主成分分析被表述为光谱分解滤波,或者神经网络被表述为连续非线性函数的组合——只有彻底的数学理解才能让你真正掌握它们。
各种 Python 库有助于将高级算法用于简单的步骤,例如, Scikit-learn 库包含 KNN、K-means、决策树等。,或 Keras,让您无需了解 CNN 或 rnn 背后的细节就可以构建神经网络架构。然而,成为一名优秀的机器学习工程师需要的远不止这些,这些职位的面试通常会包括一些问题,例如,从零开始实现 KNN 或决策树,或者推导线性回归或 softmax 反向传播方程的矩阵闭式解。
在这篇文章中,我们将回顾微积分的一些基本概念,例如一维和多维函数的导数,包括梯度、雅可比和海森,让你开始准备面试,同时帮助你建立一个良好的基础,成功地深入探索机器学习背后的数学,特别是神经网络。
这些概念将用 5 个衍生产品的例子来说明,这些例子是你面试时绝对应该随身携带的:
- 复合指数函数的导数— f(x)= eˣ
- 变基变指数函数的导数— f(x)= xˣ
- 多维输入函数的梯度— f(x,y,z) = 2ˣʸ+zcos(x)
- 多维函数的雅可比矩阵— f(x,y) = [2x,x √y]
- 多维输入函数的 hessian—f(x,y) = x y
导数 1:复合指数函数

指数函数是一个非常基础、常见和有用的例子。它是一个严格的正函数,即ℝ的 eˣ > 0 ,需要记住的一个重要性质是 e⁰ = 1。另外,你要记住指数是对数函数的倒数。这也是最容易求导的函数之一,因为它的导数就是指数本身,即(eˣ)' = eˣ.)当指数与另一个函数结合时,导数变得更加复杂。在这种情况下,我们使用链式法则公式,即 f(g(x)) 的导数等于 f'(g(x))⋅g'(x) ,即:

应用链式法则,我们可以计算出 f(x)= eˣ的导数。我们先求出 g(x)=x 的导数,即 g(x)'=2x。我们还知道,ˣ)'=eˣ.将这些相乘得到两个中间结果,我们得到

这是一个非常简单的例子,乍一看似乎微不足道,但它经常被面试官作为热身问题来问。如果你有一段时间没有看到衍生品,确保你能迅速对这些简单的问题做出反应,因为虽然这不会给你这份工作,但在这样一个基本问题上的失败肯定会让你失去这份工作!
导数 2。变基变指数函数

这个功能在面试中是一个经典,尤其是在金融/量化行业,这里对数学技能的测试甚至比科技公司的机器学习职位更深入。这有时会让受访者脱离他们的舒适区,但实际上,这个问题最难的部分是能够正确地开始。
当处理这种指数形式的函数时,要认识到的最重要的事情是,第一,指数和对数之间的反比关系,第二,每个指数函数都可以改写为自然指数函数的形式

在我们讨论 f(x) = xˣ的例子之前,让我们用一个更简单的函数 f(x) = 2ˣ.来演示这个性质我们首先使用上面的等式将 2 ˣ 重写为 exp(xln(2)) ,随后应用链式法则来推导合成。

回到最初的函数 f(x)=xˣ ,一旦你将函数改写为 f(x)=exp(x ln x) ,导数的计算就变得相对简单,唯一可能困难的部分是链式法则步骤。

注意,这里我们对指数 xln(x) 使用了乘积法则(uv)’= u’v+uv’。
这个函数通常在没有任何函数域信息的情况下被调用。如果你的面试官没有默认指定领域,他可能是在测试你的数学敏锐度。这就是问题的欺骗性所在。在不具体说明域的情况下,似乎为正值和负值都定义了 xˣ 。但对于负数 x , e.g.(-0.9)^(-0.9) ,结果是一个复数,具体为-1.05–0.34 I。一种可能的解决方法是将函数的定义域定义为ℤ⁻∪ℝ⁺0(进一步讨论见这里的),但是这对于负值仍然是不可微的。因此,为了正确定义 xˣ 的导数,我们需要将定义域限制为严格的正值。我们排除 0 是因为对于定义在 0 中的导数,我们需要左边的极限导数(对于负值限制在 0 中)等于右边的极限导数(对于正值限制在 0 中),这是一个在这种情况下被打破的条件。自左极限

未定义,函数在 0 中不可微,因此函数的定义域仅限于正值。
在我们进入下一部分之前,我留给你这个函数的一个稍微高级一点的版本来测试你的理解: f(x) = xˣ 。如果您理解了第一个示例背后的逻辑和步骤,添加额外的指数应该不会造成任何困难,并且您应该得出以下结果:

导数 3:多维输入函数的梯度

到目前为止,一阶和二阶导数部分讨论的函数都是从ℝ到ℝ的映射,即函数的定义域和值域都是实数。但是机器学习本质上是矢量的,函数是多维的。这种多维性的一个很好的例子是输入大小为 m 和输出大小为 k 的神经网络层,即 f(x) = g(Wᵀx + b,其中是线性映射 Wᵀx ( 具有权重矩阵 W 和输入向量 x )和非线性映射 g (激活函数)的元素式组合。在一般情况下,这也可以看作是从ℝᵐ到ℝᵏ.的映射
在 k=1 的具体情况下,的导数称为梯度 。现在让我们计算以下三维函数的导数,该函数将ℝ 映射到ℝ:

你可以把 f 想象成一个把大小为 3 的向量映射到大小为 1 的向量的函数。
多维输入函数的导数被称为梯度,用符号 nabla (倒置 delta ): ∇.表示将ℝⁿ映射到ℝ的函数 g 的梯度是 g 的一组 n 偏导数,其中每个偏导数是 n 变量的函数。因此,如果 g 是从ℝⁿ到ℝ的映射,那么它的梯度∇g 就是从ℝⁿ到ℝⁿ.的映射
为了求我们函数 f(x,y,z) = 2ˣʸ + zcos(x) 的梯度,我们构造了一个偏导数的向量 ∂f/∂x,∂f/∂y, ∂f/∂z ,得到如下结果:

注意,这是一个类似于前一节的例子,我们使用等价关系 2ˣʸ=exp(xy ln(2))。
总之,对于将ℝ 映射到ℝ的多维函数,导数是将ℝ映射到ℝ的梯度 ∇ f,。**
在ℝᵐ到ℝᵏ的映射的一般形式中,其中将ℝᵐ映射到ℝᵏ的多维函数的导数是雅可比矩阵(而不是梯度向量)。让我们在下一节对此进行研究。
导数 4。多维输入输出函数的雅可比矩阵

从上一节我们知道,映射ℝᵐ到ℝ的函数的导数是映射ℝᵐ到ℝᵐ.的梯度但是对于输出域也是多维的情况,即对于 k > 1 从ℝᵐ到ℝᵏ的映射呢?
在这种情况下,导数称为雅可比矩阵*。我们可以简单地将梯度视为雅可比矩阵的一种特殊情况,其维数为 m x 1 ,其中 m 等于变量的数量。函数 g 映射ℝᵐ到ℝᵏ的雅可比矩阵 J(g) 就是ℝᵐ到ℝᵏᵐ.的映射这意味着输出域的尺寸为 k x m ,即是一个形状为 k x m 的矩阵。换句话说, J(g) 的每一行 i 代表 g. 的每个子功能 gᵢ 的梯度 ∇ gᵢ
让我们推导上面定义的函数 f(x,y) = [2x,x √y] 映射ℝ到ℝ,因此输入和输出域都是多维的。在这种特殊情况下,由于平方根函数不是为负值定义的,我们需要将 y 的域限制在ℝ⁺.我们的输出雅可比矩阵的第一行将是函数 1 的导数, i.e.∇ 2x,,第二行是函数 2 的导数,,即 ∇ x √y.

在深度学习中,雅可比矩阵特别令人感兴趣的一个例子是可解释性领域(例如,参见基于敏感性的神经网络解释),该领域旨在理解神经网络的行为,并分析神经网络输出层对输入的敏感性。雅可比矩阵有助于研究输入空间的变化对输出的影响。这可以类似地应用于理解神经网络中中间层的概念。
总之,记住梯度是一个标量相对于一个向量的导数,雅可比是一个向量相对于另一个向量的导数。
导数 5。多维输入函数的 Hessian

到目前为止,我们的讨论只集中在一阶导数上,但是在神经网络中我们经常会谈到多维函数的高阶导数。一个特殊情况是二阶导数,也称为海森矩阵,并表示为 H(f) 或 ∇(纳布拉平方)。从ℝⁿ到ℝ的映射是从ℝⁿ到ℝⁿⁿ.的映射*
让我们分析一下,在输出领域,我们是如何从ℝ走向ℝⁿⁿ的。一阶导数,即梯度 ∇g,是从ℝⁿ到ℝⁿ的映射,其导数是雅可比矩阵。因此,每个子函数 ∇gᵢ 的推导导致ℝⁿ到ℝⁿ的映射,具有 n 个这样的函数。你可以这样想,就好像导出梯度向量的每个元素展开成一个向量,从而成为向量的向量,即*一个矩阵。
为了计算 Hessian,我们需要计算所谓的交叉导数,t 也就是,首先相对于 x 求导,然后相对于 y 求导,反之亦然。有人可能会问,我们取交叉导数的顺序是否重要;换句话说,海森矩阵是否对称。在函数 f 是𝒞的情况下,即两次连续可微,施瓦兹定理陈述交叉导数相等,因此海森矩阵是对称的。一些不连续但可微的函数不满足交叉导数相等。
构造函数的 Hessian 等价于求标量值函数的二阶偏导数。对于特定示例 f(x,y) = x y ,计算产生以下结果:

你可以看到交叉导数 6xy 实际上是相等的。我们首先针对 x 进行推导,得到 2xy、,然后再针对 y、得到 6xy。对角元素是简单的fᵢ,用于x或y的每个一维子功能
一个扩展将是讨论多维函数的二阶导数将ℝᵐ映射到ℝᵏ的情况,这可以直观地视为二阶雅可比。这是从ℝᵐ到ℝᵏᵐᵐ的映射,即一个 3D 张量。类似于 Hessian,为了找到 Jacobian 的梯度(第二次微分),我们对 k x m 矩阵的每个元素进行微分,得到一个向量矩阵,即一个张量。虽然不太可能要求您手动进行此类计算,但了解多维函数的高阶导数非常重要。
结论
在本文中,我们回顾了机器学习背后的重要微积分基础。我们用一维和多维函数的例子演示了它们,讨论了梯度、雅可比和海森。这篇综述是对可能的面试概念的彻底演练,也是对机器学习背后的微积分相关知识的概述。
针对您的应用的 5 种开发运维监控策略

妮可·沃尔夫在 Unsplash 上的照片
如今,越来越多的公司采用 DevOps 进行持续集成和持续交付。在 DevOps 领域,自动化经常成为焦点。
这并不奇怪。为什么?
根据 Puppet 的 2019 年开发运维状况报告,开发运维自动化对组织的整体效率具有积极影响
然而,也许比自动化更重要的是,DevOps 监控是另一个关键元素,有助于在交付管道的每个阶段提高意识。
您可能需要考虑监控的许多方面。比如什么?
您应该监控什么,使用哪些工具,或者如何开始您的 DevOps 监控策略。
虽然监控先于 DevOps,但 DevOps 进一步改变了软件开发过程,以至于监控也必须发展。软件开发的整体步伐随着开发运维而加快,团队现在正在自动化集成和测试,并在云中部署软件,以快速的时间表和连续的交付。
有了 DevOps,现在需要监控的东西更多了,从集成、供应到部署,团队需要使用 DevOps 监控策略来有效地监控项目的不同方面。
对于您的应用,最好的 5 种 DevOps 监控策略是什么?
为了帮助您在快速变化的环境中使用 DevOps 监控策略,我们创建了一个通用框架来帮助您了解如何开始、监控哪些内容、使用哪些工具来满足监控需求,以及您可以在何处进行整合。
确定您应该监控的内容
有效开发运维监控策略的第一步?
确定应用程序中应该监控的内容。监控目标可以分为几个主要类别,您可能希望至少涵盖每个类别的一个方面。
这些类别包括:
- 服务器运行状况
- 应用程序日志输出
- 脆弱点
- 发展里程碑
- 用户活动
发展里程碑
监控开发里程碑是您的 DevOps 策略运行情况的指示器。这是深入了解您的工作流程并确定您的团队运作效率的有效方式。跟踪每次冲刺的持续时间;缺陷被识别、记录和修复的速度;和预期交付特性的比率。
询问以下问题:
- 我们能赶上最后期限吗?如果没有,是什么阻碍了这一进程?
- 团队是否有效地遵循 DevOps 方法?
尽可能整合监控工具,以简化和加快故障排除。使用开源和开放许可代理来扩展技术并保持独立于供应商。
还有什么?
您可以使用机器学习技术来自动化配置任务并节省时间。
脆弱点
漏洞可以大致分为两类:通过国家漏洞数据库(NVD)维护的列表广为人知或可识别的应用程序中的已知弱点或漏洞,以及由于应用程序中不安全的编码实践、不安全的设计或不安全的架构而出现的漏洞。
企业必须监控这些漏洞并及时缓解它们。这些漏洞可以通过多种方式解决,例如修改第三方依赖关系、定期进行安全代码审查、培训您的软件开发团队以及雇佣有经验的专业人员。
用户活动监控
用户活动监控可能是 DevOps 最明显的监控策略之一。应持续监控异常请求或意外输入,例如多次失败的登录尝试、异常登录次数和未知登录设备,以确保只有授权用户才能访问系统。
还有呢?
监控用户行为还有助于检测异常活动,如访问权限提升。例如,开发人员试图访问管理员帐户。
这种不寻常的行为和请求可能会引发怀疑,并使您更加意识到由于用户活动监控不力而可能发生的潜在内部威胁或其他网络攻击。
应用程序日志输出
监控应用程序日志输出经常被低估,但是如果您的服务是分布式的,并且您没有集中的日志记录,那么这个任务就困难得多。
此外,如果错误和漏洞没有被实时检测到,它们就没有多大价值。确保错误代码或易错代码实时生成通知,并且这些通知易于搜索,这一点很重要。在生产环境中跟踪 bug 或错误的能力是一个巨大的优势。
服务器运行状况
通过分析可用资源的性能和正常运行时间来监控服务器的健康状况。确保配置正确,扫描功能正常工作,例如识别应用程序中的漏洞。此外,确保服务器强化到批准的配置。
确定监控功能
DevOps 的监控工具应该能够从开源代理收集性能时间序列数据,跟踪机器学习在警报和报告方面的应用,并在可扩展的时间序列数据库中收集数据。
以下是一个或多个监控工具可能提供的一组功能:
- 仪表盘:预置易于定制的仪表盘,与同行分享。
- 诊断:对您的整个应用程序堆栈进行故障排除,以识别潜在的漏洞,并确保所有功能都按预期运行。
- 数据收集器:每种编程语言和中间件的开源和开放许可代理。
- 数据保留:时序性能数据和日志数据。
- 通知:可与升级服务和即时消息集成的实时警报。
- 报告:深入的见解和报告,有助于确定绩效热点和规划。
- REST API :包含自定义数据,通过文档化 API 更新配置,访问任何数据。
- 机器学习:非实时的容量损失分析和实时的异常检测。
监控您的整个应用体系
您选择的 DevOps 监控工具应该能够端到端地监控您的整个堆栈,并提供更快的故障排除和快速补救。此列表本质上并不全面,而是旨在涵盖应用中最大的功能集:
基础设施监控
基础设施监控是全栈应用监控策略的关键组成部分。
工具应该测量什么?
- 有效性
- CPU 使用率
- 磁盘使用
- 正常运行时间
- 响应时间
- 数据库
- 储存;储备
- 成分
- 虚拟系统
- 表演
- 用户权限
- 安全性
- 网络交换机
- 流程级使用
- 应用程序的吞吐量
- 服务器的负载
此外,它们还应该能够提供趋势的历史、测量的时间序列数据,以及具有过程级向下钻取的数据的集合。
网络监视
网络监控工具应该能够测量性能指标,如延迟、不同端口级别的指标、带宽、主机的 CPU 使用率、网络数据包流量,并提供自定义指标。一般来说,网络监控工具需要一个跨各种网络拓扑(如基于云的网络和异构网络)工作的平台。
应用程序性能监控
应用程序性能监控是通过应用程序上可用的跟踪和分析来搜索、收集和集中日志的地方。
它还有助于提供对性能的测量,如可用性、错误率、吞吐量、用户响应时间、慢速页面、页面加载、第三方 JavaScript 慢速、trackSLA、浏览器速度,以及对最终用户事务的检查。
尽管这个列表并不详尽,但它应该让您了解现有的监控工具提供了什么,以及 DevOps 监控策略中有哪些漏洞。
评估开发运维工作流的监控工具
创建一个大纲框架,开发运维团队可以将其作为评估流程的起点。
通过概述适用于您的整体 DevOps 监控策略的目标,您可以将评估期间的关注点缩小到特定问题,例如:
“这个监控工具符合我的目标和需求吗?”
了解 DevOps 监控工具及其提供的功能将有助于您在评估过程中深入了解特性功能。
还有呢?
了解与每个监控方面(如应用程序监控或基础架构)相关的监控功能,将有助于为更具体、更全面的 DevOps 监控策略提供最佳选择。
利用工具进行有效的开发运维监控
以下是当今市场上最好的 DevOps 监控工具:
- Collectl — Collectl 将各种性能监控工具整合到一个平台中。它可以监视各种子系统,如节点、存储、处理器、TCP 和文件系统。Collectl 运行在所有的 LInux 发行版上,可以在 Debian 和 Red Hat 仓库中获得。
- Consul — Consul 在众多数据中心环境中提供键值存储、发现、故障检测和其他功能。它与用于查询服务的内置 DNS 服务器集成在一起,并且支持现有的基础设施,而无需修改代码。
- 上帝 —上帝使用 Ruby 框架来提供一种简化的监控方法。它可以在 BSD、Darwin 系统和 Linux 上获得。上帝提供了一种编写事件条件和轮询事件的简化方法。它还提供了一个集成的自定义通知系统。
- Ganglia — Ganglia 利用了针对集群联合优化的分层设计。它使用 XDR 和 XML 等常见技术进行数据表示和传输,并使用独特的数据结构和算法方法来实现高级别的并发性并减少节点上的开销。
- Nagios — Nagios 结合使用无代理和基于代理的软件工具,为 Unix、Linux、Windows 和 web 环境提供应用程序、网络和服务器监控。该系统使用各种报告格式和可视化来提供正常运行时间、响应和可用性。
外卖食品
企业创建和实施有效的 DevOps 监控策略至关重要。DevOps 中更快的开发过程带来了几个挑战,特别是由于快速过程或缺乏测试而可能留下的系统中的漏洞。
拥有高效且可扩展的 DevOps 监控策略将有助于您深入了解您的应用,在流程的早期发现漏洞,并减少漏洞。请记住,虽然监控的一个方面可能比另一个方面对您的业务更重要,但评估您的应用程序或项目的各个方面是至关重要的。
如果您对 DevOps 监控策略有任何疑问或需要任何帮助,请联系我们。
关于作者:
Steve Kosten 是 Cypress Data Defense 的首席安全顾问,也是“Java/JEE 中的 SANS DEV541 安全编码:开发可防御应用程序”课程的讲师。
Python 中下划线的 5 种不同含义
确保使用正确的语法

Erik Witsoe 在 Unsplash 上拍摄的照片
如果你是一个 Python 程序员,你可能对下划线很熟悉。Python 使用两种类型的下划线:单下划线_和双下划线__。不要小看 Python 中的下划线,这是一个非常强大的语法。在这篇文章中,我将谈论 5 种不同的下划线模式。
单个独立下划线 _
单个下划线_是一个 Python 标识符的有效字符,所以它可以用作变量名。
- 代表解释器中的最后一个表达式
根据 Python 文档,在交互式解释器中使用特殊标识符
_来存储上次评估的结果。它存储在内置模块中。
这里有一个例子。首先,我们检查_没有存储在内置模块中,然后我们编写一个没有变量名的表达式。如果我们再次检查内置模块,我们会在模块中找到_并且值是最后一次评估。
>>> '_' in dir(__builtins__)
False
>>> 1+1
2
>>> '_' in dir(__builtins__)
True
>>> _
2
2。代表我们不关心的价值观
单下划线_的另一个用例是表示你不关心的或者在程序后面不会用到的值。如果您将类似 Flake8 的 linter 应用到您的程序中,如果您分配了一个变量名但从未使用过,您将从 linter 得到一个错误( F841 )。把自己不在乎的变量赋给_就能解决这个问题。
让我们看一些代码。 Example1 使用_来表示列表中每个元素的索引。在例 2 中,我们只关心来自元组的year、month和day,所以把_赋给其余的(时、分、秒)。但是如果我们打印出_,我们只会得到最后一个表达式,也就是 59。
来自 Python 3。,它支持扩展的可迭代解包,这意味着我们可以使用*_来表示多个值。在示例 3* 中,_实际上代表了我们想要忽略的值的列表。
Lambda 功能也支持_。在例 4 中,lambda 函数用于 monkeypatch 函数random.randint,并且将始终生成相同的输出。在这种情况下,输入参数不再重要。
3。用于数字分组的可视分隔符
从 Python 3.6 开始,下划线_也可以用作数字分组的可视分隔符。正如 PEP515 所说,它适用于整数、浮点和复数文字。
integer = 1_000
amount = 1_000_000.1
binary = 0b_0100_1110
hex = 0xCAFE_F00D
>>> print(amount)
1000000.1
>>> print(binary)
78
>>> print(hex)
3405705229
单前导下划线 _var
根据 PEP8 ,单前导下划线
_var供内部使用。从 M 导入*不导入名称以下划线开头的对象。
_在变量或方法名前是一个弱内部使用指示器。它警告开发人员不要公开导入和使用这个变量、方法或函数。然而,Python 并没有完全阻止它们被导入和使用。
在下面的例子中,我们有一个公共变量external和一个私有变量_internal。如果我们做通配符导入 from m import *,不包括_internal变量(main1.py)。但是如果我们显式导入_internal(main 2 . py)或者使用常规导入 (main3.py)就可以了。
单个前导下划线在类中被大量使用。程序员可以创建私有变量和方法,但是和前面的例子一样,这些变量和方法仍然可以从外部使用。
一般来说,单个前导下划线只是一种命名约定,表示变量或函数供内部使用。如果程序员真的想的话,他们仍然可以导入这个名字。
单个尾随下划线var_
使用单个尾随下划线的原因只有一个,那就是避免与 Python 关键字冲突。这在 PEP8 中也有提及。
我们可以使用keyword模块来检查 Python 中的关键字列表。如果你想给一个变量名叫做global,那么你应该把它命名为gloabl_。
双前导下划线__var
到目前为止,我们讨论的模式基本上是不同的命名约定,但是使用双前导下划线,Python 的行为会有所不同。
Python 解释器将对带有前导下划线的标识符进行名称处理。名称篡改是在一个类中覆盖这些标识符的过程,以避免当前类及其子类之间的名称冲突。
综上所述,__var在类中会有不同的名字。让我们看看下面的例子。该示例使用内置函数[dir](https://docs.python.org/3/library/functions.html#dir)返回当前本地范围内的名称列表。在列表的最后,我们看到了_hour、day、month和year,这意味着我们可以通过time._hour或time.year直接检索这些属性。
然而,对于__minute,它却另有故事。其名称被覆盖为_Time__minute。
这将产生两个后果:
- 属性
__day在类Time之外不可访问。如你所见,__day没有被Time类识别,它被替换为_Time__day。
print(time.__day)# AttributeError: 'Time' object has no attribute '__day'print(time._Time__day)
# 10
2.属性__day不能在Time的子类中被覆盖。在下面的例子中,我们创建了一个从类Time扩展而来的子类TimeSubClass,并使用dir来检查本地名称。
在输出中,你可以找到_TimeSubclass__day、_Time__day、_month和year。这意味着_month和year已经被新值覆盖,但__day没有。
让我们检查一下数值。_TimeSubclass__day被赋予新值,而_Time__day仍为原始值。
print(time_subclass._TimeSubclass__day)
# 30
print(time_subclass._Time__day)
# 1
虽然不能通过直接访问获得值,但是仍然可以通过方法获得值,在方法中,返回self.__day。对@property也有效。
双前导和尾随下划线__var__
与单尾随下划线不同,双尾随下划线没有特殊含义。你大概可以把var__看成是var_的延伸。
然而,双前导和尾部下划线__var__是完全不同的,它是 Python 中非常重要的模式。Python 不会对这样的属性应用名称处理,但是带有双前导和尾随下划线的名称在 Python 中是为特殊用途而保留的。他们被称为神奇的名字。你可以查看 Python 文档来获得魔法名称列表。像__init__、__call__、__slots__这些名字都是神奇的方法。
这些魔法属性和魔法方法是允许被覆盖的,但是你需要知道你在做什么。让我们看一个例子。__str__是一个返回对象的字符串表示的方法。当你做print()或者str()的时候这个方法被调用。在这个例子中,我们覆盖了字符串表示,然后我们将在输出中得到一个新的格式。
你可以有一个自定义的名字,像__day__一样有双下划线。Python 会把它作为一个常规的属性名,不会对它应用名称篡改。但是,没有很强的理由就起这样的名字,并不是一个好的做法。
结论
在本文中,我们讨论了 Python 中下划线的 5 种不同模式。我们来总结一下。
- 单独立下划线
_单前导下划线_var单尾随下划线var_。
带有单下划线的模式基本上是命名约定。Python 解释器不会阻止它们在模块/类之外被导入和使用。
2.双前导下划线__var双前导和尾随下划线__var__。
带有双下划线的模式更加严格。它们要么不允许被覆盖,要么需要一个好的理由来这样做。请注意,双尾下划线var__没有特殊含义。
我希望你喜欢这篇文章!如果你有任何想法,请在下面留下你的评论。
参考
许多 Python 开发人员不知道中下划线(_)的功能。它帮助用户编写 Python…
www.datacamp.com](https://www.datacamp.com/community/tutorials/role-underscore-python) [## Python-dbader.org 中下划线的含义
Python 中单下划线和双下划线(“dunder”)的各种含义和命名约定,如何命名…
dbader.org](https://dbader.org/blog/meaning-of-underscores-in-python)
数据科学家的 5 个不要和 5 个要
处理数据时要记住的建议

艾米丽·莫特在 Unsplash 上的照片
在收集了我们的数据之后,作为一名数据科学家,我们只想继续进行我们的数据分析,并创建我们完美的机器学习模型。我们拥有世界上所有的创造力,只是受到大脑中的东西的限制,尽管我们的数据中有一些事情是错误的。
因此,作为一名数据科学家,以下是我个人的五条禁忌。
尽管如此,我们的数据还是存在一些错误。
1.丢弃数据
不要:未经适当分析丢弃数据
当我们收集数据并进行调查时,数据中必然会出现缺失数据或异常值。我经常在有抱负的数据科学家身上看到,他们是如何放弃这些数据而不进行任何进一步的分析的。通常,理由是“只有少量数据”或“这些数据根本不会影响机器学习模型。”这种思路是危险的。
做:仔细分析后把数据掉。
我并没有说你不能放弃这些数据,而是说只有在进行彻底的分析后才能这样做。这些缺失数据或异常数据可能包含一个重要的模式,有助于回答我们的数据科学问题。
2.依靠准确性
不要:只靠准确性来衡量“成功”
我们已经分析了我们的数据,并创建了机器学习模型。然后我们对这个模型进行评估,结果显示准确率为 98%。然后,您认为这是一个已经可以部署的有用模型。诚然,较高的准确性可能意味着一个伟大的模型,但仅仅依靠准确性来衡量数据或模型的成功将是错误的。
做:从许多其他指标来衡量“成功”。
根据我们提出的问题,准确性可能不是代表模型的最佳度量;这是常有的事。有很多指标可以更好地代表我们的数据,比如精度、召回率、F1、日志丢失等等。
例如,我们创建了一个预测贷款违约的模型。在商业案例中,我们不会仅仅根据准确性来衡量模型的成功,但是我们会首先考虑什么是最重要的。预测违约案例是否更重要?从这里,我们挑选最好使用的指标。
3.采摘樱桃
不要:选择数据子集来支持你的假设。
你进行了适当的研究,分析了你的数据,然后发现我们之前的说法是错误的。然后你会想,“选择我认为对我的假设有利的数据会不会更好?."如果你有这种感觉,并且只选择支持你的主张的数据,那么这是一件错误的事情。
做:让数据说话。
让数据告诉你他们有什么样的模式,然后从那里开始工作。有时很难接受我们的数据没有解释我们想要的东西,但是如果你只是选择你想看的数据,那么这将导致灾难性的决策。
也适用于机器学习案例。是的,选择数据的子集可能会提高准确性,但是要小心,因为不是所有的情况都可以用您的数据来表示。例如,当您删除数据中 25 岁以下的人时,准确性提高了 25%。它可能看起来不错,但是你的模型不能代表任何 25 岁以下的人。
4.因果关系存在
不要:没有经过适当的分析就假设相关性意味着因果关系
我们有了数据,然后进行相关分析。从分析中可以看出,两个变量之间有很强的线性相关性。这里你认为关系的发生是因为一个变量导致另一个变量出现,反之亦然。虽然它可能是正确的,但作为数据科学家,你首先需要有自己的怀疑,因为大多数时候,相关性并不意味着因果关系。很多时候,事情都是因为机缘而相关联的。
做:找到支持因果关系假设的证据。
它需要比“皮尔逊”相关或“斯皮尔曼”相关更多的证据。写出适当的研究方法,阅读大量文献来寻找证据。
5.统计假设
不要:在不知道假设的情况下使用统计或机器学习模型
我多次看到有抱负的数据科学家应用统计方法(例如,t 检验、方差分析、皮尔逊相关等。)或机器学习模型(线性回归、随机森林、Boosting 等。)而在使用它们之前不知道假设是什么。虽然它仍然可以使用,但违反这一假设的代价将是一个不太可靠的结果;意味着统计分析或机器学习模型会产生误导。
Do :读取假设,但不要强迫数据遵循这个假设。
如果你想要一个可信的结果,你需要遵循这个假设。举个例子;独立 t 检验要求数据服从正态分布、独立且同质异方差。违反其中一个假设将意味着结果不太可靠。在这种情况下,您可能会想让数据符合假设,但这也是不可取的。虽然您可以尝试将数据转换为正态分布(这是大多数情况下发生的情况),但原始模式将会消失。如果您可以尝试另一种方法,即数据可以满足假设,而无需进行任何转换或挑选,那就更好了。
结论
在这里,我向您展示了作为一名数据科学家,我个人应该做和不应该做的五件事情,虽然其他人可能会认为还有许多其他事情更重要,但对我来说,作为一名数据科学家,这五件事情需要记住。
如果您喜欢我的内容,并希望获得更多关于数据或数据科学家日常生活的深入知识,请考虑在此订阅我的简讯。
如果您没有订阅为中等会员,请考虑通过我的介绍订阅。
定制熊猫图和图表的 5 种简单方法
Pandas 为您提供了一种简单而又吸引人的方式来从您的数据中制作图表。但是有时候你想要一些不同的东西。这里有一些建议

也许你是一名正在整理新故事的数据记者,或者是一名正在准备论文或演示的数据科学家。你已经有了一套漂亮的图表,看起来不错,但稍加调整会有所帮助。也许你想给他们所有的头衔。也许有些会用网格来改善,或者刻度在错误的位置或者太小而不容易阅读。
您知道如何制作折线图、条形图、散点图等,但并不精通 Pandas plot 函数的所有细节(如果看不到下面的链接)。
如果您是一名初露头角的数据科学家或数据记者,能够可视化您的数据会让您有能力…
medium.com](https://medium.com/codefile/plotting-with-pandas-an-introduction-to-data-visualization-8bd7c0831650)
你不必坚持你被给予的东西。有相当多的参数允许你改变你的图表的各个方面。你可以改变标签,添加网格,改变颜色等等。
使用底层的 matplotlib 库,你可以改变你的绘图的方方面面,这可能会变得复杂。然而,我们将看看一些我们可以用熊猫做的更简单的事情。
在我们开始之前,您需要导入适当的库并获取一些数据。
让我们从导入运行示例所需的所有库开始
# The first line is only required if you are using a Jupyter Notebook
%matplotlib inline import numpy as npimport pandas as pdimport matplotlib.pyplot as plt
这都是非常标准的东西,我以前的文章应该很熟悉。不过有一点需要注意的是第一行——如果你像我一样使用 Jupyter 笔记本,那么你可能需要包括这一行。如果你正在使用一个普通的 Python 程序,或者 Python 控制台,那么你应该而不是包括它。
获取一些数据
您需要一些数据来处理,所以我们将使用与之前相同的数据集:2008 年英国伦敦的天气数据。
像这样加载数据:
weather = pd.read_csv(‘https://raw.githubusercontent.com/alanjones2/dataviz/master/london2018.csv')print(weather[:2])Year Month Tmax Tmin Rain Sun
0 2018 1 9.7 3.8 58.0 46.5
1 2018 2 6.7 0.6 29.0 92.0
print 语句打印出表的前几行,代表一月和二月。你可以看到有四个数据(除了年份和月份), Tmax 是该月的最高温度, Tmin 是最低温度, Rain 是以毫米为单位的降雨量, Sun 是该月的日照总时数。
所以让我们画一个简单的图表,展示一年中最高温度的变化
weather.plot(x=’Month’, y=’Tmax’)plt.show()

这是默认图表,完全可以接受。但是我们可以改变一些事情让它变得更好。
1.改变尺寸和颜色
你可能想做的第一件事就是改变尺寸。为此,我们添加了 figsize 参数,并赋予其尺寸 x 和 y (以英寸为单位)。这些值由一个元组给出,如下所示。
为了改变颜色,我们设置了颜色参数。最简单的方法是使用一个代表有效网页颜色的字符串,如“红色”、“黑色”或“蓝绿色”。(注:你可以在维基百科找到网页颜色列表。)
weather.plot(x='Month', y='Tmax', figsize=(8,5), color='Red')plt.show()

2.设置标题
对于一篇文章、一篇论文或一个演示文稿,你很可能想要为你的图表设置一个标题。正如您可能已经收集到的,这主要是知道什么是正确的参数并正确地设置它们。设置标题的参数是标题。当然啦!代码如下:
weather.plot(x=’Month’, y=’Tmax’, title=”Maximum temperatures”)plt.show()

3.显示网格
虽然默认图表很好,但有时您希望观众更容易看到图表中的某些值。在绘图上绘制网格线会有所帮助。
要绘制网格,只需将网格参数设置为真。熊猫默认假。
weather.plot(x=’Month’, y=’Tmax’, grid=True)plt.show()

4.改变传奇
图例以代表 y 轴的列名给出。如果这不是一个可接受的描述性名称,您可以更改它。或者,事实上,你可以完全消除它!
如果我们想要移除它,我们将参数图例设置为假。如果我们想改变标签,我们结合标签参数,并将其设置为我们想要显示的字符串。
weather.plot(x=’Month’, y=’Tmax’, legend=False)plt.show()

weather.plot(x=’Month’, y=’Tmax’, label=’Max Temp’)plt.show()

5.自定义刻度
刻度是在 x 和 y 轴上的刻度。你可以看到,在我们的图表上,它们在 y 轴上被标注为 10 到 25,在 y 轴上被标注为 2 到 12。鉴于底部的集合应该代表月份,如果它们从 1 到 12 会更好。我们可以用元组来设置刻度标签。如果我们想显示所有的十二个月,我们可以将参数 xticks 设置为(1,2,3,4,5,6,7,8,9,10,11,12)。你可以用 yticks 参数做类似的事情。看一下这段代码:
weather.plot(x=’Month’, y=’Tmax’, xticks=range(1,13), yticks=(0,10,20,30))plt.show()

如您所见,我已经显式设置了两组刻度。 y 刻度现在从 0 开始,以十为单位增加到 30, x 刻度每月显示一次。但是我在这里有点偷偷摸摸,没有使用我在上面展示的元组,而是使用 Python range 函数来生成一个从 1 到 12 的列表(少打字!).
如果您想完全删除这些记号,只需将其中一个参数设置为空元组即可,例如 xticks=()。
weather.plot(x=’Month’, y=’Tmax’, xticks=())plt.show()

如果你想更强调记号,你可以改变字体大小。在下面的例子中,你可以看到如何。
plot = weather.plot(x=’Month’, y=’Tmax’, xticks=range(1,13), fontsize=18)plt.show()

可能会变得很乱
我的意思是你的代码可能会变得混乱。如果你想设置刻度、标题、标签、网格等等,该怎么办呢?首先,做这个情节的代码行会很长,其次,如果你有几个情节让你发现自己在重复它。
这里有一个解决方案。
假设您希望所有的图看起来都一样。您要做的是定义一个字典,其中包含您想要应用于所有图表的所有参数,如下所示:
plot_kwargs={‘xticks’:range(1,13),
‘yticks’:(0,10,20,30),
‘grid’:True,
‘fontsize’:12}
然后,您可以利用 Python 的**操作符,而不是显式地输入所有的参数,该操作符会将一个字典扩展为一个关键字参数列表。我将变量 plot_kwargs 称为 kwargs 是包含关键字参数的变量的常规名称(这就是它们是什么)。
像这样使用它们:
weather.plot(y=’Tmax’,x=’Month’, **plot_kwargs)plt.show()

现在,您也可以对其他图使用相同的字典,例如:
weather.plot.scatter(y=’Tmax’,x=’Month’, legend=True, label=”Min Temperature”, **plot_kwargs)plt.show()

在这里,我使用了 plot_kwargs 参数来设置默认参数,但是为单独的图显式地设置这些参数。
好了
嗯,不。不是真的。使用 Pandas 和 matplotlib,您可以做很多事情来定制您的地块。您也可以在将图保存到文件时进行更改。一篇文章涵盖的内容实在太多了。
谢谢,看到了文章的结尾,希望你觉得有用。
关于格式的快速附言。所有的代码都很短,但是有些行有点长,而且是换行的——所以我在每一行后面都加了一个空行,这样你就可以看到应该在一行上的内容。文章末尾的字典分配中唯一的例外,看起来不错。
如果您是一名初露头角的数据科学家或数据记者,能够可视化您的数据会让您有能力…
medium.com](https://medium.com/codefile/plotting-with-pandas-an-introduction-to-data-visualization-8bd7c0831650)
5 优雅的 Python 熊猫函数

图片来源:Pixabay &谷歌照片
五只美丽的熊猫为日常数据科学的使用发挥作用
在机器学习和数据科学项目的日常数据处理中,Pandas 是使用最多的 Python 库之一。像 Numpy 一样,Pandas 用许多优雅构建的函数统治着数据科学、机器学习和人工编程领域,这些函数为每个从业者的武器库增添了力量。在这里,我重申一些优雅的功能,这些功能使 Pandas 成为数据科学家和机器学习工程师的首选库。
(1)换档()
假设您遇到了这样一种情况,您需要移动数据帧中的所有行,或者需要使用数据帧中前一天的股票价格。也许我们想在数据集中构建最近三天的平均温度;Shift()将是实现所有这些目标的理想方式。
Pandas Shift()函数,将指数移动所需的周期数。该函数采用一个称为周期的标量参数,它代表所需轴的移动次数。这个函数在处理时间序列数据时很有用。我们可以使用 fill_value 来填充超出边界的值。
import pandas as pd
import numpy as npdf = pd.DataFrame({'DATE': [1, 2, 3, 4, 5],
'VOLUME': [100, 200, 300,400,500],
'PRICE': [214, 234, 253,272,291]})print(df)
DATE VOLUME PRICE
0 1 100 214
1 2 200 234
2 3 300 253
3 4 400 272
4 5 500 291df.shift(1)DATE VOLUME PRICE
0 NaN NaN NaN
1 1.0 100.0 214.0
2 2.0 200.0 234.0
3 3.0 300.0 253.0
4 4.0 400.0 272.0# with fill_Value = 0df.shift(1,fill_value=0)DATE VOLUME PRICE
0 0 0 0
1 1 100 214
2 2 200 234
3 3 300 253
4 4 400 272

现在,如果我们需要将前一天的股票价格作为一个新列,我们可以使用如下的 shift。
df['PREV_DAY_PRICE'] = df['PRICE'].shift(1,fill_value=0)
print(df)DATE VOLUME PRICE PREV_DAY_PRICE
0 1 100 214 0
1 2 200 234 214
2 3 300 253 234
3 4 400 272 253
4 5 500 291 272
我们可以很容易地计算出最近三天的平均股价如下,并创建一个新的功能栏。
df['LAST_3_DAYS_AVE_PRICE'] = (df['PRICE'].shift(1,fill_value=0) +
df['PRICE'].shift(2,fill_value=0) +
df['PRICE'].shift(3,fill_value=0))/3
现在数据帧会变成
DATE VOLUME PRICE LAST_3_DAYS_AVE_PRICE
0 1 100 214 0.000000
1 2 200 234 71.333333
2 3 300 253 149.333333
3 4 400 272 233.666667
4 5 500 291 253.000000
我们也可以向前移动,从下一个时间步或下一行获取值。
df['TOMORROW_PRICE'] = df['PRICE'].shift(-1,fill_value=0)
现在数据帧应该是:
DATE VOLUME PRICE TOMORROW_PRICE
0 1 100 214 234
1 2 200 234 253
2 3 300 253 272
3 4 400 272 291
4 5 500 291 0
有关选项和其他设置的更多详细信息,请参考 Pandas 文档。
(2)值计数()
函数的作用是:返回包含唯一值的计数的对象。生成的对象可以按降序或升序排序,通过参数控制包括 NA 或排除 NA。请参考带有图示视图的 w 示例。该功能可用于 index 或 pandas 系列。

a = pd.Index([3,3,4,2,1,3, 1, 2, 3, 4, np.nan,4,6,7])
a.value_counts()#Output
3.0 4
4.0 3
1.0 2
2.0 2
7.0 1
6.0 1
dtype: int64
下面是这个系列的一个例子。
#Inb = pd.Series(['ab','bc','cd',1,'cd','cd','bc','ab','bc',1,2,3,2,3,np.nan,1,np.nan])
b.value_counts()#Outbc 3
cd 3
1 3
3 2
ab 2
2 2
dtype: int64
可以使用 Bin 选项,而不是计算值的唯一幻影,将索引划分到指定数量的半开 bin 中。
#Ina = pd.Index([3,3,4,2,1,3, 1, 2, 3, 4, np.nan,4,6,7])
a.value_counts(bins=4)#Out(2.5, 4.0] 7
(0.993, 2.5] 4
(5.5, 7.0] 2
(4.0, 5.5] 0
dtype: int64
关于选项和其他设置的更多细节,请参考熊猫文档。
(3)面具()
mask 方法是对系列或数据帧的每个元素应用 if-then 条件。如果 Cond 为 True,则它使用 Other 中的值(默认值为 NaN ),否则将保留原始值。这个 mask()方法与 where()非常相似。

参考下面的数据帧,我们要改变所有被 2 整除但没有余数的元素的符号。

这可以通过 mask 函数轻松实现。
df = pd.DataFrame(np.arange(15).reshape(-1, 3), columns=['A', 'B','C'])
print(df)#Out
A B C
0 0 1 2
1 3 4 5
2 6 7 8
3 9 10 11
4 12 13 14#mask operation to check if element is divided by 2 without any remainder. If match change the sign of the element as originaldf.mask(df % 2 == 0,-df)#OutA B C
0 0 1 -2
1 3 -4 5
2 -6 7 -8
3 9 -10 11
4 -12 13 -14
有关选项和其他设置的更多详细信息,请参考 Pandas 文档。
(4) nlargest()
在许多情况下,我们会遇到这样的情况,我们需要找到某个系列或数据帧的前 3 名或后 5 名值(比如表现最好的 3 名学生的总分,或者在选举中获得总票数的 3 名垫底候选人)。
熊猫 nlargest()和 nsmallest()是这类数据处理需求的最佳答案。
下面的例子显示了 10 次观测的数据帧中的三个最大高度。

import pandas as pd
import numpy as npdf = pd.DataFrame({'HEIGHT': [170,78,99,160,160,130,155,70,70,20],
'WEIGHT': [50,60,70,80,90,90,90,50,60,70]},
index=['A','B','C','D','E','F','G','H','I','J'])print(df)HEIGHT WEIGHT
A 170 50
B 78 60
C 99 70
D 160 80
E 160 90
F 130 90
G 155 90
H 70 50
I 70 60
J 20 70dfl = df.nlargest(3,'HEIGHT')
print(dfl)HEIGHT WEIGHT
A 170 50
D 160 80
E 160 90
如果出现平局,那么使用、、【第一】、【最后】、【所有】、、(默认为“第一”)解决的选项很少。保留所有事件。我们将尝试在下面的例子中找到两个最大的高度。

dfl **=** df.nlargest(2,'HEIGHT',keep**=**'all')
print(dfl)HEIGHT WEIGHT
A 170 50
D 160 80
E 160 90
保留最后一次出现。
dfl **=** df.nlargest(2,'HEIGHT',keep**=**'last')
print(dfl)HEIGHT WEIGHT
A 170 50
E 160 90
保留第一个事件。
dfl **=** df.nlargest(2,'HEIGHT',keep**=**'first')
print(dfl)HEIGHT WEIGHT
A 170 50
D 160 80
有关选项和其他设置的更多详细信息,请参考 Pandas 文档。
5)n 最小()
nsmallest()也类似地工作,但是考虑的是习语最小滤波器。参考下面的例子,我们现在使用权重来寻找两个最小的权重。
import pandas as pd
import numpy as npdf = pd.DataFrame({'HEIGHT': [170,78,99,160,160,130,155,70,70,20],
'WEIGHT': [50,60,70,80,90,90,90,50,60,70]},
index=['A','B','C','D','E','F','G','H','I','J'])print(df)HEIGHT WEIGHT
A 170 50
B 78 60
C 99 70
D 160 80
E 160 90
F 130 90
G 155 90
H 70 50
I 70 60
J 20 70dfs = df.nsmallest(3,'WEIGHT')
print(dfs)HEIGHT WEIGHT
A 170 50
H 70 50
B 78 60
有关选项和其他设置的更多详细信息,请参考 Pandas 文档。
最后注意:
这是熊猫的五个功能,不仅优雅而且富有表现力。在我看来,只要有类似的情况,我们就应该使用它们,因为它们不仅提供了更少的代码,而且是实现复杂问题解决方案的一种聪明方式。
感谢阅读。可以联系我@ LinkedIn 。
每月只需 5 美元,就可以无限制地获取最鼓舞人心的内容……点击下面的链接,成为 Medium 会员,支持我的写作。谢谢大家! https://baijayanta.medium.com/membership
你可能也会喜欢我的另一篇关于熊猫的文章。
数据科学变得容易:熊猫的几个令人愉快的使用例子
towardsdatascience.com](/alluring-python-pandas-834fe1656a34)
你现在应该关注的 5 个工程博客
大型科技公司的伟大经验

来自 Pexels 的 Leah Kelley 摄影
科技世界发展迅速,没有人愿意落在后面。在软件和数据领域,我们需要关注所有新的库和框架。我们,软件工程师,想要接近最先进的技术。幸运的是,有经验的、有能力的工程师愿意回馈社会。
一份知识分享就是一份知识收获。大型科技公司知道如何处理各种技术问题。这些范围从软件开发、数据库架构到用户体验优化,甚至如何创建无缝应用程序。分享这些技巧和诀窍的人给了我们在类似情况下的最佳实践。
我想和你分享我最喜欢的 5 个工程博客,排名不分先后。自从我职业生涯开始以来,我就一直遵循这些原则。他们的文章在完善我的技能的同时,给了我很大的见解和宝贵的经验。
优步工程
这种乘车共享独角兽的平台必须跟上每分钟数百万次的事件。他们的基础设施可以处理实时请求,并执行轨迹优化,为司机找到理想的路线。正如在他们的技术堆栈介绍中所说,优步的挑战来自于他们的特殊性。应用程序必须实时处理物理运输。
推动世界发展的软件工程和技术
eng.uber.com](https://eng.uber.com/)
在优步服务的世界里,每个人要么会动(司机、骑手),要么依赖会动的东西(吃东西的人)。这就形成了一个快速行驶的平台。用户每分钟都检查他们的进度。每个人都希望他们的服务能尽快送达。这给优步的工程师留下了两个优先事项:可用性和可伸缩性。

优步工程博客包含各种各样的主题。人工智能、移动架构和数据。这是一个活跃的博客,它的新文章经常发表。我喜欢他们帖子中关于他们如何解决特定技术问题的细节,或者对他们内部工具的微妙介绍。看看这些努力,我们可以看到一个年轻热情的科技公司如何接近科技巨头规模的障碍。
糟糕的数据无法做出好的商业决策。在优步,我们使用汇总和匿名数据来指导…
eng.uber.com](https://eng.uber.com/monitoring-data-quality-at-scale/)
网飞科技博客
这项流媒体服务必须面对大量的技术问题。它的应用为用户提供了视觉体验。工程团队必须向观众提供流畅、不间断的剧集。没有人希望他们的电影在迷人的场景中受到干扰。用户想要的只是在他们和他们的“网飞和寒冷”夜晚之间的一到两次点击。这种需求确实给网飞的技术建筑师们增加了一些负担。

除了庞大的电影数据库,网飞还拥有用户的电影行为。由此而来的是重新培养其忠实客户的秘密武器:电影推荐。基于个性化的偏好,流媒体服务可以推荐你甚至不知道你会喜欢但你肯定会喜欢的电影。这背后的魔法是机器学习模型,它会持续关注你在网飞平台上挑选的每一部电影。
了解网飞世界一流的工程成果、公司文化、产品开发等。
netflixtechblog.com](https://netflixtechblog.com)
可伸缩性是不可否认的。推出由基于观看行为的预测模型支持的 4K 流媒体服务可不是闹着玩的。当我们开始玩的时候,没有系统错误是可以容忍的。在他们的博客中,我们有从公司成立之初直到今天的网飞时代学到的那些经验教训。我们可以观察来自真实业务运营的真实情况,也可以观察创业独角兽。
博客包含关于网络、数据库管理、机器学习技术的文章。这些都是关于如何扩展实时服务和完美用户体验交付背后的实践的伟大见解。这个博客仍然是我最喜欢的数字知识来源之一。不仅因为我是个电影迷,还因为它强大的工程文化和独特的技术。
Airbnb 工程&数据科学
共享经济的繁荣向世界展示了许多颠覆性的创新,其中 Airbnb 是最早和最成功的一个。这家家庭共享平台成立于 2008 年,其峰值估值为310 亿美元。
创意工程师和数据科学家构建一个你可以属于任何地方的世界。http://airbnb.io
medium.com](https://medium.com/airbnb-engineering)
作为一个家庭共享平台,Airbnb 的基础设施必须确保房东和房客之间顺利透明的交易。如果没有开发和部署科技界最可靠系统之一的工程团队,他们将无法做到这一点。
我尤其钦佩 Airbnb 的工程师操作他们庞大数据库的方式。每天都有大量的房源进出。这些修改必须毫不延迟地反映在他们的平台上。和大多数其他科技公司一样,Airbnb 的工程师必须在可用性和可扩展性方面做功课。
Airbnb 的工程文化以开放著称。他们构建自己的内部技术工具,除此之外,他们还为有需要的人开源这些工具。气流是在数据工程师中流行的工具之一。直观的工作流管理应用程序非常适合数据工程领域:数据管道调度程序、可配置的 ETL、链接操作等。
马克西姆·博彻明
medium.com](https://medium.com/airbnb-engineering/airflow-a-workflow-management-platform-46318b977fd8)
除了数据之外,Airbnb 工程和数据科学还提供了大量其他世界顶级的学科。人工智能和机器学习,网络,移动应用,基础设施。我喜欢阅读他们的作品,直到今天,因为我总是觉得他们很有见地。
推特
根据他们 2019 年第三季度的报告,社交媒体平台拥有超过1.45 亿日活跃用户。在我写这篇文章的时候,平均每秒钟有 9000 条推文被发送,这几乎是每天 8 亿条推文。所有这些事件和交互都被压缩在一个完美运行的应用程序中。
Twitter 工程团队关于我们的工具、技术和服务的信息。
blog.twitter.com](https://blog.twitter.com/engineering/en_us.html)
我不时会津津乐道 Twitter 工程师们讲述他们如何克服技术障碍的每一个故事。我喜欢每一个社交媒体都有自己要解决的问题,并且与其他技术平台不同。在 2017 年的一篇文章中,基础设施和运营副总裁 Mazdak Hashemi 解释了 Twitter 有效性背后的可扩展性。他们有 36%的硬件分配专用于集群管理系统。这意味着他们非常重视高可伸缩性应用程序部署。

你的每一条转发,每一条评论,背后都有一个工程师来确保没有网络故障,没有超时请求,没有服务中断。Twitter 的工程师可能没有花哨的机器学习算法或不真实的数据量。他们默默无闻地工作,让庞大的用户群每天不间断地调用数十亿次交互。
我不像名单上的其他人那样花太多时间研究 Twitter 的工程故事,但这并不意味着它们不值得一读。凭借每篇文章的深刻和卓越,Twitter 始终不辜负其作为一家大型科技公司的技术专长。
Criteo R & D 博客
这家法国广告科技巨头在 Toucan Toco 创建的“2019 年最活跃的法国科技博客”名单中名列第一。总部设在巴黎,拥有大约 1000 名工程师(我是其中之一)。他们的研发部门因其最优秀的工程师和开放的文化而闻名国内。
R&D 团队的科技故事
medium.com](https://medium.com/criteo-labs)
Criteo 工程团队拥有欧洲最大的 Hadoop 集群,他们知道如何处理数据和基础设施。尽管团队规模很小,但工程作品的质量与谷歌或脸书等科技巨头相比毫不逊色。
在广告技术领域,短时间内的交易数量是巨大的。我们每秒都有显示、点击、销售信息。在信息流上构建实时数据管道是每个数据工程师的噩梦。但是 Criteo 的工程师们设法做到了,而且做得很好。
Criteo 的工程不全是关于数据的。我们也有关于他们如何建立可靠的内部基础设施的故事,他们如何训练他们的机器学习模型来优化广告活动的表现。我也对他们回馈社区的水平印象深刻。这反映在发表的研究论文数量、会议出席和演示、开源项目上。
Criteo AI 实验室是计算广告领域的先锋创新。看看人工智能背后的团队…
medium.com](https://medium.com/criteo-labs/an-insight-into-the-criteo-ai-lab-ac2496afc37c)
我不推广我自己公司的博客,因为我在那里工作。甚至在我加入这个团队之前,我就已经从那些博客帖子中获得了灵感。我喜欢学习经营一家科技公司的每一个技术方面。他们的专业技能、知识甚至幽默是我为什么总是喜欢在周六早上听同事写的故事的原因。
结论
知识就是分享,而不是独享。作为一名工程师,我的职责之一就是像以前一样回馈社区和有抱负的学习者。我希望这些技术博客能像对我一样激励你。直到那时,快乐学习!
我的名字叫 Nam Nguyen,我写的主要是关于大数据的文章。享受你的阅读?请在 Medium 和 Twitter 上关注我,了解更多更新。
简化数据操作的 5 个熊猫小贴士
用这些简单有效的熊猫技巧让你的科学课有个好的开始!

介绍
Python 的 andas 是一款无需介绍的软件。无论您是第一次接触 Python 数据科学,还是已经在这个领域工作了很长时间,您都可能听说过 Pandas Python 模块。该库在业界被广泛用于数据操作,并且是任何想要使用数据框和 Numpy 的有抱负的数据科学家的首选工具。许多数据科学家每天都在使用 Pandas,它被广泛认为是使用 Python 操作数据的重要工具。
虽然 Pandas 相当容易使用,并且有许多简单的方法可供使用,但是 Pandas 有许多部分,其中一些大部分时间都被完全忽略了。熊猫是一种复杂的动物,可能需要几个月,甚至几年才能适应它的绝对最高水平。也就是说,熊猫声称有一些基本属性可以在目前大多数情况下有效使用。
条件掩蔽
一个最有可能使 Pandas 超越其竞争对手和字典类型本身的属性是条件屏蔽。条件屏蔽允许用户使用简单的条件语句过滤掉不符合要求的值。这是令人难以置信的方便,是目前 Julia 或 R 中可用的联盟以上。然而以 Julia 为例,我们需要使用过滤器!为了管理我们的数据,Pandas 通过使用所谓的条件掩码使过滤数据变得非常容易。
条件掩码迭代遍历数据帧中的所有数据,并将数据与预设条件进行比较。返回的将是遵循掩码中设置的条件的过滤后的数据帧。
import pandas as pd
df = pd.DataFrame({"NA": [0,1,0,1,0,1], "Label": ["TN", "GA", "TN", "MN", "CA","CA"]})

ones_only = df["NA"] == 1

着色
有时数据可能很难读取。对于数据科学家来说,这可能没什么大不了的,但通常需要呈现数据并使其更易读。Pandas 使得改变数据框中不同值的颜色变得相当容易。让我们考虑一个例子,我们想要显示哪些值低于某个阈值,哪些值低于该阈值。
df = pd.DataFrame({"Store ID": [1,8,7,4,11,2], "Income": [-12, 56, -2, 23, 7, 16]})

首先,我们需要写一个小函数来根据我们的条件给我们的值着色。在本例中,我们将负值映射为红色,以显示每个商店的亏损与其他商店的盈利。
def negatives(input):color = 'red' if input < 0 else 'black'return 'color: %s' % color
这就是所谓的风格图。样式地图是 Pandas 用来确定数据框应如何呈现的功能。我们可以用df.style.applymap().应用一个样式图
df.style.applymap(negatives)

请注意,我们的数据框的样式确实发生了变化。Pandas 数据框使用级联样式表进行样式设计,因此实际上非常容易修改。可以使用df.style.set_table_styles.应用新的样式表
汇总和交叉列表
当试图探索和理解大型数据集时,在许多情况下可能有用的一件事是获得某些列的总计数,我们可以使用 lambda 应用它。
df = pd.DataFrame({"Group A": [7,9,11,12,16], "Group B": [12,14, 3, 7, 2]})

df['total'] = df.apply(lambda x: x.sum(), axis=1)

同样,我们可以使用交叉列表来实现本质上相同的目标。交叉列表用于计算列中的频率,然而,上面的方法提供了列的总和。
cross = pd.crosstab(index = df["Group A"], columns = df["Group B"])

配置
关于熊猫的另一个很酷的事情是它是高度可配置和动态的。Pandas 允许在运行时创建各种各样的“配置文件”,这些文件可以用来改变环境变量,以确定它如何工作。这在许多不同的情况下都很有用。例如,考虑这种显示配置:
def load_config():options = {'display': {'max_columns': None,'max_colwidth': 25,'expand_frame_repr': False,'max_rows': 14,'max_seq_items': 50,'precision': 4,'show_dimensions': False},'mode': {'chained_assignment': None}}for category, option in options.items():for op, value in option.items():pd.set_option(f'{category}.{op}', value)
这当然是通过 set_option 方法来完成的,该方法将类别名和相应的值作为参数。
访问者
Series 类型必须提供的一个重要特性是使用访问器的能力。在最新版本的 Pandas 中有四种类型的访问器。
str地图到StringMethods。.dt地图到CombinedDatetimelikeProperties。.cat到CategoricalAccessor的路线。
这些都是使用缓存附件连接到 Series 类的独立类。他们都有自己独特的方法,有时非常有用。考虑下面的例子:
locations = pd.Series(['Cleveland, TN 37311','Brooklyn, NY 11211-1755','East Moline, IL 61275','Pittsburgh, PA 15211'])
在这个例子中,我们想计算每个邮政编码中有多少个数字。我们可以这样使用字符串访问器:
locations.str.count(r'\d')

很酷,对吧?
结论
Pandas 是一个用 Python 处理数据的很好的库,它有很多非常有用的特性,使得数据操作比其他方式容易得多。从简单的访问器类和条件掩码,到简单的样式和完全动态的选项集,Pandas 是一个非常动态的库,可以用于不同操作的负载。这当然使熊猫很难与之竞争。很难证明在现代分析中使用任何其他软件是正确的,因为 Pandas 实在是太棒了!
你不知道的 5 个熊猫基本技巧
如何用熊猫处理大数据?了解“between”、“reindex”等函数。

Gif 来自 giphy 。
我用熊猫已经很多年了,每次我觉得我打字太多的时候,我就谷歌一下,我通常会发现一个新的熊猫技巧!我最近了解了这些功能,我认为它们很重要,因为它们很容易使用。
从提示和技巧,如何不指南到与大数据分析相关的提示,熊猫文章的精选列表。
medium.com](https://medium.com/@romanorac/pandas-data-analysis-series-b8cec5b38b22)
这里有几个你可能会感兴趣的链接:
- [Labeling and Data Engineering for Conversational AI and Analytics](https://www.humanfirst.ai/)- [Data Science for Business Leaders](https://imp.i115008.net/c/2402645/880006/11298) [Course]- [Intro to Machine Learning with PyTorch](https://imp.i115008.net/c/2402645/788201/11298) [Course]- [Become a Growth Product Manager](https://imp.i115008.net/c/2402645/803127/11298) [Course]- [Deep Learning (Adaptive Computation and ML series)](https://amzn.to/3ncTG7D) [Ebook]- [Free skill tests for Data Scientists & Machine Learning Engineers](https://aigents.co/skills)
上面的一些链接是附属链接,如果你通过它们进行购买,我会赚取佣金。请记住,我链接课程是因为它们的质量,而不是因为我从你的购买中获得的佣金。
1.函数之间

Gif 来自 Giphy
我在 SQL 中使用“between”函数已经很多年了,但是我最近才在 pandas 中发现它。
假设我们有一个包含价格的数据框架,我们想过滤 2 到 4 之间的价格。
df = pd.DataFrame({'price': [1.99, 3, 5, 0.5, 3.5, 5.5, 3.9]})
使用 between 函数,您可以减少这种过滤:
df[(df.price >= 2) & (df.price <= 4)]
对此:
df[df.price.between(2, 4)]

这可能看起来不多,但在编写许多过滤器时,这些括号很烦人。带有 between 函数的过滤器可读性也更好。
功能组之间的间隔在功能之间的左侧<= series <= right.
See pandas, documentation to learn more about 。
2.使用 reindex 函数修复行的顺序

Gif 来自 giphy
reindex 函数使系列或数据帧符合新的索引。当生成包含具有预定义顺序的列的报表时,我求助于 reindex 函数。
让我们将 T 恤衫的尺寸添加到我们的数据框架中。分析的目标是计算每个尺码的平均价格:
df = pd.DataFrame({'price': [1.99, 3, 5], 'size': ['medium', 'large', 'small']})df_avg = df.groupby('size').price.mean()
df_avg

上表中的尺寸随机排列。应该是这样排序的:小号,中号,大号。因为大小是字符串,所以我们不能使用 sort_values 函数。重新索引功能来拯救我们了:
df_avg.reindex(['small', 'medium', 'large'])

通过在 reindex 函数中指定大小的顺序,使得结果表更容易解释。
参见 pandas,文档以了解更多关于重新索引功能的信息。
3.描述类固醇

Gif 来自 Giphy
描述函数是进行探索性数据分析的基本工具。它显示数据帧中所有列的基本汇总统计信息。
df.price.describe()

如果我们想计算 10 个分位数而不是 3 个分位数呢?
df.price.describe(percentiles=np.arange(0, 1, 0.1))

描述函数采用百分位数参数。我们可以用 NumPy 的 arange 函数指定百分位数,以避免手工输入每个百分位数。
当与 group by 函数结合使用时,此功能变得非常有用:
df.groupby('size').describe(percentiles=np.arange(0, 1, 0.1))

看熊猫,文档了解更多关于描述功能。
4。使用正则表达式进行文本搜索

Gif 来自 Giphy
我们的 t 恤数据集有 3 个尺寸。假设我们想要过滤中小型尺寸。一种繁琐的过滤方式是:
df[(df['size'] == 'small') | (df['size'] == 'medium')]
这很糟糕,因为我们通常将它与其他过滤器结合在一起,这使得表达式不可读。有没有更好的办法?
pandas 字符串列有一个“str”访问器,它实现了许多简化字符串操作的功能。其中一个是“包含”函数,支持正则表达式搜索。
df[df['size'].str.contains('small|medium')]
具有“包含”功能的过滤器可读性更强,更易于扩展和与其他过滤器结合。
见熊猫,文档了解更多关于包含功能。
5.比熊猫的记忆数据集还要大

Gif 来自 giphy
熊猫甚至不能读取比主内存数据集更大的数据。它抛出一个内存错误或 Jupyter 内核崩溃。但是要处理一个大数据集,你不需要 Dask 或 Vaex。你只需要一些独创性。听起来好得难以置信?
如果您错过了我关于 Dask 和 Vaex 使用大于主内存数据集的文章:
你真的能在笔记本电脑上处理大于内存的数据集吗?Dask 比 Vaex 快吗?我做了一些基准测试,所以…
towardsdatascience.com](/dask-vs-vaex-for-big-data-38cb66728747)
进行分析时,通常不需要数据集中的所有行或所有列。
在一种情况下,您不需要所有行,您可以分块读取数据集并过滤不必要的行以减少内存使用:
iter_csv = pd.read_csv('dataset.csv', iterator=True, chunksize=1000)
df = pd.concat([chunk[chunk['field'] > constant] for chunk in iter_csv])
分块读取数据集比一次全部读取要慢。我建议只对大于内存的数据集使用这种方法。
在一种情况下,您不需要所有的列,您可以在读取数据集时使用“usecols”参数指定必需的列:
df = pd.read_csv('file.csv', u*secols=['col1', 'col2'])*
这两种方法的伟大之处在于,您可以将它们结合起来。
在你走之前
在 Twitter 上关注我,在那里我定期发布关于数据科学和机器学习的。

数据科学的 5 个基本 R 库
这里有一些非常有用的库,所以你可以充分利用 R 进行分析

数据科学和 R 是天造地设的一对,它们就像香槟和草莓、果冻和冰淇淋或可卡因和华夫饼干一样搭配在一起!
但是学习 R 和知道哪些库将增强您的数据科学技能可能会令人望而生畏。这里有五个库,它们将使你的分析体验更加愉快,并且对于掌握或达到你的数据科学职业生涯的下一步是必不可少的。呜!
Dplyr
Dplyr 是一个非常棒的、全功能的数据清理和辩论库,在这个领域非常有用并且广为人知。Dplyr 有许多内置函数,这些函数对于几乎任何分析任务都是非常有用和适用的!一些有用的功能包括:
选择 :某列数据。
筛选 :您的数据选择特定的行。
排列: 将您的数据行排列成一个顺序。
突变: 你的数据框要包含新的列。
总结: 以某种方式将你的数据大块化。
Ggplot2
任何值得一试的数据科学家都知道他们在 ggplot 周围的路。r 的第二个和更新的可视化库有惊人的多样性和个人修改的范围。Ggplot 可以生成任何东西,从简单的饼图到复杂的阴影堆叠条形图,再到预训练单词嵌入的三维表示。它真的是一流的东西,怎么宣传都不为过。
润滑剂
另一个非常有用的 R 库是 Lubridate,尤其是在现实生活中的应用场合。Lubridate 是一个很棒的库,用于整理和清理时间序列数据,并管理您正在使用的任何与时间相关的变量。使用这个库,您可以做任何您想做的关于日期算法的事情,尽管理解和使用可用的功能在这里可能有点复杂。看看吧!
针织工
这是给所有的学者和报告作者的。Knitr 是 r 的基本发布软件,它的目的是以各种格式生成可复制的报告。
这个包还支持将 R 代码集成到 LaTeX、Markdown、LyX、HTML、AsciiDoc 和 reStructuredText 文档中。您可以将 R 添加到 markdown 文档中,并轻松生成 HTML、Word 和其他格式的报告。如果您对研究和自动化从数据分析到报告创建的旅程感兴趣,这是一个必备工具。
quanteda . dictionary
这是给所有 NLP 的人的。Quanteda 包的一个扩展,这个扩展允许你利用大量的数据字典。从停用词到词典。这是一个很好的研究,可以进行快速简单的比较,或者以最简单的方式应用词典。我个人的最爱之一!
有趣的东西!
这些只是一些最常见的库,还有很多有用的 R 库,还有很多在生产中。
对我来说,重要的是我使用的库是稳定的,直到用新的发布和版本更新和修复。试图使用一个不太适合你的项目的遗留版本的库是令人心碎的。这里的图书馆
我希望您喜欢这些为您的数据科学项目而开发的真正顶尖和重要的 R 库!快乐分析!
艾伦。
使用 Apache Airflow 为 Redshift 上托管的数据库构建 ETL 管道的 5 个基本技巧
技术提示
初学者使用气流的最佳实践
介绍
Apache Airflow 是最好的工作流管理系统(WMS)之一,它为数据工程师提供了一个友好的平台来自动化、监控和维护他们复杂的数据管道。始于 2014 年的 Airbnb,后来成为一个拥有出色 UI 的开源项目,Airflow 已经成为开发者们的热门选择。对于不同层次的 Airflow 用户,有很多好的资源/教程。你可以从许多好的教程开始学习气流,例如这个逐步指南,或者这个系列,在这个系列中你还可以学习工作流管理系统的一般知识。对于已经熟悉气流的用户来说,这个资源可能会帮助你对气流的许多方面有非常深刻的理解。
在这篇文章中,我只想分享我在 AWS 上用 Airflow 创建数据仓库 ETL 管道的经验。希望有帮助。如果你在我的帖子里发现了什么错误,请纠正我。
注意事项
1.本文假设您已经掌握了一些数据仓库、AWS、特别是 Amazon Redshift、Apache Airflow、命令行环境和 Jupyter 笔记本的工作知识。
2.您有责任监控您使用的 AWS 帐户的使用费。每次完成工作时,请记住终止集群和其他相关资源。
3.这是优达城数据工程纳米学位评估项目之一。所以为了尊重 Udacity 荣誉代码,我不会在工作流中包含完整的笔记本来探索和构建项目的 ETL 管道。本教程的 Jupyter 笔记本版本的部分内容,以及其他数据科学教程可以在我的 github 上找到。
参考
- 一些材料来自 Udacity 上的数据工程纳米学位项目。
- 一些想法和问题是从 Knowledge-uda city 问答平台和学生中心-uda city 聊天平台收集的。感谢大家对我们的付出和巨大贡献。
项目介绍
项目目标
Sparkify 是一家致力于音乐流媒体应用的初创公司。通过 app,Sparkify 已经收集了关于用户活动和歌曲的信息,这些信息被存储为 JSON 日志的目录(log-data -用户活动)和 JSON 元数据文件的目录(song_data -歌曲信息)。这些数据位于 AWS 上的公共 S3 存储桶中。
这个项目将是一个工作流程,探索和建立一个 ETL(提取-转换-加载)管道:
- 从 S3 提取数据,并将它们暂存在 AWS 红移上作为暂存表(用户活动—
Stage_events表和歌曲数据—Stage_songs表)。 - 出于分析目的,将数据从临时表转换为一组事实表(
songplays)和维度表(包括artists, time, users, and songs表)。关于这些表格的更多细节可以在我的另一个相关项目中找到。 - 这种高级 ETL 管道必须是动态的,可以被监控,并允许在必要时容易回填。通过将 Apache 气流引入系统来满足这一要求。
下面是完整的有向无环图(DAG ),其中包含该项目使用的运算符。(如果您不知道 Dag 或运算符是什么,请在此处快速阅读气流概念的定义)。

有了这个帖子,我就不详细讨论这个项目是怎么一步一步做出来的了。相反,我只是向您介绍一些我在使用气流时遇到的重要提示和问题。我希望它能为您节省大量的时间和精力来处理您在构建工作流时可能遇到的许多奇怪的状态。
技巧 1:从最简单的 DAG 开始
您的 DAG,即以特定顺序定义任务的高级大纲,应该尽可能简单。这显然是编程中的最佳实践,但容易被遗忘。
为什么我们应该从简单的 DAG 开始?
下面是我的项目的最终 DAG 配置要求:
基本上,DAG 不依赖于过去的运行;start_date 是 2019 年 1 月 12 日;管道将被安排每小时运行一次。失败时,任务重试 3 次;每 5 分钟重试一次。
我太天真了,第一次尝试使用最终的 DAG 配置,结果在 Airflow UI 上触发 DAG 时不知所措。排队的人太多了。许多人,实际上更多的人,可能会在这些之后。

队列中的这些游程都是从哪里来的?
- 参数
start_date': datetime(2019, 1, 12),和schedule_interval = '@hourly将产生从 start _ date(2019 . 1 . 12)到现在(2020)的~ 600 days x 24 hourly backfill runs。 - 有了
'retries': 3,和'retry_delay': timedelta(minutes = 5),的说法:如果任务失败了——当然会失败,一个复杂的数据管道哪里会在第一次尝试就失败——需要重试 3 次,间隔 5 分钟。因此,在失败的情况下,除了大量运行(each scheduled run x 3 times of retries)之外,在此设置下,每次运行需要 3 x 5 分钟的等待时间,并进行重试。关于回填运行的次数,除了停止/杀死气流任务,你别无选择。 从 UI 中停止/杀死气流的任务很麻烦,所以最好不要碰到这个问题。 在某些情况下,尽管正在运行的 Dag 被删除,并且 Dag 被修改并再次触发,但它们仍可能重新启动并运行之前未完成的任务。
那么,一个简单的 DAG 是什么样子的呢?
在我的调试版本中,DAG 将在被触发('start_date': datetime.now())时立即运行,一次只运行一次(max_active_runs=1,))并且只运行一次(schedule_interval= None),没有任何失败重试(DAG 中的默认设置)。这个简单 DAG 将在任何任务失败时立即停止,这使我们能够轻松地调试我们的 DAG。
其他一些注释:
- 如果我将 start_date 保持为
start_date': datetime(2019, 1, 12),并且只运行 DAG 一次(schedule_interval= None),会发生什么:将会有 2 次运行:2019 年的回填运行和当前手动运行。由于我的 DAG 开发过程只需要运行 1 次,所以最好设置'start_date': datetime.now()。

- DAG 正在同时执行多个计划,后面的运行可能会同时发生和并彻底击败前面的运行。如果 DAG 包含一些繁重的任务,比如将一个巨大的表从 S3 复制到红移,那就不好了。要绕过这一点,您可以将
max_active_runs设置为 1。
技巧 2:如何从气流 UI 停止/杀死气流任务?
正如技巧 1 中提到的,停止/终止气流任务是相当棘手的。在 UI 上有一些停止/终止气流任务的方法。最适合我的方法如下:
步骤 1:关闭 DAG

第二步:删除所有运行
在气流菜单栏上,选择Browse -> DAG Runs -> Checkbox to select all the runs -> With Selected -> Delete

请注意,您必须先关闭 DAG,否则,您可能会看到白行者 和正在运行的活死人军团:即使您刚刚删除了所有 DAG 运行,执行程序也可能会继续计划并开始新的运行。
提示 3:“破损的 DAG”——这可能是由于 DAG 解析问题,而不是您的代码。
使用气流默认设置,当您更新关联的 python 文件时,应重新加载 Dag。有人提到过,webserver 运行时,默认每 30 秒刷新一次 Dag。当我们看到我们的狗“现在像雏菊一样新鲜”时,我们就可以走了:

我花了一整天的时间试图找出我的代码出了什么问题。我甚至重新加载了一个虚拟的 DAG——不会出错的 DAG,但仍然无法修复导致 DAG 损坏的错误:

事实证明,我的 DAG 没有任何问题,我只需要刷新工作区,就可以解决 DAG 解析带来的 webserver 问题。
总之,当出现 DAG 中断问题,并且您确定不是因为您的代码时,您可以尝试:
- 使用 DAG 主屏幕上的刷新按钮,可让您手动重新加载 DAG。
- 在命令行上键入
python -c "from airflow.models import DagBag; d = DagBag();"以手动刷新 Dag。 - 在命令行中键入
/opt/airflow/start.sh再次启动 Airflow webserver。 - 对于那些在 Udacity 上使用项目工作区的人来说,如果什么都不工作,就用菜单栏刷新工作区。

刷新工作区将会把你所有的文件复制到一个新的机器上,因此,每一个与文件解析相关的问题都可以得到解决。做完我的气流项目,不得不承认 **Refresh Workspace** 是我很多 **Broken DAG** 问题的终极解决方案。
关于调试损坏的 DAG 的说明
气流 UI 可能会通知您有一个损坏的 DAG,但是,它不会显示您的 DAG 的问题。可以通过使用python -c "from airflow.models import DagBag; d = DagBag();"手动重新加载 DAG 或使用命令行上的/opt/airflow/start.sh再次启动 Airflow 服务器来查看损坏的 DAG 中的详细问题。下面是对此的演示:

技巧 4:对于 AWS 的所有任务,使用 Jupyter 笔记本上的 IaC(基础设施代码)
AWS 资源可以通过AWS 控制台* 或 IaC(基础设施即代码) 进行设置和监控。我更喜欢 IaC 方法,因为它可以帮助开发人员轻松地自动化、维护、部署、复制和共享复杂的基础设施。AWS 上的 IaC 有 3 个选项:*
- AWS-CLI 脚本:类似于 bash 脚本。
- 亚马逊云的形成通过 JSON 描述了所有的资源、权限和约束。
- AWS SDK:更强大,可以与许多应用程序集成。Python 用户可以使用
boto3,一个 Python SDK ,以编程方式访问 AWS。
我们可以使用 IaC 来构建、启动 Amazon Redshift 集群,并打印出气流连接所需的所有配置信息,如host、schema、login_user、password等。,而无需在 AWS 控制台上点击和搜索。我发现它非常方便和省时,特别是当我们必须终止集群/清理资源,然后改天再创建、启动、配置集群以降低 AWS 成本时。
设置和清理 Amazon Redshift 和其他 AWS 资源的整个端到端过程,以及在 AWS 上使用 Airflow 创建简单数据仓库 ETL 管道的演示,可以在 my Github repository 中找到。
技巧 5:以编程方式设置气流连接
要使用 AWS 服务运行 Dag,您可以使用 Airflow 的 UI 来设置连接,例如配置您的 AWS 凭证、连接到 Redshift 等。

设置到 Amazon Redshift 的气流连接的步骤
但是,当服务器停止或刷新工作区时,这些连接可能会丢失。为避免不必要的失败,建议在运行 Dag 之前检查这些连接是否可用。
在 DAG 开发期间,一次又一次地手动重新设置这些气流连接是一个麻烦且容易出错的过程,因此我更喜欢以编程方式将气流连接设置为 python 脚本文件。必要时,您可以在命令行上运行该脚本。用于设置气流连接的简单 python 脚本如下:
一个好的做法是,在创建红移集群时(如技巧 4 中所述),您可以将所有 AWS 凭证和红移信息导出到一个. cfg 文件,然后使用 Python 包configparser获取必要的信息,而不是直接将它们放到脚本中。
非常感谢你阅读这篇文章。祝你的项目好运,我非常乐意回答任何问题和讨论。
《丘比特笔记本》,代号,。cfg 文件等。 对于这篇文章,连同其他数据科学教程可以在my Github上找到。**
科技公司以外的数据科学家工作的 5 个令人兴奋的行业
实时、物联网、计算机视觉、遗传学和大容量数据项目

由 Austin Distel 在 Unsplash 上拍摄
对于许多有抱负的数据科学家来说,梦想中的工作是在一家全球科技公司工作。
但是当你只关注科技行业时,你就排除了其他行业的大量酷工作。
我为许多不同的行业工作过,我不想错过我所获得的经验。在我以前的职位上,我从事化学工业的项目。我以前不知道这个行业,我很惊讶他们有多先进,以及我可以获得的许多见解,特别是与物联网技术的集成。
那么,换个行业找工作的理由是什么呢?
- 你从事激动人心的项目,这些项目与遗传学和物联网等其他技术相互关联
- 您需要处理来自机器、制造流程和可穿戴设备等不同来源的大量数据
- 你住在一个附近没有科技公司的地方
- 你只是不喜欢在科技行业工作
- 你已经有了另一个行业的背景,你想应用你的知识。此外,内部调动非常有吸引力,因为它会因为专业的行业知识而增加被雇佣的机会
接下来,我会给你五个行业,让你在科技行业之外找到令人兴奋的工作。我将为您提供该行业的简要概述,与科技行业相比的薪资水平,该行业的抗衰退能力如何,项目示例,以及该行业在数据科学家中需要什么技能。
生命科学和制药
行业
新冠肺炎迫使我们一直听到疫苗的发展。塑造了我们对这个行业的看法。但这只是整个行业的一部分。
事实是,这个行业很大,而且非常多样化,有许多子行业,如农业生物科学、诊断、治疗、制药、基因组学和蛋白质组学、兽医生命科学、化妆品、药品制造、医疗技术、分销和许多其他服务。
仅在制药领域,除了疫苗开发,我们还有其他领域,如抗体治疗、细胞治疗、仿制药、免疫疗法、蛋白质或干细胞。
开发新疗法的成本从现在的大约 10 亿美元开始,一直到两位数的 10 亿美元。该行业尽一切努力降低成本并使治疗更快可用。这推动了一个可与科技行业媲美的数据驱动型行业。所有全球参与者都在构建数据生态系统,将患者、医院和医生等服务提供商以及他们自己的数据联系在一起。
我建议你对不同的子行业进行一些研究。当你看到一个工作机会时,一定要先找到这个行业。
该行业的员工流动率通常很低,福利待遇也很好,薪水和科技公司一样高。
防衰退
是的,这个行业非常抗衰退。健康护理总是需要的,对人类以及宠物和动物都是如此。在像今天这样的时候,这个行业甚至得到了推动。
项目
你可以想象,可能的领域和项目的范围与分部门的数量一样广泛。一份详尽的项目清单会占据整页纸。所以,我把它限制在三个例子上。
精准医疗:医疗越来越基于患者的个体化、个性化特征。这些特征是疾病亚型、个人患者风险、健康预后以及分子和行为生物标记。生物标记是任何可测量的数据点,使得可以对患者进行分层,例如疾病严重程度评分、生活方式特征或基因组特性。基于所有这些数据,确定单个患者的最佳治疗。
一个真实的例子是一个卵巢癌患者,化疗无效。因此,有人进行了基因组测序,以寻找导致癌症的错放的核苷酸碱基。通过大数据分析,人们在人类的 30 亿个碱基对中发现了这种修改(这相当于哈利波特的《魔法石》的 7798 本书的字数)。这种改变是从肺癌中得知的,在肺癌中存在一种药物。使用了这种药物,病人康复了。
供应链优化:药品的生产需要时间,尤其是当今基于特定物质和生产方法的高科技疗法。此外,药物只能储存有限的时间,并且一些药物需要特殊储存,例如在冷藏室中。从在正确的时间获得正确的输入物质,到拥有足够的生产能力,以及最终为满足需求而储存适当数量的药物,整个计划是一个非常复杂的系统。这种情况不仅仅需要一种药物来控制。不,有成百上千个,每个都有其特定的条件。因此,生命科学公司开始用数据科学方法管理他们的整个供应链。
生物标志物扫描研究出版物:每天,全球多个研究团队都会发布数百篇关于所有不同疾病的生物标志物检测的科学出版物。对于生命科学公司来说,了解新检测到的生物标志物以将其应用到特定的研究领域来寻找新的治疗方法是至关重要的。研究非常昂贵且时间紧迫。通过了解当前的相关研究,他们可以避免重复研究,并加快上市时间。信息量如此之大,以至于无法手动完成。因此,开发了非常复杂的 NLP 算法来查找相关的出版物。除了了解这些生物标记相关的内容,还必须判断已发表结果的质量,以及它如何适合公司的研究——这是一项非常复杂的任务。
所需技能
除了数据科学知识之外,这份工作通常还需要科学背景。对于高级职位,需要有处理健康记录数据的经验。对于专门的主题,公司对匹配的技能非常挑剔。非常欢迎在复杂的科学或工程环境中工作的所有专业知识。有生物信息学知识者优先。特别是对于有科学背景,想进入数据科学领域的人来说,这个行业给了大量的机会。
实用程序
行业
公用事业行业提供基本的公共设施,如水、电或天然气。他们建造、拥有和维护相应的基础设施,如水力发电机、核电站、电网、控制站、水分配系统等。定义了供给。等式的另一边是消费者的需求,即必须满足的个人和公司的需求。
供需和基础设施维护之间的相互作用相当复杂,而且今天高度技术化和实时数据驱动。该行业正在快速进入物联网设备和所谓的智能计量,智能计量可以实时记录任何能源或水的消耗,并向公用事业公司和消费者提供详细信息。这被认为是进入智能电网的第一步。
这个行业在两种极端情况下运作:一方面,他们必须维护寿命从 35 年开始的资产,如饮用水分配系统的发电厂长达 100 年。另一边,电不能储存,需要实时管理。
公用事业是数据量最大的行业之一,因此,它们面临着使用这些数据的所有相关挑战。该行业目前也在进行技术转型,添加越来越多的传感器和物联网设备,从而产生更多可用的实时数据。
根据我的经验,工资比科技行业平均低 5-10%。
许多公用事业公司已经外包了他们的数据科学能力。因此,寻找专门服务于公用事业市场的中小型咨询公司。
防衰退
是的,这个行业非常抗衰退。水、电、动力总是需要的,与经济状态无关。
项目
从资产性能管理、断电和故障预测,到能源供应管理和客户分析,公用事业领域的许多领域都在使用数据科学。
漏水检测:在欧洲和美国,数万亿升饮用水从供水系统中泄漏。安装水传感器以检测渗漏仍处于开始阶段。管道的人工测量和攻丝是标准的,但效率不高,也不适用于整个地区。因此,基于特定位置的流量测量和终端消费者的水消耗数据,建立预测模型来定位潜在的水损失区域。
利用无人机进行预防性电网管理:仅在美国,电网就有长达 16 万英里的高压电力线和数百万英里的低压本地配电线路。监控所有线路的潜在风险,例如可能损坏线路的树木,几乎是不可能的任务。因此,商用无人机被用于沿线巡逻并记录邻近环境的视频。开发或改进计算机视觉算法是为了自动检测潜在风险。
用电量预测和动态定价:用电量预测是保证供应最重要的数字之一。记住,能量是不能储存的。所以,在实时情况下,必须保证供应。这是一个非常复杂的系统,从管理水力发电机的生产能力到通过输电线的配电,购买和销售电力,以及通过相应的定价制定在特定时间框架内使用更少或更多电力的激励措施。你必须管理重叠的长期和短期影响,几个季节,天气预报和短期波动。这是一个非常微妙的问题,不容易解决所有的数据量和短时间内对预测的结果作出反应。
所需技能
公用事业行业正在使用大量的数学模型,主要来自运筹学。因此,数据科学家应该有良好的数学和数学模型基础。你至少应该了解这个行业是如何运作的,以及如何处理大量数据,甚至是实时数据。
食品饮料行业
行业
食品和饮料行业包含各种各样的公司,从餐馆、咖啡店和快餐连锁店、食品和饮料运输服务、食品制造商,到雀巢、百事可乐、百威英博、JBS 等大型跨国公司。
我的建议主要是关于跨国公司的许多机会。他们有几个品牌,功能性食品和饮料,有时还有宠物食品。他们的生意不仅取决于消费者的行为,也取决于产品销售者的所有行为。
跨国公司的薪资水平与科技行业相当。当地公司支付的薪水要低得多。
防衰退
该行业在一定程度上不受经济衰退的影响。软饮料和酒精饮料,如葡萄酒和酒精饮料,在经济衰退期间都会下降。相比之下,大型酿酒商只面临轻微下跌。经济衰退期间,餐馆支出大幅下降,而杂货店支出保持稳定,折扣零售商可以增加销售额。
项目
情感分析和评论检测:如今,对产品的投诉首先在社交媒体平台上公开。像食品污染这样的严重事件会很快成为头条新闻。对于大公司来说,在全球范围内全天候实时监控他们所有的产品评论是非常重要的。当一个有影响力的评论被发现时,品牌需要迅速采取行动。需要分析潜在事件的背景,并采取相应的措施。
许多负面情绪不需要干预。另一方面是需要执行委员会立即关注的事件。在机器学习算法中找到正确的平衡是很棘手的。这是一个非常令人兴奋的领域,其中错误分类很重要。
准时生产和交付:软饮料饮料公司需要计划饮料需求,计算他们的生产计划和生产能力,以及他们对供应商的配料需求。除了季节性因素之外,还有天气、大小事件、消费趋势、价格战、经济形势、卖方购买力、生产时间和产能、保质期等因素。,必须考虑。物流需要提前安排,以确保饮料按时交付给卖家或活动餐饮。这也是一项重要的任务,需要高技能的数据科学团队。
质量保证:消费者期望产品的味道、一致性、质量和保质期全年一致,并且不受消费地点的影响。许多因素会影响生产结果,从配料的适当数量、质量、季节、生产国家和运输条件、储存和生产条件(如温度、压力、生产时间的差异等)开始。为每个生产批次找到正确的配料和生产参数模式,使产品始终相同,这是一项非常重要的数据科学任务。
所需技能
他们期望从回归到神经网络的深入的数据科学方法知识。当处理生产问题时,需要时间序列知识,以及客户分析领域的 NLP 经验。
工业品
行业
总的来说,可以说这个行业包含了所有不直接卖给消费者的生产、制造、设备和销售。分部门的例子有建筑、工业房屋、工业机器和工具、水泥和金属制造以及工业部件。全球知名公司的例子有通用电气、西门子、日立、3M、霍尼韦尔国际、博世、洛克希德·马丁或 ABB。在过去的几年里,这些公司不仅经历了自己的全面数字化转型,实现了完全自动化的制造,还拥有自己的平台,为客户和广泛的数据和技术团队提供服务。
行业有个特殊性,所谓“隐性冠军。”隐性冠军是指在全球市场上处于领先地位,但收入低于 50 亿美元的公司,它在公众中几乎不为人知。这些公司通常是高科技公司,是数字化和技术领域的思想领袖,通常都不知名。数据和 AI 是它们的驱动力。这是数据科学家的天堂。然而,找到这样一个隐藏的冠军并被录用并不是一件容易的事情。
薪资水平接近科技行业水平。尤其是隐性冠军的福利和工作文化高于平均水平,员工仍然是有价值的人,而不是一个数字。
防衰退
简单的回答是:视情况而定。不可能有一个通用的说法,它取决于子行业和衰退的类型。举个例子:在当前的新冠肺炎危机中,时装生产崩溃了,随之而来的是对工业机器的需求。但是一个生产缝纫机的隐形冠军无法满足全球需求。公司的高精度机器应用灵活,现已用于口罩生产。我的观察是,隐性冠军不太可能受到经济衰退的冲击。
项目
该行业和项目由构成智能机器的传感器、连接设备和自动化驱动,智能机器产生大量实时数据。
工人安全:工人事故代价高昂,不仅因为事故本身,还因为工人缺席和名誉受损。如今,重型设备环境中的工人越来越多地配备了传感器、振动器或集成摄像机。因此,对所有这些设备的数据进行分析。一个例子是对模式的实时数据的分析,该模式检测雇员的危险情况并导致警报,例如高音调声音。另一个例子是对不健康工作行为的模式检测,如符合人体工程学的错误提升,以及随后对工人进行改进的指示。
生产力优化:我们都听说过预测性维护。利用机器学习方法,预测机器故障的时间点,并进行预期的维护。如今,领先的公司可以在故障发生前几周就检测到微小的异常。这不仅为定期维护提供了时间,也为在此期间优化整个生产提供了时间,包括最终如何通过调整生产参数来避免预期的故障。这些是高维度问题,需要机器学习前沿方法来解决。
研发(R & D): 智能机器需要智能且健壮的算法来执行它们的任务。一个例子是诊断机器,其中安装了摄像机来监控控制面板,即工人如何使用它以及他们的手的运动。这些数据与机器性能和故障数据相关联。基于这些模式,自动调节过程被集成到机器中,以确保一致的工作性能。
所需技能
他们正在寻找精通先进方法和工程知识的数据科学家。处理大量实时数据的经验至关重要。在团队和小公司工作的个性同样重要。
农业产业
行业
该行业涵盖畜牧业、水产养殖业(即渔业)、农作物和植物以及林业的科学、艺术和商业。我们通常最熟悉农业。农业也转变成了技术驱动的行业。随着资源的减少,农业不得不生产越来越多的产品和食物。技术发展包括自动拖拉机和机械、数字化疾病检测和害虫管理、更好的天气预测、自动化灌溉和收获系统以及牲畜健康等。这只有在大量数据和许多智能算法的情况下才会发生。
Glassdoor 上的 Quick analytics 给出的平均工资范围比科技公司类似职位的平均工资范围低 10%左右。但人们必须考虑位置差异,因为许多农业数据科学工作不在科技公司所在的大中心。
防衰退
这个行业好坏参半。农业基本上是一个低利润的行业,在经济衰退期间食品支出的任何减少都会直接影响农民的收入。另一方面,同样导致更多的数字化变得更加高效和有效。因此,在创新方面,我们通常看不到太多的变化,可以认为它相当抗衰退。
项目
精准农业是关键词。根据田间传感器收集的关于作物、植物、土壤、超局部天气条件、温度、湿度的实时数据,卫星和无人机图像,可以分析单个植物的需求,并确定相应的护理。
奶牛的健康:测量温度的耳标、奶牛的健身追踪器、GPS 颈带,甚至是胃里的传感器都是今天奶牛可用的配件。这些实时数据随后由机器学习算法进行分析,以检测每头奶牛的健康异常,然后向农民或直接向兽医发送相应的警报。这种算法的开发很棘手,因为太多的警告或错误的警告会导致不正确的治疗,而在严重的健康情况下没有警告会导致没有治疗。
疾病检测与管理:无论是田间图像还是红外图像,都可以用计算机视觉检测出微小的疾病。结合进一步的当地数据,如天气或土壤参数,可以预测疾病的传播。基于所有这些数据,可以精确地确定污染区域的正确处理方法。它应该确保不使用太多或太少的杀虫剂。在这里,你正在图像识别技术的前沿工作。
收获和分级:如今,自动收获机也能自动对水果或蔬菜进行分级。西红柿就是一个例子。它们经常在机器人的温室中培育。这些机器人不仅管理数据驱动的种植,还收获成熟的水果,并将它们分成不同的类别。同样,这是非常机器学习的密集工作,你可以使用所有先进的神经网络模型。
所需技能
好消息是,农业行业不指望你有相应的教育。他们正在寻找开放和好奇的数据科学家,将数据科学和人工智能的应用扩展到较少考虑的领域。但是不要低估所用方法的成熟度。为非常高级的应用做好准备。
连接圆点
科技行业之外的许多令人兴奋的行业为你提供了获得技能和专业知识的独特机会,否则你将无法体验。技术正在渗透到所有行业和领域,随之而来的是海量数据的产生。所有部门都必须由数据驱动。
我给你的建议是,当你在找一份数据科学的工作时,要思想开放,跳出框框思考。这将为您的数据科学职业生涯带来竞争优势。
你喜欢我的故事吗?在这里你可以找到更多。
[## 顶级技术趋势及其对数据科学、机器学习和人工智能的影响
你和你的职业生涯的行动计划
towardsdatascience.com](/the-top-technology-trends-and-their-impact-on-data-science-machine-learning-and-ai-f6223b496efa) [## edX 2020 / 2021 上的数据科学 MicroMasters 计划终极指南
你应该选择 6 个程序中的哪一个?
towardsdatascience.com](/the-ultimate-guide-on-the-data-science-micromasters-programs-on-edx-2020-2021-db7646381387?sk=21fd78fdd3959a7f850860bd788dd914) [## 作为一名 40 多岁的女性,如何进入数据和技术行业
三个鼓舞人心的例子以及如何转向科技职业的指南
medium.com](https://medium.com/swlh/how-to-move-into-a-data-and-technology-career-as-a-woman-in-the-40s-195f6378ed4c)
5 个无人知晓的用于数据科学的精彩 Python 包
你知道这些包裹吗?

(python logo src =http://python.org
所以我们可能都知道动态数据科学三重奏,Numpy,Pandas 和 Matplotlib。

您很可能熟悉这些包以及它们是如何工作的。可能还有其他一些你喜欢使用的很酷的软件包,比如 Plotly、Seaborne、Scikit-Learn、Tensorflow 和 Pytorch 等等。尽管这些都是很棒的包,但是有数百万个 Pythonic 机器学习包,其中一些不被重视,还有一些完全不为人知!
№1:微光
你听说过 Plotly,你听说过 Matplotlib,也许还有 Seaborne,但你可能没听说过 Gleam。Gleam 是一个非常棒的工具,可以创建带有页面、面板和按钮的交互式可视化效果。这些交互式 web 可视化也是完全 web 集成的,这意味着您可以将它们放入从网站到终端的任何东西中!Gleam 使用 wtforms 进行交互,并且可以使用任何不同的可视化工具来实际显示数据。

如果你想要一个很酷的交互面板,你可以使用任何图形库,Gleam 就是你要的模块!
№2:表格
轻量级,直观和快速的数据表。
pypi.org](https://pypi.org/project/tabel/)
好吧,我知道你在想什么,
“为什么不用熊猫呢?”
这当然是一个可行的论点。餐桌包装是熊猫难以置信的轻便替代品。使用 Table.py 可以比使用 Pandas.py 更容易地读取大量数据集,这也是它上榜的唯一原因。总的来说,在某些情况下,这可能是工作的一部分,但在大多数情况下,我只会坚持
import pandas as pd
№3:幕府

https://www.shogun-toolbox.org/(src =
幕府将军是一个用 C++编写的机器学习库,碰巧也拥有一个 Python 端口。关于幕府的一个伟大的事情是,它可以跨众多不同的编程语言使用,并且在这方面相对统一。如果你要学习 Python 中的幕府将军,你可以将这些知识应用到它支持的任何其他语言中,这太棒了!
幕府将军拥有广泛的尖端机器学习算法,肯定任何科学家都可以欣赏。它当然也是开源的,并且是在 GNU 通用许可下发布的,这总是一个优点!
№4: OpenCV
OpenCV 是另一个伟大的机器学习包,实际上最初是由英特尔开发的。然而,尽管 OpenCV 是私有的,但它是开源的,并在 FreeBSD 许可协议下发布。OpenCV 真正酷的一点是它对实时计算机视觉的关注。像幕府将军一样,OpenCV 最初是用 C++编写的,但是有 Python 和其他语言的接口。
№5: Mlpy

(src =http://mlpy.sourceforge.net/
Mlpy 为监督的和非监督的学习提供了广泛的最先进的机器学习方法。与同类产品不同,它旨在为数据科学提供一体化的方法。虽然在这一点上有点过时,但它无疑是 Pythonic 机器学习的巨大软件包爆炸的一个巨大的导火索。尽管年代久远,但在我看来,它仍然值得一看。这是由于它的易用性、有趣的算法和包容性。
Mlpy 试图创建一个包,平衡再现性,调制和效率。在这一点上,我认为这个包是成功的,因为虽然它的许多对应部分更新得更频繁,而且肯定是行业标准,但许多这些想法似乎在翻译中以这样或那样的方式丢失了。这是有道理的,因为这些庞大的软件包大部分是由成千上万的开发人员用 C 编写的,然而,我要说的是,使用它们可能是一个缺点。
结论
所以你有它,五个软件包在我看来是不被承认的,并没有得到他们所完成的荣誉。虽然这些软件包确实很酷,但我确信还有成百上千的其他酷模块可以添加到您的 Pip 环境中,它们也是令人敬畏和闻所未闻的!
Python 有一个压倒性的生态系统和许多要挖掘的包,这是它如此伟大的部分原因!学习如何不断地使用新模块将会保持你的知识基础的扩展,并保持你的程序员的大脑活跃!
面试官在分析候选人时寻找的 5 个因素
这不全是关于你能多好地编码
在这里,我们将关注分析面试过程中非常重要的一部分:招聘经理在分析候选人身上寻找什么。我们知道面试过程的压力有多大,所以我们希望,通过对招聘过程本身有更多的了解,你可以调整你的面试方法,以获得最大的成功机会。
首先,我们将解释在分析工作面试中你会遇到的一般类型的问题。然后,我们将看看一个好的候选人应该具备的五个关键因素。

我能从分析工作面试中得到什么?
显然,在一次分析工作面试中,他们希望你能够很好地编码。至此,您应该对他们正在评估的编码语言类型有了经验,并且拥有处理他们扔给你的任何东西的数据分析技能。
你可能会在面试中遇到一个用例,它基本上是一个场景,有时会很复杂,需要多个步骤和解决方案来解决。通常,这是基于公司已经经历或正在经历的问题。
显然,他们希望你尝试解决这个问题,但同样重要的是你要解释你是如何得到你的解决方案的。他们正在评估你的过程和方法。你如何得出你的解决方案和解决方案本身一样重要。
分析面试官在候选人身上寻找的 5 个因素
1.思想开放
我们提到过,在分析工作面试中,最重要的是过程。解决分析中的问题有很多方法,因此与面试官保持开放的沟通,解释你是如何做出每个决定的,以及你将如何处理每个用例及边缘情况至关重要。
保持开放的心态是面试过程中的一个关键因素。你必须评估每个问题,并愿意考虑每个可行的选择。这对于确定你试图解决的问题是至关重要的。
你的目标是通过提问和回答进行健康的对话,向面试官展示你已经考虑了所有的选择。通过这样做,你也有更好的机会把自己放在选择最佳选项的位置上。
2.结构化思维
如上所述,分析面试官正在寻找一个思想开放、愿意在选择最佳方案之前考虑所有可行方案的人。这显示了你对你正在尝试做的事情背后的数学和理论的理解。交流你的过程并解释你如何处理数据对面试官理解你的分析技巧很重要。
为了有效地沟通,你必须在处理问题时形成一种务实的、结构化的思路。这样,无论你面临什么问题,你都有一个结构化的方法向面试官展示你是如何解决问题的。
问题通常包括分析代码行。仔细查看语法并解释每个代码块要实现的功能。在此基础上,确定代码所要实现的“大画面”,并确定代码中可以添加或删除的内容,以达成解决方案。通过遵循这个可靠的过程,你可以确保面试官可以很容易地跟踪你的思维过程。你要确保你这边没有遗漏任何东西。
3.关闭边缘案例
边缘案例是理解分析问题最重要的部分之一。对于你在面试中遇到的任何问题,试着想一想代码可能会被破坏的边缘情况,并与面试官交流。此外,确定您的解决方案可能无法捕捉到的业务问题中的某些情况的边缘案例。然后构建一个解决方案来捕获这些边缘案例。建议可以解释它们的方法,以便给定的情况不会破坏代码。这很容易做到,因为您首先确定了潜在的问题领域。

4.理解权衡
在技术面试中,几乎总是有不止一种方法来分析数据和解决一个问题,这就不可避免地要做出取舍。你可能不得不放弃一种方法去追求一种不同的方法。在你的面试中,在这种情况下最重要的事情是确定这些权衡,然后解释每个选项,以及为什么你可能会或可能不会选择其中一个。这应该是与面试官的一次对话,这样你的解决方案就可以针对业务目标进行优化。
你的解决方案可能不是 100%完美的,但是如果你表达了为什么你选择了一个方案,为什么你认为你的解决方案是理想的,面试官会对你解决问题的技巧和分析能力感到满意。这些都是面试官往往最感兴趣评价的东西。
5.以任何人都容易理解的方式解释该解决方案将为您带来什么
一旦你对自己的思考过程和解决问题的方法感到满意,重要的是把它们都总结起来。一个很好的方法是向面试官提供你的解决方案的概要。记住,最重要的是你要理解问题,你要达到什么目的,并且愿意评估所有的选择来达成解决方案。
所以,用总结来总结每个答案。快速解释您的解决方案、您考虑过的选项、权衡、边缘案例,以及为什么您认为您的解决方案是最好的。这可以确保面试官带着对你思维过程的理解离开。

你可能已经注意到贯穿这几点的一个共同主题。在这些技术面试中,它是关于展示你对概念的理解以及批判性和务实性思考的能力,而不是得出问题的正确答案。正确的答案只是谜题的一部分。分析型面试官在面试过程中的意图是雇佣一个以开放的心态处理每个问题并愿意考虑每个选择的人。
这些品质代表了候选人不仅会战略性地思考,而且不怕与他人合作或寻求帮助。毕竟,公司希望雇佣可以共事的人,而你需要证明你有必要的沟通技巧和洞察力来做到这一点。
如果你想练习一些技术问题,并想看看其他人是如何处理同样的问题的,尝试一下 Strata Scratch 中的一些技术问题,并回顾一下他们的用户的方法和解决方案。
最初发表于T5【https://www.stratascratch.com】。
Python 强化学习的 5 个框架
从头开始编写自己的强化学习实现可能需要大量的工作,但是您不需要这样做。有很多很棒的、简单的和免费的框架可以让你在几分钟内开始。

通过重用现有的 RL 库,你可以节省很多精力。]
有很多用于监督和非监督机器学习的标准库,如 Scikit-learn、XGBoost 甚至 Tensorflow,它们可以让你立即开始,并且你可以在网上找到支持的日志。遗憾的是,对于强化学习(RL)来说,情况并非如此。
这并不是说没有框架,事实上,有很多关于 RL 的框架。问题是现在还没有标准,所以在网上寻找支持来开始、解决问题或定制解决方案并不容易。这可能是因为虽然 RL 是一个非常受欢迎的研究主题,但它仍处于行业实施和使用的早期阶段。
但是这并不意味着没有伟大的框架可以帮助你开始使用 RL 来解决你喜欢的任何问题。我在这里列出了一些我逐渐了解和使用的框架,以及它们的优点和缺点。我希望这能让你对目前可用的 RL 框架有一个快速的了解,这样你就可以选择一个更适合你需求的框架。
Keras-RL

不得不承认从整个榜单来看,这是我的最爱。我相信是目前为止最容易理解的几种 RL 算法的代码实现包括深度 Q 学习(DQN)、双 DQN、深度确定性策略梯度(DDPG)、连续 DQN (CDQN 或 NAF)、交叉熵方法(CEM)、决斗 DQN)和 SARSA。当我说“最简单易懂的代码”时,我指的不是使用,而是定制它,并将其作为您项目的构建模块*。Keras-RL github 也包含了一些例子,你可以使用它们立刻开始。当然,它使用 Keras,您可以将它与 Tensorflow 或 PyTorch 一起使用。
不幸的是,Keras-RL 已经有一段时间没有得到很好的维护,它的官方文档也不是最好的。这给了这个项目的一个分支 Keras-RL2 以启示。
(*)我用这个框架做什么?嗯,我很高兴你问了——或者是我?我用这个框架创建了一个定制的辅导 DQN 代理,你可以在这里了解更多。
Keras-RL2
Keras-RL2 是 Keras-RL 的派生产品,因此它支持与 Keras-RL2 相同的代理,并且易于定制。这里大的变化是 Keras-RL2 维护更好,使用 Tensorflow 2.1.0。不幸的是,没有这个库的文档,尽管 Keras-RL 的文档也可以很容易地用于这个分支。
OpenAI 基线
OpenAI Baselines 是 OpenAI 的一套高质量 RL 算法实现,OpenAI 是人工智能特别是 RL 研发领域的领先公司之一。它的构想是让研究人员可以容易地比较他们的 RL 算法,使用 OpenAI 的最先进的实现作为基线——因此得名。该框架包含许多流行代理的实现,如 A2C 、 DDPG 、 DQN 、 PPO2 和 TRPO 。

【图来自稳定基线基准。]
不利的一面是,OpenAI 基线没有得到很好的记录,尽管代码中有很多有用的注释。此外,因为它是作为基线而不是构建块开发的,所以如果您想为您的项目定制或修改一些代理,代码就不那么友好了。事实上,下一个框架就是从这里派生出来的,解决了大部分问题。
稳定基线

[图片来自稳定基线文档。]
稳定基线是开放 AI 基线的分支,有重大的结构重构和代码清理。在其官方文档网站中列出的变更如下:
- 所有算法的统一结构
- PEP8 兼容(统一代码风格)
- 记录的函数和类
- 更多测试和更多代码覆盖
- 附加算法:SAC 和 TD3(她支持 DQN、DDPG、SAC 和 TD3)
我个人在过去使用过稳定的基线,我可以确认它确实有很好的文档记录并且易于使用。甚至有可能用一句台词来训练一个用于开放式健身房环境的代理:
**from** **stable_baselines** **import** PPO2model = PPO2('MlpPolicy', 'CartPole-v1').learn(10000)
顶点

郊狼已经使用 ACME 几十年了,远远领先于他的时代!【图片来自漫画及超越。]
Acme 来自 DeepMind,可能是研究中最知名的致力于 RL 的公司。因此,它是为构建可读、高效、面向研究的 RL 算法而开发的,并包含多种先进代理的实现,如 D4PG、DQN、R2D2、R2D3 等。Acme 使用 Tensorflow 作为后端,并且一些代理实现使用了 JAX 和 Tensorflow 的组合。
Acme 的开发牢记使其代码尽可能可重用,因此其设计是模块化的,易于定制。它的文档并不丰富,但足以给你一个很好的库介绍,也有一些例子让你开始使用 Jupyter 笔记本。
外卖食品
这里列出的所有框架都是任何 RL 项目的可靠选择;决定使用哪一个取决于你的偏好和你到底想用它做什么。为了更好地形象化每个框架及其优缺点,我做了以下直观总结:
Keras-RL—Github
RL 算法的选择:☆☆☆
文档:☆☆☆
定制:☆☆☆☆
维护:☆
后端:Keras 和 Tensorflow 1.14。
Keras-RL2—Github
RL 算法的选择:☆☆
文档:不可用
定制:☆☆☆☆
维护:☆☆
后端:Keras 和 Tensorflow 2.1.0。
OpenAI 基线—Github
RL 算法的选择:☆☆☆
文档:☆☆
定制:☆☆
维护:☆☆☆
后端:Tensorflow 1.14。
稳定基线—Github
RL 算法的选择:☆☆☆
文档:☆☆☆☆
定制:☆☆☆
维护:☆☆☆☆
后端:Tensorflow 1.14。
极致—Github
RL 算法的选择:☆☆☆
文档:☆☆
定制:☆☆☆
维护:☆☆☆☆
后端:Tensorflow v2+和 JAX
如果您已经决定了使用什么框架,那么现在您所需要的就是一个环境。您可以开始使用 OpenAI Gym,它已经在这些框架的大多数示例中使用,但是如果您想在其他任务上尝试 RL,如交易股票、联网或产生推荐,您可以在这里找到一个易于理解的现成可用环境列表:
我最近一直在研究强化学习(RL ),我发现有很多很棒的文章、教程…
medium.com](https://medium.com/@mauriciofadelargerich/reinforcement-learning-environments-cff767bc241f)
如果你知道任何其他好的 RL 框架,请在下面的回复中告诉我!感谢阅读!😃
5 个免费有趣的 API,可用于学习、个人项目等!
你会对外面的世界感到惊喜。

艺术由西斯卡杜斯
公共 API 超赞!
仅在《走向数据科学》出版物上就有 50 多篇涉及 API 的文章,所以我不会做太长的介绍。API 基本上可以让你与一些工具或服务(实际上任何人都可以提供)进行交互。
您可以使用 API 从数据源中检索某种信息,然后在您自己的脚本或应用程序中使用它。公共(开放)API 很棒,因为它们允许任何第三方开发者构建可以连接到现有服务的东西。
有一些流行的 API 做“严肃的事情”,比如跟踪时间序列股票数据或提供空气质量的更新。我们不会在这篇文章中触及这些,因为我想分享一些有趣的 API,你可以在学习与 API 交互甚至创建 API 时进行实验。
您甚至可以用其中的一个构建一个简单的个人项目,来学习如何将一个应用程序连接到您当前正在学习的任何一种语言的 API。
我们开始吧!
1.PlaceGOAT——山羊的免费随机图片

天啊,这是一只由 PlaceGoat 生成的山羊
我想我会从一只可爱的小山羊开始。
这是一个非常简单的 GET API,可以生成山羊的图片。我希望我有更多的话要说,但这是真的。这里有到主站点和 Github 库的链接。

您可以指定要生成的图像的宽度和高度,以像素为单位,如下所示:
[http://placegoat.com/width/height](http://placegoat.com/width/height)
如果你只是想测试一下 Python 中的requests库,这将是一个很好的起点。如果你需要一个想法,试着写一个脚本来获得每天的山羊图像,并每天早上发送给你的另一半(或你的妈妈),以提醒他们你有多关心他们。这会是床上早餐的更好版本。
2.PokéApi —主要游戏的神奇宝贝数据库

神奇宝贝!一定要把他们都干掉,神奇宝贝!
RESTful PokéApi 可以免费使用,并允许您从一个全面的数据库中获取从神奇宝贝游戏到第一个红色和蓝色版本直到剑与盾的所有信息。
这个数据库真的是庞大。你可以得到任何东西,从神奇宝贝的能力到进化触发器到浆果硬度。直接查看 PokéApi 主站点和文档了解更多信息。如果您对特定语言的包装器感兴趣,请查看包装器库部分。例如,您可以安装 Pokebase Python 接口,直接在您的 Python 脚本中使用,而不必调用带有requests库的 API。

我不知道浆果可以按硬度分类。我想了解更多,所以我点击了以下链接:
[https://pokeapi.co/api/v2/berry-firmness/](https://pokeapi.co/api/v2/berry-firmness/)

JSON pretty printed 浆果硬度结果
通常,当您调用 API 端点时,您还应该提供一个 ID 或名称来检索特定数据点的信息。对于 PokéApi,他们说,如果您调用一个没有 ID 或名称的端点,您将得到一个默认的最多 20 个 Api 可用资源的列表。在这种情况下,“浆果硬度”端点有 5 种可能的结果,所以当您调用上面的链接时,您会看到所有结果都以 JSON 格式返回。
值得注意的是,当您使用完全开放的 API 时,您应该注意调用服务端点的频率。PokéApi 取消了速率限制(Api 配置每个时间间隔可以发出多少请求),但它仍然提醒用户限制他们请求的频率,以保持较低的托管成本。在他们的公平使用政策中,他们说人们应该在本地缓存请求的资源,DDoS 攻击将导致永久的 IP 地址禁令。要负责任!
3.Rick 和 Morty API —来自 Rick 和 Morty 的角色、位置和更多信息

瑞克和莫蒂!
这个 API 是 RESTful 的,允许您使用 GraphQL 来查询它。如果你不熟悉这种查询语言,它们还可以方便地将你链接到 GraphQL 文档。您可以通过对剧中人物、地点和剧集的元数据发出GET请求来使用 API。

要从节目中获得角色的信息,您应该向角色端点提供他们的 ID,如下所示:
[https://rickandmortyapi.com/api/character/5](https://rickandmortyapi.com/api/character/5)

JSON 漂亮打印杰瑞·史密斯结果
在这里,提供“5”给我们 Jerry Smith 的角色信息。你还可以在最后看到一个角色的相关图像,所以如果你想练习从 API 下载文件,这可能是一个好的开始。
查看主站点和文档了解更多信息。也有一些由不同语言的作者提供的包装器库,所以如果你想使用它们的话,可以去看看。它的 Python 实现可以在这里找到。此外,如果你懂一些 JavaScript 并且有兴趣为开源项目做贡献,你可以看看 Rick 和 Morty API Github。
4.icanhazdadjoke 爸爸笑话数据库

谁不喜欢爸爸的笑话?
我不确定到目前为止我的 API 相关的双关语算不算,但是我绝对喜欢各种“坏”笑话。
您可以使用 icanhazdadjoke API 从服务中获取一个爸爸笑话。API 文档给出了如何用curl与 API 端点交互的例子。

curl是一个简洁的工具,你可以用它在你的终端和服务器之间传输数据。在这种情况下,您可以通过使用 HTTP 获取特定的 URL 来测试它。例如,您可以在终端中尝试以下操作:
curl -H "Accept: text/plain" [https://icanhazdadjoke.com/](https://icanhazdadjoke.com/)

icanhazdadjoke 卷曲输出
-H命令行参数允许您在请求中包含一个额外标头的参数,在本例中是“Accept: text/plain”。这种修改允许您指定请求的输出类型,这里将是纯文本。如果你需要的话,你也可以把它设置成 JSON ( Accept: text/html)或者 HTML ( Accept: Application/json)。
还有一个端点,您可以使用它来搜索与某个关键字匹配的特定笑话。

通过调用这个端点并将结果存储在数据库中来练习搜索一些关键字可能会很有趣。然后,您会有一个基于您指定的关键字的笑话的本地副本。
查看主站点和文档了解更多信息。还有一个 GraphQL 查询端点可以用来查询 API,如果你想这样加载数据的话。
5.邪恶侮辱生成器—一个卑鄙的数据库

…这个网站很卑鄙。
前提真的很简单:你调用 API,得到一个侮辱。

就像山羊 API 一样,我在这里真的没有那么多要说的。
您可以指定语言和您希望如何回复侮辱的格式。为了好玩,我想看看另一种语言是否真的有用,所以我试图得到一个西班牙语的侮辱:
[https://evilinsult.com/generate_insult.php?lang=es&type=json](https://evilinsult.com/generate_insult.php?lang=es&type=json)

“马拉车乐”直译成英语是“坏牛奶”。通俗地说,你可以用它来形容不守信用的人或者心情不好的人。
您还可以将这个 API 作为一个非常简单的 API 来练习发出请求。如果你想探索,可以查看一下主站点和它的(相当简单)文档。
仅此而已!
我希望当你开始熟悉 API 时,或者如果你只是在寻找一些有趣的工作,你可以尝试使用其中的一个。一定要负责任地调用 API,因为这些 API 是公共的,每个人都可以免费使用。过于频繁地 ping 它们会导致你的 IP 地址被禁止,如果你喜欢山羊图片(或者你正在使用的任何服务),这可不是一件好事。
除了调用 GET 请求之外,我还提到存储结果可能会为您的项目增添一些有趣的内容,所以如果您想了解如何写入 SQLite,请查看这篇文章:
谁知道您可以在没有任何 SQL 的情况下添加到数据库中呢?
towardsdatascience.com](/using-just-one-line-of-code-to-write-to-a-relational-database-3ed08a643c5f)
对于一种完全不同的在线收集数据的方式,请查看这篇关于 XPath 语言及其在 Python 中的用法的介绍:
用 XPath 表达式从 HTML 中收集星球大战引言
towardsdatascience.com](/how-to-use-python-and-xpath-to-scrape-websites-99eaed73f1dd)
学习 Python 数据科学的 5 本免费书籍
学习 Python 的完全免费的阅读列表

对于数据科学家来说,Python 仍然是最受欢迎的编程语言。这在很大程度上是由于语法相对简单、易于学习的性质,以及这样一个事实,即除了用于机器学习的库之外,有一个非常活跃的开发人员社区维护着大量用于数据分析、操作和编排的库。
学习 Python 有很多免费或低价的课程,但如果你更喜欢从书本中学习或想补充这些课程,这里有 5 本完全免费的书,可以让你开始使用 Python 进行数据科学。
1.Python 的搭便车指南
肯尼斯·雷兹&坦尼娅·施卢斯
这是一本适合所有 Python 开发人员的优秀书籍,无论是初学者还是更有经验的用户。它并不特定于数据科学。然而,它会给你一个极好的语言基础,特别是包括推荐的最佳实践和框架。
它包括从安装,开发环境,推荐的代码结构,面向对象编程和一些非常优秀的代码风格的章节。这本书最突出的部分之一是它对包含 Python 代码的目录结构的最佳实践的描述。
这是相当固执己见的风格,但我认为在许多方面这是一件非常好的事情。在编程中,作为一个初学者,你经常不得不在许多不同的做事方法中导航,并且经常不确定选择哪种方法。
[## Python 的搭便车指南!Python 的搭便车指南
Python 编程语言的见解性指南和安装的最佳实践手册…
docs.python-guide.org](https://docs.python-guide.org/)
2.用 Python 自动化枯燥的东西
阿尔·斯威加特
另一本不是专门针对数据科学的书。然而,如果你想要一些能让你对 Python 的简单实际用例感到兴奋的东西,那么这本书绝对值得一读。
主要重点是自动化简单的重复性任务,并假设没有编程知识,所以完全是初学者的优秀。我个人发现,当我心中有一个实际的实现时,我学得最好,这本书给了你一些初学者可以用 Python 快速完成的非常简单的任务。
Python 编程语言具有广泛的语法结构、标准库函数和…
automatetheboringstuff.com](https://automatetheboringstuff.com/2e/chapter1/)
3.面向所有人的 Python
查尔斯·r·塞弗伦博士
这本书是 Coursera 上的Python for Everybody Specialization的伴奏,采用信息学的方法来学习 Python,而不是基于计算机科学的方法。因此,它重点关注如何使用 Python 进行数据分析任务,如果你正在学习数据科学,这是一件好事。
它涵盖了所有 Python 基础知识,但另外还有优秀的数据特定部分,如使用 Python 与数据库交互、数据可视化和数据建模。
[## PY4E——适合所有人的 Python
这本书的目标是提供一个面向信息学的编程介绍。…之间的主要区别
www.py4e.com](https://www.py4e.com/book.php)
4.Python 数据科学手册
杰克·范德普拉斯的《T4》
这是对构成数据科学家工具包的核心 Python 库的很好的介绍。包括使用 Numpy、Pandas、Matplotlib 和 Scikit-learn 的精彩解释和代码示例。还有一个很好的章节是关于数据科学家最流行的 Python 开发环境 IPython ,并且很好地涵盖了它如此流行的原因。
[## Python 数据科学手册
该网站包含 Jake VanderPlas 的 Python 数据科学手册的全文;该内容可在…上获得
jakevdp.github.io](https://jakevdp.github.io/PythonDataScienceHandbook/)
5.Python 机器学习简介
安德烈亚斯·c·穆勒&莎拉·圭多
这本书是我发现的最好的关于机器学习的 Python 介绍之一。它主要关注使用 Scikit-learn 库的应用程序,但涵盖了适用于任何其他库的用于机器学习的 Python 编程的核心概念。
有非常清晰的解释,机器学习工作流程的最佳实践和大量的示例代码。它非常温和地介绍了每个新概念,每个概念都建立在前面的概念之上,在整本书中变得更加复杂。因此,如果你对机器学习完全陌生,这是一个很好的介绍。
用 Python 介绍机器学习数据科学家指南
www.academia.edu](https://www.academia.edu/42736911/Introduction_to_Machine_Learning_with_Python_A_Guide_for_Data_Scientists)
有大量免费或低价的资源可用于在线学习数据科学。如果你正在寻找这些书籍之外的更多免费学习资源,我之前写过一篇文章,名为如何免费学习数据科学,其中包含一个更全面的列表。
感谢阅读!
我每月发一份简讯,如果你想加入请通过这个链接注册。期待成为您学习旅程的一部分!
5 本免费书籍,让您的数据科学技能更上一层楼

金伯利农民在 Unsplash 上拍摄的照片
帮助您提高数据科学技能的书籍
就目前的情况来看,我还远没有达到作为一名数据科学家的目标。在我迄今为止的旅程中,我遇到了许多乐于助人的人,并遇到了各种有用的资源。
当我思考我从哪里来,我现在在哪里时,我立即想起了对我作为数据科学家的进步具有革命性意义的 4 本书,今天我将与你们分享其中的内容。
更新于 2020 年 6 月 10 日:使用 Scikit-Learn 和 Tensorflow 的动手机器学习受版权保护,因此我添加了购买链接(向作者致以诚挚的歉意)。这意味着目前只有 4 本免费的书。我一直在阅读,看看是否有什么可以填充,如果你发现什么,请发送您的建议,以便我可以通读(它必须是免费的,请)。
注意:我的任何推荐都没有关联链接,我也不同意任何作者的观点。
Python 的搭便车指南

这是一本与众不同的书!不是因为它有争议或什么,而是因为它与数据科学没有直接关系。
Python 是数据科学家(以及 R)中一种流行语言,这本书可以带你达到专家水平。这本书描述了用 Python 编程时应该遵循的最佳实践,如果你读过数据科学家应该知道软件工程最佳实践,你会知道这比以往任何时候都更重要。
越来越多的数据科学项目投入生产,这对数据科学家提出了更高的端到端技能要求。这本书是一个很好的开端。
你可以通过下面的链接免费下载这本书!
[## Python 的搭便车指南!Python 的搭便车指南
Python 编程语言的见解性指南和安装的最佳实践手册…
docs.python-guide.org](https://docs.python-guide.org/)
Python 数据科学手册

杰克·范德普拉斯一针见血地为这本书命名;这是那种“永远不要扔掉这本书”的书。
从 NumPy 到 Pandas,再到 Matplotlib 和机器学习,VanderPlas 先生全面概述了我们如何面对日常挑战,如操纵、转换和清理数据;可视化各种数据;并使用数据建立统计或机器学习模型。
最理想,容易阅读的参考书!
[## Python 数据科学手册
该网站包含 Jake VanderPlas 的 Python 数据科学手册的全文;该内容可在…上获得
jakevdp.github.io](https://jakevdp.github.io/PythonDataScienceHandbook/)
使用 Scikit-Learn 和 Tensorflow 进行机器实践学习
注意:我注意到这本书是受版权保护的,因此从技术上来说,它并不是免费的——更多细节见页面顶部的注意事项。

概念和编码示例的解释对于想要开始从事个人项目的人来说是非常直观和有用的。
事实上,在我看来,我相信在读完这本书之后(或者当你读的时候),你必须用你的新知识去建立一些东西。
这是一本非常实用的书,你绝对应该花时间来回答这些问题!
要获得这本书,请访问亚马逊
统计学习的要素

个人建议?睡前不要看这个!你想在精力最充沛的时候读。
这本书是迄今为止我推荐的所有书中最复杂的一本,也是你会经常提到的一本。它深入到统计学中,并且以相当复杂的方式编写,因为它在我们作为数据科学家将遇到的许多事情背后的数学上很重要。
我把这本书放在这里不是为了炫耀我很聪明——我不是,但我可以像你一样学习任何我想学的东西!——而是为了设定标准。如果我们想成为顶尖的数据科学家,我们必须愿意做大多数人不愿意做的事情,例如深入研究将我们的领域结合在一起的基础。
注:如果你没有数学背景,我强烈建议你在阅读本文之前,以更简单的方式接触一些机器学习算法,比如实现它们。
不要畏惧数学,读 统计学习的要素 。
机器学习向往

我很惊讶这本书不像列表中的其他一些书那样被提及。吴恩达是 Coursera 的创始人,也是一些关于机器学习和深度学习的最佳课程的讲师,他整理了自己在谷歌和百度等公司工作期间最有价值的经验,并把它们写在纸上,供我们借鉴。
在我个人看来,看了像 ____ 这样为我们提供了实用的使用机器学习方法的书,这本书是一个超集的最佳书籍。这是关于成为一名优秀的团队成员,包括高效、高效和优秀的团队成员(以防不明显)。
注意:要获得免费图书,您需要填写一些详细信息,完成后会通过电子邮件发送给您。
人工智能正在改变众多行业。来自吴恩达的免费电子书《机器学习向往》教你如何…
www.deeplearning.ai](https://www.deeplearning.ai/machine-learning-yearning/)
奖金簿
按照约定,我给了你 4 本免费的书,它们会让你的数据科学技能更上一层楼。然而,作为奖励,我会提供 __ 本书,让你的数据科学技能更上一层楼——这些书的唯一区别是它们不是免费的。但是嘿!花钱买质量好没有错。
接近(几乎)任何机器学习问题

如果我有女朋友,她可能会嫉妒我对阿布舍克·塔库尔作品的赞赏。我见过的最有动手能力的人之一,这就解释了为什么他是 Kaggle 4x 特级大师!
他出版了一本书,让我们深入了解他的世界,老实说,就我从中获得的实用知识量而言,这是今年我最好的读物之一。
注意:这本书要求你有很好的机器学习知识,所以让你自己爬起来,捡起这个坏男孩!
在亚马逊上购买 接近(几乎)任何机器学习问题 。
包裹
我总结了一些让我达到新高度的书。我没有阅读所有关于数据科学领域的书籍,所以我可能错过了一本非常重要的书。如果你碰巧认为是这种情况,留下一个带有书名和 pdf 免费链接的回复。非常感谢!
让我们继续 LinkedIn 上的对话…
[## Kurtis Pykes -人工智能作家-走向数据科学| LinkedIn
在世界上最大的职业社区 LinkedIn 上查看 Kurtis Pykes 的个人资料。Kurtis 有两个工作列在他们的…
www.linkedin.com](https://www.linkedin.com/in/kurtispykes?originalSubdomain=uk)
Python 中的 5 个地理空间提示和技巧
第 1 部分:如何使用 Geopandas 在 Python 中轻松有效地集成空间要素。

在数据科学领域,处理地理空间数据通常被认为是一件麻烦的事情。我们很少费心在我们的机器学习模型中包括空间特征。部分原因是几何图形和地理坐标参考系统的复杂性。然而,我倾向于在我的机器学习模型中获得提升,并获得融入空间特征的更好的洞察力。
在过去的一个月里,我一直在 Twitter 上分享 Python 中的地理空间技巧和诀窍,它受到了地理空间社区的大量关注。
在本文中,我将分享使用 Geopandas 处理地理空间数据的前五个技巧和诀窍。我使用了一个代码美化器在线工具来显示代码。
技巧 1:直接在压缩文件夹下读取地理空间数据
我们压缩数据以减少空间和快速传输。因此,我们往往倾向于在读取数据之前对其进行解压缩或解压。然而,这不是必须的。使用 Geopandas,您可以直接读取压缩文件,就像这样。

读取地理数据 zip 文件。
这种技术也适用于 zip 文件中的子文件夹。你只需要把它指向子文件夹。
技巧 2:用一个单独的类别标出缺失的数据
数据集中缺少数据并不罕见。创建带有缺失数据的 Choropleth 地图不会区分零值或空值,因此会将它们聚合到一个类别中。

但是,如果您需要空值有一个单独的类别,您可以如下面的代码片段所示来实现。

Geopandas 有。plot()方法为其所有的地理空间数据可视化接口,它可以带关键字参数 missing_kwds,在那里可以提供要使用的颜色和要调用的类别。
结果是这幅美丽的地图,图例中缺失值类别被着色为浅灰色。

缺少值的地图
技巧 3:将地理数据框导出到 PostGIS 数据库
我们经常使用 PostGIS 来存储和分析地理空间数据。使用 PostgreSQL 设置空间数据库,并像专业人员一样使用 Python 和 Geopandas 传输数据。

从 Python 导出到 PostGIS
技巧 4:使用 PyGEOS 加速空间运算
空间索引是空间操作的运行引擎。它通常需要更长的处理时间,但是在 Geopandas 中添加 PyGEOS 集成后,您可以加快和提高性能。
您需要做的就是将 use_pyges 设置为 True。

PyGEOS
使用这个新的 PyGEOS 集成,我发现我的处理时间有了显著的改进。因此,如果您使用大数据执行空间操作,请尝试一下。
技巧 5:使用 Contextily 向 Geopandas 图添加底图。
尽管我们认为这是理所当然的,但底图将我们的地图融入了语境。使用最新版本的 Geopandas,可以使用不同的底图提供商叠加您的地图。
以下代码片段显示了如何将底图合并到 Geopandas 图中。

背景底图
您在地图上的点有上下文和丰富的可视化底图。

工作草图
结论
处理地理空间数据并不困难。有了 Geopandas,它可以有效地处理地理空间数据。在本文中,我们分享了 Python 中空间数据的五个不同的技巧和诀窍。
如果你喜欢我在 Twitter 上发布的这些提示和技巧,你可以在 @spatialML 找到它们
熊猫的 5 个陷阱
用熊猫做数据分析是非常简单的……但事实并非如此!在这篇博文中,我提出了一些你需要注意的关于熊猫的问题。

用 ImgFlip 生成的熊猫迷因
运行示例下载本 Jupyter 笔记本 。
这里有几个你可能会感兴趣的链接:
- [Labeling and Data Engineering for Conversational AI and Analytics](https://www.humanfirst.ai/)- [Data Science for Business Leaders](https://imp.i115008.net/c/2402645/880006/11298) [Course]- [Intro to Machine Learning with PyTorch](https://imp.i115008.net/c/2402645/788201/11298) [Course]- [Become a Growth Product Manager](https://imp.i115008.net/c/2402645/803127/11298) [Course]- [Deep Learning (Adaptive Computation and ML series)](https://amzn.to/3ncTG7D) [Ebook]- [Free skill tests for Data Scientists & Machine Learning Engineers](https://aigents.co/skills)
上面的一些链接是附属链接,如果你通过它们购买,我会赚取佣金。请记住,我链接课程是因为它们的质量,而不是因为我从你的购买中获得的佣金。
要升级你的熊猫游戏,请阅读:
一个开源项目,简化了熊猫与实时数据的连接,测试假设和可视化…
towardsdatascience.com](/pandas-analytics-server-d9abceec888b)
1.读取多个文件

图片来自 Meme
假设我们想从一个文件夹中读取多个文件到一个熊猫数据帧中。Python 有一个路径库,可以列出某个文件夹中的所有文件,但我发现 glob 更容易使用。glob 支持正则表达式,这给了我们对想要读取的文件的粒度控制。注意,没有必要解压压缩文件,因为熊猫可以在阅读时自动解压。
为了指定我们想要读取哪些文件,我们在 glob 中使用了*.gz。
filepaths **=** glob**.**glob('data/*.gz')# Output
['data/20191210.csv.gz', 'data/20191209.csv.gz', 'data/20191211.csv.gz']
glob 检测文件,但是它们没有排序。列表中日期为 2019-12-10 的文件在 2019-12-09 之前。如果我们像在这个例子中一样处理时间序列数据,这是一个问题。
为了获得时序数据的正确顺序,我们有两个选择(一个比另一个好):
- 将文件按名称排序并按排序顺序读取(坏),
- 在数据帧中读取所有数据后,按列对数据进行排序(首选)。
1.1 按文件名排序
让我们按名称对文件进行分类,以说明为什么这是个坏主意。
filepaths **=** sorted(filepaths)# Output
['data/20191209.csv.gz', 'data/20191210.csv.gz', 'data/20191211.csv.gz']
在本例中,对文件名进行排序是可行的,但是我们需要注意,对字符串进行排序不同于对整数进行排序,如下例所示。这是因为编程语言逐字符进行比较。依靠文件名来保证数据的正确顺序是一个坏主意。
在下面的例子中,我们分别对字符串和整数进行排序。
sorted(['100', '200', '1000', '20000', '9'])# Output
['100', '1000', '200', '20000', '9'] sorted([100, 200, 1000, 20000, 9])# Output
[9, 100, 200, 1000, 20000]
1.2 按列对整个数据帧进行排序
如上所述,按列对数据帧进行排序是一个更好的选择,但是我们需要注意列数据类型。
我们来读数据。
df_list **=** []
**for** filepath **in** filepaths:
df_ **=** pd**.**read_csv(filepath)
df_list**.**append(df_)df **=** pd**.**concat(df_list)
DataFrame 有多列,我们希望按时间戳对其进行排序。
df**.**head()

没那么快!让我们看看时间戳列的数据类型。
df**.**timestamp# Output
0 2019-12-09D00:00:18.265072000
1 2019-12-09D00:00:42.503391000
2 2019-12-09D00:01:50.513620000
3 2019-12-09D00:02:35.189775000
4 2019-12-09D00:03:49.934950000
...
389905 2019-12-11D23:35:26.637330000
389906 2019-12-11D23:35:26.637330000
389907 2019-12-11D23:37:25.166632000
389908 2019-12-11D23:40:09.701271000
389909 2019-12-11D23:55:46.793512000
Name: timestamp, Length: 1578327, dtype: object
时间戳列有一个对象类型。当我们对一个对象类型进行排序时会发生什么?
pd**.**Series(['100', '200', '1000', '20000', '9'])**.**sort_values()# Output
0 100
2 1000
1 200
3 20000
4 9
dtype: object
熊猫对象类型用于文本或混合数值和非数值。为了获得时间戳列的正确顺序,我们需要将其更改为 datetime64 类型。
df**.**timestamp **=** pd**.**to_datetime(df**.**timestamp**.**str**.**replace("D", "T"))
df**.**timestamp# Output
0 2019-12-09 00:00:18.265072
1 2019-12-09 00:00:42.503391
2 2019-12-09 00:01:50.513620
3 2019-12-09 00:02:35.189775
4 2019-12-09 00:03:49.934950
...
389905 2019-12-11 23:35:26.637330
389906 2019-12-11 23:35:26.637330
389907 2019-12-11 23:37:25.166632
389908 2019-12-11 23:40:09.701271
389909 2019-12-11 23:55:46.793512
Name: timestamp, Length: 1578327, dtype: datetime64[ns]
timestamp 列具有 datetime64 类型,我们现在可以继续排序了。
df **=** df**.**sort_values("timestamp")
df**.**head()

2.描述统计学

图片来自 MemeGenerator
当我不熟悉数据集时,describe 是我通常运行的第一个命令。我简要回顾了描述性统计数据,如计数、最小值和最大值,以查看数据是否被正确读取。
df**.**describe()

我有一段时间没有注意到的是,describe 只输出数字列的描述性统计数据。这是有意义的,因为我们不能用其他数据类型如字符串来计算它们。
当我们输出列时,我们看到有时间戳、符号等列。,上面没有列出。
df**.**columns# Output
Index(['timestamp', 'symbol', 'side', 'size', 'price', 'tickDirection', 'trdMatchID', 'grossValue', 'homeNotional', 'foreignNotional'], dtype='object')
幸运的是,describe 使用 include 参数,我们可以指定包含所有列。Include 参数也接受一个列表,我们可以在其中指定列的子集。
df**.**describe(include**=**'all')

3.可视化离群值

来自 Pinterest 的熊猫迷因
Pandas plot功能使我们能够快速可视化某一列的分布情况。
为了可视化某一列的异常值,我们可以使用一个箱线图。
df["size"]**.**plot(kind**=**"box")

在上面的图中,我们可以观察到大小有许多异常值,这使得箱形图没有信息。
我的解决方案是去掉底部和顶部的 1%分位数。
df['size_clip'] **=** df['size']**.**clip(df['size']**.**quantile(0.01), df['size']**.**quantile(0.99))df**.**size_clip**.**plot(kind**=**'box')

这使得盒图更具信息量,但我们需要尝试不同的分位数值,并在数据帧中添加一个新列。出现了一个问题,我们应该使用哪一列。有没有更好的办法?
Plot 函数采用 ylim 参数,在这里我们可以指定 y 轴的边界。这使得一个方框图更能提供信息,我们不需要在数据框中增加新的一列。
df["size"]**.**plot(kind**=**"box", ylim**=**(0, 5000))

4.宁滨数据

来自 Giphy 的熊猫玩耍
假设我们想将一个数值列转换成一个离散列。
4.1 将值装入离散区间
最直接的方法是指定 n 个间隔,并相应地绑定数据。熊猫有这样的功能。
让我们将价格列绑定到 5 个离散值。
df['price_discrete_bins'] **=** pd**.**cut(df**.**price, 5)# Output
0 (7462.2, 7575.6]
1 (7462.2, 7575.6]
2 (7462.2, 7575.6]
3 (7462.2, 7575.6]
4 (7462.2, 7575.6]
...
1309666 (7121.433, 7235.4]
1309667 (7121.433, 7235.4]
1309668 (7121.433, 7235.4]
1309669 (7121.433, 7235.4]
1309670 (7121.433, 7235.4]
Name: price_discrete_bins, Length: 1309671, dtype: category
Categories (5, interval[float64]): [(7121.433, 7235.4] < (7235.4, 7348.8] < (7348.8, 7462.2] < (7462.2, 7575.6] < (7575.6, 7689.0]]
正如我们所料,price_discrete_bins 有 5 个不同的值,每个 bin 一个。
df['price_discrete_bins']**.**value_counts()# Output
(7121.433, 7235.4] 419820
(7235.4, 7348.8] 367043
(7462.2, 7575.6] 301654
(7348.8, 7462.2] 200231
(7575.6, 7689.0] 20923
Name: price_discrete_bins, dtype: int64
剪切功能还使我们能够指定箱标签。另请参见 retbins 参数,它输出间隔和标签。
df['price_discrete_labels'] **=** pd**.**cut(df**.**price, 5, labels**=**['very low', 'low', 'mid', 'high', 'very high'])# Output
0 high
1 high
2 high
3 high
4 high
...
1309666 very low
1309667 very low
1309668 very low
1309669 very low
1309670 very low
Name: price_discrete_labels, Length: 1309671, dtype: category
Categories (5, object): [very low < low < mid < high < very high]df**.**price_discrete_labels**.**value_counts(normalize**=**True)# Output
very low 0.320554
low 0.280256
high 0.230328
mid 0.152886
very high 0.015976
Name: price_discrete_labels, dtype: float64
4.2 将值装入大小相等的桶中
在进行数据分析时,最直接的方式并不总是最好的方式(或者我认为是其他方式)😊).上面我没有指出的是,极高值(0.015%)明显比其他值(都超过 15%)代表的少。如果我们打算在这个数据集上训练一个预测模型,这可能会带来一个问题:
- 算法可能会过度拟合“非常高”的值,因为该值非常罕见,
- 算法可以将“非常高”值的出现归因于错误,并完全跳过它。
有办法避免这个问题吗?
有。让我们将价格分成大小相等的箱,这样每个箱都有相同数量的值。
df['price_discrete_equal_bins'] **=** pd**.**qcut(df**.**price, 5)# Output
0 (7477.0, 7689.0]
1 (7477.0, 7689.0]
2 (7477.0, 7689.0]
3 (7477.0, 7689.0]
4 (7477.0, 7689.0]
...
1309666 (7121.999, 7212.5]
1309667 (7121.999, 7212.5]
1309668 (7121.999, 7212.5]
1309669 (7121.999, 7212.5]
1309670 (7121.999, 7212.5]
Name: price_discrete_equal_bins, Length: 1309671, dtype: category
Categories (5, interval[float64]): [(7121.999, 7212.5] < (7212.5, 7292.5] < (7292.5, 7348.5] < (7348.5, 7477.0] < (7477.0, 7689.0]] df**.**price_discrete_equal_bins**.**value_counts()# Output
(7121.999, 7212.5] 264009
(7292.5, 7348.5] 262610
(7348.5, 7477.0] 262396
(7477.0, 7689.0] 260412
(7212.5, 7292.5] 260244
Name: price_discrete_equal_bins, dtype: int64
5.处理缺失数据

来自 Giphy 的愤怒熊猫
在熊猫中,多个值表示一个缺失值:
- NaN 表示数值/对象缺失值,
- DateTime 的 NaT 缺少值,
- None,来自 Python。
造成这种混乱的原因是(来自 pandas 文档):
选择在内部使用 NaN 来表示丢失的数据很大程度上是出于简单和性能的原因。我们希望 NumPy 很快能够提供一个本地 NA 类型的解决方案(类似于 R ),其性能足以用于熊猫。
让我惊讶的是 Python 中的 None 等于 None,而 numpy 中的 nan 不等于 nan。
None **==** None
Truepd**.**np**.**nan **==** pd**.**np**.**nan
False
这一点很重要,这样我们就不会按“无”来筛选值:
df[df.some_column == None]# instead use:
df[df.some_column.isnull()]
numpy nan 不等于自身的原因是什么?让我们潜入更深的地方。某些函数在不可计算时返回 nan。
pd**.**np**.**log(**-**1)nan pd**.**np**.**arccos(2)nan
这是否意味着函数的结果应该是相同的?显然不是。
pd**.**np**.**log(**-**1) **==** pd**.**np**.**arccos(2)False
关于缺失值行为的一些重要细节摘自 pandas 文档:
- GroupBy 中的 NA 组被自动排除。
- 对数据求和时,NA(缺失)值将被视为零。
- 如果数据都是 NA,结果会是 0。
- 像 cumsum()和 cumprod()这样的累积方法默认情况下忽略 NA 值,但是将它们保留在结果数组中。
结论

来自 Giphy 的强壮熊猫
这些是你在做数据分析时需要小心的一些关于熊猫的问题。希望你学到了新的东西。
在你走之前
在 Twitter 上关注我,在那里我定期发布关于数据科学和机器学习的消息。

在 Unsplash 上由Courtney hedge拍摄的照片
面向终身学习者的 5 本伟大的数据科学书籍
在这次疫情期间,我对那些对机器学习感兴趣的人的阅读建议。

介绍
随着全球疫情的进行,我们所有人都被困在家里,现在是一个远离世界、补上阅读的好时机。虽然我喜欢阅读许多不同类型的书籍,但我发现最有成效的书籍类型很少,而且很少有详细解释统计学和机器学习的例子。作为一个终身学习者,书籍是推断全部剩余信息的伟大媒介,在某些主题上甚至可以超过互联网上可用的信息。

从零开始的数据科学
乔尔·格鲁什
数据科学模块是试验和熟悉数据科学的绝佳工具。然而,随之而来的一个大缺点是,熟悉模块比熟悉模型容易得多。从零开始的数据科学的伟大之处在于,它在一本 330 页的书里深入探究了几个行业标准模型究竟是如何实现的。虽然对这本书的主观看法似乎是复杂的,但它确实是我非常喜欢的一本书,你也可能喜欢。
首先,这本书提供了 Python 的速成课程,虽然“速成课程”可能不是学习编程的好方法,但我认为 Joel 的解释来自任何其他编程语言,肯定是恰当的。除了 Python 课程之外,这本书还附带了数据科学中线性代数的概要,以及涉及概率、基础和高级的统计学。
在整本书中,k 近邻、朴素贝叶斯、线性和逻辑回归、决策树、神经网络和无监督聚类等模型都得到了生动的详细讨论,并在我看来得到了很好的解释。这本书最后概述了自然语言处理和网络分析,这绝对是我推荐的一本书!

统计学习导论
作者:加雷斯·詹姆斯、丹妮拉·威滕、特雷弗·哈斯蒂和罗伯特·蒂布拉尼
与我讨论过的上一本书不同,这本书使用 R 而不是 Python 进行了完全不同的阐述。这本书介绍了 R 中一些最重要的建模和预测技术,以及相关的应用程序。与从头开始的数据科学相比,我认为这本书更适合初学者。这本书也有真正精心设计的彩色图形和真实世界的场景,它们结合在一起,成为一个易于理解的机器学习课程。
这本书的每一章都有一个很棒的教程,介绍如何在 r 中实现不同的分析和建模模块。

统计学习的要素
作者:特雷弗·哈斯蒂、罗伯特·蒂布拉尼和杰罗姆·弗里德曼
许多主题在统计学习的元素中被很好地覆盖,包括模型绘图、神经网络、支持向量机、分类树和梯度推进。这本书深入探讨了你可能会想到的东西:有监督的学习,也有无监督的学习。这本书被广泛认为是任何一本书中第一个全面论述这一主题的主要著作之一。Hastie、Tibshirani 和 Friedman 都是斯坦福大学的统计学教授,都是统计学领域的杰出研究者。

统计卡通指南
拉里·戈尼克和伍尔科特·史密斯
与前几本书来了一个一百八十度的大转弯的是统计学的卡通指南,这本书使用漂亮的插图和简单的解释,以一种真正独特而美丽的方式解释统计学。我不仅因为这本书有时非常有趣的插图而读得很开心,而且里面也有很多信息。虽然它可能没有这个列表中其他书籍的统计水平高,但我认为它绝对符合它迷人的艺术风格和对初学者友好的性质。

算法设计手册
史蒂文·s·斯基埃纳
虽然数据科学经常面临更多的问题——统计比编写算法更重要,但在许多不同的情况下,成为算法向导对任何数据科学家来说都是一个巨大的好处。《算法设计手册》深入探讨了如何从头开始创建高级、复杂的算法。
这本书的伟大之处在于,它吸取了真实的、实际的经验,并把它压缩在短短的 486 页中。这本书分为两大部分,第一部分是算法设计和分析的广泛介绍。这本书的第二部分是参考部分,这是一个各种各样的“词汇表”,包含 75 种需要熟悉的最重要的算法。这不仅是一本值得一读的好书,也是一本可以随身携带以供参考的好书!
结论
这些是我个人最喜欢的书籍,从统计学到机器学习和开发算法。总的来说,我认为这些书对长期使用特别有益,因为我经常参考像从头开始的数据科学和算法设计手册这样的书。
幸运的是,数据科学文献远没有以前那么少了,而且每天都有更多的书籍需要解读。虽然这对于终身学习者来说绝对是一个很好的情况,但整个机器学习书籍图书馆可能会令人望而生畏。这些是我最喜欢的关于数据科学、机器学习、统计学和计算机科学的书,但是我很想知道你推荐读什么!有没有哪本书是你获得大量知识的原因?
使用 Tableau 的 5 种数据可视化技术
用简单的方式解决画面的局限性

Tableau 是一个功能强大且易于使用的数据可视化工具。然而,当我们想要创建一个高级仪表板时,有时功能的限制会阻碍我们。

我的画面项目
- 行分隔符
- 页码
- 搜索框
- 带标记的折线图
- 带有 URL 链接的文本
- 其他酷酷的画面特色
1.行分隔符
行分隔符可以帮助您的受众更好地理解仪表板中各部分之间的关系以及内容的层次结构。在 Tableau 中创建行分隔符有很多方法,我们将介绍使用文本框的方法。

行分隔符
1.1 创建一个文本对象
将一个文本框从浮动层拖到仪表板上

将一个文本框从浮动层拖到仪表板上
1.2 配置布局选项卡
在布局的选项卡中
a)将文本框的高度设置为 1 像素
b)将宽度设置为略小于仪表板宽度
c)将背景颜色设置为黑色

在布局页签中,设置高度、宽度和背景颜色
现在,您可以在仪表板上看到一个行分隔符。
2.页码
添加分页以使受众能够在仪表板之间导航有助于提供更流畅的用户体验,并更好地理解内容之间的相互关系。由于 Tableau 没有分页特性,我们将通过使用动作特性来解决这个问题。

页码
2.1 为每个仪表板创建一张表
对您的所有仪表板重复以下步骤
a)创建一个新工作表,用您仪表板的编号命名
b) 创建一个计算字段… 以仪表板编号字符串作为内容

创建计算字段……

以仪表板编号字符串作为内容
c)将尺寸拖到板材上

将尺寸拖到板材上
d)将板材拖到仪表板上

将板材拖至仪表板
2.2 配置操作
a)在仪表板栏下,选择动作…

在仪表板栏下,选择动作…
我们需要为我们想要导航到的每个仪表板配置一个操作。对每个仪表板重复以下步骤:
b)点击添加动作 > 转到工作表…

点击添加动作 > 转到工作表…
c) 源表:选择全部,这将启用对您所有表的操作,下面,只检查与仪表板号对应的表
d) 运行动作于:选择选择,我们要通过选择分页来触发动作
e) 目标表:选择目标仪表板

在动作中配置源片、运行动作、目标片
现在,如果您单击仪表板上的分页,您将被导航到相应的仪表板。
3.搜索框
当受众对大型数据集中的特定主题感兴趣时,搜索框非常有用。

搜索框
3.1 为搜索框创建一个参数
a)将数据类型设置为字符串并将当前值设置为空值

将数据类型设置为字符串并将当前值设置为空值
b)在搜索框的下拉菜单下,选择显示参数控制

选择显示参数控制
3.2 创建用于筛选的计算字段
a)使用 CONTAINS() 函数过滤数据
b)将计算字段重命名为筛选器

创建用于筛选的计算字段
c)将过滤器维度拖到过滤器部分
d)仅选择真值值

仅选择真值值
现在,您可以在搜索框中键入文本,仪表板将呈现过滤后的数据。
4.带标记的折线图
有时我们想在线图上添加一个标记,以强调特定的数据点。在 Excel 中配置可能很容易,但在 Tableau 中就不容易了。

带标记的折线图
a)我们首先以通常的方式创建一个线图

创建线形图
b)然后我们再次将我们的 y 变量拖到行架上。复制的线图将显示在原始线图的下方。在第二个 y 变量的下拉菜单下,选择双轴。这两块地将合二为一。

选择双轴
c)右击右侧 y 轴,选择同步轴

同步轴
d)在标记部分,选择第二个图。在下拉菜单下,选择圆。现在,您可以在线图中看到圆形标记。

标志>圆圈
5.带有 URL 链接的文本
Medium 不允许在文本中直接嵌入 URL 链接。然而,我们可以用动作特性来解决这个问题。

带有 URL 链接的文本
5.1 为文本创建一个表
a)为文本创建一个表
b) 创建一个计算字段,以文本字符串作为内容
c)将尺寸作为文本拖到图纸上
d)将颜色更改为蓝色,表示它是链接嵌入的

5.2 将文本作为浮动对象拖动到仪表板上

5.3 转到仪表板栏> 动作 > 添加动作 > 转到 URL……

5.4 在配置中粘贴 URL ,在上运行动作选择

现在,您可以通过单击文本对象导航到目标 URL。
6.其他酷酷的画面特色
6.1 自动生成的标题
如果你没有时间,想要一个简短的说明,Tableau 可以帮你做到。
只需转到工作表 > 显示标题

自动生成的字幕
6.2 地图图层
Tableau 提供了许多地图功能。进入地图 >地图图层,你可以改变背景颜色,显示城市边界,甚至自动在你的地图上绘制美国人口数据。

地图图层
— — — — — — — — — — — — — — — — — —
如果你对 Tableau 有任何问题,欢迎在下面评论。
本周(11 月 8 日)你应该阅读的 5 篇有趣的人工智能/人工智能文章
关于人工智能和机器学习发展的文章的评论和总结。
随着我们越来越接近多事之秋,我想增加我消费的人工智能内容的数量。
更具体地说,我想回顾 2020 年,对自己通过阅读文章、研究论文、观看在线课程和教程所积累的知识感到满意。我敢肯定,对于大多数机器学习从业者来说,这大概是一样的。
在这一点上,本周推荐的文章将丰富你关于基于人工智能的技术、产品和发展的信息。
快速总结:
- 亚历山德罗·克里米博士向读者介绍了在脑机接口领域与 Neuralink 不相上下的初创公司。
- 丽莎·帕尔默探讨了商业和组织中对话的应用和益处。
- Nishu Jain 的文章快速浏览了著名人工智能技术和算法的细节。
- Sam Palani 解释了变压器网络的架构细节。
- Shareef Shaik 提供了一个蓝图,机器学习从业者可以采用它来有效地学习算法和机器学习概念。

图片作者:Richmond Alake
如果你在 Medium 上写人工智能/人工智能内容,你希望我阅读你的文章,并将其包含在我的每周/每月文章报道中,请随时在你的文章的评论部分给我加标签,或者连接并发送一个链接到LinkedIn上的文章。
5 家初创公司打破了神经技术和脑机接口的界限,优于 Neuralink 作者:亚历山德罗·克里米博士
你可能知道埃隆·马斯克的 Neuralink 公司,但你可能不知道分散在世界各地的初创公司也在影响神经技术领域。
在这篇文章中,Alessandro 博士提供了五家初创公司的名称和简介,这些公司正在生产或已经生产出与 Neuralink 的大脑植入芯片相比,可以以更实用和非侵入性的方式应用的产品。
我不得不承认,像大多数读者一样,我从未听说过这些初创公司,我很高兴看到有几种不同的努力致力于使脑机接口成为日常生活的一个方面。
一些提到的创业公司在有限的资金和人力资源下取得了值得称赞的成就。
更多的机器学习和更少的笨重硬件
对话式人工智能:谈论我们的数字化转型之路作者丽莎·帕尔默
丽莎·帕尔默写了一篇文章,探讨了 B2B(企业对企业)组织中会话式人工智能的应用、好处和影响。根据文章中的解释,对话式人工智能有两种主要形式,要么是人工智能驱动的人类声音,要么是人工智能聊天机器人。
虽然这篇文章探讨了 converstaional I 带来的业务影响和组织转变,但也包含了对 converstaional I 的描述,以及它如何应用于组织网站和应用程序以增强其客户/业务关系。
我会将这篇文章推荐给担任管理角色或业务决策角色的机器学习从业者,因为这篇文章为一项技术的集成创造了一个案例,这项技术无疑将在未来几年内流行。
你已经可以见证自然语言处理在应用人工智能中的影响,特别是有几个网站拥有人工智能聊天机器人来解决客户和访客提出的常见问题。
这篇文章不同于你在 Medium 上遇到的关于 AI 或 ML 的典型技术文章。丽莎·帕尔默写了一份我可以称之为从商业、组织和战略角度验证人工智能整合的文件。
希望说服团队、高管或公司利益相关者尽早利用人工智能的读者会发现这篇文章的价值。
数字化转型似乎令人望而生畏。一个简单的起点怎么样?你想改善你的服务吗…
palmerlisac.medium.com](https://palmerlisac.medium.com/conversational-ai-talking-our-way-to-digital-transformation-1674646117ae)
值得了解的 10 项改变游戏规则的人工智能突破作者尼舒·贾恩
Nishu 写了一篇有趣的文章,快速浏览了近年来开发的著名人工智能技术和算法的细节,而没有牺牲所提供信息的质量。
这篇文章在我的每周推荐列表中,因为它提供了一些常规机器学习技术背后的概念直觉。
对于每一个提到的 AI 开发,都有足够的信息来提供对所介绍技术的高层次理解,最重要的是,Nishu 提供了简单的描述和创造性的类比,使这篇文章对于所有级别的 AI 爱好者和从业者都是可读的。
列表中一个值得注意的例外是变压器架构。
不用担心,因为下面的下一篇推荐文章将涵盖这种新颖的深度学习架构。
我建议快速阅读这篇文章,因为它介绍了人工智能算法背后的起源和思想,而不需要教科书。
过去几十年中引人入胜的想法和概念
medium.com](https://medium.com/towards-artificial-intelligence/10-game-changing-ai-breakthroughs-worth-knowing-about-b2076afc4930)
变形金刚背后的直觉——注意力是你所需要的全部
这是您推荐的本周技术文章!
Sam Palani 介绍了主要用于自然语言处理和语言建模领域的各种神经网络体系结构。
在这篇写得很好的技术文章中,简要介绍了 RNN(递归神经网络)、LSTM(长短期记忆)和注意力机制等架构的描述和局限性。
文章的主要内容是围绕 2017 年发布的变压器架构,该架构解决了以前使用的架构的局限性。
Sam 的文章是对 Transformer 体系结构的技术内部工作的快速总结,许多技术读者都会喜欢。Sam 提供了从介绍变压器网络的原始研究论文中获得的图像,并对每个图像的每个组件进行了解释。
传统的递归神经网络及其变体已经广泛用于自然语言处理…
towardsdatascience.com](/the-intuition-behind-transformers-attention-is-all-you-need-393b5cfb4ada)
有效学习机器学习算法的诀窍ByShareef Shaik
Shareef Shaik 探讨了机器学习库和工具对正在探索机器学习的个人的影响,这是一种错误的看法,即机器学习局限于利用少数模型和预先实施的方法。
Shareef 的文章提供了一个详细的蓝图,说明如何构建机器学习项目,以及如何有效地分析和学习机器学习算法。
我会把这篇文章推荐给自学机器学习的从业者和那些正在学习机构课程的人。
Shareef 有效地提供了我只能描述为发展正确理解的秘诀,这是成功的机器学习生涯所必需的。
我希望我在开始自学时就知道这一点。
towardsdatascience.com](/know-how-to-learn-machine-learning-algorithms-effectively-81766fe442e0)
我希望这篇文章对你有用。
要联系我或找到更多类似本文的内容,请执行以下操作:
5 个有趣的 Python 库

约书亚·科尔曼在 Unsplash 上拍摄的照片
你有没有想过数据可视化可以在命令行中实现?
作为最受欢迎的编程语言之一,Python 拥有大量优秀的有利于开发的库,如 Pandas、Numpy、Matplotlib、SciPy 等。
然而,在本文中,我将向您介绍一些更有趣而不是非常有用的库。我相信这些库可以展示 Python 的另一面和社区的繁荣。
1.Bashplotlib

由 David Werbrouck 在 Unsplash 上拍摄的照片
老实说,当我第一次看到这个图书馆时,我质疑为什么人们会需要它?Bashplotlib 是一个 Python 库,它使我们能够在命令行 stdout 环境中绘制数据。
很快我意识到,当你没有任何可用的 GUI 时,它可能会有用。嗯,这种情况可能不太常见,但这并不妨碍我的好奇心,并觉得这是一个非常有趣的 Python 库。
Bashplotlib 可以用pip轻松安装。
pip install bashplotlib
让我们看一些例子。在下面的代码中,我导入了numpy来生成一些随机数组,当然还有bashplotlib。
import numpy as np
from bashplotlib.histogram import plot_hist
arr = np.random.normal(size=1000, loc=0, scale=1)
plot_hist是来自bashplotlib的函数,用于绘制直方图中的一维数据,就像 Matplotlib 中的plt.hist一样。然后,我使用 Numpy 生成一个随机数组,其中包含 1000 个正态分布的数字。之后,我们可以很容易地将这些数据绘制如下:
plot_hist(arr, bincount=50)
输出是这样的

那不是很有趣吗?😃
此外,您可以将文本文件中的数据绘制成散点图。

2.漂亮的桌子

Goran Ivos 在 Unsplash 上拍摄的照片
我刚才介绍的 Bashplotlib 用于在命令行环境中绘制数据,而 PrettyTable 用于以漂亮的格式输出表格。
同样,我们可以使用pip轻松安装这个库。
pip install prettytable
首先,让我们导入库。
from prettytable import PrettyTable
然后,我们可以使用PrettyTable创建一个表格对象。
table = PrettyTable()
一旦我们有了表对象,我们就可以开始添加字段和数据行。
table.field_names = ['Name', 'Age', 'City']
table.add_row(["Alice", 20, "Adelaide"])
table.add_row(["Bob", 20, "Brisbane"])
table.add_row(["Chris", 20, "Cairns"])
table.add_row(["David", 20, "Sydney"])
table.add_row(["Ella", 20, "Melbourne"])
要显示表格,只需简单地打印它!
print(table)

PrettyTable 还支持细化表格样式,几乎可以从任何角度来看。例如,您可以右对齐表格中的文本:
table.align = 'r'
print(table)

按列对表格排序
table.sortby = "City"
print(table)

您甚至可以获得表格的 HTML 字符串

3.模糊的

在我看来,这个图书馆不仅非常有趣,而且非常有用。很多时候你可能想为你的程序实现一个“模糊”的搜索特性。FuzzyWuzzy 为此提供了一个开箱即用的轻量级解决方案。
照常从pip开始安装。
pip install fuzzywuzzy
导入库:
from fuzzywuzzy import fuzz
让我们做一个简单的测试。
fuzz.ratio("Let’s do a simple test", "Let us do a simple test")

如图所示,结果“93”意味着这两个字符串有 93%的相似性,这是相当高的。
当你有一个字符串列表,并且你想搜索所有字符串的时候,FuzzyWuzzy 会帮助你提取最相关的字符串。
from fuzzywuzzy import processchoices = ["Data Visualisation", "Data Visualization", "Customised Behaviours", "Customized Behaviors"]process.extract("data visulisation", choices, limit=2)
process.extract("custom behaviour", choices, limit=2)

在上面的例子中,参数limit告诉 FuzzyWuzzy 为您提取“前 n 个”结果。否则,您将获得一个包含所有这些原始字符串及其相似性得分的元组列表。
4.TQDM

照片由 Jungwoo Hong 在 Unsplash 上拍摄
你通常使用 Python 开发命令行工具吗?如果是这样,这个有趣的库将在您的 CLI 工具处理一些耗时的事情时通过显示进度条来指示已经完成了多少来帮助您。
再次使用pip进行安装。
pip install tqdm
当你有一个使用range函数的 for 循环时,只需用 tqdm 的trange来代替它。
from tqdm import trangefor i in trange(100):
sleep(0.01)

更一般地,你可能想要循环一个列表。使用 tqdm 也很简单。
from tqdm import tqdm
for e in tqdm([1,2,3,4,5,6,7,8,9]):
sleep(0.5) # Suppose we are doing something with the elements

tqdm 不仅适用于命令行环境,也适用于 iPython/Jupyter 笔记本。

图片提供:https://github.com/tqdm/tqdm
5.彩色光

你想给你的命令行应用增加一些色彩吗?Colorama 可以让您轻松地以自己喜欢的颜色输出所有内容。
再次安装 Colorama 需要pip。
pip install colorama
Colorama 支持在“前景”(文本颜色)、“背景”(背景颜色)和“样式”(颜色的额外样式)中渲染输出文本颜色。我们可以进口
from colorama import Fore, Back, Style
首先,让我们用黄色显示一些警告。
print(Fore.YELLOW)
print("This is a warning!")

然后,让我们试着用红色背景显示一些错误。
print(Back.RED + Fore.WHITE + "This is an error!")

那红色太亮了。让我们使用“暗淡”风格。
print(Back.RESET + Style.DIM + "Another error!")
在这里,我们设置“重置”为回改变背景颜色为默认。

“暗淡”风格使字体看不见。当我们想把一切恢复正常时,只需将“样式”设置为“重置所有”
print(Style.RESET_ALL)

摘要

照片由 twinsfisch 在 Unsplash 上拍摄
感谢这些为 Python 社区做出贡献并使其繁荣的开源开发者。
在我见过 Bashplotlib 库之前,我不得不说我从来没有过在命令行环境中绘制数据的想法。不管它对你是否有用,我要说的是,人们的发展思想和创造力的多样性从未停止。
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@qiuyujx/membership)
如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和成千上万的其他作者!(点击上面的链接)
Jupyter 笔记本扩展,用于全面组织的数据科学项目
解释了 5 个实用的 Jupyter 技巧…
在数据科学项目笔记本上工作时,我每分钟都在创建代码和标记单元格,打印变量,获得结果,可视化数据,尝试数十种可视化效果以找到最好的……如果我在整个过程中没有保持良好的组织,我就无法在截止日期前完成项目。
在这篇文章中,我将分享我每天在做项目时使用的 Jupyter 笔记本扩展。
如何安装 Jupyter 笔记本扩展?
在终端:
pip install jupyter_contrib_nbextensions
在朱庇特笔记本里:
! pip install jupyter_contrib_nbextensions
安装笔记本扩展后,点击主页标签,然后点击nb 扩展。

选择可折叠标题、代码折叠、目录(2)、Autopep8 和 ExecuteTime。

打开笔记本后,您会看到下面的工具栏。

是时候发现这 5 个扩展了:
1.可折叠标题
这种扩展将使你在技术演示中更有条理。
这是你所有的项目:只有一行!

浏览这些可折叠的标题非常容易。
2.代码折叠
这是代码单元中一个可折叠的标题。如果你使用这个扩展,你的代码会看起来更短。隐藏长代码单元格。蓝色左右小箭头表示可以打开这条线。

3.目录
这是笔记本中目录扩展的图标。

当你点击它时,左边会弹出一个窗口。

您可以通过单击设置按钮来更改设置。


在这个扩展中最好的事情是,你什么都不做。目录是自动准备的。你只需将标题放在减价单元格中,它就会自动给你的标题编号。爱死了!
4.Autopep8
什么是 PEP-8 风格?
PEP-8 是关于如何编写易读和一致的代码的指南。它是由吉多·范·罗苏姆、巴里·华沙和尼克·科格兰在 2001 年写的。
如何安装 autopep8?
python3 -m pip install autopep8
这段代码将 autopep8 安装到 Python3 上
如何使用 autopep8?
前往您想要符合 pep8 标准的单元格。只需点击工具栏上的这个图标。

它会改变你的代码,

变成类似的东西。

酷!
5.执行时间
如果要处理大量数据,执行时间很重要。你试图降低计算成本,让你的代码运行得更快。您可以测量所有单元的运行时间和时间戳,而不是使用%timeit 或%time 命令。


结论
Jupyter 笔记本有大约 60 个扩展。我只分享了其中的 5 条,它们让我的生活变得更轻松。只需点击即可发现其他扩展。
非常感谢您对 seymatas@gmail.com 的任何建议!
用于训练 GANs 的 5 个 Kaggle 数据集
GANs 入门的有用数据集

生成对抗网络(GANs)是一组深度神经网络模型,由 Ian Goodfellow 在 2014 年推出,用于生成合成数据。GANs 已被用于各种各样的任务,包括改善天文图像,提高旧视频游戏的分辨率,以及最著名的应用“deepfakes”,涉及人类图像合成。在本帖中,我将介绍一些可以用来训练 GAN 模型的有趣数据集。这个数据目录可以作为那些有兴趣开始构建 GAN 模型的人的起点。
我们开始吧!
首先,让我们简要回顾一下 GAN 模型背后的概念。GAN 由两个竞争的神经网络、一个生成器和一个鉴别器组成。生成器是一个修改的卷积神经网络,它学习从噪声中产生合成数据。鉴别器是一个卷积神经网络,它学习区分伪数据和真实数据。随着模型训练的进行,鉴别器在区分真实和虚假数据方面变得更好,生成器在生成真实数据方面变得更好。
现在,让我们进入一些有趣的数据集。
抽象艺术数据

这个数据集包含了 2782 幅从 wikiart.org 刮来的抽象艺术图像。此数据可用于构建 GAN,以生成抽象艺术的合成图像。数据集包含梵高、达利、毕加索等的真实抽象艺术图像。
用秀丽隐杆线虫进行高含量筛选

该数据包含与使用蛔虫秀丽隐杆线虫寻找新型抗生素的筛选相对应的图像。该数据包含感染了一种名为粪肠球菌的病原体的蛔虫图像。一些图像是未经抗生素氨苄青霉素处理的蛔虫,其他图像是经氨苄青霉素处理的感染蛔虫。对于那些对将 GANs 应用于有趣的药物发现问题感兴趣的人来说,这是一个很好的起点!
肺部胸部 X 线异常

该数据集包含由放射科医师临床标记的胸部 X 射线图像。有 336 个患有肺结核的胸部 X 射线图像和 326 个对应于健康个体的图像。对于那些对使用 GANs 进行医学图像数据合成感兴趣的人来说,这是一个很好的数据源。
假面

这些数据实际上包含了 GANs 生成的人脸合成图像。这些图片是从网站上刮来的这个人不存在。每当你刷新页面时,该网站就会生成一个由 GAN 生成的新的假人脸图像。对于用 GANs 生成合成图像来说,这是一个很好的数据集。
戴眼镜还是不戴眼镜

这个数据集包含戴眼镜的人脸图像和不戴眼镜的人脸图像。虽然这些图像是使用 GANs 生成的,但它们也可以作为生成其他合成图像的训练数据。
结论
总之,在这篇文章中,我们讨论了五个 Kaggle 数据集,它们可以用来生成 GAN 模型的合成图像。这些数据源应该是您尝试 GANs 的良好起点。如果你对一些帮助你开始使用 GANs 的有用代码感兴趣,可以看看这篇GANs Kaggle 笔记本简介。我希望你觉得这篇文章有用/有趣。感谢您的阅读!
与数据隐私相关的 5 个关键人工智能问题
隐私
解决机器学习模型的问题将如何提高数据隐私合规性

隐私不仅是与人工智能(AI)相关的问题,也是任何数据相关领域的问题。它是关于人们控制他们的个人数据和基于这些数据做出的决定。
在欧洲,2018 年生效的《一般数据保护条例》( GDPR)规范了个人数据的收集和使用。[1]数据保护法并未明确提及人工智能或机器学习,但重点关注个人数据的大规模自动化处理和自动化决策。这意味着,如果人工智能使用个人数据,它就属于该条例的范围,并适用 GDPR 原则。这可以通过使用个人数据来训练、测试或部署人工智能系统。不遵守 GDPR 可能会导致相关公司受到巨额处罚。
一些个人数据的例子包括出生日期、邮政编码、性别,甚至是用户的 IP 地址。
具体来说,GDPR 教赋予个人不受完全自动化的决定支配的权利。对人工智能专家来说,关键问题是:当你在人工智能的帮助下对一个人做出决定时,你如何证明你公平、透明地对待了他,或者给他们机会质疑这样的决定?
尽管 GDPR 与欧洲和英国最为相关,但其主要原则和思想应该与全世界相关。
从人工智能的角度考虑什么?
虽然模型的公平性和可解释性是人工智能中活跃的研究主题,但在数据隐私方面,你可能已经考虑了至少 5 个因素。
1)阶层失衡
当你的培训标签不成比例地偏向某个特定的班级时,就会出现班级失衡。换句话说,在二进制分类问题中,输出为 0 的例子很多,但输出为 1 的例子很少,反之亦然。这可能是由于数据收集过程中的偏差,例如仅从本地分支机构收集的数据,或者是域的固有属性,例如在制造过程中识别异常数据点。
类别不平衡是模型偏差最常见的原因之一,但它经常被数据科学家忽略。这是因为,通常,微小的不平衡不会造成巨大的风险,因为模型可以同样好地学习所有类的特征。然而,当出现严重的阶级失衡时,事情就变得棘手了。具体来说,少数阶级会更难预测,所以你的模型偏向多数阶级。
例如,当你训练一个人工智能系统来识别图像时,你可能会面临许多潜在的问题,类别不平衡可能就是其中之一。想想一组 100,000 张图片,其中只有 100 张是猫的图片,99,900 张是狗的图片。你训练的人工智能系统更有可能预测一只狗,因为它被训练得更频繁;它没有足够的反面案例来准确区分这两种类型的图像。
这个潜在的问题并不像错误地给猫和狗分类那样无辜。假设您正在训练一个接受或拒绝个人贷款的模型,而大多数历史贷款都被拒绝了(出于某种原因)。你猜怎么着。您的模型可能会拒绝大多数或所有未来的贷款申请,因为它更多地暴露于此类信息,并且可能没有学会区分这两种情况。从数据隐私的角度来看,这是一个问题,因为该模型不会产生公平的结果。
缓解措施:
首先,尽早确定这是否是一个问题非常重要。你可以通过了解属于你的每个类的数据点的数量来检查:df[‘your_label’].value_counts()
如果您确实注意到了类别不平衡,但是您仍然对您的数据运行一个简单的模型,那么您可能会在准确性方面得到很好的结果。您的测试数据可能与您的训练数据遵循相同的分布,因此,如果大多数实例主要来自一个类,则总是预测该类会给出良好的准确度分数。
但是不要被这个愚弄了。通常情况下,混淆矩阵会让你更好地了解你的模型实际在做什么。减轻相关问题的一个主要且最简单的策略是随机重采样。您可以减少多数类以匹配少数类(欠采样)或过采样少数类。
实际上,
count_0, count_1 = df.target.value_counts()
df_class_0 = df[df[‘your_label’] == 0].sample(count_1)#under sample
或者
df_class_1 = df_class_1.sample(count_0, replace=True)#over sample
你同样可以像 Imblearn 一样使用 NumPy 或其他库对数据进行采样。此外,还有很多方法可以解决这个问题,比如 SMOTE 和 Tomek 链接。
2)易受敌对攻击
对一个人工智能系统的对抗性攻击可以完全扰乱系统。例如,图像识别系统被证明有弱点或容易受到恶意攻击。研究人员已经表明,即使人工智能系统在成千上万张图像上进行训练,图像中精心放置的像素也可以从根本上改变人工智能系统对它的感知,从而导致错误的预测。[2]这可能会对涉及个人身份识别的实际应用产生严重影响。想象一个安全摄像头拍摄的场景,其中 AI 系统因为这种类型的攻击而错误地识别了罪犯。
缓解措施:
我们需要让我们的深度学习模型更加健壮。不幸的是,这个问题很棘手。目前,全球顶尖大学正在对这一问题进行研究。然而,在理论上,你应该能够测试你的模型,不仅仅是在一个看不见的测试数据集上,还可以模拟这些敌对的攻击来评估它的健壮性。深度学习模型中被错误激活的神经元可能会被丢弃,以提高鲁棒性。【2019 年的这篇文章讨论了这样的方法。
3)再现性和一致性
人工智能中的一个常见问题是,复制我们获得的结果或我们生成的模型有多容易。许多算法在训练它们的模型时具有随机元素。因此,不同的训练运行产生不同的模型(假设不同的随机种子),并且不同的模型可能具有不同的预测结果。我们如何确保与个人有关的预测不会被基于相同数据训练的下一个模型逆转?
此外,在本地机器上使用我们的数据表现良好的系统,在现场测试时可能表现不佳。我们如何确保我们最初拥有的性能传播到部署的应用程序?我们如何确保系统的性能不会随着时间的推移而恶化,从而影响对个人的决策?
缓解措施:
这些是多重相关的问题,需要采取多种方法。为了确保结果的一致性,您通常应该采用交叉验证技术,以确保您的结果不是基于训练集和测试集的幸运分割。参见这篇文章获得实践指导。
此外,对于预测模型,您可以进行反向测试,并评估如果在过去的某个时间点部署它,并且仅给出到该时间点的训练数据,性能会如何。
此外,在具有相似输入的完全不同的数据集上评估您的模型,以检查其在给定数据集之外的泛化能力,这是一个好主意。不过,重要的是,当您在现实世界中部署模型时,数据应该遵循与您的训练模型相同的分布。在任何其他情况下,性能都会不可预测地下降。
最后,监视已部署的模型并评估其在新数据上的性能始终是一个好的实践。在性能突然下降或漂移的情况下,这可能是模型需要重新训练的信号。当然,这也将取决于具体的应用。根据应用程序的不同,您可能有一个适当的再培训策略,每天、每周、每季度、每年等等都有一个新的模型。
4)评估指标
构建人工智能系统的关键问题应该是“我们如何评估系统?”。最常见的指标之一是准确性。换句话说,无论你的模型在所有测试样本中预测正确与否。但是准确性是一个好的衡量标准吗?想想一个问题,你有 100 个女人,其中 10 个怀孕了。假设你有一些关于这些妇女的信息,你试图建立一个模型来预测谁怀孕了,谁没有。你这样做,你的模型有 85%的准确率。这是否意味着你有一个好的模型?另一方面,让我们假设你没有模型,你宁愿做的是预测所有女性都没有怀孕。令人惊讶的是,这个准确率高达 90%,因为你 100 次中有 90 次是正确的。这比你上面创建的实际模型更好吗?那么,我们使用什么指标,我们如何评估模型的性能?对于影响个人的决策,你会仅仅依靠准确性吗?
缓解措施:
答案显然是否定的。事实上,通常情况下,最好的方法是比较多个指标,并仔细检查混淆矩阵,以了解您的模型的优点和缺点。
因此,对于上述有 90%准确率的简单方法,F1 分数实际上是 0,因为没有真阳性(只有真阴性)。相反,您 85%准确性的模型实际上可能有 67%的 F1 值,这在特定应用中可能是可接受的,也可能是不可接受的。要寻找的其他度量是接收器操作特性(ROC)的曲线下面积(AUC)、精确度、召回率和特异性,仅举几个例子。
5)黑天鹅事件
依靠历史数据来预测未来并不总是可行的。一个很好的例子是试图预测股票市场。由于多种原因,这在本质上是困难的。利用长期以来具有某种结果的数据,可以创造出在其历史范围内有效的模型。这意味着,如果你在一个没有市场崩溃的时期训练一个模型,这个模型是不可能预测到市场崩溃的。即使你在市场崩盘期间训练了它,由于事件的罕见性和缺乏指向该方向的明确信号,该模型仍然不太可能知道何时会发生崩盘。现在,想想在全球疫情时代做出影响个人决策的模型。因为所有的模型在过去都没有类似的数据,所以不太可能像在疫情之前那样准确地对个人做出决策。
缓解措施:
在这种情况下,为了在新的现实中操作,模型可能需要利用从新的情况中获取的数据进行重新训练。这可能会暂时奏效,直到行为再次转变到旧的标准。如果重新培训是不可能的,那么就不应该自动做出决定,因为它们很可能是错误的。这需要测试和验证。
总而言之,在我们的模型运行的当前假设下,预测黑天鹅事件是不可能的。对个人进行预测和决策,因为你知道你预测的数据与你训练的数据不遵循相同的分布,这样做是不负责任的。这并不是说模型不能作为咨询工具。除了“所有的模型都是错的,只有一些有用”——乔治·博克斯。
[1]https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri = CELEX:32016 r 0679&from = EN
[2]https://arxiv.org/pdf/1710.08864.pdf
将推动您的数据科学之旅的 5 个关键点
将促进您学习过程的关键主题。

近年来,数据科学获得了极大的普及。越来越多不同领域的企业投资数据科学,从数据中创造价值。在某些领域,新的业务是根据数据科学创建的。计算能力和技术的进步可能会给数据科学领域带来更多关注。因此,对数据科学家和数据工程师的高需求不足为奇,这促使许多人转行到数据科学领域工作。我是大约一年半前开始数据科学之旅的积极参与者之一。在这篇文章中,我想分享 5 个要点,我认为这将使你成为一名数据科学家的道路更加稳健和敏捷。我将要讨论的观点通常不被重视,在某种程度上被忽视了。我想强调它们对您的数据科学之旅的重要性和贡献。
1.简单更好
具有许多层的深度学习模型可能对你来说很有吸引力,但大多数时候,它们比必要的更复杂。用更简单的模型来完成任务总是可取的。图像识别任务可能需要深度学习模型,但我们不需要那么复杂的流失预测。业务需求在这里也扮演着重要的角色。如果 90%的准确率满足需求,就不需要额外的复杂度。随着模型变得越来越复杂,它们需要更多的计算能力,这意味着额外的成本。此外,深度学习模型需要大量数据。我们需要向他们提供过量的数据,以便获得准确且不会过度拟合的模型。数据和计算能力都意味着成本越简单越好。
2.线性代数有魔力
线性代数就像是幕后英雄。数据有许多不同的格式,如数字、文本、图像、声波。但是,数据必须转换成数字,模型才能理解它。数据采用表格格式(即行和列),用矩阵表示。因此,大量的计算是在模型的训练过程中完成的,这就是线性代数发挥作用的地方。这些计算是基于矩阵或向量运算,这是线性代数的核心。当梯度下降算法通过模型收敛工作时,矩阵/向量计算在遮光罩下完成。我们看不到他们。我们更感兴趣的是最终的结果,即准确性或损失。但是,为了让我们的理解更进一步,超越准确和损失,我们需要对线性代数概念有一个全面的了解。一开始可能会很无聊,但一旦你掌握了它,就会变得令人兴奋。我强烈建议抽出时间学习线性代数,因为它是您数据科学旅程中的基础之一。
3.领域知识是成功的关键
数据科学应用旨在解决问题或改进流程。例如,机器学习可以用于做出明智的商业决策。但是,那些问题和过程是什么呢?我们决定应用机器学习技术的目的是什么?
我们需要有领域知识来回答这些问题。我们可能非常擅长数据预处理、特征工程或模型选择和实现。然而,我们的技能组合在领域知识方面更加完整。例如,如果我们正在构建一个用于石油生产的机器学习产品,我们需要知道原油蒸馏过程的细节。收集什么样的数据以及它们的含义是揭示我们的模型的有价值信息的重要问题。我并不是说我们应该成为石油生产方面的专家,但是学习过程的动力学是绝对有益的。
领域知识也在数据预处理步骤中帮助我们。我们可以在处理缺失值时做出明智的决策。如果我们理解了潜在的过程,某些特征之间的相关性就更有意义了。
4.做项目
数据科学之旅从学习基础知识开始。有很多很好的资源可以帮助你开始。数据科学课程介绍有助于熟悉该领域。更实用的课程可能侧重于使用特定的工具或软件包,如 TensorFlow 或 PyTorch。开源包的文档也非常丰富。根据你的背景,你可能还需要学习一些编程或软件课程。
一旦基础完成。是时候开始做项目了。我们从项目中学到的东西不局限于某些主题或工具。但是,从项目中学到的最有价值的技能是正确处理问题的能力。我们解决问题的方式是创造一个强大且有价值的模型或产品的关键。在不同领域做大量的项目不仅会提高我们的实践技能,还会增强我们作为数据科学家的思维方式。
5.优化算法非常重要
我们获取原始数据。清理一下。应用数据预处理和特征工程技术。创建一个模型。然后用我们准备的数据训练模型。训练模型以确定模型参数,从而尽可能正确地映射特征和目标之间的关系。
学习参数的过程被称为优化,并且在该过程中使用的技术是优化算法。例如,随机梯度下降是机器学习和深度学习中广泛使用的优化算法。对优化算法的全面理解有助于更好地解释模型。我们可以更好地理解准确性和其他性能指标。因此,我们将能够以结构化的方式改进我们的模型。
我们讨论的五个要点并没有涵盖您在数据科学领域需要学习的所有材料,而是强调了可能容易被忽略的非常重要的概念。
感谢您的阅读。如果您有任何反馈,请告诉我。
参考
职业发展的 5 个关键(作为一名数据科学家)
在这篇文章中,我想讨论我用来浏览数据科学职位网格的 5 个技巧。我希望这些建议能帮助你找到自己的路,迎接新的和令人兴奋的挑战,无论是在你现在的公司还是在新的公司。
因为我对清单生活很感兴趣,所以我希望你能从这篇文章中学到些什么:
- 关键 1: 在数据科学(以及可能的其他职业)中导航你的职业是网格;这不是梯子。
- 关键二: 强迫自己进行看起来(甚至可能是)不舒服的对话。
- 关键三: 知道自己想要什么,确保那些帮你职业导航的人也知道自己想要什么。
- 关键 4: 追踪你的成就——包括个人和团队的成就。
- 关键 5: 愿意做出你知道自己应得的艰难决定。
如果你刚刚开始成为一名数据科学家的旅程,我建议你从我之前的文章 开始,7 个步骤让你成为一名数据科学家 。然而,如果你已经获得了作为数据科学家的第一份工作,首先,恭喜你!其次,我希望这篇文章能帮助你晋升。
关键 1:
在数据科学中导航你的职业生涯是一个网格;这不是梯子。
一旦你想通了关于你职业生涯的大问题(参见)在你作为一名数据科学家的道路上,你仍然有几条路可以选择。
让我们开始定义作为数据科学家的不同团队的路径网格。你可能会在很多团队中工作——研究、产品、营销、战略等等。在这些领域中的任何一个,你可能会决定走管理之路或者个人贡献者之路。
两条路径都从相同的基础标高开始:
数据科学家 I →数据科学家 II →高级数据科学家
然后对于 管理器 路径,你可以按以下方式上移:
DS 经理→DS 高级经理→DS 总监→DS 高级总监→DS 副总裁
而对于 个人撰稿人 接下来的步骤是:
职员 DS →高级职员 DS →首席 DS →杰出 DS
一个雇员可能看起来像 :
数据科学家 I:(产品) 你在产品中执行 A/B 测试。
数据科学家二:(营销) 然后你接着执行媒体混合模型进行营销。
高级数据科学家:(产品/工程) 接下来,您将承担一个更重要的工程任务,在这个任务中,您将在 A/B 测试平台中构建新功能,以支持不同的 A/B 测试场景。
****员工数据科学家:(研究/工程)鉴于您的 A/B 测试背景,您的任务是领导与构建一个平台相关的研究,该平台为营销和产品测试环境整合了多臂工具。
在矩阵形式中,如下所示:

让我们考虑第二种可能的情况。
数据科学家 I:(产品/研究) 你的任务是确定公司如何利用新的深度学习技术来改善现有的推荐服务。
数据科学家 II:(产品/研究) 你获得一些起步成功,你的任务是衡量你的新算法比现有算法好多少。您构建了一个框架,用您的新方法来测试现有的方法。然后你被要求去影响你的利益相关者,你的新建议在对业务有意义的方面确实更好。
高级数据科学家:(Product) 您的说服策略奏效了,并为您提供了新的机会来领导所有推荐服务的实施和测试工作。您与几个利益相关者密切合作,通过公司内的多条产品线建立多种策略,并扩展推荐服务。
****经理数据科学家:(产品)你将被分配到一个团队,协助处理公司所有与推荐服务相关的请求。你要确保团队成功满足这些要求。
在矩阵形式中,如下所示:

你不需要马上知道你想做什么,但是要知道在这个过程中有很多不同的机会可以选择。睁大你的眼睛寻找机会,因为它们可能就在你面前。
关键 2:
强迫自己进行看起来不舒服的对话。
支持与更高层领导不一致的决定(或你的特定经理的决定)可能会让人不舒服。
即使到了提问的时间,在满是同事的房间里大声说话也会让人不舒服。
要求升职可能会让人不舒服。
然而,这些不舒服的时刻往往会帮助你脱颖而出,它们是事物宏伟计划中如此微小的一瞥。这些时刻向你的同事表明你是来改变现状的。你在那里不是为了在房间的后面划分区域,而是为了让公司朝着更好的方向发展。在这些不舒服的时刻,你可以获得尊重,并最终改变你职业的方向。
记住,在进行可能会让人不舒服的对话时,要表现出额外的尊重。收集和分析数据,对你即将开始的艰难对话做出明智的决定,然后坚持你的决定。
关键 3:
知道你想要什么,确保那些帮助你规划职业生涯的人也知道你想要什么。
重要的是,当你在一个组织中导航时,你要主动与你的经理沟通。你的经理是最能帮助你实现职业目标的人。
取决于你和你的经理有多亲密,你可能很难提前说出你的职业发展方向,以及你实现每个目标的途径。然而,如果你的职业期望和你的经理对你职业的期望不一致,当你的期望没有得到满足时,这种不一致肯定会让你感到沮丧。
在你着手的项目的复杂性和类型方面,不一致可能会发生。这可能发生在你获得晋升的时候。这可能发生在你最终和谁一起工作,以及其他团队如何看待你作为团队成员的能力。你不会希望这一切发生的!
为了避免期望值不一致,定期与你的经理进行一对一的沟通。为你的目标建立清晰明确的路径——这些目标可能是升职,在特定项目中担任领导,或者你想从事的新项目。
最终,你是自己成长的主要利益相关者。知道自己要走什么路。了解如何实现目标,并确保定期与经理沟通以实现目标!
关键 4:
追踪你的成就。
与上一点一样,你是自己成长的主要利益相关者。让你的经理很容易看到你的贡献,并表明你在坚持你在一对一中设定的道路。记录你的贡献,以及它们如何与你的目标直接相关。
你提供的细节越多越好。这些细节包括日期,你的角色,完成了什么* ed,涉及的其他团队成员,以及业务影响。***

如果你在指导其他团队成员,记录这些努力。如果你定期为生产代码库或开源资源做贡献,记录这些努力。如果你正在参加利益相关者会议并影响公司文化,你猜对了,记录下这些努力。
人们很容易忽略那些没有记录他们在一个月、一个季度或一年内完成了什么的人。另一方面,很难忽视这样一个人,他与经理一起设定了期望目标,并记录了他们是如何实现这些期望的。
关键 5:
愿意做出你知道自己应得的艰难决定。
改变是艰难的。
离开一份对你来说没有挑战性的工作,换一份可能会有挑战性的工作,是令人兴奋的,但也是可怕的。如果你不知道自己在新的岗位上要做什么,该怎么办? 忽略这个内在的声音,你绝对会想出来的!
如果你离开这家公司,你将不得不在一家新公司重建你的声誉,交一群新朋友。别人不喜欢你怎么办? 忽略这个内在的声音,他们是要爱你的!
如果你已经完成了关键步骤 1-4,并且你发现你自己没有在你的组织中实现你的职业目标,那么可能是时候去别处看看了。如果你发现自己正在寻找一个新的角色,通过执行步骤 1-4,你从未像现在这样准备好去获得一份数据科学家的好工作。你能做到的!

从像素箱贴上标签以便重复使用
最后一点,我发现 这本书 是了解组织内人们如何看待数据科学的绝佳资源。希望大家都来看看!
5 Seaborn 绘制了许多科学家不知道的数据

但是真的应该尝试
Seaborn 是 Python 中最流行的可视化库之一,它提供了大量的绘图方法,其中一些方法很多人并不熟悉。在本文中,将介绍五个相对不为人知的 Seaborn 地块(和一个复活节彩蛋),以及图表、潜在的用例、代码和解释。
箱线图
箱线图是出了名的糟糕的可视化,因为它们隐藏了带有一些潜在误导性数据统计表示的分布。虽然在某些情况下,箱线图可能是数据的适当表现,但特别是对于大分布,用于绘制箱线图的五个数据点是远远不够的。

来源:Autodesk Research。图片免费分享。
“箱线图”是箱线图的扩展,试图通过增加更多的分位数来解决箱线图的问题。箱线图代表四分位数,即数据的四个部分的宽度,而箱线图可以将数据分成更多的分位数,以便更深入地了解数据的形状,尤其是分布的尾部。

Boxenplots 有许多每个 seaborn plot 都有的标准参数,但不同的参数包括scale、outlier_propfloat和showfliersbool。
聚类热图
虽然热图有助于可视化关系,但聚类热图提供了对矩阵层次结构的深入了解。聚类热点图通常用于相关矩阵(两个要素的每种组合之间的相关性),但实际上也可用于任何矩阵,只要其元素处于相同的比例。

有许多热图聚类算法和方法,但每一种都试图通过最重要的元素来分解维度,在较低的级别将相似的特征(可能通过相关性或另一种度量)聚类在一起,在较高的级别将更不同的元素聚类在一起。然后,顶部的二元分割应该代表在特征中提供最不同信息的两个元素。

如果两个特征在最底部组合在一起(如上图中的 A 列和 B 列),那么它们一定非常相似,并且包含相关信息。你可以在这里阅读更多关于聚类算法的内容。
脱衣舞场
去废图显示单个数据点,但沿宽度方向随机显示,这样即使数据点重叠,它们也是可见的。它们是高度可定制的,具有对透明度、形状和重叠的控制。

然而,在实践中,剥离图很少是最具信息性的可视化方法。相反,它们可以用作其他图(如箱线图或紫线图)顶部的抖动,以帮助查看者理解数据的真实分布。

剥离图是高度可定制的:例如,您可以在显示透明抖动时标记特征的方式,或者通过创造性地使用网格和旋转剥离图来创建点图。

群集图
虽然条带图利用随机性来显示重叠点,但群集图采用一种更系统的方法来显示重叠值,方法是堆叠具有相同(或非常相似)值的数据点。

群集图是小提琴图和脱衣舞图之间的可视化;它揭示了数据的对称分布,就像小提琴图,但没有平滑,而是揭示了原始数据点。它以宽度作为一个因素来显示各个数据点,以防止具有相似值的数据点模糊不清,但更具结构化。像条带图一样,群集图可以放置在其他更常见的可视化方法(如箱线图)之上。

点图
一个点状图可以被认为是一个带有垂直条的线形图。这可用于显示误差线、置信区间或数值范围。像传统的线形图一样,点状图可以使用连续的 x 轴;或者简单地绘制分类值之间的视觉差异,如平均值,这使得用户更容易基于连接线的斜率来评估差异的严重性。

点图是特别可定制的,可以控制条的长度、连接点的位置、帽长度、条的厚度等等。

奖励:狗场
seaborn 的创造者放入一个复活节彩蛋,然后 seaborn 会随机传回一张可爱狗狗的高清照片!

来源:Seaborn dogplot。图片免费分享。
这很可能给你的数据可视化项目一个急需的微笑!
感谢您的阅读,请在回复中告诉我您的想法!
如果你对最新的文章感兴趣,可以考虑订阅。如果你想支持我的写作,通过我的推荐链接加入 Medium 是一个很好的方式。干杯!
[## 在 Python 中创建复杂可视化的最简单方法不是使用 matplotlib。
直接从熊猫身上创造流畅简单的情节
towardsdatascience.com](/the-simplest-way-to-create-complex-visualizations-in-python-isnt-with-matplotlib-a5802f2dba92) [## 用一行代码彻底美化可视化效果:设计情节
制作吸引人的情节从未如此容易
towardsdatascience.com](/drastically-beautifying-visualizations-with-one-line-styling-plots-35a5712c4f54)
作者创建的图表/用 seaborn 创建的可视化。
作为数据科学家的 5 堂课
以及为什么我决定去做一些新的事情…

Daria Nepriakhina 在 Unsplash 上拍摄的照片
大约一年前,我开始了大学毕业后的第一份全职工作,在 Squarespace 做数据科学家。最近,我决定改变现状,加入了一家名为 Hugo 的快速发展的初创公司,致力于发展。
这种远离数据科学进一步专业化的弯路让很多人感到惊讶。我还是有点惊讶。作为第一次担任数据科学家,我从技术和功能的角度学到了很多东西。
这篇文章是我试图保留其中的一些想法,同时希望从我作为数据科学家的第一个角色中为你提供一些有价值的收获。
投资你的团队
当我在成长过程中打棒球时,我总是专注于尽我所能帮助我们获胜,而不是为自己创造数字。有时,这甚至对我有害。
直到去年,我才真正把这种想法带到我的职业生涯中。在实习和 Squarespace 初期,我非常专注于证明自己和建立信誉。直到我适应了自己的角色,并感觉到作为一名数据科学家受到了审查,我才能够将我的思维转移到我希望团队去哪里,以及我如何才能帮助我们到达那里。
在一家初创公司工作,我注意到这种心态很好地延续了下来。在一天结束的时候,组织和运动队并没有什么不同。你仍然可以专注于个人进步,同时努力让团队更接近某个目标。通常,它们被证明是同一个东西。
确定项目范围很难
令人惊讶的是,作为一名数据科学家,规划出能够推动影响力的项目是最困难的事情。我开始采用自上而下的方法。我会关注利益相关者提出的问题,然后努力想出可能的答案。这在某种程度上是有效的,但是我经常在试图解开一个模糊问题的混乱时陷入困境,而没有立即的行动能力。
随着我的进步,我的过程变得越来越自下而上。我会看看我今天能做些什么来产生更小但更与 T2 相关的影响。我仍然认为我天生倾向于自上而下的思维,但是我现在看到了在组织中自下而上解决问题的好处。根据您的具体情况,这可能会有所不同。尝试这两种方法,看看是什么推动了局势的发展。
当有疑问时,原型它
有句经典台词,“不要请求允许,请求原谅。”这在大多数情况下有点极端,但这里有一定的道理。如果你有一个你认为非常重要的想法,花时间去尝试并获得利益相关者的认可并不总是最好的。给他们看看。
找到你能做的最少的可行的工作来证明这个项目,并从那里开始。这可能是一个概念证明,或者简单到一页纸的项目简介。仅仅是把你的想法清楚地写在一个简短的文件里就已经很有帮助了。
这里还有一个额外的好处,那就是一旦你做了一点工作,项目有了一些希望,其他人就不太倾向于在接下来的步骤中后退。我发现这是对大型团队产生影响的最快方式。
有观点是好的
在组织中做决策时,很难避免集体思考。事情变得非常复杂,尤其是当你考虑到公司政治和历史等变量的时候。现实是你不能控制一切,但你可以通过做一件简单的事情来提供帮助:发表意见。
这并不意味着成为房间里声音最大的人,或者在你不知道发生什么事情的时候,主动提供“热门话题”。相反,这意味着当你被告知某事时,有一个强烈的观点并分享它。大多数讨论都以每个人都坐在“可能”的范围内而告终。轶闻被扔掉,信息被共享,但是团队并没有更进一步做出决定。
即使其他人不同意你的观点,你仍然在帮助对话向决策靠近。这可能会有点不舒服,但其他人会感谢这种贡献。更快、更全面的决策对每个人都有好处。
确保有人拥有它
最后,这不是火箭科学,但却是非常重要的。给几乎所有的东西指定一个主人。每个人都有一百万个球在空中。每个人都人手不足。每个人都有不同的激励和对他们重要的项目。如果你认为别人会接手一个项目,那你就大错特错了。
关键是要明确。职场神惩罚模糊的愿望奖励具体的要求。如果你想让某人做某事,去问他们。如果您想要自动询问,请指定一个所有者。把这两件事记在心里,你的生活会轻松得多。
离别的思绪
作为一名数据科学家,我没有任何抱怨。事实上,我很喜欢。数据科学是一个快速增长的高杠杆领域,有一个非常酷的额外好处。每天去工作非常有趣,在那里我可以进行深入的分析,制作很酷的东西,并为产品决策提供信息。
话虽如此,许多关于在数据中工作的反驳都是真的。当作为一名大型团队的分析数据科学家工作时,你很少是主要决策者,事情往往不在你的掌控之中。你将在房间里做很多决定,但在最好的情况下,你充当的角色是得力助手。
最终,我决定走向另一个极端,加入一家初创公司,在那里,如果我尝试,就无法避免成为主要决策者。作为一个喜欢快速行动的人,一个自称通才的人,一个想有朝一日成为创始人的人,这种感觉是对的。
我本质上仍然是一名数据科学家,但我还有许多其他兴趣想探索。此外,我内心永远是一名数据科学家。我还不会离开你,朱庇特笔记本。
感谢阅读!在 Twitter 上找到我,不要忘记 订阅 我的每周时事通讯,获取任何新帖子和有趣的链接。看看下面一些类似的帖子:
我在麻省理工学院学到的 5 课
建立精通的心态
如果你是一个喜欢视听的人…
嗨伙计们!我希望你们在冠状病毒避难所期间一切都好。我在海湾地区,在美国的这一边,我们仍然被严格命令呆在家里直到六月初。我已经被关了 8 到 9 周了,这是一个很好的向内探索的时间。
一篇有趣的 2005 年的研究文章,题为 追溯人类细胞的出生日期 ,表明你的大部分细胞在 7 年前更新或重组。这表明,在细胞层面上,2013 年的我与今天的我有着天壤之别。现在,这让我想起了 7 年前我的人生,那是我在麻省理工大学本科生活的中期。这让我开始思考…我在麻省理工学院的时候学到了大约七个关键的经验。今年我最大的自我承诺之一,就是与世界和可能走在类似道路上的人进行更多的交流,分享我的知识和生活经验。毕竟,作为人类物种,我们在一起更强大,不是吗?
以下是我一路走来学到的 5 条经验。
1.设定疯狂而崇高的目标,然后朝着目标采取行动,不可避免地会迫使你成长。

马库斯·温克勒在 Unsplash 上拍摄的照片
在我的本科生涯中,有一段时间我选修了 6-7 门课程,除了一门以外都是技术性的。我超过他们了吗?是的。我在所有这些方面都做得非常好吗?见鬼没有。我为什么要这么做?嗯,至少在美国,大学学费很贵,麻省理工学院最棒的一点是,如果你已经是全日制学生,你不必支付更多的钱来修更多的学分。至少我在的时候,上 4 节课,或者上 7 到 8 节课学费是一样的。这个个人挑战教会了我积极的时间管理的神奇艺术,五年后回头看,与那次经历相比,它让几乎任何课程或挑战都觉得轻而易举。有时,我们学术生活中最艰难的时刻实际上是隐藏的熔炉,它将我们转变为一个最终更准备好、更有能力处理逆境的人。
2.当你给自己足够的时间去学习时,你就能保证在一段稳定的燃烧中取得成果。
好吧,我知道这可能与我之前写的相矛盾。但是事情发生了重大转折,当我决定只上 3 门技术课和 1 门普通课时,这是麻省理工学院推荐给“普通”学生的……我放弃了。我的意思是,那无疑是我度过的最轻松、最轻松、也是学业上最成功的一个学期。我从那个决定命运的学期中学到的一切都是如此清晰明了。也许是因为我实际上正在休息,所以我实际上巩固了从那时起的记忆。我这是在说什么?一切都是为了平衡。如果你绝对迫切地需要像我一样在一个学期内完成 7 到 8 门课(因为你需要节省 5 万美元),那就去做吧。与此同时,如果你想给自己足够的时间灵活性和空间来关注困难的问题,那么你需要考虑到这一点。
3.目标明确,知道自己的理由。否则,你的兴趣只能持续一个赛季。

在 Unsplash 上 engin akyurt 拍摄的照片
你们中有多少人尝试过在大学之外自学或自学,结果却完全忘记了?半开始的项目怎么样?或者一般来说,谁觉得上学的时候生活简单多了?部分原因来自于这样一个事实,当你在学校的时候,你的目标很明确。你需要拿到学位。你需要通过。你需要在某项考试中得到 X。这些目标支撑着你,给你一个目标。你得到一些证书。你生命中的一扇门打开了。
然而,七年后回头看,让现实世界变得更有趣的是,你可以定义自己的目标。你从沙盒的游戏场毕业,进入真实的世界,在那里你有你自己的终极游戏,并且你正在与数以百万计的其他终极游戏互动。所以,如果你想改善这一点,那么第一步就是要真正埋头苦干,弄清楚目标是什么,以及你为什么要做某事。否则,你的兴趣只能持续一个赛季。
4.别挡你的路!

快乐的兔子通过吉菲
我的天啊。我认为麻省理工学院最糟糕(也可以说是最好)的一点是,你周围的每个人都在自己的方面很出色。当你还停留在拿自己和别人比较的思维模式中时,那是很可怕的。当然,这在某种程度上总是会发生的。冥想和超越自我已经创造了奇迹,提示如下。但除此之外,我是真实的。很容易把自己和你周围的聪明人相比较,然后想,“操,我为什么还要努力呢?”我的意思是,我的一个最好的朋友是一个国际化学奥林匹克明星,他会吞下一盒 Franzia,并轻松地通过麻省理工学院最难的算法课程之一。我的室友是一名国际生物奥林匹克神童,现在已经投身于生物技术风险投资领域。其中一人在癌症生物学方面非常出色,她参加了这个项目,在她回到哈佛全职攻读医学博士/哲学博士之前,她被送到了英国牛津大学。
我周围都是了不起的人。当这种情况发生时,或者当你发现自己在朋友的成功周围时,你应该总是让它激励你,鼓舞你。人们很容易想,“唉,为什么我在酵母遗传学方面没有那么出色?或者为什么我高中没有为生物奥林匹克做准备?或者说为什么没有数学背景我就不能毫不费力的解决算法?别说了。只要你在某种程度上成长、学习或进化了,那么你就是好的。
5.纪律不是通过看视频或阅读指南获得的。它存在于你长期形成和规范的习惯中。

沉思的猫,承蒙吉菲
现在是 2020 年,我们生活在一个需要快速解决问题的社会。事实是,无论你消化了多少自助内容,对于培养一种能引导你走向成功的习惯来说,没有什么可以替代。特别是对于特别聪明的人来说,马上填鸭式地学习知识可能很容易。我有一个讨厌的习惯,总是这样做。我临时抱佛脚了吗?完全同意。但是当我用老方法做的时候发生了什么?当我抽出 30 到 45 分钟的常规学习时间。结果是疯狂的。大脑是个有趣的东西——事实证明,你做什么就会成为什么样的人。你就是你的习惯。因此,要形成坚持行动所需的纪律,就要把它们变成习惯。配料很简单:
- 时间盒任务。完成 1 项任务的时间。这意味着写下开始和结束的日期。没有永无休止的故事。
- 建礼。把任务和你已经做的事情联系起来。连锁是让一个新习惯更容易“坚持”的关键。
- 确保你有足够的精力集中精力,只做那一项任务。感觉就像永远一样。然后你会回过头来想,wtf?
专业技巧:这是非常额外的,但这是我如何建立每天 30 分钟的调解练习。从 30 秒开始。然后每天加 10 秒。每天坚持增加 10 秒钟。很快,你就会被吹走。
好了,伙计们,我希望这个视频能让你们所有人在这场冠状病毒疫情中保持健康,并给你们一些思考的食物,因为你们正在寻找可以帮助你们在旅途中学习更多知识或指导你们自己的自学之旅的课程和技巧。再次感谢,期待下次再见。

麻省理工学院基利安法庭,由维基媒体提供
销售预测的 5 种机器学习技术
Python 中线性回归、随机森林回归、XGBoost、LSTMs 和 ARIMA 时间序列预测的比较
预测销售是机器学习(ML)的一个常见和基本的用途。销售预测可用于确定基准,确定新计划的增量影响,规划资源以响应预期需求,并预测未来预算。在本文中,我将展示如何实现 5 种不同的 ML 模型来预测销售。
这个演示的数据可以在 Kaggle 上找到,完整的代码在 GitHub 上。
入门指南
第一步是加载数据,并将其转换成一种结构,然后我们将在每个模型中使用这种结构。在其原始形式中,每行数据代表 10 家商店中某一天的销售额。我们的目标是预测月销售额,所以我们首先将所有商店和天数合并为月总销售额。
def load_data():
url = """https://www.kaggle.com/c/demand-forecasting-kernels
only/download/ryQFx3IEtFjqjv3s0dXL%2Fversions%2FzjbSfpE39fdJl
MotCpen%2Ffiles%2Ftrain.csv"""
return pd.read_csv(url)def monthly_sales(data):
data = data.copy() # Drop the day indicator from the date column
data.date = data.date.apply(lambda x: str(x)[:-3]) # Sum sales per month
data = data.groupby('date')['sales'].sum().reset_index()
data.date = pd.to_datetime(data.date)
data.to_csv('../data/monthly_data.csv')
return datadata = load_data()
monthly_data = monthly_sales(data)
在我们的新数据框中,现在每一行都代表给定月份所有商店的总销售额。

如果我们绘制一段时间内的总月销售额,我们会看到平均月销售额随着时间的推移而增加,这意味着我们的数据不是稳定的。为了使其稳定,我们将计算每个月销售额之间的差异,并将其作为一个新列添加到我们的数据框中。关于信纸和差异的更多细节可以在这里找到。
# Calculate difference in sales month over month
def get_diff(data):
data['sales_diff'] = data.sales.diff()
data = data.dropna()
return datastationary_df = get_diff(monthly_data)
下面是我们的数据在差异转换前后的视觉表现。所有情节的代码可以在这里找到。

比较差分前后的平稳性。莫莉·里伯斯金图片。
既然我们的数据代表月销售额,并且我们已经将它转换为静态数据,我们将为不同的模型类型设置数据。为此,我们将定义两个不同的结构:一个用于 ARIMA 建模,另一个用于其余的模型。
对于我们的 Arima 模型,我们只需要一个日期时间索引和因变量(销售差异)列。
def generate_arima_data(data):
dt_data = data.set_index('date').drop('sales', axis=1)
dt_data.dropna(axis=0)
dt_data.to_csv('../data/arima_df.csv')
return dt_dataarima_data = generate_arima_data(stationary_df)
对于我们的其他模型,我们将创建一个新的数据框架,其中每个特性代表上个月的销售额。为了确定我们的特征集中包括多少个月,我们将观察自相关和偏自相关图,并使用规则在 ARIMA 建模中选择滞后。这样,我们可以保持我们的 ARIMA 和回归模型的回望期一致。

自相关和偏自相关图。莫莉·里伯斯金图片。
基于上述情况,我们将回望期定为 12 个月。因此,我们将生成一个有 13 列的数据框,12 个月中的每个月有一列,另一列是我们的因变量——销售额差异。以下代码摘自巴里斯·卡拉曼的《数据驱动增长》系列。
def generate_supervised(data):
supervised_df = data.copy()
#create column for each lag
for i in range(1,13):
col = 'lag_' + str(i)
supervised_df[col] = supervised_df['sales_diff'].shift(i)
#drop null values
supervised_df = supervised_df.dropna().reset_index(drop=True)
supervised_df.to_csv('../data/model_df.csv', index=False)
return supervised_dfmodel_df = generate_supervised(stationary_df)
现在我们有了两个独立的数据结构,一个是包含日期时间索引的 Arima 结构,另一个是包含延迟特性的监督结构。

销售预测的 ARIMA 和监督数据框架。莫莉·里伯斯金图片。
建模
为了创建和评估我们所有的模型,我们使用了一系列的助手函数来执行以下功能。所有助手功能的代码可以在找到。
- 训练测试分割:我们分离我们的数据,以便过去 12 个月是测试集的一部分,其余的数据用于训练我们的模型
- 缩放数据:使用最小-最大缩放器,我们将缩放数据,以便所有变量都在-1 到 1 的范围内
- 反向缩放:在运行我们的模型之后,我们将使用这个辅助函数来反向缩放步骤 2
- 创建一个预测数据框架:生成一个数据框架,其中包括在我们的测试集中捕获的实际销售额和来自我们的模型的预测结果,以便我们可以量化我们的成功
- 对模型评分:这个辅助函数将保存我们预测的均方根误差(RMSE)和平均绝对误差(MAE ),以比较我们五个模型的性能
回归模型:线性回归、随机森林回归、XGBoost
对于我们的回归模型,我们可以使用 scikit-learn 库的 fit-predict 结构。因此,我们可以建立一个基础建模结构,我们将为每个模型调用它。下面的函数调用上面概述的许多辅助函数来分割数据,运行模型,并输出 RMSE 和梅分数。
def regressive_model(train_data, test_data, model, model_name):
# Call helper functions to create X & y and scale data
X_train, y_train, X_test, y_test, scaler_object =
scale_data(train_data, test_data)
# Run regression model
mod = model
mod.fit(X_train, y_train)
predictions = mod.predict(X_test) # Call helper functions to undo scaling & create prediction df
original_df = load_data('../data/monthly_data.csv')
unscaled = undo_scaling(predictions, X_test, scaler_object)
unscaled_df = predict_df(unscaled, original_df) # Call helper functions to print scores and plot results
get_scores(unscaled_df, original_df, model_name)
plot_results(unscaled_df, original_df, model_name)
# Separate data into train and test sets
train, test = tts(model_df)# Call model frame work for linear regression
regressive_model(train, test, LinearRegression(),'LinearRegression')# Call model frame work for random forest regressor
regressive_model(train, test,
RandomForestRegressor(n_estimators=100,
max_depth=20),
'RandomForest')# Call model frame work for XGBoost
regressive_model(train, test, XGBRegressor(n_estimators=100,
learning_rate=0.2),
'XGBoost')
下面的输出显示了每个回归模型的预测值(红色)叠加在实际销售额(蓝色)之上。虽然结果看起来相似,但细微的差异相当于几千美元的销售额,我们将在下面的比较部分看到这一点。

回归模型预测与实际销售。莫莉·里伯斯金图片。
长短期记忆(LSTM)
LSTM 是一种递归神经网络,对于使用序列数据进行预测特别有用。为此,我们将使用一个非常简单的 LSTM。为了提高准确性,可以添加季节性特征和额外的模型复杂性。
def lstm_model(train_data, test_data):
# Call helper functions to create X & y and scale data
X_train, y_train, X_test, y_test, scaler_object =
scale_data(train_data, test_data) X_train = X_train.reshape(X_train.shape[0], 1, X_train.shape[1])
X_test = X_test.reshape(X_test.shape[0], 1, X_test.shape[1]) # Build LSTM
model = Sequential()
model.add(LSTM(4, batch_input_shape=(1, X_train.shape[1],
X_train.shape[2]),
stateful=True))
model.add(Dense(1))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(X_train, y_train, epochs=200, batch_size=1, verbose=1,
shuffle=False)
predictions = model.predict(X_test, batch_size=1) # Call helper functions to undo scaling & create prediction df
original_df = load_data('../data/monthly_data.csv')
unscaled = undo_scaling(predictions, X_test, scaler_object,
lstm=True)
unscaled_df = predict_df(unscaled, original_df) # Call helper functions to print scores and plot results
get_scores(unscaled_df, original_df, 'LSTM')
plot_results(unscaled_df, original_df, 'LSTM')
结果图看起来类似于上面的三个回归图,所以我们将推迟比较结果,直到我们看到下面的误差。

LSTM 模型预测与实际销售。莫莉·里伯斯金图片。
ARIMA:
ARIMA 模型看起来与上面的模型略有不同。我们使用 statsmodels SARIMAX 包来训练模型并生成动态预测。SARIMA 模型分为几个部分。
- AR:表示为 p,是自回归模型
- I:表示为 d,是区别项
- 马:表示为 q,是移动平均线模型
- 学生:使我们能够添加季节性成分
在下面的代码中,我们定义了模型,然后对过去 12 个月的数据进行了动态预测。对于标准的非动态预测,下个月的预测是使用前几个月的实际销售额进行的。相比之下,对于动态预测,下个月的预测是使用前几个月的预测销售额进行的。
def sarimax_model(data):
# Model
sar = sm.tsa.statespace.SARIMAX(data.sales_diff, order=(12, 0,
0), seasonal_order=(0, 1, 0,
12), trend='c').fit() # Generate predictions
start, end, dynamic = 40, 100, 7
data['pred_value'] = sar.predict(start=start, end=end,
dynamic=dynamic) # Call helper functions to undo scaling & create prediction df
original_df = load_data('../data/monthly_data.csv')
unscaled_df = predict_df(data, original_df) # Call helper functions to print scores and plot results
get_scores(unscaled_df, original_df, 'ARIMA')
plot_results(unscaled_df, original_df, 'ARIMA')
同样,结果看起来相当不错。我们将在下面进一步挖掘。

ARIMA 模型预测与实际销售。莫莉·里伯斯金图片。
比较模型
为了比较模型性能,我们将考察均方根误差(RMSE)和平均绝对误差(MAE)。这些度量都是比较模型性能的常用方法,但是它们的直觉和数学意义略有不同。
- MAE:平均绝对误差告诉我们,平均而言,我们的预测离真实值有多远。在这种情况下,所有错误都具有相同的权重。
- RMSE:我们通过计算所有误差平方和的平方根来计算 RMSE。当我们平方时,较大的误差对总误差有较大的影响,而较小的误差对总误差没有那么大的影响。
从上面的辅助函数中,我们使用 get_scores 来计算每个模型的 RMSE 和 MAE 分数。这些分数被保存在一本字典里,腌起来。为了进行比较,我们将把字典转换成 Pandas 数据框架并绘制结果。
def create_results_df():
# Load pickled scores for each model
results_dict = pickle.load(open("model_scores.p", "rb")) # Create pandas df
results_df = pd.DataFrame.from_dict(results_dict,
orient='index', columns=['RMSE', 'MAE', 'R2']) results_df = results_df.sort_values(by='RMSE',
ascending=False).reset_index() return results_dfresults = create_results_df()
这给了我们下面的数据框架。

我们可以看到,尽管我们的模型输出在上面的图中看起来很相似,但它们的精确度确实不同。下面的图片可以帮助我们看出区别。剧情代码可以在这里找到。

比较模型性能。莫莉·里伯斯金图片。
我们看到的是,总体而言,XGBoost 模型的性能最好,紧随其后的是 ARIMA 和 LSTM 模型。这里需要注意的是,上述所有模型都是以最基本的形式推导出来的,以展示它们如何用于销售预测。这些模型只是稍微调整了一下,以最大限度地降低复杂性。例如,LSTM 可以有许多额外的节点和图层来提高性能。
为了确定哪个模型适合您的用例,您应该考虑以下几点。
- 你对模型的复杂程度和可解释性感到满意。
- 模型可以调整,功能可以设计为包括季节信息、假期、周末等。
- 了解您将如何使用结果,以及数据将如何更新您的模型。
- 使用交叉验证或类似技术调整模型,以避免数据过度拟合。
销售预测介绍的完整代码可以在这里找到。请在下面添加任何问题或意见。
使用 Matplotlib 改进可视化设计的 5 个神奇技巧
应该添加到代码中的新功能的集合

不可能什么都知道,不管我们的经验在这些年里增加了多少,有许多事情对我们来说仍然是隐藏的。这是正常的,也许是一个令人兴奋的动机去搜索和学习更多。我确信这是促使你写这篇文章的原因。
我们知道 Matplotlib 最重要的特性之一是它能够很好地与许多操作系统和图形后端兼容。Matplotlib 支持几十种后端和输出类型,这意味着无论您使用的是哪种操作系统或您希望的输出格式,您都可以依赖它工作[1]。
我正在与你分享我以前不知道的 5 个神奇的技巧和新特性,来提高你使用 Matplotlib 的设计和可视化技能。这些招数会对你的工作助一臂之力,让你的工作更加专业。
如果这些功能中有一个不适合您,请使用以下方法更新您的 Matplotlib 版本:
pip install -U matplotlib
事不宜迟,我们开始吧!
技巧 1:绘图注释
我们今天的第一个技巧是注释,它是在一个点上添加到一个图中的注释类型,以使它更容易理解,澄清更多信息,或者定义该点的角色。

为此,我们将使用 Matplotlib 中的 plt.annotate() 函数。它允许您创建箭头,连接它们,并使它们指向特定的区域。您可以根据自己的代码修改上面的代码行:
这种方法肯定会帮助你以书面形式、乳胶报告、博士论文答辩等方式展示你的工作
招数二:缩放法
我觉得这是最神奇的一招。这个新功能非常有用和有趣,尤其是对研究人员和数据科学家来说。方法indicate _ inset _ zoom()返回一个显示缩放位置的矩形,帮助您显示曲线的特定部分,而无需绘制另一部分。

上面的代码解释了如何调用方法并将其添加到您的绘图中:
招数三:剧情上水印
这个技巧对于解决版权问题很有用。它帮助您将水印添加到可视化设计中。它的使用并不广泛,但在准备可视化项目时,它仍然是一个需要了解的重要特性。在此功能中,您可以使用文本水印或图像水印。

文本水印
要添加文本水印,您可以使用下面一行:
您也可以通过更改上面代码中的第 11、12 和 13 行,将您的徽标或您公司的徽标用作水印。

图像水印
一旦您将徽标添加到主文件所在的目录中,您就可以使用此代码来代替文本水印。不要忘记用您自己的徽标名称来修改“tds.png ”:
招数 4:共享斧头
这些新方法允许在创建后立即共享轴。这为您的可视化效果提供了一个有吸引力和有条理的外观。请确保在使用代码之前更新您的 Matplotlib 版本,因为该方法是新发布的功能。

代码源代码写在下面:
招数五:无限线
这个技巧对数据科学家和机器学习工程师也很有用。它创建了一条通过两点的无限长的线。它可用于分离簇、组或图。

使用下面的代码源来检查这个特性,让我看看您将如何在您的数据可视化项目中应用它:
数据科学家、ML 工程师、数据分析师或业务分析师,您肯定知道 Matplotlib 的强大功能。它是帮助我们高效有力地讲述故事的最佳工具之一,将我们的分析与业务目标联系起来,并获得解释和决策结果。
有了这些功能,你将能够为你的学术或官方项目增添优雅和专业。您将使读者和审阅者更容易理解和跟踪数据可视化产生的信息和解释。
一个设计良好的视觉效果有一些非凡之处:颜色突出,层次协调,轮廓适合整个设计,它不仅具有美丽的美学品质,而且给我们一个有意义的洞察力。你知道数据可视化就像讲故事,这就是为什么你应该尽可能地让它专业和有趣。
最后注意,如果你不熟悉 Matplotlib,推荐你查看这篇有趣的文章给初学者。
感谢您的阅读。敬请关注即将推出的功能!
参考
[1]杰克·范德普拉斯(2016 年 11 月)。” Python 数据科学手册。奥莱利媒体公司出版。
从 R 脚本调用函数的 5 分钟指南
使用谷歌趋势数据的 r 代码教程。

你可能听说过流行的指导方针,如果你发现自己复制和粘贴代码超过 3 次,你应该把它写成一个函数。虽然您可以在 R Markdown 文件的顶部编写和存储这些函数,但是如果您最终将这些函数复制并粘贴到多个文件中,这种方法可能会变得混乱,而且会适得其反。通常,保持条理的最好方法是在脚本中编写函数,并在需要时从任何附加文件中调用它们。
为了演示这个过程,我将使用 3 个函数对过去一个月中包含“supreme court”的 Google 搜索进行一个非常简单的变化点分析。
首先,创建你的函数
在 R 脚本中,我们编写了三个简单的函数。第一个绘制 Google 趋势数据,第二个使用“bcp”包中的 bcp()函数执行简单的变化点分析,第三个绘制分析结果。
google_graph = function(data, date, observation, graph_title) {
data %>%
ggplot() +
geom_line(aes(x = date, y = observation),
color = "#09557f",
alpha = 0.6,
size = 0.6) +
labs(x = "Date (Start of Week)",
y = "Relative Proportion",
title = graph_title) +
theme_minimal() +
scale_x_date(date_breaks = "1 week") +
theme(axis.text.x = element_text(angle = 45))
}bcp_analysis = function(observation, data) {
set.seed(100)
bcp = bcp(observation)
prob = bcp$posterior.prob
prob = as.data.frame(prob)
bcp_dataframe = cbind(data, prob) %>%
select(date, prob)
}bcp_plot = function(dataframe){
dataframe %>%
ggplot() +
geom_line(aes(x = date, y = prob),
color = "#09557f",
alpha = 0.6,
size = 0.6) +
labs(x = "",
y = "Posterior Probability",
title = "Changepoint Probabilities") +
theme_minimal() +
ylim(0, 1) +
scale_x_date(date_breaks = "1 week") +
theme(axis.text.x = element_text(angle = 45))
}
我还选中了“保存源”框。如果您选中此框,那么当您在脚本中保存对函数的更改时,该文件将自动来源于全局环境。

连接到您的功能
从 R Markdown 文件连接到脚本中存储的函数与连接到包中存储的函数非常相似。我们不使用 library()语句,而是使用 source()语句并指明脚本的路径名。在这种情况下,我们使用以下代码:
source("./functions.R")
当我们运行这行代码时,脚本中包含的函数会自动出现在全局环境中。连接成功!

使用你的功能
首先,我们将使用“gtrendsR”包中的 gtrends()函数来获取过去一个月中包含美国“supreme court”字样的 Google 搜索量。mutate 步骤还用于将“date”变量转换为日期格式:
data = gtrends(keyword = "supreme court", geo = "US",
time = "today 1-m")$interest_over_time %>%
mutate(date = as.Date(date))
现在我们有数据可以在函数中使用了!我们使用 google_graph()函数的方式与使用任何其他函数的方式相同,这使我们可以轻松地绘制数据:
google_graph(data, data$date, data$hits, ‘Google Searches for “Supreme Court”’)

剧情看起来不错!不出所料,在最高法院大法官鲁斯·巴德·金斯伯格去世后,包含“最高法院”的搜索量激增。让我们使用 bcp_analysis()和 bcp_plot()函数来查看这个峰值是否代表这个时间序列对象中的一个重大变化点。同样,我们使用函数的方式与使用已加载包中的函数的方式相同:
bcp_dataframe = bcp_analysis(data$hits, data)bcp_plot(bcp_dataframe)

鲁斯·巴德·金斯伯格死后几天的后验概率为 1.00,这表明包含“最高法院”的搜索可能在这段时间以一种有统计学意义的方式发生了变化。
就这么简单!如果我们想要在单独的 Rmd 文件中绘制和分析几个不同的数据源,那么用 source()语句将这些文件连接到我们的“functions”脚本并使用我们的函数就很容易了。
Python 装饰者 5 分钟指南
立即掌握更高级的主题
毫无疑问,Python decorators 是更高级、更难理解的编程概念之一。这并不意味着您应该避免学习它们——因为您迟早会在生产代码中遇到它们。这篇文章将帮助你立刻掌握这个概念。

阅读这篇文章不会花费你超过 5 分钟的时间,如果你按照代码来做的话,可能需要 10 分钟。在那段时间里,您将从基础开始了解装饰器的概念——常规的 Python 函数。
此外,这篇文章旨在逐步提高你的理解水平,这样你就不会在这个过程中感到困惑。在开始编写代码之前,我们将快速了解一下装饰者是什么。稍后,在文章的结尾,我们将讨论装饰者的一些好处和用例,所以不要错过。
中间部分留给概念本身。开始吧!
什么是装修工?
装饰器是一个函数,它接受另一个函数并扩展后一个函数的行为,而不需要显式修改它。Python 修饰器可以使代码更短,更有 Python 风格。这是一个高级主题,一旦您理解了这个概念,就可以使编码变得更容易。
在我们深入探讨之前,让我们快速回顾一下基础知识。
装饰器中使用的函数
函数是编写可重复使用的特定代码的一种方式。它们存在于几乎每一种编程语言中,是每一个程序的重要组成部分。
下面是一个函数定义示例:
def function_name(args):
#code
现在我们知道了什么是函数,下一个要理解的主题是函数中的函数:
def calc(name='add'):
print('now you are inside the calc() function') def sub():
return 'now you are in the sub() function' def divide():
return 'now you are in the divide() function'
与此类似,我们也可以从另一个函数中返回一个函数:
def calc(name='add'):
print('Now you are in the calc() function') def add():
return 'Now you are in the add() function' def divide():
return 'Now you are in the divide() function' if name == 'add':
return add
else:
return divide
在上面的代码中,我们可以很容易地看到,在 if/else 子句的帮助下,我们可以在函数中返回函数。您需要理解的最后一点是,装饰器将一个函数作为另一个函数的参数:
def welcome():
return 'Welcome to Python!'def do_something_before_welcome(func):
print('Something before executing welcome()')
print(func())
do_something_before_welcome(welcome) **Output:
>>> Something before executing welcome()
>>> Welcome to Python!**
在我们深入到装饰者之前,这差不多是你应该知道的全部。现在有趣的部分开始了。
装饰师蒸馏
现在我们有了理解装饰者所需的知识。让我们快速创建一个:
def my_decorator(func):
def wrapper():
print('Before function call')
func()
print('After function call')
return wrapperdef say_where():
print('say_where() function') say_where = my_decorator(say_where)**Output:
>>> Before function call
>>> say_where() function
>>> After function call**
读完上面的例子后,你有望更好地理解 decorators,因为我们刚刚应用了之前所涉及的函数的所有基础知识。
Python 允许我们通过@符号更容易地使用 decorators 有时称为 pie 语法。
让我们看看如何将它应用到上面的例子中:
def my_decorator(func):
def wrapper():
print('Before function call')
func()
print('After function call')
return wrapper@my_decorator
def say_where():
print('say_where() function')**Output:
>>> Before function call
>>> say_where() function
>>> After function call**
所以, @my_decorator 只是say_where = my_decorator(say_where)更简单的说法。这就是如何将装饰器应用到函数中。
现在我们对 python 装饰器有了一个清晰的概念,但是为什么我们首先需要它们呢?让我们在下一节回顾一些好处。
装修工——为什么?
我们已经讨论了装饰者的如何部分,但是为什么部分你可能还是有点不清楚。这就是为什么我准备了几个真实世界的装饰用例。
分析、日志记录和工具
我们经常需要具体地度量正在发生的事情,并记录量化不同活动的度量标准。通过在封闭的函数或方法中总结这些值得注意的事件,装饰者可以很容易地处理这个非常具体的需求。
验证和运行时检查
对于所有专业的 Python 类型系统来说,有一个缺点。这意味着一些错误可能会试图潜入,而更多的静态类型语言(如 Java)会在编译时捕捉到这些错误。除此之外,您可能希望对进出的数据执行更复杂的自定义检查。装饰者可以让你轻松地处理所有这些,并一次将它应用于许多功能。
制作框架
当您编写 decorators 时,您可以选择利用它们的简单语法,这让您可以向语言添加难以利用的语义。最好能有扩展语言结构的选项。许多众所周知的开源系统都利用了这一点。web 框架 Flask 利用它将 URL 路由到处理 HTTP 请求的能力。
我希望这三个用例已经让你相信装饰者在现实世界的任务中是多么重要。说到这里,我们来到了本文的结尾。让我们在下一部分总结一下。
在你走之前
一开始,装饰者并不是一个容易理解的概念。对我来说,这个概念需要多次阅读(和动手任务)才能感到足够自信,但一旦你到达那里,一切都是值得的。
所以,慢慢来,不要着急。确保首先理解这些函数,以及我们今天讨论的所有内容。从那里开始扩展很容易。
我还想提一下,这是更高级的 Python 概念系列中的第一篇,接下来将讨论生成器和并行性等主题。它们对于可伸缩的、干净的编程环境也是必不可少的,所以一定要保持关注。
感谢阅读。
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
[## 通过我的推荐链接加入 Medium-Dario rade ci
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@radecicdario/membership)
利用 Scikit-learn 进行 5 分钟的模型开发概述
在 5 分钟内训练一个玩具模型。

最近, Edward Qian 和我做了一个为初学者介绍数据科学基础知识的网站(查看一下—T8)。scikit-learn 的初级读本可以在网站上找到,还有其他数据科学资源和实践问题。
我们想通过使用著名的虹膜数据集作为例子来展示使用 scikit-learn 训练玩具模型是多么容易。
scikit-learn 通常缩写为sklearn,是 Python 的机器学习库。除了用于特征工程、特征和模型选择的工具之外,它还支持跨多种算法的模型开发。
本演示的目的是展示 scikit-learn 特性,而不考虑在如此小的数据集上的实用性。所有代码都是 Python 3。
加载虹膜数据集
我们将使用数据集模块来加载 Iris 数据集。我们还可以使用pandas库和numpy库将数据转换成数据帧,以便于预处理。
数据集模块还提供了关于数据集的简短描述:
…数据集包含 3 类,每类 50 个实例,每类涉及一种鸢尾植物。一个类与另一个类是线性可分的;后者彼此不是线性可分的。
我们可以使用data.head()来预览前 5 行:

目标列代表鸢尾的亚种。
- 类 0 是 Setosa
- 第一类是云芝
- 二班是海滨
使用 train_test_split 对数据集进行分区
我们应该总是保留一部分数据用于测试。永远不要在开发模型的同一数据上测试你的模型。这被称为数据泄漏,它导致过拟合,这高估了模型在后续观测中的性能。
模型选择模块有几个用于分割数据集和超参数调整的有用功能。我们将使用sklearn.model_selection.train_test_split将我们的数据集随机划分为一个训练集和一个测试集。
特征选择
我们如何知道我们想要在我们的模型中使用哪些特性?我们如何从噪音中区分相关的预测因素?这很大程度上归结于领域知识,但这也是一个可以通过特征选择技术自动化的过程。Scikit-learn 有一个专门的模块。
我们将使用SelectKbest功能来选择顶部的 k 显著特征。通过将 k 设置为我们可用的相同数量的特征,我们可以使用这些输出来量化每个特征的相关性。分类的 F 检验值将用作评分函数。
F 值分数表明花瓣尺寸比萼片尺寸更能预测。
- 萼片长度(厘米):95
- 萼片宽度(厘米):35
- 花瓣长度(厘米):925
- 花瓣宽度(厘米):725
这些分数很难单独解读。我们需要查看它们对应的 p 值,以确定它们对目标变量的影响的统计显著性。
我们可以从feature_selection.pvalues_获得 pvalues
如果零假设为真,并且如果我们多次重复相同的实验,p 值表示更多“极端”观察的百分比。这里的零假设是该特征对目标没有影响(即,我们不应该将其用作预测器)。
低 p 值表明我们应该拒绝我们的零假设——换句话说,拒绝特征没有效果的说法。
在这个例子中,我们有非常小的 p 值:2.65205811e-25,8.62129460e-13,1.97685433e-72,1.15999788e-66。我们绝对应该在模型中保留所有 4 个变量。
训练分类器
我们所要做的就是实例化分类器并调用 fit 方法在训练集上训练它。
这里有一个逻辑回归的例子。逻辑回归的predict方法返回预测的类。predict_proba方法返回每个类的概率分数。
有关逻辑回归算法的更多详细信息,请单击此处的。
评估绩效
在我们训练了我们的模型之后,我们想要评估它的性能。这可以帮助我们在候选模型之间进行选择,并将模型期望传达给涉众。Scikit-learn 的度量模块可以帮助我们做到这一点。
首先,我们使用模型来预测测试集的标签。然后,我们将预测标签与真实标签进行比较,以确定性能。
我们模型的准确率在 83%左右。混淆矩阵显示了正确和错误分类的细目分类。该模型非常善于识别 Setosa,但在区分其他两类时有困难。

这就是你所拥有的——一个使用 scikit-learn 的一些核心功能在不到 5 分钟的时间内训练出来的玩具模型。
所有代码都在一个地方:
感谢您的阅读!
如果你喜欢这篇文章,你可能想看看我关于数据科学、数学和编程的其他文章。通过 Medium 关注我的最新动态!
我还在建立一套全面的免费数据科学课程。来看看:【www.dscrashcourse.com
使用 Python 和美汤进行 5 分钟的网页抓取
用 Python 和美汤刮西甲统计

埃米尔·佩龙——Unsplash的照片
E 从网站上提取数据可以节省大量的时间和精力。感谢美汤,刮网之路变得更加顺畅。在这篇文章中,我们将使用 Python 从一个网站上收集西甲 2019–20 的统计数据。
导入库
import pandas as pd
import requests as rq
from bs4 import BeautifulSoup
首先,必须导入所有有用的库。我已经导入了熊猫来存储数据框中的统计数据。导入 Requests 库是为了向 HTTP 服务器发送请求,同时引入漂亮的 Soup 用于 web 元素检索。
与网页通信
get_url = rq.get("https://www.msn.com/en-us/sports/soccer/la-liga/player-stats")
get_text = get_url.text
soup = BeautifulSoup(get_text, "html.parser")
我们必须获得目标 URL,然后使用漂亮的 Soup 库解析它。一旦创建了汤对象,就可以开始了。
提取网页元素
rank = [i.text for i in soup.findAll('td', {
"class" : "hide1 rankvalue"
})]
player_name = [i.text
for i in soup.findAll('td', {
"class" : "playername"
})
]
team_name = [i.text
for i in soup.findAll('td', {
"class" : "teamname"
})
]
team_la = [i.text
for i in soup.findAll('td', {
"class" : "teamtla"
})
]
games_played = [int(i.findAll('td')[4].text) for i in soup.findAll('tr', {
"class" : "rowlink"
})]
goals_scored = [int(i.findAll('td')[7].text) for i in soup.findAll('tr', {
"class" : "rowlink"
})]
assists = [int(i.findAll('td')[8].text) for i in soup.findAll('tr', {
"class" : "rowlink"
})]
使用漂亮的 Soup 方法,您可以访问 web 元素及其项目。我主要使用了“find all”方法,将“class”作为一个参数来获取所有项目的列表。
存储在数据帧中
laliga_stats = pd.DataFrame({
"Rank" : rank,
"Player Name" : player_name,
"Team Name" : team_name,
"Team" : team_la,
"Games Played" : games_played,
"Goals" : goals_scored,
"Assists" : assists
})
laliga_stats.set_index('Rank',inplace=True)
最后,使用 Pandas 库将数据存储到数据框中。并且,你可以进行你的分析了。
你只要写一行代码,就能获得 2019-20 西甲赛季的前 10 名射手:
laliga_stats[0 :10]

2019-20 赛季西甲十大射手
所有需要的是 Python 和美丽的汤的奇迹刮一个网站。所以,在一个新的标签上打开 Beautiful Soup 的文档,开始刮吧。
如需反馈和讨论,请在 Linkedin 联系我!
5 分钟创建一个 AWS Lambda 函数,以保持对您所在地区的新冠肺炎的更新
几个简单的步骤,确保您始终拥有最新的信息
以下是如何利用 AWS 在当地政府更新新冠肺炎信息时给自己发短信的方法。我们将使用这些 AWS 资源:

注意:我将使用 AWS web 控制台来完成这些步骤,但您也可以使用 boto3 和 Cloud Formation 等工具。
步骤 1:创建一个 S3 存储桶
我们将创建一个 S3 存储桶来保存我们想要监控的当前网页的副本。这样,每当 lambda 函数查看网页的当前版本时,我们就可以将其与以前的版本进行比较。
如果您使用的是 web 控制台:
- 导航至 S3 仪表盘
- 点击“创建存储桶”
- 输入存储桶名称。我用了
covid-bucket(记住你用的名字) - 继续点击“下一步”接受默认设置
现在从你的电脑上传一个文本文件。我给我的取名current_webpage.txt。它可以是一个空的文本文件,很快就会被覆盖。
注意:确保它是一个 **.txt* 文件。并记住这个文件名以备后用。
步骤 2:创建一个 Lambda 函数
注意:在 SNS 支持的 这些区域 中的一个进行。
对于此步骤,请确保您拥有以下信息:
- 当地政府用来发布新信息的网站。(我住在明尼苏达州,所以我用的是卫生部的网页
- 您希望向其发送更新的电话号码
- 您刚刚创建的 S3 存储桶和文件名
导航至 Lambda 仪表盘并点击“创建功能”。使用“从头开始创作”选项。
给你的函数起一个名字,并选择一个 Python3 运行时。现在使用默认权限。
您可以将下面的代码复制并粘贴到控制台的文本编辑器中。确保填写网站 URL、本格式中的电话号码以及 S3 桶名。
import boto3
import urllib3# Define URL
url = 'https://PUT_YOUR_URL_HERE.gov/virus-updates'# Set up http request maker thing
http = urllib3.PoolManager()# S3 object to store the last call
bucket_name = 'covid-bucket'
file_name = 'current_webpage.txt'object_s3 = boto3.resource('s3') \
.Bucket(bucket_name) \
.Object(file_name)# List of phone numbers to send to
phone_numbers = ['+1REDACTED','+1REDACTED']# Connect to AWS Simple Notification Service
sns_client = boto3.client('sns')def lambda_handler(event, context):
# Ping website
resp = http.request('GET',url)
new_page = resp.data
# read in old results
old_page = object_s3.get().get('Body').read()
if new_page == old_page:
print("No new updates.")
else:
print("-- New Update --")
# Loop through phone numbers
for cell_phone_number in phone_numbers:
try:
# Try to send a text message
sns_client.publish(
PhoneNumber=cell_phone_number,
Message= f'Local COVID19 Update: {url}',
)
print(f"Successfuly sent to {cell_phone_number}")
except:
print(f"FAILED TO SEND TO {cell_phone_number}")
# Write new data to S3
object_s3.put(Body = new_page)
print("Successfully wrote new data to S3")
print("done")
return None
步骤 3:更新函数的 IAM 角色
现在我们需要给 lambda 函数以下权限:
- 从我们的 S3 桶中读写
- 使用社交网络发布消息
导航到 IAM 仪表板,点击侧边栏上的角色。
找到为您的职能创建的角色。命名约定将包括你的 lambda 函数的名字<function name>-role-******。

单击“附加策略”
搜索“ S3 和“社交网络”,并添加完全访问策略。


点击附加策略
步骤 4:添加一个调度程序来调用 Lambda 函数
回到 web 控制台中的 lambda function dashboard,然后单击“添加触发器”。然后选择“云观察事件”


用“规则”下拉菜单:
- 选择“创建新规则”
- 输入规则名称和描述
- 为“规则类型”选择调度表达式
- 在“计划表达式”文本字段中输入
rate(5 minutes) - 点击“添加”
结论
运行这个应用程序应该会让您保持在这些 AWS 服务的自由层(这不是一个保证)。
您可以通过在 web 控制台中单击 lambda 函数配置屏幕顶部的“test”按钮来创建和运行测试。这个测试的输入是什么并不重要,因为输入并不用于 lambda 函数代码中。
或者你可以等 5 分钟,看看是否收到短信。
感谢阅读。注意安全。访问疾病预防控制中心网站获取更多关于新冠肺炎的信息。
每个数据科学家都应该避免的 5 个错误
数据科学项目中需要采取的预防措施

当一个具有挑战性的数据科学项目到来时,我们有时会在兴奋或试图做出一个完美的模型时,以犯错误而告终。不时地反复检查工作并对工作保持谨慎是很重要的。在这篇博客中,我将讨论数据科学家经常犯的五个错误。
1.数据泄露
数据泄漏是当模型根据预测时不可用的信息进行训练时发生的情况。结果可能是一个模型在训练和测试时表现很好,但在现实生活中性能会急剧下降。原因有时是意外地在测试和训练数据集之间共享信息,而不是保持测试数据不可见和不被触及。
一些可能的数据泄漏包括:
在预处理期间
当使用 PCA (主成分分析)进行降维时,我们通过从使用训练数据创建的协方差矩阵中学习特征向量,将 n 维数据降维到 k 维(k < n)。通过在前 k 个特征向量的方向上投影 n 维数据,训练数据被变换到 k 维空间。然后我们训练模型。
在测试过程中,正确的方法是通过将 n 维测试数据投影到前一步学习的前 k 个特征向量的方向上,将测试数据转换到 k 维空间,然后进行模型预测。但是,如果错误地将 PCA 应用于整个数据(训练+测试数据),会造成不必要的数据泄漏,模型性能会受到影响。
类似地,当应用像 NMF (非负矩阵分解)这样的算法时,关于如何学习这两个矩阵的训练发生在训练期间。在测试时,只使用学习将测试数据转换成所需的矩阵。但是,如果错误地将 NMF 应用于整个数据(训练+测试数据),就会造成不必要的数据泄漏。阅读这篇写得非常好的博客了解更多关于数据泄露的细节。
2.过多的冗余功能
具有高度相关的要素会影响模型的性能。这也被称为维数灾难。由于拥有过多冗余功能而面临的主要问题是:
- 过拟合 :多余的特征试图过拟合模型,导致高方差。这也会影响模型在测试期间的准确性。
- 没有清晰的特征重要性图:需要了解哪些预测因子对理解特征重要性贡献更大。这些信息有助于数据科学故事讲述和要素排名。由于具有冗余特征,模型表现异常,并且特征重要性的清晰图像丢失。
- 计算时间:随着冗余特征导致的特征空间增加,计算时间增加。在我们需要快速结果的情况下,这可能会导致一个问题,因为许多模型的运行时间与特征的数量成平方关系。
冗余功能过多的问题可以通过以下方式避免:
- 增加特性:主要思想是保持模型简单。使用向前和向后选择等技术逐步添加要素。我们只希望重要的特性在最后成为模型的一部分。
- 检查 多重共线性 并删除冗余特征:我们可以检查特征的相关性并删除冗余特征。
- 执行降维技术:像 PCA 、自动编码器、 NMF 这样的降维技术有时在去除冗余信息时非常有用。
- 正则化:每当模型试图过度拟合时,正则化技术就会惩罚它。点击阅读更多信息。
3.未来不可用的功能
很多时候,为了改进训练数据,我们会使用在测试过程中可能无法直接或立即获得的特性。
我在工作中遇到的一个这样的例子是天气数据。如果我们将天气数据用于预测应用,我们应该记住,在预测期间,未来的实际天气数据是不可用的,我们能得到的最好的是天气预测。训练期间的实际天气数据和测试/实际运行期间的可用天气预测可能会有很大偏差,从而降低模型性能。
4.错误的数据结构选择和糟糕的编码风格
我曾经遇到过由于错误的数据结构选择导致应用程序速度大幅下降的问题。
如果应用程序需要快速查找元素的存在,请使用 Dictionary 或 python 中的 Set,避免使用 List。
字典/集合是具有快速搜索需求的应用程序的正确数据结构
正确的数据结构使具有搜索功能的应用程序速度更快
谈到编码风格,最佳实践是拥有模块化的代码以及良好的变量和函数命名风格。它增加了可理解性、可解释性,并更容易地合并新的需求和变更。查看此链接了解最佳编码实践。
5.在验证多个测试周期、数据和人口统计数据的结果之前,报告模型性能
很多时候,数据科学家在有限的数据中进行测试后,最终会报告模型性能。在满怀信心地揭示模型性能之前,模型需要在生产中的大量测试数据中进行测试。
- 如果这是一个预测项目,测试模型在多个时间段的性能/预测。
- 如果这是一个金融营销模型,测试模型在不同人口统计的不同市场中的性能。
- 如果是零售领域模型,测试跨类别、部门等的模型性能
结论
在这篇博文中,我想指出数据科学家最终会犯的 5 个常见但关键的错误。通过这个博客,一点点的谨慎和意识可以拯救你,并有望让事情变得简单一点。如果你觉得还有更多的东西可以添加到常犯的错误列表中,请发表评论。
我的 Youtube 频道更多内容:
嗨,伙计们,欢迎来到频道。该频道旨在涵盖各种主题,从机器学习,数据科学…
www.youtube.com](https://www.youtube.com/channel/UCg0PxC9ThQrbD9nM_FU1vWA)
关于作者-:
Abhishek Mungoli 是一位经验丰富的数据科学家,拥有 ML 领域的经验和计算机科学背景,跨越多个领域并具有解决问题的思维方式。擅长各种机器学习和零售业特有的优化问题。热衷于大规模实现机器学习模型,并通过博客、讲座、聚会和论文等方式分享知识。
我的动机总是把最困难的事情简化成最简单的版本。我喜欢解决问题、数据科学、产品开发和扩展解决方案。我喜欢在闲暇时间探索新的地方和健身。在 中 、Linkedin或insta gram关注我,查看我以前的帖子。我欢迎反馈和建设性的批评。我的一些博客-********
- 以简单&直观的方式分解时间序列
- GPU 计算如何在工作中真正拯救了我?
- 信息论& KL 分歧第一部分和第二部分
- 使用 Apache Spark 处理维基百科,创建热点数据集
- 基于半监督嵌入的模糊聚类
- 比较哪种机器学习模型表现更好
5“更多”开源工具,轻松开始数据可视化。
数据可视化并不一定困难或昂贵。

里卡多·戈麦斯·安吉尔在 Unsplash 上的照片
想知道为什么这篇文章的标题有“更多”而不是“ 5 个开源工具来开始数据可视化”?原因是这是我不久前写的一篇关于同一主题的文章的延伸👇
使用这些简单直观的工具,直接进入数据可视化流程。
towardsdatascience.com](/10-free-tools-to-instantly-get-started-with-data-visualisation-d7fadb5f6dce)
在上面的文章中,我写了一些开源工具,它们可以让初学者立即开始构建漂亮的视觉效果。本文中包括的工具有:

本文建立在上一篇文章的基础上,包含了更多的开源数据可视化工具。这些工具使创建图表和地图变得容易,并把你的想象力放到画布上。
1.挥舞
fruit是一个数据可视化工具,也是一个讲述故事的工具。用户无需编写代码,就可以创建交互式的、有吸引力的、移动友好的图形。蓬勃发展的互动模板可以真正使您的数据生活。您可以选择一个模板,然后用您自己的数据替换它。除了其他基本图表,fluore 还提供 3D 地图和赛车条形图,可以将整个讲故事的体验提升到另一个水平。公版绝对免费,非常适合评测或教育使用。
使用

来源:https://flourish.studio/examples/
2.图表块
Chart Block 是一个可视化工具,能够在几分钟内构建漂亮的交互式图表。即使对初学者来说,这也是一个很好的工具,因为它不涉及任何编码。然后可以定制几十种图表类型来满足用户的需求。
生成的图表可以嵌入到任何网站或使用社交媒体工具共享。此外,图表还可以导出为 illustrators 和其他图形包的可编辑矢量图形。图表块包括一个免费的个人计划,这是理想的个人。
使用
视频来源:https://www.chartblocks.com/en/
3.数据工作室
Data Studio 是谷歌的免费报告和仪表板工具。它使用起来毫不费力,你可以在相当短的时间内上手。因为 Data Studio 完全基于云,所以它是可伸缩的。这也消除了下载它的需要。只要你有一个浏览器,你应该是好的。Data studio 的工具包中有以下产品:
- 连接到各种数据源

图片来源:https://datastudio.google.com/data
- 使用交互式报告和仪表盘快速可视化数据

图片来源:https://datastudio.google.com/data
- 与他人共享这些报告和仪表板。
使用
视频源:数据工作室
4.数据浏览器
Matthew Renze创建的 Data Explorer 是另一个数据可视化工具,它通过简单的用户界面产生强大的可视化效果。这是一款面向所有人的免费开源交互式数据可视化工具。由于 UI 简单,对于初学者来说,入门并进行有效的探索性数据分析极其简单。它的一些显著特点是:
- 能够从 CSV 文件导入数据并自动检测数据类型
- 拖放功能
- 使用交互式导航树浏览您的数据。
- 平移和缩放功能的可用性
- 使用用户友好的交互式过滤器过滤您的数据。
- 最后,共享整个项目或选择感兴趣的数据并复制到其他应用程序中。
使用
视频来源:https://www.data-explorer.com/
5.数据 GIF 生成器
Data GIF Maker 是比较两个术语的简单工具。最棒的是,你可以直接制作动画 gif,导出来在任何平台上分享。这个工具被有意地保持简约。这并不稀奇,但肯定可以用在演讲或写作中,来创造一个引人入胜的故事。用户可以使用三种模板,即矩形、跑道和圆形。以下是官方博客对这款工具的评价:
我们通常用这个工具来表示竞争搜索兴趣,但它也可以显示你想让它显示的任何东西——投票数、销售额或一个赛季的进球。
使用
作者提供的视频
结论
数据可视化是数据科学生态系统的重要组成部分。探索性数据分析有助于提供一些对任何数据分析工作流都至关重要的重要见解。一个好的数据可视化工具有助于保持对数据的关注,而不是工具。本文重点介绍了一些免费的数据可视化工具,它们可以让整个可视化过程变得直观而优雅,同时让数据自己说话。
5 更好的绘图工具和技术

来源:艾萨克·史密斯@ unsplash-免费库存图片
充分利用您的数据
大约四个月前,我写了第一篇关于绘图的文章( 10 个提高绘图技巧)。因为,正如我当时所说,在现实生活的数据科学中,绘图确实很重要。
在我的日常生活中,我花在绘制和分析这些图表上的时间比做其他任何事情都多。让我解释一下,我在 Ravelin 技术公司工作。我们的业务是数据,特别是为在线商家分析和预测欺诈。该公司的主要产品结合使用机器学习、网络分析、规则和人类洞察力来预测交易是否可能是欺诈。我们为我们的每一个客户都建立了一个专门的机器学习模型,但这个模型的建立是在与他们建立关系的开始,然后它主要需要维护。
怎么维护?有时是为了引入新功能,或者是因为顾客行为的改变。然而,也可能是我们收到的数据发生了变化。或者可能是因为我们第一次建立模型时没有足够的数据,所以我们最初遗漏了一些东西。也有可能是客户或我们在我们的预测中发现了一些不可靠的表现,例如,在一个特定的国家。无论是哪种情况,通常都会进行广泛的调查,以找出问题所在和/或我们可以做得更好的地方。为了给出更多的上下文,对我们来说,分析一个模型的性能通常意味着拥有数百万行和数千列的数据集。这只能通过绘图来解决。仅仅通过查看数据,几乎不可能找到模式或见解。绘图允许我们比较特性的性能,查看随时间的演变、值的分布、平均值和中值的差异等。等。等。等。
正如我在之前的故事中所说,在我们的领域中,我们必须同等重视可解释性和可解释性的重要性。现实生活中的数据科学永远不会发现你在一个项目中独自工作,你的同事和/或客户通常不太了解你将使用的数据。能够解释你的思维过程是任何数据相关工作的关键部分。这就是为什么复制和粘贴是不够的,图表个性化成为关键。
今天我们将学习 5 种技巧来制作更好的图表,我发现这些技巧在过去很有用。其中一些是日常使用的工具,而另一些你会不时地用到。但是,希望手头有这个故事,在那一刻到来时会派上用场。我们将使用的库包括:
import matplotlib.pyplot as pltimport seaborn as sns
具有以下样式和配置:
plt.style.use(‘fivethirtyeight’)%config InlineBackend.figure_format = ‘retina’%matplotlib inline
1.更改轴中的范围和步长
matplotlib 或 seaborn 设置范围和步骤的默认配置通常足以可视化数据,但有时我们会希望看到轴中的所有步骤被显式显示。或者,我发现有用的东西是绘制所有数据,但只包括特定范围的 y 轴或 x 轴的轴标签。
例如,假设我们正在绘制模型预测的分布图,我们希望专注于 30 到 50 之间的值,每两个单位一步,同时不忽略其余的值。我们最初的 seabon 的“distplot”应该是这样的:

我们现在有两种选择来实现上面的想法:
ax.set_xticks(range(30, 51, 2))ax.xaxis.set_ticks(np.arange(30, 51, 2))
在这两种情况下,我们都需要指定起点、终点和步骤。注意终点是如何遵循“小于”的逻辑,而不是“等于或小于”。结果将是下图:

另外,请注意我是如何从“ax”对象调用这两个选项的,因为这是默认设置。当我们创建任何类型的图表时,都会自动创建轴(' ax ')和图形(' fig ')。我们也可以用下面的方法做同样的事情:
myplot = sns.distplot(mydata)myplot.set_xticks(range(30,51,2))
2.旋转刻度
这是一个简单但非常有用的技巧,例如,如果我们处理的是文本标签而不是数字。我们可以通过使用“set_xticklabels”中的“rotation”超参数来做到这一点:
ax.set_xticklabels(labels=my_labels, rotation=90)
请注意我是如何将“my_labels”传递给“labels”超参数的,因为在使用“xticklabels”时这是强制的。但是,如果你正在绘制一个“distplot ”,你可以简单地传递要显示的数值范围,而对于任何其他图表,你可以传递与你为 x 轴指定的数组完全相同的数组。此外,您可以像这样将这种方法与第一种方法结合起来:
range_step = np.arange(30, 51, 2)ax.xaxis.set_ticks(range_step)ax.set_xticklabels(labels=range_step, rotation=90);
获得以下结果:

3.更改绘图之间的间距
通常情况下,我们会希望同时绘制几个图表来比较它们的结果,将它们可视化,或者可能只是为了节省时间和/或空间。无论如何,我们可以用一种非常简单的方式通过使用“支线剧情”来做到这一点:
fig, ax = plt.subplots(figsize=(18,10), nrows=2)
我们指定了两行,因此我们将绘制两个图表:
sns.distplot(mydata, ax=ax[0])sns.lineplot(x=mydata[‘xaxis’], y=mydata[‘yaxis’], ax=ax[1])

现在,有时,不是只有两张图表,我们可能有更多。也许我们需要包括他们所有人的标题。我们可能还有一些带有文本标签的图表,需要旋转它们以提高可读性。在这种情况下,我们可能会在图之间有一些重叠,增加图表之间的空间可以帮助我们更好地可视化它们。
plt.subplots_adjust(hspace = 0.8)

请注意,图的高度保持不变(在本例中为 10),但图表之间的空间增加了。如果你想保持你的图表的大小,你必须通过“figsize”超参数来增加你的图形大小。
此外,超参数“hspace”跟随水平空间。如果你在画多列而不是多行,你可以用超参数“vspace”来完成同样的工作。
顺便说一下,如果你想知道如何为你的图表设置标题,你可以在我的前一篇文章中找到这个技巧和其他一些更好的绘图技巧。
注意:就像我上面指定要画两行一样,你也可以指定固定的列数。在这种情况下,图表的索引将遵循双索引逻辑,如 ax=[0,1]。
4.定制您的混淆矩阵
不幸的是,这不是深入解释混淆矩阵如何工作或者它有什么用的空间。尽管如此,如果你想了解更多,我总是推荐这个来自 M. Sunasra 的故事。
现在,如果你已经熟悉了这个概念,你可能在过去遇到过这样的情况,有时由“sklearn.metrics”库中的“plot_confusion_matrix”创建的默认热图会出现上下方格被截断的情况,如下图所示:

来源:https://gis.stackexchange.com/
我们可以用一些线条从头开始绘制我们自己的混淆矩阵来解决这个问题。例如:
fig = plt.figure(figsize=(12,10))cm = skplt.metrics.confusion_matrix(real_y, pred_y)labels=[0,1,2,3,4]ax = sns.heatmap(cm, annot=True,annot_kws={“size”:12}, fmt=’g’, cmap=”Blues”, xticklabels=labels, yticklabels=labels)bottom, top = ax.get_ylim()ax.set_ylim(bottom + 0.5, top — 0.5)ax.set(ylabel=’True label’)ax.set(xlabel=’Predicted label’)plt.show()
我们在这里做的是:
- 我们创造了一个空的形象。宽于高,因为我们将在热图的右侧添加注释
- 我们通过‘skplt . metrics . confusion _ matrix’获得混淆矩阵的值
- 我们根据类别的数量指定了“标签”
- 我们使用第 2 点中的值创建一个热图,并指定:I)' annots '等于 True,ii) 'annot_kws '用于指定注释的字体大小(在本例中为 12),iii) 'fmt '用于传递字符串格式代码,iv) 'cmap '用于颜色模式,v)最后我们指定两个轴的标签(在混淆矩阵中,两者是相同的)
- 我们得到 y 轴视图限制,并再次设置为+- 0.5
- 最后一步:将 y 和“xlabels”分别设置为真和预测标签
结果应该是这样的:

5.绘制累积分布图
当然,我不需要估计绘制累积分布有多有用,无论是为了更好地理解元素百分比达到某个值,还是为了比较我们数据中的两个不同组。
您可以通过 Seaborn 的“distplot”图表本身轻松获得这种图表,只需设置以下内容:
sns.distplot(my_data, label=’my label’, color=’red’, hist_kws=dict(cumulative=True))

我们可以通过设置 x 轴的界限来使图表看起来更好:
sns.distplot(my_data, label=’my label’, color=’red’, hist_kws=dict(cumulative=True)).set(xlim=(0, my_data.max()))

正如我在故事开始时所说的,这些工具或技巧中的一些我一直在使用,而另一些只是偶尔使用。但是,希望了解这些快速修复和技术将帮助您做出更好的图,并更好地理解您的数据本身。
最后,别忘了看看我最近的一些文章,比如‘分类变量编码:什么,为什么和如何? 或 官方说法:时间不存在讲的是如何对待机器学习的数据集中的时间特征。此外,我们离圣诞节已经有点远了,但你可能会喜欢阅读这份 2020 年 9 本数据科学相关书籍的清单。
还有如果你想直接在你的邮箱里收到我的最新文章,只需 订阅我的简讯 😃
中号见!
你应该知道的 SQL 中最有用的 5 个窗口函数
让您的 SQL 技能更上一层楼

在 Unsplash 上由 Fabrizio Verrecchia 拍摄的照片
介绍
在我的上一篇文章中,我解释了什么是 SQL 窗口函数以及如何使用它们。在这篇文章中,我将分享我认为最有用的 5 个窗口(分析)功能。
如果您在工作中与数据打交道,我强烈建议您尝试理解这些(即数据分析师、产品分析师、数据科学家、数据工程师等)。它们肯定会派上用场的!
说到这里,让我们开始吧。
为了帮助您理解这 5 个窗口功能是如何工作的,我将使用下表作为示例:

1.行号
它有什么作用? ROW_NUMBER 简单地返回每一行的编号,第一条记录从 1 开始。
什么时候有用? 当你想得到一个特定表格的第一条或最后一条记录时,行号是非常有用的。例如,如果您有一个客户购买的表,并且您想获得每个客户的第一次购买,您可以按客户(姓名/id)进行分区,并按购买日期进行排序。然后,您可以筛选行数= 1 的表。
示例: 使用我上面的示例,假设我想对每一行应用一个行号,按性别并从最高 GPA 到最低 GPA 进行拆分。然后,我可以执行以下查询来获得以下结果:
SELECT *,
ROW_NUMBER() OVER (PARTITION BY Gender ORDER BY GPA DESC) as rn
FROM
students

请注意,因为按 GPA desc 排序,GPA 最高的女性和男性的行号为 1。
2.总和/计数
它有什么作用? SUM()和 COUNT()是聚合函数,它们或者对列中的值求和,或者对列中非空的值进行计数。
什么时候有用? 通过在窗口函数中使用 SUM()或 COUNT(),可以计算累计总和或累计计数。如果您想要创建显示特定指标(即订单数量、收入等)随时间增长的图表,这将非常有用。
虽然这个例子不一定公正,但它会让你了解它是如何工作的。
SELECT *,
SUM(GPA) OVER (PARTITION BY Gender ORDER BY GPA DESC) as GPA_sum
FROM
students

请注意 GPA_sum 列是如何计算累积 GPA 的(给定行的 GPA 加上之前所有行的 GPA)。
3.最小/最大
它是做什么的?
就像在聚合函数中使用 MIN()/MAX()一样,你也可以在窗口函数中使用它。
什么时候有用? 如果你想比较每一行的最高/最低值,最小/最大是有用的。
例子: 在下面的例子中,我们可以用这个来比较每个学生的 GPA 与每个性别的最高 GPA。您可以更进一步,创建一个新列来计算两者之间的差异。
SELECT *,
MAX(GPA) OVER (PARTITION BY Gender ORDER BY GPA DESC) as Max_GPA

4.滞后/领先
它是做什么的?/什么时候有用? LEAD()和 LAG()在想要比较前几行或后几行的值时很有用。
示例: 假设我想比较每个学生的平均绩点与下一个学生的平均绩点,后者刚好低于他/她的平均绩点。我可以使用 LAG()函数来实现这一点。
SELECT *,
LEAD(GPA) OVER (ORDER BY GPA ASC) as Lower_GPA
FROM
students

请注意,第一行是空的,因为它没有可以引用的前一行。
5.稠密秩
它有什么作用? DENSE_RANK 类似于 ROW_NUMBER,只是对相等的值返回相同的秩(NUMBER)。
什么时候有用?当您想要根据一个或多个特定变量对数据进行排序时,DENSE_RANK 非常有用。
例如: 如果我们想将学生的 GPA 从最低到最高排序,我们可以使用下面的代码来实现。
SELECT *,
DENSE_RANK() OVER(ORDER BY GPA ASC) as Dense_rank

请注意,Martin 和 Jason 有相同的 GPA,因此,他们的 Dense_rank 都等于 4。
感谢阅读!
通过阅读这篇文章,你不仅应该知道什么是窗口函数,还应该很好地掌握它的通用性和功能性。你可以用更多的方式来使用窗口函数,但是这五个绝对是我职业生涯中最有用的!
特伦斯·申
- 查看 我的免费数据科学资源 每周都有新素材!
- 如果你喜欢这个, 在 Medium 上关注我 了解更多
- 让我们连线上LinkedIn
神经网络中使用的 5 个必须知道的激活函数
非线性的本质

照片由德鲁·帕特里克·米勒在 Unsplash 上拍摄
通用逼近定理意味着神经网络可以逼近将输入(X)映射到输出(y)的任何连续函数。表示任何函数的能力是神经网络如此强大和广泛使用的原因。
为了能够逼近任何函数,我们需要非线性。这就是激活功能发挥作用的地方。它们用于向神经网络添加非线性。在没有激活函数的情况下,神经网络可以被认为是线性模型的集合。
神经网络是包含许多节点的层的组合。因此,构建过程从一个节点开始。下面是一个没有激活功能的节点。

没有激活功能的神经元(图片由作者提供)
输出 y 是输入和偏置的线性组合。我们需要以某种方式添加非线性元素。考虑下面的节点结构。

具有激活功能的神经元(图片由作者提供)
非线性是通过将激活函数应用于输入和偏置的线性组合的总和来实现的。增加的非线性取决于激活函数。
在本帖中,我们将讨论神经网络中 5 种常用的激活方式。
1.乙状结肠的
sigmoid 函数的取值范围介于 0 和 1 之间。它也用于逻辑回归模型。

(图片由作者提供)
无论 sigmoid 函数的输入值是什么,输出值都将在 0 和 1 之间。因此,每个神经元的输出被标准化为范围 0-1。

(图片由作者提供)
当 x 值接近 0 时,输出(y)对输入(x)的变化更敏感。随着输入值远离零,输出值变得不那么敏感。在某个时间点之后,即使输入值有很大的变化,输出值也几乎没有变化。这就是 sigmoid 函数实现非线性的方式。
这种非线性也有不利的一面。我们先来看 sigmoid 函数的导数。

(图片由作者提供)
当我们远离零时,导数趋向于零。神经网络的“学习”过程取决于导数,因为权重是基于梯度更新的,梯度基本上是函数的导数。如果梯度非常接近零,则以非常小的增量更新权重。这导致神经网络学习速度非常慢,永远无法收敛。这也被称为消失梯度问题。
2。Tanh(双曲正切)
它与 sigmoid 非常相似,只是输出值在-1 至+1 范围内。因此,我们说 tanh 是以零为中心的。

(图片由作者提供)
sigmoid 和 tanh 之间的区别在于,对于 tanh,梯度并不局限于在一个方向上移动。因此,双曲正切函数可能比 sigmoid 函数收敛得更快。
双曲正切激活函数也存在消失梯度问题。
3.整流线性单位
relu 函数只对正值感兴趣。它保持输入值大于 0。所有小于零的输入值都变成 0。

(图片由作者提供)
神经元的输出值可以设置为小于 0。如果我们将 relu 函数应用于该神经元的输出,则从该神经元返回的所有值都变成 0。因此,relu 允许抵消一些神经元。
我们能够用 relu 函数仅激活一些神经元,而用 tanh 和 sigmoid 激活所有神经元,这导致了密集的计算。因此,relu 比 tanh 和 sigmoid 收敛得更快。
对于小于 0 的输入值,relu 的导数为 0。对于这些值,权重在反向传播期间从不更新,因此神经网络无法学习。这个问题被称为将死再禄问题。
4.泄漏 ReLU
它可以被认为是对垂死的 relu 问题的解决方案。漏 relu 为负输入输出一个小值。

(图片由作者提供)
尽管 leaky relu 似乎正在解决垂死的 relu 问题,但一些人认为在大多数情况下准确性没有显著差异。我想这可以归结为尝试两者,看看对于一个特定的任务是否有什么不同。
5。Softmax
Softmax 通常用于多类分类任务,并应用于输出神经元。它所做的是将输出值归一化为概率分布,使概率值加起来等于 1。
Softmax 函数将每个输出的指数除以所有输出的指数之和。结果值形成一个概率分布,其概率总和为 1。
我们来做一个例子。考虑目标变量有 4 个类的情况。以下是 5 个不同数据点(即观察值)的神经网络输出。

每一列代表一个观察的输出(图片由作者提供)
我们可以将 softmax 函数应用于这些输出,如下所示:

(图片由作者提供)
在第一行中,我们将 softmax 函数应用于矩阵 a 中的值。第二行将浮点精度降低到 2 位小数。
这是 softmax 函数的输出。

(图片由作者提供)
如您所见,每列中的概率值加起来为 1。
结论
我们已经讨论了神经网络中使用的 5 种不同的激活函数。为了增加非线性,必须在神经网络中使用激活函数。
天下没有免费的午餐!就计算复杂性而言,激活函数也给神经网络带来负担。它们也对模型的收敛有影响。
了解激活函数的属性以及它们的行为方式非常重要,这样我们就可以选择最适合特定任务的激活函数。
通常,激活函数的期望属性是:
- 计算成本低
- 零居中
- 可微的。激活函数的导数需要携带关于输入值的信息,因为权重是基于梯度更新的。
- 不会导致消失梯度问题
感谢您的阅读。如果您有任何反馈,请告诉我。
通过 Prince 的 5 个必须知道的降维技术
减少功能对您的数据科学项目有好处

Alexander Schimmeck 在 Unsplash 上的照片
答根据维基百科的说法,降维是将高维空间数据转换到低维空间。
换句话说,降维将数据从大量特征转换成少量特征。我们先说从一百个特性变成两个特性。
但是我们为什么需要降维呢?如果我们的机器学习模型有许多功能,这不是很好吗?嗯,技术上来说是的,但只是到某一点。更多的特性可能会增加你的度量,但它会在某个地方达到峰值,然后下降。
此外,当我们拥有太多功能时,会出现一些问题,包括:
- 较高数量的特征会增加数据的方差,这可能会导致过度拟合— 尤其是在观察数量少于现有特征数量的情况下。
- 数据之间的密度和距离变得不那么有意义,这意味着数据之间的距离是等距的或者是相同的相似/不同的。这影响了聚类和异常值检测,因为数据中的关键信息被低估了。
- 组合爆炸或大量值会导致计算上难以处理的问题,这个过程需要太长时间才能完成。
和其他一些问题,但你明白了。太多功能没用。这就是为什么我们需要降维技术。
你可以认为降维技术是建模之前的一个中间步骤;无论你的目标是聚类还是预测。您是否只想看到隐藏的潜在变化或使用结果作为另一个特征是您的自由裁量权。
说到结果,所有这些 降维技术的结果都是奇异值分解或者 SVD** 。这个术语在这篇文章中可以找到。我不会在这里过多讨论,因为 SVD 只是把矩阵分解作为一个过程来处理,而不是主要的焦点。**
头脑:知识和商业理解永远胜过任何一种技术。尽管降维的目的是在特征空间中找到相关性,但是具有许多相关特征比变换不那么相关的特征更好。
很少有 Python 包来处理降维问题;一个例子是王子套餐。在本文中,我将概述 prince 包中可用的五种降维技术。
维度缩减技术
王子包标榜自己是 Python 因子分析库。虽然不是所有的维度技术都是因子分析方法,但有些是相关的。这就是为什么王子包,包括技术,也与因素分析。
prince 包可用于降维的技术有:
在本文中,我不会详细解释每种技术的理论,因为我计划创建一篇关于它的更详细的文章。相反,我将给出这些技术的一个简短概述,以及您应该在什么时候将它与示例一起应用。
何时使用该技术取决于特性,下面是根据 prince 包何时应用该技术的总结表。

作者创建的表格
关于 prince 的一些注意事项是,prince 包使用了奇异值分解的随机版本(SVD )。这比使用更普遍的完全方法要快得多,但是结果可能包含很小的内在随机性。大多数时候,你不需要担心,但是如果你想要可重复的结果,那么你应该设置 **random_state** 参数。
SVD 的随机化版本是一种迭代方法,Prince 的每种应用 SVD 的算法都拥有一个n_iter参数,该参数控制用于计算 SVD 的迭代次数。一般来说,该算法收敛非常快,因此建议使用较低的 **n_iter** ,尽管较高的数值可以给出更精确的结果,但计算时间较长。
现在,在我们开始之前,让我们先安装软件包。
pip install prince
1.主成分分析
我认为主成分分析是降维概念中介绍最多和教科书式的模型。PCA 是现代数据分析中的标准工具,因为它是一种简单的非参数方法,用于从混乱的数据集中提取相关信息。
主成分分析旨在减少复杂的信息,并提供隐藏在高维数据下的简化结构。PCA 的主要优势在于计算每个维度对描述数据集可变性的重要性。例如,六个维度的数据可能在一个维度上存在大部分变异。如果你想了解更多关于 PCA 及其局限性的信息,你可以在这里阅读教程论文。
那么,我们什么时候用 PCA 来降维呢?根据 prince 准则,当所有尺寸都是数值(全数值特征)时为。让我们用数据集示例来尝试一下。
#Importing the necessary packageimport pandas as pd
import seaborn as sns
from prince import PCA#Dataset preparation with only numerical featuresmpg = sns.load_dataset('mpg')mpg.dropna(inplace=True)
mpg_test = mpg.drop(['name', 'origin'], axis =1, inplace = True)
mpg_test.head()

现在我们有了包含所有数字特征的 mpg 数据集。让我们尝试将主成分分析应用到数据集中,以将特征减少为两个主要成分。请注意,您可以设置与输入到模型中的特征数量一样多的主成分。在这种情况下,它是 7,但这意味着根本没有降维。
#Setup our PCA, n_components control the number of the dimension
pca =PCA(n_components = 2, n_iter = 3, random_state = 101)Training and transform our data
pca.fit(mpg_test)
mpg_pca = pca.transform(mpg_test)
mpg_pca.head()

这样,我们将七维数据集缩减为二维(两个 PC),但是这个二维解释了原始维度的多少变化?
pca.explained_inertia_

似乎 PC1 解释了大约 71%,PC2 解释了大约 12%,所以我们的二维特征解释了原始维度的大约 83%。那还不算太坏。我们可以试着想象我们的两台电脑以及附加标签。以‘原点’特性为标签来试试吧。
ax = pca.plot_row_coordinates(mpg_test,
color_labels=mpg['origin'])

二维特征有助于区分美国和其他国家,尽管欧洲和日本的标签有点困难。
让我们试试 prince 提供的另一种方法 PCA。我们可以获得原始变量和主成分之间的相关性。
pca.column_correlations(mpg_test)

我不确定是哪种相关方法,但我假设是皮尔逊相关。我们还可以知道每个观察值对每个主成分的贡献有多大。
pca.row_contributions(mpg_test).head()

2.对应分析
CA 是一种降维技术,传统上应用于列联表。它以与 PCA 相似的方式转换数据,其中心结果是 SVD。需要列联表中数据的 CA 的固有属性意味着更适合将 CA 应用于分类特征。让我们用一个数据集示例来尝试一下。
#Creating Contigency tablesflights = sns.load_dataset('flights')
pivot = flight.pivot_table(values = 'passengers', index ='year' ,columns = 'month' )

这是我们的飞行数据列联表,我们可以看到这里有如此多的信息。我们将使用 CA 来降低维度,并从中提取额外的洞察力。
#Preparing CAfrom prince import CA
ca = CA(n_components=2,n_iter=3,random_state=101 )#Fitting the data
ca.fit(pivot)
与 PCA 不同,没有数据转换,所以我们需要从类本身访问结果。让我们尝试获取行值(行坐标)。
ca.row_coordinates(pivot)

以上是列联表相对于行(在本例中是年)的变动信息。如果您想要从列的角度获得信息,我们也可以用下面的代码来完成。
ca.column_coordinates(pivot)

如果你想画出坐标,你可以用下面的代码。
ax = ca.plot_coordinates(X = pivot, figsize = (6,6))

通过绘制坐标,我们可以知道数据实际在哪里。我们可以看到数据倾向于聚集在一起。这就是我们如何从列联表中获得隐藏的洞察力。
另外,您可以使用下面的代码访问 CA 解释的变体。
ca.explained_inertia_

3.多重对应分析
MCA 是 CA 对两个以上分类特征(三个或三个以上)的扩展。这意味着 MCA 适用于特定的分类特征。MCA 的思想是将 CA 应用到数据集的独热编码版本中。现在让我们尝试使用一个数据集示例。
#Dataset preparationtips = sns.load_dataset('tips')
tips.drop(['total_bill', 'tip'], axis =1, inplace = True)

以上是仅包含我们将使用的分类特征的数据集(大小特征被视为分类特征)。让我们尝试将 MCA 应用于数据集。
from prince import MCA
mca = MCA(n_components = 2, n_iter = 3, random_state = 101)mca.fit(tips)
tips_mca = mca.transform(tips)
tips_mca.head()

结果类似于 PCA 或 CA 结果,两个主成分以 SVD 结果作为值。就像以前的技术一样,我们可以将坐标绘制成二维图形。
mca.plot_coordinates(X = tips)

MCA 使用与 CA 相同的方法来获取它的列和行坐标,上面的图总结了这一切。我们可以看到彩色的是列坐标,灰度的是行坐标。我们可以看到似乎有两种数据聚类,左侧和右侧。
最后,您可以使用下面的代码访问模型解释的差异。
mca.explained_inertia_

4.多因素分析
多因素分析(MFA)寻找所有特征中存在的共同结构。当您有一组数字或分类特征时,使用 MFA。这是因为 MFA 用于分析由几个组特征描述的一组观察值。MFA 的主要目标是整合描述相同观测值的不同特征组。
对于数据集示例,我将使用 prince 包中的教程。在教程数据集中,是关于三个专家对六种不同的葡萄酒给出他们的意见。对每种葡萄酒的意见都被记录为一个特征,我们希望在对每种葡萄酒有一个总体了解的同时,考虑每位专家的不同意见。MFA 适用于这种分析。
让我们试着建立数据。
X = pd.DataFrame(
data=[
[1, 6, 7, 2, 5, 7, 6, 3, 6, 7],
[5, 3, 2, 4, 4, 4, 2, 4, 4, 3],
[6, 1, 1, 5, 2, 1, 1, 7, 1, 1],
[7, 1, 2, 7, 2, 1, 2, 2, 2, 2],
[2, 5, 4, 3, 5, 6, 5, 2, 6, 6],
[3, 4, 4, 3, 5, 4, 5, 1, 7, 5]
],
columns=['E1 fruity', 'E1 woody', 'E1 coffee',
'E2 red fruit', 'E2 roasted', 'E2 vanillin', 'E2 woody',
'E3 fruity', 'E3 butter', 'E3 woody'],
index=['Wine {}'.format(i+1) for i in range(6)]
)
X['Oak type'] = [1, 2, 2, 2, 1, 1]

以上是我们的数据集,对每种葡萄酒的看法,以橡木类型作为额外的分类变量。现在,在 prince 中使用 MFA,我们需要指定组类别。所以,让我们创建一个。
groups = {
'Expert #{}'.format(no+1): [c for c in X.columns if c.startswith('E{}'.format(no+1))] for no in range(3)}
groups

在小组成员在场的情况下,让我们尝试应用 MFA 来降低维度。
from prince import MFA
mfa = MFA(groups = groups, n_components = 2, n_iter = 3, random_state = 101)mfa.fit(X)
mfa.transform(X)

在这里,我们获取每种葡萄酒的全局行坐标,在这里我们已经将特征简化为二维。就像之前一样,我们可以尝试绘制行坐标。
mfa.plot_row_coordinates(X=X, labels = X.index, color_labels=['Oak type {}'.format(t) for t in X['Oak type']])

我们可以看到一个清晰的葡萄酒分离和密切的每种葡萄酒的橡木类型作为标签。如果你愿意,我们也可以得到组中每个数据的行坐标。
mfa.partial_row_coordinates(X)

我们也可以画出这些组的行坐标。
mfa.plot_partial_row_coordinates(X =X , color_labels=['Oak type {}'.format(t) for t in X['Oak type']])

当您需要访问模型解释的方差时,您可以像前面的技术一样访问它。
mfa.explained_inertia_

5。混合数据的因子分析(FAMD)
最后,FAMD 是一种致力于对包含定量和定性特征的数据集进行降维的技术。这意味着 FAMD 适用于具有分类和数值特征的数据。通过考虑混合类型的特征来分析观察值之间的相似性是可能的。此外,我们可以探索所有功能之间的关联。
粗略地说,FAMD 算法可以被看作是 PCA 和 MCA 的混合。
让我们用一个数据集示例来尝试一下。
#Using the tips dataset, change the size feature to string object
tips = sns.load_dataset('tips')
tips['size'] = tips['size'].astype('object')from prince import FAMD
famd = FAMD(n_components =2, n_iter = 3, random_state = 101)#I leave out tips as I want the sex feature as the label
famd.fit(tips.drop('sex', axis =1))
famd.transform(tips)

就像之前一样,我们通过将维度缩减为二维来获得全局行坐标。我们也可以画出行坐标。
ax = famd.plot_row_coordinates(tips,color_labels=['Sex {}'.format(t) for t in tips['sex']] )

FAMD 在他们的分析中使用了 PCA 和 MCA 技术。这就是为什么坐标的构建块由分类特征和数字特征组成。如果您想访问这两个分析结果,我们也可以这样做。
famd.partial_row_coordinates(tips)

我们也可以画出来。
ax = famd.plot_partial_row_coordinates(tips, color_labels=['Sex {}'.format(t) for t in tips['sex']])

最后,如果你想知道模型解释了多少方差。您也可以用下面的代码来访问它。
famd.explained_inertia_

结论
在本文中,我解释了 prince 包提供的五种不同的降维技术。它包括:
- 主成分分析
- 对应分析
- 多重对应分析
- 多因素分析
- FAMD(混合数据的因子分析)
何时使用这些技术取决于你所拥有的特性。
希望有帮助!
如果你喜欢我的内容,并想获得更多关于数据或作为数据科学家的日常生活的深入知识,请考虑在这里订阅我的时事通讯。
如果您没有订阅为中等会员,请考虑通过我的推荐订阅。
熊猫 5 个必知的串线操作
熊猫让字符串操作变得简单

阿玛多·洛雷罗在 Unsplash 上的照片
我们必须用数值来表示每一位数据,以便由机器学习和深度学习模型进行处理和分析。然而,字符串通常不会有一个好的和干净的格式,需要预处理来转换成数值。Pandas 提供了许多通用函数来高效地修改和处理字符串数据。
在这篇文章中,我们将会发现熊猫是如何操纵绳子的。我将字符串函数和方法分为 5 类:
- 分裂
- 剥离
- 更换
- 过滤
- 合并
让我们首先创建一个示例数据框架来处理示例。
import numpy as np
import pandas as pdsample = {
'col_a':['Houston,TX', 'Dallas,TX', 'Chicago,IL', 'Phoenix,AZ', 'San Diego,CA'],
'col_b':['$64K-$72K', '$62K-$70K', '$69K-$76K', '$62K-$72K', '$71K-$78K' ],
'col_c':['A','B','A','a','c'],
'col_d':[' 1x', ' 1y', '2x ', '1x', '1y ']
}df_sample = pd.DataFrame(sample)
df_sample

1。分割
有时字符串携带多条信息,我们可能需要分别使用它们。例如,“col_a”包含城市和州。熊猫的拆分功能是一个非常灵活的拆分字符串的功能。
df_sample['col_a'].str.split(',')0 [Houston, TX]
1 [Dallas, TX]
2 [Chicago, IL]
3 [Phoenix, AZ]
4 [San Diego, CA]
Name: col_a, dtype: object
现在,每个元素都根据用于拆分的字符转换成一个列表。我们可以很容易地从这些列表中导出单个元素。让我们创建一个“state”列。
df_sample['state'] = df_sample['col_a'].str.split(',').str[1]df_sample

警告:下标([1])必须与 str 关键字一起应用。否则,我们将获得指定行中的列表。
df_sample['col_a'].str.split(',')[1]
['Dallas', 'TX']
拆分可以在任何字符或字母上进行。
如果扩展参数设置为真,分割功能返回一个数据帧。
df_sample['col_a'].str.split('a', expand=True)

拆分与再拆分
默认情况下,从左侧进行拆分。要在右侧进行分割,请使用 rsplit 。
考虑下面的系列:

让我们应用分割功能,并使用 n 参数限制分割次数:
categories.str.split('-', expand=True, n=2)

仅执行左侧的 2 次拆分。如果我们用 rsplit 做同样的操作:
categories.str.rsplit('-', expand=True, n=2)

完成相同的操作,但在右侧。
2。剥离
剥就像修剪树枝。我们可以删除字符串开头或结尾的空格或任何其他字符。
例如,“col_b”中的字符串开头有$字符,可以用 lstrip 删除:
df_sample['col_b'].str.lstrip('$')0 64K-$72K
1 62K-$70K
2 69K-$76K
3 62K-$72K
4 71K-$78K
Name: col_b, dtype: object
类似地, rstrip 用于从末尾开始修剪字符。
字符串的开头或结尾可以有空格。考虑我们数据框架中的“col_d”。

这些前导和尾随空格可以用 strip 删除:
df_sample['col_d'] = df_sample['col_d'].str.strip()

3。更换
熊猫替换函数用于替换行或列中的值。类似地,替换为字符串操作用于替换字符串中的字符。
让我们用“z”代替“col_d”中的“x”字母。
df_sample['col_d'] = df_sample['col_d'].str.replace('x', 'z')

4。过滤
我们可以根据第一个和最后一个字符过滤字符串。要使用的函数有 startswith() 和 endswith() 。
这是我们的原始数据框架:

下面是一个经过筛选的版本,只包含“col_a”以字母“x”结尾的行。
df_sample[df_sample['col_a'].str.endswith('X')]

或者,“col_b”以“$6”开头的行:
df_sample[df_sample['col_b'].str.startswith('$6')]

我们也可以通过提取某些字符来过滤字符串。例如,我们可以通过 str[:2] 得到一列或一系列字符串的前 2 个字符。
“col_b”表示一个数值范围,但数值隐藏在字符串中。让我们用字符串下标提取它们:
lower = df_sample['col_b'].str[1:3]

upper = df_sample['col_b'].str[-3:-1]

5。组合
Cat 函数可用于连接字符串。
我们需要使用 sep 参数传递一个参数放在连接的字符串之间。默认情况下,cat 忽略缺失值,但是我们也可以使用 na_rep 参数指定如何处理它们。
让我们通过用“-”分隔符连接“col_c”和“col_d”来创建一个新列。
df_sample['new']=df_sample['col_c'].str.cat(df_sample['col_d'], sep='-')df_sample

额外收获:对象 vs 字符串
在 pandas 1.0 之前,只有“object”数据类型用于存储字符串,这导致了一些缺点,因为非字符串数据也可以使用“object”数据类型存储。Pandas 1.0 引入了一种新的特定于字符串数据的数据类型,即string type。到目前为止,我们仍然可以使用 object 或 string type 来存储字符串,但是在将来,我们可能会被要求只使用 string type。
这里需要注意的一件重要事情是,对象数据类型仍然是字符串的默认数据类型。要使用 StringDtype,我们需要显式声明它。
我们可以通过“字符串或 pd。StringDtype() 参数为 Dtype 参数为 string 数据类型。

感谢您的阅读。如果您有任何反馈,请告诉我。
计算机视觉领域你必须知道的 5 种神经网络架构
在这篇文章中,我列出了计算机视觉的前 5 个神经网络架构,排名不分先后
卷积神经网络
历史
卷积的概念是由福岛国彦在 T2 的论文中首次提出的。 neocognitron 引入了两种类型的层,卷积层和下采样层。
然后下一个关键进展是由 Yann LeCun 等人提出的,他们使用反向传播从图像中学习卷积核的系数。这使得学习自动化,而不是费力的手工制作。根据维基百科,这种方法成为了现代计算机视觉的基础。
然后是 2012 年由 Alex Krizhevsky,Ilya Sutskever,Geoffrey E. Hinton,撰写的“使用深度卷积神经网络的 ImageNet 分类”,这被广泛认为是卷积神经网络方面最有影响力的论文。他们创建了 Alexnet,并凭借他们的模型赢得了 2012 年的 Imagenet 竞赛。
机制
我不会深入探究 CNN 的机制,但想简单概述一下它是如何工作的。
常规的香草神经网络在计算 WX + b 的层上训练,其中 W 是通过反向传播学习的权重矩阵,卷积神经网络使用称为过滤器的权重。

卷积运算。图片来自https://giphy.com/explore/convolution。
你可以想象一个卷积的内核或过滤器,就像输入矩阵上的滑动窗口。在上面的 gif 中,过滤器是带有红色数字的橙色阴影矩阵。输入矩阵是带有黑色数字的绿色矩阵。在每个阶段,滤波器与输入矩阵的重叠部分逐元素相乘,然后对值求和。这给出了第一个输出。然后过滤器向左移动一步,依此类推,如 gif 所示。
可以根据滤波器值计算输出和标签的损失,通过反向传播,我们可以学习滤波器的值。
当你展开内核和输入时,卷积神经网络实际上只是矩阵乘法。这在这篇非常好的博文中有所展示。CNN 非常强大有两个主要原因。
- 它们每层的参数明显更少,因此可以堆叠形成更深的层。
- 它们处理输入的位置。图像中像素的局部性得以保持,因为内核一次只作用于图像的一部分,并且输入中接近的像素会创建同样接近的输出值。这不同于不考虑位置的传统网络。
剩余网络
残差网络是由、等人在他们极具影响力的论文《图像识别的深度残差学习》中引入的。来自微软研究团队的论文赢得了 2015 年 Imagenet 竞赛。

跳过连接。图片由作者提供。
ResNets 有一个非常简单却非常优雅的想法。这个想法是添加跳过连接或快捷连接,这创造了一个梯度公路。这使得梯度在后退过程中流动得更好,大大增加了收敛,训练时间,减少了梯度爆炸和消失。
Resnets 的微妙之处在于,最好的情况是跳过连接主动添加到输出中并计算有用的信息,最坏的情况是忽略跳过的连接,最坏的情况是与没有跳过连接的网络相同。因此,跳过连接增加了如此多的价值,而且没有负面影响!
u 网
U-Net 是由 Olaf Ronneberger、Philipp Fischer 和 Thomas Brox 在他们的论文“U-Net:生物医学图像分割的卷积网络”中介绍的,你可以在这里阅读。这篇 2015 年的论文对于图像分割来说是革命性的。图像分割的任务是用类别标记图像中的每个像素。

U-Net 架构。图片取自原 U 网论文。
u 网有两部分,收缩路径(下采样路径)和扩展路径(上采样路径)。在传统的图像分类卷积网络中,图像被送入执行卷积和汇集操作的网络,这两种操作都降低了输出的高度和宽度,但增加了输出的深度。随着高度和宽度的损失,获得的深度向分类输出添加了特征。
然而,在分割任务中,我们希望输出与输入图像具有相同的形状,并添加标记像素的特征。因此,传统 Conv 架构的下采样由上采样路径补充,以将图像的高度和宽度添加回输出,同时保持特征。有许多上采样方法,但大多数库中最常用的方法是转置卷积上采样。你可以在这里阅读这个方法。
YOLO
YOLO 最初是由约瑟夫·雷德蒙、桑托什·迪瓦拉、罗斯·吉斯克、阿里·法尔哈迪在他们的论文《你只看一次:统一的实时物体检测》中介绍的,你可以在这里阅读。该论文被提议作为 2015 年物体检测的快速、最先进的模型。多年来,YOLO 有 4 个官方版本(论文发表的地方)。前三个是由原作者,最后一个是由不同的作者。我现在不会讨论 YOLO 的版本,也许在另一篇文章中;-)

YOLO 建筑。图片取自原 YOLO 纸。
YOLO 代表你只看一眼。当这篇论文发表时,目标检测的流行方法是重用分类器对图像的局部区域进行分类,并使用滑动窗口方法来检查图像的每个区域是否有目标。YOLO 通过将目标检测作为一个回归问题提出来,改变了这种范式,在这种情况下,他们仅对整个管道使用一个单一的网络,并一次性处理整个图像,而不是在区域中处理。
YOLO 把输入图像分成一个 SxS 网格。并且对于每个网格,预测对象的中心是否存在于网格内。如果对象的中心在网格中,则网格将预测具有 5 个值的边界框,x,y,w,h,c。(x,y)是对象中心相对于网格的坐标,(w,h)是对象相对于整个图像的宽度和高度,以及(c)是对象的类别。
“YOLO 有三大优势。松散引用自原论文【1】。
首先,YOLO 速度极快。由于论文将检测框架作为一个回归问题,因此不需要复杂的流水线。
第二,YOLO 在做预测时会对图像进行全局推理。与基于滑动窗口和区域提议的技术不同,YOLO 在训练和测试期间看到整个图像,因此它隐式地编码了关于类及其外观的上下文信息。
第三,YOLO 学习对象的概括表示。由于 YOLO 是高度概括的,当应用于新的领域或意想不到的输入时,它不太可能崩溃。"
生成对抗网络
伊恩·j·古德费勒、让·普盖-阿巴迪、迈赫迪·米尔扎、徐炳、大卫·沃德-法利、谢尔吉尔·奥泽尔、亚伦·库维尔、约舒阿·本吉奥在他们的论文《生成对抗网络》中介绍了生成对抗网络,你可以阅读【生成对抗网络】

甘形象。图片由作者提供。
GANs 是通过对抗过程训练的神经网络对。GAN 的两个部分是发生器和鉴别器。生成器的作用是生成类似于训练数据的高质量数据,而批评家的作用是区分生成的数据和真实的数据。发电机的目标函数是使批评家的损失最大化,批评家的目标函数是使其损失最小化。
把这个过程想象成一个小偷和警察。小偷想愚弄警察,不断改进他们的工具和技术,而警察想抓住小偷,所以他们也在改进。发电机就像小偷,批评家就像警察。
GANs 有许多应用,并且一直有许多新的应用出现。但是因为这篇文章是关于计算机视觉的,GANs 的两个非常有趣的应用是:
- 超分辨率
超分辨率是指拍摄低质量的图像,并从中生成高质量的图像。英伟达的新 DLSS 可能会使用这种技术。
来自 fast.ai 的 Jeremey Howard 有一个非常有趣的方法,叫做超分辨率的 noGAN 方法。这个过程是对 GANs 的一种预训练,其中高质量的图像被转换成较低质量的图像用于生成器的训练数据,并且评论家在生成的图像上被预训练。这样,生成器和评论家都有一个良好的开端,并且这种方法被发现可以显著地提高 GANs 的训练时间。 - 深度假货 相信大家都从媒体上听说过深度假货。深度假货也是 GANs,其中生成器被训练来执行假货操作,而评论家的任务是检测假货。发电机可以被训练足够长的时间来愚弄大多数人类。这是一种有点危险的技术,在互联网上需要注意。
参考
[1] 约瑟夫·雷德蒙,桑托什·迪夫瓦拉,罗斯·吉尔希克,阿里·法尔哈迪,《你只看一次:统一的、实时的物体检测》(2015), arXiv:1506.02640
你应该知道的熊猫 1.0 的 5 个新特性
动态窗口功能,更快的应用和更多。

来自 imgflip.com 的熊猫迷因
熊猫 1.0 于 2020 年 1 月 29 日发布。版本从 0.25 跳到了 1.0,并没有像一些熊猫用户期望的那样有太大的变化。版本的增加仅仅反映了数据处理库的成熟。
虽然没有多少突破性的变化,但有一些你应该知道。
这里有几个你可能会感兴趣的链接:
- [Labeling and Data Engineering for Conversational AI and Analytics](https://www.humanfirst.ai/)- [Data Science for Business Leaders](https://imp.i115008.net/c/2402645/880006/11298) [Course]- [Intro to Machine Learning with PyTorch](https://imp.i115008.net/c/2402645/788201/11298) [Course]- [Become a Growth Product Manager](https://imp.i115008.net/c/2402645/803127/11298) [Course]- [Deep Learning (Adaptive Computation and ML series)](https://amzn.to/3ncTG7D) [Ebook]- [Free skill tests for Data Scientists & Machine Learning Engineers](https://aigents.co/skills)
上面的一些链接是附属链接,如果你通过它们进行购买,我会赚取佣金。请记住,我链接课程是因为它们的质量,而不是因为我从你的购买中获得的佣金。
要升级你的熊猫游戏,请阅读:
一个开源项目,简化了熊猫与实时数据的连接,测试假设和可视化…
towardsdatascience.com](/pandas-analytics-server-d9abceec888b)
1.具有滚动功能的动态窗口大小
处理时间序列数据时,滚动窗口函数非常有用(例如,移动平均值的计算)。以前版本的 pandas 要求我们传递窗口大小参数,例如计算 3 个周期的移动平均值。在 pandas 1.0 中,我们可以绕过这个要求,如下例所示。
让我们计算值的移动平均值,直到当前数字不大于 10。首先,我们创建一个数据帧,其中 3 个值大于或等于 10。
df **=** pd**.**DataFrame({'col1': [1, 2, 3, 10, 2, 3, 11, 2, 3, 12, 1, 2]})
df

车窗功能应展开,直到没有达到大于或等于 10 的值。
use_expanding **=** (df**.**col1 **>=** 10)**.**tolist()
use_expanding # output
[False,
False,
False,
True,
False,
False,
True,
False,
False,
True,
False,
False]
对于动态大小窗口函数,我们需要实现一个自定义索引器,它继承自 pandas BaseIndexer 类。BaseIndexer 类有一个 get_window_bounds 函数,它计算每个窗口的开始和结束。
from pandas.api.indexers import BaseIndexer**class** **CustomIndexer**(BaseIndexer): **def** **get_window_bounds**(self, num_values, min_periods, center, closed):
start **=** np**.**empty(num_values, dtype**=**np**.**int64)
end **=** np**.**empty(num_values, dtype**=**np**.**int64)
start_i **=** 0
**for** i **in** range(num_values):
**if** self**.**use_expanding[i]:
start[i] **=** start_i
start_i **=** end[i] **=** i **+** 1
**else**:
start[i] **=** start_i
end[i] **=** i **+** self**.**window_size
**print**('start', start)
**print**('end', end)
**return** start, end indexer **=** CustomIndexer(window_size**=**1, use_expanding**=**use_expanding)
我们将索引器类放入滚动函数中,并计算每个窗口的平均值。我们还可以观察每个窗口的开始和结束索引。
df**.**rolling(indexer)**.**mean()

2.更快的滚动应用
Pandas 使用 Cython 作为滚动应用的默认执行引擎。在 pandas 1.0 中,我们可以将 Numba 指定为执行引擎,并获得不错的加速。
有几件事需要注意:
- 需要安装 Numba 依赖项:pip 安装 numba,
- 第一次使用 Numba 引擎运行函数会很慢,因为 Numba 会有一些函数编译开销。但是,滚动对象将缓存该函数,后续调用将会很快,
- Numba 引擎具有较大数量的数据点(例如 1 百万以上),
- raw 参数需要设置为 True,这意味着该函数将接收 numpy 对象而不是 pandas 系列,以获得更好的性能。
让我们创建一个包含 100 万个值的数据框架。
df **=** pd**.**DataFrame({"col1": pd**.**Series(range(1_000_000))})
df**.**head()

some_function 计算值的总和并加 5。
**def** **some_function**(x):
**return** np**.**sum(x) **+** 5
让我们用 Cython 执行引擎来测量执行时间。
**%%**timeitdf**.**col1**.**rolling(100)**.**apply(some_function, engine**=**'cython', raw**=**True)4.03 s ± 76.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Cython 计算这个函数需要 4.03 秒。Numba 更快吗?让我们试一试。
**%%**timeitdf**.**col1**.**rolling(100)**.**apply(some_function, engine**=**'numba', raw**=**True)500 ms ± 11.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
我们看到 Numba 在这个玩具例子中快了 8 倍。
3.新 NA 值
熊猫 1.0 引入了新的实验性 pd。表示标量缺失值的 NA 值。
我知道你在想什么——又一个空值?已经有 nan,None 和 NaT 了!
pd 的目标。NA 将提供跨数据类型的一致性。它目前由 Int64、boolean 和新的 string 数据类型使用
让我们创建一系列无整数。
s **=** pd**.**Series([3, 6, 9, None], dtype**=**"Int64")
s

让我惊讶的是,NA == NA 产生 NA,而 np.nan == np.nan 产生 False。
s**.**loc[3] **==** s**.**loc[3]# output
<NA> np**.**nan **==** np**.**nan# output
False
4.新字符串类型
熊猫 1.0 终于有了一个专用的(实验性的)字符串类型。在 1.0 之前,字符串是作为对象存储的,所以我们不能确定这个系列是只包含字符串,还是混合了其他数据类型,如下所示。
s **=** pd**.**Series(['an', 'ban', 'pet', 'podgan', None])
s

当我们无意中将字符串与整数或浮点数混合在一起时,将字符串存储为对象就成了一个问题——数据类型仍然是对象。
s **=** pd**.**Series(['an', 'ban', 5, 'pet', 5.0, 'podgan', None])
s

为了测试新的字符串 dtype,我们需要设置 dtype='string '。
新的字符串数据类型返回序列中整数或浮点数的异常。进步很大!
s **=** pd**.**Series(['an', 'ban', 'pet', 'podgan', None], dtype**=**'string')
s

5.忽略排序数据帧上的索引
当我们按某一列对数据帧进行排序时,索引也会被排序。有时候我们不想这样。在 pandas 1.0 中,sort_values 函数采用忽略索引,正如参数名称所示。
df **=** pd**.**DataFrame({"col1": [1, 3, 5, 2, 3, 7, 1, 2]})df**.**sort_values('col1')

df**.**sort_values('col1', ignore_index**=**True)

结论
根据我的观点,这是 5 个最有趣的熊猫特征。从长远来看,缺失值的新 NA 可以给熊猫带来很多清晰度。函数如何处理丢失的值,它们是否跳过它们。
折旧政策也有变化:
- 次要版本(如 1.1.0)中将引入弃用,
- 在主要版本(如 2.0.0)中,将强制实施不推荐使用和突破 API 的更改。我们应该升级还是继续使用当前的熊猫版本
新的弃用政策提出了这个问题:“我应该更新熊猫吗?”比较好回答。似乎我们还可以期待未来更频繁的重大发布。要了解更多关于熊猫 1.0 的新特性,请阅读 1.0.0 的新特性。
在你走之前
在推特上关注我,在那里我定期发关于数据科学和机器学习的推特。

照片由Courtney hedge在 Unsplash 上拍摄
新冠肺炎疫情期间,你可以免费参加 5 门在线课程

莎伦·麦卡琴在 Unsplash 上的照片
在这个无情的时代,学习至关重要
随着冠状病毒的肆虐,随着学校和大学继续停课,全球对 MOOCs 的需求巨大。
所以,我觉得像 Coursera 这样的 提供商在他们的网站上免费提供大量优秀课程很棒, 但在所有付费课程中很难找到。
虽然这些课程不提供认证证书,但在我看来,知识比几个证书更重要。
TLDR;随着成千上万的人在这场危机中被解雇,我认为现在向人们提供学习资源是至关重要的。因此,这里列出了一些很棒且可以免费学习的课程。
1.机器学习

来源:免费课程是一条路要走
是的,你没听错,Coursera 正在免费提供吴恩达的游戏规则改变者 机器学习课程 。
至于我的评论,我认为这是每个对机器学习感兴趣的人都应该做的一门课程。首先,它包含了许多机器学习算法背后的数学知识,其次,吴恩达是一位伟大的导师。信不信由你,在我刚开始学习数据科学的时候,吴恩达不仅教了我,还激励了我。
至于课程,这门课什么都有——回归、分类、异常检测、推荐系统、神经网络,还有很多很棒的建议。
在学习本课程的过程中,您可能还想看看我的一些帖子:
对特征工程技术的详尽研究
towardsdatascience.com](/the-hitchhikers-guide-to-feature-extraction-b4c157e96631) [## 每个数据科学家都必须知道的 5 个分类评估指标
以及具体什么时候使用它们?
towardsdatascience.com](/the-5-classification-evaluation-metrics-you-must-know-aa97784ff226) [## 每个数据科学家都应该知道的 5 种特征选择算法
额外收获:是什么让一个优秀的足球运动员变得伟大?
towardsdatascience.com](/the-5-feature-selection-algorithms-every-data-scientist-need-to-know-3a6b566efd2) [## 3 个决策树分裂标准背后的简单数学
🌀理解分割标准
towardsdatascience.com](/the-simple-math-behind-3-decision-tree-splitting-criterions-85d4de2a75fe)
2.算法
算法和数据结构是数据科学不可或缺的一部分。虽然我们大多数数据科学家在学习时没有上过适当的算法课程,但它们仍然是必不可少的。
许多公司在招聘数据科学家的面试过程中会询问数据结构和算法。
它们将需要像你的数据科学面试一样的热情来破解,因此,你可能想要给一些时间来研究算法和数据结构以及算法问题。
罗伯特·塞奇威克大学提供的这一系列两门课程涵盖了所有基本的算法和数据结构。本课程的 第一部分 涵盖了基本的数据结构、排序和搜索算法,而 第二部分 则侧重于图形和字符串处理算法。
你可能也想看看我的一些帖子,同时试图理解这些课程中的一些材料。
数学更少,代码更多
towardsdatascience.com](/three-programming-concepts-for-data-scientists-c264fc3b1de8) [## 面向数据科学家的链表简单介绍
或者说,什么是链表,为什么我需要了解它们?
towardsdatascience.com](/a-simple-introduction-of-linked-lists-for-data-scientists-a71f0eb31d87) [## 数据科学家的动态编程
DP 如何工作?
towardsdatascience.com](/dynamic-programming-for-data-scientists-bb7154b4298b)
3.贝叶斯统计:从概念到数据分析
"事实是顽固的东西,但统计数字是易驾驭的."
――马克·吐温
一个常客和贝叶斯之间的战争永远不会结束。
在本 课程 中,你将学习最大似然估计、先验、后验、共轭先验,以及大量其他我们可以使用贝叶斯统计的实际场景。总之,这是一门精心设计的课程,解释了统计的频率论和贝叶斯方法。
从课程网站:
本课程介绍了统计的贝叶斯方法,从概率的概念开始,到数据的分析。我们将比较贝叶斯方法和更普遍教授的频率主义方法,并看到贝叶斯方法的一些好处。
4.实用时间序列分析
你听说过 ARIMA 模型,时间序列的平稳性等吗?并被这些条款所困扰?本课程旨在从数学的角度教授时间序列。我在相当长的一段时间里没能找到这样一个球场 。现在它对所有人都是免费的。
从课程网站:
在实际的时间序列分析中,我们关注代表序列信息的数据集,如股票价格、年降雨量、太阳黑子活动、农产品价格等等。我们来看几个数学模型,它们可能被用来描述产生这些类型数据的过程
如果您想使用 XGBoost 或基于树的模型进行时间序列分析,请看看我以前的一篇文章:
简单的时间序列建模
towardsdatascience.com](/using-gradient-boosting-for-time-series-prediction-tasks-600fac66a5fc)
5.机器学习 AWS 入门
秘诀:重要的不是你知道什么,而是你表现出什么。
在构建一个伟大的机器学习系统时,有很多事情需要考虑。但是经常发生的是,作为数据科学家,我们只担心项目的某些部分。
但是我们有没有想过一旦有了模型,我们将如何部署它们?
我见过很多 ML 项目,其中很多注定要失败,因为他们从一开始就没有一套生产计划。
拥有一个好的平台,并了解该平台如何部署机器学习应用程序,将在现实世界中产生很大的影响。这个关于 AWS 的课程是为了实现机器学习应用程序,它承诺了这一点。
本课程将教你:
1。如何使用内置算法的 Amazon SageMaker 和 Jupyter Notebook 实例构建、训练和部署模型。
2。如何使用亚马逊人工智能服务构建智能应用程序,如亚马逊理解、亚马逊 Rekognition、亚马逊翻译等。
你也可以看看我的这篇文章,在这里我试着谈论应用并解释如何计划生产。
[## 如何为数据科学家使用简单的 Python 编写 Web 应用?
无需了解任何 web 框架,即可轻松将您的数据科学项目转换为酷炫的应用程序
towardsdatascience.com](/how-to-write-web-apps-using-simple-python-for-data-scientists-a227a1a01582) [## 如何使用 Amazon Free ec2 实例部署 Streamlit 应用程序?
10 分钟内将数据应用程序上传到网上
towardsdatascience.com](/how-to-deploy-a-streamlit-app-using-an-amazon-free-ec2-instance-416a41f69dc3) [## 通过这 5 个简单的步骤将您的机器学习模型投入生产
或者为什么机器学习项目会失败?
towardsdatascience.com](/take-your-machine-learning-models-to-production-with-these-5-simple-steps-35aa55e3a43c)
更多免费课程
还有,如果你不想学上面那几个也不用担心。在写这篇文章之前,我收集了一些高评级课程的列表,这些课程可以免费审核。你可以在这里下载 excel 文件。所以尝试一下你想学的东西。

继续学习
将来我也会写更多初学者友好的帖子。在 中 关注我,或者订阅我的 博客 了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter @mlwhiz 联系到我。
此外,一个小小的免责声明——这篇文章中可能会有一些相关资源的附属链接,因为分享知识从来都不是一个坏主意。
5 PEP8 必须记住的准则
遵循这些提示来创建有效且易读的代码

每当你写代码的时候,有一件事你必须记住——它必须是可读的。就像你在学校必须手写文章一样,如果你的老师看不懂,你的文章内容就毫无意义。每个编码人员都有自己独特的风格和怪癖,这使得他们能够完成工作。但是,如果你打算开源分享你的作品给任何人看,它应该在外观和可读性上保持一致。在这篇文章中,我将分享在 Python 中创建有组织和清晰的代码的五个技巧。我们开始吧!
1.)线路长度
我想从这个技巧开始,因为它又快又切题——将每行代码限制在 79 个字符以内。就是这样。
2.)变量名
一般来说,您希望尽量避免变量名只有一个字母或数字。然而,不管出于什么原因,如果你决定使用一个单字母变量,有三个字母是你绝对需要避免的。那些字母是‘O’(可与数字‘0’混淆)‘I’(可与字母‘l’混淆)和‘l’(可与数字‘1’混淆)。当你读这句话的时候,你感到困惑吗?如果你是,那就证明了我的观点。
此外,确保不要使用 Python 中受保护的单词(拼写时变成绿色的单词)作为变量名,例如 list 、 dict 或 str 。除了可能导致混乱之外,如果您尝试运行您的代码,它还会引发错误。
3.)缩进
这主要适用于编写函数和/或条件语句的时候。如果你的缩进是关闭的,你的代码将不会工作。但是与此同时,如果在任何给定的函数中需要一个以上的参数,您需要有适当的缩进。例如,具有良好缩进的函数可能如下所示:
**def** fake_function(var_one, var_two,
var_three, var_four):
**print**(var_two)result = fake_function('var_one', 'var_two',
'var_three', 'var_four')
您可以很容易地看到,函数的参数与函数将要执行的操作是有区别的。松散的缩进可能如下所示:
**def** fake_function(var_one, var_two,
var_three, var_four):
**print**(var_two)result = fake_function('var_one', 'var_two',
'var_three', 'var_four')
因为缩进是关闭的,所以很难确切地说出函数中的参数是什么,以及函数的动作应该是什么。
4.)操作员位置
类似于缩进方面,如果您的代码使用了操作符— =、+、-等。—您希望确保操作符位于易于阅读的逻辑位置。例如,好的操作符位置如下所示:
income = (gross_wages
+ taxable_interest
+ (dividends — qualified_dividends)
— ira_deduction
— student_loan_interest)
操作符清楚地放在每个变量的之前,你可以很容易地看出发生了什么,尤其是在第 3 行。
错误的操作符位置如下所示:
income = (gross_wages +
taxable_interest +
(dividends - qualified_dividends) -
ira_deduction -
student_loan_interest)
虽然理解第 1 行和第 2 行中发生的事情可能很容易,但是一旦到了第 3 行,理解这段代码的走向就变得非常困难和模糊了。因此,一般的经验法则是在代码中将操作符放在变量之前,这样可以使每一步更加连贯。
5.)空白
回到 operators from 部分,您需要确保在变量名和操作符本身之间有一个空格。这个空白区域就是所谓的空白区域。尽管上面最近的例子中的操作符位置不正确,但是在变量和操作符之间有很好的空格位置。这也适用于文本运算符,如、、、或中的等。下面是一些好的空白用法的例子:
i = 1
i = i + 1
i += 1
x = i*2 - 1
y = x*x + i*i
z = (x+x) * (i-i)
我想指出我在上面第 4、5 和 6 行(或者变量 x、y 和 z)中陈述的一个重要的例外。注意,例如,在第 4 行中,i2 不包含空格。这是因为它向读者清楚地表明,这是那一行的数学计算的第一步,减法将是第二步。哪个数学属性具有最高优先级(记住 P.E.M.D.A.S!),你不想*在那个步骤中包含空格。
感谢你阅读这篇文章,我希望它有助于提高代码的可读性!
从 5 个角度看为什么辍学如此有效

五分钟后
Dropout 的工作原理是在训练过程中随机阻断一层中的一小部分神经元。然后,在预测期间(训练之后),Dropout 不会阻塞任何神经元。这一实践取得了巨大的成功——赢得竞争的网络几乎总是将辍学作为架构的重要组成部分。

要理解辍学到底为什么有效可能有点令人困惑。首先,我们实际上是在模型中插入了随机性,因此,当某些重要的节点被阻塞时,人们会认为它的预测会有很大的不同。在这样一个不稳定的环境中,很难想象有用的信息是如何传播的。再者,预测时突然消除随机性,适应这样随机环境的网络如何表现良好?
辍学为什么有效有许多观点,尽管其中许多观点是相互联系和相关的,但理解它们可以全面而深刻地理解这种方法为什么如此成功。
这里有一种方法:因为网络是在节点可能被随机阻塞的环境中训练的,所以有两种可能性:
- 被阻止的节点是“坏节点”,或者不提供任何信息的节点。在这种情况下,网络的其他节点通过反向传播接收到正信号,并且能够在没有负节点的情况下更好地学习。
- 被阻止的节点是“好节点”,或者为预测提供重要信息的节点。在这种情况下,网络必须学习其他神经元中数据的单独表示。

在这种 Dropout 的观点下,无论 Dropout 阻塞了什么节点,网络都可以从中受益。这种方法的观点认为它是一种干扰,一种从外部引入的随机来源,用来激发加速学习。
辍学的另一个角度是作为一个整体。在经常成功的随机森林算法中,根据随机选择的数据子集训练几个决策树,这一过程称为装袋。通过在模型中加入随机性,模型的方差实际上被抑制了。作为直观的理解,考虑以下数据,一个具有大量正态分布噪声的正弦波:

从这些数据中,我们得到几十条近似曲线,它们沿着原始曲线随机选择点。然后,这些近似曲线通过平均值聚合,结果是一条更清晰的曲线:

透明线是近似曲线。
Bagging 适用于高方差数据,因为它是一个可以以毒攻毒(噪声比噪声大)的实例。在这种情况下,通过重复随机选择曲线的部分,我们忽略了其他数据点,这有助于降低方差。
同样的想法也适用于辍学。当有数百甚至数千个信号从深层神经网络的前一层传入时,尤其是在训练开始时,必然会有大量的变化,甚至可能是不正确的信号。通过随机选择先前信号的子集并传递它们,Dropout 充当了一个近似器,并为反向传播留下了一个更纯净的信号。
我们可以从这个角度看得更远。每次在迭代中重新应用 Dropout 时,人们可能会认为正在创建一个新的网络。比方说,在用决策树打包时,每个模型都有不同的架构,正是这些不同的特征映射和数据子集中的特性的集合允许对整个特征空间的丰富理解。最终模型受到子模型学习的影响。
每次训练迭代,都会创建一个“新网络”,并且更新权重以反映新网络的学习。虽然实现的方法不同——更多的是一维的而不是二维的——但它本质上是作为一个整体执行相同的任务。经过足够的迭代后,网络学会寻找所谓的“通用权重”,即无论架构如何变化都表现良好的参数。像系综一样,Dropout 允许网络从许多更详细、更集中的网络中学习。
辍学也被视为正则化的一种形式,这是一系列防止神经网络过度拟合的方法。通过随机切断从一层到下一层的部分信号流,我们防止了过度详细的数字涌向网络的末端,这将通过反向传播遇到同样复杂的更新流。
辍学的另一个观点源于过度拟合问题,其基本思想是网络过度拟合是因为它们试图同时更新数百万个参数。当神经网络被初始化时,它们的参数不适应数据集,并开始探索误差范围。当所有这些个体探索被总结成一个巨大的网络时,它就像海啸一样冲向反向传播,这个网络迅速发展并迅速溢出。
辍学-特别是通过深度网络广泛实施的辍学,并且具有高比例的辍学神经元(40%至 50%)-让网络以更慢和更渐进的方式学习,以随机的方式一部分一部分地更新网络。

要更新的网络的每个新的随机选择的部分必须不仅更新它自己,而且注意其他先前更新的参数。因此,尽管这看起来有些矛盾,但增加随机性有助于模型以更可控的方式学习。
它是如何工作的——又是如何如此有效的?
towardsdatascience.com](/batch-normalization-the-greatest-breakthrough-in-deep-learning-77e64909d81d)
所有图片均由作者创作。
使用 Matplotlib 可视化数据的 5 个强大技巧

入门
如何使用 LaTeX 字体,创建缩放效果,发件箱图例,连续错误,以及调整框填充边距
数据可视化是用来以一种更直观、更易于理解的方式显示数据。它可以形成直方图、散点图、线图、饼图等。很多人还在用 Matplotlib 作为他们的后端模块来可视化他们的剧情。在这个故事中,我会给你一些技巧,5 个使用 Matplotlib 创建优秀情节的强大技巧。
- 使用乳胶字体
默认情况下,我们可以使用 Matplotlib 提供的一些漂亮的字体。但是,有些符号不够好,无法用 Matplotlib 创建。例如,符号 phi (φ),如图 1 所示。

图一。符号“phi”的示例(图片由作者提供)
正如你在 y 标签中看到的,它仍然是 phi (φ)的符号,但对于某些人来说,它还不足以成为一个情节标签。为了让它更漂亮,你可以使用乳胶字体。怎么用?下面是答案。
您可以在 python 代码的开头添加上面的代码。第 1 行定义了绘图中使用的 LaTeX 字体。您还需要定义字体大小,大于默认大小。如果你没有改变它,我想它会给你一个小标签。我为它选择 18。应用上述代码后的结果如图 2 所示。

图二。使用 LaTeX 字体的符号“phi”示例(图片由作者提供)
您需要在符号的开头和结尾写双美元($ … $),就像这样
如果您有一些错误或者没有安装使用 LaTeX 字体所需的库,您需要通过在 Jupyter 笔记本单元中运行以下代码来安装它们。
!apt install texlive-fonts-recommended texlive-fonts-extra cm-super dvipng
如果您想通过终端安装它们,您可以移除!,所以
apt install texlive-fonts-recommended texlive-fonts-extra cm-super dvipng
当然,你可以使用一些不同的字体系列,像衬线,无衬线(上面的例子)等。要更改字体系列,您可以使用以下代码。
plt.rcParams['font.family'] = "serif"
如果您将上面的代码添加到您的代码中,它将给出如图 3 所示的图。

图 3 。使用 LaTeX 字体的符号“phi”示例(图片由作者提供)
你能意识到图 3 和图 2 的区别吗?Yups,仔细分析的话,区别就是字体的尾部。后一个图使用衬线,而前一个是无衬线。简单来说, 衬线 表示尾部, sans 表示没有,如果你想了解更多关于字体家族或者字样的知识,我推荐这个链接。
字体是字体的设计,可以包括各种变化,如超粗体,粗体,常规,轻,斜体…
en.wikipedia.org](https://en.wikipedia.org/wiki/Typeface)
您也可以使用 Jupyterthemes 库设置字体系列/字样。我已经做了使用指南。只需点击以下链接。木星主题也可以改变你的木星主题,例如黑暗模式主题。
一个关于自定义 Jupyter 笔记本主题和轻松调整 Maptlotlib 参数的故事
medium.com](https://medium.com/@rizman18/how-can-i-customize-jupyter-notebook-into-dark-mode-7985ce780f38)
我们想给你一个插入 Matplotlib 的复杂文本,如图 4 的标题所示。

图 4。matplotlib 中使用 LaTeX 字体的复杂符号(图片由作者提供)
如果您想创建图 4,您可以使用这个完整的代码
如果你对代码有什么问题,请写在评论里。
2。创建放大效果
在这个技巧中,我将给出一个代码来生成一个图,如图 5 所示。

图 5。Matplotlib 中的缩放效果(图片由作者提供)
首先你需要了解 plt.axes ()和PLT . figure()的区别。你可以在下面的链接里回顾一下。Code plt.figure() 覆盖了单个容器中的所有对象,包括轴、图形、文本和标签。Code plt.axes() 只是涵盖了具体的支线剧情。图 6 可以给你一个简单的理解,我觉得。

图 6。Matplotlib 中图形和轴的区别(图片由作者提供)
黑色方框位于 plt.figure() 下方,红色和蓝色方框位于 plt.axes() 下方。在图 6 中,有两个轴,红色和蓝色。您可以查看此链接以获得基本参考。
[## 用 Matplotlib 实现 Python 数据可视化——完全 Python 初学者第二部分
在这一部分中,我们将学习使用 Jupyter Notebook 在 matplotlib 中调整颜色、轴限制和制作网格…
理解了之后,就可以分析如何创建图 5 了。简单来说,图 5 中有两个轴。第一个轴是一个大图,从 580 到 650 的放大版本,第二个轴是缩小版本。下面是创建图 5 的代码。
如果你需要代码的基本解释,你可以访问这个链接。
[## 用 Matplotlib 实现数据可视化——绝对初学者第一部分
这是使用 Matplotlib 和 Jupyter Notebook(一个强大的 phyton 模块)可视化我们的数据的教程。
medium.com](https://medium.com/datadriveninvestor/data-visualization-with-matplotlib-for-absolute-beginner-part-i-655275855ec8)
我也给出了另一个版本的缩放效果,你可以使用 Matplotlib。如图 7 所示。

图 7。Matplotlib 中的缩放效果(图片由作者提供)
要创建图 7,需要在 Matplotlib 中使用 add_subplot 或另一种语法( subplot )创建三个轴。在这里,我只是使用 add_subplot 并避免使用循环来使它更容易。要创建它们,可以使用下面的代码。
代码将生成一个图形,如图 8 所示。它告诉我们,它将生成 2 行 2 列。Axes sub1 (2,2,1)是支线剧情中的第一个轴(第一行,第一列)。该序列从左上侧到右侧开始。第二轴 sub2 (2,2,2) 放置在第一行第二列。最后的轴, sub3 (2,2,(3,4)),是第二行第一列和第二行第二列之间的合并轴。

图 8。Matplotlib 中的三个复杂轴
当然,我们需要定义一个模拟数据,以便在您的图中可视化。这里,我定义了线性和正弦函数的简单组合,如下面的代码所示。
如果您将该代码应用到前面的代码中,您将得到一个图,如图 9 所示。

图九。Matplotlib 中的复杂轴(图片由作者提供)
下一步是在第一和第二轴( sub1 和 sub2 )中限制 x 轴和 y 轴,在 sub3 中为两个轴创建遮挡区域,并创建作为缩放效果代表的connection patch【T35(s)。这可以使用完整的代码来完成(记住,为了简单起见,我没有使用循环)。****
该代码将为您提供一个出色的缩放效果图,如图 7 所示。
3。创建发件箱图例
你的图有很多图例要在图中显示吗,比如图 10?如果是,您需要将它们放置在主轴之外。

****图 10。五个不同的情节和一个糟糕的传说(图片由作者提供)
要将图例放置在主容器之外,您需要使用以下代码调整位置
plt.legend(bbox_to_anchor=(1.05, 1.04)) # position of the legend
1.05 和 1.04 的值在朝向主容器的 x 和 y 轴坐标中。你可以改变它。现在,将上面的代码应用到我们的代码中,
运行代码后,它会给出一个图,如图 11 所示。

****图 11。五个不同的情节和一个美好的传说(图片由作者提供)
如果想让图例框更漂亮,可以使用下面的代码添加阴影效果。它将显示一个图,如图 12 所示。
plt.legend(bbox_to_anchor=(1.05, 1.04), shadow=True)

****图 12。Matplotlib 中奇特的发件箱图例(图片由作者提供)
4。创建连续误差图
在过去的十年中,数据可视化的风格被转移到一个干净的绘图主题。通过阅读国际期刊或网页上的一些新论文,我们可以看到这种转变。最流行的一种方法是可视化带有连续误差的数据,而不是使用误差线。您可以在图 13 中看到它。

****图十三。Matplotlib 中的连续误差图(图片由作者提供)
使用 fill_between 生成图 13。 在 fill_between 语法中,需要定义上限和下限,如图 14 所示。

****图 14。定义上下限(图片由作者提供)
要应用它,您可以使用以下代码。
plt.fill_between(x, upper_limit, lower_limit)
自变量 上限 和 下限 可以互换。这是完整的代码。
5。调节盒垫边缘
如果你分析上面的每个代码,你会得到一个语法PLT . save fig()后面跟一个复杂的实参: bbox_inches 和 pad_inches。当你在撰写一篇期刊或文章时,它们是在为你提供便利。如果不包括它们,保存后,您的绘图会有更大的余量。图 15 显示了带 bbox_inches 和 pad_inches 和不带它们的不同曲线图。
****
图 15。左:保存无页边距设置的图,右:有页边距设置(图片由作者提供)。
我认为你看不出图 15 中两个图的区别。我将尝试用不同的背景颜色来呈现它,如图 16 所示。
****
图 15。左:保存无边距设置的图,右:有边距设置(图片由作者提供)。
同样,当你把你的情节插入一篇论文或一篇文章时,这个技巧会帮助你。你不需要裁剪它来节省空间。
结论
Matplotlib 是一个多平台库,可以玩很多操作系统。这是一个用来可视化你的数据的老库,但是它仍然很强大。因为开发人员总是根据数据可视化的趋势进行一些更新。上面提到的一些技巧就是更新的例子。我希望这个故事可以帮助你更有趣地可视化你的数据。
如果你喜欢这篇文章,这里有一些你可能喜欢的其他文章:
** [## 使用 Matplotlib 实现 Python 数据可视化—第 1 部分
完成了从基础到高级的 Python 绘图的 Matplotlib 教程,包含 90 多个示例
towardsdatascience.com](/visualizations-with-matplotlib-part-1-c9651008b6b8) [## 用于科学绘图的 Matplotlib 样式
为您的科学数据可视化定制 Matplotlib
towardsdatascience.com](/matplotlib-styles-for-scientific-plotting-d023f74515b4) [## 在 Matplotlib 中创建色彩映射表
从颜色列表中创建和定制自己的色彩映射表的指南
towardsdatascience.com](/creating-colormaps-in-matplotlib-4d4de78a04b8) [## 在 Matplotlib 中自定义多个子情节
使用 subplot、add_subplot 和 GridSpec 在 Matplotlib 中创建复杂 subplot 的指南
towardsdatascience.com](/customizing-multiple-subplots-in-matplotlib-a3e1c2e099bc) [## Vaex 大数据简介—读取 12.5 亿行的简单代码
用 Python 高效读取和可视化 12.5 亿行星系模拟数据
towardsdatascience.com](/introduction-to-big-data-a-simple-code-to-read-1-25-billion-rows-c02f3f166ec9)
仅此而已。感谢您阅读这个故事。喜欢就评论分享。我还建议您关注我的帐户,以便在我发布新故事时收到通知。**
5 强大的熊猫数据预处理可视化
“一个眼神胜过千言万语。”分析数据点的探索性数据分析(EDA)是在为算法建立数据模型之前制定假设的正确步骤。

由作者使用文中提到的 Python 代码绘制
我在相对初级的数据科学家和机器学习专业人员中反复观察到的最常见的陷阱之一是,花数小时为他们的项目寻找最佳算法,而没有花足够的时间首先理解数据。
处理数据科学和机器学习项目的结构化方法始于项目目标。同一组数据点可以推断出几件事情的有意义的信息。基于我们正在寻找的东西,我们需要关注数据的不同方面。一旦我们明确了目标,我们就应该开始考虑同样目标所需的数据点。这将使我们能够专注于最相关的信息集,而忽略可能不重要的数据集。
在现实生活中,大多数时候从几个来源收集的数据都有空白值、打字错误和其他异常情况。在进行任何数据分析之前,清理数据至关重要。
在本文中,我将讨论五个强大的数据可视化选项,它们可以立即提供数据特征的感觉。甚至在正式建模或假设测试任务之前,执行 EDA 就传达了许多关于数据和特性之间关系的信息。
在本系列的下一篇文章中,我已经讨论了探索性数据分析(EDA)的高级可视化
步骤 1- 我们将导入包 pandas、matplotlib、seaborn 和 NumPy,我们将使用它们进行分析。
我们需要 pandas 中的散点矩阵、自相关图、滞后图和平行坐标来绘图。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pandas.plotting import autocorrelation_plot
import seaborn as sns
from pandas.plotting import scatter_matrix
from pandas.plotting import autocorrelation_plot
from pandas.plotting import parallel_coordinates
from pandas.plotting import lag_plot
步骤 2- 在 Seaborn 包中,有一个很小的内置数据集。我们将使用“mpg”、“tips”和“attention”数据进行可视化。在 seaborn 中,使用 load_dataset 方法加载数据集。
"""Download the datasets used in the program """
CarDatabase= sns.load_dataset("mpg")
MealDatabase= sns.load_dataset("tips")
AttentionDatabase= sns.load_dataset("attention")
Hexbin 地块
我们经常使用散点图来快速掌握变量之间的关系。只要图中没有过于拥挤的密集数据点,获得洞察力真的很有帮助。
在下面的代码中,我们绘制了“mpg”数据集中“加速度”和“马力”数据点之间的散点图。
plt.scatter(CarDatabase.acceleration ,CarDatabase.horsepower,marker="^")
plt.show()
散点图中点密集,从中获取有意义的信息有点困难。

由作者使用文中提到的 Python 代码绘制
Hexbins 是解决重叠点散点图的一个非常好的替代方案。在 hexbin 图中,每个点不是单独绘制的。
在下面的代码中,我们在“加速度”和“马力”之间绘制了一个具有相同数据集的 hexbin。
CarDatabase.plot.hexbin(x='acceleration', y='horsepower', gridsize=10,cmap="YlGnBu")
plt.show()
我们可以清楚地推导出加速度和马力值范围集中在赫克斯宾图和变量之间的负线性关系。六边形的大小取决于“网格大小”参数。
自我探索:我鼓励你改变网格大小参数,观察 hexbin 图的变化。

用文章中提到的代码绘制
热图
热图是我个人最喜欢查看不同变量之间的相关性。那些在 Medium 上关注我的人可能已经注意到我经常使用它。
在下面的代码中,我们计算 seaborn“mpg”数据集中所有变量之间的成对相关性,并将其绘制为热图。
sns.heatmap(CarDatabase.corr(), annot=True, cmap="YlGnBu")
plt.show()
我们可以看到“气缸”和“马力”是紧密正相关的(正如汽车中所预期的),重量与加速度成反比。只需几行代码,我们就可以快速理解所有不同变量之间的指示性关系。

用文章中提到的代码绘制
自相关图
自相关图是确定数据点是否随机的快速试金石。如果数据点遵循某一趋势,那么一个或多个自相关将显著非零。图中的虚线显示 99%,置信带。
在下面的代码中,我们检查“tips”数据库中的 total_bill 金额是否是随机的。
autocorrelation_plot(MealDatabase.total_bill)
plt.show()
我们可以看到,对于所有时滞,自相关图都非常接近于零,这表明 total_bill 数据点是随机的。

用文章中提到的代码绘制
当我们为遵循特定顺序的数据点绘制自相关图时,我们可以看到该图明显不为零。
data = pd.Series(np.arange(12,7000,16.3))
autocorrelation_plot(data)
plt.show()

用文章中提到的代码绘制
滞后地块
滞后图还有助于验证数据集是一组随机值还是遵循某种趋势。
当绘制来自“tips”数据集的“total_bills”值的滞后图时,如在自相关图中,滞后图表明它是到处都有值的随机数据。
lag_plot(MealDatabase.total_bill)
plt.show()

用文章中提到的代码绘制
当我们绘制一个非随机数据序列时,如下面的代码所示,我们得到一条平滑的线。
data = pd.Series(np.arange(-12*np.pi,300*np.pi,10))
lag_plot(data)
plt.show()

用文章中提到的代码绘制
平行坐标
将我们的头脑包裹起来并可视化三维以上的数据总是一个挑战。绘制高维数据集平行坐标非常有用。每个维度由一条垂直线表示。
在平行坐标中,“N”条等间距垂直线代表数据集的“N”个维度。顶点在第 n 轴上的位置对应于该点的第 n 个坐标。
扑朔迷离!
让我们考虑一个小样本数据,它包含大小不同的小部件的五个特性。

垂直线代表小部件的每个功能。一系列连续的线段代表“小”和“大”部件的特征值。

用文章中提到的代码绘制
下面的代码绘制了 seaborn 中“attention”数据集的平行坐标。请注意,群集的点看起来靠得更近。
parallel_coordinates(AttentionDatabase,"attention",color=('#556270', '#C7F464'))
plt.show()

用文章中提到的代码绘制
如果您还没有使用探索性数据分析,我希望您开始使用这些开箱即用的图来执行探索性数据分析。我想听听你最喜欢的 EDA 可视化情节。
了解 Scikit-Learn 于 2020 年 5 月推出的复合估算器和管道的交互式可视化。
阅读我关于探索性数据分析(EDA)的高级可视化的文章,了解关于这个主题的更多信息。
如果你想了解深度学习模型中的张量板和可视化,那么请阅读文章深度学习中的准确性可视化
如果你想学习一种结构化的方法来识别适当的独立变量以做出准确的预测,那么请阅读我的文章“如何识别机器学习监督的正确独立变量。
"""Full code"""import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pandas.plotting import autocorrelation_plot
import seaborn as sns
from pandas.plotting import scatter_matrix
from pandas.plotting import autocorrelation_plot
from pandas.plotting import parallel_coordinates
from pandas.plotting import lag_plotCarDatabase= sns.load_dataset("mpg")
MealDatabase= sns.load_dataset("tips")
AttentionDatabase= sns.load_dataset("attention")plt.scatter(CarDatabase.acceleration ,CarDatabase.horsepower, marker="^")
plt.show()CarDatabase.plot.hexbin(x='acceleration', y='horsepower', gridsize=10,cmap="YlGnBu")
plt.show()sns.heatmap(CarDatabase.corr(), annot=True, cmap="YlGnBu")
plt.show()autocorrelation_plot(MealDatabase.total_bill)
plt.show()data = pd.Series(np.arange(12,7000,16.3))
autocorrelation_plot(data)
plt.show()lag_plot(MealDatabase.total_bill)
plt.show()data = pd.Series(np.arange(-12*np.pi,300*np.pi,10))
lag_plot(data)
plt.show()parallel_coordinates(AttentionDatabase,"attention",color=('#556270', '#C7F464'))
plt.show()
本月你可以免费参加 5 门高级课程
Udacity 免费提供一个月的高级学位,支持新冠肺炎危机。

处于隔离状态可能具有挑战性,但它节省了我们大量的时间来专注于自我发展和提高我们作为数据科学家的技能。为了在此期间支持专业人士, Udacity 提供一个月的免费机会,让你选择一个高级纳米学位项目(注意:该优惠仅适用于欧洲和美国)。现在,这些程序通常需要几个月才能完成,但鉴于目前的情况,我相信你可以投入更多的时间,并在一个月内掌握要点(查看系统如何工作这里)。
课程目录涵盖人工智能、数据科学、编程、自主系统、商业等等。在这篇文章中,我强调了 5 个我认为最值得投资的课程。
1.使用 Pytorch 介绍 ML
如果你以前使用过 Python,但对机器学习算法还不太适应,那么这个课程可能很适合你。它涵盖了机器学习的构建模块,并将让您有机会获得实际应用的实践经验。
先决条件的知识,以优化您的成功机会,在这个计划中,我们建议中级 Python…
www.udacity.com](https://www.udacity.com/course/intro-to-machine-learning-nanodegree--nd229)
2.数据可视化
这是我个人最喜欢的。用数据讲故事是我们所有人的一项基本技能。为了传递我们的信息并产生影响,我们需要清晰的沟通。有效的视觉效果是必不可少的。本课程回答了诸如如何选择正确的情节类型、什么是有效的仪表盘以及如何让你的故事更有说服力等问题。你甚至可以创建一个动画数据故事(对你的投资组合来说是一个很好的投资)。
学会结合数据、视觉和叙事来讲述有影响力的故事,并做出数据驱动的决策。在线学习…
www.udacity.com](https://www.udacity.com/course/data-visualization-nanodegree--nd197)
3.自然语言处理
该课程由亚马逊 Alexa 和 IBM Watson 合作创建,从 NLP 基础知识开始,以构建语音识别器作为最终项目结束。
为了在这个纳米学位项目中取得成功,我们建议你首先参加任何深度学习课程,相当于我们的深度…
www.udacity.com](https://www.udacity.com/course/natural-language-processing-nanodegree--nd892)
4.交易的人工智能
我不是金融专家,但这似乎是一门非常全面的交易和投资组合管理课程。
由行业专家设计的完整真实项目,涵盖从资产管理到交易信号的主题…
www.udacity.com](https://www.udacity.com/course/ai-for-trading--nd880)
5.营销分析简介
这是一门与当前就业市场非常相关的课程。您将扩展您的谷歌分析技能,并获得量身定制的营销活动监控和管理的数据科学技能。
营销分析纳米学位计划由支持八(8)个项目的内容和课程组成。我们…
www.udacity.com](https://www.udacity.com/course/marketing-analytics-nanodegree--nd028)
最后但同样重要的是:职业技巧课程
如果你正在找工作,这些课程可能是你面试准备过程中的有用资源:
在本课程中,您将确切了解在机器学习面试中会遇到什么情况。您将涵盖所有常见的…
www.udacity.com](https://www.udacity.com/course/machine-learning-interview-prep--ud1001) [## 数据科学面试准备| Udacity
数据科学工作面试可能会令人望而生畏。技术面试官经常要求你设计一个实验或模型。你…
www.udacity.com](https://www.udacity.com/course/data-science-interview-prep--ud944) [## 刷新简历| Udacity
你的简历是求职的第一步。通过本课程,你将确定你想工作的公司…
www.udacity.com](https://www.udacity.com/course/refresh-your-resume--ud243)
差不多就是这样!
希望这对你有用。呆在家里,保持安全,保持高效。

照片由Á·阿尔瓦罗·塞拉诺在 Unsplash 上拍摄
——继续探索
5 数据系统的设计原则

您的客户需要一个用户友好、可靠、可扩展、安全和可维护的系统。你怎么能让他们开心呢?
要设计一个高效的数据系统,您需要遵循一些原则。这些原则定义了潜在的规则,并在指导组织实现目标解决方案的过程中发挥着关键作用。在本文中,我们将研究数据系统的五个通用设计原则。
在我们继续之前,我想提一下:
- 当你阅读时,你会意识到一些要点适用于任何类型的系统,而不仅仅是数据系统,这很好,因为我希望它是通用的;
- 我交替使用系统和数据系统这两个词,它们在这个上下文中的意思是一样的;
- 有不同种类的数据系统,这些通用原则适用于所有类型的数据系统,但是,从更细的角度来看,每种类型的数据系统都有特定的设计原则。
1.为用户设计
无论是产品还是服务,任何设计决策的主要焦点都应该是用户。毕竟,你不会想要构建一个不符合用户意图的系统。在设计数据系统时也是如此。高管希望在特定时间查看特定形式的数据(可视化)(季度、月度),数据分析师希望查看其他形式的数据(详细报告、记录级数据和频率(每周、每天),数据科学家可能需要原始数据(或特征工程数据)来临时训练 ML 模型。此外,使用数据的应用程序和管道需要不同结构的数据,并且通常是接近实时的。数据操作员、系统支持和维护工程师都是在数据旅程的不同点以不同形式和方式与数据进行交互的用户。

与用户互动,了解他们的挑战(图片来源)
开始构思一个给定问题的解决方案是非常诱人的。当我们开始这样做的时候,它会产生一种对某些用户可能不合适的解决方案的偏见。因此,在考虑解决方案之前,花足够的时间了解每一组用户的需求是至关重要的。与不同的用户进行研讨会、小组访谈甚至个别访谈,以了解他们的角色和职责、工作方式、当前系统面临的问题等。在构建有效的解决方案方面发挥重要作用。同样重要的是,要评估消费者系统,并评估这些系统是如何设计来处理传入数据并为其他消费者生成数据的。
以下链接将让您对采访用户有一个大致的了解——
:用户需求应该驱动设计决策,只有在需求被完全定义和评审之后,才概念化解决方案,在迭代中进行调整。
2.故障设计
数据系统不可否认的事实是,事情将不可避免地出错。硬件会出现故障,原因有很多,例如年龄、周围环境、事故,甚至是火灾或地震等灾难。软件故障很常见,在某些情况下,可能很长时间都没有被发现。即使有最好的意图,人们也知道人类是不可靠的,可能会导致系统故障,如不正确的配置、错误的安装等。在数据系统中,此类故障会导致可用性问题、不准确的分析、数据丢失,甚至数据泄露,不仅会给组织造成金钱损失,还会造成声誉和客户的损失。我们只能通过设计数据系统来预防、规避和记录这些故障,从而使数据系统防故障。**

确保系统在出现故障时保持运行(图像源)
通过更换老化的设备来减少硬件故障,使数据中心更安全,更不容易发生事故,在区域内提供冗余硬件以应对数据中心故障,并跨地理区域提供冗余硬件以防范灾难。设计可靠的软件解决方案——遵循良好的编码实践,不仅关注错误的检测和通知,还让系统在错误发生时处理错误并自动解决它们。通过自动化部署和配置来减少人工干预,在无法实现自动化的情况下发布记录完善的指南。
:设计系统时要考虑到它们会失败,并确保没有单点故障。
3.面向规模和性能的设计
您的策略可以成功地防止或避免完全失败的情况。但是,随着时间的推移,当数据增长、用户群增加以及业务变化最终要求数据系统发展时,会发生什么情况。您的系统是否能够容纳大量数据,处理大量 I/O 请求,或者随着业务用例的发展而轻松改变?如果系统没有崩溃,但是响应缓慢,您能在复活节周末或其他任何一天处理您系统上的负载吗?
因此,在设计系统时,考虑应对增长、负载随时间增加的选项以及代码的可进化性是至关重要的。理解可以定义系统负载的参数,这些参数在不同的体系结构中可能是不同的,并且在很大程度上取决于系统的使用方式。一个系统可能会有少量用户读取或写入大量数据,也可能会有大量用户不断发出读/写请求。

这些因素将决定您是选择包含缓存存储来加速读/写操作,还是包含横向扩展存储来分配数据负载并鼓励并行处理。单一架构可能很难根据不断变化的业务需求进行修改,因此可以考虑设计域驱动的微服务系统,随着时间的推移,只需较少的开发工作就可以轻松地对其进行更改。
:了解系统可能如何随时间增长,并设计它来处理增长。考虑在设计系统时使用微服务架构,以便随着时间的推移更容易、更快速、更高效地进行更改。
4.安全性设计
每个人都知道安全性有多重要,尤其是对于存储、处理和生成数据的系统。虽然我们意识到数据安全的价值,但我们不时会遇到大量的安全问题,有时涉及大型组织。从统计数据来看,无论我们在保护系统方面投入多少资金,也无论我们实施了多少流程和框架,都很难解决安全难题。

出于正当理由,在一定时期内访问正确的人(图片来源)
就数据系统而言,您需要充分考虑确保数据在静态和传输时的安全,保护数据免受未经授权的访问,只允许通过安全通道进行外部访问,并通过防火墙验证每个请求。建立监控活动的流程,对可疑行为发出警报,嵌入智能以检测甚至预测漏洞,并执行定期审计以保证合规性。安全性不仅仅是工具和过程,组织中的每个人都有责任,您的设计应该考虑到它的每个方面。
TLDR :安全是一种思维定势,在设计数据系统的时候要考虑到漏洞的方方面面。数据总是加密的,访问控制基于角色,每个服务都需要一个密钥来允许请求,外部访问通过安全通道进行,请求受到监控,如果有可疑情况会发出警报。
5.为运营而设计
在实验室中设计和开发系统是一回事,让系统在生产中运行则完全是另一回事。你为之设计、测试和检查的一切最终都会让你困惑,因为你没有在运营中投入太多的心思。近年来,云解决方案从根本上改变了运营的角色,减轻了管理托管应用程序的硬件和基础架构的负担。但是,运营部门仍然需要处理大规模的关键部署、事件管理、监控、用户管理和其他管理任务。

想想操作人员(图片由 Unsplash 上的 CDC 拍摄)
在设计可操作的数据系统时,要记住的一个基本点是让事物变得可观察。记录数据传输过程并跟踪传输过程中发生的所有事件,可以让运营部门更轻松地揭开问题的神秘面纱并解决问题。实施强大的监控和警报解决方案有助于深入了解系统性能,并帮助运营部门及时应对问题。自动警报不仅有助于人类对事故采取行动,而且有助于立即执行自动化解决方案,使用户看不到故障。尽可能设计手动任务的自动化,如部署、配置等。为运营用户发布文档和指南,帮助他们了解系统的内部结构、进行根本原因分析或回答业务查询。
:记录和跟踪在数据传输过程中影响数据的事件,部署自动监控和警报系统,自动执行手动任务,并发布文档以促进支持和维护活动。
摘要
近日来,各机构开始对建立数据驱动决策系统表现出更多兴趣。他们中的许多人正在向高弹性、灵活、可扩展和安全的解决方案过渡。在这里阅读我关于为什么您的组织应该现代化其数据平台的文章。
对数据驱动的数字化转型项目有很大的需求,这种需求在未来几年将会上升。遵循这五个设计原则将有助于您作为一名设计师在构建数据系统和成功交付这些项目时专注于基本要素。
如果你喜欢读书,我推荐你阅读马丁·克莱普曼的设计数据密集型应用,它是为架构师、系统设计师、开发人员、技术经理以及几乎所有开发或使用具有某种服务来存储、管理和处理数据的应用的人而写的。
5 个专业 Python Web 开发/端点技巧
用 Python 简化端点的 5 种简单方法!

介绍
我们都经历过…
您有一个准备好部署的模型,但是您正在努力让模型得到部署。这可能是一个会让你的模型停滞不前的结果,让它永远见不到天日。这是一个如此复杂和庞大的问题,以至于我所在的团队已经改变了模型,并且将我们的工作逆向工程到新的模型中,仅仅是为了避免一些部署错误。
让我们面对现实吧——数据科学家不是网络开发者。尽管我们中的一些人可能比大多数人更热衷于 Unix 命令行并了解更多的 web 协议,但当您第一次成为数据科学家时,您不太可能想到部署自己的端点。在很多方面,您的端点和您的模型一样重要!如果没有端点,我们日常使用的许多机器学习模型肯定不会正常工作,这令人震惊!
那么,当你把一个不是 web 开发人员或开发运营工程师的人和一个机器学习工程师混在一起时,你会得到什么呢?
一个数据科学家!
不幸的是,这绝对是经常被忽视的一小部分工作。开发运营本身就是一个完整的领域,真正精通它就像精通笔记本中的数据科学一样深入。幸运的是,今天我将回顾我认为所有数据科学家都会发现对部署和终结点有用的 5 个技巧,所以请合上笔记本,让我们进入部署阶段!
最快的开发服务器
在 Python 中,可能有一千种独特的方式来启动服务器。我个人和职业最喜欢的可能是 Gunicorn3。然而,虽然 Gunicorn 对于服务器来说是一个很好的部署解决方案,但是对于开发来说可能不是那么完美。Gunicorn 有很多我称之为“输出屏蔽”的东西,在这里,你不会在你自己的代码中得到错误,你会收到 Gunicorn 的输出,它可能是误导性的,甚至是不清晰的。如果是这样的话,对你的代码进行修正将会非常困难。幸运的是,除了使用 Gunicorn 来运行您的服务器,还有一些替代方法。
这个服务器有什么了不起的?这个服务器包含在 Python 的标准库中,可以通过一个 Bash 命令在任何 Unix(或 Python)终端上轻松运行。或者,您甚至可以使用 Python 来创建这样一个服务器,这是非常独特的,因为通常服务器只由 Bash 启动。包含此服务器的 Python 库是“http”库。从 http,我们可以导入服务器:
**def** run(server_class=HTTPServer, handler_class=BaseHTTPRequestHandler):
server_address = ('', 8000)
httpd = server_class(server_address, handler_class)
httpd.serve_forever()
然后使用以下命令运行它:
run()
也可以使用带有端口参数的解释器的-m 开关直接调用 http.server。
python -m http.server 8000
这是并且将永远是启动开发服务器的最简单的方法。当我在我的电脑或同事之间共享文件时,我一直在使用它!只要确保你有 TCP 转发到你想要的端口,你就可以让全世界都看到你的主机!不幸的是,虽然这个服务器很容易使用,但我肯定不建议在这样的服务器上部署任何东西 官方 。但是,对于调试、文件共享或。PCK —用 HTML5 或者 WebAssembly 阅读,绝对完美!
Crontab:自动化一切!
我以前确实提到过克朗塔布,这是有充分理由的。Crontab 是一个非常简单,但功能非常丰富的工具,通常被开发-运营工程师用来根据 Unix 系统上的特定时间戳在后台自动执行脚本任务。这些时间戳存储在 CRON time 中,您需要习惯读取这些时间戳。
不管它的整体不可接近性如何,我认为 Crontab 是一个你生活中不可或缺的工具。这是一种快速有效的方法,可以非常容易地实现任何事情的自动化。我一直用它来进行大型 API 提取和后端端点更新。我还使用 Crontab 制作了自我训练模型,这些模型用脚本序列化,然后读入端点。与自动化后端部署的其他方法相比,Crontab 无疑因其易用性和可靠性而独占鳌头。如果您想了解我如何使用 Crontab、NGINX、Julia 和 Julia 在不到一个小时的时间内部署了一个自我训练模型,我写了一整篇关于如何做的文章,您可以在这里查看!:
结合开发运营和数据科学的元素,在 Ubuntu 上部署可扩展的自我训练模型。
medium.com](https://medium.com/chifi-media/build-a-beautiful-model-that-trains-itself-the-easy-way-a0d31b611cee)
监督者
Supervisor 或 supervisord 是另一个在开发-运营领域非常受人尊敬和广泛使用的工具。Supervisor 允许 Unix 系统以任何用户的身份执行 Bash 命令,而无需真实用户在场。换句话说,你可以在终端中创建一个你自己的人工版本来“监督”你不想自己管理的应用程序。
Supervisor 是一个特别有用的工具,用于部署您仍然希望监控但不希望有一个无头单元一直运行的服务器。使用 supervisor,您可以通过允许服务器以不同的权限同时处理一系列应用程序来轻松扩展服务器的覆盖范围。所以公认 Supervisor 是一个很棒的工具,但是怎么用呢?
与大多数 Unix 应用程序一样,尤其是那些用于服务器的应用程序,supervisor 可以通过存储在/etc/conf.d 中的配置文件轻松配置。当然,首先您需要实际安装 Supervisor:
# (Ubuntu)
sudo apt-get install supervisor
接下来,您可以使用您选择的文本编辑器编辑 supervisor 配置。我个人喜欢用 GNU Nano。
[program:app]
directory=/var/
command=gunicorn3 -workers=3 flask_app:app
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
stderr_logfile=/var/log/appname/lognameerr.log
stdout_logfile=/var/log/appname/lognamestdout.log
上面我们看到了一个相当基本的管理员配置文件。这个配置的目录部分将决定我们需要在哪个目录中运行我们的命令。接下来,该命令是 Bash 命令,通常用于运行脚本或启动服务器,在本例中是美妙的 Gunicorn3。接下来,我们有 autostart 和 autorestart,它们都是布尔值,将决定每当装入管理程序服务时是否启动管理程序。当 supervisor 实例启动、重新加载或服务器因任何原因重新启动时,将加载 supervisor 服务。接下来,stopasgroup 和 killasgroup 将确定每当重新加载该服务时,该配置文件中的其他应用程序配置是否也会被终止。最后,但同样重要的是,我们能够为输入和输出添加日志文件,这对调试很有用。
Supervisor 是每个数据科学家都应该熟悉的行业标准工具。它不仅对于部署端点几乎是必不可少的,而且当以 Unix 方式完成时,它还可以作为许多事情的基础。这是一个高度通用的工具,我真的发现拥有有用的知识。如果你想看用 NGINX 和 Supervisor 部署 Flask 应用程序的完整教程,幸运的是我正好有这篇文章:
应用程序部署通常会带来意想不到的后果和错误。部署可以是制定或…
towardsdatascience.com](/deploying-flask-with-gunicorn-3-9eaacd0f6eea)
使用正确的工具
如果你听过这句话
"使用适合这项工作的工具。"
这个概念直接适用于使用不同的 Python Web 框架。例如,像 Django 这样的框架打包了像 0auth authentication 这样的预制工具和大量其他工具。如果是端点控制,那么创建一个完整的 Django 应用程序,而不是从 Flask 创建,是没有意义的。如果你想了解更多关于 web 框架和它们的设计目的,我写了一篇文章,包含了 5 个我最喜欢的 web 框架,有低级的也有高级的。
[## 面向现代开发人员的 5 个平滑 Python Web 框架
5 个更棒的 Python Web 框架供你欣赏!
towardsdatascience.com](/5-smooth-python-web-frameworks-for-the-modern-developer-47db692dfd52)
每当您创建一个端点时,仔细考虑速度和体积是非常重要的。有许多 web 框架都有几十种不同的特性,在创建端点或全栈应用程序时,需要考虑的东西多得惊人。您肯定不希望使用 Django 这样的东西作为简单的端点。虽然 Flask 当然可以用于全栈开发,但是有很多更好的选择。
成为一个万事通
仅仅因为您的工作主要涉及部署返回 JSON 数据的简单端点,并不意味着学习如何使用 Python 进行身份验证和 fullstack 对您没有好处。你可能会遇到成百上千的问题,所有的问题都有成百上千个完全不同的解决方案。在某些方面,虽然您可能想避免“将胡萝卜放在不同的篮子里”,但您肯定不想避免使用部署技能。
如果您知道如何简单地在 Heroku 或类似的服务上部署模型,为什么不自己尝试在 Unix 服务器上部署呢?这些不同的技能肯定会让你在就业和个人发展方面受益。所有的数据科学家都应该了解终端,即使你不能用 NGINX 和 Supervisor 部署自己的端点,只要熟悉 Bash,你仍然可以成为一名更好的程序员。
结论
使用 Python 的一个好处是你可以有很多选择来解决一个特定的问题。拥有几个 web 框架当然是有益的,并且可以使您的部署和开发工作容易得多。学习如何使用诸如 Crontab 之类的东西,以及诸如 Tornado 和 Pyramid 之类的不同网络框架,肯定会对您的数据科学职业生涯带来难以置信的好处。
给数据科学家写好代码的 5 条建议

luis gomes 摄于 Pexels
以下建议是根据我从学术界到作为数据科学家在不同数据和工程团队的各种项目中工作的经历而提出的。许多数据科学家(包括我自己)没有计算机科学或软件开发背景,因此可能没有受过正规培训或没有良好的代码编写习惯。这些技巧应该有助于新的或有抱负的数据科学家合作编写好的代码,并以更容易生产的方式构建模型。
使用版本控制
这对协作和备份都很重要。它允许我们跟踪项目在开发过程中的变化,对于协调任务和鼓励尽职调查非常有用。Git 是一个强大的版本控制软件,能够分支开发部分,跟踪和提交变更,从远程存储库推送和获取,并在必要时合并代码片段以克服冲突(https://git-scm.com/)。
更多细节请见我的幻灯片“版本控制& Git
让它具有可读性
协作编码的一个关键组成部分是将它交给其他开发人员审查和使用的能力,这意味着它必须是可读的。这包括使用适当的变量名和函数名,并在必要时添加解释性注释,以及定期包含介绍代码片段及其细节的文档字符串。遵循你正在使用的语言的相关风格指南也很重要,例如 Python 中的 PEP-8(【https://www.python.org/dev/peps/pep-0008/】T4)。
保持模块化
编写代码时,保持模块化很重要(https://en.wikipedia.org/wiki/Modular_programming)。也就是说,将它分解成更小的部分,作为整个算法的一部分执行单独的任务。这种级别的功能使您可以轻松:
- 控制变量的范围,
- 重用代码模块,
- 在进一步开发过程中重构代码,
- 阅读、审查和测试代码。
编写测试
试着考虑什么样的测试可以和你的代码一起编写,以便检查你的假设和逻辑的有效性。这些测试可以是任何东西,从模拟预期的输入和输出,到检查代码功能的一系列单元测试。单元测试通常以可重复的方式测试最小可能代码单元(可以是方法、类或组件)的功能。例如,如果您正在对一个类进行单元测试,您的测试可能会检查该类是否处于正确的状态。通常情况下,代码单元是独立测试的:您的测试只影响和监控对该单元的更改。理想情况下,这形成了“测试驱动开发”框架的一部分,以鼓励所有的软件在集成或部署前都经过充分的审查和测试(https://en.wikipedia.org/wiki/Test-driven_development),从而最大限度地减少以后重构和调试的时间。
生产代码
试着像将代码投入生产一样编写代码。这将形成良好的习惯,并在不可避免地(希望如此)投入生产时,使其易于扩大规模。
考虑“算法效率”并尝试优化以减少运行时间和内存使用。“大 O 符号”在这里很重要(【https://en.wikipedia.org/wiki/Big_O_notation】T2)。
还要考虑你的代码环境或生态系统,避免依赖,例如,在代码级别(Python virtualenv:https://conda . io/docs/user-guide/tasks/manage-environments . html)或在操作系统级别(Docker containers:https://www.docker.com/what-container)进行虚拟化。
生产级代码还应该使用“日志记录”,以便于在执行代码时查看、检查和诊断问题(【https://en.wikipedia.org/wiki/Log_file】T4)。
显然,编程和开发领域的深度和广度要大得多,但是希望这些技巧能够帮助人们从代码不多的背景进入数据科学领域。尽情享受吧!
作为数据科学家或 ML 工程师,提高 python 技能的 5 个专业技巧
Patrick 的博客—数据科学
从我作为数据科学家和机器学习工程师的旅程中学到的经验

不要做什么的例子,以及你可以如何改进(此处此图的灵感)。图片作者。)
就像大多数从中断的学术生涯中走出来的数据科学家一样(不管是不是自愿的,对我来说两者都有一点!),出于成为数据科学家/机器学习者的需要,我开始改进我的 python 技能。直到我使用 python 大约一年后,我才开始深深地担心我的 python 技能(为此我要感谢一些人,感谢托马斯·莫亚诺、丹尼尔·蒙塔诺和埃里克·莫法·莫拉莱斯对我作为开发人员的批评,这极大地帮助了我的进步!).
所以我想分享我的经验,告诉大家在我过去的两年里,作为一名数据科学家,同时也是一名开发人员,帮助我提高最快的技巧是什么。
“一个程序员一个月能做到的,两个程序员两个月就能做到。”
弗雷德里克·布鲁克斯
- 掌握 git,并为其使用 GUI
大多数开始的人会被告知“以后再担心 git,首先从编写好的代码开始”或“在开始时使用终端,这是真正的专业人员的做法”。我完全不同意这一点,因为我的个人经验告诉我不是这样…尽管这也是矛盾的事实,即创建任何类型的内容的第一条规则是“专注于内容,然后是内容,然后,如果你有时间,改进内容”。
Git 不仅仅是你工具箱里的一个工具。它记录您的更改,因此您不仅可以跟踪您的工作,还可以跟踪您的改进,并且它使您能够通过恢复更改来修复您的错误。你也可以同时处理不同的想法,通过将它们分开来管理你的时间。这是非常宝贵的,尤其是在学习阶段,您可以通过向提交添加有用的消息来注释对代码的修改。
我也强烈推荐使用 GUI,如 SourceTree 或 GitKraken ,能够直观地看到你的代码库的发展。作为开始, Git 手册会给你一些基础知识,我也强烈建议创建一个虚拟仓库,对它进行测试修改(或者更好,在一个小项目上进行实际的修改),以测试命令并熟悉 Git 和贵由想要使用的东西。使用 GUI 的主要原因非常简单:你打开这个东西,一眨眼的功夫就能看到整个存储库中发生了什么。git 命令行工具永远无法实现这种级别的通信,与存储库的当前状态保持同步是至关重要的。在我看来,Git 存储库是一个非常可视化的对象,所以它应该被可视化。
2.学习你所使用的编程语言的基础知识
Python 是用于数据科学和机器学习的主要语言,但这不是它的唯一用途,有些人可能还在使用 R、JavaScript、Go,甚至 Java(呸!)用于他们的用例/工作。Python 是作为一种成熟的编程语言而设计的,它有大量的用例,所以它非常通用、灵活和有用。学习使用它将使你更有效率和生产力,不仅在你的数据科学或机器学习生涯中,而且作为一名开发人员。
这里有一个简短的清单,列出了你可能想了解的一些事情(按难易程度排列):
- 列表理解和字典理解
- 文档字符串
- 发电机
- 装修工
- 上下文管理器
- 协议(如描述符协议或复制协议
- 类继承(虽然如果你以前学过另一种语言,这可能是已知的,但是回顾一下也无妨)
- python 中的 MRO,以及如何很好地使用 Mixins(以及不好的使用,所以你不要做那些!).
- 一般的软件工程(例如:树遍历、算法的计算复杂度、管理内存等)。).
3.使用 makefile
一个 Makefile 可以被看作是存储在一个文本文件中的终端快捷命令的集合,该文本文件集成了 make 命令行实用程序。看一下本教程了解如何使用 Makefiles。这是一个开始实现的简单技巧,但是它有两个主要影响:
- 它使复杂的命令更容易键入,从而节省了您的时间。您不必记住运行特定命令所需的所有参数、路径和环境变量,这样您就可以将更多的精力放在更重要的事情上。
- 它很自然地记录了您的存储库,而不是它的功能,而是它的用途。在一个存储库中看到一个 Makefile 文件,并用来运行存储库中的代码,这意味着开发人员第一次看到您的代码时,已经对如何运行您的脚本有了大致的了解。(您也可以将注释放在 Makefile 中,但是理想情况下,将您的指令放在 README.md 文件中,在那里您可以详细解释命令应该如何运行!)
4.尽早学习如何使用单元测试
当我开始写代码时,有一件事我一直在做:我写了一些代码,我会打开一个终端,然后我会将我的代码粘贴到终端中,然后继续玩它,看看它是否像我想要的那样工作。如果您打算使用这段代码一次或两次,这是最佳选择。如果你打算用更多的时间,那完全是浪费时间。(这是编程中的一个通用模式:如果你做一件事超过两次,你应该可能自动化它。有时候即使你做了两次。更少的次数,即使你只做一次。但是在某些时候,Python 的禅应该开始了:过早的优化是万恶之源!)
你应该做的是熟悉 python 库 unittest 。它内置于 python 中,工作非常出色。它允许你做的是:你在终端里写的那个东西?您在单元测试中编写它,然后您所要做的就是从终端运行该测试(理想情况下,在 Makefile 中编写一个快捷方式来调用您的测试脚本)。
5.学习 python 的标准库
多少次我试图变得聪明,写一些超级复杂的代码(看起来也很复杂)来解决一个已经被 python 的标准库解决的问题!我给你举个例子。
假设你面前有一周中每天的自助餐厅菜单。所以你有两本字典:
你想写一个函数来生成下面的句子:
当然,现在你可以看到模板:
但是我们如何一次迭代所有这些呢?
一个简单的方法是创建一个新的数据结构(理想的是第一个例子,带有列表理解,不太理想的是第二个例子,完全没有自动化,但是它们创建了相同的结构):
然后在 for 循环中使用该数据结构:
稍微简单一点的方法是进行 for 循环并使用字典:
但是这使得 f 弦读起来有点不自然。理想的方法是,如果我们能够命名这些变量,它们实际上是什么,这是有可能的与 zip!
它有许多优点:
- 提高了可读性。现在你的 f-string 准确地说出了它在做什么,你的变量也准确地以它们的名字命名。(我提到过你应该在 python 中使用 f 字符串吗?他们太棒了!)
- 不需要中间数据结构。你所做的只是使用你已经拥有的数据和使用标准的库函数,所以它是快速、有效和可重复使用的。另外,当你学会经常使用这些技巧时,你可以以一种非常灵活和有效的方式重用你已经拥有的数据结构。
- 代码更少。由于 zip 是标准库的一部分,您不需要重新阅读或维护构建迭代器的逻辑,它基本上记录了它自己(因为您的变量是根据它们所代表的来命名的),并且您没有实现任何新的东西,所以您的代码保持更加简洁。
标准库中有如此多的工具,我鼓励您像上述情况一样探索改进您的代码,例如
还有更多!
我相信,作为一名数据科学家,如果你在业余时间花点时间做一点这五个步骤,你的编码技能会增长得非常快,你会很快变得更有效率。
请在评论中告诉我你对这篇文章的看法!
每个数据科学家都应该知道的 5 个专业项目
客户细分、文本分类、情感、时间序列和推荐系统。

freestocks 在Unsplash【1】上拍摄的照片。
目录
- 介绍
- 客户细分
- 文本分类
- 情感分析
- 时间数列预测法
- 推荐系统
- 摘要
- 参考
介绍
本文的目标是概述专业数据科学家最终将执行或应该执行的项目。我参加了很多数据科学方面的训练营和教育课程。虽然它们在某种程度上都很有用,但我发现有些人忘记强调数据科学的实际应用。当您从教育型数据科学家过渡到专业数据科学家时,知道会发生什么是有益的。客户细分、文本分类、情感分析、时间序列预测和推荐系统都可以极大地帮助你的公司。我将深入解释为什么会想到这五个项目,我们希望能激励你在工作中使用它们。
客户细分
客户细分是数据科学的一种形式,其中采用无监督和聚类建模技术来开发人群或数据观察的组或段。目标是创建独立的组,但是这些组本身具有密切相关的特性。这种分离和结合的技术术语叫做:
组间平方和()
- 这些独特的群体是多么的不同
组内平方和(WGSS)
- 独特的群体特征有多密切相关

k-均值聚类。图片作者[2]。
正如你在上面的图像中所看到的,这些群体被很好地分开了——BGSS 和紧密地集中在一起——WGSS。这个例子很理想。把每一个集群想象成那些你会用特定营销广告瞄准的群体:'我们想通过把我们公司的产品作为以年轻专业人士为中心的来吸引刚毕业的大学生。一些有用的聚类算法有:
*DBSCANK-meansAgglomerative Hierarchical Clustering*
客户细分结果会怎么样?
—发现关于特定群体的见解
—针对特定群体的营销
—首先定义组
—跟踪某些组的指标
这种类型的数据科学项目被广泛使用,但在营销行业中最有用。
文本分类

文本分类实例的特点和目标。作者代码[3]。
文本分类属于自然语言处理(NLP)的范畴,NLP 利用技术摄取文本数据。您可以将该算法或项目视为一种通过使用文本特征(以及数字特征)对文本标签进行分类的方法。
这里【4】是一个利用文本和数字特征进行文本分类的简单例子。你的文本特征不是只有一个单词,而是可能有数百个,并且需要执行 NLP 技术,比如词性标注、停止单词移除、 tf-idf 、计数矢量化等。科学家在 Python 中使用的一个常见库数据是 nltk 。这些技术的目标是清理您的文本数据,并创建其自身的最佳表示,从而消除噪声。
permalink dissolve GitHub 是超过 5000 万开发人员的家园,他们一起工作来托管和审查代码,管理…
github.com](https://github.com/mprzybyla123/nlp-example/blob/master/code/nlp_example.ipynb)
文本分类结果会怎么样?
—观察值的自动分类
—与每个建议类别相关的分数
您还可以对文本文档进行分类,否则手动阅读需要花费数小时。
这种类型的项目在金融或历史学家/图书管理员行业非常有用。
情感分析
情感分析也属于 NLP 的范畴。这是一种从文本中分配情感分数的方式,或者更具体地说,是极性和主观性。当你有大量的文本数据并且想要消化它来创建好的或坏的情绪等级时,使用情绪分析是有益的。如果你的公司已经有了评级系统,这看起来可能是多余的,但是人们经常会留下与他们的数字分数不匹配的评论。情感分析的另一个好处是,你可以标记出某些你想要突出的关键词或短语,以使你的产品更好。将关键词与关键情感联系起来,可以用来汇总指标,这样你就可以直观地看到你的产品缺少什么,哪里可以进行改进。
情感分析结果会怎么样?
—产品改进
—情绪标记为客户服务
这种类型的项目在很多行业都很有用,尤其是电子商务、娱乐或任何包含文本评论的领域。
时间数列预测法

Sonja Langford 在 Unsplash 上拍摄的照片。
时间序列可以应用于各种工业部门的几个部分。大多数情况下,时间序列预测最终可用于为未来分配资金或资源。如果你有一个销售团队,他们会从你的预测中受益,投资者也会受益,因为他们看到了你的公司的发展方向(有望增加销售额)。更直接地说,如果您为某些员工分配了当天的预测目标,您可以将员工分配到一般位置。一个流行的例子是亚马逊或任何类似的公司,其中消费者有频繁的行为,需要工厂、司机和不同位置的分配,这些将合并在一起。
时间序列预测结果会怎么样?
资源的分配
—对未来销售的认识
一些利用时间序列的流行算法是 ARIMA 和 LSTM。
这种类型的项目在很多行业也很有用,但通常是在销售或供应管理方面。
推荐系统

虽然你可能在设计网飞的下一个推荐系统算法,也可能不在设计,但你可能会发现自己正在将类似的技术应用于自己业务的几个部分。想想用这种类型的项目,最终实现用户更多产品的销售。作为一名消费者,如果你正在购买某些产品或杂货,但你在购物车的最后看到一些推荐的产品,你可能会倾向于迅速购买这些推荐的产品。将这个结果扩展到每一个用户,你可以让你的公司赚上百万。
以下是数据科学中实现推荐系统的一些常用方法。
协同过滤——交替最小二乘法(矩阵分解)
- 其他人和你有多相似,向你推荐他们喜欢的东西
基于内容的过滤—余弦相似度
- 您已经购买的产品的属性或特征如何在未来推荐类似的产品
这种类型的项目在很多行业也很有用,但通常是在电子商务和娱乐业。
摘要
我希望我通过强调这些关键项目给了你一些启发,这些项目你可能已经经常使用,或者作为一名专业数据科学家将要使用。教育中对机器学习的关注,有时候是关注于获得最好的准确性,但专业意义上的数据科学的关注,是帮助你的公司改进产品,帮助人们,节省或赚更多的钱。
总结一下,这里有五个热门的专业项目可以练习:
customer segmentationtext classificationsentiment analysis time series forecastingrecommender systems
我希望你喜欢我的文章。感谢您的阅读!请随时在下面发表评论,并建议您遇到的其他专业数据科学项目,以便我们都可以改进我们的专业数据科学产品组合。
参考
[2] M.Przybyla,k-均值可视化,(2020 年)
[3] M.Przybyla, nlp-example.ipynb ,(2020 年)
[4] M.Przybyla,NLP-示例,(2020)
[5]照片由 Sonja Langford 在Unsplash(2014)上拍摄
[6]照片由西蒙·贝克在Unsplash(2020)上拍摄*
有抱负的数据科学家的 5 个项目想法
包括数据源和示例项目。

近年来,数据科学获得了极大的普及。越来越多的企业看到了数据创造价值的潜力。因此,对数据科学家的需求有所增加,这鼓励了许多人在数据科学领域开始职业生涯。现在学数据科学的资源绝对不缺。我没有数过,但我很确定有一千多个与数据科学相关的在线证书。当书籍、播客和 youtube 视频被添加到堆中时,它就成为一个巨大的资源集合来消费。
有各种各样的资源可以学习是很好的。然而,在你学习了基础知识和当前的工具和软件包之后,是时候用项目来挑战自己了。哪些独立的项目增加了你的技能,是在线证书所不能实现的。我有一个关于为什么你应该开始做项目的详细帖子。如果你想看的话,就在这里。
把手弄脏来学习。
towardsdatascience.com](/5-reasons-why-you-should-do-projects-instead-of-collecting-data-science-certificates-9023accda6b4)
在这篇文章中,我将列出 5 个项目想法以及如何找到相关的数据集。我还会给出一个例子项目的链接,它可以帮助你开始。
1。图像分类
利用深度学习的领域之一是计算机视觉。神经网络在这一领域有许多应用,例如图像识别、检测或生成伪造的图像和视频。神经网络也广泛应用于医疗保健行业。例如,神经网络已经被证明在使用 x 射线的癌症检测中是成功的。图像分类项目将是你进入这一广阔领域的第一步。

二值图像分类
您可能会使用卷积神经网络(CNN)进行图像识别。细胞神经网络通常用于数据科学领域,尤其是计算机视觉和图像分类任务。图像由用数字表示的像素组成。在 CNN 的卷积层中,滤波器(或特征检测器)被应用于图像,以通过保持像素之间的空间关系来提取图像的独特特征。
数据集包含许多不同物体的大量图像。这是训练和测试 CNN 的一个很好的数据集。非常感谢社区准备并让我们使用这个数据集。
以下是创建基本影像分类模型的演练:
理论解释和实际例子
towardsdatascience.com](/a-practical-guide-on-convolutional-neural-networks-cnns-with-keras-21421172005e)
2。流失预测
流失预测是机器学习领域的一个常见用例。对于企业来说,了解客户可能流失(即离开公司)的原因和时间非常重要。拥有一个强大而准确的客户流失预测模型有助于企业采取措施防止客户离开公司。

提供任何类型服务的公司都担心客户流失。他们想尽可能长久地留住客户。为了完成这项任务,他们需要知道客户何时离开以及为什么离开。
网上有很多客户流失数据集。一个不错的例子是 kaggle 上的“电信客户流失”数据集。
下面是一个流失预测示例的演示:
机器学习项目的分步说明。
towardsdatascience.com](/churn-prediction-with-machine-learning-ca955d52bd8c)
3。股票价格预测
时间序列预测是数据科学的另一个广泛领域,在零售、金融、供应链等许多行业都有应用。历史数据用于预测未来的行为。
股票价格预测是时间序列预测的一个应用,帮助你熟悉这个领域。可以用来预测股票价格的一个关键因素是历史价格。Pandas 是一个 python 数据分析库,它提供了一个非常简单的工具来获取历史股票价格数据。你只需要如下使用 pandas 的 datareader 模块:
import pandas as pd
from pandas_datareader import data
aapl = data.DataReader("AAPL",
start='2015-1-1',
end='2019-12-31',
data_source='yahoo')
上面的代码下载了苹果(AAPL)的股票价格,并将其保存到一个熊猫数据框中。可以使用参数更改开始和结束日期以及股票名称。
LSTM(长短期记忆),这是一种 RNN(递归神经网络),可用于预测股票价格使用历史数据。LSTM 适合对序列数据建模,因为它维护一个内部状态来跟踪它已经看到的数据。LSTMs 的常见应用包括时间序列分析和自然语言处理。
以下是使用 LSTMs 进行股票价格预测的过程:
如何使用递归神经网络预测股票价格?
towardsdatascience.com](/predicting-apple-stock-prices-with-neural-networks-4aefdf10afd0)
4。预测二手车价格或房价
我敢肯定,你遇到过一个网站或应用程序,给你的汽车或房子的市场价值。其中一些非常普遍,对市场产生了影响。我们可能会用这些价格作为谈判的基础。

艾伦·j·亨德利在 Unsplash 上的照片
预测二手车或房子的价格最好用机器学习来完成。我们建立一个机器学习模型,并用我们已经知道的东西训练它。然后剩下的就是靠我们模型的预测了。
这将是回归的良好实践,回归具有广泛的应用,例如预测预期寿命、销售和需求预测或生产系统的运行效率。
kaggle 上有一个结构良好的房价数据集。你也可以从网站上搜集自己的数据。网络抓取是数据科学家必须掌握的一项重要技能。
以下是二手车预测任务的一个示例。它还包含一个网页抓取部分:
从数据收集到模型评估的完整数据科学项目
towardsdatascience.com](/predicting-used-car-prices-with-machine-learning-fea53811b1ab)
5。探索性数据分析
这一个与我们到目前为止讨论的不同。然而,这也是数据科学家的基本实践。创建机器学习或深度学习模型并不是数据科学家唯一要做的事情。在许多情况下,我们首先需要更深入地挖掘数据。我们应该从许多不同的角度处理数据,以便能够创造数据的价值。数据告诉我们的东西有时候并不那么清晰。我们需要探索数据中的底层结构或关系。因此,探索性数据分析(EDA)是一个非常重要的过程。数据科学家需要熟悉 EDA 中使用的工具,如数据分析和数据可视化库。
你可以选择 Kaggle 或任何其他平台上可用的数据集,并尝试探索它。实践越多,使用 EDA 工具就越容易。我用我感兴趣的数据集练习了很多。一旦你开始发现不那么明显的结构或关系,事情就变得更有趣了。
下面是我做过的几个 EDA 实践:
探索英超 2019-2020 赛季
towardsdatascience.com](/a-practical-guide-for-exploratory-data-analysis-english-premier-league-cac1e2695d30) [## 探索性数据分析实用指南:Spotify 数据集
一张图胜过千言万语
towardsdatascience.com](/a-practical-guide-to-exploratory-data-analysis-spotify-dataset-d8f703da663e)
就像任何学习过程一样,我们开始做简单的项目,然后通过做得越来越多来提高水平。我们最终认识到,我们的项目有可能在生产中实现。但是,为了能够达到生产水平,我们需要开始做项目。收集一堆证书不会把我们带到那一步。我建议在学习基础知识后,花时间在项目上。最好的做法是亲自动手,做很多项目。
感谢您的阅读。如果您有任何反馈,请告诉我。
让我的生活更轻松的 5 个 Python 技巧
计算机编程语言
使用 Python 提高您的工作效率

背景由 Pakata Goh 在 Unsplash
目录
- 简介
- Python 虚拟环境
- Python 交互外壳
- Python 调试器
- λ函数λ
- 列表和字典理解
介绍
Python 是什么?
Python 是一种流行的解释的、面向对象的、高级编程语言,可用于广泛的多种应用:软件开发、web 开发(后端)、数学、数据科学……
随着时间的推移,一个好的开发人员总是会寻求提高他的生产力。
所以让我告诉你,让我的 Python 生活变得更容易的 5 个技巧和诀窍。
1.Python 虚拟环境:
Python 如此占主导地位的很大一部分原因是因为它有很多好的库。事实上,Python 有这么多好的数学( NumPy )、统计、数据分析库,它可能会存在很长一段时间。所以依赖管理可能有点烦人,换句话说,你如何找到你需要的特定项目的库,使它可共享和可移植?我们为什么要使用虚拟环境?
所以虚拟环境的目的是拥有空间,我们可以在那里安装特定于某个项目的软件包,所以例如,假设你有许多使用 Django 版本 1 的 Django 网站,但是你想在一个新项目中开始使用 Django 版本 2,那么,如果你只是使用单个全局环境,那么当你更新到 Django 版本 2 时,它可能会破坏一些使用 Django 版本 1 的旧项目。所以我们不希望所有的项目都指向姜戈·⟹的某个瞬间,每个项目都应该有自己独立的包。我们实现这一目标的方法之一是通过虚拟环境。
只需知道,当您使用 Python 时,通常在虚拟环境中工作是最佳实践。
让我们来设置一下我们的环境:
- 对于 Windows:(内置 venv 模块)
我们首先需要创建一个新的目录(文件夹)
- 使用 cmd 命令(
cd改变目录,mkdir创建新目录)。 - 或者简单地通过使用 Windows Gui 创建一个新文件夹,然后在文件夹的路径上键入
cmd。


注意:要列出您已安装的软件包,您可以在命令提示符(cmd)中键入pip list。

要创建虚拟环境,我们只需输入:
python -m venv *The name of the folder you want it to be in*
for example:
**python -m venv project1**
要激活它:
'virtual environment name'\Scripts\activate.bat
for example:
**project1\Scripts\activate.bat**

现在,如果我们尝试使用pip list,我们可以看到只安装了pip和setuptools。太好了,我们可以在我们的特定环境中安装某些包。
在这个截图中,我试着安装了'request',所以结果是我们预期得到的。
- 对于 Linux 和 macOS:(带有 virtualenv 软件包)
首先,我们必须安装软件包:
pip install virtualenv
然后创建新环境:
virtualenv venv *The name of the folder you want it to be in*
for example:
**virtualenv venv Project2**
最后激活虚拟环境:
source venv/bin/activate
现在我们可以孤立地安装任何依赖项。
2.Python 交互式 Shell:
当你使用终端来运行你的 python 脚本时,我们习惯于键入python filename.py,但是还有另一种方式来运行你的脚本,那就是通过在文件名前添加-i来使用交互式 shell。所以我们可以调用函数或变量来测试和尝试(有点热重装)…
这对于开发像机器人这样的东西非常有用。
例如,让我们考虑这个函数:
def maxi(a,b):
return max(a,b)

输出
3.Python 调试器:
- 原生 Python 调试器(pdb):
Python 调试器set_trace()方法可以在文件执行完毕之前停止它,这样您就可以调试了(这与插入断点是一样的)。
当我们试图运行这段代码时,会得到一个错误。但是假设这段代码很大,我们不知道错误发生在哪里。在这种情况下,我们可以导入 pdb 模块(内置 python)并调用set_trace()方法来停止这段代码的执行:
现在我们可以做不同的事情,例如:
你可以通过 kapeli.com查看 这张小抄
因此,这可以帮助我们确定代码在哪里中断,我们甚至可以通过复杂的多级函数调用跟踪调试器。
最棒的一点是你可以内嵌导入 pdb,这样你就不需要在文件的顶部做了。
- 视觉/图形调试器:
现代调试器是基于 GUI 的,通常是集成开发环境(IDE)的一部分,或者是具有 IDE 功能的编辑系统的一部分。我建议您使用:
- Visual Studio Code(vs Code):运行在 Windows、macOS、Linux 上的轻量级多语言 IDE/编辑器。
- py charm:是用于计算机编程的集成开发环境(IDE),专门针对 Python 语言。它是由捷克公司 JetBrains 开发的。
- Komodo:是一个全功能的 Python IDE E,支持 ActiveState 开发的主流编程语言
4.λ函数λ:
我们可以使用关键字def创建 Python 函数。Python 为我们提供了另一种创建函数的方法,这种方法非常简短,因为它们仅限于单个指令。
语法 : lambda *arguments* : *expression* 注意:一个 lambda 函数可以接受任意数量的参数,但只能有一个表达式。
为什么使用 lambda 函数而不是命名函数?
Lambda 函数通常用在特定的上下文中,对于这种情况,使用def定义一个函数会不太实用或者更长。例如,如果您想在交互式 shell 中定义一个函数,另一个可能更复杂的例子是在需要回调函数的列表方法(或 NumPy )中,例如排序、映射和过滤。
关于 numpy.fromfunction 和 Numpy 库的更多信息,请查看这篇文章。
5.列表和字典理解:
- 列表理解:
列表理解是非常强大的工具,允许使用更接近 Python 中常用语法的映射和过滤。此外,它们允许您同时将贴图和过滤器结合起来。想法很简单:简化代码,使其更具可读性,从而更快地编写和,更容易维护。
语法:
*new_list = [function(item) **for** item **in** list **if** condition(item)]*
示例:
假设我们有这个Users列表,我们想从一个对象中提取一个属性,但是在传统语法中要做到这一点,我们至少要写 3 行,使用列表理解,我们只能在一行中完成。
我们还可以过滤列表,在最后添加一个条件语句:
例如:如果名称以‘A’开头,那么我们将它添加到新列表中。
- 字典理解:
这有点类似于“列表理解”。
让我们从Users列表中提取一个字典,将用户名作为键,将薪水作为值。通常,我们必须手动循环列表项,但在这种情况下,我们可以只做一行。
资源:
- https://python . doctor/page-comprehension-list-listes-python-cours-buttants
- https://open classrooms . com/fr/courses/1206331-utilization-avance ee-des-listes-en-python
- https://kapeli . com/cheat _ sheets/Python _ debugger . docset/Contents/Resources/Documents/index
- https://www.activestate.com/products/komodo-ide/
- https://en.wikipedia.org/wiki/PyCharm
感谢阅读!😄
查看我的其他文章并关注我的 中型*
哈利菲·艾哈迈德·阿齐兹
5 Python 实用工具和任务
将电子邮件标记为已读,将视频转换为音频再转换为文本等等

Python 是当今最受欢迎的编程语言,这在很大程度上归功于其简单的学习曲线。
但是它的流行也归功于它提供的各种各样的模块。难怪它是自动化的绝佳选择,而且几乎是公用事业任务不可或缺的。
你可能是一名数据科学家或前端开发人员,或者只是一名分析师,但以下 Python 工具列表将对所有人都有帮助。其中一些可能是显而易见的,而另一些可能会让你大吃一惊。
查看最近的电子邮件,并将所有未读邮件标记为从命令行查看
有多少次你被迫从终端切换到互联网浏览器,只是为了查看最近的电子邮件?每个人都会经历几次,我们中的一员。
通过消除这种上下文切换,您可以加快工作流程并提高生产率。只需使用 python imaplib模块,就可以登录你的邮箱并获取邮件。
该库允许您按日期、主题、发件人等过滤电子邮件。因此,使用下面这段代码,您可以获取最新的 n 封电子邮件,而无需手动登录浏览器:
RFC822是一种互联网接入消息协议。你也可以从每封邮件回复中查找Subject、Content和Date。
注意:对于双因素身份验证的 Gmail 帐户,在登录方法中传递密码不起作用。您需要生成一个令牌,并通过参考以下步骤在密码字段中设置它:
1\. Log into your Gmail account.
2\. Navigate to https://security.google.com/settings/security/apppasswords
3\. In 'select app' choose 'Custom', give it any name name and press generate.
4\. It will give you a token which you can paste in the above script.
如今,我们的收件箱充满了促销邮件,这只会增加收件箱的未读数量。当您的收件箱超过 100 页时,选择所有邮件并将其标记为已读是一项非常耗时的任务。
幸运的是,上面的 imap 模块可以让您搜索看不见的邮件,并将它们设置为已读。首先,将前面代码的搜索过滤器改为:
mail.search(None, '(UNSEEN)')
最后,在 for 循环中添加以下代码:
original = email.message_from_bytes(response_part[1])
mail.store(num,'+FLAGS','\\Seen')
反斜杠Seen很重要。我用上面的脚本成功地将收件箱的未读计数减少到零!
2.视频下载程序
人人都爱看 YouTube 视频。我们中很少有人希望在本地保存一些视频文件。令我们惊讶的是,[youtube-dl](https://github.com/ytdl-org/youtube-dl) Python 模块正是为此而生的。
只需安装软件包,并在命令行上运行它,并带有 YouTube 链接,如下所示:
pip install youtube-dl> youtube-dl <Video Link Here>
但有时,我们喜欢定制下载选项。例如,下载多首曲目或一个播放列表,或者设置输出目录并根据分辨率选择视频格式。

这个库的伟大之处在于它允许你下载 YouTube 之外的视频链接。
3.从命令行获取股票更新
你多久在谷歌上查一次货币兑换率?当人们旅行时,这肯定是一个好数字。如果你是一个被动关注股市的人,拥有一个命令行 python 脚本肯定会有所帮助。尤其是,如果你想在工作的时候偷偷看一眼。
我们有 Python 的[yfinance](https://github.com/ranaroussi/yfinance),这正是你追踪股票所需的库。
pip install yfinance
yfinance为我们提供了大量的数据,如股票信息,历史数据,分割,股息,quarterly_financials等等。所有这些都包含在一个Ticker模块中。
虽然没有任何直接的方法来获取股票的实时价值,但我们可以使用以下解决方法:
q = yf.Ticker("AAPL")
data_frame = q.history("1d")
price = data_frame["Close"].values[0print(f'Apple current stock price: {price}')
上面的代码工作起来很有魅力,但是如果你想听多个报价器,你也可以用下面的代码:
tickers = yf.Tickers('msft aapl amzn')print(tickers.tickers.MSFT.history("1d")["Close"].values[0])print(tickers.tickers.AAPL.history("1d")["Close"].values[0])print(tickers.tickers.AMZN.history("1d")["Close"].values[0])
同样,如果你想得到货币汇率,使用freecurrencyrates.com。这里是它的 Python 脚本。
4.将 mp4 转换为 mp3 再转换为文本
Python 的pydub模块可以让你完成从视频转换到直接混合不同文件的音频处理任务。
忠于它的名字,你也可以通过音调调制或设置音频的某些部分更大声或更安静来调整音调。现在,我们来看看从 mp4 视频中提取 mp3 文件有多简单:
from pydub import AudioSegmentAudioSegment.from_file("/path_to_video").export("~/output.mp3", format="mp3")
AudioSegment是加载、转换和保存音频文件的容器。
接下来,让我们从音频文件进行语音到文本的转录。首先,使用pip安装SpeechRecognition模块。接下来,我们将 mp3 导出为 wav 文件,并对其进行转录:

5.从视频中提取图像帧
最后但同样重要的是,我们有一个专门面向数据科学家的 Python 脚本。
数据科学家在训练他们的模型时总是希望收集更多的数据,视频是访问图像的最大来源之一。
令人高兴的是,拥有一系列图像处理技术的 OpenCV 可以为你从视频中提取帧。
简单地安装带有 pip 的opencv-python模块,如下所示:
pip install opencv-python
对任何视频文件运行以下脚本,从每一帧中获取 jpeg 图像。
import cv2
videocap = cv2.VideoCapture('input.mp4')
success,image = videocap.read()
count = 0while success:
cv2.imwrite("frame%d.jpg" % count, image)
success,image = videocap.read()
print('Read a new frame: ', success)
count += 1
现在,上面的脚本会创建太多重复的图像,因为我们还没有指定任何帧数。
要限制每秒提取的帧数,请在上述 while 循环中的cv2.imwrite之前添加以下代码行:
videocap.set(cv2.CAP_PROP_POS_MSEC,(count*1000))
这将每秒仅捕获一帧。您可以根据您的使用情况相应地更改它。
OpenCV 任务不仅仅局限于数据收集。您可以在提取的帧上运行计算机视觉任务。运行模糊检查或图像相似性请求只是您可以执行的许多用例中的两个。
外卖食品
Python 的模块生态系统使得以即插即用的方式运行复杂的任务成为可能。最好的事情是你不需要编码知识来运行上述任务。
最后,如果您希望将数据从一个 Python 脚本传递到另一个脚本,请执行以下操作:
#second_script.pyfrom first_cript import variableprint(f'Hello {variable}')
我希望你发现上面收集的 Python 脚本很有用,并在日常工作中使用这些很酷的技巧。
这一次到此为止。感谢阅读。
下一次面试前要解决的 5 组 Python 算法
集合是许多 Python 访谈中反复出现的话题,并且经常提供高效求解算法的捷径

JESHOOTS.COM在 Unsplash 上拍照
更新:你们很多人联系我要有价值的资源 钉 Python 编码访谈 。下面我分享 4 个我强烈推荐在练习完本帖的算法后坚持锻炼的课程/平台:
- leet code In Python:50 算法编码面试问题→最适合涉及算法的编码回合!
- StrataScratch:pt hon&SQL 面试编码问题→**最佳平台我找到了额外的 Python & SQL 编码演练!**
- 用 Python 练习编码面试题(60+题) → 列表、数组、集合、字典、map()、filter()、reduce()、iterable 对象
- Python 数据结构&算法(纳米级) → 优质课程如果你有更多的时间。
这篇文章包括代销商链接,如果你购买的话,我可以在不增加你额外费用的情况下赚取一小笔佣金。
在学校学习数学的时候,几乎没有人真正喜欢它们,因为它们看起来很无聊,但是如果你正在准备 Python 编码屏幕或白板面试,并且你希望搞定它,你现在真的必须学习集合运算符和方法。集合是你需要在你的武器库中拥有的一种武器,因为常见的用途包括删除重复、计算集合上的数学运算(像并集、交集、差和对称差)和成员测试。
集合也不是我在 Python 之旅中学到的第一件事。如果你像我一样是一个动手型的人,你可能从一些真正的项目开始,这意味着最初,你几乎肯定会使用高级包而不是内置模块。然而,当我开始解决算法以面试大型科技公司时,我意识到集合在许多不同难度的挑战中反复出现,并经常提供解决它们的捷径。
“我意识到集合在许多不同难度的挑战中反复出现,并经常提供解决它们的捷径”
在最近的一篇文章中,我展示并分享了我在真实采访中遇到的一些 Python 算法的解决方案* ( 看看吧!)😗**
*** [## Python 编码面试前要解决的 10 个算法
在这篇文章中,我介绍并分享了 FAANG 中经常出现的一些基本算法的解决方案
towardsdatascience.com](/10-algorithms-to-solve-before-your-python-coding-interview-feb74fb9bc27)
在这篇文章中,我将采用类似的方法,将理论与算法挑战结合起来。大家一起来解决吧!
1)删除重复项
在 Python 中,可以通过两种方式创建集合:
- 使用内置的
set()功能。例如,如果一个字符串s被传递给set(),那么set(s)在该字符串中生成一个字符列表:
set(‘algorithm’)
Output: {'a', 'g', 'h', 'i', 'l', 'm', 'o', 'r', 't'} #<- unordered
- 使用花括号
{}。使用这种方法,即使是可迭代的对象也可以完整地放入集合中:
set1 = {‘algorithm’}
print(set1)
Output: {'algorithm'}set2 = {'algorithm', 'interview'}
print(set2)
Output: {'algorithm', 'interview'}
更详细地说,内置的**set()**数据类型具有以下特点:
- 就是 无序、 可迭代 和 可变;
- 它的元素可以是不同类型的对象(整数、浮点、元组、字符串等)。)但是这些元素必须是不可变的类型(列表和字典被排除在外);
- 它只能包含特有的元素。这意味着在使用集合时会自动删除重复的元素。
最后一个特征是关键的,因为它意味着我们可以使用set()从(例如)数组中删除重复项。
问题#1:包含重复→简单
**Output:
True**
多亏了 sets,这个问题可以通过一行程序得到解决。事实上,当一个数组被传递给set()函数时,所有重复的元素都被删除,这意味着集合的长度将等于原始数组的长度,前提是数组首先包含不同的元素。
2)计算集合上的数学运算
因为集合是无序集合(它们不记录元素位置或插入顺序,许多可以在其他 Python 数据类型上执行的操作(如索引和切片)都不被集合支持。
尽管如此,Python 为我们提供了大量的操作符和方法来复制为数学集合定义的操作。例如,假设我们有两个集合(s1 and s2),都包含字符串,我们想要合并它们。在这种情况下,我们可以使用 union 操作符(|)或 union 方法(s1.union(s2))来执行相同的操作:
**#Create 2 sets including strings:
s1 = {‘python’, ‘interview’, ‘practice’}
s2 = {‘algorithm’, ‘coding’, ‘theory’}#Using the operator:
print(s1|s2)# Using the method:
print(s1.union(s2))Output:
{'python', 'algorithm', 'interview', 'practice', 'coding', 'theory'}
{'python', 'algorithm', 'interview', 'practice', 'coding', 'theory'}**
正如你所看到的,看起来集合操作符和方法的行为与 是一样的,它们可以互换使用,但是它们之间有一点点不同。当使用运算符时,两个操作数都必须是 set,而方法将接受任何参数,先将其转换为 set,然后执行运算。此外,集合上的每一个数学运算都有一个方法,但对于运算符来说就不一样了。
使用运算符时,两个操作数都必须是集合,而方法接受任何参数,先将其转换为集合,然后执行运算
让我们通过解决以下三个问题来发现一些更常见的集合运算符和方法:
问题#2:两个数组的交集→简单
**Output:
[5, 7]
[5, 7]**
如上所示,要返回两个数组共有的元素,您可以将nums1和nums2都转换为集合,然后用&运算符找到它们的交集,或者只将nums1转换为集合,并使用nums2作为.intersection()方法的参数(这将在执行交集之前自动将 nums2 从数组转换为集合)。第二种方法( solution_two )需要更多的输入,但它更安全、更快,需要的内存也更少,因此在实际面试中解决算法时应该优先考虑。有几次,在我的解决方案中,我选择了一个运算符,然后面试官要求我谈谈等效的方法,并相应地重写解决方案…
问题#3:键盘行中的单词→简单
*Output:
['Type', 'Router', 'Dash', 'Top', 'Rower']*
以上问题的解决方案既简洁又高效。实际上,为了检查words数组中的每个单词是否由美式键盘上单行的字母组成,每个单词最初都使用set()函数转换成一个集合。如前所述,当我们这样做时,单词被拆分,这样每个字母都成为集合中的一个元素。例如,如果我们将单词 "Type" 传递给set()函数(并转换为小写),我们将获得:**
**set1 = set(‘Type’.lower())
print(set1)
Output: {'t', 'e', 'p', 'y'}**
现在我们可以利用.difference()方法来检查{'t','e','p','y'} 和三组键盘字母之间的差是否返回空集。如果返回一个空集(if not,这意味着这个单词是由属于一个特定行的字母组成的,然后它应该被附加到result。
问题#4:两句话中的生僻字→简单
**#Output:
['enjoy', 'love'] #<-- note how "you" and "we" are also excluded**
在实际的面试中,你经常会得到两个整数数组(或者像本例中的两个句子),你被要求找出属于第一个或第二个项目组的所有元素,而不是两个都属于。这种问题可以通过使用.symmetric_difference()方法或等效的^操作符来解决。
然而,如果一方面这种算法通过提供只包含空格分隔/小写单词的句子使您的生活更容易,另一方面,它要求每个单词也是唯一的,这意味着您需要找到一种方法来计算单词(collections.Counter()),并验证它们“在每个句子中只出现一次。
3)执行成员测试
通常,为了解决一个算法,你需要确定两个或多个数组是否有任何共同的元素或者一个数组是否是另一个数组的子集。幸运的是,Python 的集合提供了许多运算符来执行成员资格测试,但是我在实际采访中使用最多的是:
s1.isdisjoint(s2):如果s1和s2没有共同的元素,这个操作返回True。没有对应于此方法的运算符。s1.issubset(s2)或s1<=s2:如果s1是s2的子集,则该操作返回True。注意,因为集合s1被认为是自身的集合,所以要检查一个集合是否是另一个集合的真子集,最好使用s1<s2。这样可以验证s1的每个元素都在s2中,但是两个集合不相等。
在本文的最后一个问题中,您将能够应用上述方法之一。请记住,下面的算法比其他四个算法(级别:中等))更具挑战性,因此,请花些时间找到合适的策略来解决它。
问题 5:最喜欢的公司列表→中等
**Output:
[0, 1, 4]**
在上面的解决方案中,enumerate()使用了两次:第一次循环返回favcomp中包含的每个子列表,而第二次循环检查第一次循环获得的列表是否是favcomp中任何其他列表的子集。当 set 方法返回True时,flag(最初设置为True)切换到False,从而最终只有与flag保存有True值的列表相匹配的索引被分配给result。这是一个 BF 解决方案,所以请随意找到一个更有效的方法,并在评论中分享。
结论
在本文中,我提出了 5 个 Python 编码挑战,并使用集合操作符和方法解决了它们。当算法需要删除重复项、执行常见的数学运算或验证成员资格时,Set 方法是非常强大的工具。请放心,随着您不断练习编码,循环模式将变得更加明显,您将学会动态应用集合运算!
注意这篇文章中的练习(以及它们的解决方案)是对 Leetcode 上的问题的重新诠释。我远非该领域的专家,因此我提出的解决方案只是指示性的。
如果你喜欢这篇文章,请留下评论。祝你面试准备顺利!
资源:
您可能还喜欢:
** [## Python 中复制的 8 个流行的 SQL 窗口函数
关于如何利用业务分析中的 Pandas 高效复制最常用的 SQL 窗口的教程…
towardsdatascience.com](/8-popular-sql-window-functions-replicated-in-python-e17e6b34d5d7) [## 在你开始第一个项目之前,要掌握 15 个 Git 命令
您需要掌握的最后一个 Git 教程是命令行版本控制。
levelup.gitconnected.com](https://levelup.gitconnected.com/15-git-commands-you-should-learn-before-your-very-first-project-f8eebb8dc6e9)*****
Python 字符串 101
掌握基础知识

这篇文章非常实用,为你提供了在 Python 中使用字符串的简单快捷的技巧。
字符串乘法
Python 不仅允许数字相乘,还允许字符串相乘!重复一个字符串,如下所示:
>>> "a"*3
'aaa'
>>>
您也可以将字符串乘以一个布尔值。例如,如果一个数字小于 10,下面的代码片段会用前导零填充该数字:
>>> sn = lambda n: '{}{}'.format('0' * (n < 10), n)
>>> sn(9)
'09'
>>> sn(10)
'10'
>>>
标题
如今,写标题很常见(即使是中号),每个单词的首字母都要大写。嗯,用 Python 可以很容易地做到这一点:
>>> "the curious frog went to denmark".title()
'The Curious Frog Went To Denmark'
>>>
连锁的
您可以使用+运算符连接两个字符串,但这不是最好的方法。Python 字符串是不可变的,使得这个操作符从这两个字符串中创建一个新的字符串,而不是像我们所想的那样,简单地将第二个字符串添加到第一个字符串中。更好的方法(和更快的)是使用 join() 函数将它们连接起来:
>>> "".join(["abc", "def"])
'abcdef'
>>>
获取子字符串
使用 Python 的切片获得子串。您只需要指定起始索引(包括)和结束索引(不包括):
>>> "Such a good day"[7:11]
'good'
>>>
反转一根绳子
字符串切片允许您选择性地定义第三个参数:步长。如果您使用完整的字符串并应用步长-1,您将得到相反的字符串:
>>> "Such a good day"[::-1]
'yad doog a hcuS'
>>>
就是这样!访问 Python 的字符串文档了解更多信息。
人工智能的 5 个真正危险

深度造假、算法偏见和其他问题会如何影响我们的日常生活
在过去的几年里,人工智能以令人难以置信的速度推进了我们的技术。从完全自动化劳动密集型工作到诊断肺癌,人工智能已经取得了以前认为不可能的成就。然而,在错误的人手中,算法可能成为毁灭性的武器。为了确保恶意行为者不会对我们的社会造成破坏,我们必须解决几个关键挑战。
人工智能的真正危险不是像天网一样的有感知能力的算法接管世界。尽管这种情况完全是科幻小说,但有几个合理的问题。我们不应该害怕技术,而应该仔细识别这些问题,并负责解决它们。在这篇文章中,我将收集五个特别重要并且已经影响我们日常生活的领域。
1.Deepfake
在我们的现代社会中,信息是无限的。打开你的浏览器,在网上冲浪半个小时,你遇到的信息比一个普通的中年人一生中遇到的信息还要多。信息就是力量。地球另一端发生的事件会立即通知你,但有一个问题:你如何知道该相信什么,哪些消息来源是可信的?
看看下面这个视频。
当然,这完全是假的,但是对于一个不经意的观察者来说,可能很难察觉。这些被称为深度假货,源于技术术语深度学习,这是一个能够产生类似这样的逼真假货图像的算法家族。尽管这个特殊的例子只是一个很好的技术演示,但是如果出现在新闻提要中的深度假货的比例达到一定的阈值,就会变得非常危险。在这种情况下,将无法检测哪些信息是真实的,哪些不是。
毫不奇怪,一个非常有前途的打击深度假货的工具就是 AI 本身。有几个高调的倡议,如 DARPA 的 MediFor 计划或谷歌的 Deepfake 检测挑战旨在开发过滤错误信息的方法。
尽管深度虚假不像列表中的其他虚假一样出现在我们的生活中,但它无疑是最具破坏性的虚假之一。
2.算法偏差
如果你在过去几年里申请过工作,很可能你已经受到了算法偏差的影响,无论是正面的还是负面的。开发一个基于人工智能的算法来筛选求职者可能是一个好主意,但是,这有很大的问题。机器学习需要历史数据来学习哪些候选人值得聘用。问题是,关于过去接受和拒绝的数据受到固有的人类偏见的严重影响,主要是对妇女和代表性不足的少数民族。该算法只是从呈现给它的东西中学习,如果以前的招聘做法是歧视性的(这种情况经常发生),该算法将以类似的方式行事。
这种现象的一个极好的、发人深省的证明是最适合的教育网络游戏的生存,这值得一试。
这个问题影响到许多其他应用领域,如信用评分评估、执法等。由于这些在相关人员生活中的纯粹影响,这些决定不应该涉及算法,除非我们能够保证公平。这方面的努力产生了一个新的非常活跃的研究领域。除了确保预测独立于性别、种族和受负面偏见影响的类似变量之外,关键是在这些变量不存在的地方产生数据。要解决这个问题,需要付出更大的努力。为了完全消除数据中的偏见,我们还需要消除我们思维中的偏见,因为最终,数据是我们行动的结果。
3.大规模监控
那些为了换取一点暂时的安全而放弃基本自由的人,既不配享有自由,也不配享有安全。—本杰明·富兰克林
几十年来,面部识别一直是计算机视觉中的一个关键问题。然而,自从深度学习革命以来,我们不仅可以更准确地识别人脸,而且可以即时完成。如果你把智能手机放在周围,尝试打开相机应用程序并自拍:它会立即在你的脸部周围放置一个边界框,表明它已经成功检测到它。如果你有一部最新的 iPhone,你甚至可以用你的脸作为手机的密码。
如果用于错误的目的,这项技术也有其自身的危险。在中国,这被用于前所未有的大规模监控。结合最近推出的社会信用系统,你的行为会被记分,你可能会因乱穿马路或只是参加某些活动而被扣分,没有什么可以瞒过天空中的眼睛。
4.推荐引擎
每次你打开 YouTube、脸书或任何其他社交媒体网站,他们的目标都是尽可能让你参与进来。简单地说,在这种情况下,你就是产品:如果你偶尔看广告,你可以免费使用网站。因此,目标不是为用户提供高质量的内容,而是让他们无限地滚动和自动播放。
鉴于人类大脑是如何进化的,不幸的是,参与是由引发强烈的情绪反应来驱动的。事实证明,例如政治激进的内容特别适合这一点。推荐引擎不仅学会了呈现极端的内容,还学会了慢慢地让每个用户变得激进,一旦用户的偏好发生变化,推荐引擎的工作就会变得简单。这就是所谓的激进化管道。
这是有确凿的科学证据的。例如,最近的一篇论文研究了 YouTube 上数百万特定用户的评论,以展示他们如何慢慢转向极端激进的内容。
这种情况的影响非常严重,可能会对民主选举产生重大影响。在 2016 年美国大选期间,《华尔街日报》对这个话题进行了广泛的调查。他们的发现可以在这里找到:蓝色饲料,红色饲料。本质上,用户被有目的地关在一个智力的泡泡里,从不质疑他们自己对外部世界的信念。思考很难,本能反应很容易。
5.隐私和定向广告
你有没有发现自己买了并不真正需要的东西,事后后悔?也许你走进超市,一进入收银台,一捆糖果就吸引了你的目光,你毫不犹豫地把它们放进了篮子里。你并不真的需要它,但你还是买了它。这可能会让你感到惊讶,但是这整个场景是被设计的,你被操纵着去做这件事。听起来很奇怪,购物实际上需要你的精神资源,这些资源最终会被耗尽。控制欲望的资源越少,你就越有可能冲动地购买明知对你无益的东西(比如糖果),但你还是想买。但是这和 AI 有什么关系呢?
超市的设计是基于这些基本的心理学原理,如上所述。这些设计原则在平均水平上起作用。没有一个设计能为每个用户提供个性化和完美的体验。然而,当市场转移到网上时,这种情况发生了变化。虚拟市场不仅可以为你提供量身定制的购物之旅,还可以收集非常具体的数据。基于你的浏览习惯和社交网络,你的行动可以被高度准确地预测。
这有几个潜在的误用。首先是向你展示你可能会在网上市场购买的物品。一件商品呈现给你的内容、地点和方式是由统计算法决定的,目的是从你身上获取最大利润。然而,这影响到个人层面。一个更大的问题是,当个人数据被用于针对你的政治广告时,可能会影响民主选举的结果。这正是剑桥分析公司所做的事情,其影响仍然波及全球。
结论
近年来,基于人工智能的技术无疑彻底改变了我们的生活。即使它正在慢慢渗透到我们周围的一切,但它在媒体上的出现大多是有偏见的。无论是通过炒作的粉红色薄雾或天网灭绝人类的可怕愿景。没有一个是真的。然而,为了使他们的应用安全,我们必须清楚地看到人工智能可能带来的真正问题。这些问题并不神秘,它们已经存在于我们的生活中。通过适当的认识、准备和社区努力,这些问题是可以解决的。
如果你喜欢把机器学习概念拆开,理解是什么让它们运转,我们有很多共同点。看看我的博客,我经常在那里发表这样的技术文章!
使用 Kubernetes 的五大理由
不要害怕 Kubernetes,学习拥抱它的 5 个好理由
Kubernetes 是容器编排的领先解决方案。在这篇文章中,我们将学习使用它的 5 个简单原因。这些原因是技术性和战略性的。事实上,我们将了解到,使用 Kubernetes,我们不仅可以解决技术问题,还可以帮助实现云转型。
考虑到使用 Kubernetes 的所有好处,只选择 5 分是相当困难的。无论如何,你可以回复这篇文章,添加你自己的动机。

作者用❤️做的
1.免费云解决方案
免费的东西在企业中不是必须的,但却是受欢迎的。我们都知道免费只是一个乌托邦,没有免费的东西。但是有了 Kubernetes,我们就有了没有任何许可成本的东西。这是一个很好的起点。Kubernetes 的良好品质是,当我们迁移到云时,它的“免费”性质仍然存在。事实上,大多数较大的公共供应商免费为我们提供 Kubernetes 服务,仅对我们将使用的资源进行定价。这是合乎道德的,也是方便的。因此,即使 Kubernetes 是免费的,但不是免费的,我们也很乐意为我们使用的资源付费。
我发现这是一个非常民主的解决方案:你可以在本地托管,负责托管和维护,或者转向云。在第一种情况下,您将支付您的硬件和整个系统(数据中心和 Kubernetes)的维护费用。另外,您可以将您的解决方案迁移到云中。这里只有资源定价。这让您可以开始实施您的解决方案,并根据您的 TOC(总拥有成本)自由决定放置位置。
所以,Kubernetes 如果是免费的,这种免费会给你带来自由:根据你的需要决定在哪里部署的自由。
2.所有问题的相同解决方案
Kubernetes 允许你以同样的方式管理所有的项目。这影响到你在组织内部必须成熟的一套技能。当你在一家只管理一种产品的科技公司工作时,一切都很容易。你定义了栈,你学习了它,你就设置好了。但是当你有多个项目要交付的时候呢?或者你在一家 IT 服务公司工作,那里的每个客户都有不同的特点?
嗯,Kubernetes 对于在整个项目中保持一个标准层帮助很大。
这些标准主要来自于容器的采用,容器让我们可以抽象地管理应用程序。因此,最大的优点是 Docker,但 Kubernetes 为我们提供了一个预定义的解决方案来部署它们。
总的来说,你可以有一个共同的方法来进行每个项目,这加快了你的工作,因为你不需要一直研究一个新的技术解决方案。
3.做同样事情的新方法
Kubernetes 是一个很好的工具,因为它允许我们在不离开舒适区的情况下打破舒适区。这似乎是矛盾的,但这是可能发生的。大多数系统管理员使用虚拟机和数据中心来实施应用程序基础架构。Kubernetes 中发生的事情非常相似,因为您定义了所有的网络细节、服务(代替容器或 VM)和部署过程。换句话说,你可以做同样的事情,但是没有网络、部署等物理上的痛苦。
使用 Kubernetes,您可以像处理服务器群一样处理您的集群,但是只使用配置文件。
您可以在服务器和集群组件之间重新创建逻辑并行性。您拥有的不是虚拟机,而是 pod 和服务。网络和存储也是如此。这确保了对组件的深度控制,但使用了高级工具。
4.架构优势
Kubernetes 带来活力;它使你的架构对变化更加敏感。它降低了全局系统管理员的成本,并提高了服务质量,这是很难达到的水平。Kubernetes 本身的高级配置可以克服许多传统问题,如网络和数据保护。
以下是 Kubernetes 的建筑优势列表:
- 可扩展性。 Kubernetes 根据设计进行缩放。该服务将你托管的资源解耦,因此,当负载变高时,你只需购买更多的资源。要支持这个过程,您所要做的就是在开发中开始使用容器。然后,扩展策略只是一个钱的问题。
- 透明。每个集装箱都有一个单独的责任。组件之间的所有关系都黑白映射到配置文件中。当问题发生时,将会清楚到哪里去寻找。
- 节约时间。这个过程很简单。这一过程通过设计实现了自动化,从长远来看这是有利可图的。
- 版本控制。使用容器库,您的应用程序被版本化。此外,只要对 Kubernetes 配置文件进行版本控制,就可以对基础设施进行版本控制。
5.简化开发操作和性能
当我们谈论平台时,我们需要包括部署部分。如今,没有一个好的自动化开发运维解决方案,任何应用都无法上线。Kubernetes 易于管理,因为它自动化了大部分流程。这种简化接近于 NoOps 解决方案。这种配置减少了开发团队和运营团队之间的摩擦,并清晰地划分了责任,具有完全的透明性。
蛋糕上的其他一些樱桃:
- 水平自动缩放。Kubernetes 可以通过添加物理资源来自动扩展。
- 巧妙的更新。换一个容器,旧的被巧妙替换。pod 将一直处于活动状态,直到它们完成对未决请求的服务。
- 没有发展警告。只需点击一下鼠标,即可部署所有可容器化的软件。这意味着您的开发人员不必学习新的东西。
结论
Kubernetes 现在是容器编排的领先解决方案。这很容易学,而且有一些切实的好处。免费可能是一个优势,但它必须为所有其他好处所带来的选择。
Kubernetes 可以在任何公共云上运行。这并不意味着您可以每天更换提供商,因为每个云提供商都有一些不同的小细节,迁移并不总是像点击按钮一样(即使您可以创建一个脚本来为您完成所有工作)。无论如何,如果你坚持这个标准,这将使一个低努力和低停机时间的迁移成为可能。这是对供应商锁定的一个很好的妥协。
优势重述
几句话给 Kubernetes 带来了哪些优势:
- 与过去有很好的兼容性
- 对发生的事情有很大的控制力
- 更少的供应商锁定。
- 微调每个组件的能力
- 内部选项
- 成本预测。
五个理由不够
我很抱歉我错过了什么。将 Kubernetes 的所有优点压缩在仅仅 5 点是相当困难的,我必须做出一些选择。例如,我忽略了对许多公司来说很重要的供应商锁定。
我想问的是,如果你来到这里,你有什么要补充的,请回复这篇文章,并添加你自己关于为什么采用 Kubernetes 的动机。
见解和参考
我在过去的文章中已经谈到了 Kubernetes 为了更深入地了解 Kubernetes,我可以推荐其中的一些。
- 到底什么是 Kubernetes
- Kubernetes on Premise 是否可行?
- Kubernets 成功背后的秘密
每个人都应该学习数据的 5 个理由

弗兰基·查马基在 Unsplash 上拍摄的照片
“数据量正在爆炸式增长,过去两年中创建的数据比人类历史上所有数据都要多。”(福布斯)
这些天来,我们在新闻中听到了很多关于数据的报道——我们正处于“大数据”时代,不断有关于数据隐私泄露的新闻报道。
对数据的痴迷已经渗透到我们生活的每一个部分,从我们的工作生活到我们的个人生活,以及其间的每一次互动。自然地,想到我们的大部分信息都被跟踪和存储在某个地方,因此可以用来通知我们以后关于习惯的决定,这似乎是压倒性的,甚至是可怕的。
但是,我认为,这一论点还有光明的一面。数据在正确的人手中是一个强大的工具。这也正是为什么学习数据科学对每个人都很重要,不管你未来的职业道路是什么。
以下是每个人都应该了解数据的 5 个理由:
1.数据教授合理的逻辑和决策
将信息转化为可操作的见解需要对数据操作有一些基本的了解。这意味着使用逻辑来创建公式,以便提取信息,并将枯燥的电子表格转化为可视化或易于解析的结果。
如果你理解数据,那么你就理解了逻辑以及它是如何工作的。它让你以完全不同的方式思考决策,因为你依靠事实和数字来证明你的论点。
大多数人认为解决方案就是找到答案。然而,数据科学告诉你要问正确的问题。这种类型的逻辑和推理导致更好的决策,这对我们的个人生活和职业生涯都是有价值的。
2.数据技能将知识转化为力量
如果不能应用,信息就什么都不是。数据科学教会我们如何思考不同的信息,找到关系,提取见解和测试假设。
面对现实吧,网络时代造就了每天轰炸我们的信息洪流。我们都需要能够过滤噪音,了解事实,并确定真相。
与此同时,数据科学技能教会我们如何组织所有可用的信息,如何标记和存储我们的信息,以便我们将来能够访问这些信息。如果没有这些数据技能,大量的信息很快就会变得不堪重负,坦率地说,毫无用处。
因此,掌握数据科学技能不仅意味着做出更好的决策,还意味着采取更好的行动。
3.数据无处不在,而且还在成倍增长
请看这张数据增长图:

由于科技的发展,越来越多的信息可以被储存。这意味着我们每天都被数据包围着。如果我们知道什么样的数据是有用的,然后知道如何操纵它,那么数据就可以成为让生活变得更好的工具。
尽管你可能认为这只是企业和消费者的数据,但个人数据也在不断扩大。随着我们的生活变得越来越数字化,越来越多的信息在线存储在云中,我们都有更多的数据要跟踪——更多的图片、更多的视频、更多的电子邮件、更多的文档和更多的整体个人信息。
还不服气?阅读这些关于大数据的二十个令人难以置信的事实。
因此,现在是每个人都认真理解数据及其在我们生活中的作用的时候了。我们都需要了解数据安全、数据隐私和数据管理。
随着数据的激增,我们都需要这些技能来得到更好的保护和更多的信息。
4.数据技能比以往任何时候都更容易获得
成为一名数据科学家不再需要感到超出你的能力范围。我本人不是数学家,但由于技术进步,理解数据比以往任何时候都容易。
事实上,我认为我们都已经将数据科学作为日常生活的一部分。例如,我们大多数人现在使用健身追踪器,或者接收关于我们购物习惯的更新,或者查看令人恐惧的每周手机使用时间报告。
组织使用这些数据来更好地与他们的客户互动,并将这些见解传递给你。许多公司开发了新软件,使得争论和解释数据比以往任何时候都更容易。
因此,我们可以害怕数据隐私泄露,或者我们可以在自己的生活中发挥数据的力量。这里的关键是进一步磨练这些技能,以便能够将它们应用到其他领域。
最精彩的部分?一些最受欢迎的数据技能是免费学习的。
5.数据技能将意味着工作保障
随着数据的成倍增长,数据技能的需求很大,但没有足够的人来填补这些需求是有道理的。
在最近的一篇福布斯文章中,作者声称,
“随着决策变得越来越受数据驱动,数据技能在所有行业和工作职能中都很有价值,获得这些技能并不像最初想象的那样具有挑战性。”
虽然对数据科学家的需求正在激增,但现在所有其他行业和职业领域中拥有数据技能的人都有优势。
根据一份名为“混合工作经济:新技能如何改写就业市场的 DNA”的 2019 年燃烧的玻璃报告,
“你必须熟悉分析和数据。在我们看到增长的所有技能中,数据分析,包括解释、可视化和交流,是最重要的技能之一。所有这些高薪工作(客户服务经理、医疗保健顾问、销售专家)都需要分析和数据。”
如果你准备好成为一名(伪)数据科学家,这里有一些工具可以用来学习这些技能:
喜欢这篇文章?这里有另外三个你可能会喜欢的…
以及如何完美地为你的一天计时
medium.com](https://medium.com/@thestevenpost/why-we-should-take-a-nap-puccino-every-day-f2b3e6618118) [## 为什么每个人都应该学会“像怪物一样思考”
用经济学家的眼光看世界
medium.com](https://medium.com/age-of-awareness/why-everyone-should-think-like-a-freak-6ae474aa6e6c) [## 是什么让美国公司每年损失 300 亿美元,而大多数领导人却没有解决这个问题
提示:有简单的解决方法
medium.com](https://medium.com/swlh/what-costs-u-s-companies-30-billion-a-year-and-yet-most-leaders-dont-address-7fcd3ccf3759)
每个数据科学家都应该考虑成为导师的 5 个理由
这也适用于所有的技术和学术领域。

数据科学是快速增长的领域之一,我认为它不会很快放缓。事实上,现在进入这个领域比我 4 年前开始时更具挑战性。
许多加入该领域的人,无论是现在还是之前,都是从该领域开始,自学该领域的不同方面,并在申请工作时构建不同的项目以包括在他们的投资组合中。
虽然自学是我最喜欢的学习新编程语言或开发新技能的方法,但通常,当我们独自工作时,我们无法从工业方面获得所需的经验。
最好的解决办法是有一个导师。几乎所有的新来者都试图找到一位导师——或者更多——来指导他们通过这些领域的实践和工业方面。向与我们经历相同旅程的人学习,比浏览所有的理论和方程式能教会我们更多。
在这篇文章中,我不会谈论有一个导师来指导你,帮助你,给你提供到达终点的建议的好处。相反,我将谈谈成为导师的好处。帮助那些刚刚开始实现目标的人。
我一直在等式的两边;我既是被辅导者,也是导师。我必须对你说实话;我从这两者身上学到了同样多的东西,也许从成为导师身上学到了更多。
这就是为什么我想写这篇文章来告诉你我的 5 个理由,为什么我认为数据科学和技术领域的每个人都应该考虑成为一名导师。
让我们开门见山吧…
原因 1:被公认为该领域的专家和领导者。
当你接受一名学员时,你证明了你是你专业领域的专家。可能阻止你成为导师的最具挑战性的事情之一是担心你可能不是什么都知道,因此你不是专家。
你不应该担心这个。你能走到现在是因为你知道自己在做什么。你可能不觉得自己是专家,但没有人什么都知道。做导师会增加你的知识,弥补你可能有的任何知识差距。
因此,你将发展自己的知识,同时引导你的学员发展他们的知识。通过这样做,你将证明你是这个领域的领导者和专家。
当你的学员开始自己的职业生涯,接受他们自己的学员时,你将成为他们激励这些学员转移知识并成为该领域新领导者的原因之一。
原因 2:体验新想法、新方法和新观点的机会。
有时,当我们参与到我们的项目和公司生活中时,我们忘记了接触该领域的新进展。我们养成了片面的工作心态。
例如,从学术角度研究数据科学将阻止我从工业角度解决一些问题。这种心态往往是学术界和工业界之间有些距离和差距的原因。
接受学员将帮助我们更新心态,并获得人们现在进入该领域时所经历的新体验。正如我之前提到的,数据科学是一个快速发展的领域。一个人在 5 或 6 年前加入该领域可能经历的事情与人们现在需要经历的事情完全不同,以启动他们的数据科学职业生涯。
指导某人将帮助你获得奋斗、新技术和新挑战的视角,新人需要经历这些才能达到你现在的位置。获得这些知识会给你一个优势,让你对这个领域有一个新的认识,这将有助于你在自己的职业生涯中取得更大的进步。
原因 3:通过发展教学风格获得更多的理解。
这个大家都知道;要理解一件事,没有比完整地教给别人更好的方法了。一旦你能成功地向别人解释某事,那么你就完全理解了它。
大多数数据科学家或程序员明白他们在做什么,但通常不擅长传递他们的知识。当你做一件事相当长一段时间后,它就成了你的第二天性,你发现很难解释它的内在细节。
我喜欢把这想象成你教别人母语的方式。并非我们所有人都能恰当地教授他们的母语。原因是,我们已经使用这种语言很长时间了;特定结构背后的一些语法对你来说变得很自然,以至于你可能会忘记它们是如何形成的。
发展你自己的教学风格需要你回到基础,这总是一个好主意,以更好地理解你的工作,并加强你的知识基础。
原因 4:发展软技能,如科学、沟通和倾听。
当你教别人一个复杂的概念时,你会发现自己在寻找最好的方式来解释它,以便完全理解,而不会使它过于复杂。做将帮助你发展你的科学交流技能,并最终使你成为一名更好的演讲者。
作为一名数据科学家,它不仅仅是编写代码和操纵数据;沟通和列表是任何数据科学家的基本技能。您需要仔细倾听任何新项目的业务需求,以便正确地开发它。
指导某人会帮助你提高倾听技巧,成为更好的倾听者,从而成为更好的数据科学家。当你和一个新来的人交流时,他们可能不会使用一个有经验的人会使用的词汇。
这是一件好事,因为你的许多客户可能会使用与新人相同的词汇。将任何词汇翻译成技术词汇都会让你对表达同一概念的不同方式有新的理解。
原因 5:回报社区,培养成就感
这可能是我最喜欢的原因。到目前为止,我谈到了如果你接受一名学员,你可以获得的好处,但成为一名导师并不是单行道。成为一名导师是回报社区的好方法。
在数据科学中闯出一条自己的路,你只是阅读了许多其他人写的文章,也许你在早期职业生涯中得到一位经验丰富的数据科学家的指导,或者可能你刚开始时得到了同事们的巨大指导。
帮助别人取得你已经取得的成就,学习你已经学到的东西是回报社会的最好、最有成就感的方式之一。回馈对于帮助你成长为一个人和一名数据科学家非常重要。更不用说,它会给你一种用其他方式得不到的巨大成就感和充实感。
外卖食品
没有人能靠自己成功。为了在生活或事业上取得成功,你需要一个导师和指导。有时这种指导不是直接的,但我们所有人在职业生涯的任何时候都有一些指导。
做导师不仅仅是两个人之间知识和经验的传递。这是导师和被辅导者之间的双向交流;双方都能给对方带来好处。
导师愿意投入时间培养另一名专业人士。学员为导师的工作心态提供了新的视角。指导的行为可以给指导者带来巨大的成就感和满足感,因为指导者可以从个人和职业两方面获得不同的回报。
所以,我把这个留给你们,考虑成为一名导师,把你的知识传授给新来者,并成为一名领导者和未来许多人的灵感。
我成为数据科学家的 5 个原因
我决定从一名生物学家转型为一名成熟的数据科学家的主要决定因素。

多兰·埃里克森在 Unsplash 上的照片
“在小人物身上找不到激情——满足于一种低于你生活能力的生活。”纳尔逊·曼德拉
如果一年前你问我是否知道什么是数据科学家,我不会有答案。
我一直认为自己首先是一名生物学家和环保主义者。在我年轻的时候,我的教育和职业重心是由我永恒的乐观和对了解我们生活的世界的渴望推动的。学习新事物一直是我的激情所在,以至于我穿越世界去获得生物学硕士学位,并成为一名研究科学家。
吸引我从事研究工作的是我对探索的渴望。我喜欢深入研究数据,并用它来解决复杂的现实世界的问题。我在大学期间学会了如何使用 R,慢慢开始涉猎其他编程语言。它开始是一种爱好,但很快变成了一种热情,让我重新考虑我的职业道路。
值得注意的是,我与许多朋友和家人谈论了我想从事数据科学家这一新职业的原因以及我将如何去做。我研究了不同的在线项目和训练营,并与在我之前经历过这个过程的人联系。经过反复考虑,我决定在继续全职工作的同时,兼职完成一个数据科学训练营。
转行是一个艰难的选择,但有五个主要原因促使我成为一名数据科学家:
1。挑战新的思维方式
为了成为一名数据科学家,你需要成为一名数据驱动的思考者。这意味着你必须克服天生的偏见,利用数据来帮助做出商业决策。数据科学是一个极具挑战性的职业,你必须是一个问题解决者。这意味着你必须致力于一生的不断学习,无论是新的软件包、算法还是复杂的神经网络。这就是数据科学具有挑战性和令人兴奋的地方!最棒的是,无论你的职业生涯走向何方,这种思维方式都是极其宝贵的!

在 Unsplash 上由 Carlos Muza 拍摄的照片
2。多样的技能组合
要成为一名成功的数据科学家,你需要成为一名“多面手”。数据科学家需要对统计和数学有扎实的理解,有能力编码,最重要的是,以一种容易理解的方式将他们的数据分析结果传达给各种不同的受众。拥有所有这些技能是很难得到的,在就业市场上非常有价值。
对我来说,来自一个非常专业的研究背景,我把自己归类到一个非常小众的就业市场。数据科学让我扩展了自己的技能,在所有行业都很受欢迎。
3.快速成长和学习能力
数据科学是一个永远有学习和改进空间的领域。每一年,每个行业对数据的需求越来越多。根据 NodeGraph 的数据,截至 2019 年底,全球约有46 亿互联网用户!随着新领域的出现,如大数据、人工智能、机器学习等,它也在不断发展。
作为一名数据科学家,跟上新技术并即时学习非常重要,但可以说最关键的技能是能够将数据的复杂结果传达给非技术利益相关者并回答业务问题。了解您的领域以及如何最好地实施您的数据结果以进行改进是一个不断学习的过程,这将提高和发展您的批判性思维技能。

4.高要求高工资!
这在我的清单上非常重要!我住在纽约,那里的就业市场竞争激烈,生活成本极高。成为一名数据科学家的好处之一是,在供应不足的情况下,需求会持续增长。所需的技能组合很难实现,因此许多理想职位的竞争较少。
根据 GlassDoor 的数据,美国入门级数据科学家的平均年薪约为 107,801 美元!!!这几乎是我第一份实验室技术员工作的三倍!经过几年的工作经验,数据科学家的平均基本工资可以达到 14 万美元左右。

由 Unsplash 上的Damir spanick拍摄的照片
最后,也是最重要的,也是不可否认的,坚定了我的决定的原因是:
5。数据科学打开大门
对我来说,这是最重要的,因为我是那种不会考虑长远的人。当有人问我 10 年后的自己,我从来没有一个明确的答案。数据科学的好处在于,它为从医疗保健到金融、电子商务到国家安全的所有行业带来了机遇!作为一名数据科学家,你学到的技能是可以转移的,不会很快过时。无论是哪个行业,数据科学家在制定业务决策时都扮演着举足轻重的角色。
我希望这篇博文能让你了解为什么数据科学可能适合你!
如果您想进一步了解数据科学,请查看我的另一篇 博客文章 ,了解提高技能和快速学习的方法!
感谢你的阅读!
参考文献:
- https://www . springboard . com/blog/data-science-career-paths-different-roles-industry/
- https://www.nodegraph.se/how-much-data-is-on-the-internet/
- money.yahoo.com
作为一名数据科学家,我学习 Web 开发的 5 个原因
还有,为什么你也应该。

卢克·皮特斯在 Unsplash 上拍摄的照片
如果有一件事让我对数据科学过程感到沮丧,那可能是这样一个事实,我可能会花几个小时(也许几天)来构建和完善一个模型,但却意识到将它投入生产是另一项非常值得的工作,需要获得更专业的人的帮助。
每当我试图思考如何处理数据科学问题的想法时,我总是被将它转化为其他人(我的利益相关者)可以使用的形式这一绞尽脑汁的步骤所停滞。
经过多年的实践,我决定提升自己的技能,永远学习 web 开发。
以下是我这样做的原因:
我需要一条能让我在技术上更加精通的学习途径
如果你和我一样,我没有在计算机科学或任何相关技术领域接受过正式培训。
我受过自然科学的训练。具体来说,我本科学的是化学,硕士学的是生物工艺工程。我很喜欢研究天然产品和设计复合生物材料。
我是一个数据爱好者,在大学里学的数学比一般的程序员多一点,我碰巧决定用代码来做一些数据魔术,让一些商业人士高兴。

著名的数据科学维恩图。图片作者,灵感来源(http://drew Conway . com/Zia/2013/3/26/the-data-science-Venn-diagram)
幸运的是,我开始利用我的科学敏锐度和解决问题的能力来应对数据带来的商业挑战。作为一名数据科学家,我已经工作了两年,我意识到我并不像我想象的那样精通软件和其他技术,这些技术可以让我作为一名数据专业人员的生活变得更加轻松和有效。
此外,我意识到,虽然我对用 Python/R 编码和用 SQL 获取数据感到很舒服,但我的脚本看起来常常很枯燥,而且常常需要事后进行大量的重构。我用我的代码完成了一些事情,但是有时候我的笔记本并没有处于一种我很自豪能与其他人分享的状态。
我知道我需要以全面的方式变得更加精通技术。我想变得知识渊博,这样我就可以在几乎平等的水平上与我的技术同行进行交流。
我想对我的投资组合网站有更多的控制权
当我申请我的第一份数据科学工作时,我有一点 git 知识,但我已经把我现有的所有入门项目放在了 WordPress 网站上。
虽然使用博客网站做作品集没有错,但我花了三年多的时间才意识到一个自我托管的网站(甚至只是一个简单的 GitHub 页面)会做得更好,更便宜!)而不是一个收费的博客网站。
更不用说,做限量定制还要付出更多。我意识到我想为自己建立一个更好的投资组合网站,而不是为此付出太多。
我知道维护一个好的投资组合网站将是我数据职业生涯的支柱,所以我也可以自己学着做。
此外,我意识到典型的投资组合网站有多无聊——因为更多时候,你只是以一种非常静态的方式展示你的分析和结果。然而,有些人确实更上一层楼。 JP Hwang ,在他的文章中,整理了几个数据科学作品集,绝对会让你敬畏和鼓舞。
我羡慕那些知道如何部署展示项目价值的应用的人。因此,我想学习更多关于 web 开发的知识,以学习可视化和交互式的方式来分享我的作品。
我想用正确的方法学习软件开发
不要误解我。我并不是说你应该自己成为一名网络开发人员。我并不是说,如果不深入研究 web 开发,就不能建立一个好的作品集网站。
如果你和我一样,我总是想学习新的东西。而且,我决定学习 web 开发来补充我的数据科学实践。
我只是不想通过阅读 Stackoverflow 来修复错误,从而学习它。我想用正确的方式学习它。
我想更好地了解和我一起工作的开发人员的想法。我想学习超越我的 Jupyter 笔记本的编程最佳实践。
免责声明: 我仍在寻找最佳的学习途径。请放心,当我了解到更多信息时,我会记录下来。我知道现有的 web 开发库和框架是数据科学家的必备,比如D3 . js和 TensorFlow。JS 但是会在不同的帖子中编译它们。
我是一名建筑工人,我一直想建造东西
化学让我着迷的原因是能够促进物质之间的反应以创造一种完全不同的材料的想法。一些对社会有潜在价值的东西。
我也在数据科学中发现了同样的魅力。
唯一不同的是,我不用去实验室,戴着护具做一些科学。
我可以穿着睡衣,完全在笔记本电脑上做实验。
我发现单独使用数据和编程来设计和创建解决方案很有趣。虽然,就像我在第一点中所说的,我意识到把我的作品放在那里需要比我所受的训练多得多的工作。
知道了数据科学和人工智能有多么强大,以及它在各行各业有多么广泛,我知道我可能会偶然发现一些好主意,我希望我能够自己(或与团队)转化为一些实际的产品

马修·奥斯本在 Unsplash 上拍摄的照片
我想给一个定义不清的角色增加更多的价值
数据科学社区中另一个众所周知的事情是处于一个被过度宣传的行业中的诅咒和祝福。它被吹捧为 21 世纪最性感的工作是有原因的。
幸运的是,企业开始意识到,他们缺乏从数据中获得洞察力的关键能力(或者可能只是普通的 FOMO?)。因此,数据科学家和分析师的就业前景一飞冲天。
不幸的是,许多公司没有意识到如何让数据科学家参与进来并释放他们的全部潜力。许多公司认为数据科学家是多面手,他们有能力获取他们的脏数据,并立即为他们带来数百万的回报。
有些人甚至有荒谬的工作描述,要求技术堆栈不一定适用于他们的问题领域。
这里有一些文章展示了公司和数据科学之间的脱节,主要是从招聘的角度:
乔尼·布鲁克斯。受这篇文章的启发,在 KDnuggets 投票中投票:数据科学/机器学习/数据专业工作…
www.kdnuggets.com](https://www.kdnuggets.com/2018/04/why-data-scientists-leaving-jobs.html) [## 停止雇佣数据科学家,直到你准备好数据科学
今天,我又接到了一个电话,一位才华横溢的数据科学家在一家大型企业的人力资源部工作…
www.kdnuggets.com](https://www.kdnuggets.com/2015/07/stop-hiring-data-scientists-until-ready.html) [## 哪些公司在雇佣数据科学家方面犯了错误
简而言之,如果你不了解一个特定的职位需要什么样的技能和才能,你就无法招聘到这个职位
towardsdatascience.com](/what-companies-get-wrong-about-hiring-data-scientists-704fa60c594)
我敢打赌,随着公司找到利用数据科学的正确方法,以及当前的数据科学家专注于特定的数据科学领域,事情将保持不变,因为公司正在度过这个尴尬的阶段。
目前,我希望我的技能更加灵活,能够为我工作的公司增加更多的价值。我希望通过掌握数据和开发两方面的知识,以更敏捷的方式处理问题。
学习 web 开发是在职场中脱颖而出的一种方式吗?
也许吧。然而,这不是唯一的方法,因为我也可以通过深入问题领域来做到这一点。尽管如此,我知道学习软件开发无论如何都是有用的,并且可以拓宽我的视野,因为我正在科技行业建立我的职业生涯。
这是进入更机器学习工程职业的一种方式吗?
有可能。到目前为止,我知道 DS 相关角色的定义仍然模糊不清,但是关于 ML 工程师有一件事是肯定的,那就是他们比一般的数据科学家有更高的技术能力。我猜,学习如何部署 web 应用程序和修补后端是获得更接近 ML 工程师技能的一条途径。
结论
最后,作为一名数据科学家,我学习 web 开发的原因如下:
- 拥有一条能让我在技术上变得更加熟练的学习途径
- 更好地控制我的投资组合网站
- 以正确的方式学习软件开发
- 建造东西
- 为定义不清的角色增加更多价值
学习 web 开发可以让我以有趣和可视化的方式了解软件开发的来龙去脉,同时学习一些在我作为数据科学家的职业生涯中有用的技能。
现在,我将浏览以下在线资源,开始学习基础知识:
刚刚更新到 2021 年!通过学习最受欢迎的技能,成为一名全面的网络开发人员!这是其中一个…
www.udemy.com](https://www.udemy.com/course/the-complete-web-developer-zero-to-mastery/) [## Web 开发人员训练营:学习 HTML、CSS、Node 等等!
嗨!欢迎来到 web 开发者训练营,这是学习 Web 开发的唯一课程。有很多…
www.udemy.com](https://www.udemy.com/course/the-web-developer-bootcamp/) [## freeCodeCamp.org
在家学习编码。构建项目。获得认证。自 2014 年以来,超过 4 万名 freeCodeCamp.org 大学毕业生…
www.freecodecamp.org](https://www.freecodecamp.org/learn)
补充一下,我特别喜欢安德烈·尼戈瓦的《零到精通》课程(上面的第一个链接)。不仅仅是因为他的课程是更新最活跃的课程之一(他最近将他的课程更新到了 2021 年版本),还因为围绕它的巨大的活跃社区。我目前是一个由数千名学习者组成的社区的一员,也是一个由 30 人组成的令人敬畏的小型学习小组的一员,这个小组让学习变得更加有趣和吸引人。
随着未来几个月的进展,我期待着改进我的作品,以及我将建立的所有网站和应用程序。我会不时在这里发布我的进展。
股票预测项目失败的 5 个原因
在开始一项计划之前需要考虑什么

帕特里克·托马索在 Unsplash 上的照片
随着机器学习和人工智能的复兴,实现新老预测算法从未如此简单。只需几行代码,初露头角的数据爱好者就可以轻松获得最先进的模型,随时准备征服手边任何不可逾越的数字任务。但是一知半解可能是一件危险的事情。虽然大部分机器学习可以归功于统计学和编程,但同样重要,但为了即时满足而经常被忽略的是领域知识。
这一点在投资领域最为真实。虽然环境中有丰富的股票价格和可访问且免费的基本数据,但不加选择地应用预处理技术和机器学习算法将产生不加选择的结果。金融时间序列数据极其微妙,系统信噪比很低,从业者花费他们的职业生涯试图实现难以实现的目标,即创造持续的优异表现,只有少数人成功。因此,需要对数据有更深入的了解,这与取得某种程度的成功是相关的。因此,本文旨在揭示股票预测项目一旦投入生产就可能失败的一些常见原因。
1。选择偏差
许多项目都是从任意选择一只要应用算法的股票开始的,这只股票通常是苹果或亚马逊之类的科技股,原因很简单,因为这些公司在消费者的日常生活中非常有名,根深蒂固。这是有问题的,因为股票选择不是一个任意的过程,它是投资决策过程的一部分,需要一个模型。
以苹果为例,如果我们看看它在 2019 年的表现与更广泛的标准普尔 500 指数相比,我们看到它的表现超过该指数近 60%。

苹果 vs S&P500
亚马逊、微软和谷歌的情况大致相同,因为美国科技是 2019 年表现最好的行业。从该板块中任意挑选一只股票作为起点将会严重歪曲投资机会集的特征。
2。投资组合构建
对于稳健的投资策略来说,控制风险与创造回报同样重要。如果选股是投资过程的第一步,那么投资组合的构建就是至关重要的下一步。许多项目会建议一种买卖特定股票的策略,但通常假设 100%的潜在投资组合将投资于该股票。在实践中很少出现这种情况,单一的风险敞口会使投资者容易遭受巨大的集中风险。谨慎构建的投资组合非常多样化,因为它是风险控制的最重要来源之一。可行的机器学习投资策略应该同时考虑选股和投资组合构建。
3.预处理的不正确应用
像标准化这样的标准冲洗、清洗和重复数据预处理技术不能直接应用于股票价格。下图显示了 S&P500 物价水平的年度分布情况,这应该能给我们一些直观的解释:

2007-2008 年 S&P500 指数价格水平
在机器学习的标准训练/测试分离范例中,通过使用训练集的参数进行变换来应用预处理,在明确假设训练和测试样本是从相同分布中抽取的的情况下,将预处理应用于测试集。
我们可以清楚地看到,股票价格的分布每年都会发生变化,这意味着均值和标准差也会发生变化。金融时间序列的这种特性被称为非平稳性,这是金融预测中的一个未决问题。还可以观察到,分布很少是正态分布,这使得参数测量(如平均值和标准差)变得毫无意义。
此外,应用其他常见程序(如最小-最大归一化)并不能解决这个问题,因为下限也会逐年变化,而且价格理论上没有上限。从业者通常会应用价格差异转换(股票价格回报),但是这并不能完全消除股票价格的一些不利属性。
4.前瞻偏差
虽然现在只需要几行代码就可以获得有意义的股票和宏观经济基本面数据的历史,但我们需要认识到,这些数据受到了前瞻偏差的困扰。通常,与特定日期相关的观测在该日期实际上是不可用的。例如,股票基本面数据依赖于在生效日期引用的报告,该日期通常与公司的会计日历一致,但是,该报告直到生效日期后几个月才发布,反映了准备时间。
在宏观经济数据中,这种偏差是对前期数据进行修正的结果,有时是在初始信息发布后一个季度进行的。这对于短期交易策略来说尤其成问题。任何使用这些数据集的项目都应考虑适当的滞后和修订。
5.工程未完!
许多股票预测项目将像常规的机器学习项目一样,以测试与训练性能的折线图来揭示性能指标,如准确性或 RMSE,推理出如果两条线足够接近并且误差相当低,则该项目是成功的。这个过早的结论忽略了发现成功策略的重要一步;测试财务结果。投资不能简化为最小化无形错误率的简单练习,因为犯错的后果是真实存在的。最后一步应该是对这个策略进行回溯测试,就好像它是长期持有的一样,并计算利润/损失或回报。测试人员还需要考虑,如果投资组合在恢复之前的测试期间遭受了重大损失,他们是否有风险承受能力继续执行给定损失的策略。
使用指数加权移动平均策略(EWMA)可以得出一个简单的例子,该策略将过去价格的衰减平均值作为未来价格的预测。

乍一看,EWMA 对 S&P500 的预测非常好,但如果我们仔细观察今年年初市场下跌的时期,我们会发现事情并不像表面上那样。

EWMA 战略 vs S&P500 回归
尽管蓝色和橙色线似乎仍然紧密固定,EWMA 策略无法驾驭日内波动,因为它只包含过去的信息,它看起来一直在追逐真实的价格水平,经常导致它预测市场在实际下跌时上涨,反之亦然。在此期间遵循这一策略的表现将会低于标准普尔 500 指数。
结论
在开始一个股票预测项目之前,尤其是你打算投资真金白银的项目,做一些关于这个主题的前期研究和理解数据是值得的。如果结果好得令人难以置信(例如,准确性大大超过 50%),随着参与者的数量和这些参与者的日益成熟,市场在价格发现方面效率极高,特别是在股票方面。虽然这可能不排除潜在机会的可能性,但这确实意味着它需要比开箱即用的算法和标准预处理技术更多的努力才能找到它。
免责声明 : t 他的帖子纯属个人观点和看法的表达。它不代表任何建议。
你应该做项目而不是收集数据科学证书的 5 个理由
意见
把手弄脏来学习。

屋大维·丹在 Unsplash 上拍摄的照片
我在数据科学之旅中迈出的第一步是注册在线证书。一切都很顺利。我只是在跟进和学习基础知识。过了一段时间,我开始觉得做一个数据科学家很容易。我会拿到一些证书,然后开始找工作。我很快就拿到了那些证书。然后你猜怎么着?
欢迎来到现实世界!
证书擅长教你基础知识。它们让你熟悉数据科学领域。然而,他们绝对不是游戏规则的改变者。
值得注意的是,我说的是完成 MOOC 课程所获得的证书。那些要求你通过像 AWS 证书这样的综合考试的在其他页面上。
回到我们的讨论,我列出了我的 5 个理由,为什么你应该在项目上工作,而不是收集大量的证书。
1。证书不能提供足够的“主动学习”

绿色变色龙在 Unsplash 上拍摄的照片
证书不会挑战学习者。如果你注意听课,通读资料,你可以很容易地通过分级考试。他们没有给你足够大的压力让你真正理解这些话题。如果你没有足够努力地思考和推动自己,这些信息会停留在短期记忆中并被遗忘。
正如尼克·达姆在这篇文章中所说,“对于大脑中发生的学习来说至关重要的神经连接的变化,在学习经历不活跃时似乎不会发生。许多研究表明,积极参与是大脑变化的先决条件。毫不奇怪,仅仅听一场演示或讲座不会带来学习。”
大部分时间都花在听 MOOC 课程的讲座上。另一方面,做项目是主动学习的一个很好的例子。他们要求你积极参与整个过程。
2。不要跳出框框思考

Anthony Tori 在 Unsplash 上拍摄的照片
证书旨在让你严格遵循课程。这实际上是有意义的,因为你积累了从基础到高级的知识。但是,地图是为你画的。你不需要跳出框框思考。另一方面,数据科学领域的项目没有地图或限制。你可以定义一个问题,设计一个解决方案,并在任何业务领域实现它。我认为这是作为一名数据科学家最具挑战性的部分。数据科学家用数据解决问题。在现实世界中,问题和数据都不会出现在你的盘子里。
当然,学习可以从证书中学到的工具和技术是重要和必要的。然而,如果你不能使用这些工具和技术创造价值,那么掌握这些工具又有什么意义呢?为了能够创造价值,你需要跳出框框思考。思考项目想法并实际实施它们,构建您利用数据科学创造价值的途径。证书中讨论的用例受特定域的限制。然而,数据科学项目的潜在价值要多得多。仅仅关注证书会阻止你跳出框框思考。
3。现实充满惊喜
证书只涵盖可预测的场景。然而,现实生活充满了惊喜。在证书中涵盖所有可能的障碍是不可能的,也是不可行的。这也使得他们太长,无法详细提及每一种可能的解决方案或技术。过长的课程会降低你的动力,因此完成率会很低。
在我完成了几门 MOOC 课程后,我觉得自己像一个熊猫大师。我知道用熊猫做数据分析所需要的一切。然而,当我开始我的第一个项目时,我觉得我正站在一条漫长道路的起点。虽然这是一个简单的介绍性项目,但我花了很多时间重复下面的步骤。
- 我面临一个问题
- 开始寻找解决方案
- 在寻找解决方案的过程中学习很多东西
- 找到解决办法
项目确实教会了你很多。更重要的是,当项目完成时你感受到的喜悦会激励你立刻开始一个新的项目。
4。数据不是放在银盘上提供给你的
大多数证书都为您准备好了数据。数据是干净的,格式也很好。它有时包含一些丢失的值,这些值的结构很容易处理。在某些情况下,会要求您进行基本的预处理。那么,你准备好了!
我不认为大多数数据科学家会这样。你需要在数据之旅中全程思考。数据科学家通常需要以下问题的答案:
- 需要什么样的数据?
- 怎么才能收藏起来?
- 怎么清洗和预处理?
当你在做项目时,很大一部分工作是数据准备。您将获得数据收集和准备的实践经验,这对于数据科学家来说是一项非常有价值的技能。你不能通过收集证书来提高技能。

照片由马修·施瓦茨在 Unsplash 上拍摄
5。可行性事宜
证书将带领您完成一个典型的数据科学项目,从数据收集到模型评估。您可以为一个样本用例创建一个模型。然而,在那些证书中并没有深入讨论可行性。可行性和项目的其他步骤一样重要。如果你的解决方案太复杂而无法实现,那么它就毫无价值。做项目,还需要思考可行性。您不仅试图构建一个模型,而且还寻找部署您的模型并从中创造价值的方法。你可能听说过 Kaggle 上的 Netflix 奖竞赛,奖金为 100 万美元。网飞决定不实施优胜模型,因为它不可行。当你在做独立的项目时,你实际上不需要部署你的模型或者将它们投入生产。但是,你至少把可行性想透了。
就像任何学习过程一样,我们开始做简单的项目,然后通过做得越来越多来提高水平。我们最终认识到,我们的项目有可能在生产中实现。但是,为了能够达到生产水平,我们需要开始做项目。收集一堆证书不会把我们带到那一步。我建议在学习基础知识后,花时间在项目上。最好的做法是亲自动手,做很多项目。
感谢您的阅读。如果您有任何反馈,请告诉我。
你应该从 Jupyter 笔记本转向脚本的 5 个理由
意见
使用脚本帮助我认识到 Jupyter 笔记本的缺点

动机
像大多数人一样,我在开始学习数据科学时使用的第一个工具是 Jupyter Notebook。大多数在线数据科学课程使用 Jupyter 笔记本作为教学媒介。这很有意义,因为对于初学者来说,在 Jupyter Notebook 的单元格中开始编写代码比编写一个包含类和函数的脚本更容易。
Jupyter Notebook 是数据科学中如此常见的工具的另一个原因是 Jupyter Notebook 使探索和绘制数据变得容易。当我们键入' Shift + Enter '时,我们会立即看到代码的结果,这使我们很容易识别我们的代码是否有效。
然而,随着我从事更多的数据科学项目,我意识到 Jupyter Notebook 有几个缺点:
- 杂乱无章:随着我的代码变得越来越大,我越来越难以跟踪我写了什么。不管我用多少次降价把笔记本分成不同的部分,这些不连贯的单元格让我很难专注于代码做什么。
- 难实验:你可能想测试用不同的方法处理你的数据,为你的机器学习算法选择不同的参数,看看精度有没有提高。但是每次你试验新方法的时候,你都需要找到并重新运行相关的细胞。这是令人困惑和耗时的,尤其是当处理过程或训练需要长时间运行时。
- 再现性不理想:如果您想要使用结构稍有不同的新数据,则很难确定笔记本中的错误来源。
- 难调试:当你的代码出现错误时,很难知道错误的原因是代码还是数据的变化。如果错误在代码中,是代码的哪个部分导致了问题?
- 不适合生产: Jupyter 笔记本与其他工具配合不太好。使用其他工具运行 Jupyter Notebook 中的代码并不容易。
我知道一定有更好的方法来处理我的代码,所以我决定尝试一下脚本。为了减少混淆,我引用了。py 文件,当在本文中使用“脚本”一词时。这些是我在使用脚本时发现的好处:
组织
Jupyter Notebook 中的单元格很难将代码组织成不同的部分。通过一个脚本,我们可以创建几个小函数,每个函数指定代码做什么,就像这样

更好的是,如果这些函数可以归入同一个类别,比如处理数据的函数,我们可以把它们放在同一个类中!

每当我们想要处理我们的数据时,我们知道类Preprocess中的函数可以用于这个目的。
鼓励实验
当我们想尝试不同的方法来预处理数据时,我们可以像这样通过注释来添加或删除函数,而不用担心破坏代码!即使我们碰巧破解了代码,我们也知道在哪里修复它。

再现性的理想选择
有了类和函数,我们可以使代码足够通用,这样它就能够处理其他数据。
例如,如果我们想要删除我的新数据中的不同列,我们只需要将columns_to_drop更改为一个列列表,我们想要删除并且代码将顺利运行!
我还可以创建一个 管道 ,指定处理和训练数据的步骤!一旦我有了管道,我需要做的就是使用
pipline.fit_transform(data)
对训练和测试数据应用相同的处理。
易于调试
使用函数,更容易测试函数是否产生我们期望的输出。我们可以很快找出代码中应该修改的地方,以产生我们想要的输出
如果所有的测试都通过了,但是在运行我们的代码时仍然有一个错误,我们知道数据是我们下一步应该查看的地方。
例如,在通过上面的测试后,我在运行脚本时仍然有一个 TypeError,这让我产生了我的数据有 null 值的想法。我只需要处理好这一点就能顺利运行代码。
我在这里写了一篇关于如何使用 Pytest 进行测试的文章。
非常适合生产
我们可以在多个脚本中使用不同的函数,就像这样
或者添加一个配置文件来控制变量值。这可以防止我们浪费时间在代码中追踪一个特定的变量来改变它的值。
我们也可以很容易地添加工具来跟踪实验,如 MLFlow 或工具来处理配置,如 Hydra.cc !
如果你不知道 hydra,它是一个 Python 工具,用来配置你的数据科学项目。这个工具允许你试验不同的参数和模型,而不需要花费几个小时来修改你的代码。
我不喜欢不用 Jupyter 笔记本的想法,直到我把自己推出舒适区
我以前一直用 Jupyter 笔记本。当一些数据科学家建议我从 Jupyter 笔记本切换到脚本以防止上面列出的一些问题时,我不理解并对这样做感到抵触。我不喜欢运行单元时看不到结果的不确定性。
但是,随着我在新公司开始我的第一个真正的数据科学项目,Jupyter Notebook 的缺点越来越大,所以我决定将自己推出舒适区,尝试使用脚本。
一开始,我感到不舒服,但开始注意到使用脚本的好处。当我的代码被组织成不同的函数、类和多个脚本时,我开始觉得更有条理了,每个脚本服务于不同的目的,比如预处理、训练和测试。
你是在建议我停止使用 Jupyter 笔记本吗?
不要误解我。如果我的代码很小,如果我不打算将代码投入生产,我仍然会使用 Jupyter Notebook。当我想探索和可视化数据时,我使用 Jupyter Notebook。我还用它来解释如何使用一些 python 库。例如,我在这个资源库中主要使用 Jupyter 笔记本作为解释我所有文章中提到的代码的媒介。
如果你不喜欢用脚本编写所有东西,你可以同时使用脚本和 Jupyter Notebook 来实现不同的目的。例如,您可以在脚本中创建类和函数,然后将它们导入到笔记本中,这样笔记本就不会那么杂乱。
另一个替代方案是写完笔记本后把笔记本变成剧本。我个人不喜欢这种方法,因为在我的笔记本上组织代码,比如将它们放入函数和类中,以及编写测试函数,通常会花费我更多的时间。
我发现写一个小函数比写一个小测试函数更快更安全。如果我碰巧想用新的 Python 库来加速我的代码,我可以使用我已经编写的测试函数来确保它仍然按照我的预期工作。
话虽如此,我相信有更多的方法来解决 Jupyter 笔记本的缺点,而不是我在这里提到的,例如网飞如何将笔记本投入生产,并安排笔记本在特定时间运行。
结论
每个人都有自己的方法来提高工作效率,对我来说,就是利用脚本的效用。如果你刚从 Jupyter 笔记本转到脚本,用脚本写代码可能不太直观,但是相信我,你最终会习惯使用脚本的。
一旦发生这种情况,你将开始意识到脚本比杂乱的 Jupyter 笔记本有很多好处,并希望用脚本编写你的大部分代码。
如果你正在寻找从 Jupyter Notebook 转换的方法,这篇文章提供了一些很好的技巧,让你的代码可复制、可自动化,并且可以用脚本部署。
如果你对大的改变感到不舒服,从小的开始。
大变化始于小步
我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以通过 LinkedIn 和 Twitter 与我联系。
如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如
适用于您的数据科学项目的 Pytest 综合指南
towardsdatascience.com](/pytest-for-data-scientists-2990319e55e6) [## 当生活不给你喘息的机会,如何学习数据科学
我努力为数据科学贡献时间。但是发现新的策略使我能够提高我的学习速度和…
towardsdatascience.com](/how-to-learn-data-science-when-life-does-not-give-you-a-break-a26a6ea328fd) [## 如何有效地微调你的机器学习模型
发现为您的 ML 模型寻找最佳参数非常耗时?用这三招
towardsdatascience.com](/how-to-fine-tune-your-machine-learning-models-with-ease-8ca62d1217b1) [## 如何创建可重用的命令行
你能把你的多个有用的命令行打包成一个文件以便快速执行吗?
towardsdatascience.com](/how-to-create-reusable-command-line-f9a2bb356bc9)
您的 ML 系统需要保护的 5 个原因
我们探索机器学习系统的弱点以及为什么需要保护它们

我们用每天的努力工作和坚持不懈来激发我们的雄心,让我们的生活变得更加轻松便捷。人类就是这样正确前进的!蜘蛛侠说“ 力量大,责任大 ”真是有远见。
机器学习就是这样一种力量,它提高了我们的便利性,从 Spotify 基于我们以前的播放列表的建议,到过滤垃圾邮件和钓鱼邮件。虽然 ML 是先进技术给我们的一个巧妙礼物,但它总是被臭名昭著的恶意软件和攻击所征服。
每一项业务都随着客户和投资者的信任而发展。只有在客户的数据不被泄露并且隐私得到维护的情况下,这种信任才会存在。众所周知,随着数据成为新的燃料,这已经成为一项艰巨的任务。无论规模大小,每个组织都在争分夺秒地保护自己和客户免遭数据泄露。
在这篇文章中,我将告诉你 5 个很好的理由,为什么是时候努力保护你的 ML 系统了。
1。数据盗窃:我们预计电子商务将超过万亿美元大关,这显然也会导致数字欺诈的激增。Juniper Research 报告称,到 2023 年,这种欺诈行为预计将达到 1300 亿美元。另一个令人震惊的消息是,几乎 50%的电子商务公司已经成为它的受害者。
2。知识产权盗窃:专利就像是对你的创造力和艺术鉴赏力的“合法垄断”(美国专利和商标法规定的 20 年)。在你的公司环境中,知识产权战争可能会比阿姆和伊吉·阿德利亚之间的战争更糟糕。这些是在不同领域看到的知识产权违规的重要形式,即:
a. Tech: 员工窃取计算解决方案或将工作外包,以赚取双倍工资。
b .医疗: 医护人员和药师开具超出其授权能力的药品账单。
c .教育: 有人索要假助学贷款助学金。
d .财务: 伪造交易的虚开发票的制作和执行。
3。不合规:现行的网络安全法律无异于公司的责任,伴随着大量的制衡。
答:隐私政策全文 :根据 2004 年《加州在线隐私保护法》,在加州(现在几乎覆盖整个美国)经营在线业务和网站或收集客户信息(跟踪或研究目的)的每家公司都必须在网站上详细说明其隐私政策。该法律解释了收集信息的范围、第三方共享信息的目的
b .个人数据 在所有方面都与 个人信息或个人身份信息 有很大不同(你可能会互换地提到它们,但它们都有特定的法律分类),甚至美国联邦贸易委员会(FTC)也需要提出其隐私法,袖手旁观 it。
c .计划把你的眼界 扩展到美国以外。太好了!但是记得和你的律师预约。美国以外的数据隐私法与美国法律并不平行,例如欧盟的 GDPR 赋予其公民收集、删除公司获取的信息的权利;而中国的数据保护法允许中国政府干涉并保存所有软件包的源代码副本。
4。降级的 QoS: 服务质量揭示了计算服务的整体性能,攻击者可以利用它在系统中轻松地传输大量的优化授权。通过这样做,攻击者可以降低服务质量或强迫人工操作者。支持(QoS)的网络容易受到另一种形式的攻击——QoS 攻击。诸如区分服务网络之类的支持 QoS 的网络以不同的成本提供不同类别的服务。这种收费率的差异可能会刺激一些用户窃取带宽或任何其他网络相关资源。
5。分析中毒:数据中毒是金融行业最潜在的威胁载体,因为它可以破坏任何基于人工智能的安全系统。它具有高度的操纵性,并且在持续损害数据和破坏客户信任的同时,被忽视了数十年。法医专家还发现,追踪如此复杂而脆弱的状态向量极其困难,这表明基于云的基础设施需要熟练的安全模块。
除了良好的 ML 服务之外,你还需要安全,它总是能保护和过滤掉潜在的威胁,有点像现代的数据角斗士。我希望您现在更加意识到保护您的 ML 系统的迫切需要。祝你好运!
点击了解更多关于我们正在建设的 Scanta 的信息
参考资料:
新手通常误用 Python 的 5 种场景
更好地利用 Python

约翰·马特丘克在 Unsplash 上的照片
Python 是当今许多初学者的首选编程语言。简单易学的语法、大量的库和丰富的社区是 Python 飞速发展的主要原因。
当我六年前满载着 Java 登陆 Python 时,我发现自己很多次都是在用 Java 编写 Python 代码。作为新手,我没有充分利用 Python 的优势,在某些情况下,我甚至误用了它。
回到现在,我仍然看到一些新的初学者在没有花时间阅读最佳实践和建议的情况下用 Python 跳跃和编码。为了对此有所帮助,我列出了以下五个 Python 被误用的场景以及更好地利用它的建议。
#1 使用列表时

列表和元组
List 允许存储任何数据类型的元素,没有大小限制。尽管这种灵活性使 list 成为首选的数据收集方式,但实际上,什么时候使用它,什么时候不使用它,都有一些最佳实践。
当存储相同性质(数据类型和含义)的元素时,应使用 List。
Python 并没有以编程方式对此进行限制。将单一性质的项目存储在一个列表中使开发人员的工作更容易。开发人员很容易就能预料到列表中未来会有哪些项目,并据此满怀信心地编写脚本。
考虑下面的列表。这个列表没有单一的项目。开发人员无法确定该列表是否包含房屋部件、尺寸或其他内容,因此他应该分别处理所有不同的项目。
list_of_things = ['Door', 2, 'Window', True, [2.3, 1.4])]
考虑下面的水果清单和分数清单。根据前几项,您可以很容易地推断出第一个列表将总是包含水果名称,第二个列表将包含分值。
list_of_fruits = ['apple', 'orange', 'pear', 'cherry', 'banana']
list_of_scores = [80, 98, 50, 55, 100]
另一方面, tuple 更适合用于存储具有不同含义或数据类型的项目。Tuple 不提供在不创建新对象的情况下存储无限项的灵活性(因为 tuple 是不可变的)。
#2 迭代连接字符串时

串并置
你可能听说过在 Python 中一切都是一个对象,对象可能是不可变的和可变的。不可变对象需要在更新赋值时创建新的对象,而可变对象则不需要。
假设您想在一个字符串中生成整个字母表。由于 string 是一个不可变的对象,每当您使用“+”操作符连接字符串值时,您总是会生成新的对象。
one_line_alphabet = ''
for letter_index in range(ord('a'), ord('z')):
one_line_alphabet += chr(letter_index)
连接字符串的首选方式是使用 join 函数。使用连接功能可将计算时间减少约 3 倍。在我执行的一个测试中,迭代连接一百万个字符串值花费了 0.135s ,而使用 join() 函数仅花费了 0.044s 。
small_letters = [chr(i) for i in range(ord('a'), ord('z')+1)]
single_line_alphabet = ''.join(small_letters)
所以,每当你需要连接一个字符串列表时,使用 join 函数。通过 join 函数连接几个字符串不会真正让您看到性能差异。要连接几个字符串值,使用。格式代替加号运算符。例如:
name = 'John'
surname = 'Doe'
full_name = '{name} {surname}'.format(name=name, surname=surname)
#3 读写文件时

答。txt 文件
要在 Python 中读写文件,你需要首先通过内置的 open 函数打开文件。你打开文件,读或写内容,然后关闭文件。当您这样做时,可能会出现一些问题。忘记关闭文件和不处理异常就是其中的一些。
完成作业后忘记关闭文件会导致问题。例如,如果您在写入文件后忘记关闭文件,写入的内容将不会出现在文件中,并且您将在文件仍处于打开状态时保留计算机中分配的资源。如果没有手动处理异常,并且在处理文件时出现错误,文件将保持打开状态。
f = open(file='file.txt', mode='r')
lines = f.readlines()
...
f.close()
每当你打开文件时,建议使用带有关键字的。用是一个上下文管理器,它包装代码并确保为您自动处理异常。例如,当您读/写文件时,无论 with-body 中有什么可能失败,都会自动处理异常,并且文件总是为您关闭。
with open('file.txt') as f:
read_data = f.read()
...
当skippingwith你应该自己处理一切。关闭文件和异常处理应该由您来明确处理。相反,让你的生活变得更轻松,让和一起管理局面。
#4 跳过发电机时

将所有值保存在一个列表中,而不是逐个生成它们
在许多情况下,您需要生成一个值列表,以便稍后在脚本中使用。比方说,您需要为前 100 个数字生成所有三个数字的组合。
combinations = []
value = 100
for i in range(value):
for j in range(value):
for k in range(value):
combinations.append((i, j, k))
当执行完成时,组合列表将包含 1M 个元组,每个元组具有三个 int 值。这些值将驻留在内存中,直到被删除。使用 sys 模块中的 getobjectsize 函数检查对象大小,得到的大小为 8.29MB
您可以创建一个 生成器 来代替使用列表来存储值并将它们保存在内存中,无论何时您调用它,它都会一次生成一个组合。这减少了内存消耗并保持了更快的执行速度。
def generate_combinations_of_three(value):
for i in range(value):
for j in range(value):
for k in range(value):
yield (i, j, k)gen = generate_combinations_of_three(100)next(gen) # yields (0, 0, 0)
next(gen) # yileds (0, 0, 1)
...
因此,尽可能使用发电机。请始终记住,内存容量是有限的,并尽可能优化内存使用。使用生成器,尤其是在开发可伸缩的解决方案时。发电机很重要,考虑一下吧!
#5 使用理解时

列出理解
Pythonista 描述了一个程序员,每当用 Python 编码时,他都遵循来自Python 之禅的指导方针。如果你是 Python 的新手,你会倾向于夸大这个禅宗的某些观点,而轻描淡写其他观点。
当你开始了解理解的时候,你会注意到这一点——你倾向于翻译理解中的“每一个”循环。假设您有一个要展平的三维数字矩阵。
matrix = [[[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]],
[[ 10, 20, 30 ],
[ 40, 50, 60 ],
[ 70, 80, 90 ]]]
使用列表理解,扁平化看起来像:
flatten_list = [x for sub_matrix in matrix for row in sub_matrix for
x in row]
使用 for 循环时,展平看起来像:
flatten_list = []
for sub_matrix in matrix:
for row in sub_matrix:
for x in row:
flatten_list.append(x)
理解很酷,但可读的代码更酷。不要让你的意图总是使用理解。即使这可能需要编写更少的代码,也不要牺牲代码的可读性。
结论
无论何时开始学习一门新的编程语言,无论你是否有经验,都要花时间阅读最佳实践。每种语言都有一些使其特殊的成分,所以要确保在正确的地方使用它们。
Python 致力于更快更容易地完成工作,但是你不应该忽视那些可能对你的代码生命周期产生负面影响的小决定。尽可能寻找更好的优化解决方案。
你可以用勺子或叉子切奶酪,但刀子肯定会做得更好。
不使用外部库压缩文本数据
towardsdatascience.com](/10-pure-python-functions-for-ad-hoc-text-analysis-e23dd4b1508a) [## 提升你的软件开发职业生涯的三件大事
从优秀到卓越
medium.com](https://medium.com/swlh/three-significant-things-to-elevate-your-software-development-career-83be99cedf28) [## 作为一名开发人员,赢得尊重的 4 件事
迈向成功的事业
medium.com](https://medium.com/@dardanx/4-things-that-will-earn-you-respect-as-a-developer-eec54d1ac189)




浙公网安备 33010602011771号