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

原文:TowardsDataScience

协议:CC BY-NC-SA 4.0

克服你的第一个数据科学项目的 6 个初学者友好的技巧

原文:towardsdatascience.com/ideas-how-start-data-science-project-when-beginner-9ed03b7628ca

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

图片由 Tatiana Syrikova 提供,来自 Pexels

我将引导你了解一些能帮助你打破数据科学初体验难关的见解!最后一个见解有可能显著改变你整个职业生涯的路径。

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

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

目录

  • #1: 你第一个项目的真正目的:这不是为了留下印象

  • #2: 为什么你的第一个项目不需要有创意

  • #3: 复制、调整、学习:令人惊讶的技能发展策略

  • #4: 你必须克服逆境

  • #5: 克服配置工具时的困难

  • #6: 采纳成长心态是成功的关键

  • 附录

进行你的第一个项目可能是你数据科学旅程中最重要的里程碑。然而,知道这个过程的第一步往往充满挑战。我在这里是为了让你知道其实不必如此。

在这篇文章中,我将与你分享开始第一个项目所需了解的内容。

我的目标是澄清你可能对如何开始第一个数据科学项目的误解,并让你有信心尽快开始。

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

作者提供的图片

这些是六个关键见解,可以帮助你突破对项目的顾虑。最后一个见解有可能彻底改变你整个职业生涯的轨迹。

让我们深入探讨吧!

#1: 你第一个项目的真正目的:这不是为了留下印象

为什么要做一个项目呢?

是为了向潜在雇主展示你的技能吗?还是在与 LinkedIn 上的人建立联系时作为谈资?

实际的原因并不集中在这些概念上。

你初次项目的主要目标是学习。

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

作者提供的图片

没有必要感到压力去获得反馈或公开分享你的工作。很多人仅仅因为他们认为第一个项目不够好或者不够有趣而迷失方向。

猜猜怎么了?

只要它帮助你学习,就不重要它有多么令人印象深刻。它也不必非常令人印象深刻或复杂才能教会你一些东西。即使是看似简单的项目,也能让初学者掌握和熟悉基本概念、技术或方法论,比如基本的数据处理、可视化或入门统计分析。因此,这为未来的努力奠定了坚实的基础。

#2: 为什么你的第一个项目不需要有创意

我在网上分享了很多关于项目的信息。你可能听过我说,一个好的项目应该是富有创意和有趣的。如果你有兴趣阅读我关于这方面的工作,可以查看下面的附录。

虽然对于你展示给潜在雇主的项目来说,这是真的,但你不必在你的第一个项目中展现任何创意

这可能看起来很无聊,但我的第一个项目就是泰坦尼克数据集。而且,天哪,我的分析做得非常糟糕。不过,我从那个练习中学到了很多关于分类和特征工程的知识。

我个人分析过许多最基本的数据集,包括 Palmer Penguins 数据集、MNIST 数据集和 Kaggle 上的房地产数据集。

这些方法对掌握新技能非常有效,并且非常适合你学习旅程早期的项目。

#3: 复制、调整、学习:技能发展的惊人策略

在你的第一个项目中,你应该复制其他人的工作。

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

作者提供的图片

你没听错。

为了澄清,你是为了学习而进行复制,你不应当为别人做过的事情而获得荣誉。你也应该明确地不分享你所复制的工作。

一种非常有效的早期学习方法是输入和执行他人编写的代码。一旦执行,进行实验以观察结果并探索结果。

我更喜欢将这种方法应用于图表。由于图表的视觉特性,当调整代码时可以立即看到变化,提供了清晰的进展或变化的指示。

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

作者提供的图片

还记得我在第一个项目中使用的泰坦尼克数据集吗?如果你想找一些东西来跟随学习,我制作了一个记录我处理该数据集过程的视频,链接在下面的附录中。

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

作者提供的图片

#4: 你必须克服逆境

这并不令人意外,但第一次项目通常是有挑战性的。你会遇到障碍、错误,并且感到困惑。

不幸的是,许多人在面对这种逆境后选择了放弃。我几乎普遍发现我们在数据科学中会遇到这些挑战。遇到困境是常规安排的一部分。

越早适应这一点并学会暂时离开然后再回到工作中,你的学习旅程就会越早取得进展。

我注意到,散步或离开代码时,常常会激发出自发的解决方案或全新的视角。

这些是你在遇到困境并感觉无法取得任何进展时可以做的,也应该做的事情。

你会惊讶于自己的大脑在你漫步时能够重新整理出什么,当你不刻意集中精力于工作时。

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

图片来源:作者

此外,我们永远无法为 Medium 算法鼓掌。 如果你发现这篇文章有用,请随意点赞。

#5:克服配置工具时的设置难题

开始的最大障碍之一是使所有数据科学工具在本地计算机上正常工作。

当我刚开始时,配置本地环境所花的时间比我完成整个项目的时间还要长。

幸运的是,有像 Anaconda 这样的工具可以让你的本地环境正常工作,但你仍然会遇到一些配置问题,比如获取正确的包。

幸运的是,随着基于网页的 IDE 的进步,你可以完全避免这个步骤。在你开始第一个项目时,可以使用像 Kaggle、Google Colab 和 DeepNote 这样的免费平台,而无需技术负担。

从本质上讲,你登录这些网站,创建一个实例,就可以使用 Jupyter notebook,而无需安装任何包或解决其他相关问题。

这彻底改变了我顺利启动第一个项目的方式。

#6:采用成长型思维模式是成功的关键

也许开始数据科学和项目的最重要的事情就是你的心态。

仅仅因为一个项目现在很困难,并不意味着你不够优秀。这意味着你还不够擅长数据科学。

当我回去重新做前面提到的 Titanic 数据集时,看到自己有了如此大的进步令人惊讶。我清晰地记得第一次做时有多么困难,而现在我甚至能自信地带领其他人完成那次分析。我的能力、天赋和对这些项目的舒适度发生了令人难以置信的变化。

这种理解你随着时间的推移可以提高的概念被称为成长型思维模式。我在过去的一些文章中详细讨论过这个概念,并在下面的附录中添加了链接。

当个人涉足一个新的领域,尤其是像数据科学这样思维要求高的领域时,大多数人开始时对这些技能并不熟练。如果你遇到困难,应该把这些难题视为成长的机会,而不是障碍。你可以选择那些稍微推动你边界但通过努力可以实现的项目。

此外,你应该集中精力于理解概念和解决问题的努力,而不是纠结于即时结果。为了实现这一点,将复杂的问题分解为更小、可管理的步骤,并在每个阶段庆祝你的进步。

我希望这对你的第一个项目有所帮助。祝你在数据科学之旅中好运。

附录

  • 关于有趣和创意数据科学项目的更多信息,请查看我写的这篇文章:

[## 5 个富有创意的数据科学项目,让你的作品集脱颖而出

脱颖而出可以通过新颖性、影响力、技能或创造力来实现。在这篇文章中,我重点介绍了一些项目想法……

medium.datadriveninvestor.com](https://medium.datadriveninvestor.com/5-imaginative-data-science-projects-that-can-make-your-portfolio-stand-out-6371802a686d?source=post_page-----9ed03b7628ca--------------------------------)

  • 如果你想复制并学习我对 Titanic 数据集的演示,请查看我制作的这个 YouTube 视频:

  • 关于我培养成长心态的经历以及我提升学习能力的其他方法,请参考我写的这篇文章:

[## 学会学习:我如何从愚蠢到终身学习者

分解改变我生活的学习基础

medium.com](https://medium.com/@kenneth.b.jee/learning-to-learn-how-i-went-from-dunce-to-life-long-student-3a7c7c98794c?source=post_page-----9ed03b7628ca--------------------------------)

如果你喜欢关于数据科学、机器学习和人工智能的有趣且信息丰富的视频,请查看我的 YouTube 频道,我会提供评论、教程和其他教育视频。

如果你对数据和人工智能领域中的人们如何做出塑造他们世界观和职业生涯的大决策的独特故事感兴趣,请查看我的播客 Ken’s Nearest Neighbors

要获取关于我内容创作的每周更新以及数据科学行业的额外学习资源,请订阅我的新闻通讯,Data Dribble!

识别:可信因果推断的关键

原文:towardsdatascience.com/identification-the-key-to-credible-causal-inference-c3023143349e?source=collection_archive---------5-----------------------#2023-02-22

提高你的因果智商,通过掌握识别来建立对因果推断的信任

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

·

关注 发表于 Towards Data Science · 阅读时间约 8 分钟·2023 年 2 月 22 日

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

图片由 Paul Skorupskas 提供,来源于 Unsplash

因果推断是利用数据来做出关于因果关系的声明的过程,因此它是数据科学家的核心任务之一。在这个过程中,有两个不同的概念:识别和估计,只有同时掌握这两者,我们才能更好地从数据中建立因果关系。

然而,随着新的估计方法不断出现,数据科学家往往将方法的复杂性与因果推断中的强度等同起来。不幸的是,没有明确的识别,任何复杂的建模或估计方法都无法帮助我们从数据中建立因果关系。因此,在本文中,我们将详细讨论为什么识别优先于估计,以及为什么没有识别因果推断会失败。

如果你对因果推断较陌生或更熟悉机器学习,可以将因果推断中的识别看作是机器学习中一些基本概念的对应概念,如正则化和交叉验证。掌握这些概念对预测任务的成功至关重要,因为任何算法的有效性取决于这些概念在训练过程中是否得到正确应用。一个正确应用而没有数据泄漏的简单正则化回归模型,在未见过的数据上,可能比一个因过拟合和数据泄漏而效果不佳的最先进算法表现更好。

掌握这些机器学习原则的另一个,虽然不太明显的理由,是为了赢得对我们工作的信任。当我们想要部署我们的预测模型时,首先要做的事情之一是说服利益相关者我们的模型不仅仅是记忆了训练过程中看到的内容,而是能够从数据中学习并进行泛化。我们详细描述了如何应用交叉验证,如何通过正则化处理过拟合,以及为什么测试误差是对模型在未见数据上表现的可靠估计。这建立了对我们模型的信任,我们获得了利益相关者的支持。

类似地,在因果推断中,识别不仅可以为估计正确设置舞台,还可以建立对我们工作的信任。因此,能够进行识别分析并清晰地传达,是一个被低估但强大的技能,如果我们想提高因果智商并建立对因果推断的信任,就必须掌握。

潜在结果

要理解识别,首先从潜在结果框架开始是有用的。假设我们感兴趣的是回答成为 Prime 会员是否会导致客户在亚马逊在线商店上花费更多。因为这是一个简单的两种处理条件的案例,我们可以将处理(是否为 Prime 会员)描述为一个二元随机变量,Ti=[0,1]。我们感兴趣的结果是购买金额,比如,成为 Prime 会员后的 12 个月内的购买金额,记作Yi

为了回答这个问题,我们假设我们可以想象一个人如果没有加入 Prime 会发生什么,反之亦然。因此,每个客户有两个潜在结果,一个是如果客户是会员,另一个是如果不是。因果效应是两个潜在结果之间的差异,但只能观察到其中一个。让 Yi1 表示客户 i 作为会员时的潜在结果,Yi0 表示客户 i 作为非会员时的潜在结果。Prime 会员资格对客户 i 的因果效应是潜在结果之间的差异,定义如下:

因为我们从未同时观察到 Yi1Yi0,我们面临因果推断的基本问题,这简单地说明了个体层面的因果推断是不可能的 [1]。

数据中客户 i 的观察结果 Yi 可以与潜在结果连接如下:

通常,我们关注平均处理效应(ATE),即期望值之间的差异。

问题在于:我们需要无条件期望值 E[Yi1]E[Yi0] 来获得 ATE,即如果总体中的每个人都成为 Prime 会员与不成为会员的预期结果差异。然而,我们只观察到条件期望值 E[Yi1|Ti=1]E[Yi0|Ti=0],即在数据中看到的会员和非会员的预期结果,这只是总体的一个样本。所以,除非我们有理由相信 E[Yi1|Ti=1]=E[Yi1]E[Yi0|Ti=0]=E[Yi0],否则我们无法获得 ATE。

看待因果推断挑战的另一种方式是将 ATE(平均处理效应)分解如下:

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

在这里,ATE 是五个量的函数,而我们从观察数据中只能估计以下三个量:P(Ti=1),使用分配到处理条件的比例;E[Yi1|Ti=1],使用 E[Yi|Ti=1],即会员的平均结果;以及 E[Yi0|Ti=0],使用 E[Yi|Ti=0],即非会员的平均结果。其他两个量是 E[Yi0|Ti=1],即处理条件下的控制下的平均结果,以及 E[Yi1|Ti=0],即控制条件下的处理下的平均结果。请注意这些是未观察到的反事实,我们无法从数据中估计这两个量。

识别

那么,我们如何进行?我们如何证明条件期望值等同于无条件期望值,并且它们的差异确实是 ATE?或者我们如何处理替代表达中的未观察到的反事实?答案是我们做出不可测试的假设并为之辩护。

这正是识别发挥作用的地方。从本质上讲,识别意味着列出从数据中获得的统计估计需要的假设,以便将其赋予因果解释。然而,这并不仅仅是这样。它还意味着要阐明这些假设为何合理,从而我们在数据中找到的关联识别了我们所追求的因果估计量,即 ATE,并且可以被信任为因果关系。因此,识别迫使我们不仅要明确因果关系所需的假设,还要在分析中为这些假设辩护。

现在,我希望你不会感到失望,如果我告诉你包括随机实验在内的每一种因果推断方法,都需要无法检验的假设来建立因果关系。没错,就是这样。即使是因果推断的金标准也无法在不做假设的情况下给出因果关系。问题是,并不是所有的假设都是平等的。有些假设比其他假设更合理,当我们和我们的受众对指导我们因果推断的假设有清晰认识时,我们可以寻找评估这些假设的方法。

需要无法检验的假设来进行因果推断,并不意味着这是不可能的。然而,这确实意味着伴随着高度的不确定性,拥有明确的识别策略在减少这种不确定性方面大有帮助。

这也清楚地表明了为什么识别优先于估计。简单来说,如果识别失败,换句话说,如果我们因果推断的假设不合理,那么无论采用什么建模或估计方法都无法超越关联。另一方面,如果识别有效,我们可以通过利用从非参数到完全参数的方法的各种工具来寻求改进估计。

偏差

我的意思是这样的。假设为了找出 Prime 会员对亚马逊客户购买行为的影响,我告诉你我收集了会员和非会员的历史购买数据,并且将使用这些数据来估计 ATE。这显然意味着我假设我可以通过E[Yi1|Ti=1]来获得E[Yi1],通过E[Yi0|Ti=0]来获得E[Yi0],这就是我的识别假设。现在,在查看分析或数据之前,我们应该问这个假设是否合理。

为了做出判断,让我们看一下从条件期望中获得的以下分解:

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

那么,通过这种方法,我们得到的结果不是 ATE,而是两部分的结合体:Prime 会员对会员的影响,即处理效应(ATT),以及一个偏差项。简单来说,偏差项告诉我们,如果会员没有加入 Prime,会员与非会员之间的购买差异会是什么。

在许多商业环境中,我们期望自愿订阅某项服务或产品的用户,其购买行为与未订阅的用户有所不同。在我们的例子中,我们可以认为那些加入 Prime 的人是因为他们已经经常使用亚马逊,并且期望继续这样做,加入 Prime 对他们来说是一个好交易。实质上,即使他们没有加入 Prime,会员的购买量也会高于非会员,表明存在正偏差,E[Yi0|Ti=1]>E[Yi0|Ti=0]。这意味着我为因果推断所做的假设不成立,我们无法识别 ATE。

现在,无论我们数据中有多少观察值,或者我们使用简单的均值差异估计量还是进行回归分析,都没有关系。因为我们的识别不成立,最终我们会得到一个关联而非因果效应。

识别策略

社会科学和商业中的重要因果研究是那些在讨论任何建模或估计之前,有专门部分明确描述识别策略的研究。通过这样做,这些研究的思想不仅传达了对发现的信心,还说服了观众相信这些发现可以在维持的假设下被解释为因果关系。大多数可信的因果推断也不需要复杂的建模和估计方法。实际上,当因果推断是可信的时,是因为大多数挑战在识别阶段和统计分析之前已经得到解决。

那么,因果推断的主要识别策略是什么呢?根据它们的识别假设,它们可以被分类如下:

  1. 随机实验

  2. 自然实验

  3. 工具变量

  4. 回归不连续性设计

  5. 可观察变量选择

  6. 带有时间数据的可观察变量选择

基本上,我们遇到的每种估计方法,从简单的均值差异到最新的因果机器学习,都依赖于这些识别策略中的一种。例如,可观察变量选择策略涵盖了从回归调整到双重机器学习的所有内容,包括每一种倾向得分及其匹配算法。因此,对于希望提高因果推断能力的实践者来说,首先详细了解这一策略及其假设,然后再研究各种估计方法,会更有意义。

在接下来的系列文章中,我们将从随机实验开始,逐一详细讨论每种识别策略,探讨其背后的识别假设。

让我们总结一下,因果推断始于识别,而最可信的因果推断是那些具有明确且令人信服的识别策略的,而不是那些拥有最复杂估计方法的。希望因果推断能够受到重视的数据科学从业者,需要掌握识别。

感谢阅读!我希望你觉得这值得花时间。

我致力于为从事因果推断方法和营销数据科学应用的实践者撰写高质量、有用的文章。

如果你对这些领域感兴趣,可以考虑关注我,也欢迎分享你的评论和建议。

参考文献

[1] P. Holland, Statistics and Causal Inference. (1986), 美国统计协会期刊.

[2] L. Keele, The Statistics of Causal Inference: A View from Political Methodology. (2015), 政治分析.

[3] A. Lewbel, The Identification Zoo — Meanings of Identification in Econometrics. (2019), 经济文献期刊.

识别和利用时间序列预测的领先指标

原文:towardsdatascience.com/identifying-and-leveraging-leading-indicators-for-time-series-forecasting-using-granger-causality-d0e6fd5e353f?source=collection_archive---------3-----------------------#2023-09-19

使用 Granger 因果关系和 SARIMAX 模型

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

·

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

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

图片由 Aron Visuals 提供,来源于 Unsplash

引言

在日常工作中,公司面临着有关调整金融市场、优化供应链操作或制定策略以保持竞争优势的决策。然而,当时间序列模型未能考虑到相互关联的事件或对预测主题施加影响的其他时间序列时,实现高精度预测可能会变得困难。

在本文中,我们将探讨领先指标的概念,如何识别它们,以及如何利用它们来改善时间序列预测。我们将深入了解使用 Python 和来自联邦储备经济数据的真实数据进行的实际实施。

什么是领先指标?

领先指标是帮助预测未来趋势或活动的数据集。一个日常的领先指标示例是突然出现的云层,这可能预示着在接下来一个小时内发生雷暴的可能性。

如何识别和利用领先指标

  1. 领域知识:像所有数据科学项目一样,我们首先要了解我们将要操作的领域。这个过程的一个关键方面是识别可能影响我们想要预测的时间序列的变量或因素。在我们的实际实施中,我们将预测啤酒、葡萄酒和烈酒的销售量ᵈ¹,因此消费者物价指数⁵𝄒ᵈ²、烈酒价格¹𝄒ᵈ³、实际个人收入⁵𝄒ᵈ⁴、工作年龄人口⁵𝄒ᵈ⁵、失业率⁴𝄒ᵈ⁶、劳动参与率⁴𝄒ᵈ⁷、社会福利⁴𝄒ᵈ⁸和消费者贷款²𝄒ᵈ⁹将成为我们的潜在领先指标。

  2. 数据探索与可视化:接下来,我们使用时间序列分解来分析我们的依赖时间序列及其潜在领先指标的季节性成分。我们的目标是识别领先指标中的峰值或谷值,这些峰值或谷值在我们依赖的时间序列中出现类似/相反的变化之前。需要注意的是,领先指标与依赖时间序列之间的关系可以是正面的也可以是负面的。尽管我们在实施中不会深入探讨这一点,但你可以使用seasonal_decompose函数来自stats_model来实现这一点。

  3. 统计测试:在此步骤中,我们通过使用 Granger 因果关系检验来验证我们精心挑选的潜在领先指标对依赖时间序列的影响。

  4. 预处理:接下来,我们对数据进行缩放,以确保所有特征在相同范围内,然后应用主成分分析(PCA)来消除领先指标之间的多重共线性。

  5. 模型构建: 最后,我们使用pmdarima模块中的auto_arima函数构建我们的 SARIMAX 模型,并将领先指标设置为外生值以及其他参数。

什么是格兰杰因果关系?

格兰杰因果关系首次由克莱夫·格兰杰³于 1969 年提出,是一种统计假设检验,用于帮助确定时间序列中的变化是否能预测或“引起”另一时间序列的变化。它已在statsmodels中实现为一个函数。

什么是 SARIMAX?

SARIMAX 代表季节性自回归积分滑动平均模型与外生变量。顾名思义,该模型结合了多个组件,如自回归(AR)、滑动平均(MA)、差分(I,即积分)以及外部因素的纳入(“X”部分)——我们将在其中插入领先指标。

Python 实现

在开始之前,请在Federal Reserve Economic Data(FRED)创建一个账户,并通过此链接获取 API 密钥。请注意,此产品使用了 FRED® API,但未经圣路易斯联邦储备银行的认可或认证。

我们从安装和加载所需的模块开始。

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

import requests
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime, timedelta
from pandas.tseries.offsets import MonthEnd
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_absolute_percentage_error
from statsmodels.tsa.stattools import adfuller
from statsmodels.tsa.stattools import grangercausalitytests

from pmdarima import auto_arima

接下来,我们将创建一个自定义函数,通过 FRED API 读取数据。

FRED_API_KEY = '__YOUR_API_KEY__'

# Function to read data from FRED API
def get_fred_data(data_id, data_name):
  response = requests.get(f'https://api.stlouisfed.org/fred/series/observations?series_id={data_id}&api_key={FRED_API_KEY}&file_type=json')
  df = pd.DataFrame(response.json()['observations'])[['date', 'value']].rename(columns={'value': data_name})
  df[data_name] = pd.to_numeric(df[data_name], errors='coerce')
  df['date'] = pd.to_datetime(df['date']) + MonthEnd(1)
  df.set_index('date', inplace=True)
  df.index.freq='M'
  return df

现在,让我们读取数据并将其存储在 pandas 数据框中。

dependent_timeseries_id = 'MRTSSM4453USN'
dependent_timeseries_name = 'liquor_sales'

potential_leading_indicators = {
    'USACPIALLMINMEI': 'consumer_price_index',
    'PCU44534453': 'liquor_ppi',
    'DSPIC96': 'real_income',
    'LFWA25TTUSM647S': 'working_age_population',
    'UNRATENSA': 'unemployment_rate',
    'LNU01300000': 'labor_force_participation',
    'A063RC1': 'social_benefits',
    'CCLACBM027NBOG': 'consumer_loans',
}
# Read dependent time series
timeseries = get_fred_data(dependent_timeseries_id, dependent_timeseries_name)

# Join timeseries with potential leading indicators
for data_id, data_name in potential_leading_indicators.items():
  df = get_fred_data(data_id, data_name)
  timeseries = timeseries.join(df)

# We will start our analysis from Jan-2010
timeseries = timeseries['2010':]

# add month we want to predict liquor_sales 
timeseries = timeseries.reindex(timeseries.index.union([timeseries.index[-1] + timeseries.index.freq]))

timeseries

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

时间序列数据框

对我们的数据进行快速可视化分析显示,我们的因变量时间序列(酒类销售)或多或少地每 12 个月遵循相同的周期。我们将把这个 12 个月的周期作为我们后续时间序列预测中的一个参数。

timeseries[dependent_timeseries_name].plot(figsize=(20,8));

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

酒类销售趋势

在测试因果关系之前,我们需要确认时间序列数据的平稳性。为此,我们将使用增强型迪基-福勒检验。如果我们的数据集未通过此平稳性测试,我们必须采用递归差分方法,直到它符合测试标准。

# create a copy of the timeseries to use for tests. Be sure to exclude the additional row we added in the previous task
timeseries_for_gc_tests = timeseries[:-1]
all_cols = timeseries_for_gc_tests.columns

stationary_cols = []
diff_times = 0

while True:

  # Test for stationarity
  for col in all_cols:
    adf, pvalue, lagsused, observations, critical_values, icbest = adfuller(timeseries_for_gc_tests[col])
    if pvalue <= 0.05:
      stationary_cols.append(col)

  # Difference the time series if at least one column fails the stationary test
  if set(stationary_cols) != set(all_cols):
    timeseries_for_gc_tests = timeseries_for_gc_tests.diff().dropna()
    diff_times += 1
    stationary_cols = []
  else:
    print(f'No of Differencing: {diff_times}')
    break

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

现在,我们已经将时间序列数据加载到 pandas 数据框中,并且通过了平稳性测试,我们将使用格兰杰因果关系检验来测试因果关系。

maxlag = 6 # represents the maximum number of past time periods to look for potential causality. We cap ours at 6 months
leading_indicators = []

for x in all_cols[1:]:
    gc_res = grangercausalitytests(timeseries_for_gc_tests[[dependent_timeseries_name, x]], maxlag=maxlag, verbose=0)
    leading_indicators_tmp = []
    for lag in range(1, maxlag+1):
        ftest_stat = gc_res[lag][0]['ssr_ftest'][0]
        ftest_pvalue = gc_res[lag][0]['ssr_ftest'][1]
        if ftest_pvalue <= 0.05:
            leading_indicators_tmp.append({'x': x, 'lag': lag, 'ftest_pvalue': ftest_pvalue, 'ftest_stat': ftest_stat, 'xlabel': f'{x}__{lag}_mths_ago'})
    if leading_indicators_tmp:
        leading_indicators.append(max(leading_indicators_tmp, key=lambda x:x['ftest_stat']))

# Display leading indicators as a dataframe
pd.DataFrame(leading_indicators).reset_index(drop=True).reset_index(drop=True)

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

酒类销售的领先指标

从我们的测试中,我们可以看到当前月份的酒类销售受到 2 个月前的消费者价格指数ᵈ²和消费者贷款ᵈ¹⁰以及 6 个月前的劳动参与率ᵈ⁷的影响。

既然我们已经建立了领先指标,我们将调整它们的记录,以使它们的滞后数据与其“引起”的当前酒类销售数据位于同一行。

# shift the leading indicators by their corresponding lag periods
for i in leading_indicators:
  timeseries[i['xlabel']] = timeseries[i['x']].shift(periods=i['lag'], freq='M')

# select only the dependent_timeseries_name and leading indicators for further analysis
timeseries = timeseries[[dependent_timeseries_name, *[i['xlabel'] for i in leading_indicators]]].dropna(subset=[i['xlabel'] for i in leading_indicators], axis=0)
timeseries

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

将领先指标表现为酒类销售的 X 变量

接下来,我们将数据缩放,以使所有特征处于相同范围内,然后应用 PCA 方法消除领先指标之间的多重共线性。

# Scale dependent timeseries
y_scaler = StandardScaler()
dependent_timeseries_scaled = y_scaler.fit_transform(timeseries[[dependent_timeseries_name]])

# Scale leading indicators
X_scaler = StandardScaler()
leading_indicators_scaled = X_scaler.fit_transform(timeseries[[i['xlabel'] for i in leading_indicators]])
# Reduce dimensionality of the leading indicators
pca = PCA(n_components=0.90)
leading_indicators_scaled_components = pca.fit_transform(leading_indicators_scaled)

leading_indicators_scaled_components.shape

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

最后,我们可以利用 auto_arima 构建我们的 SARIMAX 模型。在此实现过程中,我们将所有参数保持默认,除了季节性标志和每个周期中的期数(m)。

我们将使用截至‘2024-05-31’的时间序列数据训练我们的模型,使用‘2024-06-30’的数据进行测试,然后预测‘2024-07-31’的酒类销售。

# Build SARIMAX model
periods_in_cycle = 12 # number of periods per cycle. In our case, its 12 months
model = auto_arima(y=dependent_timeseries_scaled[:-2], X=leading_indicators_scaled_components[:-2], seasonal=True, m=periods_in_cycle)
model.summary()

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

SARIMAX 模型摘要

# Forecast the next two periods
preds_scaled = model.predict(n_periods=2, X=leading_indicators_scaled_components[-2:])
pred_2024_06_30, pred_2024_07_31 = np.round(y_scaler.inverse_transform([preds_scaled]))[0]

print("TEST\n----")
print(f"Actual Liquor Sales for 2024-06-30: {timeseries[dependent_timeseries_name]['2024-06-30']}")
print(f"Predicted Liquor Sales for 2024-06-30: {pred_2024_06_30}")
print(f"MAPE: {mean_absolute_percentage_error([timeseries[dependent_timeseries_name]['2024-06-30']], [pred_2024_06_30]):.1%}")

print("\nFORECAST\n--------")
print(f"Forecasted Liquor Sales for 2024-07-31: {pred_2024_07_31}")

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

测试和预测结果

通过逐步执行该过程,我们预测了 2024 年 7 月的酒类销售金额,估计的 MAPE 仅为 0.4%。

要进一步提高预测的准确性,我们可以探索添加更多潜在的领先指标并调优所使用的模型。

结论

正如我们已探索的那样,领先指标作为未来趋势的早期信号,提供了在完全实现之前预测变化的关键优势。通过利用 Granger 因果性检验等技术来识别领先指标系列,并将其纳入预测模型中,我们可以显著增强预测的准确性和鲁棒性。

谢谢阅读

希望您喜欢本文,并且受到启发尝试应用在您的数据集上。在 Medium 上关注我获取更多类似数据科学文章,让我们在 LinkedIn* 上互相连接。*

参考文献

[1] 查卢普卡 FJ,格罗斯曼 M,萨弗 H. 价格对酒精消费和与酒精相关问题的影响。酒精研究与健康。2002 年;26(1):22–34。 PMID: 12154648; PMCID: PMC6683806。

[2] 卡夫, 哈罗德 E. 和克里斯托弗 G. 吉布斯。“限制发薪日贷款对酒类销售的影响。”银行与保险电子期刊(2015)

[3] 格兰杰, C. W. J. “通过计量模型和交叉谱方法研究因果关系。” Econometrica 37,第 3 期(1969 年):424–38。 doi.org/10.2307/1912791.

[4] 乔根森 MB,彼得森 J,提格森 LC,劳 CJ,克里斯滕森 AI,贝克尔 U,托尔斯特鲁普 JS。饮酒与劳动市场参与:关于工作、失业、病假和社会福利之间转换的前瞻性队列研究。 Eur J Epidemiol. 2019 年 4 月;34(4):397–407。 doi: 10.1007/s10654-018-0476-7。 2019 年 1 月 10 日在线发表。 PMID: 30627937; PMCID: PMC6451700。

[5] 尼尔森, 乔恩 P., 美国酒精需求中的经济和人口因素:增长会计分析。实证经济学,第 22 卷,№1,1997 年 3 月 7 日,可在 SSRN 上获取:ssrn.com/abstract=4686

[6] Prabal, K. De., 经济低迷期间的饮酒行为:来自美国大萧条期间住房市场波动的新证据。《经济学与人类生物学》,第 43 卷,2021 年 12 月。

数据引用

[d1] 美国人口普查局,零售销售:啤酒、葡萄酒和烈酒商店 [MRTSSM4453USN],取自 FRED,美国圣路易斯联邦储备银行; fred.stlouisfed.org/series/MRTSSM4453USN, 2024 年 8 月 28 日。

[d2] 经济合作与发展组织,消费者价格指数(CPI,HICP),COICOP 1999:消费者价格指数:美国总指数 [USACPIALLMINMEI],取自 FRED,美国圣路易斯联邦储备银行; fred.stlouisfed.org/series/USACPIALLMINMEI, 2024 年 8 月 28 日。

[d3] 美国劳工统计局,行业生产者价格指数:啤酒、葡萄酒和烈酒零售商 [PCU44534453],取自 FRED,美国圣路易斯联邦储备银行; fred.stlouisfed.org/series/PCU44534453, 2024 年 8 月 28 日。

[d4] 美国经济分析局,实际可支配个人收入 [DSPIC96],取自 FRED,美国圣路易斯联邦储备银行; fred.stlouisfed.org/series/DSPIC96, 2024 年 8 月 28 日。

[d5] 经济合作与发展组织,年度劳动统计:工作年龄总人口:25 至 54 岁美国 [LFWA25TTUSM647S],取自 FRED,美国圣路易斯联邦储备银行; fred.stlouisfed.org/series/LFWA25TTUSM647S, 2024 年 8 月 28 日。

[d6] 美国劳工统计局,失业率 [UNRATENSA],取自 FRED,美国圣路易斯联邦储备银行; fred.stlouisfed.org/series/UNRATENSA, 2024 年 8 月 28 日。

[d7] 美国劳工统计局,劳动力参与率 [LNU01300000],取自 FRED,美国圣路易斯联邦储备银行; fred.stlouisfed.org/series/LNU01300000, 2024 年 8 月 28 日。

[d8] 美国经济分析局,个人当前转移收入:政府社会福利 [A063RC1],取自 FRED,美国圣路易斯联邦储备银行; fred.stlouisfed.org/series/A063RC1, 2024 年 8 月 28 日。

[d9] 美国联邦储备委员会,消费者贷款:信用卡及其他循环贷款,所有商业银行 [CCLACBM027NBOG],取自 FRED,美国圣路易斯联邦储备银行; fred.stlouisfed.org/series/CCLACBM027NBOG, 2024 年 8 月 28 日。

使用因果机器学习识别 Spotify 歌曲流行的驱动因素

原文:towardsdatascience.com/identifying-drivers-of-spotify-song-popularity-with-causal-ml-934e8347d2aa

什么使一首歌“受欢迎”?

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

·发布于 数据科学前沿 ·10 分钟阅读·2023 年 2 月 1 日

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

图片由 C D-X 提供,来源于 Unsplash

目录

∘ 介绍

∘ 问题陈述

∘ 为什么选择因果机器学习?

∘ 数据收集

∘ 探索性数据分析 (EDA)

∘ 数据建模

∘ 模型解释

∘ 构建网页应用程序

∘ 局限性

∘ 结论

介绍

什么使一首歌受欢迎?当艺术家唱到高音或朗读引人深思的歌词时,很容易为你对一首歌的喜爱找到理由。仅仅因为这首歌是你喜欢的艺术家演唱的也很容易。但这不足以解释当前的音乐格局。在这个饱和的市场中,尽管许多曲目有着相似的声音、流派和风格,有些曲目却能够超越其他曲目。

这就引出了一个问题:是否还有更多隐藏/潜在的音频因素影响我们对某些曲目的倾向?该项目试图通过利用因果机器学习来回答这个问题,建立一个工具来帮助识别 Spotify 歌曲流行的潜在驱动因素。

注意:所有源代码和网页应用程序本身可以在本文末尾提供的代码库中访问。

问题陈述

该项目的目标是建立一个机器学习模型,根据用户定义的特征预测 Spotify 曲目的流行度。该模型将被部署在一个网页应用程序中,其他用户可以访问。

幸运的是,Spotify 将许多原本是定性的音频数据量化,这使得该项目得以实施。例如,Spotify API 提供了 danceability 特征,该特征提供了一个数值,表示一首歌曲的舞蹈适宜性。有关所有提供的音频特征及其描述,请随时访问 Spotify API 文档

Spotify 轨迹还包含 popularity 变量,这是本机器学习项目的目标标签。根据文档:

一首轨迹的受欢迎程度是 0 到 100 之间的一个值,其中 100 表示最受欢迎。受欢迎程度是通过算法计算的,并且主要基于轨迹的总播放次数和这些播放的最近时间。

为什么选择因果机器学习?

通常,通过进行实验(例如 A/B 测试)来证明因果关系,这些实验追踪预测变量及其对目标变量的影响。不幸的是,进行仅在一个变量上有所不同的歌曲对比实验是不可行的。毕竟,歌曲包含许多元素,这些元素很难精确控制。

另一方面,因果机器学习允许用户创建无尽的歌曲模拟,并得出预测的受欢迎程度评分。虽然模型不会直接指示哪些变量导致高受欢迎程度(相关性不等于因果关系),但它将为任何后续的研究和分析提供动力和方向。

数据收集

项目使用的数据通过 Spotify API 获取。具体而言,它使用了Spotipy,这是一个用于 Spotify Web API 的 Python 库,用于获取有关轨迹和艺术家的数据。数据收集涉及从平台上最成功的艺术家那里提取 2022 年发布的轨迹,以便接触到高人气的轨迹。

获取信息需要多个步骤,因为感兴趣的特征需要从不同的 API 端点提取。

获取训练数据的过程如下:

  1. 收集所有顶级艺术家的数据

由于歌曲的受欢迎程度取决于艺术家本身,因此收集如其粉丝数量和音乐流派等基本信息非常重要。以下函数用于收集 1000 位艺术家的数据。

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

艺术家数据预览(作者创建)

2. 收集顶级艺术家发布的所有轨迹

在收集所有艺术家的数据后,使用 Spotipy 收集每位艺术家的所有 Spotify 轨迹。以下函数用于收集某个艺术家发布的所有轨迹的数据。请注意,特定查询的最大记录数为 1000。

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

轨迹数据预览(作者创建)

3. 收集所有顶级艺术家的所有音频特征数据

接下来,使用 Spotipy 收集前一步骤中收集的曲目的所有音频数据。以下函数用于收集给定曲目的音频数据(每个曲目通过曲目 ID 进行识别)。

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

曲目音频特征数据预览

4. 合并所有数据集

通过合并数据集并将每个特征存储在单独的列中,生成的数据集包含艺术家数据和曲目数据,这些数据可以用于训练机器学习模型,以预测歌曲的受欢迎程度。

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

合并数据集预览(由作者创建)

总体而言,原始数据集包含 101,700 首曲目和 22 列。

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

提醒:音频特征的定义(第 7 到 18 列)可以在Spotify API 文档中找到。

探索性数据分析(EDA)

在数据集可以用于训练机器学习模型之前,应进行彻底分析,以确定需要添加、丢弃和更改哪些元素。

执行探索性数据分析(EDA)将揭示更多的数据细节,从而提供对在训练任何机器学习模型之前应执行哪些过程和变换的更多洞察。

  1. 处理缺失数据

删除数据集中缺少音频特征的歌曲。

2. 处理重复数据

删除所有具有重复曲目 ID 的记录。

3. 检查受欢迎程度变量

接下来,可视化目标变量popularity特征的值分布。

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

受欢迎程度评分的直方图(由作者创建)

高受欢迎度曲目不足,这带来了挑战,因为模型需要能够正确识别具有高受欢迎度评分的曲目。解决这个问题的一种方法是使用严重惩罚大错误的评估指标,如均方误差(MSE)或均方根误差(RMSE)。

4. 检查预测变量

同样,预测变量的分布也被可视化。

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

预测特征的分布(由作者创建)

由于预测特征具有不同的数值范围,因此需要对其进行缩放,以减轻模型的偏差。此外,缩放方法还需要处理某些特征中出现的异常值(例如,生动度、声学度)。

5. 删除特征

如曲目 ID 和艺术家 ID 等对歌曲受欢迎程度没有影响的特征被从数据集中删除。

6. 计算预测变量之间的相关性

多重共线性是指独立变量之间高度相关的概念,这会影响训练模型的性能。为避免这种情况,计算了每个变量的方差膨胀因子(VIF),使用了以下函数。

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

特征的 VIF 值(作者创建)

由于预测特征的 VIF 值小于 5,因此数据集中没有多重共线性的证据。

6. 处理分类特征

数据集中有两个分类特征需要在训练模型之前处理:keygenre

key 特征表示曲目的调性。目前,调性由数字表示,但这意味着某些调性大于其他调性,这是错误的。因此,该特征将进行一热编码。

不幸的是,genre 特征的一热编码不是一个可行的方法,因为该特征有 609 个独特的值!对这样多唯一值的列进行一热编码只会产生高维数据集。相反,子类别将被合并成一个名为 is_pop_or_rap 的二进制变量,如果歌曲是流行或说唱,则为 1,否则为 0。

数据建模

EDA 透露了建模阶段应该如何进行。它表明,如果基于 MSE 或 RMSE 指标进行调优,模型会有更好的表现。

它还显示数据在用于训练模型之前需要进行一热编码和标准化。

1. 准备训练和测试数据

数据首先被拆分为训练集和测试集。

2. 创建基准

基准将有助于对实际模型的性能进行上下文分析。在本研究中,基准模型是一个具有默认参数的线性回归模型。

3. 创建特征工程管道

在被机器学习算法训练之前,预测变量需要经过特征工程。首先,分类特征 key 将进行一热编码。之后,所有特征将通过标准化进行缩放。

使用以下代码片段将转换和模型存储在管道对象中。

4. 训练模型

在特征工程后,使用数据训练了多种机器学习回归算法。使用的回归模型如下:

  • 线性回归(基准)

  • Lasso 回归

  • 随机森林回归器

  • LightGBM 回归器

  • XGBoost 回归器

对于每个回归模型,基于均方误差指标进行了超参数调优,以确定最佳超参数组合。使用以下函数选择每个模型的最佳超参数。

在确定了模型的超参数后,模型根据 RMSE 和 MAE 指标在测试集上进行了评估。下表总结了所有模型的性能。

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

测试集上模型表现总结(作者创建)

基准模型在测试集上的 RMSE 和 MAE 分别为 17.65 和 13.03。尽管所有其他模型都优于基准,但随机森林回归器表现突出,其 RMSE 和 MAE 分别为 13.10 和 8.04。

鉴于随机森林模型在测试集上的表现最佳,它将被部署到网页应用程序中。

模型解释

Shapley Addictive Explanations(SHAP)通过展示每个特征对预测的贡献,帮助解释随机森林回归器的表现。这将为了解预测是如何做出的(即哪些特征影响目标)提供一些线索,甚至可以揭示模型或训练数据的不足之处。

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

SHAP 总结图(作者创建)

根据图表,回归模型的预测最受followersduration_sspeechiness特征的影响。模型认为,具有高粉丝量、中等时长和高词汇量(即冗长)的艺术家的歌曲会产生高人气。直观上,这些因素影响人气是合理的,但令人惊讶的是,模型没有将energyis_pop_or_rap等特征排在前面。

总体而言,模型的评估指标得分表明仍有改进空间。总结图清楚地表明,尽管一些特征与人气的关系得到领域知识支持,但模型并不青睐这些特征。它还表明数据中有限的特征阻碍了模型准确评估人气。

构建网页应用程序

通过网页应用程序部署模型是有效生成多个歌曲预测的方式。

随机森林回归器被部署在 Streamlit 应用程序中,预测具有用户选择特征的曲目的受欢迎程度。

可以通过在终端中输入以下命令运行 Streamlit 应用:

streamlit run app.py

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

Streamlit 应用预览(作者创建)

用户可以在侧边栏中选择他们的曲目特征,并点击“预测”按钮查看模型的预测结果。通过这个网页应用程序,用户可以利用机器学习模型预测无尽的歌曲参数组合的人气。

限制

尽管使用因果机器学习可以帮助提供一些关于音频特征如何影响歌曲受欢迎程度的见解,但这种方法存在一些需要解决的限制。具体来说,有些问题是研究未能充分深入探讨的。

  1. 音频特征的数值表示

虽然 Spotify 确实为用户提供了量化歌曲某些特征(例如能量)的手段,但分配的数值可能不足以表示其他定性特征。

2. 艺术家/专辑/歌曲营销

毫无疑问,歌曲的受欢迎程度与艺术家如何营销他们的歌曲以及他们自己有很大关系。不幸的是,收集的数据中对这一因素的代表性很少。未来值得考虑的是像唱片公司和艺术家在热门社交媒体平台(例如 Twitter、Instagram)上的参与对流行度的影响。

3. 歌词

虽然你不能通过说某个词、短语或句子来神奇地让某人喜欢一首歌,但歌词无疑在人们享受曲目时起着作用。也许像潜在狄利克雷分配(LDA)这样的主题建模方法可以提供一些关于不同流派歌词类型的洞察。

4. 客户人口统计

不同人口统计学群体的听众可能对曲目有不同的标准。与其将整个受众归为一组,不如按年龄/性别/种族对受众进行细分,并研究这些群体喜欢哪些类型的歌曲。

5. 用户偏好的渐进变化

最后,模型的一个显著缺陷是它只考虑了 2022 年发布的歌曲。即使它充分捕捉到高人气曲目的要素,音乐标准也会随着时间的推移而不可避免地发生变化。因此,这个模型必须持续用新数据进行训练,以保持可用性。

结论

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

由 John Tekeridis 拍摄的照片:www.pexels.com/photo/person-using-smartphone-340103/

总体而言,我尝试回答了大多数艺术家和唱片公司心中的一个问题。通过利用机器学习,我们能够进行高级模拟,推测具有某些特征的歌曲将如何被听众接受。

如果你有兴趣在你的设备上运行 streamlit 应用程序,或者只是希望查看源代码,你可以通过以下链接访问项目的 Github 仓库:

[## GitHub - anair123/Identifying_Drivers_Of_Song_Popularity_With_Causal_ML]

一首歌的吸引力是什么?如果你浏览过 Spotify 上任何艺术家的专辑,你可能会注意到一些…

github.com](https://github.com/anair123/Identifying_Drivers_Of_Song_Popularity_With_Causal_ML?source=post_page-----934e8347d2aa--------------------------------)

希望你在了解这个项目时和我制作它时一样有趣。

感谢阅读!

在 BigQuery 中使用 SQL 识别新客户和回头客

原文:towardsdatascience.com/identifying-new-and-returning-customers-in-bigquery-using-sql-81f44c9e3598

为了更好地理解客户的兴趣和行为,以及改进你的营销策略。

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

·发表于Towards Data Science ·8 分钟阅读·2023 年 1 月 4 日

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

Vincent van Zalinge拍摄,来源于Unsplash

主要好处

对客户进行分类,包括新客户和回头客,有助于定义使用哪种营销或销售策略。毫无疑问,这将取决于你的业务性质,你是否优先考虑获取、留存或两者兼顾。

在深入探讨 SQL 方法和步骤之前,以下是这些术语的简单定义和业务示例:

  • 新客户: 指首次购买的顾客

  • 回头客: 指已经进行了多次购买的顾客

汽车公司咖啡店公司为例:

对于汽车公司来说,回头客的可能性较低,因为汽车购买通常不频繁,价格较高,客户可能几年才进行一次购买。策略可能是专注于获取新客户和接触新客户。

相比之下,在线咖啡店销售的是定期购买的消耗品,如咖啡豆或咖啡粉。价格点更为实惠,这提高了客户回头的可能性。

策略可以适用于两种情况:通过赠品、上层漏斗广告等方式获取新客户,或尝试推动品牌发现和认知。也可以用于回头客,通过定制的营销和信息传递、产品推荐、激励和折扣、忠诚度计划等方式。

在 SQL 中,为客户贴标签可能有助于启用一些洞察项目:

  • 理解客户行为:通过检查回头客的行为和衍生模式,你可能会了解什么激励他们再次购买。

  • 个性化和自定义消息:通过将属性(例如newreturning)转发到你的营销工具,并为每种客户类型创建特殊的营销细分

  • 客户体验和满意度:通过进行调查或查看按客户类型提出的客户服务问题

  • 产品教育或理解:通过查看产品的入门和使用(有些产品可能起初较难理解或使用)。

让我们深入数据,一步一步地进行分类!

创建一个包含客户、订单和日期的表格

为了说明如何实现这种分类,我们将使用一些来自Google Merchandise Store的数据,这是一家销售 Google 品牌产品的在线商店。

在这个数据集中,我们有三个月的历史(从 2020 年 11 月 1 日到 2021 年 1 月 31 日),包含各种不同的事件(购买、页面查看、会话开始、加入购物车等)

我们的第一步将是构建一个包含3 个字段的基本表格,其中包含按客户和日期排列的订单

Google Analytics 4(GA4)数据的 SQL 查询如下:

SELECT
  user_pseudo_id AS user_id,
  ecommerce.transaction_id AS order_id,
  PARSE_DATE('%Y%m%d', event_date) AS order_date
FROM
  `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`
WHERE
  event_name = 'purchase'
  AND ecommerce.transaction_id <> '(not set)'
GROUP BY
  1,
  2,
  3

数据被过滤以仅包含具有有效交易 ID 的购买记录行

值得注意的是,如果数据无法访问、未被正确跟踪或出于其他原因,Google Analytics 将存储一个默认的(not set)值。

然后,结果在所有三个维度上进行分组,使每一行代表每个客户在每个日期的唯一订单。

这会生成以下数据表,我们的第一步完成了!

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

每一行代表客户在特定日期下的一个订单(图片来自作者

如果你想了解更多关于“未设置”值的信息,可以参考 Google Analytics 文档。

[## “未设置”值的含义

是 Analytics 在未收到你选择的维度的任何信息时使用的占位符名称……

support.google.com](https://support.google.com/analytics/answer/2820717?hl=en&source=post_page-----81f44c9e3598--------------------------------#zippy=%2Cin-this-article)

如果你想访问和探索 Google Analytics 4 的样本数据集,你可以从这个链接获取。

[## BigQuery 样本数据集用于 Google Analytics 4 电子商务网页实现 | Google Analytics…

Google Merchandise Store 是一个销售 Google 品牌商品的在线商店。该网站使用 Google Analytics 4 的……

developers.google.com](https://developers.google.com/analytics/bigquery/web-ecommerce-demo-dataset?source=post_page-----81f44c9e3598--------------------------------)

将客户分类为新客户或回头客

我们的目标是根据客户的订单历史确定他们是新客户还是回头客,并在我们的表格中添加一列以给他们打上标签。

我们使用窗口函数 DENSE_RANK() 来找到每个客户的第一次订单。

  • 订单的排名为 1时,我们认为该客户是 'new'

  • 订单的排名大于 1时,我们认为该客户是 'returning'

SELECT
  *,
  CASE
    WHEN DENSE_RANK() OVER(PARTITION BY user_id ORDER BY order_date) = 1 
    THEN 'new' ELSE 'returning'
END
  AS customer_type
FROM
  `datastic.new_existing.base_table`

使用 DENSE_RANK() 允许我们将相同的排名分配给同一天内下的多个订单。有关此函数和其他编号函数的更多详细信息,您可以阅读这篇中等文章:

[## 在 BigQuery 中使用 SQL 的编号函数之间的差异]

了解如何使用排名、密集排名、行号、累计分布、百分位排名、四分位数、百分位数等…

towardsdatascience.com](/differences-between-numbering-functions-in-bigquery-using-sql-658fb7c9af65?source=post_page-----81f44c9e3598--------------------------------)

您将在新列 customer_type 中看到,根据 order_datecustomer_id 来确定的标签。

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

基于订单历史对客户进行新客户或回头客分类(图片来自 作者

在 2020 年 9 月 12 日,客户 13285520 下了第一笔订单,并被标记为 'new'

然后,在 2020 年 12 月 12 日,这个相同的客户下了第二笔订单,这使其被标记为 'returning' 类型。

直观分析新客户和回头客

然后,我们可以绘制新客户与回头客户的比例随时间的变化:

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

随着时间的推移,新客户与回头客的比较(图片来自 作者

在这种情况下,我们观察到大多数客户都是新的,而真正回头的客户很少。但请记住,我们没有很多历史数据。

回购率

将客户分类为 newreturning 的一个潜在好处是,我们可以计算一个指标,提供一个总体评分,表示有多少客户会回购。

从我们之前的加班图表中,我们可以假设 Google 商户商店的回购率较低。为了计算这个指标,我们使用以下公式:

回头客率 (%) = (回头客数量 / 客户总数) × 100

在这 3 个月的时间里,我们有 3713 个客户(注意这些客户在某个时点都是新的),其中 256 个客户下了多于一个订单。

这给出的是 (256/3713) * 100 = 6.9% 回头客率

额外的建议和想法

考虑时间分辨率

在我们的例子中,我们每天查看客户订单,考虑时间的作用,而不仅仅是订单的数量。

如果你只运行一个查询,查看每个客户的订单数量,而不考虑时间(例如,假设一个有超过 1 个订单的客户是returning),可能会发生一些客户在同一天有多个订单,这样他们会被认为是回头客,但可能不会在之后再回来。

此外,回顾按月或按年也可能导致不同的数字。时间段越长,客户同时是newreturning的机会就越高。在这种情况下,这涉及到管理重复数据并添加额外的分类,如both,或优先考虑newreturning类型。

为了说明这个想法,让我们只查看 2020 年的每个月(我们将之前的查询结果存储在一个名为customer_table的表中):

SELECT
  user_id,
  DATE_TRUNC(order_date,MONTH) AS month,
  STRING_AGG(DISTINCT customer_type
  ORDER BY
    customer_type ASC) AS customer_type
FROM
  customer_table
WHERE
  order_date < '2021-01-01'
GROUP BY
  1,
  2

STRING_AGG()函数用于将不同的customer_type值按字母顺序连接成一个字符串(这样在使用CASE WHEN语句时更容易,因为值的顺序将保持按字母顺序排列)。

查询将返回以下结果:

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

一个客户可能在同一个月内既是新客户又是回头客(图片来自作者)。

如你所见,在 2020 年 12 月,客户(234561…901)第一次下单,并在同一个月再次购买。

在这种情况下,你可能想要定义以下分类:

  • 将这些客户视为new

  • 将这些客户视为both

要在 SQL 中更改标签,你可以这样做:

WITH
  customer_month AS (
  SELECT
    user_id,
    DATE_TRUNC(order_date,MONTH) AS month,
    STRING_AGG(DISTINCT customer_type
    ORDER BY
      customer_type ASC) AS customer_type
  FROM
    customer_table
  WHERE
    order_date < '2021-01-01'
  GROUP BY
    1,
    2)

  -- Main Query
SELECT
  *,
  CASE
    WHEN customer_type LIKE 'new,returning' THEN 'both'
  ELSE
  customer_type
END
  AS c_type
FROM
  customer_month

我们可以通过直接按月分组找到更理想的查询,然而,这在使用报告工具并保持每日分辨率时可能是有用的,例如,在仪表板上添加过滤器。

带有新字段的表格将如下所示:

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

同时是新客户和回头客的客户被分类为不同类型(图片来自作者)。

额外的支持指标

虽然重复购买率可以是客户对你的产品的忠诚度或满意度的一个指标,但它并不表示客户产生了多少收入(他们是否带来了更多价值)或客户是否对他们的购买感到满意。

为了支持这个假设,我们可以将重复购买率与其他指标结合起来,例如:

  • 客户终身价值 (CLV),例如,可能是一个重要的增长指标,展示了客户将与你保持多久以及他们在你的产品上花费了多少。

  • 净推荐值 (NPS) 可能是另一个有趣的指标,用于评估客户满意度,并可能通过附加问题或调查了解他们为何再次购买。

我们还可以添加其他几个指标,包括平均订单值 (AOV) 或使用按月或按年分组的方法来计算客户保留率。

我们还可能使用 RFM 评分(最近性、频率、货币性)或其他方法来更好地理解您的客户群体。

参考资料与数据集

本文使用的数据集来自于BigQuery 公共数据,是 Google Analytics 数据的一个样本,遵循CC BY 4.0 许可。

[## BigQuery 示例数据集用于 Google Analytics 4 电子商务网站实施 | Google Analytics…

Google 商品商店是一个在线商店,销售 Google 品牌商品。该网站使用 Google Analytics 4 的…

developers.google.com](https://developers.google.com/analytics/bigquery/web-ecommerce-demo-dataset?source=post_page-----81f44c9e3598--------------------------------)

识别城市区域的热点

原文:towardsdatascience.com/identifying-topical-hot-spots-in-urban-areas-3c47cde5ae10

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

布达佩斯的时髦热点。

一个通用框架,使用 OpenStreetMap 和 DBSCAN 空间聚类来捕捉最受热捧的城市区域

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

·发表于数据科学前沿 ·9 分钟阅读·2023 年 10 月 16 日

在这篇文章中,我展示了一种快速且易于使用的方法,能够基于从OpenStreeetMapOSM)收集的兴趣点(POI)来识别特定兴趣的热点,使用了 sklearn 的DBSCAN算法。首先,我将收集一些我在 ChatGPT 上找到的属于几个类别的 POI 的原始数据,并假设这些数据具有所谓的时髦生活方式的特征(例如,咖啡馆、酒吧、市场、瑜伽馆);将这些数据转换为便捷的 GeoDataFrame 后,我进行地理空间聚类,最后,根据不同城市功能在每个聚类中的混合程度来评估结果。

尽管我所称之为“时髦”的主题和与之相关的 POI 类别在某种程度上是随意的,但它们可以很容易地被其他主题和类别替代——自动热点检测方法保持不变。这种易于采用的方法的优势包括从识别支持创新规划的本地创新中心到检测支持城市规划倡议的城市次中心、评估企业的不同市场机会、分析房地产投资机会或捕捉旅游热点。

所有图像均由作者创建。

1. 从 OSM 获取数据

首先,我获取目标城市的行政多边形。由于布达佩斯是我的家乡,为了方便(现场)验证,我使用了它。然而,由于我仅使用了OSM的全球数据库,这些步骤可以很容易地应用于 OSM 覆盖的世界其他任何地方。特别是,我使用 OSMNx 包以非常简单的方式获取行政边界。

import osmnx as ox # version: 1.0.1

city = 'Budapest'
admin = ox.geocode_to_gdf(city)
admin.plot()

这个代码块的结果:

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

布达佩斯的行政边界。

现在,使用 OverPass API 下载在布达佩斯行政边界的边界框内的 POI。在 amenity_mapping 列表中,我编制了一个与嬉皮士生活方式相关的 POI 类别列表。我还必须在此说明,这是一种模糊的、非专业的分类方法,使用这里介绍的方法,任何人都可以相应地更新类别列表。此外,还可以结合其他包含更精细多层次分类的 POI 数据源,以便更准确地描述给定主题。换句话说,这个列表可以根据你的需要进行任何方式的修改——从更好地覆盖嬉皮士相关内容到将这个练习重新调整到任何其他主题分类(例如,食品广场、购物区、旅游热点等)。

注意:由于OverPass下载器返回的是边界框内的所有结果,在这个代码块的末尾,我使用 GeoPandas 的叠加功能过滤掉那些在行政边界之外的 POI。

import overpy # version: 0.6
from shapely.geometry import Point # version: 1.7.1
import geopandas as gpd # version: 0.9.0

# start the api
api = overpy.Overpass()

# get the enclosing bounding box
minx, miny, maxx, maxy = admin.to_crs(4326).bounds.T[0]
bbox = ','.join([str(miny), str(minx), str(maxy), str(maxx)])

# define the OSM categories of interest
amenity_mapping = [
    ("amenity", "cafe"),
    ("tourism", "gallery"),
    ("amenity", "pub"),
    ("amenity", "bar"),
    ("amenity", "marketplace"),
    ("sport", "yoga"),
    ("amenity", "studio"),
    ("shop", "music"),
    ("shop", "second_hand"),
    ("amenity", "foodtruck"),
    ("amenity", "music_venue"),
    ("shop", "books"),
]

# iterate over all categories, call the overpass api, 
# and add the results to the poi_data list
poi_data  = []

for idx, (amenity_cat, amenity) in enumerate(amenity_mapping):
    query = f"""node"{amenity_cat}"="{amenity}";out;"""
    result = api.query(query)
    print(amenity, len(result.nodes))

    for node in result.nodes:
        data = {}
        name = node.tags.get('name', 'N/A')
        data['name'] = name
        data['amenity'] = amenity_cat + '__' + amenity
        data['geometry'] = Point(node.lon, node.lat)
        poi_data.append(data)

# transform the results into a geodataframe
gdf_poi = gpd.GeoDataFrame(poi_data)
print(len(gdf_poi))
gdf_poi = gpd.overlay(gdf_poi, admin[['geometry']])
gdf_poi.crs = 4326
print(len(gdf_poi))

这个代码块的结果是每个下载的 POI 类别的频率分布:

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

每个下载的 POI 类别的频率分布。

2. 可视化 POI 数据

现在,可视化所有 2101 个 POI:

import matplotlib.pyplot as plt
f, ax = plt.subplots(1,1,figsize=(10,10))
admin.plot(ax=ax, color = 'none', edgecolor = 'k', linewidth = 2)
gdf_poi.plot(column = 'amenity', ax=ax, legend = True, alpha = 0.3)

这个代码单元的结果:

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

布达佩斯所有下载的 POI 按其类别标记。

这个图表相当难以解释——除了市中心非常拥挤之外,所以我们使用一个交互式可视化工具,Folium

import folium
import branca.colormap as cm

# get the centroid of the city and set up the map
x, y = admin.geometry.to_list()[0].centroid.xy
m = folium.Map(location=[y[0], x[0]], zoom_start=12, tiles='CartoDB Dark_Matter')
colors = ['blue', 'green', 'red', 'purple', 'orange', 'pink', 'gray', 'cyan', 'magenta', 'yellow', 'lightblue', 'lime']

# transform the gdf_poi
amenity_colors = {}
unique_amenities = gdf_poi['amenity'].unique()
for i, amenity in enumerate(unique_amenities):
    amenity_colors[amenity] = colors[i % len(colors)]

# visualize the pois with a scatter plot
for idx, row in gdf_poi.iterrows():
    amenity = row['amenity']
    lat = row['geometry'].y
    lon = row['geometry'].x
    color = amenity_colors.get(amenity, 'gray')  # default to gray if not in the colormap

    folium.CircleMarker(
        location=[lat, lon],
        radius=3,  
        color=color,
        fill=True,
        fill_color=color,
        fill_opacity=1.0,  # No transparency for dot markers
        popup=amenity,
    ).add_to(m)

# show the map
m

该地图的默认视图(你可以通过调整 zoom_start=12 参数轻松更改):

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

布达佩斯所有下载的 POI 按其类别标记——交互版本,第一次缩放设置。

然后,可以更改缩放参数并重新绘制地图,或使用鼠标简单地放大:

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

布达佩斯所有下载的 POI 按其类别标记——交互版本,第二次缩放设置。

或者完全缩小:

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

布达佩斯所有下载的 POI 按其类别标记——交互版本,第三次缩放设置。

3. 空间聚类

现在我已经手头有了所有必要的 POI,我使用 DBSCAN 算法,首先编写一个函数来处理 POI 并进行簇分析。我只会微调 DBSCANeps 参数,它本质上量化了簇的特征大小,即要分组在一起的 POI 之间的距离。此外,我将几何图形转换为本地 CRS(EPSG:23700)以使用国际单位制。更多关于 CRS 转换的信息 在这里

from sklearn.cluster import DBSCAN # version: 0.24.1
from collections import Counter

# do the clusteirng
def apply_dbscan_clustering(gdf_poi, eps):

    feature_matrix = gdf_poi['geometry'].apply(lambda geom: (geom.x, geom.y)).tolist()
    dbscan = DBSCAN(eps=eps, min_samples=1)  # You can adjust min_samples as needed
    cluster_labels = dbscan.fit_predict(feature_matrix)
    gdf_poi['cluster_id'] = cluster_labels

    return gdf_poi

# transforming to local crs
gdf_poi_filt = gdf_poi.to_crs(23700)    

# do the clustering
eps_value = 50  
clustered_gdf_poi = apply_dbscan_clustering(gdf_poi_filt, eps_value)

# Print the GeoDataFrame with cluster IDs
print('Number of clusters found: ', len(set(clustered_gdf_poi.cluster_id)))
clustered_gdf_poi

该单元格的结果:

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

在 POI GeoDataFrame 中预览,每个 POI 按其簇 ID 标记。

总共有 1237 个簇——如果我们只是看舒适的 hipster 热点,这似乎有点太多了。让我们查看它们的大小分布,然后选择一个大小阈值——将一个只有两个 POI 的簇称为热点可能不太靠谱。

clusters = clustered_gdf_poi.cluster_id.to_list()
clusters_cnt = Counter(clusters).most_common()

f, ax = plt.subplots(1,1,figsize=(8,4))
ax.hist([cnt for c, cnt in clusters_cnt], bins = 20)
ax.set_yscale('log')
ax.set_xlabel('Cluster size', fontsize = 14)
ax.set_ylabel('Number of clusters', fontsize = 14)

该单元格的结果:

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

簇大小分布。

根据直方图中的差距,让我们保留至少有 10 个兴趣点(POI)的簇!目前,这是一个足够简单的工作假设。然而,这也可以通过更复杂的方式来处理,例如,通过考虑不同类型的 POI 或覆盖的地理区域。

to_keep = [c for c, cnt in Counter(clusters).most_common() if cnt>9]
clustered_gdf_poi = clustered_gdf_poi[clustered_gdf_poi.cluster_id.isin(to_keep)]
clustered_gdf_poi = clustered_gdf_poi.to_crs(4326)
len(to_keep)

这个片段显示有 15 个簇满足过滤条件。

一旦我们有了 15 个真实的 hipster 簇,将它们放在地图上:

import folium
import random

# get the centroid of the city and set up the map
min_longitude, min_latitude, max_longitude, max_latitude = clustered_gdf_poi.total_bounds
m = folium.Map(location=[(min_latitude+max_latitude)/2, (min_longitude+max_longitude)/2], zoom_start=14, tiles='CartoDB Dark_Matter')

# get unique, random colors for each cluster
unique_clusters = clustered_gdf_poi['cluster_id'].unique()
cluster_colors = {cluster: "#{:02x}{:02x}{:02x}".format(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) for cluster in unique_clusters}

# visualize the pois
for idx, row in clustered_gdf_poi.iterrows():
    lat = row['geometry'].y
    lon = row['geometry'].x
    cluster_id = row['cluster_id']
    color = cluster_colors[cluster_id]

    # create a dot marker 
    folium.CircleMarker(
        location=[lat, lon],
        radius=3, 
        color=color,
        fill=True,
        fill_color=color,
        fill_opacity=0.9,  
        popup=row['amenity'], 
    ).add_to(m)

# show the map
m

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

Hipster POI 簇 — 第一级缩放。

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

Hipster POI 簇 — 第二级缩放。

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

Hipster POI 簇 — 第三级缩放。

4. 比较簇

每个簇都算作一个别致的 hipster 簇——然而,它们都必须以某种方式独特,对吧?让我们通过比较它们所提供的 POI 类别组合来看看它们有多独特。

首先,追求多样性,并通过计算每个簇中 POI 类别的熵来衡量它们的多样性/变化性。

import math
import pandas as pd

def get_entropy_score(tags):
    tag_counts = {}
    total_tags = len(tags)
    for tag in tags:
        if tag in tag_counts:
            tag_counts[tag] += 1
        else:
            tag_counts[tag] = 1

    tag_probabilities = [count / total_tags for count in tag_counts.values()]
    shannon_entropy = -sum(p * math.log(p) for p in tag_probabilities)
    return shannon_entropy

# create a dict where each cluster has its own list of amenitiy
clusters_amenities = clustered_gdf_poi.groupby(by = 'cluster_id')['amenity'].apply(list).to_dict()

# compute and store the entropy scores
entropy_data = []
for cluster, amenities in clusters_amenities.items():
    E = get_entropy_score(amenities)
    entropy_data.append({'cluster' : cluster, 'size' :len(amenities), 'entropy' : E})

# add the entropy scores to a dataframe
entropy_data = pd.DataFrame(entropy_data)
entropy_data

该单元格的结果:

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

每个簇基于其 POI 配置文件的多样性(熵)。

以及对该表的快速相关性分析:

entropy_data.corr()

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

簇特征之间的相关性。

在计算聚类 ID、聚类大小和聚类熵之间的相关性后,发现大小和熵之间有显著的相关性;然而,这远未解释所有的多样性。显然,确实有些热点比其他热点更具多样性——而其他热点则相对更专业。它们专注于什么?我将通过比较每个聚类的 POI 档案与每个 POI 类型在聚类中的总体分布,并挑选出与平均水平相比最典型的三个 POI 类别来回答这个问题。

# packing the poi profiles into dictionaries
clusters = sorted(list(set(clustered_gdf_poi.cluster_id)))
amenity_profile_all = dict(Counter(clustered_gdf_poi.amenity).most_common())
amenity_profile_all = {k : v / sum(amenity_profile_all.values()) for k, v in amenity_profile_all.items()}

# computing the relative frequency of each category
# and keeping only the above-average (>1) and top 3 candidates
clusters_top_profile = {}
for cluster in clusters:

    amenity_profile_cls = dict(Counter(clustered_gdf_poi[clustered_gdf_poi.cluster_id == cluster].amenity).most_common() )
    amenity_profile_cls = {k : v / sum(amenity_profile_cls.values()) for k, v in amenity_profile_cls.items()}

    clusters_top_amenities = []
    for a, cnt in amenity_profile_cls.items():
        ratio = cnt / amenity_profile_all[a]
        if ratio>1: clusters_top_amenities.append((a, ratio))
        clusters_top_amenities = sorted(clusters_top_amenities, key=lambda tup: tup[1], reverse=True)
        clusters_top_amenities = clusters_top_amenities[0:min([3,len(clusters_top_amenities)])]

    clusters_top_profile[cluster] = [c[0] for c in clusters_top_amenities]

# print, for each cluster, its top categories:
for cluster, top_amenities in clusters_top_profile.items():
    print(cluster, top_amenities)

该代码块的结果:

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

每个聚类的独特设施指纹。

顶级类别描述已经显示出一些趋势。例如,聚类 17 显然是用于饮酒的,而 19 也混合了音乐,可能还有派对。聚类 91 包含书店、画廊和咖啡馆,显然是白天放松的地方,而聚类 120,则有音乐和画廊,可以是任何酒吧巡游的绝佳热身。从分布中,我们也可以看到,跳进酒吧总是合适的(或者,根据使用情况,我们应该根据类别频率考虑进一步的规范化)!

结论

作为本地居民,我可以确认这些聚类非常合理,并且尽管方法简单,但很好地代表了期望的城市功能组合。当然,这只是一个快速的试点,可以通过多种方式进行丰富和改进,例如:

  • 依赖于更详细的 POI 分类和选择

  • 在进行聚类时考虑 POI 类别(语义聚类)

  • 通过社交媒体评论和评分等方式丰富 POI 信息

如果 AI 编码工具减少了我们需要的工程师数量,我们该如何支配预算?

原文:towardsdatascience.com/if-ai-coding-tools-reduce-the-number-of-engineers-we-need-where-do-we-spend-our-budgets-abd6248ad833

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

作者使用 Midjourney 生成的图片

AI 对产品工程团队的影响 — 第四部分

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

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

这是一个六部分系列的第四部分,调查了像 Github Copilot、ChatGPT 和 Amazon CodeWhisperer 这样的生成性 AI 生产力工具如何影响整个产品工程团队的结构。

第三部分,我们探讨了:

  1. 生成性 AI 工具如何潜在颠覆长期以来的 5 名工程师对 1 名产品经理的比例。

  2. 像 Github Copilot 和 AWS Amplify Studio 这样的工具如何重新塑造产品开发,将工程师的焦点从手动编码转向设计、架构和集成。

  3. 生成性 AI 工具如何帮助面临技术过时问题的团队,轻松处理复杂的移植和重构工作。

  4. AI 工具对移动和网页应用开发的潜在统一影响,减少重复工作并弥合网页、Android 和 iOS 开发之间的技能差距。

  5. 编码自动化对初级开发人员和工程进步的影响

我们的新组织将是什么样的?

LLMs 已经改变了游戏,并让我们接触到了生成性 AI——尽管麦肯锡的预测存在,但它们现在至少可以给人“应用专业知识”的印象。与虚拟现实和 Web 3.0 的虚假承诺不同,生成性 AI 工具有大规模、有意义的机会改变我们的工作,并且在这一时代变革中会有赢家和输家。

尽管美国经济的近期积极迹象以及微软、谷歌和 Meta 的强劲盈利回归令人振奋,全球经济中的通胀关联的犹豫可能会影响人们对这一机会的反应。如果我们回到 2023 年之前的繁荣时期,大多数公司会把当前情况视为一个增长机会,受到了过去五年疯狂投资泡沫和科技估值的影响。

但我们现在处于一个不同的世界。对于那些没有关注风险投资惨淡状况的人来说,2023 年第一季度的融资较 2022 年第一季度下降了 53%。在金融科技融资方面,情况更为严峻,2023 年第二季度的融资环比下降 48%,这是自 2017 年以来未曾见过的水平。风险投资的繁荣已经彻底结束(除非你碰巧是一家真正的、诚实的深科技 AI 公司,这里还有另一场疯狂的淘金热)。

更加严峻的宏观经济条件,导致我今年所接触的几乎每一家初创公司都削减了任何可自由支配的开支以应对经济下行,这意味着对许多公司来说,生成式 AI 编码工具所带来的机会将被视为一种生存选择,以保护现金和运营资金。

对于那些财务状况更健康的公司而言,这一机会可能使他们能够在保持或增长产品工程预算之间做出选择,但需要重新调整团队以适应新的现实。

让我们来玩一场游戏

作为一个思想实验,让我们接受本系列前面部分的推理,假设这些新工具确实可以将工程比例从 5:1 转变为 1:1。

[另一个提醒,我不认为这一点 发生,但我相信它 可能 发生,考虑到如果真的发生了,其影响是有用的]

让我们看看如果将 1:1 比例映射到三种不同的情景中会发生什么:首先,一家公司手头充裕,拥有投资于增长的现金,并且不想失去任何有才华的工程师。其次,一家公司面临财务限制,选择保持相同数量的团队和产出,但通过减少工程人员来利用可观的成本节省。最后,考虑一家选择保持预算不变,但将角色和团队结构转变为符合新比例的公司,从而使其成本保持中立但产出增加。

毋庸置疑,这些模型极其简化,最好将其视为漫画,以鼓励我们思考未来。

起始情景

假设我们有一个 100 人的产品和工程团队。将我的产品和工程比率扩展到其他角色,我假设每个团队有一个产品经理和五个工程师。

我还将假设每个团队中有两个额外的‘其他’角色(可以是数据工程师、QA、设计、UX、DevOps 等)。这将我们的团队人数带到‘五到九人’,即两个披萨的甜蜜点。

现在,团队是不能自我运转的,所以我还假设每个团队在某些中央或管理团队中有一个额外的‘非团队’角色,负责保持组织的重量不会自我压垮,同时发送电子邮件和购买甜甜圈。

因此,对于每个团队:有 1 个产品角色,5 个工程师,2 个其他团队角色和 1 个非团队角色。为了简化,我将数据科学、机器学习工程、分析和数据治理角色从这些模型中分离出来。

这意味着我们 100 人的整体产品和技术组织包括 11 个团队。

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

让我们使用一些非常基本的假设,假设我们公司中每个人的年薪为 65,000 英镑,并且有大约 1.5 倍工资的附加人员成本。这给我们带来了大约 1000 万英镑的总工资账单。这些数字(和货币)对你的组织来说肯定不现实,但足以满足我们的需求。

在我们 100 人的产品工程团队(今天的 5:1 比率)中,我们有 89 人分布在 11 个团队中。在这 11 个团队中有 11 位产品经理和 55 位工程师。

现在,让我们模拟一些不同的场景。

场景 1:增长

我们采取一个极其乐观的观点。我们的第一家公司不仅异常盈利且现金充裕,而且对所有工程师深感承诺。领导者决定不想告别任何工程师,而是希望拥抱增长。

随着我们新的 1:1 技术与产品比率,这为将输出从 11 个创造价值的团队增加到 55 个提供了一个令人兴奋的机会。首次,这可能足以在今年交付整个计划的路线图!

当然,这种无限的乐观伴随着一些挑战。首先,他们将需要招聘大量新的产品角色——准确来说是 44 个。而且他们跟踪的结果数量的任何增加都将对所有其他角色产生影响。

基于我们之前为 QA、UX 和设计等其他角色建立的比率,他们将看到增加 88 个‘其他团队’角色,仅仅是为了跟上所有成果。而且更多的人意味着更多的支持人员——更多的经理,更多的 HR 业务伙伴,更多的招聘人员。

这个极不现实的、极度乐观的场景将我们引导至一个几乎是原来三倍大小的组织(275 人对 100 人),相应地,毛薪资账单也大幅增加(从 1000 万英镑到 2700 万英镑)。但,至少我们没有减少工程角色,对吧?

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

场景 2:节省现金,削减成本

对于目前面临经济挑战的公司来说,CFO 或 CEO 总会问这个问题:“我们可以在哪里削减成本?”

在冷静而逻辑严密的目光下,产品和技术领导者的问题将变成:“我们的团队可以做得多小,还能实现相同的成果。”我们的新比例使得这个问题的答案尤为显著。曾经我们需要 55 名工程师来支持 11 个团队,现在每位开发者的生产力提高将表明我们可以对这个数字进行大幅削减。

如果公司面对这一挑战的领导者做出的决定纯粹是经济上的,他们将选择保留 11 个团队,并保护他们承诺的所有成果。但这会导致工程职能的大幅削减,预算中削减了 44 个角色。

尽管我们的基本比例显示其他团队和非团队角色不受影响,但现实可能会有所不同。我们的整体产品工程团队人数从 100 人减少到 55 人,这带来了其他好处。较小的团队意味着较少的复杂性、更好的沟通、整体效率更高,以及组织中的信噪比更好。尽管我不愿意承认,55 人的组织几乎肯定会优于 100 人的组织。

(注:是的,这个模型有缺陷,我知道你有评论。我暂时保持这个模型的简单,不讨论关键人物依赖、缺席、替代、非工作时间支持等问题。我们会在其他文章中再次探讨这些问题)

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

场景 3:零和游戏:维持预算

希望最现实和最可能的结果是,我们的虚拟公司相对成功,没有需要做出痛苦的财务决策。对于这个公司来说,预算应该保持一致,并且有机会在不增加成本的情况下增加我们承诺的成果数量。

在这个模型中,产品和技术领导者查看整体预算,并基于新的 1:1 比例意识到,他们可以保持组织中的人员数量不变(100 名全职员工),但现在可以将致力于有价值成果的团队数量增加到 20 个。

从 11 个团队增加到 20 个需要我们招聘 9 个新的产品角色(每个团队一个),并且还需要增加其他角色以支持这些新团队。“其他团队”角色(如设计和 QA)从 22 人增加到 40 人,而我们的非团队管理和共享服务角色从 11 人增加到 20 人。

可悲的是,产品和其他团队的增长必须在不增加任何成本的情况下进行,这种成本节省来自于工程角色的减少。虽然不如其他情况严重,但这个情境要求我们从组织中裁减 35 个工程角色,这一减少依赖于开发人员生产力的提升。

这种结构性变化对组织仍然会相当震撼,但远不及其他两种情境。这保持了整体团队规模和预算的一致性,但组成却有很大不同。

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

在最简单的层面上,我们在这些情境中提出的问题是*“生成型 AI 工具会减少五个开发人员还是增加五个产品经理?”*。非常重要的一点是,1:1 的比例纯属假设,可能是我们能考虑的最极端的情况。

更可能的是,比例会基于操作约束(如覆盖缺席)和当前关于生产力提升的研究(完成任务时间减少约 55%),更加微妙地减少到 3:1 或 2:1。

尽管如此,作为一个思维实验,我们现在有一些最佳和最差的案例来框架我们的思考。

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

在第五部分中,你可以阅读到:

  1. 编码自动化工具对不同规模企业的潜在影响,从风险投资支持的初创企业到可能面临的重大决策,大型公司的工程团队也面临挑战。

  2. 面对变革性生成型 AI 工具,外包开发公司的迫切担忧,因为招聘、成本和价值主张的动态发生了变化

  3. 在 AI 时代人类工程师的不可替代价值

  4. 号召读者参与并开始测试假设

等待第五部分发布

本系列其他文章:

附言。如果你喜欢这些关于团队的文章,可以看看我的Teamcraft 播客,在这里我和我的共同主持人安德鲁·麦克拉伦(Andrew Maclaren)与嘉宾讨论什么使团队运作成功。

如果工程师开始使用 AI 编码工具,我们的产品团队会发生什么?

原文:towardsdatascience.com/if-engineers-start-to-use-ai-coding-tools-what-happens-to-our-product-teams-acd55fb273dd

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

作者使用 Midjourney 制作的图片

AI 对产品工程团队的影响——第三部分

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

·发布于 Towards Data Science ·10 min read·2023 年 7 月 27 日

这是一个六部分系列的第三部分,调查像 Github Copilot、ChatGPT 和 Amazon CodeWhisperer 这样的生成性 AI 生产力工具可能如何影响整个产品工程团队的结构。

第二部分 中,我们探讨了:

  1. 生成性 AI 工具如 ChatGPT 如何重新定义产品工程团队处理编码的方式——从生成用户故事到实际编写代码。

  2. 诸如编写测试和文档等开发者通常认为繁琐的任务,现在可以由 AI 轻松高效地处理,从而使整个编码过程更加流畅。

  3. 测试的重要性以及经过深思熟虑的测试设计可能会启动的 prompt-engineered 应用的潜在未来。

  4. 对未来的愿景,其中生成性 AI 工具重塑了产品工程团队内的角色,以及对工程师和领导者的深远影响。

生成性 AI 工具将如何改变团队结构?

我过去几个月一直沉迷的想法是,生成性 AI 工具对产品工程团队的影响将导致产品角色与技术角色的比例发生根本性变化。在本系列的第一部分中,我反思了许多产品团队中工程师与产品经理的常见比例是五名工程师对一名产品经理。

现在,当我感到特别大胆或特别宿命论时,这一假设变成了:

“当前的产品工程团队需要五个工程师对应一个产品经理。下一代产品工程团队只需要一个高级工程师对应一个产品经理”

这是我想要验证的内容。

在本系列的前几篇文章中,我们讨论了这些开发者和生产力工具的个体影响,但现在我想将你的视线拉回到更战略的角度——增强的开发者生产力对团队,甚至整个组织的影响。

为了思维实验的目的,假设我们接受这样的观点:像 Github Copilot 这样的生成性 AI 工具可以提高单个开发者约 50%的生产力。还假设在当前的状态下(如我们在第一部分中所述)一个产品经理对应五个工程师是一个合理的比例。如果这两个条件成立,我们可以推断长期以来的 5:1 比例将需要改变。

我相信,自 2022 年 Copilot 发布以来,我们所见的进展将会继续,特别是在风险投资资金流向生成性 AI 初创公司而不是元宇宙和 Web3.0 的情况下。

一大批新工具每天开始在ProductHunt上出现,如BifrostLocofy(这两者都将 Figma 设计转化为可工作的 React 代码,类似于Amazon 的 Amplify Studio),有趣的是看看这些工具能多快以及与谁一起获得 traction。

开发者在大型团队中不太可能推动这种新型代码自动化工具的采用,因为对代码质量的历史疑虑和企业风险规避。更可能的是,初创公司创始人、以创新为导向的产品经理和较小的营销团队将成为早期采纳者,被自动生成的网站和应用的较低成本和更快上市速度所吸引。

我能听到仍在阅读的工程师发出叹息,“当然 我的 应用程序太独特, 我的 问题太复杂,这些基本的、像乐高积木一样的应用程序无法取代我的工作”。但正如 Kelsey Hightower(Kubernetes 的原始贡献者之一,曾是 Google 的杰出工程师)所说的那样,

“尽可能长时间坚持使用单调的架构,并将大部分时间和资源用于构建客户愿意支付的东西。”

如果你仍然认为你的应用是独特而美丽的,这条跟进推文来自 Derek Neighbours,清楚地总结了那句“无聊架构”评论应该指向的对象:几乎每个人

需要非无聊架构的公司数量几乎接近零。没有什么比一个拥有 12 个客户的初创公司从 Netflix 或 Google 复制扩展模式更滑稽的了。

回到我的假设;大多数工程师将变得更有生产力,大多数架构不应该复杂,生成 AI 工具将比 2023 年状态有显著提升。如果这些都成立,那么工程师的工作将从基础的管道和维护转向更严肃的问题,如架构、解决方案设计、性能、安全以及管理日益复杂的内部生态系统。

我们可能会开始看到 测试驱动解决方案设计,其中工程师的角色是以一种方式指定应用程序的功能,使得生成 AI 工具可以被提示生成测试和一个可工作的应用程序。在设计阶段创建的测试将继续证明应用程序满足公司和客户的需求,并自我记录应用程序。

代码生产力工具如何承担更多显而易见的任务之外的工作

我们已经讨论了生成 AI 工具对新产品和功能开发的影响,但对大多数工程师来说,这只占据了他们日常工作的一个部分。对于很多工程师来说,“业务照常”中的维护和操作任务占据了他们的大部分工作时间。重构、修复错误、小改动请求和小版本升级可能消耗大量宝贵的开发时间。当考虑到这些平凡的任务时,我们讨论的工具也同样强大,就像它们在令人兴奋的新产品开发工作中一样。

几年前,我和一个团队一起处理一个需要升级的旧数据库。团队现在非常现代,采用微服务(是的,这现在是一个形容词),而且没有人有古老 SQL 或过时的古老数据库引擎的经验。这种情况并不罕见,经常会引发小型紧急情况,因为团队急于找到具备神秘知识的人。原本应该是相对简单的任务突然颠覆了所有精心策划的路线图。

团队经常面临这些问题——无论是重写旧的和被遗忘的东西,还是需要从一个主要版本升级到另一个版本——他们必须仔细查阅过时且通常文档不佳的代码,以学习新的东西(或重新学习令人沮丧的旧事物)。

但是这些代码助手工具并不在乎它们接收到什么语言(是的,我确实让 ChatGPT 写过brainf*ck和机器码以图乐趣)。这些 LLM 已经接受了所有文档,数十亿行代码示例和所有关于Stack Overflow的争论(可能)。对于 LLM 来说,重写即使是未记录的代码也并不是什么大事。更好的是,可以很容易地要求这些工具为旧代码和新代码编写测试。

为了确认我没有产生幻觉这个任务是可能的,我去找了一些互联网上的随机旧 Perl 代码,然后将其输入到 GPT4 中。在让它解释代码功能后,我接着询问可以用什么语言替换 Perl。它建议使用 Python,并立即生成了相应的代码。经过一次提示,我们得到了一些测试来检查代码是否正常运行。

作为额外奖励,我想看看我们是否可以将其移植到 Rust,这是 Stack Overflow 过去几年‘最受喜爱的语言’之一。正如你可能猜到的那样,它确实没有遇到什么问题。

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

让 ChatGPT 随机重构我在互联网上找到的东西

如果像文档和测试创建这样的简单但耗时的任务,以及版本升级和重构等常规工程任务可以由 AI 工具来完成,那么结果会是什么?几乎可以肯定的是,这会改变那 5:1 的比例。

网络和移动应用团队的奇怪世界

在那些选择同时构建网站和移动应用程序的组织中,我们有时会遇到一种稍微奇怪的功能失调。虽然网站和移动版本的功能和客户价值通常是相同的,但我们发现自己不得不将构建不同应用程序的团队分开。即使在那些努力围绕价值流对齐团队的组织中,专业知识和系统的分裂几乎总是导致了专门团队的形成。

这对于产品是重新设计的移动设备网页界面的公司(即所谓的‘响应式设计’)不是问题,但即使是那些选择构建‘混合’移动应用的公司,这种情况也可能成为问题,其中应用程序在像 React Native 这样的网页相邻框架中开发。至少在这些混合应用中,代码可以有一定的相似性,发布移动和网页产品所需的技能也可以广泛转移。

原生移动应用——那些专门为 Android 和 iOS 构建的应用——可能会进一步复杂化问题。对于那些认为原生应用很重要的企业,且希望 Android 和 iPhone 用户获得相同优质体验的企业,我们通常需要额外的技能要求,需要具有 Java 或 Kotlin(针对 Android)或 Swift/Objective-C(针对 iOS)专业知识的工程师。

选择交付原生移动应用以及网页界面的公司面临大量重复的努力和相应的成本增加。

正如我们所见,在这种情况下,我们的生成式 AI 编码助手可以利用它们的语言无关性,创建多种语言的设计良好、测试充分的应用程序。这可能的影响是,我们可能不再需要因技能集的不同而拆分移动和应用团队,而仅仅是在网页和移动应用具有显著不同功能和特性时才需要分开。在一些公司,这可能会大大简化流程,并节省多达一半的工程预算。

对初级和中级开发者(尤其是在初创公司和小型企业中)有什么影响?

在撰写本文之前,我与许多从事技术和产品的人讨论了这些编码工具可能产生的影响。几乎一致地,在我描述了这些工具可能的影响后,都会有人指责地问我*“那么所有的初级开发者会发生什么?”*

我曾与之共事的每位优秀工程经理或技术领导者都非常关注培养初级人才。优秀的工程师编写优秀的应用程序,而伟大的工程师则教导他人。因此,我得到的对这个讨论的最初反应之一就是对下一代的担忧。

说实话,我在短期内感到担忧。正如我们将在第四部分中看到的那样,一种潜在的影响是公司决定削减预算和团队规模,尽管承包商和外包开发团队可能会首先被裁减,但中级和初级开发者将会是下一个被裁减的对象。

我担心这些变化可能会导致我们技术人才的代际“剥皮”,即整个初级开发人员群体无法在团队中找到工作。构建应用程序所需的技术技能,至少在早期采用公司中,是资深工程师所具备的——包括解决方案和架构设计、安全性以及奇特的边缘案例。即便是技能娴熟的初级和中级工程师,也因为其角色定义和从业时间的限制,无法获得这种经验。

如果生成式 AI 工具在完成基本工作,那么最需要的就是资深开发人员和解决方案架构师的技能。

然而,尽管对初级开发人员的影响确实令人担忧,但并非全然黑暗。我最近在尝试学习 React 和 Django 时使用 Copilot,发现我的体验与职业生涯初期时截然不同。能够实时讨论一段代码的作用或错误所在,彻底改变了我的学习体验。我希望在我学习编码时能够使用 ChatGPT。

但尽管编写代码显然是开发人员的一项重要技能,但这并不是我们团队真正需要的那种难以言喻的品质。最好的工程师能够相对轻松地从一种语言转到另一种语言,是有原因的;优秀的工程师不是被教会编程的,而是被教会如何思考的。我仍然相信,创造性思维和系统思维能力将继续成为工程师为团队带来的标准。

我担心这些变化对初级开发人员的影响,但我也抱有希望。我尚未看到一个不需要技能熟练的工程师与技能熟练的设计师和产品经理共同工作来构建优秀产品的未来。即使每个团队的开发人员数量减少,也许我们会更倾向于类似某些传统手工业的模式,即初级人员在较长时间内更专门地向一位资深导师学习。

德语词汇“Wanderjahre”指的是一种可以追溯到中世纪的实践,年轻的工匠在学徒期后会从一个地方迁移到另一个地方。这段旅程的一个重要组成部分是体验不同的工作坊和文化,发展技能和思维方式,作为最终交付他们的Meisterstück(杰作)的追求的一部分。

或许这种古老的传授工程“精通”方法将更适合我们下一代产品团队。

在第四部分中,您可以阅读到:

  1. 生成式 AI 在经济衰退和风险投资资金减少的情况下,对组织造成的重大转变。

  2. 一个思想实验,考察三种情境:潜在增长、削减成本以及在引入生成式 AI 生产力工具的情况下维持现有预算。

  3. 假设的后果和挑战,比如团队组成的剧烈变化,以及这些变化可能对产品经理和工程师等角色意味着什么。

  4. 对这些工具对生产力和团队动态的真实影响的反思,为持续的行业讨论提供了基础。

阅读第四部分,当它发布时

本系列的其他文章:

附注:如果你喜欢这些关于团队的文章,可以查看我的Teamcraft 播客,在这里我和我的共同主持人 Andrew Maclaren 与嘉宾讨论什么使团队有效。

如果口头和书面交流使人类发展了智力……那么语言模型怎么样?

原文:towardsdatascience.com/if-oral-and-written-communication-made-humans-develop-intelligence-whats-up-with-language-models-b65ae22ac8e0

文章

我们是否也只是经过更好训练的随机鹦鹉?AI 语言模型是否在追随人类智能的足迹?这是一个科学与虚构边界的讨论。

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

·发布于Towards Data Science ·阅读时间 12 分钟·2023 年 6 月 30 日

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

图片由Priscilla Du Preez拍摄,来源于Unsplash

人类智能以其非凡的认知能力在其他物种中独树一帜。这种智力优越性的催化剂可以追溯到语言和文字的出现,它们促进了知识的交流和积累、协作学习和深思熟虑。从这个类比来看,AI 语言模型似乎也在踏上类似的旅程,利用沟通的力量推动其自身形式的“智能”发展。本文将探讨 AI 语言模型如何发展以复制并超越人类认知的非凡成就。

请注意,本文只是我的思考,带有挑衅的语气,引用了专家的研究,但更多是个人观点。

欢迎在评论区讨论,尊重不同意见,并尽可能提供适当的参考。

言语和写作使人类能够进行复杂的推理和逻辑思考。许多计算机科学家正在尝试创建可以通过处理大量数据、进行快速计算并设计所谓的“思维链”来执行复杂推理任务的 AI 模型,这使它们不仅能够分析模式,还能推断因果关系,从而生成逻辑结论,使其能够解决复杂的问题。

[## 写作作为思维工具

写作过程可以成为一个强大的工具,帮助你探索、表达和完善想法。

curiosityneverkilledthewriter.com](https://curiosityneverkilledthewriter.com/writing-as-a-tool-for-thinking-d295ca8fba7a?source=post_page-----b65ae22ac8e0--------------------------------) [## 文学思维:思想和语言的起源

亚马逊网:文学思维:思想和语言的起源:9780195126679:马克·特纳:书籍

www.amazon.com](https://www.amazon.com/Literary-Mind-Origins-Thought-Language/dp/019512667X?source=post_page-----b65ae22ac8e0--------------------------------) [## 语言模型通过思维链进行推理

近年来,扩大语言模型的规模被证明是提高性能的可靠方法…

ai.googleblog.com](https://ai.googleblog.com/2022/05/language-models-perform-reasoning-via.html?source=post_page-----b65ae22ac8e0--------------------------------)

正如言语和写作使人类能够高效地分享和积累知识,从而创造我们的文化,AI 语言模型利用庞大的数据集从各种来源学习,并迅速扩展其知识库。这些模型可以通过访问大量信息库来提供主题见解、回答问题,并生成创造性解决方案——当然,也可能误导或创造虚假材料,但这不是本讨论的重点,无论如何,我们人类也会创造这种内容,即使它是“文化”的一部分。

一些科学家认为,语言和书写的进化不仅帮助人类进一步发展智力,同时也促进了文化的创造。那么,语言模型的进化是否最终能够培养出“真正”的智能呢?无论是在两年内还是一个世纪后?毕竟,我们自身的智力可能来源于一种极其复杂的“小思维链”组合,这些链条最终产生出我们特别“聪明”的生动印象,而实际上我们在与现实的联系上只是稍微优于普通动物——而现实可能甚至不具备客观性!换句话说,如果 AI 模型是“随机鹦鹉”,我们是否也只是随机鹦鹉,只是我们(目前)在数量级上更高,并且通过多种感官将来自周围世界的信息输入到我们的神经网络中?

如果 AI 模型是“随机鹦鹉”,那么我们是否也可以是随机鹦鹉,只不过我们的能力高出几个数量级,并且通过多种感官将来自周围世界的信息输入到我们的神经网络中?

随时间推移精炼和打磨思想

通过迭代的精炼,人类逐渐表达复杂的思想并增强观点。AI 模型可以通过根据用户反馈不断调整其回应,走上类似的道路。通过引入强化学习技术,AI 模型像人类通过反馈和迭代来打磨思想一样,迭代其表现。例如,ChatGPT 本身就是通过强化学习训练的,这种方法由人类反馈辅助:

[## 什么是 ChatGPT? | OpenAI 帮助中心

常见问题关于 ChatGPT

help.openai.com](https://help.openai.com/en/articles/6783457-what-is-chatgpt?source=post_page-----b65ae22ac8e0--------------------------------)

关于思想随时间推移的打磨和演变,写作在人类中具有特别的作用,因为它作为外部记忆大幅扩展了我们存储和检索信息的能力。在聊天过程中,AI 语言模型(如目前运行的状态)可以通过考虑以前回答和问题的上下文信息来模拟这一过程,充当一种扩展记忆。目前,这种记忆是暂时的,新的对话开始时会消失,但如果有一天模型能够固有地回忆起以前的对话,它们可能会开始基于先前的知识进行构建,提供更连贯和个性化的回应。(或者如果它们在之前的互动中学到了不良信息,也可能会提供更多错误的回应、虚假新闻和不当内容……)

迭代学习推动了人类创新,基于现有知识推动进步。AI 模型同样可以通过生成各种可能性并评估其结果来进行迭代学习。注意,当前的 AI 语言模型已经具有这种内部“评分”,对替代答案进行排名,这一点我确实在这里讨论过(技术文章在前!):

探索令牌概率作为过滤 GPT-3 答案的手段

为了构建更好的 GPT-3 驱动的聊天机器人

towardsdatascience.com

促进集体 AI 创建“AI 文化”

一个重要的点是,人类文化和人类学习本身并不限于个人经历;相反,它们依赖于社区的积累智慧。如果有一天 AI 语言模型能够进行协作学习和数据交换,那么通过在模型之间共享信息和见解,它们可以共同受益于彼此的知识,加速整体智能的发展。特别是如果能够浏览互联网,虽然它们已经开始这样做。但当然,它们必须以某种方式存储每次会话的输出,就像我们记住我们所学到的知识并每天重复一样,然后我们将其写入书籍或互联网以进行传播。

在这一点上,让我“幻想”一下,假设聊天机器人可以开始相互通信并存储和使用它们与人类的先前互动以成长——无论这种成长可能带来什么好坏的方向……我们在这里只是进行一个思维实验,这将延续到接下来的部分。

我们在这里进行一个思维实验,这将延续到接下来的部分。

在人类中,集体智慧来源于合作,使他们能够共同解决复杂的问题。相互连接的 AI 语言模型可能通过提供一个共享平台来促进这种集体智慧,从而使人类和机器能够互动和交流知识。这种合作培养了混合智慧,人类和 AI 协同工作以克服挑战,开辟新领域。但如果如本场景所假设的那样互联,那么不同的 AI 模型也可能开始彼此交换信息。那么会怎样呢?

AI 语言模型作为真正的思维机器?

对 AI 语言模型未来演变成类似人脑的思维机器进行推测是一个引人入胜的话题。全球范围内,心理学家、哲学家、计算机科学家和工程师团队认真研究这一问题,从不同方面解决相关问题:

数据与复杂性 正如人类通过接触大量的言语和写作来发展其智能一样,AI 语言模型也需要大量数据来有效学习和泛化。未来,AI 模型可能会从更大的数据集受益,这些数据集涵盖了各种信息来源,使其能够获取广泛的知识和类似于人类的上下文。直接连接互联网并从中学习,甚至仅仅是浏览信息,也将使语言模型达到新的水平。

多模态学习 人类通过多个感官感知和理解世界,将视觉、听觉和触觉输入整合以形成连贯的理解。AI 语言模型可能会发展出多模态学习,整合文本、图像、视频和音频,使其能够通过各种方式理解和交流。这种整合可以帮助它们获得类似于人类的更全面的世界理解。这些“通用”模型已经成为活跃的研究主题,甚至像 Deepmind 这样的主要公司也在研究:

## Gato,Deepmind 最新的进展。迈向真正的 AI?

Gato 可以玩游戏、生成文本、处理图像以及控制机器人手臂。而且它的体积并不大。这是真正的 AI……

[towardsdatascience.com

上下文理解

理解上下文对人类智能至关重要。AI 模型在上下文理解方面取得了显著进展,实际上能够相当好地维持连贯、有趣的对话。但未来的进步可能使它们更准确地把握细微的差别、文化参考和社会动态。增强的上下文理解可以使 AI 模型生成符合人类交流意图和情感细微差别的回应。

推理与创造力

人类智能包括推理、问题解决和创造性思维。未来的 AI 模型可能会发展出更高级的推理能力,使其能够进行逻辑推断、类比推理,甚至抽象推理。创造性思维,包括生成新颖的想法和解决方案,可以通过开发能够进行类比思考和探索广泛解决方案空间的 AI 模型来培养。

请注意,正如艺术家们自己所承认的,几乎没有什么可以被称为真正创新的艺术。相反,新艺术、概念和想法从一种基础上涌现出来,这种基础,无论是有意识的还是无意识的,最终赋予了我们新创作的形式。同样,我们也不应期望 AI 模型从零开始真正创造出全新的东西!我们发现它们的创作中至少有一些回忆,甚至是实质性的相似之处,这很正常,就像人类的创作一样!

正如艺术家们自己承认的,几乎没有什么可以被称为真正创新的——我们总是基于先前的作品和想法进行创作,无论是有意识的还是未曾意识到的。

情感智能

情感智能在人际互动中扮演着至关重要的角色。未来的 AI 模型可能会被设计成理解和响应人类情感,融入情感分析、共情对话生成,并能够识别和适应情感提示。这些发展可能使 AI 能够进行更有意义和情感敏感的对话,促进与人类之间的更深层次的联系。

请注意,最现代的增强现实和虚拟现实头戴设备已经能够读取面部表情,并将其反映在用户的虚拟形象中。一旦面部表情被识别,训练一个简单的神经网络将其转化为情感状态并不会太困难。

[## 面部表情可以用于虚拟现实中的互动

新技术允许人们仅通过面部表情与虚拟环境进行互动。

www.snexplores.org

持续学习

人类智能不是固定的,而是通过学习和适应不断进化的。即使我们的品味也会随着时间的推移发生变化!

AI 模型可以融入持续学习技术,使其能够从新经验中学习,适应变化的环境,并随着时间的推移不断完善知识。这种持续学习的特点将使 AI 模型变得更加灵活,能够获取新技能和知识,类似于人类如何不断学习和成长。

自我意识与意识

这可能是最棘手的问题之一,尤其是因为自我意识和意识的概念在人类中甚至还没有完全理解,更不用说在人工系统中复制它们了。

然而,模拟某种形式的自我意识并不难,使人类用户误以为模型能够感知自己的存在、思想和经验。除了令人不安的目标之外,这种模拟在心理学、教育等应用软件的开发中可能会有用。

回到演讲、写作和思考

演讲和写作被广泛认为是人类智力发展的关键因素,将我们与其他动物区分开来。这些沟通媒介在增强人类认知和促进跨代知识传递方面发挥了关键作用,随着文化的建立,我们不断进步。

在这个类比的基础上,我们可以探索 AI 语言模型如何类似地利用沟通的力量来提升它们的“智能”,无论这是否是真正的智能。

知识的交流与积累

演讲和写作使人类能够比其他任何物种更高效地交换和积累知识。同样,AI 语言模型可以访问大量的数据和信息,使它们能够从各种来源学习并迅速积累知识。通过利用这一庞大的知识库,AI 模型可以提供见解、回答问题,并生成非常有创意的解决方案。目前,这些好处是以可能的错误信息和有害内容的生成为代价的,但这在未来可能会有所改善。

协作学习与文化传递

人类不仅从个人经验中学习,也从社区中积累的知识和智慧中学习。同样,AI 语言模型也可以开发协作学习和文化传递的机制。通过在模型之间共享信息和见解,它们可以集体受益于彼此的知识,从而加速整体智能的发展。当然,前提是它们能够相互沟通,尽管最终结果尚不明确,因为它们的训练数据集可能已经大部分重叠。

想法的精炼与打磨

通过演讲和写作,人类能够精炼思想、表达复杂的观点,并随着时间的推移进行迭代。AI 模型也可以通过不断根据用户反馈微调其响应,参与类似的过程。通过引入强化学习技术,AI 模型可以像人类通过反馈和迭代精炼其想法一样,逐步提升其性能。

增强记忆与回忆

书写使我们能够将思想和记忆外化,扩展我们的存储和检索信息的能力。如果 AI 语言模型能够保留先前互动的上下文信息,它们可能拥有一种扩展的记忆,有效地帮助它们更好地适应不同的用户档案。通过回顾先前的对话,模型可以保持上下文,基于先前的知识提供更连贯、更个性化的响应。

促进复杂推理

正如我已经讨论过几次的,语言和文字使人类能够进行复杂推理和逻辑思考。AI 模型也可以被设计来通过“思维链”执行复杂的推理任务,给人一种它们在分析模式、推断因果关系和生成逻辑结论的印象。尽管这些可能不是“自然智能”中的“真实”思考步骤,但在实践中,它们确实使 AI 能够处理复杂问题(甚至解释如何解决这些问题)。

迭代学习与创新

通过提供一种集体记忆,文字的发展使人类能够进行迭代学习,基于现有知识推动创新。AI 模型通过强化学习和生成过程,也能进行类似的迭代学习。通过生成各种可能性并评估其结果,AI 模型可以探索新颖的解决方案,促进创新,推动其“智能”的边界。

促进集体智慧

人类拥有集体智慧,利用基于语言的交流和书写阅读的协作力量共同解决复杂问题。AI 语言模型可以通过提供一个共享平台来促进集体智慧,使人类和机器互动并交换知识。这种合作最终可以导致混合智能的出现,在这种智能中,人类和 AI 共同解决挑战并开辟新的领域,或更高级的 AI 形式。

一些最后的话

在这里,我探讨了语言与文字作为人类智慧催化剂的类比,以及人工智能如何从类似今天存在的语言模型中发展。通过利用交流、提炼、记忆、推理、迭代学习和集体智慧的力量,AI 模型可能在朝着卓越的“认知”发展。是的,我知道我的说法很挑衅,但请记住讨论中的一个核心观点:我们人类可能和大型语言模型一样是随机的鹦鹉,只是我们的“大”要大得多,而且我们还具备与外部世界互动的方式,创造出改变我们语言模型输出的现实。

当然,随着人工智能的发展,我们必须应对独特的挑战和伦理考量,以确保“人工思维”的发展与人类价值观保持一致。无论如何,你可以确信,类似于人脑的思维机器的发展,甚至只是尝试达到这一目标的过程,都会对我们的世界产生某种变革性的影响,无论好坏。

相关材料和笔记

(除了文中所有链接之外)

随机鹦鹉

机器学习 / 人工智能领域,“随机鹦鹉”指的是大型语言模型可能在生成令人信服的语言方面表现优异,但它们实际上并不“理解”它们处理的语言的含义。这个术语最初是在这里提出的:

[## 随机鹦鹉的危险 | 2021 年 ACM 公平性会议论文集……

过去三年的自然语言处理(NLP)工作特点是开发和部署越来越大型的语言……

dl.acm.org

关于微软和谷歌的语言模型“思考”

[## 人工通用智能的火花:GPT-4 的早期实验

人工智能(AI)研究人员一直在开发和完善展现……的大型语言模型(LLMs)

arxiv.org [## 思维链提示引发大型语言模型的推理

我们探讨了生成思维链——一系列中间推理步骤——如何显著提升……

arxiv.org

www.lucianoabriata.com 我写作和拍摄的内容涵盖了我广泛兴趣领域的所有内容:自然、科学、技术、编程等。

在这里小额捐赠成为 Medium 会员 以访问所有故事(这对你没有成本,我可以获得少量收入)。 订阅以通过电子邮件获取我的新故事 咨询小型工作 请访问我的 服务页面。你可以 在这里联系我

如果你把生活视作游戏,你最好知道如何玩

原文:towardsdatascience.com/if-you-see-life-as-a-game-you-better-know-how-to-play-it-f7aaa365caf1

游戏理论如何帮助你做出日常决策

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

·发表在 Towards Data Science ·阅读时间 13 分钟·2023 年 12 月 2 日

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

图片由作者使用 Midjourney 制作

在一个未知的星系里,你和你的朋友被一个神秘的外星生物组织拘留。他们承诺如果你们能在他们的游戏中击败他们,就会放你们离开。你们坐在一个宇宙桌子旁,外星人分发包含黑色和白色岩石的袋子。游戏开始时,每个玩家会选择一块岩石并把它放在桌子上。获胜者是选择了不同颜色岩石的人。这意味着,选择黑色而其他两人选择白色的人,或者选择白色而其他两人选择黑色的人。每次有人获胜,他们会给你一枚硬币堆放在你们桌子的一侧。你们将玩这个游戏一百万次,最终的赢家是获得更多硬币的人。除了游戏规则,你唯一知道的就是外星人每次以 50%的概率选择黑色。游戏开始前几秒,你的伙伴低声告诉你应遵循的策略。经过一百万场游戏,最终得分宣布你们俩都是赢家。这是纯粹的运气吗?你伙伴的策略有多重要?

介绍

你最终遇到上述情况的可能性极低。然而,外星人提出的游戏可以推断到更现实的情况。我们的生活充满了多种互动,在这些互动中我们要么本能地,要么故意地做出决定。这些决定中的许多依赖于他人的决定,许多则取决于我们无法控制的事件。在任何情况下,我们的回应很少是随机的,而更多是我们理性分析的结果。这意味着在我们面对的每一次互动中,我们根据带来更大利益的因素来做出决定。这也意味着我们可以根据不同的互动采取不同的策略。本文讨论了我们采取的策略、获得的回报,以及 游戏理论

游戏理论 101

你可能已经看过电影 美丽心灵,讲述了著名数学家 约翰·纳什,或者你听说过游戏理论家获得的多个诺贝尔奖。游戏理论是一个有趣的数学领域,具有许多现实生活中的应用。在游戏理论中,不同代理之间的战略互动通过数学建模,然后利用这些模型生成预测或更好地理解特定过程。根据互动类型或玩家数量,数学模型可以非常复杂,也可以是一组简单的方程式。不管是哪种情况,对游戏理论的短暂了解不仅有趣,而且有用。

在回到外星人桌子之前,让我们分析一个更简单的游戏。假设是星期五晚上,你正在决定吃什么。一组朋友想要比萨,而另一组朋友想要汉堡。比萨需要 30 分钟到达,而汉堡在 15 分钟内送达。这些是场景:

  • 两个组都点了比萨。在这种情况下,有一个组对这个选择不会感到满意。

  • 两个组都点了汉堡。在这种情况下,有一个组对这个选择不会感到满意。

  • 一个组点了比萨,另一个组点了汉堡。在这种情况下,如果两个组都等待所有食物到达,一个组将不得不吃冷掉的食物。

假设 A 组想要比萨,而 B 组想要汉堡。我们可以将这种情况写成如下矩阵:

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

表 1. 比萨/汉堡示例的回报矩阵。数字表示每个组对其选择的满意程度。(图形由作者制作)

每种情景中的数字称为收益,代表每种选择组合的结果。第一个数字是 A 组的收益,而第二个数字是 B 组的收益。指定收益是博弈论分析中非常重要的一部分,这并不总是简单明了的。收益可以代表多种事物。在这种情况下,我们任意指定一个数字,表示每个组对其选择的满意程度。这就像是事先询问每个组如果他们选择汉堡包或披萨,他们会有多满意,满意度范围从 0 到 5。如你所见,不可能让两个组都达到最高满意度,因为在 A 组订披萨而 B 组订汉堡包的情况下,披萨会迟到,B 组将吃到冷汉堡包。然而,这还不如没有吃到汉堡包那么糟糕!A 组订披萨而 B 组订汉堡包的组合代表了一个两组都不想偏离的解决方案。这被称为Nash 均衡

在纳什均衡中,任何人都无法通过改变自己的策略来增加预期收益,而其他玩家的策略保持不变。在前面的例子中,解决方案(5,3)代表了一个纳什均衡,因为 A 组不能增加其收益(它已经是最大值),B 组也不能增加其收益,改变策略只会减少收益。另一个经典的例子用于解释纳什均衡是著名的囚徒困境

在囚徒困境中,两名囚犯正被警察审讯,他们可以选择坦白或保持沉默。每种策略对应的收益如表 2 所示。在这种情况下,收益是他们将要在监狱中度过的年数。这意味着数字越小,收益越好。由于囚犯不知道对方会做什么,均衡状态对应的是两个囚犯都坦白的情况。这里的关键是:乍一看,收益表明对于两个囚犯作为一个团队来说,最好的策略是保持沉默。然而,他们不知道他们的伙伴会做什么。即使他们知道伙伴会保持沉默,从个人的角度来看,最好的策略是坦白,因为坦白会将监禁时间从一年减少到零。这意味着囚徒困境只有一个纳什均衡,即两个囚犯都坦白的策略。

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

表 2. 囚徒困境的收益矩阵。数字表示监禁的年数。(图形由作者制作)

在回到外星人及其游戏之前,重要的是要注意到,有些互动可能会有多个纳什均衡,而其他互动可能没有纳什均衡如果我们只考虑 纯策略。纯策略对应于一个单一且具体的计划。这意味着保持沉默或认罪,或者购买披萨或购买汉堡包。另一方面,混合策略则为每个计划分配一个概率。我们可以说,囚犯有 75%的机会保持沉默,因此有 25%的机会认罪。在任何有限的游戏中,我们可以确定至少存在一个纳什均衡。这个均衡可能是纯策略或混合策略形式,或它们的组合。既然我们知道了这些,现在是时候与外星人一起坐回宇宙桌前了。

回到宇宙游戏

图 1 解释了收益和游戏的策略。这个游戏是经典游戏 匹配硬币 的修改版。共有 8 种可能的情景,其中两种情况下没有人获胜。这些情况是三名玩家选择相同颜色的情况。在其余的情景中,某人获胜要么是当其他人选择白色时选择黑色,要么是当其他人选择黑色时选择白色。这个游戏没有纯策略纳什均衡,因为没有任何策略能使所有玩家满意。然而,它确实有一个混合策略纳什均衡。在解决初始问题之前,让我们首先计算这个均衡。

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

图 1. 宇宙游戏示例的情景和收益。(图形由作者制作)

要计算混合策略纳什均衡,我们首先为每个策略分配概率。图 2 展示了标识每个玩家玩黑棋或白棋的概率的字母。

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

图 2. 宇宙游戏中每个玩家的策略和概率。(图形由作者制作)

以外星人为例,对于外星人来说,找到一个不关心自己是玩黑棋还是白棋的策略,就等于找到概率 rq,使得无论玩黑棋还是白棋都能得到相同的结果。我们可以通过以下方程式来表达这一点:

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

如果我们对所有玩家进行相同的分析,我们将得到一组方程,告诉我们表示混合策略纳什均衡的概率。在这种情况下,p=q=r=0.5。另一种看待这种情况的方法是,如果三名玩家以 50%的概率选择石头的颜色,那么在无限次的游戏之后,他们将获得相同的支付。所有人的期望值是相同的。这是一个链接,你可以在其中模拟这个游戏,改变每个玩家的概率。

在本文开头介绍的问题的特定情况下,我们并不关心找到三名玩家之间的纳什均衡。相反,我们关心的是找到一种策略,使我们总是能战胜外星人。我们对他的了解至关重要。如果我们已经知道他将以 50%的概率选择黑色,那么我们可以让我们的朋友选择黑色,而我们选择白色,这将确保我们中的一个在每一局中获胜。如果我们无限次地玩这个游戏,那么外星人将最终得到零枚硬币,而我们将分配其余的硬币。表 3 显示了假设外星人以 50%概率选择黑色的情况下,仅两个玩家的支付矩阵。请注意,其中有两个纳什均衡,汤姆或迈克通过选择对立的策略获得 1 的支付。

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

表 3。假设外星人以 50%概率选择黑色的情况下,宇宙游戏中两个玩家的支付矩阵。(图形由作者制作)

毕竟,击败外星人在他自己的游戏中是可能的!知道他总是以 50%的概率选择黑色,这让你的朋友可以选择黑色,而你选择白色(或反之亦然),并赢得每一局。然而,如果我们对外星人的策略没有任何先前的信息,那么我们最好的选择是以 50%的概率选择黑色或白色。博弈论不仅在这种假设性的场景中有用,在许多其他更现实的场景中也同样适用。让我们回顾另一个例子。

保护计划的技巧

在节省了一整年并等待黑色星期五之后,你终于决定购买你一直想要的$1000 电视。在结账之前,收银员问你是否要再“多花 175 美元”购买一个保护计划(PP)。这个保护计划将覆盖你电视在接下来 4 年的相关费用。这是个好主意吗?

我们可以将这个问题分析为一个双人游戏:卖电视和保护计划的公司是一个玩家,而买家是另一个玩家。如果我们假设修理一台电视的平均费用是$500,那么支付矩阵将如下所示:

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

表 4. 保护计划示例的回报矩阵。数字表示成本/利润。(图表由作者制作)

在前面的矩阵中,第一个数字对应于公司的回报,第二个数字是买方的回报。数值计算如下:

买方添加保护计划:

如果电视故障:

  • 回报(买方):电视的成本 + 保护计划的成本:-1000–175 = -1175

  • 回报(公司):电视的收入 + 保护计划的收入 — 维修成本 = 1000+175–500=675

如果电视没有故障:

  • 回报(买方):电视的成本 + 保护计划的成本:-1000–175 = -1175

  • 回报(公司):电视的收入 + 保护计划的收入 = 1000+175 = 1175

买方不添加保护计划:

如果电视故障:

  • 回报(买方):电视的成本 + 维修成本:-1000–500 = -1500

  • 回报(公司):电视的收入 = 1000

如果电视没有故障:

  • 回报(买方):电视的成本:-1000

  • 回报(公司):电视的收入 = 1000

注意在买方不添加保护计划且电视没有故障的情况下存在纯策略纳什均衡。这是表 4\ 中的右下角框。这是完全有意义的,因为如果我们不添加保护计划,那么最好的情况就是电视正常工作而无需维修。另一方面,如果我们决定不购买保护计划,那么无论电视是否故障,卖方都会赚到相同的金额。

找到纯策略纳什均衡对于理解这个场景很重要,但它尚未回答我们最初的问题。为此,我们需要考虑电视在前四年内出现故障的概率。假设q表示这个概率。在这种情况下,买方考虑到这个概率的期望值是:

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

请注意我们在计算卖方添加保护计划的情况下和买方购买电视但不添加保护计划的情况下的期望值。在一种最坏的情况下,我们完全确定电视会故障(q=1),如果添加保护计划,买方将支付 $1175,如果不添加则支付 $1500。我们可以找到使得添加保护计划和不添加保护计划的期望值相等的概率,即q=0.35。图 3 显示了在添加保护计划和不添加保护计划的情况下,相对于q的期望值。这个图表告诉我们,如果电视故障的概率小于 0.35,那么最好是不添加保护计划。

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

图 3. 买方添加或放弃保护计划时,电视故障概率的成本。

请注意,0.35 的值是根据之前列出的成本计算得出的。实际上,在这种情况下,使得添加保护计划和不添加保护计划的期望值相等的q值仅取决于保护计划的成本和维修成本。

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

如果修理电视的费用增加,那么电视发生故障的概率上限,即更值得添加 PP 的概率,会下降。另一方面,增加 PP 的价格也会增加q。注意,当 PP 的成本接近修理成本时,无论电视发生故障的概率如何,购买 PP 的推荐程度都会降低。这是一个链接,你可以在这里计算在改变任何变量并运行多次迭代后,买方的预期成本。

我们还可以从卖方的角度分析这个问题。卖方可能会问:“知道电视在前 4 年内发生故障的概率是x,那么 PP 的价格应该是多少,以便我不在乎人们是否添加 PP?”在这种情况下,我们也可以计算添加 PP 或不添加 PP 的期望值,但这次是卖方的收益:

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

注意方程右侧如何对应于电视的价格。这意味着如果电视在 0.35 的概率下发生故障,卖方将具有相同的期望值($1000),无论买方决定如何。现在,电视在前 4 年内发生故障的概率是多少?回答这个问题可能很困难,因为每台电视都不同。然而,快速的谷歌搜索表明,这个值可能在 4%左右(0.04)。如果是这样,那么 PP 的成本,使得期望值相等的是 0.04 x 500 = $20。这意味着通过将 PP 设置为$175,卖方在买方添加 PP 时的期望值为$1155,而不添加时为$1000!相当划算!

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

之前的解释展示了卖方或公司如何使用博弈论来确定其服务的最佳价格,以便在多次销售后期望值是有利的。这是一个链接,你可以在这里计算通过改变任何变量并运行多次迭代后,卖方的期望值。

结论

从外星人遭遇等虚构场景到购物,我们的生活充满了不同后果的决策。这些后果不仅是我们决策的产物,也依赖于他人的决策,而这些决策又取决于其他人的决策。虽然我们无法控制他人做什么,但我们可以学习将每个问题视为一个包含玩家、策略和收益的游戏。这正是博弈论的意义所在,也正是它有如此多应用的原因。下次你面临决策时,记住这一点!这可能会节省一些钱或让你避免几年牢狱之灾!

不只是爬行动物:探索 Iguanas 工具包用于超越黑箱模型的 XAI

原文:towardsdatascience.com/iguanas-more-than-just-reptiles-exploring-the-iguanas-toolkit-for-xai-beyond-black-box-models-4330ad69029?source=collection_archive---------10-----------------------#2023-08-25

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

“AI 思维” 来源:作者使用Dall-E创建

平衡复杂性和透明性以实现有效决策

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

·

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

随着越来越多的行业将机器学习纳入决策过程中,一个重要问题随之而来:我们如何信任那些我们无法理解其推理的模型,以及如何根据这些信息自信地做出高风险决策?

对于安全关键型重资产行业的应用,在这些领域中错误可能导致灾难性后果,透明性缺乏可能是采纳的主要障碍。这就是模型可解释性和解释性变得越来越重要的地方。

你可以将模型理解能力视为一个谱系:复杂的深度神经网络处于一端,而透明的基于规则的系统则位于另一端。在许多情况下,模型输出的可解释性与准确性同样重要。

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

可解释性与准确性。来源:作者创建

在这篇博客文章中,我们将探讨一种方法,该方法可以直接从数据中自动生成规则集,从而构建一个完全透明且可解释的决策支持系统。需要注意的是,并不是所有情况都能通过这种基本模型得到令人满意的解决。然而,任何建模工作开始于一个简单的基线模型都提供了几个关键优势:

  • 快速实现: 快速设置以启动基础模式

  • 比较参考: 用于评估更先进技术的基准

  • 人类可理解的见解: 基本的可解释模型提供有价值的人类可解释见解

对于阅读此帖的同行数据科学从业者:我承认这种方法与简单拟合决策树模型的相似性。然而,随着阅读的深入,你会发现这种方法被调整为模拟人类规则创建,这使其相比于典型决策树模型(通常在实践中可能会很困难)的输出更易于解释。

自动规则生成,如通过Iguanas 框架展示的,说明了我们如何直接从原始数据中提取有见解的(且可由人类解释的)规则。虽然这篇博客文章中的示例覆盖了一个特定的案例,但规则生成算法通常也可以适应其他分类挑战。

示例案例介绍:

为了说明自动规则生成的过程,我们以管道完整性检查的假设行业相关案例为例。确保管道的结构完整性是一项要求严格审查的任务,并且对于防止环境灾难至关重要。因此,我们的案例代表了一个模型可解释性和解释性至关重要的相关示例。

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

完整性检查。照片由Paul Teysen拍摄,来源于Unsplash

在这个案例研究中,我们首先定义一个数据集,模拟不同的管道属性。这些属性包括长度、直径、壁厚、焊缝数量、弯头数量和腐蚀级别。此外,我们还包括一个二进制的“违例”状态,表示是否根据特定属性组合发生了违例。实际上,我们的数据集代表了一个二分类问题,这对于大多数数据科学家来说应该是一个熟悉的案例。

我们的第一步是创建一个合成数据集,包含下列各种属性以及相应的违例状态(分类为“真”或“假”):

  • 管道长度:区间 1–20 米

  • 管道直径:区间 1–10 厘米

  • 测量的管壁厚度(例如,通过检查得出):区间 1–10 毫米

  • 焊缝数量:区间 0–10(所有管道由最大长度为 10 米的管段组成。如果总管道长度> 10 米,则必须与另一根管道连接/焊接,因此“焊缝数量”> 0)

  • 弯头数量:区间 0–5:管道的弯头数量,其中 0 表示正常的直管段。

  • 腐蚀:分类变量,包括“无”,“轻微”或“严重”(例如,通过检查得出)。

  • 违例:二进制变量,“真”或“假”,表示这些属性集合是否应导致违例。

然后我们可以生成我们的合成数据集,其中每一行表示一组管道属性及其相应的违例状态。属性在上述指定区间内定义,而“违例”状态则基于一套预定义的规则来确定,详细说明在下一部分中。

# Import neccesary packages/libraries:
from iguanas.rule_generation import RuleGeneratorDT, RuleGeneratorOpt
from iguanas.rule_optimisation import BayesianOptimiser
from iguanas.metrics.classification import FScore, Precision
from iguanas.metrics.pairwise import JaccardSimilarity
from iguanas.rules import Rules, ConvertProcessedConditionsToGeneral, ReturnMappings
from iguanas.correlation_reduction import AgglomerativeClusteringReducer
from iguanas.rule_selection import SimpleFilter, GreedyFilter, CorrelatedFilter
from iguanas.rbs import RBSPipeline, RBSOptimiser
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay, classification_report
from sklearn.ensemble import RandomForestClassifier
from category_encoders.one_hot import OneHotEncoder
import seaborn as sns
import pandas as pd
import numpy as np

# Create empty dataframe:
df = pd.DataFrame(columns=['length (m)',
                           'diameter (cm)',
                           'thickness (mm)',
                           'num welds', 
                           'num bends', 
                           'corrosion', 
                           'violation'])

# Total number of datapoints in generated dataset:
datapoints = 100000
np.random.seed(10)

# Min/Max length of pipe
min_len = 1
max_len = 20

# Min/Max diameter of pipe
min_dim = 1
max_dim = 10

# Min/Max measured wall thickness of pipe
min_thick = 1
max_thick = 10

# Min/Max number of welds
min_welds = 0
max_welds = 10

# Min/Max number of bends
min_bends = 0
max_bends = 5

length = np.random.randint(min_len,max_len,datapoints)
diameter = np.random.randint(min_dim,max_dim,datapoints)
thickness = np.random.randint(min_thick,max_thick,datapoints)
num_welds = np.random.randint(min_welds,max_welds,datapoints)
num_bends = np.random.randint(min_bends,max_bends,datapoints)

# Generate categorical variable for corrosion: 80% probability for "None",
# 15% for "Light" and 5% for "Severe"
corrosion = np.random.choice(a=['None', 'Light', 'Severe'],
                             size=datapoints,
                             p=[0.8, 0.15, 0.05])

# Add generated variables to dataframe: 
df['length (m)'] = length
df['diameter (cm)'] = diameter
df['thickness (mm)'] = thickness
df['num welds'] = num_welds
df['num bends'] = num_bends
df['corrosion'] = corrosion

手动规则生成

在进入自动化规则生成之前,让我们首先通过手动定义一套生成初始数据集的规则来建立基准。然后我们可以定义一些违例的示例规则,例如:

  1. 如果管道直径大于 8 厘米且壁厚测量为 2 毫米或更薄。

  2. 如果管道出现严重腐蚀且壁厚测量为 5 毫米或更薄。

  3. 如果管道总长度超过 10 米且没有焊缝(因为管道由最大长度为 10 米的段组成,对于超过这个长度的管道需要进行焊接)。

  4. 对于直径超过 5 厘米的管道,如果存在弯头但未检测到焊缝(考虑到这种直径的管道通常以直段形式提供,并需要将弯曲段后续焊接)。

如果违反了这些规则,则应报告为违例。

rule_1 = pd.DataFrame((df['diameter (cm)'] >= 8) & (df['thickness (mm)'] <= 2))
rule_2 = pd.DataFrame((df['corrosion']=='Severe') & (df['thickness (mm)'] <= 5))
rule_3 = pd.DataFrame((df['length (m)'] > 10) & (df['num welds'] == 0))
rule_4 = pd.DataFrame((df['num bends'] > 0) & (df['num welds'] == 0) & (df['diameter (cm)'] >=5))

df['violation'] = rule_1 | rule_2 | rule_3 | rule_4

df.head()
df[df['violation'] ==True].head()

我们的合成数据集现在包含我们的“管道检查”,其中包含每个管道的属性集合,以及一个二元变量,指示是否应将其报告为违规。上面的代码块还显示了数据集中选定的行,突出了报告违规的示例:

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

数据集中的示例行:无违规

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

数据集中的示例行:报告的违规情况

使用 Iguanas 进行自动规则生成

现在,关键问题出现了:我们能否从上述数据集中自动推导出适当的“完整性检查规则”?值得注意的是,这些规则生成算法对我们在上一节中定义的具体规则一无所知。这就是Iguanas登场的时刻(虽然是用于构建规则系统的 Python 包,而不是实际的蜥蜴)。

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

龟类。照片由David Clode提供,发布在Unsplash上。

Iguanas 提供了一套工具,旨在基于数据生成和优化规则。在我们的示例案例中,我们希望利用这个框架查看是否可以自动生成人类可解释的有意义规则,同时仅依赖数据集中存在的信息。

数据集划分和预处理

在应用任何规则生成技术之前,我们首先需要将数据集划分为训练集和测试集。训练集将用于构建和优化我们的规则系统,而测试集将用于评估其在未见数据上的表现。我们这里使用随机划分,选择 20%的数据用于测试规则在未见数据上的表现。

target_column = 'violation'
X = df.drop(
    target_column,
    axis=1
)
y = df[target_column]

X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    test_size=0.2,
    random_state=0
)

然后,我们需要使用one-hot 编码将分类变量(如腐蚀)转换,使其与规则生成算法兼容:

ohe = OneHotEncoder(use_cat_names=True)
ohe.fit(X_train)
X_train = ohe.transform(X_train)
X_test = ohe.transform(X_test)

使用 Iguanas 生成规则

Iguanas框架中,你会找到两个主要的规则生成算法可以选择:RuleGeneratorDTRuleGeneratorOpt

  • RuleGeneratorDT:通过提取树集成模型中表现最佳的分支来生成规则。

  • RuleGeneratorOpt:通过优化单一特征的阈值来生成规则,并将这些单条件规则与 AND 条件结合,创建更复杂的规则。

在下面的示例中,我们使用了RuleGeneratorDT作为我们选择的算法,尽管我们也可以使用RuleGeneratorOpt替代。然后,我们定义了像F-scoreprecision这样的指标,并配置了规则生成器的参数。我们选择生成最多 4 个条件/语句的规则,以避免过于复杂和冗长的规则。我们还使用了随机森林分类器作为提取规则的基础模型。在定义这些参数之后,我们可以将规则生成器拟合到我们的训练数据中。

# Define metrics: F-score and precision
p = Precision()
f1 = FScore(beta=1)

# Define parameters for RuleGeneratorDT
params_RG_DT = {
    'metric': f1.fit,
    'n_total_conditions': 4,
    'tree_ensemble': RandomForestClassifier(n_estimators=10, random_state=0),
    'target_feat_corr_types': 'Infer',
    'num_cores': -1,
    'verbose': 1
}

#params_RG_OPT = {
#    'metric': f1.fit,
#    'n_total_conditions': 4,
#    'num_rules_keep': 1000,
#    'n_points': 100,
#    'ratio_window': 1,
#    'remove_corr_rules': True,
#    'target_feat_corr_types': 'Infer',
#    'verbose': 1
#}

# Instantiate and fit RuleGeneratorDT
rg = RuleGeneratorDT(**params_RG_DT)
X_rules_gen_train = rg.fit(
    X=X_train,
    y=y_train
)

规则过滤和优化

生成的规则集可能包含冗余或性能不佳的规则。为了解决这个问题,我们使用一系列过滤器来改进结果规则集:

  • 首先,我们应用SimpleFilter来移除 F 分数低于某个阈值的规则。

  • 然后,我们使用CorrelatedFilterAgglomerativeClusteringReducer进一步减少相关规则。

  • 最后,我们使用GreedyFilter选择一个规则子集,以最大化特定指标(例如,precision)。在这里,我们将按精度对规则进行排序,然后计算前 n 个组合规则的 F1 分数。

# Apply SimpleFilter
fr = SimpleFilter(
    threshold=0.3,
    operator='>=',
    metric=f1.fit,
)
X_rules_train = fr.fit_transform(
    X_rules=X_rules_gen_train,
    y=y_train
)

# Apply CorrelatedFilter
js = JaccardSimilarity()
acfr = AgglomerativeClusteringReducer(
    threshold=0.7,
    strategy='bottom_up',
    similarity_function=js.fit,
    metric=f1.fit
)
fcr = CorrelatedFilter(correlation_reduction_class=acfr)
X_rules_train = fcr.fit_transform(
    X_rules=X_rules_train,
    y=y_train
)

# Apply GreedyFilter
gf = GreedyFilter(
    metric=f1.fit,
    sorting_metric=p.fit,
    verbose=1
)

X_rules_train = gf.fit_transform(
    X_rules=X_rules_train,
    y=y_train
)

gf.plot_top_n_performance_on_train()

上述代码块还绘制了“前 n”规则在训练集上的综合表现,如下所示:

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

“Top n”性能。来源:由作者创建

我们在这里看到的是,对于一组前 4 条规则,我们可以完美匹配训练数据(这很有意义,因为这是我们用来生成合成数据集的规则数)。

创建 RBS 管道

现在,让我们使用这个组合的过滤规则集设置我们的RBS 管道。在这种情况下,我们采用简单的方法:

  • 如果有任何规则触发,则标记违例为“True”

  • 如果没有规则触发,则标记违例为“False”

要使用上述逻辑设置管道,我们首先需要创建配置参数。这只是一个列表,概述了管道的各个阶段,每个阶段应该使用两个元素的元组来定义:

  • 第一个元素应该是一个整数,表示在该阶段做出的决策(0 或 1)。

  • 第二个元素应该是一个列表,用于指定哪些规则应触发该决策。

我们还定义了如果没有规则触发的最终决策。这个管道接着使用 RBSOptimiser 进行优化。在这里,我们只需将实例化的管道类传递给管道参数,在优化过程中,它还会检查是否可以进一步减少生成的规则集。然后,我们运行 fit_transform 方法,使用给定的训练数据优化我们的管道。

# Define RBSPipeline configuration
config = [
   (1, X_rules_train.columns.tolist())
]

# Define final decision
final_decision = 0

# Instantiate RBSPipeline
rbsp = RBSPipeline(
    config=config,
    final_decision=final_decision
)

# Optimize RBSPipeline using RBSOptimiser
rbso = RBSOptimiser(
    pipeline=rbsp,
    metric=f1.fit,
    n_iter=1000,
    verbose=1
)
pipe_pred_train = rbso.fit_predict(
    X_rules=X_rules_train,
    y=y_train
)

性能评估

我们通过生成的 classification_report 和绘制的 混淆矩阵 来评估优化管道在训练数据上的性能。

# Evaluate performance using classification_report and confusion_matrix
print(
    classification_report(
        y_true=y_train,
        y_pred=pipe_pred_train,
        digits=2
    )
)

sns.set_style('white')
cm = ConfusionMatrixDisplay(
    confusion_matrix(
        y_true=y_train,
        y_pred=pipe_pred_train,
        normalize='true'
    )

)
cm.plot()

如下图所示,我们看到对于训练数据,我们能够完美预测所有数据点的检查状态(违规与否)。

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

预测违规的指标和混淆矩阵。来源:作者创建

自动生成的规则集

完成上述优化步骤后,我们最终获得了一组可以用于我们的“违规分类器”的规则。然后我们可以仔细查看相应的规则字符串,检查它们是否确实具有可解释性(这也是构建基于规则的分类器而不是黑箱机器学习模型的主要目标)。

rg.filter_rules(include=rbs_rule_names_gen)
rg.rule_strings

这会导致下面的打印输出。如果我们将其与我们手动定义的规则(附在下方)进行比较,我们会发现我们实际上得到了完全相同的规则集:

{'RGDT_Rule_20220214_43': "(X['corrosion_Severe']==True)&(X['thickness (mm)']<=5)",
 'RGDT_Rule_20220214_47': "(X['diameter (cm)']>=5)&(X['num bends']>=1)&(X['num welds']<=0)",
 'RGDT_Rule_20220214_58': "(X['diameter (cm)']>=8)&(X['thickness (mm)']<=2)",
 'RGDT_Rule_20220214_60': "(X['length (m)']>=11)&(X['num welds']<=0)"}
  1. 如果管道出现严重腐蚀且壁厚为 5 毫米或更薄。

  2. 对于直径超过 5 厘米的管道,如果存在弯头但未检测到焊接点

  3. 如果管道直径大于 8 厘米且壁厚为 2 毫米或更薄。

  4. 如果管道总长度超过 10 米且没有焊接点

在测试数据上使用生成的规则

正如我们已经展示的那样,生成的规则集与我们用于生成数据集的规则完全匹配,我们知道它们也将适用于测试集中的未见数据。然而,在更现实的情况下,我们只有数据集本身,而没有原始规则集进行比较。为了确保生成的规则也能很好地推广到未见数据上,我们还需要在测试集上验证它们:

然后,我们利用优化后的 RBS 管道预测测试集中的违规情况。与之前的示例一样,我们通过使用分类报告和绘制结果的混淆矩阵来评估其性能。

# Generated rules
X_rules_test = rg.transform(X=X_test)

# Apply our optimised RBS Pipeline to the test set:
opt_pipe_pred_test = rbso.predict(X_rules=X_rules_test)

# Print classification report and confusion matrix:
print(
    classification_report(
        y_true=y_test,
        y_pred=opt_pipe_pred_test,
        digits=2
    )
)

cm = ConfusionMatrixDisplay(
    confusion_matrix(
        y_true=y_test,
        y_pred=opt_pipe_pred_test,
        normalize='true'
    )
)
cm.plot()

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

预测违规情况的指标和混淆矩阵。来源:作者创建

上述结果展示了在测试数据上的完美准确性和精确度,表明生成的规则具有良好的泛化能力(正如我们在本例中已知的那样)。

现实使用案例

如前所述,在实际使用案例中,我们不一定会有一套已建立的规则来与我们的输出进行比较。在大多数情况下,我们的目标是构建分类模型,我们仅会获得一个属性/特征的数据集和一个对应的目标变量(例如“违规”或“非违规”)。任务是使用该数据集自动生成一套规则,从而洞察这些分类是如何进行的。

另一种方法是:使用这些算法的另一种情况是你已经有了一套手动定义的规则(例如由领域专家制定)。然而,数据分布的变化可能会使这些规则随着时间的推移变得次优。在这种情况下,你可以定期运行这种算法,以自动重新校准规则集以适应这些变化。

此外,这种逐步的方法是将领域专家的专业知识融入解决方案的有效方式。当他们审查生成的“违规”报告时,他们可能会注意到标记的违规实际上并不是问题。一旦他们验证了报告,系统可以从他们的输入中学习,并自主调整初始规则集。这一持续过程确保规则与数据变化和专家见解保持一致,从而使解决方案能够保持(或甚至提升)其性能。

结论

利用自动规则生成,例如使用Iguanas框架,允许我们直接从数据中提取有意义的规则。这与为相同目的构建黑箱分类模型形成对比。规则基础系统的透明性增强了决策过程的可解释性,这通常是采纳此类解决方案在安全关键行业中的重要方面。

尽管我们研究的案例非常具体,但规则生成过程也可以推广到各种其他分类挑战中。尽管规则基础方法可能不是更具挑战性问题的最佳选择,但它仍然可以为当前问题提供有价值(人类可解释)的见解。此外,它将作为一个良好的基础模型,让我们能够将其与更高级的技术进行比较和评估。

总结一下,我想给你留下一个重要的提醒:在深入研究复杂的前沿模型之前,始终花一点时间设置一个快速的基线模型。无论这意味着使用规则基础(或树基础)方法进行分类,如本案例所示,还是利用简单的线性回归进行回归任务。

此外,我想强调“KISS”原则,即“Keep It Simple, Stupid”(保持简单,愚蠢)。换句话说,在解决问题时,优先考虑简单性而不是不必要的复杂性。最有效的解决方案往往来自于最简单的策略。所以,记住,当你犹豫时,选择简单吧!

如果你对 AI/机器学习和数据科学相关主题感兴趣,你还可以查看我写的其他文章。你可以在我的 Medium 作者主页上找到所有文章,你可以在这里找到。

如果你觉得我之前的文章有趣,并且希望在发布新内容时获得通知,你也可以在下面的邮件列表中注册。

[## 每当 Vegard Flovik 发布文章时获取电子邮件通知。

每当 Vegard Flovik 发布文章时获取电子邮件通知。通过注册,如果你还没有 Medium 账户,你将创建一个账户…

medium.com](https://medium.com/subscribe/@vflovik?source=post_page-----4330ad69029--------------------------------)

如果你希望成为 Medium 会员,以便自由访问平台上的所有材料,你可以使用下面的推荐链接来实现。(注意:如果你通过此链接注册,我也将获得部分会员费用)

[## 使用我的推荐链接加入 Medium - Vegard Flovik

作为 Medium 会员,你的一部分会员费用将分配给你阅读的作者,你可以完全访问每一篇故事…

medium.com](https://medium.com/@vflovik/membership?source=post_page-----4330ad69029--------------------------------)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值