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

原文:TowardsDataScience

协议:CC BY-NC-SA 4.0

从商业学生到 Spotify 的数据科学家

原文:towardsdatascience.com/from-business-student-to-data-scientist-in-tech-eb7bbaab1784

数据科学家在科技行业的初年历程

从对数学感到害怕到成为著名科技公司全职数据科学家的时间线

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

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

在我经常收到的 LinkedIn 上最常见的问题中,有一个问题始终突出:

我如何一夜之间从商业转到工程,并成为数据科学家的?

在这个故事中,我将深入讲述我的个人历程,并与大家分享我所遵循的步骤、面临的挑战和获得的宝贵经验,这些都推动我直接成为了科技行业的数据科学家。

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

图片来源:Carolyn ChristineUnsplash

成为数据科学家没有一种特定的方式。正如俗话所说,条条大路通罗马。然而,我在这里分享 其中 一种方法,特别是对于那些从商业学位背景开始并且几乎没有科学背景的人。

在就业市场上,前景模糊,知道你想成为哪种类型的数据科学家将影响你需要具备的技能。

你在外面常见的数据科学家的最常见原型有:

1. 数据/决策科学家: 利用数据生成洞察和价值,以推动决策。通常需要了解机器学习。

2. 研究数据科学家: 作为产品开发机器学习模型。强大的数学背景是高度要求的。这通常是科技领域博士们的角色(但不限于此)。

3. 数据科学家/机器学习工程师: 这是一个处于决策和研究数据科学家交汇处的角色。

在我的文章中,我将主要关注我成为科技领域数据/决策科学家的旅程,在我的经验中,这似乎是最主要的数据科学家类型。

为什么

在深入探讨 如何 之前,我们首先需要奠定 为什么 的基础。相信我,如果你从一开始就没有把 为什么 理清楚,你不会走得太远。

成为数据科学家的旅程是充满挑战的,但无疑也是最值得的之一。事实上,数据科学家今天有着最酷、最令人羡慕的工作之一的理由清单很长。现在,我将重点关注在 的清单上排名第一的那个。

对于任何问我 为什么选择数据科学? 的人,无论是在面试中还是好奇的朋友,我的回答总是一样的。我想成为一名侦探,所以我决定成为一名数据科学家。

你可能会想这两者之间有什么关系?

我遇到的第一批数据科学家立刻让我觉得他们体现了现代福尔摩斯的形象。

数据科学家每天通过知识来解决难题。最终,他们花费大部分时间在调查数字,以找到只有敏锐的分析思维才能解决的复杂问题。这正是侦探所做的。

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

有时我对自己的想法 — 照片由 Alexey TurenkovUnsplash 上拍摄

我一直感到对 福尔摩斯 冒险故事的深切兴奋。他不顾一切地追踪线索,直到谜团被揭开。我想成为像他一样的冒险家。但我几乎没想到自己会放弃学业去与警察一起破案。我想这对我来说有点过于极端,我有点希望不要在生命早期就与坏人对抗。所以,成为数据科学家感觉像是两全其美。

只是需要一些时间来触发那个顿悟。到那时,成为数据科学家感觉与我当时追求的商业学位有很大的距离。

回顾过去,我与福尔摩斯唯一的共同点就是我对看似不可能的任务的执着。这些任务非常脱离现实,考虑到我对编程几乎没有任何经验。但我没想到的是,接受这种跳跃的信念竟然成了我追求生命中最大激情——音乐的金钥匙。

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

图片来源:作者(Midjourney)

如何

第 1 步 — 面对并接受数学怪物

尽管我对科学有着长期的迷恋,但上帝还没有认为我配得上轻松解读科学术语的高度独特的礼物。我也没有天赋音准,但这与此无关。

所以,不管怎样,毕业后,我自然地趋向于这个世界上大多数对科学科目一无所知的高中生所选择的——商业学科。

我与数学的关系一直颇为波折。我在高中时主修经济学。物理让我感觉像是在平行宇宙中,数学概念听起来像是外星文明的秘密代码。课程需要时间才能理解,但… 它们迟早会理解。有时,可能会晚得多。

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

图片来源:作者(Midjourney)

我很早就知道,数学在我的包袱中将会派上用场。因此,我不会让我的科学不足阻止我超越自己的能力去追求梦想。

在高中最后一年,我决定彻底面对数学怪兽。我把所有精力投入到驯服这个怪兽上,直到它最终屈服。

这是一个改变游戏规则的时刻。

这给了我必要的信心,后来在大学期间可以同时主修商业和辅修数学。

在我追求的所有数学课程中,这些是为解决数据科学和机器学习问题奠定基础的基本课程:

  1. 微积分

  2. 线性代数

  3. 统计与概率论

对于所有数学恐惧者来说,请记住,我们之所以讨厌某件事,往往是因为我们在其中表现不佳。我们越早提高和精通一门学科,我们的看法就会改变得越多。

所以,如果你的目标是成为一名厉害的数据科学家,是时候正面迎接数学怪兽,告诉他谁才是老板了!

商业显然不是我的真正召唤。我太享受被数学怪兽的诱惑折磨了。所以在我最后一个学期,我深入探索了与数学相关的职业道路。

最终,我的搜索将我引向了数据科学领域。我抓住了一个作为数据分析师实习的机会,同时进入了 NYU 的城市信息学硕士课程(这是智能城市领域应用数据科学的花哨说法)。

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

这是漫长系列中的第一个里程碑

第 2 步——建立对编程的直觉需要时间

你可能会想,一个没有任何编程经验的商业毕业生是如何成功进入工程学校的?嗯,还记得我在本科时上的那些数学课程吗?

事实上,你开始进行机器学习(ML)不需要超出这三门课程的知识。

NYU 的学位是一个沉浸式但紧张的 12 个月课程,我从一开始就直接投入到使用 Python 进行 ML 建模、用 SQL 构建数据库在 Spark 上处理大数据(或者至少尝试)中。

我必须在这里坦白。从商业到工程的突然转变是一段忙碌的经历。那一年几乎感觉像是一场濒临死亡的经历。

第一次学习多种编程语言意味着要培养对每一种语言的不同直觉,这需要时间。在一个紧凑的时间框架内同时掌握所有这些语言,并承担高昂的学费(还有门口的疫情),这并不是我会建议胆小者尝试的。

对于一个在此之前从未写过一行代码的人来说,这感觉就像是对我的大脑造成了巨大的冲击波,完全超负荷。可怜的大脑不知道我们是如何从管理原则一下子转到全力运行机器学习模型的。

事后看来,我会做得不同的一件事是:在深入机器学习之前就学习编码,而不是同时进行。

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

作者提供的图片(Midjourney)

玩弄机器学习很有趣,但远远不够。我仍未完全理解那些 Python 包背后的运作机制。

除非你能够深入挖掘,否则你永远不会被视为科技行业的真正数据科学家。 你必须熟练解释那些预打包的机器学习算法背后的基本机制。

所以我知道我必须理解这些机制,但从那么远的地方过来,一年时间能达到的也有限。

那时候,COVID-19 爆发了,美国的工作机会就像我之前的编码技能一样几乎不存在。所以我想,我可以在学术界多待一年(或者两年)。我申请并被录取到法国的一个独特双学位项目,该项目结合了数据科学的两个最佳领域:商业与机器学习。

第三步——从库导入器到解释者:释放内在的真正数据科学家

追求这个学位结果证明是我一生中最好的决定之一。它让我在法国顶尖的商业与工程学院学习,这曾经是不可想象的成就。

我在学校从未是最聪明的,但我总是有一种在最艰难的道路上找到出路的天赋。决心和固执是我最重要的资产,所以我早早地将它们发挥到极致。

在这两年转型的过程中,我学到了许多自己甚至不知道需要学习的数据科学知识。我在这过程中获得的武器至今仍在指导我,我在这里与你分享:

  1. 理解机器学习算法背后的数学将专业人士与 Python 库用户区分开来。 我学会了如何展示数学证明,但我相信掌握理论背后的关键概念就足够了。无需直接处理方程式本身。

  2. 精通 Python 和 SQL 是“数据科学技术”入门包中的基本技能。 提取和构建数据管道需要停留在像 BigQuery 这样的数据仓库上,而这些数据仓库通常由 SQL 支持。同时,掌握 Python 基础将帮助你进行数据准备和分析。

  3. 你需要学习线性代数和微积分来帮助你理解机器学习理论的基础,但没有什么能比得上将统计学和概率论概念纳入你的工具箱。 统计学在数据科学家的日常工作中有直接应用,因此最好尽早掌握统计显著性概率分布的基础知识。

  4. 如果你不能将数据洞察传达给非技术人员,那它们将毫无价值。 提升你的讲故事技巧是数据科学家的持续旅程,因此最好尽早上船。

  5. 培养在与聪明才智和经验丰富的同行共事时的韧性和耐心。 冒名顶替综合症很容易出现,特别是当你来自不同背景时。自我怀疑是个讨厌的家伙,所以最好尽早熟悉它并摆脱它。

从很远的地方开始,我花了两年的训练才敢于称自己为数据科学家。

我的个人故事并不是成为数据科学家的绝对指南,因为每个人的旅程都是独特的。相反,它是实现这一目标的各种方式之一的见证。我希望我的经验能够激励你,引导你在自己的冒险中前行。

通过接受这些经验教训,我作为数据科学家的水平提升了。它们为我提供了启动科技职业所需的工具。

最优秀的程序员不一定是最优秀的数据科学家。要在技术领域中作为数据科学家蓬勃发展,来自商业背景的我学到了一些必须具备的条件:

  1. 接受数学的不适。 掌握线性代数、微积分和统计学与概率论的基础知识。

  2. 花时间彻底学习 Python 和 SQL。 避免让自己被过多的编程框架压垮。

  3. 深入研究机器学习的数学基础,以揭示预包装算法的奥秘。 准备好解释它们的机制。

  4. 从一开始就磨练你的讲故事技巧。 掌握以引人入胜和易于理解的方式传达复杂概念的艺术。

  5. 将商业概念与之前获得的知识相结合,创造出强大的组合。

过去,我低估了自己商业学士学位的价值。它常常让我觉得自己花了多年时间追寻错误的道路。

但在加入 Spotify 后,我发现商业与数据科学专长的融合创造了最优秀的数据科学家。真正的力量在于那些能够无缝导航两个领域的人。你完全有理由成为其中之一!

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

成为紫色的体验真是刺激无比

我有礼物要送给你🎁!

订阅我的新闻通讯 K’s DataLadder,你将自动获得我的终极 SQL 备忘单,其中包含我在大科技公司工作中每天使用的所有查询,以及另一个秘密礼物!

我每周分享作为技术数据科学家的经历,以及实用的技巧、技能和故事,旨在帮助你提升自我——因为没有人真正知道,直到他们亲身经历!

如果你还没有做这件事

再见啦!

从因果树到森林

原文:towardsdatascience.com/from-causal-trees-to-forests-43c4536f1481

因果数据科学

如何使用随机森林进行政策定位

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

·发表于 Towards Data Science ·13 分钟阅读·2023 年 2 月 20 日

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

封面,图片由作者提供

在我之前的博客文章中,我们已经探讨了如何使用因果树来估计政策的异质性处理效应。如果你还没有阅读,我建议先阅读那篇文章,因为我们将以那篇文章的内容为基础,从那里开始。

为什么要关注异质性处理效应(HTE)?首先,异质性处理效应的估计使我们能够选择哪些用户(患者、用户、客户等)接受治疗(药物、广告、产品等),这取决于他们预期的结果(疾病、公司收入、客户满意度等)。换句话说,估计 HTE 使我们能够进行定位。实际上,正如我们在文章后面将看到的,一个治疗在平均情况下可能无效或甚至适得其反,但对某一子集的用户却带来积极的效果。相反的情况也可能成立:一种药物在平均情况下有效,但如果我们识别出有副作用的用户,其效果可能会得到改善。

在这篇文章中,我们将深入探讨因果树的扩展:因果森林。正如随机森林通过平均多个自助抽样的树来扩展回归树一样,因果森林扩展了因果树。主要的不同之处在于推断的角度,这并不那么直接。我们还将了解如何比较不同的 HTE 估计算法的输出,并如何将它们用于政策定位

在线折扣

在文章的其余部分,我们继续使用因果树文章中的玩具示例:我们假设我们是一个在线商店,并且我们希望了解是否向新客户提供折扣会增加他们在商店中的支出。

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

图片,由作者使用NightCafé生成

为了了解折扣是否具有成本效益,我们进行了一项随机实验或A/B 测试:每当新客户浏览我们的在线商店时,我们会随机分配其到一个处理条件。对于处理用户,我们提供折扣;对于对照用户,则不提供。我从[src.dgp](https://github.com/matteocourthoud/Blog-Posts/blob/main/notebooks/src/dgp.py)导入数据生成过程dgp_online_discounts()。我还从[src.utils](https://github.com/matteocourthoud/Blog-Posts/blob/main/notebooks/src/utils.py)导入了一些绘图函数和库。为了包含代码、数据和表格,我使用了Deepnote,这是一个类似 Jupyter 的基于网页的协作笔记本环境。

我们有关于 100,000 名在线商店访客的数据,我们观察他们访问网站的时间、使用的设备、他们的浏览器和他们的地理区域。我们还看到他们是否获得了折扣(我们的处理)以及他们的支出(我们关注的结果)。

由于处理是随机分配的,我们可以使用简单的均值差异估计量来估计处理效果。我们预计处理组和对照组在除折扣之外是相似的,因此我们可以将支出中的任何差异归因于折扣

折扣似乎是有效的:在处理组中,平均支出增加了 1.95 美元。但是所有客户的影响是否相同?

为了回答这个问题,我们希望估计异质性处理效果,可能是在个体层面上。

因果森林

计算异质性处理效果有很多不同的选项。最简单的一种方法是将关注的结果与异质性维度交互。这个方法的问题在于选择哪个变量。有时我们有先验信息可以指导我们的行动;例如,我们可能知道移动用户的平均支出高于桌面用户。其他时候,我们可能出于商业原因对某个维度感兴趣;例如,我们可能希望在某个区域投资更多。然而,当我们没有额外信息时,我们希望这个过程是数据驱动的。

上一篇文章中,我们探讨了一种数据驱动的方法来估计异质治疗效果:因果树。我们将扩展到因果森林。然而,在开始之前,我们必须介绍一下它的非因果兄弟:随机森林。

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

图片,由作者使用NightCafé生成

随机森林,顾名思义,是回归树的扩展,在其基础上增加了两个独立的随机性来源。具体而言,随机森林算法利用许多不同回归树的预测结果,每棵回归树都是在数据的自助样本上训练的,并将这些预测结果进行平均。这一过程通常被称为袋装法,自助聚合,并可以应用于任何预测算法,并非随机森林所特有。额外的随机性来源来自于特征选择,因为在每次分裂时,只考虑所有特征X的随机子集进行最优分裂。

这两个额外的随机性来源极为重要,有助于随机森林的优越性能。首先,袋装法使随机森林通过对多个离散预测进行平均,产生更平滑的预测。随机特征选择则允许随机森林更深入地探索特征空间,使其能发现比简单回归树更多的交互作用。事实上,变量之间可能存在单独来看预测能力不强(因此不会产生分裂),但一起来看却非常强大的交互作用。

因果森林是随机森林的等效方法,但用于估计异质治疗效果,正如因果树和回归树一样。与因果树一样,我们面临一个基本问题:我们感兴趣的是预测一个我们无法观察到的对象:个体治疗效果τᵢ。解决方案是创建一个辅助结果变量*Y**,其对每个观测值的期望值恰好就是治疗效果。

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

辅助结果变量,由作者提供的图片

如果你想了解更多关于为什么这个变量对个体治疗效果是无偏的细节,可以查看我的上一篇文章,在其中我会详细讲解。简而言之,你可以将*Yᵢ**解释为单个观测值的均值差异估计量。

一旦我们有了结果变量,还有几件事需要做,以便使用随机森林来估计异质性处理效果。首先,我们需要构建在每个叶子中有相同数量的处理和对照单位的树。其次,我们需要使用不同的样本来构建和评估树,即计算每个叶子的平均结果。这个过程通常被称为诚实树,它对于推断非常有帮助,因为我们可以将每个叶子的样本视为与树结构独立。

在进入估计之前,我们首先为分类变量devicebrowserregion生成虚拟变量。

我们现在可以使用随机森林算法来估计异质性处理效果。幸运的是,我们不需要手动完成所有这些操作,微软的EconML包中有一个很好的因果树和森林实现。我们将使用CausalForestDML函数。

与因果树不同,因果森林更难解释,因为我们不能可视化每一棵树。我们可以使用SingleTreeCateInterpreter函数来绘制因果森林算法的等效表示。

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

因果森林模型表示,作者提供的图像

我们可以像解释因果树模型一样解释树状图。在顶部,我们可以看到数据中的平均 Y ∗ Y^* Y,1.917 。从那里开始,数据根据每个节点顶部突出显示的规则被分成不同的分支。例如,第一个节点根据 ‘ t i m e ‘ 是否晚于 11.295 。从那里开始,数据根据每个节点顶部突出显示的规则被分成不同的分支。例如,第一个节点根据`time`是否晚于 11.295 。从那里开始,数据根据每个节点顶部突出显示的规则被分成不同的分支。例如,第一个节点根据time是否晚于11.295将数据分成两个组,分别为 46,878 和 53 , 122 和 53,122 53,122。在底部,我们有最终的分区及预测值。例如,最左侧的叶子包含 40,191 的观察,其中 ‘ t i m e ‘ 早于 11.295 的观察,其中`time`早于 11.295 的观察,其中time早于11.295browser非 Safari,我们预测支出为 0.264$。节点颜色越深表示预测值越高。

这个表示的问题在于,与因果树的情况不同,它只是模型的一个解释。由于因果森林由许多自助抽样树组成,因此无法直接检查每棵决策树。理解哪个特征在决定树的分裂时最重要的一种方法是所谓的特征重要性

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

显然,time是异质性的第一个维度,其次是device(特别是移动设备)和browser(特别是 Safari)。其他维度不太重要。

现在让我们检查模型性能。

性能

通常,我们无法直接评估模型性能,因为与标准机器学习设置不同,我们无法观察到真实情况。因此,我们不能使用测试集来计算模型的准确性度量。然而,在我们的案例中,我们控制数据生成过程,因此可以访问真实情况。让我们从分析模型如何沿数据的分类 维度(如devicebrowserregion)估计异质处理效果开始。

对于每个分类变量,我们绘制了实际和估计的平均处理效果。

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

每个分类值的真实和估计的处理效果,图片由作者提供

因果森林算法在预测与分类变量相关的处理效果方面非常有效。至于因果树,由于算法具有非常离散的特性,这种情况是预期中的。然而,与因果树不同的是,预测结果更为细致。

我们现在可以进行更相关的测试:算法在处理连续变量如time时表现如何?首先,让我们再次隔离time上的预测处理效果,忽略其他协变量。

现在我们可以复制之前的图,但应用于time维度。我们绘制了每天每个时段的真实和估计的处理效果的平均值。

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

随时间维度的真实和估计的处理效果,图片由作者提供

我们现在可以完全理解因果树和森林之间的差异:在因果树的情况下,估计结果基本上是非常粗略的阶跃函数,而我们现在可以看到因果森林如何产生更平滑的估计

我们现在已经探索了模型,是时候使用它了!

政策目标定位

假设我们考虑向访问我们在线商店的新客户提供 4$的折扣。

折扣对哪些客户有效?我们估计了 1.9492$的平均处理效果,这意味着折扣在平均情况下并不真的有利可图。然而,我们现在能够针对单个个体,只对来访客户的子集提供折扣。我们将探讨如何进行政策目标定位,并为了更好地理解定位的质量,我们将使用因果树模型作为参考点。

我们使用相同的CausalForestDML函数构建一个因果树,但将估算器数量和森林大小限制为 1。

接下来,我们将数据集拆分为训练集和测试集。这个想法与交叉验证非常相似:我们使用训练集来训练模型——在我们的例子中是用于异质处理效应的估计器——并使用测试集来评估其质量。主要区别在于我们无法在测试数据集中观察到真实结果。但我们仍然可以使用训练-测试拆分来比较样本内预测与样本外预测。

我们将 80%的所有观察值放入训练集中,将 20%放入测试集中。

首先,让我们只在训练样本上重新训练模型。

现在我们可以决定一个目标政策,即决定向哪些客户提供折扣。答案似乎很简单:我们向所有我们预计治疗效应大于成本 4 美元的客户提供折扣。

一个允许我们理解处理效果及其方式的可视化工具是所谓的**处理操作特征(TOC)**曲线。这个名字让人联想到更著名的接收者操作特征(ROC)曲线,该曲线绘制了不同阈值下的真正例率与假正例率。其想法类似:我们绘制不同处理人口份额下的平均处理效应。在一个极端情况下,当所有客户都被处理时,曲线取值等于平均处理效应,而在另一个极端情况下,当仅一个客户被处理时,曲线取值等于最大处理效应。

现在让我们计算曲线。

现在我们可以绘制两个 CATE 估计器的处理操作特征曲线。

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

处理操作特征曲线,图像由作者提供

正如预期的那样,由于我们增加了处理客户的比例,TOC 曲线对于两个估计器都是递减的。换句话说,我们在释放折扣时越有选择性,每个客户的优惠效果越高。我还绘制了一条与折扣成本水平相同的水平线,以便我们可以将 TOC 曲线下方且成本线以上的阴影区域解释为预期利润

这两个算法预测的处理份额相似,约为 20%,其中因果森林算法针对的客户稍多。然而,它们预测的利润却大相径庭。因果树算法预测了一个小且恒定的利润差距,而因果森林算法预测了一个更大且更陡的利润差距。哪个算法更准确?

为了比较这两者,我们可以在测试集上进行评估。我们使用在训练集上训练的模型来预测处理效应,并与在测试集上训练的模型的预测结果进行比较。请注意,与机器学习标准测试程序不同的是,在我们的案例中,我们无法将预测结果与真实值进行评估,因为处理效应没有被观测到。我们只能相互比较两个预测结果。

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

看起来因果树模型比因果森林模型表现更好,总净效应为 8,386 ,而因果森林为 4 , 948 ,而因果森林为 4,948 ,而因果森林为4,948。从图中我们还可以理解差异的来源。因果森林算法趋向于更为严格,并且处理的客户较少,虽然没有假阳性,但也有很多假阴性。另一方面,因果树算法则更为宽松,将折扣分发给更多的新客户。这导致了更多的真正阳性,但也有假阳性。净效应似乎偏向于因果树算法。

通常情况下,我们会在这里停止,因为我们不能做更多的事情。然而,在我们的案例中,我们可以访问真实数据生成过程。因此,我们可以检查这两种算法的真实准确性。

首先,让我们从处理效应的预测误差方面进行比较。对于每种算法,我们计算处理效应的均方误差

随机森林模型更好地预测了平均处理效应,其均方误差为 0.5555 ,而不是 0.9035 ,而不是 0.9035 ,而不是0.9035

这是否意味着更好的目标定位?我们现在可以重复之前的条形图,以了解这两种算法在政策定位方面的表现。

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

图形非常相似,但结果差异很大。实际上,因果森林算法现在的总效应为 10,395 ,而因果树算法为 8 , 828 ,而因果树算法为 8,828 ,而因果树算法为8,828。为何会有这种突如其来的差异?

为了更好地理解差异的来源,让我们根据真实情况绘制 TOC 图。

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

处理操作特征曲线,图片由作者提供

正如我们所见,TOC 非常偏斜,并且存在一些具有非常高平均处理效应的客户。随机森林算法更能识别这些客户,因此总体上更有效,尽管其目标客户较少。

结论

在这篇文章中,我们看到了一种用于估计异质性处理效应的非常强大的算法:因果森林。因果森林建立在因果树的相同原理基础上,但受益于对参数空间的更深入探索和袋装方法。

我们还看到了如何利用异质治疗效应的估计来进行政策定位。通过识别具有最高治疗效应的用户,我们能够使本来无法获利的政策变得有利可图。我们还看到,政策定位的目标可能与异质治疗效应估计的目标不同,因为分布的尾部可能比平均值更相关。

参考文献

相关文章

  • DAGs 和控制变量

  • 匹配、加权还是回归?

  • 理解元学习器

  • 理解 AIPW,双重稳健估计量

  • 理解因果树

代码

你可以在这里找到原始 Jupyter Notebook:

github.com/matteocourthoud/Blog-Posts/blob/main/notebooks/causal_forests.ipynb

感谢阅读!

我非常感激! 🤗 如果你喜欢这篇文章并希望看到更多,请考虑 关注我。我每周发布一次关于因果推断和数据分析的内容。我尽量使我的帖子既简单又准确,始终提供代码、示例和模拟。

另外, 免责声明*: 我写作是为了学习,因此错误是常有的事,尽管我尽力而为。如果你发现错误,请告诉我。我也欢迎对新话题的建议!*

从集中式学习到联邦学习

原文:towardsdatascience.com/from-centralized-to-federated-learning-b0074793e9f?source=collection_archive---------9-----------------------#2023-03-16

关于在 CIFAR 基准数据集上进行联邦学习的数据集分布技术总结

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

·

关注 发表在 Towards Data Science ·9 min read·Mar 16, 2023

联邦学习 (FL) 是一种在分布式环境下训练机器学习(ML)模型的方法 [1]。其理念是客户端(例如医院)希望在不共享其私密和敏感数据的情况下合作。每个客户端在 FL 中保留其私有数据,并在这些数据上训练 ML 模型。然后,中央服务器收集并聚合模型参数,从而基于所有数据分布的信息构建一个全球模型。理想情况下,这作为设计上的隐私保护

已经进行了大量研究以理解 FL 的效率、隐私和公平性。在这里,我们将重点关注用于评估水平 FL 方法的基准数据集,其中客户端共享相同的任务和数据类型,但他们拥有各自的数据样本。

如果你想了解更多关于联邦学习及我所做的工作,请访问我们的研究实验室网站!

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

照片由JJ Ying拍摄,来源于Unsplash

文献中有三种类型的数据集:

  1. 真实的 FL 场景:FL 是一种需要的方法的应用场景。它具有自然分布和敏感数据。然而,考虑到 FL 的性质,如果你想将数据保存在本地,你不会将数据集在线发布以进行基准测试。因此,很难找到这种类型的数据集。OpenMined 背后的 PySyft 试图组织一个 FL 社区,由大学和研究实验室主办数据,以更现实的场景进行数据托管。此外,最近隐私意识有所提高的应用场景也存在。因此,可能会有公开的数据,而 FL 的需求依然存在。一个应用场景是智能电表[2]。

  2. FL 基准数据集:这些数据集设计用于作为 FL 基准。分布是现实的,但数据的敏感性存在疑问,因为它们是从公开来源构建的。例如,从 Reddit 帖子中创建 FL 数据集,使用用户作为客户端,并将其分发给一个用户作为一个分区。LEAF 项目提出了更多类似的数据集[3]。

  3. 分发标准数据集:有一些众所周知的数据集,如 CIFAR 和 ImageNet,作为图像的例子,在许多机器学习工作中用作基准。在这里,FL 科学家根据他们的研究问题定义一个分布。如果主题在标准机器学习场景中研究得很透彻,并且希望将其 FL 算法与集中式 SOTA 进行比较,那么使用这种方法是有意义的。然而,这种人工分布并没有揭示分布偏斜的所有问题。例如,客户端收集的图像可能来自不同的相机或不同的光照条件。

由于最后一种类别不是设计上分布的,过去的研究将其分为几种方式。在接下来的内容中,我将总结在联邦场景中用于 CIFAR 数据集的分发技术。

CIFAR 数据集

CIFAR-10 和 CIFAR-100 数据集 包含 32x32 的彩色图像,并标记为互斥的类别 [4]。CIFAR-10 有 10 个类别,每个类别 6000 张图像,而 CIFAR-100 有 100 个类别,每个类别 600 张图像。它们在许多图像分类任务中使用,可以访问到基于这些数据集评估的数十个模型,甚至可以通过 PapersWithCode 的排行榜 浏览它们。

联邦学习中的数据划分

均匀分布

这被认为是 同分布且独立(IID)数据。数据点随机分配给客户端。

单类(n-)客户端

分配给特定客户端的数据点来自相同的类别或类别。这可以被认为是极端非独立同分布(non-IID)设置。这种分布的例子见 [1,5–8]。首先将这种设置命名为联邦学习 [1] 的工作使用了 200 个单类数据集,并给每个客户端两个数据集,使其成为 2 类客户端。[5–7] 使用 2 类客户端。

[9] 基于 CIFAR-100 中的层级类:客户端的数据点来自每个超级类中的一个子类。这样,在超级类的分类任务中,客户端拥有来自每个(超级)类的样本,但由于数据点来自不同的子类,因此模拟了分布偏斜。例如,一个客户端访问狮子的图像,而另一个客户端访问老虎的图像,超级类任务是将两者归类为大型食肉动物。

主导类别客户端

[5] 也使用了均匀和 2 类客户端的混合,这意味着一半的数据点来自 2 个主要类别,其余的数据点均匀地从其他类别中选择。[10] 使用 80%-20% 的划分,80% 来自单一主导类别,其余的从其他类别中均匀选择。

Dirichlet 分布

要了解 Dirichlet 分布,我参考了 这篇博客文章。假设有人想要制作一个骰子,θ=(1/6,1/6,1/6,1/6,1/6,1/6) 表示每个数字 1–6 的概率。然而,实际上没有什么是完美的,所以每个骰子会有些偏斜。例如,4 出现的可能性稍高,而 3 的可能性稍低。Dirichlet 分布用参数向量 α=(α₁,α₂,…,α₆) 描述这种多样性。较大的 αᵢ 增强了该数字的权重,而 αᵢ 值的整体总和较大则确保了更相似的抽样概率(骰子)。回到骰子例子,为了让骰子公平,每个 αᵢ 应该相等,且 α 值越大,骰子的制造越好。由于这是 beta 分布 的多变量推广,让我们展示一些 beta 分布的例子(Dirichlet 分布与两个骰子):

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

不同的 beta 分布(2 变量的 Dirichlet 分布) — 图由作者提供

我重现了 [11] 中的可视化,使用相同的 α 值为每个 αᵢ。这被称为 对称 Dirichlet 分布。我们可以看到,随着 α 值的减少,更有可能出现不平衡的骰子。下面的图显示了不同 α 值的 Dirichlet 分布。这里每一行代表一个类别,每一列代表一个客户端,圆圈的面积与概率成正比。

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

类别分布:使用不同的 Dirichlet 分布 α 值对 10 个类别的 20 个客户端进行采样 — 图由作者提供

类别分布:每个客户端的样本是独立抽取的,类别分布遵循 Dirichlet 方法。[11, 16] 使用这种 Dirichlet 分布版本。

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

类别分布:按类别(10)和客户端(20)归一化的样本总和 — 图由作者提供

每个客户端有一个预定数量的样本,但类别是随机选择的,因此最终的类别表示会不平衡。在客户端中,α→∞ 是先验(均匀)分布,而 α→0 意味着单类别客户端。

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

客户端分布:使用不同的 Dirichlet 分布 α 值对 10 个类别的 20 个客户端进行采样 — 图由作者提供

客户端分布:如果我们知道一个类别中的样本总数和客户端的数量,我们可以按类别将样本分配给客户端。这将导致客户端拥有不同数量的样本(在 FL 中非常典型),而全局类别分布则是平衡的。[12] 使用了这种 Dirichlet 分布的变体。

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

客户端分布:按类别(10)和客户端(20)归一化的样本总和 — 图由作者提供

尽管像 [11–16] 这样的工作相互引用使用 Dirichlet 分布,但它们使用了两种不同的方法。此外,不同的实验使用了不同的 α 值,这可能导致非常不同的性能。[11,12] 使用 α=0.1,[13-15] 使用 α=0.5,[16] 概述了不同的 α 值。这些设计选择丧失了使用相同基准数据集来评估算法的原始原则。

非对称 Dirichlet 分布:可以使用不同的 αᵢ 值来模拟更具资源的客户端。例如,下面的图是使用 1/i 为第 i 个客户端生成的。据我所知,这在文献中没有表示,而是使用 Zipf 分布 [17]。

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

非对称 Dirichlet 分布,αᵢ=1/i — 图由作者提供

Zipf 分布

[17] 使用了 Zipf 分布和 Dirichlet 分布的组合。它使用 Zipf 分布来确定每个客户端的样本数量,然后使用 Dirichlet 分布选择类别分布。

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

Zipf 分布中第k名的概率,其中是黎曼ζ函数

在 Zipf(zeta)分布中,某个项目的频率与其在频率表中的排名成反比。Zipf 定律可以在许多现实世界的数据集中观察到,例如语言语料库中的词频[18]。

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

使用 Zipf 分布抽样的项目 — 作者根据numpy Zipf 文档绘制的图

结论

基准测试联邦学习方法是一项具有挑战性的任务。理想情况下,人们会使用预定义的真实联邦数据集。然而,如果某种场景必须在没有良好的现有数据集来覆盖的情况下进行模拟,可以使用数据分布技术。为可重复性和设计选择的动机提供适当的文档是重要的。在这里,我总结了用于 FL 算法评估的最常见方法。访问这个 Colab 笔记本获取用于此故事的代码!

参考文献

[1] McMahan, B., Moore, E., Ramage, D., Hampson, S., & y Arcas, B. A. (2017 年 4 月). 从去中心化数据中高效学习深度网络. 载于人工智能与统计学(第 1273–1282 页)。PMLR。

[2] Savi, M., & Olivadese, F. (2021). 边缘端的短期能源消耗预测:一种联邦学习方法. IEEE Access, 9, 95949–95969。

[3] Caldas, S., Duddu, S. M. K., Wu, P., Li, T., Konečný, J., McMahan, H. B., … & Talwalkar, A. (2019). Leaf: 联邦设置的基准. 联邦学习数据隐私与保密研讨会

[4] Krizhevsky, A. (2009). 从微小图像中学习多层特征. 硕士论文, 特隆赫大学

[5] Liu, W., Chen, L., Chen, Y., & Zhang, W. (2020). 通过动量梯度下降加速联邦学习. IEEE 并行与分布式系统汇刊, 31(8), 1754–1766。

[6] Zhang, L., Luo, Y., Bai, Y., Du, B., & Duan, L. Y. (2021). 通过统一特征学习和优化目标对齐进行非独立同分布数据的联邦学习. 载于IEEE/CVF 国际计算机视觉会议论文集(第 4420–4428 页)。

[7] Zhang, J., Guo, S., Ma, X., Wang, H., Xu, W., & Wu, F. (2021). 个性化联邦学习的参数化知识转移. 神经信息处理系统进展, 34, 10092–10104。

[8] Zhao, Y., Li, M., Lai, L., Suda, N., Civin, D., & Chandra, V. (2018). 带有非独立同分布数据的联邦学习. arXiv 预印本 arXiv:1806.00582

[9] Li, D., & Wang, J. (2019)。Fedmd:通过模型蒸馏的异质联邦学习。arXiv 预印本 arXiv:1910.03581

[10] Wang, H., Kaplan, Z., Niu, D., & Li, B. (2020 年 7 月)。使用强化学习优化非独立同分布数据上的联邦学习。载于IEEE INFOCOM 2020-IEEE 计算机通信会议(第 1698–1707 页)。IEEE。

[11] Lin, T., Kong, L., Stich, S. U., & Jaggi, M. (2020)。用于联邦学习中强健模型融合的集成蒸馏。神经信息处理系统进展33,2351–2363。

[12] Luo, M., Chen, F., Hu, D., Zhang, Y., Liang, J., & Feng, J. (2021)。不惧异质性:用于非独立同分布数据的联邦学习分类器校准。神经信息处理系统进展34,5972–5984。

[13] Yurochkin, M., Agarwal, M., Ghosh, S., Greenewald, K., Hoang, N., & Khazaeni, Y. (2019 年 5 月)。贝叶斯非参数化联邦学习的神经网络。载于国际机器学习会议(第 7252–7261 页)。PMLR。

[14] Wang, H., Yurochkin, M., Sun, Y., Papailiopoulos, D., & Khazaeni, Y. (2020) 使用匹配平均的联邦学习。载于国际学习表征会议

[15] Li, Q., He, B., & Song, D. (2021)。模型对比的联邦学习。载于IEEE/CVF 计算机视觉与模式识别会议论文集(第 10713–10722 页)。

[16] Hsu, T. M. H., Qi, H., & Brown, M. (2019)。测量非相同数据分布对联邦视觉分类的影响。arXiv 预印本 arXiv:1909.06335

[17] Wadu, M. M., Samarakoon, S., & Bennis, M. (2021)。在联邦学习中在频道不确定性下的联合客户端调度与资源分配。IEEE 通信交易69(9),5962–5974。

[18] Fagan, Stephen; Gençay, Ramazan (2010),“文本计量经济学导论”,载于 Ullah, Aman; Giles, David E. A.(编),实证经济学与金融手册,CRC Press,第 133–153 页

从混乱到清晰:利用大型语言模型简化数据清洗

原文:towardsdatascience.com/from-chaos-to-clarity-streamlining-data-cleansing-using-large-language-models-a539fa0b2d90?source=collection_archive---------5-----------------------#2023-06-07

使用 OpenAI 的 GPT 模型清理调查回应。包含完整代码和 Github 链接。

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

·

关注 发表在 Towards Data Science ·17 min 阅读 ·2023 年 6 月 7 日

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

图片由 Dall-E 2 提供,生成并由作者修改。

在数字时代,准确可靠的数据对致力于提供个性化体验和做出明智决策的企业至关重要[1]。然而,数据的庞大数量和复杂性常常带来重大挑战,需要大量繁琐的手工工作。此时,改变游戏规则的大型语言模型(LLMs)技术登场。这些先进的 AI 工具凭借其自然语言处理能力和模式识别,有可能彻底改变数据清洗过程,使其更加可用。

在数据科学家的工具箱中,LLMs 就像是扳手和螺丝刀,重新塑造活动,利用其强大能力提高数据质量。隐喻中的锤子将揭示可操作的见解,并最终为更好的客户体验铺平道路。

话虽如此,让我们直接深入到今天将用作示例的用例中。

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

图片由 Scott Graham 提供,来源于 Unsplash

用例

在对学生进行调查时,最糟糕的事情就是把一个事实字段留作自由文本!你可以想象我们收到了哪些回应。

开玩笑的话题,我们的一位客户,Study Fetch,一个利用课程材料为学生创建个性化全能学习集的 AI 驱动平台,进行了一项针对大学生的调查。在收到超过 10K 的回应后,他们的 CEO 兼联合创始人 Esan Durrani 遇到了一点小麻烦。原来,调查中的“主要”字段是一个自由文本框,意味着受访者可以随意输入内容。作为数据科学家,我们知道如果你想进行统计分析,这不是最明智的做法。因此,调查的原始数据看起来就是这样的……

Anthropology 
Chem E 
Computer Science
Business and Law
Drama
cs
IMB

哦天哪!准备好拿起你的 Excel,开始一个排序冒险,这可能仅需一个小时,或者,谁知道,也许需要三小时。只有这样,这些数据异端才会被彻底清除。

然而,不用担心,因为我们有大型语言模型(LLM)的锤子。

正如一位智者曾说的,如果你只有一把锤子,那么一切看起来都像钉子。而且,数据清洗工作似乎就是最完美的钉子了。

我们可以简单地让我们友好的 LLM 将这些分类到已知的专业中。具体来说,OpenAI 的生成预训练变换器(GPT),一个支持流行的聊天机器人应用 ChatGPT 的 LLM,将适用于这种情况。GPT 模型使用超过 1750 亿个参数,并且已经在从 Common Crawl 提取的 26 亿个存储网页上进行了训练。此外,通过一种称为人类反馈的强化学习(RLHF)的技术,训练师可以引导和促使模型提供更准确和有用的响应。[2]

我认为对于我们的目的来说,1750 亿+ 参数应该足够了。只要我们能够提出正确的提示。

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

Kelly Sikkema 的照片,来源于 Unsplash

一切都在提示中

来自 AI 公司 Ryan 和 Esan,他们的专长是编写出色的提示,提出了我们提示的第一个版本。这个版本非常好,并且在使用语言推断[3]时效果很好,但还有两个方面可以改进:

  • 这篇文章是为了一个记录而写的

  • 它是作为‘完成’使用 Da Vinci 模型编写的(提到 IT 让我银行账户都吓了一跳)

这会花费我们太多,而且这显然是不行的。因此,Ryan 和我分别将提示重写为一个使用‘gpt-3.5-turbo’进行批量操作的聊天提示。OpenAI 的 提示最佳实践 和课程 ChatGPT Prompt Engineering for Developers 对我非常有帮助。我们经过了几次迭代的构思、实施、分析和改进,最终得到了一个好的工作版本。

不再废话,以下是修订版 2 后的提示:

1\. Arts and Humanities: Literature and arts.
2\. Social Sciences: psychology, sociology, and political science
3\. Business and Management: marketing, finance, economics, MBA
4\. Life Sciences: Biology, environmental,agriculture-related
5\. Engineering and Technology: Electrical, mechanical, etc.
6\. Medicine Health and Allied Sciences: Nursing, medical school
7\. All Other Programs: Everything else.

The above information pertains to categories of undergraduate programs. 
Categorize the below data into one of the program categories above.

Desired Format: CSV of data row, program name

Data
###
Drama
Literature
Physics
Health sciences
Mechanical Engineering
###

对于这个提示,LLM 的响应是

Drama, Arts and Humanities: Literature and arts
IMB, All Other Programs: Everything else
Health sciences, Medicine Health and Allied Sciences: Nursing, medical school
MBA, Business and Management: marketing, finance, economics, MBA
Mechanical Engineering, Engineering and Technology: Electrical, mechanical, etc.

这将有效,虽然有点。 但我不太喜欢冗长的程序名称重复的冗余文本。对于 LLM,文本是标记,而标记是要花钱的。你看,我的编程技能是在互联网泡沫的熊熊烈火中锻造出来的。让我告诉你,我从不放过任何节省成本的机会。

所以,我在‘期望格式’部分稍微更改了提示。我要求模型仅输出调查响应的序号(例如上面的 1 代表戏剧)和程序的序号(例如 1 代表文学)。然后 Ryan 建议我请求 JSON 输出而不是 CSV,以便更容易解析。他还建议我添加一个‘示例输出’部分,这个建议非常好。

最终的提示如下(为了清晰简化):

1\. Arts and Humanities: Literature and arts.
2\. Social Sciences: psychology, sociology, and political science
3\. Business and Management: marketing, finance, economics, MBA
4\. Life Sciences: Biology, environmental,agriculture-related
5\. Engineering and Technology: Electrical, mechanical, etc.
6\. Medicine Health and Allied Sciences: Nursing, medical school
7\. All Other Programs: Everything else.

The above information pertains to categories of undergraduate programs. 
Categorize the below data into one of the program categories above.

Desired Format: JSON format of an array with response number, program number

Example Example output:  [[1,7],[2,1],[3,5],[4,8],[5,7]]

Data
###
1\. Drama
2\. IMB
3\. Health sciences
4\. MBA
5\. Mechanical Engineering
###

我们使用的完整提示可以在 GitHub 链接这里查看。

模型的输出

[
  [1, 1]
  [2, 3]
  [3, 6]
  [4, 3]
  [5, 5]
]

正如之前讨论的那样,模型的输出是调查响应的序数与我们定义的类别之间的映射。以第一行举例:1,1。那意味着 1 是响应号,1 是对应的映射程序号。调查响应 1 是“戏剧”,映射程序 1 是“艺术与人文学科”。这似乎是对的!戏剧在其正确的#1 位置,所有的目光都集中在它上面。

尽管输出乍看起来像是嵌入(用于聚类和降维)的结果,但它们只是带有序数位置的相同映射信息。除了在令牌使用上提供一些成本优势外,这些数字也更容易解析。

我们现在可以将文件中的原始调查响应翻译为有意义的专业,进行汇总,并获得有价值的可操作见解。

但等等,我不打算坐在电脑前,将每一块调查响应输入到浏览器中并计算映射。除了令人厌烦外,错误率也完全无法接受。

我们需要一些老式的自动化。进入 API…

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

图片来源于劳拉·奥克尔拍摄于Unsplash

API 的救援

如你所知,应用程序编程接口(API)允许我们的程序高效地与第三方服务互动。尽管许多人在使用 ChatGPT 时取得了令人印象深刻的成就,但语言模型的真正潜力在于利用 API 将自然语言能力无缝集成到应用程序中,使其对用户不可察觉。这就像你用来阅读这篇文章的手机或电脑中所蕴含的不可思议的科技。

如果你还没有,可以在这里申请 API 访问,openai.com/blog/openai-api [4]。一旦注册并获得 API 密钥,可以在这里找到规格说明。包含代码示例的一些非常有用的示例可以在这里找到。playground是一个很好的功能,可以在将其投入使用前测试各种设置。

我们将使用 REST 的聊天完成 API。调用的示例有效负载如下:

{ 
  “model”: “gpt-3.5-turbo”, 
  “temperature”: 0,
  "n": 1,
  “messages”: [
     {“role”: “user”, “content”: “Hello, I'm a nail.}
  ]
}

让我们快速查看一下参数及其效果

模型

目前唯一对公众开放的聊天完成模型是 gpt-3.5-turbo。Esan 有访问 GPT 4 模型的权限,这让我非常嫉妒。虽然 gpt-4 更加准确,并且幻觉更少[2],但它的费用大约是 gpt-3.5-turbo 的 20 倍。对于我们的需求来说,Turbo 先生已经相当合适了,谢谢。

温度

在提示旁边,温度是我们可以传递给模型的最重要设置之一。根据 API 文档,它可以设置为 0 到 2 之间的值。它有着显著的影响[6],因为它控制输出的随机性,类似于你在开始写作前体内的咖啡因含量。关于每个应用程序可使用的值的指南在这里给出[7]。

对于我们的使用案例,我们仅仅希望没有变化。我们希望引擎每次都给出完全一样的映射。因此,我们使用了 0 的值。

n

要生成多少个聊天完成选项?如果我们是在进行创意写作,并且希望选择的选项超过 1 个,我们可以使用 2 甚至 3 个。对于我们的情况,n=1(默认)效果很好。

消息

角色可以是系统、用户或助手。系统角色提供指令并设定上下文。用户角色代表最终用户的提示。助手角色基于对话历史进行回应。这些角色有助于构建对话,并实现用户与 AI 助手之间的有效互动。

模型最大令牌

这不一定是我们在请求中传递的参数,不过另一个名为 max_tokens 的参数限制了聊天响应的总长度。

首先,令牌可以被认为是一个单词的一部分。一个令牌大约是 4 个英文字符。例如,引用“预见未来的最佳方式是创造未来”,这个引言被归因于亚伯拉罕·林肯等人,包含了 11 个令牌。

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

图片来源于 Open AI Tokenizer。由作者生成。

如果你认为一个令牌就是一个单词,这里有另外一个 64 个令牌的例子,来说明这并不是那么简单。

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

图片来源于 Open AI Tokenizer。由作者生成。

准备好接受震撼的揭示:你在消息中包含的每一个表情符号都增加了最多 6 的费用。没错,你喜爱的笑脸和眨眼符号都是狡猾的小令牌窃贼!😉💸

模型的最大令牌窗口是一个技术限制。你的提示(包括你放入的任何额外数据)和答案必须都在模型最大限制内,详细信息请查看这里。在聊天完成的情况下,内容、角色和所有之前的消息都消耗令牌。如果你从输入或输出(助手消息)中删除一条消息,模型将失去对其的所有记忆[8]。就像多莉在寻找奇科时一样,没有法比奥,没有宾戈,没有哈波,没有艾尔莫?… 尼莫!

对于 gpt-3.5-turbo,模型的最大限制是 4096 个 token,或者大约 16K 字符。对于我们的用例,提示大约是 2000 个字符,每个调查回复大约是 20 个字符(平均),映射回复是 7 个字符。因此,如果我们在每个提示中放入 N 个调查回复,最大字符数将是:

2000 + 20N + 7N 应小于 16,000。

解算后,我们得到一个小于 518 或大约 500 的 N 值。从技术上讲,我们可以在每个请求中放入 500 个调查回复,并处理数据 20 次。相反,我们选择每个请求中放入 50 个调查回复,处理 200 次,因为如果我们在单个请求中放入超过 50 个调查回复,偶尔会收到异常回复。有时,服务会发脾气!我们不确定这是系统性乖戾的慢性病,还是刚好碰上了运气不好的一面。

那么,我们如何使用这个 API 呢?让我们进入重点,代码部分。

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

Markus Spiske拍摄于Unsplash

代码的方式

Node.js 是一个 JavaScript 运行环境[9]。我们将编写一个 Node.js/JavaScript 程序,该程序将执行在这个流程图中描述的操作:

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

程序的流程图。图片由作者提供。

我的 JavaScript 技能不是特别出色。我可以写更好的 Java、PHP、Julia、Go、C#,甚至 Python。但 Esan 坚持使用 Node,所以就用 JavaScript 吧。

所有代码、提示和示例输入可以在这个GitHub 链接中找到。不过,让我们来看看最重要的部分:

首先,让我们看看如何使用“csv-parser”Node 库读取 CSV 文件。

fs.createReadStream(fileName)
  .pipe(csv())
  .on('data', (data) => rows.push(data))
  .on('end', async () => {
   // Reading is done. Call classifier here
     . . .      
}

接下来,我们调用分类器生成映射。

for(index = 0; index < totalDataPoints; ++index) {
        dataText += (index+1).toString() + ". " 
                        + uniqueData[index] + "\n";
        requestCount++;
        if (requestCount>batchSize||index==totalDataPoints-1){
           dataText += "###\n";
           // We have loaded batchSize(50) response. 
           // Now construct the prompt 
           ...
      }
}

然后,提示由类别、主要提示文本和 CSV 中的数据构成。我们将提示通过他们的 OpenAI Node 库发送到服务。

let prompt = categoriesText + mainPrompt + dataText;
let payload = {
    model: "gpt-3.5-turbo",
    temperature: 0,
    messages: [ 
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user","content": prompt }
    ]
};

try {
   const response = await openai.createChatCompletion(payload);
   let mapping = JSON.parse(response.data.choices[0].message.content); 
   // Here save the mappings
   ...

} catch (error) {
   console.error('API Error:',error);
}

最后,当所有迭代完成后,我们可以将 srcCol 文本(调查回复)翻译为 targetCol(标准化的程序名称),并写出 CSV 文件。

for (let row of rows) {
    srcVal = row[srcCol].trim();
    if (!row[targetCol] && dataMapping[srcVal])
        row[targetCol] = dataMapping[srcVal];
}

stringify(rows, {
    header: true
}, function (err, output) {
   fs.writeFile(__dirname+'/'+destFileName, output,
       function(err, result) {
          if(err) console.log('error', err);
       });
});

那段 JavaScript 代码没有我想象中的那么复杂,2 到 3 小时内完成了。我想,直到开始做之前总是看起来很令人生畏。

现在,代码已经准备好,是时候进行最终执行了……

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

Alexander Grey拍摄于Unsplash

执行

现在,我们需要一个地方来运行代码。在争论是否应该获得一个云实例来运行负载后,我做了一些快速计算,发现我可以在不到一小时内在我的笔记本电脑上运行它。这也不算太糟糕。

我们开始了测试轮次,并注意到服务有 1/10 的几率会返回提供给它的数据,而不是映射。因此,我们只会收到调查回应的列表。由于没有找到映射,这些 CSV 文件中的回应会被映射为空字符串。

与其在代码中检测并重试,我决定重新运行脚本,但只处理目标列为空的记录。

脚本将从所有行中目标列为空开始,并填写标准化的程序名称。由于响应中的错误,一些行的目标列没有被映射并保持为空。当脚本第二次运行时,它只会为第一次运行中未处理的回应构造提示。我们重跑了几次程序,最终将所有内容映射完成。

多次运行大约花了 30 分钟,并且不需要太多监督。这里是模型的一些更有趣的映射的选择:

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

输入和程序名称之间的示例映射。图片由作者提供。

大多数看起来对。组织行为学是社会科学还是商业学科呢?我想两者都可以。

每个约 50 条记录的请求总共使用了大约 800 个 tokens。整个过程的费用是 40 美分。我们可能花了 10 美分进行测试、重跑等。所以,总费用约 50 美分,大约 2 ½小时的编码/测试时间和½小时的运行时间,我们完成了工作。

总费用: 约 1 美元以内

总时间: 大约 3 小时

也许使用 Excel、排序、正则表达式以及拖拽复制的手动转换,我们可以在同样的时间内完成并节省一点费用。但是,这要有趣得多,我们学到了东西,我们有了一个可重复的脚本/过程,并且还写了一篇文章。而且,我觉得StudyFetch可以承担这 50 美分。

这是我们高效且经济地实现的一个好用例,但 LLMs 还能用于什么其他用途呢?

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

照片由Marcel Strauß提供,来自Unsplash

寻找更多的钉子

为你的应用程序添加语言能力可能会有比我上面所展示的更多的用途。这里是一些仅与我们查看的审核数据相关的更多用例:

数据解析和标准化:LLMs 可以通过识别和提取来自非结构化或半结构化数据源的相关信息,来帮助解析和标准化数据,例如我们刚刚查看的数据。

数据去重:LLMs 可以通过比较各种数据点来帮助识别重复记录。例如,我们可以比较评论数据中的姓名、专业和大学,并标记潜在的重复项。

数据总结:LLMs 可以总结不同的记录,以了解响应情况。例如,对于“你在学习过程中面临的最大挑战是什么?”这个问题,大型语言模型可以总结来自相同专业和大学的多个回答,以查看是否存在任何模式。然后我们可以将所有总结放入一个请求中,获取总体列表。但我怀疑对每个客户细分市场的总结会更有用。

情感分析:LLMs 可以分析评论以确定情感并提取有价值的见解。对于“你会为帮助你学习的服务付费吗?”这个问题,LLMs 可以将情感分类为 0(非常负面)到 5(非常积极)。我们可以利用这一点按细分市场分析学生对付费服务的兴趣。

尽管学生评价是一个较小的缩影,但这个技术在更广泛的领域也有许多用途。在我工作的AAXIS公司,我们实施了企业对企业和企业对消费者的数字商务解决方案。这包括将大量数据从现有的旧系统迁移到具有不同数据结构的新系统。我们使用各种数据工具来分析源数据,以确保一致性。本文中概述的技术可能会对这个目的有很大帮助。

其他一些数字商务用例包括检查产品目录中的错误、编写产品文案、扫描评论回复和产品评论总结等等。比起当询问他们的专业时的本科生创意,编程要简单得多。

尽管大型语言模型(LLMs)在数据清洗中可能是强大的工具,但仍需注意,它们应该与其他技术和人工监督结合使用。数据清洗过程通常需要领域专业知识、上下文理解和手动审查,以做出明智的决策并保持数据完整性。LLMs 也不是推理引擎[10]。它们是下一个词预测器。它们往往非常自信且令人信服地提供错误信息(幻觉)[2][11]。幸运的是,在我们的测试过程中,我们没有遇到任何幻觉,因为我们的用例主要涉及分类。

如果谨慎使用并了解潜在陷阱,LLMs 可以成为你工具箱中的一个很好的工具。

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

图片由 Paul Szewczyk 提供,来自 Unsplash

最终的关键

在这篇文章中,我们首先探讨了数据清理的具体用例:将调查回应标准化为一组特定值。这将使我们能够对回应进行分组,并获得有价值的见解。我们使用了大型语言模型(LLM),Open AI 的 GPT 3.5 Turbo,来帮助分类这些回应。我们回顾了使用的提示、如何利用提示进行 API 调用以及所需的代码来自动化所有操作。最后,我们将所有内容整合在一起,总共花费的 OpenAI 工具成本不到一美元。

我们是否拥有一个典型的大型语言模型工具,并找到完美的解决方案?也许。但更可能的是,我们拥有了一把瑞士军刀,并用它来剥皮和吃鱼。虽然不是特别专业,但仍然非常合适。至于 Esan,真的很喜欢寿司。

你的用例是什么?我们很想听听你的意见!

同谋者

本文的主要工作由我 Esan Durrani 和 Ryan Trattner 执行,我们是 StudyFetch 的联合创始人,该平台利用课程材料为学生创建个性化的全能学习集。

我还要感谢 Prashant Mishra、Rajeev Hans、Israel Moura 和 Andy Wagner,我在 AAXIS Digital 的同事们,感谢他们对本文的审阅和建议。

我还要感谢我三十年的朋友 基兰·邦达拉帕提,TRM Labs 的工程副总裁,感谢他在生成 AI 领域的初步指导和对本文的审阅。

另外,感谢我的编辑 梅根·波尔斯特拉,一如既往地使文章看起来和感觉专业。

参考文献

1. 泰穆·赖塔卢奥托,《数字时代个性化营销的重要性》,MaketTailor Blog,2023 年 5 月,www.markettailor.io/blog/importance-of-personalized-marketing-in-digital-age

2. 安库尔·A·帕特尔布赖恩特·林顿迪娜·索斯塔雷克,《GPT-4、GPT-3 和 GPT-3.5 Turbo:OpenAI 大型语言模型综述》,2023 年 4 月,Ankur’s Newsletter,www.ankursnewsletter.com/p/gpt-4-gpt-3-and-gpt-35-turbo-a-review

3. 亚历山德拉·门德斯,《终极 ChatGPT 提示工程指南:面向普通用户和开发者》,2023 年 6 月,Imaginary Cloud Blog,www.imaginarycloud.com/blog/chatgpt-prompt-engineering/

4. 塞巴斯蒂安,《如何在 Node.js 中使用 OpenAI 的 ChatGPT API》,2023 年 3 月,Medium — 智能编程方式medium.com/codingthesmartway-com-blog/how-to-use-openais-chatgpt-api-in-node-js-3f01c1f8d473

5. 特里斯坦·沃尔夫,《利用 OpenAI API Playground 解放你的 ChatGPT 提示》,2023 年 2 月,Medium — 明日故事medium.com/tales-of-tomorrow/liberate-your-prompts-from-chatgpt-restrictions-with-the-openai-api-playground-a0ac92644c6f

6. AlgoWriting,《简单指南:设置 GPT-3 温度》,2020 年 11 月,Medium,algowriting.medium.com/gpt-3-temperature-setting-101-41200ff0d0be

7. 凯恩·胡珀,《用 Ruby 掌握 GPT-3 温度参数》,2023 年 1 月,Plain English,plainenglish.io/blog/mastering-the-gpt-3-temperature-parameter-with-ruby

8. OpenAI 作者,《GPT 指南 — 管理令牌》,2023 年,OpenAI 文档,platform.openai.com/docs/guides/gpt/managing-tokens

9. 普里耶什·帕特尔,《Node.js 究竟是什么?》,2018 年 4 月,Medium — 自由代码营medium.com/free-code-camp/what-exactly-is-node-js-ae36e97449f5

10. 本·迪克森,《大型语言模型存在推理问题》,2022 年 6 月,Tech Talks Blog,bdtechtalks.com/2022/06/27/large-language-models-logical-reasoning/

11. 弗兰克·诺伊根鲍尔,《理解 LLM 幻觉》,2023 年 5 月,Towards Data Science,towardsdatascience.com/llm-hallucinations-ec831dcd7786

数据科学中的 Docker

原文:towardsdatascience.com/from-chaos-to-consistency-docker-for-data-scientists-240372adff18

数据科学家用 Docker 的介绍和应用

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

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

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

图片由 Ian Taylor 提供,来源于 Unsplash

背景

但在我的机器上运行正常?

这是技术社区中的经典梗,尤其对于那些想要发布他们惊人的机器学习模型的数据科学家来说,结果却发现生产机器上有不同的操作系统。远非理想。

然而…

多亏了这些被称为容器的奇妙事物和控制它们的工具,如Docker**,**这才有了解决方案。

在这篇文章中,我们将深入探讨容器是什么,以及如何使用 Docker 构建和运行它们。容器和 Docker 的使用已成为行业标准和数据产品的常见实践。作为数据科学家,学习这些工具是你武器库中宝贵的工具。

什么是 Docker?

Docker 是一种服务,可以在容器中构建、运行和执行代码及应用程序。

现在你可能在想,什么是容器?

表面上看,容器非常类似于虚拟机 (VM)。它是一个小型隔离环境,一切都自‘包含’,可以在任何机器上运行。容器和虚拟机的主要卖点是它们的便携性,允许你的应用程序或模型在任何本地服务器、个人计算机或如AWS这样的云平台上无缝运行。

容器和虚拟机之间的主要区别在于它们如何使用主机计算机的资源。容器要轻得多,因为它们不会主动分割主机计算机的硬件资源。我这里不深入探讨所有技术细节,但如果你想了解更多,我在这里链接了一篇很棒的文章解释它们的区别。

Docker 简单来说是我们用来轻松创建、管理和运行这些容器的工具。这是容器变得非常流行的主要原因之一,因为它使开发者能够轻松部署可以在任何地方运行的应用程序和模型。

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

作者提供的图示。

Docker 技术特性

我们运行容器所需的三个主要元素是:

  • Dockerfile: 一个包含如何构建 Docker 镜像的指令的文本文件。

  • Docker 镜像: 一个创建 Docker 容器的蓝图或模板。

  • Docker 容器: 一个提供应用程序或机器学习模型运行所需的一切的隔离环境。包括依赖项和操作系统版本等。

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

作者提供的图示。

还有一些其他关键点需要注意:

  • Docker 守护进程: 一个后台进程(守护进程),处理对 Docker 的传入请求。

  • Docker 客户端: 一个允许用户通过其守护进程与 Docker 进行交互的 shell 接口。

  • DockerHub 类似于 GitHub,开发者可以在这里分享他们的 Docker 镜像。

安装 Docker

Hombrew

首先你应该安装的是 Homebrew (link here)。它被称为“MacOS 的缺失包管理器”,对任何在 Mac 上编码的人都非常有用。

要安装 Homebrew,只需运行他们网站上给出的命令:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

通过运行brew help来验证 Homebrew 是否已安装。

Docker

现在 Homebrew 已安装,你可以通过运行brew install docker来安装 Docker。通过运行which docker来验证 Docker 是否已安装,输出结果不应出现任何错误,应该如下所示:

/opt/homebrew/bin/docker

Colima

最后一步是安装 Colima 只需运行install colima,并通过which colima验证它是否已安装。再次,输出结果应如下所示:

/opt/homebrew/bin/colima

现在你可能会想,Colima 到底是什么?

Colima 是一个软件包,能够在 MacOS 上启用容器运行时。简单来说,Colima 为容器在我们的系统上工作创建了环境。为此,它运行一个带有守护进程的 Linux 虚拟机,Docker 可以通过客户端-服务器模型与其通信。

或者,你也可以安装Docker 桌面版来替代 Colima。然而,我更喜欢 Colima,原因有几个:它免费、更轻量,而且我喜欢在终端中工作!

有关 Colima 的更多论点,请查看这个博客文章

使用 Docker 的示例

工作流

以下是数据科学家和机器学习工程师如何使用 Docker 部署其模型的示例:

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

作者的图示。

第一步显然是构建他们的惊人模型。然后,你需要将运行模型所需的所有内容打包起来,比如 Python 版本和包依赖。最后一步是使用 Dockerfile 中的 requirements 文件。

如果你现在觉得这完全随意,不用担心,我们会一步一步讲解这个过程!

基本模型

我们先从构建一个基本模型开始。提供的代码片段展示了在著名的Iris 数据集上实现随机森林分类模型的简单实现。

来自 Kaggle 的 CC0 许可数据集。

作者的 GitHub Gist。

这个文件叫做basic_rf_model.py,供参考。

创建需求文件

现在我们有了模型,我们需要创建一个requirement.txt文件,来容纳支撑我们模型运行的所有依赖。在这个简单的例子中,我们幸运地只依赖于scikit-learn包。因此,我们的requirement.txt文件看起来会是这样:

scikit-learn==1.2.2

你可以通过scikit-learn --version命令检查你计算机上运行的版本。

创建 Dockerfile

现在我们终于可以创建我们的 Dockerfile 了!

因此,在与requirement.txtbasic_rf_model.py相同的目录下,创建一个名为Dockerfile的文件。在Dockerfile中,我们将包含以下内容:

作者的 GitHub Gist。

让我们逐行分析,看看这是什么意思:

  • FROM python:3.9这是我们镜像的基础镜像

  • MAINTAINER egor@some.email.com这表示谁维护这个镜像

  • WORKDIR /src将镜像的工作目录设置为 src

  • COPY . .将当前目录的文件复制到 Docker 目录

  • RUN pip install -r requirements.txtrequirement.txt文件中的要求安装到 Docker 环境中

  • CMD ["python", "basic_rf_model.py"]告诉容器执行命令 python basic_rf_model.py 并运行模型

启动 Colima 和 Docker

下一步是设置 Docker 环境:首先我们需要启动 Colima:

colima start

Colima 启动后,通过运行以下命令检查 Docker 命令是否有效:

docker ps

它应该返回类似这样的内容:

CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

这很好,意味着 Colima 和 Docker 按预期工作!

注意docker ps 命令列出所有当前运行的容器。

构建镜像

现在是时候从我们上面创建的 Dockerfile 构建我们的第一个 Docker 镜像了:

docker build . -t docker_medium_example

-t 标志表示镜像的名称,*.* 告诉我们从当前目录构建。

如果我们现在运行docker images,我们应该会看到类似这样的内容:

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

作者提供的图片。

恭喜,镜像已构建完成!

运行容器

在镜像创建完成后,我们可以使用上面列出的 IMAGE ID 作为容器运行它:

docker run bb59f770eb07

输出:

Accuracy: 0.9736842105263158

因为它所做的只是运行了basic_rf_model.py脚本!

额外信息

本教程只是触及了 Docker 的基本功能和用途。要真正理解 Docker,还有许多功能和命令需要学习。Docker 网站上提供了一个详细的教程,你可以在这里找到。

一个很酷的功能是你可以以交互模式运行容器并进入其 shell。例如,如果我们运行:

docker run -it bb59f770eb07 /bin/bash

你将进入 Docker 容器,应该会看到类似这样的内容:

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

作者提供的图片。

我们还使用了ls命令来显示 Docker 工作目录中的所有文件。

总结与进一步思考

Docker 和容器是确保数据科学家的模型可以随时随地运行的绝佳工具。它们通过创建包含模型有效运行所需的所有内容的小型隔离计算环境来实现这一点。这被称为容器。它易于使用且轻量化,使其成为如今常见的工业实践。本文介绍了如何使用 Docker 将模型打包到容器中的基本示例。这个过程简单而无缝,数据科学家可以很快学习和掌握。

本文使用的完整代码可以在我的 GitHub 上找到:

[## Medium-Articles/Software Engineering /docker-example at main · egorhowell/Medium-Articles

你现在无法执行此操作。你在另一个标签页或窗口中登录。你在另一个标签页或窗口中退出了……

github.com](https://github.com/egorhowell/Medium-Articles/tree/main/Software%20Engineering%20/docker-example?source=post_page-----240372adff18--------------------------------)

另一个事项!

我有一个免费的通讯,Dishing the Data,在其中我每周分享成为更优秀数据科学家的技巧。没有“浮夸”或“点击诱饵”,只有来自实践中的数据科学家的纯粹可操作见解。

[## Dishing The Data | Egor Howell | Substack

如何成为更好的数据科学家。点击阅读由 Egor Howell 编写的 Dishing The Data,一份 Substack 出版物。

newsletter.egorhowell.com

与我联系!

参考资料与进一步阅读

从簇到洞察;下一步

原文:towardsdatascience.com/from-clusters-to-insights-the-next-step-1c166814e0c6

了解如何定量检测哪些特征驱动了簇的形成

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

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

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

图片由作者提供。

聚类分析是一种识别具有相似模式的组的优秀技术。然而,一旦簇形成后,确定簇背后的驱动特征可能依然具有挑战性。但这一步骤对于揭示之前可能遗漏的宝贵见解至关重要,这些见解可以用于决策制定和更深入地理解数据集。确定驱动特征的一种方法是通过特征值对样本进行着色。尽管这种方法很有洞察力,但当特征数量达到数百时,这种方法就显得劳动密集。此外,随着簇的大小和密度的不同,判断特定特征集的确切贡献可能会很困难。我将演示如何定量检测簇背后的驱动特征。 在这篇博客中, clusteval 库被用来进行聚类评估,并确定驱动簇形成的特征。

背景

无监督聚类是一种在数据中识别自然或数据驱动的组的技术,而无需使用预定义的标签或类别。聚类方法的挑战在于,不同的方法可能会由于对数据施加的隐含结构而导致不同的分组。要确定什么构成了“”的聚类,我们可以使用定量指标。更多详细信息可以在博客“从数据到聚类;你的聚类什么时候足够好?”中阅读 *[1]*。

## 从数据到簇;你的聚类什么时候足够好?

使用聚类方法可以找到合理的簇和隐藏的宝石,但你需要正确的聚类评估方法!

[towardsdatascience.com

clusteval库测试特征是否与簇标签显著关联。

Clusteval是一个 Python 包,用于评估聚类的倾向、质量、簇的数量,并确定簇与特征之间的统计关联。Clusteval返回最佳簇标签的簇标签,以产生最佳的样本划分。实现了以下评估策略:轮廓系数、Davies-Bouldin 指数和导数(或肘部)方法,这些可以与K 均值、凝聚聚类、DBSCAN 和 HDBSCAN [1]*结合使用。

pip install clusteval

为了检测簇标签背后的驱动特征,HNET库 [2] 在clusteval中被利用,执行对分类特征的超几何检验和对连续值的曼-惠特尼 U 检验,以评估特征是否与簇标签显著关联。更多详细信息可以在这里阅读:

## 探索并理解你的数据,利用显著关联网络。

探索以了解你的数据可以决定一个项目是否成功!

[towardsdatascience.com

确保聚类结果是可靠的。

在我们能够检测簇背后的驱动特征之前,我们首先需要对数据进行聚类,并确信我们的聚类是有效的。与监督方法相对,聚类算法处理的是同质数据,其中所有变量具有相似的类型或测量单位。这非常重要,因为聚类算法基于数据点的相似性对其进行分组,因此在混合数据类型或使用非同质数据时会产生不可靠的结果。确保以下几点:

  1. 数据根据研究目标和数据的统计特性进行标准化。

  2. 使用适当的距离度量。

  3. 评估簇的倾向和质量。

有了簇标签,我们可以调查特征的贡献。让我们在下一节中做一个小的用例。

玩具示例揭示簇标签背后的驱动特征。

对于这个用例,我们将加载在线购物者意图数据集,并进行预处理、聚类、评估,然后确定与簇标签显著相关的特征。此数据集包含 12330 个样本和 18 个特征。此混合数据集需要更多的预处理步骤,以确保所有变量具有相似的类型或测量单位。因此,第一步是创建具有可比单位的同质数据集。常见的方法是离散化并创建一个一次性矩阵。我将使用df2onehot库,按照以下预处理步骤进行离散化:

  • 分类值0None?False被移除。

  • 少于 50 个正值的一次性特征被移除。

  • 对于具有 2 个类别的特征,仅保留一个。

  • 特征值独特性达到 80%或以上的被认为是数值型的。

预处理步骤将数据集转换为一个包含相同 12330 个样本但现在具有 121 个一次性特征的矩阵。值得注意的是,上述标准并不是绝对标准,而是应根据每个用例进行探索。对于聚类,我们将使用agglomerative聚类方法,并以hamming距离和complete连通性进行聚类。请参见下面的代码部分。

# Intall libraries
pip install df2onehot

# Import libraries
from clusteval import clusteval
from df2onehot import df2onehot

# Load data from UCI
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/00468/online_shoppers_intention.csv'

# Initialize clusteval
ce = clusteval()
# Import data from url
df = ce.import_example(url=url)

# Preprocessing
cols_as_float = ['ProductRelated', 'Administrative']
df[cols_as_float]=df[cols_as_float].astype(float)
dfhot = df2onehot(df, excl_background=['0.0', 'None', '?', 'False'], y_min=50, perc_min_num=0.8, remove_mutual_exclusive=True, verbose=4)['onehot']

# Initialize using the specific parameters
ce = clusteval(evaluate='silhouette',
               cluster='agglomerative',
               metric='hamming',
               linkage='complete',
               min_clust=2,
               verbose='info')

# Clustering and evaluation
results = ce.fit(dfhot)

# [clusteval] >INFO> Saving data in memory.
# [clusteval] >INFO> Fit with method=[agglomerative], metric=[hamming], linkage=[complete]
# [clusteval] >INFO> Evaluate using silhouette.
# [clusteval] >INFO: 100%|██████████| 23/23 [00:28<00:00,  1.23s/it]
# [clusteval] >INFO> Compute dendrogram threshold.
# [clusteval] >INFO> Optimal number clusters detected: [9].
# [clusteval] >INFO> Fin.

在数据集上运行clusteval后,返回了 9 个簇。 由于数据包含 121 个维度(特征),我们无法直接在散点图中可视化检查簇。然而,我们可以进行嵌入,然后使用散点图进行视觉检查,如下面代码部分所示。指定embedding='tsne'时,嵌入会自动执行。

# Plot the Silhouette and show the scatterplot using tSNE
ce.plot_silhouette(embedding='tsne')

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

图 1. 左面板:显示了带有检测到的簇和标签的轮廓评分图。右面板:散点图中样本按簇标签上色。两面板中的颜色和簇标签是匹配的。图片由作者提供。

图 1(右面板)的结果展示了 t-SNE 嵌入后的散点图,样本按簇标签上色。左面板展示了轮廓图,我们可以在其中视觉评估聚类结果的质量,如聚类的同质性、簇的分离情况以及通过聚类算法检测到的最佳簇数量。

此外,轮廓评分范围为-1 到 1(x 轴),其中接近 1 的评分表示簇内的数据点彼此非常相似,与其他簇的数据点不相似。簇 0、2、3 和 5 表示为良好分离的簇。接近 0 的轮廓评分表示簇之间的重叠或数据点与自身簇和邻近簇同样相似。接近-1 的评分则表明数据点与邻近簇的数据点更相似,而不是与自身簇的数据点。

条形的宽度代表了每个簇的密度或大小。较宽的条形表示簇较大且数据点更多,而较窄的条形表示簇较小且数据点较少。虚线红线(在我们的情况下接近 0)表示所有数据点的平均轮廓得分。它作为评估整体聚类质量的参考。平均轮廓得分高于虚线的簇被认为是分离良好的,而得分低于虚线的簇可能表示聚类效果较差。一般来说,好的聚类应该具有接近 1 的轮廓得分,表示簇的分离度良好。然而,请注意,我们现在已经在高维空间中对数据进行了聚类,并在低维 2D 空间中的 t-SNE 嵌入后评估了聚类结果。投影可能会给现实带来不同的视角。

另外,我们也可以先进行嵌入,然后在低维空间中对数据进行聚类(见下方代码部分)。现在我们将使用Euclidean距离度量,因为我们的输入数据不再是独热编码,而是来自 t-SNE 映射的坐标。经过拟合后,我们检测到 27 个簇的最佳数量,这比我们之前的结果多得多。我们可以看到簇评估得分(图 2)似乎有些不稳定。这与数据的结构以及是否能够形成最佳聚类有关。

# Initialize library
from sklearn.manifold import TSNE
xycoord = TSNE(n_components=2, init='random', perplexity=30).fit_transform(dfhot.values)

# Initialize clusteval
ce = clusteval(cluster='agglomerative', metric='euclidean', linkage='complete', min_clust=5, max_clust=30)

# Clustering and evaluation
results = ce.fit(xycoord)

# Make plots
ce.plot()
ce.plot_silhouette()

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

图 2. 簇评估得分(得分越高越好)。

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

图 3. 左侧面板:显示检测到的簇及标签的轮廓得分图。右侧面板:样本在簇标签上的散点图。两面板之间的颜色和簇标签是匹配的。图像由作者提供。

轮廓图现在显示出比以前更好的结果,表明簇的分离度更好。在下一部分,我们将检测哪些特征与簇标签显著相关。

确定最佳簇数后,接下来是具有挑战性的一步;理解哪些特征驱动了簇的形成。

识别簇标签背后的驱动特征。

此时,我们检测到了每个样本被分配的最佳聚类数。为了检测聚类标签背后的驱动特征,我们可以计算特征与检测到的聚类标签之间的统计关联。这将确定某些变量的特定值是否倾向于与一个或多个聚类标签同时出现。各种统计关联测量,如卡方检验、费舍尔精确检验和超几何检验,通常用于处理有序或名义变量。我将使用超几何检验来测试类别变量与聚类标签之间的关联,使用Mann-Whitney U 检验来测试连续变量与聚类标签之间的关联。这些检验在HNET中可以方便地实现,而该工具也被用于clusteval库中。通过enrichment功能,我们现在可以测试统计显著的关联。在这一步之后,我们可以使用散点图功能将丰富的特征绘制到聚类图上。

# Enrichment between the detected cluster labels and the input dataframe
enrichment_results = ce.enrichment(df)

# [df2onehot] >Auto detecting dtypes.
# 100%|██████████| 18/18 [00:00<00:00, 53.55it/s]
# [df2onehot] >Set dtypes in dataframe..
# [hnet] >Analyzing [cat] Administrative...........................
# [hnet] >Analyzing [num] Administrative_Duration...........................
# [hnet] >Analyzing [cat] Informational...........................
# [hnet] >Analyzing [num] Informational_Duration...........................
# [hnet] >Analyzing [cat] ProductRelated...........................
# [hnet] >Analyzing [num] ProductRelated_Duration...........................
# [hnet] >Analyzing [num] BounceRates...........................
# [hnet] >Analyzing [num] ExitRates...........................
# [hnet] >Analyzing [num] PageValues...........................
# [hnet] >Analyzing [num] SpecialDay...........................
# [hnet] >Analyzing [cat] Month...........................
# [hnet] >Analyzing [cat] OperatingSystems...........................
# [hnet] >Analyzing [cat] Browser...........................
# [hnet] >Analyzing [cat] Region...........................
# [hnet] >Analyzing [cat] TrafficType...........................
# [hnet] >Analyzing [cat] VisitorType...........................
# [hnet] >Analyzing [cat] Weekend...........................
# [hnet] >Analyzing [cat] Revenue...........................
# [hnet] >Multiple test correction using holm
# [hnet] >Fin

# Make scatterplot and show the top n_feat enriched features per cluster.
ce.scatter(n_feat=2)

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

图 4. 带有统计显著特征的聚类标签散点图。图片由作者提供。

最后的话。

了解哪些特征驱动了聚类的形成对于从复杂数据集中提取有价值的见解至关重要。通过特征值为聚类上色的可视检查在处理具有大量特征、不同大小和密度的大型数据集时可能劳动密集且具有挑战性。clusteval库提供了一种定量方法,通过使用超几何检验和 Mann-Whitney U 检验分别对类别变量和连续变量与聚类标签之间的关联进行统计测试,从而评估聚类背后的驱动特征。

一个重要但具有挑战性的步骤是通过适当的数据标准化、距离度量选择和聚类评估来确保聚类的可信度。只有这样,聚类背后的驱动特征才能提供合理的信息。在线购物者意图的示例数据集展示了clusteval在识别聚类背后驱动特征方面的实际应用。总体而言,在聚类分析中结合定量方法来确定驱动特征可以极大地增强复杂数据集的可解释性和价值。

保持安全,保持冷静。

干杯 E.

如果你喜欢这篇关于聚类的博客,欢迎 关注我 以便随时了解我的最新内容,因为我写了更多类似的博客。如果你使用我的推荐链接,你可以支持我的工作,并且可以无限制地访问所有 Medium 博客。

软件

让我们联系吧!

参考资料

  1. E. Taskesen,从数据到聚类:你的聚类足够好吗?,2023 年 7 月 Medium。

  2. E. Taskesen,通过重要关联网络探索和理解你的数据,2021 年 8 月 Medium

从数据工程到提示工程

原文:towardsdatascience.com/from-data-engineering-to-prompt-engineering-5debd1c636e0?source=collection_archive---------1-----------------------#2023-05-22

使用 ChatGPT 解决数据准备任务

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

·

关注 发表在 Towards Data Science · 8 分钟阅读 · 2023 年 5 月 22 日

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

照片由 Ricardo Gomez Angel 提供,来源于 Unsplash

数据工程是数据科学过程中的一个重要部分。在 CRISP-DM 方法中,这个过程阶段被称为“数据准备”。它包括数据摄取、数据转换和数据质量保证等任务。在我们的文章中,我们使用 ChatGPT 和 Python 解决典型的数据工程任务。通过这样做,我们探讨了数据工程与新兴领域提示工程之间的联系。

介绍

在 2022 年 5 月,Stephen Wolfram 和 Lex Fridman 进行了题为“编程已死?”的深刻讲座。他们讨论了高层语言是否仍会被开发者使用。根据 Wolfram 的说法,许多编程任务可以用大型语言模型(LLMs)来自动化。在撰写本文时,这种模型的最突出例子是ChatGPT。自 2022 年末推出以来,它产生了惊人的结果。指定 LLM 要执行的操作被称为“提示工程”。如果 Wolfram 是对的,那么软件开发的部分工作将从编写代码转向编写提示。

在数据科学中,数据准备可能是一个耗时且繁琐的任务。那么为什么不尝试用 LLM 自动化呢?在接下来的部分,我们将用 ChatGPT 和 Python 处理不同的数据工程问题。我们没有自己编写 Python 代码,而是使用提示工程来生成代码。我们的实验于 2023 年 5 月 19 日进行,基于当时最新的免费 ChatGPT 版本(GPT-3.5)。

创建数据框

让我们从一个简单的问题开始,并从样本数据集中创建一个 Pandas 数据框。表格 1 包含了由世界银行提供的国家指标。

 |   Continent   |  Country |  Year |    Category   |   Variable  |  Value |
|---------------|----------|-------|---------------|-------------|--------|
| Asia          |  China   |  2022 |  Economy      |  GDP        |   18.1 |
| Asia          |  China   |  2022 |  Demographics |  Population |   1412 |
| North America |  USA     |  2022 |  Economy      |  GDP        |   25.5 |
| North America |  USA     |  2022 |  Demographics |  Population |    333 |
| Europe        |  Germany |  2022 |  Economy      |  GDP        |    3.9 |
| Europe        |  Germany |  2022 |  Demographics |  Population |     84 |

表格 1:包含国家指标的数据集

为了从上述样本创建数据框,我们开始了与 ChatGPT 的新对话,并发布了以下提示:

Create a Pandas table with the following data:
Continent, Country, Year, Category, Variable, Value
Asia, China, 2022, Economy, GDP, 18.1
Asia, China, 2022, Demographics, Population, 1412
North America, USA, 2022, Economy, GDP, 25.5
North America, USA, 2022, Demographics, Population, 333
Europe, Germany, 2022, Economy, GDP, 3.9
Europe, Germany, 2022, Demographics, Population, 84

提示 1:创建数据框

作为回应,模型生成了以下 Python 代码:

import pandas as pd

data = {
    'Continent': ['Asia', 'Asia', 'North America', 'North America', 'Europe', 'Europe'],
    'Country': ['China', 'China', 'USA', 'USA', 'Germany', 'Germany'],
    'Year': [2022, 2022, 2022, 2022, 2022, 2022],
    'Category': ['Economy', 'Demographics', 'Economy', 'Demographics', 'Economy', 'Demographics'],
    'Variable': ['GDP', 'Population', 'GDP', 'Population', 'GDP', 'Population'],
    'Value': [18.1, 1412, 25.5, 333, 3.9, 84]
}

df = pd.DataFrame(data)
print(df)

响应 1:数据框创建代码

运行脚本时,我们看到输出符合我们的规范:

 Continent  Country  Year      Category    Variable   Value
0           Asia    China  2022       Economy         GDP    18.1
1           Asia    China  2022  Demographics  Population  1412.0
2  North America      USA  2022       Economy         GDP    25.5
3  North America      USA  2022  Demographics  Population   333.0
4         Europe  Germany  2022       Economy         GDP     3.9
5         Europe  Germany  2022  Demographics  Population    84.0

即使我们使用了一个样本进行实验,接下来的代码原则上也可以处理更大的数据集。

数据框的透视

对于数据科学而言,我们用第一个提示创建的表格结构并不理想。相反,所谓的“平面表”会更方便。在表格 1 中,指标“GDP”和“Population”由名为“Variable”和“Value”的两列表示。相比之下,平面表将包含每个指标的单独列,如表格 2 所示。

 |   Continent   |  Country |  Year |  GDP  |  Population |
|---------------|----------|-------|-------|-------------|
| Asia          |  China   |  2022 |  18.1 |        1412 |
| North America |  USA     |  2022 |  25.5 |         333 |
| Europe        |  Germany |  2022 |   3.9 |          84 |

表格 2:包含国家指标的平面表

将表格 1 的格式转换为表格 2 的格式称为“透视”。让我们尝试用 ChatGPT 解决这个任务。为此,我们在对话中发布了第二个提示:

Transform the table into the following format:
Continent, Country, Year, GDP, Population
Asia, China, 2022, 18.1, 1412
North America, USA, 2022, 25.5, 333
Europe, Germany, 2022, 3.9, 84

提示 2:数据框透视

上述信息基于所需数据格式的示例。我们本可以用纯口头方式表述我们的请求。与经典编程一样,提示工程中有替代解决方案来实现目标。找到最佳方式将是未来令人兴奋的任务。作为我们提示的结果,ChatGPT 调整了 Python 代码如下:

import pandas as pd

data = {
    'Continent': ['Asia', 'Asia', 'North America', 'North America', 'Europe', 'Europe'],
    'Country': ['China', 'China', 'USA', 'USA', 'Germany', 'Germany'],
    'Year': [2022, 2022, 2022, 2022, 2022, 2022],
    'Category': ['Economy', 'Demographics', 'Economy', 'Demographics', 'Economy', 'Demographics'],
    'Variable': ['GDP', 'Population', 'GDP', 'Population', 'GDP', 'Population'],
    'Value': [18.1, 1412, 25.5, 333, 3.9, 84]
}

df = pd.DataFrame(data)

# Pivot the table
pivot_df = df.pivot_table(index=['Continent', 'Country', 'Year'], columns='Category', values='Value').reset_index()

# Rename the columns
pivot_df.columns.name = None
pivot_df.columns = [column if column != 'Variable' else None for column in pivot_df.columns]

print(pivot_df)

响应 2:透视代码

然而,运行脚本的第二个版本显示的输出并不是我们所请求的:

 Continent  Country  Year  Demographics  Economy
0           Asia    China  2022        1412.0     18.1
1         Europe  Germany  2022          84.0      3.9
2  North America      USA  2022         333.0     25.5

而不是预期的列“GDP”和“人口”,表中包含两列名为“人口统计”和“经济”。为了解决这个问题,我们发布了下一个提示:

The columns are not correct, you should have used 
the variables GDP and population

提示 3:修复枢轴代码

对此,模型纠正了错误并生成了 Python 代码的另一版本:

import pandas as pd

data = {
    'Continent': ['Asia', 'Asia', 'North America', 'North America', 'Europe', 'Europe'],
    'Country': ['China', 'China', 'USA', 'USA', 'Germany', 'Germany'],
    'Year': [2022, 2022, 2022, 2022, 2022, 2022],
    'Category': ['Economy', 'Demographics', 'Economy', 'Demographics', 'Economy', 'Demographics'],
    'Variable': ['GDP', 'Population', 'GDP', 'Population', 'GDP', 'Population'],
    'Value': [18.1, 1412, 25.5, 333, 3.9, 84]
}

df = pd.DataFrame(data)

# Pivot the table
pivot_df = df.pivot_table(index=['Continent', 'Country', 'Year'], columns='Variable', values='Value').reset_index()

# Rename the columns
pivot_df.columns.name = None
pivot_df.columns = ['Continent', 'Country', 'Year', 'GDP', 'Population']

print(pivot_df)

响应 3:修正的枢轴代码

运行脚本显示,这次实施了正确的枢轴:

 Continent  Country  Year   GDP  Population
0           Asia    China  2022  18.1      1412.0
1         Europe  Germany  2022   3.9        84.0
2  North America      USA  2022  25.5       333.0

丰富数据框

另一个典型的数据工程任务是用额外信息丰富数据集。为此目的,我们要求 ChatGPT 通过发布以下提示为我们的数据添加ISO 国家代码

For each country, in the table above, add its ISO code

提示 4:添加国家代码

结果,模型调整了响应并返回了以下代码片段:

import pandas as pd

data = {
    'Continent': ['Asia', 'Asia', 'North America', 'North America', 'Europe', 'Europe'],
    'Country': ['China', 'China', 'USA', 'USA', 'Germany', 'Germany'],
    'Year': [2022, 2022, 2022, 2022, 2022, 2022],
    'Category': ['Economy', 'Demographics', 'Economy', 'Demographics', 'Economy', 'Demographics'],
    'Variable': ['GDP', 'Population', 'GDP', 'Population', 'GDP', 'Population'],
    'Value': [18.1, 1412, 25.5, 333, 3.9, 84]
}

iso_codes = {
    'China': 'CN',
    'USA': 'US',
    'Germany': 'DE'
}

df = pd.DataFrame(data)

# Add ISO code column
df['ISO Code'] = df['Country'].map(iso_codes)

# Pivot the table
pivot_df = df.pivot_table(index=['Continent', 'Country', 'ISO Code', 'Year'], columns='Variable', values='Value').reset_index()

# Rename the columns
pivot_df.columns.name = None
pivot_df.columns = ['Continent', 'Country', 'ISO Code', 'Year', 'GDP', 'Population']

print(pivot_df)

响应 4:带有国家代码的数据框

运行脚本显示,数据框已添加了 ISO 代码的新列。

 Continent  Country ISO Code  Year   GDP  Population
0           Asia    China       CN  2022  18.1      1412.0
1         Europe  Germany       DE  2022   3.9        84.0
2  North America      USA       US  2022  25.5       333.0

派生一个列

让我们接下来通过将一个国家的 GDP 除以其人口大小来派生一个新列“人均 GDP”。为此,我们发送了这个提示:

Derive a new column "GDP per capita" by dividing the GDP 
of a country by its population size

提示 5:派生一个新列

对此,模型修改了代码如下:

import pandas as pd

data = {
    'Continent': ['Asia', 'Asia', 'North America', 'North America', 'Europe', 'Europe'],
    'Country': ['China', 'China', 'USA', 'USA', 'Germany', 'Germany'],
    'Year': [2022, 2022, 2022, 2022, 2022, 2022],
    'Category': ['Economy', 'Demographics', 'Economy', 'Demographics', 'Economy', 'Demographics'],
    'Variable': ['GDP', 'Population', 'GDP', 'Population', 'GDP', 'Population'],
    'Value': [18.1, 1412, 25.5, 333, 3.9, 84]
}

iso_codes = {
    'China': 'CN',
    'USA': 'US',
    'Germany': 'DE'
}

df = pd.DataFrame(data)

# Add ISO code column
df['ISO Code'] = df['Country'].map(iso_codes)

# Pivot the table
pivot_df = df.pivot_table(index=['Continent', 'Country', 'ISO Code', 'Year'], columns='Variable', values='Value').reset_index()

# Calculate GDP per capita
pivot_df['GDP per capita'] = pivot_df['GDP'] / pivot_df['Population']

# Rename the columns
pivot_df.columns.name = None
pivot_df.columns = ['Continent', 'Country', 'ISO Code', 'Year', 'GDP', 'Population', 'GDP per capita']

print(pivot_df)

响应 5:带有新列的数据框

输出显示脚本产生了预期的结果:

 Continent  Country ISO Code  Year   GDP  Population  GDP per capita
0           Asia    China       CN  2022  18.1      1412.0        0.012819
1         Europe  Germany       DE  2022   3.9        84.0        0.046429
2  North America      USA       US  2022  25.5       333.0        0.076577

分析数据

一旦数据转换完成,实际分析就可以开始了。最后让我们计算国家的 GDP 和人口之间的相关系数。为此,我们发布了最后一个提示:

Use the table above to calculate the correlation coefficient between 
the GDP and the population of the countries

提示 6:分析相关性

因此,模型返回了以下代码片段:

import pandas as pd

data = {
    'Continent': ['Asia', 'Asia', 'North America', 'North America', 'Europe', 'Europe'],
    'Country': ['China', 'China', 'USA', 'USA', 'Germany', 'Germany'],
    'Year': [2022, 2022, 2022, 2022, 2022, 2022],
    'Category': ['Economy', 'Demographics', 'Economy', 'Demographics', 'Economy', 'Demographics'],
    'Variable': ['GDP', 'Population', 'GDP', 'Population', 'GDP', 'Population'],
    'Value': [18.1, 1412, 25.5, 333, 3.9, 84]
}

df = pd.DataFrame(data)

# Pivot the table
pivot_df = df.pivot_table(index=['Continent', 'Country', 'Year'], columns='Variable', values='Value').reset_index()

# Calculate correlation coefficient
correlation_coefficient = pivot_df['GDP'].corr(pivot_df['Population'])

print("Correlation Coefficient: {:.3f}".format(correlation_coefficient))

响应 6:分析相关性的代码

运行脚本时,我们发现这两个变量之间存在正相关,这并不令人意外:

Correlation Coefficient: 0.350

结论

诚然,我们的实验基于一个简单的数据集。尽管如此,结果令人瞩目。我们完成了多项数据工程任务,而不用写一行代码。ChatGPT 不仅在大多数情况下能够正确实现我们的提示,即使在模型犯错时,它也能够反思并修正。正如在软件开发中一样,生成的代码必须经过测试。此外,它可能需要重构和优化。在 AI 时代,使用 pylint 仍然是个好主意。总结来说,然而,我们不得不同意沃尔夫勒姆的观点:未来,数据工程的重要部分将从编码转向提示工程。这种新方法不会取代数据工程师,但会让他们变得更高效。

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

关于作者

克里斯蒂安·科赫是 BWI GmbH 的企业架构师,同时也是纽伦堡理工大学乔治·西蒙·奥姆学院的讲师。

马库斯·施塔迪是 Dehn SE 的高级云数据工程师,多年来一直从事数据工程、数据科学和数据分析工作。

卢卡斯·伯勒 是 TeamBank AG 的数据架构师,专注于设计和实施强大的数据分析架构。

从数据湖到数据网:最新企业数据架构指南

原文:towardsdatascience.com/from-data-lakes-to-data-mesh-a-guide-to-the-latest-enterprise-data-architecture-d7a266a3bc33

了解为什么大型公司正在接受数据网

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

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

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

图片来源:takahiro takuchi (Unsplash)

全球大型组织正在经历重大‘数据地震’。

这是公司数据湖向数据网去中心化

在我曾经在澳大利亚‘四大’银行之一从事分析工作的半个十年中,我们正处于一次巨大的转型旅程中,同时构建多个重要基础设施项目:

  • 云原生数据平台迁移至 Azure PaaS;

  • 一系列战略数据产品的构建;

  • 我们的数据湖融合成去中心化的数据网

不过我得承认……这对我们可怜的老数据分析师和数据科学家来说有点破坏性。

想象一下在房间装修的时候尝试做书法。

更新:我现在在YouTube发布分析内容。

数据湖——数据科学家喜欢从中“饮水”的热门目的地——目前正像面团一样被拆解,并作为网的一部分被分配到各个业务领域。

一些数据科学家带着好奇心观看;其他人则因沮丧而叹息;还有些人则激动得难以置信

为什么?

因为数据网格承诺成为一个真正可扩展的数据平台,其中数据被视为一等公民。数据科学家将可以访问可发现、可靠且可重用的数据资产,这些资产可以在公司内不同的业务领域之间无缝共享。

正如人们所说的,短期痛苦换取长期收益

在这篇文章中,我将深入探讨如何……

  • 数据湖成为了瓶颈

  • 为什么组织现在去中心化他们的数据湖,转向数据网格

  • 如何在公司中构建一个网状基础设施。

1. 数据湖的简史

企业数据环境在过去十年里发展得非常快。

在 2010 年代中期,数据湖在全球范围内开始流行。这个概念实际上已经存在了几十年,但在这一时期,构建这些集中式数据存储庞物所需的技术才变得可行。

时机也相当好。

智能手机、物联网(IoT)、数字和社交媒体以及电子商务的爆炸式增长促成了大数据的兴起,随着这一趋势,组织迫切需要存储大量非结构化数据,并利用数据分析和机器学习从中提取见解。

数据湖提供了一种可扩展和灵活的解决方案,无需预定义模式,不同于数据仓库。

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

数据科学、机器学习和大数据的交集。作者图片

那么运行在这些之上的软件呢?

进入Apache Hadoop,一个开源框架,提供了分布式存储(HDFS)和分布式计算(MapReduce)功能,用于处理湖中的大数据。

Hadoop 的起源可以追溯到 2000 年代初期,Yahoo! 研究人员发表的一对开创性 论文。到 2010 年,Facebook 自豪地拥有全球最大的 Hadoop 集群,储存量达 21 PB

几年后,半数《财富》50 强公司已经采用了这一框架。

Hadoop 通过使用廉价的消费级机器(商品硬件)和大数据处理能力,实现了成本效益高的存储,这使其成为全球寻求构建数据湖的组织的有吸引力的选择。

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

自 2010 年代中期以来,基于大数据的预测模型迅猛增长。图像来源于作者

接下来是云计算,它在 2015 到 2020 年间 迅速崛起

Amazon Web Services (AWS)、Microsoft AzureGoogle Cloud Platform (GCP) 这样的巨头提供了可扩展的存储解决方案,如 Amazon S3、Azure Data Lake Storage 和 Google Cloud Storage。

结果是,许多组织将其本地的数据湖迁移到云上,使它们能够灵活适应变化的工作负载,随心所欲地扩展和收缩,只为实际使用的部分付费。

微软现在甚至提供 SaaS 云分析平台,将数据仓库、大数据、数据工程和数据管理 汇聚在一个平台下

这不是美好时光吗?

嗯……

2. 数据湖怪兽

架构师和数据网格发明者 Zhamek Dehghani 浓缩了企业数据平台的历史为三个阶段:

第一代专有企业数据仓库和商业智能平台;这些解决方案价格昂贵,使得公司背负了大量技术债务,涉及成千上万无法维护的 ETL 任务,以及只有少数专业人员理解的表格和报告,导致对业务的积极影响未能完全实现。

第二代以数据湖为银弹的大数据生态系统;由中心团队的超专业数据工程师操作的复杂大数据生态系统和长期运行的批处理作业创造了数据湖怪兽,这些怪兽在最好的情况下仅能支持少量的研发分析;承诺过高而实现不足。

第三代:或多或少与上一代相似,但现代化地向实时数据可用性进行流式处理,统一批处理和流处理以进行数据转换,并完全拥抱基于云的托管服务来处理存储、数据管道执行引擎和机器学习平台。

她的言辞确实很直白。

数十年的数据仓库使组织 沉溺于一个由混乱数据管道连接的数据系统的海洋中。魔法解决方案原本是将数据集中到一个中央存储库中。不幸的是,数据湖梦想在许多组织中变成了数据湖的沼泽

充满了大量未被利用的数据和未解决的数据质量问题,水变得陈旧

过度集中任何事物可能会打开一个麻烦缸,通常在一段动荡时期后,会导致剧烈的回归去中心化。我们在各个方面的人类社会中都可以看到这一点:

  • 商业 → 公司趋向于更水平的层级结构;

  • 财务 → 去中心化资产的兴起,如比特币,以太坊和索拉纳

  • 经济学 → 计划经济采用资本主义;

  • 政府 → 决定性的政变或人民的革命。

企业数据经历了其数据湖实验形式的过度集中化。

这是 Dehghani 描述的后果,称之为‘失败模式’。哎呦。

问题 1 — 集中化的难题!

我们得到一个集中化的 领域无关的多面手数据平台,由一个过度劳累的集中化数据团队管理,他们并不是他们处理的数据的专家。

这个高超的数据工程团队被期望从所有企业角落和所有业务领域中摄取操作和交易数据。

他们还需要清洗、丰富和转换数据,以满足多样化的消费者的需求,如 仪表板 和 报告的数据分析师,以及 建模的数据科学家。

哎呀!这要求太高了。

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

数据湖的 ETL 管道。这些管道由一个集中化的数据团队构建。来源:Z. Dehghani 在 MartinFowler.com(已获许可)

随着全球组织竞相成为数据驱动的组织以保持竞争力,处理来自多个业务领域决策者的所有分析问题的需求落在了这个集中化团队的灵活性上。

这成为了一个重大问题。

这些倒霉的数据工程师没有时间。

对操作数据库进行调整后,留下了一条通往集中化数据湖的破损 ETL 管道。

团队面临不断的管道待修补,几乎没有时间专注于理解他们从整个组织中提取或推送给数据科学家的特定领域数据。

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

中央数据团队成为了瓶颈。来源: 数据网格架构(经许可使用)

结果——在一些初步的快速成功之后,全球的中央数据团队遇到了巨大的可扩展性问题,成为组织敏捷性的瓶颈。

总结来说——就像一场狂野的派对,数据仓库像五彩纸屑一样传播技术债务,让每个人及其宠物仓鼠创建数据管道。

然后数据湖抢占了风头,通过将数据管道的创建压缩到公司内的一个单点,策划了一场盛大的集中化表演。

现在的公司发现自己不得不通过中央数据团队的小管道来满足整个分析师、数据科学家和经理队伍的无限数据需求。

要点:

也许去中心化数据湖到领域特定团队可能是值得追求的理想位置?

问题 2 — 迟钝的操作模型

Dehghani 描述了第二个问题,即耦合管道分解,其中数据湖……

“……在管道的各个阶段之间有较高的耦合,以交付独立的功能或价值。它是正交分解到变化的轴线的。”

这不容易理解,除非你是一个建筑领域的专家,所以让我用一个个人的例子来说明。

几年前,我工作的银行将整个组织结构从职能操作模型转变为业务线模型。

这是什么意思?我将通过关注抵押贷款销售表现不佳来说明——这是任何传统银行的核心业务。

在职能模型下,有人负责抵押贷款产品开发,有人负责分销和销售,还有人负责法律、风险和合规等事务。

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

图片由作者提供

这导致了对不佳表现缺乏问责,因为这些职能高度耦合,需要这些跨职能团队彼此协作,以交付端到端的抵押贷款产品。

换句话说,变化的轴线是产品的方向:抵押贷款、信用卡、商业贷款等,但工作管道却是正交分解的,将每个产品切分为一堆高度耦合的职能。

很糟糕,很糟糕,很糟糕。

在新的业务部门模型下,一位高级主管负责抵押贷款业务。一位高级主管负责信用卡。一位高级主管负责商业贷款。

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

图片由作者提供

现在,管道与变化的轴线平行。方向舵和船只现在已经对齐。

这驱动了:

  • 问责制 — 如果抵押贷款表现不佳,C-Suite 先生没有奖金。

  • 灵活性 — 抵押贷款业务可以迅速围绕新项目进行重组和创新。变化更容易、更快。

  • 性能 — 灵活性和创新带来更快交付的更好产品和服务。

回到数据湖。

结果是,他们也本质上使用了一种功能性的方法来组织工作,其中数据管道被分解为处理阶段,如 源头摄取处理服务 数据。

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

数据管道中的处理阶段。来源:Z. Dehghani 于 MartinFowler.com(已授权)

就像我的银行例子一样,这些处理阶段是高度耦合的。

那么,正在构建信用评分模型的数据科学团队是否突然需要不同的数据?这意味着需要处理不同的数据,这可能意味着需要获取和摄取新的数据。

这意味着我们集中化的数据团队需要管理大量不断演变的依赖关系,从而导致数据交付变慢且缺乏灵活性。

实际上,这些依赖关系意味着整个数据湖中的管道是最小的变更单元,必须进行修改以适应新功能。

因此,我们说数据湖是单体数据平台。

这实际上是一个难以更改和升级的大块内容,正如 Dehghani 主张

“…限制了我们在响应新消费者或数据源时实现更高速度和规模的能力。”

要点:

我们是否可以通过将数据湖去中心化为更模块化的架构来解决这个问题,并让业务领域对其数据承担端到端责任

问题 3 — 围栏投掷

Dehghani 称第三种也是最后一种失败模式为隔离和超专业化的所有权,我认为这导致了无效的围栏投掷

我们在数据湖工作的超专业大数据工程师与数据的来源和消费地点组织上是隔离的。

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

隔离的超专业化数据平台团队。来源:Z. Dehghani 于 MartinFowler.com(已授权)

这创造了一个不良的激励结构,无法促进良好的交付成果。Dehghani 表达为……

“我个人不羡慕数据平台工程师的生活。他们需要从没有提供有意义、真实和正确数据的团队那里获取数据。这些团队对生成数据的源领域了解甚少,缺乏领域专业知识。他们需要为多样化的需求(无论是操作性的还是分析性的)提供数据,但对数据的应用和访问消费领域专家了解不多。

我们发现的是断开的源团队,沮丧的消费者争夺数据平台团队待办事项上的位置,以及过度扩展的数据平台团队。”

数据生产者将‘打包’一些数据,并将其抛给数据工程师。

现在是你们的问题了!祝大家好运!

超负荷的数据显示,数据工程师可能没有公正地处理摄取的数据,因为他们不是数据领域专家,他们会将一些处理过的数据从数据湖中抛出,以服务下游消费者。

祝好运,分析师和数据科学家!是时候小憩一下,然后我将去修复我待办事项上的五十个破损的 ETL 管道。

从问题 2 和 3 可以看出,数据湖实验中出现的挑战既是组织性的也是技术性的。

要点:

通过将数据管理下放到各个业务领域,也许我们可以促进数据所有权和协作的文化,并赋予数据生产者、工程师和消费者共同合作的能力

对了,我们能否让这些领域真正参与进来?

通过激励他们以数据作为热销产品对待,赋予他们为建立战略数据资产感到自豪的动力。

喜欢这个故事吗?当我发布类似文章时,请获取一个邮件

3. 介绍……数据网格!

在 2019 年,Dehghani 提出了数据网格作为下一代数据架构,倡导去中心化的数据管理方法。

她的初始文章——这里这里——在企业数据社区中引起了广泛关注,这促使许多全球组织开始了自己的数据网格之旅,包括我的。

数据网格不是将数据泵送到集中式数据湖,而是将数据所有权和处理下放到特定领域的团队,这些团队控制和交付数据产品,促进数据在整个组织中的易访问性和互联互通,加快决策速度并促进创新。

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

数据网格概述。来源:数据网格架构(经许可)

数据网格的梦想是创建一个基础,以规模化提取分析数据的价值,规模化的应用包括:

  • 不断变化的业务、数据和技术环境。

  • 数据生产者和消费者的增长。

  • 多样化的数据处理需求。各种使用案例要求多样化的工具进行转换和处理。例如,实时异常检测可能利用Apache Kafka;客户支持的 NLP 系统常常导致在像NLTK这样的 Python 包上进行数据科学原型设计,图像识别利用像TensorFlowPyTorch这样的深度学习框架;我银行的欺诈检测团队希望使用Apache Spark处理我们的大数据。

所有这些需求都为数据仓库带来了技术债务(表现为大量无法维护的 ETL 作业),并且对数据湖造成了瓶颈(由于大量的多样化工作被挤压到一个小型集中数据团队中)。

组织最终会面临技术债务超过提供的价值的复杂性门槛。

这是一种糟糕的情况。

为了解决这些问题,Dehghani 提出了四项原则,任何数据网格的实施都必须体现这些原则,以实现规模、质量和可用性的承诺。

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

数据网格的四项原则。来源:数据网格架构(已获许可)

  1. 数据的领域所有权: 通过将数据所有权交给领域特定的团队,你赋能于离数据最近的人来负责。这种方法提高了应对业务需求变化的敏捷性,并增强了利用数据驱动洞察的有效性,最终导致更好、更具创新性的产品和服务,且速度更快。

  2. 数据即产品: 每个业务单元或领域都被赋予产品思维,以设计、拥有和改进高质量且可重用的数据产品——由数据的生产者视为产品的自包含且可访问的数据集。目标是发布和共享数据产品给其他领域的消费者——被视为网格上的节点——以便所有人都能利用这些战略数据资产。

  3. 自助数据平台: 赋能用户自助能力为加速数据访问和探索铺平道路。通过提供一个用户友好的平台,配备必要的工具、资源和服务,你使团队能够在数据需求方面变得自给自足。数据的民主化促进了更快的决策制定和数据驱动的卓越文化。

  4. 联合治理: 集中控制扼杀了创新并阻碍了敏捷性。联合的方法确保决策权分布在各个团队中,使他们在关键时刻能够自主决策。通过在控制与自主之间取得正确的平衡,你可以促进问责、协作和创新。

四个原则中,数据产品是最关键的。因此,我们常常看到公司同时执行他们的数据产品战略,并在各个业务领域分散他们的数据湖。

阅读我的解释 101,了解有关数据产品的所有详细信息。

关于执行数据网战略的话题…

4. 如何构建数据网

对于大多数公司来说,这段旅程不会是干净整洁的。

构建数据网不会是一个被 relegated 给一个隔离的工程团队在地下室里辛苦工作的任务,直到准备好部署。

你可能需要巧妙地逐步联合你现有的数据湖,直到你达到一个‘足够的数据网’的平台。

想象在飞行中将两个飞机引擎换成四个较小的引擎,而不是在一个阴凉的机库里建造一架新飞机。

或者尝试在保持部分车道通行的同时升级道路,而不是在附近铺设一条新的道路并在一切就绪时剪彩。

构建数据网是一个重大的任务,你需要在所有阶段让业务共同参与。因为最终将由业务领域来管理自己的端到端数据事务!

完全的数据网成熟可能需要很长时间,因为数据网主要是一种组织构造。

它同样涉及运营模型——换句话说,人员和流程——,以及技术本身,这意味着文化提升和带领人们一起前行是至关重要的。

你需要教会组织数据网的价值以及如何使用它。

正确处理你的策略,随着时间的推移,你的集中式领域无关的单体数据湖将转变为去中心化领域导向的模块化数据网

设计阶段的一些考虑因素。查看 datamesh-architecture.com 以深入了解。

  • 领域。 数据网格架构由一组业务领域组成,每个领域都有一个领域数据团队,能够自行进行跨领域的数据分析。一个支持团队——通常是组织的转型办公室的一部分——在整个组织中推广网格的理念,并作为倡导者。他们以咨询的方式帮助各个领域在成为数据网格的“完整成员”的过程中。支持团队将由数据架构、数据分析、数据工程和数据治理方面的专家组成。

  • 数据产品。 各领域将摄取自己操作的数据——这些数据离他们很近,他们对此非常了解——并构建作为数据产品的数据分析模型,这些模型可以发布到网络上。数据产品由领域所有,领域负责其运营、质量和在整个生命周期中的提升。有效的问责制确保数据的有效性。

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

数据产品在网格上的共享。来源:数据网格架构(经许可使用)

  • 自助服务。 还记得学校里的‘多文化食物日’吗?那天每个人都带来自己美味的菜肴,并在自助餐桌上共享?老师的简约角色是监督操作,确保一切顺利进行。同样,网格中新精简的中央数据团队致力于提供和维护一个领域无关的多样数据产品的‘自助餐桌’,供大家自取。业务团队可以进行自己的分析,开销较小,并将自己的数据产品提供给同行。这是一场美味的数据盛宴,每个人也都可以是厨师。

  • 联邦治理。每个领域将自行管理自己的数据,并有权按照自己的节奏行动——就像欧盟成员国一样。在某些方面,如果有必要团结和标准化,他们将与其他领域在联邦治理小组中达成协议,制定全球政策,如文档标准、互操作性和安全性——就像欧洲议会一样——以便各个领域能够轻松发现、理解、使用和整合在网格上可用的数据产品。

这里有激动人心的一点——我们的网格什么时候会达到成熟

当团队开始使用其他领域的数据产品时,网格就会显现出来。

这作为一个有用的基准,旨在证明你的数据网格旅程已经达到了一个成熟的门槛水平。

这是庆祝的好时机!

5. 最后的话

数据网格是一个相对较新的概念,约在 2018 年由架构师扎梅克·德赫戈尼发明。

随着越来越多的组织应对集中式数据湖的扩展性问题,这一理念在数据架构和分析社区中获得了显著的关注。

通过摆脱 由单一团队控制数据的组织结构,转向由使用数据最多的团队拥有和管理数据的去中心化模型,组织的不同部分可以独立工作——拥有更大的自主权和敏捷性——同时仍然确保数据的一致性、可靠性和良好治理。

数据网格提倡一种责任、所有权和协作的文化,其中 数据被产品化并被视为一等公民,以无缝且受控的方式在公司内部自豪地共享。

目标是实现一个真正可扩展且灵活的数据架构,以符合现代组织的数据中心驱动业务价值和创新的需求。

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

总结数据网格的四个原则。来源:Z. Dehghani 于 MartinFowler.com(已获许可)

我公司自身的历程 预计需要几年时间完成主要迁移,完全成熟则需要更长时间。

我们正在同时处理三个主要部分:

  • 云。 从我们在 Microsoft Azure 上的 Cloudera 堆栈的 IaaS 升级到 Azure PaaS 的原生云服务。更多信息请参见这里

  • 数据产品。 初始的一系列基础数据产品正在推出,可以像 Lego 积木一样在不同组合中使用和重新组合,形成更大、更有价值的数据产品。

  • 网格。 我们将数据湖去中心化,目标是至少五个节点。

这真是一段奇妙的旅程。当我五年前开始时,我们才刚刚开始利用 Apache Hadoop 在本地基础设施上构建数据湖。

无数的挑战和宝贵的经验塑造了我们的旅程。

像任何决心坚定的团队一样,我们迅速失败并从失败中前进。五年短暂的时间里,我们已经完全转变了企业数据环境。

谁知道五年后的情况会是什么样子?我期待着。

Twitter 和 YouTube 这里这里 以及 这里 找到我。

我的人气 AI、ML 和数据科学文章

  • AI 和机器学习:快速入门 — 这里

  • 机器学习与机械建模 — 这里

  • 数据科学:现代数据科学家的新技能 — 这里

  • 生成式 AI:大公司如何争相采纳 — 这里

  • ChatGPT 与 GPT-4:OpenAI 如何赢得 NLU 战争 — 这里

  • GenAI 艺术:DALL-E, Midjourney 与 Stable Diffusion 解析 — 这里

  • 超越 ChatGPT:寻找真正智能的机器 — 这里

  • 现代企业数据战略解析 — 这里

  • 从数据仓库和数据湖到数据网格 — 这里

  • 从数据湖到数据网格:最新架构指南 — 这里

  • Azure Synapse Analytics 实战:7 个用例解析 — 这里

  • 云计算 101:为您的业务利用云计算 — 这里

  • 数据仓库与数据建模 — 快速速成课程 — 这里

  • 数据产品:为分析建立坚实的基础 — 这里

  • 数据民主化:5 种“数据普及”策略 — 这里

  • 数据治理:分析师的 5 个常见痛点 — 这里

  • 数据讲故事的力量 — 销售故事,而非数据 — 这里

  • 数据分析入门:谷歌方法 — 这里

  • Power BI — 从数据建模到惊艳报告 — 这里

  • 回归分析:使用 Python 预测房价 — 这里

  • 分类:使用 Python 预测员工流失 — 这里

  • Python Jupyter Notebook 与 Dataiku DSS 的对比 — 点击这里

  • 浅析流行的机器学习性能指标 — 点击这里

  • 在 AWS 上构建 GenAI — 我的首次体验 — 点击这里

  • COVID-19 的数学建模与机器学习 — 点击这里

  • 工作的未来:在 AI 时代你的职业安全吗 — 点击这里

从数据平台到机器学习平台

原文:towardsdatascience.com/from-data-platform-to-ml-platform-4a8192edab5d?source=collection_archive---------0-----------------------#2023-10-22

数据/机器学习平台如何演变并支持复杂的 MLOps 实践

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

·

关注 发表在Towards Data Science · 9 分钟阅读 · 2023 年 10 月 22 日

数据/机器学习(Data/ML)一直是我们技术领域中最受欢迎的话题。我想分享一下我对数据/机器学习平台的理解,以及这些平台如何从基础发展到复杂。最后,我会尽力涵盖 MLOps,即管理机器学习项目的原则。

关于我,这里是我的 LinkedIn

旅程的开始:在线服务 + OLTP + OLAP

在最开始时,数据基础设施可能相当简单。分析查询可能会发送到在线OLTP 数据库的只读副本,或者设置 OLAP 数据库作为数据仓库。

这里是可能的基础设施:

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

图片来源:作者

只要系统能够满足业务需求,就没有问题。满足我们业务需求的所有系统都是好的系统。如果它们简单,那就更好。

在这个阶段,有多种数据分析方法:

  1. 仅向 OLTP 数据库的副本节点提交查询。(不推荐)

  2. 启用 OLTP 数据库的 CDC(变更数据捕捉)并将这些数据导入到 OLAP 数据库。关于 CDC 日志的导入服务选项,你可以根据所选择的 OLAP 数据库来选择。例如,Flink 数据流与 CDC 连接器 是处理此问题的一种方式。许多企业服务提供自己的建议解决方案,例如 Snowpipe 适用于 Snowflake。也建议从副本节点加载数据,以保持主节点的 CPU/IO 带宽用于在线流量。

在这个阶段,ML 任务可能在本地环境中运行。你可以在本地设置一个 Jupyter 笔记本,从 OLAP 数据库加载结构化数据,然后在本地训练 ML 模型。

这种架构的潜在挑战包括但不限于:

  • 使用 OLAP 数据库管理非结构化或半结构化数据是困难的。

  • 当处理海量数据时,OLAP 可能会出现性能回退。(单个 ETL 任务需要 TB 以上的数据)

  • 对各种计算引擎的支持不足,例如 Spark 或 Presto。大多数计算引擎确实支持通过 JDBC 端点连接到 OLAP,但并行处理会受到 JDBC 端点自身的 IO 瓶颈严重限制。

  • 存储海量数据在 OLAP 数据库中的成本很高。

你可能已经知道解决此问题的方向。建立一个数据湖!引入数据湖并不一定意味着你需要完全淘汰 OLAP 数据库。公司中有两种系统共存以满足不同用例仍然很常见。

数据湖:存储计算分离 + 写时模式

数据湖允许你持久化非结构化和半结构化数据,并执行按需模式。它允许你通过使用专门的存储解决方案存储大量数据来降低成本,并根据需求启动计算集群。它还允许你通过扩展计算集群轻松管理 TB/PB 数据集。

你的基础设施可能如下所示:

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

作者提供的图片

这确实是一个过于简化的图示。数据湖的实际实现可能要复杂得多。

现在许多云服务提供商已经有相当成熟的数据湖存储解决方案,例如 AWS S3 和 Azure ADLS。在这些存储解决方案之上仍然需要完成许多任务。例如,应该有一个 Hive metastore 来管理你的表元数据,以及一个 Datahub 提供数据可视性。还有一些具有挑战性的话题,如 数据湖中的精细权限控制数据血缘分析(例如 spline)

为了最大化你的数据湖的价值和效率,我们应该仔细选择每个数据湖层的文件格式和平均文件大小。

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

作者提供的图片

一般建议包括:

  • 避免小文件:小文件是数据湖中高存储成本和性能差的主要原因之一。

  • 延迟压缩 比率性能 之间的平衡:具有文件格式如 Hudi 的低延迟数据湖表可能不会给你最佳的压缩比,而大容量的 ORC 文件高压缩比可能会带来性能噩梦。你可能需要根据表的使用模式、延迟要求和表大小来明智地选择文件格式。

一些成熟的 SaaS/PaaS 提供商如 Databricks 提供了相当不错的数据湖(或现在的 LakeHouse)解决方案。你也可以探索 ByteHouse 以获得统一的大数据分析体验。

在机器学习方面,团队可能会开始在远程环境中探索成熟的机器学习框架,如 Tensorflow 和 Pytorch。此外,训练好的机器学习模型可以部署到生产环境中进行在线模型推理。Tensorflow 和 Pytorch 都提供了服务解决方案,例如 TensorFlow Serving 和 Pytorch Serving。

然而,我们的旅程不会就此停止。我们现在可能面临以下挑战:

  • 缺乏实时指标和特征管理,这对在线机器学习模型服务至关重要。

  • 缺乏模型性能监控。

让我们进一步提升我们的游戏水平。

实时数据/机器学习基础设施:数据流 + 数据流媒体 + 特征存储 + 指标服务器

通常,构建实时数据基础设施是公司多个部门的共同努力。构建数据流的初衷通常不是为了数据/机器学习系统,而是通过消除同步调用来允许微服务进一步扩展。相反,微服务将通过与像 Kafka 这样的消息中间件进行通信而提高效率(代价是较低的一致性水平)。

整体架构可能如下所示。

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

作者提供的图片

有了在数据河流(例如Kafka)中的数据,我们可以构建数据流管道来处理实时数据。这些数据可以直接用于在线特征存储或同步到像Pinot这样的度量服务器。度量服务器可以进一步处理/聚合这些度量点,形成更有用的模型性能度量和业务度量。你也可以采用像RisingWave这样的流数据库,它可以用 SQL 语法对流数据进行连接/聚合。

对于数据流构建,Flink相当受欢迎。你也可以使用带有 CDC 连接器的 Flink从 OLTP 数据库提取数据,并将数据发送到消息中间件和数据湖。

应该有一个在线特征存储,支持如ScyllaDB或 AWS Dynamo DB 等键值数据库。在线特征存储可以帮助你用与特定参考 ID(用户 ID、产品 UUID)相关联的特征向量丰富发送给模型服务的请求。这可以极大地解耦构建微服务的后台服务团队与构建 ML 模型的 ML 工程师团队之间的依赖关系。它允许 ML 工程师独立推出新的 ML 特征与新 ML 模型(当你更新特征向量时,你的模型服务 API 签名对微服务的暴露将保持不变)。

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

作者提供的图片

在书中,设计机器学习系统提到了模型堆叠(Jen Wadkin 的 medium 帖子关于模型堆叠)。在模型服务中使用模型堆叠是相当常见的。当你想将异构模型堆叠在一起时,例如将 pytorch 和 tensorflow 模型堆叠在一起时,需要一个协调器。你还可以通过在路由请求到不同模型时根据模型性能动态调整权重,使你的协调器变得更加复杂。

现在我们有了一个复杂的系统。它看起来很酷,但带来了新的挑战:

  • 如果不加以管理,系统的债务将迅速增加。

  • 对 ML 工程师而言认知负担很重。

这时你可能需要思考 MLOps 如何帮助你。

MLOps:抽象、可观察性和可扩展性

MLOps 从来不是一个具体的解决方案。它更像是一组用于管理 ML 系统的原则。与典型的软件项目不同,ML 系统受数据变化的影响很大,数据依赖管理并非易事。论文机器学习系统中的隐性技术债务详细描述了这些挑战。因此,一个由 MLOps 驱动的 ML 平台必须能够:

  • 数据变化监控和数据质量监控。

  • 管理离线和在线环境中的 ML 特征。

  • 可重复的 ML 管道,满足实验-操作对称性。

  • 简洁的 ML 管道配置,可以抽象出基础设施的细节。

本文,MLOps: 机器学习中的持续交付和自动化管道,强调了实验-操作对称性的重要性。它还描述了 MLOps 的自动化级别,从 level-0、level-1 到最终的 level-2。我非常喜欢这份文档中的图表,将借用它来解释 level-1 MLOps 的样子。

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

作者提供的图像。描述了MLOps: 机器学习中的持续交付和自动化管道中的 MLOps Level-1。

为了在您的组织中扩展这种 MLOps 实践,您需要提供简洁的 ML 管道配置,以便为 ML 工程师抽象出基础设施实现细节。这样,平台工程师也能在不对平台用户造成过多干扰的情况下灵活地升级 ML 平台。您可以考虑使用像 yaml 这样的配置文件来描述 ML 管道,并依靠您的 ML 管道控制器将其转换为实际的工作负载。

因此,让我们通过以下图表重新组织实时数据/ML 基础设施,以突出 MLOps 如何塑造我们的平台。

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

作者提供的图像

为了给您更好的了解 ML 管道可能的样子,这里是每个阶段的可能抽象示例。以下图表仅帮助您进一步理解配置的可能样子,并不代表任何实际实现,也不涵盖所有所需的方面。

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

ML 管道配置的一般概念。作者提供的图像

Kubernetes 是一种流行的解决方案,用于编排机器学习工作负载(或如今的所有工作负载)。你可以使用 CRD 提供用户与平台之间的简洁接口。在文章我对 Kubebuilder 的思考中,我分享了在使用 kubebuilder 构建 CRD 时的一些想法。

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

图片来源于作者

当然,我没有涵盖许多重要的子主题,包括但不限于:

  • 超参数优化

  • 分布式训练架构

接下来做什么

你可以看到MLOps 只是给已知任务一个合适的名称。这远不是任务完成。我分享的是一个有观点的机器学习操作平台实施策略。即便如此,创建高质量机器学习产品的门槛仍然很高,收集、处理和挖掘数据的工作量仍然很大。

除了这些挑战之外,我还想分享我观察到的机器学习领域的趋势。鉴于这个领域发展的如此快速,这绝对不是一个完整的列表。

  • 无服务:我们将机器学习的价值抛在了很远的后面,因为机器学习平台通常建立在数据平台的基础上。这就像在移动时代强迫用户购买计算机来参与社交媒体平台一样。无服务的数据服务和数据引擎正在应对这个挑战。许多服务提供商探索自己的无服务解决方案,以降低采用门槛,例如Databricks、Snowflake、Bytehouse。公司可以在启动数据仓库、数据湖或湖仓后开始构建他们的机器学习产品。

  • AI 驱动的特征工程:好吧,AI 现在可以做一切,对吗?

  • MaaS 趋势:更强大的模型即服务(Model-as-a-Service)将会出现。公司可以直接利用机器学习的力量,而无需自己构建机器学习服务,从而极大地提升他们的业务。

正如我们都注意到的,机器学习领域发展如此迅速。在我打字的此刻,这篇文章可能已经过时。更多的想法已经出现并转化为现实。请告诉我你对机器学习操作的看法,或者我应该在哪些方面进一步学习。让我们一起保持进度!

从数据到聚类:你的聚类何时足够好?

原文:towardsdatascience.com/from-data-to-clusters-when-is-your-clustering-good-enough-5895440a978a

通过聚类方法可以发现隐藏的宝石,但你需要正确的聚类方法和评估方法来创建合理的聚类。学习如何在四个步骤中找到它们。

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

·发表于Towards Data Science ·阅读时间 17 分钟·2023 年 4 月 26 日

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

图片来源:Shubham DhageUnsplash

通过无监督聚类分析,我们可以对具有相似模式的观察数据进行分组,揭示数据中的(隐藏)趋势。使用聚类评估方法有助于确定聚类倾向、质量和最佳聚类数。在本博客中,我们将深入探讨聚类评估方法,学习如何解释这些方法,并选择适合你用例的聚类方法。 我们将从探讨聚类和评估方法的基础知识开始,这些方法用于评估聚类的质量,包括流行的技术,如轮廓系数Davies-Bouldin 指数导数法。通过使用玩具示例数据集,我们将研究每种评估方法的优缺点,提供关于如何解释其结果的实际见解。所有分析都使用clusteval 库

无监督聚类。

使用无监督聚类,我们的目标是确定数据中的“自然”或“数据驱动”的组,而不使用有关标签或类别的先验知识。使用不同的无监督聚类方法的挑战在于,它会导致样本的不同划分,因此会有不同的分组,因为每种方法隐式地对数据施加了结构。因此,问题出现了;什么是“好的”聚类? 图 1A 展示了一组在二维空间中的样本。你看到多少个簇? 我会说有两个簇而不使用任何标签信息。为什么? 因为点之间的距离很小,而杂乱点之间的“间隙”相对较大。

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

图 1。图像由作者提供

考虑到这一点,我们可以将对“”的直观理解转化为数学陈述;所谓簇内的样本方差应该很小(簇内方差 σW***,红色和蓝色***),而同时簇之间的方差应该很大(簇间方差,σB),如图 1B 所示。样本之间的距离(或内在关系)可以用距离度量(例如,欧几里得距离)来测量,并存储在所谓的不相似矩阵中。然后,可以使用连接类型计算样本组之间的距离(用于层次聚类)。

距离度量

最著名的距离度量是欧几里得距离。尽管它在许多方法中被设置为默认度量,但它并不总是最佳选择。各种距离度量的示意图见图 2。

理解距离度量的数学性质,以便它适合数据并与研究问题对齐。

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

图 2:最受欢迎的距离度量的示意图。图像由作者提供。

连接类型。

层次聚类的过程涉及将样本分组到一个更大的簇中的方法。在这个过程中,需要计算两个子簇之间的距离,不同类型的连接描述了簇之间的连接方式(图 3)。

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

图 3:连接类型。图像由作者提供。

简而言之,两个簇之间的单链接是它们两个最接近样本之间的距离。它产生一个长链,因此适用于异常检测或蛇形簇的聚类。两个簇之间的完全链接是它们两个最远样本之间的距离。直观地说,两个最远的样本之间的相似度不可能比其他相似度较低的样本对更大。这迫使簇变得球形,并且通常在边界处有“紧凑”的轮廓,但内部不一定紧凑。两个簇之间的平均链接是一个簇中所有对象与另一个簇中所有对象之间距离的算术平均值。质心链接是簇的几何质心之间的距离。换句话说,质心链接基于数据点的质心连接簇,而平均链接则考虑了两个簇中所有对象之间的距离。选择度量标准链接类型时要小心,因为它直接影响最终的聚类结果。

从数据到簇的 4 个步骤。

为了确定数据驱动的簇,这些簇可能包含新的或未知的信息,我们需要仔细地执行四个构成步骤,从输入数据集到合理的簇。像distfitclusteval这样的库可以帮助完成这个过程。

提出合理的样本分组需要的不仅仅是盲目运行聚类算法。

第一步:调查数据的基础分布。

调查数据的基础分布是一个重要的步骤,因为聚类算法依赖于数据的统计特性来识别模式并将相似的数据点分组在一起。通过理解数据的分布,如其均值、方差、偏度和峰度,我们可以做出明智的决定,选择合适的聚类算法以及如何设置其参数以实现最佳结果。此外,调查数据分布可以提供有关在聚类之前应用适当的归一化或缩放技术的见解。虽然监督方法,如树模型,能够处理混合数据集,但聚类算法则设计用于处理同质数据这意味着所有变量应该具有类似的类型或测量单位。 归一化或缩放是一个重要的步骤,因为聚类算法基于相似性使用度量标准对数据点进行分组。有关调查基础数据分布的更多细节可以在这里阅读 [1]

## 如何找到适合数据的最佳理论分布

了解潜在的数据分布是数据建模的关键步骤,并且有许多应用,例如异常检测……

[towardsdatascience.com

第 2 步:对簇的密度和期望簇大小做出有根据的猜测。

设定对簇密度、形状和簇数量的期望将有助于选择合适的聚类算法和参数设置,以实现期望的结果。此外,设定期望可以在解释和向利益相关者传达聚类结果时提供更多的信心和有效性。例如,如果目标是识别数据集中稀有的异常,并且聚类结果产生了一个非常低密度的小簇,这可能表明存在这样的异常。然而,并非总是可以设定关于簇数量或密度的期望。此时,我们需要根据与数据的统计属性和研究目标相匹配的数学属性选择聚类方法。

第 3 步:选择聚类方法。

选择聚类方法取决于第 1 到第 4 步,但我们还应该考虑可扩展性、鲁棒性和易用性等因素。例如,在生产环境中,我们可能需要与实验用例不同的属性。有几种流行的聚类方法,如 K-means、层次聚类和基于密度的聚类算法,每种方法都有其自身的假设、优点和局限性(见下文总结)。选择聚类方法后,我们可以开始对数据进行聚类并评估其性能。

K-means 假设簇是球形的、大小相等的,并且具有相似的密度。它需要事先指定簇的数量(k)。注意,最佳簇数量的检测在 clusteval 库中会自动进行。

层次聚类通过基于距离或相似性度量递归地合并簇来构建树状结构的簇。它是聚合性的(自底向上)且不需要事先指定簇的数量。

基于密度的聚类算法,例如 DBSCAN(基于密度的空间聚类应用于噪声),将密集的点组在一起,并且在簇之间具有较低的密度。它们不假设簇的任何特定形状或大小,并且可以识别任意形状和大小的簇。基于密度的聚类特别适用于识别不同密度的簇和将异常点检测为噪声。然而,它们需要调整超参数,例如密度阈值,并且对参数选择敏感。

不同的聚类方法可能会导致样本的不同划分,从而产生不同的分组,因为每种方法都隐含地对数据施加了一种结构。

第 4 步:簇评估。

簇评估是为了评估聚类倾向、质量和最佳簇数。有各种聚类评估方法,其中最流行的是clusteval库中包含的,即Silhouette 分数、Davies-Bouldin 指数和导数(或肘部)方法。使用这些技术的难点在于,聚类步骤及其评估通常是交织在一起的,clusteval 库内部处理了这一点。在下一节中,我将深入探讨各种方法并测试它们的表现。

在聚类过程中应进行簇评估,以为每个聚类分配分数,并实现结果之间的有意义比较。

下一步:从簇到洞察。

找到最佳簇数后的步骤是确定簇背后的驱动特征。一个很好的方法是使用HNET[2]进行富集分析,我们可以使用超几何检验和 Mann-Whitney U 检验来测试簇标签与特征之间的显著关联。更多细节可以在这里找到:

## 通过显著关联网络探索和理解数据。

探索以理解您的数据可以决定一个项目的成功与否!

towardsdatascience.com

Clusteval 库。

关于clusteval库的几句说明,该库用于所有分析。clusteval 库旨在应对评估簇和创建有意义图表的挑战。在之前的博客[3]中,我展示了它在图像识别中的强大功能,用于图像的聚类。clusteval库包含了最受欢迎的评估方法,即Silhouette 分数、Davies-Bouldin 指数和导数(或肘部)方法,用于评估层次聚类、K-means、DBSCAN 和 HDBSCAN的聚类。它可以处理所有数据类型,例如连续数据、分类数据和离散数据集。只需确保 1. 数据正确归一化。2. 所有变量具有相似的类型或测量单位。3. 选择适当的距离度量和评估方法。

Clusteval 功能

  • 它包含了针对轮廓系数、Davies-Bouldin 指数以及用于评估层次聚类、K 均值、DBSCAN 和 HDBSCAN 的导数方法的最受欢迎的集群评估管道。

  • 它包含创建有意义图形的功能;集群的最佳数量、带系数的轮廓图、散点图和树状图。

  • 它包含了确定集群背后驱动特征的功能。

  • 它可以处理所有数据类型,如连续型、类别型和离散数据集。只需确保所有变量具有相似的类型或测量单位。

  • 开源

  • 文档页面

聚类方法的选择很重要。

不同的集群技术可以导致不同的分组,因为它们对不同的密度和组大小的响应各异。因此,确定正确的集群数量可能具有挑战性,尤其是在高维空间中,当视觉检查不可行时。通过集群评估方法,我们可以进行调查并进行一些回测,以确定最佳的集群数量并描述集群趋势。为了展示如何确定集群数量,我创建了七个玩具示例数据集(灵感来源于scikit-learn),这些数据集具有不同的密度、形状和样本大小,即蛇形集群不同密度和大小的集群以及均匀分布的样本(图 4)。每个玩具示例包含 1000 个样本和两个特征。因此,它可以在低维空间中工作时提供直观感受,例如在特征提取步骤之后,例如PCA、t-SNE 或 UMAP步骤。

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

图 4. 七个玩具示例数据集,具有不同的密度、形状和大小。样本根据其实际标签进行着色。图片由作者提供。

对于这七个示例数据,我们将使用在clusteval中可用的评估方法进行集群分析;轮廓系数、Davies-Bouldin 指数和导数(或肘部)方法。集群本身使用*K 均值、层次聚类(单一、完全和 Ward 距离)和基于密度的聚类算法(DBSCAN)*进行。

如果你觉得这篇文章对你有帮助,请使用我的 推荐链接 继续无缝学习并注册 Medium 会员。此外, 关注我 以保持更新我的最新内容!

使用轮廓系数进行集群评估。

轮廓系数法是一种衡量样本与自身簇(内聚性)相比于其他簇(分离性)的相似度的指标。得分范围在[-1, 1]之间,高值表示样本或观察值与自身簇匹配良好,而与相邻簇匹配较差。这是一种样本级的方法,这意味着对于每个样本,都会计算一个轮廓系数,如果大多数样本的值很高,则认为聚类配置是合适的。如果许多点的值较低或为负,则可能是聚类配置的簇数过多或过少。轮廓系数法与距离度量无关,这使得它成为一种有吸引力且通用的方法。

让我们看看它如何在一个简单的数据集上对具有相似密度和大小的样本进行分组,即blob 数据集。在下面的代码部分,我们将初始化DBSCAN方法与轮廓系数评估方法。请注意,我们可以使用任何其他聚类方法,如下一节所示。对于DBSCAN,在 epsilon 参数上进行搜索,并检索具有最高轮廓系数的簇数量。具有轮廓系数DBSCAN正确检测出 4 个簇,并且样本级轮廓系数(图 5 中间)看起来稳定(簇的高分且形状均匀)。这是预期的,因为簇中的样本远离其他簇,并且接近各自簇的中心。

# Import library
from clusteval import clusteval

# Initialize
cl = clusteval(cluster='dbscan', evaluate='silhouette', max_clust=10)
# Import example dataset
X, y = cl.import_example(data='blobs', params={'random_state':1})

# find optimal number of clusters
results = cl.fit(X)

# Make plot
cl.plot()
# Show scatterplot with silhouette scores
cl.scatter()

# [clusteval] >INFO> Fit with method=[dbscan], metric=[euclidean], linkage=[ward]
# [clusteval] >INFO> Gridsearch across epsilon..
# [clusteval] >INFO> Evaluate using silhouette..
# [clusteval] >INFO: 100%|██████████| 245/245 [00:07<00:00, 33.88it/s]
# [clusteval] >INFO> Compute dendrogram threshold.
# [clusteval] >INFO> Optimal number clusters detected: [4].
# [clusteval] >INFO> Fin.
# [clusteval] >INFO> Estimated number of n_clusters: 4, average silhouette_score=0.812 

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

图 5. 左侧:优化 Epsilon 参数以检测最佳簇数量。中间:每个样本的轮廓系数。右侧:确定的簇标签。图片由作者提供。

这只是一个数据集和一种聚类方法(DBSCAN)的评估。让我们在七个玩具示例数据集和五种聚类方法中进行迭代,使用轮廓系数方法确定最佳簇的数量。结果如图 6 所示,其中上半部分显示了按最佳簇数量着色的散点图,下半部分显示了不同簇数量的轮廓系数图。

图 6 的结论是如果我们选择适合数据集的聚类方法,那么我们可以很好地检测出正确的簇的数量。这可能看起来是一个微不足道的评论,但选择合适的聚类方法可能具有挑战性,因为你需要仔细执行前面章节中描述的第 1 到第 4 步。

如果我们由于高维度无法直观地检查结果,我们仍然可以获取样本分布和簇形成的直觉。 如果各组明显分离,如蛇形簇斑点簇,我们可以期待在特定簇数上出现轮廓系数的强峰值,并且使用正确的聚类方法。但当数据变得更嘈杂时,如球形数据集,多重峰值可能会出现,且轮廓系数的斜率可能会逐渐增加而没有明显的峰值。这通常暗示簇的形成不够强烈。通过clusteval中的min_clust和/或max_clust参数,我们可以限定搜索空间并确定相对较高的峰值。这个检查和限定的手动优化步骤被称为回测。图 6 中的一个有趣观察是,当数据变得嘈杂时,DBSCAN聚类方法的得分显示出涡流增加(见图 6,第二列)。原因是检测到许多离群点并开始形成更小的簇,后来这些离群点可能再次成为较大簇的一部分。

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

图 6. 使用轮廓系数方法检测五种聚类方法和七个玩具示例数据集的最佳簇数。图片由作者提供。

使用戴维斯-鲍尔丁指数进行聚类评估。

戴维斯-鲍尔丁指数DBindex)可以直观地描述为簇内距离与簇间距离的比率度量。得分在[0, 1]之间,其中较低的值表示簇之间更紧密和更好的分离。较低的得分因此被认为更好。轮廓系数方法不同,戴维斯-鲍尔丁指数不是逐样本度量,因此使用速度更快。DBindex的一个缺点是它常常过度预估,因为随着簇数增加,较低的值更为常见。这可以通过得分逐渐下降的斜率没有明显低得分来清晰地看到。

让我们看看如何对具有相似密度和大小的样本进行聚类,以获取戴维斯-鲍尔丁指数性能的一些直觉。在下面的代码部分,我们将用戴维斯-鲍尔丁指数评估方法初始化凝聚聚类方法。如果我们在clusteval中使用max_clust=10限制搜索空间,它能正确检测到 4 个簇(图 7 左侧面板)。然而,如果我们不限制搜索空间,得分的斜率将逐渐下降,从而导致检测到错误的簇数(图 7 右侧面板)。

# Import
from clusteval import clusteval

# Initialize
cl = clusteval(cluster='agglomerative', evaluate='dbindex', max_clust=10)
# Import example dataset
X, y = cl.import_example(data='blobs', params={'random_state':1})

# find optimal number of clusters
results = cl.fit(X)

# Make plot
cl.plot(figsize=(12, 7))
# Show scatterplot with silhouette scores
cl.scatter()

# [clusteval] >INFO> Fit with method=[agglomerative], metric=[euclidean], linkage=[ward]
# [clusteval] >INFO> Evaluate using dbindex.
# [clusteval] >INFO: 100%|██████████| 18/18 [00:00<00:00, 120.32it/s]
# [clusteval] >INFO> Compute dendrogram threshold.
# [clusteval] >INFO> Optimal number clusters detected: [4].
# [clusteval] >INFO> Fin.

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

图 7. Davies-Bouldin 指数 对不同数量簇的评分。左侧面板:最多 10 个簇。右侧面板:最多 20 个簇。图片由作者提供。

对于Davies-Bouldin 指数方法,我们也将遍历这七个示例数据集,但我将仅包括Agglomeration簇方法的单一、完整和 Ward 连接。请注意,DBSCANDavies-Bouldin 指数不兼容。在所有示例中,搜索空间有一个限制(max_clust=10),以防止过度估计(图 8)。尽管我们限制了搜索空间,但仍然存在一个逐渐下降的斜率,在许多示例数据集中导致不正确的簇数量。这在蛇形各向异性簇(前三行)中尤为明显。一种解决方案是进一步降低最大簇数量(max_clust)。对于Blobs, Globular, 和 Density示例数据集,可以从散点图中看出正确的簇趋势,但最佳簇数量经常过度估计。在这里,如果我们能够进一步将最大簇数量限制为 6 或 7,结果会有所改善。

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

图 8. 使用Davies-Bouldin 指数方法检测七个示例数据集的最佳簇数量。图片由作者提供。

使用导数方法进行簇评估。

导数方法 比较每个簇合并的高度与平均值,并通过计算前几个层级深度的标准差进行归一化。最后,导数方法返回基于所选层次聚类方法(红色垂直线)的最佳截断的簇标签。换句话说,当蓝色线中的“肘部”很明显时,可以在橙色线中看到一个强峰值。让我们看看导数方法在聚类具有类似密度和大小的样本方面的效果。在下面的代码部分,我们将初始化Agglomerative聚类方法,并使用导数评估方法。与Davies-Bouldin 指数相比,我们不需要限制搜索空间(图 9),可以轻松检测到 4 个簇。

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

图 9. 导数方法 对不同数量簇的评分。图片由作者提供。

# Import library
from clusteval import clusteval

# Initialize
cl = clusteval(cluster='agglomerative', evaluate='derivative', max_clust=20)
# Import example dataset
X, y = cl.import_example(data='blobs', params={'random_state':1})

# find optimal number of clusters
results = cl.fit(X)

# Make plot
cl.plot(figsize=(12, 8))
# Show scatterplot with silhouette scores
cl.scatter()

我们将遍历这七个示例数据集,并使用导数方法(图 8)确定最佳簇数量。可以看出,导数方法经常导致不正确的簇数量。如果我们仔细观察导数线(橙色),它在许多数据集中显示出一个小峰值,指向一个较弱的肘部,从而可能表示数据噪声。这表明估计的簇数量可能不可靠。

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

图 9. 使用导数法检测七个玩具示例数据集的最佳聚类数量。图片由作者提供。

请注意,聚类评估方法很容易被欺骗,因为分数可能会随着聚类数量的增加而逐渐提高。

结束语。

我展示了不同的聚类方法如何响应不同的数据集,以及确定最佳聚类数量需要多个步骤。此外,不同的聚类方法将产生不同的分组,因为它们隐式地对数据施加了结构,从而影响样本的划分。clusteval 包 可以帮助进行聚类调查和回测,其结果可以通过各种绘图功能进行探索。

一般来说,K-means 聚类效果很好,特别是对于球形、平衡的和球状聚类。然而,它不适合检测具有不同密度蛇形聚类的情况。另一方面,DBSCAN 是一个很好的全能选手,可以在大多数情况下检测到正确的聚类数量。只是要注意,聚类倾向可能是正确的,但检测到的确切聚类数量可能不对。这在球状聚类中尤其如此,因为许多(组)样本可能被标记为离群点。DBSCAN 的一个缺点是计算量大,特别是在优化 epsilon 参数时。相反,对于蛇形聚类或离群点检测,使用单链聚类;对于噪声球状聚类,使用 ward 或完全链路,K-means 适用于球形、平衡的和球状聚类。

对于聚类评估方法,轮廓系数有很多优势。它是一种逐样本的度量,可以与任何距离度量一起使用,使其成为一种有吸引力且多用途的方法。另一方面,Davies-Bouldin 指数导数法需要更多的迭代过程进行回测和调查,因为它们往往超出正确的聚类数量。Davies-Bouldin 指数在处理具有重叠聚类的数据集时被描述为更具鲁棒性,并且计算效率更高,因为它不需要计算所有数据点之间的成对距离。

总结来说,聚类评估方法的选择取决于数据集的特定特征、分析目标和应用要求。你可以使用多种方法进行回测,并比较其结果,以便根据问题的具体背景做出明智的决定。

保持安全,保持警觉。

干杯 E.

如果你觉得这篇文章对你有帮助,请使用我的 推荐链接 继续无限制地学习,并注册 Medium 会员。此外, 关注我 以保持最新内容!

软件

让我们联系!

参考文献

  1. E. Taskesen,如何找到最适合你数据的理论分布,2023 年 2 月,Towards Data Science, Medium

  2. E. Taskesen,通过显著关联网络探索和理解你的数据,2021 年 8 月,Towards Data Science, Medium

  3. E. Taskesen, 图像聚类的逐步指南,2021 年 12 月,Towards Data Science, Medium。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值