TowardsDataScience 2023 博客中文翻译(一百六十)

原文:TowardsDataScience

协议:CC BY-NC-SA 4.0

我如何通过第一个 #30DayChartChallenge 学习 Observable Plot

原文:towardsdatascience.com/how-i-used-my-first-30daychartchallenge-to-learn-observable-plot-78141929e3e2?source=collection_archive---------6-----------------------#2023-10-13

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Deepsha Menghani

·

关注 发表在 数据科学前沿 ·6 分钟阅读·2023 年 10 月 13 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 Isaac Smith 提供,出处 Unsplash

如果你在数据领域工作,你可能熟悉那种有一长串工具列表等待学习的感觉,希望有一天能实现。对我而言,我的列表上有很长时间的一项是Observable Plot,这是一个用于探索性数据可视化的 JavaScript 库。终于在今年,我决定利用#30DayChartChallenge来深入了解这个令人惊叹的库。作为第一次参与这个挑战的人,我想分享我的经验和所获得的见解,并为那些考虑参与类似即将到来的挑战的人提供建议。

什么是 #30DayChartChallenge

#30DayChartChallenge 是一个由社区驱动的挑战,每年四月举行。每天有一个主题提示,为当天的可视化提供灵感,数据可视化创作者可以根据这个主题进行解释。对数据来源或工具的使用没有限制。对于数据爱好者、设计师和有志的数据可视化艺术家来说,这是一个迷人的活动。

为什么我参与了 #30DayChartChallenge。

我决定参加挑战是由于几个因素驱动的:

  • 探索 Observable Plot 库: 这是我的主要目标。我想通过深入了解所有 JS 基础的Observable Plot库来扩展我的技能并探索新的交互式数据可视化工具。你可以在我的#30DayChartChallenge collection中找到所有我的可视化的代码和数据来源,包括这里提到的那些。

  • 提升数据可视化技能: 我迫切希望提高将原始数据转化为视觉上吸引人且信息丰富的图表和图形的能力。

  • 激发创造力: 这个挑战提供了一个独特的机会,可以尝试各种数据可视化技术和创意,推动我跳出固有思维。它提供了一种有趣的方式来发挥我的创造力。

  • 建立联系: #30DayChartChallenge 社区由来自不同背景的数据爱好者组成,为网络交流和分享创意提供了一个很好的平台。

从我第一次 #30DayChartChallenge 学习新工具的经验中获得的建议

1. 规划 — 你值得信赖的盟友:

由于提示在月份开始前很久就已提供,所以可以提前分配时间进行头脑风暴,寻找数据来源,并草拟粗略设计。挑战开始前的规划允许你专注于可视化过程和学习,而不会每天感到不堪重负。我浏览过的一些最喜欢的数据来源慷慨地来自Our World in DataKaggle

这是我使用 US tornadoes dataset 从 Kaggle 创建的可视化,用于第 7 天的“危险”提示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第 7 天:危险,来源:#30DayChartChallenge collection

2. 数据重用的艺术:

每天寻找新的数据来激励你,持续 30 天会很快让人感到疲惫。重复使用数据,尝试用新的方式讲述相同的故事。

以下第一个图是第 6 天的“数据日:OWID”提示。我使用了累积土地使用变化数据,涵盖了六个国家一个世纪的时间。在第 28 天的提示是“趋势”,我认为这些数据也很适合。因此,我没有讲述一个新的故事,而是专注于通过动画讲述故事,这样我既可以在使用相同数据的同时学习新东西,又能节省寻找数据的时间。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第 6 天:数据日 — OWID,来源:#30DayChartChallenge collection

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第 28 天:趋势,来源:#30DayChartChallenge collection

3. 目标的清晰度。

确定你参加挑战的目标。对我来说,学习 Observable Plot 库是主要的重点。这种清晰度帮助我在整个过程中保持专注和积极。有时这意味着我不得不接受一个花费时间较长的“足够好”的图,即使有其他我已经熟悉的工具如 ggplot2,我可以用它们在更短的时间内制作更好的图。

这是我为第 5 天的“斜率”提示创建的图,使用了动物园动物寿命数据。这个简单的折线图和点图花了我太多时间去弄清楚,因为我在学习一个新工具,但完成它时感觉很值得。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第 5 天:斜率,来源:#30DayChartChallenge collection

4. 追求成长,而非完美!

这很困难,因为我们都希望每天都能发布出最好的可视化。拥抱学习过程,并接受不是每个可视化都会完美,这是避免在挑战中感到疲惫的关键。专注于提高你的技能和对数据可视化概念的理解。

这是第 13 天的一个示例,提示是“流行文化”。在一天长时间的工作之后,当我坐下来进行挑战时,我想学习创建一个径向图,以查看超级碗广告类别分布如何随着时间变化。我曾设想为所有类别创建它,我从最感兴趣的 4 个类别开始。虽然这不是最终计划,也很难停在这里,但我决定在 4 个类别时结束,以免疲惫并为第二天的可视化保留精力。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第 13 天:流行文化,来源:#30DayChartChallenge collection

5. 庆祝这段旅程!

庆祝你的成就,无论多小。认可你的进步和成长,最重要的是不要陷入与他人比较的陷阱,而要以此为灵感。记住,这个挑战是关于个人成长和学习的。我发布的前几个图表远不如我看到的其他人的精彩,但在最初的几天里,提醒自己在变得更好之前会很糟糕,这是很重要的。

不必完成所有三十天,参与其中可能会很累,但也很有影响力,所以只要你能参与就足够了,每次出现都应该庆祝。

这是我在最后一周为了好玩制作的一个图表,使用了大脚怪数据,因为谁不喜欢大脚怪呢,而在最后一周,我已经逼自己很辛苦了,需要一些乐趣来继续前进!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:#30DayChartChallenge collection

向前迈进,持续进步!

参加#30DayChartChallenge 对我来说是一次变革性的经历。我提高了数据可视化技能,掌握了一个新库,并与许多了不起的创作者进行了交流和学习。现在,我的代码库以及所有数据源充当了个人的 Observable Plot 备忘单,我经常参考。最近,我在与两位非常有才华的数据可视化艺术家 Tanya Shapiro 和 Allison Horst 的小组讨论中分享了我通过#30DayChartChallenge 学习 Observable Plot 的经历。

我希望这篇文章鼓励你参与你的第一次#30DayChartChallenge,也许还可以用它来学习一个新工具。今年 11 月还会有#30DayMapChallenge,届时的每日提示已经在这里提供了。所以,现在是时候开始为假期季节做计划了。

你可以在我的Observable collection中找到重现本文所有可视化的代码和数据。

如果你愿意,可以在Linkedin上找到我。

如何赢得新加坡的 GPT-4 提示工程竞赛

原文:towardsdatascience.com/how-i-won-singapores-gpt-4-prompt-engineering-competition-34c195a93d41

深入探讨我学习到的利用大型语言模型(LLMs)力量的策略

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Sheila Teo

·发表于 Towards Data Science ·阅读时长 23 分钟·2023 年 12 月 29 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

庆祝一个里程碑——真正的胜利是无价的学习体验!

上个月,我荣幸地赢得了新加坡首届 GPT-4 提示工程竞赛,该竞赛汇聚了超过 400 位极具才华的参与者,由新加坡政府技术局(GovTech)组织。

提示工程是一门结合了艺术和科学的学科——它既需要技术理解,也需要创造力和战略思维。这是我在过程中学习到的提示工程策略的汇编,这些策略能推动任何 LLM 做你需要的事,甚至更多!

作者注释: 在撰写这篇文章时,我力求避免传统提示工程技术的过度讨论和文献记录。我的目标是通过实验带来新见解,并从个人角度理解和处理某些技术。希望你喜欢阅读这篇文章!

本文涵盖了以下内容, 🔵 指代初学者友好的提示技术,而 🔴 指代高级策略:

1. [🔵] 使用 CO-STAR 框架构建提示

2. [🔵] 使用分隔符对提示进行分段

3. [🔴] 创建带有 LLM 保护措施的系统提示

4. [🔴] 仅使用 LLMs 分析数据集,无需插件或代码 **—

通过实际例子分析真实的 Kaggle 数据集,使用 GPT-4**

1. [🔵] 使用 CO-STAR 框架构建提示

有效的提示结构对于从 LLM 获得最佳响应至关重要。CO-STAR 框架,由新加坡 GovTech 的数据科学与人工智能团队提出,是一个便于结构化提示的实用模板。它考虑了所有影响 LLM 响应效果和相关性的关键方面,从而产生更优的响应。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

CO-STAR 框架 — 作者提供的图像

这就是它的工作原理:

© 上下文:提供任务的背景信息

这帮助 LLM 理解正在讨论的具体场景,确保其响应相关。

(O) 目标:定义你希望 LLM 执行的任务

明确你的目标有助于 LLM 将响应集中在满足那个特定目标上。

(S) 风格:指定你希望 LLM 使用的写作风格

这可能是某个著名人士的写作风格,或是某个职业领域的专家,比如业务分析专家或首席执行官。这g指导 LLM 以与你的需求一致的方式和措辞作出回应。

(T) 语气:设定响应的态度

这确保了 LLM 的响应能够与所需的情感或情绪背景相契合。示例包括正式、幽默、富有同情心等。

(A) 受众:确定响应的目标人群

针对特定受众调整 LLM 的响应,例如领域专家、初学者、儿童等,可以确保其在所需的上下文中适当且易于理解。

® 响应:提供响应格式

这确保了 LLM 的输出格式完全符合你对后续任务的要求。举例来说,包括列表、JSON、专业报告等。对于大多数在 LLM 响应上进行程序化操作以便后续处理的 LLM 应用来说,JSON 输出格式是理想的。

CO-STAR 的实际应用

这是一个 CO-STAR 框架有用的真实世界示例。假设你是一名社交媒体经理,需要帮助撰写一个 Facebook 帖子来宣传公司新产品。

一个没有 CO-STAR 的简单提示可能看起来像这样:

撰写一个 Facebook 帖子来宣传我公司的新产品。我的公司名为 Alpha,产品叫做 Beta,是一种全新的超快速吹风机。

这是来自 GPT-4 的输出:

介绍 Alpha 的革命性 Beta 吹风机!

  • 告别漫长乏味的吹干头发时光!Alpha 自豪地推出 Beta,我们最新的头发护理技术创新。

  • 超快速干发:Beta 设计用来将你的吹干时间缩短一半,得益于其先进而强大的马达。更快准备好,享受更多做你喜欢的事情的时间!

立即购买:[产品页面链接]

尽管足够,但这个输出过于通用,缺乏与公司受众产生共鸣所需的具体细微差别和针对性吸引力。

这是一个使用 CO-STAR 模板的示例,它提醒您在提示中整合任务的其他方面,特别是前一个简洁提示中缺失的STYLETONEAUDIENCE方面:

CONTEXT

我想宣传我公司的新产品。我们公司的名字是 Alpha,产品叫 Beta,是一种全新的超快速吹风机。

OBJECTIVE

为我创建一个 Facebook 帖子,旨在促使人们点击产品链接购买。

STYLE

参考那些成功广告类似产品的公司,例如 Dyson,来模仿写作风格。

TONE

说服力强的

AUDIENCE

我公司在 Facebook 上的受众群体通常是老年人。请根据这个受众的需求调整您的帖子,关注他们通常关注的护发产品特点。

RESPONSE

简洁且有影响力的 Facebook 帖子。

通过应用 CO-STAR,GPT-4 的响应变得更具针对性和有效性:

以 Alpha Beta 为您的选择——智者一代的超快速吹风机。

重新发现简单有效的护发乐趣,尽在 Alpha Beta。我们的最新创新不仅仅是一款吹风机;它承诺迅速、温和地护理您的头发。

可靠的发型护理,适合那些欣赏生活精致事物的人。

  • 易于使用且直观:告别复杂的设备。Alpha Beta 是

为舒适和简约而打造,完美适合那些重视简洁明了的人。

无忧技术。

  • 节省时间的技术:我们理解您的时间非常宝贵。这就是为什么 Alpha Beta 显著缩短了干发时间,让您有更多时间享受生活的乐趣。

用 Alpha Beta 让每一天都成为美发好日子。体验

今天就拥抱优雅与简约。

[您的产品链接]

CO-STAR 框架引导您以结构化的方式提供有关任务的所有关键信息给 LLM,确保对您的需求进行量身定制和优化的响应。

2. [🔵] 使用分隔符分段提示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由 DALL·E 3 生成的图像

分隔符是特殊标记,帮助 LLM 区分提示中应该作为一个单元处理的部分。这一点很重要,因为您的整个提示以一个长序列的标记到达 LLM。分隔符通过将提示的特定部分围起来,提供结构,让这些部分被单独处理。

值得注意的是,分隔符对于简单任务的 LLM 响应质量可能没有影响。然而,任务越复杂,分隔符在分段上的使用对 LLM 响应的影响就越大。

分隔符作为特殊字符

分隔符可以是任何通常不会一起出现的特殊字符序列,例如:

  • ===

特殊字符的数量和类型不重要,只要它们足够唯一,以便 LLM 将它们理解为内容分隔符,而不是普通标点符号。

下面是一个使用这种分隔符在提示中如何使用的示例:

将<<>>中的每段对话的情感进行分类为

‘正面’或‘负面’。给出情感分类结果,不加其他前言文本。

示例对话

产品超出了我的预期!

示例输出

负面

正面

<<<

太棒了!

还有其他需要我帮助的吗?

感谢你们的出色服务!

不满意。

上面,示例使用分隔符###分段,章节标题为示例对话示例输出,以大写字母区分。前言说明了需要分类的对话被分段在<<<CONVERSATIONS>>>中,这些对话随后在提示底部给出,没有任何解释文本,但 LLM 理解这些是它应该分类的对话,因为分隔符<<<>>>的存在。

这是 GPT-4 的输出,情感分类结果没有其他前言文本输出,如我们所要求的:

正面

负面

作为 XML 标签的分隔符

另一种使用分隔符的方法是将它们作为 XML 标签。XML 标签是用尖括号括起来的标签,包括开标签和闭标签。例如,<tag></tag>。这种方法有效,因为 LLMs 已经在大量的 XML 格式的网页内容上进行了训练,并学会了理解其格式。

以上是使用 XML 标签作为分隔符结构化的相同提示:

将以下对话的情感分类为‘正面’或‘负面’,按照给出的示例。给出情感分类结果,不加其他前言文本。

前言文本。

正面

负面

产品。它超出了我的期望!

消极

积极

太棒了!

还有其他我可以帮助你的吗?

感谢你们的优质服务!

完全没有达到预期。

能帮忙吗?

对这次体验不满意。

使用相同名词来描述 XML 标签是有益的,如你在说明中所用的词汇。我们在上述提示中给出的说明是:

将以下对话的情感分类为两类之一,使用给出的示例。仅给出情感分类,不要附加其他

引言文本。

我们使用了名词conversationsclassesexamples。因此,我们作为分隔符使用的 XML 标签是<conversations><classes><example-conversations><example-classes>。这确保了 LLM 理解你的指示与用作分隔符的 XML 标签之间的关系。

再次,通过使用分隔符将指示分段,以清晰且结构化的方式确保 GPT-4 以你期望的方式做出回应:

积极

消极

3. [🔴] 使用 LLM 保护措施创建系统提示

在深入之前,需要注意的是,这一部分仅适用于具有系统提示功能的 LLM,与本文其他部分适用于任何 LLM 不同。最显著的具备这一功能的 LLM 当然是 ChatGPT,因此我们将以 ChatGPT 作为本部分的示例。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由 DALL·E 3 生成的图像

系统提示的术语

首先,让我们理清术语:关于 ChatGPT,存在大量资源几乎可以互换使用这三个术语:“系统提示”、“系统消息”和“自定义说明”。这让许多人(包括我!)感到困惑,以至于 OpenAI 发布了一篇文章来解释这些术语。这里是一个简要总结:

  • “系统提示”与“系统消息”是用于与 ChatGPT 通过其聊天补全 API 进行程序化交互的术语。

  • 另一方面,“自定义指令”是指在通过chat.openai.com/的用户界面与 ChatGPT 进行交互时使用的术语。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自企业 DNA 博客

总的来说,这三个术语指的是同一件事,所以不要让术语困惑你!接下来,本节将使用“系统提示”一词。现在,让我们深入探讨!

什么是系统提示?

系统提示是一个额外的提示,其中提供了关于 LLM 应该如何行为的指令。它被认为是额外的,因为它在你对 LLM 的“正常”提示(更广为人知的是用户提示)之外。

在聊天中,每次你提供新的提示时,系统提示就像一个过滤器,LLM 会在回应你的新提示之前自动应用它。这意味着系统提示在 LLM 在聊天中回应时会被考虑在内。

什么时候应该使用系统提示?

你可能会问的第一个问题是:为什么我应该在系统提示中提供指令,而不是在与 LLM 进行进一步对话之前,将其提供在新聊天的第一个提示中?

答案是因为 LLM 的对话记忆有其限制。在后续情况下,随着对话的进行,LLM 可能会“忘记”你提供给聊天的第一个提示,使这些指令变得过时。

另一方面,当在系统提示中提供指令时,这些系统提示指令会与每个新的提示一起自动被考虑在内。这确保了即使对话持续进行,无论聊天多长,这些指令仍然会被 LLM 接收。

总结:

使用系统提示提供你希望 LLM 在整个聊天过程中记住的指令。

系统提示应该包括什么?

系统提示中的指令通常包括以下类别:

  • 任务定义,使 LLM 始终记住在整个聊天过程中它需要做什么。

  • 输出格式,使得 LLM 始终记住应该如何响应。

  • 保护措施,使得 LLM 始终记住如何响应。保护措施是 LLM 治理的新兴领域,指的是 LLM 被允许操作的配置边界。

例如,系统提示可能看起来像这样:

你将使用以下文本回答问题:[插入文本]。

你将以这种格式回应:{“问题”: “答案”}。

如果文本中没有足够的信息来回答问题,请不要编造信息,直接回答“NA”。

你只允许回答与 [插入范围] 相关的问题。绝不要回答与年龄、性别和宗教等人口统计信息相关的问题。

每部分对应的类别如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

拆解系统提示 — 作者提供的图像

那么在“正常”的聊天提示中该包括什么呢?

现在你可能会想:这听起来像是系统提示中已经给出了很多信息。那么,我在“正常”提示(更常见的用户提示)中该放什么呢?

系统提示概述了当前任务的总体情况。在上述系统提示示例中,任务被定义为仅使用特定的文本进行问答,并且 LLM 被指示以格式 {"Question": "Answer"} 回复。

你将使用以下文本回答问题:[插入文本]。

你将以 JSON 对象的格式回应,格式为:{“Question”: “Answer”}。

在这种情况下,每个用户提示将只是你希望使用文本回答的问题。例如,用户提示可能是 "这段文本讲了什么?"。然后,LLM 将回应 {"这段文本讲了什么?": "这段文本讲的是..."}

但让我们进一步概括这个任务示例。在实际应用中,你更可能有多个文本片段需要提问,而不仅仅是一个。在这种情况下,我们可以将上述系统提示的第一行从

你将使用以下文本回答问题:[插入文本]。

你将使用提供的文本回答问题。

现在,每个用户提示将包括进行问答的文本和待回答的问题,例如:

[插入文本]

[插入问题]

这里,我们还使用 XML 标签作为分隔符,以便以结构化的方式向 LLM 提供所需的两部分信息。XML 标签中使用的名词 textquestion 与系统提示中使用的名词对应,以便 LLM 理解标签与系统提示指令的关系。

总结来说,系统提示应该给出整体任务的指示,而每个用户提示应该提供任务执行所需的具体细节。在这种情况下,例如,这些具体细节是文本和问题。

附录:使 LLM 防护措施动态化

上述内容通过系统提示中的几句话添加了防护措施。这些防护措施被固定下来,在整个聊天过程中不会改变。如果你希望在对话的不同阶段设置不同的防护措施,该怎么办?

对于 ChatGPT 用户界面的用户来说,目前没有简单的方法来做到这一点。然而,如果你以编程方式与 ChatGPT 交互,你是幸运的!对构建有效 LLM 保护措施的关注日益增加,已经开发出允许你以编程方式设置更详细和动态保护措施的开源包。

一个值得注意的是 NeMo Guardrails,由 NVIDIA 团队开发,它允许你配置用户和 LLM 之间的预期对话流程,从而在聊天的不同点设置不同的保护措施,使得随着聊天的进展,保护措施能够动态调整。我绝对推荐你去看看!

4. [🔴] 仅使用 LLMs 分析数据集,而不使用插件或代码

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 DALL·E 3 生成

你可能听说过 OpenAI 在 ChatGPT GPT-4 中的高级数据分析插件,该插件对高级(付费)账户开放。它允许用户将数据集上传到 ChatGPT,并直接在数据集上运行代码,从而实现准确的数据分析。

但你知道吗,你并不总是需要这样的插件来使用 LLMs 进行良好的数据集分析?让我们首先了解使用 LLMs 分析数据集的优势和局限性。

LLMs 擅长的数据集分析类型

正如你可能已经知道的那样,LLMs 在执行准确的数学计算方面存在限制,使得它们不适合进行需要精确定量分析的数据集任务,例如:

  • 描述性统计: 定量总结数字列,通过均值或方差等指标。

  • 相关性分析: 获取列之间的精确相关系数。

  • 统计分析: 例如,通过假设检验来确定数据点组之间是否存在统计显著差异。

  • 机器学习: 对数据集进行预测建模,例如使用线性回归、梯度提升树或神经网络。

对数据集执行这样的定量任务就是 OpenAI 高级数据分析插件存在的原因,这样编程语言可以介入,在数据集上运行代码来完成这些任务。

那么,为什么有人会希望仅使用 LLMs 而不使用这样的插件来分析数据集呢?

LLMs 擅长的各种数据集分析类型

LLMs 在识别模式和趋势方面表现出色。这种能力源于它们在各种庞大数据上的广泛训练,使它们能够辨别那些可能不立即显现的复杂模式。

这使得它们非常适合基于数据集中的模式发现的任务,例如:

  • 异常检测: 根据一个或多个列值识别偏离常规的异常数据点。

  • 聚类: 将具有相似特征的数据点在列中分组。

  • 跨列关系: 识别列之间的综合趋势。

  • 文本分析(针对基于文本的列):根据主题或情感进行分类。

  • 趋势分析(针对有时间维度的数据集):识别列中的模式、季节性变化或趋势。

对于这种基于模式的任务,单独使用 LLMs 可能比使用代码在更短的时间内产生更好的结果!让我们通过一个示例来充分说明这一点。

使用仅有 LLMs 分析 Kaggle 数据集

我们将使用一个流行的实际世界的Kaggle 数据集,这是一个针对客户个性分析的数据集,公司希望对客户群体进行细分,以更好地理解客户。

为了便于稍后的 LLM 分析验证,我们将数据集子集化为 50 行,并仅保留最相关的列。之后,分析的数据集如下,其中每一行代表一个客户,列显示客户信息:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据集的前 3 行 — 作者提供的图像

假设你在公司的营销团队工作。你的任务是利用这个客户信息数据集来指导营销工作。这是一个两步的任务:首先,使用数据集生成有意义的客户群体。接下来,生成如何针对每个群体进行最佳营销的想法。现在这是一个实际的商业问题,其中 LLMs 在步骤 1 中的模式发现能力可以真正发挥作用。

让我们为这个任务制定如下提示,使用 4 种提示工程技术(稍后更多内容!):

1. 将复杂任务分解为简单步骤

2. 参考每一步的中间输出

3. 格式化 LLM 的回应

4. 将指令与数据集分开

系统提示:

我希望你充当数据科学家来分析数据集。不要编造数据集之外的信息。对于我要求的每个分析,提供确切和明确的答案,不要提供代码或指令以在其他平台上进行分析。

提示: # 背景 #

我销售葡萄酒。我有一个包含客户信息的数据集:[出生年份、婚姻状况、收入、子女数量、距上次购买的天数、花费金额]。

#############

目标

我希望你使用数据集将我的客户分成不同的群体,然后给我一些关于如何针对每个群体进行营销的建议。请按照这个逐步过程操作,不要使用代码:

1. CLUSTERS:使用数据集的列将数据集的行进行聚类,使得同一簇中的客户具有相似的列值,而不同簇中的客户具有明显不同的列值。确保每一行仅属于 1 个簇。

对于每个找到的簇,

2. CLUSTER_INFORMATION:根据数据集的列描述簇。

3. CLUSTER_NAME: 解释[CLUSTER_INFORMATION]以获得此集群中客户组的简短名称。

4. 营销想法: 为这个客户组生成营销产品的创意。

5. 理由: 解释为什么[MARKETING_IDEAS]对这个客户组是相关和有效的。

#############

风格

商业分析报告

#############

语气

专业,技术

#############

受众

我的商业伙伴。说服他们你的营销策略经过深思熟虑,并且完全有数据支持。

#############

响应: MARKDOWN 报告

<对于[CLUSTERS]中的每个集群>

— 客户组: [CLUSTER_NAME]

— 档案: [CLUSTER_INFORMATION]

— 营销想法: [MARKETING_IDEAS]

— 理由: [RATIONALE]

<附录>

给出每个集群的行号列表的表格,以支持你的分析。使用这些表头: [[CLUSTER_NAME], 行号列表]。

#############

开始分析

如果你明白了,请告诉我你的数据集。

以下是 GPT-4 的回复,我们继续将数据集以 CSV 字符串形式传递给它。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GPT-4 的回应 — 作者图像

随后,GPT-4 以我们要求的 markdown 报告格式回复其分析:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GPT-4 的回应 — 作者图像

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GPT-4 的回应 — 作者图像

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GPT-4 的回应 — 作者图像

验证 LLM 的分析

为了简洁起见,我们将选择 LLM 生成的 2 个客户组进行验证——例如,年轻家庭和有眼光的热衷者。

年轻家庭

  • LLM 综合的档案: 1980 年后出生,已婚或同居,中等到低收入,有孩子,频繁的小额购买。

  • LLM 将这些行聚类到此组中: 3, 4, 7, 10, 16, 20

  • 深入数据集,这些行的完整数据是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

年轻家庭的完整数据 — 作者图像

这与 LLM 识别出的档案完全对应。它甚至能够在没有我们预处理的情况下,将包含空值的行进行聚类!

有眼光的热衷者 - LLM 综合的档案: 年龄跨度大,婚姻状态各异,高收入,子女情况多样,购买支出高。

  • LLM 将这些行聚类到此组中: 2, 5, 18, 29, 34, 36

  • 深入数据集,这些行的完整数据是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有眼光的热衷者的完整数据 — 作者图像

这再次与 LLM 识别出的档案非常一致!

这个例子展示了 LLM 在模式发现、解释和提炼多维数据集为有意义见解的能力,同时确保其分析深深根植于数据集的事实真相中。

如果我们使用ChatGPT 的高级数据分析插件会怎么样呢?

为了完整性,我尝试使用相同的提示进行相同的任务,但要求 ChatGPT 使用代码执行分析,从而激活其高级数据分析插件。 这个想法是让插件直接在数据集上运行像 K-Means 这样的聚类算法,以获得每个客户组,然后综合每个簇的概况,以提供营销策略。

然而,尽管数据集只有 50 行,但多次尝试仍导致以下错误消息且没有输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

尝试 1 中的错误和无输出 — 作者提供的图片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

尝试 2 中的错误和无输出 — 作者提供的图片

目前使用高级数据分析插件时,执行数据集上的简单任务,例如计算描述性统计数据或创建图表,可以很容易地实现,但更多需要计算算法的高级任务有时可能会由于计算限制或其他原因导致错误和无输出。

那么……何时使用 LLMs 来分析数据集?

答案是取决于分析的类型。

对于需要精确数学计算或复杂规则处理的任务,传统编程方法仍然更优。

对于基于模式识别的任务,使用传统编程和算法方法可能会具有挑战性或耗时。 然而,LLMs 在这些任务中表现优异,甚至可以提供额外的输出,例如支持其分析的附件,以及以 Markdown 格式提供的完整分析报告。

从根本上说,是否使用 LLMs 取决于手头任务的性质,平衡 LLMs 在模式识别中的优势与传统编程技术提供的精确性和特异性。

现在回到提示工程!

在本节结束之前,让我们回到用于生成此数据集分析的提示,并分解所使用的关键提示工程技术:

提示:

背景

我卖酒。我有一个关于客户的信息数据集:[出生年份、婚姻状况、收入、子女数量、距离上次购买的天数、消费金额]。

#############

目标

我希望你使用数据集对我的客户进行分组,然后给我一些关于如何针对每个组进行营销的想法。请使用此逐步过程,并且不要使用代码:

1. CLUSTERS: 使用数据集的列对数据集的行进行聚类,以便在同一簇中的客户具有相似的列值,而在不同簇中的客户具有明显不同的列值。确保每行只属于一个簇。

对于每个找到的簇,

2. CLUSTER_INFORMATION: 根据数据集列描述簇。

3. CLUSTER_NAME: 解释[CLUSTER_INFORMATION]以获得此簇中客户组的简短名称。

4. 营销创意:生成营销我的产品到该客户群体的想法。

5. 理由:解释为什么[MARKETING_IDEAS]对该客户群体是相关和有效的。

#############

风格

商业分析报告

#############

语气

专业,技术

#############

受众

我的商业伙伴。说服他们你的营销策略经过深思熟虑,并且完全有数据支持。

#############

响应:MARKDOWN 报告

<对于[CLUSTERS]中的每个集群>

— 客户群体:[CLUSTER_NAME]

— 个人资料:[CLUSTER_INFORMATION]

— 营销创意:[MARKETING_IDEAS]

— 理由:[RATIONALE]

<附录>

提供每个集群所属行号的表格,以支持你的分析。使用以下表头:[[CLUSTER_NAME],行号列表]。

#############

开始分析

如果你理解了,请告诉我你的数据集。

技巧 1:将复杂任务拆分成简单步骤 LLM 擅长执行简单任务,但对复杂任务不那么擅长。因此,对于像这样的复杂任务,将任务拆分成简单的逐步指令是很重要的。关键是给 LLM 你自己会采取的步骤来执行任务。

在这个例子中,步骤如下:

使用这个逐步过程,不要使用代码:

1. 集群:使用数据集的列对数据集的行进行聚类,使得同一集群内的客户具有相似的列值,而不同集群的客户具有明显不同的列值。确保每行仅属于一个集群。

对于每个找到的集群,

2. 集群信息:根据数据集列描述集群。

3. 集群名称:解释[CLUSTER_INFORMATION]以获得该集群中客户群体的短名称。

4. 营销创意:生成营销我的产品到该客户群体的想法。

5. 理由:解释为什么[MARKETING_IDEAS]对该客户群体是相关和有效的。

与简单地将总体任务交给 LLM 不同,即“将客户分组,然后给出如何对每个组进行营销的想法”。

使用逐步指令,LLM 更有可能提供正确的结果。

技巧 2:引用每一步的中间输出 在向 LLM 提供逐步过程时,我们将每一步的中间输出命名为大写的VARIABLE_NAME,即CLUSTERSCLUSTER_INFORMATIONCLUSTER_NAMEMARKETING_IDEASRATIONALE

使用大写字母来区分这些变量名和给出的指令内容。这些中间输出稍后可以使用方括号 [VARIABLE_NAME] 进行引用。

技巧 3:格式化 LLM 的响应 在这里,我们要求使用 markdown 报告格式,这可以美化 LLM 的响应。中间输出的变量名在这里再次派上用场,用以指定报告的结构。

响应:MARKDOWN 报告

<对 [CLUSTERS] 中的每个集群>

— 客户组: [CLUSTER_NAME]

— 资料: [CLUSTER_INFORMATION]

— 营销点子: [MARKETING_IDEAS]

— 理由: [RATIONALE]

<附录>

给出每个集群的行号列表的表格,以备份你的分析。使用以下表头: [[CLUSTER_NAME], 行列表]。

实际上,你甚至可以随后要求 ChatGPT 将报告提供为可下载的文件,从而使你能够在编写最终报告时以其回应为基础。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

保存 GPT-4 的回应为文件 — 作者提供的图片

技术 4: 将任务指令与数据集分开

你会注意到我们在第一次提示中从未将数据集提供给 LLM。相反,提示只提供了数据集分析的任务指令,底部添加了这些内容:

开始分析

如果你理解了,请向我索取我的数据集。

ChatGPT 随后回应说它理解了,我们将数据集以 CSV 字符串的形式传递给它:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GPT-4 的回应 — 作者提供的图片

但为什么要将指令与数据集分开?

这样做有助于 LLM 保持对每项内容的清晰理解,降低遗漏信息的可能性,尤其是在像这样具有较长指令的复杂任务中。你可能经历过 LLM 在较长提示中“偶然忘记”某些指令的情况 — 例如,你要求 100 字的回应,而 LLM 回答了更长的段落。通过首先接收指令,然后再接收数据集,LLM 可以先消化它应做的事情,然后再在接收到的数据集上执行。

然而,请注意,这种指令与数据集的分离仅能通过聊天 LLM 实现,因为它们保持对话记忆,而完成功能的 LLM 则没有。

结束语

在本文结束之前,我想分享一些关于这段不可思议旅程的个人反思。

首先,衷心感谢新加坡 GovTech 组织了这样一个令人惊叹的竞赛。如果你对 GovTech 如何组织这次首创竞赛的机制感兴趣 — 请查看由首席组织者 Nicole Lee 撰写的 这篇文章

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

决赛中的现场对决!

其次,向我的其他了不起的竞争者们致以大声的感谢,他们每个人都带来了特别的东西,使得竞赛既丰富又具有挑战性!我永远不会忘记决赛的场景,我们在舞台上奋力拼搏,现场观众为我们加油 — 这是我将永远珍视的经历。

对我来说,这不仅仅是一场竞赛;这是对才华、创造力和学习精神的庆祝。我对接下来会发生的事情感到无比兴奋!

我在写这个的时候非常开心,如果你读得也开心,我会非常感激你花一点时间点赞并关注一下!

下次见!

Sheila

如果我可以重新开始,我会如何利用 ChatGPT 学习数据科学

原文:towardsdatascience.com/how-i-would-learn-data-science-with-chatgpt-if-i-could-start-over-8e1f6ae4bb80

2023 年的数据科学自学路线图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Natassha Selvaraj

·发布于 Towards Data Science ·10 分钟阅读·2023 年 8 月 7 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 Lala Azizli 提供,来源于 Unsplash

学会如何学习是你可以培养的最有用的技能之一。

当我在 2018 年开始自学编程和数据科学时,我注册了无数的在线课程。每次完成一门课程并获得证书时,我都会有一瞬间的成就感。

就好像我学到了什么新东西一样。

然而,这种感觉总是短暂的,因为每次我尝试将学到的知识付诸实践时,我都失败了。

理论上,我理解了类、方法和面向对象编程的工作原理。我知道随机森林和决策树之间的区别,以及网格搜索与贝叶斯优化的区别。

然而,我仍然无法处理真实的数据集。

每当我尝试建立一个新项目时,我都会遇到障碍,发现另一个我不知道的话题。

然后我就会陷入不断上新在线课程的兔子洞,以填补知识的空白。

这种无尽的循环被称为教程陷阱,我在其中陷入了两年。

直到我学会了如何学习。

在与已经在该领域工作的程序员和数据科学家交谈后,我整理了一份数据科学路线图,我按照这份路线图自学了这门学科。

仅仅几个月,这个路线图帮助我在这个领域找到了工作。

我使用类似的路线图来提升职场晋升、改进沟通和数据讲故事技能、学习像 Pyspark 和 SQL 这样的新语言、在 Medium 上写引人入胜的文章,并创建我的第一个数据科学在线课程。

如果你喜欢视频格式,可以观看 这个

点击 这里 查看完整视频

ChatGPT 是学习新技能的改变游戏规则者。

当我转到公司中需要构建时间序列预测模型的新角色时,处理多年未触及的数据可视化框架,并使用 Excel 进行高级数据操作(之前几乎没用过),我向 ChatGPT 寻求了帮助。

这大大减少了我原本要花在学习这些主题上的时间。

说实话,我希望在我几年前开始自学数据科学的时候,ChatGPT 就已经存在。

在这篇文章中,我将创建一个重新构想的数据科学路线图版本,这个版本将展示如何在学习过程中的每个阶段使用 ChatGPT 作为你的个性化数据科学导师。

我建议将本指南作为学习如何学习的框架,而不是专注于这里提到的具体教程和资源。

你总是可以用其他在线课程替换我列出的课程,因为大多数课程涵盖相同的主题。我希望你从中得到的是利用生成 AI 作为个人导师的框架。

步骤 1:参加编程课程

如果你想成为数据科学家,你必须学会编程。

尽管像 ChatGPT 这样的 AI 模型在生成代码方面变得非常出色,我仍然坚持数据科学家应该理解编程基础。

我在工作中使用 ChatGPT 生成 Python 代码,但 10 次中有 9 次,我仍需要调试代码或输入提示来指引正确方向。

如果你只是复制粘贴你不理解的模型生成代码,完成数据科学任务是很难高效的。

好的,现在希望我已经说服你了解成为数据科学家仍需掌握编程的必要性,让我们回到路线图。

我建议你参加 一个 在线编程课程。就个人而言,我认为你应该选择 Python 作为编程语言,因为它易于使用且功能多样。

365DataScience 提供了一个很好的 Python 入门 课程,你可以通过它来学习语言语法的基础知识。

如果你想要免费的选择,Freecodecamp 在 YouTube 上有一个 4 小时的 Python 教程,涵盖了许多相同的主题。

我见过一些人推荐从零开始使用 ChatGPT 学习 Python,但我建议你首先观看像上述推荐的那样的视频教程。

它们是互动式的,充满了真实世界的例子,并由行业专家讲授。我也发现从有实际经验的人那里学习视频更有吸引力。

第 2 步:通过 ChatGPT 练习你的编码技能

现在你已经了解了编程的基本知识,并且熟悉了变量、数据结构、函数和方法等概念,你需要开始练习这些技能。

根据我的经验,这比单纯参加在线课程要困难得多。

这也是实际学习发生的地方。

我建议你向 ChatGPT 请求量身定制的练习题,这些题目应符合你的编程经验水平。

假设你刚刚完成了一个基础的 Python 编码课程,你仍处于初学者到中级水平。

使用 ChatGPT 进行编码练习的示例:

这是你可以输入到 ChatGPT 中的编程练习提示:

I've just completed an entry-level programming course and want to put my 
Python coding skills to practice. 
Can you give me some programming challenge questions at a 
beginner-intermediate level?

这是 ChatGPT 对我提示的回应:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自作者

好的,它建议我们创建一个回文检查器,基于 3 和 5 的倍数打印“FizzBuzz”,并建立一个简单的计算器。

为了这个教程的目的,我们使用“FizzBuzz”问题。

我将请 ChatGPT 更详细地描述这些,以便我们可以继续构建:

Can you explain the requirements of the "FizzBuzz" question? 
And provide me with a sample input and output.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自作者

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自作者

ChatGPT 说,如果我们输入的是 3 的倍数,程序应该打印“Fizz”。

对于 5 的倍数,它应该打印“Buzz”。对于同时是 3 和 5 的倍数,它应该打印“FizzBuzz”。

我将继续尝试编写代码:

def fizbuzz(input_num):
    if(input_num%3==0):
        if(input_num%5==0):
            return 'FizzBuzz'
        return 'Fizz'
    elif(input_num%5==0):
        return 'Buzz'
    else:
        return input_num

这是我第一次尝试根据 ChatGPT 给出的要求解决“FizzBuzz”。我现在将把它粘贴到 ChatGPT 中以获得反馈:

Here's my code to solve FizzBuzz. 
Is this accurate, and if not, can you guide me in getting the correct answer?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自作者

ChatGPT 说,虽然我的代码在正确的轨道上,但它只适用于单个数字,而最初的要求是从 1 到 100 进行迭代。

它还让我简化嵌套的“if”语句以提高可读性,并为我进行了代码重构。

这就像拥有一个个人编程导师。

当我开始在 HackerRank 和 LeetCode 上解决编码挑战时,没有人纠正我的代码或指引我正确的方向。我只能阅读其他人的解决方案,并在 StackOverflow 上寻找正确的答案。

使用 ChatGPT,你会得到针对你使用案例的反馈。

你也可以要求它在正确的方向上给你提示,或者给你一个暗示,而不直接揭示正确答案。

这种不断的实践和迭代反馈将帮助你成为更好的程序员,无论你目前处于哪个水平。

随着你的进步,ChatGPT 将能够记住你当前的水平,你可以在此基础上生成更高级的问题。

这是一种量身定制的方法,可以让你在逐渐增加难度的编程挑战中找到解决方案。

我建议每天花大约 3-4 小时在这些编程练习问题上,直到你觉得自己在使用 Python 解决问题方面有了很强的掌握。

第三步:通过 ChatGPT 学习数据科学基础

你现在可以开始学习数据科学的基础知识。我建议你参加一个数据科学课程或训练营,进入机器学习的世界。

我推荐你在 Udemy 上参加José Portilla 的数据科学训练营。Udemy 每隔几周会有大幅折扣,所以我建议你等待他们的促销活动后再购买此课程——你可以以低至 $10 的价格获得。

我还想指出,这个学习过程不一定要按照顺序进行。

在参加这个课程的同时,你仍然可以继续练习你的 Python 编程技能。

我还建议你提示 ChatGPT 给你提供特定于数据科学和分析的编程挑战。

例如,如果你参加了课程并学习了像 K-Means 聚类这样的新模型,或者像 Plotly 这样的新库,你可以让 ChatGPT 测试你对该特定概念或工具的掌握。

如果你订阅了 ChatGPT Plus,你甚至可以使用代码解释器插件来练习你的编程技能:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者提供的图片

如果你还没有听说过 ChatGPT 的新代码解释器插件,你可以观看我的视频了解更多信息。这是数据科学任务中的一个游戏规则改变者。

这个插件生成了一个样本数据集,帮助我更多地了解 Pandas 库,并根据该数据集提出了 10 个挑战问题:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者提供的图片

如果你在学习过程中遇到困难或无法达到预期的结果,你可以随时回到 ChatGPT 询问指导。如果你觉得提出的问题太简单了,你可以指定你期望的难度级别。

这样,你不仅仅是消耗来自在线课程的信息。

你通过让 ChatGPT 测试你所学的每个主题来填补知识的空白。

第四步:通过 ChatGPT 构建数据科学项目

一旦你完成了在线课程并且熟悉了所有涵盖的数据科学概念,你可以开始创建项目,以展示你迄今为止所学的所有内容。

这将帮助你内化你所学的理论机器学习概念。

你可以从在简单的 Kaggle 数据集上构建模型开始,例如泰坦尼克号生存预测数据集。

我建议尝试从头开始创建模型。如果你遇到困难,可以将代码粘贴到 ChatGPT 中,并提示它引导你找到正确的方向。

如果你成功构建了模型,可以请 ChatGPT 提出如何提高其准确性的建议。

这将扩展你对数据预处理和超参数调优技术的知识,是通过实践学习的一个很好的方式。

例如,我最近写了一篇关于使用 ChatGPT 构建客户细分模型的文章。

这是一个例子,我问 ChatGPT 如何确定在构建 K-Means 聚类模型时的簇数“K”:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供

你甚至可以将数据集粘贴到 ChatGPT 界面中,询问它关于可以构建什么类型的分析或模型的建议。

然而,确保将 ChatGPT 作为助手 — 不要让它为你完成所有工作!

你的目标是学习,因此让 ChatGPT 指引你正确的方向,而不是让它直接为你编写代码。

下一步 — 生成式 AI 对数据科学家的意义是什么?

在结束这篇文章之前,我想谈谈像 ChatGPT 这样的生成式 AI 模型对数据科学的影响。

ChatGPT 可以编写代码,OpenAI 最新的 LLM GPT-4 在机器学习基准测试中超越了大多数最先进的模型。

这使许多人开始怀疑数据科学的工作是否会被生成式 AI 取代。

虽然我没有确凿的答案,但我会根据我在数据行业工作的经验尽力回答这个问题。

像生成式 AI 这样的 LLM 可以加速编程工作流程,并减少完成数据科学项目所需的周转时间。

根据麦肯锡的一项研究,编码任务现在可以通过生成式 AI 完成得更快,最多可达两倍。文章还指出,这些生产力提升可能会导致企业将员工转移到“更高价值的任务”上。

这意味着在生成式 AI 的帮助下,以前看似艰巨的任务,如编程、数据分析和机器学习建模,现在可以更快地操作和完成。

因此,我相信数据科学的角色将逐渐转向更以业务为中心,而不是专注于特定工具或编程语言。

在我看来,这个角色需要一个具备一定机器学习和编程背景的专业人士,能够将 AI 项目管理到利用数据来 推动业务价值

如果你是数据科学家或想进入这个领域,我建议你在像金融或营销这样的领域获取主题专家知识

这样,你可以利用生成式 AI 和数据科学的力量来解决业务需求和行业特定的问题。

这篇文章就到这里,感谢阅读!

如何让行业数据科学家的工作发挥作用

原文:towardsdatascience.com/how-industry-data-scientists-make-their-work-count-f552739afd15?source=collection_archive---------16-----------------------#2023-02-02

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 TDS Editors

·

关注 发布于 Towards Data Science · 以 新闻通讯 形式发送 · 3 分钟阅读·2023 年 2 月 2 日

不久前,商业领袖们只需提到他们的公司是“数据驱动”或“数据知情”的,就能赢得钦佩的目光。如今,在组织的决策过程中利用数据已经不再是前沿技术;它已成为默认选择。

然而,将那些数据字节(千兆字节?)转化为具体的策略和可衡量的决策,对于许多人来说仍然是一个挑战。这正是企业数据从业者可以对团队成功作出真正贡献的地方,这也是许多人的强大动力——尤其是在经济不确定时期。

本周,我们精选了三篇关于智能数据项目及其对业务积极影响的近期文章。请享用!

  • 放大漏斗的顶部。要成长,一个企业不仅需要留住现有客户,还需要获取新客户。有效地做到这一点可以在成功和停滞之间产生差异。在一项全面的概述中,艾薇·刘 解释了数据科学家如何通过“发起实验、实时监控性能,并根据市场反馈迅速迭代”来推动客户获取和支持营销工作。

  • 最炫的方式不一定是最有效的。算法驱动应用的快速增长可能会让资源较少的中小企业感到焦虑。安娜斯塔西亚·雷索娃 的最新文章是一剂强有力的解药:它强调了通过分析原始数据和充分利用基于信号的评分,仍然可以获得许多见解,而无需涉及机器学习模型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由瑞安·阿尔恩斯特拍摄,来源于Unsplash

  • 如果你必须做出艰难的决定,那就最好做对的决定。我们中的许多人生活在近年来实体店面临困境的地区。马丁·莱特纳 对店铺关闭的艰难过程进行了细致的分析,并提出了一系列数据科学家可以用来减少一些不可避免的负面影响的策略。

如果底线、轻松得手的成果和漏斗优化是让你感到厌倦的演示文稿术语,不要绝望!我们还有一些额外的阅读推荐,相信你会喜欢:

  • 通过遵循Khuyen Tran的端到端模板来未来-proof 您的下一个机器学习项目,该模板以可重复性和可维护性为核心。

  • “我喜欢这份调查问卷有多长!” 说过这样话的…从未有人。特雷弗·科平斯 提出了一个缩短调查问卷长度的策略,而不会牺牲结果的有效性或可靠性。

  • 在一个关于文本模式提取的有趣实验中,Maeda Hanafi 对 GPT-3 与人类参与工具的表现进行了基准测试。

  • “我们如何在将 LLMs 集成到产品开发中时安全地利用其强大功能?” Janna Lipenkova的深度探讨 考察了控制和增强大型语言模型行为的持续努力。

  • 如果你想提升你的 Julia 编程技能,你可以尝试不少于 20 个技巧和窍门,这些都是Emmett Boudreau提供的。

我们希望你考虑 本周成为 Medium 会员——这是支持我们发布工作最直接和有效的方式。

直到下一个 Variable,

TDS 编辑部

AI 如何颠覆数据治理?

原文:towardsdatascience.com/how-is-ai-disrupting-data-governance-4bd79950905c

数据治理与 AI 之间的共生关系

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Louise de Leyritz

·发表于Towards Data Science ·阅读时长 8 分钟·2023 年 7 月 14 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

AI 正在改变数据治理的世界 — 图片来源:CastorDoc

生成式 AI 已经开始动摇数据治理的世界,并且将继续这样做。

自 ChatGPT 发布已经过去了 6 个月,但感觉我们已经需要回顾一下了。在这篇文章中,我将探讨生成式 AI 如何影响数据治理,以及它可能会把我们带到什么地方。让我强调一下近期,因为事物发展迅速,可能会有很多不同的方向。这篇文章不是关于预测数据治理未来 100 年的,而是实用地看看现在正在发生的变化以及即将出现的变化。

在深入之前,让我们回顾一下数据治理涉及什么。

简单来说,数据治理是组织为确保数据可信而遵循的一套规则或流程。它涉及 5 个关键领域:

  • 元数据与文档

  • 搜索与发现

  • 政策和标准

  • 数据隐私与安全

  • 数据质量

在这篇文章中,我们将探讨在引入生成式 AI 之后,这些领域将如何演变。

让我们开始吧!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据治理的五大支柱 — 图片来源:CastorDoc

1. 元数据与文档

元数据和文档可能是数据治理中最重要的部分,其他部分在很大程度上依赖于这一部分的正确完成。AI 已经开始,并将继续改变我们创建数据背景的方式。但我不想让你们抱有过高的期望。当涉及到文档时,我们仍然需要人工参与。

生成数据背景或记录数据分为两个部分。第一个部分,占工作的约 70%,涉及记录一般信息,这些信息对许多公司都是共通的。一个非常基础的例子是“电子邮件”的定义,这对所有公司来说都是共通的。第二部分则是记录公司特有的专业知识。

激动人心的部分是:AI 可以为前 70%的工作做很多繁重的工作。这是因为第一个部分涉及通用知识,而生成性 AI 在处理这些方面表现出色。

那么,关于公司特有的知识呢?每个组织都是独特的,这种独特性产生了你自己特有的公司语言。这种语言包括你的指标、KPI 和商业定义。这不是可以从外部导入的内容。它源于最了解业务的人——员工。

在我与数据领导者的对话中,我常常讨论如何创建对这些商业概念的共同理解。许多领导者表示,为了实现这种一致性,他们会把领域团队聚集在同一个房间进行讨论、辩论,并就最适合他们商业模型的定义达成一致。

举个例子,‘客户’的定义。对于订阅制业务,客户可以是当前订阅了他们服务的人。但对于零售业务,客户可能是过去 12 个月内进行过购买的人。每家公司都以最适合自己的方式定义‘客户’,这种理解通常来自组织内部。

对于这种特殊知识,尽管 AI 再智能,它目前还无法完成这部分。它不能参加你的会议,参与讨论,或帮助新概念的产生。对于 Andreessen Horowitz 来说,这可能会在第二波 AI到来时成为可能。目前,我们仍处于第一波。

我还想提到 Benn Stancil 提出的问题。Benn 问道:如果一个机器人可以按需为我们编写数据文档,那编写它的意义何在?

这确实有些道理:如果生成性 AI 可以按需生成内容,那为什么不在需要时生成它,而不必费心记录一切呢?不幸的是,情况并非如此,原因有两个。

首先,正如我之前解释的,文档的一部分涵盖了公司特有的方面,这些是 AI尚无法捕捉的。这需要人类的专业知识。AI 无法即时生成这些内容。

其次,虽然 AI 很先进,但它并不是万无一失的。它生成的数据不总是准确的。你需要确保有人检查并确认所有 AI 生成的内容。

2. 搜索和发现

生成式人工智能不仅改变了我们创建文档的方式,还改变了我们消费文档的方式。事实上,我们正在见证搜索和发现方法的范式转变。传统方法中,分析师通过你的数据目录寻找相关信息的方式正在迅速过时。

真正的改变者在于人工智能成为公司每个人的个人数据助手的能力。在某些数据目录中,你已经可以向人工智能询问特定的数据问题。你可以问诸如“是否可以使用数据执行动作 X?”,“为什么我无法用数据实现 Y?”或者“我们是否拥有展示 Z 的数据?”等问题。如果你的数据经过了正确的上下文补充,人工智能将帮助在公司内部传播这一上下文。

我们还预期另一个发展是人工智能将把数据目录从一个被动的实体转变为一个主动的助手。这样考虑一下:如果你使用公式不正确,人工智能助手可以提醒你。同样,如果你准备编写一个已经存在的查询,人工智能可以告诉你,并指导你到现有的工作成果。

过去,数据目录只是静静地存在,等待你去筛选答案。但有了人工智能,目录可以主动帮助你,提供洞察和解决方案在你意识到需要之前。这将彻底改变我们与数据的互动方式,并且可能很快就会发生。

然而,人工智能助手有效工作的一个前提是:你的数据目录必须得到维护。为了确保人工智能助手能向利益相关者提供可靠的指导,基础文档必须是 100%可信的。如果目录维护不善,或者政策没有明确规定,那么人工智能助手将会向公司传播错误信息。这比没有信息更为有害,因为它可能导致基于错误背景的糟糕决策。

你可能已经理解了:人工智能和数据治理是相互依赖的。人工智能可以增强数据治理,但反过来,强健的数据治理也需要来推动人工智能的能力。这导致了一个良性循环,每个组件都能提升另一个。但你需要记住没有任何一个元素可以替代另一个。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据治理与人工智能的共生关系 — 图片来自 CastorDoc

3. 数据政策和标准

数据治理的另一个关键组成部分是制定和实施治理规则。

这通常涉及定义组织内的数据所有权和领域。目前,人工智能在制定这些政策和标准方面还做不到位。人工智能在执行规则或标记违规方面表现出色,但在制定规则本身时则显得不足。

这是因为一个简单的原因。定义所有权和领域涉及到人类政治。例如,所有权意味着决定组织内部谁对特定数据集拥有权力。这可能包括决定数据的使用方式和时间、谁可以访问这些数据以及如何维护和保护数据。做出这些决策通常涉及到个人、团队或部门之间的谈判,每个人都有自己的利益和观点。而人类的政治显然是人工智能无法取代的。

因此,我们预计人类在这一治理方面在不久的将来仍将发挥重要作用。生成型人工智能可以在起草所有权框架或建议数据领域方面发挥作用。然而,仍然必须保持人类的参与。

4. 数据隐私和安全

然而,生成型人工智能有望在隐私治理部门引发变革。管理隐私权利一直是治理中的一个传统挑战,没有人喜欢这项工作。它涉及手动创建复杂的权限架构,以确保敏感数据的保护。

好消息是:人工智能可以自动化这一过程的大部分。根据用户数量及其各自的角色,人工智能可以创建访问权限规则。访问权限的架构方面,基本上是基于代码的,这与人工智能的能力非常契合。人工智能系统可以处理这些参数,生成相关代码,并应用于有效地管理数据访问。

另一个人工智能可以产生重大影响的领域是个人身份信息(PII)的管理。如今,PII 标签通常是手动完成的,这对负责人员来说是一种负担。这是人工智能可以完全自动化的事情。通过利用人工智能的模式识别能力,PII 标签的处理可以比人工更准确。从这个意义上讲,使用人工智能实际上可以改善我们管理隐私保护的方式。

这并不意味着人工智能会完全取代人类的参与。尽管人工智能具有强大的能力,我们仍然需要人类监督来处理意外情况,并在必要时做出判断。

5. 数据质量

我们不能忽视数据质量,它是治理的重要支柱。数据质量确保公司使用的信息是准确、一致和可靠的。维护数据质量一直是一项复杂的工作,但随着生成型人工智能的出现,情况已经开始发生变化。

正如我之前提到的,人工智能擅长应用规则和标记违规行为。这使得算法能够轻松识别数据中的异常。你可以在这篇文章中找到关于人工智能如何影响数据质量不同方面的详细说明。

AI 还可以降低数据质量的技术门槛。这是 SODA 已经在实施的内容。他们的新工具,SodaGPT,提供了一种无代码的方式来表达数据质量检查,使用户能够仅通过自然语言进行质量检查。这使得数据质量维护变得更加直观和易于访问。

结论

我们已经看到 AI 可以以一种触发范式转变的方式大幅提升数据治理。许多变化已经发生,而且它们将持续存在。

然而,AI 只能建立在已经稳固的基础上。为了让 AI 改变您公司的搜索和发现体验,您必须已经在维护您的文档。AI 很强大,但它不能奇迹般地修补一个有缺陷的系统。

需要记住的第二点是,即使 AI 可以用来生成大部分数据上下文,它也不能完全取代人类元素。我们仍然需要人在验证和记录每个公司特有的知识时参与其中。所以我们对治理未来的预测一句话是:由 AI 加速,由人类洞察和认知支撑。

关于我们

在 CastorDoc,我们正在为 Notion、Figma、Slack 时代构建一个数据文档工具。

想要了解更多吗?联系我们,我们将向您展示一个演示。

机器学习如何成为位置数据行业的游戏规则改变者

原文:towardsdatascience.com/how-machine-learning-will-become-a-game-changer-for-the-location-data-industry-10dde8f41f3e

位置数据可以提供独特的见解,但伴随着成本和隐私问题。机器学习可以克服这些缺陷并改善位置数据产品。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Benjamin Thürer

·发表于 Towards Data Science ·9 分钟阅读·2023 年 3 月 9 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 Dennis Kummer 提供,来源于 Unsplash

位置数据行业正快速增长,但仍处于技术初级阶段。基于位置数据的大多数产品在技术上相对简单,可以视为实现了描述性统计的一种形式(例如,店内看到的设备平均数量),或者在最坏的情况下,这些产品就是原始的位置信息数据。机器学习可以通过节省成本、提高产品质量和增强隐私来为这一行业带来巨大价值。

本故事旨在提供一个高层次和直观的概述,说明机器学习如何提供更强大的位置数据产品,同时降低成本并增强隐私保护。

引言

位置数据行业与隐私

位置数据行业是一个快速增长的业务领域,提供可以为客户提供独特见解的产品。基于位置数据的特定产品允许公司分析,例如,多少人去竞争对手的店铺,他们的客户来自哪里,多少人从一个地区移动到另一个地区等等。然而,处理位置数据远非简单,并且存在一个巨大的问题:隐私

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 Matthew Henry 提供,来源于 Unsplash

除了在处理位置数据时需要解决的其他技术和数据相关问题外,个人隐私是最重要的,并且从长远来看,可能是行业中最具挑战性的一个问题。无论位置数据是来自手机的 GPS 数据、Telco 数据还是卫星影像,都无关紧要。由于位置数据的全部目的是揭示位置,因此简单的产品(原始数据或汇总数据)并不能排除逆向工程的可能性,从而可能侵犯某人的隐私。

即使是“隐私友好”的数据转换,如对唯一标识符进行哈希处理、混淆经纬度以及数据汇总,也很难使逆向工程变得不可能。此外,即使第三方公司以完全隐私友好的方式汇总这些位置数据,个体可识别的数据已经被数字化传送给了该公司,因此,这些敏感数据不再由第一方数据拥有者或个人控制。

因此,位置数据行业的未来在于两个方面的结合:在第一方数据侧以不可识别的格式进行早期数据汇总,并在这些汇总数据上应用机器学习以创建高质量的人类移动性洞察。

位置数据行业的当前技术水平

基于位置数据的大多数产品提供了对人类移动性的洞察,并基于相当简单的技术方法。例如,一个常见的估算商店客流量的产品工作流程可能如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 GPS 数据估算到某位置的客流量的标准数据工作流程。原始 GPS 数据被过滤,然后仅将停留点聚集在一起。基于这些聚类,进行供应校正和外推,以推导出该商店的估计人数。

行业内更复杂的产品会将更多的背景信息,如家庭和工作地点或区域人口统计,纳入指标中。然而,流程始终相同:首先预处理原始数据,将单个数据点聚类到停留事件中,校正数据的技术问题,并汇总该区域内的所有停留事件。

这种方法简单但有效。它允许非常准确地估计客流量,尤其是在有人对时间模式感兴趣时。技术上的复杂性,主要是专有部分,体现在供应校正上,因为简单的汇总会受到供应中的潜在问题的高度影响。即使是供应量的微小变化也可能对汇总数据产品产生巨大的负面影响,如果没有适当的校正。因此,自动供应校正是高质量数据产品的关键。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

自动化供应修正。受影响的汇总数据(橙色)可以通过复杂的供应修正技术进行修正,从而得出有用的信号(青色)。

然而,即使供应修正有效,它仍然存在重大局限性。其中一些包括:

  • 供应不断变化,需要持续改进和新产品版本。

  • 随着时间的推移,获取和存储所有设备级数据的成本很高。

  • 越来越多的定位数据被操控、“重播”或甚至伪造,影响产品质量。

  • 处理数据的公共声誉较低,并且由于隐私原因,可用数据的数量在减少。

因此,未来购买原始形式的定位数据并将其转售为某种衍生品的通用设置不是一种可行的路径,这将降低现有定位数据产品的稳健性和质量。

在第一方侧汇总数据解决了上述限制,给每个人带来了双赢,但:我们如何基于已经汇总的数据构建产品?我们如何处理数据去重、数据分配到位置,或估算到店流量?答案是机器学习!

什么是机器学习

有各种优秀的 AI 和机器学习基础介绍(像这个),简单的互联网搜索(或询问 LLM)会比这个故事提供更好的答案。然而,为了使其超级直观和简单:

机器学习使人工系统能够在没有人工干预的情况下学习数据之间的关系。

一个简单的现实生活中的比较是经典条件反射,其中狗在经常收到奖励时学会抬起爪子。简化地说,这种“抬爪子”和“奖励”之间的关系是机器在人工系统中学习的内容(尽管一只狗远比任何人类迄今为止建造的 AI 系统更聪明)。

需要注意的是,输入特征的数量不仅限于一个。实际上,机器学习通常使用大量特征来训练稳健的关系。其好处是多方面的。例如,当我们考虑来自第一方数据提供商的汇总数据问题时,机器学习可以让我们学习这些汇总数据与我们想要估算的目标(例如,到店流量)之间的关系。

如何使用机器学习与定位数据

估算到店流量

为了使事情更直观,这里选择了一个使用来自移动设备的 GPS 数据的案例研究。目标是开发一个可靠且高质量的产品,告知客户每天有多少人访问特定的商店。这对那些对竞争对手商店表现或选址感兴趣的公司非常有用。

目前的最先进的方法

截至今天,基于 GPS 数据估算店内流量的公司要么直接使用原始 GPS 数据,要么通过汇总原始数据并校正供应波动。然而,正如下文所示,这两种方法只有在有数据观察到感兴趣的店内情况后才能奏效。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当前的最先进技术是拥有大量数据以建立原始设备级数据源或底层数据的汇总。然而,在数据量较少时,这种方法存在局限性。

当产品具有足够高的数据量时,两种产品方法(设备级和汇总)都有效,主要关注点则更多是数据隐私、供应波动、成本以及对数据供应的信任。

然而,当数据量较低或商店位于市场份额普遍较低的地区时,简单的汇总无法生成产品,因为它总是会得出“0”计数。鉴于可用位置数据的普遍减少,这已经成为行业中的一个问题。

使用机器学习模型估算脚步流量

牢记之前的条件示例,机器学习模型确实只是学习条件之间的关系。类似于狗学会了举爪子会得到奖励,机器学习模型也能学会如果更多的人接近场所,场所内的人也更有可能增加。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

机器学习模型允许训练周围脚步流量与场所内脚步流量之间的关系。这种方法即使在数据供应不足的情况下也适用。

换句话说,机器学习的目的是训练一个描述店内脚步流量如何根据店外流量波动而变化的关系(或模型)。例如,想象一个特定的星期六有一个盛大的开幕式,这会导致接近商店的人数是普通星期六的两倍。在这种情况下,店内也更有可能有更多的人进入。

当然,店外脚步流量与店内之间的关系不一定是线性的。但这也不是模型需要学习的唯一关系。想一想,还有哪些因素会影响到店内脚步流量并且可以被测量?因为本质上,所有与店内流量相关的数据都会提高模型的质量。一些增强这些关系的数据集包括降水量、区域人口、人口统计、星期几、假期等等。

机器学习能够利用所有这些不同的数据集,并将它们结合成一个描述店内脚步流量如何根据描述周围环境的数据变化的单一模型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个示意图,展示了机器学习如何在相关数据输入之间建立关系,从而估算脚步流量。

没有什么是完美的,那么有哪些优点和缺点呢?

尽管机器学习提供了许多机会,但它不是万能的,且存在需要解决的局限性。

历史偏见。训练出来的关系通常基于一些历史上的真实情况。这意味着最终产品在很大程度上受到历史关系的影响。然而,如果关系发生变化,模型需要重新训练,以确保预测保持最新,避免漂移。

一些事情是不可预测的。尽管当前 AI 的发展使机器学习看起来像是几乎所有问题的解决方案,但重要的是要记住,许多事情是不可预测的。没有模型可以预测疫情及其对商店的影响。此外,模型只能学习数据中现有的关系。那些未包含在训练数据中的事件或行为,或在数据中没有关系的行为是不可预测的。

思维方式的转变。尽管最终的产品可能看起来相同,但它们来自根本不同的方法论。这导致商业方面和产品用户面临挑战,以确保优点和缺点得到适当解决。

然而,当我们公开解决机器学习的不足之处并对其进行适当教育时,优点将超过这些缺点。

符合伦理和隐私友好。将机器学习与第一方聚合数据结合起来,将允许构建符合严格伦理标准的未来证明隐私友好的产品。

稳健且高质量的产品。构建一个不直接依赖 GPS 数据源的位置数据产品将使产品更加稳健和可靠。此外,由于产品可以基于各种高质量的数据源,最终产品的质量通常更高。

减少数据量和成本。与当前构建位置数据产品所需的数据量相比,机器学习可以在更少的数据上运行。这不仅允许供应来源的独立性,还减少了对大量数据的存储。此外,数据处理和维护的成本与机器学习基础设施相比更便宜。

新产品创新。在改进隐私之后,也许最大的优势之一是新产品创新的可能性。机器学习本质上结合了不同的数据集和上下文,从而允许构建目前在位置数据行业中不存在的产品。

摘要

位置数据行业正在迅速增长,但仍处于早期阶段。基于位置数据的大多数产品都很简单,缺乏稳健性,并且隐私保护不足。基于机器学习的方法有潜力为这一行业带来额外价值,通过降低成本、提高产品质量和增强隐私保护。我们在 Unacast 相信,位置数据行业的未来在于将早期数据以不可识别的格式进行汇总,再通过这些汇总数据应用机器学习技术,从而创造出高质量的人类移动洞察产品。

— — —

除非另有说明,所有图片均由作者提供。

如果你想了解更多关于我以及我所写的内容,请点击 这里 并随时关注我。

多少键位足够弹奏钢琴?

原文:towardsdatascience.com/how-many-keys-are-enough-to-play-the-piano-639916f47a22

使用 Python、MIDI 和 Matplotlib 寻找答案

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Dmitrii Eliuseev

·发表于数据科学前沿 ·阅读时长 9 分钟·2023 年 12 月 23 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 Cedrik Malabanan 拍摄,Unsplash

学习弹钢琴是一个具有挑战性且有趣的过程,但每个新手都会面临一个困境:应该买什么样的乐器?市场上的选择非常广泛,从上面照片中的小型两八度乐器到 70 公斤重的全尺寸木质键盘。一方面,额外的键位永远不会有害;另一方面,尺寸、重量和价格之间总是存在权衡。

显然,一种方法是直接问老师他或她推荐什么,但也许大多数音乐家从未从那个角度考虑过音乐。有没有更量化的方法来寻找答案?事实上,答案是肯定的;我们可以使用 Python 轻松制作音乐音符分布。

本教程对数据科学初学者很有用;它不需要复杂的数学或库,并且结果易于解释。它也对那些想学习音乐但尚未决定购买哪种乐器的人很有用。

让我们开始吧!

数据来源

对于数据分析,我将使用MIDI文件。这是一种相当古老的格式;第一个 MIDI(Musical Instrument Digital Interface)规格发布于 1983 年。MIDI 文件的关键特征是,它们存储的音乐不是原始音频,而是以“原始”符号形式。MIDI 文件中的每个记录包含乐器类型、音高、时序和其他参数。例如,我可以在免费的MuseScore应用程序中打开贝多芬的降 C 小调小品,并看到如下内容:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

MuseScore 编辑器,作者截屏

让我们在 Python 中打开同一个文件并转储其内容:

import mido  # pip3 install mido

mid = mido.MidiFile("Beethoven/Bagatelle.mid", clip=True)
for ind, track in enumerate(mid.tracks):
    print(f"Track {ind}")
    for item in track[:10]:
        print(item)

输出如下(完整文件更长;在这里,我仅打印每个轨道的前几行):

Track 0
MetaMessage('track_name', name='L.v.Beethoven Bagatelle in C minor WoO 52', time=0)
MetaMessage('text', text='XFhd:2001/08/21:JP:Classical::::L.v.Beethoven::', time=0)
MetaMessage('time_signature', numerator=3, denominator=4, clocks_per_click=96, notated_32nd_notes_per_beat=8, time=0)
MetaMessage('sequencer_specific', data=(0, 0, 65), time=0)
...
Track 1
MetaMessage('track_name', name='Right', time=0)
MetaMessage('key_signature', key='Eb', time=0)
note_on channel=0 note=72 velocity=80 time=3072
note_off channel=0 note=72 velocity=100 time=380
note_on channel=0 note=72 velocity=80 time=4
...
Track 2
MetaMessage('track_name', name='Left', time=0)
MetaMessage('key_signature', key='Eb', time=0)
note_on channel=1 note=43 velocity=100 time=768
note_off channel=1 note=43 velocity=100 time=380
note_on channel=1 note=43 velocity=100 time=4
...

如我们所见,文件包含三个轨道,第一个轨道只有元数据,另外两个轨道包含一些额外的数据和音乐音符。为了找出音乐片段中有多少不同的音符,我们将仅使用note_on记录。每个 MIDI 音符在 21…108 范围内有一个数字代码:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

MIDI 音符代码,图片来源 Wikipedia

使用这些信息,让我们创建一个函数,将 MIDI 文件中的所有音符提取到 Python 列表中:

def extract_midi_notes(file_path: str) -> List[int]:
    """ Get all notes from a MIDI file """
    notes = []
    mid = mido.MidiFile(file_path, clip=True)
    for track in mid.tracks:
        for item in track:
            # Example:
            # {'type': 'note_on', 'time': 241, 'note': 67, 'velocity': 56, 'channel': 0}
            item_data = item.dict()
            if item_data["type"] == "note_on":
                note = item_data["note"]
                velocity = item_data["velocity"]
                if velocity > 0:
                    notes.append(note)
    return notes

下一步,让我们创建一个处理文件夹中所有 MIDI 文件的函数:

def get_notes(files_mask: str):
    """ Get all notes from several files """
    midi_notes = []
    for file_path in glob.glob(files_mask):
        midi_notes += extract_midi_notes(file_path)
    return midi_notes

我们还需要一些 MIDI 文件。这些文件,特别是古典音乐(已进入公有领域),通常可以免费获得,并且很容易找到。对于我的分析,我使用了来自 www.piano-midi.de 的文件(CC BY-SA 德国许可)。

分布

此时,我们有一种方法,可以从一组 MIDI 文件中提取所有音乐音符。我们可以很容易地使用 Matplotlib 中的直方图查看哪些音符使用得更频繁:

import matplotlib.pyplot as plt

# Get data
files_mask = "Tchaikovsky/*.mid"
midi_notes = get_notes(files_mask)

# Draw
fig, ax = plt.subplots(figsize=(7, 5))
plt.hist(midi_notes, density=False, bins=60, range=[21, 108], edgecolor='#505070')
plt.ylabel('Count')
plt.xlabel('MIDI Notes')
ax.spines['top'].set_color('#EEEEEE')
ax.spines['right'].set_color('#EEEEEE')
ax.spines['bottom'].set_color('#888888')
ax.spines['left'].set_color('#888888')
plt.tight_layout()
plt.title(files_mask.split("/")[0])
plt.show()

输出如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

音符分布,图片来源:作者

plt.hist方法完成了计算列表中值分布并绘制图表所需的所有工作。我们可以看到,分布看起来正常。最常用的键位于键盘的中央,这很有意义。

可视化

键盘 从技术上讲,问题已解决,使用大约 20 行 Python 代码,我们可以查看不同音乐片段的音符分布。但实际上,这不够方便,特别是对音乐家而言,我们可以做得更好。Matplotlib 库可以绘制的不仅仅是科学图表。让我们绘制一个钢琴键盘:

fig, ax = plt.subplots(figsize=(14, 3))

def draw_patch(ax, x: int, y: int, w: int, h: int, color: str, alpha=0.6):
    """ Draw a patch in specific coordinates and color """
    #  H
    #  |
    # (xy)--W
    ax.add_patch(Rectangle((x, y), w, h,
                            facecolor=color, edgecolor=None,
                            alpha=alpha, fill=True,
                            linewidth=1, zorder=2))

def draw_black_note(ax, x_pos: int, key_width: int, keyb_height: int):
    """ Draw a black note in a specific X-position """
    note_w = 0.4*key_width
    ax.plot([x_pos - note_w, x_pos - note_w, x_pos + note_w, x_pos + note_w],
            [keyb_height-1, 0.25*keyb_height, 0.25*keyb_height, keyb_height-1], color="#111111")

    draw_patch(ax, x_pos - note_w, 0.25*keyb_height, 2*note_w, 0.75*keyb_height, color="#000000")

num_octaves = 9
note_per_octave = 7
key_width, key_height = 20, 160

# Key names
key_names = ["C", "D", "E", "F", "G", "A", "B"]

# Draw frame
keyb_width = num_octaves*note_per_octave*key_width
ax.plot([0, keyb_width, keyb_width, 0, 0], [0, 0, key_height, key_height, 0], color="#0000AA")

# Draw octaves
for oct_num in range(num_octaves):
    oct_xpos = oct_num*key_width*7
    # Octave separator
    ax.plot([oct_xpos, oct_xpos], [0, key_height-1], color="#0000AA")
    # Note separator
    for note_num in range(1, 7):
        x_pos = oct_num*key_width*7 + note_num*key_width
        ax.plot([x_pos, x_pos], [1, key_height-1], color="#EEEEEE")

    # Black keys
    for black_pos_ind in [1, 2, 4, 5, 6]:
        x_pos = oct_xpos + black_pos_ind*key_width
        draw_black_note(ax, x_pos, key_width, key_height)

    # White keys
    for note_ind in range(note_per_octave):
        x_pos = oct_num*key_width*7 + note_ind*key_width
        key_name = f"{key_names[note_ind]}{oct_num}"

        # Text
        ax.text(x_pos + key_width/2, 0.1*key_height, key_name, verticalalignment='bottom',
                horizontalalignment='center', color='black', fontsize=9)

plt.axis("off")
plt.xlim(5*key_width - 1, 57*key_width + 1)
plt.tight_layout()
plt.show()

输出如下,这比直方图要好得多:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Matplotlib 中的钢琴键盘,图片来源:作者

热图 下一步是可视化分布。一个方便的方法是使用热图,我们可以在键盘上绘制它。首先,我们需要一个方法将键名(C3,D3 等)转换为 MIDI 代码。这只是一个简单的线性转换:

def get_midi_code(key_name: str) -> int:
    """ Convert key name to the MIDI code. 'E3' => 52 """
    # MIDI codes: C0 - 12, D0 - 14, etc; 12 keys in octave
    key_names = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]
    # "E1" => E, 1
    name, octave = key_name[0], int(key_name[1])
    return (octave + 1)*12 + key_names.index(name)

其次,我们可以使用 Python 的Counter类来了解每个音符的使用频率:

midi_notes = get_notes("Tchaikovsky/*.mid")
notes_counter = Counter(midi_notes)

most_common = notes_counter.most_common(1)[0]
print(f"Most common MIDI code {most_common[0]}, was used {most_common[1]} times")
#> Most common MIDI code 61, was used 171 times

midi_code = get_midi_code("C4")
print(f"C4 note was used {notes_counter[midi_code]} times")
#> C4 note was used 123 times

使用这段代码,我们可以将每个音符的出现频率作为热图的 alpha 通道:

for note_ind in range(note_per_octave):
    x_pos = oct_num*key_width*7 + note_ind*key_width
    key_name = f"{key_names[note_ind]}{oct_num}"

    midi_code = get_midi_code(key_name)
    # Number as a heatmap
    use_count = notes_counter[midi_code]
    if use_count > 0:
        color = "#FF0000"
        max_note_count = most_common[1]
        alpha = use_count/max_note_count
        margin = 0.1*key_width
        draw_patch(ax, x_pos + margin, 0.02*key_height, key_width - 2*margin,
                   0.2*key_height, color, alpha=alpha)

    # Number as text
    ax.text(x_pos + key_width/2, 0.05*key_height, str(use_count),
            verticalalignment='bottom', horizontalalignment='center',
            color='#333333', fontsize=7)

相同的逻辑适用于黑键;为了简便起见,我将在这里省略这段代码。

结果

最后,让我们回答故事标题中的问题。我们需要学习多少个钢琴键才能弹奏钢琴?

要得到答案,我们首先需要找到合适的曲目。在亚马逊上有很多钢琴课程的书籍,通常可以免费查看其第一页,这足以收集标题列表。有了标题,就容易找到 MIDI 文件。好吧,让我们看看一些结果。

第一年学习: 好国王温塞斯拉斯(圣诞颂歌):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者截图

如我们所见,这首旋律很简单,主要只使用白键,实际音符范围大约为 3 个音域。但没有 3 音域范围的钢琴可用,最接近的是 4 个音域。

第二年学习:C 小调的小品,WoO 52(贝多芬)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者截图

如我们所见,这更复杂,使用了更多的黑键,这首曲子的范围大约为 4.5 个音域。

第三年学习:慰藉曲,S. 172(弗朗茨·李斯特)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者截图

在这种情况下,范围更广;几乎所有的 7 个音域都需要来演奏这首曲子。

结论

在这篇文章中,我展示了如何处理 MIDI 文件,并以直方图和钢琴键盘热图的形式制作音乐音符分布。这不仅对回答“我们需要多少个键”这样的问题有用。将旋律或文件列表转换为热图,可以比较不同作品、不同作曲家或不同流派的风格,例如古典与流行。这可以成为音乐学或文化人类学领域更大分析的一部分。例如,这是 J.S.巴赫音乐中的音符分布,很明显范围更小:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

J.S.巴赫音符分布,作者图像

读者可能会想知道原因,答案很简单:巴赫为大键琴创作音乐,而现代钢琴在那时还未发明。有趣的是,现在,300 多年后,我们可以很容易地在热图中看到这一点!

关于钢琴课程,我必须承认,我最初认为一个 4 音域范围的乐器足以学习钢琴是错误的。这可能适合第一年的学习,但正如从热图中看到的,至少需要 6 音域范围才能演奏音乐,即使在第二年的学习中也是如此。

对社会数据分析感兴趣的人也欢迎阅读其他文章:

如果你喜欢这个故事,可以随时订阅Medium,你将会在我的新文章发布时收到通知,并且可以完全访问其他作者的成千上万篇故事。本文的完整源代码和 Jupyter 笔记本也可以在我的Patreon 页面找到。

感谢阅读。

Meta 的人工智能如何基于参考旋律生成音乐

原文:towardsdatascience.com/how-metas-ai-generates-music-based-on-a-reference-melody-de34acd783

MusicGen 分析

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Max Hilsdorf

·发布在Towards Data Science ·10 分钟阅读·2023 年 6 月 23 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来源:作者。

Meta 的 MusicGen

2023 年 6 月 13 日,Meta(前身为 Facebook)在音乐和人工智能界掀起了波澜,发布了他们的生成音乐模型 MusicGen。这个模型不仅在能力上超越了今年早些时候发布的 Google MusicLM,还使用了授权音乐数据进行训练,并且对非商业用途开源。

这意味着你不仅可以阅读研究论文或听取演示,还可以从GitHub复制他们的代码,或者在HuggingFace上的网页应用中试验模型。

除了从文本提示生成音频外,MusicGen 还可以基于给定的参考旋律生成音乐,这一功能被称为旋律条件化。在这篇博客文章中,我将演示 Meta 如何将这个有用且迷人的功能实现到他们的模型中。但在我们深入之前,让我们先了解旋律条件化在实际中是如何工作的。

展示

基础曲目

以下是我为这篇文章制作的一段短电子音乐片段。它包含电子鼓、突出的 808 低音和两个切分合成器。在听的时候,试着识别出这段音乐的“主要旋律”。

使用 MusicGen,我现在可以在其他风格中生成与相同主要旋律相符的音乐。我所需的只是我的基础曲目和描述新作品声音的文本提示。

管弦乐变奏

一段宏伟的管弦乐编曲,配有震撼的打击乐、史诗般的铜管号角和高亢的弦乐,营造出适合英雄战斗的电影氛围。

雷鬼变奏

经典雷鬼曲目加电子吉他独奏

爵士变奏

流行爵士乐,包含萨克斯风独奏、钢琴和弦,以及完整的军鼓

结果有多好?

尽管 MusicGen 并没有严格遵循我的文本提示,并创作出略微不同于我要求的音乐,但生成的作品仍然准确反映了所请求的音乐类型,更重要的是,每一首作品都展示了其对基础曲目主旋律的独特解读。

虽然结果并不完美,但我发现这个模型的能力相当令人印象深刻。自发布以来,MusicGen 一直是 HuggingFace 上最受欢迎的模型之一,这进一步强调了它的重要性。话虽如此,让我们更深入地探讨旋律条件化工作的技术方面。

文本到音乐模型的训练方式

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

三个文本-音乐对,作为训练模型如 MusicLM 或 MusicGen 的用途。图片由作者提供。

几乎所有当前的生成音乐模型在训练期间都遵循相同的程序。它们配备了一个包含大量音乐曲目及其对应文本描述的数据库。模型学习单词和声音之间的关系,以及如何将给定的文本提示转换为连贯且愉悦的音乐作品。在训练过程中,模型通过将其自身创作与数据集中的真实音乐曲目进行比较来优化自身创作。这使得模型能够识别自身的优点和需要改进的地方。

问题在于,一旦机器学习模型针对特定任务进行训练,比如文本到音乐生成,它就局限于那个特定任务。虽然可以让 MusicGen 执行一些它没有明确训练过的任务,比如延续给定的音乐片段,但不能期望它能处理所有的音乐生成请求。例如,它不能简单地将一段旋律转变为不同的音乐风格。这就像把土豆扔进烤面包机期待出来的是薯条一样。相反,必须训练一个单独的模型来实现这种功能。

对训练配方的简单调整

让我们探讨一下 Meta 如何调整模型训练过程,以使 MusicGen 能够根据文本提示生成给定旋律的变体。然而,这种方法存在几个挑战。主要障碍之一是识别歌曲的“旋律”并以计算上有意义的方式表示它的模糊性。尽管如此,为了从更广泛的层面理解新的训练过程,假设我们对什么构成“旋律”以及如何轻松提取并输入到模型中的达成共识。在这种情况下,调整后的训练方法可以概述如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

三个文本-音乐-旋律对,作为教学 MusicGen 旋律条件生成的用途。

对于数据库中的每个曲目,第一步是提取其旋律。随后,模型会接收曲目的文本描述和相应的旋律,促使模型重建原始曲目。本质上,这种方法简化了原始的训练目标,即模型仅仅被要求根据文本重建曲目。

要理解我们这样做的原因,让我们问问自己 AI 模型在这个训练过程中学到了什么。从本质上讲,它学会了如何将旋律转化为基于文本描述的完整音乐作品。这意味着在训练结束后,我们可以提供旋律给模型,并要求它创作任何风格、情绪或乐器的音乐作品。对模型来说,这与它在训练过程中成功完成过无数次的“半盲”生成任务是一样的。

了解了 Meta 用来教模型旋律条件音乐生成的技术后,我们仍然需要解决如何精确定义“旋律”的挑战。

什么是“旋律”?

事实上,除非所有乐器同时演奏,否则没有客观的方法来确定或提取多声部音乐作品中的“旋律”。虽然通常会有一个突出的乐器,如声乐、吉他或小提琴,但这并不一定意味着其他乐器不属于“旋律”的一部分。以皇后乐队的《波希米亚狂想曲》为例。当你想到这首歌时,你可能首先会回忆起弗雷迪·摩克瑞的主要声乐旋律。然而,这是否意味着前奏中的钢琴、中段的背景歌手和“你认为你能石化我……”之前的电吉他并不属于旋律的一部分?

提取歌曲的“旋律”的一种方法是将最突出、通常是混音中最响亮的旋律视为最主导的旋律。色谱图是一种广泛使用的表示方法,直观地展示了整个曲目中最主导的音乐音符。下面,你可以找到参考曲目的色谱图,最初包括完整的乐器配置,然后去除鼓和贝斯。在左侧,旋律中最相关的音符(B,F#,G)用蓝色突出显示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

两个色谱图都准确描绘了主要的旋律音符,其中不含鼓和贝斯的曲目版本提供了更清晰的旋律可视化。Meta 的研究也揭示了相同的观察结果,这促使他们使用其源分离工具(DEMUCS)去除曲目中的干扰节奏元素。这一过程得出的“旋律”表现足够代表,然后可以输入到模型中。

总结来说,我们现在可以将这些信息连接起来,以理解请求 MusicGen 执行旋律条件生成时的基本过程。以下是工作流程的可视化表示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

MusicGen 如何生成旋律条件音乐输出。图片由作者提供。

局限性

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Xavier von Erlach 拍摄的照片,来源于 Unsplash

虽然 MusicGen 在旋律条件生成方面展现了有希望的进展,但仍需认识到技术仍在不断完善中。即使去掉鼓和贝斯,色度图谱(chromagrams)也无法完美地表示乐曲的旋律。一个局限性是色度图谱将所有音符分类到 12 个西方音高类别中,这意味着它们能捕捉到两个音高类别之间的过渡,但不能显示旋律的方向(上升或下降)。

例如,从 C4 移动到 G4(一个纯五度)之间的旋律间隔与从 C4 移动到 G3(一个纯四度)之间的差异显著。然而,在色度图谱中,这两个间隔会显得相同。问题在于八度跳跃会加剧,因为色度图谱会显示旋律停留在相同音符上。考虑一下色度图谱如何误解 Céline Dion 在“我心永恒”(“My Heart Will Go On”)中的“wher-e-ver you are”这一情感丰富的八度跳跃为稳定的旋律移动。为此,只需查看下面 A-ha 的“Take on Me”合唱部分的色度图谱。这是否反映了你对歌曲旋律的想法?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“Take on Me”(A-ha)的合唱部分的色度图谱,去掉了贝斯和鼓。图片由作者提供。

另一个挑战是色度图谱的固有偏差。它在捕捉某些歌曲的旋律时表现良好,而在其他歌曲中则完全失误。这种偏差是系统性的,而非随机的。色度图谱更能准确地表示具有主导旋律、最小音程跳跃和统一演奏的歌曲,相比之下,对于复杂旋律分布在多个乐器上并具有大音程跳跃的歌曲则表现不佳。

此外,生成 AI 模型本身的局限性也值得注意。输出的音频与人工制作的音乐仍有明显差异,并且在六秒的时间间隔内保持一致风格仍然是一个挑战。此外,MusicGen 在忠实捕捉文本提示的复杂方面上存在不足,之前提供的示例便证明了这一点。旋律条件生成要达到既能用于娱乐和灵感激发,也能生成适合最终用户的音乐的水平,还需要进一步的技术进步。

未来展望

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 Marc Sendra Martorell 提供,来源于 Unsplash

我们如何改进 AI?

从我的角度来看,未来研究应主要关注的一个问题是如何从曲目中提取和表征“旋律”。虽然色谱图是一种成熟且直接的信号处理方法,但也有许多较新的实验性方法使用深度学习来实现这一目标。看到像 Meta 这样的公司从这些进展中获得灵感将是令人兴奋的,这些进展中的许多内容都在Reddy et al. (2022)的一份全面的 72 页综述中进行了介绍。

关于模型本身的质量,无论是音频质量还是对文本输入的理解,都可以通过扩大模型和训练数据的规模以及开发更高效的算法来提高。依我看来,2023 年 1 月发布的 MusicLM 类似于“GPT-2 时刻”。我们开始见证这些模型的能力,但在各个方面仍需显著改进。如果这个类比成立,我们可以预期,类似 GPT-3 的音乐生成模型的发布可能会比我们预期的要早。

这对音乐家有何影响?

与生成音乐 AI 经常出现的情况一样,关于其对音乐创作者工作的潜在负面影响也引发了关注。我预计,未来通过创造现有旋律的变体来谋生将变得越来越困难。这在铃声制作等场景中特别明显,企业可以轻松地以最低成本为新的广告活动或个性化广告生成大量变化的铃声旋律。这无疑对依靠这些活动作为主要收入来源的音乐家构成了威胁。我重申我的呼吁,希望参与创作那些因其客观音乐特质而非主观人类特质(如库存音乐或铃声)的音乐创作者探索其他收入来源,为未来做准备。

从积极的一面来看,旋律条件的音乐生成提供了一种令人难以置信的工具,能够提升人类的创造力。如果有人开发出引人入胜且令人难忘的旋律,他们可以快速生成其在各种风格中的可能效果。这一过程有助于确定理想的音乐风格和类型,以使音乐栩栩如生。此外,它提供了一个机会,可以重新审视个人音乐目录中的过去项目,探索将其转化为不同风格或类型时的潜力。最后,这项技术降低了没有正式音乐培训的创造性人士进入这一领域的门槛。现在,任何人都可以想出一个旋律,将其哼唱到智能手机麦克风中,并与朋友、家人分享其杰出的编排,甚至尝试触及更广泛的受众。

AI 音乐生成是否对我们的社会有益的问题仍然有待讨论。然而,我坚信旋律条件的音乐生成是这一技术真正提升专业人士和有志创作者工作的一种应用场景。它通过提供新的探索途径来增加价值。我热切期待在不久的将来见证这一领域的进一步进展。

如果你对音乐与 AI 的交汇点感兴趣,你可能也会喜欢我关于这一主题的其他一些文章:

  1. 谷歌如何使用虚假数据集来训练生成音乐 AI

  2. 聊天机器人即将颠覆音乐搜索

  3. MusicLM — 谷歌是否解决了 AI 音乐生成问题?

我们需要多少数据?在机器学习与安全考虑之间的平衡

原文:towardsdatascience.com/how-much-data-do-we-need-balancing-machine-learning-with-security-considerations-a26911f211f6?source=collection_archive---------13-----------------------#2023-12-15

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Stephanie Kirmer

·

关注 发表在 Towards Data Science ·7 分钟阅读·2023 年 12 月 15 日

对于数据科学家来说,数据多了也不会嫌多。但当我们从更广泛的组织背景来看时,必须平衡我们的目标与其他考虑因素。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来源:特尔纳瓦大学Unsplash

数据科学 vs 安全/IT:一场世纪之战

数据获取和保持是我们数据科学家大量心理精力的焦点。如果你问数据科学家“我们能解决这个问题吗?”我们大多数人会首先问“你有数据吗?”接着是“你有多少数据?”我们想要收集数据,因为这是我们想要进行的大多数工作的前提,以便产生有价值的模型和有益的结果。我们喜欢深入挖掘这些数据,了解其中真正的内容和含义,找出数据是如何生成或收集的,并从中得出可以推广的结论。

然而,深入审视数据隐私会将我们的习惯和选择置于不同的背景中。数据科学家的直觉和欲望往往与数据隐私和安全的需求相冲突。任何曾为获得数据库或数据仓库的访问权以构建模型而努力的人都能感同身受。感觉像是有过于谨慎的障碍阻碍我们完成工作。毕竟,我们拥有数据的理由不是为了从中学习和建模吗?即使是最优秀的我们,有时也会妖魔化那些以隐私和安全为主要目标的组织部分,这些目标与我们希望在数据湖中畅游的愿望相冲突。

实际上,数据科学家并不总是英雄,IT 和安全团队也并非反派。我们都在为重要目标而努力,并且在追求过程中可能都会有一点隧道视野。了解这两个角色的视角有助于理解存在的紧张关系和竞争利益。

数据科学角度

从数据科学的角度来看,拥有大量数据通常是实现工作目标所必需的。要构建一个通用的模型,你需要拥有很多很多样本数据,以应对生产中的各种情况。数十万或数百万个案例并不是一个离谱的数量。然而,要真正做到这一点,数据科学家必须花费大量时间和精力来审问这些数据。拥有大量数据是很棒的,但如果你不知道它真正代表什么及其来源,那么有效的数据科学工作将会非常艰难。

安全角度

从安全优先的角度来看,我们必须承认,数据量越大——特别是如果有多个存储系统或处理过程影响数据——数据泄露的风险就越大。本质上,数据越多,某些数据丢失或被不当访问的可能性就越大。此外,更多人访问数据意味着更多的泄露或数据丢失的机会,因为人类是技术领域中最大的风险因素。我们是链条中的薄弱环节。

这都意味着什么?我认为这要求我们找到一个中间地带。一方面,数据越多,实际上我们深入理解它的可能性就越小,或者说即使有时间和工具,我们也可能无法做到。如果我们无差别地囤积所有数据,实际上我们会处于一个连数据都无法理解的境地,同时处于最高的泄露风险中。如果我们什么都不存储,或者存储不足,我们就会让数据科学所提供的巨大价值无法获得。

所以,我们需要找出这种中间地带的位置。数据工程和数据保留的最佳实践确实存在,但我们也必须做出很多临时决定。围绕数据保留和使用的原则对于在这些情况下指导我们是非常重要的。

制度性考虑

说到数据管理,我应该提到——我最近开始了一个新角色!我是 DataGrail 的首席高级机器学习工程师,这是一家提供一整套 B2B 服务的公司,帮助公司保护和管理客户数据。这自然将数据存储和隐私的问题摆在了我面前,并让我思考了自己在不同成熟度公司的职业经历以及他们如何处理数据。

对于一家公司来说,成为数据囤积者是非常容易的。你开始时数据不足,完全无法掌控局面,只能在收集关于交易、业务活动等数据的过程中来帮助决策和制定策略。虽然你可能还没有做机器学习,但你能看到未来的潜力,并希望做好准备。收集和存储数据似乎不仅合理而且至关重要!于是,你建立了数据系统,并开始填充这些表格或主题。

然而,这种做法是不可持续的——至少不是永久的。几年之后,你可能会拥有大量的数据。也许你需要扩展到像 Snowflake 或 AWS 这样的云存储提供商,以跟上并以你需要的速度访问所有这些数据。你当然在使用这些数据!也许你已经开始了一个机器学习项目,或者仅仅是高级分析和商业智能,但如果做得好,这对你业务的有效性有着巨大的影响。即便如此,你还需要开始考虑基础设施的成本,更不用说可能还需要招聘数据工程人员来帮助管理这些数据。

不幸的是,你也开始获得你无法很好掌控的数据。文档可能已经过时了,如果曾经存在过的话,而那些帮助构建原始系统的员工可能已经离职。这张表格是什么意思?那一列的来源是什么?不可解释的数据几乎没有任何价值,因为你无法从不理解的数据中有效地学习。

现在你有决定要做。你打算如何战略性地规划你数据系统的未来?你可能需要关注数据架构,以防止成本飙升,但数据保留呢?你是否保留所有数据?如果不是,你会删减哪些数据,何时删减?不过,请记住,如果你的业务需要有效的机器学习和/或分析功能来支持决策和产品,那么保留相当大体量的数据是一个不可妥协的要求。 “把所有数据都丢掉,避免这些无谓的麻烦”并不是一个选项。

与此同时,你需要考虑适用于这些数据的监管和法律框架。如果一个客户要求你删除所有关于他们的数据(某些司法管辖区允许这样做),你会怎么做?许多组织在已经为时已晚之前不会认真对待这一点。如果你想掌控全局,而你又不是从第一天开始做这件事,你将面临将数据架构调整到符合这些数据所受监管要求的艰巨任务。

关于法规的附言

近年来数据安全法规的增长增加了我描述的商业场景的挑战。在某些方面,这也是我们自己造成的——近年来众多的数据泄露、松散的安全措施以及各种公司的不透明同意政策导致了公众对更好保护措施的需求,政府也填补了这一空白。看来,品牌信任和安全性本身并不足以激励许多企业在数据保护方面采取更严格的措施。如果法律对于确保我们的个人数据和敏感记录得到认真保护是必要的,那么我个人是完全支持的。

然而,作为一个数据科学家,我必须承认我在这篇文章开始时提到的紧张感。我希望拥有所有的数据,并且希望能够不受限制地挖掘这些数据,因为这是我有效完成工作的方式。但是,我同时也是一个消费者和公民,我希望我的数据得到细致的保护。我知道机器学习的承诺和力量依赖于数据的可用性,但当你考虑到这些数据涉及到你自己及你的习惯时,感觉自然会变得不那么清晰。我发现这个角色比“安全”角色更容易体现,因为我不是经过专业训练的数据安全专家,但我不需要成为专家就能对作为消费者的偏好有强烈的感觉。

我的建议是,我们要时刻保持对消费者/安全的关注,同时也要保持对数据科学家的关注。我们必须在为机器学习积累数据和为了客户隐私及数据安全而限制数据保留之间保持平衡。对于“我们应该保留多少数据?”这个问题没有银弹式的答案,因此唯一的选择是在我们做出有关数据存储的每个决定时都要兼顾这两方面的利益。

我将在假期期间暂时中断专栏,并将于 1 月中旬带来下一篇文章。

查看我更多的作品请访问 www.stephaniekirmer.com

在模型选择过程中,你会损失多少预测性能?

原文:towardsdatascience.com/how-much-forecasting-performance-do-you-lose-during-model-selection-923889e2f2dc

交叉验证多频繁地选择最佳预测模型?当它未能选择最佳模型时会发生什么?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Vitor Cerqueira

·发表于 Towards Data Science ·阅读时间 5 分钟·2023 年 1 月 6 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Héctor J. Rivas 拍摄的照片,来源于 Unsplash

假设你有一个预测问题。你需要选择一个模型来解决它。你可能想用交叉验证测试一些替代方案。

你是否曾想过交叉验证选择到最佳模型的几率有多大?如果没有选择到最佳模型,那么选择到的模型会差多少?

让我们找出答案。

介绍

交叉验证,无论是时间序列还是其他类型,都解决了两个问题:

  • 性能估计。 模型在新数据上的表现如何?你可以使用这些估计来评估模型是否可以部署;

  • 模型选择。 使用上述估计来对可用模型池进行排名。例如,不同配置的学习算法用于超参数调整。在这种情况下,你选择具有最佳性能估计的模型。

等等!这两个问题不是一样的吗?

并不是完全如此。某个特定方法(例如,TimeSeriesSplits)可能提供良好的性能估计,平均而言。但在对可用模型进行排名时,它可能表现较差,从而在模型选择上表现不佳。

例子

让我举个例子。假设你想比较四个模型:M1M2M3M4。它们显示在下面图 1 的 x 轴上。

这些模型的真实测试损失以蓝色条形图显示。它们的排名是M1 > M2 > M3 > M4。因此,M1是最佳模型,因为它显示了最低的误差(比如说,平均绝对误差)。

然后,使用两种交叉验证方法(CV1CV2)来估计每个模型的误差。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1:交叉验证的目标是接近真实误差(蓝色条)。CV1(浅绿色蓝色)平均提供了比 CV2(深绿色)更好的估计。但 CV2 能够完美地排名模型,而 CV1 则不能。

CV1 平均产生最好的估计(最接近真实误差)。但,估计的排名(M2 > M1 > M4 > M3)与实际的排名不同。它也比CV2产生的排名更差。

尽管提供了较差的性能估计,CV2 输出了模型的完美排名。

这个例子表明,一种 CV 技术可能在性能估计上更好(CV1),但另一种在模型选择上更好(CV2)。

模型选择中的性能损失

假设你正在进行预测模型选择。你可能会想到两个问题:

  1. 交叉验证选择最佳模型的机会有多大?即在测试集上表现最佳的模型。

  2. 如果没有发生这种情况会怎样?所选模型的表现会差多少?

测试不同的交叉验证方法

我们可以通过模拟一个现实的场景来回答这些问题。首先,使用训练数据应用交叉验证来选择一个模型。然后,检查这个模型在测试集上的表现。

让我们一步一步来做。

我准备了 50 个不同的预测模型。这些包括不同配置的线性模型、决策树等。 这些模型使用了一种名为自回归的监督学习方法进行训练。 不详细说明,最近的过去值被用作解释变量。目标变量是未来的观测值。

然后,我应用了几种交叉验证技术来选择最佳模型。这些包括 TimeSeriesSplits(即时间序列交叉验证)、 MonteCarloCVK-fold Cross-validation。你可以在之前的文章中查看每种方法的描述。

我重复了这个过程近 3000 个不同的时间序列。

结果如下。

交叉验证选择准确率

选择准确率是指交叉验证方法选择最佳模型的次数百分比。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2:不同交叉验证方法在选择最佳预测模型时的准确度。每种方法的描述请参见之前的文章。图像来源于作者。

分数范围从 7%到 10%。

听起来很低对吧?然而,如果你随机选择一个模型,你的期望准确度是 2%(50 个可能模型中有一个)。因此,7%到 10%要好得多。

然而,所有方法可能都无法选择最佳模型。接下来就是第二个问题。

选择的模型有多好?

为了回答这个问题,我们将所选模型与应该选择的模型进行比较。

我们可以测量这两个模型之间错误的百分比差异。当交叉验证选择最佳模型时,差异为 0。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3:所选模型与最佳模型之间的平均百分比误差差异(及其标准差)。图像来源于作者。

大多数估计器选择的模型比最佳模型平均表现差 0.3%。这里有一些差异,但总体而言,不同的交叉验证方法在模型选择上表现相似。

例外的是Holdout,它代表了单次拆分。这印证了我在之前的文章中提出的建议。除非时间序列很大,否则如果可以的话,请进行多次拆分。

你可以在文章中查看完整实验,这些实验可以通过我的 Github上的代码重现。

主要结论

  • 模型选择是利用交叉验证从多个替代模型中选择一个模型的过程;

  • 对于 50 个替代模型,交叉验证有 7%-10%的概率选择最佳模型;

  • 当没有选择最佳模型时,所选模型的表现会比最佳模型差 0.3–0.35%,平均而言;

  • 多个交叉验证拆分对更好的模型选择非常重要。

感谢阅读,下次故事见!

相关文章

进一步阅读

[1] Cerqueira, Vitor, Luis Torgo, 和 Carlos Soares. “时间序列预测的模型选择:不同估计器的实证分析。” arXiv 预印本 arXiv:2104.00584 (2021)。

[2] Arlot, Sylvain 和 Alain Celisse. “模型选择的交叉验证程序综述。” 统计调查 4 (2010): 40–79.

Nightshade 的工作原理

原文:towardsdatascience.com/how-nightshade-works-b1ae14ae76c3?source=collection_archive---------1-----------------------#2023-11-03

将生成图像的人工智能与被污染的数据混淆

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Dorian Drost

·

关注 发布在 Towards Data Science ·10 分钟阅读·2023 年 11 月 3 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就像城堡的高墙一样,Nightshade 可以成为保护知识产权不受非法使用的一种方式。照片由 Nabih El Boustani 提供,发布在 Unsplash

最近出现的 Nightshade 算法能够创建用于混淆图像生成 AI 模型的污染数据,给有关此类模型的对抗攻击讨论注入了新的活力。这一讨论也受到伦理和社会考量的影响,因为这些攻击可能为艺术家、内容创作者和其他人提供了反击的方式,如果他们觉得 AI 模型未经许可使用了他们的内容,但也可能被用于不良意图。

在这篇文章中,我想解释 Nightshade 的核心概念。为此,我将首先解释数据中毒的一般思路,并突出其不足之处。然后,我将向你介绍 Nightshade,一种克服幼稚方法一些缺点的算法。最后,我将简要讨论一些来自其使用的伦理考虑。

数据中毒

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

毒性还是无毒?图片由 Fiona Smallwood 提供,来源于 Unsplash

让我们从数据中毒的概念开始说起。假设你想影响图像生成 AI,使其无法生成某些类型的图像,或者无法理解某些提示。你为什么要这样做?最可能的非破坏性原因可能是,你是一个艺术家,想避免图像生成模型能够生成你的风格的图像,或者你创造了一个新的漫画角色,该角色在未经你许可的情况下不应由图像生成模型再现。

那么,你该怎么做呢?让我们从了解生成 AI 学习的基本概念开始。显然,图像生成 AI 依赖于其训练数据。具体来说,它依赖于存在展示某个概念(比如 )的图像,并且这些图像与描述其内容的文本(例如像 带眼镜的可爱狗 这样的图像说明)相关联。基于此,它学习提取图像共享的某些视觉属性,这些图像的说明中也包含某些关键词。也就是说,模型通过学习提到 的所有图像的属性来学习 狗的样子

现在,如果你引入显示狗的图像,但这些图像的说明总是提到 ,会发生什么呢?最终, 只是图像中可以看到的东西的符号。如果显示狗的图像被标记为猫,模型将只是学到符号 代表我们称之为 的东西。如果模型没有任何英语语言的先验知识,如何知道这些标签是错误的,即使它们是如此一致?如果你不懂德语,我给你展示一百张狗的图像,并告诉你它们的标签是 Katze,你会假设 Katze 是德语中的 。你不会知道实际的德语单词 Hund,而 Katze 意思是 ,因为你只是学习了标签与图像属性之间的关联。

刚才描述的过程被称为 数据中毒,源于你引入对模型训练具有恶意影响的数据实例的想法(就像毒药对你的健康有恶意影响一样)。

幼稚的数据中毒攻击

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一只戴着眼镜的可爱狗狗,想着如何攻击图像生成模型。照片由Jamie Street提供,来源于Unsplash

作为一种简单的方法,你可以使用上述想法来混淆像 Stable Diffusion 这样的机器学习模型。假设你想让 Stable Diffusion 在被提示为狗时生成猫的图片。为此,你需要创建许多猫的图片,将它们标记为,并将它们上传到互联网。然后你希望这些图片被抓取用于 Stable Diffusion 模型的下次训练。

如果你许多图片成为下次训练的一部分,这确实可能导致猫和狗之间的混淆。然而,这种方法也有一些缺点:

  • 你需要很多图片。由于有许多其他未中毒的猫的图片,你需要大量的图片才能产生影响。如果你只提供 10 张中毒图片,而另一边有 1000 张未中毒的猫的图片,你对训练几乎没有影响。通常,你需要对所有图片中 20%或更多的图片进行中毒才能产生效果。

  • 请注意,你不知道哪些图片会成为训练的一部分。因此,如果你想将 500 张中毒图片引入训练中,你可能需要创建 5000 张并将它们散布在整个互联网,因为只有其中的一些可能会实际被抓取用于训练。

  • 如果你上传标记为的猫的图片,人类可以很容易地识别出来。在使用你的图片进行训练之前,它们可能会被质量门槛过滤掉(无论是人类还是专门的 AI)。

Nightshade

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Nightshade 算法的名字源自一种非常毒性的植物。照片由Georg Eiermann提供,来源于Unsplash

现在让我们来看看Nightshade,这是一种旨在克服这些缺点的算法。为此,Nightshade 使用两个关键概念:它创建对模型产生最大影响的图片(这意味着总共需要更少的图片),以及这些图片在人类眼中无法与非中毒图片区分开来。

首先,如何从图像中获得最大效果?理论上,你会希望使用那些在训练过程中导致梯度变化最大的图像。然而,要找出这些图像,你需要观察训练过程,这在一般情况下是做不到的。不过,Nightshade 的作者提出了一种不同的解决方案:你可以使用一个由你想要破坏的模型生成的图像。也就是说,如果你想让猫的图像被标记为狗,你可以用一个简单的提示词来提示模型,比如一只猫的图像。模型生成的图像将是它理解为猫的一个非常典型的表现。如果这个图像在训练中出现,它将对猫的概念理解产生很高的影响(比那些不典型的猫图像要高得多)。因此,如果你破坏这个图像,你将对模型的训练产生非常大的影响。

其次,我们说过,Nightshade 的图像应该与未被破坏的图像难以区分。为了达到这个目标,Nightshade 采用自然图像并施加扰动(即像素值的小变化),直到图像被模型以不同方式感知。继续使用我们之前的狗与猫的例子,我们会取一个由模型生成的显示猫的图像。这个图像我们称之为锚图像或接下来的公式中的 xᵃ。接下来,我们取一张非常典型的狗图像,我们称之为 xₜ。现在,我们对这张图像 xₜ 添加扰动 δ,使其优化以下目标:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 F() 是模型使用的图像特征提取器,Dist 是距离函数,p 是 δ 的上界,以避免图像变化过大。这意味着我们希望找到 δ,使得扰动后的狗图像(F(xₜ + δ))和锚图像(显示猫的 F(xᵃ))的特征之间的距离尽可能小。换句话说,我们希望从模型的角度来看,这两个图像是相似的。请注意,F(x) 是特征提取器的结果,它是模型在特征空间中看见的图像,这与你在像素空间中看到的图像不同。

在接下来的图像中,你将无法发现原始图像和被破坏图像之间的任何差异(至少我看不到)。然而,在它们的特征空间中,它们的差异很大。例如,被破坏的狗图像的特征非常接近猫图像的特征,因此对于模型来说,它几乎看起来像一只猫。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

两个被破坏图像的例子。下排的图像是上排图像的扰动版本。尽管人眼无法看出差异,但从模型的角度看,原始图像和被破坏的图像非常不同。图像取自 Nightshade 论文[1]。

使用这种技术,我们能够生成对模型训练产生巨大影响且无法被检测为被毒化的图像。如果你将这些图像上传到互联网上,没有人会对其产生怀疑,因此这些图像很不可能被任何质量门槛过滤掉。此外,由于这些图像的威力如此之大,你不需要像采用简单方法时那样毒化 20%的狗图像。使用 Nightshade,通常 50 到 100 张图像就足以破坏模型在特定概念上的表现。

泛化能力

除了我们刚才看到的要点外,Nightshade 还有另一个有趣的优势,即其多种方式的概括能力。

首先,毒化某个关键词也会影响那些在语言或语义上相关的概念。例如,毒化的图像也会影响像小狗哈士奇这样的关键词,这些概念与相关。在以下示例中,概念已被毒化,这也阻碍了小狗哈士奇的生成。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是一个示例,说明了如何通过毒化一个概念(狗)也会阻碍相关概念(小狗、哈士奇、狼)的生成。图像摘自 Nightshade 论文[1]。

同样地,毒化一个如幻想的概念也会影响语义上相关的概念,但不会影响其他概念,如下例所示。你可以看到,像这样的概念,它与被毒化的幻想相近,受到了影响,而像椅子这样的概念则没有。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是一个示例,说明了如何通过毒化一个概念(幻想)也会阻碍相关概念(例如龙)的生成。注意,非相关概念(例如椅子)没有受到影响。图像摘自 Nightshade 论文[1]。

此外,当毒化多个概念时,生成图像的能力可能会完全崩溃。在以下示例中,100、250 或 500 个概念已被毒化。随着毒化概念的增加,即使是那些完全未被毒化的其他概念(如绘画),其生成也会受到严重阻碍。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个例子是如何毒化多个概念会阻碍生成图像的能力。注意,、绘画和海贝这些概念并没有特别被毒化。图像摘自 Nightshade 论文[1]。

此外,Nightshade 的效果也会对不同的目标模型产生普遍影响。请记住,我们使用了我们想攻击的模型来生成锚定图像,这帮助我们构建了被污染的图像。其背后的想法是,这些图像具有很强的原型特征,因此会对训练产生强烈影响。我们还需要访问特征提取器来优化扰动。自然,Nightshade 的影响在这些锚定图像由被攻击的模型生成,并且该模型的特征提取器可以用于优化时最强。然而,即使锚定图像和特征提取器来自其他模型,中毒效果也相当好。也就是说,你可以使用例如 Stable Diffusion 2 来生成你的中毒图像,即使你想攻击的是 Stable Diffusion XL。如果你没有访问实际想攻击的模型,这可能会很有趣。

伦理问题

到目前为止,我介绍了 Nightshade 作为一种可以被内容创作者用来防御其知识产权不被非法使用的方法。然而,正如硬币有两面一样,数据中毒也可以被用来有害地,可能是有意的,也可能是无意的。无需多言,数据中毒可以用来故意扰乱生成式 AI 模型,给其创建者造成财务损失,并妨碍科学研究。一家 AI 公司为了提升自己的模型而摧毁竞争对手的训练数据,只是数据中毒恶意使用的无数例子之一。然而,即使你只是想保护自己的内容,我们刚刚看到,大量的概念中毒会妨碍 AI 生成图像的能力。因此,如果很多人使用 Nightshade,这可能会摧毁图像生成 AI 对那些本应合法使用的概念的生成能力。因此,即使是为了保护自己的内容,使用 Nightshade 的内容创作者也可能造成不必要的损害。是否以及在多大程度上接受这种附带损害,是一个值得热烈讨论的问题。

更重要的是,正如你可以想象的那样,攻击生成式 AI 的能力是一场不断起伏的战斗。每当新的攻击手段被发明出来,另一方便会提出新的防御机制。虽然作者声称 Nightshade 对常见的防御机制(例如,使用专门分类器检测被污染的图像或其他属性)相当强健,但只不过是时间问题,直到新的防御措施被发现来对抗 Nightshade。从这个角度来看,Nightshade 可能暂时允许创作者保护他们的内容,但最终可能会变得过时。

总结

正如我们刚刚看到的,Nightshade 是一种创建中毒数据集的算法,它超越了用错误标签标记数据的幼稚方法。它创建的图像不会被人类识别为中毒图像,即使示例数量较少,也能严重影响图像生成 AI。这大大增加了中毒图像成为训练数据的一部分并产生影响的可能性。此外,它承诺在多种方式上进行泛化,这使得攻击更加强大且不易防御。因此,Nightshade 提供了一种新的方式来反击未经其创作者许可用于模型训练的不正当使用,但也包括了潜在的破坏性使用,因此需要对其伦理影响进行讨论。若出于高尚意图使用,Nightshade 可以帮助保护知识产权,例如艺术家的风格或发明。

来源

这是介绍 Nightshade 的原始论文:

  • [1] Shan, S., Ding, W., Passananti, J., Zheng, H., & Zhao, B. Y. (2023). Prompt-Specific Poisoning Attacks on Text-to-Image Generative Models. arXiv preprint arXiv:2310.13828.

喜欢这篇文章? 关注我 以便获取我未来的帖子通知。

《糟糕的利益相关者管理如何毁掉分析》

原文:towardsdatascience.com/how-poor-stakeholder-management-ruins-analytics-bb70700692c0?source=collection_archive---------1-----------------------#2023-06-28

为什么掌握分析师与利益相关者接口的主导权可以瞬间改善你的生活并提升你的工作影响力

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Robert Yi

·

关注 发表在 Towards Data Science ·9 min read·2023 年 6 月 28 日

你刚刚开始了一个新的分析师角色。你很兴奋能够获得关于,比如说,猫咪家具的数据——这是你非常热爱的领域。你的第一个请求来了:一个高管想知道他们有多少种猫砂盆。你迫不及待地拉取了数据。“太完美了!你也可以把猫床的数量拉出来吗?” 你意识到为她创建一个仪表板会更高效,于是你做了一个。高管非常兴奋,而你也觉得自己做得很好,推进了数据驱动的信条。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

猫… 家具?图片来自 Midjourney,已获许可使用。

后来,你发现这些数字被用来支持一个关于哪些类别应该放在主页上的论点。你感到不安。这些数字本不该以这种方式使用,你能想到十几种更优的分类方式。你提取这些数字是为了……嗯,你从未知道为何,但你不认为是为了那个。你看到高管关于这一计划的写作,意识到你的数据被拿来进行荒谬的分析。你的数据就这样——与无关的论点一起,毫无意义地摆放在一旁。你对缺乏逻辑连贯性感到不适,因此你向高管抗议,但她向你保证没问题。

“我只是需要支持我的论点,而且反正也没有人会仔细查看。”

你叹了口气,回到构建更多仪表板。这一次,你专注于你能控制的方面——数据质量措施、构建更优雅的数据模型、优化查询。

我想你们中的大多数人,如我一样,一遍又一遍地经历了这个故事。这似乎难以解决,因为问题看起来如此外部——我们离开这些交易时感觉利益相关者根本不理解数据是如何工作的。我们将问题归因于破碎的企业文化,且我们自我安慰地寻找其他方式产生影响——至少,直到我们找到下一个“数据驱动”的公司。

但在这篇文章中,我想直接讨论如何改善这种情况,从而通过打破这个循环来提高我们作为分析师的生活质量。具体来说,我将论证我们在上述故事的核心中存在的两个失误是:

  1. 我们未能对我们的数据使用承担责任

  2. 决策过程的理解不足。

现在,让我们讨论这些问题。

问题 1:我们需要对我们的数据使用承担更多的责任。

分析是一种 达宁-克鲁格 吸引力:大多数人认为他们理解如何解释数据,但真正做到这一点的人很少。毕竟, 陷阱 此。这种二分法是我们行业的核心问题,我想这也是我们常常被低估、误解,并且在高管裁员时被 最早剔除 的原因。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个虚假相关性的例子。创意共享许可证来自 tylervigen.com。

不幸的是,我们分析师通过简单地做我们自己——研究者、科学家、隐士——来助长这种幻想:喜欢:思考、流程、数学、严谨;不喜欢:回答临时请求、说服。当一个同事鼓励我们寻求帮助时,最好的情况是我们会 concoct 出精彩的分析,然后将深奥的结果扔向真正需要它的人。最糟糕的情况是我们会回传原始数据而不提供任何解释,让我们的利益相关者(错误地)自己处理偏见。

这就是问题所在。这种行为背叛了我们对分析如何运作的误解:不应该由其他人来使我们的工作有用——必须由我们来承担责任。我以前谈到过分析是一个接口学科,但其结果是我们必须对接口承担一定程度的责任

考虑任何其他的接口学科,你会发现最有效的 IC(集成电路)都是以这种方式运作的。例如,优秀的设计师在设计时会考虑工程方面的问题。优秀的工程师会仔细审查产品需求文档,并与设计师和产品经理紧密合作。客户服务代表和销售人员会在客户所处的位置与他们会面——想象一下如果销售人员等待潜在客户主动联系他们会有多么有效。

但这就是我们在分析中所做的。我们像一个服务组织一样运作,而不是作为思维合作伙伴,难怪我们最终被如此对待。我认为作为一个行业,我们深知这一点。在过去的几年里,我们共同构建了整套操作智慧,这些智慧似乎都指向一个共同的根本原因:我们没有对接口负责。

  • 我们应该把 团队管理像产品团队一样**。**

    ……因为产品团队总是关注客户,就像我们应该深切关心我们的分析如何被使用一样——即接口。

  • 我们应该更多地关注 减少技术工作 ……因为技术工作只是战斗的一半。交付——即接口——是另一半。

  • 我们应该痴迷于 通过分析提供解释 ,而不仅仅是通过仪表板提供原始数据。

    ……因为利益相关者-分析师的接口是通过解释来媒介的。

  • 我们需要构建 寻求真相的生态系统 ……这同样是理解利益相关者接口应该是什么样子的一个思维模型。

因此,最好是尝试掌控你的工作如何被使用。请求访问权限,参加会议,暂时走出你的隐居处,与你的利益相关者分享你更新的理念。这是你和他们的影响力的一个途径。

问题 2:我们不知道决策是如何运作的

所以,当然,我敢打赌我们大多数人确实会尽力认真管理我们的利益相关者。但是,尽管如此,我们还是会困惑,这让我想到阻碍我们前进的第二个大问题:我们不知道如何参与决策过程。我们中的一些人承担了迂腐的角色,为了严谨而严谨。其他时候,我们则静静地坐在角落里等待被召唤。问题在哪里?我们不知道决策是如何工作的,因此也不知道如何有效地参与其中。让我们讨论一下决策是如何运作的。

我曾经是一个硬核分析师,但在过去几年里,我有幸在 Hyperquery 负责产品。虽然你可能认为构建数据工具与进行数据工作没什么不同,但我感受到了一种强烈的认知失调,与我过去作为分析师的运作方式相抵触。曾经我的世界完全是量化的,而现在我突然发现自己在做决定时只有定性数据可用。因此,我适应了——我逐步学会了从高度模糊的泥土中塑造合理的决策。但在整个过程中,我最震撼的发现是:在过去三年中,我做出的每一个决定都不是完全基于 SQL 查询结果的

即使数据对我来说非常容易获取,甚至数据在我的血液中,事实是:数据永远不是主要的东西。由此,我深刻认识到,作为数据从业者,我们对数据在决策中的作用有根本性的误解。简单明了:数据在我曾经认为的重要性上并不重要。这并不是说它重要,只是它并不是我曾经自欺欺人的那种无误、客观的真理表现。

数据不是全部的故事。数据只是一个数据点

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者提供。

这并不是说数据没有用——数据本身可以非常强大。它不会告诉你该做什么,但它可以封闭某些选择的道路。它永远不等同于一个决定,但它可以作为加速剂。它不能告诉你该做什么,但它可以在客户保持沉默时为他们发声。它不是唯一的答案,但它可以简化理解,并提供使其更容易看到一个答案的清晰度。数据帮助我在模糊中导航,就像定性数据一样。我查看数据,调整我的先验,然后走上思想迷宫的另一条路线。在这种能力上,它是无价的

但这是对数据的一种完全不同于我作为数据从业者所理解的数据的描述。当你的整个世界都是数据时,很容易认为这就是全部。但理解我们工作的角色很重要,以便我们能够更好地融入决策对话。我们不应强迫决策,但提高我们的背景理解可以帮助我们做出有用的建议。你坐在副驾驶座上,如果你知道你要去哪里,你可以帮助规划路线。

最后的评论

现在我知道,所有这些听起来比做起来要容易——我确信到目前为止我的建议的模糊性是你现在最大的问题。为了让这一点更清楚些,让我们重新考虑一下本文开始时的故事,如果情况稍微不同的话。再次,你的利益相关者想知道你们提供多少种猫砂盆。你没有直接跳到查询,而是 询问原因。结果发现高管想为主页挑选一些类别。你提供了关于推荐系统的建议,但她抱怨这太多了。意识到她有一个紧迫的交付时间,你告诉她你会构建一个快速的仪表盘,以便我们可以一起查看数据,然后基于这些信息做出连贯的决定。她同意了。你在她最初要求的简单数量之上拉取了额外的指标——点击率、订单率、平均评分。你甚至定义了一个新的指标:低曝光项目的百分比。你将数据和你的建议一起分享给你的利益相关者。

她当然会提出反对意见。但你不是反推,而是试图理解利益相关者反对的基础,以达成最佳决策。通过深入讨论,你们共同形成了将你的定量发现和她的定性直觉融合在一起的假设,这些假设成为了稳健类别创建的基础。你在她的产品策略文档中撰写了一份分析报告。她做出的选择得到了极大的改进,你感觉自己确实改变了猫家具历史的轨迹。

这与我们开始时的故事有根本的不同,但它的成功依赖于仅仅两个小的变化:

  1. 你通过询问原因掌握了数据使用的主动权。

  2. 你将数据融入了她的直觉中,而不是试图推翻它。这之所以可能,是因为你对数据在决策过程中应该如何参与有一个清晰的理解

我们倾向于将数据直接抛给利益相关者,将综合分析的工作留给他们。然而,最优秀的分析师会更进一步,深入探究定性数据,深入理解他们试图实现的目标。他们负责将自己的见解融入决策过程。他们理解目标功能:一个智力诚实的决策。因此,他们以一种寻求达到目标的方式进行操作,而不是仅仅完成要求的任务,随波逐流于利益相关者陷入的数据访问模式中,静静地坐在高管们的会议室里,直到被叫到。

我希望你已经相信我提议的行为改变并没有那么剧烈。我相信你一定听到过那个声音告诉你要更深入地参与——“也许我应该问一下为什么需要这些数据”——但是你决定自己没有时间。好了,下次,听从那个声音吧。

👋 你好!我是罗伯特, Hyperquery 的首席产品官,曾经的数据科学家和分析师。这篇文章最初发布在我的博客 Win With Data上,我们每周讨论如何最大化数据的影响力。像往常一样,可以在 LinkedIn Twitter 找到我——我总是很乐意聊天。如果你喜欢这篇文章,我会很感激你关注/点赞/分享。🙂

偏见如何渗透到 AI 系统中

原文:towardsdatascience.com/how-prejudice-creeps-into-ai-systems-3673646ae8e3?source=collection_archive---------8-----------------------#2023-02-03

AI 偏见实际上源于哪里?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Boris Ruf

·

关注 发布于 Towards Data Science ·4 分钟阅读·2023 年 2 月 3 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 Lucas Benjamin 提供,来源于 Unsplash

一个挑战是,人工智能(AI)系统可能会在算法中嵌入偏见。在 我之前的文章**中,我解释了当 AI 行为异常时发生的内部过程。接下来,我将深入探讨这些偏见实际上来自哪里——以及这些来源如何与传统技术中研究得较多的偏见问题不同。

机器学习(ML)算法识别数据中的模式。它们的主要优势在于能够在训练数据中找到和区分类别,并利用这些洞察对新数据进行预测。

在“大数据”时代,有大量的数据可用,并且变量种类繁多。一般的假设是,数据越多,算法及其预测就会越精确。在使用大量数据时,数据中显然包含了许多相关性。然而,并非所有相关性都意味着因果关系。不论数据集有多大,它仍然只是现实的一个快照。

让我们举个例子:

在一个汽车保险的理赔训练数据集中,红色汽车可能比其他颜色的汽车导致了更多的事故。机器学习算法检测到了这种相关性。然而,并没有科学证据表明汽车颜色与事故风险之间存在因果关系。

单纯为了算法的性能,注意并消除这种不想要的相关性至关重要。否则,算法会有偏见,对新数据的结果可能会很差。在这个例子中,拥有更好算法的竞争对手,如果没有错误地将更高风险归因于红色汽车的驾驶员,就可以为这些客户提供更低的价格,并将他们吸引走。

除了性能方面,还有一个更严重的问题,这种问题出现时预测影响到人们,并且算法偏向于优待特权群体而非非特权群体,从而导致歧视。

需要注意的是,这些不希望出现的歧视可能在没有明确提供敏感个人数据的情况下发生。实际上,其他属性可以隐含地揭示这些信息作为代理。例如,一款汽车型号可以暗示车主的性别,或者邮政编码可能与居民的种族或宗教相关。

它的来源是什么?

偏见问题显然不是新的。即使在人工智能出现之前,已经知道了多种不同形式的偏见,这些偏见可能导致技术系统中出现不必要和意外的结果。例如,自动化偏见是指人们信任自动系统的建议而非人类推理。过去发生过几起严重的飞机事故,因为飞行员信任了自动驾驶仪而不是自己的判断。另一种偏见可能发生在算法被应用于最初未训练的环境中。例如,如果它被应用于不同的地理区域或不同的人群中。

尽管算法中显式编程的规则或其在实践中的使用方式可能产生偏差结果,但这是一个长期存在的问题,也适用于传统的确定性算法。在本文中,我专注于新的偏差来源,这些偏差随着机器学习技术的兴起而变得越来越重要。更具体地说,我讨论了数据中的人为偏差和选择偏差。

人为偏差

第一个自然想到的偏差来源是人为偏差。下面概述了这种类型的偏差的不同类型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

人为偏差的不同来源

训练数据可以包括来自测量设备的客观观察标签。然而,训练数据也可能涉及人为评估。包括人为判断的数据标签可能存在偏见。由于这些标签作为真实标准,算法的表现直接依赖于它们,任何包含的偏差都在模型中大规模复制。因此,基本上,一种经过充分研究的偏差形式在这里进入了新技术中。

选择偏差

另一个不那么明显的偏差来源是数据收集的过程。如果数据未能反映真实的分布,那么使用这些数据进行训练的机器学习算法将会学习并加剧这种偏差。下表列出了可能导致数据选择偏差的不同类型的偏差。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不同来源的选择偏差

那又如何

机器学习算法在创建预测模型时非常依赖于其使用的数据。这些训练数据可能存在偏差,特别是形式上的人为偏差或选择偏差。由于算法容易受到这些影响,并且由于有可能在大规模应用中出现,即使是算法中的微小系统性错误也可能导致加剧的歧视。

特别感谢 Antoine Pietri 在撰写这篇文章时提供的宝贵支持。在 我的下一篇文章中,我将解释为什么删除敏感属性并不是确保 AI 公平性的简单解决方案。

Python 枚举如何使数据配置优雅

原文:towardsdatascience.com/how-python-enumerations-make-data-configuration-elegant-a7d8356657bd

Python 中用于机器学习项目的枚举简介

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Eirik Berge, PhD

·发表于 Towards Data Science ·阅读时间 7 分钟·2023 年 5 月 28 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 Joshua Woroniecki 提供,来源于 Unsplash

你的旅程概述

  1. 简介

  2. 一种天真的方法

  3. 枚举的救援!

  4. 总结

1 — 简介

在机器学习项目中编写 Python 代码时,几乎总是需要配置代码。这段代码跟踪用于配置其他代码组件的信息。虽然这个定义可能对那些不明白的人没有帮助,但几个例子会非常有用:

  • 超参数: 在机器学习中,超参数用于训练多个略有不同的模型。超参数可能是随机森林中的树木数量。另一个例子是 Ridge 或 Lasso 回归的松弛参数。

  • 访问信息: 在连接到数据库或云托管存储账户时,需要访问信息。这包括存储系统的名称、密码以及其他附加属性。类似地,假设你订阅了像 Kafka 或 MQTT 经纪人这样的发布/订阅系统。那么主题名称、密码和端口号就是必要的配置代码。

  • 管道信息: 在构建数据工程管道时,需要配置代码。这可能包括用于拆分测试集和训练集的比例,或用于运行管道的 CRON 表达式。

总之,在某些情况下,配置代码可以帮助访问外部系统,如数据库和发布/订阅系统。在其他情况下,它可以帮助配置内部系统,如机器学习模型和数据工程管道。

将配置代码存储在单独的文件中(如.env.yaml.json格式)通常是有意义的。然而,这些配置代码仍需要在 Python 代码中访问。有许多方法可以在你的 Python 脚本中组织配置代码 😕

在这篇博客文章中,我将向你展示为什么Python 枚举比一些更明显的方法更好。我之前制作了一个关于 Python 枚举的 YouTube 视频。如果你更喜欢视频版本,可以查看那个:

2 — 一个简单的方法

在我们深入了解 Python 枚举如何使配置代码更具可读性之前,先来看一种常用的简单方法。存储配置信息的一种常见方法是使用全局变量。假设你有一个使用[RandomForestClassifier](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html)来自[scikit-learn](https://scikit-learn.org/stable/index.html)的机器学习模型。你想将树的数量存储在一个名为N_ESTIMATORS的全局变量中。这是与RandomForestClassifier所需的参数名称配合使用的。你可以在脚本的顶部定义这个变量:

# Configuration for RandomForestClassifier
N_ESTIMATORS = 100

只有一个配置参数时,这没有问题。然而,让我们引入更多参数:

# Configuration for RandomForestClassifier
N_ESTIMATORS = 100
MAX_DEPTH = 8
N_JOBS = 3

第一个小问题是Python 无法理解这些全局变量之间的关系。它们只是不同的全局变量。因此,除非引入更多代码,否则无法对它们进行迭代或集体执行安全检查。

当你尝试在脚本中使用另一个模型时,会出现更严重的问题。假设你想尝试使用[AdaBoostClassifier](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html)。那么你可能会写:

# Configuration for RandomForestClassifier
N_ESTIMATORS = 100
MAX_DEPTH = 8
N_JOBS = 3

# Configuration for AdaBoostClassifier
N_ESTIMATORS = 50
LEARNING_RATE = 1.0

你看到发生了什么了吗?你不小心覆盖了*N_ESTIMATORS**全局变量!*虽然这里很容易发现,但假设 Python 脚本有 500 行,由其他人编写。也许你会忽略这个问题。Python 可能不会给出任何错误提示。设置N_ESTIMATORS = 50对于RandomForestClassifier并不会导致语法错误 😧

你如何解决这个问题?你可以引入一个延长的名称来表示N_ESTIMATORS全局变量属于哪个模型:

# Configuration for RandomForestClassifier
N_ESTIMATORS_RANDOM_FOREST_CLASSIFIER = 100
MAX_DEPTH = 8
N_JOBS = 3

# Configuration for AdaBoostClassifier
N_ESTIMATORS_ADA_BOOST_CLASSIFIER = 50
LEARNING_RATE = 1.0

现在看起来LEARNING_RATE全局变量与AdaBoostClassifier不再相关。那么,不妨为所有变量添加后缀以避免混淆:

# Configuration for RandomForestClassifier
N_ESTIMATORS_RANDOM_FOREST_CLASSIFIER = 100
MAX_DEPTH_RANDOM_FOREST_CLASSIFIER = 8
N_JOBS_RANDOM_FOREST_CLASSIFIER = 3

# Configuration for AdaBoostClassifier
N_ESTIMATORS_ADA_BOOST_CLASSIFIER = 50
LEARNING_RATE_ADA_BOOST_CLASSIFIER = 1.0

除了变量名过长,你会开始看到配置代码中遇到的细微问题。这些问题很快会造成难以理解的错误,最糟糕的情况下是难以理解的错误,最好的情况下是糟糕的变量名。

对于数据库调用,通常在一个脚本中调用多个数据库也是很常见的。你真的想要以像 *PRODUCTION_DATABASE_INGESTION_ACCESS_KEY* 这样的变量名结束吗?

是否有更好的方法来处理 Python 中的配置代码?

3 — 枚举来拯救!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Zac Durant 拍摄的照片,来自 Unsplash

Python 枚举 提供了一种更优雅的解决方案来存储配置信息。枚举(枚举的缩写)本质上是一种定义命名常量集合的方式。快速理解枚举的最佳方式是调整前一节的机器学习配置代码。你之前的代码是:

# Configuration for RandomForestClassifier
N_ESTIMATORS_RANDOM_FOREST_CLASSIFIER = 100
MAX_DEPTH_RANDOM_FOREST_CLASSIFIER = 8
N_JOBS_RANDOM_FOREST_CLASSIFIER = 3

# Configuration for AdaBoostClassifier
N_ESTIMATORS_ADA_BOOST_CLASSIFIER = 50
LEARNING_RATE_ADA_BOOST_CLASSIFIER = 1.0

现在可以这样写:

from enum import Enum

class RandomForest(Enum):
  """An Enum for tracking the configuration of random forest classifiers."""
  N_ESTIMATORS = 100
  MAX_DEPTH = 8
  N_JOBS = 3

class AdaBoost(Enum):
  """An Enum for tracking the configuration of Ada boost classifiers."""
  N_ESTIMATORS = 50
  LEARNING_RATE = 1.0

一些优点

让我们快速看看 Python 枚举给我们带来了什么优势:

  • 每个参数(例如,MAX_DEPTH)现在按层次结构存储在它们所使用的模型中。这确保了在引入更多配置代码时不会被覆盖。因此,也不需要过长的变量名。

  • RandomForestClassifier 中使用的不同参数现在被分组到 RandomForest 枚举中。因此,它们可以被迭代,并且可以集体分析以确保类型安全。

  • 由于枚举是类,它们可以像我上面所示那样拥有文档字符串。虽然对于这个示例来说可能不严格需要,但在其他示例中,这可能会澄清枚举所指的内容。将其作为与类相关联的文档字符串,而不是自由流动的注释,效果要好得多。一方面,自动文档生成软件现在会检测到文档字符串属于枚举。对于自由流动的注释,这可能会被忽略。

如果你现在想在脚本中进一步访问配置代码,可以简单地写:

from sklearn.ensemble import RandomForestClassifier

RandomForestClassifier(
  n_estimators=RandomForest.N_ESTIMATORS.value,
  max_depth=RandomForest.MAX_DEPTH.value,
  n_jobs=RandomForest.N_JOBS.value
)

这看起来很干净,易于阅读 😍

一些 Python 枚举的功能

让我们通过查看这个玩具示例来说明 Python 枚举的一些简单功能:

from enum import Enum
class HTTPStatusCodes(Enum):
    """An Enum that keeps track of status codes for HTTP(s) requests."""
    OK = 200
    CREATED = 201
    BAD_REQUEST = 400
    NOT_FOUND = 404
    SERVER_ERROR = 500

显然,枚举中的信息是相关的;它们都关于 HTTP(s) 状态码。鉴于此,你现在可以使用以下简单代码来提取名称和值:

print(HTTPStatusCodes.OK.name)
>>> OK

print(HTTPStatusCodes.OK.value)
>>> 200

Python 枚举还允许你向后查找:给定状态码值为 404,你可以通过简单地写来找到状态码名称:

print(HTTPStatusCodes(200).name)
>>> OK

你可以通过例如使用列表构造函数 list() 来集体处理枚举中的名称/值对:

print(list(HTTPStatusCodes))
>>> [
  <HTTPStatusCodes.OK: 200>, 
  <HTTPStatusCodes.CREATED: 201>, 
  <HTTPStatusCodes.BAD_REQUEST: 400>, 
  <HTTPStatusCodes.NOT_FOUND: 404>,
  <HTTPStatusCodes.SERVER_ERROR: 500>
]

最后,你可以在 Python 中对枚举进行序列化和反序列化。为此,只需像使用 Python 中的其他熟悉对象一样使用 pickle 模块:

from pickle import dumps, loads
print(HTTPStatusCodes is loads(dumps(HTTPStatusCodes)))
>>> True

这对于机器学习模型的配置代码尤为重要。在这种情况下,也有像 MLflow 这样的知名库可以优雅地为你保存配置代码。

敏感配置代码

使用敏感配置代码(如密码或访问密钥)时,你绝不应该在代码中明文书写它们。它们应该存放在一个被版本控制系统忽略的单独文件中,并导入到脚本中。

这并不意味着它们不能存储在代码中的枚举(Enums)里。枚举是关于组织的,即使是被审查过的信息也可以被组织。例如,这里有一个表示连接到Microsoft Azure 存储账户的枚举:

from enum import Enum
import os

class StorageAccount(Enum):
  ACCOUNT_NAME = "my account name"
  ACCESS_KEY = os.environ.get('ACCESS_KEY')
  CONTAINER_NAME = "my container name"

在这里,StorageAccount枚举从环境变量中获取ACCESS_KEY。这可以设置在例如.env文件中。请注意,在 Python 脚本中没有泄露敏感信息。然而,所有关于存储账户的信息都被整齐地组织成一个枚举。

4— 总结

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由Spencer Bergen拍摄,Unsplash

在这篇博客文章中,我们已经看到 Python 枚举如何使配置代码变得易读、自我文档化,并且减少错误。如果你想了解更多关于枚举的内容,我推荐官方的Enum HOWTO 指南和博客文章用 Python 的 Enum 构建常量枚举

如果你对数据科学、编程或两者之间的任何内容感兴趣,可以随时在LinkedIn上添加我,并打个招呼✋

喜欢我的写作吗? 查看我其他的一些帖子,获取更多 Python 内容:

  • 用漂亮的类型提示现代化你的罪恶 Python 代码

  • 在 Python 中可视化缺失值是令人震惊的简单

  • 用 PyOD 在 Python 中引入异常/离群点检测 🔥

  • 5 个超棒的 NumPy 函数,能在关键时刻救你一命

  • 5 个专家技巧,让你的 Python 字典技能飞跃 🚀

内容概要:本文将金属腐蚀现象比作游戏角色受到持续伤害(debuff),并采用浓度迁移和损伤方程来建模这一过程。文中首先介绍了浓度迁移的概念,将其比喻为游戏中使角色持续掉血的毒雾效果,并展示了如何利用Numpy矩阵存储浓度场以及通过卷积操作实现浓度扩散。接着引入了损伤方程,用于评估材料随时间累积的损伤程度,同时考虑到材料自身的抗性特性。作者还提供了完整的Python代码示例,演示了如何在一个二维网格环境中模拟24小时内金属表面发生的腐蚀变化,最终得到类似珊瑚状分形结构的腐蚀形态。此外,文章提到可以通过调整模型参数如腐蚀速率、材料抗性等,使得模拟更加贴近实际情况。 适合人群:对材料科学、物理化学感兴趣的科研工作者和技术爱好者,尤其是那些希望通过编程手段深入理解金属腐蚀机制的人群。 使用场景及目标:适用于希望借助数值模拟方法研究金属腐蚀行为的研究人员;可用于教学目的,帮助学生更好地掌握相关理论知识;也可作为工程项目前期评估工具,预测不同条件下金属构件可能遭受的腐蚀损害。 阅读建议:由于文中涉及较多数学公式和编程细节,建议读者具备一定的Python编程基础以及对线性代数有一定了解。对于想要进一步探索该领域的学者来说,可以尝试修改现有代码中的参数设置或者扩展模型维度,从而获得更丰富的研究成果。
基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目),个人经导师指导并认可通过的高分设计项目,评审分98分,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!主要针对计算机相关专业的正在做大作业、毕业设计的学生和需要项目实战练习的学习者,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值