用数据解读 2020 年波多黎各地震群
使用可视化,地图,时间序列和谷歌趋势数据来描述这一事件
波多黎各的圣胡安。照片由 me 拍摄。
自 2019 年 12 月下旬至 2020 年 1 月初,波多黎各岛的西南部地区经历了一系列地震,在波多黎各人中留下了一系列破坏和不确定性。根据美国地质调查局(USGS)的说法,导致这些地震的原因是北美和加勒比板块的汇聚。位于波多黎各北部的北美板块正在与加勒比板块汇合,而在南部,加勒比板块在 Muertos 海槽处隐没在波多黎各之下(来源)。
在本文中,我们将使用统计、可视化、时间序列分析来探索这些地震的几个属性,此外,查看谷歌搜索“波多黎各”和地震震级之间的相关性。
数据
这份报告的数据集由 USGS 报告的 2019 年 12 月 20 日至 2020 年 1 月 19 日半径 50 公里范围内的地震组成。从纬度 19.949 和经度-66.851。它有 2041 条记录,每条记录代表一次单独的地震,有 22 列记录了事件的属性。然而,根据这些特征,我们将只使用坐标、时间和事件的大小。
这是用于获取数据的查询。
https://earthquake.usgs.gov/fdsnws/event/1/query?format=csv&start time = 2019-12-20&end time = 2020-01-19&纬度=17.949 &经度=-66.851 & maxradiuskm=50
在数据集中,我过滤掉那些报告的震级低于 0 的条目(根据 USGS 文档,较低值可以是-1.0)。您可以在本文的代码库中找到数据集的副本。
除了这个主数据集之外,在这个项目中,我还使用了第二个数据集,由 Google Trends 从 2019 年 12 月 19 日到 2020 年 1 月 17 日的查询词“波多黎各”的数据组成。
工具
数据分析和大多数可视化都是在 r 中完成的。库 ggmap 用于生成地震位置的图形,时间序列分析是使用 Python 中的库 Prophet 完成的。趋势数据来自谷歌趋势。
了解地震
在 2019 年 12 月 20 日至 2020 年 1 月 19 日期间,总共报告了 2041 起事件,平均每天 66 。其中,2019 年 12 月 31 日是最活跃的一天,发生了 220 次地震,平均震级为 1.966 。总体而言,最强烈的地震发生在当地时间 2020 年 1 月 7 日 04:24:26,震级为 6.40 ,而平均震级为 2.467 ,标准差为 0.687 ,中位数为 2.390 。下面的直方图显示了震级得分的分布。
如果不是直方图最右侧的异常值点,这个分布将是一个正常分布,其中大多数值都接近平均值(黑线)。在下面的箱线图中,我们可以更好地看到异常值。
这个箱线图是一个偏右箱线图的例子,在这个例子中,盒子和变量值都在刻度的低端。在这里,我们可以看到第一个四分位数(方框底部)、第三个四分位数(方框顶部)和中间值(粗体线)之间的对称性,中间值代表直方图中的峰值。然后,方框上方是异常点,包括最强的 6.4 级地震。
我想展示的下一个图像是一个散点图,显示了地震发生当天的震级。该图还包括一条平滑线,指出属性的演变。
在图表中,我们可以看到虫群是如何在 2019 年的最后几天开始的。然后,在 1 月 2 日左右,活动稍微停止,直到 1 月 6 日和 7 日,当强大的一个到达时,在前一个是 5.80 小时后。在接下来的日子里,几次强烈的余震袭击了这个岛屿,包括 1 月 11 日的 5.90 级余震。回到图表的开头,你会发现一些震级值在 2 左右的地震。这些对应于波多黎各经常发生的“正常”但微弱的地震(大多数地震一般感觉不到)。
地点
正如引言中所述,蜂群出现在波多黎各的西南部地区,靠近 Muertos 海槽。更准确地说,受影响的地区位于纬度(17.8,18.0)和经度(-67.2,-66.6),该地区包括或靠近瓜尼卡、瓜亚尼亚、庞塞和亚乌科等城镇,这些地方遭受了严重的损失。在接下来的可视化中,我们将看到该地区的地图,其中显示了发生地震的震中位置。
平均地震发生在纬度 17.92564,经度-66.83728。
Muertos 槽,来源:https://ocean explorer . NOAA . gov/oke anos/explorations/ex 1502/background/geology/welcome . html
趋势和每日季节性
从上面呈现的散点图的平滑线,你可以了解自震群开始以来地震的强度是如何变化的。这条线虽然有用,但并不代表这个变量的最终趋势。
为了阐明这个问题,并更好地了解地震的震级是如何发展的,我使用时间序列工具 Prophet 计算了总体趋势和每日季节性。下面你会发现趋势。
这条线描述了自 2019 年 12 月 19 日以来震级的演变。在那一周,趋势线处于低位,与上面解释的“正常”行为相对应。然后,一旦地震开始,因为有很多低震级的地震,平均值就会下降。然而,紧接着,我们有大地震及其余震,随后又是一次下降。在写这篇文章的时候,地震活动仍然活跃,这解释了为什么这条线一直在增长。
为了澄清任何可能的混淆,我想快速解释一下你在图的 y 轴上看到的数字背后的含义。这些值不是实际的大小。相反,我们可以将它们解释为趋势部分当天的增量效应。例如,在图表的第一天,y 值为 2.0,这意味着这一天对 y 的影响为+2.0。
这一部分的第二张图是每小时的季节性。根据我的知识(如果我错了,请有人纠正我),地震是不遵循任何模式的随机事件。尽管如此,即使知道这一点,我还是想计算一下每小时的季节性,因为我得到的印象是(请注意,我不在波多黎各,所以我的“印象”是指我在新闻和社交媒体上看到的),大多数地震都发生在夜间。下图显示了数据。
首先映入眼帘的是凌晨 4 点后的全球最大值,也就是大地震发生的时间。然后,就在它之后,曲线下降,直到下午 4 点,然后再次上升(也许这就是为什么我认为它们发生在晚上),最后一次下降,直到凌晨 1 点左右达到最低位置。
谷歌趋势
通常,当像这样的自然事件发生时,相关国家会受到世界的关注。你会在新闻、当地报纸、社交媒体等等中看到提及。为了验证这个想法,我使用 Google Trends 的每日趋势分数作为搜索查询“波多黎各”,并将其与当天的最大震级值相关联。我认为地震越剧烈,关于波多黎各的谷歌搜索就越多。这个假设成立吗?下面你会找到数据。
这个可视化用红色(顶线)表示 Google Trends 的“趋势”值,用蓝色(底线)表示最大值。在 x 轴上,您将找到日期,在 y 轴上,您将找到值。请注意,y 轴使用对数刻度。关于相关性,两条线似乎遵循类似的模式,包括 28 日和 29 日左右的一个小高峰,随后在 1 月 7 日下降和再次上升。为了将这种关联转换并总结为一个数字,我计算了两个变量之间的皮尔逊相关,得到了 0.7186471 的值,这意味着中高正相关(1 是完全正相关)。所以,从某种意义上说,我的假设是正确的。
然而,尽管联系似乎很好,但我们不能盲目地确认或说这纯粹是由“人们因为地震而谷歌波多黎各”引起的。虽然这看起来确实是正确的,但我们必须记住,这种联系背后可能有其他原因。尽管如此,我个人的观点是这是。
概述
目前,波多黎各岛正在经历几十年来最严重的地震群。在本文中,我们使用美国地质调查局获得的数据分析了这些地震的几个属性,以更好地了解这一事件的行为和模式。通过数据,我们发现了事件的几个统计特性,如平均值和异常值,并发现我们的平均震级为 2.467,最活跃的一天是 2019 年 12 月 31 日。然后,我们进行了时间序列分析,以找出总体趋势和每小时的季节性,并发现一些最强烈的地震发生在夜间。最后,我们用谷歌趋势数据计算了最大震级之间的相关性,并确定了这两者之间可能的联系。
想了解更多关于地震的信息,我推荐美国地质勘探局的这份报告。此外,对于显示震级的互动图,请查看波多黎各大学 Humberto Ortiz-Zuazaga 教授创建的这个网络应用。
感谢阅读。
您可以在下面的资源库中找到这个分析中使用的代码:【https://github.com/juandes/pr-earthquakes-analysis
胡安·德迪奥斯·桑托斯的最新推文(@ jdiossantos)。我喜欢数据,也喜欢写数据。口袋妖怪大师,还有…
twitter.com](https://twitter.com/jdiossantos)
解释模型是人类的事,不是计算机的事
这是关于翻译,而不是重新措辞。
纯粹解释批判
科学方法作为一种工具,帮助我们找到关于事物如何运作和做出决策的解释,也给我们带来了最大的挑战,这种挑战直到 2020 年我们可能仍未克服:给数字提供有用的叙述。又称“解读”。
作为一个澄清的问题,科学方法是寻找证据来证明或否定假说的管道。从自然科学到经济科学,科学和事物如何运作就是一切。但最令人高兴的是,通过证据,不仅我们的意思,但人类理解“数据”。数据不能少于数字。
留有一般性的空间,解释的问题沿着科学方法管道内的统计分析的道路特别有趣。这意味着找到用数学语言编写的模型,并在提供数据的上下文中找到对它们的解释。
解释一个模型有两个重要的含义,这是许多科学家或科学技术人员长期以来忽略的(希望不要忘记)。第一个依赖于这样一个事实,即如果有一个模型来解释现在的*,那么在之前一定有一个研究问题*在环境中提出来,并提供数据来建立这样一个模型。第二个是,我们需要为我们的模型创建的叙述可以通过在研究问题的背景下表达关于一个数字的想法来做得更多,而不是纯粹在模型内部。毕竟,直到 2020 年,决策是由人类根据这些数字的含义做出的,而不是真正由计算机做出的。最后这句话很重要,因为在 21 世纪,我们可能真的会到达这样一个点,计算机在许多任务中接管我们,它们可能最终会为我们做决定。为此,他们需要在他们的网络中交流这些决定。就在那时,人类的叙述将不算数,因为计算机只理解数字。**
作为统计学家,我们一直采用这样的做法:寻找要解决的问题,寻找要回答的问题,并用可用数据解释答案。这种心态让我们在一个无意义的叙述和解释的循环中运行,因为 问题没有被发现或寻找 。不同现象的所有持续互动和反应都会产生问题。这一事实意味着统计模型和/或其他分析方法是用于核心中心问题的工具,而不是支柱。
这种对一些数据进行线性回归拟合并说“当 x 增加一个单位时,β系数是 y 增加的单位数”的丑陋艺术,或者计算平均值并说“这是我们可以找到大多数数据点的值”的艺术,是我们统计学家向科学方法提供的无情产品。
泡沫的解释
统计学教学让我们清楚地知道,人们可以完全理解模型的工作方式,以及如何训练他们来得到数字。然而,我们仍然没有消化的事实是,在训练模型时产生的所有数字中,大多数对于非统计人员来说只是不可传达的。让我们展示一些沟通不畅的数字:
——p 值是一个特殊的概念,事实上它本身可能值得写一整篇文章。例如,在社交媒体上,我们经常看到人们询问对 p 值的解释,马上就有一场统计学家给出他们自己的解释的风暴。
——这场辩论中的胜率明星。在这个领域工作了 10 年之后,我们必须承认,向另一个领域的专家解释如何考虑比值比从来都是不可能的。甚至维基百科也尝试过,在我们看来,不仅仅是失败了。
- 逻辑回归中虚拟变量的*β系数是同类的。我们感觉它们是类别相对于基线类别的比值比。但是,我们如何使它在实践中可以理解和操作呢?这一点我们根本不知道。*
这个问题是科学和统计界的核心问题。由于缺乏解释,我们训练的模型失去了价值。
几年来,我们一直在和同事们讨论这个问题,并寻找一个合适的框架来解决口译的问题,在此之后,我们得出了一个显而易见的结论:口译过程是存在的,而且只能在特定的语境中发生。争取模型内部的解释过程是没有意义的。模型的内部过程都是数字的,这些结果只能由数字统计人员交流和理解。在模型内部对数字做出解释是换句话说的泡沫。为了解释模型的结果,使它们成为采取行动的工具,必须牢记数据来源和研究问题提出的背景。
我们最喜欢的一个清晰描述解释之争的例子是,当解释模型时,当试图解决分类问题时,普遍倾向于逻辑回归而不是神经网络。众所周知,社区说,并发表论文说,当我们需要解释参数时,逻辑回归是好的,如果我们的目的只是预测,神经网络做这项工作。宣称我们更喜欢逻辑回归沉入比值比的湖泊?但这正是想要解释模型中的数字的效果。如果我们的问题包括解决一个分类问题,并且我们想要了解控制变量的影响,那么为这些控制变量设置假设场景并检查结果是或否的决定怎么样呢?我们认为,收入管理公司甚至会为这些假设情景支付比 PowerPoint 幻灯片更多的钱,幻灯片上说贝塔是我们二元问题的赔率。同样,巨大的知识可以从医学和生物学中的假设场景中茁壮成长,而优势比永远不会带给我们。
解释的过程
泡沫破裂
建立使解释成为可能的框架需要精确定义哪些条件涉及到模型中,哪些条件涉及到上下文中。**
在模型建立阶段,我们使用的知识是数字的、统计的和技术的。我们的核心概念和关注点是关于我们用来建立模型的方法的准确性和稳健性。量、参数、数学公式、算法是这个世界的主要组成部分。因此,主要研究人员不需要完全理解这个过程中的每一个组件,因为大多数组件只是保持大型机器运行所需的组件。
另一方面,上下文基本上充满了非统计的技术知识。这个世界的概念被改变了。例如,代表数据的数字被转换为计量单位的。我们不把数据作为数学或计算的表示,我们用米、公斤、秒、人、家等来谈论这个数字。对这些概念的理解是首席研究员的主要能力。就像以前一样,技术统计师可能对上下文中的所有概念都没有深刻的理解,但他们理解赋予两个世界意义的问题的大图景是至关重要的。
也就是说,解释过程就是将模型中的数字与上下文中的概念联系起来。这关系到泡沫的破灭。
如果我们从语言学的角度来考虑这个过程,在语义学中有单义(一个意思)和多义词(多个意思)。还有外延意义(字典的意思)和内涵意义(上下文中的意思)。因此,在语义词中,传统的统计解释过程是关于给一个数字只有一个意义,如统计学教科书中所呈现的那样,这是一种单素的外延方式。我们认为,在不同的语境下赋予一个数字多种含义,即以一种多义的隐含方式,是对非统计人员统计理解的一种提高。
让我们来看看其他大大小小的例子。在财务分析中,一项资产收益的标准差被称为波动率*。术语波动率是金融领域的一个概念,这个数字和概念之间的联系在这个领域之外没有任何意义。电影摄影也是如此,电影标点符号的标准偏差被称为争议。在质量控制和过程改进方面,六适马标准的目标是一百万个产品中有 3.4 个错误。我们发现更多这样的例子,比如经济学中的弹性,市场营销中的满意度,毒理学中的致死剂量等等。正如我们所看到的,这个连接正是一个翻译。这种翻译使得以有意义的方式读取数字成为可能。*
我们甚至不需要将这场辩论缩小到统计和研究界。截至 2020 年,每一个接入互联网的公民都可能在新冠肺炎疫情期间遇到过著名的“曲线”。所有的媒体都在谈论“曲线变平”的目标。嗯,这个“拉平曲线”可能是将模型转换到上下文中最令人愉快的例子。“曲线”正是我们这里所说的“模型”。对此没什么好说的了。这个模型有一个非常具体的数学公式,它将感染病例的数量、有感染风险的病例等联系起来。,随着时间的推移。现在,这个模型中非常具体的数字定义了人口在死亡前承受疾病的能力。不需要花费精力去寻找数字与上下文的联系,因为模型是为这个上下文而创建的。虽然随着更多数据的到来和模型的重新估计,这些数字在负责的统计学家手中发生了变化,但专家们等待着被告知曲线是否变平的那一刻,以便他们向我们传达我们作为公民能做什么和不能做什么。
在这场辩论中,我们可以更接近统计界更熟悉的东西:解释 PCA(主成分分析)。这是以多种不同方式处理数据的方法之一。我们使用 PCA 进行可视化、数据清洗、降维等。这也是学术界和工业界无数研究领域中使用的方法之一。然而,我们问,我们在多大程度上真正利用了这种类型的统计工具的潜力?。让我们考虑社会科学中的一个典型案例,其中研究人员有人口统计和社会变量,为了“理解数据和变量之间的关系”,实施了 PCA。请注意,这里已经有一个框架缺陷,因为“理解数据和变量之间的关系”不是一个研究问题或目标。但是好吧。计算完 PCA 数后,我们要做的事情之一是构建一个分数图,表明每个轴保留的方差百分比。那么,这个方差百分比是什么意思呢?如果说第一个分量保留了数据中 30%的可变性,我们真正得到了什么?实际上没什么。然而,想象我们的变量是薪水和爱好数量*,研究者假设了一个快乐潜在特质。告诉研究人员这些变量的多少信息同时解释了假设的特征怎么样?那将是 30%,所以有 70%的工资和爱好数量说明了一些其他潜在的特质。除此之外,大多数双标图、特征值等在这种情况下可能意义不大。*
从计算机语言到人类叙事
突发后的重建
我们对这一框架的考察使我们得出了一些我们认为是正确的说法。
第一个。不是每个数字都有从模型到上下文的翻译,因为不一定存在一个概念来连接每个数字。例如,这发生在神经网络中,其输出具有容易的解释,但是大多数情况下内层权重没有直接的解释。
第二个。数字和概念之间的联系并不总是很明显。有些数字能比其他数字更直接地找到它们的概念。在经济学中, GDP (特定时期内生产的所有最终商品和服务的市场价值)的概念,根据定义,与一个数字相关联。因此,当从模型(即抽样和估计)计算数字时,这种联系是瞬时的、明显的和尖锐的。另一方面,同样在经济学中,不平等(人口群体之间经济福祉的差异)的概念是一个完全抽象的概念。这里,它在模型中作为 GINI 系数(即洛伦兹曲线上方的区域)的表现并不明显。在第一个例子中,这个概念是一个有单位的数,这个数是对它的估计。在第二个例子中,概念是一个抽象的概念,数字是两条曲线之间的区域。
第三个。解释的目标是了解问题背景的人和将模型作为解决方案的人之间的交流,这种想法也不是很明显。这最后一句话非常有力。最初,你可以认为这个想法没有改变什么,但它确实改变了。解释是不同世界之间的交流行为,这一概念以前从未被最深刻地使用过。我们必须承认,传统的解释范围在于重新表述模型中的数字,用统计术语、数学公式和毫不留情的交流来谈论这些数字。
现在发生了什么
我们承认这种解释方法具有挑战性,但我们希望明确可以采取的行动。
在统计模型作为工具的一些研究领域,定义和构建解释框架是一个基本步骤。发现不同领域中最常用模型的意义不仅可以为非统计研究人员和用户提供更好的可用性,增强他们的分析体验,而且还可以建立和传播更好的统计文化。
为开发这一框架进行研究,以便对模型进行良好的解释实践,这是新兴的培训。一些语义学概念的引入使我们认为有大量的理论有待发展。统计解释是一个语言科学尚未涉及的交流过程。
在学院内外传播消息。讲座,研讨会,会议等需要在统计学院举行。我们需要创造一个环境来提出这个讨论和它的含义。统计学和语言学的学生都必须参与进来,以形成一种准确的统计学交流方法。
SVM 和 XGBoost 模型分析
使用微软的 MimicExplainer 进行回归建模
微软的 InterpretML 旨在扩展机器学习模型的可解释性。换句话说,让那些模型更容易理解,最终便于人类解释。
微软的 Interpret-Community 是这个知识库的扩展,它包含了额外的可解释性技术。
特别是,一个有用的特性是所谓的 **MimicExplainer。**这是一种全局代理模型,允许任何黑盒模型的可解释性。
背景
在本例中,MimicExplainer 用于解释使用 SVM(支持向量机)和 XGBRegressor (XGBoost 用于回归问题)构建的回归模型。
具体来说,这两个模型的用法如下:
- SVM 用于预测使用特定特征的客户的平均日费率,例如他们的原产国、细分市场等。原始调查结果见此处。
- XGBRegressor 用作时间序列回归模型,通过将滞后序列与实际序列进行回归来预测每周取消的数量,即序列滞后高达 t-5 的 5 个滞后序列用作模型中的特征,以预测时间 t 的取消值。原始发现可在此获得。
原始数据来自 Antonio、Almeida 和 Nunes (2019):酒店预订需求数据集。
为了演示 MimicExplainer 如何工作,我们展示了原始模型和结果,并提供了关于 MimicExplainer 如何使这些结果更具可解释性的更多信息。
SVM
为了预测酒店预订的平均每日价格(或客户平均每日支付的价格),构建了一个具有以下特征的 SVM 模型:
- 取消(无论客户是否取消预订)
- 原产国
- 细分市场
- 存款类型
- 客户类型
- 所需的停车位
- 抵达周
该模型被训练如下:
>>> from sklearn.svm import LinearSVR
>>> svm_reg = LinearSVR(epsilon=1.5)
>>> svm_reg.fit(X_train, y_train)LinearSVR(C=1.0, dual=True, epsilon=1.5, fit_intercept=True,
intercept_scaling=1.0, loss='epsilon_insensitive', max_iter=1000, random_state=None, tol=0.0001, verbose=0)>>> predictions = svm_reg.predict(X_val)
>>> predictionsarray([100.75090575, 109.08222631, 79.81544167, ..., 94.50700112,
55.65495607, 65.5248653 ])
当根据测试集验证该模型时,获得了 44.6 的 RMSE(均方根误差),以及 29.5 的 MAE(平均绝对误差)。平均 ADR 为 105,该模型在估计客户 ADR 值时显示了一定程度的预测能力。
下面是我们如何使用 MimicExplainer 来进一步解释这些结果。
from interpret.ext.blackbox import MimicExplainerfrom interpret.ext.glassbox import LinearExplainableModelexplainer = MimicExplainer(svm_reg,
X_train,
LinearExplainableModel)
MimicExplainer 是黑盒模型,而 LinearExplainableModel 被用作这个黑盒模型的全局代理。
请注意,在运行模型时,如果处理高维数据,即列数超过行数的情况,可以设置 augment_data = True 。这允许对初始化样本进行过采样。
但是,假设情况并非如此,即数据集的行数比列数(要素)多得多,则不会调用此功能。
接下来,打印出一个全局解释,其中包括前 K 个特性及其重要性值:
global_explanation = explainer.explain_global(X_val)sorted_global_importance_values = global_explanation.get_ranked_global_values()sorted_global_importance_names = global_explanation.get_ranked_global_names()
dict(zip(sorted_global_importance_names, sorted_global_importance_values))global_explanation.get_feature_importance_dict()
以下是输出:
{3: 8.81513709127725,
7: 4.9616362270740995,
1: 4.959263897550327,
6: 2.593931464493208,
2: 0.9707145503848649,
5: 0.8455564214901589,
4: 0.505321879369921,
0: 0.0}
从上面可以看出,特征号 3 (细分市场) 7 (抵达周)和 1 (预订取消)是影响客户 ADR 的最重要特征。
也就是说,如果我们希望在验证数据中分离出某些观察结果呢?例如,假设我们只想确定选定的几个客户的特征重要性?
这里有一个例子。
根据验证集,为订购 10 到 15 的客户确定重要特性及其值。
local_explanation = explainer.explain_local(X_val[10:15])sorted_local_importance_names = local_explanation.get_ranked_local_names()sorted_local_importance_values = local_explanation.get_ranked_local_values()
以下是已确定的重要特性及其价值:
>>> sorted_local_importance_names[[1, 3, 2, 6, 5, 4, 0, 7], [7, 3, 2, 6, 5, 4, 1, 0], [6, 5, 4, 1, 0, 2, 7, 3], [6, 3, 5, 4, 1, 0, 2, 7], [3, 7, 6, 5, 4, 1, 0, 2]]>>> sorted_local_importance_values[[17.833762274315003, 9.1394041860457, 1.1694515257954607, 0.0, -0.0, -0.0, 0.0, -1.707920714865971], [9.955928069584559, 9.1394041860457, 1.1694515257954607, 0.0, -0.0, -0.0, 0.0, 0.0], [0.0, -0.0, -0.0, 0.0, 0.0, -0.5708037209239748, -11.288939359236048, -13.709106279068548], [19.017733248096473, 9.1394041860457, -0.0, -0.0, 0.0, 0.0, -0.7448292455959183, -5.040448938994693], [9.1394041860457, 6.623399845455836, 0.0, -0.0, -0.0, 0.0, 0.0, -0.9884649801366393]]
这允许客户隔离特性的重要性。例如,功能 1(预订取消)是对客户 10 影响最大的因素,而功能 7(抵达周)是对客户 11 影响最大的因素。
XGBRegressor
如上所述,最初使用 XGBRegressor 模型是为了预测有问题的酒店的每周取消数量。
该模型定义如下:
from xgboost import XGBRegressormodel = XGBRegressor(objective='reg:squarederror', n_estimators=1000)
model.fit(X_train, Y_train)
以下是定义的模型参数:
来源:Jupyter 笔记本输出
从上面我们可以看到,在训练 XGBRegressor 时,有许多模型参数可以修改。但是,在这种情况下,n_estimators 被设置为 1000。这定义了 XGBoost 模型中树的数量。目标设置为‘reg:squarederror’,即平方损失回归,对极值误差的惩罚更重。
验证集的 RMSE 为 50.14,平均相对误差为 38.63,低于验证集的平均值 109。
使用 MimicExplainer,模型结果的可解释性现在可以以与上一个示例类似的方式生成:
from interpret.ext.blackbox import MimicExplainerfrom interpret.ext.glassbox import LinearExplainableModelexplainer = MimicExplainer(model,
X_train,
LinearExplainableModel)
为此,我们可以确定在时间 t 确定每周酒店取消价值时最重要的特征。然而,假设这是一个时间序列,该模型有效地指示了哪个滞后值在预测特定周的取消时最具信息性,例如,在影响时间 t 的取消时,最重要的是 1 周滞后还是 3 周滞后?
global_explanation = explainer.explain_global(X_val)sorted_global_importance_values = global_explanation.get_ranked_global_values()sorted_global_importance_names = global_explanation.get_ranked_global_names()dict(zip(sorted_global_importance_names, sorted_global_importance_values))global_explanation.get_feature_importance_dict()
结果如下:
{3: 10.580821439553645,
2: 7.795196757642633,
1: 4.973377270096975,
4: 2.329894438847138,
0: 1.382442979985477}
从上面可以看出,当预测时间 t 的每周酒店取消时,特征 3 (t-4)的滞后是最重要的。
但是,如果我们希望隔离某些周,该怎么办呢?
采用验证集,让我们将观察值 8 到 13 中的周分离出来(对应于 2017 年,第 13 到 18 周)。
local_explanation = explainer.explain_local(X_val[8:13])sorted_local_importance_names = local_explanation.get_ranked_local_names()sorted_local_importance_values = local_explanation.get_ranked_local_values()
以下是研究结果:
>>> sorted_local_importance_names
[[4, 0, 2, 1, 3], [3, 4, 1, 0, 2], [3, 4, 1, 2, 0], [3, 2, 0, 4, 1], [2, 3, 4, 0, 1]]>>> sorted_local_importance_values
[[1.2079747395122986, 0.655418467841234, -2.068988871651338, -5.677678197831921, -16.414222669030814], [5.880283637250306, 1.524120206263528, 1.157876862894971, -1.807324914948728, -11.282397723111108], [7.472748373413244, 7.056665874410039, 6.562734352772048, 3.8926286204696896, 0.353858053622055], [35.340881256264645, 4.976559073582604, 2.0627004008640695, 1.1289383728244913, -2.3393838658490202], [23.945342003058602, 5.4821674532095725, 1.287011106200106, -0.7518634651816014, -2.975249452893382]]
以这种方式识别跨时间序列的重要性特征可以潜在地产生关于滞后值在预测跨不同周的取消中的重要性的有用见解。例如,我们可以看到,在预测第 13 周的取消时,t-5 的滞后(特征 4)被确定为最重要的特征。
然而,当预测第 18 周的取消时,t-3 的滞后(特征 2)被认为是最重要的。
与使用一刀切的预测模型相反,可解释性可以为特定时间点确定合适的预测方法,反过来又允许在不同时期定制时间序列预测方法。
结论
在这个例子中,我们看到了可解释性如何在分析机器学习输出时产生有价值的见解——当简单地使用黑盒 ML 模型时,这将更加困难。
具体来说,我们已经看到:
- 如何将 MimicExplainer 用作全局代理模型,以允许任何黑盒模型的可解释性
- 在回归问题中使用 MimicExplainer
- 如何解释 MimicExplainer 的结果并衡量特征重要性
非常感谢您的宝贵时间,非常感谢您的任何问题或反馈。以上例子的相关 Jupyter 笔记本可以在这里找到。
免责声明:本文是在“原样”的基础上编写的,没有担保。本文旨在提供数据科学概念的概述,不应被解释为任何形式的专业建议。调查结果是作者的,与上述任何第三方无关。
用于评估图像分割模型的交集(IoU)计算
一个计算 IoU 度量的实际例子,它允许我们评估一个预测的边界框与地面真实框有多相似
在最简单的情况下,分割是将数字图像分成几个片段的过程。使用遮罩 R-CNN 进行实例分割的结果是应用于所需对象的遮罩和围绕该对象的边界框。
在我解决的一个实际任务中,有必要确定谷歌地球照片中的建筑物。这项任务成功地完成了使用掩模 R-CNN 的实例分割。在训练模型之后,有必要评估它的质量以预测建筑物周围的包围盒。我想让读者熟悉我用来评估预测边界框坐标的质量的方法(用代码)。
并集上的交集 (IoU)被认为是测量两个边界框或遮罩之间重叠的良好度量。
图片由 Oleksii Sheremet 用微软 Visio 创建
如果预测完全正确,IoU = 1。IoU 越低,预测结果越差。
图片由 Oleksii Sheremet 使用 Microsoft Visio 创建
所有代码都是在 Google Colab 中实现的。让我们仔细看看。导入库并加载源图像:
import cv2import numpyimport matplotlib.pyplot as pltimg = cv2.imread(“./some_image.jpg”)plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
图像由 Oleksii Sheremet 使用 matplotlib 模块创建
导入库并加载源图像:
# An example of first bounding boxfirst_bb_points = [[250, 210], [440, 210], [440, 390], [250, 390]]stencil = numpy.zeros(img.shape).astype(img.dtype)contours = [numpy.array(first_bb_points)]color = [255, 255, 255]cv2.fillPoly(stencil, contours, color)result1 = cv2.bitwise_and(img, stencil)result1 = cv2.cvtColor(result1, cv2.COLOR_BGR2RGB)plt.imshow(result1)
让我们设置原始边界框的坐标,并用黑色填充边界框外照片的全部内容:
图像由 Oleksii Sheremet 使用 matplotlib 模块创建
作为预测的结果,获得第二边界框的坐标:
# An example of second bounding boxsecond_bb_points = [[280, 190], [438, 190], [438, 390], [280, 390]]stencil = numpy.zeros(img.shape).astype(img.dtype)contours = [numpy.array(second_bb_points)]color = [255, 255, 255]cv2.fillPoly(stencil, contours, color)result2 = cv2.bitwise_and(img, stencil)result2 = cv2.cvtColor(result2, cv2.COLOR_BGR2RGB)plt.imshow(result2)
像上一个例子一样,用黑色填充边界框外的所有内容:
图像由 Oleksii Sheremet 使用 matplotlib 模块创建
通过在边界框外用黑色填充图像,感兴趣区域外的像素不会影响 IoU 计算:
# IoU calculationintersection = numpy.logical_and(result1, result2)union = numpy.logical_or(result1, result2)iou_score = numpy.sum(intersection) / numpy.sum(union)print(‘IoU is %s’ % iou_score)
因此,我们得到以下结果:
IoU is 0.7625239952938262
结论
所提出的方法在实践中运行良好。可以定义图像区域之间的重叠,不一定是矩形的。例如,您可以使用 OpenCV 计算被遮罩对象周围轮廓的坐标。然后,利用这些点和上述方法,可以计算两个掩膜之间的 IoU。
参考文献
让我获得第一份数据科学工作的面试策略
我是如何展示自己得到这份工作的
技术面试的想法让我害怕。一直都是。当我决定将职业从神经科学转向数据科学时,面试是我最害怕的部分。
通过观看我男朋友面试几家科技公司,我对这个过程有了一些了解。所以我知道一点该期待什么,但不确定对数据科学家来说是否会有所不同。
主要是我害怕让自己出丑。尤其是在我尊敬的面试官面前。然而,这种担心被我远程采访的事实稍微减轻了。不知何故,压力似乎稍微小了一些。如果我不得不快速逃离面试,我所要做的就是关上我的笔记本电脑😜
在这个故事中,我将详细介绍我在硅谷面试数据科学职位时使用的策略。我住在澳大利亚阿德莱德的时候接受了这些采访。这个策略是基于我在科技行业认识的人、数据科学家和我作为博士后的经验提出的建议。
最终,我成功地找到了一份我喜欢的工作。如果你打算申请数据科学的工作,我的一些策略也可能对你有用。
我的战略要素:
- 给了自己一个的期限去准备
- 在我认为自己准备好之前,我提前面试了
- 有针对性的工作,我以前的工作经历给了我优势
- 精心挑选我申请的公司
- 通过做调查,我对这些公司了如指掌
- 我试图在面试中表现得风度翩翩,并与面试官建立私人关系
- 在面试中,我尽力表现出一个自信的人。假装直到我成功了!
- 对我的优点和缺点是否诚实坦率
- 尽可能寻求反馈来继续提高我的面试技巧
限期
我给自己 6 个月的时间重新培训成为一名数据科学家。那样的话,如果数据科学不适合我,那我只是浪费了 6 个月的时间。我对浪费 6 个月的时间去找一份技术工作的想法感到很舒服。
有时间限制意味着我不能困在我的舒适区。我知道我必须快速行动,才能在短短 6 个月内找到一份数据科学的工作。所以没有时间自我破坏或拖延。我不得不陷入其中,忽略恐惧。
早点开始
因为我给了自己 6 个月的时间限制,我知道我需要早点开始面试。甚至在我以为我准备好了之前。这对我有一种解脱的效果。
我知道自己会发展得很快,所以我没有选择,直到我对自己的新技能感到满意,才开始申请工作。它给了我前进的动力。我不想妨碍自己。
女性通常会等到具备她们认为需要的所有素质后再去申请工作。我们等到可以勾掉工作添加中描述的每一项。我知道我当然倾向于那样。我给自己的时间限制至少部分是为了确保我不会落入那个陷阱。
所以当我仍然觉得自己是个骗子时,我开始申请数据科学的工作。
我申请的前 10 份工作,我得到的都是没有人情味的拒绝信。这很令人沮丧,但我已经预料到了。然后,我收到了几封为我量身定做的更令人鼓舞的拒绝信。
为收到一封“好”的拒绝信而高兴是一种如此怪异的体验。得到一个有效的理由,至少我知道他们已经足够重视,知道我不太适合他们的职位空缺。
又过了一会儿,我得到了真正的采访。我原以为要花将近整整 6 个月的时间才能得到面试机会,但实际上我只花了 3 个月就得到几份最早的面试机会。在那个阶段,我还在努力完成我最初的一些课程,所以表现不是特别好。
然而,我认为让我为被录用的面试做好准备的部分原因是在不成功的面试中的所有练习。回顾我参加的第一批数据科学面试,我犯了一些非常愚蠢的错误。
例如,在我最早的一些面试中,我犯了一些初学编程的错误,这表明我是多么的不成熟。我还曲解了我第一次带回家的编程作业中的一些数据。好的一面是,我从他们身上学到了东西,并意识到我没有尽可能好地回答问题。如果没有犯那些早期的错误,我可能不会想出正确的方法来处理带回家的作业和数据问题。
所以我认为尽早开始练习是有好处的。这样,当合适的工作来临时,你就可以准备好尽你最大的努力去完成面试。
成为目标
让我很早就成功获得面试机会的部分原因是我在找工作时非常有针对性。我几乎只关注健康科学领域的公司。
我在健康研究领域的专业知识对这类公司来说是一个有价值的补充。我猜教一个神经科学家编码比教一个程序员做脑外科手术更容易😉
我想我以前在神经科学方面的经验让我的申请受到了招聘经理的注意。这可能会让我从竞争相同数据科学职位的其他候选人中脱颖而出。任何能让你在找工作时占得先机的东西都值得利用。
令人欣慰的是,湾区有高度集中的生物技术和医疗保健初创公司。所以我仍然有很多公司可以选择。
寻找合适工作的最有用的工具之一是岩石健康工作委员会。Rock Health 是一家投资数字健康公司的风险投资基金。我会仔细检查他们投资的每一家公司,查看旧金山湾区的职位空缺。
我确信这种策略也适用于其他领域的专业知识。有很多风险基金和天使投资者喜欢投资他们熟悉的领域。这是一个找到已经通过别人尽职调查的公司的好方法。你也知道他们有足够的钱让灯亮着。
有选择性
我创建了一份名单,列出了我能找到的所有正在寻找数据科学家的医疗保健初创公司。我需要缩小我的名单并申请。
我根据我最想为之工作的公司缩小了名单。对我来说,最重要的标准是公司的使命与我的价值观产生共鸣,并且是他们业务的核心。此外,我想和有趣的人一起解决有趣的问题。
这些是我优先考虑的事情。通过寻找让我兴奋的工作,我可以通过求职信和面试向招聘经理表达我的兴奋。如果你真的很热情,听起来会更容易。不需要过度表演。
我更感兴趣的是找到一份让我充满激情的工作,而不是一份尽可能赚钱的工作。
获得信息
在申请这个职位之前,我尽可能彻底地研究了每家公司。
大多数创业公司的网站上都有描述其使命和目标的页面。我认为这是你在决定该公司是否值得申请之前应该考虑的最低要求。即使你不知道他们业务的每一件事,你至少应该知道它的核心是什么。不值得浪费你或招聘委员会的时间去处理大量不明确的电子邮件申请。质量重于数量。
我在 Linkedin 上研究创业公司。我想看看有没有员工是朋友的朋友,因为有时候认识一个人可以帮你打开大门。
对于每一份申请,我都写了量身定制的求职信。没有什么比收到一封普通的拒绝信更糟糕的了。我想对于那些收到大量普通求职信的招聘经理来说也是如此。
在求职信中,我详细说明了我为什么想在那家公司工作。你可能认为你想在那里工作的原因是显而易见的。把事情说清楚总是一个好主意,这样你就不会被误解。
风度翩翩
这可能不言而喻,但我总是试图在求职面试中讨人喜欢。不是因为我想和面试官调情。而是因为让你在面试中遇到的人愿意和你一起出去是个好主意。
每个人一天中的大部分时间都是和同事在一起。在同一个团队工作的人更是如此。所以很明显,你希望面试你的人能接受将来花更多时间和你在一起的想法。他们不想在工作时和混蛋们混在一起。所以我总是努力让自己明白,我是一个很好相处的人。
它也是双向的。我知道我会花很多时间在办公室。所以我想选择一家公司,和我喜欢相处的人在一起。
如果你能在个人层面上与一些面试你的人建立联系,那就更好了。然后希望你会给他们留下深刻的印象,你会留在他们的脑海中。
例如,在一次采访中,我采访了一位曾经做过研究科学家的数据科学家。我们在对研究和可转移到数据科学的技能的感受中找到了共同点。
表现出自信
即使我在面试中并不总是感到自信,我也会努力表现出自信。我不是说我表现得好像对工作的每个方面都有信心,而是说我有自信。自信和自负是有区别的。我试着选择前者。
当你感到紧张时,人们可以看出来,这有时会让他们感到不舒服。面试中我最不想做的事情就是让面试官感到不舒服,哪怕只是出于同情。
通常在技术面试中,通过让候选人在白板上写代码或伪代码来测试编程能力。这是在面试小组面前完成的。我个人很讨厌这种做法,认为这完全是浪费时间。作为一名数据科学家,我从未在白板上当着人们的面编写代码,这是我工作的一部分。如果这不是工作的一部分,你为什么要让人们在面试中去做呢?
因为我是远程面试,所以公司要求我做白板代码测试实际上是不可能的。知道没有白登考的机会,让我多了一点自信。相反,一些公司让我在谷歌文档中进行结对编程,与他们讨论问题,或者完成带回家的编码任务。
我试图描绘自信气氛的另一种方式是问一些聪明的问题。我总是确保通读带回家的编码作业。然后我会提出一系列问题来确保我理解正确。在我看来,问几个问题要比羞于提问然后错误地处理问题好得多。对于面试官来说,像这样的误解可能是一个危险信号,表明你是否适合他们的团队。
诚实
每个人都有局限性。我没有什么不同。所以当我面试的时候,我确保对他们非常诚实。我认为如果你不粉饰你所说的一切,人们会对你的回答更有信心。如果你对自己和技能的描述更加平衡,那么面试官会更倾向于相信你。
例如,我知道我最近才获得数据科学技能。所以如果我被录用,我会成为一名初级数据科学家。我想让我面试的每一家公司都清楚这一点。我喜欢低估和夸大。
我告诉他们,我不一定能立即投入工作,也不一定一开始就富有成效。相反,我是一个非常快的学习者,所以我不会花太多时间来达到速度。在我的几次面试中,这似乎给我留下了很好的印象,招聘经理对我的诚实做出了积极的回应。
寻求反馈
几乎每次面试后,我都会询问对自己表现的反馈。尤其是当面试官给我的带回家作业打分的时候。
当我知道自己在上一次面试中做错了什么时,下次面试就容易得多。我很惊讶每个人都很乐于助人,他们愿意在繁忙的日子里抽出时间给我工作上的反馈。
大多数时候,我已经知道他们要说什么,但确认我的直觉是正确的感觉很好。这样,我知道我正朝着正确的方向前进。
结论
正如我在整个故事中所说的,这些是我在面试我的第一个数据科学职位时想到的策略。我确信还有许多其他的好方法可以提高面试技巧,但这些只是我用过的方法。
显然,它们并不是每次都管用,因为在我最终得到这份工作之前,我至少经历了 4 次不成功的面试。然而,我觉得我从最初的面试中得到了很多重要的知识。这些知识最终帮助我找到了作为数据科学家的第一份工作。
除了数据,我的另一个爱好是绘画。你可以在 www.katemarielewis.com 找到我的野生动物艺术
如果您想了解更多关于我如何或为什么接受再培训成为数据科学家的信息,您可能会喜欢我的一些其他故事:
我用来自学数据科学的 4 个工具没有花一美元
towardsdatascience.com](/how-i-went-from-zero-coding-skills-to-data-scientist-in-6-months-c2207b65f2f3) [## 愤怒退出癌症研究
为什么我从神经科学家变成了数据科学家
towardsdatascience.com](/rage-quitting-cancer-research-5e79cb04801)
面试官最喜欢的问题-你会如何“扩展你的 ML 模型?”
您正在构建一个生产就绪的 ML 模型吗?
来源:作者在 Imgflip 上创建的图片
如果你和我一样,已经疯狂地看完了《鲨鱼池》的所有剧集,那么首先,你好,新的最好的朋友:)其次,更重要的是,你已经知道如何回答这个(棘手的)面试问题了!
凯文·奥利里向任何新企业家提出的最著名的问题之一是——你将如何扩展你的业务?比方说,你被邀请去 Shark Tank(你这只幸运的鸭子)推销你的新餐厅创意,这个问题出现了,他们想知道的是——你有什么计划让这个创意成为功能创意?所以你应该这样解释:
- 当我的餐馆越来越受欢迎时会发生什么?
- 我如何跟上厨房基础设施的发展?
- 我应该找一个杂货批发供应商,还是坚持现在的零售方式?
- 空间呢?我应该继续租赁还是购买房产?
- 我应该招聘更多员工吗?我有预算吗?
- 您需要升级到重型机械来满足批量订单吗?
当凯文向你抛出这个问题时,你应该思考这些问题。
为什么面试官都爱问这个问题?
使用一个类似于鲨鱼池的类比,当面试官问你关于 ML 模型的缩放计划时,他们想知道的是:
当你的 ML 模型大规模投入生产时,你有多擅长认真考虑它?
请注意,从技术公司的角度来看,这非常重要!这是因为在 Jupyter 笔记本上为预测模型编写 Python 代码是一回事,但将它们部署到日常实际应用中则完全是另一回事。让我们看看如何…
作为一名数据科学家,我该如何回答这个问题?
有几个方面是可以关注的。这些在某种程度上与模型建立过程中涉及的三个主要阶段有关,即训练数据的收集、拟合模型和进行预测。
缩放 w.r.t .培训数据
正如一句著名的谚语所说:你的模型的好坏取决于它被训练的基础数据的好坏,通常都是这样。因此,当潜在的数据假设发生变化时,重新训练你的模型是绝对必要的。例如,根据 80 年代的数据训练的招聘模式不会有很多女性担任高级管理职位,因此,这种模式在 21 世纪已经过时(往好里说),而且会对推荐女性担任高级职位产生偏见(往坏里说)。
扩展 w.r.t .数据洪流
不可避免的是,随着业务的增长,您将拥有比开始时多得多的数据。有了这么多数据,您可能需要考虑 并行计算或批处理 (比如使用 SGD 优化)和 并行处理,如交叉验证和超参数调整,以便显著提升性能并有效利用您的计算资源。简而言之,寻找算法的分布式版本!
在重新训练 序列化/酸洗模型时使用检查点也是谨慎的。这将为您节省大量重新训练模型的时间(最初构建时有 100 万行),因为您不必仅仅因为收到了额外的 10k 行就从头开始重新构建它。系统能从你上次离开的地方赶上来。
趣闻: H2o 支持检查点创建 针对 GBM、DRF、XGBoost、深度学习等多个模型。
缩放 w.r.t 框架
当谈到为您的 ML 和深度学习解决方案选择框架时,有几个选项(例如 SkLearn、Pytorch、Keras、Tensorflow、H2o、Theano ),重要的是,您要做出一个从长远来看对您有益的选择。选择可以基于几个因素。
例如,你想要的抽象层次是什么?您希望编写更少的代码行(用于训练、优化和评估)吗?或者您是否愿意编写带有 CUDA 扩展的 C 代码,以便对编码实现有更多的控制?您也可以根据社区支持的好坏、允许第三方集成的难易程度以及是否支持分布式 ML** (即是否允许计算并行化)来比较这些框架。**
归根结底,这是个人的选择,归结为你要创造的解决方案的新颖性。
有趣的事实:尽管 scikit-learn 中的算法非常流行且易于实现,但它们并不是分布式的,但是您仍然可以使用 Spark 和 databrick**来利用 分布式计算来完成某些 ML 任务。
当我们谈到分布式 ML 的主题时,我们必须仔细考虑为我们的 ML 需求选择正确的处理器(CPU、GPU、TPU)。如果您正在处理深度学习,这一点尤其重要,因为它涉及一些重型矩阵乘法。
缩放瓦特功能
随着时间的推移,新的预测因素浮出水面,这是合理的,这些预测因素以前被忽视或认为不重要。(例如,最近人们发现血型可以作为你对冠状病毒免疫水平的有用指标)。当这种情况发生时,确保这些特性的添加不会导致模型过度拟合,并且您也能够见证验证集的改进。
甚至更好的是,实现正则化技术(例如,对回归模型使用 Lasso 或 Ridge,对神经网络使用 Dropouts 和 Batch Normalization)来额外确保你的系数不会取极值,并且模型不会太复杂。
在这一点上,我也会停下来想一想,这 0.0001%的精度提升(来自这些新特性的添加)是否是我所关心的事情。这是因为在某个阶段之后,准确性并不是唯一重要的事情,知道何时停止训练你的模型也很重要。精确度的提高必须证明增加的维护和培训成本是合理的。
缩放实际预测值
随着您的模型变得(或预计会变得)越来越受欢迎,即预测请求的数量不断涌入,是时候考虑您的模型是否能够足够快地生成预测了。也就是说,当心像 SVM、KNN 或 NN(神经网络)这样的缓慢模型,尤其是没有 GPU 支持的模型。
最后,你如何在现实世界中部署你的模型,让每个人都可以使用它,这也取决于几个因素,如批量预测与实时预测,模型的可移植性,有时还有隐私——我相信一个在国防安全领域工作的数据科学家不会对在 Kaggle 上分享他的恐怖分子检测代码(以及权重矩阵)感到太兴奋。
因此,您可以选择将您的模型集成为现有软件的一部分,创建用于部署模型的容器,或者使用像 Kubernets 这样的编排工具来帮助管理容器和集群。
趣闻:查看 这 和 这 牛逼文章学习两种独特的模型部署方式。
结论
总而言之,重点关注:
- 扩展到新数据、新功能
- 序列化和创建检查点
- 选择合适的框架和处理器
- 并行计算—分布式 ML
- 使用后端 API 进行部署,或者在网络上以硬件加速模型的形式发布
下次当你被问及与模型缩放相关的问题时,我希望你能与面试官讨论一些有趣的问题。这还不是一个详尽的列表,可能还有其他与可伸缩性相关的要点。一如既往,我很好奇你是否能想到其中的一些。
直到下次:)
这是我最近开始的 面试问题 系列的第一部分。在 第二部分 中,我们将讨论如何有条理地向面试官解释你的 ML 项目。敬请期待…
在结尾有一个额外的样本脚本,让你谨慎地展示你的技术技能!
medium.com](https://medium.com/@vishi2020/step-by-step-guide-to-explaining-your-ml-project-during-a-data-science-interview-81dfaaa408bf)
数据科学实习面试。如何准备。
第一步:做好基础工作
在 Unsplash 上 Keagan Henman 拍摄的照片
不幸的是,这一次,你的申请没有成功,我们已经任命了一名申请人…
听起来很熟悉,对吧?在我花了这么多时间准备面试后,拒绝接踵而至。虽然我通过了最初的几个面试阶段,但在面对面的阶段,我并不顺利。“我是多么失败啊”,我想。
我开始寻找改进的方法。我已经确定了一些通常被忽视但可能对面试结果产生巨大影响的领域。这反过来又帮助我提高并得到了一份我想要的工作!
掌握基本知识
DS 实习通常竞争激烈,招聘人员的任何危险信号都可能决定你是否会被直接拒绝。其中一个危险信号是你的基础是否足够好。数据科学是一个需要你有很好的数学和编程知识的领域。
怎么才能提高?对于数据科学理论,我建议对最常见的算法有很好的数学理解。我平时推荐的书有两本: 模式识别与机器学习 和机器学习 第一课 。它们都包含对机器学习算法的深入数学解释,这些解释将帮助您将 DS 面试问题粉碎!
根据公司的不同,你可能还会被问到编程方面的问题。它们通常没有那么难,但是考虑到压力和时间限制,你真的需要掌握它们。你应该预料到从排序、递归到数据结构的所有问题。尽早开始练习这些题是有好处的。为了更好地理解如何处理编码问题,我推荐阅读《破解编码面试 的书 。要获得更多实践经验,请访问 黑客排行榜 ,或 LeetCode 。
玻璃门是你最好的朋友
你也可以从 Glassdoor 的评论中感受到这家公司的文化和氛围。这可以给你一个很好的提示,说明这家公司是否适合你。举例来说,如果一家公司的氛围看起来真的很糟糕,那么撤回申请,花更多时间准备其他公司的面试可能会更好?去那些你并不真正想去的公司面试有什么意义呢?
你也可以找到一些关于面试结构或者他们问的问题类型的有用信息。有些公司每次都在问相同的系列问题!我不知道他们为什么这样做,但是在这种情况下,你应该注意到这些问题在 Glassdoor 评论中被重复了。你可以利用这一点,把它们背下来。
简单的面试问题并不容易
Jules Bss 在 Unsplash 上拍摄的照片
想象一种情况,当面试官问:线性回归是什么?
你可以回答:
它是一种线性方法,对因变量和自变量之间的数据关系进行建模。
或者:
它是一种线性方法,对因变量和自变量之间的数据关系进行建模。该模型的参数可以使用普通的最小二乘法导出,并且通用方程适用于多维数据。这是一种简单、快速且可解释的算法。但是,它有某些警告,例如…
你明白我的意思吗?通过问一个看起来简单的问题,面试官可以测试两件事。首先,如果你有一个基本的知识(显而易见)。其次,它测试你的理解深度和你在研究某个话题时的好奇心。这种能力在数据科学家的技能组合中至关重要,因为您将经常需要使用新工具和阅读研究论文。如果你没有彻底分析这个主题,没有理解它的局限性和能力,这是一条通向失败项目的直路。
展示项目。质量还是数量?
TLDR;质量!
好的高质量的展示项目能给你的面试官留下深刻印象。【来源】
令人痛苦的事实是,没有人关心你为 100 多个迷你项目创建的无尽的 Jupyter 笔记本。不要误解我的意思:这仍然是试验新模型和数据的好方法。但是,最有可能的是,它不会给面试官留下深刻印象。
数据科学不仅仅是在一个文件中创建几十个未经测试的机器学习模型。在现实场景中,代码需要使用内部服务器或云服务进行测试、打包、记录和部署。
我的建议?追求质量并致力于创造 3 个更大的项目,给面试官留下深刻印象*。这里有一些你可以遵循的建议:*
- 找到一个需要大量预处理和 EDA 的真实数据集
- 使您的代码模块化:为模型、数据预处理和端到端管道创建单独的类
- 在开发打包代码时,使用测试驱动开发(TDD)
- 使用 Git 和持续集成服务,如 CircleCI
- 向用户公开模型的 API,例如 Python 的 Flask
- 使用 Sphinx 记录代码,并遵循代码样式指南(例如 PEP-8 用于 Python)
Udemy 的 Babylon Health 和 Train In Data 的数据科学家创建了一个非常好的 ML 模型部署课程。你可以在这里找到它。
奖励:简历模板
我非常喜欢数据科学实习的单页简历。它帮助我保持简单明了,没有多余的信息。我以前有一个 Word 模板,但是我花了很多时间去修改它。当我删除或添加一些信息的时候,格式立刻被吹走了,让我的简历看起来像一个谜😆
无论如何,我找到了一个好看的背页简历模板,我一直在用。它简单、清晰,最重要的是,它是用模块化的 Latex 代码呈现的,这使得格式化成为一项轻松的任务。简历模板的链接在这里。
关于我
我是阿姆斯特丹大学的人工智能硕士学生。在我的业余时间,你可以发现我摆弄数据或者调试我的深度学习模型(我发誓这很有效!).我也喜欢徒步旅行:)
如果你想了解我的最新文章和其他有用的内容,以下是我的社交媒体资料:
OpenAI 采访 1.5 亿 GPT-2 模型
GPT 新协议对数据科学有什么看法?
https://medium . com/synced review/open ai-releases-1-50 亿-parameter-GPT-2-model-c 34 e 97 da 56 c 0
人类书写的内容
使用 1558MB 版本的 OpenAI 的 GPT-2 模型(最大版本)和 Max Woolf 在 github 上的 gpt2-simple package ,由 Google colaboratory 提供支持,我生成了以下文本,其中包含数据科学方面的提示。这个项目的 github repo 位于这里。所有用粗体表示的文字都是人类书写的。向下滚动,查看关于这项技术含义的元分析,以及更多关于我如何创建这项技术的内容。
GPT 新协议生成的内容
数据科学是一套对大型数据集进行复杂多维分析的技术。数据科学是一个广阔的领域,包括从数学和统计学到计算机科学和机器学习的各种学科。
在不久的将来,人工智能将会变得非常强大,它将能够在几乎任何任务上超越人类,这将对社会产生深远的影响。但是影响不会好。这将意味着人类对自己生活的控制越来越少。
机器学习是训练计算机理解和预测数据的过程。流行的 Python 编程语言的最新版本现在包括一个可用于训练神经网络的库。该技术可用于训练神经网络,根据输入数据预测一个人的性别。
学习如何编码是学习写软件的一个很好的方法。然而,有很多人不会编码,或者不擅长编码。我认为人们不学习如何编码的最大原因是他们认为他们不会。我听到很多人说,他们不认为他们可以学习编码,因为他们没有计算机科学学位。这只是一个巨大的误解。
神经网络能够从它们的经验中学习,并从中归纳,以改进它们之前的行为。然而,神经网络的问题是,它们不太适合需要持续学习的任务。问题是,神经网络无法从它们的经验中学习,并从中归纳以改进它们以前的行为。这是因为神经网络不能够记住过去。
谷歌的安卓软件,驱动着全球超过三分之一的智能手机,也是这个星球上最受欢迎的操作系统,在全球拥有超过 7 亿用户。该报告发现,全球大多数 Android 用户都是通过智能手机访问该软件的,其中 80%的用户是通过智能手机访问该软件的。在欧洲,Android 是最受欢迎的操作系统,超过三分之一的欧洲智能手机用户通过智能手机访问该软件。
OpenAI 最初的目标是开发一种通用的人工智能,可以解决自动驾驶汽车、机器人和医疗保健领域的问题。该公司的目标已经演变成一个更普遍的目标:让人们更容易构建人工智能系统。
谷歌旗下 DeepMind 人工智能项目背后的公司 OpenAI 发布了一份白皮书,概述了其对人工智能未来的愿景。这篇题为“人工智能未来的初级读本”的论文由蒙特利尔大学教授 Yann LeCun 和该公司人工智能实验室的研究员 Shane Legg 共同撰写。
深度学习 (ML)是机器学习极其重要的工具。它是算法背后的技术,允许我们识别和理解图像、视频和文本。这个世界充满了数据,这些数据以一种易于识别模式的方式进行组织。该数据可以是任意大小。最常见的例子是文本,一个句子可能是这样构成的:“我看见一条蛇”
人类书写的内容
生成文本分析和模型训练
1558MB 版本的 GPT-2 能够为各种提示生成连贯的文本。有趣的是,它能够相当准确地描述神经网络、深度学习、机器学习和数据科学。然而,这些语言模型仍然缺乏世界的内在模型。例如,它生成(ML)作为深度学习的不正确缩写;它认为 OpenAI 创立了 DeepMind,尽管也称其为“谷歌所有”;目前还没有题为“人工智能未来入门”的论文,Yann Lecun 是 NYU 大学的教授,不是蒙特利尔大学的教授。显然,GPT-2 能够学习短语之间的频繁配对,但实际上并没有一个清晰的世界关系模型。
通过人工审查来检测合成生成的文本是非常耗时的。拥抱脸,一个 NLP 研究初创公司,已经开源了一个 GPT-2 输出检测器,它在上面生成的文本上表现非常好,以超过 99%的置信度将上面生成的文本分类为“假”GPT-2 生成的文本。有趣的是,即使有人对文本进行轻微的修饰,检测器也相当不错,这表明这种检测器甚至可以检测出“编辑过的”虚假文本。这种“深度造假检测器”的开发为抵御虚假书面文献的潜在泛滥提供了一个小小的壁垒,尽管人们可以想象已经有研究人员在开发更难以检测的生成模型。
当我第一次着手这个项目时,我实际上试图首先在一个具有数据科学相关标签的中型文章数据集上微调 355MB GPT-2 模型,但事实证明,微调后的 355MB 模型实际上比未微调的 1558MB 模型表现更差(你可以在这里找到我的 github repo)。这可能是由于对更大模型的更好的语言理解以及它合成长期连贯文本的能力。不幸的是,由于 RAM 的限制,在单个 GPU 上微调 1558MB 的模型是不可行的,尽管一些有趣的未来工作可以微调大型模型的蒸馏版本,这些模型可以适合单个 GPU[ arxiv , medium post , github ]。令人惊讶的是,1558MB 版本仍然相当“了解”数据科学和机器学习,没有对特定领域的数据集进行微调。
含义
Max Woolf 的 gpt2-simple github 包允许用户旋转单个谷歌合作实验室笔记本,加载各种大小的 GPT-2 模型,在谷歌合作实验室提供的免费 GPU 上对其进行微调,并生成合成文本段落,只需几行简短的代码。这种高级软件的存在和任何用户都可以轻松使用的事实是由于深度学习中两个强大趋势的融合:轻松、廉价地访问专门的硬件和高级抽象编程范式。
谷歌联合实验室为谷歌联合实验室笔记本的任何实例提供免费的 NVIDIA T40 或 K80 GPU。谷歌这样做的财务动机是鼓励用户采用自己专有的谷歌合作笔记本,而不是开源软件 jupyter notebook。由于云计算的可扩展性(以及谷歌的雄厚财力),提供如此多硬件的低成本是可能的。因此,任何有互联网连接的人现在都可以使用基于服务器的高端 GPU,并通过谷歌联合实验室获得相当大的计算能力。这种免费提供的计算机使任何个人都能够训练和利用非常大和强大的深度学习模型。
除了廉价计算,深度学习创新的另一个核心驱动因素是引入高级编程范式和用于创建深度学习模型的包。例如, keras 是一个高级包,它是用于较低级别的神经网络实现包(如 Tensorflow 和 Pytorch)的 API。使用 keras,任何人都可以轻松地用几行代码创建简单的神经网络。这种软件降低了任何人使用这种工具的门槛,有助于加速研究和创新。类似地,gpt2-simple 通过使用标准化的 NLP 微调过程抽象掉了所有的模型训练,并为生成文本提供了良好的包装函数。
这两种趋势的融合,以及最近 NLP 架构和性能的惊人改进,现在允许任何人合成类似人类的文本。OpenAI[ 1 、 2 、 3 已经讨论了这种模型架构的含义。
人们可以很容易地想象,像 GPT-2 这样的文本生成模型有一天将能够编写关于数据科学、编程、机器学习等的全媒体文章。到那时,我们将不得不面对一些棘手的问题。比如谁有署名权?实现和运行代码的程序员?创建模型的作者是谁?微调语料库中文本的集体作者?
随着诸如 GPT-2 这样的现实文本生成模型变得越来越普遍(特别是随着高级软件实现的进展),我们将会看到越来越多的在特定领域数据集上训练的微调 NLP 模型的例子。尽管较大的、未微调的 1558MB GPT-2 版本比较小的、微调的 355MB GPT-2 版本性能更好,但人们可以想象具有更具体的文本的域,并且不同于 GPT-2 在其上训练的大型语料库,例如化学科学文摘
我的外卖
对我来说,我在寒假期间开始了这个项目,以了解更多关于被称为 NLP 年的这些令人兴奋的突破,以及熟悉 NLP 模型的软件环境,最著名的是拥抱脸的变形金刚包。我有一些在我创建的文本语料库上微调 GPT-2 的实践经验,在单个 GPU 上处理 RAM 问题,并探索知识提炼方法。如果你想自己尝试一下,可以看看我的回购或者马克斯·伍尔夫的伟大的入门博客。一如既往,负责任地使用和分享。
我最近开始了一个关于机器学习和人工智能在科学领域和工程问题中的应用的免费通讯(ml4sci)。你可以在 ml4sci.substack.com 的上找到。请随意发表建议的文章或主题,如果你真的喜欢你所看到的,请订阅!
采访中型数据科学团队
苹果 | 谷歌 | SPOTIFY | 其他 | 剪辑
媒体数据科学团队在 TDS 播客
编者按:迈向数据科学播客的“攀登数据科学阶梯”系列由 Jeremie Harris 主持。Jeremie 帮助运营一家名为sharpes minds的数据科学导师初创公司。可以听下面的播客:
收入意外下降,管理层将数据科学团队拉到一个房间。这个团队被下达了行军命令:“你的工作,”他们被告知,“就是找出我们的采购订单到底是怎么回事。”
当然,这是一个非常开放的问题,因为收入和注册人数可能会因为任何原因而下降。价格可能已经上涨。新的用户界面可能会让潜在客户感到困惑。可能必须考虑季节性影响。问题的根源可能是,嗯,任何东西。
这通常是数据科学家们发现自己所处的位置:他们不是有一个清晰的 A/B 测试来分析,而是经常梳理用户漏斗,以确保每个阶段都按预期工作。
需要一个非常注重细节和商业头脑的团队来完成范围如此广泛的调查,但这正是 Medium 所拥有的:一群专注于产品的数据科学家,他们致力于调查异常情况,并识别隐藏在大量用户数据中的增长机会。他们很友好地和我聊天,并在本期“走向数据科学”播客中讨论了数据科学是如何传播的。
以下是我最喜欢的对话内容:
- 数据科学家和分析师需要深入了解他们工作的业务,以及他们服务的用户。如果你深刻理解用户如何与你的产品互动,你可以分解他们的使用模式,以确定你应该跟踪的关键指标,以提高公司的底线(例如,“读者通常会通过谷歌找到他们的第一篇媒体文章,但平均来说,他们会在最终决定创建帐户之前阅读 3 篇……”)。没有深入的用户同理心,你基本上是盲目的,猜测你应该测量和改进什么来移动指针。
- Medium 的分析团队主要使用逻辑回归模型来分析用户行为。他们更喜欢远离花哨的神经网络和堆叠集成模型,因为可解释性非常重要:他们不仅需要了解他们的模型预测用户会做什么,还要了解他们为什么做出这些预测。产品和业务改进的想法隐藏在“为什么”中。
- 理解你的商业模式和用户需求绝对是至关重要的。如果你只在用户做 X 的时候赚钱,而你不了解你的用户在做 X 的过程中面临的障碍(例如,被注册表格弄糊涂,被高价拒之门外,没有找到足够多他们觉得有吸引力的文章),你就没有办法对业务或产品改进提出可行的建议。
- 这样做的一个重要后果是,如果你想找一份数据科学家的工作,你需要向雇主证明,你有能力理解商业模式,并对现实世界的数据进行调查,这些调查可能会带来可操作的见解。因此,不要只是从 Kaggle 竞赛中抓取一些开源数据集或数据:收集你自己的数据,并围绕从中得出有趣的见解来构建你的项目。
关注拉奎尔( Twitter 、 LinkedIn )、阿什和克里斯汀,或者在 Twitter 这里关注我。
夹子
我们正在寻找能与我们的观众分享有价值的东西的客人。如果你碰巧知道谁是合适的人选,请在这里告诉我们:publication@towardsdatascience.com。
一种使用数据分析法对 NBA 球员进行分类的新方法
因为 5 个传统职位已经不够了
来源:https://unsplash.com/photos/UegcSdRtmlg
大约 5 个月前,我在网上偶然发现了这篇的文章。总结:传统的 5 个位置已经不足以描述 NBA 球员了。游戏毕竟变了。作者提出了一种方法,根据玩家玩游戏的方式将他们分为 9 类。
在这篇文章中,我将根据球员在球场上的表现,对他们进行分类。但是,我将使用数据科学,更准确地说是 K-Means 聚类来做这件事。
我还将深入探讨是什么造就了一支胜利的球队,也就是说,什么类型的球员应该被组合在一起才能成为一支成功的球队。
我们开始吧!
准备数据
我从直接从 NBA.com 获取数据开始。总之,我收集了 2019-2020 年联盟中所有 529 名球员的 28 项统计数据。
以及传统的统计数据(场均得分、助攻、篮板等。),我还收集了描述投篮位置,进攻类型(驱动,iso 等)的统计数据。)防守效率和使用率。
然后,我决定淘汰每场比赛上场时间少于 12 分钟的球员,因为我觉得根据他们几乎不上场时的表现来对球员进行分类不会提供准确的结果。
**#Remove players with at less than 12min per game** df=df[df.MINUTES > 12]
df = df.reset_index(drop=True)
我们总共有 412 名玩家。
特征创建
我决定创造 3 个新的变量,描述一个球员的投篮命中率来自于球场的哪个位置(内线、中距离或三分线)。
**#Get total FG attempts** shot_attempts=df.filter(regex='FGA').sum(axis=1)**#Get new variables** df['CLOSE']=df['PAINT_FGA']/shot_attempts
df['MID_RANGE']=df['MR_FGA']/shot_attempts
df['PERIMETER']=shots_perimeter/shot_attempts
这里是最终使用的数据帧的快照,总共包含 31 列和 412 行。
df.head()
玩家聚类
让我们从缩放数据开始。缩放意味着在不改变分布的情况下改变值的范围。这很有用,因为当要素处于相同比例时,机器学习算法会工作得更好。
以下是如何缩放数据。
data = df.iloc[:,5:34]
scaled_data = StandardScaler().fit_transform(data)
然后,是时候找出最佳的聚类数了。为了做到这一点,我将使用轮廓得分,这是可用的使用scikit-learn
。
轮廓分数是一种度量聚类质量的指标。它的范围在 1 到-1 之间,分数为 1 意味着集群彼此相距很远,并且明显不同(这正是我们想要的)。
简而言之,我们想要最高的侧影分数。
以下循环计算 6 到 12 之间每个 k 的轮廓分数。我在 6 点开始循环,因为在 5 点,它基本上按位置分类球员。
**#Find best number of clusters** sil = []
kmax = 12
my_range=range(5,kmax+1)for i in my_range:
kmeans = KMeans(n_clusters = i).fit(scaled_data)
labels = kmeans.labels_
sil.append(silhouette_score(scaled_data, labels, metric =
'correlation'))
这是分数图。
**#Plot it** plt.plot(my_range, sil, 'bx-')
plt.xlabel('k')
plt.ylabel('Silhouette Score')
plt.title('Silhouette Score by K')
plt.show()
作者图片
我们看到,我们应该使用总共 7 个集群来根据 NBA 球员打球的方式对他们进行分类。
让我们看看那些集群。
看到这里,我想到了下面的集群名称。
- 拉伸选手。优秀的球员,主要是为了拓展球场。高效的三分射手。像丹尼·格伦、豪斯、雷迪克这样的球员。
- 高使用率 bigs 。大个子球员,伟大的篮板手,从低位得分。像武切维奇,约基奇,恩比德这样的球员。
- 使用率低的 Bigs 。通常大中心通常不会开始。没有真正参与进攻。像祖巴克,比永博,麦基这样的球员。
- 球优势得分手。投篮次数多的球员可以从任何地方得分。优秀的组织者和控球者。主要明星。像哈登、米切尔、勒布朗(又名山羊)这样的球员。
- 全能轮换球员。高效但使用率低的播放器,通常较小。像卡鲁索,德拉维多瓦,康诺顿这样的球员。
- 优质投稿人。优秀的球员,二级控球手。典型的三分射手,全能球员。像托拜厄斯·哈里斯,米德尔顿,布莱索这样的人。
- 竞技前锋。喜欢突破或者低位进攻的球员,不是优秀的射手。像阿隆·戈登、德里克·琼斯、贾巴里·帕克这样的球员。
那么好的团队是由什么组成的呢?
记住所有这些,看看今年好的队伍是如何组成的会很有趣。
对于这个练习,我认为好的球队是今年季后赛的最后 8 支球队。下面的代码使用 Plotly 将团队分开并创建一个雷达图。
作者图片
这张雷达图显示了一些有趣的事情。首先,我们看到糟糕的球队在“运动前锋”群体中有更多的球员(每队 3.1 比 1.9)。这种类型的球员似乎不能帮助创造一个竞争者。
好的球队也倾向于有更多的 strech 球员(每队 3 对 2.1)。这并不奇怪。拥有属于“球优势得分手”群体的球员是等式的一部分(这显然非常重要)。在他们周围安排优秀的射手来扩展防守也是至关重要的。
结论
在 NBA 赢的方法不止一种。然而,在你的明星球员周围放置合适的棋子是至关重要的一部分。希望这篇文章能让你对此有所了解。
非常感谢你的阅读!
有趣的智商测试来测量人工智能的智力
衡量人类理解任何智力任务的能力。
人工智能的长期目标之一是开发抽象推理能力等同于或优于人类的机器。虽然在神经网络的推理和学习方面也取得了实质性的进展,但这些模型在多大程度上表现出类似于一般抽象推理的能力仍是许多争论的主题。
神经网络完善了识别图像中的猫并将其从一种语言翻译成另一种语言的技术。那是智力还是他们只是擅长记忆?我们如何衡量神经网络的智能?
一些研究人员一直在开发评估神经网络智能的方法。它没有使用均方误差或熵损失。但是他们给神经网络一个智商测试,高中数学问题,和理解问题。
模式匹配
一个人的抽象推理能力可以通过心理学家约翰·瑞文在 1936 年开发的视觉智商测试来评估:T4 瑞文渐进矩阵(RPMs)。RPMs 背后的前提很简单:人们必须对感知上明显的视觉特征(如形状位置或线条颜色)之间的关系进行推理,并选择一幅图像来完成矩阵。
瑞文渐进矩阵测试中的智商测试项目。给定八种模式,受试者必须识别缺失的第九种模式。【来源:维基百科
由于人工智能的目标之一是开发与人类具有类似抽象推理能力的机器,Deepmind 的研究人员提出了一种针对人工智能的智商测试,旨在探索他们的抽象视觉推理能力。为了在这个挑战中取得成功,模型必须能够很好地概括每个问题。
2 个关于 1)等差数列和 2)异或关系的瑞文式渐进矩阵问题。“A”是两者的正确选择。【来源论文
在这项研究中,他们比较了几种标准深度神经网络的性能,并提出了两种模型,其中包括专门为抽象推理设计的模块:
- 标准 CNN-MLP:(带批量归一化和 ReLU 的四层卷积神经网络)
- ResNet-50:如何等(2016) 所述
- LSTM: 4 层 CNN 其次是 LSTM
- 野生关系网络(WReN):使用为关系推理设计的关系网络来选择和评估答案
- wild-ResNet:ResNet 的变体,旨在为每个答案提供分数
- 上下文无关 ResNet: ResNet-50 模型,具有八个多项选择面板作为输入,不考虑上下文
智商测试题挑战性不够;因此,他们添加了各种形状、不同粗细的线条和颜色,以分散注意力。
各种形状、线条粗细和颜色增加了令人分心的东西。【来源论文
表现最好的型号是鹪鹩型号!这是因为关系网络模块是为推理对象之间的关系而专门设计的。排除干扰后,鹪鹩模型的表现明显更好,为 78.3%,而有干扰时为 62.6%。
左:所有型号的性能。右图:WReN 模型在不同泛化机制下的泛化性能。【来源论文
数学推理
数学推理是人类智能的核心能力之一。数学提出了一些独特的挑战,因为人类主要不是基于经验理解和解决数学问题。数学推理也基于推断、学习和遵循符号操作规则的能力。
研究人员 Deepmind 发布了一个由 200 万道数学问题组成的数据集。这些问题是为测量数学推理的神经网络设计的。每个问题的长度不超过 160 个字符,回答不超过 30 个字符。这些主题包括:
- 代数(线性方程、多项式根、序列)
- 算术(成对运算和混合表达式,surds)
- 微积分(微分)
- 比较(最接近的数字、成对比较、排序)
- 测量(转换,使用时间)
- 数字(基数转换、余数、公约数和倍数、素性、位值、舍入数字)
- 多项式(加法、简化、合成、求值、扩展)
- 概率(无替换抽样)
数据集中的示例问题。【来源论文
数据集带有两组测试:
- 插值(正常难度):一组多样化的题型
- 外推(疯狂模式):难度超过训练数据集时看到的难度,问题涉及更大的数字、更多的数字、更多的成分和更大的样本
在他们的研究中,他们调查了一个简单的 LSTM 模型、注意力 LSTM 和变压器。注意力 LSTM 和变压器架构用编码器解析问题,解码器将一次一个字符地产生预测的答案。
注意力 LSTM 和变压器架构用编码器解析问题,解码器将一次一个字符地产生预测的答案。【来源论文
他们还用关系内存核心取代了 LSTM,关系内存核心由多个通过注意力交互的内存插槽组成。理论上,这些内存插槽似乎对数学推理很有用,因为模型可以学习使用插槽来存储数学实体。
模型预测正确答案的准确性。【来源论文
这是他们的发现:
- 关系内存核心对性能没有帮助。他们推断,也许学习使用插槽来操作数学实体是有挑战性的。
- 单纯 LSTM 和注意力 LSTM 都有相似的表现。也许注意力模块没有学会从算法上分析问题。
- Transformer 优于其他模型,因为它可能更类似于人类解决数学问题的顺序推理。
语言理解
近年来,许多自然语言处理方法都取得了显著进展,如 ELMo 、 OpenAI GPT 和 BERT 。
研究人员在 2019 年推出了通用语言理解评估(GLUE) 基准,旨在评估模型在九项英语句子理解任务中的表现,如问答、情感分析和文本蕴涵。这些问题涵盖了广泛的领域(类型)和困难。
任务的描述和统计。【来源论文
在人类表现为 1.0 的情况下,这些是每个语言模型的粘合分数。就在胶水问世的同一年,研究人员开发出了超越人类表现的方法。对于神经网络来说,胶水似乎太容易了;因此,这个基准不再适用。
粘合各种型号的基准性能。【来源论文
强力胶作为一种新的基准被引入,旨在提出一种更严格的语言理解测试。SuperGLUE 的动机和 GLUE 一样,都是为了提供一种难以用游戏来衡量的英语通用语言理解技术的进步。
强力胶任务的问题。【来源论文
研究人员评估了基于 BERT 的模型,发现它们仍然落后人类近 20 个百分点。鉴于强力胶的困难,在多任务、转移和无监督/自我监督学习技术方面的进一步进展将是必要的,以在基准上接近人类水平的性能。
让我们看看机器学习模型再次超越人类能力需要多长时间,这样就必须开发新的测试。
机器学习 AWS 简介
使用 AWS 机器学习工作台加速 Jupyter 笔记本和 Gridsearches。
机器学习工作台—网络立方体
使用 scikit-learn 和 tensor-flow 创建强大的算法并不容易,然而,适当地调整它们需要时间;几乎所有的模型都有数千种不同的参数组合。此外,改进模型的一个好的经验法则是增加用于训练的数据量-预测值或观察值。因此,即使你有最新的 MacBook Pro,你也会很快发现自己在查看参数化网格搜索,这可能需要几个小时,甚至几天。幸运的是,将所有的处理外包给俄亥俄州某处 AWS 仓库的计算机是很简单的!
开始使用 AWS
第一步是建立一个 AWS 帐户,并将您的密钥文件下载到您计算机上的一个安全位置。建立一个 AWS 账户很简单,然而,如果你遇到困难,这里有一个很好的设置视频。请记住,即使您注册了 12 个月的免费试用,您也需要提供信用卡的详细信息,因为并非所有信息都包含在试用中。
成本:在我最近的项目中,我使用了一个中等规模的实例进行了多天的处理,总费用大约为 4 美元。您可以在不使用实例时将其关闭,每小时的成本非常低。成本完全取决于您租用的实例的能力,从 2 核 2gb 内存的实例每小时约 5 美分到 96 核 768gb 内存的巨型超级计算机每小时约 30 美元不等。如果你想估算成本,只需去机器学习工作台页面的底部。
图片由 Elias Sch 提供。来自 Pixabay
打开机器学习工作台
一旦您的 AWS 帐户启动并运行,您就可以开始使用了。机器学习工作台只是一个 EC2 实例,已经配置了 Jupyter、Jupyter Notebooks、Scikit-learn、Tensorflow 和许多标准 python 包,如 pandas 和 matplotlib。为了设置好它,请按照这个机器学习工作簿链接。
在那里,按照步骤继续订阅,接受条款,继续配置,然后继续启动。它为您提供了支付一年订阅费的选项,但是您现在可以忽略这一点,如果您坚持下去,它将允许您简单地按小时租用实例。一旦进入“启动该软件”屏幕,我发现通过 EC2 设置实例更简单,所以选择下面的选项。
从这里开始,您可以选择您需要的计算能力。在此阶段,您可以选择许多其他配置,但最简单的是直接单击右下角的“查看并启动”,然后再次单击“启动”。此时,它会询问您希望使用哪个密钥对来设置这个实例。为了能够从命令行远程访问 EC2 实例,这是必需的。如果您已经有一个用于 AWS 的密钥对,请使用它,否则创建一个新的密钥对。
一旦您下载了新的密钥对,它将允许您单击“启动实例”。您现在已经创建了 EC2 机器学习实例,它将开始在后台配置自己!
跟踪实例设置的最简单方法是直接单击实例 id。然而,如果您导航离开该页面,您总是可以通过返回到您的 EC2 实例屏幕来返回到该页面。如果您在启动 EC2 实例后返回到 EC2 实例,并且在那里没有看到您的实例,请仔细检查您是否在正确的区域,您可能在不同的区域设置了您的工作台。您可以在 EC2 屏幕的右上角找到所有区域。
一旦实例在实例状态中亮起绿灯,就可以打开实例了。最简单的方法是直接从浏览器。为此,在新的浏览器选项卡中,只需键入’ https://IPv4 Public IP '并按 enter 键,其中 IPv4 Public IP 是下面带下划线的公共 IP 号。如果你停留在数字的右边,你可以点击图标进行复制。一旦你导航到这个 IP 地址,你可能会从你的浏览器得到一个警告,让你知道这个连接不是私人的。根据您使用的浏览器,按照高级选项忽略错误并继续您的实例。如果您很难通过,请尝试其他浏览器,因为它们可能有不同的安全设置。
一旦你完成,它应该带你到这个登录屏幕。登录密码是上面突出显示的实例 ID。你可以直接连接到虚拟桌面或直接进入 Jupyter 笔记本开始训练你的模型。第一次登录应该需要一分钟左右的时间,但是之后你就可以开始 jupyter 笔记本会话了!
常见问题—安全组
如果你没有任何问题,跳过这一点!但是,如果您正在努力连接到 IP 地址,并且它一直超时,很可能是 EC2 实例的安全组没有自动正确设置。这很容易解决,只需遵循以下步骤。
- 回到主 EC2 实例屏幕,在那里你可以看到你的实例滚动,直到你看到列标题“安全组”。单击已分配给实例的任何安全组的链接。
- 这将把您带到一个允许您编辑安全设置的页面。为了实现这一点,您需要编辑您的入站规则,以包括 HTTPS,并为源是 0.0.0.0/0(这意味着任何 IP 地址)。参见下面的例子。
- 更改后,您可以返回到浏览器中的 IP 地址,它应该会停止超时。如果您遇到任何与此相关的问题,请随时评论或让我知道。
加载数据和笔记本
将数据加载到实例中最简单的方法是使用方便的 upload 按钮,如下所示。这允许您快速、轻松地将数据从笔记本电脑直接上传到远程实例。一旦你的数据和笔记本上传,打开笔记本,开始运行代码!
但是应该注意的是,如果你需要上传非常大的文件,这种上传方式会很昂贵并且很慢。或者文件可能不在你的电脑上,而是安全地存储在 S3 桶里。不用担心,也可以直接从 S3 存储桶中加载文件。如果你以前没有遇到过这种情况,S3 水桶只是一个数据和文件的存储盒,安全,易于从任何地方访问。本教程不包括设置 S3 桶,但这很容易做到,网上已经有很多这方面的指导。
如果您想直接从机器学习工作台中的 jupyter 笔记本访问 S3 存储桶,您首先需要授予对此实例的访问权限,以访问您的 S3 存储桶。最简单的方法是使用命令行从本地计算机直接登录到实例。为此,返回到 EC2 实例屏幕,选择您的实例并按下 connect。这将打开下面的屏幕。复制下面突出显示的示例(您的示例会有所不同)。将该命令复制到命令行中,确保将第三项替换为密钥文件的完整文件路径,并将单词“root”替换为“ubuntu”。按 enter 键,您应该直接登录到您的实例。如果它询问您是否要继续,请键入“是”。
如果您得到一个错误,提示您的私钥文件未受保护,请通过运行下面的命令行命令来保护该文件,然后重试
chmod 400 New_Key_Pair.pem
用您的私钥文件的完整文件路径替换命令中的最后一项。
一旦你在你的命令行应该看起来如上。从这里—要授权您的 S3 存储桶,请运行以下命令行命令:
aws configure
然后你所需要做的就是输入密钥 ID 和秘密密钥,你就可以开始工作了!这意味着您将能够直接从 S3 向您的实例中导入文件。关于如何在 AWS 上做到这一点,有更多的参考资料,但是下面是从 EC2 实例使用 S3 的一些常用命令:
列出你的 AWS 桶:
aws s3 ls
移动文件(或整个文件夹!)入斗:
aws s3 cp /Documents/data.csv s3://bucket/folder_name
您可以通过
aws s3 cp s3://bucket/file_to_copy file_to_copy
反过来复制文件
如果你想给出一个完整的路径名,看起来像:
aws s3 cp s3://bucket/file_to_copy ~/folder/subfolder/.
一旦在命令行中配置完实例,只需在命令行中键入 exit,它就会关闭连接。
核心和处理
我见过的一个常见错误是,当人们为了加快处理速度而将笔记本电脑转移到 AWS 时,他们会忘记修改代码,以便在新电脑上使用。他们将笔记本电脑复制到一台更强大的 8 核计算机上,然后惊讶地发现网格搜索用了同样长的时间…
例如,sklearn 的大多数模型函数中都有一个名为 n_jobs 的参数,它允许您指定要使用多少个内核来训练模型。默认值为 None,这意味着它将只使用一个内核。如果您不更改此默认设置,迁移到具有更多内核的计算机将不会有任何影响。您可以手动将其设置为想要使用的内核数量,或者简单地输入-1,这将使用所有可用的内核。
要知道 n_jobs 可能不是唯一的限制因素。有些解算器不支持多重处理,因此会忽略您的 n_jobs 输入(例如,带有 sklearn LogisticRegression 的 Sag 解算器)。
在后台运行脚本
因此,您已经将数据放在工作台上,准备开始训练您的模型,但是如果,即使有额外的 AWS 计算能力,看起来您的 gridsearch 还需要几天时间呢?登录机器学习工作台 jupyter 笔记本的缺点是,如果你退出笔记本,它不会继续在后台运行。如果你关闭 jupyter 笔记本,它将中断这个过程,你将不得不从头开始。你有三个真正的选择。
- 咖啡因:第一种也是最简单的一种,要求你的电脑一直开着,所以这并不理想,但我会提到它,因为它更简单!基本上,选择一是让你的 jupyter 笔记本运行,并确保你的电脑不会进入睡眠状态。为了做到这一点,为你的电脑安装一个类似咖啡因或安非他命的应用程序,以便在实例运行时让它保持清醒。如果你需要合上笔记本电脑,情况会变得稍微复杂一些,因为 Macbooks 不允许你在电脑合上时保持清醒。有办法解决这个问题——显然,即使你关闭屏幕,一款名为 InsomniaX 的应用程序也会让你的 Macbook 继续运行。
- **不挂断:**第二种选择更稳健。对于此选项,您将需要在命令行上登录到实例并运行脚本,让实例知道即使您从实例断开连接,您也希望脚本继续运行。为了连接到实例,请回顾上一节中的步骤(加载数据和笔记本)。一旦您登录并导入了想要运行的脚本,您可以使用下面的命令行命令在后台运行它:
nohup python script.py &
这将强制实例在后台运行程序,并且在您断开连接时不会“挂断”,并且会为您提供一个进程 ID。为了做到这一点,你必须将你的笔记本转换成 python。py)文件,并确保脚本运行的任何结果都被保存下来。一些有助于确保脚本正在运行的附加命令是:
检查所有 python 正在运行的进程
ps aux | grep python
终止特定进程
kill -9 [insert process number]
- **终端多路复用器:**您的第三个选择——可能也是最可靠的——是设置一个终端多路复用器。终端多路复用器允许您通过客户端窗口连接到实例或服务器。它允许您确保即使客户端断开连接,实例也将继续运行。您可以关闭计算机,只要在启动备份时重新连接到客户端,实例就会继续运行。把它想象成一个虚拟终端。因此,您仍然需要运行脚本,而不是直接使用 jupyter 笔记本。一种常用的终端多路复用器被称为 tmux,您可以在这里访问关于如何设置的简单指南。
关闭实例
记得这样做!如果你忘记了,你很容易就有一大笔账单,所以在关闭你的实例之前不要去度假。这里有两种选择,停止实例和终止它。
在这两种情况下,实例将被关闭,您的虚拟机将被永久删除,您将不再因实例使用而付费。在这两种情况下,您都会丢失保存在实例的临时存储上的任何数据。停止和终止实例的主要区别在于,当您停止时,附加的可引导 EBS 卷不会被删除。这意味着该实例将仍然存在于 EC2 实例窗口中,并且您可以随时使用与以前相同的设置和设置再次启动它。但是请注意,如果您再次启动它,连接的连接路径和 IP 地址将会改变。还要注意,将 EBS 卷保持在停止状态可能会有费用(虽然费用很少,而且在免费试用期间,很多费用都是免费的),但是请记住,如果您打算让它长时间停止,那么终止实例会更好。
这就对了。将 AWS 计算能力用于机器学习任务的基础知识——这是加速任何数据科学项目的一个好方法。
BigQuery 及其免费数据集简介
快速介绍如何使用免费的公共数据集访问和查询 Google 的 BigQuery。
来自 Pixabay 的图片
查找和访问数据很难做到——尤其是免费数据。然而,谷歌的 BigQuery 有一个巨大的免费数据库,访问起来再简单不过了。访问数据库的查询是在 SQL 中进行的,但是,界面非常用户友好,您只需要基本的理解就可以开始访问数据。
公共数据集
目前,BigQuery 上有近 200 个公共数据集,并且一直在增加新的数据集。大多数数据库都保持完全更新,每天都有新的数据。例如,在过去的 3 个月里,新冠肺炎增加了 22 个新的数据集,这些数据集每天更新,以帮助提高数据的可用性和辅助研究。要细读这些数据集,只需前往谷歌市场的数据集。数据范围巨大,从诺亚极端天气数据到历史加密货币交易量和价格。数据集已经分类,以便于根据您感兴趣的数据类型进行筛选。
云控制台
一旦你决定了一个数据集,点击它,然后点击查看数据集——这将把你直接带到谷歌云控制台。请注意,您需要使用 google 帐户登录或设置一个帐户才能访问控制台。如果这是你的第一次,你将获得一年的免费试用,价值 300 美元(或等值的本国货币)的免费数据访问信用。在这里,你应该在屏幕的左上方建立一个新的项目。这允许您跟踪您的数据集和查询,允许您保存查询并查看您过去的所有作业。
点击进入新项目界面,用你喜欢的名字设置项目——你会得到一个警告,让你知道你的免费账户上还有多少项目。一旦你设置好了,你就可以开始了!
探索数据集
在控制台中,您可以更详细地浏览数据集。导航数据集的主要部分位于控制台左下角的 resources 选项卡中。这允许您浏览大量公共数据集,添加额外的公共数据集,甚至链接外部数据源。
在“添加数据”屏幕中,您可以搜索市场中的所有相同数据集,并将其添加到此资源选项卡中的固定数据集。对于任何给定的项目,将所有数据集放在一个地方都很简单。
除此之外,BigQuery 还为所有数据表提供了简洁明了的汇总屏幕。为了访问它,浏览数据库中的资源,只需选择您感兴趣的数据表,查看更多详细信息。
第一个数据屏幕是 Schema 屏幕,它提供了关于表中每个字段的字段名称和数据类型的更多信息。有些数据集甚至详细描述了字段名的含义或代表的内容。策略标签允许数据库所有者设置特定字段的权限(例如,敏感数据),然而,这并不用于大多数公共数据集中,因为它们是公共的。
第二个选项卡是 Details 选项卡,它提供了表的概要信息。即数据集的大小和长度(维基百科 2020 年页面浏览量表有 250 亿行数据!),还包括数据有多旧,以及更新的频率。此外,一些公共数据集只在一定时期内发布,您可以看到表何时到期(尽管这种情况非常罕见)。
如果前两个还不够,甚至还有一个预览选项卡,它将允许您查看前几行数据,因此您可以看到数据格式的示例。这使得描绘你的数据库,查看它是如何组合在一起的,以及决定你到底想要查询哪些信息变得非常容易!
查询数据集
一旦您准备好开始访问数据,BigQuery 还使构建查询和修改查询变得非常简单。显然,如果您是一个 SQL 奇才,您可以在查询框中开始编写查询,但即使这样,使用 BigQuery 快捷方式开始也要快得多。选择您想要查询的表,然后简单地点击右下角的查询表按钮。
这将用一个几乎完整构建的查询自动填充您的查询。您最初会看到一个语法错误,这是因为它不会自动填充要查询的字段。为了进行选择,您可以简单地从 Schema 菜单中单击字段名称,它将为您填充查询(当然,如果您想要所有字段,您可以简单地在 SELECT 之后键入一个’ * '来选择所有字段)。
请注意,它们会自动在查询中填充一个限制。除非你 100%确定你在做什么,否则不要删除它。这不仅是一个好的实践,也意味着您不会因为试图在一个简单的打字错误后返回 1tb 的数据而意外地使用了所有的免费使用限制。这些数据集大部分都很庞大,因此很容易出错。一旦您准备好您的查询,您将得到一个绿色的复选标记,告诉您该查询是有效的,并且您还可以在查询屏幕的右下角得到关于搜索大小的信息,作为一个额外的完整性检查。这是一个较高的估计,大多数情况下,如果你有一个限制,实际的过程会少得多。
从这里,您可以轻松地构建多个查询,并在实际运行之前保存它们。组织查询再简单不过了。完成后,只需单击保存查询。然后,可以从左侧的菜单中再次访问保存的查询。您甚至可以计划在特定时间运行查询!
这不是一篇关于 SQL 的文章,但是包含了一些简单的附加命令,在构建查询时可能会有用:
从字段
SELECT DISTINCT field1 FROM table
中选择唯一值按某个字段分组并聚合其他字段
SELECT field1, sum(field2) FROM table GROUPBY field1
将表连接在一起(可以是左、右、内或外)
SELECT f1 FROM table INNER JOIN table2 ON table.f1 = table2.f1
用条件选择
SELECT f1 FROM table WHERE f1 = "legend" or f1 LIKE "%leg%"
对输出排序
SELECT f1 FROM table ORDER BY f1 DESC
选择日期部分并重命名字段
SELECT date_part('year', my_date) AS year FROM table
这只是皮毛,但有了它,你可以走得更远!
如果您对查询感到满意,请按“运行”按钮,查询将运行,然后用结果填充底部菜单。还要注意的是,一旦运行,查询结果就会出现在左边的查询历史菜单中,没有必要重新运行。
您可以在适当的地方看到表格格式的结果(尽管您一次最多可以看到 100 行),甚至可以直接使用 data studio 来浏览数据。如果你点击探索数据按钮,它会自动链接到一个数据工作室表,所以你可以玩可视化和 EDA。几秒钟内你就可以看到有用的数据摘要。
Google 的 DataStudio 的更好的工作方式是另外一个故事,但一般来说,它非常用户友好,可以帮助快速分析查询,以确保它们正确运行或数据有意义,这样你就可以根据需要定制你的查询。
保存或提取数据
对查询满意后,您可能希望提取数据以进行进一步的分析或建模。这里有相当多的选项,如果您单击“保存结果”按钮,它将为您提供所有选项的详细描述以及限制。
简单地说,如果你把结果保存在 google drive 上,你可以节省 1gb,但是如果你想把它保存在你的电脑上,下载限制是 16k 行。将文件保存到 google drive 意味着你可以保存更大的查询,从 google drive 可以很容易地从 google colab 访问 csv,从 jupyter 笔记本访问,你只需要设置一个 API 键。
现在,您可以免费访问数百 TB 的,非常适合您的下一个数据科学项目!
面向数据科学家的数据工程介绍
马库斯·斯皮斯克在 Unsplash 上的照片
数据基础架构概述,这是采访中经常被问到的问题
在我过去几年为我的雇主进行面试的过程中,我发现应届数据科学毕业生通常不太了解数据工程领域。他们通常在机器学习算法的海洋中游泳,很少关注他们上游和下游的工作。然而,许多公司都非常重视与数据工程师合作的经历,因为这对于平稳高效地部署数据科学模型至关重要。理解大局很重要。它有助于你了解一家公司解决业务问题所需的所有要素,以及你和你的工作在公司中所扮演的角色。
本文将帮助您掌握数据基础设施的各种元素,并熟悉每个步骤中使用的一些常用工具和软件。
让我们开始吧。
基本概念
这里有一些你会经常听到数据工程师提到的基本术语。让我们先理清这些概念:
- 服务器:把服务器想象成“远程计算机”,可以通过 API 从本地计算机(称为客户端)访问它们。
- API:把它看作一个 URL 或者一个库,你可以在那里访问或者执行它,运行一个软件或者一个模型。
- **微服务:**公司正在搭建的端系统。工程师不是构建复杂的整体应用程序来满足多种业务需求,而是将软件功能隔离到多个独立的模块中,这些模块分别负责执行独立的任务。这些模块通过通用的 API 相互通信。更详细的解释,请看这个链接。
单一应用程序:开发团队在同一软件的不同功能上工作
微服务:将每个功能构建为独立的应用程序,并通过 API 相互访问
- Docker 容器可以理解为存储库和打包运行代码所需的应用程序的地方。在维护软件包版本的一致性和消除在不同的计算机和服务器上运行时重新安装软件包的麻烦方面,它非常方便。Docker 容器是使用 docker 映像构建的—如果您将 docker 容器视为一个操作系统(就像您的 windows 系统、IOS 系统或虚拟机),docker 映像就是该系统在某个时间点的快照。当您刚启动 docker 容器时,您有一个 docker 映像,并且您可以创建附加的 docker 映像来存储您的工作。当你与他人共享 docker 映像时,他们将能够像你一样运行一切。关于 docker 如何工作的更多细节,请查看这个链接。
数据基础设施概述
一个数据基础设施是一个促进数据共享和消费的数字框架。简而言之,它意味着数据需要在组织中流动并被不同部门使用的元素的组合。典型的数据基础设施如下所示:
让我们一步一步地浏览这个图表:
- 原始数据可以是结构化的,也可以是非结构化的,通常在第一次流入时存储在数据库中。常用的关系数据库包括 MySQL、Postgres、Redshift、Vertica、Snowflake 等。
- 很多时候,原始数据还不能被数据科学算法或商业智能引擎直接使用。可能是因为太乱了,也可能是因为数据格式不理想。因此,通常需要数据预处理步骤(也称为 ETL)来标准化传入的数据。ETL 是提取、转换和加载的缩写。这三个数据库功能被组合到一个工具中,从一个数据库中提取数据,将其转换成所需的格式,然后放入另一个数据库中。有时 ETL 作业被安排在特定的时间间隔运行。其他时候,当新的原始数据通过使用类似于 Apache Kafka 的工具进入时,它们会被自动触发。
一个简单的工作流,使用 Kafka 在新数据进入时加速模型训练和部署。这个图中没有显示 ETL 过程。
- 处理后的数据将被运行在云服务上的数据科学算法使用。由于这一步可能涉及到许多工具,我将在后面深入讨论这一部分。
- 当在云上运行作业时,组织需要监控它们的使用情况和错误。这就是管理工具发挥作用的地方。常见的监控服务包括 Kubernetes (分组和管理 docker 容器) Datadog (管理日志、安全、用户等。)、 Grafana (管理内存、服务器请求、页面加载等等)等。
Grafana 仪表板的屏幕截图
- 最后,算法输出被保存回数据库或网络存储器,如 AWS S3 。
在云上运行 DS 算法
有许多方法可以在云上部署数据科学算法。人们可以通过使用 Flask 这样的包来创建端点 API,并在 AWS Elastic Beanstalk 这样的 web 服务上托管这样的 API。或者他们可以直接在云服务上运行脚本,如 AWS Lambda、AWS EC2 实例或 AWS Sagemaker。
在 AWS Lambda 上,可以编写在特定条件下触发的函数,比如当一个新文件进入链接的 AWS S3 数据存储桶时。缺点是 AWS Lambda 函数通常是简单快捷的函数,并且在它们可以执行的操作类型方面受到限制。但是,它会自动处理缩放和大小决定,因此不需要担心调整实例和内存的数量等问题。当交通流量增加时。这也是 AWS Lambda 被称为无服务器计算的部分原因——用于运行应用程序代码的服务器基础设施环境隐藏在后台,这样你就不必考虑服务器了。
简单的 AWS Lambda 工作流
另一方面,AWS EC2 允许用户调整和缩放服务器实例。因为用户可以完全控制服务器和代码运行环境,所以用户可以部署更复杂的脚本。运行在 EC2 上的应用程序需要打包到 Docker 容器中。
AWS Sagemaker 是建立在 AWS EC2 之上的云服务。它带有预构建的容器,专为数据科学家训练和部署机器学习模型而设计。它看起来像一个 Jupyter 笔记本,但在云服务上。您还可以通过 AWS APIs 访问它,并在本地机器上编写代码。
如果您有多个脚本需要按照一定的顺序运行,那么您将需要 Apache Airflow。Airflow 是一种管理工具,可以帮助云服务按照设计在工作流(称为 DAG)中运行代码,它有一个日志系统,可以在 DAG 中断时显示故障组件。
Airflow 可用于云服务上的 ETL 过程和模型训练/部署过程。
就是这样!为了更容易理解,我简化了许多概念。希望这篇文章能帮助您对数据工程概念有一个基本的了解,从而促进将来更好的合作。有关问题和评论,让我们连线 Linkedin 和 Twitter 。
Python 动态可视化简介-动画和交互式绘图
Python 科学绘图
用 Python 制作基本动画和交互式绘图
有时,您可能希望创建一个像视频一样随时间变化的动态图形,或者根据交互式用户输入进行调整。这些可视化做了大量的工作,真实地展示了输出如何随着输入而变化。在本文中,我将把相同的数据呈现为静态图、动画和交互式图。为了与我以前文章的物理科学主题保持一致,我绘制的数据将来自固态物理学中最广泛使用的方程之一:费米-狄拉克分布,它描述了电子在固体中的占有率。等式如下所示,它将占据能量 E 的态的分数作为费米能量和温度的函数。
费米-狄拉克分布
静态图
我们的第一个图将是一个静态图,其中将有不同温度下的 f(E) 曲线。首先,我们导入所需的包:
# Import packages
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
由于我们要多次计算费米-狄拉克分布,我们应该写一个函数来为我们做这个计算:
# Fermi-Dirac Distribution
def fermi(E: float, E_f: float, T: float) -> float:
k_b = 8.617 * (10**-5) # eV/K
return 1/(np.exp((E - E_f)/(k_b * T)) + 1)
现在我们可以开始绘制数据了!首先,我将编辑一些常规的绘图参数:
# General plot parameters
mpl.rcParams['font.family'] = 'Avenir'
mpl.rcParams['font.size'] = 18mpl.rcParams['axes.linewidth'] = 2
mpl.rcParams['axes.spines.top'] = False
mpl.rcParams['axes.spines.right'] = Falsempl.rcParams['xtick.major.size'] = 10
mpl.rcParams['xtick.major.width'] = 2
mpl.rcParams['ytick.major.size'] = 10
mpl.rcParams['ytick.major.width'] = 2
我们创建我们的图形,并向其添加轴对象:
# Create figure and add axes
fig = plt.figure(figsize=(6, 4))
ax = fig.add_subplot(111)
为了向我们的费米-狄拉克函数提供变化的温度数据,我们使用numpy.linspace
生成 100 K 到 1000 K 之间的一组值:
# Temperature values
T = np.linspace(100, 1000, 10)
对于这些温度值中的每一个,我们需要将不同的颜色映射到其结果曲线上。我们将从coolwarm
色图中生成颜色,因为我们实际上是在处理不断变化的温度。由于我们已经在上面生成了 10 个温度值,我们将从coolwarm
色图中提取 10 种颜色。
# Get colors from coolwarm colormap
colors = plt.get_cmap('coolwarm', 10)
绘制数据的最简单方法是循环遍历所有温度值,并每次绘制相应的曲线。为了生成 x 轴值,我们再次使用numpy.linspace
来创建一个由 0 到 1 之间的 100 个等距值组成的数组。此外,我们在所有计算中使用 0.5 eV 的固定费米能量值。
# Plot F-D data
for i in range(len(T)):
x = np.linspace(0, 1, 100)
y = fermi(x, 0.5, T[i])
ax.plot(x, y, color=colors(i), linewidth=2.5)
我们的图需要的最后一个元素是一种区分不同颜色温度曲线的方法。为此,我们将创建一个图例,首先创建一个标签列表,然后将它们传递给axes.legend
方法。
# Add legendlabels = ['100 K', '200 K', '300 K', '400 K', '500 K', '600 K',
'700 K', '800 K', '900 K', '1000 K']ax.legend(labels, bbox_to_anchor=(1.05, -0.1), loc='lower left',
frameon=False, labelspacing=0.2)
labelspacing
—图例条目之间的垂直间距(默认为0.5
)
最后,在添加轴标签后,我们将看到以下图形:
费米能级为 0.5 eV 时费米-狄拉克分布的温度依赖性
动画剧情
现在,假设我们想要呈现与上面相同的数据,但是作为一个视频,我们该怎么做呢?原来我们用matplotlib
就可以很轻松的做到这一点!我们必须导入以下内容才能使用该功能:
# Import animation package
from matplotlib.animation import FuncAnimation
如果我们使用的是 Jupyter 笔记本,我们也应该改变matplotlib
用来渲染其数字的后端,以便允许交互式绘图。
# Change matplotlib backend
%matplotlib notebook
对于我们的动画,我们需要做以下工作:
(1)将对绘制曲线的引用存储为变量
(2)使用带有该变量的函数调用来不断更新绘图数据
我们将首先绘制空数组,并将该图存储为一个名为f_d
的变量。此外,我们将添加一个显示当前绘图温度的文本注释,因此我们也将存储一个对此的变量引用。我们将文本注释的右上角与 axes 对象的右上角对齐。
# Create variable reference to plot
f_d, = ax.plot([], [], linewidth=2.5)# Add text annotation and create variable reference
temp = ax.text(1, 1, '', ha='right', va='top', fontsize=24)
现在来看看我们动画的核心——动画功能。该函数将接受索引i
的输入,并在每次调用时更新绘图。它还会用当前温度和(只是为了好玩!)根据coolwarm
色图中的相同颜色改变绘图和文本的颜色。
# Animation function
def animate(i):
x = np.linspace(0, 1, 100)
y = fermi(x, 0.5, T[i])
f_d.set_data(x, y)
f_d.set_color(colors(i))
temp.set_text(str(int(T[i])) + ' K')
temp.set_color(colors(i))
set_data(x, y)
—为绘图设置新的x
和y
数据
现在,为了让奇迹发生,我们使用下面一行代码:
# Create animation
ani = FuncAnimation(fig=fig, func=animate, frames=range(len(T)), interval=500, repeat=True)
fig
—传递给动画功能的图形
func
—剧情的动画功能
frames
—一个数组,从 0 开始,代表动画的帧。在这种情况下,我们传递一个长度等于我们正在制作动画的温度数的值(这也是传递给func
的索引i
)。
interval
—帧之间的延迟,单位为毫秒
repeat
—是否在动画结束时重复播放
费米能量值为 0.5 eV 时费米-狄拉克分布的温度依赖性的动画图
在那里!现在,如果您的轴标签或部分绘图被截断,您可以尝试添加以下代码行,以确保所有元素都在图形的视图中。
# Ensure the entire plot is visible
fig.tight_layout()
现在,为了保存我们的动画,我们使用如下:
# Save and show animation
ani.save('AnimatedPlot.gif', writer='imagemagick', fps=2)
为了生成.gif
文件,我使用了 ImageMagick
fps
—动画的每秒帧数(因为我们只有 10 帧,所以我使用 fps 值 2 来模拟之前 500 毫秒的间隔延迟)
互动剧情
最后,如果我们想让用户摆弄输入参数,观察它们在输出上的变化,我们可以制作一个交互式的图形。我们从导入所需的包开始。
# Import slider package
from matplotlib.widgets import Slider
我们再次开始创建一个图形和轴对象来保存我们的绘图。然而,这一次,我们调整了绘图的大小,以便为将要添加的滑块腾出空间。
# Create main axis
ax = fig.add_subplot(111)
fig.subplots_adjust(bottom=0.2, top=0.75)
figure.subplots_adjust()
接受top
、bottom
、left
和right
的输入,指示在何处绘制轴边界框的四个角。在这种情况下,我们确保顶部不超过 0.75,这样我们就可以将滑块放在图的顶部。
滑块开始就像任何其他轴对象。在这里,我们将两者都加在图上(一个用来改变费米能,一个用来改变温度)。此外,由于我们更改了全局绘图设置,删除了右侧和顶部脊线,因此我们将它们添加回滑块。
# Create axes for sliders
ax_Ef = fig.add_axes([0.3, 0.85, 0.4, 0.05])
ax_Ef.spines['top'].set_visible(True)
ax_Ef.spines['right'].set_visible(True)ax_T = fig.add_axes([0.3, 0.92, 0.4, 0.05])
ax_T.spines['top'].set_visible(True)
ax_T.spines['right'].set_visible(True)
现在,我们必须将这些轴对象转换成滑块:
# Create sliderss_Ef = Slider(ax=ax_Ef, label='Fermi Energy ', valmin=0, valmax=1.0,
valfmt=' %1.1f eV', facecolor='#cc7000')s_T = Slider(ax=ax_T, 'Temperature ', valmin=100, valmax=1000,
valinit=100, valfmt='%i K', facecolor='#cc7000')
ax
—要转换为滑块的轴对象
label
—位于滑块左侧的滑块标签
valmin
—滑块的最小值
valmax
—滑块的最大值
valfmt
—显示为滑块值的字符串,位于右侧。%1.1f
是一个带 1 个小数点的浮点数,%i
是一个整数
facecolor
—填充滑块的颜色
现在我们已经创建了滑块,让我们绘制“默认”数据集,它将显示图形首次加载的时间(费米能量为 0.5 eV,温度为 300 K):
# Plot default data
x = np.linspace(-0, 1, 100)
Ef_0 = 0.5
T_0 = 100
y = fermi(x, Ef_0, T_0)
f_d, = ax.plot(x, y, linewidth=2.5)
就像在动画情节中一样,我们现在将定义update
函数,它将随着滑块的更新而改变数据。此update
函数获取滑块的当前值,更改绘图中的数据,并重新绘制图形。
# Update values
def update(val):
Ef = s_Ef.val
T = s_T.val
f_d.set_data(x, fermi(x, Ef, T))
fig.canvas.draw_idle()s_Ef.on_changed(update)
s_T.on_changed(update)
当滑块值改变时,Slider.on_changed(func)
调用更新func
。最后,当我们展示我们的阴谋,我们得到这个很酷的互动图!
费米-狄拉克分布温度依赖性的交互图
结论
我希望这篇文章展示了如何通过动画和交互式滑块使数据可视化变得动态。感谢您的阅读——我感谢任何评论和反馈。本文中展示的所有例子都可以在这个 Github 资源库中找到。你可以在 Twitter 上关注我,或者在 LinkedIn 上联系我,获取更多文章和更新。
FastAI 简介:安装和构建我们的第一个分类器
提示:仅用 5 行代码就能在 MNIST 上达到 98%的准确率!
FastAI 是一个简化神经网络训练的库。它基于深度学习最佳实践的研究。开箱即用支持:
- 视力
- 文本
- 表列数据
- 协同过滤
让·格柏在 Unsplash 上的照片
在接下来的文章中会有更多的介绍。现在,我只想说我是而不是这个库的所有者,我只是一个用户,我不打算以任何方式、形状或形式推销这个产品。你在这里读到的一切都是基于个人经验。现在回到文章。
对每一个深度学习库的介绍都是从它处理 MNIST 数据集的能力开始的,这是一个包含手写数字的 28x28 像素照片的标准数据集。我以前在 Tensorflow 和 Keras 中训练过这个模型,虽然这几乎是一件微不足道的事情(只要你对神经网络有基本的了解),但它不可能与 FastAI 竞争,至少在实现速度方面。
以下是如何使用 ResNet18 (预训练卷积神经网络)对 MNIST 数据集样本进行训练:
path = untar_data(URLs.MNIST_SAMPLE)
data = ImageDataBunch.from_folder(path)
learn = cnn_learner(data, models.resnet18, metrics=accuracy)
learn.fit(1)
是的,那只有 4 行代码(好吧,我们没有计算一行用于导入),但是只有这样才能给你 97%的准确率。但是我想得太多了。在我们实际训练模型并做出预测之前,我们需要正确地设置这个该死的东西,所以下一节将会介绍这个过程。
安装选项
FastAI 库的所有者建议您拥有一台带 GPU 的计算机。如果你没有,这并不是世界末日,因为有很多可行的选择。
以下是您拥有的选项:
- 本地安装(你应该有一个 GPU)
- 使用 Google Colab
- 使用其他在线 Jupyter 环境
由于我的笔记本电脑上的 GPU 相当不错,我将深入讨论第一个选项。其他选项在提供的链接中有很好的介绍。
FastAI 本地安装
以下是我的机器的一些细节:
- Windows 10 x64
- 英伟达 GeForce GTX 1650
- 16GB 内存
首先你需要下载 Visual Studio、 Nvidia CUDA Toolkit 和 cuDNN 。幸运的是,我已经就此写了一篇文章:
[## 在 Windows 10 上安装 Tensorflow-GPU 2.0 的简单指南
根据你的网速,不会超过 15 分钟。
towardsdatascience.com](/an-utterly-simple-guide-on-installing-tensorflow-gpu-2-0-on-windows-10-198368dc07a1)
不要因为它说 Tensorflow 而感到困惑,你只需要设置上面提到的 3 件事,然后你就可以回到这篇文章。
好的,进展顺利吗? 我们继续吧。
开始时,你需要 PyTorch,因为 FastAI 是基于它的。因为我运行的是没有 Anaconda 的 Windows 机器,并且安装了 CUDA 版本 10.1 或更高版本,所以我必须在命令提示符下执行:
pip install torch===1.4.0 torchvision===0.5.0 -f [https://download.pytorch.org/whl/torch_stable.html](https://download.pytorch.org/whl/torch_stable.html)
然而,你的可能会不同。您可以在这里找到它,只需确保点击与您的配置相关的内容:
对我来说,下载大约需要 750MB,所以可能需要一段时间,这取决于你的网速。一旦完成,我们可以继续进行。在安装 FastAI 本身之前,唯一需要的是 Jupyter 笔记本扩展(如果你正在使用 Jupyter,确保不要跳过这些)。之后,我们可以安装 FastAI:
pip install jupyter_contrib_nbextensions
pip install fastai
太好了,我们现在已经在支持 GPU 的机器上安装了 FastAI。让我们看看如何使用它,真的很快。
示例—包含 5 行代码的 MNIST 分类器
提示—包括导入。现在,我们将探索只用 5 行代码训练一个简单的图像(数字)分类器有多容易。
首先,建议做一件让我有点焦虑的事情,那就是从一个库中导入 star (*)。基本上,这意味着我们将能够使用库提供的函数,而无需在每次调用前提供库名或前缀。这看起来是个好主意,但是一旦你的代码库变大,就很难确定这个函数是来自纯 Python,还是来自你的一些函数,或者其他什么地方。
尽管如此,这种约定是作者推荐的,所以我将在这里使用它,但是在你的项目中,想想这是否是你想要遵循的。让我们从导入开始:
如果我们没有任何图像,那么制作图像分类器就毫无意义。
幸运的是,FastAI 提供了untar_data()
函数,如果 URL 不存在的话,它会将 URL 下载到目的地。现在,只需要第一个参数,因为我们可以将数据集下载到默认位置。
对于 URL,我们也可以从 FastAI 的URLs
中受益——它有指向数据集的 web 位置的预定义变量。为了让这种简单的第一次动手体验变得更快,我们可以使用MNIST_SAMPLE
数据集,它只包含数字 3 和 7 的图像。
这可能看起来像一个小数据集,但本文只是为了证明一点。数据集的路径将被存储到一个名为path
的变量中,这样我们就可以看到数据集存储在哪里:
现在,当这些完成后,我们需要加载下载的数据。我们可以在一个ImageDataBunch
类的帮助下做到这一点,并调用一个方法from_folder
,顾名思义,该方法将从指定的文件夹中加载图像。
path
变量可以作为参数传入,以指示图像存储的位置:
终于到了训练我们模特的时候了!
FastAI 再次让这个过程变得非常简单,因为它只基于一个函数调用。我们将使用期望三个参数的函数cnn_learner()
:
data
—您的图像base_arch
—基础模型架构,这里我们将使用 ResNet18metrics
—您想要用来评估模型的指标(为了简单起见,我在这里使用精确度)
代码实现:
现在我们准备好训练了!函数拟合将为我们的模型训练所需数量的时期,我将该参数设置为 3 :
仅经过三个时期,模型就达到了令人印象深刻的 98.8%的准确率。现在让我们探索一下输入图像看起来是什么样子,以及模型在哪里做了错误的分类。
模型评估
函数show_batch()
可用于显示模型中的数据。代码实现非常简单,无需进一步解释:
这里我还想介绍另外两件事,第一件是如何绘制混乱矩阵。为此,我们需要从 CNN 学习者那里创建一个ClassificationInterpretation
对象。
代码显示如下:
从这里我们可以使用plot_confusion_matrix()
函数来可视化模型错误分类的内容:
从对角线上可以看出,大多数分类是正确的。我们对一些图片进行了错误的分类,但是这没什么大不了的,对于 5 行代码来说仍然令人印象深刻。
FastAI 可以做的另一件方便的事情是向您实际显示模型错误分类的图像。我们可以通过使用plot_top_loses()
功能来实现。
我决定展示前 12 个错误分类:
第一个值表示模型预测的值,第二个值表示实际值。
对于一些例子,我们不能真的责怪模型,因为图像是如此相似。
在你走之前
最后,这篇文章比我希望的要长一些,但我想做一个实际的演示,而不仅仅是谈论理论。
如果你对 FastAI 库感兴趣,请继续关注的数据科学和我的个人资料,因为还会有更多类似的文章。
感谢阅读。
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
[## 通过我的推荐链接加入 Medium-Dario rade ci
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@radecicdario/membership)
Google Colab 数据分析简介
我对有抱负的数据科学家的建议
面向数据科学家的终极云交互式笔记本电脑
来源( Unsplash )
我的笔记本电脑中安装了太多 Python!我很困惑。
设置 Tensorflow 太费时间了!
发送 Jupyter 笔记本版本是浪费时间!
您是否曾经希望有一个现成的启动环境,可以直接启动您的分析,而无需安装库和依赖项?
在本教程中,我想与你分享我日常工作中经常使用的神奇产品——Google Colab。
Google Colab (Colaboratory)是一个数据分析工具,它将代码、输出和描述性文本合并到一个文档中— 来源
本质上,您可以获得 TPU 和 GPU 处理,它们已经针对云中的数据分析管道进行了优化。
这使得你可以使用流行的库,如 Theano,Tensorflow 和 Keras,直接运行深度学习。类似地,您可以生成图形并共享分析输出,就像文档和工作表一样。
感兴趣吗?我们开始吧!!
Google Colab 是什么?
Google Colab 是 Jupyter 笔记本+云+ Google Drive
Colaboratory 是一个数据分析工具,它将代码、输出和描述性文本合并到一个文档中(交互式笔记本)。
Colab 提供 GPU,完全免费。通过使用 Google Colab,您可以:
- 在标准化环境中快速构建您的分析产品。
- 促进流行的 DL 库,如 PyTorch 和 TensorFlow
- 在您的 Google Drive 中共享代码和结果
- 保存副本并创建知识共享的游乐场模式
- Colab 可以在云上运行,也可以在带有 Jupyter 的本地服务器上运行
colab 的免费版本没有保证和限制;使用限制经常波动,这是 Colab 免费提供这些资源所必需的。
好消息是,你可以订阅 Colab Pro 或者用谷歌云产品运行专用服务器。这两个选项都很简单,部署只需 20 分钟。
如果您想跟随下面的教程,请随意使用这个 Colab 文件。运行它,了解 Colab 如何简化您作为数据分析师/科学家的工作。
合作笔记本
drive.google.com](https://drive.google.com/file/d/1rNTb53vFFlZnMRunCfShrc8_6Vg14ttb/view?usp=sharing)
准备好使用 Google Colab
有了 Colab,你可以在 Google Drive 中编写一个可共享的 Python 交互式笔记本。在本教程中,我们将进行 6 个简单的实践来使用 Google Colab。
打开 Google Colab
查找 Google Colab
- 打开你的 google drive
- 右键单击并打开 Google Colab
- 重命名您的笔记本
- 搞定了。好好享受你的笔记本。
安装库
令人欣慰的是,Colab 已经在每个运行时提供了大量的 python 库。
有时,您可能会遇到对附加库的需求。在这种情况下,您应该使用 Colab 中的 pip 或 apt 包管理器 bash 命令下载它们。
您需要做的就是用!
启动 bash 命令,这告诉 Colab 这个笔记本单元不是 python 代码,而是命令行脚本。
要运行 bash 命令,应该在代码行之前添加!
。例如!pip freeze
或 !pip install <DL Library>
Google 协作运行时的免费版本不是持久的,因为它会为每个终止的会话跳转。这意味着每次连接到 Colab 笔记本电脑时,您都需要重新安装库。
要获得已经可用的库,你可以使用!pip freeze
注意,包括 Keras、Tensorflow、Theano 在内的顶级深度学习库已经存在,随时可以使用。
所有这些都不需要一次又一次地安装一个库。
运行代码和可视化
像往常一样在 python 笔记本中运行它们。导入库并立即使用它。您不需要添加%matplotlib inline
来显示 Colab 中的可视化。
这些已经在 Colab 运行时中进行了配置。
Colab 运行时的可视化
快捷指令
快捷键类似于 Jupyter Notebook,只是在 Jupyter Notebook 的快捷键前加了一个前缀CTRL/CMD + M
。
查看快捷列表 CTRL/Command + M + H
创建和运行新单元
- CTRL/CMD M + A →在选择上方创建单元格
- CTRL/CMD M + B →在所选内容下方创建单元格
- CTLR/CMD M +M →切换到降价模式
- CTRL/CMD M + Y →切换到代码编辑模式。
- CTRL/CMD M + D→删除单元格
运行电池也有类似的快捷方式
- SHIFT + ENTER →运行并移动到下面的单元格/如果不存在则添加
- ALT+ ENTER →运行并在下面添加单元格
- CTRL + ENTER →运行并停留在选定的单元格处
魔法
Colab 和 IPython 都有“魔力”,可以让你把 Python 和其他语言(比如 shell 或者 Dremel SQL)混合使用。
这些是我经常用来提高效率的一些魔术。
一个重要的警告:单元格魔术(以
%%
开头的魔术)必须是单元格中第个非注释行。这意味着你不能在单个细胞中导入和使用细胞魔法。
% %外壳
Shell magic 有助于查看当前的服务器环境规格。为了改进当前的服务器规格,您需要启动 Google 云平台(GCP)虚拟机(VM)并将连接重定向到 Colab 运行时(端口转发)。
%%HTML
在 Colab 中构建 HTML 命令可以方便地运行 Python 库中没有的可视化。它还允许我们很好地适应 HTML 和 CSS 中的 web 平台。在这种情况下,我们使用 SVG 来绘制可伸缩的矢量图。
% %时间
我们总是需要从小样本开始探索。
在将它扩展到我们的生产量之前,测量算法运行的时间是有意义的。我们需要进行优化,然后对其进行扩展,以便对大型生产数据集进行更快的分析。
而且还有更有
构建交互式表单
交互式表单为您的客户增强了演示/用户可视化。您应该使用表单为您的客户提供与数据交互的方法。
为此,您需要从以下语法开始
----Form starter---
#@title <title of the form> {<attribute>}
----Form Item ---
variable = <value> #@param {<attribute>}
form starter
将在 Google Colab 中呈现交互表单。
form items
是直观的。只需在属性中添加#@param,就可以控制交互。Google Colab 会将值注入到变量中,然后在每次更改值时运行单元格。
多功能且易于构建的交互式表单
存储/下载/插入到 Github
在 Colab 之外,您可以进行 3 种导出:
- 下载到。ipynb,。py,甚至。超文本标记语言
- 存储在 Google Drive 中并提取共享链接
- 直接把它连接到你的 Github 库:这是一个开发你的作品集的简单方法。它将笔记本上传到你的 Github 库。
非常方便地开发您的数据科学家组合
最后的想法
来源: Unsplash
我相信这些代码很容易在您的第一次 Colab 探索中直接实现。
一如既往,如有任何问题,请通过 Linkedin 联系我。如果时间允许,我很乐意回答你的问题。
索利·德奥·格洛丽亚
关于作者
文森特用 ML @ Google 对抗网络滥用。文森特使用高级数据分析、机器学习和软件工程来保护 Chrome 和 Gmail 用户。
除了在谷歌的工作,Vincent 还是《走向数据科学媒体》的特约撰稿人,为全球 50 万以上的观众提供有抱负的 ML 和数据从业者的指导。
在空闲时间,文森特在佐治亚理工学院攻读硕士学位,并为铁人三项/自行车旅行进行训练。
最后,请通过LinkedInMedium或 Youtube 频道 联系文森特
马尔可夫链蒙特卡罗简介
MCMC 解释并应用于逻辑回归
在之前的一篇文章中,我对贝叶斯统计做了一个简短的介绍,并告诉你贝叶斯分析如何结合你先前的信念和数据来找到感兴趣的参数的后验分布。我在文章中使用的问题是因为它很容易通过分析找到后验分布。通常情况并非如此,这个问题需要一个数值解。马尔可夫链蒙特卡罗(MCMC)算法就是这样一种模拟某些参数后验分布的方法。
在进一步阅读之前,你对贝叶斯统计有基本的了解吗?如果是,请继续阅读。如果没有,请在继续之前查看这篇文章。它涵盖了学习马尔可夫链蒙特卡罗(MCMC)之前需要知道的一切。
大都会-黑斯廷斯算法
Metropolis-Hastings 算法是对 MCMC 采样的一个很好的介绍。有 5 个步骤。在深入研究之前,让我们先定义一些参数和函数。
现在我们已经定义了参数、变量和函数,我们可以继续进行 Metropolis-Hastings 算法的 5 个步骤。
一旦你知道它是如何工作的,就没那么可怕了,对吗?
通常使用正态分布作为跳跃分布,因为以 0 为中心的正态分布可以产生小于或大于前一个建议的建议。跳跃分布的标准偏差是一个重要的调整参数。如果你的先验远离数字线上后验的密集部分,并且你的跳跃分布的标准偏差很小,那么在你开始从数字线的正确部分生成建议之前,将需要很长时间。如果您的跳跃分布的标准差相对于参数的真实分布太大,您的模拟后验概率将会有很多缺口,因为在这些位置没有生成建议。幸运的是,MCMC 的最佳软件包对它们的跳跃分布有自适应的标准偏差,所以在实践中你不必太担心这个参数。
一旦你生成了模拟的后验,标准的做法是“烧掉”一部分。这是因为该算法可能需要多次迭代来搜索参数空间中可能的值。要使用 10%老化,只需丢弃前 10%的模拟值。在去除“老化”之后,我们有了可以用于贝叶斯推断的模拟后验概率,例如构建可信区间。
应用改进的 Metropolis-Hastings 法进行逻辑回归
现在我们了解了 Metropolis-Hastings,我们可以对其进行修改,以适应逻辑回归模型中的系数。被估计的参数是 𝛽𝑗 对 𝑗=1,2,…𝑘 的,其中 𝑘 是模型中系数的数量。主要区别在于将有多个参数需要估计,而不是一个。我通过为每一轮的每一个 𝛽𝑗 生成提议来处理这个问题,但是每一轮都将𝛽𝑗的顺序随机化。
为了构建适合逻辑回归模型的 MCMC 算法,我需要定义 4 个函数。这将允许我们在 MCMC 算法的每一步计算我们的后验概率与建议的 𝛽𝑗 的比率。
功能 1
第一个是 inv_logit ,撤销一个 logit 转换。logit 变换将概率转换为对数概率。
对数优势公式
逻辑回归的输出是对数优势格式。给定我们的数据,在计算我们的 𝛽 向量的对数似然时,我们需要这个函数来将预测的对数几率转换成概率。
逻辑回归的逆 Logit 方程
功能 2
第二个是 normal_log_prior ,它计算我们的 𝛽 向量的先验对数,给出我们关于个体 𝛽𝑗 的均值和标准差的先验信念。它是多元正态分布密度的自然对数,其中每个元素是 𝑁∼( 先验均值 j 、先验标准差。戴夫。j ) 在 𝛽 处。我们使用自然对数来防止下溢。
功能 3
第三个是 log_likelihood ,它在给定数据的情况下计算我们的 𝛽 向量的似然对数。当我们用我们的逻辑回归对一个 2 类问题建模时,单个观察值具有伯努利概率质量函数( PMF )。
伯努利·PMF
给定数据,我们的 𝛽 向量的可能性是单个 PMF 的乘积。
给定数据,我们的 𝛽 向量的可能性
对数似然率为:
我们使用自然对数来防止下溢。
功能 4
最后, log_posterior 根据给定的数据和我们的先验信念计算出 𝛽 向量的后验概率。 𝑝𝑜𝑠𝑡𝑒𝑟𝑖𝑜𝑟 ∝ 𝑝𝑟𝑖𝑜𝑟∗𝑙𝑖𝑘𝑒𝑙𝑖ℎ𝑜𝑜𝑑,所以𝑙𝑛(𝑝𝑜𝑠𝑡𝑒𝑟𝑖𝑜𝑟)∝𝑙𝑛(𝑝𝑟𝑖𝑜𝑟)+𝑙𝑛(𝑙𝑖𝑘𝑒𝑙𝑖ℎ𝑜𝑜𝑑)。
有了这些定义,我就能够实现一个修改过的 Metropolis-Hastings。我还添加了一些功能来消除“老化”,计算可信区间,并进行预测。为了进行预测,用户需要指定他们是否想要使用每个 𝛽𝑗 的模拟后验概率的中值、平均值或模式作为 𝛽 的估计中的系数。
定义好类后,我们可以在真实数据上测试它。
MCMC 逻辑回归在实际数据中的应用
为了测试 MCMC 逻辑回归模型,我使用了这个包含 86 种糖果数据的数据集。我选择了一个简单的模型,包含截距和“pricepercent”(相对于集合中其他部分的单位价格百分比)。)来预测糖果是巧克力的概率。
模型是:
**
如你所见, 𝛽0 和 𝛽1 的模拟联合分布正在形成一个椭圆区域(就像广义线性模型中的联合分布一样)。在包含预烧回合的联合分布图中,系数从原点“行走”,在一个圆中走了一段,然后到达椭圆区域。这是从先验到我们可以认为是“真实的”模拟联合分布的区域的系数。
𝛽0 的 95%可信区间为[-3.67,-1.32],𝛽1的 95%可信区间为[2.50,6.72]。𝛽0 的模拟中值为-2.44,𝛽1的模拟中值为 4.48。价格越贵,糖果成为巧克力的可能性就越大。
查看价格百分位数与巧克力概率的关系图,我们可以看到我们的模型有一个很好的 S 曲线形状,如逻辑回归教科书中所示。它似乎在将糖果归类为巧克力方面做得不太好(与真阳性相比有很多假阴性),所以可能需要一个更复杂的模型。*
*当然,在构建真正的预测模型时,您应该使用验证和测试数据集来评估模型的性能。训练、验证、测试过程不是本文的主题;应用 MCMC 是。
与用 MLE 估计的逻辑回归相比
现在,我们已经用修改的 Metropolis-Hastings 算法拟合了逻辑回归,让我们将结果与标准的最大似然估计进行比较。结果很像!
极大似然逻辑回归模型综述
如果我做对了,你知道理解 MCMC 背后的想法,特别是 Metropolis-Hastings,并且理解它们如何应用于实际问题,例如拟合逻辑回归模型。
感谢阅读!如果你对 MCMC 和贝叶斯统计建模和机器学习感兴趣,请查看 pymc3 。
在这里找到我的项目库。
ML 操作简介:Tensorflow Extended (TFX)
我对 ML 工程师和数据科学家的建议
Google、AirBnB 和 Twitter 如何可靠地部署他们的 ML 系统。
来源 Unsplash
为什么技术债务会让你做噩梦?
我们中的许多人在没有适当的开发和技术债务管理的情况下就投入了 ML/AI 的炒作。这和用牙签造机器人是一样的。 —文森特·塔坦 上 MLOps,技术债
在过去的博客中,我谈到了 MLOps 和技术债务,它们将你的 ML 系统变成了一个巨大的噩梦,带来了大量的金钱损失。
开发 ML 系统就像经营一家酒店;如果不加以处理,问题就会出现,害虫滋生,服务变得不稳定。这个错误导致亚马逊损失了数百万美元,因为他们的“ ML 定价推荐器”在黄金时段出了问题。
为什么 ML 会成为你最大的噩梦
towardsdatascience.com](/intro-to-mlops-ml-technical-debt-9d3d6107cd95)
在本文中,我们将讨论补救措施:谷歌 TFX (Tensorflow Extended)。一个很棒的 MLOps 工具,可以与 flow pipeline 一起构建一个健壮、透明的 ML 系统。如果使用得当,它可以让您更轻松地保持最先进的 ML 性能,同时减缓 ML Ops 技术债务。
免责声明:文中表达的观点、想法和意见仅属于作者,不一定属于作者的雇主、组织、委员会或其他团体或个人。所有信息纯粹是为了我自己的学习目的,是从公开的 TFX 文档中总结出来的,加上我自己在谷歌与 TFX 共事的亲身经历。我写作纯粹是为了我自己的副业,绝不是出于任何隐藏的目的。
如何处理 ML 技术债?
根据我的经验,要可靠地部署您的 ML 系统,有 3 个最重要的考虑因素。
ML 模型组件的精心编排
假设你是一名新的 ML 工程师,正在开发一个系统来生产一个可靠的模型。
你如何管理和跟踪你的模型组件和版本?
每个 ML 操作阶段(取样、培训、评估和服务)都需要很好的理解。当数据分布和最佳拟合 ML 模型随时间变化时,这变得具有挑战性。几个月之后,您将不得不储备 ML 模型版本,并且可能会因为没有维护好的模型清洁度而停机。
我认识一个朋友,他用定制脚本和粘合代码解决了 ML 中断问题。虽然这在短期内行得通,但这会导致脆弱的代码、多余的翻译工作以及让他们困惑的大量技术债务。它变得如此荒谬,以至于可能需要一年多的时间才能在系统中引入一个小的政策变化。不用说,这家初创公司正在努力实现商业价值。
为了确保正确的版本控制和维护,我们需要一个透明可靠地跟踪 ML Ops 组件的系统。没有适当的跟踪和回滚系统的 ML 工程师团队将无法成功部署可靠的 ML 模型。
ML 操作需要清晰和一致。新的 ML 工程师需要了解 ML 培训和服务流程,以管理他们的版本和解决中断。
简化快速可控的变更,以满足业务需求
我们如何可靠地培训和服务不同的模型?
ML 工程工作对业务至关重要。想象一下亚马逊上一个定价推荐的例子。这个 ML 系统将总是需要保持不断变化的业务变化。想象一下促销力度、价格下限/上限,甚至竞争对手的公平数据政策。不同的外部因素会对 ML 推荐系统堆积复杂的更新。这将导致可能导致奇怪结果的错误(还记得亚马逊 Prime Day 丑闻)。
模型和系统的每一个变化都需要透明。每个模型和数据验证都被正确地标记和版本化。跟踪所有修复。
对业务和生产指标的一致评估
如何确保我们的模型不会失控并给我们带来巨大损失?
当您部署一个模型时,您将需要一个适当的仪表板来展示您的模型在现实生活数据中是否表现良好。集成测试是这里的关键。在谷歌,我们总是有实验、调试和生产模型。
每个 ML 模型都需要经过每个宇宙。它需要通过模拟测试在实验层面进行培训和验证。一旦我们准备好将它发布到真实的数据中,我们就将它推向调试,以控制有限的流量和沙箱。在我们调整调试阈值和微调模型之后,我们将把它投入实际生产。我们需要遵循数据清洁度(分布、偏斜度)、业务需求(精度、召回、货币结果)和生产指标(延迟、规模和可靠性)。
测试和影响评估对于确保可靠和高质量的 ML 生产系统至关重要
输入谷歌 TFX (Tensorflow 扩展版)
谷歌 TFX(公共来源
TFX 是一个基于 Tensorflow 的平台,用于托管端到端的机器学习管道。使用 TFX 配置框架,您将准备管道来清理数据、训练和服务于生产就绪的机器学习系统。TFX 在谷歌非常受欢迎,我们几乎在每部 ML 作品中都使用 TFX。
TFX 允许您创建一个强大的 ML 生产管道。TFX 提供模块化、灵活、协作、可访问和易于使用的 ML Ops 平台。每个 TFX 组件都允许对 ML 模型进行适当的存储、配置和编排。
从本质上来说,TFX 是研究人员和工程师之间快速安全采用 ML 的伟大联姻。TFX 的特点是公平、稀有条件、数据生命周期管理和软件开发生命周期问题(SDLC)。
TFX 管弦乐团
Orchestrators 自动执行任务并监控 TF 组件。最大的 TFX 管弦乐队之一是阿帕奇梁。Apache Beam 是统一的批处理和流分布式 API,它充当运行在分布式处理框架之上的抽象层。这允许您在不同的后端上工作,例如 Apache Spark、Local、Dataflow 等。
元数据存储
元数据是一个开源框架,用于在通用数据库中存储 ML 元数据,该通用数据库可由基于 SQL 的语言访问。此元数据保存所有组件记录,并允许我们将结果与以前的模型进行比较,并从模型中继承。它审计并优化了管道,将重点放在数据缓存上,并允许我们向前跟踪,从我们停止的地方开始。
在 TFX 的生产部署中,您使用 ML 元数据(MLMD) API 访问元数据,该 API 将属性存储在 MySQL 数据库或持久存储中。
TFX 组件
我起草并试验的样本流
TFX 使用 Flow/DAG 来模块化 ML 管道的组件。这里是一些初学者的入门组件。
- ExampleGen 将样本数据接收到基目录中。示例生成格式转换、连接等。您可以使用
CsvExampleGen
从 csv 或 n 张量生成原始数据。 - StatisticsGen 计算统计数据,如数据分布和异常检测。您可以使用
StatisticsGen
来计算描述性统计数据,以进行数据完整性检查。 - SchemaGen 使用 TF 数据验证库来定义预期的界限、类型和属性,以确保数据的有效性和整洁性。想象一下,如果我们有性别特征,而系统在没有准备好的情况下开始输入“躁郁症、LGBT 等”,未知标签会使系统崩溃。
- 示例验证器使用 TF 数据验证库来检测数据中的异常。默认情况下,它根据模式验证统计数据,以检测分布异常。这是识别不可靠数据的金丝雀过程。
- Transform (TF Transform) 生成
tf.transform
图和transformed_example
作为培训和服务的特征工程师输出。它提供了运行作业、创建转换图和运送到训练器组件的实用函数。tf.transform graph 既指向包含预处理数据模式的transformed_metadata
,又指向包含实际预处理图的transform_fn
。 - 训练师:实现 TF 模式。我们通过 tf 进行集成。学习对决策树/定制评估器建模。教练有缓存,允许我们在中断后继续。培训师培训两种服务模式:生产和评估。
- 调谐器:进行超参数调谐。在谷歌,我们使用众所周知的维齐尔。
- 评估器:评估模型性能指标,验证新训练的模型是否优于之前的模型。它为频繁的 ML 模型训练和服务运行自动健全检查。
- Pusher :将经过充分验证的模型推送到可配置的目标,例如用于移动设备的 TF Lite 和用于服务器群的 TF Serving。推送器还管理
_serving_model_dir
和回滚。 - 模型验证器:根据规定的基线对候选模型进行质量验证。模型验证器比较并决定最后一次验证,以推动所服务的当前模型。
- InfraValidator :执行服务基础设施验证以确保模型服务。
- 其他组件:标签根、取样器、标签杆
文件和规范的参考
如果你想了解更多,请随时从 TFX 文档和 Colab 获取全部细节。就我个人而言,我充分利用了这些资源,并在工作中贯彻了这些理念。
结论
通过在您的 ML 管道中实施 TFX 及其工作流程。您将获得以下好处:
- **ML 模型组件的精心编排。**您可以跟踪 DAG 管道中的组件。您可以快速理解一个新的 ML 项目,并了解每个组件如何协同工作以产生健壮的 ML 生产模型。
- **简化快速可控的变更,以满足业务需求。**您可以快速分离和编辑相关组件,以满足业务需求。例如,如果您需要更多地惩罚 FN,您可以在使用相同的缓存样本时替换模型版本。
- **对业务和生产指标的一致评估。**验证器和评估器组件确保您的新模型比之前的模型更加健壮可靠,即使在自动推送过程中也是如此。
我希望这是一本很好的读物,也是你发展和创新的灵感来源。
请在下面的评论提出建议和反馈。和你一样,我也在学习如何成为一名更好的数据科学家和工程师。请帮助我改进,这样我可以在下一篇文章中更好地帮助你。
索利·德奥·格洛丽亚
关于作者
Vincent Tatan 是一名数据和技术爱好者,拥有在 Google LLC、Visa Inc .和 Lazada 开展微服务架构、商业智能和分析管道项目的相关工作经验。
Vincent 是土生土长的印度尼西亚人,在解决问题方面成绩斐然,擅长全栈开发、数据分析和战略规划。
他一直积极咨询 SMU BI & Analytics Club,指导有抱负的数据科学家和工程师,并为企业开发产品开放他的专业知识。
最后,请通过LinkedIn,Medium或 Youtube 频道 联系文森特
MLOps 简介:ML 技术债务
我对 ML 工程师和数据科学家的建议
为什么 ML 会成为你最大的噩梦
来源: Unsplash
你最大的噩梦
(凌晨 3 点)快来!我们的定价全搞砸了!我们以 100 美元的价格出售 13,000 美元的相机! 亚马逊最佳黄金日 期间 ML 出错
假设你是亚马逊 ML 工程师之一,你的团队刚刚发布了一个新的 RNN 定价模型,根据购买趋势自动设置价格,你已经煞费苦心地回测和调整了无数次。你 2 年的努力终于有了成果,预计每年将产生 100 万英镑的额外收入。
你太高兴了,所以你订了一个昂贵的假期来庆祝。你在去巴哈马的路上,直到你收到…坏消息。
你的 ML 模型出了问题,错误地给所有商品定价。您疯狂地打开集成管理器进行回滚。但为时已晚,系统已经交货了;你的“尖端 ML 模型”让你的公司损失了 300 万美元。
第二天,您决定调试您的模型。你测试了模型。它看起来很好。价格分布有变化吗?资料准备有没有耍流氓?还是近期下游变化的质量数据?你疯狂地绞尽脑汁,但还是一无所知。因此,您决定用虚拟机和不同的配置文件隔离每个下游数据,从头开始重建模型,并再次逐个测试它们。你失去了对每个版本更新的跟踪,直到花了几个不眠之夜来修复问题。
在数据或集成变更期间,您最先进的 ML 模型变成了您最大的噩梦
输入技术债务
来源去飞溅
技术债务是在代码实施过程中所做的权宜决策的持续成本。它是由为了更早的软件发布和更快的上市时间的短期利益而采取的捷径造成的。技术债务倾向于复合。推迟工作以获得回报会导致成本增加、系统脆弱和创新率降低。
1992 年,沃德·坎宁安创造了这个术语来解释产品利益相关者对重构的需求。对于那些还不明白的人。技术债务是玛丽·近藤的反义词,说“让我们把脏衣服扫到床底下,问题就解决了”
来源( giphy )
同样,在人工智能和机器学习中,我们都倾向于增加技术债。我们喜欢做“忍者修复”,走捷径,比如硬编码功能、臭代码和不负责任的复制粘贴。如果您赶时间或交付概念证明(POC ),这些都是非常好且必要的。但是如果不付钱的话,这是非常危险的。
不是所有的债务都是坏的,但是未偿还的债务是复合的——
我们的 AI 和 ML 是靠数据运行的。垃圾进垃圾出。您使用的功能越多,它就变得越不稳定,尤其是当这些功能依赖于系统的许多部分时。
你脆弱的军情系统
想象一下使用 CRM(客户关系管理)系统建立价格歧视的定价系统(类似于飞机票)。定价系统的质量将高度依赖于来自 CRM 的数据,缺失的功能将破坏 ML 中的所有结果。
现在,想象它通过更加互联的 ML 和其他系统连接到来自更多上游的特征。你的 ML 模型往好里说是脆弱的,往坏里说是破碎的,会影响到它的下游。
在一个快节奏的基于人工智能的创业公司中,这已经成为常态,因为他们疯狂地赶时间线,以实现他们的产品,并将其呈现给他们的利益相关者。我和一个在人工智能初创公司的朋友聊过,他提到他们从来没有使用适当的版本控制(Git)、问题跟踪(吉拉)或任何开发运营管理工具来开发他们的 ML 系统。令人震惊的是,许多其他人在没有适当的 DevOps 和技术债务管理的情况下跳入 ML/AI 炒作。这和用牙签造机器人是一样的。
对于软件工程来说,DevOps 很重要。但是对于 ML Productions 来说,MLOps 是不可分割的
4 大 ML 管道事故
来源: Unsplash
1)纠缠
ML 系统是有数据的机器。通常很难做出孤立的改变(改变任何事情,改变一切——CACE)。这适用于特征工程、最大似然调整、正则化、数据采样等。
比方说,你的定价模型在除吸尘器之外的所有产品上都非常有效(因为它很烂:)。您通过提高清洁产品定价的敏感度来固定吸尘器的定价,但您发现您导致了定价分配与洗碗机不匹配。吸尘器的价格分布不适用于洗碗机的价格分布,洗碗机的价格分布更窄。您现在需要创建一个可能影响其他产品的不同规则。
你会意识到数据和见解是纠缠在一起的。不同的调优和模型公式将导致难以隔离的一般洞察力变化。
纠缠在一起的数据和系统会给隔离和调试问题带来困难
2) 复杂管道(管道丛林)
人工智能和人工智能系统由许多不同的工作流管道组成,这些管道按顺序负责复杂的工作。您的 ML 系统将由许多工程师构建,并与许多不同的系统和数据源互连。
在一个适当的 ML 管道中,你将需要设计许多工作,包括抓取、生成数据、ETL、验证数据清洁度、交叉验证、监控性能和部署。很快你的模型就会变得非常复杂。如果没有合适的工具和标准的操作,在使用不同语言的多个系统和遗留系统之间进行简单的更改将需要几个小时。
复杂的管道导致您的工程工作缓慢且漏洞百出。如果治疗不好,你可能需要几个小时来做简单的改变。
3) 隐藏的反馈回路
现实世界的系统最终影响了我们的数据。假设您的销售代表发布了一项营销活动,旨在接触儿童,并积极地将他们纳入您的定价模型所使用的 CRM 系统中。
ML 模型会感知到大部分顾客购买玩具。因此,ML 模型提高了玩具价格,并过度打折昂贵的产品。然而,监控你的价格飙升,你的竞争对手的定价模型也自动填充了玩具过高的价格市场。你的系统也会这样做,恶性循环就出现了。
隐藏的反馈循环给你的 ML 系统带来了麻烦,同时由于 ML 系统之外的相互关联的数据依赖,使得调试更加困难
4)脆弱的数据依赖
想象一下,你的定价模型依赖于你的客户的性别。如果一个男生浏览化妆品,很可能他会买给妻子/女朋友作为礼物,所以支付意愿更高。你的机器学习已经准备好根据性别来决定定价了。
但是,您的业务代表在上游 CRM 中的“性别”功能之外添加了一个标签。如果你的 ML 系统看到的不是男性或女性的值,它会崩溃吗?现在模特会如何给化妆品定价?与代码依赖相比,这是非常脆弱的,因为这意味着无论何时上游系统被更新,您的模型都可能被破坏,并给出未被怀疑的特性。
在特征工程和标记过程中,由于语义不匹配,数据依赖性导致逻辑错误和质量下降。
支付你的 ML 技术债务
技术债是一种痛苦。作为 Visa 的前数据工程师和谷歌的数据科学家,我必须确保一个适当可靠的渠道保持透明和负责。我需要一个标准的操作来管理机器学习的技术和数据方面,并确保质量不会随着时间的推移而下降。
有三个小技巧可以帮助您最大限度地减少 MLOps 技术债务。
1)测试你的代码和数据
测试是技术领域最重要但不性感的角色之一。考虑测试以限制技术债务并确保 ML 生产质量仍然非常重要。在 DevOps 中,我们学习了两种类型的测试:单元测试(测试单一功能)和集成测试(测试集成功能)。然而,在 MLOps 中,我们需要建立一个 canary 流程,在投入生产之前测试 ML 管道质量。这包括测试数据依赖预分析能力以识别看不见的数据(想象一下男性/女性性别的例子)。
2)测试训练和服务值的一致性
训练模型时,您使用的是日志数据(预先记录/观察到的日志)。然而,在生产中,您将需要处理实时数据,由于时区(时间序列)、相机(图像)质量、语言等许多问题,这些数据可能会给出不同的值。跟踪记录的和实时的数据以确保质量一致性是非常重要的。
3)保守评分
对你的 ML 模型的每个测试阶段进行评分。在四个不同部门应用管道健康评分:
- **ML 基础设施:**测试下游和上游数据流质量。
- **ML 模型开发:**测试模型不包含任何被人工确定为不适合使用的特征。
- **特性和采样:**测试每个特性的分布是否符合您的预期。
- **运行 ML 系统:**在训练和服务中测试所有创建输入特性的代码和数据质量。
所有这些阶段对于部署和维护模型都很重要。将每个阶段的最低得分作为整个系统的最终得分。在投入生产之前,确保您可以最大限度地提高最低评分,以建立正确的健康标准。
简单地说,对抗技术债务就是在你的 ML 管道生命周期中的任何时候清楚地了解它。这包括数据样本、模型生成、测试以及最终的部署。
如果做得正确,您将能够:快速开发,可预测地运行您的模型,并可靠地向您的客户交付价值。
下一步是什么…
关于本文的参考资料,请参考 D.Sculley 和谷歌团队的这篇论文。
我还将谈到 Tensorflow Extended (TFX)作为一个开源工具来启动和维护您的 ML 模型。这一框架已被许多大型科技公司广泛使用,如谷歌、Twitter 和 AirBnb。希望你能和我的媒体频道保持同步。
我相信了解这一点是将你的 ML 努力转化为强大而有效的 ML 系统的第一步。
最后…
我真的希望这是一本很棒的读物,是你发展和创新的灵感来源。
请在下面评论提出建议和反馈。就像你一样,我也在学习如何成为一名更好的数据科学家和工程师。请帮助我改进,以便我可以在后续的文章发布中更好地帮助您。
谢谢大家,编码快乐:)
关于作者
Vincent Tatan 是一名数据和技术爱好者,拥有在 Google LLC、Visa Inc .和 Lazada 实施微服务架构、商业智能和分析管道项目的相关工作经验。
Vincent 是土生土长的印度尼西亚人,在解决问题方面成绩斐然,擅长全栈开发、数据分析和战略规划。
他一直积极咨询 SMU BI & Analytics Club,指导来自不同背景的有抱负的数据科学家和工程师,并为企业开发他们的产品开放他的专业知识。
最后,请通过 LinkedIn ,Medium或 Youtube 频道 联系文森特