admin管理员组

文章数量:1645534

原文:TowardsDataScience

协议:CC BY-NC-SA 4.0

如何应用人工蜂群算法解决非常规问题

原文:https://towardsdatascience/how-to-apply-artificial-bee-colony-algorithm-to-solve-unconventional-problems-a41c5098eb3a

图片由 Silv3rXArt 提供。经许可使用。

解谜取乐。学习一种新的算法。双赢。全部代码。

我在上一篇文章中提到的人工蜂群(ABC)算法相当灵活,但它是否足够灵活来解决一个非常规问题;一个逻辑难题?答案变成了“为什么不呢?”。因此,我们将详细讨论如何建模和求解。经历这个过程也许能帮助你发现其他问题,做出更明智的商业决策。

本文的非常规问题是受门萨日历启发的火柴棍拼图。目标是燃烧火柴棒,以在每一列和每一行中获得指定数量的燃烧段。

火柴杆拼图。图片由作者提供。

我们将使用 ABC 算法来解决这个问题。

在解决过程中探索解决方案。图片由作者提供。

为什么是火柴杆

在 AAXIS Digital ,我和我的同事们经常会遇到并解决需要打破常规思考的复杂业务问题。同时,我也是一个活跃的工程师和谜题爱好者社区的一员,这个社区叫做 Rowdy 谜语者。因此,对于商业和娱乐,你可以说逻辑问题是我的难题。

我在吵闹谜语小组遇到了这个谜题。如果你觉得应该手动解决;我同意。我们去了,很有趣。但是在我看来,通过计算来解决它是一个有趣且值得的练习。

一位智者曾经说过:“如果你只有一把锤子,那么一切看起来都像钉子。”虽然这句古老的格言中有智慧,但我认为 ABC 算法更像一把瑞士军刀,你可以用它来解决不同类型的问题。我们对其应用的不同例子看得越多,我们就越能更好地识别日常优化问题中的模式,这将使我们能够做出更明智的商业决策。

烧伤婴儿烧伤

现在,我希望你相信这是一个值得做的任务,让我们更详细地看看这个难题。概括地说,目标是“燃烧”火柴棒,以获得每一列和每一行中燃烧段的指定总数。让我们看一看。

火柴杆拼图。图片由作者提供。

一个典型的 NxN 网格包含几个不同大小的火柴棍,只能从头烧到尾(没有跳过的部分),可以是未燃、部分燃或完全燃。目的是燃烧火柴杆,以在每列和每行中获得指定数量的燃烧段。

例如,要获得第 6 行(顶行)的燃烧计数 3,我们可以燃烧 3 段棒 1(棒号在棒的头部)或两段棒 1 和棒 7 的所有段。但是,刻录 stick 7 的所有片段(以到达 stick 7 的最后一个片段)是不可能的,因为我们会违反 a 列的刻录计数。因此,刻录 stick 1 的 3 个片段是唯一的可能性。

不断重复这个逻辑过程,谜题就解决了!

让我们解决这个问题

现在我们已经讨论了如何手动解谜,让我们来看看解决技巧。

问题中的每一根火柴棍都像是栈。每一段都应该从上到下烧(后进先出)。以下是一个备选解决方案示例。

候选解决方案。图片由作者提供。

这个解可以表示为每根火柴杆从顶端燃烧的段数。火柴杆 1 有 3 段燃烧,火柴杆 2 有 2 段燃烧,等等。因此,数学表达式为:

[3,2,3,1,0,2,0,1,2,2,3]

给定这个解决方案和电路板,我们现在可以用数学方法计算出每行和每列中烧坏的部分。有了这个候选解决方案,我至少能想到四种技术来计算解决这个问题:

蛮力:有 11 根棍子,最多 5 段可以烧。你可以进行强力全空间扫描,依次烧掉所有 11 根棍子。但是,这有什么意思呢?不过说真的,随着空间随着更多的行和列而扩展,强力将花费太长的时间并且变得不切实际。

逻辑:人们可以像数独一样解决它。按顺序应用必要和充分条件。然而,大多数问题都需要回溯的实现;这是一种技术,您可以从停止的地方进行存储,这样,如果选择的路径没有产生解决方案,您可以继续。这需要复杂的代码、内存使用,并且看起来越来越像暴力。此外,很难将这种技术推广到其他问题。

蒙特卡洛模拟(Monte Carlo Simulation):这种技术在这个维基页面上有更详细的描述,它使用随机猜测来解决问题。一万只不停打字的猴子可能会偶然发现解决方案,方法是随机设置有多少段被烧掉,然后测试答案是否接近;冲洗并重复。也许这对某些问题有用,但是大多数问题既没有时间也没有猴子来得到满意的解决方案。此外,我不能把我的手指放在它上面,但是关于猴子和点燃的火柴的一些事情似乎是错误的!

进化算法:这些算法从随机的初始群体(候选解)中构建,这些群体会不断变异,每一代都会变得更好,朝着一个解努力。遗传算法、蜂群算法、蚁群算法、粒子群算法以及人工蜂群算法都属于这一类。 ABC 算法受蜂群觅食行为的启发,在多个点随机探索解空间,随着每一个连续的世代收敛到更好的解。这使得它成为这个问题和其他业务决策案例的理想选择,因为它们可能没有完美的解决方案,或者可能需要太长时间才能得到一个。

让那些蜜蜂工作

人工蜂群(ABC) 算法由 Karaboga 于 2005 年[1]推出,“是一种基于群体的元启发式算法,用于优化数值问题,其灵感来自蜜蜂的智能觅食行为”(Karaboga)。

我的上一篇文章 [2]在对各种标准测试函数和业务问题进行测试时,分解了 ABC 算法的细节、目的和应用。但是,这里有一个快速总结:

该模型由四个基本组件组成:

  • 食物来源代表正在解决的问题的解决方案。
  • 雇佣蜜蜂在食物源周围搜索,对其进行微调,并使其进化以产生更多的花蜜。
  • 看客蜜蜂观察被雇佣的蜜蜂,探索最有希望的食物来源。这确保了越有希望的食物来源越能被开发。
  • 侦察蜂随机选择新的食物来源,以确保我们不会陷入局部最小值。

蜜蜂活动解 Himmelblau 函数。图片由作者提供。

通过对蜜蜂活动的进一步研究,在解决 Himmelblau 函数的同时,我们可以更好地理解上述组成部分。在周期 1 中(左上角),蜜蜂随机分布,每个点代表(X,Y)平面中被开发的食物源。当被雇佣的蜜蜂评估花蜜时,它们开始倾向于函数的 4 个最小值。旁观的蜜蜂被分配到最有希望的食物来源。同时可以看到侦察蜂随机出现,以确保评估整个空间,并且我们不会错过局部最小值。到第 25 个周期,大多数蜜蜂都集中在 4 个解决方案上。

这个解决方案的代码库和我上一篇文章的代码库是一样的,可以在这里找到。

清楚明白的细节

概括地说,问题如下:

火柴杆拼图。图片由作者提供。

网格在配置文件 config matchplay-1 . ini(PHP ini 文件格式)中被捕获

stack[] = B6,C6,D6,E6,F6    ;1
stack[] = B5,B4,B3,B2       ;2
stack[] = F5,E5,D5,C5       ;3
stack[] = C4,C3             ;4
stack[] = D4,E4             ;5
stack[] = F4,F3,F2          ;6
stack[] = A3,A4,A5,A6       ;7
stack[] = E3,D3             ;8
stack[] = A2,A1             ;9
stack[] = C2,D2,E2          ;10
stack[] = F1,E1,D1,C1,B1    ;11rCounts = "3,4,2,3,4,3"
cCounts = "3,3,3,4,3,3"

“堆栈”数组从头到脚定义了每个棒的位置。例如,棍子 1 通过 F6 占领 B6。每行和每列的拼图的理想烧焦段数分别在计数计数变量中给出。该配置文件在 MatchplayFoodSource 脚本中解析如下:

每一个 B6,C6 类型的符号都被转换成坐标([1,5],[2,5]等)并被存储。

剩下的部分是为给定的解决方案定义花蜜。然后,解决方案可以表示为下面的数组:

[3,2,3,1,0,2,0,1,2,2,3]

候选解决方案。图片由作者提供。

解决方案数组中的第一个数字是 3。这意味着棒 1(在最顶端)应该在它的 5 个片段中的 3 个中燃烧。斗杆 2(垂直)被烧成两段。诸如此类。

给定这个可能的解,我们可以将目标函数定义为候选解和理想解之间的均方根(RMS)误差。由于理想的解决方案是每一行和每一列中被烧毁的段的计数,我们可以通过编程来“计数”每一行和每一列中被烧毁的段,如图所示。

**╔════════╦═══╦═══╦═══╦═══╦═══╦═══╗**
║ **Row    ║ 1 ║ 2 ║ 3 ║ 4 ║ 5 ║ 6** ║
**╠════════╬═══╬═══╬═══╬═══╬═══╬═══╣**
║ Ideal  ║ 3 ║ 3 ║ 3 ║ 4 ║ 3 ║ 3 ║
╠════════╬═══╬═══╬═══╬═══╬═══╬═══╣
║ Actual ║ 4 ║ 3 ║ 2 ║ 3 ║ 4 ║ 3 ║
╠════════╬═══╬═══╬═══╬═══╬═══╬═══╣
║ Error  ║-1 ║ 0 ║ 1 ║ 1 ║-1 ║ 0 ║
╚════════╩═══╩═══╩═══╩═══╩═══╩═══╝**╔════════╦═══╦═══╦═══╦═══╦═══╦═══╗**
║ **Column ║ 1 ║ 2 ║ 3 ║ 4 ║ 5 ║ 6** ║
**╠════════╬═══╬═══╬═══╬═══╬═══╬═══╣**
║ Ideal  ║ 3 ║ 4 ║ 2 ║ 3 ║ 4 ║ 3 ║
╠════════╬═══╬═══╬═══╬═══╬═══╬═══╣
║ Actual ║ 2 ║ 3 ║ 3 ║ 4 ║ 3 ║ 4 ║
╠════════╬═══╬═══╬═══╬═══╬═══╬═══╣
║ Error  ║ 1 ║ 1 ║-1 ║-1 ║ 1 ║-1 ║
╚════════╩═══╩═══╩═══╩═══╩═══╩═══╝

现在我们有了烧坏部分的行和列计数,我们可以计算均方根。

函数值= ∑(行数-最佳行数)+ ∑(列数-最佳列数)

Function Value = (1+0+1+1+1+0) + (1+1+1+1+1+1) = 10

对于上一节中提出的解决方案,函数值是 10。

在上面的第一个循环中,从 0 到$dimensions,我检查了烧毁的段,并根据行(索引 0)和列(索引 1)进行计数。在上面的第二个循环中,我计算了理想值(堆栈数)和实际值(fsCount)之间的均方根差。

nectar 值在 AbstractFoodSource 类中处理如下:

现在是蜂蜜

现在我们已经掌握了血淋淋的细节,让我们看看几个解决方案。使用 configMatchPlay-1.ini 运行 ABC 算法时,其输出如下:

ABC 算法在比赛中的输出。

可视化解决方案,我们得到:

困惑与解答。图片由作者提供。

快速检查显示,解决方案是正确的,因为我们只从头部开始燃烧,没有跳过部分。根据谜题的规则,一些木棒没有燃烧,一些部分燃烧,另一些完全燃烧。为了帮助验证图像中的解决方案,沿着行和列显示了分段计数,这些计数加起来就是所需的结果。ABC 算法探索的候选解决方案如下所示。

在此过程中探索解决方案。图片由作者提供。

完成这个谜题后,让我们尝试一个更复杂的,网格不是正方形的,而是 5x10 的。

谜题 2:一个长方形的谜题。图片由作者提供。

该算法正确地缩小到解决方案。

探索难题 2 的解决方案。图片由作者提供。

最终正确的解决方案是:

矩形难题的解答 2。图片由作者提供。

现在,让我们来看看这个难题有不止一个解的情况。

谜题 3。图片由作者提供。

不出所料,ABC 算法准确地识别出了这个难题的两个正确答案,并且两个答案都准确地遵守了所有规则,如下所示:

谜题 3 的解答。图片由作者提供。

我现在要稍微修改一下上面的谜题,让它不可解。

无法解决的难题 4。图片由作者提供。

在行 1 中,列 C 棒必须被烧断以在该行中得到烧断段计数 4。相同的逻辑显示第 3、5 和 6 行。这意味着 C 列应该至少有 4 个段被烧毁。我们故意把 3 放在 C 列,让它不可解。

ABC 算法在运行时会生成一个足够接近所呈现的难题的解决方案,将目标函数最小化为 2。他们有 6 个人。

无法解决的难题的多种解决方案。图片由作者提供。

X/Y 轴上的数字显示了燃烧的总段数。如果燃烧段的总数显示为红色,则表示与理想解有偏差,并显示在数字旁边。例如,理想的解决方案应该在第 1 行中有 4 个燃烧段。然而,上面的解决方案 1 示出了(3,1),其中 3 是烧毁的段,1 是第 1 行的错误。

以下是解决这个难题时探索出的解决方案。

探索谜题 4 的解决方案。图片由作者提供。

虽然这可能不是难题的解决方案,但如果这是现实世界的问题,计算出的解决方案仍可用于做出明智的业务决策。现实世界中的业务问题可能通常没有完美的解决方案,因为不可能对控制问题适合度的所有规则进行编码。拥有多个解决方案可以为企业主提供他们可以评估和采取行动的选项。

综上

在这篇文章中,我们看了为什么,什么,以及如何解决逻辑难题火柴杆烧伤。我们深入研究了实现细节和代码片段,以理解算法及其应用。我们强调了 ABC 算法如何被证明足够灵活地应用于这个难题,以及当不存在精确解时,它如何给出近似的“足够好”的解。

虽然通过计算来解决这个特殊的逻辑难题可能有些矫枉过正,但我相信从这个过程中学到的知识可以应用到你在工作或学习中将要面临和必须解决的问题上。一般来说,进化算法,特别是 ABC 算法,只是程序员解决逻辑难题和现实世界挑战的工具之一。作为解决方案架构师,我们处在一个独特的位置,能够识别并解决通常很困难的挑战。这样做不仅可以降低企业的成本,还可以释放资源来完成其他高价值的任务。

衣服也许不能造就人,但算法可以造就程序员。

在这里探索代码。

参考

[1]卡拉博加,德尔维斯。“人工蜂群算法。”http://www.scholarpedia/article/Artificial_bee_colony_algorithm2010 年第 5 期第 3 期:6915。

[2]拉姆,纳雷什。“实现人工蜂群算法解决商业问题”,《走向数据科学》,https://towardsdatascience,(2022 年 3 月)。

构建人工智能解决方案的框架

原文:https://towardsdatascience/how-to-apply-artificial-intelligence-to-solve-business-problems-2b6fefd2683b

商业人工智能

构建人工智能解决方案的框架

在实践中构建有影响力的人工智能解决方案的方法。

罗伯特·蒂曼在 Unsplash 上的照片

人工智能在实践中

如果你遵循一个坚实的框架,在实践中构建机器学习或人工智能解决方案可能会很简单。我使用这个框架在各种行业用例中交付人工智能解决方案,包括:高风险客户识别、文档分类、客户细分和流失预测。

该框架跨越六个核心领域:业务捕捉、人工智能问题框架、数据策略、人工智能系统设计、可行性评估和绩效评估。

最好从业务捕获开始,然后在构建原型解决方案时完成其余部分。

定义:我在这里将原型定义为你构建的解决方案,它可以在小范围内运行以证明这个概念。

使用这种方法的优点:

  • 对推动商业价值的前期关注。
  • 通过价值与可行性评估,识别人工智能/人工智能解决方案投资机会的能力。
  • 数据源和解决方案设计的审计跟踪。
  • 将商业问题转化为 ML/AI 解决方案的框架。
  • 一份参考设计文档,方便您和工程师扩展您的解决方案。

作者图片

业务捕获

在业务捕获阶段,您与您的业务 SME 或分析师一起设计您的业务问题。以下是这方面的一些指南:

  • 业务领域&负责人:把这些记下来作为参考,你会想知道如果你的实验室成功了,谁有可能资助全面部署。
  • 利益相关者及其角色:你要记下 SME 联系人是谁,他们的角色或头衔是什么,分析师是谁,数据科学家,发起人等等。
  • 问题:写出需要解决的业务问题,你应该通过与你的业务 SME 交谈来了解这个问题。如果问题看起来太复杂,把它分解成更简单的子问题,分别解决。考虑回答以下问题:是什么推动了变革?谁拥有流程?成功的解决方案是什么样的?
  • **业务收益:**如果实施您的解决方案,您将评估业务收益。最初,这将是基于最佳可能结果的“信封背面”计算。原型构建完成后,您将对其进行优化。您将希望从数量和质量上表达这种商业利益。

AI 问题取景

一旦你抓住了你的业务问题,你可以尝试在一个高层次上用 AI&ML 的术语来框定它。

  • 价值主张:尝试理解谁是最终用户,他们的目标是什么,以及他们将如何从机器学习或人工智能中受益。
  • 决策:智能系统可以有效地做出决策。审视你的系统正在做出或补充的决策,规模和频率。在受监管的行业,如银行业,通常存在对“黑箱”模型的限制。因此,你也需要了解决策过程的可解释性。
  • ML 服务:您的智能解决方案可能需要您利用云平台或 ML PaaS 提供的 ML 或 AI 服务的组合。这是一个很有用的练习,可以在一个较高的层次上对这些进行分析,并决定它们可能是什么。广义地说,ML 服务分为以下几类:语言、NLP 和文本提取、计算机视觉和语音识别。
  • 机器学习:并不是所有的解决方案都需要你建立一个定制的机器学习模型。你应该评估你是否需要这样做。你应该注意到,构建你自己的定制 ML 解决方案通常比利用 ML 服务更复杂。

数据策略

数据是你的机器学习引擎的汽油,所以详细地捕捉你的数据需求是很重要的。最初考虑你对训练和推理的要求。如果你正在训练一个机器学习模型,什么特征可能是预测性的?如果只是做推断,需要哪些数据?例如,如果您正在构建一个 ID 验证引擎,您可能需要一些照片 ID,您需要知道如何捕获这些数据。

数据管理和采购

在这里,您也应该考虑您的数据管理和采购方法。

您使用结构化/半结构化数据、非结构化数据,还是两者都使用?

处理结构化和半结构化数据与非结构化数据有不同的要求。您存储数据的方式、处理成本、可用容量是需要考虑的一些因素。

在 GDPR 体系下,工业界对数据及其使用有严格的规定。你会想要有一个遵守这些的策略。了解个人数据是否被使用、数据来源、数据的主要联系人以及您计划存储数据的时间,将有助于您通过不可避免的数据审核。

最后,您将希望获得您的采购成本,数据不是免费的,如果需要昂贵的数据,您的价值主张可能会大打折扣。

数据标记

在一个行业环境中,你可能想要采取一种受监督的机器学习方法,但你可能没有带标签的数据。您需要在这里指定您的数据标记策略。你是在使用像 AWS 的 Mechanical Turk 这样的服务,还是会使用无监督学习来创建你的标签?

偏差缓解

您需要了解数据集中的偏差,并制定管理它们的策略。偏见的例子有:

  • 赞助偏见 *:你的数据来源是来自赞助代理吗?赞助机构倾向于隐瞒可能损害声誉的数据。例如,一家烟草公司收集的关于烟草对健康影响的数据。
  • 自我选择偏差 *:一种选择偏差,你的数据来源于那些自愿提供数据的人。这是大多数调查数据

*资料来源:机器学习工程,安德烈·布尔科夫(2020),第。44–47

人工智能系统设计

查看您的智能应用程序的细节。你应该使用商业捕捉和人工智能问题框架练习来帮助你了解这里。需要考虑的事项有:

  • 方法:以书面形式描述你打算采取什么方法来解决你的问题。你应该很清楚自己需要什么样的机器学习服务,是否需要训练一个模型。
  • 性能要求:你期望的最低性能标准是什么?您应该从您在测试数据上构建或使用的任何模型的延迟需求和性能的角度来考虑这一点。您的绩效目标应该符合您的业务需求。
  • 输出:你的输出是什么?您的智能系统会为另一个应用程序提供推理服务,还是会用于生成洞察仪表板?这将对您以后选择的设计模式产生影响。
  • 研究:你需要了解已经存在的可能解决你的问题的应用的前景。寻求“开箱即用”的解决方案通常比试图重新发明轮子更有效。另一件要考虑的事情是你试图解决的问题是否是一个典型的 ML 用例。关于 ML 项目的成功有很多不确定性,这有助于了解这个问题在过去是否已经解决,从而给你一个成功机会的概念。
  • 高级解决方案设计:规划您的端到端解决方案设计。如果您的解决方案是云原生的,请保持在服务级别,不要进入 ML 管道的细节(如果您正在训练模型)。这些图表对工程师很有用,他们可能会在某些时候帮助您进行生产规模调整。
  • 机器学习策略:如果你正在训练你自己的模型,列出你将尝试的模型和基线模型。这里值得一提的是每个模型的局限性。你还应该在这里画出一个更详细的机器学习管道,包括数据分离、数据争论、特征工程、模型训练&评估循环等步骤。一旦你训练的任何 ML 模型投入使用,你可能需要粗略地定义你的监控策略。考虑您希望监控的属性,如何设置基准性能和监控计划。作为标准,您可能希望监控数据质量、模型质量/性能、模型偏差漂移和特征属性。
  • 模型训练&评估:你对训练、验证和测试数据集的划分是怎样的?你将使用什么策略来调整你的超参数和测试你的模型?
  • 平台、工具和基础设施:想想你需要的服务以及它们会花你多少钱。如果你使用像 AWS 这样的云平台,有无数的机器学习服务可以利用,你可以使用 AWS 计算器工具来估计成本。其他云平台也有类似的选择,包括 Azure 和 GCP。

性能赋值

无论你是在培训你自己的定制模型,还是在利用现有的 ML 服务,你都应该根据你规定的要求来跟踪他们的表现。

对于定制的机器学习解决方案,您应该有一个科学严谨的策略来评估模型性能,以防止过度拟合,并最大化您的模型在生产中正常工作的机会。

ML 培训和评估流程(图片由作者提供)

可行性的估计

您应该记住,您的最终目标是构建一个可以在生产中工作并为您的业务增加价值的模型。一旦您确定了所有的需求并构建了原型,您将对您的解决方案的可伸缩性有更好的理解。这里要考虑的事情有:

  • 数据基础设施:数据访问、数量和质量。
  • ML/解决方案:可用技术资源、现有解决方案、解决方案知识。
  • 流程&系统:实现您的解决方案需要任何业务流程变更、系统调整或组织变更吗?
  • 诀窍:技术和领域知识对你有用吗?提高团队技能以满足需求需要多长时间?
  • 解活:你的解活要多久?

应用人工智能倡议组织 发布了一份白皮书,为你提供了一种评估你的智能解决方案可行性的方法。

价值与可行性

您应该能够评估您的解决方案的价值和可行性。你想去寻找具有高价值和高可行性的解决方案,很少有你设计的解决方案一开始就符合这一类别。你应该重新审视最初的设计,看看你是否能找到一种可行性更高的方法。如果您所在的组织处于智能应用采用曲线的早期,您可以考察其中的几个解决方案,看看哪里有投资机会。

注意:在业务捕获阶段,您已经估计了您的解决方案的价值。

可行性分数和值只是为了说明概念,不应当真(图片由作者提供)

  • 左上:目前很难做但商业价值很高的理想项目。
  • 左下:垃圾,商业价值相对较低,可行性低。
  • 右下:低垂的果实,商业价值低但可行性高。
  • 右上:火箭,商业价值高,可行性高。

最后的想法

应用人工智能解决商业问题很难。因为所有的活动部件,尽可能标准化你的方法以使过程更有效是绝对值得的。在这里,你可以随意使用对你有用的东西,并在你需要的地方进行调整。

⭐️ 我喜欢通过分享我在野外的数据科学经验来帮助人们。如果你还不是会员,可以考虑订阅 Medium,从我这里获得更多有用的内容。

https://johnadeojo.medium/membership

如何深入理解集成机器学习方法中的软投票和硬投票

原文:https://towardsdatascience/how-to-attain-a-deep-understanding-of-soft-and-hard-voting-in-ensemble-machine-leaning-methods-32a057fc63fa

如何通过从头开始构建执行投票的算法来完全理解软投票和硬投票的工作原理

由 Unsplash 上的 Element5 数码拍摄

背景

不久前,我在阅读一本名为《接近(几乎)任何机器学习问题》的书,作者是 Abhishek Thakur(参见https://www . Amazon . co . uk/approximate-Almost-Machine-Learning-Problem-ebook/DP/b 089 p 13 qht),当时我看到了一些在集成学习中实现软投票和硬投票的代码。

我有三个问题-

  1. 我不完全理解代码。
  2. 它只适用于二进制类(恰好有两个类的分类问题)。
  3. 我不明白为什么没有人使用 sckikit-learn 实现。

事实证明,第三点的答案是,你可以学到很多关于这些算法在做什么,从而通过从头开始构建它们来获得更全面的理解,因此我开始自己构建它们,并有一些次要目标-

  1. 抓住机会尽可能多地学习 numpy 数组、数组切片和矢量化运算。
  2. 挑战自己不断重构代码,直到我优化了算法,遵循“Pyhtonic 方式”,尽可能减少代码行。

本文的其余部分对我的发现提供了完整的解释。

快速回顾集合方法中的软投票和硬投票

集成方法将两个或多个独立的机器学习算法的结果集合在一起,试图产生比任何单个算法都更准确的集体结果。

在软投票中,每个类别的概率被平均以产生结果。例如,如果算法一以 40%的概率预测到一个物体是岩石,而算法二以 80%的概率预测到它是一个地雷,那么该集合将以(80 + 40) / 2 = 60%的概率预测到该物体是一个地雷。

在硬投票中,考虑每个算法的预测,集合选择具有最高票数的类别。例如,如果三种算法预测特定葡萄酒的颜色为“白色”、“白色”和“红色”,则整体将预测“红色”。

入门指南

我们将需要导入几个库,设置一些常量,并在输出中设置科学符号为“off ”,以提高结果的可读性…

我们还需要一些数据作为分类的输入。make_classification_dataframe助手函数将数据创建为结构良好的DataFrame,带有特性名称和命名目标。

注意,类的数量被设置为 3。这一点很重要,因为我们将为非二进制分类(即超过 2 个类别)求解软投票和硬投票算法。

为非二进制情况精心设计的解决方案适用于二进制,但我见过的其他代码示例只适用于二进制。

例如,在岩石和矿井的例子中,如果对象可以是“岩石”、“矿井”或“炸弹”,则有 3 个类需要可以处理非二进制情况的算法(只有“岩石”和“矿井”)。

作者图片

交叉折叠验证

交叉折叠验证被选为评估算法性能的方法,而不是更简单的train_test_split,因为它通常提供更准确的算法性能指标。

scikit-learn中实现的一个问题是,没有办法访问我们从头开始构建软投票和硬投票所需的潜在概率和折叠预测。

cross_val_predict助手函数提供了实现这一点的代码,完整的解释可以在我关于如何为交叉折叠验证绘制混淆矩阵的文章中找到

请注意,我为本文添加了predicted_proba,并引入了对try, except块的需求,因为并非所有算法都支持概率,并且没有一致的警告或错误来显式捕获。

在我们开始之前,让我们快速看一下一个算法的cross_val_predict

Wall time: 309 ms
Accuracy of Logistic Regression: 0.6821array([0, 0, 1, ..., 0, 2, 1])

一切都相当简单明了。cross_val_predict已返回概率和预测类,预测类已显示在单元格输出中。

第一组数据被预测为属于类 0、第二类 0、第三类 1 等。

为多个分类器进行预测

我们需要做的下一件事是为几个分类器生成一组预测和概率,这样投票就有了聚合的对象。选择的算法是一个随机森林,一个 XG boost 和一个额外的随机森林,使用下面的代码实现…

Wall time: 17.1 s
Accuracy of Random Forest: 0.8742
Wall time: 24.6 s
Accuracy of XG Boost: 0.8838
Wall time: 6.2 s
Accuracy of Extra Random Trees: 0.8754

predictions是一个简单的列表,包含每个算法的一个预测类数组…

[array([2, 0, 0, ..., 0, 2, 1]),
 array([2, 0, 2, ..., 0, 2, 1], dtype=int64),
 array([2, 0, 0, ..., 0, 2, 1])]

predicted_probas有点复杂。这是一个简单的列表,包含每个预测算法的数组。每个数组都有形状(10000,3)。对此解释如下-

  • 10,000 是样本数据集中的数据点数。每个数组针对每组数据都有一行
  • 3 是我们的非二元分类器中的类的数量

输出中的第一行可以解释如下-

对于第一种算法,第一组数据(即DataFrame中的第一行)有 17%的概率属于类别 0,2%的概率属于类别 1,81%的概率属于类别 2。

我记得我第一次看到来自predcited_proba方法的输出时,我感到非常困惑,所以希望这个解释能拯救我第一次感觉到的困惑!

[array([[0.17, 0.02, 0.81],
        [0.58, 0.07, 0.35],
        [0.54, 0.1 , 0.36],
        ...,
        [0.46, 0.08, 0.46],
        [0.15, 0\.  , 0.85],
        [0.01, 0.97, 0.02]]),
 array([[0.05611309, 0.00085733, 0.94302952],
        [0.95303732, 0.00187497, 0.04508775],
        [0.4653917 , 0.01353438, 0.52107394],
        ...,
        [0.75208634, 0.0398241 , 0.20808953],
        [0.02066649, 0.00156501, 0.97776848],
        [0.00079027, 0.99868006, 0.00052966]]),
 array([[0.33, 0.02, 0.65],
        [0.54, 0.14, 0.32],
        [0.51, 0.17, 0.32],
        ...,
        [0.52, 0.06, 0.42],
        [0.1 , 0.03, 0.87],
        [0.05, 0.93, 0.02]])]

从头开始实现软投票和硬投票

这里我们已经到了文章的主要部分。软投票和硬投票只需几行 Python 代码就可以实现,如下所示。

然而,这并不是我的第一次尝试。我的第一次尝试没有那么“Pythonic 化”,包含了更多的代码,但实际上它的可读性更好。

如果你想看我的第一次尝试,看看这个— …

如果你完全理解下面的代码,你可以跳过下一节,但我认为它非常复杂,很难阅读和理解,所以我在下面提供了完整的解释。

在我们继续之前,有必要指出,软投票的表现比表现最好的单个算法高出 0.3% (88.68%对 88.38%)。

Accuracy of Random Forrest: 0.8742
Accuracy of XG Boost: 0.8838
Accuracy of Extra Random Trees: 0.8754
Accuracy of Soft Voting: 0.8868
Accuracy of Hard Voting: 0.881

投票算法的解释

软投票的代码

array([[0.18537103, 0.01361911, 0.80100984],
       [0.69101244, 0.07062499, 0.23836258],
       [0.50513057, 0.09451146, 0.40035798],
       ...,
       [0.57736211, 0.05994137, 0.36269651],
       [0.09022216, 0.01052167, 0.89925616],
       [0.02026342, 0.96622669, 0.01350989]])

numpy mean函数沿 0 轴(列)取平均值。理论上,这应该是软投票的全部内容,因为这已经创建了 3 组输出的平均值,并且看起来是正确的。

但是,舍入误差行的值并不总是等于 1,这很麻烦,因为每个数据点都属于概率为 1 的三个类别之一…

0.9999999826153119array([0.18537103, 0.01361911, 0.80100984])

这是非常不幸的,但很容易补救。因为我们希望所有 3 个类的概率对于每个数据点加 1,所以我们需要做的就是将最后一列中的值设置为 1-其他列中值的总和…

1.0array([0.18537103, 0.01361911, 0.80100986])

现在一切看起来都很好,每一行的概率加起来是 1,就像它们应该的那样。

然而,我们仍然需要知道类别预测(即,对于每一行,软投票预测了类别 0、1 或 2)。幸运的是,numpy库中精彩的argmax函数能够在一行代码中实现这一点…

array([2, 0, 0, ..., 0, 2, 1], dtype=int64)

argmax函数只是沿着axis参数中指定的轴选取数组中最大值的索引,因此它为第一行选取 2,为第二行选取 0,为第三行选取 0,依此类推。

硬投票的代码

使用 Python 列表理解和numpy数组函数,可以在一行代码中实现硬投票算法…

np.array(predictions).T语法只是转置了数组的数组,因此它不是 3 行和 10,000 列,而是 10,000 行和 3 列…

(3, 10000)array([[2, 2, 2],
       [0, 0, 0],
       [0, 2, 0],
       ...,
       [0, 0, 0],
       [2, 2, 2],
       [1, 1, 1]], dtype=int64)

然后 list comprehension 有效地获取每个元素(行)并对其应用statistics.mode,从而选择从算法中获得最多投票的分类…

array([2, 0, 0, ..., 0, 2, 1], dtype=int64)

使用 Scikit-Learn

手工制作的软投票和硬投票算法确保了我们对正在发生的事情有一个全面的了解,所以是时候走捷径,使用scikit-learn VotingClassifier为我们做所有的工作了…

Wall time: 1min 4s
Wall time: 55.3 s
Accuracy of SciKit-Learn Soft Voting: 0.8868
Accuracy of SciKit-Learn Hard Voting: 0.881

令人欣慰的是,scikit-learn实现产生了与 scratch 构建算法完全相同的结果——软投票的准确率为 88.68%,硬投票的准确率为 88.1%。

好吧,让我们把厨房的水槽扔过去!

那么,通过在投票中包含广泛的分类算法,我们究竟可以在准确度测量方面实现多大的改进呢?

在这里,我们将把投票中使用的算法数量扩展到 6 个,看看我们能从整体中挤出多少性能…

方法 1:使用临时构建的投票

Wall time: 14.9 s
Accuracy of Random Forest: 0.8742
Wall time: 32.8 s
Accuracy of XG Boost: 0.8838
Wall time: 5.78 s
Accuracy of Extra Random Trees: 0.8754
Wall time: 3min 2s
Accuracy of Neural Network: 0.8612
Wall time: 36.2 s
Accuracy of Support Vector Machine: 0.8674
Wall time: 1.65 s
Accuracy of Light GMB: 0.8828
Accuracy of Soft Voting: 0.8914
Accuracy of Hard Voting: 0.8851
Wall time: 4min 34s

方法 2:使用 SciKit-Learn 和 cross_val_predict

Wall time: 4min 11s
Wall time: 4min 41s
Accuracy of SciKit-Learn Soft Voting: 0.8914
Accuracy of SciKit-Learn Hard Voting: 0.8859
Wall time: 8min 52s

方法 3:使用 SciKit-Learn 和 cross_val_score

Accuracy of SciKit-Learn Soft Voting using cross_val_score: 0.8914
Wall time: 4min 46s

结论

3 种不同的方法对软投票准确性的评分一致,这验证了研究并表明临时构建投票算法工作正常。

向混合中添加神经网络、支持向量机和光 GMB,使得软投票的准确度从 88.68%提高了 0.46%,达到 89.14%,并且新的软投票准确度比最佳个体算法(XG Boost 为 88.38%)好 0.76%。还需要注意的是,加入比 XG Boost 精度分数低的光照 GMB 将整体性能提高了 0.1%!

这些都是边际收益,所以选择使用软投票最终是增加复杂性与实现改进的影响和含义之间的平衡。

如果这是一场 Kaggle 竞争,那么 0.76%可能会很大,可能会让你在排行榜上一飞冲天。如果你对矿石进行分类,你会想要额外的准确性,而如果你对红葡萄酒和白葡萄酒进行分类,你可能会喜欢简单的分类。

总之,通过这项研究并从头开始构建软投票和硬投票算法,对理解它们有了很大的改善,这将帮助数据科学家在构建现实世界的预测机器学习算法时做出正确的选择。

最后一点:Scikit 的局限性——学习硬投票

在这篇文章的研究中,我遇到了一个完全的障碍,出现了一个我无法理解的错误消息,结果发现这是因为在某个地方的库中有一个 bug,这意味着下面的组合不起作用

  1. 数据集中的目标是非二进制的(即分类有两个以上的类)。
  2. scikit-learn通过设置voting="hard"被用于硬表决。
  3. 估计器包括一个catboost.CatBoostClassifier(其他一些分类器产生相同的结果)。

您可以使用下面的代码尝试这种组合,您将获得一个ValueError: could not broadcast input array from shape (2000,1) into shape (2000)。注意:我特意使用了cross_val_score来保证这个 bug 不是由cross_val_predict帮助函数中的任何东西引起的。

然而,本文中开发的从头实现硬投票的代码确实支持这种组合,所以如果您需要在非二进制分类的硬投票中包含一个CatBoost,本文提供了唯一的方法,直到错误被修复。

**ValueError**: could not broadcast input array from shape (2000,1) into shape (2000)

感谢您的阅读!

如果你喜欢读这篇文章,为什么不看看我在 https://grahamharrison-86487.medium/的其他文章呢?此外,我很乐意听到您对这篇文章、我的任何其他文章或任何与数据科学和数据分析相关的内容的看法。

如果你想联系我讨论这些话题,请在 LinkedIn 上找我—https://www.linkedin/in/grahamharrison1或者发邮件给我ghar rison @ Lincoln college . AC . uk。

如果你想通过订阅来支持作者和全世界 1000 个为文章写作做出贡献的人,请使用下面的链接(注意:如果你使用这个链接免费注册,作者将收到一定比例的费用)。

https://grahamharrison-86487.medium/membership

如何自动化和简化您的机器学习实验工作流程

原文:https://towardsdatascience/how-to-automate-and-simplify-your-machine-learning-experiment-workflow-2be19f4aaa6

ArgParse 是一个有用的模块,我用它来执行多个 ML 实验,并在 web 应用程序中清晰地报告观察结果

活动发起人在 Unsplash 上的照片

无论是为了确定最佳模型,还是为了了解模型对数据或超参数的不同变化的细微差别,您都需要进行大量的机器学习实验。结果可能是有趣的,使模型选择的过程。

作为我工作的一部分,我通常不得不执行一些 ML 实验,这些实验可以是——(比如)测试降维技术、文本预处理技术(在 NLP 模型的情况下)的有效性,或者像处理测试集大小这样的简单事情。无论哪种方式,您都可能不得不多次运行一个代码,并记录所有观察结果以便以后进行比较。这与超参数调整过程略有不同,我们的目的是确定最适合我们问题的技术。

因此,在过去的几年中,我从机器学习社区中获得了一些东西,并将其转化为一个整洁的工作流程。

问题

先建一个小问题。我们可以尝试使用 Sklearn 的 make_classification 方法,通过人工生成高维数据集来解决二元分类任务的情况。

我生成了一个包含 1000 个实例和 30 个特征(15 个信息性特征和 15 个冗余特征)的数据集,并测试了以下内容:

  1. 两种降维技术——主成分分析(PCA)和局部线性嵌入(LLE)
  2. 两种类型的期望输出维度(来自降维技术)— 5 维和 10 维(因为我们有 30 维数据)。
  3. 三种机器学习分类器—逻辑回归、SVC 和随机森林分类器。

这样,我们有 12 个不同的实验(2 x 2 x 3)来得到所有不同组合的结果。手动运行所有的实验会令人疲惫不堪,所以我使用了一些 python 库和工具来简化它。

如您所见,运行 12 个不同实验的目的是为了选择更好地解决问题的适当技术。在训练 ML 分类器时,我们还需要包括超参数调整(为了解释简单,我将跳过这一步)。

该过程

首先,我将制作一个代码框架,包含所有必要的预处理步骤、模型训练和模型评估。

第二步是将以下集成/更改添加到代码框架中:

  1. 将代码保存在.py文件中(以防 Jupyter 笔记本用于训练模型)。
  2. 使用 Argparse 模块包装代码,该模块帮助我们在命令行中使用用户定义的参数运行代码。
  3. 在一个.sh文件中用所有用户定义的参数编写一个循环。这个 shell 脚本将用于多次运行.py文件,每次我们都使用for loop来更改参数。
  4. 将结果和工件(如果有的话)发布到 web 应用程序。

代码

我列出了循环实验的所有步骤,现在让我们来看看我准备的代码框架。在arguments块上做一个记录。这些是用户定义的参数,或者是我们在实验过程中感兴趣的参数。

上面显示的是一个简单的降维和二进制分类代码。准确度分数被用作定义分类模型性能的度量。

代码的顶部提到了用户定义的参数。我们希望将 argparse 包装器集成到这些参数中。过程相当简单。

我们添加了parse_args()函数来包含所有用户定义的参数。整个代码封装在另一个名为main(args)的函数中,该函数接受参数。如您所见,argparse 的集成很容易。

Shell 脚本

现在,我们已经准备好了带有代码的argparse_automate.py文件和所有用户定义参数的 argparse 包装器。下一步是创建如下所示的 shell 脚本:

loop.sh将 python 文件与所有参数循环在一起。我们只需要使用命令行来运行 shell 脚本,所有 12 个实验将一个接一个地运行。echo选项将打印用于特定运行的特定参数(如果需要,您可以删除它)。

注意:即使其中一个实验出现错误,循环仍会继续运行。

工件和 Web 应用程序

在这个例子中,我没有保存任何 ML 工件,比如可视化、模型保存文件或者结果。将对应于每组参数的工件保存起来,并将它们排序到它们自己的特定文件夹中,这将非常方便。

在 Python 中创建嵌套文件夹的一种简单方法是使用路径库:

path = f'output/{dim_red_type}/{n_comp}/{classifier}/'Path(path).mkdir(parents=True, exist_ok=True)

每个实验都有一个文件夹,所有的结果都可以方便地访问。

更进一步,所有这些结果和工件都可以在一个 Streamlit web 应用程序中显示。它看起来会像这样:

Streamlit Web 应用程序(图片由作者提供)

在上面 Streamlit web 应用程序的屏幕截图中,我包含了一个带有单选按钮(在左边)的过滤器选项,可以用来切换所需的参数。通过这种方式,不同实验和人工制品的结果可以在一个地方查看,不会太混乱。这对于以清晰的方式向不精通机器学习的客户展示结果非常有帮助。

与本文相关的代码可以在这个 GitHub repo 中找到。您可以根据您的项目进行修改。

可能存在比我在本文中使用的方法更好的方法。如果你知道有什么技术可以改进我建议的工作流程,请随时告诉我!

感谢阅读,干杯!

**Want to Connect?**Reach me at [LinkedIn](https://www.linkedin/in/rohithteja/), [Twitter](https://twitter/rohithtejam), [GitHub](https://github/rohithteja) or just [Buy Me A Coffee](https://www.buymeacoffee/rohithteja)!

如何在 LinkedIn 上自动创建帖子

原文:https://towardsdatascience/how-to-automate-creating-posts-on-linkedin-f87a5484be00

LinkedIn API 上的 Python 和 Postman 教程

照片由格雷格·布拉在 Unsplash 上拍摄

LinkedIn API 不是一个容易使用的 API。我花了几乎一整天的时间试图弄清楚如何设置访问令牌来在 LinkedIn 上创建文章。

但是…

我最后得出的结论是 LinkedIn API 写不了文章。而是分享一篇文章。它可以在经过身份验证的用户的个人资料上发布文本。

白白在这上面花费那么多时间真令人沮丧。但并不是因为这篇博文就没用了。

在这篇文章中,我将告诉你如何比我花更少的时间。您将能够设置访问令牌,以便您可以在下一个使用 LinkedIn API 的项目中使用它。

本教程重点介绍在 LinkedIn 个人资料上发布文本、媒体和/或 URL 链接所需的设置。

让我们做吧,这样你就能做了。

先决条件

创建一个新的 LinkedIn 应用程序或从 LinkedIn 开发者门户选择一个现有应用程序。

注意,您需要为您的应用程序创建一个新的 LinkedIn 页面(如果您还没有的话)。

默认情况下,应用程序将被授予三脚 OAuth 权限。

配置应用程序

从门户中选择您的应用程序。然后,单击“Auth”选项卡查看您的申请凭证。

您将看到客户端 id 和客户端密码。您将需要它们作为环境变量,所以将它们复制并粘贴到 shell 文件中,如下所示:

**export** LINKEDIN_CLIENT_ID=<**your** client id>
**export** LINKEDIN_CLIENT_SECRET=<**your** client secret>

如果您使用的是 Linux,打开这个~/.bashrc文件并添加上面的行。类似地,对于 Mac,如果默认 shell 是 bash,将这两行添加到~/.bash_profile。如果 zsh,把他们加到~/.zshrc

确保运行source ~/.bashrcsource ~/.bash_profilesource ~/.zshrc(取决于您的 shell 和机器)来使环境变量对您的 shell 可用。

最后,添加重定向链接。示例:[https://dev.example/auth/linkedin/callback](https://dev.example/auth/linkedin/callback)

我把它作为脑波媒介网址。所以做你想重定向到的任何页面。确保它是一个绝对的 URL(带有协议),就像例子一样。

请求授权码

在 LinkedIn 开发人员门户中,选择您的应用程序后,转到“产品”选项卡。

选择我们需要在本教程中访问的两个产品:

  1. 在 LinkedIn 产品上分享
  2. 使用 LinkedIn 产品登录

在 LinkedIn 上分享并使用 LinkedIn 产品登录。(作者截图)

让我们来看看下面的代码片段,以获得授权代码:

import requests
import os
import webbrowser**def** authorize():
    """Authorizes the user and opens a browser window to get the code."""url = "https://www.linkedin/oauth/v2/authorization"
    payload = {
        "response_type": "code",
        "client_id": os.getenv("LINKEDIN_CLIENT_ID"),
        "redirect_uri": "<your redirect link>",
        "state": "SADvGFt74M36bgwLoe753",
        'scope': 'r_liteprofile r_emailaddress w_member_social',
    }
    response = requests.Request("GET", url, params=payload)
    url = response.prepare().url
    webbrowser.**open**(url)**if** __name__ == "__main__":
    authorize()

如您所见,这里的url是要获得授权的端点,而payload是要发送给服务器的参数。

然后,你会得到一个通过webbrowser.open()功能在你的浏览器中打开的 URL,你将允许应用程序被授权。

授权应用程序“测试”。(作者截图)

最后看网址。您会发现链接了授权码的重定向 URL。

让我们了解一下有效载荷由哪些部分组成:

  1. response_type是我们希望从服务器得到的响应类型。在这种情况下,我们希望获得一个授权码。所以,我们将它设置为code
  2. client_id是您在创建应用程序时生成的客户机 id。尽管您已经将它粘贴到了环境变量中。
  3. redirect_uri是您在上一节中设置的 URL。
  4. state参数用于防止 CSRF 攻击,可选但推荐使用。
  5. scope是你需要访问的权限。

本教程选择的 OAuth 2.0 范围。(作者截图)

例如,如果重定向 uri 是https://medium/the-brainwavestateSADvGFt74M36bgwLoe753,那么浏览器上的 URL 将是这样的:https://medium/the-brainwave?code=<YOUR_AUTHORIZATION_CODE>&state=SADvGFt74M36bgwLoe753

其中<YOUR_AUTHORIZATION_CODE>是一个很长的字符串,您需要复制并粘贴到下一步的code参数中以获得访问令牌。

获取访问令牌

在下面的函数中,您将通过向 access token 端点发送 post 请求来获取访问令牌:

**def** get_access_token(code):
    """Returns an access token."""url = "https://www.linkedin/oauth/v2/accessToken"
    payload = {
        "grant_type": "authorization_code",
        "code": code,
        "redirect_uri": "<your redirect link>",
        "client_id": os.getenv("LINKEDIN_CLIENT_ID"),
        "client_secret": os.getenv("LINKEDIN_CLIENT_SECRET"),
    }
    response = requests.post(url, params=payload)
 **return** response.json()["access_token"]**if** __name__ == "__main__":
    # authorize()
    code = "<YOUR_AUTHORIZATION_CODE>"
    **print**(get_access_token(code))

其中grant_type的值为authorization_code,code是您从上一步中获得的授权码。我们讨论了除了client_secret之外的其余参数,T3 是您粘贴到环境变量中的凭证。

现在,您可以使用访问令牌向 LinkedIn API 发出请求。

使用 Postman 测试您的应用程序

现在使用访问令牌测试您的应用程序。邮递员是一个很好的工具。

打开 Postman,进入授权选项卡,选择授权类型为OAuth2.0。然后,选择Access Token选项并粘贴您在上一步中获得的访问令牌。

要在 LinkedIn 上发帖,你需要有一个授权用户的 ID。您可以通过向me端点发送请求来获取 ID:

GET [https://api.linkedin/v2/me](https://api.linkedin/v2/me)

简单到对这个https://api.linkedin/v2/me端点的 GET 请求。

在响应的最后,您将看到用户的 ID。复制并粘贴它,因为您将在下一步中需要它。

创建帖子

现在,您可以通过向用户生成内容(UGC) API 端点发送 post 请求来创建 POST。所以:

POST [https://api.linkedin/v2/ugcPosts](https://api.linkedin/v2/ugcPosts)

最后,转到 Postman 上的body选项卡,用以下参数填充请求体:

{
    "author": "urn:li:person:<YOUR ID FROM THE PREVIOUS STEP>",
    "lifecycleState": "PUBLISHED",
    "specificContent": {
        "com.linkedin.ugc.ShareContent": {
            "shareCommentary": {
                "text": "A text from LinkedIn API."
            },
            "shareMediaCategory": "ARTICLE",
            "media": [
                {
                    "status": "READY",
                    "description": {
                        "text": "The description field coming from LinkedIn API."
                    },
                    "originalUrl": "https://blog.linkedin/",
                    "title": {
                        "text": "Testing LinkedIn API"
                    }
                }
            ]
        }
    },
    "visibility": {
        "com.linkedin.ugc.MemberNetworkVisibility": "PUBLIC"
    }
}

并用上一步中的 ID 替换<YOUR ID FROM THE PREVIOUS STEP>

这应该会创建一个包含以下文本的帖子:“来自 LinkedIn API 的文本。”分享本文链接:https://blog.linkedin/

最后的想法

我们已经讨论了如何认证和授权您的 LinkedIn 帐户。这允许您访问 API 的一些功能,如创建帖子和共享媒体内容。

除非您想更改权限,否则您只需被授权一次。所以不用担心!您将能够使用该 API 而无需任何进一步授权来创建和自动化您的 LinkedIn 帖子。

现在就获得免费的 Python 电子书,学习为你的下一个项目编写高效 Python 代码的 5 种方法。

信用

  • 如何使用 Python 调用 LinkedIn API?
  • 登录 LinkedIn
  • 在 LinkedIn 上分享

https://ezzeddinabdullah.medium/membership

如何用 Python 自动化猴子的工作

原文:https://towardsdatascience/how-to-automate-monkey-jobs-with-python-1910a3219fd2

基于 Windows GUI 的双因素身份认证流程示例

照片由杰米·霍顿拍摄于未拍摄的

没有人喜欢所谓的“ ”猴子工作 ”,不需要任何创造力的重复性工作。但是我们总是(几乎)有一个选择,我们可以自动完成这些类型的任务,把我们的时间投入到更有成就感的事情上。

在这篇文章中,我们将看到如何通过将 GUI(图形用户界面)应用于一个特定的用例来自动化需要与 GUI(图形用户界面)交互的过程。

用例

数据提取过程需要自动化。只有当请求是从某个 VPN(虚拟专用网)执行时,执行数据提取的 API 才可用。为了能够连接到 VPN:

  • 我们必须使用 Windows 虚拟机。
  • 我们将使用 RDP(远程桌面协议)连接到它。
  • 该虚拟机中安装了一个脉冲安全客户端。

糟糕的是,Pulse 安全客户端每 8 小时从 VPN 断开一次,并且需要双因素认证过程才能重新连接。

(其他更推荐的选项,可能是向网络管理员请求 VPN 隧道)。 ¯\_(ツ)_/¯

连接到脉冲安全 VPN 的过程:

1 .必须按下连接按钮。

作者图片— Pulse 安全接口(断开连接)

2 .将需要一个双因素令牌

按作者分类的图像-双因素弹出窗口

3.必须复制(从小部件或其他来源)和粘贴(在上一个弹出窗口中)双因素令牌:

按作者分类的图像—双因素小部件

4.几秒钟后,连接将成功建立

作者图片— Pulse 安全接口(已连接)

由于我们希望每天自动执行数据提取,因此我们必须找到一种无需人工干预即可自动执行重新连接过程的方法。

解决办法

对于我们的解决方案,我们需要:

  • Python 作为编程语言。
  • Pywinauto 自动化 GUI 任务。
  • Pyperclip 使用 Windows 回形针。

Le 看不出前面的流程是怎么实现的(完整代码在最后):

连接到脉冲安全 VPN 的过程:

1 .必须按下连接按钮。

作者图片— Pulse 安全接口(断开连接)

2 .将需要一个双因素令牌

按作者分类的图像-双因素弹出窗口

3.必须复制(从小部件或源)和粘贴(在上一个弹出窗口中)双因素令牌:

按作者分类的图像—双因素小部件

4.几秒钟后,连接将成功建立

作者图片— Pulse 安全接口(已连接)

在 RDP 会议中自动化基于 GUI 的流程的问题

在设置了前面代码的执行并检查一切都正常工作后,您可能会遇到一个问题: i 如果在我们查看 Windows VM 桌面时执行脚本,一切都将正常工作,而如果我们关闭或最小化该会话,该过程将失败。

解决方案比将其归咎于量子物理学中的观察者效应更简单。

通过 Ghipy

由于执行过程是基于图形用户界面的(我们使用图形用户界面来模拟用户和 Pulse Secure 之间的交互),并且使用 RDP 建立连接,因此必须考虑一些重要事项:

远程桌面(RDP)为运行 Windows 操作系统的远程计算机提供虚拟活动桌面。有两个潜在问题:

1。如果 RDP 窗口最小化,默认情况下,远程 PC 上没有活动桌面。

2。如果 RDP 断开连接,桌面将被锁定。

当使用远程桌面连接到远程计算机时,关闭远程桌面会锁定计算机并显示登录屏幕。在锁定模式下,计算机没有 GUI,因此任何当前运行或预定的 GUI 进程都将失败。

因此,不能像往常一样关闭或最小化 RDP 会话,每次注销都必须使用以下命令:

tscon.exe RDP-Tcp#27 /dest:console

其中,必须从 Windows 任务管理器中获取#27(会话 id 号),并且必须使用该号更新命令:

作者图片-任务经理 RDP 会议

在 CMD 中执行前面的命令后,RDP 会话将被关闭,但桌面仍将是活动的,因此我们的 GUI 相关代码不会失败。

RDP 会话总是必须以先前的命令结束。如果有人登录到该虚拟机并以任何其他方式退出,该脚本将由于缺少活动桌面而失败。

识别 GUI 中的对话框/窗口

在前面的代码中,我们已经看到了如何将 Pywinauto 与给定应用程序的接口连接起来:

app2 = pywinauto.Application().connect(path_to_EXE)

但是如果我们需要关注这个应用程序生成的弹出窗口,事情会变得更复杂,我们将不得不识别这个对话框/弹出窗口的名称(在 GUI 本身中)。为此,我们有不同的选择:

  • 在交互模式下使用 pywinauto 和 Python 可以实时看到我们在屏幕上看到的界面列表。
from pywinauto import Desktop

windows = Desktop(backend="uia").windows()
print([w.window_text() for w in windows])
  • 使用 UI 检查工具浏览屏幕上的不同界面。我们可以将鼠标悬停在某个对话框/弹出窗口上,以获取其名称:

作者提供的图片—ui inspect

app3 = pywinauto.Application(backend="uia").connect(title_re="Pulse Secure")

完整代码

结论

在本文中,我们看到了如何自动化一个显然总是需要人工干预的过程(双因素身份验证),并且我们已经将该解决方案应用于一个数据工程过程。

我们已经解释了如何使用 Pywinauto 来自动化基于 GUI 的任务,以及如何在其他用例中使用它。

最后,我们已经看到了自动化基于 GUI 的过程可能出现的问题,显然是 quantum cut(实际上更简单)的问题,以及它们可能的解决方案。

“The success formula: solve your own problems and freely share the solutions.”
― [**Naval Ravikant**](https://twitter/naval/status/1444741381579177984)

如何在 Kubernetes 和 S3 上自动化您的 Mongo 数据库备份

原文:https://towardsdatascience/how-to-automate-your-mongo-database-backups-on-kubernetes-795bb9a6c9eb

计划并自动执行从 Kubernetes 集群到 AWS S3 的数据库备份

由艺术壁纸拍摄的照片在 Unsplash 上

如果您运行的是 MongoDB 之类的自托管数据库,那么您很可能享受不到托管服务提供的自动备份的好处。

本文是关于如何使用 Kubernetes CronJobs 在 Kubernetes 集群上为 MongoDB 安排自动备份作业,并将这些备份存储在 AWS S3 桶中。

计划定期执行备份作业,从数据库中提取数据,承担 IAM 角色以获取凭据,然后上传到 S3—按作者排序的图像

我们将关注一个独立的 MongoDB 设置,同样的原则也适用于副本集和其他数据库。

由于许多组织使用 Terraform 来管理基础设施,我们将直接用 Terraform 格式编写 CronJob。

技术栈

  • MongoDB
  • 库伯内特斯
  • AWS S3
  • 将(行星)地球化(以适合人类居住)
  • 码头工人

内容

  • 创建地形模块(可选)
  • 使用所需的工具创建 Docker 映像
  • 定义变量和数据
  • 创建一个 S3 存储桶来存储备份
  • 创建 IAM 角色和 Kubernetes 服务帐户
  • 将 MongoDB 的密码存储为 Kubernetes 的秘密
  • 创建库伯内特克朗乔布
  • 部署基础设施
  • 说明

让我们开始吧!

需求:
本项目使用 Terraform 与 AWS 提供商和 Kubernetes 提供商。
请随意查看官方教程配置 EKS 集群以启动并运行 Kubernetes 集群。

创建地形模块(可选)

为了在基础设施即代码存储库中保持结构化和整洁,我喜欢将逻辑任务划分为子模块。

请注意,这是可选的,您可以将下面创建的模板包含在基础设施源代码中的任何位置。

让我们在模块目录中创建一个目录数据库备份:

使用所需的工具创建 Docker 映像

为了执行备份,我们需要从数据库中转储数据,并将其上传到 S3。

我们将使用方便的mongodump来转储数据,并使用 AWS CLI 将数据转储上传到 S3。

在上面创建的 Terraform 模块中,添加一个目录 mongodb ,并在这个新目录中创建一个 Dockerfile ,其内容如下:

*# Dockerfile# Base on Amazon Linux 2 (will be running on AWS EKS)
FROM amazonlinux:2RUN yum install -y unzip# Install AWS CLI
RUN curl -sOL [https://awscli.amazonaws/awscli-exe-linux-x86_64.zip](https://awscli.amazonaws/awscli-exe-linux-x86_64.zip) \
 && unzip awscli-exe-linux-x86_64.zip \
 && ./aws/install# Install MongoDB CLI tools
RUN curl -sOL [https://fastdl.mongodb/tools/db/mongodb-database-tools-amazon2-x86_64-100.6.0.rpm](https://fastdl.mongodb/tools/db/mongodb-database-tools-amazon2-x86_64-100.6.0.rpm) \
 && yum install -y mongodb-database-tools-amazon2-x86_64-100.6.0.rpm*

构建该映像并将其推送到您的映像存储库

让我们构建这个映像,并确保以正确的平台为目标——如果您在运行集群的机器之外的其他机器上进行开发(比如带有 M1 芯片的 Macbook ),这一点尤其重要。

*export REPOSITORY_URL=<your repository URL, e.g. on AWS ECR>
export TAG=<COMMIT_HASH> # Should be commit hash, but can be an arbitrary stringdocker build --tag="$REPOSITORY_URL:$TAG" --platform=linux/amd64 .*

要推送映像,请确保您已登录到您的存储库(运行 docker 登录,然后运行:

*docker push "$REPOSITORY_URL:$TAG"*

定义变量并获取数据

我们需要定义一些 Terraform 配置变量,并获取将在该项目的其余部分使用的数据。请随意调整这些以适应您当前的设置。

在文件名 variables.tf 中,添加以下内容:

*# variables.tfvariable "kubernetes_namespace" {
  type = string
}variable "kubernetes_cluster_name" {
  description = "Kubernetes cluster where the backup job and permissions service account should be deployed"
  type        = string
}variable "container_image_repository" {
  description = "URL of the Docker image used in the CronJob container"
  type        = string
}variable "container_image_tag" {
  description = "Tag of the Docker image used in the CronJob container"
  type        = string
}variable "database_host" {
  description = "MongoDB host URL"
  type        = string
}variable "database_user" {
  description = "MongoDB user"
  type        = string
}variable "database_password" {
  description = "MongoDB password"
  type        = string
  sensitive   = true
}*

在名为 data.tf 的文件中,添加以下内容:

*# data.tfdata "aws_caller_identity" "current" {}data "aws_eks_cluster" "kubernetes_cluster" {
  name = var.kubernetes_cluster_name
}*

创建一个 S3 存储桶来存储备份

我们需要一个可靠的位置来存储我们的备份,AWS S3 公司提供了良好的保证,而且价格实惠,使用方便。

创建一个地形文件 s3-bucket.tf ,内容如下:

*# s3-bucket.tfresource "aws_s3_bucket" "database_backup_storage" {
  lifecycle {
    # Prevent destroying the backups storage in case of accidental tear down
    prevent_destroy = true
  } bucket = "database-backup-storage"
}*

或者,我们可以添加一个生命周期策略来自动删除超过 7 天的备份。在同一文件中,添加以下内容:

*# s3-bucket.tf...resource "aws_s3_bucket_lifecycle_configuration" "database_backup_storage_lifecycle" {
  bucket = aws_s3_bucket.database_backup_storage.bucket
  rule {
    id     = "delete-old-backups-7d"
    status = "Enabled"

    filter {} expiration {
      days = 7
    }
  }
}*

创建 IAM 角色和 Kubernetes 服务帐户

我们的备份作业需要将备份上传到 S3 的权限。更具体地说,我们需要创建:

  • 一个 IAM 角色,其策略允许 S3:PutObject 在备份 S3 桶中操作
  • 一个 Kubernetes 服务帐户提供一个 web 身份令牌,允许备份作业承担 IAM 角色上传到 S3

要了解更多信息,这里有关于 AWS EKS 上服务帐户的 IAM 角色的文档。

在名为 access-control.tf 的文件中,添加以下内容:

*# access-control.tflocals {
  service_account_name = "database-backup" oidc_provider = replace(
    data.aws_eks_cluster.kubernetes_cluster.identity[0].oidc[0].issuer,
    "/^[https:///](https:///)",
    ""
  )
}resource "aws_iam_role" "role" {
  name = "database-backup-role" assume_role_policy = jsonencode({
    Version = "2012-10-17",
    Statement = [
      {
        Effect = "Allow",
        Principal = {
          Federated = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:oidc-provider/${local.oidc_provider}"
        },
        Action = "sts:AssumeRoleWithWebIdentity",
        Condition = {
          StringEquals = {
            "${local.oidc_provider}:aud" = "sts.amazonaws",
            "${local.oidc_provider}:sub" = "system:serviceaccount:${var.kubernetes_namespace}:${local.service_account_name}"
          }
        }
      }
    ]
  }) inline_policy {
    name = "AllowS3PutObject"
    policy = jsonencode({
      Version = "2012-10-17"
      Statement = [
        {
          Action = [
            "S3:PutObject",
          ]
          Effect   = "Allow"
          Resource = "${aws_s3_bucket.database_backup_storage.arn}/*"
        }
      ]
    })
  }
}resource "kubernetes_service_account" "iam" {
  metadata {
    name      = local.service_account_name
    namespace = var.kubernetes_namespace annotations = {
      "eks.amazonaws/role-arn" = aws_iam_role.role.arn
      "eks.amazonaws/sts-regional-endpoints" = true
    }
  }
}*

创建库伯内特克朗乔布

我们可以使用 Terraform 以 HCL 格式定义我们的 CronJob(参见 kubernetes_cron_job )。注意,我们可以在 Kubernetes 清单格式(yaml/json)中应用相同的配置。

在名为 backup-cronjob.tf 的文件中,添加以下内容:

*# backup-cronjob.tfresource "kubernetes_cron_job" "database_backup_cronjob" {
  metadata {
    name      = "database-backup-mongodb-daily"
    namespace = var.kubernetes_namespace
  } spec {
    schedule                      = "0 5 * * *" // At 05:00
    concurrency_policy            = "Replace"
    suspend                       = false
    successful_jobs_history_limit = 3
    failed_jobs_history_limit     = 3 job_template {
      metadata {}
      spec {
        template {
          metadata {}
          spec {
            restart_policy = "Never" service_account_name = kubernetes_service_account.iam.metadata[0].name container {
              name    = "database-backup"
              image   = "${var.container_image_repository}:${var.container_image_tag}"
              command = ["/bin/sh", "-c"]
              args = [
                "mongodump --host=\"$MONGODB_HOST\" --username=\"$MONGODB_USER\" --password=\"$MONGODB_PASSWORD\" --gzip --archive | aws s3 cp - s3://$S3_BUCKET/$S3_BUCKET_PREFIX/$(date +\"%Y%m%d-%H%M%S-%Z\").archive.gz"
              ] env {
                name  = "MONGODB_HOST"
                value = var.database_host
              }
              env {
                name  = "MONGODB_USER"
                value = var.database_user
              }
              env {
                name  = "MONGODB_PASSWORD"
                value = var.database_password
              } # Note that you can also set the DB password as a Kubernetes Secret then get it as
              # env {
              #   name = "MONGODB_PASSWORD"
              #   value_from {
              #     secret_key_ref {
              #       name = "mongodb"
              #       key  = "mongodb-password"
              #     }
              #   }
              # } env {
                name  = "S3_BUCKET"
                value = aws_s3_bucket.database_backup_storage.bucket
              }
              env {
                name  = "S3_BUCKET_PREFIX"
                value = "mongodb"
              }resources {
                limits = {
                  cpu    = "1000m"
                  memory = "1000Mi"
                }
                requests = {
                  cpu    = "100m"
                  memory = "256Mi"
                }
              }
            }
          }
        }
      }
    }
  }
}*

部署基础设施

既然我们的备份模块已经准备就绪,我们就可以将其与基础架构的其余部分一起部署了。

您可以在 Terraform 代码中放置以下代码片段,例如在 main.tf 中:

*module "mongodb_backup" {
  source = "${path.root}/modules/database-backup" kubernetes_namespace       = "<your namespace>"
  kubernetes_cluster_name    = "<your cluster name>"
  container_image_repository = "<Value of REPOSITORY_URL>"
  container_image_tag        = "<Value of TAG>"
  database_host              = <MongoDB host>
  database_user              = <MongoDB user>
  database_password          = <MongoDB password> tags = {
    Name = "database-backup-mongodb"
  }
}*

一旦应用了 terraform 基础设施( terraform apply) ,您应该会看到有一个 CronJob 启动并运行:

说明

它是如何工作的

A Kubernetes CronJob 调度作业作为能够执行给定任务的 pod 运行。在这种数据库备份实施的情况下,每个计划的作业将执行以下步骤:

  1. 连接到位于$MONGODB_HOST 的独立主机
  2. 使用mongodump将数据转储为压缩(gzip)文件,并将结果打印到标准输出。这里有三件事:(1)我们压缩以减少上传负载的大小,(2)我们存档以将数据转储到单个文件中(这是可选的,但可以防止转储到不区分大小写的文件系统时出现问题——参见警告这里的),(3)我们将转储打印到标准输出,以便能够通过管道将其传输到 AWS CLI。
  3. 将压缩的归档文件通过管道传输到 AWS CLI
  4. 通过以下方式从标准输入(管道)复制到 S3 时段:
**aws s3 cp - s3://$S3_BUCKET**

如何恢复数据

  1. 将最新的数据从 S3 下载到您的本地或目标 Mongo 主机(即您希望恢复数据的位置):

2.使用 mongorestore 实用程序:

**mongorestore --gzip --archive=/path/to/backup [--host $HOST --username $USERNAME --password $PASSWORD]**

重要的

  • 该时间表应该根据您的需要进行更改——上面的设置是相对于您的 Kubernetes 集群时区的 5:00。
  • MongoDB 备份被配置为使用单个实例。相应地更改副本集的配置(参见 操作日志 的用法)。
  • MongoDB 服务器的版本必须与备份转储所源自的数据库的版本相匹配。

最终注释

当运行自托管数据库时,需要采取额外的步骤来设置防止数据丢失的措施—以防灾难、意外删除、硬件故障等。

令人欣慰的是,最常见的数据库提供了生成和恢复备份的工具,像 AWS S3 这样的云存储解决方案是可靠的,经济的,并且使用方便。

利用像 Kubernetes CronJob 这样的作业调度程序,我们可以创建一个自动解决方案,在专注于构建令人惊叹的应用程序的同时,负责备份数据🎉!

如果你觉得这个教程有用,并且你想支持高质量文章的制作,考虑给我买杯咖啡!

你可以点击“关注”按钮来获取我的最新文章和帖子!

如何自动设计高效的神经网络

原文:https://towardsdatascience/how-to-automatically-design-an-efficient-neural-network-ee842a631885

神经结构搜索的简明介绍

Ethan Sykes 在 Unsplash 上拍摄的照片

如果你曾经使用过深度学习方法,你可能已经知道,每当你考虑一个新的数据集,你的模型的性能就非常依赖于网络的架构。

这就是为什么 虽然 微调预训练网络可以在你的旅程中帮助你,但你可能必须尝试多种模式才能找到你的最佳选择。在某些情况下,您甚至可能需要调整所选网络的某些层,以获得更好的预测能力。

这个过程可能会很快变得乏味和重复,尤其是当您需要在多个数据集上执行相同的任务时。这就是为什么知道不总是手动设计或选择您的网络架构,而是在一定条件下自动完成是可能的。这被称为 神经架构搜索(NAS) ,是 AutoML 的一个子领域,旨在自动设计神经网络。

为什么以及何时应该使用 NAS

NAS 非常方便,特别是当你想通过自动化过去手动完成的工作(设计神经网络)将基于深度学习的解决方案扩展到数十甚至数百个数据集时。

最重要的是,生成的架构不仅在预测能力方面,而且在内存大小和推理时间方面都是高效的。例如,谷歌的模型NAS-FPN【1】实现了比 SOTA 物体检测模型更好的准确性/延迟权衡。

执行 NAS 需要什么

寻找一个好的网络架构可能就像大海捞针。只要想想可能的神经操作类型(全连接、卷积、LSTMs 等)的数量。),以及它们参数的可能组合(例如卷积层的内核大小)和网络的可能深度。所有这些变量导致了无限多的候选架构。

因此,为了明智地找到最佳候选,您需要为 NAS 算法提供如下所示的 3 个元素:

NAS 的一般框架[8]

  • 搜索空间 𝒜 : 包含可以采样的候选架构集合。为了定义一个搜索空间,你需要定义可能的神经操作和网络的转换动力学(即网络的节点是如何连接的)。后者要求事先知道最终网络应该是什么样子,但这并不总是强制性的。例如,一种常见的做法是将最终的网络视为层的堆叠,其中每一层都表示为一个有向无环图,就像 DARTS [2]中那样。
  • 评估策略: 用于评估每个采样网络的性能。标准做法是使用模型的预测能力(例如,交叉熵用于分类任务)。一些工作引入了正则化项,以便通过限制网络的大小来实现准确性/等待时间的折衷。例如,在 AdaBERT[3]中,重模型通过在损失函数中整合推理触发器(浮点运算)的数量来进行惩罚。
  • 搜索策略 :一旦从搜索空间中对架构进行了采样,并且使用评估策略对其性能进行了评估,搜索策略就会告诉 NAS 算法接下来要对什么架构进行采样和评估。搜索策略通常定义了大多数 NAS 方法之间的根本区别。

在接下来的部分中,我将介绍三种常用的 NAS 方法以及它们的一些优缺点。

具有强化学习的 NAS

使用强化学习来寻找方便的体系结构是 NAS 中的标准做法。例如在[4]中,作者观察到网络的节点和连接可以通过字符串来表示。

因此,他们设计了一个名为“ 控制器 ”的递归单元,生成网络架构字符串。相应的网络在任务数据集上被训练,并且验证准确性被转换成用于通过策略梯度方法更新控制器权重的回报信号。

具有强化学习的 NAS 的一般框架[4]

与许多其他方法相比,基于 RL 的架构搜索更彻底地探索搜索空间,并且对每个采样的架构具有更准确的性能估计。因此,RL-NAS [4]在流行的数据集上取得了最先进的结果也就不足为奇了。然而,它主要受到时间和硬件资源效率问题的困扰。例如,为 CIFAR-10 分类任务找到一个最佳架构需要 3 000 个 GPU 小时,而不是所有的公司和机构都能够负担得起这样的费用。

许多策略可以用来显著提高普通 RL-NAS 的效率,例如跨层共享参数权重(也称为参数共享),以减少可学习权重的数量和搜索空间的大小,这基本上是在[5]中完成的。

具有进化算法的 NAS

进化算法是基于启发式搜索的算法,主要受达尔文进化和自然选择过程的启发。在深度学习中,这些算法最初用于优化神经网络的权重,最近它们被推广到架构搜索。

进化方法的独创性在于在优化过程中使用随机抽样而不是梯度下降。这种随机抽样使用三次:

  • 初始化步骤 中,生成候选架构的随机初始群体。该群体是全局搜索空间𝒜的子集,并且可以是任意大小。每一个人(建筑)都被评估,并选出最合适的。
  • 交叉步骤 中,利用初始种群中最适合的个体(即最高性能的架构)的特征,随机产生新的个体。
  • 变异步骤 中,对新种群的个体进行随机的细微修改,生成新的个体。

最后两步与 适应性评估和选择步骤 一起进行,直到满足收敛标准。

进化 NAS 的一般框架(图表改编自[6])

NAS 中的进化算法主要区别在于如何进行交叉和变异。为了探索 NAS 中流行的进化方法,我推荐你阅读这篇出色的调查【6】。

可区分 NAS

RL 和进化算法的时间和资源效率问题导致了基于微分梯度的方法的出现,例如 DARTS [2]和 GDAS [7]。

在这些算法中,所寻求的架构是相同单元(或层)的堆叠。每个单元被表示为由 N 个节点 (表示中间数据状态)和 K 条边 组成的有向无环图(DAG ),其中每一个都表示从 E 个可能的候选神经操作 (密集层、卷积层等)中采样的转换操作。).

下图中:N = 4 个节点,K = 6 条边,E = 3 个候选操作。

网络单元的 DAG 表示。在每条边上有三种不同采样概率的候选操作。(来源 [2])

该算法的目标是为 DAG 中的每条边选择最佳的神经操作。为此,为每个边缘内的每个候选操作分配随机采样概率,这给出了一个 E * K 概率矩阵。在每个学习步骤中,使用这些概率对架构进行采样。在评估了网络的性能之后,我们使用反向传播来更新参数权重和采样概率。

假设采样过程是不可微的,我们使用一个重新参数化的技巧将分类样本放松为连续可微的样本。

GDAS 和 DARTS 的主要优势在于,我们同时在寻找最佳架构和学习网络的权重,这使得训练比基于 RL 的方法快得多。这个叫做 一次性 NAS

然而,如果你没有应用一个合适的训练开始时间和学习率时间表,这种并行优化可能会变得不稳定。事实上,为权重和架构优化选择一个方便的学习速率对于获得满意的结果绝对至关重要。

外卖信息

神经结构搜索是一种强大的自动化方法,允许自动设计神经网络。如果部署正确,所选架构在预测能力、内存需求和推理时间方面产生令人满意的结果。

例如,当在单个数据集上工作或用于有限的用途时,使用现成的预先训练的网络最初可能工作得很好。但请记住,这些网络通常有数千万个参数(ResNet-50 有 24M 个参数,BERT-base 有 110M 个参数)。因此,每当您考虑扩展您的解决方案时,您迟早会意识到您必须考虑轻型模型,NAS 是一个值得认真考虑的真正选择。

然而,即使 NAS 旨在通过自动化架构设计过程来使深度学习更容易为科学界所接受,我相信大多数当前的方法都需要专家干预来确保它们的效率和稳定性。

参考文献

[1]吉亚西,高尔纳茨&林,宗毅&乐,郭。 NAS-FPN:学习用于对象检测的可扩展特征金字塔架构 (2019)。

[2]刘,&西蒙扬,卡伦&杨,。飞镖:差异化架构搜索 (2018)。

[3]陈、李道元、、邱、王明辉、李、、丁、林、黄、林、周、。 AdaBERT:具有可区分神经架构搜索的任务自适应 BERT 压缩 (2020)。

[4] Zoph,Barret & Le,Quoc。具有强化学习的神经架构搜索 (2016)。

[5] Pham,Hieu & Guan,Melody & Zoph,Barret & Le,Quoc & Dean,Jeff。通过参数共享进行高效的神经架构搜索 (2018)。

[6]刘、余巧和孙、延安和薛、张和冰、和晏、盖瑞和谭、凯。进化神经结构搜索综述 (2021)。

[7]董,宣仪&杨,易。在四个 GPU 小时内搜索健壮的神经架构 (2019)。

[8]埃尔斯肯,托马斯&梅岑,简&哈特,弗兰克。神经架构搜索:一项调查 (2019)。

如何自动生成 VGG 图像标注文件

原文:https://towardsdatascience/how-to-automatically-generate-vgg-image-annotation-files-41d226e6d85

使用语义数据集更快地训练实例分割

克里斯蒂安·威迪格在 Unsplash 上拍摄的照片

在计算机视觉领域,实例分割是目前最热门的话题之一。它包括图像中对象的检测/分割,即特定对象的定位及其所属像素的关联。像任何一种机器学习系统一样,需要大量的图像来训练主干架构。更具体地说,需要大量的注释来训练神经网络的定位功能。注释是一项耗时的活动,并且可以决定项目是否会成功。因此,必须小心处理它以提高生产率。

在卫星图像领域,可以利用免费数据集来利用研究人员或注释人员以前所做的工作。这些数据集通常由研究人员在从开源图像中构建它们,对它们进行前后处理,并使用它们来训练和测试他们自己的人工智能研究系统之后发布。语义分段和实例分段略有不同,但是在建筑物的情况下,一个分段可以帮助另一个分段。事实上,建筑往往是独特的,可以在任何图像上进行视觉分离。利用这种考虑,可以从二进制标签图像为每个建筑物生成单独的掩模,然后用于更快地训练实例分割算法,如掩模 RCNN。注释不必手动执行,这是该技术的主要优点。这里有一些如何做的提示!

JSON 文件格式

Mask RCNN Matterport 实现以及FAIR detector 2平台正在使用 JSON 文件为训练图像数据集加载注释。这种文件格式在许多计算机科学应用程序中使用,因为它允许以一对属性-值格式轻松存储和共享字母数字信息。它是为 JavaScript 语言构建的,但现在,它被用于许多其他编程语言,如 Python。已经构建了专用库,能够在 Python 代码中生成和解析 JSON 格式的数据作为文本文件。在 VGG 注释工具格式中,Mask RCNN 使用的典型 JSON 文件将具有以下形状:

对于子集,一个 JSON 注释文件收集所有的注释数据。每个图像注释都堆积在一个大的 JSON 文件中。

  • 一个图像由它的名称和它在磁盘上的大小来标识。这个标识符由四个属性描述:图像的名称(文件名)、它在磁盘上的大小(大小)、带注释的形状(区域)以及图像上的一些元数据(文件属性)。这个区域属性本身由一个元素列表描述,该列表表示可以在图像上绘制的不同注释。
  • 每个注释可以由一对两个元素描述:形状描述( shapes_attributes )和注释数据( region_attributes )。 shapes_attributes 描述由注释的形状( name )和两个整数有序列表( all_points_xall_points_y )组成,它们代表形成掩膜注释的点的 x 和 y 坐标。注释数据 region_attributes 可以被调整,并且注释类可以被保存用于多类分割目的。
  • 第四个标识符属性被命名为 file_attributes ,可以用来存储关于带注释图像的任何信息。

在语法方面,让我们注意花括号{}通常用于分隔相同类型的元素,以及引用描述一个元素的属性。方括号[]也用于表示参数列表。关于对,属性通常由包含其名称的字符串描述,并由:字符分隔值/数组。

幸运的是,Python 有一个库供我们读写 JSON 文件。使用 import json 代码片段可以很容易地加载它,用通用语法读写一个文本文件。让我们在下一章推导如何将二进制标签图像转换成 VGG 注释,特别是如何用 JSON 语法编写注释文件。

正在生成注释 JSON 文件

本文提出的主要思想是将二进制标签图像转换成 VGG 注释格式的 mask JSON 文件。二进制标签图像的每个形状被个性化,以将它变成用于例如分割的掩模元素。转换主要通过 Python 中易于使用的著名 OpenCV 图形库来执行。

  • 第一行是构建正确的文件夹路径到地面真相标签和光学图像文件夹,并创建将被写入注释的 JSON 文件。
  • 首先,使用 cv2.findContours 函数将二值蒙版裁剪成轮廓。大多数转换(阈值、灰度转换)实际上并不需要,因为数据已经是二进制图像。cv2.findContours 函数提供了一个轮廓列表,作为点的列表,这些点的坐标以图像的参考表示。
  • 在我的屋顶项目的背景下,我只对大型建筑屋顶感兴趣,因此可以使用自定义 OpenCV 函数来导出屋顶的表面,然后将它们转换为平方米,并只选择有足够面积的屋顶。在这种情况下,可以使用 Ramer–Douglas–peu cker(RDP)算法来简化和近似检测到的轮廓,以便更紧凑地存储注释数据。此时,您应该有一个表示在二进制图像上检测到的轮廓的点列表。
  • 现在,你需要将整个轮廓点列表转换成一个大的 via_region_data.json 文件,用于掩膜 RCNN 算法。对于 JSON 注释,数据需要具有第一段中指定的格式。在将数据推送到 JSON 文件之前,将主要使用字典。
  • 根据轮廓周围[]的数量,您将需要特定数量的[:,0]来获取适当的数据。描述轮廓的整数数组必须用。tolist()参数,然后将其放入 JSON 属性。制作 VGG 注释 JSON 文件非常类似于俄罗斯娃娃。您可以创建一个空字典,指定它的一个(或多个)属性的值,然后将其作为更高级别的属性的值进行传递,以将其封装到更大的字典中。让我们注意,对于多类分割或对象检测, region_attributes 可以包含一个属性类,其中对象的实际类在 shape_attributes 参数中指定。
  • 最后,每个图像数据都存储在一个大的“jsonf”元素中,用它的名称+大小字符串作为标识符,然后将所有数据放入一个 JSON 文件中。这样做非常重要,因为如果每次运行新图像时都在 JSON 文件中写入,JSON 文件的 Mask RCNN 导入将会失败。这是由于 json.load() 只读取第一组花括号{}的内容,将无法解释下一组。

就是这样!让我们看看这个过程的结果是什么!

检查注释显示

这个小章节将展示上述过程的图形使用。我主要使用美国地质调查局通过国家地图服务公开发布的美国城市图片(芝加哥、奥斯汀、旧金山)。美国地质调查局、国家地理空间计划提供的地图服务和数据。这项服务是开源的,所以你可以对数据做任何你想做的事情!在本文中,我处理了德克萨斯州奥斯汀附近的非常高分辨率的影像(空间分辨率= 0.3 米/像素)。

  • 第一幅图像是视觉彩色图像,通常以 GeoTiff 格式与一起提供。tif 扩展也包含嵌入的地理空间数据。它以美国城市环境的城市场景为特色。渲染是用三个光谱视觉图像构建的:常见的蓝色、绿色和红色。但是在更复杂的影像背景下,影像供应商可以提供近红外影像,以便能够生成 CNIR(彩色+近红外影像)来分析光谱影像的不同方面。

德克萨斯州奥斯丁的卫星图像来自美国地质调查局国家地图项目

  • 第二个图像显示二进制标签图像。可以看出,地面真实包含了与建筑物相关联的每一个像素,甚至是具有弯曲形状的最小像素。每个建筑都可以单独识别,因为建筑不能重叠,这证明了这一点。

来自 USGS 国家地图计划的德克萨斯州奥斯汀的建筑地面真相

  • 第三个图像由二进制标签 one 和 cv2.findContours()函数检测到的轮廓组成,在它上面用红色突出显示。显示的轮廓是来自 OpenCV 函数的原始数据,并且没有被过滤掉,因此即使最小的建筑物也被表示出来。需要注意的是,cv2.findContours 函数是逐像素的变换:由一个像素连接的两个建筑物将被分割在一起,而仅一行暗像素就足以将两个靠近的建筑物分开。

图片由作者提供,基于美国地质调查局国家地图数据

  • 第四幅图像显示了带有过滤后的近似轮廓的二进制标签图像。正如第二章所说,在我的屋顶项目中,我对面积小于一百平方米的建筑不感兴趣。还执行轮廓近似以减小注释文件的大小。因此,仅在大型建筑物周围绘制轮廓,并且在某些情况下,轮廓与建筑物形状不完全匹配,从而影响轮廓近似。

图片由作者根据美国地质调查局国家地图数据制作

  • 第五个也是最后一个图像显示了通常的实例分割可视化,可以使用 inspect_roof_data.ipynb 等工具绘制。大型建筑的屋顶被单独分割,属于这些屋顶的像素被单独关联。此处使用的笔记本将从 via_region_data.json 文件加载注记,因此,如果您可以像这样显示带注记的卫星影像,您的数据集就可以训练实例分割掩膜 RCNN 算法了!

图片由作者提供,基于美国地质调查局国家地图数据

结论

本文展示的过程展示了如何将语义数据集转化为实例分割训练数据集。然后,它可以用来有效地训练掩模 RCNN 算法。该流程还可以重复使用和修改,以适应具有不同输入标签形状的数据集,如 ka ggleSartorius Cell Instance Segmentationcompetition 等

希望你觉得这几行有趣且有用😀如果你喜欢我的内容,你可以关注我的帐户来获得更多的 deeptech 主题!C u😉🚀

如何避免数据科学中的错误

原文:https://towardsdatascience/how-to-avoid-mistakes-in-data-science-20d6f9c4274b

意见

了解数据科学中各种错误的发生,尤其是在构建机器学习代码时,对于数据科学和人工智能的从业者来说是有用的。在本文中,我们将探索避免这些错误并提高生产率的步骤。

简·安东宁·科拉尔在 Unsplash 上拍摄的照片

机器学习和数据科学正被广泛应用。机器学习的一些很酷的应用是在自动驾驶汽车和银行业,根据一系列特征判断一个人是否会拖欠贷款。机器学习也被用于从制药、零售、制造和农业行业开始的大量其他行业。

许多数据科学家和机器学习工程师被雇用来利用海量数据,并分别基于业务用例生成有价值的预测。

然而,当实践者试图在人工智能领域构建这些应用程序时,经常会遇到问题。现在,我们将讨论一系列数据科学中可能发生错误的方式,这些错误发生在使用人工智能完成业务需求的任务时,以及采取措施在很大程度上避免这些错误时。我们探索了数据科学失败的一些简单方式,并采取正确的实际步骤来确保在构建应用程序时避免这些失败。

数据科学和机器学习中的错误

由 Sarah Kilian 在 Unsplash 上拍摄的照片

当构建有趣的机器学习应用程序时,有时从业者有可能在该领域犯错误。结果,为了给团队留下深刻印象而做的工作的质量被降到了最低。因此,看看数据科学中的各种错误并寻找减少它们的方法在很大程度上提高了生产力。以下是一些主要发生在数据科学领域的错误。

未能理解 ML 模型中的偏差

威尔·梅尔斯在 Unsplash 上拍照

有时,模型可能有很好的能力来很好地执行测试集。当我们发现我们没有充分训练模型来利用它们在进行机器学习预测时的全部潜力时,模型中的偏差就会发生。这可能主要是由于没有调整超参数,没有给出足够的数据,以及没有添加会对模型产生重大影响的特征。

为了避免这种情况,必须用可用数据适当地训练模型,同时确保模型在产生的误差方面达到全局最小值。这将确保我们获得最好的机器学习模型。

考虑到根据年龄、互联网服务类型和其他因素等一系列特征来预测客户是否会离开(离开服务)互联网服务的任务,可以看出,在这种情况下,我们必须使用复杂的机器学习模型来进行预测。使用不太复杂的模型,如逻辑回归,可能并不总能捕捉到趋势和来自该数据的洞察力,因为存在大量复杂的关系。如果我们使用逻辑回归模型,它很可能会有很大的偏差,因为它不能捕捉趋势。解决这个问题的最好方法之一是添加更复杂的模型,并改进机器学习预测。

不了解业务需求

照片由 Timon Studler 在 Unsplash 上拍摄

机器学习和数据科学中经常使用的技术令人印象深刻,令人着迷。有机会看看这些模型如何提取数据,并从中理解和获得有用的见解,这似乎是一个令人印象深刻的壮举。您组织中的许多团队可能正在努力实现机器学习:他们希望像其他人一样加入到生产高质量工作的行列中。然而,在数据科学之旅中询问质量问题以及机器学习是否是手头特定业务问题的可行解决方案总是一个好的步骤。

考虑使用数据科学来预测一个人是否会买房子的例子。在这种情况下,数据科学可能是最有用的,因为准确预测数据将为公司节省数百万美元和收入。他们可以根据预测更好地规划预算,并确保数据科学在整个过程中获得良好的价值。因此,在尝试将机器学习应用于大量问题之前,理解业务需求是重要的一步。

未能消除数据中的异常值

由鲁伯特·布里顿在 Unsplash 上拍摄的照片

有时候,你已经和你的团队很好地讨论了业务和应用机器学习的需求,并产生了结果和良好的预测。然而,用于训练 ML 模型的数据可能有大量的异常值。在这种情况下,大量值位于某个值范围内,而其他值明显高于或低于数据的平均值。在这种情况下,模型在训练集上表现良好,但在以前没有见过的数据上不能很好地概括。

这些异常值的存在会影响大量机器学习模型的性能。因此,应努力消除它们,并确保这些模型实时正常运行。可以采取措施很好地识别它们。其中一些步骤包括找到标准偏差,并查看距离平均值 2 个偏差之间的值。这将确保我们获得手头数据的最佳预测。

数据集中异常值的例子包括用一组其他变量预测汽车价格。当我们试图预测各种汽车的价格时,考虑到诸如里程、马力和其他因素,由于人为错误会遇到异常值的情况。在这些情况下,当使用包含异常值的数据集训练模型时,模型的表现会比不包含异常值的数据集差得多。因此,从各种要素中移除这些异常值可能是构建有效解决方案的一个进步。

未能使用正确的特征工程技术

在 Unsplash 上拍摄的 ThisisEngineering RAEng

ML 模型预测中使用的特征决定了它们在未知数据上的表现。因此,赋予我们的模型对各种特性的正确访问权,并实现创建新特性的策略,可以提高这些模型的性能。此外,使用特征化和创建新要素有助于通过使用各种图来更好地探索数据。这些图通常可以帮助获得有价值的见解,并可以交给业务部门,以便他们做出数据驱动的决策。

在机器学习中,我们要输入到 ML 模型的数据中经常会有大量缺失值。缺少数据的现实问题的一些例子包括贷款违约预测、心脏病预测和癌症诊断预测。所有这些例子都包含含有缺失值的特征。这导致模型在该数据上表现不佳。对于数据可能包含丢失的工资信息的信用欺诈检测等问题,执行特征工程非常方便。用整个工资的平均值或众数来计算这些值就可以了。

如果您有兴趣了解更多关于各种特征化技术的知识,您可以看看我之前的文章,我在文章中非常详细地提到了它们,并给出了实际的例子。下面是链接。

哪些特征工程技术可以提高机器学习预测?|作者 Suhas Maddali | 2022 年 11 月|迈向数据科学(medium)

假设深度学习可以解决任何问题

照片由 Sai Kiran Anagani 在 Unsplash 上拍摄

随着各种公司实施的技术创新和更新战略的兴起,获取大量数据变得越来越容易,这些数据可以被提取出来,并可供大量团队用来执行机器学习相关任务。后来还发现,随着数据量的增加,使用深度学习变得更加合适。

虽然使用深度神经网络(深度学习)确实可以提高数据的性能,但团队经常期望解释为什么模型首先给出预测。正是在这段时间内,深度学习的方法可能会失败,特别是当可解释性是特定 ML 应用程序的最重要要求之一时。

考虑这样一种情况,即根据体重、血压和身体质量指数等一系列因素来诊断患者是否患有癌症。由于我们有大量来自癌症患者的数据,使用深度学习来预测几率会更容易得出结论。然而,在癌症诊断的情况下,解释深度学习模型的预测同样重要。由于深度学习模型的本质更加复杂,它们能够提取错综复杂的关系,因此它们变得更难解释为什么它们首先给出预测。因此,在这种情况下,使用简单的机器学习模型将是一种很好的方法,这些模型分别对从业者、医生和患者来说是高度可解释的。

结论

看完这篇文章后,希望你已经理解了使用机器学习和深度学习为产品构建有趣的 AI 应用程序时可能出现的一些错误。采取文章中提到的步骤可以在很大程度上帮助应对这些挑战,同时提高效率。感谢您花时间阅读这篇文章。

如果你想获得更多关于我的最新文章的更新,并且每月只需 5 美元就可以无限制地访问中型文章,请随时使用下面的链接来添加你对我工作的支持。谢了。

https://suhas-maddali007.medium/membership

以下是您联系我或查看我作品的方式。

GitHub: 苏哈斯马达利(苏哈斯马达利)(github)

YouTube:https://www.youtube/channel/UCymdyoyJBC_i7QVfbrIs-4Q

LinkedIn: (1)苏哈斯·马达利,东北大学,数据科学| LinkedIn

培养基: 苏哈斯·马达利—培养基

如何成为一名伟大的数据科学家

原文:https://towardsdatascience/how-to-be-a-great-data-scientist-f22973b20a4e

成为能够提供强大模型和最大影响的数据科学家

萨姆·穆卡达姆在 Unsplash 上拍摄的照片

在过去十年左右的时间里,数据科学已经成为一种流行的职业选择。Glassdoor 将数据科学家评为 2021 年美国第二好工作。目前有数百个训练营、大学课程和 MOOCs 可以帮助你发展成为数据科学家和在该领域找到工作所需的技能。

一旦你获得了第一份工作,你如何确保自己继续以正确的方式发展自己的技能和经验?你不会有一门课程可以学习,也不会总是有一个好的导师来指导你。你所学的课程将使你成为一名优秀的数据科学家,但经验将使你达到一名伟大的数据科学家的水平。

“学习数据科学的最好方法是做数据科学。”,
Chanin Nantasenamat

以上引自 Chanin Nantasenamat 的优秀帖的话非常真实。一旦你掌握了大多数数据科学项目教给你的技能,成为一名数据科学家的最好方式就是通过实践。你将从作为数据科学家的第一份工作中获得一般经验,但我认为一名新兴数据科学家应该关注几个关键领域。这些领域将使你成为一名数据科学家,不仅可以提供强大的模型,还可以为组织带来最大的影响。

在本文的剩余部分,我将涵盖以下四个方面,重点介绍如何获得经验,以及它们为什么会帮助您成为一名出色的数据科学家。

  • 数据专长
  • 深厚的统计学知识
  • 端到端知识
  • 知道何时简化

数据专业知识

数据是任何数据科学产品的基础。我们都听说过“垃圾进垃圾出”这句话,它与数据质量的重要性有关,但在准备和选择数据时,还有许多其他的考虑因素。

模型通常不会根据所有可用的数据进行训练,而是使用样本。深入了解您的数据以确保您选择的样本具有代表性,并且不会在您的模型中引入偏差,这一点非常重要。通过分析研究数据将有助于您了解应该使用哪些功能,应该放弃哪些功能。它可以帮助您选择最合适的模型和评估方法。

Andrej Karpathy 在他的博客“训练神经网络的诀窍”(非常值得一读)中非常好地捕捉了这一过程。他将这一过程描述为“与数据融为一体”。

“与数据融为一体”,安德烈·卡帕西

一个伟大的数据科学家对数据有着深入的了解,并对什么会出错有着一定程度的直觉,这种直觉只能来自经验。如何发现错误以及如何处理错误。如何浏览数据以了解数据集中存在的相关性和模式。模型投入生产后如何处理数据,以及可能出现的问题。数据有缺陷的机器学习模型不一定会失败或产生错误。你可能会以一个糟糕的模式告终。

统计方面的渊博知识

统计学是数据科学家如何成为数据科学家的答案。统计学是一种工具,让我们能够选择正确的数据,探索它,清理它,分析它。建立强大的机器学习也取决于你统计知识的质量。了解如何优化您的模型、解释输出和评估性能,都需要深入了解各种统计方法。

“我一直在说,未来 10 年最性感的工作将是统计学家,我不是在开玩笑。”哈尔·瓦里安

对统计技术有深入的了解,并且了解如何以及何时将这些方法应用到数据科学中,这是一个伟大的数据科学家的与众不同之处。如果没有足够的统计培训和经验,你将面临构建大量糟糕模型的危险。

端到端知识

只有投入使用,数据科学产品才会产生价值和影响。为了能够使用一个模型,它必须被操作成一个面向业务的系统。这可能是一个 Tableau 仪表盘或一个移动应用程序,但无论是哪一个端点,让数据科学产品在某个地方可用都需要基础架构。

从开发到生产,模型所需的基础设施是复杂的,并且在整个过程中需要多种不同的技能。这些技能来自多个领域,包括开发运维、数据工程、软件工程、IT 安全和数据科学。

“想法除非付诸实施,否则一文不值”,德里克·西弗斯

数据科学家不可能成为所有这些领域的专家。但是一个优秀的数据科学家应该对部署流程的每个领域有足够的了解,以便与这些领域的专家进行有意义的对话。至少在上面列出的领域中获得高水平的知识对于理解更大的图景并能够对模型部署所需的基础设施的决策做出贡献也是很重要的。

知道何时简化

数据科学家的主要角色是用数据解决有价值的业务问题。在许多情况下,这并不意味着使用最先进的算法。像大多数其他业务职能一样,数据科学需要产生良好的投资回报。因此,花时间尝试实现最先进的新技术来弥补模型分数中的几个百分点,可能没有商业意义。特别是如果一个标准的、众所周知的更简单的技术将更快地解决问题。

“当有疑问时简化”,埃里克·里斯

一个伟大的数据科学家知道何时做出这种取舍。实际上,从选择算法到编写代码,知道何时简化以及何时引入更多复杂性是成为一名伟大的数据科学家的关键要素。

一个真正伟大的数据科学家能够以产生最大价值的方式解决有价值的业务问题,在许多情况下,这种方式会产生持久的价值。要做到这一点,数据科学家需要理解并在复杂性和简单性之间做出正确的权衡。能够成功地在生产中部署模型,并在模型出现后保持其稳定和新鲜。同时确保这些数据科学产品是强健的、高质量的和公正的。

这就是为什么我认为本文涵盖的四个领域是新数据科学家发展经验并成为伟大数据科学家的最重要的地方。

感谢阅读!

如何成为一名高效的数据科学经理

原文:https://towardsdatascience/how-to-be-an-effective-data-science-manager-dbdea96b783c

来自数据科学和分析领导者的经验和思考

照片由 Unsplash 上的尼克·费因斯拍摄

B 成为一名数据科学经理是许多数据科学家的梦想。我喜欢看奥运会。我们看到不同国家的体育英雄争夺金牌。不幸的是,参加奥运会比赛的机会是为少数有天赋的人准备的。对于我们其他人来说,我们的舞台就是工作场所。我们想获得金牌,这是数据科学经理的职位。

然而,数据科学正处于一个充满挑战的时代。数据科学的宣传已经过去了。我们正面临两大挑战:

  • “我们如何生产它?”:超过 90%的数据科学解决方案仍然难以生产。在生产模式之外,相对于所付出的努力,企业采用率仍然很低。
  • “把钱给我看看!”资金稀缺,每个人都在争夺首席财务官。高管们已经看到了数据分析和报告在实现数据驱动型决策方面的优势。但是,许多人不相信数据科学项目的好处。

等等,我不是自愿参加的。我认为成为一名数据科学经理就是要领导一个数据科学家团队。你知道,领导和激励团队去实现。这听起来太难了。

问题是数据科学仍然是一个成熟的职业。在我工作过的许多公司里,通常都是绿地或棕色地带。大家都知道完善的营销团队是做什么的。然而,并不是每个人都知道数据科学。在没有数据科学的情况下,公司已经运营了多年。

做一个“好”的数据科学管理者还不够;我们需要高效的数据科学经理。我已经有了多年练习这门黑暗艺术的经验。我已经得到了痛苦的教训,我希望它能让你少受一些。高效意味着实现我们的愿景,一名数据科学经理领导一个成功的数据团队,提供有价值的预测模型,并受到组织的喜爱。

关于我自己,我是一名合格的精算师(有时被称为原始数据科学家),在数据科学和分析领域度过了漫长的职业生涯。近十年来,我在不同规模、地域和风格的团队中担任过许多数据领导角色。我正处于一个阶段,我可以将我的知识回馈给社区,并帮助未来的数据领导者。

我喜欢开发让人们容易记住这些内容的方法。因此,我们将使用 PPT 的缩写。不,这不是我们最喜欢的幻灯片。这是 P 人、 P 过程、 T 技术。

你不了解罗根·保罗 GIF 由 SHOWTIME 体育。2021.从 Giphy 中检索

当我第一次成为数据科学经理时,我知道我必须与人合作,但我没有意识到这是如此复杂和具有挑战性。通过编码,我们得到错误反馈,然后重新运行。对于人来说,反馈很少,“重新运行”并不简单。

如果你和我一样,我们花了几十年来学习和提升我们的数据科学技能。这包括商业学位、精算资格和技术认证。

然而,数据科学经理的必备要求是人际技能。那么,我们在哪里学习人际交往技巧呢?MBA 学位就够了吗?这可能会有帮助,但是我们真的通过生活学校学习人际交往技能。我个人尝试过各种方式,有的成功,有的不成功。然而,所有这些都是宝贵的经历,让我在数据领导之旅中走到了今天。

我们是成功的数据科学家,因为我们提供了优秀的数据科学解决方案。你可能已经被奖励为高级数据科学家,或者已经被任命为数据科学经理。然而,让你来到这里的东西不会让你到达你想去的地方。

作为一名数据科学经理,你将与许多人一起工作。为简单起见,我们将他们分为内部人员和外部人员。

内部人员

内部人员包括你的团队中的所有人,直接的或邻近的部门。这包括您的直接下属、您的数据同事、更广泛的技术团队或其他部门团队成员(取决于数据科学团队的位置)。

要成功部署数据科学解决方案,您需要他们的全力支持。我们需要和数据工程师一起工作来获取和生产我们的数据。另一个技术团队需要了解您的部署计划。所有其他部门团队成员需要了解您团队的能力和交付。

内部人员期望协作。因此,我的建议是从了解他们现有的流程开始,并让他们与数据科学团队保持一致。这包括更广泛的战略、项目优先级和人员依赖性。没有必要创造自己的世界,因为它会导致进一步的筒仓。虽然数据科学团队的各个方面都处于初创阶段,但我们需要利用现有的文化来铺平道路。

另一个建议是定期与他们交流。有时候,我们都在谈生意,只有在有项目的时候才会去见人。然而,了解你周围发生的一切是值得的。有时你可能能够直接提供帮助,有时你可能是一个好的倾听者。

当我开始担任数据科学经理时,我花了太多时间与其他业务领导和利益相关者在一起。我认为我的高绩效团队是自我激励的个人贡献者。我没有错,但是他们需要更多的透明度和我的指导,特别是因为许多数据科学项目都有模糊的范围。当我通过员工调查收到这个反馈时,我重新安排了我的日程表,花了更多的时间与团队单独或集体相处。从那以后,团队不仅更加快乐,而且作为我的合作伙伴,他们在一起解决业务问题时更具创新性。

外部人员

外部人员包括团队以外的所有人员。这包括你的直接利益相关者和更广泛的组织。

对于直接利益相关者,你需要保持良好的关系。该团队以前很可能交付过成功的工作,并且有相当多的信任。因此,我的建议是培养这种关系,并在团队之间建立更紧密的关系。

对于更广泛的组织来说,这可能非常模糊——的确如此。作为一个新的(或“未知的”)团队,更广泛的组织不知道你这个闪亮的团队,也不知道它能为他们做什么。我们的目标是识别他们。我的建议是向你的直接利益相关者和同事寻求推荐。一旦确定了他们,不要只向他们推销数据科学。你需要了解他们做什么,他们的愿望,以及你如何(或不)能够帮助使用数据科学。

当我开始担任数据科学经理时,我花了太多时间与我已经认识的利益相关者在一起。这很好,直到我的主管问我如何在组织的所有团队中嵌入数据科学。从那以后,我有意识地努力去认识新的利益相关者。虽然一开始不舒服,但他们非常感谢“酷”技术团队伸出援手。如今,我发现我的职责还包括更广泛的数据科学和分析传播。

流程

郁郁葱葱的室内设计 GIF。2021.检索自 Giphy

让我从我最近看到的 LinkedIn feed 说起:

初创公司可能需要十年的时间才能建立起来。

第一年:留在游戏中

第二年:找到适合市场的产品

第三年:寻找付费客户

第四年:建立团队和委派

第 5 年:按比例构建流程

第 6-10 年:继续游戏

那就是 10 年一夜成名

资料来源:Andrew Gazdecki

如前所述,数据科学仍然是一个新兴的职业。我们需要把它当成一个新公司。

当数据科学经理职位存在时,该公司通常需要三年以上的时间。如果他们已经超过 10 年,并且您想要进一步发展团队,那么构建一个可扩展的过程仍然是正确的行动。

那么,我们需要哪些流程呢?我将涉及三个主要重点领域:

人员流程

在澳大利亚,咖啡是我们的宗教之一。如果你想结识新朋友,请他们喝杯咖啡。如果你想和你的团队呆在一起,请他们喝杯咖啡。如果你想让顾客开心,请他们喝杯咖啡。

关键是人们不会神奇地一起工作。特别是,混合工作安排给团队协作带来了挑战。

有效的数据科学经理必须探索和实施健康的习惯,以实现团队的潜力。《孙子兵法》的作者老子雄辩地劝告我们:

注意你的想法;它们变成了习惯。注意你的习惯;他们变成了角色。注意你的性格;它成为你的命运。”——老子

例如,我是敏捷目标设定的 OKR(代表“目标和关键结果”)的忠实粉丝。它启动了一个季度对话,讨论我们努力实现的目标。然后,我们每周召开会议,讨论哪些可行,哪些不可行。在本季度末,我们将举办一次回顾展,为下一届 OKR 提供素材。此外,我还鼓励团队成员不断接受指导和反馈。

以上是交付的人员流程的示例,但是我们还需要社交的人员流程。是的,我们需要有意识地对待我们的社交生活。毕竟,我们花了很多时间在工作上。

当我开始担任数据科学经理时,创建人员流程感觉像是微观管理。作为一个“宏观”的人事经理,我让会议和“流程”自发地运行,这在团队或工作量小的时候工作得很好。随着我们越来越大,事情变得越来越混乱,团队很难跟上。这时,团队要求创建一个人员流程来更好地管理我们的时间和人员。在人们压力较小的地方,情况确实有很大的不同,因为他们知道实现结果所需的关键人物和步骤。

部署流程

在数据科学团队的早期,部署是非常临时的。平均而言,我看到数据科学团队在头三年里产生了 1 到 3 个生产模型。对于小型团队,通常只是简单的刷新、重新校准或故障排除。

想象一下,如果我们想要生产 20 或 50 个模型。我们要么需要一支庞大的数据科学家队伍,要么需要一个强大的流程。从我的经验来看,你的 CFO 会选择后者。开发时间也需要考虑在内,这将是非常耗时的。

数据科学团队的成功将取决于您的团队快速可靠地交付模型的能力。根据我的经验,MLOps 是一条可行之路,它是以可扩展和可靠的方式生产机器学习工件的实践。顾名思义,它涉及应用和适应软件工程和 DevOps 原则。

然而,即使是 MLOps 仍然是一个绿地区域。虽然有原则和例子,但你需要为团队设计一些有用的东西。作为提示,从简单开始,看看你是否能利用现有的市场工具。这不是一场关于构建宏伟(也称为复杂)解决方案的竞赛,而是关于实现商业价值——以及我们如何高效、一致和可靠地实现商业价值。

过去,我通过频繁的“作战室”来推动部署敏捷性。索伦·克尔凯郭尔曾说“进步可以倒着理解;但它必须向前发展”。当我们的团队落后于计划时,或者我们只是想超越预期时,这是真实的。快速和协作的沟通一次一个地解决了我们部署过程中的实际改进。例如,我们将数据部署流程从 4 周缩短到了 1 到 2 周,而且我们仍然对进一步改进持乐观态度!

销售流程

哇,我是数据科学家;我不是销售人员。是的,你不是销售人员。但是你要对团队的管道负责。如果你处于成熟期的早期,工作管道看起来相当空。我们可以从以此为生的销售朋友那里学到一些东西。

从上面的人员部分,我们应该已经确定了我们的直接利益相关者和几个潜在的利益相关者。对于你现有的客户,你需要采取主动的方法。一个常见的错误是等待业务请求。问题是请求可能很小,比如数据刷新或一些样本数据。我们希望数据科学能够带来巨大的商业价值,因此,您需要将数据科学团队视为业务合作伙伴,而不仅仅是服务提供商。

首先,你可以要求参与利益相关者的定期计划和战略会议。这会让你了解他们的背景、挑战和期望。从那时起,您将能够更好地确定数据科学可以在哪些方面发挥作用。然后,开始与他们建立定期的合作会议,以建立需求。

过去,我采用看板方法取得了很大的成功。该委员会分为几个关键的机会阶段,如潜在客户、联系、合格、提议、异议、成交和推荐。它创造了一个非常视觉化的表现,对我的注意力和展示给别人都很有效。

科技

黑豹魔法 GIF。2019.检索自 Giphy

作为一名数据科学经理,您负责“为什么”、“做什么”和“怎么做”。对于“如何”这一部分,技术扮演了一个巨大的使能角色。

有两种主要的思想流派:建造或购买。构建意味着您的团队从头开始编写解决方案,包括通过容器化部署的各种脚本,如 Python 和 SQL。购买意味着您的团队获得了一个针对给定目的预先配置好并随时可用的解决方案。

两种方案的总成本比较是复杂的。从成本的角度来看,构建“更便宜”,因为有许多开源选项。然而,我们吸收了构建时间、维护操作和额外的人员。购买期权的认购费用更高。然而,它是现成的,并由供应商不断维护和改进。

在一个高效的数据科学团队中,技术问题是从能力而不是成本上显现出来的。您的高绩效团队渴望展示他们在构建定制和制作精良的数据产品方面的编码能力。

如上所述,数据科学是一种应用我们的定量、技术和商业技能的商业职业。因此,团队的成功基于其在正确的时间交付业务成果的能力。

有鉴于此,时间可能不是我们的朋友,选择买入往往是明智的。这些供应商的工具大多允许定制,所以你可以手动操作。它还使数据科学团队能够解决更多的业务问题,并创造更大的组织影响。

一旦团队交付了成果和规模,技术选项仍然存在。到那时,你会意识到创新的界限,需要定制和制作精良的数据解决方案。

当我开始担任数据科学经理时,我在最佳技术比较上花了太多时间。我想做出准确的“数据”驱动的决策。然而,这些比较花了几个月的时间,人们仍然不同意“最好”的技术。我意识到我们需要在特征分析的基础上考虑组织和团队文化。在那里,我们进行了价值验证,并收集了以前没有的真正的组织反馈。这创建了一个更强大的业务案例,并允许我们同时交付业务价值。

一起前进

B 成为一名高效的数据科学经理并不容易,但这是可以实现的。我们把大部分的知识都奉献给了最新的数学技巧和技术。现在,我们需要调整我们对人、流程和技术的软技能的学习。

当你处于早期阶段或学习成为一名数据科学经理时,诱惑是学习每一门管理课程并煮沸海洋。然而,他们通常涵盖一般的管理技能,如沟通和规划。在新兴的数据科学专业中,我们还需要更多具体的资源。

感谢您阅读本文!请在下面的评论区添加你最喜欢的建议。

如果你喜欢这篇文章,并希望看到更多的内容,请考虑加入媒体会员,使用下面的链接来支持我和其他作者:

https://albertsuryadi.medium/membership

另外,看看我下面的其他媒体文章:

https://albertsuryadi.medium/an-executive-guide-to-drive-real-value-out-of-your-data-4e260e3a9100

关于作者: 阿尔伯特·苏亚迪 是为前瞻性组织提供高级分析和数据科学能力的公认领导者。他被公认为分析团队(实践社区)的领导者,该团队授权并激励他人超越现状。

用随机森林击败萨格马克·迪帕

原文:https://towardsdatascience/how-to-beat-sagemaker-deepar-with-random-forest-a358f115841f

建模变得简单

借助速度提高 3 倍的免费可解释模型,将您的 KPI 提高 15%

在 Unsplash 上由 Victoire Joncheray 拍摄的照片

如果你正在阅读这篇文章,你要么考虑对你的多时间序列数据集使用亚马逊 SageMaker DeepAR 算法,要么你已经被一个算法“卡住”——不知道如何进一步改进它。

你的数据集可能是什么样子。Airtable(数据由作者提供)

在深入研究尼提格里提技术之前,你应该考虑以下几点:

DeepAR pros

  1. 不需要数据科学专业知识 —如果你对数据科学一无所知,就不要继续阅读了。使用 DeepAR,它几乎不需要任何处理数据和创建预测模型的知识。
  2. 稳定性 —指标的方差很低,因为结果随着时间的推移相当稳定。你(一开始)看到的,就是你(将来)得到的。
  3. ——你会使用一种最先进的算法,很可能是亚马逊自己在自己的销售数据上使用的。因此,向你的非技术同事推销可能更容易。

DeepAR cons

  1. SageMaker 所需专业知识—*SageMaker 手册 长达 3447 页。虽然 DeepAR 只有 16 页,但你必须仔细阅读它们,并遵循以下说明:格式化你的数据(即类别标签),手动和自动调整超参数,回答 AWS 实例需求,并正确地将数据输入模型。*
  2. 刚性&黑盒——要改进一个现有的 DeepAR 模型并不是一件容易的事情。有一个小的、固定的超参数列表,如果您已经使用了超参数优化(您应该使用它),那么更改它们的值是没有用的!).此外,没有足够好的解释来说明模型的这些特征的重要性,所以很难在*CRISP-DM阶段重申,或者只是向客户解释他的模型中到底发生了什么。*
  3. 成本 —模型在 AWS 上的训练运行时间既耗费时间又耗费金钱

这就是你如何为你的 DeepAR 模型提供数据和超参数。是不是很奇怪?

如果你还和我在一起,你要么相信(像我一样)利大于弊,要么只是好奇想看看未来会怎样。无论哪种方式,我的经验告诉我,使用 3 倍的速度、相对免费和更易解释的模型,可以将 DeepAR 得分提高 15%,甚至可以在相当稀疏的销售数据上做到这一点。但这并不是一项容易的任务:我能给你的只有热血、汗水和一小时的编码,一直到胜利。

你准备好了吗?

  1. 了解你的工具
  2. 介意差距
  3. 你在这里的目标是什么?
  4. 改变你的视角
  5. 丰富你的故事
  6. 建模,正确的方法
  7. 多余的边

1.了解你的工具

分组,分组,别忘了分组

首先,用正确的工具集来解决这个问题是至关重要的。由于数据的本质是有序序列,**很容易使用对循环*** 预处理数据,这些循环一个接一个地迭代日期和产品(如machinelingmastery所示)。尽管如此,我还是劝你——不要那样做!如果你下了那个兔子洞,你可能再也出不来了,因为你的管道需要几个小时才能运行。*

相反,去认识你的新好朋友: pandas Groupby operation ,以及它所有的奇妙小伙伴:rolling,expanding,cumsum,cumcount,diff,sum,min,max,mean,pct_change,rank,head,tail,first,last,bfill,ffill,shift,nunique 等…当然,还有**group by**queen**:apply。(lambda x:your_function(x))

把事情理清楚

在将 Groupby 结果连接回 DataFrame 之前,不要忘记按正确的顺序排序 sort _ values(),并且记住 bfillffill 函数很容易在不同的组之间溢出。使用 groupby + merge 更安全,因为它将确保那些丢失的值被正确组上计算的值填充。**

维护自己

测试您所做操作的输入和输出的正确性总是一个好主意,即使只是通过键入一个简单的 断言 命令。通过使用 assert ,您可以确保您对数据所做的假设(稍后用于您的计算)是正确的。相信我,当数据变得复杂时,如果没有那些有用的小断言,就很难搞清楚到底发生了什么。

只是你的定期-正常-每天 5 天滚动窗口的最低,最高,平均和总和的产品销售在整个国家,为每种产品。很简单,对吧?

->还有输出。Airtable(数据由作者提供)

2.小心(列车与站台之间的)空隙

如果数据集是完整的,即:

行数=时间戳数 X 索引数

这一点可以跳过。否则,您可能应该填充那些缺失的观察值,这样您就可以正确理解目标在时间戳上的真实分布。

您的数据集不完整的一个常见原因也在于我们的多指标时间序列数据集的性质:销售数据往往包括实际销售的信息,而没有任何零售额。如果精度很重要,并且您希望您的模型知道销售何时不会发生,那么就用零行来填充它。

另一件要记住的事情是有时候时间戳可能不是以日期的形式出现**。考虑一个预测学生毕业的模型。在这个模型中,时间特征可能是学生到目前为止获得的学术学分,而不仅仅是一些无用的日历日期。**

零很重要!Airtable(数据由作者提供)

3.你在这里的目标是什么?

DeepAR 将预测您的定量需求。但是如果时机比数量更重要呢?例如,您的最终目标是对每天每个城市的每种产品进行合理的销售预测,因为您必须为库存产品规划空间。但对你来说,更重要的是正确预测任何数量的产品将被出售的日期,因为任何数量大于零意味着你将向芝加哥的仓库发送一辆满载香蕉的新卡车。你不介意在这条赛道上装载一些额外的香蕉,但在根本没有香蕉出售的时候派出一辆新的卡车,可能是对你金钱的巨大浪费。如果对你来说是这样,时间比数量更重要,你应该考虑把你的目标转换成二进制的:大于 0 的数量为 1,否则为 0。

有时候,仅仅一根香蕉就能改变一切。照片由在 Unsplash 上的实体模型图形拍摄

但是我们如何在同一个模型中既有二元预测又有定量预测呢?简单——我们将训练一个两步模型:第一步预测销售是否会发生,第二步将预测仅在预测销售的时间内** **销售多少数量。不要担心我们在这里添加的额外工作,因为即使这是两个目标不同的不同型号,它们也可以使用完全相同的功能。

然后…瞧!我们现在有一个分类问题。Airtable(数据由作者提供)

最后,关于物质的目标,如何解决任何挑战的一个重要建议:花一些时间浏览文献,最好是学术文献。你可能会从那些已经在这方面花费了大量时间并决定分享他们的成果的好心的研究人员那里得到一些关于如何定义和解决你的问题的好主意。所以,站在那些巨人的肩膀上。

4.改变你的视角

像 ARIMA 或 RNN 这样的时间序列算法知道如何处理你的时间序列数据集,一个索引一个索引。另一方面,像 Random Forest 和 XGBoost 这样的监督算法不会。它们将每一行与其他行分开处理,您不应该向它们提供时间戳列。因此,我们必须将我们的数据结构转换成截面 ( Groupby.shift 将会很方便)。但是,如果您真的走这条路,请记住,对于日期、城市和产品的每种组合,您必须只有一行,所以要提前分组。

将它输入到没有日期列的模型中,行的顺序并不重要。Airtable(数据由作者提供)

警告信息

  • 添加这些滞后要素将会在每个组的第一个时间戳中添加缺少数据的像元,请考虑将这些行一起移除或为它们赋予一些有意义的值。你唯一不能做的就是用原始销售数据填充它们,因为那只是直接的目标泄露。
  • 注意不要将行移动到错误的方向,从而创建未来销售特征而不是历史销售特征,这将再次导致泄漏。

5.丰富你的故事

数据完整性、项目目标和问题视角非常重要,但是如果没有一套好的特性来辅助故事情节,预测可能会做得很差。我们的故事有两种特征:(独立的)😗***

  • 时间固定特征 往往来源于类别(即地点、名称、品牌),可以用通常的方式处理, 目标编码 是一种降低稀疏性的方法。只需记住在训练中计算,保存计算的统计数据,并在测试中重新应用它们,而无需再次计算。
  • 的时间相关特性既可以用点 4 中提到的移位来丰富,也可以用 滚动窗口 聚合器来丰富,如点 1 的示例输出。与时间相关的功能也可能包含一些有用的数据,如 扩展聚合器,即对于每个时间戳,直到该时间戳的平均销售额。最后,还有 全列车统计,比如在每个时间戳中有整个列车期间的销售总和(或加权总和)。这些特性包含一些产品“永远正确”的数据,就像一个时间固定特性。例如,随着时间的推移,香蕉在总销售额中的权重为 50%,因此在 total_sales 特性中,包含香蕉的每一行将得到 0.5。**

投资这个故事,它会回报你的投资。农 V 在 Unsplash 上拍照

这里的一个关键问题是数据管道。你应该有一个有效的功能管道 —记住,管道将为训练和测试运行两次,它们之间有一些差异(因为一些计算将只发生在训练中,并复制到测试)。确保每个功能完全独立于其他功能,这样您就可以添加和删除功能,而不必担心它们对其他功能的影响。

6.建模,正确的方法

最后,面包和黄油。以下是一些特定于时间序列的建模建议:

  • 像在点 2 中那样填充缺失的时间戳后,您的数据集可能会变得完全不平衡。对销售行进行上采样,使其等于零销售额的行数。这将增加目标的信号,可以帮助您的模型更好地学习。
  • 不要随意拆分你的数据。在时间上分割它(训练=过去,测试=最后的时间戳),并且在部署之前总是记住在你的整个数据集上重新训练你的模型(训练+测试)。这样,部署的模型将根据尽可能接近新数据的数据进行训练。
  • 记住删除任何带有未来信息的特性**,或者任何不再出现的时间戳(具体日期不行,具体月份可以接受)。**

基本上与每个 ML 模型相关的其他要点:

  • ****去掉高度相关的特征。它们的贡献很小,但会对相关特征的系数产生偏差。
  • ****根据客户的 KPI 优化您的决策门槛!这可能会带来巨大的改进,而且应用起来相当简单:计算 0 到 1 之间的 100 个不同阈值的 KPI 值,并选择使训练数据的 KPI 最大化的阈值。
  • 为不同的算法尝试不同的超参数,绘制衡量指标对模型复杂性的改进的训练与测试图。确保你足够接近“刚好合适”:一方面,你的模型没有过度训练和学习你的训练数据的随机性,另一方面,你的模型训练得足够努力,以达到令人满意的结果。

7.额外的优势

多个组的多个模型

有时,您的数据非常庞大和复杂,模型很难收敛到最佳解决方案。例如,香蕉和苹果的销售模式确实不同,但是不同城市的苹果销售模式也确实不同。它可能不会就此停止,因为同一座城市的一些商店在周末和节假日会卖出更多的苹果,而且,出于某种未知的原因,他们可能还会在每个月的第三周卖出更多的苹果。

在这种情况下,以及在任何其他情况下,努力在数据中找到有意义的组,然后在每个不同的组上训练独立的模型**(从点 5 开始的所有规则适用于每个模型)。你会惊讶地发现这一步是如何进一步改进你的模型的,即使在你已经将特征工程和超参数优化挤压到骨骼之后。更不用说,DeepAR 可能不容易分成不同的模型,因为每个模型需要的观察最少,或者只是训练更多模型所需的额外时间和金钱,所以您将拥有与生俱来的优势。**

当有许多锁着的门并且很难找到主人时,使用许多钥匙。照片由 Alp Duran 在 Unsplash 上拍摄

你如何找到这些群体?您可以使用分类特征(例如每个城市、每个项目、每个季度的模型),或者——这可能与时间序列数据更相关——您可以将具有相似销售模式的组聚集在一起**。例如,创建一个在训练中的最后一个时间戳之前的最后 6 天中某个城市中某个产品的二进制销售额总和的特征。这个特性的范围自然是从 0 到 6,因此您可以为这 7 组中的每一组训练一个单独的模型。因此,如果在最后一次约会之前的最后 6 天里,休斯顿的枣椰被卖了 3 次,而洛杉矶的接骨木莓被卖了 5 次,那么休斯顿的枣椰和洛杉矶的接骨木莓将被放入不同的模型中。最后,使用统计学你总能找到有意义的群体:记住不同群体可能的分裂列表,对这些群体进行目标编码,并查看分裂的平均值是否“足够”不同。您也可以使用卡方检验来完成这项任务。**

摘要

针对多个时间序列数据的亚马逊 SageMaker DeepAR 模型是一种最先进的算法,由一家科技巨头开发。不需要 DS 知识,相当稳定可靠。尽管如此,它并不总是交付最好的结果,即使结果是合理的,它们也很难被解释,并且总是耗费大量的时间和金钱。

我认为,技术娴熟的数据科学家可以做得更好。如果她:使用 Groupby 命令,确保数据完整且充分,正确定义目标,将时间序列操纵成横截面,工程师洞察力特征,训练模型推进并达到最佳可实现的精度,甚至为不同的组训练不同的模型 —
她能够并将打败 DeepAR

欢迎分享您的反馈,并通过 LinkedIn 联系我。

感谢您的阅读,祝您好运!🍀

如何成为更好的数据科学团队

原文:https://towardsdatascience/how-to-become-a-better-data-science-team-1dc21693d9f9

意见

作为一名数据科学家,协作是关键

拉拉·阿兹利在 Unsplash 上的照片【1】。

目录

  1. 介绍
  2. 规划和修饰
  3. 利益相关方更新
  4. 回顾展
  5. 摘要
  6. 参考

介绍

我写的很多文章,以及一般的文章,都聚焦于一个单一的数据科学家,所以我想聚焦于一些不同的东西本身。那就是——数据科学团队。但是首先,让我们定义一下通常是由什么组成。虽然这不是一成不变的,但这里有一个数据科学团队的例子:一些数据科学家、一名数据工程师、一名业务/数据分析师、一名数据科学经理等。这里的要点不是谁组成团队,而是团队如何一起工作。话虽如此,让我们看看改善您的数据科学团队的工具和方法,无论您是数据科学家、经理还是技术招聘人员。

规划和修饰

由埃斯特·扬森斯在Unsplash【2】上拍摄的照片。

第一个工具是计划和训练的结合。这些术语可能有点混乱,所以让我们先定义一下。

整理属于组织的范畴,但这个过程与计划(在某些公司是*)的区别在于,它是对你积压工作的第一次审查,这些工作可能由几张吉拉入场券或你的团队加班加点完成的一般任务组成,但尚未被优先纳入活动流程。*

你可以把计划想得更具体,在一个sprint的层面上,即使你不使用吉拉,你仍然可以每周、每两周或任何你认为合适的节奏来计划,并记录更多的检查。你通常会做的是讨论即将到来的项目,但更重要的是,特定项目在给定的一周或一段时间内的可消化的任务,等等。

以下是在规划和修饰方面进行合作的几点收获和好处:

  • 分配特定任务的努力程度
  • 赋予重要性或者优先权
  • 避免冗余
  • 向自己强调本周你关注的是什么
  • 如果有人做过类似的工作,可以帮助你/让任务更有效率

同样,根据你的公司或者你是否使用敏捷环境,这些术语可能会改变或者完全相同,但是重要的是你的团队的总体组织。

利益相关方更新

照片由 LinkedIn 销售解决方案在 Unsplash 上拍摄

在成为一名数据科学家的过程中,利益相关者的更新不会被过多地讨论,因为这段时间通常更专注于学习算法、代码本身以及它们各自的底层概念。

利益相关者可以定义为最终分配您的任务或项目的人,或者将消化您的最终项目及其对业务的影响的人。也就是说,利益相关者的角色并不相同;他们可以是数据科学经理、产品经理、销售工程师等。

你当然可以通过吉拉门票、Slack messages、Google 幻灯片等等更新利益相关者。然而,关键不在于你使用的平台,而在于你分享信息和更新的方式。

以下是您和您的团队可以有效更新利益相关者的一些方法:

  • 如果您不是数据科学家,数据科学主题可能会令人困惑,所以请确保您放弃了只有数据科学家才知道的不必要的术语
  • 用为什么/为什么/如何/结果的方法解释一个项目。这里有一个你可以提出的问题的例子:

—项目是什么?

—为什么这个项目会发生?

—它是如何解决的?

—其结果是什么?

  • 使用前后比较,如下所示:

—以前的目标是什么,现在是什么?

此外,查看特定数据组的细分,例如,按地理位置、州、周末、类型等。

有许多方法可以解释和更新您的数据科学项目,最重要的是您如何阐明它们。

回顾展

照片由 LinkedIn 销售解决方案在Unsplash【4】上拍摄。

最后,是您的特定数据科学团队的回顾。这通常是两周一次或每月一次的对之前发生的一些情况的彻底讨论。

虽然计划和准备是在项目或任务之前,涉众的更新是在项目或任务期间以及任务结束时,但是回顾包括了在相同的整个时间框架内发生的所有事情。

在这次回顾性讨论中,您通常会看到一些东西:

  • 什么进展顺利?
  • 有哪些可以改进的地方?
  • 向前发展的新机会是什么?
  • 针对表现出色的员工的具体标注
  • 在下一次回顾会之前,我们应该跟进哪些行动项目?

所有这些问题和领域通常会涵盖给定时间内发生的所有重要事情。你会更好地意识到什么对团队、公司和你自己是重要的。

摘要

虽然提高自己将改善团队,但还有其他更以团队为中心的事情可以关注,最终使您的数据科学团队整体变得更好。

总而言之,以下是您的数据科学团队作为一个整体可以改进的三种方式:

** Planning and Grooming* Stakeholder Updates* Retrospectives*

我希望你觉得我的文章既有趣又有用。如果您同意或不同意这些特定的工具和方法,请随时在下面发表评论。为什么或为什么不?关于数据科学团队的改进,您认为还有哪些工具和方法值得一提?这些当然可以进一步澄清,但我希望我能够为数据科学团队提供一些更独特的工具和方法。

我不属于这些公司中的任何一家。

请随时查看我的个人资料、 Matt Przybyla 、和其他文章,并通过以下链接订阅接收我的博客的电子邮件通知,或通过点击屏幕顶部的订阅图标 ,如果您有任何问题或意见,请在 LinkedIn 上联系我。

订阅链接:https://datascience2.medium/subscribe

引荐链接:【https://datascience2.medium/membership】T22

(如果你在 Medium 上注册会员,我会收到一笔佣金)

参考

[1]Lala Azizli 在 Unsplash 上拍摄的照片,(2021)

[2]2017 年埃斯特·扬森斯在 Unsplash 上拍摄的照片

[3]照片由 LinkedIn 销售解决方案在Unsplash(2020)上拍摄

[4]照片由 LinkedIn 销售解决方案在 Unsplash 上拍摄,(2018)

如何成为命令行向导

原文:https://towardsdatascience/how-to-become-a-command-line-wizard-5d78d75fbf0c

你可能从未上过的最有用的计算机科学课

使用稳定扩散生成的图像

在我的职业生涯中,我一直观察到的一件事是,最有生产力的数据科学家和工程师通常有一个共同点:他们是命令行奇才。他们可以在计算机的文件系统中导航,在日志文件中搜索模式,管理作业、源代码和版本控制,所有这些都可以从命令行进行,而不需要依赖鼠标和图形用户界面的缓慢导航。

然而,对于不熟悉 shell 工具的人来说,这种命令行“魔法”并不是标准计算机科学课程的典型组成部分。麻省理工学院的一门关于掌握命令行的课程被恰当地命名为“CS 教育的缺失学期”。

这篇文章是我个人的 10 节课的“命令行魔术 101”课,面向那些希望更多地使用命令行而不是图形用户界面的读者。我们将介绍 shell 和 path 变量、别名、文件权限、流和管道、高效的作业管理、tmux、ssh、git 和 vim 等基础知识。

让我们开始吧。欢迎来到 CLW 101 大楼。

1.贝壳

当你打开终端时,你会看到一个外壳,比如 bash (borne again shell)或者 ZSH (z-shell)。shell 实际上是一种完整的编程语言,可以访问某些标准程序,这些程序允许文件系统导航和数据操作。您可以通过键入以下命令找到您正在运行的 shell:

echo $SHELL

在 bash 中,每次您启动一个新的 shell 时,shell 都会加载一系列在.bashrc文件中指定的命令,该文件通常位于您的主目录中(如果您使用 Mac,通常会有一个.bash_profile文件代替)。在该文件中,您可以指定有用的东西,如路径变量或别名(下面将详细介绍)。

2.路径变量

当您在 shell 中键入某些程序的名称时,例如pythoncatls,shell 如何知道从哪里获得该程序呢?这就是路径变量的用途。该变量存储 shell 查找程序的所有路径的列表,用冒号分隔。您可以通过键入以下命令来检查路径变量:

echo $PATH

您可以使用以下命令向 path 变量添加额外的目录:

export PATH="my_new_path:$PATH"

最好将这个命令添加到您的 bashrc 文件中,这样当您启动一个新的 shell 时,您的附加目录总是在您的路径中。

3.别名

别名是您可以定义的自定义命令,以避免反复输入冗长的命令,例如:

alias ll="ls -lah"
alias gs="git status"
alias gp="git push origin master"

别名也可以用来为您的开发工作流创建安全措施。例如,通过定义

alias mv="mv -i"

如果您要移动的文件已经存在于新目录下,您的终端将会警告您,这样您就不会意外地覆盖您不想覆盖的文件。

一旦您将这些别名添加到 bashrc 文件中,当您启动一个新的 shell 时,它们总是可用的。

4.文件权限和 sudo

当多个用户共享一台机器时,设置文件权限很重要,它决定了哪个用户可以对哪些数据执行哪些操作。当您键入ls -l时,您将看到当前目录中的文件及其权限,如下所示:

-rwxrwxrwx

这里,

  • rwx分别代表读取、写入和执行权限
  • 3 个rwx块分别用于(1)用户,(2)用户组,和(3)其他所有人。在给定的示例中,所有这 3 个实体都具有读、写和执行权限。
  • 破折号表示这是一个文件。除了破折号,你还可以看到一个代表目录的d 或者一个代表符号链接的l

可以用chmod编辑文件权限。例如,如果您想为自己创建一个可执行文件,您可以键入

chmod u+x my_program.py

👉如果一个文件是可执行的,shell 如何知道如何执行它?这是在文件的第一行用‘hash bang’指定的,比如对于 bash 脚本用#!/bin/bash,对于 python 脚本用#!/bin/python

最后,还有一个特殊的“超级用户”,他拥有所有文件的所有权限。您可以运行任何命令,就像超级用户在命令前面写下sudo一样。您还可以通过执行以下命令来启动独立的 sudo shell

sudo su

⚠️小心使用须藤。有了 sudo,你可以修改控制电脑硬件的代码,一个错误就可能让你的电脑无法使用。记住,权力越大,责任越大。

5.流动和管道

操作符>将输出从程序重定向到文件。>>做同样的事情,但是它附加到一个现有的文件,而不是覆盖它,如果它已经存在的话。这对于记录您自己的程序很有用,如下所示:

python my_program.py > logfile

另一个有用的概念是管道 : x | y执行程序 x,并将 x 的输出导入程序 y。例如:

  • cat log.txt | tail -n5:打印 log.txt 的最后 5 行
  • cat log.txt | head -n5:打印 log.txt 的前 5 行
  • cat -b log.txt | grep error:显示 log.txt 中包含字符串“error”的所有行,以及行号(-b)

6.管理作业

如果你从命令行运行一个程序(如python run.py,程序将默认在前台运行,并阻止你做任何其他事情,直到程序完成。当程序在前台运行时,您可以:

  • 键入 control+C,它将向程序发送 SIGINT(信号中断)信号,指示机器立即中断程序(除非程序有办法在内部处理这些信号)。
  • 键入 control+Z,这将暂停程序。暂停后,可将节目带到前台(fg)或发送到后台(bg)继续播放。

为了立即在后台启动您的命令,您可以使用&操作符:

python run.py &

👉如何知道哪些程序当前正在后台运行?使用命令jobs。这将显示正在运行的作业的名称及其进程 id(PID)。

最后,kill是一个向后台运行的程序发送信号的程序。举个例子,

  • kill -STOP %1发出停止信号,暂停程序 1。
  • kill -KILL %1发送终止信号,永久终止程序 1。

我个人 Macbook 的带有 tmux 的终端上的四个终端窗格(图片由作者提供)。

7.tmux

tmux(“终端多路复用器”)使您能够轻松创建新的终端并在它们之间导航。这非常有用,例如,您可以使用一个终端来导航您的文件系统,而使用另一个终端来执行作业。使用 tmux,您甚至可以同时拥有这两者。

👉学习 tmux 的另一个原因是远程开发:当您注销远程机器时(有意或无意),所有在您的 shell 中运行的程序都会自动终止。另一方面,如果您在 tmux shell 中运行您的程序,您可以简单地脱离 tmux 窗口,注销,关闭您的计算机,稍后再回到那个 shell,就好像您从未注销过一样。

下面是一些帮助您开始使用 tmux 的基本命令:

  • tmux new -s run创建名为“运行”的新终端会话
  • control-BD:分离此窗口
  • tmux a:附加到最新窗口
  • tmux a -t run:附加到名为‘运行’的窗口
  • control-B ":在下面添加另一个终端面板
  • control-B%:在右侧添加另一个终端面板
  • control-B➡️:移动到右边的终端面板(类似于左、上、下)

8.SSH 和密钥对

ssh是登录远程机器的程序。为了登录远程机器,您需要提供用户名和密码,或者使用一个密钥对,由一个公钥(两台机器都可以访问)和一个私钥(只有您自己的机器可以访问)组成。

ssh-keygen是一个生成这种密钥对的程序。如果您运行ssh-keygen,默认情况下,它将创建一个名为id_rsa.pub的公钥和一个名为id_rsa的私钥,并将它们放入您的~/.ssh目录中。您需要将公钥添加到远程机器,现在您应该知道,您可以通过管道将catssh和一个流操作符连接在一起:

cat .ssh/id_rsa.pub | ssh user@remote 'cat >> ~/.ssh/authorized_keys'

现在,您只需提供您的私钥,就可以使用 ssh 到 remote 了:

ssh remote -i ~/.ssh/id_rsa

更好的做法是创建一个包含所有 ssh 验证配置的文件~/.ssh/config。例如,如果您的config文件如下:

Host dev
  HostName remote
  IdentityFile ~/.ssh/id_rsa

然后只需输入ssh dev就可以登录 remote。

9.饭桶

git是一个版本控制系统,允许你从命令行有效地浏览你的代码的版本历史和分支。

👉注意git与 GitHub 不同:git是一个独立的程序,可以在本地笔记本电脑上管理代码的版本,而 GitHub 是一个远程托管代码的地方。

以下是一些基本的 git 命令:

  • git add:指定下次提交时要包含哪些文件
  • git commit -m 'my commit message':提交代码变更
  • git checkout -b dev:创建一个名为‘dev’的新分支,并检查该分支
  • git merge dev:将 dev 合并到当前分支。如果这会产生合并冲突,你需要手动修复这些冲突,然后运行git add file_that_changed; git merge --continue
  • git stash:恢复所有更改,git stash pop将其恢复。如果您对主分支进行了更改,然后决定您实际上希望这些更改成为一个单独的分支,这将非常有用。
  • git reset --hard:永久恢复所有更改

下面是一些处理远程主机(例如 GitHub)的基本 git 命令:

  • git clone:将代码仓库的副本克隆到您的本地机器上
  • git push origin master:将更改推送到远程主机(如 GitHub)
  • git pull:从遥控器拉最新版本。(这个和跑git fetch; git merge;一样)。

👉在能够运行像git push origin master这样的命令之前,您需要使用 ssh 密钥对进行认证(参见第 8 课)。如果您使用 GitHub,您可以简单地将公钥粘贴到您的配置文件设置下。

10.精力

Vim 是一个强大的基于命令行的文本编辑器。至少学习 vim 中最基本的命令是一个好主意:

  • 每隔一段时间,您可能必须登录到一台远程机器,并在那里更改代码。vim 是一个标准程序,因此通常可以在您使用的任何机器上使用。
  • 运行git commit时,默认情况下 git 打开 vim 来写提交消息。所以至少你会想知道如何写、保存和关闭一个文件。

关于 vim,需要理解的最重要的一点是有不同的操作模式。一旦您启动 vim,您就进入了导航模式,您可以用它来浏览文件。键入i启动编辑模式,在该模式下可以对文件进行修改。键入Esc键退出编辑模式并返回导航模式。

导航模式的有用之处在于,您可以使用键盘快速导航和操作文件,例如:

  • x删除一个字符
  • dd删除整行
  • b(后退)转到上一个单词,n(下一个)转到下一个单词
  • :wq保存您的更改并关闭文件
  • :q!忽略您的更改并关闭文件

更多(更多!)vim 键盘快捷键,查看这个 vim cheatsheet 。

瓦西里·科洛达在 Unsplash 拍摄的照片

最后的想法

祝贺您,您已经完成了“命令行向导 101”。然而,我们在这里仅仅触及了表面。为了获得灵感,请考虑以下问题:

给定一个文本文件和一个整数k,以递减的频率打印文件中最常用的k个单词(及其出现的次数)

作为一名数据科学家,我的第一个冲动可能是启动一个 jupyter 笔记本,将数据加载到 pandas 中,然后使用 pandas agg之类的功能。然而,对于一个经验丰富的命令行向导来说, 这是一个命令行程序 :

tr -cs A-Za-z '' | tr A-Z a-z | sort | uniq -c | sort -rn | sed ${1}q

这看起来和本文开头展示的稳定扩散的想象没有太大区别。的确是魔法。

在你走之前…

喜欢这个故事? 订阅 ,我的最新内容会直接进入你的收件箱。还不是中等会员? 加入我的推荐链接 并解锁无限制访问本平台发布的所有内容。想保持联系吗?关注我上 LinkedInTwitter。**

寻找更多提高工作效率的技巧?查看下面链接的文章👇

* *

本文标签: 中文翻译博客TowardsDataScience一百九十六