2020 年计算机视觉必读论文更新
原文:https://towardsdatascience.com/must-read-papers-in-computer-vision-for-the-2020s-3943d5339ba4
计算机视觉中深度学习技术的前沿
计算机视觉社区目前正在发生什么?如果你像我一样是一个狂热的计算机视觉爱好者,这里有几篇我近年来最喜欢的论文,我相信它们将对未来产生巨大的影响。
免责声明:这些论文是我认为的“基础”论文。有许多论文延伸到它们之外,具有很大的见解,我将逐渐在这里添加链接以供参考。
屏蔽的自动编码器是可扩展的视觉学习器
图一。屏蔽的自动编码器管道。从原始纸张中检索的图像。
如果你跟踪深度学习技术有一段时间了,你可能听说过 BERT,这是一种自我监督的技术,用于语言中,你可以屏蔽部分句子,进行预训练,以改善学习隐式表示。然而,在学习更好的特征提取方面,同样的技术不能转移到 CNN 上——直到最近引入了视觉变形金刚 vit。
对于 transformer 架构,He 等人研究了屏蔽是否适用,结果令人振奋:一个屏蔽的自动编码器伴随 ViTs 被证明是一种有效的预处理技术,用于分类和重建等下游任务。
【论文链接:【https://arxiv.org/abs/2006.11239】
相关论文:
- 作为时空学习者的蒙版自动编码器:https://arxiv.org/abs/2205.09113
- Point-BERT:预训练带遮罩点建模的 3D 点云变形器:https://arxiv.org/abs/2111.14819
21 世纪 20 年代的通信网
图二。ConvNeXt 与变压器的比较。从原始纸张中检索的图像。
另一方面,尽管 vit 在许多视觉任务的论文中表现出了优越性,但有一项工作在分析卷积网络(ConvNet)的基础方面表现突出。Liu 等人专注于“现代化”卷积网络,引入经验证明对 vit 有用的元素,并表明 ConvNet 确实可以在 ImageNet 等大型数据集上实现类似于 vit 的结果。
论文链接:【https://arxiv.org/abs/2201.03545】https://arxiv.org/abs/2201.03545
相关论文:
- 将您的内核扩展到 31x31:重温 CNN 中的大型内核设计:https://arxiv.org/abs/2203.06717
NeRF:将场景表示为用于视图合成的神经辐射场
图 3。NeRF 的管道。从原始纸张中检索的图像。
移动到三维空间,在重建和新颖的视图合成方面也有惊人的突破。Mildenhall 等人提出使用全连接网络来表示 3D 形状。也就是说,给定一些坐标和视角,网络输出特定空间的相应颜色。这允许以高质量和精确的质量生成未知角度的物体的新图像/视图。
论文链接:https://arxiv.org/abs/2201.03545
相关论文:
- GNeRF:无姿态摄像机的 GAN 基神经辐射场:https://arxiv.org/abs/2103.15606
- BARF:束调节神经辐射场:https://arxiv.org/abs/2104.06405
- CityNeRF:城市尺度的建筑 NeRF:https://arxiv.org/abs/2112.05504
- Block-NeRF:可扩展大场景神经视图合成:https://arxiv.org/abs/2202.05263
去噪扩散概率模型
图 4。去噪扩散模型正反过程。从原始纸张中检索的图像。
当讨论生成网络时,人们通常会想到 gan 或 VAEs。令人惊讶的是,扩散模型是近年来优秀的模型家族。简而言之,扩散模型在其正向过程中逐渐向图像添加噪声,同时学习反向过程。因此,逆向过程成为生成模型,其中图像可以从纯随机噪声中“提取”,类似于模型被训练的数据分布。
论文链接:【https://arxiv.org/abs/2006.11239】
相关论文:
- 改进的去噪扩散概率模型:https://arxiv.org/abs/2102.09672
- 具有深度语言理解的真实感文本到图像扩散模型:https://arxiv.org/abs/2205.11487
- 三维点云生成的扩散概率模型:https://arxiv.org/abs/2103.01458
感谢您坚持到现在🙏! 我会在计算机视觉/深度学习的不同领域发布更多内容,所以 加入并订阅 如果你有兴趣了解更多!**
我用数据创造故事的三步法
原文:https://towardsdatascience.com/my-3-step-method-to-create-a-story-with-data-74f6fd9fb7e7
产生相关和可行见解的技巧
作为一名数据专业人员,数据故事讲述是一项需要培养的重要软技能,但没有太多信息可以指导您从哪里开始。当我第一次成为数据分析师时,我不知道如何处理这个问题。随着时间的推移,它变得越来越容易,在做了许多演示之后,我想分享一下我用数据创作故事的三步法。
1.假装你拥有这家公司
成功的数据故事的一个要素是确保这些见解与受众相关。每位首席执行官都想发展自己的公司,增加收入,但最好的方法是什么呢?他们如何解决阻碍增长的问题?假装这是你的事情将帮助你评估你的故事中的数据是否提供了任何新的见解,将提高业务绩效或解决一个紧迫的问题。
例如,让我们假设你拥有一家科技创业公司。你需要增加新客户来发展公司。这是你作为首席执行官的最高目标。如果数据分析师展示了与客户保持率和流失率相关的见解,会怎么样?这是不相关的,因为它没有提到如何发展公司。
作为数据分析师,您仍然可以显示客户保持率和流失率,但了解新客户是一个目标,您可以通过来源进行细分,以显示客户来自哪里。假设细分数据显示 50%的客户来自付费广告,他们拥有最高的转化率和最低的流失率。有了这种认识,你的故事可以建议公司增加付费营销支出,以吸引更多新客户。你的故事现在是相关的和可行的,因为它解决了首席执行官关心的如何增加新客户的问题。
这怎么翻译成故事:
目标 —公司希望增加新客户以实现增长。
数据 — 50%的客户来自付费广告,他们的转化率最高,流失率最低。
可操作的洞察力 —增加付费营销支出以吸引更多新客户。由于他们的流失率最低,公司将在他们的有生之年充分利用他们来收回收购成本。该公司还可以创造内容,从有机搜索中吸引更多的客户,从而降低长期收购成本。
2.假设你是利益相关者
如果公司目标和你的利益相关者不一样怎么办?一个常见的公司目标可能是增加收入,但产品经理可能只关注用户对产品的体验。在这种情况下,与利益相关者讨论他们的目标和难点,以决定如何用与他们相关的数据创建一个故事。
例如,我曾经被要求寻找提高免费用户保留率的见解。我发现用户使用某个特定功能的次数越多,免费用户的留存率就越高。我问自己,如果我是产品经理,这些信息会有帮助吗?答案是否定的,因为它不具有可操作性。
然而,作为一个产品经理,如果我知道用户在注册的第一周内必须使用这个功能至少 3 次,以显示保留率的提高,那么我可以做些什么。这些是我作为产品分析师在我的故事中加入的相关见解。产品经理可以使用这些信息来进行入职更改,以鼓励新用户尝试该功能,并与营销部门合作,在新用户入职电子邮件中强化该功能的使用,以提高保留率。
这怎么翻译成故事:
问题——产品经理需要洞察力来提高免费用户保留率。
数据—与所有免费用户的整体保留率相比,在注册的第一周内至少使用一个特定功能 3 次的免费用户在保留率方面有所提高。
可操作的见解 —修改产品中的新用户入职信息,鼓励使用该功能,并与营销部门合作,在新用户入职电子邮件中强化该信息。
3.要求复审
作为一名数据分析师,我经常包含太多不需要的数据来表达我的观点。为了弥补这一点,我总结了我的故事的主要发现和建议。然后,我与同事或我的经理一起回顾演示文稿,以确认我在演示文稿中总结的发现,以及是否有任何可以修改的地方来阐明我的观点。
我发现这一步非常有助于识别太复杂的数据和需要澄清的模糊见解。如果你没有人要求回顾,我建议离开一天,早上用新鲜的眼光重新审视。
外卖食品
数据讲故事不一定很难。使用这三个步骤的方法,用与你的受众相关且可操作的数据创建一个故事。
概括一下:
- 假装你拥有这家公司。如果您获得了这些见解,您能利用它们来推动业务增长或解决您最关心的问题吗?
- 假设你是利益相关者。如果你得到了这些见解,它们对你实现目标有用吗?
- 求点评。你的同事或经理是否有和你想的一样的收获?有什么不清楚的数据或见解吗?
你可能也会喜欢…
我从 Tableau 专业工作中得到的 5 个最好的教训
原文:https://towardsdatascience.com/my-5-lessons-from-working-with-tableau-professionally-b55d826b8e21
在这篇文章中,我将讲述我从 Tableau 专业工作中学到的 5 个最好的经验
由 Unsplash 上的absolute vision拍摄
(你也可以在 我的网站 上找到这篇文章以及其他文章和更多有趣的东西)
1。理论与实践
我学到的第一个教训是,你在“理论”中学到的东西和你在日常工作中真正用到的东西之间有着天壤之别。
这是整篇文章的一个潜在主题,但是我将在这里给出一些我发现的最令人震惊的事情。
关于理论,我的意思是你会做些什么来通过认证,学习在线课程,阅读普通文章或参与社区项目。
(这可能会随着 Tableau 认证的变化而变化)
理论侧重于用预先准备好的数据创建奇特的图表
Adeolu Eletu 在 Unsplash 上拍摄的照片
当我自学学习 Tableau 时,我在网上找到的许多理论都是围绕着能够在 Tableau Desktop 的画布上工作而建立的(创建很酷的图表,并在某种程度上使用计算字段和参数)。
它不太关注构建仪表板,甚至更少关注 Tableau 管理、Tableau 服务器、Tableau 在线或数据处理。
还有一些很棒的社区项目,比如 Make Over Monday、Tableau Tip Tuesday 等等,参与这些项目也很有趣。
但是,正如大多数在线课程一样,这些课程也大多侧重于在画布上工作。
我认为这种理论焦点的主要原因是,它们是围绕免费的 Tableau Public 建立的,这更容易关注每个人都可以轻松访问的东西,而不是更难获得的管理性东西。
在实践中,你必须对画面和围绕画面的过程有更全面的了解
奥利·戴尔在 Unsplash 上的照片
当然,这取决于你将具体用什么来工作。
但无论你是商业智能顾问、数据分析师还是其他工作,你都需要有一个更全面的方法来处理不同的问题。
很有可能你将不得不与**数据治理、**一起工作,也就是管理你的数据的安全性和完整性。(您将如何发布报表并连接到数据源,谁将看到您的报表。)
除此之外,你还将与如何将数据输入到你的报告中一起工作,要么自己做准备,要么与你组织中从事系统架构或数据库管理的人密切接触。
2.业务需求应该放在首位
始终与利益相关者保持密切沟通
在从事商业智能和数据分析工作时,这是一件非常重要的事情。
你希望你的报告能让尽可能多的人在日常工作中使用。你想产生影响。
产生影响的最佳方式是围绕业务需求构建报告。
如果你与利益相关者密切沟通来构建你的报告,并且该报告确实对他们有所影响,他们会更多地使用该报告。
如果没有人使用这份报告,那还有什么意义呢?
你可以花一周的时间来构建一个包含大量参数和效果的精美信息图,但是可能没有人会使用它。
或者,您可以花三天时间收集您的业务所需的信息和正确数据,并将其显示在一个表格、一些过滤器和一个向下钻取的条形图中,每个人都使用它。
3.创建可重复使用的报告
Anton Maksimov 5642.su 在 Unsplash 上拍摄的照片
你不必重新发明轮子
我将重用我在以前的两篇文章中写过的一个技巧。
您不必每次创建新报告时都从头开始。
至少,创建可以在其他项目中重用的报告有两个积极的方面。
- 你会更快进入项目的后期阶段
通过使用以前报告中可重用的部分,您可以更多地关注业务方面(提示 2 ),而不是如何设计报告中的所有内容。
- 您可以更轻松地进一步开发报告(并可复制到其他报告)
如果您在创建报告时没有使用太多的遗留,您将有可能在以后的阶段更容易地进一步开发报告。
如果你在你的一个报告中这样做了,你也可以带着这些知识在将来开发其他的报告。
4.创建性能报告
不要过度复杂的视觉化
来自 Data Revelations 的 Steve Wexler 是不要让你的可视化过于复杂的最著名的演讲者之一。
在商业环境中,用户体验是构建报告最重要的因素之一。
这意味着在你想让你的报告有多“高级”和你想让它们有多高的性能之间有一个重要的平衡。
您可以使用许多不同的参数和计算方法,以提供更好的用户体验,但这也可能会降低您的报告速度,反而会提供更差的用户体验。
当你拥有的数据可能比你在家里处理一些小数据集时要多得多的时候,你现在确实需要重新思考如何构建报告。
将计算和数据源筛选器向上游移动
另一方面,数据进入报告之前的工作也非常重要。
如果您可以在 Tableau 中处理数据之前限制数据并执行大量计算,您可能会有更多的回旋空间,还可以通过自定义过滤器、更多的仪表板操作等来增强用户体验。
总而言之,当你在真实的商业环境和大量数据中开始使用 Tableau 时,与在在线课程或社区环境中相比,性能将是一个更重要的因素!
5.完美需要时间
你想立刻拥有完美的一切…
当我第一次开始制作 Tableau 的时候,我很喜欢参与制作 Over Monday。
我认为这是一个很好的方式来习惯 Tableau 中不同的可视化技术,并且从其他更了解这个工具的人那里得到反馈。
对 Make Over Monday 的一个简短总结是,您应该在短时间内使用特定数据集创建(重新创建)可视化。
当我开始的时候,我真的很难知道我什么时候完成了可视化,因为我总是想在截止日期之前改进它。
…但重申在工作中是一件积极的事情!
在“现实生活”中,你会学到重复是一件好事,在第一次反馈会议之前不重复是应该的。
正如我前面提到的,与利益相关者的沟通是关键。
但是,当你开始着手下一个项目时,你几乎不可能确切知道它会有什么样的结果。
- 你到底要处理哪些数据?
- 提议的仪表板能与您拥有的不同维度一起工作吗?
- 如果用新的数据源扩展这个项目,将来还会有更多的人对它感兴趣吗?
因为所有这些在项目开始时都是未知的,所以当你开始一个新项目时,重复是非常方便的。
更多会议=满足业务需求的更大机会
把它想成这样。你开始这个项目,最后期限是 10 周。你决定每三周举行一次反馈会议。
10 周后你会得到非常有用的反馈,就像 Andy 和 Eva 在《Make Over Monday》中的反馈一样,但你会得到三次反馈,而不是 10 周后只得到一次反馈,尽管不同角度的项目取决于会议期间的项目。
如果你从一开始就花 10 周时间在项目上,因为你想在反馈会议之前完成一个项目,那会怎么样?
结论
我在 Tableau 工作的五个专业建议是:
- **理论与实践:**与您在在线课程和社区项目中看到的相比,您将更少地使用预先准备的数据,更多地使用数据治理,并思考如何在实践中引入数据。
- **业务需求应该放在第一位:**在与利益相关者的交流中创建业务需求的报告,而不仅仅是创建你认为有趣的报告。
- **创建可重用的报告:**使用早期报告的模板,以便能够更多地关注业务方面和引入数据,而不是仪表板的设计。
- **创建高性能的报告:**不要因为可以而进行过度复杂的可视化,尝试将计算向上游移动,同时过滤数据。当你专业地使用 Tableau 时,性能是一个非常重要的因素。
- **完美需要时间:**你想立刻让一切都变得完美……但是在工作中反复是一件积极的事情。在产品感觉“完成”之前,不要犹豫创建原型并与利益相关者开会,这最终将是有益的。
感谢您的阅读
非常感谢你阅读我的博客!
在下面留下你对内容的看法,或者想讨论一下你从 Tableau 中学到的最好的一课是什么。
我很想听听其他人是如何看待这些事情的。
如果你喜欢阅读我的故事,并愿意支持我成为一名作家,可以考虑使用这个链接、 注册成为一名媒体会员,我可以赚取一小笔佣金,不需要你额外付费。
问题或询问
如果您有任何问题或建议,请联系我
领英:www.linkedin.com/in/elias-nordlinder
**邮箱:**Elias.Nordlinder@gmail.com
网页:eliasnordlinder.com
祝大家本周愉快
//伊利亚
我写技术文章的 6 个步骤
原文:https://towardsdatascience.com/my-6-step-process-for-writing-technical-articles-9d2f22026a5f
我写数据科学文章的过程、工具和技巧
克里斯汀·休姆在 Unsplash 上拍摄的照片
我发现每篇新文章的空白页都有点令人生畏。有这么多工作要做。你需要做研究,起草,编辑和添加图形。在某些情况下,你需要学习一些全新的东西。每个作者都会有某种过程来帮助处理这种工作量。
我的过程始于每篇文章的通用清单。一步一步地分解文章使得整个工作量看起来更容易管理。完成每一步也给我成就感,并帮助我保持动力。最后一个好处是,将某些任务分开让我成为了一个更有效率的作家。
我已经写了近 3 年的数据科学文章。在此期间,我发表了 33 篇文章,总浏览量超过 23 万。我最近还出现在《走向数据科学》的作者聚焦中。我投入了大量的工作来完善我的写作过程。想分享给大家,希望能对你的写作有所帮助。
这个过程已经发展成了您在下面看到的更加明确的步骤。我将带您详细了解 6 个步骤中的每个步骤。在右边,你会找到我用来帮助完成每一步的工具。我会讨论这些,同时,我会给你一些有助于我写作的建议。这些包括我如何写得更快,提出新的想法,让我的文章在移动设备上看起来不错。
6 步写作过程(来源:作者)
0)创意产生
在进入这个过程之前,我需要决定写些什么。随着时间的推移,我的想法来源发生了变化。在获得计算机科学硕士学位几个月后,我开始写作。最初,我在学位期间做的项目是一个文章的春天。艰苦的工作已经完成了。我只需要把它改编成一个好故事。
我之前一篇文章的例子是 深度神经网络语言识别 **。**它是基于我为机器学习课程做的一个项目。分析的重点是预测一段文字的语言。这是使用以字符三元模型作为模型特征的深度学习来完成的。有一篇关于这一分析的文章,但是它假设在 ML 和 NLP 方面有一定水平的专业知识。
中等文章不只是给专家看的。在写文章的时候,我把分析改编成了编码教程。我花时间解释了一些基本的 NLP 概念,如文本清理和停用词。我还试图解释用于分析的代码。希望即使是经验很少的人也能理解这个教程。
回想起来,我认为我在大学做的工作是开始写作的最佳地方。我已经对我所学的课题了如指掌。写作是重温这些项目并向世界展示我所学到的东西的好方法。随着项目的枯竭,我需要寻找新的想法来源。我开始学习新的数据科学来写作。我发现写作是学习新事物的好方法。
当学习一个新的技术概念时,我的最终目标是写一篇关于它的文章。同时,我总是试图给我所写的领域增加一些价值。我需要将代码应用到新的数据集,创建新的可视化或提供一些其他独特的见解。为此,我需要很好地理解技术概念。这样,写作为我的学习提供了一些结构。
我发现写作有你写的文章之外的好处。我从写作中获得的知识和沟通技巧都让我在工作中受益匪浅。最近,我发现我在工作中获得的经验有益于我的写作。我所获得的实践经验自然为我所写的领域增加了价值。
比如我的文章, [分析机器学习中的公平性](http://Analysing Fairness in Machine Learning (with Python)) **。**我有幸和一个算法公平性的专家团队一起工作。关于这个话题有很多研究。与团队合作向我展示了什么是最有用和最实用的应用。在写这篇文章的时候,我试图尽可能多地传递这些知识。
(来源: flaticon )
随着时间的推移,创意的来源可能会发生变化,但有一点是不变的。一旦我开始写作,我总是会有新的相关想法。抓住一个话题总是会引出新的问题。对一个领域有了更好的了解,我也会知道如何增值。这意味着我通常会开始写一篇文章,即使我不是 100%确信它会增加价值。大海里有很多想法。我就一直写,让他们来。
1)研究和编码
一旦我有了想法,它会分成两类。要么是研究文章,要么是编码教程。 什么是 MLOps? 是一篇研究文章的例子。这些是非技术性的,旨在讨论概念。上面提到的语言识别文章就是一个编码教程的例子。这些旨在向你展示如何应用概念。
这第一步将取决于文章的类型。研究文章包括阅读学术论文和书籍。我用媒体编辑器做笔记 app。在我做研究的时候,我会抄写一些文字。我会用引号把其他作者的作品分开。目标是收集相关的段落,稍后我会把它们提炼成我自己的话。
我如何将其他作者的作品分开的例子…
我的大部分编码教程都是 Python 的,我用的是 Jupyter 笔记本。最初,会有很多实验。我想解释如何应用一个概念,但同时,我想讲一个好故事。我将尝试不同的数据集,以找到一个能最好地解释一个概念的数据集。如果我找不到好的数据集,我将生成一个具有特定属性的数据集。我也将尝试相同结果的不同视觉化。我这样做是为了找出哪些是最有趣的,并清楚地解释这个概念。
我也对结果的顺序进行了思考。比如在 用 Python 介绍 SHAP**,**我解释了 5 个不同的 SHAP 剧情。情节的顺序是有目的的。一些情节的弱点被前面的情节解决了。这提高了文章的流畅性。最后,笔记本中的结果将与最终文章的顺序相同。这使得下一步,创建一个大纲,更容易。
2)概述
一旦我对研究和代码的数量感到满意,我就创建文章的大纲。这是文章的骨架。它将包含所有的标题和副标题。它还将包含解释这一概念所需的所有图表。到大纲结束的时候,我会确切地知道我想写什么。这使得下一步,写草稿,尽可能快地进行。
对于研究文章,我将对第一步中复制的所有文本进行重新排序,以适应大纲。在研究阶段,我会从学术论文或书籍中复制整篇文章。我将这些段落移至正确的小标题,并删除任何不必要的文字。我也会开始在每一段上面加注释。这些是关于如何用我自己的话把它们表达出来并把来源联系在一起的想法。
对于编码文章,我将包括来自分析的任何数字。这些一般直接来自笔记本。也就是说,它们是使用 Python 包(如 matplotlib 或 plotly)创建的。我还会在每个图表上方添加简短的注释。这些概括了我每段要写的内容。
如果我想解释代码片段,我会使用 GitHub Gists 来嵌入它们。下面,您可以从语言识别文章中看到代码。这个代码被用来训练一个神经网络。比起将代码直接嵌入到介质中,我更喜欢使用这些。我喜欢不同的颜色用于组件,使其更容易阅读。
对于研究和代码文章,我将添加一些额外的图形。如果我认为它们会使一个概念更容易理解,或者如果它们会使文章读起来更有趣,我会添加这些。有了好的图形,我可以把一段详细的文字简化成“见图 X”。为了创建这些图形,我一般使用 谷歌幻灯片 。我不是平面设计师,但它能完成工作。你不需要花哨的工具来讲述一个好故事。
用谷歌幻灯片创建的图形(来源:作者)
到提纲阶段结束,我想对自己要写的东西有一个清晰的想法。虽然,我的轮廓从来都不完美。当我真正开始写作时,它通常会改变。我只是希望它包含足够的细节,使草案阶段尽可能顺利。正如我下面所讨论的,在写草稿的时候,我会努力进入一种流畅的状态。大纲应尽可能对此有所帮助。
3)草稿
提纲做好了,是时候继续写草稿了。这是文章的核心。老实说,这是写作中最无聊的部分。我希望我脑子里的想法能出现在纸上。作为一种妥协,我试图尽可能快地在页面上获得尽可能多的单词。我不担心拼写、语法或句子结构。这是在编辑阶段的后期。
真正的目标是尝试进入一种心流状态。软件开发人员可能对这个概念很熟悉。当你 100%专注于任务时。单词/代码会毫不费力地出现在页面上。我发现进入心流可以大大提高我写文章的速度。
流动状态的定义(来源:作者)
进入心流很难。这就是为什么我试图有一个好的轮廓。我不应该考虑太多我想写的东西。我尽量不去添加数字或查找我忘记研究的东西,以免打断我的写作。话虽如此,在你动笔之前,很难把你需要的东西都写在提纲里。
通常在选秀的时候,我会意识到缺少了一些东西。我可能需要做更多的研究,或者我可能会想到一个更好的数字来表达我的观点。为了流量,我就一直走下去。我为缺失的数字和图形留下占位符。一旦我完成了初稿,我就可以回到研究/编码阶段。
除了一个好的大纲,我一直在试验进入心流的最佳条件。我发现一些有用的东西是写作前的锻炼或冥想。这让我头脑清醒,可以集中注意力。我写作的常规和时间也很重要。对我自己来说,我发现最好的时间是运动后的上午 10 点到 12 点。在这两个小时里保持高度集中胜过在一天的其他时间里试图缓慢地写作。
写作前我也尽量避免分心。这包括社交媒体、电子邮件甚至 WhatsApp 消息。任何能让我走神的东西。如果我在一个嘈杂的环境中,我发现听白噪声很有用。这可能是过度的,但是保护流动状态是重要的。一旦你分心,你可能会失去它,很难再回到它。
4)编辑
我的草稿就像一大块大理石。现在是时候凿出里面的雕像了。在编辑阶段,我想提高可读性。我对句子进行了重新措辞和排序,使文章尽可能流畅。我尽量缩短句子,用更简单的词。我也删除任何重复。我的目标是用最简单的方式和尽可能少的词语解释一些事情。
如果我觉得我需要一些关于一篇文章的反馈,我会在编辑的时候试着去得到。这通常意味着将文章发送给家人或朋友。我问他们是否发现有什么难以阅读的东西,或者他们是否认为有什么遗漏。你的写作很难得到好的反馈。我发现人们太好了,或者没有足够的时间进行彻底的批评。
作为替代,我喜欢使用 海明威编辑器 。它使用机器学习来评估你的作品的可读性。如下所示,它还会指出你写作中可以改进的部分。我倾向于关注红色的“难以阅读”的句子。我将通过改写或分解句子来简化这些问题。
海明威编辑器分级(来源:海明威 app )
另一个有用的编辑工具是 语法上的 。我用的是免费版,可以很好地检查你的拼写和标点符号。具体来说,我使用的是 chrome 扩展。这允许我在媒体编辑器中使用语法。您可能希望在绘制阶段关闭扩展。我发现当我应该写作的时候,它诱使我改正语法。
总的来说,我尽量把起草和编辑阶段分开。我总是有一个编辑阶段。然而,在看了下面的视频后,我把更多的精力放在了分离步骤上。Ayodeji 说,为了提高他的写作速度,他戴着不同的帽子-一个是写作,一个是编辑。如果他试图同时做这两件事,写文章所需的总时间就会增加。
我的写作也有过类似的经历。实际的写作很无聊,完美是一种干扰。如果我花太多的时间去尝试表达事物,我会失去兴趣。相反,我试着进入心流,在那发生之前把我所有的想法都写在纸上。我可以稍后回来整理这些想法。我发现写草稿和编辑之间的休息也有利于编辑过程。我经常想到应该添加到文章中的东西或者更好的表达方式。
5)波兰
写作的最后阶段是润色文章。我想让我的大理石雕像发光。我添加了一些收尾工作,并试图找出我在编辑过程中漏掉的任何小错误。这些是语法学家没有发现的语法错误。
我可以一遍又一遍地读我自己写的东西而不发现这些错误。这就是我使用文本到语音转换的原因。我让我的设备在我阅读的时候读出我写的东西。当我听到语法错误时,它们就突出来了。大多数设备都内置了这一功能。在 macOS 上,您可以通过高亮显示文本并按下 控制+ESC来激活文本到语音转换。
我最不喜欢做的事情就是添加一些图像。这些与用谷歌幻灯片创建的图形不一样。它们无助于解释概念。它们只是为了让文章更有趣,并打破文本的连续段落。我通常用 flaticon 来表示这些。在本文中,我甚至使用了其中的一些图标。
(来源: flaticon )
6)职位
一旦我对最终的文章感到满意,就该发表了。我从不直接向媒体发表文章。相反,我试图把我的文章发表在一个出版物上。我通常和一起发表关于数据科学的文章。通过他们现有的受众和社交媒体,这些文章获得了更多的浏览量。
我也创造了自己的文章流量。我活跃在 T witter 上,我会在那里分享它。我总是试图创造一些对话,并获得反馈。比如下面这条推文。有几次我根据 Twitter 上的评论修改了一篇文章。在某些情况下,对话会产生全新的文章想法。
(来源:作者)
一些最后的提示
针对移动设备进行优化
媒体上 68%的流量来自移动设备。我不确定我的观众的确切比例。不管是什么,我还是想确保我的文章在手机上看起来不错。在我意识到我的一些文章很难阅读之前,我从来没有这样做过。
你可以在下面看到我的意思。这是我的文章 用 Python 介绍 SHAP中的一个图。这个人物有透明的背景。在媒体编辑器中(第二张图片),它看起来很好。不过手机 app 背景比较暗。这使得标签难以阅读(第一张图片)。
移动网站与桌面网站上的图像(来源:作者)
为了确保我不会遇到这样的问题,我在发布文章之前会在手机应用程序上查看。为此,我与自己分享了草稿链接。然后我在我的移动设备上打开这个链接。我确保在 Medium app 中打开。这是因为中型移动网站仍然有白色背景。
理解你的动机
弄清楚你写的动机。写的理由有很多。你可能想建立声誉,提高沟通技巧或赚钱。我在下面的文章中讨论了我的动机。理解写作的好处帮助我保持动力。我写作的具体原因也有助于我的方法。
当人们谈论成为一名成功的作家时,一个普遍的感觉是数量胜于质量。这意味着写更多的文章,而不是专注于使它们完美。我认为这个建议假设每个人都有同样的动机。那就是靠写作赚钱。
你可能想把写作作为学习新事物的一种方式。在这种情况下,不必着急。慢慢来。如果你想在某个领域建立声誉,在一篇文章上投入更多的努力是有意义的。一篇高质量的文章比许多低质量的文章能给你更好的声誉。最终,你想写的理由将决定你成功的原因。
要耐心
在你成功之前,需要时间和大量的努力。如果你用阅读你文章的人数来定义成功的话。我已经写了两年多了。我现在才开始看到好处的实现。关键是要持之以恒,不断努力提高你的写作水平。
也就是说,我觉得我才刚刚开始我的写作之旅。我一直在努力改进我的流程。因此,如果你知道任何工具或技巧,请在评论中告诉我。
我希望这篇文章对你有帮助!你可以成为我的 推荐会员 来支持我。你可以访问 medium 上的所有文章,我可以得到你的部分费用。
https://conorosullyds.medium.com/membership
你可以在|Twitter|YouTube|时事通讯上找到我——注册免费参加 Python SHAP 课程
图像来源
所有图片都是我自己的或从www.flaticon.com获得。在后者的情况下,我拥有他们的保费计划中定义的“完全许可”。
作为数据科学家,我最大的错误是
原文:https://towardsdatascience.com/my-biggest-mistakes-as-a-data-scientist-so-far-d81277653c52
野外的数据科学和机器学习
作为数据科学家,我最大的错误是
我作为一名数据科学家所犯的错误,以及学到的宝贵经验
杰米·霍顿在 Unsplash 上的照片
我的错误
自从我获得第一份“正式的”数据科学工作以来,感觉已经过了很长时间。一路走来,我犯了太多的错误,吸取了太多的教训。我的目标是完全坦诚,这样我就可以对工作给出一个现实的看法,并向你保证犯错误是可以的,我们都会犯错误。这里是我犯的最大的错误(到目前为止),我希望你也能从中吸取教训。
假设机器学习就是一切
我认为对于我们许多人来说,我们对数据科学的第一次探索是通过机器学习。如果你和我一样,ML 可能是你在数据科学职业生涯中成功的一部分。我认为 MOOCs 对此负有部分责任,因为人们倾向于从零开始理解 ML 算法,并用玩具数据构建 ML 管道。老实说,我完全理解为什么,ML 是数据科学家工具箱中最强大的工具之一,由于所有的科幻电影,它也非常有市场。我从我采访的大多数初级数据科学家那里得到的问题是,“我什么时候会做机器学习?”。你可能会问,这种程度的热情有什么问题?
现在有一个难以下咽的药丸:在 FAANG 公司之外,大多数公司根本没有准备好全面的机器学习,即使在这些公司中,也有不同程度的 ML 成熟度。因此,如果你进入了一家不太成熟的公司,你该怎么办?
首先,将你的思维模式从构建机器学习模型转移一点,从尝试理解你正在处理的业务、他们的痛点、客户计划和目标开始。这并不容易,但是你很快就会发现在 ML 之外的其他领域,数据科学技能集可能是非常有价值的。
作为一名数据科学家,我做过的一些有影响力的项目都与建模和统计相关。这些通常支持帮助企业做出关键战略决策的一次性分析。我做过的一些非 ml 项目的例子包括定价优化、使用队列模型的网络模拟、使用逻辑回归的贷款结算分析、价格需求弹性模型和投资组合洞察仪表板。
作为一名优秀的数据科学家,在 ML 之外还有很多事情可以做。
未能推动你的工作方向
当我第一次开始的时候,我为此挣扎了很久。在任何一个新的角色或组织中,你都可能会感到迷失方向。你并不真正了解政治,你会遇到很多新的人,每个人似乎都有自己的议程,不幸的事情真的不胜枚举。
我回想起一个特殊的情况,我的一个渴望成名的同事代表我联系了一位投资组合经理。我不知道他们谈了些什么,但我的收件箱里收到了一封很长的电子邮件,列出了经理想要的一些财务报告。对我来说,这是一个尴尬的时刻,邮件的语气表明,已经在我不知情的情况下批准了这项工作。当然,报告是我们可以做的事情,但我马上发现,以这种手动方式构建这些报告不是对我们时间的最佳利用,除此之外,还有一个为 BAU 报告服务的分析团队。我暂时同意提交报告,部分原因是想尽早给人留下好印象。研究这个报告任务占用了我大量的时间,让我偏离了我原本要做的工作。我应该拒绝并让利益相关者去找我们的报告团队。
这里的教训是要记住你被雇用是有原因的,你是专家,你需要推动你如何与你的利益相关者互动。你有责任确定哪些项目将是最有影响力的,因此也是对你时间的最佳利用。你不必对收件箱里的每一个请求都答应。记住,每个人都有自己的议程,人们很乐意请你为他们做一点工作,只是因为这很乏味,你很快就会发现自己拥有这项工作。不要事事都答应。
试图煮沸海洋
当我被授予数据科学主管的职位时,我感到肩上责任重大。我相信,我需要通过交付最不可思议的东西来证明自己配得上这个职位,这些东西将为银行节省数百万美元。我的心绝对是好的,但是我太天真了。我收到的一个问题陈述是关于客户保留的,我立即开始研究提升模型、倾向模型和强化学习,试图建立一个一体化、自学式的 ML 解决方案来解决客户流失问题。我的有经验的读者可能会看到这种方法的问题。这将是复杂和昂贵的,你可能没有足够的数据。这都是真的,但只是在浪费了几天时间研究和撰写了一种方法之后,我才得出这个结论。
很久以前,我的一位经理曾经警告我们不要试图煮沸海洋。他会用浓重的西班牙口音说“约翰,我们不是要煮海洋”。每当他这么说的时候,我都会后退一步,重新评估我正在做的工作,并问自己“我付出的努力得到的回报值得吗?”有时候我们的思想比问题更复杂。在客户保持示例中,所需要的只是一次性的分析,以便企业能够更好地了解客户流失。
将复杂性误认为有效性是您成为昂贵且低效的数据科学团队的必经之路。
没有抓住风景
我敢打赌,我的一些读者已经犯了这个错误。不幸的是,我们大多数人都是通过直接经验了解到这一点的。当我说“把握前景”时,我不是在说理解业务或其产品,这是你从事的任何工作角色的基本标准。我说的是了解公司在数据科学和机器学习方面的成熟度。
我所经历的严格的申请过程让我认为这家公司比实际情况领先很多。只是在我加入之后,我才发现这家公司比我预期的要落后得多。如果你没有做好准备,在一家公司的早期阶段确实会面临一些尴尬的挑战,这些挑战会让你不知所措。除了获得合适的工具等显而易见的技术问题之外,您可能还需要教育您的利益相关者什么是数据科学或机器学习。
这里的教训是,当你加入一家新公司时,你应该在面试阶段问正确的问题。我写了一篇博文,给了你一些问题,你可以问这些问题来更好地理解这里的风景。
</5-questions-you-need-to-ask-employers-at-data-science-interviews-a9ea10c45d6>
陷入杂草中
我是那种喜欢把手弄脏的人。我希望我参与的每个项目都有我的指纹,无论是构建原型、数据可视化还是其他任何技术性质的项目。这一部分来自于恐惧和焦虑。我花了多年的努力来获得我的技能,我担心我会失去我不用的东西。最重要的是,我真的不想仅仅成为一名人事经理。
我领导着一个数据科学团队,这意味着我的职责不仅仅是技术交付。我需要能够看到更大的画面,管理利益相关者,制定战略和方向,获得预算,并进行沟通。所有这些对于我们所做的任何工作的成功都至关重要。如果我太拘泥于细节,我学到的其他重要的事情也会受到影响。
好消息是,技术上还是可以参与的,但是一定要给自己设定适当的界限。最近,我可能会构建一个 PoC 来指导交付的技术方向,但我会让我的初级数据科学家来进一步开发它。
最重要的是要明白每个人都会犯错,对犯错的恐惧永远不应该阻止你去尝试。勇往直前,勇敢犯错误,如果你从中学习,你将继续成长为你的目标,成为有能力的数据科学家或机器学习工程师。
⭐️ 我喜欢通过分享我在野外的数据科学经验来帮助人们。如果你还不是会员,可以考虑订阅 Medium,从我这里获得更多有用的内容。
https://johnadeojo.medium.com/membership
我的持续集成花费了太多时间。我如何修理它?
缩短 CI 运行时间的方法。衡量、优化、利用隐藏的资源,等等。
xkcd 作者混音的漫画。授予了显式使用权限。
我们都经历过这种情况:发送另一个 git push 到 pull 请求,并在 30、40、60 分钟内等待所有触发的 CI 检查完成。同时进行多任务处理或阅读一些 r/编程。太烦人了(不得不一心多用,也就是说)。我们能做得更好吗?我们来调查一下。
下面是一个典型的 CI 作业管道:
- 启动执行程序。根据配置项的不同,它可以是容器、虚拟机或云实例。
- 获取检查过的源代码。一个
git clone
。 - 有效负载的设置:安装依赖项、编译器、linters 等。
- 建造。对于像 Python 这样的解释语言,这可以是项目包的一个
pip install
。 - 有效负载:运行单元测试,验证,确保代码风格等。
- 提交工件。
我们可以在每一个阶段进行优化。此外,还有一个元优化,我将在最后描述。
邪恶的执行者
启动执行程序是所有阶段中最可疑的阶段。用户的杠杆很少。需要注意的一件重要事情是,硬件可能会在不同的运行之间发生变化。比如云 GitHub 动作在不同的 CPU 上运行;有些缺少 AVX2 这样的流行指令集。IOPS 也非常。我不建议滥用 GHA,但有可能重新触发几次乔布斯,以赢得最快的机器。
开源构建工程师经常忽略执行器经常拥有多个内核。特拉维斯有两个, GHA 有两个,天蓝色管道有两个。我见过在几个线程中进行make -j2
或执行单元测试的 CI 脚本。
容器化的执行器通常比传统的虚拟机启动更快,所以如果你的 CI SaaS 提供选择,不要在不必要的时候选择虚拟机。
清晰的代码获取
快速获取项目代码的黄金法则是尽可能少地下载。一些配置项抽象了这个阶段,尽管每个配置至少允许设置克隆深度。我迄今为止最好的一次投篮是
git clone --single-branch --branch <sha> --no-tags --depth 1
—通过跳过除我们正在构建的提交所引用的对象之外的所有 Git 对象,减少网络传输。GitHub Actions 在git fetch
期间进行等效的优化:
git init .
git remote add origin [https://github.com/...](https://github.com/...)
git -c protocol.version=2 fetch --no-tags --prune --progress --no-recurse-submodules --depth=1 origin <sha>
更快的设置
加速设置的普遍建议是缓存所有内容。
- 缓存已安装的包/模块等。(Python,Ruby,Node,Golang)。
- 我不熟悉 Java 和 C#,但我打赌它们也有一些值得坚持的东西。
- 缓存 docker 层并利用 BuildX 特性。
我知道两种缓存 docker 层的方法:简单的和终极的。简单的方法提炼出
docker load layers.tar
docker build --cache-from <image>
docker save <layers> -o layers.tar
这有两个问题:它们很慢,而且容易出现每次构建后layers.tar
增长的滚雪球效应,所以<layers>
应该小心选择。BuildX 消除了对docker load / store
的需求,因此速度更快。
最终的方法是从一个定制的容器注册中心拉取和推入。然而,人们仍然不得不偶尔从旧的陈旧层中删除注册表。
更智能地构建
增量编译(C/C++,Rust)。但是请记住变化的 CPU——如果没有固定所需的 CPU 属性,您可能会被抓到。
利用两个 CPU 内核(参见“邪恶的执行器”)。
用 Python ( pip install -e .
)中的开发安装节省一些时间。
避免一次性构建所有内容。例如,分离出独立的包并将它们卸载到设置阶段。
“内爆”有效载荷
使用增量测试运行程序,根据差异选择要执行的测试。缺点:测量测试覆盖率变得更加困难。另一个缺点是:Python 没有什么好处,在每个模块中导入半个世界是很常见的。
在多线程中执行单元测试。IO 绑定的测试套件应该过量使用线程,例如,我在两个内核上启动了四个线程,取得了巨大的成功。
以下内容有些显而易见,但值得一提:不要硬编码sleep()
-s。首先,因为总会发生硬编码值不够的情况,其次,因为这纯粹是浪费资源。如果你真的需要睡觉,把 tiny sleep()
-s 和出口支票一起绕成一个圈。
如果您的 CI 是按时间而不是按并行执行者来计费的,或者您的项目是开源的,那么您可以将单元测试分散到几个任务中,这样就不用在一个任务中执行 100%的测试,而是启动 5 个任务,每个任务执行 20%的测试。
给定作业时间公式 C + k * W,其中 C 是常数因子(引导、获取、设置),k 是线性因子,W 是已执行单元测试的量,如果将 W 分成 N 个大小相等的部分,CI 时间将减少到 C + k * W / N, 并且您将为 C * N + k * W 付费。增加 N 直到计费开销增加到可比值 C * N ~ k * W 才有意义,因此 N ~ k * W / C。例如:100%的测试需要 40 分钟,C 是 2 分钟。 N ~ 20。新的 CI 时间为 4 分钟。新的计费时间是 80 分钟。然而,一些统计水下石头建议较低的 N,进行到下一节。
元考虑
总有一个关键 CI 作业最后完成。下图应该看起来很熟悉:
总有一个关键 CI 作业最后完成。图片作者。
令人惊讶的是,仅仅优化平均作业运行时间是不够的。如果你能额外减少标准差,那将是最好的。以下是一些臭名昭著的例子:
作业运行时间的高标准偏差对总体 CI 持续时间的不利影响。作者图片。
夸张地说,假设我们有 20 个独立的 CI 作业,每个作业 90%的概率需要 5 分钟,10%的概率需要 10 分钟。所有工作在 5 分钟内完成的几率正在消失 0.9 ⁰≈12%.所以我们将在剩余的 88%中等待 10 分钟,即使平均作业运行时间只有 50.9+100.1=5.5 分钟。随着独立竞争情报工作数量的增加,挫败感也在增加。这种情况类似于大数据处理:数据中总有一个棘手的边缘怪癖会让你的 Spark 工作崩溃,让你从头开始。下面有一个奇特的理论,但我不会用数学公式来淹没读者。
我对保持低标准差的建议是:
- 限制对 web APIs 的请求。
- 依赖尽可能少的第三方。例如,重定向 pulls 到私有容器注册表,而不是探索公共容器注册表的速率限制。
- 比起磁盘 IO,更喜欢内存缓存。
- 处处设置严格的截止日期。
- 监控指标。
最后一点让我特别感兴趣,因为我的公司正在开发一个产品来计算和分析这些指标。所以我想出了以下三个:占有率,临界占有率,不平衡。
占有
占用率指标是作业运行时间总和与作业数量和最长作业运行时间的乘积之比。该比率始终介于 0 和 1 之间。0 表示绝对的资源利用效率低下,1 表示理想的效率。
占用率计算示例。作者图片。
入住率反映了 CI 套件整体的“密集”程度。我们(数百名)客户的平均 CI 占用率(第 95 百分位)为 0.58 。
临界占有率
关键占用率指标与常规占用率非常相似,只是我们丢弃了非关键类型的作业。如果至少有一个作业完成了父配置项套件中的最后一个作业,我们称该作业的类型为关键。根据我们的三个例子,关键的工作类型是不同环境中的单元测试。此外,docker 构建在第二个示例中也很关键。
临界占用率计算示例。作者图片。
关键占用试图排除快速,轻量级的工作,如林挺或建筑文件,只留下那些影响整体持续时间。这可能是对标准差严重性更公平的估计。
我们客户的平均临界入住率(第 95 百分位)为 0.61 。
不平衡
最后一个指标是最简单的:不平衡是最长和第二长的作业运行时间之差。
不平衡计算的例子。作者图片。
不平衡反映了通过优化关键作业来减少总体 CI 套件持续时间的机会有多少。如果不平衡值只有几秒钟,就很难通过“微优化”来加速 CI 反之,如果值几分钟,游戏就得不偿失了。
我们的客户平均不平衡(第 95 百分位)为3 分 48 秒。
警告
上面的 CI 图只是一个简化的模型。实际上,可能会有作业在其他作业完成时开始、隐式依赖 Dag 等。幸运的是,绝大多数不会配置如此复杂的场景。
像其他指标一样,占用率和不平衡可能是无意义和无用的。入住率可能在 0.4 左右…0.7,没有可操作的原因,或者当有几个相同的关键作业时,不平衡可能保持接近于零。它们就像软技能:有时有效,有时无效。
摘要
我将一个典型的 CI 工作建模为一系列的多个阶段:引导执行器、获取代码、设置环境、构建、执行有效负载、提交工件。然后,我为这些阶段提出了一些优化来减少运行时间。最后,我描述了“元”CI 优化,它降低了运行时间的标准偏差,并提出了三个相关的指标:占用率、临界占用率和不平衡。
像往常一样,我将感谢任何反馈和更正。请在媒体上关注我,以获得我下一篇帖子的通知。我写的是应用于软件开发工件的 ML/DS,Python,PostgreSQL。
另请阅读:我们如何优化 Python API 服务器代码 100 倍和我们如何优化 PostgreSQL 查询 100 倍。
如果你是一个渴望建立持续改进软件开发文化的工程领导者,请查看我们的 SaaS 产品网站。雅典人衡量 GitHub 上任何 CI 的占有率和朋友。
我的数据科学求职
原文:https://towardsdatascience.com/my-data-science-job-search-6deb4117e7b5
哪些有效,哪些无效,以及实用技巧
埃里克·普劳泽特在 Unsplash 上拍摄的照片
经过十年的高等教育、实习和工作之旅,我经历了系统生物学、清洁能源和电子显微镜,最终找到了自己的职业定位:可再生能源领域的数据科学家。你可能和我一样,一个差点不小心沦落到这里的人,没有受过正规教育(虽然我做了几年数据科学家后确实回到了学校)。去年夏天毕业后,我有一次寻找数据科学工作的有趣而深刻的经历,我想我应该分享一些我尝试过的事情,希望你能从中收集到一些对你有帮助的东西。这绝不是让你找到理想工作的“银弹”解决方案,而只是我在一个不断发展和竞争激烈的行业中的一些想法。
找到你的位置
有两个“啊哈!”我找工作的瞬间。第一个时刻幸运地发生在一周之内。数据科学是一个如此多才多艺的工具,以至于你几乎可以找到任何类型的公司想要雇佣某人。但是你想为一家大的科技公司工作吗?你的激情是在营销上吗?或者也许你和我一样喜欢解决工程问题。当然,我申请了几份只有“数据科学”头衔的工作,但是很多都是在我不感兴趣的公司。我的背景不一致,我的激情也不一致,他们能看出来。我没有收到他们任何一个人的回电。这里的建议是决定你想在数据科学职业生涯中做什么,找到你的激情,并申请这些类型的工作。
在搜索接近尾声时,工作邀请开始到来,但最令人兴奋的是一位雇主,他从第一次面试就告诉我,“在我们收到的数百名求职者中,你是我们最兴奋的人!”这并不是因为我有最令人惊讶的简历,而是因为这是一个真正的利基行业(半导体设备制造),我有理由着迷。
简历提示
第二个“啊哈”时刻发生在几周前,当时我申请了很多工作,但没有得到多少回应。我修改了我的简历,突然我一周内得到了两倍的面试机会,而申请的工作却更少了。以下是我做的一些具体的事情:
- 我创建了一个专业网站,在那里我放了一份职业陈述,我的完整简历,以及一些我参与和撰写的项目和文章的链接。你可以在这里看到。
- 在我的简历上,我在顶部加入了我的专业网站、LinkedIn 个人资料和 Github 的链接。
- 关键词改造!嘿,你的机器学习/数据科学职位的雇主最有可能使用 ML 来整理简历。让他们知道你能胜任 ML 的最好方法是什么?认识到他们可能在进行关键词搜索,在你的简历中充斥那些特殊的关键词,比如“数据科学”、“github”、“AWS”,或者你拥有的任何其他技能。
- 修剪脂肪。我总是在简历中保留一个名为“额外技能和兴趣”的小部分,在那里我会提到一些爱好。虽然这对于偶尔采访我的马拉松选手或音乐家同伴来说很棒,但它只是占用了宝贵的空间,对关键词搜索没有任何贡献。所以把绒毛拿出来。如果你被录用了,你会有足够的时间来联系你的爱好。如果可能的话,保持你的简历简洁。
我不确定这些变化中的哪一个突然引起了这么多雇主的注意。也许有一天当我在面试的时候,我会让你知道。但是这次简历修改把平均每周 50 份工作申请和 2-3 次面试变成了 20-30 份申请和 5-8 次面试。
追踪你的进度
如果没有跟踪我的申请和面试,我不会意识到这些“啊哈”时刻。每个人都有自己的体系;我会分享我的,但对你来说,做一些对你有用的事情很重要。
在我分享我的跟踪系统的细节之前,我想讲一个我找工作的快速经验。在我找工作的前几周,我在学校,没有认真找工作。我申请了很多我认为的工作,却一次面试机会都没有,这让我很沮丧。嗯,我没有跟踪我的申请,当我开始时,发现我申请了不到 10 家公司!现在,你们中的一些人只需要申请 10 个就能找到工作,但这真的只是一个数字游戏。通过跟踪你的应用程序,你可以看到什么是有效的,什么是无效的,如果你认为自己比实际做得更好或更差,给自己一些现实。
我个人在 Excel 电子表格中记录了所有东西。我有一个关于公司名称、职位名称和我在哪里找到这个职位的专栏(LinkedIn,实际上是公司网站,等等。).我有一栏是我申请的日期,5 栏是我面试的日期(我经历的最多的面试是 6 次),然后是“兴奋度”栏和“备注”栏。因此,当我申请一份工作时,我会记录基本信息,以便他们联系我进行面试时我可以追踪到它,给它一个 1-5 分的“兴奋度”,并写下我申请的日期。如果我有面试,我会记录日期和任何笔记。然后我写了一些 Excel 公式来跟踪我申请了多少份工作,我平均对那些工作有多兴奋,看看平均有多少份工作导致了一次面试,并做出曲线图。如果你对一个模板感兴趣,你可以在这里下载它。
示例工作申请电子表格的屏幕截图。作者的电子表格和截图。
最后,我建立了一个积分系统。我没有说“本周我将申请 20 份工作”,而是制定了一个目标来获得 X 分。对于我填写的每一份申请,我都会得到与兴奋度相对应的分数(这激励我申请你更感兴趣的公司,这些公司往往会做出更积极的回应),然后第一次面试 6 分,第二次面试 8 分,之后的任何面试 10 分。这个系统帮助我在面试时继续申请工作;如果我有很多面试,我会平静地接受这样一个事实,那就是我那个星期提交的申请没有那么多,而如果我没有很多面试,我可以提交很多申请。这个系统需要一些迭代来开发,所以继续下去,根据需要继续修改它!
学习适销对路的技能
在我找工作的时候,雇主们喜欢听到的一件事就是我在继续学习技能。比如我之前用过云计算资源,但不是专门用 AWS。嗯,我碰巧住在西雅图,在地铁上看到一些西雅图 AWS 技能中心免费课程的广告,所以我报名参加了一些。网上有很多材料,你甚至可以把代码片段或项目发布到你的 Github 上给雇主看。这一点是要承认,如果你只是整天申请工作,你可能会筋疲力尽。通过从事富有成效的项目和技能来改变现状,你不仅会在找工作时找到更多的满足感和多样性,还会获得脱颖而出的技能。练习一些编码题也是个不错的主意。我个人的经验是,大约四分之一的面试有编码部分,但这可能是独一无二的,因为我更多地是在寻找重视化学工程方面而不是编码方面的工作。
“给人留下深刻印象的着装”问题
如果你从事数据科学或机器学习,你可能是在申请远程工作。你的采访都是远程的。你可能会读到很多帖子,说你应该如何穿着才能给人留下深刻印象。这可能是个不错的建议,但我的经验是这没关系。我参加过一些面试,在这些面试中,我穿了一件有纽扣的衬衫和领带,在另外一些面试中,我只穿了一件漂亮的 polo 衫。很明显,你不想看起来像个邋遢鬼,但我收到了我盛装打扮的公司和我只穿了一件 polo 衫的公司的工作邀请。
感恩日记
每个人都明白:找工作很难。如果你正在读这篇文章,你可能是那些没有得到一切的人之一。你的求职可能令人沮丧。在我找工作的时候,我当然去过那里很多次。
几周后,我决定每天写下一件我感激的事情。有时这是一次很好的面试,有时这是一份让我兴奋的新工作,有时这是一句半开玩笑的话,比如“我很感激这一家公司没有给我一份工作,因为现在我意识到,它可能不适合我!”有些日子可能超级难找到值得感恩的事,但总会有。这样做有助于我在漫长的过程中保持清醒,如果你从这篇文章中学到了什么,我希望就是这个。
利用你的关系!
我会第一个承认我不是告诉你怎么做的最佳人选。但是我会用我大学时代的一个好朋友和同学作为例子。他已经毕业,在将近一年的时间里,他很难找到一份工程方面的工作。他决定给 AIChE(美国化学工程学会)的主席打电话,告诉他自己的故事。他不仅能够建立联系,而且能够利用这种联系找到他的第一份工作,并从那时起拥有了一份伟大的职业生涯。
所以利用你的教授,利用你的朋友。这可能很可怕,你可能会觉得你在占用他们的时间,但我相信你会发现他们不仅愿意,而且渴望帮你找到工作!这也可能有助于寻找本地工作——全国甚至世界各地的每个人都可以申请任何偏远的职位,所以可能很难脱颖而出;如果公司想找一个本地人来管理办公室,竞争范围会小得多。
这就是我的全部,而且对我很有效。我们都是不同的,有不同的背景和职业目标,所以这可能有用,也可能没用。如果是的话,我很乐意在 LinkedIn 上联系。一如既往,欢迎关注我的【T2 走向数据科学】,查看我关于数据科学案例研究的定期帖子。
我参加认证分析专家考试的经历
我参加认证分析专家(CAP)考试的一个小故事
免责声明 : 认证分析专家(CAP) 是通知提供的认证。虽然我是 INFORMS 的普通成员,但我与 INFORMS 没有任何其他联系。另外,请注意,如下所述,我在 2021 年注册了 CAP。从那时起,事情可能已经发生了变化。
介绍
一段时间以来,我一直在寻求获得数据分析证书。理想的证书应该:
- 进行在线考试,
- 与证明我已经完成课程的证书不同,
- 不是特定于技术、供应商或工具的。
要求(2)排除了 Coursera 之类的证书。不管在线课程有多好,我想要的是不同于在线课程的证书。我也想在短时间内获得一些东西,因此从一些大学获得一年(或更长时间)的课程也是不可能的。更不用说讨论这些项目的价格了。
要求(3)排除了 Azure 数据科学家协会、Hortonworks 的 HDP 认证开发人员认证、Qlik Sense 业务分析师认证等认证。不要误会我的意思,我不看不起以上任何一个。事实上,希望在未来,我会试着得到其中的一个(或更多)。那就是在给定的时间里,我想优先考虑一些不同的事情。
因此,在 2021 年年中,当我的雇主提出支付认证费用时,我决定接受 CAP。
关于认证分析专家认证计划
如 CAP 候选人手册所述,认证分析专家(CAP)是由 INFORMS 提供的认证计划。INFORMS 建立了一个流程来识别“有效提供(分析)服务所需的知识、技能和能力”。该过程产生了一个候选人测试的以下域列表:
- 商业问题框架
- 分析问题框架
- 数据
- 方法选择
- 模型结构
- 部署
- 模型生命周期管理
申请 CAP
应该注意的是,为了能够参加考试,必须满足某些要求。一个人应该接受 CAP 的道德准则,有教育证书和工作经验。详情可在 CAP 的网页上找到。于是,我创建了一个账号,提交了学历证明,提供了雇主的联系方式(后来我才知道确实联系到了我的雇主)。过了几天,我收到一封邮件,说我有资格参加 CAP,并支付了考试费。现在,我所要做的就是准备考试,然后通过考试。
为 CAP 学习
我接着下载了学习指南。快速地看了一眼,然后让它安静地躺在一个文件夹里。我的意图是在暑假期间为考试而学习。
在我休假的前几周,我打印了 CAP 的学习指南(我担心我是守旧派,如果可能的话,我更喜欢从硬拷贝学习)。我也在网上搜索了一些相关的课程。通知提供一些,但我在寻找更便宜的东西。Udemy,一个经济在线课程的普通来源,什么都没有。LinkedIn 有两门课程,我很幸运地被免费提供了一门。我看了它,但对我来说它似乎太排序,因为它在一两个小时内覆盖了几乎一半的领域。(课程很好,但在我看来,它主要可以作为复习或进一步阅读的指南)。
得知我的暑假学习计划进展不顺利并不奇怪。事实上,暑假后我计划为 CAP 学习到圣诞节,并在我的圣诞假期参加考试。
长话短说,到圣诞节时,我已经读完了 CAP 的学习指南。一方面是想尽快结束考试,另一方面是担心会失去考试机会(注意:我从来没有收到通知说要在某个特定日期之前参加考试,所以这种担心可能是没有道理的),我决定在新年后马上预订考试日期。我有点乐观,认为我有机会。这是因为当我在学习指南中测试自己时,我可以回答大多数问题。
注:我看来,上限网站进行了重大检修。现在有一些免费的网络研讨会可以帮助准备考试。
参加考试
在预约考试时,人们被要求下载一个特定的程序并在网站上注册。注册包括在键盘上敲几下句子,然后拍照。我在我的工作电脑上做了这个。然后,我决定改用我的个人电脑,因为我对考试程序与我的工作电脑上的安全软件的交互方式感到不舒服。
事实证明,这是一个正确的决定,因为即使在我的个人电脑上,我也必须关闭杀毒程序,才能让考试软件正常工作。不幸的是,我使用不同的键盘输入的内容没有被识别。谢天谢地,技术支持可以重置我的帐户,重新注册后,我准备好了。我还应该补充一点,似乎在整个考试过程中,他/她的摄像机都是活动的,他/她受到监视。事实上,当我的视频停止时,我就被打断了。
结果—最终想法
在我完成测试后,我被告知结果。我成功了!我还得到了每个独立领域的性能分析。
总之,我相信 CAP 完成了它的设计目标。尽管准备不足,我还是设法通过了考试,因为我必须依靠我的经验。此外,按领域划分的分数反映了我的工作经验。特别是,我在我工作较多的领域得分较高。它清楚地显示了我的优势和我需要学习的地方。至于对我的职业生涯有多大帮助,现在说还为时过早。我将不得不更新这个帖子。
我在谷歌、Meta、亚马逊的面试经历
原文:https://towardsdatascience.com/my-experience-interviewing-with-google-meta-amazon-2f0c8c9a2772
观点|与大技术的工程访谈
我学到了什么,以及你如何才能得到你的工作机会
杰斯温·托马斯在 Unsplash 上的照片
2021 年和 2022 年上半年是科技工作者的神奇时期。
疫情的经济复苏,“大辞职”和强劲的股市为软件工程师创造了几十年来最好的就业市场,疯狂的薪酬和令人敬畏的福利,如完全远程工作和无限的带薪休假。
尽管我喜欢 Glovo 后端工程师的工作,但我决定回到工作岗位,重新开始面试,我意识到这种难以置信的时期不会永远持续下去,我必须抓住这个机会。
尽管我只有不到两年的工作经验,也没有学位,但我还是经历了几个大公司的招聘过程,比如谷歌、Meta、亚马逊、Adyen、Skyscanner 和 Atlassian,并且收到了很多不错的邀请;以下是这次经历的总结。
随着许多科技公司经历一轮又一轮的裁员,伟大的辞职期似乎已经远去。照片由 Clem Onojeghuo 在 Unsplash 上拍摄
面试非 FAANG 公司
像谷歌或 Meta 这样的公司因其极具挑战性的面试而臭名昭著,但不要以为其他顶级公司的面试过程很容易,我认为 Atlassian 和 Skyscanner 的系统设计是我经历过的最具挑战性的步骤。
Adyen 是一家总部设在阿姆斯特丹的金融科技公司,以高薪酬和强大的工程文化而自豪,它是我面试的第一家公司,在开始大多数其他流程的几个月前,当我还没有准备好任何角色时,一位招聘人员就联系了我。
我面试了一名专注于数据角色的后端工程师,并通过了带回家的面试,面试包括一个普通的算法问题、一个 SQL 问题和一个要求我构建整个算法交易项目的最终任务。
虽然我在带回家的面试中表现得足够好,但我在现场面试中缺乏准备,很快我就收到了拒绝。
Atlassian 是负责开发吉拉、Confluence 和 Trello 等超级流行工具的组织,也是最值得工作的科技公司之一。
我通过推荐申请,一位招聘人员联系了我,他告诉我,由于缺乏足够的经验,我将被降级为初级。
我开始证明自己配得上一个中层职位,在算法轮次中,我表现得如此出色,以至于面试官极力要求我被考虑担任中层职位。
所以我被保留给非初级候选人的系统设计面试录取了,但我真的很挣扎,因为面试官是无情的,他不接受任何模棱两可的答案,并强迫我真正加强我的分析;回想起来,这是一次很棒的经历。
我不确定我做得够好,但谢天谢地,我得到了积极的反馈;尽管如此,我还是决定不从事行为部分,因为当时我能申请的唯一角色是在波兰,而我有兴趣在阿姆斯特丹或伦敦工作。
Skyscanner 是最受欢迎的航班搜索引擎之一,也是我经常使用的一款产品,我非常乐意接受他们的采访,我非常感激这个过程中的每一步。
该公司的一个特点是,你需要编写代码的管道的唯一部分是预筛选过程,该过程的其余部分非常专注于文化适应和系统设计,有两个行为和三个系统回合。
他们的面试总体来说相当困难,招聘人员向我承认,并不是小组中的每个人都同意给我及格分数,但是唉,他们还是决定给我这份工作!
这是我今年开始面试以来的第一份工作,它是巴塞罗那中级后端工程师中的佼佼者,诚然非常慷慨,但我决定拒绝它,而选择 FAANG。
Arthur Osipyan 在 Unsplash 上拍摄的照片
谷歌
谷歌的招聘过程从头到尾都是一片混乱。有趣的是,我通过网站 levels.fyi 的在线论坛和一个很棒的介绍电话联系到了该来源,并被转到加利福尼亚州森尼维尔的一个初级职位的面试,而没有经过在线评估。
事情开始变得奇怪了。我被介绍给一个招聘人员,从我的来源,并提交了我的虚拟现场可用性,直到我被告知这是一个错误,早期职业角色的来源需要提交一张票,等待系统匹配我,而不是自己找到一个招聘人员。
她照做了,我等了好几个星期,在请求每周更新的同时,我也在等着票的进展。
该消息来源声称自己无能为力,甚至无法查看机票的状态以及它为何停滞不前,最终最有可能的原因是我缺乏三年的经验和大学学位。
最后,她告诉我,她会将我的情况上诉给她的上司,但从那以后我再也没有收到任何答复,我将这次经历标记为拒绝并继续前进。
马頔·索罗明在 Unsplash 上拍摄的照片
元
梅塔的面试过程也很特别;我有在该公司工作的联系人,当我完成准备工作后正准备申请时,该公司在 2 月份冻结了几乎所有的招聘,我认为错过了机会,至少在 2022 年。
幸运的是,仍然有一些非常专业的职位空缺,如机器学习和生产工程师,加上一些非常有趣的发展机会,如“发现生产工程计划”。
生产工程师的角色介于软件、站点可靠性和平台工程之间,主要致力于开发可扩展至数十亿用户的可靠、高效的系统。
面试流程由通常流程的缩短版组成,只有四个步骤,包括在线预筛选、算法面试、系统设计/操作系统回合和最终行为部分。
我为这些面试做了疯狂的准备,就像许多其他有抱负的软件工程师一样,自从我开始写代码以来,为 FAANG 公司工作一直是我的梦想,我决定不会错过这个机会。
谢天谢地,面试相当容易,除了操作系统面试,我不得不在一个周末学习整个现代操作系统手册。
最终我得到了一份工作!它包括一份为期一年的合同,在加入一个全职团队之前,我将在伦敦办事处接受为期六个月的生产工程培训。
问题是,尽管我的薪水相当于一名中级工程师,但在我完成合同并获得新的全职工作之前,薪酬不包括任何股票,这取决于我的表现达到预期水平。我试图通过谈判来解决缺乏公平的问题,但这个角色根本没有谈判的余地。
这有点令人失望,但我意识到,包括福利在内,我将获得比现在多一倍的收入,所以最终我愉快地签下了合同,没有回头。
亚马孙
让我们解决房间里的大象,亚马逊作为雇主有一个可怕的名声,滥用和管理不善据称毒害了从仓库工人到工程人员的整个组织。
我自己过去在亚马逊面试时有过负面的经历,很多在那里工作的人也告诉我,那里的条件可能很糟糕。鉴于这一前提,我认为亚马逊是很好的面试实践,也是我在其他谈判中用作筹码的潜在还价。
我申请了巴塞罗那的一个中层职位,由于日程安排非常缓慢,整个过程从开始到结束花了几个月的时间,但我总体上很喜欢面试,并与面试官一起工作,特别是那些位于巴塞罗那的面试官。
关于亚马逊的另一个常见说法是,任何人都可以加入该公司,虽然他们的招聘人员确实非常积极地向每个人发送空缺职位的邮件,但面试过程非常严格,总体而言,这可能是我职业生涯中迄今为止最困难的选择。
我经历了在线评估、电话筛选,然后是由四轮组成的虚拟现场,第一轮是系统设计,其他是算法问题。
亚马逊现场的特殊性在于,每个面试官都会问你很多基于亚马逊领导原则的行为问题。这些都不是简单的问题,需要大量的准备和快速的思考才能令人满意地回答。
最后的反馈是积极的,我以优异的成绩通过了技术部分,但我对领导原则的回答显示我缺乏成为亚马逊中层所需的经验,因此,团队决定将我的职位降级为初级,但仍然给我这个职位。
这个报价仍然很高,甚至可以和 Skyscanner 的中级报价相媲美,超过了我对一个巴塞罗那的大三学生的期望。
也就是说,当时我已经接受了 Meta,继续做下去对我来说更有意义,但我离开时对雨林公司有了更好的看法。
伊斯雷尔·安德拉德在 Unsplash 拍摄的照片
外卖食品
申请和准备面试就像一份全职工作一样要求严格,有时我确实感到不知所措,处理我的工作,有时连续三天六轮。
理想的情况是同时获得多个报价,并在谈判过程中以此作为杠杆;虽然 Skyscanner 和 Meta 的报价很接近,但我仍然没有机会谈判,因为这两个报价都是最高的。
另一个有趣的收获是,一旦你进入面试阶段,你的课程和正规教育几乎无关紧要,没有人在乎我没有学位,尽管我在理论上有足够的经验,但我被亚马逊降级,被 Atlassian 升级,因为我能够在面试中证明自己。
一旦你迈出了第一步,你的知识和技能就是最重要的,不管你有多少年的经验、学位或训练营
我还想提倡练习的重要性,如果你在面试时惊慌失措,最好的准备也可能不够。
出于这个原因,我主张只要有机会就要经常练习面试,即使你对这家公司不感兴趣,你也应该考虑经历这个过程,这样当去你梦想中的公司面试的时候,你就不会因缺乏经验而痛苦。另外,你永远不知道你的最佳报价会从哪里来。
最后但并非最不重要的一点是,在久而久之越来越流行的软件开发中,沟通是一项至关重要的技能。
面试官很清楚这一点,他们会像关注面试内容一样关注面试的形式。我不能夸大清晰、令人信服地表达自己的重要性。
感谢你到目前为止的阅读,让我知道你是否对我写的其他文章感兴趣,比如如何准备技术面试,或者如何作为一名自学成才的工程师脱颖而出,或者看看我以前的帖子:
我感谢任何问题、评论和建议,无论是在这里还是在 Linkedin 上。
我在这个行业的第一份机器学习工作——这是我学到的东西
在过去的几个月里,我作为一名机器学习顾问,为一家令人惊叹的医疗人工智能初创公司工作
马文·迈耶在 Unsplash 上的照片
在花了一年时间构建我的数据科学简历之后,从写 medium 到 Kaggle 竞赛等等,我终于在大约 6 个月前找到了我的第一份机器学习咨询工作。我一直喜欢做机器学习项目,但我并不 100%确定我会把它作为一份全职工作来享受(然而,我做到了!).我不能说这是我所期望的,这也是我写这个故事的主要原因,来和你分享这美妙的经历。
首先,获得这份工作比预期的要困难得多。我的固定全职工作是软件工程师。获得一份全职软件工程工作也不是那么容易,但根据我的经验,这比获得一份机器学习/ DS 工作要简单得多。原因很简单:
- 与 ML/DS 工作相比,获得经典软件工程工作有更多的资源
- 软件工程有更多的机会
- 软件工程的学习曲线(当然在我看来)更容易,因为数据科学在某种程度上是建立在典型的编程技能之上的。
- 获得 ML/DS 工作似乎比软件工程需要更多的关系/参考
无论如何,让我们来看看最重要的部分,这是我在过去 6 个月里学到的:
- ML 项目很难定义和细化
ML 项目生命周期与典型的软件工程生命周期有很多相似之处。该公司与客户开了几次会,讨论客户的要求,提炼这些要求,估计完成这些要求需要多长时间和多少钱,最后给客户一个报价。
根据我的经验,提炼 ML 需求比典型的软件工程需求要复杂得多
这可能并不总是如此,请随时把你的经历写在下面。细化需求的很大一部分是了解这个需求是否可行,甚至是可行的。在机器学习的世界里,这很难讲清楚,因为这些需求更独特,不像典型的软件工程需求那样多。
例如,如果我正在为一个客户构建一个 web 应用程序,他们要求我构建一个多因素身份验证系统,即使这个需求对我来说是全新的,我也可以简单地在网上查找并评估它有多困难和复杂。然而,在 ML 的世界里,一个客户可能会要求你建立一个模型来评估一个初创公司的天使投资机会的质量。你要做的第一件事是将这些需求分成几个部分,如所需的数据,你将如何收集数据,你将建立什么模型,等等。但是,如果你以前没有这样做过,或者你只是没有太多的经验,你将不会在网上找到像其他典型的软件工程例子那样多的这样做的例子,这使得很难估计需求的复杂性。
2。开始过度设计你的模型是非常容易的!
机器学习非常令人兴奋,也非常新颖。作为一名热情的数据科学家,在解决问题时,我总是发现自己没完没了地阅读关于新模型的论文,以解决我正在处理的特定问题。虽然我通常没有那么好奇,并且我想尽可能务实地解决问题,但在解决 ML 问题时,这是很难保持的。这是因为通常没有太多的资源来比较这些模型,这取决于您阅读论文并对它们进行评估。但是,我得到的教训是,你必须在某处划清界限。
例如,如果有 15 种不同的模型可以解决这个问题,根据快速浏览/快速研究挑选出 5 种。然后仔细阅读和评估这 5 个模型,而不是对 15 个模型进行这一过程。把这个放在坚果壳里:
学会如何驯服你的好奇心!
不要误解我,好奇心不是一件坏事。但是,太多的时间有时会妨碍实际工作和按时完成任务!
3。不仅仅是你在努力细化需求,客户也在努力
尽管这在许多软件工程项目中可能是正确的,但我认为在 ML 项目中更是如此。客户发现很难给出具体的要求,因为他们仍然在探索和学习这个领域。他们也不完全确定可能性和特定需求是否可行,因此他们不想简单地给出任何需求,浪费他们的时间和金钱。
我认为这又回到了这个客户决定开始一个项目的最初原因。在软件工程中,典型的 web 应用程序有许多共同的特性,所以客户通常会准备好他们想要的东西。然而,在 ML 世界中,ML 项目之间的差异相当大。此外,可供比较和借鉴的例子也相当少。
在这种情况下,一个很好的行动是在 ML 项目中与你的客户进行更密切的沟通。
这意味着获得定期和持续的反馈,以确保您处于正确的轨道上,并致力于正确的需求。例如,如果你认为在一个软件工程项目中,一个有规律的两周的会议就足够了,那么在一个 ML 项目中,应该是每周一次。这有助于与你的客户建立更密切的关系,在大多数情况下,他们会非常感激。
结论
我可以继续谈论很多其他的小问题,但我认为这是最重要的三个。谁知道呢,在接下来的几个月里,我可能会想出新的点子。我还意识到,在漫长的简历制作过程中获得第一份工作是非常令人满意的!虽然我在两年前获得第一份软件工程实习时经历了同样的过程,但这更令人满意,因为构建数据科学简历需要更多的努力。很多人可能会认为这两份简历在很大程度上是相互关联的,我在某种程度上同意这一点。请在评论中告诉我你的想法。
如果您想定期收到关于人工智能和机器学习的最新论文的论文评论、高质量的 ML 教程等,请添加您的电子邮件此处 &订阅!
我最有用的数据科学技巧和诀窍
原文:https://towardsdatascience.com/my-most-useful-data-science-tips-and-tricks-da3c0c7930c7
分享一些关于数据科学建模和数据处理的有用提示
(图片由 Pixabay 上的 PublicDomainPictures 提供)
介绍
对于局外人来说,数据科学可能是一个令人困惑的隧道,夹在一个全是计算和假设检验的领域和一个全是计算机编程的领域之间。我们明白这一点,不要担心——我们也害怕。说到这里,对于那些可能对数据科学或计算机编程完全陌生的人,我在这里有一点阅读,可能会在 2021 年开始使用数据科学时提供一些更准确的信息(去年没有太大变化。)
[## 2021 年如何闯入数据科学(8 步)
towardsdatascience.com](/how-to-break-into-data-science-in-2021-8-steps-87cb02a4a1f4)
无论如何,在这些年的巫术实践中,我遇到了一些小趣闻,我想与大家分享。这些是我现在第一次做的典型的事情,因为当你去做的时候,注意这些方面比回头去修复它们容易得多。当它们对模型的设计至关重要时,情况尤其如此,因此这些提示中的许多对于防止对模型或其训练数据进行戏剧性的重新设计可能是至关重要的。
№1:注意类型
当探索来自对给定特性的下一次观察的整个数据和知识世界时,很容易忘记自己完全是在编程。作为数据科学家,总有一些人可能更喜欢数据科学技能集的某些部分。例如,一些数据科学家可能喜欢建模和构建神经网络,但讨厌数据处理。
有一件事会使事情变得容易得多,特别是当涉及到使用具有类型系统变化的语言时,那就是不断地监控你的类型,或者使用一个允许你这样做的数据管理框架。例如,我们可以使用 astype()将一个系列转换为一种数据类型(将系列中的值转换为一种数据类型),并且我们可以通过以下方式获得当前数据类型:
df.dtypes
df.astype(Int64)
在 OddFrames.jl for Julia 中,我们也使用了 dtype()函数,但是语法略有不同。我们还使用可变版本 dtype!()以便将此类型转换为我们的数组。我们也可以通过为一个类型设置一个索引来做到这一点。:
od.dtype(:column)
od.dtype!(:column, Int64)
在 DataFrames.jl 中,对于我们的最后一个例子,我们可以通过
eltype.(eachcol(df))
如果你使用的是动态类型的语言,如果你从事数据科学,你很可能就是这样,那么你可能需要关注那些类型特别弱的语言中的数据。当类型是弱类型而不是强类型时,如果您想了解更多关于弱类型或隐式类型的信息,我这里有一整篇文章:
所有这些弱/强或隐式/显式意味着编译器将基于其编译或解释算法显式或隐式地控制类型。换句话说,有些数据可能会在您不知道的情况下改变类型。
№2:花更多时间测试
我能提供的另一个很好的建议,尤其是在建模的时候,是做更多的测试。测试是确定两个值之间有多大关联的唯一可靠方法。
测试你将在模型中使用的特性,观察排列,考虑每个特性的重要性。所有这些都可以形成一个更好的模型,并且可以减少花在绞尽脑汁想为什么这个模型不起作用上的时间。现在一头扎进笔记本,让你面前的数据符合你的模型,这可能令人兴奋,但耐心是一种美德。当涉及到数据科学时尤其如此,因为在测试和处理数据时,您的发现过程通常会指导您的整个项目。
№3:花更多时间处理
可能我最不喜欢的数据科学技能是数据处理。尽管探索数据很有趣,处理数据也很轻松,但也可能令人沮丧——尤其是在管理框架不够完善,或者数据没有正确保存或查询的情况下。是的,这是真的,我们都有这样一个文件,它将我们的整个文件读入一个数据帧的一个观察值中。那是糟糕的时代,但是不管处理数据和数据工程对某些人来说有多无聊,它都是数据科学过程中至关重要的一部分。
拥有完全干净的数据可以消除数据中的一些差异。很多时候,一组特定的连续样本的范围实际上根本不能反映整个特征的性质…用不太通俗的话来说,我们称之为异常值,但我的观点是,将列命名为正确的名称、特征工程、特征压缩、分解,所有这些对于在给定模型上获得最佳精度都至关重要。也就是说,大量的时间,甚至可能是永恒的时间,可以用于处理一个数据集,所以明智的做法是先了解一下什么时候有一些好的特性,什么时候没有。
№4:去掉无关紧要的功能!
我对数据科学的第四个有用的建议是去掉无关紧要的特性。在我们的训练数据集中,有一些因素会对每一次观察产生显著的影响。也就是说,无论 n 是二十还是两亿,每个观察值对最终成为回报的结果都很重要。
无关紧要的特征是不重要的特征。有些人可能认为将所有的特性放入模型中是有意义的,因为模型可能会辨别出哪些特性的权重更大或更小,事实就是如此。然而,当试图获得更高的验证准确性时,以错误的方式将模型放在数据之上会导致很多麻烦。
总的来说,拥有太多的要素而没有足够的数据来正确连接权重会导致过度拟合现象。许多建模都归结于平衡偏差,这样模型才适合于适量的数据,而不会使模型过拟合或欠拟合。为了更好地完成这项工作,通常会使用分解,但是在大多数情况下,抛弃无关紧要的特性可能比进一步处理它更好。如果您想阅读更多关于分解的内容,我有一篇关于奇异值分解的文章,这可能是对分解及其用途的很好的介绍:
[## 深入奇异值分解
towardsdatascience.com](/deep-in-singular-value-decomposition-98cfd9532241)
№5:从基线开始工作
数据科学家的一个良好实践是始终从基线精度预测开始。这有几个主要原因,第一个原因是,它为我们提供了一个良好的起点,让我们知道如何实现准确性。同样,它会给我们一个很好的想法,关于我们可能要处理的特性的深度。例如,如果我在二进制预测中使用多数类基线,并看到准确率约为 50 %,我可能会指出我的数据框中只有两个类别。不用说,这可能表明一种布尔特征类型,以及一种理想的一次性编码方法。所有这些信息都可以从简单的基线中提取出来。
使用基线的另一个原因是看你是否真的需要一个模型来预测这个特征。在某些情况下,运行一个模型可能根本没有意义,比如你预测一个反应,是或不是。
y = [0, 1, 1, 1, 1, 1, 1, 1, 1, 1]
该双数组表示响应,0 表示否,1 表示是。我们的 n,观察总数,这里是 11。在这 10 个值中,只有一个是零。在本例中,这代表了 10%的数据。因此,如果我们在这里不使用模型,只是每次都猜这个值是 1,我们在 90%的情况下都是正确的。在某些情况下,这个数字可能会高得多。为不需要模型进行预测的特征拟合模型是没有用的。
№6:使用验证集
一些真正有助于改进模型的建议是使用验证集以及测试和训练集对两个不同的数据样本进行预测,这对于数据科学来说无疑是一种很好的实践。验证集给出了一个基本目标,以及我们模型的一个相当精确的演示,虽然它可能不会过拟合。
在建模时,验证集有助于完成许多不同的事情。首先,它缩小了样本大小,这将意味着特性的重要性,以及特性的数量都将在建模时更能代表特性本身。除了常规的训练和测试集之外,使用验证集的唯一缺点是,由于没有足够的数据来填充神经元的权重,您的模型可能会不足。
№7:争论时,选择好的功能
我想分享的最后一个关于数据科学的惊人技巧来自于数据科学过程的早期,那就是数据争论。在我看来,数据争论可能是现代数据科学过程中最困难的步骤之一。有了许多不同的东西,例如预测建模和矩阵数学,我们能够使用依赖关系来加载 Python 中的快速 C 脚本,并且大多数对 Python 来说太慢或者编程工作量大的东西都被导入并用作依赖关系。
然而,数据争论就不是这样了,因为数据争论通常需要某种定制的脚本,或者保存数据然后加载的方法。也就是说,争论数据可能非常困难。当争论数据时,我的建议是以尽可能干净的格式争论数据。如果可能,在构建保存数据的结构时,扫描缺失或荒谬的值。先发制人地完成所有这些是一个好主意,因为这将保持数据本身的干净,并使您未来处理数据的工作变得容易得多。就像在常规处理阶段一样,这里的一点点数据工程可以节省后期大量的时间!
结论
数据科学有如此多的来龙去脉,很容易理解为什么它对一些可能有兴趣加入该领域的人来说是势不可挡的。然而,按部就班地看待事物,并着眼于每个单独的方面,对于建立足够强大的知识基础以促进伟大的数据科学技能会有极大的帮助。
这篇文章包含了我多年来作为一名数据科学家所学到的七件事。我来自一个更传统的计算机科学/软件工程背景,这其中的一些部分花了很多时间去学习,只是因为从来没有人告诉过我。正是因为这个原因,我现在将这些话传达给你,所以我希望这些小技巧在你的数据科学之旅中派上用场。感谢您阅读我的文章,祝您有愉快的一天!
我在 Julia 中创造性地处理大数据的新大脑方法
我想出了为了应用表达式来压缩内存中的大量数据,让我们来看看吧
(图片由 Pixabay 上的 DamianNiolet 拍摄)
简介——记忆问题
随着更新的编程语言 Julia 速度的提高,似乎一切皆有可能。当然,有些事情是无法做到的,无论人们试图在 Julia 中采用什么方法,我的意思是很难想象这种语言有像 FORTRAN 这样的数字能力。然而,这种语言因为如此高级而变得非常非常接近,这真的令人印象深刻。
我现在发现我的硬件限制已经发生了巨大的变化。过去的情况是,虽然我有一个支持 CUDA 的显卡和一个相对较好的 8 核处理器,但像 Python 这样的语言确实没有利用这一点。通常,当处理相当大的数据集时,Python 的核心问题就开始出现了。首先,Python 并没有真正考虑到处理器/显卡并行计算。怎么可能呢?在最初设计这种语言的时候,最好的图形卡可能是由 VOODOO 制作的,像 OpenGL 这样的图形 API 还处于起步阶段。这是使用像 Julia 这样的现代语言的好处的一部分,他们能够在头脑中计划语言的设计。甚至仅仅使用处理器的并行计算对于 Python 语言来说也是相对较新的。
考虑到这一点,我现在发现,当涉及到数据和建模时,最大的瓶颈是内存,至少对于我的系统是这样,我想其他人也是这样。当然,其中一些肯定与我的计算机的规格有关,我也将与您分享我的硬件描述符:
(图片由作者提供,我也非常确定我的处理器上的 8 个核心更像 AMD 推土机/piledriver 核心,它们是虚拟的,而有 4 个物理核心。)
在 2022 年,8g 内存是一个相当低的数量,但通常这不是一个很大的障碍,直到它可能成为其他人的一个大障碍。事实上,朱莉娅宠坏了我们。我知道我可以通过一些东西传递 5000 万个观察结果,没有问题,没有评论,也没有来自我的处理器 Julia 的顾虑,没问题。然而,我经常碰到的是记忆的极限。
也就是说,我想探索一些将整个特性的观察结果分解成某种“规范形式”的想法,并且我开始研究这些主题。我在保存记忆的方法方面的发现非常酷,所以我认为这可能是一个有趣的阅读,看看我学到了什么,另外还有一个我自己想出的非常好的主意。所有这些代码都是我的项目 OddFrames.jl 的一部分,odd frames . JL 只是 Dataframes.jl 的一个替代品,具有更多的功能,我几乎准备好发布这个包了。如果你想了解更多,或者浏览这个包,这里有一个 Github 页面的链接:
https://github.com/ChifiSource/OddFrames.jl
代数表达式
当我探索像这样的科学应用程序的数据压缩概念时,我遇到了惰性数组的概念。我当然知道懒惰类型的存在,但并没有真正意识到这种类型的含义和能力。我还写了一篇关于这些类型的数组的文章,以及为什么它们如此酷,但在涉及到通用数据科学应用时也有一些问题。以下是我最初文章的链接:
自从那篇文章之后,我进一步发展了惰性数组的实现。构造函数现在是基于函数参数的。Julia 有一个惰性数组包,但是构造函数语法并不是我想要的,这更像是个人的事情,但是我最终还是在我的实现中添加了一些新函数,使得这个选择更有意义。此外,我还将随后的所有代码复制到一个笔记本中,这样我的数据科学读者就可以更容易地接触和测试这些代码,如果您愿意的话,Github 上有这样一个笔记本:
现在,相对来说,这些阵列相当健壮。我还希望这些类型能够适合另一种类型,这一点我们将在后面讨论(这可能是这个实现真正酷的原因。)新函数包括迭代能力、添加到计算表达式的能力,以及通过 compute()方法按索引进行计算的能力——现在由 getindex 调用。这个项目的代码都可以在下面的 OddFrames.jl 库中找到。让我们看看我的这个类型的实现,现在称为代数数组,在代码中是什么样子的。
mutable struct AlgebraicArray
**f**::Function
**n**::Int64
**calls**::Vector{Pair{Function, Tuple}}
function AlgebraicArray(f::Function, n::Int64)
new(f, n, [])
end
end
构造函数非常简单,并不需要太多的基类型。在我看来,这更像是一个大纲——我们可以用它作为模板来构建一些非常独特的类型,我们将在后面看到。我之所以将其描述为模板,是因为在大多数情况下,测量值需要保持连续的线性,才能从中获益。在大多数情况下,对真实世界的数据做类似的事情将需要系数,这违背了整个目的-因为存储表达式和东西最终只会占用更多的内存,而系数占用相同的内存量。这是一个相当有趣的问题。
这个结构有三个字段,上面用粗体突出显示,第一个是函数 f。这个函数只是我们使用的任何类型的数据的生成器。每当调用另一个方法 compute()时,首先调用它。最后一个字段是 calls 字段,它是数组中的一系列对,表示函数调用和附加的位置参数。需要注意的重要一点是,这些函数是在迭代计算每个值时调用的,不是整个数组。同样,这些应该是值可变的,所以值应该在所有表达式中放在第一位。下面是生成这些对的实际函数:
function **add_algebra(aa::Symbol, args::Any)**
aa = eval(aa)
if length(args) > 1
farguments = Tuple(eval(args[length(args)]))
**push!(aa.calls, eval(args[1]) => farguments)**
else
**push!(aa.calls, eval(args[1]) => [])**
end
end
记住不要强调这里的细节,只要记住我们的输入和输出。我们这里的输出是突变,通过推!aa 的,作为一个符号提供给我们。我还没有在一个模块的作用域而不仅仅是一个主作用域中测试这个特性,因为这个特性还在构建中,所以对 aa 的评估可能会导致该符号不存在,在这种情况下,我只需要使用一点内省技巧。顺便说一句,你可以在我写的关于这个主题的文章中读到如何用元编程来做这件事:
该函数提供了我们的数组作为一个符号,和参数,这应该是另一个符号子集。这几乎就是为我们生成每个单独调用的方法调用。接下来,我们将看看与此绑定的宏,也就是@代数!宏观。
**macro algebraic!(exp::Expr)**
args = copy(exp.args)
aa = exp.args[2]
deleteat!(args, 2)
**add_algebra(aa, args)**
**end**
这里非常简单,宏只分离我们提供给方法的第一个参数,它应该是我们的代数数组,然后把它和其他参数一起传递给 add_algebra。下一个函数有点不相关,但非常简单,我们将看到所有这些是如何立即结束的。此方法只是基本生成器,它使用 generator 函数生成值,直到数组的长度:
function generate(aa::AlgebraicArray)
**[aa.f(n) for n in 1:aa.n]**
end
这个函数也有接受整数、范围甚至 bitarray 的绑定——尽管我在让 bitarray 工作时遇到了一些麻烦,尽管我认为这很容易,因为在这个数组上有比一个索引类型更重要的东西要处理。
function generate(aa::AlgebraicArray, range::UnitRange)
if range[2] > aa.n
throw(BoundsError(string("Invalid algebraic index, ", string(range[2],
" on algebraic expression of length ", string(aa.n)))))
end
**[aa.f(n) for n in range]**
end**function generate(aa::AlgebraicArray, index::Integer)**
if index > aa.n
throw(BoundsError(string("Invalid algebraic index, ", string(range[2],
" on algebraic expression of length ", string(aa.n)))))
end
**aa.f(index)[1]**
end
由于生成器函数通常会返回一个值数组,这就是我们用 1 来索引它的原因。这些调用之间唯一真正改变的是函数调用的最后一部分。我们要看的最后一个函数是计算函数:
function compute(aa::AlgebraicArray)
**gen = generate(aa)**
for call in **aa.calls**
**gen = [call[1](val, call[2]...) for val in gen]**
end
**return(gen)**
end
这个函数将所有其他函数包装成一个,首先它生成我们的基值,然后将 aa.calls 中的所有后续调用应用于其中的每个值。OddFrames.jl、bitarray、range 和 index 中的所有常规索引也有一个绑定。
function compute(aa::AlgebraicArray, **r::Any**) # <- range, bitarray
gen = generate(aa, r)
for call in aa.calls
gen = [call[1](val, call[2]...) for val in gen]
end
return(gen)
end
由于 generate 能够为我们指明哪个是哪个,并且这两个函数都将返回一个具有多个元素的数组,所以我在这里传递 Any 以避免必须编写两次该函数,因为除了 generate 中的调用之外,所有调用都是相同的。这与整数略有不同,因为我们不需要遍历 gen 中的值,如果我们试图迭代一个整数,我们会得到一个 MethodError。我相信你可以假设这个函数和一个单一指数的函数之间的细微差别。最后,还有一个函数的调度调用,然后是带有 compute()的代数数组。有趣的是,一个随机的行内注释告诉你这个函数实际上是在什么上下文中使用的:
function compute(f::Function, aa::AlgebraicArray) **# compute(aa) do _**
gen = generate(aa)
for call in aa.calls
gen = [call[1](gen, call[2]...)]
end
return(f(gen))
end
这允许我们加载数组而不将它保存在内存中的语法。例如,让我们看一个均值函数,它将计算这种类型的均值。考虑一下,将整个值加载到内存中,尤其是在全局范围内,可能会很成问题。例如,如果我们想使用来自车床. jl 的 mean()函数,我们当然可以这样做
mu = mean(compute(aa))
然而,这将所有这些加载到内存中,并且都是在 mean 的上下文中。结果可能会被缓存,我们并不真正控制内存中代数数组的状态,我们把这一切都交给了垃圾收集器。如果我们做了
mu = compute(aa) do array
mean(array)
end
然后我们从一个全新的、临时的、匿名的函数作用域中获取这个值。此外,我们可以一次应用更多的操作,而不必为每个操作计算 aa,或者将 aa 加载到我们的全局环境中。在像这样的高级动态语言中,一旦数据被全局定义,唯一的处理方法就是隐式的。在朱莉娅时代,我们已经删除了!(),很容易看出为什么这样的函数现在被弃用了。请记住,在我们的环境中管理这些值的内存状态的最佳方式是,首先不要将它们放入环境中,而是只私下处理这些值。
当然,在这种类型上仍然存在 getindex()的绑定。同样,iterate()也有一个绑定,它只是将生成的数组的值除以 1。当它离成为常规的可迭代数组只有一两步之遥时,这是一种使简单迭代工作的简便方法。因为 compute 和 generate 函数已经可以通过 index 进行计算或生成,所以索引就像通过 compute()函数绑定任何传递的索引一样简单。虽然这造成了 MethodErrors 的缺点,有点令人困惑,但由于 OddFrames 中的索引在扩展基本 Julia 类型索引的程度上是通用的,这在整个包中是一致的,因此在这里假设参数很容易。
function iterate(aa::AlgebraicArray)
ret = Iterators.partition(compute(aa), 1)
endgetindex(aa::AlgebraicArray, i::Any) = compute(aa, i)
履行
现在我们已经看完了我的代数数组,让我们看看它在类型中的实现。让我们来看看一种新的 OddFrame 类型,代数编码帧:
mutable struct AlgebraicOddFrame <: AbstractAlgebraOddFrame
labels::Array{Symbol}
**columns::Vector{AlgebraicArray}**
types::Array{Type}
head::Function
dtype::Function
not::Function
only::Function
drop!::Function
dtype!::Function
merge!::Function
only!::Function
**compute::Function**
# Super
function AlgebraicOddFrame(labels::Vector{Symbol},
columns::Vector{AlgebraicArray},
types::AbstractArray)
length_check(columns)
name_check(labels)
head, dtype, not, only = member_immutables(labels, columns,
types)
drop!, dtype!, merge!, only! = member_mutables(labels,
columns, types)
compute() = OddFrame([label[i] => compute(columns[i]) for i in enumerate(labels)])
**compute(;at = 1) = [label[at] => compute(columns[at])]
compute(r;at = 1) = [label[at] => compute(columns[at], r)]**
**compute(r = 1:columns[1].n) = OddFrame([label[i] => compute(columns[i], r) for i in enumerate(labels)])**
new(labels, columns, types, head, dtype, not, only, drop!,
dtype!, merge!, only!, compute)
end
我知道代码很多。
这里我们真正需要注意的是附加函数 compute()和列的新数据类型。我想我可能会删除这里除了 compute 之外的所有成员函数。这是因为在这个上下文中,我可能会为 compute()函数绑定一个类似的函数。换句话说,由于 compute()返回一个常规的 OddFrame,我认为只使用
aod.compute() do od
od.whatever()end
也就是说,head()等函数除外。我可能会将 compute()定义导出到一个类似的 algebra_members()函数,该函数也可能会为此类事情提供绑定。真的,当涉及到 head 这样的函数时,只需要做微小的改变,可能不是对函数本身,因为通常这些只调用索引。
虽然我们可以通过它的构造函数直接调用 OddFrame 的代数版本,但我认为真正的力量将来自于根本不这样做。相反,对于这种类型的一些有趣的构造函数,我有两个命题想法,第一个使用机器学习。你看,问题在于,像这样的大量数据很难浓缩成一个单一的数学表达式。正如我前面提到的,通常这方面的任何事情都需要使用某种系数,这完全消除了试图将值存储在更少数据中的目的。
MLOddFrame
这时候我突然想到。整个数据科学领域都是关于预测事物的,虽然数学表达式(如用于代数编码框架类型的函数)是精确的,但在许多情况下,只预测重复的值可能是有意义的。这让我想到了我的第一个真正高级的实现,MLOddFrame。到目前为止,这已经写入 OddFrames.jl 包中,尽管它实际上并不做任何事情,而且我还为它写了一个构造函数——这是一个奇怪的选择。相反,我希望有另一个完整的包,一个扩展,这是唯一的 MLOddFrame。这使得管理预编译时间变得容易得多,因为不是每个人都想在预编译数据管理包的同时预编译机器学习包。
同样,我们真的不需要定义任何类型。我们可以使用闭包函数来维护任何类型的名称定义,在实际计算 OddFrame 时,我们可能会用到这些定义。有趣的是,我实际上写了一整篇关于这个概念的文章,其中我谈到了这个令人不安的细节。如果你对这样一篇文章感兴趣,这里也有一个链接:
这是一个一般的想法,因为在 OddFrames 中已经有了对一个代数编码帧的绑定,我们将只在一个不同的别名下为一个代数编码帧创建一个构造函数。在这个构造函数中,我们允许传递一个参数来决定要训练多少数据,以及我们想要使用什么模型。如果我们使用 Lathe.jl,我们可以通过这些参数传递整个管道。
function MLOddFrame(catmodel::Any, conmodel::Any; split = .25)end
当然,需要有一个特征类型的模型,我也有可能在这种情况下使用框架组类型,因为我们可以说——评估准确性,并决定我们是否应该使用模型来预测数据。在某些情况下,我们可能不想这样做。可能应该有一个参数来决定是否这样做,或者可能有一个完全独立的构造函数,因为它会极大地改变这个方法的返回。这将数据的维度降低到预测它的权重,这肯定会大大降低。
那么第二部分就像知道数据总长度一样简单,这将取决于我们正在构建的上下文。最后,最后一部分只是一个函数,它的定义将在这个函数中进行,保留函数中所有已定义的名称,比如我们的模型。最后,将该函数与 n 一起返回到一个新的代数编码框架中。
StreamOddFrame
StreamOddFrame 将遵循 MLOddFrame 中相同的原则,它是基本 OddFrame 的扩展,并使用闭包函数来保存名称。唯一的区别是,StreamOddFrame 将有一个直接从数据文件中读取的函数。例如,我们有一个包含超过 500,000,000 百万个观察值的 CSV 文件,我们的函数根据需要将每一行读入 OddFrame。此外,我确信类似这样的事情也可以用其他流来完成,比如 HTTP 流,这可以打开使用套接字创建 OddFrames 的远程客户端实例的可能性。
优点,缺点
这里最明显的优势就是我之前提到的,内存。这里的工作是有效地将大部分(如果不是全部)数据保留在内存之外,特别是在全局范围内,但仍然允许您访问所有数据,就像数据在内存中和全局范围内一样。这样做的明显缺点和问题是计算。然而,有了这个交换,我认为用 Julia 写的这个肯定有它的应用。
此外,我们可以序列化这样的数据,并引用其他地方的所有计算,这一事实非常有价值。有时,您可以计算没有终端超时的东西,这肯定会杀死您的 Jupyter 内核,但显然 Jupyter 内核的便利性很高,作为数据科学家有非常好的理由使用它。最后,一旦这个包发布,引用远程计算肯定是我将作为扩展写入的内容。也就是说,虽然这有一些缺点,但我认为能够在任何地方引用这种计算的能力通常可以一起减轻或消除这些缺点。
MLOddFrames 的另一个显著缺点是使用 ML 预测数据可能会产生不准确的结果。同样,可能应该有某种方式来查看、过滤和调整特性是否以物理方式表示,作为其自身的样本或整体,或 MLOddFrame。幸运的是,当我实际编写所有这些内容时,OddFrames 支持在单个类型中包含多个框架,并且有自己方便的方法来处理这些类型。
结论
因此,我有一套将基于代数/惰性表达式的数组实际应用于现实世界数据的概念。虽然这是我相信我将要追求的两个想法,但我确信这类事情还有更大的潜力。例如,我们甚至可以有一个框架,在评估时通过请求来填充。因为核心思想是一个函数,它可以是一个闭包函数,实际上可能性是无限的。
感谢您阅读本文,我希望您发现其中的一些概念和想法令人兴奋。目前,我正致力于使 OddFrames.jl 接口作为一个整体,包括代数编码框架,更加健壮。我很快就要发布这个包了,这非常令人兴奋!不用说,一旦我真的完成了,这将是非常有用的。我真的为这个项目的结果感到兴奋,但主要是我只是兴奋地在我自己的项目中使用它的能力,一旦它是稳定的。
我的预测建模和学习“分步”过程技术
概述了我将数据转化为机器学习模型的不同步骤
介绍
从表面价值来看,预测建模和数据科学可能会令人望而生畏。当谈到预测建模时,为了有效,可能需要学习很多词汇和基础知识。随之而来的是一些统计知识,数据处理,还有很多。那么,一个实质性的问题是,我们刚刚讨论的所有内容需要协同工作,以创建一个单一的结果、一个准确度分数及其关联模型。如果不调查返回后数据可能有什么问题,所有这些事情也很少或没有任何推论。
数据科学领域提供的所有这些知识的复杂性和多样性肯定不会马上下载到某人的大脑中。人们不可能列出一堆方法名,然后期望有人马上永远记住它们。也就是说,一个人学习数据科学的任何部分或任何东西的一个很好的方法是,通过将每个大的任务分成小的任务来完成。今天,我想把我通常用数据和建模完成的任务进行划分,然后一步一步地安排它们,并解释我通常如何完成每个目标的细节。
第一步:数据争论
数据科学过程的第一站是让我们争论数据。“争吵”只是一个词,在这种情况下意味着收集。在这一步中,正如标题所暗示的,我们从各种来源收集数据。尽管一个重要的预防措施是确保您的数据是您的软件实际上可以读取的格式,但是所有这些数据通常都不是非常组织良好的。
数据争论通常非常简单,但肯定有一些细微差别和需要了解的事情可以节省大量时间和精力。我的第一条建议是,只争论你需要的数据,并且总是将数据输出为某种非专有的传统数据格式,比如。比如 CSV。这将允许你的项目中的数据是可复制的,如果你想拒绝或接受无效假设并做其他科学的事情,这肯定是合适的。在某些情况下,甚至可能不需要这一步,因为您可能正在处理已经存在于这些类型的文件中的数据集。
一般来说,每当我们争论数据时,我们的目标并不是用任何方法来保持数据的干净,而是仅仅将数据转换成某种可读的输入,然后我们可以对其进行处理。然而,您可以节省一些时间,潜在的存储空间,或潜在的内存,在这个过程中花一点额外的时间来清理您的数据。虽然这并不是每个人都做的事情,也不是必须的,但是它可以为你节省很多时间,包括整个下一步。
对于使用 Python 的人来说,这一步我要做的是数据收集的方法,比如 requests 模块或 ScraPy。如果您完全是新手,我建议您跳过这一部分,下载一个. CSV 或。网上的 JSON 文件。
第二步:预处理
数据的初始预处理不要太多。如果有像“日期”、“姓名”、“id”或类似的完全没有用的特性,那么最好也把它们去掉。您使用的功能越少,您需要执行的步骤就越少。然而,您拥有的具有统计学意义的特性越多,您就越有可能从您的项目中获得一个优秀的模型。
可能在预处理阶段需要做的最大的事情是从数据帧中删除丢失的值。如果我们在其他任何时候这样做,很可能我们所有的函数在遇到缺失值时都会返回错误,同样,在我们分割我们的特征后,我们会有多个名字充满了这样的缺失值。
对于 Python,您可能希望熟悉 Pandas 的 df.drop()函数和 df.dropna()函数。这两个函数可以分别用于删除列和丢失值的观察值。
第三步:分析
我通常采取的第三步是分析。既然数据至少能够被查看而不抛出错误,我们应该深入研究每个特性。如果我们的数据在头脑中已经有了一个目标,这是通常的情况,那么尝试分析可能更相关的特征——或者非常有效地证明与您的目标更相关。找出其中的古怪之处,找出平均值,最常见的值,有多少个类别,诸如此类的东西。在分析完所有特征后,您应该有一些您认为与值非常相关的特征,这将有助于下一步。
对于 Python 程序员来说,在分析任何数据之前熟悉 numpy 和 scipy.stats 可能是个好主意。通过 matplotlib、seaborn、plot.ly 等实现可视化。也是快速了解更多特性的好方法。在此期间,继续进行并拟合基线模型也是一个好主意。一个基线模型将会让你更容易知道这个特性有多难生产。更重要的是,它会给你一个坚实的起点。
步骤 4:特征选择
下一步是特征选择。特征选择可能是整个建模过程中最重要的步骤之一。这是因为这些特征是建立一个能成功预测你的目标的模型的绝对关键。不良要素会导致不良预测,因此要素选择和要素处理可能是最难的两个部分,也是对模型影响最大的两个部分。
在此期间,从数据分析中得到的测试可以用来提供最有价值的特性。这也是您可以设计功能的地方。为什么您应该设计功能?工程特征是降低输入数据维数的一种好方法。如果你有两个特征,例如我们正在研究松果,我们有三个特征,宽度,高度和深度。我们可以将它们一起乘以体积,体积可能会比单独的特征更好地累积这些特征的强度。我的意思是这样想。
一个高 10 厘米,宽 6 米的松果有多大?相比之下松果的体积是 60 立方厘米。第二个是我们可以立即评估和比较的一个值。这样的例子在机器学习中比比皆是,特征选择很重要,因为它创造了这些价值。所有这些通常都是手工完成的,或者通过索引来完成。过滤值可以通过 pd 完成。DataFrame[BitArray]。获取数据帧上 BitArray 的索引只会删除基于条件的值。您还可以在这里使用映射函数将掩码映射到值。掩码只需要返回 0、1 或真/假值。
步骤 5:特征处理
我的数据科学过程的下一步是特征处理。特性通常需要编码、标准化和类似的重要步骤。在某些情况下,如果我们没有对输入数据进行处理,模型将无法预测出我们的输入数据。
在 Python 中,你可能想看看 SkLearn,以及 Tensorflow 中的一些其他工具,用于批处理和诸如此类的事情。编码器和定标器可能是这些操作最流行的选择,但实际上你的处理器可以是任何东西。通常,这些对象以某种管道包装器或 Python 文件的形式聚集在一起,因为我们通常会序列化该模型并自动进行特征处理。这是在一些测试中投入更多精力的另一个好理由。我们还需要再做一部分特征处理,因为这些线有些模糊。现在我们最有可能使用 train_test_split()方法进行一次 test/train/val 分割。这种子抽样随机观察,然后将它们分成两组不同的相同特征。我们之所以要在处理完数据后再这样做,而不是在
第六步:建模
可能感觉最大和最吸引人的一步是建模。在建模步骤中,我们将把这些数据仔细整合到输入数据中。然后,这些数据将作为输入提供给我们的机器学习模型。根据您的模型,超参数可能也需要在过程的这一部分进行调整。
这部分相对简单,因为库的输入通常被映射到两个简单的位置参数。确保尺寸正确,并将特征发送到模型中。得到一个预测,并在你的验证集上检查它,然后回去看看是否还可以做更多的事情来获得更好的准确性。最终,通过足够的工作,您将获得一个相当有信心的模型,可以准备好进行流水线操作。
第七步:流水线作业
最后一步是把你的东西用管道连接起来。您将希望在此管道中包含任何用于预处理的方法。重要的是处理是相同的,以便最终模型的输入保持相同的格式,因此每个特征集的输出也保持相同。
在大多数 ML 模块内部,通常有一个相当健壮的流水线接口。在 SkLearn 的例子中,您可能会在第一对模型中使用它,您可以使用 Pipeline 构造函数来创建一个新的管道。
结论
数据科学过程可能看起来令人生畏。仅仅浏览这些标题可能会让人不知所措。然而,用一种系统的方法一步一步地做事情,就像你在计算中经常做的那样,将极大地帮助你创建一个有效的工作模型。我希望这个模型能够成功地展示出一个好的模型需要做些什么。这项技术的伟大之处在于,当涉及到声明式编程时,将事情分解成步骤是非常有效的。话虽如此,但我认为它可以应用于生活和软件中不断学习不同的东西。祝你好运利用这项技术,我知道它一定会在这个应用程序中派上用场!感谢您的阅读!
我的技术写作之旅
原文:https://towardsdatascience.com/my-technical-writing-journey-14ea1ca18e79
一切都从问自己一个问题开始
两年前,我在媒体上开始了我的第一个技术博客。老实说,我不敢相信我已经坚持这个习惯这么长时间了。作为一种欣赏的方式,我想我可以写一个回顾,与任何也想加入的人分享我的旅程。
在写这篇博客的时候,我已经发表了 28 篇文章,获得了 685,000+的浏览量和 1,000+的关注者。这些只是数字,对不同的人有不同的意义。这个博客绝不是教你如何在媒体上传播(我也不知道)。这是从问自己一个问题到养成写博客习惯的旅程。
我的出发点是什么?
我在一周内发表了我的前三篇文章。就写作而言,那是我最有收获的一周。都是从当时没有好的完整的资料来回答我的问题的挫败感开始的。为了找到出路,我从网上收集了一些作品,并经历了试错的过程。最终,我得到了我想要的。这个问题与工作有关,所以我把我的发现写在了一个笔记本上,并把它展示给了我的同事。事实证明这对每个人来说都是一个有趣的话题。
当我完成我的演讲时,我决定在互联网上与更多的观众分享。那是 2020 年 5 月,在家工作的情况也让我更想表达自己一点。同一天,我修改了笔记,完成了我的第一个官方技术博客:了解如何在 Python 中使用 NamedTuple 和 data class。我不得不说,我对接下来几天的观点感到惊讶,这是好的方面。我不知道分配算法是如何工作的。直到今天我还不知道。但这无疑给了我在互联网上创造更多有趣内容的信心。
的视图了解如何在 Python 中使用 NamedTuple 和 data class2020 年 5 月
随着我写的博客越来越多,事实告诉我,并不是每个博客都会这样。毫无疑问,我很幸运有一个好的开始。
创意从何而来?
每个内容创作者都需要一个缪斯。对我来说,每个想法都是从一个问题开始的。这些问题 90%源于我的日常工作。有些问题非常小众,比如“为什么当我调用函数 F 时,framework X 会引发异常 E?”,或者可以非常笼统,如“Python 中的继承是如何工作的?”。不管是哪种,都是困扰我的问题。如果我写了它,我应该是第一个得到好处的人,因为我的博客解决了我自己的问题。
我的第一个写作技巧是找到一个困扰你的问题。作为一名工程师,我们的日常生活应该充满了问题。我们离不开 StackOverflow:)。如果可以,那就找一份新工作,因为它不再是一份有挑战性的工作。之所以会发现一个和你很接近的问题,是因为你知道你和其他和你一样的人想要得到解决的这个问题的核心是什么。你会对你的听众表现出充分的同情心。在一天结束时,评估你工作的方法是问你自己最初的问题是否得到了回答。
拥有这样一种问题驱动的心态不仅让你的内容更加脚踏实地,而且这也是一个很好的学习机会。有时我们在向人们解释事情时会卡住。很有可能你还没有掌握这个题目。因此,告诉人们事物是如何在口语或写作中运作的,是提高你对某些主题的知识的一个很好的方法。
**我通常做的是找到一个让我烦恼同时又吸引我的问题。**这是一种又恨又爱的关系。你期待完成后的成就感,因为你的博客会让未来许多人的生活变得更容易。如果情况只有厌恶,那就不要写了。比如我绝对不会写什么为什么只能在 Linux 上安装包,而不能在 macOS 上。😃)我只想尽快摆脱它。
说到这里,我想以展示著名的邓宁-克鲁格效应来结束这一节。基本意思是“一知半解是件危险的事情。”当你在学习一个全新的事物时,你会很兴奋,会有很多问题。不要急着写“什么是阿帕奇卡夫卡?”或者“API 是如何工作的?”因为你很可能正站在“愚笨山的顶峰”。当你在那里时,你的产出往往是肤浅的。在我看来,写作的理想位置是“绝望的山谷”或“启蒙的斜坡”,因为它有助于你到达“可持续发展的高原”。
当我们处于“可持续发展的高原”时,我们还应该继续写作吗?我不知道。我想说,这是大多数人一生都在追求的一个假想点。只要我们在路上,我们就应该继续写作。
邓宁-克鲁格效应(来源:维基百科
如何将一个想法转化为博客?
将想法转化为博客的两种不同模式(由高创建)
下一步是将你最初的想法扩展或缩小到一个实用的范围。例如,我的 NamedTuple 和 Dataclass 博客以一个问题开始:就对象创建时间而言,哪个类的性能更好?这是一个非常小众的问题。我不需要很多话来回答。对于这种类似 StackOverflow 的问题,您需要扩展范围,思考在这个上下文中还有哪些有趣的地方。在研究过程中,我发现了许多其他有趣的点。所以我在对象创建、属性访问、不变性等方面做了更多的比较。最后,读者将对 Python 中的这两个概念有一个大致的了解,并帮助他们选择一个。其他类似的例子还有 Python 中的 Understand slots 和Understand zip()——Python 中隐藏的瑰宝都是从一些小问题开始的,比如“我如何以优雅的方式将两个列表合并成对?”。
另一种方法是当你有一个广泛的想法时,缩小你原来的范围。你写的是博文,不是书。不要制定过于雄心勃勃的目标。否则,你要么让文章流于表面,不能创造太多价值,要么文章太长,读不下去。我喜欢的是找到题目的独特切入点。例如,在文章如何用 Python 编写用户友好的命令行界面中,我重点介绍了如何让您的 CLI 应用程序更加用户友好。在 5 使用财务数据的 Python 技巧中,我将 Python 技巧仅与财务数据联系起来。这样,你总是有一个明确的目标读者群。
另一个普遍的建议是在开始叙述之前做一个想法转储。这样你就不会忘记你要写什么,并且确保文章的大小合适。
如何留住你的观众?
好的,我有一个想法,我也知道我想谈什么。接下来,让我们想想如何保持你的观众的注意力,这样他们就不会太快失去注意力。根据我自己的经验,这里有几个建议。如果你有其他好的建议,请告诉我。
明确你的目标群体
一般来说,有两种类型的读者阅读你的科技博客。
1)浏览社交媒体并被标题吸引的读者。恭喜,你在标题上做得很好。他们打开页面,阅读介绍,并快速滚动页面,看看是否有任何有趣的内容。他们可能会上瘾,或者把它放在书签里以备后用,或者干脆把它扔掉。他们的行为是不可预测的,因此留住他们的策略也是模糊的。我唯一的策略是总是有一个清晰简洁的标题,这样在他们阅读之前,他们会有一些期望。当他们有期望时,他们属于第二类。
2)另一个群体是带着问题来的读者。他们谷歌了一下“python 命名的元组和数据类”,在 StackOverflow 之后他们就找到了我的文章。他们打开页面的目的是了解 NamedTuple 和 Dataclass。这些人是我的目标读者,我希望他们的问题在关闭页面之前得到回答。
统计数据还显示,谷歌是我最大的流量来源,这证明大多数人来这里是有目的的。
我的 2 篇文章的流量来源(作者:高 T5)
全面了解所有经验等级
当有需要时,让我们用尽可能清晰和详细的信息来满足它,而不要对读者的背景知识做任何假设。几乎我所有的博客都是从一点基础知识开始,然后才开始写代码。我不提供太多大块的代码。但是我喜欢详细描述每一个命令,它是做什么的,为什么它是这样工作的。这些细节为读者提供了提高技能所需的信息。我经常问自己,我的文章是否包含太多的隆隆声或*、*明显的事情,但每当我看到类似“xxx 不清楚”的评论时,我知道我应该解释得更清楚。
中国有句谚语:给一个人一条鱼,你可以喂他一天。教一个人钓鱼,你可以喂他一辈子。
不要把你的技术博客写得太专业
人们(包括我在内)有时更喜欢阅读科技博客而不是 StackOverflow 的原因是,我们希望有更多的背景,听到好的故事。即使它是一个科技博客,你仍然可以讲一个关于它的好故事。有什么问题?为什么这对我们来说是个问题?怎么才能解决呢?你能举一些例子来支持你的说法吗?对读者有什么建议?这有助于非工程师理解你的观点,他们可能会将你的文章推荐给他们的工程师同事,因为他们认为这可能对他们有用。
我喜欢用图表和例子来解释事情。一张图表不仅能表达成千上万的单词,还能在阅读文章时创造一种精神上的休息。例子总是能很好地向人们展示你所说的是实实在在的东西,而不是火箭科学。
你是怎么保持节奏的?
许多跑步者努力了几个月,但一越过终点线,他们就停止了训练。当你所有的努力都集中在写一篇文章上时,当你完成后,还有什么能推动你前进呢?《原子习惯》这本书告诉我,发展一个长期的系统比拥有一个目标驱动的心态更具可持续性。
真正的长期思考是没有目标的思考。它不是关于任何单一的成就。这是一个不断完善和不断改进的循环。最终,你对这个过程的承诺将决定你的进步。—原子习惯
你的写作目标应该像“每月发表 X 篇文章”而不是“发表 10 篇文章”那样与你的持续进步相关联。
来自互联网、朋友和同事的积极反馈是让你继续前进的另一个因素。尝试在社交媒体上展示你的作品,并鼓励人们给你评论。当你获得更多的参与度时,你会更愿意开始下一个博客。相信我!
像往常一样,我希望你会发现这篇文章很有用,并兴奋地开始你的第一个科技博客。😃)
参考
这些材料可以提高你的技术写作技巧:
https://www.digitalocean.com/community/tutorials/digitalocean-s-technical-writing-guidelines https://developers.google.com/tech-writing
我的三种离群点检测方法
原文:https://towardsdatascience.com/my-three-go-to-outlier-detection-methods-49d74dc3fc29
异常值检测至关重要,尤其是对于数据质量评估
来自像素的免费使用照片
介绍
离群点检测在许多不同的方面都是至关重要的。如果一家公司想要了解异常/非典型的客户行为,它需要首先识别这样的客户。离群点检测技术在这种情况下发挥了作用。离群点检测对于检查数据集的数据质量也非常有用。在这里,我们来看看常用于检测异常值的三种主流方法。
IQR /标准差方法
Outliers are defined as:Points that are < mean/median - n * IQR/Std or > mean/median + n * IQR/Std
IQR 代表四分位距。要理解这个概念,首先需要知道四分位数是什么意思。在统计学中,四分位数是将数据分成四份的值,因此自然会有四个四分位数。[1]它们中的每一个通常被表示为 Q1、Q2、Q3 和 Q4。四分位范围(IQR)是数据集的中间五十,可表示为 Q3- Q1。[2]它经常被用来代替标准偏差(Std)来衡量分布和变化,因为后者更不稳定,对异常值更敏感。
使用 IQR 和标准偏差检测异常值的方法非常简单,位于 n 倍 IQR 或标准偏差定义的特定范围之外的数据点可以被视为异常值。但是,请注意,这种方法对于单变量类型的数据是有效的。
记住高斯分布的一个特性。偏离平均值 3 个标准偏差之外的点仅占分布的 1%。这意味着,与大多数其他点相比,构成 1%分布的那些点是非典型的,并且可能是异常值。当然,现实世界中的数据很少是完美的高斯分布,但是这个更大的概念仍然成立,即远离平均值或中值的点很可能是异常值。
没有用于设置阈值 n 设置规则。这取决于异常值检测的目的以及用户希望异常值检测是保守的还是全面的。因此,在一些测试数据上修改阈值将是一个好主意。
k 表示聚类
k 表示聚类是数据科学领域中使用的最经典、最传统的聚类方法之一。在这里,我不会深入讨论聚类算法本身是如何工作的。请回顾一篇解释这种算法如何工作的文章。[3]
尽管是一个聚类算法,它也可以用于离群点检测!
一种方法是将簇的数量设置为 K = 1。然后,质心将成为数据中所有点的平均值。然后,计算所有点的欧几里德距离。根据要标记为异常值的点的数量,可以选择距离质心最远的前 n 个点。k 意味着可以通过 Python 的 scikit-learn 库轻松实现集群。参考下面的示例代码,假设存储在变量 df 中的数据有两个数字列 V1 和 V2。(如果包括分类变量,记得对变量进行编码)。
**import** pandas **as** pd
**import** numpy **as** np
**from** sklearn.cluster **import** KMeans### Assume you already read in data in pandas in the variable called df (with two numerical columns V1 and V2)X = df.to_numpy() # change the dataframe to numpy matrixkmeans **=** KMeans(n_clusters**=**1)
kmeans**.**fit(X)
distances **=** kmeans**.**transform(X) # apply kmeans on data# If you want to flag 50 points as outliers, grab indexes flagged as outliers
sorted_idx **=** np**.**argsort(distances**.**ravel())[::**-**1][:50]
另一种方法是使用 k > 1 个聚类,并标记最小大小的聚类中的所有点。当然,您必须首先通过使用 elbow 方法或剪影评分方法来确定最佳聚类数,我不会在这里详细介绍这两种方法。
隔离森林
使用尽可能少的技术术语的隔离森林是一种算法,它不使用随机森林进行预测,而是如其名称所示“隔离”点。
主要思想如下-它试图“通过随机选择一个特征,然后随机选择所选特征的最大值和最小值之间的分割值来隔离观察值。”[4]我们把这种隔离过程称为“分割”。然后,每一轮划分可以被认为是“一棵随机树”,然后所有这些树的集合将是“随机森林”。分离一个样本所需的分裂数就是“树的深度”或“从根到终端节点的路径长度”。然后,在随机森林中的所有树上对该路径长度进行平均,并成为算法的度量。该算法假设使用相对较少数量的分区更容易隔离离群点(因此平均而言隔离在树的较浅深度)。
请参考再次使用 scikit 学习包的隔离森林的 Python 实现示例。
**import** pandas **as** pd
**import** numpy **as** np
**from** sklearn.ensemble **import** IsolationForestdata = df[['V1','V2','V3']] # assume there is data with three numerical columns V1, V2, and V3min_max_scaler = preprocessing.StandardScaler()data_scaled = min_max_scaler.fit_transform(data)*# train isolation forest
outliers_fraction = 0.2 # you can set how much would be flagged as outliers*model = IsolationForest(contamination = outliers_fraction)model.fit(data)*# add the anomaly flags to the data*data['anomaly'] = pd.Series(model.predict(data_scaled))# Flagged outlier points are labelled as -1 and non-outlier points are labelled as 1 and so relabel them as binary outcomes (1 and 0) data['anomaly'] = data['anomaly'].map( {1: 0, -1: 1} )
还有其他多种异常检测算法,包括 DBSCAN、局部异常因子(LOF)等。我希望在其他一些帖子中讨论这个问题!如果你感兴趣,请关注我并订阅我的帖子: )
参考
[1]统计学如何,什么是四分位数?定义
[2]统计学如何,四分位距(IQR):它是什么以及如何找到它
[3] S .耶尔德勒姆,走向数据科学,K-均值聚类—解释(2020)
关于作者
数据科学家。在密歇根大学刑事司法行政记录系统(CJARS)经济学实验室担任副研究员。Spotify 前数据科学实习生。Inc .(纽约市)。即将入学的信息学博士生。他喜欢运动,健身,烹饪美味的亚洲食物,看 kdramas 和制作/表演音乐,最重要的是崇拜耶稣基督。结账他的 网站 !
我对 2022 年人工智能的五大预测
原文:https://towardsdatascience.com/my-top-5-predictions-for-ai-in-2022-b5745646899
DeepMind、特斯拉、OpenAI 等等。
照片由 solarseven 在 Shutterstock 上拍摄
2021 年对于人工智能来说是令人惊叹的一年。
伦理比以往任何时候都更处于人工智能研究的中心。我们对语言模型带来的伤害风险有了更好的理解——公司不断改进语言模型,使它们不仅更大,而且更聪明和更高效,多模态系统更加常见(例如谷歌的 MUM 和 OpenAI 的 DALL E ,现实世界的人工智能正在向前跨越和向后跨越。总而言之,人工智能保持甚至加快了我们在过去十年中看到的进步步伐。
2022 年还会继续这个方向。人工智能社区将带来新的有希望的发展和令人印象深刻的突破,其中一些我们可以预见。我列出了 2022 年将会发生或不会发生的 5 大最有影响力的人工智能事件和发展。(其他更不可预测的里程碑肯定会发生,但我们会感到惊讶。)
1.探索构建语言模型的新方法
“越大越好”的趋势将在 2022 年消失。
语言模型是现在人工智能的事情。计算机视觉在过去十年的最初几年很流行,但从 2017 年起,语言已经成为最先进的人工智能机构和组织的关注焦点和利润来源。你将很难找到一家世界级的人工智能公司或初创公司没有声称自己在人工智能语言市场的份额。
DeepMind,作为可以说是全球排名第一的人工智能公司,这些年出奇地安静。不再是了。
几周前,DeepMind 发表了三篇关于语言模型的论文。这条新闻被害羞地报道了——我们已经对语言模特的揭露形成了一种宽容,因为在过去的四年里,媒体一直在不间断地喂养她们。然而,科学不会发生在头条新闻中,而是发生在实验中,DeepMind 的结果一点也不害羞。
第一篇论文以 Gopher 为特色,这是一个 2800 亿参数的神经网络,在 124 个任务中的 100 个任务中表现出惊人的性能,超过了 GPT-3、J1-Jumbo 和 MT-NLG(之前的前 3 名模型,我们有性能数据)。Gopher 是一种密集的大型语言模型(LLM ),构建方式与其他语言模型相同。尽管性能有所提高,但系统几乎没有任何创新。它被以同样的方式训练,工作方式相似但更好,并且也从事有毒的行为。
第三篇论文引起了我的注意。 RETRO (检索增强型变压器)是一个 70 亿参数的模型,功率与 GPT-3 和 J1-Jumbo(大 25 倍)相当。该模型的计算能力比 GPT-3 少 10 倍,并使用检索机制,允许它实时访问大型数据库,无需像以前的模型那样将所有知识保存在内存中。(很快会有关于复古的深度文章!)
在这个意义上,复古更像人类。我们不会把所有的知识都保存在记忆里;我们看书,在网上搜索,寻找新的信息。DeepMind 押注于脱离越来越大的语言模型趋势。从长远来看,这是不可持续的——人工智能的碳足迹不断增加,高昂的成本使得除了少数几个价值数十亿美元的公司之外,这项技术是负担不起的,如果增长率在未来几年保持不变,人工智能硬件将很难训练快速变化的模型。
需要像 RETRO 的知识检索这样的新颖技术。
另一种产生有希望结果的方法是稀疏语言模型。稀疏性在于只使用模型参数的一部分来进行计算——不同的部分或“专家”被有条件地激活。这与密集模型(GPT-3 和地鼠)形成对比,在密集模型中,所有参数都有助于处理所有输入。开关变压器(1.7T)武道 2.0 (1.75T),或者 M6 (10T)都是稀疏模型的例子。
我们还将看到人工智能芯片利用稀疏性来跟上语言模型的发展。人工智能硬件初创公司 Tenstorrent 是这种方法的显著支持者。他们设计更智能的芯片,更有效地利用他们的计算能力,而不是制造更大、更昂贵的芯片。
我们正在见证 4 年来模型越做越大的趋势的最后几天。我们可能永远看不到 100 万亿参数模型。越大并不总是越好,软件和硬件公司都开始注意到这一点。设计和构建语言模型的新方法将是 2022 年人工智能的主要趋势。
2.OpenAI 将发布 GPT 4 号——我们会大吃一惊
我们不期待 OpenAI 为 2022 年预留了什么。
几个月前,我发表了一篇题为“ GPT-4 将拥有 100 万亿个参数——是 GPT-3 的 500 倍。”我不再袖手旁观那个标题。考虑到我所说的关于语言模型的新方法,我相信 OpenAI 也将采取一个新的方向,并且不再仅仅为了它而制造更大的模型。GPT 3 号的大小是 GPT 2 号的 100 倍,但是 GPT 4 号的大小将和 GPT 3 号差不多——尽管它的工作方式不同。
当我写前面提到的文章时,我认为——和大多数人一样——open ai 将继续从 GPT、GPT-2 和 GPT-3 到 GPT-4 的扩展趋势。脑波强化系统公司的首席执行官安德鲁·费尔德曼在宣传他们最新的人工智能芯片 WSE-2 时,暗示open AI 将把他们的芯片用于 GPT 家族的下一个版本——100T 参数模型。但 OpenAI 的首席执行官山姆·奥特曼否认了这些传言。在一个私人 Q & A (我不会给出细节,因为奥特曼要求助手不要透露信息)中,他说 GPT-4 不会有 100T 参数,并将是一个纯文本模型(没有多模态)。他还说,它将包括尚未在《GPT 3》中看到的新功能,但没有具体说明是哪些。
OpenAI 的研究人员显然正在努力提高效率和功率,同时保持大小不变(就像 DeepMind 对 RETRO 所做的那样),完全摆脱了缩放假设。检索技术、条件处理和更高效的转换器架构是一些已知的大型模型的替代方法,但是 OpenAI 还可以尝试许多其他的东西。
我们得等 GPT 4 号出来。很快就会有惊喜了。
3.特斯拉不会制造自主人形机器人
埃隆·马斯克是一个表演者,特斯拉是他的旗舰,我们是他的观众,世界是他的游乐场。
2021 年特斯拉人工智能日埃隆·马斯克以他特有的古怪风格承诺,特斯拉将在“明年某个时候”推出一款自主人形机器人的原型——他们称之为擎天柱。他们计划将(仍不完善的)自动驾驶技术转换成人形。马斯克认为特斯拉非常适合从事这个项目,因为它非常专注于自主性、超级计算和现实世界的人工智能。
擎天柱的主要目的是“消除危险、重复和无聊的任务。”马斯克说,人们将能够使用自然语言来指挥它。你可以说:“拿起那个螺栓,用那个扳手把它固定在汽车上,”或者“去商店给我买下列杂货。”然而,马斯克没有意识到——或者也许他意识到了,只是把擎天柱作为另一个宣传噱头——制造一个人形自主机器人比制造一辆自动驾驶汽车要困难得多——特斯拉仍然远远没有实现这一壮举。
人类是多感官的,因为我们在一个多模态的世界中进化。自动驾驶汽车只有视觉,具有讽刺意味的是,这使它们看不到其他任何东西——声音、纹理、压力、温度、气味、味道……人类将不同的感知通道集成到现实的单一表示中,然后我们用它来导航世界并做出决策。Optimus 需要触觉和触觉传感器、本体感受能力以及对其身体内部的精确描述——这些都不存在于自动驾驶技术中。
最重要的是,Optimus 需要一个系统来选择和过滤重要的感知信息——因为它对手头的任务有用,因为它威胁到生命,或者因为任何其他原因介于两者之间。在语言模型中,注意力机制很容易,但当涉及到组合和选择感知并决定要注意哪个时,技术远远不能接近人类的水平。
一旦 Optimus 决定了哪些感知是重要的,它就需要处理信息,计划后续行动,决定哪些是紧急的,哪些不是,并考虑到世界和自身不断变化的性质来采取行动。自动驾驶汽车只有两个目标:遵循交通规则从 A 地前往 B 地,避开路上的一切。
自主机器人也需要像我们一样了解周围的世界。如果天空中有云,擎天柱需要推断可能会下雨。如果下雨,地板可能太湿了。如果地板是湿的,擎天柱可能会滑下来摔倒。这个推理链对我们来说是直接的,但对人工智能来说却远非显而易见。
自 20 世纪 50 年代人工智能的概念提出以来,多感官感知、注意力、规划、决策、常识和因果推理一直是人工智能无法企及的。我们还没有采取微小的步骤将它们灌输给机器人。
埃隆·马斯克不会在一年内让它成为可能。
4.正在进行的反对人工智能语言偏见的斗争
人工智能伦理学在过去几年里已经成为一个热门领域。2022 年,我们将看到公司对此更加认真,甚至将努力置于利润之上——尽管可能是因为他们已经计算出最终在经济上是值得的。
随着语言模型变得越来越大,越来越强大,它们也增加了潜在的危害。公司已经实现了减少模型偏差和从数据集继承的毒性的技术。一些方法,如管理和过滤数据,在训练之前应用,而另一些方法,如微调模型以改善它们的行为,监控应用程序发布,或定义和执行严格的用例指导方针,在下游更好地实现。
但是,尽管做出了努力,没有一个语言模型能免于成为这些缺陷的牺牲品。
道德专家一再报告称,公司在减少风险行为方面做得不够。他们批评公司将利润作为优化的目标,其他一切——包括对人的影响——都取决于此。专家承认,大型语言模型的问题是固有的,很难消除。这就是为什么艾米丽·m·本德和蒂姆尼特·格布鲁等人建议研究人员也考虑“超越更大的语言模型”的其他方向
DeepMind 的第二篇论文(我之前没有提到)包含了对语言模型带来的道德和社会风险的严格分类。他们列出了风险的结构,分析了风险的来源,定义了潜在的缓解方法,并推荐了未来的工作方向。他们认识到,要将伤害风险降低到公开使用这些模型对所有类型和种类的人都足够安全的程度,还有很多工作要做。
大型语言模型不会很快停止开发。偏见和毒性不会很快从这些模型中 100%消除。在未来的几年里,我们将会看到两股力量,一股是以发展技术为主要目标的力量,另一股是以让世界变得更美好为主要目标的力量,推动和推动双方达成妥协。我不相信我们会完全消除人工智能系统中的有害行为,但我希望人工智能社区最终会意识到 LLM 的能力有限,越建越大不是前进的方向。
5.自动驾驶汽车仍然不会自动驾驶
世界上还没有一家公司造出自动驾驶汽车。
特斯拉引入了“完全自动驾驶”和“自动驾驶”的概念,以吸引客户认为他们已经接近拥有可以自动驾驶的汽车,但这不是真的。2020 年,德国当局对这种行为采取了行动,禁止特斯拉出于营销目的使用这种误导性语言。
自动驾驶汽车还远未成为现实。特斯拉 Autopilot 帮助汽车导航常见场景,但未能解决人类会立即知道最佳行动的边缘情况——这导致了事故、差点事故和错误。
我很清楚,完全自动驾驶不会很快准备好。但并不是所有人都同意。
自 2015 年以来,埃隆·马斯克一直承诺完全自主。在英伟达的开幕主题演讲中,GTC·马斯克说:“我不认为我们需要担心自动驾驶汽车,因为这是一种狭义的人工智能。这并不是我认为很难的事情。[……]我几乎把它视为一个已经解决的问题。”在那之后,马斯克已经承诺每两年提供完全的自动驾驶能力。
2016 年,他认为将在 2017 年做好准备:“我对从洛杉矶到纽约的完全自主示范驾驶的目标感觉非常好。”2018 年:“我认为明年我们将实现完全自动驾驶,作为一种通用的解决方案。”2020 年,他说完全自动驾驶将在今年年底“功能完善”。
他每次都错了。
2021 年,他在推特上承认了挑战的难度。
其他公司正在押注自动驾驶。他们没有特斯拉那么受欢迎,也没有追随它的脚步。 Waymo 和 Cruise 在路上行驶的汽车更少,以换取采取更安全和更高科技的方法。大多数专家都同意自动驾驶仅仅依靠视觉是不可能的——激光雷达和其他测绘技术将是更上一层楼所必需的。然而,尽管他们做出了努力,但在完全自主的竞赛中,他们远远落后于特斯拉。
特斯拉似乎比其竞争对手走得更快,原因有二:首先,他们采用了纯视觉方法;只是神经网络在做它们最擅长的事情,处理汽车周围摄像头捕捉到的大量数据。然而,完全不清楚——尽管马斯克说——自主性问题可以通过这种方式解决。其次,特斯拉更擅长销售汽车,而不是制造汽车。不是每个人都喜欢埃隆·马斯克和特斯拉,但喜欢的人都是死忠粉丝。特斯拉汽车充斥道路。
特斯拉又一年将无法达到预期,要么是因为技术尚未准备好,要么是因为它的方法存在固有缺陷。其他公司也不会制造自动驾驶汽车,因为安全意味着进展缓慢——尽管在这种情况下,这是值得的。
特斯拉感觉自己是自动驾驶技术的领导者,但它只是一个声音更大的参与者。马斯克是逃避未兑现承诺的大师。无人驾驶汽车比大多数人认为的还要遥远——马斯克不在其中。
如果你喜欢这篇文章,可以考虑订阅我的免费周报 【明天的想法】 !每周都有关于人工智能和技术的新闻、研究和见解!
您也可以直接支持我的工作,使用我的推荐链接 这里 成为中级会员,获得无限权限!😃
我对数据科学的理解正在向一个新的方向发展
意见
我不知道对此作何感想
丹·克里斯蒂安·pădureț在 Unsplash 上拍摄的照片
2019 年,数据科学开始成为我生活中的一件事。从那以后,我一直充满激情和好奇心地学习数据科学,几乎每天都有新的发现。
数据一直是数据科学的中心,这是意料之中的常态。数据科学就是从数据中提取信息、见解或价值。
利用数据创造商业价值的潜力显著增加,这推动了对数据、工具和技能的巨大需求。由于所有这些转变,工具的数量激增。
在我开始数据科学之旅时,我对数据科学家的理解是一个能够理解数据告诉我们什么的人。数据科学家超越表面现象,提取隐藏的信息。
到目前为止,我觉得成为一名数据科学家与你使用工具的能力更有关系。不要误解我。你阅读、理解和理解数据的能力仍然至关重要。然而,你在某些工具上的技能已经凸显出来。
我对数据科学的理解越来越像你在数据科学生态系统中使用工具的能力。我不知道对此作何感想。
显然,我们不能忽视工具。使用软件工具和软件包来清理、处理和分析数据总是势在必行的,因为我们可能要处理大量的数据。然而,工具的数量和复杂性一直在增加。因此,数据科学家花费大量时间学习使用这些工具。
这有什么不好?
首先,使用更高效更快捷的工具没有错。时间和计算能力是重要的资源,所以如果有一种工具有可能节省我们一些时间或计算,忽略它是不明智的。
但是,这不应该导致您忽略更重要的东西:数据。
掌握好手头的数据比任何其他工具都有用。例如,有几个超参数调整工具,可以帮助您找到最佳的超参数值,并可能实现对模型的改进。
另一方面,通过掌握数据的结构和属性并包含一些业务上下文来派生一个新特性,与超参数调优相比,您可能会获得显著的改进。
我必须学习所有的工具吗?
绝对不行!然而,数据科学不是一个单独从业者的工作。你是团队的一员,所以团队使用的工具是你需要学习的。考虑到数据科学生态系统中的高流动率,您可能会频繁更换公司,这可能意味着需要学习新的工具。
对于大公司来说,情况可能略有不同
如果你在一家大型公司担任数据科学家,你的任务可能会局限于一个较窄的范围。在这种情况下,你不必处理或学习这么多工具,因为你专注于一个特定的任务。
我认为这只对有限的几家公司有效。大量的数据科学家工作需要你参与数据科学或机器学习工作流程的多个步骤。
我想解释的是,作为一名数据科学家,还是作为一名数据科学工具专家。你不能完全忽略其中任何一个。然而,我强烈建议不要失去重点,不要忘记数据科学到底是什么。
如果你成为一个工具专家,你可以执行你被告知要做的任务。这绝对是一项宝贵的技能。除此之外,如果你帮助用数据做决策,你成为一名杰出的数据科学家的机会就会大大增加。
了解你的数据!
你可以成为 媒介会员 解锁我的全部写作权限,外加其余媒介。如果你已经是了,别忘了订阅https://sonery.medium.com/subscribe如果你想在我发表新文章时收到电子邮件。
感谢您的阅读。如果您有任何反馈,请告诉我。
MySQL 到 DynamoDB:使用 Kafka 在 AWS 上构建流数据管道
通过 MSK 连接使用变更数据捕获在 Aurora MySQL 和 DynamoDB 之间同步数据
这是博客系列的第二部分,它提供了 Kafka 和 Kafka Connect 的数据管道的逐步演示。出于演示目的,我将使用 AWS,但是这些概念适用于任何等效的选项(例如,在 Docker 中本地运行这些选项)。
这一部分将展示变更数据捕获的作用,它让您可以跟踪数据库表中的行级变更,以响应创建、更新和删除操作。例如,在 MySQL 中,这些变更数据事件通过 MySQL 二进制日志(binlog) 公开。在第 1 部分中,我们在数据管道的源部分使用了 Datagen 连接器——它帮助我们为 MSK 主题生成模拟数据,并使事情变得简单。
我们将使用 Aurora MySQL 作为数据源,并通过Debezium connector for MySQL利用其变更数据捕获功能,从 Aurora MySQL 中的表中实时提取数据,并将其推送到 MSK 主题。然后,我们将像以前一样继续使用 DynamoDB 接收器连接器。
如果你刚接触Debezium…
它是一个分布式平台,构建在不同数据库中可用的变更数据捕获功能之上。它提供了一组 Kafka Connect 连接器,这些连接器利用数据库表中的行级更改(使用 CDC)并将它们转换成事件流。这些被发送到 Kafka,并可用于所有下游应用程序。
这是这篇博文中提出的解决方案的高级示意图。
高层架构(图片由作者提供)
我假设您是从第 1 部分开始学习的,在第 1 部分中,已经介绍了本教程所需的基础设施和服务的创建过程。如果您还没有,请参考第 1 部分章节中的准备基础设施组件和服务章节
数据管道第 1 部分:Aurora MySQL 到 MSK
让我们首先创建管道的前半部分,将 Aurora MySQL 表中的数据同步到 MSK 的一个主题。
在本节中,您将:
- 下载 Debezium 连接器产品
- 在 MSK 创建自定义插件
- 将 Debezium 源连接器部署到 MSK 连接
最后,数据管道的前半部分将准备就绪!
创建自定义插件和连接器
将 Debezium 连接器上传到亚马逊 S3
登录 Kafka 客户端 EC2 实例并运行以下命令:
sudo -u ec2-user -i
mkdir debezium && cd debeziumwget https://repo1.maven.org/maven2/io/debezium/debezium-connector-mysql/1.9.0.Final/debezium-connector-mysql-1.9.0.Final-plugin.tar.gz
tar xzf debezium-connector-mysql-1.9.0.Final-plugin.tar.gzcd debezium-connector-mysql
zip -9 ../debezium-connector-mysql-1.9.0.Final-plugin.zip *cd ..
aws s3 cp ./debezium-connector-mysql-1.9.0.Final-plugin.zip s3://msk-lab-<ENTER_YOUR_AWS_ACCOUNT_ID>-plugins-bucket/
创建自定义插件
有关如何创建 MSK 连接插件的分步说明,请参考官方文档中的 使用 AWS 管理控制台 创建自定义插件。
创建定制插件时,确保选择您在上一步上传到S3
的 Debezium 连接器 zip 文件。
创建 Debezium 源连接器
关于如何创建 MSK 连接连接器的逐步说明,请参考官方文档中的 创建连接器 。
要创建连接器:
- 选择您刚刚创建的插件。
- 输入连接器名称,并选择 MSK 集群和 IAM 身份验证
- 您可以在连接器配置部分输入下面提供的内容。确保根据您的设置替换以下配置:
database.history.kafka.bootstrap.servers
-输入 MSK 集群端点database.hostname
-输入 Aurora RDS MySQL 端点
保持其余配置不变
connector.class=io.debezium.connector.mysql.MySqlConnector
database.user=master
database.server.id=123456
tasks.max=1
database.history.kafka.topic=dbhistory.salesdb
database.history.kafka.bootstrap.servers=<ENTER MSK CLUSTER ENDPOINT>
database.server.name=salesdb
database.port=3306
include.schema.changes=true
database.hostname=<ENTER RDS MySQL ENDPOINT>
database.password=S3cretPwd99
database.include.list=salesdb
value.converter.schemas.enable=false
key.converter.schemas.enable=false
key.converter=org.apache.kafka.connect.storage.StringConverter
value.converter=org.apache.kafka.connect.json.JsonConverter
database.history.consumer.security.protocol=SASL_SSL
database.history.consumer.sasl.mechanism=AWS_MSK_IAM
database.history.consumer.sasl.jaas.config=software.amazon.msk.auth.iam.IAMLoginModule required;
database.history.consumer.sasl.client.callback.handler.class=software.amazon.msk.auth.iam.IAMClientCallbackHandler
database.history.producer.security.protocol=SASL_SSL
database.history.producer.sasl.mechanism=AWS_MSK_IAM
database.history.producer.sasl.jaas.config=software.amazon.msk.auth.iam.IAMLoginModule required;
database.history.producer.sasl.client.callback.handler.class=software.amazon.msk.auth.iam.IAMClientCallbackHandler
transforms=unwrap
transforms.unwrap.type=io.debezium.transforms.ExtractNewRecordState
- 在访问权限下,为连接器选择正确的 IAM 角色(名称中带有
AuroraConnectorIAMRole
的角色) - 点击下一个的进入安全选项——保持不变
- 点击下一个。对于日志交付,选择交付至亚马逊云观察日志。找到并选择
/msk-connect-demo-cwlog-group
- 点击下一步 —在最后一页,向下滚动并点击创建连接器以启动流程并等待连接器启动。
完成后,连接器转换到运行状态,继续以下步骤。
测试管道
我们想要确认来自salesdb
数据库中的SALES_ORDER
表的记录是否已经被推送到 MSK 主题。为此,从 EC2 主机运行 Kafka CLI 消费程序。
注意题目名称
*salesdb.salesdb.SALES_ORDER*
——这是根据 Debezium 约定
sudo -u ec2-user -iexport MSK_BOOTSTRAP_ADDRESS=<ENTER MSK CLUSTER ENDPOINT>/home/ec2-user/kafka/bin/kafka-console-consumer.sh --bootstrap-server $MSK_BOOTSTRAP_ADDRESS --consumer.config /home/ec2-user/kafka/config/client-config.properties --from-beginning --topic salesdb.salesdb.SALES_ORDER | jq --color-output .
在另一个终端中,使用 MySQL 客户端连接到 Aurora 数据库并插入几条记录:
sudo -u ec2-user -iexport RDS_AURORA_ENDPOINT=<ENTER RDS MySQL ENDPOINT>mysql -f -u master -h $RDS_AURORA_ENDPOINT --password=S3cretPwd99USE salesdb;select * from SALES_ORDER limit 5;INSERT INTO SALES_ORDER (ORDER_ID, SITE_ID, ORDER_DATE, SHIP_MODE) VALUES (29001, 2568, now(), 'STANDARD');
INSERT INTO SALES_ORDER (ORDER_ID, SITE_ID, ORDER_DATE, SHIP_MODE) VALUES (29002, 1649, now(), 'ONE-DAY');
INSERT INTO SALES_ORDER (ORDER_ID, SITE_ID, ORDER_DATE, SHIP_MODE) VALUES (29003, 3861, now(), 'TWO-DAY');
INSERT INTO SALES_ORDER (ORDER_ID, SITE_ID, ORDER_DATE, SHIP_MODE) VALUES (29004, 2568, now(), 'STANDARD');
INSERT INTO SALES_ORDER (ORDER_ID, SITE_ID, ORDER_DATE, SHIP_MODE) VALUES (29005, 1649, now(), 'ONE-DAY');
INSERT INTO SALES_ORDER (ORDER_ID, SITE_ID, ORDER_DATE, SHIP_MODE) VALUES (29006, 3861, now(), 'TWO-DAY');
如果一切都设置正确,您应该在消费者终端中看到记录。
{
"ORDER_ID": 29001,
"SITE_ID": 2568,
"ORDER_DATE": 1655279536000,
"SHIP_MODE": "STANDARD"
}
{
"ORDER_ID": 29002,
"SITE_ID": 1649,
"ORDER_DATE": 1655279536000,
"SHIP_MODE": "ONE-DAY"
}
{
"ORDER_ID": 29003,
"SITE_ID": 3861,
"ORDER_DATE": 1655279563000,
"SHIP_MODE": "TWO-DAY"
}
...
压缩变更事件有效负载的秘密
请注意变更数据捕获事件负载有多紧凑。这是因为我们将连接器配置为使用 Kafka 单消息转换 (SMT)的io.debezium.transforms.ExtractNewRecordState
。默认情况下,Debezium 的变更事件结构非常复杂——除了变更事件,它还包括元数据,如模式、源数据库信息等。它看起来像这样:
{
"before": null,
"after": {
"ORDER_ID": 29003,
"SITE_ID": 3861,
"ORDER_DATE": 1655279563000,
"SHIP_MODE": "TWO-DAY"
},
"source": {
"version": "1.9.0.Final",
"connector": "mysql",
"name": "salesdb",
"ts_ms": 1634569283000,
"snapshot": "false",
"db": "salesdb",
"sequence": null,
"table": "SALES_ORDER",
"server_id": 1733046080,
"gtid": null,
"file": "mysql-bin-changelog.000003",
"pos": 43275145,
"row": 0,
"thread": null,
"query": null
},
"op": "c",
"ts_ms": 1655279563000,
"transaction": null
...
多亏了 Kafka SMT(使用transforms.unwrap.type=io.debezium.transforms.ExtractNewRecordState
指定),我们可以有效地flatten
事件有效负载,并根据我们的需求定制它。
详见 Debezium 文档中的 新记录状态提取 。
数据管道第 2 部分:MSK 到 DynamoDB
现在,我们可以将注意力转移到管道的后半部分,在 DynamoDB Sink 连接器的帮助下,该部分负责将数据从 MSK 主题传递到 DynamoDB 表。
如果 DynamoDB 表不存在,连接器会自动为您创建一个,但它使用默认设置,即在配置模式下创建一个表,其中包含10
读取容量单元(rcu)和10
写入容量单元(wcu)。
但是您的用例可能需要一个配置。例如,为了处理大量数据,您可能想要配置自动缩放,或者更好的是,为您的表激活按需模式。
这正是我们要做的。
在继续之前,创建一个 DynamoDB 表
使用以下设置:
- 表名—
kafka_salesdb.salesdb.SALES_ORDER
(不要而要改变表名) - 分区键—
ORDER_ID
(数字) - 范围键—
SITE_ID
(数字) - 容量模式—按需
就这样,你可以走了!
创建自定义插件和连接器
有关如何创建 MSK 连接插件的分步说明,请参考官方文档中的 使用 AWS 管理控制台 创建自定义插件。
创建自定义插件时,确保选择您在上一步上传到S3
的 DynamoDB 连接器 zip 文件。
关于如何创建 MSK 连接连接器的逐步说明,请参考官方文档中的 创建连接器 。
要创建连接器:
- 选择您刚刚创建的插件。
- 输入连接器名称,并选择 MSK 集群和 IAM 身份验证
- 您可以在连接器配置部分输入下面提供的内容。确保根据您的设置替换以下配置:
- 为
topics
属性使用正确的主题名称(在本例中我们使用salesdb.salesdb.SALES_ORDER
,因为这是 Debezium source connector 采用的主题名称格式) - 对于
confluent.topic.bootstrap.servers
,输入 MSK 集群端点 - 对于
aws.dynamodb.endpoint
和aws.dynamodb.region
,输入您创建 DynamoDB 表的地区,例如us-east-1
保持其余配置不变
connector.class=io.confluent.connect.aws.dynamodb.DynamoDbSinkConnector
tasks.max=2
aws.dynamodb.region=<ENTER AWS REGION e.g. us-east-1>
aws.dynamodb.endpoint=https://dynamodb.<ENTER AWS REGION>.amazonaws.com
topics=salesdb.salesdb.SALES_ORDER
value.converter.schemas.enable=false
key.converter=org.apache.kafka.connect.storage.StringConverter
value.converter=org.apache.kafka.connect.json.JsonConverter
table.name.format=kafka_${topic}
confluent.topic.bootstrap.servers=<ENTER MSK CLUSTER ENDPOINT>
confluent.topic.security.protocol=SASL_SSL
confluent.topic.sasl.mechanism=AWS_MSK_IAM
confluent.topic.sasl.jaas.config=software.amazon.msk.auth.iam.IAMLoginModule required;
confluent.topic.sasl.client.callback.handler.class=software.amazon.msk.auth.iam.IAMClientCallbackHandler
aws.dynamodb.pk.hash=value.ORDER_ID
aws.dynamodb.pk.sort=value.SITE_ID
- 在访问权限下,为连接器选择正确的 IAM 角色(名称中带有
DynamoDBConnectorIAMRole
的角色) - 点击下一步进入安全选项——保持不变
- 点击下一个的**。对于日志交付,选择交付到亚马逊云观察日志。找到并选择
/msk-connect-demo-cwlog-group
** - 点击下一个 —在最后一页,向下滚动并点击创建连接器以启动该过程并等待连接器启动。
完成后,连接器转换到运行状态,继续以下步骤。
选择 DynamoDB 主键
在上述配置中,我们将aws.dynamodb.pk.hash
和aws.dynamodb.pk.sort
分别设置为value.ORDER_ID
和value.SITE_ID
。这意味着 Kafka 主题事件有效负载中的ORDER_ID
字段将被用作分区键,而SITE_ID
的值将被指定为范围键(根据您的需求,您也可以将aws.dynamodb.pk.sort
留空)。
测试端到端管道
作为初始加载过程的一部分,连接器确保 Kafka topic 中的所有现有记录都被持久化到连接器配置中指定的 DynamoDB 表中。在这种情况下,您应该在 DynamoDB 中看到不止29000
条记录(根据SALES_ORDER
表),并且您可以运行查询来浏览数据。
为了继续测试端到端管道,您可以在SALES_ORDER
表中插入更多数据,并确认它们通过 Debezium source 连接器同步到 Kafka,并通过 sink 连接器同步到 DynamoDB。
删除资源
完成后,删除您创建的资源。
- 删除 S3 桶的内容(
msk-lab-<YOUR ACCOUNT_ID>-plugins-bucket
) - 删除云形成堆栈
- 删除 DynamoDB 表
- 删除 MSK 连接连接器、插件和自定义配置
结论和总结
变更数据捕获是一个强大的工具,但我们需要一种方法来利用这些事件日志,并使其对依赖于该数据的其他服务可用。在这一部分中,您看到了我们如何利用这一功能,使用 Kafka Connect 在 MySQL 和 DynamoDB 之间建立流数据管道。
这是本系列的一个总结,以后还会有更多(当然!).快乐大厦!
信息几何的神秘世界
原文:https://towardsdatascience.com/mystical-world-of-information-geometry-16b4637d89e8
信息论和机器学习的几何故事
该图像是由作者使用人工智能工具绘制的
在高中的时候,我们有些人对几何是又爱又恨,尤其是坐标和 3D 几何。更有甚者,微积分和几何是不被认可的。然后是信息技术的繁荣,随之而来的是机器学习、人工智能和数据科学的热潮。这个原因激发了许多人去更深入地挖掘一些数学和信息几何是其中之一。信息几何可以用在统计流形学习中,统计流形学习最近被证明是在高维数据集上进行无监督学习的有用工具。它还可以计算两个概率度量之间的距离,应用于模式匹配、为神经网络的训练构建替代损失函数、信任传播网络和优化问题。
信息几何是一种利用几何探索信息世界的数学工具。信息几何也被称为费歇尔几何,其原因将在本文的后面部分显而易见。
信息几何学是用几何学研究决策,可能还包括模式匹配、模型拟合等。但是为什么是几何方法呢?几何允许在一个无坐标的框架中研究不变性,提供了一个直观思考的工具,并允许我们研究等方差。例如,三角形的质心在仿射变换下是等变的。
让我们讨论一些基本原理来理解信息几何中有什么。
基本原则
为了理解微分几何,进而理解信息几何,我们需要了解什么是流形。在我之前关于流形对齐的文章中,我讨论了什么是流形,但我将在下面复制它:
n 维流形是具有极限、连续性和正确性的最一般的数学空间,并且允许与 n 维欧几里得空间存在连续的反函数。流形局部类似欧几里得空间,但它们可能不是欧几里得空间。本质上,流形是欧几里得空间的推广。
拓扑空间
考虑一个空间 X 由一组点 x∈ X 和一组称为每个点的邻域 N(x) 的 X 的子集定义。我们有以下属性:
- 如果 U 是 *x、*和 x∈ U ,以及 V⊂X 和 U⊂V 的邻域,那么 V 也是 x 的邻域。
- x 的两个邻域的交集也是 x 的一个邻域。
- x 的任意邻域 U 包含 x 的邻域 V ,这样 U 就是 V 中所有点的邻域。
任何满足上述性质的空间 X 都可称为拓扑空间。
同胚现象
在流形对齐中,我讨论了同态,它可以公理化地表示为:
考虑到f:X→Y是两个拓扑空间之间的函数,那么 X 和 Y 同胚如果 f 连续,双射,并且 f 的逆也连续。考虑一个流形𝓜,对于所有点 x ∈ 𝓜,如果 U 是 x 的邻域,并且对于一个整数 n 使得 U 与ℝⁿ同胚,那么小的 n 是该流形的维数。
图表
由函数κ:u→κ(u)表示的同胚称为图,其中 U 可能是𝓜.的开集有许多方法可以构建一个图表来定义𝓜.这些图表的集合被称为地图集。这个想法如图 1 所示。数学上,图谱将由等式 1 定义。图表的一个具体例子是坐标系统,它可以是映射流形上的点的函数。
图一。流形和图表(图由作者创建)
等式 1。一本地图册
此时,很容易定义一个可微流形:其转移映射(或函数)是无限可微的流形。
这就是抽象数学中的流形。它对统计学和数据科学的理解呢?记住,我们在统计学中处理概率。这导致了**统计流形的概念。**在统计流形中,每个点 p ∈ 𝓜对应于一个域𝓧.上的概率分布人们可以用一个由正态分布族形成的流形的具体例子来考虑这一点。
流形上的向量和切线:如何在弯曲空间上定义它们
在普通几何中,向量是连接两点的直线,但在弯曲空间中,这可能不是真的。曲线空间上的向量被定义为流形上特定点处曲线的切线。如果 u 是一个沿曲线变化的参数,那么一条曲线可能被定义为 x(u) ,往往去掉 u 部分,简单写成 x 。弯曲空间中的向量变成
等式 2。弯曲空间中的向量
其被局部定义在点 p 处,其中 u = 0 。注意,向量本身不在流形上,但它有欧几里得概念。像图表一样,在点 p 可以有许多可能的切线。是的,如果你只是考虑一个 2D 平面,这是令人难以置信的,但即使在像球体一样的三维空间中,在一个点上也可能有多条切线,那么我们就可以谈论球体上一个点的切面(图 2)。类似地,我们可以讨论流形在点 p 的切空间。
图二。有切面的球体(作者画的)
如果我们从一个图表转到另一个图表,这与从笛卡尔坐标到极坐标的坐标转换是一样的。假设有一个变换函数 ϕ 将 x 从一个图表变换到另一个图表,那么可以写成x′= ϕ(x).
双空间
向量空间 V 的对偶空间 V* 是包含 V 的所有线性泛函的空间,即所有映射t:v↦f,其中 F 是 V 的向量空间所在的域。因此,对偶空间包含了从 V 到 F 的所有线性映射。为了更好地理解双重空间,我在网上搜索,无意中发现了下面这个例子:
想象一个二维实向量空间。定义一个函数,它接受任何向量,并只返回其 x 坐标值。定义另一个函数,它接受任何向量,只返回它的 y 坐标值。让我们调用第一个函数 f1 和第二个函数 f2 。让我们想得更多一点。把这两个函数当作向量。特别是,把它们想象成有趣的向量空间中的基本向量。你可以把它们加在一起:把 f1 + f2 想象成一个函数,它接受任何向量并返回x-坐标和y-坐标之和。你可以把它们乘以数字:把 7 * f1 想象成一个函数,它接受任何一个向量,并返回乘以 7 的 x 坐标值。你可以组成任何你喜欢的线性组合:把 3.5 * f1 -5 * f2 想成一个取任意向量的函数,返回数字 3.5 乘以 x 坐标减去 5 乘以 y 坐标。这就是双重空间的作用。
张量
流形上的张量是最普遍的。它们可以被认为是数学上的多线性野兽,吃切空间及其对偶空间的向量,吐出实数。供给张量的来自切空间及其对偶空间的向量总数称为张量的秩。来自对偶空间的这些数给出了所谓的逆变秩,来自正切空间的这些数被称为协变秩。
我将跳过对它们的正式讨论,因为老实说,我自己也不理解它们——现在还不理解。但本质上,流形是几何构造,张量是对应的代数构造。
公制的
度量是一个张量场,它在流形上的每一点的切空间上诱导一个内积。任何协方差秩为 2 的张量场都可以用来定义度量。一些资料称之为黎曼 Metric⁷.
现在,在一长串错综复杂的术语之后,我们来看看信息几何中有用的东西。
信息几何学
信息几何是统计学和微分几何交叉的一个数学分支,它从几何的角度研究概率分布。
我们首先需要看一下信息度量,也称为 Fisher 信息度量。
费希尔信息度量
如果我们希望在点 θ* 找到合适的度量张量,其中θ*对应于分布族 p(x|θ) 中的一个,那么我们需要考虑 p(x|θ) 和它的无穷小扰动 p(x|θ + dθ)之间的距离概念。*那么相对差值由等式 3 给出。当然
等式 3。 θ处扰动的相对差值。*
相对距离取决于随机变量 x 。如果你计算正确,那么δ的期望值,即𝔼(δ= 0。方差呢?原来方差是非零的。我们可以定义=𝔼[δ。根据第一个原理,对于公制𝓕,在 θ* 和 θ** 之间的无穷小位移的长度由 dl = 𝓕 dθdθ**给出。求解为dl*=𝔼[δ]=𝓕dθ dθ* **给出
等式 4。费希尔信息度量
也就是我们所说的费希尔信息度量(FIM) 。FIM 测量随机变量 X 的一次观察平均携带了多少关于参数 θ 的信息,如果x∩p(x∣θ)。还有另一种方法可以达到等式 4 的 1/2 倍,我建议读者参考参考文献 1。但是,如果它让你兴奋,量子信息科学的蓬勃发展有费雪信息度量的应用。关于这一点,我将很快有一个新的系列文章。如果你想得到通知,订阅!另一个应用是贝叶斯推理中无信息先验的设计。也许我现在走得太远了。
我将用最后一件事来结束这篇文章,费希尔信息矩阵𝓘,当我们处理多个参数时,它是𝓕的矩阵版本,可以用在类似于梯度下降的优化中,更新规则为
等式 5。微分流形语言中的优化更新规则。
其中 η 为学习参数, ∇J 为标量场 J 的散度。
在本文中,我试图提供信息几何和相关术语的简要概述。为了清楚起见,本文省略了大量的工作,我鼓励读者仔细阅读我在下面提供的参考资料。
这有帮助吗? 给我买杯咖啡 。
爱我的文字?加入我的 邮箱列表 。
想了解更多 STEM 相关话题?加入 中等
参考文献
- http://www . robots . ox . AC . uk/~ lsgs/posts/2019-09-27-info-geom . html*
- https://math . stack exchange . com/questions/240491/what-a-covector-and-what-is-it-used-for
- https://qr.ae/pv34JS
- https://frank Nielsen . github . io/SPIG-莱舒克斯 2020/geom stats-spigl 2020 . pdf*
- https://www.cmu.edu/biolphys/deserno/pdf/diff_geom.pdf
- https://math . UCR . edu/home/baez/information/information _ geometry _ 1 . html*
- https://mathworld.wolfram.com/RiemannianMetric.html
注:结尾带*的链接已在http://web.archive.org/存档。
一些相关的话题
打破神话:进入数据科学行业不需要的 3 样东西
你需要的是什么
由作者编辑—原创自 Freepik
我知道发现数据科学和坠入爱河的感觉。这是一个令人兴奋和诱人的领域,即使你没有技能,你也决心成为一名数据科学家。
可悲的是,伴随着大肆宣传而来的还有错误信息。有人说做个认证,另一个认为没用。招聘人员要求提供世界上所有的技能,这让事情变得更糟,如果没有人愿意给他们机会,初学者甚至更难理解他们如何才能获得经验。有些人为了在美国攻读硕士而负债累累,希望一旦开始工作就能偿还。
神话压倒了你,让你偏离了旅程,让你沮丧、困顿、破产。
我知道,我的朋友,因为几年前我也经历过同样的事情。我理解你的感受,这也是我写这些文章的唯一原因,希望至少能帮助到你们中的一些人。
然而,请记住这一点:进入数据科学的途径有很多,我只向您展示其中一种。我写了进入数据科学的路线图,我的学习和在人工智能初创公司工作的经历,如果你想转行要知道的事情,以及我职业生涯早期最大的错误。
本文将看到充斥着数据爱好者的常见误区。你可能也听过,现在是我们揭穿他们的时候了。
1.你不需要有 DS/CS 背景就能在数据科学方面做得很好
当数据科学爱好者来自不同的背景或想要从不同的领域转换时,这是他们最常见的担忧之一。
你认为他们总是喜欢有 DS/CS 背景的人。你认为会有一种无意识的对你的偏见。你觉得你可能不得不从头开始,即使你在不同的行业有多年的经验。
听着,我理解你所有的担忧——如果有 12 年以上零售经验的人有这种感觉,如果有博士学位的人有这种感觉,你的恐惧是自然的。但这是一个神话。
我不能代表所有公司发言,但我已经联系了无数来自物理、经济、电子、数学、统计、机电一体化、新闻、营销和其他领域的数据科学家。我有来自 CS 背景的同事,他们有着和我一样的能力。
猜猜我们都有什么共同点?
您需要的是:
数据科学技能。就这么简单。
没有相关的数据科学技能,你无法通过任何面试。面试官不在乎你的背景;他们更想知道你的技能。当你有技能并能展示出来的时候,没有人会拒绝你(稍后会有更多相关内容)。)
以下是我给你的一些建议:
我进行过招聘面试,虽然我想知道你的背景,但我只关注你解决数据科学问题的能力。如果有的话,你的非 DS/CS 背景对我来说是有吸引力的,因为它向我表明你为获得技能付出了额外的努力。
如果有的话,我想让你加入我的团队——明白吗?
2.成为数据科学家不需要硕士学位
让我在这里说实话——我相信这个神话已经很久很久了。
我曾经用 GRE,托福,什么的来准备“MS in US”的梦想。我害怕负债去支付一个我负担不起的学位,谢天谢地,这阻止了我,很久以后,我的导师(他也是谷歌的工程师)打破了这个神话。
他是这样说的:
“我从一所知名大学获得了硕士学位,但我的团队(谷歌)中有些人没有硕士学位,但他们的表现同样出色,甚至更好。硕士学位是历史上证明你专业技能的方式之一——还有其他方式。只要你能展示你的专业技能,你就会做得很好。”
我的第一份数据科学工作是大一新生,之前没有工作经验。我不相信我能把它收入囊中——直到我做到了。面试问题很棘手。然而,我刚刚结束了吴恩达的课程,所以所有的概念在我的脑海里都是新鲜的。
然后他们给了我一个带回家的任务,让我在几天后向整个团队展示我的解决方案。我做的报告让我得到了这份工作。我讲述了我以前是如何解决类似问题的,以及我面临的挑战。
你可以有一个硕士学位但仍然被拒绝,也可以没有硕士学位但仍然被录用——明白吗?
您需要的是:
你需要有一个展示你技能的项目组合。很自然,他们会对你的工作感到好奇,而你最终会在大约 50%的面试中谈论这个话题。
有许多方法可以解决这个问题。我是这样做的:
- 在 GitHub 上公开构建项目。瞄准一个简单的项目,然后不断改进。
- 免费使用 GitHub 页面创建一个简单的投资组合网站。
- 将所有相关链接添加到你的简历中。
这样做会极大地提高你被雇佣的机会。你不需要硕士;你需要一个投资组合。
3.你不需要工作描述中列出的 100%的技能来获得面试
塞巴斯蒂安·拉米雷斯 在 FastAPI 需要 4 年的经验,他在 1.5 年前创建了 FastAPI。PyCaret 库的创建者 Moez Ali 必须拥有超过 3 年的 PyCaret 经验,而 py caret 库是他一年前创建的。
如果不是《在数据科学领域建立职业生涯》这本书的作者,我可能不会勇敢地申请大多数工作。
事情是这样的:大多数职位描述是招聘经理的愿望清单,他们不想错过理想的候选人。他们知道理想的人几乎不存在并且对那些不完全符合他们要求的人完全没有意见。
经验法则是,只要你达到招聘者广告中职位要求的 60%,就可以申请。但是有更好的方法。
您需要的是:
你需要公开分享你的工作,这样招聘人员就能看到你并联系到你。
我现在虔诚地这样做。如果我在创作,我会公开创作。我在 LinkedIn 上分享我面临的挑战和学到的东西。
为什么选择 LinkedIn?这是每个招聘人员寻找人才的平台。
结果呢?平均来说,我会有 3-4 个招聘人员主动联系我进行面试。
当我听到新手说他们连面试都进不去,更别说被录用了,我感到很难过。我不是来吹牛的,只是告诉你我做了什么,收获了什么结果。
总结想法
我知道你为什么一直读到这里。打破神话很重要,尤其是当你心中有很多不确定性的时候。
但是猜猜什么更重要?将知识转化为行动的能力。
这是我敦促你采取行动的部分——因为这才是最重要的。
- 在线获取相关的数据科学技能。有了我推荐的所有课程,而且大部分是免费的,你可以在家学习,你没有任何借口。你来自什么背景一点都不重要。
- 创建一个展示你技能的项目组合。使用本指南开始。这是你在 50%的面试中最终会谈到的内容。
- 公开分享你的作品。它打开了人际关系的大门,让你获得真正的推荐,甚至迫使招聘人员主动联系你。你不就是这样找到我的吗?
请记住,没有人说这将是容易的。如果是的话,闯入数据科学没什么大不了的。获得数据科学领域的第一份工作是最难的。从那以后只会越来越好。把它作为你的动力怎么样?
要获得更多关于进入数据科学、真实体验和学习的有用见解,请考虑 加入我的电子邮件好友私人列表 。
如果你很看重这类文章,想支持我这个作家,可以考虑 报名成为中会员 。每月 5 美元,你可以无限制地阅读媒体上的故事。
https://arunnthevapalan.medium.com/membership
N-BEATS:基于神经基扩展的时间序列预测
零触发时间序列预测的深度学习模型
用 DALLE [1]创建
有一件事让时间序列预测变得特别。
这是数据科学中唯一深度学习和变形金刚没有明显优于其他模型的领域。
让我们使用久负盛名的 Makridakis M 竞赛作为基准——一系列展示时间序列预测领域最新进展的大规模挑战。
在被称为 M4 的第四次迭代中,获胜的解决方案是ES-RNN【2】,这是优步开发的混合 LSTM &指数平滑模型。有趣的是,6 个(57 个中的)纯 ML 模型表现很差,它们几乎没有超过竞争基线。
一年后,情况发生了变化。 Elemental AI (与 Yoshua Bengio 共同创立)发表了N-BEATS【3】, 一个纯深度学习模型,比 M4 获奖的 ES-RNN 模型高出 3%。但是还有更多。
在本文中,我们深入描述:
- N-BEATS的架构,模型如何工作,为什么如此强大。
- 如何产生可解释的预测。
- N 拍 N 拍如何实现无与伦比的零拍迁移学习。
- 为什么 ARIMA 不能原生支持迁移学习。
让我们开始吧。
如果你对时间序列预测感兴趣,可以查看我收集的最佳深度学习模型和教程。
什么是 N-BEATS
N-BEATS 是一种快速、可解释的 DL 模型,它使用完全连接层的双残差堆栈来重新创建统计模型的机制。
N-BEATS 代表NeuralBasisEx expansionA分析为TimeS 这家公司是由 Yoshua Bengio 联合创立的,后来被 T42 的 ServiceNow 收购。
N-BEATS 是一个有趣的预测模型,因为:
- 这是第一个超越所有成熟的统计方法的纯深度学习模型。
- 它提供了可解释的预测。
- 它为时序上的迁移学习奠定了基础。
大约在那个时候,亚马逊发布了其新颖的时间序列模型,被称为DeepAR【4】**。**虽然 DeepAR 包含深度学习组件,但该模型也采用了一些统计概念(最大似然估计)。
n 节拍—概述
让我们简单讨论一下 N-BEATS 的几个关键特质:
- 多时间序列支持 : N 拍可以在多个时间序列上训练,每个时间序列代表一个不同的分布。
- **快速训练:**模型不包含任何递归或自我注意层——因此,更快的训练&稳定的梯度流。
- 多时段预测:模型产生多步预测。
- **可解释性:**作者开发了 2 个模型版本, 通用 版本,以及 可解释性 版本。可解释版本可以输出关于趋势和季节性的可解释预测。
- **零触发迁移学习:**该模型可以将其知识转移到其他时间序列数据集,取得惊人的成功。
**注:**element ai 最初的 N-BEATS 实现仅适用于单变量时间序列。Darts 库发布了支持多元时间序列和概率输出的更新版本。在本文中,我们将重点放在原始版本上。
N-BEATS —通用架构
N-BEATS 架构很深,但非常简单。图 1 显示顶层视图:
**图 1:**N-BEATS 的顶层架构(来源)
注意 3 件事:
- 块 (蓝色)——基本加工单元。
- 栈 (橙色)——积木的集合。
- 最终型号 (黄色)——一叠叠的集合。
模型中的每个神经网络层只是一个密集(全连接)层。
让我们从第一个组件开始,即基本块:
1.基本块
假设H
是预测范围。在 N 拍中,回看窗口是视界H
的倍数。
图 2 显示了基本块的架构:
图 2: 基本块架构(来源)
让我们来看看引擎盖下。
在**图 3 中,我们使用来自电力数据集【5】**的纸张基准参数:
图 3: 基本块内的所有操作(图片由作者提供)
让我们看看这里会发生什么:
- 模型回顾
3 days
=72 hours
=3 horizons
来预测未来 24 小时的用电量。 - 该块接收回看窗口输入。
- 然后输入通过一个 4 层神经网络。
- 该计算的结果被导向 2 个输出。这里密集层密集层 5 估计θ参数(
θ^b
和θ^f
),称为展开系数。 - 然后,使用基层变换
g^b
和g^f
将这些参数线性投影到新的空间,以产生和 预测 信号。这个过程叫做“神经基础扩展”。
那么*、*反向预测和预测向量是如何有用的呢?
给定g^b
和g^f
变换,反向预测信号是能够最佳预测预测信号的最佳近似向量。当g^b
和g^f
采取特定的形式时,反向预测和预测向量就变成了可解释的(后面会详细说明)。
2.堆栈
为了提高神经扩展过程的效率,作者将许多块堆叠在一起。该结构显示在图 4:
图 4: 积木堆(左)和积木堆(右)——(来源)
只有第一个块接收原始序列输入。下游块接收来自前一块的回播信号**x_l+1**
(其中l
是块索引,即l_1
是堆栈中的第一块)。
图 5: 块内部的操作(图片由作者提供)
在每个堆栈内,反向预测和预测信号被组织成两个分支:这种拓扑被称为双重残差堆栈,并且可以由以下等式描述为:
在每个块中,模型从输入**x**_l
中移除已经很好地近似的那部分反向预测信号**x̂**_l
。换句话说:
每个模块的模型学习最佳地逼近输入信号的一部分,并发送其余部分以由下游模块逼近。
由于每个模块仅模拟输入信号的一部分,最终预测是来自所有模块的所有预测* ŷ
信号的总和。*
*最后,堆叠也堆叠起来(**图 4,*右)。这种架构选择进一步增加了模型的深度,并增强了其学习复杂时间序列的能力。
我们已经看到了通用版本的 N-BEATS 是如何工作的。接下来,我们将描述可解释的版本。
N-BEATS 和 ARIMA 有关系吗?
如果你熟悉 ARIMA ,你可能会注意到与 N 节拍方法的一些相似之处。**
ARIMA 使用 Box-Jenkins 方法建模,这是一个迭代过程。具体来说:
- 首先,我们猜测 AR() 和 MA() 函数(
p
和q
参数)的顺序。 - 之后,我们使用例如最大似然估计来估计这些参数的系数。
- 然后,我们验证模型的条件是否成立。例如,模型的残差应该是正态和独立的。如果没有,我们返回到步骤 1 并重复该过程。这一次,我们在之前的基础上增加了新的
p
和q
度。
换句话说,在 Box-Jenkins 的每一步中,我们都向模型中添加了更多的信息。每次迭代都会根据模型残差创建更好的输入表示。
因此,我们可以得出结论:
在 N-BEATS 中,每个连续的块仅模拟由前一个块重建的反向预测的残余误差,然后根据该误差更新预测。在拟合 ARIMA 模型时,这一过程模仿了 Box-Jenkins 方法。
这两种方法的主要区别在于残差的目标函数。 ARIMA 关注残差的质量,而 N-BEATS 使用任意损失函数。
另外,我们不用手动调整任何带有 N 拍的方程——基变换会通过反向传播自动优化。使用 ARIMA 然而,我们大量使用自相关和偏自相关图来猜测AR()
和MA()
函数的顺序。
***注意:*根据编程语言和库的不同,一些 ARIMA 库实现了略有不同的 Box-Jenkins 方法。在这里,我们记录了教科书的实现。
n-BEATS——可解释的架构
通过一些改变, N-BEATS 模型变得可以解释了:这些改变是:
- 我们只使用 2 个堆栈,趋势堆栈和季节性堆栈。通用架构至少使用 30 个。****
- 趋势和季节性堆栈都包含 3 个块。在通用架构中,每个堆栈有一个块。
g^b
和g^f
的基础层权重在堆栈级别共享。**
基本思想是g^b
和g^f
基采取特定的形式。让我们更详细地描述它们。
趋势块
我们的目标是将g^b
和g^f
函数重构为单调的,在预测窗口中缓慢变化。
给定一个时间向量t=[0,1,2,…,*H*−2,*H*−1]
( H
是地平线)、来自前一层的θsθ
和多项式次数p
,趋势模型被定义为:
换句话说,我们使用图 3* (通用块)的架构,用上面的操作交换最后一个线性层。结果如图 6 所示:***
图 6: 趋势块(图片由作者提供)
本文中没有描述逆向预测方程,但是它们可以很容易地从项目的实现中推导出来。此外,趋势和季节性块(图 6 和图 7* )采用来自官方项目报告的参数:***
***interpretable.seasonality_layer_size = 2048
interpretable.seasonality_blocks = 3
interpretable.seasonality_layers = 4
interpretable.trend_layer_size = 256
interpretable.degree_of_polynomial = 3
interpretable.trend_blocks = 3
interpretable.trend_layers = 4
interpretable.num_of_harmonics = 1***
季节性障碍
类似地,我们用适当的g^b
和g^f
函数替换最后一层,以捕捉季节性。傅立叶级数是一个很好的选择:
然后,架构变成:
图 7: 季节性区块(图片由作者提供)
我们再次强调,在所有可解释的堆栈中,堆栈中的g^b
和g^f
权重是共享的。
实验结果
最后,作者在 3 个流行的时间序列数据集上测试了 N-BEATS 的性能——M3[6]、M4[7]和旅游业[8]。
实验装置
作者将所有模型分为特定的类别,并将 N-BEATS 与每个类别的最佳模型进行比较。例如, DL/TS hybrid 是 M4 获奖的 ES-RNN 车型。
由于所有这些数据集都用于数据科学竞赛,因此所有参与者都依赖集成来实现最佳性能。因此, N-BEATS 的作者依靠集合来进行比较。他们使用了三种变体: N-BEATS-G (通用)、N-BEATS-I* (可解释)和N-BEATS-I+G(N-BEATS-G 和 N-BEATS-I 所有模型的集合)。***
最重要的是,他们创造了 6 个不同的模型,每个地平线和变化都有回顾窗口2H, 3H .. 7H
。关于组件配置的更多细节,请查看原始文件。总之,作者集合了 180 个模型来报告测试集的最终结果。
结果
所有数据集的结果如图 8:* 所示***
图 8: 在 M3、M4 和旅游数据集上的实验结果(来源
结果相当可观。
在所有数据集上, N-BEATS 优于其他实现,其中 N-BEATS-I+G 最为成功。
请注意,在每个数据集中,竞赛使用 MAPE、斯马普和 OWA 指标(越低越好)。这些指标在时间序列竞赛中很受欢迎。
****注意:与其他方法相反,N-BEATS 不需要任何手工制作的特征工程或输入缩放。因此,N-BEATS 在不同的时间序列任务中更容易使用。
零射击迁移学习
N-BEATS 的主要贡献是能够在时间序列上成功实现迁移学习。
预赛
迁移学习是一个更通用的术语——它指的是一个模型如何在不同的数据集之间转移其知识。这已经建立在计算机视觉或 NLP 任务上:我们可以下载一个预训练的模型,并通过微调将其调整到我们的数据集。
元学习(或少量学习)是指模型只需少量训练/微调就能适应我们的数据集。最好的场景是 零触发学习 ,其中模型不在目标数据集上训练。
零命中率学习是模型使用看不见的数据进行预测的能力,而无需对它们进行专门训练。这种学习方法更好地反映了人类的感知。
此外,这种向元学习的新范式转变已经被最新的人工智能研究所接受,如 open AI—*CLIP【9】和Whisper【10】就是其中的几个。*******
零拍 N 拍
yo shua beng io(N-BEATS的合著者)在之前的工作中已经建立了预测任务迁移学习的理论基础【11】。
N-BEATS 的作者发表了一篇后续论文[12],其中总结了大部分工作,包括时间序列预测模型应该满足哪些要求才能执行有效的迁移学习。
让我们来关注一下的 N-BEATS。
作者指出 N-BEATS 的元学习能力取决于两个过程:I)内部学习过程和外部学习过程。它们如图 9 所示:********
****图 9:N-BEATS 中的元学习过程(来源,作者编辑)
内部循环发生在每个模块内部,重点是学习特定任务的特征。
外部循环发生在堆栈级别。在这里,模型学习所有任务的全局特征。
换句话说,内环学习局部时间特性,而外环学习所有时间序列的更长相关性。
然而,这回避了下面的部分:
为什么 ARIMA 不适合迁移学习?
如果一个既定的范例规定了一个预测模型应该满足哪些标准才适合迁移学习,那么为什么 ARIMA 不是呢?
为了回答这个问题,我们将再次关注[12]描述的两个学习过程
创建 ARIMA 模型时,有两个挑战:
- ****参数估计:使用最大似然法等统计技术估计参数。这是内循环。
- ****模型公式:这定义了自回归方程的形式。例如,如果我们的模型有一点趋势,没有季节性,正常残差,我们可以决定高斯 ETS 可能会做这项工作。这是外循环。
请注意,统计模型只通过了第一个标准,即内部循环。
一旦我们选择了模型,参数估计部分就很简单了。但是,模型制定部分需要人工干预。因此,关于统计方法,外环的作用没有实现。
因此,我们得出结论:
N-BEATS 用可学习的参数估计策略取代了经典统计模型的模型参数估计的预定义规则集。这种策略允许 N-BEATS 在多个看不见的时间序列上很好地概括。
N 拍的零拍学习结果
在本次实验分析中,作者用一些新模型丰富了之前基准(图 8 )的结果:
- N 拍-M4: 作者在 M4 上建立了一个预训练的 N 拍模型。
- 迪帕尔-M4:M4 上的一款经过预训练的迪帕尔型号也加入了型号库。**
总结果如图 10* 所示:***
图 10: 零拍车型对比(来源)
同样,结果非常有趣。
- zero-shotN-BEATS-M4在 M4 和旅游数据集上的表现优于所有其他模型(包括获胜者),尽管它没有在这些数据集上进行训练。
- 零距离射击迪帕尔-M4* 似乎表现不佳。这是意料之中的,因为 DeepAR 不适合迁移学习。***
- 在每个数据集中,与定制训练的 N 拍相比,零拍 N 拍模型表现非常好。如果能看到在 Whisper 等其他零炮模型中发现的有效稳健性与总体稳健性的关系图,那将会很有意思。
结束语
N-BEATS 是一个突破性的深度学习预测模型,对时间序列领域产生了持久的影响。
在本文中,我们描述了 N-BEATS 的两个主要优势:首先,它是一个产生 SOTA 结果的强大模型。其次, N-BEATS 为实施零投迁移学习建立了一个定义明确的框架。据我所知,这是第一个成功实现这一点的模型。
**在我们的下一篇文章中,我们将介绍一个使用 N-BEATS、的编程教程,并描述一篇更新的论文,名为 N-HiTS 。
感谢您的阅读!
我每个月写一篇有影响力的 AI 论文的深度分析。
保持连接!
参考
[1]根据 DALLE 创作,文字提示“通过空间传输的霓虹正弦信号,概念艺术”,给 rg
[2] Slawek Smyl 等著M4 预测竞赛:引入全新混合 ES-RNN 模型
[3] Boris O .等著 N-BEATS:可解释性时间序列预测的神经基础展开分析 , ICLR (2020)
[4] D. Salinas 等人 DeepAR:用自回归递归网络进行概率预测 《国际预测杂志》(2019)。
[5]electricityloaddiagrams 2011 2014数据集由 UCI,CC BY 4.0。
[6]https://forecasters.org/resources/time-series-data/ M3 数据集,公共领域
[7]https://forecasters.org/resources/time-series-data/ M4 数据集,公共领域
[8]旅游数据集https://www.kaggle.com/c/tourism1,公共领域
[9]亚历克·拉德福德等 从自然语言监督中学习可转移的视觉模型(2021 年 2 月)**
[10]亚历克·拉德福德等人通过大规模弱监督的鲁棒语音识别(2022 年 9 月)**
[11] Yoshua Bengio 等人学习一个突触学习规则
[12] Boris O .等人 元学习框架及其在零炮时间序列预测中的应用