TDS24
来源:{url}
一年的持续 Kaggle 实践:它教会了我什么?
竞赛比其他组件更有价值
https://medium.com/@geremieyeo?source=post_page---byline--d267c222cfa3--------------------------------https://towardsdatascience.com/?source=post_page---byline--d267c222cfa3-------------------------------- Geremie Yeo
·发布于 Towards Data Science ·阅读时长 5 分钟·2024 年 5 月 11 日
–
Kaggle是一个让用户在实践数据科学和机器学习方面获得动手经验的平台。它有四个不同的进阶组件,分别是竞赛、数据集、笔记本和讨论。使用这个平台并开始学习不需要数据科学方面的先前经验。
我的背景:我在 2023 年初在我的本科学位(数学与计算机科学)课程中完成了第一个 Kaggle 项目,这个项目是机器学习课程的一部分。从那时起,我就迷上了这个平台,将其作为最喜欢的消遣。到目前为止,我参加了 20 场竞赛。开始使用 Kaggle 之前,我没有作为数据科学家的工作或实习经验。
在一年时间里,我在 Kaggle 旅程中取得了(我认为)显著的进展,包括赢得了 2 枚金奖竞赛奖牌,其中一项我获得了第一名,并且在竞赛类别中跻身前 116 名,同时几乎没有错过任何一天的活动。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/e919c5318c1a0d336047ed28f21b0232.pnghttps://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/6d05e765021b51e73713d913d93bc87c.png
现在,让我们深入探讨我在 Kaggle 旅程中至今得到的三大关键学习。
- 你的团队不能仅仅依赖公开的笔记本在竞赛中获得成功
标准的 Kaggle 竞赛只会颁发金奖给前 10 名+ floor(NumTeams / 500)支队伍!例如,在一个有 2500 支队伍的竞赛中,只有 15 支队伍能够获得金奖。要想晋升到竞赛中的Master等级,这是强制性要求,你需要五枚金奖(其中至少一枚为个人赛金奖)才能晋升到Grandmaster等级。
你的团队不太可能通过简单地修改公共工作(如集成公共笔记本)而获得金奖名次。你的团队将与顶尖的数据科学家和大师们竞争,他们有很多创造性的想法来解决问题。
简单修改公共工作是即使是机器学习初学者也能做到的事情,并且使用这种方法不太可能让你的团队的解决方案脱颖而出。很可能,稍微改进一个公共笔记本会获得铜奖,或者如果运气好,获得银奖。
在我们团队赢得金奖的两场比赛中:
-
1/2048(冠军)PII 检测:我们使用了多种 Deberta 架构和后处理策略,其中大多数没有在公共论坛中分享。我们的最终集成模型中没有使用公共模型。
-
14/4436 Optiver — 临近收盘交易:我们使用了在线训练,以确保模型在做出预测之前已经适配了最新的数据。编写在私有排行榜上有效的在线训练管道并不容易,据我所知,这个想法没有在公共论坛中分享。我们没有使用流行的公共训练方法,因为我们认为它会对训练数据过拟合,尽管它的公共排行榜成绩非常好。
相比之下,这是我们团队获得铜奖的一个比赛:
总结:在我看来,花更多时间分析基准,并进行研究以思考如何改进是更好的做法。可能从一个小模型(例如 deberta-v3-xsmall)开始,以快速评估想法是一个不错的选择。目标是从一开始就建立一个稳健的交叉验证策略。
2. 相比数据集/笔记本/讨论,你从比赛类别中学到的更多。
我所学到的一些真实世界技能。
-
我是大部分比赛的队长,其中包括我们团队赢得金奖的两场比赛。这大大提升了我的沟通和领导能力。
-
与来自不同国家和时区的其他数据科学家/工程师合作,并向他们学习最佳实践。
-
使用Wandb跟踪和记录实验。
-
定制化变换器模型的架构
-
使用 LLM 生成特定用例的合成数据集。
-
从数据科学角度建模真实世界的用例。
-
编写简洁、易于理解的代码。
-
如何利用多 GPU 训练
-
更好的时间管理
-
评估并减轻模型错误
相比之下,在数据集/笔记本/讨论中进展要容易得多,而无需深入学习数据科学。在讨论中,用户可以通过在 Kaggle 论坛发布自己的成就来获得金奖讨论奖牌。我怀疑如果没有参与竞赛,我大多数技能是无法学到的。在我看来,在数据集/笔记本/讨论中的进展不一定说明一个人对数据科学充满热情。
3. 游乐场竞赛是初学者入门的好方式
游乐场系列模拟了特色竞赛,只不过它更加适合初学者,并且不颁发奖牌/奖品。在游乐场中,你需要在表格数据集上做预测,这让你能够学习如何编写机器学习管道的基础。游乐场中有很多共享的笔记本,既有表格数据方法也有神经网络(NN)方法,所以如果你卡住了,那些公共笔记本是一个很好的参考。
每个游乐场系列的竞赛大约持续 1 个月。
根据我的经验,游乐场竞赛教会了我:
-
如何建立一个稳健的交叉验证策略,避免在公共排行榜上过拟合
-
如何选择提交内容进行评估
-
如何进行特征工程和特征选择
-
如何设计 Jupyter 笔记本的样式
-
(更多关于数据工程方面的内容)如何使用Polars。这是一种比 Pandas 更快的 DataFrame 库,更适用于大数据场景
总结来说,我觉得做 Kaggle 最有收获的部分是竞赛中的实战经验,以及与全球数据专业人士合作的机会。我得以解决各种问题,从表格数据到更高级的自然语言处理任务。期待在数据科学领域继续提高自己!
100 年的(可解释)人工智能
反思在不断发展的 LLM 和人工智能治理时代中,深度学习与可解释性方面的进展与挑战
https://slipnitskaya.medium.com/?source=post_page---byline--2c7ecee2e51a--------------------------------https://towardsdatascience.com/?source=post_page---byline--2c7ecee2e51a-------------------------------- Sofya Lipnitskaya
·发表于Towards Data Science ·20 分钟阅读·2024 年 12 月 18 日
–
图片由作者提供
背景
想象一下你正在驾驶一辆自动驾驶汽车,完全依赖它的车载计算机做出瞬间的决策。它能够检测物体、识别行人,甚至能够预测其他车辆的行为。但是,有一个问题:你知道它有效,但你完全不知道如何实现的。如果发生了意外情况,你无法清楚地了解结果背后的推理过程。这就是可解释人工智能(XAI)发挥作用的地方。深度学习模型,常常被视为“黑盒”,如今在各个领域被广泛应用于自动化预测和决策。可解释性就是要打开那个黑盒。我们可以把它看作是一个工具包,它不仅帮助我们理解这些模型做了什么,还帮助我们理解为什么它们做出这些决策,从而确保这些系统按预期工作。
XAI 领域近年来取得了显著进展,提供了关于模型内部工作机制的深入见解。随着人工智能成为关键领域的核心,处理责任问题变得至关重要,这对于保持系统的可靠性和信任至关重要 [Göllner & a Tropmann-Frick, 2023, Baker&Xiang, 2023]。这对于高风险应用尤为重要,如汽车、航空航天和医疗保健等领域,在这些领域中,理解模型决策能够确保系统的稳健性、可靠性以及安全的实时操作 [Sutthithatip et al., 2022, Borys et al., 2023, Bello et al., 2024]。无论是解释为何一份医疗扫描在特定患者中被标记为值得关注,还是识别风力发电风险评估中鸟类检测模型误分类的因素,XAI 方法都能让我们窥见模型的推理过程。
我们经常听到关于与模型和透明度等级相关的“盒子”及其种类,但拥有一个可解释的 AI 系统到底意味着什么呢?这如何应用于深度学习?而且,这不仅仅是满足我们的好奇心。本文将讨论 XAI 以及为什么它在 2024 年及以后会成为一个热点话题。我们将探讨可解释性如何在过去几十年中发展,并如何重塑计算机视觉的格局,反之亦然(第一部分)。我们将讨论从早期研究开始,XAI 是如何发展成为一项涵盖整个行业的实用技术,以及在全球监管框架和负责任的 AI 实践背景下,它的未来可能会如何(第二部分)。在这里,我们还将关注以人为中心的可解释性方法,我们将回顾利益相关者群体、他们的需求以及可能的解决方案,以应对在促进信任和确保安全 AI 部署过程中持续存在的挑战(第 3.1 节)。此外,您将了解常用的 XAI 方法,并检查评估这些解释效果的指标(第 3.2 节)。最后一部分(第四部分)将展示如何将可解释性有效应用于图像分类,以增强对模型决策的理解并验证其正确性。
1. 回归根本
在过去的一个世纪里,深度学习和计算机视觉领域经历了重大的突破,这些突破不仅塑造了现代人工智能,还推动了解释性方法和框架的发展与完善。让我们花一点时间回顾深度学习历史中的关键里程碑,这些里程碑促成了我们今天的成就,并展示了它们对视觉领域 XAI(可解释人工智能)发展的影响(涵盖:1920 年代 — 现在):
-
1924 年: 德国数学家弗朗茨·布赖西格(Franz Breisig)将电子学中四端子网络的明确使用视为“黑箱”——这个概念用于指代仅可见端口的系统,其内部机制被隐藏。
-
1943 年: 沃伦·麦卡洛克(Warren McCulloch)和沃尔特·皮茨(Walter Pitts)在其开创性工作《神经活动中固有思想的逻辑演算》中提出了麦卡洛克-皮茨(MCP)神经元,这是第一个人工神经元的数学模型,为神经网络的基础奠定了基础。
-
1949 年: 唐纳德·O·赫布(Donald O. Hebb)提出了赫布学习的神经心理学概念,解释了突触可塑性的基本机制,认为(大脑中的)神经连接在使用中会变得更强(同时激活的神经元会“联合”),因此能够通过学习重新塑造。
-
1950 年: 艾伦·图灵(Alan Turing)出版了《计算机与智能》,提出了他开创性的想法——图灵测试,用于判断机器是否能够“思考”。
-
1958 年: 美国心理学家弗兰克·罗森布拉特在其著作《感知机:大脑中信息存储和组织的概率模型》中提出了感知机,这是第一个人工神经网络。
图 1. 罗森布拉特感知机示意图(来源: Rosenblatt, 1958)
-
1962 年: 弗兰克·罗森布拉特(Frank Rosenblatt)提出了反向传播误差修正,这一计算机学习的基本概念,启发了后续的深度学习研究。
-
1963 年: 阿根廷-加拿大哲学家兼物理学家马里奥·布恩格(Mario Bunge)出版了《一般黑箱理论》,为黑箱理论的发展做出了贡献,并将其定义为一种抽象,表示“一个具体系统的集合,其中刺激 S 作用于系统并产生反应 R 的输出”。
-
1967 年: 日本工程师兼神经科学家天野俊一(Shunichi Amari)率先提出了第一个使用随机梯度下降训练的多层感知机,用于分类非线性可分模式。
-
1969 年: 日本计算机科学家福岛邦彦(Kunihiko Fukushima)提出了修正线性单元(ReLU),它后来成为深度学习中最广泛采用的激活函数。
-
1970 年: 芬兰数学家兼计算机科学家塞坡·林内马(Seppo Linnainmaa)在他的硕士论文中提出了“反向自动微分模式”,这是反向传播的现代变体。
-
1980 年: 福岛邦彦提出了 Neocognitron,这是早期的深度学习架构之一,适用于卷积神经网络(CNN),但并不使用反向传播进行训练。
-
1989 年: 法美籍计算机科学家 Yann LeCun 提出了 LeNet,这是第一个成功应用反向传播进行手写 ZIP 代码识别的卷积神经网络(CNN)架构。
-
1995 年: Morch 等人提出了显著性图,这为揭示深度神经网络内部工作原理提供了最早的可解释性方法之一。
-
2000 年代: 进一步的进展包括 CUDA 的开发,使得 GPU 并行处理能够支持高性能科学计算,此外还有 ImageNet,这个大规模的手动策划的视觉数据集,推动了基础和应用人工智能研究的进展。
-
2010 年代: 计算机视觉领域持续突破,如 Krizhevsky、Sutskever 和 Hinton 提出的用于 ImageNet 分类的深度卷积网络,推动了人工智能在各行各业的广泛应用。可解释人工智能(XAI)领域蓬勃发展,出现了 CNN 显著性图、LIME、Grad-CAM 和 SHAP 等技术*。
图 2: ImageNet 分类的视觉模型 SOTA 基准,2014–2024 年(来源:PapersWithCode)
-
2020 年代: 人工智能热潮随着 2017 年论文《Attention Is All You Need》的发布而加速,该论文提出了一种名为 Transformer 的编码器-解码器架构,推动了更先进的基于 Transformer 的架构的发展。在 Allen AI 的 ELMo、谷歌的 BERT 和 OpenAI 的 GPT 等早期成功的基础上,Transformer 被应用于多个领域和模式,包括视觉,加速了多模态研究的进展。2021 年,OpenAI 推出了 CLIP,一个能够从自然语言监督中学习视觉概念的模型,为生成型人工智能创新铺平道路,包括 DALL-E、Vision Transformer(ViT)、Stable Diffusion 和 Sora,提升了图像和视频生成能力。
-
2024 年: 欧盟人工智能法案生效,建立了针对欧洲人工智能系统的法律要求,包括透明度、可靠性和公平性的规定。例如,第 27 条将人工智能系统的透明度定义为:“以一种允许适当追溯性和可解释性的方式开发和使用 […] 有助于设计一致、可信和以人为本的人工智能”。
正如我们所见,早期的工作主要集中在基础方法和算法上,随着后期的进展,逐渐聚焦于特定领域,包括计算机视觉。到 20 世纪末,关键概念开始出现,为未来的突破奠定了基础,例如 1980 年代的反向传播训练卷积神经网络(CNNs)。随着时间的推移,可解释人工智能(XAI)领域迅速发展,增强了我们对预测背后推理的理解,并通过增加的研究和行业应用促进了更为明智的决策。随着(X)AI 的兴起,焦点转向了平衡系统效率与可解释性,在大规模模型理解中起到辅助作用,并在整个机器学习生命周期中整合 XAI 解决方案[Bhatt et al., 2019,Decker et al., 2023]。实际上,直到过去二十年,这些技术才足够成熟,得以广泛应用。最近,立法措施和监管框架,如欧盟人工智能法案(2024 年 8 月)和中国 TC260 的人工智能安全治理框架(2024 年 9 月),相继出台, 标志着人工智能开发和部署的更严格监管的开始,包括强制执行“从部署者那里获得对 AI 系统在决策过程中角色的清晰且有意义的解释,以及所作决策的主要要素”(2026 年第 86 条)。在这一点上,XAI 可以发挥其最佳作用。然而,尽管经过多年的严格研究和对可解释性的日益重视,这一话题似乎已经逐渐淡出人们的视野。真的是这样吗?现在,让我们从全局角度重新审视这一切。
2. 人工智能的兴奋与现在
今天是处于科技世界的一个激动人心的时刻。在 1990 年代,Gartner 提出了一个叫做炒作周期的方法论,用来描述新兴技术如何随时间演变——从最初的兴趣激发到社会应用。根据这一方法论,技术通常从创新突破(即“技术触发”)开始,随后迎来激动人心的快速上升,最终达到“过高期望的顶峰”。然而,当技术未能按预期交付时,它会跌入“失望的谷底”,此时热情消退,人们感到沮丧。这个过程可以描述为一条陡峭的上升曲线,最终会下行至低点,然后平稳上升,进入所谓的“生产力平台”。后者意味着,随着时间的推移,某项技术可以变得真正具有生产力,尽管围绕它的炒作已不再那么强烈。
图 3. 2024 年人工智能的炒作周期(来源:Gartner)
看看以前那些被认为能够解决一切的技术——智能代理、云计算、区块链、大脑-计算机接口、大数据,甚至深度学习。它们都在科技界取得了辉煌的地位,但当然,它们都没有成为万能的解决方案。现在,关于可解释性的话题也有类似的情况。我们可以一次又一次地看到历史的重复。如 2024 年 Gartner 人工智能热潮周期所强调的(图 3),负责任的人工智能(RAI)正逐渐获得更多关注(左上角),预计将在未来五年内达到成熟。可解释性为 RAI 实践提供了基础,促进了人工智能系统中的透明度、问责制和公平性。
下图概述了 XAI(可解释人工智能)研究的趋势和应用,来源于 2018 年至 2022 年间发表的科学文献,涵盖了 XAI 领域的各个概念,包括“可解释人工智能”、“可解释性人工智能”和“负责任的人工智能”[Clement et al., 2023]。图 4a 根据元综述结果概述了 XAI 的关键研究领域。最大的一部分(44%)集中在设计可解释性方法,其次是 15%专注于 XAI 在特定应用场景中的应用。依赖领域的研究(如金融)占 12%,而其他小领域——需求分析、数据类型和人机交互——各自占约 5-6%。
图 4.XAI 研究视角(a)和应用领域(b)(来源: Clement et al., 2023)
旁边是常见的应用领域(图 4b),其中医疗保健居领先地位(23%),由建立信任和支持决策的需求推动。工业 4.0(6%)和安全(4%)紧随其后,可解释性被应用于工业优化和欺诈检测。其他领域包括自然科学、法学、机器人技术、自动驾驶、教育和社会科学 [Atakishiyev et al., 2024, Chen et al., 2023, Loh et al., 2022]。随着 XAI 向可持续状态发展,研究和开发越来越集中于解决公平性、透明性和问责制问题 [Arrieta et al., 2020, Responsible AI Institute Standards, Stanford AI Index Report]。这些维度对于确保公平结果、澄清决策过程并为这些决策建立责任至关重要,从而促进用户信任,并与监管框架和行业标准保持一致。反映过去技术进步的轨迹,XAI 的崛起突显了在构建 AI 驱动解决方案方面的挑战和机遇,确立了它作为负责任 AI 实践中一个重要元素的地位,增强了 AI 在现实应用中的长期相关性。
3. 将焦点重新放回到 XAI(可解释的人工智能)
3.1. 为什么以及何时需要模型理解——可解释性基础
这是对人工智能系统的一个普遍看法:你输入数据,然后系统就像一个黑箱一样处理它,产生输出,但我们无法检查系统的内部工作原理。但真的是这样吗?随着人工智能的不断发展,开发可靠、可扩展且透明的系统变得越来越重要。简而言之:可解释人工智能的理念可以描述为采取某些方法来提供更清晰的理解,说明输入和输出之间发生了什么。从广义上讲,可以将其视为一组方法,允许我们构建能够提供理想结果的系统。在实践中,模型理解可以定义为生成用户能够理解的模型行为解释的能力。这种理解在各行各业的各种应用场景中都至关重要,包括:
-
模型调试和质量保证(例如,制造业、机器人技术);
-
确保系统对终端用户的可信度(医学、金融);
-
通过识别模型可能失败的场景来提高系统性能(银行欺诈检测、电子商务);
-
增强系统对抗敌对行为的鲁棒性(网络安全、自动驾驶汽车);
-
解释决策过程(如信用评分中的金融、司法决策中的法律);
-
检测数据标注错误及其他问题(零售中的客户行为分析、医疗健康中的医学影像)。
人工智能的广泛采用使其在各个领域和风险应用中得到了广泛使用。归根结底,人类理解与模型理解并不相同。虽然人工智能模型处理信息的方式对人类来说并不直观,但可解释人工智能的主要目标之一是创建能够有效传达推理过程的系统——换句话说,能够以对最终用户可理解且有意义的方式“发声”。因此,问题就变成了:我们如何弥合模型“知道”的内容与人类如何理解其输出之间的差距?
3.2. 它是为谁服务的——可解释人工智能的利益相关者期望
可解释人工智能不仅仅是对模型的解释,还涉及到通过知识转移让机器有效地支持人类。为了应对这些方面,可以思考如何将可解释性与涉及人工智能生态系统的各种角色和利益相关者的期望联系起来。这些群体通常包括用户、开发者、部署者、受影响方和监管者[Leluschko&Tholen,2023, Sadek 等人,2024]。因此,他们的期望——即他们对人工智能的功能和结果的预期——也会有所不同,这表明可解释性需要满足广泛的需求和挑战。在这项研究中,Langer 等人,2021强调了理解在解决认识论方面的关键作用,指的是利益相关者评估系统是否满足他们期望的能力,比如公平性或透明度。例如,在医学诊断等高风险场景中,可能需要更深层次的解释以建立信任[Saraswat 等人,2022]。图 5 展示了一个概念模型,概述了从可解释性方法到满足利益相关者需求的路径,而这些需求又反过来影响它们是否得到满足。那么,什么构成一个“好的”解释呢?该研究认为,它不仅应该准确、具有代表性,并且与系统及其功能的上下文相关,还应该符合社会伦理和法律考虑,这些因素可能在为某些期望提供正当理由时起决定性作用。
图 5:可解释性与利益相关者期望的关系(来源: Langer 等人,2021)
在这里,我们可以说,XAI(可解释人工智能)作为技术的成功,依赖于它如何通过解释性信息有效地促进人类理解,强调了在利益相关者之间仔细平衡权衡的重要性。例如,对于领域专家和用户(如医生、法官),他们需要解读和审核 AI 系统输出结果以进行决策,因此确保可解释性结果简洁且具有领域针对性非常重要,以便与专家直觉对接,同时避免信息过载,尤其在涉及人类干预的应用中更为重要。在这种情况下,挑战可能出现在输入和输出之间的不确定性和缺乏清晰因果关系上,这可以通过针对特定用例的局部事后解释来解决[Metta 等人,2024]。受影响方(例如,求职者、患者)是受 AI 决策影响的个体,公平性和伦理性是关键问题,特别是在招聘或医疗等领域。在这种情况下,可解释性方法可以帮助识别在决策过程中导致偏见的因素,从而进行缓解或至少承认并消除偏见[Dimanov 等人,2020]。同样,监管机构可能希望确定一个系统是否对某一群体存在偏见,以确保其符合伦理和监管标准,特别关注透明度、可追溯性和高风险应用中的非歧视性[Gasser & Almeida, 2017,Floridi 等人,2018,欧盟 AI 法案 2024]。
图 6. 机器学习生命周期中的可解释性 (来源: Decker 等人,2023)
对于采用人工智能的企业和组织来说,挑战可能在于确保在符合监管和行业标准的前提下负责任地实施 AI,同时保持用户的信任[Ali et al., 2023, Saeed & Omlin, 2021]。在这种情况下,使用全球性解释并将 XAI 融入机器学习生命周期(图 6)中,可能特别有效[Saeed & Omlin, 2021, Microsoft Responsible AI Standard v2 General Requirements, Google Responsible AI Principles]。总体而言,监管机构和部署者都旨在了解整个系统,以尽量减少不合理的极端情况。在从业者(如开发者和研究人员)方面,他们可能对利用 XAI 工具诊断和改善模型性能感兴趣,同时推进现有解决方案,通过可解释性界面提供关于模型推理的详细信息[Bhatt et al., 2020]。然而,这些工具可能伴随高昂的计算成本,使大规模部署变得具有挑战性。在这种情况下,XAI 开发堆栈可以包括开源和专有工具包、框架和库,例如PyTorch Captum、Google Model Card Toolkit、Microsoft Responsible AI Toolbox、IBM AI Fairness 360,以确保从开发到部署以及后续阶段,构建的系统是安全、可靠和值得信赖的。
正如我们所看到的——“一刀切”并不适用。持续的挑战之一是提供既准确又有意义的解释,满足不同利益相关者的需求,同时在实际应用中平衡透明度和可用性[Islam et al., 2022, Tate et al., 2023, Hutsen, 2023]。现在,让我们以更实际的角度来讨论 XAI。
4. 视觉模型的可解释性
4.1. 特征归因方法
随着人工智能系统的进步,现代方法在复杂任务中的表现有了显著改善,例如图像分类(图 2),超越了早期依赖手工算法进行视觉特征提取和检测的图像处理技术[Sobel and Feldman, 1973, Canny, 1987]。虽然现代深度学习架构本身并不具备可解释性,但已经提出了多种解决方案,用于为给定输入提供模型行为的解释,从而弥合人类(理解)与机器(过程)之间的差距。继深度学习突破之后,各种 XAI(可解释人工智能)方法应运而生,旨在增强计算机视觉领域的可解释性方面。下面的图 7 描述了过去几十年中开发的几种常用的 XAI 方法,专注于图像分类和目标检测应用:
图 7. 计算机视觉的可解释性方法(作者提供的图像)
XAI 方法可以根据其方法论大致分为基于反向传播的方法和基于扰动的方法,而解释范围则可以是局部的或全局的。在计算机视觉中,这些方法或它们的组合用于揭示模型预测背后的决策标准。基于反向传播的方法将信号从输出传播到输入,为在前向传播过程中计算的每个中间值分配权重。然后,梯度函数更新模型中的每个参数,以使输出与真实值对齐,这些技术也被称为基于梯度的方法。示例包括显著性图[Simonyan et al., 2013]、集成梯度[Sundararajan et al., 2017]、Grad-CAM[Selvaraju et al., 2017]。相比之下,基于扰动的方法通过遮挡[Zeiler & Fergus, 2014]、LIME[Ribeiro et al., 2016]、RISE[Petsiuk et al., 2018]等技术修改输入,评估这些轻微变化如何影响网络输出。与基于反向传播的方法不同,扰动技术不需要梯度,因为单次前向传播就足以评估输入变化如何影响输出。
对于“黑箱”架构,通常通过模型训练后采用外部事后方法实现可解释性(例如,CNN 的梯度)。相对而言,“白箱”架构本身具有可解释性,在这种架构中,可解释性可以作为模型训练的副产品来实现。例如,在线性回归中,通过求解线性方程组得到的系数可以直接用于为输入特征分配权重。然而,尽管在处理线性回归时,特征重要性较为直观,但更复杂的任务和高级架构会考虑输入与输出之间高度非线性的关系,因此需要外部的可解释性方法来理解和验证哪些特征对预测有最大的影响。也就是说,使用线性回归来进行计算机视觉任务并不是一个可行的方案。
4.2. XAI 的评估指标
评估解释对于确保从模型中提取的见解及其通过可解释性界面展示给最终用户的方式是有意义的、有用的且值得信赖的至关重要 [Ali et al., 2023]。XAI 方法日益多样化,迫使我们进行系统化的评估和比较,摆脱主观的“眼见为实”的方法. 为了解决这一挑战,研究人员设计了多种算法和基于用户的评估技术,并提出了框架和分类法,用以捕捉解释的主观与客观、定量与定性属性 [Doshi-Velez & Kim, 2017, Sokol & Flach, 2020]。可解释性是一个谱系,而非二元特征,其有效性可以通过评估某些属性的实现程度来量化。对 XAI 评估方法进行分类的一种方式是基于所谓的 Co-12 属性 [Nauta et al., 2023],这些属性按内容、展示和用户维度分组,概括如表 1 所示。
表 1. 用于评估的 Co-12 解释质量属性(来源: Nauta et al., 2023)
在更细粒度的层面上,XAI(可解释人工智能)的定量评估方法可以纳入一些指标,如忠实度、稳定性、保真度和明确性[Alvarez-Melis & Jaakkola, 2018、Agarwal et al., 2022、Kadir et al., 2023],从而能够衡量解释的内在质量。例如,忠实度衡量解释与模型行为的一致性,侧重于为目标类别预测选择的特征的重要性。Qi et al., 2020展示了一种通过集成梯度进行特征重要性分析的方法,强调生成忠实的模型行为表示的重要性。稳定性指的是在类似输入之间解释的一致性。Ribeiro et al., 2016对 LIME 的研究强调了稳定性在生成可靠解释中的重要性,稳定的解释不会因为细微的输入变化而发生剧烈波动。保真度反映了解释与模型决策过程的准确匹配程度。Doshi-Velez & Kim, 2017在其可解释机器学习框架中强调了保真度,认为高保真度对可信赖的 AI 系统至关重要。明确性涉及人类理解解释的难易程度。Alvarez-Melis & Jaakkola, 2018通过自解释神经网络(SENN)讨论了解释性中的鲁棒性,SENN 在追求明确性的同时,也注重稳定性和忠实度。
为了联系这些概念,如表 1 所述,正确性属性是指解释与被解释模型之间的忠实度,表示解释反映“真实”黑盒行为的真实性。这一属性不同于模型的预测准确性,而是对 XAI 方法在模型功能方面的描述性[Naute et al., 2023, Sokol & Vogt, 2024]。理想情况下,解释应该是“完全真实的”,因此需要较高的正确性。通过删除得出的忠实度得分可以通过计算曲线下的标准化面积来获得,该曲线表示两种特征重要性函数之间的差异:一种是通过逐渐移除特征(从最不相关的特征开始 — LeRF)并在每一步评估模型性能,另一种则是删除顺序随机(随机顺序 — RaO)[Won et al., 2023]。计算两种曲线的点数是从将完整图像输入模型开始,接着逐渐移除像素,这些像素的特征重要性低于某个阈值,且由归因方法分配。得分越高,意味着模型在删除冗余特征时,仍能更好地保留重要信息(公式 1)。
公式 1. 通过删除评估特征重要性的忠实度度量计算
评估忠实度的另一种方法是通过插入计算特征重要性,类似于上述方法,但通过逐步展示模型由归因方法识别出的最相关的图像区域。这里的关键思想是:包含重要特征并观察结果。在演示中,我们将探讨评估模型解释的定性和定量方法。
5. 精细分类的特征重要性
在细粒度分类任务中,如区分不同类型的车辆或识别鸟类物种,视觉外观的微小变化可能会显著影响模型的预测结果。确定哪些特征对模型决策过程最为重要,有助于揭示误分类问题,从而能够优化模型的任务表现。为了展示如何有效地应用可解释性方法来加深对深度学习视觉模型的理解,我们将考虑鸟类分类的应用案例。鸟类种群是重要的生物多样性指标,因此收集物种及其在不同环境中的相互作用的可靠数据对生态学家来说至关重要[Atanbori et al., 2016]。此外,自动化鸟类监测系统也能为风电场生产商带来好处,因为建设过程中需要在设计阶段进行初步的碰撞风险评估和缓解[Croll et al., 2022]。本部分将展示如何应用 XAI 方法和指标来增强鸟类物种分类模型的可解释性(更多相关内容可以参考文章和教程)。
下图展示了使用在 ImageNet 上预训练并在 Caltech-UCSD Birds-200–2011 数据集上微调的 ResNet-50 进行细粒度图像分类的特征重要性分析结果。对 Guided Grad-CAM 方法进行了定性评估,以评估给定模型的选定特征的重要性。定量 XAI 指标包括通过删除(FTHN)评估的忠实度,值越高表示忠实度越好,同时还有反映非稳健性和不稳定性程度的指标,如最大敏感性(SENS)和不忠实度(INFD),其中较低的值为佳。后者指标基于扰动,依赖于假设解释应随着输入数据或模型本身的微小变化保持一致的前提[Yeh et al., 2019]。
图 8:评估细粒度图像分类的可解释性指标(图像由作者提供)
当在北方红雀的独立测试图像上评估我们的模型时,我们注意到在初始迭代过程中模型得分的轻微变化之后,随着最关键特征的逐步加入,最终迭代的得分急剧增加(图 8)。这些结果表明,对于评估的 XAI 方法,模型的忠实性有两个关键解释。首先,使用引导型 Grad-CAM 的基于归因的可解释性忠实于模型,因为添加被识别为冗余的区域(90%的 LeRF,x 轴)对模型得分的影响很小(预测概率得分低于 0.1)。这意味着模型在做出预测时并没有依赖这些区域,而是依赖于剩余的前 10%最相关的特征。另一类——鲁棒性——指的是模型对小的输入变化的抗干扰能力。在这里,我们可以看到,原始图像约 90%的变化对模型整体性能几乎没有影响,尽管大部分像素发生变化,模型仍能保持目标概率得分,这表明模型在目标类别预测上的稳定性和泛化能力。
为了进一步评估我们模型的鲁棒性,我们计算了额外的指标,如敏感性和失真[Yeh et al., 2019]。结果表明,尽管模型对输入中的轻微扰动不太敏感(SENS=0.21),但对最重要区域的改动可能会对模型决策产生影响,尤其是对于前 10%的区域(图 8)。为了更深入地评估模型解释的敏感性,我们可以进一步扩展可解释性方法列表,例如使用集成梯度和 SHAP[Lundberg & Lee, 2017]。此外,为了评估模型对对抗性攻击的抵抗力,下一步可能包括量化更多的鲁棒性指标[Goodfellow et al., 2015, Dong et al., 2023]。
结论
本文提供了对过去几十年发表的科学文献的全面概述,涵盖了深度学习和计算机视觉领域的关键里程碑,这些里程碑为 XAI(可解释人工智能)领域的研究奠定了基础。回顾这一领域最近的技术进展和前景,我们讨论了在新兴的 AI 监管框架和负责任的 AI 实践背景下,XAI 可能带来的影响,并预见到可解释性在未来将变得更加重要。此外,我们还考察了 XAI 的应用领域,探索了各利益相关方的需求,并提出了如何应对当前挑战、满足需求的实践建议,以创造可靠和值得信赖的 AI 系统。我们还涵盖了与可解释性相关的基本概念和分类法,常用的视觉方法和技术,以及用于评估事后解释的定性和定量指标。最后,为了展示如何利用可解释性加深对深度学习模型的理解,最后一节呈现了一个案例,展示了 XAI 方法和指标如何有效应用于精细分类任务,以识别影响模型决策的相关特征,并对结果进行定性和定量评估,从而验证所得到的解释的质量,特别是相对于模型推理的合理性。
接下来是什么?
在接下来的文章中,我们将进一步探讨可解释性的主题及其实际应用,重点讨论如何在设计中利用 XAI 优化模型性能并减少分类错误。想继续了解吗?请关注更多资料,访问——github.com/slipnitskaya/computer-vision-birds
和 medium.com/@slipnitskaya
。
12 个 RAG 痛点及解决方案
解决检索增强生成的核心挑战
https://medium.com/@wenqiglantz?source=post_page---byline--43709939a28c--------------------------------https://towardsdatascience.com/?source=post_page---byline--43709939a28c-------------------------------- Wenqi Glantz
· 发表在 Towards Data Science · 18 分钟阅读 · 2024 年 1 月 30 日
–
图片改编自 《工程化检索增强生成系统的七个失败点》
· 痛点 1:缺失内容
· 痛点 2:错过了排名靠前的文档
· 痛点 3:缺乏上下文 — 整合策略的局限性
· 痛点 4:未提取
· 痛点 5:格式错误
· 痛点 6:不正确的特异性
· 痛点 7:不完整
· 痛点 8:数据摄取的可扩展性
· 痛点 9:结构化数据 QA
· 痛点 10:从复杂的 PDF 中提取数据
· 痛点 11:回退模型
· 痛点 12:LLM 安全性
受 Barnett 等人论文 《工程化检索增强生成系统的七个失败点》 启发,本文将探讨该论文中提到的七个失败点以及在开发 RAG 管道过程中遇到的五个常见痛点。更重要的是,我们将深入分析这些 RAG 痛点的解决方案,以便在日常 RAG 开发中更好地应对这些问题。
一种新的方法来检测大型语言模型的“虚构”幻觉
通过使用第二个 LLM 计算语义熵,我们可以更好地标记那些由于缺乏知识而被认为不可靠的答案
https://lucianosphere.medium.com/?source=post_page---byline--19444475fc7e--------------------------------https://towardsdatascience.com/?source=post_page---byline--19444475fc7e-------------------------------- LucianoSphere (Luciano Abriata, PhD)
·发布于Towards Data Science ·阅读时间 10 分钟·2024 年 6 月 25 日
–
图片由Jametlene Reskp提供,来自Unsplash
正如你所知道的,人工智能在过去两年中取得了巨大进展,特别是在大型语言模型(LLMs)的开发和大规模部署方面。这些模型似乎具有令人印象深刻的推理和问答能力;然而,一个持久的挑战是它们倾向于“幻觉”,即生成带有虚假或随意内容的输出。这些幻觉可能带来严重后果,因此当前大量 LLM 开发的研究都在致力于尽可能抑制它们。为此,一篇新论文提出了一种名为“语义熵”的方法,能够识别和减轻由知识缺乏引起的特定类型幻觉,即所谓的“虚构”。不用多说,这对在多个应用场景中更可靠地使用 LLM 非常有用,尤其是在那些需要事实知识的应用中。值得注意的是,量化语义熵需要应用第二个 LLM 来评估 LLM 生成的序列之间的相似性。继续阅读以了解更多细节和一些示例。
17 种(高级)RAG 技术,将你的 LLM 应用程序原型转变为可投入生产的解决方案
一系列 RAG 技术,帮助你将 RAG 应用程序开发成一个强大且持久的系统
https://dmnkplzr.medium.com/?source=post_page---byline--5a048e36cdc8--------------------------------https://towardsdatascience.com/?source=post_page---byline--5a048e36cdc8-------------------------------- Dominik Polzer
·发布于Towards Data Science ·阅读时间:24 分钟·2024 年 6 月 26 日
–
现在人们成为生成式 AI 专家的速度令人惊叹。每个人都宣称,生成式 AI 将带来下一次工业革命。
这是一个大承诺,但我同意,我认为这次是真的。AI 将最终彻底改变我们的工作和生活方式。我无法想象滑入下一个AI 冬天。
大型语言模型(LLMs)和多模态模型简直太有用了,而且“相对”容易集成到现有的流程中。一个向量数据库,几行代码来处理原始数据,再加上几次 API 调用。
就是这样。— 至少在理论上是这样。
尽管听起来相当直接,但行业中的真正进展可能更好地通过Matt Turck 最近的一篇 LinkedIn 帖子来描述:
2023 年:“我希望生成式 AI 不会把我们全部杀掉!”
2024 年:“我希望生成式 AI 能在我公司从概念验证实验,发展到小规模生产部署,在接下来的 12 到 18 个月内能读取 PDF!”
- Matt Turck
构建一个原型很容易。将其转变为可投入生产的系统则非常困难。
你应该注意的两个隐秘的 PySpark 错误
在处理大型数据集时,小错误可能会导致严重后果。
https://sonery.medium.com/?source=post_page---byline--de52c3a188c4--------------------------------https://towardsdatascience.com/?source=post_page---byline--de52c3a188c4-------------------------------- Soner Yıldırım
·发布于 Towards Data Science ·阅读时间:5 分钟·2024 年 2 月 16 日
–
图片来源:Ernie A. Stephens 通过 Unsplash
在编程中,当我们犯错时,并不总是会报错。代码能够正常工作,不会抛出异常,我们以为一切都没问题。那些不会导致脚本失败的错误,很难被发现和调试。
在数据科学中,发现这些错误更具挑战性,因为我们通常不会得到一个单一的输出结果。
假设我们有一个包含数百万行的数据集。我们在计算销售数量时犯了一个错误。然后,我们基于销售数量创建了聚合特征,如每周总数、过去 14 天的移动平均等。这些特征被用于一个机器学习模型,该模型预测下一周的需求。
我们评估预测结果,发现准确率不够好。然后,我们花了很多时间尝试不同的方法来提高准确率,比如特征工程或超参数调优。这些策略对准确率的影响不大,因为问题出在数据上。
这是我们在处理大型数据集时可能遇到的一个场景。在本文中,我们将讨论两个可能导致意外结果的 PySpark 错误。
2023 年回顾:疾病与健康的一年
分析我自己的数据,以更好地理解我的健康模式
https://medium.com/@artfish?source=post_page---byline--d46c9e87d125--------------------------------https://towardsdatascience.com/?source=post_page---byline--d46c9e87d125-------------------------------- Yennie Jun
·发表于《数据科学前沿》 ·10 分钟阅读·2024 年 1 月 23 日
–
对我在 2023 年个人健康和疾病日子的概览,由作者创作。
这篇文章最初发表于 Art Fish Intelligence.
每年初,我都会对前一年的数据进行分析,以反思过去发生的一切。
去年,即 2022 年,我对自己的哭泣模式进行了深入调查。
使用我自己收集的数据调查我的哭泣模式
towardsdatascience.com
今年,即 2023 年,我分析了自己的疾病与健康模式。
在这篇文章中,我展示了我在 2023 年收集并分析的个人数据概览,并给出了一些关于如何在 2024 年过上更健康、更好生活的结论。
数据收集概述
我的数据来自以下几个来源:
-
Google Maps 位置历史
-
Apple Health
-
每天结束时我填写的关于日常习惯的调查问卷
在整合来自不同数据源的数据后,我得到了大量的…
2024 年亮点:引起轰动的人工智能与数据科学文章
https://towardsdatascience.medium.com/?source=post_page---byline--2c0979b4d595--------------------------------https://towardsdatascience.com/?source=post_page---byline--2c0979b4d595-------------------------------- TDS 编辑团队
·发布于 Towards Data Science ·作为 新闻简报 发送 ·6 分钟阅读·2024 年 12 月 19 日
–
想在 2024 年结束前写下你的第一篇 TDS 文章吗?我们始终欢迎新作者的投稿。
就这样,2024 年(几乎)已经接近尾声。这是一个充满激动人心的过渡之年——对TDS 团队而言是如此,对数据科学、机器学习和人工智能社区而言,也以许多重要的方式如此。我们想感谢大家——读者、作者以及追随者们,感谢你们的支持,感谢你们通过精彩的投稿和评论让我们保持忙碌并积极参与其中。
与 2023 年不同,去年一个事件(ChatGPT 的发布,距年初仅几周)让所有人停下脚步,几个月内都在主导讨论。今年,我们经历了一种更具累积性和碎片化的转变感。各行各业的从业者和学者们不断尝试新工具,努力寻找创新的方式,从 LLM 的快速崛起中获益;与此同时,他们还不得不应对充满挑战的就业市场,以及一个人工智能的足迹越来越接近他们日常工作流程的世界。
图片来自 Oskars Sylwan 在 Unsplash
为了帮助你理解这些发展,我们在过去的一年里发布了超过 3,500 篇文章,其中包括数百篇首次投稿的文章。我们的作者具有将独特视角融入任何他们所写话题的惊人能力——从大问题和时事话题到更聚焦的技术挑战——我们为 2024 年发布的每一篇文章感到自豪。
在这大量的创意输出中,有些文章特别能够引起读者的共鸣,我们将这一期的《Variable》专刊献给这些文章:我们最受阅读、讨论和分享的文章。如你所料,它们涉及的主题非常广泛,因此我们决定按照今年我们发现的主要主题来排列它们:从零开始学习和构建,RAG 和 AI 代理,职业成长,以及突破和创新。
我们希望你喜欢探索我们的 2024 年亮点,并祝你度过一个轻松的年终假期——2025 年 1 月见!
从零开始学习和构建
最受欢迎的 TDS 文章类型通常是那些教读者如何独立完成有趣且富有成效的事情,并且要求最低的前提条件。今年也不例外——我们 2024 年最受欢迎的三篇文章都属于这一类别。
-
**你可以在这个周末构建的 5 个 AI 项目(使用 Python)**从适合初学者到高级的项目创意,Shaw Talebi展示了任何人都可以亲手实践 AI。
-
从零开始使用初中数学理解 LLMsLLM 是如何工作的?Rohit Patel提供了你能找到的最易懂且富有吸引力的解释之一。
-
**如何自学 AI(自学指南)**对于那些自我驱动的学习者,Thu Vu为学习 AI 的基本构建块提供了一条精简的学习路线图。
-
神经网络背后的数学为了理解神经网络——“现代 AI 的支柱”,Cristian Leo带领我们深入探讨其底层的数学原理。
-
文本嵌入:全面指南嵌入使得 LLM 的魔力成为可能,Mariya Mansurova的详细介绍让我们清楚地了解了它们如何以及为什么变得如此重要。
-
我如何在两周内学习 LLM:一份全面的学习路线图另一份优秀的学习资源来自于Hesam Sheikh,他为我们讲解了一个密集但易于理解的课程,让我们掌握了大型语言模型的基础知识(以及更多)。
RAG 和 AI 代理
当 LLM 初步的兴奋感平息(稍微)之后,数据和机器学习专业人士意识到,这些强大的模型在开箱即用的情况下并不那么有用。检索增强生成(RAG)和代理 AI 在过去一年中成为了两种主流方法,它们架起了模型潜力和实际应用价值之间的桥梁;它们也成为了我们最近几个月覆盖最多的技术话题。
-
LangChain 与 LLM 代理入门:当 RAG 不足以满足需求时早在三月——并且远远走在前沿——Alex Honchar发布了关于使用代理的终极入门指南。
-
使用 LangChain ReAct 代理在 RAG 系统中回答多跳问题在这篇教程中,Dr. Varshita Sher向我们展示了代理和 RAG 如何相互补充,她解决了在内部文档中回答复杂查询的普遍需求。
-
17 种 (高级) RAG 技术,将你的 LLM 应用原型转变为生产就绪的解决方案构建一个基础的 RAG 流水线是一回事;将其优化到可以在商业环境中实际工作的程度又是另一回事。Dominik Polzer整理了一份全面的指南,介绍了你可以利用的各种方法来实现这一宏大目标。
-
12 个 RAG 痛点及其解决方案在类似的故障排除话题中,Wenqi Glantz概述了十二种简化的方法,帮助解决实践者在实施 RAG 时遇到的一些常见挑战。
-
选择 LLM 代理框架在一个每天都有主要和新兴玩家发布新工具的生态系统中,做出明智选择可能很困难。Aparna Dhinakaran提供了关于需要考虑的权衡的深刻见解,帮助我们做出决策。
职业成长
数据科学和机器学习的职业道路不断发展,适应这种变化的环境可能会给许多专业人士带来不小的压力,无论他们是已经深耕职业生涯,还是刚刚起步。我们喜欢发布关于这个话题的个人反思,尤其当这些反思还能为读者提供务实建议时——以下是我们(以及我们的读者)认为特别值得关注的四个反思。
-
在 Uber、Meta 和初创公司工作的 10 年让我学到了关于数据分析的那些事从讲故事的重要性和商业敏锐度到指标的局限性,Torsten Walbaum慷慨地将十年的工作经验总结为可操作的见解。
-
我在自由职业数据科学家岗位上的前三个月所学职业转型总是充满挑战,从公司工作的结构转向自雇世界也伴随着一系列挑战——正如CJ Sullivan所展示的那样,这也为学习和成长提供了巨大的机会。
-
我是如何成为数据科学家的——没有计算机科学学位,没有训练营对于任何刚踏入这个领域的人来说,Egor Howell关于自己进入数据科学的坦诚叙述是一本必读之作。
-
我花费了 96 万美元成为数据科学家。以下是所有初学者必须知道的 5 个关键课程从另一个角度讨论如何进入这个领域,Khouloud El Alami提供了关于如何管理你的数据科学教育的实用建议,帮助你走上正确的道路。
突破与创新
紧跟前沿研究和新工具有时会让人感到不知所措,这也是为什么我们对顶级论文解析以及新兴库和模型的入门教程特别钟情。这里有三篇文章特别引起了我们的读者的共鸣。
-
一种新的相关系数“如果有人告诉你,存在一种新方法可以衡量两个变量之间的关系,类似于相关系数,但可能更好,你会怎么想?”这就是Tim Sumner在其关于 2020 年一篇开创性论文的解释文章中的开头。
-
**DSPy 简介:告别提示词,迎接编程!**在又一个激动人心的开源工具年份里,DSPy 作为新晋工具之一脱颖而出,旨在为程序员打开大型语言模型(LLM)的应用,并简化构建模块化 AI 解决方案的过程。Leonie Monigatti的动手实践介绍是开始探索其潜力的完美起点。
-
Kolmogorov-Arnold 网络:神经网络的最新进展,简单明了地解释KANs,“作为多层感知器(MLP)的有前景的替代方案”,在去年春天引起了轰动;Theo Wolf通过这篇易懂的入门文章,阐明了它们对机器学习从业者的影响及潜在好处。
感谢您在 2024 年对我们作者工作的支持!如果写作是您 2025 年的目标之一,何不现在就开始呢?不要犹豫,与我们分享您的作品。
直到下一个 Variable,我们将在 1 月的第一周与您见面,
TDS 团队
2024 年回顾:我对 2024 年的预测正确与错误,以及对 2025 年更大胆的预测
我对 2024 年趋势的正确与错误的看法,以及对未来一年更大胆的预测
https://medium.com/@iamleonie?source=post_page---byline--4092c2d726cd--------------------------------https://towardsdatascience.com/?source=post_page---byline--4092c2d726cd-------------------------------- Leonie Monigatti
·发布于Towards Data Science ·8 分钟阅读·2024 年 12 月 17 日
–
AI 流行语和趋势宾果游戏(图片由作者提供)
在 2023 年,构建 AI 驱动的应用充满了希望,但挑战已经开始显现。到了 2024 年,我们开始尝试一些技术,来应对将这些应用投入生产中的艰难现实。
去年,我回顾了 2023 年 AI 领域的最大趋势并对 2024 年做出了预测。今年,我不打算列出时间线,而是专注于关键主题:出现了哪些趋势?我哪里预测错了?我们可以期待 2025 年会发生什么?
2024 年回顾
如果我必须总结 2024 年 AI 领域的情况,那就是“船长,今天是星期三”这个梗。今年的重大发布数量令人震惊。我不怪任何一个在这个领域感到疲惫的人,尤其是到了年底。这真是一次疯狂的旅程,而且很难跟得上。让我们回顾一下 AI 领域的关键主题,看看我去年是否正确预测了这些变化。
评估
让我们从一些已投入生产的生成型 AI 解决方案开始。数量并不多。正如 A16Z 的调查报告所显示,2024 年,许多公司仍然对在面向客户的应用中部署生成型 AI 感到犹豫。相反,它们更愿意将其用于内部任务,如文档搜索或聊天机器人。
那么,为什么目前市面上并没有那么多面向客户的生成式 AI 应用呢?可能是因为我们仍在摸索如何正确评估它们。这是我对 2024 年的预测之一。
很多研究涉及使用另一个 LLM 来评估 LLM 的输出(LLM-as-a-judge)。虽然这种方法可能很巧妙,但由于增加了成本、引入了偏见以及不可靠性,它也并不完美。
回顾过去,我曾预计今年会解决这个问题。然而,今天来看,尽管这一话题是讨论的重点,但我们依然没有找到一种可靠的方式来有效评估生成式 AI 解决方案。虽然我认为 LLM 作为评判工具是我们唯一能够大规模评估生成式 AI 解决方案的方法,但这也表明我们在这个领域仍处于早期阶段。
多模态性
尽管这对许多人来说可能是显而易见的,但我并没有把它纳入我 2024 年的预测中。随着GPT4、Llama 3.2和ColPali的发布,多模态基础模型成为 2024 年的一个重要趋势。尽管我们开发者忙于弄清楚如何在现有管道中使 LLM 发挥作用,研究人员却已经走在了前面,他们已经在构建能够处理多种模态的基础模型。
“绝对不可能在没有让机器从高带宽感官输入(如视觉)中学习的情况下,我们能达到人类水平的 AI。” — Yann LeCun
以 PDF 解析作为多模态模型在文本到图像任务之外的有用示例。ColPali的研究人员通过使用视觉语言模型(VLMs)避免了 OCR 和布局提取的复杂步骤。像 ColPali 和ColQwen2这样的系统将 PDF 作为图像处理,直接提取信息,无需预处理或分块。这提醒我们,简单的解决方案往往来源于改变问题的框架方式。
多模态模型的变革比看起来更为深远。PDF 文档的搜索仅仅是开始。基础模型中的多模态性将为各行各业的应用解锁全新的可能性。随着模态的增多,AI 不再仅仅局限于语言——它关乎于理解世界。
微调开放权重模型与量化
开源模型正在缩小与封闭模型之间的性能差距。对它们进行微调可以提升性能,同时保持轻量化。量化技术使这些模型更小、更高效(另见绿色 AI),能够在任何地方运行,甚至在小型设备上。量化与微调配合得很好,尤其是考虑到微调语言模型本身就具有挑战性(另见QLoRA)。
综合来看,这些趋势表明,未来不仅仅是更大的模型——而是更智能的模型。
由Maxime Labonne做出的精彩视觉总结。如果你对微调 LLM 感兴趣,也可以查看他的博客。
我觉得我并没有明确提到过这一点,而只是在 2024 年第二季度写了一篇关于此的文章。所以,我在这里不会给自己加分。
AI 代理
今年,AI 代理和代理工作流受到了广泛关注,正如 Andrew Ng 年初所预测的那样。我们看到Langchain和LlamaIndex开始整合代理,CrewAI获得了很大动力,OpenAI 推出了Swarm。这是另一个我没有预料到的主题,因为我之前没有深入研究过。
“我认为 AI 代理工作流将在今年推动大规模的 AI 进展——可能甚至超过下一代基础模型。” — Andrew Ng
2024 年“AI 代理”这一术语在 Google Trends 上的截图。
尽管 AI 代理引起了极大的关注,但它们也可能具有争议。首先,关于“AI 代理”及其能力仍然没有明确的定义。AI 代理只是具备工具访问能力的 LLM,还是具备其他特定能力?其次,它们带来了额外的延迟和成本。我读到很多评论说,代理系统由于这些问题不适合用于生产系统。
但我认为我们已经开始在生产环境中看到一些具有轻量化工作流的代理管道,比如将用户查询路由到特定的功能调用。我认为我们将在 2025 年继续看到 AI 代理。希望我们能得到更清晰的定义和图景。
RAG 并未死亡,信息检索正在成为主流
检索增强生成(RAG)在 2023 年获得了显著关注,并在 2024 年依然是一个关键话题,许多新的变体应运而生。然而,这仍然是一个备受争议的话题。一些人认为,随着长上下文模型的出现,RAG 正在变得过时,而另一些人则质疑这是否真的是一个新思想。虽然我认为关于术语的批评是有道理的,但我认为这个概念会持续存在(至少还会有一段时间)。
所有不同的 RAG 变体
每次发布一个新的长上下文模型时,有些人就预测这将是 RAG 管道的终结。我不认为这会发生。这个讨论本应成为一篇单独的博客文章,所以我在这里不会深入探讨,讨论会留到下一篇。让我只是说,我认为它们并不是互相排斥的,它们是互补的。相反,我们可能会将长上下文模型与 RAG 管道一起使用。
此外,在应用程序中拥有数据库并不是一个新概念。‘RAG’这一术语,指的是从知识源中检索信息以增强 LLM 的输出,面临着批评。有些人认为这不过是对其他领域(如软件工程)中长期使用的技术的重新命名。虽然我认为我们可能会在长远来看抛弃这个术语,但这一技术将继续存在。
尽管有预测认为 RAG(检索增强生成)的时代将结束,但检索依然是 AI 流程的基石。虽然我可能会因为自己在检索领域的工作而有所偏见,但我感觉这个话题在今年变得更加主流。最初,许多讨论集中在将关键词搜索(BM25)作为 RAG 流程的基准。随后,这一讨论扩展到了更广泛的密集检索模型,如ColBERT或 ColPali。
知识图谱
我完全错过了这个话题,因为我对此不太熟悉。RAG 系统中的知识图谱(例如,图 RAG)是另一个大话题。由于我目前能说的关于知识图谱的内容只是它们似乎是强大的外部知识源,因此我会简短地处理这一部分。
2024 年的关键话题表明,我们现在已经意识到仅仅构建基础模型应用程序的局限性。围绕 ChatGPT 的热潮可能已经平息,但将基础模型集成到应用中的推动力依然强劲。只不过这比我们预期的要困难得多。
“在投资者失去热情之前,争夺让 AI 更加高效和有用的竞赛已经开始。” — 经济学人
2024 年告诉我们,仅仅扩大基础模型的规模是不够的。我们需要更好的评估、更智能的检索和更高效的工作流,以使 AI 变得有用。今年我们遇到的局限性并不是停滞的标志——它们是关于我们需要在 2025 年解决的问题的线索。
我的 2025 年预测
好的,现在进入有趣的部分,我的 2025 年预测是什么?今年,我想为来年做出一些更大胆的预测,让它更有趣:
-
视频将成为一种重要的模态: 在纯文本 LLM 发展为多模态基础模型(主要是文本和图像)之后,视频自然会成为下一个模态。我可以想象更多支持视频的基础模型将会追随Sora的步伐。
-
从单次到代理式,再到人机协作: 我想象我们将开始将人类融入 AI 驱动的系统中。虽然我们从单次系统开始,但我们尚未达到由 AI 代理协调不同任务以提高结果的阶段。但 AI 代理不会取代人类,它们将赋能于人类。结合人类反馈的系统将在各个行业提供更好的成果。从长远来看,我想象我们将必须拥有在执行下一任务之前等待人类反馈的系统。
-
AI 与加密货币的融合: 坦率地说,我对整个加密货币领域了解不多,但我看到了Brian Armstrong 的这条推文,讨论 AI 代理应配备加密钱包。此外,像DePin(去中心化物理基础设施)这样的概念,在模型训练和推理方面可能值得探索。虽然这听起来像是流行语游戏,但我很想看看早期实验是否能证明这是真实的还是炒作。
-
每个 token 的延迟和成本将下降: 目前,AI 代理面临的一个大问题是延迟和成本的增加。然而,随着摩尔定律的推进和使 AI 模型更高效的研究,如量化和高效的训练技术(不仅是出于成本原因,也出于环保原因),我可以预见每个 token 的延迟和成本将逐渐降低。
我很想听听你对 2025 年 AI 领域的预测!
PS:有趣的是,几天前,我和 ChatGPT 一起研究圣诞饼干食谱,而不是使用 Google,这让我想起两年前 ChatGPT 发布时我曾想过的事情。
[## 我们明年会用 ChatGPT 代替 Google 查找圣诞饼干食谱吗?
ChatGPT 会取代搜索引擎吗?通过查找糖饼干食谱的使用案例来演示
medium.com](https://medium.com/geekculture/will-we-be-using-chatgpt-instead-of-google-to-get-a-christmas-cookie-recipe-next-year-45360d4a1178?source=post_page-----4092c2d726cd--------------------------------)
喜欢这个故事吗?
免费订阅 以便在我发布新故事时收到通知。
[## 每当 Leonie Monigatti 发布时,获取电子邮件通知。
每当 Leonie Monigatti 发布新内容时,您将收到电子邮件通知。通过注册,您将创建一个 Medium 账户(如果您还没有的话)…
在 LinkedIn,Twitter* 和* Kaggle上找到我!
2024 年机器学习工程师面试生存指南
面向初级 MLE 的年终面试准备总结
https://mengliuz.medium.com/?source=post_page---byline--e74eccef4645--------------------------------https://towardsdatascience.com/?source=post_page---byline--e74eccef4645-------------------------------- Mengliu Zhao
·发表于Towards Data Science ·14 分钟阅读·2024 年 12 月 24 日
–
找工作真不容易!
在今天的市场中,寻求与机器学习相关职位的工作比以往任何时候都更加复杂。尽管公开报告宣称机器学习工程师(MLE)的职位需求正在快速增长,但事实上,市场在过去几年已经转变为雇主市场。在 2020 年、2022 年和 2024 年寻找机器学习工作可能会是完全不同的体验。更重要的是,一些因素会导致在地理位置、领域以及职位级别之间求职难度的差异:
-
地理位置:根据AI 领域人才报告,2024 年北美招聘最多的城市包括湾区、纽约市、西雅图等。如果我们通过专业人士与职位的比例来评估找工作成功的概率,那么湾区的成功率为 3.6%。然而,如果你住在洛杉矶或多伦多,需求量则大幅降低,导致成功率下降至 1.4%,仅为湾区的 40%。如果你住在其他城市,成功率可能还会更低。
-
领域: 不同领域的机器学习工程师所需的技能集差异很大。以深度学习模型为例,计算机视觉(CV)通常使用像 ResNet、Yolo 等模型,而自然语言处理(NLP)则涉及理解 RNN、LSTM、GRU 和 Transformers;欺诈检测使用 SpinalNet;大语言模型(LLM)注重 Llama 和 GPT 的知识;推荐系统则包括对 Word2Vec 和 Item2Vec 的理解。然而,并非所有领域都招聘相同数量的机器学习工程师。如果我们查找来自 Evidently AI 的系统设计案例研究中的标签,CV 对应 30 个案例,欺诈检测对应 29 个,NLP 对应 48 个,LLM 对应 81 个,而推荐系统对应 82 个。推荐系统的用例几乎是计算机视觉的 2.7 倍。这个比例可能存在偏差,并不完全反映就业市场的实际情况,但它显示了在推荐系统领域对于机器学习工程师的更多机会。
-
资历要求。 根据365 DataScience 报告,尽管 72%的职位没有明确说明所需的工作年限(YOE),但具有 2-4 年经验的工程师需求最高。这意味着你可能会面临更大的挑战来获得入门级工作机会。(大多数需求集中在 2-4 年经验的工程师身上,可能是因为五年前 MLE 还不是一个典型职位,正如这篇博客文章中所解释的。)
本文将总结 MLE 面试准备的材料和策略。但请记住,这只是我收集到的经验列表,可能适用于你的背景或即将到来的面试,也可能不适用。希望本文能够为你职业发展的旅程提供一些启示或指导。
图片来源:pxhere.com/en/photo/655321
面试前 — 该期待什么?
面试过程可能会被延长、痛苦且孤独。当你开始申请工作时,有些事情你需要提前思考并做出相应的计划:
-
面试时间表
-
职位类型
-
公司类型
-
领域
-
地点
面试时间表。 每个公司的时间表不同。对于规模较小的公司(<500 人),通常处于种子轮或 A/B 轮阶段,面试时间通常较短,你可以预期在几周内完成申请过程。然而,对于规模较大的公司(> 1 万人或 FAANG 公司),从申请提交到最终录用阶段,可能需要 3 到 6 个月,甚至更长时间。
职位类型。 我建议参考 Chip Huyen 的《机器学习面试》书 以获取有关不同机器学习相关职位的详细讨论。MLE 的职位可能有不同的名称,例如机器学习工程师、机器学习科学家、深度学习工程师、机器学习开发者、应用机器学习科学家、数据科学家等。归根结底,典型的机器学习工程师角色是端到端的,这意味着你将从与产品经理(有时是客户)沟通并定义机器学习问题开始,准备数据集、设计和训练模型、定义评估指标、服务和扩展模型,并持续改进结果。有时公司会混淆职称,例如将 MLE 与 ML Ops 混在一起。重要的是职责,而不是职称。
公司类型。 再次, Chip Huyen 的《机器学习面试》书讨论了应用型公司与工具型公司、大公司与初创公司、B2B 与 B2C 公司的差异。此外,还值得考虑公司是上市公司还是私有公司,是否以销售为驱动或以产品为导向。这些概念不容忽视,特别是如果你正在寻找第一份行业工作,因为它们将构建你“职业的眼镜”,我们将在面试策略部分详细讨论。
领域。 如在引言部分所述,MLE 的工作可能涉及不同的领域,如推荐系统和大型语言模型(LLMs),你需要花时间准备基础知识。你需要确定一个或两个最感兴趣的领域,以最大化你的机会;然而,准备所有不同的领域几乎是不可能的,因为这会分散你的精力和注意力,使你准备不足。
地点。 除了上述所有因素外,地点是一个重要的因素。如果你住在像湾区或纽约这样的高需求地区,寻找 MLE 职位会更容易。如果无法搬迁,你可能需要为获取令人满意的工作邀请计划更长的时间线;然而,如果你保持开放的搬迁选项,申请高需求地区的职位可能是一个好主意。
面试过程中 — 如何准备?
一旦你开始申请并开始获得面试机会,有几件事是你需要搜索和准备的:
-
面试形式
-
推荐、网络
-
LinkedIn 或作品集
-
面试资源和材料
-
策略:规划、跟踪、演变、提示、评估你的水平、戴上“职业的眼镜”、找到面试伙伴、注意警示信号
-
接受 offer
面试形式
面试的形式在不同公司之间有所不同。没有两家公司对 MLE 职位的面试形式完全相同,因此你必须提前做足“功课”,研究面试的形式。例如,即使是 FAANG 公司,苹果也以其创业型的面试形式著称,这种形式在不同团队之间可能会有所不同。另一方面,Meta 往往在公司层面上有一个一致的面试形式,通常包括一到两轮 LeetCode 编程题和 ML 系统设计题。通常情况下,招聘人员会提供关于大公司面试形式的详细信息,这样你就不会感到意外。然而,小公司可能会有更少的结构化流程,且更频繁地变化。有时候,小公司会用其他编程题代替 LeetCode 编程题,且只会轻度触及建模部分,而不是进行完整的 ML 系统设计环节。你应该在像 Prepfully、Glassdoor、Interview Query 或其他付费网站上查找关于面试形式和流程的信息,以便更好地提前准备。最后,不要被面试形式所限制,因为它并不是一个标准化测试——在技术面试中可能会涉及行为元素,而在招聘经理的面试环节中可能会有技术性问题。做好准备,但要灵活,并准备好应对意外。
推荐和网络建设
许多网络文章会夸大推荐信的好处,但拥有推荐信只是让你更快通过招聘人员筛选,直接进入第二轮面试(通常是招聘经理面试)。除了拥有推荐信,面对面的网络建设几乎同样重要,例如,利用黑客马拉松的机会与公司交流,参加现场招聘会,参与由你感兴趣的公司赞助的线下志愿者活动。请不要依赖推荐信或网络建设来找工作,而是将它们作为增加你获得更多招聘人员和招聘经理面试机会的机会,以最大化面试效率。
LinkedIn 或 个人作品集。 LinkedIn 和个人作品集只是广告工具,帮助招聘人员了解你在简历中的文字信息之外的内容。作为一名初级 MLE,将课程项目和 Kaggle 挑战放在你的 GitHub 仓库中,能够展示更多相关经验,这会有所帮助;然而,随着你职位的晋升,玩具项目的意义就不那么大了,但在大型开源项目中的 PR、深刻的文章和分析、SOTA 研究或工具箱的教程,将使你从其他候选人中脱颖而出。
面试资源和材料
一般来说,你需要涵盖五个领域的材料:i) 编程,ii) 行为,iii) 机器学习/深度学习基础,iv) 机器学习系统设计,以及 v) 一本关于 MLE 面试的通用建议书。
i) 编程。如果你不是 LeetCode 专家,那么我建议你从以下资源开始:
[## NeetCode
更好的编程面试准备方法。
neetcode.io [## 破解编程面试:189 个编程问题
阅读来自全球最大读者社区的 23 条评论。我不是招聘人员。我是一个软件工程师。而且……
www.goodreads.com [## 编程面试模式:让你成功通过下一次编程面试
阅读来自全球最大读者社区的评论。未定义
ii) 行为:
阅读来自全球最大读者社区的评论。最快的方式提高你的薪资和补偿……
www.goodreads.com [## 员工工程师之路:个体贡献者的指南
阅读来自全球最大读者社区的 163 条评论。多年来,公司一直奖励他们最……
iii) 机器学习/深度学习基础:
阅读来自全球最大读者社区的 5 条评论。本书提供了一个全面的介绍……
iv) 机器学习系统设计:
阅读来自全球最大读者社区的 7 条评论。机器学习系统设计面试是最……
www.goodreads.com](https://www.goodreads.com/book/show/120532868-machine-learning-system-design-interview?source=post_page-----e74eccef4645--------------------------------) [## 设计机器学习系统:一个迭代过程…
阅读来自全球最大读者社区的 76 条评论。机器学习系统既复杂又独特…
www.goodreads.com](https://www.goodreads.com/book/show/60715378-designing-machine-learning-systems?source=post_page-----e74eccef4645--------------------------------)
v) 一本通用的 MLE 面试建议书:
您可以在此处阅读该书的网页友好版。源代码可以在 GitHub 上找到。讨论可以通过 Discord 进行…
huyenchip.com](https://huyenchip.com/ml-interviews-book/?source=post_page-----e74eccef4645--------------------------------) [## 机器学习面试揭秘:151 个真实问题…
阅读来自全球最大读者社区的评论。让曾任亚马逊工程领导的彭绍(Peng Shao)为您分享经验…
www.goodreads.com](https://www.goodreads.com/book/show/152155500-inside-the-machine-learning-interview?source=post_page-----e74eccef4645--------------------------------)
您还需要有一些面试伙伴——现在,您可以订阅在线面试准备服务(不要选择那些收费高昂、要您花费上千美元的服务;总有更便宜的替代品),并与其他 MLE 候选人进行技能和信息交换。
策略:规划、跟踪、演变、提示、提升面试水平、戴上“职业发展的眼镜”、寻找面试伙伴、警惕红旗
规划、跟踪和进化。理想情况下,正如本文所描述的,你应该至少收到几次招聘人员的电话,并将面试按兴趣级别进行分类。一方面,招聘市场在不断变化,没人能够在第一次面试时就规划出最佳策略。另一方面,你会在面试过程中不断学习和成长,因此你会与几个月前的自己不同,尤其是在求职初期。所以,即使你是市场上最有才华的候选人,也非常有必要将面试分布在几个月的时间内,并且从你最不感兴趣的对话开始,以便熟悉市场并磨练面试技巧,而把最重要的对话留到后期。在面试过程中跟踪你的进展、反馈和思考。设定具体的学习目标,并随着面试不断进化。过去几年你可能从未接触过生成式人工智能(GenAI)知识,但你可以利用面试过程,通过在线课程学习并构建小型副项目。最好的结果是面试后拿到工作,第二好的结果是即使没有获得工作邀请,你也学到了一些有用的东西。如果你在每次面试中都不断学习,最终,它将大大提高你获得下一份工作邀请的机会。
提示。现在是大型语言模型(LLM)的时代,你应该明智地利用它。查找职位描述或职责中的关键词。如果有涉及“软件工程原则”的面试,那么你可以提示你喜欢的 LLM,要求它提供一份关于机器学习的软件工程原则的清单,以备准备之用。再次强调,提示的答案不应是你唯一的知识来源,但它可以弥补你日常阅读资料中的一些盲点。
提升一个职位层级的面试。有时,职位层级之间的界限并不明确。除非你在这个领域是绝对的新手,否则你可以尝试申请比自己当前层级高一层的机会,并为职位邀请阶段准备低一层的机会。如果你正在面试高级职位,准备或申请更高层次的职位并不会有什么坏处。它不总是有效,但有时它能为你打开一些大门。
戴上你的“职业眼镜”。面试时不要只是单纯地想着面试本身。除非你因为某种特殊原因急需这份工作,否则请问问自己,这份工作在你的整体职业规划中扮演着什么角色?这个问题有两个层面的意义:首先,它帮助你选择你想要加入的公司,例如,一家初创公司可能短期内提供更高的薪水,但如果它不重视软件工程的基本原则,那么你将失去在长期内成长为一份有前途的职业的机会;其次,它帮助你诊断面试的结果,例如,你的拒绝大多来自初创公司,但最终你收到了知名上市公司的 offer,那么你就会意识到这些拒绝并不意味着你不合格,而是因为在初创公司面试需要不同的技巧,而那些技巧并不属于你的职业路径。
结伴而行。五年前,还没有所谓的面试伙伴。不过现在,互联网上有各种各样的面试服务,从极其昂贵(我不推荐)到几百美元不等。记住,这是一个不断变化的市场,因此没有人能掌握全貌。获得信息的最佳方式是与非竞争领域的同行合作(例如,你在简历领域,而你的伙伴在推荐系统领域),共同练习并一起提高。比起单纯的合作,你应该主动寻求合作——尽量寻找那些在更高职位的人,趁你还能为他们提供有价值的帮助时。你可能会问,这怎么可能?为什么比我资深的人愿意和我一起练习?记住,没有人是完美的,你总是能为别人提供一些东西。有些资深的软件工程师希望转型成 MLE(机器学习工程师),你可以用你的机器学习知识交换他们的软件工程最佳实践。有些产品经理需要机器学习相关的输入,你可以请求他们提供行为面试练习作为回报。即使是那些没有行业经验的初级人员,你也可以向他们请求编码练习,或者听听他们的生活故事,获得灵感。作为 MLE,特别是在高级/职员级别,你需要展示领导力,而你能展示的最佳领导力就是集结不同层级的专业人士,帮助你实现你追求的目标——你的梦想 offer。
红色警示信号。一些明显的红色警示信号,比如要求你加班过多或面试后“失联”,是显而易见的。然而,有些红色警示信号则更为微妙或故意伪装。例如,招聘经理可能会礼貌地解释他们的情况,并希望你“刚开始时不要抱有过高的期望,几个月后再决定是否离开”——这听起来非常体贴,然而它掩盖了员工流动性高的事实。避免红色警示信号的最佳策略是通过阅读 Glassdoor 评论和在面试过程中了解公司文化。具体来说,“文化”并不是指公司网站上定义的“文化宣言”,而是你与团队之间的实际互动。面试官是否只是在问事先准备好的问题,而没有试图了解你的问题解决能力?当你提出问题时,面试官能否理解并给出一个有助于你更好理解公司价值的回答?最后,始终记得听从你的直觉,决定你是否喜欢未来的团队。毕竟,如果你决定接受这份工作,你将每天与这些人相处八个小时,未来几年都是如此;如果你的直觉告诉你不喜欢他们,那么无论如何你都不会感到快乐。
接受录取通知。 一旦你度过了所有的沮丧、失望和辛苦的工作,是时候讨论录取通知了。很多论坛讨论了谈判薪资的必要性,但我建议在这个雇主市场中要谨慎。如果你想谈判,最好的做法是手里有两个可比的录取通知,并准备好最坏的情况。同时,像 Levels.fyi 和 Glassdoor 这样的站点可以用来研究薪酬范围。
面试后——接下来该做什么?
恭喜!现在你已经接受了录取通知,准备开始你的新旅程,但还有什么其他事情可以做吗?
总结一下你的面试过程。 面试过程漫长且充满挑战,但你也从中获得了许多经验!现在你已经放松并感到开心,这是一个反思的最佳时机,感谢那些在面试过程中帮助过你的人,并与那些还在为面试过程挣扎的人分享一些信息。另外,过去几个月你一定积累了很多笔记和待办事项清单,却从未有时间坐下来整理,现在正是整理它们的最佳时机!
规划你的职业路径。 在过去几个月中,你的自我认知可能发生了变化;现在,你更好地了解了自己在压力下的学习能力和解决问题的能力。你与许多初创公司和大公司进行了交流,开始更清楚地了解自己在未来五年的发展方向。如果你处于中高层级,那么你可能已经与许多资深员工交流,获得了关于下一阶段工作的更清晰的认知。现在正是进行所有这些规划的好时机!
持续学习。 如果你来自学术背景,你可能已经习惯于阅读论文,了解最新的机器学习技术。然而,MLE(机器学习工程师)的角色远不止学术领域。它结合了研究、应用机器学习实践和软件工程,以对业务产生实际影响。现在是时候思考最佳策略,利用多种来源持续学习,以保持自己的知识更新。
为新角色做好准备。 你已经与新公司的其他 MLE 进行了交流,了解了他们使用的模型或技术栈。在某些情况下,你可能已经非常熟悉这些技术栈,但大多数时候,你需要为新角色学习很多新知识。制定一个学习计划,并设定小的里程碑来实现目标。此外,了解你的新公司,浏览其官网并理解其业务目标。这将有助于你在开始新工作时树立一个良好的印象,并与新同事交流。
毕竟,每个人的面试旅程都是不同的。你的经验水平、专注领域、长期职业目标和个性都共同塑造了一个独特的面试旅程。希望本文能为你提供面试准备材料和策略上的一些启发。也希望每个人最终都能拿到心仪的工作邀请!
致谢: 特别感谢Ben Cardoen和Rostam Shirani的校对和富有洞察力的建议,帮助本文达到了最终版本。
参考文献
-
Sophie Magnet,“2024 年最受欢迎的机器学习工程师技能”,链接:
365datascience.com/career-advice/career-guides/machine-learning-engineer-skills
-
Sam Jones,“2024 年机器学习工程师的就业市场”,链接:
www.peopleinai.com/blog/2024-job-market-for-machine-learning-engineers
-
詹妮弗·罗伯逊,《为什么很难找到资深机器学习工程师》,链接:
blog.qwasar.io/blog/why-its-so-difficult-to-find-senior-machine-learning-engineers
-
奇普·许恩,《机器学习面试入门书》,链接:
huyenchip.com/ml-interviews-book/
-
NeetCode 路线图,链接:
neetcode.io/roadmap
-
格雷尔·拉克曼·麦克道尔,《破解编程面试:189 个编程问题与解决方案》,2015 年
-
亚历克斯·徐,《编程面试模式:掌握你的下一次编程面试》,2024 年
-
亚历杭德罗·孔帕尼奥尼,《2024 年作为机器学习工程师求职指南》,链接:
acompa.net/mle-job-hunt-2024.html
-
彭绍,《机器学习面试揭秘:来自 FAANG 的 151 个真实问题及其解答》,2023 年
-
奇普·许恩,《设计机器学习系统:生产就绪应用的迭代过程》,2022 年
-
阿里·阿米尼安,亚历克斯·徐,《机器学习系统设计面试》,2023 年
-
克里斯托弗·M·毕晓普,休·毕晓普,《深度学习:基础与概念》,2023 年
-
塔尼娅·瑞利,《资深工程师之路:个体贡献者在成长与变革中如何导航》,2022 年
-
梅莉亚·斯特凡诺维奇,《软件工程师行为面试:所有必须知道的问题以及能让你获得工作的证明策略与答案》,2023 年
2024 年:价值驱动的数据人才之年
“以增长为唯一目标”的理念已经被“需要高效运作并以投资回报率为驱动”所取代——数据团队也不例外
https://medium.com/@mikldd?source=post_page---byline--f7f2b6344a5a--------------------------------https://towardsdatascience.com/?source=post_page---byline--f7f2b6344a5a-------------------------------- Mikkel Dengsøe
·发表于 Towards Data Science ·7 分钟阅读·2024 年 1 月 4 日
–
如果你在过去几年里从事技术工作,那真是经历了一场旋风。
从 2022 年到 2023 年,风险投资资金下降了 72%
新上市的公司从 2021 年到 2022 年下降了 82%
2023 年,美国超过 150,000 名技术工人被裁员
2023 年的现实检验。来源:作者,引用了《Techcrunch》,《The Verge》和 CNN 等出版物
在 2021 年之前的繁荣时期,资金充裕,团队发展速度远远跟不上需求。2022 年,“以增长为唯一目标”的理念被盈利目标所取代。预算不再基于天马行空的目标分配,而是受到首席财务官的严格审查。
数据团队也未能幸免于此。根据dbt 2023 年的调查,28%的数据团队计划裁减人员。
根据对选定规模扩展公司中数据岗位数量的观察,与去年年初相比,减少员工数量的公司比扩展团队的公司要多。
来源:作者根据 2023 年 4 月和 2024 年 1 月的 LinkedIn 数据创建。数据团队 通常占公司员工的 1-5% 。
数据团队的新现实
数据团队现在发现自己正处于一个深渊之中。
一方面,数据团队的投资回报率(ROI)历来难以衡量。另一方面,人工智能正处于风口浪尖(根据《麻省理工科技评论》的一项调查,81%的高管认为人工智能将成为他们业务的重要竞争优势)。AI 和 ML 项目通常有更明确的 ROI 案例,而数据团队正处于这一中心,越来越多的机器学习系统依赖数据仓库来驱动。
那么,2024 年数据人员该做什么呢?
在下文中,我探讨了如果你从事数据相关工作,确保自己处于有利位置并与业务价值对齐的五个步骤。
向你的利益相关者寻求反馈
当人们能够分享关于你的看法时,他们会觉得被倾听,这也给你提供了一个了解自己弱点的机会。你应该抓住这个机会,主动向重要的利益相关者寻求反馈。
虽然你可能不想对公司里的每个人进行调查,但你可以创建一个以数据为依赖的人员小组,例如所有高级职位的员工。让他们对诸如对自助服务的满意度、仪表板的质量以及是否在他们的领域有足够的数据人员等问题提供坦率且匿名的反馈(这也能在你要求增加人手时为你提供一些有力的支持)*。
来源:作者
最后问一个问题:“如果你有一根魔法棒,你会改变什么?”,让他们提出开放式的建议。
调查结果——关于数据团队数据工作的数据。这没有变得更好……
营销数据团队需要一些审视。数据基础设施也没有做得很好。来源:作者
对调查结果保持透明,并将其反馈给利益相关者,同时给出明确的行动计划来改进需要改进的地方。如果你每六个月进行一次调查,并且言行一致,你可以在后续展示出实际的改进。确保收集关于受访者所在业务领域的数据。这将为你提供一些宝贵的洞察,帮助你发现盲点,了解是否存在你未曾察觉的业务领域痛点。
构建一个商业案例,就像你在寻求风险资本投资一样
你可以坐等利益相关者的请求找到你。但如果你像大多数数据人员一样,你会希望对自己参与的项目有所发言权,甚至可能自己有一些想法。
在我担任 Google 数据分析师时,一位业务单元总监曾分享过一句智慧的建议:“如果你希望我支持你的项目,就像你是一个创业者在为你的初创公司筹集资金一样向我展示。” 这听起来可能像硅谷的言辞,但当我深入思考时,他确实有些合理的观点。
-
展示总的$机会是多少,以及你预期能够捕获的百分比
-
展示你已经做出了一个最小可行产品(MVP)以证明它是可行的
-
给我看看替代方案,以及为什么我应该选择你的想法
示例–ML 模型商业案例提案总结
来源:作者
像上面那样的商业案例提案通常会呈现给你所在领域的一些高级利益相关者,以争取他们的支持,让你把时间花在这项工作上,而不是你可以做的其他成百上千项事情上。它为他们提供了一个透明的论坛,让他们从一开始就参与项目,也为那些机会太小或风险太大的项目提供了一个早期否决的机会。
像新的 ML 模型或新项目创造运营效率这样的项目特别适合这种情况。但即使你被要求重建一组数据模型或构建一个全公司的 KPI 仪表盘,应用一些相同的原则也是有意义的。
采取整体的成本减少方法
当你考虑成本时,很容易陷入“只见树木不见森林”的境地。例如,数据分析师通过优化一些最耗时的 dbt 查询每月节省$5,000,听起来似乎很有成效。但尽管这些成就不应被忽视,采取一种更为整体的成本节约方法会更有帮助。
从问自己数据团队的所有成本组成部分及其含义开始。
如果你以一个中型数据团队为例,在规模扩展的公司中,三个最大的成本驱动因素往往是不成比例的分配为:
-
员工人数(15 个 FTE × $100,0000):$1,500,000
-
数据仓库成本(例如,Snowflake,BigQuery):$150,000
-
其他数据工具(例如,Looker,Fivetran):$100,000
来源:作者
这并不是说你应该立即专注于裁减人员,但如果你的成本分布与上述类似,问问自己以下问题:
我们是否应该让 2 倍 FTE 的员工构建这个内部工具,还是可以直接购买?
是否有低价值的项目,导致高成本人员被浪费在其中?
为了节省$5,000 的成本,花费两周的工作时间,这样的投资回报是否合适?
在开发工作流程中,是否有优化空间,比如 CI/CD 检查速度,可以改进以释放更多时间?
平衡速度和质量
我曾见过团队因拥有成千上万个 dbt 测试而陷入困境,这些测试遍布数千个数据模型。很难知道哪些是重要的,而且开发新的数据模型比其他所有事情都需要花费两倍的时间,因为所有东西都必须经过相同的严格审查。
另一方面,那些几乎不对数据管道进行测试,构建不遵循良好数据建模原则的数据模型的团队,往往会发现自己进展缓慢,必须花费两倍的时间去清理和修复事后出现的问题。
值导向的数据人员仔细平衡速度和质量
-
对最重要的数据资产的共同理解
-
根据数据资产的重要性,定义期望的测试级别
-
根据问题的严重性,定义期望的解决时间和服务级别协议(SLA)
他们也知道,为了成功,他们的公司需要更像一艘快艇,少像一艘油轮——通过实验快速学习什么有效,什么无效,快速调整方向,每两周回顾一次进展,给予每个团队自主权来设定他们的方向。
数据团队通常在不确定性中工作(例如,这个 ML 模型是否有效)。你发货越快,越能快速了解到什么有效,什么无效。最优秀的数据人员总是谨慎地记住这一点,并知道自己处于曲线的哪个位置。
例如,如果你是一个 ML 工程师,正在开发一个模型来决定哪些客户可以注册一个价值数十亿的全新银行,你就无法再做快速且草率的工作。但如果你在一个种子阶段的创业公司工作,整个后台系统可能在几个月内会重做,你就会知道有时候需要在速度和质量之间找到平衡。
主动分享你的工作影响
数据角色的人通常不是那些大声宣扬自己成就的人。虽然没有人愿意做无耻的自我宣传者,但还是可以寻找到一个平衡点。
如果你做的工作产生了影响,不要害怕让同事知道。如果你有一些数据来支持这一点,那就更好(谁比你更清楚数据工作的影响)。在做这件事时,很容易被构建过程中的实施细节困扰,比如有多难,使用了什么精妙的算法,或者写了多少行代码。但利益相关者对此并不关心。相反,考虑用以下的方式来表达。
-
聚焦影响
-
不要仅仅说“交付了 X”
-
使用“交付了 X,并且产生了 Y 的影响”
当事情没有按预期进展时,不要害怕提前指出。例如,如果你正在做一个毫无进展或变得越来越复杂的项目,就要及时指出。你可能会担心这样做会让自己陷入困境,但你的利益相关者会认为这是表现出高度的责任感,而不是陷入沉没成本谬论。
如果你对文章有更多想法或问题,欢迎通过LinkedIn 联系我。
如何在不到 12 个月的时间里从分析师转型为数据科学家
没有技术背景,也没有数学博士学位
https://ds-claudia.medium.com/?source=post_page---byline--8414d2c86a02--------------------------------https://towardsdatascience.com/?source=post_page---byline--8414d2c86a02-------------------------------- Claudia Ng
·发布于 Towards Data Science ·6 分钟阅读·2024 年 8 月 24 日
–
图片来自 fancycrave1 ,来源于 Pixabay
我的数据科学之旅始于一次危机。
在星期一早上 9:01,我的手机响起了 PagerDuty 警报。本能地,我打开了公司仪表盘,看到贷款批准率在一夜之间翻倍了。
我的心开始剧烈跳动。
那时我是一名风险分析师,管理着一个贷款组合。批准高风险细分市场的贷款可能对损失率产生巨大影响。
睁着疲惫的眼睛,我投入了数据分析。
我疯狂地:
-
编写 SQL 查询以提取数据,
-
用 Python 分析数据,试图找出异常,
-
寻找能够解释批准率突然激增的模式。
我发现信用模型中的一个特定特征发生了漂移。
结果证明这只是一个简单的时区错误。
这一事件成为我职业生涯的转折点,标志着我从数据分析师转型为数据科学家的开始。
不要从零开始
发现 Llama 模型中每个神经元的作用
Transluce 的新工具正在改变 AI 透明度的游戏规则——一个测试案例和一些思考材料
https://medium.com/@benhagag10?source=post_page---byline--0927524e4807--------------------------------https://towardsdatascience.com/?source=post_page---byline--0927524e4807-------------------------------- Ben Hagag
·发表于Towards Data Science ·7 分钟阅读·2024 年 10 月 25 日
–
图片由作者提供——拍下了使用新工具的瞬间!
Transluce,一个具有启发性使命的非营利研究实验室,刚刚发布了一个引人入胜的工具,提供了 LLM 中神经元行为的洞察。或者用他们自己的话来说:
当 AI 系统的行为出乎意料时,我们希望了解“思考过程”,以解释为何会发生这种行为。这让我们能够预测并修复 AI 模型中的问题,揭示隐藏的知识,揭露学到的偏见和虚假的关联。
为了实现他们的使命,他们推出了一个可观察性界面,你可以在其中输入自己的提示语,获取回应,并查看哪些神经元被激活。你可以进一步探索这些激活的神经元及其对模型输出的归因,所有这些都得益于他们通过创新方法自动生成高质量的神经元描述。
如果你想测试这个工具,可以点击这里。他们还提供了一些有用的教程。在本文中,我将尝试提供另一个用例,并分享我自己的经验。
你可能需要了解很多内容(具体取决于你的背景),但我将重点介绍两个关键特性:激活值和归因。
激活值衡量的是神经元的(归一化)激活值。Llama 使用门控 MLP,这意味着激活值可以是正数也可以是负数。我们通过神经元在大规模数据集上的 10–5 分位数值进行归一化。
归因 衡量神经元对模型输出的影响程度。归因必须基于特定的输出标记,并等于该输出标记概率相对于神经元激活的梯度,乘以神经元的激活值。归因值没有标准化,以绝对值的形式报告。
利用这两个特征,你可以探索模型的行为、神经元的行为,甚至注意到神经元行为现象的模式(或者他们称之为“聚类”)。
如果模型输出不是你期望的,或者模型得出了错误的结果,该工具允许你通过加强或抑制与概念相关的神经元来引导并“修复”问题(有许多出色的工作讲解如何根据概念进行引导 —— 其中之一是这篇出色的工作)。
所以,出于好奇,我用我自己的提示进行了测试。
我选择了一个大多数今天的模型无法解决的简单逻辑问题。
问题:“𝗔𝗹𝗶𝗰𝗲 有 4 个兄弟和 2 个姐妹。爱丽丝的兄弟有多少个姐妹?”
主页。图片来自monitor.transluce.org
瞧,成功了……
Llama 做错了。图片来自monitor.transluce.org
或者没有。
在左侧,你可以看到提示和输出。在右侧,你可以看到“激活”最多的神经元,并观察这些神经元聚集的主要簇。
如果你将鼠标悬停在左侧的标记上,你可以看到最高的概率。如果你点击其中一个标记,你可以找到哪些神经元参与了预测该标记。
将鼠标悬停在“in”上。我们可以看到最高概率的标记。图片来自monitor.transluce.org
正如你所看到的,逻辑和答案都是错误的。
“因为爱丽丝有 4 个兄弟,所以我们需要找出他们共有多少个姐妹” >>> 哎呀!你已经知道答案了。
当然,如果爱丽丝有两个姐妹(这是输入中给定的),这并不意味着爱丽丝的兄弟有 2 个姐妹 😦
所以,让我们试着修复这个问题。在检查神经元之后,我注意到“多样性”概念过于活跃(也许它对爱丽丝的身份感到困惑?)。因此,我尝试调整这些神经元。
引导窗口。图片来自monitor.transluce.org
我抑制了与此概念相关的神经元,并重新尝试:
调整后的模型在引导后。图片来自monitor.transluce.org
如你所见,它仍然输出了错误的答案。但如果仔细观察输出,逻辑已经有所变化,看起来好多了——它捕捉到我们需要“转变”到“其中一个兄弟的视角”。而且,它也理解了爱丽丝是一个姐妹(终于!)。
最终答案仍然不正确。
我决定加强“性别角色”这一概念,认为这有助于模型更好地理解问题中兄妹的角色,同时保持它对爱丽丝与她兄妹关系的理解。
另一个调整。图片来自monitor.transluce.org
好吧,答案仍然不正确,但似乎推理过程略有改善。模型表示“提到的是爱丽丝的两个姐妹”。句子的前半部分表现出一定的理解(是的,这部分也在输入中。并且不,我并不是在争论模型或任何模型能否真正理解——这是另一个讨论的话题),即爱丽丝有两个姐妹。它也依然认知到爱丽丝自己是一个姐妹(“…这个兄弟有 2 个姐妹——爱丽丝和另一个姐妹…”)。但答案还是错的。真是差一点……
现在我们接近正确答案了,我注意到一个无关的概念(“化学化合物与反应”)影响了“2”这个符号(左侧以橙色高亮显示)。我不确定为什么这个概念会有这么大的影响,但我决定它与问题无关,于是将其抑制了。
结果如何?
最终结果。图片来自monitor.transluce.org
成功了!!(差不多)
如上所示,它终于得到了正确的答案。
但是……推理过程如何呢?
嗯……
最终输出。图片来自monitor.transluce.org
它跟随了一种奇怪的逻辑过程,带有一些角色扮演上的混乱,但最终还是得出了正确的答案(如果你能解释这个过程,请分享)。
所以,在一些试错后,我几乎成功了。在调整了与性别和化学化合物相关的神经元后,模型给出了正确答案,但推理过程还不够完善。我不确定,也许通过更多的微调和调整(或许更好的概念和神经元选择),我能够同时得到正确的答案和正确的逻辑。我挑战你试试看。
这仍然是实验性的,我没有使用任何系统化的方法,但说实话,我很受震撼,认为这非常有前景。为什么?因为能够观察并获取每个神经元的描述,理解(即使是部分理解)它们的影响,并实时地引导行为(无需重新训练或提示)真是令人印象深刻——是的,也有点上瘾,所以要小心!
另一个想法是:如果这些描述是准确的(反映了实际行为),而且如果我们能够手动尝试不同的设置,为什么不尝试基于神经元激活和归因值构建一个模型呢?Transluce 团队,如果你们在看这条信息……你们怎么看?
总的来说,做得很好。我强烈建议深入研究一下。它的易用性和观察神经元行为的能力非常有吸引力,我相信我们会看到更多的工具采用这些技术来帮助我们更好地理解我们的模型。
我现在打算在一些最具挑战性的法律推理用例中测试这个——看看它如何捕捉更复杂的逻辑结构。
这对人工智能意味着什么?我们得拭目以待……但就像 GPT 如此迅速自然地被接受一样,我认为这个版本的发布为大语言模型的可解释性开辟了新篇章。更重要的是,它将我们带得更近,朝着构建更加对齐和负责任的工具迈进。
既然他们的工作是开源的,那么就由社区来挑战它、改进它或在此基础上进行构建。
所以,试试看吧。
与此同时,你怎么看?
一些限制(简要说明):
-
该工具就在昨天发布,我还没有完全有机会审阅整个文档。
-
我成功地尝试了简单的问题,但当我提出带有不同属性的类似问题时,逻辑仍然失败。归纳能力是这里的关键——尝试在可观察性工具中“捕捉”某些归纳性,将使其达到新的高度。
-
即使在低温或零温设置下,也并非总是可以重现。
-
没有单一的路径可以同时获得正确答案和逻辑推理。
-
它涉及到相当多的反复试验。在几次迭代后,我开始“感觉到”它的运作,但这和刚开始使用 GPT 时很像——当它有效时令人兴奋,但常常让你陷入困惑,“这里到底发生了什么?”因此,仍然需要进一步的工作。
提升 RAG 系统的三种高级文档检索技术
查询扩展、跨编码器重排序和嵌入适配器
https://ahmedbesbes.medium.com/?source=post_page---byline--0703a2375e1c--------------------------------https://towardsdatascience.com/?source=post_page---byline--0703a2375e1c-------------------------------- Ahmed Besbes
·发表于Towards Data Science ·10 分钟阅读·2024 年 1 月 15 日
–
图片由作者使用 DALL-E 3 创作
你是否曾观察到,RAG 系统检索到的文档并不总是与用户的查询完全匹配?
这是一个常见的现象,尤其是在现成的 RAG 实现中。检索到的文档可能无法完全回答查询,可能包含冗余信息,或者有不相关的细节。此外,这些文档呈现的顺序也可能无法始终与用户的意图相符。
在这篇文章中,我们将探讨三种有效的技术,以增强基于 RAG 的应用中的文档检索:
-
查询扩展
-
跨编码器重排序
-
嵌入适配器
通过结合这些技术,你可以检索到更相关的文档,这些文档与用户的查询更加匹配,从而提高生成答案的影响力。
让我们来看一下👇。
如果你对机器学习内容感兴趣,想要获取来自行业的详细教程和实用技巧,欢迎关注我的 新闻通讯。它的名字叫做《技术自助餐》。
3 个 AI 应用场景(不是聊天机器人)
特征工程、结构化非结构化数据和潜在客户评分
https://shawhin.medium.com/?source=post_page---byline--f4f328a2707a--------------------------------https://towardsdatascience.com/?source=post_page---byline--f4f328a2707a-------------------------------- Shaw Talebi
·发布于Towards Data Science ·阅读时间:7 分钟·2024 年 8 月 21 日
–
我从(AI 咨询)客户那里收到的最常见请求是“帮我构建一个定制聊天机器人。”虽然这对某些问题来说是一个很好的解决方案,但它远不是万能的。在本文中,我将分享三种商业可以在销售环境中使用 AI 创造价值的替代方式。这些方法涵盖了生成性 AI、深度学习和机器学习。
图片来自 Canva。
大型语言模型(LLMs)已经席卷了商业世界,现在每家公司都在尝试使用生成性 AI。虽然像 ChatGPT 这样的工具显然很强大,但目前尚不清楚企业如何可靠地利用这项技术来驱动价值。
对于我接触过的大多数企业来说,“使用 AI”意味着构建一个聊天机器人、协作助手、AI 代理或 AI 助手。然而,随着对这些解决方案的初步兴奋逐渐消退,组织们开始意识到围绕 LLMs 构建系统的关键挑战。
这比我想象的还要难…
一个核心挑战是,LLMs 本质上是不可预测的(比传统的机器学习系统还要不可预测)。因此,让它们以可预测的方式解决特定问题并不容易。
3 种流行的空间插值方法
从头开始,用 Python 实现
https://medium.com/@alexroz?source=post_page---byline--912cab7aee47--------------------------------https://towardsdatascience.com/?source=post_page---byline--912cab7aee47-------------------------------- Aleksei Rozanov
·发布于 Towards Data Science ·10 分钟阅读·2024 年 4 月 9 日
–
图片由作者提供。
插值是一个相当常见的数学概念,不仅数据科学家使用,许多其他领域的人也会用到。然而,当处理地理空间数据时,插值变得更为复杂,因为你需要基于多个往往稀疏的观测数据创建一个具有代表性的网格。
在深入探讨地理空间部分之前,让我们简要回顾一下线性插值。
和往常一样,要跟上教程,你可以在这里下载并运行笔记本。
为了演示,我将使用一个常规的多项式函数:
def F(x):
return -2*x**3+x**2+2.1
x = np.arange(-5,5, 0.1)
y = F(x)
图片由作者提供。
现在我们可以随机选择几个点 [-4.2, 0, 2.5] 并将它们连接起来:
图片由作者提供。
这就是线性插值,因为在每个区间内,函数由一条直线近似,而现在,只知道函数在 3 个点的值,我们就可以找到区间[-4.2;2.5]内的值。
还有许多其他方法,它们具有更高的精度,但它们的基本思路是相同的:在至少两个已知点之间找到函数值。
现在是时候进入地理空间部分了。在本教程中,我们的目标是对瑞士各地气象站测得的每日平均气温进行空间插值,这些数据由NOAA提供。预期结果是生成一个温度网格,单元格分辨率为 0.1°。
首先,我们需要获取瑞士的行政边界,并使用 geopandas 将其可视化:
import geopandas as gdp
shape = gpd.read_file('gadm41_CHE_0.shp')
shape.plot()
图片由作者提供。
确实,看起来像是瑞士,哇 =)
现在让我们绘制我们的温度观测数据,并将其与国家边界形状叠加。为此,我们将气象数据加载到常规的 pandas 数据框中,然后将其转换为带有坐标的 geopandas 数据框,这些坐标转化为shapely点:
import pandas as pd
from shapely.geometry import Point
df = pd.read_csv('3639866.csv')
points = list()
for i in range(len(df)):
point = Point(df.loc[i, 'LONGITUDE'], df.loc[i, 'LATITUDE'])
points.append(point)
gdf = gpd.GeoDataFrame(geometry=points).set_crs(shape.crs)
完成后,我们可以很容易地使用matplotlib将这两个数据框叠加在一起。
fig, ax = plt.subplots(figsize=(16,9))
shape.plot(ax=ax, color='black')
gdf.plot(ax=ax, color='r', markersize=85)
plt.show()
图片由作者提供。
为了可视化我们的任务,让我们创建一个用于插值的网格,并将其与上面的地图叠加:
import matplotlib.ticker as mticker
import cartopy.crs as ccrs
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
LAT, LON = np.arange(45.75, 48, 0.1), np.arange(6, 10.81, 0.1)
fig, ax = plt.subplots(subplot_kw=dict(projection=ccrs.PlateCarree()), figsize=(16, 9))
shape.plot(ax=ax, color='grey')
gdf.plot(ax=ax, color='r', markersize=85)
gl = ax.gridlines(draw_labels=True,linewidth=2, color='black', alpha=0.5, linestyle='--')
gl.xlocator = mticker.FixedLocator(LON)
gl.ylocator = mticker.FixedLocator(LAT)
gl.xformatter = LONGITUDE_FORMATTER
gl.yformatter = LATITUDE_FORMATTER
plt.show()
图片由作者提供。
所以目标是对上面插值的常规网格进行插值,包含 8 个温度观测值。
I. 最近邻(NN)
第一个直观且简单的方法叫做最近邻(NN)。正如你从名称中可以猜到的,这个算法将最近观测值的值分配给每个网格节点。
为了实现它,我们只需要两个函数。第一个函数叫做 Euclidean,它使用以下公式计算两点之间的距离:
图片由作者提供。
第二个方法就是 NN 方法本身。在创建一个空数组来存储值之后,我们遍历所有纬度和经度,计算每个点到当前网格节点的距离,并将最近观测值的值分配给该网格节点:
def Euclidean(x1,x2,y1,y2):
return ((x1-x2)**2+(y1-y2)**2)**0.5
def NN(data, LAT, LON):
array = np.empty((LAT.shape[0], LON.shape[0]))
for i, lat in enumerate(LAT):
for j, lon in enumerate(LON):
idx = data.apply(lambda row: Euclidean(row.LONGITUDE, lon, row.LATITUDE, lat), axis = 1).argmin()
array[i,j] = data.loc[idx, 'TAVG']
return array
整个思路在这一行中:
idx = data.apply(lambda row: Euclidean(row.LONGITUDE, lon, row.LATITUDE, lat), axis = 1).argmin()
变量数据是我们包含气象站点的 pandas 数据框(每行表示一个站点)。因此,在for循环中,我们计算距离并找到距离最小的站点的索引。
现在让我们运行算法,并将结果封装到 xarray 数据集中:
t2m = NN(df, LAT, LON)
ds = xr.Dataset(
{'TAVG': (['lat', 'lon'], t2m)},
coords={'lat': LAT, 'lon': LON})
现在我们可以绘制结果了:
图片由作者提供。
看起来不错,但让我们通过使用 regionmask 库创建瑞士的掩模来增强我们的绘图:
shape['new_column'] = 0
sw = shape.dissolve(by='new_column')['geometry']
rg = regionmask.mask_3D_geopandas(sw, lon_or_obj=ds.lon, lat=ds.lat)
fig, ax = plt.subplots(subplot_kw=dict(projection=ccrs.PlateCarree()), figsize=(16, 9))
#shape.plot(ax=ax, color='black')
ds.where(rg).TAVG.plot(ax=ax, alpha=0.6)
gdf.plot(ax=ax, color='r', markersize=85)
ax.gridlines(draw_labels=True,linewidth=2, color='black', alpha=0.5, linestyle='--')
plt.show()
图片由作者提供。
如你所见,这种方法只能应用于分类数据。由于我们处理的是温度数据,温度是连续变量,意味着它可以在某一范围内取任何值,因此这种插值是误导性的。现实生活中总是存在梯度和随机性。
那么,让我们来看看更先进的算法。
II. 反距离加权(IDW)
基本上,反距离加权(IDW)是 NN 的增强版:
def IDW(data, LAT, LON, betta=2):
array = np.empty((LAT.shape[0], LON.shape[0]))
for i, lat in enumerate(LAT):
for j, lon in enumerate(LON):
weights = data.apply(lambda row: Euclidean(row.LONGITUDE, lon, row.LATITUDE, lat)**(-betta), axis = 1)
z = sum(weights*data.TAVG)/weights.sum()
array[i,j] = z
return array
如你所见,我们不是直接赋值给最近已知的点,而是计算权重。为此,前面提到的欧几里得距离也被使用,但这次我们将每个距离的**-**β次方(β是任意值)。这些权重基本上是每个地面点对某个网格节点的贡献。距离越远,这个点对节点值的影响就越小。
在得到权重后,我们计算加权平均值。
图片来自作者。
图片来自作者。
让我们绘制它:
图片来自作者。
如你所见,现在的结果更真实且平滑!
三、克里金(Kriging)
今天的最后一个方法是克里金(Kriging)。在这三者中,这是最复杂的,我们将仅仅触及它。如果你想有意识且有效地使用它,可以考虑查阅相关文献!
所以这个方法的主要思想是使用变异函数(或半变异函数)。本质上,变异函数量化了某个参数如何随着距离和方向的变化而变化。这正是我们在处理空气温度时所需要的。
为了实现克里金算法,我们将需要两种类型的变异函数:实验变异函数和理论变异函数。
第一个计算非常简单。它被定义为gamma γ:
图片来自作者。
其中 h — 两点之间的地理距离,z — 温度函数。所以简而言之,它是已知点温度差的平均值。
理论变异函数要复杂一些。首先,有很多种:
图片来自作者。
其中 p — 是部分阈值,d — 距离(我们之前用了h),n — 暴露量,r — 范围。
我在CDT Columbia找到了一个非常好的这些参数的可视化解释。我从他们的资料中采用了一张插图,展示了γ与距离之间的关系。如你所见,现在清楚地展示了阈值、部分阈值、暴露量和范围。
图片来自作者。
所以这个算法的整个思路是调整理论变异函数的参数,使其与实验变异函数匹配,然后利用它预测节点的值。
为了实现该方法,我们将需要几个额外的库,并创建一个名为 OrdinaryKriging 的类。
from scipy.linalg import solve
from itertools import product
from sklearn.metrics import mean_squared_error as MSE
class OrdinaryKriging:
def __init__(self, lats, lons, values):
self.lats = lats
self.lons= lons
self.values = values
self.nugget_values = [0, 1, 2, 3, 4]
self.sill_values = [1, 2, 3, 4, 5]
self.range_values = [1, 2, 3, 4, 5]
# Generate all combinations of parameter values to fit
self.parameter_combinations = list(product(self.nugget_values, self.sill_values, self.range_values))
self.optimal_pars = None
def theoretical_variogram(self, h, nugget, sill, r):
return nugget + (sill-nugget) * (1-np.exp(-3*h/r))
def Euclidean(self, X, Y):
all_dists, point_dists = [], []
for x,y in zip(X, Y):
k = 0
for k in range(len(X)):
h = np.linalg.norm(np.array([x, y]) - np.array([X[k], Y[k]]))
point_dists.append(h)
all_dists.append(point_dists)
point_dists = []
return all_dists
def gamma(self):
distances = self.Euclidean(self.lats, self.lons)
differences = np.abs(self.values.reshape(-1,1) - self.values)
variogram_values = []
for h in np.unique(distances):
values_at_h = differences[(distances == h)]
variogram_values.append(np.mean(values_at_h**2))
return variogram_values, np.unique(distances)
def fit(self):
experimental_variogram, distances = self.gamma()
fit_metrics = []
for nugget, sill, range_ in self.parameter_combinations:
theoretical_variogram_values = self.theoretical_variogram(distances, nugget, sill, range_)
fit_metric = MSE(experimental_variogram, theoretical_variogram_values)
fit_metrics.append((nugget, sill, range_, fit_metric))
self.optimal_pars = min(fit_metrics, key=lambda x: x[3])[:3]
def predict(self, point):
points = np.array([(x,y) for x,y in zip(self.lats, self.lons)])
distances = np.linalg.norm(points - point, axis=1)
pars = list(self.optimal_pars)
pars.insert(0, distances)
weights = self.theoretical_variogram(*pars)
weights /= np.sum(weights)
return np.dot(weights, self.values)
kriging = OrdinaryKriging(df.LATITUDE.values, df.LONGITUDE.values, df.TAVG.values)
kriging.fit()
现在让我们分别考虑每个函数。
init 函数除了初始化坐标和值外,还包括三个列表,分别包含 nugget、sill 和 range 的可能值。这三者被混合在一起,形成所有可能的组合,并存储在 parameter_combinations 变量中。稍后我们将用它来搜索最优值。
def __init__(self, lats, lons, values):
self.lats = lats
self.lons= lons
self.values = values
self.nugget_values = [0, 1, 2, 3, 4]
self.sill_values = [1, 2, 3, 4, 5]
self.range_values = [1, 2, 3, 4, 5]
# Generate all combinations of parameter values to fit
self.parameter_combinations = list(product(self.nugget_values, self.sill_values, self.range_values))
self.optimal_pars = None
第二个函数,theoretical_variogram,只是上述公式之一的 Python 实现。在我们的例子中,它是 指数型(但你可以为其他公式编写代码并进行比较):
def theoretical_variogram(self, h, nugget, sill, r):
return nugget + (sill-nugget) * (1-np.exp(-3*h/r))
第三个类方法 欧几里得。这是我们为 NN 和 IDW 创建的函数的修改版。这次我们返回一个矩阵 (n,n),其中每一行表示一个点与所有其他点之间的距离(每行中的一个值为 0,因为一个点与它自身的距离为 0)。
def Euclidean(self, X, Y):
all_dists, point_dists = [], []
for x,y in zip(X, Y):
k = 0
for k in range(len(X)):
h = np.linalg.norm(np.array([x, y]) - np.array([X[k], Y[k]]))
point_dists.append(h)
all_dists.append(point_dists)
point_dists = []
return all_dists
第四个函数执行 拟合。在这里,它获取实验变差值和欧几里得距离。然后,通过迭代我们关于 sill、range 和 nugget 的组合,计算理论变差值,并进行理论值与实验值之间的均方误差(MSE)估计(当然你也可以使用其他度量标准)。然后,我们将最优参数保存到类变量 optimal_pars 中。
def fit(self):
experimental_variogram, distances = self.gamma()
fit_metrics = []
for nugget, sill, range_ in self.parameter_combinations:
theoretical_variogram_values = self.theoretical_variogram(distances, nugget, sill, range_)
fit_metric = MSE(experimental_variogram, theoretical_variogram_values)
fit_metrics.append((nugget, sill, range_, fit_metric))
self.optimal_pars = min(fit_metrics, key=lambda x: x[3])[:3]
最后一个函数是 预测。它接收一个点(lat;lon)作为输入,估算该点与其他已知点之间的距离。接着,它调用 theoretical_variogram 函数,传入我们之前获得的最优参数,并输出权重。然后,计算加权均值并返回。
def predict(self, point):
points = np.array([(x,y) for x,y in zip(self.lats, self.lons)])
distances = np.linalg.norm(points - point, axis=1)
pars = list(self.optimal_pars)
pars.insert(0, distances)
weights = self.theoretical_variogram(*pars)
weights /= np.sum(weights)
return np.dot(weights, self.values)
现在我们可以收集所有预测并可视化地图:
row, grid = [], []
for lat in LAT:
for lon in LON:
row.append(kriging.predict(np.array([lat, lon])))
grid.append(row)
row=[]
ds = xr.Dataset(
{'TAVG': (['lat', 'lon'], grid)},
coords={'lat': LAT, 'lon': LON})
fig, ax = plt.subplots(subplot_kw=dict(projection=ccrs.PlateCarree()), figsize=(16, 9))
ds.where(rg).TAVG.plot(ax=ax, alpha=0.6)
gdf.plot(ax=ax, color='r', markersize=85)
ax.gridlines(draw_labels=True,linewidth=2, color='black', alpha=0.5, linestyle='--')
plt.show()
图片来源:作者。
如你所见,结果与 IDW 得到的结果有很大不同。对于克里金插值法(Kriging),最重要的参数是你选择的理论变差模型,因为它基本上定义了预测值与距离之间的关系。如果你不想修改我提供的代码或你自己的代码,你可以探索 PyKrige 库,它实现了许多变差模型。
希望这篇文章对你有帮助,提供了有价值的见解!
===========================================
我在 Medium 上的所有出版物都是免费的,公开访问的,所以如果你在这里关注我,我将非常感激!
P.s. 我对(地理)数据科学、机器学习/人工智能以及气候变化充满热情。所以如果你想一起合作某个项目,请通过 LinkedIn 联系我。
🛰️关注我以获取更多更新🛰️
弥合工程与分析之间鸿沟的 3 个最佳实践
分配代码所有者、聘请分析工程师并创建飞轮效应
https://madison-schott.medium.com/?source=post_page---byline--a9a01fb6dd9d--------------------------------https://towardsdatascience.com/?source=post_page---byline--a9a01fb6dd9d-------------------------------- Madison Schott
·发表于Towards Data Science ·6 分钟阅读·2024 年 4 月 19 日
–
图片来自Alex Radelich在Unsplash上的分享
作为一名分析工程师,我面临的最具挑战性的问题之一是弥合工程与分析之间的鸿沟。工程和分析往往各自为政,各自形成独立的团队,这使得跨团队协作变得相当困难。
工程团队推动的软件和数据变更往往是分析团队无法预见的。分析团队随后不得不调整工作,以适应这些变化。更糟的是,分析团队可能需要建议一个变更,而工程团队必须将其纳入本已紧张的日程安排中。
如果团队之间的鸿沟过于宽广,会增加大量时间、努力和数据质量问题,使本已堆积的工作更加繁重。这就是为什么从一开始就实施最佳沟通实践至关重要,一旦发现这一问题就应立即采取行动。
在本文中,我将讨论一些我所面临的最常见问题以及你可以应用的最佳实践来解决这些问题。
缺乏代码和测试的所有权
通常,代码中构建的逻辑缺乏所有权,尤其是在分析和工程之间。谁拥有生成代码的权利……
2025 年数据科学职业发展的 3 项必备商业技能
数据科学
包括如何培养这些技能的资源
https://varshitasher.medium.com/?source=post_page---byline--146f841d1a1e--------------------------------https://towardsdatascience.com/?source=post_page---byline--146f841d1a1e-------------------------------- Dr. Varshita Sher
·发布于 Towards Data Science ·7 分钟阅读·2024 年 12 月 11 日
–
图片来源:作者。使用 Midjourney 创建
如果你已经做了数据科学家一段时间,迟早你会发现,你的日常工作已经从一个喜爱 VSCode、阅读研究论文、提交 git 版本的数据科学家,转变为一个推动协作、界定项目范围、管理利益相关者、制定战略的人。
这一转变将是渐进的,几乎不易察觉,但它将要求你戴上不同的帽子,以确保数据项目的进展和影响力。此时,你将开始意识到除了日常的数据科学技能外,磨炼一些商业技能的必要性。这也将是你准备向更高层次的技术领导职位迈进的一个良好信号,比如首席、负责人或资深数据科学家。
以下是我个人的三大推荐,这些技能在我担任 FTSE 100 公司数据科学领导职务时非常有用,同时在初创企业环境中同样适用。
1. 精通金融
了解一家公司如何赚钱无论公司大小以及你在其中的角色如何,都至关重要。不幸的是,很多数据科学工作常常发生在孤岛中,问题陈述或假设,或者分析流程通常是自上而下的,可能与公司的财务目标缺乏直接的对接。
当你在团队中担任更高级的领导角色时,掌握商业语言至关重要。了解像资本支出(CapEx)与运营支出(OpEx)、EBITDA 利润率、摊销、综合客户获取成本(CAC)、客户流失群体、市场公平份额等术语有助于你与高层沟通结果。这样,你可以根据数据科学驱动的举措如何影响这些领域,定制你的洞察,使你的分析对财务相关人员更加相关和具有说服力。
你知道吗,苹果公司在 2024 年花费了 1100 亿美元进行股票回购?为什么?市场上的流通股减少了 = 每股收益(EPS)提高,从而推动了股价上涨。
了解你的数据能为你和公司带来好处:了解你的数据意味着你知道什么对业务有益,什么无效,能够识别增长的领域,并基于数据做出明智的财务决策。例如,除了仅仅展示模型精度的提升,还可以展示预测结果如何直接影响公司的最终盈利。
同样,通过展示你的工作如何直接贡献于公司的财务成功,你甚至可以为自己争取更好的薪酬!
但它不仅仅是沟通。这些知识为许多数据科学家错失的机会打开了大门。例如,有些方案允许你为公司与研发活动相关的资本支出(如专利相关费用、专业软件许可费等)申请税收返还。
我见过一些团队,通过理解这些财务机制,并将他们的机器学习基础设施投资定位为研发项目,从而成功获得了资金。
同样,根据你所在的行业,也有一些你或你的公司可能符合条件的政府补助。例如,美国农业部(USDA)为农业技术创新项目提供补助和资金。
如何培养这项技能?
-
阅读财务方面的书籍,快速掌握关键术语,并学习来自同行业其他公司的案例研究(最坏的情况——你要么快速失败,要么在最佳情况下——你会了解应该避免的常见陷阱)。
如果你没有时间从头到尾阅读书籍,至少要熟悉它们的关键理念。我使用AcceleratEd来获取书籍摘要,但也有其他选择,你可以从中挑选,我在这篇文章中讨论了这些选项。
-
从 YT 频道如TheFinanceStoryteller和Investopedia获取内容,这些频道将复杂的金融话题拆解成易于理解的小块。
-
留意适用于你业务的奖学金和资助机会。
-
跟随你的 COO、运营经理,或者在某些情况下,甚至是你的 PO(我的 PO 在帮助我理解医疗行业中的价值计算以及提升我对公司财务的理解方面,帮助非常大)。
2. 跟上趋势
无论你喜欢还是讨厌,但你不能否认 AI/ML/生成 AI 领域正在以前所未有的速度发展。我经常看到新闻报道说技术 X 取代了技术 Y,而我不禁想——那技术 Y 到底是什么!
平均每个月,大约有 8000 篇新的研究论文(计算机科学类)在 arXiv 上发表![来源]
要在这一新角色中提供任何形式的思想领导力,你的行业和技术意识需要在两个层面上运作——本地和全球。
跟上本地****趋势意味着要时刻了解最新的工具、技术和趋势。从实际角度来说,这意味着你需要知道(a)哪些模型在你的使用场景中位于排行榜的前列(无论是预测、生成 AI 还是计算机视觉),(b)哪些新兴的突破性框架可能会成为行业的变革者(例如,百度最近推出的iRAG 技术,解决了图像生成中的幻觉问题),以及(c)DevOps/LLMOps/MLOps 方面的进展,这些都能帮助简化工作流程并提高效率。
跟上全球****趋势意味着要了解科技领域的更大格局——理解创新如何塑造行业,以及这些技术对社会和伦理的广泛影响——尤其是当世界各国政府开始采取措施来规范科技领域时。
从实际角度来看,这可能意味着要时刻了解你所在领域(法律、医疗、快速消费品等)的最新法规,并检查是否符合相关的指导方针。
例如,最近生效的欧盟 AI 法案 2024对 AI 的开发、部署和使用提出了详细的指导方针,包括强制要求 AI 生成内容加水印等指导原则。
同样,跟踪大科技公司如 NVIDIA、OpenAI、Anthropic 等的动态,对于预测业务的短期和长期技术变革尤为重要。一个短期的例子是最近OpenAI 与微软的合作关系破裂的新闻,这可能影响任何依赖微软 Azure OpenAI 作为 LLM 供应商的正在进行的项目。
一个长期的例子是近期微软、亚马逊和谷歌等公司对核能项目的投资,以应对大型语言模型(LLM)对高能耗的日益增长需求,这一需求通常被视为 AI 进展的瓶颈。稳定、可预测且零碳的能源来源可能意味着为你的 AI 驱动型业务带来长期的成本节约。
如何培养这项技能?
-
每天通过应用程序(如Curio)或网站(如HackerNews)获取一剂科技新闻。
-
订阅几份每周的 AI 新闻通讯,或者根据你的工作量,尽可能多地订阅一些你能保持跟进的通讯。我是一个高度自觉的人,我唯一依赖的是The Batch。
3. 成为一名沟通高手
对于那些从数据科学家晋升为新领导角色的幸运少数人来说,软性沟通技巧——对于管理团队、数据讲故事和跨团队合作至关重要——对他们来说是自然而然的。然而,对于其他人来说,还是有希望的!只要通过实践,任何技能都是可以实现的。
在你问为什么这一点至关重要之前,想象一下,如果你不知道如何向一群非技术背景的风投和投资者推销你的优秀数据产品,会是怎样的情景。或者如何有效地传达你一周来的 EDA 过程中的洞察。又或者在关键产品发布期间,如何正确地激励你那些聪明但有些不堪重负的数据科学家。
晋升到领导职位意味着要坚定但礼貌,清楚地解释团队需要做什么,并且在与利益相关者沟通时,要明确技术上的限制,阐明他们的要求和实际可行范围之间的差距——同时考虑到成本、延迟等限制因素。
这意味着,当一个利益相关者说“ChatGPT 几秒钟就能做到”时,或者有人要求“100%准确的模型”时,保持冷静。
为了有效地进行沟通,你需要学习不同的动态。你需要比起冲动反应,更加外交和理性,尤其是在有人建议*“尝试那些在会议中提出的 20 个想法”*,或者在你明显察觉到范围蔓延时,避免使用不恰当的口头和非语言提示。
如何培养这项技能?
-
同样,书籍在这里可以是你的好朋友。这是我的书籍收藏,专注于团队动态管理,包括像情商 2.0、团队的五大功能障碍和关键对话:在重大时刻沟通的工具、令人信服的沟通等书籍。我最近写了一篇文章,分享了这些书籍是如何对帮助我作为技术负责人保持理智有着极大帮助的。
-
(书籍只能带你走这么远,所以要主动)领导工作中的利益相关者会议。没有什么能比得上亲身实践的经验。
-
在会议和研讨会上志愿参加圆桌讨论和炉边谈话。这些形式比你是唯一演讲者而其他人被动听讲时更为轻松,也能减轻压力。用事实、书籍中的证据、最新新闻和有信誉的研究论文支持你的讨论点,以确保你的论点有分量。
最后的思考
从核心数据科学家的角色转变为被人仰望的思想领袖,负责定义、预见并塑造数据团队的战略方向,可能会让你感到害怕。
但你需要记住,作为一个既有技术又有商业技能的人,没有人比你更适合掌控局面。
你理解黑箱模型背后的技术,这让你更容易找到可行的技术解决方案,同时你也拥有商业眼光,能够将这些解决方案与商业目标最好的对接。
希望这篇文章对你有所帮助,如果机会来临,希望你能够毫不犹豫地抓住它。看到你的公司/团队/业务单元取得成功,并知道自己在他们成长中扮演了角色,真的是一种非常有价值的经历。
2024 年成为数据科学家的 3 大挑战
在当前的环境下,数据科学适合你吗?
https://medium.com/@pelletierhaden?source=post_page---byline--a2e391a422c5--------------------------------https://towardsdatascience.com/?source=post_page---byline--a2e391a422c5-------------------------------- Haden Pelletier
·发布于Towards Data Science ·阅读时长 6 分钟·2024 年 6 月 27 日
–
图片来源:kaleb tapp来自Unsplash
现在是成为数据科学家的好时机。它是增长最快的职业之一,预计从2022 年到 2032 年的职位空缺将增长 35%。美国的平均薪资大约为 16 万美元(当然,这取决于经验)。该领域正在取得巨大进展,尤其是在人工智能领域,随着大型语言模型(LLMs)的出现,提供了许多新的任务和机会。
但是,所有这些优点背后也有一些独特的挑战,这些挑战是数据科学家目前正在面对的,并且在未来几年将继续面对。在你考虑进入这个领域之前,了解一些这些挑战非常重要,这样你才能评估这是否是适合你的职业道路。
1. 它是一个快速发展的领域
相较于金融和工程等其他领域,数据科学仍然是一个发展中的领域。数据科学的学位课程直到2012 年左右才开始广泛提供。即使在其他更加成熟的领域,随着现代技术和社会的不断发展,也会始终伴随变化。
新的工具、技术和语言每天都在开发中。Python 定期更新,其他相关技术也在不断发展……
构建涉及 API 的增量数据加载脚本时需要解决的 3 个关键问题
https://medium.com/@khoadaniel?source=post_page---byline--03723cad3411--------------------------------https://towardsdatascience.com/?source=post_page---byline--03723cad3411-------------------------------- Daniel Khoa Le
·发表于 Towards Data Science ·阅读时长 8 分钟·2024 年 6 月 30 日
–
简短说明
本文解释了使用 dlt(一个 Python 库)从 API 端点到数据库同步数据的概念框架和实际代码实现。
在本教程结束时,你将理解(并知道如何实现)以下示意图中的同步行为,在此示意图中,我们通过增量方式提取数据,并使用合并(去重)策略将数据写入目标表。
作者图片
背景
-
你希望将数据从一个应用程序(例如,广告效果、销售数据等)同步到你的数据库。
-
你的应用程序提供 API 端点来检索其数据。
-
数据需要每天同步到你的数据库。
-
你希望仅将 ❗***“新”数据(或更改部分)***❗ 加载到数据库中。你不希望每次同步时都重新加载整个数据集。
你如何在 Python 中实现这一点?
我将通过回答以下三个问题,带你了解解决方案。
💥 问题 1:我需要从 API 获取哪些信息以进行增量数据同步?
在开发增量加载脚本之前,我们需要了解我们正在使用的 API 端点的行为。
❗并不是所有的 API 都支持增量加载。
👉 答案:支持增量加载的查询参数
让我们来看一个应用程序的示例(或称为“源”应用程序),它跟踪你的销售业绩。在这个应用程序中,每条记录代表一个产品及其销售量。字段 created_at
和 updated_at
表示记录的创建和更新时间。
销售数据的变化通常有两种主要方式:
-
新产品已被添加到列表中。
-
更新会应用到现有记录的销售数据,这会导致
**updated_at**
的新值。这样可以帮助我们追踪新的变化;如果没有它,我们就无法知道哪些记录已被修改。
👁️👁️ 下面是源应用数据库中的示例销售表。
↪️ 昨天的数据:2 条记录
图片由作者提供
↪️ 今天的数据:新增了一条记录,并且修改了现有记录
图片由作者提供
🟢 要点: 如果 API 端点允许基于 updated_at
参数进行查询,你可以通过发起请求来只检索那些 updated_at
值晚于上次同步保存的 updated_at
的记录,从而实现增量加载。在这种情况下,updated_at
被称为增量游标,其值会持续到下次同步,这个值称为状态。
updated_at
字段是增量游标的常见选择。其他查询参数,如 id 或 sales,无法帮助我们增量请求数据,因为它们无法告诉我们自上次同步以来,哪些记录已被添加或更新。
你需要哪个查询参数来增量加载数据?
图片由作者提供
由于我们正在开发一个与 API 配合使用的数据加载脚本,我将介绍两个 API 的其他重要方面,以便代码实现:分页和路径参数。不过,它们与增量加载无关。
🤷 分页机制
API 通常会分批返回结果,以提高性能。例如,API 可能不会一次性返回 10,000 条记录,而是将响应限制为每次最多 100 条记录,要求你迭代处理后续批次。
为了管理这个,你通常(但并非总是)需要使用两个查询参数:limit
和 skip
(或 offset
)。
这里有一个简单的例子来说明:
对于第一个请求:
-
limit
=100 -
skip
=0
对于第二个请求,要跳过我们已经同步的前 100 条记录:
-
limit
=100 -
skip
=100
这一模式将持续进行,每批次后,skip
值会按 limit
增加,直到所有记录都被检索。
🟢 要点: 你需要理解 API 如何返回响应,以免在提取数据时漏掉任何记录。API 有很多管理分页的方法,超出了常用的 skip
和 offset
方法。这是另一个话题,留待以后再说。
🤷 路径参数
路径参数直接包含在 API 的 URL 中,通常用于区分数据的不同部分(分区)。例如,它们可能指定你营销账户中的不同活动或源应用中管理的不同子账户。
在下面的例子中:路径参数是 applicationId
和 campaignId
。
[
yourbaseurl.myapp/v1/applications/{applicationId}/campaigns/{campaignId}/](https://yourbaseurl.talon.one/v1/applications/%7BapplicationId%7D/campaigns/%7BcampaignId%7D/coupons/no_total)sales
🟢 **总结:**你需要决定是将来自同一 API 但具有不同路径参数的数据同步到同一张表,还是同步到不同的表(如 sales_campaign_1, sales_campaign_2 等)。
💥 问题 2:我如何将提取的记录写入目标表?
现在,假设你已经通过上述参数提取了一批记录,是时候决定如何将这些记录写入目标表了。
👉 答案:合并/去重模式(推荐)
这个问题涉及到**写入方式(Write disposition)或同步模式(Sync mode)**的选择。直接的答案是,如果你希望增量加载数据,你可能会选择以追加模式或合并模式(也叫去重模式)将提取的数据写入。
然而,让我们退后一步,更仔细地审视我们的选择,并确定哪种方法最适合增量加载。
以下是常见的写入方式。
-
🟪 覆盖/替换(overwrite/replace):删除目标表中所有现有记录,然后插入提取的记录。
-
🟪 追加(append):简单地将提取的记录追加到目标表中。
-
🟪 合并 / 去重(merge / dedup):插入新(*)记录并更新(**)现有记录。
(*) 我们怎么知道哪些记录是新的?:通常,我们会使用主键来确定。如果使用 dlt,它的合并策略可以比这更复杂,包括区分merge_key
和primary_key
(一个用于合并,一个用于去重后再合并),或者dedup_sort
(在去重过程中,哪些记录会被删除)。这一部分我将留到另一个教程讲解。
(**) 这是一个简单的解释,如果你想了解更多关于 dlt 如何处理这种合并策略的信息,可以点击这里阅读更多。
👁️👁️ 这里有一个例子帮助我们理解不同写入方式的结果。
↪️ 2024 年 6 月 19 日:我们进行了第一次同步。
🅰️ 数据在 **源应用程序**
️️
图片由作者提供
🅱️ 数据已加载到我们的 **目标数据库**
无论选择哪种同步策略,目标表中的数据严格来说是源表的副本。
图片由作者提供
已保存的 updated_at
状态 = 2024-06-03,这是我们同步的两条记录中最新的 updated_at
。
↪️ 2024 年 6 月 2 日:我们进行了第二次同步。
🅰️ ️️️️️️️数据在 **源应用程序**
图片由作者提供
✍️ 源表中的更改:
-
记录 ID=1 已更新(销售数据)。
-
记录 ID=2 已删除。
-
记录 ID=3 已插入。
在这次同步中,我们仅提取 updated_at
> 2024–06–03(上次同步时保存的状态)之后的记录。因此,我们只会提取记录 id=1 和 id=3。由于记录 id=2 已从源数据中删除,我们无法识别此变动。
在第二次同步后,你将能够看到不同的写入策略之间的差异。
🅱️ 数据已加载到我们的 **目标数据库**
❗ 场景 1:覆盖
图片由作者提供
目标表将被这次提取的两条记录覆盖。
❗ 场景 2:追加
图片由作者提供
这两条提取的记录将被追加到目标表中,现有的记录不会受到影响。
❗ 场景 3:合并或去重
图片由作者提供
提取的两条记录,id=1 和 id=3,将替换目标中的现有记录。这一处理过程被称为合并或去重。目标表中的记录 id=2 将保持不变。
🟢 总结: 合并(去重)策略在增量数据加载管道中可能非常有效,但如果你的表非常大,去重过程可能需要相当长的时间。
💥 问题 3:我如何在代码中实现它?
👉 答案:dlt —— 因为它轻量、文档齐全,并且有活跃的社区支持。
dlt 是一个非常不错的选择,因为它提供了适当的抽象层次。事实上,你可以选择你需要的抽象程度。如你在我下面的示例代码中看到的,我主动编写了自己的请求循环,但 dlt 提供了可以用更少代码行完成的辅助函数。这种灵活性使得 dlt 相较于其他解决方案脱颖而出。
你可以参考这个图表来获得高层次的视图,然后再深入到带有详细备注的代码中。
小提示:dlt 在其结构中使用了 源 和 资源 这两个术语。资源通常对应一个 API 端点,并将数据写入目标数据库中的表。源是资源的集合。
在下面的插图中,你可以看到我们讨论的两个问题的答案:
-
问题 1 的答案:使用日期游标向 API 端点发送请求,逐步获取数据(并持久化游标值,也就是状态,以便后续执行)。
-
问题 2 的答案:使用合并策略将数据写入目标表。
现在,你可能想知道如何运行这个 Python 脚本?我建议你访问这个代码库,并亲自尝试一下。这个代码库还为你提供了一个模拟 API,你可以在本地部署进行测试。查看 README 获取详细的执行指南。
💥 这里是我附带备注的 dlt 实现片段 💥
🟣️ 完整代码可以在仓库中查看 点击这里🟣
✅ 本教程到此结束。希望您已经了解了构成增量加载脚本的不同组件,以及代码的实现方法。
如果您有兴趣了解如何使用 dlt 构建增量加载脚本,请查看他们的文档点击这里。
关于我
我是 Daniel Le,居住在柏林,目前从事数据工程和机器学习领域的工作。
我对新技术充满兴趣,尤其是它们如何应用于解决现实世界中的问题。
如果您有任何疑问或希望进一步讨论这些兴趣,欢迎通过LinkedIn与我联系。
参考文献
每个数据科学家必须了解的概率分布的 3 个关键概念
你知道 PMF、PDF 和 CDF 实际上是什么意思吗?它们是所有分布的核心。
https://zubairhossain.medium.com/?source=post_page---byline--bfb429c61cc6--------------------------------https://towardsdatascience.com/?source=post_page---byline--bfb429c61cc6-------------------------------- Md. Zubair
·发布于 Towards Data Science ·5 分钟阅读·2024 年 5 月 28 日
–
图片由作者提供
动机
有许多实际事件,我们知道其确切的结果,例如 1+1=2,3x2=6,等等。还有许多不可能发生的事件,例如太阳从西方升起、牛在天空中飞等。在这两种情况下,我们对结果有 100%的把握。但对于不可预测的事件,例如明天早上是否会下雨,我们能有多大的把握呢?在这里,概率的必要性就体现出来了!
***[注意:*** [***如果你想执行包含的分布图,请访问笔记本***](https://deepnote.com/workspace/zubair-6f469541-5170-4b0d-a125-36e6a5c03769/project/Article-code-c3041ae8-e1f6-4485-999e-5738394b76e3/notebook/Probability%20PDF%20and%20CDF-c6c26d65d9e74be38914ecd8f55fcee3)***.]***
目录
-
概率
-
概率分布
-
离散概率分布和 PMF
-
连续概率分布、PDF 和 CDF
-
总结
概率
概率表示随机事件发生的可能性。 以抛硬币为例,如果你随机抛掷硬币,可能有两种结果——正面或反面。因此,如果抛掷硬币,结果是正面的概率为 50%,而…
机器学习的 3 种关键编码技术:适合初学者的指南,包含优缺点和 Python 代码示例
我们应该如何在标签编码、独热编码和目标编码之间做选择呢?
https://medium.com/@ryuryu09030903?source=post_page---byline--aff8a01a7b6a--------------------------------https://towardsdatascience.com/?source=post_page---byline--aff8a01a7b6a-------------------------------- Ryu Sonoda
·发表于 Towards Data Science ·15 分钟阅读·2024 年 2 月 7 日
–
为什么我们需要编码?
在机器学习领域,大多数算法要求输入为数字形式,特别是在许多流行的 Python 框架中。例如,在 scikit-learn 中,线性回归和神经网络要求数字变量。这意味着我们需要将分类变量转换为数值变量,以便这些模型能够理解它们。然而,对于像基于树的模型,通常不需要这一过程。
今天,我很高兴为大家介绍三种基本的编码技术,它们是每个初学数据科学家的必备技能!另外,我在最后还附上了一个实用的小贴士,帮助你更好地理解这些技术的实际应用!除非特别说明,所有代码和图片均由作者创作。
标签编码 / 顺序编码
标签编码和顺序编码都涉及将整数分配给不同的类别。区别在于类别变量是否本身具有顺序。例如,“强烈同意”,“同意”,“中立”,“不同意”和“强烈不同意”是有序的,因为它们遵循特定的顺序。当一个变量没有这样的顺序时,我们使用标签编码。
让我们深入探讨标签编码。
我已经准备了一个合成数据集,包含数学考试成绩和学生最喜欢的科目。这个数据集旨在反映偏爱 STEM 科目的学生获得更高的分数。以下代码展示了数据集的合成过程。
import numpy as np
import pandas as pd
math_score = [60, 70, 80, 90]
favorite_subject = ["History", "English", "Science", "Math"]
std_deviation = 5
num_samples = 30
# Generate 30 samples with a normal distribution
scores = []
subjects = []
for i in range(4):
scores.extend(np.random.normal(math_score[i], std_deviation, num_samples))
subjects.extend([favorite_subject[i]]*num_samples)
data = {'Score': scores, 'Subject': subjects}
df_math = pd.DataFrame(data)
# Print the DataFrame
print(df_math.sample(frac=0.04))import numpy as np
import pandas as pd
import random
math_score = [60, 70, 80, 90]
favorite_subject = ["History", "English", "Science", "Math"]
std_deviation = 5 # Standard deviation in cm
num_samples = 30 # Number of samples
# Generate 30 samples with a normal distribution
scores = []
subjects = []
for i in range(4):
scores.extend(np.random.normal(math_score[i], std_deviation, num_samples))
subjects.extend([favorite_subject[i]]*num_samples)
data = {'Score': scores, 'Subject': subjects}
df_math = pd.DataFrame(data)
# Print the DataFrame
sampled_index = random.sample(range(len(df_math)), 5)
sampled = df_math.iloc[sampled_index]
print(sampled)
你会惊讶于数据编码是多么简单——只需一行代码!你可以传递一个字典,将主题名称和数字映射到 pandas 数据框的默认方法,如下所示。
# Simple way
df_math['Subject_num'] = df_math['Subject'].replace({'History': 0, 'Science': 1, 'English': 2, 'Math': 3})
print(df_math.iloc[sampled_index])
手动编码
但是,如果你处理的是大量的类别,或者你希望找到一种更直接的方法怎么办?这时,scikit-learn 库中的**LabelEncoder**
函数就派上了用场。它根据类别的字母顺序自动编码。为了获得最佳体验,我建议使用 1.4.0 版本,它支持我们正在讨论的所有编码器。
# Scikit-learn
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df_math["Subject_num_scikit"] = le.fit_transform(df_math[['Subject']])
print(df_math.iloc[sampled_index])
使用 scikit-learn 库进行编码
然而,有一个问题。考虑一下:我们的数据集并没有暗示喜欢的科目之间存在有序关系。例如,“历史”被编码为 0,但这并不意味着它比编码为 3 的“数学”更“低级”。类似地,“英语”和“科学”之间的数值差距小于“英语”和“历史”之间的差距,但这不一定反映它们之间的相对相似性。
这种编码方法也会影响某些算法的可解释性。例如,在线性回归中,每个系数表示预测变量变化 1 单位时,结果变量的预期变化。但是,当一个主题被数值编码时,我们该如何解释“单位变化”?让我们通过对我们的数据集进行线性回归来进行理解。
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(df_math[["Subject_num"]], df_math[["Score"]])
coefficients = model.coef_
print("Coefficients:", coefficients)
我们如何解释这里的系数 8.26 呢?最直观的方式是,当标签变化 1 单位时,测试分数变化 8。但这对于从科学(编码为 1)到历史(编码为 2)并不完全正确,因为我合成的方式使得平均分分别为 80 和 70。所以,当我们标记每个类别的方式没有实际意义时,我们不应解释该系数!
现在,转到有序编码,我们将其应用于另一个合成数据集,这次专注于身高和学校类别。我已经调整这个数据集,以反映不同学校级别的平均身高:幼儿园 110 厘米,小学 140 厘米,依此类推。让我们看看结果如何。
import numpy as np
import pandas as pd
# Set the parameters
mean_height = [110, 140, 160, 175, 180] # Mean height in cm
grade = ["kindergarten", "elementary school", "middle school", "high school", "college"]
std_deviation = 5 # Standard deviation in cm
num_samples = 10 # Number of samples
# Generate 10 samples with a normal distribution
heights = []
grades = []
for i in range(5):
heights.extend(np.random.normal(mean_height[i], std_deviation, num_samples))
grades.extend([grade[i]]*10)
data = {'Grade': grades, 'Height': heights}
df = pd.DataFrame(data)
sampled_index = random.sample(range(len(df)), 5)
sampled = df.iloc[sampled_index]
print(sampled)
一部分合成的学校身高数据
scikit-learn 的预处理工具包中的**OrdinalEncoder**
是处理有序变量的一个真正的宝藏。它非常直观,自动确定有序结构并相应地进行编码。如果你查看 encoder.categories_,你可以检查变量是如何被编码的。
from sklearn.preprocessing import OrdinalEncoder
encoder = OrdinalEncoder(categories=[grade])
df['Category'] = encoder.fit_transform(df[['Grade']])
print(encoder.categories_)
print(df.iloc[sampled_index])
编码完成后
对于序数类别变量,解释线性回归模型变得更加简单。编码反映了教育程度的数值顺序——教育程度越高,其对应的数值越大。
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(df[["Category"]], df[["Height"]])
coefficients = model.coef_
print("Coefficients:", coefficients)
height_diff = [mean_height[i] - mean_height[i-1] for i in range(1, len(mean_height),1)]
print("Average Height Difference:", sum(height_diff)/len(height_diff))
模型揭示了一些直观的内容:学校类型的单位变化对应身高增加 17.5 厘米。考虑到我们的数据集,这完全合情合理!
那么,让我们用一个快速的总结来结束标签/序数编码:
优点:
-
简单性:用户友好,易于实现。
-
效率:这种方法对计算资源和内存的要求较低,仅生成一个新的数值特征。
-
适用于有序类别:在处理具有自然顺序的类别变量时,独热编码表现得尤为出色。
缺点:
-
隐含顺序:一个潜在的缺点是,它可能会引入一种本不存在的顺序,导致误解(比如认为标记为‘3’的类别优于标记为‘2’的类别)。
-
并非总是适用:某些算法,如线性回归或逻辑回归,可能会错误地将编码后的数值解释为具有序数意义。
独热编码
接下来,让我们深入探讨另一种解决可解释性问题的编码技术:独热编码。
标签编码的核心问题是,它为那些本身没有顺序的变量强加了一个序数结构,通过将类别替换为数值。独热编码通过为每个类别创建一个单独的列来解决这个问题。每个列包含二进制值,表示该行是否属于该类别。 这就像是将数据转换为更宽格式,对于熟悉这种概念的人来说。为了更清楚地说明这一点,我们来看一个使用math_score
和subject
数据的例子。**OneHotEncoder**
来自 sklearn.preprocessing,非常适合这个任务。
from sklearn.preprocessing import OneHotEncoder
data = {'Score': scores, 'Subject': subjects}
df_math = pd.DataFrame(data)
y = df_math["Score"] # Target
x = df_math.drop('Score', axis=1)
# Define encoder
encoder = OneHotEncoder()
x_ohe = encoder.fit_transform(x)
print("Type:",type(x_ohe))
# Convert x_ohe to array so that it is more compatible
x_ohe = x_ohe.toarray()
print("Dimension:", x_ohe.shape)
# Convet back to pandas dataframe
x_ohe = pd.DataFrame(x_ohe, columns=encoder.get_feature_names_out())
df_math_ohe = pd.concat([y, x_ohe], axis=1)
sampled_ohe_idx = random.sample(range(len(df_math_ohe)), 5)
print(df_math_ohe.iloc[sampled_ohe_idx])
通过独热编码进行编码
现在,我们的数据集不再只有一个‘学科’列,而是为每个学科单独设置了列。这有效地消除了任何不必要的序数结构!不过,这个过程稍微复杂一些,我来解释一下。
与标签/序数编码一样,你首先需要定义编码器。但独热编码的输出有所不同:标签/序数编码返回一个 numpy 数组,而独热编码通常生成一个scipy.sparse._csr.csr_matrix
。为了将其与 pandas 数据框架结合使用,你需要将其转换为数组。然后,创建一个包含这个数组的新数据框,并为其指定列名,这些列名可以通过编码器的get_feature_names_out()
方法获取。或者,你也可以通过在定义编码器时设置sparse_output=False
来直接获得 numpy 数组。
然而,在实际应用中,你不需要经历所有这些步骤。我将在讨论的最后向你展示使用**make_column_transformer**
的更简化方法!
现在,让我们继续对我们的独热编码数据进行线性回归。这应该使得解释变得更容易,对吧?
model = LinearRegression()
model.fit(x_ohe, y)
coefficients = model.coef_
intercept = model.intercept_
print("Coefficients:", coefficients)
print(encoder.get_feature_names_out())
print("Intercept:",intercept)
每列的截距和系数
等等,为什么系数这么小,截距又这么大?到底出了什么问题?这个困惑是线性回归中的一个特定问题,叫做完美多重共线性。完美多重共线性发生在当线性回归模型中的一个变量可以通过其他变量完美预测时,独热编码中也会出现这种情况,因为如果其他类别都为零,一个类别就可以被推断出来。为了避免这个问题,我们可以通过设置OneHotEncoder(drop=”first”)
来去除一个类别。让我们看看这一调整的影响。
encoder_with_drop = OneHotEncoder(drop="first")
x_ohe_drop = encoder_with_drop.fit_transform(x)
# if you don't sparse_output = False, you need to run the following to convert type
x_ohe_drop = x_ohe_drop.toarray()
x_ohe_drop = pd.DataFrame(x_ohe_drop, columns=encoder_with_drop.get_feature_names_out())
model = LinearRegression()
model.fit(x_ohe_drop, y)
coefficients = model.coef_
intercept = model.intercept_
print("Coefficients:", coefficients)
print(encoder_with_drop.get_feature_names_out())
print("Intercept:",intercept)
每列的截距和系数(去除一列)
在这里,英语列已经被去除,现在系数看起来更加合理了!而且,它们也更容易解释。当所有的独热编码列都为零(表示英语是最喜欢的科目)时,我们预测考试成绩大约为 71(与我们为英语定义的平均分数一致)。对于历史科目,成绩是 71 减去 11 等于 60,对于数学,成绩是 71 加上 19,以此类推。
然而,独热编码有一个显著的警告:它可能导致高维数据集,特别是当变量具有大量类别时。让我们考虑一个包含 1000 行数据集的情况,每一行代表一个具有各种特征的独特产品,其中一个类别跨越了 100 种不同类型。
# Define 1000 categories (for simplicity, these are just numbered)
categories = [f"Category_{i}" for i in range(1, 200)]
manufacturers = ["Manufacturer_A", "Manufacturer_B", "Manufacturer_C"]
satisfied = ["Satisfied", "Not Satisfied"]
n_rows = 1000
# Generate random data
data = {
"Product_ID": [f"Product_{i}" for i in range(n_rows)],
"Category": [random.choice(categories) for _ in range(n_rows)],
"Price": [round(random.uniform(10, 500), 2) for _ in range(n_rows)],
"Quality": [random.choice(satisfied) for _ in range(n_rows)],
"Manufacturer": [random.choice(manufacturers) for _ in range(n_rows)],
}
df = pd.DataFrame(data)
print("Dimension before one-hot encoding:",df.shape)
print(df.head())
产品的合成数据集
请注意,数据集的维度是 1000 行和 5 列。现在,让我们观察应用独热编码后的变化。
# Now do one-hot encoding
encoder = OneHotEncoder(sparse_output=False)
# Reshape the 'Category' column to a 2D array as required by the OneHotEncoder
category_array = df['Category'].values.reshape(-1, 1)
one_hot_encoded_array = encoder.fit_transform(category_array)
one_hot_encoded_df = pd.DataFrame(one_hot_encoded_array, columns=encoder.get_feature_names_out(['Category']))
encoded_df = pd.concat([df.drop('Category', axis=1), one_hot_encoded_df], axis=1)
print("Dimension after one-hot encoding:", encoded_df.shape)
维度显著增加了!
在应用独热编码后,我们的数据集维度膨胀到了 1000x201——比之前大了整整 40 倍。这一增长是个问题,因为它需要更多的内存。而且,你会注意到新创建的列中的大多数值都是零,这就导致了我们所谓的稀疏数据集。某些模型,特别是基于树的模型,处理稀疏数据时会遇到困难。此外,处理高维数据时会出现其他挑战,通常被称为“维度灾难”。另外,由于独热编码将每个类别当作一个独立的列,我们会失去任何顺序信息。因此,如果你的变量中的类别本身具有层次顺序,独热编码可能不是最佳选择。
我们如何应对这些缺点?一种方法是使用不同的编码方式。或者,你可以限制变量的类别数量。通常,即使类别数量很多,变量的大多数值也集中在少数几个类别中。在这种情况下,将这些少数类别视为“其他”类别可能会很有效。这可以通过设置如**min_frequency**
或**max_categories**
之类的参数,在 OneHotEncoder 中实现。另一种应对稀疏数据的策略是使用特征哈希技术,本质上是通过哈希函数将多个类别映射到一个低维空间,或者使用 PCA 等降维技术。
这是独热编码的简要总结:
优点:
-
防止误导性解释:避免模型将数据误解为有某种顺序,这是标签/目标编码中常见的问题。
-
适用于非序数特征:非常适合没有序数关系的类别数据。
缺点:
-
维度增加:会显著增加数据集的维度,这在变量类别较多时尤为成问题。
-
稀疏矩阵:会导致许多列填充零,生成稀疏数据。
-
高基数特征效率低:对于类别数较多的变量效果较差。
目标编码
现在,让我们探索目标编码,这是一种在高基数数据和树模型等算法中特别有效的技术。
目标编码的本质是利用因变量的值信息。其实现方式根据任务的不同而有所变化。在回归任务中,我们通过每个类别的因变量均值来编码目标变量。在二分类任务中,编码是通过目标变量所属类别的概率来进行的(该概率通过该类别中结果为 1 的行数与该类别总行数之比计算得到)。在多分类任务中,类别变量是基于所属每个类别的概率进行编码的,结果会产生与因变量中的类别数量相等的新列。为了更清楚地说明这一点,让我们使用与独热编码相同的商品数据集。
让我们从回归任务中的目标编码开始。假设我们想要预测商品价格,并希望对商品类型进行编码。与其他编码方式类似,我们使用来自 sklearn.preprocessing 的TargetEncoder!
from sklearn.preprocessing import TargetEncoder
x = df.drop(["Price"], axis=1)
x_need_encode = df["Category"].to_frame()
y = df["Price"]
# Define encoder
encoder = TargetEncoder()
x_encoded = encoder.fit_transform(x_need_encode, y)
# Encoder with 0 smoothing
encoder_no_smooth = TargetEncoder(smooth=0)
x_encoded_no_smooth = encoder_no_smooth.fit_transform(x_need_encode, y)
x_encoded = pd.DataFrame(x_encoded, columns=["encoded_category"])
data_target = pd.concat([x, x_encoded], axis=1)
print("Dimension before encoding:", df.shape)
print("Dimension after encoding:", data_target.shape)
print("---------")
print("Encoding")
print(encoder.encodings_[0][:5])
print(encoder.categories_[0][:5])
print(" ")
print("Encoding with no smooth")
print(encoder_no_smooth.encodings_[0][:5])
print(encoder_no_smooth.categories_[0][:5])
print("---------")
print("Mean by Category")
print(df.groupby("Category").mean("Price").head())
print("---------")
print("dataset:")
print(data_target.head())
回归任务中的目标编码
编码后,你会注意到,尽管变量有许多类别,数据集的维度保持不变(1000 x 5)。你还可以观察每个类别是如何编码的。尽管我提到每个类别的编码是基于该类别的目标变量的均值,但你会发现,使用默认设置进行编码时,实际均值与编码结果略有不同。这种差异产生的原因是,默认情况下,函数会自动选择一个平滑参数。该参数将本地类别的均值与全局均值相结合,这对于防止样本量较少的类别过拟合非常有用。如果我们设置smooth=0
,编码值将与实际均值完全一致。
现在,让我们考虑二分类问题。假设我们的目标是判断产品的质量是否令人满意。在这种情况下,编码值表示该类别是“满意”的概率。
x = df.drop(["Quality"], axis=1)
x_need_encode = df["Category"].to_frame()
y = df["Quality"]
# Define encoder
encoder = TargetEncoder()
x_encoded = encoder.fit_transform(x_need_encode, y)
x_encoded = pd.DataFrame(x_encoded, columns=["encoded_category"])
data_target = pd.concat([x, x_encoded], axis=1)
print("Dimension:", data_target.shape)
print("---------")
print("Encoding")
print(encoder.encodings_[0][:5])
print(encoder.categories_[0][:5])
print("---------")
print(encoder.classes_)
print("---------")
print("dataset:")
print(data_target.head())
二分类的目标编码
你确实可以看到,encoded_category
表示的是“满意”的概率(介于 0 和 1 之间的浮动值)。要查看每个类别是如何编码的,你可以查看编码器的classes_
属性。对于二分类问题,列表中的第一个值通常会被丢弃,这意味着此列表示的是满意的概率。方便的是,编码器会自动检测任务类型,因此无需指定它是一个二分类任务。
最后,我们来看一个多类分类的例子。假设我们正在预测哪家制造商生产了某个产品。
x = df.drop(["Manufacturer"], axis=1)
x_need_encode = df["Category"].to_frame()
y = df["Manufacturer"]
# Define encoder
encoder = TargetEncoder()
x_encoded = encoder.fit_transform(x_need_encode, y)
x_encoded = pd.DataFrame(x_encoded, columns=encoder.classes_)
data_target = pd.concat([x, x_encoded], axis=1)
print("Dimension:", data_target.shape)
print("---------")
print("Encoding")
print(encoder.encodings_[0][:5])
print(encoder.categories_[0][:5])
print("---------")
print("dataset:")
print(data_target.head())
多类分类的目标编码
编码后,你会看到现在我们有了每个制造商的列。这些列表示一个产品属于某个类别并由该制造商生产的概率。尽管我们的数据集略有扩展,但因变量的类别数通常较少,因此不太可能引起问题。
目标编码对于基于树的模型尤其有利。这些模型根据特征值进行划分,目的是最有效地分隔目标变量。通过直接结合目标变量的均值,目标编码为模型提供了一种清晰且高效的划分方式,通常比其他编码方法更有效。
然而,使用目标编码时需要谨慎。如果某个类别的观测样本很少,而且这些样本不能代表该类别的真实均值,就有可能导致过拟合。
这引出了另一个关键点:在将数据拆分为训练集和测试集之后执行目标编码是至关重要的。如果提前进行编码,可能会导致数据泄漏,因为编码会受到测试数据集中的结果的影响。这可能导致模型在训练数据集上表现得非常好,给您一个虚假的效果评价。因此,为了准确评估模型的性能,确保在训练集和测试集拆分后再进行目标编码。
这里是关于目标编码的简要总结:
优点:
-
控制基数:对于高基数特征非常有效,因为它不会增加特征空间。
-
能够捕获标签中的信息:通过引入目标数据,它通常能够提高预测性能。
-
对树模型有用:特别适用于复杂模型,如随机森林或梯度提升机。
缺点:
-
过拟合风险:特别是当类别的观察数据量有限时,过拟合的风险会增加。
-
目标泄漏:它可能无意中将未来的信息引入模型,即目标变量中的细节,这些细节在实际预测中是无法访问的。
-
可解释性较差:由于转换是基于目标的,与独热编码或标签编码等方法相比,它们可能更难解释。
最后的提示
总结一下,我想提供一些实用的建议。在整个讨论中,我们已经探讨了不同的编码技术,但实际上,您可能希望对数据集中的不同变量应用不同的编码。这时候,**make_column_transformer**
来自 sklearn.compose 就非常有用了。例如,假设您正在预测产品价格,并决定对“类别”使用目标编码,因为其基数较高,而对“制造商”和“质量”使用独热编码。为此,您可以定义包含每种编码类型变量名称的数组,并像下面这样应用该函数。这个方法使得您能够无缝地处理转换后的数据,从而得到一个高效编码的数据集,准备好进行分析!
from sklearn.compose import make_column_transformer
ohe_cols = ["Manufacturer"]
te_cols = ["Category", "Quality"]
encoding = make_column_transformer(
(OneHotEncoder(), ohe_cols),
(TargetEncoder(), te_cols)
)
x = df.drop(["Price"], axis=1)
y = df["Price"]
# Fit the transformer
x_encoded = encoding.fit_transform(x, y)
x_encoded = pd.DataFrame(x_encoded, columns=encoding.get_feature_names_out())
x_rest = x.drop(ohe_cols+te_cols, axis=1)
print(pd.concat([x_rest, x_encoded],axis=1).head())
使用 make_column_faster 结合目标编码和独热编码
非常感谢您抽出时间阅读这篇文章!当我第一次开始我的机器学习旅程时,选择正确的编码技术并理解它们的实现对我来说是一件相当复杂的事。我真诚地希望这篇文章能为您提供一些启示,让您的路径变得更加清晰!
来源:
Scikit-learn: Python 中的机器学习,Pedregosa 等人,JMLR 12,页 2825–2830,2011。
Scikit-learn 文档: