TowardsDataScience-博客中文翻译-2021-八十七-
TowardsDataScience 博客中文翻译 2021(八十七)
数据可视化技术背后的心理学
对人类视觉信息处理世界的短暂探索
如果你是一名数据科学家,很有可能会问这样一个问题:“我如何最有效地展示我的工作成果?”在你的脑海里挥之不去。毕竟,如果你不能有效地向你的读者传达你的发现,你的代码有多优雅或者你的方法有多创新都没有用。
正如美国数学家和理论统计学家约翰·图基所说:“一张照片最大的价值在于它迫使我们注意到我们从未预料到的东西。”—摘自约翰·w·图基《探索性数据分析》,1977 年
数据可视化简史
视觉化呈现信息的想法已经过时了。例如,几千年来,人们一直在绘制他们周围的地图。然而,其他形式的数据可视化并不常见,因为大型数据集很少。这一切在 18 世纪末和 19 世纪初开始改变,许多国家开始收集和发布有关其经济、人口和天气的信息。
苏格兰政治经济学家威廉·普莱费尔(William Playfair)通常被视为数据可视化领域之父。Playfair 通常被认为发明了面积图、线图或折线图或时间系列图、条形图或条形图。1786 年他出版了 T he 商业和政治地图集;代表,通过彩色铜板图表,出口,进口,和英国的一般贸易,在一个单一的观点。此外,爱尔兰的收入和债务图表,由詹姆斯·柯里以同样的方式完成。这是已知的第一份统计信息图表出版物。

Playfair 的贸易平衡时间序列图,发表在他的商业和政治地图集,1786 年(维基百科)
认知的神经学和生物学还没有发展成为研究领域;然而,Playfair 直观地认识到,大脑处理图像比文字更好。
在 19 世纪,统计学和信息图表的使用主要在流行病学和“道德统计学”中盛行。犯罪和疾病的上升是城市化和进步的两个最重要(也是最令人不快)的后果,这些工具提供了向决策者和公众传达重要信息的有效途径。19 世纪最具标志性的信息图表之一是英国护士弗洛伦斯·南丁格尔绘制的“玫瑰图”。图表清楚地表明,战争中英国士兵死亡的主要原因是疾病,而不是战斗。在看到卫生重要性的明确证据后,女王和议会采取行动成立了一个卫生委员会,士兵的死亡率随后开始下降。南丁格尔成为第一批用数据可视化说服公众并影响公共政策的人之一。

佛罗伦萨·南丁格尔的“玫瑰图”显示了疾病(蓝色)、战争创伤(红色)和其他原因(黑色)导致的死亡。(伦敦惠康图书馆收藏)
直到 20 世纪下半叶,统计学家使用的数据可视化技术部分是直觉,部分是艺术;它们背后绝对没有科学依据。然而,随着心理学领域的几部开创性著作,这一切都开始改变了。
但在此之前,让我们先回答这个问题:人们处理视觉信息的能力比处理语言信息的能力强吗?如果有,为什么?
简而言之,他们是。丹麦物理学家托尔·诺兰德斯的“感官带宽”信息图展示了他对感官速度相对于计算机术语的研究结果。他断定的视觉可媲美 1250 MB/s,或与计算机网络相同的带宽。左下角的小半圆是我们对感官体验的认知意识所在。

“感官带宽”——左下方的小圆圈代表我们只意识到 0.7%的信息;作者图片
预先注意处理:
但这是为什么呢?简单的答案可以在神经生理学“前注意力处理”中找到
认知由大脑皮层处理,大脑皮层是推理的工具;这是一个复杂的工具,但它还没有被进化打磨,因此它相当慢。处理信息需要更多的努力。原始视觉信息由丘脑处理,丘脑是大脑中比大脑皮层更古老的部分。处理视觉刺激只需要几百毫秒(比我们处理文本或数字快得多)。因此,处理视觉数据的速度更快,并且减少了认知负荷。我们不知道我们处理视觉信息的数据量和速度。这是潜意识的。这种现象被称为“前注意加工”。
“前注意加工是对环境信息的潜意识积累。所有可用的信息都经过预先处理。然后,大脑过滤和处理重要的东西。具有最高显著性(最突出的刺激)或与一个人正在思考的内容相关的信息被选择出来,通过有意识(专注)的处理进行进一步和更完整的分析。”——来自维基百科。
现在让我们回到人类视觉认知的主题。
视觉变量
1967 年, Jacques Bertin 引入了视觉变量的概念。Bertin 不是心理学家。他是个制图师。然而,他的工作可以毫不费力地归功于他对人类心理的直觉理解。视觉变量是“人眼感知的视觉元素的差异”(wiki.gis.com)。不管你看到的是什么类型的视觉效果,这些都是区分图形符号的基本方法。
- 位置
- 大小
- 形状
- 亮度(值)
- 色调
- 方向
- 纹理
后来的研究人员,包括乔尔·L·莫里森(JL·莫里森——国际地图学年鉴,1974 年)和艾伦·麦克艾伦(T10)又增加了一些:
- 色彩饱和度
- 约定
- 清新
- 解决
- 透明度
Bertin 描述了变量感知的四个层次,这暗示了它们在数据可视化中的应用(最初,Bertin 的研究成果主要用于制图)。一个变量可以属于几个级别:
- 选择的
- 联想/分离
- 整齐的
- 数量的

Bertin 的视觉变量及其相关水平,作者图像
如果一个可视变量在应用时生成不同类别的符号,则称其为 选择性 。
如果一个可视变量在应用时不改变一个元素的可见性,那么它就被称为 关联 。也就是说,不可能用那个可视变量赋予一个元素更多的重要性。
如果一个可视变量可以用来表示一个给定的排序,那么这个可视变量被称为是 有序的 。
一个可视变量被称为 定量 除了可以被排序,还可以用来表示比率。
感知水平对数据可视化的有效性有影响。以下经验法则适用于:
- 如果你想突出图案,让你的观众容易识别,就要避免没有选择性的视觉变量(如形状)。
- 理解关联变量本质上就是意识到什么会打破地图中“千篇一律”的认知。例如,避免同时使用颜色和尺寸。
- 当绘制有一定顺序的数字数据时,在你的符号化中使用有序的视觉变量。另一方面,避免对没有自然顺序的事物使用有序变量。
- 不看图例,读者不会立即察觉到数量上的差异。此外,要知道即使有了尺寸,对数量差异的视觉估计也是不完美的。
“我们必须记住,定量感知代表一种精确的近似,而不是一种精确的测量,”— Bertin
William Cleveland 和 Robert McGill 在 1984 年进行的一项研究评估了受试者执行认知任务的情况,这取决于呈现给他们的图形的特征。他们从最准确到最不准确排列了以下视觉特征:
- (条形图, 【点阵图】 )
- 沿不对齐的位置,相同的刻度 ( 小倍数 )
- 长度、方向、角度(饼状图)
- 区域 ( 树形图 )
- 、体积(三维条形图、 面积图、 )
- 底纹,色彩饱和度 ( 热图 , choropleth 贴图 )
通过学习哪些视觉元素是大脑自动强调的,然后将这些元素整合到视觉和仪表板中,人们可以最有效地传达数据背后的故事。
- 也就是说,这并不意味着数据科学家和统计学家只需要使用条形图和散点图。克利夫兰和麦吉尔写道:
“(变量的)排序并不导致显示数据的精确规定,而是一个工作框架。”
格式塔原理在数据可视化中的应用
人脑天生就能看到结构、逻辑和模式。它帮助我们理解这个世界。即使在没有的地方。格式塔原则是由一群德国心理学家在 20 世纪 20 年代发展起来的,作为一种关于人们如何感知周围世界的理论。格式塔理论认为,人脑会通过下意识地将图像的各个部分组织成一个有组织的系统,来理解由各种元素组成的复杂图像。即使这些部分只是纯粹不相关的对象集合。

(a)由扇形黑色圆盘引起的 Kanizsa 三角形。(a)来自 1955 年的 Kanizsa(b)来自瓦兰,1971 年;来自格雷戈里 1972;(d)来自格雷戈里 1972 年;来源:核心开放存取研究论文集
人眼看到的是三角形,而不是圆形、角形和圆点。这些图像说明了我们的大脑如何努力填补空白,并为我们周围的世界带来秩序。
格式塔原理可以帮助数据可视化,但也可能破坏它。原则集可能会因来源不同而略有不同。维基百科概述了一套原则, Scholarpedia 概述了另一套原则,一些设计网站使用其他原则。有些资料只列出了五条原则,而其他资料则多达十条。但是,下图概述了最常用的原则:

格式塔原则,作者图片
它们是:
- 邻近定律
- 闭合定律
- 类似律
- 圈地定律
- 连续性定律
- 图形与背景定律
- 对称定律
- 很少有人把焦点原则称为另一个格式塔法则
格式塔原则不仅仅是学术术语;它们可以被广泛用作实用且有用的工具,用来创建清晰、信息丰富且吸引观众的视觉效果。
邻近定律
邻近定律
这一原则表明,人们对视觉元素的感知与他们彼此的位置有多近有关。
帮助有效数据可视化的建议:了解你的视觉效果的信息优先级,然后通过接近度创建分组来支持该优先级。空间接近优先于所有其他分组原则。
使用邻近原则的数据可视化示例如下所示。该条形图代表了四个国家在过去三年中在一个领域的平均投资。它按国家对数据进行分组。按年份分组会阻碍观众对各国投资的理解。

格式塔邻近原则插图,作者图像
闭合定律
闭合原理表明,当人脑看到视觉元素的复杂排列时,它会将这些元素组织成可识别的模式。我们喜欢看到尽可能简单的图形。换句话说,当人类大脑面对一个不完整的图像时,它会填空来完成图像并使其有意义。
有助于有效数据可视化的建议:这是警告性的建议;数据科学家在显示带有断点的图表时应该小心,因为人类的思维倾向于形成完整的形状,即使形状是不完整的。下面是这个原则的一个不好的应用的例子。数列中有一些数据缺失,数据的标绘揭示了差距。人类的思维会很容易地用一条平滑的线来填补这个缺口。然而,实际的系列看起来并不顺利。

格式塔闭合原理的图解,作者的图像
相似定律
相似原则表明,人脑会将看起来相似的事物组合在一起(它也倾向于赋予它们相似的功能)。大脑将颜色、形状、大小或方向相似的物品视为属于相同的组。
有助于有效数据可视化的建议:使用颜色、形状或大小将可视对象组合在一起,以讲述您的故事。相似性原则可以帮助您的受众更容易地识别显示的数据属于哪个组。在下图中,数据集中的观察值根据其在两个不同邮政编码中的位置值进行着色。因此,他们很容易被视为两个独立的群体。

格式塔相似性原理图解,作者形象
圈地定律
有时这个原则被称为共同区域格式塔原则。这是最近的格式塔原则之一;帕尔默在 1992 年引进了它。这个原则解决了这样一个事实,即包围一组对象会将我们的注意力吸引到它们身上,它们被一起处理,我们的大脑会将它们视为相互关联的。
有助于有效数据可视化的建议:将您希望被视为分组的对象封装在一个容器中。也会让他们脱颖而出。这个原则的一个很好的例子是在 Plotly 包的帮助下创建的一个可视化。它允许包含一个时间间隔,以直观显示特定时间段内就业人数的变化情况,从而吸引观众的注意力:

作者对封闭、意象格式塔法则的阐释
连续性定律
连续性定律表明,人类大脑倾向于将任何线视为其既定方向的延续。它认为人眼通过线条、曲线或一系列形状来确定设计元素之间的关系。换句话说,如果一幅画中有几条线相互交叉,人们只会把这幅画看作是交叉的线,而不是被这些线分开的页面部分。
帮助有效数据可视化的建议:连续性原则建议将可视对象排成一行,以简化分组和比较。一个很好的例子是使用按 y 值排序的条形字符。在第一个图表中,条形的高度没有按值排序,因此很难对它们进行比较。在第二张图中,观众的眼睛沿着一条连续的路径;它使整个图表可读性更好,因为向下的方向是不间断的。连续调色板有助于将观众的注意力吸引到 y 值的下降趋势上。

格式塔连续性原则的图解,作者的形象
图底定律
这个原理表明,大脑会无意识地将物体放在前景或背景中。背景-前景的正确分离是任何可视化的基本部分。背景减除是一项“大脑技术”,它允许提取连续(甚至静止)图像的前景以供进一步处理。它的工作方式与计算机处理图像的方式相同。事实上,计算机背景-前景处理模拟了人类的大脑。为了让观众顺畅地处理,前景对象必须通过数据集中的一个变量与其背景分开。
有助于有效数据可视化的建议:确保你的前景和背景之间有足够的对比度,以使图表和图形更加清晰,不会产生误导。最好选择能让你的前景图像突出的颜色和对比度。然而,没有颜色过载也是至关重要的。如果你的视觉包括颜色作为一个额外的维度(其中一个变量由颜色表示),选择一个连续的色标。否则,你可能会失去听众的注意力;图像变得过于繁忙,无法区分前景和背景,也无法消化你试图传达的信息。在下图中,我使用了黑暗的前景和非常明亮的连续刻度来吸引观众对变量之间相关性的注意。

作者对格式塔图形-背景原理、图像的阐释
对称定律
对称定律指出,相互对称的视觉元素往往被视为一个统一的群体。人们也更喜欢对称而不是不对称。对称的物体与积极的方面联系在一起,如稳定性、一致性和有序性。另一方面,不对称的排列会给人留下一种印象——某种东西缺失或失去平衡,同时将观众的注意力吸引到这种不平衡和差异上。
有助于有效数据可视化的建议:这个原则在数据可视化中并不常用;然而,当创建“之前和之后”的视觉效果或者比较两组相似的元素时,它可能是引人注目的。应用对称性原理的一个很好的例子是使用 violin 图来比较两个独立组中 y 值的分布。

格式塔对称原理图解,作者形象
焦点定律
这个原则是格式塔原则集最近增加的内容之一。焦点原则指出,视觉上突出的事物将首先抓住并抓住观众的注意力,这意味着独特的对象在视觉呈现中创建一个焦点。
有助于有效数据可视化的建议:与众不同的特征(例如,不同的颜色或不同的形状)可以用来突出和创建焦点。下面是一个说明焦点原理的例子。条形图显示了每个国家的平均葡萄酒价格。美国葡萄酒的平均价格是通过使其变红并创造一个焦点来体现的。

格式塔焦点原理插图,作者图片
摘要
人们不能不注意到视觉的格式塔原理和视觉变量理论是密切相关的。这两种方法都描述了人脑如何利用物体的颜色和大小、方向和纹理以及它们之间的对比,将我们的视觉环境组织成模式和组。格式塔理论也涉及诸如对称性和连续性等物体特征。它们对人类视觉感知至关重要的原因是我们的大脑倾向于根据趋势“预测”。
了解这些原则并应用它们有助于使数据可视化更加有效和易于理解。
致谢:
Tetiana Donska。心灵之眼—看数据可视化心理学https://medium . com/@ arinbasu/you-can-use-footnotes-that-babus % C2 % B9-6c 485 C4 eff 1e
**7 视知觉格式塔原理:UX 认知心理学https://web . archive . org/web/20181123225247/https://help . medium . com/HC/en-us/articles/215201097-How-can-I-add-a-footnote-to-a-post-
Python Glob 模块
Python 中文件名匹配的教程

里卡多·维亚纳在 Unsplash 上拍摄的照片
glob模块是 Python 标准库的有用部分。glob(global 的缩写)用于返回所有匹配特定模式的文件路径。
我们可以使用glob来搜索特定的文件模式,或者更有用的是,通过使用通配符来搜索文件名匹配特定模式的文件。
根据维基百科,“glob模式指定了带有通配符的文件名集合”。
这些模式类似于正则表达式,但要简单得多。
- 星号(*):匹配零个或多个字符
- 问号(?)只匹配一个字符
虽然glob可以用来搜索一个有特定文件名的文件,但我发现它在阅读几个同名文件时特别方便。识别这些文件后,可以将它们连接成一个数据帧,以供进一步分析。
这里我们有一个输入文件夹,其中有几个包含股票数据的 csv 文件。让我们使用 glob 来标识文件:
全局示例
这里,我们读入输入文件夹中的所有 csv 文件,并将它们连接成一个数据帧。
在下面的示例输出中,我们可以看到一个小问题——我们不知道该行属于哪个文件。股票代码只是每个文件的名称,并不包含在我们的连接数据帧中。

球状数据帧
我们可以通过添加一个带有股票代码的附加列来解决缺少股票代码的问题。
我们用文件名创建一个新列,然后使用replace清除数据,删除不需要的文件扩展名:
具有从文件名创建的列的 Glob 示例
这样看起来好多了!我们现在可以知道每一行属于哪个股票了!

添加了跑马灯的数据帧
现在我们有了一个包含所有股票数据的有用的数据框架。这可以用于进一步的分析。
glob模块对于在文件中查找文本也非常有用。我广泛使用glob来识别具有匹配字符串的文件。
许多(许多,许多)次,我知道我已经写了我需要的代码,但是不记得在哪里找到它,或者我需要找到包含需要删除或更新的特定电子邮件地址或 h̵a̵r̵d̵-̵c̵o̵d̵e̵d̵值的每个程序。
首先,我们可以使用 glob 来查找目录及其子目录中与搜索模式匹配的所有文件。然后,我们将文件作为字符串读取,并搜索匹配的搜索模式。
例如,我知道我以前画过一个 KDE 图,但是我不记得在哪里找到了。
让我们找到所有的.ipynb文件并搜索字符串“kdeplot”:
查找字符串匹配的 Glob
我们找到了两个包含字符串“kdeplot”的文件!这个文件,superhero_exploratory_analysis.ipynb应该就是我们要找的。
另一个文件— glob_tutorial.ipynb是这个例子所在文件的名称,所以它肯定不是我们要寻找的创建 KDE 图的例子。
这个例子中有两个项目与上面的不同:我们指定了recursive=True,并且使用了iglob而不是glob。
添加参数recursive=True告诉glob搜索所有子目录以及ml_guides目录。如果我们不确定我们的搜索词将在哪个文件夹中,这将非常有帮助。
当没有指定recursive参数,或者将其设置为False时,我们只在搜索路径中指定的文件夹中进行搜索。
搜索大量目录可能需要很长时间,并会占用大量内存。对此的解决方案是使用iglob。
iglob与glob的不同之处在于,根据文档,它返回一个迭代器“产生与glob相同的值,而不是同时存储它们”。与glob相比,这将提供更好的性能。
结论
在这里,我们回顾了 Python 的glob模块和这个强大的 Python 标准库资产的两个用例。
我们演示了如何使用glob来查找目录中匹配给定模式的所有文件。然后将这些文件连接成一个数据帧,用于进一步分析。
我们还讨论了使用iglob递归搜索包含给定字符串的文件的目录。
本指南只是简要介绍了glob模块的一些可能用途。我想看看你想出的使用它的方法!
快乐环球!
python 模块将彻底改变您的命令行技能
节省时间,避免初学者在使用 CLI 时常见的错误

如果你花了 5 分钟的时间在电脑上,你很有可能用过 CLI(命令行界面)。您遇到了一些问题,比如不能使用键盘快捷键(Control-C、Control-V)进行拷贝和粘贴,或者不能轻松地存储上一个命令的输出,等等。
如果您计划在将来使用命令行,使用 python 脚本来帮助跟踪您的 CLI 是一项很好且容易掌握的技能。
如果您还不是会员,请在这里获得您的中级会员资格!
Python 操作系统模块
这个 python 模块允许自动执行操作系统任务。它提供了创建和删除目录(文件夹)、获取其内容、更改和识别当前目录等功能。
更重要的是,OS 模块允许您与 Python 可能运行的任何底层操作系统(Windows、Mac 或 Linux)进行交互。
创建您的脚本
第一步是导入操作系统模块
import os
列出当前工作目录中的文件:
这可以通过许多方式来实现,最直接的两种方式包括使用 os.system 调用和传入命令“dir”。
files = os.system("dir")
否则,我们可以使用内置函数“listdir ”,它打印路径指定的目录。
files = os.listdir("/user/directory/name")

打印目录中的文件
导航到您的根目录
一个非常有用的方法是从根目录或主目录开始。这可以通过调用
from pathlib import Path
home = str(Path.home())
输出如下所示:用户\你的名字
例如,如果您想导航到您的下载文件夹,唯一需要做的事情是添加文件夹名称。使用' chdir '改变目录功能。
home + "\Downloads" = "User\yourname\Downloads"
a = os.chdir(home + "\Downloads")
这将执行一个字符串连接,创建一个从主目录到下载文件夹的路径。
将命令的输出保存在文件中
如果你要生成一个秘密令牌,或者检查一个目录中文件的状态,等等,能够快速地将输出保存在你所在的本地目录的一个文本文件中是很有用的。
这将创建一个空的文本文件,我们将在其中追加最近一次运行的输出。
log = open('output.txt', 'a')
子进程模块允许您生成新的进程,连接到它们的输入/输出/错误管道,并获得它们的返回代码。
c = subprocess.Popen(['dir', '/p'], stdout = log, shell = True)
在本例中,我将“dir”命令的输出保存在 output.txt 文件中(保存在本地变量 log 中)。因此,output.txt 文件将包含我工作的目录中的文件和文件夹列表。
如果我想分析我的文件的内容,我只需要在我的 python 脚本中将它作为一个字符串打开:
f = open(home+"\Downloads\output.txt", "r")
mystr = f.read()
非常感谢你的阅读!
更多类似的文章,请在 Medium 这里找到我!
如果你有任何关于如何改进的问题、建议或想法,请在下面留下评论或通过 LinkedIn 这里取得联系。
量子位阶段
量子世界不是一个圆盘
本帖是本书的一部分: 用 Python 动手做量子机器学习 。
霍雷肖,天地万物比你的哲学所梦想的要多得多
(哈姆雷特(1 . 5 . 167–8),哈姆雷特对荷瑞修)

改编自考夫曼 1789 年的一幅画,公共领域
你还记得我们介绍的量子硬币的例子吗?硬币有两种状态,正面或反面。在空气中,我们的量子硬币处于两种状态的叠加状态。
让我们仔细看看这枚硬币。它不断地在正面和反面之间翻转。一旦硬币落地,这个旋转决定了我们看到的是正面还是反面。
再仔细看看。这枚硬币也沿着它的边缘旋转。

作者弗兰克·齐克特的图片
乍一看,旋转对于头和尾的方向并不重要。但它会影响硬币在空中的轨迹。这关系到硬币落地后的方向,不是吗?
在量子力学中,粒子也有这样的自旋。就是这个阶段。在物理术语中,量子力学阶段源于这样一个概念,即每个量子实体不仅可以描述为粒子,也可以描述为波。
关于光本质上是粒子还是波的争论可以追溯到三百多年前。在十七世纪,艾萨克·牛顿宣称光是由一系列粒子组成的。大约两百年后,在十九世纪,托马斯·杨反驳光是由波组成的。他设计了双缝实验来证明他的主张。
在这个实验中,一束光对准一个有两个垂直狭缝的屏障。光线穿过狭缝,产生的图案被记录在照相底片上。
如果一个狭缝被盖住,就会有一条光线,与打开的狭缝对齐。直觉上,如果两个狭缝都打开,我们会看到与狭缝对齐的两条线。但是其他的事情发生了。照相底片被完全分成不同程度的多条明暗线。

作者弗兰克·齐克特的图片
如果你把光看成是一束粒子,那么杨的实验的含义是反直觉的。但是一旦你开始把光想象成一种波,这就非常有意义了。
波浪的主要特征是它在运动时上下起伏。这需要多种其他特征。
- 波长是波的形状重复的距离。
- 波的振幅是波的中心和波峰之间的距离。
下图描述了这些特征。

作者弗兰克·齐克特的图片
波的另一个明显特性是它们会互相干扰。简单来说,它们加起来。如果有两个波在同一介质中传播,它们会形成第三个波,代表每个点的振幅之和。
例如,如果有两个相同的波,它们的波峰在同一点,那么产生的波就有更大的振幅。

作者弗兰克·齐克特的图片
但是,如果波浪移动,使得一个波浪的波峰与另一个波浪的波谷重叠,它们就相互抵消了。

作者弗兰克·齐克特的图片
这两种波具有相同的振幅和相同的波长。但是它们的波峰和波谷的相对位置不同。这个相对位置就是波的相位。
对于外界来说,波的相位是不可观测的。单独观察,这两个波看起来是一样的。但是一旦波相互干涉,相位就很重要了。
让我们回到双缝实验,看看两个波是如何从狭缝传播到屏幕的。这两个狭缝到屏幕上任何给定点的距离都不同。由于一种波比另一种波传播的距离更长,所以屏幕上每一点的相对位置都不同。在某些时候,它们以相同的相位击中屏幕。它们建设性地干涉并照亮了这个区域。在其他点,一个波在波峰,而另一个在波谷。它们相消干涉,该区域保持黑暗。

作者弗兰克·齐克特的图片
量子位(qubit)是一种量子力学实体,我们可以将其描述为波。它也有一个阶段。
量子位处于|0⟩态和|1⟩态的叠加态,α和β是相应的振幅。数学上,叠加被定义为|ψ⟩=α|0⟩+β|1⟩.观察时量子位产生0的概率等于α^2 和β^2 产生1。因此,α2+β2=1 是因为所有可能状态的概率总和必须等于 1 (100%)。
振幅的符号对于最终的测量概率并不重要。与波类似,振幅为负的量子位与原始量子位具有相同的测量概率。
从图形上看,量子位状态是一个矢量。矢量是有方向的。矢量和负矢量(方向相反)是有区别的。但是测量概率被定义为量子位状态向量的头部和标准基向量|0⟩和|1⟩.之间的距离距离没有方向。
例如,美国

具有相同的测量概率。任何一对状态|ψ⟩和
|ψ′⟩也是如此,它们的状态向量镜像在 z 轴上,如下图所示。

作者弗兰克·齐克特的图片
作为波,两种状态|ψ⟩和|ψ′⟩表示两个波长移动了一半的波。一方的顶峰是另一方的低谷。
量子位的概念让我们能够区分两个相反的相位。但是一个量子位可能存在的所有其他相位呢?与波类似,相位可以是任意值。我们能制定的唯一有意义的限制是,一旦相位超过波长,它就会重复。它可能会提醒你我们用来旋转量子位状态向量并改变其振幅的角度θ(见这篇文章)。
事实上,我们可以将量子位相位表示为一个角度ϕ(希腊字母“phi”),它跨越一个围绕中心的圆,并且与振幅的圆正交。这个圆使用了另一个维度。
在下图中,角度θ描述了量子位产生|0⟩或|1⟩的概率,角度ϕ描述了量子位所处的相位。

作者弗兰克·齐克特的图片
这两个圆围绕中心形成一个球体。这个球面被称为布洛赫球面。
布洛赫球提供了测量量子位的相位和概率的视觉参考,作为|0⟩或|1⟩.的基态在这个球体中,决定测量幅度的角度θ围绕 Y 轴旋转。相应地,我们到目前为止使用的 RY-gate 围绕这个轴旋转量子位状态向量。它在基础状态|0⟩和|1⟩.中切割 z 轴如果我们不应用相移,它就“躺”在 X 轴跨越的平面上。但是一旦量子位状态有了不同的相位,它就从这个平面上升起。
确定相位的角度φφ围绕 Z 轴旋转。因此,量子位相位的任何变化都不会影响 z 轴或 z 轴上任何点的接近度,例如表示 z 轴顶部和底部的基态|0⟩和|1⟩。
因此,相位不影响测量概率。
从数学上来说,我们可以使用三维向量来创建三维球体,例如

然而,第三个维度对测量概率很重要。量子位相位将等同于其他两个维度。
相反,我们用二维向量实现了一个三维球体

因为α和β是复数。复数是一个可以用 a+b⋅i 的形式表示的数,其中 a 是实部 b⋅i 是虚部。 i 表示满足等式 i^2=−1 的虚数单位。因为没有实数满足这个等式,所以部分 a 和 b⋅i 彼此独立。因此,我们不把一个复数表示成一条线,比如我们表示实数。但是复数形成一个平面。复数是二维的。

作者弗兰克·齐克特的图片
复数扩展了测量概率α和β的概念。但是为了对我们的目的有用,我们仍然要求α和β之间的关系用|α|2+|β|2=1.方程来归一化
因为α和β是复数(α,β ∈ C),所以在对它们的平方求和之前,必须取绝对值。简单的正方形已经不够了,因为 i^2=−1.
在的这篇文章中,我们介绍了量子比特状态的极性形式,其中角度θ控制测量量子比特在状态0或1的概率。

我们只需要将相位应用于两个振幅中的一个。以|−⟩为例。我们可以用两种方式来表示它。

如果我们将-加到两个参数上,我们将得到|+⟩.态

按照惯例,我们把相位放在状态|1⟩.的振幅上
但是我们如何表达阶段呢?我们知道它是ϕ.角的函数让我们把这个插入到函数中。

事实上,我们知道 f(ϕ).的一些特点对ϕ=0 来说,我们预计不会有任何变化。因为我们用β=sinθ/2 乘以 f(ϕ,所以在这种情况下,f(ϕ必须等于 1。因此,f(0)=1。
此外,随着一个完整波长的移动,我们最终处于相同的相位。由于归一化,量子位的波长是 2π——一个圆的周长。因此,f(2π)=1。偏移半个波长,我们就有效地抵消了原来的波。因此,f(π)= 1。
下图用图形描绘了 f(ϕ。我们可以看到它的输出是 f(ϕ)=cos(ϕ)+i⋅sin(ϕ).

作者弗兰克·齐克特的图片
莱昂哈德·欧拉发现我们可以用 f(ϕ)=cos(ϕ)+i⋅sin(ϕ)=e^iϕ来描述这样一个函数。这个方程被称为欧拉公式。
这给了我们精确的量子位状态向量

“但是 e^iϕ 对测量概率不重要吗?”
振幅 e^ix 的部分使它成为一个复数。它有一个实部和一个虚部。当我们计算测量概率时,我们平方振幅的绝对值。
那么,我们来看看复数绝对值的平方是什么意思。假设我们有一个复数 c=a+bi
复数 c 的绝对平方通过将其乘以其复共轭来计算。复数的共轭(记为 c∫)是虚部符号反过来的数。在我们的例子中,这是 c∑= a bi。这就是所谓的平方范数。它被定义为| c | 2 = c∫c
通过应用第三个二项式规则并插入 I2 = 1 的定义,我们可以将该公式转换如下。

现在,如果复数是由 c=e^ix=cos(ϕ)+i⋅sin(ϕ给出的),我们可以看到 a=cos(ϕ)和 b=sin(ϕ).
按照毕达哥拉斯的“恒等式(用直角三角形表示),sin(ϕ和 cos(ϕ的平方和)是 1。因此,我们可以声明

结论
所以不管相位是什么,它的绝对平方都是 1。1 是乘法的中性元素。我们乘以 1 的数保持不变。
复数允许我们在不接触测量概率的情况下增加量子位相位的维度。虽然这会影响量子位状态的振幅,但不会影响测量概率。
在这篇文章中,我们了解了量子位的相位。尽管我们不能直接测量相位,但我们展示了如何将它添加到量子态中。
角度θ描述了量子位产生|0⟩或|1⟩的概率,ϕ描述了量子位所处的相位。
本帖是本书的一部分: 用 Python 动手做量子机器学习 。

在这里免费获得前三章。
构建数据平台的快速指南
有很多技术可以用来构建数据平台,但是您真正需要的是什么呢?

我们从客户那里得到的最常见的问题之一是“我如何构建我的 数据平台 ?
对于大多数组织来说,构建数据平台不再是一件好事,而是一件必须要做的事情,许多公司基于从数据中收集可行见解的能力,在竞争中脱颖而出。
尽管如此,证明从头开始构建数据平台所需的预算、资源和时间表说起来容易做起来难。每家公司都处于其数据之旅的不同阶段,因此更难确定首先投资平台的哪些部分。像任何新的解决方案一样,您需要 1)围绕产品能提供什么和不能提供什么来设定预期,2)为长期和短期投资回报做好计划。
为了让事情变得简单一点,我们列出了您需要在数据平台中包含的 6 个必备层,以及许多最佳团队选择实施它们的顺序。
介绍:6 层数据平台
仅次于“我如何构建我的数据平台?”,我得到的最常见的问题是“我从哪里开始?”
不言而喻,构建数据平台不是一种一刀切的体验,我们讨论的层(和工具)只是触及了当今市场上可用的表层。一家拥有 5000 名员工的电子商务公司的“正确”数据堆栈,与一家拥有 200 名员工的金融科技初创公司的“正确”数据堆栈会有很大不同,但所有数据平台都必须有一些核心层。
谨记:就像你不能建造一个没有地基、框架和屋顶的房子一样,归根结底,没有这 6 层中的每一层,你也无法建造一个真正的数据平台。但是你如何选择建立你的平台完全取决于你自己。
下面,我们分享了“基本”数据平台的样子,并列出了每个领域的一些热门工具(您可能正在使用其中的几个):

现代数据平台由六个基础层组成,包括数据摄取、数据存储&处理、数据转换&建模、商业智能&分析、数据观察和数据发现。图片由蒙特卡洛提供。
数据摄取
第一层?数据摄取。
除非首先被吸收,否则数据无法被处理、存储、转换和应用。几乎所有现代数据平台都需要从一个系统向另一个系统接收数据。随着数据基础架构变得越来越复杂,数据团队面临着从各种来源获取结构化和非结构化数据的挑战。这通常被称为提取转换加载(ETL)和提取加载转换(ELT)的提取和加载阶段。

像 Fivetran 这样的数据摄取工具使得数据工程团队可以很容易地将数据移植到他们的仓库或湖泊中。图片由five tran提供
下面,我们概述了该领域的一些流行工具:
- Fivetran —领先的企业 ETL 解决方案,管理从数据源到目的地的数据交付。
- Singer —一个开源工具,用于将数据从任何来源移动到任何目的地。
- Stitch —一个基于云的开源平台,让你可以快速地将数据从任何来源移动到任何目的地。
- Airbyte——一个开源平台,让你轻松同步应用程序中的数据。
- Apache Kafka—一个开源事件流平台来处理流分析和数据摄取
尽管当今市场上普遍存在摄取工具,但一些数据团队选择构建自定义代码来从内部和外部来源摄取数据,许多组织甚至构建自己的自定义框架来处理这项任务。
编排和工作流自动化,包括像 Apache Airflow 、 Prefect 和 Dagster 这样的工具,也经常被合并到摄取层。编排通过获取孤立的数据,将其与其他来源结合起来,并使其可用于分析,使接收更进了一步。
不过,我认为,在处理存储、处理和商业智能层之后,编排可以(也应该)被编织到平台中。毕竟,没有功能数据的管弦乐队,您就无法进行编排!
数据存储和处理
构建完摄取层后,您需要一个存储和处理数据的地方。随着公司将其数据环境迁移到云,云原生数据仓库、数据湖,甚至数据湖库的出现已经占领了市场,为存储数据提供了相对于许多内部解决方案来说更容易访问且更经济实惠的选择。
您是选择数据仓库、数据湖还是两者的组合,完全取决于您的业务需求。最近,在构建数据堆栈时,围绕是使用开源还是闭源解决方案有很多讨论(在 Snowflake 和data bricks’营销团队之间的对话真正揭示了这一点)。
无论你站在哪一边,你都会发现在不投资云存储和计算的情况下构建一个可扩展、灵活的数据平台是一项挑战。

在快速扩展数据平台方面,云数据仓库 Snowflake 是数据团队的热门选择。图片由 雪花 提供
下面,我们重点介绍当今云仓库、湖或[在此插入您自己的变化]环境中的一些领先选项:
- 雪花 —最初的云数据仓库,雪花为数据团队提供了灵活的支付结构,用户为计算和存储数据支付单独的费用。
- 谷歌 BigQuery —谷歌的云仓库 BigQuery 提供了一种无服务器架构,由于并行处理,允许快速查询,以及可扩展处理和内存的单独存储和比较。
- 亚马逊红移 —亚马逊红移是使用最广泛的选项之一,位于亚马逊网络服务(AWS)之上,可以轻松与该领域的其他数据工具集成。
- Firebolt—一个基于 SQL 的云数据仓库,据称其性能比其他选项快 182 倍,因为由于采用了新的压缩和数据解析技术,该仓库处理数据的方式更轻松。
- 微软 Azure%3A%20389/55.49K)——微软的云计算参赛者在这个名单中常见于利用大量 Windows 集成的团队。****
- 亚马逊 S3——结构化和非结构化数据的对象存储服务,S3 给你计算资源,让你从零开始构建数据湖。
- data bricks—data bricks 是 Apache Spark 即服务平台的先驱,它为用户提供了利用结构化和非结构化数据的选项,并提供了数据湖的低成本存储功能。
- https://www.dremio.com/—dre mio 的数据湖引擎为分析师、数据科学家和数据工程师提供了一个集成的自助式数据湖界面。
- starbrust—starbrust 提供 PrestoSQL(现在的 Trino)作为托管服务,让你的湖中数据的分析和访问变得更加容易。****
数据转换和建模
数据转换和建模经常互换使用,但它们是两个非常不同的过程。当您转换数据时,您正在获取原始数据并用业务逻辑对其进行清理,以便为分析和报告准备好数据。当您对数据建模时,您正在创建数据的可视化表示,以便存储在数据仓库中。

dbt 是一个充满活力的开源社区,它为精通 SQL 的数据分析师提供了轻松转换和建模数据的能力,以供平台的商业智能层使用。图片由蒙特卡洛提供。
下面,我们分享一个常用工具列表,数据工程师可以利用这些工具对数据进行转换和建模:
- dbt——data build tool 的缩写,是在将数据加载到您的仓库后对其进行转换的开源领导者。
- 数据表单 —现在是谷歌云的一部分,数据表单允许你将仓库中的原始数据转换成商业智能和分析工具可用的东西。
- 【SSIS】【Sequel Server Integration Services(Sequel Server Integration Services)——由微软托管,SSIS 允许您的企业从各种来源提取数据并进行转换,然后您可以使用这些数据加载到您选择的目的地。
- 自定义 Python 代码和Apache air flow——在 dbt 和 Dataform 这样的工具兴起之前,数据工程师一般都是用纯 Python 编写自己的转换。虽然继续使用定制代码来转换数据可能很诱人,但它确实增加了出错的机会,因为代码不容易复制,而且每次执行过程时都必须重写。****
数据转换和建模层将数据转化为更有用的东西,为其旅程的下一阶段做好准备:分析。
商业智能(BI)和分析
如果您的员工不能使用您收集、转换和存储的数据,那么这些数据对您的业务毫无用处。
如果数据平台是一本书,BI 和分析层将是封面,充满了引人入胜的标题、视觉效果和数据实际上试图告诉您的内容的摘要。事实上,当最终用户描绘数据平台时,他们通常会想到这一层,这是有充分理由的:它使数据具有可操作性和智能性,没有它,您的数据就没有意义。

Tableau 是一款领先的商业智能工具,为数据分析师和科学家提供了构建仪表盘和其他可视化工具的能力,从而为决策提供支持。图片来自 画面 。
下面,我们概述了一些在顶级数据团队中流行的 BI 解决方案:
- Looker —一个针对大数据优化的 BI 平台,允许您的团队成员轻松协作构建报告和仪表盘。
- Tableau —通常被称为 BI 行业的领导者,它有一个易于使用的界面。
- 模式 —一个协作式数据科学平台,将 SQL、R、Python 和可视化分析整合在一个 UI 中。
- Power BI —一款基于微软的工具,可轻松与 Excel 集成,并为团队中的每个人提供自助式分析。
此列表并不全面,但它将帮助您开始为您的堆栈寻找合适的 BI 层。
数据可观察性

数据可观察性为团队提供了数据信任的整体视图,涵盖了可观察性的五个关键支柱,包括新鲜度、模式和沿袭(如上图所示)。图片由蒙特卡洛提供。
随着数据管道变得越来越复杂,组织越来越依赖数据来推动决策制定,对获取、存储、处理、分析和转换这些数据以使其值得信赖和可靠的需求变得前所未有。简而言之,组织再也承受不起 数据宕机 的后果,即不完整、不准确、缺失或错误。
通过将相同的应用程序可观察性和基础架构设计原则应用于我们的数据平台,数据团队可以确保数据可用且可操作。在我们看来,基于糟糕的数据做出决策往往比根本没有数据更糟糕。
您的数据可观测性图层必须能够针对以下可观测性支柱进行监控和警报:
- 新鲜度:数据是最近的吗?最后一次生成是什么时候?包含/省略了哪些上游数据?
- 分布:数据是否在可接受的范围内?格式是否正确?完成了吗?
- 卷:数据都到了吗?
- 模式:什么是模式,它是如何改变的?谁做了这些改变,原因是什么?
- 沿袭:对于给定的数据资产,受其影响的上游来源和下游资产是什么?谁是生成这些数据的人,谁是决策的依据?

数据可观察性将提醒数据工程团队注意影响关键数据集的异常情况,减少白噪声并根据历史数据绘制事件图。图片由蒙特卡洛提供。
一个有效、主动的数据可观察性解决方案将快速、无缝地连接到您现有的堆栈,提供端到端的沿袭,允许您跟踪下游的依赖关系。此外,它将自动监控您的静态数据,而无需从您的数据存储中提取数据。这种方法可确保您满足最高级别的安全性和合规性要求,并扩展到要求最苛刻的数据量。
数据发现

最佳数据发现解决方案将提供表和资产所有者、链接、查询日志和其他元数据的自动化动态概览,从而提供对数据的丰富理解和联系。图片由蒙特卡洛提供。
在构建数据平台时,大多数领导者会选择(或构建)一个数据目录,在我们看来,这种方法已经不够了。
不要误解我的意思:数据目录很重要,现代数据团队需要一种可靠的、可扩展的方法来记录和理解关键数据资产。但是,随着数据变得越来越复杂和实时,底层平台的流程和技术也需要发展。
传统的 数据目录往往达不到 (即手动、扩展性差、缺乏对非结构化数据的支持等。),数据发现收拾残局。如果说传统数据目录是一张地图,那么数据发现就是您智能手机的导航系统,它会根据最新的见解和信息不断更新和完善。
至少,数据发现应该满足以下需求:
- 自助式发现和自动化:数据团队应该能够轻松利用他们的数据目录,而无需专门的支持团队。针对数据工具的自助服务、自动化和工作流编排消除了数据管道各阶段之间以及流程中的孤岛,使理解和访问数据变得更加容易。更好的可访问性自然会导致更多的数据采用,从而减轻您的数据工程团队的负担。
- 随着数据发展的可扩展性:随着公司接收越来越多的数据,非结构化数据成为常态,扩展以满足这些需求的能力对于您的数据计划的成功至关重要。数据发现利用机器学习来获得数据资产扩展时的鸟瞰图,确保您的理解随着数据的发展而变化。通过这种方式,数据消费者可以做出更加明智的决策,而不是依赖过时的文档或更糟糕的基于直觉的决策。
- 数据运行状况的实时可见性:与传统的数据目录不同,数据发现提供了数据当前状态的实时可见性,而不是其“编目”或理想状态。由于发现包括消费者如何接收、存储、聚合和使用您的数据,因此您可以收集一些见解,例如哪些数据集已经过时,可以废弃,给定的数据集是否符合生产质量,或者给定的表上次更新的时间。
- 对治理和仓库/湖泊优化的支持:从治理的角度来看,在湖泊中查询和处理数据经常使用各种工具和技术(Spark on Databricks for this,Presto on EMR for that,等等)。),因此,通常没有一个单一的、可靠的读取和写入的真实来源(就像仓库提供的那样)。一个合适的数据发现工具可以作为事实的中心来源。
数据发现使数据团队能够相信他们对数据的假设与现实相符,从而跨您的数据基础架构实现动态发现和高度可靠性,而不管域如何。
构建或购买您的 6 层数据平台?看情况。
构建一个数据平台并不是一件容易的事情,在此过程中,有很多不可忽视的东西需要考虑。我们的客户面临的最大挑战之一是,他们是否应该只在内部构建某些层,投资 SaaS 解决方案,或者探索开放源代码的广阔世界。
我们的答案?除非你是 Airbnb、网飞或优步,否则你通常需要包括这三者。
这些解决方案各有利弊,但您的决定将取决于许多因素,包括但不限于:
- 您的数据团队的规模。数据工程师和分析师已经够忙的了,要求他们开发一个内部工具可能会比你想象的花费更多的时间和金钱。简单地说,精益数据团队没有时间让新的团队成员使用内部工具来提高速度,更不用说构建它们了。在非优步/Airbnb/网飞数据团队中,投资于易于配置、自动化或流行的解决方案(即开源或低代码/无代码 SaaS)正变得越来越普遍。****
- 您的组织存储和处理的数据量。在选择解决方案时,选择一个能够随您的业务扩展的解决方案非常重要。如果您需要的只是几行代码来完成工作,那么对于一个 20 人公司的独狼数据分析师来说,采用每年$10K 的转换解决方案是没有意义的。
- 您的数据团队的预算。如果您的团队预算有限但人手很多,那么开源选项可能非常适合您。但是,请记住,在跨数据堆栈设置和实现开源工具时,您通常是独自一人,经常依赖社区的其他成员或项目创建者自己来构建和维护功能。当你考虑到只有大约 2%的项目在头几年后有所增长时,你必须小心你的分叉。
无论您选择哪条道路,构建这些核心层都将为您提供发展和扩展的基础,最重要的是,提供您的公司可以信赖的见解和产品。
毕竟有时候最简单的方法就是最好的方法。
我们错过了什么吗?向 巴尔摩西 或 利奥加维什 提出任何意见或建议。
如果你有兴趣学习更多关于数据可观察性的知识,请联系其余的 蒙特卡洛团队 。
本文由 Lior Gavish 合著。

使用 Python 制作自己的数据集的快速指南
使用 Google Sheets API 和 Streamlit 从您的用户那里收集和存储数据

你有没有想过从你的用户那里收集数据并试图建立你自己的数据集有多难?
在本文中,我介绍了一个简单的数据收集过程,您可以将它应用到您自己的用例中,并轻松地收集和存储数据,所有这些都在一个小时之内完成。
我们使用 Streamlit 构建网页来托管我们的数据收集用户界面,然后使用Google Sheets API以及一个很酷的 Python 包来存储用户输入的数据。
我们开始吧👇
第一步—构建用户界面
Streamlit 是一个简洁的 Python 工具,可以轻松启动交互式、美观大方的 web 应用程序。您可以用一行代码安装:
pip install streamlit
现在,我们可以开始制作一个脚本,在我们的网页中包含一些文本和其他数据收集部件!
如果你是 Streamlit 的新手,我有一个简单的入门指南,可以帮助你快速上手。文章在这里。你可以在读完那篇文章后再来看这篇文章,或者你也可以跟着这里,因为它不会太高级。
在创建一个新文件app.py之后,让我们开始为我们的页面添加一个标题:
st.title(‘My Wholesome Data Capture Project’)
然后,你可以包括一些你想为你的用户做的事情的描述:
st.write("My app wants to collect data from you about...")
接下来,您可以开始使用简单的小部件收集用户输入,例如:
st.subheader('Add a new item')
name = st.text_input('Enter the item name') # to collect text input
你有各种各样的小部件可以选择,比如选择框、文本区、滑块、文件选择器等等,我在我的文章 中已经提到了其中的大部分。
一旦您满意地构建了它们,就可以开始启动您的 streamlit 服务器了:
streamlit run app.py
现在,您应该能够通过导航到localhost:8000在浏览器中看到输出!
将 Google Sheets API 连接到我们的应用程序
将应用程序连接到 Google Sheets 以收集数据有两个步骤。
- 从您的 Google Cloud 控制台启用 API:转到此链接并选择启用 Google Sheets API。
窗口应该如下所示:

启用工作表 API
- 点击启用。如果你还没有在谷歌云控制台中创建新项目,现在就开始吧。
- 接下来,点击凭证,然后创建一个 API 密钥。
- 按下服务账户上方的管理服务账户。
- 点击最近创建的服务账户旁边的 ⋮ 按钮,选择管理密钥,然后点击添加密钥 → 创建新密钥。
- 选择 JSON 键类型,点击创建。

为您的服务帐户创建 JSON 密钥
您现在可以下载一个 json 文档,其中包含您连接到 Streamlit Python 应用程序到 Google Sheets 应用程序的所有服务帐户凭据。
暂时将其保存在您的项目文件夹中。
最后一步—安装 gspread
这个很酷的 python 库使得 Google Sheets 更容易集成到我们的 Python 应用程序中。安装简单:
pip install gspread
你可以在浏览器中打开一个新的谷歌表单,并启用链接共享。这很重要,因为它允许 sheets API 将数据写入电子表格。
现在,我们可以将电子表格与我们的 streamlit 应用程序连接起来。
进入 app.py ,写一个名为'**save_into_csv**'的新函数!
import gspreaddef save_into_csv(name, author, link, pair, summ):
gc = gspread.service_account(filename='credentials.json')
sh = gc.open_by_url('your google sheet url')
worksheet = sh.get_worksheet(0)
在这里,确保您的来自 Sheets API 的 credentials.json 与您的 app.p y 文件在同一个目录中。
现在,您可以开始将用户捕获的输入数据写入电子表格:
worksheet.append_row([your user input items])
如果你愿意,在使用这个应用程序之前,确保先在你的电子表格中设置列标题!这样,所有捕获的用户数据都将保存到您定义的列标题下的相应列中。
另外,向用户显示提交的信息可能也是一个好主意。您可以使用 Streamlit 键入一条消息,如下所示:
st.write('Submitted to database!')
结束…
这就是全部的代价!您已经准备好收集您的用户数据并创建自己的数据集了!😄
我希望这篇教程是有用的,并且你现在能够更深入地研究 Sheets API 和 gspread 库的一些细微差别。如果你想探索的话,还有很多,在这个初学者项目之后,你应该准备好去做了!
喜欢我的文章吗?成为 中等会员 继续无限制学习。如果你使用那个链接,我会收取你一部分会员费,不需要你额外付费。这将帮助我支持我的写作努力:)
如果你喜欢读我的书,也可以考虑跟着我读。
在这个库中还有我从我的文章中收集的令人惊叹的数据科学资源。去看看!
我的几篇文章你可能也想看看:
在 Python 中使用环境变量快速指南
在您的数据科学应用中轻松设置应用机密、加载和检索它们。

在我们的日常工作中,我们都遇到过在公共版本控制系统(如 Git )上共享特定内容之前,对我们的应用程序隐藏这些内容的需求。
你可能会处理你的 SQL 数据库名称和网址,它们的密码,一些与 AWS 或谷歌云平台用户组相关的密钥,API 秘密,等等。
每个应用程序都有自己的怪癖,总有一段时间我们不喜欢将这些应用程序的秘密直接硬编码到我们的代码库中。
幸运的是,我们有了环境变量的概念,为我们提供了一种配置 Python 应用程序的好方法,在处理这种秘密时,不需要对我们的源代码做任何修改。
在这篇小文章中,我将分享我在自己的数据科学项目中使用环境变量的方式。
我们开始吧👇
直接将它们提供给当前的 bash 会话
这是在 Python 或其他语言中配置环境变量的最简单的方法之一。
您只需导出它们,使它们在您当前的 bash 会话中可见,这意味着在您使用终端而不关闭之前,您将能够通过您的代码访问您设置的所有变量。
它就像键入和输入一样简单:

请注意,必须完全按照我显示的那样输入,两边的等号之间不能有空格,双引号内的密钥也不能有空格。
好的,太好了!这看起来很简单,对吗?
接下来,让我向您展示另一种方法,但这种方法会稍微持久一些。
在应用程序中使用. env 文件
老实说,在 bash 中逐个设置每个环境变量会变得非常不方便,当您关闭 terminal 选项卡时就会丢失它们。
此外,您还需要知道如何在您的操作系统上正确地这样做——显然,它在 Windows 上的工作方式与基于 Unix 的系统不同。
因此,我通常做的是通过一个管理我所有的环境变量。env 文件,可以保存在我的 app 里面。
它在各种操作系统下的工作方式完全相同,并且易于安装和使用我们的 Python 应用程序。
做一个新的。env 文件,并在其中设置所有变量,然后保存,例如:

就是这样!您所有的变量都可以设置一次,您可以完全忘记它们与 bash 的关联。
另外,不要忘记在您的中添加这个文件名。gitignore 文件,为了保护它不受你无所不知的版本控制系统的影响!
访问代码中的环境变量
到目前为止,我们已经看到了如何以两种方式设置我们的秘密变量——通过我们的 bash 会话和作为一个单独的文件。现在,让我们看看如何在 Python 代码中访问它们。
os.environ.get()功能****
如果在 bash 会话中设置变量,可以通过如下代码片段轻松访问它们:

取回环境变量!
在这里,我们获得了环境变量**DATABASE_URL**的值,并将其默认值指定为:**‘sqlite:////’**。
如果您将默认值保留为空,它将返回**None**,如果您还没有用这个名称设置变量的话。
如果您采用了第二种方法,并通过。env 文件,您可以在代码中使用不同的方法来访问它们。
2.使用 dotenv 包
pip install python-dotenv
接下来,我们可以从。env 文件通过它。

从目录中的. env 文件加载变量
接下来,我们可以很容易地使用**os.environ.get()**函数,通过变量的名称获取变量,就像上一步一样。
结束…
在你的应用程序中设置环境变量可以让你省去很多麻烦(也可能是心脏病:P),因为它们有助于隐藏你的中的敏感信息。env 文件,如 URL、密码和 API 密钥。
我希望这篇文章对你在自己的应用程序中使用它们有所帮助。
在这里跟随我每周阅读更多这样的文章!我经常写关于编程的文章,还有我作为数据科学家的经历。😃
你也可以在这里查看与我所有文章相关的代码和资源。
我的另外几篇文章,你可能想看看:
** [## 将 Docker 与 VSCode 结合使用的好方法
towardsdatascience.com](/the-nice-way-to-use-docker-with-vscode-f475c49aab1b) **
建立 Instagram 业务的最快分析方法
供个人使用的社交媒体分析技巧
快速抓取和分析 instagram 数据的最佳方式

来源( Unsplash )
我的追随者增长一直停滞不前。为什么?
我应该做些什么来吸引我的追随者?
问题陈述
假设你是一个开了一家花店的企业主。为了宣传您的新企业,您激动地注册了 Instagram 企业帐户。
仅仅一个月,你的追随者就增加到了 200 人。你确信你的帖子非常吸引人。所以你推动自己创造更多的内容,期待类似的增长。
但到了下一季度,你并没有获得你预期的高增长。看起来,你不再推送吸引人的内容了。
那么问题是什么呢?你会怎么解决?你将如何有效地与你的追随者互动?
输入 Instagram 分析
解决方案:挖掘并跟踪你的 Instagram 指标
然后用谷歌数据工作室自由可视化。

样本仪表板,我创建了 YMH 使用谷歌数据工作室。出于隐私考虑,这些数字是随机的(来源于作者)
我为什么要写这个?
我是 Yayasan Merajut Hati (YMH) 的志愿者,这是一个非营利组织,旨在提高印尼年轻人的心理健康意识,特别是在疫情期间。
为 YMH 社交媒体开发数据分析管道使他们能够实时衡量参与度,并挖掘见解以创造更好的帖子。随着时间的推移,每个帖子都是新见解的试验场,以监督更好的内容创作。
同样,这将有助于企业/组织/影响者快速、自由地获得洞察力
开发 Instagram 商业报表
“没有目标的人生,就像没有终点的赛跑;你只是无处可逃”——未知
让我们定义我们的关键绩效指标(KPI)
我为你的营销分析 KPI 提出了五个关键指标。必要时可以随意调整。

营销指标示例
设置脚本以提取 Instagram 数据
免责声明
数据架构图解

数据架构图解(来源于作者)
说明
我们使用Google app script进行数据抓取自动化,Google spread sheet进行数据存储,而Google Data Studio用于交互式仪表盘。
使用这些工具是因为:
- 免费:你只需要一个谷歌账户来建立你的管道。
- 在线分享和协作:就像谷歌文档一样。
- 带自动触发器的简单脚本:Google app script支持带每日/每周/每月触发器的脚本
- 易于调试 : 谷歌电子表格 用于存储数据,不需要脚本来查询,这对于与非技术人员(客户、研究人员、营销人员等)协作非常重要
- 自动报告 : 谷歌数据工作室 自动向利益相关者发送报告。
提取 Instagram 数据
用户元数据
Instagram 运行在 REST 服务上,您可以使用这种模式提取用户元数据值
**[**https://www.instagram.com/{USER_ID}/?__a=1**](https://www.instagram.com/{USER_ID}/?__a=1)**
USER_ID 表示 Instagram 账户。例如,您可以使用 vincent.tatan(我的用户 ID)提取特定于用户的数据。
**e.g (my own): [**https://www.instagram.com/vincent.tatan/?__a=1**](https://www.instagram.com/{USER_ID}/?__a=1)**
当你浏览这个 URL 时,你会收到下面的 JSON 字符串。

这个 JSON 字符串显示了 Instagram 的所有公共指标,例如:赞、评论、帖子、关注者等。
如果你的浏览器将信息显示为“原始数据”,你可以点击 JSON 标签(像 Mozilla Firefox 一样)或者使用一个外部 JSON 查看器将文本作为 JSON 输出返回。

仔细观察,你会发现 Instagram 在这些特定路径中的这些功能。

访问谷歌应用脚本
要访问提取使用的脚本,您应该遵循以下步骤:
- 创建此电子表格的副本。
- 转到工具
- 单击脚本编辑器
提取 Instagram 账户数据
运行以下命令,从某个用户 id 提取并解析 JSON 字符串。
**var url = "https://www.instagram.com/vincent.tatan/?__a=1";
var source = UrlFetchApp.fetch(url, opt).getContentText();
var data = JSON.parse(source);**
****注意:如果卡死,它返回“意外令牌<”。这意味着你在 Instagram 中遇到了防爬机制。如果您遇到此问题,您应该构建自己的 web cookie 以使爬网合法。cookie 设置语法可以在我的脚本中引用。更多信息。
识别趋势和发布数据
一旦我们可以访问 JSON 文件,我们就可以在这些文件中使用以下函数:
- General.gs :读取一般用户信息
- Post.gs :读写帖子信息。
一个简单的提取如下所示
**var follower_counts = parseInt(json_file[‘graphql’][‘user’][‘edge_followed_by’][‘count’]);
var get posts_info= json_file[‘graphql’][‘user’][‘edge_owner_to_timeline_media’];**
有了这些代码片段,您可以将这些功能写入电子表格。
**var ss = SpreadsheetApp.getActiveSpreadsheet();
var general_trends = “General Trends”;
var general_sheet = ss.getSheetByName(this.general_trends);function appendGeneral(current_date, followers, medias, following, engagement, general_sheet)
{
general_sheet.appendRow([current_date, followers, following, medias.count, engagement.totalLikes, engagement.totalComments, engagement.EngagementRatio]);
}**

恭喜你,你已经自动提取了自己的 Instagram 数据。
****注意:默认情况下,Googlescript 类似于通常用于 web 开发交互语言的 Javascript 符号。如果您仍然不熟悉,请随意查看 AppScript 文档。
提取数据的自动化每日触发器
在 Appscript 界面中,你可以在左边的菜单栏中选择“触发器”。
你可以设置它运行“InsertGeneralAndPostData”功能,每天在你给定的时间运行。
就是这样!现在请高枕无忧,因为 Google Server 会自动运行脚本来生成新数据,即使您不在线。

用谷歌数据工作室构建可视化。
一旦完成,你就可以使用 谷歌数据工作室 来设置你的可视化。我鼓励你阅读我关于快速构建仪表板的博客文章,并启动一个简单的项目。

样本仪表板,我创建了 YMH 使用谷歌数据工作室。为了保密,这些数字是随机的
结论
在 Instagram 中提取数据是一种以可靠的方式获取数据的有益方式。它可以节省您的时间,并帮助您在每天刷新统计数据时了解趋势。
在这篇文章中,你学到了:
- 如何制定营销指标和 KPI
- 提取 Instagram 数据的脚本
- 为每日提取创建自动触发器
利用这个仪表板,我成功地为 YMH 的内容创作提供了建议。在一月份,我们的关注者增加了约 23%,从 361 人增加到 446 人,并对影响者驱动的帖子和可读性产生了深刻的见解。我真诚地希望您能为您的企业/个人帐户运行此分析。
****注意:在未来,我希望分享您如何使用脸书图形 API 扩展字段/指标
索利·德奥·格洛丽亚
来自作者的更多提示:
关于作者
我用 ML @ Google 对抗网络钓鱼。
我热爱我的工作是因为我使用先进的 ML 算法和 MLOps 来保护 Chrome、Gmail 和 Android 用户免受网络钓鱼攻击,这些攻击每周都可能窃取弱势群体的生活积蓄。
我也是一名面向数据科学媒体的作家,为全球 50 多万观众的有志 ML 和数据从业者提供指导。
为机器学习模型构建仪表板的最快方法
使用 explainerdashboard 库快速构建交互式仪表板,用于分析和解释机器学习模型的预测和工作方式

介绍
数据科学家的大部分工作都围绕着收集数据和为业务问题创建机器学习模型。虽然建立复杂的机器学习模型很难,但将经过训练的机器学习模型的预测传达给没有技术背景的 stake holder 就更麻烦了。这就是像 Tabpy 和 explainerdashboard 这样的 python 包派上用场的地方。在我之前的文章中,我解释了如何使用 Tabpy 包将经过训练的机器学习模型直接与 tableau 集成。
在本文中,我将讨论实现一个名为 explainerdashboard 的优秀 python 包。explainerdashboard 包通过创建交互式可视化仪表盘来帮助分析机器学习模型。试图进入数据科学的初学者或希望更好地理解其模型的不同属性的有经验的数据科学专业人员可以使用此包,只需 2 行额外代码即可创建基本的仪表板。
履行
就像大多数其他 python 包一样,这个包可以通过使用命令pip install explainerdashboard来安装。
这里使用了著名的 Titanic 数据集,以交互式仪表板格式展示随机森林分类模型的特征。
创建机器学习模型后,使用 sci-kit 包中的 Randomforestclassifier。我们可以使用classifierexplainer定制我们想要在仪表板中显示的特性。
下图是我们使用代码行ExplainerDashboard(name).run()启动仪表板后得到的样本仪表板

来源:文档
要在 jupyter 笔记本等嵌入式笔记本中运行仪表盘,我们可以使用inlineexplainer
现在,我们可以使用仪表板中的自定义指标来分析特性重要性和各个决策树,以更好地了解 ML 模型的性能。关于创建定制仪表板的更多信息可以在 explainerdashboard 的官方文档中找到这里。
部署
在分析了机器学习模型之后,将它们部署到生产中也是非常容易的。官方文档中建议使用健壮的生产服务器,如gunicorn或waitress来部署仪表板,而不是内置的 flask 开发服务器。
使用命令pip install gunicorn或pip install waitress安装 gunicorn 或服务员。
在启动仪表板和部署模型之前,我们应该将解释器模型保存到磁盘上,这可以通过转储模型来完成。
将模型保存到磁盘后,我们可以从文件中加载 explainer 模型,然后启动仪表板,然后我们可以将 flask 服务器公开为app:
在这里,我将文件保存为[flaskserver.py](http://localhost:8050),现在我们可以使用以下命令启动 gunicorn 服务器:
$ waitress-serve --port=8050 dashboard:app
本文中使用的代码和图片摘自库的官方文档和 Github 库。
希望那有用!感谢您阅读我的文章。如果你对这篇文章有任何疑问,或者想要联系和交流,请随时在 LinkedIn 上给我发消息。我将非常乐意与您联系,并尽我所能提供帮助。
Quora 问题对相似性问题
一个初学者在 Kaggle 上经历一个问题的不同生命周期的旅程。

照片由 Me 拍摄。
这是我的第一个案例研究,所以你可以期待一个初学者友好的数据分析和模型构建。对于这个问题,我只使用了经典的机器学习模型。然而,参与这个案例研究对我来说是一次很好的学习经历。在这篇博客中,我会尽可能地与你分享。
在博客里,我只会写摘要。你可以在这里查看完整的笔记本,也可以在 github 上查看代码。
对于所有有经验的人,我希望你们能对未来的案例研究提出反馈意见。🤝🤓
目录
- 介绍
- 业务目标和约束
- 数据概述
- 业务指标
- 基础 EDA
- 数据清理
- 特征抽出
- 具有特性的 EDA
- SentenceBERT
i. EDA 关于 SentenceBERT 的新特性 - 数据预处理
- 训练模型
一、支持向量分类器
二。随机森林
三。XGBoost
四。另一个 XGBoost🏆 - 最后的想法
- 参考
介绍
Quora 是一个问答的平台,就像 StackOverflow 一样。但 quora 更像是一个通用的问答平台,这意味着没有像 StackOverflow 那样的代码。
quora 面临的众多问题之一就是问题重复。重复提问会破坏提问者和回答者的体验。由于提问者在问一个重复的问题,我们可以只给他/她看前一个问题的答案。并且回答者不必为基本相同的问题重复他/她的答案。
例如,我们有一个问题,比如“我怎样才能成为一个好的地质学家?”这个问题有一些答案。后来有人问了另一个问题,比如“要成为一名伟大的地质学家,我应该做些什么?”。
我们可以看到,这两个问题问的是同一个问题。尽管问题的措辞不同,但两个问题的意图是相同的。
所以这两个问题的答案是一样的。这意味着我们可以只显示第一个问题的答案。这样,提问题的人会立即得到答案,已经回答了第一个问题的人也不必重复。
这个问题在 Kaggle 上可以作为竞赛。https://www.kaggle.com/c/quora-question-pairs
给定两个问题,我们的主要目标是找出它们是否相似。所以让我们用 ML 变变魔术吧。🪄
业务目标和约束
- 没有严格的等待时间要求。
- 我们希望有可解释性,但这不是绝对强制性的。
- 误分类的代价中等。
- 这两个类(重复或不重复)同等重要。
数据概述
可用列: id,qid1,qid2,question1,question2,is_duplicate
类标签: 0,1总训练数据/行数: 404290
列数:6
is _ duplicate为因变量。
非重复数据点数为255027重复数据点数为 149263
我们有 404290 训练数据点。而只有 36.92% 为阳性。这意味着它是一个不平衡的数据集。
业务指标
这是一个二元分类。
- 我们需要尽量减少这次挑战的日志损失。
基础 EDA

测试数据没有问题 id。所以自变量是问题 1 ,问题 2 因变量是 is_duplicate 。
3 行有空值。所以我们删除了它们,现在我们有了用于训练的 404287 问题对。
- 36.92% 的问题对是重复的,而 63.08% 的问题对是非重复的。
- 在 808574 个问题(包括问题 1 和问题 2)中, 537929 是唯一的。
- 大多数问题重复的次数很少。只有少数是多次重复的。
- 一个问题重复 157 次,这是最大重复次数。
有一些问题字符很少,没有意义。稍后将通过数据清理来解决这个问题。
数据清理

照片由皮勒 r .普里斯克在 Unsplash 上拍摄
- 我们已经将所有内容都转换成小写。
- 我们已经消除了宫缩。
- 我们已经用货币名称代替了货币符号。
- 我们还删除了超链接。
- 我们已经删除了非字母数字字符。
- 我们已经用单词 lemmatizer 去掉了词形变化。
- 我们还删除了 HTML 标签。
特征抽出

斯蒂芬·罗德里格兹在 Unsplash 上的照片
我们从问题中创建了 23 个特征。
- 我们已经为这两个问题创建了特征 q1_char_num、q2_char_num 以及字符数。
- 我们已经为这两个问题创建了特征 q1_word_num、q2_word_num 以及字符数。
- 我们已经创建了 total_word_num 特征,它等于 q1_word_num 和 q2_word_num 之和。
- 我们已经创建了 differ_word_num 特征,它是 q1_word_num 和 q2_word_num 之间的绝对差。
- 我们已经创建了 same_first_word 功能,如果两个问题的第一个单词相同,则该功能为 1,否则为 0。
- 我们已经创建了 same_last_word 功能,如果两个问题具有相同的最后一个单词,则该功能为 1,否则为 0。
- 我们已经创建了 total_unique_word_num 功能,它等于两个问题中唯一单词的总数。
- 我们创建了 total _ unique _ word _ without top word _ num 功能,该功能等于两个问题中不含停用词的唯一单词总数。
- 总唯一单词数比率等于总唯一单词数除以总单词数。
- 我们已经创建了 common_word_num 功能,它是两个问题中总的常用词的计数。
- common_word_ratio 特性等于 common_word_num 除以 total_unique_word_num。
- common_word_ratio_min 等于 common_word_num 除以问题 1 和问题 2 之间的最小字数。
- common_word_ratio_max 等于 common_word_num 除以问题 1 和问题 2 之间的最大字数。
- 我们已经创建了 common _ word _ withoutstopword _ num 功能,它是两个问题中除停用词之外的所有常用词的计数。
- common _ word _ without top word _ ratio 特性等于 common _ word _ withoutstopword _ num 除以 total _ unique _ word _ without top word _ num。
- common _ word _ without top word _ ratio _ min 等于 common _ word _ withoutstopword _ num 除以问题 1 和问题 2 之间的最小字数,不包括停用词。
- common _ word _ without top word _ ratio _ max 等于 common _ word _ withoutstopword _ num 除以问题 1 和问题 2 之间的最大字数,不包括停用词。
- 然后用 fuzzywuzzy 字符串匹配工具提取了 fuzz_ratio、fuzz_partial_ratio、fuzz_token_set_ratio 和 fuzz_token_sort_ratio 特征。参考:https://github.com/seatgeek/fuzzywuzzy
具有特性的 EDA

艾萨克·史密斯在 Unsplash 上拍摄的照片
- 如果第一个单词或最后一个单词相同,则问题对很有可能是重复的。


- 如果问题对是重复的,那么包含和不包含停用词的唯一单词总数(q1 和 q2 的总和)会减少。


- 对于重复问题对,总的唯一单词与总单词的比率通常较小。

- 重复的问题对往往在两个问题之间有更多的常用词。因此,与常用词相关的提取特征也显示出分布的差异。



- 对于重复的问题对,模糊比率通常更高。


句子的特征化

我们需要将问题转换成某种数字形式,以应用机器学习模型。有各种各样的选择,从基本的单词包到通用的句子编码器。
我试着推断句子嵌入。但它返回 4096 维表示。应用后,训练数据变得巨大。所以我丢弃了它。这个问题我选择了 SentenceBERT。
句子 BERT 是一种基于 BERT 的句子嵌入技术。我们将使用预先训练好的 SentenceBERT 模型 paraphrase-mpnet-base-v2 ,这是质量最好的推荐。句子伯特产生 768 个维度的输出。https://www.sbert.net/
我们又创建了两个特征余弦 _ 相似性 _ 伯特和欧几里得 _ 距离 _ 伯特,它们用句子伯特表示来测量两对问题之间的相似性和距离。
到目前为止,特征总数为 25 。
EDA 关于与 SentenceBERT 相关的新功能


- 余弦相似度对于重复对更大。
- 80%的非重复问题对和只有 20%的重复问题对具有余弦相似度<= .815


- 对于重复问题对,欧几里德距离更小。
- 20%的非重复问题对和大约 80%的重复问题对具有< = 2 的欧几里德距离。
它展示了帕累托原则(80-20 法则)。
数据预处理

布拉登·科拉姆在 Unsplash 拍摄的照片
我们归一化(最小-最大缩放)提取的特征。我们没有规范化嵌入,因为不推荐这样做。
我们有 1561 特色(25 + 768 + 768)。
- 25 是提取的特征。
- 768+768 用于问题 1 和问题 2 的句子嵌入。
因为数据集是不平衡的。我们通过从少数类中采样来进行过采样。
现在我们有 510048 数据点用于训练。每个班 255024 。
请注意,我没有留出任何数据用于本地测试。因为我们的主要目标是在 Kaggle 上取得好成绩。
培训模型

支持向量分类器
在用参数网格训练对半网格搜索 CV 时,
svc_param_grid = {‘C’:[1e-2, 1e-1, 1e0, 1e1, 1e2]}
我们使用 LinearSVC 是因为它被推荐用于大型数据集。我们使用了 L2 罚函数,损失函数是铰链损失的平方。此外,建议对大型数据集使用原始公式。对于 C 的某些值来说,它是不可转换的,所以我将 max_iter 增加到 3000。
svc_clf = LinearSVC(penalty='l2', loss='squared_hinge', dual=False, max_iter=3000)
为了交叉验证减半网格搜索 cv,我使用了 1 次洗牌和 70:30 的分割。另外,对选择的评分是准确性。
svc_clf_search = HalvingGridSearchCV(svc_clf, svc_param_grid, cv=splits, factor=2, scoring='accuracy', verbose=3)
等分网格搜索 cv 发现 C=100 是最佳参数。而最好的准确率是 85.79% 。所以最好的估计是这样的,
LinearSVC(C=100.0, dual=False, max_iter=3000)
既然我们需要尽量减少比赛中的木材损耗。我们需要一个好的预测概率。校准的分类器可用于获得良好的预测概率。
svc_calibrated = CalibratedClassifierCV(base_estimator=svc_clf_model, method="sigmoid", cv=splits)
在对概率模型进行校准之后。我预测了测试数据的概率,并在 Kaggle 上提交。Kaggle 提交的公共领导委员会分数为 0.36980 。考虑到模型假设线性可分性,非常好。
随机森林
你知道 Quora 本身使用随机森林来解决这个问题。或者至少他们在 2017 年 6 月第一次在 Kaggle 上发布比赛时是这样做的。
与之前相同,我们使用以下参数网格对分网格搜索 cv:
rf_param_grid = { 'n_estimators':[200, 500, 800], 'min_samples_split':[5, 15], 'max_depth': [70, 150, None]}
其余的参数是随机森林分类器的默认值。
rf_clf = RandomForestClassifier()
我们已经像以前一样使用了非常相似的等分网格搜索 cv,
rf_clf_search = HalvingGridSearchCV(rf_clf, rf_param_grid, cv=splits, factor=2, scoring='accuracy', verbose=3)
等分网格搜索 cv 发现 {'max_depth': 150,' min_samples_split': 5,' n_estimators': 800} 是最佳参数。而最好的准确率是 90.53% 。因此与 SVM 相比,精确度提高了 5%。最佳估计看起来是这样的,
RandomForestClassifier(max_depth=150, min_samples_split=5, n_estimators=800)
现在,在这一点上,我应该使用校准,但因为它已经花了很多时间,我跳过了它。我应该使用贝叶斯优化技术😞。
Kaggle 提交的公共领导委员会得分为 0.32372 ,略高于 SVC。我期望对数损失少一点,但请记住,我们还没有进行校准(由于时间限制)。我们将尝试使用 XGBoost——ka ggle 竞赛中 ml 模型的圣杯——做得更好。
XGBoost
由于时间和系统配置的限制,我决定使用 200000 个数据点来估计一些参数。
起初,我使用 Optuna 进行超参数调优,但它有一些问题,因为它在试用后没有释放内存。所以系统试了几次就崩溃了。
后来,我决定使用远视进行调优。
用 HyperOpt,我只调了 max_depth 和 learning_rate 。这不是一个微调,因为我只用了 5 次试验。但它给出了一个粗略的概念。
最后,我选择以下参数对整个数据进行模型训练,
params = dict( objective = "binary:logistic", eval_metric = "logloss", booster = "gbtree", tree_method = "hist", grow_policy = "lossguide", max_depth = 4, eta = 0.14)
目标= "二进制:逻辑"因为我们试图得到概率。我使用了 tree_method = "hist" 进行快速训练。grow _ policy = " loss guide "灵感来自 LightGBM,精度更高。
num_boost_round 设置为 600, early_stopping_rounds 为 20。
Kaggle 提交的大众领先板得分为 0.32105 ,略好于其他车型。我期待比这更好的结果。这可以通过对超参数进行更多的微调来实现。XGBoost 有大量的超参数https://xgboost.readthedocs.io/en/latest/parameter.html
另一个 XGBoost
我对 XGBoost 模型的结果不满意,所以我决定凭直觉调整参数。
我做的第一件事是通过删除重复行来消除过采样数据。
这一次我添加了一些参数来更好地概括,
params = dict( objective = "binary:logistic", eval_metric = "logloss", booster = "gbtree", tree_method = "hist", grow_policy = "lossguide", max_depth = 4, eta = 0.15, subsample = .8, colsample_bytree = .8, reg_lambda = 1, reg_alpha = 1)
另外,我把助推回合数减少到了 500。

照片由 Fauzan Saari 在 Unsplash 上拍摄
🥁瞧!我们有赢家了。本次提交的公众 LB 分数为 0.28170 。
这似乎是一个非常好的结果。
最后的想法
我从这个案例中学到了很多。我走了一些捷径,要么是因为系统配置限制,要么是时间限制。
我还亲身经历了机器学习不仅仅是建立模型,在此之前的步骤需要更多的时间。超参数调整可以自动进行,但像特征提取或决定使用什么特征这样的事情需要手动完成。
我花了将近两周的时间😅有一半的时间我在等待一些执行的完成。所以我认为,如果你有资源密集型任务,使用亚马逊 SageMaker 这样的东西是个好主意。
未来可以尝试一些基于深度学习的模型。
参考
简化三月疯狂预测的闪亮应用
一个简单的应用程序,旨在消除体育网站上查看统计数据的数百次点击

马库斯·斯皮斯克在 Unsplash 上的照片
疯狂三月:美国大学篮球锦标赛
首先,我想分享一下,我并不擅长预测三月份美国 NCAA 男子和女子篮球锦标赛的冠军。如果你在寻找关于选择谁作为你的支架的专家建议,不幸的是我没有具体的建议给你。
也就是说,试图预测赢家很有趣。在https://www.ncaa.com/上填写你的预测括号是一个很容易在线玩的游戏,与朋友分享很有趣,有时也是一种赌博形式——主要是与同事或朋友。
这个 R Shiny 应用程序的目的是将多个篮球统计数据汇集到一个易于阅读的视图中。当我想到对我的选择有重大影响的因素时,这五点非常重要。
- 团队的记录/排名
- 如果两个队在本赛季已经进行过比赛,那么这两个队之间的比赛结果
- 球队在过去的十场比赛中是否发挥得特别好
- 球队统计数据,如场均助攻数、场均三分出手数、场均防守盖帽数等等
- 主场比赛、客场比赛和会议比赛的团队记录
篮球统计分析自动化工具
为了将所有数据汇集到一个屏幕上,我首先从体育参考和体育书评在线下载了比赛和赛季统计数据。我对数据做了一些修改,以便合并数据集,并更容易地在一个屏幕上解释数据。
有了 RStudio 的 Shiny,我可以在我的电脑上运行一个应用程序,让我选择两支球队并立即查看比赛数据。您可以从 GitHub 查看、下载和使用我的代码(以及修改后的运动数据)。如果您还不是 R 程序员或 R 用户,R 是免费的,可以下载。要运行你的第一个 R 程序,我推荐以下步骤开始。
比赛统计屏幕
在运行应用程序时,这个界面出现在我选择我想要比较的两个团队的地方。基于这种比较,我将选择我认为哪个队会赢得这场比赛。
在我从列表中选择了 Team1 和 Team2 之后,从导入的数据源中填充了统计比较、两个队的面对面比赛和最后 10 场比赛。这个应用消除了我通常在体育网站上进行的数百次点击,在关于每个球队的不同网页之间来回切换。我仍然阅读体育网站来了解球员,但很容易获得球队的统计数据令人耳目一新。

括号 R 闪亮的应用程序(图片作者)
r 闪亮的应用代码
现在您已经看到了结果,让我分两部分来分享代码。第一部分是数据和一般文档的设置。数据争论为 Shiny 准备数据,并根据我的喜好重命名统计类别。
第二部分是闪亮的 App。main 函数启动应用程序,而其他函数创建交互式选项来选择团队,然后显示这些团队的统计数据。让我借此机会感谢 RStudio 的团队开发了这个闪亮的应用程序,并感谢所有其他为 R 做出贡献的人,是他们让这个 R 开源项目成为可能。
既然我已经分享了我的括号秘密,祝我今年好运吧!我祝你好运!
如果你喜欢这篇文章,并想阅读(和写)更多这样的文章,请考虑使用我的推荐链接成为中等会员:https://sabolch-horvat.medium.com/membership
请注意,来自数据源的数据可用性存在延迟。如果你在周日阅读这篇文章,数据可能会在几天后用最新的锦标赛结果更新。
【2021–03–16 数据更新】:虽然体育参考 数据现已更新,但 体育书评在线 数据(包括比赛历史和最近 10 场比赛的结果)似乎不会在比赛前及时更新。截至今天,Kaggle 为参加其挑战的人提供了最新赛季的比赛,包括男子https://www.kaggle.com/c/ncaam-march-mania-2021/overview和女子https://www.kaggle.com/c/ncaaw-march-mania-2021/overview**比赛。由于这些数据不是公开的,因此在此不共享这些数据。请注册参加免费的 Kaggle 挑战赛来查看这些数据。****
啤酒节啤酒价格的大幅上涨创造了 9000 万欧元的生意

作者创建的图像;基于来自 Pixabay 的木板特写和 Frank Luca 在 Unsplash 上的照片和 Anshu A 在 Unsplash 上的照片
动手操作教程,教程— R —啤酒节
关于如何使用 R 和 ggplot2 分析和可视化啤酒节数据以及如何预测价格信息的分步教程



啤酒节游客和价格发展;作者提供的图片
慕尼黑最著名的事情之一当然是我们的啤酒节,这是世界上最大的啤酒节。自 1810 年以来,它每年都会举行,只是在战争和你猜对了,流行病期间会取消。2020 年的啤酒节被取消了,至于 2021 年的,目前还不清楚它是否会举行。
由于这是一个如此重要的事件,从社会和经济的角度来看,我试图找到关于它的信息,并了解更多关于它的数字。我发现了一个有趣的数据集,它跨越了 35 年,提供了关于啤酒量、价格、游客、鸡肉需求和价格的信息。
在这篇文章中,我将向您展示如何使用 R 和 ggplot2 来分析一个有趣的数据集,即啤酒价格在过去 20 年中翻了一番,而鸡肉销售停滞不前,啤酒总销售额在 2019 年达到 9000 多万欧元。

Joshua Humpfer 在 Unsplash 上的照片
1.设置和概述
数据是来自慕尼黑开放数据门户的开放数据集。该数据集跨越 35 年(35 次观察)和 10 个变量,包括:
- 啤酒节的年
- 节日持续的天数( duration_days )
- 每年的游客(游客 _ 年)
- 每年每天的平均访客数(访客日)
- 每年一瓶啤酒(1 升)的平均价格( beer_price
- 每年销售的啤酒总量,单位为升( beer_sold )
- 每年一只鸡的平均价格( chicken_price
- 每年售出的鸡的总量(鸡 _ 售出)
- 计算:花在鸡肉上的钱总数(moneypentonchicken)
- 计算:花在啤酒上的钱总数(moneypentonbeer

数据概述;作者图片
2.数据可视化
我研究了上面提到的一些变量的观察结果,以便更好地理解这些数据。通常,直方图是探索数据分布和发现有趣细节的完美工具。在此分析中,我使用条形图展示了数据在 1986 年至 2019 年期间的进展情况。
每年的游客量会随着时间的推移略有变化,而游客量下降主要是受恐怖袭击的影响

每年的啤酒节游客;虚线平均值;作者图片
35 年来,平均每年有 6,314,286 人参观啤酒节。1985 年,参观啤酒节的人最多。然后,游客数量急剧下降,1988 年跌至谷底,游客数量比平均水平少 60 万。从那以后,游客的数量不断增加,直到 2001 年 9 月 11 日之后达到了一个新的低点——啤酒节通常在每年的九月底开始。从 2014 年到 2016 年,欧洲发生的恐怖袭击导致游客减少。然而,从 2017 年起,游客人数有所增加。2020 年,因为疫情,啤酒节取消了。2021 年的陪审团还在外面。
啤酒价格的增长快于通货膨胀,在过去的二十年里,啤酒价格翻了一番

啤酒节啤酒价格发展;虚线平均值;作者图片
2019 年,一升啤酒的价格为 11.71€,而 1985 年仅为 3.20€。1999 年,价格是 5.80€,因此,在过去的 20 年里翻了一番。平均而言,啤酒价格每年上涨 0.25€,几乎是通货膨胀率(0.084€)的三倍。
有趣的是,与 1990 年相比,1991 年每升啤酒增加了 0.44€。为什么会这样?在随后的几年中,增长率趋于平稳,直到 1996 年才再次上升,2000 年与 1999 年相比出现了 0.55€的大幅增长,比一段时间以来的平均增长率高出一倍多。
鸡肉价格在过去 20 年里也翻了一番,2020 年价格出现大幅调整

啤酒节鸡肉价格发展;虚线平均值;作者图片
鸡肉价格逐年上升,直到 1995 年才略有下降。然而,2000 年出现了大幅增长。价格上涨了 2.47€,是平均价格涨幅的 12 倍多。从 1985 年的 4.77€开始,到 2016 年的 11.00€和 2019 年的 12.15€。因此,在过去的二十年里,一只鸡的价格翻了一倍多。令我惊讶的是,在 1999 年,一只鸡比一升啤酒还便宜!难怪 2000 年有这样的价格调整。
啤酒和鸡肉需求发展
虽然一只鸡和一升啤酒的价格在价值和增长上非常相似,但这与售出的鸡和一升啤酒的数量非常相似。平均售出 6,222,337 升啤酒,而仅售出 571,921 只鸡(尽管这仍然是一个巨大的鸡肉数量)。
平均来说,每只鸡卖出了 10.8 升啤酒,每个游客平均喝了 1 升啤酒,吃了 0.09 只鸡!

啤酒节鸡肉和啤酒需求发展;虚线平均值;作者图片
多年来花在啤酒和鸡肉上的钱总数
在最后这张图中,我比较了每年花在啤酒和鸡肉上的钱。这是通过将金额乘以价格得出的。有趣的是,啤酒和鸡肉的价格在过去的二十年里翻了一番。然而,尽管啤酒需求稳步增长,鸡肉需求却逐年下降。
1999 年,花在啤酒上的钱是 34,831,320€,2019 年是 91,925,842€。增幅超过 260%。
1999 年,花在鸡肉上的钱是 3,279,976€,2019 年是 5,285,226€。这仅仅增加了 161%
1999 年,游客在啤酒上的花费是鸡肉的 10 倍以上,而在 2019 年,游客在啤酒上的花费是鸡肉的 17 倍以上!

啤酒节鸡肉和啤酒销售发展;虚线平均值;作者图片
3.价格预测显示 2030 年每升啤酒价格为 13.89€
让我们尝试使用啤酒价格信息来训练模型并预测未来几年的啤酒价格。这个模型非常简单:线性回归。
在统计中,线性回归是一种线性方法,用于模拟标量响应与一个或多个解释变量(也称为因变量和自变量)之间的关系。—来源:维基百科
首先,让我们用 1985 年到 2019 年的啤酒价格来训练一个模型。然后,我们可以使用这个训练好的模型model 对 1985 年到 2030 年进行预测(而我们只使用 2020 年到 2030 年的数据)。该预测数据集pre仅包含预测价格,而不包含我们必须在pre_data数据集中再次添加的年份信息。最后,我们创建另一个变量,将价格信息四舍五入到两位小数之后。
训练模型并预测啤酒价格
接下来,我们可以使用预测价格(pre_data)和本文前面的啤酒价格图表。

啤酒节啤酒价格预测;作者图片
4.结论
这是慕尼黑开放数据门户对啤酒节可用数据的分析。简而言之,我了解到
- 直到 2016 年,游客总数一直在下降,但总体上没有显示出真正的趋势。
- 2001 年,就在 911 事件之后,游客数量大幅下降。从 2014 年到 2016 年,欧洲的恐怖袭击影响了游客数量。
- 啤酒的销售总量增加了,而鸡肉的销售总量减少了,因此,人们吃的鸡肉少了,但喝的啤酒多了。
- 令人担忧的是,每位游客的啤酒量在 1997 年后也增加了;2019 年,平均一名游客每天喝超过 1.2 升啤酒。
- 鸡肉和啤酒的价格比 1999 年翻了一番。一升啤酒的价格上涨,尤其是。2000 年增加了 0.55€。2000 年,一只鸡的价格上涨了 46%!
- 2019 年整体啤酒销售额超过 9000 万欧元。
- 使用简单的线性回归模型,我们可以预测 2030 年的啤酒价格为每升 13.89€。虽然许多因素可能会影响价格决策,而且我们只关注过去的价格,但这一预测显示的是方向,而不是实际的价格预测。
当然,这种分析受到可用于这种分析的数据量的限制。对已经汇总的数据进行平均只能获得有限的见解,需要仔细解读统计数据!
你怎么想呢?你有什么反馈给我吗?
如有任何问题和意见,请随时联系我。谢谢你。点击此处查看我的更多文章:
- 了解我如何计划和管理我的文章创意
- 学习如何从你的个人资料中创造美丽的艺术作品
- 了解我如何获得和分析我的 Garmin 跑步数据
- 了解如何为您的 Python 代码设置日志记录
- 了解如何使用链接(或管道)在 Python 中编写干净的代码
- 学习如何使用 R 分析你的 LinkedIn 数据
- 学习如何使用图形语法在 Python 中以描述性的方式创建图表
Gregor Scheithauer 是一名顾问、数据科学家和研究员。他专门研究流程挖掘、业务流程管理和分析。你可以在 LinkedIn 、 Twitter 上与他联系,或者在 Medium 上与他联系。谢谢大家!
数据科学家必须掌握的现实生活技能
数据科学职业生涯中有哪些软技能?数据科学是一个融合了商业和技术专业的工作,那么编码、通信、统计等等……对于这份工作来说足够了吗?让我们探索一下对你来说还有什么是至关重要的。

来源:克里斯多夫·高尔在 Unsplash 上的
D ata 科学家是一个预先要求具备多种理论和实践技能的职位。出于这个原因,成为数据科学专业的大三学生是毕业后的第一份工作,这是一个挑战。而要拥有这些技能,就要向公司学习。这就像是先有鸡还是先有蛋的因果困境。显然,你可以问你的数据科学家熟人,但分享这一点被他们大多数人低估了,因为这对这些极客来说太明显了。
这就是为什么我想分享我在一家硅谷类型的初创公司担任数据科学家/人工智能开发人员的经历。
数据科学家与管道合作
什么是管道?📔

经验定义:将原始数据转化为商业问题可操作答案的一组过程[1]。
真实世界定义:一组将过程从原始数据转换为最终结果的代码/文档文件。这些文件以多种目的和格式扩展,例如主代码、支持包、代码注释、文档、管道流程图……从名称中,您可能会了解它们是什么以及它们如何支持您。
为什么数据科学项目需要管道?🔬
项目管道有多种形式,它可以是一个服务于整个过程的漫长而复杂的管道,也可以存在于文件的子任务集中。鉴于经验,我更喜欢后者。原因如下:
- 维护代码很简单。当需要修改时,确保子管道的相同输入和输出是您唯一需要关心的事情,而您可以自由地更改其中的任何其他内容,而不必担心重写整个过程代码。
- 调试和优化代码或文档会更快,因为您可以毫不费力地跟踪管道组件以及它们之间的关系。
- 更有利于可视化:对于数据科学家来说,查看长代码并上下滚动是最糟糕的事情。
现在,让我们跳到管道组件
- 主代码管道
一般来说,这个文件包含所有的代码,并作为项目中特定步骤的执行点。这可以是一个. py 文件,也可以是一个 Jupyter 笔记本,具体取决于该文件与运行它的主服务器的集成。
根据我的经验,这个文件应该只包含关键部分代码,全局对象的数量越少越好。支持函数和类应该在单独的。py 文件并作为局部变量运行(最好避免使用全局对象)。为什么?如果你运行几个任务,改变一个同时运行的变量,使用局部变量将创建它自己的实例,不会影响其他的结果。此外,将太多变量声明为全局变量会导致内存不足的问题,因为这些变量会保留在内存中,直到程序执行完成,而一旦函数结束,局部变量就会被删除,并释放它所占用的内存空间。

Jupyter 笔记本格式的主要代码管道示例(图片由作者提供)
2。支持包
其中包括熊猫、Tensorflow、Pytorch 等开源包……以及你要在主代码管道中调用的可重用的自建类,我相信你跟这些相当类似。
在 Python 中创建类和函数可以通过各种课程和文章访问,如果你谷歌它,所以我会通过它。
3。代码注释
或者叫做代码解释。这对于理解函数/类是如何工作的,什么是输入和输出,以及易于维护和进一步开发是必不可少的。我认为这是至关重要的,但几乎被数据科学家遗忘,当他们试图维护或开发代码时,这是浪费时间,他们必须从头开始查看代码,做一些数学来确定他们的理解。你应该从一开始就避免这个错误,这可以为你的工作节省时间。
在最佳实践中,注释应该放在每个函数的编码之前,就像几个包的源代码一样。
4。文件
如果您经常在数据科学任务中使用开源 API 包,您会清楚地知道文档的重要性。没有它,没有人指望你理解你的管道/包在做什么。代码文档和代码注释的区别在于,前者只包含函数/类用途、参数、运行函数/类的例子等解释信息,后者停留在代码文件中,直接支持代码解释。
需要记住的一点是,尽管代码注释应该在任何可能的时候为每一个自己创建的函数/类进行,但是文档应该在你定义了 90%的代码将运行的内容、流程如何流动以及输入/输出的来源之后编写。
5。管道工艺流程图
这和文档是每个项目的基本文件之一。这不是你用的,而是你的同事、上司、客户的 IT、团队…它显示了代码的流程,这个步骤如何与其他步骤交互
这个任务最好的应用之一是 draw.io 。它们有浏览器、桌面和平板电脑支持版本,更容易在 Windows、macOS 和 Linux 中使用和安装,最重要的是,该应用程序完全免费。此外,它可以连接到第三方存储云服务,如 Google Drive、One Drive、Dropbox、Github 或在线设备。
它的功能不可思议。各种任务的模板,你需要的大部分图标,形状,颜色,还有一个保存你经常使用的形状的地方叫做便签本都在一个地方。

使用 draw.io 创建的图表示例(来源:图片由作者提供)
除了主要的数据科学技能之外,一些公司甚至在他们的工作描述中要求这种图表技能。
结论🏆
以上 5 点是一个数据科学管道的核心。还有更多的组件,如 PowerPoint 演示文稿、仪表板、业务报告等,这取决于您组织的需求。
许多人认为数据科学项目管道仅仅提到了代码、系统集成等方面的项目流程,但这是一种稀疏的思维。数据科学项目不仅需要从数据收集、预处理到模型训练和预测的自动化,还需要向业务合作伙伴解释和展示的文档。
即使你有优秀的代码产生良好的结果,但没有人能够重新创建你的结果,你的工作将失去 50%的价值。关于项目管道的知识肯定会让你在数据科学家的职业生涯中受益匪浅。
参考
[1]来源:https://www . snow flake . com/blog/three-business-reasons-a-modern-data-pipeline/
背后的真正含义!在方法调用中
当一个方法在一个解释点结束时意味着什么?

(图片由作者提供)
在Julia 编程的奇妙世界中,看到以解释点结尾的方法其实是相当常见的。这是一个对所有计算机程序员来说并不陌生的概念,但可能会让那些以前没有见过它的人感到困惑。有许多语言实现了这一特性,其中一些语言用完全不同的定义描述了这一特性。然而,今天我想回顾一下这在大多数高级声明式编程场景中通常意味着什么。
我将要提供的例子展示了这种方法是如何在 Julia 编程语言中实现的,但是当然还有更多适合的选项。这种泛型编程概念对于那些处理各种类型的科学家来说非常有价值,他们既想操作这些类型,又想避免操作这些类型。
一个例子
理解和解决计算和计算机编程中的许多问题的一个很好的方法是分析可重复使用的例子。记住这一点,我们将实际查看两个函数的调用和输出,并将它们与我们传递的类型进行比较,而不是首先查看两个函数之间的区别。对于这个例子,我将使用我最喜欢的编程语言,Julia,但是,这个概念肯定不是 Julia 特有的发明,所以肯定有其他语言可以使用,它们可能对以解释点结束的方法有相同的约定。话虽如此,也有一个简短的小笔记本,你可以看看,也许你可以自己看看。笔记本在这里:
https://github.com/emmettgb/Emmetts-DS-NoteBooks/blob/master/Julia/Methods ending in !.ipynb
为了演示有和没有解释点的方法之间的区别,我们将使用 select!()并从 Julia 的基础包中选择()方法。我们将在一个数据框中使用这两个数据框,因此让我们继续预编译该依赖项并创建一个新的数据框:
using DataFrames
df = DataFrame(:A => [5, 10, 15, 20, 25, 30, 35], :B => [5, 10, 15, 20, 25, 30, 35])
接下来,我们需要检查数据框的形状。如果您想加入反叛,您可以快速将 shape()分派给 size()方法,并根据周围的生态系统进行调用,这似乎更明智(需要说明的是,独一无二没有错,我只是想搞笑。):

(图片由作者提供)
shape(df::AbstractDataFrame) = size(df)
现在,我将创建一个空数据框类型,这样我们就可以创建一个函数来反复调用,以便一次检查两个数据框的形状:
dfnoB = DataFrame()
或者,您可以为两个数据框的 shape()添加调度行:
shape(df::AbstractDataFrame, df2::AbstractDataFrame) = println(size(df)); println(size(df))
这将使您不必定义 dfnoB..不过我还是要写一个函数:
function checkshape()
println(shape(df))
println(shape(dfnoB))
end
现在让我们来看看数据框的形状,请务必记下这方面的尺寸:

(图片由作者提供)
checkshape()
现在我们将使用不带解释点的 select()方法。我们还将创建一个反向数组,这是 Not()函数的返回,它将告诉我们的 select()函数,我们希望选择反向数组中除 dim 之外的所有内容:
dfnoB = select(df, Not(:B))
现在让我们检查一下我们新的 dfnoB 的外形:

(图片由作者提供)
checkshape()
正如您所看到的,我们现在有了第二个数据框,其中包含了 single:一个与预期相符的特性。问题是;如果我们使用 select 会发生什么!()而不是 select?让我们试试这个:
dfnoB = select!(df, Not(:B))

(图片由作者提供)
checkshape()
摘要
每当我们使用 select!()方法而不是 select()方法,我们的原始数据框也应用了更改。直到我们考虑它在高级声明式函数编程中的使用,这才真正有意义。精选!()方法可用于在没有断言的情况下改变类型。本质上,这两个函数的区别在于,一个会复制我们的类型,而另一个不会。根据包内部通常的情况,select()函数将被分派到 select!()方法中添加了函数 copy(),就像这样;
select(df::AbstractDataFrame, x::Array{Any}) = select!(copy(df), x::Array{Any})
基本上,这个函数的意思是,我们可以在不添加断言操作符的情况下在类型上调用它,并且在不创建新类型的情况下改变类型。这既可以节省内存,也可以在利用简单的函数调用清理数据时节省一些时间:
select!(df, Not(:B))
上面的代码实际上会从 df 中删除:B 列。
结论
我认为这些类型的函数在语言中使用时肯定是一个有趣的方面。他们可以显著地改变语言的用法,我认为这是相当激进的。只需键盘上的一个符号,我们就可以决定通过支持这种技术的语言中的任何方法传递的类型的可变性。感谢您的阅读,它对我来说真的很重要——祝您白天和/或晚上休息愉快!
社会意识机器学习的现实
为负责任的人工智能开发直觉

詹·西奥多在 Unsplash 上的照片
当 Latanya Sweeney 博士作为客座教授第一次来到哈佛时,她已经发表了关于数据匿名化和隐私的开创性研究。她在定义 K-匿名性方面发挥了重要作用,创作了 DataFly 算法,并揭示了如何简单地使用选民登记数据对医疗记录进行去匿名化。因此,当斯威尼博士在谷歌上搜索自己,希望与哈佛大学的同事分享她的一篇文章时,她最不希望看到的是一则暗示她有被捕记录的广告。一种算法似乎决定了斯威尼博士的名字——拉坦亚——更有可能被赋予一个有色人种。随后,广告应该使用类似“被捕”或“记录”的话模板

针对黑人识别名称的负面信息。“Latonya Evans”、“Latisha Smith”的广告示例(Sweeney,2013)
接下来发生的事情是人们对计算机科学家的期望。Sweeney 博士解构了该算法,并发现一个黑人识别的名字有 25%的可能引发一个暗示逮捕记录的广告,只有不到 0.1%的可能性可以被偶然解释(Sweeney,2013)。
谷歌描述其广告预测算法的论文解释说,当有人点击进入的概率较高时,系统会更频繁地显示广告(McMahan et al .,2013)。起初,所有组合(查询和相应的广告文案)的权重都是相同的,但随着时间的推移,该算法学会倾向于点击次数更多的组合(Sweeney,2013)。也就是说,这种歧视可能不是由算法引起的,而是由观看算法的人群引起的。
从数学上讲,算法正在做我们期望它做的事情。它越来越青睐更受欢迎的广告。理论上,反向偏置算法以偏好较少观看的广告纠正了这种行为,但这可能对广告的有效性有其他影响。毫无疑问,广告的语言成功地迎合了社会偏见,广告商将最终决定是否利用这一事实。那么,参与创建算法的从业者的责任是什么?更直接地说,重视公平的人如何定位自己以抵消歧视性的结果?
“对技术的追求也不能避免我们在社会其他领域发现的同样的弊病。”
Latanya Sweeney 博士-2019 年在拉德克利夫学院关于种族、技术和算法偏见的讨论
正如斯威尼博士所说,“对技术的追求也不能避免我们在社会其他领域发现的同样的弊病。”尽管如此,由于诸多原因,决定何时(以及如何)遏制不公平结果是一项挑战。做出明智的决定来抵制歧视行为涉及法律、经济学、个人价值观和组织价值观。这篇文章利用了算法偏差研究、联邦指导、法律先例和其他研究来帮助解决这个难题。它旨在帮助从业者(在所有阶段)开始发展一种直觉,以检测、理解并尽可能纠正嵌入到机器学习应用中的有害行为。
偏差≠偏差≠偏差
让我们快速区分偏见的社会学和统计学定义。在机器学习中,偏见并不总是负面的,因为这个术语通常与学习偏见(也称为归纳学习)相关联。归纳学习是统计学习理论的核心部分,简而言之,就是机器学习模型如何从数据中学习,而不仅仅是记忆模式(Hellströ等人,2020)。这种类型的偏差本身是无害的,并且符合更广泛的学习偏差类别(例如,超参数偏差、不确定性偏差)。
我们正在寻找的偏见在法律语言中有一个确定的含义。它指的是“基于先入为主的观念或偏见的判断,而不是对事实的公正评价(Campolo 等人,2018)”。在机器学习中,这可以以各种形式表现出来。为了更加清晰,我们可以从机器学习的偏见中借用一些有用的分类——它有什么好处?由托马斯·赫尔斯特伦、弗吉尼亚·迪格纳姆和苏娜·本施撰写。
数据生成偏差
机器学习算法通过摄取大量信息来收集关于世界的观察结果。数据准备过程为偏差的渗入提供了几个机会(例如,采样偏差、注释偏差、测量偏差)。
当来自一个群体部分的观察值存在低代表性或高代表性时,就会出现抽样偏倚(Lane,2014)。研究人员 Joy Buolamwini 和 Timnit Gebru 发现了这种偏见的一个惊人的例子(现在已经广为人知)。他们发现,用于训练计算机视觉应用程序(如面部识别软件)的数据集绝大多数由肤色较浅的男性受试者组成。这种不平衡导致了对深色皮肤女性的错误分类(错误率高达 34.7%) (Buolamwini,Gebru,2018)。
幸运的是,解决抽样偏差绝不是不可克服的。例如,作为其研究的一部分,Buolamwini 和 Gebru 公布了试点议会基准(PPB)数据集,以实现基于性别和皮肤类型的更好的交叉代表性(Buolamwini,Gebru,2018 年)。尽管如此,即使是完全一致的抽样也无法纠正历史数据中的隐含偏差。
历史偏见
当数据本身具有被视为有偏差的不需要的属性时,就会出现历史偏差。即使数据被正确测量和采样,历史偏差也会出现。从本质上说,这些数据是世界的快照,这不可避免地导致一个模型产生不想要的结果(Suresh 和 Guttag,2019)。
虽然历史偏见在许多应用中出现,但它在语言算法中通常很明显。用于理解语言的算法(例如 Google Translate)将单词表示为向量空间中的点(Bengio 等人,2006)。单词之间的向量差异通常表示术语之间的隐含相关性。例如,如果我们让一个算法来解决一个难题,“男人是国王,就像女人是 x,”它会相对快速地求解 x,发现 x 等于“女王”然而,同样的载体暴露了隐含的性别歧视。例如,它发现“男人对于女人就像电脑程序员对于家庭主妇一样”(Bolukbasi 等人,2016 年)。
当然,抽样不充分不会引入刻板印象。它只是揭示了它们是我们交流方式的一部分。许多流行的语言算法在从社交媒体或维基百科挖掘的数据集上进行训练(Devlin et al .,2018)。在这种特殊情况下,在算法看来,建立职业应该是性别中立的,这破坏了错误的假设,并有效地实现了去偏置。例如,我们可以确保像护士这样的词与像何和她这样的性别对具有相等的相关性(Bolukbasi et al .,2016)。不幸的是,这种解决方案不能处理非二进制代词。一个提议的解决方案是从向量中完全删除性别(Schmidt,2015)。这样做将创造更多的包容性,但也带来更多的复杂性,证明了问题的多面性。
法律视角
歧视性的结果是通过许多镜头看到的。因此,算法偏差也是多维的。虽然了解所有方面可能很困难,但我们可以从美国反歧视法中寻求一些指导。一系列美国法律禁止歧视受保护阶层,包括种族、族裔、宗教和少数民族;女性;学长;以及有遗传缺陷、残疾或已有疾病的人。平等法案将扩大受保护的阶层,以包括性取向和性别认同(MacCarthy,2019)。
更进一步,2019 年的算法问责法案将要求特定组织对可能存在歧视的高风险机器学习系统进行评估。“具体而言,高风险自动化决策系统包括那些(1)可能导致不准确、偏见或歧视的系统”(美国参议院法案 1108,2019)。立法将要求评估衡量对公平和偏见的影响,但它并不试图明确定义术语。这种类型的监管模糊性让组织和个人来确定如何定义机器学习中的公平和偏见。
公平的结果与无偏的算法
2020 年 2 月,Rayid Ghani 教授应邀在国会作证,描述优化算法以实现公平和公正。加尼教授作证说,“简单地”开发更好地解释公平和偏见的人工智能算法通常不足以实现更公平的决定或结果”(加尼,2020 年)。相反,开发人员应该针对特定的结果进行优化。这种情况迫使开发人员明确定义算法应该遵循的值。
美联储州长莱尔·布雷纳德在 2021 年人工智能学术研讨会的发言中进一步阐述了这一点;“……如果人工智能模型建立在反映种族偏见的历史数据基础上,或者经过优化以复制过去可能反映偏见的决定,这些模型可能会放大而不是改善获得信贷方面的种族差距……确保我们在创新时建立适当的护栏和保护以防止这种偏见,并确保人工智能旨在促进公平的结果,这是我们的集体责任”。她引用了 Ghani 教授的话,强调应制定指导方针,以最大限度地增加积极影响的机会,同时保护那些传统上被边缘化的人。对一些人来说,这种类型的指导可能会显得激进。然而,对许多人来说,捍卫公平的理念是我们既定社会价值观的一部分,符合法律平等保护的法律标准,是我们的集体责任。
打击歧视
我们已经确定了是什么和为什么;让我们在某种程度上定义如何做。我们可以将反歧视方法应用于许多机器学习问题,在不同的发展阶段进行干预(即,先验的,事后的)。
也许,最关键的干预在任何工作开始之前就开始了。女性和有色人种在计算机和数学职业中的代表性不足(Statista,2019)。多元化的团队确保以平衡的视角解决问题。此外,在决定算法应该关注哪些属性之前,量化数据中的多样性和包容性至关重要。玛格丽特·米歇尔和谷歌的一个研究团队提出了多样性和包容性指标,在子集选择的早期促进多样性的表现(Mitchell et al .,2020)。
作为事后分析的一部分,南加州大学的一个研究小组提出了新型的数据中毒攻击,其中对手故意以系统的公平性为目标(Mehrabi 等人,2020)。实际上,这是对模型结果公平性的一种敏感性分析。
谷歌与人工智能伙伴关系合作,为算法审计定义了一个端到端的框架。提供建立政策和原则的机制,包括内部和外部道德期望(Raji et al .,2020)。
这些只是这个新兴研究领域中的几个亮点。
实现社会意识
机器学习从业者在遏制社会偏见和防止歧视方面的功能不是一条直线。应该仔细考虑法律、经济、社会和伦理方面的影响。尽管如此,我们不应该要求个人忽视他们的个人价值,而应该用社会和组织价值来衡量他们。采取预防措施,意识到机器学习解决方案可能对社会产生的影响,并了解算法偏差是如何发生的,以及我们如何解决它。
对于那些可能对使机器学习成为可能的所有复杂性着迷的人,让我们增加另一种魅力——优化公平的结果。建议如下:从一开始就确保算法本质上是公平和公正的,并揭露那些不公平的算法,让机器和人类做出更好的决定。这样做不会治愈社会弊病或纠正历史不公。尽管如此,它可能在许多方面提供了一个新的开始,让决策者在允许歧视和不平等继续存在之前停下来。
参考
Bolukbasi T,Chang K-W,Zou J,Saligrama V,Kalai A。男人对于电脑程序员就像女人对于家庭主妇一样?去偏置词嵌入。arXiv [csCL]。http://arxiv.org/abs/1607.06520。
性别阴影:商业性别分类的交叉准确性差异。MLR . press .[2021 年 2 月 27 日访问]。http://proceedings . MLR . press/v81/buolamwini 18a/buolamwini 18a . pdf。
拉坦亚·斯威尼博士,简历。Latanyasweeney.org。[2021 年 3 月 8 日访问]。【http://latanyasweeney.org/cv.html.
公平算法:研究减少金融服务中人工智能偏见的方法。Congress.gov。[访问日期:2021 年 2 月 18 日]。https://www . congress . gov/116/meeting/house/110499/witness/HHRG-116-BA00-Wstate-GhaniR-2020 02 12-u1 . pdf。
hellstrm T,Dignum V,Bensch S. 2020。机器学习中的偏见——它有什么好处?arXiv [csAI]。http://arxiv.org/abs/2004.00686。
麦卡锡 M. 2019 年 12 月 6 日。算法决策的公平性。布鲁金斯。[访问日期:2021 年 2 月 18 日]。https://www . Brookings . edu/research/fairness-in-algorithmic-decision-making/。
McMahan HB、Golovin D、Chikkerur S、Liu D、Wattenberg M、Hrafnkelsson AM、Boulos T、Kubica J、Holt G、Sculley D 等,2013 年。广告点击预测:来自战壕的观点。收录于:1913 年 KDD 第 19 届 ACM SIGKDD 知识发现和数据挖掘国际会议论文集。美国纽约,纽约:ACM 出版社。
梅赫拉比 N,纳维德 M,莫施塔特 F,高尔斯蒂安 A. 2020。通过公平性攻击加剧算法偏差。arXiv [csLG]。http://arxiv.org/abs/2012.08723。
种族、技术和算法偏见|视觉与正义||拉德克利夫学院。2019 年 5 月 7 日。[访问日期:2021 年 3 月 8 日]。https://www.youtube.com/watch?v=Y6fUc5_whX8。
Raji ID,Gebru T,Mitchell M,Buolamwini J,Lee J,Denton E. 2020。保全面子:调查面部识别审计的伦理问题。摘自:AAAI/美国计算机学会人工智能、伦理和社会会议录。美国纽约州纽约市:ACM。
Raji ID,Smart A,White RN,Mitchell M,Gebru T,Hutchinson B,Smith-Loud J,Theron D,Barnes P. 2020。弥合人工智能责任差距:为内部算法审计定义端到端框架。arXiv [csCY]。【http://arxiv.org/abs/2001.00973】T4。
布雷纳德行长关于支持在金融服务中负责任地使用人工智能和公平结果的讲话。Federalreserve.gov。[访问时间:2018 年 2 月 21 日 b]。https://www . federal reserve . gov/news events/speech/brain ard 2021 01 12a . htm。
斯威尼湖 2013。在线广告投放中的歧视:谷歌广告、黑人名字和白人名字、种族歧视和点击广告。ACM 队列。11(3):10–29..
你似乎无法学习编码的原因可能与天资或努力无关
虽然没有足够的努力你什么也学不到,但事情可能没那么简单。

在 Unsplash 上由 Carlos Deleon 拍摄的照片
只要你愿意付出努力,你有没有天资并不重要——你可以学会做任何事情。
然而,当涉及到学习如何编码时,你经常会遇到这样的情况:无论你付出多大的努力,你似乎都无法抓住一个概念或者理解一段代码是如何工作的。当投入的时间与保留的知识量的成本效益分析似乎不能相加时,多写一行代码(或试图多写一行代码)的想法就像用奶酪刨丝器刮你的额头。
在这一点上,你可能会问自己,“这有这么难吗?”。
而且理由很充分。
你已经对编码失去了所有的热情,这也没有帮助,你已经建立起来的日常习惯现在被推到了一边,因为其他不太费力就能产生即时满足感的事情变得更重要了。
虽然这个历史悠久的故事(或者至少是编程历史悠久的故事)注定会随着新一轮想要学习编程的受启发的人的到来而重演,但自学如何编程可能有更多的原因。
学习编码的旅程。
首先,我们需要了解学习编码实际上是什么样子。
对于那些在六个月内学会编码,然后立即被谷歌聘用的人来说,学习过程可能是相当无缝和线性的,路上很少有颠簸。因为让我们面对现实吧,那些能在六个月内学会编码(我指的是为谷歌构建部署就绪的软件,因为学会“编码”并不足以在白金级公司找到工作)的人,都是才华横溢的人,他们可能从娘胎里出来就已经能说六种语言,并能完成微积分问题。
然而,对于我们这些普通人来说,学习过程可能看起来更像这样:

由作者绘制的图表(我用 matplotlib 绘制的第一张图表!!很难看,我知道,但这是个开始。你知道就像他们说的,如果你找不到有用的东西,就自己做。)
差不多吧。
关键是,这个过程远远不是线性的。
正如 Thinkful 在这篇相关的博客文章中所描述的,学习编码有四个阶段。像任何事情一样,你从蜜月期开始,在这个阶段你仍然充满活力,你需要学习的范围从基本语法开始到结束。你自我感觉良好,因为你学到了很多东西,而且有大量的资源供你支配。
然而,所有的蜜月都必须结束。学习如何编码的第二阶段包括当你开始意识到你实际上还不能完全靠自己做任何事情时,从悬崖上痛苦地头朝下跳下去。当您在 IDE 中打开一个干净的页面,并试图在没有源代码的情况下从头构建一个项目时,通常会发生这种情况。在这一点上,你需要扩展你的能力,超越你所学的基本语法,并试图把它变成实际做一件事的东西。第二阶段是一条漫长而曲折的道路,充满了调试和试图理解 StackOverflow 的代码片段。
的博客帖子相当准确地证明了这种陷入绝望和对两个因素一无所知的巨大落差:资源密度和知识范围。简而言之,在学习编码的第一阶段,您可以获得大量的资源,这使得学习基本语法变得很容易。然而,在第二阶段你需要学习的量要大得多。这样做的问题是,包含这些知识的可用资源数量少得多,也更难理解。换句话说,你需要获得的知识量和你可利用的资源量成反比。
当你进入被恰当地命名为【绝望的沙漠】的第三阶段时,情况只会变得更糟。您需要了解的内容甚至比第二阶段还要多,在第二阶段,像面向对象编程、模块化、框架等概念变得必不可少。然而,你需要获得的知识量和你可用的资源量之间的反比关系变得更加糟糕。这甚至可能是你开始为 MOOCs 或训练营付费的时候,希望找到沙漠的尽头。
但是,如果你坚持下来,你可能会幸运地进入第四个也是最后一个阶段。在这里,你开始看到你作为一个开发人员的信心和能力的上升。您的代码远非完美,甚至可能相当糟糕,但您至少可以构建一个东西,并相对确定地知道您的代码如何以及为什么工作。在这一点上,你可以自信地说你知道如何编码!
为什么你似乎不能学习编码。
当有人说他们正在努力学习编码时,我从来没有想到两件事:他们付出的努力,或者他们的能力。
虽然让自己对学习编码所付出的努力负责是很重要的,但这并不是为什么有人可能在奋斗的全部原因。此外,一个人的编码天赋很少能表明他们学习如何编码的能力。因此,我们需要更深入地挖掘你似乎学不会编码的原因。
事情变得困难了,你的动力也消失了。
这可能是人们学习如何编码时最常见的问题。
学习如何编码的第二阶段和第三阶段之间的过渡,通常是人们开始缺乏继续下去的动力的时候。
这实际上发生在我上大学的时候。直到我们开始研究围绕面向对象编程、模块化和计算机科学基础的更复杂的主题时,一切都进行得很顺利。当然,当我们有一门关于所有这些更高级主题的课程时,我们被分配了一位讲师,他对经营自己的创业公司更感兴趣,而不是实际授课和给我们反馈。基本上,我不得不使用谷歌和 StackOverflow 勉强通过那门课程。到课程结束时,我已经筋疲力尽,缺乏信心,以至于我不再想从事科技行业。
如何避免这种情况:
- 花些时间提醒自己为什么最初对学习编码感兴趣。也许这意味着暂停学习新概念,转而专注于练习你已经熟悉的技能。通过回到基础,你的注意力可能会被重新点燃。
- 当面对一项困难的任务时,不要让自己不知所措。相反,打开白板,从将任务分解成简单的步骤开始。然后,问问自己每一步的结果应该是什么。用英语写下你要完成的目标,然后翻译成你熟悉的代码。如果不是完美的解决方案也没关系。如果你找到一个更好的做事方法,你可以回头修改它。
- 设定可衡量的目标。尽管这个缩写词让我畏缩,但在设定具体的、可衡量的、可实现的、现实的、及时的(SMART)目标背后还是有一些逻辑的。将你的学习目标分成可管理的小块将有助于你集中精力学习,并防止你被你最终将不得不吸收的大量知识淹没。
你试图学习使用不适合你的资源。
还记得你上学的时候,老师让你做一个测试来确定你的学习风格吗?也许是时候回顾一下你的成绩或者重新参加考试了。
学习编码时,发挥你的长处很重要。幸运的是,有许多不同类型的资源,几乎可以保证您会找到一种帮助学习编码更容易的资源。我的建议?在开始的时候,尽可能多地利用你可以利用的资源,然后把你的注意力集中到一两个你觉得特别有帮助的地方。这样,你会在学习过程中获得一些连续性。
对于那些已经挖掘出你的学习风格结果的人来说,这里有一些可以优化你的学习过程的想法:
- 如果你是视觉学习者:使用流程图、代码片段、思维导图和视频。在将想法写在代码中之前,不要害怕展开白板来描绘它们。
- 如果你是一名听觉型学习者:收听 Youtube 视频、视频在线课程或 MOOC 讲座,这样你就可以听导师指导你完成编码过程。此外,尝试教别人如何编码。可能是你的妈妈,你的狗,或者你的仙人掌。教学学习对听觉学习者很有用,他们通过分享知识来巩固概念。
- 如果你是一名阅读/写作学习者:阅读编程语言文档、博客文章、网站文章、代码片段或 GitHub 代码库。此外,试着写你自己的博客文章或方法文章来进一步实践你刚刚学到的东西。
- 如果你是一个动觉型学习者:在看视频或阅读博客时,跟着做,并在你自己的 IDE 中写下代码。此外,基于源代码创建自己的项目,尝试新的想法并通过实践来解决问题。
你正在学习的课程没有考虑到不同概念的难度。
Youtube 上的“4 小时学会这种编程语言”课程……令人沮丧。虽然这些课程对于那些已经熟悉编程的人来说是很好的提神剂,但是这些课程通常在不同的概念上花费相同的时间。你已经可以看到这个问题了。
问题是编程中的概念有不同的难度,这些难度通常与彻底教授概念所需的时间相对应。例如,关于如何写你的第一个“Hello World”的模块应该只需要 5 分钟。然而,如果面向对象编程的模块也只有 5 分钟长,那就有大问题了。5 分钟教不了面向对象编程。那是异端邪说。
如何避免这种情况:
使用费曼技术。费曼技巧是一个帮助你真正理解一个概念的四步过程。整个过程的目标是能够学习一个复杂的概念,然后能够用简单的术语解释它。你用来解释某事的术语和类比越简单,你对这个概念的理解就越好。这项技术可以分为四个步骤,您可以依次遵循:
- 选择一个概念来学习。
- 把这个概念教给自己或别人。
- 如果你卡住了,回到原始材料。
- 简化你的解释,创造类比。
你试图向其学习的导师正试图教授博士级别的初学者。
当学习如何编码时,你通常不是问题。你的教练才是问题所在。
“知识的诅咒”实际上是一种记录在案的认知偏差,这种偏差发生在教师(或任何就此教其他人的人)假设学生有他们所教内容的背景,这样学生就能理解他们所说的一切。
换句话说,你不知道发生了什么。
如何避免这种情况:
- 使用 FreeCodeCamp 的课程,这些课程由现任和前任大学教授或其他自学成才的开发人员讲授。这些人可能是最好的学习对象,因为 a)他们有向初学者教授复杂概念的经验,b)他们曾经和你一样。
- 刚开始的时候,试着从尽可能多的资源中学习,直到你找到一个能让你“一拍即合”的老师。
最后的想法。
我能给的关于学习编码的最好建议是坚持不懈。坚持会帮你度过最糟糕的日子,那时什么都不管用,你不想再多写一行代码。
重要的是要记住,这是可以做到的,许多其他人已经和你在同一条船上。虽然许多人已经放弃了,但是你和他们之间的区别是,你现在对为什么学习编码如此困难以及如何最好地避免常见的学习陷阱有了一些了解。
所以请记住:坚持最终会有回报。相信我,当你看到隧道尽头的亮光时,你不会后悔几个月前你决定要学习如何编码时所做的决定。
数据服务级别协议和数据产品之间的关系
它们是如何关联的,为什么重要

数据行业正在经历另一个变革期,行业领导者挖掘出一项未被充分利用的资产:他们的数据。数据不再是达到目的的简单手段,而是被我们与之交互的几乎每一个界面批量处理、流式传输、转换和收集。反过来,组织正在采用数据驱动的文化,并快速建立新的数据团队来挖掘这一新资源。你可能会问,终极目标?去以前没有数据去过的地方:高级分析。
然而,这些组织如何衡量他们从这些新生数据产品中创造价值的能力呢?输入数据 SLA。数据 SLA 是在这个新领域中为数据概念带来有形性的机制。数据 SLA 是在数据即服务框架内实现数据操作效率的实际应用。
在本文中,我们将探索数据产品和数据 SLA 之间的关系,并讨论在您的组织中实现现实的数据 SLA 可以采取的一些简单步骤。
什么是数据产品?
与大多数史诗般的旅程一样,我们的数据冒险从一个简单的问题开始:我们如何从我们存储的所有这些数据中创造价值?对于许多组织来说,没有一个简单的答案。大多数收集到的数据最终都无法访问或被遗忘,更不用说以有助于分析的方式进行分类了
绿地数据项目往往是一个昂贵的提议。在与收集、处理和存储数据相关的预计工程、基础设施和维护成本与可感知的高失败率之间,数据计划往往不会通过“Go”,也不会“Collect $200”。
组织中的大多数高管认为“人员挑战”是解决这个问题的最大障碍,而不是“技术障碍”。虽然这些角色的专业人才短缺导致了这个“人”的问题,但这更多的是一个哲学(见:心态)问题。这些高管中最精明的人将开始权衡这些未来成本与目前的机会成本,而不是持续的数字运算,这些机会成本是指闲置的数十亿字节数据的机会成本,这些数据似乎有无穷无尽的潜力未被挖掘。
这种思维模式的转变是推动行业创新的关键。行业的最后一个转变是技术上的转变,这支持了高管的观点,即问题更深层次。这一技术转变是增加了存储层;从处理存储和计算的数据仓库到与领域无关的数据湖。
举个例子,组织正在为所有不同类型的团队和用例收集大量数据。随着计算和存储在同一个地方发生,数据模式变得孤立,并且由于缺乏适当的治理,出现了大量重复工作。由于没有可扩展的方法来组织和利用这些数据,数据仓库变得拥挤不堪。
数据行业的领导者开始从数据仓库优先的方法转变为专用的海量存储层,即数据湖。最初的意图是让数据湖存储大量“原始的”与领域无关的数据。然后,数据工程师可以帮助团队和部门将数据从数据仓库转换成可用的形式。最终,数据湖遭遇了同样的问题。虽然计算可能不会在这一层发生,但在数据提供者和消费者之间仍然没有明确的“操作程序”。
谁会把数据从湖边传输到仓库?谁会将数据从仓库传输给消费者?谁将负责在不同阶段清理数据?谁负责调试管道的不同阶段?“更好的数据质量”对消费者意味着什么?根据提供商的说法,什么是实际可实现的?如果你想打破组织孤岛,你需要回答那些问题,而技术无法为你解答。
根据定义,数据产品需要数据 SLA
数据即产品模型旨在弥补数据湖留下的缺口。在这种哲学中,公司数据被视为一种产品,将被内部和外部的利益相关者消费。数据团队的角色是以提高效率、改善用户体验和做出正确决策的方式向公司提供数据。
因此,数据提供者和数据消费者需要合作来回答上面提出的问题。就这些条款达成一致并详细说明,这被称为数据 SLA。
SLA 代表服务水平协议。SLA 是双方之间的一份合同,定义并衡量给定供应商或产品将提供的服务级别,以及在他们未能提供服务时的补救措施。他们试图定义服务提供者和消费者对服务水平和质量的期望。
当一个组织向外部客户或利益相关者提供产品或服务时,它们是非常常见的,但是它们也可以在一个组织内部的团队之间使用。
类似地,数据 SLA 指的是组织数据的质量和可访问性。这充当了数据团队(不仅仅是数据工程)和消费者(内部或外部)之间的契约。这个 SLA 不需要写下来(但是我们确实在这里提供了一个模板)但是它会有所帮助。至少,不成文的 SLA 应该采取双方对话的形式,在对话中,双方概述对他们交付或消费的数据产品的明确和可衡量的期望。
SLA 不应该留有解释的余地。例如,他们需要提供一个具体的、可操作的需求,而不是“我们需要了解用户如何与我们的系统交互”,比如:“我们需要一个报告,显示用户查看了应用程序的哪些页面,用户在该页面停留了多长时间,用户在该页面采取了哪些操作,以及用户每天执行这些操作或查看的频率。”
这种详细程度为数据团队提供了一个目标,通过这个目标,他们可以度量进展,开始打破组织的孤岛,并引入数据治理的文化。
定义和设置您的数据 SLA

(图片由作者提供)
创建 SLA 对每个组织来说都是不同的。也就是说,数据 SLA 通常由四个要素组成:
正常运行时间—我的数据是最新的且可访问吗?分析师每天都要依赖雪花银行的一个表格或 S3 的一个文件。数据是否按时到达正确的位置?
完整性——所有数据是否以正确的格式到达?
数据集中的数据模式、记录计数、空计数需要在预期的范围内才能被认为是可行的。
保真度—数据准确吗?
这个仪表盘代表现实吗?计算的结果可能是正确的,但是数据是真实的还是出了什么问题(比如从错误的源传输数据)。
补救—如果我们没有达到这些标准中的任何一个,我们需要多长时间才能恢复?
工程识别一个问题,找到根本原因,并修复它需要多长时间?在进行某种惩罚之前,多长时间的窗口是可以接受的?
定义您的数据 SLA 就是妥协
根据组织的总体业务目标和个人消费者的需求,您需要优化数据 SLA 的元素会有所不同。在理想的情况下,您将能够保证 99.9999%的正常运行时间、保真度和完整性,并且如果事情确实出了问题,您将能够投入整个工程团队来解决它。
不幸的是,我们被数据质量铁三角所束缚。我这么说是什么意思?当您开始优化您的 SLA 的一个方面时,这将影响您维护其他方面的能力。

(图片由作者提供)
所以,当你在一个领域优化你的数据产品时,它会把你的数据产品从铁三角的中心拉出来。这改变了您的 SLA 对“良好”数据质量的相互认可的定义。
例如,如果停机时间超过可接受的阈值,消费者可以接受每月 90%的更宽松的数据正常运行时间,只要保证他们有更慷慨的补救条款(即,在问题解决或预算重新分配之前的专门支持)。
如何找到合适的平衡点
这三个公理之间存在某种平衡,对你和你的消费者都有效。找到这种平衡意味着与你的消费者进行一次非常坦诚的对话,并找出如何平衡他们的需求与你实际能提供的东西。以下是一些开放式问题,用于指导您与客户之间的 SLA 对话:
我们的 SLA 的粒度是多少?公司范围的 SLA 还是特定于数据集的 SLA?
本文的目标是鼓励每个组织在提供者和消费者之间设置一个 SLA。也就是说,并不是每个数据集都需要定制的数据 SLA。就像在警报中一样,为交付的每个数据集设置唯一的 SLA 会分散数据工程的注意力,造成警报疲劳,并有可能使整个工作被视为理想化的(参见:不切实际),利益相关者将照常工作。
最好的起点是确定哪些数据交付需要专门的、更严格的数据 SLA。每条管道根据其传输的数据都有不同的重要性级别。这种重要程度可以帮助您缩小需要其数据 SLA 的数据集和消费者的范围。
我们的数据产品有哪些 KPI?
虽然您的每个消费者都希望“更好的数据质量”,但他们需要能够量化这对他们意味着什么。大多数团队的数据集都有不止一个 KPI,但是为了简单起见,一个团队的 KPI 可以是数据完整性。
一旦您了解了这一点,您就可以开始将这些数据 KPI 与您的架构的性能和数据健康指标对应起来。对于我们的示例,该目标的性能指标可以是数据健康指标,如空计数或记录计数。

(图片由作者提供)
您已经确定了形成数据 SLA 所需的第一个 SLI(服务级别指标)和粗略的 SLO(服务级别目标)。SLO 是您的绩效目标。在这种情况下,这就是数据完整性。sli 只是你用来衡量目标的工具。对于我们的例子,这是空计数或记录计数。
为了使 SLO 有用,我们需要进一步完善它。“好的”数据完整性是什么样的?交谈之后,您可能会发现 99.9999%的数据完整性对他们来说是最理想的。现在,有了一个具体的 SLO,您将能够准确地计算出您的空计数和记录计数的误差预算,以达到您的目标。
这个练习可以帮助你将一个模糊的要求,比如“更好的数据质量”,转化为可量化的、可测量的、可实现的东西。这些 SLO 和 sli 成为您更大的 SLA 的构建块。
您的数据消费者的期望有多现实?
创建 SLA 的目标不仅仅是让消费者满意。这是为了让数据提供者和消费者站在同一立场上,这样他们就可以一起工作来创造一个更好的数据产品。
以一定的质量标准交付数据涉及到许多移动的部分。如前所述,虽然每个人都喜欢完美的数据,但数据集清理的速度和方式是有限的。预算约束、技术限制和架构结构等工程控制之外的因素会影响数据产品的新鲜度、保真度和修复速度。
在这个阶段,沟通这些限制很重要。虽然 99.9999%的数据完整性对于我们的示例消费者来说可能是理想的,但您可能会根据某些限制因素提出一个更现实的 99.9%的数据完整性目标。你也可以列出一个 99.9999%可能实现的情况。然后,将由消费者来构建业务案例并将其提交给组织的领导层,以证明这些变更的成本。通常情况下,他们会接受你的妥协,而你可以回顾一下这个选择在未来是否仍然有必要。
如何实施数据 SLA?
建立一个数据 SLA 可能感觉有点理想化。当然,这很好,但这一协议在现实生活中会如何执行呢?弄清楚性能报告、审查和补救的流程是成功实施和吹嘘之间的区别。
首先,你需要一种方法来跟踪你的 sli。没有这一点,您就没有一个可验证的方法来表明您正在以可接受的质量水平交付数据。因此,您需要一个数据可观察性工具,让您能够测量端到端的数据健康和管道元数据。这将为您提供静态数据和动态数据的全面覆盖,以便您可以跟踪影响您的数据产品的 KPI。
一旦有了端到端数据可观察性,谁将向谁报告 SLA 性能?如果错过了 SLA 会怎么样?
这些问题没有对错之分。对于您的组织和外部消费者之间的数据 SLA,有一个明确的性能审查和补救过程:客户让您知道您的数据产品是否符合标准,您因此给予他们信用或退款。
当内部利益相关者之间存在 SLA 时,事情会稍微复杂一些。这里的目标不是惩罚性的,而是揭示究竟是什么导致组织内的数据健康状况下降。
SLA 失误可能会导致非常有成效的结果,如重新分配预算以创建专门的支持团队、增加员工人数或新技术。您将有一个记录在案的场景,显示您的业务中哪些领域受到了数据组织效率低下的影响,这使得展示新项目的业务案例变得更加容易。
后续步骤
设置 SLA 可能需要大量的工作。有时候你需要改变你的组织结构,你的建筑结构,或者你的公司文化。这些问题可以作为在数据提供者和数据消费者之间建立一致性的基础框架。
一旦您知道了如何定义您的 SLA,下一个最好的步骤就是建立一个测量和执行 SLA 的系统,这样您就可以交付更好的数据产品。为端到端数据可观察性建立一个系统是最好的起点。一旦您能够衡量您的 KPI,您将获得所需的洞察力,以进行必要的文化或技术转变,从而更好地支持您的数据消费者。
准备好开始跟踪你的数据质量 SLA 了吗?联系我们databand . ai了解详情!
假设检验和置信区间的关系
看看这两个基本概念在广阔的统计世界中的交汇点

内森·杜姆劳在 Unsplash 上的照片
在我上统计学导论课的时候,我发现置信区间和假设检验之间的关系似乎总是有点模糊。这些概念通常是在单独的块中教授的——这是理所当然的。这是两个基本概念,肯定需要大量的时间,但往往不会重新审视,以帮助确定这两个概念实际上如何协同工作的重要性。
很多时候,当学习某些统计技术之间的关系时,起初可能很难看到它们之间的联系,但是在“啊哈!”伙计,这真是太值得了。当我了解到置信区间和假设检验之间的密切关系时,我尤其如此。现在,我希望通过写作来表达我的理解。
我的目的是给出我的观点,以便更好地理解置信区间和假设检验之间的关系,并了解它们如何一起帮助弥合这两个概念之间的差距。
快速浏览
什么是置信区间(CI)?
给定一定程度的概率(置信度),可能捕获未知参数的可能值范围。
使用这个公式,我们可以计算一个置信区间!

谷歌的置信区间公式
置信水平% = 1α
Alpha (α)被称为显著性水平或可接受误差;α = 0.05 通常是一个良好的可接受风险水平,但会因情况而异。
因此,通常情况下,您会看到类似于“95% CI”的内容和一系列值,如下例表所示。

上表来自第一项确定 30-74 岁美国成年人实际心脏年龄的研究。这项研究可以在这里找到https://www.cdc.gov/mmwr/preview/mmwrhtml/mm6434a6.htm?s_cid=mm6434a6_w。
40-49 岁的成年人很可能会有一个超出心脏年龄大约 6 岁的情况,并且有 95%的把握!

实际上,我们是说,如果我们进行多次采样,并计算某个参数(如平均值或回归系数)的置信区间,那么我们可以期望 100 个区间中有 95 个区间能够捕捉到真实的总体参数。
假设检验?
假设检验允许我们使用人口样本数据得出关于某个假设有多可信的结论。在现实中,我们看到的两个变量之间的关系或影响不仅仅是由于纯粹的运气或机会!

一个典型假设检验(双尾)的例子,其中“p”是一些参数
首先,我们陈述我们的两种假设:
零假设(H0) :“现状”或“已知/接受的事实”。说明两个变量之间没有统计学意义,这通常是我们想要反驳的。
举例:H0 = 0;锻炼前后心率有 无 差异。
&
替代假设(H1/哈):零的对立,也是我们正在检验的统计显著性。
例子:H1≠0;有有有 有锻炼前后心率的差别。**
其次,根据问题,我们相应地选择一个测试,并从结果中观察一个测试统计*。*
假设我们的数据遵循标准正态分布,我们使用 z 检验统计,获得 p 值,并由此得出结论。
使用该测试统计或 p 值,我们可以将其与 0.05 的 α进行比较。
如果更小,我们拒绝我们的零假设,并得出我们的替代假设。如果更大,我们无法拒绝我们的零假设,并得出零假设的结论。
但是打住,我们也可以因为 CI 和假设检验的关系,不仅用 p 值还可以用置信区间得出结论!
好吧,那这有什么联系呢?
置信区间和假设检验有一个共同的特点,即它们都是推断技术,使用样本来估计总体参数或检验假设的强度和有效性。
这张图片是一个金块,我认为它对更好地概念化这种关系非常有帮助。(视频链接可以在下面找到!)

在这里找到
我们在这里看到,参考点是不同的。假设检验以零假设参数为中心,置信区间以样本参数的估计为中心。
如何能一前一后地使用这两个概念?
如果在我们的置信区间中发现零假设值,那么这将意味着我们有一个坏的置信区间,我们的 p 值将会很高。通常我们的零假设值将是 0(无差异点),如果我们在置信区间中发现 0,那么这将意味着我们有很大的机会实际发现无差异,,这通常与我们想要的相反。
换句话说,如果零假设值落在置信区间内,那么 p 值总是大于 5%。相反,如果零假设值落在我们的置信区间之外,那么 p 值将小于 5%。

图片由 Rumil Legaspi 提供
说到底这两个概念在我们的结论中应该总是一致的!
一些外卖
- 就我们所知,如果我们在假设检验中使用 5%的 α ,反过来,我们也将使用 95%的置信区间,因为α水平和置信区间总是相互对应的。****
- 置信区间和假设检验都是从人口中抽取的数据样本来推断某种人口参数的方法。
- 置信区间给了我们一个可能值的范围和参数值的精度估计值。
- 假设检验告诉我们对从样本中得出总体参数的结论有多大的信心。
- 当 0 包含在我们的置信区间中时,这意味着我们很可能看到我们的样本和总体参数之间没有差异。此外,假设检验的 p 值可能比我们的 alpha 值高,我们很可能无法拒绝我们的零假设!
- 置信区间和假设区间都可以用于串联,以帮助支持我们的结论!
参考资料:
大数定律与中心极限定理的关系
每个数据科学家都应该知道的两条重要数学定律

俄罗斯圣彼得堡。图片来源: Unsplash (照片由 Elina Sitnikova 拍摄——感谢这张可爱的照片!❤)
在本文中,我将讨论每个数据科学专业人员都应该掌握的两条重要的数学定律。我喜欢用简单的方式解释抽象的概念,所以即使你没有特别强的数学背景,这篇帖子也会是一种脚踏实地的方法。
先从大数定律 (LLN)开始,然后再来看中心极限定理 (CLT)。一旦你完全掌握了 LLN 背后的直觉,CLT 就更容易理解了。
大数定律——简单解释
先说两个简单的例子。这是理解抽象概念的最好方法。
例子 1:扔硬币的🪙
想象一种情况,你掷两次公平的硬币。你认为会发生什么?你可能会期望得到 1 头 1 尾。然而,事情可能会有所不同,你可能会得到 2 头或 2 尾。后两种结果不太可能发生,但如果发生了,你可能不会太惊讶。你为什么要这么做?就两个硬币而已:)
现在,如果你扔同样的硬币 20 次,你会看到大约 10 个反面和 10 个正面。这都是假设硬币是公平的。同样,实际结果可能会有所不同,所以你可能会得到,例如,8 条尾巴和 12 个头。或者,你可能以 1 条尾巴和 19 个头结束,尽管这是一个极不可能的场景。如果发生这种情况,你应该怀疑硬币的公平性。
现在让我们想象把同一个硬币扔 1000 次。你希望得到多少条尾巴?大概 500 左右。也许是 450,也许是 510,但可能非常接近 500。你可能会得到 10 个正面和 990 个反面,但这是不太可能的。如果发生这种情况,你会很惊讶的。
因此,我们越是抛出相同的公平硬币,正面对反面的实际比例就越有可能接近预期比例。这是非常直观的。再说一次,这都是基于硬币是公平的假设。否则,如果你有一个偏向的硬币,有 90%的机会得到一条尾巴,当你扔硬币时,你会期望得到一条尾巴。
那么,这一切对我们意味着什么呢?
当我们不断增加实验次数时,现实会更接近预期。
让我们考虑另一个例子。
例子 2:掷骰子🎲
现在让我们抓住一个公平的骰子而不是硬币,并滚动它。
如果我们掷骰子很多次,这些掷骰子的期望平均值将是 3.5,即(1 + 2 + … + 6) / 6。我们掷骰子越多,这个预期就越稳定,平均值不会偏离 3.5 太多。在最开始,平均结果会很不稳定(见下图),但后来会稳定在大约 3.5 左右。

LLN 在行动:我们掷骰子越多,平均结果越接近 3.5。图片作者:迪娜·扬科维奇(我)
现在我们明白了当我们越来越多地重复一个实验时会发生什么。现实开始符合预期。换句话说,实际平均值非常类似于预期平均值。
用一种更数学的方式来形式化这个概念,让 X₁,X₂,… 是一个有限或无限的随机变量序列,每个变量都有相同的期望𝜇:e(x₁)=e(x₂)=…=𝜇。在掷硬币的例子中,这个条件确保掷硬币是公平的,具有相同的期望值。
根据 LLN,样本平均值x̄=(x₁+x₂+……)/n收敛于 𝜇 随着 n 收敛于无穷大(即随着试验次数的不断增加)。
现在你对大数定律对我们意味着什么有了直觉。它有许多现实生活中的应用——例如,一个赌场可能会从一个幸运的玩家那里输钱,但从长远来看,它会从许多不幸输钱的其他玩家那里赚钱。最终,在这个赌场工作的统计学家实际上完全了解 long 他们有意优化游戏规则,以便从长远来看,赢和输将围绕一个可预测的比率聚集。这样赌场的收益最大化。
拓展到中心极限定理巷
好了,我们澄清了 LLN 是什么。这个概念现在可以进一步推广到另一个叫做中心极限定理 ( CLT )的定律。
还记得胜负平均的 X̄ 吗? X̄ 本质上是什么?这是一个数字。但是这个数字会根据样本大小和一点随机性而变化。因此, X̄ 可以被视为一个随机变量。就像任何随机变量一样, X̄ 在这个世界上有着特殊的地位——它有分布、均值和方差。
但是它有一个非常特殊的分布。 X̄ 为正态分布,均值为𝜇,标准差为 𝜎 。如果我们从 X̄ 中减去𝜇,再把这个除以西格玛,那么z =(x̄—𝜇)/𝜎有一个标准正态分布,均值为 0,标准差为 1。
如果我们将 CLT 应用到掷硬币的例子中,我们知道反面或正面的平均数将服从正态分布。为了向您展示这在实际中是什么样子,请查看下面的模拟。我用一个小的和一个大的 n 模拟了一次抛硬币,在增加 n 的时候得到了一个近乎完美的钟形曲线。
**
形状完美的正态分布,中心在 3.5。所有情节都是我自己的。
作为练习,我建议您编写代码来生成我分享的 LLN & CLT 图。请随意使用小样本和大样本,看看会发生什么。
有趣的事实:根据 3-𝜎法则,我们可以预期 X̄ 在 95%的时间里都在预期平均值 𝜇 的 2 个标准差之内。
就是这样!现在你理解了这两个重要定律背后的数学和直觉,你可以在未来的数据分析中使用这些概念。和 LLN 在一起,你会知道,随着你不断地尝试,你的期望会变成现实。嗯,不总是,但最终😉感谢 CLT,你会知道,如果你足够努力,你总会到达美丽的正态分布之地。
如果您喜欢这篇文章,请关注我,以便在新文章出现时得到通知。敬请关注更多内容!❤
适用于所有数据科学应用的可重复使用的 Python 日志模板
不要使用 print()或默认的 root logger,像专业人士一样设置项目级日志记录。

汤姆·莫比在 Unsplash上的照片
调试和跟踪应用程序执行的最佳方式是通过定义明确、信息丰富且结构方便的日志。
它们是任何编程语言中的任何小型、中型或大型项目的基本组件,而不仅仅是 Python。
几年前我开始使用 Python 日志库,从那以后,我一直在网上查阅无数教程和文章,学习如何有效地使用它,并为我的项目提供最佳设置。
他们都擅长解释如何为单个 Python 脚本设置日志系统。然而,几乎不可能找到一个解释如何设置 Python 日志库以便在应用程序范围内使用,以及如何在所有项目模块中恰当地集成和共享日志信息的工具。
在这篇文章中,我将分享我的个人日志模板,你可以很容易地用于任何项目的多个模块。
我假设你已经了解了日志的基本知识。就像我说的,有很多好文章可以借鉴。
好吧,我们言归正传!👇
制作一个简单的 Python 项目
解释一个新概念时,首先应该用简单的术语,不要把注意力转移到背景信息上。记住这一点,现在让我们继续初始化一个简单的项目,好吗?
创建一个名为“ MyAwesomeProject 的文件夹。在其中,创建一个名为app.py的新 Python 文件。这将是我们应用的起点。我将使用这个项目来构建一个简单的工作示例的模板,我正在谈论。
继续在 VSCode (或者任何你喜欢的编辑器)中打开你的项目。
现在,让我们为应用程序级日志设置创建一个新模块。我们称它为记录器。
我们已经完成了这一部分。
创建应用程序级记录器
这是我们模板的主要部分。我们创建一个名为 logger.py 的新文件。
让我们定义一个根日志记录器,并用它来初始化我们的应用程序级日志记录器。是写代码的时候了!
一些导入和我们的应用程序名称:
*import* logging*import* sysAPP_LOGGER_NAME = 'MyAwesomeApp'
我们将在我们的 app.py 中调用的函数:
def setup_applevel_logger(*logger_name* = APP_LOGGER_NAME, *file_name*=None): logger = logging.getLogger(logger_name) logger.setLevel(logging.DEBUG) formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") sh = logging.StreamHandler(sys.stdout)
sh.setFormatter(formatter) logger.handlers.clear()
logger.addHandler(sh) *if* file_name: fh = logging.FileHandler(file_name) fh.setFormatter(formatter) logger.addHandler(fh) *return* logger
我们将使用预定义的调试级别来定义我们的日志记录器,并使用格式化程序来构造我们的日志消息。然后,我们将它分配给我们的流处理程序,以便将消息写入控制台。
接下来,我们还要确保包含一个文件,我们可以在其中额外存储我们所有的日志消息。这是通过日志文件处理器完成的。
最后,我们返回记录器。
需要另一个函数来确保我们的模块可以在需要时调用记录器。定义一个 get_logger 函数。
def get_logger(*module_name*): *return* logging.getLogger(APP_LOGGER_NAME).getChild(module_name)
此外,为了将这个模块作为一个包使用,我们可以选择创建一个名为 logger 的文件夹,并将这个文件放入其中。如果我们这样做,我们还需要包含一个 _init。文件夹中的 py 文件并做
from .logger import *
以确保我们可以从包中导入我们的模块。
太好了!主设置完成!
设置我们的模块级日志记录
为了更好地理解模板,可以做一个简单的模块来测试我们的日志记录器。让我们将它定义为一个简单的 module.py.
*import* loggerlog = logger.get_logger(__name__)def multiply(*num1*, *num2*): # just multiply two numbers log.debug("Executing multiply function.") *return* num1 * num2
厉害!该模块现在可以访问记录器,并且应该显示带有适当模块名称的消息。
现在就来测试一下吧!
运行我们的脚本并测试记录器
现在,我们构造 app.py.
*import* loggerlog = logger.setup_applevel_logger(*file_name* = 'app_debug.log')*import* mymodulelog.debug('Calling module function.')mymodule.multiply(5, 2)log.debug('Finished.')
注意我们如何在初始化记录器后导入模块?是的,这是必要的。
现在,验证您的目录包含这些文件:

项目的文件夹
最后,只需通过以下方式运行脚本:
python3 app.py
您应该得到如下输出:

您的目录结构也应该改变,以包含新的日志文件。继续检查它的内容!

日志文件出现!
最后的话
这就是如何在项目中轻松集成工作日志设置的方法。😄。
这很简单,你可以很容易地扩展它,以包括不同模块之间的许多层次结构,用日志记录器捕获和格式化异常,用 dictConfig 以更高级的方式配置它,等等。可能性是无限的!
代码库是,位于这里。它也包含了我所有其他文章的资源。你可以继续⭐️和书签!
如果你喜欢这篇文章,每周我都会发布一个故事,分享一些来自数据科学和编程领域的小知识。跟着我永远不要错过他们!
我的另外几篇文章你可能会觉得有用:
https://pub.towardsai.net/7-awesome-jupyter-utilities-that-you-should-be-aware-of-f3afdb75c2b
机器学习模型的旋转门

旋转门,ImaArtist, Pixabay 。
算法如何在非标准用例中重用。
众所周知,学者们会借用自然和其他领域的想法,同时以略微不同的方式将它们应用于新问题。这些天,在数据科学中,我们看到许多想法、技术和科学进步应用于三大领域(NLP、视觉、音频)。
我想论证一下,现在专攻某个领域,让你积累跨领域的工具,可以让你在领域间的转换变得轻松。一旦你掌握了统计学、概率论、信息论、数学、算法和机器学习的基础知识,你就会意识到你可以在各种用途和用例中重用几乎所有的算法。
我认为方法和技术并不直接附属于一个单一的研究领域,事实上,大量的方法可以在不同的研究领域中互换使用。
核心概念
- 简化问题,以选择正确的工具。
- 理解算法之间概念上的相似性,以及如何重用它们。
- 借鉴其他领域的观点是数据科学家的基本特征。
- 了解某些工具相对于其他工具的优势和劣势。
在接下来的部分,我将主要关注算法的相似性和再利用(第 2 点和第 3 点),然而,这些点直接反映了借鉴思想和理解你的交易工具的重要性(第 1 点和第 4 点)。
再利用算法
似乎机器学习中的每个子领域都是其他领域的衍生物,然而,真实的“情况”要复杂得多。这个漂亮的模式可能应该有从每个子字段到其他子字段的连接边。让我们看看这些算法和想法是如何在不同领域之间传播的。
让我们从基础开始。几乎每个函数都可以用作预处理方法、特征工程、增强、模型或集成。
回归、分类和排名
回归算法可以用作分类或排序,反之亦然。这使我们能够变得灵活,通过降低复杂性来简化问题的解决。例如,您正在预测一个连续变量,但是,您可以简单地将其存储起来,并将解决方案转换为分类问题,而不是使用回归算法来解决它。
吴恩达已经很好地展示了逻辑回归是 SVM 的远亲。无独有偶,支持向量机可以用于排序、回归、分类、聚类,大概还有很多其他用法。巧合的是,内核不仅限于 SVM,我们还有 Kernel-PCA 、 Kernel-Kmeans 和 Kernel-LDA 。
排名可以用于推荐,概率可以用于推荐,推荐算法可以用于排名,并不止于此。
概率与信息论
概率已被用于并整合到各种算法中,如朴素贝叶斯、贝叶斯信任网络、马尔可夫模型、隐马尔可夫模型、条件随机场,以及可以说是利用了移动窗口和/或注意力机制的任何算法。巧合的是,这些算法是在借鉴前人思想的基础上发展起来的。此外,使用概率时最常提到的软与硬的概念可用于标注、逻辑图层、堆叠算法、预测、弱监督、注意力等。
信息论 &熵在实际中以各种形式和形态无处不在,如特征选择,在神经网络等。
密度、分布和聚集
以下算法可以归为一个算法家族,尽管它们并不都是直接相关的。比如 PDF , KDE , K-means, GMM ,自组织映射( SOM ,是自聚类的神经网络结构)。我们可以在各种看似相似但解决略有不同的问题的用例中使用它们,例如,我们可以将密度函数视为平均值、聚类、分布、生成模型和扩充。
CRF vs 注意力
具有注意力的移动窗口可以被认为是条件随机场(CRF ),前者查看先前的隐藏状态,而后者查看先前的标签。 CRF 也被应用为神经层,并在猜想中被关注使用。
主题建模
在 NLP 中,我们可以使用通常与主题建模(TM)相关的算法、算法,例如潜在狄利克雷分配,但是我们也可以使用搭配、提取、和 抽象概括、K-Means 聚类中心以及无数其他方法。
神经网络
例如,在神经网络中,层是可以应用于任何算法的概念。例如,卷积层是为卷积神经网络(CNN)开发的。这种类型的层是第一个将算法编码为抽象神经层的抽象层之一。这个想法后来被应用于其他各种各样的领域,比如 2D & 3D CNN 的,递归神经网络层 RNN , CRF 层。
RNNs 可以使用有限状态自动机近似,并且自动机可以被采样以生成对手样本。
Dropout 图层可以被认为是随机森林。想象一下,一个深度网络包含迷你路径和一个中途退出,作为一种创建小树或树桩的方法,这些小树或树桩是在试图实现正则化以防止过度拟合时生成的。有趣的是,的神话是辍学的想法来自对银行的一次访问,而不是从随机森林中借来的。
Word2Vec
每个人都喜欢的一个抽象概念是“嵌入”概念,它已经被应用于字符、单词、标记、句子、段落和文档之间的距离。这是一个很久以前就开始的想法,想想 Dummies、CountVec 或 TFIDF。然而,在 Word2Vec (W2V)发表后,立即出现了使用这种想法的算法的爆炸。基本上,如果你可以从你的数据中创建一个“句子”,你可以在那个句子上使用 W2V,并创建一个嵌入空间。
这个想法已经蓬勃发展,W2V 现在到处都在使用,从实体到歌曲列表。W2V 是真正的先锋,有很多关于它的文章。然而,本文的重点是它如何与嵌入方法本身有如此多的联系。就分辨率而言,正如我提到的,你可以将任何东西推入嵌入算法,从字符、单词、句子、段落和文档等等。您可以对文本(NLP)、分类变量( CAT2VEC )、图形( GNN )进行建模,您也可以对像素进行建模。事实上,有一个很棒的 repo 策划了许多*2vec 算法。
图形神经网络
图形神经网络 (GNN)允许你将图形嵌入到嵌入空间中。GNN 是建立在 W2V 之上的,这是一个快速发展的领域,有许多算法和改进。然而,图可以被认为是邻接表,表可以被转换成关系图,图可以被转换成压缩嵌入空间。因此,我们可以使用经典和现代领域中都存在的算法,例如,一些最常见的例子是社区检测、页面排名、深度行走、node2vec。
信号处理
异常检测
异常检测可以使用传统的基于信号的异常检测算法、PCA、自动编码器、聚类、SVM 等等。
合奏
你可以用任何东西来创建集合,不仅仅是经典的模型,也可以是特征选择、工程、增强、公式、距离、深层功能,基本上是你能得到的任何功能。
变形金刚&注意
回到变形金刚&注意力作为一个概念,它现在正跨越到非 NLP 领域,如计算机视觉,我们看到这种趋势正在向其他研究领域发展。
现实世界的例子:
以下是一些常见的问题,为了在解决问题时利用完全不同的工具,这些问题可以用不同的方式重新表述。
- 以大脑 fMRI 图像为例,它们可以用作 4D 数据,即作为时间序列的 3D 数据(脑盒)、2D 数据(脑切片),或者甚至作为 1D 信号的基于体素的数据。
- 音频也可以转换成单个信号、声谱图或时间序列;与其他类型的方法一起使用,如二维CNN、RNNs 等。
- 自然语言处理模型,如 GPT,可以用在图像上并且具有惊人的竞争力。
- 你可以(试着)根据股票的(开盘价/收盘价)数据来预测股票,也可以根据 2D 用户界面来预测,也就是你在交易者屏幕上看到的东西。你可以使用情绪分析基于文本预测股票。
- 对于信号处理,您可以利用傅立叶变换将信号分解为子频率,这些子频率可以在以后用作特征工程技术。例如,考虑陀螺仪或加速度计信号,您可以使用它们来检测行走、跑步和骑行信号频率,或者作为分类任务的特征。
在这篇文章中,我想传达的是,我们有创造力的自由,并且有无限的方法以新的和创新的方式混合数据和算法。我分享了我对算法和机器学习世界的看法和想法,希望我已经成功说服你,我们不需要将我们的工作分成数据类型、算法家族和语言、视觉或音频等领域。
感谢塔尔·佩里、纳塔内尔·达维多维茨、菲利普·坦诺、奥菲尔·比比、迪安·普莱班、柳文欢·拉松的宝贵意见。
Ori Cohen 博士拥有计算机科学博士学位,主要研究机器学习和脑机接口(BCI)。他在一家智能城市初创公司领导了一个数据科学团队,主要利用机器和深度学习进行自然语言处理(NLP)和理解(NLU)研究。目前,他是 TLV 新遗迹公司在 AIOps 领域的首席数据科学家。他定期在 Medium.com 上写关于管理、流程和所有数据科学的文章。
联系人: LinkedIn | 中|【OriCohen.com】T4|book.mlcompendium.com
适合工作的数据可视化工具
对几种适用于所有技能水平的领先数据可视化工具的思考
在视觉化、代码行或文字之间,我专业创作的几乎所有东西都是无形的。然而,情况并非总是如此。我曾经是一名机械工程师,从事桥梁、高层建筑甚至(短暂地)赛车等工作。
虽然我现在只是一名正在恢复的工程师,但培训永远不会真正离开你。我对第一年工程课最生动的记忆之一是看到一个像这样的工具板。

一个工具板(由塞萨尔·卡里诺·阿拉贡在 Unsplash 上拍摄)
我们被告知,存在大量可用的工具,几乎总是有适合工作的正确工具(和错误的工具),使用错误的工具会使工作变得非常非常困难。
显而易见,但当你看到多面挂满工具的墙壁以及一些落地式工具时,这一信息确实切中要害。
数据可视化也是如此。随着该领域在过去十年左右呈指数增长,数据可视化工具也相应激增。看看这个库列表(源代码文章),按照 API 设计和抽象级别排序。

来自 在数据可视化库的广阔世界中导航 (作者 Krist Wongsuphasawat)
在我们开始包括用于 python istas(Matplotlib/Plotly/Bokeh)、R 用户(ggplot2)、非程序员桌面用户(Tableau/PowerBI)等的包之前,这只是用于基于 web 的可视化的包。
在这堆工具中找到合适的是一项艰巨的任务。当这些工具大多使用不到几年,而且关于它们的信息很少时,情况就更是如此了!
如果你读过我的作品,你可能知道 Plotly 是我常用的数据可视化软件包,它让我可以制作各种自定义图表和创建 web 应用程序。

我用 Plotly 制作了这个镜头图表动画(图片:作者)

以及这个带有 Plotly Dash 的演示应用(图片:作者)
但是我已经在我的工具箱里添加了一些其他的工具,它们确实对我的某些工作有所帮助。所以我想我应该在这里谈一谈我个人最喜欢的工具。
数据包装器
对有利:立即制作出漂亮的、可投入生产的图表
对不利:与他们的模板有任何不同
如果你想在尽可能短的时间内从数据到图表,DataWrapper 在我看来是最好的工具。我把音量调大了一些,这里有一些是我之前创作的。

这是我之前创作的一些(图片:作者)
这些图表更多的是在大约 10-20 分钟内完成的。DataWrapper 的图表一开始也是交互式的——无需进一步设置任何交互性(参见第一个图表和第二个图表)。
DataWrapper 的风格语言是如此独特和不可错过,以至于你甚至可以从新闻媒体的许多图表中认出这种风格。
这可能也是它最大的局限性。
DataWrapper 基本上是可视化的 mad libs 等价物,允许用户填充空白,而只允许填充空白。虽然您可能会稍微偏离脚本,但是您会受到框架的结构和前提的约束。
因此,让我们换个角度来看看天平的另一端——D3。
D3.js
有益于:基本上生产你想要的任何东西,数据驱动你的视觉化
对不好:我们这些赶时间的人
这是我上周为一个客户创作的草稿。它根据 A 队在积分榜上的位置(阶梯)、对手的位置以及比赛是在主场还是在客场进行来可视化 A 队的赢/输记录。
(可惜 A 队不太好。)

我的 DataViz 的草稿显示了 EPL 队的输赢记录(图片:作者)
我用 D3 做了这个,数据来自 FBref.com T21。在过去的几个月里,我一直试图断断续续地自学 D3,因为它允许你做这样的事情——创建只受你的想象力和数据限制的定制可视化。
与纯粹的图形设计包不同,D3 将数据绑定到可视化,因此改变数据会相应地移动组成组件,就像这样:

或多或少相同的代码,但具有不同的底层数据(图片:作者)
与第一张图表相比,我只做了一些改变,我把赢和输合并成一组。主要的视觉差异来自于数据的变化——这是由于车队在积分榜上的排名稍微靠前一些。
那太好了;除了——我有没有提到在过去的几个月里我是如何断断续续地自学 D3 的?实际上,可能接近一年。有点艰难。我不是前端开发人员,任何 JavaScript(D3 是基于它构建的)都让我觉得自己好像是 Bletchley Park 的实习生,看着 Enigma 机器的输出。
Python 对我来说很有意义,而 JavaScript 只是感觉…武断。我肯定不是最快学会这种东西的人,所以你的里程数可能会有所不同,但谷歌快速搜索关于“D3 学习曲线”的结果表明我并不孤单。
但是 D3 是如此强大和灵活,以至于我不能退出它,我很高兴我没有。
你最喜欢的是什么?
这两个是现有工具包的极端。
一个是最大化便利性和可用性,另一个是可定制性和抽象性。我很高兴我花时间找到了 DataWrapper(它似乎并不像和那样广为人知),并且我花时间学习 D3,尽管我感觉有点像一个带着超级计算机的蹒跚学步的孩子。
我希望那是有趣的。我很想知道——你个人最喜欢的 DataViz 工具是什么?让我知道!
在你离开之前:如果你喜欢这个——在 Twitter 上打招呼/关注,并查看我的免费简讯,在那里我写了所有关于数据/数据可视化的事情。
原载于https://visualnoise.substack.com。
交叉验证 SMOTE 的正确使用方法
本文讨论了在使用交叉验证时,使用 SMOTE 避免不准确的评估指标的正确方法

本文假设读者具备 SMOTE 的工作知识,SMOTE 是一种处理不平衡类问题的过采样技术。我们将讨论使用 SMOTE 的正确方法,以避免在使用交叉验证技术时出现不准确的评估指标。首先,我们将看看可能导致不准确的交叉验证指标的方法。我们将使用来自 Scikit 的乳腺癌数据集-了解哪些类别略有不平衡。

方法 1
在上面的代码片段中,我们将乳腺癌数据分成了训练集和测试集。然后,我们使用 SMOTE 对训练示例进行了过采样,并使用过采样的数据来训练逻辑回归模型。我们计算了交叉验证分数和测试集上的测试分数。上面的方法并不是使用 SMOTE 或‘imb learn’包中任何欠采样/过采样技术的正确方法。这种方法可能导致不准确的交叉验证分数,这可能与测试分数或看不见的数据上的分数有很大不同。让我们看看在使用交叉验证时使用 SMOTE 的正确方法。

方法 2
在上面的代码片段中,我们使用 SMOTE 作为管道的一部分。此管道不是“Scikit-Learn”管道,而是“imblearn”管道。因为 SMOTE 没有“fit_transform”方法,所以我们不能将它与“Scikit-Learn”管道一起使用。
从上述两种方法的结果来看,我们看不出这两种方法的交叉验证分数有什么大的不同。然而,与第一种方法相比,第二种方法产生的交叉验证分数非常接近测试分数。这可能只是偶然发生的,也可能是因为数据集不是高度不平衡的。
现在,我们将运行一个实验,使用“Scikit-Learn”包的“make_classification”方法生成 500 个具有类别不平衡的合成数据集。本实验旨在评估上述观察结果是否纯属偶然。由于我们使用的是逻辑回归,我们将确保生成的数据集中没有多重共线性。
在上面的代码片段中,我们定义了一个名为“model”的函数,它将输入要素(X)、类(y)和一个布尔值“smote”(指示 SMOTE 是否应该是管道的一部分)作为参数。我们首先将数据分为训练集和测试集,然后基于“smote”参数,我们将 smote 包括在管道中(如果“SMOTE”为真,SMOTE 将是管道的一部分),并计算交叉验证和测试分数。
在上述代码片段中,我们一次生成一个合成数据集,将其传递给“模型”函数,计算管道中包含和不包含 SMOTE 的交叉验证和测试分数,并将结果存储在数据帧中。下面,我们可以看到转置输出数据帧的快照。

转置输出数据帧
N_SAMPLES:
Number of examples in the dataset.N_FEATURES:
Number of input features.N_INFORMATIVE:
Number of features carrying information.CLASS_SEP:
Magnitude of class separation. The higher the magnitude, the simpler would be the classification problem.MINORITY_CLASS_WEIGHT:
% of minority class samples. 0.26 means the minority class (1) forms 26% of the dataset.SMOTE_IN_PIPELINE_CV_SCORE:
CV score when SMOTE is included in the pipeline. This is the right way of using SMOTE.SMOTE_IN_PIPELINE_TEST_SCORE:
Test score or score on unseen data when SMOTE is included in the pipeline. This is the right way of using SMOTE.SMOTE_OUTSIDE_PIPELINE_CV_SCORE:
CV score when SMOTE is not included in the pipeline. This is the wrong way of using SMOTE.SMOTE_OUTSIDE_PIPELINE_TEST_SCORE:
Test score or score on unseen data when SMOTE is not included in the pipeline. This is the wrong way of using SMOTE.SMOTE_IN_PIPELINE_PERCENT_DIFF:
The difference between the cross-validation and test score when SMOTE is included in the pipeline. This is the right way of using SMOTE.SMOTE_OUTSIDE_PIPELINE_PERCENT_DIFF:
The difference between the cross-validation and test score when SMOTE is not included in the pipeline. This is the wrong way of using SMOTE.
从数据帧的上述几个记录可以看出,在大多数情况下,与“SMOTE _ OUTSIDE _ PIPELINE _ PERCENT _ DIFF”相比,“SMOTE_IN_PIPELINE_PERCENT_DIFF”非常低。我们将借助统计学来确保这些观察不是偶然的。

作者图片
上面的密度图显示百分比差异是偏斜的。这可能是由于数据集具有高度不平衡的类,并且模型(逻辑回归)无法正确拟合数据。现在让我们在百分比差异列中寻找异常值。

百分比差异列中的异常值
我们可以看到,当 SMOTE 被包括在流水线中时(‘SMOTE _ IN _ PIPELINE _ PERCENT _ DIFF’),与 SMOTE 在流水线之外时(‘SMOTE _ OUTSIDE _ PIPELINE _ PERCENT _ DIFF’)相比,交叉验证和测试分数的百分比差异较低。现在,我们将删除离群值。

剔除异常值后的百分比差异

移除异常值后以百分比差异形式保留的记录
在四次拟合和变换“离群点去除器”之后,离群点被完全去除。我们可以看到,在剔除异常值的过程中,只有一小部分数据会丢失。

去除异常值后百分比差异的密度图
从上面的密度图中,我们可以看到百分比差异柱看起来相当高斯。我们将计算平均百分比差异的置信区间(置信水平为 95%),并确保观察结果不是偶然的。

作者图片
调查的结果
进行该实验是为了确保来自乳腺癌数据集的结果不是偶然的。我们可以看到,当 SMOTE 在管道之外时,交叉验证和测试分数之间的百分比差异很大。这表明在管道中包括 SMOTE 会导致更准确的交叉验证分数。这个实验表明来自乳腺癌数据集的观察只是偶然的。
限制
所进行的实验有一些局限性。由于上述实验是在受控环境中进行的,因此其结果可能无法用于估计总体参数。只有在以下情况下,置信区间中的值才是准确的
- 所选数据集具有用于进行实验的范围内的要素(即样本数量必须介于 10,000 和 50,000 之间,依此类推)。例如,你不能仅仅通过调查“20-30 岁”年龄段的“女性”来估计整个人口的参数。
- 使用的模型是逻辑回归。在这个实验中没有评估其他算法对结果的影响。因此,我们不能将这些观察结果推广到所有的算法。例如,SMOTE 在管道中的位置可能不会对随机森林算法产生太大影响(如逻辑回归算法)。实验必须用多种算法进行,以排除一种算法对结果的影响。
对未来研究的建议
- 通过从当前的 500 个样本中增加样本量并使用更多样化的数据集,可以进行类似的实验。
- 可以评估各种算法对结果的影响,以确保不同算法的观察结果不会不同。
- 发现“少数 _ 类 _ 权重”和“SMOTE _ OUTSIDE _ PIPELINE _ PERCENT _ DIFF”之间的相关系数为-0.45,而“少数 _ 类 _ 权重”和“SMOTE_IN_PIPELINE_PERCENT_DIFF”之间的相关系数为-0.2。这表明,随着少数类的规模减小,当 SMOTE 在流水线之外时,交叉验证和测试分数之间的百分比差异增加。可以通过改变“MINORITY_CLASS_WEIGHT”并控制合成数据集的所有其他参数来执行类似的实验。这使我们能够在使用过采样/欠采样技术以及交叉验证技术时,直接找到少数类权重对交叉验证和测试分数之间的百分比差异的影响。
计算 Shapley 值的正确方法
提示和技巧
比较 SHAP 和 ACV 两个图书馆对传统机器学习用例提供的基于 Shapley 值的解释。
量子计量——MAIF

介绍
随着集成模型和深度学习的出现,人工智能进入了一个黄金时代,机器学习社区正在进入可靠人工智能的时代。在这种背景下,随着越来越多的工具被开发出来“打开黑盒”,人们对算法可解释性的兴趣越来越大[1]。在这些工具中,有一个似乎是至高无上的:SHAP。SHAP 是一种博弈论方法,使用 Shapley 值的有效计算来解释任何机器学习模型的输出[2]。简而言之,Shapley 值估计每个变量对模型预测的贡献。如果你曾经试图解释黑盒模型,我敢打赌你用过 SHAP…
尽管 SHAP 很受欢迎,但它也有一些局限性[3]:
- 对独热编码分类特征的不良处理导致错误的 Shapley 值:特征的贡献不是独热列的贡献的总和!
- 要素相关时 Shapley 值的有偏近似(甚至错误)。
当试图理解模型如何做出预测时,使用可靠的方法是很重要的。在这方面, ACV 图书馆 ( 主动变量联盟)提供了一种计算 Shapley 值的新方法来解决这些问题,这得益于:
- 一种计算特征联盟贡献的严格方法,解决了一次性编码问题。
- 特征相关时计算 Shapley 值的稳健方法。
为了突出这两个库之间的差异,我们对电信客户流失数据集进行了比较研究,该数据集已经在可解释的人工智能文献中使用[4]。
研究大纲
当在具有高比例的一次性编码分类要素和相关要素的数据集上训练模型时,SHAP 和 ACV 之间的差异将非常显著。由于 18 个特征中有 10 个是分类的,并且总体上具有很高的相关性,所以电信客户流失数据检查了这两个框。
现在我们已经讨论了这个问题,我们想训练一个黑盒模型并回答这个问题:“ACV 比 SHAP 对我的模型提供了更好的解释吗?”。根据定义,这是一个棘手的问题,因为不可能知道和理解黑匣子是如何工作的(这就是为什么我们首先需要 SHAP!).那么如何比较 2 种解释的质量呢?
在这项研究中,我们提出了一个简单的方法来回答这两个问题:如果我们不能看到黑盒内部,我们可以首先尝试控制我们的数据的生成关系。如果我们知道数据集 (X,y) 的“真实”生成函数y= g(x) ,并且我们假设我们的黑盒模型【yᵖʳᵉᵈ= f(x)合理地忠实于【g,那么衡量对 f 的解释质量的一个好方法是
为了访问我们的数据的生成功能,我们训练了一个可解释的加法模型g(x)= g₁(x₁)+g₂(x₂【t43)+⋯+gₚ(x对于这一步,我们使用了在 InterpretML 库中实现的可解释增强机器(EBM)。由于它的附加性质,这个模型很容易解释,我们可以很容易地访问将预测与每个变量联系起来的函数。换句话说,由于 EBM,我们可以显示每个特征对预测的贡献【gᵢ(xᵢ】的图形表示。例如,变量每月费用的“实际”贡献如下图所示:**

月收费对循证医学预测的实际贡献。图片作者。
概括来说,下面是我们使用的协议的简要概述:
- 在训练集【xᵗʳ,yᵗʳ】上训练 EBM(可解释助推机)获得 g 。
- 用预测 替换【yᵗʳ】【yᵉᵇᵐ= g(x)+ϵ(添加了一些噪声以模拟真实情况)。
- 在【xᵗʳ,yᵗʳ】(我们使用 Scikit Learn 的 GradientBoostingClassifier)上训练一个传统的黑盒梯度提升,得到 f (我们的模型在这个半合成数据集上表现异常好:ROC_AUC=0.94)。
- 用 SHAP 和 ACV 解释梯度推进模型 f。
沙普利价值观与 SHAP 和 ACV
训练模型后,我们计算了两组不同的 Shapley 值:
- 使用来自 SHAP 的树解释器算法,将特征扰动设置为“树路径相关”,这被认为是处理变量之间的相关性。
- 使用 ACV 的 ACV 树算法,该算法声称在处理相关特征方面比 SHAP 做得更好。
在详细验证这一说法之前,我们可以比较测试集(图 2)上 Shapley 值的平均值,看看 SHAP 和 ACV 是否同意变量的全局重要性:

SHAP 和 ACV 的要素重要性(每个要素的 shapley 平均值)。图片作者。
两个库似乎都同意哪个特性最重要。尽管如此,我们还是可以观察到一些差异,特别是月度费用和总费用的重要性,这是两个非常相关的数值变量(皮尔逊相关系数= 0.65)。为了以更精确的方式显示差异,我们可以计算每个特征的贡献分布之间的相对 L1 距离:

SHAP 和 ACV 计算的 Shapley 值之间的平均相对距离。图片作者。
**月度费用和总费用的分布差异最大,其次是合同、流媒体和技术支持,这是 3 个一次性编码的分类变量。
SHAP 和 ACV 之间的本地解释差异
既然我们知道某些特征有不同的解释,让我们看看它对我们预测的实际解释意味着什么。为了测量解释之间的“差异”,我们可以计算每个观察值的 SHAP 和 ACV 贡献之间的肯德尔等级相关系数。为了研究“最不同”解释的预测,我们可以看看系数最低的解释。让我们来看看 SHAP 和 ACV 在其中一个预测上的区别:

在客户端 233 上预测 SHAP 和 ACV 的 10 个最重要的贡献。图片作者。
- **月度费用对 SHAP 来说是最重要的正贡献(0.269),但对 ACV 来说是负贡献(-0.186)。
- 任期对 ACV (-0.479)来说是最重要的贡献,但对 SHAP (-0.048)来说仅排在第十位。
- **合同对 SHAP (-0.435)是第二重要的贡献,但对 ACV (-0.054)仅是第十重要的贡献。
我们可以看到,对某些人来说,ACV 给出的解释与 SHAP 给出的解释大相径庭。在模型用于可能影响个人的决策制定的情况下,这可能会产生一些现实生活中的后果。例如,如果你想改变模型的预测,知道像月费这样的变量是积极的还是消极的会导致相反的决定。类似地,知道像任期这样的变量对于模型来说是否是最重要的,可以极大地改变解释和随后的潜在决策。
关注每月费用和总费用
对功能每月费用和总费用的解释差异特别有趣,因为它们的相关性很高。当特征相关时,ACV 声称能提供比 SHAP 更好更稳定的解释。让我们将月度费用的计算贡献(Shapley 值)分布与可解释的 Boosting 机器提供的数据生成图进行比较:

(上图):y 与月度费用的“实际”关系
(中图):SHAP 月度费用特征贡献分布
(下图):ACV 月度费用特征贡献分布。图片作者。
即使它们都大致遵循实际贡献的趋势,SHAP 和 ACV 的图表似乎在[20,40]和[100,120]中包含的月费用值的贡献符号上有一些错误(如果我们假设我们的模型大致符合实际贡献)。这可能会给我们一个错误的解释,我们的模型的行为可以制定如下:
“月电荷对我们预测的贡献通常随着其值的增加而增加,除了区间[20,40]当其贡献为正时,以及区间[100,120]当其贡献迅速减少时”
实际的解释应该是这样的:
“当月度费用值小于 70 时,其贡献为负,此时其贡献开始增加”
即使这两种方法都有错误,我们确实观察到 ACV 更稳定,更忠实于生成模式。在图的开始,很少有贡献是正的,而在结束时“减少”就不那么明显了。为 ACV 点上!
现在让我们来看看 TotalCharges:

图 6:(上图):y 和 TotalCharges 之间的“真实”关系
(中图):SHAP 的 TotalCharges 特征贡献分布
(下图):ACV 的 TotalCharges 特征贡献分布。图片作者。
对于这个功能,SHAP 和 ACV 之间的区别是坚持。对于超过 6000 的总电荷的值,SHAP 的贡献开始急剧增加,并达到正值 2,此时生成函数保持恒定且为负。由于计算的复杂性,真的很难知道为什么 SHAP 会这样,但我们可以说它为数据集的重要部分提供了错误的解释。另一方面,ACV 贡献保持稳定,并与生成功能一致。为 ACV 点上!
为了结束这种比较,让我们看看 SHAP 和 ACV 对直接在原始数据集上训练的黑盒模型的解释。换句话说,数据科学家会为标准的机器学习管道做什么。让我们看看在这种情况下总费用和每月费用的分摊情况:

每月费用和合计 SHAP(左)和 ACV(右)的费用分担。图片作者。
有意思!我们看到,对于这两个特征,ACV 似乎比 SHAP 更忠实于 EBM 所学习的功能(如图 5 和 6 所示)。由于黑匣子的性质,我们无法从这个结果中得出严格的结论。然而,这似乎表明,用 ACV 计算的沙普利值为该模型提供了更有力的解释。我认为这仍然值得 ACV 再得一分!
主动联盟与主动 Shapley 值
Shapley 值通常用于查找模型的最重要特征。这种选择是在观察了解释之后做出的,保留的变量数量往往是任意的。为了解决这个问题,ACV 还引入了一种新的工具,称为主动沙普利值【5】,它通过计算贡献被认为可以忽略的变量的“零联盟”来为你做出选择。它通过将零贡献归因于“无效联盟”中的变量,并在有效联盟的变量之间公平地分配“支出”来提供更简洁的解释。
计算有效联盟和无效联盟的方法需要相同决策概率的概念,本文不涉及这一概念。如果你想了解更多关于这些花哨的方法,请访问 ACV GitHub 或阅读 Amoukou 等人的 2021【5】。
下图显示了为客户端 233 计算的活动 Shapley 值:

客户端 23 上预测的活动 Shapley 值(ASV )(底部),将
与用 ASV 计算的“完整”Shapley 值(顶部)进行比较。图片作者。
最重要的变量中只有 4 个被保留,我们可以看到合同和支付方式的贡献显著增加。如果您的目标是找到最重要的变量,这是一种更容易理解的计算 Shapley 值的方法。在我们的例子中,我们直接看到付款方式、合同、月费和任期是这个预测的最重要的变量。
结论
在本文中,我们已经表明,ACV 可以提供一种更可靠的方法来计算 Shapley 值,从而在特征相关/分类时导致更真实的解释。对于“更简单”的场景,两个库之间的差异并不总是那么重要,但是 ACV 仍然是一种更健壮的方式来提供基于 Shapley 值的解释。需要注意的是,ACV 并不是完全模型不可知的,它只适用于基于树的模型(Random Forest,XGBoost,LightGBM…)。最后,ACV 提供了其他工具,如相同的决策概率或积极沙普利值[5]来严格解释模型。访问 GitHub 页面了解如何使用它,并发现 Salim Amoukou 及其合著者的论文。
本文中的所有 Shapley 值图表都是使用 Shapash 获得的,Shapash 是一个非常好的用户友好的软件包,用于可视化 Shapley 值(由 MAIF 开发,Quantmetry 公司提供)。Shapash 可以使用 SHAP 或 ACV 作为计算 Shapley 值的后端。
MAIF 和 Quantmetry 在一个研究合作项目中对真实数据集和内部模型进行了类似的分析。类似的差异也有报道。我们都认为值得信赖的人工智能方法必须基于透明和可测试的计算技术,我们建议在使用可解释的工具作为黑盒本身时要持批评态度!这个实验可以用 ACV GithHub 上的笔记本重现。
加入
我在量子力学公司工作。Quantmetry 自 2011 年成立以来一直是先驱和独立的公司,是法国领先的纯人工智能咨询公司。在提供卓越的数据治理和最先进的人工智能解决方案的愿望的驱动下,Quantmetry 的 120 名员工和研究顾问将他们的热情投入到为所有行业的公司提供高业务成果的服务中。
贡献者:
西里尔·勒梅尔、蒂博·雷亚尔、萨利姆·阿穆库、尼古拉·布鲁内尔
参考
[1] Christoph Molnar,制作可解释黑盒模型的指南 (2021)
[2] Lundberg 等人,解释模型预测的统一方法 (2017),NIPS 17
[3] Amoukou 等,变量联盟的 Shapley 值提供了更好的解释 (2021)
[4] Nori 等人, InterpretML:机器学习可解释性的统一框架 (2019)
[5] Amoukou 等人,用于解释预测和关注局部重要变量的精确和稳健的 Shapley 值 (2021)
认知人工智能的兴起
思想和理论
结构化的、明确的和可理解的知识可以提供一条通向更高机器智能的道路

图片来源:丁玲·戈伊·stock.adobe.com
深度学习(DL)正在产生巨大的进步,并在生活的各个方面彻底改变整个行业,包括医疗保健、零售、制造、自动驾驶汽车、安全和欺诈防范以及数据分析。然而,为了构建人工智能(AI)的未来,有必要定义一系列目标和期望,这些目标和期望将推动新一代技术超越我们今天看到的部署。到 2025 年,我们很可能会看到人工智能所展示的能力出现绝对的飞跃,机器变得明显更聪明。
许多当前的 DL 应用处理与对象识别、自然语言处理(NLP)、翻译相关的感知任务,以及涉及数据的广泛相关性处理的其他任务,例如推荐系统。DL 系统基于差分编程和复杂的基于数据的关联提供卓越的结果,并有望在未来几年推动各行业的变革。与此同时,必须克服 DL 本身固有的一些基本限制,以便机器学习,或更广泛的人工智能,能够更接近实现其潜力。要实现非增量创新,需要在以下三个领域协同努力:
- 显著提高模型效率(例如,将参数数量减少两到三个数量级,而不损失准确性)
- 显著增强模型的健壮性、可扩展性和可伸缩性
- 分类提高机器认知
在其他发展中,变形金刚的创造和它们在语言建模中的应用使得的计算需求在最近几年里大约每 3.5 个月翻一番,凸显了提高模型效率的紧迫性。尽管神经网络在加速和优化方面有所发展,但如果模型效率没有提高,当前的模型增长趋势将无法长期持续。
图 1 显示了基于 DL 的语言模型中参数数量的指数增长:

修剪、稀疏、压缩、提取和图形神经网络(GNNs)等技术在效率方面提供了有益的进步,但最终会产生增量改进。在不影响结果质量的情况下,模型规模的数量级缩减可能需要对获取和表示信息本身的方法以及 DL 模型内的学习能力进行更为根本的改变。持续的进步将需要“显著”更高效的计算 DL 方法或转向其他机器学习方法。 一类很有前途的人工智能系统正在使用从辅助信息库中检索来取代嵌入非常大的事实和数据集合,这些系统正迅速获得牵引力。使用集成了神经网络和按需注入的附加信息的人工智能系统可能会缓解一些语言模型的增长趋势。
与此同时,统计机器学习方法依赖于这样的假设,即训练样本的分布代表了推理过程中必须处理的内容,这在现实生活中造成了重大缺陷。特别地,当遇到在训练数据集中稀疏采样或者甚至在训练数据中不存在的情况时,DL 模型受到挑战。当应用预先训练的模型进行跨领域推理时,所谓的黑天鹅事件(不可预测且具有巨大影响的事件)的影响可能特别有害。
迁移学习和少击/零击推理的进步提供的结果仍然远不令人满意。模型的无效可扩展性阻碍了将人工智能扩展到数据集和数据科学家不丰富的许多领域。人工智能对更广泛的商业案例的适用性要求一种全新的方法,在基于 DL 的系统中集成信息和知识,以处理涵盖现实生活案例的长尾分布。DL 也非常容易受到数据变化的影响,并可能产生不可信的分类,这可以在提高健壮性和可扩展性时得到解决。
最后,在很大程度上,神经网络不能正确地提供认知、推理和解释能力。深度学习缺乏处理人类智能基础任务的认知机制,缺少抽象、上下文、因果关系、可解释性和可理解的推理等能力。
为认知人工智能辩护
有一股强大的推动力推动人工智能进入类似人类的理解领域。根据丹尼尔·卡内曼在他的书思考,快与慢中定义的范式,Yoshua Bengio 将当代 DL 的能力等同于他所描述的“系统 1”——直觉,快速,无意识,习惯性,和很大程度上的解决。相比之下,他规定人工智能系统的下一个挑战在于实现“系统 2”的能力——缓慢、逻辑、顺序、意识和算法,例如规划和推理所需的能力。以类似的方式,Francois Chollet 描述了人工智能能力发展中的一个新阶段,该阶段基于广泛的一般化(“灵活的人工智能”),能够适应广阔领域内未知的未知事物。这两种特征都与 DARPA 的第三波人工智能相一致,其特征是上下文适应、抽象、推理和可解释性,系统为现实世界的现象类别构建上下文解释模型。这些能力不能仅仅通过回放过去的经历来解决。实现这些能力的一个可能途径是通过将数字逻辑与符号推理和深层知识相结合。我将使用“认知人工智能”这个术语来指代人工智能的这个新阶段。
虽然预计不会达到开放式人工通用智能(AGI)的目标,但具有更高认知能力的人工智能将在技术和商业中发挥更大的作用,既通过这一组共享的认知能力,也通过在人类和机器之间关系的基础上导航的共享价值观。一旦人工智能能够在不可预见的环境中做出可靠的决策,它最终将获得更高的自主权,并在机器人、自动驾驶交通以及物流、工业和金融系统的控制点等领域变得重要。最后,人机合作水平的提高是可以预期的,因为人工智能代表了一个积极和持久的代理,当它服务于人们并向他们学习时,它与人们进行交流和合作。
结构化知识在认知人工智能中的作用
在人工智能领域,有些人认为通过进一步发展人工智能可以实现更高的机器智能,有些人认为有必要加入更多的基本机制,这两种人之间存在分歧。我属于后一种阵营——让我解释一下原因。
DL 掌握从输入通过嵌入空间中的多维结构到预测输出的基本的基于统计的映射。这有助于 DL 在广泛和浅层数据的分类中表现出色(例如,图像中的一系列单词或像素/体素)。输入数据携带有限的位置信息(例如像素、体素或字符相对于其他元素的位置)和有限的结构深度。人工智能系统的任务是发现特征、结构和关系。DL 在索引非常大的来源(如维基百科)和从语料库中最匹配的地方检索答案方面同样有效——在基准测试中如 NaturalQA 或efficient QA所示。如 Bengio 所定义的,系统 1 任务依赖于训练期间创建的统计映射函数。对于这些任务,DL 提供了。
相反,结构化的、明确的和可理解的知识可以提供一条通向更高的机器智能或系统 2 类型能力的途径。结构化的知识可以捕捉和表现与人类智能相关的全部丰富性,因此构成了更高智能的关键成分。一个基本的知识构造是捕获关于元素和概念的声明性知识以及编码抽象概念的能力,比如类之间的层次属性继承。例如,关于鸟类的知识,增加了雀形目物种的细节,加上麻雀的细节,提供了大量关于栗麻雀的隐含信息,即使没有具体说明。其他知识结构包括因果和预测模型。
这种结构依赖于明确的概念和明确的、公开定义的关系,而不是潜在空间中的机器嵌入,并且所得到的模型将具有更广泛的解释和预测潜力,远远超过统计映射函数的能力。通过捕捉因素和力量之间关系的潜在模型,可以对当前事件的因果关系进行逆向分析,或者对预测的结果进行正向分析。潜在动态的模型可以更丰富,包括上下文、内部状态和从未遇到过的模拟序列。
人类大脑展示了“想象”的能力,模拟和评估从未通过经验或观察遇到的潜在未来。这些能力为人类智能提供了进化优势。在一个复杂的世界里,个人不得不在尚未经历过的场景中做出选择。在不受明确规则约束的环境中,对未来可能事件的心理模拟基于世界动力学的潜在模型,并在规划和解决问题方面提供了巨大的适应价值。由此产生的人类适应和做出选择的能力使用了其他哺乳动物所不具备的大脑的不同部分,其他哺乳动物的任务主要是快速和自动的现成映射功能。
对于高级认知来说,过程建模机制是必不可少的,它基于隐蔽的数学、物理或心理学原理,超越了输入到输出可观察的统计相关性。例如,物理模型可以捕捉打滑现象,并提供各种条件下汽车运动的简明预测。通过物理建模而不是(或除此之外)利用来自测量的训练数据的统计推断来解决滑水问题,可以有效地处理非分布情况和现实生活中可能发生的长尾现象。在更高的层面上,拥有一个陈述“E=mc”的狭义相对论模型抓住了阿尔伯特·爱因斯坦在表达元素之间的基本关系方面的天才,而不是从多次测试中提取的统计相关函数。这种过程模型可以与基于 DL 的方法相结合,以扩展当前的功能。
知识库可以捕获(否则是隐含的)常识性假设和底层逻辑,这些逻辑并不总是在 DL 系统的训练数据中公开呈现。这意味着对世界及其动态的“显而易见”的理解对于解决许多高级机器智能的任务非常有帮助。最后,在上下文化和聚合的内容中,结构良好的知识表示可以解决歧义的各个方面(将“俱乐部”的属性分离为球棒、武器、卡片类型或聚会场所)。
认知人工智能与知识时代
在未来几年,基于 DL 的 System 1 类型系统的主要进步是可以预期的,因为底层浅层映射函数变得更加精细和知识丰富,计算处理变得更加便宜和快速。认知人工智能将带来更多更复杂的能力。我们已经可以看到将结构化知识与 DL 集成以构建更具生成性和动态性的系统的早期努力(例如,通过将常识问答等传统任务公式化为对动态生成的知识图的推理)。
总的来说,对建立在公开、结构化知识基础上的基于符号的方法的关注让我相信,到 2025 年,一系列新的认知人工智能能力将会出现,释放出系统所需的能力,这些系统不仅更容易解释,而且能够应用比当前基于 DL 的系统更接近人类的自主推理水平。机器智能的下一个级别将需要对深层知识结构进行推理,包括事实和陈述性(知道)、因果性(知道为什么)、条件性/情境性(知道什么时候)、关系性(知道什么)和其他类型的模型的深层结构。深度知识的获取和使用可以解决人工智能的基本挑战,例如 DL 模型规模的爆炸以及模型鲁棒性、可扩展性和缩放性方面的差距所带来的困难。
我们在英特尔实验室建立了认知计算研究,以推动英特尔在机器智能和认知交叉领域的创新,并解决这些新兴的认知 AI 能力。我们的努力将深度学习的最新成果与知识结构和神经符号人工智能的集成相结合,以构建能够在复杂的背景丰富的情况下做出明智决策的自我学习人工智能。
深度学习使 AI 系统在识别、感知、翻译和推荐系统任务方面的效率令人难以置信。下一波机器学习和人工智能的新生技术将创造一种新的人工智能解决方案,具有更高的理解和认知。我们期待构建下一代人工智能系统,有一天它将理解这篇博客文章和其他信息丰富的内容,并为我们的生活带来更大的好处。
参考
- 雅各布·德夫林;张明伟;李,肯顿;克里斯蒂娜·图塔诺娃(2018 年 10 月 11 日)。“BERT:用于语言理解的深度双向转换器的预训练”。https://arxiv.org/abs/1810.04805
- AI 与计算 —开放 AI(2018 . 5 . 16)。
- 凯里瑞安。“解读人工智能计算趋势”。人工智能影响(2021 年 3 月 23 日访问)
- 尼尔·c·汤普森、克里斯詹·格林沃尔德、李基贤、g·曼索(2020 年 7 月 10 日)。《深度学习的计算极限》。https://arxiv.org/abs/2007.05558
- 歌手,Gadi(2021 年 3 月 23 日)。《知识之座:人工智能中以信息为中心的分类— Class 2》,LinkedInhttps://www . LinkedIn . com/pulse/Seat-Knowledge-Information-Centric-Class-AI-gadi-singer-1c/
- 歌手,加迪(2018 年 1 月 31 日)。《走向真正智能的 AI:从'识别'到'理解'》LinkedInhttps://www . LinkedIn . com/pulse/forward-true-intelligent-AI-From-Recognition-gadi-singer/
- 丹尼尔.卡尼曼。《思考的快慢》,企鹅图书,2011 年。
- yo shua beng io(2019 年 12 月 11 日)。“从系统 1 深度学习到系统 2 深度学习”。NeurIPS2019 上的演示。https://slides live . com/38922304/from-system-1-deep-learning-to-system-2-deep-learning
- 弗朗索瓦·乔莱(2020 年 12 月 6 日)。:人工智能系统中的抽象和推理:现代观点”。在 NeurIPS2020 上的演示。https://slides live . com/38935790/abstraction-reasoning-in-ai-systems-modern-perspectives
- 约翰·朗什伯里。“DARPA 对人工智能的看法”。DARPA,https://www.darpa.mil/attachments/AIFull.pdf(2021 年 3 月 23 日访问)
- 谢莉·e·泰勒;Lien B. Pham 因娜·d·里夫金;大卫. a .铠甲。“驾驭想象力”。美国心理学家,1998 年 4 月。https://icds . uo regon . edu/WP-content/uploads/2013/03/having-the-Imagination-Mental-Simulation-Self-regulation-and-coping . pdf
- 安托万·博瑟鲁特;罗南·勒布拉斯;叶筋·崔(2020 年 10 月 30 日)https://arxiv.org/abs/1911.03876
本文基于 LinkedIn 上发布的早期系列文章:
- 知识时代来临:
Gadi Singer 是英特尔实验室的副总裁,认知计算研究总监。
数据报告的兴起
现代数据开发工具以及数据质量如何影响 ML 结果

美国宇航局在 Unsplash 拍摄的照片
ML 就在我们身边!从医疗保健到教育,它正被应用于影响我们日常活动的许多领域,并且能够带来许多好处。
数据质量在人工智能解决方案的开发中具有非常重要和重大的作用——就像古老的“垃圾进,垃圾出”——我们可以很容易地理解数据质量的权重及其在癌症检测或自动驾驶系统等解决方案中的潜在影响。
但是,矛盾的是,数据可能是最被低估、最不被炒作的人工智能。幸运的是,在经历了几个世界范围的有影响的错误之后,随着数据开发工具的兴起,数据的魅力正在回归。
数据开发
很多人都在谈论 ML 能带来的好处和好处。然而,围绕许多组织为获得人工智能投资回报而进行的斗争的数字不断涌现。
他们是在撒谎吗?或者在 ML 流程中是否有一个缺失的部分比我们想象的更相关?
答案简单明了:数据质量。
数据质量有许多不同的方面,特别是,用于机器学习开发的数据有其自身的质量要求。在机器学习开发领域出现了许多新工具,人们对 MLOps 以及如何解决现有的组织问题以将人工智能成功投入生产有着浓厚的兴趣。但是数据质量呢?
在流程的不同阶段,可以看到和测量不同的数据质量——ML 流程中的数据质量始于数据的定义,是测量可能影响生产模型的数据漂移所必需的,如下图所示。

ML 流程中不同的数据质量阶段。
在今天的博文中,我们将特别关注其中的一个步骤:数据准备。
数据准备
虽然没有“构建”模型那么有趣,但数据准备是数据科学开发过程中最重要但也是最耗时的工作之一。数据科学团队执行这一步骤所花费的时间可能因公司规模和垂直行业而异,但根据 Anaconda 的最新报告,这仍然是数据科学的步骤之一
“(…)占用了真正的数据科学工作的宝贵时间,并对整体工作满意度产生了负面影响。(…)"
数据准备涉及许多不同的步骤,从数据访问一直到特征选择:
- 数据访问:每个数据科学项目的开始都是从收集数据来回答一系列业务问题开始的(或者至少应该这样!),但有时这一过程可能比预期的时间长一点—要么数据不存在,需要设置数据工程流程,要么有太多的安全层阻止对数据的透明访问。像差分隐私、合成数据和联合学习这样的解决方案是缓解数据访问相关问题的可行选择。
- 数据扩充:在某些情况下,可用的数据集太小,不足以支持 ML 模型。数据裁剪、旋转、开窗或合成数据等解决方案会有所帮助。
- 数据清洗:从缺失值插补到不一致,数据充满了错误,需要进行相应的清洗和预处理。根据数据的类型,这一过程不仅耗时,而且非常复杂。
- 数据标注:通常情况下,标签会从数据集中丢失,或者可用数量太小,无法从监督学习方法中受益。从基于规则的解决方案到合成数据,有一些新的选项可以帮助数据科学团队解决这个问题。
- 数据验证:我们如何确保我们正在处理的数据的质量?在所有的准备工作之后,我们如何衡量应用的转换带来的好处呢?在整个开发过程中持续测量数据质量对于优化决策至关重要,从对分布的单变量理解到验证数据对模型开发的效用和影响。
- 特征工程:数据准备过程的最后阶段。这也是业务知识派上用场的地方,对于特征提取过程,数据科学团队绝对可以大放异彩。毕竟,功能对业务的相关性和影响力越大,也会影响下游模型的可解释性。
尽管如此,在 ML 过程的这个阶段还有很多事情要做,正如风险投资公司 Workbench 的最新报告中所指出的,数据准备毫无疑问是 ML 开发领域中许多不同工具中缺失的一部分,它正以一个新的名字data repo PS 崛起。
Data repo PS是一种数据科学和 ML 工程文化和实践,包括一系列旨在为 ML 系统运营(Ops)构建训练数据集(DataPrep)的步骤。
结论
既然我们已经确定并体验了数据质量在 ML 模型中的影响(这里的例子),一个新的范例可能会浮出水面——数据开发——这都是因为糟糕的数据质量在许多不同的环境中会产生巨大的影响。
数据质量差的成本,不仅直接影响业务,尤其是在后期才被发现(使用不良数据开发的模型已经投入生产),还会严重影响数据科学团队的生产力和效率。
数据报告或数据开发工具是 ML 开发流程中缺失的部分。结合来自人工智能基础设施堆栈的正确工具,如功能商店和模型部署平台,数据开发工具可以帮助组织将人工智能用作竞争优势,利用他们真正有价值的资产,即他们的数据。
用改进的数据加速 AI。
机器工程师的崛起:来自 Lyft 的亚历克斯·扎莫什钦

Alex Zamoshchin,作者图片
如今,公司投入大量资源来实现 ML 模型,却在部署时发现了无数意想不到的性能下降问题。
为了克服这些挑战,数据组织越来越多地转向 ML 工程师,以帮助弥合构建模型的数据科学家和实施模型的团队之间的差距。
虽然 Lyft 是一个家喻户晓的名字,但普通的骑手可能不知道该公司已经在全球范围内促成了超过 10 亿次骑行。
Lyft 应用的主干是一个最先进的 ML 基础设施,用于提供从地图绘制和欺诈检测到定价优化和 ETA 估计的各种解决方案。
我们最近采访了 Lyft 的工程经理 Alex Zamoshchin,以了解 ML 工程师如何发展以满足公司关键 ML 计划的需求。
“在最高水平上,Lyft 依靠 ML 工程师帮助将研究模型应用到现实世界,同时确保他们实现商业目标,”Zamoshchin 说。“他们参与了所有事情,从在业务环境中构建 ML 问题,将模型转换为工作管道,到分析实验和观察数据,以确保模型部署后的质量和性能。”
Zamoshchin 之前在 Palantir Technologies 担任 ML 工程师,现在管理 Lyft 的司机调度团队,负责每天在 Lyft 市场上匹配超过 100 万名乘客和司机的模型。
“决定如何调度每辆车的基础系统非常复杂,并且依赖于多元化的团队,”Zamoshchin 补充道。“识别需求、将其转化为数学框架并实施、观察和确保最终模型的性能的过程,通常意味着该过程中有不同技术语言的参与者。”
根据 Zamoshchin 的说法,ML 工程师在弥合研发团队和负责将其投入生产的团队之间的差距方面发挥着重要作用。
在一个没有 ML 工程师的假设世界中,Zamoshchin 描述了一个场景,数据科学团队有一个想法,建立一个模型,然后依靠生产团队来实现它。由于数据科学家脱离了生产环境及其局限性,他们的模型可能需要不存在的功能,或者不值得花力气将它们上线。因此,如果模型被部署,它将回到绘图板或不能按计划执行。
Zamoshchin 说,实际上,ML 工程师帮助解决模型实现前后的潜在问题,避免模型无法实现或在野外失败的不良情况。
虽然 ML 工程师可能来自不同的背景,但他们是 ML 团队中所有贡献者的共同点。
“我们有 ML 工程师,他们是受过统计学训练的数据科学家,还有一些人有计算机科学背景。我们的团队成员是深度学习方面的专家,其他人专门负责维护和调试模型。他们来自各个领域,”Zamoshchin 说道。“说到底;然而,ML 工程师拥有构建 ML 工作流程和基础设施所需的全套技能,能够顺利地将项目从初始阶段转移到生产阶段。”
元数据湖的兴起
介绍一种存储元数据的新方法,适用于当今无限的用例,如数据发现、沿袭、可观察性和结构

照片由 Aaron Burden 在 Unsplash
数据呈爆炸式增长。
数据团队比以往更加多样化——数据工程师、分析师、分析工程师、数据科学家、产品经理、业务分析师、公民数据科学家等等。
他们使用的数据工具和基础设施非常复杂。这些包括数据仓库、湖泊、湖边小屋、数据库、实时数据流、BI 工具、笔记本、建模工具等等。
所有这些导致了前所未有的混乱。
“这个栏目名称是什么意思?”
“我能信任这个数据资产吗?它从哪里来?”
“啊…我在哪里可以找到我们客户主数据的最新清理数据集?”
这些是数据团队现在每天都要处理的消息类型。
在过去的 5 年中,随着现代数据堆栈的成熟和成为主流,我们在数据基础架构方面取得了巨大的进步。然而,现代数据堆栈仍然缺少一个关键的组件:上下文。这就是元数据发挥作用的地方。
元数据的承诺
在这个日益多样化的数据世界中,元数据掌握着通往难以捉摸的应许之地的钥匙——真理的单一来源。在团队的数据基础设施中,总会有无数的工具和技术。通过有效地收集元数据,团队可以最终统一所有工具、过程和数据的上下文。
但是你会问,元数据到底是什么?简单来说,元数据就是“关于数据的数据”。
今天,元数据无处不在。现代数据堆栈的每个组件和其上的每个用户交互都会生成元数据。除了像技术元数据(例如模式)和业务元数据(例如分类法、术语表)这样的传统形式之外,我们的数据系统现在创建了全新形式的元数据。
- 云计算生态系统和编排引擎每秒都会生成日志,称为性能元数据。
- 与数据资产和其他人交互的用户生成社交元数据。
- 来自 BI 工具、笔记本和其他应用程序以及 Slack 等通信工具的日志会生成使用元数据。
- 用于创建数据资产的编排引擎和原始代码(例如 SQL)生成出处元数据。
新兴的元数据,新兴的用例
所有这些新形式的元数据都是由实时数据系统创建的。这导致了元数据的大小和规模的爆炸式增长。
元数据本身正在成为大数据。
不仅比以往任何时候都更多的元数据被生成和捕获,而且像雪花和红移这样的计算引擎的基本进步(即弹性)现在使得从元数据中获取智能成为可能,这种方式甚至在几年前都是不可想象的。
例如,查询日志只是当今可用的一种元数据。通过解析 Snowflake 中查询日志的 SQL 代码,可以自动创建列级血统,为每个数据资产分配流行度分数,甚至推断每个资产的潜在所有者和专家。
随着元数据的增加,我们可以从中获得的智能也在增加,元数据可以支持的用例的数量也在增加。
今天,即使是最受数据驱动的组织也只是触及了元数据的皮毛。但是最大限度地利用元数据可以从根本上改变我们数据系统的运行方式。
例如,想象这样一个世界,其中这些情况是正常的:
- 当在源表中检测到数据质量问题时,系统自动停止下游管道以确保不正确的数据不会到达仪表板。或者更好的是,该系统使用过去关于数据质量故障的记录来准确预测出了什么问题,并在没有任何人工干预的情况下修复它。
- 该系统利用过去的使用日志来自动调整数据管道,并通过将负载转移到更多使用的数据资产和优化数据管道运行的时间表来优化计算性能。
在过去的几个月里,数据网格、数据结构和数据操作等概念获得了越来越多的支持,在 Zhamak Dehghani 的文章中得到广泛推广。然而,所有这些概念基本上都是基于能够收集、存储和分析元数据。
为什么我们需要一个元数据湖?
在 2005 年,“数据”的地位类似于今天元数据的地位。收集的数据比以往任何时候都多,使用数据的方式也比单个项目或团队想象的多。
“问题是,在大数据的世界里,我们并不真正知道数据有什么价值……我们可能知道一些我们想要回答的问题,但还没有到关闭回答以后出现的问题的能力的程度。”
2011 年,丹·伍兹登上《福布斯》杂志
数据有无限的潜力,但是如何为无限的不同用例和用户建立数据系统呢?
这导致了一个数据湖的诞生。数据湖不是以“某种‘最佳’形式存储数据以备后用”,而是一个存储各种数据(结构化和非结构化数据,以及最原始和已处理形式的数据)的单一大型存储库。然后,这种灵活的数据可以用于驱动从分析到数据科学到机器学习的各种用例。
我相信我们在元数据方面也处于类似的关头。今天,收集的元数据比以往任何时候都多,它的潜在用例和用户比任何人想象的都多。
这就是我认为需要元数据湖的地方:一个统一的存储库,以原始和进一步处理的形式存储各种元数据,这些元数据可用于驱动我们今天和明天已知的用例。

现代元数据湖的架构。(图片由 Atlan 提供。)
元数据湖的 3 个特征
1.开放式 API 和接口
元数据湖需要易于访问,不仅仅是作为数据存储,而是通过开放的 API。这使得在现代数据堆栈的每个阶段利用“单一真实来源”变得异常容易。
例如,从元数据湖中提取元数据并将其集成到 Looker 仪表板上的 hover 中应该非常容易。或者利用血统和出处元数据来提高数据的可观察性。或者承担数百个元数据活跃起来的用例中的任何一个。
就像我在关于 2021 年数据趋势的文章中提到的那样,元数据正在走向成熟。在接下来的几年中,许多数据团队将开始利用元数据,但他们可能会从一个单一用例的解决方案开始,如数据发现、数据可观察性或沿袭。
然而,当他们决定采用什么元数据产品或解决方案时,重要的是这些客户要超越一个用例。重要的是要考虑解决方案的灵活性和架构,并检查基础 metastore 是否开放,以及将来是否可用于各种用例及应用。
2.以知识图表为动力
当数据资产之间的所有连接都活跃起来时,元数据的真正潜力就被释放出来了。例如,如果一列被标记为“机密”,则该元数据可以与沿袭关系一起用于将从该特定列派生的所有其他列标记为机密。
知识图是存储这些相互联系的最有效的方式。
3.为人类和机器提供动力
元数据湖可用于增强人类(如发现数据和理解其上下文)和机器或工具(如上文提到的自动调整数据管道)的能力。这种灵活性是需要在基础架构中反映出来的现实。
展望未来
随着我们对元数据的深入研究,我认为很明显,元数据湖将成为数据管理领域下一波创新的基石。未来几年,新一代元数据解决方案将进入市场,这并不奇怪。在此之后,元数据湖甚至可能推动整个类别的公司,这些公司将在元数据之上添加一层数据科学和分析。
向我的联合创始人 Varun 致敬,他首次提出了“元数据湖”这个术语。
觉得这个内容有帮助?在我的时事通讯《元数据周刊》上,我每周都写关于活动元数据、数据操作、数据文化和我们的学习建设的文章 Atlan 。 在此订阅。
ML 工程师的崛起
对不断演变的角色的新观点

作者图片
就在五十年前,机器学习还是一个新概念。今天,它是社会不可或缺的一部分,帮助人们做各种事情,从开车、找工作到获得贷款和接受新的医疗。
当我们想到未来 50 年的 ML 会是什么样子时,这是不可能预测的。从芯片和基础设施到数据源和模型可观察性,一切领域中新的、不可预见的进步都有能力在一夜之间改变行业的轨迹。
也就是说,我们知道长期只是短期运行的集合,在当前运行中,有一组新兴的工具和功能正在成为几乎每个 ML 计划的标准。我们已经写过 3 个最重要的 ML 工具:一个特性商店,一个模型商店和一个评估商店。点击深入了解。
除了推动 ML 计划的工具,塑造数据团队的角色也在快速发展。
正如我们在 ML 生态系统白皮书中概述的那样,机器学习工作流程可以分为三个阶段——数据准备、模型构建和生产,在流程的每一步,技能和要求都是不同的:
- 建模是数据科学家的领域。他们是数学和统计方面训练有素的专家,并应用这些学科来设计、构建和优化模型,以解决特定的业务挑战。
- ML ops 隶属于一组工程师,他们负责集成 ML 基础设施的开发和操作方面的工作流。
在许多方面,数据科学家和 ML ops 团队之间的关系类似于左脑-右脑划分,一边是逻辑(模型),另一边是创造力(操作)。我们知道,大脑半球之间的差异会影响大脑解决重要问题的能力,并且存在一条厚厚的神经纤维带,使大脑一侧处理的信息能够与另一侧共享。
在 ML 中,公司已经认识到需要一种新的专业知识,类似于这些神经纤维,可以弥合构建模型的数据科学家和操作模型的团队之间的差距。进入 ML 工程师。

作者图片
在最高层,ML 工程师负责从研究中获取模型到现实世界,并确保它们实现商业目标。我们与几位领先的 ML 从业者进行了交谈,以了解这一不断发展的角色如何适应不断发展的 ML 计划的需求。让我们开始吧:
优步罗汉·艾扬格

Rohan Iyengar 是优步大学的软件工程师,专注于利用人工智能、人工智能和数据来解决挑战性问题。
艾扬格说:“在像优步这样的公司,你需要对每个模型有具体的了解,以了解一旦这些模型投入生产,你所定义的成功标准是否得到满足。”。“这就是 ML 工程师的作用所在。当复杂性很高时,如优步的 ML 基础设施,规模,可靠性,以及寻找和观察正确的度量标准是非常复杂的。你需要一个介于模型构建者和运营团队之间的角色,以确保你实现了你的业务目标。
朱家骅

Harrison Chu 最近从 Lyft 加入 Arize,在那里他领导调度和匹配团队,这是一个由数据科学家和工程师组成的跨职能团队,致力于实施和优化系统,以更有效地匹配乘客和司机。
"根据我在 Lyft 和之前的 ML 职位的经验,很明显,行业需要一种新的角色,介于构建管道的数据科学家和部署模型的工程师之间,以便团队可以了解模型在现实世界中的作用。许多组织在两个半球之间没有清晰的交流,所以他们从来不知道离线工件和生产环境中的模型之间的区别。”
谢亚森,土坯

Jason Xie 是 Adobe 的高级研究科学家,他在 Adobe 为该公司的视频广告网络开发 ML 解决方案,该解决方案采用自助式 DSP(需求侧平台),使客户能够基于复杂的算法根据上下文购买和发布广告。
“为了应对不断变化的技术和隐私趋势,我们一直在调整我们的 ML 模型,以适应隐私安全广告的未来,”谢指出。“这种方法的最大挑战之一是,随着行业的发展,我们现在正在探索各种新的隐私安全协议,如谷歌 Chrome 的 FLoC 和微软 Edge 的 PARAKEET,而不是消费者在购买过程中遇到的接触点。最终,我们相信这一重大转变将为消费者带来最隐私安全的生态系统,但这需要一种全新的方法来实现 ML。”
在我们的案例中,ML 工程师变得比以往任何时候都更重要,因为不断发展的广告服务方法需要新的复杂层次来解决模型投入生产后的问题。在一天结束时,他们坐在模型的处理和服务之间,确保我们解决客户的业务挑战。

作者图片
今天,公司花费数百万美元开发和实现 ML 模型,却看到无数意想不到的性能下降问题出现。代码发布后无法运行的模型很难排除故障,并且会对业务运营和结果产生负面影响。
为了克服这些挑战,数据团队既需要在生产中观察模型的工具,也需要了解如何在模型离开实验室后让它们发挥作用的团队。虽然随着新挑战的出现,使 ML 计划成功所需的角色将继续变化,但现在,公司应该投资 ML 工程师,以确保他们的投资得到回报。
联系我们
如果这个博客引起了你的注意,并且你渴望了解更多关于机器学习可观察性和模型监控,请查看我们的其他博客和 ML 监控上的资源!如果您有兴趣加入一个有趣的 rockstar 工程团队,帮助模型成功生产,请随时联系我们,并在此找到我们的空缺职位!
运营数据目录的兴起

来自 Unsplash 的法比奥拍摄的照片
长久以来,数据目录过度关注数据用户,而忽略了软件工程师,尤其是数据工程师的需求。所有数据目录中的核心功能—元数据捕获、标记、沿袭等等—都倾向于基于 UI 的搜索和发现模式。从根本上说,这些功能支持数据用户,但为数据创建者提供的价值相对较少,这导致了数据目录的两个主要问题:
- 数据目录已经变成了纯粹的反动软件
- 数据目录的增值与用户数量成线性比例
数据目录是时候进化了。目录已经可以访问您的数据生态系统的丰富的横截面视图。下一个前沿领域是重新调整这些信息的用途,以使数据创建者能够更高效地创建和维护数据。最有价值的用例是将数据目录集成到 CICD 管道中。
为什么要将数据目录与 CICD 管道集成在一起?
您的数据目录应该有一组丰富的元数据,以确保数据管道的连续性。例如,在生产中发生变更之前,目录应提醒您注意以下场景:
- 使用沿袭来了解删除字段是否会影响业务关键或外部报告的仪表板
- 将沿袭与数据质量测试结果结合起来,以确定 Avro 文件中新的“非空”约束是否会导致记录无法插入到数据库中
- 检查查询日志和仪表板视图计数,以确定在删除表之前的三个月内没有使用过表
CICD 管道是代表数据的形状和语义发生变化的时刻的控制点。这是插入您的数据目录的正确位置,因为它在实际数据改变之前。下图提供了一个简单的 CICD 流程示例,该流程在部署前使用数据目录验证元数据更改。

CICD 进程中的数据目录(图片由作者提供)
由于数据目录位于部署的前面,it 现在可以主动做出决策。这对于一些特性有很大的好处,比如数据沿袭,标准的、反应式的方法是从 SQL 日志中构建沿袭,这些日志只能在数据发生变化后读取。
这种方法的另一个好处是,它具有保持数据目录最新的副作用。
这为什么有价值?
在将数据目录用于运营用例时,您可以利用您拥有的数量的数据来扩展您的目录所提供的价值。传统上,您可以使用类似于以下公式的公式来衡量 ROI:
(数据用户数)(每个用户节省的平均时间)(平均工资)
虽然这是一个很好的基线,但它是片面的,没有考虑到数据创建者在生成新数据资产上花费的全部时间,特别是在数据依赖问题发生后跟踪和修复它们所花费的大量时间。当生产中发生重大变化时,请考虑以下任务:
- 找到根本原因
- 修复根本原因
- 规划和执行手动数据清理和回填
这里的时间成本是巨大的;更不用说当数据质量问题进入生产时,会对您的用户产生切实的影响!拥有大量数据的公司可以从运营其数据目录中获得更多好处。

用户增长与数据增长(图片由作者提供)
随着数据扩展
为了让目录随数据扩展,它们必须迎合数据创建者:软件工程师。工程师与数据目录的交互将不同于人们对分析师或数据科学家的期望。特别是,工程师需要:
- 一组健壮的编程接口,适合它们的开发生命周期
- 将数据目录集成(或部署)到开发、试运行和生产环境中
虽然为工程师提供一个 API 来告诉他们血统存在将对一些组织起作用,但那些拥有更大数据集、严格变更控制、更复杂管道和更大团队的组织将发现这是不够的。为了赢得大多数公司的支持,catalog 需要简明扼要地总结它所拥有的关于 API 中相关数据资产的所有知识,这些知识可供工程师使用:
- 数据是否用于运营目的或分析?
- 正在删除的特定列是否用于业务关键型报表?
- 数据最后一次使用是什么时候?
结论
将您的数据目录与您的 CICD 管道集成将使您能够主动利用您的元数据来识别您的数据管道中的重大变化,并使您的团队能够随着您的数据进行扩展,同时支持不断增长的数据集的不断增长的需求。
在 Stemma ,我们将所有这些整合在一起,重新想象数据目录可以做些什么来回答这个屡试不爽的问题:
更改该数据资产会对我的业务产生影响吗?
走向生产中的无服务器 ML 管道——第一部分
Nutrino 如何在生产中设计无服务器 MLOps 堆栈

迪诺·瑞奇穆斯在 Unsplash 上拍摄的照片
今天将 ML 模型引入生产是复杂的——不同的公司对 ML 栈有不同的需求,并且有许多工具,每个工具试图解决 ML 生命周期的不同方面。这些工具仍在开发中,没有一个针对 MLOps 的“明确”解决方案。在本文中,我想分享我们在创建自己的 MLOps 堆栈时所经历的过程,包括我们团队在该过程开始之前的工作方式,我们对不同 MLOps 工具所做的研究,以及我们如何决定适合我们非标准模型的解决方案。
有关详细的解决方案,包括更多的技术解释,请查看本文的第二部分。
TL;DR——我们设法运行不同类型的模型(我们自己的 Python 模型),每种模型都有多个生产版本——所有这些都在一个无服务器的环境中!
我们的 ML 堆栈预重构
这是我们开始重构之前的 ML 堆栈:

作者图片
研究环境
我们使用了一个 datalake 环境,该环境中有一个 ETL 流程,可以将生产数据传输到 parquet 文件,再传输到 S3。数据科学家们在该环境中使用运行在 EMR 集群上的 Zeppelin 笔记本电脑进行研究(因此利用了 Spark 的分布式能力)。
特征提取
使用 AWS lambdas 完成特征提取,每次新数据到达我们的集中式数据存储时,由 Kinesis 流触发,并使用无服务器框架进行部署。
培训
- 一旦某个模型的研究完成,数据科学家就为该模型创建一个培训笔记本(在相同的 datalake 环境中)。
- 我们使用 Apache Airflow 定期运行培训的笔记本(并利用它在运行计划作业方面的优势)。为此,我们为每个模型的培训笔记本创建了一个 DAG(有向无环图)。
Airflow 的 Dag 会在每次推送到主分支时立即部署。 - Dag 创建了一个运行培训笔记本的 EMR 集群。笔记本连接到 GitHub 存储库,因此笔记本中的每次提交基本上都是训练代码的自动“部署”。
推论
一些模型被开发为具有预测端点的 Flask 服务。这些模型在服务的初始化部分加载了训练工件。其他模型是使用无服务器框架作为无服务器 lambda 处理程序开发的,它每次都直接从 S3 路径加载训练工件。我们的 Kubernetes 集群部署了烧瓶模型。无服务器模型在每次更改时都作为 HTTP lambdas 部署到 AWS lambda 服务。
如果我们的 MLOps 流程有效,并且培训已经自动运行笔记本中编写的相同代码,为什么要改变它?
它运行得很好,但是随着我们的成长和有更多的模型要开发,我们遇到了两个主要问题:
首先,我们的模型被归类为医疗软件,需要符合联邦药品管理局(FDA)的开发法规。这意味着我们需要能够在某个批准的时间点“冻结”我们的代码,并且从那时起,没有正式的批准,我们不能更改它(这个过程可能需要几个月!).
这意味着我们不能在一个模型的生产中处理一个版本,而是必须在生产中支持同一个模型的许多不同版本。
第二,我们的生产部署流程部分是手动的;在气流中运行训练并将工件保存到 S3 之后,评估是手工完成的。只有在获得批准后,我们才将文件复制到 S3 的另一个地方,然后必须删除 Kubernetes 集群中的相关 pod,以便服务加载新文件(没有宕机)。
此外,我们没有任何模型部署标准,每个模型的处理方式也不一样。
开始探索 MLOps!
给定基线和需求,我们开始探索哪些解决方案已经存在,哪些是行业中常用的。在选择 ML 产品时,我们需要考虑的一个主要要求是,我们的模型是内部编写的,而不是从任何常见的 ML 类库(如 scikit-learn 等)继承而来。).这使得将我们的模型结合到许多 ML 产品中的过程变得更加复杂。
我们的研究集中在三种服务上;在下一节中,我将提供一个简短的总结,说明我们选择或不选择使用该服务的原因。
** 注: 我们在 2020 年 7 月进行了这项研究,所以你需要考虑到这个领域的事情变化和发展相当快。然而,你可能会发现我的研究和决策过程仍然有用。
Kubeflow
Kubeflow 为整个 ML 生命周期提供了完整的解决方案——从笔记本电脑中的研究到在生产中部署模型。因此,我认为这是一个很好的整体解决方案,尤其是如果你刚刚开始;然而,对于生命周期的更具体的方面,有一些产品掌握了生命周期的每个方面,并且做得更好。
我当时对 Kubeflow 的研究表明,使用 Kubeflow 有两大好处:
- 他们的管道产品,支持使用 Dag 运行计划的作业
- 他们在 Kubernetes 上使用 Dockerized 容器的概念,可以很容易地部署在任何云提供商上
然而,对我们来说,这两个好处都没有那么有用,原因如下:
- 我们已经在为我们的预定工作使用气流,它比 Kubeflow 的管道更成熟,更适合生产。
- 我们的推理服务已经在 Nutrino 的 Kubernetes 集群上工作了。
- 我们在使用 Zeppelin 笔记本,而在 Kubeflow 上工作需要我们使用 Jupiter 笔记本,这意味着我们需要迁移和改变我们的笔记本平台。
- 迁移笔记本和做额外的工作来改变我们开发和部署 Docker 容器的方式是非常耗时的工作——这只是开始——我们仍然不确定这是否会给我们的产品带来任何显著的好处。
此外,在将我们的模型结合到许多 ML 产品中时,我上面提到的复杂性也适用于尝试将我们的模型与 Kubeflow 结合时。
MLFlow
MLFlow 侧重于模型库,并不是一个完整的生命周期解决方案。使用 MLFlow,我们可以使用自己的 Python 模型(使用 pyfunc 模块,这使我们能够轻松地将自己的模型合并到 MLFlow 中。
我应该解释说“容易”是一种轻描淡写的说法:启动并运行 MLFlow 服务器需要几分钟时间,并且需要一个简单的库从您的脚本与该服务器进行交互。
有了 MLFlow,我们最大的需求得到了满足——我们现在可以通过模型名称和版本(使用它的模型方案:' models:/ <model_name>/production ')来处理所有培训的工件;我将在技术解决方案部分对此进行详细阐述。
MLFlow 还用于通过 it 服务模型,而不仅仅是管理存储库,但是我们不想从 MLFlow 服务器服务模型。这意味着,对于每个模型,我们都需要在该服务器的不同端口上创建一个服务端点,这不是一件可以轻松部署、访问和监控的事情(我们不想为不同的模型访问不同的端口,我们希望通过模型的名称来访问模型,并在生产中支持具有许多版本的许多模型,因此这是不可伸缩的)。</model_name>
因此,我们决定在训练期间使用 log_model 函数记录我们的模型,并在推理服务中调用 load_model。然而,MLFlow 的一个大缺点是 load_model 函数的性能——它花费了 4-30 秒或更长时间(取决于模型大小和网络,如果我们在本地或从服务器测试它——但无论哪种方式,它仍然太长了)。
T5【Sagemaker】T6
由于我们已经将 AWS 用于我们的许多服务,我们喜欢使用托管 AWS 服务及其所有内置监控的想法。
我们创建了一个 flask 服务的 Docker 映像,带有两个必需的端点(ping 和调用;参见 AWS 的使用您自己的推理代码了解更多信息)。这非常类似于我们自己在 Kubernetes 上运行的推理服务。我们希望使用 Sagemaker,结合 MLFlow 来缩短推理时间。我们在 flask 应用程序初始化过程中调用 load_model,并将结果(模型实例)保存在内存中。
通过这种方式,当 Sagemaker 端点启动并运行时,我们可以确定模型已经被加载,而不必等待几秒钟来进行预测。
不幸的是,从 Sagemaker 端点获得预测仍然需要 1.5-2 秒,尽管在 Docker 中调用模型的 predict 函数只需要几毫秒。
sage maker 的另一个主要缺点是端点总是开启的——这意味着即使没有要预测的调用,我们也要为实例付费。
这些问题使我们决定不追求 Sagemaker,而只是在我们现有的推理服务中实现相同的逻辑(无论如何,这个 pod 只是一个大型 Kubernetes 集群使用中的一个 pod——因此它更具成本效益,并且预测更快地发送回客户端)。
AWS EFS
虽然 AWS EFS 不是 MLOps 产品,但我们希望使用 EFS 来进一步降低成本,实现完全无服务器。正如我在第一节中提到的——我们堆栈中的一些推理服务是在 lambda 函数中实现的,因此它更具成本效益;然而,我们不能在每次调用时都调用 load_model,因为这会花费很长时间。
这就是为什么我们开始关注 AWS 的 EFS 服务,并将推理 lambda 安装到它上面,而不是从 S3 加载(这是 load_model 的工作方式)。lambda 只需用本地安装的路径调用 mlflow.pyfunc.load_model ,而不是使用 mlflow 的 models 方案。
于是 MLOps 架构诞生了…

诺帝诺的 MLOps 架构(图片由作者提供)
如前所述,我们选择使用 MLFlow 作为模型库和工件库,并使用 AWS EFS 来提高性能。这种结合产生了一种解决方案,它在不到一秒钟的时间内将预测传递给了位于的客户。
下一步是什么?在本文的下一部分中,我将深入探讨这个解决方案的技术方面,包括一些代码示例。
感谢您花时间阅读本文!欢迎在下面评论问题或开始讨论。
生产中无服务器 ML 流水线之路——第二部分
我们设计的 MLOps 架构及其实施方式

马特·邓肯在 Unsplash 上的照片
在第 1 部分中,我解释了我们创建全自动 MLOps 架构的过程,以及我们的决策过程,考虑了我们的需求和我们已经在使用的堆栈。
在这篇文章中,我将向您展示我们最终的解决方案,包括如何自己实现这个解决方案的代码示例。
让我们再来看看架构…

诺帝诺的 MLOps 架构(图片由作者提供)
新管道是如何工作的?
数据科学家在他们的笔记本(我们使用 Zeppelin)上的研究环境中工作,以探索和开发他们的模型。一旦他们想出了他们想要编写的模型,他们就进入我们的源代码控制中的模型项目,并开始开发所需的脚本——模型的推理服务、训练脚本和验证脚本。
使用 Pycharm,数据科学家可以在本地(使用本地 Spark)或在远程 EMR 集群前工作,使用他们在研究环境中习惯使用的所有数据运行和测试他们的脚本。他们还可以很容易地为任何模型部分编写单元测试(服务、培训、验证等)。).
我们选择使用 git 标记来触发模型的 CI/CD,因此当他们放置一个带有新版本号的标记时,它将触发 CI/CD 流程,该流程运行以下内容:
- 运行项目中的所有测试。
- 如果通过——将训练和验证脚本复制到特定的 S3 存储桶(以下称为 models_bucket)中,路径为/
/ 。 - 部署模型服务。
- 调用ml flow . create _ registered _ model,将模型的名称作为
_ v (即 my_model_v1)。
培训渠道
定期调度的 Airflow DAG 将为 models_bucket 下的每个模型及其每个底层版本运行,并将使用 EmrAddStepsOperator 运行脚本,以便为这些脚本运行 spark-submit 命令。
我不会深入研究数据处理,但这里会提到,Airflow 也有运行 ETL 作业的 Dag,扫描出主数据存储并将记录以训练脚本所要求的格式保存到 S3。
训练本身将把它的工件记录到 MLFlow 中,并为它创建一个新版本,这意味着训练为模型创建一个次要版本。例如,具有主要版本 1(取自 git 标记)的 my_model 被注册到 MLFlow 作为 my_model_v1,现在训练在 MLFlow 中为它创建了版本 1(ml flow 中的版本自动递增),从而为 my_model 创建了语义版本 1.1。接下来的训练将在 MLFlow 中创建版本 2,这将使新创建的训练模型成为 my_model 的版本 1.2。
然后,验证脚本将决定新训练的模型是否比当前处于生产阶段的模型更好。如果是,它会将旧模型移至归档阶段,将新模型移至生产阶段,并将 MLFlow 中的模型文件保存在 EFS 的 models 目录中。
现在让我们看一些代码!
培训脚本
首先,我们需要用 MLFlow PythonModel 包装我们的模型:
然后,在将模型记录到 MLFlow 时,我们可以在培训脚本中使用它:
验证脚本
服务于 lambda 代码的模型
服务于 lambda 的基本模型将具有以下结构:
在您的 serverless.yml 中,您必须将处理程序挂载到 EFS 挂载目标,并将端口 2049 的入站权限也给予 lambda 处理程序:
瞧——我们有无服务器推理服务和训练管道,仅在需要时启动集群。
我们的下一步
我们仍然需要进一步将我们的 MLOps 堆栈转换为完全自动化,并涵盖 MLOps 中完成 CT 管道所需的一切。这些步骤包括:
- 对模型进行性能监控,如果需要,将触发管道
- ML 元数据存储更容易监控管道本身
- 自动化数据验证(目前只有我们的数据提取和准备是自动化的)
- 处理大型模型(需要超过 250MB 的部署 lambda 限制)—我们认为我们也可以使用 EFS 来处理,并预加载所有大型库(如 TensorFlow),但仍然没有尝试过
随着我们继续成长和开发更复杂的模型,我相信我们还会遇到更多的问题…
感谢您花时间阅读这篇文章!希望你喜欢:)
欢迎在下面留言提问或开始讨论。
人工智能在艺术创作中的作用
艺术家如何在创作过程中使用人工智能

作者制作的人工智能艺术
一个新牛仔在艺术镇
随着人工智能的出现,艺术家表达自己变得更加容易,而不必经历创作艺术品的过程。这可以被视为一件积极或消极的事情,取决于如何使用它。人工智能在艺术创作中的作用以及艺术家和人工智能之间的关系仍在发展。
许多评论家认为人工智能将会颠覆艺术产业,因为它让艺术家更容易表达自己。它还消除了一些昂贵的任务,如绘画或绘画,这使得艺术家有机会从他们的艺术中谋生的时间更少
一些人认为这种新型技术将取代人类,因此不再需要以人为基础的艺术
然而,其他人认为这只是想扩大视野的艺术家的又一个工具。
让我们后退一步,将人工智能放在上下文中,它是如何工作的,它的现代约束以及艺术家如何使用人工智能概念。
AI 是什么?
人工智能已经被讨论了一段时间了。但这是什么呢?
人工智能是计算机科学的一个分支,它包括智能计算机系统的开发,以解决不一定只与计算机相关但存在于任何领域或行业的问题。
人工智能已被用于各种应用中,包括数据挖掘、机器学习、机器人、医疗诊断和治疗以及许多其他应用。
人工智能的许多突破性技术,如“自然语言处理”、“深度学习”和“预测分析”,都是众所周知的流行语。
得益于尖端技术,计算机系统可以掌握人类语言的含义,从经验中学习,并做出预测。
https://www.innoplexus.com/blog/how-artificial-intelligence-works/
正如一位计算创造力的批评家所说,模仿艺术方法还包括模拟人类的思维和推理,尤其是创造性思维。目前,算法和信息处理系统还不能实现这一点。在非常狭窄的情况下,这些系统可以接近甚至超过人类的表现,但只能在参数范围有限的极度受控环境中进行。人工超级智能(ASI)系统将能够在各方面超越人类。这包括做出判断、做出合理的决定,甚至是创作艺术和建立情感纽带。尽管科学进步,ASIs 仍然停留在理论上,仍然属于科幻小说的世界。
艺术家的角色是什么?
艺术家是创作原创艺术作品的人。他们可以包括装置、雕塑、绘画、素描、陶器、表演、照片、录像或任何其他媒介。艺术家是表达普遍情感的工具。艺术家有能力对事物保持敏感,并用颜料、手势或颜色表达出来。艺术家感受一个地方的氛围,一个瞬间或者一种感觉的记忆。
“艺术是一种观念在某种物质形式上的表达”
一些艺术家可能创造艺术作为一种自我表达的形式,并传达他们的感受和想法。对一些人来说,创造的过程可能比他们生产的东西更重要。

照片由贾里德·波莱 dna 在 Unsplash 上拍摄
有了 AI,艺术的未来是怎样的?
艺术的未来被描绘成“活着”和“死了”
后现代主义者认为艺术的未来是死的,而现代主义者认为它是活的。然而,有了 AI,艺术获得了新生。它已经超越了它的创造者,并在合成现实中找到了新的意义。
艺术一直被视为捕捉其创作时期的一种方式。但是现在有了 AI,也可以通过科幻小说的镜头去看了。艺术可以被制成未来的概念,如半机器人或人工智能,如果没有人工智能的创造,这是不可能的。
相反,这种创造精神是围绕个人一生中的事件和经历而形成、激发和建立的。因此,艺术创作可以被视为一种从个人对他或她的存在和环境的解释中创造创新作品的方式。然后可以认为,人工智能能够产生对其学习的解释,以产生其自己对概念的想法。对于艺术家来说,人工智能的艺术作品将取决于它的学习和遇到的图像。人工智能和艺术家的区别在于其经历的起源。一个艺术家将在一个不确定的环境中围绕事件生活和发展创造力。相反,是艺术家将决定人工智能的环境和学习规则,这使得它依赖于艺术家,并将其作为工具。正如艺术家训练他的手挥动画笔作画一样,他将训练人工智能创作出反映其创造者的独特艺术作品。如同任何艺术形式一样,在这个时代更是如此,它不再是最终的结果,更重要的是我们与我们的作品相关的话语和想法。艺术家必须能够证明在他的创作过程中使用人工智能的合理性
人工智能如何协助艺术家的创作过程?
AI 在艺术创作中有什么作用?AI 工具真的很有创意!
许多现有的 artist 软件包开始包含一些基本的人工智能,以帮助简单重复活动的自动化。目标是使人们能够更快地使用他们的产品,并消除耗时的手动操作的需要。
随着数字艺术包中的人工智能和机器学习(ML)元素变得越来越复杂,艺术家用创新和意想不到的方式进行实验的新工具变得可用。基于人工智能的解决方案也可以用来制作艺术家以前从未想象过的东西。
https://aiartists.org/ai-generated-art-tools
艾正在以多种方式帮助创意人员,包括帮助他们模仿过去著名画家的风格。这种模仿和复制的能力在作品的创作和修复中都是有用的。
https://www.artnews.com/art-news/news/rembrandt-ai-restoration-1234596736/
许多人都在猜测一种叫做人工智能艺术的新艺术类型的出现。这种新的艺术类型,更恰当地称为神经网络艺术,是利用复杂的算法创造出来的。
这些神经网络采用了生成对抗网络 (GAN),结果既令人毛骨悚然又有趣。

罗比·巴拉特:人工智能生成的裸体肖像#1 ,2018,用甘制作的数字图像。
人类定义这些 gan 的编码,以及目标的定义参数,这使得 AI 和 gan 成为创造性的工具。
人工智能助手可以为艺术家创作艺术、音乐甚至电影。我们应该考虑这一点的含义,因为这是行业中的新事物。如今,一些艺术家正在使用人工智能来使他们的作品更好或更容易被公众接受。
带走
- 艺术家将想法/感情表达到实物艺术中
- 人工智能是工具,不是实体
- 人工智能可以模仿和再现艺术家的风格
- 人工智能工具帮助艺术家提高生产力和创造力
- 人工智能现在和将来都是艺术家的工具,不会取代艺术家
结论
人工智能领域最近的科学进步导致了新算法和高性能工具的发展。人类和作为工具的人工智能之间的这种新关系为艺术家提供了一个新的创作和思考视角。通过人工智能,****艺术品的设计和制作将变得更加便利,所有人都将获得以前从未想象过的可能性。正如画笔之于绘画,钢琴之于音乐,艾在艺术创作中的作用只是创作的工具,而不是创作者。它的创造潜力取决于人类如何使用它。
如果你想看更多应用的例子,一个艺术家在他们的作品中使用人工智能的画廊:
**https://www.nvidia.com/en-us/deep-learning-ai/ai-art-gallery/ **
🚀- 圣甲虫的消息
**https://medium.com/@tgey/about-me-thomas-gey-a8a42f6622cc https://medium.com/subscribe/@ScarabNews https://medium.com/@ScarabNews/membership
感谢您阅读这篇文章!如果你有任何问题,请在下面留言。**
云计算在人工智能中的作用
虽然人工智能比云计算早得多,但云计算及其技术极大地改善了人工智能。

马库斯·温克勒在 Unsplash 上的照片
1956 年,约翰·麦卡锡在达特茅斯学院的一个研讨会上首次使用了人工智能(AI)这个术语。1951 年开发了第一个用于玩跳棋和国际象棋的人工智能应用程序。50 年代之后,人工智能一直处于上升和下降状态,直到 2010 年代。多年来,已经有一些厂商、大学、机构对人工智能进行了投资。有时希望很高,有时希望很低。当工业界对人工智能没有足够的兴趣时,它被称为人工智能冬天。
在过去的十年里,人工智能,尤其是深度学习(人工智能的一个子集),在两次成功的事件后一直在上升:首先,IBM 宣布了 Watson 超级系统,该系统在 2 月 14 日至 15 日击败了几位 Jeopardy 多次获胜者,即布拉德·鲁特和肯·詹宁斯,以及 AlexNet ,卷积神经网络(CNN)的名称,在 2012 年 9 月 30 日参加了 ImageNet 大规模视觉识别挑战赛,并在这场挑战中获得了冠军。根据各种市场研究,几乎所有不同行业的机构都开始投资人工智能,他们将在未来几年增加对不同用例的人工智能投资。基于世界经济论坛的“工作的未来”报告(2020 年 10 月),未来与人工智能相关的工作将更加需要。此外,根据 Glassdoor 在线就业公司的调查,数据科学家在过去 3 年中一直被称为美国最好的工作之一。
“云计算”一词早在 1996 年就出现了,第一次被提及是在康柏的一份内部文件中。甚至在 1993 年之前,云这个术语就已经出现了。但是现代的云计算是亚马逊在 2006 年用弹性计算云服务创造并推广的。第一个云交付模式是基础架构即服务,向用户提供预打包的 IT 资源。后来推出了交付模型 PaaS(平台即服务)和 SaaS(软件即服务)。所有这些交付模型都用于不同的工作负载,包括人工智能工作负载。有三种云部署模式,即公共云、私有云和混合云。这些部署模型对于基于功能性和非功能性需求和约束来定位 AI 工作负载也很重要。根据世界经济论坛的“工作的未来”报告,云计算是商业领袖的最高优先级,直到 2025 年,云计算将被大多数公司采用。
虽然人工智能比云计算早得多,但云计算及其技术极大地改善了人工智能。云计算是一种有效的催化剂。

图片由基万克·乌斯卢提供,灵感来源人工智能动态力量
我们可以看到具有形状的 AI 的动态力量:数据/数据集,包括 GPU、模型/算法在内的处理能力,以及天赋/技能。让我们看看云计算是如何参与推进和丰富人工智能成分的:
云交付模式
o IaaS(基础设施即服务)帮助人工智能从业者轻松拥有一个基础设施环境——CPU、内存、磁盘、网络、操作系统,这样从业者就不会浪费时间,而不必等待基础设施团队来准备。而且后来云提供商开始提供 GPU 资源。
o PaaS(平台即服务)帮助人工智能从业者使用人工智能和数据科学服务,包括 jupyter 笔记本电脑、数据目录服务,轻松开发新一代应用程序。
o SaaS(软件即服务)帮助用户在一个应用程序(即 CRM、支付应用程序)中使用人工智能服务,以创造高效的结果。
云技术
o 容器:随着容器开始将应用程序与计算环境隔离开来,容器为所有数据科学家提供了相同的接口和环境。此外,数据科学家团队可能在不同的云提供商上运行他们的容器,甚至使用他们更喜欢的 GPU 功能。
Kubernetes: Kubernetes 是一个开源系统,用于自动化部署、扩展和管理容器化的应用程序。由于数据科学家希望以可扩展的方式使用容器化的数据科学平台,Kubernetes 帮助了他们。Kubernetes 提供了对包括 GPU 在内的计算环境资源的高效利用。Kubernetes 还提供数据科学应用程序,运行在容器上的平台可以在不同的云提供商上运行,而不用担心计算环境。
o 数据集消费:数据是人工智能最重要的成分。你需要丰富的数据集来运行你的算法和模型。无论数据集是否从云环境中共享,一旦你得到它,你就可以将它们存储在公共或私有云环境中,以便轻松地对它们进行操作。
人才/技能可用性
o 尽管经典的人工智能课程、教育在大学中可用,特别是作为计算机工程、计算机科学、应用数学的一部分,但现在独立的人工智能工程学士和数据科学硕士课程在不同的大学中可用。而且知名大学都有专门的数据科学课程。Coursera,Udemy 也提供了非常成功的关于深度学习的课程,云上的机器学习课程。
o 竞争平台,如 Kaggle、CrowdANALYTIX,运行在云环境中,数据专家在其中协作和竞争,以构建和优化人工智能、ML、NLP 和深度学习算法。这些平台对所有人开放。一些数据集是可用的。有了这些新的平台,就可以培养新的人才。
DevOps
o DevOps 是一套结合软件开发(Dev)和 IT 运营(Ops)的实践。这个术语是第一次在同名的会议上使用。尽管在任何开发环境中都可以使用 DevOps 方法,尤其是微服务架构风格的开发需要 DevOps。DevOps 处理应用程序开发生命周期,而不是数据科学生命周期。所以 ModelOps 是 Gartner 在 2018 年创造的。在 ModelOps 之前,MLOps(机器学习运算)是作为 DevOps 的扩展。
几乎所有的云提供商(AWS、Azure、GCP、IBM、Oracle 等)都已经在他们的云环境中提供复杂广泛的数据科学和机器学习平台以及 API 服务(即 NLP、Vision、自动化机器学习)。此外,强大的分析公司(IBM、SAS、RapidMiner)在不同的云提供商上提供他们的数据科学和机器学习平台。许多数据科学平台和 AI API 服务也可以在本地云(Kubernetes)环境中使用。看来云提供商和分析公司将在未来丰富云平台上的这些服务。
结论
不同的分析师和技术公司用不同的用例预测不同行业未来的人工智能使用情况。云交付和云计算模型将有助于有效地使用人工智能用例。此外,边缘计算将云功能扩展到本地,具有低延迟甚至离线功能,将提供更多的使用案例(即视频分析),因为组织将在本地拥有大量具有处理能力的数据。而量子计算将有望推进 AI,尤其是在机器学习方面。
资料来源和进一步阅读
塑造人工智能的动力
https://www . oreilly . com/radar/the-four-dynamic-forces-shaping-ai/
IBM 的新工具让开发人员将量子计算能力添加到机器学习中
Gartner 数据科学和机器学习平台魔力象限
https://www.gartner.com/en/documents/3998753
地理信息系统在报告中的作用

布莱恩·麦高恩在 Unsplash 上的照片
我是一名有 GIS 经历的商业分析师。作为一名分析师,我被要求以信息丰富的方式向高管展示数据。这是一系列文章的开始,在这些文章中,我将演示如何使用 GIS 为大众提供报告。无论您是数据科学家、分析师还是 GIS 专业人士,我都将展示 GIS 的动态使用,以及它如何将您的报告转变为通用的精彩内容。我将从为什么 GIS 在报告中有用开始。
传统的分析师报告包括 excel 条形图和饼图。这是有益的,但不一定让高管们兴奋。

作者图片来自ohthehoror项目
这就是 GIS 的用武之地。地图的基础是为那些不是专家的人准备的。历史地图是艺术作品,因其夸张的风格而备受推崇。从概念上来说,将地图视为艺术触及到了为什么它们具有普遍性的核心。《牛津词典》对艺术的定义是:
人类创造性技能和想象力的表达或应用,通常以绘画或雕塑等视觉形式,创作出主要因其美或情感力量而被欣赏的作品。

只要你能在报道中引发情绪,你就在减少观众的解读工作。这是为群众创作报道的关键。以下面的图片为例:

蓝色、绿色和红色在黑色背景的衬托下非常突出。气泡的大小有助于直观地看到聚集发生的位置。蓝色是一种对眼睛无害的颜色,所以你可以在视觉上看到大量的蓝色。而绿色被认为是令人振奋的。红色绝对凸显“危险”。这就是地理信息系统的威力:无需解释就能立即收集到如此多的信息。
GIS 如何帮助报告的另一个例子是我做的一个项目,建立一个 Twitter 照片图像分类器,以发现戴口罩者和不戴口罩者的数据之间的相关性。这是我创建的一个传统报告:

作为条形图的蒙版与无蒙版(图片来自作者的蒙版项目后面的
现在,这是一份有影响力的报告,显示了推特上戴口罩和不戴口罩照片的数字。但是,如果我把它放到地图上:

作为地图的面具与无面具(图片来自作者的面具背后的项目)
尽管地图更加繁忙,需要用户阅读图例,但最终它传达的信息比条形图多得多,而且对解释者来说速度更快。它直观地显示了自然的相关性,如口罩佩戴者与有口罩强制令的州的分布,以及严重的 covid 病例分布。它也通过颜色引发情感反应。
在接下来的几篇文章中,我将向那些可能没有太多 GIS 知识的人展示发送带有地图的报告的快速方法。这些报告还将向他们强调可共享性。
人类计算在不断变化的技术环境中的作用:专家参与
在今年的 HCOMP 会议期间,与会者讨论了人工计算在人工智能产品开发中的作用

来自 Alphabet 的 Chris Welty 、来自亚马逊的 Kumar Chellapilla 、来自微软的 Besmira Nushi 、来自 Brainworks 的 Markus Krause 、来自 Toloka 的 Olga Megorskaya和来自 Google Research 的 Lora Aroyo 分享了他们的观点。
显式数据标注的问题
克里斯解释说,人类的计算通常有两种形式——显式和隐式。隐式指的是数据标签是副产品的情况,例如当我们播放电影、在 YouTube 上听音乐或进行网络搜索时。该系统的算法了解其用户,即使没有这样的数据标记发生。
另一方面,像众包这样更“传统”的数据标签形式是显式的。这里的主要挑战是质量和了解如何提高质量。问题是大多数机器学习系统花费大量时间来生成数据集,但没有足够的时间来表征它们的准确性。
因此,出现了很多失败的人工智能产品。但是有一种方法可以从我们的错误中吸取教训。Crowd Camp 最近发起的对抗性众包挑战是一种有趣的方式,可以激励人们检查 ML 模型所犯的错误。
偏见和含糊不清
坐在观众席上的 Lora Aroyo 受邀详细阐述这一挑战。她解释说,使用图像分类模型,她的团队能够计算出 60%的标记内容是敌对的,并混淆了训练模型。发生这种情况是因为人类评分员经常不同意歧义。这表明数据影响模型,而标注者通过他们的主观性和偏见影响数据。像“松饼”或“背心”这样简单的概念在不同的文化中可能有不同的含义,有时甚至在说同一种语言的人之间也是如此。
另一位小组成员 Markus 认为我们应该接受这种模糊性,而不是与之斗争。工程师们需要明白,没有所谓的地面真相。一旦你接受了这一点,你就可以开始寻找合适的指标来衡量绩效,并考虑改进。数据标注中的模糊性不会消失,但这不是从等式中消除它,而是学习如何处理它。
贝斯米拉进一步阐述了这一点,并认为错误信息和偏见实际上可以帮助我们建立一个分类器,在未来检测这种内容。尽管如此,我们不太可能在不久的将来创建一个能够解决我们所有机器学习问题的平台。目前,我们只是在搞清楚事情并进行实验——这是一个游戏场。仅仅因为我们有一个能够训练的模型,并不意味着我们应该试图尽快推出一个人工智能产品。我们不应该仓促行事。
数据标注的连续性
Toloka 的 Olga Megorskaya 认为,这一点还有更多的意义,因为训练你的 ML 模型不是一个静态的、一次性的努力,而是一项持续的事业。所以,这不仅仅是质量甚至耐心的问题。这也是一个数量问题——你需要一个持续的训练数据流来控制你的模型在生产中的行为。因此,定期更新数据和连续标记的问题是我们在推出真正可靠的人工智能产品之前需要解决的问题。
库马尔认为这是一个有效的论点——监测大有帮助,特别是对于视觉和语言任务非常具有挑战性。数据会漂移,偏差会改变,所以你不能只是假设如果配料是正确的,食谱可以永远保持不变。每天都有新的项目出现——从新短语到新相机——所有这些都需要输入给 AI。
此外,库马尔表示,未来十年,人类计算的需求可能会大幅上升,这将与增强人工智能的崛起相吻合。这意味着大多数人的生活,包括人群工作者和数据标签员,将会改善,因为许多任务将由人工智能接管。Kumar 估计,未来的工作负载将会是 80/20,80%的工作将由机器来完成。
从人性化到人性化的标签
Markus 指出了另一个至关重要的组成部分——数据标签的人性化方面。如果我们继续像对待巨轮上的齿轮一样对待人们,我们不会很快进入增强人工智能的世界。那些寻求数据标签服务的人需要对他们提供的任务负责。最好的办法就是报名成为一名群众工作者,试着自己完成工作量。这将允许您预先估计贡献者所期望的工作量和精确度。在这里,你需要既是数据科学家又是社会科学家。
Marcus 继续说,成功的数据标签必须保留,因为你需要同样的人或供应商回来与你再次合作。所以,你需要付给你的人类标签员更多的钱,而不是试图从最少的钱里榨取尽可能多的钱。这从长远来看是适得其反的。如果贴标签的人对他们的条件不满意,数据和整个项目都会受到影响。任务越复杂,投入的资金就越多,从中获得的潜在收益也就越多。所以,底线是不要贪婪。
奥尔加还认为,在制造洗钱数据的过程中,道德问题至关重要。这就是为什么托洛卡参与研究的原因——包括与赛弗·萨维奇合作的项目——研究众包背景下数据标签员的福祉。奥尔加说,最终目标是让人类贴标机的工作不那么费力,更有成就感。事实上,Toloka 一直在寻找有才华的研究人员和从业者,与他们一起寻找解决这个问题的有效方法。
公民科学
贝斯米拉同意其他发言者的观点,并补充说,公民科学社区是一个很好的例子,说明个人贡献者如何以自我维持的方式帮助共同的事业。在最新的项目中,美国宇航局在业余科学家的帮助下标记火星地形的倡议。我们需要的是将同样的窄领域专业知识的逻辑转移到更广泛的付费众包领域。这将保证人在回路 ML 的健康发展,专业知识的积累和职业发展。
Markus 认为,这一切都可以归结为拥有正确的策略,并让工程师、机器和人类贡献者能够理解这些策略。换句话说,我们需要一个双向系统,在这个系统中,贴标签者可以自由地与政策制定者交谈,这样政策制定者就可以为了贴标签者的利益,最终也是为了公司的利益,完善事情的法律方面。
所有软件设计挑战的根源:独立还是依赖
程序员世界
独立依赖设计:许多软件设计方案的蓝图

我们先学习编码,然后学习软件设计和架构。然后我们被介绍了许多解决问题的方法。Vijini Mallawaarachchi 撰写的关于 10 种常见软件架构模式的文章为其中的许多模式提供了很好的说明。
然而,很多时候,在解决了问题之后,我们会发现新的问题又出现了。这让我思考,我们到底在解决什么?
如果我们“抽象”软件设计的所有问题,它们都面向一个单一的问题,即。我们如何将它们分开,又将它们联系在一起。换句话说:
- 应该独立到什么程度?和
- 他们应该如何依赖?
当我们能够清楚地理解这个问题时,它将帮助我们制定一个更可持续的解决方案。我将在下面提供一些例子。
但是首先,让我更清楚地说明这个问题
独立还是依赖?
当我们第一次想要构建软件(或者编码一个解决方案)时,我们把它看作一个单一的实体。所有组件都在内。没有界限。实体本身是相对独立的,因为它不依赖于任何其他实体。
然而,这并不理想,当没有边界时,连接可能会变得混乱,并变得纠缠不清。这就是代码中禁止使用goto命令的原因。
因此,软件设计概念出现了,我们将单个实体分成两个或更多的实体,其中一个依赖于另一个,并且理想的是只有一个方向(避免循环依赖)。

在上图中,我们可以看到最初的单一实体设计。然后,我们将其转换为依赖于实体 2 设计的实体 1。这种设计比单一实体更简洁。我们也可以分配不同开发人员拥有每个实体,因此每个人都有更清晰的职责。
然而,新的挑战出现了…如果实体 1 中的 D 需要 G 中的新东西,我们该如何处理呢?
- 只需修改实体 2 中的 G?(实体 2 的所有者将会不高兴,因为每次 D 想要 G 改变时,实体 2 将需要改变)
- 在实体 1 中复制 G,让 D 可以随心所欲的对 G 做任何改动,不依赖实体 2?(但之后我们可能会有两组可能相似的 G)。
- 将 G 移到实体 1,因为 A 也需要 G?(但问题是我也需要 G,把 G 移到实体 1 会在实体 1 和实体 2 之间产生循环依赖)。
也许最好的解决方案是将 G 和 I 移到实体 1,使实体 1 更加独立于实体 2。但我们知道,这将回到原点问题,它将导致更混乱的实体 1。
这就是软件设计的永恒之战。应该独立还是依赖?上面的场景是对它的一个非常简化的解释。我们可以在不同层次的软件设计中看到这种挑战,例如
- 将代码划分成功能,例如,我们应该重构或复制多少?
- 类对象之间的责任划分
- 抽象级别的划分,例如,什么应该在基础中,什么应该在子中
- 客户机与服务器、主服务器与从服务器等之间的责任划分…
定义分区边界是困难的。没有完美解决方案,它会不断发展。
然而,如果我们将这种划分视为独立和依赖的范围划分,我们可能会发现一些双赢的情况。这可以通过我所谓的“独立依赖解决方案”来实现。
这听起来可能很新鲜,但是这种方法已经在软件设计中以多种方式应用,而我们却没有意识到。让我与你分享一些例子
独立依赖于解决方案
一个独立依赖另一个实体的实体是指,虽然它依赖于另一个实体,但它本身也可以影响依赖的实体,更加自力更生。
我们今天在抽象层次上使用的许多流行的软件设计方法是一种使一些东西独立的方法。
下面的一些例子将有助于使这一点更清楚…
1.依赖注入

假设我们有一个函数,我们想执行网络获取,我们有这个简单的函数如下
fun performNetworkFetch(input: String): String {
if (validateInput(input)) {
return **NetworkRepository()**.fetch(input)
} else {
return "Sorry, invalid input"
}
}
这里我们可以看到performNetworkFetch依赖于NetworkRepository实例上的来执行获取。
这是可行的,但是对于测试来说是不是很糟糕,因为没有办法去模仿NetworkResponsitory。
所以解决的办法就是通过在函数内实例化,让performNetworkFetch不直接依赖networkRepository,而是通过参数注入。这种方法被称为依赖注入。
fun performNetworkFetch(input: String,
**networkRepostoriy: NetworkRespositor**y): String { if (validateInput(input)) {
return **networkRepostoriy**.fetch(input)
} else {
return "Sorry, invalid input"
}
}
有了这些,现在我们可以通过模仿networkResponsitory来测试这个函数。
通过使performNetworkFetch不直接依赖于networkRepository,我们可以看到依赖注入使得函数独立依赖于对象。
2.依赖性倒置

当对象 A 引用另一个包中的另一个对象 B 时,它依赖于它。
class Aclass(val B: Bclass)val a1 = Aclass(Bclass())
这将发布对象 A 无法动态地将对象 B 的内容更改为另一个的问题。
然而,如果我们使用依赖倒置,通过让对象引用接口 B 来代替
class Aclass(val B: interface)val a1 = Aclass(Bclass()) // B inherits from interface B
val a2 = Aclass(Cclass()) // C is also inherits from interface B
现在,A 虽然有点依赖 B,但也更加独立了。它也可以得到 C(它是 B 接口的继承)。
这样,我们就使对象 A 独立于对象 b。
3.多态性
面向对象编程(OOP)的三个基本概念是封装、继承和多态。
封装和继承都是定义边界和创建依赖关系的方法。使 OOP 更加灵活的核心是多态性。

在典型的子类中,类继承自父类,子类的函数定义依赖于父类。例如,根据上图,在一个数学类中,减类和加类都是从 Math 的计算函数继承的。
这不好,因为如果我们运行下面的函数,减和加应该有不同的计算行为
fun (math: Math): Int {
return math.compute(1, 2)
}
因此,OOP 的多态性部分开始发挥作用。数学类将只定义一个虚拟(或抽象)函数,并允许子类(即加法和减法)相应地重新定义计算函数。
这使得加和减,独立依赖于数学课。
4.函数式编程
最近,函数式编程成为了流行的编程范例。这与它改变一个人所依赖的核心的能力有很大关系。下面的文章将详细介绍。
简而言之,函数式编程通过提供一种将函数作为另一个函数或对象的参数的方式,增强了开发人员的体验。

没有注入函数的能力,执行函数完全依赖于依赖对象
fun executionFunction() {
dependentObject.doSomething()
}class DependentObject {
func doSomething() {
x() // calling x within
}
**fun x() { /* Do something */ }**
}
使用函数式编程,我们可以如下所示定义和注入函数。
fun executionFunction() {
**fun x() { /* Do something */ }**
dependentObject.doSomething(::x)
}class DependentObject {
func doSomething(x: () -> Unit) {
x() // calling x from executionFunction
}
}
如你所见,我们通过将函数注入其中,使执行函数独立依赖于依赖对象。
5.适配器设计模式
这是四人帮的模式之一。它最初的目的是允许不兼容的接口一起工作。
同时,adaptor 模式也可以用来允许一个类的备用接口,使得一个类虽然依赖于,但也独立于被依赖者。

如果没有适配器,这个类将完全依赖于直接依赖的数据类型。这使得类和依赖者之间产生了强耦合。
如果接口的依赖方有任何变化,我们将需要直接修改类,这可能会涉及很多变化。
为了更好地保护类免受依赖项的修改,我们可以在类和依赖项之间设置一个适配器。这将保护类免受依赖者发生的任何变化。发生这种情况时,只需要更换适配器。
因此,从这里我们可以看到,适配器设计模式使得类独立于依赖者。
6.后端对前端
如今,在任何应用程序开发中,都有依赖来自服务器的服务。该服务为多个客户端提供服务。

如果服务器发生变化,两者都会发生变化。客户也必须改变。如果客户端是不能立即更改的移动应用程序,这就变得棘手了。
为了防止这个问题,目前一种常见的做法是在应用程序客户端和服务器之间实现后端对前端(BFF)。BFF 就像一个迷你服务,作为应用程序客户端的代理。
服务器上的任何更改都被屏蔽在应用程序之外。人们只需要相应地修改 BFF,而 App 客户端没有影响。
这使得应用客户端独立依赖于服务器。
7.偏执的编码&优雅的退出
如果一个应用客户端依赖于一个服务(BFF 或者直接依赖于服务器),通常在定义接口之间有一个契约 API,即什么是可空的,什么不是。
然而,正如罗纳德·里根所说,“信任但要核实”。不能保证服务器会一直履行合同。如果有一天没有,应用程序可能会崩溃。

因此,有一种被称为偏执编码的编程方法,它将检查所有输入,即使已经有一个输入肯定会以某种方式运行的契约。一旦检查失败,它将优雅地退出应用程序。
同样,在这里我们可以看到偏执编码如何使应用程序客户端更加独立于服务器,同时依赖于服务器,在应用程序端提供更安全的结果。另一种独立依赖的软件处理方式。
最后
软件本质上比其他领域变化更快,因此简单的基于分区的解决方案通常不足以使软件更加通用。
由此,正如我们从上面看到的,许多软件设计正在应用基于独立依赖的解决方案来迎合软件既灵活又可靠的需求。
以后当你卡在解决一个软件设计问题的时候,想想怎么才能独立依赖。你可能会找到一个有用的。
人工智能在医疗保健领域的安全有效发展
人工智能允许我们使用计算机的大脑和人类的心脏来实践医疗保健

资料来源:Verantos.com
作者:Dan Riskin,医学博士,FACS,Verantos 的创始人兼首席执行官
在我创伤外科医生职业生涯的早期,我见过一个病人,他遭遇了一场可怕的车祸,多处器官受伤。对于如何治疗病人,我有多种选择,但做出决定的证据有限。我心想,要是一台计算机能找到其他遭受类似伤害的人,并告诉我哪种方法最有效就好了。
那时候技术还不存在。但是,如果有,病人会受益。相反,他的治疗依赖于一个人,而一个人不可能知道所有正确的答案。然而今天,这项技术确实存在。人工智能(AI)允许我们使用计算机的大脑和人类的心脏来实践医疗保健。
AI 作为一种电器
我们经常看到以机器人形式描绘人工智能(AI)的恐怖电影,以毁灭人类为背景。这种以机器最终取代人类为中心的思路既不具有建设性,也不真实。我喜欢把人工智能看作是一种必要的支持。几十年前,人们手工洗衣服和洗碗。最终,我们发现机器可以更有效地处理这些任务。AI 也是如此。随着我们找到更好的解决方案来解决医疗保健中重复性或需要非人类记忆的问题,我毫不怀疑我们应该从机器中受益。这不是取代人类,而是人工智能补充了人类可以做的事情。

资料来源:Verantos.com
解决人工智能中的偏差
围绕人工智能偏见的问题已经被详细讨论过了,而且理由充分。人工智能算法高度依赖于源数据,而源数据通常基于在先进而昂贵的医疗系统中实施的试验。能够进入这些卫生系统的个人通常符合特定的经济、社会和种族特征。这意味着最可用的源数据来自富裕的白人人口。
Verantos 通过使用精确医学来确定亚组(包括代表性不足的人群)的首选疗法,解决了这些不平等问题。我们使人工智能有可能分析数百万页去识别的健康记录,以确定哪些对这些子群有效,哪些无效。毕竟,避免人工智能偏见的最佳方式是使用分布良好的源数据。
结论
在医疗保健行业,我们正处于一个独特而激动人心的时刻。有了足够的数据、强大的人工智能和足够的计算能力,我们能够渴望进入医疗保健的下一个前沿领域——一个学习型健康系统,该系统根据从数千甚至数百万类似个体的过去护理中获得的经验,为每个个体量身定制治疗。
医学博士、工商管理硕士 Dan Riskin 是 Verantos 的创始人兼首席执行官,Verantos 是唯一一家在 EHR 开展监管级研究的 RWE 专业公司。他是斯坦福大学外科学兼职教授和生物医学信息学研究兼职教授。Dan 是医疗保健人工智能方面的专家,他开发的产品每年影响数百万患者的护理。
SageMaker 传奇
自动气象站 SageMaker 简介

劳埃德·布兰克在 Unsplash 上的照片
许多数据科学家在托管环境中开发、训练和部署 ML 模型。遗憾的是,对于他们来说,他们不具备根据其模型在需要时扩大或缩小资源的便利性和便利性。
这就是 AWS SageMaker 的用武之地!它通过方便开发人员构建和训练模型来解决这个问题,以便以最少的努力和经济的成本获得更快的生产。
但是首先…你问的 AWS 是什么?

亚马逊网络服务(AWS)是一个被广泛采用的、世界上最全面的按需云平台,由亚马逊提供,它从世界各地的数据中心提供 200 多种功能齐全的服务。AWS 服务可用于在云中构建、监控和部署任何类型的应用程序,使数百万人和企业(包括发展最快的初创企业、领先的政府机构和最大的企业)能够降低成本、加快创新速度并变得更加敏捷。AWS 提供了一个大规模的全球云基础设施,允许您快速创新、迭代和试验。凭借业经验证的运营专业知识、选择所需服务的灵活性以及比任何其他云提供商更多的功能和特性,AWS 让您能够专注于创新,而不仅仅是基础架构。作为一个提供无与伦比体验的语言和操作系统无关的平台,AWS 在云中提供了一个高度安全、可扩展和可靠的低成本基础架构平台,为全球 190 多个国家的数十万家企业和数百万客户提供支持。如今,AWS 拥有最具活力和最大规模的客户和合作伙伴社区,几乎涵盖各个行业和各个规模。
欢迎,AWS SageMaker
Amazon SageMaker 于 2017 年推出,是一个基于云的机器学习平台,它是完全管理的,将您的环境从开发、培训和部署中分离出来,让您可以单独扩展它们,同时帮助您优化您的支出和时间。AWS SageMaker 包括一些模块,数据科学家和开发人员可以一起或单独使用这些模块来构建、训练和部署任何规模的 ML 模型。AWS SageMaker 使日常开发者和科学家能够在没有任何经验的情况下使用机器学习。世界各地的许多开发人员都在以各种方式采用 SageMaker,有些是为了端到端的流程,有些是为了扩大培训工作。
为什么选择 AWS SageMaker:优势
AWS SageMaker 有很多优点,我在下面列出了其中一些:
- 它改善和提高了机器学习项目的生产率
- 它有助于在最短的时间内创建和管理计算实例
- 它将构建机器学习模型的成本降低了高达 70%
- 它通过以下方式自动创建、部署和训练完全可见的模型
- 检查原始数据
- 它减少了数据标记任务所需的时间
- 它有助于将所有机器学习组件存储在一个地方
- 它训练模型的速度更快,并且高度可扩展
- 它维持正常运行时间—流程保持运行,没有任何中断
- 它保持高度的数据安全性
Sagemaker 是所有 ML 服务的大保护伞,它试图为所有机器学习和数据科学工作流提供一个单一的地方。它试图涵盖所有相关步骤,从供应云资源和导入数据到清理数据、标记数据(包括手动标记)和训练模型,再到自动化和在生产中部署模型。
AWS Sagemaker 演示 11 分钟
想在 Sagemaker 控制台上快速入门,看看 youtube 上的这个视频
亚马逊 Sagemaker 在 11 分钟内| AWS 由 Anuj Syal
探索全部潜力:SageMaker 的特点和能力

准备
即使您没有带标签的数据集,AWS Sagemaker 也允许您在机械土耳其人的帮助下正确标记您的数据集。其中之一是Amazon SageMaker Ground Truth,这是一个完全托管的数据标注服务,有助于构建正确的训练数据集。通过 SageMaker Ground Truth 控制台,您可以使用自定义或内置的数据标注工作流在几分钟内开始标注数据。
建设
AWS SageMaker 通过提供快速连接到训练数据所需的一切,帮助您选择和优化适合您应用的最佳算法和 apt 框架,使构建 ML 模型并为训练做好准备变得容易。亚马逊 SageMaker 包括托管的 Jupyter 笔记本,可以轻松浏览和可视化您存储在亚马逊 S3 上的训练数据。你可以直接连接到 S3 的数据,或者使用 AWS Glue 将数据从 Amazon DynamoDB、Amazon RDS 和 Amazon Redshift 转移到 S3,以便在笔记本上进行分析。为了便于选择算法,AWS SageMaker 包括了 10 种最常用的 ML 算法,这些算法都是预先安装和优化的,因此其性能是在其他地方运行这些算法的 10 倍。SageMaker 还预配置为运行 Apache MXNet 和 tensor flow——两个最广泛使用的开源框架。此外,您甚至可以选择使用自己的框架。
火车
AWS SageMaker 机器学习的下一个基本功能是训练模型。在这一阶段,你需要专注于模型的评估。模型的训练主要涉及算法,算法的选择涉及其他各种因素。为了更有效、更快速地使用,AWS SageMaker 还提供了内置算法。训练机器学习模型的另一个关键要求是计算资源。训练数据集的大小和期望的结果速度有助于确定资源需求。下一个重要的特征也是 Amazon ML vs. SageMaker 中一个令人生畏的方面,它涉及评估。完成模型的 AWS 在线培训后,您必须评估模型,以测试推论的准确性。AWS SDK for Python (Boto)或 SageMaker 中的高级 Python 库有助于向模型发送推理请求。Jupyter notebook 辅助模型的训练和评估。
部署
一旦您的模型经过训练和调整,AWS SageMaker 就可以很容易地在生产中部署,这样您就可以开始对新数据运行生成预测(这个过程称为推理)。为了同时提供高性能和高可用性,SageMaker 将您的模型部署在跨多个可用性区域的 Amazon EC2 实例的自动扩展集群上。AWS SageMaker 还带有内置的 A/B 测试功能,可以帮助测试您的模型,并尝试不同的版本以获得最佳结果。AWS SageMaker 消除了 ML 的负担,因此人们可以轻松有效地构建、训练和部署机器学习模型。
用 SageMaker 验证模型
您可以选择使用离线或历史数据来评估模型:
离线测试:为此,使用历史数据通过亚马逊 SageMaker 中的 Jupyter notebook 向模型发送请求进行评估。
使用实时数据进行在线测试:多个模型被部署到 Amazon SageMaker 的端点,它将实时流量导向模型进行验证。
使用“维持集”进行验证:为此,一部分被称为“维持集”的数据被搁置。该模型随后使用剩余的输入数据进行训练,并基于其最初学习的内容对数据进行归纳。
K 倍验证:为此,输入数据被分成两部分——K,这是用于测试模型的验证数据,另一部分称为 k1,用作训练数据。现在,基于输入数据,ML 模型评估最终输出。
先睹为快:AWS SageMaker 工作室和建筑视图
这是一个完全集成的机器学习开发环境,其中模型的构建、训练和部署都可以在一个单一的屋顶下完成。
- 亚马逊 SageMaker 笔记本:用于轻松创建和分享 Jupyter 笔记本。
- 亚马逊 SageMaker 实验:用于跟踪、组织、比较、评估不同的 ML 实验。
- Amazon SageMaker 调试器:顾名思义,用于调试和分析复杂类型的训练问题,接收错误的预警通知。
- Amazon SageMaker 模型监视器:用于检测已部署 ML 模型的质量偏差。亚马逊 SageMaker Autopilot:用于自动构建 ML 模型,具有完全可见性和控制力。
结束语:结论
机器学习是应用程序开发的未来,AWS SageMaker 将彻底改变计算世界。机器学习中的应用程序的纯粹生产力将为采用诸如 SageMaker 这样的 ML 服务创造新的前景。
高效使用 Kubernetes 的第二个七个主要概念和代码示例
这篇博客文章是第二篇解释 Kubernetes 的博客文章,没有深入研究其内部架构。我将通过 Minikube 代码示例讨论接下来的七个 Kubernetes 基本概念。

Kubernetes 协调了所有通过网络连接的虚拟机和应用程序的分布。照片由 S amuel Sianipar 在 Unsplash 上拍摄
安装 kubectl
在这篇博客文章中,我经常提到kubectl。
kubectl是您的本地命令行界面(CLI ),用于与单个 Kubernetes 集群交换声明性或命令性指令。Kubernetes 群集位于您的本地沙盒中;我们使用 Minikube 或通过网络远程操作。
你需要安装T2 才能继续。
大多数[kubectl](https://kubernetes.io/docs/tasks/tools/)命令的总结如下:
https://kubernetes.io/docs/reference/kubectl/cheatsheet/
安装 minikube
除了在这篇博客文章中使用kubectl,我还使用了minikube.
Minikube 是一款流行的工具,可以在您的本地工作站上使用 Kubernetes 进行培训或测试。
Minikube 是您在本地计算机上运行 Kubernetes 的方式。
我认为 Minikube 是我安装在本地机器上的一个程序,用来训练或测试 Kubernetes。
下面这篇博客文章将更详细地介绍如何设置和更改哪个[minikube](https://kubernetes.io/docs/tasks/tools/)集群kubectl正在指向哪个集群。
https://itnext.io/is-minikubes-profile-a-kubernetes-cluster-c0f134c5e684
在继续之前,您需要安装 [minikube,](https://kubernetes.io/docs/tasks/tools/)。
前一篇博客文章的摘要
在第一篇博客文章中,我介绍了 Kubernetes 是分布式计算资源云的操作系统这一前提。
我详细介绍了高效使用 Kubernetes 所需的前九个基本概念,同时避免了 Kubernetes 内部架构的复杂性。
前一篇博客文章的要点是 Kubernetes 编排了两个抽象维度。第一个维度是节点——计算资源。第二个维度是容器图像—应用程序。
在这篇博客文章中。我涵盖了节点、节点池、容器映像、pod、集群、入口和端点对象。
Kubernetes 与云无关,因为:
- 将物理机引擎转变为虚拟机。然后将虚拟机映射到 Kubernetes 抽象节点。
- 通过将应用程序放入容器映像中,将应用程序转换为一组虚拟应用程序。容器被映射到 Kubernetes 抽象pod。
Kubernetes 协调 pods,在节点上启动并初始化 pods ,如果无法到达,则在不同的节点上重新启动 pods (容错、复制(扩展)pods),并在 pods 上执行其他分布式操作系统操作。
10.Kubernetes 节点和节点池抽象了计算引擎
我详述了 Kubernetes 节点的第一维主干——计算资源。
Kubernetes 的一个重要概念是独立于计算硬件的类型。Kubernetes 将计算引擎(硬件和操作)规范抽象为一个节点。
一个节点是主要云供应商的一组有限的虚拟机(VM)产品。每种服务类型都指定了计算资源和单位时间的租赁价格。
虚拟机类型描述了 CPU、GPU 和 xPU 的混合;记忆的数量和类型(快速记忆);磁盘的数量和类型(慢速内存);以及免费的 Linux 变种操作系统(OS)。
从现在开始,我使用术语虚拟机(VM)来指代计算引擎。
每个云供应商都允许您使用其他想要添加或替换的资源来构建定制的虚拟机类型。
注 :云厂商提供 MS Windows NT 等其他 OS 变种。
您将一个 VM 类型分配给 Kubernetes 外部的一个节点。因此,Kubernetes 配置是云独立的,因为它只知道哪些节点被分配给集群,并且独立于该节点的实际计算类型。
由于 Kubernetes 编排服务的异构性(如故障转移和复制)造成的限制,云实施只允许将同构节点(相同虚拟机类型)的节点池添加到 Kubernetes 集群中。
在云上部署 Kubernetes 时,我们需要将一个 Kubernetes 节点映射到云中的一个 VM。
因为 Kubernetes 与 VM 类型无关,所以 Kubernetes 与云类型无关。
云计算硬件如何映射到 Kubernetes 节点在特定云供应商的文档中。它不在 Kubernetes 文档中。
下面引用的博客文章向您展示了如何为四种不同的云类型指定 Kubernetes 节点的计算资源:
` 指定虚拟机类型,或者让云厂商根据负载分配虚拟机类型。我建议您从云供应商自动分配开始,然后优化您的体验或当成本失控时。
11.什么是 Kubernetes 集群,它有什么作用?
Kubernetes 是一个用于通过网络连接的节点(VM)的分布式操作系统。一个特定的节点网络就是 Kubernetes 集群。
一个或多个节点池被分配给 Kubernetes 集群(节点)。节点池被分配给一个群集,不能在其他群集之间共享。
Kubernetes 在一个集群中协调您分配的多个节点池。
注 :一个集群最多可以有 5000 个节点的限制,每个节点最多可以有 110 个 pod。在一个集群中,容器映像的数量最多可达 300,000 个。文档陈述了这些数字。对于任何给定的云供应商?我不知道。我不知道有谁曾经接近过这些数字。
Kubernetes 可以命名和管理云上的许多集群。Kubernetes 的基础是虚拟机。

图一。物理硬件被描述为云中的虚拟机(VM)。每个虚拟机都映射到一个节点。相同虚拟机类型的节点被分组到一个节点池中。一个或多个节点池被分配给一个群集。群集不能共享池,节点池也不能共享节点。结果是虚拟机被分配到一个集群。此图显示了分配给节点池 0 的 16 台虚拟机,分配给节点池 1 的两台不同类型的虚拟机,以及分配给节点池 2 的一台虚拟机。作者的动画。
注 :如果您熟悉 DAG(有向无环图),那么一条直线型 DAG 将虚拟机连接到节点,节点池连接到命名集群。
注意 :因为是在一台本地计算机上,所以一个 Minkube 实例代表该计算机上的一个集群。
描述集群的 kubectl 命令。
您可以执行以下命令来打印活动上下文(集群)的集群信息:
kubectl cluster-info

“kubectl cluster-info”的输出
执行以下命令,打印出 kubeconfig 文件中所有集群上下文的一些详细信息:
minikube start sanbox --cpus "10" --memory "3260m" --nodes 5
kubectl config get-contexts

“kubectl config get-contexts”的输出
注 :命令 *minikube start* 只加载刀具 minikube 的默认簇 *minikube* 。
注 :输出显示错字。提示:集群名称。
记住,kubectl它被映射到一个特定的集群:
kubectl config use-context <cluster-name>

“kubectl 配置使用上下文 minikube”的输出
最后,停止sanbox:
minikube stop sanbox

12.什么是 Kubernetes 容器,它有什么用?
记住,作为一个分布式操作系统,Kubernetes 的一个主要目标是应用程序独立性。
Kubernetes 以与计算引擎独立相同的方式实现应用程序独立。一个应用程序及其所有依赖项被封装成一个容器映像,也可以称为虚拟应用程序(VA)。
注:Kubernetes 的不同实现支持不同的 VM 和 VA 技术提供者。例如,Kubernetes 支持几种容器运行时: Docker ,Container d,CRI-O,以及任意实现的 Kubernetes CRI(容器运行时接口) 。
容器是一个小型虚拟机,没有独立的操作系统、驱动程序和常规虚拟机的其他组件。相反,容器打包了所有必需的依赖项,以便在不同的计算环境上分发和运行相同的代码,同时与相同硬件上的其他容器共享相同的操作系统。
容器映像表示封装了应用程序及其所有软件依赖项的二进制数据。容器映像是可执行的软件包,可以独立运行,并对其运行时环境做出非常明确的假设。—https://kubernetes.io/docs/concepts/containers/images/
我用来制作 Kubernetes 容器图像的工具是 Docker。
注 : Docker 对图像和容器的定义是分开的但几乎相同,这可能会造成混淆。Docker 映像由应用程序及其所有软件依赖项的二进制数据封装组成。Docker 容器是一个可执行映像,Kubernetes 也称为 K8s,称之为容器映像。然而,根据文档作者的不同,有时 Kubernetes 将容器图像称为容器。
我从 Docker 注册表中获取容器映像,或者创建应用程序的容器映像,并将其推送到注册表中。一旦进入 docker 注册表,我就会将车开进一个 K8s Po d。
minikube start sanbox --cpus "10" --memory "3260m" --nodes 5
*# start the pod running ubuntu application, freeware Debian linux* # NOTICE create depolyment (of pod)
kubectl create deployment --image=ubuntu ubuntu-pod
kubectl get po
kubectl get pod

kubectl 接受明确的对象类型名。kubectl 没有受到影响,因为对象类型不到 40 种。记住古老的编码口头禅——“如果你认为它很聪明,就删掉它。
现在,我打扫卫生:
# Again, deployment not pod object type.
kubectl delete deployment ubuntu-pod

重要说明: Kubernetes 默认的图片注册表是 Docker 公共注册表。
虽然 Kubernetes 支持的容器运行时不仅仅是 Docker, Docker 是最常见的运行时,它有助于使用 Docker 中的一些术语来描述 Pods。—https://kubernetes.io/docs/concepts/workloads/pods/
Kubernetes 使您能够将容器化的应用程序分组到逻辑单元中,跟踪它们并自动伸缩它们。也就是说,当容器不在使用时,它会自动关闭它们,当应用程序需要它们来满足按需需求时,它会启动新的容器。
做完这些之后,我们准备好展示如何将应用程序转换成 Kubernetes 容器映像了吗?抱歉,不在这里。
不幸或幸运的是,从应用程序创建容器映像的过程超出了本文的范围,这取决于您如何看待它。
我和其他人充分报道了 Docker,并描述了我们与 Docker 的冒险经历:
https://levelup.gitconnected.com/our-enterprise-docker-solution-for-migration-to-the-cloud-d7bb9d1a796b https://dr-bruce-cottman.medium.com/a-docker-solution-for-the-test-groups-use-cases-8e8ed6c28e11 https://levelup.gitconnected.com/a-tutorial-on-the-behavior-of-linux-environment-variables-and-docker-containers-environment-29218a982220 https://itnext.io/is-minikubes-profile-a-kubernetes-cluster-c0f134c5e684 https://betterprogramming.pub/what-goes-into-a-dockerfile-ff0ace591060
我们将虚拟机映射到 Kubernetes 节点以实现计算资源独立性,并且我们需要将容器映像映射到 Kubernetes pods 中。
我们现在有了作为 Kubernetes pod 执行的计算资源和应用程序的基础。
13.Kubernetes Pod 对象是什么?
Kubernetes pod 对象是集群中正在运行的进程的一个实例。pod 包含一个或多个容器图像,通常是 Docker 容器。当 Pod 运行多个容器映像时,容器映像作为单个实体进行管理,并共享 Pod 的资源。
注意:Kubernetes支持其他容器创建工具, 不仅仅是 Docker。
Pod 共享资源包括:
- 共享存储,如卷;
- 联网,作为唯一的集群 IP 地址;
- 关于运行每个容器的信息,例如容器映像版本或要使用的特定端口。
例如,一个 Pod 可能包括
- NGINX web 服务器容器,
- 向 NGINX 容器提供页面模板的 MySQL 关系数据库服务器(RDBMS)容器,以及
- 提供内存(参数)键值缓存的 Redis 容器。

图二。有三个容器的吊舱;NGINX,Redis,MySQL。图片由作者提供。
该群集使用云内部互联网协议(IP)地址形成虚拟专用网络(VPN)。
Pod 中的容器共享云内部 IP 地址,并在同一节点上的共享上下文中运行。
一个 Pod 模拟一个特定于应用程序的“逻辑主机”,并且可以包含由 VPN 的内部 IP 地址连接的不同应用程序容器。
VPN IP 地址位于云内部,不能通过云外部的互联网进行外部访问。
我们需要一个服务来在 VPN 云内部 IP 和互联网外部 IP 之间进行转换(或映射)。
在 Kubernetes 中,地址转换是由 Ingress 对象处理的,我将在后面详细介绍。
在下一篇博客文章中,我将讨论 Kubernetes 部署对象,其中我使用了一个 YAML 文件来详细描述声明性的 pod、服务和工作负载。图 2 显示了一个包含三个 pod 的集群。
Redis,NGINX 和 MySQL 的一个旁注。
在这篇博客文章中,到目前为止,我已经讨论了 Kubernetes 的关键构建块概念:集群、节点、节点池、容器和 pod。
我先简单介绍一下我们在博客文章项目中使用的容器——在 Kubernetes 上部署 web 服务。
Redis 和 Kubernetes 有什么关系?
Redis 是一个流行的开源内存参数(密钥对)存储和缓存。如果你熟悉 Python,是不是一个快速的字典存储服务。Redis 与 Kubernetes 没有关系。
我们将 Redis 容器化,放在需要缓存参数数据存储的 Kubernetes pods 中。
在 Kubernetes 中使用 Redis 的详细清单如下:
https://medium.com/swlh/production-checklist-for-redis-on-kubernetes-60173d5a5325
Redis 不是 Kubernetes 发行版的一部分,也不是 Kubernetes 托管云服务的一部分。然而,所有主要的云提供商都将 Redis 作为软件即服务(s as)提供。比如说。Redis 是由亚马逊 elastic Cache、 Azure Cache for Redis 、 GCP Memorystore 提供的 SaS。您可能需要一个 Redis 容器,用于不同于 Kubernetes SaaS 版本所提供的配置和控制。
NGINX 和 Kubernetes 有什么关系?
NGINX 是一个流行的开源 web 服务器。
我们将 NGINX 容器化,放在需要 web 服务的 Kubernetes 容器中。
NGINX 与 Kubernetes 没有关联,尽管 Kubernetes 的实现者使用 NGINX 作为 Kubernetes 入口对象的核心。
不要担心;我还没有详细说明入口物体。
MySQL 和 Kubernetes 有什么关系?
MySQL 是一种流行的开源 RDBMS,与 Kubernetes 无关。
MySQL 不是 Kubernetes 发行版的一部分,也不是 Kubernetes 托管云服务的一部分。所有主要的云提供商都提供 MySQL 作为软件即服务(SaaS)。您可能想要一个 MySQL 容器,用于不同的版本、配置和控制,而不是云供应商提供的。
注意 : MySQL 是一个复杂的 Kubernetes 容器镜像,因为它也是一个 Volume 对象。另一篇博客文章的主题。
14.什么是 Kubernetes 入口控制器和入口对象?
当人们在云之外时,他们如何访问云托管的服务?
您可以通过一个 Ingress 对象进入 Kubernetes 云,该对象将 HTTP 和 HTTPS 路由从云外部公开给集群中的服务。
使用入口控制器和入口规则,单个 IP 地址将流量路由到 Kubernetes 云集群中的多个服务。
进入:进入或进入的行为或事实。牛津词典
入口控制器为位于云服务和外部世界访问之间的入口对象提供不同的功能。
可配置的流量路由始终是入口的基本功能。流量路由由入口资源(路由表)上定义的规则控制。
在路由之上,最流行的入口功能是负载平衡。
你可以使用任何软件作为入口控制器,但我总是看到部署了 NGINX web 服务器。
NGINX web 服务器提供了入口控制器所需的一切。

图 9。Kubernetes 的入口对象。图片来源: Kubernetes 文档中人物的作者桌面截图
15.什么是 Kubernetes 端点对象?
Kubernetes 端点源自网络协议术语。端点通常是 IP(互联网协议)地址。
在 Kubernetes 的情况下,端点是 Kubernetes Pod 的 IP 地址。它是网络连接的终点(点),也是 Kubernetes Pod 的起点。
注意 :你可能会看到一个引用<>的端点。例如,HTTP 端点。在我所知道的所有情况下,引用实际上是指 IP 地址。
我定义端点这个术语是因为在 Kubernetes 文档中经常会遇到它。
在 Kubernetes 中,您可以使用 pod 集群,而不需要知道端点是什么或做什么。
例如:
当一个服务选择器匹配一个 pod 标签时,该 IP 地址被添加到您的端点。
可以表述为:
当 pod 标签与服务选择器匹配时,一个服务由 pod 组成。
我认为 Kubernetes 的一点点实现正在渗透进来。也许在未来的 Kubernetes 文档中,端点会被删除。
16.用于调试的晦涩但有用的 kubectl 命令。
这些 kubectl 命令中的许多都像 docker 作用于容器一样作用于 Kubernetes pods。我们使用下面的 kubectl 命令来调试我们的 Kubernetes pods 的行为。
首先,我启动一个名为ngnix-pod的 Kubernetes pod,图片来自 Docker 注册表,名为ngnix:
minikube start sanbox --vm-driver=docker --apiserver-ips 127.0.0.1 --apiserver-name localhost --cpus "10" --memory "3260m" --nodes
kubectl create deployment --image=nginx nginx-pod
kubectl get pods --show-labels

下面的 kubectl 命令运行一个交互式 bash 会话,该会话只能在带有一个容器的 pods 上运行。
kubectl exec -it nginx-pod-796c9b5fdb-jjxgx -- sh

kubectl exec -it nginx-pod-796 c 9 b5 FD b-jjxgx -- sh"输出
哇哦。这是一个错误。有一个解决方法。在这篇博客文章中,我把它作为一个练习。在下一期文章中,将给出一个变通解决方案。
摘要
这篇文章过去的版本有 8000 字,并且还在增加。我觉得它太长了,不适合在媒体上发表。
然而,作为参考,它需要留在一起。
我通过反向链接以前发表的文章解决了“在一起”。也可以单独阅读。
- 前面的博客文章是第一部分;
*
2.这篇博客文章涵盖了 Kubernetes 集群、节点、pod、容器映像、端点和入口对象的七个概念。我使用了对象类型部署。不幸的是,我将在以后的博客中详细介绍部署。
3.第三篇博客文章涵盖了 Kubernetes 的种类、部署、服务和其他六个概念。
4.在第三篇博客之后,也许在这之前,我会展示如何在阿里巴巴、AWS、Azure、GCP 和甲骨文上获得免费但有限的账户。
4.我计划写一篇博客文章,详细介绍我们使用的丰富的工具生态系统。
在上一篇博客文章中,我注意到 Kubernetes 的安全性很低。嗯,我刚刚看到了一篇名为“ Kubernetes 强化指南:网络安全技术报告”的技术文章我打算今晚读它(也许开始读)。只有五十页。
每个博客都有你可以使用的代码。
快乐高效地编码!*
背后的秘密神经网络
机器学习中的必备知识
为什么神经网络实际上是后验概率的直接估计

每个机器学习算法的背后都存在偏差-方差困境。机器学习模型越复杂,它的泛化能力就越好,但过度拟合的倾向就越高。理论上,高斯分类器为正态分布数据提供了最佳分类器。但正是神经网络的灵活性使得它们在最近几年变得更加重要。
普适逼近定理
对于任何函数,不管有多复杂,都有一个神经网络可以完美地将输入映射到该函数的输出。
神经网络是分层排列的非线性单元的组合。非线性单元通常被称为感知器,它们的方程形式如下:

其中 f 是非线性函数。神经网络或多层感知器(MLPs)通过将一个神经元(x)的输入改变为前一个神经元的输出,将这些函数堆叠成层,如下所示:

通过分层堆叠这些感知器,可以实现输入和输出之间的复杂映射。这产生了一个极其通用和灵活的架构,如果足够复杂,可以有效地学习任何功能。这就是众所周知的通用近似定理。
优化网络的权重
为了优化神经网络的权重,模型的误差可以相对于权重来表示。然后可以计算梯度,并且可以使用类似梯度下降的优化器来更新权重。这就是所谓的反向传播算法。
误差函数可以表示如下。

误差是神经网络的输出和目标值之间的平方差之和。我们知道,最后一层的输出是网络中所有权重的函数,因此通过获取梯度并应用微分链规则,我们可以获得网络中每个权重的梯度。

作为后验概率估计器的神经网络
使用贝叶斯定理,可以形成给定数据的最佳权重的表达式。正如我的一些其他文章中提到的,这是网络权重的后验概率超平面,最大化这个返回最优权重。
可以看出,对于无限数据,最小化上面所示的误差函数等同于最小化下面的函数:

其中 p(w|x)是权重相对于数据的后验概率。因此,对于无限数据,一个足够大的神经网络是后验概率的直接估计器。
例子
以下示例显示了最大后验概率决策边界(黑色)、浅层神经网络估计(蓝色)和深层神经网络(红色)。

作者图片
如您所见,最大后验概率绘制了一个与深度神经网络非常相似的决策边界。浅层神经网络虽然在分类问题上做得还不错,但离真正的后验概率还很远。
结论
如果足够复杂,任何函数都可以通过神经网络完美地表示出来。此外,在无限数据的情况下,神经网络可以完美地重建后验概率。这两种说法是机器学习理论的关键部分。他们一起解释了为什么过去二十年中计算能力的增加导致了机器学习世界中神经网络的兴起。
支持我
希望这对你有所帮助,如果你喜欢它,你可以跟随我!
您也可以成为 中级会员 使用我的推荐链接,访问我的所有文章以及更多:https://diegounzuetaruedas.medium.com/membership
你可能喜欢的其他文章
类人文本摘要的秘密指南

使用谷歌最先进的 T5 模型来总结你的内容
摘要已经成为解决数据过载问题的一种非常有用的方法。在我之前的故事中,我分享了你如何使用摘录方法创建你的个人文本摘要——如果你已经尝试过,你可能已经注意到,因为没有新的句子从原始内容中生成,有时你可能很难理解生成的摘录摘要。
在这个故事中,我将分享我如何使用 Google 的 T5(文本到文本转换转换器)模型,只用几行代码就创建了一个类似人类的摘要器!
作为奖励,我也将分享我的文本摘要器管道,在那里我结合了提取和抽象的方法来为任意长度的 PDF 文档生成有意义的摘要…
文本摘要技术
有两种技巧可以概括一篇长文章:
i. 摘录摘要 —从长内容中摘录重要句子。
二。抽象摘要 —通过从原始内容生成新句子来创建摘要。
抽象摘要是一种相对更困难的技术,因为它涉及深度学习,但由于谷歌预先训练的模型可供公众使用,创建一个有意义的抽象摘要不再是一项令人生畏的机器学习任务!
T5 文本摘要器
您可以使用 Google 的 T5 预训练模型构建简单但功能强大的抽象文本摘要器。我将使用 HuggingFace 最先进的变形金刚框架和 PyTorch 来构建一个摘要器。
安装包
请确保您安装了两个 Python 包。
pip install torch
pip install transformers
加载模型和标记器
加载 T5 的预训练模型及其标记器。
import torch
from transformers import AutoTokenizer, AutoModelForSeq2SeqLMmodel = AutoModelForSeq2SeqLM.from_pretrained('t5-base')
tokenizer = AutoTokenizer.from_pretrained('t5-base')
共有五种 t5 型号可供选择:t5 小型、t5 底座、T5 大型、t 型 3B 和 T5–11B。它们各有不同的参数。我会选择‘t5-base’模型,它总共有 2.2 亿个参数。请随意尝试不同的 T5 型号。
输入文字
让我们载入一篇 CNN 新闻文章,关于 【网飞需要下一件大事】——仅仅是因为这是相当有趣的商业新闻——看看我们的总结者表现如何。
text = """New York (CNN Business)Netflix is synonymous with streaming, but its competitors have a distinct advantage that threatens the streaming leader's position at the top.Disney has Disney+, but it also has theme parks, plush Baby Yoda dolls, blockbuster Marvel movies and ESPN. Comcast (CMCSA), Amazon (AMZN), ViacomCBS (VIACA), CNN's parent company WarnerMedia and Apple (AAPL) all have their own streaming services, too, but they also have other forms of revenue.As for Netflix (NFLX), its revenue driver is based entirely on building its subscriber base. It's worked out well for the company — so far. But it's starting to look like the king of streaming will soon need something other than new subscribers to keep growing.The streaming service reported Tuesday it now has 208 million subscribers globally, after adding 4 million subscribers in the first quarter of 2021\. But that number missed expectations and the forecasts for its next quarter were also pretty weak.That was a big whiff for Netflix — a company coming off a massive year of growth thanks in large part to the pandemic driving people indoors — and Wall Street's reaction has not been great.The company's stock dropped as much as 8% on Wednesday, leading some to wonder what the future of the streamer looks like if competition continues to gain strength, people start heading outdoors and if, most importantly, its growth slows."If you hit a wall with [subscriptions] then you pretty much don't have a super growth strategy anymore in your most developed markets," Michael Nathanson, a media analyst and founding partner at MoffettNathanson, told CNN Business. "What can they do to take even more revenue out of the market, above and beyond streaming revenues?"Or put another way, the company's lackluster user growth last quarter is a signal that it wouldn't hurt if Netflix — a company that's lived and died with its subscriber numbers — started thinking about other ways to make money.**An ad-supported Netflix? Not so fast**There are ways for Netflix to make money other than raising prices or adding subscribers. The most obvious: selling advertising.Netflix could have 30-second commercials on their programming or get sponsors for their biggest series and films. TV has worked that way forever, why not Netflix?That's probably not going to happen, given that CEO Reed Hastings has been vocal about the unlikelihood of an ad-supported Netflix service. His reasoning: It doesn't make business sense."It's a judgment call... It's a belief we can build a better business, a more valuable business [without advertising]," Hastings told Variety in September. "You know, advertising looks easy until you get in it. Then you realize you have to rip that revenue away from other places because the total ad market isn't growing, and in fact right now it's shrinking. It's hand-to-hand combat to get people to spend less on, you know, ABC and to spend more on Netflix."Hastings added that "there's much more growth in the consumer market than there is in advertising, which is pretty flat."He's also expressed doubts about Netflix getting into live sports or news, which could boost the service's allure to subscribers, so that's likely out, too, at least for now.So if Netflix is looking for other forms of near-term revenue to help support its hefty content budget ($17 billion in 2021 alone) then what can it do? There is one place that could be a revenue driver for Netflix, but if you're borrowing your mother's account you won't like it.Netflix could crack down on password sharing — a move that the company has been considering lately."Basically you're going to clean up some subscribers that are free riders," Nathanson said. "That's going to help them get to a higher level of penetration, definitely, but not in long-term."**Lackluster growth is still growth**Missing projections is never good, but it's hardly the end of the world for Netflix. The company remains the market leader and most competitors are still far from taking the company on. And while Netflix's first-quarter subscriber growth wasn't great, and its forecasts for the next quarter alarmed investors, it was just one quarter.Netflix has had subscriber misses before and it's still the most dominant name in all of streaming, and even lackluster growth is still growth. It's not as if people are canceling Netflix in droves.Asked about Netflix's "second act" during the company's post-earnings call on Tuesday, Hastings again placed the company's focus on pleasing subscribers."We do want to expand. We used to do that thing shipping DVDs, and luckily we didn't get stuck with that. We didn't define that as the main thing. We define entertainment as the main thing," Hastings said.He added that he doesn't think Netflix will have a second act in the way Amazon has had with Amazon shopping and Amazon Web Services. Rather, Netflix will continue to improve and grow on what it already does best."I'll bet we end with one hopefully gigantic, hopefully defensible profit pool, and continue to improve the service for our members," he said. "I wouldn't look for any large secondary pool of profits. There will be a bunch of supporting pools, like consumer products, that can be both profitable and can support the title brands.""""
对文本进行标记
T5 可用于执行其他任务,如文本生成、翻译等。;添加 T5 特定前缀“summarize:”将告诉模型执行汇总任务。
tokens_input = tokenizer.encode("summarize: " + text,
return_tensors='pt',
max_length=tokenizer.model_max_length,
truncation=True)
这里,我们将把文本标记为模型的最大可接受标记输入长度。如果标记化的输入超过了模型的最大标记长度,它将被截断。
生成汇总
让我们通过传入编码的令牌来生成摘要,然后将生成的摘要解码回文本。
summary_ids = model.generate(tokens_input, min_length=80,
max_length=150, length_penalty=15,
num_beams=2)summary = tokenizer.decode(summary_ids[0], skip_special_tokens=True)
该模型采用编码的令牌和以下输入参数:
- min_length :标记化文本的最小长度。
- max_length :标记化文本的最大长度。
- length_penalty :值> 1 强制模型生成一个较长的摘要,值< 1 强制模型生成一个较短的摘要。
- num_beams :值 2 允许模型探索生成更有希望的预测的记号。
注意: 保持最小和最大标记化文本长度在 80 和 150 之间,并且长度惩罚为 15,将允许模型生成 60 到 90 个单词的合理摘要。 我们将对其余的输入参数使用默认值(上面没有显示)。
输出汇总
Netflix (NFLX) reported Tuesday it now has 208 million subscribers globally. that number missed expectations and the forecasts for its next quarter were also pretty weak. the streaming service's stock dropped as much as 8% on Wednesday, leading some to wonder what the future of the streamer looks like. if competition continues to gain strength, people start heading outdoors and if, most importantly, its growth slows, it wouldn't hurt if Netflix started thinking about other ways to make money - like selling ads.
哇!这看起来是一个相当不错的总结。
…但是,如果您阅读全文并再次阅读摘要,您会注意到全文的后半部分没有得到摘要,这是因为标记化的输入在超过最大模型标记输入长度 512 后被截断。
如果你担心在后面的文本中遗漏一些重要的细节,你可以使用一个简单的技巧来解决这个问题:首先对原文进行提取摘要,然后进行抽象摘要。
伯特摘录摘要
在我们继续之前,请确保 pip 已经在您的终端上安装了 BERT extractive summarizer。
pip install bert-extractive-summarizer
BERT 代表变压器的双向编码器表示。这是谷歌开发的基于转换器的自然语言处理(NLP)机器学习技术。它使用了一个强大的扁平结构和句间转换层来获得最好的摘要效果。
from summarizer import Summarizerbert_model = Summarizer()
ext_summary = bert_model(text, ratio=0.5)
以下是 BERT 生成的摘要。通过将摘要比率设置为 0.5,我特意将其设置为生成长度为原始文本 50%的摘要。您可以随意使用不同的比率将您的长文档调整到合适的长度。
New York (CNN Business)Netflix is synonymous with streaming, but its competitors have a distinct advantage that threatens the streaming leader's position at the top. Disney has Disney+, but it also has theme parks, plush Baby Yoda dolls, blockbuster Marvel movies and ESPN. It's worked out well for the company - so far. But that number missed expectations and the forecasts for its next quarter were also pretty weak. Or put another way, the company's lackluster user growth last quarter is a signal that it wouldn't hurt if Netflix - a company that's lived and died with its subscriber numbers - started thinking about other ways to make money. Not so fast
There are ways for Netflix to make money other than raising prices or adding subscribers. His reasoning: It doesn't make business sense. "It's a judgment call... It's a belief we can build a better business, a more valuable business [without advertising]," Hastings told Variety in September. " You know, advertising looks easy until you get in it. Then you realize you have to rip that revenue away from other places because the total ad market isn't growing, and in fact right now it's shrinking. It's hand-to-hand combat to get people to spend less on, you know, ABC and to spend more on Netflix." So if Netflix is looking for other forms of near-term revenue to help support its hefty content budget ($17 billion in 2021 alone) then what can it do? Netflix could crack down on password sharing - a move that the company has been considering lately. "Basically you're going to clean up some subscribers that are free riders," Nathanson said. " That's going to help them get to a higher level of penetration, definitely, but not in long-term." The company remains the market leader and most competitors are still far from taking the company on. We used to do that thing shipping DVDs, and luckily we didn't get stuck with that. We define entertainment as the main thing," Hastings said. He added that he doesn't think Netflix will have a second act in the way Amazon has had with Amazon shopping and Amazon Web Services. Rather, Netflix will continue to improve and grow on what it already does best. I wouldn't look for any large secondary pool of profits.
现在让我们通过 T5 模型输入摘要。
抽象的摘要
Netflix's lackluster user growth is a signal that it wouldn't hurt if it started thinking about other ways to make money. the company remains the market leader and most competitors are still far from taking the company on. the company could crack down on password sharing - a move that the company has been considering lately. "it's a judgment call... it's a belief we can build a better business, a more valuable business," hastings said.
哇…生成的摘要现在覆盖了原始文本的整个上下文。
为了您的方便,我总结了下面的代码。
您也可以点击 此处 进入我的 GitHub 获取用于 T5 文本摘要器和文本摘要器管道准备的 Jupyter 笔记本,以及您可以在终端上运行的管道脚本,以汇总多个 PDF 文档。
奖金…t5 文本摘要管道。
我已经建立了一个文本摘要器管道,可以从 PDF 文档中提取文本,总结文本,并将原始文本和摘要存储到 SQLite 数据库中,并将摘要输出到文本文件中。
要总结一个长的 PDF 文档,您可以首先应用摘要来缩短文本,然后再通过 T5 模型生成一个类似人类的摘要。

按作者分类的图像:运行数据管道从 pdf 文件中提取文本数据并保存到 SQLite 数据库中

作者图片:运行摘要管道(仅 T5)来摘要文本数据,将摘要保存到文本文件,并将摘要存储到数据库
注: 如果只想用 T5 模型概括文本,键入‘1.0’。

作者图片:运行摘要管道(BERT & T5)来摘要文本数据,保存摘要到文本文件和存储摘要到数据库
注: 如果您希望在运行 T5 摘要之前使用 BERT 摘要缩短文本,请键入一个低于“1.0”(例如“0.5”)的比率。用这种方式生成摘要需要更长的时间,因为每个文本都要经过两个不同的摘要器。
结论……和未来的工作
这就对了——你只需要 7 行代码(包括导入库和模块)就可以让 Google 的 T5 预训练模型为你总结一个内容。
为了使长内容的摘要更有意义,您可以首先应用提取摘要来缩短文本,然后应用抽象摘要。
T5 预训练模型支持迁移学习:这意味着我们可以使用自定义数据集进一步训练模型。
对于未来的工作,观察模型在经过定制训练以总结特定内容(如医学期刊和工程期刊)后的表现将会非常有趣。
元数据的秘密生活
对元数据一无所知并不是犯罪——只是从数据中产生商业价值非常不方便。

如果你曾经试图在互联网上阅读关于元数据的文章,你很可能会遇到恐怖故事(围绕着新的元数据保留法的一些令人毛骨悚然的安全漏洞,会让我们所有人都完蛋)或乌托邦童话(嘿,元数据是数据民主化和实现你的分析梦想的神奇银弹)。
虽然元数据似乎正在改变世界,但它秘密地融入背景,保持安静,并被视为理所当然,直到某些事情爆发。
不管是好是坏,元数据将永远是从数据中提取价值和确保适当治理之间平衡行为的一部分。对于那些一直想了解元数据是什么、它在大数据世界中为什么重要以及我们应该如何开始思考它的人来说,这只是一个简单的故事。忘记那些令人费解的术语或不切实际的神话,让我们开始吧。
在这篇文章中,你将学到:
- 什么是元数据?
- 大数据、数据湖和元数据
- 三种类型的元数据
- 元数据管理的障碍
什么是元数据?
让我们从正确定义什么是元数据开始。我敢打赌,您可能已经遇到过这个非常熟悉的定义:元数据是“关于数据的数据”。嗯,没什么帮助,对吧?
我个人喜欢下面的定义,因为它抓住了元数据的定义和目的。
元数据是描述、解释、定位或以其他方式使信息资源更容易检索、使用或管理的结构化信息。
-国家信息标准组织
如果你在超市购物,元数据是包装上的营养信息。如果你正在网上商店寻找下一双鞋,产品的图片、尺寸、颜色、品牌和价格标签都是关于产品本身的元数据。
在业务上下文中,如果您向同事发送电子邮件,则“发件人”和“收件人”电子邮件地址、主题和发送日期就是元数据。如果您希望在团队的 OneDrive 上找到包含最新产品列表的特定 Excel 文件,文件名、“最后更新”日期和文件类型是有价值的元数据,可帮助您准确找到您需要的内容。
元数据无处不在。但是我希望你能看到这里的模式。 元数据不代表对某个项目的主观看法。取而代之的是,它捕捉到了对一种资源的相当客观的描述,这种资源是容易获得的,并且意味着可以被多人共享。
大数据、数据湖和元数据
数据湖:大数据的一站式在线商店
在企业内部和不同组织之间共享资源以节省时间和提高生产率的想法并不新鲜。同样的逻辑也适用于大数据。
给定适当的批准和访问权限,如果 Simon 需要最新的客户列表,而 Fiona 已经如此努力地为她的项目创建了完美的列表,那么 Simon 就不应该浪费时间重新发明轮子。相反,他应该联系 Fiona,并重新使用该列表来分析如何产生新的收入流或增强客户体验。
这样的想法可能非常适合每个人都互相认识的小团队。但在拥有数百名员工和数千个数据集的大型组织中,四处打听谁拥有什么将是一场噩梦。所以许多企业选择建立一个数据湖。
什么是数据湖?嗯,数据湖就像一个百货商店。你几乎得到了家庭所需的所有东西(例如,衣服、鞋子、美容产品、玩具、礼物等。)在一家大型商店里,而不必像无头鸡一样在几十家商店里跑来跑去。
同样, 数据湖可以让你通过一站式访问不同的信息资源,进行分析和决策 。通过数据湖,不同的用户可以共享和重用信息资源(例如,文本、图像、视频、报告、仪表板、数据集、代码片段等。).由于花费在数据分析项目上的大部分时间都与识别、清理和集成来自不同来源的数据有关,因此投资构建数据湖是值得的。
元数据:功能数据湖的秘密成分
凌乱的储物空间
让我们假设,经过一些巨额投资和痛苦的团队合作,我们现在有一个数据湖。各种数据都很好地存储在单一的存储空间,等待你去发现。
您想要查找截至 2021 年 8 月的最新客户列表。因此,您急切地访问数据湖的位置,进行搜索,这就是您的发现。

不同的文件对用户来说可能看起来同样令人困惑和模糊——图片由作者提供
你有没有发现自己走进了一家看起来像迷宫一样的商店,却找不到你需要的东西,最终走开了?同样的事情也可能发生在我们非常亲爱的数据湖身上,当一切看起来都同样混乱和模糊的时候。由于我们没有在墙上挂魔镜,如果找不到自己需要的东西太痛苦,大多数人都会离开凌乱的储物空间。
愉快的购物体验
人们没有耐心,除了即时的满足之外别无所求。我们需要让他们快速、轻松地识别和找到他们需要的东西。所以,让我们把搜索数据想象成你经历过的最愉快的网上购物体验。会是什么样子?

展示典型数据目录的屏幕模型——图片由作者提供
一个简单的 UI,如上图所示,用来搜索、排序、过滤和定位你需要的数据,通常被称为数据目录(或数据日志),有点像现代的在线购物网站。
现在,我们仍然有相同的 8 个可能的数据集,但是我们也有更多关于每个资源的信息,以将一个资源与其他资源区分开来。例如,使用指示数据质量、数据范围、记录数量和其他简洁的“产品描述”的元数据,您可以很容易地确定什么资源与您的需求最相关、最值得信赖。
还有呢?找到您需要的东西,以及关于谁拥有数据的元数据后,您可以发送请求来获取数据集。许多现代数据目录还依赖于关于数据所有者的元数据来创建请求批准和查询的自动化工作流。不再有没完没了的来回电子邮件,往往让我们无处可去!
其他元数据,如数据源、存储位置、格式和访问权限,也使公司能够自动化数据配置过程。您确定您需要什么信息资源,添加到购物车,然后结账,同时后端流程协调所有必要的步骤,将数据直接发送到您的首选位置。这种“网上购物体验”可以毫不费力地自助满足你的数据需求,人们称之为数据民主化。
简单地说, 元数据是创建一个实用的、可扩展的数据湖平台的秘密成分。它有效地将数据资源推广给正确的受众,在相关资源之间建立联系,并通过数据目录为数据消费者创造“愉快的购物体验”。
三种类型的元数据
重要的是要认识到元数据是复杂的、多样的,并且有不止一种类型的元数据。在理解和管理信息资源时,它们中的每一个都可以服务于非常不同的目的。下面是根据数据管理知识体系总结的三种主要类型的元数据。

作者图片
看起来又长又复杂,对吧?别担心。我只有两个要点需要你记住。
首先,一些元数据可能与搜索数据集的业务用户更相关,而其他细节则决定了企业如何保护敏感数据、遵守隐私法和降低安全风险。 高质量的元数据不仅有助于数据发现(从而加快洞察时间),还能确保数据治理和风险管理。
其次,元数据由组织内不同的利益相关者创建、消费和评估。就像太多的厨师糟蹋汤一样, 如果每个人都想按自己的方式行事,元数据很容易变得一团糟。因此,精心规划、实施和控制的适当管理对于创建和维护高质量的元数据绝对是必不可少的。
元数据管理的障碍
由于元数据管理(以及如何正确地进行管理)是一个值得单独撰写一篇文章的主题,所以我将把它留到以后再说。但是你有没有想过为什么元数据的生命如此神秘?一些专门的团队偶尔会谈论它,也许少数人知道如何处理它,只有组织中最有特权的人在考虑如何管理它。
如果高质量的元数据对组织中处理数据的人如此重要,为什么我们没有给予元数据应有的重视?
嗯,有无数的理由对元数据保持无知,更不用说采取新的举措来管理它了。您应该了解元数据管理计划的两个主要障碍。
不明确的有形利益和激励

伊恩·施耐德在 Unsplash 上拍摄的照片
你可能拥有最大的热情和惊人的想法来帮助你的公司以正确的方式管理元数据。但是不要忘了你的公司时间和金钱是有限的,但却不缺少紧迫的问题。
因此,为了创建和管理元数据而创建和管理元数据很少能很好地工作。归根结底,如果这些计划不能帮助企业解决任何最重要的问题,那么它们就没有任何意义。
当既没有明确的有形利益也没有关键风险来证明元数据管理投资的合理性时,不要强迫它成为议程。 相反,你可能只想记住元数据管理。因为迟早,随着组织处理和分析大量的数据,元数据管理将成为房间里的大象,任何利益相关者都不能忽视。
元数据管理要求人们改变他们每天与数据交互的方式。 问题是,即使对一些人来说好处和风险显而易见,其他人可能也不觉得有必要遵循新的流程或以不同的方式做事。 毕竟不同角色的人有着非常不同的需求。
那么,为什么元数据管理对于组织的生存或发展是必要的呢?更重要的是,这对他们有什么好处? 如果不对那些受元数据管理影响的人清楚地说明好处和激励措施,使其具有关联性和吸引力,那么首先就很难获得急需的支持和承诺来启动该计划。
乏味、无聊且难以实现

照片由 meredith hunter 在 Unsplash 上拍摄
元数据是如何创建的?虽然一些元数据是由不同的系统自动生成的,但许多细节需要人类用户进行一些艰苦的工作。例如,您可能需要在一个表中提供 50 个不同列的业务定义。一开始听起来还不错,对吧?
但是如果还有 30 多桌呢?是的,一旦你完成了,你的工作就是保持这些定义的更新。你会有什么感觉?不出所料,许多人甚至不想提起它,担心这些乏味、劳动密集型和完全无聊的任务会落到他们头上。
还有呢?为了确保每个人在处理元数据时都在同一页面上,您需要建立标准。这意味着让不同的人就描述信息资源的最佳方式达成一致,并确保他们在做正确的事情。元数据管理很难实现。难怪大部分人都不想和它扯上关系。
不幸的是,无论您喜欢与否,对适当的元数据管理的需求很快就会赶上您。可能是法规要求(例如 GDPR、CCPA)跟踪您的公司正在获取哪些个人身份信息,以及您如何保护这些敏感数据。也许一旦数据和分析达到一定规模,您的公司就再也无法承受将随时可用的信息资源锁在孤岛中。
也就是说,下面是开始考虑元数据管理的三个一般原则。
- 少即是多: 不要试图覆盖所有的信息资源和所有类型的元数据,而是优先考虑对业务最重要并且在 1-3 个月内可以实现的特定用例。元数据应该保持最少,并且与用户的数据发现和治理需求相关。
- 自动化取代手工劳动: 与其让您的数据管家默默忍受,不如考虑在到达湖泊时自动捕获元数据的工具和技术。如今,自动化数据分类、数据谱系跟踪和数据目录的选择真是无穷无尽。
- 用户便利为王: 在发现信息资源和治理数据时,不要追求完美,要以简单和用户便利为目标。描述信息资源的术语和词汇的选择应该反映商业用户的需求。
离别的思绪
诚然,可以从元数据中推断出许多关于某人生活的信息。2015 年发表的一篇文章显示,一名记者手机中一年的元数据揭示了他在哪里生活和工作,如何上班,何时搬家,父母住在哪里,以及何时去看望他们。
毫不奇怪,当讨论元数据和隐私问题时,报纸标题喜欢使用引人注目的短语和可怕的语气。但这只是故事的一部分。
那么还缺少哪些部分呢?
首先, 元数据有助于用简单的文字描述复杂的项目。通过这种方式,人们可以很容易地发现他们所拥有的东西,以及在一个混乱无序的世界中是否有任何对他们有用或相关的东西。
其次,数据湖承诺能够通过一站式商店为更多的企业用户提供信息资源,从而产生新的收入流、优化成本并改善客户体验。然而, 如果没有数据目录,没有强大的元数据管理基础,数据湖很难发挥作用,最终无法实现预期的业务价值。
最后,元数据管理可能是一个漫长的过程,有许多障碍。有些人可能会觉得太犹豫,甚至不敢开始,而其他忠诚的灵魂可能会中途放弃。这不是一个系统实现项目。 这是一个充满挑战的变化之旅,需要大量的积极倾听、合作和共鸣。
我真诚地希望你喜欢读这篇博客,就像我喜欢研究和写这个话题一样。感谢您的阅读。对我如何能做得更好有反馈,或者只是想聊天?在评论里告诉我或者在 LinkedIn 上找到我。女士们先生们,祝你们愉快!
参考
原载于 2021 年 8 月 15 日http://thedigitalskye.comT22。
将机器学习应用于生产的秘密
绝大多数机器学习(ML)项目都失败了。
如果你是一名数据科学家,这可能并不奇怪:你已经看到许多项目开始时是一个很好的承诺,后来逐渐消失,或者更糟——影响了生产,然后由于糟糕的性能和客户投诉而倒退。有些人只是将此视为 ML 团队中“生活的一部分”。但是你有没有想过这些失败是否有一个共同点?

赛义德·卡里米在 Unsplash 上的照片
87%的 ML 项目最终没有交付生产 (VB)。这篇来自 2019 年的文章几乎在每个 MLOps 初创公司的宣传资料中被引用,这个数字在 ML 话语中已经得到了很好的确立。老实说,我试图追溯这个数字,并找出它是如何被检索到的——但没有找到任何可靠的来源或研究来支持它。但是,如果您还考虑到在 PoC 的早期阶段停止的项目,这个数字似乎相当合理。更令人痛苦的数字是已经向管理层甚至客户承诺的项目的相对数量,在这些项目中已经投入了巨大的努力——这些项目在投产之前(或之后)被终止。在我之前的文章中:“如何对 ML 团队进行尽职调查”,我对成功 ML 团队的要素进行了高度概括。在这里,你可以找到一些关于如何建立高影响力 ML 团队的实用建议。
公司向 ML 团队投资数百万,雇佣顶尖人才并支付相应的薪酬,悬而未决的问题是:“这值得吗?”作为一个 ML 的领导者和爱好者,我知道它是。当 ML 被正确生产时,它提供了其他算法类型所不能提供的价值,并可能成为采用它的公司的一个关键区别。同时,我认为,作为数据科学家,我们应该意识到阻碍我们实现目标的陷阱。正如我经常做的那样,我将陷阱分为三大类:
- ML 团队心态
- 公司为 ML 做好准备
- ML 基础设施&运营
在这篇博文中,我分享了我对这些陷阱的经验(是的,我都遇到过),并提供了如何避免它们的实用方法。
陷阱 1——ML 团队思维
众所周知,数据科学家通常被认为与业务脱节。他们坐在象牙塔里,讨论复杂的科学思想,开发没人理解也没人最终使用的东西。这一点也不夸张,我见过很多公司的情况正是如此。ML 团队中的人都是高水平的个人,通常拥有理学硕士或博士学位,但他们的思维倾向于科学而不是影响。
以下是一些可以说明上述情况的例子:
- 给定一个需要文本或表格数据分类的业务问题,推动最新和最棒的深度学习模型,而不是首先开发一个简单的基线模型,一直到生产。
英特尔人工智能小组(2021)的这篇伟大论文显示,对于表格数据,XGBoost 等集成模型的性能与深度学习模型相当。IBM(2017)的这篇漂亮的论文声称,对于文本分类任务,基于 Word2Vec 表示的线性模型的表现类似于深度学习解决方案。
我并不反对深度学习,我只是说,建立一个最初产生相当好结果的基线模型是一个更好的策略,可以更快地交付。 - 规划一个为期一年的项目,没有任何中间交付给客户或生产。这种心态非常学院派——“在我完成之前不要打扰我”,但不适合行业的节奏,因为需求可能会随着时间的推移而变化,ML 团队和客户之间应该经常互动,即使在开发阶段也是如此。当然,这取决于项目,但我们应该打破常规,将一个长期项目分解成能够带来生产价值的小部分。我最近遇到的一个例子是一个为期一年的复杂分类模型项目。我们建议添加一个里程碑,在指定的仪表板中显示所选的功能。事实上,它并不像预测本身那样具有最终价值,但是发布特性选择的中间结果仍然向我们的客户传达了价值,并且允许我们更快地实践交付到生产,在我们的组织内部发展信任,并且也获得我们的客户的信任。
当我面试数据科学职位的候选人时,我非常重视了解什么对他们更重要:影响还是科学。虽然与熟悉最新模型并对科学充满热情的数据科学家一起工作对我来说很重要,但为了让团队取得成功,他们的首要任务必须是影响优先。
陷阱 2——公司对 ML 的准备情况
这里收集了一些技巧,它们都是 ML 团队之外的,与一般的公司观念有关,但是没有它们,将很难甚至不可能成功地将 ML 交付到生产中。
- 当心https://whatis.techtarget.com/definition/moonshot**——为 ML 团队设定雄心勃勃,甚至是想象中的目标是公司常犯的一个错误。作为 ML 的领导者,我们应该把期望摆正,公司必须承认 ML 团队不可能一下子解决所有可能的问题。尤其重要的是,不要在一开始就承诺大型项目。
从小做起,传递渐进价值,创造信任。** - 雇佣一名 ML 产品经理——这应该是你的第一份工作。从我的经验来看,拥有一个一方面面向业务,另一方面理解 ML 开发的流程和复杂性的项目经理是无价的。拥有基于 ML 的产品,发现客户的需求和商业价值,以及设计 ML 项目的本质要求,应该由一个非常了解 ML 硬币两面的人来完成:客户方面和数据科学方面。
- 发展值得信赖的客户关系 —在从事 ML 项目时,调整客户对结果的期望并创建一个快速获得客户反馈的流程非常重要。我建议与接受 ML 理念的客户发展关系,让他们成为设计伙伴。设计合作伙伴允许我们在开发阶段使用他们的数据,讨论我们的中期结果,获得他们的反馈,并确保随着项目的发展,我们有一个适合市场的产品,并且我们专注于正确的方向。
- ****团队合作——在软件开发中,公认的是 scrum 团队应该包含交付一个特性所需的所有角色(例如后端、前端和 QA 自动化),并快速带来商业价值。不知何故,在许多组织中,ML 团队并不在类似的模型中工作:他们是孤立的,并以瀑布方式工作——只有在模型准备好之后,它才被发送到工程团队,工程团队将它翻译成可伸缩的代码。这个过程是适得其反的,并且与现代软件开发方法相矛盾:ML 团队也应该以小组的形式运作,包含数据科学家和工程师,他们在 ML 组件上端到端地一起工作。这使得在发布到产品之前对真实世界的生产数据进行实验变得更加简单,并且有助于团队的速度。
如果你的模型的发布依赖于另一个团队,你应该考虑到另一个团队的优先级可能会改变,这会给你的交付带来风险。 - 投资 ML 基础设施 —公司应该意识到,为了拥有可扩展的 ML 系统,我们需要投资开发适当的基础设施。也就是说,我们不仅仅是在特设项目上工作,而且我们有一个统一的系统来开发、部署和监控 ML 模型。这将引导我们进入下一部分,但是让管理层接受这一点很重要。
陷阱 3 — ML 基础设施和运营
“快速移动并打破东西”
马克·扎克伯格

照片由 CHUTTERSNAP 在 Unsplash 上拍摄
软件工程中最重要的原则之一是“快速失效”。为了快速失败,需要一个良好的基础设施来测试、部署、监控和在出现故障时发出警报。在这样一个系统上投入时间、思想和精力是值得的,因为它加速了软件开发。
问题是,ML 组件不同于传统的软件组件。让我们以一个 web 服务为例,它预测汽车图像传感器拍摄的图像中是否有红绿灯。这项服务运行良好,但突然开始返回错误的预测:当交通灯不在那里时预测它们,反之亦然。“怎么回事?”你可能会问。一个可能的原因是,开始下雨了,ML 模型没有在雨中拍摄的图像上进行训练。另一种解释可能是开发人员部署了新的代码来压缩图像文件并节省了数百万的存储成本,但是 ML 模型并没有针对压缩的图像进行训练。可能有其他解释,但是,在任何情况下,ML 都会产生不好的输出,因为它没有在这个群体上训练:“垃圾输入-垃圾输出”。然而,web 服务的响应将是成功的(返回代码:2XX),因为服务被认为是健康的,即使它返回完全错误的预测。坏消息是,第一个注意到失败的人将是我们的客户,这是,嗯,让我们说这是不愉快的。除非我们找到一种持续监控和测试输入群体的方法。
ML 需要一套不同的工具来建立一个“故障快速”系统,而 ML 的可信 CI/CD 管道是一个相对较新的概念。这些工具通常属于“MLOps”(ML 操作)的定义,好消息是这个领域在不断发展和改进。这里的是一篇很好的文章,总结了 ML 管道需要的东西,可以帮助你规划在你自己的 ML 系统中需要建立哪些能力。
那么,你会问,把机器学习交付给生产的秘诀是什么?****
在你的 ML 团队中保持一种以影响为导向的心态,让你的公司准备好接受 ML 及其复杂性,投资开发快速失败的基础设施——你就走在了一条美好而顺利的 ML 交付的正确道路上。祝你好运!
欢迎你联系我,对这篇博文或任何与 ML 相关的事情有任何评论、讨论或问题,我总是很乐意讨论:)
量子纠缠的秘密
爱因斯坦无法相信的方程式
量子机器学习要不要入门?看看 动手量子机器学习用 Python 。
阿尔伯特·爱因斯坦生动地拒绝了量子纠缠的概念,称之为“超距作用”。

作者弗兰克·齐克特的图片
通俗地说,量子纠缠就是分布式粒子共享一个量子叠加态的能力,准确地说是。
听起来不恐怖吗?也许我们应该更新叠加的概念。
粒子有自旋。向上或向下。旋转的方向直到你测量后才能确定。但是一旦你测量了它,它会瞬间塌缩到任一个自旋方向供你观察。这是单个粒子的叠加。
量子纠缠说两个粒子可以共享一个叠加态。他们的自旋相互关联。一旦你测量了一个粒子的自旋,另一个粒子的状态会立即改变。
听起来不恐怖吗?也许我们应该谈谈音阶。
当我们说这两个粒子是分布的时,它们可以是同一个原子内的直接邻居。他们可以相距几英尺远。但它们也可能相隔数光年。没关系!
当我们说粒子的状态瞬间改变时,我们指的是瞬间。几秒钟后就不行了。不到一秒钟。但是瞬间。
这两个粒子可能相距数光年,然而当我们测量其中一个粒子时,另一个粒子会在精确的时刻改变它的状态。
听起来很诡异,对吧?
“但是我们怎么知道?”
我们还没有用光年以外的粒子测试过这样的设置。但是我们知道基本的数学原理。
早在第一个实验提供证据之前,一群天才就开发出了预测一对纠缠粒子行为的公式。爱因斯坦是其中之一。虽然他理解数学语言的能力无人能及(很少有人能……也许),但他不喜欢这次数学告诉他的东西。
单量子比特叠加
在量子力学中,我们用矢量来描述量子态。表示量子状态向量的一种流行方式是狄拉克符号的“ket”——看起来像|ψ⟩.的构造
量子系统中有两个基本向量,我们可以测量两个值,例如粒子自旋可以向上或向下,或者量子位(量子位)可以是 0 或 1。
对于量子位,这些是:

量子叠加是这两种基态的组合。

值α和β是概率幅度。它们的平方表示测量量子位的概率为0 (α^2)或1 (β^2).)α越大,测得量子位为0的概率越大。β越大,测得量子位为1的概率越大。
因为概率的总和必须是 1,我们可以说它们的总和必须是1。

量子变换矩阵
在量子力学中,我们也使用向量来转换量子位状态。狄拉克符号的“bra”结构(⟨0|)代表一个行向量。当我们将一个列向量与一个行向量相乘时,我们构建了外积。它产生了这样一个矩阵。

所以,我们可以从向量中创建矩阵。例如,我们可以做三个简单的矩阵。
- 单位矩阵

- 非(X)矩阵

- 哈达玛矩阵

转换单个量子位
当我们将一个矩阵乘以一个列向量(我们的量子态)时,结果是另一个列向量,就像这样:

当我们将 I-gate 矩阵与一个向量相乘时,我们得到未改变的向量作为输出。

X 门矩阵翻转了向量的概率幅度。

H 门将一个量子位从基态放入叠加态

两量子比特状态
现在,假设我们有两个量子位。让我们称他们为|a⟩和|b⟩.两个量子位中的每一个都有其概率振幅:

当我们同时观察这两个量子位时,有四种不同的基态组合。这些组合中的每一种都有其概率幅度。这些是两个相应状态的概率振幅的乘积。

这四种状态各自形成一个量子系统。我们可以用一个方程来表示它们。虽然我们可以自由地为这个态选择一个任意的名字,但是我们使用|ab⟩,因为这个态是|a⟩和|b⟩的集体量子态

在这个等式中,|ab⟩是一个任意的名字。最后一项是重新排序的四个组合,其振幅位于开头。但是|a⟩⊗|b⟩是什么意思呢?
术语|a⟩⊗|b⟩是两个向量|a⟩和|b⟩.的张量积
张量积(用符号⊗表示)是计算振幅的数学方法。一般来说,两个向量 v 和 w 的张量积是所有组合的向量。像这样:

对于我们的两个量子比特的系统,它是

事实上,张量积|a⟩⊗|b⟩是|a⟩|b⟩.的显式符号这两个术语意思相同。
我们可以用一个列向量或者状态和振幅的总和来表示一个量子位系统。

量子位状态的这种表示类似于单量子位状态|ψ⟩.的表示唯一的区别是双量子位系统有更多的维度。它有四个基本状态向量,而不是两个。
所有支配单一量子位元的规则,也适用于由两个量子位元组成的系统。它的工作原理相似。因此,所有概率的总和(记住状态的概率是振幅的平方)必须是 1:

不出所料,用两个量子位的系统工作与用一个量子位的系统工作是相似的。唯一的区别是,向量和矩阵的维数更大。
双量子比特变换
假设我们想要将 h 门应用于第一个量子位|a⟩,将 x 门应用于第二个量子位|b⟩,如下图所示。

作者弗兰克·齐克特的图片
如上所述,我们可以通过在向量前添加变换矩阵来表达门的应用,比如 M⋅v.。在我们的具体例子中,我们在每个向量前添加一个矩阵,比如 H|a⟩⊗X|b⟩.此外,张量积是结合的。这意味着我们可以将术语重组如下:

那么,让我们来计算由 H⊗X.表示的矩阵

我们可以看到一个两量子位变换门的矩阵有 4 乘 4 维。它对应于两个量子位的状态向量所具有的四维空间。
除了更多的维度,这里没有什么特别的。我们可以将这个矩阵预先放置在两个量子位的系统中。
手工处理这种大小的矩阵很麻烦。幸运的是,我们有计算机来计算矩阵和张量积。
首先,我们用两个量子位创建QuantumCircuit(第 4 行)。我们对一个量子位应用 X 门,对另一个量子位应用 H 门(第 7-8 行)。
注意:关于矩阵计算,Qiskit 从后向前排列量子位,所以我们需要交换位置。
这一次,我们使用不同的 Qiskit 模拟器作为后端,即UnitarySimulator(第 10 行)。这个模拟器执行电路一次,返回电路本身的最终变换矩阵。请注意,这个模拟器不包含任何测量。
结果就是我们的电路所代表的矩阵。
如果我们只想将 H 门应用于其中一个量子位,而让另一个保持不变,会怎么样?我们将如何计算这样一个两量子位的变换矩阵?
在计算张量积时,我们可以用 I 门作为占位符。例如,如果我们想将 H 门应用于第一个量子位,而让第二个量子位保持不变,我们计算变换矩阵如下:

这些两个量子位的门在单一步骤中转换量子位,但是量子位保持相互独立。结果,我们无意中引入了另一个约束。
当我们再次查看两个量子位态的公式时,更具体地说,在振幅方面,我们可以看到外态振幅(|0⟩|0⟩和|1⟩|1⟩)的乘积等于内态振幅(|0⟩|1⟩和|1⟩|0⟩)的乘积,如下式所示。

这种约束来自于将两个量子位系统创建为两个独立的单量子位的组合。我们甚至研究了这两个量子位,但只是作为独立的量子位。
上面等式中的 H⊗X)|ab⟩项明确显示了我们应用于|ab⟩.的变换这是

纠缠
如果我们以不同的方式构造两个量子比特的系统会怎么样?当我们舍弃四个基态组成(a0,b0,…)的因子,用一般变量代替。对于任意的两个量子位系统,我们可以陈述下面的等式。

我们坚持所有概率之和的归一化必须是 1。

但是我们不坚持认为αβ=γδ。
在上一节中,我们了解了 CNOT 门。只有当我们将控制量子位测量为1时,它才会将 X-gate 应用于控制量子位。

作者弗兰克·齐克特的图片
我们可以通过交换最后两个元素的顺序,从两个量子位的单位矩阵中创建 CNOT 门,就像这样:

CNOT 门接受两个输入,给出两个输出。第一个输入称为控制量子位。第二个输入称为受控量子位。
如果控制量子位处于基态|0⟩或|1⟩.,那么“非门”的结果是非常超前的如果控制量子位是|0⟩,那么什么都不会发生。输出等于输入。如果控制量子位是|1⟩,那么 CNOT-gate 在控制量子位上应用 X-gate(非门)。它翻转了受控量子位的状态。
下图描述了 CNOT 门的真值表。

作者弗兰克·齐克特的图片
当控制量子位处于叠加态时,就变得有趣了。例如,当我们在应用 CNOT 门之前,对第一个量子位应用哈达玛门。

作者弗兰克·齐克特的图片
下面的等式表示我们的两量子位系统的状态。

要计算多门的后续应用,我们需要从后往前乘矩阵。我们从 CNOT 门开始,然后是哈达玛门。与数字乘法不同,矩阵乘法的顺序至关重要。
当我们从后向前阅读术语 CNOT⋅(H⊗I)|00⟩时,我们从初始状态(|00⟩)开始,将哈达玛门应用于第一个量子位,并将 CNOT 门应用于组合的两个量子位系统。
在下一步中,我们用各自的矩阵(我们之前在本节中推导过)代替门,用相应的向量代替初始状态。然后,在最后一步中应用于状态向量之前,我们计算整体转换矩阵。
此外,我们可以将向量重写为加权(振幅)基态的和。我们忽略了|a0⟩|b1⟩和|a1⟩|b0⟩for,它们的振幅为 0。为了清楚起见,我们将不同的基础国家命名为|a0⟩和|b0⟩,而不是简单的|0⟩.

通常,我们同时测量两个量子位。概率幅度告诉我们在这种情况下会发生什么。我们要么得到00要么得到11,各有 1/2 的概率。但是我们也可以测量单个量子位。
在上面的等式中,我们暂时忽略括号内的项。这代表了我们只测量第一量子位|a⟩.的情况我们以 1/2 的概率测量为0,以同样的概率测量为1。一旦我们测量了它,另一个量子位|b⟩就会跳到括号内的状态。因此,如果我们测量|a⟩为0 |b⟩跳转到状态|b0⟩.如果我们把|a⟩比作1,|b⟩会跳到|b1⟩.
当我们测量|a⟩时,|b⟩改变了它的状态。值得注意的是,一旦你衡量|a⟩.,|b⟩并没有崩溃它不会坍缩成 T6 或 T7,而是跳到另一个量子态|0⟩或|1⟩.测量两个纠缠量子位中的一个只会瓦解一个子系统。不可测量的休息跳到一个不纠缠的状态。
跳到|0⟩或塌缩成 T8 之间的区别似乎有点技术性,因为一旦你测量|0⟩,你不可避免地会得到 T9。但是不可测量的量子位元跳到的状态可以是任何量子状态。
让我们稍微编辑一下我们的例子。我们不是让受控量子位保持不变(应用 I 门),而是应用 RY 门。我们在上一节介绍了 RY-gate。RY 门将量子位状态绕 y 轴旋转一个给定的角度。下面的等式显示了它的变换矩阵。

让我们将受控量子位旋转π/3 的角度,得到图中所示的电路。

作者弗兰克·齐克特的图片
和前面一样,我们通过矩阵乘法计算变换矩阵。例如,下面的等式显示了结果向量。

我们可以很容易地看到,最终的状态是纠缠的。所得向量的外部概率幅度都是 sqrt(3/8),它们的乘积是 3/8。内部幅度都是 1/sqrt(8),它们的乘积是 1/8。所以,当然是 1/8≠3/8。
同样,我们把这个量子态写成它的基态的和。

我们想找出公因数 1/sqrt(2)和量子位的状态|a⟩.所以,让我们重写这个等式。

|a0⟩和|a1⟩两个州具有相同的概率幅度 1/sqrt(2)。因此,我们有 50:50 的机会测量量子位|a⟩为0或1。当我们测量|a⟩为0时,量子比特|b⟩就跳到这个状态

那么,我们有一个概率

测量|b⟩为0和一个概率

测量它为1。
但是当我们测量|a⟩为1时,我们在测量|b⟩.时有完全相反的概率那么,我们有 1/4 的概率把|b⟩测量为0,有 3/4 的概率把它测量为1。
当我们单独测量纠缠的量子位时,我们不会把两个量子位都压缩到有限的值。但是当我们测量一个量子位时,另一个会跳到一个未纠缠的量子态。它不限于产生基态。它可以跳到任何有效的量子态。
当我们单独测量纠缠的量子位时,我们所测量的可能是随机的。只有当我们观察这两个测量值时,我们才发现它们按照它们的纠缠态是完全相关的。纠缠量子位持有的信息并不单独存在于任何一个量子位中。一个纠缠的双量子位系统在两个量子位之间的关联中非局部地保存它的信息。
结论

如果这个条件成立,那么两个量子比特——或者说粒子——就纠缠在一起了。它们共享一个量子叠加态。我们不能再用两个独立的州来代表他们的州了。但是他们的状态仅仅是:

一旦我们测量了其中一个粒子,另一个就不可避免地改变了它的状态。这两个粒子可以相距很远。不管有多远。但是,另一个粒子会立即改变它的状态。而且,瞬间就是瞬间的意思。
这与爱因斯坦的局部实在论相矛盾。因此,他拒绝了纠缠粒子是“spukhafte Fernwirkung or Telepathie”的想法。翻译成英语,它是“幽灵般的超距行动或心灵感应”
直到爱因斯坦死后,第一个实验证据才支持了量子纠缠理论。
量子机器学习要不要入门?看看 动手用 Python 学习量子机器 。

在这里免费获得前三章。
成功监控的秘密
获得粒度,但避免噪音

资料来源:莫纳实验室公司
在过去的 3 年里,我一直与团队合作,使用 ML/DL、NLP、RPA 和许多其他技术实施自动化工作流,用于各种业务功能,从欺诈检测、音频转录到卫星图像分类。
在不同的时间点,所有这些团队都意识到,除了自动化带来的好处,他们还增加了额外的风险。他们已经失去了“在球场上的眼睛和耳朵”,这是人类在这个过程中得到的自然监督。现在,如果出了问题,没有人来通知他们,如果有可以改进的地方,可能没有人来考虑和推荐。
换句话说,他们意识到人类不仅执行现在自动化的任务,他们也在那里,至少部分地,监控和 QA 实际的工作流程。
虽然每个业务功能都是不同的,并且使用的每个自动化或人工智能都有其自身无数的复杂性和需要监控和观察的事情,但将所有这些用例联系在一起的一个共同线索是,改进的问题和机会通常出现在口袋中,而不是全面的大范围。
精细跟踪是发现问题和机会的关键
让我们详细阐述一下那些出现问题/机会的地方…
假设你有一个欺诈检测系统。为了让这个系统正常工作,您需要在用户的浏览器上使用从 cookies 中提取的输入数据。
现在,假设 Chrome 浏览器有了新的测试版。在这个版本中,cookies 的存储方式略有不同。这可能会破坏您使用 cookie 数据的欺诈预测。
幸运的是,这种情况只发生在很小一部分流量中,因为这个新版本是测试版,还没有被广泛采用。但随着时间的推移,这个测试版将成为事实上的版本,并可能占你的流量的主要部分。这可能是个问题。
如果您监控这个欺诈检测系统,您会尽早发现这个问题吗?只有当你在一个粒度上进行监控,也就是说,只有当你在浏览器版本级别 l 上自动跟踪你的欺诈预测者的表现
利用新信息的粒度跟踪可能是一个强大的偏差检测器
现在,假设你有一个机器学习模型,可以检测对话中所说的语言(即音频文件)。
您训练了该模型的一个变体来检测法语,利用了法语对话的数据集。你不知道的是,在训练集中有一个偏见。法国的一个特定地区,口音特别,没有得到很好的代表。
这个模型是生产级的,在生产中,新的输入(用于推理)包括地理信息。你可以知道新的对话来自哪个地区。
因此,只有在您利用新的可用维度来自动跟踪每个区域中的相关 KPI(例如,模型的输出置信度)时,才能发现训练集中的偏差。如果您已经实现了这种级别的监控,您可以得到关于表现不佳区域的警告,并将其与有偏差的数据集联系起来。
粒度挑战—噪音
现在,假设您已经完成了工作,并为您的系统实现了粒度监控。如果有任何数据段表现不佳或异常行为,您会立即收到警报。这本身并不是一件容易的事情,但是现在的问题是你会收到太多的警告,并且不知道如何处理它们。
所有这些噪音的原因是数据中的一个异常可能以多种方式出现。换句话说,许多明显的异常可能与一个根本问题(罪魁祸首)相关。
为了解释,让我们以上一段讨论的法语区偏见为例。
通过细致的监控,您可能会遇到 5 个不同的客户,他们的数据来自这个地区。因为您现在会收到任何表现不佳的客户的提醒,所以您会收到 5 个额外的提醒。
但只要看看这个地区,就能很好地描述所有这些客户的真正问题。为了避免收到 6 次警报并因此产生警报疲劳,您必须有某种机制来了解所有这些“特定于客户”的问题实际上是一个区域内的问题,应该只收到一次警报。
总结
根据我的经验,我们行业的现状如下:
所有垂直业务领域的人工智能或自动化团队要么工作流和流程受到严重监控,要么他们试图在内部建立监控,但被大量噪音淹没。
在前一种情况下,我还包括购买和部署了市场上大多数现有监控解决方案的团队,因为这些解决方案仅提供基本的智能,查看所有数据的功能和输出,只有在为时已晚的情况下才改变您的“漂移”。
正如我们在上面的示例中所看到的,真正的问题会发生,并且必须在数据的特定子群体中捕获,当整体发生变化时发出警报并不能防止损害您的业务 KPI 或帮助您随着时间的推移而改进。
那么,你如何系统地在亚人群中搜索问题,而不被噪音淹没呢?如何从数据/指标中发现的许多异常中找出真正的罪魁祸首?这是一个可以解决的巨大挑战,但这是另一篇更深入的文章的主题。
目前,我的两点意见是,应该认真对待粒度跟踪和智能降噪,这两者都应该是您的监控策略中不可或缺的元素。
机盖又开始变热了
行业笔记
三行代码如何改善蓬勃发展的商业模式

2021 年可能成为 10 分钟送达服务之年。当我骑自行车穿越我的家乡时,我看到许多像 Getir、Gorillas、Zapp 和 Flink 这样的新公司的骑手正在奔向一个客户。这个概念很简单:你在一个应用程序上订购食品后,商品会在黑暗商店被收集,并由骑手送货上门。这一切都发生在(大约)10 分钟内!
虽然很多人,大多数是年轻人,经常使用这项服务,但这个市场也有一些不利因素。竞争激烈,利润微薄。此外,还有一些关于骑车人在穿越交通时的安全性的争论。在我看来,后者没有必要。因此,我想谈谈暗店,尤其是它们的位置。
设置封面
在这么短的时间内完成大部分订单的诀窍不是骑自行车。相反,将你的商店放置在城市的最佳位置会有更好的效果。如果我负责来自大猩猩的数据科学团队,我会问自己以下两个问题:
- 为了在 10 分钟内到达阿姆斯特丹的所有邮政编码,我需要开多少家商店?
- 我应该在哪里打开它们??
在运筹学中,这被称为集合覆盖问题。本文讨论的问题版本是 NP-hard ,这是对问题复杂性的一种度量。
绝非微不足道
or 问题有不同的复杂程度,包括 P、NP、NP 完全和 NP 困难。NP 类包含了所有存在算法的问题,给定一个建议的解决方案,该算法可以检查该解决方案是否正确。P 是所有能在多项式时间内解决的 NP 问题的集合。NP-CompleteNP 中那些至少和 NP 中其他任何问题一样难的问题。对于 NP-Hard 问题,其解的正确性无法在多项式时间内验证。
到目前为止,假设认为 P ≠ NP 。然而,如果你能证明它(或者相反),你就能赢得由克莱数学研究所提出的 100 万美元的千年奖问题中的一个。在多项式时间内解决这样一个问题,就像集合覆盖一样,将会对(数学)世界产生巨大的影响。许多聪明的人已经试图用一个证明来回答这个问题,但是至今没有一个人成功。因此,可以肯定地说,解决一个 NP-Hard 问题,如 Set Cover 是而不是微不足道的。
几种方法
要找到集合覆盖的(次)最优解,有许多条通往罗马的道路。如果你的问题实例是实质性的,你可能会选择启发式。这种方法的好处是速度快。然而,应该在质量上进行权衡,因为在大多数情况下,它不会给出最佳结果。一个例子是贪婪算法,它在搜索过程的每个阶段选择局部最优。顾名思义,这个选项并不复杂,但是运行速度相当快。大多数公司在日常运营中需要集合覆盖问题的结果,因此选择启发式方法。
另一方面,小问题实例可以在合理的时间内准确地得到解决。因此,不需要在几小时(或几天)内获得这些结果的企业更喜欢这种方法,因为它提供了最佳解决方案。建模这种问题的一种常见方法是整数线性规划 (ILP)。在下面的段落中,我将给你一个最简单形式的集合覆盖的 ILP 公式。目前,我认为试探法超出了本文的范围,因此不会详细讨论它们。
你可以在这篇文章的末尾找到更多关于如何制定一个 ILP 的信息。
数学公式
所以,我们想找到在一个城市中最少要开的家店,以及它们对应的家店。为了简单起见,我们用邮政编码来划分城市。骑自行车 10 分钟以内至少有一家商店可以到达每个邮政编码。而且,每个邮编最多只能开一家店。当然,您可以通过用街道替换邮政编码来使模型更细粒度。然而,这会给模型更多的选择,从而使问题变得更加复杂。
用数学术语来说,你可以把这个问题公式化如下:

集封面的数学符号,来源: R. Roberti 来自 VU 阿姆斯特丹。
C 表示邮政编码的集合。aᵢⱼ是一个二进制参数,如果从邮政编码j∈c 骑车 10 分钟内可到达邮政编码It8】∈c,则等于 1,否则等于 0。二进制决策变量 xⱼ如果在邮政编码 j ∈ C 的地区开店,则等于 1,否则等于 0。模型中的每一行解释如下:
- (1a)模型的目标是最小化覆盖所有邮政编码的商店数量。因此,决策变量在 C 上求和。
- (1b)每个邮政编码 i ∈ C 应在至少一家商店骑自行车 10 分钟内到达。
- (1c)完整性约束,其指示邮政编码可以具有开放商店(1)或者不具有(0)。
决策变量的结果值给了我们两个答案:
- 应开店的最少数量。这可以通过对所有决策变量求和来计算。
- 哪个邮政编码应该有商店?如果 xⱼequals 1 对于某个邮政编码jt36】∈c,模型推荐在 j 开店。对应的决策变量等于 0 的所有邮政编码都没有商店。
限制
像许多其他数学模型一样,这个相对简单的模型中没有考虑到一些实际问题。例如,我们假设每个邮政编码都适合开店,然而现实生活中可能并非如此。还有,你如何测量两个邮政编码之间的距离?你取两个中心之间的距离还是最大距离?有很多选择。最后,你如何确定 10 分钟自行车范围?毕竟,骑车人在郊区骑车可能比在市中心骑得快。你应该如何在模型中实现高峰时间或交通堵塞?这些问题不容易在我们的 ILP 中实现。
更聪明地工作,而不是更努力
我想说的是,对于这些大的创业公司来说,一个大的战略问题可以(部分地)归结为一个经典的数学问题:集合覆盖。作为一个重要且众所周知的问题,研究人员提出了多种解决方案,其中之一是 ILP 。
在其最简单的形式中,器械包封面可以用三行来建模。然而,这种提法没有考虑到许多实际问题。结合这个问题是 NP-Hard 的事实,这使得从理论上处理这个问题变得更加复杂。尽管如此,我发现它仍然值得与你分享。
所以,下次你看到一个骑手在城市中狂奔,你不应该责怪他/她,而是在一个尴尬的位置开店的运营经理。我的建议?他们应该工作(一点点)更聪明,而不是更努力。
我希望你喜欢阅读这篇文章,它给了你一些关于数学优化的新见解。如果您想了解更多关于 ILPs 的知识,您可以查看下面这篇关于自己制定 ILPs 的文章:
另外,别忘了关注我,获取更多关于这个话题的文章。下次见!
地球上最性感的工作?是的,请!
我十年来对成为数据科学家的痴迷

凯文·Ku 在 Unsplash 上的照片
数据…科学家…嗯嗯…话语像融化的巧克力一样从我的口中流畅地滴落。它们漂浮在空中,就像书呆子版的香奈儿香水。
在过去的十年里,数据科学在时代潮流中爆发。所以它也进入了我的生活。
我第一次听说这个概念是在 2012 年,当时我正在攻读工程学博士学位。我参加了一个技术会议,主题演讲是“在工业和研究中使用大数据的令人兴奋的可能性”然后,我注意到听起来很科幻的术语在科学界到处出现,像人工智能和机器学习。它们取代了像统计学和计量经济学这样的词汇,它们无聊、过时的表亲让我一想到它们就感到沉重。
获得博士学位几年后,我认为自己不适合做学术界的研究人员。所以博士毕业后,我想退出。但我仍然想挑战我在大学时得到的大脑。所以我把目光投向了 21 世纪最性感的工作:数据科学家。
太完美了。我可以继续寻找数字背后的真相,而不用背负学术界的吸血负担。我可以在乒乓球比赛间隙在一家初创公司玩我一直听到的那些有趣的算法。最天才的事情是,即使你不是一个真正的科学家,你仍然可以被称为一个——一个真正令人印象深刻的品牌壮举。
由于这在当时是一个新的职位,还没有多少人有这方面的学位。公司愿意接受其他背景的人,例如我!我开始努力把自己从工程师重塑成这个星球上最好的职业。关于如何成为其中一员的网上资料激增。所以在我博士旁边,我跟着 MOOCs,学习与我的研究无关的编程语言。为了和现场的人见面,我拼了命地联网。我参加了讲座、聚会和黑客马拉松。我遇到的大多数人都是试图转行的迷失者。每当我们发现一个真正的工作数据科学家,我们会像卢浮宫的游客一样聚集在他们周围,试图一睹蒙娜丽莎的风采。
当我完成博士学位的时候,我相信我有能力获得那个甜美的数据科学家职位。
它并没有立即发生。几次申请失败后,我最终在一家跨国科技公司做了一名微不足道的工程师。但一年后,一家科技初创公司的公开申请让我得到了另一份工作。
我没有工作描述,只有一个我想做什么的模糊想法。尽管从未处理过实际的客户数据或初创公司的需求,但我向他们承诺,我将释放他们数据储存背后的力量。这些数据已经在他们的数据库中积累了多年,这些数据从来没有人看过。会有多难呢?
"我应该在你的合同上写上什么职称?"我未来的老板问我。
我的眼睛闪闪发光。
“数据科学家。”
开始在初创公司工作后的几周可能是我职业生涯中最自豪的时刻。不是因为我为社会或公司做了有价值的事情。不,是因为每次有人问我是做什么的,我都会用那两个神奇的词来回答。有那么一秒钟,他们的目光会在敬畏和嫉妒的交织中停顿下来。招聘人员在 LinkedIn 上给我发了大量信息,邀请这位“数据大师”加入他们“令人兴奋的数据驱动型公司”,但我很快拒绝了。我感觉自己像个摇滚明星,没有性和毒品的困扰。
但在创业初期,事情很快就开始分崩离析。我帮助团队深入了解我们的产品和客户,我会寻找任何借口来使用我学到的酷工具——至少是一点线性回归或 k 近邻。但我的同事一直告诉我,他们最需要的只是看到数据。他们想要条形图和表格。他们想要基本的仪表板和报告来帮助他们自己做出决策。如果我冒险进行更深入的分析或机器学习模型,他们会说,“这看起来太棒了!但这怎么能帮助我呢?”通常,我都不知道。
有一天,管理层终于让我建一个模型。警告:为了让其他员工也能使用它,我必须实现它——我很惭愧,甚至不想写这些词——Excel 电子表格。
我在做的不是数据科学家的工作,我心想。如果他们需要的只是高中水平的数学和 Excel,为什么还要雇佣一个有博士学位的人呢?
每一篇吹嘘网飞或 Spotify 使用的机器学习模型的新文章都是我心中的另一把匕首。我觉得被骗了。我的雇主欠我一个挑战。所以,当你对自己的工作稍有不满意,LinkedIn 的请求如雪崩般涌来时,我做了你该做的事情。我找到了一份新工作。
这一次,我选择了一家以数据驱动著称的科技公司。拥有一个由数百名同事组成的分析社区,我肯定会找到值得我去面对的挑战。然而,我搞砸了数据科学家职位的面试,最终得到了一份不同职位的邀请。我打开合同,看到上面写着:报告分析师。
恶。这些话像石头一样笨拙地从我嘴里说出——最普通、最迟钝的石头。
我最不想要的就是一份有“报道”这个词的工作。这是任何人的工作中最不令人兴奋的部分。没有关于侦探写报告的电影。最重要的是,这是一个初级职位——对我的博士学位和 2.4 年工作经验的侮辱。但这是美国最大的科技公司,招聘人员向我保证,在公司内部获得我真正想要的职位是小菜一碟。所以我放下自尊,接受了这份工作,并向自己保证不会太久。
在我进入新公司的第一周,我与向我展示诀窍的分析师同事分享了我的抱负。
“我也在努力成为一名数据科学家,”她说。"我最近攻读了这方面的硕士学位,以增强我的技能."
哦,多么有趣的巧合,我想。
我和另一位分析师谈过,他们也打算争取这个职位。然后又是一个。还有一个。我遇到了申请多年的同事。
我以为我很特别,真他妈的特别。我以为我是公司里唯一一个有头脑、有动力去实现梦想工作的分析师。但是我遇到的每一个同事都做着同样的梦。这不可能是巧合。我开始怀疑这是不是我的路,或者我缺乏独立思考的能力。
尽管如此,我还是需要试一试。我得到了一位导师来帮助我实现目标,他是公司里一位经验丰富的数据科学家。我会完全按照她说的去做:学习所有基本的统计学原理,分析 A/B 测试,涉足一些机器学习。然后,我会让面试中的每个人都眼花缭乱。很快,记者们就会写关于我的惊人模型和见解的文章。
但是,在第一次和我的导师见面时,我得到了一个现实的检验。
“我拿工资不是为了对某人的问题给出最准确或最令人印象深刻的答案,”她说。“我拿工资是为了想出一个足够好的答案。通常,我可以用几行简单的 SQL 代码做到这一点。”
"回归、随机森林、自然语言处理、深度学习呢?"我问。"所有的算法公司都在媒体上大肆宣扬?"
“如果我把其中的一个强加给每个问题,那我就是在浪费每个人的时间。”
我张开嘴想反驳,但我的大脑却什么也没想出来。她说得很有道理。
我在脑海中建造了这座巨大的宫殿来纪念数据科学。现在它的墙已经摇摇欲坠。这完全是一个童话,由所有那些有抱负的数据科学家的集体想象力推动。他们期望这是他们完美工作中想要的一切。但它并不完美。没有工作是。我在追逐一个空虚的梦想。
我回到我的办公桌,抬头看着我的笔记本电脑屏幕,有了新的认识。
如果我想在现实世界中帮助真实的人,我需要停止关心我的头衔和公司欠我什么,开始关心我如何帮助他们。如果我需要使用 Excel,那就这样吧。
水滴的形状
为什么有些水滴是球形的,而另一些不是

何塞·斯佩金斯在 Unsplash 上拍摄的照片
厨房里滴水的水龙头是一件看起来很普通的日常用品。一股水流从水龙头中流出,形成一滴水滴。有时,线足够大,以至于它分裂成一系列的液滴。从水的喷射/线形成水滴在物理学上非常丰富,绝对美丽(我鼓励你看看类似现象的高速镜头这里)。这些液滴有不同的大小和形状。它们不总是球形的(图 1)。
雨滴形成云朵。当它们落下时,它们聚结并形成更大的液滴。这些较大的水滴然后分裂成较小的水滴(雨滴的解剖)。根据 Villermaux 和 Bossa 的说法,雨滴在开始分解之前会变形/变平,就像在这部美丽的电影中看到的那样。仔细观察表明,在分裂事件之后,较小的子液滴几乎是球形的,而较大的子液滴则振荡/变形。很可能这些较大的子液滴不会经历进一步的分裂,而是保持振荡/变形。他们甚至可以实现看起来像小圆面包的平衡形状,类似于 Alistair McClymont 的这幅美丽的艺术品中的水滴形状(其中水滴使用垂直风洞悬浮,它具有看起来像小圆面包的平衡形状)。
因此,一些液滴是球形的,而另一些不是。具有非球形形状的液滴与我们在高中物理中学到的形成对比:由于表面张力的作用,液滴呈现球形,因为它试图在给定体积下最小化液滴的表面积。因此,除了表面张力之外,还必须有其他力来对抗表面张力对液滴形状的稳定影响。在这篇文章中,我们将研究自然现象和实际应用中作用于液滴的力,并使用数量级分析来确定主导力。知道了主导力,我们就能预测液滴的命运。
图 1 显示了一个滴水的水龙头,其中水线分裂成不同大小和形状的水滴(较小的水滴几乎是球形的,而较大的水滴看起来是变形的)。这些液滴在重力作用下下落时会受到什么力的作用?请先猜猜,然后再继续。

图一。滴水(来源:https://myopticaltrek.wordpress.com/)。
三个主要的力作用在这些液滴上:(a)重力,(b)由于空气和液滴之间的相对速度而产生的空气动力,以及(c)表面张力。为了了解这些力如何决定液滴的形状[甚至是它的最终命运(分裂/解体)],我们来做一个简单的思想实验。
思维实验
考虑两个直径分别为 1 微米和 4 毫米的水滴,假设它们在重力作用下穿过静止的空气下落 1 米的高度。当它们下落时,表面张力试图使它们保持球形,而空气动力和重力试图使它们变形。换句话说,表面张力的稳定作用被空气动力和重力的干扰作用所抵消。让我们通过简单的数量级分析来看看这些力之间的竞争是如何决定液滴形状的。
数量级分析—毛细管压力
对于球形液滴,拉普拉斯定律表明,

其中 pᵢₙ 和 pₒᵤₜ 为液滴内外的压力值, σ 为液体的表面张力, R 为液滴半径。表面张力产生附加压力δp,也称为毛细管压力和δp =**pᵢₙ—pₒᵤₜ。毛细压力有助于液滴获得或保持球形。对于 1 微米和 4 毫米的水滴,毛细管压力分别为10⁵pa 和 10 Pa 量级(对于水, σ= 0.072 N/m)。
毛细管压力对液滴形状的稳定影响受到空气动力和静水压的干扰影响,空气动力和静水压分别由空气动力和重力引起。为了确定毛细管压力的稳定影响与空气动力和流体静压力的干扰影响相比有多强,我们可以计算它们的数量级,并与毛细管压力的数量级进行比较。
数量级分析——气动压力
当液滴穿过静止的空气下落时,在其底部形成一个驻点。驻点处的气动压力( p₀ )为 p₀≈ρₐU /2 ,其中 ρₐ 为空气密度, U 为液滴与周围空气的相对速度(驻点处的气动压力表达式可通过写出终止于液滴驻点的流线的伯努利方程获得)。由于在这种情况下空气是静止的(思想实验), U 代表液滴的速度。我们可以有把握地假设,试图使液滴变形的气动压力的数量级为p₀【5】。**
p₀ 的顺序取决于 ρₐ 和 U. ρₐ 的顺序~1 kg/m .当思想实验的液滴从 1 米的高度下落时,它们在经过 1 米的距离后达到最大速度( Uₘₐₓ )使用落体的方程( s = 0.5gt 和 v = gt , 其中 s 是下落物体在时间 t 内移动的距离, g 是重力加速度, v 是时间 t 后下落物体的瞬时速度),我们可以计算出 Uₘₐₓ ,对于两个液滴来说都是 10 m/s 的数量级(对于 1 的高度,空气阻力不会显著降低 Uₘₐₓ 因此, p₀ 的数量级为 10 Pa。现在,我们有了毛细压力和空气动力压力的数量级。让我们对静水压力做一个类似的分析。
数量级分析——静水压力
考虑在重力作用下下落的液滴内部的狭窄中心圆柱体 AB,如图 2 所示。静水压力( pₕ ),因为重力( g ),被给定为 pₕ = ρ ₗ gh,其中 ρ ₗ是液体密度, h ,在这种情况下,是液滴直径。

图二。水滴中圆柱体 AB 的示意图。
A 处的静水压力高于 B 处的静水压力。对于多个位置,如 A(液滴底侧)和 B(液滴顶侧),也可以做出类似的陈述。这会使液滴变形(除非静水压力被毛细管压力补偿)。对于 1 微米和 4 毫米的水滴, pₕ 分别为10⁻帕和 10 Pa 的数量级。
评论
让我们比较毛细管压力、空气动力压力和流体静压力的数量级,以确定它们中的哪一个对思想实验中水滴的形状有主要影响。表 1 列出了这些压力的顺序。

表 1。思想实验中水滴的毛细管压力、空气动力压力和流体静压力的顺序。
1 微米液滴的毛细管压力比相应的空气动力学压力高四个数量级。相比之下,4 mm 液滴的毛细管压力仅比相应的空气动力学压力高一个数量级。这意味着,当考虑由空气动力压力引起的液滴变形时,与较大液滴相比,毛细管压力对较小液滴的稳定影响更显著。因此,对于相同的外部空气动力压力,较大的液滴可能比较小的液滴变形更多。如果空气动力学压力明显大于毛细管压力(实际应用中通常是这种情况),液滴就会变形并分裂成大量的产品液滴(关于液滴分裂的更多信息,你可以阅读我早先的帖子)。
让我们比较一下毛细压力和流体静压力的数量级。1 微米液滴的毛细压力比相应的流体静压力高 7 个数量级,而 4 毫米液滴的毛细压力仅比相应的流体静压力高一个数量级。
总之,与空气动力学和流体静力学压力的干扰影响相比,1 微米液滴的毛细管压力的稳定影响明显高于 4 毫米液滴的毛细管压力的稳定影响。因此,与 4 毫米液滴相比,1 微米液滴在其下落过程中更可能保持球形。
我们再来回顾一下上面讨论的雨滴分手的例子。较大的子液滴由于空气动力学和流体静力学压力的组合干扰影响而振荡/变形。然而,较小的子液滴倾向于保持球形,因为与空气动力学和流体静力学压力相比,毛细管压力明显更强。
注:读者可以跳过下一节(有趣的点)直接下结论,而不会失去连贯性。不过,顾名思义,下一节就有意思了 🙂。
有趣的观点
(a)静水压力
有趣的是,静水压力的数量级仅取决于地球表面液体的液滴直径。这就引出了一些有趣的问题:(a)是否存在一个临界尺寸,超过这个尺寸,液滴就会变得不稳定并可能破裂,(b)如果(a)的答案是肯定的,我们能否计算出水滴的这个尺寸?
对于水滴在地球表面变得不稳定, ρₗgh ≫ σ/R ,其中 h~R 。从这个等式中,我们得到水滴的临界半径(也称为毛细管长度),

超过该值它就不稳定(毛细管压力可能不足以稳定液滴)。因此,我们没有看到直径大于约 6 毫米的稳定水滴。我们还可以指出,如果我们只考虑重力的干扰效应,来自思想实验的 4 毫米水滴是稳定的,并可能在其旅程中保持球形。
(思考:月球上水滴的 R_threshold 是多少?)
空气动力压力
在许多实际应用中,空气动力压力对液滴变形和破碎的干扰作用明显强于流体静压力。让我们看一个柴油喷雾的例子。
柴油喷雾中液滴的典型速度范围为 300-600 米/秒。取 U =500 米/秒,空气动力压力约为 10⁵帕。表 2 显示了不同尺寸柴油液滴的毛细管压力、空气动力压力和静水压的顺序。

表二。不同尺寸柴油液滴的毛细管压力、空气动力压力和流体静压力的数量级。
从表 2 可以看出,与空气动力压力相比,静水压力小得可以忽略不计。因此,它在液滴变形(和破碎)中的作用可以忽略。对于 1 微米的柴油液滴,空气动力学压力是毛细管压力的数量级。这可能导致液滴变形/振动。对于 1 毫米和 4 毫米的柴油液滴,空气动力学压力足以使液滴变形和破裂。因此,在液滴经受高速的实际应用中,静水压力的影响通常被忽略。
注:在上述分析中,未考虑粘度的影响。粘性阻止液滴变形。对于类似水的液体,与其他因素相比,粘度的影响可以忽略不计。但是,对于高粘度液体(甘油、蜂蜜等。),粘性效应不可忽略。
结论
- 液滴越大,毛细管压力的稳定作用越弱,而静水压力的破坏作用越强。
- 毛细管压力、空气动力和流体静压力之间的竞争决定了液滴的命运(假设粘性效应可以忽略不计,这通常是类水液体的情况)。如果空气动力压力或流体静压力或两者都显著高于毛细管压力,则液滴变形并破裂。如果这些压力在同一数量级,液滴可能会变形/振动。
- 在许多实际应用中,毛细管压力和空气动力压力之间的竞争决定了液滴的命运。静水压力的作用小到可以忽略不计。
- 在对问题进行更深入的分析之前,数量级分析可能是一个很好的起点。Adrien Bejan 在他的书《对流传热》中正确地推荐了数量级分析,称之为“获取单位脑力劳动最多信息的首要方法”。
感谢阅读!建设性的批评和反馈总是受欢迎的!
参考资料:
- A.《物理学的奇迹》,世界科学。
- 数量级,维基百科。
- A.Molea,P. Visuian,I. Barabás,R. C .苏休和 N. V. Burnete,柴油-乙醇混合物的关键燃料性质和发动机性能,使用四氢呋喃作为表面活性剂添加剂 (2017),IOP 会议系列:材料科学与工程。
- 阿德里安·贝扬,对流传热,威利。
- 长度 Opfer,I. V. Roisman 和 C. Tropea,液滴的空气动力学碎裂:液体袋的动力学,ICLASS,2012 年。
谢谢 T. G. Vignesh 对这篇文章的校对。
*https://sjosh90.medium.com/membership https://sjosh90.medium.com/subscribe *
ML 模型的 Shapley 值
值得信赖的人工智能
什么是 Shapley 值,为什么它对许多可解释技术至关重要?
本文由大卫·黑川合著。
在我们的上一篇文章中,我们提出了一个案例,说明为什么可解释性是确保你的 AI/ML 模型质量的关键因素。我们还介绍了解释方法的分类,以帮助比较和对比解释模型的不同技术。
在这篇文章中,我们将深入探讨沙普利值的概念。许多流行的解释技术——比如 QII 和SHAP——都在他们的计算中使用了沙普利值。那么什么是 Shapley 值,为什么它是这么多可解释技术的核心?
沙普利价值观回答了哪些问题?
在高层次上,Shapley 值方法试图解释为什么 ML 模型报告它对输入所做的输出。例如,对于识别申请人是否应该获得抵押贷款的模型,我们可能想知道为什么退休人员 Jane 被拒绝贷款,或者为什么模型认为她的违约概率为 70% —这是查询定义。
在这些问题中隐含的是,为什么 Jane 被拒绝贷款,而其他人没有,或者为什么她被认为有 70%的违约机会,而平均申请人从模型中仅获得 20%的机会。将这个问题与 Jane 和其他人的不同联系起来有助于回答更微妙的问题。例如,当与所有被接受的申请人进行比较时,我们会发现她被拒绝的一般原因——比如她需要大幅增加收入。但通过将她与所有被录取的退休申请人进行比较,她可能会发现她高于平均水平的信用卡债务是她预测的高违约率的关键原因。这样,Shapley 值就与比较组联系在一起了。
因此,Shapley 值方法采用 Jane 模型的输出以及一些申请人的比较组,并确定 Jane 和比较组之间的差异有多少是由每个特征造成的。例如,她 70%的预计违约率和被接受的退休申请人 10%的预计违约率,有 60%的差异需要解释。Shapley 可能会将 40%分配给她的信用卡债务,15%分配给她的低净值,5%分配给她退休后的低收入——测量每个特征对总得分差异的平均边际贡献。稍后,我们将通过精确的 Shapley 值公式使这一点更加具体。

图片作者。
什么是沙普利价值观?
Shapley 值是从合作博弈论文献中借用的一个概念,可以追溯到 20 世纪 50 年代。在它们最初的形式中,Shapley 值用于公平地将玩家的贡献归因于游戏的最终结果。假设我们有一个合作游戏,一组玩家每个人都合作创造一些价值。如果我们可以衡量游戏的总收益,Shapley 值捕捉每个玩家对最终结果的边际贡献。例如,如果朋友们共用一辆出租车去不同的地点,则总账单可以基于 Shapley 值来分割。

图片作者。
如果我们认为我们的机器学习模型是一个游戏,其中各个特征“合作”产生一个输出,这是一个模型预测,那么我们可以将预测归因于每个输入特征。正如我们将在后面探讨的,Shapley 值在公理上是唯一的,因为它们满足测量每个特征对最终结果的贡献的期望属性。
在高层次上,Shapley 值是通过仔细扰动输入要素并查看输入要素的变化如何与最终模型预测相对应来计算的。然后计算给定特征的 Shapley 值,作为对整体模型分数的平均边际贡献。Shapley 值通常是相对于作为解释的“基线”的比较或背景组来计算的,这消除了问题“与所有批准的申请人相比,Jane 为什么被拒绝贷款?”来自“与所有获批的女性相比,为什么简被拒绝贷款?”

图片作者。单个特征如何影响模型得分的示例。
沙普利值有什么了不起的?
Shapley 值的特殊之处在于,它是满足一组强大公理的唯一值,这些公理可能是您在归因策略中所期望的。在本帖中,我们不会讨论这个唯一性的证明,但是让我们强调其中的一些公理:
- 完备性/效率:每个玩家(特征)的贡献总和必须加起来等于总收益(模型得分)减去比较组的平均收益(模型得分)。
- 假人:对游戏没有贡献的玩家不能获得任何回报。在 ML 模型的情况下,模型不使用的输入特征必须被分配为零的贡献。
- 对称:对称玩家(特征)对最终收益(模型分数)的贡献相等。
- 单调性:如果一个玩家(特征)A 比一个玩家(特征)B 对收益(模型得分)的贡献持续更大,那么玩家(特征)A 的 Shapley 值必须反映这一点,并且高于玩家(特征)B 的 Shapley 值。
- 线性:让我们假设游戏收益(模型分数)是基于两个中间值之和确定的,每个中间值都来自输入特征。然后,分配给每个玩家(特征)的贡献必须是玩家(特征)对中间值的贡献之和。
Shapley 值在 ML 模型中是如何使用的?
我们提到过,Shapley 值计算的是功能𝒙对模型分数的平均边际贡献。这在实践中是如何计算的?
让我们首先尝试为一个合作博弈制定这个。假设我们有一个 n 玩家游戏,玩家有 1,2,…,n 和一些价值函数 v ,它接受玩家的子集,如果只有这些玩家参与,则返回游戏的实值收益。那么形式上,玩家 i 的贡献φ定义为

图片作者。Shapley 值的数学公式。
其中 S 是玩家的联盟或子集。简单地说,Shapley 值是通过计算当参与人 i 被包括在排除 i 的所有联盟中时,参与人I提供的加权平均收益来计算的。
在最简单的 ML 设置中,这个合作博弈的参与者由 ML 模型的特征代替,收益由模型输出本身代替。让我们回到之前的抵押贷款例子,让这一点更清楚。假设我们有一个模型,它被训练来预测个人拖欠贷款的可能性。Jane 有 70%的违约几率,我们想知道她的收入(这恰好是特写 i )在决定模特的决策时有多重要。我们首先会选择一个随机的特征子集 S 提供给模型。例如,SCO 可以包括 Jane 的信用卡债务和净资产。然后,我们将测量边际贡献v(S ∨{ I })-v(S),这告诉我们,相对于仅使用信用卡债务和净值作为特征的模型的输出,将 Jane 的收入包括到模型中(特征 i )会改变模型的输出多少。换句话说,边际贡献捕获了收入对模型输出的增量贡献,同时考虑了它与信用卡债务和净值特征的相互作用。Shapley 值是所有这些边际贡献在不同的 S 上的加权平均值。
对于最大似然模型,在确定预测时不可能仅仅“排除”一个特征。因此,ML 上下文中 Shapley 值的公式通过对特征值的经验分布进行采样并对多个样本进行平均来模拟“被排除”的特征。根据采样策略的不同,这可能会很棘手,而且计算成本很高,这就是为什么大多数计算 ML 模型 Shapley 值的真实方法都是产生真实 Shapley 值的估计值。这些算法之间的核心差异,如 QII 和 SHAP,在于各自选择干预和干扰特征的细微方式。
计算 Shapley 值只需要黑盒访问模型作为预测器,只要您知道其输入和输出,就可以在不了解模型内部机制的情况下计算 Shapley 值。这使得它成为一种与模型无关的技术,也有助于跨不同模型类型直接比较输入要素的 Shapley 值。

图片作者。
此外,因为 Shapley 值可以相对于单个数据点计算,所以它们提供了局部解释的粒度,同时允许外推。例如,通过分析跨多个数据点的哪些要素具有较高的 Shapley 值,可以深入了解模型的全局推理。
Shapley 值的局限性
尽管 Shapley 值的动机是公理化的,但是它们在 ML 环境中的使用还是有一些明显的局限性。
计算 Shapley 值需要选择特征的组合或子集,这在特征的数量上呈指数级增长。这通过使用近似技术和利用已知的特定模型结构(例如在树或线性模型中)来减轻,但是通常 Shapley 值计算难以精确计算。
一个更概念性的问题是,Shapley 值可能严重依赖于模型如何作用于不切实际的输入。例如,一个将纬度和经度作为独立要素的房价模型可以在湖中央的房地产上进行查询。有一些定义公式试图弥补这一点,但是它们受到其他问题的困扰——通常需要无法获得的大量数据。这种“不切实际的输入”问题甚至已经被证明可以被攻击者利用,因为可以构建与原始模型几乎相同地执行的模型,但是其 Shapley 值几乎是随机的。
沙普利价值观:一个强有力的解释工具
Shapley 值借用了合作博弈论的见解,并提供了一种接近机器学习解释的公理化方法。这是为数不多的解释技术之一,它是由一个好的解释看起来像什么的直觉概念支持的,它允许局部和全局推理,并且它是模型类型不可知的。结果,许多流行的解释技术利用 Shapley 值来解释 ML 模型。在这篇博文中,我们概述了 Shapley 值背后的理论直觉,以及为什么它对 ML 解释能力如此强大。
一个道德感知器的短篇故事
移除机器并保持学习



机器和大脑之间的思考者,归功于 @garett3 , @craftedbygc ,@ 大卫克洛德
出生
你见过感知器存在的证明吗?这是一个很好的证明,只要环境不太吵,一个有道德的学习者就能成功。这里可以看。
感知器是以我们大脑的基本构成——神经元——命名的。这个简单的算法有一个任务:学习如何将线性可分的数据分成两类。
当我意识到感知机的潜力时,我感到非常渺小和自命不凡,因为就在那一刻,我明白了最简单的机器已经远远超出了人类的平均水平。
一个纯粹的感知器怎么会比智人更有道德?
感知器是二元决策器。给他提供数据,他会很乐意给你他的双重见解。
只有两个班?这个算法太简单了,没法跟我比。

通过Zafeirios Fountas上 Researchgate。
在我们的日常生活中,我们面临平凡而关键的情况,需要做出复杂的选择。当我们面前有一块棉花糖时,我们的本能会尖叫着吃掉面前的糖果,而我们的理性思维会避免看着诱惑的对象。二元选择不是小菜一碟。
感知器可以让我们成为更好的决策者。除了试错步骤,它们还可以提醒我们,一个有知识的算法首先需要成为一个好的学习者。
例行公事
感知器的程序很简单,但是很有趣。感知机从零开始。它接受非常小的随机重量,就像我们出生时一样。然后它不屈服于拖延,开始它的探索,一个无限循环。。从零到英雄,只需要一次“向知识进军”。
讲给我听我忘,教给我听我可能记得,涉及到我和我学——荀子。
感知机直面现实,尽管现实可能很残酷。它看到一些数据,并试图预测标签。惩罚是无情的:当他错了,他错过的数据样本会加到自己身上或从自己身上减去。他在更新自己,在右或左脸颊上打了一个大耳光。
我们可以编写如下的程序:
- 随机初始化其参数
- 步骤 1:随机抽取一个数据样本。
- 第二步:预测一个标签。
- 第三步:如果预测正确:什么都不做。
- 第四步:如果预测错误:吃掉数据样本。
- 第五步:从第一步开始重复。
如果你的数据有两个特征财富和年龄来预测幸福,例如,感知器决策边界是一条线。如果数据有三个特征(钱、读过的书、朋友数量),那么感知机就是一个平面。作者 GIF。
关于吃的部分不是开玩笑的。由于感知器会加上或减去自己犯了错误的所有点,因此它会将其归纳出来。犯错的代价很高,但感知机会跟随它的旅程,这是一次无休止的探索。
我们都知道,对于一台机器来说,一次加法的计算成本低得离谱。更新它的整个架构并变得更加智能需要几毫秒的时间。
那么,为什么人类犯一个错误的成本如此之高呢?
因为我们有意识。
感知器之所以成功,是因为它们学习起来没有尴尬。他们从失败中改进,无耻地重试,直到成功。
它们就是为此而设计和诞生的。

成长,由 markusspiske
意识的缺陷
许多人工智能系统使用过去的知识来解决新问题。这就是所谓的“迁移学习”。拥有比正常人更好的机器、更干净的数据和更多时间的人已经产生了你可以拿来使用的参数。对于不是千兆数据中心所有者的机器学习领域的任何人来说,迁移学习都是黄金。
其实人性还是蛮像的。我们不是从零开始出生的,我们继承基因,历代文明堆积的知识托付给我们。科学、文化、社会总是传递给后代。
我们确实成功地接受了前人的知识。到目前为止,我们和感知机一样好。我们的失败发生在下一步:预测和****更新。人类甚至在尝试之前就觉得可耻。
挑战前的不情愿,压力,完美主义,自卑,害怕被拒绝,这样的例子还可以继续下去。
我们害怕别人对我们的评价,害怕我们的行为与期望不符。在与陌生人、同事或朋友交往的每一个角落,我们都期待着羞辱。
不给预测这一步机会,怎么学?
技能的错觉不仅仅是个体的失常;它深深融入了行业文化。挑战这些基本假设的事实——从而威胁到人们的生活和自尊——根本没有被吸收。头脑不会消化它们——思考,快与慢,(诺贝尔奖)。
感知机——或任何人工智能模型——是没有意识的,不会害怕出错或被拒绝。相反,当我们不顾一切地待在自己的舒适区时,在我们的洞穴里,感知机不顾一切地想要改变。损失功能每天都在提醒他,肩上长期的担子更重,比短期的打我们耳光还重。

一个能区分好决策和坏决策的感知器。图片来自作者。
我给你意识
想象一下我们会给人工智能赋予意识。
"全人工智能的发展可能意味着人类的终结。"斯蒂芬·霍金。
西方普遍担心,当人工智能实现意识时,它会灭绝我们,这被很好地称为“人工智能接管”。就个人而言,我怀疑这种世界末日的情景会发生。我们不应该忘记伴随意识而来的有毒的礼物。意识也给予羞耻以荣誉,害怕受到其他批评。****
当一个人工智能开始嘲笑它的同伴,或者当它们在一个重要的演讲前变得紧张时,它们就已经达到了人性。由于过于聪明,他们将永远拆除他们通往知识的良性路径。
这凸显了一个有趣的悖论:过于人性化会阻止学习过程本身。
当感知机将进化为意识和自我意识时,它将成功地成为人类,而作为学习算法则失败。他会拒绝预测或者拒绝承认自己错了。
他会停下来学习。

走错了路。鸣谢 @visualpatrol
成功的人生
为什么我们会拒绝承认自己的错误,在学习的大门前畏缩不前?我们的智慧巧妙地抹去了我们生活中所有痛苦的片段,所有这些我们需要从意识中面对现实的不愉快的时刻。
如果一个网球运动员拒绝在他的弱点上练习,而是在借口上磨砺他的天赋,你认为他会变成什么样?一个糟糕的网球运动员。
在准备好认识到我们的错误并渴望重新校准我们对世界的看法之前,学习过程不会发生。不止一次,而是让这种学习技能成为一种习惯。
技能的基本测试:持续的成就——思考,快与慢。丹尼尔·卡内曼。
在当前世界中,机器仍然是愚蠢的,所以它们仍然可以学习。

光线、阴影和几何图形。沙漠之旅
结论
人类是骄傲的,太骄傲了。脑子聪明,太聪明了。懒惰的意识避免处理麻烦。但是你是独一无二的,你发现的美德,拥有它们,更新它们,它们将使你不仅优于机器,而且特别和成功。
作为感知器要谦虚。陈述一些假设,创造观点,用你周围的现实来面对它们。全世界都是你的标签。你的头脑就是维基百科,里面全是每个想补充点什么的人的条目。不要忘记你是你的页面的管理员,你可以选择你保留的信息和你拒绝的信息。
寻找美德,寻找知识,如果你想要自由,自由地掌握你的灵魂,成为你命运的船长。
跟着我上 https://twitter.com/ciel_delem 的
信号和噪音
入门
中心极限定理如何使数据科学成为可能

中心极限定理(图片由作者在 matplotlib 中生成)
从前,一家鞋店的老板想知道他应该买多少双每种尺码的鞋。
幸运的是,一位友好的统计学家帮助了他。“那容易!”他说,“我们有一个简单的方程式。”

这里μ是平均鞋号,σ是平均值的标准差。将这些代入你可以计算出每种尺码 x 你应该有多少双鞋,”统计学家解释道。
困惑的鞋子推销员开始问问题。“这是什么东西?”他指着 e 符号问道。
“嗯,这是微积分中一个有用的常数,选择它是为了使函数 e^x 的斜率在所有 x 点都等于 e^x”统计学家回答道。
“那是什么?”售货员指着π符号问道。
“嗯,这是一个几何常数,它将圆的半径和周长联系起来。”统计学家回答道。
"圆形和斜坡与鞋码有什么关系?"售货员问。
他说得有道理。
为什么是统计学?
我以前觉得统计学很无聊。这些公式对我来说就像对卖鞋的人一样有意义,我迫不及待地想回到重要的东西上(显然是物理和微积分)。直到我上了贝叶斯推理和统计力学的课程,我才爱上了这门学科,并最终意识到,尽管它无处不在,但统计学往往教得很差,而且几乎总是得不到重视。
大多数数学领域都有我们称之为基本定理的东西。微积分的基本定理把导数和反导数联系起来,代数的基本定理保证复多项式至少有一个复根。当基本原理被正确理解后,我们会突然把这些公式看作是一个中心思想的逻辑结果,而不是一堆塞进盒子里的工具。
在这里,我将尽力解释统计学的基本原理,希望一些年轻的科学家能比我更早有灵感。
信号和噪音
统计学是使用有限数量的测量来描述系统的艺术——实验结果、调查、传感器读数、掷骰子、掷硬币……让我们称其中一个测量的结果为结果。
我们可以将每个结果描述为有两个组成部分:T4 信号和噪声。

信号通常是我们想要理解的。这可能是一枚硬币的偏差,或者是一月的预期降雪量,或者是某个广告给客户带来的转换率。信号本身可能是我们感兴趣的潜在变量的函数——比如硬币的形状、12 月的海洋温度,或者特定客户的富裕程度和人生阶段。信号是一个确定性系统的产物,我们试图用统计学或机器学习模型来理解它。
噪声有些棘手——它意味着其他任何可能影响结果的东西,通常意味着宇宙中的任何东西。一些噪声源是我们无法测量的外部因素,因此被视为随机因素,一些是真正的随机效应,就像量子力学中的那些。简而言之,噪声是无数独立的伪随机力的总和,这些力会影响结果,并使测量受挫。
到目前为止一切顺利!但是如果噪音是随机的,我们怎么能希望理解信号呢?
不是随机的
随机变量不可能像它们看起来那样随机。它们几乎总是被限制在一定的范围内,它们可能偏向于某些值而不是其他值,并且通常遵循精确的方差。换句话说,随机性有很多种,我们可以描述这种随机性。
通常,我们使用一种称为概率分布 P(x)的数学构造来描述离散的随机变量,就像掷骰子的结果一样,它将一个概率(P(x))与每个可能的结果(x)相关联。对于掷骰子,我们得到 P(x)=1/6,因为不管结果本身如何,每个结果都有 1/6 的机会发生。
对于连续变量,比如一月份的预期降雪量,这就有点复杂了,因为可能的结果数量实际上是无限的。我们可能会有 6.07 英寸的降雪,或者 6.07000001 英寸的降雪,或者 6.0700000001 英寸的降雪。这意味着 6.07 英寸降雪的总体概率实际上是 0。
因此,我们使用的是概率密度函数,而不是概率分布。这里的诀窍是密度允许我们计算随机过程的结果将落在某个范围内的绝对概率,因此我们可以指定一个有限的概率,在一月份有 6.06 到 6.08 英寸的雪。
PDF(x)为[a,b]范围内某个值的随机变量的概率由 x=a 和 x=b 之间曲线下的面积给出。在数学中,我们将该面积写成定积分:


a 和 b 之间的结果的概率由曲线下的阴影区域给出(图像由作者在 matplotlib 中生成)
通常,我们会强制要求[-∞,∞]范围内整个 PDF 下的面积等于 1,或者:

这可以解释为说会有会有的某种结果。
这可能会变得有点复杂,但是有一个好消息:自然中的 pdf 倾向于分成几个类别,数学家和物理学家已经提出了这些类别的方便的数学描述。我们将快速讨论其中的三种分布——将它们视为统计学家工具箱中的主要工具。
简单均匀分布
当我们想到随机数时,我们通常会想到均匀分布:任何结果都同样可能发生——想想掷骰子或掷硬币。我们也可以做一个统一的概率密度函数,有点像有无限边的骰子滚动。
让我们用 Python 模拟一百万次均匀分布的掷骰子,并绘制出结果的直方图。我们将使用numpy.random来模拟随机变量,使用matplotlib.pyplot.hist来绘制结果。
import numpy as np
import matplotlib.pyplot as plt
# Generate a sample of 1000000 values from a uniformly distributed random variable
ssize = 1000000
x = np.random.choice([1,2,3,4,5,6],size = ssize)
# Plot a histogram of the values
ax = plt.hist(x, bins=6)

结果是均匀分布(咄!).这告诉我们,例如,0 到 2 之间的结果的概率与 4 到 6 之间的结果的概率相同。
注意,y 轴上的刻度明显不对。这是因为我们没有强制执行整个面积必须等于 1 的规则。经过适当的规格化后,这些条的高度为 1/6,面积为 61/6=1。*
泊松分布
我们经常遇到这样的情况,独立和不相关的事件以已知的平均速率λ发生。
例如,某人可能注意到他们平均每天收到 4 封信,并且从逻辑上来说,一封信不会影响任何未来的邮件,即,这些信是独立的,并且具有已知的平均速率λ=4。在这种情况下,一天 k 中收到的邮件数量服从泊松分布。

为了了解这种情况,让我们再次使用泊松分布模拟 1000000 天的邮件,并绘制结果。
# Generate a sample of 1000000 values from a Poisson distributed random variable
x = np.random.poisson(lam = 4, size = ssize)
# Plot a histogram of the values
ax = plt.hist(x, bins = 32)

再次注意,这些值并未标准化,而是代表相对概率而非绝对概率。
这种分布告诉我们,我们最有可能每天收到 3 或 4 封邮件,每封邮件的可能性是醒来时收到 2 或 6 封邮件的两倍。
二项式分布
二项分布应该从高中就熟悉了。f(k,n,p)度量在 n 次试验中获得 k 个结果的概率,其中每次试验的成功概率为 p。

例如,在硬币重量相等的情况下,在 10 次掷硬币中获得 5 个正面的机会有多大?就用 k=5,n=10,p=0.5。
让我们再次模拟一百万次这样的实验,并画出结果。
# Generate a sample of 1000000 values from a binomially distributed random variable
x = np.random.binomial(10,0.5,size = ssize)
# Plot a histogram of the values
ax = plt.hist(x, bins = 100)

这些分布在自然界中无处不在,描述了从棋盘游戏到皇家邮政的伪随机事件。
现在你可能已经注意到了这个列表中的一个明显的遗漏——不要担心,我们马上就要谈到这一点。
中心极限定理
请记住,我们的结果有两个组成部分:信号(这是我们试图分析的)和噪声(无数随机或伪随机变量的净效应)。在我们得到信号之前,我们需要了解噪声。
现在我们对分布有了一些了解,让我们想象一个简单的例子。我们有一些受多个独立噪声源影响的测量,为了简单起见,我们假设每个噪声源都像骰子一样均匀分布。噪声的总体分布是什么样的?
让我们使用np.random增加骰子的数量来模拟这个场景。
plt.figure(figsize=(20,15))
ndice = [1,2,5,10,50,100]
nbins = [4, 8, 16, 32, 64, 128]
for i in range(1,7):
y = [np.sum(np.random.uniform(0.,6.,size = ndice[i-1])) for j in range(ssize)]
plt.subplot(2, 3, i)
plt.hist(y, bins=nbins[i-1])
plt.title('N = ' + str(ndice[i-1]) + ' dice')

突然,我们有了一个非常独特而熟悉的形状:钟形曲线。
事实证明,这种分布在现实世界中无处不在,从成人鞋码的变化到量子测量,无处不在。我们称这种分布为正态分布也就不足为奇了。
这一切都不是巧合,事实上,中心极限定理,统计学的基本定理,指出了具有有限期望值和方差的无限独立随机变量的正确归一化和将是正态分布的。
换句话说噪声几乎总是正态分布。
为了表明这不仅仅是均匀分布噪声源的一个怪癖,我们可以更进一步,想象一个具有均匀、二项式和泊松噪声源的系统,看看结果是如何分布的。同样,我们可以用np.random来模拟这种情况。
y = [np.sum(np.random.uniform(size = 10)) \
+ np.sum(np.random.poisson(size = 10)) \
+ np.sum(np.random.binomial(50,0.05,size = 10)) \
for i in range(ssize)]
ax = plt.hist(y, bins = 50)

猜猜是谁。
高斯分布
高斯或正态分布 N(μ,σ)由其均值μ和方差σ唯一标识。

中心极限定理意味着,如果我们有一些测量值,我们可以毫无争议地完全描述噪声的特征:只需找到数据的平均值和方差,就可以找到其唯一的正态分布。
这反过来意味着一个卖鞋的人可以在一瞬间知道每种鞋号该买多少,尽管鞋号是无数独立因素的函数,不管是生物因素还是其他因素,我们都没有希望去测量。他可以做到这一点,只知道小样本的均值和标准差,只需将它们代入正态分布。
一些人可能会觉得知道正态分布是最大熵的分布很有趣——考虑到上面的一切,这对物理学家来说应该是显而易见的。
但是为什么π和 e 会出现在这个神奇的方程中呢?这是留给读者的一个练习。
库珀·道尔
置信区间背后的简单直觉
提高你对置信区间及其基本原理的理解。
我写这篇文章是为了:
- 给出一些关于置信区间的直觉。
- 澄清一些关于置信区间的经典误解(例如 95%的数据包含在置信区间中,或者总体和样本之间的不明确区分)

捕捉不确定性。来自 Unplash.com 的信用点数 @maxfelner
为什么要关心置信区间?
你想依靠你的猜测
当你寻找一个总体的特征值时,你首先从总体的一个样本中收集数据,并从这个样本数据中猜测参数(即:平均值、某些模型的系数等)。因为你不可能收集所有的数据,一个明显的问题出现了:
“我的估计有多可靠”?
我想在这里强调一下可靠这个词。你可以用套索来比较置信区间,用栅栏柱来比较你的参数,如果你瞄准栅栏,有时你会抓住栅栏,有时你会错过。
有时你会失手。我们从来没有 100%的自信。

把戒指扔到黑板上,得到一个数字。演职员表www.unplash.com·比万·凯
简单的例子
假设您收集了 n=100 个测量值来检查两个变量 X 和 y 之间的线性关系。在检查它们显著相关后,您可以将 n=100 个测量值分成三个训练集 n_tr=20 和一个测试集 n_te=40,并在每个训练集上拟合线性关系。您将获得 y 轴截距 b̂ 和斜率—,使三个样本的残差平方和最小(见下图)。
由于三个样本包含不同的点(x,y),所以对于每个训练样本来说,线性关系—x+b̂= y 将是不同的,并且也将随着 ax+b(拟合在群体数据上的回归线)而不同。
如何猜测真实的斜率和 y 轴截距值 a,b ?通过使用置信区间。

在对三个大小 n=20 的不同样本进行拟合后,我们用红色绘制回归线x+b= y。
95%的意思很简单。对于您从不同的训练数据集构建的每个置信区间,95%的置信区间将包含真实参数的值 a,b.
在上面绘制的例子中,每条红线都会给你一个真实参数所在的置信区间,其中 95%真的包括黄线(人口回归线)。魔法就是魔法!

我们比较拟合于总体的黄线 ax+b和拟合于样本的前一条线。
我应该使用假设检验还是置信区间?
答:看情况。当你想从数据中证明一个是/否的问题(我的糖果棒都是一样大小的吗?这个老师给的分数比这个高吗?)用 p 值进行假设检验更快。
然而,如果你的数据没有显示出足够的重要性,你就不能得出任何结论。然而,不管结果如何,置信区间至少给了你一个范围,在这个范围内应该是你寻找的参数。
简单来说,置信区间为你进行假设检验,也告诉你自变量对因变量的影响有多大。例如,如果您对您的回归模型 y=ax+b 的斜率执行 95%置信度的假设测试,并且输出 p 值为< 0.005,您可以得出结论:在 y 和 x 之间存在显著的线性关系。同时,你可以确定,如果你建立了 95%的置信区间,斜率将不包含 0: 因此 x 在 95% 时对 y 有影响!两种方法,一种结果!
现在我们了解了置信区间的重要性,让我们深入了解一下。
建造怪物
当你用你的数据去猜测人群的行为时,先用一个 学生 t 分布 来构造置信区间。
要使用 t 分布,您需要:
- 检查:1) 总体是正常的(至少您的数据是 mount shaped)。2) 随机抽取样品。不要违反这些假设,否则,你会有麻烦。
- 使用以下公式建立您的置信区间:

因为点估计值是由您的数据(例如棒线大小的平均值)给出的,而临界 t 统计值是由置信水平 α 给出的,所以您只有一个职责:提供标准误差的合理估计值。
标准误差为总体方差除以样本大小平方根的比率,如下图所示。但是因为你不知道总体方差 σ ,你将使用从你的样本数据计算出的总体方差 s 的估计值。

轻松点。我可以对我的样本数据做 s=numpy.std(array) 作为标准差估计?在许多情况下是的,样本的方差/标准差是 σ的最佳估计值。
我们将在第 2 部分中看到当你比较几个群体时,或者当你比较两个群体之间的差异时,会发生什么。但是现在,让我们专注于基本案例。

继续深入,演职员表:美国国家海洋和大气管理局对 unplash.com 的报道
基本方法:
第一步:从样本量中减去 1,计算出你的自由度。

第二步:选择一个置信水平 α (图示为 95%)并除以二(双尾检验)。

第三步:向 Google 或 Python 询问此 α /2 值的临界值 t/z 统计值。记住 α 是 t 分布曲线下的面积。

第四步:根据方差总体的估计值计算 SE(的估计值)。

第 5 步:计算你的 CI。

示例:
一位营养学家随机选择了 n=50 名成年男性,发现他们的乳制品日平均摄入量为 x_bar=756 克/天,标准偏差为 35 克/天。使用该样本信息构建男性乳制品平均每日摄入量的 95%置信区间[1]。
首先,95%置信度的 t 分布(相当于 n>30 的正态分布)的临界值是 α /2 = (1-0.95)/2=0.025,t_0.025 = 1.96。

来自“t 分布的百分点表”。经 Biometrika 编辑和受托人许可转载[1]。
我们使用临界值(在表中找到)、样本的标准偏差(由练习给出)和样本大小来计算置信区间。

因此,μ的 95%置信区间为每天 746.30 至 765.70 克。
增强你的自信:
你想估计在波瑞阿斯(一个虚构的国家)开始吸烟的平均年龄,你收集的数据给出了 18 岁的平均年龄,大约 20 岁。那么你的猜测就是垃圾,因为你人口的真实起始年龄应该在-2 岁到 38 岁之间,而你的平均年龄与此无关。
这就是我们喜欢窄置信区间的原因,为了获得小的置信区间,您可以:
- 增加 n 。平方根 n 是标准误差的分母,所以样本量越大,标准误差就越小,从而置信区间也就越小。
- 增加 n 个。自由度是 n-1,你可以在临界值 t 表中读到自由度越多,临界值越小。
- 减少α(避免)。如果你降低你的置信水平,你可以缩小你的置信区间(相同的置信程度见表 t_0.100 < t_0.005 )。
结论
- 首先,我们看到置信区间是一个强大的工具,可以一次给你很多信息。我的猜测靠谱吗?统计显著?我真正的参数在哪里?一旦你选择了你的置信水平 α %,你就可以确定你的置信区间的 α %包含了你所寻找的参数。
- 其次,我们看到了如何逐步构建基本案例的置信区间。
- 最后,我们了解了哪些参数影响了置信区间。
参考资料:
[1]w . Mendenhall,r . j . Beaver 和 B. M. (2006 年)。概率统计导论。加州贝尔蒙特:汤姆森/布鲁克斯/科尔。APA(第 6 版。)
重构糟糕代码的简单方法
是时候克服对混乱的遗留代码的恐惧了,用一些简单的重构技巧让它更干净、更简单、更易读…
很多人试图避免重构,无论是因为他们害怕破坏代码,还是因为他们看不到直接的好处,或者他们只是假装没有时间去做。然而在现实中,重构无论从短期还是长期来看都是非常有益的,有很多理由在这上面花些时间。最常提到的可能是发现错误,使软件更容易理解或改进设计。
然而,在我看来,促使你去弄乱你的(或者可能是遗留的)糟糕代码的真正原因应该是,重构帮助我们从我们自己的代码中摆脱恐惧,并且帮助我们避免当我们不得不向别人展示我们的代码时的羞耻感。
因此,在这篇文章中,我们将介绍一些简单的方法来重构和大大改进您的代码,而不会同时破坏所有东西,这样您就不必害怕自己的代码或羞于向同事展示。

爱丽丝·迪特里希在 Unsplash 上的照片
最简单的改进
为了让你轻松地重构令人恐惧的代码库,我们将从简单但非常重要的改进开始,这些改进是文学无法打破的——首先是代码的重新格式化。
有几种方法可以修复代码格式。你可以修复代码块周围的错误缩进或缺失{}之类的问题,也可以采取更系统的方法。更系统的方法是创建一个风格指南,然后应用它(最好是执行它)。
我说我们应该创建一个样式指南,但是对于大多数编程语言来说,已经有了一套标准的约定,比如 PEP8 for Python 或者Google Java Style Guidefor Java,你可以采用并使用工具或 ide 插件来帮助你找到并修复所有的格式问题。
不管你选择哪种方法,重要的是(小心地)选择一种风格并坚持下去,同时确保团队中的每个人都遵循相同的指南以保持事情的一致性。
重构的另一个安全区域是注释。只要它们是相关的、最新的和有用的,拥有它们就很好。但是大多数时候,你会发现很多应该被删除的评论。这些可能是描述不言自明的东西的多余注释或文档、注释掉的代码或应该更新的过时注释(如果不再相关,则删除)。在这三个代码中,我非常想强调注释掉的代码,因为很多人会说:“但是我以后可能会需要它!”不,你不会的,别再骗自己了,现在就删除它,如果你将来真的需要它,你就能在git历史中找到它。
说到注释,只要记住注释并不能弥补糟糕的代码。
这一部分的最后一件事是死代码。它会造成混乱,你把它留在代码库中的时间越长,就越难删除,因为没有人知道它是做什么的,或者是否需要它。现在,任何像样的 IDE 都会告诉你不可到达的死代码,所以你不需要害怕删除它,所以只是摆脱它,没有理由把它放在那里。
低垂的果实
通常很容易找到要重构的东西,比如上面显示的简单改进。然而,如果你需要一些蹩脚代码的例子,那么这里有一个列表:
- 在我看来,花大量时间寻找好的变量、类或函数名是非常值得的。重构也很容易,可以极大地提高代码的可读性,而不会对脆弱的代码造成任何损害。那么,如何选择好名字呢?一般来说,对类使用名词——最好是非通用的(不,
Data不是类的好名字);函数和变量的动词(或整个短语)?
嗯,命名变量并没有一个真正的规则,但是一般来说,任何描述性的和明确的规则都可以。说得更具体一些,更专业一些——你应该总是避免使用像x或a这样的单个字符的名字。对于布尔变量名,使用“问题”,例如isReady或hasName。通常人们不喜欢使用长的变量名,但是最好使用长名字,而不是使用无意义的名字(但是简洁的名字显然更好)。最后一个一般性建议是坚持使用单个字母的大小写——无论是camelCase、snake_case还是其他,选择一个并坚持使用(最好使用特定编程语言的约定和术语)。 - 类似于变量,常量也可以帮助你的代码变得更具可读性。因此,尝试用合理的命名常量替换任何神奇的数字/值,并使用
CAPITALIZED_WITH_UNDERSCORES字母大小写。 - 另一个适合重构的东西是否定的条件句,它们令人困惑,难以阅读并且容易出错。不过它们很容易移除,因为这通常足以逆转
if/else街区的尸体。正如我已经多次提到的,您的 IDE 可能能够为您发现被否定的条件,并提出修复建议。 - 我们已经讨论了适当的代码块格式,但是我想在这里提到一件我非常讨厌看到的事情,那就是当人们省略条件和循环的括号/主体时,例如(注意:本文中的代码片段使用各种语言,因为所有的提示都是与语言无关的):
如果您像这样省略大括号,您可能会节省一行代码,但实际上您只是在为一些讨厌的长时间调试做准备。除此之外,如果您需要在这样的一行程序中设置断点,您会发现您不能真正正确地设置断点,因为您只能在整行上设置断点,而不仅仅是在条件或循环中的部分。
- 最后但同样重要的是垂直分隔——或者换句话说——变量的定义和它们的用法之间的巨大距离。变量,还有函数和方法都应该尽可能地靠近它们被使用的地方来定义,以便于阅读代码。局部变量定义中的大垂直距离及其用法可能是函数太大的标志,应该分解成较小的函数。
最基本的规则:只做微小的改动,重新测试。
深入挖掘
既然您已经浏览了一些代码,并对修改它有了更多的信心,那么您可能想要更深入地挖掘,寻找代码中更具体的缺陷。您肯定会发现的一个缺陷是重复代码。关于代码复制的简单经验法则是,如果你将同一段代码重复 3 次,就该将它提取到单独的函数或变量中。
另一个常见缺陷可能是布尔参数的过度使用。将布尔参数传递给一个函数可能表明这个函数正在做不止一件事情,因此应该分成(至少)两个更小的部分。
说到函数参数——您有时可能会遇到修改输入参数的坏习惯。参数是函数输入,仅此而已——将它们用作输入,不要改变它们的值。如果您在代码中看到这个缺陷,最好将值复制到新变量中,并避免修改参数。
与参数相关的最后一个问题是,您可能需要注意参数过多的函数。最多 3 个参数通常是好的,但是看到任何更多的参数都应该引起怀疑。您应该检查这样的函数,并决定是否可以使用这么多参数,或者是否最好分解和/或简化函数。
转到变量,您可能会遇到两个基本问题,首先是冗余的临时变量。这看起来会像这样:
使用这种变量没有任何用处。它使代码变得更长,并且没有以任何方式解释或提高可读性,所以我们应该删除它并像这样内联它:
另一个常见问题与上述相反,即代码缺少变量,例如:
与前一期不同,这段代码将受益于一些额外的变量,这些变量将有助于解释代码的作用。这也会简化调试,因为为每个变量设置断点和观察会更容易。重构版本可以看起来像这样:
本节中最后一个重构的候选对象非常容易识别——它是复杂/复合条件的。我们都见过那些由几个&&和||组合在一起的巨大的多行条件句。它们很难看,难以解析,难以调试,也难以修改。消除它的最简单的方法——或者更确切地说是抽象它——是将其提取到单独的检查函数中。例子看起来是这样的:
遗留代码
为了能够有效地重构我们的代码,我们需要有一个合适的测试覆盖率,否则我们就冒着破坏现有功能的风险。在前面的章节中,我假设我们有测试,因此可以修改代码并运行测试套件来验证一切正常。
但是我们如何重构没有适当测试覆盖的代码——或者换句话说,我们如何重构遗留代码?在我们不能依赖测试的情况下,我建议只改变那些必须改变的东西,那些有需要修复的 bug 的代码或者我们正在添加新特性的代码库的一部分。在这些领域中,首先为现有的遗留代码编写测试,然后才进行任何代码修改。我个人会首先重构旧代码,让自己熟悉它,让它更“欢迎”必要的改变。
从这一点上来说,你可以像处理任何其他需要重构的代码一样继续进行——一步一步来,从小的简单的改变开始,并且频繁地重新测试。
利用工具
重构和通常情况下对代码的精心处理是非常耗时的,这在时间紧迫的项目中或者在截止日期临近的时候可能会成为问题。这是人们把所有好的实践都扔出窗外,并试图尽快“出货就好”的时代。
为了减轻这种压力,即使在看起来没有时间的时候也能更容易地继续重构和改进代码,请尝试使用能够为您做一些工作的工具。这些工具可以是像pylint这样的 linters,像 Checkstyle 这样的代码检查器,或者像 Sonarqube 这样的代码覆盖工具。
谈到代码覆盖和测试——也要确保你的测试套件是快速的,否则你将最终放弃缓慢的测试或者根本不运行套件。
在理想的情况下,所有这些都应该使用某种 CI/CD 管道来实现自动化,这将使用强制质量检查来运行代码检查,在构建和部署之前报告任何代码风格不一致、任何可能的错误或问题。
结论
本文并不是“所有重构的事情”的详尽列表。要获得更多的列表和例子,你一定要看看鲍勃大叔的《干净的代码》(尤其是第九章《气味和启发》(T10))或者马丁·福勒的《重构》(T11、T12、T13、T14)。
不管你决定遵循哪个指南或书籍,最终都归结为几个简单的规则。总是试着让代码比以前干净一点——这样你可以缓慢但肯定地重构并提高整体质量,而不用花费太多的精力和时间。同时,不要推迟重构,因为以后再做通常意味着永远不做,这会导致遗留代码一团糟。
**本文原帖martinheinz . dev
* *
频繁模式增长方法(FP-Growth)的最简单解释
使用流行的 FP-Growth 算法理解和实现对频繁模式的深度优先搜索

在 Unsplash 上由 Mehrad Vosoughi 拍摄的照片
频繁模式挖掘是指在事务性数据中寻找共现模式的过程。最突出的应用之一是市场篮分析。零售商找到顾客经常一起购买的物品,以进行有针对性的促销、广告宣传,并在他们的商店中实际摆放这些物品。然而,在聚类、生成建议和发现数据特征方面还有广泛的其他应用。
在本文中,我们假设您对频繁模式有一个基本的了解,并探索一种叫做模式增长的分而治之的方法,并特别关注于理解和实现 FP 增长算法。
为什么叫模式增长?
我们必须理解分治策略在这里是如何工作的,在这一过程中,我们首先要解决几个重要的概念。我们将使用下面的事务数据库。I 是项目,T 是交易。

图 1:事务数据库
项目排序
事务中的项目按支持计数的降序排序。要对 T100 中的项目进行排序,请计算 I1、I2 和 I5 的支持计数,分别为 6、7 和 2。按项目排序的 T100 将是{I2,I1,I5}。
这可能是模式增长方法中最重要但最不受重视的步骤。它确保频繁模式是按排序的顺序构建的。这是下一个叫做前缀的概念的先决条件。
模式前缀
项目排序模式的前缀是模式中除最后一个项目之外的所有项目。在模式{I1,I2,I3}中,前缀是{I1,I2}。I3 被称为后缀。如果{I1,I2,I3}是一个频繁模式,那么它的前缀{I1,I2}也一定是频繁的。模式是通过确保前缀总是频繁出现(记住这一点)而形成的。
FP 树
称为 FP 树的树是通过一次处理一个事务来构建的。排序后的第一个事务{I1,I2,I5}变成了{I2,I1,I5}。为了将这个事务插入到 FP 树中,我们从根节点开始,并添加计数为 1 的新节点。

图 2:添加事务 T100 后的 FP 树
事务{I2,I4}接下来被插入同一树中。父根下已经存在节点 I2,所以我们没有创建新节点,而是遍历同一个节点,将它的计数增加 1,并添加 I4 作为新的子节点。如果一个事务没有它的第一个节点作为根的子节点,我们创建一个新节点。

图 3:添加交易 T200 后的 FP 树
我们这样继续下去,直到扫描完整个模式库。最后我们得到了一棵像这样的树。

图 4:在整个事务数据库上生成的 FP 树
节点链接
这是一个散列表,存储了一个项目的 FP 树中所有节点的引用列表。
有条件模式基地(CPB)
这是与特定前缀相关的事务数据库的截断版本。它是从 FP 树创建的,我们不必再次扫描数据库。它被传递给下一个函数调用。我们将在下面的实现中处理这个概念。
实现
接近
我们构建了一个 3 步递归函数 fp_growth ,它需要 4 个参数。
1。 transaction_db: 这是当前的模式库。在算法开始时,这将是整个事务数据库。
2。 min_sup: 最小支持阈值
3。 fp_list: 收集发现的频繁模式的列表。
4。前缀:当前前缀中的项目列表。一开始,这是空的。
每个函数调用都会创建两个工件——一个 FP 树和一个称为“条件模式库”的新模式库。如果条件模式库包含事务,那么我们递归。在对 fp_growth 的递归调用中,我们传递更新的模式基和一个扩展的前缀。在我们学习 A、B 和 c 部分时,我们将建立这个函数。
代码片段 1:主函数的框架
交易的元组结构
我们将修改图 1 中的数据帧,以创建如图 2 中所示的新数据帧,其中每个事务是一个元组,其第一个元素是项目列表,第二个元素是该事务在数据库中发生的次数。最初,我们假设每个事务发生一次(即使有重复)。

图 5:事务的元组结构
树形数据结构
我们用 Python 构建了一个简单的树结构,其中树中的每个节点只知道它的名字和它的父节点。Parent 是对父节点的引用。(记住,引用是指向对象位置的指针,Python 在函数中通过引用传递对象。)
树中的一个节点具有这些属性。
名称:项的字符串名称,如“I1”
父项:对树中父项的引用
计数:该节点作为前缀在事务中出现的次数
现在,让我们来看一下 FP-Growth 的 3 个步骤,这是一个真正的分治算法。
串联步骤(步骤 A)
在这一步中,我们执行两个功能。
- 在当前模式库中生成频繁 1-项集。这些基本上是在当前模式库中出现在超过 min_sup 个交易中的个别项目。
- 对于第 1 部分中的每个项目,通过将当前前缀与 item 连接起来生成一个新的频繁项目集。如果您想知道新项目集是如何频繁的,那是因为您的前缀和 1-项目集都是频繁的。
代码片段 2:从模式库中获取频繁 1-项集的函数
代码片段 3:步骤 A
生成 FP-Tree 的步骤(步骤 B)
FP 树从根节点开始在当前模式基础上递归生成。先决条件是所有事务的项集必须按照支持计数的降序排序。这只需要做一次,那就是在根节点。
代码片段 4:对事务项集进行排序的函数
代码片段 5:检查树是否包含同名的父节点的函数
使用模式的前缀和后缀,一次使用一个事务来构建树。
让我们用图 2 来理解这一点。
- 为了将事务{I2,I1,I5}添加到树中,我们调用 insert_tree ,前缀为 I2,后缀为{I1,I5}。
- insert_tree 函数将添加或更新前缀节点,并以 I1 为前缀和{I5}为后缀调用自身。
- 该函数现在添加 I2,并用前缀 I5 和一个空后缀{}调用自己。
- 将 I5 添加到树中后,函数停止,因为没有后缀可以继续。
- 现在,选择下一个交易并重复相同的过程,直到扫描完所有交易。
代码片段 6:递归构造 FP 树的函数
接下来,让我们将步骤 B 集成到主函数中。
代码片段 7:步骤 B
生成条件模式库(步骤 C)
对于每个 1-项集,我们遍历它的节点链接,并且对于每个链接,我们收集从链接节点到根节点的路径。该路径成为模式库数据库中的一个事务。节点链接的计数成为该事务在条件模式库中发生的次数。
理想情况下,我们会多次重复这个事务。但是这将违背拥有一个精简的数据库的目的,因此,相反,我们更新该事务的事务计数(还记得事务的元组结构中的第二个元素吗?).
参考图 4 中的 FP 树,从 1-项集 I5,我们在新的条件模式库中得到的事务是:
- 计数= 1 的
- 计数= 1 的

图 5:I5 的条件模式库
从 1-项集 I3,我们在新的条件模式库中得到的事务是:
- 计数= 2 的
- 计数= 2 的
- 计数= 2 的

图 6:I3 的条件模式库
最后,我们将最后一步添加到我们的函数中。
对于每个 1-itemset,如果条件模式基包含事务,我们对其调用相同的函数。这一次,1-项集被追加到前缀。
最终想法
我希望现在,你已经感受到为什么这种方法被称为“模式增长”。这是因为我们正在从更小的子模式中发展更大的频繁模式。随着我们向更大的模式发展,我们扫描的数据库越来越小。
GitHub 动作的最简单介绍
…以及为什么您应该在未来的每个项目中使用它们

介绍
你讨厌 PyTorch。不,别说了。你喜欢 PyTorch,但是,你讨厌它没有任何结构。你讨厌一遍又一遍地编写相同的训练循环,自己把东西放到 GPU 上,手动实现混合精度训练之类的最佳实践。
在所有的麻烦之后,即使你设法让一个项目的所有东西都工作了,你也不容易在下一个项目中复制它。
您希望 PyTorch 有一些抽象来帮助解决这些问题,不是很多,只是很薄的一层。这些抽象可以让你更专注于你的研究,而不是解决“张量形状不匹配”的错误。
你喜欢这个主意。你已经将人工智能投入生产很多年了,所以你知道怎么做,现在你进入了研究领域,你也知道研究社区需要什么。你要把快速迭代的创业心态融入到研究中。
你决定自己设计。一个分离工程和科学的包装器,让你的 PyTorch 代码快速运行。快如闪电。
你称之为 py torch-闪电。
起初,你只是把它作为你在 NYU 项目的模板。但是最后你花了一半的博士学位在它上面,它在脸书被采用,成为这个巨大的开源项目。
中断
我用了 PyTorch 闪电队的故事来戏剧性地介绍这篇文章。过了这一点,一切都是虚构的,纯粹是为了解释。
中场休息结束
但是最后你花了一半的博士学位在它上面,它在脸书被采用,成为这个巨大的开源项目。来自世界各地的贡献者开始提交针对他们个人痛点的 PRs。
审查这些 PRs 将会很困难。不是从实现的角度,不,你喜欢那部分。然而,要有效地做到这一点,您需要代码格式良好。你需要它符合 PEP8 规则。
只有这样,您才能专注于代码逻辑,而不是对“第 32 行末尾的空格”吹毛求疵
该过程
您首先创建一个 CONTRIBUTING.md,其中详细列出了投稿指南。

来源:https://github . com/PyTorchLightning/pytorch-lightning/blob/master/。github/CONTRIBUTING.md
在本文中,我们将只深入一个指南,使用 flake8 来确保我们的代码符合 PEP8 规则。
有许多方法可以将 flake8 合并到项目中。
人工检查
当您开始使用 flake8 时,您刚刚在本地安装了它,如下所示:
pip install flake8
然后你只需要做flake8 filename.py或flake8 .来运行当前目录下的所有文件。
让我们用一个例子来测试一下。假设我们写了一个有很多空行的函数。

作者图片
如果我们用 flake8 检查这个文件…

作者图片
…它会抱怨。这有助于你识别和纠正这些错误。
注意:您可以编辑 flake8 配置文件来修改规则,或者告诉 flake8 忽略某些类型的错误。
你想让所有的公关都受到检查。然而,你知道不是所有的贡献者在提交 PR 之前都会在本地运行它。您需要一种方法来自动化这个过程。
使用测试模块
贡献者在提交 PR 之前要检查的一件事是是否所有的测试用例都通过了。Python 中最常见的测试库是 pytest 。您可以为 pytest 安装 flake8 插件
pip install pytest-flake8
然后当你运行你的测试时,你可以用 flake8 选项来检查每一个 python 文件。
pytest --flake8
这比我们的第一个解决方案稍微好一点,但是仍然没有实施。
使用 Git 挂钩
如果您在 Git 跟踪的存储库中查看.git文件夹,那么您会看到一个名为 hooks 的文件夹。如果你打开那个文件夹,你会看到一堆钩子样本。

作者图片
这些是钩子将被调用的事件。在我们的例子中,如果我们在pre-commit钩子中使用 flake8,那么它将在提交之前运行 flake8,如果检查失败,提交将被中止。
为此,首先将pre-commit.sample重命名为pre-commit。然后编辑它以包含flake8 .命令。最后,尝试提交您的文件。

作者图片
这样,我们可以确保检查它提交的每个文件。
使用 GitHub 动作
我们可以使用 GitHub 动作做和上面一样的事情。我们有一个.github文件夹,而不是.git。我们没有使用pre-commit钩子,而是使用了yml锉刀。看看下面的代码。

就算你不懂,凭直觉你也能搞清楚我们是运行在 ubuntu 上。我们检查分支并设置 Python 3.7 。我们安装 flake8,最后检查我们所有的文件。
每当我们推送或请求拉取时,都会这样做。

为什么 GitHub 动作准确?
现在你可能会想,“但是 Dipam,从这个例子来看,GitHub Actions 并没有提供比其他方法更多的优势。”
这只是一件事,而且是非常简单的一件事。你还有无数其他的事情想要确保。
- 您想要用当前的 requirements.txt 来验证您的包构建。
- 您想要确保您所有的测试用例都通过。很容易在做某件事情的时候却不小心弄坏了其他的东西。
- 您希望确保您的代码可以在不同的平台(Linux、Windows、Mac)上运行。我不知道以前是怎么做到的,但我猜这并不容易。
- 您希望在不同版本的 Python (3.6 以上)上测试它。同样,您必须为此创建单独的 conda 环境。
- 确保 PR 不会过多地降低代码覆盖率。
- 确保 PR 不会破坏文档(您正在使用 sphinx 和 RTD 自动生成文档)。
- 代码可以在 CPU、GPU、多节点和 TPU 上运行。
- 还有更多..
那只是 Python。还有前端,云服务,Docker,这么多组件交互在一起,需要检查。
你不能为所有这些设计钩子或者测试用例或者其他解决方法。而且你不能轻易地在每个项目中复制它。
这就是为什么 GitHub 动作如此强大的原因。它们为您提供了一种方式,将所有这些任务集中到在某些事件上运行的工作流,执行某些检查,并为您提供这些检查的详细报告。
现在贡献者可以继续编辑他们的 PRs,直到他们在所有的测试中都得到绿色的勾号。在此之前,这些将被视为 PRs 草案。只有当一切正常时,维护人员才会看一眼。

来源:https://github.com/deep-word/dword/runs/2495535846
我发现学习 GitHub 动作的最好方法是:
- 如果可以的话,在项目中使用它们。只有自己去尝试,才会真正学会。
- 看其他回购的 yml 文件借鉴思路。
给初学者/学生的提示:
在从事大学项目时,很容易忽略行业实践,一次提交所有内容,不使用 GitHub Actions 或 Weights and Biases 或 Docker 之类的工具,因为它们很麻烦,目前没有提供太多价值。
我的建议?使用它们。不要把它当成另一个项目。把它当作你正在交付的产品。不仅要花时间训练最准确的模型,还要学习如何构建 CI/CD 管道,将其部署在云上并处理流量。
~快乐学习
进一步学习:
- 等我下一篇博文:p
- https://docs.github.com/en/actions
- https://github . com/sdras/awesome-actions # machine-learning-ops
- https://fast pages . fast . ai/actions/markdown/2020/03/06/fast pages-actions . html # a-gentle-introduction-to-github-actions
PyTorch 故事参考:
参考资料:
- https://flake8.pycqa.org/en/latest/
- https://pypi.org/project/pytest-flake8/
- https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks
- https://ljvmiranda 921 . github . io/notebook/2018/06/21/pre commits-using-black-and-flake 8/
用 Falcon 和 Python 3.10 构建 REST API 最简单的方法:在空间几何中的应用
实践教程
通过对机器人学的应用理解 Python 3 中的数据操作和编程接口:计算带有猎鹰、Gunicorn 和失眠的三维系统中两点之间的欧几里德距离。

在远程服务器上用 Python 部署 REST API 可能是制作功能性应用程序的一个困难步骤。本文的目的是提出一个极其简化的 Falcon 模块配置代码,特别是对于希望使用远程计算工具的 web 编程初学者。尽管您对 Python 3 有基本的了解,但在 10 分钟内,您的第一台服务器就可以运行了。为了让这篇文章更有吸引力,让我们来看一个真实的问题,在空间中定位并计算三维参照系中两点之间的距离。在建模或机器人项目的环境中很有用,下面的程序将允许在远程机器上应用数学定理后,接收 JSON 请求,并以相同的格式发送响应,该机器配备有 Python 3.10 环境和更新的库。
建议
与 Python 3.10 的兼容性测试,在 MacOS 11.5.1 和 Linux Ubuntu Server 20.04 LTS 环境下执行。
使用的库:Falcon,Gunicorn,Math,Json。
pip3 install falcon gunicorn
源代码将首先观察其执行所必需的库的存在,然后在不存在的情况下下载它们,以便自动更新执行环境的软件配置。
为了使程序在最少人工干预的情况下可执行,并优化其在服务器上的部署,已经实现了升级、数据下载和异常处理的自治,特别是在 server_SMTP 类中。
首先,有必要在系统未使用的监听端口上初始化我们的 Gunicorn 服务器,在我们的例子中,端口 5000 似乎是一个完美的候选端口,应该不会造成任何不便。为此,请在终端窗口中输入以下命令:
gunicorn -b 0.0.0:5000 main — reload
注:为执行 Gunicorn,将文件命名为 main.py 是很重要的,不同的名称将导致异常,并且将无法到达服务器启动。
然后,您必须在 main.py 文件中配置应用程序,使用一组指向 Falcon 库的变量。
api = app = application = falcon.API()
从这一点开始,您依赖于 Falcon 的语法,特别是在处理。有关猎鹰的更多信息,请访问图书馆网站(https://Falcon . readthedocs . io)。例如,要解释 JSON 格式的请求,必须使用“stream”类:
request = json.loads(req.stream.read())
为了测试我们的服务器的响应和程序的正确执行,我们将使用一个开源 API 客户端失眠症。
软件启动后,在左侧窗格的下拉菜单中将方法设置为“POST ”,然后插入服务器的目标 URL。在我们的案例中:
[http://0.0.0.0:5000/DistanceProcessing](http://0.0.0.0:5000/DistanceProcessing)
最后一步是制定我们的 JSON 查询。对于我们的例子,我们将在“body”中发送一个列表列表,包含一个三维框架中的两个点的坐标。同时:【B 点 x 位置,B 点 y 位置,B 点 z 位置】和【A 点 x 位置,A 点 y 位置,A 点 z 位置】。
{
“body”: [[0, 0, 1], [1.5, 2.5, 1.20]]
}

关于失眠的 JSON 请求和响应的编写示例。
让我们考虑机器人学中的一个应用,其中物体在空间中的定位可能是一个基本功能。如果我们允许要定位的物体具有接近三维参考系的坐标,则要应用的公式保持简单:

在编程层面上,可以编写一个简单的函数,允许应用上述公式:
对于 POST 方法返回的响应,我们将使用标准状态 200 和 Json 库的“dumps”函数。
API 的构造可用于许多应用程序,您现在已经了解了其开发的基础,这一介绍允许您构建您的第一个架构,尤其是在创建专用于机器学习或远程计算的编程接口方面。
Louis Brulé Naudet 拥有巴黎萨克莱大学的法律和经济学/管理学双学位。
用 Python 创建交互式烛台图表的最简单方法

马克西姆·霍普曼在 Unsplash 上的照片
仅用一行代码
简而言之,烛台图表是一种金融图表,用于描述某些资产(股票、密码等)的价格变动。).与收盘价的简单折线图相比,它提供了更多关于价格动态的信息-它基于 OHLC 数据,这意味着它包含开盘价、最高价、最低价和收盘价(通常与成交量一起)。这些值可以以不同的采样频率(分钟、小时、天、周等)显示。)并经常被用作技术分析的基础。
在不深入识别烛台模式的情况下,我将向您展示如何用 Python 轻松创建交互式烛台图表。
烛台图表使用cufflinks
创建蜡烛图最简单的方法是使用一个名为cufflinks的库。这是一个在plotly顶部创建的包装器,提供了广泛的不同地块,烛台只是其中之一。这些图表绝不仅限于金融数据。
和往常一样,第一步是导入库。
然后,我们需要设置一些设置来使用plotly的离线模式,并显示笔记本中的数字:
我们还需要 OHLC 的实际数据。我们可以使用yfinance轻松抓取它(更多细节在这里)。对于这个特殊的例子,我们下载 2021 年苹果股票的价格。
以及收盘价的快速可视化:

作者图片
这张图并没有说明股票价格随时间变化的情况。然而,我们可以做得更好,从价格中获得更好的洞察力。这就是我们使用cufflinks继续生成烛台图表的原因。

作者图片
就这么简单。请记住,为了方便起见,所有的图表都是静态图像,但它们在笔记本中是完全交互式的。此外,您可以将代码写成一行程序,正如本文的副标题所承诺的那样。然而,这种形式是更可取的,你很快就会明白为什么。
在这一点上,我几乎可以听到你说:“当你可以在plotly中创建相同的图表时,你为什么要使用包装库呢?尤其是在图书馆没有积极维护的情况下。”的确,cufflinks没有被主动维护(至少通过查看对回购的最新提交)。为了证明我的观点,我将向你展示什么是cufflinks的明显优势。但是首先,我将在plotly中处理关于创建类似图表的部分。最简单的一个可以用下面的代码片段创建,在我看来,它没有用cufflinks创建的好。

作者图片
总的来说,在plotly创造剧情并不比在cufflinks难多少。但现在我会给你看后者在对比中脱颖而出的原因。想象一下你想给情节添加更多信息的情况。因此,除了烛台,你还想有一定的技术指标,如简单的移动平均线。您可以通过一行额外的代码轻松地将它添加到cufflinks中:

作者图片
有了这一行,我们就增加了一条基于收盘价计算的 14 天移动平均线。我们可以很容易地进一步发展。

作者图片
好吧,这可能有点过了。关键是在我们的图表中添加技术指标是多么容易。通过几条额外的线,我们添加了两条移动平均线(10 天和 50 天),相对强弱指数(RSI),布林线,移动平均线收敛/发散(MACD),和成交量。更好的是,cufflinks至少提供了一些更受欢迎的指标,您可以直接从代码库中了解更多(不幸的是没有文档,尽管您可以从详尽的目录中了解很多)。
外卖食品
cufflinks是一个基于plotly的包装器库,它提供了大量开箱即用的高质量可视化。- 其中之一是烛台图表,你可以很容易地添加各种技术指标。
cufflinks似乎没有被积极开发,所以将来会有一些兼容性问题的风险
您可以在我的 GitHub 上找到本文使用的代码。此外,欢迎任何建设性的反馈。你可以在推特或评论中联系我。
免责声明:前方加盟商链接
如果你有兴趣发展你的 Python 技能,并专注于定量金融,你可能想看看一个叫 Quantra 的平台。我写了一篇短文,展示了这个平台的一些特性,并描述了我个人的使用体验。
如果您喜欢这篇文章,您可能还会对以下内容感兴趣:
</5-types-of-plots-that-will-help-you-with-time-series-analysis-b63747818705>
在 Kubernetes 上提供 ML 模型的最简单方法
从 Jupyter 笔记本到生产就绪的机器学习 API,只需一行代码

拥有一个训练有素的模型作为可扩展的 API 是每个机器学习项目的最终目标。有人可能会说,监控是后来的事,但当你准备好终点时,香槟就会流出来。
在这个故事中,我们使用 Kale,Kubeflow 为数据科学家提供的超级食物,来部署一个 ML 模型;它只需要一行代码!
如今,由数据科学家训练出来的模型中,超过一半从未投入生产。有时,挑战是组织性的,但大多数时候,技术障碍似乎是不可逾越的。无论哪种方式,一款未投产的车型都无法提供业务影响。
那么,数据科学家如何控制从笔记本电脑到服务的整个流程,而不需要依赖大量的 ML 工程师和基础架构架构师呢?
这个故事演示了我们如何将机器学习模型部署为可扩展的 API,将编排部分留给了 Kubernetes,将繁重的工作留给了 KFServing。为此,我们用 羽衣甘蓝kube flow为数据科学家提供超级食物;它只需要一行代码!****
学习率是为那些对 AI 和 MLOps 的世界感到好奇的人准备的时事通讯。你会在每周五收到我关于最新人工智能新闻和文章的更新和想法。在这里订阅!
从笔记本到上菜
让我们开始吧。在这个故事中,我将首先向你展示你能用羽衣甘蓝和 KFServing 做什么,然后告诉你怎么做。
因此,按照这种自上而下的方法,让我们假设您已经在著名的时尚 MNIST 数据集上拟合了一个简单的 Keras 模型。下面的代码使用了一个简单的三层神经网络,在这个问题上达到了 80%的准确率。当然,我们可以做得更好,但这不是本文的重点。
准备好模型后,您所要做的就是将它作为一个可伸缩的 API,导入必要的函数并添加以下代码行:
Kale 会自动识别您正在尝试为 TensorFlow 模型提供服务,它会创建相应的推理服务。几秒钟后,您将有一个端点准备好响应您的请求。

推理服务准备好了——图片由作者提供
我知道 MNIST 的例子和它的各种变种被认为是一个已经解决的无聊问题。但是这个过程不需要修改任何tf.keras模型的一行代码就可以工作。此外,Kale 还支持 Scikit Learn 和 XGBoost 模型,对 PyTorch 的支持即将推出。
最后但同样重要的是,如果您打印我们创建的kfserving对象,Kale 将为您提供一个链接。通过该链接,您将进入模型的用户界面,在这里您可以查看模型服务器的性能,检查您的部署的详细信息,并直接从您的 pod 观看日志流。

监控您的模型服务器—按作者分类的图像
但是怎么做呢?
为了实现这个令人印象深刻的结果,我们使用 Kubeflow,这是一个开源项目,致力于使 ML 项目的部署更加简单、可移植和可伸缩。来自文档:
Kubeflow 项目致力于使在 Kubernetes 上部署机器学习(ML)工作流变得简单、可移植和可扩展。我们的目标不是重新创建其他服务,而是提供一种简单的方法来将 ML 的最佳开源系统部署到不同的基础设施上。无论你在哪里运行 Kubernetes,你都应该能够运行 Kubeflow。
但是我们如何开始呢?我们需要 Kubernetes 集群吗?我们应该自己部署整个系统吗?我的意思是,你看过库伯弗洛的清单回购吗?
不要慌;最后,在 Kubeflow 上运行一个笔记本,我们需要的只是一个 GCP 或 AWS 账户和你的旧的ipynb笔记本文件!我们将使用 MiniKF。MiniKF 是一个单节点 Kubeflow 实例,预装了许多优秀的特性。具体来说:
- Kale:kube flow 的编排和工作流工具,使您能够从笔记本电脑开始运行完整的数据科学工作流
- Arrikto Rok:一个数据版本化系统,支持可再现性、缓存、模型血统等等。
因此,要在 GCP 上安装 Kubeflow,请遵循我在下面提供的指南:
**
或者,如果您喜欢 AWS:
更深入
如果你想了解更多关于羽衣甘蓝、Rok 和 Kubeflow 的知识,羽衣甘蓝回购示例是一个很好的起点。您也可以关注由您的真实媒体发布的教程:
- 将 Kubeflow 变成您的 ML 工作站
- 从 Jupyter 到 Kubeflow 管道,点击一下
- 如何使用时间旅行调试你的 ML 模型
- 如何使用 KATIB 优化你的模型
- 如何对你的 ML 项目进行版本控制
最后,当你准备好了,就可以进入 Arrikto 团队提供的 codelab 来实现从笔记本到端到端服务的 ML 管道,或者观看最新的 KubeCon 教程:
结论
这个故事展示了使用 MiniKF、Kale 和 KFServing,只需一行代码就能为机器学习模型提供服务是多么容易。真的没有比这更好的了!
我们研究了什么和如何,并看到了我们使用 MiniKF 部署 Kubeflow 环境进行实验的步骤。现在,轮到您使用 MiniKF、Kale 和 KFServing 来训练和部署 ML 模型了!
Learning Rate 是为那些对 AI 和 MLOps 的世界感到好奇的人准备的时事通讯。你会在每周五收到我关于最新人工智能新闻和文章的更新和想法。订阅这里!
关于作者
我的名字是迪米特里斯·波罗普洛斯,我是一名为阿里克托工作的机器学习工程师。我曾为欧洲委员会、欧盟统计局、国际货币基金组织、欧洲央行、经合组织和宜家等主要客户设计和实施过人工智能和软件解决方案。
如果你有兴趣阅读更多关于机器学习、深度学习、数据科学和数据操作的帖子,请关注我的 Medium 、 LinkedIn 或 Twitter 上的 @james2pl 。此外,请访问我的网站上的资源页面,这里有很多好书和顶级课程,开始构建您自己的数据科学课程吧!
所表达的观点仅代表我个人,并不代表我的雇主的观点或意见。**
用 Python 训练神经网络的最简单方法
PyTorch 和 TensorFlow 并不是 Python 中唯一的深度学习框架。还有另一个类似于 scikit-learn 的库。

说到 Python 中的经典机器学习算法,scikit-learn 是我的首选。它有许多算法,支持稀疏数据集,速度快,有许多实用功能,如交叉验证,网格搜索等。
谈到高级建模,scikit-learn 多次失败。如果你需要助推,神经网络或 t-SNE,最好避免 scikit-learn。
scikit-learn 有两个基本的神经网络实现。有用于分类的 MLPClassifier 和用于回归的 MLPRegressor。
虽然 MLPClassifier 和 MLPRegressor 有一组丰富的参数,但没有自定义神经网络层的选项(除了设置每层的隐藏单元数),也没有 GPU 支持。

sklearn 中一个多层感知器的一组丰富的论据(图片由作者制作)。
认识 scikit-neuralnetwork
Gif 来自 giphy
scikit-neuralnetwork 解决了上面提到的 scikit-learn 的问题。虽然已经有像 PyTorch 或 Tensorflow 这样的优秀库,但对于那些来自 scikit-learn 生态系统的人来说,scikit-neuralnetwork 可能是一个不错的选择。
来自 scikit-neuralnetwork 的开发者:
scikit-neuralnetwork 是一个没有学习悬崖的深度神经网络实现!该库实现了多层感知器,作为强大的 pylearn2 库的包装器,该库与 scikit-learn 兼容,具有更加用户友好的 Pythonic 界面。
安装 scikit-neuralnetwork
安装 scikit-neuralnetwork (sknn)与安装任何其他 Python 包一样简单:
pip install scikit-neuralnetwork
定制神经网络
让我们从 Iris 数据集定义 X_train 和 y_train 来运行下面的示例:
from sklearn.datasets import load_irisdata = load_iris()
X_train = data['data']
y_train = data["target"]
sknn 提供了一种制作定制神经网络的简单方法。scikit-learn 用户对熟悉的 API 会有宾至如归的感觉:
from sknn.mlp import Classifier, Layernn = Classifier(
layers=[
Layer("Maxout", units=100, pieces=2),
Layer("Softmax")],
learning_rate=0.001,
n_iter=25)
nn.fit(X_train, y_train)
X_train,y_train 变量是 numpy 数组,所以你可以直接用 sknn 的神经网络代替你的 scikit-learn 模型。它甚至支持稀疏数据集。
卷积神经网络
Gif 来自 giphy
sknn 支持卷积神经网络。最后,你将能够在 scikit-learn 生态系统中的 MNIST 上获得最高水平的分数。
from sknn.mlp import Classifier, Convolution, Layernn = Classifier(
layers=[
Convolution("Rectifier", channels=8, kernel_shape=(3,3)),
Layer("Softmax")],
learning_rate=0.02,
n_iter=5)
nn.fit(X_train, y_train)
递归神经网络

RNNs 呢,比如长短期记忆(LTSM)或者门控循环单元(GRU)?rnn 通常用于建模序列,如时间序列或文本数据。
通过阅读文档,似乎没有对 RNNs 的直接支持。它支持本地和定制层,这使得 RNN 的实现成为可能。
来自文档:
你可以使用这个特性来实现循环层,比如 LSTM 或者 GRU,以及任何其他不被直接支持的特性。请记住,这可能会影响未来版本的兼容性,也可能会暴露代码中的边缘情况(例如,序列化、确定性)。
如果你打算和 RNNs 一起工作,我建议你学习 PyTorch 或者 TensorFlow。如果你需要一个快速入门指南,我不久前写了一篇关于它的文章:
管道

scikit-learn 有管道,它将特征转换和建模打包到一个管道中。
管道减少了过度拟合的机会,并且通常减少了各种错误的机会。在进行交叉验证或网格搜索时,它们也非常有用。
许多机器学习库不支持 scikit-learn 管道,所以我们需要自己实现它。scikit-neuralnetwork 的伟大之处在于它完全支持 scikit-learn 管道。
下面是一个管道示例,用于缩放特征和训练简单的神经网络。
from sknn.mlp import Classifier, Layerfrom sklearn.pipeline import Pipeline
from sklearn.preprocessing import MinMaxScalerpipeline = Pipeline([
('min/max scaler', MinMaxScaler(feature_range=(0.0, 1.0))),
('neural network', Classifier(layers=[Layer("Softmax")], n_iter=25))])
pipeline.fit(X_train, y_train)
查看流失预测文章,了解管道的高级用法。我展示了如何分别处理分类特征和数字特征:
GPU 支持
Gif 来自 giphy
与 scikit-learn 不同,scikit-neuralnetwork 支持 GPU,因为它基于千层面库。注意,GPU 支持需要支持 CUDA 的 NVIDIA GPU。如果你有一台 MacBook,你很可能有一个不支持 CUDA 的镭龙 GPU。
来自千层面文档:
感谢 Theano,Lasagne 透明地支持在 GPU 上训练你的网络,这可能比在 CPU 上训练它们快 10 到 50 倍。目前,这需要一个支持 CUDA 的 NVIDIA GPU,以及一些额外的软件供 Theano 使用。
要使用 GPU 后端,您只需导入:
# Use the GPU in 32-bit mode, falling back otherwise.from sknn.platform import gpu32
来自文档:
警告:由于库的设计方式,这只有在你的程序还没有导入
*theano*模块时才有效。如果在命令行上设置了*THEANO_FLAGS*,它们不会被覆盖。
结论

如果你精通 sklearn 库,那么 scikit-neuralnetwork 可能是熟悉深度学习的一个很好的起点。
当我们需要一个神经网络来替代 sklearn 算法时,scikit-neuralnetwork 也很有用。
如果你刚刚开始深度学习,或者你打算长期从事这个领域,我建议你学习 PyTorch。
在你走之前
- [Deploy Your 1st Machine Learning Model in the Cloud](https://gumroad.com/l/mjyDQ) [Ebook]- [How To Create Date Series in SQL](https://dataanalysis.substack.com/p/how-to-create-date-series-in-sql) [Article]- [Free skill tests for Data Scientists & Machine Learning Engineers](https://aigents.co/skills)- [Become a Cloud Developer using Microsoft Azure [Course]](https://imp.i115008.net/c/2402645/895504/11298)- [Master SQL, the core language for Big Data analysis [Course]](https://imp.i115008.net/c/2402645/828410/11298)
上面的一些链接是附属链接,如果你通过它们进行购买,我会赚取佣金。请记住,我链接课程是因为它们的质量,而不是因为我从你的购买中获得的佣金。
在 Twitter 上关注我,在那里我定期发布关于数据科学和机器学习的消息。

照片由Courtney hedge在 Unsplash 拍摄
Python 中的单一责任原则
一个原则来统治他们

介绍
单一责任原则 (SRP)声明一个功能或者一个类应该有一个责任。遵循这个原则将有助于保持你的功能小而易管理。
打破这个规则有时是合理的,但是你越依赖一个单独的功能,理解、更新、更改、调试或重构它就越困难。
职能职责示例
从数据库中获取数据是一项职责。
过滤、排序或转换数据是另一项职责。
存储数据是不同的职责。
将数据呈现给用户也是如此。
处理一个以上责任的职能有一个以上的理由去改变。当你必须改变一个函数时,这个函数做的事情越多,在不引入不想要的行为的情况下改变它的实现就越困难。
激励示例:从档案中提取数据
假设我有一个包含文件的目录,我需要访问这些文件中的数据。其中一些存档在。zip,。焦油或者。gz 格式,所以我也需要先提取这些档案。

Jason Pofahl 在 Unsplash 上拍摄的照片
看看下面我要完成的功能:
这看起来很简单,对吗?简短易懂,为什么要拆分?
短函数并不总是足够的
可惜这个小功能做多了。你可以认为这个函数在 5 行代码中有 3 个职责:
- 它遍历给定目录中的文件。
- 它确定文件是否是归档文件。
- 如果它将文件识别为归档文件,它会提取其中包含的文件。
随着职责的增加,复杂性呈指数级增长
如果这个函数以它当前的形式做了你需要它做的所有事情,并且永远不会改变或被再次看到,那么它当前的形式就足够了。不是每个功能都需要不断地分解成更小的子功能。
但是,请考虑以下情况:
- 您需要更改正则表达式,以指定更多需要提取的归档类型。
- 您有一个嵌套的目录结构,例如当一个归档包含一个目录或另一个归档时。
- 您正在 Windows 上开发,归档中的一些文件路径超过了 Windows 的 260 个限制,这使得
shutil.unpack_archive无法提取文件。 - 除了归档文件之外,您还有另一种文件类型,必须以不同的方式准备。
- 您有一个额外的归档格式,它不是由
shutil处理的。 - 你不需要或者不能提取存档中的所有文件,所以你必须使用低级的存档处理函数,比如
zipfile、tarfile和gzip,而不是shutil.unpack_archive。
遇到这些情况中的任何一种,或者更有可能是它们的组合,都可能使您的小函数变得非常复杂。我在处理与我们的例子类似的任务时遇到了上述所有情况。
如果这 3 项职责中的每一项都有 3 个单独的案例需要你去处理,那就是 3 或 27 个组合。你整洁的小功能很快就会变成一团乱麻。

如果你确定你不会有任何更新或者棘手的情况(你没有),上面的函数就足够好了。对我们其余的人来说——我们只是凡人,我们处理的不是微不足道的问题,所以我们必须防范不可预见的事情。
基于单一责任原则的重构
假设我不需要或者不能从特定类型的归档中提取文件。对我来说幸运的是,这些档案的名字都带有前缀“skip_”。
现在,确定文件路径的逻辑变得越来越复杂,所以我想将文件路径的生成与函数的其余部分分开。
下面的代码将上述函数分成三部分,一部分用于创建文件路径列表,一部分用于确定是否应该提取文件路径,另一部分用于遍历这些文件并调用提取函数:
注意get_archive_filepaths实际上和我们的原始函数长度相同!较短的函数通常更好,但在这种情况下不一定如此。
构建archive_paths的 5 行代码可以做成一个单行的列表理解,但是我认为结果会不太清楚。
随着职责的增加,我们的职能仍有改进的空间,但我们有了一个良好的开端。通过分离提取数据的逻辑和生成文件路径列表的逻辑,对一个函数的任何更改都不会影响另一个函数。
使用单一责任原则的经验法则
尽量完整简洁地描述你的职能目的。如果不使用“和”这个词,你不能在一个简短的句子中完整地描述你的函数做什么,那么你的函数可能应该被拆分。
示例:"prepare_files遍历给定目录中的文件来定位归档文件和提取它们的所有文件。"
使用单一责任原则来保持不断增长的代码有组织
这么说吧,我除了解压存档,还需要准备 excel 文件。Excel 文件可以在其中任何一个。xls 或者。xlsx 格式,我需要把它们转换成。csv 格式。
以下是主要职责的概述:
- 遍历目录中的文件。
- 对于每个文件,确定它是归档文件还是 excel 文件。
- 如果是归档文件,提取文件。
- 如果是 excel 文件,则转换为. csv。
这里有一种方法来构建您的功能,使每个功能处理上述职责之一:
现在每个功能都有一个单独的职责。因为职责之一是从已知的档案中提取数据,所以直接打电话给shutil.unpack_archive是合适的。没有必要将它包装在您自己的函数中,除非您必须用它做额外的事情。
请注意,我不再构建文件路径列表。我可以制作一个归档文件路径列表和一个 excel 文件路径列表,类似于第一个例子中的get_archive_filepaths,但是由于附加的文件格式,遍历文件一次并在函数遇到相关文件时立即准备它们会更简单。

这样的结构变化是好的。不要被束缚在一个不再有意义的结构上。你控制着代码,所以当你找到更好的方法时,改变它的结构。
提醒一句
记住过早的优化是万恶之源。抵制根据你可能永远不会遇到的边缘情况拆分功能的冲动。你可能会浪费时间去制造一些你根本不需要的东西。
等到你被迫考虑那些边缘情况时,再考虑重构。
编码快乐!
数据分析中的六大陷阱及其规避

图片:来源
任何从事数据分析工作的人都知道遵循流程开展工作的重要性。这样,我们保证不会跳过重要的步骤,我们可以对时间表有一个清晰的概念——我们从哪里开始,我们想去哪里——以及在这个过程中发现了哪些挑战。
一个已定义的过程也有助于报告分析的当前状态,并且它帮助我们组织我们自己来交付一个更好质量的分析。
我们在文献中有一些参考资料可以利用。数据页面中的女性发布了一个金字塔,显示了分析过程中几个有趣的点。
有六个步骤:框定问题,收集问题所需的原始数据,处理数据进行分析,探索数据,进行深入分析,并交流分析结果。

每一步都有其目的,并在生成有价值的信息方面起着关键作用。
在本文中,我们将介绍数据分析通常遵循的步骤,以及随之而来的陷阱和如何逃脱它们…
每一步的陷阱!
在下图中,我们可以初步了解步骤和陷阱之间的关系:

正如我们所看到的,不是所有的步骤都包含陷阱,有些步骤不止一个。
现在您已经对数据分析过程有了一个大致的了解,是时候更深入地了解每一个步骤了!
台阶
步骤 01:框定问题
这是开始分析后所有问题的答案。
当我开始一项分析时,我喜欢认为,为了便于理解这项工作,我们必须首先列出两点:
1-我们想回答什么问题?
在我们分析的最后,我们想要得到什么问题的答案?这很好地指导了接下来的步骤。基于此,我们将更好地知道我们的分析采用哪种策略。
此时,重要的是与相关人员交流并保持一致,是什么问题导致了这一分析请求,需求是如何产生的,等等。
此外,这让我们怀疑我们所花的时间是否会产生价值。
2-分析结论中有哪些可行的见解?
根据我们想要回答的问题的答案,您想要如何处理这些信息?你想要什么样的决策?
没有这些答案,你就可能陷入【不知道解决哪个问题】的陷阱,开始没有方向的分析。此外,考虑到沟通不畅的风险,分析结论可能与预期有所不同…
这些答案也将极大地指导数据的选择,将被使用的假设,选择哪种抽样方法,并且也质疑这个问题:我们正在研究正确的问题吗?有没有其他的角度可以考虑?
因此,在这一步花费必要的时间,因为我们识别问题的方式将决定分析的背景、目标、意义和范围。
重要的是记住提到的问题的答案,当新的疑问出现时,我们将能够总结分析的目标,并强化你已经做出的决定。
此外,请记住,可能会遇到新的问题,这些问题将补充范围并加强所采用的前提和方法。
第二步:收集你的问题所需的原始资料。
在这一步,我们需要从来源收集数据来回答提出的问题。
在提取数据或创建数据库之前,我会做一个很好的练习,就是画出我认为能回答这些问题的最终输出,无论是在纸上还是在 excel 中。通过这种方式,我们可以可视化重复或不必要的数据,这些数据可能会妨碍他们的分析,无论是在提取性能还是混淆公众。
而这里的陷阱“带来数据解决宇宙中所有问题”都能碰到。有时,当我们开始提取数据时,保留多余的数据是很常见的,比如“如果他们要求这些数据怎么办?最好把它留在数据库里..”突然,我们有了很多数据,但这些数据无助于回答这个问题,这给我们带来了更多的工作,因为对于那些从事数据分析的人来说,有一件事是事实:
如果你要处理这些数据,你有责任保证质量。
为什么我们要浪费时间去做无济于事的数据质量分析?
步骤 03:处理用于分析的数据
在这一步,我们将了解提取,做数据质量,并清理数据。
这看起来是一个简单的步骤,但数据很难保持一致。相反,许多数据的格式与您所需要的不同:字段为空或者与预期的不同,与团队认为的类别不同,等等。
提出这些错误是我们工作的一部分,更重要的是,与负责人分享这些错误,以确保公司能够看到这些错误。因此,更容易对这种校正的交付进行优先级排序,其他区域也知道,并且公司更有信心它没有使用错误的数据。
步骤 04:浏览数据
随着数据的提取和验证,是时候进入探索的世界了。在这个阶段,我们很可能想要了解两个变量之间的关系,分析它们在不同数据集群中的行为,比较不同的场景,等等。
当你开始分享对你的分析的第一个见解时,许多其他问题出现了:
——“你为什么不也分析一下这个变量?”
——“为什么不用这个前提模拟一个结果呢?
-“你为什么不改变日期范围?”
诸如此类……而在那些时刻我们可以进入所谓的【下兔子洞】,灵感来自小说《爱丽丝梦游仙境》。

在小说中,爱丽丝掉进了一个兔子洞,这个兔子洞把她带到了一个充满奇特生物的神奇地方,揭示了一个荒谬的逻辑,最后当她受到女王士兵的攻击时,爱丽丝醒来,发现整个旅行是一场梦…
什么意思?
有时候我们进入了一个分析和更多分析的循环,持续了很长时间却没有意识到。
自然,好奇随着结果而产生,但我们必须永远记住这个问题:
这个额外的分析能帮助我们回答主要问题吗?
如果是这样,花点时间,但是给自己相当多的时间不要卡住。如果没有,把它写在你的待办事项清单上。
另一个常见的陷阱:《糟糕的时刻》。这是关于遭受这些各种各样的问题,开始怀疑分析的目标,如果你是在遵循正确的道路…这是相当普遍的,你经常最终独自承受痛苦。在这些时候,保持冷静并与团队分享这些痛苦和见解是非常重要的。他们将帮助你验证,提出新的假设,并加强分析的重点。
为此,利用所有可用的沟通渠道:会议、电子邮件等。
又一个陷阱:“我没有结果”。
通常,数据分析任务需要很长时间,特别是当我们处理有错误的数据,或者不同的业务规则时,它经常会给人一种我们没有交付的感觉。

但是,有必要记住,识别数据中的错误,甚至是对图形的怀疑也被视为交付。
我们不需要仅仅为了有这种接近的感觉而结束分析。
步骤 05:进行深入分析
在分析中深入细节很重要,这既是为了验证数据,也是为了支持结果和结论。这可以避免你的分析出现偏差。
你需要了解数据中反映不同行为的变量是什么,并在那个层面上分析信息。
例如,在一项房地产销售分析中,一处房产的价值会因州、城市和社区级别的不同而有很大差异,因此在分析中必须将这些因素都考虑在内。
步骤 06:传达分析结果
如果没有关于问题和洞见的结果的交流,就没有完整的分析。
这给你一种封闭的感觉,这里是最后一个陷阱:“不相信自己”。不要羞于展示结果。如果你已经深入分析并讨论了所采用的方法和策略,你肯定会为可能出现的任何问题做好准备。
如果有任何你不知道答案的问题,可以说你不知道,你将研究。认识到你没有所有的答案是你作为专业人士成熟的一部分。
结论
到目前为止,我所说的一切都是基于我的经验,我从每次分析中学到的教训,以及我今天如何处理每个陷阱。
我相信无论你的工作是什么,都应该是令人鼓舞的,总是激励你的,所以你必须克服这些可能让你坚持甚至让你放弃的时刻。
总会有挑战要克服,没关系的!停下来反思:你是如何克服的?下次你就已经知道如何逃跑了。
你有什么问题吗,你还记得其他陷阱吗,或者你有什么建议吗?在评论里发帖!
热量方程的解
两种方法:分离变量和傅立叶变换

图片由作者提供。欲知详情,请向下滚动至增刊:)。
热传导方程是最著名的偏微分方程之一。它不仅在物理学中非常重要,而且在许多其他领域也非常重要。有时候一个看似无解的偏微分方程可以化为一个我们知道如何求解(或者很快就会知道如何求解)的热方程。这方面的一个例子是 Black-Scholes PDE 的解决方案,它模拟了股票价格和期权价格之间的关系。
我的物理知识仅限于高中物理,而且因为遗忘机制,越来越差。然而,这个职位的任务是解决热方程,也作为典型的抛物型偏微分方程,热方程也在纯数学研究。理解它是如何解决的,并不需要太多的物理学知识(所以我在这个题目中也不是完全没用)。这篇文章将关注解决方案,而不是物理意义。
热量方程非常详细的推导可以在保罗的在线笔记中找到。
格式说明:这篇文章中有很多公式,我用了不同的颜色使它们不那么杂乱。黑色部分很重要,至少是解方程的程序部分。蓝色部分不太重要,它们是附加的细节或一些背景。棕色中有两个公式,它们是属性。我还在公式周围使用了不同的字体和方块来突出事物。
问题的表述
考虑⊆ ℝⁿ大学,这是一个开放的和成立的集合,热方程给出如下

方程 1.1 热量方程
其中 u 是空间矢量 x 和时间 t 的函数。不考虑热扩散系数(设为 1)。等式右边是拉普拉斯算子,定义为二阶导数。t 在区间(0,∞)中取值,x 在区域 u 内。我们有以下边界条件

边界条件
这意味着在物体的边缘,温度是零,开始时,每个点的温度由函数 f: U→ℝ.给出
变量分离
顾名思义,这种方法将变量 x 和 t 分开,放在等式的不同一边。这是可能的,因为 x 和 t 是独立变量,这意味着 x 不是 t 的函数,反之亦然。该方法的第一步是假设解具有以下形式

等式 2.1 我们的假设
我们选择这种形式的唯一原因是这样行得通。这是解热方程的第一个难点。现在,我们将等式 2.1 代入等式 1.1,得到

将等式 2.1 替换为等式 1.1
我们知道偏导数是如何工作的:当计算关于 t 的导数时,其他变量作为常数处理。因此,我们可以在 LHS(左手边)上分解出 v(x ),在 RHS 上分解出 w(t ),得到等式 2.3。从等式 2.3 到等式 2.4 是微不足道的。把它写得更简洁

等式 2.5 是等式 2.4 的紧凑形式
现在变量是分离的:在 LHS 上只有 x,在 t 上只有 t。使等式 2.5 中的等式成为可能的唯一条件是 LHS 和 RHS 都等于相同的常数。

等式 2.6 两边只可能等于一个常数
从方程 2.6 我们得到两个常微分方程(方程中只涉及一个变量)

等式 2.8 的一般解可以立即看出,它是

方程 2.9 方程 2.8 的一般解
其中 c 是某个常数。同时,方程 2.7 的解不是如此平凡,我们需要解下面的微分方程

其中 v(x)定义在整个 U 上,我们设 λ = - 。v(x) = 0 是边界条件,即边上的热量为零,U 上各点的热量由 f(x)给出,与方程 1.2 相同。等式 2.10 中陈述的问题被称为斯特姆-刘维尔问题(只是一个旁注,我们不需要知道这个来求解等式 2.10),它具有一般形式

方程 2.21 斯特姆-刘维尔问题
其中 p 和 r 为非负函数,p,q,r 为具有边界条件的[a,b]上的连续函数

Sturm-Liouville 问题的边界条件
Sturm-Liouville 问题并不总是有非平凡解。如果存在非平凡解,那么λ就是边值问题的特征值,解就是特征函数。回到热方程,方程 2.10 的特征函数和解是

对于特征根(异根、重根、虚根)特征对应的微分方程的解,我发现这个很有帮助。
回想一下我们讲过的边界值是 v(x) = 0 在 U 的边界上,如果我们考虑最简单的情况——一维杆上的热传导,U 可以是一个区间例如[0,L]。λ有三种情况
情况 1: λ = 0。这是最简单的一个,得出方程 2.10 的解是 v(x) = Ax + B 的形式,代入边界条件后,我们会发现在这种情况下,只有平凡解。因此,零不是特征值。
案例二:λ < 0。在这种情况下,两个根都是真实的,解决方案在形式中

等式 2.22 两个实根,λ < 0
把 v(0) = v(L) = 0 代入边界条件,可以看出 A 和 B 都应该为零(e 的某次方总是正的),因此,一个正的λ又不是一个特征值。
案例三:λ > 0。在这种情况下,没有真正的根,解看起来像

方程 2.23 没有实根,λ > 0
把 v(0)= 0 代入方程 2.23,我们马上看到 A 一定为零。然后我们代入 v(L) = 0,现在我们有了

因此,v(x)由下式给出

等式 2.25
这是一个本征函数,我们已经得出结论,只有正的本征值。已经很接近胜利了。结合我们之前得到的 w(x)的解

概述
我们可以把第 n 个解写成如下

等式 2.26
根据叠加原理,方程 2.26 中描述的所有解的线性组合也是一个解。这意味着如果我们总结一下

等式 2.27 是等式 2.26 的总和
等式 2.27 是最终解,这正是傅立叶正弦级数,其中寻找 Dₙ只是寻找傅立叶级数中系数的问题,可以使用公式找到

如果你对傅立叶级数感兴趣,点击这里。
使用傅立叶变换
这种方法扩展了以前的分离变量法,以求解定义在无限或半无限区间上的偏微分方程。想想傅立叶级数和傅立叶变换的区别:傅立叶变换把周期的连续函数分解成频率分量,傅立叶级数用那些正弦和余弦函数来近似一个非周期的连续函数——它是傅立叶变换的一个近似(傅立叶变换可以认为是傅立叶级数的极限)。这可能有助于理解这两种方法给出的最终解之间的差异。
傅立叶变换和傅立叶逆变换被定义为

等式 3.1 傅立叶变换等式 3.2 傅立叶逆变换
它将一个函数从时域转换到频域。注意,傅立叶变换和反函数在这个符号中不是完全对称的。因为角度符号破坏了对称性。[7]在介绍这种方法之前,我们需要熟悉卷积理论和傅里叶变换的两个性质。两个函数 f 和 g 的卷积是在(-∞,∞)上的如下积分,记为 f*g。

等式 3.3 卷积
卷积理论认为
两个函数的卷积的傅立叶变换是它们的傅立叶变换的乘积。
形式上这意味着

等式 3,4 卷积定理
现在我们可以转移到两个属性:
- 时间导数是可以拉出来的,用傅里叶变换的定义很容易证明。请注意,傅立叶变换是一个线性运算符。

等式 3.5 属性 1
2.对函数导数的有趣影响。这可以通过两次分部积分来证明。

等式 3.6 属性 2
事实上,一般来说,如果 f(x),f’(x),…,f⁽ⁿ⁻ ⁾(x) 都是傅立叶变换的,并且如果 f⁽ⁿ⁾(x) 存在(其中 n 是自然数),那么

等式 3.7
为了使用傅立叶变换来求解热方程,第一步是在以下两个方程的两侧执行傅立叶变换——热方程(等式 1.1)及其边界条件

催单
这意味着我们可以做到以下几点

这里我们稍微改变一下符号,以便更清楚地利用傅立叶变换的特性(等式 3.5、等式 3.6),这就给出了

我们很容易看出,方程 3.10 是一个常微分方程,所以它的解是

方程 3.12 方程 3.9 的解
其中 A(ω)是ω的函数。我们可以这样处理ω,因为在方程 3.10 中,微分是关于 t 的,因此,ω被当作常数。将方程 3.12 代入方程 3.11,我们得到

等式 3.13
这一步实际上是微不足道的。现在我们已经开始

等式 3.14
傅里叶变换(频域)后的解已经找到。然而,我们怎样才能从方程 3.14 出发呢?答案是我们需要“逆向工程”来利用卷积定理——我们需要一个函数 S(x,t ),使得

等式 3.15
这个不难,用傅里叶逆变换就行了

等式 3.16
再看 3.14,这个其实和

等式 3.17
它是频域中两个函数的乘积。这是使用卷积定理(等式 3.4)的时候了,该定理说傅立叶变换将时域中的卷积变为频域中的乘积。如果我们颠倒这一过程,频域中的乘积可以转换回时域中的卷积。这意味着在等式两边的傅立叶变换反向之后。3.17 我们可以得到

等式 3.18
方程 3.18 给出了边值问题的最终解。
摘要
这篇文章的主题是热量方程,但我们不讨论推导(这个模型是如何获得的),而是关注热量方程的解。介绍了求解热传导方程的两种方法,一种是定义在有界区域上的热传导方程的分离变量法。另一种是用傅里叶变换求解,它把第一种方法推广到无限域上的方程。这篇文章的封面图片中包含了一个例子。在补充资料中,你可以找到相应的公式。
补充
本帖的封面图片展示了热量方程及其解

等式 4.1
在区间[0,1]上。沿着一维杆的初始热分布由下式给出

等式 4.2
随着时间的推移,棒上的热分布变得越来越均匀。
资源:
https://edoras.sdsu.edu/~mthomas/f17.705/topics/iter_solv/AeroStudents.com.theHeatEquation.pdf热度方程。于 2021 年 9 月 27 日访问
[2]保罗·道金斯。 分离变量 。于 2021 年 9 月 28 日访问
[3]迪特尔克。 求解热量方程 。于 2021 年 9 月 27 日访问
[4]西瓦吉·加内什。斯特姆-刘维尔问题。于 2021 年 9 月 28 日访问
[5] Arfken,G. B .,& Weber,H. J. (1999 年)。物理学家的数学方法。
[6] Helena McGahagan,用傅里叶变换求解热方程。于 2021 年 9 月 29 日访问
[7] Weisstein,Eric W. 傅立叶变换。来自 math world——一个 Wolfram 网络资源
学习新数据或编程技能的阶段
解释掌握新数据或编程技能通常需要的基本步骤

图片来源:https://unsplash.com/photos/bJhT_8nbUA0的 Jukan tate isi
许多人令人钦佩地寻求学习数据科学、数据分析、编程语言或其他一些数据或编程技能,以便在专业上发展自己和/或寻求新的职业道路。令人兴奋的是,在线学习这些技能变得更加容易。但这种在线学习也可能助长对学习这些技能之一所需要的东西的不切实际的理解,因为它可能会将潜在的学习者从帮助潜在的学习者了解该领域期望的专家的物理社区中移除。
本文的目标是通过解释掌握新数据或编程技能通常需要的基本步骤来帮助纠正这种情况。这将有助于告知学习技能所需的高层次期望,同时也有助于你选择正确的课程或课程集,以确保你发展所有三个阶段。
对于数据技能,我指的是任何数据领域,如数据科学、数据分析或数据工程,或者某个数据领域中某人可能寻求学习的任何特定技能或实践,而对于编程技能,我指的是学习和用编程语言编码所必需的技能。
以下是掌握这些主题的三个基本学习阶段:
第一阶段:掌握题目的基本概念
阶段 2:完成指导项目
阶段 3:完成一个自我指导的项目
第一阶段:掌握基本概念

图片来源:qimono athttps://pix abay . com/illustrations/cog-wheels-gear-wheel-machine-2125178/
掌握基本概念需要学习相关的词汇、句法和关键方法。通常程序清楚地教授每个概念,一次一个。例如,当学习一门新的编程语言时,您可能会学习主要的命令和语法规则,对于数据科学,您可能会一次学习一个最著名的机器学习模型。
这不同于广泛应用概念,在这个阶段,你可能还不能处理将所有概念混合在一个复杂的问题中(这是阶段 2)。程序通常在这一点上按顺序教授材料(尽管这对非线性学习者来说可能很难)。
例如, W3Schools 为大多数编程语言和数据科学技能提供基础的第一阶段教学。它们提供了一系列练习,贯穿一门新语言的基本语法成分,在这个过程中,复杂性稍微增加了一些。
现在,仅仅表演第一阶段并不能完全掌握主题。在一次练习一个片段后,你还必须过渡到第二阶段,在那里你开始学习如何在完成一个更复杂的问题时将它们结合起来。
第二阶段:引导项目

图片来源:https://unsplash.com/photos/lG-6_ox_UXE的邦尼瓦尔·塞巴斯蒂安
在这里,你通过一个指导项目练习将所有的部分组合在一起。这个指导性项目是一个模型,展示了在实际项目中每个组件是如何组合在一起的。我将这些比作构建乐高积木套件:按照一步一步的指示来构建一个很酷的模型(而不是从零开始构建自己的对象,这是阶段 3)。他们握着你的手直到完成,来说明在一个复杂的项目中把所有孤立的技能和概念放在一起会需要什么。
第三阶段:独立项目
在第三阶段,你把学到的所有东西集中在一起,独自完成一个项目。不像在第二阶段,当他们握着你的手,你现在有斗争的自由,这是学习所必需的。你正在发展自己形成和执行一个项目的技能。

图片来源:https://unsplash.com/photos/UVyOfX3v0Ls的霍莉·曼达里奇
与此同时,你正在学习如何在现实生活项目中“野外”实施这些技能。在前面的阶段,教师经常溺爱他们的学生:提供你可能在教科书中找到的、学习基本概念所必需的、干净的、完全现成的例题。就像乐高玩具一样,这个项目的组件已经被修饰过,可以制作出你正在制作的东西。在第三阶段,当你必须找到你需要的部分和/或想出如何利用你现有的部分时,你通常会开始体验现实世界项目中常见的混乱。
例如,在数据科学学习者中,这个阶段是学生第一次学习处理为他们的问题找到正确数据的复杂性的时候;确定给定数据集的最佳问题;和/或清除不一致的数据。在此之前,大多数示例可能已经清理了与构建它们的特定任务相匹配的数据。
学习如何开发自己的项目,往往需要一定的试错。在这个过程中,你的导师可能会扮演更多的后座角色,检查你做了什么,回答你可能会有的任何问题,并在必要时轻轻推你一下。根据我的经验,自己探索策略是学习阶段 3 的最好方法。希望在这一切结束的时候,你会产生一个漂亮的项目,你可以展示给未来的雇主或任何你想留下深刻印象的人。
结论
这是发展对新数据或编程技能或领域的初步掌握的三个最常见的阶段。现在,它们是学习新技能通常需要的技能水平,但是在你完成这些之后,还有很多更高的学习水平。例如,掌握基本的数据科学概念,完成一个指导项目,并学习如何开展自己的自我指导的数据科学项目,这足以让你成为数据科学社区的新成员,但你仍然是一名新手数据科学家。作为一名数据科学家,你能学到什么以及如何成长,这只是冰山一角。

照片致谢#5:乔治·巴科斯在https://unsplash.com/photos/VDAzcZyjun8
现在,尽管称它们为阶段,但并不是每个人都按顺序学习它们,特别是考虑到各种各样的情有可原的情况和学习风格。例如,有些人可能完成了他们正在学习的领域中特定技能子集的所有三个阶段,然后回到第一阶段学习另一个子集。大多数教育项目都会或多或少地包括这三个阶段。
然而,一些教育项目可能完全缺乏或不能为一两个阶段提供足够的资源。评估一个项目是否充分包括了这三个方面,这是一个有效的方法来确定他们在教学方面有多好,以及他们是否值得你的金钱和/或时间。当选择学习一项新技能时,我会推荐一个包含这三者的项目或项目组合。如果你想做的或者正在完成的项目缺少其中的一两个阶段,你可以试着在网上找到另一种方法(希望是免费的)来完成这个阶段。例如,在线课程和教程经常无法提供第三阶段(在某些情况下,第二阶段),所以在你完成一个后,我会建议你找一个项目来做。
最后,当你在学习中遇到困难时,可能是因为你需要回到以前的阶段。例如,当许多学习者进入第二阶段时,当他们看到一些核心概念以新的方式应用时,他们必须定期回到第一阶段来复习这些概念。同样,在完成第三阶段的一个项目时,复习第二阶段甚至第一阶段的材料也没有错。
现在,要小心,因为你可能会错误地认为这是。学习任何东西都会令人沮丧。有时候,你遇到的困难并不是源于需要复习或重新学习过去的材料,而是你只需要坚持学习新材料,直到你开始理解为止。在这种情况下,一些学生回到一套材料中,在其中他们可以感到安全和自信,而不是挑战自己。然而,即使在这种情况下,就像倒车时摇晃汽车,然后开车越过一个凸起,快速后退可以帮助你向前越过障碍。在这种情况下,最重要的是了解你自己——你的学习倾向和你通常如何应对——并尽可能多地咨询该领域的导师和/或专家,他们会帮助你确定克服任何挑战的最佳方法。
最初发布于此:https://ethno-data . com/the-stages-of-learning-a-new-data-or-programming-skill/。有关该网站和其他文章的更多信息,请访问https://ethno-data.com/。
也感谢《数据科学》杂志发表这篇文章。关于他们工作的更多细节,见 本 。
MLOps 2021 的状态
不仅仅是炒作。许多团队都支持 MLOps

人口统计数据
对于 2021 年 MLOps 调查,我们从 Valohai 社区收集了 100 份回复。虽然 Valohai 产品与 MLOps 相关,但我们发布的内容更广泛地与数据科学相关。
从地理上看,受访者主要来自欧洲、美国、印度和中国。27%的受访者在技术领域工作,其次是金融服务(14%)、咨询(12%)和医疗保健(12%)。虽然技术领域绝对过于宽泛,无法提供深刻的见解,但我们的轶事证据表明,金融和医疗保健行业正大量参与 MLOps 场景,并拥有成熟的机器学习计划。然而,这两个部门也有独特的挑战需要 MLOps 来解决,即围绕透明度、隐私和安全性的监管。
角色
不出所料,最大的受访者群体是数据科学家,占 30%。其次是 18%的 ML 工程师,18%的其他,16%的数据科学领导者。令人惊讶的是,数据工程师的比例相当低,只有 6%。
你的头衔是什么?

作者图片
我们从之前的研究和在线讨论中发现,数据科学中的头衔和角色在这一点上还远远没有固定下来。因此,我们提出了一个相关的问题,即什么最能描述受访者的角色,35%的受访者回答说他们的重点是构建模型和基础架构。相比之下,较小的团队可以专注于其中一个(15%只构建模型,14%只构建基础设施)。
哪一项最能描述您的角色?

作者图片
我们已经注意到,我们围绕角色定义(即数据科学家与机器学习工程师)发布的内容似乎引发了大量辩论,这些结果似乎证实了角色绝不是明确的。例如,一家公司的数据科学家可能对构建基础设施和设置工具至关重要,而在另一家公司,该任务是更专业的工程师角色。
哪一项最能描述您的角色(仅限 IC 角色)?

作者图片
然而,如果我们只关注三个答案(不包括领导团队,以上都不包括),并比较 2020 年的结果,我们可以看到专注于建设基础设施的群体有所增长。虽然至多是一个微弱的信号,但总的来说可能会有一些专门化发生。
组
机器学习相关的角色仍然广泛的原因可能在于大多数参与机器学习的团队相对较小,没有专业化的空间(至少目前没有)。我们询问您的组织中有多少员工从事机器学习或数据科学工作,最受欢迎的答案是 2–10 人(56%)。即使在拥有 1000 多名员工的公司中,11-30 名员工从事 ML 工作也是最常见的答案。
你的公司有多少员工?

作者图片
贵公司有多少员工从事数据科学或机器学习工作?

作者图片
未来研究的一个令人兴奋的领域可能是数据科学团队的重要性(在公司规模的背景下)、机器学习成熟度和财务成功之间的关系。一群新生的公司正在围绕机器学习构建他们的价值主张。看看这些组织是否从底层开始更好地构建以增强人工智能能力,这将是一件有趣的事情。
在接下来的 3 个月里,你预计你的团队会有怎样的变化?

作者图片
然而,更直接的是,机器学习领域正处于大规模招聘热潮中。事实上,65%的受访者预计他们的 ML 团队将在未来三个月内增长,而只有 2%的人预计团队将缩小。
焦点区域
与去年一样,我们询问受访者未来三个月的工作重点(最多 3 个选项)。结果再次表明,机器学习模型的产品化取得了重大进展。
在接下来的三个月里,你的重点是什么(最多 3 个选择)?

作者图片
与去年相比,生产中的监控型号增长最为显著(13%至 31%)。支持这种热情的是监控领域的大量工具,这些工具脱颖而出(包括 Arize、Fiddler、superwise.ai 等。).
模型的自动化再训练也获得了类似的受欢迎程度(从 2020 年起翻了一番),30%的受访者专注于为此建立机器学习管道。虽然并非详尽无遗,但结果支持团队在过去一年中朝着 MLOps 迈出了大步,实现机器学习系统(而不是项目)是首要任务。
“机器学习的证明潜力”的下降也支持了这一点,因为它通常表明建立了第一个机器学习概念证明。在过去的一年中,优化模型似乎在优先级上后退了一大步。
工具作业
在实践中,工具是实现 MLOps 的重要部分。在调查中,我们询问了受访者他们有什么工具,他们希望实现什么(在接下来的三个月中),以及目前什么是不相关的。拼接 MLOps 工具的方法有很多,但没有一种方法能够与现有工具保持一致。如前所述,市场上有广义和狭义的解决方案,它们适合不同的目的。
作为调查的基础,我们使用了我们的 MLOps 堆栈蓝图,它包含以下组件:数据分析、实验、功能存储(或培训数据管理)、代码存储库、机器学习管道、元数据存储、模型服务和模型监控。
您目前在哪些领域建立了工具?

图片作者。总数低于 100%,因为某些参与者选择不回答。
看看那些已经建立了工具代码库的领域。考虑到 Git 十多年来一直是软件开发的标准,并且数据科学家也采用了它,这并不奇怪。此外,数据分析(68%)和实验(56%)也相当成熟。
在产品化方面,50%的受访者认为他们有足够的机器学习管道工具,33%的受访者在未来几个月内寻找解决方案。模特服务分成 39%和 39%。
受访者对新解决方案最感兴趣的领域是模型监控(52%)、模型注册(43%)和特征存储/培训数据管理(41%)。与已经拥有监控解决方案的受访者相比,寻求此类解决方案的受访者数量翻了一番。
总的来说,在实验方面,工具更加成熟,而产品化则不那么成熟。然而,考虑到“目前不相关”是几乎每个组件中相对较小的一部分,在采用工具时似乎没有犹豫。
结论
MLOps 和产品化机器学习模型的数据科学场景作为一个整体在哪里是一个没有好答案的问题。然而,MLOps 2021 调查的状态为我们提供了令人鼓舞的证据,表明生产中的机器学习正在加速发展——不仅是在头条新闻中,而且是在行动中。
调查结果代表了我们社区的一小部分,因此自然会有偏差,但对于希望投资 MLOps 工具的决策者或希望深入研究 MLOps 的个人贡献者来说,趋势看起来令人鼓舞。
最初发表于【https://valohai.com】。
2021 年网络分析的现状
过去几十年来网络的变化对我们如何衡量网站上的活动有很大的影响
在过去 25 年左右的时间里,网络分析已经有了很大的发展。从最初的 Webtrends 和分析原始服务器日志文件以了解服务器上请求最多的页面,web analytics 现在可以帮助企业比以往更详细地了解他们的 web 应用程序和平台上正在发生的事情。
但我们是如何走到今天这一步的呢?在这段时间里,技术发生了巨大的变化,人们使用网络的方式也发生了巨大的变化,值得回顾一下我们已经走了多远,并理解为什么事情会以这样的方式发展。
在 21 世纪初,网络是一个非常简单的地方。我们有几乎没有互动的静态网站。Javascript 和 CSS,这些赋予网络光泽并使其更具吸引力的语言远没有现在复杂。不仅支撑网络本身的技术比今天更加基础,人们使用网络的方式也更加简单。几乎没有人拥有我们今天所说的“智能手机”,即使他们有,无线互联网也非常受限,你可以在上面访问的网站也是如此(iPhone 直到 2007 年才发布)。大多数人通过一台电脑上网——通常是每家一台。
处于婴儿期的网络
当人们浏览网页时,他们可以在网上做的事情也更少了。电子商务仍处于起步阶段,你可以在上面购买的商品和产品范围有限(Amazon.com 才刚刚从卖书拓展开来)。有一些社交媒体平台(MySpace,脸书东部时间。2004),但没有智能手机的普及,对用户生活的影响很小。人们上网是为了浪费时间的想法并不常见。用户更有可能去他们的电脑“上网”(就像是一个活动或事件),而不是总是能即时访问互联网。

经扫雪机许可|归功于扫雪机团队
互联网上的内容消费几乎完全基于文本和图像,主要是文本。连接速度远远不够快,无法实现可靠的点播音乐或视频播放。
不仅从用户的角度来看是不同的,对于品牌和企业来说也是不同的。许多品牌根本没有任何在线存在(当然不是在社交媒体上)。即使你这样做了,你的在线营销和广告选择也仅限于静态横幅广告(通过在网站上保留一个位置有限的时间来付费)、电子邮件简讯和通过谷歌的付费搜索广告(谷歌至少在此时已经确立了自己作为头号搜索引擎的地位)。
在这个更加受限的网络时代,网络分析很容易迎合这种用户行为。这种页面视图->访问->访问者模型(后来更普遍地称为页面视图->会话->用户),通过单一设备,从单一位置,出于单一目的,到简单和静态的网站,意味着理解用户在你的网站上做什么是相对简单的。
哪里赢得了网络(分析)
2005 年,谷歌收购了海胆,并更名为谷歌分析。它在网站的每个页面上放置了一小块 Javascript 代码,可以即时跟踪页面浏览量、设备类型和流量来源。谷歌还让谷歌分析免费使用。这被证明是谷歌的一个非常明智的举动,让他们在行业中掀起了波澜——无论是对他们自己还是整个行业。
随着时间的推移,GA 进一步开发了功能,包括事件跟踪(例如,跟踪网站周围的表单和点击等交互)、电子商务跟踪以及与其他谷歌营销产品(如谷歌 AdWords 和谷歌网站管理员工具)的集成。
鉴于用户行为和网络技术比今天简单得多,GA 有能力帮助分析师回答这个时候有意义的问题。加上其免费的价格点,谷歌能够给大众带来网络分析。
网络革命
然而,随着时间的推移,人们使用网络的方式发生了显著的变化。iPhone 于 2007 年发布,改变了用户在旅途中和在家的浏览方式,2010 年的 iPad 也是如此,只是程度稍轻。网络连接变得更快、更可靠(包括宽带和移动网络),这使得视频和音乐流媒体点播以及直播成为可能。
Web 技术和框架(如 React、Angular 和 Vue)已经开发出来,使得 web 应用程序在 21 世纪初还只是白日梦。今天你可以在网上购买比以前更多的商品(汽车、股票/股份/期权、杂货、ISAs 等),这使得用户更频繁地访问网络。不仅如此,我们现在可以通过在线和移动银行管理我们的财务,开始与在线约会应用程序和服务建立关系,用健身应用程序跟踪我们的健康状况等。
如果你是一家企业,情况也是如此(通过 Xero 或 Quickbooks 处理财务,通过 Zendesk 提供客户支持,使用 BrightTalk 进行虚拟活动等)。我们比以往任何时候都有更多的理由使用互联网和网络。
由于人们现在可以在网上使用或购买的商品种类如此之多,而且大多数人在多种设备上使用网络,因此顾客的旅程比以往任何时候都更加复杂。现在网上研究网下购买(ROPO)非常普遍。在上下班途中看到社交媒体应用上的动态定向视频广告后,在收到触发式营销电子邮件后,在家里的桌面网络浏览器上进行研究和购买之前,开始移动用户之旅,其他类似和更复杂的用户之旅在今天已司空见惯。

经 Snowplow | 许可来源 |归功于斯蒂尔顿设计有限公司
所有这些社会和技术的变化意味着,今天分析师所分析的网站在外观和行为上都与他们在网站只是静态页面和几个按钮和表单时大不相同。
然而,今天大多数最流行的网络分析工具仍然使用数据模型和框架,就好像我们仍然在分析简单的网站,用户只有一台设备。
打破遗传范式
以 Google Analytics 为例:GA 依赖于页面浏览量作为其关键的点击类型,以便通过相同的 cookie ID(而不是用户)将页面浏览量集分割成会话,然后将这些会话绑定到同一个 cookie。GA 中的大多数指标和维度都与会话的概念相关,例如设备类型、登录页面、渠道、转换率、跳出率等。因此,GA 要求您发送页面浏览量,以便 GA 可以构建会话。
这种方法有两个关键问题。
首先,GA 中的会话是一个复杂且混乱的概念。它结合了基于 GA 何时收到点击量的超时窗口、基于您希望营销或广告活动应用多长时间的活动超时窗口、跨域跟踪问题、推荐排除、更改收购来源、午夜等。对这些可配置选项的任何更改都会影响会话的定义方式,因此会影响与会话概念相关的所有指标和维度。由于所有这些指标都可能因配置中的微小变化而发生如此剧烈的变化,因此很难对它们有信心。
其次,考虑一个不太适合页面视图->会话->用户框架的 web 应用程序,例如twitter.com。用户可以访问 twitter.com/home,滚动浏览他们的时间表,悬停在用户的头像上查看个人资料卡片,喜欢并转发个人推文,从这个页面关注或取消关注用户,还可以自动刷新你的订阅。从传统意义上来说,这可以在一个页面视图中完成,因为 URL 没有重新加载。如果 Twitter 使用 GA 进行网络分析,在没有极端定制的情况下,他们可能会有很高比例的“会话”,只包含少量的页面浏览量和很高的跳出率。大多数 web 分析工具所采用的标准数据模型并不适合当今的 web。
标准化的页面视图->会话->用户范式并不适合 2021 年的许多网络体验。宝马汽车定制,像 Udemy 这样的在线学习提供商,或者像 Twitch 这样的流媒体服务,都是标准的网络分析数据模型不再适用的网络应用。
值得注意的是,有许多网站仍然符合这种模式——例如,大多数出版商和电子商务网站通常都符合这种模式,因为用户会从产品页面转向搜索结果页面、结账和确认页面,或者用户会阅读文章。对于那些企业来说,这种模式仍然适用。然而,越来越多的企业不符合这种模式,甚至出版商和电子商务企业也开始改变他们的网络体验,远离我们可能称之为“传统”的网站模式。
从网站到数码产品
有一个有效的论点是,上述 web 应用程序更适合于产品分析,而不是 web 分析,因此需要一组不同的工具来满足一组不同的需求,而传统的 web 分析工具不能做到这一点。虽然越来越多的这种“产品”类型的应用程序出现在被认为是“传统”的网站上,但在很多情况下确实如此。另一个缺点是,专业产品分析工具通常缺乏 web 分析工具擅长提供的高层次视角。我们看到产品分析和网络分析工具越来越接近,这种趋势可能会在未来几年内持续下去。
总的来说,许多现代网络分析工具普遍装备不良,无法提供理解复杂网络用户旅程中用户行为所需的深度细节。这不是一个启示,也不是一个不受欢迎的观点。这一挑战已被市场上最大的参与者接受,试图帮助分析师更好地回答传统网络分析工具难以解决的问题。
谷歌分析 4 是谷歌的最新版本,从界面到底层数据模型,彻底改变了谷歌分析的工作方式。GA4 不再使用传统的页面视图->会话->用户框架,而是转向使用事件->用户数据模型。这是一个巨大的变化,也是使用 GA4 的网络分析师思维方式的变化,他们已经使用 Universal Analytics(“旧”GA)很多年了。GA4 还提供了将数据导出到 Google BigQuery 的能力,无需额外付费——这是第一次提供对 SQL 数据仓库中事件级数据的大规模访问。
谷歌的这一重大变化表明,他们承认需要对网络分析进行新的审视,而 GA4 基于 Firebase 的事实表明,谷歌如何看待这两个世界越来越近。
超越 GA4——网络分析的未来
然而,GA4 并不能解决所有问题。诸如可靠的跨设备归属、非现场测量、在尊重用户隐私的同时整合 CRM 等其他渠道,这些仍然是所有在线企业面临的挑战,GA4 不会解决这些问题,也不会解决构建不当的指标问题。
总而言之,网络分析工具一直在努力跟上过去 10-15 年来不断变化的用户行为和技术进步。网络分析解决方案需要为企业和分析师提供定制他们的跟踪和数据模型的能力,以真正适合他们的客户使用的网络应用程序,从而充分了解这些用户表现出的行为。如果没有这种来自丰富而详细的行为数据的理解,企业就不能指望在所有接触点提供最佳的用户体验。
从 EMR 迁移到 Kubernetes 上 Spark 的故事
在这篇文章中,Lingk 的联合创始人讲述了他们从 EMR 迁移到由数据力学管理的 Spark-on-Kubernetes 平台的故事:他们的目标、解决方案的架构&他们必须解决的挑战,以及他们获得的结果。
此次迁移的目标
Lingk.io 是一个数据加载、数据管道和集成平台,构建在 Apache Spark 之上,服务于商业客户,拥有教育领域的专业知识。在他们的可视化界面上,只需点击几下鼠标,他们的客户就可以从几十个来源加载数据、消除重复数据和丰富数据。
在引擎盖下,Lingk 使用 AWS EMR ( ElasticMapReduce )来驱动他们的产品。但是他们面临着一些问题:
- EMR 要求他们的 Devops 团队进行过多的基础架构管理,而 Spark 经验有限。选择正确的集群实例类型、内存设置、spark 配置等。
- 他们的 AWS 总成本很高,他们直觉认为 EMR 的自动缩放策略不是很有效,而且浪费了大量计算资源。
- Spark 应用程序平均需要 40 秒才能启动。Lingk 的最终用户需要等待很长时间,特别是如果他们正在建立一个新的数据管道或集成。
- 核心 Spark 应用程序停留在早期版本,因为将 Spark 升级到 3.0+导致了无法解释的性能退化。
他们决定在数据机制的帮助下,迁移到 Kubernetes 上的 Spark。他们此次迁移有三个目标:
- 降低他们的总基础设施成本
- 简化他们的数据团队运营工作
- 改善 Lingk 平台的最终用户体验
*** 数据机制 是一个云原生的 Spark 平台,可在 AWS、GCP 和 Azure 上使用。 阅读更多 关于他们的服务以及它是如何建立在 Spark-on-Kubernetes 开源之上的。
迁移后的目标体系结构
Lingk 的新数据平台建立在长期运行的托管 Kubernetes 集群(EKS)之上,部署在他们的 AWS 帐户中。Data Mechanics 负责管理该集群,从初始配置到长期维护(使用最新的 Spark 和 Kubernetes 更新来保持其最新状态),并根据负载按需自动扩展。

lingk+数据力学架构。图片作者。
像 Jupyter 笔记本支持和气流集成这样的额外集成也是可能的,尽管在这种情况下,Lingk 会使用 Data Mechanics gateway 公开的 REST API 简单地触发 Spark 作业。因此,Lingk 的团队不再需要管理 EMR 集群,他们只需通过 API 提交 Dockerized Spark 应用程序,并享受无服务器的体验。
该团队可以控制 Spark 使用的 docker 图像,这带来了 3 个额外的好处:
- 应用程序启动速度更快,因为所有依赖项都在 Docker 映像中完成。
- CI/CD 流程更简单—合并 PR 时会自动构建 Docker 映像。
- Docker 映像包括 Spark 分发版本身(没有全局 Spark 版本),这意味着所有应用程序都可以在同一个集群上高效运行,并且很容易逐步升级到 Spark 3.0。
使用 Data Mechanics 提供的一个公共 Spark-on-Kubernetes docker 映像作为基础,很容易开始使用基于 docker 的开发工作流,并打包所需的依赖项。
迁移过程中应对的挑战
迁移的主要技术挑战是停止使用 HDFS 作为中间存储,而是使用 S3——因为 HDFS 很难在 Kubernetes 上设置和维护。这需要更改一些应用程序代码,但最终的体系结构更加健壮,因为计算资源现在与存储资源完全分离(允许群集在不使用时几乎完全缩减)。
一些性能优化也很关键:
- 调整容器大小以最大化实例上容器的装箱。小型容器用于大多数应用程序(它们很短,处理的数据量很小),大型容器用于较长应用程序的尾部。这些设置由数据力学平台自动调整。
- 调整默认的分区数量,以保证 Spark 中的最佳并行性——因为许多 Spark 作业受到太多小分区的影响(从 Spark UI 中可以看到,因为平均任务持续时间< 50 毫秒)。
- 启用动态分配(从 Spark 3.0 开始,它适用于 Kubernetes 上的 Spark),以加速长时间运行的管道(对于第 99 百分位最长的应用程序,速度提高了 5 倍!)通过让他们请求更多的遗嘱执行人。
- 启用少量过度配置,以确保群集始终有备用容量供应用程序启动。

示例节点池配置说明了我们实施的一些优化。图片作者。
这些优化详见技术指南: 如何在 Kubernetes 上设置、管理& Monitor Spark(附代码示例) 。
迁移取得的成果

EMR => Spark-on-K8S 迁移中获得的结果。图片作者。
从 EMR 到 Spark-on-Kubernetes 的迁移是一大胜利:
- 在最终用户体验方面,Spark 应用程序启动时间减半,平均应用程序持续时间减少了 40%。
- 在成本方面,AWS 成本降低了 65%以上。Lingk 的总拥有成本(包括数据机制管理费)降低了 33%。这些节省来自对所有 Spark 应用程序使用单个 Kubernetes 集群的成本效益,以及上一节中描述的性能优化。
Lingk 还能够将 Spark 升级到 3.0(逐渐地,由于他们的 Spark 分发的 docker 化),这在其平台中实现了新的面向用户的功能。
“利用数据机制激发专业知识和平台降低成本,同时让我们晚上睡个好觉,实现我们梦想的计划。” 戴尔·麦克罗里,Lingk 的联合创始人&首席产品官。
原载于 数据力学博客 。
内存中 Python 对象的意外大小
数据科学
一个 Python 对象占用多少内存?

故事
我正在为一个数据科学项目用 Python 编写一本大字典。Resouce Monitor(一个显示硬件使用信息的 windows 实用程序)在短时间内显示了巨大的内存使用量。我知道我的代码草案并不是最佳的,但是内存利用率与我的字典长度的增长率并不相称。看起来我的字典长度和字典对象在内存中的大小没有线性关系。我决定在记忆中检查我的字典的大小。我确信应该有一个 Python 函数能给我答案,对吗?当然,我用谷歌找到了那个神奇的功能。经过一个小时的研究,我加入了 Python 程序员小组,他们意识到这个问题没有直接的解决方案。为什么?阅读这篇文章。
基础
如果你不熟悉 Python 如何管理内存,我推荐你先看看我的下面这篇文章。用通俗易懂的语言解释了 Python 如何给对象分配内存。
正如我在文章中解释的,Python 对象存储在堆内存(即动态内存)中。您可以通过使用一个名为id()的函数来获得堆内存(也称为 Heap)上的对象地址。你可以在上面的文章里读到更多的细节。
但是在那篇文章中,我们没有讨论堆上对象的大小。内存中一个对象的大小是多少?在这里,我给你这个问题三个答案。一个简单但错误,下一个稍微复杂一点,更准确,最后一个解是我们能得到的最正确的解。
我为什么要给你一个简单却错误的答案?原因是如果你先看到正确答案,你可能不明白为什么答案有点复杂。此外,你可能没有很好地理解这背后的原因。毕竟我们是在看文章,了解代码背后的原因和解决方案;否则,StackOverflow 几乎对所有事情都充满了正确且经过验证的解决方案。
简单而错误的答案
在 Python 中,测量内存中对象大小的最基本函数是sys.getsizeof()。让我们用几个例子来看看这个函数。
>>> sys.getsizeof(1)
28
>>> sys.getsizeof('Python')
55
>>> sys.getsizeof([1, 2, 3])
88
这三个例子以字节为单位显示了一个整数、一个字符串和一个列表的大小。乍一看,一切似乎都很好,你想知道为什么要写这篇文章,对不对?给我几分钟,我可能会说服你(就像我第一次看其他例子时被说服一样)。让我们看另一个例子。
>>> sys.getsizeof('')
49
>>> sys.getsizeof('P')
50
>>> sys.getsizeof('Py')
51
>>> sys.getsizeof('Pyt')
52
首先,我有一个空字符串。用了 49 个字节!然后我有一个只有一个字符的字符串,它的大小是 50 字节。我添加了更多的字符,似乎每个字符都为我的 string 对象的大小增加了一个字节。我们如何解释这一现象?其实很简单。在 Python 中,像几乎所有其他东西一样,字符串是一个对象,而不仅仅是字符的集合。一个对象(在这种情况下是一个字符串对象),除了它的值(即字符的集合)之外,还有不同的属性和相关的组件。当我们创建一个对象时,Python 将所有这些信息存储在内存中。因此,即使对于空字符串,我们也有开销。
让我们检查同样的事情来获得一个列表。
>>> sys.getsizeof([])
64
>>> sys.getsizeof([1])
72
>>> sys.getsizeof([1, 2])
80
我们在这里看到同样的故事。一个列表对象有 64 字节的开销。每增加一项,其大小就增加 8 个字节。好吧,一开始很奇怪,但现在说得通了。我们再看一个例子(我向你保证,这个更有趣)。
>>> sys.getsizeof([1, 2])
80
>>> sys.getsizeof([3, 4, 5, 1])
96
>>> sys.getsizeof([1, 2, [3, 4, 5, 1]])
88
首先,我有一个[1, 2]列表,占用 80 字节内存。我有另一个列表[3, 4, 5, 1],它占用了 96 个字节。到目前为止,一切都说得通。对于一个列表对象,我们有 64 个字节的开销,每个附加项有 8 个字节。现在,我将第二个列表嵌套在第一个列表中。结果列表将类似于[1, 2, [3, 4, 5, 1]]。当我得到这个新列表对象的大小时,它的大小是 88 字节。什么?!!新嵌套列表的大小(即 88 字节)甚至小于我的第二个列表的大小(即 96 字节)。怎么可能呢?
让我们回放一下。首先,我有一个包含两个项目的列表(即整数)。正如我们所料,它占用了 80 字节的内存。当我们添加一个新的条目时,这是一个列表,它给我的列表增加了 8 个字节。好像不管怎样,一个附加项都要 8 个字节。似乎列表对象不是存储项目,而是存储对项目的引用(即内存地址)。确实如此。当您创建一个 list 对象时,list 对象本身占用 64 字节的内存,并且由于对其他对象的引用,每个项目都会在 list 的大小上增加 8 字节的内存。这意味着在前面的例子中,[1, 2, [3, 4, 5, 1]]的列表像[reference to obj1, reference to obj2, reference to obj3]一样存储在内存中。每个引用的大小是 8 个字节。在这种情况下,obj1、obj2和obj3被存储在内存的其他地方。因此,要获得我们的列表对象的实际大小,除了获得列表的大小之外,我们还需要包括每个成员对象(我们称之为 items)的大小。
更复杂和更准确的答案
正如我们从上一节中了解到的,sys.getsizeof()只给了我们对象的大小和它在内存上的属性。它不包括被引用对象(例如,列表中的项目)的大小及其属性。要获得对象的实际大小,我们必须遍历对象的所有组件(例如,列表对象中的项目)并将它们的大小相加。下图就是一个例子。

图片由作者提供。
如上图所示,一个对象比如[1, 2, [3, 4, 5, 1]]的大小是 352 字节。但是,这个计算有一个错误。如果您查看图中的对象列表,您会在第 2 行和第 8 行看到相同的内存地址(用*突出显示)。好像主链表中的1(即整数对象)和嵌套链表中的1存储在同一个内存地址。正如我在上一篇文章中解释的那样( link ),Python 一次性存储[-5,256]之间的整数,并将所有引用指向同一个内存地址(用于内存优化)。因此,最好使用它们的内存地址(通过id())来识别重复项,并计算一次它们的内存大小。因此,在我们的例子中,我们必须在对内存大小求和之前删除重复项。下图是正确答案,324 字节。

图片由作者提供。
尽可能准确
之前的解决方案比我们最初的计算更准确,但不幸的是,它仍然有一些警告。当你加载一个类时,一些你想不到的其他元素(比如 obj。dict 或 obj。slots),也可能存储在内存中。手动跟踪这些元素很困难,有时甚至是不可能的。搜索附加到对象的所有元素的一个更好的方法是使用 Python 垃圾收集器接口中的函数gc.get_referents()。
如果你不熟悉 Python 垃圾收集器,我推荐你阅读这篇文章。垃圾收集器跟踪堆中的所有对象和相关元素,并在程序不再需要它们时删除它们。
这里我们可以利用垃圾收集器接口( link )来查找所有链接到我们想要知道其内存大小的对象的元素。下面的代码循环访问附加到原始对象的所有对象和元素,并将它们的大小添加到对象的总大小中。
其他资源:
我还发现了下面这篇文章提供的一个很好的解决方案。尽管该解决方案适用于有限的对象集,但它看起来很可靠。
https://goshippo.com/blog/measure-real-size-any-python-object/
摘要
测量内存中 Python 对象的大小不是一件容易的事情。没有一个内置的简单的解决方案来找到对象的实际大小。在本文中,我们了解了为什么测量物体的实际尺寸不容易。此外,我还提供了一个适用于 Python 中许多(不是所有)对象的解决方案。
在推特上关注我的最新报道:https://twitter.com/TamimiNas
Paxos 算法的奇怪故事
我们每天使用的一个流行算法是如何作为一个关于古希腊议会的故事出版的,以及它是如何工作的

Paxos 算法是一系列协议,旨在解决具有不可靠节点的网络的一致性问题。它的原始论文保持着最长出版延迟(超过 8 年)的记录,因为它有趣地传递了一个关于帕科斯岛上古希腊议会的故事。
“我决定用古希腊岛屿上的议会来模拟算法……我给希腊立法者提供了在该领域工作的计算机科学家的名字,在吉巴斯的帮助下音译成一种伪造的希腊方言……写一个失落的文明让我能够消除无趣的细节,并通过说议会协议的一些细节已经丢失来表明概括。为了进一步展现这一形象,我以印第安纳·琼斯式考古学家的身份做了几次讲座,带着斯特森帽和酒壶。——莱斯利·兰波特(作者)
2001 年,在论文发表大约三年后,兰普森为他的论文写了一个更简单的版本,没有用希腊语描述算法。从那以后,这种算法变得非常流行,被科技行业中一些最大的公司(如谷歌、IBM、微软和亚马逊)使用。
“我厌倦了每个人都说 Paxos 算法有多难理解,发表在【122】。虽然人们如此沉迷于伪希腊名字,以至于他们发现这篇论文很难理解,但算法本身非常简单……当前版本有 13 页长,没有包含比 n1 > n2 更复杂的公式。”——莱斯利·兰波特(作者)
尽管它的交付很有趣,但这个算法非常简单,并且在处理一个重要问题时做得很好。有趣的是,我们可以看到 Lamport 是如何通过与先进的议会系统进行类比,将这种算法概念化的。在现实世界的问题和事件的背景下思考算法已经导致了计算机科学的一些巨大进步。一个重要的例子是试图复制人脑中神经元为神经网络工作的方式,这导致了行业中一些最先进和性能最好的模型。
共识算法:问题
在分布式系统(许多计算机相互通信的系统)中,一致性问题是一个很难解决的问题。Lamport 将一致性问题(他称之为安全性)描述为有三个组成部分:
- 只能选择已建议的值(有效性)
- 所有节点都同意相同的单个值(协定)
- 如果实际上已经选择了(终止),则节点仅知道已经选择了一个值
考虑一个只有一个文件的基本文件共享系统。两个用户试图同时写入该文件。哪个文件是“正确的”文件?系统应该如何响应用户?当另一个用户读取这个文件时,他们应该得到哪个?
在可以同时向系统提供多个值的情况下,满足这三个约束是具有挑战性的。我们每天依赖的许多网络都分布着许多并发的用户发出读写请求。因此,存在一种有效的算法来处理这种类型的行为是极其重要的。
引入网络中的计算机可以停止工作或重启的想法,使得这个问题变得更加具有挑战性。这就引入了一个概念,即每当一个更新的值被发送到一个节点时,这个值就有很小的可能永远不会到达它。在这种类型的网络中,不可能确认所有节点之间的通信成功。
在帕克森议会的背景下,兰波特将这个问题描述为议会需要“即使立法者不断进出议会大厅也能发挥作用。”立法者永远不知道特定的议员是否在任何特定的时间听到了议会中所说的话。
“兼职议会的治理问题与当今容错分布式系统面临的问题有着显著的对应关系,在这种系统中,立法者对应于进程,离开议会对应于失败。”
Paxos 算法
为了解释算法是如何工作的,我们将使用由 Paxos 制作的简单的纸。如果你想了解 Lamport 如何在古希腊岛屿议会的背景下描述该算法,可以在这里找到这篇论文。
角色
在该算法中,节点可以扮演三种角色:
- 提议者:提议者向接受者发送消息,试图改变价值观。
- 接受者:接受者接收来自提议者的消息,并且只有当足够数量的接受者接收到相同的消息时才接受它们。
- 学习者:一旦消息被足够数量的接受者认可,学习者就负责执行请求并向客户端发送响应。
一个节点可以充当多个代理,但是将这些代理概念化为三个独立的角色是有帮助的。
法定人数被定义为大多数接受者节点。兰波特认为这就足够了,因为“任何两个多数至少有一个共同的接受者。”该算法可以扩展为给每个节点赋予权重。在这种情况下,仲裁将由一组节点组成,这些节点占分配给网络中所有接受者节点的总权重的一半以上。
提案编号
为了允许多个建议,该算法使用所谓的建议号。接受者不接受建议编号低于或等于他们已经看到的建议编号的消息。
准备请求并承诺回应
为了发送提议,提议者向接受者节点发送具有提议号(n)的消息。n 的值被定义为大于发送消息的提议者在先前提议中使用的任何数字。该消息被称为准备请求。
提议者期望接受者的回应(称为承诺),包括:
- 承诺绝不接受小于 n 的提案
- 具有小于 n 的最大数的建议,如果该值存在,则该建议已被接受。
接受者节点不必发送响应来确保算法的安全性。接受者节点可以通过告诉提议者它已经对另一个更高编号的提议作出承诺(这不是必需的,但是是性能优化)或者通过向提议者作出具有上述组件的承诺来响应准备请求。
接受请求
一旦提议者收到大多数接受者的承诺,它就向一组接受者(可以不同于准备请求的接受者)发送提议将被接受的请求(称为接受请求)。这些请求包括版本号(n)和值(v),其中 v 是“[承诺响应]中编号最高的提议,或者是提议者选择的任何值,如果响应者没有报告任何提议。”
当且仅当它没有承诺不接受请求时,接受者才应该响应接受请求(它还没有承诺更大的版本号)。
学习价值观
一旦一个值被接受,学习者必须发现这个提议已经被法定人数的接受者接受。一旦接受者接受了一个值,它就将其接受发送给一组杰出的学习者,然后这些学习者可以通知所有其他学习者已经选择的值。
当在可靠性和通信复杂性之间选择杰出学习者集合的大小时,有一个折衷。更杰出的学习者将导致更好的可靠性。
结论
随着科技行业继续依赖分布式网络进行扩展,尽可能有效地解决这一共识问题变得越来越重要。
在一个至少有一个节点可能失效的系统中,在这篇著名的论文中已经被证明是不可能达成共识的。也就是说,不可能满足有效性、一致性和终止性的属性。Paxos 保证了前两个,并在保证终止性方面做得相对较好,这使它成为一个非常流行的共识算法。
虽然想象 Lamport 穿着印第安纳琼斯的服装在舞台上描述这种算法并讲述一个用虚构的希腊名字组成的议会的故事是很幽默的,但想想如果这篇论文以典型的方式发表并在八年前发表,分布式技术的发展可能会有什么不同也是很有趣的。
Paxos 算法及其变体用于分布式和云计算系统,我们每天都在使用技术与这些系统进行交互。它使得扩展分布式机器的大型系统更加可靠。想到这篇论文因为兰波特在发表他的观点时冒了创造性的风险而被驳回了近十年,真是好笑。
有时候,从一个不同的角度处理一个复杂的问题可以打开一个问题的新视角。它可以带来一些高效的解决方案。我只是不建议一旦你找到了解决方案,就发表一篇论文,装扮成印第安纳·琼斯来讨论你的解决方案。
感谢您阅读这篇文章。
人工智能的战略和安全含义
苹果 | 谷歌 | SPOTIFY | 其他
海伦·托勒上了 TDS 播客
要选择章节,请访问 Youtube 视频这里。
编者按:这一集是我们关于数据科学和机器学习新兴问题的播客系列的一部分,由 Jeremie Harris 主持。除了主持播客,Jeremie 还帮助运营一家名为sharpes minds的数据科学导师初创公司。你可以听下面的播客:
每一项新技术都有被滥用的可能。虽然人工智能显然已经开始产生巨大的价值,但它也产生了新的系统漏洞,政府现在不得不担心和解决这些问题。自动驾驶汽车可以被黑。语音合成会使验证某人身份的传统方法变得不那么可靠。人工智能可以用来建造不太可预测的武器系统。
随着人工智能技术的不断发展和变得更加强大,我们将不得不更加担心安全和保障。但竞争压力有可能鼓励公司和国家专注于能力研究,而不是负责任的人工智能开发。解决这个问题将是一个巨大的挑战,可能需要新的国家人工智能政策,以及目前不存在的国际规范和标准。
海伦·托纳(Helen Toner)是 CSET 安全和新兴技术中心(Center for Security and Emerging Technology)的战略主任,该中心是美国的一个政策智库,旨在将决策者与人工智能等新技术的安全影响专家联系起来。她的工作涉及国家安全和技术政策,以及国际人工智能竞赛,特别是她已经成为中国人工智能方面的专家。海伦和我一起参加了一个特别的以人工智能政策为主题的播客。
以下是我在对话中最喜欢的一些观点:
- 人工智能将在许多战略领域产生变革性的影响。但海伦也认为,人工智能可能不会像许多人认为的那样影响他人。作为一个例子,她提到了 Deepfakes,这是一个经常被引用的潜在危险的虚假信息工具,对民主进程的完整性有着广泛的影响。海伦指出,Deepfakes 仍然需要大量资源来部署,对于有意影响公众舆论或选举的坏演员来说,有更容易实现的结果,例如,包括使用 Photoshop 等简单工具,或雇佣低薪工人来发布大量推文。在她看来,使用像 Deepfakes 这样的工具有一个机会成本,在我们决定我们应该对它们的潜在影响有多担心之前,需要考虑这个成本。
- 我的假设通常是政府行动缓慢,因此随着人工智能技术的发展步伐不断加快,他们可能很难保持政策与时俱进。虽然海伦同意政府通常缓慢的步伐值得记住,但她也指出,当迫切的需求出现时,决策者和政府机构可以使用不同的工具来加快行动。她以大规模的新冠肺炎救助计划为例,说明政府在极短的时间内采取了重大行动。
- 海伦讨论了一些关于国际人工智能竞赛状态的常见误解。其中一个特别与中国所谓的“数据优势”有关:由于其庞大的人口和人工智能技术的几乎无处不在的应用,中国可以获得比国际竞争对手更多的数据,因此是人工智能的重要优势。海伦不认为这是一个令人信服的论点,原因有二。
- 首先,数据是不可替代的:你目前不能使用面部识别数据来帮助训练聊天机器人,或使用文本数据来训练下棋的 RL 智能体。人工智能应用仍然很窄,因此中国可能拥有更多“批量数据”的事实并没有转化为它所具有的明显优势(例如安全和战略人工智能应用)。第二,“中国很大”的论点往往忽视了许多美国科技公司的跨国性质:脸书和谷歌不仅仅是为美国公众服务——它们被全球数十亿人使用。因此,通过一个简单的“美国对中国”的镜头来观察数据可用性并没有特别大的帮助或信息。
- 海伦指出,无论是在国家还是在公司,人才都是人工智能发展计划的关键投入。从历史上看,美国拥有巨大的人才优势,因为它是一个适宜居住的地方,也是技术人才的中心。海伦担心这种情况可能会改变,特别是对技术移民的限制使得人工智能开发者和技术工人更难移居美国。
播客中引用的链接:
- 安全和新兴技术中心的网站 (CSET)。

章节:
- 0:00 简介 1:19 什么是 CSET?
- 2:41 CSET 当前面临的人工智能政策挑战
- 4:03 人工智能中的一致概念
- 6:46 人为偏差
- 11:20 相互竞争的民族国家和公司
- 15:00 可信人工智能开发的前景策略
- 17:39 政府参与
- 共识的概念
- 23:53 中国的人工智能能力
- 30:21 COVID 的影响
- 34:38 人工智能中的身份指示器
- 40:02 对准问题
- 42:53 总结
请查看下面的文字记录:
杰里米·哈里斯( 00:00 ):
嘿大家好。欢迎回到播客。今天我们采访的是海伦·托纳,她是乔治敦大学安全和新兴技术中心的战略主任。现在,海伦的工作重点是帮助政策制定者驾驭人工智能和机器学习等新技术的战略和安全影响。这意味着承担大量的问题,从隐私到国际竞争,再到安全的人工智能开发。因此,我们将广泛地讨论所有这些领域,但我们也将专注于 Helen 拥有丰富经验和专业知识的一个特定领域。这就是中国和他们的人工智能战略的问题。海伦实际上花了大量时间研究中国的人工智能生态系统,通过她在人类未来研究所的工作,当她住在北京时,她在那里作为一个研究附属机构工作。所以她有很多经验,很多很棒的见解可以分享,我真的很期待能投入到对话中。我希望你也喜欢它。
杰里米·哈里斯( 00:50 ):
你好海伦。非常感谢你参加我的播客。
海伦·托勒( 00:53 ):
谢了。很高兴来到这里。
杰米·哈里斯( 00:55 ):
很高兴有你,你实际上正在做一些非常有趣的工作,我认为你是我第一个与全职从事人工智能政策方面工作的人交谈。你在 CSET·C-S-E-T 安全和新兴技术中心工作。你能否先介绍一下 CSET 是什么,以及为什么该组织如此关注人工智能带来的政策挑战?
海伦·托勒( 01:19 ):
是啊,当然。因此,CSET 是乔治城大学的一个政策研究和分析机构,大致类似于一个智囊团。我们成立于大约两年前,2019 年初,推动 CSET 成立的最大因素之一就是这一想法,即有一系列新兴技术正在影响国家安全和国际关系问题。美国政府和 DC 目前的设置实际上并没有将这些技术的专业知识与它们将如何影响这些特定问题的专业知识结合起来。因此,没有太多的基础设施来真正考虑这些不同主题的交集。
海伦·托勒( 02:05 ):
特别是,为了回答你关于为什么如此关注人工智能、人工智能,特别是机器学习的问题,深度学习是一种对国家安全的潜在影响在过去,甚至在过去 10 年里增长如此迅速的技术,而那种需要跟上的政策专业知识还没有出现。因此,我们希望建立一个中心,能够真正在这个交叉点上工作,并充分了解技术问题,以便与这些人交流,并充分了解政策问题,以便与这些人交流,并真正思考它们之间的联系方式及其对美国政策的影响。
杰里米·哈里斯( 02:41 ):
特别是在人工智能政策方面,他们当前的挑战是你最关注的,还是只是一种更广泛的授权?
海伦·托勒( 02:47 ):
这是一个相当广泛的任务。在不久的将来,我们还可能将它扩展到其他技术领域,在不太详尽的情况下,简单介绍一下 CSET 正在研究的一些东西。我们在人工智能的基础上做了一些工作,就是我们如何考虑人工智能的输入。这包括人才,也包括硬件。所以芯片,半导体,包括数据,资金等等。我们在人工智能的潜在应用方面做了一些工作。因此,这包括人工智能在国防方面的应用,但也包括人工智能如何与网络作战互动等内容。因此,我们有一个名为网络人工智能项目的完整项目,该项目正在思考机器学习会不会对此产生影响。因为它总是很有趣,不仅指出了机器学习可能改变事物的重要方式,还揭穿了实际上不正确的说法。
海伦·托勒( 03:38 ):
然后我们也考虑一些其他的工具和杠杆。所以我们做了一些人工智能与外交的潜在交集的工作,也思考了贸易政策,产业政策,潜在的。然后也思考一个我们真正感兴趣的领域,在这个领域我们已经发表了太多的工作,但也在思考在国家安全背景下人工智能的标准和测试。
杰里米·哈里斯( 04:03 ):
有意思。所以你提到了一些在人工智能环境中保持不变的东西,一些可能不会改变的东西。你能分享几件这样的事情吗?在我们可能大致预期会发生变化的领域,有哪些常见的误解,但在哪些领域我们可能预期不正确?
海伦·托勒( 04:17 ):
是的,我的意思是,我认为人工智能给这个领域带来了非常有趣的新东西,其中一些新东西可能非常闪亮和令人兴奋,看起来可能是革命性的。我现在想到的一个例子是深度伪装。例如,这种能力可以把一个人的脸换成另一个人的脸,然后制作一个政治人物或者其他人的假视频,这些人可能说了一些他们实际上没有说的话。我认为这是一个很有意思的领域。我认为作为更广泛的合成媒体的一部分,这是一个非常有趣的领域。所以假视频,假声音,假文字或者非人类生成的文字,我想我应该说。但是我们有点怀疑,比如深度假货,是否会像一些人所说的那样产生革命性的影响。
海伦·托勒( 05:04 ):
因此,有一些关于深度虚假的评论,例如,说这将是真理的终结,这将是虚假信息运动的巨大工具。例如,如果俄罗斯想试图干涉我们的选举,他们将能够制作一些候选人的视频,并通过影响人们的看法来完全改变结果。
海伦·托勒( 05:26 ):
我的一位同事 Tim Wong 写了一篇论文,他并不是说这种情况肯定不会发生,而是真的在研究这些工具,就像任何工具一样,这里会有一个成本效益权衡。因此,如果你是互联网研究机构爱尔兰共和军,它代表俄罗斯人大量参与了 2016 年的选举。你雇佣了很多很多人来研究这些话题,如果你能以很低的时薪雇佣某人,他们就能以极高的时薪发布推文。这将会有一些投资回报,你可以将它与建立所有的基础设施进行比较,你需要建立一个令人信服的深度假,这将会有一些投资回报。
海伦·托勒( 06:08 ):
你只会考虑更好的投资回报是什么。现在还不清楚,在这种环境下,深度伪装是否真的会比完全传统的伪装更有效。我说的传统是指社交媒体时代的传统。所以在过去的 10 年或 20 年里,而不是在那之前。但是有很多非人工智能相关的方式,坏演员可以做这些事情。缺陷会有那么大的影响,这一点都不明显。这是一个例子,人们对某样东西有很多兴趣,对它可能的发展有一些期望。我们只想进入对话,说,“嘿,让我们想想,他们实际上会怎么走,这些假设是对的吗?可能会有什么不同?”
杰里米·哈里斯( 06:46 ):
这很有趣,尤其是想到人类倾向于偏向于接收和感知信息的方式的背景。我在想自己对深度假货的反应。人们很容易想象深层的假相以某种邪恶的方式展开,因为这很容易想象,你的思维就会被吸引,并开始有点担心。这是否可能指向一个更广泛的问题,或者更确切地说,当谈到倡导使用这些技术的安全性时,你真的提出了许多抽象的问题。你试图提出与趋势、增长、指数以及未来可能或不可能的样子有关的东西。当你与政策制定者交谈,试图以相对具体的条款为这一建议提供依据时,这是否是一个挑战,因为存在如此多的不确定性?
海伦·托勒( 07:32 ):
是的,我认为这是一个挑战。我认为这也是一个挑战,知道如何思考我们今天可以指出的问题之间的平衡,具体地说,世界上已经发生了。可以预见,在不久的将来,这些问题很可能会出现,但是我们还没有具体的例子。为了说明这一点,也为了找出如何在这些事情之间平衡我们的关注,因为实际上不清楚什么是更好的事情,由谁以什么方式来解决?因此,如果我们与国会议员交谈,他们最关心的问题之一当然是,这会如何影响我的选民?这已经发生了吗?我能做些什么来更好地为我的选民服务呢?或者愤世嫉俗地说,什么对我连任更好?
海伦·托勒( 08:21 ):
这与,例如,与国防部办公室中专门负责思考未来技术的人交谈是非常不同的,他们不会担心我们已经有什么证据?更感兴趣的是,我们有理由相信未来会存在什么?所以,从某些方面来说,这只是一个你在和谁说话,他们对什么感兴趣的问题。虽然从其他方面来看,这也是一个不确定的问题,不知道什么是最有影响力或最重要的事情。所以这绝对是一个挑战。
杰里米·哈里斯( 08:50 ):
你认为当前的担忧会顺利转化为未来的担忧吗?换句话说,今天的深层虚假问题是否会……它们是否存在于一个平稳的连续统一体中,我们可以逐步部署新的政策来解决?还是我们会看到逐步的变化,今天不可能的事情在五年后将成为可能,然后这将产生重大的政策影响?
海伦·托勒( 09:14 ):
我希望我知道答案。如果能有一个明确的答案就太好了。我的最佳答案可能是两者兼而有之。我认为,例如,我们今天可以在与人工智能系统相关的非常简单的事情中看到挑战,这些挑战围绕着它们的健壮性和弹性以及它们的可解释性。我相信你之前已经就此进行过对话,显然我们已经到了可以使用人工智能来识别你手机上的照片的地步。所以在我的 Android 手机上,我可以打开我的照片应用程序,输入面条,找到我煮面条的最后几次,看看它们是否变得更漂亮了,这对我来说是一个非常重要的问题。
海伦·托勒( 09:52 ):
这就是重点,我的重点是,这是一个非常低的影响范围。所以我们正处在一个人工智能在我们周围被使用的点上,但它主要被用在如果出了问题也没什么大不了的地方。这就是为什么会出现这种情况的原因,因为我们真的没有办法确信人工智能将在一系列不同的设置中稳健可靠地运行。我们也没有好的方法来理解为什么一个给定的人工智能系统会以一种人类可以解释的方式做出决定?我认为这些都是我认为很有可能顺利转移到未来的担忧的例子。随着这些系统变得更强大,将会有更多的潜在动机在更高风险的环境中使用它们,因为它们可能会节省更多的钱,或者更快,或者更有效。但与此同时,潜在的负面影响也在增加,能够可靠地、可解释地构建这些系统的重要性也在增加。
海伦·托勒( 10:47 ):
我想对于其他的事情就很难说了。我的意思是,当然在国家安全的背景下,一些不可能逃避的事情是考虑其他国家和他们可能使用人工智能的方式。所以你可以想象,如果美国的对手,比如我想是伊朗或朝鲜,突然觉得某个系统可能会发生变化,如果俄罗斯或中国等通常被列为竞争对手的国家做了一些意想不到的事情,这可能会让他们感到意外,也许这就是你需要担心的变化。
杰里米·哈里斯( 11:20 ):
我的意思是,有很多关于在安全或负责任的开发部署上竞争到底的风险的谈论。你会看到相互竞争的民族国家,甚至是一个国家内相互竞争的公司。这是你在 CSET 探索的问题课程吗?这是你乐观的还是不确定的?我是说,我想有很多不确定性,但是。
海伦·托勒( 11:43 ):
是的,绝对有很多不确定性。这确实与我刚刚谈到的鲁棒性、可解释性和相关问题有关,有时这些问题被归为人工智能的一个类别。这肯定是我们要考虑的事情。我认为一个非常有用的概念是安全困境的概念,它来自于国际关系领域。安全困境的想法是,你可以有两个行动者,也许两个国家和一个国家想保护自己,这是合理的当然。所以它会采取一些措施来保护自己。如果不清楚它所做的这些事情是纯粹的防御还是看起来具有潜在的攻击性,问题就来了。因此,如果你想想,例如各种防御性武器,系统也可能被用于进攻。
海伦·托勒( 12:27 ):
因此,当另一个观察的国家也想保护自己时,就出现了安全困境。它有点担心第一个国家是防御还是进攻,以及它正在做的准备。因此,也许你最终会发现他们都在增强防御和进攻能力,因为他们担心另一个人在做什么,尽管他们都没有做任何进攻的意图。对于人工智能系统的潜在用途,你会遇到非常类似的情况,例如,国防部非常清楚当前的机器学习系统并不健壮。他们是不可解释的,他们可以很容易,对手可以使用敌对的输入或其他东西导致他们失败,或者他们可能只是自己失败。因此,国防部显然不想部署这样的系统,但有一种担忧,即竞争对手或其他国家在他们愿意部署的方面可能会有更低的标准。
海伦·托勒( 13:21 ):
因此,如果是这样的话,这些其他国家正在开发系统,可能以某种方式使他们比美国更有优势,那么也许美国应该平行开发这些系统,这样我们就有了选择,即使我们不确定。当然,这也激励了其他国家以类似的方式发展。这就是我对有时被称为安全底线竞赛的思考方式,有些国家真的在努力思考和理性地开发这些技术,但他们也真的重视自己的国防和安全。他们会感到谨慎并花时间在他们的系统中建立安全性、健壮性、可靠性和可解释性,还是会感到需要更快?
海伦·托勒( 14:07 ):
所以我认为有一件事可以帮助解决这个问题,那就是承认这是人工智能的情况,承认这些系统确实存在这些问题,并且公开谈论这些问题。我们已经看到美国国防部官员对此进行了一些讨论。我很乐意看到更多你可以寻找的建立理解的其他方法。有一篇论文,一些人在这方面做了一些很好的工作,比如新美国安全中心的保罗·沙尔。宾夕法尼亚大学的教授迈克·霍洛维茨说。他们正在研究建立信心的措施。如果你和另一个国家有某种竞争关系,有什么方法可以降低这种可能性吗?我想我感到有点乐观,但也许主要是对整体前景不确定。
杰里米·哈里斯( 15:00 ):
我想这在很大程度上取决于博弈论,即你认为其他国家会在多大程度上友好合作并主动提供数据,这又指向了另一个问题。我知道你已经做了一些思考和研究,这是值得信赖的人工智能开发的想法,监控什么样的人工智能工作正在进行的能力。因此,如果你有一个国家或公司或政党说,“嘿,我们遵守所有的规范和标准,一切都很好。一切都很好。”但是他们在某个地方隐藏了一个违反这些规则的研究项目。就可信的人工智能开发的下一步想法而言,你认为什么策略最有希望?
海伦·托勒( 15:38 ):
是的,这是个很好的问题。我认为这是一个非常宽泛的问题,因此很难回答,因为我认为有很多不同的东西可以归入这个类别。在某些方面,我有时听到可信的人工智能用来描述一般的安全人工智能,或你可以信任的人工智能,我想这是一个独立的问题,与开发过程是可信的或能够对你正在开发或没有开发的人工智能类型做出可验证的断言的想法不同。我不知道我对此有什么好的答案。我觉得很难。你可能会想到的一个范例是某种不扩散范例,例如,核能或核武器。或者,我们建立了一整套国际机制,旨在检测和防止核材料的扩散,从而防止核研究和核武器项目的发展。其中一个非常关键的因素是,你需要在核裂变材料周围移动。
海伦·托勒( 16:47 ):
还有其他因素,比如你能从空中影像观察到这些东西吗,从空中影像观察到的设施等等。所以核系统相对来说,你可以说它在这个意义上是可用的。对人工智能来说,这是一个非常大的挑战,或者说,考虑人工智能开发的方法是很难监控软件的。这可能是一个更有前途的领域,看看硬件方面的东西。因此,也许你可以通过俯视图等方式观察数据中心。但是我认为目前为止在这方面所做的很多工作都是推测性的。也很难知道你会在什么样的确切情况下变得相关,那时的主流机构会是什么样的,参与者会是什么样的。我觉得这些都是非常重要的部分。因此,很遗憾,我觉得在这一点上我没有好的答案。
杰里米·哈里斯( 17:39 ):
是啊。我想这就是为什么在这个领域工作如此重要的原因。是啊。有一个领域或一个维度经常出现,至少当我开始思考政府政策和快速发展的科技之间的相互作用时,那就是时间。所以当我想到那些发展非常非常迅速的事物,比如人工智能技术,比如这些发展。我不认为政府的政策反应与人工智能技术和人工智能能力的发展速度相同。就政府跟上这一复杂空间的政策要求的前景而言,你有什么感觉?
海伦·托勒( 18:18 ):
是啊。我的意思是,我先说,我不确定指数曲线是描述人工智能发展的正确方式。我认为还不清楚是不是这样,不同种类的应用程序和使用人工智能的不同方式之间可能会有很大的不同。我确实认为,事情进展得非常快,而政府没有被设计得特别快,这一点非常重要。我对我在 DC 的时间很感兴趣,我在 DC 只呆了几年。但是在我在这里的这段时间里,以一种更接近个人的方式学习真的很有趣,这些政府程序是什么样子,不同的机构是什么样子,在那里工作的不同的人每天都在做什么,他们能做什么,他们不能做什么,他们有时间做什么,他们没有时间做什么。
海伦·托勒( 19:05 ):
再说一次,我希望我有更好的答案。我认为这将是一个挑战的潜在观察是正确的。我会说政府,美国政府,美国显然是一个大国,相应地政府也很大。但这也意味着它有非常不同的组成部分。所以像国防部这样的机构的工作方式是非常不同的。即使从另一个行政分支机构,如国务院,它的工作方式也会截然不同,更不用说像国会这样的机构了。所以众议院和参议院的工作方式又不同了。我认为在每一种情况下,这些机构都可以或快或慢地做一些事情。所以在某些方面,国会,当它真的想快速,它实际上可以相当快。
海伦·托勒( 19:49 ):
我认为今年早些时候的 COVID 是一个有趣的例子,显然我们现在陷入了缺乏第二轮谈判的困境,但按照政府的标准,第一轮真的很快就结束了,因为这是一个巨大的决定。我想我要说的是,原则上,他们有可能迅速做出这样的决定。同样,在行政分支机构之类的机构中,这真的取决于机构、办公室和相关人员,他们拥有什么权限,他们能够移动什么类型的东西。我认为我们在历史上看到的一件事是,在这些大型官僚机构中,如果你有一个人进入一个相对高级的职位,他真的有一件事想做,他们通常能够在这件事上取得一定的进展。
海伦·托勒( 20:33 ):
有时候,即使其他人已经努力了一段时间,如果他们真的把它作为他们的首要任务,他们真的只是推动它通过,在这方面还是取得了相当大的进展。所以,是的,我想我是在试着同意你潜在的担忧,同时也在说,我认为事情有点复杂。我认为这确实在很大程度上取决于给定问题的具体情况,例如,在需要做什么的问题上,政府外部有多少共识,涉及的个人,特别是非常具体的机制,政府的哪个部门参与其中,以及他们能够以何种方式做什么,
杰米·哈里斯( 21:09 ):
说到共识,实际上,我对政府内部的共识很好奇,在政策圈里,你能谈论到什么程度。因为我知道有些东西可能是敏感的,但当涉及到人工智能的风险时,一般的观点是什么,应该对这一领域给予多少关注?这是不是已经引起了很多政策制定者的关注?或者这是你希望以后会发生的事情?
海伦·托勒( 21:32 ):
是的,再说一次,美国政府和总体政策空间非常大。所以我不知道在这个普遍性的层面上有多少共识。我认为许多人对人工智能感兴趣,认为这将是一件大事,正在从更广泛地使用大数据的角度思考它,互联网和社交媒体的作用,在这种更广泛的社会变革方式的背景下思考它,我们可以谈论这么多不同的主题领域。如果我们在国家安全领域之外,我认为在人工智能的使用方面肯定会有很多担忧,例如,在司法系统或类似的事情中,我会考虑偏见,考虑系统可能被部署的方式,而没有充分了解它们将如何影响实地参与的人们。
海伦·托勒( 22:21 ):
显然有各种各样的司法系统,但在许多其他领域也是如此。如果我们谈论的是国家安全机构内部,我确实认为这是一个很大的潜在问题,是一种强大的权力竞争,我想这是一个完全不同的话题。但本质上,在过去四五年里,美国的国家安全机构,不仅在唐纳德·特朗普(Donald Trump)担任总统期间,而且在此之前,一直在从主要关注反恐转向更多关注大国竞争。所以这一切都发生在海洋的底层。所以人工智能很适合这里,然后看着像中国这样的国家并思考他们的人工智能能力是非常自然的,不是因为它本身不是一个孤立的话题,而是作为这个更大的问题的一部分,这个问题就是人们一直在想什么。
杰里米·哈里斯( 23:14 ):
以及我们一直在谈论的那种底部博弈竞赛。这是否会影响大国竞争的思维?
海伦·托勒( 23:22 ):
我觉得都是有关联的。我认为,当我们思考人工智能的发展和思考什么样的人工智能系统可能被什么样的行为者使用时,这种关注潜在的对大国竞争的关注和担忧,以及对美国在世界上的作用和中国在世界和其他国家的作用的关注是为什么的部分原因?中国可能正在开发美国决定不开发的东西,因为它不确定它是否安全,这种想法是这种担忧背后的假设,如果这有意义的话。
杰里米·哈里斯( 23:53 ):
是啊,绝对的。事实上,说到中国,那是一个你已经做了很多思考和工作的地方。我想我可能在 Twitter 上读到了你的一篇文章,但你谈到了人们对中国人工智能能力及其人工智能优势的一些常见误解。你不介意打开包装吧?在现阶段,人们可能会错误地认为中国有哪些能力?
海伦·托勒( 24:16 ):
是的,所以我大部分时间都在谈论我日常工作中看到的各种误解。我相信每个地方都有不同的看法。我认为,我立即想到的一个大问题是,数据是一种“新石油”,数据是一种非常重要的战略资源。我还认为中国是一个拥有“更多数据”的国家,通常给出的理由是,中国政府有能力监视其公民,收集其应用程序使用数据或类似的东西。或者有时只是人们谈论这样一个事实,即中国互联网用户经常使用一个名为微信的应用程序进行大量的在线活动。
海伦·托勒( 24:59 ):
因此,微信的所有者可以获得更丰富的中国消费者数据等等。我认为这个论点,首先,中国有更多的数据,其次,这是一个固有的优势,错过了一些不同的事情。它忽略的一点是美国科技公司的跨国特征。哦,对不起。我忘了一个关键部分。你可能认为中国互联网公司拥有大量数据的一个原因是因为中国人口更多。它有 14 亿人口。因此,我认为有一个地方有点不对,那就是像脸书、谷歌和微软这样的跨国公司,他们实际上是在为世界大多数国家服务,而不仅仅是美国。所以他们的用户群实际上非常庞大。这是一个简单的问题。
海伦·托勒( 25:45 ):
也许更重要的一点是这种感觉,我相信你的任何听众,无论是机器学习研究者还是工程师,在这方面都远远领先于我。但这种认为一种类型的数据将在某种程度上帮助你进行人工智能开发的看法,我认为总的来说是非常明显的错误,显然这不是你有像迁移学习这样的方法或以创造性的方式使用数据的方法,但总的来说,一种类型的数据将帮助你解决与这种类型的数据相关的问题。另一个误解是,或者说这个数据点是误解的另一种方式是,在给定的情况下,更多的数据有多大用处。
海伦·托勒( 26:23 ):
因此,我的理解是,我自己不是机器学习工程师,但我从我的朋友那里得到的印象是,如果你能给他们 10 倍或 100 倍的数据,也许他们的问题会有所不同,但如果你给他们 3 倍或 5 倍的数据,那真的不是决定性因素。但这通常是这样的,这种数据是人工智能的巨大战略资源的概念,已经真正扎根,并真正成为人们会立即引用的潜在假设。数据真的很重要,中国比我们有更多的数据,因此,然后他们进入他们的下一个点。这是我一有机会就会尝试去挑战的一个问题。
海伦·托勒( 27:02 ):
我想我对中国的另一个误解是,中国政府正在用监控技术做一些非常可怕的事情,新疆关押了一百万或者更多的穆斯林维吾尔人。但我认为误解是他们能做到这一点的原因是因为他们有这种超级先进的人工智能技术,这根本不是他们如何做的。他们使用了一些技术,在某些情况下使用了面部识别的监控摄像头。但很多都是在街上设置检查站,安全部队会拿走你的手机,检查你的手机,或者采用更传统的方法,这些方法真的不是前提,即使他们使用了技术,他们真的不是以使用最高科技的技术为前提的。因此,我认为把中国看作是一个正在使用所有可用工具来达到一些令人担忧的目的的国家是准确的,但是把中国看作是一个超级复杂的技术监控国家是不准确的。
杰里米·哈里斯( 28:04 ):
我想有趣的是,我想我想到的另一个因素也是人才或另一种资源,在某种程度上,你可以感觉到人才分布,中国与美国的人才储备。你能从战略上比较一下这两者吗?这在地缘政治竞争中会有怎样的影响?
海伦·托勒( 28:21 ):
毫无疑问。是啊。我认为这至少在华盛顿有点像误解的主要原因是,我认为人们对此考虑得不够。因此,我认为,从历史上看,至少在过去的 50 到 80 年里,人才一直是美国力量和战略优势的巨大源泉。就人才而言,我特别指的是国际人才向美国的流动,因为美国一直是全世界各种学科中最优秀和最聪明的人的中心。所以当谈到人工智能时,这实际上是一个非常重要的因素,人们希望来美国在美国大学工作,或者在美国大学学习,在美国公司工作。这既是因为这里人工智能生态系统的力量,也是因为其他原因,在很多时候,美国在很多方面都是一个适合居住的好地方。
海伦·托勒( 29:13 ):
从整体人才流动的角度来看,这真的很有趣,因为尽管中国的人口数量明显比美国多得多。如果你想的是精英研究人群,或者甚至是不那么精英但仍然受过高等教育的工程师和其他从事人工智能工作的人群。你最初可能会认为越大的国家越富裕,但是如果你有选择地将最优秀的人才转移到美国,这就提供了一个巨大的补偿。
海伦·托勒( 29:43 ):
因此,我认为这种现状,当然也是过去几十年的情况是,美国在人才方面处于非常好的状态。不幸的是,在过去几年里,联邦政府一直在做一系列不同程度的疯狂事情,让移民系统变得更加困难,或者对一些人来说根本不可能。因此,我认为这对美国来说绝对是一个巨大的历史优势,如果它不能扭转其中一些局面,它已经在冒着损害的风险,并将继续潜在损害。
杰里米·哈里斯( 30:21 ):
是啊。我猜与此相关的还有 COVID 和随之而来的中美关系的破裂,但也只是流动性的减少。我想这是两个不同的问题,但就第一个问题而言,COVID 对此有何影响?你是否察觉到政策格局的不同,或者说,哪些政策在今天看起来可行,哪些政策在 2019 年看起来可行?
海伦·托勒( 30:46 ):
我不确定我是否注意到了一个巨大的差异,当谈到美中科技关系时,我不确定 COVID 是近年来最大的改变。我认为美中关系受 COVID 影响的方式肯定不是友好的。因此,这使得两国关系的基础或背景变得更糟,但我认为更具体地说,美国政府和中国政府在过去几年里采取的各种特定行动更有影响。所以我想我认为这更多的是,我想我之前称之为海洋的那种,美中关系日益紧张,美国越来越担心中国在世界上的角色等等。
杰里米·哈里斯( 31:37 ):
有意思。是的,我想从国际合作的角度来看,我认为最关键的事情之一是中国自己对可解释性问题本身的认识。我觉得我对美国普通机器学习工程师对这些问题的敏感程度有一种直觉。这似乎是一个很高的基线,随着技术的进步,它可能会继续上升。但我想我在中国也有同样的问题,我不知道中国人是如何看待这个问题的。你对中国人在这方面的思维发展有更好的理解吗?
海伦·托勒( 32:13 ):
是啊,不幸的是我没有惊人的感觉。我想我知道中国在相关问题上做了一些工作,但不一定总是从这个角度出发。我认为,在中国,我不确定的一件重要事情是,这些技术将部署在什么样的环境中。那么,正在制定的激励措施是什么?例如,如果你是某家公司的工程师,你是否会受到激励去部署任何东西,并确保你完成一些事情,或者你是否意识到如果你的产品坏了,或者如果你的自动驾驶汽车坠毁了,或者其他什么情况,一些非常糟糕的事情将会发生?我猜想,在美国和中国,这些激励措施总的来说会相对相似。但是你当然可以想象,在某些情况下,可能会有更多的压力施加在某个特定的项目上,这可能会导致更糟糕的结果。但是,不幸的是,我没有第一人称的感觉。
杰里米·哈里斯( 33:07 ):
是啊。我想这本身就很吸引人,不仅仅是时间上,还有空间上的不确定性。我们只是不知道不同司法管辖区的心态如何。这是个非常有趣的问题。
海伦·托勒( 33:18 ):
是啊。我认为这也与人才流动的问题有关。我想,如果不同国家之间的人员流动减少,这也可能是 COVID 的一个结果。除了聪明人在这里工作和生活对美国的价值之外,这肯定是一个额外的原因。我也确实认为,人们跨越国界,与来自其他国家的人一起工作,并把自己看作是全球科学界的一部分,所有人都在研究类似的问题,而不是感觉他们只是与自己国家的人一起工作,并有更狭隘的观点,这真的很有价值。
海伦·托勒( 33:59 ):
所以我认为,是的,你完全正确,观点的潜在差异是一个非常有趣的观点。另一个非常有趣的问题是,国际关系有多紧密,比如说,有人去美国学习,然后回到自己的国家工作或类似的事情。你有那些持续的关系吗?这是否会影响不同国家对协作或合作可能性的思考,或者甚至会影响我们对外国发生的事情的理解程度,而不是更像朝鲜的黑匣子。
海伦·托勒( 34:34 ):
这是一个例子,说明我们显然没有什么感觉,因为来回移动性很小。
杰里米·哈里斯( 34:38 ):
是啊。我想我们只能希望那里的情况稳定,至少在 AI 方面。所以实际上最后一个领域,我确实想确定我得到了你们的想法,我最近在思考个人身份的问题。我知道你写过这方面的文章,尤其是关于隐私保护或保护个人身份的想法。我猜硬币还有另一面。我不确定我的这些担忧有多聪明,但当我展望未来时,我想象技术,特别是人工智能技术,将会提高到一个程度,在这之前我们所依赖的典型身份标志,看到某人的脸,听到他们的声音将不再可靠。当然,我们会有很深的假像,你的脸,声音强调,以及语音模式和声音的语音合成。你现在关注的这些问题,你认为这些是我们未来应该关注的问题吗?
海伦·托勒( 35:38 ):
这不是我花大量时间去做的事情,所以我不确定我是否有真正的专业知识来分享。我确实认为思考你所说的可能意味着什么是有趣的,例如,如果不再可能通过电话或视频来验证某事。我在这里想到的一件事是,我认为我们实际上也已经开始看到这一点,即有针对性的攻击利用这一点的可能性。正如我们之前所讨论的,现在这种合成是昂贵和困难的,需要相当多的努力,但是如果你为了一些强有力的理由在一些特定的操作中欺骗一些特定的人,这可能是值得的。所以在网络安全中,有这样的区别,例如,在网络钓鱼攻击和鱼叉式网络钓鱼攻击之间。
海伦·托勒( 36:27 ):
因此,网络钓鱼攻击的复杂性通常较低,会发送给广泛的人群。因此,这甚至可能像你收到的垃圾邮件一样简单。而鱼叉式网络钓鱼攻击,实际上是针对一个人或一小群人。你要为此付出更多的努力。我相信,我们已经基本上看到了类似的假声,有人曾经,我记得我听说过一个案例,一家公司的某人收到一封电子邮件,要求他们将这笔钱转移到某个账户。似乎是来自他们的老板。
海伦·托勒( 37:02 ):
然后他们拨通了邮件里的号码。也许不是他们的老板,因为他们会有他们老板的号码,但他们打了电子邮件中的号码,听到了他们认为是熟悉的声音,然后继续进行交易。我可能会把它和某人提出的假设混淆,我觉得我真的听到了一个真实的例子。
杰里米·哈里斯( 37:18 ):
基于什么样的技术,这听起来似乎合理,我的意思是,最终你会期望类似的东西是可行的。
海伦·托勒( 37:23 ):
我的意思是,我有点倾向于怀疑这样的事情是否真的会从根本上改变社会,因为我们已经看到像 Photoshop 这样的东西变得完全根深蒂固,我们只是能够很自然地适应它。我的意思是,Photoshop 有时确实会欺骗一些人。我敢肯定,这是我想也许你可以通过欺骗我们在脸书的叔叔或其他什么事情来制造一个真正有影响力的案例。但是,如果我是魔鬼代言人,我会说,但是拍一张真实的照片并在下面放一个假的说明也是一样有影响力的。同样在这里,我认为如果你真的不再相信视频中的人就在那里,或者他们的声音就是他们,我想我们会找到其他方法来解决这个问题。
海伦·托勒( 38:12 ):
我可以想象,在 10 年或 20 年后,我们会有一种不同的处理方式。关于视频或音频是真实的可能性,但我很难想象它真的有点连根拔起我们的一些基本假设。我很好奇你是怎么想的,也许你有不同的看法。
杰里米·哈里斯( 38:26 ):
我想我对这个问题的看法可能会偏离我的世界,也就是创业公司。我只记得我们参加了一个叫做 Y Combinator 的星巴克替代项目。每一年,我想,是的,每年他们都会举办一个叫做 YC 营的活动,一大群初创公司聚集在这里,他们有创始人,或者是大公司的创始人,特别是 Twitch。Twitch 的创始人谈到了身份在科技领域的未来。他基本上只是从房间里征求意见,从所有这些斗志昂扬的初创公司创始人那里,他们说,“嘿,我们真的很担心身份的未来,当涉及到在 Twitch 这样的社交媒体平台上保持声誉时,身份的可靠性。”正是因为这种事情,他们开始有点担心任何东西的匿名化,因为每个人都可以拥有一个匿名的加密帐户,一个匿名的 Twitch 个人资料,并且可以凭空制造人。
杰里米·哈里斯( 39:23 ):
但是就像你说的,我的意思是,想象有一个世界,事情只是平稳地发展,就像我们的叔叔们习惯了它,我们的阿姨们习惯了 Photoshop,我们将习惯于深度假货和语音合成等等。所以最后一个问题,只是大图,因为你在处理这么多不同的问题。我认为这将是一个很难回答的问题,但希望它会导致一些有趣的来回。如果你不得不选择一个你最关心的领域和一个你最乐观的领域,这就像是人们关心的当前问题,你认为它会得到解决。我很好奇哪一个可能是。
海伦·托勒( 40:02 ):
是啊。我的意思是,我认为有一个问题我并没有每天都去解决,但是我认为这个问题对于人类与计算机系统合作的未来将会是一个巨大的问题,有时它被称为对齐问题。本质上是这样一个问题:如果我们越来越多地将思考我们的活动外包给计算机,我们如何以一种真正高带宽、可靠的方式向那些系统传达什么对我们真正重要,什么对我们非常重要?我认为有很多不同的方式来思考这个问题,某种程度上集中在如果我们建立一个 AGI,它会有和我们一样的价值观吗?但我认为也有思考脸书新闻的方式,例如,在某种意义上,脸书试图做一些事情,它试图建立一个人们想使用的产品。
海伦·托勒( 40:55 ):
你可以认为这是一个很好的目标,但他们具体操作的方式实际上是根据这个简单的参与度指标。你会看到这些非常不理想的副作用,或者使用参与度这样的衡量标准的意想不到的效果,在理想情况下,你真正想要的或者我们真正想要的是幸福或者繁荣或者其他什么。我猜这不是脸书的使命,生产蓬勃发展,但我希望你明白我的意思,简单的,一个新闻源的例子,试图优化参与度,找到你“想看”的东西,根据你实际看的东西。事实证明,我们真正想要看到的,和我们真正想要如何花费时间,以及这个衡量标准优化了什么,实际上是有区别的。
海伦·托勒( 41:40 ):
我的意思是,我认为这真的很吸引人,作为一家公司,脸书的一个大问题将是一个完全不同的讨论。人们认为滚动通过脸书这个词厄运滚动已经成为嵌入式。我认为非常有趣的是,人们与这家公司有这种关系,他们使用这款应用程序,但他们不喜欢使用这款应用程序,他们希望自己少用这款应用程序。但我认为这是一个相对低风险的例子,说明了将我们关心的东西嵌入到非人类系统中的困难,嵌入到硅片中,嵌入到代码行中。这确实是一个巨大的挑战,因为越来越多的经济活动由我们的机器进行,越来越多我们过去自己做的事情被交给机器。
海伦·托勒( 42:26 ):
我认为,我们能在多大程度上继续引导未来朝着人类真正想要的方向发展,这对整个社会都有好处,这将是一个非常大的挑战。所以我认为这种排列问题的想法,是一种,某种程度上,从技术角度来阐述这个问题的方式。我想这个问题还有另外一个更为社会政治的角度,我也认为这个角度非常重要,非常吸引人,而且还没有解决。
杰里米·哈里斯( 42:53 ):
好吧,我也期待着找到校准问题的解决方案。是啊。一堆问题需要平行解决,但像你这样的人在政策方面工作很好,非常感谢你在这里分享你的见解和想法。
海伦·托勒( 43:07 ):
是啊。非常感谢邀请我。这很有趣。
挣扎和提示:我从自己的分类项目中学到了什么
实践教程
与 Iris 数据集不同,一旦你开始在一些非常规的数据集上做你的第一个项目,1001 个问题就出现了

因此,已经到了建议你“找到你自己的数据集,并产生一些有趣的分析”的地步。如果数据集不那么受欢迎,或者任务更模糊,定义更不明确,并且 Kaggle 上没有数百个可用的笔记本,那就更好了。从我(可能是很多人)的经验来看,这样的数据集乱七八糟,有遗漏的条目,有太多/太少的观察,所有的特征都是最原始的形式。我的数据集没有什么不同,在经历了第一个项目后,我很乐意分享我的过程,并强调一些我在这个过程中遇到的数据问题以及我是如何处理它们的。

我正在使用的数据帧的快照
首先,我正在处理的数据集是关于来自 Kaggle 的印度美食,它已经被许多人用于 EDA 任务。它只包含大约 250 个观察值(盘)和 9 个特征。尽管得到的样本量如此之小,我还是决定尝试一下,看看能否从这个数据集建立一个好的机器学习模型。故事是这样的,按时间顺序:
“定义问题”阶段:仅有 2 个数值变量!!

沃洛德梅尔·赫里先科在 Unsplas h 拍摄的照片
让我感兴趣的第一个问题是从其他变量中预测烹饪时间,因为我认为味道太容易预测了——比方说,辛辣的菜肴肯定有一些特定的成分;另一方面,饮食相当简单,因为它只是二元的(素食者对非素食者);每个州和地区都有各种各样的菜肴,所以用配料和口味作为这些菜肴地理位置的指标是没有意义的;最后,知道一道菜属于哪道菜不是很有趣,也没有帮助。然而,能够预测烹饪或准备时间可以帮助我们研究那些不太明显的特性组合(配料、口味等),这些特性组合使得一道菜烹饪起来慢/快。
数据集中只有两个数值变量(准备时间和烹饪时间),如果烹饪时间被设置为目标变量,准备时间将是唯一的连续自变量,这对于回归任务来说并不理想(事实上,我已经尝试过了,并且得到了一个很大的难以减少的 RMSE)。
为了解决这个问题,我通过将我的目标变量离散化为 3 个范围,将其转换为一个分类任务:1-quick ( <30 mins), 2-medium (30-60 mins), and 3-slow (> 1hr)。
>> bins = [0, 30, 60, 720]>> group_names = ['quick', 'medium', 'slow']>> df_train['cook_time'] = pd.cut(df_train['cook_time'], bins, labels=group_names)
“预处理数据”阶段 1:缺失值
>> df.isnull().mean().round(4)*100name 0.00
ingredients 0.00
diet 0.00
prep_time 11.76
cook_time 10.98
flavor_profile 11.37
course 0.00
超过 10%的观测值包含至少一个 NA 值。对于这样一个小数据集,删除所有这些行将留下非常少的数据点来训练模型,因此它不是这里的一个选项。相反,我将使用 sklearn 的估算模块估算 prep_time 和 flavor_profile 的缺失值。 cook_time 不应被估算,因为它是我们的目标变量,因此事先使用其他数据填充它没有意义,所以我们必须删除该特性的所有缺失值。我们从估算准备时间开始。看一看烹饪和准备时间的分布,我们可以看到它们都高度向右倾斜:

准备和烹饪时间直方图
因此,最合适的方法是使用 mode 来替换缺失值,而不是使用 median 或 mean。代码如下:
from sklearn.impute import SimpleImputerimp = SimpleImputer(missing_values=np.nan, strategy='most_frequent')df.dropna(subset=['cook_time'], inplace=True)*# fit transform the prep_time column*
df['prep_time'] = imp.fit_transform(df['prep_time'].values.reshape(-1, 1))
对于 flavor_profile,我将使用 k-最近邻来估算其缺失值。因此,这必须在预处理所有其他列之后进行,在本例中,大多数列目前都是多种格式的字符串,下面将详细介绍其中一些。预处理其他特征后,该部分的代码为:
from sklearn.impute import KNNImputer
imputer = KNNImputer(n_neighbors=3)df= imputer.fit_transform(df)
“预处理数据”阶段 2:配料栏

照片由 Calum Lewis 在 Unsplash 上拍摄
我有两种方法可以设计这个功能:对最受欢迎的成分进行热编码,或者对每种成分使用原始的 TF-IDF 分数。从实验来看,后者比前者有更好的准确率。对于这两种方法,我使用了 TF-IDF 分数来衡量一种成分代表了整道菜的多少特征。(你可以在这里阅读更多关于 TF-IDF 。这个想法是,普通的配料,如盐、胡椒等,可能并不代表一道菜的烹饪时间,也不代表它的味道,因为很多菜都含有这些配料。另一方面,可能存在一些成分的组合,表明这道菜将需要很长时间来烹饪,我们正在尝试挖掘这种模式。
我将在下面总结我是如何使用这两种方法的:
一个热门编码:
这种方法被广泛用作构建电影推荐算法的示例,其中我们将每部电影的类型编码为以下格式:

电影类型—一个热编码
我会做同样的事情,但不是一个热编码所有的成分,我只选择最“tf-idf 重要”的成分烹饪时间。首先,我将配料栏分为 3 类烹饪时间:
quick_dish = df[df['cook_time'] == "quick"]['ingredients']
medium_dish = df[df['cook_time'] == "medium"]['ingredients']
slow_dish = df[df['cook_time'] == "slow"]['ingredients']
然后我把它们变成一个长文档:
**def** one_doc(dishList):
string = ''
**for** dish **in** dishList:
string = string + " " + dish
**return** string
quick = one_doc(quick_dish)
medium = one_doc(medium_dish)
slow = one_doc(slow_dish)
其输出如下所示:
' Maida flour, yogurt, oil, sugar Gram flour, ghee, sugar Flour, ghee, kewra, milk, clarified butter, sugar, almonds, pistachio, saffron, green cardamom Cashews, ghee, cardamom, sugar Milk, cottage cheese, sugar Yogurt, milk, nuts, sugar Refined flour, besan, ghee, powdered sugar, yoghurt, green cardamom Firm white pumpkin, sugar...
然后我用 sklearn 的 TfidfVectorizer 计算他们的 TF-IDF 分数:
vectorizer = TfidfVectorizer()
vectors = vectorizer.fit_transform([quick, medium, slow])
feature_names = vectorizer.get_feature_names()
dense = vectors.todense()
denselist = dense.tolist()
pd.DataFrame(denselist, columns=feature_names)

由此产生的 tfidf 数据帧“虚拟”
然后,我提取了每个烹饪时间类型的“重要”成分,我在这里任意定义为每个文档中得分最高的 60 种成分,总共最多为 180 种成分(考虑到重复),这是理想的,因为最初我不想有比观察更多的特征,但是您可以改变这个数字,并查看哪个阈值给出最高的准确性。
all_important_ingre = []
**for** index, item **in** enumerate(denselist):
scores = {feature: tfidf **for** feature, tfidf **in**
zip(feature_names, item)}
sorted_words = sorted(scores.items(), key=**lambda** x: x[1],
reverse=**True**)
**for** word, score **in** sorted_words[:60]:
all_important_ingre.append(word)
top_ingre = list(set(all_important_ingre))
我的 all_important_ingre 变量现在将存储所有不同的重要成分,我们准备创建一个虚拟编码数据帧:
zeros = np.zeros((len(df_train), len(top_ingre)))
dummies = pd.DataFrame(zeros, columns = top_ingre)ingredients = df_train['ingredients']
sep_ingre = ingredients.apply(str.split, sep= ", ")
**for** i, dish **in** enumerate(sep_ingre):
dish = list(map(str.lower, dish))
indices = dummies.columns.get_indexer(dish)
dummies.iloc[i, indices] = 1
dummies*# joining the original dataframe*
df = df.join(dummies.add_prefix('ingre_'))

最终表格的一部分如下所示
我认为这种方法没有产生最佳结果的原因:除了有数百种成分和更少的观察值之外,当用 PCA 和 t-SNE 可视化时,我们的数据无法聚类成不同的组。似乎表明一种成分是否在一道菜里并不足以让算法学习和做出决定,因为我们的数据框架已经由除了 prep_time 之外的所有分类变量组成(这也是为什么保留原始 tf-idf 分数——第二种策略——有助于模型更好地执行)。
原始 TFIDF 分数
对于这种方法,我决定保留所有的配料,因为不像仅仅用二进制来表示一种配料是否包含在一道菜里,原始的 tfidf 分数已经表明该配料是否不重要。换句话说,在前面的方法中,配料 X 在菜肴 A 上的得分为 1,如果它在两个菜肴中都有,则在菜肴 B 上的得分为 1,这使得 A 中的 X 与 B 中的 X 相同;但是在这种方法中,X 可能比 B 更能指示菜肴 A 的烹饪时间,因此 X 在 A 处的得分是 0.6,而 X 在 B 处的得分可能只有 0.1。此任务的过程类似于前面的方法,但更简单:
vectorizer = TfidfVectorizer()
vectors = vectorizer.fit_transform(df_train['ingredients'])
feature_names = vectorizer.get_feature_names()
dense = vectors.todense()
denselist = dense.tolist()
dummies = pd.DataFrame(denselist, columns=feature_names)
one_hot_encode_data = one_hot_encode_data.join(dummies.add_prefix('ingre_'))
就是这样!
我建议两种方法都尝试一下,除非你的数据框架强烈表明,基于上述理由,一种方法会比另一种更好。简单地连接到前面的部分,这是我们继续使用 KNNImputer 为 flavor_profile 估算缺失值的地方。
“模型构建”阶段:一些好的实践
这些是我在做这个项目之前不知道的事情,但是在了解它们之后,我为自己节省了很多工作!
- 使用sk learn . model _ selection . cross _ val _ score轻松对数据集进行交叉验证。它返回每一次折叠所达到的准确度分数(或者您选择的另一个度量)的列表。在我对模型的所有评估中,我使用交叉验证的分数(这个列表的平均值和标准偏差)。我的所有模型(逻辑回归、随机森林、多重贝叶斯、SVM)在应用于重采样数据集时都提高了 10-20%。
**# example*
rf = RandomForestClassifier(random_state=0)
scores = cross_val_score(rf, X, y, scoring='accuracy', cv=4, n_jobs=-1)
print('Mean Accuracy: %.3f (%.3f)' % (mean(scores), std(scores)))*
- 对于你的基线模型,使用sk learn . dummy . dummy classifier。它使用简单的规则对数据进行分类,如使用最频繁的类别标签,或随机统一生成预测。
*model = DummyClassifier(strategy='most_frequent')
scores = cross_val_score(model, X, y, scoring='accuracy', cv=4, n_jobs=-1)
print('Mean Accuracy: %.3f (%.3f)' % (mean(scores), std(scores)))*
- 做错误分析:除了准确性,我们还应该考察 f1 的得分和召回率。最初,我只对类 3 进行了重新采样(因此在此之后,类 1 有 131 个示例,类 3 有 131 个示例,但类 2 只有 84 个)。在这个数据集上拟合模型,我观察到所有 3 个类的准确度和精确度都非常高。但是二班的召回率很差。进一步的检查表明,许多类别 2 的例子被预测为属于类别 1。正是这种过度预测的行为让我意识到,相比其他班级,2 班的代表性不足。通过修正重采样方法来修正这个问题,提高了类 2 的召回率,从而产生了一个总体上更好、更一致的模型。这是一个例子,说明研究你的模型所犯的错误是多么富有成效。
除了参数调整,特征工程和特征选择是构建机器学习模型不可或缺的两个过程。特性工程应该总是在特性选择之前,特性选择在参数调整之前。在特征工程中,我经常会想到一些常见的任务,比如缩放/标准化特征、创建新列(我们预处理‘成分’列的方式也是特征工程),以及更多特定于上下文的任务,比如处理不平衡的数据集,如下所述。对于特征选择,我使用了 sklearn 的特征选择模块,而选择 KBes t 是我最喜欢的技术之一。我在我构建的 4 ML 模型上尝试了“chi2”和“mutual_info”方法,每个模型都有我迄今为止拥有的 3 个数据集(一个是“前特征工程”,一个是“后特征工程,预重采样”,以及重采样数据集)。对于每一次拟合,我根据精度改变保留的特征数量(参数 k ),并选择产生最佳结果的阈值。
“特征工程”阶段:不平衡数据集

照片由 Piret Ilver 在 Unsplash 上拍摄
大大提高我的模型性能的一件事是在烹饪时间的 3 个类别中有一个平衡的数据集。目前,我有 131 道快菜,84 道中菜,只有 12 道慢菜。不平衡学习是一个建立在 scikit-learn 基础上的包,它提供了处理不平衡数据集的工具,如重采样、计算平衡精度分数等。这里,我使用一种称为 SMOTENC 的过采样策略对类 2 和类 3 进行过采样,以便它们具有与类 1 相同的观察结果。SMOTE 是过采样的常用技术;SMOTENC 构建于 SMOTE 之上,但可用于具有数值和分类特征的数据帧。
*X_resampled, y_resampled = SMOTENC(categorical_features=range(1,
11),random_state=0,sampling_strategy='minority').fit_resample(x_full2, y_full2)*
值得注意的是,虽然过采样有助于产生更好的结果,但它也有一些缺陷,因为它精确地复制了少数类的例子。因此,如果少数类中只有一个示例,那么在重新采样的数据帧中就会有数百个它的副本。这将导致严重的过度拟合。对多数类进行欠采样通常会更好。然而,由于我们的数据集非常小,这不是一个好策略。事实上,我的各种模型在 3 类中表现得非常好,但它与 1 类和 2 类的一些示例更加混淆。
“模型调整”阶段:堆叠模型

我通常会在对一些选定的模型进行参数调整后停下来,结束一天的工作。但是当我看到这篇关于改进 ML 模型的文章时,我看到了堆叠模型,这是一种我以前没有尝试过的技术。堆叠是一种有效的集成方法,其中通过使用各种机器学习算法生成的预测被用作第二层学习算法【1】中的输入。我们构建堆叠分类器的方式类似于我们制作管道的方式,具有我们在之前的调优阶段已经实现的所有最佳参数:
*models = [
('lr', LogisticRegression(C=2.976351441631316, max_iter=500) ),
('svm', SVC(random_state=0, C=6.158482110660261) ),
('rfc', RandomForestClassifier(n_estimators=130, random_state=0, max_depth=46))]level1 = LogisticRegression()stacking = StackingClassifier(estimators=models, final_estimator=level1, cv=5)*
之后,我们将在经过特征工程和特征选择的数据集上拟合模型。据观察,在单个模型上产生最佳结果的 k 值(即使所有模型具有相同的最佳 k 值)并不是组合模型的最佳 k 值。因此,我们也应该改变这个阈值,看看哪个 k 值表现最好。
一些结束语…
最后,我的性能最好的模型是随机森林和 SVM 的堆叠模型,使用了 mutual_info 特征选择技术,达到了 81%的交叉验证准确率。我认为用你的数据集和模型做大量的试验(和错误)是必要的。你测试的越多,你就越有把握获得最好的结果。众所周知,建立一个好的 ML 模型是一个探索和修正的循环,所以要有耐心,把任务分解,一次一个阶段地攻克它。我希望这篇文章能帮助你建立自己的项目,尤其是初学者。如果你做到了这一步,非常感谢你的阅读,祝你的项目好运!
这个笔记本的完整版本可以在这个 Github repo 中找到:
*https://github.com/irenechang1510/indian-cuisine-EDA
请随时通过我的 LinkedIn 联系我,如果您有任何问题,我很乐意与您联系!
[1] Güne,Funda。为什么堆叠集合模型赢得了数据科学竞赛?SAS 数据科学博客,2017 年。https://blogs . SAS . com/content/潜意识音乐/2017/05/18/stacked-ensemble-models-win-data-science-competitions/*
Python 3 中集合的子集(幂集)
查看递归、迭代和其他实现来比较它们的性能
我第一次想到这个问题是当我在一个与工作相关的项目中测试一个组件的时候。那时,我已经意识到,为了正确地测试组件,我应该生成看起来像是 2ⁿ独特的情况( n 是元素类型的数量)。2ⁿ…odd 巧合还是什么?
经过一番思考,我意识到这是一个通用的答案,因为这些是您可以从具有 n 个元素类型的集合中生成的子集类型的数量。我说了很多次类型,因为我想强调我在寻找可能的测试签名,不管内容是什么。
假设我们有一个函数, f ,它需要三个参数(三个是必须的,我们将用一个断言来说明)。如果我们允许 None (或者 null 取决于编程语言)作为输入,我们有多少种可能性? None (或 null )是一个泛型类型,通常分配给面向对象编程语言(如 Python 或 Java)中所有标准类型共有的对象(这是因为标准类型通常继承一些原始对象,如‘Object’)。答案是 8,因为我们要么把一些内容放在一些参数中,要么我们不⇔ 0 或 1,所以 2ⁿᵘᵐᵇᵉʳ ᵒᶠ ᵖᵃʳᵃᵐᵉᵗᵉʳˢ.
我将使用 Python3,使用生成器(因为是指数级的,所以我想节省内存)。幸运的是,有多种方法可以生成集合的幂集(通常这样称呼)。看到其中的差异还是挺有意思的。总的来说,我们有:
- 递归实现 I;
- 递归实现 II;
- 迭代实现;
- 使用工具中的链条和组合。
递归实现 I
我真的很喜欢这个(可能是因为这是我唯一一个从上到下起草的,其他的都是,稍微修饰一下,收集起来的)。在这个问题上,我以一种归纳的方式思考……这个问题,大小为 n,和它更小的表亲,大小为 n-1,一样多。我认为这是一个使用向后递归的好方法,在我们退出递归调用时构建解决方案。
我想强调一点。尽管【隐藏】,这个解决方案具有在所有递归实现中使用的思想——即完整的解决方案 S([H|T])=[H|S(T),S(T)](H——是初始列表的头部元素, T 是尾部(列表中的其余元素)。对于那些有 Prolog 背景的人来说,这应该看起来非常直观。
看着下面的代码,你可能会问,我们在哪里连接这两个解决方案(一个有 H,一个没有 H)。答案在循环的中,考虑到了 yield [] 部分。
def classical_recursive_one(elems):
yield [] # first return the result we’re sure about
for i in range(len(elems)):
for x in classical_recursive_one(elems[i+1:]):
# induction part
yield [elems[i]] + x sth = [‘neigh’, ‘category’, ‘purpose’]
for x in classical_recursive(sth):
print(x)
结果:
[]
['neigh']
['neigh', 'category']
['neigh', 'category', 'purpose']
['neigh', 'purpose']
['category']
['category', 'purpose']
['purpose']
递归实现 2
这个方法再次使用了向后递归,其思想是通过获取当前位置的元素或不获取当前位置的元素来构造解决方案:
def classical_recursive_two(elems):
""" Given a list of elements return a generator
that will generate all the subsets """
if len(elems) <= 1:
yield elems
yield []
else:
for item in classical_recursive_two(elems[1:]):
yield [elems[0]] + item
yield itemsth = [‘neigh’, ‘category’, ‘purpose’]
for x in classical_recursive_two(sth):
print(x)
结果:
['neigh', 'category', 'purpose']
['category', 'purpose']
['neigh', 'purpose']
['purpose']
['neigh', 'category']
['category']
['neigh']
[]
我将解释其他部分。这就是所有的乐趣所在。这反映了我在构建解决方案时提到的两个决策分支。所以对于子问题的所有可能解(这就是为什么需要对于,通过 2 个产量构造两个新的可能解。很简单…
迭代实现
这是做这件事的老方法。尽管如此,它还是很优雅。它利用了难以置信的特性😄从 1 到 2ⁿ的所有数字都是不同的。如果我们以 2 为基数写这些数字,那么这些 1 和 0 位可以解释为:“如果 1,则从列表中取出元素,如果 0,则不取出元素”。但是,嘿,我们实际上可以用一些比特运算魔法来做到这一点:
def classical_iterative(elems):
powerset_size = 2**len(elems)
counter = 0
j = 0
for counter in range(0, powerset_size):
results = []
for j in range(0, len(elems)):
# take the element if on bit position j it says to take it (i.e. 1 appears)
if((counter & (1 << j)) > 0):
results.append(elems[j])
yield results
sth = [‘neigh’, ‘category’, ‘purpose’]
for x in classical_iterative(sth):
print(x)
结果:
[]
['neigh']
['category']
['neigh', 'category']
['purpose']
['neigh', 'purpose']
['category', 'purpose']
['neigh', 'category', 'purpose']
使用 itertools 中的链和组合
这是为手懒的人准备的…尽管如此,这是对 itertools 的聪明使用。链用于将多个序列视为单个序列和组合来生成…所有可能的组合。这有什么特别之处,以及它与我们的问题有什么关系。恰好所有可能的 n 种组合的总和实际上是 2ⁿ.这是一个冗长的问题,需要一些时间来真正理解这个属性…本质上,如果您不理解这个解决方案,请尝试理解这个属性:
from itertools import chain, combinationsdef powerset(iterable):
"powerset([1,2,3]) → () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
s = list(iterable)
return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))sth = [‘neigh’, ‘category’, ‘purpose’]
for x in powerset(sth):
print(list(x))
结果:
[]
['neigh']
['category']
['purpose']
['neigh', 'category']
['neigh', 'purpose']
['category', 'purpose']
['neigh', 'category', 'purpose']
性能比较
好了,现在我们已经画出了解决方案,哪一个实际上更快。让我们来测试一下:
import matplotlib.pyplot as plt
from time import timedef time_me(func, elems):
start = time()
# Because it's a generator we want to evaluate it
list(func(elems))
end = time()
return end - start
def gather_times(func, min_value, max_value):
times = []
print(f"Gathering running times for {func.__name__}:")
for value in range(min_value, max_value):
test_elems = list(range(1, value))
times.append(time_me(func, test_elems))
print(times, '\n')
return times START = 3
STOP = 22
FIG_SIZE = (15, 10)funcs = [classical_recursive_one, classical_recursive_two, classical_iterative, powerset]
fig, axs = plt.subplots(2, 2, figsize=FIG_SIZE)
fig.suptitle('Perf. comparison on different sizes of the problem')
for i in range(2):
for j in range(2):
sol_func = funcs[i * 2 + j]
sol_times = gather_times(sol_func, START, STOP)
axs[i][j].bar(range(STOP-START), sol_times)
axs[i][j].set(xlabel=sol_func.__name__)
axs[i][j].set_xticks(range(STOP-START))

[图片由作者提供]
请看每幅图的 y 轴。您将看到,尽管所有方法都有指数级的运行时间(因为问题本身就是如此),但是 powerset 解决方案是最好的。相比之下,我的方法在迭代后的速度方面几乎是最差的…没关系,现在我们知道在生产中使用哪一个了。
数据散列:你可能从来不知道的数据分析技巧
散列数据不仅仅是为了验证软件下载

图片由 Pixabay 通过 Pexels 提供
几年前,我在一家人工智能初创公司负责运营。我们有一个很棒的团队,由才华横溢但相对年轻且缺乏经验的数据工程师组成,由一位才华横溢且经验丰富的数据科学家领导。这远不是一个不正常的设置。
我们在大部分结构化数据上做了很多模型;然而,清理其中的一些是一个熊。它源自我们的客户,包含历史业务记录。当然,正如所有好的数据函数一样,我们用各种内部和外部数据集适当地丰富了它。
有一天,团队在他们的发言中提到,重复数据消除花费的时间比预期的长得多。它只是没有按照它应该的方式进行,因此我们的时间表有所推迟。
我漫不经心地问:“你在哈希扫描吗?”
整个团队看着我,好像我有三个头。
起初,我怀疑自己是否不知何故与外界脱节了,因为这不是我的主要专业领域,而且我已经有一段时间没有做日常数据工作了。我脱离现实了吗?我是不是问了一个最愚蠢的问题,而没有人有足够的勇气告诉首席运营官,“嗯——当然。”
然后,一个勇敢的年轻人站了出来。“什么意思?”
我松了一口气,但也有点震惊。所以我回答说,“从你的数据中选取一个有代表性的子集,用密码散列它。然后使用生成的哈希进行过滤,而不是试图强行通过整个数据集。”
他们又一次看着我,好像我有三个脑袋一样,直到一个高年级学生说,“让我们试试。”
该站打破了,在几个小时内,他们有他们的结果数据集。
这项技术有明显的优点和缺点。在大型数据集上,哈希算法的计算开销可能很大,有时甚至是大材小用。然而,有时成本会被速度抵消。
几年前,我是一名全职法医和网络调查员。散列数据只是我 DNA 的一部分。我用它来验证重复的证据,以及识别要匹配的数据集——正面或负面的。
在此之前,我是一家小型开发公司的数据库管理员。不管出于什么原因,在我开始工作之前,他们就决定将表中的主键设为 GUIDs(全球唯一标识符)。由于当时是黑暗时代,在我确保我的恐龙被绑好以便它可以在回家的路上,我必须编写模块来确保 GUIDs 在我们的前端应用程序中正确生成。GUID 的构造(我在这里不严格地使用这个术语)本质上是唯一数据点的散列组合。
考虑到这两方面的经验,很自然地,散列可以用于在其他应用程序上提供匹配。
让我们深入了解一下我目前使用的一个用例。
我有一个从各种来源收集各种数据的应用程序。这些来源中的一些非常强大和可靠。其他的,就没那么多了。通常情况下,服务器会变得很忙,或者出现其他问题,导致数据无法正常获取。
现在,在设计这个系统的时候,我知道这些资源的局限性。我考虑在检索过程中创建某种形式的错误纠正,这将进行一轮验证,以确保数据是完整和正确的。但是,这看起来工作量很大。
因为我获取数据并将其放入数据存储,所以我有其他选择。
我查看了整个流程和 API 的功能。我有一个选项来扩展我的数据调用窗口,这样我就可以记录比我需要的更多的数据,并捕获以前尝试中可能遗漏的任何数据。
勾选了一个框。我知道我绝不会冒丢失数据历史的风险,因为丢失的连接可以在随后的尝试中弥补。
然而,我如何有效地将记录放入我的数据库,而不必在以后创建一个过程来清除重复的记录呢?我不介意插入,但删除往往需要清理周期表和膨胀的磁盘空间。这对于临时表之类的东西来说是可以的,但是对于在应用程序中经常使用的主表来说就不行了。
易于修复和快速解决。
我在主表中添加了一个字段,其中包含该行数据的散列。我的数据检索过程只是在数据下来时对其进行哈希处理。
然后,我创建了一个进程,在这个进程中,新检索到的数据首先被写入一个临时表。使用一个基本的查询,我可以轻松快速地识别出主表中没有的新行。这些新行被插入,临时表回到它原来的地方。
如果没有哈希,我能完成所有这些吗?绝对的。会不会更容易?也许吧。如果不经历一系列困难和编写更复杂的代码,我能完成这一切吗?大概不会。
前面的例子只是创建数据的数字指纹的许多有用方法之一。这很简单,也注定如此。但是还有很多其他更强大的应用程序。
什么是哈希?
您可以自由探索它的许多实现,但这里有一个简单的解释。这是一种算法,它检查作为输入提供的整块数据,并使用加密方法生成一组代表该数据的唯一位。
因为它是已知的算法,所以是可重复的。如果将 jpeg 或文本文档或硬盘图像输入算法,如果数据相同,输出也将相同。如果内部数据发生变化,输出也会发生变化。
但是碰撞呢?!?
对于那些没有完全了解这个主题的人来说,各种散列算法,特别是在受控环境中执行的精心制作的输入,会返回与不同数据段相同的输出。在某些应用中,这是一个需要考虑的因素,但这种风险非常小,在实际应用中几乎不值得一提。然而,当提到散列时,它似乎总是不时地出现,所以它值得在这里解决。
减轻这种担心很简单——使用不同的算法,输出更大的数据。使用 MD5,你把指纹压缩成 128 位。如果您使用 SHA256,该空间会急剧扩大。它会占用更多的空间,但如果这能让你和你的超能力者晚上睡得更好,那就值得了。
从数据科学的角度来看,哈希是帮助清理数据的一个非常好的工具。不仅仅是从数据库中。
假设你正在做一个大规模的图像分类项目。根据您的来源,获取一组清晰的独特图像可能是一项挑战。除非你想坐下来看你所有的图像,否则你会有一段艰难的时间,除非你使用哈希。
这是一个简单的功能,可以让每个人的生活稍微轻松一点。
高维空间中距离度量的惊人行为
了解距离度量如何在高维🧊中失去其意义和功能

丹尼尔·利维斯·佩鲁西在 Unsplash 上的照片
0)简介
距离度量 ,像欧几里德、曼哈顿、闵可夫斯基等等,在我们增加数据的维度数量(特征)的时候损失很大。就好像它们冲淡并失去了它们的意义。变得不可靠。
这不是很容易理解,而且它与更多的功能等于更好的机器学习模型的一般理解相冲突,这远不是真的。
减少我们的数据的维度是应该总是尝试去做的事情,以便去除冗余或有噪声的特征。您可以在本文 中了解到关于特征选择 的所有信息。
此外,当我们要使用计算距离度量的算法时,像 PCA 或核 PCA 这样的降维技术是一个非常聪明的处理选择,可以应用于我们的数据。
有一篇 机器学习领域的名义论文 讲的是距离度量专门遭受维数灾难。
然而,这篇论文并不令人惊讶地直观,并且有许多复杂的数学公式,所以在这篇文章中,我将以简单渐进的方式解释为什么像欧几里德距离这样的距离度量在高维计算时会遭受如此多的损失。
首先,我们将看看什么是著名的维数灾难,以及它如何影响我们的机器学习算法。
然后,我们将具体了解它如何使距离度量失去意义,并浏览本文最重要的部分。
最后,我们将把所有的东西融合在一起,以一种高度可视化的方式,引入其他资源和见解,从而解决这个难题。
https://z-ai.medium.com/subscribe
Lets get to it! 🏁
1. What is the Curse of Dimensionality?👻
维度的诅咒是指在高维度(有很多特征)中分析或摆弄数据时出现的某些行为或效果,这些行为或效果在维数较低时不会出现。
我们人类的直觉和理解仅限于三维世界。如果保持在这个参照系之内,我们可以直观地推导出事情为什么会发生,逻辑上得出一些假设。然而,我们很难理解当我们被带离这个有限的维度空间时会发生什么。
正因为如此,当我们的数据有很多维度时,高维度对我们的模型和算法的影响可能会逃脱我们的直觉,尽管我们知道这样一个事实,即更多的特征并不总是导致我们的机器学习管道中更好的结果。
更多特征究竟是如何影响机器学习的?
让我们来看看吧!👓
2.更高维度如何影响我们的机器学习算法?🔎
大多数时候,我们倾向于将包含许多特征的数据集扔给我们的模型,然后等待看结果如何,希望如果结果不够好,更多的特征会起作用。然而,事实远非如此。
机器学习管道中最重要的步骤之一是选择那些真正改善我们模型的特性并保持它们简洁、可理解和可扩展。这是通过特征选择或降维技术完成的,这可以被视为特征选择。
让我们看看当我们添加更多的特征时会发生什么,从而为我们的数据添加维度:
- 随着维度数量的增加,我们的数据变得更加稀疏。每一个新的维度都增加了特征空间的体积,使我们的数据有更高的区分机会,因此,它在高维空间中比在低维空间中更分散的可能性更大。这意味着,如果我们需要更多的同类训练样本,以便我们的模型能够了解它们,并能够在未来很好地预测它们,进行概括。
- 训练我们的模型需要更长的时间:随着维度数量的增加,特别是对于参数模型,我们会增加训练它们所需的时间。
- 增加噪声并降低模型性能:引入对我们的模型没有增加多少价值的特征并因此增加维数,使得我们的模型从这些“噪声”或不相关的特征中学习,并可能导致其性能降低。参见休斯现象——在训练样本数量固定的情况下,分类器或回归器的平均(预期)预测能力首先会随着使用的维度或特征数量的增加而增加,但超过某个维度后,它会开始恶化,而不是稳步提高。
- 我们的模型更复杂:更多的特征和维度导致模型比那些特征数量少的模型更复杂、更难解释。
- 距离指标失去了它们的意义:最后,随着我们增加数据的维度,我们数据集的两点之间的平均距离也会增加。这就像用来计算距离的度量变得模糊不清,失去了它的意义。此外,对我们的数据点在高维空间中的分布也有进一步的影响。
最后一个似乎有悖直觉,所以让我们深入探究一下,找出原因!🧊
3.更高的维度如何影响距离度量?🏙️
我一直在说,随着我们增加数据的维度数量,距离度量有点失去了它们的意义。然而,我从未展示过这是真的任何例子。
让我们缩小范围,从头开始研究这个现象:一条简单的直线➖!
3.1 —一维:简单的直线
让我们看一条长度为 1 的直线(一维)。

一维空间(一条线)的度量—作者图片
上图显示了长度为 1 的一维空间(直线)。
首先,如果我们沿着这条线随机产生 500 个点,并计算落在 1 维空间界限的 10%距离内的点(从 0 到 0.1 和 0.9 到 1 的那些点),并计算这些点相对于总点数的比率,我们得到总点数的大约 20%落在该类别内(在点之外的点,红色点),80%在剩余空间内
这是一个需要计算的重要指标,我们稍后会看到原因。此刻,只要记住落在一维空间边缘或界限附近的点的比例:大约 20%。
其次,如果我们从这 500 个点中随机选取任意两个点,计算它们之间的距离,并重复这个过程 10000 次(足够的次数来确保我们得到一个有代表性的样本),选取的两个随机点之间的平均距离为 0.34 。
这是我们要考虑的第二条信息:我们数据中任意两点之间的平均距离,正如我们将看到的,随着维度数量的增加,它会变得更大。
让我们来看看正方形的⬜️!
3.2–2 维:一个完美的正方形
现在,让我们看看在一个由边长为 1 的正方形定义的二维空间中会发生什么。

二维空间(正方形)的度量—作者图片
和前面的例子一样,我们在我们的二维空间内随机生成一系列点,在本例中为 2000 。
然后,我们计算这些点中有多少是在我们的二维空间的边缘附近(在与整个空间共享中心的边长为 0.8 的正方形之外,或者在到边的距离的 10%之内),并将这个数字除以总点数,以得到有多少随机生成的样本在边缘附近的想法。
这次大约是 37%,比一维示例中多 17%。
其次是,我们计算随机选择的两个点之间的距离10.000 次,然后对结果取平均,得到我们数据集的任意两个点之间的平均距离 0.52:比一维示例中的多 0.18!****
你可以开始看到这里发生了什么,对吗?随着我们增加维度,接近我们特征空间的边缘或界限的点的数量增加,并且任意两点之间的平均距离也增加。
让我们在我们能够可视化的最后一个维度空间中检验一下这个:一个 3D 的立方体🏗️!
3.3–3 维:一个完美的立方体
为了结束这条路线,并让你相信这是一件真实的事情,在解释为什么会发生之前,让我们看看一个单面的三维空间的数字:一个立方体。

三维空间(立方体)的度量—作者图片
这一次我将跳过指标是如何计算的以及它们的含义,因为我们已经看过两次了。
可以观察到的图案****仍然在那里:不在‘内部’立方体内的点的比率为 49% ,比正方形高 12%,并且两个随机选择的点之间的平均距离为 0.65 ,比我们的二维示例中的高 0.13。
你可能想知道。总是这样吗?如果我们计算有多少个点不接近 N 维空间的极限,N 的范围从 1 到 8 维,我们得到以下输出:
For 0 Dimensions the proportion of points inside is 0.80
For 1 Dimensions the proportion of points inside is 0.63
For 2 Dimensions the proportion of points inside is 0.51
For 3 Dimensions the proportion of points inside is 0.40
For 4 Dimensions the proportion of points inside is 0.32
For 5 Dimensions the proportion of points inside is 0.26
For 6 Dimensions the proportion of points inside is 0.20
For 7 Dimensions the proportion of points inside is 0.18
For 8 Dimensions the proportion of points inside is 0.13
如您所见,随着我们增加数据的维度数量,越来越多随机创建的样本(可能在任何地方)走向空间的极限或极端。
如果我们有一个超球体形状的无限维空间,所有的点都在这个♾️维空间的表面:如果它是一个橙子,每个点都在表皮上,我们就没有多汁的内部。
此外,任意两点之间的距离变得越来越相似,因此使用距离度量(例如 K-means 所需的度量)来评估两点的接近程度没有什么意义,因为几乎每个点都与所有其他点一样接近。
下表总结了我们刚才看到的 1 维、2 维和 3 维示例。

包含前面提到的 1 维、2 维和 3 维指标的表格
让我们用通俗的语言看看这篇论文说了些什么,然后结束这一切,揭开这个神秘现象的面纱🔮!
4.高维空间中距离度量的惊人行为💯
我们谈到的论文(你可以在这里找到)从范数 K 距离度量的角度解决了这个问题。L1 范数是曼哈顿距离,L2 范数是著名的欧几里得距离,等等。
它首先介绍了诅咒维度,探讨了如何以一种特殊的方式影响距离度量。然后,讨论并提供证据表明,较高的范数度量比较低的诅咒度量遭受更多的诅咒。
论文的每一页都覆盖着如下丑陋的数学公式,吓走了恐惧的读者。

高维空间中距离度量的惊人行为。定理 1。
然而,他们的结论很容易解释,而且非常有影响力:
- 在高维空间中数据变得更加稀疏。
- 随着维度数量的增加,的邻近概念或最近点失去了它的效用,变得不那么有意义。
- 随着维数接近无穷大,最远点到另一个点和最近点之间的距离比变得接近 1: 最近邻问题变得难以定义。
- 某个 Lk 范数或距离度量的 k 值与度量随着尺寸增加而降低的程度直接相关。
- k 的这个值越高,由高维度中的距离度量提供的最近和更远的邻居之间的对比度越差:对于非常高的维度,较低的范数度量,如曼哈顿(L1 范数)可能比较高的范数度量如 L2 欧几里德距离表现得更好。
这些最后的结果可以在下图中看到:

高维空间中距离度量的惊人行为。图一。
这些图表显示了随着数据维度(x 轴)的增加,最远的点和最近的点之间的距离。我们可以看到,对于 k = 3,这种差异开始走向 0。对于 k = 2 ,当我们增加维度时,这种差异似乎收敛到一个恒定值,而对于 k = 1 ,这种差异发散到无穷大。
这意味着更高的范数度量(更高的 k 值)在最远的点和最近的点之间提供了更差的对比度(因为当我们增加维数时,这两点之间的距离收敛到 0)。
在证明了这一点之后,本文继续探索分数距离度量 (0 < k < 1) ,表明这些可以提供比以前研究的距离度量更好的结果和对更高维度的更大弹性。
论文最后显示,在高维度(20 个用于合成数据,168 个用于 Musk 数据集,32 个用于乳腺癌,34 个用于电离层)中,分数范数距离度量比 K-means 聚类算法中的更高范数距离度量工作得更好,K-means 聚类算法试图将数据类别识别为不同的聚类。
牛逼!探究了一下这篇论文的内容之后,让我们解释一下为什么会发生这一切,然后用一个令人敬畏的、有见地的结论来总结。
5.把一切都包起来,✔️
好吧,那么为什么会这样呢?我们可以从所有这些中得出什么实际的隐含结论?
为什么我们的距离度量会在高维空间中丢失?为什么随着维度的增加,我们的点越来越接近 N 维空间的极限?为什么两个随机点之间的距离会增加?为什么我们的数据在高维空间更稀疏?
让我们回到广场。正方形定义的空间内部的尺寸为 L*L(正方形的面积)。这是我们的数据点所在。对于正方形来说,这个空间的边界是它的周长: 4L 。
如果我们计算极限值/内部值的比值,我们得到 4L/L*L,也就是平方的 4/L。
让我们对立方体进行同样的推理。立方体内部的空间为 LLL,空间的极限为 6L*L,由立方体的 6 个平方面定义。
因此,如果我们执行相同的计算,并得到立方体上的极限/内部的比率,我们得到 6LL/LL*L,这是 6/L,高于正方形的情况!

正方形和立方体的极限/内侧比的比较。图片作者。
如果一直这样下去,计算一个 N 维立方体的 极限/内 的比值,这个数就一直变得越来越大,分母总是有一个 L,但名子越来越大。
这告诉我们什么?简单:随着我们增加特征空间的维度,相对于总的特征空间,处于极限的空间比例变得更大。这就是为什么当我们为一条线、正方形和立方体随机创建点时,我们看到越来越多的点接近极限。瞧!问题回答。👌
我挑战你对一个圆和一个球做同样的事情。看看能不能得出类似的结论!小提示:如果你把你的无限维球形空间想象成一个无限维的橙子,你的所有数据点都将靠近果皮,没有一点会在里面美味的水果中游动。🍊
接下来。为什么我们的数据在高维空间更稀疏?基本上,如果我们增加维度或特征,我们的数据就有更大的机会与其他数据点区分开来。
假设你有一个关于人的数据集。如果只有人的年龄,基本上可以做出四五组:很年轻的人,年轻人,中年人,老年人,老年人。如果现在你加入另一个维度,比如性别,你就把可能的组合翻倍了。如果你加上第三个因素,比如身高,如果我们按照身材矮小、正常和身材高大来分组,那么分组的可能数量就是原来的三倍。看到我要去哪里了吗?
维度越多,我们的数据就越有可能与众不同,变得独一无二,这就是数据变得越稀疏的原因。这也是为什么两个随机点之间的距离随着更多维度而增加的答案:每个数据点都变得越来越独立,与其他数据点不同!
最后,为什么最远的点和最近的点之间的距离越来越小直到 0?这在一定程度上与我们刚刚看到的数据变得更加独特和稀疏有关。随着维度的增加,我们会使数据点之间的差异更大,并给它们更高的区分机会。
随着维数的增加,我们的数据变得越来越稀疏。这意味着特征空间被占据的比例减少。
随着空间变得越来越大,数据变得越来越稀疏,最近的点和最远的点之间的差异变得越来越小,直到它在无穷多个维度上达到 0。塔兰!
数据在高维空间中确实表现古怪。
底线:在计算距离度量时,使用特征选择或特征重要性和降维技术的组合,尽量保持你的特征数量适中。您将会看到,除了促进可解释性和减少培训时间之外,这在很多情况下会导致模型性能的提高。
https://z-ai.medium.com/subscribe
仅此而已! 更多关于机器学习的资源请查看 以下回购 ,希望大家喜欢!
请继续关注我的下一篇帖子!
在那之前,保重,享受人工智能!
感谢阅读!
全球人工智能慈善事业的惊人挑战
播客
李岩分享了在全球范围内利用技术造福人类的经验
编者按:这一集是我们关于数据科学和机器学习新兴问题的播客系列的一部分,由 Jeremie Harris 主持。除了主持播客,Jeremie 还帮助运营一家名为sharpes minds的数据科学导师初创公司。
我们最近录制了一些播客,内容是关于人工智能现在和将来会造成的问题。我们已经讨论了人工智能的安全性、一致性、偏见和公平性。
这些是重要的话题,我们将继续讨论它们,但我也认为不要忽视人工智能和类似工具在此时此地给世界带来的价值是重要的。因此,在本期播客中,我采访了李岩博士,他是一名研究数据管理和分析的教授,也是致力于将技术用于人道主义公益的非营利组织 Techies Without Borders 的联合创始人。Yan 拥有开发和部署技术解决方案的第一手经验,可用于从西藏到海地的世界各地的贫困国家。
以下是我在对话中最喜欢的一些观点:
- 当你试图在偏远或贫困地区开发技术时,你会遇到令人惊讶和违反直觉的限制。许多我们认为理所当然的基础设施——从自来水、电力到可靠的互联网——根本不存在。解决技术问题,比如提供一种新的医疗诊断工具,需要一些开箱即用的思维,这种思维通常对可用的基础设施做出更少的假设,强调独立的功能和本地存储。Yan 提供了几个这样的例子,并解释了她不得不开发的特定解决方案在不同的地区会有所不同。
- 发展中国家的人们通常更怀疑技术,更不信任算法和应用程序的输出。出于这个原因,严指出,算法可解释性的价值在这些情况下增加。由于当地医生不理解或不信任黑盒医疗诊断算法的预测,因此黑盒医疗诊断算法的预测未被使用并不罕见,因此无国界技术人员投入了大量精力来确保预测不透明。
- 将数据用于社会公益最具挑战性的一个方面是,并不总是清楚哪些指标需要优化。在盈利性创业公司的背景下,目标要清晰得多:增加收入,降低成本。非营利组织需要数据分析师首先解决一个更加抽象和哲学的问题:如果我们不能用美元来衡量我们的进展,那么定义成功的标准是什么?对于数据专家来说,这是一个独特的挑战,也是深入理解获取相关业务指标的过程的好方法。
你可以点击查看无国界技术人员。

章节:
- 0:00 介绍
- 2:15 无国界技术人员的基础
- 11:09 提供这些技术的限制
- 17:00 了解当地经济和基础设施
- 18:40 信任的概念
- 28:45 确定 TWB 的指标
- 33:10 远程跟踪全球项目
- 35:48 解决方案的修改
- 39:00 隐私问题
- 44:25 总结
斜道和梯子中令人惊讶的有趣数学
我写了一个 MATLAB 程序,模拟 100,000 个滑梯游戏。这是结果。

图片由作者提供
简介:
滑道和梯子是一个基于完全随机机会的游戏。不涉及任何策略。你的棋子移动完全取决于你每回合旋转的数字。虽然这对某些人来说是一个相当无聊的游戏,但它为那些对数据科学感兴趣的人提供了一个游戏模拟器的坚实基础。
滑道和梯子规则:
这个游戏极其简单。轮到你时,你转动一个转盘,得到一个 1 到 6 之间的数字。从空格 0 开始,你移动你的棋子到转盘给你的空格数。如果你在梯子上着陆,你爬上梯子到上面的空间。如果你降落在滑道上,你会滑到下面空间。第一个到达第 100 个空间的人就是赢家。
游戏编码:
一开始,我让一个随机数生成器在 1 到 6 之间选择一个数字。然后,棋子被移动到新的空间。如果棋子落在滑道或梯子上,它会被带到新的空间。
while gameover == 0 % keeps the loop going if game is not overturns = turns + 1; % keeps track of amount of turnsspin = randi(6); % random number between 1 and 6spin_data(length(spin_data) + 1) = spin; % adds spin value to datasetstart = start + spin; % moves pawnif turns == 1 % if first turnstarting_spin = spin; % adds dial value to first spin datasetendfor i = 1:length(ladder_start) % checks if pawn should go up ladderif start == ladder_start(i)start = ladder_end(i);breakendendfor i = 1:length(chute_start) % checks if pawn should go down chuteif start == chute_start(i)start = chute_end(i);breakendend
该程序也有检查棋子是否正好到达第 100 个空格以获胜的部分。
if start > 100 % if space is above 100start = start - spin; % takes pawn back to original spotendif start == 100 % if pawn reaches exactly 100gameover = 1; % ends gamebreakend
平均转盘值、第一次转盘值、最佳和最差转弯量,甚至空间着陆的次数等所有数据都被记录下来,并用于制作图形,以帮助显示滑道和梯子内的数学。
结果:
在滑道和梯子中到达第 100 个空间的平均圈数是 38.93 圈,标准差是 24.81。下面是每场游戏回合数的直方图。

图片由作者提供
最好的滑梯游戏只需要旋转 7 次转盘。从空间 0 开始,他们旋转了一个 1,这将他们带到了梯子上的第 38 个空间。然后他们旋转了一个 5 和一个 3,把他们带到了第 46 个空间。另一个 5 导致另一个梯子送他们到空间 67。刻度盘旋转 4 把他们送上第三个梯子到空间 91。最后,6 和 3 的刻度盘将它们放在第 100 个空格上,如下所示。

图片由作者提供
最糟糕的滑梯游戏进行了令人难以置信的 312 圈。即使每一轮只花了你 10 秒钟,你仍然需要 52 分钟来完成游戏(假设你只是一个人玩)。下面是在这个可怕乏味的游戏中采取的路线。

图片由作者提供
如你所见,当棋子到达 80 以上的空间时,有 9 个不同的时间,只是为了它不得不滑回到 20 或 30。
在这一点上,我开始想知道你的开始旋转是否会影响你需要旋转多少次才能获胜。事实证明,确实如此:
- 开始旋转 1 圈:平均 35.482 圈获胜
- 开始旋转 2 圈:平均 40.508 圈获胜
- 开始旋转 3 圈:平均 39.713 圈获胜
- 开始旋转 4 圈:平均 37.999 圈获胜
- 开始旋转 5 圈:平均 39.977 圈获胜
- 开始旋转 6 圈:平均 39.857 圈获胜
在你的第一个回合中旋转 1 可以大大减少获胜的预期回合数。这是因为它会把你直接送到第 38 个空间,就像之前提到的最好的滑梯游戏一样。旋转一个 4 会给你更大的获胜机会,因为这将把你送上通往空间 14 的梯子。总的来说,2 是最差的开始值,因为它没有连接到它的梯子,它阻止你在下一个回合到达空间 9(它有梯子)。
因为你的开始旋转确实对你的预期胜率有一些影响,我想知道你在比赛过程中的平均旋转值是否对你的胜率有任何影响。

图片由作者提供
事实证明,平均而言,旋转较低或较高的数字确实会增加您获得较低的预期成功机会。这与 100%的时间没有关系(最好的游戏平均旋转值为 3.86),但有趣的是,模拟中有更多的 3 和 4 旋转平均游戏时间更长。
就像我在我的垄断模拟中所做的那样,我想找出每回合后哪些空间最有可能被占据。这些结果如下所示:

图片由作者提供
空的空间是梯子或滑道的起点,所以它们不会以棋子结束。异常高的空间是有梯子或滑道末端的空间。正如你所看到的,在 20-40 之间有一个更高的曲线,一旦超过 75。第 99 个空格非常高,因为玩家会被困在这个空格中,试图旋转 1 来得到正好 100。这导致多回合结束时,玩家不会从第 99 点开始移动。
结论:
滑道和梯子可能是随机的,但这并不意味着游戏中没有任何模式。马上旋转 1 会增加你的胜算。平均较低或较高的旋转值也可以帮助你赢。这些都无法控制,但它仍然是我在游戏中发现的有趣的东西。
如果您对这类内容感兴趣,我推荐您阅读我关于棋盘游戏模拟的其他文章:
开关变压器
谷歌大脑的语言模型可以自动开关
在过去的三年里,基于 Transformer 的语言模型(LMs)一直在自然语言处理(NLP)领域大出风头。变形金刚通常是在大量非结构化文本上预先训练的巨大网络,捕捉通常有用的语言属性。然后,预训练的模型可以针对无数的最终任务进行微调,如问题回答或机器翻译,即使是在适量的标记数据上(见本文了解预训练 LMs 的最新趋势)。谷歌在多项 NLP 基准测试中的记录保持者 T5 型号,最近被它自己的开关变压器超越。

托马斯·詹森在 Unsplash 上拍摄的照片
并非所有的知识总是有用的。事后看来,这一观察结果有些明显,是开关变压器效率的关键,因为它将推理成本从模型的总大小中分离出来。
开关变压器目前因其一万亿个参数而获得媒体报道。虽然这款车型的尺寸的确引人注目,但我觉得它的效率故事更引人注目。鉴于谷歌大规模运营的历史记录,这一成就不难预料;主要的构建模块(Tensorflow、 MeshTensorflow 、TPUs)已经存在很长时间了。更值得注意的是,在相同的计算成本(以每个输入令牌的 FLOPS 数衡量)下,开关变压器的预训练速度比其 T5 前身快得多。考虑到建造越来越大的模型的持续趋势,看到扩大模型大小并不一定意味着使用更多的能源是非常令人鼓舞的。
术语免责声明
我将使用名称开关变压器来指代新提出的架构,而不是其具体的 1.6 万亿实例化。该论文从多个维度对这一架构进行了评估,包括层数、自我关注度和“专家”(下文将详细介绍)。该模型的特定实例具有特定的配置和参数计数,其名称类似于 Switch-Base、Switch-Large、Switch-XXL 和 Switch-C (后者具有 1.6 万亿个参数)。当对比 Switch Transformer 和它的 T5 前身时,作者特别仔细地比较了两种架构的兼容实例。为了使文章简单,我会说得不那么精确,但是请记住,开关转换器不仅仅指的是开关-C,的最大实例化。
变压器“开关”什么?
与硬件网络交换机如何将传入的数据包转发到其目标设备类似,交换机变压器通过模型路由输入信号,仅激活其参数的子集。隐含的假设是,并非模型中存储的所有信息都与特定输入相关。这有些直观——大概在预培训期间遇到的 Python 3.9.1 的文档在阅读莎士比亚戏剧时没有太大帮助。并非所有的知识在任何时候都是有用的,这一点在事后看来有些明显,这是开关变压器效率的关键,因为它将推理成本从模型的总规模中分离出来。
建筑细节
本节假设您熟悉 Transformer 架构。如果没有,你可以看看无数教程中的一个,像插图变压器。简而言之,一个变形金刚是一个很深的多头自我关注层堆栈。在标准架构中,每一层的末端都有一个前馈网络(FFN ),用于聚合来自多个头部的输出。开关变压器用多个ffn 代替这个单个 FFN,称他们为“专家”(可以说是双曲线)。在每一次向前传递时,在每一层,对于输入中的每个令牌,模型恰好激活一个专家。换句话说,在正向传递过程中,开关变压器使用的参数与层数相同的标准变压器大致相同(加上路由参数,其大小可以忽略不计)。

图 2 来自开关变压器纸。左:标准变压器块。右图:一个开关变压器块。将单 FFN 换成多ffn(名为“专家”)。每个令牌通过其指定的专家传递。
复制 FFN 权重而不是模型的一些其他参数(如自我关注中的键/查询/值矩阵)的决定似乎是实验性的。作者报告说,他们试图将专家添加到模型的其他部分,导致了训练的不稳定性。
模型如何决定启用哪个专家?
给定一个中间令牌嵌入 x (由下面的层产生),模型需要选择一个 FFN 专家来通过它。决策过程依赖于一系列简单的操作:
- 嵌入 x 乘以路由矩阵 Wᵣ (与模型的其余部分一起训练的可学习参数)以获得每个专家的分数:分数= x * Wᵣ
- 分数被标准化为概率分布,因此它们在专家中总计为 1:p = soft max(分数)
- 嵌入 x 以最高概率通过专家 i 。最后,输出(即,更新的令牌嵌入)是由专家产生的激活,由它的概率得分加权:x’=pᵢeᵢ(x)*
开关变压器的贡献
说明单个专家就可以了。
诚然,神经网络中条件计算的基本思想(每个输入只激活参数的一个子集)并不新鲜。四年前发表的类似[2]的先前研究在 LSTMs 的背景下探索了专家混合层:在这样的层上,网络选择多个专家并汇总他们的输出。先前的工作假定至少需要两个专家来可靠地训练路由参数;以前的直觉是,一个专家与给定输入的相关性只能相对于其他专家来衡量——因此需要对比至少两个专家。
开关变压器表明,在存在鼓励专家之间统一使用的附加损耗项的情况下,选择单个专家可能足以训练有用的路由参数。不可否认,要更深入地了解为什么这次损失如此有效,还需要进一步的调查。一个潜在的解释(论文中没有提到)是,当每一层上的每个令牌激活一个单个专家时,一个训练批次由多个令牌组成。由于新增加的损失项鼓励专家多样性,多标记批次将在多个专家之间进行某种间接比较。
激活单个专家节省了 FLOPS 和通信成本(因为只有一个专家需要将其输出发送到网络的其余部分)。
它为训练不稳定提供了解决方案。
与传统变压器相比,开关变压器需要跨越额外的障碍。首先,关闭模型某些部分的硬切换机制引入了稀疏性。已知模型稀疏会导致训练不稳定,换句话说,稀疏模型可能对随机种子敏感(随机种子决定了初始参数值、训练数据的混排、要丢弃的值等)。),所以不同的训练跑可以导致不同的表现。为了对抗训练的不稳定性,作者建议通过将它们的标准偏差从 0 缩小来降低参数的初始值。
第二,为了降低计算成本,Switch Transformer 使用了 bfloat16 格式(“谷歌大脑浮点”),与更标准的 float32 形成对比。精度低是训练不稳定的另一个原因。作者通过让专家在内部使用 float32 来解决这个问题,同时向网络的其余部分公开 bfloat16 API。由于每个专家都生活在一个器件上,float32 值永远不会离开芯片,器件间的通信保持低分辨率。
它提供了一个关于规模和效率的有趣研究
考虑到建造越来越大的模型的持续趋势,看到扩大模型大小并不一定意味着使用更多的能源是非常令人鼓舞的。
通过改变计算预算和参数计数等方面,本文得出了以下有趣的观察结果:
- 将专家池从 1(相当于标准的转换器)增加到 2、4、8 等等,直到 256,显示了性能的持续增加,而没有额外的计算成本(因为无论池的大小如何,只有一个专家被激活)。
- 开关变压器比普通变压器更快地解决了同样的困惑。例如,基于交换机的模型达到完全收敛的基于 T5 的模型的 LM 性能所需的时间约为 7 倍。
下游性能
作者表明,Switch-Base 和 Switch-Large 实例化不仅在语言建模方面,而且在一系列下游任务(如分类、共指消解、问题回答或摘要)方面,都超过了它们的 T5-Base 和 T5-Large 对应物。
参考
- Fedus 等人:开关变压器:利用简单有效的稀疏性扩展到万亿参数模型 (2021)
- 沙泽尔等人:异常庞大的神经网络:稀疏门控的专家混合层 (2017)
让数据科学团队变得敏捷的技术障碍
以及如何解决这些问题的一些建议
我不打算宣扬敏捷的好处;我就说很好,你要练。但是,如果您试图在您的组织中实现敏捷滚动,但无法实现,那么阻碍因素可能是技术挑战。有时候,管理层只谈论需要发生的文化变化和心态转变。这是因为管理通常不是技术性的,因此无法讨论与变得敏捷相关的硬技能。无论你鼓励敏捷多少次,或者让员工坐在那里接受几个小时的培训,如果不首先在技术技能上投资,它都不会持续下去。
在这篇文章中,我将回顾我所写的步骤,这些步骤确保团队能够敏捷,并经历必要的步骤来学习技能并在变化中进行转变。作为一名数据科学家,我正在编写的步骤是面向数据科学项目的,但是您可以很容易地用其他技术和框架来替代我所包含的技术和框架。这些问题很多的根本原因(在我看来)是大部分数据科学家都不是优秀的程序员。如果你碰巧是一名伟大的程序员,很有可能你最终成为了一名软件工程师,这使得我们的领域缺少有丰富编码经验的人。

希望你觉得这很实用,这些步骤对你来说足够具体——向团队中的其他人展示这些步骤可能会更有用,这样他们就会了解即将发生的变化。我最近读了雷伊·达里奥的《T4 原则》一书,我想从书中提到的一点是,如果你想让人们觉得和你打交道很容易,你需要写下你生活的原则/规则。这些步骤最重要的主题是写下并公开发布你想看到的变化,因为这最终会推动敏捷的采用。在项目开始时公开这些步骤有助于团队看到他们需要采取的必要的改变。
第一步:GitHub
- 当您的项目开始时,立即在一个组织内创建一个 GitHub 存储库,而不是绑定到任何一个人的帐户。
- 自述文件应作为入职文档。一旦你用一些粗略的信息填写了文件,你需要直接在标题下面包括下面的话。“此文档由最近加入团队的人维护。那个人目前:____”通过明确说明谁负责,并使其成为最近的人,为下一个人消除了他们在加入团队时的困惑。我还建议加上“欢迎任何人的改变。”
- 明确声明任何人都可以查看您的自述文件中的代码。如果有人不熟悉代码的某一部分,他们可以通过回顾来熟悉它。
- 编辑您的回购设置。使主分支受到保护,不允许任何人直接推送到主分支,并且只允许已经通过单元测试(稍后将详细介绍)并经过代码审查的 pr。

要为 GitHub repo 编辑的设置
第二步:ZenHub(替代工具:吉拉、特雷罗)
这一步是迫使团队变得敏捷的一步。在项目开始时,你可能没有很多任务要分配,因为可能会有设计/需求讨论。同时,任务是更新团队与敏捷相关的技能。例如,如果一个团队不知道 git,他们就不能在迭代中工作,如果他们不知道 CI 工具,他们就不能实践持续集成,如果他们不能编写测试,他们就不能实践 TDD。当有人试图提升团队的技能时,他们通常要求人们学习生产中使用的技术,而不是敏捷中使用的技术。因此,没有人被分配学习敏捷背后的硬技能的任务。是时候表明这一点了。
- 检查以确保您的团队成员确实了解 git:人们倾向于说他们了解,但实际上并不十分熟悉。检查这一点的方法是查看他们的 GitHub 或企业 GitHub 帐户(如果你有企业帐户的话)。在网址中搜索以下:https://github.com/search?q=author:<插入-GitHub-用户名> 这应该告诉你他们已经提交了多少;如果他们只有几次提交,那么他们可能不太理解 git。明确给他们分配学习 git 的任务。我在这里要做的是给他们分配一门关于 Udemy/LinkedIn Learning/O ' Reilly/等的课程。如果他们可以访问这些,并要求他们在被分配 ZenHub 中的其他任务之前出示完成证书。很可能你的工程团队对 git 没意见,但是在数据科学团队中,这不太可能是真的,这就是为什么我包括了这一步。这可能让人感觉高人一等,但从长远来看,这使得每个人都更有效率,并防止谎称了解 git 的团队成员不知所措。它还可以帮助您更好地估计团队完成一项任务所需的时间,因为您知道谁在技能方面落后。
- 检查以确保您的团队熟悉编写单元测试。为了做到这一点,我会搜索某人是成员的所有回购协议,看看其中是否有单元测试。如果没有,或者很少,他们现在可能需要熟悉如何写它们。就像 git 的情况一样,您应该要求完成一门关于您选择的语言和框架的课程。作为一名数据科学家,对于我的项目来说,这通常是 Python 和 pytest。在你的自述文件中包含一个类似“我将编写单元测试”的声明,每个人都在下面键入自己的名字,这确实有助于创建测试。
步骤 3: CI 工具
从项目一开始,就有必要设置 CI 工具。这将在每次有人制作 PR 时运行您的单元测试。然而,大多数人并不十分熟悉 CI 工具。实际上,我认为每个团队需要有一个人使用它。但是,如果你正在努力让敏捷在你的整个组织中运行,要求整个团队学习它将有助于敏捷在其他团队中的传播。特拉维斯奇、切尔莱西和詹金斯是最常见的选择。同样,把学习这些工具作为你的 ZenHub 任务板的一部分,不要让人们在学会之前继续学习。
第四步:站立
根据我的经验,单口相声变成了一个讨论项目策略的冗长的日常会议。这不是站起来的重点。起立发言应该只是用来讨论你的日常工作,而且应该简短。之所以称之为站立,是因为你应该站着(这样可以鼓励人们更快地完成会议)。如果有必要召开一次会议来全面讨论这个项目,那就在会议结束后马上进行。
以下是我建议做的事情:
- 鼓励打开相机 15 分钟。
- 只回答 3 个问题:你今天会做什么?你昨天做了什么?你被什么挡住了?屏幕分享这三个写在 PowerPoint 幻灯片上的问题。再次强调,人们今天正在做的事情应该是在转移到其他任务之前的指定课程。当这些人完成课程时,祝贺他们。
- 分配一个每周变化的 scrum master 角色,这个人不必是老板或最资深的人。scrum master 确保上面的 3 个问题都被每个人回答了。
结论
你可以把时间花在创造好的软件上,但这可能不会发生。相反,我认为你应该把你的时间集中在创建好的过程上,好的软件会自然而然地出现。敏捷实际上让我的生活变得更容易,但是当你不知道如何鼓励实践它时,事情就变得困难了。我在我做的项目中遵循这些步骤,我的压力水平就大大降低了。我喜欢没有压力。
关于阿帕奇卡夫卡内部的事情!
详细描述了 Kafka 的保证背后的实体,如容错、数据持久性等。

(图片来自 Photogenica Sp。授权给 Wojciech Nowak)
介绍
Apache Kafka 文档是关于这个平台的最佳知识来源之一。它包括介绍性信息、快速入门指南、实现细节、API 描述等。
最近,在浏览网页时,我遇到了一个很好的比喻,它很好地描述了卡夫卡哲学背后的事件流的概念。
“事件流是人体中枢神经系统的数字等价物。”
坦率地说,关于不仅是事件流的简要描述,还有 Apache Kafka 本身,已经没有什么可说的了。它接收记录,存储它们,并在必要时提供访问。就像神经系统一样!
记住上面提供的简短介绍,尽管它具有文学价值,但它没有带来关于 Apache Kafka 的内部细节,因此,在接下来的章节中,我将讨论 Kafka 的一些技术细节(如代理、数据分发、数据复制和数据保留)。
注意!
建议之前有 Apache Kafka 的经验的人从这篇文章中受益。因此,如果你对 Kafka 没有太多的经验,或者你没有听说过它,请参考介绍性文章—“为 Apache Kafka 设置场景”。
经纪人
你应该已经知道卡夫卡是作为一个集群工作的。每一个都由分布在不同数据中心的一个或多个服务器组成。单个 kafka 服务器被称为代理(或引导服务器),可以通过整个集群中的唯一 id 号来识别。

阿帕奇卡夫卡中的经纪人-作者图片
代理管理偏移量,将消息保存在磁盘上(更准确地说,是 kafka 在 linux 上运行时的文件系统缓存),并处理与客户端(发布者和订阅者)的通信(接收消息、获取数据请求和处理心跳)。根据硬件能力,单个代理每秒可以处理数百万条消息。
代理可以在 kafka 集群中相互合作,因此,一旦一个客户端连接到任何 kafka 代理,它就连接到整个集群中的所有代理。在集群中的所有代理中,有一个代理作为领导者(控制者)工作。这种主服务器是自动选择的(你将在最后一段——Zookeeper & Broker 发现中读到这一点),并处理管理操作(即分配分区给其他代理)。
数据分发、数据复制
整个集群中的每个分区都由一个代理拥有,这个代理被称为分区的领导者。分区也可以分配给多个代理,换句话说,分区可以在集群中复制。在这种情况下(当复制因子大于 1 时),消息被复制并存储在整个集群的其他代理中。

洞察 Kafka Brokers(主题和分区的分布)-作者图片
通过使用一种称为主备份模型的机制,消息在集群中复制,这意味着其中一个分区作为领导者工作,而其他分区试图与领导者同步,作为追随者工作。

洞察 Kafka 集群(主题和分区复制)-作者图片
这种体系结构提供了数据冗余,防止数据丢失、数据流中断(在某些条件下)以及由于领导者分布在不同的代理上而导致的消息服务延迟。
数据保持
在存储消息时,Kafka 提供了一种保留机制。正确配置的 Kafka 集群可以防止延迟、过载甚至故障。根据需要和特定用途,有几种选择来形成配置。
首先,Kafka 可以在给定的时间段内存储消息(例如,4 小时或 10 天)。另一种可能性是设置阈值的大小(例如,5GB),在这种情况下,当达到这些限制时,从集群中删除“遗留”数据。
大多数情况下,保留机制是在整个 Kafka 集群上配置的。但是,对于某些用途,还可以在单个主题上设置保留。通过这种方式,存储指标和日志的主题可以将保持期设置为 6 小时。而作为事件源的主题可以存储开始以来的数据。
主题配置的最后一种方式是日志压缩。在这种情况下,只有使用给定密钥发送的消息才会存储在该主题中。
动物园管理员&经纪人发现
由于一个客户机只需要连接到一个代理就可以连接到整个集群,因此每个代理都必须知道所有不同代理的存在(也知道集群中的所有主题和所有分区)。
这就是为什么每个代理都必须连接到 Apache Zookeeper,它存储了给定集群中与实体(如代理、主题、实践等)相关的所有数据。此类“数据”被称为元数据(或配置数据),由现有主题列表、kafka 集群内创建的所有主题的确切分区数量、副本位置以及哪个节点被选为领导者的信息组成。

动物园管理员在阿帕奇卡夫卡平台中的作用-作者图片
说到领导节点(或控制器)——Zookeeper 是一个执行“控制器选举”的地方。如果集群中的一个节点发生故障,控制器的工作就是向适当的分区发送关于这种故障的信息,并选择新的引导分区。
免责声明!
有计划将动物园管理员从阿帕奇卡夫卡项目中移除。Kafka 的过渡版本将同时拥有传统模式(带 zookeeper)和不带它的新模式。在以后的版本中,zookeeper 可能会从 Apache Kafka 项目中完全删除。在这种情况下,本段将不再有效。如果你想知道 kafka 将如何执行 broker discovery 和 Zookeeper 现在完成的所有工作,请参考文章底部提到的来源中的第三个位置。
总结
Apache Kafka 有许多方面,其中包括人们必须知道的实体(如主题、分区、偏移量)、生产者和消费者特性、交付示意图或 Kafka 集群的内部结构。
本文以一种让您理解数据的分布、复制和保留等方面的方式介绍了最后一种方法。所有这些立场使得 Kafka 的保证,如数据的容错性、高可用性和持久性成为可能。
了解了 Apache Kafka 的内部之后,您可以使用 Kafka 作为消息总线、集成点、摄取平台甚至整个系统的核心来构建更成熟的应用程序。
您已经阅读的文章并不是 Apache Kafka 平台之旅的终点。
还有很多东西要学。因此,如果你想扩展你对卡夫卡其他方面的知识,可以参考下面提到的资料。
致以最美好的祝愿。继续前进,祝你好运!
WN。
[1]阿帕奇卡夫卡 2.3 |文档 https://kafka.apache.org/documentation/
[2]卡夫卡:权威指南|尼哈·纳克赫德、格温·沙皮拉、托德·帕利诺|奥莱利媒体公司| 2017 年 11 月 1 日
[3]Confluent-removal-Zookeeper-Dependency-in-Kafka 的博文|https://www . Confluent . io/Blog/removal-Zookeeper-Dependency-in-Kafka/
[4]阿帕奇动物园管理员文档|https://zookeeper.apache.org/documentation.html
自然语言处理的三种解码方法
从贪婪到光束搜索

O 自然语言处理(NLP)中序列生成的一个经常被忽视的部分是我们如何选择我们的输出标记——也称为解码。
您可能会想——我们根据模型分配的每个标记的概率来选择标记/单词/字符。
这是对的,在基于语言的任务中,我们通常会构建一个模型,将一组概率输出到一个数组中,数组中的每个值代表一个特定单词/单词的概率。
此时,选择概率最高的令牌似乎是合乎逻辑的?嗯,不尽然——这可能会产生一些不可预见的后果——我们很快就会看到。
当我们在机器生成的文本中选择一个标记时,我们有几个替代方法来执行这个解码——还有修改确切行为的选项。
在本文中,我们将探讨选择输出令牌的三种不同方法,它们是:
> Greedy Decoding> Random Sampling> Beam Search
理解每一种方法的工作原理非常重要——在语言应用程序中,解决输出不佳的方法通常是在这四种方法之间进行简单的切换。
如果您喜欢视频,我在这里也介绍了所有三种方法:
我在这里用 GPT-2 测试了一个笔记本。
贪婪解码
我们最简单的选择是贪婪解码。这将获取我们的潜在输出列表和已经计算的概率分布,并选择概率最高的选项(argmax)。
这似乎是完全合乎逻辑的——而且在许多情况下,它运行得非常好。然而,对于较长的序列,这可能会导致一些问题。
如果您曾经见过这样的输出:
默认文本是我们输入到模型中的内容——绿色文本已经生成。
这很可能是由于贪婪的解码方法停留在一个特定的单词或句子上,并一次又一次地重复分配这些单词集的最高概率。
随意采样
我们的下一个选择是随机抽样。就像之前一样,我们有了潜在产出和它们的概率分布。
随机抽样基于这些概率选择下一个单词,因此在我们的示例中,我们可能有以下单词和概率分布:

随机抽样允许我们根据模型预先分配的概率随机选择一个单词
我们将有 48%的机会选择“影响力”,21%的机会选择“伟大”,等等。
这解决了我们陷入相同单词重复循环的问题,因为我们给预测增加了随机性。
然而,这引入了一个不同的问题——我们经常会发现这种方法过于随意,缺乏一致性:
因此,一方面,我们有贪婪搜索,这对于生成文本来说太严格了——另一方面,我们有随机采样,这产生了奇妙的乱码。
我们需要找到两者兼而有之的东西。
波束搜索
波束搜索允许我们在选择最佳选项之前探索输出的多个级别。

梁搜索,作为一个整体的'实践,他已经'得分高于任何其他潜在的路径
因此,贪婪解码和随机采样仅基于下一个单词/标记计算最佳选项,而波束搜索检查未来的多个单词/标记,并评估所有这些标记组合的质量。
从这个搜索中,我们将返回多个潜在的输出序列——我们考虑的选项的数量就是我们搜索的“波束”的数量。
然而,因为我们现在回到排序序列并选择最可能的—波束搜索可能导致我们的文本生成再次退化为重复序列:
因此,为了抵消这一点,我们增加解码temperature——它控制输出中的随机量。默认的temperature是1.0——将这个值推高一点1.2会产生很大的不同:
经过这些修改,我们得到了一个奇特但连贯的输出。
这个文本生成解码方法总结就到此为止!
我希望你喜欢这篇文章,如果你有任何问题或建议,请通过 Twitter 或在下面的评论中告诉我。
感谢阅读!
来源
如果您对学习如何在 Python 中建立文本生成模型感兴趣,我写了这篇短文,介绍如何在这里建立:
*除非另有说明,所有图片均出自作者之手
商业分析中三个最重要的统计测试
行业笔记
学术界一直在发明新的方法,但在商界,只有三种方法承担了大部分工作

作者图片
统计测试多得数不过来;它们都有存在的理由,数学家们一直靠发明新的东西赚钱。但是根据我的经验,实际上业务分析师只需要知道三个基本的测试:
- t 检验
- 卡方检验
- 科尔莫戈罗夫-斯米尔诺夫检验(通常称为 K-S 检验)
在商业分析中,大部分时间你都在处理平均值、计数或分布。让我们来看几个例子和我对应用什么测试的建议:
- 比较两个月之间的平均订单值,以确定它们在统计上是否相同。在这种情况下,使用双边 t 检验来比较两个平均值。
- A/B 测试比较测试体验和控制体验的销售数量,以确定哪个版本产生更多的销售。在这种情况下,使用 2x2 卡方测试来比较每次体验的销售(和非销售)计数。
- A/B/C 测试,比较三方测试的销售数量,以确定哪个版本产生的销售更多。在这种情况下,使用 3x2 卡方测试来比较每次体验的销售(和非销售)计数。这可以推广到任何数量的版本。因此,如果您有 N 个版本要测试,请使用 Nx2 卡方测试。如果你正在运行一个多变量测试,这就是你要做的(确切地说是一个全因子版本的测试,这意味着你要明确地测试每一个可能的经验组合…通常在实践中非常困难)。
- 比较流程 A 和流程 B 产生的错误数量的 A/B 测试(例如,您可能在生产流程中增加了一个额外的 QA 步骤,并希望确定该额外的 QA 步骤是否减少了至少 1%的错误,以使您产生的额外成本获得正 ROI)。再次使用 2x2 卡方检验。
- 比较星期一和星期二的销售分布。我说的分布是指你得到 1 笔销售、2 笔销售、3 笔销售的概率,以此类推,直到那天你得到的最大销售数量。通常情况下,大多数企业都有一些看起来像高斯或泊松的分布。在这种情况下,您可以使用双边 K-S 检验来比较这两种分布。
实际上,t 检验和卡方检验比 K-S 检验更常用于商业。这没有什么神秘的原因;原因是商业中的大多数问题都归结为看平均数或计数。一个商业问题要求一个分析师查看一个分布是非常罕见的……尽管我个人认为商业应该比现在更频繁地查看分布。业务用户常常认为,仅仅因为两个平均值相同,生成这些平均值的底层过程就相同。但实际上它们可能完全不同。直接检查分布比仅仅检查平均值更有启发性。然而,我承认在实践中很难收集到足够的数据来构建一个可靠的分布(例如,你一年中只能有 365 个日销售额,而一个企业在一年中可能会发生如此大的变化,以至于这 365 个样本中的许多可能来自不同的分布)。
在这三种测试中,以我的经验来看,t 检验往往是大多数分析师最熟悉的,因为它是几乎所有统计学 101 课程中教授的测试。并且相对容易应用。然而,卡方检验和 t 检验一样重要,但对分析师来说却鲜为人知。我见过用 t 检验代替卡方检验的情况,但这会导致错误的结论。我们可以用一个简单的例子来很容易地确定什么时候一个合适,什么时候另一个合适。假设我们执行以下测试:一大群人来到一个有两扇门的房间,一扇门在左边,一扇门在右边。一个接一个,随机给每个人一张黄牌或红牌。一旦人们收到他们的卡,他们被要求选择左边的门或右边的门,并进入他们选择的房间。一旦每个人都收到一张卡片并选择了一扇门,我们就可以问几个关于这个实验的问题。
- 卡片的颜色,一个分类变量,影响了多少人选择了左边还是右边的门?用卡方检验来回答这个问题。
- 左边房间的人的平均身高和右边房间的人的平均身高不同吗?用 t 检验来回答这个问题。
我们可以用第二个问题的结果来确定卡片的颜色是否影响了人们的选择吗?例如,如果我们对每个房间里的人的平均身高进行 t 检验,检验结果是在 99%的置信水平下,平均身高是相同的,那么我们能得出卡片的颜色没有影响的结论吗?不会。考虑这样一种情况,每个收到红牌的人都选择了左边的门,每个收到黄牌的人都选择了右边的门。在其他条件相同且人口足够多的情况下,左边房间的人的平均身高在统计学上与右边房间的人的平均身高相同,但显然卡片的颜色决定了人们选择哪扇门。t 检验暗示卡片的颜色对人们做出的选择几乎没有影响,但是卡方检验清楚地表明卡片的颜色对人们做出的选择有压倒性的影响。t 检验没有错;它仅仅是被误解了,因为它被应用于错误的问题。这就是统计分析的危险!
顺便说一下,在统计分析理论方面非常有知识的人可能会反对 t 检验和卡方检验在某些情况下可能不合适,因为它们是参数检验(即,它们为生成数据的过程假设了非常具体的基础分布)。t 检验假设高斯分布,卡方检验假设卡方分布。这是一个合理的反对意见。然而,根据我的经验,对于业务问题来说,这并不太重要,原因和我在之前的帖子中提到的一样:业务问题本质上是“嘈杂的”,并不总是能够收集到足够的数据来计算可靠的基本分布,从而为统计测试提供更细微的选择。更不用说潜在的分布可能会随着时间的推移而改变,使整个努力成为徒劳。因此,在实践中,我发现在处理业务数据时,不必担心确切的基本分布并使用这两个参数测试是足够可靠的(尽管我承认在我过去的生活中,当我是国防工业中处理技术数据的工程师/科学家时,这不是真的…但那是另一个时间的讨论)。对于更有技术头脑的读者,我将提到——特定于 t-检验——中心极限定理保证在许多具有非高斯基础分布的现实世界过程中,将生成趋向于高斯分布的度量……在这种情况下,t-检验可以可靠地使用。K-S 检验是非参数检验,它对基础分布不做任何假设,因此这些问题都不适用。
网上有很多解释如何实现这三个测试的资料,我都数不过来了。然而,如果有人对我发表一篇关于如何计算每一个的文章感兴趣,请在下面评论,因为我认为太多的来源会使它变得更加复杂。
机器学习团队中的三个角色(以及连接它们的两种技术)
机器学习管道和特征存储如何帮助连接数据科学家和工程师。

照片由 Aaron Burden 在 Unsplash
角色正在分化
我们几年来一直在跟踪的一个趋势是,数据科学专业如何从完全独立、无所不能的独角兽转向更加专业化的工作。这并不意味着在几个领域拥有深厚知识的个人消失了,而是对数据科学的需求增加了,团队的人数也增加了。在更大的群体和更活跃的就业市场中,专业化的空间更大。
不仅仅是厨房里有更多的厨师,而且机器学习解决方案的范围也更加雄心勃勃。
考虑团队的能力变得越来越重要,而不是期望每个人都成为机器学习相关领域的专家。这与软件工程角色分为后端、前端和开发运维工程师非常相似。
机器学习系统往往有以下三种不同类型的贡献者:
他们每个人都专注于机器学习系统的不同部分。自然,每个角色之间都有重叠,我们可以确定系统中这些角色最容易合作的几个关键部分。

作者图片
数据工程师
数据是机器学习的基础,但在机器学习相对较新的复苏之前,数据已经成为一个热门话题。多年来,数据工程师一直承担着为各种其他应用程序(如商业智能)构建数据基础设施的任务,很明显,采用机器学习将需要他们的能力。
那么,他们构建数据基础架构意味着什么呢?简而言之,他们创造了接收、存储、转换和分发数据的系统。确切的术语完全取决于他们所处理的用例及数据的类型,例如,数据仓库或数据湖是否是正确的解决方案。
数据工程师围绕数据问题与数据科学家交流。最常见的话题可能是 it 的可用性。数据科学家需要访问数据来进行实验和训练模型,而数据工程师则负责提供便利。
特征存储:数据工程和数据科学的交叉点
最近,特征存储已经成为数据工程和数据科学之间的一个解决方案。特征存储将用于机器学习的数据整合到单个位置,并允许数据科学家定义数据转换,该数据转换将信息提取为对 ML 模型非常有价值的信号(即,特征)。从特性库中,特性可以不间断地交付给培训渠道和生产。
数据科学家
数据科学家的任务是为业务问题寻找数据驱动的解决方案。例如,他们可能会查看用户数据以找到有意义的用户群,并构建模型将这些用户分类,以区分最终用户体验并提高参与度。
虽然数据科学家的主要目的是探索数据和构建模型,但清理和争论数据往往是他们工作流程中最耗时的部分。这就是为什么特征库正在成为端到端 ML 基础设施的重要组成部分。
数据科学家的主要关注点是构建机器学习算法。然而,科学家的环境和最终目的地——生产环境——之间往往有相当大的距离。
许多团队已经为促进 ML 模型生产的个人扮演了机器学习工程师的角色。
机器学习管道:数据科学和机器学习工程的交叉点
生产环境不同于研究环境。生产中的模型将需要执行,即使当底层世界改变和数据漂移出现时。许多团队已经意识到,模型将需要像第一次一样,以同样严格的纪律反复再培训。
机器学习管道是数据科学和 ML 工程的交汇点,训练和测试模型的过程已经被编码。然后,可以根据需要频繁运行管道。在管道上合作比数据科学和工程之间的移交更可取,因为它确保所有最初的意图和知识都被带到生产中。
机器学习工程师
使机器学习能够在云上训练和服务的技术(如 Kubernetes)通常不是数据科学家核心能力的一部分。
因此,机器学习工程师作为 ML 的产品化专家应运而生。为了大致描述工作流的特征,数据科学家构建并验证模型,而工程师则确保它从模型扩展到生产系统。
然而,与数据工程一样,思维已经转向平台,其目标更多地是建立一个共享系统,工程师和科学家在其中协作,而不是交接。虽然数据工程师负责数据管理平台(或特征库),但 ML 工程师负责 MLOps 平台,该平台包括用于训练、版本化和服务模型的组件。
此外,ML 工程师还想出了如何监控生产模型,以确保提供的预测具有预期的质量,并且服务本身在任何时候都是可用的。监控通常还与要素存储和数据工程联系在一起,因为重要的是基础数据自上次模型定型以来是否发生了变化。
角色分化提供了个人专业化的希望,因此更有生产力。此外,对组织的承诺是从每个业务问题一个人扩展到每个业务问题一个团队的能力。

作者图片
然而,团队必须采用一种平台方法,而不是将每个角色分别孤立起来以实现这些承诺。采用允许不同职位的专家合作并一起构建生产机器学习系统的流程和技术(通常归类于 MLOps )是至关重要的。
最初发表于T5【https://valohai.com】。
阻碍你投资组合的三个因素
意见
#3—你没有真正理解数据科学的立场。

这个领域的求职非常残酷。虽然拥有正确的关系会容易得多,但我们也必须真实地面对自己,我们很可能没有这样的关系。如果我们做到了,那就像和你的关系人谈一谈,投简历,然后得到这份工作一样简单。是的,如果你有关系,事实上很容易。
对于那些处于更常见情况的人来说,众所周知,脱颖而出的最佳方式是拥有数据科学产品组合。这可以包括一个 GitHub 账户,里面有你的项目的各种存储库,一个个人网站,甚至是 TDS 上的一个博客!你的简历的核心信息应该是为什么你比数百名申请同样职位的人更值得被录用。
在这篇文章中,我想分解为什么/如何你的投资组合可能缺乏的关键点,以及你可以做些什么来改善它。
https://learningfrommachines.substack.com/welcome
#1 —您没有领域专长。
我将永远不会停止写这个。成为多面手对你的职业没有帮助。你永远无法说服招聘经理相信你能够处理数据科学应用的各个方面。
你不能把你的技能从金融建模转移到计算机视觉。事实上,人们花了年来学习其中任何一门课程。当你说你是个多面手的时候,你告诉我们你什么都能做,没人相信。
你不可能做所有的事情,所以专注于某件事,并且做得非常好,然后看着 5 年后的回报。
#2—你有太多的项目。
这一点主要与第一点有关。我已经见过太多次了,所以请不要犯这个错误。
想象一下,你是一名努力工作、有抱负的初级数据科学家,在你的投资组合中有许多项目。你可以用简单的术语详细阐述为什么选择的算法是最好的,你可以用生动的故事来表达你的观点。每个项目都是如此。然而,每个项目在范围、应用方面都有根本的不同,并且它们在真实世界的用例方面都有很大的不同。此外,您还必须问,这真的会成为您的应用程序的祸根吗?答案是肯定的。
如果您用于项目的每个数据集在领域或主题方面彼此没有关系,那么当您申请一个非常具体的数据科学角色时,您的申请将不会显示该工作所需的技能。简而言之,使用一堆已经针对特定算法进行了优化的大相径庭的数据集,看起来更像是简历填充,而不是投资组合策划,即使你的意图可能并非如此。
#3 —你没有真正理解数据科学的立场
作为一名数据科学家,您应该首先能够从结构化或非结构化来源中查找和检索数据。结构化源可以是 SQL 数据库,而非结构化源可以来自 web。还有很多关于这两种情况的例子,但这些通常是最常见的两种情况。之后,能够探索、清理和建模数据是手头职位的基础。你很少会生产模型,因为这通常是机器学习工程师的工作。然而,如果你正在为一个较小的创业公司工作,就要做好身兼数职的准备,并且亲自去做。
一旦你有了你的数据,你必须知道如何探索这些数据,并让别人知道你为什么要做出清理/探索的决定。这通常是讲故事成为你最好的朋友和你角色的最大资产的地方。告诉我为什么你的选择是最好的,如果你选择了不同的道路,概述一个不同的结果,并告诉我为什么那个结果不如你选择的那个好。
从那里,它是所有关于训练和测试 ML 模型。这可以通过无数种方式来实现。但是,最好的方法始终是用尽可能简单的术语提供模型功能的高级概述,然后使用您的详细信息告知您的读者为什么它可能在您的数据集上表现最佳,从而使用您的报告的探索性方面进一步支持您的主张。记住,你永远不会完全知道哪个模型会更好!
能够展示这些主要技能表明,你知道作为一名数据科学家,你在几乎每个职位上都有什么样的期望。随着时间的推移,能够处理这份工作的这些不同方面会让你成为一个更强的候选人。
最后的想法
我希望你能够利用这三个技巧来推进你的投资组合和整体申请。找工作很难,而且时常充满不确定性。然而,奉献和坚持是这个领域的关键,坚持你的目标将会获得长期回报。如果你有任何问题,随时让我知道。感谢您的阅读。
每个数据专家都应该知道的三种缺失数据
数据科学。分析。数据工程。
以及了解它们的重要性

介绍
如果你问数据科学家,他们希望避免但无法避免的一个数据问题是什么,很可能他们都会回答缺失数据。
你知道他们是怎么说的吗,生命中唯一确定的事情就是死亡和税收?对于数据科学家来说,缺失数据可能是第三大问题。
一般来说,缺失数据会限制我们的机器学习(ML)模型的有效性,尤其是在应用于现实世界的用例时。
如果我们仔细想想,让 ML 模型变得更好的最受欢迎的建议之一是获得更多的数据和更多的观察。因此,如果缺失数据起到相反的作用,也就不足为奇了:削弱模型,模糊我们试图解释或解决的现象。
在《缺失数据:一个温和的介绍》一书中,三位作者收集了数据,发现缺失数据不仅在三年出版的期刊( 没错,出版期刊 )中普遍存在,而且据估计平均缺失数据量超过 30%。
因此,是时候让我们投入一些资源来讨论缺失数据,并提出适当的应对措施了。
虽然处理缺失数据的常见方法是简单的删除或简单的插补,但这些解决方案并不总是合适的。以数据删除为例,您可能实际删除了高达 30%的数据,降低了数据集的统计能力,尤其是对于小数据。
本文是介绍,也是讨论缺失数据处理的系列文章的第一篇。
缺失数据的三种类型
模拟数据集:体重管理数据集
为了帮助我们理解缺失数据,生成一些我们可以使用的模拟数据将会很有帮助。
#PRELIMINARIES
import random
import numpy as np
import pandas as pdfrom numpy import random
假设我们的数据集将与一个体重管理程序有关,在该程序中获取初始体重(lbs 中的)。让我们不要讨论一个人实际上可以安全地失去多少,但为了说明的目的,让我们假设这些都是可能的。
在接下来的两个月里,随后测量体重。
#INITIAL WEIGHTS
random.seed(19)
initial_weights = random.normal(150,30,10)
在计划的第一个月之后,让参与者的体重为:
random.seed(20)
first_weigh_in = random.normal(145,20,10)
因此,我们现在拥有的是一个包含初始权重和第一个月权重的数据集。由于我们对数字生成进行了随机化,我们观察到第一个月的体重低于第一个月(表示体重下降),以及第一个月的体重高于第一个月(表示体重增加)。
对于第二个月——称重,让我们假设那些减肥的人决心继续减肥,因此更有可能减掉更多的体重(大约 3 到 5 公斤),或者如果他们增加了一些体重,也只是少量的(大约 1 到 2 公斤)。
然而,那些体重增加的人要么没有动力,反而增加了更多,要么受到减肥者的鼓舞,因此开始减肥。
我们可以将这种关系编码如下:
first_month_diff = first_weigh_in - initial_weightssecond_weigh_in = [None] * 10random.seed(21)
for i in range(len(first_month_diff)):
if first_month_diff[i] > 0:
second_weigh_in[i] = first_weigh_in[i] + random.randint(-3,7)
else:
second_weigh_in[i] = first_weigh_in[i] + random.randint(-5,3)
让我们来看看我们的完整数据集:
df = pd.DataFrame({"Initial":initial_weights,
"First Month": first_weigh_in,
"Second Month": second_weigh_in})
df

看看我们的数据集,试着记住哪些参与者(1-10)在几个月内体重持续下降,哪些增加了。
模拟三种缺失数据机制
为了使这个模拟有意义,我们将在“第二个月称重”观察中应用三种不同的机制。
因此,对于每个机制,可获得初始称重和第一个月称重观测值。
第一类:完全随机失踪(MCAR)
完全随机缺失是一种由于完全随机原因导致数据缺失的机制;对于数据可能丢失的原因,没有特定的结构。
例如,很有可能在第二个月的称重期间,一名参与者碰巧生病而错过了称重。也有可能是与你正在研究或测量的现象完全无关的事情,比如去健身房/测量中心的路上发生了汽车故障。其他原因包括数据管理,例如意外删除。
这是最简单的编码机制:
random.seed(25)
df["MCAR"] = random.binomial(1,0.5, size=10)*df['Second Month']
df["MCAR"] = df["MCAR"].replace(0, np.nan)
df

类型 2:随机缺失(MAR)
例如,假设体重增加的人在第一个月没有减肥,反而变得没有动力,并故意不在第二个月的称重中出现。
也就是说,这对于 MAR 来说是很重要的一点:最初和第一个月的观察结果决定了第二个月的观察结果是否会缺失。
这种系统关系可以编码如下:

请注意,数据缺失并不取决于第二个月的权重值本身。例如,如果你看一下 10 号人,他在第二次称重时体重减轻了一些,但是因为我们只看最初的和第一次称重的信息,他从来没有机会发现并选择不测量这些信息。
类型 3:非随机缺失
现在,这就变得有点棘手了。假设在第二个月有所增加的人没有参加第二个月的称重。
在这种情况下,数据丢失的概率与丢失数据本身的价值直接相关。我们称这种数据为“非随机缺失”或 MNAR 数据。
与 MAR 不同,其中丢失的概率与其他观测数据相关,MNAR 具有与丢失的观测数据本身直接相关的结构。
以下结构可以编码如下:
random.seed(34)
df["MNAR"] = [df["Second Month"][i]*random.binomial(1,(1/(df["Second Month"][i]*4/df["First Month"][i]))) if (df["Second Month"][i]- df["First Month"][i] > 0) else df["Second Month"][i]\
for i in range(10)]df["MNAR"] = df["MNAR"].replace(0, np.nan)
df

在我们考虑的三种机制中,MNAR 造成了最难克服的情况。
如果你仔细观察我们建立的关系,我们会发现在第二个月增加的体重越多,在第二个月的称重中丢失的概率就越高。
但是棘手的部分实际上是这样的:数据科学家不知道这种关系的知识,因为没有观察到这些。
因此,这是对 MAR 和 MNAR 之间的观察结果进行分类的挑战:要分类为 MNAR,必须确定丢失变量和丢失它的概率之间的关系,但是对于 MAR,可以通过单独查看观察到的可用数据来建立这种关系。
最终数据集

在我的 Github 页面上找到的增强表格可视化的代码
结束语
对于研究人员来说,缺失数据类似于税收和死亡;它们不可避免。本文向我们介绍了三种类型的缺失数据,它们主要由控制缺失的机制(或结构)来识别。
确定数据缺失的机制非常重要,因为并非所有类型都可以被忽略。例如,在 MCAR 和马尔那里,缺失可以被忽略,对我们正在研究的现象几乎没有影响。
然而,对于 MNAR,不正确地认识这些将导致有偏见的研究和在现实世界应用中不太有效的模型。
虽然没有放之四海而皆准的解决方案,但根据缺失的基本机制,可以采用一系列技术来处理缺失数据。例如,处理缺失数据最常用的方法:删除,可能仅适用于 MCAR 数据集。平均值和中间值插补可能适用于 MCAR 和马尔
在本系列的下一篇文章中,我们将讨论如何像专家一样处理丢失的数据。
像专家一样处理“缺失数据”——第 3 部分:基于模型的&多重插补方法
让我知道你们的想法!
模拟的完整代码在我的 Github 页面找到。
参考
麦克奈特,P. E. (2007)。缺失数据:温柔的介绍。吉尔福德出版社。
时间及其数字化
处理日期和时间之前你应该知道的八件事

一般来说,我从不太担心日期、时间和时间方面的事情。不仅在我的数据科学工作中,在日常生活中也是如此。我承认:我很困惑,我有一个非常混乱的想法,什么时候把我的时钟的指针向前或向后,甚至改变的方向。这种情况一直持续到我第一次需要处理时间戳的时候。这项工作改变了我对时间的看法,并让我意识到管理这些类型的数据的常见缺陷。
显然,我知道格林威治子午线,也知道这是时区的基准,但我知道的不多。时区的编码对我来说确实是一个很大的谜。
在这里,我谈谈帮助我克服困惑的八件事,不管用什么软件,它们都适用。我们开始吧!
1.如何测量流动时间
在计算机科学中,表示时间线上的一个点的一种常见方法是计算从一个固定的起点(名为 epoch)开始经过的秒数。Unix 时间,也叫 POSIX time ,是一个广泛使用的标准计数秒从 UTC 1970 年 1 月 1 日午夜开始(等一下理解什么是 UTC)。
POSIX 是 R 和 Python 等常见数据科学环境默认采用的标准。比如微软的 Excel,使用不同的标准。
计算机程序把白天渲染成从午夜开始的秒数。因此,记住:午夜是一天的开始,所以她是 0 点,而不是 24 点。
示例>编码整数:
1609455600 ',解码呈现:2020–12–31 23:00:00 GMT '。
如果您只是简单地管理日期对象,编码将是从纪元开始的天数。
2.什么是 UTC
测量时间需要一个通用参照物,这个参照物在历史上是由格林威治子午线给出的。“格林威治时间”,更正式的说法是格林威治标准时间( GMT ),是根据地球自转计算的。世界时(UT)的变体(其主要名称是 UT1 )是一个新的“天体物理学”参考来定义取代 GMT 的时间。无论如何,目前标记时间的方法是使用原子钟。TAI(国际原子时)就是这项技术提供的时间。
时区的定义既不使用 GMT/UT1 也不使用 TAI,而是使用协调世界时 UTC 。UTC 是从 TAI 降下来的,但又略有不同。由于地球自转速度的变化,UT1 逐渐偏离(通常延迟)TAI。通过调节原子时,增加一个闰秒来补偿这种偏移,以保持时间差小于 1 秒。闰秒的插入是不可预测的,按照惯例它发生在 6 月 30 日或 12 月 31 日。原子时加上闰秒的结果就是 UTC。
如果你在阅读这个错综复杂的问题时迷失了方向,我建议你参考这篇简短的笔记,它很好地总结了这个问题。
考虑到常见的数据科学问题,闰秒的问题只是文化,因为 Posix time 忽略了闰秒:你机器里的 UTC 不是真正的 UTC!你机器里的每一天包含 86,400 秒,一秒也不能多。
3.时区是如何定义的
时区是一个遵循统一标准时间的区域,其中的本地时间以 UTC 的时差来衡量。伦敦,因为她是格林威治子午线的主人,正好有 UTC(即 UTC+0)。向东移动,我们需要增加一个(UTC+1)、两个(UTC+2)或 n 小时,以便根据太阳的周期来调节我们人类的生活。同样,向西移动我们需要减去小时数(UTC-1,UTC-2,等等。).
好吧,就是这么猥琐!你是在告诉我,如果你说“伦敦时间”你指的是 UTC,如果你说“罗马时间”你指的是 UTC+1,对吗?嗯……不完全是,因为现在是太阳时,但是夏令时也存在。
4.有一种可怕的东西叫做夏令时
在春天,通常许多国家把他们的时钟拨快一小时,以利用多一个小时的光照时间。时钟往前走,回到秋天。因此,同一个国家可以根据一年的不同时期采用不同的惯例。
因此,冬季的“伦敦时间”是 GMT,夏季是 BST(英国夏令时)。同样,罗马在冬季遵循 CET(中欧时间),在夏季遵循 CEST(中欧夏令时)。正如你在下图中所看到的,在炎热的季节,伦敦采用的时间与罗马在寒冷季节采用的时间相同!

图片由作者提供—在 CC0 许可下发布
因此,时区是由 UTC 的偏移量加上控制夏令时的信息定义的。
同一时区内 UTC 时差之间的转换有两个反常效应:
- 在三月的最后一个星期天,在凌晨 2:00 时,时钟指针向前移动,因此 2:00 和 3:00 之间的时间不会出现;
- 在 10 月的最后一个星期天,在凌晨 3:00,时钟指针会向后移动,因此 2:00 和 3:00 之间的时间会出现两次。
下图显示了代表三个时区的三条线:参考 UTC 和意大利使用的两个标准:CET 和 CEST。CET 和 CEST 之间的过渡发生在三月的最后一个星期天,而在十月的最后一个星期天,意大利回到 CET 区。

图片由作者提供—在 CC0 许可下发布
5.有一个被祝福的东西叫时区数据库
为了管理这种复杂性,可以使用一个时区数据库。这个源,被称为 IANA 或“奥尔森”数据库,以区域/位置(如欧洲/伦敦'或欧洲/罗马`)的形式提供时区的统一命名约定,并包括夏令时的转换。
多亏了时区数据库,使用时间戳对象,您不必太担心夏令时。时间戳编码源自该数据库,因此当您声明一个时区为“欧洲/罗马”时,您的软件会自动管理转换。
6.POSIX 编码不关心
因为时间是以纪元后的秒数存储的,所以它是不受时区限制的。时区只是一个属性。您可以将时间戳从一个时区转换到另一个时区,但其值不会改变。时区影响解码,而不是编码。
7.问题“今天是星期几?”是相对的
由于时区的原因,当前日期和时间都是相对的。这是显而易见的,但我们经常忘记它。
示例>如果您在英国,时间戳“1609455600”显示为“2020–12–31 23:00:00 GMT ”,但如果您在意大利,则显示为“2021–01–01 00:00:00 cet”。两个不同的日子,甚至更多:两个不同的年份!
您必须密切关注这个问题,尤其是当您想要从时间戳中提取日期时,因为根据时区的不同,您可能会从同一对象获得不同的结果。
在 R 软件中,基础环境的函数‘as . date’与流行软件包 lubridate 的函数‘as _ date’相比具有不同的行为。这两个函数都从时间戳中提取日期,并提供指定输出时区来呈现日期的选项。但是,默认情况下,第一个使用当前的地区,而第二个使用时间戳对象的原始时区。
8.有许多方法可以呈现日期和时间
时间表示有许多不同的标准。常见的有 ISO 8601 ,其中 Unix 纪元是:
1970–01–01T00:00:00+00:00
根据这一规范,日期(格式为“yyyy-mm-dd”)与时间(格式为“hh:mm:ss”)由字符“T”(时间的缩写)分开。结尾字符串“+00:00”代表相对于 UTC 的偏移量(“hh:mm”)。
示例>罗马的 2020 年圣诞节在“2020–12–31t 00:00:00+01:00”到来。
对于特殊情况 UTC+0,字符“Z”(零子午线的缩写)可用于以简洁的形式指定时区:
1970–01–01T00:00:00Z
表达相同值的等效方式是:
1970–01–01T00:00:00.000Z
其中“Z”前的最后一位数字“. 000”表示从记录的第二秒开始经过的毫秒数。
马库斯·库恩的指南是一份关于时间标准和一般时间规则的简单而明确的文件。我推荐你看一看。
将人工智能从人脑中分离出来的时候到了
我们可能需要摆脱人类思维的局限

人工智能和人类大脑可能需要分道扬镳。作者图片
在1956 年的夏天,10 位科学家在达特茅斯学院会面发明了人工智能。来自数学、工程、心理学、经济学和政治学等领域的研究人员聚在一起,想知道他们是否能够如此精确地描述学习和人类思维,以至于可以用机器来复制。不到十年后,这些科学家在机器人技术、自然语言处理和计算机视觉领域取得了重大突破。
尽管从那时起已经过去了很长时间,机器人技术、自然语言处理和计算机视觉仍然是当今最热门的研究领域。可以说,我们专注于教人工智能像人一样移动,像人一样说话,像人一样看东西。
这样做的理由很清楚:通过人工智能,我们希望机器能够自动完成驾驶、阅读法律合同或购买食品杂货等任务。我们希望这些任务能够比人类更快、更安全、更彻底地完成。这样,人类将有更多的时间进行有趣的活动,而机器则承担我们生活中无聊的任务。
然而,研究人员越来越认识到,人工智能在模仿人类思维时,可能会继承人类的偏见。这个问题在亚马逊的招聘算法和美国政府的 COMPAS 算法中显而易见,前者歧视女性,后者过度惩罚黑人。无数其他例子进一步说明了人工智能中的偏见问题。
在这两种情况下,问题都始于有缺陷的数据集。亚马逊的大多数员工是男性,许多被监禁的人是黑人。虽然这些统计数据是普遍的文化偏见的结果,但算法无法知道这一点。相反,它得出的结论是,它应该复制它得到的数据,这加剧了数据中的偏见。
手动修复可以消除这些偏见,但它们也伴随着风险。如果执行不当,善意的修正会使一些偏见变得更糟,甚至引入新的偏见。然而,人工智能算法的最新发展使得这些偏见越来越不重要。工程师们应该接受这些新发现。新方法限制了偏差污染结果的风险,无论是来自数据集还是工程师本身。此外,新兴技术意味着工程师自己需要更少地干预人工智能,消除更多无聊和重复的任务。
当人类知识为王的时候
想象以下场景:你有一个来自各行各业的人的大数据集,跟踪他们是否有过 COVID。标签 COVID / no-COVID 已经由人输入,无论是医生、护士还是药剂师。医疗保健提供者可能对预测新条目是否可能已经具有 COVID 感兴趣。
有监督的机器学习对于解决这类问题来说很方便。一种算法可以接受所有数据,并开始理解不同的变量,如一个人的职业、总收入、家庭状况、种族或邮政编码,如何影响他们是否感染了疾病。例如,该算法可以估计一名来自纽约、有三个孩子的拉丁裔护士患 COVID 的可能性。因此,她接种疫苗的日期或她的保险费可能会得到调整,以便通过有效分配有限的资源来挽救更多的生命。
这个过程乍看起来非常有用,但也有陷阱。例如,过度工作的医疗保健提供者可能会错误标记数据点,从而导致数据集中的错误,并最终导致不可靠的结论。这种错误在上述就业市场和监禁系统中尤其具有破坏性。
有监督的机器学习似乎是许多问题的理想解决方案。但是人类过多地参与了制作数据的过程,因此这不是万灵药。在一个仍然遭受种族和性别不平等的世界里,人类偏见无处不在,具有破坏性。依赖于如此多人类参与的人工智能总是有包含这些偏见的风险。

将人类的偏见融入有监督的人工智能不是前进的方向。作者图片
当数据为王
幸运的是,有另一种解决方案可以抛开人为的标签,只处理至少在某种程度上客观的数据。在 COVID-predictor 示例中,消除人为的 COVID /无 COVID 标签可能是有意义的。首先,数据可能由于人为错误而出错。另一个主要问题是数据可能不完整。社会经济地位较低的人往往较少获得诊断资源,这意味着他们可能已经患有 COVID,但从未检测为阳性。这种缺失可能会扭曲数据集。
因此,为了让结果对保险公司或疫苗供应商更可靠,去掉标签可能是有用的。一个无人监管的机器学习模型现在将继续进行数据聚类,例如通过邮政编码或一个人的职业。通过这种方式,可以获得几个不同的组。然后,模型可以很容易地将新条目分配给这些组之一。
之后,人们可以将这些分组数据与其他更可靠的数据进行匹配,如某个地理区域或某个行业的超额死亡率。通过这种方式,可以获得某人是否患有 COVID 的概率,而不考虑一些人可能比其他人更容易获得测试的事实。
当然,这仍然需要一些手工工作,因为数据科学家需要将分组数据与关于超额死亡率的数据进行匹配。然而,对于保险公司或疫苗供应商来说,结果可能要可靠得多。
派遣机器去寻找赏金
同样,这一切都很好,但是您仍然将修改疫苗数据或保险单的工作留给了流程另一端的人。在疫苗的情况下,负责人可能会决定以后给有色人种接种疫苗,因为他们往往较少使用医疗系统,因此如果他们生病,医院不太可能人满为患。不用说,这将是一项基于种族主义假设的不公平政策。
让机器来做决定有助于规避决策者根深蒂固的偏见。这就是强化学习背后的概念。您提供与以前相同的数据集,没有人为的标签,因为它们可能会扭曲结果。你也给它一些关于保险政策或疫苗如何工作的信息。最后,你选择几个关键目标,比如不过度使用医院资源、社会公平等等。
在强化学习中,如果机器找到满足关键目标的保险单或疫苗日期,就会得到奖励。通过对数据集的训练,它找到优化这些目标的政策或疫苗日期。
这一过程进一步消除了人工数据输入或决策的需要。虽然它还远非完美,但这种模式不仅可以更快更容易地做出重要决定,而且更加公平,不受人类偏见的影响。

还有很多要修正。作者图片
进一步减少人为偏见
任何数据科学家都会告诉你,并不是每个机器学习模型——无论是有监督的、无监督的还是强化学习——都非常适合每个问题。例如,保险提供商可能希望获得一个人是否有 COVID 的概率,但希望自己找出保单。这就改变了问题,使得强化学习不适合。
幸运的是,即使在模型的选择有限的情况下,也有一些常见的实践对无偏见的结果大有帮助。其中大多数都源于数据集。
首先,当你有理由怀疑一个特定的数据点可能受到现有不平等的不当影响时,隐藏不可靠的数据是明智的。例如,因为我们知道 COVID / no-COVID 标签可能由于各种原因而不准确,所以省略它可能会导致更准确的结果。
然而,这种策略不应该与蒙蔽敏感数据相混淆。例如,可以选择隐藏种族数据以避免歧视。然而,这可能弊大于利,因为机器可能会学习一些关于邮政编码和保险单的信息。在许多情况下,邮政编码与种族密切相关。结果是,一名来自纽约的拉丁裔护士和一名来自俄亥俄州的白人护士,如果数据完全相同,最终可能会得到不同的保险政策,这可能是不公平的。
为了确保这种情况不会发生,可以在比赛数据中增加权重。一个机器学习模型可能会很快得出结论,拉丁美洲人更容易获得 COVID。因此,它可能会要求这部分人缴纳更高的保险费来弥补这一风险。通过给予拉丁裔人比白人稍微有利的权重,人们可以进行补偿,这样拉丁裔人和白人护士最终确实得到相同的保险政策。
不过,应该小心使用加权的方法,因为它很容易使小组的结果产生偏差。例如,想象一下,在我们的 COVID 数据集中,只有少数美洲土著人。碰巧的是,这些美国土著都是出租车司机。该模型可能已经在数据集中的其他地方得出了一些关于出租车司机及其最佳医疗保险的结论。如果土著美国人的权重被夸大了,那么一个新的土著美国人可能最终会得到出租车司机的政策,尽管他们可能有不同的职业。
从一个不完美的模型中手动消除偏见是非常棘手的,需要大量的测试、常识和人类礼仪。还有,这只是权宜之计。从长远来看,我们应该放弃人类的干预以及随之而来的偏见。相反,我们应该接受这样一个事实:如果让机器独自为正确的目标而努力,它们就不会像人类那样可怕和不公平。
以人为中心的人工智能很棒,但我们不应该忘记人类是有缺陷的
让人工智能像人类一样移动、说话和思考是一个光荣的目标。但是人类也说和想可怕的事情,特别是对弱势群体。让一个人类数据科学家团队过滤掉人类偏见和无知的所有来源是一项太大的任务,特别是如果团队本身不够多样化的话。
另一方面,机器还没有在种族和经济差异的社会中成长起来。他们只是获取任何可用的数据,并做任何他们应该做的事情。当然,如果数据集不好或者有缺陷的人干预太多,它们会产生不好的输出。但是数据集的许多缺陷可以通过更好的模型来弥补。
在这个时候,人工智能是强大的,但仍然经常带有人类的偏见。以人为中心的人工智能不会消失,因为有太多平凡的任务,人工智能可以取代人类的手。但是我们不应该忘记,如果我们让机器去做它们的事情,我们通常可以取得更好的结果。
本文原载于 建于 。
那次我编写了一个有偏见的算法
数据科学伦理问题在晚上困扰着我,并让我在实践中负责任

玛利亚·克拉夫特在 Unsplash 上的照片
我经常看到有人从客观的角度谈论 AI 和数据科学的偏见和解决方案,而偏见是高度主观的。每当模型实现者决定包含或排除某些东西时,潜在的偏差就可能出现。所以,我希望从一个数据科学从业者的角度讲一个故事。
我最近证实,我可以自由地分享一个来自我过去实习的个人故事。很遗憾地承认,我不小心设计并编写了一个计算机视觉算法,后来证明是有偏见的。
背景
我在一家中国 IT 公司做人工智能实习生,其中一个客户是一家国际婚纱摄影工作室。我对这对不寻常的组合感到非常惊讶,因为我没想到摄影师会需要人工智能。但是你看,一场婚礼拍上千张照片,不费吹灰之力。你可以一直按下相机的快门,这样就能保证在某个地方拍出完美的照片,捕捉到完美的瞬间。
但这就是棘手的地方。一本婚礼相册装不下这么多照片。手动检查这么多婚礼的这么多照片非常费时费力,所以我的工作是尽可能自动化照片选择过程。
根据客户的说法,婚礼相册通常包含 3 种类型的照片:
- 只有新娘或新郎(一个人)的,
- 有新娘和新郎(两个人)的,和
- 2 人以上的集体照。
不幸的是,算法无法为每个类别选择一张完美的照片,因为计算机没有美感,但它们可以删除绝对无用的照片。例如,我们不需要相框中没有人的照片。所以,电脑可以帮助我们缩小到几百张照片,而不是几千张,以减轻工作量。
那么我们如何做到这一点呢?
履行
数据
我需要从大量的图像数据开始。结婚照的分辨率很高,所以我在电脑上获得了大约 20 对夫妇的几千张照片,这些照片占据了我所有的存储空间。
算法设计
要处理图像数据,计算机视觉算法和深度学习是必由之路。更具体地说,因为我是根据图像中的人数对图像进行分类,所以我需要一个对象检测算法来计算出现的次数。我试着数人的躯干和脸。当人们不面对摄像机时,人脸检测效果不太好。
如果我数 3 个人,图像肯定是一张集体照。如果我数 2 的话,这张照片极有可能是情侣照。两人不是情侣的场合相当少见。当我数到 1 的时候,我还实现了性别分类,这样我就可以把新娘和新郎的照片分开。原型在我的测试集上运行良好,我们已经准备好为我们的客户进行更大规模的测试。
现在,你感觉到什么不对吗?因为如果你这样做了,你会成为比我更好的数据科学家。正如我所说,我们的客户是一家国际婚纱摄影工作室,但我们没有考虑同性伴侣的情况。
当遇到任何一对同性伴侣时,该算法都会出现小故障。由于它运行性别分类来区分新娘和新郎,当遇到两个新娘或两个新郎时,它就失灵了。
算法重新设计
为了解决这个问题,我改用了面部识别。通过面部识别,我可以命令模特检查谁是这对新婚夫妇,并将准确度提高到一个全新的水平。由于面部识别不涉及性别,这不是一个简单的二元概念,我认为它对同性伴侣以外的更多情况也是有效的。
但面部识别的不便之处在于,需要有人手动识别这对夫妇的身份,并将他们的脸输入数据库。如果数据库里没有他们的信息,面部识别就会失败。在某种程度上,面部识别将人类元素重新引入了本应自动化的领域。我们的客户认为这不足以大幅削减成本,因此没有跟进。
反射
那次实习已经过去一年半了,但我还是经常想起这个项目。我想知道为什么我没有考虑我的测试数据之外的更多情况,为什么我的团队也没有意识到我的设计中的潜在偏差,以及我可以做些什么来避免一开始就出现的偏差。
“为了训练 AI 造福人类,AI 的创造者需要代表人文。”———费·
我很害怕这么说,但我想如果我再做一次,我可能会在那种情况下犯完全相同的错误,重新编写有偏见的算法。
有时,偏见和错误是由于人类无意识的选择而产生的。我在一个同质团队中,每个人的大脑都和我的一样。尽管我在最初设计我的模型时确实短暂地考虑过面部识别而不是性别分类,但由于人力成本的原因,我放弃了更复杂的面部识别的想法。但最终,事实证明人类的参与是必不可少的。在我试图纠正这个问题后,实际上很难实现自动化。人类总是与算法实现紧密交织在一起。有时候,自动化的衍生物根本不值得。
此外,我相信数据科学和人工智能将从多元化的从业者团队中受益匪浅。任何一个数据科学家都不可能像他/她的用户那样思考问题,感受他/她的用户的感受,但是在一起,来自不同想法的不同观点有更好的机会。
这一经历让我对未来数据科学实施中的每一个决定都格外谨慎。我真心希望你也能从中吸取一些东西。
感谢您的阅读!希望这对你有帮助。
PS:考虑到这个博客的背景,我会为这个博客使用一个更好的图片,但是我不能过早地泄露这个大转折。
时间序列转换器
所有你需要知道的最先进的变压器神经网络架构,适应时间序列任务。包括 Keras 代码。

目录
- 介绍
- 预处理
- 可学习的时间表示(时间 2 向量)
- 体系结构
- 锦囊妙计(训练变形金刚时要考虑的事情)
介绍
他们说,你需要的只是关注。是不是更稳健的卷积?用更少的参数挤出更多的学习能力仅仅是一种黑客手段吗?应该是稀疏的吧?原作者是如何想出这个架构的?

变压器架构
- 它比 RNNs 更好,因为它不是递归的,并且可以使用以前的时间步长特征而不会丢失细节
- 它是众多任务中表现最好的架构,包括但不限于:NLP、Vision、回归(It 扩展)
从现有的 RNN 模型转换到注意力结构是相当容易的。输入具有相同的形状!
预处理
将转换器用于时序任务不同于将其用于 NLP 或计算机视觉。我们既不标记数据,也不将它们切割成 16x16 的图像块。相反,我们遵循一种更经典/古老的方式来准备数据进行训练。
有一点是绝对正确的,那就是我们必须在与输入相同的值范围内输入数据,以消除偏差。这通常在[0,1]或[-1,1]范围内。通常,建议对所有输入要素应用相同类型的预处理管道来消除这种偏差。个别用例可能会免除这一点,不同的模型和数据是独一无二的!想一想你的数据的来源。
流行的时间序列预处理技术包括:
- 只是缩放到[0,1]或[-1,1]
- 标准缩放(去除平均值,除以标准偏差)
- 幂变换(使用幂函数将数据推向更正态的分布,通常用于有偏差的数据/存在异常值的情况)
- 离群点去除
- 成对差异或计算百分比差异
- 季节性分解(试图使时间序列平稳)
- 设计更多的特性(自动化的特性提取器,分桶到百分位数,等等)
- 时间维度中的重采样
- 在要素维度中进行重采样(不使用时间间隔,而是使用要素上的谓词来重新安排时间步长-例如,当记录的数量超过 N 个单位时)
- 滚动值
- 聚集
- 这些技术的组合
同样,预处理决策与问题和手头的数据紧密相关,但是这是一个很好的开始列表。
如果你的时间序列可以通过季节性分解等预处理变得平稳,那么你可以通过使用更小的模型(训练速度也更快,需要的代码和工作量更少)获得高质量的预测,例如 NeuralProphet 或 Tensorflow Probability 。
深度神经网络可以在训练期间(我们将在后面使用 Time 2 Vec)自行学习线性和周期分量。也就是说,我建议不要将季节性分解作为预处理步骤。
其他决策(如计算聚合和成对差异)取决于数据的性质以及您想要预测的内容。
将序列长度视为一个超参数,这导致我们得到一个类似于 RNNs: (batch size, sequence length, features)的输入张量形状。
这是一张所有尺寸都设置为 3 的图。

输入形状
可学习的时间表征
对于工作注意力,您需要将时间的含义附加到输入要素中。在原始的 NLP 模型中,叠加的正弦函数的集合被添加到每个输入嵌入中。现在我们需要一个不同的表示,因为我们的输入是标量值,而不是不同的单词/标记。

kazemnejad 博客中的位置编码可视化。
时间 2 Vec 纸派上用场。这是一种可学习的、互补的、模型不可知的时间表示。如果你过去学过傅立叶变换,这应该很容易理解。
只需将每个输入要素分解为一个线性分量(一条线)和尽可能多的周期(正弦)分量。通过将分解定义为函数,我们可以通过反向传播来学习权重。

时间 2 Vec 分解方程
对于每个输入要素,我们以与时间无关(时间分布图层)的方式应用相同的图层。这种可学习的嵌入不依赖于时间!最后,连接原始输入。
这是学习时间嵌入的图示,对于每个输入特征类别(每个特征 1 个学习线性分量和 1 个学习周期分量),学习时间嵌入不同。
这并不意味着每个 time-step 将携带相同的嵌入值,因为 time2vec 嵌入的计算取决于输入值!

最后,我们将这些连接在一起,形成注意力模块的输入。
体系结构
我们将使用多头自我关注(通过不同的密集层/矩阵设置 Q、K 和 V 以依赖于输入)。下一部分是可选的,取决于你的模型和数据的规模,但我们也将完全抛弃解码器部分。这意味着,我们将只使用一个或多个注意力阻断层。
在最后一部分,我们将使用几个(一个或多个)密集层来预测我们想要预测的任何东西。

我们的建筑
每个注意块由自我注意、层标准化和一个前馈块组成。每个模块的输入尺寸等于其输出尺寸。
可选地,在头部分之前,你可以应用某种池(例如全球平均 1D)。
诡计多端
使用变形金刚时需要考虑的事项和注意事项,以充分利用您的模型。
- 起步小
不要为超参数而疯狂。从一个单一的、不起眼的注意力层、几个头部和一个低维度开始。观察结果并相应调整超参数——不要过度拟合!根据数据缩放模型。然而,没有什么能阻止你安排一个巨大的超参数搜索任务:)。
- 学习率热身
导致更大稳定性的注意力机制的一个关键部分是学习率热身。以一个小的学习速率开始,逐渐增加直到你达到基本速率,然后再降低。你可能会对指数衰减的时间表和复杂的公式感到疯狂,但我只会给你一个简单的例子,你只要大声朗读下面的代码就应该能够理解:
- 使用 Adam(或变体)
非加速梯度下降优化方法不适用于变压器。Adam 是一个很好的初始优化器选择。留意更新的(可能更好的)优化技术,如 AdamW 或 NovoGrad!
感谢一路看完!
参考
[1]关注是你所需要的,Ashish Vaswani 和 Noam Shazeer 和 Niki Parmar 和 Jakob Uszkoreit 和 Llion Jones 和 Aidan N. Gomez 和 Lukasz Kaiser 和 Illia Polosukhin,2017 年
[2] Time2Vec:学习时间的向量表示,赛义德·迈赫兰·卡泽米和里沙布·戈埃尔和塞佩赫尔·埃格巴利和贾纳汉·拉马南和贾斯普里特·萨霍塔和桑杰·塔库尔和斯特拉·吴和卡塔尔·史密斯和帕斯卡尔·普帕特和马库斯·布鲁贝克,2019 年
开始使用数据操作管道的三大方法
DataOps 方法提供了一种新的方式来提高数据分析的质量和速度。

DataOps 图形,经 Ascend 的 dataops.dev 许可
数据和数据系统的激增——受高级数据分析用例数量不断增加的推动——使数据操作成为现代组织的主流。DataOps 方法在数据团队中越来越受欢迎,提供了一种提高数据分析质量和速度的新方法。
传统上,数据管道很少依赖自动化,需要密集编码。随着组织现代化并开始关注自助服务分析和机器学习,公司开始采用 DataOps,这带来了软件工程视角和管理数据管道的方法,类似于 DevOps 趋势。
DataOps 方法符合敏捷软件开发的口头禅:变化是不可避免的。人们必须设计流程和技术来拥抱变化。变化也不仅限于模式变化,它还包括转变业务需求、向新的利益相关者交付数据和报告、集成新的数据源等等。通过专注于支持快速变更管理和迭代流程的自动化工具,DataOps 实现了组织目标,如增加数据团队对业务的产出,同时降低开销。
数据运营战略的优势
DataOps 从业者专注于“降低变革成本”,将数据转化为商业价值。这种价值可能表现为分析师和数据科学家更易于使用的数据集、更快的变更请求周转时间,以及更少的数据集中的错误。如果他们还没有这样做,拥有数据和分析目标的公司(无论规模大小)都需要利用 DataOps。事实上, Gartner 最近将 DataOps 列为其 2021 年十大数据和分析趋势之一,作为更大的“XOps”运动的一部分。数据和分析团队应考虑将 DataOps 整合到他们的程序中,以利用其灵活的设计、自动化、敏捷的编排和可扩展性。
对数据操作和自动化工具的投资能够实现以下改进:自动化测试确保数据质量,即使代码逻辑发生变化;版本控制提供了更改和回滚的快速可审计性;CI/CD 将开发和试运行环境与生产环境分开。一般来说,DataOps 使数据团队能够跟上不断加速的数据开发生命周期。
需要克服的潜在挑战
数据运营和数据管道影响着“金三角”的所有三个部分——人员、流程和技术。当涉及到实施任何新的方法和随之而来的技术时,其部署和管理方式以及实施的流程可能会有不一致之处。
使用 DataOps 的公司需要确保所有三个方面的增长和发展,以保持数据管道的健康。例如,如果相关人员喜欢更“瀑布”的方法,而不是更敏捷、迭代的方法,那么一个在技术上大量投资以支持变更管理的公司将不会释放价值。人们对更好的变更管理(即版本控制、数据质量测试和 CI/CD 管道部署)和更频繁的部署的前景感到兴奋,但由于缺乏测试覆盖面,在频繁破坏生产分析后,他们可能会受到影响。为了应对这些挑战,金三角的三个方面需要协同工作,并进行整体管理和开发,以实现成功的数据运营战略。
开始使用 DataOps 管道的三大方法
与任何新兴实践和新技术一样,开始可能是一项艰巨的任务。对于 DataOps,管道是一个很大的组成部分。为了有所帮助,以下是在您的组织内实现数据操作管道的几种战术方法。
- 优先考虑自助服务以提高速度:添加自助服务,以便组织内的所有利益相关者,无论其角色和职责如何,都有能力推动他们的目标。随着需求的快速变化,依赖于某些团队的过程将不可避免地成为瓶颈,并迫使优先级折衷。相反,如果项目的驱动团队被授权自我创建必要的工件,他们将能够在不需要跨团队沟通及其内在复杂性的情况下实现他们的目标。例如,数据工程团队可以创建更灵活的数据集,并引入允许数据分析师团队在不添加新功能请求的情况下进行更深入挖掘的工具。创建更多自助服务将允许积压的团队赶上进度,并使用额外的带宽投资于其他数据运营流程和技术。
- 通过自动化测试&部署降低变更流程的风险:投资自动化测试和部署(例如 CI/CD)以建立对数据质量的信心并加速变更管理。光是这一点对于数据运营来说还不够,但这是一个可以迅速开始获得回报的关键部分,例如,让团队有更多时间专注于新的开发,而不是处理无意的中断或脆弱的部署流程。更频繁地交付具有所需变更的可信数据,会导致以业务为中心的团队更加依赖这些数据。
- 从小处着手,逐步扩展:识别棘手问题,一次解决几个。如果一个报告经常不准确,添加几个测试来提供覆盖面。随着时间的推移扩展测试套件。如果部署过程很繁琐,并且延迟了部署和更新,请确定适当的位置来创建一点自动化。换句话说,与其在数据运营所需的所有移动部分投入大量资金(这需要很长的准备时间和利益相关方的支持),不如从小处着手。
确定哪种方法对特定组织最有意义,以及以何种顺序,取决于 DataOps 社区中的广泛讨论。这类似于软件社区在开始敏捷开发时所经历的细微差别。测试驱动的开发是一个需求吗,或者即使是事后开发,测试也是重要的一部分吗?重要的是不要迷失在方法的细微差别中,而是要坚持 DataOps 实践的核心原则。只有这样,您的团队才能释放 DataOps 的真正潜力,并为企业创造有意义的价值。
五大数据科学面试问题
意见
下一次面试要准备什么

在Unsplash【1】上由 Tim Gouw 拍摄的照片。
目录
- 介绍
- 你为什么对数据科学感兴趣?
- 你遇到过哪些问题?
- 你和利益相关者合作过吗?
- 什么是常见的项目陷阱和注意事项?
- 执行一个带回家的项目
- 摘要
- 参考
介绍
我不想列出难以置信的具体问题来快速记忆,而是想强调一些更概念性的问题,这些问题可能看起来微不足道,但最终会成为数据科学应用中的一个关键因素。您会注意到,这些问题不完全是技术性的,而是展示了您作为一名数据科学家是如何工作的。大家可以学习 SQL,Python,R 等。,但让你与众不同的是你如何处理数据科学项目、问题以及围绕这些项目和问题的人。话虽如此,我将讨论更多的'行为'数据科学面试问题,也许你将来会遇到其中的一些问题/任务(或作为面试官自己问这些问题)。
你为什么对数据科学感兴趣?

再一次,这个问题看起来你在准备面试的时候可能会忽略掉。然而,事实并非如此。面试官会想知道你为什么对数据科学感兴趣,因为这将向他们展示你有激情和动力取得成功,即使工作变得困难或难以承受。
棘手的部分是——你如何回答这个问题,当展示时,不说是最好的方法。虽然他们可能不会直接问这个问题,但你的行动会为你说话。例如,你在面试开始之前和之后的交流方式可以显示出你对数据科学的兴趣。为了更好地说明这个问题,我将介绍哪些事情不应该做(一般是),以及哪些事情应该做。
不要做什么:
- 立即询问薪酬(谁知道呢,在他们看到你对实际工作的兴趣后,你可能会获得更高的薪酬,因为这将表明你热爱数据科学以及这家公司,坦率地说,这从长远来看对他们有利
- 谈论数据科学这个新的、时髦的工作
你应该做什么:
- 展示你在努力学习数据科学,例如,证书、写作、视频和任何课外活动,向他们展示你对数据科学感兴趣(你对他们来说是完全陌生的,所以他们不会知道你做的每件事,在面试前、面试期间和面试后谨慎使用这些信息,这将有助于你获得工作
- 根据你个人的想法,提及一些关于数据科学对你自己、公司和其他相关人员的积极影响
总的来说,尽管听起来很简单也很老套,但做好你自己,合适的工作就会来找你——比如,不要假装自己不适合某家公司,而是专注于你真正喜欢的数据科学。
你遇到过哪些问题?

这个问题是测试你对一个项目的认知。虽然只讨论一个完美的工作环境和项目看起来不错,但最有可能的是,你会在未来的工作中遇到一些问题。也就是说,面试官会想知道你是如何处理这些问题的,因为这可以作为你将来会怎么做的一个指标。
不要做什么:
- 责怪他人或公司
你应该做什么:
- 对你的错误保持透明,因为这没什么,尽早认识到这一点总是更好
- 讨论常见的问题,并提出各自的解决方案
- 讨论你从这个问题中学到了什么
你和利益相关者合作过吗?

当然,作为一名数据科学家,与利益相关者合作是有益的。然而,你可能并没有和被贴上利益相关者标签的人一起工作过。因此,重要的是要知道,从本质上讲,与任何有共同兴趣的人一起工作都可以被视为利益相关者。传统上,我会说利益相关者是产品经理。然而,另一个数据科学家、经理、业务分析师、软件工程、UI/UX 研究员,以及您公司或您实际客户中的几乎任何人都可以被视为利益相关者。
公司之所以会问这个问题,是因为他们希望你能够向没有学习过数据科学的人或者不在产品或工程团队的人(比如销售团队)解释数据科学,并且你需要在没有任何数据科学知识的情况下向他们解释模型如何工作或其好处。例如,您可能甚至不想将数据科学作为一个模型,而是作为一个自动完成人类通常会做的事情的工具。根据具体情况,您可以添加更多的技术术语,但重要的是要意识到其他人可能不知道的东西——尤其是如果这是一次性的解释。但是,如果您不止一次地与某人合作,那么创建一些文档来总结您正在进行的数据科学项目可能会有所帮助,以便可以参考。
什么是常见的项目陷阱和注意事项?

克里斯多夫·高尔在Unsplash【5】上的照片。
这个问题比刚才的“问题”更具体一点。在这个上下文中,陷阱意味着这个项目可能会出什么问题。作为数据科学家,您需要知道模型实现后会发生什么。期望包括但不限于资源、相关人员、客户影响和金钱方面的考虑。
以下是数据科学项目中的一些常见陷阱,在数据科学面试中提出来可能会有所帮助:
- 你需要多少数据?
- 你的模型多久需要训练一次?
- 你的模特训练可能会失败,你应该准备一些东西作为后备
- 你的型号有多贵?
- 您的模型是否占用了其他当前流程的其他资源?
- 你预计你的模式会对企业和客户产生什么影响?
- 您的模型在某些数据上可能表现不佳
- 如果您有一个预测不正确的分类模型,会发生什么?
如您所见,数据科学项目有许多问题、考虑事项和陷阱。重要的是要意识到这些陷阱,以及现在就开发的解决方案,而不是事后才开发。要记住的一个关键短语是积极主动,而不是被动反应。
执行一个带回家的项目

在Unsplash【6】上由 Myriam Jessier 拍摄的照片。
这一点不是一个问题,而是一些数据科学面试中可以期待的东西。数据科学的独特之处在于它涉及许多跨职能学科。测试这种技能的一个方法是指定一个带回家的评估,这通常是故意模糊的。关键是看你在没有太多信息的情况下会怎么做,一个可以被数据科学解决的问题。
做什么:
- 问问题,就像你在真实工作中一样
- 可能会故意遗漏一些信息,他们可能想知道你是如何提问或提出问题的
- 通常,数据科学家遵循类似的流程,即:
问题陈述、数据收集、探索性数据分析、算法类型、算法比较、最终模型(s ) ,以及结果和讨论。
摘要
如您所见,这些问题或任务都不是特别技术性,但这并不意味着它们不重要。这些问题以及你如何回答这些问题对你的面试以及你的实际工作都至关重要。成为一名全能的数据科学家并不止步于编码和统计,还包括解决问题、业务能力、产品能力、利益相关者或客户沟通以及热情。
总而言之,以下是您在下一次数据科学面试中可能遇到的问题和任务:
* Why are you interested in Data Science?* What problems have you encountered?* Have you worked with stakeholders?* What are common project pitfalls and considerations?* Perform a take-home project
我希望你觉得我的文章既有趣又有用。如果您同意或不同意这些数据科学面试问题,请随时在下面发表评论。为什么或为什么不?你认为还有哪些问题很重要?这些当然可以进一步澄清,但我希望我能够对一些不太技术性,但仍然重要的数据科学面试问题有所启发。感谢您的阅读!
请随时查看我的个人资料、Matt Przybyla等文章,也可以在 LinkedIn 上联系我。
参考
[1]照片由 Tim Gouw 在Unsplash(2016)上拍摄
[2]照片由卡肖恩·埃尔南德斯在Unsplash(2021)拍摄
[3]照片由 Tim Gouw 在Unsplash(2016)上拍摄
[5]Christopher Gower在 Unsplash 上拍摄的照片,(2017)
[6]米利安·耶希尔在 Unsplash 上拍摄的照片,(2020)
五大数据科学实践
意见
深入了解数据科学家和机器学习工程师的最佳实践。

目录
- 介绍
- 业务问题陈述
- 隔离业务指标
- 算法比较
- 代码审查
- MLOps 和 DevOps
- 摘要
- 参考
介绍
在数据科学领域工作了几年后,我从各种不同的经历中发现了一些最佳实践。我将重点介绍我的五大数据科学实践,希望对您未来的努力有所帮助。虽然有无数种方法可以改善您的数据科学流程,但这些方法不仅可以改善您作为数据科学家的日常工作,还可以改善您作为员工的日常工作。也就是说,其中一些实践不仅可以应用于数据科学,还包括但不限于数据分析、机器学习、软件工程、数据工程和 DevOps。如果您想了解关于五大最佳数据科学实践的更多信息,请继续阅读。
业务问题陈述

由 Daria Nepriakhina 在Unsplash【2】上拍摄。
我喜欢在我的许多文章中提到这个最佳实践,因为它非常重要。作为数据科学家,我们可能会如此沉迷于机器学习算法的技术方面,如调整超参数和降低我们的错误率。然而,我们必须记住,数据科学项目的目标不应该是以最高的准确性获得最复杂的答案。事实上恰恰相反——我们希望找到业务问题的最简单的解决方案。数据科学可能已经相当复杂,我们使用它的原因也是如此。这让我想到了业务问题陈述。这就是你首先利用机器学习算法的全部原因。没有人会在意你对一个不能回答或解决当前具体问题的模型有 98%的准确率。这就是为什么隔离问题的真正含义并与您的利益相关者(管理并经常分配数据科学项目的同事,或提出业务问题)进行核对是极其重要的。
下面,我将给出一个关于业务问题陈述和数据科学解决方案的很好的例子:
差:
“用一些数据科学的魔法来解决我们的检测问题,看看我们可以达到多高的准确性来节省资金。”
伟大:
“从图像中检测物体既耗时又不准确,如果由人来完成的话。”
分析 :
糟糕的——虽然糟糕的例子可能会引导你找到看待问题的正确方式,但它实在是太混乱了,没有必要。很多时候,利益相关者或公司中的其他人认为数据科学可以解决一切问题,所以由你来告诉他们他们的问题是否可以通过机器学习算法来解决。当然,魔法这个词的使用是模糊的,过分的;然而,知道有些人在现实世界的商业案例问题中这样说是很令人惊讶的。接下来,有人提出了一个解决方案,声称数据科学将解决这个问题,但这实际上可能并不必要。然后,他们假定数据科学的魔力无论如何都是准确的,并且会省钱。虽然这很有可能是真的,但这不能在问题陈述中断言。问题陈述的主要目标是简单地隔离一个问题。然后,下一步将是开发一个解决方案以及预期结果和/或投资回报( ROI )。
棒极了 —这个问题陈述要好得多,因为它首先展示了当前流程以及它的问题所在。它实际上并没有暗示数据科学或承诺一些可能不会发生的事情。即使你不是数据科学家,你也可以清楚地看到所阐述的内容,这一点很重要,因为跨职能部门工作是公司的首选工作方法。由于该语句定义明确,数据科学家现在可以分离出以下内容:
**current process:** detecting objects from images by a person**problem one:** time-consuming**problem two:** innaccuate
现在,根据已经分析的内容,您可以研究当前的流程,以评估数据科学是否可以应用。然后,你会有两个问题,你会找到解决方案。这个粒度允许每个人都在同一个页面上。如果选择了数据科学模型作为解决方案,那么算法的目标是使当前流程更加高效和准确。现在,有了模型可以改进的基本指标。
示例:
比方说,以前,从一个人那里以 80%的准确率对 500 幅图像进行分类需要 2 个小时。现在,一个数据科学模型可以用来在 10 分钟内以 98%的准确率对同样的 500 张图像进行分类。数据科学家现在知道要做什么,要争取什么。
这个例子让我想到了下一个最佳实践。
隔离业务指标

在 Unsplash 上由 Austin Distel 拍摄的照片。
一旦我们有信心选择数据科学模型作为上述问题的解决方案,我们将需要专门隔离需要改进的业务指标。在这种情况下,度量的例子包括每个员工花费的时间和任务的准确性。这些指标可以与手动流程和自动化数据科学流程相比较。此外,这些指标可以通过仪表板进行监控和可视化,以获得易于理解的结果。
隔离业务指标的示例如下:
当前流程:
- 每个员工每天花费的时间
- 每个员工每周花费的时间
- 员工每天的准确性
- 每周员工的准确性
数据科学解决方案:
- 每个模型每天花费的时间
- 每个模型每周花费的时间
- 模型每天的精确度
- 每周模型的精确度
这些指标不仅会突出模型(希望是)带来的改进,还会突出您的特定数据科学解决方案对公司的重要性和益处。这一点伴随着证明你的价值,一个数据科学家可以节省时间和金钱,同时也使公司的过程更加准确吗?
我提到了一些简单而具体的指标;然而,任何公司都可以监控和分析更多的信息,最终取决于具体情况、流程和产品。要查看的一些常规指标包括:
—每个用户的点击次数
—特定年龄组的每个用户的点击数
—特定位置组的每个用户的点击次数
—每日流失
—每周变动
—指标的每周改进
—等等。
算法比较

照片由 engin akyurt 在Unsplash【4】上拍摄。
我们刚刚讨论了数据科学对业务的重要性,现在让我们讨论一下算法比较的重要性。比较几种不同的机器学习算法是最佳实践,因为它可以让您大致了解哪种算法最适合您的数据和解决方案。例如,您可能想看看决策树、随机森林或 XGBoost 等算法,并比较它们如何在相同的训练和测试数据上相互叠加。虽然这种做法稍微明显一些,但提出来仍然很重要。我花了一段时间才意识到,我应该总是至少测试几个不同的算法,以找到最好的一个。这是因为有时你可以陷入一个特定的算法,并将其用于每一个解决方案。然而,在有些情况下,一种通常更好的算法有时可能会更差,反之亦然。
算法比较的一个例子如下:
用例 1:对图像进行分类
决策树准确率— 94%
随机森林准确率— 96%
XGBoost 精度— 98%
用例 2:给动物园动物分类
决策树准确率— 95%
随机森林准确率— 98%
XGBoost 精度— 97%
在这个例子中,您可以看到 XGBoost 在过去是如何做得更好的( aka,用例 1 ),但不一定对未来的每一种情况都是最好的。请确保查看数据的大小、数值特征与分类特征的数量,等等。有一个非常强大和有用的库,它比较了几乎所有你听说过的机器学习算法。
这个库叫做py caret【5】我强烈推荐使用它:
下面是一个关于如何实现 PyCaret 的 Python 代码片段的小例子。在一行代码中,你可以看到几种机器学习算法是如何相互叠加的。如果您知道要查看哪些算法或者想要节省更多时间,也可以在比较时隔离某些算法:
# import the library
from pycaret.classification import *
model = setup(data = your_data, target = image_name)# compare models
compare_models()# best models based on AUC, Accuracy is default
compare_models(sort = 'AUC')# compare exact models
compare_models(include = ['rf','xgboost'])
代码审查

这个下一个最佳实践可能看起来更明显或者更普遍,但是我相信数据科学家经常忽略这一点。虽然软件工程师在大多数时候肯定会遵守代码审查,但数据科学家并不总是按照他们应该做的那样审查代码。通常情况下,数据科学家独自工作,即使他们的团队中有其他数据科学家(每个数据科学家负责一个特定的项目)。
不仅让另一位数据科学家检查您的代码,而且让一位机器学习操作工程师或软件工程师检查您的代码,这是非常有益的。一般来说,在将你的最终代码库推送到一个主分支之前,最好是引入别人而不是你自己(例如 GitHub 上的)。将这一最佳实践作为提醒,让您的代码接受审查。它可以像修改一行代码一样简单,最终为你和你的公司节省时间——一个熟练的软件工程师可能会更快地理解这一点。特别是有一些熊猫和 NumPy 操作可以增强,节省了大量的时间和金钱。一般来说,连续几天甚至几周看着相同的代码可能会导致你对它过于熟悉,从而让你意识不到容易犯的错误。尝试进入代码审查的常规程序,以确保您的代码、项目和业务处于最佳状态。
MLOps 和 DevOps

最后一个实践与代码审查有些关系,但重点是熟悉在您的数据科学模型部署到生产中之后会发生什么。通常,在一个更大的公司,你可以把你的模型交给另一个人,他可以正确地部署它,但是可能会犯错误,例如,培训时间。如果您不知道您的模型在从本地测试转移到生产时正在做什么,那么还会发生其他的后果。
有时候,数据科学家负责整个过程,所以这种做法可能不适合你,但是如果你幸运地与机器学习操作工程师( MLOps )或 DevOps 工程师这样的人一起工作,你可以习惯于在没有实际看到之后过程中发生的事情的情况下交付模型。结果可能与您预期的不同,特别是测试的结果,因此您会想要回顾自您移交以来发生的整个过程(如果您的公司有,当然是)。
由于未执行此最佳实践而导致错误的一个示例可能是:
- 训练和测试模型导致 94%准确性
- 移交给 MLOps 或 DevOps 工程师(或软件工程师等)。)
- 在投入生产后进行检查,结果是 88%
- 您会发现,训练数据不是 100,000 行数据,而是 20,000 行数据
- 也许另一个工程师对训练时间设置了时间限制,限制了先前已经设置的训练行数
这个例子可能不会发生在您身上,但就像在模型测试中验证您的数据一样,您会想要验证整个数据科学过程,尤其是当您的模型投入生产时,因为即使是最小的变化也可能导致最显著的差异。
摘要
有无数种方法可以改进您的数据科学流程。我已经讨论了将最终改进您的数据科学过程的五个最佳实践。当然还有几个,但这些是我发现特别突出的主要问题。我还提供了问题的解决方案,作为最佳实践。
以下是数据科学家的最佳实践总结:
Developing a Concise Business Problem StatementIsolating Key Business MetricsAlgorithm ComparisonCode ReviewMLOps and DevOps Incorporation and Validation
我希望你喜欢我的文章,并觉得它很有趣。请在下面随意评论您作为数据科学专家或其他类似角色所遵循的最佳实践。你同意我所讨论的,还是不同意——为什么?谢谢你的阅读,我很感激!
参考
[2]照片由 Daria Nepriakhina 在Unsplash(2017)上拍摄
[3]照片由奥斯汀·迪斯蒂尔在Unsplash(2019)上拍摄
[4]照片由 engin akyurt 在Unsplash(2020)上拍摄
[5] Moez Ali, PyCaret 主页,(2021)
[6]照片由heylogostechie在Unsplash(2018)上拍摄
[7]Peter gom Bos 在 Unsplash 上拍摄的照片,(2019)
前 5 名数据科学资格
意见
数据科学家职位最需要的资格是什么?

LinkedIn 销售导航员在Unsplash【1】上的照片。
目录
- 介绍
- 编程;编排
- 商业头脑和智慧
- 统计和数学
- 机器学习
- 形象化
- 摘要
- 参考
介绍
作为一个面试过几家公司的数据科学家职位的人,以及一个搜索和探索过无数面试所需资格的人,我整理了我的五大数据科学资格。这些资格不仅是面试时必须具备的,也是你在当前工作中需要牢记的重要资格,即使你不是在面试。数据科学总是在不断发展,因此了解该领域的新技术至关重要。这些要求可能与您的个人经历不同,所以请记住,这篇文章来自我作为专业数据科学家的观点。这些资格将被描述为在进入新角色或当前角色之前期望拥有的关键技能、概念和各种经验。如果您想了解更多关于面试和/或您当前的数据科学家工作的五大数据科学资格的信息,请继续阅读。
编程;编排

作为一名数据科学家,当你第一次学习时,你可能会惊讶地发现,编程和编程在课程中经常被跳过(有时是),因为你可能参加的项目已经期望你知道如何编码。然而,精通一门编程语言是非常重要的。在学习如何编码之前,您可能会先学习高等数学、统计学、机器学习算法、一般理论和数据科学流程。如果这种情况是你的情况,不要不知所措,因为没有比现在更好的学习时间了。
在我的编程经验中,我实际上是先学习 SAS,然后学习 R,最后学习 Python。我认为这种进展是慢慢进入编程的好方法。然而,如果你急于学习一切数据科学,有时最好是立即投入更多的面向对象编程。但是,就我而言,我主要专注于统计学,SAS 是一个从一开始就将理论转化为实践的伟大平台。
斯堪的纳维亚航空公司
SAS [3]代表统计分析系统。在这种编程语言中,您可以以某种方式执行数据科学的大多数统计方法。主要功能是执行数据操作、描述性统计和报告。以下是他们强调的 SAS 产品的主要方面:
- 直观灵活的编程
- 具有通用过程的库
- 自动化管理和监控
- 数据分析工具
- 跨平台和多平台支持
我在 SAS 上体验到的好处是大量的统计能力和实用程序,它们不一定像 R 或 Python 等其他语言那样常见和健壮。导入语句包括但不限于 PROC GLM,其中包括回归、多元回归、ANOVA ( 方差分析)、偏相关和 MONOVA ( 多变量方差分析)。除了这些不同的分析之外,您还可以用图来可视化和描述您的数据。我用得最多的一些是:
**Fit Diagnostics:**RStudentQuantileCook’s D
总的来说,作为数据科学家,这是一门很好的第一编程语言,因为它是从理论到实际应用的适当过渡,特别是具有统计重要性。
稀有
下一种语言是R【4】,它比 SAS 更上一层楼,因为你也可以使用以机器学习为中心的编程。有了这种编程语言,再加上r studio【5】,你还可以创建有价值的统计解决方案和描述图。在数据科学应用程序中使用 R 代码的过程通常从导入数据集、导入库、检查数据(有无绘图)开始,最后是构建模型。我在 R 编程中使用过的一些机器学习算法包括 LDA、KNN 和随机森林。还有很多,不过和 Python,sklearn 差不多,我下面会讨论。我总是喜欢把 R 看作是 SAS 和 Python 的平衡。最终,要不要有这个资格,还是要看你自己和你应聘的公司。有些公司用,有些不用。如果你喜欢它,那么你应该找一家需要 R 的公司,特别是因为从 R 转换到 Python 有时会引起混乱,从而降低生产率。
下面是我喜欢 R 的一些原因:
—统计能力
—可视化
—文件
计算机编程语言
与 R 相比,我更喜欢使用 Python,主要是因为它更容易与公司当前的基础设施和代码库集成。我没有经历过太多用 R 胜过 Python 的公司。除了这个好处,我还感觉 Python 里的机器学习库比较多。我最喜欢的 Python 库包括 sklearn、TensorFlow 和 seaborn。当我与软件工程师和数据工程师一起工作时,使用 Python 也很有用。我发现也有更多关于使用 Python 进行数据科学应用的产品的文档。
下面是我使用 Python 的一些原因:
- 能够使用强大的机器学习库
- 部署和生产的多功能性
- 比起 RStudio 中的 R,我更喜欢在 Jupyter 笔记本中使用 Python
接下来,我将从更多的技术资格中抽出时间,讨论数据科学的业务方面。
商业头脑和智慧

由 Austin Distel 在Unsplash【6】上拍摄的照片。
这下一个资格往往是跳过认证和一般教育经验。成为商业头脑和商业智能意味着很好地理解业务,并且知道为什么首先需要数据科学。立即开始将高级机器学习算法应用于公司数据可能很容易,但需要建立业务用例并进行彻底审查,以便提供最大的投资回报。例如,如果你能够用某种计算机视觉算法对鸟类进行分类,你必须理解为什么对它们进行分类是有用的。是因为这样会更有效率吗?是因为人工,人类的分类不准确吗?除了了解业务问题,您通常还需要与产品经理合作,确定您的数据科学项目将为您的公司节省多少资金和时间。
一旦您了解了业务需求,并习惯于更快地发现业务需求,您将在数据科学的业务方面变得非常合格。您可能需要提供证据,证明为什么您选择的算法在解决这个问题时是有用的。一旦你得到买入,你就可以工作并改进当前流程,并开始展示你的算法结果。
这里有一些方法可以确保你拥有商业头脑和智慧:
- 了解产品、常见陷阱和流行的产品解决方案
- 实践或学习产品管理
- 有很强的数据分析知识
- 了解任何业务的关键指标(,例如,每用户点击数等。)
总的来说,使用和学习与数据科学相关的业务分析,是你的简历和当前工作中非常关键的资格。
统计和数学

虽然这个限制看起来很明显,但有时您可以更多地关注为您执行大量统计和数学工作的库。假设你已经精通使用机器学习库或软件包,并且如果你至少对统计计算有一个大致的了解,那么你将非常合格。当你进行处理显著性的实验时,知道某些数学和统计学会特别有用。
一些重要的数据科学统计数据可以帮助您获得资格,包括以下内容:
- 假设检验
- 概率分布
- 贝叶斯思维
- 过采样(和以下)
我建议使用你的 GitHub 帐户,通过编写你自己的函数和讨论测试的重要性,向一家公司展示你在统计和数学方面的才能。
机器学习

在Unsplash【8】上由 Arseny Togulev 拍照。
这个资格更多的是提醒你,几乎每年都有一个新的、最好的机器学习算法,你应该学习和实践。例如,许多数据科学家正在使用随机森林机器学习算法,然后后来意识到所有的数据科学竞赛都在使用 XGBoost。因此,在数据科学社区中保持最新是有益的。你不能保证这些知识会传给你,所以自己去寻找是很重要的。
一个特别突出的网站是Kaggle【9】。该网站是一个数据科学社区,您可以在这里进行协作、共享代码、学习和提出关于数据科学的问题。
他们的主要产品包括:
- 竞争
- 数据集
- 笔记本电脑
- 学习
当然,总的来说,练习主要的机器学习算法,特别是每个算法都有一个示例用例,并探索可能比以前更强大的新算法。用你的代码、笔记本和例子建立一个 GitHub 账户是实现机器学习资格的一个很好的方法。
形象化

照片由 William Iven 在Unsplash【10】上拍摄。
最后,是可视化资格。作为一名数据科学家,知道如何编码、使用机器学习算法以及拥有良好的商业意识非常重要,因此,将所有这些方面联系在一起的方法之一是通过可视化。
以下是一些流行且有用的可视化工具:
- (舞台上由人扮的)静态画面
- 谷歌数据工作室
- 检查员
- MatPlotLib
- 海生的
- 熊猫简介
- 包含存储可视化的新 Python 库
您可以通过探索性数据分析、业务问题及其各自的数据、错误指标或准确性,以及数据科学模型的结果如何改善业务来可视化数据科学流程。
摘要
数据科学要求很高,面试可能会让人望而生畏;做一个合格的人是让自己平静下来并给自己带来更多自信的一种方式。我所支持的顶级数据科学资格包括以下内容:
1\. Programming2\. Business Savvy and Intelligence3\. Statistics and Mathematics4\. Machine Learning5\. Visualization
如果你已经实践了上述资格,那么你将是一名合格的数据科学家。拥有编程示例、业务用例、对统计学和数学的理解、几个机器学习算法的示例,以及对可视化过程和结果的总体感觉,将使你要么获得这份工作,要么成为一名更好的数据科学家。
我希望你觉得我的文章既有趣又有用。如果您同意或不同意我讨论的数据科学资格,请随时在下面发表评论。你满足这些条件了吗?
以上是我的观点,我与这些公司没有任何关系。感谢您的阅读!
请随时查看我的个人资料和其他文章,也可以在 LinkedIn 上联系我。
参考
[1]照片由 LinkedIn 销售导航员在Unsplash(2017)上拍摄
[2]詹姆斯·哈里森在 Unsplash 上拍摄的照片,(2020)
[3] 2021 SAS Institute Inc ., SAS ,(2021)
[4]居基金会,居,(2021)
[5] 2021 年 PBC 广播电台
[6]照片由 Austin Distel 在Unsplash(2019)拍摄
[7]照片由杰斯温·托马斯在 Unsplash 上拍摄,(2020)
[8]2019 年阿瑟尼·托古列夫在 Unsplash 拍摄的照片
[9]卡格尔公司(2021 年)
[10]照片由 William Iven 在 Unsplash 上拍摄,(2015)
2021 年 CDO 需要关注的五大数据趋势
现代元数据解决方案、数据质量框架、基础设施、工作角色和其他重大变革正在进行中。

克里斯·利维拉尼在 Unsplash 上的照片
就像所有其他领域一样,2020 年颠覆了数据世界。当 COVID 关闭业务并让员工在家工作时,公司必须快速适应“新常态”。
随着组织转向远程工作,云成为了绝对的必需品。随着每个人都从不同的位置和系统访问数据,数据治理和安全性成为重中之重。更聪明的人工智能变得有吸引力,因为历史模型已经没有意义了。简而言之,组织意识到他们需要快速做出改变。数据投资增加,组织寻求升级其系统并创建完美的数据堆栈。
随着 2020 年成为过去,我们现在展望新的一年,希望会更好。2021 年将给数据世界带来什么?数据基础设施将如何发展以跟上所有最新的创新和变化?
今年,我们将看到几个新的数据趋势:新的数据角色和数据质量框架的出现,现代数据栈和现代元数据解决方案的兴起,以及数据湖和数据仓库的融合。
1.数据湖和数据仓库正在融合
在过去的十年中,数据架构师围绕两个关键单元设计数据操作:
- 数据湖:存储大量原始甚至非结构化数据的廉价存储。数据湖架构通常非常适合临时探索和数据科学用例。
- 数据仓库:传统上,数据仓库优化了计算和处理速度。这有助于报告和商业智能,使仓库成为分析团队的首选系统。
今天,许多公司仍然使用这两个系统——一个用于所有数据的数据湖,以及用于分析和报告用例的专用数据仓库。
虽然我们还没有达到这一步,但随着数据湖和数据仓库都增加了更多的功能,我们已经开始看到这两个生态系统的融合。
像雪花这样的数据仓库已经将存储和计算成本分开,大大降低了将所有数据存储在数据仓库中的相关成本。更进一步,一些数据仓库玩家已经开始增加对半结构化数据的支持。
另一方面,像 Databricks 这样的数据湖玩家已经开始转向“数据湖库”的概念,他们最近宣布支持 SQL 分析和 ACID 事务。
了解更多:
2.“现代数据堆栈”成为主流
从 2020 年开始,术语“现代数据堆栈”在数据世界中随处可见。它指的是用于处理海量数据的最新、同类最佳的现代数据架构。
现代数据堆栈的关键支柱之一是强大的云平台。最初以云数据仓库为中心,现在也开始包括云数据湖和相关的数据湖引擎。
如今,现代数据堆栈是指用于数据工作流每个部分的一套工具:
- 数据摄取:例如 Fivetran , Stitch , Hevodata
- 数据入库:如雪花、 BigQuery
- 数据湖:例如亚马逊 S3
- 数据湖处理:例如 Presto , Dremio , Databricks , Starburst
- 数据转换:如 dbt 、 Matillion
- 元数据管理:例如地图集
- BI 工具:例如 Looker
了解更多:
- 现代数据基础设施的新兴架构 :基于对 20 多名从业者的采访,这是一篇关于现代数据堆栈中哪些技术正在胜出的精彩、深入的阅读。
- 现代数据堆栈大会 2020 :来自 Fivetran 首届现代数据堆栈大会的关于最新创新、工具和最佳实践的资源。
- 现代数据栈时事通讯 :关于现代数据栈的博客、指南和播客的双周时事通讯。
3.元数据 3.0:元数据管理重生
随着现代数据堆栈的成熟,公司已经开始实施雄心勃勃的项目来升级其数据基础架构并整理基本的数据需求(例如,接收数据、完成云迁移项目以及设置新的 BI 工具)。虽然这些释放了很多潜力,但也制造了混乱。
上下文问题,如“这个列名实际上是什么意思?”以及“为什么仪表盘上的销售数字又错了?”扼杀团队的灵活性,否则会以极快的速度前进。
虽然这些不是新问题,但我们正处于新的颠覆性解决方案的风口浪尖。随着现代数据平台围绕五个主要参与者(AWS、Azure、Google Cloud Platform、Snowflake 和 Databricks)聚合,元数据本身正在成为大数据,为元数据空间带来智能和自动化有着巨大的潜力。
在接下来的 24 到 36 个月中,我们将看到一个或多个为现代数据堆栈构建的现代元数据管理平台的兴起,这些平台解决了数据发现、数据编目、数据沿袭和可观察性。
了解更多:
- 【数据目录 3.0 :我的文章讲述了元数据解决方案的过去和未来,以及为什么我们要在为现代数据堆栈创建现代元数据方面实现巨大的飞跃。
4.新角色出现:分析工程师和数据平台领导者
2020 年见证了两个角色的崛起,它们比以往任何时候都更加主流。
1.数据平台领导者
组织越来越意识到需要一个中心团队来负责开发数据平台,以帮助组织的其他部门更好地完成工作。当然,这个团队需要一个领导者。
在过去,这是由数据仓库专家或数据架构师等更传统的角色来处理的。现在,拥有一名数据领导者来领导整个组织的数据计划已经变得很普遍。这些人有一系列头衔,比如“数据平台主管”或“数据平台总监”。
数据平台领导者通常会监督公司数据堆栈的现代化(对于初创公司,则是从零开始)。这包括建立云数据湖和数据仓库、实施数据治理框架、选择 BI 工具等等。
这个新角色带来了一个重要的新 KPI : 最终用户采用。这是指领导者让组织内的人员和团队在日常工作流程中采用数据(和数据平台)的能力。这是一个受欢迎的变化,因为它将决定投资哪些数据产品的人的动机与最终使用这些产品的人的动机结合起来。
2.分析工程师
在过去十年里,我接触过的每一位分析师都有一个主要的挫败感:依赖数据工程师来实现生产化和建立数据管道。
像 dbt 和 Dataform 这样的强大的基于 SQL 的管道构建工具的出现已经让这种情况变得更好。通过赋予分析师超能力,他们将整个数据转换过程交给了数据分析师。
其结果是“分析工程师”一词的出现,该词描述了现在拥有整个数据堆栈(从接收和转换到最终向业务的其余部分交付可用数据集)的前分析师。
了解更多:
- 什么是分析工程师?dbtClaire Carroll的一篇文章,讲述了新的分析工程角色背后的原因和方式。
5.数据质量框架正在兴起
数据质量是一个在过去二十年里没有太多创新的领域。然而,它最近取得了重大进展,数据质量的不同方面正在融入整个数据堆栈。
数据质量分析
数据分析是审查数据以了解其内容和结构、检查其质量并确定其未来用途的过程。
在数据资产的整个生命周期中,可以进行多次分析,范围从浅到深。包括计算缺失值、最小值和最大值、中值和众数、频率分布,以及其他帮助用户了解底层数据质量的关键统计指标。
虽然数据质量分析通常是数据堆栈中的一个独立产品,但公司越来越多地将其作为一项功能纳入现代数据目录,使最终用户能够理解和信任他们的数据。
业务驱动的数据质量规则
数据质量不仅仅是对数据的统计理解。这也是基于业务环境的数据是否可信的问题。
例如,你的销售数字通常每周增长不应该超过 10%。销售额 100%的飙升应该提醒正确的团队成员并停止数据管道运行,而不是走向首席执行官使用的仪表板!
这种对智能警报的需求使得组织将业务团队引入到编写数据质量检查的过程中。
对于数据团队来说,仍然没有一个很好的方法来与业务同行在数据质量检查方面进行合作,但我希望这个领域在未来几年将会有很多创新。未来,我们将会看到更智能的解决方案,能够根据数据趋势自动生成业务驱动的数据质量规则。
数据管道中的数据质量测试
数据质量变得普遍的第三种方式是将其写入数据管道本身。这借用了软件工程世界中“单元测试”的原则。
多年来,软件工程一直包含单元测试框架。这些自动测试每一个单独的代码单元,以确保它可以使用。管道模拟单元测试框架内的数据质量测试为数据工程带来同样的信心和速度。
这有助于团队在上游数据变更影响组织的工作流和报告之前,发现由上游数据变更引起的数据质量问题。
了解更多信息:
- Amazon Deequ:Deequ 由 Amazon 内部构建,是一个很有前途的用于数据质量分析的开源框架。
- 远大前程 :这是一个流行的开源社区,用于数据管道中的数据质量测试。
- 网飞关于提升数据质量的演讲 :对于任何开始数据质量之旅的数据领导者来说,这都是一本有趣的读物。
你同意还是不同意这些趋势?发现了我们漏掉的东西?用你的见解发表评论吧!
觉得这个内容有帮助?在我的时事通讯《元数据周刊》上,我每周都写关于活动元数据、数据操作、数据文化和我们的学习建设的文章。 在此订阅。
成为数据科学家的五大途径
意见
成为一名成功的数据科学家的最佳方式是什么?如何做到?

由 Bostan Florin Catalin 在Unsplash【1】上拍摄的照片。
目录
- 介绍
- 传统研究生硕士学位
- 证书
- 训练营
- 油管(国外视频网站)
- 在线教程
- 摘要
- 参考
介绍
随着新技术、竞争和世界事件的出现,成为数据科学家的道路已经发生了很大变化。虽然有一些屡试不爽的传统方式可以成为数据科学家,但这可能不是你的首选方式。除了更短的教育经历之外,您还可以采取更多快速流程来开始并跟上您的数据科学之路。最后,许多人可以访问几乎免费的资源。我将讨论成为数据科学的五大途径,并讨论如何成为数据科学,以及为什么它对您来说可能是最好或最差的选择。也许,您可以组合几个或所有路径。最终,将由您来决定您的数据科学学习之旅如何进行。也就是说,了解你所有的选择是至关重要的——这也是我将在下面讨论的。
传统研究生硕士学位

我不是在写数据科学的本科学位,因为我实际上并没有追求一个学位,但是,我已经完成了数据科学的研究生学位。我确实认为我将要讨论的关于研究生院的一些观点也适用于本科教育。我参加了南方卫理公会大学(SMU),我很高兴我做到了。虽然很贵,但我学到的几乎所有材料都适用于真实世界的数据科学用例。然而,有时我希望我在大学时学习了软件工程或统计学,以便更好地装备自己,但是正如我们将在下面看到的,有其他方法来学习数据科学的其他特定方面。
这里有一份非常全面的顶级数据科学研究生项目列表 [3】,这份列表实际上帮助我决定申请哪些项目— 拥有数据科学硕士项目的最佳 23 所学校:
完成数据科学学位的好处:
- 专攻数据科学,不像本科生那样可能会包括无用的额外课程
- 年纪越大,越容易开始研究生的问题
- 与已经是数据科学家的学生或有志于在类似领域发展事业的学生合作
- 这有助于建立职业关系,并从中学习
- 我个人选择了我所在州的一所学校,这样公司就会熟悉那所学校
- 很多时候,GRE 是不需要的
- 因为这些是特定的项目,你可以得到经济资助
- 研究生院可以是面对面的也可以是远程的
- 研究生院通常会增加一生一次的经历,比如:
- 会议、研讨会和类似静修的体验,让您沉浸在数据科学中,向行业领导者学习
- 有些学校可以更有声望,其中 有时 可以带来更多的就业前景
- 有些项目可以在一年内完成
- 一些公司更喜欢研究生学位( 这个要求正在改变 )
- 拥有学校自豪感,建立长久的联系
总体而言,从更传统的研究生课程中学习数据科学可以确保在数据科学领域获得体面的职业生涯。当然,也有缺点,比如价格和不方便。然而,如果你的情况就是这样,那么你可能要开始考虑其他项目了。
以下是数据科学研究生学位项目中可能会遇到的一些不利因素:
- 价格,有些价格在 60,000 美元以上
- 可能需要很长时间才能完成
- 可能会不方便,例如面对面
如你所见,与缺点相比,我可以指出更多的优点。这是我的亲身经历,所以这个经历可能和你不一样。也就是说,对我的赞成和反对持保留态度,并考虑其他选择,比如下面这些。
证书

由 Lewis Keegan 在Unsplash【4】上拍摄的照片。
如果您想要一个涵盖特定课程和主题的更定制的计划,那么认证是学习和成为一名成功的数据科学家的好方法。同样,如果你不确定你想成为哪种类型的数据科学家,那么这条道路也是一个更好的选择。例如,你可能想成为计算机视觉工程师、自然语言处理工程师( NLP )、机器学习工程师、数据工程师或研究科学家。当你参加一个较长的项目时,比如硕士学位,你可能很难知道你想成为什么类型的数据科学家,在这个项目中,你只有一门特定主题的课程,比如 NLP。想象一下,支付数千美元获得一个学位,而你只学习了大约 6 个小时的数据科学特定主题——这种情况是认证的亮点;你可以在同一个主题下参加无数的认证,但是在这个主题下涵盖不同的材料或者有不同的例子可以学习。
完成数据科学认证的好处:
- 方便的
- 更便宜的选择
- 许多可以在你自己的时间内完成
- 有些证书来自更大的财富 500 强公司,如果你完成了,当然会对你申请那家公司有所帮助
- 你可以用你目前的工作来补充认证
- 所以你不必牺牲你的正常工资
- 有时你工作的公司会支付这些证书的费用,因为它们不像研究生学位那样昂贵,而且可以根据你工作的具体项目进行定制
- 按照这种思路,证书可以帮助你从事目前的工作
- 你可以在网上展示你的证书,并在简历中突出显示
- 算作几乎真实世界的经验,因为这些认证高度关注具体的问题和用例(通常是)
- 认证通常会进行排名和审查,比大学更是如此,尤其是因为可能只有 100 人注册学位课程,而可能有成千上万的学生参加数据科学证书课程,这有助于帮助您做出最佳决策
完成认证有几个好处,无论是方便,更便宜的价格,还是能够在自己的时间内完成它们。几乎可以说,一般来说,证书并不那么有名,但是,我相信教育正在发生转变——人们不想要大笔学生贷款,他们不想在一个没有定制的项目上花费数年时间,他们想要一个灵活的项目。因此,越来越多的人报名参加认证并炫耀这些证书,这为那些只申请没有传统正规教育的职位的人创造了一个更好的观点和视角。
完成数据科学认证的缺点:
- 有时候 不会被雇主视为经验不足
- 可能是由不可靠的来源造成的
上面,你可以看到我努力列出了一些认证的缺点,作为数据科学的学习途径。同样需要注意的是,认证质量存在较大差异,通常情况下, 多数 研究生学位 倾向于 更加稳定和卓越。
训练营

照片由heylogostechie在Unsplash【5】上拍摄。
起初,一个训练营或一组认证似乎没有什么区别;然而,仍有一些重要的问题需要注意。训练营的主要区别之一是有一个预定的或有序的学习路径。此外,你还可以在同一个训练营项目中与同学一起工作、学习和合作,有时甚至是面对面。我发现这一点是有益的,因为你们都在努力实现同一个目标,认证有时会更侧重于个人。
完成数据科学训练营的好处:
- 比较便宜的
- 更快的
- 更方便
- 往往是有序的或在特定的学习时间表
- 有些提供学费补偿,或者如果你在 6 个月内没有找到数据科学的工作,你就不必支付学费
- 面对面和远程
- 同志意识、学习和他人之间的合作
- 类似于学位课程,但是更短、更快
- 也可以在下班后完成这些训练营——你现在的工作
- 包括顶点计划
- 声誉良好的导师和未来的合作公司
特别是一个训练营,虽然我没有亲自参加,但我已经了解了他们的计划流程,并有几个朋友和一个同事与他们一起完成了训练营,他们也取得了令人难以置信的成功。这个训练营被命名为总会【6】:
完成数据科学训练营的缺点:
- 现在训练营变得越来越受欢迎,我开始看到一些也变得越来越贵
- 有些有时并不为人所知
那么,在前三条成为数据科学家的道路中,你会选择哪一条呢?到目前为止,研究生学位可以总结为更有声誉和信息量,认证最灵活,也是最便宜的,而训练营的结构与研究生学位相似,但速度更快,通常也更便宜。
油管(国外视频网站)

克里斯蒂安·威迪格在Unsplash【7】上拍摄的照片。
现在,我们进入了一个更独特、更不传统的领域。成为数据科学家的第四条道路是免费的,有很多小时的数据科学内容,可能有数百万小时。最大的问题是,由你来决定哪些视频值得信任。一个很好的方法是查看视频的点击率,以及评论中的总体情绪。有时,它可能会很乱,比上面提到和讨论的路径更不结构化,这取决于个人,可能不值得麻烦。如果你是 完全 数据科学的新手,你会完全相信自己会挑选有质量的视频——这是另一回事,有时,质量和正确性可能会有所欠缺。在这里,我们已经介绍了许多缺点,但什么是优点,我们为什么要以这种方式学习数据科学?
从 YouTube 学习数据科学的好处:
- 自由的
- 方便的
- 内容的多样性
- 许多简单明了的用例,有时当我们学习理论而没有看到例子时,会感到紧张和困惑
- 视人而定,视觉学习可能更有益
- 如果你喜欢你正在做的事情,视频会更有趣,有时会让你学到更多
- 视频可以包含数据科学的最新信息—
例如,一个研究生学位可能使用几年前的教学大纲,并且没有任何关于 XGBoost 的信息,即使你花了数千美元学习旧的算法
- 只需搜索一个非常具体的例子,就可以为您量身定制
看,有优点,随着时间的推移,像这样的在线视频变得越来越受欢迎,越来越有声誉,并且充满了更多的内容。
从 YouTube 学习数据科学的缺点:
- 你可能花了几个小时学习一些不正确的东西——如果你正在努力学习,但目前还不知道它,你怎么知道它是正确的还是错误的?
- 杂乱无章的视频
- 故意拖延时间
- 常常不知道从哪里开始
虽然在通往数据科学的道路上有更多的缺点,但它可能是未来的趋势,从这个来源开始学习是有益的,因为你可以自由选择你的数据科学主题,同时享受娱乐。
在线教程

卢克·切瑟在Unsplash【8】上拍摄的照片。
你可能会问,在线教程和 YouTube 有什么不同?嗯,当我提到在线教程时,我指的是无数的 GitHub、Python 代码和 Jupyter 笔记本的例子,以及每秒钟在网上发布的类似文章。其中许多都有端到端的代码,您只需插入数据,就能快速看到基线结果。有时,这些信息量可能会让人不知所措,而且是不正确的,所以这是一个有保留地选择最后一条路的理由。实践真实世界的用例是很重要的,许多在线网站都有教程,涵盖从数据摄取、探索性数据分析、业务指标隔离、功能工程、模型构建到机器学习算法比较、结果和讨论及其各自的可视化。
从在线教程中学习数据科学的好处:
- 自由的
- 易于使用
- 你可以用自己的时间做这件事
- 可以找到与您的数据科学问题相关的具体示例
- 从也在学习的人那里,而不是从可能忘记包括机器学习基础知识的经验丰富的老师那里
- GitHub 有无数的例子
- 有简单易懂的 Jupyter 笔记本,上面有例子和解释
- 竞争还包括常见的业务问题,这些问题可能与您的业务相关
选择在线教程有几个好处,就我个人而言,在我的日常工作中使用这种方法最多。像 Stack Overflow、GitHub 和 Kaggle 这样的地方有不同的例子和解释,有时比学位更直接,也更有益处——T4 和免费的 T5。
从在线教程学习数据科学的缺点:
- 与上面的路径类似,你可能会学到一些不正确的东西,这可能会令人沮丧
- 这么多例子可以选择,你挑哪个?
- 有时人们会混淆示例和数据科学主题
总的来说,如果你正在寻找一些帮助,无论是从头到尾学习数据科学的整个主题,还是通过快速的谷歌搜索,在线教程都可以证明是最通用的,有时也是最有益的快速学习数据科学的方法。
摘要
我们已经讨论了许多成为数据科学家的不同途径。他们中的许多人有一些相同的品质,但他们也有一些不同之处。那么,你会选择哪一条或哪几条道路来成为数据科学家呢?回答这个问题时,有一些基本因素需要考虑。
**Common factors include the following:*** age* current job * price* convenience* specialization* flexibility* reputability
你也可以选择不止一条道路,我相信很多人已经这样做了。因此,总结一下,以下是你可以成为数据科学家的所有顶级或最常见的途径:
- 传统研究生硕士
- 认证
- 训练营
- YouTube
- 在线教程
我希望你觉得我的文章既有趣又有用。如果您同意或不同意我讨论的数据科学途径,请随时在下面发表评论。你选择了哪条路?你是只拿一个,还是五个都拿,为什么?
在这里,你可以找到我之前,也是最近的一篇讨论五大数据科学资格的文章[9]:
*
以上是我的观点,我与这些公司没有任何关系。感谢您的阅读,我真的很感激!
请随时查看我的个人资料和其他文章,也可以在 LinkedIn 上联系我。
参考
[1]Bostan Florin Catalin 在 Unsplash 上拍摄的照片,(2020)
[2]2018 年 Unsplash 上瓦西里·科洛达的照片
[3]MastersInDataScience.org 由 2U,Inc.
2U,Inc .拥有并运营,是拥有数据科学硕士项目的 23 所最佳学校,(2021)
[4]Lewis Keegan 在 Unsplash 上拍摄的照片,(2020)
[6]大会,大会数据科学,(2021)
[7]照片由 Christian Wiediger 在 Unsplash 上拍摄,(2018)
[8]Luke Chesser 在 Unsplash 上拍摄的照片,(2019)
[9] M.Przybyla,五大数据科学资格,(2021)*
数据科学实习中需要考虑的 5 件事
意见
在你的实习旅程中需要询问或研究的五个要点。

JESHOOTS.COM在Unsplash【1】上的照片。
目录
- 介绍
- 期望使用的技能
- 数据科学团队的规模
- 经理的经验
- 机器学习或数据工程同事
- 最终方案
- 摘要
- 参考
介绍
申请实习的时候,公司会面试你,也就是说,展示相反的一面是很重要的——亲自面试这家公司,看看他们是否适合你。在申请数据科学实习的过程中很容易受到评估,但你要记住,这个实习将是你专业数据科学职业生涯的基础。选择实习时,有一些关键因素需要考虑。虽然工资是必不可少的,但大多数实习时间都较短,预计收入不如工资高(然而,现在实习工资开始增加,而不是无薪)。因此,我将讨论可以帮助您加快职业发展的数据科学实习的考虑因素。
期望使用的技能

Branko Stancevic 在Unsplash【2】上拍照。
职位描述通常会从其他职位描述中找到灵感,所以需要注意的是,即使有 20 项技能,也不是所有的技能都是工作所需要的,尤其是实习。重要的是联系招聘人员或招聘经理,确认一旦你被录用,哪些技能是最需要的。对于经理或招聘人员来说,将常用的数据科学技能付诸实践可能很容易,但一旦你开始工作,这些技能可能就不会全部用到了。在现实中,你可能只会略微掌握其中的一些,也许是 5 项,也许是 10 项技能,这最终取决于它们是哪些技能。如果你对你感兴趣的项目或行业有很好的感觉,那么你应该对你想要使用的技能以及你想要学习的新技能有很好的感觉。例如,如果实习更多地基于研究和统计,那么你更有可能用 R 编写代码,但是如果是一个更常见的实习,你将与其他软件工程师一起工作,那么你最有可能需要知道或者将要学习 Python。我将阐述我希望在实习中使用和学习的两项最重要的技能,这样你就可以更好地了解会发生什么——也就是说,还有很多技能,这取决于你想成为哪种类型的公司和哪种类型的数据科学家。
计算机编程语言
这种编程语言有些容易学习,对于数据科学来说是一种很好的学习语言。使用这种语言比使用其他编程语言更有利,因为有大量基于 Python 的库和包。你还可以与软件工程师合作,你会发现他们中的大多数也懂 Python——这意味着整个代码库也是用 Python 编写的。
Jupyter 笔记本
虽然 Python 的跨功能性更强,但 Jupyter Notebook 通常只用于数据科学家(数据工程师、数据分析师等)。,也可以期待使用它。它是跟踪您的研究并执行数据摄取、数据分析、功能工程、模型构建和讨论您的初始数据科学模型的好地方。
数据科学团队的规模

实习的这一特点非常重要,因为你可以从一个数据科学家那里学习,也可以从一个大约五人的团队那里学习,等等。数据科学团队的规模各不相同,因此预计每个公司都不会遵循相同的团队结构。如果你想要更多的一对一关注,那么只需要另一名数据科学家就可以了,这可能也是你的经理,但如果你想要在更短的时间内学习其他经验,那么你可以寻找一家拥有更大数据科学团队的公司。有些公司小得令人难以置信,而有些是大公司——这取决于你想要什么。
数据科学团队规模的优势和注意事项:
- 对于小团队,一对一的学习体验
- 对于更大的团队,各种其他数据科学家可以给你不同的视角,教你不同的技能
- 如果是一个较小的团队,那么你可以更多地了解一个人完成的整个数据科学过程
- 对于一个更大的团队,其中一些数据科学家可能是新来的,还没有接触过一半的代码库
- 更有经验的数据科学同事与新同事
正如您所看到的,数据科学团队的规模可能会有很大差异,还有其他需要考虑的事情,例如您希望如何构建您的学习体验,换句话说,您将向谁学习。
经理的经验

在Unsplash【4】上由 Austin Distel 拍摄的照片。
考虑数据科学团队的规模至关重要,同样重要的是考虑您的经理拥有的年数或一般经验。例如,如果他们来自更注重医疗保健的背景,或者工程,那么他们会更专业化,这样他们就可以更好地指导你,如果这是你想最终进入的同一行业。比年龄更重要的是他们拥有的经验类型。你可以在某个领域工作 10 年,但如果你一遍又一遍地做同样的事情,可以说,一个有两年工作经验的人,如果没有更丰富的经验,也可以有同样的经验。因为数据科学家可以实践许多不同的技能和经验,所以由您来确定您的经理实践了什么类型的技能,以便您可以学习您想要学习的一切,同时提高效率。
以下是在研究或询问经理的经历时需要考虑的一些事情:
- 年数
- 技能类型
- 他们工作过的行业
- 他们采用的专业
机器学习或数据工程同事

查尔斯·德鲁维奥在Unsplash【5】上拍摄的照片。
通常在教育中,你只能学习数据科学技能,更侧重于机器学习算法,因此,在生产环境中获得经验的最佳方式之一是与机器学习工程师和数据工程师一起实习。这些专业人士知道如何在生产中实施您的数据科学模型,特别是以可扩展的方式,例如,可以集成到应用程序中。你正在实习的未来数据科学团队(或工程团队)的另一个头衔是软件工程师。作为一名数据科学家,你可能会遇到一些大多数机器学习工程师和数据工程师可以快速解决的障碍,因此在职业生涯早期向他们学习将使你有足够的跨职能能力,这是非常有价值的。
与机器学习工程师和/或数据工程师一起工作的好处:
- 了解端到端数据科学流程
- 学习高级 SQL 技能
- 更好地吸收不同数据结构的数据(例如 JSON )
- 更加擅长面向对象编程
- 使用机器学习平台和代码扩展您的模型
- 让你的模型更有效率
就像你可以从你的数据科学同事和数据科学经理那里学到很多一样,你也可以从你的机器学习工程师、数据工程师和软件工程同事那里学到很多。
最终方案

数据科学实习中需要考虑的最后一件最重要的事情是期末项目。你很可能会有一个业务用例,你试图解决一个真正的问题。你将使用之前在学校和实习中学到的所有数据科学技术来展示一个可以用于简历的最终项目。这种体验也非常有价值,因为它将向您展示端到端项目在现实世界或专业数据科学世界中是如何工作的。你会喜欢解决问题、帮助他人、帮助公司,并善用你的数据科学技能。
期末项目的益处和收获:
- 端到端体验
- 可共享项目( GitHub/Jupyter 笔记本
- 解决真正的商业问题
- 从这次经历中增强了信心
- 可以在简历上分享,在面试中也能表现得很好
- 可以类似于你作为专业数据科学家在未来公司的工作,让你更精通和更有竞争力
摘要
虽然在数据科学实习中有无数事情需要考虑,但我已经讨论了我的五大特点,我相信这些特点会让你受益匪浅。这些不仅对实习很重要,而且对第一份专业数据科学工作或任何数据科学工作也很重要。一旦你开始积累经验,你就会明白你想从事哪种类型的数据科学,以及你想为哪种类型的公司结构工作。
总而言之,以下是数据科学实习中需要考虑的五大事项:
Skills Expected to UseSize of Data Science TeamManager’s ExperienceMachine Learning or Data Engineering CoworkersFinal Project
我希望你觉得我的文章既有趣又有用。如果您同意或不同意我讨论的数据科学实习功能,请随时在下面发表评论。你在数据科学实习中考虑过哪些事情?在实习经历之后,你认为对你有好处吗?作为一名数据科学家,你从目前的工作中学到了很多吗?为什么或为什么没有?
感谢您的阅读!
参考
[1]JESHOOTS.COM 在 Unsplash 上拍摄的照片,(2018)
[2]Branko stance vic 在 Unsplash 上拍摄的照片,(2017)
[3]Annie Spratt 在 Unsplash 上拍摄的照片,(2018)
[4]照片由奥斯汀·迪斯蒂尔在Unsplash(2019)上拍摄
[5]Charles Deluvio 在 Unsplash 上拍摄的照片,(2017)
预测新产品需求的五大机器学习方法
为什么 XGBoost 在最近的研究中表现如此出色

照片由普里西拉·杜·普里兹在 Unsplash 上拍摄
预测未来的时尚需求既有价值又复杂。它是有价值的,因为对于零售商来说,准备或不准备销售下一个高需求商品的机会成本。此外,如果他们错误地预测了需求,他们必须为商品付款,并可能以某种形式支付未售出的商品。
由于多维性(例如,颜色、切割、材料、图案、印花、年龄范围、尺码范围、风格以及文化、地理和社会经济差异),它很复杂(Paton,2018)。传统上,对物品的需求最常试图使用同一物品的历史销售的时间序列统计来预测;然而,这种方法未能预测需求的高阶变化,以预测未来的趋势或流行商品(Singh,2019)。
最后,能够最大限度地减少识别新产品需求(例如,时尚趋势)和将其用于销售之间的等待时间(时间延迟)具有巨大的价值。例如,2019 年年中,对印度电子商务零售商 Myntra 的 26,762 件时尚商品的数据集进行了七种流行的机器学习预测算法的比较研究,发现 XGBoost 在预测新时尚趋势的需求方面一直表现最佳或接近最佳。它比较了随机森林(RF)、梯度增强回归树(GBRT)、光梯度机(LGBM)、CatBoost (CB)、XGBoost (XGB)、属性嵌入+多层感知器
(MLP)、属性嵌入+长短期记忆(LSTM)。
下表列出了每种方法相对于功能丧失的衡量标准(Singh,2019)。

图 1:使用标准/损失函数预测需求的比较算法表(Singh,2019 年)
研究中使用的衡量销售因素有:折扣、知名度和促销。研究中使用的衍生销售因素是款式的年代、季节性和趋势以及同类产品。在这里,折扣被衡量为一个品牌的平均折扣与零售平台整体平均折扣的偏差。可见性是通过相对于品牌的平均浏览量和整个平台的浏览量来衡量的。促销是按计划促销之前或之后的天数来衡量的。由此计算衍生特征。对于一种款式的年龄,它是通过计算该款式可供销售的天数得出的。对于季节性和趋势性,它是通过开始日期和当前日期之间的周数来计算的。对于季节性,一年中一周的傅立叶变换的前三项被用作特征。对于同类产品,计算了某个品牌与其他品牌相比,在给定的一周内可获得的相似风格产品的数量,以及相同价格范围内的相似风格(Singh,2019)。
获胜者总结:极限梯度提升(XGBoost)
极端梯度提升(XGBoost)被亚马逊自己的基于云的机器学习平台 SageMaker 的开发者描述为“梯度提升树算法的一种流行而有效的开源实现……一种监督学习算法,试图通过组合一组更简单、更弱的模型的估计来准确预测目标变量”(亚马逊 SageMaker,2019)(陈,XGBoost:可扩展的树提升系统,2016)。XGBoost 是分布式机器学习社区(DMLC)工具集中的一个工具,它也传播 MXNet 深度学习库。DMLC 将 XGBoost 描述为“一个开源软件库,它为 C++、Java、Python、R、…Julia 提供了一个梯度增强框架”,而 JVM“提供了一个并行树增强”2014 年 3 月首次发布;最新版本是 2019 年 5 月的. 90(XGBoost,2019)。与任何其他机器学习算法相比,XGBoost 赢得或几乎赢得了更多专注于结构化或表格化数据集的分类和回归预测数据科学竞赛(Brownlee,2016)。
Boosting 是一种机器学习集成技术,其中新的机器学习模型被顺序地添加,以尝试并校正先前模型中的错误,直到不可能进一步改进为止(例如,通过对难以预测的数据点进行加权)。梯度推进得名于梯度下降算法,该算法用于在添加这些
替代模型时最小化损失(布朗利,2016)。
XGBoost 经常与梯度增强(GB)、随机梯度下降和梯度增强树(GBT)混淆(Tseng,2018)。此外,因为 GB 和 GBT 可以说是 XGBoost 的先决条件,而随机梯度下降可以说是一种替代方案,所以区分它们也是解释 XGBoost 应用的一种很好的方式。
批量梯度下降(BGD)
梯度下降是一种数学优化技术,可以用于许多机器学习算法。在最高层,它被用来确定一个函数的参数值或系数,该函数将最小化一个成本,通常是预测的误差。在传统数学中,这些系数的值是用线性代数解析计算的。当这些系数的值未知时,梯度下降算法最大化搜索它们的效率,以使机器学习算法最优化。或者,让它在预测事物时更准确,因为它找到了使误差最小化的系数(权重、参数)组合(Brownlee,Gradient descent for machine learning,2016)。
批量或基本梯度增强的目标是找到函数(例如,直线、曲线等。)最符合数据。例如,如果有人试图使用线性回归根据房子的平方英尺或平方米来预测房子的价格,则流程图算法将如下所示。应用于预测未来时尚,回归方法将是最合适的,因为要预测的变量是连续的(Ng,2018)。如果回归问题使用逻辑回归而不是线性回归,函数中参数的术语将变为权重。
梯度下降或批量梯度下降的一般数学程序从随机选取一个系数开始。数字与实际数字的差异称为“成本”或“误差”通过将系数插入梯度下降公式或函数来计算该系数的成本:成本=(系数),这变成:
成本=评估((系数))。
接下来计算成本的导数,这是一个微积分概念,表示一条线在任意给定点的斜率,这将表示我们需要为下一个系数猜测去优化结果的方向;成本的导数通常用希腊字母 Delta(δ)的大写表示:Delta =导数(成本)。一阶导数可以用两种方式表示:y '(牛顿符号)或(y)(莱布尼茨符号)。所以,这也可以用符号写成δ= y '(成本)。一旦斜率已知,它就指示了下一个系数估计-猜测应该进行的方向。
系数在每次迭代更新中可以改变的量被定义为 alpha (α),并与成本或误差成比例。89 因此,算法“学习”的最终计算结果是:新系数=旧系数—(δx Alpha)或(δ*α)(brown lee,Gradient descent for machine learning,2016)。这种“更新”规则也被称为最小均方(LMS)更新规则或 Widrow-Hoff 学习规则(ng,2018)。
这些迭代继续进行,直到成本或误差为零,或接近零,这意味着预测的最佳系数和实际的最佳系数之间的差异最小化,并且猜测和正确答案收敛(ng,2018)。
随机梯度下降(SGD)
进化梯度下降和发明新东西的必要性主要与速度有关。因为梯度下降需要对整个训练数据集运行和重复这一迭代过程,所以对于大数据来说,它的计算量非常大,并且计算速度很慢。因此,一种叫做随机梯度下降的进化开始被使用
(布朗利,机器学习的梯度下降,2016)。
随机梯度下降(SGD)是批量梯度下降的变体和替代方案。在随机排序之后,SGD 将这些迭代校正估计分解到每个数据点,而不是每次在采取任何调整步骤之前都必须遍历整个训练数据集。用机器学习偶像吴恩达的话来说,SGD“重复地运行训练集,每次[它]遇到训练样本时,[它]都根据仅与单个训练样本相关的误差[成本]的梯度来更新参数”(ng,2018)。结果的确定要快得多,并且很少需要超过 1-10 次通过整个数据集来优化成本函数(Brownlee,
Gradient descent for machine learning,2016)。
梯度升压(GB)
采用随机梯度下降(SGD)的一个关键假设是模型结构是固定的。因此,目标是优化系数(分类或线性或多元回归问题中的参数或逻辑回归中的权重)。那么,如果架构模型不固定呢?因此,梯度推进的发明(Tseng,2018)。
梯度引导是一种基于加法建模的集成机器学习方法。这种想法是通过将一堆模型加在一起并平均它们来形成一个更准确的模型(Mahto,2019)。梯度增强的目标是找到最佳参数和函数(函数不是像 batch 和 SGD 中那样预先确定的)。确定最佳参数和函数的目标以指数方式增加了分析和搜索可能组合的复杂性和数量,并试图了解哪些是最佳的。为了提高效率,梯度增强通过采用许多简单的试验函数并组合它们来实现这一点(Tseng,2018)。然而,与 boosting 不同的是,将被组合的简单基础模型是顺序训练的,一个接一个,而不是并行或同时训练的(Mahto,2019)。
极端梯度推进(XGBoost)
XGBoost 在机器学习领域已经有点传奇色彩了。其成就包括:(1)2015 年在机器学习竞赛网站 Kaggle 上的 29 场挑战中,有 17 场以 XGBoost 获胜,8 场专门使用 XGBoost,9 场使用 XGBoost 与神经网络进行集成;(2)在 2016 年杯,一个领先的基于会议的机器学习比赛中,所有前 10 名的位置都使用了 XGBoost(陈,XGBoost:一个可扩展的树提升系统,2016)。
简单来说,XGBoost 是一种超级优化的梯度下降和提升算法,它异常快速和准确。这种“超级优化”是通过组合批量梯度下降函数(如上所述)和模型复杂性的惩罚(也称为回归树函数)来实现的;然而,它通常只适用于一种类型的机器学习模型——
决策树(更正式的名称是分类和回归树或购物车)(亚马逊 SageMaker,2019)。
XGBoost 的竞争优势很大程度上是因为它能够快速调查许多超参数并识别最佳参数,然后可以手动设置这些参数,以便模型自动识别正确的参数。
在我的下一篇文章中,我将讨论 XGBoost 的超参数调优和优化方法。与此同时,如果你在应用机器学习方面的目标是预测新产品的需求,从 XGBoost 算法开始是一种被证明可以快速获得好结果的方法,而无需大量的算法选择试验和错误。
顶级技术趋势及其对数据科学、机器学习和人工智能的影响
你和你事业的行动计划

图片由 Gerd Altmann 从 Pixabay 拍摄
2020 年是非常独特的一年。
一方面,我们有所有的锁闭,被流放在家工作,仍然不能亲自见到我们的朋友,并接近变得孤独。另一方面,我们可以体验有史以来最显著的数字加速。
作为一个数据人,你站在这场革命影响的最前沿。虽然你必须确保你的深度技术健康和进步,但你不能失去对全局的跟踪也是至关重要的。因此,你应该了解技术趋势以及它们如何影响你的工作。你可以在未来的数据科学、机器学习和人工智能就业市场中保持相关性,你需要今天就设定课程。
这适用于入门级和有经验的从业者。
2020 年的数字革命反映在即将到来的趋势中。在我看来,这是正确的。
最可靠的技术趋势来源之一是 Gartner。
因为他们的观点与我个人的期望非常一致,所以我将Gartner 2021 年顶级战略技术趋势作为本文的基础。Gartner 在三个主题下列出了 2021 年的 9 大战略技术趋势。
在我看来,这些趋势将决定到 2030 年的未来十年。
在这篇写作中,我给你:
- 2021 年各 Gartner 顶级战略技术趋势摘要
- 我对这两者如何影响你的工作和职业生涯的看法
- 我建议你现在应该采取什么行动
重要建议: 你永远无法涵盖所有趋势所需的所有技能。所以,你必须决定一个你想追随的方向。要么你已经在那个领域工作了,想继续你的职业生涯,要么决定专注于一个趋势。
如何选择趋势?
我建议考虑四个标准:你的技术背景,你的兴趣,你喜欢的地方的工作机会,以及你可能为进入一个特定领域投入的时间。评估它们,然后选择一个或两个趋势作为你的关注点,并根据相应的趋势采取行动。
第块趋势落入 人中心 域。在过去的几个月里,尽管数字化的破坏,我们都经历了人们比以往任何时候都更重要。我们处于工作、互动、业务、数据和决策的中心。一切都变得相互关联,并将继续留在这里,以人作为连接节点。
1。 行为互联网
是什么: 根据 Gartner ,“行为互联网(IoB)从各种来源捕捉人们生活中的“数字尘埃”,这些信息可以被公共或私人实体用来影响行为。”人们在社交媒体上进行商业、公开互动的所有来源的数据,以及使复杂见解成为可能的技术。信息是影响和推动我们行为的有力工具。
我对影响的看法: 这种趋势是我们工作的主要推动力之一。对数据科学家、机器学习工程师和人工智能专家的需求是巨大的,以便将所有数据汇集在一起并提取信息。现在,找到拥有相关知识和技能的人已经不容易了。我目前正在为我的日常工作撰写一份关于该主题的广泛报告,并在全球范围内与该领域的科技公司、企业和思想领袖进行了 60 多次采访。数据和技术不规范。企业正在推出他们的第一个行为驱动产品,而能力仅限于公司内的少数人。各行各业不仅迫切需要大量的数据科学家和工程师,还需要产品设计师、行为经济学专家、战略人员、律师、消费者教练等等。该领域正处于早期成熟阶段,并将在未来十年主导新的商业模式。
我的行动建议:如果你想多年拥有一份“安全的工作”,那就搬进这个地区吧。对于有抱负的数据科学家、工程师或目前没有技术背景的人来说,这也是一个完美的入门话题。获取技能,例如将大量非标准化数据实时整合在一起、(近)实时分析、信号和图像处理以及自然语言处理。深入了解行为经济学、数据隐私和方法,并精通物联网。
2。 总经验策略
它是什么: Gartner 将总体体验描述为“传统上孤立的学科的组合,如多重体验(MX)、客户体验(CX)、员工体验(EX)和用户体验(UX),并将它们联系起来,为各方创造更好的总体体验。”它简化并优化了我们过去几个月因新冠肺炎而经历的一切。工作、家庭、购物、安全、健康和消费的传统分割消失了。在家工作将所有这些结合在一起。
我对影响的看法: 还是那句话,对我们的工作和事业有着巨大的影响。将不再有“客户分析数据科学家”、“用户体验设计师”、“商务人士”或“机器学习工程师”。领域合并,多学科团队成为新的标准。向人们交付正确的体验变得更加复杂,数据科学工作和所需的方法也是如此。一方面,你需要获得更多的技术技能。另一方面,你需要变得更通才。这是一条充满挑战的道路。
我对行动的建议: 学习新技能。从技术上讲,通过高级方法获取知识,如知识图、大数据处理、稀疏表示、推荐分析和计算机视觉。但更重要的是,提高你的业务和沟通技巧。需要数据科学家和机器学习专家,他们可以将复杂的技术方法与商业价值联系起来,以提供体验,这将加速你的职业生涯。它从 Powerpoint 技能到演讲稿写作,非技术人员的数据可视化,再到讲故事。
3。 隐私增强计算
是什么: 隐私增强计算是关于在使用和处理数据的同时保护数据。有三种类型的技术:安全可信的环境,包括可信的硬件、安全的处理以及在使用数据之前对其进行匿名化和加密。让数据持续为隐私增强计算做好准备是公司和组织日益增长的需求和要求。
它成为公司的最佳实践和竞争优势。我每周都有几次关于这背后的技术和方法的讨论。大多数部门和公司都致力于此,它将成为所有数据科学和人工智能工作以及职业的新标准。
我的行动建议: 你的职业生涯有三种选择,以及相应的行动:1)作为一名普通的数据科学家和数据专家,你至少需要法规、最佳实践以及数据保护和加密方法的一般知识。获取知识。2)随着对这种技术的需求,这种专家的需求呈指数级增长,而市场已经没有足够的这种专家。在 Indeed.com 或 LinkedIn Jobs 上,你可以找到几千份那个领域需要技术背景的工作。作为该领域的数据科学家。获取联邦机器学习、隐私感知机器学习、差分隐私、同态加密和合成数据生成方面的技能。由于对这类人的巨大需求,大量的入门级职位和实习机会可供公司满足他们的需求。3)对于所有非技术人员来说,在那个领域有多个与监管方打交道的工作,并提供了进入数据技术领域的机会。看看你最适合哪里,然后进入那个领域,在接下来的几年里发展你的职业生涯。
第二个主题是 地点独立。新冠肺炎将行动分散到客户、员工、供应商和组织生态系统物理上存在的地方,通过技术连接。这需要一种支持这种新的商业、市场和生活方式的技术。在过去的几个月里,公司和公共部门已经升级了系统,并将继续这样做。
4。 分布式云
是什么: 分布式云不仅仅意味着在不同的物理位置使用云选项,而是将执行推到需要的点。随着即将到来的 5G 和新的芯片技术,执行转移到网络的边缘,即所谓的移动边缘计算。物联网的日益普及推动了分布式服务的发展,而智慧城市需要城域社区云,即“将云服务分布到城市或城域的节点,连接到多个客户。”**
我对影响的看法: 分布式云是未来,技术已经达到高质量、安全、便捷的可行性状态。但我们在采用之初停滞不前,在接下来的 10 年里,所有行业和公共部门都将转向分布式云。其影响是,整个数据科学工作正在完全转向分布式云解决方案,但执行需要复杂的机器学习算法。因此,影响是双重的:数据科学家如何工作,以及他们对数据有效工作的贡献。
我的行动建议: 还是那句话,有两个行动的机会。1)将执行推向边缘需要新的技术技能。tiny ml——使深度学习在边缘成为可能的微型机器学习,以及有效维护系统的自动化机器学习(AutoML)是至关重要的技能。此外,至少有一个 AWS,Azure 和 Google 的云相关证书跟踪是必须的。
2)但是你也可以考虑转行。许多基于云计算的科技公司最近进行了 IPO,或将进行 IPO。在 LinkedIn 上,你会发现美国有超过 20,000 个云架构师的空缺职位,欧洲有超过 10,000 个。根据 Payscale,云架构师的平均薪资为 12.7 万英镑,而数据科学家的平均薪资为 96 万英镑(T2)。因此,进入云架构师和工程师的职业生涯是第二个选择。同样,市场上缺乏这些技能。没有技术背景的人现在可以抓住机会投资于他们的技能,并转移到这个领域。我在文章的最后给出了学习的资源。
5。 随处操作
它是什么: Gartner 将 it 描述为“随处运营指的是一种 it 运营模式,旨在支持各地的客户,支持各地的员工,并管理跨分布式基础架构的业务服务部署。随处运营的模式是“数字优先,远程优先”。"但这不仅仅是远程工作。这是一种无缝、可扩展的体验,通过智能工作区、安全的远程访问、分布式云和支持自动化提供工作流协作,是一种智能运营体验。
我对影响的看法: 数据科学家将主要是这种基础架构的用户,但这允许他们在独立于物理位置的有效协作团队中工作。重要的不是你的位置,而是你为公司和团队带来的技能。这也意味着,一方面,你的工作竞争对手现在是全球性的。另一方面,你的机会也是全球性的。只要世界范围内缺乏这些技能,我怀疑这将导致工资压力。基于技能的招聘——技术上的和非技术上的——将变得越来越重要。
我的行动建议 :你需要在需求特定技能的市场中给自己定位。这可以是了解某些先进的方法,如计算机视觉、TinyML、特定行业的应用程序、Go 或 Rust 等额外的编程语言,或者可解释的人工智能等特殊主题的经验,以及沟通和演示技能。通过建立你的品牌和作为你的企业家,你在就业市场上获得成功和自由。如今,领先的专家是根据他们在 GitHub 上的作品而不是技术面试来接触和聘用的。我预测这将成为未来的标准。因此,除了成为一名企业家,开始在 GitHub 上建立你的作品集,在那里你可以展示你对特定主题的贡献。你不需要已经是一个专家。不,对于初学者来说,更重要的是开始着手你的品牌,并随着时间的推移不断发展。这为以完全不同的背景进入这个就业市场,或者为想转入这个领域的女性提供了一个新的机会。
6。 网络安全网
是什么:网络安全网 是一种可扩展、灵活、可靠的网络安全控制的分布式架构方法。新冠肺炎加速了现有的趋势,其中大多数资产和设备现在位于传统的物理和逻辑安全参数之外。网络安全网使任何人或物能够安全地访问和使用任何数字资产,无论它们位于何处,同时提供必要的安全级别。”**
我对影响的看法: 和之前的趋势一样,它使数据科学家和机器学习工程师能够在任何地方安全地工作。所以,效果和之前一样。
我的行动建议: 行动同趋势五号 anywhere 操作。此外,这也为职业转变提供了机会。网络安全专家需求量很大。在 Indeed.com,美国有超过 20,000 个空缺职位,其中 2,000 个是远程工作,许多都是针对没有相应背景的人的入门级或实习职位。根据 PayScale,一个网络安全专家的平均工资是 90k 。我知道这与数据科学工作没有直接关系。但它打开了一个入口。越来越多的机器学习算法已经成为网络安全不可或缺的一部分。一位具有经济学和监管事务背景的同事在工作的同时,按照自己的节奏在佐治亚理工学院(Georgia Tech)攻读网络安全在线硕士学位,专注于分析和机器学习的集成。他正利用它转移到数据技术领域。
最后一个块称为 弹性传送 。弹性是指“一种物质在弯曲、拉伸或挤压后恢复到其通常形状的能力。”虽然过去几年公司专注于优化、高效的运营,但新冠肺炎和当前的经济衰退对他们脆弱的流程造成了沉重打击。因此,技术驱动的弹性是快速恢复的新焦点。
7。 智能组合业务
所谓的智能可组合业务。重点是决策的自主性、应用程序的民主化和业务能力。公司的可塑性是关键。
我对影响的看法: 那个对趋势的描述有点抽象。我的解释是这样的:在变革的阶段,人们和组织必须能够做出实时的、相关的和上下文相关的业务决策。中央集权的决策者再也无法做到这一点。有了相关的数据和见解,决策必须是分散的,并且几乎同时,能力必须适应实施它们。所以,组织中的人需要被授权。影响将是组织中的每个人都应该成为公民数据科学家、“创建或生成使用高级诊断分析或预测和说明功能的模型,但其主要工作职能不在统计和分析领域的人。”一方面,来自传统数据科学领域之外的人进入并执行这些自动化任务。
另一方面,数据科学家需要一个清晰的与众不同的个人资料,才能被认可为开发和实施高级应用程序的专家。自动化、公民数据科学家和专业数据科学家将使数据科学端到端流程更加分散。数据科学家的业务决策和沟通技能变得比以往任何时候都更加重要。
我的行动建议: 数据科学自动化将会进化。所以,作为一名数据科学家,你要确保提前教育的主题与你相关。现在就从高级培训开始,尤其是获得与云相关的证书或专业化认证。公民数据科学家将执行中级复杂任务。此外,接受商业决策和沟通方面的培训。
其次,对于还不了解数据科学的人来说,它提供了许多入门机会。你应该从数据科学基础教育和良好的业务分析技能开始。你不需要成为编码专家,但应该能够使用像 R 或 Tableau 这样的工具。
8。 人工智能工程
是什么: 根据 Gartner 的说法,AI 模型的性能、可扩展性、可解释性和可靠性需要健壮的 AI 工程。“如果没有 AI 工程,大多数组织将无法将超越概念证明和原型的 AI 项目转移到全面生产。”人工智能工程的三大支柱是数据操作、模型操作和开发操作。 DevOps 主要处理高速代码变更,但 AI 项目经历代码、模型、数据的动态变化,都必须改进。组织必须在数据管道和机器学习模型管道中应用 DevOps 原则。
我对影响的看法: 目前,仍然有80–85%的 AI 项目没有交付预期的成果。因此,这是一种趋势,无论是公司还是你都没有其他选择。这是必须的。成功的科技公司已经在用这种心态工作了。所有其他人也需要这一点来保持相关性。
我对行动的建议: 我的建议很简洁:学会它。应用它。并使用与之相关的所有相应的生产力工具。
最后一句话 : DevOps、DataOps、ModelOps、MLOps 不是工具,不是技术,不是框架,更不是方法论。它是一种方式,一种心态,一种文化,一种工作哲学,最重要的是,学习。永远记住这一点。**
9。 超自动化
什么是: Gartner 说“超自动化是一个过程,在这个过程中,企业使用人工智能、机器学习、事件驱动软件、机器人流程自动化以及其他类型的决策流程和任务自动化工具等工具,尽可能多地自动化业务和 it 流程。”端到端数字化不仅确保了无缝远程工作,还确保了数字化卓越运营和运营弹性。
我对影响的看法: 越来越多的公司转向数据驱动的商业模式,需要对市场和客户做出快速反应。这些公司已经开始着手这项工作了。原因:上市速度,竞争优势,缺乏像数据科学家这样的资源,以及对他们的依赖。超自动化改变了数据科学家的任务。他们从低级业务分析和数据分析师工作转向自动化和以结果为导向的任务。你的职责包括端到端(质量)控制和监督,使用自动化工具,完全集成到业务流程中,并提供相应的人工智能和机器学习支持。
我的行动建议: 这种趋势要求你在两个方向发展自己的技能。熟悉端到端平台(kdnugges 有 Gartner 魔力象限的总结),工作框架(见上面第 8 条),以及类似 C/C++、Java、Go、Rust 等编程语言。Python 不是一种超自动化的语言。第二,了解业务方面,什么驱动客户体验,并学习如何做“监督”而不仅仅是“实施”。你将是“空中交通管制员”,而不是飞行员。
连接圆点
我们正处于数据科学、机器学习和人工智能的激动人心的时代。所有的技术趋势都需要这些专家的密切参与。这种趋势将持续至少十年,并提供工作保障。你的职业生涯从来没有这么多选择。
也是进入数据科学领域的最佳时机。就业市场对专家的缺乏将会加剧。公司转向更多的入门级和实习招聘策略,并在内部教育员工。对于所有愿意投资技能进入数据技术领域的技术人员和非技术人员来说,这是一个很好的机会。
我的行动建议:
#1: 根据四个标准选择一两个关注的趋势:1)你的技术背景,2)你的兴趣,3)你喜欢的地方的工作机会,以及 4)你可能为进入一个特定领域而投入的时间。
#2: 学习新技能。数据和数据工程培训可在 F 部分和 g 部分找到。大数据和云资源可在 H 部分找到,生产力工具可在 j 部分找到。商业和沟通技能教育可在 l 部分找到。所有高级主题在 M、Q 和 R 部分列出,数据隐私、可解释的 AI 和道德课程在 P 和 s 部分列出。初学者可从上到下学习。
想要转入这一领域的非技术人员应该首先开始阅读这些主题或观看 YouTube 频道上的视频,并熟悉这些领域、术语和方法。你不需要成为这些领域的专家,就可以开始建立你的品牌并进入这个领域。
#3 :成为自己的企业家,开始在选定的领域建立自己的品牌。技术人员可以创建和扩展他们的 GitHub 产品组合。技术和非技术人员可以开始写博客和文章或做演示。或者为什么不在你当地的社区开始这样做呢?给孩子的?50 岁以上的人?为单身母亲提供职业前景?在 Meetup 会议中?对于想进入那个领域的非技术背景的人?你不需要成为有 10 年以上经验的专家。你需要有一个正确的理解,一个良好的自我反省,你没有过度推销自己的技能,诚实地对待你所知道的和不知道的,以及好奇心。
#4: 敷吧。把它应用到你现在的工作中,或者找一个你能应用它的职位。去实习。开设课程。开始兼职远程工作。就业市场非常缺乏这些技能,而且有无数的可能性可以开始。
现在,开始冲浪潮流,尽情享受吧!
你喜欢我的故事吗?在这里你可以找到更多。
** https://pub.towardsai.net/the-ultimate-guide-on-the-ai-professional-certificates-on-edx-2021-deb538a9d93c https://medium.com/cantors-paradise/the-mind-boggling-properties-of-the-alternating-harmonic-series-d5e91a53dcfa **
现代存储系统背后的权衡

由作者提供
数据库一直是应用程序的中心。如果您正在构建一个 web 应用程序,数据库是应用程序的一个关键组件。您需要呈现存储中的数据。您需要有一个存储引擎,在您的应用程序状态中保持单一的真实来源。由于我们可以在互联网上消费大量的数据,创建一个有效的数据存储算法是必不可少的。
1970 年,数据库研究人员优化了数据库算法,以尽量减少磁盘上的随机访问。五十年后,我们希望优化磁盘上的存储引擎,减少内存上的随机访问。因此,为了创造出色的用户体验和更准确的数据预测,我们希望基于特定标准优化我们的存储引擎。
我们通常优化存储引擎的标准是什么?
当我开始我的分布式系统之旅时,我看到了一篇名为 RUM 猜想的论文。文章指出,我们通常希望在读优化、写(更新)优化和内存优化中优化存储引擎的算法和数据结构。
虽然您希望在存储引擎中有一个针对读取、更新和内存效率的完美解决方案,但我们无法同时拥有这三者。我们需要妥协我们的设计。如果我们想拥有读优化的存储引擎,我们就要牺牲更新和内存。这个猜想类似于著名的 CAP 定理。
在本文中,我想解释更多关于 RUM(读取、更新、内存)开销的内容,以及在这三者中的某一个上优化数据存储的一些例子。
读取开销
读取开销是读取主数据的总数据量。如果你存储数据的位置是随机的,你需要做更多的操作来找到数据。如果您想优化读取,您将需要创建一个辅助数据的索引,以便进行快速检索。这些辅助数据导致了读取开销。
如果您创建一个四叉树来对附近的位置进行更快的读取,那么您读取的数据总量将是您遍历的所有四叉树和您从数据库中获得的附近数据。你需要读取所有这些数据来得到那个附近的位置。读取开销可以通过所有数据与要搜索的主数据的比率来衡量。
更新开销是更新主数据所需的访问量。当存储引擎需要对任何其他数据位置执行写入以完全更新初始数据时,会产生更新开销。例如,如果您想要对包含索引的数据库进行更新,您需要对数据库旁边的索引进行更新。
内存开销
内存开销是存储主数据时占用的内存量。它包括需要在主数据旁边存储辅助数据。这通常是数据结构在速度和内存之间的折衷。为了更快地读写而进行的优化会占用内存。您占用的内存是用于存储主要数据的额外内存。
让我们思考一下为什么我们不能同时优化这三者的一些场景。为了更好地说明这三者之间的折衷,让我们来看看在所有三个频谱上优化的系统和假设。
读取优化
读取优化通常执行较低的读取开销。基于散列的索引就是一个例子。您可以在存储引擎上创建一个基于哈希的索引,以提高读取速度。为了进行读取,您需要调用一个散列函数来定位主数据。但是,在更新时,您还需要更新您的主要数据和散列函数。有时,您必须重新划分您的散列函数以防止任何冲突。在这种情况下,更新将受到影响。假设您正在考虑基于哈希的函数中的冲突。在这种情况下,您将需要为您的内存创建开销来存储额外的空块,以降低冲突的可能性。在这种情况下,你的记忆也会受损。
读取优化存储系统的一些例子是用于常数读取访问的基于散列的索引和用于对数时间访问的 B 树和跳转列表。
优化更新意味着,您希望确保更新开销尽可能低。为了降低更新开销,我们可以将更新后的数据存储在某个有条件的辅助空间中,比如一个缓冲区,该缓冲区最终将刷新到批量数据中。我们将追加每一次更新,有效地形成一个不断增长的日志。
虽然我们最小化了更新开销,但是我们增加了读取开销和存储缓冲区的内存。如果我们想要读取我们的数据,我们可能需要进行多次合并来获得数据的当前状态。每次缓冲区被刷新到主存储器时,我们还需要重新组织数据。如果我们重新组织数据以最小化读取开销,我们会增加更新开销。
更新优化系统的一些例子是 LSM 树、分区 B 树和 FD 树。
内存优化
与读取和更新优化一样,内存优化通过最小化访问和更新主数据所需的内存来减少内存开销。系统通常试图通过压缩数据或将数据存储在密集阵列中来优化它们。为了进行读取,我们需要扫描所有的值或者解压缩数据。要进行更新,我们需要解压缩并更新数据。
内存优化应用的一些例子是有损索引结构,如布隆过滤器、计数-分钟草图、有损编码和位图。
如果我们想在这三个方面都进行优化,这是否意味着我们注定要失败?应用程序变得越来越复杂,访问、更新和存储数据的需求也比以前更高。
构建 RUM 访问方法
尽管存在权衡,但许多存储引擎应用程序试图通过平衡 RUM 权衡与硬件、工作负载模式和应用程序的变化来发挥创造力。
因此,数据管理技术变体可以创建优化访问方法的动态方式。例如,我们可以通过在 RUM 空间中部分导航并在集合中覆盖整个空间来构建多址策略。我们还可以根据数据访问模式进行调优,以减少 RUM 开销。
结论
数据存储通常基于读取、更新和内存进行优化。您可以使用基于特定属性的优化数据结构——例如,使用 LSM 树优化更新操作,使用 B 树优化读取操作。但是,您不能将这三个属性结合起来创建一个与每个 RUM 方面和每个开销相等的数据结构。
现在您已经了解了 RUM 开销,您可以使用这些知识来评估最适合您的应用程序和当前工作负载的数据库。RUM 猜想为您提供了一个基本的经验法则来评估您将用于新应用程序及其替代方案的数据库开销。
希望你觉得解释有用!如果您有任何其他问题,请在下面随意评论,以便其他人也可以从中学习。如果你有什么意见和其他新的发现,也请在这里提出来向你学习!
资源
关于朗姆猜想有一些很棒的资源。对于现代存储系统背后的算法,我们仅仅触及了皮毛。如果您想了解更多信息,请查看下面的参考资料!
最初发表于https://edward-huang.com。
让你脱颖而出成为机器学习工程师的特质
我注意到的 3 个特征

Anthony Tran 在 Unsplash 上拍摄的照片
每当我想做一件事时,我会寻找该领域的佼佼者,并寻求达到他们的水平所需付出的代价。例如,当我想提高我的足球运球技术时,我去找山羊(有史以来最伟大的),莱昂内尔·梅西。我的研究不仅包括对他的足球神一样的能力流口水,而且深入了解:1)他的思维过程,所以我理解他何时选择运球或传球的时机,以及 2)他如何在第一时间擅长运球。这项技能一直伴随着我,让我在想学习各种技能的时候克隆人变得更加容易。
"如果说我看得更远,那是因为我站在巨人的肩膀上."—艾萨克·牛顿
机器学习和足球很不一样。首先,机器学习不是一项运动。观察最伟大的机器学习工程师如何设计解决方案并不容易,除非你在 Kaggle 这样的比赛中与他们合作,或者你与他们在同一个团队工作。两者虽然不是不可能,但都相当牵强。然而,进入他们的思维过程更可行,因为我想说的第一个特点。
以下是我在最成功的软件工程师身上看到的 3 个突出的特质:
沟通
有效沟通的能力是强大的;交流是人们聚在一起的原因,因为他人可以洞察一个人的感受、观点和想法。
想想一些伟大的机器学习工程师/数据科学家(我知道有区别);
你听过 吴恩达讲解反向传播 吗?
你听过 卡西科兹尔科夫教 P 值 吗?
你读过 Aurelien Geron 如何解释一个机器学习管道 ?
你见过 安德烈·布尔科夫如何分解机器学习工作流程 ?
一旦你深入研究了这些人的作品,你几乎会因为困惑而觉得自己很傻——即使主题很难。
毫无疑问,这些人知道他们的东西,但以一种容易理解的方式表达他们想法的能力是一种可以学习的技能。事实上,这是一项必须学习的技能,因为数据团队并不仅仅由 mle 和数据科学家组成,而是各方必须保持一致。你越善于沟通,你的光芒就越耀眼。
怀疑论
机器学习算法被训练来揭示数据的底层结构,以便它可以被用来推广到新的实例。假设机器学习算法会做出所有正确的决定,因为它们是由高智商的人开发的,这是非常天真的,特别是当所做的决定影响到其他人的福祉时(例如,预测某人是否患有癌症)。
“我不想相信,我想知道”——卡尔·萨根
持怀疑态度有助于 MLEs 和数据科学家在执行机器学习时保持客观。这种固有的特性促使实践者广泛地检查 1)他们自己(基于特征工程或缺乏特征工程)和 2)模型所做的声明。如果事情变得正确或错误,最好有证据详细说明为什么会发生,以便可以丢弃或复制该过程。
最终,怀疑让我们保持客观,如果我们希望准确地模拟现实世界中的事情是如何运作的,这是一个必要的特质。
毅力
最近,我一直在阅读许多人的故事,他们试图(有些失败了,有些成功了)成为 FAANG 公司之一的机器学习工程师。毫无疑问,机器学习领域一些最聪明的头脑在那里工作。尽管我对在他们中的任何一家工作都不感兴趣,但基于我读到的马克·扎克伯格的一句话,我渴望了解他们的招聘流程。
“我只会雇佣一个直接为我工作的人,如果我愿意为他工作的话”——马克·扎克伯格
根据 Rahul Agarwal 的说法,脸书的招聘流程大概是这样的:
- 电话筛选
- 现场编码回合
- 第二轮现场编码
- 系统设计(包括 ML 系统设计)
- 行为的
FAANG 公司寻求淘汰他们认为不符合公司要求的候选人,这是有道理的。面试过程注定是艰难的,因为雇佣错误工程师的成本远远高于拒绝优秀工程师的成本。在我看来,轰轰烈烈的面试过程是对一个人性格的更深层次的审视,具体来说就是毅力和领导力。
这只是被 FAANG 雇佣的一个例子。
在你的机器学习生涯中,你需要坚持不懈。你的日常活动需要你来保护。跟上最新技术需要你持之以恒。
同样,你也会失败。很多!例如,由于我们在开始建模数据之前无法知道最佳模型,我们将不得不进行许多次等实验来增强我们对数据的理解并建立一个充分的模型。让我们面对现实吧,失败并不好玩——没有人会回家大喊“哈尼,我太开心了。”。我今天失败了太多,但是在我们的领域,为了成功,失败几乎是必要的。
最后的想法
机器学习工程师应该具备技术能力——归根结底,这是你的工作。我相信,花点时间打造提升你性格的额外能力是 MLEs 脱颖而出的原因。对于所有想让自己与众不同的大企业来说,一个简单的解决方案是,当他们从人群中跳出来时,学习领导特质。
感谢阅读!
如果你喜欢这篇文章,请通过订阅我的免费 每周简讯与我联系。不要错过我写的关于人工智能、数据科学和自由职业的帖子。
相关文章
变形金刚
在深度学习中通过注意力工作
我已经开始浏览机器学习方面的经典论文,那些改变了艺术状态或创造了全新应用的发明。以上是我对中介绍的变压器的笔记【注意力就是你需要的全部。transformer 解决了自然语言处理(NLP)中递归序列建模的问题,但后来被应用于视觉、强化学习、音频和其他序列任务。
为什么关注?
从 RNNs、LSTMs 或 GRUs 构建的递归模型被开发来处理神经网络中的序列建模,因为它们可以包括来自相邻输入以及当前输入的信息。这对于像语言这样的数据具有明显的相关性,在语言中,单词的含义部分或全部是相对于周围的单词来定义的。
当相关单词出现在离网络的当前输入很远的地方时,问题就出现了。这些不相连的单词之间的梯度必须穿过所有的重复单元,因为模型不包含每个单词之间的直接连接。

RNN 细胞序列
这种顺序模型还意味着计算不可并行化,因为每个单元的计算都依赖于前一个单元的结果,从而减慢了训练过程。
注意力
进入关注。不管距离远近,注意力都是通过衡量输入的相对重要性来发挥作用的。注意模块(也称为 head)的输入是一组查询(Q)、键(K)和值(V ),表示为通过全连接层的嵌入向量。通过将查询和键相乘,注意头确定对于特定的查询应该激活哪些键。在语言中,这意味着识别哪些单词与当前单词相关。然后,乘以价值网络,注意力头确定分配给每个查询键组合的重要性。
你可能会认为这是一把钥匙激活了锁中的插销。给定正确切割的用于制栓销的钥匙,锁将转动。与其他序列模型相比,注意力的美妙之处在于它考虑了整个序列中的相互作用。

(来源:注意力是你所需要的全部)
所有这些结合成一种机制,可以允许“不考虑它们在输入或输出序列中的距离而对依赖关系建模。”[1]
多头注意力
然而,我们不满足于只有一个注意力头。相反,本文中开发的转换器包含多个注意力模块,称为多头注意力。通过用不同的权重矩阵初始化单独的注意头,该模型并行计算不同的注意函数,这些注意函数在通过另一个全连接层之前被组合。

(来源:注意力是你所需要的全部)
您可以在下图中看到多头方法的结果,其中模型中的每个头在给定嵌入的输入单词“making”的情况下为句子的不同部分分配不同的重要性

分配给输入单词“制作”的注意力(来源:注意力是你所需要的全部
位置编码
当然,使用递归模型的一个好处是基于哪个递归单元接收每个输入来编码位置信息。这些信息对于理解语法结构很有价值,比如修饰词(出现在它们所修饰的词附近的形容词)或介词短语。变压器模型将受益于该信息,因此添加位置编码层作为输入。
基于模型的深度和序列中输入的位置,使用一对具有不同波长的正弦曲线来计算位置编码。这个位置信息被添加到嵌入向量中,并且它们一起形成变换器的编码器和解码器模块的输入。
转换器上的 TensorFlow (TF)示例文档显示了根据深度和位置的位置编码图,但有点难以解释。

位置嵌入值的完整绘图(来源: TF Docs
相反,考虑这个嵌入片段,它显示了不同单词位置和深度的嵌入值。单词在模型中的不同深度接收更高或更低的位置嵌入值,从而允许模型基于位置信息学习一组复杂的关系。

不同模型层的位置嵌入值,其中值 f 是位置、 p 、层{1,5,15,20}和总模型深度(512)的函数。
变压器
转换器的目标是获取编码的输入序列及其先前的输出,通过计算两者的注意力来预测下一个输出。转换器的编码器模块从单词嵌入层和位置嵌入层获取输入,并应用前面描述的多头注意机制。解码器模块接收编码器输出作为第二多头关注块中的值和关键字,以及来自第一解码器屏蔽多头关注块的输出作为查询。
第一解码器关注块的输入被屏蔽,因此解码器看不到它试图预测的单词。每个块都包括跳跃连接。
在训练过程中,变压器根据编码器输出和训练数据中所有其他正确的输出字学习解码正确的当前字。测试时,解码器输出替换正确的输出字。

完整的变压器(来源:注意力是你所需要的全部)
肉眼观察
那么多头注意力在实践中是什么样子的呢?下面是从 TF docs 葡萄牙语到英语翻译问题的一些情节,其中每个次要情节是一个单独的注意头。在很大程度上,每一个大脑都被激活来将葡萄牙语输入翻译成英语。然而,有时在给定多个输入的情况下,转换器为单个输出计算更高的关注度,反之亦然。这是有意义的,因为有时一种语言会用两个词来表达信息,而其他语言只用一个词。
额外阅读和参考资料
平凡的变压器
入门
向非专业人员快速解释复杂的 NLP 模型
我想以一个简短的免责声明开始这篇文章:我可能为这篇文章选择了一个糟糕的名字。变压器不仅不简单,而且它是一个极其复杂的数学模型,有数百万个参数,所以在看了几页矩阵代数和 20-30 个非常糟糕的比喻之后,我决定抽象出相当比例的细节来支持一般概念。这些细节可以通过查看我下面的参考文献列表来找到,这应该会填补我今天拼命逃避的一大块数学。既然已经给出了免责声明,让我们从一些背景开始…
背景
我相信变压器可以通过它的一个应用程序的镜头得到最好的理解,所以我们将从简短地看一下机器翻译的历史及其演变开始,这将把我们带到神经机器翻译的发展和变压器的基础。
著名词典“维基百科”将机器翻译定义为“计算语言学的一个子领域,研究如何使用软件将文本或语音从一种语言翻译成另一种语言”。简而言之,机器实现了语言间翻译的自动化。有些人可能会停止阅读,有一个阿尔伯特·爱因斯坦时刻,并大喊“谁需要极其复杂的模型?我们可以硬编码精确翻译的定义和规则!”
不幸的是,翻译并不那么简单。语言不是一对一的,所以英语中的一个单词可能等同于另一种语言中的许多单词。例如“我的名字是吉尔”(4 个单词)->“施密吉尔”(希伯来语,2 个单词)。这还有其他几个问题,包括具有多重含义的单词,这对具有评估上下文和语气的巨大能力的人来说可能是微不足道的,但对计算机来说可能不是那么明显。此外,语言也在不断变化:“Tik Tok”不再是过去的意思了。
这些问题需要更复杂的模型,我们将在下面看到一些尝试,这些尝试最终形成了今天的变压器架构。
前期努力
机器翻译(MT)始于 20 世纪 50 年代初,由麻省理工学院和乔治敦大学在冷战时期发起,旨在实现俄语和英语之间的自动翻译。这些努力没有取得太大的进展,也从来没有与人类翻译竞争过,因此在 1964 年被以 MT 为中心的 ALPAC 委员会取消了资助,因为这是对时间的巨大浪费。
直到 20 世纪 90 年代,统计算法(统计机器翻译)通过最少的硬编码最终获得了足够的性能来部署和使用,机器翻译才再次兴起。这些算法最近在 2012 年被积极开发,当时谷歌建立了一个足以在一天内填满 100 万本书的 SMT 系统——谷歌翻译。
神经机器翻译
神经机器翻译始于 2013-2014 年左右,并迅速受到欢迎,这得益于 Sutskever 等人和 Cho 等人的开创性论文。这些早期模型使用递归神经网络(RNN 的),这些模型采用一系列文本,学习如何以最佳方式在向量中表示它们,然后学习使用这个向量来逐个破译另一种语言中最可能的单词序列的意思。
由于神经网络的黑盒性质,我们通常不太清楚这些向量表示实际上“意味着什么”,但由于我们同时优化了表示学习(编码)和表示解码(解码),我们直观地优化了整体翻译。
在下面的例子中,我们可以看到这一点。

序列到序列 RNN
这种架构有两个主要缺陷:
- 并行化 —模型是顺序的,一个 RNN 层的输出是下一个 RNN 层的输入。换句话说,我们不能同时运行几个计算,因为每个计算都依赖于所有以前的计算。这使得训练 S-L-O-W。
- 长程相关性 —该架构有一个主要的新近偏差,丢失了句子中早先的信号,而支持“更相关”的新近单词。然而,这些信息并不总是更相关。以这句话为例:“在野生动物园里,我走过去抚摸一只老虎”。虽然“宠物”和“走过”这两个词出现的时间要近得多,但很明显,“野生动物园”对预测你是否真的去抚摸老虎要重要得多。这个问题与被称为“消失梯度”的信号损失密切相关。
尽管已经有很多尝试来解决这个问题(LSTM 和 GRU 层有专门的门来帮助你有效地传播信息),但实际上他们经常做不到。幸运的是,变形金刚模型在这里拯救了世界!
变压器概念#1 —注意
注意力在实践中实际上是一个非常简单的概念——它是你实际上有多关心每一条信息,并在做决定时相应地权衡它的想法。Transformer 神经网络做同样的事情——它查看每一条信息,确定它与决策的实际相关性,并相应地赋予它一个权重。然后,在实际做出决定时,它会按比例权衡所有信息。这可以从下面的图像中看出:

注意力可视化图 4(来源:注意力是你需要的全部,原创论文)
注意力实际上解决了上述两个 RNN 问题:
- 并行化 —我们可以在一个集群中分离单词,并分别计算它们的注意力分布,因此它可以比 RNN 快得多。
- 长程相关性 —所有单词现在都根据它们的实际预测值进行加权,所以顺序不再重要!
Transformer Concept #1b —成比例的点积关注+多头关注
《变形金刚》中使用的注意力类型是独一无二的,因为它在本身(自我注意力)上计算注意力。本质上,它就像一本不断问自己的字典— “我想知道我的哪些部分对利用我来做预测的人最有用”然后根据它们的重要性来突出这些部分。
比例点积注意力是自我注意力,计算如下:每个单词有一个查询向量,我们可以把它想象成《鲨鱼池》中的亿万富翁马克·库班。库班向每一个关键人物提出“问题”,我们可以把他看作是推销产品的商人,他问道:“那么,是什么让你如此大胆地认为你可以在这个市场上赚钱?”。基于响应,他根据他实际想要投资多少来权衡每个值 ( 乘积),并在实际做出决策时考虑所有这些权重(实际兼容性是通过取 Q 和 K 的点积并按表达式缩放来计算的,因此命名为缩放点积)。解码器使用“屏蔽”(依赖于过去的上下文)版本,因为它在整个翻译过程中只能查看已经解码的单词。
多头注意力是缩放点积注意力的重复版本,将注意力应用到已经以有意义的方式过滤/转换的相同向量的几个副本上,然后汇总结果。库班(仍然是 T2 的提问者 T3)再次走向每一个 T4 的关键人物 T5,但是现在,他不是只问一个问题,而是准备了一份完整的问卷。他再次权衡每个问题,但现在在做决定时会考虑所有问题的总和。

缩放的点积和多头注意力架构(来源:注意力是你所需要的,原文)
变压器概念# 2——剩余连接、位置编码
我们之前说过,当实际上通过注意力对价值进行加权时,位置并不重要,并且所有的价值都可以被同时计算,而无需排序。然而,当我们实际构建句子时,这是灾难性的,因为句子中的单词确实有自然的顺序。为了解决这个问题,我们在模型的开头构建了位置编码,这样就可以跟踪位置,并且我们可以按顺序组装句子。
我们必须确保的顺序是,我们的模型将这些编码考虑在内(作为输入),但不会修改它们并完全扭曲我们的顺序。为此,我们构建了残差或“跳过”连接,这样我们既可以将信息用作下一个计算层的输入,同时又可以“向前跳过”。这允许我们的编码不加修改地继续通过网络,因此所有层获得的句子编码听起来不像是尤达所说的(是的,这是故意的)。
变压器概念#3 —线性层,Softmax
当我们穿越我们的网络时,我们将会生成一个非常复杂和有意义的 n 维向量,对于一个不是 500 维思考者或完全精神错乱的人来说,它实际上毫无意义。我们如何“转变”(看我在那里做了什么?)这个向量变成有意义的东西?
这就是线性层的用武之地。它将我们的向量延伸回输入字典的维度,每个值/词被赋予一定的权重。接下来的一层是 softmax 层,它为向量中的每个值分配概率。最终,我们获得一组与每个单词相关的概率,然后我们简单地选择概率最高的单词,并对下一个单词重复整个过程!
整个故事

架构,来源:注意力是你所需要的(原文)
从前,有人建立了一个微小的数百万参数模型,名为“变压器”。变压器接受输入的单词,对它们进行编码,跟踪它们的位置(位置编码,然后学习哪些给定的单词可以用来预测其他使用自我关注的单词。它通过询问自己几个问题的调查来做到这一点,然后汇总响应(多头、 Add + Norm )。
一旦有了有意义的矢量编码,它就把它们输入解码器,解码器通过“跳过它们”来保留未修改的位置编码(“T8”剩余连接“T9”)。然后,它继续学习编码器的哪些部分对解码最重要,并重复整个庞大的过程 6 次。
最后,它想出了一个巨大的矢量。遗憾的是,由于没有人能够理解这个向量,它将它扩展到字典大小(线性层),计算每个单词的概率( Softmax 层),然后逐一预测每个位置最有可能的单词。最后,经过数百万次计算后,它把“我的名字是吉尔”翻译成了“施密·吉尔”,很多人工智能研究者都非常兴奋。
结论
变压器是 NLP 中的革命性架构。它已被广泛用于顶级性能的现代模型,如伯特(来自变压器的双向编码器表示)和 GPT (生成式预训练变压器)。虽然它很复杂,但它是一个优雅的架构,如果你有的注意力跨度来坐几个小时阅读其他的先决条件论文和观看许多解释性的视频,我在下面链接了这些视频。
最后的结论:我为这篇文章选择了一个非常糟糕的名字。
https://papers . nips . cc/paper/2017/file/3 F5 ee 243547 dee 91 FBD 053 C1 C4 a 845 aa-paper . pdf
https://www.youtube.com/watch?v=K-HfpsHPmvw&feature = emb _ title
https://towards data science . com/transformers-explained-65454 c0 F3 fa 7
https://jalammar.github.io/illustrated-transformer/
https://www . smartling . com/resources/101/a-brief-history-of-machine-translation/
作为数据科学家的真相
数据科学家工作的利与弊

首先,我想说我真的很喜欢我作为一名数据科学家所做的工作!我开始研究有趣的技术问题,这些问题会对人和企业产生重大影响。
然而,这并不像人们所说的那样。在数据科学被称为 21 世纪最性感的工作之后,有相当多的人一直在向数据科学过渡,但后来却对这个领域大失所望!
在本文中,我将向您介绍作为数据科学家工作的利与弊。希望这能帮助你更好地了解这个领域。
请注意,这里提到的任何缺点或优点对你来说都可能是不同的。这仅仅是我听到人们谈论这个行业的一些常见的事情。
我是一个悲观主义者,所以让我们从坏处开始吧😅
骗局
有些缺点可能没有我说的那么糟糕。例如,我实际上喜欢清理数据,因为它让我很好地理解我正在处理的东西。

照片由 Masaaki Komori 在 Unsplash 上拍摄
然而,为了防止任何幻灭,我认为有抱负的数据科学家知道对许多人来说在这个领域工作明显不利的事情是很重要的。
1.获取可用数据
实际上,数据科学家经常扮演数据工程师的角色。这样做的一个重要方面是收集执行分析/模型所需的数据。
这一过程可能相当令人厌倦,因为它需要建立大型管道或游说企业获取这些数据。
游说获取数据可能是工作的一部分
建立这些管道虽然是一个有趣的技术挑战,但通常不是数据科学家想要的挑战。此外,根据组织的不同,这可能是你日常工作的一大部分!
2.数据往往非常混乱
数据清理是数据科学中被严重低估的部分。你可以拥有所有最先进的模型,但这永远是一个简单的垃圾进=垃圾出的问题。
许多专业人士报告说,至少 80%的工作是数据清理。这可能会让有抱负的数据科学家失去兴趣,他们可能会认为自己的大部分工作将包括进行有趣的分析。
工业中的数据集通常对机器学习来说太脏了
混乱的数据并不总是可以修复的。我在企业中遇到过许多数据集,任何形式的机器学习都没有用。
当我被问及我能从这些数据中获得什么见解时,我的回答是“获得更多数据”或“获得更好的数据”。
3.企业的参与
作为一名数据科学家,一个很大程度上被忽视的因素是业务的参与。你工作的很大一部分很可能是处理业务。这可以从利益相关者和客户管理到游说数据。
这种参与的困难在于,人们通常对你用数据科学神奇地解决行业中的大问题抱有很高的期望。
预计花费大量时间在仪表板上
尽管企业可能希望将一切都贴上人工智能的标签,但实际上机器学习的实际用例很少。这通常意味着你将从事商业分析和仪表板工作,而不是数据科学。
4.看门人
在过去的几年里,在人工智能领域找工作变得越来越困难。10 年前,你可以只学几门数据分析课程,而现在,你需要拥有博士学位、10 年 FAANG 经验、活跃的 Github 投资组合等等!
最近的毕业生很难找到数据科学家的工作
对于一个有抱负的数据科学家来说,找到一份数据科学家或分析师的工作是很困难的。最近毕业的数据科学家的大量涌入无助于这种情况。
5.终身学习
终身学习听起来很有趣,但可能会导致与倦怠相关的问题。随着人工智能领域的快速发展,你可能会被期望了解最新的研究,并在业余时间不断发展自己。
在这个领域保持最新状态几乎是不可能的
这种对发展的持续需求会妨碍良好的工作生活平衡。这是许多人产生错过感觉的地方,并且容易患上“冒名顶替综合症”。
赞成的意见
尽管有这些不利因素,数据科学和人工智能被大肆宣传还是有原因的;这是一个非常有趣的领域,有可能给许多行业带来革命性的变化!

所以,让我们来看看一些你可能不会在每个列表中看到的优点:
1.这仍然是一个新的领域
虽然现在数据科学已经被炒作了相当一段时间,但在许多组织中仍然不成熟。这种现象让数据科学家在他们的领域成为第一,无论是组建团队还是解决新颖的用例。
解决新问题的许多机会
这些机会让你成为一名不可或缺的员工。同样地,它给你空间去发展概念的证明和尝试新的技术。
2.影响
数据科学的影响可能相当大。尤其是如果使用得当,它可以成为一个组织的基石。甚至像仪表板这样看似基本的事情也可以改变管理层和产品所有者看待他们产品的方式。
对业务的影响可能很大
虽然如果花足够的时间研究数据科学是哪个用例的解决方案,这并不容易实现,但数据科学家可能是组织中的重要员工。
3.机会
在过去几年中,数据科学家的角色发生了变化。一些人更多地从事研究工作,而另一些人则更专注于数据分析。这种差异允许从业者探索许多不同的角色。数据科学家同时从事数据工程师甚至产品负责人的工作并不少见。
数据科学家的角色有很大的灵活性
如果在某些时候,你想更多地关注业务而不是个人贡献者,那么很有可能转变为一个更加面向业务的角色,成为一名数据科学家。
资源
最后,这里有一些额外的资源可以帮助你开始进入这个令人惊奇的领域:
</5-tips-for-making-the-transition-from-psychologist-to-data-scientist-8198fbbbb19e>
感谢您的阅读!
如果你觉得我错过了一个重要的问题,请在评论中发表任何其他的赞成和反对意见。这样,这可以是一个活文档!
如果你和我一样,对人工智能、数据科学或心理学充满热情,请随时在 LinkedIn 上添加我,或者在 Twitter 上关注我。
顶级数据科学家必须知道的两个最重要的软件

照片由áRPád Czapp在 Unsplash 上拍摄
几年前,当我还是一名大学生时,我与一些朋友和教授讨论哪种软件是科学多任务处理、写作和演示的最佳软件。
讨论了一会儿后,我们几乎一致得出结论,如果有人有钱购买 Wolfram Mathematica(或简称 Mathematica)许可证,那么就没有理由使用 Mathematica 之外的其他软件进行科学多任务处理。几乎从来没有!另一方面,如果有人想以高质量的水平撰写和展示科学成果,那么 LaTeX 是各方面的首选。
许多软件产品允许用户进行科学的多任务处理和演示,但是我下面讨论的软件,在我看来,是最适合这些任务的。显然,在这篇文章中,我提出了我自己对这些软件的看法,以及为什么它们是最好的,所以,我完全知道其他人可能不同意我的候选名单。另一方面,我的观点是基于对多年来处于研究生涯最高职位的许多人的观察。
在这篇文章中,我想讨论为什么下面的软件在数据科学和机器学习的背景下很重要,以及为什么顶级数据科学家和机器学习研究人员在大多数情况下(80%-90%)使用这些软件。在这篇文章中,我给出了我作为这些软件的用户的个人想法,我不是在推广它们,而是建议将它们集成到您的数据科学项目中。
一. Wolfram Mathematica
理论物理学家史蒂夫·沃尔夫勒姆在 80 年代中期构思并开发了 Wolfram Mathematica。激发史蒂夫·沃尔夫勒姆的主要原因是,当时没有任何软件能够在粒子物理学中进行符号和数值计算,通常人们必须模拟和计算与粒子相互作用有关的不同量。从此,Mathematica 成为了学术界和研究机构中科学界的标准软件。
如果您访问 Wolfram Mathematica 的官方网站,您会立即在第一页看到以下声明:
wolfram Mathematica——世界上现代技术计算的明确系统
做出上述声明,即声称 Mathematica 是世界上确定的系统,这意味着 Wolfram Mathematica 的研究人员有胆量做出这样的声明。事实上,Wolfram Mathematica 公司对其产品的声明不仅仅是声明,而是事实。
假设你是一名 STEM 领域的研究人员或数据科学家或机器学习研究人员,问自己这样一个问题:一个顶级的多任务科学软件必须具备哪些特征?虽然我不知道你个人的答案是什么,但对我来说,主要的特征一定是:
- 一体式—全部集成。
- 执行符号和数值计算的高效率。
- 最小和容易的代码编写。
- 易于获取的文档。
- 高质量的数据、数字和图像可视化。
现在让我来解释为什么 Mathematica 满足上面列举的所有五个特征。不管你的科学专长是什么,科学软件最重要的特征之一是完全集成的特征,即软件内置了一个地方,在那里你可以执行你需要的几乎所有事情。在 Mathematica 的例子中,这个地方就是如图 1 所示的 Mathematica 笔记本。

图一。执行计算时 Mathematica 笔记本的典型外观。作者出于教育目的创作的图形。
Mathematica notebook 基本上拥有用户进行科学计算所需的所有功能。它允许用户直接编写和操作文本,编写和运行代码,创建和可视化动态图形等。所有这些功能都在一个地方,Mathematica 笔记本。
在我上面的列表中,接下来的两个重要特征是高效的符号和数值计算,以及简单明了的代码编写。如果你看到图 1 中的计算,你会很容易意识到 Mathematica 满足这两个特征。
例如,在图 1 所示的代码中,我执行了符号计算来计算三个 2x2 矩阵的乘积,并在 Out[5]中显示了结果。所有这些计算都非常快速有效地执行,并且只用了四行代码!此外,如果您将光标放在您想要获得某些信息的函数名称上(例如 MatrixForm),将出现一个弹出窗口,让用户可以单击信息按钮。这个功能解释了我在上面的列表中关于易于访问的文档的第四点。
有人能用 Mathematica 在数据科学和机器学习方面做什么?实际上,几乎可以用很少的代码行完成这些领域的所有工作。例如,使用 Mathematica,可以进行符号计算、数学计算、数值计算、代数运算、数据分析、图形计算、交互计算等。在数据科学方面,Mathematica 拥有所有必要的统计和数据分析功能。
在这一点上,我相信最好给出一个具体的例子来展示 Mathematica 在机器学习中的简单性和高效性。在之前的文章中,我讨论了如何用不同的 Python 模块执行线性回归的各种方法。如果我使用我以前的文章中使用的相同数据,并用 Mathematica 进行线性回归,我得到的结果如图 2 所示。

图二。使用 Mathematica 对之前文章中使用的数据进行线性回归。作者出于教育目的创作的图形。
您可以看到用 Mathematica 执行线性回归需要多么紧凑和最少的代码行。为了绘制结果,只需要四行代码。当用 Mathematica 笔记本创建时,绘图的质量非常高,并且图形可以以不同的格式保存。Mathematica 的这个功能反映了我上面列表中的第五点。
二。乳液
我在读本科大学的时候,用微软 Word 准备了我的学士论文。太痛苦了!我浪费了太多的时间只是为了给方程编号并正确显示它们,在一些微小的错误后不得不重新开始。嗯,当我开始学习 LaTeX 时,这种情况发生了变化。
LaTeX 是一款用于文档准备的开源软件,创建于 80 年代初。关于乳胶我能说什么?嗯,乳胶就是完美!很难找到任何其他接近 LaTeX 的软件用于文档准备和演示。LaTeX 可用于准备任何类型的文档,如文章、论文、书籍、信件、回忆录、幻灯片演示等。
由于 LaTeX 是开源软件,多年来它已经发展了很多,在我看来,它已经接近完美。LaTeX 还可以用于为会议和大会制作高质量的演示文稿。这可以通过使用光束器组件来实现。该软件包允许用户以 pdf 格式准备高质量和稳定的演示文稿。有了投影仪演示,你将会忘记会议期间那些尴尬的时刻,因为会议计算机或幻灯机不知何故与未知的东西不兼容,你的 Powerpoint 演示被完全弄糟。
讨论和评论
为什么你应该在数据科学和机器学习项目中使用上述软件?答案很简单:你需要它们,因为它们能节省你很多时间,并给你最好的结果。
关于术语“数据科学”和“机器学习研究者”,需要记住的最重要的事情之一是这两个重叠领域的“科学”和“研究”组成部分。
如果你是一名研究人员和科学家,你希望使用数据来实现科学发现,并以清晰简洁的方式呈现它们,而不要在技术细节上浪费太多时间来实现这些结果。你不希望浪费大部分时间去写很长的代码来实现和展示你的发现。你想使用软件来帮助你实现出色的结果,从而最大限度地减少你的工作时间,上面提到的两个软件都可以让你做到这一点。
不幸的是,现在许多“数据科学”的工作只是主要用 Python 写代码,与科学和研究没有什么关系。如果你在数据科学工作中使用 Mathematica,你会很快意识到使用其他软件浪费了很多时间,比如 Python。是的,Python 是一个非常好的软件,但它不是 Mathematica。我很有信心,如果基于 Mathematica 编写的话,很多基于 Python 的数据科学书籍会更薄。
如果你是一名数据科学家和/或机器学习研究人员,我建议你学习 Mathematica,并将其用于数据科学项目,使用 LaTeX 进行文档准备和演示。在这种情况下,您将会在代码编写上浪费更少的时间,并欣赏数据科学的科学部分。
为什么 Mathematica 在数据科学行业的工作中用得不多?这种现象主要有两个原因。第一个原因是由于大多数数据科学工作人员的懒惰和缺乏创新。从事数据科学工作的大多数人只有学士学位,其中一些人可能根本没有学位。
在他们的学士学习期间,这些人没有太多机会在学术界学习 Mathematica,因为他们在这个早期阶段没有太多问题要解决。根据我的经验,一个人通常会在博士学习期间欣赏 Mathematica 的全部功能,但在此之前不会。因为这个事实,这些未来的数据科学家走出去,开始用软件从事数据科学的工作,而这些软件在编写代码等方面浪费了他们很多时间。同样的情况很可能发生在那些未来的数据科学家一起工作的高级数据科学家身上。
第二个原因与这样一个事实有关:要获得 Mathematica,你需要付费,而其他许多软件如 Python 和 R 都是免费的。事实上,Mathematica 相当昂贵,其价格可能是一个问题,但你真的得到你所付出的。
最后,我对数据科学家和/或机器学习研究人员的建议是开始在他们的项目中使用 Mathematica 和 LaTeX,我很确定你几乎不会回头看。
如果你喜欢我的文章,请与你可能对这个话题感兴趣的朋友分享,并在你的研究中引用/参考我的文章。不要忘记订阅将来会发布的其他相关主题。
基于模型的强化学习的普遍性和未来
理解大数据
这是一个热门的研究子领域。
正如你们许多人所知,我正在攻读博士学位,中心是基于模型的强化学习(MBRL)。这篇文章不是在谈论技术细节和最近的工作,而是为什么我对它的未来充满信心。除了它能表现得多好的前景(它比大多数 deep RL 年轻得多),与人工智能安全和伦理人工智能专家的讨论表明,它更结构化的学习设置指向人类可以更好理解的系统。对于许多公司来说,对系统如何做出决策有一定程度的了解可能是开始使用它的先决条件,否则他们无法进行真正的 A/B 测试和分析。
我将首先向您展示 MBRL 在生物过程中丰富的相似性,然后展示使其更适合在面向社会的系统中安全部署的特性。在讨论了它在我们生物学中的基础之后,我讨论了它如何能导致可解释的和可概括的系统。
基于模型的强化学习综述
基于模型的强化学习与无模型的强化学习的不同之处仅在于对动力学模型的学习,但这对于如何做出决策具有实质性的下游影响。下面是一些定义的语句。
简单版本:
基于模型的强化学习(MBRL)是一种迭代框架,用于在部分理解的环境中解决任务。有一个代理反复尝试解决一个问题,积累状态和动作数据。有了这些数据,代理创建了一个结构化的学习工具——一个动力学模型——来推理世界。有了动力学模型,代理人通过预测未来来决定如何行动。通过这些动作,代理收集更多的数据,改进所述模型,并且有希望改进未来的动作。
学术版:
基于模型的强化学习(MBRL)遵循代理在环境中交互的框架,学习所述环境的模型,然后利用该模型进行控制。具体地,代理在由转移函数 xt+1 = f (xt,ut)控制的马尔可夫决策过程(MDP)中起作用,并且在每个步骤 r(xt,ut)返回奖励。利用收集的数据集 D :={ xi,ui,xi+1,ri},代理学习模型 xt+1 = fθ (xt,ut)以最小化转换的负对数似然。我们采用基于样本的模型预测控制(MPC ),使用学习的动态模型,在有限的、递归预测的水平τ上优化预期回报,该水平来自从均匀分布 U(a)中采样的一组行为(参见论文或论文或论文)。

来源—作者。
基于模型的强化学习无处不在
这一部分基于神经科学的论文(恰当地命名)提出了一个案例,即基于模型的学习在生物学中比无模型的学习更普遍。这一部分也非常适合那些从事物的最优控制方面(Bellman 更新)广泛接受强化学习培训并想知道神经科学社区如何构建迭代学习问题的人。
现在,本文介绍基于模型的思维的起源。
这种区别是通过使用重估探针的任务来操作的,例如训练动物在饥饿时用杠杆挤压食物,然后在吃饱时测试表现。重估质疑一个行为(杠杆按压)的选择是否受到对其结果(食物,现在没有价值)的考虑的影响,或者仅仅是由先前的强化(在饥饿时发生)决定的。如果行为立即调整,以反映行动将获得的结果的新价值,这表明选择是“目标导向的”,也就是说,来自行动的具体结果的表示,或者用 RL 术语来说,是基于模型的。相反,对重估的不敏感性表明“习惯”,做出的选择不考虑结果身份的任何表示,而是基于先前实现的价值进行选择,如无模型 RL。
多巴胺的奖赏预测误差(RPE)假说认为,奖赏是在被预测到时被接收的(论文)。一些作品暗示,这形成了强化学习的无模型版本,源于对学习者不需要对奖励建模,只需要预测它。这一理论遭到了一些反对,论文中尖刻地总结道:
然而,证明大脑是聪明的要比理解它如何处理这种复杂性容易。
来自工程学科(可能是最优控制)的最新理论表明,控制、规划、虚拟部署等可以更好地匹配生物过程。这篇论文通过几个例子讨论了大脑是如何处理多个“事件和行为的连续偶然事件”的。我喜欢我在研究中经常使用的全新措辞——计算规划。从计算机科学的角度来看,这种规划技术类似于模型预测控制——通过样本或凸优化,迭代优化行动序列,以实现通过状态空间的期望轨迹。
具体来说,这篇论文强调了在腹内侧前额叶皮层和眶额皮层(或大鼠前额叶皮层)进行的一系列目标导向行为(价值规划)实验。额外的实验是在建模发生的进行的 (fMRI 是一种神奇的工具),并在 hoppocampal 区域(具有空间映射能力)找到记录。我得到的要点是,大脑的这些区域通常与不同类型的计划相关联——我们对自己的一天有一个愿景,而不是我们下意识地计划如何拿起杯子。从控制设计的角度来看,这种 层级 也存在于大脑中是非常引人注目的——让一个控制器微调你的机器人上的所有问题是不太可能的。这种分级控制也有助于基于模型和无模型学习的完美结合。请考虑本文中描述的差异:
基于模型与无模型二分法的提出是为了抓住心理学中两类工具性行为(目标导向型和习惯型)之间的长期差异。
在我与同事讨论过的等级系统中,无模型控制将用于快速思考和简单的任务,如拿杯子,但我们希望我们的代理能够以结构化的方式推理未来,所以我们给他们一个模型。

来源—作者。
可解释性和 RL
今年我最喜欢 NeurIPs 的一个想法是一组实验,试图使我工作的 RL 系统可以解释。机器学习中的可解释性是什么意思?用户理解模型如何做出决定的能力(我在这里故意说用户,因为在某些情况下,负责的公司可能能够更快地理解决定,但我希望看到这样一个世界,当这些见解需要传递给用户时——不披露秘密算法酱,当然是因为资本主义)。
为什么香草无模型 RL 循环不可解释?当前机器学习社区最喜欢的函数逼近器,神经网络,没有给出如何进行计算的洞察(例如,与记录决策特征的决策树的随机森林相比)。从调试的角度来看,这个计算黑箱非常有限。它可以成为有趣的研究,因为它经常要么有效,要么无效,但当涉及更多真正的意外情况时,这就不太好了。
基于模型的 RL 可以通过使用奖励集合的计划获得某种程度的可解释性。通常在 RL 中,我们只试图优化一个奖励函数。如果通过仔细的设计或反向 RL(或通过拥有多个目标),我们可以在奖励集合的存在下考虑我们的计划。基于模型的学习的一个普遍失败是行为利用了模型中的不准确性。目标是通过使用多个奖励函数,我们可以优化最坏的情况(哪个奖励函数看起来最差)。我们希望这也能带来更稳定的表现,而不是拿一个奖励的最大值。说服人们使用更加开放和易于理解的 ML 系统的最好方法是让它们更好地工作,对吗?
对于那些想要更多了解可解释性的人,我听说了很多关于微软研究院讨论可解释模型的报告。我期待从中学到更多。
用模型概括
我们希望我们的学习系统能够解决多个相关的任务(或者至少改进它们),因为我们从这些任务的环境中积累了更多的数据。更好的是,我们希望我们的机器人能够根据过去的数据在相同的环境中解决全新的任务。这是泛化的目标。这场争论的关键在于以结构化的方式学习的潜在好处——通过动力学模型——允许我们的代理人对不同的场景进行推理。
为什么香草无模型 RL 循环不可推广?调整神经网络策略的优化在很大程度上取决于被优化的奖励函数/任务。这种微调,再一次缺乏人类手动操纵和理解这些网络的能力,使得策略实际上只对那个任务有用。
基于模型的 RL 希望通过反复利用动力学模型来缓解这一问题。这是一个强有力的假设,因为该模型仍然受到分布变化和其他问题的影响。例如,精确的模型并不能保证获得强大的性能(这是我们杜撰的一个问题目标不匹配)。但鉴于我们对生物学如何工作的了解以及计算的日益可用性,使用我们必须的大型计算机来推理我们从数据中收集的模型是合乎逻辑的。关于一般化如何与模型一起工作的精彩演讲,请参见今年 NeurIPs Deep RL 研讨会上 Anusha Nagabandi 的演讲。
总之,我也认为基于模型的学习有助于强化学习的一个光明的年轻领域,离线学习。离线 RL 的思想是获取以前记录的数据,并用它创建一个策略,这可能会大大增加 RL 可以解决的问题的范围。如果您对此感兴趣,请查看离线 RL 的本次研讨会。
像这样?最初贴在我的 简讯 民主化自动化 上。订阅❤.
使用 Python 中的 4 个关键准则进行数据清理
高效识别和清理杂乱数据的实用指南

数据清洗是从数据中去除错误和不一致的过程,以确保数据的质量和可靠性。这使得它成为为分析或机器学习准备数据时必不可少的一步。
在本文中,我将概述一个用于识别不干净数据的模板,以及有效清理它的不同方法。在清理之前,一定要按照我这里的方便的 EDA 指南进行彻底的探索性分析(EDA)。
</11-simple-code-blocks-for-complete-exploratory-data-analysis-eda-67c2817f56cd>
1。移除不需要的观察值
这些行不会给模型增加任何价值。
A .重复
这些是数据中出现不止一次的观察结果。它们可能是在数据收集过程中产生的,例如在收集数据或合并来自多个来源的数据时。
要检查重复项,运行代码df.duplicated().sum()。对于每组重复的值,第一次出现的标记为 False(0),其他重复出现的标记为 True(1)。sum()返回所有 1 的总和,因此只返回重复的行。
data.duplicated(subset='Address').sum()###Results
202
上面的代码返回了重复‘Address’的重复次数。
清理:要删除重复项,运行下面的代码。
data.drop_duplicates(inplace=True)
您还可以删除基于特定列的重复项。默认情况下,df.drop_duplicates在删除时会考虑所有列。但是,有时您希望删除只有特定列相同的行。
df.drop_duplicates(subset=['first_name', 'email'],
keep='first',
inplace=False)
一个例子是一个客户数据集,您可以删除具有相同first_name和email地址的行。参数keep='' 的默认值是keep=’first’,它选择保留哪一行,而丢弃所有其他重复的行。其他选项有‘first’, ‘last’, False。点击查看文档。
B .无关的观察结果
按列
这些列或观察值不属于我们正在解决的问题陈述。
根据您的问题陈述,有些列可能是无用的,或者对模型没有预测性影响。例如,狗价在预测房价时是一个无用的特性,去掉这个特性是明智的。
在其他情况下,可以用相同的值填充一列,例如,一个关于某个公司的薪水的数据集,该数据集具有一个要求雇佣状态的特性。在这种情况下,每个人都填写了“是”表示已被雇用,因此该特征对模型没有变化也没有影响。
清洗:要移除色谱柱,请使用df.drop()
df.drop(‘dog price’, inplace=True)
分类特征
根据与问题无关的某些类别,您可能需要删除某些行。
例如,如果我们预测非洲市场的资产价值,我们应该移除非洲大陆以外的资产。另一个例子是,当我们只预测住宅房价时,去掉商业房产类型。
要检查分类列中的不同类别,使用Series.unique()函数返回一个 python 列表。也可以使用 Seaborn 条形图进行可视化,但是要小心,因为许多类别会导致许多条形图,使其不可读。
下面的代码显示了数据集中唯一区域的列表。
data['Regionname'].unique()###Results
array(['Northern Metropolitan', 'Western Metropolitan',
'Southern Metropolitan', 'Eastern Metropolitan',
'South-Eastern Metropolitan', 'Eastern Victoria',
'Northern Victoria', 'Western Victoria'], dtype=object)
清理:假设我们要移除位于“北维多利亚”的所有房产。我们将首先创建一个没有“北维多利亚”的蒙版。首先使用.isin()获得带有“Northern Victoria”的行,然后使用符号~否定该结果以表示“不在”。
代码~df['col'].isin(value)返回真值和假值的布尔掩码。然后,我们将这个掩码应用于数据集,只返回为真的行。
region_mask = ~data['Regionname'].isin(['Western Victoria'])
data = data[region_mask]
2.修复结构错误
这些是数据中的错误,可能是由于数据输入或数据传输造成的。一种可能的解决方案是将这些值转换成所需的名称或格式。
A .错误的数据类型。
列方式—更改整列的数据类型
列的数据类型很重要,因为它有助于 python 理解如何存储和操作数据。例如,相关矩阵只有在数据类型是整数或浮点数时才有可能。
通常,python 会将正确的类型分配给列,但是有时您需要显式地转换为适当的类型。
要检查每一列的数据类型,运行df.dtypes并检查每一列给出的数据类型是否有意义。

作者的数据类型错误
在我们上面的数据中,价格是一个“对象”,意味着它包含字符串和浮点数的混合数据。
清理:确定不正确数据类型的原因。或许价格包含货币符号,可以用df.col.replace()。
注意:如果列包含混合类型(有些是字符串,有些是纯整数),replace 方法可能不适用于整数值,并将返回 nan。使用df[‘Price’].apply(type).value_counts()检查特定列中的各种类型。这篇文章完美地解决了这个问题。
数字特征-调查和清理
df.describe()显示数字特征的统计分析。在这里,检查每个特征的最小值和最大值,以及标准偏差。这有助于识别指标变量为适当的分类特征。

作者的指示器/二元特征
清理:在上图中,列‘Gym’只有一个值,其他都缺失(Nan)。我们通过用 0 填充丢失的值来清除该列。
df['Gym'] = df['Gym'].fillna(0)
分类特征-调查和清理
最后,运行df.describe(include=’object’)来研究分类特征。这里,每个特性的唯一值的数量很重要,最流行类的频率( freq )也很重要。

在上图中,这两列显示为字符串而不是整数。
错别字和不一致的措辞。
分类特征
在数据输入过程中,如果相似的值以不同的方式表达,可能会出现错误。例如,“IT”和“信息技术”意思相同,但可能是不同的类别。Series.unique()这里又有用了。下图包含了tools名称的条形图。

作者分类不一致
清洗:我们可以看到两对相似的工具,命名不同。使用下面的Series.replace()方法。
tools['Name'].replace(['Pump fittings'],'Pump', inplace = True)tools['Name'].replace(['Cutting disc'],'Cutting disk', inplace = True)
3.如果理由充分,删除异常值
我应该强调,离群值是无辜的,直到被证明有罪。有时候,这些异常值很可能对模型有益。
因此,对每个特性进行尽职调查,只删除错误值或与问题陈述无关的值。
A .可疑测量值
数字特征-识别和清除错误和可疑值
在这些值中,一个属性在给定其他属性的情况下没有意义。例如,year_built 为 1995 而 year_sold为 1973 的属性。在这种情况下,您可能需要删除该行。
在下面的例子中,统计分析显示最古老的房子建于 1196 年,这可能是数据输入错误。

作者可能的数据输入错误的异常值
清洗:按年份过滤数据,只返回 1800 年以后建造的房屋。
data = data[data['YearBuilt'] > 1800]
B .代表不同人群的异常值
数字要素-查找和清除异常值
这些值太大或太小,不在我们当前问题陈述的预期范围内。同样,使用统计数据和图表很好地理解数据是很重要的。
在下面的方框图中,我们注意到一块土地的面积比其他的大得多。
sns.boxplot('Landsize', data=data)
plt.show()

在进一步分析这个异常值后,它似乎是一个错误,我们通过删除所有超过 400,000 的土地大小来清除它。
data = data[data['Landsize'] < 400000]
4.处理缺失数据
最后,让我们处理丢失的值。这是一些观察空白或数据损坏的地方。
这一步至关重要,因为如果存在缺失值,许多机器学习模型将不会运行。幸运的是,我们已经删除了不相关的和错误的数据,所以这一步涉及到用合适的替代值替换缺失值,这一过程也被称为插补。
分类特征-填充缺失值
列中缺少的值可能会提供信息;因此,我们用不同的、唯一名称填充它们,以便我们的模型知道这些值是不同的。
要获得分类列中缺失值的数量,请运行下面的代码。
data.select_dtypes(include='object').isnull().sum()

df.select_dtypes(include=’object’)仅返回分类列,而.isnull().sum()返回每列缺失值的数量。
在上面的数据集中,只有一个分类列缺少值。
Cleaning: 我们将用值‘missing’填充这个特性,本质上是在那个列中创建一个新的类别。
data['CouncilArea'].fillna('missing', inplace=True)
数字特征-填充缺失值
对于数字列,需要一个额外的步骤。这是因为我们期望我们填充的任何值都已经存在于该特征中,因此模型没有办法区分这些条目。
因此,在输入这些列之前,首先创建一个新列,指示该行是否有缺失值。把这些列想象成‘缺失’的指示器。
数据:我们使用与上面类似的代码,但是在选择列时使用**exclude**=’object’来排除分类特征。
df.select_dtypes(exclude='object').isnull().sum()

三列缺少值。
清洗:第一步。创建指标特征
df['YearBuilt_missing'] = 0
df.loc[df['YearBuilt'].isnull(), 'YearBuilt_missing'] = 1df['Car_missing'] = 0
df.loc[df['Car'].isnull(), 'Car_missing'] = 1df['BuildingArea_missing'] = 0
df.loc[df['BuildingArea'].isnull(), 'BuildingArea_missing'] = 1
上面的代码为每个缺少值的列创建了一个指示器列。
清洁:第二步。替换丢失的值
在这里,重置价值完全由你决定。您可以选择用平均值、中间值、零等来填充。理解特征是你做决定的好基础。
我将用零替换“汽车数量”和“建筑面积”中缺失的值。缺失的“房产建造年份”将被替换为平均年份。
average_year = int(df['YearBuilt'].mean())
df['YearBuilt'].fillna(average_year, inplace=True)df['Car'].fillna(0, inplace=True)
df['BuildingArea'].fillna(0, inplace=True)
结论
数据清理被认为是数据科学项目中最耗时的过程。我希望本教程中概述的 4 个步骤会让你的过程更容易。
请记住,每个数据集都是不同的,在清理之前,对问题陈述和数据的彻底理解是至关重要的。
我希望你喜欢这篇文章。每当我发表新的文章时,想要收到更多这样的文章,请在这里订阅。如果你还不是一个媒体成员,并且愿意支持我成为一个作家,请点击这个链接,我将获得一小笔佣金。感谢您的阅读!
助推终极初学者指南
假人的集合方法。包含动手 Python 代码的循序渐进教程。

由 SpaceX 在 Unsplash 上拍摄的照片
Boosting 是来自集成学习范式的元算法,其中多个模型(通常称为“弱学习者”)被训练来解决同一个问题,并组合起来以获得更好的结果。这篇文章介绍了你所需要的一切,以便与助推起飞。杰出的计算理论家莱斯利·瓦里安推动了这一范式。
我最近写了关于 bagging 的文章,bagging 根据数据在多个引导上构建相同的模型,并结合每个模型的预测来获得总体分类或预测。
https://betterprogramming.pub/bagging-tutorial-classify-higgs-boson-particles-with-ai-941801559231
打包的一个巨大优势是我们可以并行化它。另一方面,boosting 通过从弱学习者开始并添加一个基于弱学习者残差训练的新模型来顺序工作。
Boosting 重复几次,每个模型都在原始数据集的变化版本上进行训练,并使用学习率进行正则化。与装袋不同,助推利用团队合作。每个运行的模型决定了下一个模型将关注的特性。因此,强化以一种适应性很强的方式依次训练弱的学习者。
每个模型可能不太适合数据,但整体的线性组合可以是富有表现力和灵活性的。添加到集合中的每个新的简单模型补偿了当前集合的弱点。
我们将通过注意单个分类器所犯错误的模式以及如何根据这些错误训练弱模型来提高准确性来激励 Boosting。
为什么升压有效?
让我们使用 UCI 机器学习库中希格斯数据集的一个小子集。这份 2014 年的论文包含了关于数据的更多细节。
每一行代表高能质子束碰撞的实验。类别栏区分产生希格斯玻色子的碰撞(值 1)和只产生背景噪音的碰撞(值 0)。我们对使用 bagging 技术预测类别感兴趣。

我们将深度为 3 的决策树tree1与训练数据进行拟合。对于每个预测值,我们绘制一个比较两种分布的图:正确分类的样本和错误分类的样本的预测值。
正如我们在下图中证明的那样,正确预测和错误预测的样本值分布几乎相同。这一证据表明,样本被错误分类的可能性并不取决于其价值。因此,我们可以通过将决策树与另一个根据错误分类信息训练的树相结合来提高决策树的预测能力。这就是做助推背后的动力。

升压是如何工作的?
理解 boosting 的最好方法是从头开始使用两个分类器实现它的简化版本。
让我们将第一个分类器tree1定义为深度为 3 的简单决策树。第二个分类器tree2是另一个深度为 3 的决策树。tree1在原始训练数据集上进行训练。tree2在对tree1误分类的样本应用权重 2 后获得的改变后的训练数据集上进行训练。因此,tree2从弱学习者tree1的残差中学习。通过对两棵树的预测进行平均来计算总体分类。
结果表明如何通过在由另一个弱学习器产生的残差上训练一个弱学习器,并平均两个分类器的预测概率;我们提高了整体测试精度。这是助推机制的一个很好的例证。

梯度增强是如何工作的?
直观地,我们添加到我们的集成模型中的每个弱学习者模型从集成的错误中学习。因此,随着每一次加法,加权残差影响下一个弱学习者。如果我们将权重视为一个调整参数,那么我们可以使用最流行的优化技术:梯度下降来找到它的最优值。
为了掌握梯度推进是如何工作的,让我们重新考虑深度为 1、2、3 和 4 的几个决策树作为弱学习器。这一次,我们将应用学习率为 0.05 的梯度下降,并运行 boosting 进行 800 次迭代。
使用 boosting,我们在每个新的迭代中从以前的决策树的残差中学习,因此我们观察到训练集准确性不断增加,直到我们将过度拟合数据并观察到接近 100%的稳态。
如下图所示,树的深度对趋势有很大的影响:树越大,训练集的准确性越高,而不管迭代的次数。

深度 1 和深度 2 的树可能是非常慢的学习者,这需要更多的迭代次数。深度 3 和深度 4 的树学习速度更快;测试集的精确度在第一次迭代中稳步增加,直到达到峰值,然后随着迭代次数的增加而降低。深度 1 和深度 2 的树对数据的拟合不足,而深度 4 的树对数据的拟合过度最多。深度 3 表示最低的方差和最低的偏差。

基于我们刚刚制作的图表,弱学习者深度和迭代次数的什么组合看起来是最佳的?
在 97 次提升迭代之后发现的梯度提升的深度 3 决策树分类器在低方差和低偏差方面似乎是最佳的。
梯度提升比使用前一部分中更新的权重的手动提升的深度 3 树实现了更好的准确性。
精确度的提高表明梯度推进实际上很有帮助。特别是,与我之前的文章中通过装袋获得的最佳精度相比,它的表现更好。

结论
Bagging 和 boosting 是所谓的“集成”技术,通过聚合许多弱学习模型,如单决策树,大大提高了预测的准确性。
我们可以对每棵树单独进行套袋训练。因此,装袋技术更适合于并行化,例如,在多核 CPU 计算机上。提升是连续的,因为每个树都是使用前一个树构建的。
当模型过度拟合时,装袋对于减少方差是非常有用的。升压适用于降低欠拟合模型中的偏差。
终极数据可观察性清单
数据可观测性不仅仅是建立一系列数据管道测试并期待最好的结果

您的数据团队正在投资 数据可观察性 来应对贵公司的 新数据质量计划 。太好了!但是这对你意味着什么呢?
以下是您在构建或购买数据可观测性平台时需要记住的一切。
随着数据成为决策和产品开发中越来越重要的一部分, 数据可靠性 和 质量 是数据工程和分析团队最关心的问题。
为了满足这种需求,团队越来越看好 数据可观察性 ,这是现代数据堆栈的一个新层,允许团队跟踪他们最关键的分析的健康状况,并在大规模数据中建立组织信任。正如强大的可观察性和监控有助于工程团队防止应用停机,数据可观察性工具提供可见性、自动化和警报,帮助数据团队最大限度地减少和防止数据停机。
随着公司收集越来越多的(通常是第三方)数据,投资于数据可观察性变得越来越重要。引入新的数据源并扩大对新数据消费者的访问也自然会导致更复杂的管道——这增加了丢失、陈旧或不准确的数据对您的业务产生负面影响的机会。
借助数据可观察性,团队可以回答一些常见问题,如:
- 我的数据可靠吗?
- 我的数据在哪里,什么时候会更新?
- 我如何知道这些数据何时被修改过?
- 哪些数据资产对我的业务最重要?它们是如何被使用的?它们新鲜准确吗?
随着对数据可观察性需求的增加,一些团队正在构建他们自己的工具,而其他团队则寻求现有的解决方案。虽然我们对这种不断增长的需求感到无比兴奋,但我们也明白,消除噪音并准确理解您的数据可观测性平台需要提供什么是一项挑战。
以下清单将涵盖稳健的数据可观测性平台应实现的具体成果,分为四个关键类别:
- 了解数据停机时间
- 数据问题疑难解答
- 首先防止数据停机
- 用安全第一的方法保护您的数据
让我们开始吧。
了解数据停机时间
从根本上来说,数据可观察性平台应该监控您的数据的健康状况,并在您的下游数据消费者在其仪表板或查询中注意到问题之前,在管道破裂或作业运行不畅时向您的团队发出警报。知道监控什么问题可能是压倒性的,这就是 ML 驱动方法的关键所在。您的数据可观察性平台应该在注意到新鲜度、容量和模式变化时智能地出现,而不是依赖于手动测试来检查数据质量问题。
下面是您的数据可观察性平台应该自动检测的两个常见数据问题的示例。
在第一个示例中,我们看到一个表中的数据量出现了显著的意外下降,这表明可能计划了也可能没有计划的记录删除。

图片由作者提供。
在第二个例子中,我们看到存储在表字段中的 JSON 数据的模式变化,这同样可能是计划好的,也可能不是计划好的,但是在解析 JSON 值时绝对需要下游的变化。

主动监控数据质量问题并发出警报
这是任何数据观测平台的关键。正如软件工程师依靠监控来提醒他们任何中断或停机,数据团队应该能够依靠监控来自动通知他们数据健康的任何异常,而不是等待内部消费者或客户注意到出错(这种情况发生在惊人的 57%的企业)。)
基于数据集分配和事件类型智能路由警报
警报只有在适当的团队(即数据所有者)收到时才有帮助。您的数据可观察性平台应该支持基于分配和事件类型的路由。
数据质量监控流程的集中化、标准化和自动化
数据可观察性应该应用于您的整个组织,标准化和集中化数据质量监控,以确保每个团队都使用相同的语言,并根据相同的剧本进行操作。
根据历史数据自动生成规则
借助机器学习,您的数据可观察性平台应该能够分析数据的趋势,以自动制定数百条规则,而您组织中的任何人都不需要编写一行代码-识别异常、空值或缺失数据,并相应地提醒您的团队进行进一步调查。
让数据工程师能够根据特定业务需求设置自己的规则和阈值
虽然自动化节省了人工,但您的数据组织最了解您的数据资产。因此,您的数据可观测性平台应该包括数据工程师、数据分析师和数据科学家根据业务需求或随着新管道和项目的引入,设置自己的阈值来监控数据的灵活性。
基于现场历史趋势的自动化异常检测
前面提到的基于 ML 的异常检测应该在字段级运行——而不仅仅是表级——基于关于数据的历史度量和统计。
数据可观察性不仅仅包括异常检测。一个强大的数据可观察性平台将使用户能够通过索引所有资产(包括 BI 报告和仪表板)来搜索和发现他们需要的数据。在为任何给定的工作寻找合适的数据时,数据健康指标,加上业务环境,为您的数据消费者提供了强大的能力。
针对标准数据质量维度和谱系的持续监控和警报
针对质量维度的警报非常有用:当数据丢失、不完整或不准确时,它们会通知您。但是没有沿袭——跨所有管道和环境逐记录地跟踪所有数据集成操作——您将很难找出哪里出了问题。这两者都应该由您的数据可观察性平台提供。
数据问题疑难解答
第二类结果是对数据问题进行故障排除,以便您可以快速修复它们,这应该侧重于使您能够轻松了解哪些数据损坏以及损坏的原因,同时为您的团队提供工具,以便在下游和上游依赖关系影响业务之前对其进行跟踪。

您的数据可观察性解决方案应能让您轻松、及时地访问最重要数据资产的端到端谱系,直至现场级别,从而轻松、有效地解决事故。图片由作者提供。
了解问题的业务影响并优先解决问题
智能平台将能够根据下游数据消耗评估数据停机可能带来的业务影响,并相应地确定问题解决的优先顺序。
通过合适团队的首选渠道智能地将警报发送给他们
警报应该是有意义的交流,而不是白噪音。您的数据可观察性平台不仅应该支持将警报智能路由到正确的团队成员——理想情况下,这些警报应该通过他们首选的渠道(想想 Slack、电子邮件或 SMS 文本消息)来传递。
通过简单的用户界面搜索和浏览数据资产
在处理破损数据时,速度和可访问性很重要。一个简洁的界面可以帮助您的团队快速搜索和审查数据资产,使用目录和沿袭功能来确定事件的根本原因。
收集和显示调查和解决问题所需的信息
您的平台应该提供在警报或案例级别解决问题所需的所有相关信息,减少手动调查的需要,并加快解决问题的速度。
通过端到端沿袭进行根本原因分析
当您的平台提供对您的端到端沿袭的全面可见性时,您可以通过立即访问数据的整个生命周期来消除根本原因分析中的猜测。
协作解决事件,并将其标记为已通知、已解决、无需采取措施或误报
您的平台应该让每个受特定事件影响的人都在同一页面上,每个问题都有可见的状态报告,从而让生活变得更加轻松。
访问包含完整事故信息的事故警报日志,以进行分析和报告
全面的日志是必不可少的:它们帮助每个团队成员了解情况,减少常见问题类型的解决时间,并使数据主管能够分析和识别重复出现的问题。
API 集成,以确保您的管道关键元素的监控和警报可以发送到适当的方
现代数据可观察性平台应提供对所有属性的全面 API 访问,以便您可以定制适合现有技术堆栈的工作流,并使您的团队能够节省时间、避免重复工作和快速解决问题。
防止数据停机
无论您的数据可观察性平台在识别和提醒您数据停机方面有多么出色,如果您不能主动预防事故,您在维护可靠的数据管道方面所做的最大努力都将付之东流。一个真正的端到端数据可观察性解决方案将通过智能目录和沿袭功能,利用机器学习来理解数据中的历史模式,从而使数据质量监控更进一步。

强大的数据可观察性平台将通过数据目录和数据监控仪表板支持数据发现,让用户了解最新的重要数据健康要素。图片由作者提供。
所有资产的数据质量和健康信息
除了在出现问题时发出警报之外,数据可观察性工具还应该基于历史模式和数据事务的当前状态,随时提供所有资产的数据质量和健康状况的整体视图。
通过血统一目了然地了解字段和字段类型
当数据可观察性平台包括沿袭时,您应该获得数据字段和字段类型的“目录”级视图,提供数据资产和整体数据健康之间关系的概览。
了解与表和字段沿袭相关的关键报告和仪表板
数据可观察性应使数据团队能够了解哪些 BI 报告使用哪些字段,从而帮助确保模式更改不会无意中破坏 BI 报告或使下游数据消费者感到沮丧。
分析字段级指标/统计数据,以及它们如何随时间变化
您的数据可观察性平台应该能够理解数据是如何随着时间的推移而变化和发展的,这样您就可以在粒度级别上跟踪重要的指标。
动态更新模式元数据和信息
有了数据可观察性平台,您的元数据应该动态更新,而不需要手动更改。
确定你的关键资产是什么,以及它们是如何被使用的
您的数据可观察性平台应回答相关问题,包括:谁在使用这些数据,他们使用这些数据的目的是什么,他们何时访问这些数据,以及这些数据“停止运行”的频率(例如,过时、丢失等)。)?数据可观察性应包括帮助您了解如何使用关键数据资产的洞察力,帮助实现版本控制,并允许您识别和淘汰过时的资产,确保您不会将错误的数据用于重要的业务决策或支持数字产品。
通过分析表负载模式度量来评估及时性和完整性
您的数据平台应该帮助您验证关于数据新鲜度和数据量的假设,确保您的预期符合现实。
保护您的数据

当你选择一个数据观察平台时,安全应该是你最关心的问题。考虑依赖于数据只读访问的选项,并优先考虑 SOC2 认证。图片由wk 100 MikeatShutterstock提供,可通过作者购买标准许可证获得。
数据可观察性平台不应要求数据离开您的环境—句号。最佳方法不需要存储或访问个人记录、PII 或任何其他敏感信息。相反,数据可观察性应该只提取关于数据使用的查询日志、元数据和聚合统计信息,以确保您最重要的数据资产尽可能值得信赖和可靠。
静态监测数据
您的数据平台应该采用安全第一的方法进行设计,这种方法可以监控静态数据,并且不需要访问您的数据仓库。
您的数据可观察性平台需要通过 SOC2 认证,该平台测量包括安全性、可用性、处理完整性、机密性和隐私在内的控制措施。
从查询日志和模式变更日志中快速识别重大变更
您的平台应该使用元数据,如查询日志和模式更改日志,以便在更改破坏您的数据管道时自动发出警报。通过使用这些元数据而不是数据本身,您的平台提供了一个额外的安全层。
数据可观察性入门
最终,您的数据可观察性应该使与您的数据交互的每个人,从工程师到最终消费者,都能自信地回答一个复杂的问题:“这些数据可信吗?”
无论您是构建自己的解决方案还是从供应商那里购买解决方案,真正的数据可观察性都将增强整个组织的信任,并为团队利用数据开辟新的机会。同时,您的数据工程团队应该从持续的消防演习和手动调查中获得宝贵的时间,让他们专注于创新、解决问题和帮助您的业务增长。
想了解更多关于数据可观测性平台的信息吗?伸出手去 巴尔 和其余的 蒙特卡洛 团队。
请务必于太平洋标准时间 3 月 18 日上午 9 点参加我们的数据可观察性网络研讨会 ,了解最佳数据团队如何利用这种方法来防止数据管道中断并大规模解决数据质量问题!
数据科学家应对编码面试的终极指南
数据科学面试
理解 4 种类型的编码面试问题并有效地准备它们

克里斯托弗·高尔在 Unsplash 上拍摄的照片
介绍
与科技行业中的其他类型的角色相比,数据科学(DS)是一个相对较新的职业,如软件工程和产品管理。最初,DS 访谈只有有限的编码部分,仅包括使用 Python 或 r 的 SQL 或应用数据操作会话。然而,近年来,DS 访谈越来越强调计算机科学(CS)基础知识(数据结构、算法和编程最佳实践)。
对于希望进入数据科学专业的人来说,面试中更多 CS 的趋势可能会令人生畏。在本帖中,我们希望增加你对编码面试的了解,并教你如何准备。我们将对不同的编码问题进行分类,并提供解决这些问题的技巧,这样你就能有一个出色的面试。如果您认为我们能够以任何方式让您的旅程变得更轻松,您可以在此联系我们!
在你开始阅读之前,如果你是一个视频爱好者,请随意查看这个 YouTube 视频以获得这篇文章的缩略版本。
目录
- DS 面试为什么会问编码问题?
- 有可能进行编码面试的角色
- 什么时候会有编码面试?
- 不同类别的编码面试
- 如何准备?
- 如何评价你?
- 王牌编码面试技巧
- 最后的想法
为什么 DS 面试会问编码问题?
到底什么是编码面试?我们使用短语“编码面试”来指代任何涉及用除了像 SQL 这样的查询语言之外的任何编程语言进行编码的技术会议。在今天的市场上,你可以期待任何数据科学工作的编码面试。
为什么?编码是你 DS 职业生涯中必不可少的一部分。这里有三个原因:
- DS 是一门技术学科。数据科学的大部分工作涉及收集、清理数据,并将数据处理成可用的格式。因此,要完成工作,基本的编程能力是必须的。
- 许多现实世界的数据科学项目是高度协作的,涉及多个利益相关者。具备更强基本 CS 技能的数据科学家将会发现与工程师和其他合作伙伴密切合作更容易。
- 在许多公司,数据科学家负责运送生产代码,如数据管道和机器学习模型。对于这种类型的项目,强大的编程技能是必不可少的。
综上所述,强大的编码技能是在很多数据科学岗位上表现出色所必需的。如果你不能在编码面试中展示你拥有这些技能,你将不会得到这份工作。
有可能进行编码面试的角色
当然,不同的职位需要不同的编码水平。如果你有兴趣了解不同 DS 角色之间的区别,请查看这个 YouTube 视频。如果你正在寻找一个属于以下任何一类的数据科学家角色,那么遇到编码面试的机会非常高:
- 侧重于机器学习(ML)或建模的数据科学家角色:对于这些类型的角色,候选人需要独立工作或与工程师密切合作,以生产机器学习、统计或优化模型。这种角色虽然名为“数据科学家”,但更类似于“机器学习工程师”或“研究科学家”的角色。这类工作的几个例子是脸书的核心数据科学,Airbnb 和 Lyft 的数据科学家——算法,等等。
- 数据科学家是工程组织的一部分的公司:对于这样的职位,一般期望每个数据科学家都拥有足够的编程能力。Robinhood 的数据科学家职位就是这种角色的一个例子。
- 中小型科技公司的数据科学家角色:这类公司的环境往往是快节奏的,数据科学家可能身兼数职。特别是,他们需要展示全套技能来快速高效地完成工作。
相比之下,如果你面试的是一个强调产品分析的 DS 职位,那么遇到编码问题的可能性会小一些。这些职位的面试通常不会超出评估 SQL 熟练程度的范围,但一般的编程仍会不时被测试。不具备基本编码知识的候选人很容易在面试中措手不及,并可能在面试过程中无法前进。不要让那成为你!确保你有所准备。您可以从了解编码面试的内容开始准备。
什么时候期待编码面试?

照片由 Maranda Vandergriff 在 Unsplash 上拍摄
编码面试可以在技术电话筛选(TPS)期间、现场或两者同时进行。根据预期的编码熟练程度,在现场部分甚至可能有多轮编码面试。一般来说,在整个 DS 面试循环的至少一个阶段,你应该期望编码面试。
在 TPS 期间,编码面试的交付通常会通过在线集成开发环境(ide ),如 CoderPad、HackerRank 和 CodeSignal。在现场会议期间,可以使用在线 IDE 或白板。在当前的远程面试环境中,默认使用前者。
编码会议的长度从 45 分钟到 1 小时不等,通常包括一个或多个问题。语言的选择通常是灵活的,但大多数候选人会选择 Python,因为它简单。
不同类别的编码面试
根据我们采访数十家大中型公司的经验,如 Airbnb、亚马逊、脸书、Intuit、Lyft、Robinhood、Slack、Snapchat、Square、Stitch Fix、Twitter、Upstart 等,我们将编码问题分为以下四种类型。
基本数据结构
这种类型的问题旨在评估考生在计算机科学基础入门方面的熟练程度。这些基本主题包括但不限于:
- 数据结构:数组、哈希表/字典、堆、集合、堆栈/队列、字符串和树/二叉树。
- 算法:二分搜索法,递归,排序和动态规划。
一些额外的话题,如链表和图表(深度优先搜索或广度优先搜索)在这种类型的面试中不太可能出现。
通常情况下,会针对一个场景提出多个问题,从简单到困难。每个问题可能涵盖一个独特的数据结构或算法。这是一个经典问题的例子,它围绕着寻找一系列数字的中值:
- 第 1 部分:用任何方法求中位数。候选人可以使用内置的排序函数,并在排序后简单地返回中位数。
- 第 2 部分:面试官现在要求一个更优化的版本来寻找中间值。在这种设置下,常用算法的知识,比如 quickselect ,会派上用场。
- 第 3 部分:最后,问题变成了计算中位数的“流”版本,这意味着数据以在线方式出现,而不是作为固定的数字列表。在这种情况下,候选人可能会求助于堆的使用(稍微更具挑战性)。
这类问题也可能作为应用商业问题出现。对于这类问题,候选人需要为一个假设的应用问题编写一个解决方案,这个问题通常与公司的商业模式有关。这些问题在难度上属于容易到中等(基于 Leetcode 的分类)。这里的关键是在编码之前理解业务场景和确切的需求。
数学和统计学
除了编码能力之外,这些问题还需要本科水平的数学和统计学知识。一些最常见的概念包括:
- 模拟:蒙特卡罗模拟、加权抽样、模拟马尔可夫链等。
- 素数/整除:涉及自然数整除的计算,计算两个自然数最大公约数的欧几里德算法等。
一些常见问题包括:
- 使用模拟来估计圆周率的值。
- 枚举所有素数直到给定的自然数 n。
- 使用均匀随机数模拟多项式分布。
机器学习算法

这类问题包括从头开始编写一个基本的 ML 算法。除了一般的编码能力,面试官还将能够评估候选人应用的机器学习知识。要回答这些问题,您需要熟悉常见的机器学习模型系列。
下面列出了在编码面试中经常出现的最常见的模型族:
其他模型系列,如支持向量机、梯度推进树和朴素贝叶斯不太可能出现。你也不太可能被要求从头开始编写一个深度学习算法。
数据操作
这种类型的问题不像其他类型的问题那样常见。他们要求候选人在不使用 SQL 或任何数据分析库(如 pandas )的情况下进行数据处理和转换。相反,考生只允许使用自己选择的编程语言来解决问题。一些常见的例子包括:
- 将两个数据集表示为字典,并根据给定的键值将它们连接在一起。
- 给定一个表示 JSON blob 的字典,进行一些基本的解析来提取特定的条目。
- 编写一个类似于 R 的 tidyr 包中的“spread”或“gather”函数的函数,并使用数据集测试它。
- 计算 30 天的滚动利润。
- 解析事件日志并按日/月/年返回唯一字符串的计数。
知道自己可以预料到这四类题型,有助于自己系统的准备。在下一节中,我们将分享一些关于如何做到这一点的技巧。
怎么准备?

乍一看,这一系列问题可能会让人望而生畏,但不要气馁或不知所措!如果你很好地掌握了基本的 CS 知识和机器学习算法,并且你花时间准备(我们将在这一部分告诉你如何做),那么你将能够在编码面试中获胜。
为了准备不同类别的编码问题,我们推荐以下策略:
温习基础知识:
对于上面概述的四个主要问题主题中的每一个,从回顾基础开始。这些描述可以在各种在线资源和书籍中找到。具体来说:
- 数据结构(尽管通常以软件工程师为目标受众):Gayle Laakmann McDowell 的破解编码访谈和最好的 Python 书籍
- 机器学习:介绍由 Jerome H. Friedman、Robert Tibshirani 和 Trevor Hastie 制作的脸书机器学习视频系列和统计学习元素。
- 数学与统计:brilliant.org——脸书现场面试备考指南推荐资料之一。
对问题进行分类:
一旦你对基础知识比较熟悉了,就扩大你的回顾范围,包括更多的常见问题。你可以在 Leetcode 、 GeeksForGeeks 和 GlassDoor 上找到这些。你可以用一种有组织的方式保存问题陈述,最好是使用像概念或 Jupyter 笔记本这样的工具按主题分组。对于每个主题,练习许多简单的问题和一些中等的问题。花时间创建一个编码问题的分类集合,不仅对你当前的求职有好处,而且对将来的求职也有帮助。
比较多个解决方案:
依靠死记硬背不足以应付面试。为了获得更全面的理解,我们建议对同一问题提出多种解决方案,并比较不同方法的优缺点(例如运行时/存储复杂性)。
向他人解释:
为了加强理解,用简单的英语向非技术人员解释你的解决方案/方法。对常见问题方法的更高层次的理解通常比详细的实现更有价值,并且对于使现有知识适应新的和不熟悉的环境特别有帮助。
模拟面试:
与同事一起进行模拟面试,或者自己进行。可以使用在线编码平台,比如 Leetcode,在有限的时间窗口内解决真实的面试问题。
运用这些准备技巧,你不仅会带着更多的知识进入面试,而且会更有信心!
如何评价你?
在你的面试中,有 4 个主要的品质是你想要传达的。
逻辑推理:
面试官希望看到应聘者在提供的信息和最终答案之间建立逻辑联系。因此,在开始实际编码之前,您应该清楚地描述计算需要什么,以及您将如何编写代码来解决这个问题。
沟通:
沟通的有效性非常重要。在编码之前,清楚地传达你的思维过程。如果面试官在面试过程中的任何时候提问,你需要能够解释你的假设和选择的理由。
代码质量和最佳实践:
面试官还会评估你的整体代码质量。虽然 DS 面试中的标准期望值不会像软件工程面试中的那样高,但是候选人仍然应该关注几个方面:
- 代码是否可执行而没有任何语法错误。
- 干净简洁。
- 该解决方案是否在运行时/存储效率方面进行了优化。
- 一般编码最佳实践,例如模块化、边缘情况的处理、命名约定等。
熟练程度:
就像软件工程编码面试一样,对于 DS 编码面试来说,期待多部分问题,有时多个问题是合理的。换句话说,速度也很重要。能够在有限的时间内解决更多的问题是整体熟练程度的标志。
Ace 编码面试技巧

约书亚·厄尔在 Unsplash 上的照片
在面试之前,有必要和招聘人员澄清会问什么样的编码问题,以及大致的难度。许多数据科学面试不需要繁重的编程,但这并不意味着面试官不会期望你能轻松掌握基本的编程技能。总是问你的招聘人员会有什么期望。如果你对面试中可能出现的问题类型做出不正确的假设,你可能最终会准备不充分。
在面试中,使用这些技巧来有效地回答编码问题。
- 在深入编码之前:澄清问题及其潜在的假设。沟通是关键。一个在整个过程中需要一些帮助但沟通清晰的候选人可能比一个轻松通过问题的候选人更好。此外,在你开始实际实施之前,向面试官解释一下总体方法。
- 写代码的时候:从一个幼稚的蛮力解决方案开始,以后再优化。大声思考。说出你认为可行(或不可行)的方法。你可能很快就会意识到某样东西确实有效,或者它的一个改良版本有效。当你在某个特定的部分停留超过几分钟时,可以向面试官寻求适度的暗示。
- 编码完成后:如果没有提供测试用例,你要提出几个正常用例以及边缘用例。用一个输入示例大声介绍您的解决方案。这将有助于你发现错误,并消除面试官对你所做工作的任何困惑。
最后的想法
编码面试和其他技术面试一样,需要系统有效的准备。希望我们的文章能让你对 DS 相关职位的编码面试有所了解,以及如何准备。记住:提高你的编码技能不仅对你获得梦想中的工作非常有益,对你在工作中的出色表现也非常有益!
感谢阅读!
如果你喜欢这个帖子,想支持我…
- 订阅我的 YouTube 频道 !
- 跟我上 中 !
- 连接上Linkedin!
- 前往emmading.com/resources获取更多关于数据科学面试技巧和策略的免费资源!
贝叶斯统计终极指南

安妮·尼加德在 Unsplash 上拍摄的照片
像贝叶斯一样思考
你可能在统计课上听说过贝叶斯定理。基于条件概率的神奇公式开启了一种解释事件概率的新方法。在这篇文章中,我将讨论贝叶斯统计的基础知识,以及在统计推断方面 Frequentist 和贝叶斯之间的区别。此外,贝叶斯统计的一些应用。
什么是贝叶斯统计
贝叶斯统计是基于概率的贝叶斯解释的统计理论。要理解贝叶斯统计,首先需要理解条件概率和贝叶斯定理。
- 条件概率
条件概率基于一个事件已经发生的事实,测量另一个事件发生的概率。正如下面的公式所示,假设事件 B 发生,事件 A 发生,是事件 A 和 B 的联合概率与事件 B 发生的概率的除法。

条件概率
关于这个公式有两点需要注意。首先,不要被 P(A|B)和 P(AB)搞混了。前者是条件概率,后者是联合概率。即使我们观察到事件 A 和事件 B 以两种概率发生,事件发生的时间线是区分它们的关键。思考一个投掷两个公平骰子的例子。设事件 A 是第一个骰子是偶数,事件 B 是两个骰子之和是 6。联合概率是事件 A 和事件 B 同时发生的几率,除以所有情况。当投掷两个骰子时,有 36 (6*6)种结果,当事件 A 和事件 B 一起发生时,只有两种情况:我们投掷(2,4)或(4,2)。因此,联合概率 P(AB)是 2/36。条件概率 P(A|B)的计算方式不同。当 B 发生时,我们只有 3 种情况:(2,4),(3,3),(4,2)。在这三个结果中,有两个结果满足事件 A 的条件,在这种情况下,条件概率 P(A|B)是 2/3。如果用条件概率公式计算条件概率,需要知道 P(B)的概率,P(B)如上所述是 3/36。P(A|B)将是 2/36 除以 3/36,我们也得到 2/3。
第二,如果事件 A 和事件 B 是独立的,则条件概率 P(A|B)与 P(A)相同。这是因为事件 B 的发生不会为我们了解事件 A 带来任何有用的信息。当我们说事件 A 和事件 B 是独立的,这意味着事件 A 的发生不会影响事件 B,反之亦然。事件 A 和事件 B 的联合概率将等于 P(A)*P(B)。因此,两个独立事件的条件概率将是:

两个独立事件的条件概率
上面的公式表明,知道事件 B 发生对计算事件 A 发生的概率没有帮助。
2。链式法则和求和法则
根据条件概率,我们可以推导出两个事件的链规则:

链式法则
链式法则也适用于大量的事件。对于具有以下相关性的事件 X、Y、Z:

链式规则指定:

我们可以得出 N 个事件的联合概率如下:

除了链式法则,概率论中的另一个重要法则是求和法则,它通过整合联合概率来帮助推导出完整的概率:

求和规则
概率论的这两条规则是贝叶斯定理的基础,我将在下一节详细说明。
3。贝叶斯定理
离链式法则只有一步之遥,我们将得到贝叶斯定理:

贝叶斯定理
贝叶斯定理是贝叶斯统计的基础。它帮助贝叶斯以不同的方式解释统计推断。贝叶斯声称,随着更多的证据或信息变得可用,假设的概率可以更新。在统计推断过程中,我们试图使用我们拥有的数据来估计概率模型的参数。如果我们将 P(θ)视为我们试图从模型中估计的参数的概率,将 P(X)视为我们观察到的数据的概率,我们可以应用贝叶斯定理:

这里 P(θ|X)称为后验概率,是给定数据的观测参数θ的条件概率。另一方面,P(X|θ)被称为似然函数,在给定参数的情况下观察数据的概率。似然函数显示了参数对数据的解释程度。我们也称 P(θ)为先验概率,P(X)为证据。
频率主义者 vs 贝叶斯
不知道频率主义者和贝叶斯的区别,我们永远无法完全理解贝叶斯。在下表中,我总结了它们的主要区别。

常客 vs 贝叶斯
让我们举一个估计下雨概率 P(θ)的例子来更好地说明差异。常客对于不确定性是客观的。对他们来说,下雨的概率 P(θ)是固定的,先验知识或辅助信息不会帮助他们估计它。相反,他们有一些关于θ的假设,并持续记录长时间的天气状况(X: x1,x2…xn)来帮助他们学习 P(θ)。常客把任何一天的天气状况视为随机变量。通过估计似然函数 P(X|θ),即在给定下雨概率的情况下观察这些天天气状况的概率,他们可以使用 P 值或置信区间拒绝或接受他们的假设。或者,他们可以计算 argmax P(X|θ)相对于θ的值,以获得使观测数据 X 的似然性最大化的θ,这就是我们所说的最大似然估计(MLE)。对于像分类问题这样的机器学习问题,frequentist ists 首先选择一个模型,如逻辑回归,然后使用他们拥有的数据(X 和相应的标签 y)来使用 MLE 估计模型参数θs,最后使用训练的模型来预测新数据的标签。
另一方面,贝叶斯通过概率分布对不确定性建模。他们认为他们观察到的数据 X 是固定的,而θ是一个随机变量,并受先验信息的影响。因此,可以利用附加信息来估计概率 P(θ)。例如,不同月份下雨的概率是不同的,因此知道现在是几月将有助于估计下雨的可能性。他们使用贝叶斯定理作为 P(θ)来估计后验概率 P(θ|X)。对于分类问题,他们首先通过估计后验概率来训练模型:

然后应用求和规则用新数据 X_ts 进行标签预测 y_ts:

总之,频率主义者和贝叶斯在是否将参数θ视为随机变量的观点上分歧最大。贝叶斯认为参数是随机变量。他们根据数据和先验分布赋予不同的概率,即后验概率:

虽然常客认为他们应该将参数固定在一个值,但使用概率观点,我们可以将他们的心态写成如下:

然后他们进行实验收集数据,或者用观测数据 X 检验他们的假设θ是否为θ,或者用 MLE 求θ。
贝叶斯统计的应用
贝叶斯统计在进行推理时使用先验知识,并随着获取更多信息而更新后验信念。因此,它被用于机器学习和统计推断的各种应用中,给出可靠的结果。
- 线性回归正则化的贝叶斯解释:
线性回归模型是用于解决机器学习中的回归问题的简单模型。我们通常在线性模型中使用正则化来处理过拟合。正则化是在拟合模型时将参数的大小添加到成本函数中。因此,它迫使模型选择较少的特征或减少特征参数的大小,并减少过度拟合的机会,尤其是当有大量特征时。根据惩罚的形式,我们有 L1(拉索)和 L2(岭)正规化。L1 正则化将参数的绝对值添加到成本函数,而 L2 正则化添加参数的平方。我们可以用贝叶斯定理来解释正则化。从贝叶斯的角度来看,参数由以下因素决定:

当忽略先验分布,只最大化似然函数来估计β时,我们将得到正则线性回归模型。然而,当添加关于先验分布的假设时,我们将正则化添加到模型中。加上拉普拉斯分布的先验,我们得到 L1 正则化。而对于 L2 正则化,我们增加了β服从均值等于零的正态分布的假设。更多细节和数学证明,可以参考这篇文章。
2.潜在变量模型
潜变量也叫隐藏变量,是我们不直接从数据中观察到的变量。然而,我们认为数据中存在一些隐藏的结构,可以提取出来用于更好的预测。

潜在变量 t,数据 X
条件概率和贝叶斯定理是构造隐变量模型的基础。对于被设置成聚类成 N 个组的数据,我们可以将似然函数写成如下:

我们可以使用潜在变量来处理数据中的缺失值,并且我们可以构建潜在变量模型来进行聚类,例如 GMM 用于客户聚类,或者 LDA 用于文本主题建模。
3 。在线学习
由于贝叶斯统计推断使用新的证据来不断更新后验概率,因此它对于使用以下公式的在线学习也非常有用:

在线学习
随着新数据 X_t 的到来,后验概率 P(θ)也从 P_t-1(θ)更新到 P_t(θ)。
贝叶斯统计不仅仅是关于贝叶斯定理或为不同条件概率指定的花哨术语,更重要的是,贝叶斯思维模式,我们可以使用先验知识进行初步猜测,并不断用新信息更新推论。希望这篇文章能帮助你更好地理解这种心态以及它与常客的区别。
感谢您的阅读!这是我所有博客帖子的列表。如果你感兴趣的话,可以去看看!
https://zzhu17.medium.com/my-blog-posts-gallery-ac6e01fe5cc3 https://zzhu17.medium.com/membership
聚类算法和主题建模终极指南

第 2 部分,LDA 模型的初学者指南
在我之前的帖子中,我介绍了聚类算法并详细讨论了 K-Means 算法,作为 主题建模 系列的第一部分:
第 2 部分:LDA 初学者指南(本文)
第 3 部分:使用 K-Means 和 LDA 进行主题建模(即将推出)
我们不能在不介绍 LDA 模型的情况下讨论主题建模。LDA 是潜在狄利克雷分配的简称。它是一个模型,主要用于理解文本数据集合中的潜在主题集,在协作过滤、基于内容的图像检索和生物信息学等方面也有其他应用。在本文中,我将讨论主题建模和 LDA 模型设置的更多细节。
主题建模和术语
主题建模是在一组文本数据上寻找潜在的 主题 的分析。研究主题有助于研究者理解文本中隐藏的语义结构。了解主题对于分类现有文本数据和生成新数据都很有用。在进一步详细讨论之前,我们需要指定一些在文本分析中使用的常规术语。根据 Blei、ng 和 Jordan 2003 (参考文献中的详细引用),术语表述如下:
- 单词 是文本数据的基本单位,从词汇集{1,…V}中索引;
- 一个 文档 是 N 个字的序列,定义为 w = (w_1,w_2,…w_N),其中 w_N 是这个文档中的第 N 个字;
- 一个 语料库 是 M 个文档的集合,定义为 D = ( w_ 1、 w_ 2、…w _M);
- 一个 题目 是分布词。LDA 模型将语料库中的每个文档视为主题的混合。
LDA 模型设置
主题建模本质上是一个文本聚类问题。使用 LDA 模型,目标是通过研究语料库来估计两组分布:
- 每个主题中单词的分布
- 语料库中的主题分布
LDA 是一个三层的分层贝叶斯模型。与其深入研究数学细节,不如用一个例子来演示这个模型。
LDA 模型为语料库中的每个文档生成主题分布。例如,文档可以分布在两个主题上:40%在主题“水果”上,60%在主题“蔬菜”上:

作者图片
每个主题都是词汇集{“甜的”、“胡萝卜”、“苹果”、“绿色”}中所有单词的分布。看题目,我们看到一些概率比较高的词。例如,直觉上,单词“绿色”在主题“蔬菜”中出现的概率比在主题“水果”中出现的概率高

作者图片
我们需要定义两个潜在变量https://en.wikipedia.org/wiki/Latent_variable#:~:text=In statistics%2C latent variables (from,are observed (directly measured.),它们有助于从语料库到文档再到单词的文本生成过程。潜在变量是我们不能从数据中直接观察到的变量。然而,它揭示了数据中隐藏的结构,并且有利于建立概率模型。第一个潜在变量是θ,即主题在每个文档中的分布(40%“水果”,60%“蔬菜”)。第二个潜在变量是 Z (Z ∈{1,2..T}),呈现每个词的主题。我们可以在下图中看到文本生成过程:

LDA 中的文本生成。作者图片
对于每个文档 d,都有一个主题分布θ_d。对于文档 d (w_d i)中的每个单词 I,它是基于主题分布θ_d、该单词 di 的主题 Z 以及主题 Z_di 上的单词分布来生成的。假设文档 d 中的第一个单词是“green”,它是通过首先指定一个主题分布生成的:60%“水果”,40%“蔬菜”(θ_d)。然后对于第一个单词,我们对主题“蔬菜”(Z_d1)进行采样。在主题“蔬菜”中,我们从主题分布中抽取单词“绿色”(w_d1)。
在数学上,该过程可以被指定为下面的贝叶斯方程:

结合潜在变量,可以在下面的图表和步骤中查看层次结构,以便更好地理解:

作者图片
通过定义 P(θ_d),P(Z_dn|θ_d),P(w_dn|z_dn)的概率分布,我们可以计算出联合分布 P(w,Z,θ),这是我们所拥有的观察语料库的概率。
LDA 中的狄利克雷来自于θ_d 服从狄利克雷分布。给定训练模型的语料库,我们可以使用 EM 算法进行参数估计,或者使用 MCMC 进行完全贝叶斯推理。本文将不涉及该模型的数学细节。如果有兴趣,可以参考 2003 年 Blei,Ng,Jordan 的论文。而且,gensim是在主题建模中应用 LDA 的常用 Python 库。参考这篇文档了解更多细节,我也会在下一篇讨论应用时展示。
这都是为了这篇文章。在本系列的最后一篇文章中,我将比较和讨论 K-Means 和 LDA 在主题建模中的区别,并展示一个使用 Python 库在主题建模中应用这两种算法的例子。
感谢您的阅读!这是我所有博客帖子的列表。如果你感兴趣,可以去看看。
****https://zzhu17.medium.com/my-blog-posts-gallery-ac6e01fe5cc3 https://zzhu17.medium.com/membership
参考
[1]大卫·布雷、安德鲁·吴和迈克尔·乔丹。2003.潜在狄利克雷分配。j .马赫。学习。第 3 号决议,无效(2003 年 1 月 3 日),第 993-1022 号决议。****
分类模型反事实解释终极指南

作者图片
最人性化的模型解释方法
假设保罗在 ABC 银行申请贷款。他收到一封来自银行的邮件,表示非常遗憾地通知他,他的贷款申请已被拒绝。被拒!
在被击得粉碎了一段时间后,保罗可能很好奇到底发生了什么。所以他去银行询问贷款申请的决策人。他被介绍给简,简负责贷款申请的决策。保罗问简为什么他的申请被拒绝了。她告诉他,他的要价太高,他的工资低于最低工资,等等。
但是,他问她,他能做些什么让他的贷款申请获得批准。她告诉他,他的要求金额需要减少这么多,增加他的工资这么多,一定年后回来,等等。
但是加油!保罗不能突然改变他的工资!他也不能为贷款等上几年。因此,他问 Jane,要使他的贷款获得批准,他的申请中最小的改动是什么。
如果简被一个人工智能模型取代,这个模型会给保罗一个叫做的反事实解释。
反事实解释提供了将实例的输出改变为预定/期望输出所需的输入特征值的最小变化
然而,就像 Paul 的情况一样,并不是所有的特性都可以改变。因此,对反事实解释的要求或约束是,它们尽可能少地干扰特征,以获得想要的输出。
直觉
有多种方法来确定由多名研究人员提出的反事实解释。如果你有兴趣了解它们之间的区别,你可以看看克里斯托弗·莫尔纳尔的这本书。
然而,实现这一点的简单方法如下:
- 考虑你需要反事实解释的例子和期望的结果
- 确定期望结果和当前结果之间的决策界限
- 找出实例和决策边界之间的最小距离,约束条件是需要更改的坐标(特征值)的最小数量
警告:反事实解释只适用于监督分类任务。它不适合回归或无人监督的任务。知道这一点很重要
说明
为了说明反事实解释的使用,我将使用一个来自 alibi 库的示例。该示例解释了在波士顿房价数据集上的浅层神经网络模型。插图的代码可以在 alibi 文档页面上找到。
因为波士顿房屋数据集存在于 sklearn 库中,所以数据集直接从 sklearn 加载。
住房数据集是一个回归数据集,反事实对其无效。因此,我们需要将其转换为分类类型的数据集。我们选择目标值的中位数,也就是房价。价格低于中值的任何数据点(房屋集合中的房屋)被标记为 0,高于中值的被标记为 1。
这里使用的反事实解释的变体是由原型引导的。在这里,原型是反事实的例子(数据点)。它们是通过构建 k-d 树或编码器来构建的,因此可以快速构建反事实的解释。它是基于这篇论文构建的,你可以参考这篇论文来了解算法如何工作的更多细节。
**import** **tensorflow** **as** **tf**
**from** **tensorflow.keras.layers** **import** Dense, Input
**from** **tensorflow.keras.models** **import** Model, load_model
**from** **tensorflow.keras.utils** **import** to_categorical
**import** **matplotlib**
%**matplotlib** inline
**import** **matplotlib.pyplot** **as** **plt**
**import** **numpy** **as** **np**
**import** **os**
**from** **sklearn.datasets** **import** load_boston
**from** **alibi.explainers** **import** CounterFactualProto
模型
为此图构建了一个自定义神经网络模型:
np.random.seed(42)
tf.random.set_seed(42)**def** nn_model():
x_in = Input(shape=(12,))
x = Dense(40, activation='relu')(x_in)
x = Dense(40, activation='relu')(x)
x_out = Dense(2, activation='softmax')(x)
nn = Model(inputs=x_in, outputs=x_out)
nn.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
**return** nnnn = nn_model()
nn.summary()
nn.fit(x_train, y_train, batch_size=64, epochs=500, verbose=0)

模型摘要
说明
现在我们有了模型,我们想了解一个特定的结果。选择一个特定的测试实例:
X = x_test[1].reshape((1,) + x_test[1].shape)
shape = X.shape
这个数据点的原始标签是 0,表示这个房子的价格低于中间价。现在让我们在它上面运行反事实(反事实原型称之为原型反事实解释)。
*# initialize explainer, fit and generate counterfactual*
cf = CounterFactualProto(nn, shape, use_kdtree=**True**, theta=10., max_iterations=1000,
feature_range=(x_train.min(axis=0), x_train.max(axis=0)),
c_init=1., c_steps=10)
cf.fit(x_train)
explanation = cf.explain(X)
让我们打印出原始的和解释的结果(两者应该是不同的或相互对比的)。
print(f'Original prediction: **{**explanation.orig_class**}**')
print('Counterfactual prediction: **{}**'.format(explanation.cf['class']))
我们可以确定在原始特性集和解释之间有多少值发生了变化:
orig = X * sigma + mu
counterfactual = explanation.cf['X'] * sigma + mu
delta = counterfactual - orig
**for** i, f **in** enumerate(feature_names):
**if** np.abs(delta[0][i]) > 1e-4:
print('**{}**: **{}**'.format(f, delta[0][i])) **Output:** AGE: -6.526239960695747
LSTAT: -4.799340540220259
所以这里说,要想价格高于中值,这栋房子的房龄需要比现在少 6.5 年,LSTAT 值要比现在少 4.8 个单位。
结论
反事实是向人类解释模型行为的最自然的方式。但它有一定的局限性,其中最重要的一点是它只适用于分类问题。
另一个问题是,有时它提供的解释实际上不能用来推翻决定。比如年龄是不能逆转的。所以我们试图通过强加年龄不可改变来对抗事实。
请注意,对于一个数据点,可能有多种反事实的解释,因为可以有多种方式达到决策边界。我们可以选择一个考虑到我们的业务约束或任何其他实际约束的方法。
话虽如此,它却是你 XAI 箭囊中的一支强有力的箭!
数据科学家破解产品案例访谈的终极指南(第 1 部分)
数据科学面试
数据科学家在产品感觉访谈中胜出的度量框架

正如彼得·德鲁克曾经说过的:“如果你不能衡量它,你就不能改进它。”事实上,数据科学家(DS)最关键的技能是定义衡量产品成功的正确指标的能力。正因为如此,数据科学家角色的业务案例面试(也称为产品意识或指标面试)受到了极大的重视,因为公司希望确定具有强烈产品意识并能够帮助利益相关者做出基于数据的决策的候选人。
许多人发现很难准备和破解商业案例面试。有几个原因:
- 他们刚从学校毕业,或者以前在非技术行业工作过,没有使用面向客户的产品的经验。
- 他们对处理不明确的问题感到不安。
- 不像其他技术学科如编码、统计、机器学习等。,可以依靠的备考资源就少了。
- 他们缺乏对公司商业模式的详细了解。
事实上,即使对于相对经验丰富的数据科学家来说,在处理具有挑战性的业务案例时,也很容易措手不及。在本帖中,我们总结了 DS 面试中最常遇到的业务案例类别(重点是度量框架),并提供了有效准备的技巧。如果您认为我们能够以任何方式让您的旅程变得更轻松,请随时联系我们这里的!
目录
2.指标框架
3.结论
商业案例面试基础
什么时候问?
在数据科学面试中,业务案例被问到的程度因角色而异。自然地,产品分析数据科学家的职位对这类会议有着特别高的吸引力。强调建模/机器学习的角色也包括业务案例,但可能会将它们与技术深度结合起来。
无论角色的重点/路线如何,业务案例问题几乎总是在技术电话筛选(TPS)和现场面试中被问到。
面试官在找什么?
因为商业案例通常是开放式的,所以没有必要(也不可能)在面试中解决每个方面的问题(事实上,在大多数情况下,没有唯一正确的答案)。然而,面试官确实希望有几个代表好答案的品质:
- 结构:一个好的答案应该有一个系统的解决问题的方法。缺乏结构或听起来随意的答案将被视为危险信号。
- 全面性:该解决方案涵盖了问题的所有重要方面。没有必要(也不可能)涵盖所有方面,但应该解决最相关的方面。
- 可行性:解决方案应该足够实用,这样才能切实可行。创意是好的,但并不是所有新颖的想法都会被欣赏。
一些较大的科技公司(如脸书、LinkedIn 和 Twitter)也可能会评估候选人是否对他们的产品有基本的熟悉,但大多数公司没有这样的要求。
此外,商业案例面试的评估标准可能因面试者而异。具体来说,根据面试官是个人贡献者(IC)、经理还是跨职能合作伙伴,会有不同的期望。
- 数据科学家(ICs) :通常会更加强调技术专长,比如如何选择正确的指标、假设检验的技术细节,以及处理实验中的陷阱。
- 数据科学经理:通常会评估候选人推动决策过程和进行有效口头和书面沟通的能力。
- 产品经理:通常重视从实践和战略的角度思考大局的能力,包括如何改善开放式产品和业务问题。
产品开发基础

在更深入地探讨商业案例面试细节之前,我们对产品开发过程做一些简短的评论。在这一过程中,数据科学家在决策过程中发挥着关键作用,同时还有工程师、产品经理、设计师、用户体验研究员等利益相关者。正因为如此,所有商业案例访谈都将围绕这些产品开发阶段中的一个或多个进行。涵盖多个阶段的端到端讨论也很常见。产品开发生命周期可以总结如下:
第一阶段:提出最初的产品想法。
第二阶段:选择想法:
- 定量分析,选择投入资源的点子集,通常称为机会评估。
第三阶段:实验设计:
- 涉及选择成功和护栏指标、运行健全性检查、选择随机化单元等。
- 当不可能进行 A/B 测试时,候选人需要考虑替代方案。
阶段 4:做出发布决定:
- 根据实验结果做出科学决策。
- 诊断问题和评估权衡。
在整个产品开发生命周期中,使用适当的指标至关重要,对于数据科学家来说,指标的确是业务案例访谈中最重要的组成部分。我们将在下一节更详细地阐述度量标准。
度量框架
在大多数公司,数据科学家的业务案例面试问题都是根据公司面临的现实问题改编的。在本节中,我们将概述指标的分类以及几种不同的指标框架。
度量分类
成功指标(有时称为“北极星指标”、“主要指标”或“OKR 指标”)用于衡量产品的成功或健康程度。常用的成功指标包括:日/月活跃用户、预订/购买、收入、点击率、转化率等。
护栏指标测量不应因追求新产品或新功能而降低的核心数量。示例包括:跳出率、取消/退订率、等待时间等。其他核心产品团队的成功度量有时也可以作为护栏度量。
好的指标是衡量企业成功的关键。我们通过以下 3 个特征总结了良好指标的品质:
- 简单:容易理解和计算,人们应该能够很容易地记住和讨论。
- 明确:定义明确,解释没有歧义。
- 可操作的:该指标可以通过改进产品来改变,但不容易作弊(让你觉得你正在取得成果,尽管它并没有提供对实际业务健康或增长的洞察)。
尽管公司和团队因地而异,但有几个“度量框架”涵盖了绝大多数业务案例。我们讨论了两个通用框架,然后是特定领域框架。
通用漏斗指标

罗伯特·科尔特斯在 Unsplash 上拍摄的照片
在高层次上,漏斗指标框架指的是跟踪产品各个部分的“用户旅程”的任何指标系列。正如术语“漏斗”所暗示的,描述旅程中特定步骤的每个指标都是对之前步骤的细化(通过漏斗,客户数量变得越来越少),例如:
AARRR 增长指标框架(详见下文增长指标一节):被激活的用户必须是已经获得的(通过某种渠道或有机获得);产生收入的用户必须先前已经被激活。
“转化漏斗”:对于科技公司来说,通常有一个贯穿产品的标准“转化路径”,通过以下基本指标获得:
- 网页访问者的数量;
- 已登录用户的数量;
- 点击登录页面特定部分的用户数量;
- 访问结账页面的用户数;
- 购买的用户数量。
在 B2B 环境中,其他相关指标可能包括:
- 网页访问者的数量(线索);
- 请求免费试用的潜在顾客数量;
- 销售团队主动联系的销售线索数量;
- 进行经常性购买的付费客户(每个客户都是一家公司/企业)的数量。
漏斗指标框架尤其受到商业案例面试官的青睐,因为它们允许面试官深入探究特定的应用环境,并且每个候选人的答案都可以轻松产生大量的后续问题。
投入产出指标框架
投入产出指标框架围绕两个关键概念:
- 输入/驱动指标:跟踪用于实现结果的活动/资源的指标;
- 产出指标:展示计划成果的指标。
虽然投入产出指标框架被公司普遍采用,但不太可能遇到明确指出该框架名称的面试问题。然而,使用这个框架来制定商业案例的答案可能是非常有利的,因为它为一个潜在的无组织的思维过程提供了更好的结构。例如,在搜索和推荐的设置中:
- 输入度量可以包括用户参与度的各种度量,例如点击率(CTR)以及在特定类型的内容上花费的平均时间;
- 输出度量可以包括每个用户在平台上花费的平均时间、每个用户的会话、每个用户的成功会话以及广告收入。
在欺诈检测的背景下:
- 输入指标可能包括欺诈规则和模型的真/假阳性率,以及运营手册审查量和客户交易金额。
- 输出指标可能包括欺诈损失量、防止的损失、收入等。
特定于领域的指标
在本节中,我们将介绍一些特定于领域的指标,让您更好地理解真实世界的应用程序和一些权衡。
增长指标(AARRR)

成长团队负责扩大产品的用户群,并保持当前用户的参与度。一个众所周知的度量框架是 AARRR。它由 5 部分组成:
- 获取:让客户注册一个网站或产品,这需要提高产品认知度(通常被称为“漏斗顶端”)。
- 激活:让顾客对产品有基本的熟悉,并欣赏产品的基本价值。
- 保留:让客户定期回到产品上来;在一段预定时间内没有(或很少)活动的客户被称为被搅动的(准确的定义取决于业务环境,在不同的团队/公司之间差异很大)。
- 推荐:让顾客与他人分享产品,从而进一步扩大用户群。
- 收入:让客户采用一个或多个为公司带来收入的付费功能;也称为货币化。
如果面对与此框架相关的业务案例,有几件事要记住:
- 收购和收入之间的权衡:公司应该如何在收入最大化和获得新客户之间取得最佳平衡(后者总是可以通过昂贵的活动来实现,例如为新用户提供大折扣/礼物等。)?
- 不同级别的参与度:通常,一个公司会有多层用户参与度指标,这些指标反映了不同级别的产品参与度(最低一层是“激活用户”)。
- 短期内很难估算出客户保持率和客户流失率:客户保持率和客户流失率的定义因公司而异,但通常需要数周甚至数月的持续观察。此外,被搅动的客户有可能恢复(通常称为复活),因此在回答任何问题(例如,第一次搅动、最近一次搅动、曾经搅动等)之前,澄清精确的指标定义和假设非常重要。).
- 衡量推荐计划增量的困难:当推出新的推荐计划时,通常会引入网络效应,因为任何新客户都可能同时成为推荐人和推荐人。
- B2B 和 B2C 设置之间的差异:在 B2B 公司,获取/激活/保留等。通常在“公司/企业”级别定义,因为客户就是公司/企业。也可能有类似的粒度用户级指标。
- 国际扩张的挑战:这些挑战包括与本地化相关的额外成本(适当调整产品以更好地适应特定市场的客户)、监管/合规要求、了解竞争格局等。
平台指标(客户支持、信任和安全、支付、基础设施、运营等。)
虽然增长是业务的核心,但“平台团队”提供运营支持(与客户帮助中心、支付流程、欺诈检测、基础设施等相关)。)同样重要,尤其是在公司扩大规模的时候。事实上,有效的平台支持通常是增长的间接驱动力。平台团队的指标也和成长团队一样丰富,例如:
- 运营/基础设施成本:这里一个常见的例子是了解帮助中心票证/升级的平均成本,这是在面向客户的公司中跟踪多种产品变更的一个基本数量。类似地,对各种基础设施成本的精细理解允许人们有效地评估扩展的权衡。
- 成功/失败率:在支付上下文中,这可以指所有交易尝试中成功/失败的交易尝试的百分比。这些指标与转化率密切相关,尤其是在货币化背景下(因为支付通常是货币化漏斗的最后一步)。
- 假阳性/假阴性/真阳性率(用于欺诈检测):当使用规则和模型来检测不良用户行为时,总是会有与错误预测相关的成本,例如与假阳性相关的良好客户 LTV 的损失,以及与假阴性相关的欺诈损失。
- 欺诈损失指标:随着公司规模的扩大,欺诈损失通常来自“天生的坏用户”(滥用产品获取不正当经济利益的用户)和第三方欺诈(接管好用户账户的用户)。欺诈用户的比例通常很小,但仍然会导致巨大的经济损失。
- 供应商成本:平台团队经常与提供相关服务的外部供应商合作(例如,与 Stripe 合作进行支付处理);这些成本需要与其他核心业务指标仔细权衡。
其他业务领域
其他一些流行的商业领域包括金融、定价、物流和供应链、营销和销售以及搜索排名。每一种都有自己常用的度量框架来跟踪业务绩效和相关的权衡。我们建议好奇的读者通过阅读和与在这些领域工作的数据科学家互动,自己进一步探索。
结论
这就是我们的数据科学家商业案例访谈指南的第一部分。
第二部分此处 !
感谢阅读!
如果你喜欢这个帖子,想支持我…
- 订阅我的 YouTube 频道 !
- 跟我上 中 !
- 连接上Linkedin!
- 前往emmading.com/resources获取更多关于数据科学面试技巧和策略的免费资源!
我们还推荐以下相关文章:
</7-a-b-testing-questions-and-answers-in-data-science-interviews-eee6428a8b63>
数据科学家破解产品案例访谈的终极指南(第二部分)
数据科学面试
4 种产品感问题和框架
这是数据科学家破解商业案例访谈的第 2 部分!参见本文的第 1 部分:
如果你更喜欢视频,可以看看这个 YouTube 视频和这个播放列表,前者是这篇文章的缩略版本,后者是来自脸书、LinkedIn 和 Lyft 的真实商业案例面试问题的样本答案。
目录
4 种商业案例问题
在本节中,我们将总结 4 个最常被问到的业务案例问题类别:
- 诊断问题;
- 衡量成功;
- 发射与否;
- 改进产品。
我们还将提供处理这些类别的框架。大多数度量问题本质上都是开放式的,并且有许多解决策略。这些框架的目标是作为一个完整反应的心理清单。这些框架足够通用,你永远不需要逐字逐句地背诵它们,或者在没有额外创造性思维的情况下盲目地跟随它们。
不管商业案例面试的重点是什么,我们总是建议从澄清问题开始以总结你的方法结束。澄清问题对于确认潜在产品的功能和目标尤为重要。没有他们的参与对面试官来说可能是一个危险信号;想象一下,如果你花了 5 分钟来回答这个问题,然后意识到你对产品的理解是错误的,那该有多尴尬。值得询问的问题可能包括但不限于:
- 一个特性/产品有什么作用?
- 特性/产品是如何使用的?
- 特性/产品是为谁打造的?
诊断问题

第一个问题类别是诊断问题。事实上,假设一个重要的业务指标正在走向负面,利益相关者要求您找出根本原因。以下是一些问题示例:
- 脸书用户群的创建量下降了 20%。这是怎么回事?
- 如何调查产品使用量下降 10%?
- 我们有一个仪表板跟踪我们的指标,平均预计到达时间(ETA)增加了 3 分钟。你会如何调查这个问题?
要成功通过面试,最关键的因素是让面试官相信你可以勾勒出一个系统化的方法。的确,有很多方面可以谈论,但是向面试官抛出随意的想法是不被鼓励的。这里有 6 个有用的步骤可以采取,但不是每个问题都需要全部 6 个步骤。
- 阐明指标的定义。例如,对于上述 ETA 问题,您可以澄清开始时间和结束时间是如何定义的。对于与参与度相关的问题,您可以澄清并提出衡量参与度的方法:是通过创建帖子的数量、对帖子的回复或对帖子的反应,还是通过共享帖子?或者,也许是人们花在帖子上的时间?
- 时间方面的变化。指标是突然变化还是逐渐变化?一旦回答了这个问题,您就可以讨论这是由于内部因素,如损坏的数据源或生产代码中的错误,还是由于外部因素,如季节性、行业趋势、竞争对手的营销活动,或者在指标发生变化的同时发生的特殊事件,如自然灾害或政治不稳定。
- 其他产品或功能是否有同样的变化。您可以调查其他相关产品的指标是否经历了同样的变化。此外,你可以问面试官是否对整个产品线进行了调整。
- 根据人口统计和行为特征(如用户年龄组、地区、语言和平台)对用户进行细分。例如,这种下降是发生在一个孤立的地理区域吗?这种变化是否只涉及一个平台,即 iOS、Android 或 web 用户?
- 分解指标以进行更深入的分析。你可以讨论哪个特定的用户组最先经历了这种变化。例如,DAU =现有用户+新用户+复活用户-搅动用户。调查哪个用户群影响最大有助于缩小问题范围。
- 总结你的方法向面试官展示你有一个清晰而有条理的方法来分析问题。根据面试官的反馈,你可以进一步集思广益,找出你所发现的根本原因的潜在解决方法。
衡量成功
第二个问题类别是衡量成功。特别是,您需要衡量产品或功能的成功或健康程度。以下是属于这一类的一些问题。
- 你如何衡量脸书名人应用“提及”的健康程度?脸书如何确定是否值得保留这一特征?
- Instagram 正在推出一项新功能。你怎么知道它做得好不好?
此问题类别的更抽象版本可能包括:
- 如何衡量一个在线论坛的成功对话?
- 如何衡量一个拼车应用的司机的幸福感?
本质上,这些问题旨在评估候选人定义成功指标的能力。要回答这类问题,我们建议提供不超过 3 个指标,包括 2 个成功指标(衡量或表明产品的有效性和成功)和一个护栏指标(不应因追求新产品或新功能而降低)。
在本帖的第 1 部分中,我们总结了好的度量标准的一些特征。这里,我们强调一个额外的关键特征:好的度量标准还应该适合环境。事实上,一个看似合理的指标在不同的环境中可能没有意义。例如,考虑测量新的工作推荐算法的成功的设置。潜在的目标是提高用户对推荐结果的满意度。在这种情况下,DAU 将不是一个合适的成功指标。更有意义的是使用对上下文自然的度量,比如结果的点击率或者申请工作的用户的百分比。护栏度量可以是返回结果所用的平均时间,因为好的算法不仅应该返回好的结果,还应该足够快地生成这些结果。
发射与否

第三个问题类别是发射与否。你会被问到如何测试一个产品创意,或者是否要推出一个产品/功能。一些示例问题包括:
- 你会如何设置一个实验来理解 Instagram 故事中的一个特征变化?
- 如果某个特定人群的参与度下降,而其他人的参与度上升,你会如何决定推出一个功能或不推出?
- 如果一个产品经理说他想让新闻提要中的广告数量翻倍,你如何判断这是不是一个好主意?
一般来说,这个问题类别比前两个类型更具挑战性,因为它需要关于 A/B 测试的深入知识。作为补充阅读,这里有一篇很棒的博文,涵盖了关于 A/B 测试的几个常见问题和答案。
类似于衡量成功类别,您应该首先阐明产品的目标,并提出衡量成功的标准。然后,你应该提出一个推断因果影响的实验设计,确保包括以下讨论点:
- 对照组和治疗组的定义(有时,多个治疗组可能有意义)。
- 随机化单元(例如用户?访客?如果是用户级实验,什么类型的用户?回想一下,用户可以扮演多个角色,尤其是在多方在线平台中。),以及实验作业的时间。有时,应考虑触发条件以最小化稀释(例如,仅当用户到达网站的特定页面时分配用户)。
- 实验运行时间:通常由历史数据的功效计算决定。特定的计算将取决于历史基线、您想要测量的效果大小、潜在目标指标的功效和可变性。如果基础目标度量特别嘈杂,则可能需要更长的运行时间。如果潜在的目标指标滞后,可能需要在初始启动后几周重新检查实验结果,特别是对于后来分配的群组。
- 常见的陷阱和潜在的修正,比如新奇的效果、窥视(特别是当涉众对尽早发布产品过于兴奋的时候)、多重测试(特别是当有许多度量标准或许多感兴趣的部分的时候)、不同组之间的潜在交互(什么是可选择的实验设计?),等等。
- 长期监控:可以考虑抵制小组,它既可以测量单个实验的长期效果,也可以测量几个实验的组合产品变化的影响。
为了提供一个完整的答案,我们总是鼓励您根据实验结果提出一个发射建议,尽管该建议可能是双向的(是或否)。将结果与初始目标和业务影响联系起来。推荐发布的最佳场景是:
- 一个或多个成功指标在统计上和实际上都有显著增加;
- 护栏指标没有变化。
然而,这在实践中并不经常发生。当看到相互矛盾的结果时,面试官可能会询问你的方法。例如,考虑增加 DAU 和增加跳出率的设置。如果可能的话,尝试将这些变化与一个单一的业务指标联系起来,比如收入(DAU 0.1%的增长如何转化为收入?考虑到各种成本的潜在增加,推出这种产品是否值得?).此外,评论短期和长期影响之间的权衡。事实上,即使跳出率有所增加,产品发布也可能为平台带来更多用户,从长远来看,利大于弊。
改进产品
最后一个问题类别是改进一个产品。特别是,你会被问到如何改进一个产品/功能,或者如何将一个业务指标转向积极的方向。这类问题比前几类问题更开放,通常需要更高级的产品知识。识别产品机会的能力通常是提供一个好答案所必需的。一些示例问题包括:
- 你会在 Twitter 应用程序中改变什么?你如何测试提议的改变是否有效?
- 如何改进脸书上的“你在想什么”功能?
- 如何在在线平台上创建一个减少欺诈的业务规则?
如果你对这类问题感到茫然,这段视频包含了对一个样本问题的详细回答。总的来说,为了提供一个信息丰富且有条理的答案,我们推荐 5 个关键步骤:
****第一步:明确目标,缩小改进范围。如果这个问题要求你改进一个具有多种功能的产品,那么你就有必要澄清应该关注哪个功能。
第二步 : 解释你识别产品机会的方法,并集体讨论一些想法。提出改进想法的方法有很多,这里我们总结了 3 种常用的方法:
- 减少当前用户体验中的摩擦:分析“用户旅程”,关注用户已经在执行但可以进一步简化的操作。例如,如果他们需要几个步骤来完成结账过程,那么简化流程可能会导致更多的客户在网站上购物。
- 根据用户的行为对其进行细分,并确定不同群体的关键需求。显然,临时用户的需求可能与频繁用户的需求不同。基于不活跃用户的需求,想办法把他们变成活跃用户。
- 确定与目标指标相关的变量。建立一个机器学习模型来预测目标指标,并提出一个可以移动该指标的后续行动。例如,假设目标是设计一个规则来减少在线平台上的欺诈损失。对于被标记为欺诈者的用户,后续措施可能是限制他们或提示他们进行额外验证。一些关键步骤可以包括:定义对于用户或行为来说欺诈意味着什么(例如,定义正面标签),提出预测欺诈行为的特征,离线评估规则或模型(使用历史数据和关键指标,例如精度和召回),以及设计用于测量实时性能的 A/B 测试(通常针对另一个基线规则/模型)。对于这种类型的商业案例,还需要全面评估减少欺诈和对合法用户的影响之间的权衡。
第三步 : 优先排序。根据你提出的想法,你会优先考虑哪一个,为什么?
****第四步:定义 1 到 2 个成功标准来评估创意的成功。
****第五步:总结整体方法。
如何准备商业案例面试?

通过阅读和吸收这篇文章中的内容,你已经做好了面试准备!除此之外,我们还推荐了 4 个额外的行动项目:
行动项目 1 :收集一大堆样题,将它们分成不同的主题。你很快就会发现,绝大多数问题都属于上述 4 个类别!
行动事项 2 : 制定自己的框架和答案。这可以通过阅读、思考和与其他数据科学家交流来实现。此外,我们推荐一些常规资源:
- 脸书、Lyft、LinkedIn 的真实面试问答(播放列表)。
- StellarPeers 包括对许多案例问题的深入回答。
- 值得信赖的在线控制实验是一本关于 A/B 测试的基础知识以及在现实中运行 A/B 测试的陷阱和解决方案的书。
- 解码并征服包含产品管理面试问题的示例答案。
行动 3 :大声说出解决方案。准备样题答案时,生成两组答案可能会有所帮助:分别是长答案和短答案。在电话屏幕上,简短的版本可能更适合传递简单而快速的见解。在现场面试中,更多的时间可以花在冗长的回答上。
行动项目 4 :研究公司并了解其产品。尽管大多数公司并不要求应聘者非常熟悉他们的产品,但了解产品会导致面试中更深入、最终更好的对话。
赢得商业案例面试的秘诀
最后,我们想分享一些让你在商业案例面试中胜出的技巧:
- ****(第二次!)在开始回答之前,始终要澄清问题以确保您完全理解了高层次目标。如果面试官拒绝回答你的澄清性问题,你可以阅读这篇博客,学习如何应对 5 种不同类型的面试官。
- 与面试官互动。在真正的面试中,最重要的是倾听反馈,并相应地扩展或缩短你的答案。有些面试官可能不会给你任何建议或反馈。在这些场景中,你要确保他们完全理解你的方法。如果他们真的说话了,做一个好的倾听者,认真及时地对待他们的反馈。
- 防止面试官注意力不集中。面试官可能会在谈话过程中分散注意力。当你解释你的思维过程时,最好说出简明扼要的要点(并经常用过渡句停顿,如“你想让我进一步澄清吗?”或者“你想让我补充更多细节吗?”)而不是进行冗长的、无组织的讨论。
- ****不盲从任何框架。如果你选择使用我们提出的框架,一定要灵活和创造性地适应它们。面试官在寻找真正有解决问题能力的人,而不是那些只遵循结构化模板的人(通常,他们可以立即看出)。
感谢阅读!
如果你喜欢这个帖子,想支持我…
- 订阅我的 YouTube 频道 !
- 跟我上 中 !
- 连接上Linkedin!**
- 前往emmading.com/resources获取更多关于数据科学面试技巧和策略的免费资源!
要继续阅读,我们建议如下:
**</7-a-b-testing-questions-and-answers-in-data-science-interviews-eee6428a8b63> **
使用 Python 从面部表情识别情感的终极指南
建立一个对图像和视频都有效的人脸情感识别(FER)算法

人类情感的浪潮|图片来自 Pexels 的 Andrea Piacquadio
情感是英语中极少数没有具体定义的词之一,这是可以理解的。它是抽象的。然而,我们一生中所做的几乎每一个决定都是由情感驱动的。市场研究已经证明,正确预测情绪可以成为企业增长的巨大源泉,这就是我们今天要做的——解读情绪。在数据和机器学习的世界中,这个概念属于认知系统的范畴。让我们尝试解码情感识别算法背后的科学,并为我们自己建立一个。
一个认知情感检测算法到底想完成什么?这个想法是基于训练数据(以人类的图像和视频的形式)复制人类的思维过程,并尝试分割这些数据中存在的情绪。为了执行本章的分析,我们将专注于展示情绪的预先录制的图像和视频,但同样也可以在实时视频流中实现实时分析。
对世界的视觉理解
计算机视觉是处理视觉数据的人工智能的一部分。随着机器学习和深度学习模型的使用,今天的计算机系统可以处理数字图像和视频,以理解和情感识别视频内容的特征。
计算机视觉作为一个计算概念最初出现在 20 世纪 50 年代,当时一些神经网络用于检测对象的边缘,后来发展到手写文本、语音和语言。
几个复杂的用例证明了计算机视觉在当今工业中的应用。一些非常基本的用途是,在网上进行的考试。网络摄像头可以读取用户的表情来解释他们的精神状态。这也有助于在飞行员和赛车手进入驾驶舱进行最后一次驾驶前测试他们的情绪强度。今天的许多机器人,包括像 Alexa 和 Siri 这样的语音助手,都能够成功地模仿人类的行为,并动情地说话。这也可以追溯到认知疗法,这种疗法治疗退伍军人和股票交易者的压力和焦虑障碍,他们经常处于情绪紧张状态。
认知科学和情感分析
今天的人工智能已经达到了几年前无法想象的高度和长度。程序和计算机系统现在可以高度精确地模仿人类的行为、反应和反应。
情感分析
对人类情感的分析,也称为在环境中对观点或情感的挖掘,是对人类大脑不同状态的研究。使情感分析成为可能的因素是自然语言处理、计算语言学、文本挖掘和生物统计学分析。
任何情感分析程序的基本任务都是分离输入的极性(文本、语音、面部表情等)。)来理解所呈现的主要情绪是积极的、消极的还是中性的。基于这种初步分析,程序通常会更深入地挖掘,以识别快乐、幸福、厌恶、愤怒、恐惧和惊讶等情绪。
这一分析有两个前提。一是量化输入数据,以便算法读取和处理,其次,心理学研究有助于识别哪种表情代表哪种情绪。

情感的程序化分析|作者图片
认知科学
就计算系统而言,认知科学是对发生在人脑中的科学过程的研究。它负责检查认知的功能,即思想的感知、语言、大脑的记忆、推理和处理接收到的信息。在更广泛的层面上,它是对智力和行为的研究。
认知科学的目标是研究人脑并理解其智能原理。这样做是希望通过从人类智能的知识中构建计算机系统,机器将能够模仿学习并像人类一样发展智能行为模式。
认知科学在三个不同层次的分析中运作:
- 计算理论:在这一层,分析的目标被指定并输入到计算机系统。这可能是对语言的模仿,也可能是对情感的理解。
- 表示和算法:用一般的机器学习术语来说,这是训练阶段。在这里,理想的输入和输出场景被呈现给机器,算法被放置在适当的位置,最终负责将输入转换为输出。
- 硬件实现:这是最终的认知阶段。它是在现实世界中制定算法,并对照人脑分析其工作轨迹。

人类认知及其在人工智能图像中的潜在应用
图像中的人脸情感识别
人们常说,我们内心的感受反映在脸上。
面部表情是人类和动物交流的重要方式。人类的行为,心理特征,都很容易通过面部表情来研究。它也广泛用于医学治疗和疗法。在这一部分,我们将研究面部表情和面部肖像的图像,以解码图像中呈现的情感。在后面的部分中,我们将对基于视频的输入执行相同的步骤。
人脸情感识别器
人脸情感识别器(通常称为 FER)是由贾斯汀·申克构建和维护的开源 Python 库,用于图像和视频的情感分析。该项目建立在一个版本上,该版本使用卷积神经网络,其权重在该系统创建模型的源代码(FER 的执行可以在此找到)中的 HDF5 数据文件中提到。当模型被调用和初始化时,这可以通过使用 FER 构造函数来重写。
- MTCNN(多级联卷积网络)是构造函数的一个参数。这是一种检测人脸的技术。当设置为“真”时,MTCNN 模型用于检测人脸,当设置为“假”时,该函数使用默认的 OpenCV Haarcascade 分类器。
- detect_emotions():这个函数用于对情绪的检测进行分类,它将输出注册为六个类别,即“恐惧”、“中性”、“快乐”、“悲伤”、“愤怒”和“厌恶”。每一种情绪都经过计算,输出放在 0 到 1 的范围内。
逻辑流程:程序首先输入需要分析的图像或视频。FER()构造函数通过给它一个人脸检测分类器(Open CV Haarcascade 或 MTCNN)来初始化。然后,我们调用这个构造函数的 detect emotions 函数,将输入对象(图像或视频)传递给它。得到的结果是一系列情绪,每种情绪都有一个值。最后,‘top _ emotion’函数可以将对象的最高值情感屏蔽掉并返回。
安装 FER 依赖于 OpenCV 版或更高版本、TensorFlow 版或更高版本以及 Python 3.6。现在让我们看看这个算法对图像的实现。
输出
该代码单独以图像作为输入,并在输出中详细描述各种情绪及其单独的强度水平。然后,我们使用 top_emotion()提取图像中最主要的情感。

图片分析代码的输出|图片作者
我们现在已经观察了如何分析图像来检索那些图像中出现的人的表情和情绪状态。在下一部分中,我们将使用视频执行相同的分析。
完整的代码库(图像输入)
尽管上面的代码片段实现了程序的核心逻辑,但我还是建议仔细阅读上面链接的资源库中的完整 Colab 笔记本,以获得对整个工作代码的详细理解。
从实时视频中识别面部情绪
与我们处理图像以提取情感相似,在这一部分,我们将处理视频。
理论上,视频是运动中连续图像帧的组合。
所以本质上,任何算法对视频和图像的作用都是一样的。处理视频的唯一附加步骤是将视频分割成所有单独的帧,然后对其应用图像处理算法。
逻辑流程:虽然图像和视频的底层算法是相似的,但对于视频,我们将遵循一些关键的变化。
- Video_analyze():这个函数负责从视频中提取单个图像帧,然后独立地分析它们。
- 该函数分析的每一帧都由算法作为单独的图像存储在代码运行的根目录文件夹中。此外,该功能稍后会通过在脸部周围放置一个框来创建原始视频的副本,并显示视频中的实时情绪。
- 然后,我们根据这些分析值创建一个 Pandas 数据帧,并使用 matplotlib 绘制该数据帧。在这个情节中,我们可以看到每一种情绪对时间的策划。
- 我们可以进一步分析这个数据帧,方法是获取模型识别的个人情绪值,并找出在整个视频中占主导地位的情绪。
这样,我们可以通过提取单个图像帧并分析它们来处理视频。下图显示了这个过程,显示了如何添加一个额外的步骤来处理视频。我们将在下一节看到这个实现。

将一个额外的步骤集成到图像处理算法中,并将其扩展到视频|作者图片
输出

整个视频长度中的情绪序列被绘制在图形上|代码输出的一部分,图片由作者提供

最终情感强度|作者图片

视频处理代码生成的实时输出|图片由作者提供
由此,我们总结了图像和视频的分析以执行情感识别。我们能够成功地处理人脸,并理解面部表情所表达的情感。
完整的代码库(视频输入)
与处理图像的示例类似,上面的代码片段显示了一个工作逻辑。然而,我鼓励你仔细阅读 Colab 笔记本中的完整工作代码以及上面链接的库。
结论

面部表情|图片由 Unsplash 上的 Tengyart 拍摄
在当今世界,情感分析和人脸检测各自都有大量的使用案例。我们在公共停车场、交通监控系统、等地方看到物体检测算法。拍摄人们驾驶车辆的图像来保存记录。此外,在治疗师和他们的病人不可能进行身体接触的治疗中,还使用情感分析。对人类认知的研究也促进了医学的发展。在技术前沿,虚拟助理、档案评估助理和自动化机器人被构建来模仿人类的行为,并以增加准确性和减少错误的希望取代它们。因此,它是我们今天生活的人工智能启发的世界中非常重要的一部分。一种更引人入胜、更复杂的计算机视觉方法是使用基于云的算法,如 Azure 认知服务或深度学习机制,我们在本文中没有涉及,但在复杂的场景中可能会派上用场。通过这个故事,我们了解了以下情况:
- 认知科学是对人类思维过程的研究,旨在通过算法将人类的反应和情绪传递给机器。
- 计算机视觉是人工智能的一个分支,专注于通过处理图像形式的人类数据,在现实世界中实现认知科学。
- 图像处理是所有计算机视觉算法的一部分,它帮助算法理解图像,处理图像,将图像作为数字向量进行处理,并执行必要的操作。
我们使用人工智能的力量来研究认知科学和处理人脸,这个空间通常被称为 计算机视觉。 我们能够从人脸的照片和视频中提取情感。
阅读大量关于机器学习的循序渐进教程
关于我
我是 Rahul,目前在研究人工智能,在 Xbox 游戏上实现大数据分析。我在微软工作。除了专业工作之外,我还试图制定一个程序,来理解如何通过使用人工智能来改善世界上发展中国家的经济状况。
我在纽约的哥伦比亚大学,你可以在 LinkedIn 和 Twitter 上与我联系。
参考
- https://en.wikipedia.org/wiki/Digital_image_processing
- https://sisu.ut.ee/imageprocessing/book/1
- https://en.wikipedia.org/wiki/Video_processing
- https://www . science direct . com/topics/computer-science/video-processing
- https://cognitiveclass.ai/courses/python-for-data-science
- https://www . geeks forgeeks . org/python-process-images-of-a-video-using-opencv/
- https://towards data science . com/face-detection-recognition-and-emotion-detection-in-8-line of-code-b2ce 32d 4d de
- https://www . frontier sin . org/articles/10.3389/fnhum . 2021.621493/full
- https://analyticsindiamag . com/face-emotion-recognizer-in-6-line-of-code/
大数据函数式编程终极指南
纯函数和惰性求值——分布式数据计算的症结

纳斯蒂亚·杜尔希尔在 Unsplash 上的照片
Apache Spark 已经成为当今大数据领域最常用的工具。它能够单独运行代码,将 API 扩展到 Python、Scala、Java 和更多工具。它可以用来查询数据集,其架构中最令人振奋的部分是能够对实时流数据进行分析,而无需显式地将其存储在任何地方。Spark 源于 Scala,被设计为一个分布式集群计算软件框架。从资源管理、多线程、任务分配到逻辑的实际运行,Spark 无所不包。从最终用户的角度来看,它是一个分析工具,可以在几分钟内输入大量数据并得出所需的分析。但是,Spark 是如何实现的呢?使用 Spark 处理大型数据集的一些核心原则是什么?
要了解 Spark 的基础知识、其架构以及在大数据和云世界中的实施,请参考下面链接的故事。
https://medium.com/geekculture/unleash-the-spark-from-your-data-ba3227755e
为什么是函数式编程?
Spark 是一种使用 Scala 开发的语言,Scala 确实是一种函数式编程语言。函数式编程(通常缩写为 FP)是通过积累纯函数、避免共享状态、可变数据和副作用来编写代码的过程。函数式编程是声明性的而不是命令性的,完整的应用程序流过不存储或修改输入的函数。另一方面,Python 是一种过程编程语言。
让我们看一个例子来理解什么是过程化编程,以及为什么函数式编程对于在分布式系统上运行更有意义。
# Declare a list of Soccer Players
players_log = ["Messi",
"Ronaldo",
"Maradona",
"Messi",
"Lewandowski",
"Mbappe",
"Ronaldo",
"Messi",
"Neymar"]# Variable to hold the count
player_count = 0# Function to count number of times a player's name occurred
def count_occurences(player_name):
global player_count
for player in players_log:
if player == player_name:
player_count = player_count + 1
return player_count# First Run
count_occurences("Messi")
>>> 3# Second Run
count_occurences("Messi")
>>> 6
在上面的例子中我们观察到了什么?我们看到,当程序运行多次时,样本变量的计数不断变化。这个答案是不正确的,因为“梅西”在列表中出现的次数只有 3 次。
—为什么会这样?发生这种情况是因为我们调用了一个 gloabl 变量来存储玩家数量,而程序继续修改这个变量的值。
— 可能的解决方案是什么?为了摆脱这一点,我们可以使用一个不实现全局变量的函数。下面我们来看一个实现。
def count_occurences(player_name, player_count):
for player in players_log:
if player == player_name:
player_count = player_count + 1
return player_count
现在,每次这个函数被调用时, player_count 变量将被重置,它将总是给出准确的结果。
在并行系统上运行这段代码会发生什么?
在并行计算环境中,Spark 将数据拆分到多台机器上。让我们想象一下,这个例子中玩家的输入是 10,000,这个列表被拆分成 15 个系统。如果在上面的场景中实现这个逻辑,那么第一个系统必须在第二个系统启动之前完成它的执行,否则输出将被错误地组合。但是,如果机器不能同时工作,那么并行计算范例就失败了。
为了解决程序代码的这个问题,我们在 Spark 中使用函数式编程。但是,在开始使用函数式代码之前,我们首先需要了解一些先决条件,即纯函数和惰性求值。
那么,函数式编程将如何解决这个问题呢?看下面。

使用函数式编程方法运行相同程序的伪逻辑[Map — Shuffle — Reduce] |作者图片
纯函数及其在分布式系统中的应用
编程术语中的纯函数,顾名思义,就是一类不改变给它们的输入的函数。在编程范例中,有三个关键特性定义了什么是纯函数。但是,首先让我们了解一下纯函数的起源。
每个数学函数都是纯函数
起源就是这么简单。所有的数学函数都是纯函数。它们接受输入,执行给定的操作并生成输出。没有中间步骤,没有对函数体中的任何变量进行修改或更改。请看下面一个乘以 2 的数学函数的例子。

乘法运算|作者图片
在同样的意义上,对于编程语言来说,纯功能的理论仍然是一样的。我们可以在下面的 Scala 代码中操作上面提到的相同逻辑。
# Scala code to multiply by 2.
def multiplyByTwo(i: Int): Int = {i*2}
因为分布式系统同时运行许多函数,所以确保一个函数的执行不会对其作用域之外的变量产生副作用是很重要的。
- 输入要决定输出,输入的来源只有一个。不需要外部文件引用或额外的库。输入被实例化为函数,并产生输出。只要传递的输入参数的值相同,输出就永远不会改变。
- 该函数不会更改其输入,这意味着原始输入的值永远不会被修改。所有代码都在原始输入值的副本上运行。
- 该函数除了计算输出之外不做任何事情。不需要读取任何文件,绝对不需要依赖函数范围之外的任何东西。接受输入,计算它,并返回输出。如果这个函数做了其他的事情,这就叫做副作用。而且纯函数应该是永远不会产生副作用的。
纯函数法则:
1.函数的输入单独决定了它的输出。
2.在函数的整个生命周期中,它不会改变输入。
3.该函数不会产生意外的副作用。
现在让我们转向理解函数式编程的下一个重要概念——惰性求值。
懒惰评估的概念
想象一下在数百个系统上同时运行的纯函数。请记住,所有这些纯函数的执行或输出都不能依赖于外部变量。如果一个业务逻辑需要在一个程序中完成 10 个任务,Spark 将为这个任务创建 10 个纯函数。这也意味着所有 10 个输入的内存分配将是额外的,并且对于程序来说将变得昂贵,因为所有的纯函数都需要输入的副本。
Spark 将单个任务划分到几个子功能中,这些子功能都是纯功能。

Spark 把主逻辑分成几个面向小运算的纯函数。每个纯函数都包含其输入参数| Image by Author 的副本
但是,这些单独的纯函数必然会占用大量内存来存储它们的输入参数。这可能会导致“内存不足”的错误。需要惰性求值来将程序从这些内存不足的错误中拯救出来。
在 Spark 对该程序做任何事情之前,它会一步一步地指出需要什么功能和数据。这形成了懒惰评估的基础,并被称为有向无环图(DAG)
Spark 中的有向无环图
与现代世界的大多数其他编程范例类似,DAG 是一个图。它是一个图表,包含最终将应用于输入数据的轨迹或一系列操作。
- Directed: 每个操作都直接从一个节点连接到另一个节点。这些串联连接创建了一系列操作,其中旧节点在执行上顺序领先于新节点。
- 非循环的:在整个函数过程中发生的操作不是在一个循环中,这意味着,它离开后的一个状态永远不能恢复。
- Graph: 从图论来说,它声明了一个顺序连接的顶点和边的组合。
Spark 如何构建 DAG?
基于所请求的根功能的性质,Spark 通常按照以下步骤为任何给定的任务创建 DAG:
- 用户提交一个 Spark 应用程序,驱动程序模块从 Spark 会话中接收这个请求。
- 然后,驱动程序根据请求执行几项任务,帮助识别应用程序所需的转换和操作。
- 这些被识别的操作然后被安排在小的纯函数的逻辑流中,这种安排是 DAG。
然后,DAG 计划被转换为包含几个阶段的物理执行(下面显示了一个示例)。Spark 完成的转换可以分为两大类:
- 窄变换 —像 map()和 filter()这样的过程是窄变换。这些不需要跨分区的数据洗牌。
- 大范围转换—reduce by key 之类的过程是大范围转换,因为它们需要通过分区进行数据洗牌。由于数据被混洗,结果显示在阶段边界上,不会干扰下一个纯函数的输入。
DAG 调度程序创建的所有任务都被连接起来,并通过捆绑包发送到运行该程序的集群。这标志着物理执行计划的完成。

Dag 是给 Spark 功能代码的一系列指令,这些代码在惰性评估|作者图片期间运行
DAG 旨在改进经典的 Hadoop MapReduce 操作,并为开发人员提供更大的灵活性。它允许一次执行多个查询,而 Hadoop 只支持两个查询(map 和 reduce)。DAG 还允许运行 SQL 查询,具有高度容错性,并且比 MapReduce 更优化。
在 Spark 中使用惰性评估的优势
- 增加可管理性:当开发人员可以创建小的操作时,组织大的逻辑变得容易。它还通过分组操作减少了数据的传递次数。
- 降低复杂度:编程中两个主要的运算复杂度是 时间 和 空间Spark 可以克服这两个。因为所有的执行不会同时发生,所以节省了时间。该操作仅在需要数据时触发,因此空间仅在必要时使用,这样可以节省空间。
- 节省计算能力,提高速度: Spark 函数通过驱动程序触发,在集群上运行。由于惰性求值仅在绝对必要时触发计算,它节省了驱动程序和集群之间不必要的行程,因此节省了功率并加快了执行过程,因为单个操作总是很小的。
- 优化:在给定的时间内,运行的查询数量非常少,因此查询会得到优化。
惰性求值和函数式编程的应用
让我们在相同的玩家名字列表上工作,通过下面的代码在 Spark 任务中练习 PySpark 和 Lazy Evaluation。
# Import PySpark and create a sample App
import pyspark
sc = pyspark.SparkContext(appName="maps_and_lazy_evaluation_sample")players_log = ["Messi",
"Ronaldo",
"Maradona",
"Messi",
"Lewandowski",
"Mbappe",
"Ronaldo",
"Messi",
"Neymar"]# parallelize the log_of_players to use with Spark. The parallelize function distributes the input to multiple Spark clusters
distributed_player_log = sc.parallelize(players_log)# Use the Map() Function to convert all names to lowercase
distributed_player_log.map(convert_to_lowercase)
**>>> PythonRDD[1] at RDD at PythonRDD.scala:53**
上面的 map()函数几乎立即运行。这就是懒评的魔力。 Spark 实际上还没有执行这个映射。它会等到最后一刻才执行映射,如果不必要的话就不会执行。上面输出中的“RDD”指的是弹性分布式数据集(RDD)。这些是分布在运行集群中的容错数据集。这就是 Spark 存储数据的方式。为了让 Spark 实际运行 map 步骤,我们需要调用一个“动作”。一个可用的操作是 collect 方法。 collect()方法从所有正在运行的集群中获取结果,并将它们合并到主节点上的一个列表中。
distributed_player_log.map(convert_to_lowercase).collect()
**>>> ['messi', 'ronaldo', 'maradona', 'messi', 'lewandowski', 'mbappe', 'ronaldo', 'messi', 'neymar']**# Running collect with a traditional Python Functional Programming technique [ Lambda Functions ]distributed_player_log.map(lambda x: x.lower()).collect()
**>>> ['messi', 'ronaldo', 'maradona', 'messi', 'lewandowski', 'mbappe', 'ronaldo', 'messi', 'neymar']**
要参考本文中提到的完整代码,请访问下面提到的链接:
https://github.com/rjrahul24/spark-ud-2002/blob/master/Functional_V_S_Procedural_Programming.ipynb
结论
Spark 是处理海量数据的健壮框架。它现在也能够执行机器学习任务,可以托管在所有云平台上。本文旨在介绍函数式编程的概念,以及它如何以积极的方式影响大数据系统,比过程化代码更好。Spark 比我们在本教程中看到的要复杂得多。请务必参考链接的代码库,查看实现这些概念的笔记本。有关 Spark 和函数式编程的更多信息,请参考“参考”一节中的链接。

Joel Filipe 在 Unsplash 上拍摄的照片
关于我
我是 Rahul,目前在研究人工智能,在 Xbox 游戏上实现大数据分析。我在微软工作。除了专业工作之外,我还试图制定一个程序,来理解如何通过使用人工智能来改善世界上发展中国家的经济状况。
我现在在纽约的哥伦比亚大学,你可以通过 LinkedIn 和 Twitter 与我联系。
[参考文献]
- https://www.udacity.com/course/learn-spark-at-udacity-ud 2002
- https://stack overflow . com/questions/57050728/count-occurrences-of-a-list-of-substrings-in-a-py spark-df-column
- https://en.wikipedia.org/wiki/Functional_programming
- https://www . geeks forgeeks . org/functional-programming-paradigm/
- https://spark.apache.org/
- https://spark . Apache . org/docs/latest/API/python/_ modules/py spark/SQL/functions . html
不同情况下假设检验和置信区间的最终指南

马库斯·温克勒在 Unsplash 上的照片
入门
单样本和双样本均值、比例统计推断的循序渐进教程
统计推断是根据观察到的数据对总体分布和参数做出合理猜测的过程。进行假设检验和构造置信区间是统计推断的两个例子。假设检验是在假设零假设为真的情况下,计算观察样本统计数据的概率的过程。通过比较概率(P 值)和显著性水平(1-ɑ),我们对从中抽取样本的总体参数做出合理的猜测。用类似的过程,我们可以计算出一定置信水平下的置信区间。置信区间是总体参数的区间估计,即点估计加上和减去临界值乘以样本标准误差。本文将讨论在以下不同场景中进行假设检验和估计置信区间的标准过程:

不同的场景
这篇文章既是统计推断的教程,也是供你参考的备忘单。下面的小节将详细讨论这些过程,为了方便起见,在文章的最后,我将在两个表格中总结讨论。
1、均值的统计推断
1.1 分布假设
当使用统计推断技术时,我们需要对下面的分布进行假设。根据中心极限理论,随着样本量的增加,样本均值的分布趋近于正态分布,无论总体分布如何。因此,如果样本量足够大,样本的均值服从正态分布。
我们这里通常使用的检验要么是学生 t 检验,要么是 Z 检验。z 检验基于正态分布,而学生 t 检验基于类似于正态分布的分布,但具有较厚的尾部。当样本量低于 30(标准截止值)或总体标准差未知时,我们使用学生 t 检验。否则,我们使用 Z 检验。
1.2 单样本平均值
对于具有 n 个观察值的样本:

我们观察ᾱ作为样本的平均值。我们可以通过检查ᾱ是否与μ显著不同来检验这个样本是否来自均值等于μ的总体。我们还可以估计出抽样总体均值的 95%置信区间。
假设检验
下面是进行假设检验的步骤:
- 第一步:设置原假设:
两条尾巴:
h0:ᾱ=μ
h1:ᾱ!= μ
一条尾巴:
h0:ᾱ≥μ
h1:ᾱ< μ
or:
H0: Ᾱ ≤ μ
H1: Ᾱ >μ
另一个假设 H1 是我们想要检验的假设。例如,如果我们想测试ᾱ是否大于μ,我们设置 H1 为ᾱ>μ。
- 第二步:计算检验统计量:
对于学生 t 检验,我们需要使用样本标准差 s 来估计总体标准差σ:

样本标准偏差
t 统计量是:

t 检验统计量
请记住,对于学生 t 检验,由于样本中的观察值相对较小,我们需要指定自由度来找到正确的值。自由度定义为 n-1,其中 n 是样本大小。
如果我们知道总体标准差σ,并且样本大小 n 大于 30,我们可以使用 z 检验并计算 z 统计量:

z 检验统计量
- 步骤 3:将临界值与测试统计值进行比较
要获得临界值,我们需要指定显著性水平 1-并参考 t 或 z 表。例如,对于样本大小等于 10 且显著性水平为 95%的双尾 t 检验,临界值为 2.262,如下所示:

来自https://www . sjsu . edu/faculty/gerst man/stat primer/t-table . pdf 的 t 表
对于显著性水平为 95%的双尾 z 检验,临界值为 1.96,如下所示:

z 表来自https://www . math . Arizona . edu/~ RS IMS/ma 464/standardnormaltable . pdf
下图显示了临界值的含义。z 检验基于标准正态分布(N(0,1))。分布的性质表明,对于 N(0,1)之后的随机变量 x,只有 5%的机会|x| ≥ 1.96。临界值 1.96 与 95%(1-5%)的显著性水平相关。如果上面计算的 z 检验统计量大于 95%,则意味着观察到该样本统计量(p 值)的概率小于 5%。因此,我们可以在 95%的显著性水平上拒绝零假设。

双尾检验的临界值和显著水平
请注意,在相同的显著性水平(95%)下,t 检验的临界值大于 z 检验的临界值,这与 t 分布具有较厚尾部的事实相符。
置信区间
置信区间是参数在一定置信水平下的区间估计。它通过点估计加上或减去误差幅度(ME)来计算:

置信区间
点估计值只是样本的平均值,ME 的计算公式如下:

误差幅度
分布和置信水平定义临界值,标准误差(SE)通过样本或总体标准偏差计算。对于一个样本均值的置信区间,如果我们不知道总体方差,或者当样本量太小时,我们可以通过下式计算:

单样本平均置信区间
其中,ᾱ是样本的平均值,t 可以根据置信水平和自由度在上面的 t 表中找到。例如,对于一个有 10 次观察的样本,95%置信区间的 t 值是 2.262。
否则,我们需要使用 z 表来计算置信区间:

单样本平均置信区间
z 值可在 z 表中找到。95%置信区间的 z 值为 1.96。
1.3 两个样本意味着:独立样本
当我们观察两个样本时,我们可能想知道这两个样本的平均值是否有显著差异。如果我们有理由相信这两个样本彼此不相关,我们可以使用假设检验来测试它,假设检验的零假设状态均值彼此相等,或者对均值的差异进行置信区间,并检查零是否在区间内。该过程与单样本情况非常相似,只是在计算测试统计数据和标准误差时略有不同。
假设检验
对于具有均值ᾱ1 和ᾱ2 的两个样本,我们可以为双尾检验设置零假设和替代假设,如下所示:
h0:ᾱ1 = ᾱ2
h1:ᾱ1!= Ᾱ2
如果我们想检查任何一个均值是否明显大于另一个均值,我们也可以设置单尾检验(h0:ᾱ1 > ᾱ2)。如果两个样本都不够大,我们可以使用假设 t 分布的 t 表,并按如下方式计算 t 分布:

两个独立样本均值的 t 统计量
其中,S1 和 S2 是两个样本的方差,计算公式如下:

样本 1 的标准偏差

样本 2 的标准偏差
根据实际情况,我们也可以设置零假设来检验两个均值之间的差值是否大于某个大于 0 的数,这个数有时称为效应大小。更大的效应大小使得更容易拒绝零假设,因为差异更大,因此增加了统计功效。要了解更多细节,你可以在这里查看我的文章:
注意,当我们如上计算集体标准误差时,我们假设两个样本来自具有不同方差(σ1!= σ2 ) .当我们相信σ1 = σ2 时,我们可以计算合并的标准误差:

合并标准差
并计算测试统计的标准误差,如下所示:

标准误差
零假设的检验统计变为:

双样本均值的检验统计量
置信区间
两个样本均值的置信区间用来描述两个均值的差异。使用 t 临界值,我们可以如下计算置信区间:

两个样本均值的置信区间
请注意,与上面的讨论类似,通过对总体方差的不同假设,我们可以不同地计算误差项的标准差。
1.4 两个样本意味着:成对样本
在上一节中,我们已经讨论了两个样本相互独立的情况。两个样本以某种方式相互关联的情况呢?例如,两个样本在治疗前后来自相同的受试者,或者样本取自同一家庭的不同人,等等。在这些情况下我们通常有 n1 = n2。例如,如果我们想检验在治疗组中是否有治疗效果,我们可以在治疗前后收集样本:

处理前的样本

处理后的样品
我们需要计算每个个体治疗前后的差异,并得到观察差异的样本:

差异样本
在哪里

这样,我们就把两个样本的情况转化为一个样本的情况。按照上面讨论的程序,首先我们需要计算差异样本的平均值和标准偏差:

差异样本的均值

差异样本的标准偏差
假设检验
我们可以根据实际情况建立零假设。双尾检验的典型零假设和替代假设是:
h0:ᾱ^d =μ
h1:ᾱ^d!= μ
μ可以是任何数字。测试统计数据的计算如下:

差异样本的统计量
根据样本的不同,我们可以选择进行 t 检验或 z 检验。
置信区间
我们还可以构建样本差异的置信区间。我们只需要差均值和差标准差来构造区间。基于学生 t 分布的置信区间为:

差异样本的置信区间
2、比例的统计推断
2.1 分布假设
均值衡量连续变量的集中趋势,但不能用于分类变量。对于分类变量,我们可以在统计分析中使用每个类别的计数比例。具有 n 个类别的样本中类别 I 的比例计算如下:

计算比例
C_i 为第一类的观测值个数,N 为样本量(所有 N 类的总观测值)。
这里我将用一个简单的例子来说明这个过程。掷硬币时,我们要么得到“正面”,要么得到“反面”。我们使用二项式分布来表示二元分类比例,而不是遵循正态分布来进行平均统计推断。根据二项式分布的性质,随着样本量变大,二项式分布越来越接近正态分布。统计推断中“大样本”的标准定义是当 np 和 n(1-p)都大于 10 时。如果不是,我们将使用学生 t 分布进行推断。
2.1 一个样本比例
一个样本比例计算一个类别在样本中所占的比例。如上所述,单样本比例的一个用例是测试一个硬币是否无偏。在足够的投掷次数下,如果硬币是无偏的(大数定律),那么“头”的比例应该等于“尾”的比例为 0.5。
假设检验
单样本比例的假设检验遵循类似的设置程序。使用上面掷硬币的例子,如果我们想测试一个硬币是否无偏,给出一个掷硬币结果的例子:

这与测试是一样的:
H0:P H = P 0
H1: P_H!= P_0
为了检验硬币是否无偏,我们可以设 P_0=0.5。注意这是双尾测试。我们可以把零假设改写为 P_H > 0.5,看看这个硬币是否偏向头部。
我们需要首先计算样本中有多少个“头”来计算 P_H。然后,假设样本大小足够大,我们就可以计算 z 统计量:

单样本比例的 z 统计量
P_H 由样本计算得出。在这个例子中,P_0 被设置为 0.5。分母用于计算该样本的标准误差(源自二项式分布)。按照上述相同的步骤,我们可以使用 z 表或 t 表来查找临界值。通过比较这里计算的统计数据,我们可以决定是否拒绝零假设。
置信区间
比例的置信区间与均值的统计推断遵循相同的模式,即使用点估计值和误差容限,只是标准误差的计算方式不同:

单样本比例的置信区间
请注意,假设检验的标准误差不同于置信区间。前者用 P_0,后者用 P_H。
2.2 两个样本的比例
双样本比例检验比较两个样本的比例,广泛应用于 AB 检验。例如,当我们比较治疗组和对照组之间的转化率以查看是否存在显著的治疗效果时,我们需要测试转化率的差异是否足够显著。我们可以用假设检验来检验这两个比例是否有差异,或者为差异构造一个置信区间。
假设检验
根据我们现有的两个样本,我们可以计算出 P1 和 P2 的两个比例。为了检验这两个比例是否没有显著差异,也就是说这两个样本可能来自同一人群,零假设和替代假设为:
H0: P1 = P2
H0: P1!= P2
请注意,这是一个双尾测试。对于单尾检验,我们可以检查在零假设下 P1 是大于还是小于 P2。
我们需要计算两个样本比例的一个重要变量叫做 P_pool:

混合比例
你可以这样理解,当我们将两个样本合并在一起时,类别 I 在合并样本中的比例是多少。
类似地,如果 n1P1 和 n2P2 都大于 10,我们可以使用 z 统计,因为分布遵循正态分布。如果不是,我们需要计算 t 统计量。统计数据的计算方法如下:

两个样本比例的 z 统计量
注意,我们使用 P_pool 来计算标准误差。
置信区间
像两个样本均值的置信区间一样,两个样本比例的置信区间也用于推断两个比例之间的差异。如果两个样本量都足够大,我们可以使用 z 表中的临界值 z,并计算置信区间为:

置信区间和假设检验之间的唯一区别是标准误差的计算。置信区间不使用混合比例,而是单独使用每个样本的标准误差。
这需要消化很多信息。这里我用两个表格来总结这篇文章的要点:
- 对于一个样本均值和比例:

资料来源:宾州州立大学统计 200
- 对于两个样本的平均值和比例:

来源:宾州州立大学统计 200
感谢您的阅读。这是我所有博客帖子的列表。如果你感兴趣的话,可以去看看!
https://zzhu17.medium.com/my-blog-posts-gallery-ac6e01fe5cc3 https://zzhu17.medium.com/membership
产品数据科学面试问题终极指南
解决数据科学产品感觉面试问题的框架

作者在 Canva 上创建的图片
进入数据科学面试前如何准备产品感面试问题
参加技术面试时,大多数公司会根据当前/潜在的涉及或与他们产品相关的复杂情况来询问产品问题。从某种程度上讲,这可能是一个关于他们产品的简单问题,也可能是关于你对产品了解多少的宽泛问题。
例如, Quora 问,“你会用什么标准来衡量搜索工具栏变化的影响?”这是一个更简单的问题,可能的解决方案是 CTR(点击率)和 A/B 测试。一个更模糊的问题,例如优步问“选择你最喜欢的产品或应用,并描述你将如何改进或设计它。”这是一个考察你对产品分析程度的问题,也是一个让面试官了解你思维过程的问题。
对于第一个示例问题,面试官希望看到更明确的答案,而第二个问题是一个更普遍的问题,以了解为什么你选择某些功能来改善其他功能,并了解这种思维过程如何应用于他们公司的产品。
在进入面试之前,研究一下公司的产品。因为基于产品的问题涉及公司的产品,所以要了解公司的产品。它的竞争对手(如果有的话)和面临的共同挑战是什么?虽然彻底分析每个公司的产品是不切实际的,特别是对于跨国公司,但建议对公司的产品有一个整体的了解。当公司有多种产品时,他们通常会在申请时提供特定部门下的数据科学职位。例如,谷歌有多个部门需要数据科学家,而你申请了“营销自动化,谷歌广告”。了解该产品的内容。公司希望改进他们的产品,如果你了解他们的产品,并对他们的产品有可行的解决方案,这使你更有可能被雇用。
如果工作清单中没有具体的部门,您可以进入下一步检查工作职责。工作职责是为了让你更好地理解这份工作需要什么,以及面试官可能提出的问题。Glassdoor 提供了大多数数据科学工作所给出的描述,其职责如下。
- 与整个组织的利益相关者合作,确定利用公司数据推动业务解决方案的机会。
- 从公司数据库中挖掘和分析数据,以推动产品开发、营销技术和商业战略的优化和改进。
- 评估新数据源和数据收集技术的有效性和准确性。
- 开发自定义数据模型和算法以应用于数据集。
- 使用预测建模来增加和优化客户体验、创收、广告定位和其他业务成果。
- 协调不同职能团队实施模型和监控结果。
- 开发流程和工具来监控和分析模型性能和数据准确性。
- 设计数据建模流程创建算法和预测模型,并执行定制分析
- 使用可视化和其他方式向利益相关方传达调查结果
- 开发预测模型****
- 发布结果并与业务合作伙伴一起解决约束/限制。
突出显示的单词都是需要重点关注的术语。一般来说,这些术语大多出现在许多职位描述中,因此建议就涉及这些主题的问题进行练习。
一旦你从招聘广告中得到了重要关键词的列表,分析什么类型的技巧可以应用于列表中的每一项。还应该注意的是,当一家公司含糊地提到某项责任时,例如在上述“其他业务成果”的情况下,你不应该完全忽略这一点,而应该有一个行业常用技术的一般列表,例如 PCA(主成分分析)。
创建一个个人文档,列出工作描述中的常用术语和你知道的算法/概念,会对你有所帮助。根据工作描述中的常用术语对算法/概念进行分类。例如,广告定位是一个常见的话题。在广告定位下,你可以包括点击率,网站总流量,页面价值。这 3 个概念都与广告定位相关,可以在讨论广告定位相关问题时使用。创建多个这样的列表,并在面试前刷新你对 X 公司最适用的列表的记忆。
有时可能会询问细节,例如 PayPal 有一个 Venmo 风险数据科学家的工作描述,其中包括“制定准确、自动化的风险解决方案和手动处理策略,通过拒绝付款、将帐户添加到欺诈审查队列或限制可疑用户来阻止欺诈活动。”这一整行都是具体的,在其他数据科学职位描述中通常看不到。据了解,这项工作通常涉及风险解决方案。想想风险解决方案公司面临的共同问题,或者更好的是 PayPal 面临哪些风险相关的问题。这可以让你更多地研究和了解这家公司以及你的潜在雇主面临什么样的问题。这些常见的问题将会是你在面试中被问到的问题类型。从数据科学/产品经理的角度考虑公司会问什么类型的与产品相关的产品感面试问题。
接近产品感面试问题

作者在 Canva 上创建的图像
数据科学面试中的产品感面试问题不仅是为了获得尽可能准确的答案。更多的是让面试官了解你回答问题的方式。提出这些问题的原因如下:
- 诊断和解决真正的产品问题
-可能看你对公司的产品/业务有多熟悉 - 你解决问题的方法有多实用
- 评估候选人定义指标的能力
- 理解度量标准的影响和权衡
- 以有效和结构化的方式传达您的解决方案
(这些都直接关系到数据科学家如何解释问题背后的原因并提出解决方案。回答问题时请记住这一点)
在试图立即回答问题之前,首先,你必须了解被问到的产品面试问题的类型。在面试中,有三种类型的产品感面试问题会被问到。
- 分析与指标相关的问题(最常见)
- 衡量新产品/功能的影响
- 设计产品
所有这三个产品感面试问题都需要不同类型的方法来回答,但总是与收入、市场份额或用户参与度相关。了解问题是否与三者中的哪一个相关(或不止一个),并据此构建您的解决方案。
分析与指标相关的问题
这种类型的产品感面试问题通常会提到与公司产品相关的指标,并提到它受到了负面影响。你的解决方案应该给出为什么会发生这种情况的思考过程。
这些类型的产品感面试问题示例:
- 功能 X 的使用量减少了 N%
优步问“优步的黑人骑行量下降了 10%。你会如何调查这种减少?” - 功能 X 下降了 N%,但功能 Y 上升了 M%
Google 询问“感觉自己的隐私受到尊重的用户增加了 8%,但对 Google Play 服务的参与度却下降了 14%。你会如何调查这种差异?”
公司寻求:
- 受访者能够在多大程度上定义和解释指标与解决方案的相关性
- 了解哪些因素会影响某些功能/产品的成功
- 如果有一个衡量标准,根据具体情况,哪个衡量标准更重要
公司可能会问的另一个指标影响问题是,某些因素可能会如何影响所测量的指标。优步问“解释网络效应如何影响你选择如何分配实验/控制单元和测量你的主要结果指标”这类问题测试你对什么会影响特性/产品的理解程度。
衡量影响
这类问题要求你衡量一家公司的某个特性/产品的效果如何。
这些类型的产品感面试问题示例:
- Quora 问“你会用什么标准来衡量搜索工具栏变化的影响?”
- YouTube 问“你如何衡量 YouTube 短片的成功?”
公司寻求:
- 受访者能够在多大程度上定义和解释指标与解决方案的相关性
- 理解目的以及哪些因素会影响特性/产品的成功
- 设计一个实验,根据定义的指标来衡量功能/产品的成功程度
设计产品
这些完全是开放式的问题,没有正确的答案。这些通常是数据科学产品面试中最难的问题,因为它们测试的是你的思维过程,而不是你的答案。这些问题可能与公司的产品直接相关,也可能是与公司产品相关的更一般的问题!
这类问题的例子有:
- Lyft 问“描述如何设计热图,告诉出租车司机去哪里最大化他们获得客户的概率。你怎么定义接下来哪个地区需求高,你想让谁去?”
- 微软问“你会怎么总结一条 Twitter 消息?”
- Yelp 问“如果你必须提出一个新的 Yelp 功能,会是什么?”
这种类型的产品感面试问题有时包括如何衡量您设计的解决方案的成功,例如,当您提到您的新 Yelp 功能时,Yelp 可能会问您如何确定该产品是否成功推出?这将与衡量成功类型的问题联系在一起。
公司寻求:
- 你对公司产品/市场的了解程度如何
- 你对产品开发过程的理解程度如何(考虑目标受众)
- 您能在多大程度上定义和解释指标与解决方案的相关性
- 你有多了解如何衡量产品的成功
结构化解决方案
一旦你理解了面试官问的产品感面试问题的类型。您已经进入了最重要的一步,解决方案的结构。面试官不只是寻找一个可能的答案,而是寻找多种因素。
受访者必须表明他们:
- 对你的答案有一个系统的方法
- 涵盖问题的所有重要方面
- 确保解决方案的实用性

作者在 Canva 上创建的图像
尽管每种类型的产品意识问题对于每种解决方案都有不同的框架,但所有类型的产品问题都有一个通用框架。总体框架是您解决方案的基础,因为它表明您对产品和需要注意的事情有所了解。
总体框架
受访者应始终澄清问题。尽管这个问题看起来很直接,但你应该总是针对问题中的关键词提问。花些时间理解这个问题及其指标和目标。
您必须定义产品访谈问题中使用的指标。不仅要定义问题中提到的指标和您用来帮助形成您的解决方案的指标,还应陈述指标与目标相关性的解释。当你解释为什么使用某个指标时,这表明你作为受访者理解为什么某个指标与问题相关,而不是随机猜测。与面试官讨论目标/指标,直到你和面试官在这些问题上达成一致。请记住,你回答的其余部分是基于这些指标/目标的,因此,如果你的面试官不知道你为什么选择某个指标,或者没有看到指标和产品目标之间的任何关联,这将对你被录用的机会产生负面影响。****
你还应该了解被问到的产品类型是什么。你的问题是基于实体/数字产品还是产品的某个特性?
- 实体/数字产品:向面试官澄清您是否需要根据产品回答产品的任何特定部分/功能?Yelp 问“如果你必须提出一个新的 Yelp 功能,你会提出什么?”Yelp 旗下有多个产品,如商业评论或餐桌预订。问面试官产品的某个具体部分或者整个产品有没有需要改进的地方?
- 产品的特性:确保你了解特性是如何工作的。你应该仔细考虑这个问题。询问面试官你是否有不明白的地方或者想要澄清的地方。如果面试官不知道或者没有告诉你,就对这个特征做出假设,然后问面试官你是否能做出这些假设。
了解产品/功能后,指出问题中的关键词,并阐明这些关键词是如何定义的。建议从头到尾定义问题中的关键词,这样你就涵盖了每一个重要的元素。
例子:易贝问“易贝必须将摄像机与三脚架、电缆和电池等其他物体区分开来。你的方法是什么?数据包括广告标题、产品描述、价格、图片等
- “摄像机”→摄像机是否包含所有类型的摄像机或任何特定的摄像机,如定点摄像机/摄像机/行动摄像机?
- “其他对象”→给出的例子都与摄像机相关联,那么我们是在尝试将摄像机与和摄像机相关的对象或任何一般对象区分开来吗?
- “数据”→这些数据多久收集一次?这很重要,因为技术每十年都会发生变化,所以更准确的分类算法将更好地识别现代相机,与 20 世纪 90 年代的相机相比,现代相机更有可能在易贝销售。关于数据的另一个问题是数据准确性。什么是相机的数据有多准确?
- “广告标题”→相机通常是捆绑在一起的,例如三脚架/电缆/电池(特别是相机需要区分的部分),那么广告标题是只包含与相机相关的信息,还是也包含其他产品?
- “描述”→描述是指公司生产的产品的已验证规格,还是用户编写的产品描述?描述是否包括产品图片中的所有项目?由于一些图像包含整个束,分类算法必须能够检测相机并忽略三脚架和其他。
- “价格”→价格是通过产品的建议零售价、当前拍卖价格、立即购买价格还是任何其他衡量方法来衡量的?[这一部分显示了你对该公司产品的了解程度,因为大多数其他零售商都没有拍卖价]
- “图像”→这些图像是用户提交的还是制造商发布的专业图像?
当与产品相关时,时间始终是一个影响因素无论一项指标是由于一年中的某个时间而受到影响,还是需要在某个时间段之前达到目标。时间会影响人们从公司购买功能/产品的决定。当指标注意到变化时,定义变化开始-结束的时间,如果指标变化在每年的某个时间段内重复,也是可能的。您还应该问,在某个时间段内,指标变化是持续变化还是急剧变化?例如,在国庆节期间,由于公司提供折扣,购买的数量可能会上升。
产品受到影响指标/目标的内部/外部因素的影响。提及可能影响指标/目标的重要内部和外部因素(至少提及一个),并明确说明该因素是内部因素还是外部因素。****
内部/外部因素的例子:
- 内部因素:
数据准确性——衡量指标/收集数据的准确性如何?
·数据量大小——是否有足够的可用数据来生成准确的模型?
·产品质量——客户不喜欢产品吗?由于产品成本的变化或新组织的变化,产品质量有变化吗? - 外部因素:
·用户统计数据——对于特定的用户统计数据,衡量标准是否会发生重大变化?例证:过去一年,脸书用户创作数量的减少可能与年轻人更喜欢使用 Instagram/Snapchat,而不是脸书作为社交媒体平台有关。
·技术问题——生产产品所需的技术需求/供应的任何变化,或者产品/功能是否因重大缺陷而无法正常运行?例子:索尼 Playstation 5 因英特尔处理器芯片短缺而缺货。
·社交转变——社交品味的转变是可能影响整个产品的重大转变。例证:百视达不得不关闭,因为人们的社交品味转向了使用网飞在线观看电影。
·补充产品——如果补充产品的销售数量下降,该产品的销售也会下降。示例:苹果注意到去年购买 AppleCare 的人数减少,这可能是由于去年销售的 iPhones 数量大幅减少。
以上所有内容只是为了澄清问题,并表明你理解产品开发的重要部分,以及可能影响它的一些基本因素。此时,您应该根据问题类型参考下面的具体问题框架部分。
特定框架
分析度量相关问题
当某个产品的某个指标在特定的时间范围内发生巨大变化时,通常与某个影响因素的变化有关。推断方法和假设的影响因素是面试官在度量相关问题中寻找的。
第一项检查是查看该公司的任何其他产品/功能是否受到了影响。列举公司的其他产品/功能,并说明是否对其他公司的产品产生了类似的影响。这可能是内部因素,如组织变革,也可能是外部因素,如公司声誉受损。
如果任何其他公司的产品没有受到影响,第二个检查将是查看任何竞争对手的产品是否受到影响。如果他们的产品也受到了与公司产品类似的影响,可以推断这是一个外部因素,如产品零件短缺或社会品味的转变。
如果只有产品受到影响,而竞争对手或其他公司的产品都没有受到影响,那么接下来就要了解哪些因素/指标会直接影响指标。例如,Twitch 发现,在日活跃用户数周增加后,日活跃用户数下降了 5%。一个直接的影响因素可能是网站的总流量已经超载,导致网站有很长的加载时间。这可能是因为 web 服务器无法处理大量试图访问网站的用户。在这里,网站总流量是一个对每日活跃用户数量产生负面影响的指标。
这与痛点的概念直接相关。痛点是产品中令客户不满意的部分,可能会主动阻止他们使用。(在前面的例子中,缓慢的网站加载时间是一个难点)列出几个可能让用户不喜欢该产品的潜在难点。尝试从最相关到最不相关的顺序排列棘手问题,这样有助于面试官了解你对产品相关内容的理解程度。提及痛点后,提及你的解决方案将如何解决用户的痛点。
关于前面提到的 Twitch 的情况,Twitch 目前正试图增加网络服务器的数量,以减少网站加载时间,从而增加每日活跃用户。这是一个简单的方法,但是当涉及到的权衡时会发生什么呢?例如,微软问“在疫情期间,预计 Skype 日活跃用户将会增加,但实际上却减少了 4%。你认为这是为什么?”一个原因可能是由于微软同时维护 Skype 和 Teams,这两者都是视频通信的形式。通过新冠肺炎·疫情,微软比 Skype 更能把团队推向公众的视线。这将导致 Skype 每日活跃用户减少,但团队数量增加。由于两者都是微软的产品,微软必须做出权衡的决定,是否接受 Skype DAU 的减少和团队的增加。这些都是你在面试中必须做出的重要决定,而且要有充分的理由。作为受访者,你必须决定权衡的哪个方面更重要,并提供一个经过深思熟虑的解决方案。一个通用的经验法则是,当问题中涉及到权衡的度量时,倾向于手边的度量。对于微软和 Skype 的例子,在这个权衡中你应该支持 Skype DAU。
测量影响
量化产品/功能的影响力决定了它的成功程度。在衡量影响时,您应该定义 3 个指标:2 个衡量成功的指标和 1 个当新功能/产品出现时不会恶化的指标。在提到 3 个指标时,确保:定义指标,解释指标与你的目标的相关性,可能的话,解释你为什么选择某些指标。
衡量成功显然是理解一个产品/特性表现如何的重要部分。了解哪些指标可以证明产品是成功的。常见的例子有:用户的有机增长增加了,利润增加了,关于新产品/功能的推文是正面的。
受访者总是提到如何衡量成功,但往往忘记确保某些指标的改善并不总是一个积极的迹象。在新产品的开发过程中,大多数指标都不会恶化。例如,YouTube 在其移动应用程序中发布了一个名为 shorts 的新功能,类似于抖音格式。这是为了增加年轻用户的目标受众的日常活跃用户,他们更喜欢抖音格式。虽然每日活跃用户和有机增长可能会增加,但 YouTube 应该确保用户参与率不会下降。
由于这类产品感访谈问题的目标是衡量影响,对于这些指标,你应该给出一个可量化的数字,说明何时该指标可以被认为是积极的。这应该表明你有多了解一个产品何时被认为是成功的。例如:如果至少 80%的推文对新产品持肯定态度,客户对产品的满意度就是肯定的。如果有机增长增加了 8%,那就是积极的。如果用户留存率下降不超过 5%,那就是利好。不要提供非常容易/难以达到的指标值。比如:不要提只有 99%的推文是正面的,客户对产品的满意度才是正面的。99%的用户喜欢一个产品是不现实的目标。
在提到、定义并解释了为问题选择这些指标的原因后,您需要解释您将使用什么方法来度量这些指标。您将如何得出该指标?例如,关于该产品的正面推文可以通过对所有提到该产品的公共推文和回复进行情感分析来得出,以推断人们是喜欢还是不喜欢该产品。像每日活跃用户这样的简单指标通常不需要推导。
有一个通用的实验来测试一个新特性 A/B 测试的成功与否,这类似于对照组和治疗组的概念。
在解释任何实验时,提及你正在测试的用户群。你在尝试把产品扩展到新的用户群吗?你会想在特定的人口统计数据上运行你的实验。你是想衡量公众对新产品的反应吗?你会想在一个随机的群体中进行实验。
设计产品
公司想知道你对他们公司为什么要生产一种潜在产品的理解程度。为什么公司打造这种类型的产品,对于理解为什么要开发一个产品,目标受众是谁,为产品做广告有很大的帮助?通过联系公司生产的产品类型,说明为什么公司会对开发潜在产品感兴趣。 Lyft 问“描述一下如何设计热图,告诉出租车司机去哪里最大化他们获得客户的概率。你怎么定义接下来哪个地区需求高,你想让谁去?”这项新功能可能有助于 Lyft 及其司机更快地连接司机和乘客,从而为 Lyft 及其司机创造更多收入。
当一个产品需要首先设计时了解目标受众。在设计你的产品时,记住目标受众。如果问题和访谈都没有指定目标受众,说明你认为谁是目标受众,并说明你正在基于这个目标受众开发产品。继续以 Lyft 为例,目标受众是出租车司机,但这最有可能是指 Lyft 司机。(这些假设你应该问你的面试官这是不是一个有效的假设!)
了解产品的目标和 KPI(关键绩效指标)是什么。KPI 是业务问题中的关键指标,因此这将决定应该衡量和改进哪些指标。KPI 基于这两种类型:产品/系统性能和用户体验。产品/系统性能示例:应用程序初始化时间、连接到服务器所需的时间。用户体验的例子:页面价值,退出率。请记住,在设计产品时,你的 KPI 应该是实现目标的主要焦点。
有些设计产品面试问题会涉及到公司的产品或者另一家公司的产品。当问题涉及另一种产品时,理解这种产品是做什么的,它与您的问题有什么关系?例如,微软问【Twitter feeds 如何汇总。询问关于如何使用 Twitter feeds 的问题。这是用来看用户对新产品的评论还是别的什么?根据产品的使用方式,目标会发生变化。进一步以微软-Twitter 为例,如果微软想了解人们对新产品/新功能的感受,你应该更倾向于情感分析,而不是文本的实际摘要。
一旦你收集了所有需要的信息,你就可以开始设计产品了。此时,告诉面试官你需要一些时间来设计产品。当你对如何设计你的产品有了一个计划时,向面试官彻底解释这些步骤。
收集数据/指标时,解释您将收集哪些数据/从哪里收集这些数据(如果是从外部来源),以及您为什么选择特定的数据和用户受众。
例如, Twitter 问,“你如何量化一个 Twitter 用户的影响力?”
- 谁:您将收集谁的数据?你会收集任何用户,经过验证的用户,有专业影响力的用户吗?解释你为什么选择这个用户组而不是另一个用户组。
- 什么:您将收集哪些数据?你在收集一个用户有多少追随者的数据吗?一天内有多少 Twitter 用户查看某个有影响力用户的推文?详细说明你将收集哪些数据,选择这些数据的确切目的,以及这些数据与你的目标之间的关系。
- 其中:在这个例子中,关于用户的 Twitter 数据将在 Twitter 服务器中,所以不必提及。如果您计划收集 Twitter 用户之外的数据,请说明您将从哪个确切的数据/指标来源收集数据?说明你为什么从这家公司而不是从任何其他来源收集数据。如果这是收集数据的唯一来源,请提及!
提及重要功能时,解释这些功能如何帮助实现本产品的目标。继续 Twitter 的例子:一个可能的重要特性是统计有多少用户点击了有影响力的用户发布的购买链接。点击该链接的用户数量的增加导致影响用户的量化影响力的增加。
痛点在这里也非常重要。在设计任何产品的时候,总会有某个用户人群的痛点。提及产品设计中的难点,以及你将如何解决这个问题。是否有任何可能的解决方案可以在产品内部实现,或者可以使用任何外部实现?
现在你已经设计了你的产品解决方案,但是你必须衡量产品的性能。在这一点上,你应该使用相同的框架来衡量成功问题类型。
某些设计产品的问题可能更进一步,询问产品是否应该发布。受访者应该考虑如何衡量产品的潜在成功。
- 如果在短期和长期内,度量标准很有可能发生积极的变化,并且对其他度量标准没有负面影响,那么我们可以推断该产品可能会成功。
例证:DAU 的有机增长似乎以每月 0.2%的稳定速度增长,没有出现重大损失。 - 如果对另一个指标有负面影响(权衡),找到解决这种负面影响的方法。如果否定负面影响不可行,找出哪个指标对公司更重要。如前所述,一个通用的经验法则是,当问题中涉及到权衡的度量时,在问题中倾向于度量。
- 如果有任何长期问题,了解这是否是在计划环境下可解决的问题,或者做产品的进一步开发,这样就不会导致无法解决的长期问题。
例:产品需求大增,造成重大供应短缺。
现在,您已经完成了最初的总体框架和具体问题框架,您必须用适用于所有 3 种产品面试问题的结束框架来总结您的答案。
一旦你给出了问题类型的具体答案,记住你的答案提供了大多数用例的整体解决方案。你应该提到一些边缘情况,并且提到你将如何使用你的解决方案解决这个边缘情况。即使不知道边缘案例的答案,识别边缘案例也比完全不识别要好。提供边缘案例表明你对产品/功能有足够的了解,能够意识到这些是边缘案例。不要试图将你的边缘案例结合到你的主要解决方案中,因为这可能会让面试官或你自己感到困惑。在你的主要解决方案之后解释它,这样面试官知道你在谈论边缘案例,你也可以更好地关注你的整体解决方案。
例子: Lyft 问“描述一下如何设计热图,告诉出租车司机去哪里最大化他们获得客户的概率。你怎么定义接下来哪个地区需求高,你想让谁去?”。假设您的答案是根据过去的数据按小时、星期几、月份和年份来预测乘车次数。这个答案的一个边缘案例是当城市里有一个重大事件时,比如音乐节。音乐节并不总是在同一日期的同一地点举行,因此它可能会在几天内以指数形式增加对 Lyft 乘坐的需求,然后立即消退,如果你只使用过去的数据,这很难预测。像这样的重大事件的真实世界的数据收集需要被合并。
对答案给出系统详细的解决方案后,你要给面试官提供一个总结。
记得在你的总结中包括适用的部分。
- 解决方案中使用的指标是什么,它如何与您的目标联系在一起
- 指标变化的最可能原因以及如何修复变化
- 衡量成功的最重要的标准,以及公司何时可以断定产品是成功的
- 产品设计中最重要的部分
这个总结是你产品感访谈的关键部分。这表明你知道如何用重要的部分来解释你的解决方案。这种特质直接转化为数据科学工作。想象一下,你正在给一个客户一个问题出现的原因和你的解决方案的概要,解释他们的产品为什么会失败。
后续步骤概述
- 理解问题
阐明场景/指标
产品/功能相关
分解问题中的关键词
时间框架 - 了解内部/外部影响因素
- 基于特定问题的框架
- 边缘案例
- 您的解决方案摘要
传达您的解决方案
你的答案不是面试官唯一想要的!他们想看看你能多好地交流你的思维过程。这是一个如何传达您的解决方案的框架。
你的解决方案的一个关键部分是理解面试官说的话。在传达你的解决方案时,记得从面试官那里得到反馈。千万不要严格按照框架来。永远记住面试官的评论,改变你解决方案的步骤/沟通方式。记住,在一天结束的时候,面试官会影响你是否适合这家公司的决定。
回答问题之前,先收集一下你的想法
- 受访者被允许花时间收集他们的想法。您不希望在解决方案进行到一半时,发现自己在错误的角度着手解决方案,或者找到了更准确/高效的解决方案。面试官希望你在回答之前花点时间,因为这表明你已经考虑过你的解决方案,并且给出了你最好的解决方案。一般来说,人们花大约 30 秒来回答这些问题。
- 如果你要花更多的时间,可以陈述你的目标和对问题的一些假设,并询问目标/假设是否准确,这样你就不会花太多时间来回答问题。
就问题的目标/假设达成一致
- 推断出问题的目标,并确保你和面试官在这个问题上的目标是一致的。这些问题通常用词含糊不清,所以面试官可以理解你独特的视角。这就是为什么交流你的想法比你的最终解决方案更重要的原因。
- 您在开始时所做的假设为您的解决方案奠定了基础,而目标应该向您展示如何着手解决方案。例子: Twitter 问,“你如何量化一个 Twitter 用户的影响力?”。你可以说“这些是我做的假设。假设:有一个数据库,包含用户的推文,一旦他们被验证或当他们有大量的追随者。该数据库还将包括关于用户的统计数据,例如关注者的数量以及关注者关注用户的日期和时间(您所做的假设将根据您的解决方案而改变)。这些都是似是而非的假设吗?”
对于询问如何改进特定产品的问题,提及多个目标受众,但选择其中一个作为解决方案
- 提及使用该产品/功能的三种不同目标受众。
- 提及每个目标受众的痛点
- 此外,讨论为什么你选择了一个目标受众和他们的绘画点。
- 例如:Exponent 有一个关于如何改进谷歌地图的视频(1:57–4:43)
提及技术术语
- 在你的解决方案中应该使用专业术语,但不要强行使用专业术语。你申请的是一个技术职位,所以你应该表明你知道重要的技术概念,以及它们在哪里被直接应用于商业问题。
在三种情况下,你不应该使用技术术语
-你不理解技术术语
-如果使用技术术语是多余的,并且有更简单的解决方案
-技术术语和目标/解决方案之间没有关联 - 有时公司会在职位描述中提到某些专业术语,如果某些专业术语适用于你的面试问题,提到它们是个好主意。例如,脸书有一个数据科学-产品分析职位的职位描述是“在行业环境中应用统计或实验(即 A/B 测试)”。A/B 测试是一个技术术语,可能会用在您的解决方案中
如果任何步骤涉及新的指标/变量,提及以下内容:
- 与您在解决方案中的当前步骤和目标的相关性
- 指标/变量是如何得出的。示例:如果您正在收集 Instagram 广告的点击率(点击率),请说明您将通过计算广告的点击次数除以广告的显示次数来得出点击率指标。
永远大声说出你的想法!大声说出每一步,确保每一步都与前一步直接相关,同时也有实现目标的清晰路线。
****如果你觉得自己偏离了轨道,你的解决方案也不合理,举一个你的产品/功能会偏离轨道的例子。花些时间看看你的解决方案的哪一步最接近目标,然后开始一条通向目标的新道路。如果你搞砸了,不要担心!即使在工作中,每个人都会在他们的解决方案中遇到困难,但如果你提到为什么你的解决方案行不通,而不是坚持一个有重大缺陷的解决方案,这是一个积极的迹象。记住当你提到你的新解决方案时,这个解决方案将如何避免以前提出的解决方案所面临的问题。
在几个步骤之后,或者如果跨过了任何重要的一步,问面试官到目前为止所有的步骤是否都有意义,你是否朝着正确的方向前进。
我们还建议查看我们的数据科学面试指南,了解在数据科学面试中还会问到哪些问题。
原载于https://www.stratascratch.com。**
SQL 排序终极指南
这本终极指南概述了 SQL 排名函数、它们的语法以及来自 StrataScratch 面试问题的真实面试示例

作者在 Canva 上创建的图片
数据科学家使用 SQL 来查询和操作数据集,根据业务需求对结果进行排序在现实应用中无处不在。除了现实世界的应用程序,SQL 排序问题也经常出现在面试中,这刺激了初出茅庐和经验丰富的数据科学家去掌握它们。
例如,在一个业务场景中,数据科学家可能需要为年同比订单量下降最多的 20 个客户编写查询脚本。在确定当年不太活跃的公司后,企业领导人可以为每个公司制定适当的战略,提高企业绩效。
在数据分析或数据科学面试中,你可能会被要求按降序排列最繁忙的一天。熟悉 SQL 排序原则将有助于您编写高效准确的查询。
在本文中,我们使用来自 StrataScratch 专有数据库的真实采访示例来研究 SQL 排序问题。我们将回顾正确回答 SQL 排序问题所需的方法和技能的最佳实践。
SQL 排序问题
SQL 中的排序问题通常需要数据科学家争论相关数据,并对前 N 名或后 N 名结果进行排序。虽然参数和业务案例可能会有所不同,但排序查询的语法是相当一致的,通过实践,您可以提高在这些重要和常见问题上的性能。排序面试问题往往需要数据科学考生了解如何识别合适的数据,并根据某个属性进行排序。
在本文中,我们将介绍如何对预处理数据进行排序,以及如何对数据进行排序以准确得出结果。更具体地说,我们帮助您开发必要的技术框架,以了解分组观察、按列按特定顺序排序、添加排除不相关行的标准,以及如何确定最终结果中包含的行数。我们将通过复习三个面试问题来完成这一任务。这些问题的难度从相对简单的问题到更复杂的问题不等,但基本原理是相同的。
- 首先,查看您的表,并确保您理解您的数据集。如果可能的话,查看列名和每列中的一些值。如果只有一个表,这将是 FROM 命令引用的表。如果有多个表,您可能需要连接这些表。
- 接下来,确定你的问题所涉及的属性。例如,如果您的问题涉及“公司”或“卖方”,这些很可能包含在您的选择函数中。
- 对于我们的第三步,确定是否有任何额外的标准,如“包括在亚洲发生的结果”或“在过去 6 个月”。如果是这样,使用 WHERE 解决这些问题,并通过排除不符合我们标准的数据来减少我们的数据大小。
- 接下来,确定是否有提到的类别可以组合在一起。GROUP BY 将值转换为符合条件的记录的摘要。例如,可能会要求您按财政月对订单进行排序。在这种情况下,您需要根据财政月属性进行分组。
- 最后,我们指定对结果进行排序的属性。这可以以上升或下降的方式进行,意思是从最小到最大或从最大到最小。如果我们被要求找出 2021 年 MLB 赛季打出最多本垒打的前 5 支棒球队,我们对“本垒打”感兴趣,并将降序排列(从大到小),限制为 5 支。极限是用极限来完成的,后面跟着数值。
虽然在排序问题中可以找到其他命令,但是理解 SELECT、FROM、WHERE、ORDER BY、GROUP BY 和 LIMIT 将有助于您解决这些常见问题。我们开始吧。
示例 1——福布斯面试问题

作者在 Canva 上创建的图像
在《福布斯》最近的一次采访中,一名候选人被要求找出最赚钱的金融公司,并返回其名称和所在的洲。

截图来自 StrataScratch
问题链接:https://platform . stratascratch . com/coding/9663-寻找全球金融领域最赚钱的公司
一个可能的解决方案是如下处理这个问题——使用 SELECT、FROM、WHERE、ORDER BY 和 LIMIT。
SELECT company, continent
FROM forbes_global_2010_2014
WHERE sector = 'Financials'
ORDER BY profits DESC LIMIT 1;
首先,我们以一种相当简单的方式使用 SELECT 命令,因为请求只需要公司的名称及其关联的洲。虽然更复杂的例子可能需要您在查询的早期完成聚合函数或定义变量,但这个例子只需要返回适当字段的名称。
一定不要错过这里的点。仔细检查问题并确认相关属性。对于电话面试,你可以与面试官跟进,以确保你了解感兴趣的属性。在工作或现实世界中,在运行查询之前,一定要提问以了解问题。对于使用云服务的公司来说,浪费的查询可能会导致更高的服务成本。
接下来,我们以一种简单的方式使用 FROM 语句来指定我们应该用来运行查询的表。在更复杂的查询中,您可能需要执行连接,这里我们只需要指定所需的表。查看我们关于 SQL JOIN 面试问题的帖子,其中涵盖了最常见的 JOIN 面试问题。
即使在更复杂的查询中,一般的方法也是一样的。FROM 指示表上的 SQL 执行所需的查询。
下一步,让我们记住,我们被要求在结果中只包括金融公司。使用 WHERE,我们可以通过设置一个标准来包含“部门”列的值等于“财务”的属性,从而轻松实现这一点。通过只选择只有金融公司的行,我们从结果中删除了不相关的行。还值得注意的是,您可以通过编写相同的查询来显式排除条件,但是在等号(!idspnonenote)前包含一个感叹号。=).这仅仅意味着“不等于”。
ORDER BY 对于查询的成功完成尤为重要。“排序”的机械方面是通过 ORDER BY 来完成的,因为它提供了对哪一列结果进行“排序”的指令。对于这个问题,我们最感兴趣的是利润列。
ORDER BY 是一个灵活的函数,可以以“升序”或“降序”的方式执行。升序从序列中的最小值开始,向上计数到更大的值。默认情况下,SQL 按升序排序。降序从列中的最大值开始,并按“从大到小”的顺序对系列进行排序。
最后,LIMIT 设置要包含的最大结果数。如果我们在没有 LIMIT 命令的情况下运行上面的查询,我们的结果将包括表中的每一行,而不仅仅是利润最高的公司。通过设置一个限制,我们的查询只返回第一个结果。如果要求您包含更多结果,请相应地调整这个数字。
现在我们已经完成了整个查询,让我们快速回顾一下问题的逻辑。
从“forbes_global_2010_2014”表中,我们选择公司名称和相关的洲值。我们过滤掉金融行业的所有实例,然后根据利润值从最大值开始对剩余结果进行排序。然后我们设置一个限制,只包括最高的结果。这一过程充分回答了我们最初的问题,并且很容易被跟随您的任何其他数据科学家或分析师阅读。
示例 2 — Airbnb 面试问题
接下来,我们有一个 Airbnb 问题,要求候选人找到 2017 年夏天评论最积极的十大酒店,但只包括 6 月至 8 月之间的结果。

截图来自 StrataScratch
问题链接:https://platform . stratascratch . com/coding/9877-查找夏季六月至八月评价最高的十大酒店
然后,我们将输出酒店名称以及相应的正面评论数量。这些结果将根据正面评价的数量按降序排列。
一个机构群体提交的解决方案采用了以下方法。您是否注意到大多数函数在我们之前的示例中也是如何使用的?让我们看一下这个解决方案,了解一下如何解决稍微复杂一点的 SQL 排序问题。
select hotel_name,count(positive_review) as n_positive_reviews
from hotel_reviews
where review_date BETWEEN '6/1/17' and '8/31/17' and positive_review !=
'No Positive'
group by hotel_name
order by n_positive_reviews desc
limit 10;
SELECT 再次用于从我们的表中选择相关字段,但是在这个例子中,我们还需要计算正面评论的数量。为了统计正面评论的数量,我们使用聚合函数“count ”,并使用 as 定义一个别名。我们称我们的别名为‘正面评论’。我们的别名是一个临时存储的变量,我们手动定义,并允许计算值有可识别的名称。
FROM 再次标识包含我们的数据的适当的表。与上一个问题类似,所有数据都存储在一个表中。
WHERE 函数用于定义日期范围的参数,并且只包含积极的结果。这是通过 BETWEEN 函数和定义日期来完成的。请注意,查询中的日期格式与表中的格式相匹配。通过指定 6 月 1 日和 8 月最后一天之间的日期,这确保了我们的结果表只包括相关的日期—6 月、7 月和 8 月。此外,AND 还用于引用“positive_review”列,并排除值为“No Positive”的观察值。的!查询中的“=”最终意味着“排除值等于下列 __”的结果。更简洁地说,它用来表示‘不等于’,起源于数学。
此处的 GROUP BY 语句指示查询根据“hotel_name”列中的值聚合结果。请记住,我们的问题要求我们找出 6 月至 8 月间评价最高的前十家酒店。酒店的名称存储在“hotel_name”中,因此请确保在搜索结果中包含这些信息。
接下来,我们使用 ORDER BY 函数对结果进行排序。通过引用之前启动的变量(n_positive_reviews ),查询将使用此列基于正面评论的计数进行排序。基于降序执行排序可以确保我们的最大值位于表的顶部。
最后,我们将我们的结果限制为包括十个结果,并且由于我们之前的 ORDER BY 语句,我们的前十个最大值。
示例 3 — Yelp 面试问题

作者在 Canva 上创建的图像
在最后一个例子中,我们的任务是找出拥有最多五星级企业的 5 个州。

截图来自 StrataScratch
问题链接:https://platform . stratascratch . com/coding/10046-排名前 5 位的五星级企业
一种可能的方法是如下看待问题,使用 SELECT、FROM、聚合函数 COUNT、GROUP BY、ORDER BY 和 LIMIT 来处理请求。
select state, five_stars
from (select state, count(stars) as five_stars from yelp_business
where stars=5
group by state) a
order by five_stars desc
limit 5;
首先,我们使用 SELECT 来包含两个感兴趣的变量——state 和一个我们稍后将定义的变量“five_stars”。由于问题指定了“stars”列的重要性,我们的变量“five_stars”在计算中引用了“stars”。
接下来,FROM 在这里比在其他例子中更活跃一些。FROM 不是简单地指定我们想要引用的表的名称,而是用来完成一个更复杂的任务。为了更好地理解正在发生的事情,让我们从第 2 行的末尾向后看。首先,我们明确定义了我们所引用的表——“yelp _ business”。这实际上和我们其他的练习题是一样的。接下来,我们从选择函数中定义名为“five_stars”的变量。“Five_stars”是包含“state”并执行“stars”计数的表的别名。接下来,代码指示只包含“stars”列等于 5 的行,并使用 GROUP BY 对 state 进行分组。
让我们花点时间看看我们到目前为止做了什么。我们在 yelp_business 表中查询了自己的“state”列和一个通过别名(five_stars)创建的附加列。变量“five_stars”包含“state ”,并将其与一个附加列配对,该列计算“stars”列等于 5 的实例的数量。我们最初的请求是找到拥有最多五星级餐厅的五个州,通过按州统计五星级餐厅,我们很好地完成了这个问题。
现在我们有了一个计算五星级餐馆数量的结果,剩下的就是将结果从大到小排序并包括前 5 名。
接下来,我们使用 ORDER BY 通过调用我们的“five_stars”表来准备排序,并指示降序排序。记住,这意味着返回表顶部的最大值。
最后,根据我们问题的参数,我们设置我们的极限函数只包括前 5 个结果。
此外,请查看我们的SQL 窗口函数终极指南 ,了解 SQL 窗口函数的类型、语法以及实际使用示例。
结论
无论什么行业,掌握 SQL 中的排序对业余和高级程序员都很有用。数据科学家可能会遇到许多排序的用例,完善你的技术可以提高你对团队产生影响的能力。SQL 中排序的一般原理是一致的,效率是通过重复发展起来的。StrataScratch 提供了数千个练习题,让你为下一次面试做好准备,或者提高你在数据科学领域工作的数据技能。
最初发表于【https://www.stratascratch.com】。
SQL CTEs 的终极指南

迪米特拉·佩帕在 Unsplash 上的照片
在 5 分钟内掌握常用的表格表达
通用表表达式(cte)是一种 SQL 功能,允许您在一个简单易读的查询中执行复杂的多步转换。由于其强大的功能、可读性和灵活性,它们对于初学者和专家都是有用的工具。
它们是如何工作的?
最简单地说,cte 允许您创建临时数据集,以便稍后在查询中引用。
这些临时数据集在查询期间“可用”,但它们并不存储在数据库中,所以一旦执行了查询,它们就消失了。
我们为什么需要它们?
cte 的核心是做两件事:
- 它们解决了我喜欢称之为“逻辑之上的逻辑”的问题。当您必须执行数据操作,然后使用生成的数据集执行更多操作时,就会出现这种情况。
- 它们使您的代码更具可读性,也更容易使用
语法看起来像什么?
幸运的是,cte 的语法非常简单:
- 首先键入关键字“with”+任何您想要用来引用您创建的数据集的名称+“as”
- 在括号中写下您想要执行的查询
- 编写引用 CTE 的其他查询
with my_cte as (select * from my_table)select * from my_cte;
唯一不同的是,我们可以在同一个查询中使用多个 cte(用逗号分隔):
with cte1 as(select * from my_table1), cte2 as (select * from my_table2)select cte1
union all
select cte2;
感觉还是很理论,能给我举个例子吗?
好的,让我们用一个 Kaggle 数据集快速地看一个例子,它包含了网飞电影评分。每条记录都是用户对电影的评价:

作者图片
现在,假设我们想要选择平均收视率最高的 10%的所有电影。
这是 cte 的一个很好的用例,因为它涉及多层次的聚合。
处理这个查询的最好方法是一步一步地构建它。
首先,我们需要计算每部电影的平均评分:
select movie_ID, Name, avg(Rating) as avg_rating
from netflix.ratings
group by 1,2;

作者图片
然后我们需要得到平均评分的十分位数。让我们用一个 CTE 吧!
with avg_ratings as(select Movie_ID, Name, avg(Rating) as avg_rating
from netflix.ratings
group by 1, 2)select *, ntile(10) over (order by avg_rating desc) as rating_decile
from avg_ratings;

作者图片
请注意,我们首先在 CTE 中获得电影的平均评级,然后在后续查询中引用该表。
我们的最后一步是过滤,只包括 rating_decile = 1 的电影。我们可以通过使用第二个 CTE 来解决这个问题!
with avg_ratings as(select Movie_ID, Name, avg(Rating) avg_rating
from netflix.ratings
group by 1, 2),avg_ratings_decile as(select *, ntile(10) over (order by avg_rating desc) as rating_decile
from avg_ratings)select *
from avg_ratings_decile
where rating_decile = 1;

作者图片
最终,CTEs 帮助我们在一个查询中执行了三个后续的数据操作:
- 计算每部电影的平均评分
- 计算平均分之上的十分位数
- 十分位数= 1 的过滤器
但是等等,我们可以用子查询来做!
是的。是的,我们可以。
但是子查询读起来绝对是一团糟,因为当试图理解逻辑时,它们需要你从里到外地工作。例如,我们上面的查询使用子查询如下所示:
select *from(select *, ntile(10) over (order by avg_rating desc) as rating_decilefrom(select Movie_ID, Name, avg(Rating) avg_rating
from netflix.ratings
group by 1, 2) as avg_ratings) avg_ratings_decilewhere rating_decile = 1;
像这样剖析代码——使用所有不同的括号和别名——可能是一场噩梦。cte 干净多了。
我想我明白了,但是我怎样才能得到更多的练习呢?
获得更多实践的一个简单方法是自己完成上面的例子。
为此,我建议:
- 点击从 Kaggle 下载免费数据集
- 上传到 SQL 数据库。如果您还没有设置,您可以在下面找到我的指南,了解如何快速有效地设置:
</4-steps-to-start-practicing-sql-at-home-cb771beeca20>
3.尝试自己重新创建我在上面写的 cte(注意,我首先将收视率数据与电影数据结合起来,以添加电影名称)
4.自己写问题给自己回答!没有什么比提出你自己的研究问题更好的了,因为它可以帮助你内化“何时”和“为什么”你可能想要使用某些功能
如果您认为本文有帮助,请:
- 对您希望我接下来撰写的 SQL 或数据科学主题发表评论,然后
- 订阅我的 免费邮箱列表
您还可以在下面找到我的其他 SQL 指南:
</6-hidden-sql-mistakes-to-avoid-2e771bed085b>
数据科学家和数据分析师的终极面试准备指南

兰迪·塔兰皮在 Unsplash 上的照片
是什么帮助我成功采访到方和独角兽
准备数据科学家/数据分析师面试是一项耗时的活动,但如果您有该领域的经验和/或拥有可能会在面试中出现的每个主题的合适资源列表,以便您可以集中精力,则可以大大减少准备时间。尽管数据科学家和数据分析师在数据世界中是不同的职业道路(如果你还不知道区别,请查看我在发表的关于这个主题的帖子,但当谈到采访中涉及的话题时,有很多重叠。
在我之前的帖子中,我的面试准备指南的第一部分,我概述了大多数数据相关工作面试中出现的常见测试领域(这些问题在数据科学家、数据分析师、数据工程师以及技术产品经理的面试中经常被问到)。在这篇文章中,我将聚焦于对数据科学家和数据分析师的采访;我已经在硅谷的几十家公司面试过这些职位,并收集了一系列有用的资源。如果你在面试一个数据科学家/数据分析师的职位,请确保除了我在之前的帖子中概述的那些主题之外,你还复习了这些主题。
首先,确定关注什么话题
统计/数学面试
常见职位:数据科学家、数据分析师
不要因为提到“数学”而气馁,没有人会在数据科学面试中问你导数、积分或矩阵乘法,因为这些很可能不适用于你的日常工作。我说的“数学”,主要是指关于基本统计概念和基本概率论的知识。
GIF by GIPHY
不幸的是,知道平均值和中间值的区别对面试的这一部分来说是不够的。大多数面试官会测试你对诸如 T2 大数定律、T4 中心极限定理以及贝叶斯概率和计算的熟悉程度。
- 辉煌 (Freemium 模式):方招聘人员统计面试准备推荐网站。有各种水平的课程,所以要确保你不会陷入统计概念的陷阱。对于大多数面试来说,知道基本原理就足够了。
- 麻省理工学院开放式课程(免费):用课堂幻灯片详细概述最基本的统计概念。它从最基本的概念开始,如均值和方差,然后慢慢积累。然而,如果你在学校主修数学或统计学,这些幻灯片对你来说可能太基础了。
- 可汗学院(免费):统计和概率课程提供了统计和概率中基本概念的详细分类;它也有练习题来测试你对题目的理解。
编码访谈(Python、R 等)
常见职位:数据科学家,一些小公司的数据分析师
在我的上一篇文章中,我介绍了 SQL 编码面试的准备材料。除了 SQL 之外,大多数数据科学家角色都需要对至少一种脚本语言有基本的了解;最常见的有 Python 和 r。
与大多数 SQL 面试相反,一些面试官会要求你运行你的 Python/R 代码。然而,面试官的目的不是测试你对某个特定的包或函数语法的熟悉程度;他们通常更关心你是否懂编程基础(对于循环,while 循环等。)以及当代码抛出错误时是否可以调试代码。所以,如果你不记得 random() 函数是在 random 包中还是在 NumPy 包中,一定要问你的面试官他们是否能给你一个提示(这是一个棘手的问题,两个包都有一个 random() 函数)。
GIF 来自 GIPHY
- Udemy :平台上有很多 Python 和 R 课程可供选择,所以很容易找到符合你的经验和对所选语言熟悉程度的课程。
- Hackr.io 有一篇文章对你能在网上找到的顶级 Python 课程/资源进行了排名;如果您正在寻找学习 Python 的免费资源,这是一个很好的起点。
理论/建模/ML 知识面试
常见职位:数据科学家、应用科学家
面试的这一部分不是你看几个视频就能轻松学会的,所以如果你申请的工作有建模的成分,你肯定应该预算更多的时间来准备。除非你面试的是 R&D 团队的核心数据科学家角色,否则通常你不会被问到 NLP(自然语言处理)或深度学习之类的问题。但是,您应该知道基本的建模概念,例如回归、分类、聚类等等。如果你没有深厚的背景或丰富的建模经验,有两本书对你学习这些概念很有帮助。

凯文·Ku 在 Unsplash 上拍摄的照片
免责声明:本部分包含附属链接,这意味着如果您决定通过下面的链接进行购买,我将免费获得佣金。这里推荐的书都是我自己面试备考的时候用过的,喜欢的书。(附属链接标有“*”,你可以直接从谷歌搜索书名来绕过它)。
- 统计学习简介 *:本书涵盖了最常见的建模主题,并假设读者已经具备了一些统计学背景和知识。

- 分析边缘 *:这本书是由麻省理工学院运筹学系的超级明星教授 Dimitris Bertsimas 撰写的,它被用作麻省理工学院商业分析项目的教科书。麦肯锡还将其用作数据科学家分析训练营的培训材料。这本书展示了 ML 世界中不同模型的细节并进行比较,从最基本的线性回归到更高级的机器学习模型。你肯定无法在一周内从头到尾读完这本书,所以我不会把它作为最后一分钟的速成课程,而是会在更长的时间跨度内详细通读这本书,并在面试前浏览重要章节作为复习。

A/B 测试知识
常见于:数据科学家
许多数据科学工作描述都会提到 A/B 测试,因为这是数据科学家需要做的最常见的分析之一。对 A/B 测试设计和分析的理解依赖于对基本统计数据的理解;所以,如果你需要统计概念的复习,一定要在浏览完统计/数学面试的资源后再做这部分准备。
- uda city 上的 A/B 测试课程(免费):我在面试前用这个课程来温习我对 A/B 测试的理解,它超级有效。本课程详细介绍了 A/B 测试的设计、分析和注意事项。最棒的是,它是由谷歌工程副总裁领导的,他们有丰富的 A/B 测试经验,可以用现实生活中的例子来阐明这个主题。
其他需要复习的技能
- 沟通技能:除了上面提到的“硬”技能,对数据科学家/数据分析师或任何人来说,最重要的技能就是沟通。大多数面试官认为,只要你有一定的技术背景/理解基础,就可以在工作中获得技术技能,但很难向那些在技术方面超级强大但不能很好地表达自己想法的人传授沟通技能。为了在面试中展示你的沟通技巧,让面试官了解你的思考过程是很重要的,尤其是在现场编码和案例面试部分。需要注意的是,让人们了解你的思考过程并不意味着你应该东拉西扯;确保你花一点时间来组织你的想法或代码,并且总是尝试采用自上而下和结构化的交流方式。实践这一点的最佳方式是与一位朋友进行模拟面试,并通过解释您在代码中做了什么来引导他们完成一个编码问题。
GIF 由 GIPHY
- 熟悉云平台/数据仓库:熟悉谷歌云平台、Azure 或其他云平台通常会更好,因为现在大多数公司都在使用某种云平台来存储数据。如果你不知道从哪里获得这些平台的实践经验,你可以在空闲时间获得无数的证书。

- 熟悉数据可视化工具:大多数公司使用 Looker、Tableau 或类似工具来可视化数据。因此,熟悉他们意味着当你被录用时,你会花更少的时间提升,这对雇主来说是有价值的。同样,即使你找不到机会用这些工具积累实际工作经验,你也可以找到证明你能力的证书。
我想在最后补充一点,面试准备需要时间和工作;虽然你可能偶尔会觉得自己带着准备材料掉进了兔子洞,但重要的是不要在这些时候感到沮丧,并确保在花所有时间填补一个主题的知识空白之前,留出足够的时间来浏览所有可能主题的基础知识。
毕竟,面试准备就像你一直在为学校做的考试准备一样,你永远无法预测和准备面试中的每一个问题(如果你可以,那会破坏面试的目的,不是吗?);当你遇到一个你没有准备好的问题时,相信你的思考能力,用你准备好的所有材料解决这个问题。
希望这一系列文章对你的面试准备有所帮助;欢迎发表评论,如果你想了解更多关于 DS 世界的话题,请告诉我。
你下一份理想数据工作的终极面试准备指南

由 Unsplash 上 Greg Rakozy 拍摄的照片
是什么帮助我成功地面试了方和独角兽公司从产品经理到数据科学家的职位
经过一轮又一轮的简历编辑和数百份申请,你终于收到了你梦想中的公司的回音;但你没有庆祝,而是进入了另一轮恐慌:面试过程会是怎样的?你如何准备,从哪里开始?
每个经历过招聘过程的人都知道我在说什么。更令人恐慌的是,如果你像我一样,对数据世界中的不同角色感到好奇和感兴趣,你可能会去不同的公司面试不同的职位(尽管都与数据相关)。你怎么可能有足够的时间和精力来准备这些看起来要求天壤之别的工作的面试呢?
GIF 来自 [GIPHY](https://media.giphy.com/media/W6WNKaro33l1QdvIjV/giphy.gif)
不要绝望;在经历了从产品经理(最不注重技术,最注重商业)到应用科学家(高度重视商业,很少注重商业)的几轮数据相关工作的招聘和面试后,我意识到这些面试中有很多共同点(有点跑题:这强化了我的信念,即数据世界中的技能组合大多是可以转移的,所以不要害怕在职业生涯早期做出“错误”的决定,你可以随时改变)。我将分享我在准备这些面试的过程中收集的资源,以帮助你更有效地准备面试。
首先,决定优先考虑什么
谈到面试准备,有很多内容要讲;为了便于管理,我把内容分成了两篇文章。在本文中,我们将首先讨论所有角色中最常见的面试话题。在我发表的下一篇文章中,我将为每个特定的角色讲述更专业的面试主题。
因为大多数人没有几年(甚至几个月)的时间来准备这些面试,所以有一个优先排序的计划是很重要的。决定关注什么以及如何在不同的主题上分配时间实际上可以归结为三个因素:1)你的目标职位描述的重点是什么?2)你申请的公司规模如何?,以及 3)你的弱项是什么?
角色的重点是什么?了解你申请的职位是侧重于指标的数据科学家还是侧重于 ML 模型的应用科学家很重要,这样你就知道在面试准备的哪个领域投入的时间最多。在我关于在数据世界的不同职业道路的文章中,我对不同的数据相关工作概况及其要求进行了非常详细的细分,这应该会让你对数据分析师、数据科学家和数据工程师之间的区别有一个坚实的概念。对于其他角色,有几种方法可以了解这些信息:
- 最好的方法是详细研究职位描述。一份写得很好的职位描述通常会让你很好地了解你在这个职位上将关注什么。

图片来自 LinkedIn(数据科学家的示例职位)
- 另一种方法是查看 LinkedIn 上你申请的公司中从事相同或相关工作的人的简介。如果他们中的大多数人在他们的角色描述或技能部分提到 SQL,当 SQL 出现在面试中时,不要感到惊讶。
- 最后,不要犹豫利用你的招聘人员。招聘人员希望为你的成功做好准备,所以他们通常很乐意告诉你面试的内容(或者代表你联系团队/面试官以获得更多信息)。
公司规模有多大?公司越小,就越需要聘用能够身兼数职的全面数据人才。在像方这样的大公司,大多数工作都已经有了明确的定义,招聘是一个标准化的过程。面试官可能会主动分享详细的面试指导,或根据要求提供更多信息。

方招聘人员发送的面试准备邮件样本,非常详细。
然而,如果你对创业感兴趣,那么你的面试准备应该是广泛的。即使你申请了一个数据分析师的职位,你可能会被要求在白板上写一轮代码,然后在下一轮讨论 ML 模型。
你的弱项是什么?希望你已经对自己需要改进的地方有了大致的了解(尽管我是数学专业的,但我每次都会被概率问题绊倒);但如果没有,浏览本 文档 中的一些样题是评估你对每个主题的流利程度的好方法。也有一些好的各个领域的备考资源。
接下来,让我们深入到你在数据相关职位的面试中可能遇到的常见部分。
第 1 部分:编码(数据查询)访谈(SQL)
常见职位:数据分析师、数据科学家、数据工程师、应用科学家
在应聘数据相关的角色时,很有可能会遇到 SQL 测试,要么是实时编码面试,要么是离线/带回家测试。我采访过的大多数公司都是通过 coderpad.io 进行编码面试的,但是如果你知道大多数面试官不会编译和运行你的代码,并且对语法错误非常宽容,这可能会让你放松神经,因为 SQL 有很多不同的说法。所以要做好准备,不用担心知道 week() 和 extract(从时间戳开始的星期)的区别,但是一定要知道内连接和外连接的区别。

马库斯·斯皮斯克在 Unsplash 上拍摄的照片
- W3Schools (免费)——一个练习语法的好地方,你可以很容易地在主题间导航。
- SQLZOO (免费)——既有自定进度的教程,也有实践,尽管值得注意的是这些概念是相对基础的。
- Datacamp (访问大多数资源需要订阅)——有针对不同级别 SQL 能力的课程;对于大多数面试来说,入门和中级水平就足够了。
- Udemy (按课程定价)——Udemy 上有很多不错的 SQL 课程;只要记得以折扣价购买它们(几乎总是有打折的课程)。
- Udacity (基于订阅)——这是一个更昂贵的选择,但有更多的结构化学习,需要更长的时间来完成。Udacity 偶尔会提供由公司赞助的奖学金,一定要留意那些令人敬畏的机会。
第二部分:商业意识(基于案例)面试
常见职位:数据分析师、数据科学家、产品经理
许多数据角色需要商业意识和与商业利益相关者的定期交流。商业意识面试有多种形式,从咨询面试中常见的“传统”开放式案例问题到更注重指标的问题。然而,在任何情况下,面试官都希望测试你如何以系统和结构化的方式分解和处理问题,并交流你的方法和发现。
这些问题通常没有正确或错误的答案;你如何得出一个解决方案比你的确切答案更重要。能够以 MECE(互斥和集体穷举)的方式分解问题,并熟悉解决问题的自上而下和/或自下而上的方法是很重要的。

由 Austin Distel 在 Unsplash 上拍摄
披露:这一部分包含附属链接,意味着如果你决定通过这里的链接购买,我可以免费获得佣金。这里推荐的书都是我自己面试备考的时候用过的,喜欢的书。(附属链接标有“*”,你可以直接从谷歌搜索书名来绕过它)。
- 典型案例 :这是 OG 案例研究指南,被《华尔街日报》称为MBA 圣经* 。如果你从未见过案例研究,也从未听说过“MECE”框架,这可能是一个很好的起点,因为它将有助于训练结构化的思维方式。
- 案例面试秘诀 *:这本书由一位前麦肯锡顾问撰写,不仅展示了案例面试的最佳框架,还阐释了最佳沟通风格(大多数分析型受访者都很难进行自上而下的沟通,因为分析需要你在大部分时间里保持清醒,但缺乏结构的沟通风格很容易让你的面试官困惑,让你在面试中迷失方向)。

- 产品经理面试 *:这本书列出了大公司 PM 面试中的数百个真实问题和答案,并为每个样本答案提供了详细的分析。注意,这本书没有详细列出框架,所以最好在你学习了框架之后用来练习框架。

- 破解 PM 面试* :这本书为 PM 面试的每个环节提供了详细的指导。如果你面试的是 DS 或数据分析师的工作,你只需要关注指标问题和案例问题。

图片来自谷歌
- 解码并征服 :这本书补充了产品经理访谈*一书,提供了用于解决这些样本问题的框架和技术。

- Lewis C. Lin 是产品管理界的一个大偶像,他有很多好的技巧和建议,不仅适用于 PM 访谈,也适用于培训你的业务和产品敏锐度。他有自己的网站,你可以在那里阅读与产品管理相关的博客文章,并注册订阅他的时事通讯。
第三部分:行为面试
通用于:所有角色
行为面试侧重于你过去的经历和假设性问题,以评估你的经历和工作方式是否适合这个角色、团队和公司文化。准备这部分面试的最好方法是和一个朋友进行模拟面试,确保你对简历上的所有内容都非常熟悉。如果你被问到简历上的一个项目,而你又想不起来具体做了什么,那就不太好了。
用于行为面试的典型框架被称为 STAR(情境、任务、行动、结果)方法。根据我作为面试官的经验,很多技术人才倾向于过于关注“任务”和“行动”部分,而对“情况”和“结果”关注不够。请记住,你的面试官通常既没有时间也没有足够的背景来了解你项目的深层技术细节。确保给面试官足够的背景故事(情况),确保强调最终结果,以展示你自上而下的沟通风格和你推动结果和影响的能力。而且不要担心,如果面试官对技术细节感兴趣,他们会问的,会给你时间多讲一些。
- 的确如此——这是一个很好的常见问题列表
- 谷歌“行为问题”会给你更多的资源来准备面试的这一部分
无论你决定先关注哪一个面试话题,记住:熟能生巧。记住框架(或编码部分的语法)永远不够;知道如何应用它们是关键。
GIPHY 的 GIF 图
数据科学家的终极课程列表

数据科学最佳在线课程,按主题分类
十年前,你可能很难找到学习数据科学的在线课程。现在,你将面临一个不同的问题:网上的内容太多了,你不知道该选择什么。
在 Coursera 上搜索“数据科学”,到今天为止,你会得到近 3000 个不同的结果。势不可挡,对吧?
我从事在线课程已经很多年了,这些年来,我收集了所有好课程的清单(以及是什么让它们变得好)。在本文中,您会发现一个结构化的在线课程列表,分为 5 个主要类别,我相信它们涵盖了数据科学家/机器学习工程师应该知道的大部分内容:
- 统计数字
- 编码
- 数据分析和可视化
- 机器学习
- 数据工程/MLOps
虽然其中大多数是实际课程,但有些是专业课程(一组应该按顺序完成的课程)。你可能不会做所有的,因为所有的内容会花你几年的时间,但是你可以(也应该)挑选最适合你的。
统计数字
基本统计
这是我能在网上找到的最基础的统计学课程,将真正从零开始,例如,通过中位数和均值的概念。如果你对统计学几乎一无所知,就做这个吧。
https://www.coursera.org/learn/basic-statistics
统计学导论
本课程相当完整,将涵盖与数据科学相关的大部分统计理论。它遵循的内容与《数据科学实用统计学》这本书大致相同(如果你想看这本书的概要,这里有一篇文章)。然而,它假设你知道一些基础知识,比如标准差、均值等的公式。如果你已经有一些统计学的入门知识,我推荐这个。
https://www.coursera.org/learn/stanford-statistics
带 R 的统计
这个 R 专业也相当完整,包括从概率和推理统计到贝叶斯统计的 5 门课程。然而,有一个主要的警告:它不会教你 R,它会教你使用 R 进行统计。因此,只有在你已经熟悉 R,并且只想重温你的统计技能的情况下,才选择这门课程,否则你将会与 R 作斗争,而不是学习统计(我将在本文后面进一步讨论如何学习 R)。
https://www.coursera.org/specializations/statistics
使用 Python 进行数据科学统计
这门课程由 IBM 提供,将涵盖一些基础知识,但更多的是应用思维。由于它不会涵盖您需要的所有统计学知识,我建议您将它与之前提到的两门课程之一(“基础统计学”或“统计学导论”)一起学习。
https://www.coursera.org/learn/statistics-for-data-science-python
编码
对于编码来说,视频讲座不会有太大帮助。相反,我建议你尝试一个编码平台,比如 Codeacademy。他们有你需要的所有主要语言的编码学习课程,还有很多专门用于数据科学和数据分析的东西。他们的一些内容是免费的,但你必须为更具体的“课程”每月付费(虽然不贵,而且他们为学生提供折扣)。
https://www.codecademy.com/catalog/language/python https://www.codecademy.com/catalog/language/r https://www.codecademy.com/learn/learn-sql https://www.codecademy.com/learn/learn-git
数据分析和可视化
谷歌数据分析认证
这是由谷歌提供的专业证书,包括 8 门课程,将教你很多关于数据分析和可视化的知识,涵盖从数据准备到如何提出正确问题的主题,并以一个顶点项目结束。如果你在这个主题上只选择一个专业,这应该就是了。此外,你最终将获得谷歌颁发的专业证书。
https://www.coursera.org/professional-certificates/google-data-analytics#courses
信息可视化
由纽约大学提供的 4 门专业课程将涵盖许多对数据科学家来说可能是新的可视化概念,如使用颜色、空白空间、注释和对比。它不是关于使用一个特定的工具,而是教你如何让你的下一个数据可视化真正脱颖而出。
https://www.coursera.org/specializations/information-visualization#courses
Tableau 专家认证准备
即使作为一名数据科学家,您可能不会做很多业务报告,但您仍然可以从 BI 工具中受益,因为有两件事:以更具吸引力和互动性的方式向受众展示您的发现,以及为数据团队创建仪表板以监控模型性能。现在,深入研究具体的工具,这个 Udemy 课程将教你 Tableau 的所有基础知识,Tableau 是最常见的 BI 工具之一。这并不是一个很难学习的工具,因此通过参加本课程并练习一段时间,您将很快能够创建令人印象深刻的报告和仪表板。
https://www.udemy.com/course/tableau-specialist-certification-prep/
微软桌面商务智能培训课程
Power BI 也是数据可视化和 BI 最常用的工具之一。你只需要学习其中一个,所以选择 Power BI 或 Tableau,你应该没问题(基础或多或少是相同的,所以通过学习它们中的任何一个,你将更容易地学习任何其他新工具)。
本具体课程不会占用您太多时间,将涵盖您需要了解的 Power BI 日常使用的所有内容。
https://www.udemy.com/course/microsoft-power-bi-up-running-with-power-bi-desktop/
机器学习
斯坦福大学的机器学习
这是我上过的关于机器学习的最好的课程之一,它将深入主要的 ML 算法的细节,包括它们背后的数学。吴恩达将教你如何使用 Matlab 从头开始编写代码,我发现这既痛苦又有启发性(事实往往如此)。我极力推荐这门课程。
https://www.coursera.org/learn/machine-learning?\
构建机器学习项目
另一本是吴恩达写的,这本书将教会你在现实生活中做数据科学时非常强大的东西:如何构建你的 ML 项目。你可能知道统计、编码和算法,但是,当实际实施你的项目时,这个为期两周的课程将为你提供一个简化流程的框架,这意味着你不会再浪费时间思考下一步该做什么。考虑到它有多短,你绝对应该做这个。
https://www.coursera.org/learn/machine-learning-projects
准备谷歌云认证:机器学习工程师
这是一个相当长的专业,有 9 门课程旨在为你准备谷歌云平台(GCP) ML 工程师认证。我建议,只有当你已经是一名经验丰富的数据科学家,并且想提高你的 ML 工程技能和/或想学习如何使用 GCP 时,你才可以做这个。如果你是这种情况,你会发现这个课程很有启发性。警告:如果你没有太多的 GCP 经验,这个课程不足以通过 ML 工程师认证,你需要更多的实践经验或更多的学习才能达到目的。
数据工程和 MLOps
数据工程基础
这是 IBM 提供的 5 门基础专业课程,首先介绍数据工程,然后介绍关系数据库以及 SQL 和 Python 在数据科学中的应用。因为它将涵盖一些基本的 Python 内容(比如数据结构),如果您已经熟悉它,那么它可能有点多余。然而,您可能会从 Python APIs 和 web 废料部分以及实际项目中获得一些东西。
https://www.coursera.org/specializations/data-engineering-foundations#courses
面向生产的机器学习工程
在 4 个简短的课程中,本专业将带您了解为生产实施 ML 模型和管道的所有步骤。这是相对基础的,适合初学者,但如果你愿意动手练习,它会给你一个很好的实践概述的主题。
https://www.coursera.org/specializations/machine-learning-engineering-for-production-mlops
机器学习操作基础
MLOps 内容面向 GCP 用户,这一为期 3 周的简短课程将帮助您了解更多关于 Kubernetes、Kubeflow 和 AI 平台的信息。只有当你对 GCP 的 ML 工程感兴趣时才有用。实践练习有一些错误和问题,但总的来说,这是了解 GCP MLOps 的最佳方式。
https://www.coursera.org/learn/mlops-fundamentals
结论
如果你淹没在内容超载中,不知道从哪里开始,使用这个列表作为指南。你也可以留着以后用,当你需要某个特定主题的学习材料时再来看。
如果你喜欢这篇文章,你可能也会喜欢这些:
https://medium.com/curious/5-books-every-data-scientist-should-read-in-2021-206609d8593b
如果你想进一步讨论,请随时通过 LinkedIn 联系我,这将是我的荣幸(老实说)。
因果推理的终极文献综述

在 Unsplash 上由 Jaredd Craig 拍照
拥抱因果关系
随着最近宣布2021 年诺贝尔经济学奖,因果推理技术和基于观察数据的实证研究重新引起了研究人员的注意。公告说:
今年的获奖者——大卫·卡德、约书亚·安格里斯特和圭多·伊本斯——为我们提供了关于劳动力市场的新见解,并展示了从自然实验中可以得出什么样的因果结论。他们的方法已经扩展到其他领域,彻底改变了实证研究。
在我之前的文章中,我已经讨论了什么是因果推理,为什么我们需要因果推理,以及用于进行因果推理的方法论是什么:
受诺贝尔奖公告和研究人员开展的学术工作的激励,在本文中,我想重点介绍使用不同因果推理技术的学术背景和行业应用。因果推理在科技公司中被广泛用于支持数据驱动的决策。本文是对结合因果推理和机器学习算法的潜力的探索,将它的用例边界扩展到学术界之外。本文没有深入到技术细节,而是作为一篇高水平的文献综述,提供了更多细节的博客文章和研究论文的链接。我建议你把这篇文章加入到你的阅读清单中,并不时阅读你感兴趣的链接文章。
一般来说,我们可以将与因果推理相关的方法分为三类:
- 实验/现场研究/随机对照试验:主动将受试者随机分为对照组和治疗组,以评估治疗和目标结果之间的因果关系。随机性是确保结果可信的关键。
- 准实验:基于观察数据的因果推断。由于数据中存在有意或无意的随机性,研究人员需要在特定假设下谨慎选择方法。我将在本文中讨论不同的方法及其用例。
- 自然实验:利用自然事件,如抽奖、当月出生、移民法等,将受试者暴露给治疗组和对照组的实证研究。由于随机性主要来源于已经发生的自然事件,研究人员可以用观测数据分析因果联系。
在下面的部分中,我将详细讨论这三个类别。
第一部分:实验
1。A/B 测试
科技公司最常用的因果推断是 A/B 测试。没有什么比在用户中进行 A/B 测试更有助于营销决策。大量的资源都在辅导 A/B 测试。具体来说,请查看:
- Udacity 免费课程:谷歌 A/B 测试
- Elea MC donnell Feit 的高级 A/B 测试车间带 R 代码
- 教材:值得信赖的在线控制实验:A/B 测试实用指南
了解 A/B 测试的基本知识不足以进行实验。知道你通过实验得到的结果是否有意义和可信是很重要的。俗话说:
“糟糕的测试设计比没有设计更糟糕”
在宣布可靠的结果之前,需要关注某些方面:
- 总之,看看雷华叶博士研究员关于 A/B 测试的常见陷阱(他写了很多关于 A/B 测试的文章,在下面的章节中会有更多引用):
- 如何选择合适的样本量?这包括在运行实验之前,根据期望的置信水平、功效、效应大小和样本/总体方差,设置正确的样本大小。计算可以通过在线计算器完成。要了解更多关于样本大小如何与不同元素和背后的统计数据相关联的细节,请查看我以前的博客帖子:
- 另一个与样本量相关的问题是你应该什么时候停止实验?如果你的回答是每当我看到一个版本很重要时就停止,那么你就面临着常见的统计学错误:P-hacking。在 A/B 测试场景中,它是调用窥视:
然而,在某些情况下,提前结束实验是有可能的,请看网飞的这篇博文:
- 运行随机性检查:重要的是要知道样本是否真正随机分配,以确保我们观察到的结果差异纯粹是由治疗决定的。进行 A/A 测试是非常有用的,通过这种测试,我们给予两组相同的治疗,并期望两组的结果保持相同。查看这些博客文章,了解更多详情:
https://vwo.com/blog/aa-test-before-ab-testing/
- 网络效应:违反 SUVTA(稳定单位治疗值假设)。在进行实验时,我们假设每个用户被随机分配到不同的组,并且一个用户接受治疗不会影响其他用户的结果。这种假设使得动态定价的 A/B 测试,在收盘市场提供促销,社交媒体相关的测试没有吸引力。看看 Lyft 和 LinkedIn 是如何解决这个问题的:
https://eng.lyft.com/experimentation-in-a-ridesharing-marketplace-b39db027a66e
- 样本比例不匹配(SRM) ,当治疗组和对照组的样本比例与您的预期不符时,就会发生这种情况,通常为 50/50 的比例。这种不匹配可能是有问题的,因为它会使治疗效果产生偏差。查看这篇博文了解更多详情:
- 处理多重比较:在相同时间内进行多重比较时,出现更高假阳性率的几率要高得多。建议进行某些调整,以纠正可能导致的偏差:
https://blog.statsig.com/pitfalls-of-multi-arm-experiments-445c81ae75d
2。其他实验
A/B 测试,由于其假设,仅限于某些用例,如网页设计,用户参与度研究等。通过采用后面的类似概念,我们可以将实验扩展到许多其他应用。例如,来自 Dube 和 Misra (2017) 的论文对 ZipRecruiter 的客户进行了实验,通过向不同的客户显示不同的价格来估计他们客户的价格弹性。与使用历史数据来估计客户支付意愿的传统机器学习算法相比,现场实验给出了更可靠的结果,因为我们的目标是测量价格和数量之间的因果关系。然而,进行实地试验更费时费钱,尤其是在定价方面。当运行标准实验不可行时,我们寻求其他方法来获得可靠的结果。
第 2 部分:当实验不可能时:准实验
1。差异中的差异(DID)
当对照组和治疗组之间存在预先存在的差异时,通常使用 DID。在没有任何干预的情况下,我们利用实验前数据来控制这些基线差异。下表总结了 DID:

按作者
虽然它在经济研究论文中被广泛使用,但它在行业中越来越被认可。看看 Airbnb 的这个用例:
2。隆起建模
隆起建模是因果推理和机器学习的结合。面对防止客户流失的问题,传统的机器学习模型使用一系列特征来预测客户流失的可能性。对于相同的客户群体,在给定相同特征的情况下,提升建模衡量市场活动(待遇)对客户流失可能性的影响。具体来说,它将客户分为四类:
- 确定的事情:永远不会流失的客户
- 流失原因:一定会流失的客户
- 沉睡的狗:给予治疗(促销、广告等)的客户
- :不会流失的客户给予的待遇
提升建模有助于预测客户将属于哪个类别,以便他们可以只瞄准可说服的客户来充分利用资源。隆起建模中的资源包括:
- 快速介绍
**
- 防止流失
- 使用 python 代码
- 政治运动
- 其他更全面的资源:
3。回归不连续性(RDD):
回归不连续性是在截止点测量治疗效果,假设位于截止点附近的受试者非常相似,但被随机分配到不同的组:

作者绘制
这种方法源于一篇分析奖学金项目效果的经济研究论文。诺奖得主大卫·卡德利用 RDD,通过对比相邻的两个州:新泽西和宾夕法尼亚,分析了实施最低工资对就业的影响。在工业领域,Cohen 等人(2016 年)利用历史数据,利用 RDD 估算了优步客户的价格弹性。更多细节,请点击我的博客:
4。仪器变量
工具变量是与自变量 X 高度相关,但与因变量 y 不直接相关的变量。

作者绘制
通过测量仪器变量 Z 对结果变量 Y (Z~Y)的影响,并测量治疗 X 与 Z (ZX)的相关程度,我们可以确定(XY)之间的因果联系,而不用担心其他混淆变量。关于这种方法在科技公司的应用和更多细节,请查看 Roblox 的这篇精彩文章:
https://blog.roblox.com/2021/09/causal-inference-using-instrumental-variables/
这个教程:
https://medium.com/teconomics-blog/machine-learning-meets-instrumental-variables-c8eecf5cec95
5。合成控制:
当治疗发生在聚集水平(而不是个体水平)并且只有一个治疗病例和几个对照病例时,综合控制非常有用。这篇博文有更多的细节:
6。转回:
如上所述,当有网络效应时,我们不能在个人层面上进行实验,因为用户之间是相互影响的。在这种情况下,我们可以在更集中的级别上运行实验并在集中的级别上进行比较,或者在不同的时间在相同的市场上运行实验,或者两者兼而有之。请查看 DoorDash 的这个示例,了解更多详细信息:
7。局部平均治疗效果(后期):
局部平均处理效应是由诺贝尔奖获得者 Guido Imbens 和 Joshua Angrist 于 1994 年首先提出的。这在你无法对受试者实施治疗的情况下特别有用。例如,您可以向某些客户发送电子邮件促销,并将他们放入治疗组,但您永远无法确定他们是否打开了电子邮件并看到了促销,除非他们进行了购买。受试者可分为四组:
- 总是服用者:无论是治疗组还是对照组,总是得到治疗
- 从来不接受治疗:无论是治疗组还是对照组,总是拒绝治疗
- 编者:分配到治疗组就接受治疗,反之亦然。
- 脱网器:分配到对照组进行处理,反之亦然。
通常我们假设没有挑战者,总是接受者和从不接受者只是对称的。在我们随机分配治疗的实验中,当比较治疗组和对照组之间的结果差异时,我们只能测量意向治疗(ITT)效果,而不能测量平均治疗效果(ATE ),因为总是接受者和从不接受者的存在。在这种情况下,我们可以计算局部平均处理效果,即对编译者的处理效果:
后期= ITT/编者份额
正如经济学笑话所说:
“迟到总比没有好!”
第三部分:当实验不可能时:自然实验
自然实验是实证经济学家用来确定因果关系的技术。与临床试验或 A/B 测试不同,自然实验不将受试者分配到治疗组和对照组,并在之后收集他们的结果,它使用自然事件或研究者控制之外的其他因素。自然实验在学术界被广泛使用:
- 大卫·卡德 1990: 马里埃尔升船机对迈阿密劳动力市场的影响
- 约书亚·安格里斯特 1990: 终生收入与越战时期的征兵彩票:来自社会保障行政记录 的证据
- 安格里斯特和克鲁格 1991: 义务教育会影响上学和收入吗?
希望随着最近诺贝尔奖的公布,我们能在行业中看到更多的应用。
第四部分:关于因果推理还有什么?
将因果推理与机器学习和深度学习相结合来改进算法、估计异构治疗效果等的文献更多。,绝对在我的阅读清单上:
- 因果树和因果森林:
https://www.causalflows.com/causal-tree-learning/
- 异质处理效果:SEK hon 教授的工作
- 深度学习的因果推理:
未完待续…
仅此而已。你的阅读清单中有哪些关于因果推理的文章?下面留言评论!
感谢您阅读本文!这是我所有博客帖子的列表。如果你感兴趣的话,可以去看看!
https://zzhu17.medium.com/my-blog-posts-gallery-ac6e01fe5cc3 https://zzhu17.medium.com/membership
或者在 YouTube 上关注我:
https://youtube.com/channel/UCMs6go1pvY5OOy1DXVtMo5A **
终极机器学习产品清单
使用 7 个简单的问题来寻找机器学习的机会,即使没有任何技术知识

(照片由 马库斯·斯皮斯克、昂斯普什 )
机器学习,人工智能,数据科学都有很多可怕而复杂的概念,比如深度神经网络,交叉熵,最优化…
这些可怕的词汇足以吓跑任何产品经理,但真正精通技术的人甚至不会考虑将机器学习集成到他们的产品中。
但反过来,如果大多数产品经理不愿雇用机器学习工程师,公司就很难从他们身上获得所有价值。
我喜欢使用非常简单的清单,在我看来任何非技术产品经理 都可以使用,来发现一个商业机会是否适合机器学习。
我将用下面的例子来解释每一点。但首先,这是完整的清单。
机器学习机会清单
如果我看到一些涉及数据的东西,有点像机器学习或统计/优化,我会继续问自己四个问题。
什么造就了机器学习的机会?
- 小的改进算吗?当有事情发生时,你的机会有回报吗?
- 它包括“总是同样的东西”吗?有人必须一次又一次地做同样的事情吗?机器通过长的 if-then 语句工作吗?对于机器的“如果-那么”故障,是否有手动解决方法?
- 机会需要专家知识吗?机会需要个性化吗?
- 由于一些手动瓶颈,该机会是否涉及扩展问题?背后的数据是指数级增长吗?
一个“是”就足以确定一个机会!
但是这里有一个问题:这些机会中的一些有一些吸盘属性,使它们绝对不适合数据科学。我喜欢认为第一个问题能给我带来“苹果”。而接下来的四个问题帮助我扔掉“坏苹果”。所以我继续问这三个问题。
什么会破坏机器学习的机会?
- 需要 99%还是 100%的准确率?需要非常精确吗?
- 这个问题可以用简单的 if-then 来解决吗?
- 只有少量数据吗?或者其他数据问题,比如隐私问题?
一个“不”已经足够识别一个坏苹果了!
机器学习机会制造者的细节
让我们通过例子一步一步地介绍它们。
(1)小的改进算吗?
当机会接近某种“转换”时,小的改进通常具有商业价值。靠近一些关键的“北极星”度量事件或类似事件。小的改进很重要,如果它们仍然有很大的商业价值的话。
例如,YouTube 北极星指标在相当长一段时间内是“观看视频的分钟数”。因此,在推荐新视频的推荐系统中,任何 1-10%的改进都会直接增加北极星指标;所以所有接近这个的改进都是机器学习机会。
另一个几乎任何公司都能想出的例子是优化利润,无论你在实际生产价格之外销售什么。任何微小的百分比增加都会产生相当多的钱。
(2)是否涉及“总是同样的东西”?
涉及“总是相同的东西”的事情通常会产生由简单的机器学习模型解决的机会。
简单的机器学习模型意味着模型并不完美,但只有 80%的准确性。这个问题背后的想法是,这通常比产生 90%准确性的模型容易 10 倍。是的,我知道,准确性是一个糟糕的指标,但我希望它能说明问题。
此外,涉及“总是相同的东西”的东西也会产生数据,而这些数据是训练任何模型所迫切需要的。
一个几乎经典的例子是整理客户的电子邮件。客户的电子邮件通常被分类成一堆按主题分组的“堆栈”,以便客户服务人员可以相应地处理它们。这要么完全手动完成,要么通过一些简单的如果…那么…在一些“电子邮件路由器”中实现的决策。
例如,优步用简单的模型和他们内部的机器学习工具解决了这个问题,这个工具使用起来非常简单。这一成功显然促使他们围绕它创建了一个完整的机器学习强大工具,名为 COTA,已经进入第 2 版。
(3)专家知识和/或个性化?
涉及到“专家知识”的东西通常意味着手工技术劳动。优步的客户服务支持工具 COTA 被扩展来做这件事。在“分拣邮件”之后,他们发现了第二个机器学习机会:客户支持需要的专业知识,然后回复邮件。
因此,他们使用 NLP 和其他一些机器学习魔法来建议预回复&对一个进来的问题的一堆可能的答案进行排名,然后客户服务可以使用和修改这些答案。
另一个例子可以在比较网站上找到。他们通常需要对上传的图像进行分类,并检查它们是否“好看”。为了做到这一点,人类必须看大量的图像,然后形成对什么是什么的理解(是的,专家,因为人类实际上无法区分狗和猫!)以及哪些好看哪些不好看。
德国比较公司 Idealo 在 2019 年将这项任务部分转移到机器学习上,现在可以在他们的引擎中使用这些结果。
个性化非常适合这种情况,因为个性化真的只是对某人的客户有一个专业的理解,因此,例如在电子邮件中向适当的客户群显示正确的广告材料&产品。这也是几乎任何营销自动化标准机器学习套件中都有的任务。
(4)手动瓶颈?
手动瓶颈随处可见。如今,软件很容易扩展,但人们通常不会。因此,快速增长的公司的首要任务是找出人工瓶颈,并用技术取代它们,即使技术有时在这项任务上比人类做得更差。
作为交换,尽管我们达到了人类瓶颈根本不可能达到的规模。
客户服务的例子在某种程度上也属于这一类,但我想再举一个:Automattic 公司的创始故事,WordPress 背后的盈利实体为大约 30%的互联网网站提供动力,大概是这样的:马特·莫楞威格,不断编写半衰期越来越短的反垃圾邮件系统。原来垃圾邮件发送者越来越快地得到了他。
原来,马特是一个人的瓶颈。很明显,他意识到他需要用一台机器来取代人类的瓶颈。于是插件 Akismet 和 Automattic 公司诞生了。
机器学习机会断路器的细节
让我们来看看那些破坏了我们目前所发现的机会的事情,从我们的苹果篮子里扔掉坏苹果。
(1)是否需要高精度?
机器学习可以实现高精度。在某些情况下,机器甚至比人类专家更准确。但是有一个警告:高精度比好精度贵得多,好精度比平均精度贵得多。
好消息是,在大多数情况下,你实际上不需要很高的精度。向几个客户发送两次电子邮件的成本通常很低。显示错误的广告(通常)也是如此。
但是将收到的钱分类到正确的账户上实际上应该是非常准确的事情!
所以问问你自己,“如果这件事有 10-20%的时间出错,这样可以吗?”。如果不是,那么很可能不值得。如果是这样的话,您可以以 80%的准确率构建第一次迭代,并且在以后还会增加准确率,但是您的成本要高得多。
(2)做简单的如果——那么做工作?
每个公司都想建立一个庞大而昂贵的推荐引擎。然而,作为一个产品经理,你应该总是首先评估更简单的“如果-那么”类型的选择。
首先是手工推荐。如果你的客户群是同质的,并且只购买前 10 名购买的产品,那么也许在每篇文章下面和主页上显示一个手写的“畅销”列表就可以很好地完成这项工作。
另一方面,如果手工制作在价值/成本规模上没有很好的比较,那么你仍然可以考虑做一个类似“本类别最畅销”或“当日最畅销”的非机器学习产品。每个开发团队都可以构建这样的功能,不需要专门的机器学习工程师。
只有你觉得这两个东西真的不行,你才应该去看看机器学习推荐引擎。好处是,一旦你真的建立了一个真正的推荐引擎,你就有了一个比较基准和大量的点击率等数据。
(3)是否只有少量数据?
不管人们怎么想,尽管当然有针对小数据集的机器学习技术,但从产品经理的角度来看,你必须做显而易见的事情,那些不会给项目增加很大不确定性或成本的事情。
因此,如果您的机会没有产生数据或只有很少的数据,那么就去别处看看。除此之外,产生数据很少的机会通常首先需要“别的东西”。如果你对通过机器学习帮助分拣实际的物理邮件感兴趣,通过 ocr 识别然后分拣,只有两种可能的原因导致数据很少。
一个是,无论你的目标是什么,都不会经常使用,在这种情况下,在那里进行任何机器学习的商业价值可能都很低。如果目前只有很少的邮件被光学字符识别,人们也不会考虑以后对其进行数字化分类,这可能是因为不需要它。
或者它正在使用中,但没有生成数据。如果有大量的物理邮件,但还没有人建立 OCR 流程,那么第一步应该是建立 OCR 流程,使人们能够以数字方式对邮件进行分类,并检查这是否已经产生了改进。
轮到你了
现在轮到你挖掘身边所有的机会和项目了。有苹果吗?如果是的话,你确定这不是一个坏苹果吗?
希望有帮助!
终极降价备忘单
写一篇精彩的自述

克里斯托夫·高尔在 Unsplash 上拍摄的照片
W 帽子降价了?Markdown 是一种使用纯文本格式语法编写富文本(格式化文本)内容的方式。从这篇文章中,你将了解到 Markdown 的所有主要命令,这些命令将帮助你创建一个令人敬畏的 GitHub 自述文件。我将谈论 11 个最常用的降价话题。我还提到了不同的方法,比如使用 HTML 标记来设计自述文件的样式。如果你有兴趣,可以看看 GitHub 上的 HTML 白名单。
你可以从我的 GitHub 库下载我在这篇文章中讨论的所有内容。下面我有一个目录,这样你可以很容易地浏览这篇文章。
标题
文本样式
语法高亮显示
对齐方式
表格
链接
图片
列表
按钮(2023 年 1 月 6 日)
横线
图表(图
标题
创建标题有几个选项。我们可以使用 Markdown、HTML 或其他语法来创建我们想要的标题。
首先,我们来谈谈 markdown 语法。
# Heading 1
## Heading 2
### Heading 3
#### Heading 4
##### Heading 5
第二个选项使用 HTML 语法。
<h1>Heading 1</h1>
<h2>Heading 2</h2>
<h3>Heading 3</h3>
<h4>Heading 4</h4>
<h5>Heading 5</h5>
最后,我们可以使用另一种语法。此方法仅适用于标题 1 和标题 2。在标题 1 或标题 2 的文本下方添加任意数量的=或-。
Heading 1
=
Heading 2
-
现在,让我们看看它在 GitHub 上是什么样子的。

标题
文本样式
使用 markdown 语法,我们可以改变文本的样式,包括粗体、斜体、块引号、等宽、下划线、删除线、方框、下标和上标。
我们可以使用两个星号(**)、下划线(__)或一个 HTML 标签<strong>来使文本加粗。为了使文本倾斜,我们可以使用一个星号(*)、下划线(_)或一个 HTML 标签<em>。此外,我们可以使文本同时加粗和倾斜。
Bold
**The quick brown fox jumps over the lazy dog.**
__The quick brown fox jumps over the lazy dog.__
<strong>The quick brown fox jumps over the lazy dog.</strong>
Italic
*The quick brown fox jumps over the lazy dog.*
_The quick brown fox jumps over the lazy dog._
<em>The quick brown fox jumps over the lazy dog.</em>
Bold and Italic
**_The quick brown fox jumps over the lazy dog._**
<strong><em>The quick brown fox jumps over the lazy dog.</em></strong>
现在,让我们看看它在 GitHub 上是什么样子的。



粗体和斜体文本样式
要创建块引用,我们可以使用大于号>。我们可以创建单行或多行批量报价。此外,块引号内的块引号。我们可以在块引用中添加其他文本样式,例如粗体或斜体文本样式。
Blockquotes
> The quick brown fox jumps over the lazy dog.
> The quick brown fox jumps over the lazy dog.
>
> The quick brown fox jumps over the lazy dog.
>
> The quick brown fox jumps over the lazy dog.
> The quick brown fox jumps over the lazy dog.
>> The quick brown fox jumps over the lazy dog.
>>> The quick brown fox jumps over the lazy dog.
> **The quick brown fox** *jumps over the lazy dog.*
现在,让我们看看它在 GitHub 上是什么样子的。

块引号文本样式
我们可以使用 HTML 标签<samp>和<ins>实现等宽和带下划线的样式。对于删除线样式,我们可以使用两个蒂尔达符号~~。
Monospaced
<samp>The quick brown fox jumps over the lazy dog.</samp>
Underlined
<ins>The quick brown fox jumps over the lazy dog.</ins>
Strike-through
~~The quick brown fox jumps over the lazy dog.~~
现在,让我们看看它在 GitHub 上是什么样子的。



等宽、下划线和删除线文本样式
我们可以使用一个 HTML <table>标签来创建一个盒子。
Boxed
<table><tr><td>The quick brown fox jumps over the lazy dog.</td></tr></table>
现在,让我们看看它在 GitHub 上是什么样子的。

方框文本样式
我们可以使用 HTML 标签<sub>和<sup>实现下标和上标样式。当你写一个数学公式时,它是有用的。
2 <sup>53-1</sup> and -2 <sup>53-1</sup>
现在,让我们看看它在 GitHub 上是什么样子的。

下标和上标文本样式
Subscript <sub>The quick brown fox jumps over the lazy dog.</sub>
Superscript <sup>The quick brown fox jumps over the lazy dog.</sup>
现在,让我们看看它在 GitHub 上是什么样子的。

下标和上标文本样式
语法突出显示
我们可以在代码块前后使用一个反勾```来创建下面的视图。
A class method is an instance method of the class object. When a new class is created, an object of type `Class` is initialized and assigned to a global constant (Mobile in this case).
如你所见,单词 Class 被高亮显示。

代码突出显示
我们也可以在代码块前后使用三个反斜线`````来创建下面的视图。
public static String monthNames[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};

代码突出显示
我们可以添加一个可选的语言标识符来突出显示语法。参考这个和这个 GitHub 文档找到所有有效的关键字。
```java
public static String monthNames[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
现在,让我们看看它在 GitHub 上是什么样子的。

语法突出显示
# 联盟
通过使用 HTML 标签,我们可以调整自述文件的内容。

左对齐
<p align="center">
<img src="https://images.unsplash.com/photo-1415604934674-561df9abf539?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=2772&q=80" width="100" height="100" border="10"/>
</p>

居中对齐
<p align="right">
<img src="https://images.unsplash.com/photo-1415604934674-561df9abf539?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=2772&q=80" width="100" height="100" border="10"/>
</p>

右对齐
现在,让我们对齐文本。
<h3 align="center"> My latest Medium posts </h3>

居中对齐
桌子
让我们创建一个没有标题的表格。
<table>
<tr>
<td width="33%">
The quick brown fox jumps over the lazy dog.
</td>
<td width="33%">
The quick brown fox jumps over the lazy dog.
</td>
<td width="33%">
The quick brown fox jumps over the lazy dog.
</td>
</tr>
</table>

没有标题的表格
要创建带有标题的表格,我们需要使用破折号来分隔每个标题单元格,并使用管道来分隔列。外部管道是可选的。我们可以使用任意数量的破折号和空格来增加可读性。我们可以用冒号来对齐列。对于左对齐文本,在破折号的左侧使用冒号。对于居中对齐的文本,在破折号的两侧使用冒号。对于右对齐文本,在破折号右侧使用冒号。默认情况下,使用左对齐。
| Default | Left align | Center align | Right align |
| - | :- | :-: | -: |
| 9999999999 | 9999999999 | 9999999999 | 9999999999 |
| 999999999 | 999999999 | 999999999 | 999999999 |
| 99999999 | 99999999 | 99999999 | 99999999 |
| 9999999 | 9999999 | 9999999 | 9999999 |
| Default | Left align | Center align | Right align |
| ---------- | :--------- | :----------: | ----------: |
| 9999999999 | 9999999999 | 9999999999 | 9999999999 |
| 999999999 | 999999999 | 999999999 | 999999999 |
| 99999999 | 99999999 | 99999999 | 99999999 |
| 9999999 | 9999999 | 9999999 | 9999999 |
Default | Left align | Center align | Right align
---------- | :--------- | :----------: | ----------:
9999999999 | 9999999999 | 9999999999 | 9999999999
999999999 | 999999999 | 999999999 | 999999999
99999999 | 99999999 | 99999999 | 99999999
9999999 | 9999999 | 9999999 | 9999999

不同对齐方式的表格
现在并排显示两个表格。
<table>
<tr>
<th>Heading 1</th>
<th>Heading 2</th>
</tr>
<tr>
<td>
| A | B | C |
|--|--|--|
| 1 | 2 | 3 |
</td><td>
| A | B | C |
|--|--|--|
| 1 | 2 | 3 |
</td></tr> </table>

并排显示两个表格
让我们使用 HTML <br/>标签创建一个包含多行的表格。
| A | B | C |
|---|---|---|
| 1 | 2 | 3 <br/> 4 <br/> 5 |

多行表格
两张桌子并排的另一个例子。
<table>
<tr>
<th>Before Hoisting</th>
<th>After Hoisting</th>
</tr>
<tr>
<td>
<pre lang="js">
console.log(fullName); // undefined
fullName = "Dariana Trahan";
console.log(fullName); // Dariana Trahan
var fullName;
</pre>
</td>
<td>
<pre lang="js">
var fullName;
console.log(fullName); // undefined
fullName = "Dariana Trahan";
console.log(fullName); // Dariana Trahan
</pre>
</td>
</tr>
</table>

并排显示两个表格
链接
我们可以用四种方法创建链接。第一种是使用内嵌样式。第二个使用引用样式,第三个使用相对链接,最后是自动链接。
[The-Ultimate-Markdown-Cheat-Sheet](https://github.com/lifeparticle/Markdown-Cheatsheet)

内嵌样式
如果你不止一次地使用同一个链接,那么使用引用风格将是有益的,因为你不必每次都写链接,而且更新链接也很容易。此外,您可以使用数字作为参考文本。此外,您可以使用参考文本作为链接文本。
[The-Ultimate-Markdown-Cheat-Sheet][reference text]
[The-Ultimate-Markdown-Cheat-Sheet][1]
[Markdown-Cheat-Sheet]
[reference text]: https://github.com/lifeparticle/Markdown-Cheatsheet
[1]: https://github.com/lifeparticle/Markdown-Cheatsheet
[Markdown-Cheat-Sheet]: https://github.com/lifeparticle/Markdown-Cheatsheet

参考文体的三种变体
我们也可以用所有相对链接操作数创建相对链接,比如./和../。
[Example of a relative link](rl.md)

相对链接的示例
GitHub 可以自动从标准 URL 创建链接。
Visit https://github.com/

自动链接
形象
我们可以使用与链接类似的技术来添加图像。


内嵌样式
![alt text][image]
[image]: https://images.unsplash.com/photo-1415604934674-561df9abf539?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=100&q=80

参考风格
此外,我们可以使用 HTML img标签来添加图像。
<img src="https://images.unsplash.com/photo-1415604934674-561df9abf539?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=2772&q=80" width="100" height="100" border="10"/>

img 标签
我们也可以嵌入 gif 和 SVG。
<img src="https://media.giphy.com/media/qLHzYjlA2FW8g/giphy.gif" />

GIF 格式
<img src="https://img.shields.io/badge/theultimatemarkdowncheatsheet-brightgreen.svg" />

挽救(saving 的简写)
列表
对于列表,我们可以有有序列表和无序列表。
1\. One
2\. Two
3\. Three

有序列表
现在让我们创建一个包含子项的有序列表。
1\. First level
1\. Second level
- Third level
- Fourth level
2\. First level
1\. Second level
3\. First level
1\. Second level

带有子项的有序列表
要创建一个无序列表,我们可以用星号、加号或减号。
* 1
* 2
* 3
+ 1
+ 2
+ 3
- 1
- 2
- 3

无序列表
现在让我们创建一个带有子项的无序列表。
- First level
- Second level
- Third level
- Fourth level
- First level
- Second level
- First level
- Second level

带有子项的无序列表
我们也可以使用 HTML 来创建一个列表。
<ul>
<li>First item</li>
<li>Second item</li>
<li>Third item</li>
<li>Fourth item</li>
</ul>

使用 HTML 的列表
现在让我们创建一个任务列表。我们可以使用连字符后跟[ ]来创建一个任务列表,为了标记任务完成,在括号内放一个x。
- [x] Fix Bug 223
- [ ] Add Feature 33
- [ ] Add unit tests

任务列表
按钮(2023 年 1 月 6 日)
我们可以添加按钮来描述键盘快捷键。
<kbd>cmd + shift + p</kbd>

纽扣
<kbd> <br> cmd + shift + p <br> </kbd>

带空格的按钮
<kbd>[Markdown-Cheatsheet](https://github.com/lifeparticle/Markdown-Cheatsheet)</kbd>

带链接的按钮
[<kbd>Markdown-Cheatsheet</kbd>](https://github.com/lifeparticle/Markdown-Cheatsheet)

带链接的按钮
水平标尺
我们可以使用三个连字符、星号或下划线来创建一条水平线。
---
***
___

水平标尺
图表(2022 年 7 月 19 日)
您现在可以使用 Mermaid 来包含图表。它支持流程图、序列图、甘特图、类图、状态图、饼图、用户旅程图等图表。这是一个饼图的例子。阅读更多关于 GitHub 的信息。
```mermaid
pie
"Movies" : 80
"TV shows" : 20

圆形分格统计图表
# 数学表达式(2022 年 7 月 19 日)
您现在可以使用 [mathjax](https://www.mathjax.org/) 来包含图。你可以在 [GitHub](https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/writing-mathematical-expressions) 上了解更多。我们可以使用`$`符号显示内联,使用`$$`符号显示数学表达式。下面是一个内联数学表达式的示例:
This is an inline math expression \(x = {-b \pm \sqrt{b^2-4ac} \over 2a}\)

内嵌数学表达式
下面是一个数学表达式块的例子:

作为块的数学表达式
# 多方面的
我们可以在一个`.md`文件中包含注释。
我们可以使用反斜杠来转义文字字符。在逃跑之前。
- Asterisk
\ Backslash
` Backtick
{} Curly braces
. Dot
! Exclamation mark
Hash symbol
- Hyphen symbol
() Parentheses
- Plus symbol
[] Square brackets
_ Underscore

逃跑前
逃脱后。
* Asterisk
\ Backslash
` Backtick
{} Curly braces
. Dot
! Exclamation mark
# Hash symbol
- Hyphen symbol
() Parentheses
+ Plus symbol
[] Square brackets
_ Underscore

逃跑后
我们还可以在我们的`.md`文件中包含[表情符号](https://gist.github.com/rxaviers/7360908)。
:octocat:

章鱼表情符号
我们可以通过键入`@`和他们的用户名或团队名称来提及一个人或团队。
@lifeparticle

提及某人
我们还可以通过键入`#`在存储库中调出一个建议问题和拉请求的列表。

参考问题和拉式请求
# 比特桶
Bitbucket 支持 [READMEs](https://bitbucket.org/tutorials/markdowndemo/src/master/) 的降价。另外,[创建一个目录](https://support.atlassian.com/bitbucket-cloud/docs/add-a-table-of-contents-to-a-wiki/)。
# Azure DevOps 项目 wiki
Azure DevOps 支持对[项目 wiki](https://learn.microsoft.com/en-us/azure/devops/project/wiki/markdown-guidance?view=azure-devops) 的降价。
# 工具
有各种各样的 Markdown 工具可以帮助你更快地构建一个漂亮的 GitHub 自述文件。
1. 创建一个内容减价表— [GitHub](https://github.com/ekalinin/github-markdown-toc)
2. 创建一个空的减价表— [表生成器](https://www.tablesgenerator.com/markdown_tables)
3. 将 Excel 转换为降价表— [表转换](https://tableconvert.com/)
4. Sublime Text 3 的降价预览— [Packagecontrol](https://packagecontrol.io/packages/MarkdownPreview)
5. 降价预览 Visual Studio 代码— [Marketplace](https://marketplace.visualstudio.com/items?itemName=shd101wyy.markdown-preview-enhanced)
恭喜你!现在你知道如何为你的下一个项目创建一个精彩的自述文件了。我希望你学到了新东西。现在来看看 GitHub 的官方文档。编码快乐!
# NLP 中的终极性能指标
> 原文:<https://towardsdatascience.com/the-ultimate-performance-metric-in-nlp-111df6c64460?source=collection_archive---------0----------------------->
## 再也不用担心语言模型的准确性了

Wynand van Poortvliet 在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄的照片
M 当我们处理语言的时候,衡量我们模型输出的结果变得更加复杂。
对于许多基于自然语言处理的问题来说,这一点很快就变得非常清楚——在处理语言摘要或翻译时,我们如何测量基于语言的序列的准确性?
为此,我们可以使用面向回忆的替角进行 Gisting 评估(ROUGE)。幸运的是,这个名字看起来很复杂——非常容易理解,甚至更容易实现。
让我们直入主题吧。
Contents****> What is ROUGE
- ROUGE-N
- Recall
- Precision
- F1 Score
- ROUGE-L
- ROUGE-S
- Cons> In Python - For Datasets
# 胭脂是什么
ROUGE 实际上是一组指标,而不仅仅是一个指标。我们将从 ROUGE-N 开始,介绍最有可能使用的主要产品。
## 胭脂
ROUGE-N 测量我们的模型生成的文本和“参考”之间匹配的“n-grams”的数量。
n 元语法只是一组标记/单词。一元语法(1-gram)由一个单词组成。二元模型(2-gram)由两个连续的单词组成:
该引用是一个人为的最佳输出——因此对于自动摘要来说,它将是我们输入文本的一个人为的摘要。对于机器翻译,它将是我们输入文本的专业翻译。
对于 ROUGE-N,N 表示我们正在使用的 N 元语法。对于 ROUGE-1,我们将测量模型输出和参考之间的单字匹配率。
ROUGE-2 和 ROUGE-3 将分别使用二元模型和三元模型。
一旦我们决定使用哪一个 N——我们现在决定是否要计算 ROUGE 召回率、精确度或 F1 分数。
## 回忆
**recall** 统计在模型输出和引用中发现的重叠 n 元语法的数量——然后将这个数量除以引用中 n 元语法的总数。看起来是这样的:

用简单英语(上图)和简化符号(下图)计算单个样本的 ROUGE-N 召回指标
这对于确保我们的模型能够**捕获引用中包含的所有信息**很有帮助,但对于确保我们的模型不仅仅是推出大量的单词来匹配召回分数来说,这就没那么好了:

我们的模型可以输出我们词汇表中的每一个单词,并且每次都能得到一个完美的回忆分数
## 精确
为了避免这种情况,我们使用**精度**指标,其计算方法几乎完全相同,但我们不是除以**参考** n 克数,而是除以**模型** n 克数。

因此,如果我们将它应用到前面的例子中,我们得到的精度分数仅为 **43%** :

## f1-分数
现在我们既有了召回值又有了精度值,我们可以用它们来计算我们的 ROUGE F1 分数,如下所示:

让我们再次将它应用到我们之前的例子中:

这为我们提供了模型性能的可靠度量,它不仅依赖于模型捕获尽可能多的单词(回忆),还依赖于不输出不相关的单词(精度)。
## 胭脂-L
ROUGE-L 测量我们的模型输出和参考之间的最长公共子序列(LCS)。这意味着我们计算两者之间共享的最长令牌序列:

这里的想法是,共享序列越长,表明两个序列之间越相似。我们可以像以前一样应用我们的召回和精度计算——但是这次我们用 **LCS** 替换**匹配**:

我们的 LCS 召回计算

精度基本相同,但是我们将总的 n-gram 计数从引用切换到模型

最后,我们像之前一样计算 F1 分数
## 胭脂-S
我们要看的最后一个 ROUGE 度量是 ROUGE-S——或 skip-gram 并发度量。
现在,这个指标似乎比 ROUGE-N 和 ROUGE-L 已经介绍过的要少得多——但是了解它的作用是值得的。
使用 skip-gram 度量允许我们从参考文本中搜索连续的单词,这些单词出现在模型输出中,但是被一个或多个其他单词分隔开。
因此,如果我们采用二元模型“the fox ”,我们最初的 ROUGE-2 度量只有在模型输出中找到这个确切的序列时才会与之匹配。如果模型输出的是“棕色狐狸”,那么就找不到匹配。
ROUGE-S 允许我们在 n-gram 匹配中增加一定程度的宽大。对于我们的二元模型示例,我们可以使用 skip- **bi** gram 度量进行匹配:

我们计算召回率就像我们对 ROUGE-N 做的一样——但是我们对匹配之间出现的任何单词进行了宽大处理

这同样适用于我们的精度指标
在计算了召回率和精确度之后,我们也可以像之前一样计算 F1 的分数。
## 骗局
ROUGE 是一个很好的评估指标,但是也有一些缺点。特别是,ROUGE 并不迎合具有相同意思的不同单词——因为它测量的是句法匹配而不是语义。
因此,如果我们有两个意思相同的序列,但使用不同的词来表达这个意思,它们可以被分配一个低的胭脂分数。
这可以通过使用几个参考文献并取平均分数来稍微抵消,但这不会完全解决问题。
尽管如此,对于评估机器翻译和自动摘要任务来说,这是一个很好的指标,并且在两者中都很受欢迎。
# 在 Python 中
幸运的是,由于有了 [Python rouge 库](https://github.com/pltrdy/rouge),用 Python 实现这些指标非常容易。
我们可以通过 pip 安装库:
pip install rouge
根据参考对我们的模型输出进行评分就像这样简单:
`get_scores`方法返回三个指标,使用一个词元(ROUGE-1)和一个词元(ROUGE-2)的 ROUGE-N 和 ROUGE-L。
对于其中的每一个,我们接收 F1 分数`f`、精度`p`和召回`r`。
## 对于数据集
通常,我们会为一组预测和引用计算这些指标——为此,我们将预测和引用分别格式化为预测和引用列表——然后我们将`avg=True`参数添加到`get_scores`,如下所示:
这就是本文关于理解和实现用于测量自动摘要和机器翻译任务性能的 ROUGE 指标的全部内容。
我希望你喜欢这篇文章,如果你有任何问题或建议,请通过 [Twitter](https://twitter.com/jamescalam) 或在下面的评论中告诉我!如果你对更多类似的内容感兴趣,我也会在 YouTube 上发布。
感谢阅读!
# 参考
C.林, [ROUGE:一个自动评估摘要的软件包](https://www.aclweb.org/anthology/W04-1013.pdf) (2004),ACL
[🤖带变压器的 NLP 课程](https://bit.ly/nlp-transformers)
**除另有说明外,所有图片均出自作者之手*
# 人工智能应该更像人类的不可避免的原因
> 原文:<https://towardsdatascience.com/the-unavoidable-reason-why-ai-should-be-more-human-50e06ae21ee0?source=collection_archive---------20----------------------->
## 人工智能|观点
## 即使这迫使我们面对可怕的未来。

马修·费雷罗在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上的照片
人工智能已经是一种先进的技术,但它可能会进化,直到它成为一个新的物种。我们称它为*智人机器*。
在 40 年代和 50 年代,科学家们对计算机和大脑产生了兴趣。认知科学和计算机科学是充满希望的新生领域,它们开启了有趣的研究可能性:控制论、人工神经网络、神经科学、人工智能……略微不同的领域来自同一个地方,但走向截然不同的未来。
一些科学家选择了认知科学,将人类作为他们研究的核心。他们认为首要任务是理解我们的大脑以及生物智能和意识的基础。
其他人认为有可能用人类的认知能力建造一个电子大脑。对他们来说,理解大脑排在第二位,不再需要遵循生物学的足迹。为什么我们会认为我们只能通过自然的途径获得智慧?生物智能被印在碳生命形式中,但用硅创造人工智能没有明显的限制。
然而,他们忽略了一个关键问题:如果我们实现了这个目标,我们的社会会发生什么?如果我们智人试图与我们的硅基同行 machina sapiens 共存,我们的文明会发生什么?
# AI 应该模仿人类生物吗?永恒的争论
大多数人工智能专家同意,人工智能既不能复制人脑,也不能完全抛弃我们的进化遗传。但是在这个协议中有分歧。没有人知道如何继续构建越来越智能的人工智能,或者如何克服深度学习的瓶颈。AI 可以很好地完成狭窄的任务,但不能概括大部分内容。它不能像我们一样推理、计划或与世界互动。这是一个很容易被攻击的目标,没有人会上当。
因为我们不知道哪条路径是正确的,所以有很多*可能的*路径。
一方面,深度学习的倡导者辩护说,我们不需要盲目地遵循生物学。他们认为基于神经网络的人工智能是获得普通人工智能的唯一途径。在去年接受《麻省理工科技评论》采访时,杰弗里·辛顿说:“我确实相信深度学习将能够做任何事情。”事实是,十年的深度学习成功支持了这些说法。从 AlexNet 到 AlphaZero,再到 GPT-3,深度学习一次又一次地重申了它在人工智能领域的统治地位。
他们相信深度学习是通往 AGI 的道路,即使它需要一些突破。自我监督学习和 transformer 架构是支持这一观点的最新论据,但还有其他不太令人信服的方面。在[发表在去年*科学*杂志上的一项研究](https://science.sciencemag.org/content/367/6473/83)中,Yiota Poirazi 和她的团队发现生物神经元甚至比我们之前认为的更复杂,而人造神经元是在假设生物神经元是“基础数学的哑计算器[的情况下构建的](https://bdtechtalks.com/2020/01/20/neuroscience-artificial-intelligence-synergies/)
另一方面,这也是为什么有人说 AI 是*与众不同的*。它不同于其他技术,因为它试图解决最复杂的挑战。人脑[被认为](https://www.bbc.com/news/uk-scotland-18233409)是“宇宙中最复杂的东西”,这并非空穴来风我们的大脑是我们想要构建的唯一实例,记住这一点似乎是合理的。
更成问题的是,我们不了解大脑,正如教授罗宾·默里爵士所预言的,“我们将无法了解。”对于其他技术,我们可以提取我们试图建模的事件背后的潜在规律和原则。飞机不会像鸟一样飞,但它们确实遵循空气动力学和流体动力学的物理定律。我们还不能为大脑做这些,因为神经科学还不够成熟。
出于这些原因,像加里·马库斯这样的人认为我们应该研究人类的大脑。“我们需要从自然中获取灵感”以在人工智能领域走得更远。加里·马库斯为人工智能的混合模型方法辩护。他声称,我们应该将深度学习的力量与更古老的范式整合起来,如符号人工智能。数据驱动和知识驱动的人工智能系统结合起来可能比其各部分的总和更有能力。
深度学习系统不像我们的大脑那样学习、观察或处理。进化给了我们各种各样的先天结构,使我们更容易与我们的世界互动。为什么不给人工智能灌输这些?否则,深度学习系统可能无法开发像常识推理、自我学习或建立世界心理模型这样的能力。
辩论的双方都持有强有力的论点,但似乎没有人注意到更大的画面。从生物学角度思考不足以解决社会困境。让我们回到我之前提到的那个缺失的问题:如果我们假装最终生活在一个跨物种的社会中,难道不是很明显我们应该让 AI 更像人,即使这是次优的解决方案吗?
# 一个社会兼容的人工智能应该是我们的首要任务
从严格的技术角度来看,上述争论是有意义的。创造新技术的最佳途径是什么?在哪个点上——或者在哪些方面——我们应该停止/开始复制生物学?这些问题的问题在于它们是一维的,而世界是多维的。科学和技术关心的是理解现实,创造有用的解决方案来改善我们的福祉,但它们仅限于此。
社会层面呢?如果我们考虑到这一挑战的心理学和社会学方面,很明显我们至少必须遵循生物学。也许对今天的“人工智能”系统来说不是。但如果我们试图构建类似人类的人工智能,这将是一个必要条件。
让我们思考一下这个问题。我们的目标是创造人类水平的智能实体。这不同于建造我们可以在一天结束后关掉的机器。人类级别的 AI 会发展意识吗?我们将如何与这些实体互动?AGI 会更像我们的智能手机还是我们的兄弟姐妹?我们是希望人工智能拥有人形形态,还是应该冒着疏远它们的风险最大化效用?
流行文化已经在许多场合探讨了这些问题。从最近的电影《T2》、《T3》或《T4》、《玛奇纳》、《T5 》,到旧书《我》、《机器人》、《T7》或《2001:太空漫游》。如果我们最终进入一个我们希望 AI 成为我们生活中有意识的一部分的时期,照顾这些方面是至关重要的。
然而,这并不容易。当今社会,当一个人感到与另一个人疏远时,会发生什么?意识形态、种族、宗教或性别的差异是一些最常见的人类冲突的原因。看似无害的失调会助长人性最野蛮的一面。
非人类的人工智能会离我们很远,任何其他人类都会感觉像家人一样。相比之下,任何人为的错位都可以忽略不计。作为个人和社会,我们如何适应一个新的、同样有能力的物种?
“我们应该遵循生物学吗?”现在感觉很肤浅。在这个层次的对话中,它忽略了要点。这场辩论应该围绕如果我们创造了一个最终与我们在社会上不兼容的人工智能,我们将面临的后果。在这个讨论中的任何一点上,我们都应该把人们的福祉放在功利之上。
我们应该在人工智能中注入生物学——以及心理学和社会学——的特征,只要我们的目标是让它们变得普遍智能。
# 情绪化人工智能的危险
但是我们不能忽视其中的风险。复制生物学意味着向人工智能灌输情感和动机,这被认为是最危险的途径之一。情绪和驱动力是我们对自己和他人造成伤害的主要原因。然而,如果我们希望人工智能像我们一样,情感就不能被排除在外。那么我们应该回答的问题是,“一个有情感的人工智能真的能超越并伤害我们吗?”
> “要接管世界,机器人就得想办法;他们必须有侵略性,有野心,并且不满足于暴力牛排。目前,根本没有理由制造具有情感状态的机器人。”— *加里·马库斯*
在他的书 [*重启人工智能*](https://www.goodreads.com/en/book/show/43999120-rebooting-ai) 中,加里·马库斯观察到智能并不能让人工智能逃脱我们的控制。这不是能力的问题,而是动力的问题。正如史蒂芬·平克所解释的,“智力是运用新方法来达到目标的能力。但目标与智力无关:聪明并不等同于想要某样东西。”
想要东西的人工智能是潜在地想要我们不希望它想要的东西的人工智能。如果一个人工智能决定它的主要目标与它当前的情况不一致,并突然产生一种未经我们同意改变某些东西的动机,会发生什么?
鉴于我们也在做同样的事情,这并非不可能。进化造就了我们这个物种。但是我们作为个体想要的往往与生存不一致。我们是愿意永远被束缚着生存,还是愿意一半时间快乐地生活?生存不是我们的首要目标,最大幸福才是。原因是我们能感觉到。快乐和痛苦是我们行为背后最强大的力量。因此,我们很乐意改变我们的遗传禀赋,以更好地实现我们有意识地定义的目标。
一个没有情感或动机的人类水平的人工智能对我们来说太陌生了,以至于不能允许毫无问题的共存。但有情感的人工智能是最可怕的人工智能类型:它可以逃脱我们的控制,并重新调整其目标,使之与我们的目标不符。似乎情感 AI 是我们首先想要的,也是最后想要的。
# 结论
* 先说清楚一点:不是所有的 AI 都需要复制大脑。机器学习和深度学习包括大量的工具、模型和技术,其中大部分距离人类大脑如此之远,以至于它们可以更好地归类为统计系统。关于基于生物学的人工智能的辩论是关于人工智能的未来,而不是现在。正是在这个意义上,人工智能需要类似于我们。
* 人工智能在大多数方面都像其他技术,但有一个方面是不同的。这是唯一可能成为我们必须共存的新物种的技术。从这个角度来看,社会争论应该比技术争论更有分量。
* 如果我们想制造类似人类的人工智能,我们需要给它注入情感和动机。然而,这是在该领域工作的大多数科学家长期担忧的第一个来源。情感是让我们想要和需要东西的东西。如果我们无法将人工智能的情感与我们的目标结合起来,它最终可能会脱离我们的控制,带来不可预见的后果。
那我来问你这个:非人类 AI 和情感 AI 哪个更危险?
## 如果你喜欢这篇文章,可以考虑订阅我的免费周报<https://mindsoftomorrow.ck.page/>**!**每周一关于人工智能的新闻、观点和见解!****
## ****在这里** **你也可以直接支持我的工作,成为中等会员** [**获得无限权限!:)**](https://albertoromgar.medium.com/membership)**
# **推荐阅读**
**</unpopular-opinion-well-abandon-machine-learning-as-main-ai-paradigm-7d11e6773d46> </heres-how-openai-codex-will-revolutionize-programming-and-the-world-e8432aafc5f7> </5-must-know-ai-concepts-in-2021-75d8c1ff938> **
# 人类无法忍受的完美表现
> 原文:<https://towardsdatascience.com/the-unbearable-perfection-of-human-level-performance-bd68d4fb4b2d?source=collection_archive---------35----------------------->
## 或者为什么鸽子能洞察机器应该如何做数学

米开朗基罗.迪.洛多维科.布罗纳罗蒂.西蒙尼创作的亚当。罗马无伴奏合唱。
他们说,机器将改变世界。它们将使人类能够实现超出我们想象的事情,解决数据解释中令人难以置信的复杂难题,并将我们带入预测疾病和可靠交易策略的未来。他们可能并不擅长所有事情,但这肯定只是时间问题。
事实证明,在人类已经非常擅长的领域,备受称赞的机器学习往往不如人类学习。深度学习的最终目的,被定义为在人类指导下,通过训练堆叠的神经元层(或感知机)来尝试解决非线性优化问题,正是试图弥合人类和机器之间的性能差距。在识别一个人、给一幅画贴标签( [ConvNets](https://cs231n.github.io/convolutional-networks/) )、感知情感、猜测情绪、解码语言或创作艺术( [RNNs](https://www.ibm.com/cloud/learn/recurrent-neural-networks) )方面和我们一样好。
但我确信这只是故事的一部分。我在某处读到过,可能是在一些昂贵的数据管理咨询公司的宣传册上,虽然在所谓的感知问题上,机器并不比人类强多少,但在理解复杂结构的信息时,它们确实是非凡的:需要在来自无数来源的数百万条数据中迭代的优化问题。对于功能强大得令人难以置信的机器来说,这肯定是真的。
然而,即使是后者也不是如此明确的情况,并且不需要太多努力就可以达到最现代机器的计算能力所能做到的上限。**在下面的文章中,我认为了解机器学习的局限性,比试图将它奉为本世纪的灵丹妙药更有趣、更有教育意义。我希望值得你的关注。**
# 机器真的擅长它们正在做的事情吗?
**有些问题在逻辑上确实无法决定**。每个时代都有它的悖论:困扰试图修补公理、程序、解释和解决方案的逻辑学家的问题。今天有一长串可计算但不可解决的问题,在这些问题中,一台配有运行算法、无限时间和内存的确定性机器无法在不陷入无限循环的情况下给你一个一致的答案。图灵的停机问题是计算理论和数学哲学中最著名的问题之一。这些都是一系列帖子的素材,希望有一天我能找到写这些帖子的能力,但现在让我们忽略悖论,假设在它们的定义或尝试性解决方案中可能有一些错误,然后继续。
**不幸的是,即使在明显可统计、可理解、可计算的问题领域,你也不需要走得太远,就能达到一台超级强大的机器实际能做的极限**。
假设你是一个旅行推销员,看着一张标有城市名称和距离的地图,试图找出去每个城市一次然后回家的最短路线。这将是一个由现代计算机解决的简单优化问题。不完全是。在数学中,这种问题被称为组合优化的 NP-hard(非确定性多项式时间困难——这也是另一篇文章的材料)问题,这意味着解决它们的成本非常非常高。2020 年,[一台日本超级计算机庆祝了涉及 22 个城市的旅行推销员问题(或 TSP)的解决](https://www.popularmechanics.com/science/a30655520/scientists-solve-traveling-salesman-problem/),超过了之前 16 个城市的记录。22 个城市,仅此而已。这很难,因为用暴力解决 TSP 意味着解决一个超多项式(或指数)复杂性的问题。优化销售人员在 22 个城市的路线需要 22 个城市!(阶乘— 22x21x20x[…]x1)步。如果一步需要机器计算 0.001 秒,那么找到答案只需要不到 360 亿年的时间。到目前为止,我们的宇宙已经存在了 140 亿年,一些物理学家预计它还会再存在 50 年(尽管这一次还没有定论)。根本没有足够的时间来帮助销售人员。

照片由 [Stefan Grage](https://unsplash.com/@stefangrage?utm_source=medium&utm_medium=referral) 在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄
更复杂的是,**还有其他一些问题很难从头开始解决,但可以很容易地找到合适的解决方案**。其中最著名的就是宿舍问题。假设你的任务是为即将到来的 400 名大学生班级安排住宿。然而,空间是有限的,你只能在校园里主持其中的 100 个。此外,院长已经给了你一个不相容学生对的列表,你必须在你的配置中避免。虽然一开始看起来很容易,但是从头生成一个列表的任务是不切实际的(非 P),而检查一个列表是否符合指南的任务是简单琐碎的(NP)。
> 实际上,从 400 名申请者中选择 100 名学生的方法总数比已知宇宙中的原子数量还要多。
今天的数学家和逻辑学家认为,我们有很多“容易检查/难以解决”(P ≠ NP)的问题,尽管迄今为止没有人证明这种不等式成立。如果你相信你的论点,你可以在这里申请获得[100 万美元的资助。](https://www.claymath.org/millennium-problems/p-vs-np-problem)

Photo by [Lisanto 李奕良](https://unsplash.com/@lisanto_12?utm_source=medium&utm_medium=referral) on [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral)
**令人惊讶的是,事实证明人类非常擅长解决这类超级困难的优化问题**。据观察,人类能够为 TSP 生成一个[快速解决方案](https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.360.9763),其性能范围在 10-20 个节点的图的计算最优值的 1%以内,在 120 个节点的(估计)解决方案的 11%以内。鸽子显然也很擅长这个。这些不太可能的超级优化者似乎被赋予了权力,而不是拥有令人难以置信的强大计算能力,这是通过空间启发式和经验强化的混合来实现的,这使他们非常有效,而无需在本质上浪费太多时间。
与神经网络的结构和机制的相似之处是显而易见的。虽然可能无法证明机器提供的优化问题的解决方案与全局最优一致(如果多维点存在),但我们已经开发了一套技术,在过程中引入足够的随机性,以改变事物,并降低陷入局部最优的风险(有太多的搜索方法可供您尝试)。事实上,我们已经训练了一台机器,让它像人类一样思考,或者更确切地说,像人类一样行动——也就是说,通过一个建立在传统(阅读监督学习)、当前享受或痛苦(阅读强化)和持续创新(阅读随机技术)基础上的经过教育的试错过程。
# 所以工程师们按照自己的形象创造了算法
经验表明**人工智能高度依赖于人类专业人员的知识,这些专业人员一生都在从事自动化的工作实践**。但正是这种对人类知识的利用,使得机器很难达到超越这些人类的性能水平。
评估模型性能的总误差可分为三个更基本的部分:
* **偏差**:模型错误或过于简化——机器无法从训练集中提取相关特征,从而在训练和测试过程中正确预测标签
* **方差**:泛化误差或过度拟合——机器在训练中预测标签方面似乎做得很好,但在对数据集进行泛化时表现不佳
* 不可约(Bayes)误差:不可避免的误差——除非一个过程是真正确定的,否则数据中总会有噪声,或者即使存在完美信息也会出现不可约误差(你读过量子物理学吗)
继续我们对分类问题的类比,人类工程师是(I)减少偏差的大师(机器建筑师和分类训练数据的提供者),评估方差的法官(最终输出质量的评估者),以及不可约误差的黄金标准(令人惊讶的是,不可约误差的最佳替代是训练的人类误差)。
# 你仍然应该担心,或者兴奋
不要误解我的意思,机器的兴起远非无关紧要。如果你(在内心深处)相信任何没有经验的学徒都可以很容易地被训练得足够好,那么机器很快就会非常接近地完成同样的任务。近到足以让你的雇主扪心自问,用我们中的一些人代替一种算法是否有意义。这是因为与人类不同,机器有几个潜在雇主会在面试中欣赏的特质:它们非常快,不需要休息,有合理的可预测的激励,不会抱怨,它们对特定任务的供应不会在整个学校周期内增加或减少,它们不想得到报酬(然而——加密人群不会同意我的观点)。
然而,我相信,理解机器如何感知和处理现实的局限性,可以告诉我们比我们如何看待自己作为人类更多的东西,以及在过去几十亿年里塑造我们的力量。最终,是我们按照自己的形象创造了他们。
# 设计文档对数据科学家不可否认的重要性
> 原文:<https://towardsdatascience.com/the-undeniable-importance-of-design-docs-to-data-scientists-421132561f3c?source=collection_archive---------6----------------------->
## [办公时间](https://towardsdatascience.com/tagged/office-hours),给有抱负的数据科学家的建议
## 用清晰的目标和沟通建立概念灯塔

来源: [Unsplash](https://unsplash.com/photos/SHA85I0G8K4)
# 问题陈述
> 我如何确保我的数据项目成功?
>
> 我如何与利益相关者沟通并实现对他们的影响?
我看到许多崭露头角的数据科学家和人工智能初创公司着手他们的新项目,专注于[创新的深度学习算法,而没有考虑](/the-cold-start-problem-with-artificial-intelligence-49938ed3f612)适当的单元测试和基本的代码健康实践。
虽然快速投入到你的项目中有时是值得的。大多数时候,它会导致没有人使用的代码。一夜成名但经不起时间考验的应用。
## 我最大的错误
> 让我们假设你收到了一个新项目。理解了问题之后,您开始编写代码,希望能够快速解决您的项目。
>
> 但是后来你意识到你引入了很多 bugs 开源软件包被破坏,由于大小而中断,由于缺乏技术文档而重复实验。绝望中,你花了几个星期排除故障。
>
> 一旦你完成了,你意识到你新建立的模型对于工程团队来说太复杂了。心怀不满,你花了一整夜来实现一个简单的模型,这个模型对团队来说已经足够了
>
> —从作者的经历来说—
如果我能更早地与我的项目领导分享我的目标,我本可以节省很多时间。
交流对问题的共同理解比解决问题本身更重要。理解什么是重要的将会是经营成功项目的决定性因素。
否则,后果可能是可怕的。
## 网飞的故事价值 100 万美元的闪亮宝石
网飞向将网飞建议均方根误差(RMSE)提高约 10%的获胜团队奖励 100 万美元。但是网飞没有采纳,因为算法太复杂,无法支持!
[结果,网飞浪费了 100 万美元来奖励一个他们无法采用的机器学习模型。](https://www.wired.com/2012/04/netflix-prize-costs/)
如果在竞赛目标上与采用的工程团队有共同的目标和统一的沟通,这就不会发生。
> 因此,为什么设计文档很重要!
# 为什么制作设计文档很重要
> 设计文档应该是灯塔。
>
> 灯塔是目标的信号。
>
> 每艘登船都需要一座灯塔,以便在黑暗中航行。
>
> 汹涌的海浪可能会分散船的注意力,使它绕道而行。但是有了灯塔,每个船长都有权力把船驶向目的地。
同样,每个数据科学项目都像是在概念的黑暗中航行。您可以构建您的分析,并在整个项目中重复您的工作。但是如果没有共同的目标和方向(例如:灯塔),你将永远不会产生真正的影响。
设计文档在以工程为中心的文化中被广泛使用,如亚马逊和谷歌。**它旨在分享所有计划的想法、进展和结果,以强调共同的目标和影响。**
**它还作为一盏指路明灯,让其他人分享知识,以了解并建立项目来满足他们的需求。**因此,这是你巩固自己对团队的巨大贡献的一项关键技能。
> 因此,创建一个设计文档就形成了一个概念性的灯塔,让你明白你应该如何克服短视,消除时间下沉,并提供共享的影响。
# 如何构建设计文档
1. **目标:**你为什么要建这个?
2. **最小可行产品:**对你的受众来说,什么是重要的?
3. **研究和探索:**有哪些时间和资源可用?
4. **里程碑和成果:**能够实现什么,已经实现了什么?
5. **TL:DR(太久没看):**有什么总结?
作为一个例子,你可以查看这个设计文档 [**收集并分析 Yayasan Merajut Hati(YMH)* insta gram 数据**](https://docs.google.com/document/d/12ridJk1BtL-alomt3XXnLG_GZ68NzP6C82Ihy3M8fA8/edit#) **。**
> **注:**我在[Yayasan Merajut Hati](https://www.instagram.com/yayasanmerajuthati/)(YMH)做志愿者,这是一个非营利组织,旨在提高疫情期间印尼年轻人的精神健康意识。这些是我为 YMH 建造的工程。
>
> * [建立 Instagram 业务的最快分析方法](/the-quickest-analytics-to-build-your-instagram-business-b7b3c5d68056)
>
> * [为 Instagram 业务访问脸书 API](/accessing-facebook-api-for-instagram-business-568cfe3efb77)

[我为 Yayasan Merajut Hati](https://docs.google.com/document/d/12ridJk1BtL-alomt3XXnLG_GZ68NzP6C82Ihy3M8fA8/edit#) 创建的样本设计文档(来源于作者)
# 目标
> 你为什么要建这个?
目标是任何项目的基础。是一个公司成功而其他公司不成功的最大原因。
## 最成功的公司都有明确直接的目标。
* 谷歌:组织世界上的信息,并使其普遍可用。
* 脸书:给予人们建设社区的力量,让世界更加紧密
* **AirBnB:** 创造一个任何人都可以属于任何地方的世界,专注于创造一个端到端的旅行平台,处理你旅行的每一部分
同样,你的目标应该是清晰和简明的。
**部分样品包括:**
* 提取 YMH 营销所需的高质量 Instagram 数据。
* 构建本科生课程推荐系统。
# 最小可行产品
> 对你的观众来说什么是重要的?
最小可行产品(MVP)定义了项目的核心价值。你依靠北极星来决定你的项目是否成功。
**MVP 显示详细描述,如:**
* [ [YMH](https://docs.google.com/document/d/12ridJk1BtL-alomt3XXnLG_GZ68NzP6C82Ihy3M8fA8/edit#heading=h.1lqdvjwrmd5t) ]建立 Instagram 功能,能够满足以下业务重点和指标。业务重点和指标包括…
* 建立推荐系统,用户可以登录,购买和增加 XX%的销售比旧模型(AB 测试)。
MVP 应该是现实的而不是理想化的。它应该是保守的而不是雄心勃勃的。如果其他的都失败了,知道你达到了你的 MVP 是一个巨大的成就。
然后,您可以进一步迭代项目,以实现您的扩展目标。
**注意**:这需要反馈以及与将要使用和维护这个项目的利益相关者的频繁沟通。一旦您拥有了共享的 MVP,只要您的项目实现了它,您就可以安全地宣布成功了。
# 研究和探索
> 有什么时间和资源可以利用?
研究和探索定义了建立你的 MVP 的方法。
**这需要开放式头脑风暴,包括:**
* 你打算用什么工具?为什么?
* 你计划用多长时间来完成这件事?
* 【对于 ML 项目】你做什么探索性数据分析(EDA)?为什么这很重要?你应该建立什么模型?为什么?
当您的解决方案未能满足 MVP 时,快速研究和探索将使您能够快速切换解决方案。
# 里程碑和成果
> 【里程碑】能实现什么?
>
> 【成果】取得了哪些成果?
里程碑和结果定义了您为实现 MVP 而计划或已经完成的实际工作。
里程碑为你的探索和研究设定了动态的短期目标。一旦你做了实际的工作,里程碑就会变成结果。
从建立里程碑开始,分解你的 MVP。一旦你完成了里程碑,记录结果。
[**在 YMH 样本**](https://docs.google.com/document/d/12ridJk1BtL-alomt3XXnLG_GZ68NzP6C82Ihy3M8fA8/edit#heading=h.1lqdvjwrmd5t) **中,我起草了以下插图作为我的里程碑/成果。**

数据架构示例的里程碑/结果([来源于作者](https://docs.google.com/document/d/12ridJk1BtL-alomt3XXnLG_GZ68NzP6C82Ihy3M8fA8/edit#))
# TL:DR →太久没看了
> 总结是什么?
**TL:DR 是快速总结结果和分享知识的好方法**。它给了你的利益相关者一块金块,让他们决定是否应该继续阅读。
**TL:DR 最大的好处就是尊重对方的时间。**它可以节省利益相关者的时间,同时让他们了解您的实际工作和影响。
***注:*** *按顺序来说,我会把 TL:DR 放在 objective 之后。这允许利益相关者直接查看摘要,以决定进一步投入时间阅读。*
# 结论:建立一个概念性的灯塔
你应该根据受众的需求来设计产品。这将迫使你[建立一个人们使用和维护的数据分析项目](/intro-to-mlops-ml-technical-debt-9d3d6107cd95)。
因此,创建一个设计文档形成了一个概念性的灯塔,以了解你应该如何导航的短视期,消除时间下沉,并提供共享的影响。
## 通过这篇文章,我希望你了解了设计文档:
1. 目标:你为什么要建这个?
2. 最低可行产品:对你的受众来说,什么是重要的?
3. 研究和探索:有什么时间和资源可以利用?
4. **里程碑和成果:**能够/已经实现了什么?
5. **TL:DR(太长不看):**有什么总结?
索利·德奥·格洛丽亚
# 来自作者的更多提示:
* [我喜欢带在线硕士学习数据科学的 5 个原因](https://medium.com/datadriveninvestor/5-reasons-why-i-enjoy-taking-online-masters-to-learn-data-science-bba05eb5641c)
* [如何构建您的终极数据科学投资组合](/how-to-build-your-ultimate-data-science-portfolios-ea0414d79a72)
* [数据分析很难…以下是你如何超越的方法](/data-analytics-is-hard-here-how-you-can-excel-aa2a99d0fad0)
* [写作分析学的隐藏宝石](/the-hidden-gems-of-writing-analytics-6db78fad5a51)
# 关于作者
我用 ML @ Google 对抗网络钓鱼。
我热爱我的工作,因为我使用先进的 ML 算法和 MLOps 来保护 Chrome、Gmail 和 Android 用户免受钓鱼攻击,窃取弱势群体的生活积蓄。
我也是《走向数据科学媒体》的撰稿人,为全球 100 多万观众的有志 ML 和数据从业者提供指导。
在我的空闲时间,我写中型文章,在 Kaggle 上编码,为铁人三项/自行车旅行训练。
最后,请通过 [LinkedIn](http://www.linkedin.com/in/vincenttatan/?source=post_page---------------------------) 、 [Medium](https://medium.com/@vincentkernn?source=post_page---------------------------) 或 [Youtube 频道](https://www.youtube.com/user/vincelance1/videos?source=post_page---------------------------)联系文森特
# 意想不到的 ML 创业解决你所有的问题
> 原文:<https://towardsdatascience.com/the-unexpected-ml-startups-solving-all-your-problems-10da71a5214c?source=collection_archive---------25----------------------->
## 2021 年:是时候把你的决策权交给机器了

图片来源:Christopher Gower / Unsplash
两年前,我在[Women of Silicon round about Conference](https://www.women-in-technology.com/)上谈到了机器学习(ML)初创公司,以及为什么它们是一种值得关注的趋势。我最近想到,我从来没有机会与更广泛的世界分享我们讨论的有趣案例,而且,唉,我不被允许分享完整的谈话记录。听起来,我被记住更多的是因为我在舞台上踩过的黄色平台(证据[在这里](https://www.youtube.com/watch?v=dP4TZMkbH74)),而不是实际的内容。因此,我决定重温这个话题,重新审视一些最初的案例以及后来崭露头角的新创业公司。
这个话题让我很兴奋,因为我是一名数据科学家。我也在一家 ML 初创公司工作,这意味着我们出售来自 ML 模型的预测(具体来说,就是关于哪些客户正在实施欺诈的预测)。值得注意的是,当产品是一个预测的时候,你公司的成功就在于那个模型的准确性。这意味着 ML 创业公司中的数据科学团队是公司的心脏。也许这就是我热爱我的角色的原因——我太喜欢成为关注的焦点了!这不是通常的数据科学问题,利益相关者决定他们想要的产品特性和项目时间框架的模型类型;相反,数据科学家概述他们需要的数据以及实现这些数据所需的工程/产品资源。
好了,我跑题了。ML 初创公司面临的独特而美丽的挑战是另一个故事,但你来这里是为了了解热门的初创公司。因此,一些最热门的 ML 初创公司(其中“最热门”与当前的资金量相关)都在自动驾驶汽车领域——预测汽车在路上的位置以及他们周围有什么的软件。预测你的诊断的医疗聊天机器人也非常热门。但是这些应用程序已经抢尽风头太久了,所以我将把重点放在一系列即将流行的更奇怪的应用程序上。
# B2C(企业对客户)
很多新的 ML 创业公司通过为客户节省时间来赚钱。例如,花大量的时间寻找一份你真正想要的新工作。当你用 [**MeetFrank**](https://meetfrank.com/) 应用程序创建一个账户时,它会询问你对哪种角色感兴趣(例如行业类型、公司价值观、期望薪资),记下你目前的技能和经验,然后预测市场上是否有适合你的工作。这是任何想被动搜索的技术人员的梦想;你不必过滤 LinkedIn 上铺天盖地而来的机会,你会偶尔收到一个刚刚上线并符合你标准的职位的通知。
如果你的目标是一份超出你能力范围的工作,该怎么办? [**JobTech**](https://jobtech.co/) 为此打造了个性化的 AI 职业教练;它会理解你的目标,预测你需要磨练的技能。我觉得有趣的是,AI 不知道如何粉饰太平。希望人们不要因为知道他们 98%的简历需要修改才能成为有吸引力的员工而生气。
ML 模型可以决定你学习的技能,但也可以决定你穿什么。 [**Stitch Fix**](https://www.stitchfix.com/) 为此创建了一个个性化的造型订阅服务:你首先要做一个小测试,确定你感兴趣的款式、尺寸和价格,然后模特预测你喜欢的衣服。这些东西会按你想要的那样定期出现在你的门前,你会把那些没用的退回去。我还注意到,他们鼓励你输入关于你生活中“当前状态”的细节,这些建议包括开始一份新工作或经历像离婚这样的生活转变。这让我这个数据科学家欣然接受了 AB 测试的想法,这种测试涉及两个相同的个人资料,一个婚姻幸福,另一个正在经历分手。我的离婚者会穿运动服还是超级时髦的裙子?
人们对健康科技和可穿戴设备的兴趣日益浓厚,这表明消费者将更容易依赖 ML 来做出更健康的生活决策。你有<https://flo.health/>**flo,这是一个周期跟踪器,它会预测你什么时候最适合怀孕。 [**自然周期**](https://www.naturalcycles.com/) 采取了相反的方法,并预测了一个稍微困难的问题,即什么时候你可以安全地进行无保护的性行为而不会怀孕。如果你有足够的勇气做你的第二个样本,[**Atlas Biomed Group**](https://atlasbiomed.com/uk)的微生物组测试甚至会根据你肠道中的细菌数量来预测你应该吃什么食物来保持健康。**
# **B2B(企业对企业)**
**现在有一波 B2B 的创业浪潮,他们把 ML 带给了通常无法接触到它的企业客户。Eigen Technologies 在金融领域就是这样做的;他们的模型着眼于一种文件类型的几个例子,比如一份贷款合同,并学习预测任何进一步的贷款合同中包含的关键信息。利用 ML 查找相关数据也是 [**Securiti.ai**](http://securit.ai/) 的基础,诞生于 GDPR 之痛开始袭来的 2019 年。客户现在有权编辑他们的一些个人信息,但他们的数据可能会分散在多个应用程序中,或者与第三方共享。Securiti.ai 的模型可以找到并预测与案件相关的数据。**
****
**抱歉,但在我的研究中讽刺太好了(图片由作者提供)**
**曼梯·里甚至被请来研究精神病学。病人不敞开心扉,或者治疗师在高工作负荷下挣扎,意味着重要的面部表情或声音提示可能会被错过。 [**刻意. ai**](https://www.deliberate.ai/) 通过相机和麦克风记录机密媒体来增强治疗师的理解,ML 可以使用这些媒体来预测患者的结果以及如何改善。**
**展望 2020 年,冠状病毒疫情给客户服务团队带来了巨大的问题;人们无法亲自去公司,所以呼叫中心不堪重负。 [**Uniphore**](https://www.uniphore.com/) 在正确的时间出现在正确的地点,建立了基于视频和语音通话预测客户意向的 ML。这使得案件的解决不需要人工代理,或者案件被发送到正确的人。再说一次,这听起来像是 AB 测试的好材料——我应该提高嗓门让经理优先考虑我吗?**
**被预测的不仅仅是顾客;自从我们都开始在家工作以来,人们对预测员工的事情更感兴趣了。员工监控软件不要求 ML 跟踪屏幕时间,但有像 [**Behavox**](https://www.behavox.com/?utm_source=google&utm_medium=cpc&utm_campaign=EN-US-Brand&_bt=432893778676&_bk=behavox&_bm=e&_bn=g&_bg=103144229640&gclid=Cj0KCQjw1PSDBhDbARIsAPeTqre8lZ5ks06HLQoyN74EEHkMcKn_feVKht9NgucHe5aBdDpcYcwtq5IaAnfEEALw_wcB) 这样的 ML 初创公司可以预测哪些员工不遵守规定,例如那些涉及内幕交易或性侵犯案件的员工。你也有 [**iamYiam**](https://syd.iamyiam.com/en/) 它最初是建立在基因标记基础上的个性化健康平台,但他们现在为企业客户提供了一个帮助了解整个团队健康状况的解决方案。相比之下, [**Yvai.ai**](https://www.yva.ai/) 预测哪些员工工作倦怠,哪些员工是公司内部的非正式领导或“影响者”。**
**<https://www.tended.co.uk/>**创造了可穿戴技术,它不仅可以检测员工的绊倒、跌倒或撞击,还可以感知何时有人来到你预设的距离内,就像新冠肺炎风格一样。Wandelbots 减少了你的员工在第一时间从事危险工作的必要性;他们的软件允许机器人学习如何根据一些演示来做操作员或专家的工作。那是我有生之年没想到会看到的另一个职业——机器人老师。****
****我们还可以恢复对 ML 模型的信心,它不仅仅是一个时间和成本的节约者;“人工智能为好”的创业公司是我认为最值得关注的。 [**Savvie**](https://www.savvie.io/) 预测面包店和咖啡馆等小型企业的销售额,目的是减少食物浪费。 [**云循环**](https://www.cloudcycle.com/) 也在解决一个影响二氧化碳排放、在建筑行业价值数十亿英镑的问题:混凝土不符合行业要求,被送去填埋。他们的模型预测生产过程中的干预,以确保符合标准。****
# ****结束语****
****我可以花几天时间去挖掘更多 ML 初创公司正在解决的古怪问题,但你会明白的。我们正在走向这样一个世界,在这个世界里,更多的决策是基于 ML 模型的预测做出的。很多时候,这是因为预测节省了我们的时间(例如找工作),或者比单纯的人类判断更加明智(例如个性化的健康建议)。在企业层面,预测提高了效率,增加了收入。****
****虽然它能解决的问题范围很大,但我不是唯一一个觉得 ML 还没学会走路就跑了的人。事实上,[计划上周被泄露](https://techcrunch.com/2021/04/14/eu-plan-for-risk-based-ai-rules-to-set-fines-as-high-as-4-of-global-turnover-per-leaked-draft/)开始在欧盟监管人工智能。使用 ML 来避免人为错误和偏见是一件好事,但是将没有预期效果的模型部署到生产中太容易了。当你看到人工智能模型开始为我们做出的一系列决定时——吃什么,什么时候做爱,你的诊断是什么,哪些员工正在犯下严重的不当行为——你可以看到你的人工智能模型中的明显错误会给人类生活带来多大的后果。****
****可解释的人工智能(XAI)和 MLOps 是两个令人兴奋的新兴领域,有助于解决这个问题,但它们是另一天的主题…****
# ****最后****
****如果你对在机器学习初创公司工作的前景感到兴奋,那么,这很方便,因为我们正在[招聘](https://www.ravelin.com/careers)(数据科学家、工程师,一切)!它也不是一般的创业公司,你会真正喜欢在这里工作;只要看看[的玻璃门](https://www.glassdoor.co.uk/Reviews/Ravelin-Technology-Reviews-E1590629.htm)(不,我们没有写机器人来给出所有热情的反馈)。请通过 [LinkedIn](https://www.linkedin.com/in/milly-leadley/) 联系我了解更多信息。我也很高兴你能深入我的文章。****
# Python 的运算符模块的未知特性
> 原文:<https://towardsdatascience.com/the-unknown-features-of-pythons-operator-module-1ad9075d9536?source=collection_archive---------10----------------------->
## 借助 Python 鲜为人知的操作符模块,使您的代码更快、更简洁、可读性更强、功能更强大

[Bilal O.](https://unsplash.com/@lightcircle?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 在 [Unsplash](https://unsplash.com/?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 上拍摄的照片
乍一看,Python 的`operator`模块似乎不是很有趣。它包括许多用于算术和二进制运算的操作函数,以及几个方便的帮助函数。它们可能看起来不那么有用,但是在这些函数的帮助下,你可以让你的代码更快、更简洁、更可读、功能更强。因此,在本文中,我们将探索这个伟大的 Python 模块,并充分利用其中包含的每个函数。
# 用例
该模块的最大部分由包装/模拟基本 Python 操作符的函数组成,如`+`、`<<`或`not`。当您可以只使用操作符本身时,为什么您需要或想要使用其中的任何一个可能不是很明显,所以让我们首先讨论所有这些函数的一些用例。
您可能希望在代码中使用其中一些的第一个原因是,如果您需要将运算符传递给函数:
我们需要这样做的原因是,Python 的操作符(`+`、`-`、…)不是函数,所以你不能直接把它们传递给函数。相反,您可以从`operator`模块传入版本。你可以很容易地实现包装函数来帮你做这件事,但是没有人想为每个算术运算符创建函数,对吗?另外,作为一个额外的好处,这允许更多的函数式编程。
你可能还会想,*我不需要* `*operator*` *模块来做这个,我可以只使用* `*lambda*` *表达式!。是的,但是这是你应该使用这个模块的第二个原因。这个模块中的函数比 lambdas 快。对于单次执行,您显然不会注意到这一点,但是如果您在循环中运行它足够多次,就会产生很大的不同:*
因此,如果你习惯于写类似于`(lambda x,y: x + y)(12, 15)`的东西,你可能想切换到`operator.add(12, 15)`来获得一点性能提升。
第三,对我来说,使用`operator`模块最重要的原因是可读性——这更多的是个人偏好,如果你一直使用`lambda`表达式,那么你可能会更自然地使用它们,但在我看来,一般来说在`operator`模块中使用函数比在 lambdas 中使用更具可读性,例如考虑以下内容:
显然,第二种选择可读性更强。
最后,与 lambdas 不同,`operator`模块函数是*可选择的*,这意味着它们可以被保存并在以后恢复。这可能看起来不是很有用,但是对于分布式和并行计算来说是必要的,这需要在进程之间传递函数的能力。
# 所有选项
正如我已经提到的,这个模块为每一个 Python 算法、按位和真值操作符以及一些额外的功能提供了一个函数。关于函数和实际操作符之间的映射的完整列表,参见文档中的[表。](https://docs.python.org/3/library/operator.html#mapping-operators-to-functions)
除了所有预期的函数之外,这个模块还具有实现操作的就地版本,例如`a += b`或`a *= b`。如果你想使用这些,你可以在基本版本前加上前缀`i`,例如`iadd`或`imul`。
最后,在`operator`中,你还会发现所有这些函数的*版本和*版本,例如`__add__`或`__mod__`。这些是由于遗留原因而出现的,没有下划线的版本应该是首选的。
除了所有实际的操作符之外,这个模块还有一些可以派上用场的特性。其中一个是鲜为人知的`length_hint`函数,它可以用来得到*迭代器长度的模糊*概念:
我想在这里强调一下*模糊的*关键字——不要依赖这个值,因为它实际上是一个*提示*并且不能保证准确性。
我们可以从这个模块中获得的另一个方便的函数是`countOf(a, b)`,它返回`b`在`a`中出现的次数,例如:
这些简单助手的最后一个是`indexOf(a, b)`,它返回`b`在`a`中第一次出现的索引:
# 关键功能
除了操作员功能和上述几个实用功能外,`operator`模块还包括用于处理高阶功能的功能。这两个键是`attrgetter`和`itemgetter`,它们通常与`sorted`或`itertools.groupby`等键一起使用。
为了了解它们是如何工作的,以及如何在代码中使用它们,让我们看几个例子。
假设我们有一个字典列表,我们希望通过一个公共关键字对它们进行排序。下面是我们如何用`itemgetter`做到这一点:
在这个代码片段中,我们使用了接受 iterable 和 key 函数的`sorted`函数。这个键函数必须是一个可调用的函数,它从 iterable ( `rows`)中提取单个项目,并提取用于排序的值。在这种情况下,我们传入`itemgetter`,它为我们创建了可调用的。我们还从`rows`中给它字典键,然后将这些键提供给对象的`__getitem__`,查找的结果用于排序。正如你可能注意到的,我们同时使用了`surname`和`name`,这样我们可以同时对多个字段进行排序。
代码片段的最后几行还显示了`itemgetter`的另一种用法,即查找 ID 字段中具有最小值的行。
接下来是`attrgetter`函数,它可以以与上面的`itemgetter`类似的方式用于排序。更具体地说,我们可以用它来对没有本地比较支持的对象进行排序:
这里我们使用`self.order_id`属性按照 id 对订单进行排序。
当与`itertools`模块中的一些函数结合使用时,上面显示的两个函数都非常有用,所以让我们看看如何使用`itemgetter`按其字段对元素进行分组:
这里我们有一个行列表(`orders`),我们希望通过`date`字段对其进行分组。为此,我们首先对数组进行排序,然后调用`groupby`来创建具有相同`date`值的项目组。如果您想知道为什么我们需要先对数组进行排序,这是因为`groupby`函数通过寻找具有相同值的*连续*记录来工作,因此所有具有相同日期的记录需要预先分组在一起。
在前面的例子中,我们使用了字典数组,但是这些函数也可以应用于其他的可重复项。例如,我们可以使用`itemgetter`按值对字典进行排序,在数组中查找最小/最大值的索引,或者根据元组的一些字段对元组列表进行排序:
# 方法调用程序
需要提及的`operator`模块的最后一个功能是`methodcaller`。此函数可用于调用对象上的方法,方法使用以字符串形式提供的名称:
在上面的第一个例子中,我们主要使用`methodcaller`来调用`”some text”.rjust(12, “.”)`,它将字符串右对齐为 12 个字符,并用`.`作为填充字符。
使用该函数更有意义,例如,当您有一个所需方法的字符串名称,并希望反复向它提供相同的参数时,如上面的第二个示例所示。
使用`methodcaller`的另一个更实际的例子是下面的代码。在这里,我们将文本文件的行输入到`map`函数,并且我们还将我们想要的方法传递给它——在本例中是`strip`——该方法从每行中去除空白。此外,我们将结果传递给`filter`,它删除所有空行(空行是空字符串,它们是 *falsy* ,因此它们被过滤器删除)。
# 结束语
在本文中,我们快速浏览了一个被低估的`operator`模块(在我看来)。这表明,即使只有几个函数的小模块在您的日常 Python 编程任务中也会非常有用。Python 的标准库中有许多更有用的模块,所以我建议只需查看[模块索引](https://docs.python.org/3/py-modindex.html)并开始研究。您也可以查看我以前的文章,这些文章探讨了其中的一些模块,如 [itertools](/tour-of-python-itertools-2af84db18a5e) 或 [functools](/functools-the-power-of-higher-order-functions-in-python-8e6e61c6e4e4) 。
*本文原帖*[*martinheinz . dev*](https://martinheinz.dev/blog/54?utm_source=medium&utm_medium=referral&utm_campaign=blog_post_54)
</functools-the-power-of-higher-order-functions-in-python-8e6e61c6e4e4> </the-correct-way-to-overload-functions-in-python-b11b50ca7336> [## Python 中重载函数的正确方法
towardsdatascience.com](/the-correct-way-to-overload-functions-in-python-b11b50ca7336) </scheduling-all-kinds-of-recurring-jobs-with-python-b8784c74d5dc>
# 数据科学中婴儿步骤的不合理有效性
> 原文:<https://towardsdatascience.com/the-unreasonable-effectiveness-of-baby-steps-in-data-science-621e0dee31c5?source=collection_archive---------43----------------------->
## 提高生产力的数据科学方法

西蒙·因芬格在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上的照片
任何数据科学项目都是由多个复杂性和困难组成的,就像任何足够大的项目一样。也许您首先需要连接到一个数据库,读取数据,清理数据,为您的模型处理数据,实现模型,运行训练,保存模型,部署等等。每一步都要花很多时间,从开始做这个项目到**有视觉证据证明它可行之间的时间可能是几个小时**。你对你正在写的大多数 bug 视而不见,因为你没有对你的错误做出快速的反馈。想象一下,你花了相当多的时间处理数据和建模,但你的模型似乎不能很好地工作。你如何调试你的模型?如果你的数据和模型很复杂,那将会非常困难。你可能已经有几百行代码了,而且**一塌糊涂**。
> 与软件工程相比,数据科学尤其困难,因为您的代码可能会无声无息地失败,做出不准确的预测。
有一种**更简单、更有效的方式**来攻击任何数据科学项目:
# 1.创建极其简单的数据
你可能认为这是额外的努力/工作,但实际上,你会在不到 5 分钟内实现它,这将使你赢得在复杂数据上调试模型的几个小时。您希望使用与您的问题相兼容的数据来训练您的模型,但使用最简单的方式。如果你正在训练一个分类器,你可以操作特征,使类成为这些特征的一个明显的函数。
例如,我最近从事异常检测工作。数据庞大而复杂,我知道在建模之前,我需要花费数小时处理数据,而且很难操作和调试。所以,我创造了极其简单的数据。我生成了 S⁵的数据(规范 1 的 R⁵点)作为“正常数据”,生成了一些异常数据作为规范 1.3 的 R⁵点。编码速度极快(大约 1 分钟),我可以验证我的模型成功解决了这个非常简单的问题。
# 2.创建模型的最简单版本
写代码的时候,要意识到,不管你有多谨慎和熟练,你都会写出错误,因为不这样做太难了。在软件工程中有一个众所周知的想法,初级程序员希望在某个时候足够熟练,不再写错误,而更多的高级程序员知道这是工作的一部分,更重要的是学会如何适应写错误,而不是期望根本不写错误。
现在,如果你知道会有 bug,你希望你的模型超级简单,这样你可以更快更容易地调试。如果您的最终模型预计会有许多大而多样的层,请想办法创建一个更简单的模型。你的模型需要有足够的容量来解决你在步骤 1 的超级简单的数据上的问题,但是以最小的方式**。**
# 3.训练你的模型并迭代
<https://www.pytorchlightning.ai/> [## PyTorch 闪电
www.pytorchlightning.ai](https://www.pytorchlightning.ai/)
我在我所有的深度学习项目中使用 Pytorch Lightning,因为它非常容易和快速地建立原型。在大约 15 分钟内,我可以实现超级简单的数据,实现模型的第一次迭代,并实现 Pytorch lightning 模型,这样我就可以在几分钟内获得关于整个培训管道的反馈。现在,有两种选择:很少情况下,一切都会按预期运行,您可以增加数据或模型的复杂性,以更接近您的实际问题,但大多数情况下,您会面临一些错误和问题。**这很容易解决,因为你已经准备好了**。您将解决这些问题,然后可以开始增加模型或数据的复杂性。
# 结论
现在您已经有了整个训练管道,您可以迭代,直到您有一个关于真实数据的工作模型。这种方法有两个提高生产率的来源:
* **你制作的 bug 更加本地化,因为你得到了更多的反馈**。你可以把你的项目时间线想象成多个小的部分,当你遇到错误时,你知道错误出现在当前(小的)部分,并且更容易发现它。
* 来自真实数据和真实模型之间复杂交互的错误被**分解成多个更容易解决的小问题**。
# 剩余情节的不合理丰富
> 原文:<https://towardsdatascience.com/the-unreasonable-richness-of-residual-plot-17f9104a687a?source=collection_archive---------33----------------------->

照片由 [Unsplash](https://unsplash.com/s/photos/grains?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 上的[实体模型图形](https://unsplash.com/@mockupgraphics?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)拍摄
## 仅使用一个图检查除一个线性回归假设之外的所有假设
在机器学习中,残差是实际目标值和拟合值之间的“差值”。残差是回归问题中的一个重要概念。它是任何回归度量的基础:均方误差(MSE),平均绝对误差(MAE),平均绝对百分比误差(MAPE),你能想到的。

重温你的记忆(作者图片)
残差在线性回归中甚至更为关键。它们包含丰富的信息,尤其是当作为残差图呈现时。通过这篇博客,我将向你展示,我们可以通过查看残差图来验证几乎所有的方法假设。
# 残差图

线性回归中的残差(图片由作者提供)
毫无疑问,残差图是显示残差的图。我们可以根据如下简单定义得出一个:
* 在简单线性回归(具有 1 个预测值的回归)的情况下,我们将**预测值**设置为 x 轴,将残差设置为 y 轴
* 在多元线性回归的情况下(预测因子> 1 的回归),我们将**拟合值**设置为 x 轴,将残差设置为 y 轴
# 线性回归假设
回想一下,线性回归有如下四个假设:
1. 预测值和目标变量之间的线性关系,意味着模式必须是直线形式(或多元线性回归情况下的超平面)
2. 同方差,即残差的恒定方差
3. 独立观察。这实际上相当于独立残差
4. 残差的正态性,即残差服从正态分布
# 使用残差图检查 4 个假设中的 3 个
我们可以通过残差图检查上面的前三个假设!
**假设 1:线性关系**
如果残差图中没有*可识别的非线性模式,则该假设有效。让我们考虑下面的例子。*

剩余地块 1(图片由作者提供)
在上面的例子中,假设被违反了,因为 U 形模式是明显的。换句话说,真实的关系是非线性的。
**假设 2:恒定方差**
如果残差相对于零水平线在残差图的整个 x 轴上均匀分布(大约相同的距离),则该假设有效。让我们考虑下面的例子。

剩余地块 2(图片由作者提供)
在上面的例子中,假设被违反了,因为方差在更大的拟合值上变得更小。
**假设 3:独立观察**
如果在残差图中的几个连续残差之间没有*或*辨别模式,则该假设有效。让我们考虑下面的例子。

剩余地块 3(图片由作者提供)
在上述情况下,假设被违反,因为在连续残差之间存在辨别模式(两者都是负斜率的线性)。
# 额外收获:使用 ggplot2 绘制残差图
在本节中,我将分享如何在 r 中使用 ggplot2 库绘制残差图。为此,我们将使用流行的 Auto-MPG 数据集(可在此处下载)。
import libraries
library(dplyr)
library(ggplot2)# read data
mpg <- read.csv('auto-mpg.csv')# drop rows with NA values
mpg <- mpg %>% drop_na.()# build and train linear regression model mpg = b0 + b1 * displacement
mpg_lm <- lm(mpg ~ displacement, mpg)# store as dataframe for plotting
res_df <- data.frame(displacement=mpg$displacement, residual=resid(mpg_lm))# plotting
ggplot(res_df, aes(x=displacement, y=residual)) +
geom_point(alpha=0.5) +
geom_hline(yintercept = 0, color = 'black') +
geom_smooth(color = 'blue') +
labs(title='Residual from Regressing MPG using Displacement',
subtitle = 'Data: Auto-MPG dataset')

# 在你走之前
在这篇文章中,我们通过看残差回到基础。事实证明,残差,特别是以残差图的形式,提供了相当丰富的信息;我们可以通过查看残差图来验证 4 个线性回归假设中的 3 个。
希望在读完这篇文章后,我们能更好地理解残差的重要性。总而言之,感谢阅读,大家在 [LinkedIn](https://www.linkedin.com/in/pararawendy-indarjo/) 上和我连线吧!👋
# 机器学习的无名英雄在数据操作中
> 原文:<https://towardsdatascience.com/the-unsung-heroes-of-machine-learning-are-in-data-operations-1f28fedff967?source=collection_archive---------31----------------------->

甚至迷因也认识到建模是容易的部分。[来源](https://www.kdnuggets.com/2017/08/first-steps-learning-deep-learning-image-classification-keras.html)
# 不要睡在数据操作上
当大多数人想到深度学习从业者时,他们会想到那些使用博士期间学到的特殊能力对机器学习模型耳语的数据科学家。
虽然对一些组织来说这可能是真的,但大多数实际的深度学习应用程序的现实更加平庸。现在模型性能的最大决定因素是数据,而不是模型代码。而当数据至上的时候,**数据运营**就成了你 ML 团队最重要的部分。
# 数据操作介绍
从根本上说,数据运营团队负责维护和改进模型训练所依据的数据集。他们的部分职责包括:
* 确保数据和标签干净一致。训练集中的坏数据意味着模型将在训练时被混淆,并学习错误的东西。测试集中的坏数据意味着您不能相信您的模型性能度量是准确的。
* 将 ML 系统中的错误追溯到导致这些错误的数据点(或缺少数据点)。对错误情况的良好理解使得修复它们变得更加容易。
* 基于当前的优先级来获取、标记和添加数据到数据集:修复关键的客户问题,解决模型性能中的缺陷,或者将模型功能扩展到新的任务/领域。
数据操作团队成员通常是他们领域的专家。想象一下,一个能一眼分辨出塑料和玻璃容器的回收专家,一个能把中文翻译成葡萄牙文的翻译,或者一个能导航核磁共振成像并告诉你病人是否患有癌症的放射学家。
数据运营人员也可以来自咨询或商业背景。在处理任何操作任务时,尤其是处理数据时,有条不紊会有所帮助。对业务目标和技术能力的了解也可以告知如何最好地对数据监管进行优先排序,以改进 ML 系统。
在数据运营团队中,可以根据他们负责的数据/模型类型(例如,在自动驾驶应用程序中,不同的队友拥有雷达、激光雷达和图像检测系统)或根据他们服务的客户/地理位置(例如,一名团队成员负责北美部署,另一名团队成员负责 APAC)来分配团队成员。
数据操作团队成员通常会与离岸标签团队合作,以帮助扩展数据标签的吞吐量。离岸团队处理更简单但需要更多人工的任务。例如,调整边界框标签以精确适应各种对象,或者标记苹果和橙子的图片。相比之下,内部数据操作团队成员充当专家,他们定义标记说明,检查离岸团队的工作,并决定如何处理困难或模糊的场景。数据操作团队最适合需要少量高质量工作和相对较短周转时间的工作。离岸团队适合大量简单的工作,质量不如数量重要的任务,或者标记吞吐量比等待时间更重要的情况。
# 为什么是现在?
在 90 年代末和 21 世纪初,机器学习在许多网络公司中找到了许多应用。与手动调整的算法相比,模型可以更好地完成推荐、排名和预测等任务。
然而,这些 ML 模型是精确的和可扩展的,因为它们能够从大量的数据中学习,这些数据基本上是免费生成的。推荐和排名模型可以根据用户浏览网站时实际点击的记录数据进行训练。预测模型可以使用过去的数据预测未来,然后随着时间的推移验证这些预测的准确性。
换句话说,数据本质上是无限的,并且是自动生成的。只要数据是干净的,并且保持流动,您就可以在模型上工作。改进这些模型管道的大部分工作包括缩放数据管道和确保数据一致性。模型精度的提高主要通过特征工程和超参数调整来实现。所有数据和 ML 工程师能做的事情!
深度学习的出现引入了强大的模型,这些模型在涉及图像、音频和文本等非结构化数据的任务中运行良好。虽然[一些](https://ai.googleblog.com/2017/07/revisiting-unreasonable-effectiveness.html) [大型](https://medium.com/syncedreview/facebook-model-pretrained-on-billions-of-instagram-hashtags-achieves-sota-results-on-top-1-imagenet-ae8113bb3145) [公司](https://arxiv.org/abs/2005.14165)仍然能够在这些领域免费获得大量数据,但其他人都需要人类手动标记这些数据,然后才能在其上训练机器学习模型,这需要很长时间。
因此,组织收集和记录的数据比他们能够标注的要多。确定要标注什么数据,快速标注大量数据,然后保证数据和标签的干净和准确,这些都需要很大的努力。深度学习应用看起来更像是自动化问题,而不是像以前的模型那样是一个预测/预测问题。
仍然需要努力将您的管道扩展到更大的模型和数据集。然而,在建模方面,很容易从货架上取下最先进的预训练模型,在自己的数据集上对其进行微调,并获得相当好的性能。模型性能的提高不再来自特征工程或超参数调整。大部分收益来自于修正标记错误的数据或收集更多模型有困难的挑战场景的例子。这是数据运营团队可以做得非常好的工作!吴恩达将这种范式描述为以数据为中心的人工智能,而不是以模型为中心的人工智能。**因此,数据和 ML 工程师不再是关注的中心,数据运营经理现在最有能力通过适当的数据监管来改善他们的 ML 管道。**
# 为成功设置数据操作
## 协作,而不是替代
现代深度学习应用程序用于自动化现有的工作流程。一个团队会希望使用一个 ML 模型来完成一部分已经由人工操作人员完成的工作。然而,在细致入微或高风险的任务中(如阅读 MRI 扫描以检测癌症),建立一个你可以相信像人类专家一样准确的 ML 模型是极其困难的。
因此,许多成功的深度学习应用将数据操作团队[与 ML 模型](https://hbr.org/2018/07/collaborative-intelligence-humans-and-ai-are-joining-forces)结合起来**协同工作**。为了解释这一点,让我们想想当你带来一个新同事时你会怎么做。当一个新的人类同事开始在一个数据操作团队工作时,你给他们一些关于如何工作的基本指导,让他们在一些简单的场景中工作,然后检查他们的工作并给他们反馈如何更好地工作。随着他们的工作越来越好,可以相信他们会从事更艰巨的任务,或者在新项目上承担更多责任,并最终培训新同事。
使用人工智能模型就像带来一个“人工智能同事”当你的新人工智能同事在你的团队中开始工作时,你组装一个训练数据集来给出模型(基本指令),在一个受限制的范围内部署一个初始模型(从一些简单的场景开始),然后分析模型的失败案例,并向其训练集添加更多数据,以提高其性能(纠正性反馈导致改进)。
这种协作流程的优势在于,ML 模型可以比人工操作团队更快地处理简单的案例,同时将复杂的案例提交给人工专家进行审查。人类专家可以仔细检查模型的输出,以获得对其性能的信任,并纠正模型的失败案例。随着模型在某些任务上变得更好,人类专家可以减少他们在这些任务中的参与,并致力于扩展模型的功能以处理更复杂的情况。
如果团队让这种设置发挥作用,他们现在就有了一个人工智能同事,他的工作速度比人类运营团队快得多,不会放弃或疲倦,最重要的是,他可以积累比任何单个人类运营团队成员头脑中所能掌握的更多的知识(通过大规模和多样化的训练数据集)。所有这些都大大减少了数据运营团队的工作量!
## 工具间隙
为了与人类同事交流,数据操作团队可以使用培训材料,如文档、幻灯片或通过共享的人类语言进行直接对话。相比之下,与 ML 模型沟通要困难得多。人类无法用自然语言和一个模型对话!因此,数据运营团队通常不太了解模型在做什么,哪里做得好/不好,以及如何提高其性能。想象一下,如果你没有懈怠,你正试图用烟雾信号与同事交流!
我们所知的“MLOps”大部分都是围绕着建立数据管道、版本化模型和自动编排模型再培训的工具。这些非常适合以编程方式移动、处理和跟踪数据。它们在快速训练模型或大规模高效地提供模型推理方面也很有效。
但“MLOps”类别并不迎合数据运营团队。它迎合了数据工程师!数据操作团队既没有时间也没有工程能力来编写定制代码来完成他们的工作。如果没有好的工具,数据操作团队要么必须依靠工程师来完成基本的数据管理任务,要么必须使用不适合其用例且效率极低的通用工具。我见过团队使用电子表格和 Mac Preview 管理他们的数据集!
数据操作团队需要无代码工具来可视化和操作 ML 数据集。这种自省工具将帮助他们找到模型失败的模式,阐明为什么模型会犯这些错误,然后帮助他们编辑他们的数据集以修复这些错误。通过这种方式,他们可以高效地运行,而不需要工程团队的日常帮助,从而允许他们更快地迭代,更快地交付更好的模型。
## 组织中的数据操作
尽管数据操作团队非常重要,对系统性能有着不可思议的影响,但他们在 ML 团队中经常被视为二等公民。他们被视为繁重的劳动,是获取足够数据来训练模型的必要工具,当模型足够好时,这支劳动力队伍最终将被取代。他们获得了必须生成多少数据的配额,却不知道为什么需要这些数据,也不知道这些数据对系统性能有什么影响。当他们与客户交谈时,他们对模型的性能负责,但是当他们依赖其他团队的基础架构时,他们没有太多的杠杆来改进模型。
出现这种情况是因为 ML 团队的第一批成员通常是在开源数据集上一起构建模型的工程师。然后,他们让数据运营团队成员来“帮忙”,减少对工程师标记数据或管理标记团队的需求。这使得数据操作从一开始就处于辅助角色。
围绕数据操作团队组建 ML 团队,并让工程师支持他们的工作流,通常比反过来更有效!数据操作团队通常最了解问题域、客户需求和业务考虑。工程团队的工作应该是在不牺牲最终客户质量的情况下,自动完成数据操作工作流程中的繁重工作。因此,机器学习与其说是数据运营团队的替代品,不如说是让他们的生活变得更轻松的工具!
# 结论
AI 的大规模部署不会导致人类干预的彻底消除。取而代之的是,它将允许人类和机器一起**工作**来产生结果,而这在只靠其中一方是不可能的。
数据操作团队最终是处理模型和数据日常工作的人。它们是客户/用户需求和机器学习系统之间的桥梁,并通过不断整理训练数据在模型的日常改进中发挥着关键作用。
然而,数据运营团队往往不是为了成功而成立的。由于工具简陋,他们依赖工程师来完成工作流程中的基本任务。因为他们不是 ML 专家,所以被当作 ML 团队的二等公民。
但是,当配备了正确的工作流、正确的工具和正确的组织设置时,数据操作团队在提高模型性能方面具有不可思议的力量。它们是 ML 部署成功与否的成败因素。我觉得说数据运营团队是 ML 的无名英雄很公平!
# 任务嵌入的效用
> 原文:<https://towardsdatascience.com/the-utility-of-task-embeddings-e00a18133f77?source=collection_archive---------24----------------------->
## 训练适应性神经网络

弗朗西斯科·温加罗在 [Unsplash](https://unsplash.com/s/photos/handwritten-numbers?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 上拍摄的照片
# 适应性网络
任务嵌入是一种使神经网络适应新任务的技术,并有望减少其他方法存在的一些问题。对于训练网络执行的每个任务,在训练过程中向网络提供任务的丰富表示(任务嵌入向量)。当嵌入被正确执行时,对于相似的任务,任务嵌入向量将是相似的。在没有额外训练的情况下,在给定新任务嵌入的新任务上,网络可以推断出它应该做什么。
扩展训练好的网络的有用性的一种流行方法是迁移学习。基本思想是,使用非常大的训练数据集训练神经网络来完成某项任务,然后使用较小的训练数据集进一步训练神经网络来执行另一项任务。例如,如果网络在稍后被训练来分类文档之前已经被预先训练来“填补”具有缺失单词的句子的空白,则网络在用于分类文档时可以表现得更好。
这种方法有一些缺点。如果迁移学习培训过程中的第二步过于广泛,那么网络将开始“忘记”最初培训的内容。当网络被要求学习更多的任务时,它忘记先前任务的可能性增加。这被称为“灾难性遗忘”。所有网络(即使是那些使用迁移学习的网络)的当前局限性在于,它们受限于有限数量的任务,并且必须被训练(或再训练)以学习新的任务。
任务嵌入可以是一种替代或补充的方法,因为它可以减少在多项任务中表现良好所需的训练次数。任务嵌入的威力用两个简单的数据集来说明——一个单变量的例子和一个 MNIST 的例子。
# 任务嵌入概念
考虑神经网络的一种方式是将其视为一台机器,该机器被训练成将一个空间中的点映射到另一个空间中的点。如果仔细训练,机器将进行归纳,这意味着它将根据一个从未见过的点与它见过的点的相似性来绘制该点。(见图 1 左部分。)

图一。神经网络学习将一个空间中的点映射到另一个空间中的点。任务嵌入允许网络学习不同的映射。*作者图片。*
在给定任务上训练的网络在面对新任务时失败,因为它不知道它需要以任何不同的方式进行映射,并且不知道如何改变它所做的映射。在任务嵌入中,我们向网络提供关于它正在执行的任务的丰富信息,同时训练它同时执行多个任务。它为每个任务学习不同的映射。(见图 1 中间部分。)当出现一组它从未见过的点,并被要求执行一项它从未接受过训练的任务时,网络在它知道的任务之间进行插值,并为新点导出一个合适的映射(见图 1 右部分。)
# 单变量例子
在本例中,要求网络在给定 x 值的情况下预测多个线性或二次方程之一的 y 值。这些方程采用以下形式:
-8(x+1)(x-4)+9
使用一种算法来生成方程。假设系数的范围被限制在 0 到 9,可能的等式总数是 128,304。该算法中的 9 个步骤中的每一个都进行随机选择,并且在方程生成期间进行的选择序列是该方程的向量表示。对于上面的等式,其矢量表示为
[1, 8, 1, 2, 1, 1, 4, 2, 9]
这用作给定 x 值的情况下为该方程预测 y 值的任务的任务嵌入。
为了使用任务嵌入,嵌入被连接到 x 值,然后被馈送到网络中。上述等式的 x 数据点,例如值为-5,将通过连接等式表示和 x 值来表示。例如:
[1, 8, 1, 2, 1, 1, 4, 2, 9, -5]
训练数据集由 400 个随机方程构成,每个方程有 2000 个 x-y 对。出于评估目的,训练集被强制包含四个已知方程,并被强制排除四个已知方程。
训练集用于在 2 个时期内训练具有单个 100 节点隐藏层的网络。
训练完成后,要求网络从随机生成的一组 x 值中推断出已知在该组中的 4 个方程和已知在该组之外的 4 个方程的 y 值。换句话说,网络被要求执行 8 项不同的任务,但只在其中的 4 项上接受了训练。图的顶行是训练集中的等式。第二行是训练集之外的方程。蓝色点是实际的,橙色点是预测的。(参见图 2。)

图二。任务嵌入允许神经网络很好地执行它没有学习过的任务。
作为对照,进行了相同的实验,除了不是丰富的任务嵌入,而是将单个随机数字连接到每个等式任务的训练集中的 x 值。网络能够学习任务的正确映射,但是在丰富的任务嵌入中却不能。它完全没有预测到任何它没有看到的任务。(参见图 3。).

图 3。没有任务嵌入,网络在未训练的任务上失败,在训练的任务上挣扎。
生成任务嵌入的方法产生了一个相当紧凑的表示——只有 9 位数字。如下所示,紧凑的任务嵌入会产生更好的结果。
为每个方程生成任务嵌入的一种简单方法是为描述方程的字符串中的 16 个字符中的每一个分配一个数值——这比紧凑方法多产生 1015 个状态。它悲惨地失败了,无法通过超参数调整或更多的训练来改善。(参见图 4。)

图 4。用幼稚的方法创建任务嵌入可能导致无法训练网络。
然而,使用主成分分析(PCA)压缩方法(从 16 位下降到 11 位)压缩朴素任务嵌入显著恢复了在紧凑方法中看到的保真度。(参见图 5。)

图 5。简单任务嵌入的压缩恢复了在紧凑任务嵌入中看到的保真度。
从这个简单的例子中我们可以看出:
* 如果没有任务嵌入,网络就无法完成没有经过训练的任务
* 紧凑的任务嵌入效果更好
# MNIST 的例子
MNIST [数据集](http://yann.lecun.com/exdb/mnist/)用于训练网络执行 7 项任务。在每个任务中,网络被训练来学习图像是否是指定的数字(对于数字 0 到 6)。例如,一个任务是,“这个图像是数字 4 吗?”然后,在没有额外训练的情况下,评估网络在所有十个任务(数字 0 到 9)上的表现。网络对一项任务的准确性取决于网络正确回答问题的频率。(参见图 6。)

图 6。使用 MNIST 数据集进行推断。图片作者。
通过任务嵌入,网络能够在它被训练的数字和没有被训练的数字之间获得相似的结果。在没有任务嵌入的情况下,网络对数字 7、8 和 9 能够执行的最好结果将是 10%,因为这是那些数字在测试集中的普遍程度。(参见图 7。)

图 7。对于仅在数字 0 到 6 上训练的网络,在十个数字上的分类精度。
从这个例子中,我们了解到
* 任务嵌入可扩展到更复杂的数据类型
* 基于 PCA 的压缩产生合适的任务嵌入
# MNIST 的紧凑任务嵌入
为 MNIST 示例创建任务嵌入的一种简单方法是为每个任务选择一个随机选择的图像。对于“这个图像是数字 4 吗?”,可以从训练集中随机选择标签为 4 的图像,并将其连接到该任务的所有训练和测试图像。因为 MNIST 图像是 28×28 像素,总共 784 个元素,所以任务嵌入图像将是它的两倍,1568 个元素。
基于在单变量例子中所学到的,紧凑任务嵌入学习得更快并且产生更高精度的结果。为此,应用了压缩技术。在这个例子中,主成分分析(PCA)被管理来将随机选择的图像从 784 个元素压缩到 264 个元素(减少了 66%)。然后将压缩图像连接到任务的训练和测试图像。
实际上,PCA 识别出一种线性变换,该线性变换在给定从图像中移除固定数量的像素的目标的情况下,最大化图像中保留的信息。在这个例子中,PCA 算法被提供了来自数字 0 到 6 的训练集的 1000 个图像的随机集,以便它可以建立线性变换。数字 7 到 9 被排除在外,因为网络必须在没有任何交替任务的知识或交替任务的数据的情况下被训练。产生的变换保留了 1000 个图像中图像之间 99%的变化。然后将线性变换应用于每个任务的随机选择的图像。
其他图像压缩技术可能证明同样有效,并可能具有其他优势,如更少的处理。
# 结论
使用任务嵌入可以使神经网络具有可扩展性。通过几个简单的例子可以看出,经过一系列任务训练的网络可以用来执行额外的任务,而无需额外的训练。将任务嵌入整合到迁移学习方法中可能会缓解一些灾难性的遗忘挑战。
用于构建任务嵌入的简单方法可能严重阻碍网络的学习能力,并且可能限制网络的整体准确性。压缩任务嵌入在单变量和 MNIST 例子中是可行的。似乎有足够的空间来探索压缩替代方案。
在本文探讨的例子中,作者选择了基于对数据和任务的理解来生成任务嵌入的方法。创建一个无需专家干预就能得出自己最优任务嵌入的系统,可能是一般智能的基石。这方面的一个问题是,训练数据中是否有足够的信息供系统构建自己的嵌入方法?此外,有没有一些嵌入方法对于所有可能任务的子集都很有效,但是对于某些类别的任务仍然失败?
# 心理和教育测验的有效性
> 原文:<https://towardsdatascience.com/the-validity-of-psychological-and-educational-tests-dc69421d7d4f?source=collection_archive---------30----------------------->
## 如何确保你对心理特征的测量具有有效性

由 [Celpax](https://unsplash.com/@celpax?utm_source=medium&utm_medium=referral) 在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄的照片
在物理学中,我们经常会有一个仪器,它是物理存在的,测量物理性质。例如,测量长度的仪器利用这一特性(即长度)来测量另一个物体的长度。因此,没有必要证明这个性质与被测量对象的相同性质是一致的。
然而,在某些情况下,这一点并不清楚。例如,如果我们使用多普勒效应测量速度,那么仪器就是星系光线谱线的近似值/距离。在这种情况下,我们有一个仪器有效性的问题,因为我们需要知道谱线之间的距离与速度有关是真是假。对于这一点,我们必须从经验上证明。效度在使用间接测量的知识领域很常见。在心理社会科学(如心理学、教育学)中,发生在多普勒效应上同样的事情非常普遍,尤其是当我们使用潜在特质(如快乐、焦虑、吸引力)的概念时。
从心理学的角度来看,我们可以将潜在的特质(或结构)视为我们头脑中的特征。那些特征,例如某人的个性,不能通过直接的方法来评估。相反,我们所做的是测量一个人的行为,并推断它们来自同一个地方(即来自我们大脑的特征)。
当然,我们有很多方法来衡量潜在的特质,一种常见的方法是通过问卷/调查,例如,人们在 1(完全同意)到 5(完全不同意)的范围内回答。假设我们要测量[在工作场所的自我效能](https://onlinelibrary.wiley.com/doi/abs/10.1111/j.1559-1816.1994.tb00552.x)。我们根据自我效能的定义开发项目,然后呢?怎么才能知道自己的考试成绩意味着什么?自我效能感是单一因素还是可以分为不同方面?这就是寻求有效性的作用,正确地衡量我们想要什么。
# 有效性历史
## 1900-1950:内容有效性的霸权
在那个时候,人格理论是新的时尚。一般来说,大多数理论(如精神分析、格式塔和现象学)几乎没有经验推理。在这种情况下,人格特征测试被认为是有效的,只要测试内容与理论上定义的特征内容相匹配。
## 1950-1970:标准效度的普及
行为主义对心理学很有影响,当然,对心理测量学也有影响。测试是作为必须预测其他行为或未来行为的行为样本进行的。如果这些测试准确地预测了未来(或另一个场合)的行为,那么它们就是有效的,成为有效性的新路径(称为标准有效性)。为什么测试预测了行为并不重要,只要他们预测到了,这就足够了。正如我们可以想象的那样,有一种从思考理论到关注统计的逃避。不是建立一个测试来测量一个潜在的特质,而是从一个项目池中选择看起来像他们想要测量的项目,基本上使用统计分析来解决他们的问题。
## 1970 —今天:结构效度的上升
在 1955 年克朗巴赫和米尔发表了一篇关于三位一体的有效性模型(内容、标准和结构)的论文后,人们对有效性的思考方式发生了变化。理论之所以回到游戏中,是因为以下因素:
1. 想要利用因素分析,在经验的基础上发展人格和智力的理论。
2. 认知过程的研究。
3. 信息处理的研究。
4. 对教育和工作环境中使用的测试结果不满意。
5. 项目反应理论的影响。
关于心理工具有效性的焦点是关于结构有效性。现在,内容和标准效度只是结构效度的一个方面。
# 那么什么是有效性呢?
T2 对效度的经典定义是“当测试测量应该测量的东西时,测试测量什么以及测量得有多好”。然而,经典的定义让它看起来像测试是或不是有效的。为了改变这种二分法范式,T4 目前对效度的定义是“理论和证据支持对考试分数解释的程度”。因此,对于使用测试的每一种背景/目的和每一种预期的解释,测试分数都必须有有效性的证据”。现在,我们可以说,每一项措施都有自己的有效程度。
# 有效性的来源
## 基于内容的证据
收集关于测试项目表示的数据,调查它们是否是他们想要测量的领域的样本。考虑到对建议构造的评估,判断项目集的范围。一般来说,这是根据专家的评估来完成的,专家根据项目与待评估方面的关系来评估项目的重要性。可以使用一些统计检验,例如一致性百分比和 Kappa 系数。
例如:在提交的论文中,Bastos 等人(2021 年)为不同的社会群体创建了一个自我感知的偏见和歧视的衡量标准。作者使用以下程序根据内容寻求有效性:
1. 现有偏见和歧视测度的文献综述。
2. 将自我感知偏见定义为认为一个人是基于其社会群体对自己的负面态度的受害者;自我感觉的歧视是指认为一个人是基于其社会群体对自己的负面和不公正行为的受害者。
3. 根据这些定义和以前的措施,作者为其他社会群体开发了新的项目。
4. 创建项目后,他们将项目发送给专家(即心理学家和心理测量学家),以便他们可以评估项目。
5. 根据同意的比例,作者选择了九个项目进行分析。
## 基于响应过程的证据
收集关于完成给定任务的心理过程的数据。通常是关于个人的反应过程,研究人员询问被评估者关于达到给定结果的认知路径。作为一个例子,我们可以看到 [Noble 等人(2014)](https://www.researchgate.net/publication/265790720_Science_Assessments_and_English_Language_Learners_Validity_Evidence_Based_on_Response_Processes) 在他们的研究中寻求这种有效性。他们发现,与非英语学习者相比,英语学习者在高风险考试中的分数较低。根据采访,他们发现
> 英语学习者与测试项目的特定语言特征的互动经常导致对项目的不同解释,从而导致错误的答案。
## 基于内部结构的证据
收集关于项目相关性结构的数据,评估相同的结构。常用的统计检验有探索性因子分析(EFA)、验证性因子分析(CFA)、探索性结构方程模型。
作为例子,我们可以使用 [Selau 等人(2020)](https://www.researchgate.net/publication/345628570_Evidence_of_validity_and_reliability_of_the_Adaptive_Functioning_Scale_for_Intellectual_Disability_EFA-DI) 的论文。作者想测量 7 到 15 岁儿童的智力残疾。他们通过 EFA 和 CFA 调查了量表的内部结构,结构如下:

图片作者。
其中项目被分为社会因素、概念因素和实践因素,这些因素由称为适应功能的高阶因素来解释。
## 基于与外部变量关系的证据
收集关于测试分数和测量相同结构或不同结构的其他变量之间的相关性模式的数据。通常,为了获得这种效度,研究人员使用测试分数与其他变量的相关性。这种有效性可以是:
1. 仪器预测评估结构能力的证据。
2. 当我们有测试测量**相同的** **构造**时,我们期望它们是紧密相关的。
3. 当我们有测量**相关构造**的测试时,我们期望它们适度相关。
4. 当我们有测试测量不同的结构时,我们期望它们是不相关的。
[Beymer 等人(2021)](https://www.researchgate.net/publication/345982659_Validity_Evidence_for_a_Short_Scale_of_College_Students%27_Perceptions_of_Cost) 开发了一个大学生成本感知量表。他们将量表中的项目与学生的感知和价值观联系起来。他们预期(并发现)“成本”与“期望值”和“价值”负相关(你可以在他们的论文中看到每个变量的定义)。
## 基于测试结果的证据
根据建立测试的原因,检查使用测试的有意或无意的社会后果,以验证其使用是否产生了预期的效果。如果测试被用于与它们被建立的原因相同的原因,它们就具有这种类型的有效性。虽然你不能预测人们会用你开发的工具做什么,但工具作者的责任需要讨论。
作为一个例子,我们可以考虑智商测量。它的目的是测量人的智力。然而,我们可以看到,在历史上,智商有时被用来为种族主义辩护。
我们可以看到,有很多步骤来确保我们的心理特征测量具有一定程度的有效性。遵循这些程序,我们有更多的信心来推断心理特征和其他变量之间的关系。在实践中,人们通常只寻求三种类型的有效性:内容、内部结构和与其他变量的关系。我认为出现这种情况有两个原因:
1. 基于反应过程和测试结果寻求效度的困难。为了寻求基于反应过程的效度,研究者需要投入更多的时间和金钱来采访足够多的参与者。根据测试的结果来寻求有效性是很困难的。作者需要思考和预测它在最近和遥远的未来的使用,一些后果可能(几乎)无法预测。
2. 作者不认为他们的工作是寻求这两种类型的有效性,因为他们都:a)不认为人们如何对待他们的工作是他们的责任;b)认为他们的测量很棒,没有任何缺陷,这可能是真的,但在得出结论之前有许多事情要考虑,这些事情保证了其他一些反应偏差不会干扰结果。
总之,我希望你现在更加相信心理学和教育研究在经验和理论基础上有一定程度的有效性。我想事情也很容易理解,谢谢你一直读到现在。
# 接触
请随时通过以下方式联系我
> Gmail:rafavsbastos@gmail.com
> 咨询和合作网站:[rafavsbastos.wixsite.com/website](https://rafavsbastos.wixsite.com/website)LinkedIn:[linkedin.com/in/rafael-valdece-sousa-bastos/](https://www.linkedin.com/in/rafael-valdece-sousa-bastos/)
# 参考
米(meter 的缩写))N. Baptista 和 A. E. de Villemor-Amaral,*compêndio de avalia o psicolóGICA,* 2019,Editora Vozes。
长度 Pasquali,*Psicometria:teoria dos testes na psicologia e na educao,* 2017,Editora Vozes Limitada。
R.V. S. Bastos,F. C. Novaes,J. C. Natividade,《偏见和歧视自我认知量表:有效性和其他心理测量性质的证据》, 2021 年,提交给同行评审的手稿。
# 学位对有抱负的数据科学家的真正价值
> 原文:<https://towardsdatascience.com/the-value-of-a-degree-for-aspiring-data-scientists-8c42a261e502?source=collection_archive---------26----------------------->
## [办公时间](https://towardsdatascience.com/tagged/office-hours)
## 以及如何在没有这些的情况下获得成功

[瓦西里·科洛达](https://unsplash.com/@napr0tiv?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)在 [Unsplash](https://unsplash.com/s/photos/graduation?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 上的照片
"我需要研究生学位才能得到一份数据科学家的工作吗?"
我经常被问到这个问题的一些版本。
这是一个合理的假设——考虑到 MSc。或者博士学位都列在招聘岗位的要求里。
作为一名博士辍学生,我想用一个有力的*不*来回答。作为一名研究生,我有一段不太理想的经历。它根本没有让我为就业市场做好准备。
但是完整的答案有点复杂。
我不认为研究生学位能让你为就业市场做更好的准备——至少,不足以证明时间和金钱上的成本。是的,你会学到很多。但是你可以从免费的在线课程中学到同样多的东西——如果不是更多的话(有一个好的导师也有帮助)。
然而,拥有一个学位——越高越好——会让你在就业市场上占得先机。这是因为教育作为一个信号对雇主来说是有价值的。布莱恩·卡普兰在反对教育的案例中提出了这样的观点:
> 大学毕业生的收入溢价飙升至 70%以上。…如此有利可图的投资怎么会浪费呢?答案是一个单词… **发信号**。即使学生在学校学到的东西毫无用处,如果他们的学业成绩提供了关于他们生产力的信息,雇主也会很乐意支付额外的费用。
卡普兰的观点是,高等教育不会产生更好的工人。它只是揭示了就业市场重视的预先存在的特征——智力、责任心和一致性。
对雇主来说,这些特质的结合才是有价值的。没有学位,很难对这三者都发出信号。例如,你可以通过技术面试来测试候选人的智力,但测试他们的认真程度和顺从程度要困难得多。布莱恩·卡普兰的来信:
> 你不可能一眼就发现一个人真正的职业道德。你当然不能问“你的职业道德有多好?”期待坦诚……信号不一定是确定的,总比没有强。
那么,你需要研究生学历才能在数据科学领域找到工作吗?
嗯,不。你不需要它。但这很有帮助。
这不一定会让你成为一名更好的员工,但这将是你进入职场的一个有用信号。
# 代替学位做什么
有一个比学位更好的信号——实际工作经验。
如果你已经在其他地方做过类似的工作,这是一个很强的信号,表明你知道自己在做什么。 [SharpestMinds](https://www.sharpestminds.com) 的学员经常报告说,当他们寻找第二份工作时,求职变得容易多了。第一个是障碍。
然而,技术提供了一个变通办法。对于某些类型的技能,你可以不被雇佣而获得经验。我在[的博客文章](/want-to-break-into-data-science-start-building-db5ed24a7d77)中为*向数据科学迈进*提出了这个观点:
> 对于许多职业来说,你需要找到一份工作来开始积累工作经验。但是当涉及到数据科学和机器学习时,有一个奇妙的区别——在被雇用之前,你可以获得大量的经验。怎么会?靠**造东西。**
通过项目组合的工作证明,可以帮助表明你作为数据科学家的能力。但是记住,你也要表现出一致性和责任心。你想表明你能遵守规则和惯例。并且你有把事情做好的愿望——用心和勤奋。所以不要只是把 MOOCs 和 bootcamps 的一堆 Jupyter 笔记本和 capstone 项目扔在 GitHub 上,然后就收工了。对你建造的东西多加小心。
你可以通过关注项目的细节来表现出责任心。笔记本适合探索和原型制作,但不适合迭代和协作。多做一点,编写干净的模块化代码。将您的文件组织到一个合理的文件夹结构中。
为您的项目准备一份好的自述文件——包括运行代码和为代码库做贡献的说明。如果我可以克隆你的回购协议,并让它在我的机器上运行,而没有太多的头痛,你会从我这里得到主要的加分。
注意硬编码的路径和键。让环境容易重现。拥有一个 requirements.txt 对于大多数爱好项目来说已经足够好了,但是仍然表明你在环境可复制性上花了一些心思。
以上很多情况也可以表明你是从众的。您应该表明您采用了最佳实践,并且了解如何使用通用工具和框架。看看一些流行的开源库,模仿它们的项目结构和文档。让你的代码符合 [PEP8](https://www.python.org/dev/peps/pep-0008/) 风格指南。写好的[提交消息](https://chris.beams.io/posts/git-commit/)。
一个完整的学位作为一个信号是有用的,因为它需要多年才能完成。它向潜在雇主表明,你可以启动一个长期项目,并坚持到底。这就是为什么拥有一个维护良好的项目的投资组合比拥有几十个废弃项目和原型的投资组合更有价值。
建立端到端的东西,并投入持续的工作。像对待产品一样对待它。你希望向雇主发出信号,表明你可以将目标设定在一个问题上——一个模拟实际商业问题的问题——并长期坚持下去。构建一个好看的前端。与世界分享。定期捐款以表明你没有放弃它。
超越“初始提交”。
# 数据分析对领导者和管理者的价值
> 原文:<https://towardsdatascience.com/the-value-of-data-analytics-to-leaders-and-managers-eaf4e6e769a3?source=collection_archive---------30----------------------->
## 在数据科学和数据成为“新石油”的时代,数据分析对当今的领导者和管理者有什么价值?他们如何利用这种能力获得持续的竞争优势?

亚历山大·辛恩在 [Unsplash](https://lincolncollege-my.sharepoint.com/s/photos/big-data?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 上的照片
## 利用数据分析对公司有什么好处?
有必要先问一问利用数据分析的公司是否能够获得一种使他们与众不同、超越竞争对手的能力。
事实证明,有大量证据证实这个问题的答案是“是”,包括 Wegener & Sinha 的一份报告显示,使用数据分析的公司成为顶级财务表现者的可能性是其他公司的两倍,麦肯锡公司的另一份报告显示,数据分析公司的税前利润比其他公司增加了 20%。
除了这两个例子,还有大量的研究和证据支持这样一种观点,即接受数据分析将改善业务成果并带来竞争优势。
## 战略利益是什么?
有一种传统观点认为,具有良好数据分析成熟度的公司在每次会议开始时都会查看公司数据仪表板,每个决策者都可以立即访问大量详细描述公司业绩细节的电子表格。
这可能有一定的道理,但在更高的层面上,拥有成熟数据分析能力的公司的领导者和经理知道如何问和回答正确的问题,从而给予他们独特的洞察力和做出正确决策的能力,以推动公司业绩。
众所周知,维克多·基亚姆“非常喜欢剃须刀,他买下了这家公司”,但事后看来,这个决定是一个被称为“替代”的例子,这是一个著名的心理效应,对数据驱动的公司产生了影响。
在企业收购过程中,有许多问题应该被提出,但在提出“雷明顿公司的股票被低估了多少?”Victor 似乎已经回答了“我个人有多喜欢它的一种产品?”。
在数据分析公司中,替代效应可以简单地通过寻找将告知决策的数据和信息来解决。在 Remington 的例子中,所需的主要数据可能是历史股票市场表现和销售趋势,而不是单一的样本产品调查,这将导致正确回答与收购决策相关的正确问题。
除了避免用一个不同的问题代替被问的问题,数据分析领导者和公司更有可能在第一时间提出正确的问题。
在“可乐大战”期间,两家领先的公司之一生产了一种新的、有吸引力的玻璃瓶,并在销售方面领先于其主要竞争对手。竞争对手迅速成立了一个工作组,设计和生产一种更有吸引力的瓶子,以赢回顾客。
在这个任务中失败后,团队从这个问题后退一步问,“什么是正确的问题?”以及“我们需要什么数据?”。事实证明,正确的问题是“我们如何卖出更多的可乐?”,与客户需求相关的正确数据和答案是开发普通的旧 2 升塑料瓶,从而提高销售额和利润。
这是一个提出正确问题的经典例子,数据分析领导者和公司更有可能意识到这一点,并以改善其结果的方式提出业务挑战。
## 数据与直觉
在《思考的快慢》中,诺贝尔奖获得者丹尼尔·卡内曼提出了许多反对纯粹直觉决策的论点,并为使用数据分析来增强、通知和支持重要的商业决策提供了有力的证据。
罗杰·费德勒在网球中可以凭直觉正手击球;他不需要考虑中风或在任务之前或期间处理任何想法,它只是自动发生。然而,罗杰可以快速执行 1000 个与镜头相关的决定,并获得即时、准确的反馈,以判断他的决定是对还是错。
现在考虑一个高级的商业决策,比如公司合并。领导者很可能会在职业生涯中做出一些如此重大的决定,即便如此,指示成功或失败的反馈在许多年内都不会为人所知。
第一个例子非常适合直觉,第二个例子要求直觉与准确、一致、及时和适用的数据相结合,以三角分析和验证领导团队的想法和观点。
数据分析并不意味着领导者和管理者的直觉应该被忽略或不重要,但它确实提供了一种宝贵的方式来检查直觉,如果两种观点不形成三角关系,就可以提出关于哪种观点是正确的搜索问题。
## 留给领导者和管理者的角色是什么?
有证据表明,精通数据的公司的表现明显优于“没有数据的人”,研究表明,直觉决策存在缺陷,决策者的角色是什么?人工智能算法最终会完全取代经理吗?
这种方法不仅会引起严重的士气和道德问题,而且现有证据强烈表明,决策者不仅要发挥作用,而且他们的作用对于从数据分析中获取商业价值至关重要。
我最喜欢的数据科学引语来自 Mike Schmoker 博士,他说:“只有当我们收集的数据能够通知和激励那些有能力做出改变的人时,事情才能完成”。
我对这句著名的数据引语的解释是,我们可以拥有顶级的数据科学家、最准确、最及时和最一致的数据、最视觉震撼的图形和图表以及最好的机器学习模型,但如果领导者和管理者不利用它们来影响和告知关键的商业决策,所有这些都是徒劳的。
在数据术语中,有三种主要的数据分析类型:
“描述性分析”从时间上回顾已经发生的事情,并将它们记录在图表和报告中。
“预测分析”使用历史数据和统计技术来预测未来可能发生的事情。
“规范分析”采用前两者的输出和结果,并将其应用于商业决策,以推动和优化业务成果。
说明性分析是最重要的一步,因为没有它,那些复杂而聪明的描述性和预测性模型将被束之高阁,不会对业务成果产生任何影响。
为了实现所强调的好处,包括最高的四分之一财务业绩和 20%的收入增长,领导者和经理必须充分参与,知道向数据专家询问什么问题,然后使用数据分析产生的洞察力来制定高质量的决策,这将是未来文章的主题。
## 结论
我们探讨了获得成熟数据分析能力的公司可以获得哪些好处,战略好处是什么,数据如何补充和增强直觉决策,以及领导者和经理如何在将所有潜力转化为已实现的业务好处方面发挥关键作用。
“VRIO”框架表明,一项业务能力必须是有价值的、稀有的、昂贵的,以供其竞争对手模仿,公司必须组织起来从中获取价值,如果这些事情都成立,公司将实现持续的竞争优势。
如果领导者和管理者可以影响他们的公司获得并发展通过这四项测试的数据分析能力,那么就有很大的机会获得持续的竞争优势,然后数据可能真的会成为新的石油。
# 当数据驱动的决策产生不好的结果时
> 原文:<https://towardsdatascience.com/the-variable-db2c0896c2e0?source=collection_archive---------24----------------------->
在其核心,数据科学是一门学科,其目的是帮助人们-企业主、医生、教育工作者、公务员-做出良好的现实世界决策。这种假设是,随着我们的行动越来越多地受到数据的影响,结果会有所改善。但事实总是如此吗?数据会把我们引入歧途吗?
Khemani 在[最近发表的关于达成最佳决策的文章](/make-good-decisions-aed89eca68c8)中深入探讨了这个问题。以他女儿的新智能手机为例(以及为它购买保险是否有意义),他解释了我们日常决策过程背后的数学原理。这是对应用统计学*和*的极好介绍,也是做出理性决策的便捷指南。
我们本周的其他重点包括决策的更多方面。它们的范围从为给定的任务选择特定的算法到评估足球运动员的表现。让我们开始吧。
* [**看一看引擎盖下的推荐系统**](/dynamic-topic-modeling-with-bertopic-e5857e29f872) 。许多阅读《变量》的读者也会收到《媒体周刊》的推荐文章摘要。Sejal Dua 想要更深入地了解这个列表是如何组成的,以及它可能会说明她的习惯,所以她使用主题建模算法 BERTopic 对它进行了逆向工程。

马丁·洛斯塔克在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄的照片
* [**了解评估技能背后的猫腻**](/data-driven-evaluation-of-football-players-skills-c1df36d61a4e) 。教练过去依靠记忆和本能来塑造他们球队的战略;随着体育分析学的出现,这已经不够了。Ofir Magdaci 最近涉足足球世界(或者英式足球,如果你坚持的话)显示了评估球员潜力和技能的过程是多么复杂。
* [**探索大数据可视化的有力工具**](/big-data-visualization-using-datashader-in-python-c3fd00b9b6fc) 。有时,成功与失败、好与坏的结果之间的差别,取决于我们为工作选择的工具等小细节。 [Sophia Yang](https://medium.com/u/ae9cae9cbcd2?source=post_page-----db2c0896c2e0--------------------------------) 的最新贡献向我们展示了她的 Datashader 工作流,并解释了如何使用它快速创建大规模数据集的有效可视化。
* [**选择正确的指标来评估一个模特的表现**](/two-essentials-for-ml-service-level-performance-monitoring-2637bdabc0d2) 。Aparna Dhinakaran 说:“当被视为一个整体服务时,ML 应用程序也必须通过其整体服务性能来衡量。”深入到服务延迟和推理延迟的细节中,Aparna 解释了如何优化模型——以及我们对模型的监控——以产生最好的结果。
* [**深入了解围绕 AI 监管的利害关系**](/the-present-and-future-of-ai-regulation-afb889a562b7) 。随着近年来围绕人工智能安全和算法偏见的对话激增,那些围绕改善治理和监管需求的对话也在激增。在 TDS 播客上, [Jeremie Harris](https://medium.com/u/59564831d1eb?source=post_page-----db2c0896c2e0--------------------------------) 最近与 [Anthony Habayeb](https://medium.com/u/bd98ad519a4f?source=post_page-----db2c0896c2e0--------------------------------) 谈论了这一发展对企业、政府和从业者的影响。
一如既往地感谢阅读、分享和[支持我们作者的工作](https://medium.com/membership)。
直到下一个变量,
TDS 编辑
# 我们策划主题的最新内容:
## [入门](https://towardsdatascience.com/tagged/getting-started)
* [Eclat 算法](/the-eclat-algorithm-8ae3276d2d17)由 [Joos Korstanje](https://medium.com/u/8fa2918bdae8?source=post_page-----db2c0896c2e0--------------------------------)
* [创建数据科学组合](/creating-a-data-science-portfolio-bd485382f49)作者[马腾·格罗滕·多特](https://medium.com/u/22405c3b2875?source=post_page-----db2c0896c2e0--------------------------------)
* [7 项用于研究的重要 Python 技能](https://medium.com/towards-data-science/7-essential-python-skills-for-research-496e1888e7c2)作者[托马斯·汐宫光·克拉克](https://medium.com/u/e806fec87c25?source=post_page-----db2c0896c2e0--------------------------------)
* [这 17 个项目将比](/these-17-python-projects-will-teach-you-way-better-than-hello-world-14b28aa4c308)[祖列·雷恩](https://medium.com/u/14d5c41e0264?source=post_page-----db2c0896c2e0--------------------------------)的【你好世界】更好地教会你 Python 的方式
## [实践教程](https://towardsdatascience.com/tagged/hands-on-tutorials)
* [Miranda Auhl](/speeding-up-data-analysis-with-timescaledb-and-postgresql-e3bdfee41108)[使用 TimescaleDB 和 PostgreSQL](https://medium.com/u/b90a033543a7?source=post_page-----db2c0896c2e0--------------------------------) 加速数据分析
* “随机森林”里有什么预测糖尿病由 [Raveena Jayadev](https://medium.com/u/cb567727317e?source=post_page-----db2c0896c2e0--------------------------------)
* [纳迪姆·卡瓦](/where-to-place-wards-in-dota2-84f534b9b64e)[在 DOTA2](https://medium.com/u/85e7e8816e35?source=post_page-----db2c0896c2e0--------------------------------) 中放置病房的位置
* [K-Means 类的亲密接触](/close-encounters-of-the-k-means-kind-4aff91b3d0ab)由[威尔·克劳利](https://medium.com/u/dc95dc921204?source=post_page-----db2c0896c2e0--------------------------------)
## [深潜](https://towardsdatascience.com/tagged/deep-dives)
* [努力消除写作中的性别偏见](/towards-removing-gender-bias-in-writing-f1307d0a2b71)作者 [Srihitha Pallapothula](https://medium.com/u/49213da67c60?source=post_page-----db2c0896c2e0--------------------------------)
* [“经常一起买”推荐系统](/the-frequently-bought-together-recommendation-system-b4ed076b24e5)作者[本·博加特](https://medium.com/u/15826735bd93?source=post_page-----db2c0896c2e0--------------------------------)
* [邻域补漏白有用吗?山姆·麦克拉奇](/does-neighbourhood-trapping-work-18c8d8deb92c)
* [使用权重和偏差调整您的机器学习工作流程](/tune-your-machine-learning-workflow-with-weights-and-biases-mljar-automl-hyperopt-shapash-and-f0646500ea1f)由 [Jean-Michel D](https://medium.com/u/c607131f9cd3?source=post_page-----db2c0896c2e0--------------------------------)
## [思想和理论](https://towardsdatascience.com/tagged/thoughts-and-theory)
* [通过记录链接和监督学习执行重复数据删除](/performing-deduplication-with-record-linkage-and-supervised-learning-b01a66cc6882)由[休·林恩](https://medium.com/u/e2a164cff0bc?source=post_page-----db2c0896c2e0--------------------------------)
* [Word2vec with PyTorch:实现 Olga Chernytska](/word2vec-with-pytorch-implementing-original-paper-2cd7040120b0)[的原始论文](https://medium.com/u/cc932e019245?source=post_page-----db2c0896c2e0--------------------------------)
* [更快强化学习之旅](/a-journey-towards-faster-reinforcement-learning-1c97b2cc32e1)作者[扬·贝特洛](https://medium.com/u/be4a07da40d5?source=post_page-----db2c0896c2e0--------------------------------)
* [一个 Python 框架,用于检索和处理来自 TRIOS 传感器的超光谱实地测量数据(MDSA 格式)](/a-python-framework-to-retrieve-and-process-hyperspectral-field-measurements-from-trios-sensors-5e900158648e)作者:[毛里西奥·科代罗](https://medium.com/u/8878c77fe1a3?source=post_page-----db2c0896c2e0--------------------------------)
# 变分量子本征解算器——解释
> 原文:<https://towardsdatascience.com/the-variational-quantum-eigensolver-explained-adcbc9659c3a?source=collection_archive---------15----------------------->
## 一种量子机器学习算法
本帖是本书的一部分: [**用 Python 动手做量子机器学习**](https://www.pyqml.com/page?ref=medium_vqe&dest=/) **。**
变分量子本征解算器(VQE)是一种混合量子经典算法。它的目的是找到一个给定哈密顿量的最低特征值的上界。
如果你不是物理学家,你最合适的回答是:“ ***什么?!*** ”
好在[你不需要物理学家来理解量子机器学习](/you-dont-need-to-be-a-physicist-to-understand-quantum-machine-learning-e0c91db4dfc3)。所以,让我换个说法。
VQE 是一种算法,部分在经典计算机上运行,部分在量子计算机上运行。它让您找到解决给定优化问题的值的组合——大约。
解决最优化问题在机器学习中是至关重要的。机器学习算法依赖于一组参数。在训练期间,我们的目标是找到这些参数的值。由于我们不知道正确的值,我们试图从数据中学习这些值。
但这并不容易。随着参数数量的增加,值的可能组合的数量呈指数增长。让我们以国际象棋为例。
共有 64 个空格,每个空格有 16 个棋子。每个玩家移动一个棋子后,有 400 个不同的位置。每个玩家两次移动后有 72,084 个位置,三次移动后约 900 万,四次移动后约 2880 亿。有更多的 40 步游戏比已知的可观测宇宙中的原子数量。
我们如何找到最好的一个——或者至少是一个足够好的组合?这就像大海捞针一样。
这就是优化算法发挥作用的地方。
比如说,我们有一个参数,θ。然后,我们可以在二维图形中打印曲面。

作者弗兰克·齐克特的图片
X 轴显示θ的潜在值。我们将与相应θ值相关联的成本函数的输出映射到 Y 轴上。成本通常是计算错误或模型损失的结果。成本越低,解决方案越好。
优化算法的目标是找到成本最低的点。问题是,在优化过程中,你看不到这个图。只有在尝试之后,您才能看到与某个参数相关的成本。图形是不可见的。优化算法的起点是一个空的坐标系统,对图形的外观没有任何线索。

作者弗兰克·齐克特的图片
算法需要探索表面。
最著名的经典优化算法之一是梯度下降。它是一种迭代算法,在优化曲面上运行。对于它访问的每个值,它计算成本函数的梯度。这告诉算法前进的方向。
一旦梯度为零,算法达到最小值!但是这个算法有很多陷阱。它可能只达到了局部最小值或最终处于平稳状态。

作者弗兰克·齐克特的图片
为什么它不算出函数的形状?,你问?
在 2D 计划中,这种方法可能会成功。但是 2D 图代表的是由单一参数组成的模型。如果我们有两个参数,我们需要一个三维表面。

作者弗兰克·齐克特的图片
为了表示三个参数,我们可以动画 3D 表面(我们将使用时间作为表示维度)。已经很难说出成本函数的整体形状了,不是吗?
现在,假设我们有十个或二十个参数。不要在家里尝试,我相信下面的图像非常准确地描绘了绘制二十维图形的结果。

作者弗兰克·齐克特的图片
有时候,计算单个职位的成本并不容易。例如,在国际象棋中,棋子位置的值取决于整体设置。
在最简单的情况下,我们会根据每件物品的类型对其进行计数和称重。
在更高级的情况下,我们会根据一个棋子的类型和相对于其他棋子的位置来评估它的价值。没有对手的棋子比棋子值钱多了。不是吗?
这就是 VQE 发挥作用的地方。它让我们找到了一个难以计算的成本函数的组合问题的解决方案。VQE 使用参数化的量子电路来计算成本,并将其与运行在经典计算机上的优化器相结合。
下图显示了 VQE 的组件以及它们之间的交互方式。

作者弗兰克·齐克特的图片
这个过程从一个哈密顿量开始。哈密顿量是以威廉·罗恩·汉密尔顿的名字命名的。简单地说,它是我们旨在解决的问题的定义——以数字矩阵的形式。如果你想知道我们如何用矩阵来表示一个问题,考虑一下量子门(你可以在量子位上应用的操作)也是矩阵。因此,你可以用量子门来描述这个问题。
我们使用一组参数来控制量子态的制备。参数如何影响量子态由 ansatz 指定。
ansatz(德语中的 approach)是对答案可能是什么的一种数学猜测。它也是一组量子门。但它的重点是将问题转化为对特征值的估计——如果你愿意的话,是对性能的一种度量。ansatz 获取参数并创建一个量子态。一旦我们测量了这种状态,我们就可以估计这些参数的表现如何。
我们使用一个经典的优化器来计算一组新的参数,我们再次输入到量子电路中。我们迭代直到结果收敛。
# 结论
如果是这样,我们为什么要使用所有这些物理术语?
描述这种方法的原始科学论文旨在估计 H2 分子的基态能量。基态是系统能量最低的状态,即本征值。物理系统往往会损失能量。一旦它们到达基态并被单独留下,它将永远停留在那里。
VQE 只是意味着我们使用量子计算机来评估这个能量,使用经典计算机来选择如何提高参数,以便在下一次量子迭代中能量会更低。VQE 的想法是将量子计算机只用于一件事——获得给定参数集的能量值。其他一切都发生在经典计算机上。
本帖是本书的一部分: [**用 Python 动手做量子机器学习**](https://www.pyqml.com/page?ref=medium_vqe&dest=/) **。**

在这里免费获得前三章。
# 沃克斯三角:谜团解开了
> 原文:<https://towardsdatascience.com/the-vauquois-triangle-mystery-solved-420ca995e70b?source=collection_archive---------20----------------------->
## 经典机器翻译方法的演变

雷纳多·凯文在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上的照片
Vauquois 三角形是一个经典的层次模型,用于可视化各种机器翻译方法。在深入 Vauquois 三角形之前,我们先来看看什么是机器翻译。
**什么是机器翻译?**
机器翻译是使用计算机软件将一种自然语言的文本或语音翻译成另一种自然语言的过程。定义看似简单,过程却异常艰难。语言在很多方面都不同,语法上、句法上(句子结构)、语义上(意义)等等。这种差异被称为**翻译分歧**。
举个例子,想想韩剧《哦,我的维纳斯》中的一段话,
韩语:*mid eumyeon Hal su isso,hal su issdago mid nikka*
中文:*如果【你】相信【它】【你】能做到【它】,因为【你】相信【你】能*
我们可以看到,就结构而言,韩语遵循 SOV(主语-宾语-动词)协议,而英语遵循 SVO(主语-动词-宾语)。像韩语和日语这样的语言不会明确使用代词。这类省略代词的语言称为**亲降语**。这些差异使得机器翻译变得困难,因为必须正确识别和解释这些遗漏。这两种语言还有其他一些不同之处。译者必须分析句子中的所有成分,并且知道每个单词如何影响另一个单词。
## 沃克斯三角形
1968 年,Bernard Vauquois 研究了当时的机器翻译方法,并用三角形的形式来表示它。这就是著名的沃克斯三角。Vauquois 三角形可视化并描述了机器翻译的经典方法,展示了这些方法的演变。

作者图片
这些途径主要有:**直达**途径、**中转**途径、**中转**途径。当我们从直接法转向语际法时,每种方法所需的分析深度增加,而当我们从直接法转向语际法时,所需的知识转移量减少。
## 直接翻译
直接翻译方法使用双语词典来逐字翻译句子,其中每个源单词被映射到某个目标单词。翻译过程不使用任何中间结构,除了一些词法分析(分析单词的结构和部分的任务)或词汇化(将单词转换为其基本词典形式的任务,例如,*将*翻译为*翻译*)。
在分析句子的结构和部分之后,使用双语词典通过将每个单词映射到其目标语言单词来逐字翻译源语言。然后,对得到的目标语言句子进行一些简单的重新排序处理,以使其结构正确。
## 基于迁移的翻译
基于转移的翻译方法首先**解析**源语言句子以确定其结构,**基于语言之间的差异知识应用规则将**所得结构转移到目标语言解析结构,然后**从该转换后的结构生成**目标语言句子。
根据源语言和转移语言的不同,转移方法可能会有所不同。对于类似的语言,如法语和意大利语(几乎 90%的词汇相似),只需要**语法转移**,其中解析的源结构根据语法重新排序转移到目标解析结构。
对于韩国语到英语这样复杂的翻译过程,除了句法转换,我们还需要做一个**语义转换,**其中源结构需要根据它们在目标句子中的意义和语义角色进行转换。
## **语际翻译**
语际法首先分析源语言句子,将其表示为**语际、**和,然后从该语际生成目标语言句子。国际语是一种独立于语言的表示,可以基于任何表示方案。
大量数据的可用性和更快的处理系统改变了机器翻译的世界,从经典的方法和 Vauquois 时代到更快和更有效的结果。
感谢您阅读文章。希望你学到了新的东西!
## 参考
[1]马德森,马蒂亚斯·温瑟(2009)。机器翻译的极限,哥本哈根大学硕士论文。
[2]丹尼尔·茹拉夫斯基、詹姆斯·马丁(2009 年)。语音和语言处理。
# 量子机器学习的第一步
> 原文:<https://towardsdatascience.com/the-very-first-step-into-quantum-machine-learning-95efdf0d980c?source=collection_archive---------37----------------------->
## 在深入研究量子机器学习算法之前,你需要掌握基础知识
上周,我开始了下一周的努力。我请你解决一个小的量子机器学习挑战。这篇帖子总结了[挑战](https://pyqml.substack.com/p/put-your-hands-on-quantum-machine)及其[解决方案](https://pyqml.substack.com/p/what-are-the-chances-youll-solve)。
你可以在这里加入每周挑战[。](https://pyqml.substack.com/)

作者图片
机器学习的目标是训练机器预测未知变量的值。但是在我们预测一个变量的值之前,我们通常旨在找到它的概率分布。概率分布是一个描述变量可能具有的所有可能值和可能性的函数。
例如,假设我们知道变量只能有两个值中的一个。它可以是 0 或 1。每个值都以一定的概率出现。
*p* 表示概率为 0。因为只有两个可能的值,我们知道只要值不是 0,它就一定是 1。而且由于所有概率的总和必须是 *1 (=100%)* ,所以我们知道 1 的概率是 *1-p* 。
挑战在于创建一个量子系统,以给定的 *p* 再现伯努利分布。 *p* 可以是 0 到 1 之间(含)的任意实数值。
例如,如果 p=0.3,量子系统应该产生以下分布。

作者图片
挑战中棘手的部分是如何让量子位元代表特定的分布。
做这件事有不同的方法。首先,你可以在初始化期间指定量子位的状态振幅。但是,您需要记住,您指定的是振幅,而不是概率。如果你从概率开始,你需要计算它们的平方根来得到振幅。通常,对于一个量子比特𝜓=𝛼|0⟩+𝛽|1⟩,我们必须保证
|𝛼| +|𝛽| =1。
下面的代码片段描述了该解决方案。
第二种方法使用基态|0⟩和你的量子位状态向量|𝜓⟩.之间的角度𝜃它控制着最终的振幅,因此也控制着概率。下面的代码片段计算了给定概率下的𝜃,给定你想要应用的量子位处于|0⟩.状态你可以使用𝑅𝑌门来相应地旋转量子位状态向量。这是各自的代码。
# 结论
量子机器学习似乎是最具挑战性的学习主题之一。如果你一开始就使用一个复杂的算法,并假设有很多先验知识,那么事情会变得更加复杂。
但是,如果你从简单开始,事情会变得更容易理解。
量子机器学习要不要入门?看看 [**动手量子机器学习用 Python**](https://www.pyqml.com/page?ref=medium_entangled&dest=/) **。**

在这里免费获得前三章。
# 关于人工智能驱动的增长,领导者需要知道什么
> 原文:<https://towardsdatascience.com/the-virtuous-cycle-of-ai-driven-growth-c3fbf35f70c?source=collection_archive---------34----------------------->
## 公司希望掌握良性循环;不断发展他们的人工智能/人工智能环境,以保持影响力和增长
# 让人工智能具有影响力和可扩展性很难
几乎在每个行业,公司都在人工智能上投入巨资。我们都对“为什么”有一个直观的理解:在短短几年内,构建具有真实商业价值的预测模型变得容易得多,可以节省时间和金钱,减少人工劳动,并全面改善结果。最终,我们希望人工智能能够实现业务优化和增长。
我们仍然难以理解的是如何将人工智能投资转化为有影响力和可扩展的商业运营。随着这些人工智能项目的扩展,它们必须不断发展以跟上它们所驱动的增长,目标是实现更多的增长。这是我们喜欢称之为“人工智能驱动增长的良性循环”的反馈回路的基础。我们遇到的每一位人工智能领导者都试图加深他们对这一周期的理解,其相互关联的部分包括基础设施、团队、具有模型和数据的人工智能工作流、商业应用程序,当然还有客户/用户。
我们发现,这个框架可以帮助经理、高管和其他决策者思考公司必须协同工作才能维持人工智能驱动的增长的各个部分,因此值得花时间探索它,并根据您的需求应用它。

来源:作者图片
# 理解人工智能/人工智能驱动增长的良性循环
首先,让我们确定成功部署的人工智能是增长的引擎。你从一个商业问题开始,收集初始数据,形成假设,训练预测模型,为它们服务,然后*瞧——*你就有了一个人工智能驱动的产品。一个有价值的产品自然会带来更多的客户,或者为现有客户增加价值,业务也会增长。
考虑一个电子商务网站,利用人工智能向访问该网站的消费者推荐产品。相关的推荐转化为购买,网站创造的额外收入可以投入到营销中,为网站带来更多的消费者。优质的人工智能可以迅速带来业务增长。
> “成功地在增长引擎中部署了人工智能。”
现在,快速增长带来了新的机遇和风险。你有很多新客户,他们带来了新数据。新数据提供了了解更多信息、提高预测准确性和覆盖范围的机会,但也带来了新的边缘案例和例外情况的风险,或许还有暴露于新法规的风险。
例如,部署人工智能驱动的推荐以增加购买转化率的电子商务网站,在快速增长模式下,可能会进入新的国家市场。新的市场呈现出更多样化的数据集、新的语言、不同的消费者偏好和行为,或许还有不同的柠檬法则。AI 驱动的推荐系统能跟上吗?
与此同时,世界在继续前进,这也带来了新的机遇和风险。直观地说,在我们的电子商务例子中,随着一些消费品牌和产品的受欢迎程度迅速上升或下降,去年有效的推荐模式今天可能不再有效。消费者偏好不断变化,本地或全球事件(如疫情)也有重大影响。
需要持续的发展来降低风险和抓住机遇。如果你适应了,你将继续创造价值,反过来,更多的增长。作为一名人工智能所有者,你可能需要投资于额外的团队专业知识(例如,“有人能学习计算机视觉吗?我们开始收集图像数据!”)、新的基础设施(例如,“如果我们每分钟必须做出 100 倍以上的预测,我们能否保持较低的处理时间?”)和新模型以及对现有模型的改进(例如,“我们曾经根据法国消费者数据训练过我们的模型吗?”).
那么,如何找出必要的改进呢?AI 的提高来自于勤奋的观察和学习**。**如果您仔细并持续跟踪您的人工智能环境的业务绩效,您可以确定您的专业知识、基础架构和模型的优势和劣势。理想情况下,你有一个持续的学习流反馈到你的持续改进计划中。因此,整合可观察性和治理将点与点连接起来,并完成您的 AI/ML 成长周期。
在我们的工作中,我们已经与数百个人工智能团队进行了交谈,并与其中几十个团队建立了合作伙伴关系。很明显,将前瞻性思维团队与其他团队区分开来的是对他们的整个技术堆栈以及产品的整个生命周期有更深入的了解。这些团队通常希望实施同类最佳的 APM(告诉他们何时需要进行基础架构调整)、BI(识别新的业务机会)以及集成的数据和模型监控(验证数据完整性、检测概念漂移、模型偏差和其他弱点、A/B 测试模型版本以简化更新等)。
> “F 超前思维团队对他们的整个技术堆栈以及产品的整个生命周期都有可见性”。
# 要点和后续步骤
对于许多公司来说,人工智能已经从支持业务转向推动业务,但没有留出太多时间来围绕这种人工智能驱动的增长巩固实践和架构。市场和生态系统的成熟还需要一段时间,集体专业知识的跟上可能需要更长的时间。与此同时,我们认为良性循环框架是另一个有用的工具,可以放在你的工具带上,这样你就可以更好地理解领先人工智能的更大图景。
> “……人工智能已经从支持业务发展到推动业务发展……”
如果你是那些试图不断调整你的人工智能环境来为你的公司解锁(而不是阻碍)增长的团队中的一员,你并不孤单。如果你是那些基于在现实世界中有条不紊地观察你的人工智能而主动进化的团队之一(而不是基于本能或对投诉的反应),那么你正在掌握人工智能驱动的增长的良性循环。[给我们写封短信](https://www.monalabs.io/request-demo),我们希望听到您的旅程,并与您分享更多我们的最佳实践。
*感谢*[*Itai Bar Sinai*](https://medium.com/u/dae6c2441260?source=post_page-----c3fbf35f70c--------------------------------)*和*[*Jonathan Bennun*](https://medium.com/u/6c0032fbea39?source=post_page-----c3fbf35f70c--------------------------------)*在这篇文章上的合作。*
*原载于 2021 年 2 月 23 日*[*https://www . monalabs . io*](https://www.monalabs.io/mona-blog/the-virtuous-cycle-of-ai-driven-growth)*。*
# Python 中的海象算子
> 原文:<https://towardsdatascience.com/the-walrus-operator-in-python-a315e4f84583?source=collection_archive---------1----------------------->
## 了解什么是 walrus 操作符以及如何在 Python 中使用它

杰伊·鲁泽斯基在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上的照片
Python 3.8 中引入的 walrus 操作符提供了一种同时完成两项任务的方法:给变量赋值,**和**返回该值,这有时可以提供一种编写更短、可读性更好的代码的方法,甚至可能计算效率更高。
让我们回顾一下什么是 walrus 操作符,以及它何时有用的一些例子。
## 简单赋值运算符
我们都熟悉如何给变量赋值。我们使用简单的赋值操作符:
num = 15
如果我们想使用 ***print*** 函数打印这个变量的值,我们可以如下传入变量*:*
*print(num)
15*
## *输入 walrus 运算符*
*python 3.8 中引入的 walrus 操作符( **:=** ),正式名称为**赋值表达式操作符**,提供了一种在表达式中给变量赋值的方法,包括尚不存在的变量。如上所述,使用简单的赋值操作符( **=** ),我们在独立语句的上下文中赋值 ***num = 15*** 。*
> *表达式的计算结果为一个值。一个语句做一些事情。*
*换句话说,walrus 操作符允许我们在同一个表达式中既给变量赋值,**又返回该值。这个名字是因为它与海象的眼睛和侧面的长牙相似。***
> *名称:=表达式*
****expr*** 求值后赋给变量 ***name*** 。该值也将被返回。*
*让我们看一些使用中的 walrus 操作符的例子。*
## *简单的例子*
*理解 walrus 操作符的最好方法是用一个简单的例子。就像上面一样,我们要给 ***num*** 赋值 15,然后打印 ***num*** 的值。我们可以使用 walrus 操作符在一行代码中完成这两项任务,如下所示:*
*print(num := 15)
15*
> *将值 15 赋给 ***号*号**。然后返回相同的值,该值将成为 **print** 函数的参数。因此,打印的是 15。*
*如果我们尝试使用简单的赋值操作符,我们将得到一个 ***类型错误*** ,因为 ***num = 15*** 不返回任何内容。*
*print(num = 15)
TypeError*
*</three-concepts-to-become-a-better-python-programmer-b5808b7abedc> *
## *另一个例子*
*比方说,我们想不断要求用户输入一些信息。如果用户没有输入任何东西,那么我们希望停止要求更多的输入。我们可以使用 while 循环来实现这一点,如下所示:*
**
> *我们要求用户输入一些东西,并将该输入赋值给**值**。然后,我们创建一个 while 循环,如果输入的值不是空字符串,则运行该循环。我们打印出“很好!”如果用户成功地输入了一些东西。然后,我们要求用户输入另一个值,并将其设置为等于**值**,然后重新开始该过程。*
*现在让我们使用 walrus 操作符来尝试一下:*
**
> *我们要求用户输入,并使用 walrus 操作符将该输入设置为等于**值**。这个值也被返回,并与一个空字符串进行比较。如果比较结果为 **True** (不等于空字符串),那么 while 循环中的代码运行,然后“好极了!”已打印。如果评估结果为**假**,则代码不会运行。*
## *列表理解示例*
*walrus 运算符可以提高代码可读性和计算效率的一个例子是在旨在过滤值的列表理解中。*
*</list-comprehensions-in-python-28d54c9286ca> *
*例如,假设我们有一个数字列表 ***num_list*** ,并且我们希望仅在立方值小于 20 的情况下将这些数字的立方相加。我们可以这样做:*
**
> *注意我们如何调用函数 ***cube* 两次**。*
*walrus 操作符将允许我们在列表理解中只调用函数 ***cube*** 一次,如下所示:*
**
> *将 ***立方(x)*** 的值赋给 ***y*** ,然后返回并与 20 进行比较。 ***y*** 的值只有小于 20 才会添加到列表中。注意 **cube()** 函数只被调用了一次,这导致了更高效的代码。函数越复杂,计算要求越高,效率的提高就越显著。*
*如果你喜欢阅读这样的故事,并想支持我成为一名作家,考虑注册成为一名媒体会员。每月 5 美元,你可以无限制地阅读媒体上的故事。如果你用我的 [*链接*](https://lmatalka90.medium.com/membership) *注册,我会赚一小笔佣金。**
*<https://lmatalka90.medium.com/membership> *
**我希望这篇关于如何在 Python 中使用 walrus 操作符的教程能有所帮助。感谢您的阅读!**
# 网页和游戏开发者之间的战争
> 原文:<https://towardsdatascience.com/the-war-between-web-and-game-developers-437ba23494dc?source=collection_archive---------37----------------------->
## 你说,开发人员就是开发人员?再想想。关于编程范式、最佳实践以及工作和生活的基本方法,网页和游戏开发之间正在进行一场激烈的战斗。

冲突比你想象的要深刻。作者图片
 如果 你认为 web 开发是一个非常有利可图的领域,你没有错。2020 年,在美国从事从简单的博客网站到复杂的社交媒体平台等项目的开发者赚了 400 亿美元。视频游戏行业同样现金充裕,目前仅在美国就拥有 600 亿美元的市场价值。
尽管它们的规模相似,但这两个行业却有着天壤之别。你可以从一个相当熟练的高中生那里预订有能力的网络开发服务。然而,游戏开发者的技能要高级得多。游戏开发人员必须构建一组极其动态且响应迅速的三维场景,这些场景通常需要遵守物理定律,而不是在二维空间中创建一堆静态网站(也有动态网站,但比较少见)。来自 StackOverflow [的 Sara Chipps 表达了类似于神经外科医生和遛狗者之间的对比。](https://stackoverflow.blog/2020/10/13/podcast-277-so-you-want-to-be-a-game-developer/?utm_source=Iterable&utm_medium=email&utm_campaign=the_overflow_newsletter)
考虑到这种对比,你可能会认为拥有强大能力的游戏开发者主宰着世界,而地位低下的网络开发者却无话可说。尽管游戏开发人员往往比网页开发人员拥有更丰富的技能,但他们远未能掌控世界——甚至无法为他们的工作时间获得足够的报酬。另一方面,网络开发者并没有那么糟糕。
这两个地区对工作和生活的看法有天壤之别。大多数网站开发人员都有相当稳定的工作,有固定的工作时间,并获得相应的报酬。另一方面,许多游戏开发者不仅工作时间过长,还面临着持续的工作不稳定和相对于他们技能的微薄收入。此外,当谈到编程范例时,web 开发人员可以与游戏开发人员进行交流。哪个范式是最重要的在每个领域都有所不同,但目前网页和游戏的趋势正在分化。这两个行业之间的最佳编程实践也有所不同,但这很自然,因为它们处理的问题非常不同。最终,网页和游戏开发者几乎处于两个不同的世界。
</software-developers-might-be-obsolete-by-2030-cb5ddbfec291>
# 游戏开发者和工作/生活平衡
如果你是神经外科医生,你为什么要回去遛狗?嗯,即使是神经外科医生有时也会精疲力尽。事实证明,游戏开发人员经常精疲力竭。如果他们没有筋疲力尽,那么工作不安全感就会从背后捅他们一刀。
大多数游戏开发工作室依赖外部发行商。这些出版商经营许多不同的产品,视频游戏只是他们清单上的一项。因此,他们在处理合同时经常变化无常,在没有任何通知的情况下取消长达数月的工作室项目。
这种不确定性的结果是双重的。一方面,许多游戏开发者感到头上悬着一把达摩克利斯之剑,每天上班都有可能是最后一次。更糟糕的是,他们不会因为任何不当行为而被解雇,而是因为他们的出版商改变了主意。因此,游戏开发者在日常生活中面临着巨大的不确定性。
另一方面,尽管存在这种不确定性,但游戏开发商及其经理希望说服发行商不要取消合同。为此,他们需要展示他们是优秀的合作者。因此,无论如何,可交付物必须每次都交付。如果这意味着开发团队的成员晚上 11 点还在拼命工作,那就这样吧。如果每个人都需要在周六工作来完成工作,那就这样吧。如果开发人员没有时间过工作之外的生活,因为他们几乎没有时间吃饭睡觉,那就这样吧。
虽然不是每个游戏工作室都是一样的,但压力、超负荷加班和工作不稳定往往是常态。因此,一些游戏开发者为了更好地照顾他们的家人和 T2 自己,离开游戏世界也就不足为奇了。

游戏和网页开发者使用非常不同的编程语言。作者图片
# 当游戏玩家回到网络上
如果游戏开发需要这么多技能,你可能会问,为什么会导致这么多的倦怠和工作不安全感?原因比较简单。
成为一名游戏开发者是很多人的梦想。制作一个讲故事、娱乐和激励人们的东西是一个极其诱人的想法。
然而,我们也看到了这个领域的负面影响:极大的压力、无薪加班、工作不稳定。更糟糕的是,与网页开发相比,很难找到一份游戏开发的工作,因为相对于现有的工作数量来说,人才库很大。
与直觉相反的是,所有的压力都不会被高薪所补偿。大多数游戏开发人员的[薪水](https://www.bitdegree.org/tutorials/game-developer-salary/)入门级开发人员的起薪约为每年 6 万美元,高级开发人员的最高年薪约为 12.5 万美元。相比之下,网络开发人员的收入往往在 54,000 美元到 103,000 美元之间。考虑到网络工作的安全性,很多人会选择压力较小的道路是可以理解的。
因此,游戏行业并不是一个让许多需要养家糊口或面临职业倦怠风险的开发者茁壮成长的地方。那些有家庭需求或不能每天工作无数小时的人通常会退出这个行业,尽管他们拥有大量的技能,但他们会成为网络开发人员。在 web 开发中,软件更简单,工作更稳定,所以即使这种转变感觉像是进入了一个全新的世界,这也是一个有很多好处的决定。
</bye-bye-python-hello-julia-9230bff0df62>
# 编程范式正在转变
为什么我们需要考虑编程范式?毕竟,对于网页和游戏开发来说,有许多无代码或低代码的工具。然而,在某些时候,开发人员无法绕开代码。对于 web 开发人员来说,当他们需要管理连接到网页的数据库或构建网站的核心逻辑时,可能会发生这种情况。游戏开发者可能需要编写代码来阐明游戏的逻辑或构建 AI 组件。尤其是当这种做法在游戏玩家圈子里获得[牵引力](https://www.theverge.com/2019/3/6/18222203/video-game-ai-future-procedural-generation-deep-learning)的时候,编码将是游戏开发者无法避免的。
编程范式,也就是关于如何编写代码的理论,充斥于软件主宰游戏的每个领域。由于这些范例对速度、可读性和可维护性等方面的重视程度不同,所以主导范例因地区而异。
对于视频游戏,古老的[面向对象编程](https://www.freecodecamp.org/news/object-oriented-programming-concepts-21bb035f7260/)仍然是标准。基于电子游戏的运作方式,这是非常合理的。例如,某个游戏的玩家可能是“玩家”类的一个实例。任何僵尸、吸血鬼或鲨鱼都可能是“怪物”类的实例。这种类型的编程是[直观的](https://www.freecodecamp.org/news/object-oriented-programming-concepts-21bb035f7260/),并且,至少对于大多数游戏来说,足够灵活和可扩展以在以后添加升级和新功能。
面向对象编程仍然与 web 开发相关。然而,更广泛的领域正趋向于[功能编程](/why-developers-are-falling-in-love-with-functional-programming-13514df4048e)。这种范式对于许多普适应用程序特别有用,比如大型数据库、并行编程和机器学习。
特别是当 web 开发人员处理大量数据库查询或其他后端开发问题时,使用函数式编程的元素越来越流行。相比之下,游戏开发者只有在实现 AI 组件时才能真正利用它。当游戏的其余部分以面向对象的风格编写时,在许多情况下可能不值得这样做。
所有这些都导致了网页开发与游戏的日益分化。尽管在这两个领域中最流行的范式仍然是面向对象编程,但是 web 开发中函数式编程的趋势意味着这两个世界正在慢慢地分开。迟早,这两个领域之间会很少有共同点,这导致了它们之间的裂痕。

Web 代码和游戏代码可以有很大的不同。作者图片
# 从网络到游戏的艰难转型
一些程序员成为 web 开发人员,作为实现游戏开发最终目标的第一步。鉴于这一轨迹是从低技能工作到高技能工作,你可能会认为这是进入游戏的经典路径。然而现实远非如此!
虽然从网页到游戏的转变是可能的,但一些障碍会让职业道路变得艰难。例如,一个程序员可能想要构建一个游戏,在这个游戏中,玩家可以像在现实生活中一样,在没有表面接住他们时跳来跳去并摔倒。他们可能会从头开始编写所有这些代码。这个过程极其乏味和耗时,因此很可能程序员在交付任何东西之前就放弃了。
由于这些事情以前已经做过很多次,所以更好的做法是使用 Blender、Unity 或任何正在使用的游戏引擎中的内置功能。这节省了时间,增加了最终结果交付的可能性。问题是很多不熟悉游戏的开发者并不知道这些修复。这只是成为游戏开发者的众多障碍之一。
游戏的另一个不同点是项目是如何设置的。在包括 web 开发在内的“普通”开发中,大多数事情都是基于代码的。要执行一个项目,你必须调用一个 *main()* 函数或者类似的函数。然而,在游戏开发中并非如此。在那里,一切都是基于场景的,在场景中你定义应用程序如何启动,它有哪些依赖关系等等。
当网络开发者试图开始玩游戏时,他们往往不熟悉[场景管理器](https://rivermanmedia.com/object-oriented-game-programming-the-scene-system/)和[场景图](http://archive.gamedev.net/archive/reference/programming/features/scenegraph/index.html)。场景管理器可以被翻译成 web 开发人员的软件设计模式,但是指定不同对象之间关系的场景图却没有真正的对等物。所以,纯代码和场景之间的切换,不仅仅是改变周围的一些词汇。这两个概念如此不同,需要完全不同的思维方式。
总之,一个转行做游戏的网络开发者不仅仅需要克服一些障碍。他们还需要获得一种全新的软件思维方式。这需要大量的努力和热情,而不仅仅是几个周末的学习和练习。
</why-developers-are-falling-in-love-with-functional-programming-13514df4048e>
# 谁的最佳实践?
拥有一套最佳实践总是有用的。当你处理复杂的过程或与他人合作时,它们变得更加重要。显然,这些确切的最佳实践因行业和行业内的单个公司而异。
在 web 开发中,最佳实践通常[包含](https://meiert.com/en/blog/principles-of-web-development/#toc)原则,比如保持简单、不重复、负责任地编码。当然,这些指导方针在某种程度上适用于所有程序员。然而,它们在 web 开发中尤其重要,因为没有人想要过于复杂的网站,没有多个组件结构相同但在不同地方定义的网站,或者文档记录和测试都很差的网站。
所有这些想法对游戏来说也很重要,但是游戏原则让它们更进了一步。游戏最佳实践[包括](https://github.com/anttiviljami/romero-programming-principles)简化、立即修复错误和透明编码。毕竟,没有人想要过于复杂的代码来降低游戏速度,或者一个错误的游戏或者一个混乱的代码库,其中没有人知道在哪里发生了什么。
因此,网页开发的原则同样适用于游戏开发。但是游戏让他们更进了一步,并完善了他们,因为事情的复杂性需要这样做。因此,游戏开发者倾向于精通最佳实践,以至于将 web 开发者抛在后面。这构成了游戏和网络之间的另一个分野。

进入游戏行业很难。作者图片
# 游戏:发展的诺克斯堡
就规模而言,网页和游戏行业非常相似。就复杂性和所需技能而言,游戏行业胜出。不过,这也有不好的一面,因为游戏太复杂了,游戏程序员经常需要花很多时间来调试游戏。
尽管承受着工作不稳定、无薪加班和低工资的负担,许多开发人员还是决定追寻他们童年的梦想。由于竞争激烈,这意味着冒许多损失的风险。从这个意义上来说,游戏开发者看起来像是理想主义者,为了达到目标他们会不择手段。
另一方面,网络开发人员更加务实。他们通过选择一份不太费力、竞争也不那么激烈的工作,找到了一条更容易、更安全的获得体面薪水的途径。
虽然有人管理它,但游戏似乎是软件开发的堡垒。要想进入,你需要广泛的技能和对客户需求的理解。如果你真的想要,这是可以做到的——但你可以放心,在这个过程中会有一些困难。
*本文原载于* [*建于*](https://builtin.com/media-gaming/war-web-game-development) *。*
# 一代棒球天才的浪费
> 原文:<https://towardsdatascience.com/the-waste-of-a-generational-baseball-talent-835d474d85?source=collection_archive---------42----------------------->
## 使用 Python 可视化来探索围绕空前伟大的天才

洛杉矶天使队的迈克·特劳特。图片来源于维基媒体。
棒球有着丰富的传统,培养出超越时代甚至超越比赛本身的超级明星人才,从而在文化知识中确立自己的地位。贝比·鲁斯、威利·梅斯、巴里·邦兹和泰德·威廉姆斯这些家喻户晓的名字,因为他们在职业生涯中的个人记录以及团队的整体成功而被人们铭记。洛杉矶天使队的中外场手迈克·特劳特是一名目前缺乏团队成功的名人堂球员(12 个 ABs 中只有 1 个季后赛安打,一个本垒打)。自 2012 年爆发以来,迈克·特劳特已经成为 MLB 的代言人。2014 年我在库尔斯球场亲眼看到鳟鱼抢了一个本垒打,打了一个定胜负,差一点就错过了第二次全垒打抢劫。他是一个令人难以置信的球员。棒球统计学家会同意我的假设。棒球统计学家得出了一个衡量球员对球队价值的方法。这一措施被称为战争,代表胜于替代。Fansgraph 的[计算是为了提供一个球员价值的单一指标,以防他们受伤,需要用一个普通的自由球员或新秀来代替。Fansgraph 使用*的独立投手(FIP)* 来评估投手的潜在年龄,消除每个球队防守强度的影响。对于投手和击球手有许多不同类型的战争措施,然而本文中使用的计算方法将在下面详细介绍。](https://library.fangraphs.com/misc/war/)
**位置玩家之战**
*战=(击球跑分+跑垒跑分+守备跑分+位置调整+联盟调整+替补跑分)/(每胜跑分)*
**投手战(投出的外野局)**
*FIP =((13 *小时)+(3*(BB+HBP))-(2*K))/IP +常数*
Fansgraph 将玩家的战争定义为玩家对团队的价值。下表显示了预期的战争等级和一个玩家对一个团队的价值。战争甚至可以是负面的。

根据 Fansgraph 的战争等级表
我们收集了从 1900 年到 2019 年的 Fansgraph 战争数据。数据和脚本可以在**[**GitHub**](https://github.com/glickmac/Wasted_MLB_Talent)上找到。由于疫情和目前正在进行的 2021 赛季,我们忽略了 2020 年的战争统计。我们在数据中保留了 1981 年和 1994 年的停摆季节。**
## ****精英中的精英****
****
**贝比·鲁斯。图片来自维基媒体。**
**贝比·鲁斯被许多人认为是有史以来最好的棒球运动员,他的战争平均水平以及他的一些单赛季战争价值观也是如此。贝比鲁斯有史以来最高的单赛季战争与 15(!!!)1923 年。那一年他的球队第二好的战争是 4.5。斑比诺的平均战争时间是令人难以置信的 8.21 秒。下图是 1900 年以来各季的顶级战例。该图是使用 [seaborn](https://seaborn.pydata.org/) 生成的。**
****
**历年最高战争值。图片作者。**
**除了 20 世纪 20 年代早期(Babe Ruth),一个赛季的最高战争值徘徊在 8 和 11 之间。每个球队的最高战争值和该球队的平均战争值如下图所示。通常每支球队都会有一个超级巨星,平均战力会徘徊在 1 以下。下图是用以下代码生成的。**
Sort by top WAR values
df_war = df_war.sort_values(by="Total WAR", ascending=False)## Get the top WAR values by each team each year
df_war_top_team = df_war.drop_duplicates(subset=["Team", "Year"], keep="first")## Plot Top WAR by Year (Blue Line)
sns.lineplot(x="Year", y="Total WAR", label="Top Players WAR", data=df_war_top_team).set(title='Average War of Top Player and Average Team WAR by Year')## Plot Average WAR by Year (Green Line)
sns.lineplot(x="Year", y="Total WAR", label="Average Team WAR",data=df_war, color="green")
****
**各队顶尖球员的平均战力和全队平均水平。图片作者。**
## ****一代人才的定义****
****
**2K games 为 Wii 开发的 MLB 超级明星。图片来自维基媒体。**
**在我们的模型中,一般天赋的定义是在他们的职业生涯中超过 MVP 的平均水平。为了过滤世代天赋,我们使用下面的代码保留平均总战超过 6 的玩家。**
top_talent = df_war.groupby("Name").mean()
top_talent = top_talent[top_talent["Total WAR"]>6]
top_talent = top_talent[['Total WAR']].sort_values("Total WAR", ascending=False)
**我们的结果显示,有 14 名球员在他们的职业生涯中平均表现出 MVP 水平。**
1. **贝比鲁斯| 8.21 战争**
2. **迈克·特劳特| 8.13 战争**
3. **巴里·邦兹| 7.48 战争**
4. **霍纳斯·瓦格纳| 7.07 战争**
5. **威利·梅斯| 7.05 战争**
6. **泰德·威廉姆斯| 6.87 战争**
7. **卢·格里克| 6.85 战争**
8. **乔·迪马吉奥| 6.38 战争**
9. **赛扬| 6.35 战争**
10. **米奇·曼托| 6.23 战争**
11. **泰·科布| 6.23 战争**
12. **Mookie Betts | 6.20 战争**
13. **华特·强森| 6.02 战争**
14. **克里斯蒂·马修森| 6.01 战争**
**Mookie Betts 和 Mike Trout 是这一代人才名单上唯一活跃的球员。名单上的所有其他球员(*除了巴里·邦兹)都被载入了 MLB 名人堂。**
## ****浪费一代人才****
****
**照片由 [Lisa Wall](https://unsplash.com/@lisawall72?utm_source=medium&utm_medium=referral) 在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄**
**一代人的天赋可以支撑一个球队在季后赛或世界大赛中的表现。棒球是一项团队运动,尽管有单个球员的贡献,但整个赛季和季后赛的持续成功主要是整个团队贡献的产物。迈克·特劳特是一代天才,他的平均战数超过 6 场。他甚至可能被认为是有史以来最伟大的棒球运动员之一,然而,相对于其他一代人才,他的团队缺乏支持,如下所示。**
sns.scatterplot(x="Total WAR", y="Teammate WAR Average", data=top_talent)
sns.despine(fig=None, ax=None, top=True, right=True, left=False, bottom=False, offset=None, trim=False)plt.title('The Greats and Their Average Teams')
Set x-axis label
plt.xlabel('The Greats WAR')
Set y-axis label
plt.ylabel('Teammates Average WAR')def label_point(x, y, val, ax):
a = pd.concat({'x': x, 'y': y, 'val': val}, axis=1)
for i, point in a.iterrows():
ax.text(point['x']+.03, point['y'], str(point['val']))label_point(top['Total WAR'], top['Teammate WAR Average'], top['Name'], plt.gca())
****
**这个图表在 X 轴上显示了一代人才的平均战争,在 Y 轴上显示了他们职业生涯中队友的平均战争。**
**迈克·特劳特是当代天才中唯一一个平均队友战争低于 0.6 的人。从长远来看,迈克·特劳特是 MLB 历史上唯一一个 WAR delta(他职业生涯平均 WAR 和队友平均 WAR 之差)超过 7 (7.54)的球员。下一个最接近的队友德尔塔差异是贝比鲁斯在 6.91。迈克·特劳特拥有第三低的队友平均战数,职业生涯平均战数超过 4。排在他后面的两个人是诺兰·阿雷纳多和安德鲁·麦卡琴,前者在过去的一个赛季里一直在糟糕透顶的落基山脉工作,后者多年来一直在一个徒劳无功的海盗队工作。阿雷纳多和麦卡琴的平均全战值都在 5 以下(分别为 4.49 和 4.72)。**
## ****缺少第二个超级巨星(甚至全明星)****
****
**洛杉矶天使队的大谷修平。图片来自维基媒体。**
**在双重威胁现象出现之前,大谷和天使们一起到达了。天使管理层试图通过抢购另一名伟大的球员阿尔伯特·普约斯来建立自由代理,以 10 年 2.4 亿美元的合同从 2012 年到 2021 年。这次签约对应的是 2012 年迈克特劳特的出现。艾伯特·普约尔在天使队的任期没有他在 2001 年至 2011 年在红衣主教队的时间那么壮观。普霍斯缺乏持续的全明星级别的制作,这使得特劳特没有第二名球员来称赞他的历史性赛季。事实上,迈克·特劳特(Mike Trout)与厄尼·班克斯(Ernie Banks)和罗杰斯·霍恩斯比(Rogers Hornsby)并列为赛季战超过 6 场(MVP 级别)的球员,而球队中没有其他球员突破 4 场(全明星级别)。这三个人都不得不忍受四个赛季 MVP 的高质量表现,并且很少得到其他队员的帮助。**
## ****地平线上的希望****
****
**在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上 [Pablo Heimplatz](https://unsplash.com/@pabloheimplatz?utm_source=medium&utm_medium=referral) 拍摄的照片**
**迈克·特劳特遭受了历史性规模的队友生产不足。大谷等人的到来和崭露头角,或许会让特劳特在季后赛上再一次出手。迈克·特劳特签署了一份为期 12 年、价值 4.26 亿美元的合同,从 2020 年开始。他的合同将持续到 38 岁。这里希望他能继续他历史性的战斗步伐,并在季后赛中与更有能力的队友一起发光发亮。**
**我叫科迪·格利克曼,可以在 LinkedIn 上找到我。代码和数据可以在 [GitHub](https://github.com/glickmac/Wasted_MLB_Talent) 上找到。看看下面我写的一些与运动相关的文章。我想将这一分析扩展到 NBA 和 NHL 的球员,看看所有体育运动中最大的被浪费的人才,尽管我怀疑迈克·特劳特可能拥有这个头衔。**
**<https://medium.com/swlh/exploring-college-football-salaries-dc472448684d> </a-fantasy-draft-order-lottery-using-r-shiny-6668a5b275d2> </college-football-travel-during-covid-1ced0164840e> **
# AWS 上的深度学习之路
> 原文:<https://towardsdatascience.com/the-way-to-deep-learning-on-aws-851fad7e5725?source=collection_archive---------4----------------------->
## **在云中使用 GPUs】**

照片由[莫里茨·金德勒](https://unsplash.com/@moritz_photography?utm_source=medium&utm_medium=referral)在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄
深度学习仍然是机器学习从业者的热门话题。与早期相比,那时你花更多的时间配置你的堆栈和你的深度学习库,而不是实际训练你的模型,我们已经取得了很大的进步。观点可能会有所不同,但 Keras 和 Tensorflow 的结合已经成为一种准标准,对于刚刚开始进入该主题的每个人来说,这绝对是最佳选择。设计深度神经网络至少仍然是一门科学,也是一门艺术。使用 Keras 和 Tensorflow 的另一个优势是,几乎每种类型的神经网络都有大量免费的深度学习 Python 笔记本。
您可以在本地系统上安装所有的库。您将需要一个 Python 安装,目前最好是 Python 3.x。然后您将需要 Jupyter 笔记本或 JupyterLab。以及机器学习的标准库,如 scikit.learn 或 Pandas。而你显然需要 Keras 和 Tensorflow。安装这一切都是很容易做到的 pip 或 conda,它会在您的 CPU 没有问题。
所以一切都很好,你只需要开始?深度学习的问题是,按照今天的标准,即使是中等规模的网络也需要通过反向传播来适应数百万个权重。这需要大量的计算能力,通常在单精度浮点或 FP32 中。不幸的是,即使是游戏电脑中常见的高端 CPU 也只能提供几百 GFLOPs(每秒浮点运算)。另一方面,AWS EC2 实例中最慢的 GPU 可以提供大约 4,8 TFLOPs。因此,我们谈论的是在 GPU 上训练你的网络会更快的 20 倍。将笔记本电脑的 CPU 与当前的 GPU 相比,它将更像是两个数量级。
为什么这很重要?当你尝试训练和优化你的网络时,你需要合理的周转时间。如果你晚上在 GPU 上训练 8 个小时,你将在 CPU 上训练一周。所以除了玩具示例,你肯定需要使用 GPU 来在相当长的时间内得到结果。
# 为什么要上云?
一种解决方案是在本地系统上使用 GPU。这有几个缺点。一个是,由于全球芯片危机,到 2021 年年中,几乎不可能以合理的价格购买当前的 GPU。除非你真的想投入大量资金,否则唯一有效的替代方案是购买旧的 GPU,如特斯拉 K10。特别是没有 HDMI 连接器的旧服务器 GPU,有时可以以合理的价格买到二手。
甚至不要考虑 AMD GPU,除非你想深入了解如何安装不同版本的 Linux,调试和修补有缺陷的 AMD 库以及重新编译 Tensorflow。我尝试了这一点,最后一步是 AMD 正式从他们的库中放弃了对我的 GPU 的支持。他们只是完全错过了深度学习的列车。AWS 不提供 AMD GPUs 上的深度学习。
如果你有一个合适的 NVIDIA 图形处理器,你需要 Linux。理论上它应该可以在 WIndows 上运行,但是除非你投入大量时间,否则通常不会。安装所有需要的库并不简单,需要反复试验才能让 GPU 支持正常工作。你也不应该忘记你的 GPU 满负荷运行时 200 瓦的功耗。以德国每千瓦时约 0.3€的电价为例,我们谈论的大约是每小时培训用电 0.07 美元。在支付 AWS 实例价格时,这显然不是必需的。
另一个问题是你的卡上的内存,这可能是关键,取决于网络结构和大小。通常,面向游戏的 GPU 卡比服务器卡具有更少的板载内存。也不时有媒体文章猜测 NVIDIA 可能会取消对游戏 GPU 通用计算的支持。所以上云的说法也不少。
# 我能从 AWS 得到什么?
作为最大的云计算供应商,AWS 很早就意识到向客户提供 GPU 计算能力可能是一笔好生意。所有更高级服务背后的服务总是亚马逊弹性计算云,更好地称为 AWS EC2。在 EC2 上可以找到大量不同的实例类型。
当寻找用于深度学习的 GPU 时,当前相关的实例类型是 g3、g4、p2、p3 和 p4。命名方案是第一个字母描述一般实例类型,数字是实例类型的代。对于 GPU 来说,这意味着更新的芯片设计。额外的字母给出了额外的功能,例如本地实例内存,即与 EBS(弹性块存储)相对的 SSD 内存。然后,在一个点之后,您就可以根据 vCPUs 的数量、GPU 的数量和主内存的数量来确定实例的大小。
作为参考,我从 AWS 网站收集了截至 2021 年 7 月的信息。由于我们对 FP32 TFLOPs 感兴趣,我查找了用于该实例的 NVIDIA 芯片,并参考了 NVIDIA 发布的 FP32 TFLOPs 信息。总 TFLOPs 乐观地假设在多个 GPU 配置中线性扩展。这给了我们 18 种可能的实例类型,用于在 GPU 上进行深度学习!

我没有给出实例价格,因为它们会随着你所在的地区而变化。目前,最便宜的实例(g4dn.xlarge)每小时的成本约为 0.60 美元,而最大的实例(p4d.24xlarge)每小时的成本约为 35 美元。此外,如果您计算每个 TFLOP 的价格,会发现定价存在巨大差异,因为其他因素也被考虑在内。但即使是 FP32 中最便宜的 8,1 TFLOPs 的 GPU 实例,也能给你比任何 CPU 都大得多的计算能力。因此,AWS 可以为深度学习助手提供很多东西。
# 如何使用所有的 TFLOPs?
大多数人都会同意亚马逊是一家非常以客户为导向的公司。这也适用于销售深度学习的 GPU。利用 power on 的一种方法是用标准的 Linux AMI(或 Amazon 机器映像)启动 EC2 实例。然后,您可以 ssh 到新租用的计算资源,开始安装您需要的所有库,就像在本地系统上一样。但幸运的是,亚马逊的聪明人想为他们的客户节省所有的时间和麻烦。请注意,互联网上的一些教程仍然描述这种做事情的方式,到目前为止,这是完全不必要的,而且容易出错。
更好的方法是只使用亚马逊提供的深度学习 ami 之一。亚马逊提供基于 Ubuntu 和亚马逊 Linux 的深度学习 AMIs。你可以使用你喜欢的任何东西,但是注意,用来登录的用户是不同的;ec2-亚马逊 Linux 的用户和 ubuntu 的 Ubuntu。我更喜欢亚马逊 Linux,所以相应地适应。
使用深度学习 AMIs 的优势在于,亚马逊已经为 AWS 基础设施安装并优化了相关的库。ami 预装了 MXNet、PyTorch、Keras、Tensorflow 和 Tensorflow 2。对于 GPU 的使用,所有这些库都使用 NVIDIA CUDA,这也是包含和预配置的,截至目前,最常用的组合是基于 Tensorflow 的 Keras(而不是基于 CUDA 的 Tensorflow 2)。没有必要自己安装这个堆栈,除非你真的想详细了解它的内部工作原理,或者想使用绝对最新的版本。
基于深度学习 AMI,这里解释了如何连接到 EC2 实例并执行下面的示例笔记本。创建 AWS 帐户后,您可以转到 AWS web 控制台并搜索 ec2。一旦你在那里,你会发现右上角的“启动实例”按钮。

启动 EC2 实例的第一步是选择 AMI 或 Amazon 机器映像。这有点像本地磁盘上的引导分区,或者更准确地说,是它的第一个版本。如果您稍后修改该实例,它将不会反映在 AMI 中,而只会反映在该实例的附加存储上。您可以创建自己的 ami 或 ami 版本,但这超出了本文的范围。
有各种各样的深度学习人工智能可用。我会选择基于亚马逊 Linux 2 的,因为它似乎是最新的,我更喜欢亚马逊 Linux。您还可以看到预安装的库及其版本。真正好的是,它们针对大多数 EC2 实例类型进行了预配置,包括 GPU 和优化的 CPU 使用。

下一步是选择实例类型。您将只能选择与 AMI 兼容的实例类型。您可以按实例族(如 g4dn)进行过滤,以查找支持 GPU 的实例类型。您还会看到一些关于实例类型的相关信息。您不会看到 GPU 的数量和类型,因此您必须记住这一点,或者使用本文中上面的便利表格。

启动实例时,可能会出现一些警告。一个问题是,GPU 实例不是免费层的一部分,所以即使在使用 AWS 的前 12 个月,你也必须付费。第二件事是安全组默认对世界开放。它仍然受到 SSH 和密钥对的保护,但是对于 Python 笔记本场景,最好只限制对您的 IP 的访问。第三件事是,大多数 AWS 帐户都有配额,其中不包括 GPU 实例,以防止欺诈和计费冲击。你可以通过开一张票来改变这个报价,它通常会通过。然而这需要几个小时。请注意,配额在 vCPUs 上!例如,在 g4dn 实例类型中,您需要至少 4 (v)个 CPU 的配额才能启动最小的实例类型。由于 AWS 以客户为导向,您将在 AWS web 控制台的警告或错误消息中找到解决所有这些问题的便捷链接。
你需要的最后一件事是一个密钥对,以便能够从互联网访问你的机器。请注意,您必须将它存储在本地,因为您将无法再次从 AWS 中检索它!

在您按下“启动实例”之后,如果使用 AWS,您将会遇到一个不利的情况:您必须等待几分钟实例才能启动。考虑到他们必须分配虚拟资源、配置网络和路由器、连接存储和启动 Linux,几分钟似乎是合理的。然而,这比从 SSD 启动本地系统花费的时间要长得多。
恭喜你,几分钟后,你将有一个虚拟系统在云端运行,等待你使用。现在,你能用它做什么?其实不多。基本上,您现在唯一能做的就是使用您已经安全存储的密钥对对它进行 ssh。
为此,您需要新启动的实例的公共 IP 地址。您可以通过单击实例详细信息来查找它。如果你选择了 Amazon Linux,你可以在 Ubuntu 上以 ec2-user 的身份登录。从 Linux 或 MacOS 在系统上使用 ssh 非常简单:
ssh -i my-key-pair.pem ec2-user@ip.region.compute.amazonaws.com
在 Windows AWS 上,建议使用您必须预先安装的 PuTTY。在 PuTTY 中,您需要相同的信息。您在 SSH → Auth → private key file 中输入用户和公共 IP als 主机名以及密钥文件。注意,密钥文件有两种不同的格式,您可以使用 PuTTYgen 来回转换文件。PuTTYgen 与 PuTTY 一起安装,对于 Linux 和 MacOS,您将需要一个 pem 文件,而对于 PuTTY,您将需要一个 ppk 文件。

完成所有这些步骤后,您将最终在云中看到您新租用的系统的控制台。AWS 将向您展示,您已经安装了相当多的 Python 和深度学习框架的不同组合的环境。要开始使用 Keras,我推荐 TensorFlow(+Keras2)和 Python3 (CUDA +和英特尔 MKL-DNN)。正如您所看到的,这些配置包含了相当多的库,希望能在所有 AWS 实例类型上为您提供最佳性能。要开始,请键入:
source activate tensorflow_p37
一旦你运行了这个 Python 环境,你就可以通过输入 jupyter notebook 来创建一个笔记本。但是,您将无法从浏览器访问它,因为您的 AWS 实例将只接受 ssh 连接,而不接受任何其他端口上的连接。对于 Jupyter 笔记本电脑,您可以调整安全组,使其也接受从您的 IP 到端口 8888 的连接。推荐且更安全的方法是建立 ssh 隧道。
在 MacOS 或 Linux 上设置隧道是通过以下命令行完成的:
ssh -i my-key-pair.pem -L 8888:localhost:8888
ec2-user@ip.region.compute.amazonaws.com
使用 PuTTY 是另一个菜单中的另一个选项:

将要发生的是,ssh 或 PuTTY 将在您的本地主机上建立隧道,并启动与您的 AWS 实例的控制台会话。您必须保持 ssh 或 PuTTY 运行,以使隧道工作。一旦在实例上启动了 Jupyter 笔记本,就可以使用 localhost:8888 在浏览器上访问它。不要忘记在启动笔记本之前设置环境,因为在不同的 Python 环境中可能会有不同版本的 Jupyter。最终我们得到了我们需要的开始。在笔记本中,您将再次有各种 Python 内核和库可供选择。你应该用 conda_tensorflow_p37 内核。
# 有更简单的方法吗?
与在本地系统上运行整个堆栈相比,在 EC2 实例上使用深度学习 AMIs 已经相当容易了。你可以考虑的一个选择是使用 docker 容器,它也是 AWS 为深度学习提供的。唯一合适的情况是,您已经在 AWS 上运行了一个容器基础设施。在这样的设置中,部署训练好的模型变得更容易,但是对于开始深度学习的人来说,这是未来相当多的步骤,你直接使用 AMI 学到的一切仍然适用。
一个值得考虑的替代产品是 AWS Sagemaker。定义 Sagemaker 是相当棘手的,因为它基本上只是 AWS 的一个相当大的机器学习产品集的营销名称。除了已经在 Sagemaker 旗下提供了大量服务之外,AWS 还在不断扩展这一服务。深度学习只是其中的一小部分。
这里要考虑的服务是 Sagemaker 笔记本。或者有 Sagemaker 工作室,但这是截至 2021 年 7 月的最近产品。目前我看不出使用 Sagemaker Studio 有什么好处,但这可能会随着时间的推移而改变。
从深度学习开始使用 Sagemaker 笔记本变得更加容易,并且您还可以在单独的实例上进行培训。这意味着您的笔记本电脑实际上不需要 GPU 实例,而只是为了训练您的网络。以下是对这种情况的逐步解释。
与使用普通 EC2 不同,您可以在 AWS 控制台上搜索 Sagemaker:

在这里,我们要创建一个笔记本,所以只需查找笔记本→笔记本实例,然后选择创建。现在,您可以选择所需的实例类型。用于 Sagemaker 的所有实例类型都有一个“ml”在他们的名字前面加上前缀。您还需要一个 IAM 角色,但是您可以让 Sagemaker 为您创建一个默认角色并使用它。

按下“创建笔记本实例”并再次等待几分钟。一旦 AWS 为您设置好一切,您就可以看到您的笔记本实例。使用 Jupyter notebook 或 JupyterLab 就像点击提供给您的链接一样简单。

这很容易。缺点是什么?正如您在分步示例中看到的,您将使用 ml。EC2 实例类型的变体。由于生活中没有免费的东西,AWS 目前将对使用 Sagemaker 的每一小时收取 30%的费用!公平地说,Sagemaker 还有额外的好处。然而,如果你刚刚开始探索深度学习,这些额外的服务并不真正相关。
如果易用性值得,额外费用由您决定。不利的一面是,Sagemaker 使用的图像似乎比深度学习 AMIs 的最新版本要老一些。随着机器学习和深度学习的流行包的新版本以相当高的频率发布,这对你来说可能是个问题。
# 摘要
虽然长期以来,先进的深度学习实验一直是拥有必要硬件的 IT 专家的专属,但现在每个人都可以在云中进行,Sagemaker 等 AWS 服务使几乎每个人都有可能拥有 Python 的基本技能和机器学习的一般知识。您将能够使用高端硬件进行培训,使您能够从最近的研究成果中获得深度网络方面的经验。这将花费你,但是为你的本地系统购买一个 700 美元以上的现代 GPU 将会为你购买相当多的云培训时间。
有了 AWS 服务,如果你愿意支付账单,你基本上没有任何限制。其他云供应商也有替代方案,有些甚至是免费的,免费的解决方案通常有一些限制,这取决于您想要处理的网络和数据可能是至关重要的。总之,当前的 AWS 产品非常有吸引力,为以合理的成本进行深度学习实验提供了一个良好的起点。
# 作为一名数据科学家,如何在工作中不断学习
> 原文:<https://towardsdatascience.com/the-what-where-and-how-about-continuously-learning-on-the-job-as-a-data-scientist-b0a31ea4ac48?source=collection_archive---------23----------------------->
## [办公时间](https://towardsdatascience.com/tagged/office-hours)
## 持续学习是成长为数据科学家的先决条件。但是,当我们忙于日常工作时,如何保持学习呢?

照片由[陈茂三潭](https://unsplash.com/@tranmautritam?utm_source=medium&utm_medium=referral)在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄
数据科学是一个快速发展的领域,需要任何在其中工作的人跟上时代。一些将我们的生产力提高十倍的工具在两年前并不存在。持续学习是为我们工作中的问题提供最有效解决方案的先决条件。但是,当我们忙于日常工作时,如何保持学习呢?
# 学什么?
有大量的学习资源,大部分是免费的。这是福*和*是祸。通过分析很容易陷入瘫痪,试图决定我们接下来应该学习什么,而不是实际学习。在学习新东西之前,我会问自己以下四个问题:
1. 这种新工具或方法能帮助我完成工作吗?从如何在 AWS 上部署机器学习模型,到如何使用 DVC 对数据进行版本化,或者如何处理时间序列数据。这里需要什么知识来交付尽可能多的价值?
2. 我真的对这个话题感兴趣吗?即使这个话题不直接适用于我今天的工作,但它可能是未来有用的知识。反正学习应该是有趣的。例如,我在 2019 年研究了变压器和类似 BERT 的架构,知道我有一天可以使用它们,并最终在工作一年后应用它们。
3. **它是否有助于我成为一名全栈数据科学家?**我喜欢从头到尾拥有数据科学项目,或者至少知道项目的每个阶段都涉及到什么。例如,我喜欢学习数据工程以及如何构建最小可行的数据管道,或者学习产品管理以及如何构建解决业务问题的数据产品。这也有助于我与这些团队更好地沟通。
4. **是否有其他人将其应用到自己的工作项目中,并从中获得价值?**我最喜欢的是数据团队从项目中获得价值,并且他们的数据成熟度比我高一个阶段。
一个好的经验法则是学习你感兴趣的东西,你可能在工作中应用的东西(现在或不久的将来),一些人已经在工作中应用并从中获得价值的东西。
如果网上随便一个人跟你说要学习 X 工具/方法/算法,不妨用上面这些问题交叉核对一下。如果他们的回答是肯定的,现在是时候集中精力学习了。
别忘了学习不是线性的。你可以连续几周专注于一个话题,然后忘掉它,转向下一个话题,最终回到这个话题。你不必在 2 周内学会优化算法的所有知识。
# 去哪里学?
既然你已经缩小到一个主题,是时候找到你的学习资源了。就个人而言,谷歌搜索从未给我任何有形的资源。相反,我通常会在以下平台上进行研究(按偏好排序)。这份清单绝非详尽无遗。
* **询问你信任的朋友/同事**。这是最快的入门方式。
* **简讯**。消耗策划资源的每周电子邮件。尽管它是经过策划的,但仍然有噪音需要消除。我通常每周阅读大约 1/4 的资源,也许 3-4 份时事通讯中有 1 份是令人大开眼界的。我最喜欢的有:[数据科学周刊](https://www.datascienceweekly.org);[数据药剂](https://dataelixir.com); [blef](https://www.blef.fr) 。我订阅了几本其他的,但是我读得不多。
* **公司技术博客**。许多团队公开撰写他们的项目,通常是为了吸引人才和提升他们的品牌。那些博客是金矿。你可以阅读生产中使用的项目,从头到尾的方法,他们面临的挑战,他们如何克服这些挑战,他们的下一步。Eugene Yan 在他的 repo [Applied ML](https://github.com/eugeneyan/applied-ml) 中收集了大量的资源。我最喜欢的公司来自我认为自己正在工作的公司,或者来自在数据科学成熟度方面比我领先一个阶段的公司。
* **实用教程或长篇博文**。在对我想学的概念有了一个介绍之后,我喜欢跟随一个教程,它给我提供了练习的方法,以及下一步可以深入的方向。我是《T2》的粉丝,该书提供了关于整个 DS 项目生命周期的非常实用的建议。另一个实用教程的例子是[注释转换器](https://nlp.seas.harvard.edu/2018/04/03/attention.html),它指导你通过著名的论文[注意是你所需要的全部](https://arxiv.org/abs/1706.03762),其中有详细的代码、注释和解释。
* **关注那些开发你一直在使用的工具的公司**。他们通常会发布来自客户的用例,这反过来会给你如何更好地使用它的灵感。跟随他们的更新,他们的文档,他们的路线图,你会瞥见他们认为什么是尖端的。比如我跟着[爆炸](https://explosion.ai) (spaCy,prodigy)[DVC](https://dvc.org), [neptune.ai](https://neptune.ai) ,[蒙特卡洛数据](https://www.montecarlodata.com)。如果他们有开源产品,探索他们的代码库并从中获得灵感也是一个好主意。
* **教材或课程录音**。如果我想钻研一个我熟悉的特定主题,我喜欢用教科书或大学课程的录音来学习。它给了我足够的细节来完全掌握该方法的利弊。我也喜欢本章末尾的问题和练习,它们通常会让你从不同的角度思考这个概念。我发现自己经常回到[演讲和语言处理](https://web.stanford.edu/~jurafsky/slp3/)、[统计学习的要素](https://web.stanford.edu/~hastie/ElemStatLearn/),或者[帕斯卡·普帕的 Youtube 频道](https://www.youtube.com/channel/UC7ZVvEo7-B7lA6LY2MVX72A/videos)。
* **会议论文**。我不是一名研究科学家,所以我不觉得有必要跟上最先进的技术。尽管我喜欢来自专业研讨会的论文,或者介绍 SOTA 方法独特地应用于特定领域的论文。例如,当我在一家教育科技初创公司工作时,我一直在关注 [BEA workshop](https://sig-edu.org/bea/current) (关于创新使用 NLP 构建教育应用的研讨会),现在,由于我在 [Manifest Climate](https://www.manifestclimate.com) 的工作,我正在关注[气候变化 AI](https://www.climatechange.ai) 的工作。
* **社交媒体**。人们在社交媒体上分享的东西有很多噪音。然而,我在一些 LinkedIn 帖子中发现了很多价值。尤其是,我喜欢人们分享实用可行的建议或个人经历。我忽略那些只是分享一个工具链接/另一篇博客文章/一个回购/没有附加价值的一般建议的文章。例如,我追随 [Vin Vashishta](https://www.linkedin.com/in/vineetvashishta/) 、 [Eric Weber](https://www.linkedin.com/in/eric-weber-060397b7/) 和 [Daliana Liu](https://www.linkedin.com/in/dalianaliu/) 等人。
* **播客、Youtube 视频和在线课程**。我不喜欢音频格式,因为我喜欢阅读。但是有很多有价值的内容。Coursera 是一个很好的起点。
* **协作空间**比如 [Kaggle](https://www.kaggle.com) 、 [DAGsHub](https://dagshub.com) 、 [Colab](https://colab.research.google.com/notebooks/intro.ipynb?utm_source=scs-index) 人们在那里分享笔记本和代码片段。我还没有探索这条途径,但它似乎很有前途。
人们或多或少会接受很多平台。在以后的文章中,我会给你我的秘密提示,在你需要的时候,从噪音中剔除,选择你需要的资源。
# 如何边工作边坚持学习?
在这个阶段,你知道自己想学什么,从哪里学。最后一个问题是你将如何把这个学习过程整合到你的工作流程中。
首先,问问你自己,你的雇主是否期望你不断学习,不断成长,不断磨练自己的技能。如果没有,试着影响工作文化,使其朝着不断自我完善的方向发展。然后如果不成功,你可能要开始面试,这样你就可以作为一名数据科学家不断成长。目前的市场是一个候选市场,雇主应该投资你的自我发展,用时间或/和金钱。利用这一点,不要害怕将你的学习作为一项工作任务。
以下是让你在工作中开始持续学习的一些建议:
1. **在你的日历中创建一个循环事件,并将其视为不可协商的事件**(例如,没有令人分心的事情,没有冲突的会议,没有最后一刻的约会)。在频率上现实一点。从每周一次 20 分钟的课程开始,一旦你能舒适地计划工作中的学习时间,就增加频率和时间。我通常每周进行 3-4 次治疗。
2. **至少花几周时间专注于一个概念或主题。**你会学得更快,知识记忆更强。我们的目标是让你对这个新概念足够熟悉,这样你就可以自信地在工作中应用它。
3. **挑选一些资源,开始学习。**不要陷入分析麻痹。一旦你开始学习,你会更好地知道下一步是什么,在你的阶段什么资源对你有意义。
4. **做笔记。然后,试着凭记忆回忆你的笔记。它会加速你的学习。**
5. 把它教给你的同事。这将影响一个健康的工作环境,让每个人都能分享他们的知识。在我的下一篇文章中,我将详细阐述作为数据科学团队的学习。敬请期待!
6. 一旦以上已经成为一种习惯,你就可以开始在学习中更有目的性了。例如,**建立一个季度学习路线图**,并将其分成 2-3 周的时间段,每个阶段都有学习资源。
我希望这篇文章能激励你将学习融入到日常工作流程中。作为一名数据科学家,通过构建你的学习流程,一次专注于一个概念,并使之成为一种愉快的习惯,不断成长。
先睹为快我的[项目](https://www.curatedml.com)。
*在*[*LinkedIn*](https://ca.linkedin.com/in/quoc-tien-au-11514410b)*上与我连线,我总是乐于聊数据科学/机器学习/ NLP。*
# 理解和执行机器学习模型超参数调整的初学者指南
> 原文:<https://towardsdatascience.com/the-what-why-and-how-of-hyperparameter-tuning-for-machine-learning-models-1a2634e9ca9e?source=collection_archive---------8----------------------->
## [动手教程](https://towardsdatascience.com/tagged/hands-on-tutorials)、[入门](https://towardsdatascience.com/tagged/getting-started)
## 超参数调整的内容、原因和方式

[图片来源](https://www.pexels.com/photo/gold-saxophone-45243/)
超参数调整是开发机器学习模型的重要部分。
在本文中,我通过比较具有不同超参数值的**逻辑回归**模型的预测能力来说明超参数调整的重要性。
最重要的是。
# 什么是超参数?—什么
## **参数与超参数**
* 参数是从数据集估计的。它们是模型方程的一部分。下面的等式是一个逻辑回归模型。θ是包含模型参数的向量。

θ是参数
* 手动设置超参数以帮助估计模型参数。它们不是最终模型方程的一部分。
## 逻辑回归中超参数的例子
1. **学习率(α)。**训练逻辑回归模型的一种方式是梯度下降。学习率(α)是梯度下降算法的重要组成部分。它决定了每次迭代中参数θ的变化量。

特征 j 的参数(θ)的梯度下降
需要复习梯度下降吗?阅读这篇绝对介绍线性回归和梯度下降的文章。
</linear-regression-and-gradient-descent-for-absolute-beginners-eef9574eadb0>
**2。正则化参数(λ)。**正则化参数(λ)是添加到成本函数的“惩罚”项中的常数。将这种惩罚加到成本函数中称为正则化。有两种类型的正规化——L1 和 L2。他们在惩罚等式上有所不同。

在线性回归中,成本函数就是误差平方和。加入一个 L2 正则项,它就变成了:

线性回归的成本 fxns
在逻辑回归中,成本函数是二元交叉熵或对数损失函数。加入一个 L2 正则项,它就变成了:

正规化是做什么的?
在训练模型时,模型应该为每个特征找到一个权重。每个权重是向量θ中的一个值。因为现在对某个要素的权重进行了惩罚,所以它会激励模型将某些要素的权重向 0 靠拢。因此,正则化使模型的复杂性最小化,以避免过度拟合。
# 您如何着手优化超参数?—方法
现在我们知道了要调优什么,让我们来谈谈调优它们的过程。
有几种优化超参数的策略。其中两种是网格搜索和随机搜索。
## 网格搜索
在网格搜索中,我们为每个超参数预设了一个值列表。然后,我们评估该列表中每个值组合的模型。
伪代码应该是这样的:
penalty = ['none, 'l1', 'l2']
lambda = [0.001, 0.1, 1, 5, 10]
alpha = [0.001, 0.01, 0.1]hyperparameters = [penalty, lambda, alpha]# grid_values is a list of all possible combinations of penalty, lambda, and alpha
grid_values = list(itertools.product(*hyperparameters))scores = []for combination in grid_values:
create a logistic regression classifier
classifier = MyLogisticRegression(penalty=combination[0], ...) # train the model with training data
classifier.fit(X_train, y_train) # score the model with test data
score = classifier.score(X_test, y_test)
scores.append([ combination, score])# Use scores to determine which combination had the best score
print(scores)
(实际上,我们会评估几种类型的“分数”,如准确性、F1 分数等。我将在后面的章节中讨论这些。)
## 随机搜索
在随机搜索中,我们不提供预设的超参数列表。相反,我们给搜索者一个每个超参数的分布。搜索算法尝试随机组合值以找到最佳值。对于大型超参数集,随机搜索要高效得多。
让我们做一些机器学习!
我用的数据集是来自 [Kaggle](https://www.kaggle.com/c/titanic/data) 的泰坦尼克号数据集。在之前的[文章](/would-jack-realistically-have-died-aboard-the-titanic-a6ac8308ed49)中,我用这个数据集预测如果我们敬爱的杰克是一名真正的乘客,他是否真的会死于海难。
我们将在这篇文章中继续这一趋势,根据乘客的特征来预测生存的可能性。
</would-jack-realistically-have-died-aboard-the-titanic-a6ac8308ed49>
在训练模型之前,我们需要进行一些数据处理。本质上,我不得不:
1. 删除可能无用的列,例如“Name”
2. 删除缺少“Embark”值的行(总共 2 行)
3. 用猜测值填写缺失的年龄值(总共 177)。在这种情况下,猜测是基于“Parch”——船上父母和孩子的数量。
4. 用一键编码转换分类变量。
你也可以在我的 [Jupyter 笔记本](https://github.com/lilychencodes/Titanic-survival-prediction/blob/master/titanic_hyperparameters_tuning.ipynb)上找到这些数据处理步骤的代码以及更详细的解释。
在所有的数据处理之后,这是我的最终数据框架。

作者图片
接下来,将数据分为训练集和测试集,用于模型训练和评估。
让我们看看正则化和学习率α如何影响模型性能。
# 为什么调整超参数很重要?—为什么
很快您就会看到,超参数的调整会影响模型的准确性和 F1 值。不确定这些指标意味着什么?在我之前的[泰坦尼克号文章](/would-jack-realistically-have-died-aboard-the-titanic-a6ac8308ed49)里看到了它们的定义。
## 正规化的影响
我使用 SciKit-Learn 的[逻辑回归](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html)分类器来拟合和测试我的数据。有许多求解器可供选择,每个求解器都有自己的收敛算法。为了便于说明,我选择了*【传奇】*解算器。它是唯一支持 L1、L2 和无正则化的求解器。
注意:对于 Scikit-Learn 的 LogisticRegression,分类器采用的不是λ正则化参数,而是正则化强度的倒数“C”。就当是 1/λ吧。
我使用 SciKit-Learn 的 [GridSearchCV](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html) 来获得模型对于`penalty = ["none", "l1", "l2"]`和`C = [0.05, 0.1, 0.5, 1, 5]`的每种组合的得分。
from sklearn.model_selection import GridSearchCVclf = LogisticRegression(solver='saga', max_iter=5000, random_state=0)param_grid = { 'penalty': ['none', 'l1', 'l2'], 'C': [0.05, 0.1, 0.5, 1, 5] }grid_search = GridSearchCV(clf, param_grid=param_grid)grid_search.fit(X, y)result = grid_search.cv_results_
GridSearchCV 进行内部 5 重交叉验证。每个组合的平均模型分数为:

作者图片
C 为 0.1 的 L2 正则化表现最好!
**边注#1:** 我还用 SciKit-Learn 的 [RandomizedSearchCV](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html) 实现了一个随机搜索算法。如果你好奇,你可以在我的 [Jupyter 笔记本](https://github.com/lilychencodes/Titanic-survival-prediction/blob/master/titanic_hyperparameters_tuning.ipynb)里找到例子。
**旁注#2:** 我敢肯定你注意到了,没有正则化比 L1 表现得更好,而且在很多情况下,没有正则化和 L2 没有区别。我有最好的解释是,SciKit Learn 的逻辑回归可能在没有正规化的情况下已经运行良好。然而,正规化确实带来了一些改善。
我们将在后面看到正则化在 SGDClassifier 中确实起了很大的作用。
然后,我对没有正则化和有 L2 正则化的几个性能指标进行了并排比较。
tuned = LogisticRegression(solver='saga', penalty='l2', C=0.1, max_iter=5000, random_state=2)not_tuned = LogisticRegression(solver='saga', penalty='none', max_iter=5000, random_state=2)tuned.fit(X_train, y_train)
not_tuned.fit(X_train, y_train)y_pred_tuned = tuned.predict(X_test)
y_pred_not_tuned = not_tuned.predict(X_test)data = {
'accuracy': [accuracy_score(y_test, y_pred_tuned), accuracy_score(y_test, y_pred_not_tuned)],
'precision': [precision_score(y_test, y_pred_tuned), precision_score(y_test, y_pred_not_tuned)],
'recall': [recall_score(y_test, y_pred_tuned), recall_score(y_test, y_pred_not_tuned)],
'f1 score': [f1_score(y_test, y_pred_tuned), f1_score(y_test, y_pred_not_tuned)]
}pd.DataFrame.from_dict(data, orient='index', columns=['tuned', 'not tuned'])

作者图片
除了召回率之外,在所有指标上,调优的都比未调优的好。同样,如果您需要重温这些指标的含义,请阅读这篇[博客文章](http://Titanic article)。
## 学习率的影响(和正规化)
为了了解不同的学习速率如何影响模型性能,我使用了 SciKit Learn 的 [SGDClassifier](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDClassifier.html) (随机梯度下降分类器)。它允许我调整学习率,而[逻辑回归](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html)分类器却不能。
我们可以调整 SGDClassifier 的三个参数:`alpha`、`learning_rate`和`eta0`。术语有点混乱,请多包涵。
`learning_rate`是学习率的类型(“最佳”与“恒定”)。
当`learning_rate`为“常数”时,`eta0`是算法的学习速率。正常情况下,我称`eta0`为 alpha。
`alpha`是乘以正则项的常数。它还用于计算`learning_rate`为“最优”时的学习率。`alpha`服务于通常所说的 lambda 的目的。
因此,有几种方法可以在 SGDClassifier 中设置学习率。如果您想要一个恒定的学习率,设置`learning_rate='constant'`和`eta0=the_learning_rate_you_want`。如果你想要一个动态的学习率(这取决于你所处的步骤),设置`learning_rate='optimal'`。在“最优”的情况下,不使用`eta0`,并且`alpha`在计算每一步的动态学习率时起到正则化强度和常数的双重作用。
下面是查找最佳超参数的网格搜索算法(针对恒定学习速率)。我使用“恒定”的学习速率,并将最大迭代次数设置为 50,000 次。
from sklearn.linear_model import SGDClassifier
import matplotlib.pyplot as pltsgd = SGDClassifier(loss="log", penalty="l2", max_iter=50000, random_state=100)param_grid = {
'eta0': [0.00001, 0.0001, 0.001, 0.01, 0.1, 1],
'learning_rate': ['constant'],
'alpha': [0.00001, 0.0001, 0.001, 0.01, 0.1, 1]
}grid_search = GridSearchCV(sgd, param_grid=param_grid)grid_search.fit(X, y)result = grid_search.cv_results_
搜索者给出了 0.1 的`alpha`(这里指正则化强度)和 0.0001 的`eta0`(学习率)作为最佳参数,得分为 0.7176。
对于正则化强度(`alpha`)的几个不同值,我绘制了准确度与学习速率(`eta0`)的关系图。您可以看到,学习率和正则化强度对模型的性能都有显著影响。

作者图片
对于 0.00001 的学习率来说,精度相当低。这可能是由于算法在梯度下降过程中收敛太慢;经过 50000 次迭代后,我们离最小值还远着呢。对于高学习率(0.1 & 1),准确度也较低。这可能是由于超调。下面是一个更大规模的所有阿尔法图。

作者图片
正则化强度(alpha)在准确性方面也发挥了作用。对于任何给定的学习率(eta0),基于 alpha 值有很大的准确度分布。
学习率和正则化只是机器学习模型中的两个超参数。每个机器学习算法都有自己的超参数集。有问题吗?评论?下面回复。
# 模型漂移的内容、原因和方式
> 原文:<https://towardsdatascience.com/the-what-why-and-how-of-model-drift-38c2af0e97ee?source=collection_archive---------21----------------------->
## [行业笔记](https://towardsdatascience.com/tagged/notes-from-industry),MLOps
## 识别模型漂移的类型、检测技术、预防措施和补救措施

来源:undraw.co
# 介绍
我们的世界千变万化,不断变化。随着时间的推移,正如热力学第二定律所描述的那样,事物趋向于无序。现实的这一基本性质在其范围内包含了机器学习模型的预测能力。换句话说,就像其他任何事情一样,机器学习模型会随着时间的推移而恶化。
在预测建模的上下文中,模型根据历史数据进行训练,并用于根据看不见的数据进行预测。这个过程产生一个模型,该模型映射输入特征和目标变量之间的关系。但是,在动态环境中,从长远来看,培训数据和生产数据之间的分布变化是不可避免的。随着时间的推移,这导致我们部署的模型的预测变得不太可靠,这种现象通常称为模型漂移。
> "变化是生活中唯一不变的东西。"赫拉克利特
如果不能及时发现并充分解决这个问题,可能会在这些模型运行的环境中产生严重的后果。在本文中,我们将深入研究文献中分类的常见漂移类型,确定漂移的一些原因、检测技术,以及最重要的补救措施。
# 模型漂移的类型
本文将涵盖两种主要类型的模型漂移,即数据漂移和概念漂移。值得一提的是,存在第三种类型的移动,**先验概率移动,**,这是由于目标变量分布的移动而发生的。但是,我们不会讨论这种类型的转换。
## 数据漂移
当我们的输入特征的统计属性发生变化时,数据漂移,也称为*协变量移位*,由分布 *P(X* 的变化表示。
> 这种现象意味着训练数据的输入特征分布与输入的实时生产数据之间存在差异。
发生数据漂移的一个常见原因是由于**采样选择偏差**。举例来说,许多学习场景中的默认假设是训练和部署数据是独立且同分布的(即,i.d ),即,它们来自相同的分布。样本选择偏差违反了这一假设,导致模型无法在部署时做出准确的预测。
例如,考虑一个在 2010 年观看的电影数据集上训练的电影推荐系统。如果我们在 2021 年部署这种模型,很可能该模型的性能将是次优的。在我们的例子中,这归因于在此期间电影偏好趋势的变化。最终,由于训练集和制作集的输入特征分布之间的差异,在其他条件相同的情况下,如果用于预测 2021 年的电影偏好,我们的模型可能会失败。该示例捕捉了由于消费者偏好随时间变化以及违反 i.i.d .假设而导致的数据漂移。
虽然在前面的示例中,训练数据和服务数据之间的输入要素的分布发生了变化,但输入和目标之间的关系假设不变。接下来,我们将阐明随着时间的推移,这种关系的变化意味着什么。
## 概念漂移
数据漂移表示服务数据和训练数据之间的输入变量的统计特性的差异,而概念漂移表示服务数据和训练数据的模型输入和目标变量之间的关系的差异,即分布 *P(Y|X)* 的变化。简而言之,投入和目标之间的关系随着时间的推移已经发生了变化。
> 结果,由机器学习模型学习的映射不再捕捉服务数据的输入和目标之间的关系。
例如,考虑一个天气预测模型,该模型被训练为使用一组不同的输入特征来预测温度和湿度。随着时间的推移,输入要素和目标变量之间的关系可能会由于各种因素而发生变化,例如,其中一个因素可能是气候变化,这是一个很难捕捉到一个变量中的因素,但仍然会影响输入要素和目标变量之间的关系。由于这个原因,我们最终会在模型学习到的关系和模型要预测的传入数据流中的实际关系之间产生差异。这种变化归功于**的动态环境**。最终,这导致了一个对温度和湿度预测能力低的无能模型。
# 如果模型恶化,这种情况会多快发生?
既然我们已经讨论了不同类型的漂移,现在让我们来看看漂移随时间出现的不同速率。

来源:[undraw.co](https://undraw.co/)
* **突发**:漂移可能由于不可预见的情况而突然发生,通常由外部事件触发。新冠肺炎病毒的爆发导致了电子商务消费者行为的突然改变,这可以被看作是突然漂移的一个例子。
* **渐进性:**这种类型的漂移需要更长的时间才能发生,而且通常是很自然的事情。季节性可能是逐渐漂移的一个例子。尽管复杂的时间序列模型确实考虑了季节性对模型性能的影响。如果不予考虑,受季节性影响的模型的预测能力会随着时间的推移而下降。
* **循环:**循环漂移周期性地发生,通常发生在一年中的特定时间。例如,在黑色星期五或圣诞节前后,消费者行为可能会有所不同,表现为对消费品需求的增加。由于这些事件的重复发生,可以训练某些模型来迎合这些时期周围增加的需求。
# 检测模型漂移
考虑到不同类型的模型漂移以及它们发生的不同速率,如何检测模型质量的恶化?
这可以通过监控生产中模型的性能指标来实现。很明显,对吧?通常,模型的性能是使用部署前的测试集来评估的。到目前为止,我们所发现的模型漂移突出了在生产过程中持续监控模型对输入数据流的性能的重要性。
在二进制分类环境中,随时间监控的相关指标是 **F 值**。如果分数随着时间的推移而下降,那么这可能是漂移的明显信号。在无法获得基本事实的情况下,我们无法在预测值和实际值之间进行比较,因此我们需要依赖不同的测量方法。
由于漂移问题的性质,**统计距离测量**可用于量化分布之间的变化。一种常用的测试是 **Kolmogorov-Smirnov (K-S)测试。**该测试基于参考分布的累积分布和最近分布(在我们的例子中是训练和部署分布)之间的最大差异。该测试的零假设表明两个分布之间没有差异,并且零假设的拒绝可以被推断为模型漂移的指标。
此外,另一种用于识别漂移的流行距离测量是**群体稳定性指数(PSI)。**用于衡量变量分布随时间的变化。这一指标非常适合于监控人口特征的变化。
存在各种不同的方法、度量和测试来检测漂移,例如 **Z 分数**、**基于模型的方法、**和**自适应窗口**。如果你想深入了解,我会在下面提到进一步阅读和研究的资料来源。
话虽如此,但需要强调的是,监控漂移不是一次性任务,而是一个迭代过程。它需要定期发生,因为服务数据通常是不断传入的数据流。因此,这是一个可以大大受益于自动化的过程,从而提高效率和快速检测漂移。
# 模型漂移补救措施
既然我们已经走了这么远。是时候解决一个至关重要的问题了,即纠正模型漂移的问题。可以采取两套方法,一套是预防措施,确保问题不会在一开始就发生;另一套是临时补救措施,在理想情况下,在问题失控之前解决问题。
预防模型漂移的方法需要使用**在线学习。**在线学习是一种模型训练方法,通过实时数据流不断更新模型。这种方法对于防止模型漂移非常有效。然而,实现实时学习是一项复杂的任务,需要专业知识。
在现有的一系列补救措施中,最直接的方法是**在其性能下降到预先确定的阈值以下时,定期重新训练**模型。当观察到漂移时,应该用最近的数据重新训练模型。另一种方法是**定期更新**一个模型。这是一种更有效的方法,其中不是完全丢弃不合适的模型并重新训练新的模型,而是将现有状态用作拟合过程的起点,该拟合过程使用最新数据的样本来更新模型拟合。然而,这种方法并不适用于所有的机器学习算法,因为它最适合于依赖权重或系数进行预测的算法,如回归算法和神经网络。
另一种方法利用**集成学习**技术,其中多个模型的集成用于进行组合预测。这种组合预测通常使用每个模型的单独预测的加权平均值来计算。这里的权重反映了每个模型在最近数据上的表现。
总之,其他方法如**实例选择**和**特征删除**也可用于解决模型漂移。我会在下面链接更多的资源给你。
# 结论
总之,我们已经绘制出了存在的两种主要漂移类型,并揭示了漂移可能发生的速率。我们还提到了不同的监控技术、预防措施和补救措施。您还可以在下一节找到更多资源。
我们在这篇文章的开头指出,我们的世界是不断变化的,这也将是我们的结束语。由于模型漂移问题本身是动态的和不断变化的,用于识别和补救漂移的工具和技术也随着时间的推移而变化,并且很可能演变。出于这个原因,有越来越多的研究旨在完善我们对不同环境下模型漂移和补救措施的理解。
## **延伸阅读**
* [使用 Jensen-Shannon 和 Kullback Leibler 测量两个样本之间的统计相似性](https://medium.com/datalab-log/measuring-the-statistical-similarity-between-two-samples-using-jensen-shannon-and-kullback-leibler-8d05af514b15)
* [瓦瑟斯坦公制](https://en.wikipedia.org/wiki/Wasserstein_metric)
<https://www.arangodb.com/2020/11/arangoml-part-4-detecting-covariate-shift-in-datasets/>
* [概念漂移下的学习:概述](https://arxiv.org/abs/1010.4784)
* [理解概念漂移](https://arxiv.org/abs/1704.00362)
* [通过模型重用处理概念漂移](https://link.springer.com/article/10.1007/s10994-019-05835-w)
## 参考
[1]阿克曼,s .,法奇,e .,拉兹,o .,扎尔马诺维奇,m .,&杜贝,P. (2020)。检测随时间影响机器学习模型性能的数据漂移和异常值。
[2]黄,j .,格雷特顿,a .,博格瓦尔特,k .,舍尔科夫,b .,&斯莫拉,A. (2006 年)。用未标记数据校正样本选择偏差。
[3] [利用火花上的 Kolmogorov Smirnov 统计量进行模型漂移检测](https://pkghosh.wordpress.com/2020/02/24/model-drift-detection-with-kolmogorov-smirnov-statistic-on-spark/)。
[4]阿列克谢·齐巴尔。(2004).概念漂移的问题:定义和相关工作。
# 语言学的白犀牛
> 原文:<https://towardsdatascience.com/the-white-rhinos-of-linguistics-c8072b390212?source=collection_archive---------43----------------------->
## [变更数据](https://towardsdatascience.com/tagged/data-for-change)
## 利用数据促进语言保存
*这个作品最好在台式机或者平板电脑上体验。*

图片作者。
在我就读的高中,所有高年级学生都必须就他们选择的一个社会科学主题撰写一篇期末研究论文才能毕业。我写了一篇关于双语教学好处的文章,这篇文章的灵感来自于我在接受正规教育的过程中无法流利地使用一种以上的语言,这让我对世界语言的多样性产生了持久的欣赏。
本周,一个随机的网络兔子洞把我带回了这个话题。我发现,在现存的大约 7000 种语言中,[超过 40%](http://www.endangeredlanguages.com/about/) 属于“濒危”类别。这意味着他们有从我们的集体知识中消失的危险。
这些语言被世界各地的土著社区所拥有,体现了他们的历史、传统、文学和知识。它们是这些社区了解传统草药、其口头讲故事实践、其他宝贵的文化和科学现象以及在更常见的语言中很少见到的独特语言结构(如主语、宾语和动词在短语中的位置)的载体。语言保护领域的专家将失去一个语系比作失去动物界的一个分支——想象一个所有鸟类或鲸鱼都灭绝的世界。当语言被归类为濒危语言时,交流方式并不是唯一受到威胁的东西——语言的丧失很少是自愿的,它可能源于权力失衡,剥夺了说话者的权利和身份。
要阅读更多关于保护语言多样性的内容,请查看来自濒危语言项目(ELP)的资源和关于语言生存的具体干预措施的论文[。](https://link.springer.com/content/pdf/10.1007/s10993-006-9034-3.pdf)
## 那么数据呢?
ELP 的[目录](http://www.endangeredlanguages.com/lang/region)包含了 3000 多种濒危语言,每一种语言都有不同程度的信息。这个数据集的大小在足够小以讲述每个单独点的故事和足够大以得出关于整体的试验性结论之间取得了幸运的平衡。
在我展示我的视觉化之前,这里有一个总结 ELP 濒危语言分类的表格。在今天仍然存在的语言中,被标为“极度濒危”的语言面临灭绝的最大风险。ELP 用来对语言进行分类的其他未列出的因素包括其使用人数和使用人数趋势。

作者图片(用 Datawrapper 制作)。来自濒危语言项目的信息。
我选择展示 ELP 大多数编目语言的蜂群图(关于我排除了哪些语言的更多信息在本文的附录中),每个点代表一种濒危语言。你可以和下面的最后一块互动。
**确定性水平**表示 ELP 拥有关于上面列出的每个因素的多少信息(例如,如果只知道使用一种语言的人数,其确定性水平将是 20%)。
> 要了解每种语言的更多信息,**将光标悬停在每个彩色圆点上。要更详细地了解每种濒危等级的语言,请使用图左上方的**下拉功能**。**
每个濒危等级中的点的聚类表明绝对的说话者数量高度影响语言的分类。然而,一些有很多人使用的语言被指定为极度濒危,而一些人较少的语言只是易受影响——这可能是因为一些社区人口较少,但保留了他们传统语言的丰富知识和传播。
## 可视化实验
在设计了这个直观的量化方法来可视化 ELP 的目录后,我问自己,我还能如何展示语言保护事业的紧迫性和希望。
虽然不是所有的语言(尤其是面临风险的语言)都有书写文字,但我认为许多语言都是依靠书写来传承知识和传统的。然后我制作了一系列幻灯片,提供了关于七种极度濒危语言的基本信息,用单词本身来表达我们离失去这些传统有多近。
资料来源:ELP 目录
在揭示每个描述的全文时,你可能会注意到一些最受威胁的语言的复兴项目已经就绪。尽管语言消失的速度比以往任何时候都快,但社区正在认识到语言遗产的重要性,并为后代投资研究和教育。你可以通过解决方案新闻网络的故事跟踪者在这里阅读大量关于这项工作的例子。
濒危语言的问题是一个跨学科的问题,也是一个交叉的问题。虽然我在这里只给出了该领域的概述,但我希望您现在有兴趣了解更多。
感谢您的阅读!
我非常感谢濒危语言项目在我起草这部作品的过程中给予我的帮助和支持。
**数据来源:**
*濒危语言目录*。2021.夏威夷大学马诺阿分校。[http://www.endangeredlanguages.com](http://www.endangeredlanguages.com)。
# 附录:注释、警告和过去的迭代
* 对于我的第一次可视化,我试图坚持统计学家爱德华·塔夫特的优化“数据-墨水”比率的原则。这指的是与呈现的数据不直接相关的设计元素应该被移除的想法(即轴线、网格线和注释)。关于他的其他原则的更多信息,请参见[这里](https://thedoublethink.com/tuftes-principles-for-visualizing-quantitative-information/)。
* 当数据库中给出了一系列绝对说话人数量时,我取它们的平均值来生成一个值。这就是为什么有些语言显示有十进制数的发言者。
* 我删除了被列为“休眠”、“觉醒”或“处于危险中”的语言。“休眠”语言通常没有使用者,而数据集中只有一种“觉醒”语言。“濒危”语言与上述濒危等级分开分类(它们的脆弱性介于非濒危语言和“脆弱”语言之间)。
## 以下是第一次观想的先前迭代:
这里的每一行都代表一种语言,从左到右按字母顺序排列。然而,对于观看者来说,有太多的混乱以至于不能有意义地参与到图形中。
* 从我的第一次迭代开始,由于观察到的数值范围很大,我对“说话者数量”轴使用了对数标度。
* 然后我将语言从最常用到最少使用排序,这导致了一个更整洁的情节。然而,这很难吸引眼球。
* 接下来,我对每种语言的循环表示进行了实验,这导致了这种类似蜈蚣的混乱。
* 左下角的两个点是数据清理错误。
* 在本文介绍的可视化的最后一次迭代中,我使用了一个气泡图,在 y 轴上是分类值,在 x 轴上是连续值,这样的图看起来更有条理。然而,这篇文章的数据-墨水比例不平衡——我使用了三种不同的视觉元素(点位置、点大小和点颜色)来表示同一个变量(扬声器的数量)!区分语言也很困难。
我怎样才能改善这两种观想?我对濒危语言的第二种更抽象的表述对你有意义吗?请回复这篇文章让我知道!

# 深度度量学习的原因和方法。
> 原文:<https://towardsdatascience.com/the-why-and-the-how-of-deep-metric-learning-e70e16e199c0?source=collection_archive---------1----------------------->
## 深入研究基于度量的深度学习。

作者图片
*这篇文章深入探讨了深度度量学习方法的基础,以及它如何帮助人脸验证和人脸识别等任务实现最先进的结果。在我过去的实习期间,我一直在从事这些任务,看到深度度量学习方法对于这种任务的力量影响了我写这篇文章。除了人脸识别、验证之外,深度度量学习已经被证明是非常有效的许多其他应用;异常检测、三维(3D)建模就是其中的几个例子。*
# 目录
1. **先决条件**
2. **基础知识之旅** *。人脸验证,人脸识别*。人工神经网络(训练阶段和推理阶段)
3. **用于人脸验证的图像分类?** *。一次性学习
4. **公制**
5. **公制学习** *。马氏距离度量
6. **深度度量学习
*。**对比损失——连体网*。三重态损失—三重态网络*。Softmax 损失
*。A-Softmax 损耗
*。大幅度余弦损失(LMCL)
*。弧面损失
7. **参考文献**
# 先决条件
读者需要很好的线性代数知识,并且熟悉机器学习的基本概念才能理解这篇文章。我希望你会喜欢学习深度公制学习。
**关键词:**度量学习,三重损失,softmax 损失,人脸识别,人脸验证,DCNN,Arcface,Sphereface,Cosface。

一种人脸验证系统。[来源](https://dribbble.com/shots/5612333-Verified-on-Dribbble)由 Dribble.com 的[森雅](https://dribbble.com/xenianema)提供。
# **基础知识之旅**
让我们首先了解一些基本术语,并建立一个坚实的基础来增强我们对深度度量学习的理解。
**人脸验证**是确定给定的一对图像是否属于同一个人的任务。简单地说,这是一项任务,给定一幅图像,我们试图回答这个问题。**是你吗?。**一个 **1:1** 的认证问题。
**人脸识别,**则是两个任务的结合:**人脸识别**和**人脸验证**。人脸识别是从图像数据库中识别一个人的任务。在给定一个图像数据库(比如说一个 k 人画廊)的情况下,我们尝试回答这个问题,**你是谁?。**所以,人脸识别是一个 **1:k** 认证问题。
了解一个简单的**人工神经网络**的基本训练和推理过程是相当有帮助的。{如果您熟悉该主题,请跳过这一部分}。
## 培训阶段
1. 我们**根据某种概率分布随机初始化**权重和偏差,
2. 将数据集输入**未经训练的**神经网络架构。
3. **正向传播**:隐藏层接受输入数据,应用**激活**功能,并将激活传递给下一个连续层。我们传播结果,直到我们得到预测的结果。
4. 生成预测后,我们通过将**预测的**结果与地面真实标签进行比较来计算**损失**。
5. **反向传播:**我们计算权重和偏差的损失 wrt 的**梯度**,并通过减去与梯度成比例的少量来调整它们。
6. 我们对整个训练集重复步骤 1 到 5——这是一个时期。重复更多的时期,直到最终我们的误差最小化或我们的预测分数最大化。

深度学习模型的一般训练和推理阶段。此处引用自[的图片。](https://developer.nvidia.com/blog/inference-next-step-gpu-accelerated-deep-learning/)
## 推理阶段
在这个阶段,不进行梯度计算或参数调整。它使用相同的权重和偏差集来评估网络以前没有见过的未知测试数据集。
**深度神经网络**是在计算机视觉任务方面实现最先进性能的首选模型。从数据中学习**不变量**和**区别特征**是实现任何计算机视觉任务的良好结果的非常基本的目标。深度学习方法已被证明对**特征学习相当有效,**原因就在于深度学习方法通过从低级特征构建高级特征来学习**分级**特征表示的能力。

深度神经网络学习分层特征表示。[来源:深度学习,神经科学杂志](https://www.jneurosci.org/content/38/34/7365)。
# 图像分类:
能否用图像分类来解决图像验证的任务?我们可能能够学习一个非常强大的深度卷积神经网络,该网络在分类组织中的所有员工图像方面表现出色,并且还考虑了姿势、表情和照明等因素。

图片作者:DCNNs 用于图像分类。
但是,这通常是在我们拥有大量数据时实现的。我说的大量是指每个班级/员工的 1000 个例子。在图像分类中,如果每类的**数据点数量很少,可能会导致**过拟合**,产生非常差的结果。此外,当类别数量较少时,图像分类通常工作良好。**
然而,人/图像验证任务通常不是这种情况。其实完全相反。在这里,我们通常有大量的类,而每个类的例子数量却很少。这就是一次性学习发挥作用的地方。
**One-shot Learning:** 分类问题,旨在从一个/几个训练样本/图像中学习物体类别。【维基百科】。简单地说,给定一个人的例子/图像,你需要认出他/她。要建立一个人脸识别系统,我们需要解决这个一次性学习问题。
但是深度神经网络通常需要大量的数据来训练以擅长特定的任务,这并不总是可用的。深度学习模型在只有一个训练例子{一次性学习问题}的情况下效果不会很好。如何解决这个问题?我们学习一个**相似度函数**,它帮助我们解决一次性学习问题。
让我们通过了解基础知识来开始理解深度度量学习。
# **指标:**
度量是两点 x 和 y 之间的非负函数{比如说 **g(x,y)** },它描述了这两点之间所谓的**‘距离’**的概念。指标必须满足几个属性:
1. **非负** = > d(x,y) ≥ 0 且 d(x,y) = 0,**当且仅当 x = y。**
2. **三角不等式** = > d(x,y) ≤ d(x,z) + d(z,y)。
3. **对称性** = > g(x,y) = g(y,x)。
示例:
**A .欧氏度量:**在一个**‘d’**维向量空间中,度量是:

b .离散度量:该度量由下式给出:

# **度量学习:**
一个基本的机器学习算法是做什么的?—给定数据和相应的输出标签,目标是提出一组**规则**或某种**复杂函数**,将这些输入映射到相应的输出标签。
捕获**距离**信息的最简单的机器学习算法之一是 **KNN** (k-最近邻)算法,其思想是为新的数据点找到 **k** 最近数据点的邻域,并将该数据点分配给大多数 **k** 数据点所属的类别。

k-NN 的简单解释
类似地,度量学习的目标是从数据中学习一个**相似性函数**。度量学习旨在以减小对应于属于同一个人的面部的特征向量之间的距离并增大对应于不同面部的特征向量之间的距离的方式来学习数据嵌入/特征向量。
**欧几里德距离**在高维度中意义不大。他们无法捕捉数据中的非线性,原因有很多:
1. 它们代表一种**各向同性**(每个方向都相同)距离度量。
2. 这些距离没有抓住阶级结构。
可以使用非各向同性距离,该距离使用数据的属性来捕捉类关系的结构。**马哈拉诺比斯距离度量**就是这样一种度量。度量空间上两个样本之间的距离由下式给出:

马氏距离度量
这里,M 是协方差矩阵的倒数,并作为平方欧几里德距离的权重项。Mahalanobis 距离方程表示两个随机向量 **x** 和 **y** 之间的相异度,遵循与协方差矩阵**σ相同的分布。**

m 是协方差矩阵的逆矩阵。
如果 M = **I** (单位矩阵)我们有马氏距离的特例——欧几里德距离,它证明了欧几里德距离的一个潜在假设,即特征是彼此独立的。

马氏距离度量的线性变换性质
等式(*)可以解释为欧几里得空间中的线性投影。因此,W 具有线性变换性质,因为变换空间中的欧氏距离等于原始空间中的马氏距离。

各向同性欧氏距离 V/S 非各向同性马氏距离度量
这种距离度量在变换的空间中提供了一种新的数据表示,其能够容易地区分不同类别的项目。这种线性变换显示了这种方法所具有的类间可分性能力。因此,度量学习的基本目标是学习这个变换矩阵 **W** 。
**度量学习**是一种直接基于距离度量的方法,旨在建立图像之间的相似性或不相似性。**深度度量学习**另一方面使用神经网络从图像中自动学习区别特征,然后计算度量。
**为什么需要深度度量学习?**
1. 同一个人以不同姿势、表情、光照等呈现时的面孔。或许能非常有效地骗过人脸验证/人脸识别系统。
2. 建立一个有效的、大规模的人脸验证系统的任务从根本上来说是一个设计适当的损失函数的任务,该损失函数最好地区分所研究的类别。近年来,使用深度学习的度量/远程学习已经显示出对于许多计算机视觉任务,例如人脸识别、人脸验证、图像分类、异常检测等,输出非常令人满意的结果。
3. 度量学习在捕捉数据的非线性方面能力有限。
深度度量学习通过学习特征空间的非线性变换来帮助捕捉非线性特征结构。
# 深度度量学习
我们可以通过两种方式利用深度度量学习来完成人脸验证和识别任务:
## 1.为问题设计适当的损失函数。
深度度量学习最广泛使用的损失函数是对比损失和三重损失。
## ****对比损失—连体网络:**
执行**显式度量学习**的一个非常基本的想法是暹罗网络模型。暹罗网络是一种对称的神经网络架构,由两个相同的子网组成,它们共享相同的参数集(因此计算相同的函数),并通过计算每个子网的最高级别特征编码之间的度量来学习,每个子网具有不同的输入。

作者图片:暹罗网中的子网共享相同的参数集
数学上, **d(x,y) = ||f(x)-f(y)||** ,这里,**【x】****【y】**代表训练样本/图像。**“d(。)“**表示两幅图像之间的度量距离,“**f”**表示输入图像的编码。目标是学习参数,以便:
* 如果 **x** 和 **y** 是同一个人— d(x,y)是**小**,
* 如果 **x** 和 **y** 是不同的人——d(x,y)是**大**。
暹罗网络主要与**对比损失函数(又名成对排序损失)结合使用。**损失函数主要用于学习嵌入(特征向量),在度量空间中,来自同一类的两个实例之间的度量距离较小,而不同类之间的度量距离较大。现在,让我们来理解数学。

对比损失
这里,m>0 是余量,z 是布尔值,如果 x,y 是正对,则为 1,否则为 0, **||。||** 是 L2 范数,其他符号同上。
让我们来理解这个等式。如果 x 和 y 实际上是正对, **z 为 1,**因此,第二项消失( **margin m** 没有影响)。如果网络计算出 x 和 y 之间的距离很大,则损耗会很高,因为第一项对损耗有很大的贡献。
现在,如果 x 和 y 实际上是负对, **z 是 0。**这样,第一项就消失了。如果网络计算出 x 和 y 之间的距离很小(~0),我们将会有, **L=m,**再次对损耗产生显著影响。
**边缘 m 的作用:**要注意的是,如果估计的距离 **||f(x)-f(y)|| < m** ,负对的表示将仅增加损失。这意味着一旦达到这个极限,它将不再关心负对 x 和 y 有多远。所以,它可以更专注于难以嵌入的点。
注意,连体网络主要用在每类数据点数量很少的情况下— **一次性学习**。
## *** *三重态损失—三重态网络:**
三元网络也是一种对称的神经网络结构,但是由三个相同的子网组成,它们共享相同的参数集。该学习作为一组三个图像来执行**1)****锚**图像(基线图像) **2)** 正**图像(属于与锚相同类别的特定人的真实图像) **3)** 负**图像(不属于锚类别的图像)。****

作者的图像:三重缺失背后的直觉
三元组损失的目标是确保特定人的锚点/基线图像与所有正面图像集更近**(数学上,意味着锚点和正面图像之间的欧几里德距离很小)并且远离负面示例集。**

三重损失
这里,a =锚图像,p =正图像,n =负图像,m=边距。嵌入由一个**‘d’**维向量 **f(.)**{编码}。设, **d(a,p)=||f(a)-f(p)||** 。
让我们通过询问损失何时为 0 来理解这个等式。max 里面的第二项(。)应该是<0, i.e. d(a, n) > d(a,p) + m,如果出现这种情况,三元组网络将是相当幸运的,因为不会有学习。这些三胞胎被称为易三胞胎。
什么时候亏损会高?When,d(a,n) << d(a, p), which has a significant contribution to the loss. This will be a hard to train on triplet. Such triplets are known as Hard triplets. Another Case: d(a, p) < d(a, n) < d(a, p) + m, Again, the loss will be positive.
Issues with triplet loss & contrastive loss — These require a time consuming and performance-sensitive pair/triplet mining procedure to train the model.
## **2。向简单易学的分类模型添加自定义层:**
人们可以简单地通过学习通常的图像分类问题来实现远程学习。我们需要做的只是在一个简单易学的分类模型上添加一个额外的层。
## 使用 DCNN 训练和测试人脸验证系统的通用管道。

【[来源](https://arxiv.org/pdf/1703.09507.pdf)】:arXiv:1703.09507 v3【cs。简历]2017 年 6 月 7 日
1. 使用地面真实训练数据集人脸图像和相应的标签,将 DCNN 训练为图像分类任务。
2. 使用 Softmax 损失函数来优化 DCNN 模型的参数。
3. 在推理时,使用训练的 DCNN 为测试人脸对提取特征嵌入。
4. 然后,我们计算这些特征嵌入之间的余弦相似性。如果分数大于设定的阈值,我们说测试对是人,否则是不同的。
这是一个非常简单的人脸验证管道,不需要任何度量学习。
## Softmax 损失或交叉熵损失:
让我们解开 Softmax 损失的一些数学问题,以便我们理解后面的部分。我们先明确一下符号:
**C** 为总类数,
**aⱼ** 表示 softmax 激活前最后一个全连接层的 **j** ᵗʰ神经元的输出,
**pⱼ** 表示 **j** ᵗʰ神经元的 softmax 激活, **xᵢ** 表示一个规模为 **M 的训练批次中的 **iᵗʰ** 图像
**表示图像 **i** ,
**fᵢ** 是 **xᵢ** 的编码,也是最后一个全连通层的输入,
**W** 是最后一个全连通层的权重,(bias = 0 (let)),
**Lᵢ** 是图像的交叉熵损失****
****
**softmax 损失的推导**
**注意, **fᵢ** 是学习的特征向量,也是最后一个完全连接层的输入, **aⱼ** 是最后一个完全连接层的输出。由于 **W** 是最后一个完全连接的层的权重, **Wⱼ** 可以被解释为类 **j** 的线性分类器。**
## **Softmax 损失的问题:**
**虽然 Softmax 损耗可能有助于容易地收敛到最优值,但与对比损耗和三重损耗不同,softmax 损耗并不试图使正对更近,而使负对更远。Softmax loss 只学习区分度不够的可分离特征。由于这个原因,已经提出了许多在 softmax 特征之上应用度量学习的方法。**
**现在,目标是修改现有的 softmax 损失函数,使我们能够在特征空间中实现更好的区分能力。**
## **A-Softmax 损失——球面损失**
*****直觉:*** 考虑一个使用 softmax 损失函数训练的二分类问题。设 **W** ₁和 **W₂** 分别为类 **1** 和 **2** 的线性分类器。如果特征向量 **fᵢ** 如下,则数据点 **xᵢ** 被预测为类别 1:**
****
**xᵢ属于 1 类的条件**
****
**修正软最大损失的决策边界**
**因此,如果 **cosθ₁ > cosθ₂.,来自类别 1 的学习特征 **f** 被正确分类这就是基于角度的距离度量发挥作用的地方。****
****
**修正 Softmax 损失的推导**
**为了开发有效的特征学习,w 的范数必须是不变的,因此 **||Wᵢ||=1** 。与原始的 softmax 损失相比,通过修改的 softmax 损失学习的特征是成角度分布的,但是不一定更有区别。**
**论文 [*SphereFace:用于人脸识别的深度超球面嵌入*](https://arxiv.org/abs/1704.08063) 的作者介绍了一种借助**角裕度**使决策边界更严格、更有辨别力的方法。**
**考虑同样的二进制分类场景。我们看到如果**cosθ₁>cosθ₂.**1**的学习特征 **f** 被正确分类**现在,如果我们改为要求 cos( **m** θ₁) > cos(θ₂)呢?其中 m≥1 为整数。很明显,这将使决策边界更具鉴别性,因为余弦值随着角度的增加而减小,并且 **cosθ₁** 的下限大于 **cosθ₂.**现在,从角度上正确地给 f {class 1}分类,需要 **mθ₁ < θ₂** 或**θ₁<θ₂/m;**比原来的**θ₁<θ₂**更难学,但是,这将确保更多的区别特征。这里是不同决策界限之间的比较。**
****
**二元情况下决策边界的比较。【[来源](https://arxiv.org/pdf/1704.08063.pdf)】。**
**将这一思想结合到修正的 softmax 损失 we have:{θ₁∈[0,π/m]}中,**
****
**A-Softmax 损失函数**
****
**softmax 损耗、修正的 softmax 损耗和 A-Softmax 损耗之间的比较。我们可以看到,原始 softmax loss 学习的特征不能简单地通过角度进行分类,而修改的 softmax 和 A-softmax loss 可以。我们可以看到,在 A-Softmax 损失[ [来源](https://arxiv.org/pdf/1704.08063.pdf) ]的情况下,辨别能力更高**
**注意,A-Softmax 损失要求 **||Wᵢ||=1,bᵢ= 0;**由于,在测试阶段,通常根据两个特征向量之间的余弦相似度来计算测试人脸对的人脸识别得分。这表明特征向量 f ( **||f||** )的范数对评分函数没有贡献,因此预测仅取决于 **W** 和 **fᵢ.之间的角度****
**对于任何给定的问题,我们可以控制超参数 **m** 来增强学习参数之间的区分,因为 **m** 控制角度决策边界。**
## **与-Softmax 损失相关的问题:**
**对于 **θ** (两个类别的权重向量之间的角度)的所有值,A-Softmax 损失的裕度并不一致,对于不同的类别,裕度是不同的,因此,一些类别间特征具有较大的裕度,而一些类别间特征具有较小的裕度,这降低了损失函数的辨别能力。**
# **大幅度余弦损失—共面损失**
**在论文中提出的 LMCL—[CosFace:深度人脸识别的大余量余弦损失](https://arxiv.org/pdf/1801.09414.pdf)在余弦空间而不是角度空间中定义了决定性余量。由于余弦相似度是人脸识别中最重要的相似性度量之一,因此在不同类别之间引入余弦差值来改善余弦相关的区分信息更为合理。**
**考虑同样的二元分类问题。我们看到,如果修改后的 softmax 损失的 **cosθ₁ > cosθ₂** ,则从类 **1** 学习的特征 **f** 被正确分类。为了开发大范围分类器,LMCL 进一步要求:**
****
**由于 cos(θᵢ的 m 值低于 cos(θᵢ的 m 值,因此分类的约束条件更加严格。因此,对于大幅度分类,我们最大化**cos(θ₁**并最小化 **cos(θ₁).**注意,LMCL 指导 DCNN 学习具有大余弦裕量而不是大角度裕量的特征。与 A-Softmax 不同,LMCL 具有固定大小的余弦裕量 **m** 。**
**LMCL 还要求 **||Wᵢ||=1,bᵢ = 0,**,并且由于在测试阶段,特征向量 **f** 的范数对评分函数没有贡献,所以预测仅取决于 **W** 和 **fᵢ.之间的角度**因此,在训练阶段,我们固定 **||f||= s** (称为缩放参数)**,**,这移除了径向方向上的变化,并且所得模型学习在角度空间中可分离的特征。学习的嵌入特征因此分布在半径为 s 的超球面上。修改的 softmax 损失变成:**
****
**修正的 softmax 损失**
**最后,大容限余弦损失(LMCL)使用上面讨论的直觉定义为{符号与上面讨论的相同}:**
****
**大幅度余弦损失**
****
**二元类情形下不同损失函数的余弦空间决策裕度的比较。NSL(标准化的最大软损失)是修正的最大软损失。虚线代表决策边界,灰色区域是决策余量[ [源](https://arxiv.org/pdf/1801.09414.pdf)**
# **弧面损失**
**与 Cosface 不同,我们添加了一个**加性余弦余量**惩罚,论文 [ArcFace:深度人脸识别的加性角度余量损失](https://arxiv.org/abs/1801.07698)提出了一个**加性角度余量**惩罚(Sphereface 使用**乘性角度余量**惩罚)来进一步提高模型的区分能力。**
**与 LMCL 和 A-Softmax 类似,Arcface loss 也要求权重是 l2 归一化的和零偏差的,因此 **||Wᵢ||=1,bᵢ = 0。**我们还对嵌入特征 **||fᵢ||** 进行 l2 归一化,并将其重新缩放至 **s** 。弧面损失给出如下:{符号与上面讨论的相同}:**
****
**弧面损失函数**
****
**二元类情形下不同损失函数的角空间决策裕度的比较。虚线代表决策边界,灰色区域是决策余量[ [来源](https://arxiv.org/pdf/1801.07698.pdf)**
****
**在 MNIST 数据集上的不同损失函数的实验**
**所有这些方法 Sphereface、Cosface、Arcface 都是通过学习通常的图像分类问题来实现远程学习的。虽然它们在边缘惩罚方面有所不同,但无论是增加角度还是余弦空间,都增强了类内的紧密性和类间的多样性。**
# **参考**
**[1].https://www . research gate . net/publication/335314481 _ Deep _ Metric _ Learning _ A _ Survey。**
**[2].刘文伟,温,于,李,拉杰,宋。 [Sphereface:深度超球面嵌入人脸识别。](https://arxiv.org/abs/1704.08063)2017 年 CVPR。**
**[3].刘文伟,温,于志军,杨。[卷积神经网络的大幅度软最大损失。](https://arxiv.org/pdf/1612.02295.pdf)2016 年 ICML。**
**[4].王海红,王燕燕,周志军,纪晓霞,李志军,龚大东,周军军,刘伟。 [Cosface:深度人脸识别大幅度余弦损失](https://arxiv.org/abs/1801.09414)。在 2018 年的 CVPR。**
**[5].邓建康,,薛念南。 [ArcFace:深度人脸识别的附加角裕度损失](https://arxiv.org/abs/1801.07698)。**
**[6].[拉吉夫·兰詹](https://arxiv.org/search/cs?searchtype=author&query=Ranjan%2C+R),[卡洛斯·d·卡斯蒂略](https://arxiv.org/search/cs?searchtype=author&query=Castillo%2C+C+D),[拉玛·切拉帕](https://arxiv.org/search/cs?searchtype=author&query=Chellappa%2C+R)。[用于鉴别人脸验证的 L2 约束的 Softmax 损失](https://arxiv.org/pdf/1703.09507.pdf)。**
**我希望你喜欢和我一起深入学习公制。我很想知道任何阅读这篇文章的人的反馈。我很乐意回答对上述任何概念的疑问/问题。非常欢迎反馈(鼓掌👏🏼也会得到很好的反馈😇).你可以通过 Linkedin 联系我。**
## **谢谢你!**


浙公网安备 33010602011771号