复合系统的案例
原文:https://towardsdatascience.com/the-case-for-composite-systems-11632220ffa8
AI 系统一起更强吗?
卡尔·阿布伊德在 Unsplash 上的照片
T 何按‘意见’没道理。我困惑地盯着我的屏幕,滚动着一页 2020 年最受欢迎的新闻文章中的句子和不那么微妙的广告:像“有些已经这样了”这样的短语、“在这里看最新一集……”,还有“好莱坞万人迷”。
我微调的机器学习模型提取了几十个这样的“观点”呈现给我。从上下文来看,这些短语本身是有意义的——它们是更大的新闻文章的一部分,处理围绕新冠肺炎疫情、教育和娱乐业的叙事。虽然我的机器学习(ML)模型似乎抓住了一些强烈的情绪,但它对更大的画面没有用处。
为什么?我的团队正在为新闻分类构建一个 ML 模型管道。我负责使用 BERT 模型来查找个别文章中表达强烈观点的句子。然后,这些意见将被传递给第二个模型,即 USE,以计算来自 BERT 的意见和相关新闻文章的聚类之间的相似度。
但是 BERT 的输出对于使用模型来说不够相关。
抓耳挠腮,就在那一刻,我意识到我们不只是在寻找强有力的观点——我们在寻找强有力的观点,这些观点有意义。
然后来了一个哈!瞬间。如果我们在将 BERT 模型的输出发送到主使用模型之前,使用一个更小的使用模型对其进行后处理,会怎么样呢?我们将使用这个更小的使用模型来测量由 BERT 模型识别的观点与文章本身的相似性,并且丢弃那些与文章本身语义不相似的观点。所有这些都可以在保持原有管道完好无损的情况下完成。
我们的新闻聚合模型使用复合人工智能来处理我们的假设提取模型的输出——修改自来源(第 3 页)
通过这个小小的技巧使用一个机器学习模型来增强另一个,我开始从我的模型中提取的观点中看到更多的意义:受访者的语录、怀疑和喜悦的表情以及个人轶事。诸如“我在社交媒体上看到了无数的帖子……这是一种特别渴望的逃避现实的方式”“……有人担心他们对……的信仰。”,还有“‘你不可能…’”说…”。
复合系统帮助我的团队从我们的硕士项目的模型中挖掘更多的意义。
这些类型的系统,有时被称为 ML 反馈回路,在学术界和工业界都很流行——事实上,Gartner 最近将复合人工智能确定为一种新兴的技术趋势。但是,对于坐在方向盘后面的数据科学家来说,这些工作流是什么样的呢?
野外的复合人工智能
复合系统并不新鲜。当我们谈到这一点时,有许多相邻的 ML 子空间浮现在脑海中,包括集合模型(例如:随机森林🌳🌳🌳)甚至多任务学习!看到这些方法论如何与复合人工智能交叉将是令人兴奋的。
这里有几个案例研究,说明复合系统是如何在今天的生产中使用的。
案例研究 1:医疗保健
复合人工智能系统并不局限于组合多个人工智能模型。这类人工智能技术还可以包括使用多种数据处理技术和额外的操作,以帮助实现供应链管理和个性化等目标。
SAS 与阿姆斯特丹大学医学中心分享了一个有趣的用例:使用计算机视觉、数据可视化和机器学习过程的组合来确定化疗对患者是否有效!
医学研究人员引用说,能够从统计分析和可视化开始,然后深入到患者扫描的细节,是使用复合人工智能的一个关键好处。下图阐明了使用 CT 扫描进行结直肠癌肝转移形态测量的处理流程。
“SAS Vita 中用于端到端生物医学图像分析的处理管道”——来源(第 3 页)
案例研究二:语音助手
为了消费、处理和生成对命令的响应,语音助理应该能够有效地执行多项任务。
Webex 团队为 Webex Assistant (如下)展示了一个自然语言处理管道示例,包括语音到文本、实体识别、问题回答等 ML 模型。
这些模型中的每一个都可能需要它们自己的数据清理元素和健壮性评估。正如作者所演示的,如果第一个语音到文本组件错误地转录了语音命令,整个管道都会受到糟糕的数据质量的影响!
用于 Webex 助手的语音助手管道示例— 来源
案例研究 3:制造业
OECD 人工智能系统分类框架引用了一个令人兴奋的制造领域复合人工智能系统的例子,取自 Qlector LEAP 解决方案。
作为这个用例的一部分,多个人工智能模型消耗与制造工厂相关的和源自制造工厂的数据。这些模型适用于不同的任务,如人类特征分析、市场预测、异常检测等。然后将输出汇总为用于不同类型决策的知识图的一部分。
帮助管理制造工厂的复合人工智能系统— 来源(第 61 页)
随着这些系统的研究和使用的继续,我期待着看到我们如何回答围绕“一个为所有”和“所有为一”应用于机器学习的问题。
有一点是肯定的:复合系统的定义正在继续扩展到数据和人工智能工作流的不同元素(就像复合和分布式人工智能的交集!),证明人工智能系统在一起更强大。
因果推理“do”操作符的完整解释,包括一个使用 Python 和 DoWhy 的端到端示例
如何掌握因果推理 do 运算符,以及为什么您的数据科学工具包中需要它
Bradyn Trollip 在 Unsplash 上拍摄的照片
介绍
正如我在理解这项新兴技术如何工作以及它为什么如此重要的过程中所发现的那样,在互联网上或书籍中很难找到完整解释的、端到端的因果推理例子,这些例子都有实际的、有效的源代码。
但如果你坚持不懈,这肯定是非常值得的努力,因为它将能够解决一种不同类型的问题,这种问题使用其他机器学习技术无法解决。
传统的机器学习模型可以预测如果未来大体上像过去一样可能会发生什么,但它们不能告诉你应该采取不同的措施来实现预期的结果。
例如,分类算法可以预测银行贷款客户是否可能违约,但它无法回答诸如“如果我们改变贷款的还款期限,是否会有更多的客户避免违约?”
以下是因果推理可以回答的传统预测模型无法回答的问题类型的几个例子:
- 对一个系统提议的改变能改善人们的结果吗?
- 是什么导致了系统结果的变化?
- 系统的哪些变化可能会改善人们的结果?
有许多在线文章的例子详细介绍了因果推理所涉及的数学,但是很少有文章提供了一个完整的解释和所有源代码的实例。
如果你坚持和我一起读完这篇文章,我保证给你提供完整的解释和所有的源代码,这将使你能够做一些真正令人惊讶的事情,而这是其他机器学习技术不可能做到的。
数据
我们首先需要一些数据。我创建了一个纯合成数据集,其灵感来自著名的 LaLonde 数据,该数据观察并记录了 20 世纪 70 年代就业技能培训计划对收入的影响。
由于 LaLonde 的数据和研究提供了灵感,所以在文章结尾的参考文献部分有一段引文。
作者图片
有必要花点时间来理解合成数据集的关键方面
- 如果个人参加了旨在提供就业技能和增加收入潜力的虚构培训计划,则持有 1。在合成数据集中,640 人参加了训练计划,1360 人没有参加。
age
是以年为单位的年龄。education_years
持有学校教育的年限。received_benefits
如果个人曾经接受过失业救济,则持有 1。university_degree
是 1,如果个人在大学学习并获得学位。single
如果个人是单身(即没有结婚或处于民事伴侣关系中),则为 1。top_earner
如果个人处于收入最高的四分之一,则为 1。age_group
是age.
的分类版本earnings
是个人在完成虚拟就业技能培训计划 3 年后的收入,是感兴趣的“目标”或特征。
培训方案产生了什么影响?
现在让我们来看看数据,看看培训计划对参与者的收入有什么影响…
作者图片
根据分析,参加培训计划的影响是负面的-
- 参加培训方案的明显影响是年收入减少 1 065.29 美元。
- 参加培训的人成为高收入者的概率是 0.19,不参加培训的人是 0.28。
- 接受培训者的收入中位数为 3739 美元,未接受培训者的收入中位数为 4893 美元。
- 接受培训者的平均收入为 6067 美元,未接受培训者的平均收入为 7132 美元。
你会给出什么建议?
根据分析,明确的建议是停止培训计划,因为使用四种不同的衡量标准可以表明,对收入的影响始终是负面的。
直觉上,这个结论似乎并不正确。即使培训绝对糟糕,参加培训会降低参与者的就业能力并损害他们未来的收入也是不对的。
那么,分析出了什么问题?
在这一点上,包括概率和预测模型在内的传统方法的潜力无法让我们走得更远。这些技术的任何应用都将得出训练应该被取消的结论。
为了突破这些限制,并真正理解发生了什么,我们需要建立一个因果模型,并应用神奇的“do”运算符。
如果你想知道培训项目的真正影响,以及为什么使用传统的概率和预测模型会导致错误甚至危险的结果,请继续阅读…
使用“do”运算符的因果推理解决方案
让我们通过更详细地查看数据集中的一些要素来开始更准确的评估之旅…
作者图片
显然,参加培训的人和没有参加培训的人在教育方面有着明显不同的模式。
在现实世界项目中的这一点上,我们将与领域专家合作来理解这些模式,但即使没有领域专业知识,也有理由得出结论,教育可能会对参加培训的人及其赚钱的能力产生因果影响。
作者图片
这是一个相似的故事。对于那些接受培训的人来说,这是一个线性模式,年轻人多,老年人少。对于没有训练的人来说,在 30-40 岁年龄段会有一个高峰。一种假设可能是,许多 30-40 岁的人已经收入颇丰,不想接受任何与工作技能相关的培训。
这再次表明,年龄既影响个人是否有可能参加培训,也影响他们的收入潜力。
因果推理和“混杂”
这个简单的附加分析揭示了“混杂因素”的存在。这个术语在许多可用的例子中到处流传,通常伴随着微积分和公式,但通常没有明确的解释。
简而言之,年龄和教育等特征的影响与兴趣的主要影响(即培训对收入的影响)混合在一起,当我们应用传统方法时,无法分离出独立的影响。
构建“有向无环图”(DAG)
从数据中发现因果关系是不可能的。数据需要用“有向无环图”(DAG)来补充,DAG 是通过利用领域专业知识和其他技术来“发现”因果关系而构建的。
关于更详细的探索,请看看我关于发现因果关系的文章
下一步将使用我的DirectedAcyclicGraph
类。为了使文章更加简洁,我在文章中省略了源代码,但如果你想自己运行代码,这里有完整源代码的链接-https://gist . github . com/grahamharrison 68/9733 b 0 CD 4 db 8 e 3 e 049 D5 be 7 fc 17 b 7602。
如果你决定使用它,如果你喜欢它,为什么不考虑给我买杯咖啡?…
这是我对数据中因果关系的建议-
作者图片
DAG 可以解释如下-
received_training
(即参加培训项目)对earnings
(即未来收入)有因果影响。- 所有其他特征对一个人是否可能参加培训计划都有因果影响。
- 所有其他特征也会对未来收益产生因果影响。
例如,个人的年龄“导致”他们是否参加培训,可能是因为更多的年轻人希望接受培训,年龄也“导致”收入,可能是因为经验更多的老年人可以赚得更多。
这种模式很常见。当统计学家在进行随机对照试验(RCT)时,他们可能会对与主效应混合的变量进行调节或控制。
这意味着,对于年龄,他们可以将观察结果分成不同的年龄组,查看每组的治疗和年龄之间的关系,然后对每组进行比例平均,以估计真实的总体效果。
然而,这种方法存在一些问题。例如,如何定义组的边界?如果关键影响是 16-18 岁的人,但界限被设定为 16-30 岁,会怎样?如果没有对 40-45 岁人群的观察结果会怎样?
另一种方法不是观察,而是干预。我们可以简单地强迫每个人进行培训,然后我们就会看到真正的影响。但是,如果观察是历史的(如在拉隆德的数据中),并且干预为时已晚,该怎么办呢?或者如果这是一项关于吸烟或肥胖的研究呢?
受试者不能仅仅为了证明我们的理论而被迫吸烟或变胖!
这就是“do”操作符的用武之地。这听起来像是魔术,但建立一个因果推理模型是真正可能的,它可以准确地模拟这些干预,而不必在现实世界中进行。
这将节省大量时间和金钱,消除对随机控制试验的需求,这些试验以大量变量为条件,并使对吸烟和肥胖等现实世界研究中存在道德和伦理问题的因素的研究成为可能。
“Do”操作符的魔力
让我们想象一下,不是观察一群人,其中一些人接受了训练,一些人没有,我们可以回到过去,干预而不是观察,让他们都接受训练。
在这种情况下,DAG 看起来像这样-
作者图片
这就是神奇的“do”操作符正在做的事情。如果你进行干预和𝑑𝑜(𝑡𝑟𝑒𝑎𝑡=1),你就有效地“消除”了所有因果关系的输入线,因为无论年龄、教育和其他特征如何影响进行培训的概率,它总是会发生。
在幕后,图书馆正在模拟这种干预。它可以通过使用做微积分的规则来转换𝑝(earnings|𝑑𝑜(received_training=1)来做到这一点,除非我们对一组可以从数据中计算出来的观察规则进行物理干预,否则这些规则无法直接计算出来。
我有意在这篇文章中省略了数学的细节。有很多文章展示了数学,但是很少展示 Python 代码的工作示例,因此这是本文的重点。
注意:如果你想运行代码,你将需要我的DirectedAcyclicGraph
类,所以如果你还没有下载它,请前往https://gist . github . com/grahamharrison 68/9733 b 0 CD 4 db 8 e 3 e 049 D5 be 7 fc 17 b 7602,如果你喜欢的话,不要忘记考虑请我喝杯咖啡!
这是对数据执行“do”操作的完整源代码…
作者图片
代码是什么意思?
在我们进入真正令人惊奇的结果之前,逐行浏览代码是有用的。
首先,导入dowhy.api
神奇地扩展了熊猫DataFrame
,使得这个类获得了一个新的causal.do
方法。
接下来在numpy
中设置随机种子,确保do
方法的结果是可重复的。文档中没有提到任何关于设置随机种子的内容,这是通过反复试验找到的。还要注意,随机种子需要在每次调用causal.do
之前在前面的语句中设置,而不仅仅是在第一次调用之前。
causal.do
的下一个谜团是variable_types
参数。DoWhy
文件不完整且不一致。尝试了很多不同的东西,得出了以下结论-
- 不管文档中怎么说,只有两种类型是重要的——“d”代表离散型,“c”代表连续型。
- 在统计学中,整数是离散的,但是如果整数被声明为“d”,那么
DoWhy
会产生一些非常奇怪的结果。基于对DoWhy
文档和例子的大量阅读,我的结论是整数需要声明为“c”来表示连续。 - 在
DoWhy
源代码中有一个名为infer_variable_types
的方法,但是它没有代码,所以我写了自己的实现,在DirectedAcyclicGraph.infer_variable_types()
中它是一个静态方法。
以下是最重要的causal.do
方法参数的含义-
x={"received_training": 1}
是说我们想“做”什么。在这种情况下,我们想看看如果每个人都被迫参加数据中由received_training=1
表示的培训会发生什么。outcome="earnings"
-这是我们正在寻找的结果或效果,即“做”received_training=1 对个人收入的影响是什么?dot_graph=training_model.gml_graph
通知do
操作者我们认为数据中存在的因果关系。training_model
是我的DirectedAcyclicGraph
类的一个实例,我给了它一个属性,它以gml
的格式给出了结构do
方法需要传入common_causes
或dot_graph
来描述因果关系。dot_graph
参数将接受dot
或gml
格式的结构,但在文档中没有提到这一点;gml
在我看来要好得多,因为它在DoWhy
中到处都被使用。- 指定一个图比设置
common_causes
要好得多,因为图可以捕捉任何类型的结构,而common_causes
则有更多的限制。同样,在DoWhy
文档中也没有提到这一点。 variable_types
参数已经解释过了。proceed_when_unidentifiable=True
避免干扰计算的恼人的用户提示。
它是如何工作的?
causal.do
方法正在返回一个新的数据帧,该数据帧有效地模拟了强制干预,并提供了如果每个人都完成了培训就会收集到的数据-
作者图片
在这方面,DoWhy
与大多数其他 Python 因果库不同,因为大多数其他库只是返回一个数字而不是一个DataFrame
。
返回一个DataFrame
最初有点令人困惑,但是再深入一点,这是一个强大、灵活和信息丰富的方法。
在不知道内部实现细节的情况下,我的结论是DoWhy
正在模拟随机对照试验(RCT ),根据需要用于“消除混杂”本文前面描述的混合效应的组对数据进行采样。
例如,看一下原始观察数据和新干预数据之间的以下特征的比较-
作者图片
显然DoWhy
已经以一种非常不同的方式对该特征的干预数据进行了重新采样。
培训对收入真正的“非决定性”影响是什么?
现在剩下的就是通过观察df_do
DataFrame
-来解释培训对收入的真正影响
作者图片
结论
根据观察数据使用概率的传统方法表明,参加培训的人实际上比没有参加培训的人工资要低。
根据观察数据接受培训的人的平均工资为 6067 美元,而模拟干预的因果推断“do”方法揭示了真实的影响——工资增加,平均工资为 7392 美元。
在应用因果推断方法后,建议不是取消培训计划,而是扩大培训计划,因为它为需要帮助的群体提供了更公平的机会,以增加他们的长期收入。
在文章的结尾,我承诺了一些令人惊奇的事情,如果这个结果对你有和对我一样的启示性影响,那么我希望它没有辜负我的承诺。
每当数据中存在因果效应时,传统的预测方法都会导致错误的结论和建议,这使得因果推断成为所有数据科学家的工具包中的一个重要工具。
如果你喜欢这篇文章,请考虑…
通过我的推荐链接加入 Medium(如果你使用此链接注册,我将收取一定比例的费用)。
https://grahamharrison-86487.medium.com/membership
每当我发表新故事时,订阅一封免费电子邮件。
访问我的数据科学网站— 数据博客。
参考
拉隆德数据集-
- 引文:罗伯特·J·拉隆德,1986 年。“用实验数据评估培训项目的计量经济学评估”,《美国经济评论》,美国经济协会,第 76 卷(4),第 604-620 页,9 月。
自然语言处理中口译语言的挑战
原文:https://towardsdatascience.com/the-challenge-of-interpreting-language-in-nlp-edf732775870
为什么教机器理解语言如此困难
让我们的机器理解文本是一项艰巨的任务。尽管在这方面已经取得了很多进展,但我们距离创造一种将语言无缝转换成机器可读数据的方法还有很长的路要走。
让我们面对它;我们的语言很复杂。
与整齐地由行和列组成的表格以及由 RBG 值在固定范围内的像素组成的图像不同,我们说的和写的单词不遵循严格的结构化系统。
鉴于我们的灵活性,在过去 200 万年的人类文明中,我们一直能够做到这一点(这是一次不错的尝试)。不幸的是,当我们试图教计算机理解我们复杂的系统时,我们语言中的谬误开始困扰我们。
为了更好地理解 NLP 从业者面临的挑战,从语言学家的角度来审视我们的语言是理想的。
让我们来看看让我们的语言变得晦涩甚至有时无意义的一些因素。
注:本文主要以英语为主。讨论的一些特性可能不适用于其他语言。
单词序列
在口语和书面语中,单词的顺序很重要。一篇文章的语义价值不仅在于单词本身,还在于单词的顺序。
考虑下面几对句子:
Case 1:
"The cat ate the mouse."
"The mouse ate the cat."Case 2:
"I had fixed my laptop."
"I had my laptop fixed."
在这两种情况下,即使句子有相同的单词,它们的语义是不同的。
同义词
同义词指的是彼此意思相同或相似的词。您很可能对它们很熟悉,但这里有几个例子:
1: {great, amazing, fantastic}
2: {big, huge, enormous}
3: {costly, expensive, pricey}
用多种方式表达相同的信息会增加复杂性,这是 NLP 模型必须考虑的。
同音异义词
同音异义词是指拼写和发音相同,但有多种含义的词。
在对话中,根据上下文,很容易确定所指的是什么意思。这里有一个例子:
"The fishes are swimming in a tank."
"The military unit was supplied with a tank."
根据所提供的上下文,我们可以很容易地说出每个场景中“tank”的定义。然而,让计算机做同样的事情是一个挑战。
讽刺
讽刺,通俗地说,就是说一些与你想说的意思相反的话(通常是一种嘲弄或嘲笑的形式)。它早已融入我们的日常对话。它也存在于文本中,常见于个人聊天等交流形式中。
我相信我们都见过类似以下的在线评论:
"What a book! After 50 pages in, I only dozed off twice!"
同样,这种现象对人类来说很容易察觉,但对计算机来说就不那么容易了。不幸的是,未能检测讽刺会妨碍需要检测情感(例如,情感分析)的 NLP 应用的性能。
未知单词
NLP 模型也有可能遇到不认识的单词。这些词不包括在用于训练模型的数据中。这类单词的例子包括新词汇、拼写错误的单词、俚语和缩写。
NLP 中的当前模型
研究人员进行了无数的研究,以开发算法和模型,使计算机能够向量化文本,尽管我们的语言错综复杂。
让我们来看看其中的几个。
基于计数的模型
像单词袋或 TF-IDF 这样的模型经常被介绍给从自然语言处理开始的新手。他们对文本进行矢量化的方法很简单,主要基于单词的频率来评估文本。
这些模型易于大规模部署,可用于许多应用。然而,他们的矢量化方法忽略了单词的顺序以及单个单词的语义值。
例如,这里有两个非常简单的句子:
"Pigeons fly."
"Eagles soar.
很相似,对吧?
不幸的是,对于单词袋或 TF-IDF 模型,这些句子的余弦相似度为 0。
使用基于计数的模型,同义词如“飞”和“翱翔”以及来自同一类别的词如“鸽子”和“鹰”将被视为完全不同的实体。
深度学习模型
为了解决基于计数的模型的局限性,一些研究转向深度学习模型作为向量化文本的手段。
例如,word2vec 模型使用浅层神经网络根据每个单词周围的单词来评估每个单词。这解决了基于计数的模型无法保留给定文本的语义值的问题。
不幸的是,word2vec 模型有其自身的局限性。
首先,它不能正确识别同音异义词的不同含义。该模型不能识别在正文中找到的单词的版本。
其次,它无法容纳未用于训练模型的未知单词。
最后,作为深度学习模型,它需要大量的数据。深度学习模型的性能只有在用高质量和高数量的数据训练时才能达到令人满意的水平。
为了演示,让我们使用从 Kaggle(无版权)获得的几篇 BBC 文章来创建 word2vec 模型。此演示的数据可在这里找到。
首先,让我们加载。txt 文件,并将业务类别中的所有文本合并成一个语料库。
在用 NLTK 库对语料进行预处理之后,让我们用它来训练一个 word2vec 模型。
对于模型,我们来看 5 个与“金融”最相似的词。
代码输出(由作者创建)
如你所见,被认为与金融最相似的 5 个词在商业环境中并没有那么紧密地联系在一起。然而,这样的结果是可以预期的,因为模型的输出受到用于训练它的语料库的限制。不能期望这样的模型充分执行。
基于变压器的模型
广泛的研究导致了基于变压器的模型的出现。这些模型的编码器-解码器架构允许计算机理解更复杂的文本。他们能够处理同音异义词,甚至是不认识的单词。
这种模型可用于执行高级任务,如文本摘要和机器翻译。
基于变压器的模型的例子包括谷歌的变压器双向编码器表示(BERT)模型和 OpenAI 的 GPT-2。
虽然这些模型非常复杂,但它们的性能代价很高。字面上。
这些模型具有复杂的体系结构,并用数十亿个单词进行训练。因此,培训和部署他们会产生很高的成本。
自然,它们是为更高级的应用程序保留的。
使用变压器完成简单的 NLP 任务就像租一辆豪华轿车去杂货店一样。
结论
你现在对我们语言的构成是如何让计算机理解我们的语言变得如此困难有了一些了解。
在 NLP 中显然还有其他困难的障碍需要面对(例如,缺乏对数据的可访问性),但是认识到有多少障碍源于我们语言的无组织本质是很重要的。
随着我们继续尝试实现更复杂的 NLP 技术,让我们的计算机理解我们的语言,尽管它们是谬误的,仍将是一个持续的挑战。
我祝你在 NLP 的努力中好运!
参考
- 谢里夫,P. (2018)。BBC 新闻摘要,第 2 版。于 2022 年 1 月 30 日从 https://www.kaggle.com/pariza/bbc-news-summary.取回
用数据解决问题的挑战
原文:https://towardsdatascience.com/the-challenges-of-solving-problems-with-data-2efb62f9a40a
这是数据科学研究人员和行业从业者普遍认同的一条公理:给定足够的数据,没有什么问题是不可能解决的。在现实中,数据可能难以控制,项目管理需要许多超出调整模型的因素,并且将结果转化为可操作的见解通常是一个复杂和不确定的过程。
本周,我们将聚焦于数据科学问题的解决,精选了一些从多个角度探讨数据科学的优秀文章。(向下滚动阅读其他主题的一些精彩读物。)
- 图论如何帮助解决路由问题 。 Lily Wu 从流行的视频游戏 Stardew Valley 中获得灵感,深入研究路线优化,并耐心地向我们介绍她用 Python 编写的算法来解决最短路径和最小生成树问题的方法。
- 让数据可见是实现可靠分析(和解决方案)的关键一步 。Aine Fairbrother-Browne 的第一篇 TDS 文章围绕航空效率和航空业对环境的影响——一个巨大的全球性挑战。但它也凸显了将数据(在这种情况下,是公共航空数据)转化为清晰图像的价值,这反过来让我们能够发现趋势、构建论点,并(希望)指出潜在的解决方案。
照片由 Senad Palic 在 Unsplash 上拍摄
- 将 AI 推至其当前能力之外的风险 。通过聊天机器人的例子, Iulia Turc 展示了技术在解决复杂问题上的局限性。这项研究专注于精神健康背景下的对话式人工智能,这很好地提醒了我们,设计糟糕的解决方案往往会加剧问题,而不是解决问题,因此我们需要非常谨慎地在现实世界中部署它们。当人们的生命和福祉受到威胁时,尤其如此。(内容警告:本帖含有自残和自杀的提法。)
- 如何通过更好的设计提高项目的成功率 **。**有时,解决棘手问题的关键不在于数据或我们使用的技术方法。正如 Khuyen Tran 在她的最新文章中所强调的,建立正确的项目结构至少和选择正确的 ML 模型一样重要。她分享的模板将帮助数据科学家产生透明、可读和有据可查的工作。
准备好了吗?我们希望如此——TDS 的作者们最近分享了一些令人难以置信的工作,涉及的主题范围很广:从高度理论化到实际操作。
- 如果你正在建立一个强化学习项目,不要错过费利克斯·霍夫斯特的新帖,他在那里解释了如何阻止你的人工智能代理侵入奖励函数。
- 人工智能生成的维基文章即将出现吗?Jeremie Harris 和人工智能研究员 Angela Fan 在最近一期 TDS 播客中深入讨论了这个问题。
- 对物理材料的数据挖掘感兴趣? Joyita Bhattacharya 继续探索这个话题,发表了一篇新文章,解释了如何从图像中测量材料的特性。
- 任何对排名算法领域不熟悉的人都会喜欢塞缪尔·弗伦德的新的、可访问的初级读本,该读本涉及推荐系统、社交媒体源等等。
- 这里有一个针对修补者的实践教程: Bildea Ana 带我们了解构建定制顶点 AI 管道的过程。
- 最后,花点时间阅读 Ajit Rajasekharan 的在生成任务背景下对向量和图像表示的深入探讨。
你喜欢花时间在 TDS 上吗?考虑通过成为媒体成员来支持我们作者的工作。我们将永远感激;你将可以无限制地访问我们的全部档案。
直到下一个变量,
TDS 编辑
咖啡豆不是同质的:筛过的意大利香肠浓缩咖啡
原文:https://towardsdatascience.com/the-coffee-bean-is-not-homogenous-sifted-salami-espresso-5b861bfbfbb7
咖啡数据科学
测量进入咖啡豆的研磨粒度的提取率
理解浓缩咖啡的最大障碍是对咖啡豆的理解。通常,我们假设咖啡豆在味道和提取潜力上是同质的。当我开始开发断奏镜头时,我曾说过只用大颗粒或小颗粒的咖啡感觉失去了一些味道。除了同质性可能是不正确的以外,我不知道为什么。
在本文中,我研究了不同粒度的萃取率,并做了额外的研究。我把里面的粉末从外面分离出来,这样我可以测量两者的提取率。这应该有助于解释为什么一杯反过来的断奏浓缩咖啡比普通的断奏咖啡表现更好。
背景
一年前,我研究了不同粒度的的提取率,那项研究极大地让我了解了提取的极限。随着一些其他的研究,我受到启发,研究同样的东西,筛分粒度。颗粒不会像你想象的那样被提取出来,因为咖啡豆不是同质的。
大约在去年的同一时间,我发现豆子里面的和外面的不一样。人们可以筛去粗磨部分,得到里面的细粒。味道测试证实,这些细粒不同于将巨石研磨得更细所产生的细粒。
在 2021 年的秋天,我练习了内向外断奏击球和懒惰断奏击球,作为利用内线优势的一种方式。两个镜头都很有趣,但当然,更多的处理步骤被添加。除了像“从豆子的相同部分(相同的颗粒大小)提取的粉末应该更均匀”这样含糊不清的说法之外,还不清楚为什么分离粉末会有帮助
设备/技术
咖啡研磨机:小生零位
咖啡:家庭烘焙咖啡,中杯(第一口+ 1 分钟)
镜头准备:断奏夯实
预灌注:无
输液:恒定流量
过滤篮 : 7g VST
其他设备: Atago TDS 计, Acaia Pyxis 秤, Kruve 筛, Fellow 摆振
实验设计
为了测试成功,需要很好地控制其他变量,即可溶物和 CO2。萃取过程中释放的可溶物和 CO2 气体会影响萃取。为了隔离这些变量,我做了很多用过的咖啡渣。最后它们都结块了,所以我用咖啡筛去除了所有的结块,并且在筛过之后我重新混合了细的和粗的粉末。
所有图片由作者提供
每一杯咖啡大部分是用过的咖啡渣,其中大约有 11%是筛过的咖啡。我还用了一个 7g 的 VST 篮子,这样我就可以将 1.5g 的新鲜咖啡和 4g 的废咖啡渣混合在一起。在这一层的上面是 8.5 克用过的咖啡,因此篮子里有 14 克咖啡。我用一个金属网筛完成了这个。
然后,我在像样的浓缩咖啡机上使用恒定流量(4 毫升/秒)作为所有镜头的基准。这忽略了其他优化,如预灌注、压力分布、压力脉动和开花,但这些在以后的时间里会很有趣。
性能指标
我使用基于折光率仪的提取率来评估性能。
数据
这是我使用两种研磨设置制作不同粒子的路线:
注意,我用 Fellow Shimmy 过滤掉< 300um,因为它更快,然后我用了 500um Kruve 屏幕。该摆振是额定为 200 微米筛选,但因为它使用方孔,它的表现非常接近 Kruve 300um 微米屏幕。
我最终得到了这个分布。
然后,我从每个箱子里取了一些样品,拍了一些意大利香肠。
包括对照镜头在内的所有镜头具有 20 秒的拍摄时间,并且所有的分割时间彼此在 1 秒之内。这表明新鲜的粉末没有影响流动,这是本研究的目的。
首先,我提取了一个对照样本来测量从废料中提取了多少。虽然该值不高,但它最终会影响其他测试的 TDS 测量值。我的目标是在输出比率上以 0.5 的间隔从 0.5 到 3,但镜头跑得太快了,很难管理。
对于每一杯意大利腊肠,我通过 2%到 3%的控制来调整 EY。
我们来看看最后的结果。在这里,我们可以看到内部的细粒比外部提取得快得多。如果我们假设豆子的内部比外部更脆,这就不足为奇了。
在观察不同大小完全提取的速度时,较细的层几乎立即提取。按 1.5 的比例,大部分都是提取出来的。然而,较粗的颗粒需要更长的时间。这可以解释为什么 Allongé需要 3:1 或更长的比例才能达到最高提取率。
如果先前的筛选分布在具有相同轮廓的圆盘中,我们可以使用该信息来制作理论圆盘。这一理论与来自外部研磨的中档粒子(300um 到 500um)非常匹配。
我将它与两个镜头(常规和断奏)进行了比较,这两个镜头使用了我的常规配置文件。他们的 EY 趋势更高,这仅仅表明使用预灌注、起霜或压力脉冲有助于改善理论。
对数据的另一种看法
我想改变我查看数据的方式,所以我为每个镜头比率做了一个穿过筛选过的粒子箱的线形图。他们的投篮命中率大致相同,我喜欢这个数据出来的方式。我仍在研究下一步如何利用这些新信息。
这些数据显示了咖啡是如何不均匀的,并且它有助于给出萃取如何随时间发展的基线。对于不同的温度设置、压力设置和其他考虑因素,该实验可以容易地重复,并且它可以用于帮助更好地表征咖啡。希望这种方法可以被证明对开发更高级的浓缩咖啡镜头轮廓是有用的。
如果你愿意,可以在推特、 YouTube 和 Instagram 上关注我,我会在那里发布不同机器上的浓缩咖啡照片和浓缩咖啡相关的视频。你也可以在 LinkedIn 上找到我。也可以关注我在中和订阅。
我的进一步阅读:
工作和学校故事集
现代人工智能堆栈完全指南
原文:https://towardsdatascience.com/the-complete-guide-to-the-modern-ai-stack-9fe3143d58ff
AI/ML 生命周期中的阶段、技巧和工具
图片来源:Unsplash
企业中的机器学习(ML)在一个狭窄的范围内迅速发展。虽然它呈指数级增长,但一些组织仍在努力跟上 ML 堆栈发展的步伐。
这份现代人工智能堆栈的端到端指南希望将最佳工具和实践纳入一个公共空间,作为以下方面的参考:
- 人工智能领域的领导者包括经理、总监、副总裁和首席技术官,他们可以了解更多关于新技术/集成的知识,并引导他们的团队走向现代人工智能堆栈
- 数据科学家和 ML 工程师,他们可以将他们当前的堆栈与我们提议的 AI 堆栈进行比较,并发现要采用的新技术。
但是首先,沿着记忆的小路走一走…
企业中 ML 的开始
机器学习在不久前还处于企业市场的实验阶段。就在五年前,大型服务公司刚刚开始涉足概念验证(POC)项目,广泛宣称机器学习(ML)是新兴技术,将影响作为其客户一部分的大量行业。
一旦客户开始规划智能解决方案的可能性,如预测性维护、异常检测、收入预测和推荐系统,就没有回头路了。然而,由于数据的动态性质,即使是最先进的模型也面临着不可避免的退化。下面的一些例子可以更好地理解这一点:
- 未开发的适应:一种癌症预测解决方案具有 99%的灵敏度,但没有明确定义的途径或监控方法来检测漂移的数据模式并悄悄地更新失败的模型。这里的数据漂移可能涉及从改变药物模式到输入设备/技术升级的任何地方。
- 由于不可靠,需要更多的手动工作:欺诈检测模型可以达到 95%的灵敏度,但必须在精确度上做出妥协,比如说 75%,这样才能过滤掉所有可能的欺诈案例。这导致在筛选检测到的案例后需要更多的手动工作,并限制了对无过失客户的询问操作。
- 糟糕的客户体验:贷款预测解决方案可能有 97%的准确率,但与每种机器学习算法一样,随着数据的变化,性能可能会下降。对于黑盒人工智能模型,没有明确的方法来理解贷款为什么被批准或拒绝。特别是在贷款被拒绝的情况下,客户需要一个适当的解释,如果没有这个解释,会有几次重复,导致客户体验不佳。
这些现实世界的问题自 AI 在企业中出现以来就一直存在,给客户打上了 AI 在很大程度上不可靠的烙印。作为专注于人工智能可观察性的 Censius 的创始人,我遇到了许多这样的故事,它们阻碍了自动化或基于人工智能的解决方案的可信度。
过渡到可靠的解决方案
人工智能/人工智能在经历了数年的试验阶段后,正朝着一个更为简化的方向发展。较大的组织已经开始完善他们的流程,以创建标准化的 ML 管道,这些管道针对规模、效率和控制进行了优化。
过去,由于数据科学家和工程师之间的巨大差距,团队无法保持敏捷,解决任何问题的时间都很慢。但最近,企业一直在努力通过实施MLOps——一种机器学习解决方案的生命周期管理技术,为 ML 管道创建一个更可控的环境。
MLOps 通过在整个 ML 管道中实施一套标准化实践,从需求收集开始,一直到在生产中监控解决方案,促进了开发和运营团队之间的沟通。这是确保 ML 解决方案的规模、速度和质量的基础。
通过 MLOps 实践,团队可以了解 ML 基础设施,并彻底了解 AI 性能和 ROI 机会——鉴于现实世界数据的动态行为,这在以前是一个重大挑战。密切跟踪 ML 管道以捕捉重复出现的问题仅仅是在 AI 领域注入可靠性的开始。至关重要的是,通过模型可观察性——m lops 生态系统的新兴支柱,超越模型监控,以实现对每个模型决策的剖析,并在规模上建立可解释和负责任的人工智能。
我们显然正在迈向人工智能发展的下一个阶段,在这个阶段,人工智能产品提供了更多类似于 SaaS 工具的具体体验,增加了模型的可靠性、性能,并最终增加了客户的信任。
现代人工智能堆栈是如何形成的
软件即服务(SaaS)并行
两大技术革命之间有相似之处:很久以前发生的 SaaS 革命和现在正在发生的人工智能进化。
在 SaaS,当微服务或面向服务的架构(SOA)的概念被引入时,它被证明比单一的应用程序更好。然而很快引发了数百个难以规模化的微服务的兴起。这导致了无服务器架构的发展,在这种架构中,资源在事件期间动态分配,一旦达到目的就被销毁,从而实现了巨大的可扩展性。
SaaS 的这一里程碑式的转变与人工智能目前的发展非常相似。随着人工智能从业者在回头客中发现更多价值,人工智能正逐步从具有分散流程的易错系统演变为可扩展和可信的人工智能生态系统,正如 SaaS 之前从分布式单片或 SOA 转变为大规模可靠的无服务器架构。
向 DevOps 学习
为了使从不可靠的人工智能到值得信赖的人工智能的飞跃成为可能,标准化的 MLOps 过程越来越多地被采用,以改善模型可见性、模型性能以及随着数据变化的实时故障排除。MLOps 与 DevOps 有着密切的联系,并一直受到它的启发。两者之间有几个相似之处,包括 CI/CD 实践、有效的协作方法以及提高管道中容错能力的共同目标。
DevOps 通过采用一套最佳实践和工具来鼓励开发和运营团队之间的快速协作,为开发人员和运营团队提供最佳实践,以高速构建和交付可靠的 SaaS 产品。 **MLOps 诞生于类似的需要,结合了 DevOps、数据工程和 ML 的实践。**合并三个不同的领域建立了 MLOps,以有竞争力地维持 DevOps 策略,同时适应 ML 管道的实验性质。
输入 MLOps
MLOps 是精简整个 ML 管道的过程,以便团队可以顺利地运行开发、生产、监控和维护活动。多年来,MLOps 已被证明能够带来多种好处,促使更多的组织效仿。
尽管 MLOps 仍处于早期形成阶段,但对早期采用者的好处已经很明显了。以下是团队在实施 MLOps 的早期就意识到的一些好处:
- 实施经过验证的 CI/CD 方法,在不中断产品体验的情况下,以首选频率推动变革。例如,优步采用 CI/CD 方法发布实时预测服务
- 机器学习生命周期中测试阶段的自动化,包括预测验证、数据质量监控、集成测试等。Nike的 ML 团队能够自动化他们的 A/B 测试和服务渠道,管理集成模型的执行。
- 所有 ML 解决方案的技术债务最小化,尤其是在 ML 生命周期中频繁出现的维护活动中。谷歌很容易就发现了这个问题,并推出了 Vertex AI,促进了人工智能的维护和发展。
- 通过提高整个 ML 管道的可重复性,解决方案的可扩展性和脆弱性的降低。为了通过 MLOps 战略实现 ML 渠道的规模化,网飞在内部开发了端到端的工作流程管理工具。
MLOps 循环|来源:ml-ops.org
随着公司试验 MLOps 并亲身体验其好处,它在现代人工智能堆栈中获得了永久的一席之地。让我们浏览堆栈的每一层,以更清楚地了解组装最佳流程、工具和 MLOps 实践,从而实现向可靠 AI 的飞跃。
现代人工智能堆栈的阶段
现代人工智能堆栈是吸收了 MLOps 实践的工具、服务和过程的集合,允许开发人员和运营团队在资源利用、团队工作、最终用户体验和维护活动方面有效地构建 ML 管道。
我们将讨论 ML 管道的每个阶段,并从 20 英尺的角度来看每个阶段可以利用的工具。
现代人工智能堆栈|作者图片
阶段 1:数据管理
数据管理有五个主要的对应部分:收集、转换、处理、版本控制和监控。
数据管理堆栈|作者图片
数据采集
数据收集过程经历了几个第三方工具和服务的交叉,这些工具和服务与内部工具集成在一起以组装可用的数据。
- 数据收集
数据收集通常涉及网络搜集,浏览旧数据库,并编写复杂的查询来提取它们。除了这些方法之外,数据集还直接来源于 OpenML 、 Kaggle 和亚马逊数据集等网站。
- 数据标记
需要对收集的数据进行处理和注释,以便机器可以在受监督的解决方案中学习适当的关系。数据标记在很大程度上一直是手动的,但最近出现了几个工具,如 V7 labs 、 LabelMe 和 ImgLab ,这些工具大大自动化了标记,使大规模繁琐的过程成为可能。
然而,这一阶段仍然是一个人工密集型的过程,因为算法往往会遗漏特定的案例,并且审查非常耗时。你需要对收集什么类型的数据有明确的参数,并在标记过程中非常严格。亚马逊的 Mechanical Turk 和 Ground Truth 等工具也可以通过外包提供支持。
- 合成数据生成
尽管数据量很大,但有时数据并不总是可用于非常特定的用例,或者由于隐私问题而不被直接使用,例如罕见疾病数据。尽管这种数据很难获得,但对这种具有特定数据要求的模型的需求相对较高。有大量的工具和库支持各种数据类型的数据生成,包括图像、文本、表格等。
Tensorflow 和 OpenCV 是图像数据的理想选择,支持旋转、翻转、重缩放、亮度变化、颜色修改等等。 Scikit-learn 可以为表格数据创建合成数据点,并且 scikit image 也支持图像数据。 SymPy 和 Pydbgen 是分别支持符号表达式和分类数据生成的专用库。 Hazy 和 Datomize 也是两个有竞争力的合成数据生成工具,具有与第三方工具和应用程序集成的额外功能。
数据转换和存储
数据存储需要可靠的系统,能够长期支持可变的数据量而不损坏它。为了适应这种广泛的需求,组织越来越多地涉足结构化和非结构化数据的多种存储方法,如数据仓库、数据湖、数据库等。
- ETL、ELT 和反向 ETL
ETL(提取、转换、加载)和 ELT(提取、加载、转换)是两种不同类型的数据转换系统。ETL 是传统的方法,当处理过的数据比保存原始数据具有更高的优先级时,ETL 是有利的。它将数据加载到临时暂存位置,对其进行处理,然后将其存储在目标位置。ELT 是更现代的方法,是时间优化和高数据量的理想选择。它首先将数据加载到目标位置,然后进行处理。
反向 ETL 是一个较新的发展,刚刚成为人们关注的焦点。它将数据存储连接到面向客户或基于行动的系统,如 CRMs 和 ERP,以实现跨应用程序的共享实时洞察,从而大规模个性化客户交互。
Oracle、T2、辛格、T4、IBM、Pentaho 和 Talend 提供了大量的 ETL 工具。ELT 是一项较新的技术,具有相对较少的专业选项,包括 Fivetran 、 Informatica 和 Airbyte 。 Airflow 也是一个非常流行的开源工具,用于规划、调度和监控 ELT 管道。一些即将推出的反向 ETL 工具包括 Hightouch 、 Hevo Data 和 Census 。
- 储存;储备
数据存储有几个派别,每个派别都有不同的目的。例如,数据湖存储非结构化数据,并以灵活的格式聚合所有可用数据。另一方面,数据仓库存储经过处理的结构化数据。数据库对处理过的或结构化的数据有类似的要求,可以基于本地、云中,甚至是托管服务。有几个工具如谷歌云平台、数据块、 SnowflakeDB 和 Azure cloud 提供有竞争力的存储设施。
这三种不同类型的数据存储设备的主要区别在于容量、交互频率和结构。简单的数据库存储结构化和过滤的数据,非常适合频繁的交互,而数据仓库是数据库的高级版本,针对跨多个接触点分析和存储大量结构化数据进行了优化。因为仓库依赖于转换和装载时间表,所以更新按照 ETL/ELT 的频率是滞后的。
最新的存储技术是数据湖库(Data Lakehouse ),它产生于存储种类繁多、数量巨大的非结构化数据的需求,这些数据不能立即被数据仓库或简单的数据库处理。随着数字系统和多个客户接触点生成的数据持续增长,data lakehouses 提供了管理丰富和高质量数据的解决方案,而无需丢失或处理这些数据。Data Lakehouse 不受格式限制且经济高效,是存储数据以供将来分析的理想而快速的方法。
数据处理
这是将原始数据转换为模型可以使用的有用数据的过程。原始输入被转换成数字、向量、嵌入等。供模特消费。
- 数据分析
数据分析(或探索性数据分析)是整个 ML 生命周期中最耗时的活动之一。用于分析的几个最流行的 python 库是 NumPy 和 pandas 。对于特定于大数据的用例, Apache spark 是高速查询和分析数据的绝佳工具。
商业智能工具构成了分析过程的末端,其中涉及利益相关者的交互以获得商业见解。 Tableau 和超集为报告生成提供了大量易于理解的可视化工具。
- 特征管理
在应对了管理大量原始数据、它们各自的特性和特性版本的挑战之后,特性存储成为热门话题就不足为奇了。特征存储跨机器学习解决方案存储、计算、管理和版本化特征,使得整个特征管道比手动管理更加可靠。 Iguazio 、 Tecton 、 Feast 和 Hopsworks 是提供特色商店解决方案的一些工具。
对于特征工程任务,诸如 pandas 和 NumPy 之类的分析工具服务得很好。一旦特性逻辑最终确定,就可以通过 ide(如 PyCharm 和 VS Code )对特性函数进行优化编写和打包。此活动的最终输出是一个数据清理管道,它可以处理静态和生产数据,后面是相关的特性函数。
数据版本和沿袭
出于同样的原因,数据版本控制和代码版本控制一样重要。考虑到数据是动态的且经常更新,除非仔细地进行版本控制,否则相同的过程不会对数据产生相同的结果。DVC 是一个开源工具,主要用于数据版本控制。它与语言无关,有助于构建可重复的数据管道。它集成了代码、数据、中间文件和存储工具,包括亚马逊 S3 、谷歌云和硬盘。
另一方面,数据沿袭是在整个 ML 管道中仔细映射数据旅程的过程。有了数据血统,用户可以从数据中形成一个故事,看到版本如何随着时间的推移而演变,并在每个数据接触点之间建立逻辑联系。 Pachyderm 提供数据版本和数据血统支持。它不仅支持分支、版本控制、提交和回购维护,还清晰地描绘了这些活动之间的关系。
数据监控
由于输入问题或手动错误,真实世界的数据有很多漏洞。如果错误的数据被允许传递到模型中,模型结果可能会产生误导。然而,保持大规模数据(比如数百万个数据点)的质量既费时又耗资源。自动监控是可以在有限的预算和时间内建立的最直接的 MLOps 实践。
像 Censius 这样的自动化监控工具密切检查质量问题,比如缺失值、不兼容的数据类型或数据异常。即使是概念模式,如数据漂移或不断变化的统计关系,也受到持续监控。还可以使用流量监视器来跟踪传入和传出的数据量。其他工具如提琴手和 Grafana 也有监控功能。
阶段 2:模型训练和评估
数据和建模阶段是交织在一起的,开发人员必须在它们之间进行调整以获得最佳结果。但是,一旦数据被彻底收集、存储、分析并转化为可用的特征,模型构建基本上就开始了。
模型的建立有很多方面,其中最主要的是算法的选择。然而,在将时间和资源完全投入到算法之前,考虑计算、环境和安全限制同样重要。
模型管理堆栈|作者图片
算法选择
有各种各样的机器学习库,像 TensorFlow 、 scikit-learn 、 MXNET 、 Keras 、 ONNX 、 PyTorch 等等。它们中的每一个都带有特定的 USP,并在定制、灵活性、速度、易于采用、社区支持等方面具有优势。一旦选择了库,就可以开始常规的模型构建活动(如选择和调优)来执行一系列实验。
集成驱动电子设备
IDE 或集成开发环境就像软件开发的画布。它允许集成代码、编译器、调试器、目录、代码预测器和其他一些对代码编写和软件开发至关重要的特性。PyCharm 是一个用于核心开发的 goto IDE,因为它使得导入、代码链接和文件管理变得非常容易操作和理解,因此即使在所有权变更之后,项目也经历了最小的中断。
VS 代号也是另一个热门选择。它几乎与操作系统无关,并支持与一些外部工具的集成,如 PyLint、Node.js 和 SQL。其他流行的 IDE 选择有 Jupyter 和 Spyder ,尤其是在实验阶段。MATLAB 主要用于学术领域,但也是支持整个应用程序代码的可行选择。
实验跟踪
机器学习不像软件开发那样简单。它涉及对数据、模型、特征组合甚至资源的多次实验,以找到达到最佳结果的优化路线。实验必须是可重复的,以便峰值结果可以被重新追踪并部署到生产中。
像 MLFlow 、 Neptune 和Weights&bias这样的工具支持实验跟踪和元数据记录,以建立和维护可追踪和可再现的实验,这些实验适合于快速分析和选择。另一个值得关注的独特工具是层,它有助于构建、跟踪和训练所有机器学习项目元数据。协作式 ML 对于扩大规模至关重要,这也是我们 Censius 选择与 Layer 合作,将协作式且易于监控的 ML 项目引入社区的原因。
性能赋值
为了分析性能,需要跨实验和数据段对结果进行比较和监控。由于涉及到多个实验和比较,因此监控工具如 Comet 、 Censius 和apparent AI会自动执行该过程,并在满足预先配置的条件时触发。
托管工具使数据科学家能够创建监视器,而无需编写任何代码或与工程团队协作。对标准和定制指标的支持也很关键,因为复杂的用例依赖于非常具体的定制指标。此外,将性能与其他检测到的问题(如模型漂移或数据质量差)相关联的能力非常适合根本原因检测。像 Censius 这样的工具可以帮助团队满足上述必备的需求以及一些有用的特性。
第 3 阶段:部署
部署阶段是解决方案和最终用户之间的直接连接器,使其成为 ML 生命周期中最重要的方面之一。这一阶段的重点是基础设施、环境和模型服务管道的一致性。
即使是微小的细节,如最新模型版本与生产环境之间的不兼容,也可能暗示着不久的将来会出现停机。自动化部署管道的很大一部分可以在大范围内处理这些微小的细节。
部署堆栈|作者图片
模型服务
模型服务是在本地、公共云或私有云上托管开发的机器学习解决方案的过程。模型服务阶段的主要目标是确保集成应用程序或最终用户可以轻松访问解决方案。
Cortex 、tensor flow Serving(tensor flow Extended 可用)、 Seldon 和 Torchserve 是一些模型服务工具,它们允许 API 管理和可伸缩性、多模型服务、轻松的云可访问性、协作和更多选项来简化生产。
资源虚拟化
资源虚拟化支持隔离的环境和实验,这些环境和实验构成了 ML 生命周期中易于管理的模型训练、模型选择和部署阶段的基础。它还优化了生产环境中的故障排除,为再现性和可扩展性铺平了道路。
- 虚拟机
虚拟机类似于容器,不同之处在于它允许虚拟化 ML 管道的所有层,包括硬件层,而容器只提供软件层。
当需要运行具有不同操作系统要求的多个应用程序时,虚拟机是理想的选择。虚拟机由几家供应商提供,包括行业领导者,如 VMware 、谷歌、甲骨文和 Azure 。
- 容器
集装箱化是隔离环境的行为,以保持清洁的实验,不损害或改变其他实验,并容易实现操作,如 A/B 测试。它使开发人员能够轻松地管理开发和部署活动,使过渡更加顺畅。容器非常容易运输,独立于平台,轻量级,并且易于管理。 Kubernetes 和 Docker 对于部署独立的微环境是有效的。自动化工具如 Kubeflow 和 Flyte 优化和管理运行在容器上的复杂工作流程。
容器通常比虚拟机更加便携和高效,因为它们可以利用主机操作系统,而不必每次都启动一个。由于在实际需求中更加灵活和经济,容器在大多数情况下已经超过了虚拟机。
测试
模型和基础设施测试通过在模型预测到达最终用户之前过滤掉次要问题和主要问题来确保高质量的客户体验。需要在各种环境和容器中进行测试。
测试工具通常应该与广泛的基础设施一起工作,无论是内部部署、云还是容器,并支持跨培训和生产环境的 A/B 测试和故障排除。各种测试支持的几个选项包括functionalize、app advance和 Seldon Core 。
模型监控
生产中的输入流带来原始数据,管道对这些数据进行处理,以提供预测作为输出。一旦事件被触发,通常在预测之后,就会记录另一个实际值的输入流。
监控工具确保不仅跟踪原始数据和模型输出,而且跟踪实际值,以检测任何不自然的行为。生产中的监控需要彻底,包括数据质量、模型漂移、偏差、流量和性能监控。其中每一项都可以通过几个指标进行评估,这些指标由自动化监控工具跟踪,如 Censius 、 Fiddler 和亚马逊 SageMaker 以及人工智能可观察性工具,如 Censius 。
监控只是解决人工智能问题的开始。要解决触发显示器的问题,详细解释导致该问题的原因至关重要。重要的是用模型可观察性扩展模型监控,因为它提供了每个模型决策的完整剖析。这样,根本原因很容易被识别并迅速修复,使开发者能够大规模地构建可解释的和负责任的人工智能。
最后一个音符
随着人工智能从业者测试和汲取现代人工智能堆栈的好处,更多的工具正在出现以满足需求。虽然有太多的工具可供选择来构建整体的人工智能堆栈,但您需要检查三个要点:
- 对该工具的投资是否远低于从头构建其功能的成本?
- 该工具是否易于采用和使用,是否有可靠的客户支持?
- 该工具的可定制性是否足以满足基本需求之外的附加功能?
一旦你勾掉了主要条件,其他因素如易用性、平台、与基础设施无关的设置、无代码或低代码能力等。可以被照顾。
人工智能堆栈可能会势不可挡,尤其是对那些刚刚开始这一旅程的人来说。诀窍是通过自动化和声明性方法来接近第一个具有成本效益且可大规模实现的垫脚石。
取得联系!
如果你想了解更多关于 MLOps 和可靠的 AI 框架,请参考我们的资源(博客、电子书、白皮书)。如果您有任何问题或想了解更多信息,欢迎发送电子邮件至 hello@censius.ai 或在此分享您的评论。
使用 Sklearn、Pandas 和 Numpy 进行时间序列预测的完整指南
在 Python 中使用任何 scikit-learn 模型进行时间序列预测的实践教程和框架
介绍
时间序列预测有很多所谓的传统模型,比如 SARIMAX 系列模型、指数平滑,或者 BATS 和 TBATS 。
然而,我们很少提到最常见的回归机器学习模型,如决策树,随机森林,梯度推进,甚至支持向量回归机。我们看到这些模型广泛应用于典型的回归问题,但不是时间序列预测。
因此写这篇文章的原因!在这里,我们设计了一个框架,将一个时间序列问题框定为一个监督学习问题,允许我们从我们最喜欢的库中使用任何我们想要的模型: scikit-learn !
到本文结束时,您将拥有将任何机器学习模型与上述统计模型一起应用于时间序列预测的工具和知识。
我们开始吧!
完整的源代码可以在 GitHub 上获得。
用我的 免费时间序列小抄 在 Python 中学习最新的时间序列分析技巧!获得统计和深度学习技术的实现,全部在 Python 和 TensorFlow 中!
准备数据集
首先,我们导入完成教程所需的所有库。
import numpy as np
import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt
这里,我们使用 statsmodels 库来导入数据集,这是从 1958 年到 2001 年的每周 CO2 浓度。
data = sm.datasets.co2.load_pandas().data
一个好的第一步是用下面的代码块可视化我们的数据。
fig, ax = plt.subplots(figsize=(16, 11))ax.plot(data['co2'])
ax.set_xlabel('Time')
ax.set_ylabel('CO2 concentration (ppmw)')fig.autofmt_xdate()
plt.tight_layout()
1958 年至 2001 年的周 CO2 浓度(ppmv)。我们注意到,由于季节的原因,数据中存在明显的年度季节性(冬季的 CO2 浓度高于夏季)。还有一个明显的积极趋势,我们注意到数据集开始时有一些缺失的数据。图片由作者提供。
从上图中,我们注意到数据中明显的积极趋势,因为浓度随着时间的推移而增加。我们还观察到一种年度季节性模式。这是由于季节的变化,冬季的 CO2 浓度高于夏季。最后,我们在数据集的开头看到一些缺失的数据。
然后,让我们用插值法处理缺失的数据。我们将简单地在两个已知点之间进行线性插值来填充缺失值。
data = data.interpolate()
既然我们没有丢失数据,我们就可以开始建模了!
使用 scikit 建模-学习
正如您将看到的,用 scikit-learn 预测时间序列的最大挑战是正确设置问题。
有 3 种不同的方法可以将时间序列预测问题构建为监督学习问题:
- 使用之前的观察预测下一个时间步
- 使用一系列过去的观察结果预测下一个时间步
- 使用一系列过去的观测值预测一系列未来的时间步长
让我们详细探讨每种情况!
使用之前的观察预测下一个时间步
这是最基本的设置。该模型输出下一个时间步长的预测,仅给出前一个观察值,如下图所示。
根据前面的观察,模型被训练来预测下一个时间步。图片由作者提供。
这是一个几乎没有实际应用的简单用例,因为一个模型很可能不会仅仅从之前的观察中学到任何东西。然而,它可以作为一个很好的起点,帮助我们理解后面更复杂的场景。
现在,我们的数据集看起来像这样:
作者图片
这不是很有用。没错,所有的值都在一列中,但是我们需要格式化数据集,使得当前观察值是预测下一个观察值(目标)的特征。
因此,我们添加了第二列,该列简单地移动了 co2 列,使得 1958–03–29 的值现在是 1958–04–05 的值的预测值。
df = data.copy()df['y'] = df['co2'].shift(-1)
数据集没有被格式化为监督学习问题,其中当前观察是特征,下一个观察是目标。图片由作者提供。
正如您所看到的,我们的数据集现在已经格式化,因此每个当前观察都是下一个观察的预测值!请注意,我们的数据集末尾缺少一个值。这对于最后已知的观察来说是正常的。我们将在以后的步骤中删除该行。
现在,让我们将数据集分成训练集和测试集,以便运行我们的模型并对它们进行评估。这里,我们使用最近两年的数据作为训练集。由于我们有每周数据,并且一年有 52 周,这意味着最后 104 个样本被保留用于测试集。
train = df[:-104]
test = df[-104:]
test = test.drop(test.tail(1).index) # Drop last row
基线模型
当然,我们需要一个基线模型来确定使用机器学习模型是否更好。这里,我们天真地预测下一个观察值将与当前观察值相同。
换句话说,我们简单地将 co2 列设定为我们的基线预测。
test = test.copy()
test['baseline_pred'] = test['co2']
基线预测只是简单地重复未来已知的观察。图片由作者提供。
太好了!完成这一步后,让我们继续更复杂的模型。
决策树
这里,让我们应用一个决策树回归器。这个模型可以被 scikit-learn 库中您想要的任何模型替换!请注意,我们使用随机状态来确保可重复性。
from sklearn.tree import DecisionTreeRegressorX_train = train['co2'].values.reshape(-1,1)
y_train = train['y'].values.reshape(-1,1)
X_test = test['co2'].values.reshape(-1,1)# Initialize the model
dt_reg = DecisionTreeRegressor(random_state=42)# Fit the model
dt_reg.fit(X=X_train, y=y_train)# Make predictions
dt_pred = dt_reg.predict(X_test)# Assign predictions to a new column in test
test['dt_pred'] = dt_pred
测试集现在有来自决策树模型的预测!图片由作者提供。
注意,我们保持建模部分简单。我们不执行任何交叉验证或超参数调整,尽管这些技术可以正常应用于此,就像在任何其他回归问题中一样。
随意运用这些技巧,看看你是否能得到更好的表现。
梯度增强
为了尝试不同的模型,让我们现在应用梯度推进。
from sklearn.ensemble import GradientBoostingRegressorgbr = GradientBoostingRegressor(random_state=42)gbr.fit(X_train, y=y_train.ravel())gbr_pred = gbr.predict(X_test)test['gbr_pred'] = gbr_pred
测试集现在具有来自梯度推进模型的预测。图片由作者提供。
太好了!我们现在有了来自两个机器学习模型和一个基线的预测。是时候评估每种方法的性能了。
评估
这里,我们使用平均绝对百分比误差(MAPE)。这是一个特别有用误差指标,因为它返回一个百分比,很容易解释。确保只在没有接近 0 的值时应用它,这里就是这种情况。
不幸的是,MAPE 还没有在 scikit-learn 中实现,所以我们必须手工定义这个函数。
def mape(y_true, y_pred):
return round(np.mean(np.abs((y_true - y_pred) / y_true)) * 100, 2)
然后,我们可以评估每个模型,并生成以下条形图:
baseline_mape = mape(test['y'], test['baseline_pred'])
dt_mape = mape(test['y'], test['dt_pred'])
gbr_mape = mape(test['co2'], test['gbr_pred'])# Generate bar plot
fig, ax = plt.subplots(figsize=(7, 5))x = ['Baseline', 'Decision Tree', 'Gradient Boosting']
y = [baseline_mape, dt_mape, gbr_mape]ax.bar(x, y, width=0.4)
ax.set_xlabel('Regressor models')
ax.set_ylabel('MAPE (%)')
ax.set_ylim(0, 0.3)for index, value in enumerate(y):
plt.text(x=index, y=value + 0.02, s=str(value), ha='center')
plt.tight_layout()
每种预测方法的 MAPE。这里,基线提供了最佳性能,因为它具有最低的 MAPE。图片由作者提供。
看上面的图,我们看到基线具有最好的性能,因为它具有最低的 MAPE。这是有道理的,因为二氧化碳浓度似乎不会从一周到另一周发生剧烈变化。
在这种情况下,使用机器学习模型并没有给我们带来任何附加值。同样,这可能是因为模型仅从一个观察中学习来做出预测。最好给它一个序列作为输入,以便预测下一个时间步。
这就把我们带到了下一个场景!
使用一系列过去的观察结果预测下一个时间步
正如我们在前面的例子中所看到的,使用单个观察值来预测下一个时间步并不是很好。现在,让我们尝试使用一个序列作为模型的输入,并预测下一个时间步,如下所示
采用输入序列预测下一时间步的模型的模式。图片由作者提供。
同样,我们必须格式化我们的数据集,以便我们有一系列过去的观察值作为下一个时间步的预测值。
我们可以很容易地编写一个函数,通过添加移位的列来获得所需的输入长度。
def window_input(window_length: int, data: pd.DataFrame) -> pd.DataFrame:
df = data.copy()
i = 1
while i < window_length:
df[f'x_{i}'] = df['co2'].shift(-i)
i = i + 1
if i == window_length:
df['y'] = df['co2'].shift(-i)
# Drop rows where there is a NaN
df = df.dropna(axis=0)
return df
让我们使用这个函数输入 5 个观测值,以便预测下一个时间步。
new_df = window_input(5, data)
结果数据集。如你所见,我们现在有 5 个观测值作为下一个时间步的预测值。图片由作者提供。
查看上图,我们可以看到我们的数据集以这样的方式排列,我们有五个观察值来预测下一个时间步,存储在 y 列中。
这基本上解决了最难的部分!现在,简单的问题是应用不同的模型,看看哪个表现最好。
在进入这一步之前,让我们首先将数据分为训练集和测试集。
from sklearn.model_selection import train_test_split
X = new_df[['co2', 'x_1', 'x_2', 'x_3', 'x_4']].values
y = new_df['y'].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, shuffle=False)
基线模型
同样,让我们为这种情况定义一个基线模型。这里,我们将简单地预测输入序列的平均值
baseline_pred = []
for row in X_test:
baseline_pred.append(np.mean(row))
决策树
同样,让我们应用决策树回归器。这与前面的实现一样简单。
dt_reg_5 = DecisionTreeRegressor(random_state=42)
dt_reg_5.fit(X_train, y_train)
dt_reg_5_pred = dt_reg_5.predict(X_test)
梯度增强
为了保持一致,我们也来试试梯度提升。
gbr_5 = GradientBoostingRegressor(random_state=42)
gbr_5.fit(X_train, y_train.ravel())
gbr_5_pred = gbr_5.predict(X_test)
评估
我们现在可以评估每个模型的性能。同样,我们使用 MAPE 并将结果绘制在柱状图中。这基本上是和以前一样的代码。
baseline_mape = mape(y_test, baseline_pred)
dt_5_mape = mape(y_test, dt_reg_5_pred)
gbr_5_mape = mape(y_test, gbr_5_pred)# Generate the bar plotfig, ax = plt.subplots()
x = ['Baseline', 'Decision Tree', 'Gradient Boosting']
y = [baseline_mape, dt_5_mape, gbr_5_mape]
ax.bar(x, y, width=0.4)
ax.set_xlabel('Regressor models')
ax.set_ylabel('MAPE (%)')
ax.set_ylim(0, 2.5)
for index, value in enumerate(y):
plt.text(x=index, y=value + 0.1, s=str(value), ha='center')
plt.tight_layout()
MAPE 针对不同的预测方法使用五个观测值来预测下一个时间步。同样,机器学习模型并没有超越基线。图片由作者提供。
令人惊讶的是,从上图中,我们看到机器学习模型并没有超越基线。
虽然超参数调整可能会提高 ML 模型的性能,但我怀疑输入窗口太短。五周的输入不足以让模型获得趋势和季节性成分,因此我们可能需要更长的时间窗口。
我们将在下一个场景中尝试这样做!
使用一系列过去的观测值预测一系列未来的时间步长
最后一个场景是使用一系列观察值来预测一系列未来的时间步长,如下所示。
采用输入序列并预测未来时间步长序列的模型架构。图片由作者提供。
这里,我们的模型需要输出一系列预测。这可以看作是一个多输出回归问题。
因此,第一步是适当地格式化我们的数据集。我们开发了另一个函数,它使用 shift 方法将数据集格式化为多输出回归问题。
def window_input_output(input_length: int, output_length: int, data: pd.DataFrame) -> pd.DataFrame:
df = data.copy()
i = 1
while i < input_length:
df[f'x_{i}'] = df['co2'].shift(-i)
i = i + 1
j = 0
while j < output_length:
df[f'y_{j}'] = df['co2'].shift(-output_length-j)
j = j + 1
df = df.dropna(axis=0)
return df
这里,我们将使用 26 个观测值的序列来预测接下来的 26 个时间步。换句话说,我们输入半年来预测下半年。注意,输入和输出序列不需要具有相同的长度。这是我的一个武断的决定。
seq_df = window_input_output(26, 26, data)
数据集未格式化,因此 26 个观察值是接下来 26 个时间步的预测值。图片由作者提供。
如您所见,我们现在有一个数据集,其中 26 个观测值用作接下来 26 个时间步长的预测值。
在继续建模之前,我们再次将数据分为训练集和测试集。这里,我们为测试集保留最后两行,因为它给了我们 52 个测试样本。
X_cols = [col for col in seq_df.columns if col.startswith('x')]
X_cols.insert(0, 'co2')
y_cols = [col for col in seq_df.columns if col.startswith('y')]X_train = seq_df[X_cols][:-2].values
y_train = seq_df[y_cols][:-2].values
X_test = seq_df[X_cols][-2:].values
y_test = seq_df[y_cols][-2:].values
基线模型
作为基线模型,我们将简单地重复输入序列。换句话说,我们获取输入序列并输出与基线预测相同的序列。
这是一个非常琐碎的预测,所以我们将在准备评估模型时实现它。
决策树
同样,让我们尝试应用决策树。注意,决策树可以产生多输出预测,所以我们不需要在这里做任何额外的工作。
dt_seq = DecisionTreeRegressor(random_state=42)
dt_seq.fit(X_train, y_train)
dt_seq_preds = dt_seq.predict(X_test)
梯度推进
现在,梯度推进需要一点额外的工作。它不能处理多输出目标。试图立即拟合梯度增强模型将导致错误。
在这里,我们必须包装模型,以便它的预测被用作下一个预测的输入。这是通过使用来自 scikit-learn 的回归链包装器实现的。
from sklearn.multioutput import RegressorChain
gbr_seq = GradientBoostingRegressor(random_state=42)
chained_gbr = RegressorChain(gbr_seq)
chained_gbr.fit(X_train, y_train)
gbr_seq_preds = chained_gbr.predict(X_test)
这允许训练模型并进行预测,而不会遇到任何错误。正如我提到的,在幕后,模型预测下一个时间步,并使用该预测进行下一次预测。这种方法的缺点是,如果第一个预测是坏的,那么序列的其余部分很可能也是坏的。
现在我们来评价一下每一款。
评估
同样,我们使用 MAPE 来评估我们的预测方法。
mape_dt_seq = mape(dt_seq_preds.reshape(1, -1), y_test.reshape(1, -1))
mape_gbr_seq = mape(gbr_seq_preds.reshape(1, -1), y_test.reshape(1, -1))
mape_baseline = mape(X_test.reshape(1, -1), y_test.reshape(1, -1))# Generate the bar plotfig, ax = plt.subplots()
x = ['Baseline', 'Decision Tree', 'Gradient Boosting']
y = [mape_baseline, mape_dt_seq, mape_gbr_seq]
ax.bar(x, y, width=0.4)
ax.set_xlabel('Regressor models')
ax.set_ylabel('MAPE (%)')
ax.set_ylim(0, 1)
for index, value in enumerate(y):
plt.text(x=index, y=value + 0.05, s=str(value), ha='center')
plt.tight_layout()
所有多输出回归模型的 MAPE。这里,ML 模型优于基线,决策树是最好的模型。图片由作者提供。
从上图可以看出,我们终于成功训练出了跑赢基线的 ML 模型!在这里,决策树模型是冠军模型,因为它实现了最低的 MAPE。
我们可以选择将去年的预测可视化。
fig, ax = plt.subplots(figsize=(16, 11))ax.plot(np.arange(0, 26, 1), X_test[1], 'b-', label='input')
ax.plot(np.arange(26, 52, 1), y_test[1], marker='.', color='blue', label='Actual')
ax.plot(np.arange(26, 52, 1), X_test[1], marker='o', color='red', label='Baseline')
ax.plot(np.arange(26, 52, 1), dt_seq_preds[1], marker='^', color='green', label='Decision Tree')
ax.plot(np.arange(26, 52, 1), gbr_seq_preds[1], marker='P', color='black', label='Gradient Boosting')ax.set_xlabel('Timesteps')
ax.set_ylabel('CO2 concentration (ppmv)')plt.xticks(np.arange(1, 104, 52), np.arange(2000, 2002, 1))
plt.legend(loc=2)fig.autofmt_xdate()
plt.tight_layout()
可视化去年每个模型的预测。显然,基线偏离得很远,而决策树和梯度推进更接近实际值。图片由作者提供。
进一步支持 MAPE,我们可以看到决策树和梯度推进比基线预测更接近实际值。
在本文中,我们看到了如何将时间序列预测问题构建为一个回归问题,可以使用 scikit-learn 回归模型来解决该问题。
我们探讨了以下场景:
- 使用之前的观察预测下一个时间步
- 使用一系列过去的观察结果预测下一个时间步
- 使用一系列过去的观测值预测一系列未来的时间步长
我们现在有了一个框架,可以将任何时间序列预测问题构建为一个监督学习问题,在这个框架中,您可以应用来自 scikit-learn 的任何回归模型。
我希望这篇文章对你有用!
一定要下载我用 Python 写的免费时间序列预测小抄,涵盖统计和深度学习模型!
干杯!🍺
毫无经验的数据分析师的完整路线图
该路线图将指导您通过业余学习成为一名数据分析师
伊森·道在 Unsplash 上拍摄的照片
伟大的辞职是离开你不成功的职业去成为一名数据分析师的最佳时机。
从未有过如此大规模的人员外流,他们寻找更好的机会,包括提升空间、灵活的工作条件、办公室的尊重和公平的工资。
如此多的人在寻找一个新的开始,难怪他们中的许多人都在期待诱人的技术世界提供他们需要的改变。数据科学、分析和工程仍然是那些希望改变职业的人在最抢手的工作。
虽然你可能认为上面提到的三个学科是相同的,但它们在资格和工作职责上有很大的不同。对于那些希望快速转换到不同领域而不必花费数年时间学习的人来说,成为数据分析师可能是正确的选择。
数据分析师天生具有使用数据讲述故事的能力。他们利用现有的数据,使用 SQL、Excel 等工具和 Tableau 等数据可视化工具生成可视化和报告,用外行人的语言描述数据的当前状况。工作职责包括确定业务问题,使用 SQL 从数据库中提取数据,使用 Excel 和可视化工具进行分析和生成可视化结果,以及开发向利益相关方展示分析结果的报告。根据工作的不同,可能还需要 R 或 Python 的简单编码技能,算术、代数、统计和概率的简单数学技能是标准的。
随着数据分析师职位在新的挑战之间游走,而不必在学校度过几年,对于那些想改变职业的人来说,这是显而易见的。
路线图
背景
大多数以数据为中心的职位或职业变化的路线图通常是如此广泛,以至于需要几年的全职研究才能完成。普通员工需要 11 个月的时间来规划职业变化,这使得大多数路线图与人们的需求脱节。此外,外部因素,如储蓄金额和人生承诺,可能会使大多数人无法在可行的时间内完成职业转换,导致许多人留在原来的工作岗位上。考虑到所有这些因素,该路线图将成为数据分析师的过程微调为七个短阶段,可以根据需要或快或慢地完成。
记住,要想改变职业,你只需要知道足够多的信息就能找到工作。一旦你满足了基本要求并能完成日常任务,就可以在工作中进行深入学习。
以下七个阶段应该大致按照这个顺序进行。在这些部分中,您将找到相关的在线课程来帮助您入门,以及每个阶段需要关注的关键事项。
阶段 1:编程— Excel、SQL、Python/R
数据分析师的编程要求可能会因领域和职位的不同而有很大差异。然而,大多数数据分析师职位都可以通过 Excel、SQL 和一些简单的 Python 或 r 知识来完成。
虽然 Excel 可能看起来很老派,但它仍然是一个经常使用的非常有价值的工具,易于学习,并能快速生成解释数据当前状态的结果。Excel 主要用于分析数据以确定总结和趋势。SQL 用于从数据库中检索用于分析的数据,然后可以使用 Excel 或编程语言对这些数据进行处理。Python 和 R 本质上是两种常用的数据分析编程语言,Python 比 R 更受欢迎,因为它易于使用。
学习编程技能可以上的在线课程:
下面是一些课程,可以用来快速学习数据分析所需的编程基础。这绝不是学习如何编码的一个广泛的列表或者唯一的资源,但是这些资源提供了一个很好的起点。请记住,这是一个路线图,让您获得履行数据分析师职位和执行日常任务所需的基本技能,因此,编程知识的广度是这里的目标,而不是深度。同样重要的是要注意,大多数数据分析师在 Python 或 R 之间进行选择,并把它作为他们的主要编程语言。根据你的目标行业中最常用的方法来做决定。
阶段目标结束:
在这个阶段结束时,您应该能够编写在您选择的目标语言中运行的代码。除了进行分析所必需的部分,对每种语言的广泛了解是不必要的。
值得注意的是,编程是一项最好通过实践来学习的任务。你可以坐着看这些视频,并声称在视频结束时知道如何编码,但看和做之间有明显的区别。因此,建议先看视频,然后练习编写自己的代码,看看是否还能运行。编写代码的进一步练习将在后面的阶段进行。
第二阶段:数学——算术、代数、统计和概率
如果你完成了高中/中学,或者大学课程的前几年,你通常会学到成为数据分析师所需的所有数学知识(取决于领域和职位)。很酷,对吧?与数据科学不同,数据科学需要对线性代数、微积分以及可能需要数年才能掌握的其他数学学科有深刻的理解,大多数数据分析师职位只需要你在早期教育中学习的基础数学。
因此,这个阶段应该仅仅是对你已经学过的知识的回顾,并且有可能打破你的统计和概率知识的蜘蛛网。下面的课程来自可汗学院,这是一个通过简单易懂的课程来学习数学的好地方,这些课程用简单的术语为任何水平的人解释概念。
你可以用来更新数学技能的资源:
https://www.khanacademy.org/math/algebra https://www.khanacademy.org/math/algebra2 https://www.khanacademy.org/math/ap-statistics
阶段目标结束:
在这一阶段结束时,您应该能够进行简单的计算,这些计算可用于深入了解数据。例如,您应该能够计算工资的平均值,以确定一家公司支付给员工的平均工资。或者,您需要能够在订阅网站时事通讯的人群中确定谁是离群者。或者,您需要能够计算数据集中的未知值,该数据旨在确定麻雀的速度,但只给出它们飞行的距离和时间。
在这一阶段发展的数学技能将在以后的阶段得到练习和提高。
阶段 3:数据分析—收集、清理、分析
数据分析是数据分析师的主要工作。
数据分析可以分解为五个步骤被普遍认可。
- 确定驱动问题: 认识到数据分析的驱动问题或总体目标有助于为您需要什么数据以及分析结果应该揭示什么奠定基础。
- 数据收集: 定义回答驾驶问题所需的数据将有助于您收集工作所需的正确数据。归根结底,有更多的数据来清晰地描述你在寻找什么,总比数据太少好。
- 数据清洗: 是时候通过数据清洗过程,把你收集到的原始数据变成你可以分析的东西了。这包括修改或删除不正确或不相关的数据,检查数据完整性,删除重复数据,或生成重要的值,如平均值。
- 数据分析: 分析你已经清理过的数据涉及到寻找数据内部的洞见,包括模式、关系以及预测的可能性。
- 解释: 这个阶段涉及到产生你的数据分析结果的可视化。这些可视化将讲述数据的故事,并以一种易于理解和直截了当的方式回答问题。
帮助你学习数据分析流程的资源:
阶段目标结束:
在此阶段结束时,您应该能够使用之前学习的编程和数学技能,按照上面列出的步骤进行全面的数据分析。在这些阶段不需要完全流利,因为稍后会有一个阶段,在这个阶段将创建投资组合项目,这将提高在这里学到的技能。
阶段 4:数据可视化
虽然数据可视化是作为数据分析的五个步骤的一部分讲授的,但它在这里有自己的特殊阶段,因为它在数据分析师的日常任务中扮演着如此重要的角色。能够创建引人注目的、准确的可视化是这个职业的基础之一,因此应该特别注意这些技能。
Tableau 是数据分析师创建可视化最常用的工具之一,学习它的资源将在下面介绍。其他数据可视化工具包括 QlikView、Microsoft Power BI、Datawrapper、Plotly 以及更多可能与您的目标领域或职位相关的工具。这份路线图将关注其中最突出的一个场景。
帮助您开始 Tableau 的资源:
阶段目标结束:
在此阶段结束时,您应该能够创建准确表示数据分析结果的数据可视化。这些可视化必须引人注目,易于理解,并且必须提供结果的清晰图片,而不会在视觉上扭曲信息。
第五阶段:行业知识
行业知识是您将用于解决日常问题的行业专用工具。
例如,如果你要对每年应该砍伐多少树木以确保森林健康生长进行数据分析,那么林业实践和森林管理的背景就很重要。或者,你需要有商业头脑,能够根据你的分析结果判断一家公司是否陷入财务困境。此外,如果你是一家医院的分析师,该医院正在寻找最有效的方法来安排员工在繁忙时段的工作,那么了解每个人在医院中扮演的重要角色是很重要的。
本质上,你有进行数据分析的技能,但现在你需要获得技能和知识,以便能够将它们应用于特定的行业。无论你是进入一个完全不同的行业,还是想回到当前的行业做一名分析师,重温行业知识都不会有坏处。作为一名分析师,研究最新信息有助于你保持相关性,能够识别趋势、观察模式,并提高周围人的效率和效力。
获取行业知识可以通过阅读期刊文章、参加大学讲座、听播客、阅读时事通讯、与业内人士交谈等等。
阶段目标结束:
在这个阶段结束时,你希望能够进行相关的分析,并对你的目标行业的问题提供有见地的结论。对于那些希望从事商业工作的人来说,这意味着进行分析,以确定公司决策的成本效益结构。对于那些希望从事科学工作的人来说,这意味着能够从大量证据中传播结论,这些证据可能支持也可能不支持某个假设。对于那些希望在医疗保健行业工作的人来说,这意味着能够进行分析,深入了解保持员工快乐所需的工作条件。关键在于,你需要能够自如地分析特定行业的数据,并能够为你试图解决的问题提供结论。
阶段 6:投资组合
建立你的个人投资组合是这个路线图中有趣的部分。
在这里,你有机会建立个人数据分析项目,展示你的技能,并向雇主证明他们希望你加入他们的团队。这些项目应该包括你到目前为止学到的所有技能,并且应该与你的目标行业相关。这意味着他们使用行业的工具,得出有意义的结论,甚至可能增加行业的知识库。
这些项目可以是独一无二的,可以是从互联网上看到的灵感,或者可以包括为你所在地区的一家小公司做的公益工作。快速浏览互联网可以给你一些想法和数据集,你可以用它们来创建你自己的项目。
帮助您开始构建数据分析组合的资源:
https://careerfoundry.com/en/blog/data-analytics/data-analytics-portfolio-project-ideas/
阶段目标结束:
在这个阶段结束时,你应该有一个充满数据分析项目的投资组合,可以与潜在的雇主分享。这个作品集不仅要展示你的技能,还要展示你最好的作品。投资组合是雇主了解你能为他们公司做什么的好工具,也能在面试中提供有益的话题。不仅如此,投资组合给你机会把你所有的技能放在一起,产生出成果的项目。
阶段 7:网络、工作申请和技术面试准备
路线图的最后一个阶段是网络、工作申请和技术面试准备。
你有技术。
你已经建立了你的投资组合。
现在你只需要把这一切联系在一起,得到那份工作!
人际关系网将包括参加会议和行业活动,与招聘人员交谈,与目前可能会为你说好话的分析师交往。虽然没有人喜欢人际关系网,但这是在没有工作经验的情况下,在这个行业找到工作最可靠的方法之一。如果招聘人员或招聘经理能亲自见你,他们很有可能会凭你的态度雇用你,然后再教你其他的。
接下来是工作申请,然后是准备技术面试。虽然这两个方面超出了本文的范围,但是下面列出了一些资源,可以帮助您朝着正确的方向开始。从这两方面来说,最好做好充分的准备,这样在这一天,你可以放松并享受这一经历。工作申请和技术面试是找到更多关于职位信息的好方法,你缺少什么技能,你应该准备好回答什么类型的技术面试问题。虽然乏味,这个阶段是一个很好的学习经历,将进一步巩固你已经学到的一切。
让你为社交、求职和技术面试做好准备的资源:
https://www.anaconda.com/blog/networking-in-tech-find-your-dream-data-science-job https://www.indeed.com/career-advice/finding-a-job/completing-job-application-to-get-an-interview https://www.simplilearn.com/tutorials/data-analytics-tutorial/data-analyst-interview-questions https://www.hackerrank.com/interview/preparation-kits
阶段目标结束:
在这个阶段结束时,你应该会有一份数据分析师的新工作!
你所有的努力都应该得到回报,隧道尽头的光芒应该会闪耀。
重要的是要记住,当试图进入一个你从未做过的新角色时,不得不经历许多不同公司的几次面试是正常的。诀窍是不管结果如何都要继续前进,并试着从每一次经历中学到你能学到的东西。在不到一年的时间里获得数据分析师工作的人和没有获得的人之间的区别在于,成功的人无论遭受多少次拒绝,都会继续努力。在一天结束时,你知道你有能力成为一名数据分析师,你只需要找到适合你的公司。
最后的想法
在一个你以前没有经验的新领域进行职业转变是一项令人印象深刻的努力。
虽然这无疑看起来令人生畏,但成为数据分析师的路线图比大多数人更容易管理。不用担心抽象的数学、难以理解的编程以及机器学习和人工智能等困难的概念,你可以立即成为一个讲故事的人和公司决策过程中的关键人物。
如前所述,这绝不是您成为数据分析师可以使用的资源的完整列表。这个路线图的目标是提供一个基本的方法,可以在短时间内通过兼职学习完成,以促进快速的职业转变。有些人可能需要更多的资源和时间,而有些人则需要较少的资源和时间。然而,通过遵循这个路线图,您可以开始形成成为数据分析师的道路。
订阅将我的故事直接发送到您的收件箱:故事订阅
成为会员,使用我的推荐链接可以无限制地访问媒体(我将收取少量佣金,不需要你额外付费):媒体会员
变形金刚的概念和训练变形金刚模型
变压器网络如何工作的逐步指南
什么是自然语言处理
自然语言处理是人工智能的一个分支,致力于赋予机器理解人类语言的能力。它使机器有可能阅读文本,理解语法结构,并解释句子中使用的单词的上下文含义。它在机器翻译中用于从一种语言翻译到另一种语言,常用的 NLP 翻译器是 Google Translate 。谷歌翻译可用于将文档和网站从一种语言翻译成另一种语言,支持 133 种不同的语言。OpenAI GPT-3 是创建的最先进的自然语言处理模型之一,它执行各种各样的语言任务,如文本生成,问答和文本摘要。情感分析是自然语言处理的一个重要分支,组织使用它来分析产品评论,以区分正面和负面评论。文本生成是自然语言处理的一个有趣的领域,它被用在手机的自动完成功能中,用于适当的单词建议,以及完成我们的句子。
NLP 有不同的分支,我将解释其中的一些。
- 情感分析:对文本进行分析,将文本的情感分为正面或负面。
- 文本生成:是文本的生成,在文本生成中我们提供文字提示,NLP 模型自动补全句子。
- 文本摘要:是利用 NLP 技术将长句归纳为短句。
- 语言翻译:使用自然语言模型将文本从一种语言翻译成另一种语言,例如将英语句子翻译成法语句子。
- 屏蔽语言建模:利用 NLP 模型对句子中的屏蔽词进行预测。
什么是变压器网络
Transformer 是一种神经网络架构,旨在解决自然语言处理任务。变压器网络使用一种称为注意力机制的机制来研究、理解句子中使用的单词的上下文,并从中提取有用的信息。《变形金刚》在流行论文 中被介绍由Ashish Vaswani 等人。
变压器网络的类型
我们有三种主要类型的变压器网络,即编码器、解码器和序列 2 序列变压器网络。
编码器变压器网络:这是一个双向变压器网络,它接收文本,为句子中的每个单词生成一个特征向量表示。编码器使用自我注意机制来理解句子中使用的单词的上下文,并从单词中提取有用的信息。
编码器如何能够理解这个简单的句子“编码是惊人的”的图示。
作者图片
- *图分解:编码器利用自我注意机制为句子中的每个单词生成一个特征向量或数字表示。单词“*”被分配一个特征向量 1,单词“ 被分配一个特征向量 2,单词“”被分配一个特征向量 3。单词" 是 “的特征向量既代表了单词” 是 “的上下文,又代表了其两侧单词的特征向量信息,即” 编码 “和” 惊人的 ",因此得名双向网络,因为它研究的是左右两侧单词的上下文。特征向量用于研究单词之间存在的关系,以理解所用单词的上下文,并解释句子的意思。想象一下,这是一个情感分析任务,我们要对这个句子的情感是积极的还是消极的进行分类。通过研究每个单词的上下文以及它与每个单词的关系,网络已经能够理解这个句子,因此将这个句子分类为肯定的。它是正面的,因为我们描述的是“ 编码 ”而我们用来描述它的形容词是“ 惊艳 ”。
编码器网络用于解决分类问题,如掩蔽语言建模以预测句子中的掩蔽词,以及情感分析以预测句子中的正面和负面情感。常见的编码器变压器网络有 BERT、ALBERT 和 DistilBERT。
解码器变压器网络或自回归模型。它使用掩蔽注意机制来理解句子中的上下文以生成单词。
作者图片
- 想象一个简单的场景,我们在包含各种电影信息的文本语料库上训练解码器网络,以生成关于电影的句子或自动完成句子。我们将这个不完整的句子“ 【漫威复仇者联盟残局】 传入解码器模型,我们希望模型预测合适的单词来完成这个句子。解码器是一个单向网络,它为每个单词生成特征向量表示。它与编码器网络的区别在于它是单向的,而不是编码器的双向特性。解码器从单个上下文(右或左上下文)研究单词表示。在这种情况下,它会研究左边单词的上下文来生成下一个单词。它生成下一个单词“ 是 ”,基于前面的单词,在“ 之后是 ”它生成下一个单词“ 超级英雄 ”,在“ 之后是 ”它生成下一个单词**【a】,*** 最后它生成下一个单词 【电影 因此完整的句子是“ 《漫威复仇者联盟》残局是一部超级英雄电影” 。我们可以观察它如何根据前面的单词生成单词,因此单词是自回归的,它必须向后看以研究单词的上下文,并从前面的单词中提取信息以生成后面的单词。自回归网络的例子有 GPT-3 和 CTLR。*
***编码器-解码器或 sequence 2 序列变换器网络:*它是编码器和解码器变换器网络的组合。它用于更复杂的自然语言任务,如翻译和文本摘要。
***编码器-解码器网络翻译图解:*利用编码器网络对句子中的单词进行编码,生成单词的特征向量,理解上下文,从单词中提取有用的信息。来自编码器网络的输出被传递到解码器网络。解码器网络处理编码器生成的输出,并生成目标语言的适当单词,例如,我们将一个英语句子传递给编码器,它从英语上下文中提取有用的信息,并将其传递给解码器,解码器解码编码器输出,并生成法语句子。
标记化概念
***单词标记化:就是把一个句子转换成单个单词。*它通常会生成很大的词汇量,这对于训练 NLP 模型来说并不理想。
词汇量:是指一篇课文的字数。
*text = "Python is my favourite programming language"print(text.split())##Output
['Python', 'is', 'my', 'favourite', 'programming', 'language']*
这是一个示例代码,展示了单词标记化是如何完成的,我们将一个句子分割成单独的单词。
***基于字符的标记化:*是将句子中的单词转换成字符。例如,像“你好,大家好”这样的句子将被拆分成如下单个字符:
作者图片
与单词标记化相比,它生成的词汇量较小,但还不够好,因为将单词拆分成单个字符与单个单词本身的含义不同。
***子词标记化:*这是大多数自然语言处理任务中使用的最好的标记化形式。单词标记化通过将句子拆分成单个单词来处理标记化,这种方法并不适合所有情况。两个单词" 鸟 " “和” 鸟 " 在一个句子中,一个是单数,另一个是复数,单词标记化会将它们视为不同的单词,这就是子单词标记化的由来。子词标记化将合成词和生僻字划分为子词,它考虑了像 bird 和 birds、这样的词的相似性,而不是将单词 birds 拆分成两个不同的词,它表示单词【s】在单词的末尾是单词 的子词像“ 有意义的 ”这样的词会被拆分成“ 有意义的 ”和子词“ ful ”,通常在这种情况下可以在子词中加上一个特殊的字符像“ ##ful ”,来表示它不是一个句子的开头,它是另一个词的子词。子字记号化算法被用在像伯特、GPT 这样的变压器网络中。Bert 使用单词片段标记器作为其子单词标记器。
用变形金刚训练一个蒙面语言模型
我们的主要目标是使用编码器变压器网络来训练屏蔽语言模型,该模型可以为句子中的屏蔽词预测合适的词。在本教程中,我们将使用拥抱脸变形金刚,这是一个非常好的库,可以很容易地用变形金刚训练一个模型。
这部分教程需要具备 Python 编程语言和 Pytorch 深度学习库的基础知识。
安装 Pytorch
安装其他软件包
pip3 install transformerspip3 install datasetspip3 install accelerate
微调电影评论的预训练屏蔽语言模型
我们将利用一个预训练的 DistilBERT transformer 模型,一个在 IMDb 数据集(一个包含成千上万对不同电影的评论的数据集)上训练的 BERT 的简化版本,来预测句子中的屏蔽词。
加载和标记数据集
加载 IMDB 数据
**第 1–10 行:**我们导入了用于加载 IMDb 数据集的模块,并打印出数据集信息以确认其已加载。我们还从数据集中随机打印出两篇评论。如果数据集加载正确,输出应该是:
DatasetDict({
train: Dataset({
features: ['text', 'label'],
num_rows: 25000
})
test: Dataset({
features: ['text', 'label'],
num_rows: 25000
})
unsupervised: Dataset({
features: ['text', 'label'],
num_rows: 50000
})
})
'>> Review: "Against All Flags" is every bit the classic swashbuckler. It has all the elements the adventure fan could hope for and more for in this one, the damsel in distress is, well, not really in distress. As Spitfire Stevens, Maureen O'Hara is at her athletic best, running her foes through in defiance of the social norms of the period. Anthony Quinn rounds out the top three billed actors as the ruthless Captain Roc Brasiliano and proves to be a wily and capable nemesis for Brian Hawke (Flynn). For the classic adventure fan, "Against All Flags" is a must-see. While it may not be in quite the same league as some of Errol Flynn's earlier work (Captain Blood and The Sea Hawk, for instance), it is still a greatly entertaining romp.''>> Review: Deathtrap gives you a twist at every turn, every single turn, in fact its biggest problem is that there are so many twists that you never really get oriented in the film, and it often doesn't make any sense, although they do usually catch you by surprise. The story is very good, except for the fact that it has so many twists. The screenplay is very good with great dialogue and characters, but you can't catch all the development
because of the twists. The performances particularly by Caine are amazing. The direction is very good, Sidney Lumet can direct. The visual effects are fair, but than again most are actually in a play and are fake. Twists way to much, but still works and is worth watching.'
它打印出 IMDb 数据集的轮廓、训练、测试和非监督部分,以及它们的行数。每行代表数据集中的一篇句子评论。训练和测试部分各有 25000 条评论,而非监督部分有 50000 条评论。最后两篇评论是从 IMDB 数据集中随机打印出来的。
标记化数据集
**第 1–11 行:**导入了 **Autokenizer 包,**我们从 DistilBERT 模型中加载了 tokenizer,这是一个 词块子词块 tokenizer 。我们创建了一个函数来表征 IMDb 数据集。
第13–15行:最后,我们调用了 tokenizer 函数,并将其应用于加载的数据集。当我们调用 tokenizer 函数时,我们从标记化的数据集中移除了文本和标签,因为不再需要它们了。我们打印了标记化的数据集,它显示了以下输出:
DatasetDict({
train: Dataset({
features: ['input_ids', 'attention_mask'],
num_rows: 25000
})
test: Dataset({
features: ['input_ids', 'attention_mask'],
num_rows: 25000
})
unsupervised: Dataset({
features: ['input_ids', 'attention_mask'],
num_rows: 50000
})
})
在数据集的每一部分我们都有两个特征,和 注意 _ 屏蔽 。input _ id是为分词生成的 id。attention _ mask是 tokenizer 模型生成的值,用来标识有用的单词的,以及要忽略的单词的输入 id,attention 值以 1 和 0 生成,1 代表有用的单词,0 代表要忽略的单词。**
串联和区块数据集
在自然语言处理中,我们需要为要训练的文本序列长度设置一个基准,要使用的 DistilBERT 预训练模型的最大长度是 512。
****第 2–6 行:我们将块大小设置为 128。因为 GPU 的利用,我们用了一个块大小为 128 而不是 512 。我们将数据集中的所有文本序列连接成一个单独的连接数据集。
****第 8–13 行:我们获得了串联数据集的总长度,创建了一个字典理解来循环遍历串联长度,并根据 128 的块大小将该串联文本划分为块。如果有非常强大的 GPU 可用,则应该使用块大小 512。连接的数据集被分成许多大小相等的块,但最后一个块通常较小,我们将删除最后一个块。
****第 18–22 行:带有组块的字典被赋予一个新的列标签,以包含组块样本的输入 id。最后,我们在标记化的数据集上应用了 concat chunk 函数。
用于评估的屏蔽测试数据集
第 1–9 行:我们从 transformers 导入了DataCollatorForLanguageModeling,这是一个用于在数据集中创建屏蔽列的默认包。数据集被向下采样到 10000,分割 10%的样本,即 1000 个用于评估的测试数据集。**
****第 13–24 行:我们定义了一个数据收集器,并定义了一个在数据集中随机插入掩码的函数。对测试数据集应用插入随机掩码函数,用掩码列替换未掩码列。屏蔽的测试数据集将作为训练期间测试模型的基础事实标签。
培训程序
****第 9–23 行:我们将批量大小设置为 32,使用 pytorch 内置的数据加载器加载训练和测试数据集。我们加载了预训练的 DistilBERT 模型,并使用了 Adam Optimizer。
****第 26–28 行:我们调用 transformers accelerator 库进行训练,它接收预训练的模型、优化器、训练和评估数据集,为训练做准备。
****第 31–37 行:我们设置了训练时期数,获得了训练数据加载器的长度,并计算了训练步数。最后,我们设置学习率调度功能,接受优化,热身步骤和训练步骤的训练。
列车代码
****第 4–7 行:我们使用 python 内置的 tqdm 定义了一个进度条用于训练进度监控,然后为输出训练好的模型设置一个目录。
****第 9–19 行:定义了一个 for 循环来循环通过多个历元,对于每个历元,我们开始数据集的训练,循环通过训练数据加载器,计算模型的输出,计算输出上的损失,使用变压器 加速器 包导入来对模型执行反向传播,使用优化器来优化模型以最小化损失。我们应用了学习率调度器,使用优化器将累积梯度设置为零,并更新了进度条。我们这样做,直到我们完成一个时期的整个数据集的训练。
****第 22–38 行:我们在测试数据集上评估了一个时期的训练模型,计算了测试数据集上的损失,类似于在训练期间所做的。我们计算了模型的交叉熵损失,然后计算了损失的指数,得到了模型的困惑度。
困惑是一种用于评估语言模型的度量。它是交叉熵损失的指数。
第 41–45 行:我们使用 加速器 保存预训练的模型,并使用标记器保存关于模型的重要文件,如标记器和词汇信息。训练好的模型和配置文件保存在输出目录文件夹MLP _ 训练好的模型 。输出目录将包含以下文件。我训练了 30 个纪元,得到了一个令人费解的值 9.19 。输出模型文件夹目录将如下所示:**
**--MLP_TrainedModels
--config.json
--pytorch_model.bin
--special_tokens_map.json
--tokenizer_config.json
--tokenizer.json
--vocab.txt**
全训码
测试训练好的模型
训练好的模型存储在MLP _ 训练模型、** 中,我们粘贴目录来设置模型值。我们打印出从模型中生成的句子列表,并为句子中的屏蔽词提供适当的值。**
- 输出
**>>> this is an excellent movie.
>>> this is an amazing movie.
>>> this is an awesome movie.
>>> this is an entertaining movie.**
我们可以从模型中看到对假面词的预测,分别是惊艳牛逼*** 和 娱乐 。这些预测与完成句子完全吻合。***
我们已经成功地训练了一个带有编码器转换器网络的屏蔽语言模型,该网络可以找到正确的单词来替换句子中的屏蔽单词。
我已经将我训练的屏蔽语言模型推送到 huggingface hub,它可供测试。检查拥抱人脸库上的蒙版语言模型
**https://huggingface.co/ayoolaolafenwa/Masked-Language-Model
测试屏蔽语言模型的 Rest API 代码
这是直接从拥抱脸测试屏蔽语言模型的推理 API python 代码。
输出
washington dc is the capital of usa.
它产生正确的输出, 华盛顿特区是美国的首都。
用转换器加载屏蔽语言模型
使用这段代码,您可以轻松地用转换器加载语言模型。
输出
is
它打印出预测的掩码字“ 是 ”。
Colab 培训
我创建了一个 google colab 笔记本,上面有创建拥抱脸账户、训练蒙面语言模型以及将模型上传到拥抱脸库的步骤。检查笔记本。
https://colab.research.google.com/drive/1BymoZgVU0q02zYv1SdivK-wChG-ooMXL?usp=sharing
查看 github 资源库以获取本教程
https://github.com/ayoolaolafenwa/TrainNLP
结论
我们在本文中详细讨论了自然语言处理的基础知识、转换器的工作原理、不同类型的转换器网络、使用转换器训练屏蔽语言模型的过程,并且我们成功训练了一个可以预测句子中屏蔽单词的转换器模型。
参考文献
https://huggingface.co/course/chapter1/2?fw=pt
https://github.com/huggingface/transformers
通过以下方式联系我:
领英:https://www.linkedin.com/in/ayoola-olafenwa-003b901a9/
推特: @AyoolaOlafenwa***
假设检验中的混淆矩阵
原文:https://towardsdatascience.com/the-confusion-matrix-explained-part-1-5513c6f659c1
使用混淆矩阵识别和理解 I 型错误、II 型错误和幂。
罗伯特·卡茨基在 Unsplash 上的照片
在推理分析(如 A/B 测试)和预测分析(如分类)中,混淆矩阵对于理解和评估统计测试或预测模型的某些任务非常有用。两者都涉及做出二元决策。在假设检验中,我们拒绝或未能拒绝零假设,在二元分类中,分类器将预测一个观察结果是肯定的还是否定的。
这两项任务都允许我们将结果组织成一个 2x2 的混淆矩阵,显示真阳性和假阳性,以及真阴性和假阴性。如果你看下面的两个矩阵,你会发现两个矩阵的结构都是一样的,矩阵主对角线上的条目对应正确的决策。
作者图片
作者图片
虽然矩阵以相同的方式构造,并且本质上也包含相同类型的测量,但是矩阵中包含的信息根据上下文而不同地命名和使用。在假设检验中,混淆矩阵包含不同结果的概率,这有助于我们理解检验的某些属性,如 I 型和 II 型错误和功效。在二元预测或分类中,每个方块(TP、FP、TN 和 FN)的计数用于计算不同的度量来评估某个预测模型。
在本文中,我们将在假设检验的背景下研究混淆矩阵。你可以在这里阅读关于分类问题的混淆矩阵。
可视化假设检验
假设检验是检验两个样本分布之间的差异是否是由两组之间的实际差异引起的,或者该差异是否可以通过随机机会来解释的方法。
为了在推理分析的背景下理解混淆矩阵,查看下面的单侧假设检验的可视化表示可能会有所帮助,以显示矩阵中的四个可能结果如何与假设检验的可能事件相对应。
作者图片
作者图片
第一类误差(α)
I 型误差也称为测试的大小或显著性水平。它用 alpha 表示,通常设置为 0.05。第一类错误代表假设检验的假阳性,意味着我们错误地拒绝了假设为真的零假设。
- I 型误差(α)= P(拒绝 null | Null 为真)
如果我们比较两个组的平均值,这意味着我们错误地得出两个组的平均值不同的结论,而实际上两个组的平均值是相同的。
类型 I 错误对应于图中的红色区域。即使零假设为真,我们也会在拒绝区域找到检验统计量,并在 5%的情况下错误地拒绝零假设。很多人对此感到困惑。如果检验统计量落在拒绝区域,怎么可能是假阳性?
好吧,考虑一下 p 值的行为。(所有的测试统计,像 z,t,chisq,f 等。可以转换为范围从 0 到 1 的 p 值。)在零假设下,并且满足测试的所有假设,p 值应该在 0 和 1 之间形成均匀分布。在重复采样的情况下,我们期望一些 p 值是<0.05, due to natural variation in the data and random sampling. While it is more unlikely to draw a sample with extreme values than a sample with less extreme values, it does happen due to chance. That is why we expect that, on average, 5% of rejected nulls will be false positives.
Can we not just lower the alpha value, you might ask. We can do that, and you can see that some studies use the lower significance level 0.01. But we must be aware that this also affects the power of the test negatively which is not optimal.
Type II error (beta)
Type II error is what the matrix shows as **假阴性,**并且被表示为β。这发生在当我们未能拒绝零假设的替代假设为真的时候。
- 第二类误差(β)= P(拒绝无效|备选项为真)
如果我们在比较两组的平均值,这意味着我们错误地得出了平均值没有差异的结论,而实际上两组的平均值是不同的。换句话说,当事实上存在差异时,我们无法察觉到差异。
如果测试没有足够的能力,这种情况会更频繁地发生。
力量
功效是指当零假设为假时,正确拒绝零假设的概率,即真阳性。幂是第二类错误(β)的补码:1-β。
- Power = P(拒绝 null |备选项为真)
功效是检测到均值真正差异的概率,意味着我们希望测试的功效尽可能高。通常,可接受的功率应该高于 80%。
接受较高的 I 型误差/显著性水平(α)将导致较小的β,这将增加检测真实效应的能力(能力= 1-β)。相反,如果我们降低犯 I 型错误的概率,我们也会降低功率。从混淆矩阵中可能看不出来,但如果你看一下图表,你会发现事实就是如此。α的增加导致β的减少,反之亦然。
但是,通常不建议将 alpha 值增加到 0.05 以上。我们还可以使用其他一些方法来增加功率,这些方法将在另一篇文章中介绍。
(功效相当于分类中的召回指标,也是检测到的阳性百分比的表达式。)
可信度
alpha 的补码,1-alpha,是正确拒绝零假设失败的概率,真否定。这种概率被称为测试的置信水平,在设定置信区间时使用,通常设定为 0.95 (1-alpha)。
- 置信水平(1-alpha) = P(拒绝 null 失败| Null 为真)
在我们比较平均值的例子中,这将是正确的结论,即两组之间没有差异。
应该强调的是,推理分析中的混淆矩阵代表概率,而不是单个测试的计数。在一个假设检验中,只有一个结果。概率显示了在所有假设和零假设为真的情况下,每种结果在重复测试中出现的频率。为了评估这些结果,你可以做一个控制参数的模拟。
如果我们评估类型 I 错误,运行模拟 1,000,000 次,显著性水平为 0.05,我们预计拒绝空值 50,000 次(5%的测试)。这与在单独测试中拒绝空值不是一回事。假设零假设成立,如果你拒绝零假设,出错的几率是 100%,而不是 5%。经过反复测试,平均大约有 5%的情况下会出现假阳性。
如果您对如何评估 I 型误差和功率感兴趣,欢迎您阅读这篇关于如何使用仿真评估 t-test 性能的深入文章。
分类中的混淆矩阵
原文:https://towardsdatascience.com/the-confusion-matrix-explained-part-2-6be183f180e0
使用混淆矩阵评估二元分类器的性能。如何计算性能指标以及它们告诉我们的结果。
凯勒·琼斯在 Unsplash 上拍摄的照片
在本文中,我将在评估二进制分类模型的背景下讨论混淆矩阵。你可以在这里阅读用于推理分析和假设检验的混淆矩阵。
https://medium.com/@andreagustafsen/the-confusion-matrix-explained-part-1-5513c6f659c1
在分类中,行代表实际类别,列代表预测类别。让我们使用吉娃娃或蓝莓松饼分类案例,我们想要识别其中有狗的图像来说明混淆矩阵。
作者图片
第一行显示了模型如何预测非狗的图像,我们可以看到 6 张图像被正确地分类为非狗(真正的否定)。一幅图像被错误地分类为狗(假阳性)。
第二行向我们展示了模型如何预测狗的图像。两幅图像被错误地分类为非狗(假阴性),而三幅图像被正确地分类为狗(真阳性)。
混淆矩阵本身提供了大量关于模型性能的信息,然而,我们可能想要使用一些更精确的度量。我们可以从这个矩阵中的信息计算出不同的有用指标。
准确(性)
模型的总体精度可以计算为正确预测的数量除以矩阵中所有观测值的数量:
- 准确度=(真阳性+真阴性)/(真阳性+真阴性+假阳性+假阴性)
在我们的例子中,准确率是(3 只狗+ 6 个松饼)/ (3 只狗+ 6 个松饼+ 1 个松饼+ 2 只狗)= 9/12 = 75%。
精确
Precision,也称为阳性预测值(PPV) ,表示被预测为狗的样本中有多少实际上是狗。换句话说,在所有预测为狗的图像中,正确分类的狗(真阳性)的百分比(真和假阳性):
- 精度=真阳性/(真阳性+假阳性)
在我们上面的混淆矩阵例子中,精度是 3 只狗/(3 只狗+1 个松饼)= 3/4 = 75%。
当您想要限制误报的数量时,精度非常有用。
回忆
召回指标也称为敏感度或真阳性率(TPR) ,显示被正确分类为阳性的阳性实例的百分比。有多少只狗被检测为狗?
- 回忆=真阳性/(真阳性+假阴性)
在上面的例子中,召回率是 3 条检测到的狗/(3 条检测到的狗+ 2 条错过的狗)= 3/5 = 60%。
当避免假阴性很重要时,回忆是有用的。
请注意这两个指标向我们展示的差异。虽然精度告诉我们,该模型在 75%的情况下做出正确的狗分类预测,但是回忆告诉我们,该模型只检测到 60%的狗。
精确度和召回率可以结合成两者的概括指标,称为 F1 分数。
F1 分数
F1 分数是精确度和召回率的调和平均值。当您想要几个指标的平均比率时,通常使用调和平均值。它被表示为给定的一组观察值的倒数的算术平均值的倒数,如下面一个简单的例子所示。
F1 分数的计算方法如下
其可以被重新排列
我们的示例中 F1 得分为 2 / (1/0.75 + 1/0.60) = 0.67
调和平均值给予低值更多的权重,这意味着只有当精确度和召回率都高时,F1 分数才会高。(表达式 1/precision 的值随着精度值的增加而变小。)这个 F1 分数有利于精确度和召回率相似的模型。
但是,根据分类器的上下文,您可能不希望精确度和召回率的权重相等。例如,如果您尝试对适合儿童的内容进行分类,您可能希望优先考虑高精度(避免误报)。在这种情况下,您宁愿选择较低的召回率,拒绝太多的安全项目(假阴性),同时保持较高的精确度,只保留适当的内容。或者,您可能希望在筛查疾病时优先考虑高召回率(避免假阴性)。在这种情况下,您宁愿让一些健康的人被检测为患病(假阳性),而不是遗漏患病的人(假阴性)。
理想情况下,您希望精确度和召回率都尽可能高,但不幸的是,这是不可能的。这被称为精确度/召回率的权衡。
特征
虽然准确度、精确度、召回率和 F1 分数是机器学习环境中评估二元分类器最常用的指标,但我还想包括特异性,或真阴性率(TNR)。
- 特异性=真阴性/(真阴性+假阴性)= 1 -回忆
在诊断测试中,特异性通常与敏感性(回忆)一起使用,所以我认为它应该包括在内。灵敏度衡量测试/模型检测真阳性的程度,而特异性衡量测试/模型识别真阴性的程度。与精确度和召回率(灵敏度)一样,在灵敏度和特异性(召回率)之间也有一个权衡。
在本文中,我只讨论了可以从混淆矩阵中导出的五个分类度量。还有很多,你可以在这篇维基百科文章中看到更全面的指标列表。
我希望这篇文章能帮助您理解混淆矩阵,以及如何根据它计算不同的二进制分类度量。
https://medium.com/@andreagustafsen/the-confusion-matrix-explained-part-1-5513c6f659c1
如果你喜欢阅读这样的故事,并想支持我成为一名作家,可以考虑注册成为一名灵媒会员。每月 5 美元,你可以无限制地阅读媒体上的故事。如果你注册使用我的链接,我会赚一小笔佣金。
https://medium.com/@andreagustafsen/membership
Wordle 开局不利的代价&如何避免
原文:https://towardsdatascience.com/the-cost-of-a-bad-start-in-wordle-how-to-avoid-it-2cdd63f8d599
在 Twitter 上分享 3M Wordle 游戏的经验教训
在这篇文章中,我将继续分析超过 300 万条 Wordle tweets 的数据集——首先在这里介绍——以探索我们可能了解到的人们如何玩似乎每个人现在都在玩的游戏。
虽然已经写了很多关于玩家开局猜测的重要性的文章,许多评论员提供了他们最喜欢的开局词和一些人,包括我自己,已经使用数据科学的工具来分析最佳开局词,但是,据我所知,没有人试图量化好开局的好处或坏开局的代价,或者在实践中,好开局和坏开局发生的频率我将在本文中尝试这样做,主要发现包括:
- 在 Wordle 的早期回合中猜中的正确字母/位置的数量与游戏长度之间有很强的关系——早期猜中的正确字母/位置越多,游戏越短——这并不令人惊讶。
- 然而,数据也表明前两轮非常重要:你在第二轮的表现如何是游戏时间长短的最强预测者;这种可预测性在随后的几轮中降低,表明在最初几轮后用于猜测的策略有相当大的可变性。
- 通过比较开局良好的游戏和开局不佳的游戏,我们可以估算出开局良好的的收益(或者开局不利的的成本 )。例如,开局良好的游戏比开局不佳的游戏更有可能在 3 轮内结束游戏,但是开局不佳的游戏比开局良好的游戏更有可能在 6 轮内结束游戏。
- Twitter 上分享的足够多的游戏都是糟糕开局的例子(约 18%),因此有理由建议一些玩家考虑使用更好的开局词。最佳开局词很少与糟糕的开局联系在一起(< 0.5%的游戏),而绝大多数与良好的开局联系在一起(> 93%的游戏)。
因此,如果玩家希望提高他们的单词游戏,那么一个充满信心的方法是选择一对更好的开始单词,这几乎保证提供一个好的开始,然后在游戏的剩余时间里专注于他们的努力猜对。
在接下来的内容中,我将正式定义什么是好的和坏的开始,我如何估计它们的成本和收益,讨论这些发现和结论背后的更多细节,并推荐玩家如何在自己的游戏中避免坏的开始。
Wordle @Twitter
简而言之,Wordle 玩家每天有 6 次机会猜测一个新的目标单词:每天一个单词;每个人得到的单词都一样。每次猜测后,他们被告知哪些字母在目标单词中,是在正确的位置(绿色)还是不正确的位置(黄色),以及哪些字母不在目标单词中(灰色)。这些提示帮助玩家微调他们的猜测。
一个例子 4 轮游戏的目标词灯。玩家前两次猜测的结果是 3 个正确的字母 jints(黄色的‘T’、‘I’、‘L’)。在第三轮中,玩家正确地猜出“T”的位置,然后继续正确地猜出目标单词。作者 Wordle 截图。
Wordle 的一个独特之处是,玩家可以生成他们日常游戏的图形表示,而不会透露他们的猜测(见下文),人们在 Twitter 上分享这些已经变得越来越普遍;目前每天有超过 20 万玩家分享他们的游戏。
Twitter 上分享的一个 Wordle 游戏的图片展示示例。图片作者。
论良好开端的重要性
为了这篇文章的目的,我将把一场足球比赛分成开始的*(第 1 和第 2 轮)、中间的*(第 3 和第 4 轮)和结束的*(第 5 和第 6 轮)。在这里,我们将重点放在开始,即开始游戏。玩家从他们的第一场游戏中学到了多少,这对他们游戏的其余部分有什么影响?***
*下图描绘了平均游戏时间与第二轮学习到的正确提示数*的关系;显示正确提示(正确字母或正确位置)的总数,并分别显示仅正确字母的数量(无正确位置)和仅正确位置的数量(无正确字母)。毫不奇怪,我们可以看到,一般来说,我们获得的正确信息越多,平均游戏时间越短。例如,在前两次猜测中没有学到任何正确信息的游戏(总正确数= 0 )的平均游戏时长几乎为 5 轮,相比之下,在第 2 轮之前已经学到 3 个正确提示的游戏的平均游戏时长接近 4 轮;正如人们所预料的那样,学习正确的字母位置比学习正确的错位字母更有价值——它可以缩短游戏时间。
根据玩家第二次猜测后得到的提示数计算的平均游戏时间。作者配图。
图例中显示的 r 平方值传达了正确提示的数量和平均游戏长度之间的关系强度,我们可以看到,在所有三种情况下,第 2 轮后提示的数量和游戏长度之间都有很强的关系(r- 平方> 0.90 );换句话说,92–98%的游戏长度变化可以用游戏早期学到的提示数量来解释。
作为开始游戏独特重要性的进一步证据,下图绘制了平均游戏时间和第 1、2、3、4 轮正确提示总数之间的 r 平方值。前两轮的高 r 平方值(> 0.95)意味着从这两轮中获得的正确提示的数量特别能预测整个游戏的长度。当我们观察在游戏后期获得的正确提示的数量时,事情就不那么可预测了。
一轮 n 的正确提示数与游戏时长之间的关系强度(r 平方)。作者配图。
第二轮享有最高的 r 平方值(0.97),这意味着我们从我们的前两个单词中学到的东西比我们从其他任何一轮中学到的东西都更能告诉我们可能的游戏时长。换句话说,你在第二轮之前的表现如何是游戏时间长短的最强预测因素,甚至与后面几轮相比也是如此。为什么会这样?这可能表明,人们在游戏开始后使用的猜测策略有很大的可变性。
这是有道理的,因为许多玩家在前一两轮已经形成了一致的游戏风格——依靠一套首选的起始词——但在第二轮之后,他们试图将自己的猜测与他们收到的暗示相匹配,这可能具有挑战性。一些玩家把他们的努力集中在某些类型的暗示上。一些玩家可能会选择完全满足他们到目前为止收到的所有提示的单词,而其他人可能很难找到这样的单词,因此可能会选择一个折中的单词;例如,玩家可以选择一个单词,该单词与他们所学的正确位置上的字母一致,但是可能使用目标单词中已知不存在的字母。这些不同的方法会对游戏结果产生重大影响;更详细的猜测策略分析见此处。
好的开始和坏的开始
在 Twitter 数据集中,第二轮正确提示的中位数是 2,所以我将使用这个来区分好的开局(第二轮正确提示超过 2 次的游戏)和坏的开局(有<2 correct hints by round two). Based on this definition, 18% of games begin with a bad start, compared to 44% of games, which begin with a good start; this leaves about 38% of games with a 常规开局的游戏,既不是特别好也不是特别坏)。
与好的和坏的开始相关联的游戏的分数(条)以及好的和坏的开始的平均游戏长度(线)。作者配图。
我们对这些好的和坏的开始之间的区别感兴趣。该图还显示了他们的平均游戏时间,很明显,良好的开局导致游戏时间更短,每场游戏约 4 轮,相比之下,糟糕的开局每场游戏约 4.6 轮。
糟糕开局的代价
我们不考虑游戏的平均时间长度,而是考虑在到第 3、4、5 或 6 轮完成的游戏比例。这些好的和坏的开始的结果作为在最多 n 轮中结束的游戏的累积分数呈现如下。例如,只有大约 11%开局不利的游戏在最多 3 轮内结束,相比之下,开局有利的游戏有 38%。这两条线之间的阴影区域代表了一个糟糕开端的成本(或者一个良好开端的收益)。对于较早的游戏回合,这个区域更宽,这表明对于这些较短的游戏来说,开局不利的代价更大。
给定长度的游戏中好的和坏的开局的分数(上图)。一个好的开始相对于一个坏的开始的好处,基于在最多 n 轮中成功的游戏的分数(底部)。作者图表。
我们可以通过将第轮到第轮到第轮游戏结束的累积分数除以开局不利的相应分数来量化这一收益,从而得到上面的条形图。例如,三轮游戏良好开局的相对收益分数几乎是 3.5 (38%/11%),这意味着与糟糕开局相比,良好开局在最多三轮中的完成次数几乎是 3.5 倍。事实上,可以证明,糟糕的开局导致 6 轮比赛的次数是良好开局的两倍多。
因此,一个糟糕的开局可能会将一场短时间(3 或 4 轮比赛)的比赛转换为一场更长时间(5 或 6 轮)的比赛,如果玩家希望改善他们的游戏,那么专注于他们的开局比赛是一种重要的方式。
结论
对超过 300 万条 Wordle 推文的分析证实,正确字母和位置的数量与游戏长度之间有很大的关系——这并不令人惊讶——但也突显了开局(第 1 轮和第 2 轮)作为游戏长度最佳预测指标的重要性,这是令人惊讶的,至少对我来说是如此。换句话说,一个玩家前两次猜测的好坏很大程度上决定了他们游戏的其余部分将如何展开。
实际上,大约 18%在 Twitter 上分享的游戏开局不利,而大约 44%的游戏开局良好。这两种游戏的区别告诉我们一个坏的/好的开始的成本/收益。良好开局的好处是短游戏的比例更高(> 3 倍),而糟糕开局的代价是长游戏的比例更高(> 2 倍)。
虽然,只有 18%的游戏开局很差,但如果我们假设人们不愿意分享他们最差的表现,真实的数字可能会比这更高;一些证据表明,人们分享失败游戏的可能性远低于预期。无论哪种方式,它表明有许多球员可能会受益于一套改进的启动词。例如,在之前的帖子中,我讨论了一项分析,以揭示一对表现优于所有其他备选词的特定首发词,并且根据上述定义,这很少(< 0.5%的游戏)导致糟糕的开局。事实上,这一对启动词估计能让 93%的游戏有一个好的开始;事实上,这些话会让 70%的游戏有一个更好的开局(> 3 个正确的提示),可以预期,与常规的良好开局相比,这会产生更多的短游戏和更少的长游戏。
那么,如果你想提高你的游戏水平,你应该怎么做呢?首先也是最重要的,确定一个好的开始词对,因为这种影响现在已经很明显了,对于许多玩家来说,这是一种尝试过的值得信赖的开始游戏的方式。这也为下一轮严肃的猜测开始时节省了你的精神能量。事实上,在游戏开始后,事情变得越来越不可预测,这表明玩家猜测下一个单词的策略存在很大的可变性。然而,帮助就在眼前,因为这篇文章包含了一些实用的建议,告诉你应该如何思考你的猜测以及你用来选择下一个单词的各种信息。
如果你想更多地了解 Wordle 的数据能告诉我们人们如何玩,以及你如何能更有效地玩,那么看看我最近的帖子:
- 我从玩了一百多万场 Wordle 游戏中学到了什么
- 如何在 Wordle 中猜对
- 300 万条 Wordle Tweets 之后:对 Tweets 的分析揭示了关于 Wordle、它的词和它的玩家的什么。
- 峰字和难字
犯统计错误的代价
原文:https://towardsdatascience.com/the-cost-of-making-statistical-errors-b8dcb5767e1d
统计数字
数据科学家犯统计错误的成本影响指南
当你还是个孩子的时候,你可能读过“喊狼来了的男孩”这个故事。这是一个牧羊人的故事,他曾经谎称看到了狼,并向人们求救,而实际上并没有狼。他反复这样做是为了取乐,但是当真的有狼的时候,他大声呼救却没有人来,因为村民们认为他又在撒谎了。这是一个很受孩子们欢迎的故事,尤其是在道德教育和伦理课上,他们被告知要诚实,不要撒谎,因为这个世界不相信骗子。
来自 Pexels 的 alleksana 的照片:https://www . Pexels . com/photo/wood-dirty-writing-abstract-4271933/
人类并不总是说谎,有时只是判断和衡量上的错误,这可能会产生严重的后果,并有可能改变企业、社会和环境。网上有很多实用的信息资源,详细解释了统计错误的不同类型,这些错误的原因是什么,以及如何防止这些错误。然而,一个人在生意中所做的每一个决定都有影响。在本文中,我解释了如何确定统计错误的成本影响。
这篇文章概述如下。我们将通过一些例子简要介绍统计中的错误类型。之后,我们定义了机器学习中与错误分析领域相关的一些术语:精确度、召回率和特异性。此后,我们将学习如何通过考虑其经济成本来决定哪个错误对您的业务更有害。我们将通过讨论减少错误的各种方法来结束这篇文章。这是一篇面向实践者和/或初学数据科学家的一般性文章,所以我避免使用数学术语和统计符号。如果你有任何问题,我可以参加讨论。所以,不再拖延,让我们开始吧。
统计中的误差类型
我们需要理解的第一件事是误差这个术语。误差是一个量的实际值和确定/收集值之间的差异。误差越大,我们对现实的估计就越低。举个例子,如果外面的实际温度是 21℃,但是我的机器说是 20℃,那么和实际值就有 1℃的差异或者 4.76%的偏差。我们是否可以接受这种误差取决于我们将如何处理这种测量,以及不准确测量的商业成本。统计优化的目标之一是减少我们的模型在各种情况下的误差,以便它足够健壮,可以在许多情况下使用。
类型 I:假阳性错误(假警报)
第一类错误,也称为假阳性错误,发生在某些东西实际上不真实或不存在,但被确定为真实或存在的时候。例如,如果我做了 COVID 测试,那么 I 型错误(假阳性错误)会将我识别为阳性,而实际上我不是阳性。另一个例子是在没有火灾时发出火警,这是发出假警报。另一个例子是将某人定罪为罪犯,而事实上他们并不是罪犯,或者在某人没有怀孕的时候测试其是否怀孕。这些都是假阳性的例子。
第二类:假阴性错误(失误)
第二类错误,也称为假阴性错误,发生在某事实际上是真实的或存在的,但被确定为不真实或不存在时。例如,如果我做了 COVID 测试,那么第二类错误(假阴性错误)会将我识别为阴性,而实际上我不是阴性。另一个例子是,当真的发生火灾时,不发出火警。另一个例子是宣告某人无罪,而事实上他们是罪犯,或者测试某人是否怀孕,而他们实际上是怀孕了。这些都是假阴性的例子。
前面的例子表明,将某事定义为假阳性或假阴性取决于在那种情况下如何定义“阳性”。例如,如果看到火灾的实例被认为是肯定的,那么当没有火灾时,假肯定将发出假警报。然而,如果看不到火的实例被视为阳性,那么假阳性将是看到火。出于实用目的和理解的简单性,事件的发生被认为是积极的。所以,看到火被认为是积极的。
一些重要术语
既然你对假阳性和假阴性这两个术语有了相当的理解,那么在我们讨论统计错误的经济成本之前,让我们再来理解三个术语。从用于商业目的的应用机器学习的角度来看,这些术语很重要。像前面一样,我们将使用现实生活中的例子来回顾这些概念。
假设您在一家金融机构工作,该机构向申请人提供的利率取决于他们过去的信用状况。违约概率较高的人将获得较高的利率,而违约概率较低的人将获得较低的利率。为了简单起见,假设您被要求制作一个模型,将申请人分为高风险或低风险借款人。因为我们有很多人不违约,只有一些人违约,所以我们会有一个不平衡的数据集。因此,我们不能仅仅根据准确性来评估模型的性能,因此我们需要额外的指标来评估性能。
对于这个例子,我们将默认为正。因此,违约的人会被认为是积极的。我们现在将定义和理解回忆或敏感性、特异性和精确性。
回忆或敏感度或真阳性率
敏感度或回忆是衡量一个模型能够多好地识别真正的阳性,即高风险借款人。在我们的示例中,true positive 代表识别将违约的借款人的模型,因此给他们一个高风险标签,以便他们的利率高于那些违约风险较低的借款人。如果我们的模型的灵敏度不高,这将转化为更多的人获得低风险评级,从而降低利率,因为模型将无法辨别真正的积极因素,也就是说,识别更多的人将被归类为低风险。从财务角度来说,这对企业来说可能是危险的,因为更多的人会违约,而模型预测这些人是低风险的借款人。因此,在这种情况下,我们的模型应该具有高灵敏度。
特异性或真阴性率
专一性是衡量一个模型能够多好地识别真正的负面因素,即低风险借款人。在我们的例子中,true negative 代表识别不会违约的借款人的模型,从而给他们一个低风险标签,因此他们的利率比那些违约风险较高的借款人低。如果我们的模型的特异性不高,这将转化为更多的人获得更高的利率,因为模型将无法辨别真正的负面影响,也就是说,识别更多的人将被归类为高风险。从财务角度来说,这可能是好事,因为银行会有更多的收入,但这也可能意味着一些借款人不会借款,因为借款成本太高,这将导致企业失去客户或客户变得沮丧并转向竞争对手。有了数据,人们将能够确定哪个成本更高,失去客户(失去潜在收入)还是从现有客户身上赚更多钱。
精确度或阳性预测率
精度是模型识别能力的度量。换句话说,如果你的模型将 500 人确定为违约风险高的人,但实际上,只有 400 人违约(过去的数据),那么模型的精度是 400/500 = 0.8
在这一点上,值得一提的是,孤立地讨论精确度、召回率或特异性是没有帮助的。您应该知道所有这三个值,然后才能估计该措施的成本。
统计错误的经济成本
评估统计错误的成本包括两个步骤。首先是定义你所说的积极。例如,在我们前面的例子中,一个人违约被认为是积极的。第二步是计算假阳性率(假警报率)和假阴性率(漏检率)。如果假阳性率很高,这意味着许多人被评定为高风险,这对业务不利。如果假阴性率很高,这意味着许多人被认为是低风险的,这反过来使企业赔钱。假设我们的模型的假阳性率为 0.2,这意味着在 100 人中,我们的模型将 20 人识别为假阳性,因此 20 名客户将因被标记为可能的高风险借款人而沮丧。但是,如果我们的模型的假阴性率是 0.15,这将意味着 100 个应该是高风险人群的人中有 15 个被归类为低风险人群,从而潜在地导致企业亏损。如果一个普通的违约者给企业造成 50 万印度卢比的损失,那么假阴性率的成本将是每个错误识别的客户 0.15X500000 = 75000。要计算假阳性率和假阴性率,建议找到混淆矩阵,并计算相关值。
来源:混乱矩阵https://en.wikipedia.org/wiki/Confusion_matrix
如何减少错误
你永远不可能消除所有的统计误差。有办法减少它们。这些是你可以用来减少统计误差的方法。
- 第二类误差与统计检验或模型的功效成反比。统计检验的能力可以定义为它辨别现实并因此正确拒绝无效假设的真正能力。这意味着统计检验的功效越高,犯第二类错误的概率就越低。因此,您可以增加测试的能力。这可能涉及成本,因为更大的功率导致更大的样本量,从而导致更高的成本。减少第二类错误导致犯第一类错误的增加。因此,您应该评估犯这些错误的成本影响。
- 减少 I 型错误的方法之一是最小化显著性水平(当假设为真时拒绝零假设的概率)。由于显著性水平是由研究者选择的,所以该水平是可以改变的。例如,显著性水平可以最小化到 1% (0.01)。这表明有 1%的概率会错误地拒绝零假设(两个变量之间没有差异的假设)。
摘要
在本文中,我们讨论了各种类型的错误、它们的原因、成本影响以及减少这些错误的方法。我的信念是,这将有助于你对各种错误的成本估算做出明智的决定。此外,必须理解统计误差只能最小化,而不能完全消除。处理错误的最好方法是继续努力减少错误,并进行额外的检查和平衡(例如,保险)以减少做出错误判断的影响。
原载于 2022 年 2 月 7 日【https://aayushmalik.substack.com】。
维度的诅咒
原文:https://towardsdatascience.com/the-curse-of-dimensionality-69acc63eebd6
为什么不把所有的变量都放入你的模型中
虽然这很酷,但这篇文章并不是关于海盗在他们的维度帆船上穿越平行现实,而是关于那些你想把所有变量都塞进你的模型,看看它是否能消化它们的时刻。相信我:如果你这样做,你会被诅咒的,我会告诉你为什么和怎么做。
匿名作者,http://www.pikist.com/free-photo-srces
诅咒本身
我已经听过很多次了,起初,它甚至是有意义的:“模型中的信息越多越好,所以我将把所有这些变量都放进去,并得到完美!”这就是人们,或者更确切地说是建模工作,获得诅咒的方式:在他们的特征空间中放置大量变量,急剧增加其维度。
嗯,在大多数情况下,当你继续增加数据集中的变量数量(或者相反,向量空间的维数)时,过一段时间后,你会发现你的模型越来越难得到可靠的结果。这似乎违反直觉,是维度的诅咒。
那么,为什么添加变量会有问题呢?为什么会有维度的“诅咒”?
稀疏向量空间
诅咒的第一个原因是拓扑性的:空间中的维度(变量)越多,数据点之间的“空间”就越大,因为随着维度数量的增加,距离会逐渐“拉长”。
设 A 和 B 是 N 维欧氏空间中的数据点:
如果我们再增加一个维度,效果将会是:
由于添加到总和中的新项是平方的,其影响将总是正的,因此,除非所有数据点在新维度中具有相同的坐标(即:我们添加了一个常量变量),否则随着我们向数据集添加变量,总距离将总是增加。换句话说:维数更多的向量空间也更稀疏。
甚至更多:让我们考虑ε是由于增加了一个新的变量而增加的距离的百分比,假设我们增加的所有变量只对我们的向量空间有相同的贡献。
如果我们再向数据集添加一个变量,向量空间的体积将乘以(1 + ε),因此,如果我们在新的向量空间中再插入 V 个变量,它的体积将增加(1 + ε)的 V 次方倍。这意味着,随着我们向数据集添加更多的变量,它的向量空间变得指数级稀疏。
那么,再一次,稀疏向量空间有什么问题?
更稀疏的向量空间是一个问题的原因与我们使用平方度量来检测差异的原因相关,例如 MSE(均方误差)度量中的平方误差或计算方差的平均值的平方偏差。除了它使所有数字都为正数这一事实(我们可以通过取绝对值来实现这一点)之外,对指标求平方强调了数据点之间的每一点差异,因此我们就像通过放大镜一样看待它们。
这种“放大效应”对于检测偏差来说是完美的,但是当它太强时,对于聚类和分类来说可能是有问题的,因为同一聚类或类中的点之间的非常微小的差异将被视为较大,使得非常相似的数据点看起来与其余的数据点如此分离,以至于其他相似(但不那么相似)的数据点将被视为属于不同的组。这造成了数据集中大量聚类的假象,而实际上数据集中只有少数几个聚类,这可能会使理应属于某个类的元素在我们的模型中看起来像是离群值。即使在最好的情况下,它也会增加我们预测的方差(请告诉我你会估计你的模型的预期误差……你会这样做,对吗?问起来总是健康的。)
既然我们之前谈到了海盗,一个戴着滑稽帽子、牙齿很少的瘦子举起了手,用传统的海盗语言告诉我们他找到了解除诅咒的方法。由于迄今为止我们一直依赖欧几里得距离来描述诅咒,所以我们所要做的就是离散化我们的变量,并且通过在不同类型的空间中航行,我们将把讨厌的诅咒沉入黑暗的深处,并让它留在那里!每个人都欢呼,但坏消息来了…
可惜事情没那么简单。当你增加一个离散空间的体积时(比如说,一个具有曼哈顿距离的空间),它的离散可能位置的数量呈指数增长,并且它开始表现得越来越像欧几里得空间,因此,虽然我们讨论的效果对于离散变量来说会有所减弱,但增加太多的离散变量会使你走上同样的道路——这只是考虑稀疏性,正如我们将在前面看到的,这只是问题之一。
干得好,菜鸟…但你还是被诅咒了。
组合学难题
我们在数据科学中使用的大多数模型只不过是数学近似值。我们用它们来近似回归问题中的生成函数,用它们来近似分类问题中的分离函数。这就是我们在大多数日常活动中所做的:我们近似函数。
由于数学近似的性质,极限情况(在你的域中每个维度的最左边和最右边的那些数据点)与泛化非常相关。如果你没有正确处理极限情况,当你的模型投入生产时,它们会像幽灵船的船员一样困扰着你。
这是诅咒的一部分:被可怕的极限案例所困扰。
对于一个单独的变量,您的极限情况将只出现在数字线的两侧(嗯,这不是真的,因为您可能也必须处理您的聚类的极限情况,但是让我们暂时忽略这一点……),因此,每次您在数据集中插入一个新的变量时,您不仅必须处理它的两个新的极限情况,而且必须处理新旧变量的极限情况的组合。
组合学告诉我们,对于这类问题,极限情况的数量往往是数据集中变量数量的 2 次方。这意味着:每次你插入一个新变量,你至少要处理两倍的极限情况…不考虑集群的极限情况!
由于处理极限情况需要这些方面的数据,我希望在这一点上很清楚,当你向数据集中插入新的变量时,你需要的数据量不仅会增加,而且会以指数方式增加**。**
当然,由于表现良好且可预测的变量的极限情况很好地符合其余数据曲线的整体形状,这根本不是问题…但是,让我们坦率地说:如果现实生活中的变量经常如此,数据科学家将面临就业市场的短缺。
如果这还不能说服你,它将说服你的经理,因为更多的数据意味着更多的内存使用,这意味着更多的“强壮”的机器来运行你的模型…所以可怕的极限情况也通过增加云提供商在年底的账单来掏你的腰包。更不用说你的数据工程师同事检查、清理、整形、存储和争论这些(大量)额外数据行的成本,以及人们必须给它们贴标签的可能成本。
这是诅咒的“组合学难题”部分:当你在数据集中插入新的变量时,你会被你的极限情况的幽灵所困扰…他们会得到你的金子。
超球形笼子
你可能听说过数学吸引子,它是一种突现的行为,迫使一些数学关系进入某种模式,在迭代过程中更常见,比如在数据集中插入一个又一个变量,然后又是一个。这正是我们在这里处理的那种怪物——如果你想知道,当你同时插入所有变量时,它也会抓住你…
让我们想象一下,我们所有的变量都有以零为中心的对称分布。这不是诅咒的必要条件,但有助于我们理解参与其中的怪物(吸引子)。我们稍后会提出这个假设。
对于我们单独选取的任何一个变量,最大的概率是它在给定的随机选择的数据点的值将接近于零。无论如何,我们的变量是弱相关的,因为两个强相关的变量不应该在同一个数据集中,因为它们给模型带来的信息很少(但是它们的全部噪声)。
由于我们的变量是弱相关的,在一个数据点中找到一个变量的边缘值(比如说,分布尾部的 5%大部分或 5%小部分)的概率独立于同一数据点的所有其他变量的值。这意味着:对于我们数据集中插入的每个新变量,对于我们数据集中的每个数据点,它有 10%的概率要么是一个小变量(5%的下尾部),要么是一个大变量(5%的上尾部)。
随着变量数量的增加,数据点超出 5%上下区域的概率显著下降(10 个变量时为 35%,20 个变量时为 12%)。有了足够的变量,几乎所有的数据点在其一个变量中至少有一个条纹值是确定的。****
此外,正如我们在关于稀疏性的讨论中所看到的,当我们向数据集添加另一个变量时,点之间的总距离永远不会减少,每个变量都会增加任意点与向量空间中心之间的距离,无论任何变量或变量组在任意点可能取值。
通常,当我们描绘一个围绕零对称分布的数据云时,我们会把它想象成一个模糊的云,它填充了围绕向量空间中心的超球体的空间。高维空间绝对不会发生这种情况。
随着新变量的加入,任何一点而非位于分布边缘的概率降低,并且一个接一个地,所有的点都位于超球面的表面,它们都离中心非常远。
更是如此,因为,对于每一个新的变量,这个过程是独立于所有其他变量的值的。实际上,它是随机的,因此,变量越多,它就越受中心极限定理的约束,使得每个数据点和向量空间的中心之间的距离正态分布在某个值周围,即超球笼的半径。
请注意,我们没有提及或关心任何变量中包含的信息…您可能会发现这真的无关紧要。
现在您可以看到怪物(将所有数据点放入数据集向量空间中的一个单一几何形状的吸引子,无论变量可能携带的信息如何)和笼子(超球体本身)。
如果您的数据不对称和/或以非零点为中心,这对我们这个可怕的怪物来说无关紧要:它只会将超球体的中心转换为数据的平均向量,并根据每个变量的分布扭曲超球体。
好吧,很可怕,但是我们所有的数据点都在超球体表面,这有什么问题呢?
还记得我说过我们的数据被放置在超球表面而不管我们的变量可能携带的信息吗?嗯,D 维向量空间中的超球面本身就是 D-1 维向量空间。
当这些风足够强大时(即:数据集中已经有太多的变量),我们的数据将被投影到一个维度更小的空间,除非投影过程仔细考虑数据集中的信息,否则仅仅这样做就可能丢失大量信息。
碰巧我们的怪物完全不关心数据中包含的信息,所以预计会有重大损失。如果变量带有大量噪声(即:它们具有小的信噪比),则更是如此。
对于嘈杂的变量,我们面临着一个悲剧,因为这整个过程使噪音能够简单地接管我们想要通过增加变量来增加的信息。
怎么会?当我们用每个新变量将数据投射到超球表面时,新空间中每个数据点的位置都携带着它(减少的)信息,但在这一过程的每一步都会受到它的全部噪声的干扰,因为破坏信息比维护信息容易得多。
最后,随着添加越来越多的噪声,超球面表面中每个数据点的位置变得越来越随机。
因此,如果它还不足以被抛入一个不断扩张的空间,同时被碰巧是抢金扒手的可怕极限案例追逐,那么你现在被一个数学怪物锁定在一个扭曲的超球体中,它也碰巧将你变平!说到诅咒,这是一个连最强悍的次元海狼都不应该掉以轻心的问题。
维度的祝福
到目前为止,我们已经看到了相当危险的事情,但是在高维空间中,并不是所有的事情都是黑暗和可怕的。你可能会发现那里有可供掠夺的黄金!
在某些情况下,在我们的数据集中插入新的变量对我们的工作有益。事实上,这正是我们最喜爱的模型之一背后的原理:支持向量机(SVM)。
SVM 的工作原理是插入至少一个新的变量——从一个学习的数学变换(一个核函数)中创建——以正确的方式扭曲我们的数据,允许线性分隔符将其分割成有意义的部分。这就是所谓的“内核把戏”。
从更高维数据集获得信息的许多其他形式是存在的,但是它们通常依赖于大量数据点的存在以便被利用(正如我们在上面的“组合学难题”一节中看到的)。
从本质上讲,在非常特定的条件下,增加数据集中变量的数量是有用的,但是为了使用任何形式的“维度祝福”,您将需要大量的数据和非常仔细的特征工程。
最后的想法
我们至少看到了构成我们所知的“维数灾难”的最重要的元素,并讨论了它们的工作方式及其对数据科学的影响。
我希望在这里可以清楚地看到:
- “更多变量”不一定意味着“更多信息”;
- 没有什么,绝对没有什么可以替代好的特征工程,当选择我们打算用什么来喂养我们的模型时;
- 我们变量的信噪比(或“信息密度”)很重要。
- 穿越高维空间是非常危险的…
如果这四点很清楚,我将认为工作已经完成。
维数灾难解释
原文:https://towardsdatascience.com/the-curse-of-dimensionality-explained-3b5eb58e5279
为什么高维数据集如此不受欢迎
玛格达·埃勒斯的照片:https://www.pexels.com/photo/orange-cube-1340185/
维数灾难在我们如何在建模之前转换数据方面扮演着重要的角色。
也就是说,尽管人们对高维数据集抱有负面情绪,但首先值得一问的是,整合太多预测特征会如何破坏模型性能。
毕竟,特性提供了预测给定目标所需的关键信息,因此认为首先存在“太多特性”这种事情似乎很奇怪。
在这里,我们解释了维数灾难,并阐明了为什么降维在特征工程中如此流行。
可视化高维度
要了解高维度的缺点,了解数据集中的要素数量如何影响特征空间非常重要。为了实现这一点,我们可以使用可视化。
作为一个例子,让我们假设我们正在寻求建立一个预测患者糖尿病的模型。对于这项任务,我们只提供了样本的体重指数(身体质量指数)作为预测特征。
我们虚构的数据集中有 5 个数据点。代表糖尿病患者的数据点为红色,而代表非糖尿病患者的数据点为蓝色。在这种情况下,特征空间可能是这样的。
代码输出(由作者创建)
当然,身体质量指数指标本身不足以准确预测患者的结果。
现在让我们假设我们使用两个特征来预测糖尿病。以下是包含身体质量指数和年龄变量的数据集的特征空间。
代码输出(由作者创建)
现在,我们有两个可用于生成预测的特征。很明显,在特征空间扩展到二维平面后,数据点之间的间隔更大了。
这一次,让我们来看看具有 3 个预测变量的数据集的特征空间是什么样的。
代码输出(由作者创建)
此外,添加第三个特征后,数据点变得更加分散。请注意,每次添加另一个特征时,特征空间会显著扩大。
总的来说,预测特征的数量越多,为用户提供的信息就越多,这些信息可用于预测目标,从而获得更好的结果。然而,通过可视化具有不同数量特征的特征空间,我们可以观察到高维数的严重缺点。
增加特征的数量使特征空间更加稀疏,这意味着每个区域的数据点更少。高度稀疏是高维数据集的一个共同特征,这可能是机器学习应用中的一个严重障碍。
高维度的有害本质被一个不祥的术语抓住了:维数灾难。
维度的诅咒
维数灾难是指由于大量预测特征产生稀疏的特征空间,模型无法识别模式并使用训练数据进行归纳。
为了理解拥有过多维度的危害,重要的是要理解增加预测特征的数量会以指数方式增加特征空间*(如上例所示)。*
具有巨大特征空间的模型在每个区域将具有较少的数据点,这是不希望的,因为模型通常需要每个区域足够数量的数据点,以便能够以令人满意的水平执行。
如果模型是用稀疏特征空间中的数据训练的,那么它更有可能适合于不能充分代表总体的唯一观察值。所得到的模型将不能一般化,并且在看不见的数据上表现不佳(即,过拟合)。
从前面的例子中,我们已经看到了仅仅从过渡到单独使用 2 个和 3 个特征时,特征空间的稀疏性峰值有多大。
不幸的是,现实生活中的数据集可能包含数十个、数百个甚至数千个要素!想象一下具有这种维度水平的特征空间的稀疏性(我很想展示它,但 Medium 不允许我绘制超过 3D)。
多少功能才算太多?
显然,有很强的理由不要用太多的特征来训练模型。但是,什么层次的维度才算过高呢?
最终还是要看情况。
毕竟,维度的影响基于多个因素(例如,数据点的数量、算法等。).如果不进行实验,就无法判断有多少功能会产生最佳效果。
因此,在确定高维度是否是一个问题时,创建一个可以用作参考的基线非常重要。
如果基线在训练数据上表现良好,但在测试数据上表现不佳,则它是过度拟合的,这可能是模型受到高维度阻碍的证据。
解决方法
虽然增加数据点的数量将使模型能够用高维数据集进行概括,但在现实生活中,数据通常是稀缺的。
因此,面对高维数时,最明智的解决方案是减少数据集中的要素数量。
有许多方法可以用来降低维数。这些方法通常分为两组:特征选择和特征提取。
- 功能选择
功能选择是一种简单的方法,需要选择可用功能的子集。简单地说,这意味着只保留对预测给定目标标签贡献最大的特征;其余省略。
可以使用类似正向特征选择的技术单独进行特征选择。它们也可以通过正则化等技术嵌入到算法中,其中特征可以没有权重。
执行功能选择时,值得考虑:
- 在可用的特性中,应该保留多少?
- 应该使用什么策略来剔除不需要的特性?
2。特征提取
与特征选择相比,特征提取在如何减少特征数量方面更加抽象。它以保留方差同时降低维度的方式变换要素的值(即创建替换原始要素的新要素)。
特征提取方法的例子包括主成分分析(PCA)和线性判别分析(LDA)。
执行特征提取时,值得考虑的是:
- 转换后应该有多少功能?
- 转换后应该保留多少与原始数据的差异?
关键要点
在 Unsplash 上 Prateek Katyal 拍摄的照片
简而言之,维数灾难指的是高维数据集的性质,这使得模型很难进行归纳。
虽然具有一定数量的特征对于确保模型具有足够的预测能力是必要的,但是太多的特征将使模型无法对看不见的数据执行良好的操作。
出于这个原因,在考虑训练模型时使用的特征数量时,处理机器学习任务的用户必须采用金发姑娘原则:不要太多,也不要太少。
我祝你在数据科学的努力中好运!
维度的诅咒;越多不一定越好
原文:https://towardsdatascience.com/the-curse-of-dimensionality-more-is-not-always-better-585b5a49fce3
人类向机器学习:第一部分
人工智能和机器学习概念的哲学要点
来源:作者图片
在我作为一名人工智能从业者的旅程中,我观察到我们教给机器的几个人工智能概念也可以应用在生活中,以提高我们的福祉和生产力。人类向机器学习是一个系列,我试图介绍人工智能中一些有趣的概念,并讨论它们在我们生活中的哲学相关性。
在一个机器变得越来越聪明,人类变得越来越懒惰的世界里,让我们从人类教给机器的东西中吸取一些教训,并将其应用到我们的生活中吧!因为归根结底,人工智能和给它编程的人一样好!
从我最喜欢的一句话开始 乔布斯;
每个人都应该学会给电脑编程,因为它教会你如何思考
——乔布斯
PS:我在之前的一篇文章里用过同样的语录, 没人会教你的 10 条编码原则 。嗯,这里的引用也是有效的:P
我们开始吧!
1.维度的诅咒
随着技术的到来,从 Alexa 到自动驾驶汽车,一切都由数据驱动的技术推动。据 Statista 称,到 2025 年,产生的数据量预计将增长到巨大的 181 万亿 GB!!!这个数字呈指数级增长,总数据的 90%是在过去三年中创建的。
直觉上,我们假设更多的数据意味着模型可以学习得更好,可以驱动更多的洞察力。嗯,越多越好,对吧?
答案是……不总是这样!
这就是通常所说的 维度诅咒 !让我们从计算负担、空间体积、可视化和参数估计的角度来看看更多的数据如何影响可学性。
1.1 计算负担和空间体积
假设您是一名园丁,想要在一个 100 米长的线性花园中种植相隔 1 米的玫瑰。很简单吧?种 100 朵玫瑰就完事了。园艺太有趣了!这只是激情的问题…我爱它!!!开设了 YouTube 频道,名为 Fun with Gardening ,如何在没有任何背景的情况下进入园艺行业!😛
如果花园是一个每边 100 米的正方形花园会怎么样?在这种情况下,我们需要种植 100×100 朵玫瑰。复杂性增加了 100 倍。园艺是一项单调乏味的工作,但是如果你充满热情并且持之以恒,那么你就可以做到!如何通过持之以恒赢得人生,YouTube 视频发布!😛
100 立方米的立方花园怎么样?在这种情况下,我们需要种植 100×100×100 朵玫瑰。嗯,我突然对园艺失去了兴趣!不可能的!一个名为知道何时退出的新视频!来自园艺的生活课程发布了,订户很失望
现在想象一下,如果园丁在上述花园的某个地方留下了一把铲子,他需要找到它。他最多需要穿越 100 米,10000 米(10 公里),1000000 米( 1000 公里 whoaaa!!)分别用于每个花园。
因此,计算复杂性和空间体积随着维度的增加而呈指数增长。我们将在接下来的章节中讨论这些空间的影响。
1.2 可视化和参数估计
我们可以将数据可视化到 4 维
用 0-4D 表示数据来源:斯匹莉缇娅,公共领域,通过维基共享
之后会发生什么?数学家甚至可以使用方程轻松地表示无限维数据。顺便说一句,布鲁诺·乔亚尔在 MathExchange 的一个有趣的回答说
当有人说“高维空间难以想象”时,他们想到的是用眼睛来想象*。但是数学家用大脑将形象化!*
有史以来最伟大的数学家之一, 伦纳德·欧拉 ,在他生命的最后 17 年里双目失明。令人惊讶的是,他对世界的贡献有一半是在失明之后。你可以在 盲数学家的世界 里读到类似的有趣故事。
这里有一篇非常有趣的文章,作者是 迈克尔·西蒙斯 ,完成这篇文章后,请按 control/command 并点击此处稍后阅读:P
由于我们看不到更高维度的数据,我们试图外推我们对数据的直觉,直到 4D。那么数据在更高维度下是如何表现的呢?和我们到 4 D 之前对它的了解类似吗?
我们的几何直觉在高维空间中失效了
让我们通过考虑一个 d 维球体来理解这一点。
- 因此,从我们人类的直觉来看,我们假设,如果我们把稍小的球体从较大的球体中移走,大部分信息都会丢失,对吗?因为理想情况下,我们将只留下大球的表层。让我们通过计算体积的相对差值来进行数学处理。
在 3D 中,如果我们假设一个半径为 3 个单位的球体, 𝛿 为0.1,体积的相对差值为 0.096。因此,当移除内部球体时,99%以上的数据会丢失。而在更高维度中,比如说一个 100 维的球体,体积的相对差异是 0.966,当移除内部球体时,信息损失不到 1%。因此,我们可以看到,体积往往集中在更高维度的边缘周围。
1.3 含义
高维数据的这种行为如何影响我们?
- 可用数据变得稀疏。表示数据所需的空间量呈指数增长,密度随着维度的增加而降低。这一点我们可以从 1.1 节的园艺比喻中推断出来。
- 对象的“最远”和“最近”对之间的相对差异减小。
随着维度趋于无穷大,比较因素如“近”或“远”变得没有意义。这直接影响所有基于相似性的算法,如聚类。
基于它们的相对距离来检测相似的数据点是不可能的,因为它们被表示为占据如此大的空间,因此,这就像试图进行 K 均值聚类,其中 K 等于特征向量的数量,每一行将自己标识为新的聚类,从而使得信息不相关。
1.4 处理维数灾难
现在你可以看到拥有更高维度数据的含义。越多不一定越好。有时,我们会被流入大脑的大量数据淹没。无限可能的存在,让我们失去焦点,不知所措。
看不完的电影/连续剧,卷轴,课程,职业选择,YouTube 视频……选择的挣扎是真实的!!突然间,我们都需要好好吃饭,通过比特币赚钱,担心股市,完成工作,陪伴家人,锻炼身体,社交,做爱好…啊啊啊啊…思想已经开始膨胀了…!!
这些铺天盖地的信息本质上让我们的大脑疲惫不堪,最终我们将一事无成。对生活无限可能性的担忧困扰着我们,我们最终变得悲伤和沮丧。维度的诅咒也是生活中的诅咒。
当你的头脑被思绪淹没时,如何整理东西?如何处理维数灾难?
答案是一样的。我们只是改变我们的视角,试着从不同的角度看问题。从一个新的角度来看,我们可以区分哪些信息是重要的,哪些只是噪音!这被称为主成分分析,我们将在本系列的下一篇文章中讨论。在这个信息超载的世界里,改变你的视角来理解大局!人类向机器学习:第二部分
降维——拥有的越多,看到的越少!
这里可以找到。
非常感谢您花费宝贵的时间…我希望我的观点对你有所帮助!请在 LinkedIn 或通过电子邮件告诉我您的宝贵建议和反馈。
鸣谢:维度诅咒的技术层面我从伯明翰大学计算机科学学院的伊恩·斯泰尔斯博士的讲座中学到了。花点时间来表达我对他们无价服务的感激之情!😄
一如既往,