黑客和人工智能研究是如何联系在一起的
为什么成为一名优秀的黑客马拉松参赛者会有助于研究事业
图片来自 Alex Kotliarskyi 在 Unsplash
起初,黑客马拉松和人工智能研究似乎没有什么相似之处,主要是它们都与 CS 和人工智能相关。然而,经过一年多的参与,我已经学会了使用黑客马拉松来提高我的研究技能,反之亦然(类似于多任务学习的工作方式)。虽然研究是一项真正的职业,而不是在黑客马拉松中竞争,但这两者之间有许多可移植的技能,值得强调。这两者现在基本上都成了我高中之外的生活,所以我一直在深入分析这两者是如何的相似,以及为什么我似乎如此享受这两者。
我写这篇文章的灵感来自最近的新闻。本周,宣布我入选了大联盟黑客 2021 年 50 大黑客,这是黑客马拉松社区中最成功和最有影响力的黑客的荣誉。在我的简介中,我被要求描述我未来想做什么,当我写关于研究的写作时,我意识到黑客马拉松教会了我多少可以转移到人工智能研究的技能。在这篇文章中,我将谈论两者之间共享的硬技能和软技能,以及为什么它们对成为一名成功的研究人员很重要。
我的黑客档案(图片由作者提供)
硬技能
显然,从编程的角度来看,黑客马拉松和研究分享了很多硬技能。我的大部分黑客马拉松项目都是基于 AI 的,我在团队中的角色就是构建和训练 AI 模型。因此,对于使用 PyTorch 这样的框架来说,黑客马拉松是很好的实践。在黑客马拉松中,我也有更多的机会练习数据处理和其他对研究用人工智能模型编码至关重要的技能。
一个重要的区别是,对于黑客马拉松,我经常发现自己使用 Tensorflow,因为模型要简单得多,而且不一定是高性能的。在我看来,Tensorflow 对初学者更友好,当我不必编写复杂的训练循环时,Tensorflow 的工作效率更高。然而,对于研究,需要编写高级训练循环和构建复杂的模型,因此 PyTorch 提供的多功能性和技术优势使其成为我最喜欢的 ML 框架。然而,我无法给出哪个更好的最佳分类,所以请阅读这篇文章。
正在进行的关于 PyTorch 和 Tensorflow 的争论(图片来自这里
黑客马拉松教会我的另一项硬技能是演示和写作技能。关于黑客马拉松,一个经常被忽视的事实是,获胜的关键是写一份关于它的有效报告,并正确地展示它。该项目可以是活动中技术最先进的项目,但如果你没有恰当描绘它的演示技巧,你就不会获胜。同样,对于研究来说,你所进行的研究仅仅取决于你如何展示它。在论文中,你必须做一个适当的文献综述,解释方法和所有相关术语,并以一种可理解的方式呈现结果。由于我们必须完成的时间有限,我最近的论文实际上与其中的一些问题做了斗争。虽然评论者称赞我们方法的新颖性,但因为它不是非常清晰地呈现,所以它获得了负面的评论。黑客马拉松不仅帮助我发展了面向外行人的演示技巧,也帮助我发展了面向技术裁判的演示技巧,总体上让我成为了一名更强的研究人员。
展示你的研究是研究过程的基础(图片来自此处
从硬技能的角度来看,黑客马拉松在研究方面教会我的最好的事情是人工智能如何在各种领域工作,如 NLP、机器人和音频。我第一次学习 NLP 是通过一个黑客马拉松项目,因为在一个低任务周末对代码和数据进行实验让我了解了 NLP 的基础知识,并探索了它的潜在应用。由于黑客马拉松只是一个周末,它们让你可以在一个新的领域里冒险,同时学到很多东西。上周末,我决定探索音频神经网络,在这个过程中,我阅读了许多关于人工智能音频处理的研究论文,使我能够确定这是否是我未来的潜在研究领域。黑客马拉松自由流动的特性极大地帮助了研究工作。
除了列出的这些,还有许多其他明显的硬技能是黑客马拉松和研究共享的,但这些是我认为值得注意的。然而,更重要的是黑客马拉松与研究共享的软技能。
软技能
我想讨论的第一个软技能是能够在压力下工作。黑客马拉松是为了产生压力而建立的。24-48 小时是非常少的,所以构建一个完整的原型应用程序需要惊人的效率和大量的快速思考。要成为一名伟大的黑客,你必须能够快速编码,构建 MVP,并快速从挫折中恢复。在研究中,也有必须满足的硬性期限。虽然会议提交可能需要 3-4 个月才能完成,但与完整的研究论文所需的工作量相比,这与黑客马拉松项目每周的工作量相当。因此,你还必须能够快速编码,如果你没有一个完全指定的深度学习装备,如何同时训练大量模型,并及时撰写论文。在我最初的几个研究项目中,进行黑客马拉松确实帮助了我进行时间管理,而且找到像黑客马拉松这样时间如此紧张的活动是罕见的,这意味着它对你的效率的影响是独特的。
黑客和研究都需要深夜编码来满足最后期限(图片来自 Unsplash 上的áRPád Czapp)
另一个重要的技能是能够从错误中恢复。不出所料,总会有失败和错误,但能够从这些错误中恢复是我从黑客马拉松中学到的一项巨大技能。因为某些参数设置不正确而能够重构错误编写的代码或重新训练模型是我学到的重要能力,它们在研究领域非常重要,因为运行适当的实验和创建可重复的代码需要很高的精度和注意力。它还教授团队合作和沟通,因为研究和黑客马拉松都需要你经常与他人合作。一个项目的工作总是由多人分担,为了成功,你必须是一个好的沟通者,并且知道你在团队中的角色。
然而,最重要的是,黑客马拉松帮助我培养了一个有创造力和创新精神的头脑。每周,黑客马拉松都迫使我制定一个对这个领域来说新颖的新项目,因为独特性是评判的一个重要标准。然而,这些想法通常不能是古怪的,但需要是对人们有帮助的真实解决方案,以及对当前解决方案的改进。同样,在人工智能研究中,每篇论文都提出了一种完成任务的新方法,通常是对以前工作的改进,对我来说幸运的是,黑客马拉松改变了我的思维方式,让我有望在未来的职业生涯中成为一名伟大的人工智能研究人员。
老实说,很多这些软技能可以在其他活动或工作中找到,但与黑客马拉松提供的硬 CS 和 AI 技能相结合,成为一名黑客肯定可以积极影响研究生涯。软技能是一个很好的补充。
最后的想法和我的职业规划
黑客马拉松给了我软件工程技能,一旦我进入大学,我有望在未来几年加入一个研究实验室。到目前为止,我从黑客马拉松中学到的硬技能和软技能都在我的研究生涯中帮助了我,我希望一旦我进入大学并更多地参与研究,它会继续帮助我。
我思考过的一个主要困境是,我是想去谷歌这样的研究所,去他们的人工智能或 DeepMind 实验室,还是去一所大学。看起来像谷歌或脸书这样的公司很难被雇佣,但是在计算机视觉领域,许多顶尖的突破都来自公司,我很乐意参与其中。但是,大学研究似乎与其他学科的联系更紧密,合作和影响更大,这也是需要考虑的重要因素。目前,我是斯坦福医学放射科学实验室的实习生,在那里我发表了多篇将计算机视觉技术应用于医学成像任务的论文。将我的知识应用于去噪或图像质量评估等特定任务,对其潜力和影响有了更清晰的看法,但一般计算机视觉研究所围绕的理论方法无疑吸引了我。虽然我有很多时间来决定,但我越早决定,我的职业生涯就越容易。
我梦想中的工作场所(图片来自此处
在接下来的几年里,我想把研究范围缩小到一个领域。目前,我在两个主要领域进行研究:医学成像和普通计算机视觉。根据我在这些领域的成功以及未来的机会,我认为自己会更多地参与行业研究和通用计算机视觉,因为这更吸引我。我目前的背景和兴趣表明我更适合一般的计算机视觉领域,但医学成像仍然对我有吸引力,所以如果我了解更多关于我工作的生物学背景,我想我会比现在更感兴趣。尽管如此,我对明年的大学经历感到兴奋,并希望我继续参加黑客马拉松,同时参与研究,以便我在这两方面都继续提高。如果你们对此有任何想法或建议,请告诉我!感谢阅读。
数据分析师有多幸福?分析师薪酬调查的可视化
俄语分析如何估计他们的工资率
信息技术专家之间的工资差距很大。这可以用多种因素来解释:某个人的硬技能和软技能、他们在公司中的位置、所述公司的位置等等。我们使用社交网络质疑来自俄罗斯和其他国家的数据分析,然后可视化 Power BI 中获得的信息,这使我们能够发现相关数据并做出相应的结论。
在本文中,我们关注数据可视化和结果解释,而没有相关统计计算的细节。我们还演示了通过 Power BI 中的可视化工具接收数据的可能性。
研究详情
我们准备了一份谷歌形式的调查问卷,并提供给我们的受访者。问卷的 4 个要点包含了关于他们的年净工资范围、他们自己相对于市场的工资评估、他们在公司中的位置和公司位置的问题。大约 500 名分析师参加了投票,其中大多数来自俄罗斯和独联体国家,一些来自美国、澳大利亚和马达加斯加。结果没有预期的那么明显。
可视化细节
带有可视化答案的仪表板的最终版本如图 1 所示。
图一。可视化 Power BI 中接收的数据
首先,我们在堆积柱形图中展示了年净工资(图 2)。工资范围分为七组,从低于 7,000 美元到高于 32,000 美元不等。我们还计算了净推介值(NPS ),并将其添加到该图表中。
一般来说,NPS 表明消费者向他人推荐某个组织/服务的可能性有多大[1]。在这项研究中,我们使用 NPS 作为衡量薪酬水平满意度的指标。
图二。用 NPS 趋势线显示净薪金范围的堆积柱形图
以下是受访者对其相对于市场的薪资水平的估计,分为三个级别:较低、中等和较高。漏斗图说明了一个人在公司的职位(总监、部门主管、专家)。(漏斗是一个有用而简单的工具,只需点击它就可以改变每个仓位的信息)。
图 3 堆积条形图和漏斗图显示了受访者对薪资水平及其在公司中的职位的估计。
下面的地图和柱状图显示了俄罗斯联邦公民与其他国家公民之间的比例,以及居住在首都和各地区的公民之间的比例。点击这些条,我们可以看到净工资率的比较。
图 4。显示受访者位置的地图和堆积条形图
它还显示了受访者的总数和一个链接,该链接可作为参与我们调查的邀请(仪表板的上部)。
讨论
在当前的研究中,我们询问了大约 500 名数据分析专业人士。其中 86%在俄罗斯工作,其他人在独联体国家工作。居住在各地区和首都的人口比例几乎相等:49%对 51 %。7 %担任首席执行官,22%担任不同部门的主管,其余 70%是专家。超过一半的人(57%)认为他们的净工资在劳动力市场上处于平均水平。另外 43%的人分为认为自己净收入低于平均水平(27%)和高于平均水平(16%)的人。
在我们的研究中,三个净工资范围是被引用最多的。20%的受访者年收入在 1.3 万到 1.6 万美元之间,17 %的人年收入在 9000 到 1.2 万美元之间,16%的人年收入在 0 到 8000 美元之间。值得注意的是,只有 9%的受访者年收入超过 34,000 美元。
然而,工资在 26000-36000 美元范围内的分析人员有正的 NPS。这意味着只有 20%的受访者对自己的收入水平感到满意。
看看 CEO 们,我们发现,在我们的研究中,34%的高管年薪超过 32,000 美元。他们认为自己的薪酬与市场相关,或者高于平均水平,并且对自己的薪酬水平普遍感到满意。然而,不到 1%的人认为他们的收入低于平均水平。(据统计,收入低于 2.3 万美元的人对自己的收入不满意)。下图显示了 CEO 的薪酬水平和 NPS 系数。
图 5。首席执行官年薪净额指标
就部门主管而言,他们的工资范围比首席执行官的分布更均匀,如下图所示。其中 6 %的人年收入不到 7,000 美元,14%的人处于分布曲线的中间(16,000 美元/19,000 美元),16 %的人年收入超过 34,000 美元。据 NPS 称,可以预见的是,只有最后一组人对自己的净收入感到满意。与此同时,13%的部门主管声称他们的净工资在市场上是足够的,6 %的人认为低于平均水平。
图 6。部门主管的年薪净额指标
专家组的结果与前两次的结果有很大不同。图 7 中的工资分布曲线显示,收入低于 7000 美元的分析师、收入在 9000-12000 美元的分析师和收入在 13000-16000 美元的分析师人数几乎相等。大概是 20%。12%的人年收入超过 24,000 美元。40%的人认为他们的净收入在平均水平之内,而 21%的人认为低于平均水平,10%的人认为高于平均水平。
NPS 的数据显示,年薪超过 2 万美元的专家中,有 23%对自己的薪酬水平感到满意。
图 7。专家年净工资指标。
比较在地区和首都工作的受访者,我们可以看到 34%的专家、25%的部门主管和 7%的首席执行官居住在地区。图 8 显示,净工资低于 7,000 美元的仅限于来自各地区的专家(占所有受访者的 28%)。有趣的是,NPS 指数显示,居住在地区的专家比居住在首都的专家对自己的薪酬更满意。地区分析师对高于 1.2 万美元的薪酬感到满意,而来自首都的同行对超过 2.4 万美元的收入感到满意。
图 8。首都和地区年净工资比较。
结论
我们研究的目的是发现俄罗斯联邦和独联体国家的数据分析如何估计他们的工资率。在这方面,考虑了三种不同的职位——首席执行官、部门主管和专家。一般来说,56%的受访者认为他们的工资与市场平均水平一致,28%的受访者对自己的工资不满意,因此希望赚更多的钱,而 16%的受访者认为他们的收入高于平均水平。
另一个重要的发现是,2%的首席执行官对他们的薪酬不满意,年薪不到 7,000 美元,而一些专家(4%)的年薪超过 32,000 美元,他们认为自己的收入高于平均水平。这反映了劳动力市场上 IT 专家的现状:好的 IT 专家有更高的工资,有时会超过市场上的平均水平。虽然通常会考虑多种因素,但有一些专家(不是首席执行官或部门主管)的工资可能会远远高于平均水平。
另一个普遍趋势是俄罗斯和独联体国家的资源集中化。首都和地区之间的生活水平差异很大,这项研究进一步证实了这一点。尽管地区平均净工资较低,但人们对这一比率比大都市的同行更满意,即使后者的收入更高。
所有结果都使用 Power BI 可视化。地图、条形图和漏斗图等基本的交互式工具使数据处理变得更加容易和快速。
参考文献
1.Reichheld,F. F. (2003 年)。你需要增加的一个数字。哈佛商业评论,81 年,46-54 页。
女王的策略如何影响了在线象棋的流行?
实践教程
chess.com 新老玩家分析
源代码: GitHub
介绍
女王的棋 网飞秀描绘了国际象棋神童贝丝·哈蒙(Beth Harmon)与毒瘾抗争,征服了男性主导的国际象棋世界。众所周知,《女王的策略》在全球的成功引起了人们对国际象棋的兴趣。我自己也是受害者之一,重新受到启发,开始玩网上象棋。不可避免地,这已经滚雪球般变成了一种困扰,我在过去的一个月里在 T21 玩了 375 场快速游戏,并在我最近的生日收到了 4 本国际象棋书。这种国际象棋热的影响也蔓延到了我的社交圈,关于国际象棋的对话从独白变成了对话,几个朋友打开了他们有史以来第一次在线国际象棋游戏的大门。
这让我想知道还有多少人被女王的策略所感染,尤其是在线象棋的流行会如何反映这一点。我希望这可以通过下面的指标来识别。加入在线象棋网站的新玩家数量增加。
2。现有用户玩的游戏数量增加。
在这里,我试图用来自chess.com的数据来检验这些假设,这个互联网最大的象棋社区拥有超过 2800 万会员。
新玩家数量
《女王的策略》于 2020 年 10 月 23 日在英国上映。为了了解这对加入在线象棋的用户数量的影响,我将使用 chess.com 的API下载 10 月 23 日前后 4 个月内加入的英国玩家。为了节省时间(这里有> 200,000 名英国玩家,查询每个档案需要大约 0.5s),我已经随机选择了 5000 名英国玩家**。值得注意的是,这种方法受到在女王的策略发布后的一段时间内,用户的旗帜如何准确地反映用户的居住国的限制。**
在女王的策略英国发布后(用红色虚线标出),加入 chess.com 的用户数量急剧增加。需要进一步观察才能确定,但看起来注册用户的爆炸式增长至今仍在继续。
因此,与之前相比,在《女王的策略》发布后的 4 个月内,总共有**~ 7 倍**的人加入了 chess.com!
网飞节目的上映日期因国家而异。这让我们能够探索加入 chess.com 的用户的增加是否与《女王的策略》在该特定国家的发布日期相关。基于非官方的网飞在线全球搜索,我选择了 3 个不同发布日期的国家和 1 个网飞不可用的国家:
- 英国:2020 年 10 月 23 日
- 意大利:2020 年 11 月 28 日
- 哥伦比亚:2021 年 1 月 12 日
- 中国:网飞不在
似乎还不清楚女王的策略的确切发布日期是否标志着每个国家加入的用户数量分别开始增加。也就是说,我们可以观察到,在哥伦比亚这个发布日期最近的国家,用户加入的峰值向更晚的日期转移。有趣的是,从 2020 年 10 月 23 日起**,所有 4 个国家加入 chess.com 的玩家数量都有所增加**。这可能是由于虚拟专用网和其他非官方方法的可用性,这些方法允许人们在居住国之外访问网飞的节目。中国在线国际象棋的增长率要低得多,而且似乎比其他国家更早达到稳定,这可能是因为那里存在更大的在线限制。
现有用户玩的游戏数量
尽管《女王的策略》作为一个娱乐性的电视节目受到了公众的欢迎,但它在现有的棋迷中更受欢迎。就连目前的世界冠军芒努斯·卡尔森也为它的游戏代言。
上面,我们探讨了加入在线象棋的新玩家的数量。在这里,我们转而关注现有用户如何通过女王的策略重新点燃他们对国际象棋的兴趣。为了解决这个问题,我将继续使用上面获得的 5000 名随机英国用户。为了确保这一分析不会被加入的新玩家数量的增加所混淆,我只评估了在 2020 年 9 月之前加入的用户(即,他们在女王的策略发布之前已经成为 chess.com 的一部分至少一个月)。然后,在 2020 年 9 月至 2021 年 1 月的 5 个月时间里,我将获得每个用户每月玩的游戏数量。
从 10 月份开始,每位玩家的平均游戏次数稳步上升。值得一提的是,由于这一分析没有按照时间控制(如子弹、闪电战、快速等)进行划分,这一结果有可能是因为用户转向了时间控制更快的游戏。
通过将每个用户在 5 个月内的游戏数量标准化,我调查了个人玩家是如何增加他们玩游戏的相对数量的。从 11 月到 1 月,玩家们逐渐增加了下棋的频率,这表明女王的策略已经激励现有用户玩更多的在线象棋。
甚至那些暂时离开国际象棋的人也被劝说回来。通过特别关注那些在九月或十月一场比赛都没有参加的玩家,我们可以锁定那些正在经历象棋干旱期的人群。这些玩家中超过 55%的人在 11 月到 1 月回来打了至少 10 场比赛!这表明,大多数不活跃的玩家在观看了女王的策略后,至少被赶回 chess.com 玩了几场游戏。
结论
《女王的策略》作为一部网飞电视节目已经在国际上取得了成功,现在已经在超过 25 个国家播出。在这里,我证明了该节目的发布导致了在线象棋受欢迎程度的飙升,其中既包括开始象棋之旅的新人,也包括受到激励重返在线象棋或更频繁地玩游戏的现有玩家。
尽管观察了《女王的策略》的发布和在线象棋统计数据之间的这些趋势,质疑这两者之间的因果关系还是很重要的。很可能仅仅看比赛并不能直接解释在线象棋受欢迎程度的整体提高;许多其他因素也可能在起作用。目前的 COVID 情况让许多人在家工作,有人认为在线象棋已经作为一种出口获利。此外,国际象棋本质上是一种多人游戏,用户可以通过自己的社交网络将他们新发现的兴趣传播给其他人。最后,在所分析的时间范围内,还发生了其他国际象棋事件。例如,2020 年 5 月,chess.com 举办了第一届使用流行彩带的 PogChamps 锦标赛,这很可能扩大了人们的认识,并为在线象棋赢得了吸引力。
不管起源如何,我喜欢最近国际象棋受欢迎程度的上升。除了提醒我喜欢下棋之外,在我与下棋有关的漫步中,打哈欠的次数也明显减少了。我认为,在某种程度上,这要归功于女王的策略引发了一股国际象棋热潮,这股热潮已经蔓延到了全球,包括新老玩家。
我如何在一个没有预处理的文本分类问题上达到 90%的准确率
使用 Spark NLP 充分利用 BERT 句子嵌入的能力
布雷特·乔丹在 Unsplash 上的照片
在之前的帖子中,我展示了不同的单词嵌入(GloVe,ELMo,BERT)如何用于文本分类任务。我们看到了捕捉上下文对于最大化准确性的重要性。
我们还探索了几种预处理文本以改善结果的方法。与此同时,我们想象了每一步是如何改变我们的原始文本的。
今天我们把一切都扔出窗外!我将演示如何在没有任何预处理的情况下达到 90%的分类准确率。你准备好了吗?我想保持这一个简短和甜蜜,但你可以在这里找到我的完整笔记本。
数据集
我选择使用 AG news 基准数据集。我从约翰·斯诺实验室的中恢复了训练和测试测试(所有 NLP 的东西都必须看参考)。该数据集分为四个平衡的类别,共有 120,000 行,如下所示。
数据集被格式化为两列,类别和描述。
如何在没有预处理的情况下获得 90%的准确率
因为我希望这是一个简洁的帖子,所以我会让你参考我以前的文章来了解如何在 Colab 中使用 Spark NLP。这只是几段代码。或者,你可以在这里查看我关于那个项目的笔记本。
作为一个简短的回顾,为了将句子嵌入放在有多酷的环境中,考虑下面我用于 GloVe、ELMo 和 BERT 单词嵌入的预处理步骤的概要:
- 将原始文本转换为文档
- 将文档标记化以将其分解成单词
- 规范化标记以删除标点符号
- 删除停用词
- 将剩余的单词简化为它们的引理
- 然后我可以创建单词嵌入
使用 BERT 句子嵌入,唯一需要的步骤是将原始文本转换成文档。完整的管道可以在下面看到。在第一个块中,您可以看到描述列中的文本被使用*文档组装器转换为文档。这个文档列然后被用作 BERT 句子嵌入的输入。最后,这些嵌入被用作分类器的输入。*就是这样!
结果
下面,您将找到一个示例,展示该模型如何在文本子集上执行。类别列有标签,而结果列有预测类别。
然后,我们可以使用 scikit-learn 来计算我们的指标。如下图所示,总体准确率为 90% !
我们今天学了什么?
我想和你分享一个简单而强大的工具来添加到你的 NLP 工具包中。没有任何预处理,这可能是相当耗时的,BERT 句子嵌入用于获得我们的 4 个类别的优秀分类。
我把这个保持简短,只是为了向你介绍句子嵌入的力量。试试看,让我知道你的想法!
我是如何在 LinkedIn 上吸引招聘人员的
14 个月的实验归结为可行的建议
如果你一直在关注我在其他文章中所说的,请在下节课中随意跳到建议部分。
不过,如果你没有,我通常会提供一些背景信息——我会在我的职业变化和突出技能文章中更广泛地谈论它——本质上可以归结为以下几点:我最近成为了一名全职软件工程师,之前从事了 12 年的商业/数据科学&分析、战略规划和报告工作。近十年前,我拿到的是商科学位,而不是技术学位,除了自己做过的事情,我在这个领域几乎没有相关经验。
现在你已经明白了,关键是:昨天我签署了三份工作邀请中的一份,这是一份 6 位数薪水的高级后端工程师的工作。从任何角度来看,这都是我职业生涯中收入最高的工作。
请注意,我不认识招聘人员或招聘经理。我和那家公司的任何人都没有私人关系。不,我也没有挟持任何人。一个猎头找到了我,我在两天内参加了两次面试,最后在第三天被录用了。
在大约 14 个月的时间里,我尝试了求职信、简历、LinkedIn 以及其他一些能让我足够引人注目的东西,让那家猎头公司带我去淘金。最终,被寻找比申请更能有效地找到工作,LinkedIn 就是为我找到工作的工具。
请记住,当我瞄准数据科学和软件开发职位时,这种方法对我有效,对我有效的一些方法可能是面向行业的,但对其他人也可能有效。
重要的是:从我的经历来看,你的行动会产生结果。你的个人资料将会改变,但你最有可能在 2-4 周内看到效果。
我如何模仿我的 LinkedIn
这绝对是最重要的。如果你没有 LinkedIn 个人资料,对于招聘人员来说你就不存在。如果你在 LinkedIn 上的个人资料很差,那就相当于你也没有。
现在的问题是,我们如何优化它?说实话,我不知道。我可以告诉你的是,以前每六个月有不超过两个招聘人员联系我,现在我一周有 8-9 个。一天之内已经有人联系我 12 次了。也许这些对于经验丰富的开发人员来说是新手数字,但对我来说这是巨大的。
这些联系人很难保证他们会有趣或符合你的兴趣,但他们通常会准确地告诉你想去哪里。以下是主要方面:
一个描述性的标题和一个主题。
好吧,主题只是让招聘人员“感觉”到你。
不过,当他们搜索职位描述时,会立刻看到你的标题。我曾经把*“全栈开发人员|软件工程师|数据科学背景&分析】*,这产生了相当多的点击量。但是当我把我工作过的技术包括进来的时候,大量的联系方式开始冲击我的收件箱。
如果你是一个开发者,提及你的主要堆栈。如果你是一名数据科学家,提及你的主要专长(如计算机视觉),但不要忘记宽泛的术语,如“机器学习工程师”)。如果你从事金融工作,一定要提到 Tableau 这样的工具。你明白了。
连接,连接,连接
不要引用我的话,但是根据我在其他地方读到的,如果你和招聘者有共同的联系,你很可能在搜索中处于更高的位置。
试着和这个领域的人联系。我可以保证的是,建立一点人际关系网绝对没有坏处。
描述性角色头衔
叫我书呆子吧——我确实是,但是我认为代码是美丽的。当我第一次尝试把一个按钮放在中间的时候,我对制作一个 API 同样兴奋。这就是为什么我使用更通用的头衔,如“开发人员”和“软件工程师”——我对全栈、前端或后端持开放态度。没关系。
但是,如果对你有影响,确保你的头衔是一致的。不言而喻,但也不要撒谎。只要确保你的头衔能很好地代表你想做什么和你的工作是什么,因为这也会出现在招聘人员的搜索中。
让自己敞开心扉去工作
您可以在您的个人资料页面的“打开”按钮下找到它。你申请的头衔和地区都是相关的。不幸的是,LinkedIn 不提供“仅远程”,但如果你是一名开发人员,它最有可能是它。
你可以给自己设定最多 5 个职位和 5 个你愿意工作的地点。曾经有一个字段,你可以向对你感兴趣的招聘人员显示一条短消息,但现在已经没有了。
表现出一点个性
那些描述自己的人,限制自己。
大约 20 年前,在脸书热之前,这个被称为 Orkut 的社交网络曾经在巴西用户中流行过。
相信一个人局限于他们写的关于自己的东西不仅是一种非常天真的行为,而且在找工作时也非常非常适得其反。或者,在这种情况下,正在找工作。
当你遇到一个人,你会想知道这个人是做什么的,他们是什么样的。我把我的“关于”部分变成了这个样子。你会发现一页又一页的人用 JavaScript 编码,但是如果有机会我会因为是一个奇怪地被天体物理学认证的开发者而被记住(尽管我几乎不记得课程中的很多内容),那就这样吧。奇怪的是,这很能说明我是一个怎样的人,因此也是一个专业人士。
我不想把我的“关于”部分作为一个美学参考,但我相信我成功地传递了这个信息。
展示一些技巧
现在,当我写这篇文章的时候,我意识到我的技能已经完全过时了(比如专注于我以前的职业)。虽然我仍然有那些,我想展示新的。我使用的主要技能都在前三名,所以我想那也算。不知道你的资料里有没有说这个的功效,但还是那句话,它不会伤害到你。
帮助自己变得有条理
这并不是对 LinkedIn 本身的改变,但我不断得到反馈,说它让招聘人员很高兴(也让我的生活轻松了很多)。大多数招聘人员一开始都会说几乎相同的话:
“我有一个我认为你很适合的职位,把你的电话号码发给我,这样我们可以进一步讨论。”
当我几乎没有接触时,这曾经是令人兴奋的,但一旦它成为现实,这对于我的全职工作来说显然是不可能处理的。根据经验,任何介绍电话都不会少于 20 分钟。乘以十几个招聘人员,你将不得不每周花 4 个小时来筛选机会。
很多时候,招聘人员认为 Java 和 JavaScript 是一回事。或者他们认为“嘿,这是一个 IT 人。也许他想在公司层面上修理打印机。”不,我没有。不能,但那是另一个话题,我不想花整整半个小时来告诉你。
于是我走了两步。
首先,我注册了一个议程服务。我不会到处宣传它们,但它们就在那里。你将它们与你的谷歌/Outlook 日程整合,当有人与你预约时间时,它会为给定的时间段生成一个会议/团队/缩放链接,并自动阻止你的日程安排。太美了。
第二,我写了一条简单的信息,我会发送给所有这些非描述性的联系人。大致是这样的:
嗨,(招聘人员姓名)。
谢谢你伸出援手。我的主要堆栈是 JavaScript (React,Node)和 Python,我对完全远程的全职机会感兴趣,报酬大约每月 X,XXX 美元。如果需要,我愿意使用/学习其他技术。
如果这符合您的要求,请通过此议程链接随意安排时间。它会自动创建一个 Google Meet 链接,但如果你喜欢其他联系方式,请随时将邀请转发给 me@myprovider.com,或者告诉我你是否想要我的电话号码。
谢谢你,
我自己。
包扎
我从来不敢就这个特定的话题写“如何做”。我的建议是带给你一种个人体验,而不是一个好的个人资料的科学。请注意,所有的经历都是不同的,我正在分享一些对我很有用的东西。我希望其中一些也能为你带来积极的结果。
我会更多地谈论我如何制作我的简历,我如何在面试中保持平衡,处理技术挑战等等。,但是这些将在另一篇文章中讨论,所以这篇文章不会错过它的主要目的。
不过,我不能保证下一个标题会如此吸引人。
我是如何闯入数据科学的🚀
闯入数据科学
👨🔬一名化学工程师的数据职业之旅👨💻
现在是 2013 年 6 月,我即将高中毕业。激动人心的时代;大四日落,毕业,毕业派对!我真的非常喜欢数学和化学;两科都拿了 AP,成绩不错。因此,我选择了化学工程作为我的专业。我对此感到兴奋,并于 2015 年在犹他大学大一开始上工程课。(注意,我曾在耶稣基督后期圣徒教会担任了两年的传教士。
高中最后一年的我(来自作者)
当我开始上大学的时候,我爸爸(一个炒股的家伙)曾经提到过我应该学习这个叫做“机器学习”的东西。他给我发了一个 YouTube 链接,让我观看(见下面的视频)。我不是很懂,所以我做了所有好儿子都会做的事,无视他们的爸爸!几乎忘了学过这方面的任何东西。
谷歌解释机器学习的视频
大学第一学期;如此美好的时光。我上大学课,认识新朋友,住宿舍;生活是美好的。但是,我想在“我的领域”找一份工作。我甚至不确定“我的领域”是什么,但我想在工程或科学或其他方面找份工作。
我了解到大学教授不仅教书,还做研究,并让学生在他们的实验室工作。我认为这已经足够接近“我的领域”,并决定进一步探索。我花了几个小时在网上筛选,寻找机会,找到了大约 20 位教授,他们从事某种类似工程的研究。然后,我发现了他们的邮件。我给他们发了一封冷冰冰的邮件,问他们的实验室是否有空缺。
这是我发的一封真实的邮件,这封是给孙博士的。
给职业的冷邮件(来自作者)
二十个人中只有三个人回答。一个说他们满了。一个是数据分析职位,但他们告诉我我没有足够的经验(现在非常讽刺)。第三个是冶金工程教授孙博士,他给我回了邮件,要我的高中成绩单。记住,这是我大学的第二个月,所以我还没有任何大学成绩。我回答说我找不到我的高中成绩单,但这里有一些成绩单和过去老师的推荐信。我猜这对他来说已经足够了,因为他奇怪地回答道,“艾弗里,你的学习成绩很好,我有兴趣让你开始实习。“不久后,我开始了《我的领域》的实习。
一个博士后在管理实验室,他是我的老板。他告诉我,我将有 3 个月没有工资,直到我接受培训,然后开始赚钱。我只是对获得经验感到兴奋。在接下来的 3 个月里,我每周花大约 5-10 个小时进行实验,采集样本,并免费打扫铁开发实验室。这项研究旨在开发一种更智能、更坚固的铁材料。
经过三个月的训练,我终于得到了第一份薪水,这让我兴奋不已。我给经理发了一封电子邮件,询问我如何才能把直接存款的事情都办好。他回复并建议我从夏天开始向大学申请研究基金。那是二月?我很困惑,我应该得到报酬。他基本上继续解释说,实验室不会支付我,如果我想得到报酬,我必须从普通大学获得资金,从现在开始 4 个月。
我感到沮丧和失望。
随机地,我遇到了我年轻时的一个老童子军领队,我们聊起了我正在做的事情。我解释了整个实验室的情况,他说:“你知道我在校园里经营一个实验室吧?”我很震惊。我不知道他是做什么的。原来他帮忙经营了一家生物工程系的子公司。我参加了这家公司的面试,最终得到了一份实验室技术员的工作,每小时 12 美元。我很兴奋。每小时 12 美元对我来说是世界上最大的一笔钱。我要继续做科学家!
这家公司叫做 Vaporsens,他们制造了令人难以置信的化学传感器,基本上是为了取代狗的鼻子。他们能嗅出毒品,能嗅出炸弹。他们太不可思议了。公司很小,包括我在内只有 12 名员工。但是他们有一个全职的数据科学家。这位数据科学家解释说,他的工作是创建算法,这些算法接收传感器信号,并将其转换为存在什么化学物质以及存在多少化学物质。听起来很酷也很难。
解释 Vaporsens 技术的视频
我大部分时间都呆在实验室里(想想试管和烧杯)。我制作了传感器,并用它们进行实验。我在帮助回答一些问题,比如,“这个传感器能找到这个炸弹吗?”或者,“这个传感器对这种化学物质有什么反应?”我生成了大量数据供数据科学家查看。这很有趣,也很新鲜,所以我很喜欢。
但是在我开始工作大约两个月后,这位数据科学家辞职了。他在东部找到了一份收入更高的工作。作为一家公司,我们花了接下来的六个月时间试图寻找一名新的数据科学家。它们价格昂贵,需求量大,而且很难找到。
与此同时,我继续进行实验并生成数据。数据越积越多。我们一直在说,“等不及让数据人员看看这个了”。我仍然在修我的核心化学工程课,比如过程、热力学和有机化学。你猜怎么着?我讨厌他们。我对它们没那么感兴趣。在我的脑海里,我一直在想我是否应该换专业,但不确定该换什么。
2016 年末的一天,我厌倦了等待这个新的数据人来拯救我们的数据灾难。我厌倦了生成数据,却得不到洞察力。在这一点上,我已经上过一些编程和数学课,我想,“我可能会想出一些程序来做一些分析。”
所以我打开电脑,在工作的“空闲”时间,在实验间隙,我开始编程。当时我在用 MATLAB,最后我做了一个工具,对数据进行一些自动化分析。我给我老板看了,他很喜欢。他鼓励我继续开发它。我很兴奋,因为这个工具每天为我节省了大约一个小时的工作量。
我花了几个小时阅读复杂的数学课本,看了一个又一个 YouTube 视频,读了我能找到的每一个数据博客。我把每一秒空闲时间都用来学习数据科学和机器学习。
我着迷了,上瘾了,坠入了爱河。
我再也没有回头。三个月后,我停止了实验室工作,专注于 Vaporsens 的数据。
但我仍然没有这个头衔。我是做数据科学的,不是数据科学家。
我想在这里暂停一下,强调一下,学习如何做数据科学真的让我受益匪浅。在 Vaporsens 期间,我学到了大部分关于数据科学的知识。我边走边想。这就是目标,把你的脚放在门里,然后付钱去学习。 不付费学习,付费学习!
我为 Vaporsens 的所有项目做了分析,其中包括一些相当大的组织和名称。大多数项目工作涉及数据自动化、数据清理、数据可视化,当然还有机器学习。我们运行了许多分类算法以及一些回归模型。
我最终在 Vaporsens 做了大约一年半的数据科学,然后停下来与化学工程系的一位教授一起做应用数据科学研究。我们设计了一种算法,帮助工厂知道什么时候出了问题,以及如何修复它。
此时,我的简历上已经有了 Vaporsens 和数据研究。我很幸运,在优化团队的研究部门获得了巨头埃克森美孚公司的实习机会。我在那里度过了 2018 年夏天,处理数据科学问题,并收到了超过六位数的全职报价。我甚至创建了一个算法的原型,最终得到了十亿,是的,十亿美元的评估。
我整个高三都在兴奋地回到埃克森美孚全职工作。但为了支付账单,我回到 Vaporsens 继续领导数据计划。毕业后,我回到埃克森美孚,在那里我花了两年时间为公司解决与数据相关的问题。我做了很多回归分析,研究了一些有趣的供应预测问题,甚至制作了一个仪表板来监控公司的差旅支出。
在全职工作的同时,我利用晚上和周末的时间兼职做数据项目,并获得了佐治亚理工学院在线数据分析的硕士学位。
乔治亚理工学院的在线分析硕士
在埃克森,我不喜欢公司文化,也不喜欢我被分配的项目。当我的客户名单增长到一定程度时,我意识到我可以经营自己的分析公司赚同样多的钱。于是 2021 年初一辞职,开始了雪数据学。
Snow 数据科学徽标
那么,这个故事中的哪些原则帮助我走到了今天?
N **袅一:**编造自己的经历。我不是让你对你以前的经历撒谎。恰恰相反,我是在告诉你自己去创造。不要等待它发生在你身上。如果我不愿意免费工作三个月,我永远不会成为 Vaporsens 的实验室技术员。我没有资格,也没有经验。免费工作 3 个月创造了经验,也让我有了工作机会。我在 Vaporsens 做了同样的事情,我没有资格成为“数据人”,但我用自己的时间和主动性创造了第一个工具,向我的老板证明了我可以交付结果。如果你没有这方面的经验,那就用你自己的时间去做,并建立一些可以证明你的成果的东西。在我们建立投资组合时,这将是本课程的关键。
第二:人脉才是王道。老实说,Vaporsens 甚至没有实验室技术员的职位描述。我刚遇到一个老朋友,他看到了我的热情和技能,认为这可能是一个很好的搭配。我将永远感激他,感激我努力重新联系他。人际关系网将打开你甚至不知道存在的大门。
第三:承担可计算的风险:在我实习的三个月里没有挣到任何钱是有风险的。在 Vaporsens 开发一个我的老板没有要求我做的工具是有风险的。独自出去创业是有风险的。信不信由你,现在我不那么喜欢冒险了。然而,我一生中所冒的大多数风险都以这样或那样的方式解决了。我不认为我们中的许多人在临终前会后悔我们所冒的风险,而是那些我们没有冒的风险困扰着我们。
这就是我的故事,关于我如何成为一名数据科学家以及帮助我成功的三个原则。我知道这三个原则也会对你的数据职业生涯有所帮助。
如果您对您的数据职业或进入该领域有任何问题,您可以随时来我的免费开放办公时间,在那里您可以问我任何您想问的问题。我每周二东部时间晚上 8 点在 LinkedIn/YouTube 上主持他们。更新见https://www.datacareerjumpstart.com/AskAveryRegister。
此外,如果你想要一个更结构化的途径和课程来进入数据科学,你可以看看我在 2021 年秋季推出的名为数据职业快速起步(https://www.datacareerjumpstart.com)的训练营。
另外,如果你想看视频,我制作了一个 YouTube 视频来讲述这个故事。
祝你好运!希望你找到自己的路!
我如何在一周内构建端到端数据科学项目
“让我们谈谈你迄今为止参与的项目”
来源: Unsplash
在不断扩大的数据科学领域,领先和生存的竞争比以往任何时候都更加激烈。世界各地正在进行的尖端项目只会让数据科学家难以跟上。
无论你是在学校为一份出色的简历或个人资料而工作,还是在职业生涯中期或出于兴趣而重塑自我;不管项目的目的是什么,你选择的问题陈述会对项目及其进度产生影响。
在我读研期间,每上一堂新课,我都会兴奋地着手处理新的数据问题陈述,最大的挑战是完成这些项目。在我研究生项目的前两个学期,我会在一个月内确定 36 个项目,开始其中的 12 个,但一个也没完成。
但是,为什么从事数据科学项目如此重要?
如果你现在在学校,你可能正在为你上的每一堂课做一个项目。如果你是一名在职专业人士,你不会担心找工作的困难——为什么要关心数据科学项目呢?
- **你在学校:**你的许多同学会提到你在班上做过的同一个项目,在你意识到这一点之前,已经有 38 份简历看起来像你的
- **POV 你是一名在职的专业人士:**数据科学是不断发展的,因为企业面临的问题也在不断发展,这使得即使是专业人士也必须与数据科学的最新和最棒的技术保持同步(有什么比一个周末一个周末的项目来保持更新更好的呢)
为数据科学项目的重要性设定了前提后,下面是一种方法(经过尝试、测试和成功)来处理数据科学项目,而不会无法完成它们。
1.遵循 3 步流程
- 确定数据利基
数据科学项目可以包括一系列技能,如数据探索、数据可视化、时序预测、Tableau 仪表盘或聚类和分类 - 如果你对一个商业领域充满热情,那么就为这个行业做问题陈述,或者为每个行业创建一个平衡的项目(这在求职时对你的简历特别有用。你可以根据你申请的职位和公司来切换你的项目。从金融、医疗保健、体育、媒体和通信、软件和 IT 服务或其他行业中进行选择
- 设定目标
你想从这个项目中实现什么?
2.确定项目的类型
对我来说,一旦我确定了数据科学生命周期中我想亲自学习的部分和业务领域,我就可以确定我的流程是什么样的:
- 结果已知: 你知道预期的结果,应用什么数据模型
- 分析决定接下来的步骤: 处理随机数据集,执行数据分析,并从数据中揭示隐含的洞察力
其他类型的项目:
- 描述性分析 ( 销售团队希望根据客户、性别、年龄、地域、地区、市场等人口统计数据来查看销售额)
- 预测分析 ( 使用客户人口统计数据,销售团队希望预测店内与网上的购买行为)
- 规定性分析 ( 确定最佳销售和营销策略——什么类型的产品搭配得好,定价和折扣策略,以促进销售)
- 情感分析 ( 可包括客户支持分析或客户反馈分析,以确定客户对产品/品牌的亲和力)
- 检测项目 ( 检测产品销售异常)
- 深度学习或神经网络( 预测下一年 x 种产品在每个不同商店的销售
- 聚类和分类 ( 什么客户最有可能或不太可能购买某个产品 X )
一年前,我将我的项目分为以上几类,并确定了其后的复杂程度。话虽如此,今天进行的项目应该反映你的思维过程,而不是局限于上述任何一种。
3.制定行动计划
现在你已经锁定了我想做的项目类型,我会为接下来的几天做这个项目制定一个行动计划。这让我的生活变得多么轻松,我怎么强调都不为过。
*完全披露:*下面的步骤看起来有点费力,但如果是时候为你的个人资料或 GitHub 记录你的项目,你会感谢我的。
- 收集需求 —哪种代码编辑器最适合(Python、R、Visual Studio),确定您需要的数据源和/或数据集成(API、开发人员权限)
- 预测项目风险 —抛开范围蔓延的行话,预测技能&资源等挑战,业务案例变得过时、延迟或难以获得知识产权(研究供参考)
- 记录假设和约束 —我们生活在不完美的世界中。每个项目都有自己的一套假设、约束和依赖
- 所需工具 —在所需版本(Python 3.0 或以上等)中设置环境。),更新并安装所需的软件包和库
随着时间的推移,我会从在纸上可视化项目开始,并建立一个包含我的目标、要求、预期结果的愿景板,我意识到-数据科学项目最好在工作时受到检查,就像你向高管提交项目提案并遵循既定路径一样。
4.以数据科学项目生命周期发誓
来源:作者
- **设定研究目标:**为需要解决的问题确定目标
- **提出假设:**提出相关问题,并通过分析数据,就你定义的问题提出假设
- **收集和准备数据:**收集和搜集项目所需的数据,修复数据中的不一致,如处理缺失值和高度多重共线性
- 测试假设 —选择重要的变量并构建更有意义的变量来证明你开始的假设(训练和测试机器学习模型)
- 分析您的结果 —评估模型的性能并使用它们进行预测
- 完善假设(如果需要)
- 展示结果 —使用图表、交互式可视化和报告将调查结果传达给合适的渠道
5.记录每天的进展
在每一步之后,你都要回到愿景板上去验证,那里有你成功的时刻。
当你在做项目的时候,记录你的项目也使得在你的技术档案上展示更容易 GitHub 的 READ.me 页面或你的投资组合的项目描述,生活变得容易!
一段时间以前,我按照上面的所有步骤做了一个项目,这就是现在项目描述的样子!该项目链接如下:https://github . com/rashidesai 24/Analyzing-Twitter-Trends-On-新冠肺炎-疫苗接种
你可以像我一样在你的目标计划中做笔记,或者使用项目管理工具,比如 JIRA、阿特拉斯、阿萨纳,或者简单的谷歌文档。
这就是我的博客的结尾。感谢您的阅读!请在评论中让我知道你目前正在从事什么数据科学项目,以及你是否也在遵循你的项目流程!
如果你喜欢阅读这样的故事,并想支持我成为一名作家,可以考虑使用这个链接注册成为一名媒体会员(我可以赚取一小笔佣金,不需要你额外付费!)
数据帐篷快乐!
Rashi 是一名来自芝加哥的数据奇才,他喜欢将数据可视化,并创造富有洞察力的故事来传达商业见解。她是一名全职的医疗保健数据分析师,在周末喝一杯热巧克力,写关于数据的博客……
我如何用 Python 在两个周末构建了一个冠状病毒仪表板
提示:我使用了 Streamlit
我们相信上帝;所有其他人必须带来数据——威廉·爱德华兹·德明
概观
在下面的文章中,我将演示如何使用 Streamlit 创建漂亮的数据 web 应用程序。
Streamlit 是一个 Python 库,用于在没有任何前端语言/框架知识的情况下构建快速 web 应用程序。该项目旨在帮助数据科学从业者轻松展示他们的数据科学项目。
数据
用于构建仪表板的数据来自约翰霍普金斯大学在 Github 上的新冠肺炎知识库。
结构
如上所述,Streamlit 为构建前端应用程序提供了极大的便利。例如,要创建这样的登录页面:
您需要做的就是编写下面这段代码:
所有 Streamlit 应用程序都可以使用本机 CLI 运行。假设您有一个使用 Streamlit 的名为app.py
的脚本。您可以在终端上使用以下命令运行它:
我们可以看到 Streamlit 库有许多内置的方法,可以显示文本、解析标记语言样式和构建 UI 小部件。因此,它能够为您的 web 应用程序无缝地创建布局。
例如,st.radio
方法允许我们创建用于与用户交互的单选按钮。您可以将可供选择的值列表作为参数传递给该方法。
与st.radio
类似,可以使用多种方法在 Streamlit 上创建小部件。其中一些是:
st.button
st.checkbox
st.slider
st.selectbox
请注意,st.sidebar
方法可以用来设计侧边栏,方法与应用程序主体相同。
上传图像
与所有其他功能一样,Streamlit 使用户能够轻松嵌入图像:
为了说明这一点,我在网上找到了一张蒙娜丽莎戴着面具的照片,我把它用在了我的网络应用程序的主页上:
Web 应用主页
显示数据帧
根据文档,st.write
属性是 Streamlit 的“瑞士军刀”,因为它以不同的方式处理不同的对象。
在前面的代码片段中,我们使用了st.write
方法来编写一些文本。这一次,我们将使用它来显示我们的数据。
在这种情况下,该方法为我们查看数据提供了以下漂亮的输出:
显示图表
Streamlit 与 Python 中大多数流行的数据可视化库的互操作性使得显示可视化信息变得非常容易。
例如,使用以下代码行,您可以在 Streamlit 上绘制 Plotly 图形:
和st.plotly_chart
一样,Streamlit 也有通过其他图形库如st.pyplot
、st.altair_chart
、st.vega_lite_chart
、st.bokeh_chart
等创建图表的方法。
因此,您可以看到利用 Streamlit 强大的 API 和构建 web 应用程序来展示您的数据科学项目是多么容易。
在 2021 年,人们不需要知道复杂的前端库来创建 web 应用程序。我怀疑 Streamlit 和其他类似的应用程序在未来几年只会越来越受欢迎。
我希望你喜欢这篇文章!😃下次见。✋
链接:
https://github.com/Sayar1106/covid-dashboard
参考资料:
https://docs.streamlit.io/en/stable/api.html
我如何为 AWS 数据湖构建数据发现 API
这个简单的 FastAPI 服务将帮助您在数据湖中找到数据
照片由 nine koepfer 在 Unsplash | 品牌内容披露上拍摄
阿塔湖提供了无数的好处。它们是数据不可知的,不需要你预先定义一个模式。但是,如果没有合适的结构,找到您需要的数据可能会很困难。在本文中,我们将通过创建一个 FastAPI 抽象来解决这个问题,它允许我们查询 AWS Glue 元数据目录。
目录
为什么 FastAPI 用于数据发现服务?
我们如何开始?
怎么才能把这个翻译成 Python 代码?
实现:FastAPI MVP
如何规模化服务这个 API?
∘AWS lambda
∘API 网关
∘ 让 API 安全可追踪
我们如何监控我们的数据发现服务?
结论
为什么 FastAPI 用于数据发现服务?
如果我们将它实现为一个 Python 包,我们会假设每个人都知道足够多的 Python 来使用它。但是,您的公司可能有其他开发人员(Java、C#、JavaScript、Go 等)需要访问数据湖中的数据。通过为数据发现构建一个 REST-ful 服务,你为每个人提供了一个与编程语言无关的接口。这种 API 优先的方法还有进一步的好处:
- 如果您后来决定为业务用户构建一个 UI ,您的任务将变得容易得多,因为您已经有了一个以 JSON 形式提供数据的 REST API。
- 您可以在一个单一服务中组合用于此目的的所有功能。
- 如果您需要添加新的方法或更改现有的方法,您可以通过创建一个新的 API 版本(比如说,
api_url/v3
)来更容易地部署更改,而不会破坏任何依赖于当前版本的工作负载。 - 您可以扩展功能以包括实时数据流、非结构化数据,并允许查询访问日志以确定哪些数据最常被哪些用户使用。
我们如何开始?
我们可以从列出所有可能对数据发现有用的方法开始:
- 列出所有数据库或模式,
- 列出特定模式的所有表,
- 过滤带有特定前缀或后缀的表名,
- 对表名进行全文搜索(比如,与
orders
或customers
有关的所有表), - 对表注释进行全文搜索(例如,如果我们想找到任何与物流相关的栏目,
- 显示一个完整的表定义 ( 所有列、数据类型和列注释),
- 显示特定表的分区,
- 在特定分区下显示来自 S3 的所有文件,
- 显示带有特定注释的所有列,
- 显示包含特定列名的所有表格,
- 最后,数据发现的最佳方式是查看整个表的前 X 行。
我们如何将这些翻译成 Python 代码呢?
我们有三个选择:要么使用低级别的 AWS SDKs,在 Athena 的information_schema
上进行查询,要么利用awswrangler
。最后,我们可以将它们结合起来,以满足上一节的要求。
#1.要列出所有数据库(即模式)和表格,我们可以使用 awswrangler 包,尤其是模块wr.catalog
。
作者图片
#2.要过滤带有特定前缀或后缀的表名,我们也可以使用wr.catalog.tables
。检索表定义并对这些定义进行全文搜索也是如此:
作者图片
#3.列出特定表的所有分区:
作者图片
#4.显示表格的 DDL:
作者图片
#5.列出 S3 目录路径或者根据文件类型显示具体对象( ex。拼花文件)和最后修改日期:
作者图片
#6.查询列注释找到你需要的数据集:
作者图片
#7.描述雅典娜表定义:
作者图片
#8.搜索特定的列名:
作者图片
上述方法构成了数据发现服务的基本 MVP。它允许查询模式、表、列、列注释(又名数据字典),显示数据预览,以及探索底层文件、目录和分区。
通过利用 AWS X-Ray 和 Lake Formation 等服务,我们可以添加查询使用访问模式的方法,并确定使用最多和最少的数据集。
**补充说明:**如果您不想在每个 API 方法中单独附加您的
boto3_session
,您可以使用:
boto3.setup_default_session(region_name="us-east-1")
实现:FastAPI MVP
这个 MVP 的完整代码可以在 Github 库中找到。我们简单讨论一下其中的一些细节。
在下面的演示中,我们可以看到 Kaggle 的巴西电子商务数据集上应用的所有端点。
上面的截屏演示了我们如何使用这个 API 来发现和查询存储在 S3 数据湖中的电子商务数据。最终用户可以确定他们需要的表或模式。通过深入底层文件,数据科学家和分析师可以在交互式笔记本或他们选择的其他工具中探索这些数据。使用awswrangler
从 S3 读取特定的 parquet、CSV、Excel 或 JSON 文件非常简单:
作者图片
我们如何大规模地提供这个 API?
部署 REST API 有几种选择。如果你已经使用了 AWS,你可能会发现利用专门为构建弹性和可伸缩 API 而构建的无服务器服务很有用: AWS Lambda 和 API Gateway 。
使用名为mangum
的优秀包,将我们的 FastAPI 转换为 Lambda 处理程序就像导入这个包( from mangum import Mangum )并添加一行代码:handler = Mangum(app=app)
一样简单。
将 API 部署到 AWS Lambda 的 docker 文件如下所示:
作者图片
我们在 Python 3.8 中使用官方 Python Lambda 镜像,并且安装所有需要的包。然后,我们复制剩余的 API 代码,并指定将用作容器入口点的 Lambda 处理程序。
最后,我们必须将容器推送到 ECR — AWS 容器注册中心。要复制此演示,请用您的 AWS 帐户 ID 替换123456789
,并调整您的 AWS 地区名称。如果你想知道:dda
是我对data-discovery-api
的缩写。
作者图片
自动气象站λ
容器映像被部署到 ECR。现在,我们需要创建一个λ函数。我们选择容器图像选项,并选择我们的 ECR 图像。
作者图片
由于查询一些表可能比 Lambda 的默认超时三秒更长,我们可以将其延长到三分钟。
作者图片
最后,我们需要附加 IAM 策略来授予我们的 Lambda 函数权限,以便从 AWS Glue、Athena 和 S3 中检索数据(当然,我们应该对生产使用更细粒度的权限)。
作者图片
API 网关
在用我们的容器映像配置了 Lambda 函数之后,我们可以在 API 网关控制台中创建新的 API。我们需要选择 REST API 并指定一个名称。
作者图片
然后,我们可以添加一个方法和资源来配置 Lambda 代理集成。
作者图片
一旦所有这些都设置好了,我们就可以部署 API 并开始服务它了。
为了一步一步地了解它,这里有一个演示 API 网关配置、部署和测试 API 的截屏:
确保 API 的安全性和可追踪性
要了解如何额外配置 API 键来确保 API 安全,请查看我以前的文章。它还展示了如何使用 AWS X-Ray 配置分布式跟踪,以便更好地控制 AWS 上的 FastAPI 服务:
我们如何监控我们的数据发现服务?
想象一下,您在自己的公司部署了一个类似的服务,并且获得了巨大的成功。现在你需要确保它保持健康,可以很容易维护,并且运行没有错误。此时,您可以:
- 手动关注(不推荐),
- 通过使用 AWS CloudWatch 和相关服务,自己构建一个可观察性仪表板,
- 使用观察工具,如 Dashbird 。
每个选项的含义:
- 对于选项 1,你可能会发疯。
- 对于选项#2,您将不得不花费额外的时间来构建 CloudWatch 仪表板,在几个 CloudWatch 日志和多个 AWS 控制台选项卡之间切换,以修复任何潜在的错误。
- 使用选项#3,您只需登录您的 Dashbird 帐户——它会自动扫描所有无服务器资源,并为您提供跟踪 API 和微服务健康状况所需的可视化功能。然后可以随意(强烈推荐!)结合 API Gateway 和 Lambda 资源构建项目仪表盘,失败设置预警。
作者图片
在上图中,我们可以看到 Dashbird 是如何指出 3 秒后超时的任务的(默认 Lambda 超时)。它还揭示了 Lambda 函数何时经历了冷启动,并显示了每个 API 调用的持续时间。
对于 API 网关,我们可以看到平均延迟、API 请求的数量以及我们在 API 初始测试中遇到的不同类型的错误。
作者图片
结论
在本文中,我们研究了如何为数据发现构建 REST-ful 服务。通过利用 Python 库,如 FastAPI、awswrangler、boto3 和 Mangum,我们可以在几个小时而不是几周内构建有用的 API。此外,通过将该服务部署到 API Gateway 和 Lambda,我们可以大规模地提供该 API,而不会遇到运营难题。最后,通过利用 Dashbird ,您可以为您的无服务器资源添加可观察性,而无需安装任何 CloudWatch 代理、提取日志或构建任何仪表板。
感谢您的阅读!如果这篇文章有用, 关注我 看我下一篇帖子。还有,看看相关文章:
我如何使用谷歌健身数据建立自己的健身追踪器
我如何快速构建了一个可以在电子表格中跟踪健身数据的应用程序
照片来自 Unsplash
最近,我在 Fiverr 上签约了一项自由职业任务,为一位瑞士客户从谷歌 Fit API 中提取数据。具体来说,我的任务是检索 3 个关键字段:每天行走的步数、每天消耗的卡路里和行走的距离(以公里为单位),在这篇文章中,我将通过这些步骤来交付这个项目。
关于 Google Fit:
Google Fit 是谷歌自己的服务,用于跟踪你的健康数据。它集成了许多不同类型的手表和健身追踪器,并将您的数据聚集在一个地方。它可以记录你走的步数、体重和心率。它有一个很好的界面,很容易使用。它只能作为移动应用程序使用。
当我浏览 Google Fit API 的文档时,我看到 Google 有关于这个 API 的大量文档和大量代码示例。
API 设置:
以下是如何正确设置应用程序的说明:
启用 API 调用的步骤
此外,虽然 Google 的文档非常详细,但它没有具体说明如何用特定的编程语言调用 API。因为我是在 Google Sheets 中构建我的应用程序,所以我必须使用 JavaScript 来调用和显示数据。
当我在谷歌搜索时,我发现了一篇关于如何使用谷歌 Fit API 的精彩文章,我正在计划如何有效地完成这项任务。像这样详细的博客和教程是我喜欢互联网上的社区的原因。
这个博客叫做“我以为他和你一起来的”,是一个极好的资源——我鼓励你查看这里的链接。文章的作者给出了取回 3 个字段的代码。我需要 3 个不同的领域;具体来说,我需要
(1)每天的步数
(2)每天消耗的卡路里和
(3)以公里为单位的行走距离。代码是在 Google 脚本编辑器中编写的,如下所示:
Google API 的请求正文
需要进一步处理才能在 Google 表单中正确打印响应。最终产品看起来很漂亮:
哒哒!过去 9 天的 API 响应
除了简单的跟踪之外,这些数据的潜在用途:
正如我们所看到的,这是一个非常丰富和有趣的数据源。通过锻炼分析,可以绘制出各种与特定日期何时以及为何达到特定健身参数相关的洞察。
也有可能使用这些数据来创建一个关于健康水平的个人评分系统。一个跑步者可能想要记录每天、每周或每月跑的英里数,并使用这个方便的 API 自动调用 Google Fit。举重运动员可以记录每天锻炼的时间。骑自行车的人可以记录骑行的英里数。
此外,这些数据可以用来记录体重,作为减肥计划的一部分。最终,您需要一个非常具体的用例,希望在 Google sheet 中以表格格式保存这些数据,而不是在 Google Fit 应用程序中。
照片来自 Unsplash
结论:
今天,我们看到与锻炼相关的应用程序激增。然而,正如我在这里展示的那样,利用一点灵感和电子表格中的一些代码创建自己的锻炼数据应用程序是可能的——访问和使用锻炼数据可以帮助建立更健康的人,从而带来更健康的世界。
我如何用 Streamlit 建立一个机器学习平台
从浏览器中修改模型
我已经在工作中使用 Streamlit 几个星期了,我必须说这是一个神奇的工具。将您的 ML 代码作为原型进行运输和部署从未如此简单。
在对这个库进行实验时,我决定用它来创建一个附带项目,从浏览器上玩机器学习模型,这纯粹是出于教育目的,也是为了让机器学习经验较少的人熟悉模型。
在我的笔记本上构思设计的两个晚上后,游乐场诞生了。
作者 Gif
PS:由于我最近开始在 Youtube 上录制一些教程,你可以观看这个视频,了解更多关于我如何构建和部署这个应用的细节*
作者视频
PS*:代码在*Github上有。随意派生、克隆它,在本地运行它或者为你的任何项目重新利用它
*PS * * :app 直播。在这里检查一下https://share.streamlit.io/ahmedbesbes/playground/main/app.py并试用一下。
现在让我们看看这个应用程序是怎么回事😉
什么是游乐场?
Playground 是一个 Streamlit 应用程序,允许您直接从浏览器中修改机器学习模型。
因此,如果你是数据科学从业者,你绝对应该尝试一下😉
这个 app 的灵感来源于伟大的张量流 游乐场 。这里唯一的区别是,它解决了经典的机器学习模型。
它是如何工作的?
使用操场很简单
1 — 🗂️从预定义的列表中选择并配置数据集。您可以设置:
- 样本数量
- 列车上的噪声和测试数据
2— ⚙️您选择一个模型并设置其超参数。你可以从逻辑回归、决策树、随机森林、梯度推进、神经网络、朴素贝叶斯、KNNs 和 SVM 中选择一个模型
3 — 📉该应用程序会自动显示以下结果:
- 训练和测试数据模型的决策边界
- 训练和测试数据的性能指标(准确性和 F1 分数)
- 模型的训练时间
- 基于数据集定义和模型超参数生成 python 脚本以再现模型训练
4 — 对于每种型号,Playground 都提供了一个官方文档的链接以及一个技巧汇编列表
奖励点:该应用还提供了通过添加多项式特征来执行特征工程的能力。这被证明有助于线性模型,如非线性问题的逻辑回归。
你能从游乐场学到什么?
如果你是机器学习的新手,玩这个应用可能会(并且希望😄)让你熟悉基本概念,帮助你建立第一直觉。它不会取代教科书:它只是为了补充你的知识。就这样吧。
1.决策边界将(部分地)告诉你模型是如何运作的
通过检查决策边界,您将对每个模型的工作方式有更多的了解。出于教育目的,playground 将处理仅具有 2 个要素的数据集(但是在降维后,可以在多维数据集上获得相同的结果)
例如,您将看到逻辑回归用一条线(或一般情况下的超平面)分隔数据
线性回归—作者图片
而决策树根据特征值的连续条件对数据进行分类,其决策边界由水平线和垂直线组成。
决策树—作者图片
有趣的是,随机森林是多个决策树的集合,其决策边界看起来与决策树相似,但更平滑:这是随机森林使用的投票机制的结果。
随机森林——作者图片
2.你会感受到每个型号的速度
给定相同的数据集,您可以比较每个模型的速度,并获得哪个更快的感觉。在前面的图中,逻辑回归和决策树分别花费了 0.004 和 0.001 秒进行训练,而随机森林花费了 0.154 秒。
尝试一个神经网络,它有 4 层,每层 100 个神经元:花费 0.253 秒。
神经网络——作者图片
3.特征工程可以有所帮助
在月球数据集上使用逻辑回归不会给你一个完美的 F1 分数,因为它是非线性的。
然而,通过添加多项式特征来增加维度会有所帮助:当使用逻辑回归时,尝试将多项式次数增加到 3,并注意决策边界是如何彻底改变的。
逻辑回归+特征工程—作者图片
4.一些模型比其他模型对噪声更鲁棒
*您可以通过在测试数据上设置更高的噪声来进行实验,**从而使其偏离列车分布。*针对此问题,梯度推进等一些模型比其他模型更稳定。
5.尝试不同的超参数组合
学习和验证你的直觉的一个很好的方法是实验,这就是这个应用程序的目的:它允许你修改一系列超参数(树深度、估计器数量、层数等),并立即看到决策边界、指标以及执行时间的结果。
去试试吧,希望你能从中有所收获!
在本地运行应用程序
要在本地运行这个应用程序,你必须确保你已经用 Python 3 安装了 pip。
- 安装管道
*pip install pipenv*
- 进入项目的文件夹并安装依赖项
*pipenv install*
- 运行应用程序
*streamlit run app.py*
这将打开一个本地服务器,您可以通过 http://localhost:8051 访问该服务器
代码的结构
代码遵循以下结构:
app.py
:启动 app 的主入口点ui.py
一组 UI 函数,用于显示应用程序的不同组件functions.py
:数据处理、模型训练和绘图功能列表models/
:定义每个模型的超参数选择器
请注意,ui.py
和functions.py
位于utils
文件夹内。
如果你想了解代码,推荐看我上面的视频。
感谢阅读!🙏
如果你已经做到了这一步,非常感谢你的阅读!
Playground 是开源的,我希望随着时间的推移它会变得更好。因此,如果你想贡献自己的一份力量,请随时打开一个拉取请求或一个问题,如果你想在应用程序中看到一个功能。
我现在能想到的是:
- 添加其他非线性数据集
- 添加更多型号
- 实施复杂的特征工程(正弦特征,交互项?)
- 实现一个具有降维功能的自定义数据集读取器,这样您就可以检查您的数据
- 添加要素重要性图和模型可解释性
但是如果你有其他的想法,我很乐意听听。
我如何建立一个人工智能文本到艺术的生成器
一篇关于我如何建设 Text2Art.com 的详细、循序渐进的文章
text 2 生成艺术画廊[图片由作者提供]
概观
这篇文章是关于我如何在一周内建造了 Text2Art.com 的。Text2Art 是一个基于 VQGAN+CLIP 的 AI 驱动的艺术生成器,可以仅从文本输入生成各种艺术,如像素艺术、绘图和绘画。文章跟随我的思维过程,从尝试 VQGAN+CLIP,用 Gradio 构建简单的 UI,切换到 FastAPI 为模型服务,最后使用 Firebase 作为队列系统。请随意跳到您感兴趣的部分。
Text2Art 演示(更新:我们现在有 15k+用户)
概述
- 介绍
- 它是如何工作的
- 用 VQGAN+带代码的剪辑生成艺术
- 用 Gradio 制作用户界面
- 用 FastAPI 供应 ML
- 基于 Firebase 的排队系统
简介
不久前,生成艺术和 NFT 风靡全球。这是在 OpenAI 在文本到图像生成方面取得重大进展后才成为可能的。今年早些时候,OpenAI 发布了一款功能强大的文本到图像生成器,效果非常好。为了说明 DALL-E 工作得有多好,这些是 DALL-E 生成的图像,带有文本提示“一个专业的高质量长颈鹿龙奇美拉插图”。模仿龙的长颈鹿。龙做的长颈鹿”。
DALL-E 制作的法师在得到文字提示“一个专业高质量的长颈鹿龙奇美拉插图”时。模仿龙的长颈鹿。龙做的长颈鹿。”[图片由拥有麻省理工学院许可证的 OpenAI 提供]
不幸的是,DALL-E 没有向公众发布。但幸运的是,DALL-E 魔术背后的模型 CLIP 反而出版了。剪辑或对比图像语言预训练是一个结合文本和图像的多模态网络。简而言之,CLIP 能够评估图片与标题的匹配程度,反之亦然。这对于引导生成器生成与文本输入完全匹配的图像非常有用。在 DALL-E 中,CLIP 用于对生成的图像进行排序,输出得分最高的图像(最类似于文本提示)。
片段评分图像和说明的示例[按作者分类的图像]
在 DALL-E 公布后的几个月,一个名为 VQGAN (矢量量化 GAN)的新变形金刚图像生成器发表了。将 VQGAN 与 CLIP 相结合,可获得与 DALL-E 相似的质量。自预先训练的 VQGAN 模型公开以来,社区已经创造了许多令人惊叹的艺术。
多船城市港口夜景画,战争中的难民画。[图片由作者生成]
我真的对结果感到惊讶,并想与我的朋友分享这一点。但由于没有多少人愿意钻研代码来生成艺术,我决定创建 Text2Art.com,一个任何人都可以简单地输入提示并快速生成他们想要的图像而不用看任何代码的网站。
它是如何工作的
那么 VQGAN+CLIP 是如何工作的呢?简而言之,生成器将生成图像,剪辑将测量图像与图像的匹配程度。然后,生成器使用来自剪辑模型的反馈来生成更“准确”的图像。这种迭代将进行多次,直到剪辑分数变得足够高,并且生成的图像与文本匹配。
VQGAN 模型生成图像,而 CLIP 指导这个过程。这是通过多次迭代完成的,直到生成器学会产生更“精确”的图像。【来源: T 何插图 VQGAN 作者:LJ Miranda】
我不会在这里讨论 VQGAN 或 CLIP 的内部工作原理,因为这不是本文的重点。但是如果你想深入了解 VQGAN、CLIP 或 DALL-E,你可以参考我找到的这些令人惊叹的资源。
- LJ Miranda 的插图 VQGAN:用很棒的插图解释 VQGAN。
- Charlie Snell 解释的 DALL-E:从基础开始的伟大 DALL-E 解释
- Yannic kil cher 的回形针讲解视频:回形针讲解
X +剪辑
VQGAN+CLIP 是一个简单的例子,说明了将图像生成器与 CLIP 相结合可以实现的功能。然而,你可以用任何类型的生成器替换 VQGAN,它仍然可以很好地工作,这取决于生成器。X + CLIP 的许多变体已经出现,如 StyleCLIP (StyleGAN + CLIP)、 CLIPDraw (使用矢量艺术生成器)、BigGAN + CLIP 等等。甚至有音频剪辑使用音频而不是图像。
使用 StyleCLIP 编辑图像[Source: StyleCLIP Paper
用 VQGAN+带代码的剪辑生成艺术
我一直在使用 dribnet 的 clipit 资源库中的代码,这使得使用 VQGAN+CLIP 生成艺术变成了简单的几行代码(更新: clipit 已经迁移到了 pixray )。
建议在 Google Colab 上运行,因为 VQGAN+CLIP 需要相当多的 GPU 内存。这里有一本 Colab 笔记本你可以跟着看。
首先,如果你在 Colab 上运行,确保你把运行时类型改成使用 GPU。
将 Colab 运行时类型更改为 GPU 的步骤。[图片由作者提供]
接下来,我们需要首先设置代码库和依赖项。
**from** **IPython.utils** **import** io
**with** io.capture_output() **as** captured:
!git clone https://github.com/openai/CLIP
*# !pip install taming-transformers*
!git clone https://github.com/CompVis/taming-transformers.git
!rm -Rf clipit
!git clone https://github.com/mfrashad/clipit.git
!pip install ftfy regex tqdm omegaconf pytorch-lightning
!pip install kornia
!pip install imageio-ffmpeg
!pip install einops
!pip install torch-optimizer
!pip install easydict
!pip install braceexpand
!pip install git+https://github.com/pvigier/perlin-numpy
*# ClipDraw deps*
!pip install svgwrite
!pip install svgpathtools
!pip install cssutils
!pip install numba
!pip install torch-tools
!pip install visdom
!pip install gradio
!git clone https://github.com/BachiLi/diffvg
%cd diffvg
*# !ls*
!git submodule update --init --recursive
!python setup.py install
%cd ..
!mkdir -p steps
!mkdir -p models
(注:“!”是 google Colab 中的一个特殊命令,这意味着它将在 bash 而不是 python 中运行该命令”)
一旦我们安装了库,我们就可以导入clipit
并运行这几行代码来用 VQGAN+CLIP 生成你的艺术作品。只需随意更改文本提示。此外,您还可以给clipit
一些选项,如迭代次数、宽度、高度、生成器模型、是否要生成视频等等。您可以阅读源代码以获得更多关于可用选项的信息。
使用 VQGAN+CLIP 生成艺术作品的代码
一旦你运行代码,它将生成一个图像。对于每次迭代,生成的图像将更接近文本提示。
基于“水下城市”较长迭代的结果改进。[图片由作者提供]
更长的迭代
如果您想生成一个更长的迭代,只需使用iterations
选项,并将其设置为您想要的长度。例如,如果您希望它运行 500 次迭代。
clipit.add_settings(iterations=500)
生成视频
因为我们无论如何都需要为每次迭代生成图像,所以我们可以保存这些图像,并创建一个关于人工智能如何生成图像的动画。为此,您可以在应用设置之前简单地添加make_video=True
。
clipit.add_settings(make_video=True)
它将生成以下视频。
生成的“水下城市”GIF[图片由作者提供]
自定义图像大小
您也可以通过添加size=(width, height)
选项来修改图像。例如,我们将生成一个分辨率为 800x200 的横幅图像。请注意,更高的分辨率将需要更高的 GPU 内存。
clipit.add_settings(size=(800, 200))
生成 800x200 图片,提示“幻想王国# art station”[图片由作者提供]
生成像素艺术
还有一个在 clipit 中生成像素艺术的选项。它在场景后面使用 CLIPDraw 渲染器,通过一些工程来强制像素艺术风格,例如限制调色板颜色、像素化等。要使用像素艺术选项,只需启用use_pixeldraw=True
选项。
clipit.add_settings(use_pixeldraw=True)
生成的图像带有提示“盔甲骑士#pixelart”(左)和“中国奇幻电子游戏世界#pixelart”(右)[图片由作者提供]
VQGAN+剪辑关键字修改器
由于 CLIP 中的偏差,在提示中添加某些关键字可能会对生成的图像产生一定的效果。例如,在文本提示中添加“虚幻引擎”往往会生成逼真或高清的样式。添加某些网站名称,如“deviantart”、“artstation”或“flickr”,通常会使结果更加美观。我最喜欢的是使用“艺术站”关键字,因为我发现它产生最好的艺术。
关键词对比[ 图片由 kingdomakrillic
此外,您还可以使用关键字来调节艺术风格。例如,关键字“铅笔素描”,“低聚”,甚至艺术家的名字,如“托马思·金凯德”或“詹姆斯格尼”。
Artstyle 关键字比较。[ 图片由 kingdomakrillic 提供
要了解更多关于各种关键词的效果,您可以查看 kingdomakrillic 的完整实验结果,它显示了使用相同 4 个主题的 200 多个关键词的结果。
用 Gradio 构建 UI
我部署 ML 模型的第一个计划是使用 Gradio 。Gradio 是一个 python 库,它将 ML 演示的构建简化为几行代码。使用 Gradio,您可以在不到 10 分钟的时间内构建一个演示。此外,您可以在 Colab 中运行 Gradio,它将使用 Gradio 域生成一个可共享的链接。您可以立即与您的朋友或公众分享此链接,让他们试用您的演示。Gradio 仍然有一些限制,但我发现当你只想演示一个函数时,它是最合适的库。
gradio UI[图片由作者提供]
这是我为 Text2Art 应用程序编写的简单 UI 代码。我认为代码是不言自明的,但是如果你需要更多的解释,你可以阅读 Gradio 文档。
构建 Gradio UI 的代码
一旦你在 Google Colab 或 local 中运行它,它将生成一个可共享的链接,使你的演示可以公开。我发现这非常有用,因为我自己不需要像 Ngrok 一样使用 SSH 隧道来分享我的演示。此外,Gradio 还提供托管服务,您可以永久托管您的演示,每月仅需 7 美元。
Gradio 演示的可共享链接。[图片由作者提供]
然而,Gradio 仅适用于演示单一功能。创建一个带有额外功能的自定义站点,比如图库、登录,甚至只是自定义 CSS,都是相当有限的,或者根本不可能。
我能想到的一个快速解决方案是创建一个独立于 Gradio UI 的演示站点。然后,我可以使用 iframe 元素在站点上嵌入 Gradio UI。我最初尝试了这种方法,但后来意识到一个重要的缺点,我不能个性化任何需要与 ML 应用程序本身交互的部分。例如,输入验证、自定义进度条等功能在 iframe 中是不可能实现的。这是我决定建立一个 API 的时候。
用 FastAPI 服务 ML 模型
我一直使用 FastAPI 而不是 Flask 来快速构建我的 API。主要原因是我发现 FastAPI 写起来更快(代码更少),而且它还自动生成文档(使用 Swagger UI ),允许我用基本 UI 测试 API。另外,FastAPI 支持异步函数,据说比 Flask 更快。
通过在 URL 中添加/docs/来访问 Swagger UI
在 Swagger UI 中测试 API 图片由作者提供]
下面是我编写的代码,它将我的 ML 函数作为 FastAPI 服务器。
API 服务器的代码
一旦我们定义了服务器,我们就可以使用 uvicorn 运行它。此外,因为 Google Colab 只允许通过 Colab 接口访问他们的服务器,所以我们必须使用 Ngrok 向公众公开 FastAPI 服务器。
运行和公开服务器的代码
一旦我们运行了服务器,我们就可以进入 Swagger UI(通过在生成的 ngrok URL 上添加/docs
)并测试 API。
使用 FastAPI Swagger UI 生成“水下城堡”
在测试 API 时,我意识到根据质量和迭代次数的不同,推断可能需要大约 3-20 分钟。对于 HTTP 请求来说,3 分钟本身已经被认为很长了,用户可能不想在站点上等待那么长时间。由于推理时间较长,我认为将推理设置为后台任务并在结果出来后给用户发电子邮件可能更适合这个任务。
既然我们决定了计划,我们首先将编写发送电子邮件的函数。我最初使用 SendGrid 电子邮件 API 来完成这项工作,但在用完免费使用配额(100 封电子邮件/天)后,我改用 Mailgun API,因为它们是 GitHub 学生开发包的一部分,允许学生每月发送 20,000 封电子邮件。
下面是使用 Mailgun API 发送带有图像附件的电子邮件的代码。
使用 Mailgun API 发送电子邮件的代码
接下来,我们将修改我们的服务器代码以使用 FastAPI 中的后台任务,并在后台通过电子邮件发送结果。
有了上面的代码,服务器将很快用“任务在后台处理”消息来回复请求,而不是等待生成过程完成,然后用图像来回复。
一旦该过程完成,服务器将通过电子邮件向用户发送结果。
图像和视频结果通过电子邮件发送给用户。[图片由作者提供]
现在一切似乎都正常了,我建立了前端,并与我的朋友们分享了这个网站。然而,我发现在对多个用户进行测试时存在并发问题。
当第二个用户在第一个任务仍在处理时向服务器发出请求,第二个任务会以某种方式终止当前进程,而不是创建一个并行进程或队列。我不确定这是什么原因造成的,可能是在 clipit 代码中使用了全局变量,也可能不是。我没有花太多时间调试它,因为我意识到我需要实现一个消息队列系统。
在消息队列系统上谷歌搜索了几下后,大多数都推荐 RabbitMQ 或者 Redis。然而,我不确定 RabbitMQ 或 Redis 是否可以安装在 Google Colab 上,因为它似乎需要sudo
的许可。最后,我决定使用 Google Firebase 作为队列系统,因为我想尽快完成这个项目,而 Firebase 是我最熟悉的一个。
基本上,当用户试图在前端生成一个艺术时,它会在一个名为queue
的集合中添加一个条目来描述任务(提示、图像类型、大小等)。另一方面,我们将在 Google Colab 上运行一个脚本,该脚本持续监听queue
集合中的新条目,并逐个处理任务。
处理任务并持续监听队列的后端代码
在前端,我们只需在队列中添加一个新任务。但是确保你已经在你的前端做了一个合适的 Firebase 设置。
db.collection("queue").add({
prompt: prompt,
email: email,
quality: quality,
type: type,
aspect: aspect,
created_at: firebase.firestore.FieldValue.serverTimestamp(),
})
完成了!现在,当用户试图在前端生成 art 时,它会在队列中添加一个新任务。Colab 服务器中的 worker 脚本将逐个处理队列中的任务。
你可以查看 GitHub 回购来查看完整的代码(随意开始回购)。
在前端队列中添加新任务[图片由作者提供]
Firebase 中的队列内容[图片由作者提供]
如果你喜欢我的文章,看看我的其他文章!
也可以在 Linkedin 上和我联系。
https://www.linkedin.com/in/mfathyrashad/
参考
[1]https://openai.com/blog/dall-e/
[3]https://ljvmiranda 921 . github . io/notebook/2021/08/08/clip-vqgan/
https://github.com/orpatashnik/StyleCLIP
[5]https://towards data science . com/understanding-flask-vs-fastapi-we b-framework-Fe 12 bb 58 ee 75
我如何在完全没有机器学习的情况下构建一个图像分类器
实践教程
你并不总是需要先进的 ML/DL 算法来达到 93.75%的准确率
来自 Pexels 的照片
“这个解决方案看起来很有希望,但是让我们回到您的问题上来。部署此解决方案的投资可能有点太高了。”
我很失望。我们都知道那最终意味着什么。
我们怎么会没想到呢?我们过分关注解决方案的准确性和性能,忽略了基础设施成本。
那时,我意识到我需要学习和应用传统的图像处理技术,这些技术不像高级机器学习方法那样需要大量的计算和基础设施成本,但仍能提供可接受的性能水平。
那么我们如何使用传统的图像处理来解决问题呢?我不是计算机视觉专家,但我学到了一些东西,我将与你分享。
作品集项目:昼夜图像分类器
出于显而易见的原因,这与我之前谈到的问题不同,但我们可以说它有些相似。
我们建立了一个简单的分类器,给定一幅图像,它可以正确地识别这是白天还是夜晚的图像。大多数基于现实世界视觉的系统都需要区分白天和黑夜。
将此作为我的项目组合之一后,我不断收到面试官对基本思维过程的积极回应。我相信你会从你的投资组合中受益。
这个项目的数据是从 AMOS 数据集(许多室外场景的存档)中提取的 400 张图像。这些是 RGB 颜色的,包含 200 个白天和晚上的课程——感谢 Udacity 在他们的计算机视觉纳米学位中整合了这个项目。
白天还是晚上?我们来问一下分类器。(像素上的图像像素)
接下来的代码,包括数据集,可以在 GitHub 库中找到。分支存储库将会给你所需要的一切。
我采取了 5 个步骤的方法,对每一步都有清晰的解释。到本文结束时,您将对这个项目所采用的计算机视觉管道有一个深入的了解。
我们开始吧?
步骤 1:加载并可视化数据。
我们在目录中有一组图像。我们的任务是以常规方式加载它和它们的标签,以便它可以用于可视化并在以后构建分类器。
在 Python 中,glob 模块用于检索与指定模式匹配的文件/路径名。使用 matplotlib 的图像模块,我们可以将图像读入内存。
我们需要可视化来更好地理解数据。将相关目录传递给上面的函数将加载数据,使用 matplotlib 的imshow()
函数,我们可以将图像可视化。对数据有一个正确的理解只会对你有所帮助。
# Load training data
IMAGE_LIST = load_dataset(image_dir_training)# Select an image and its label by list index
image_index = 49
selected_image = IMAGE_LIST[image_index][0]plt.imshow(selected_image);
作者图片
- 注意到这些图像之间的任何可测量的差异了吗?这有助于以后分离图像类别。
- 注意到不同的图片有不同的大小了吗?当您想要应用任何图像处理(或深度学习)时,这并不理想。
第二步:数据预处理。
对于各种视觉问题,预处理至关重要。由于拍摄图像时光线水平和其他因素的变化,图像通常不均匀,难以提取特征。
让我们开始基本的预处理工作,比如标准化图像大小和编码图像标签。
代码是不言自明的。我们将所有图像的尺寸调整为标准尺寸(1100,600)。不一定要选择这个形状,但是无论选择哪个形状,都需要在整个项目中保持不变。
大多数分类问题要求我们用数字格式表示目标类。我们可以使用编码来实现这一点——一个简单的一键编码,其中 1 用于白天图像,0 用于夜晚图像。
我们将encode()
和standardize_input()
函数包装成preprocess()
函数,并用它来标准化我们的图像。既然我们已经加载并预处理了我们的图像,我们就可以从图像中提取特征了(管道中有趣的部分!).
第三步:提取特征。
为了从图像中提取特征,我们需要了解图像的一些基本属性。
我们需要提取能够区分白天图像和夜晚图像的特征。当你面临分类挑战时,你可能会问自己:我如何区分这些图像?
我想到的一个特点是,大多数白天的照片都有明亮的蓝天,而且通常更加明亮。在夜间图像中,唯一的光源是一些人造光,背景相对较暗。
我们可以利用这个特性,看看我们是否可以测量它,使它成为一个可以区分阶级的特征。
平均亮度作为一个特征
为了量化图像的平均亮度,我们首先需要了解**色彩空间。**第一次听说这个概念的时候,我很迷茫,所以请慢一点,更用心的看完这个。
将图像视为数字网格是许多图像处理技术的基础。图像中的每个像素只是一个数值,我们也可以改变这些像素值。这些像素只有一种颜色,由颜色空间表示。
最常见的色彩空间是 RGB ,代表红色、绿色和蓝色三个通道。因此,图像中的每个像素都可以用 RGB 颜色空间中的这 3 个数字来表示。但是也有其他有用的颜色空间。
例如,另一个颜色空间是HSV——代表色调、饱和度和值。这三个分量随着图像各种事物而变化:
- 色调在阴影下甚至高亮度下保持一致。
- 值在不同的光照条件下变化最大。
- 饱和度描述特定颜色的灰色量。
有了这些信息,我们现在可以回去推导平均亮度。怎么会?以下是我们将遵循的步骤。
- 将图像转换到 HSV 颜色空间(正如我们上面解释的,值通道是亮度的近似值)
- 将值通道中所有像素的值相加
- 将亮度总和除以图像面积,图像面积就是宽度乘以高度。
这给了我们一个值:图像的平均亮度。这是一个可测量的值,可以用作手头分类问题的一个特征。让我们在一个函数中实现这些步骤。
我们可以创建更多的特性,但是对于这个例子,让我们保持简单。现在我们有了一个特性,我迫不及待地想和你一起构建分类器。
步骤 4:构建分类器。
我们已经如此习惯于先进的机器学习算法;我们忘记了分类器的主要功能。就是把两个班分开。我们定义了一个特征,我们需要一种基于该特征来分离图像的方法。
分类器可以像条件语句一样简单,它检查平均亮度是否高于某个阈值(T17),然后将该图像标记为 1(白天),如果不是,则标记为 0(夜晚)。
让我们实现这个功能,好吗?
不过,有一个问题,什么是可接受的阈值?通常我们寻求领域专家的建议来理解这些值,但是这里因为我们有足够的训练图像,我们可以用它们来估计一个。
我们的下一个任务是调整阈值,理想情况下在 0–255 的中间。我尝试了不同的值,并用各种训练图像进行检查,看看我是否正确地对图像进行了分类。最终,我勉强接受了 99。
现在我们已经建立了一个分类器,让我们看看如何评估模型?
步骤 5:评估分类器。
每个模型都需要根据看不见的数据进行评估。还记得我们为测试保留的数据吗?我们需要通过分类运行测试图像,并评估模型的准确性。
为了找到模型的准确性,我们需要找到错误分类图像的数量。这样做相当简单。我们编写了一个函数,它获取带有真实标签和阈值的图像,使用分类器预测标签,并将其与实际标签进行比较。
既然我们已经编写了函数,我们需要确保测试图像的预处理方式与训练图像相同。
你知道我得到的最终精度值吗?**惊人的 93.75%!**根据您之前选择的阈值,该值可能会波动,因此可以随意调整参数并进行试验。
对此的改进是从图像中创建更多的特征,并将它们添加到分类器中,以进行更鲁棒的分类。
现在我知道这是一个小得多的数据集的简单问题;然而,这表明我们仍然可以在不使用昂贵的高级机器学习算法的情况下解决计算机视觉问题。有时传统的图像处理是你所需要的。
最后的想法
我们在计算机视觉管道中寻找日夜分类器的投资组合项目。我们在整个流程中使用了一步一步的方法来构建这个分类器。
- 加载和可视化数据
- 数据预处理
- 提取特征
- 构建分类器
- 评估分类器
我们在整篇文章中实现了代码,编译后的版本可以在 GitHub 库中的获得。
感谢您一直关注这篇文章;如果你有任何问题或反馈,欢迎在 LinkedIn 上打招呼。
该项目的重点是展示传统方法的价值,并认识到先进的机器学习并不总是可行的。
这是对我们自己的现实检查,我们倾向于采用高级机器学习方法,因为它通常会带来更高的性能,但往往是以昂贵的计算能力为代价的。
现在,我探索各种方法,并在开发产品之前评估可解释性、基础设施、性能和成本之间的权衡。
从那以后我再也没有听到过客户说不。
想了解更多关于进入数据科学、有趣的合作和指导的有用见解,请考虑 加入我的电子邮件好友私人列表 。
我如何在 AWS 上为 Apache Airflow 中的数据管道构建 CI/CD
现代数据工程需要自动化部署流程
A pache Airflow 是构建数据工程工作负载的常用平台。部署气流的方式如此之多,以至于很难提供一个简单的答案来说明如何建立一个持续的部署过程。在本文中,我们将重点关注作为“DAG 存储”的 S3,并演示一种实现健壮的 CI/CD 管道的简单方法。
目录
在 AWS 上创建 Apache Airflow 环境
Git 存储库
为数据管道构建简单的 CI/CD
在 Airflow 中测试数据管道的 CI/CD 流程
我们如何让 CI/CD 管道在生产中更加健壮?
Buddy 如何处理代码的变更?
数据管道自动化部署流程的优势
如果您使用不同于 Apache Airflow 的工作流编排解决方案会怎样?
结论
演示:在 AWS 上创建 Apache 气流环境
自 2020 年 12 月起,AWS 为阿帕奇气流提供名为 MWAA 的全面托管服务。在本演示中,我们将构建一个 MWAA 环境和一个持续交付流程来部署数据管道。如果您想了解更多关于 AWS 上的托管 Apache 气流的信息,请阅读下面的文章:
我们从在 AWS 管理控制台中创建一个气流环境开始。整个过程是自动化的,你只需要点击一个按钮来部署一个 CloudFormation 堆栈,它将创建一个 VPC 和所有相关的组件,然后填充一些关于你想要构建的实际环境的细节。环境类,工人节点的最大数量)。
在自动气象站上配置 MWAA 气流环境—图片由作者提供
一旦创建了环境,我们就可以通过构建一个连续的交付流程来开始部署我们的数据管道,该流程会自动将 Dag 推送到适当的 S3 位置。
Git 储存库
对于这个演示,我们将使用一个简单的设置,它将只包括开发和主分支。这样,在推送到dev
分支时,我们可以自动部署到我们的 AWS 开发环境。
演示 Git 存储库—作者图片
为数据管道构建简单的 CI/CD
要在短短五分钟内构建一个 CD 进程,我们将使用 Buddy 。如果你想试试,自由层允许最多五个项目。
#1.创建一个新项目并选择您的 Git 托管提供商。对我们来说,是 Github:
在 Buddy 中构建 CI/CD 管道—作者图片
#2.添加一条新管道。这表明在同一个项目中可以有几个管道。例如,您可以有一个部署到开发(dev) 的管道,一个部署到用户验收测试(uat) 的管道,以及一个部署到生产(prod) 环境的管道。
在 Buddy 中建立 CI/CD 管道—图片由作者提供
#3.配置时管道应触发。对于这个演示,我们希望代码在每个推到dev
分支时被部署到 S3。
在好友中构建 CI/CD 管道—图片由作者提供
#4.新增一个动作。在这里,我们可以为部署流程添加所有构建阶段。对于这个演示,我们只需要一个将代码上传到 S3 桶的过程,但是你可以从各种动作中选择来包含额外的单元和集成测试等等。现在,我们选择动作*“将文件传输到 Amazon S3 bucket”*,并配置从 Git 文件夹dags
对 Python 文件的任何更改都应该触发到我们选择的 S3 bucket 的部署。
配置“操作”将代码上传到 S3 —图片由作者提供
#5.配置附加的**“选项”**以确保正确的文件类型将被上传到正确的 S3 子文件夹。对于此演示,我们希望我们的 DAG 文件将部署到文件夹dags
中,如下所示:
S3 位置—作者图片
通过使用相同的动作,转到右侧的**“选项”**选项卡,在 S3 上配置远程路径:
在 Buddy 中构建 CI/CD 管道—图片由作者提供
选择适当的 S3 路径后,我们可以测试并保存动作。
可选地,我们可以指定忽略特定的文件类型。例如,我们可能想要排除单元测试( test* )和文档降价文件( *)。md ):
在 Buddy 中建立 CI/CD 管道—图片由作者提供
#6.这一步是可选的,但是如果在部署过程中出现问题,通知是很有用的。我们可以配置几个动作,如果 CI/CD 管道出现问题,就会触发这些动作。
在好友中建立 CI/CD 管道—图片由作者提供
我们选择在行动失败时通过电子邮件获得通知:
在好友中发送失败通知——图片由作者提供
在气流中测试数据管道的 CI/CD 过程
我们现在准备将一个示例数据管道推到我们的环境中。我们可以看到,最初,我们没有 Dag。
气流 image 图片作者
我们现在将两个新文件推送到dev
分支——其中一个是 DAG 文件,另一个是应当排除的 markdown 文件。
测试 CI/CD 管道的初始推送—图片由作者提供
因为我们是分别提交和推送的,所以我们可以看到,每次 Git 推送都会触发一次管道:
在好友中触发的 CI/CD 管道—图片由作者提供
我们可以确认只有 Python 文件被推送到 S3:
AWS 上气流数据管道的 CI/CD 管道—图片由作者提供
AWS 上的 MWAA 气流环境自动选择了来自 S3 的 DAG:
AWS 上气流数据管道的 CI/CD 管道—图片由作者提供
我们的演示到此结束。
我们如何让 CI/CD 渠道在生产中变得更加强大?
如果您想在您的管道中包含一个额外的批准步骤,您可以在代码被推送到 S3 之前,在 Buddy 中添加一个相应的**“等待批准”**动作。为了更方便,我们还可以添加一个动作给负责生产环境的高级开发人员发送一封关于构建过程的电子邮件。然后,代码只有在事先批准后才能部署。
添加两个附加操作来通知构建过程,并添加手动批准步骤—按作者分类的图像
Buddy 如何处理代码的更改?
你可能会问:Buddy 是如何处理代码变更的?每次我们对存储库进行任何更改时,它会重新上传您的所有 Dag 吗?答案是否定的。初始 CI/CD 管道的执行将从指定的存储库路径上传所有文件。然而,每个后续的执行都使用**“git diff”**来创建变更集。基于diff
,在 S3 中只有被添加、修改或删除的文件才会被更改。
删除是一个特例,Buddy 允许我们配置在 Git 中删除一个文件是否也应该删除远程服务器(S3)上的代码。对于这个演示,我们选择删除文件,以确保所有东西(包括 Dag的删除)都通过 Git。但是您可以根据自己的意愿自由配置它。
如何处理 Git 存储库中删除的文件——作者图片
数据管道自动化部署流程的优势
由于 Apache Airflow 在撰写本文时不提供 DAG 版本控制,这种 CI/CD 管道方法允许您通过 Git 提交历史记录跟踪对 DAG 所做的任何更改。此外,您还获得了一个标准化的、可重复的流程,该流程消除了手动部署中的人为错误,并确保除非在您的 Git 存储库中进行了版本控制,否则不会部署任何东西。
如果您使用不同于 Apache Airflow 的工作流编排解决方案会怎样?
如果您喜欢使用开源工作流编排工具而不是 Airflow,您也可以使用 Buddy 来管理这些数据管道的构建过程。例如,Prefect 或 Dagster 都利用 GraphQL 并支持容器化环境,这使得自动化数据工程工作负载的部署变得简单。
结论
本文研究了如何在 Apache Airflow 中为数据管道构建 CI/CD 流程。现代数据工程需要自动化部署流程。始终使用版本控制系统来管理您的代码并基于您的 Git 工作流自动化构建过程是一个很好的实践。
感谢您的阅读!如果这篇文章有用, 关注我 看我下一篇帖子。
我如何构建我的 ML 工作站🔬
关于构建定制 ML 工作站的完整故事。从零件挑选到软件安装和使用。
我试图打开工作站部件
Kaggle 内核和 Google Colab 都很棒。
如果这篇文章不是关于构建一个定制的 ML 工作站,我会在这里放下话筒。
总有一些“但是”让我们的生活更加艰难。当你开始处理接近现实生活的问题时,你会看到数百亿字节的大型数据集,你的直觉开始告诉你,你的 CPU 或 AMD GPU 设备不足以做有意义的事情。我就是这样来到这里的。
我正在参加 Kaggle 上的人类蛋白质图谱(HPA)——单细胞分类比赛。HPA 数据集包含近 150Gb 的 8 位 4 通道蛋白质图像。数据集的 16 位变体可容纳 350Gb。
以下是我手头的资料:
- MacBook Pro 2019(英特尔酷睿 i9 和英特尔 UHD 显卡 630 1536MB 和 16GB DDR4)
- Kaggle 内核每周约 30 小时 GPU 和/或约 30 小时 TPU 时间
听起来不错。我认为我将能够在本地制作原型,然后在云 GPU 上执行笔记本。什么会出错?
没有 GPU 的生活
事实证明,在提到的工作流程中有很多摩擦。
首先,我的解决方案源代码很快就变成了一个拥有大量源代码和依赖项的完整项目。我使用诗歌作为包管理器,并决定每当我对项目进行有意义的更改时生成一个可安装的包,以便在云中测试它们。我把这些可安装的包上传到一个私有的 Kaggle 数据集,这个数据集又被安装到一个笔记本上。笔记本正在调用包中的类和函数。
这种方法原来有水下石头。Kaggle 笔记本安装项目包后随机抛出怪异错误。我认为这与依赖版本不匹配有关,我发现了类似“在包 Y 中找不到方法 X”等错误。自动加载没有帮助。连续几个早晨,我开始了一天的工作,处理新的和新的突然出现的神秘问题。
在比赛期间,我从 Keras 转到 PyTorch。PyTorch 在 CPU 上比 TensorFlow 或者 Keras 慢很多。甚至对我最近的更改进行开发运行都非常耗时。然而,PyTorch 在学术和其他 ML 相关的社区中有突出的支持,这意味着一堆(几乎)最新技术的阅读使用范例。
此外,当你在云中运行你的代码时,你不能轻易试验。你必须计划好你要试验的东西,并事先让这些地方变得可配置。
总而言之,这次经历令人沮丧。我清楚地意识到,如果我想做更复杂的深度学习实验和项目,那么我只需要全天候访问任何类型的 GPU。
调查
我从未对定制 PC、硬件或游戏感兴趣。所以我花了一段时间才明白我做一台定制机花了多少钱。
有很多关于构建游戏电脑的资源。虽然构建深度学习工作站听起来像是一项类似的任务,但为了构建一台具有成本效益和 ML 兼容性的机器,应该考虑一些细微差别。
我发现了一些有用的博客帖子,它们帮助我迅速掌握了这个话题。特别是,我可以强调来自 Tim Dettmers 的两个帖子:
在他的博客中,Tim 详细解释了 ML 工作站的每个 PC 部件的重要性,并提供了选择它们的一般建议。在这里,我将提到对我有帮助的信息以及 Tim 没有关注的细节。
此外, PCPartsPicker 的 Builder 在规划 PC 期间非常有用。它建议了可能的组件兼容性以及在订购列表之前需要检查的内容。这有助于克服我一直以来的恐惧,我可能会买一些不能一起工作的东西。
ML 构建的零件
在构建深度学习机器(或任何定制 PC)时,有 8 个部分应该考虑:
以下是一个概述:
国家政治保卫局。参见 OGPU
GPU 是任何 ML 工作站的关键组件。它被设计成并行地对大块数据(吞吐量优化)执行计算,这使得它非常适合真正需要的模型训练或推理(细节在此)。
首先要考虑的是,我们只需要 NVIDIA 显卡用于深度学习。不幸的是,ML 框架世界存在垄断。大多数流行的和生产就绪的框架(TensorFlow、PyTorch、Keras)都是为支持 CUDA 的设备设计和优化的。CUDA 是 NVIDIA 拥有的用于并行计算的专有平台和 API 集。这就是我们在 ML 环境中谈论 GPU 时使用“CUDA 卡”的原因。
稍微深入一点简化的 CUDA 架构是有意义的。现代 GPU 基于张量核**,能够在一次运算中乘以 4x4 矩阵,速度极快。尽管如此,张量核需要数据来进行计算。为了有效地加载数据,数据通过以下方式传递:**
- 从 RAM 到全局 GPU 内存。CPU 线程将预处理批处理加载到完全独立的 GPU 设备内存中(不要与 PC RAM 混淆)。设备内存是 GPU 中最慢的一种内存。
- 从全局 GPU 内存到共享内存。共享内存比全局 GPU 内存快10-50 倍,但它也小得多(通常是数百 kb)。这种内存完全可用于流多处理器(SM ),它是 GPU 架构中 CPU 内核的模拟。数据存储在所谓的瓦片中。
- 从共享内存到张量核心注册表。流式多处理器并行操作其张量核,并将部分切片上传到张量核注册表中。
因此,数据加载流程中的任何瓶颈都将导致张量核的次优利用,无论您的 GPU 中有多少个张量核。
CUDA 硬件架构(来源,附图片作者权限)
也就是说,这些大致是对 ML 任务重要的主要 GPU 特性:
- 全局 GPU 内存 —定义在训练期间可以使用的批量大小,或者在计算机视觉方面可以使用的样本质量
- 内存带宽 —设备内部传输数据的速率
- 建筑 —越新的建筑越好。较新的架构在共享内存大小、功能集(如混合精度计算)方面可能更好,在每有效计算瓦特数指标方面可能更高效。
此外,您应该考虑这些因素:
- 单位成本性能
- GPU 散热
- GPU 瓦数
谢天谢地,你可以在 Tim 的文章中找到更多的信息。
母板
主板集成了大多数组件,还提供:
- 大多数 I/O 端口(如 USB、以太网等)
- 带 BIOS 的芯片组
- WiFi、蓝牙适配器
主板提供其他接口为你的东西供电。其中,最重要的一个是 CPU 插座。主板分为不可互换的 AMD 和 Intel 兼容插座。因此,你需要确保你选择的 CPU 与你的主板兼容。
PCI 端口的数量是另一个需要考虑的事情。由于 PCI 端口用于连接 GPU,因此您需要提前规划您的构建和升级空间(例如,为了能够在将来添加更多的卡)。另外,请注意,图形卡实际上占用了不止一个插槽的空间。我们希望卡之间有尽可能多的空间,以便更好的空气冷却。
此外,我很肯定你会很高兴有内置的 WiFi 适配器。否则,连接 PC 的唯一方法是通过以太网电缆,这并不总是很方便(或者只需购买外部适配器)。
中央处理器
CPU 是 GPU 的“左右手”。在 ML 版本中,CPU 用于:
- 预处理数据集
- 将批次载入 RAM
- 将批处理从 RAM 传输到 GPU 全局内存
- 运行 GPU 设备中的功能
所以 CPU 频率高其实没什么帮助。尽管如此,能够有效地并行执行小任务还是很重要的。换句话说,线程和内核的数量是 ML 机器的重要属性。
随机存取存储
说到 RAM,内存容量才是最重要的。如果有足够的内存来运行模型训练而不退回到交换**,那就完美了。更大的容量将允许运行更大批量的数据和执行更多的数据加载器,以减少 GPU 的等待时间。**
RAM 在数据处理和特征工程中也很有帮助。因此,内存越大,对你越好。
储存;储备
在深度学习中,存储用于持久化数据集**。因为现在数据集是以千兆字节来衡量的,所以至少有几兆字节的空闲磁盘空间是很好的。一般来说,人们安装 SSD 是为了满足操作系统的需求和当前正在使用的数据集。硬盘仍然很有帮助,因为它比固态硬盘便宜,而且更容易负担存储其他数据集的 TB 空间。**
在固态硬盘中,你可以在市场上找到使用更快连接协议的 NVMe 固态硬盘。如果你买得起的话,我更喜欢这种固态硬盘。
电力系统单元
PSU 让你的电脑充满活力。为了选择你的 PSU,你需要计算你的产品的瓦数消耗。通常有两个最耗电的组件: CPU 和 GPU。如果您将它们的功耗相加,并在此基础上再加上 10–15%的功耗(对于其他组件、超频等),您将大致估算出您的功耗需求。我还使用 PCPartpicker Builder 来估算我的电脑功率。
除此之外,您应该考虑 PSU 提供的插槽和连接器的数量。
这是你可以提前计划的地方。考虑到功耗和连接器,只需包括您将来想要购买的潜在 GPU。
冷却
随着巨大的能量而来的是巨大的冷却责任需求。
通常,你需要一个空气冷却系统。确保 GPU 之间有足够的空间是一个很好的冷却系统的无开销方法。它在 1–2 个 GPU 设置中特别好。水冷是 3+GPU 设置的好选择。
CPU 可能会很快变热。所以它们通常和基本的冷却器一起出售。如果你能在热凝胶安装过程中避免大量气泡,这就足够了。如果你想换一个更好的冷却器,确保新的冷却器支持你的 CPU 插座。
电脑机箱
计算机机箱保护所有组件免受外部环境的影响。此外,它还可以提供:
- 附加系统冷却器
- 附加 I/O 端口 (USB、C 型等)
- 电缆管理
- GPU 垂直插槽
- 【SATA 磁盘插槽
- 很酷的设计和外观(嗯,这可能很重要)
最重要的考虑之一是容纳所有冷却系统和 GPU 的能力。如果你的案子太小,可能会有问题。
我的零件清单
创建多 GPU 集群不在我的列表中。然而,我仍然希望有改进的空间。因此,我从 Tim 的模板中选择了2-GPU 准系统作为我的工作站的基础,并对其进行了一些调整,以匹配我在当地市场上可以找到的东西。这是我最后的组件列表:
- GPU: 千兆 GeForce RTX 3070 8Gb Aorus Master
- 数学板: MSI x470 游戏升级版
- CPU: AMD 锐龙 5 3600
- RAM: G.Skill Ripjaws V 系列 32Gb (2 x 16Gb)
- 存储:三星 970 Evo 500 GB m . 2–2280 NVME
- 散热:酷派大师 Hyper 212 黑色版
- PSU: EVGA G2 750W 80+金
- 电脑机箱: NZXT H510
- 无线适配器: TP-Link 阿彻 T2U Plus
相同的列表可以在 PCPartsPicker 上找到。
关于我的列表与原始准系统相比的一些不同之处。根据 Reddit 用户的建议,我更换了准系统的 PSU 和冷却器,他们说改变的部分更现代。
还有,我只能买到 750W 版本的 EVGA G2。我估计的瓦数是 420W,所以 650W 的版本应该够用了。然而,更强大的 PSU 在进一步的部件更新方面提供了更大的灵活性。
GPU 的情况要复杂得多。这是 GPU 短缺的开始(2020 年底-2021 年初),GPU 价格飙升了两倍甚至三倍。在这段时间里,比特币跃升至近 6 万美元,以及影响供应链和增加 GPU 需求的其他因素(主要是全球新冠肺炎锁定)。
GPU 价格动态:2020 年底-2021 年初。狂野时光(图片作者
我已经密切关注价格更新 3 个月了。情况并没有真正改变。我在等的时候情况变得更糟了。
考虑到蒂姆的建议和疯狂的 GPU 价格,我拍摄 RTX 3070。RTX 2080 Ti 也非常适合,但市场很快就卖完了。
原来有很多厂商生产 RTX 3070 卡。
基本上,主要区别在于:
- 马克斯·鲍威尔极限 —影响 GPU 性能。
- 卡冷却系统的质量 —冷却卡并长时间保持性能的能力。
- 风扇噪音(Fan Noise)——运行有噪音的卡很烦人(尤其是当你在一个有其他人工作或生活的地方工作时)。
硬件安装
我花了几周时间收集所有零件。
电脑零件到了。我想我可以用这些盒子建一座新房子。请继续关注更多更新(作者的图片)
在拆箱之前,请记住以下几点:
- 您需要释放手上的静电**。静电会损坏您的组件,尤其是您的主板。幸运的是,这很容易做到。你需要定期触摸任何金属物体,如电脑机箱、加热器或文件柜。如果你觉得偏执,有专用腕带给你。**
- 安装或连接组件时要小心。零件和电缆设计为易于连接。如果你发现自己按得太多**,这很可能是一个信号,让你重新审视你试图连接的东西以及如何连接。例外发生了,因为你可能会买一些从来没有联系过的新东西。**
现在是我们动手的时候了!
母板
主板是一个核心组件。于是我开始从中拆箱。
主板拆箱(作者图片)
它有许多端口,我们将在本节中进一步使用。
主板。详细视图(作者图片)
安装组件时,MoBo 指令很有用。一定要看一看!
中央处理器
现在让我们打开 CPU。CPU 盒包含一个 CPU 芯片本身和一个基本的 CPU 冷却器,它实际上占据了盒子中的大部分空间。
CPU 拆箱(作者图片
我们将把中央处理器安装到移动电话上的专用中央处理器插座上。它在我的设置中有 AM4 格式。
CPU 插座(图片作者
对 CPU 管脚要超级小心。它们非常有形。请注意,其中一个边上还有一个金色的小箭头。
CPU 引脚(图片作者
它可以指导你如何连接你的 CPU。只有一种方法可以将引脚安装到插座中。当金色箭头带状边缘位于 CPU 固定板的左下角时。****
向下向外推动固定拉杆,松开 CPU 固定板,并按上述方式放置 CPU。
已安装的 CPU ( 图片作者)
将固定拉杆推回,牢固安装 CPU 芯片。
(同 solid-statedisk)固态(磁)盘
NVMe 固态硬盘比它们的 SATA 朋友小得多。它只是一个放在盒子里的小飞机。
M.2 SSD 拆箱(图片作者)
要连接这种固态硬盘,需要使用 M.2 插座。我的 MoBo 有两个。每个都配有一对螺钉和一个安装螺钉。MoBo 有几个不同长度的固态硬盘安装柱。
NVMe 固态硬盘安装。M.2 螺丝(图片由作者提供)
只需选择一个与您的 SSD 大小相对应的安装柱,在那里安装一个安装螺钉,并用剩余的螺钉固定 SSD。
随机存取存储
RAM 板也很容易安装。
RAM 拆箱(作者图片)
解锁你的 RAM 插槽,并对齐你的 RAM 板与插槽。有也只有一种方法可以牢固地安装木板。
RAM 安装(图片作者
请注意,您的 MoBo 指令可能会为不同数量的 ram 指定推荐位置。遵循这些建议!
冷却器
人们建议在安装冷却系统之前,避免给 CPU 通电**。CPU 可能会过热或变弱。**
我的冷却器设计用于英特尔和 AMD 处理器。因此,冷却器盒实际上包含更多的螺钉和其他细节,比我在这个特定的建设需要。这就是为什么它的背板有如此怪异的形状。
冷却器拆箱(作者图片
安装冷却器的第一步是卸载库存背板。
卸载库存 CPU 背板(图片作者
这个背板将被另一个随您定制的冷却器一起提供的背板所取代。在我的情况下,我必须以 AMD 兼容的方式组装背板。
冷却器背板(图片作者)
翻转主板,将新背板上的螺钉与主板匹配。
安装冷却器背板(图片由作者提供)
为了最终完成背板安装,您需要安装安装螺钉,实际的冷却系统将连接在这些螺钉上。
接下来,你可以组装冷却系统。它通常需要连接较冷的腿,并将其拧紧到背板上。组装后,尝试匹配您的安装螺钉,以确保您的冷却器腿安装正确。
在安装冷却器之前,最后一步是安装散热膏。我使用了下面视频中解释的“撒尿”方法。
当使用热凝胶时,您需要尽可能地覆盖 CPU 芯片区域,以便更好地去除 CPU 热量。在这个过程中可能出现的气泡会造成伤害。
最后,你可以把你的冷却器安装在 CPU 的顶部。按下 CPU 一点,以分配你的热凝胶在表面上。
此外,请确保凝胶停留在 CPU 上,因为它可能会损坏您的 MoBo。
最后,您可以将冷却器电源线连接到 MoBo 上标记为 CPU_FAN 的最近端口。
PSU 和电脑机箱
PSU 盒包括电源单元模块和各种电缆。
电源拆箱(图片作者
电脑机箱只是一个金属盒子,在盒子的相对两侧有两个可移动的面板。
没有玻璃面板的电脑机箱(图片作者
在盒子的顶部,您可以看到盒子的前面板。你可以有更多的端口和电源按钮。
电脑机箱前面板(图片作者
首先,将主板附带的主 I/O 端口盖安装到电脑机箱中。令人惊讶的是,重要的是要确保盖子侧面的所有小插销都完全安装好,并在翻盖上可见。否则,他们可能会阻止你拧紧你的主板。
I/O 端口盖顶部的三个小金属闩锁。你应该在所有的边上都可以看到它们(作者的图片)
主 I/O 端口(图片由作者提供)
然后,您可以尝试将主板拧紧到机箱安装位置。
接下来,您需要连接三根电缆来为系统供电:
- 主板电源线
- CPU 电源线
- 前面板电源线
如何连接 CPU 和主板电源线非常简单。但是,第一次连接前面板电缆可能会有挑战性。下面的视频对我很有帮助:
如何将前面板电源接入 JFP 端口?
可能还有一些剩余的电缆可以连接到 MoBo。在我的情况下,我有 USB,音频和 C 型电源线。前两个我可以连接,而最后一个需要一个适配器,因为我的 MoBo 没有 C 型端口。所以我把它断开了。对了,PCPartsPicker 可以提前警告你这样的问题。
主板安装到电脑机箱中(图片由作者)
此外,您可能需要连接电脑机箱附带的冷却器。
此时,你可以试着给你的电脑加电,但是在你安装显卡之前,你将得不到视频信号。
国家政治保卫局。参见 OGPU
GPU 盒子包括一个卡本身和一个指令。
RTX 3070 显卡(图片作者)
我的 GPU 有两个插槽,所以我需要匹配输出盖,用实际的 GPU I/O 端口替换它们。
电脑机箱上的显卡盖(图片作者)
GPU 端口是 HDMIs 和 DPs,带有 mocks 以保护它们免受灰尘的影响。在 I/O 钢板的左侧,您可以看到两个有助于安装显卡的齿。
确保使用其中一个端口连接您的显示器**。主板上的 HDMI 端口可能无法正常工作。**
显卡上的端口(作者图片)
电脑机箱有专门的插槽来安装这些牙齿。如果您发现您的 GPU 齿无法安装**,您很可能遇到了主板安装的一些问题。尝试重新安装主板以匹配插槽。**
图形卡齿已安装(图片由作者提供)
技嘉 Aorus Master RTX 3070 需要两根 VGA 电缆来供电。确保电缆末端牢固地安装在 GPU 和 PSU 中。否则主板可能找不到 GPU。
显卡通电(图片作者)
硬件故障排除
如果你把你的第一台定制电脑组装起来,很有可能第一次尝试就不成功。在我的情况下,工作站根本就没有打开。在将零件退回给供应商之前,您需要仔细检查几件事情:
- 前面板电源连接正确。回到前面板电源线安装并再次检查是否安装正确。例如,这就是为什么我的电脑不能工作的原因。
- 闸板杆安全就位。尝试重新安装您的内存棒。RAM 端口机制应该锁定它们。
- 电源电缆连接牢固。确保您的电源线两端完全连接。我对此也有一些问题。每个连接器都有一个塑料锁定装置,可以将电缆固定在端口内。检查是否所有的锁都被激活。
- ****主板安装在支架上。有些情况下会提供一个特殊的支座螺钉,主板应安装在其上。支架抬高主板,保护它不接触金属托盘,这可能会导致短路。
我想回顾的另一个症状是您的电脑开机,但在启动过程中过一会儿就关机了**。在这种情况下,可能存在阻止您的 PC 版本运行的故障组件。我发现了一个诊断这类问题的好策略:**
- 尝试拔下所有“不必要”的组件,如第二块硬盘或机箱冷却器,并在问题仍然存在时仔细检查。
- 保持不相关的事情,直到你的问题不再存在。
- 最后一个未连接的部件可能是问题的原因。试着再连接一次来证明假设。
以下视频展示了实际故障排除过程:
如何诊断有故障的 PC 组件?
此外,您的主板可能有调试指示灯,指示系统中哪些组件未找到。在这种情况下,您需要再次检查发出信号的组件是否通电并正确安装。
最后,一段时间后,您将能够在屏幕上看到视频信号,系统正在寻找可引导设备。
电脑开机和背面的情况下,电缆管理部分(图片由作者
这是安装 PSU 并利用电脑机箱提供的电缆管理系统的好时机。
登上 PSU ( 图片作者)
软件安装
我考虑了 Ubuntu 20.10 和 Windows10 + WSL2 设置。Linux 安装现在更加稳定和简单。然而,WSL2 听起来也是一个非常可行的方法。下次再告诉你更多。
我手头只有 macOS,所以用UNetBootIn 应用烧了一个 Linux 可引导 USB。我更喜欢用 BitTorrent 下载 Ubuntu 20.10 镜像。
注意,一些 Linux 发行版(比如 Kali)抱怨说 UNetBootIn 不是编写可引导 USB 的最可靠方式。幸运的是,我似乎对此没有异议。然而,我不得不买一个新的 u 盘,因为我的旧 u 盘似乎有问题。每次我试图安装操作系统时,由于文件损坏,从旧 u 盘安装都失败了。
有了新的 u 盘后,我可以毫无问题地安装 Ubuntu 了。
WiFi 适配器驱动程序
遗憾的是,微星 X470 MAX Gaming Plus 主板不支持 WiFi 开箱即用。我不想乱用以太网电缆,所以我买了一个 TP-Link 阿彻 T2U WiFi 适配器。问题是 Ubuntu 不支持它,需要额外的驱动程序。
好消息是 TP-Link 设备在 Linux 社区有很好的支持,所以我很快就找到了需要的驱动程序。也就是我安装了RTL 8812 au 驱动。要安装这些驱动程序,你需要有互联网连接,因为它们依赖于 DKMS 软件包,令人惊讶的是,这个软件包并没有安装在普通的 Ubuntu 中。按照驱动程序存储库中提供的说明进行安装。确保sudo make dkms_install
命令没有错误。
此外,您可能想要重新启动您的机器,以便仔细检查驱动程序在这种情况下的工作情况。如果没有,请跟随 stack overflow 上的这个答案。此外,我不得不第二次运行sudo make dkms_install
命令,最终在重启后让驱动程序工作。
CUDA 设置
利用我的新 GPU 资源需要配置 CUDA。
CUDA 是 NVIDIA 的并行计算平台,允许充分利用支持 CUDA 的显卡的优势。一般来说,安装过程可以分为 3 个部分:
- 安装显卡驱动。在 Ubuntu 中安装 NVIDIA 驱动的推荐方式是通过软件&更新应用。
Ubuntu 中的 NVIDIA 驱动安装(图片作者)
- 安装 CUDA 工具包。NVIDIA 有一个可爱的向导可以为你的系统生成安装命令。执行它提示你的所有命令。
- 安装 cuDNN 。cuDNN 是一个 GPU 加速的库,具有用于深度学习的原语。您需要在 NVIDIA 开发者计划中注册才能访问该库。最后,你会进入一个页面,在那里你可以下载 cuDNN 运行时和开发者库以及代码样本和用户指南。我把这三个都下载成 deb 包并安装了。
下载 cuDNN 页面(访问在此 ) ( 图片作者)
这里是来自 NVIDIA 的官方安装指南。
到目前为止,我已经在 PyTorch 项目中测试了我的设置。可能还有另一件事会困扰你。为了利用我的 GPU 设备,我不得不重新安装我的 PyTorch 库。这一次 PyTorch 有一个平稳安装向导可以帮助你。
最后,如果你使用 PyTorch Lightning ,这是一个为你的训练器实例改变GPU 配置的问题,它将在训练或推断期间使用你所有的 GPU 资源。
工作流程
目前,我正在使用基于 sFTP 连接到我的机器的最简单的工作流,并且改变了 PyCharm Professional 的自动上传特性。
为了连接我的深度学习工作站,我在那里安装了 OpenSSH 服务器。我喜欢禁用密码验证,而使用 SSH 密钥。此外,将默认的 22 端口更改为其他端口也是一个好主意。
一旦 SSH 连接就绪,就可以在 PyCharm 实例中设置部署主机,并在 ML 工作站上安装项目。这是项目第一次设置时需要的,通过运行git clone
加poetry install
命令可以很方便地完成。Rsync
是一种将数据集上传到机器的快捷方式。
你在 PyCharm 里做的大部分改动都会自动同步到深度学习机器上。当您准备好测试您的更改时,您可以在 ML 工作站中通过 SSH 运行一个命令来执行您的项目。
通过这种工作流程,您仍然可以在 MacBook 上工作,同时在 GPU 加速的计算机上运行代码。
摘要
看到我手上有一些 GPU 资源的小想法是如何在整个项目中成长的,真是太棒了!
我的深度学习工作站 1.0 ( 图片作者)
希望这篇文章对你搭建自己的深度学习工作站有所帮助。一定要在下面的评论里让我知道这是不是真的!
在接下来的几周里,我很可能会尝试其他的工作流程和当前的设置,看看它们如何为我工作,所以请保持关注,祝你好运,建造你自己的 ML beasts。
本帖原载于我的网站。
参考
我如何构建自己的约会应用程序算法
为成千上万的用户编写一个简单的匹配算法
照片由 Unsplash 上的 Prateek Katyal 拍摄
答现在市场上几乎所有的约会应用都有某种形式的约会算法。然而,这些算法通常不公开供公众审查。此外,他们背后的公司可能不希望他们的秘密配方暴露给竞争对手。但是,我们仍然可以尝试找出一个潜在的日期算法是如何制作的。
过去,我曾无数次深入研究过这个问题。我甚至使用机器学习聚类算法构建了一个简单的约会应用程序:
使用无监督的机器学习是一个很好的练习,产生的约会算法也不算太差!这是一次很棒的经历,但我认为还需要一些改进。
在本文中,我不会严格使用机器学习,而是选择一种更简单的方法,使用数据科学工具和一些推荐系统技术。这种算法的逻辑很简单——它将基于群体智慧的理念。这意味着该算法将找到和你一样的用户,聚集那些志同道合的用户的互动,然后最终根据志同道合的用户的意见和互动推荐你可能喜欢的个人资料。
我将向你展示我是如何主要使用 Python 和 Pandas 创建这个约会算法的。但在我开始之前,我必须列出这个约会算法的几个先决条件和假设:
- 这种定年算法是在一个已经建立的平台下工作的。意味着用户和用户交互已经存在。
- 这个建立的平台向用户提供了一个快速简单的问卷。类似于在约会档案上填写问题。
- 该平台的工作原理类似于其他流行的约会应用程序,通过左右滑动来表示个人资料之间的喜欢。
- 直男直女将是这个平台目前唯一的用户。其他偏好可能会在以后添加。
就是这样!我们现在可以继续进行编码方面的工作,如果你想创建自己的约会算法,可以随意编码。
捏造用户和用户行为
由于我们的约会算法只适用于已经建立的数据集,我们需要用随机值来制造数据。我们可以制作更复杂的数据集来模拟真实世界的约会档案,但现在还没有必要。
创建数据框架
首先,让我们导入以下库:
import pandas as pd
import random
import numpy as np
对于该算法,将有 3 个数据表或数据帧。一张桌子给男人,一张桌子给女人,还有一张桌子展示他们是如何互动的。男性和女性的表格将包含 5 列,代表“个人资料调查表”中的问题和答案以及他们的用户 id。问题和答案将被表示为一个简单的“Q1 到 Q5”,而答案被表示为“A 到 E”。
创建一组简单数据集的代码
评级或互动表将显示 3 个不同的值。这些值代表 M 和 W 用户之间的交互结果:
- 1 表示导致成功匹配的两个用户之间的相应右击。
- 0 表示来自任一用户的左击导致不匹配。
- “看不见”表示两个用户还没有看到彼此。
从左至右:男士桌、女士桌和比赛/互动桌
制作年代算法
现在我们有了可以玩的数据,我们可以继续有趣的部分——构建约会算法。该日期算法将按以下顺序工作:
- 找一个还没看过很多 W 简介的 M 用户。
- 根据所选择的 M 个用户的约会简档答案,找到其他相似的 M 个用户。
- 从最相似到最不相似排列相似的 M 个用户。
- 包括最相似的 M 个用户。在我们的例子中,它将是前 10 个最相似的。
- 获取我们选择的 M 用户尚未见过的所有 W 用户的前 10 个交互。
- 合计前 10 名的交互值,以找到累积值。
- 使用这些累积值来预测看不见的 W 用户和我们选择的 M 用户之间的潜在交互。
之后还有一些额外的步骤,比如对每个 W 用户的累积值进行排序,但现在这并不太重要。上述序列将是我们匹配算法的蓝图。同样,这个序列也可以应用于 W 用户。
找到一个拥有许多“看不见的”价值的 M 用户
现在我们有了蓝图,让我们开始编码吧。为了找到评级表中具有最多“看不见”值的 M 用户,运行以下代码:
m_user = ratings.T.apply(pd.Series.value_counts).T.sort_values(
by="unseen",
ascending=False
).iloc[0]
接下来,我们将找到并保存这个 M 用户尚未看到的所有 W 用户的列表:
m_nrate = ratings.T[ratings.T[m_user.name]=="unseen"].index
查找前 10 个相似的 M 用户
现在我们可以使用上面创建的变量找到所有相似的 M 个用户。但是首先,我们必须做一些简单的数据预处理。我们需要对男士表格中的答案进行分类,这样我们就可以使用它们相应的数值来计算相关性:
n_men = men.apply(lambda x: x.cat.codes)
产生变换的数据帧:
将答案转换为相应的数值
有了这个表,我们就可以计算与熊猫的相关分数。
m_sim = n_men.T.corrwith(
n_men.T[m_user.name]
).sort_values(
ascending=False
)[1:11]
运行这段代码将导致左边的表格显示与我们选择的 M 用户最相似的用户。最相似的用户具有 1.0 的相关性分数,最不相似的用户将具有 0 的分数。默认情况下,熊猫使用“ 、皮尔森 ”方法来计算相关性。
前 10 个匹配值
知道了前 10 个相似的用户,让我们找出我们选择的 M 用户还没有见过的 W 用户的交互值:
msim_rate = ratings.loc[list(m_sim.index)][m_nrate]
指数:前 10 名相似用户。列:我们选择的 M 用户尚未看到的 W 用户。
因此,即使有前 10 名相似用户,仍然有一些“看不见的”价值。这可能是一个未来的问题,可以通过添加比前 10 名更多的类似用户来解决。然而,为了这个项目的目的,我们将继续我们所拥有的。
汇总前 10 名的值
我们现在可以合计这些值,找出每个 W 用户的总价值。为此,我们有多种方法可以计算累积值。让我们保持简单,只找到平均值、频率和中间值结果:
# Man predictions
m_predict = pd.DataFrame()# Replacing the unseen values with NaNs for calculation purposes
msim_rate.replace(
"unseen",
np.nan,
inplace=True
)# Average
m_predict['avg'] = msim_rate.mean()# Frequency
m_predict['freq'] = msim_rate.mode().T[0]# Median
m_predict['median'] = msim_rate.median()
在左边,您应该可以看到前 10 个交互值的累积值的 DF。
从这里,我们可以选择哪种计算最能代表前 10 名相似用户的总体情绪—平均值、频率或中值?
平均值似乎是最好的,因为它的数值范围很大。我们可以用这个对 W 个用户进行排序,找出前 10 名中最受欢迎的用户。它还可以作为我们选择的 M 用户的匹配/兼容性分数。例如:
假设你是被选中的用户。如果该值为 0.80,则有 80%的可能性您会喜欢此档案,因为与您最相似的 10 个用户中有 8 个喜欢此档案。
决定使用平均值后,我们现在已经完成了约会算法!在这种情况下,我们只将该算法应用于现有用户。但是,我们如何将它应用于平台上的新用户呢?
处理新用户
现在我们已经为我们的约会算法设计好了代码,让我们把它应用到一个新用户身上!这个新用户将与现有用户使用相同的调查问卷。所以我们基本上只是将它们添加到现有的数据集中。
我已经构建了一个函数,它使用了我们最近创建的约会算法的代码和序列:
假设我们的新用户将通过回答几个问题被介绍给平台,我们将对他们使用随机答案。之后,我们将运行上述函数,然后我们的新用户将能够看到他们最有可能匹配的用户:
ans = ['A', 'B', 'C', 'D', 'E']# Randomly picking answers
new_man_answers = random.choices(ans, k=5)# Running the function
recs = matchMan(
men,
women,
ratings,
new_man_answers,
num_sim=10
)# Finding the top 20 most potentially compatible
recs[:20]
运行上面的函数并使用与以前相同的表,将向新用户呈现这些推荐的 W 个用户,这些用户按平均分排序。我们可以看到分数在列表中进一步下降,这意味着算法正在工作。
现在可以向这些 W 用户显示分数,以通知新的 M 用户他们潜在的匹配兼容性。或者,他们可以不显示分数,新用户将只看到这些配置文件作为他们的最佳推荐匹配。这些 W 用户如何呈现的决定,最终还是要由婚恋交友平台的负责人来决定。
结束语
我们已经成功构建了一个简单的约会算法,而没有使用任何机器学习模型。然而,我们可以采取一些步骤来潜在地改进这种年代测定算法。例如,我们需要通过比较现有用户的预测分数和实际分数来验证我们的结果。在此基础上,我们可以对算法进行改进,比如将更多的相似用户包括在内,而不仅仅是前 10 名,或者甚至对交互值进行加权。
我已经在 Github 上完成了我的代码中的一些基本验证过程— 参见下面的。然而,这里所做的任何验证都是没有意义的,因为我们现有的数据集都是随机的。
另一个需要注意的潜在问题是规模。当平台上的用户数量(甚至入职问题)增加到算法开始变慢的时候会发生什么?我们该如何补偿呢?这些是我们在改进这个算法时需要考虑的事情。
总而言之,构建这个算法是对编码和利用一些推荐系统技术的一次很好的锻炼。如果您希望继续改进这个现有的算法,请随时查看我在 Github 上的代码。我希望你喜欢这篇文章,如果你愿意,可以看看我的其他文章!
资源
https://github.com/marcosan93/Medium-Misc-Tutorials/blob/main/Dating-Algo.ipynb