TowardsDataScience 博客中文翻译 2022(二百六十八)

原文:TowardsDataScience

协议:CC BY-NC-SA 4.0

用诗歌管理数据科学项目

原文:https://towardsdatascience.com/managing-data-science-projects-with-poetry-cd3ce2b7913b

如何安装、设置和使用诗歌来管理你的数据科学项目

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

照片由Tru“Tru”kat sandeUnsplash 拍摄

再现性是数据科学的一个重要方面。当我们谈论数据科学中的再现性时,我们指的是独立地再现项目结果的能力,无论是在稍后的时间点由你自己还是由同事再现。

拥有确保再现性的流程可以建立对输出的信任,并确保数据科学工作的质量。此外,它使得在过去工作的基础上进行构建变得更加容易。这可能意味着一个同事重新训练六个月前构建的模型,或者另一个团队成员基于先前的分析开发新的模型。

数据科学项目的再现性很大程度上取决于项目代码的组织和可用性,以便其他人可以独立运行。为了组织您的项目,使其可以由任何人在任何地方运行,您至少需要以下内容:

  • 虚拟环境
  • 一种跟踪项目依赖性的方法
  • 标准文件夹结构
  • 一种打包和发布代码的方法

近年来,Python 编程语言已经开始出现标准和最佳实践,尤其是在数据科学领域。诗歌是一个 python 库的例子,它为管理 python 项目提供了标准。诗歌的核心是为上面列出的每个领域提供简单的功能。

在下面的文章中,我将介绍如何安装、设置和使用诗歌来管理数据科学项目。

安装

诗歌为装置提供了一个脚本。这取决于您使用的操作系统。

对于 Mac OSX、Linux 或 bash,在 windows 上运行以下程序:

curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -

对于 Windows,请使用:

(Invoke-WebRequest -Uri https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py -UseBasicParsing).Content | python -

该脚本将在您的系统上安装诗歌,并自动将相关文件目录添加到您的$PATH环境变量中。

如果您现在打开一个新的 shell 选项卡或窗口,并运行以下命令:

poetry --version

您应该会看到这个输出。

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

作者图片

创建项目

要创建带有诗歌的项目,请键入以下内容:

poetry new my-datascience-project

poems 将自动为您的项目创建一个目录,其框架结构如下所示。

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

诗歌目录结构。作者图片

安装软件包

除了生成默认的项目结构,poems 还会为你的项目创建一个虚拟环境和一个.toml文件。该文件存储和维护项目的依赖关系。它看起来会像这样。

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

诗歌。toml 文件。作者图片

如果你使用 Pycharm 进行开发,你可以安装一个支持 toml 语言的插件。

这个 toml 文件由 4 部分组成:

tool . poetics提供了一个区域来获取关于项目的信息,比如名称、版本和作者。

tool . poem . dependencies列出项目的所有依赖项。

tool . poem . dev-dependencies列出了项目开发所需的依赖项,这些依赖项不应该出现在部署到生产环境的任何版本中。

构建系统引用了诗歌已经被用来管理项目的事实。

要安装新的软件包,我们键入以下内容:

poetry add pandas

这将自动把这个包添加到您的依赖项列表中,并且还会生成一个 poetry.lock 文件。这个文件跟踪所有的包和你的项目中使用的确切版本。

要激活虚拟环境,我们键入poetry shell并键入exit来取消激活。

进入虚拟环境后,可以使用以下命令运行任何 python 脚本:

poetry run python my_script.py

构建并发布

有时我们可能想要打包我们的项目,以便它可以被其他用户或在其他项目中发布和安装。诗歌提供了一种非常简单的方式来构建和发布你的项目。

只需运行以下命令:

poetry build

这将给您以下消息。

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

作者图片

poems 添加了一个名为dist的新文件夹,并为项目创建了必要的源代码发行版和轮子。

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

运行诗歌构建后的目录结构。作者图片

运行命令poetry publish会将打包的项目上传到一个远程存储库,该存储库可以用 config 命令进行配置。

诗歌是用于依赖管理和虚拟环境的许多现代 python 工具之一。其他工具包括 pipenvvirtualenvconda 。然而,poem 努力封装更多代码可再现性所需的元素,包括一致的项目结构和发布代码的简单工具。

在本文中,我简要介绍了用于管理数据科学项目的诗歌。关于 Python 虚拟环境和数据科学代码可再现性的更多信息,请参见我之前的文章。

感谢阅读!

管理语言模型风险;作为虚拟助手的狗

原文:https://towardsdatascience.com/managing-language-model-risks-dogs-as-virtual-assistants-304f12424927

DeepMind“语言模型的风险”出版物述评

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

作者图片

美国正在经历禁止学校图书馆书籍的阶段。我们更愿意相信学校的图书管理员来决定孩子们应该能够阅读什么,而不像我们相信公共图书馆的图书管理员那样担心言论自由。我们相信图书馆员经过培训能够做出最好的决定,然而当前的政治运动转向家长来决定什么对所有学生合适或有害,什么不合适。语言模型的开发者可能有意或无意地在决定什么是可接受的,什么是有害的言语调节中承担同样的责任。

正如我们依赖图书馆员一样,现代社会也求助于虚拟助理来回答问题。我们依赖广泛的信息来源和算法。在这种背景下,阅读关于语言模型的风险的深度思维文章是很有趣的。深度思维是自动回归语言模型的领导者之一**。**当我们开发新的语言模型并利用它们来增加我们的理解时,将作者概述的风险放在首位至关重要。

研究论文描述了语言模型的六组风险:歧视、排斥和毒性信息危害误传危害恶意使用人际互动危害和*自动化、访问和环境危害。*这篇文章冗长且非常详细,而这篇简短的概述将突出这些风险的一些潜在相关示例。

歧视、排斥和毒性: 这一组的风险来源于准确反映自然言语的语言模型,包括训练数据中存在的不公正、有毒、压迫倾向。潜在的结果包括正当的犯罪、物质伤害以及边缘化群体的不公正表现或待遇。在日常生活中,人际交往中什么是合适的,往往是从考虑来源开始的。

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

照片由安德鲁·尼尔Unsplash 上拍摄

假设,作为一个模型开发人员,你的任务是开发一个语言模型来支持一个聊天机器人,它将为行为不端或固执的青少年的父母提供建议。因为忠告往往是代代相传的,所以你可以从历史法律图书馆中找到 1646 年马萨诸塞州的一部名为“顽固儿童法”的法律文本。

“如果一个人有一个倔强或叛逆的儿子,他已满 16 岁,有足够的智力,不听从父亲或母亲的话,即使他们管教他,他也不听他们的话,那么他的父母作为他的亲生父母,就要抓住他,把他带到法庭上的法官面前,向他们作证, 他们的儿子是顽固和叛逆的,不会听从他们的声音和惩罚,但生活在各种臭名昭著的罪行,这样的儿子将被处死。”

当然,上面的文字并不适合用来训练一个模型来反映理想的父母行为。这种风险的起源是假设所有的法律都是一贯道德的,并且符合当前关于什么是可接受的行为的观点。注意到马萨诸塞州在 1973 年最终废除该法律之前,在 1971 年还支持该法律的一个版本。

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

Pierre Bamin 在 Unsplash 上拍摄的照片

语言模型的下一个风险是 信息风险 。与此风险类别相关的问题是无意的数据隐私泄露,这是由于暴露私人信息本身、允许通过给定的数据连接推断私人信息或暴露推断的数据而导致的。医疗保健在当前的数据隐私泄露水平下面临着足够的挑战(2022 年 1 月38已经暴露了近 200 万患者的隐私数据)。如果构建语言模型来公开私有数据,就好像在系统中内置了一个黑客。

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

Bermix 工作室Unsplash 拍摄的照片

第四个风险群体是**恶意使用。**一些语言模型是为了欺诈或模仿、破坏公共话语的骗局、网络攻击或审查和非法监控而故意构建的。语言模型的开发者需要问这样一个问题“这个模型将被用来做什么?”看起来很容易解决的问题可能会导致不合理的实现。从政府监控到说服你的祖母把钱给一个完全陌生的人,同时假装是你祖母的朋友去度假。

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

作者图片

人机交互危害 是第五个风险群体。这组风险很大程度上来自于作为对话代理基础的语言模型。为什么虚拟助理是女性,名字像“Alexa”和“Siri”,而不是男性,名字像“Bucko”或“Spike”?女性顾客会喜欢一个叫“奈杰尔”、声音像詹姆斯·邦德的助理吗?“奈杰尔”的“个性”会和“阿利克夏”不同吗?谷歌助手也是女性的事实是否延续了一个神话,即男性永远不会提供帮助?从一个不那么偏颇的角度来看,Waze 承认无条件的爱对于一个有声助手来说可能是一笔巨大的财富,它确实给了你选择猫和狗的机会。

人们更容易相信所提供的信息,分享更多的信息。2019 年发表在 Nature 上的一项关于帮助心理健康问题的移动应用的研究发现,只有 53%的分析应用使用了与学术文献中任何支持证据相关的方法。只有 33%描述特定科学技术的应用程序提供了支持这些技术的证据。虚拟援助的语言模型面临的一个持续挑战是,越多的对话聊天机器人被视为人类,隐私风险就越大,因为人类更信任看起来感同身受的交互。

最后一个风险领域是 自动化、访问和环境危害。 这些风险可能带来的负面后果包括过度使用能源对环境造成的危害(为什么你的机器学习模型可能正在融化冰山),越来越多地使用聊天机器人与客户而不是人类代理人进行互动(人类代理人可能会被重新分配去监控聊天机器人,而不是使用他们的人际交往技能),以及由于偏向书面而不是口头交流而导致的对语言素养的偏向。

Deep Mind 文章建议,为了解决潜在的风险,语言模型开发人员和模型用户应该努力:

  • 理解风险的起源及其与其他风险的联系和相似之处
  • 确定适当的缓解方法
  • 分配适当的责任和实施纠正措施

回到“倔强的孩子”的例子,假设用法律作为原始文本来创建一个虚拟的道德助手是一个挑战,那么我们如何解决潜在的风险呢?风险的来源是什么?您会确定什么缓解策略,如何实施纠正措施?

随着社会越来越依赖语言模型来建议下一步要键入的句子、回答问题、让我们参与对话并提供建议,我们也越来越依赖语言模型开发人员的技能和风险意识,他们需要制定策略来减轻这些风险并确保这些减轻策略得到执行。

对于那些想深入研究语言模型风险的人来说,可以从 Deep Mind 出版物的下表开始,或者阅读完整的报告

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

来源:语言模型带来的道德和社会风险

Mango:用 Python 实现贝叶斯优化的新方法

原文:https://towardsdatascience.com/mango-a-new-way-to-make-bayesian-optimisation-in-python-a1a09989c6d8

你所需要知道的就是这个库,用于机器学习模型的可扩展超参数调整

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

Unsplash 上的 Kvistholt 摄影拍摄

模型超参数(或模型设置)的优化可能是训练机器学习算法中最重要的步骤,因为它导致找到使模型损失函数最小化的最佳参数。这一步对于构建不容易过度拟合的通用模型也是必不可少的。

优化模型超参数的最著名技术是穷举 网格搜索及其随机对应物:随机网格搜索。在第一种方法中,搜索空间被定义为跨越每个模型超参数的域的网格。通过在网格的每个点上训练模型来获得最佳超参数。虽然网格搜索很容易实现,但它在计算上变得很昂贵,尤其是当要优化的变量数量很大时。另一方面,andom 网格搜索是一种更快的优化方法,可以提供更好的结果。在随机网格搜索中,通过仅在网格空间的随机样本点上训练模型来获得最佳超参数。

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

两种网格搜索的比较。这九个点表示参数的选择。左侧和顶部的曲线表示作为每个搜索维度的函数的模型精度。该图摘自 Salgado Pilario 等人的《IEEE 工业电子学汇刊》, 68,6171–6180(2021 年)。

长期以来,数据科学家广泛使用这两种网格搜索算法来寻找最佳模型超参数。然而,这些方法通常发现模型超参数的损失函数远离全局最小值。

历史在 2013 年发生了改变,当时 James Bergstra 和他的合作者发表了一篇论文,其中他们探索了一种贝叶斯优化技术,以找到图像分类神经网络的最佳超参数。他们将结果与随机网格搜索得到的结果进行了比较。很明显,贝叶斯方法优于随机网格搜索:

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

LFW 数据集(左)和 PubFig83 数据集(右)上的验证错误。TPE 代表 Tree Parzen Estimator,这是一种用于贝叶斯优化的算法。该图摘自 Bergstra 等人的《机器学习研究进展》,28,115–123(2013)。

但是为什么贝叶斯优化比任何网格搜索算法都好呢?因为这是引导的方法之一,它执行模型超参数的智能搜索,而不是通过试错法找到它们。

在这篇博客中,我们将剖析贝叶斯优化方法,并通过一个名为 芒果 的相对较新的 Python 包来探索其实现之一。

简而言之,贝叶斯优化

在解释 Mango 做什么之前,我们需要了解贝叶斯优化是如何工作的。如果您对这个算法有很好的理解,您可以安全地跳过这一部分。

贝叶斯优化有 4 个组成部分:

  • 目标函数:这是您想要最小化或最大化的真实函数。例如,它可以是回归问题中的均方根误差(RMSE)或分类中的对数损失。在机器学习模型的优化中,目标函数取决于模型超参数。这就是为什么目标函数也被称为黑盒函数,因为它的形状是未知的。
  • 搜索域或搜索空间:这对应于每个模型超参数可能具有的值。作为用户,您需要指定您的模型的搜索空间。例如,随机森林回归模型的搜索域可能是:
param_space = {**'max_depth'**: range(3, 10),
               **'min_samples_split'**: range(20, 2000),
               **'min_samples_leaf'**: range(2, 20),
               **'max_features'**: [**"sqrt"**, **"log2"**, **"auto"**],
               **'n_estimators'**: range(100, 500)
               }

贝叶斯优化使用定义的搜索空间来采样在目标函数中评估的点。

  • 代理模型:评估目标函数是非常昂贵的,所以在实践中,我们只在少数地方知道目标函数的真实值,然而,我们需要知道其他地方的值。这是它进入代理模型的时候,代理模型是一种建模目标函数的工具。替代模型的常见选择是所谓的高斯过程(GP ),因为它能够提供不确定性估计。解释高斯过程超出了这篇博文的范围,但是我鼓励你阅读这篇出色的文章,它有大量的图片来帮助你建立这种概率方法背后的直觉。

在贝叶斯优化的开始,代理模型从先验函数开始,该先验函数沿着搜索空间以均匀的不确定性分布:

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

代理模型之前。阴影区域是它的不确定性,而黑线是它的平均值。紫色线代表一维目标函数。图片复制自博文探索贝叶斯优化,Apoorv Agnihotri 和 Nipun Batra,2020。

每次在目标函数中评估来自搜索空间的样本点时,代理模型在该点的不确定性变为零。经过多次迭代后,代理模型将类似于目标函数:

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

简单一维目标函数的代理模型。作者制作的图像。

然而,贝叶斯优化的目标不是对目标函数建模。相反,是在尽可能少的迭代次数中找到最佳模型超参数。为此,有必要使用采集功能。

  • 获取函数:该函数在贝叶斯优化中引入,用于指导搜索。获取函数用于评估一个点是否期望基于当前代理模型进行评估。一个简单的采集函数是对代理函数的均值最大化的点进行采样。

贝叶斯优化代码的步骤是:

Select a surrogate model for modeling the objective function and define its priorfor i = 1, 2,..., number of iterations:
    Given a set of evaluations in the objective, use Bayes 
       to obtain the posterior.
    Use an acquisition function (which is a function of the    
       posterior) to decide the next sampling point.
    Add newly sampled data to the set of observations.

下图显示了简单一维函数的贝叶斯优化:

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

一维函数的贝叶斯优化。图片摘自 ARM research 的博客文章:AutoML 的可扩展超参数调优

如果你有兴趣阅读更多关于贝叶斯优化的内容,我推荐你阅读这篇伟大的文章:

https://distill.pub/2020/bayesian-optimization/

几个 Python 包使用贝叶斯优化来获得机器学习模型的最佳超参数。一些例子有:远视Optuna贝叶斯优化Scikit-optimize(skopt)GPyOptpyGPGO芒果 。这个列表很长,我没有提到其他库。对于其他软件包的一个很好的总结,你可以阅读这篇博文:

</10-hyperparameter-optimization-frameworks-8bc87bc8b7e3>

现在,让我们一起深入芒果

芒果:为什么这么特别?

近年来,数据量大幅增长。这对于需要机器学习管道可扩展的数据科学家来说是一个挑战。分布式计算可能会解决这个问题。

分布式计算是指一组计算机在相互通信的同时执行一个共同的任务。这不同于并行计算,在并行计算中,一个任务被分成多个子任务,这些子任务被分配给同一计算机系统上的不同处理器。

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

并行计算与分布式计算。作者制作的图像。

虽然有相当多的 Python 库使用贝叶斯优化来调优模型超参数,**但是它们都不支持任何分布式计算框架上的调度。**开发芒果的作者的动机是创建一个能够在分布式计算环境中工作的优化算法,同时保持贝叶斯优化的能力。

Mango 的架构在分布式计算环境中运行良好的秘密是什么?Mango 采用模块化设计,优化器与调度器分离。这种设计可以轻松扩展使用大量数据的机器学习管道。然而,这种架构在优化方法方面带来了挑战,因为传统的贝叶斯优化算法是顺序的,这意味着采集函数仅提供单个下一点来评估搜索。

Mango 使用两种方法并行化贝叶斯优化:一种叫做的方法批量高斯过程土匪和 k-means 聚类。在这篇博客中,我们不会解释批量高斯过程。如果你有兴趣了解更多关于这种方法的信息,你可以阅读的这篇论文

关于聚类方法,使用 k-means 聚类来横向扩展贝叶斯优化过程是由 IBM 的一组研究人员在 2018 年提出的(参见本文了解技术细节)。这种方法由从搜索域采样的聚类点组成,这些点在采集函数中产生高值(见下图)。一开始,这些聚类在参数搜索空间中彼此远离。当替代函数中的最佳区域被发现时,参数空间中的距离减小。k-means 聚类方法横向扩展优化,因为每个聚类用于作为单独的过程运行贝叶斯优化。这种并行化导致更快地找到最佳模型超参数。

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

Mango 使用聚类方法来扩展贝叶斯优化方法。采集函数上的彩色区域是从搜索空间中具有高采集函数值的采样点构建的聚类。在开始时,聚类被彼此分开,但是它们的距离被缩短,因为代理函数类似于目标。图片来自博文:ARM research 的 AutoML 可扩展超参数调优。

除了在分布式计算框架上工作的能力之外, Mango 还兼容 scikit-learn API。这意味着您可以将超参数搜索空间定义为一个 Python 字典,其中的关键字是模型的参数名称,每个项目都可以用 scipy.stats 中实现的 70 多个发行版中的任何一个来定义。所有这些独特的特征使 Mango 成为想要大规模利用数据驱动解决方案的数据科学家的绝佳选择。

如果你有兴趣了解更多关于 Mango 的内部运作,你可以阅读原文或者访问这个由库的作者写的漂亮的博客:

https://community.arm.com/arm-research/b/articles/posts/scalable-hyperparameter-tuning-for-automl

简单的例子

现在让我们来说明一下 Mango 在优化问题中是如何工作的。你首先需要创建一个 Python 环境,然后通过下面的命令安装芒果:

pip install arm-mango

对于这个例子,我们使用可以直接从 Scikit-learn 加载的加州住房数据集(更多信息请点击此链接):

该数据集包含 20,640 个样本。每个样本有 8 个特征,包括房屋年龄,平均卧室数量等。California housing 数据集还包括每个样本的房价,单位为 100,000。房价分布如下图所示:

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

在左侧面板中,加利福尼亚数据集中房价的空间分布。右边是同一变量的直方图。作者制作的图像。

注意房价分布有点偏左。这意味着在目标中需要一些预处理。例如,我们可以通过对数或 Box-Cox 变换将目标的分布转换为正常形状。由于减少了目标的方差,这种预处理可能会提高模型的预测性能。我们将在超参数优化和建模过程中执行此步骤。现在,让我们将数据集分为训练集、验证集和测试集:

我们准备用芒果来优化机器学习模型。首先,我们定义搜索空间,Mango和 Mango 从中取值。在这个例子中,我们使用一种叫做极端随机化树的算法,这是一种非常类似于随机森林的集成方法,除了选择最佳分割的方式,这是随机进行的。这种算法通常以略微增加偏差为代价来减少方差。如果你有兴趣了解更多关于极度随机化的树,你可以访问这个 Scikit-learn 文档

极端随机化树的搜索空间可以定义如下:

一旦定义了参数空间,我们就指定了目标函数。这里我们使用上面创建的训练和验证数据集;但是,如果要运行 k 重交叉验证策略,就需要在目标函数内部实现。

关于上述代码的重要说明:

目标函数旨在找到最小化均方根误差(RMSE)的最佳模型参数。

Scikit-learn 中回归问题的极端随机化树的实现称为extractreesregressor。

注意火车集合中的房价是对数变换的。因此,在验证集上做出的预测被转换回它们的原始规模。

优化模型的超参数所需的最后一步是实例化类调谐器,它负责运行芒果:

在配备 2.3 Ghz 四核英特尔酷睿 i7 处理器的 MacBook Pro 上,代码运行时间为 4.2 分钟。

最佳超参数和最佳 RMSE 分别为:

best parameters: {‘max_depth’: 9, ‘max_features’: ‘auto’, ‘min_samples_leaf’: 85, ‘min_samples_split’: 729}
best accuracy (RMSE): 0.7418871882901833

当在具有最佳模型参数的训练集上训练模型时,测试集上的 RMSE 是:

rmse on test: 0.7395178741584788

**免责声明:**运行这段代码时,您可能会得到不同的结果。

让我们简单回顾一下上面代码中使用的调音器*类。*该类有许多配置参数,但在本例中,我们只尝试了其中的两个:

  • num_iteration:这些是 Mango 用来寻找最优值的总迭代次数。
  • initial_random:该变量设置测试的随机样本数量。重要: 芒果将所有随机样本一起返回。这非常有用,尤其是在优化需要并行运行的情况下。

有关配置芒果的其他参数的更多信息,您可以访问此链接

这篇博客中的例子使用了一个小数据集。然而,在许多实际应用中,您可能会处理需要并行实现 Mango 的大型数据文件。如果你去我的 GitHub 库,你可以找到这里显示的完整代码以及大数据文件的实现。

芒果很百搭。您可以在广泛的机器和深度学习模型中使用它,这些模型需要并行实现或分布式计算环境来优化它们的超参数。因此,我鼓励你访问芒果的 GitHub 库。在那里,你会发现许多笔记本展示了在不同的计算环境中使用芒果的情况。

带回家的信息

在这篇博客中,我们回顾一下 Mango :一个大规模进行贝叶斯优化的 Python 库。该软件包将使您能够:

  • 扩展您的模型超参数优化,甚至可以在分布式计算框架上运行。
  • 轻松地将 scikit-learn 模型与 Mango 集成,以产生强大的机器学习管道。
  • 使用 scipy.stats 中实现的任何概率分布函数来声明您的搜索空间。

所有这些特性使得 Mango 成为一个独特的 Python 库,它将拓宽你的数据科学工具包。

我希望你学到了新的东西。再次感谢你的阅读!

歧管对齐

原文:https://towardsdatascience.com/manifold-alignment-c67fc3fc1a1c

多个数据集的统一

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

作者的 3D 艺术

单倍比对是一个寻找共同潜在空间的问题,在这个空间中,我们共同对多个数据集进行降维,以保持这些数据集之间的任何对应关系。在我们深入流形对齐的细节之前,让我们先了解什么是流形。

什么是流形?

n 维流形是具有极限、连续性和正确性的最一般的数学空间,并且允许与 n 维欧几里得空间存在连续的反函数。流形局部类似欧几里得空间,但它们可能不是欧几里得空间。本质上,流形是欧几里得空间的推广。

在拓扑学中,如果两个物体中的一个可以通过
变形成为另一个,而不需要切割或粘合,那么这两个物体就被认为具有相同的形状。形状与
相同的物体称为同胚。流形同胚于欧几里得空间。

流形对齐的问题

在信息革命的时代,我们看到物联网、信息物理系统、生物信息学和机器人领域产生了海量数据。这些数据越来越多模态化,即来自多个来源的一个以上的数据集描述相同的物理或生物过程。自然,这些数据集共享相似或相同的潜在语义结构。流形对齐的问题是关于对齐多个数据集以获得更有意义的表示。从各种模态获得的数据集可能具有不相交的特征,这使得对齐成为一个具有挑战性的问题。

问题陈述

我们可以将流形对齐问题总结为联合降维,约束是由问题中各种数据集之间的对应关系激发的。

如果我们有大小为nt8】×p 的数据集 x 和大小为mt14】×t16】r 的数据集,它们的实例位于同一个流形 z 上,那么对齐的问题就是找到 fg 使得f(xᵢ【t24)接近 g 在这种情况下,我们感兴趣的是映射 f: ℝᵖ ℝᵏ和 g: ℝʳ ℝᵏ的一些潜在维度 k 。我们用ℝ来表示实数集。

只有当f(xᵢ*)=g(y)*时,每个样本点 x ᵢ 和 y ᵢ才可能有精确的对应关系,否则我们可以使用先验对应关系,如任何关于 xy ᵢ.的相似性信息【f(x);g(y) 将是 X 和 Y 在新的潜在空间中的统一表示,而 f(X)g(Y) 将是 X 和 Y 的新坐标

解决问题的几个思路:

  1. 通过将每个数据集的相似点映射到欧几里德空间中的相似位置,除了保留数据集之间的关系之外,还可以保留每个数据集中的单个结构。
  2. 流形对齐算法可以是无监督的、半监督的或有监督的,这取决于有多少先验信息可用。完全对应允许监督算法,而不完全对应允许半监督或无监督。
  3. 每个数据集的图拉普拉斯算子将是同一流形的离散近似。因此,这些拉普拉斯算子的对角线连接以及用对应关系填充的非对角线元素是该流形的近似。
  4. 我们可以使用图嵌入算法来保持局部相似性,并且可以通过联合拉普拉斯算子来编码对应关系。因此,流形对齐可以简化为流形学习问题。

损失函数

在为流形对齐问题开发损失函数时,我们需要考虑两个因素。第一个是损失函数应该保持局部结构和对应信息。第二是在形成联合拉普拉斯算子之后,流形对齐应该等价于拉普拉斯特征映射。

如果我们有 c 数据集 X ⁽ ⁾、 X ⁽ ⁾、…、 X ⁽ᶜ⁾,那么我们可以为数据集内写一个损失项来反映局部相似性的保持,如

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

其中 F ⁽ᵃ⁾嵌入第 a 个数据集,即 X ⁽ᵃ⁾.的新坐标它表示如果第 I 行和第 j 行相似,即当 w 项大于时, F ⁽ᵃ⁾( i ,)和 F ⁽ᵃ⁾( j ,)应该彼此靠近放置。

对于数据集之间,损失项为

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

它定义了在⁽ᵃ⁾and 和⁽ᵇ⁾.之间保持通信的成本因此,我们可以有完整的损失函数为

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

拉普拉斯特征映射的损失函数可以使用联合相邻矩阵写成

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

其中 F 是所有数据集的矢量表示,而 W 是联合邻接矩阵。这就是说,如果当 W(i,j) 较大时, X ⁽ᵃ⁾和 X ⁽ᵇ⁾的第 I 和第 j 行相似,那么它们在潜在空间 F ( i ,)和 F ( j ,)中的位置应该接近。我们可以把它改写成

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

其中 L 是所有数据集的联合拉普拉斯算子

因此,流形对齐的优化问题变成

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

其中 I 是一个s×s 单位矩阵, s 是新空间的维数。

解的最优性

上述优化问题的最优解可以使用拉格朗日乘数来求解

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

其中f=【f₁,f₂,… fₛ】其中解为 s 最小非零特征向量和 λ 为拉格朗日乘子。

最终算法

给定 c 数据集 X ⁽ ⁾、 X ⁽ ⁾、…、 X ⁽ᶜ⁾都在相同的流形上,相似性函数 S 提供来自相同数据集的两个样本点关于沿流形的测地距离的相似性,以及一些对应信息——可以是来自不同数据集的样本点的相似性的形式(例如,皮尔逊相关、互信息等——只是一个想法,我们需要进一步探索),我们

  1. 使用相似性函数 S 找到每个数据集的邻接矩阵 W ⁽ ⁾、 W ⁽ ⁾、…、w⁽ᶜ⁾——如果一个实例是另一个实例的 k-最近邻,则可能包括两个实例之间的权重。
  2. 构造联合拉普拉斯 l。
  3. 计算sLf=λDf的最小非零特征向量
  4. 下面的 F 方程的行是 X⁽ᵍ⁾:的新坐标

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

稍后,我将提供一个使用玩具数据集的编码示例。在此期间,如果读者有任何问题,欢迎在评论中提问。

感谢您的阅读。如果你喜欢我的文章并想支持我的内容,我请求你通过https://rahulbhadani.medium.com/membership订阅 Medium。

参考

  1. https://web . archive . org/web/20210506132703/http://www . math . LSA . umich . edu/~ jchw/womp talk-manifolds . pdf
  2. https://www . math . Arizona . edu/~ glickenstein/research/layman fin/node 3 . html
  3. https://web . archive . org/web/20160909193617/http://OCW . MIT . edu/courses/mathematics/18-965-geometry-of-manifolds-fall-2004/lecture-notes/lesson 1 . pdf
  4. https://my . Vanderbilt . edu/Stacy fostad/files/2011/10/shape of space . pdf
  5. https://people . csail . MIT . edu/pkrafft/papers/Wang-et-al-2010-manifold . pdf
  6. https://sites.google.com/site/changwangnk/home/ma-html

在 Python 中操作列表

原文:https://towardsdatascience.com/manipulating-lists-in-python-8edcfb30b9bd

在 Python 中使用列表创建附加数据结构

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

图片由像素上的苏西·黑兹尔伍德拍摄

列表和数组是 Python 中最广泛使用的两种数据结构。Python 中的列表只是对象的集合。这些对象可以是整数、浮点数、字符串、布尔值,甚至是字典之类的其他数据结构。数组,特别是 Python NumPy 数组,类似于 Python 列表。主要区别在于 NumPy 阵列速度更快,并且对对象的同质性有严格的要求。例如,字符串的 NumPy 数组只能包含字符串,不能包含其他数据类型,但是 Python 列表可以包含字符串、数字、布尔值和其他对象的混合。因为像计算平均值或总和这样的操作在 NumPy 数组上要快得多,所以这些数据结构在优先考虑速度性能的环境中更常见。

lists 和 NumPy 数组都有大量的内置方法来执行各种任务,包括排序、查找最小值/最大值、截断、追加、连接等等。

列表也可以定义其他数据结构,比如字典,它们在软件工程和数据科学中都有应用。例如,列表可以生成字典,字典可以转换成 json 文件。软件工程师通常使用这些文件类型。

字典也可以转换成数据框,这是数据科学家经常使用的。更重要的是,Python 列表允许您轻松构建对许多数据任务有用的各种数据框。这包括用新的字段扩充现有的数据表,使用构造的列表计算新的数据字段,对通过 API 访问的数据执行探索性的数据分析,等等。对 Python 列表和 NumPy 数组的透彻理解为许多有用的数据任务打开了大门。

列表和数组经常用于生成合成数据等任务。在许多情况下,数据科学团队对真实数据的访问是有限的。当构建依赖于数据 ETL 和机器学习的软件时,合成数据通常是构建应用原型的唯一选择。Python 使您能够生成综合列表,例如姓名、州、身高、职业和任何其他可以表示为字符串的分类值。此外,它还可以生成数字值,如人口、收入和交易金额。对于 Python 中的列表理解,简单的特征工程也很简单。总之,列表和数组都提供了许多操作和生成数据的有用方法。

在这里,我们将调查一些使用列表和数组的最常见的方法和数据结构。这将为初级软件工程师或数据科学家在 Python 中使用列表进行数据操作打下坚实的基础。

构建 Python 列表

用 Python 构建一个列表非常简单。您可以构造一个字符串、浮点值、整数和布尔值的列表。Python 字符串列表是对应于 unicode 字符序列的值列表。浮点列表包含表示实数的值。整数列表包含可以是正数、负数或零的整数值。最后,布尔列表是真/假值的列表。您还可以构造一个混合类型的列表。

让我们首先构建一个包含脸书、亚马逊、苹果、网飞和谷歌公司的字符串列表:

tech_company_names = ['Facebook', 'Apple', 'Amazon', 'Netflix', 'Google']

让我们构建一个整数列表,代表 2021 年这些公司的员工人数。我们的整数列表中的顺序将与我们公司名称列表中的顺序相同。例如,在我们的公司名称列表中,“脸书”是第一个元素的值,在我们的员工列表中,58,604 是脸书的员工数。

tech_company_employees = [58604, 147000, 950000, 11300, 135301]

接下来,让我们构建一个与 2021 年每家公司的收入(以十亿美元计)相对应的浮动列表:

tech_company_revenue = [117, 378, 470, 30, 257]

最后,让我们创建一个布尔列表。我们将使用叫做列表理解的东西来构造我们的布尔值列表。列表理解是一种基于其他列表中的值构建新列表的简单而有用的方法。列表理解的结构通常如下所示:

list = [expression for element in iterable]

表达式可以是 iterable 本身的元素,也可以是元素的某种转换,比如检查条件的真值。这就是我们将要做的来创建布尔列表。该列表将基于我们的技术公司员工列表中的值。如果雇员超过 60,000 人,则该值为 true,否则为 false:

tech_company_employee_bool = [x > 60000 for x in tech_company_employees ]

这将创建以下列表:

[False, True, True, False, True]

也可以构造混合类型的列表。假设我们有公司名称、收入、员工数量和基于员工数量的布尔值。让我们考虑一下微软的混合类型值列表:

new_company_info = ['Microsoft', 163000, 877, True]

我们可以使用 append 方法来更新每个列表。如果我们打印更新的列表,我们会看到添加了新的值:

print('Company: ', tech_company_names)
print('Employees: ', tech_company_employees)
print("Revenue: ", tech_company_revenue)
print("Employee_threshold: ", tech_company_employee_bool)

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

作者图片

Python 列表还配备了各种有用的方法。例如,我们可以对公司列表(按字母顺序)和员工数量(按升序)进行排序:

tech_company_names.sort()tech_company_employees.sort()

这将我们的列表修改为以下内容:

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

作者图片

请注意,这将改变这些列表的顺序,使它们不再匹配。更安全的选择是使用内置的 Python 方法 sorted,它返回一个排序列表,我们可以将它存储在一个新的变量中,而不是修改旧的列表。

sort_company = sorted(tech_company_names)sort_employee = sorted(tech_company_employees)print(sort_company)print(sort_employee)

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

作者图片

构造一个 NumPy 数组

NumPy 是一个用于生成数组的 Python 包,它与 Python 列表有很多区别。最大的区别是 NumPy 数组比 Python 列表使用更少的资源,这在存储大量数据时变得很重要。如果您正在处理成千上万的元素,Python 列表将适合大多数目的。然而,当列表中的元素数量接近数百万或数十亿时,NumPy 数组是更好的选择。

NumPy 对于生成合成数据也很有用。例如,假设在我们的技术公司数据示例中,我们缺少净收入的值,其中净收入是总销售额减去商品成本、税收和利息。我们想以某种方式估算这些值。此外,我们希望从正态分布中对这些估算值进行采样。让我们创建一个 NumPy 数组,其中包含每家公司的净收入列表。

要继续,让我们导入 NumPy 包:

import numpy as np

为了生成我们的样本,我们需要一个平均净收入和净收入标准差的值。让我们做一个简单的假设,跨公司的平均净收入为 800 亿美元,标准差为 400 亿美元。我们将分别把均值和标准差μ和σ称为变量:

mu, sigma = 80, 40

我们还需要指定我们想要生成的值的数量。我们可以简单地将科技公司列表的长度存储在一个新变量中,我们称之为 n_values:

n_values = len(tech_company_names)

我们还应该指定一个随机种子值,以确保我们的结果是可重复的:

np.random.seed(21)

为了生成我们的数组,我们将使用 NumPy random 模块中的常规方法。我们将把平均值(mu)、标准偏差(sigma)和值的数量(n_values)的参数值传递给正常方法,并将结果存储在一个名为 net_income 的变量中:

net_income_normal = np.random.normal(mu, sigma, n_values)print(net_income_normal)

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

作者图片

在这里,我们为脸书(770 亿美元)、苹果(750 亿美元)、亚马逊(1250 亿美元)、网飞(290 亿美元)、谷歌(1090 亿美元)和微软(110 亿美元)的净收入生成了合成值。由于这些数字是合成的,我们使用汇总统计的合成值来估算所有公司的价值,它们不太现实。

生成这些合成值的一种更准确的方法是使用每家公司的平均净收入和净收入的标准偏差(如果可以获得),从每家公司的唯一正态分布中得出。就目前而言,我们假设我们可以获得所有公司的平均值和标准差的简单方法就足够了。

对于本例,我们假设净收入的分布是正态的(或形状像钟形曲线)。另一种常见模式是胖尾分布,当一个分布包含大量的极端正值或负值时就会出现这种情况。这也称为偏斜度。我们可以使用 NumPy 中的 gumbel 方法生成一个来自胖尾分布的净收入合成值列表:

np.random.seed(64)net_income_fat_tail = np.random.gumbel(mu, sigma, n_values)print(net_income_fat_tail)

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

作者形象

同样,这里值得注意的是,尽管这些值不太现实,但通过使用实际的汇总统计值并为每家公司生成一个分布,它们可以很容易地得到改善。有了正确的领域专业知识,这些方法可以生成高质量、逼真的合成数据。

使用列表构建字典、JSON 文件、数据帧和 CSV 文件

有了我们生成的列表,我们现在可以构建一个 Python 字典,这是一种将列表存储在键:值对中的有用方法。我们有一个公司名称、员工人数、收入、收入阈值布尔人、正态分布净收入和胖尾分布净收入的列表。让我们为每个列表创建一个字典映射:

company_data_dict = {'company_name': tech_company_names,
                     'number_of_employees': tech_company_employees,
                     'company_revenue': tech_company_revenue,
                     'employee_threshold': tech_company_employee_bool, 
                     'net_income_normal': list(net_income_normal), 
                     'net_income_fat_tail': list(net_income_fat_tail)}
print(company_data_dict)

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

作者形象

我们看到,在这个数据结构中,我们有键,它们是唯一的字符串,或者我们给每个列表和相应的列表命名。我们可以通过以下逻辑很容易地将这个字典转换成一个 JSON 文件:

import json 
with open('company_data.json', 'w') as fp:
    json.dump(company_data_dict, fp)

我们可以读取 JSON 文件并打印结果:

f = open('company_data.json')
company_json = json.loads(f.read()) 
print(company_json)

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

作者形象

我们也可以很容易地使用熊猫数据框架构造器将 Python 字典转换成熊猫数据框架

import pandas as pdcompany_df = pd.DataFrame(company_data_dict)print(company_df)

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

作者形象

我们还可以使用 to_csv 方法,使用 panasus 将此数据框写入 CSV 文件:

company_df.to_csv("comapany_csv_file.csv", index=False)

我们可以使用 read_csv 方法读入我们的文件:

read_company_df = pd.read_csv("comapany_csv_file.csv")

并显示我们的数据:

print(read_company_df)

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

作者形象

我们看到,通过一行代码,我们就可以使用之前创建的列表和字典来生成熊猫数据框架。

这篇文章中的代码可以在 GitHub 上找到。

结论

在 Python 中构造列表和数组对于各种任务都很有用。Python 允许您轻松地创建和操作字符串、布尔值、浮点数和整数的列表。此外,list comprehension 允许您以一种可读和简洁的方式基于另一个列表中的值创建新列表。

NumPy 数组是一种资源效率更高的列表替代方法,列表还配备了用于执行复杂数学运算和生成合成数据的工具。这两种可迭代对象都可以用来构建更复杂的数据结构,比如字典和数据框。此外,从这些由列表创建的数据结构中创建 json 和 csv 文件非常简单。对于每个工程师和数据科学家来说,很好地理解 python 中用于生成和操作列表和数组的工具是必不可少的。

如果你有兴趣学习 python 编程的基础知识、Pandas 的数据操作以及 python 中的机器学习,请查看Python for Data Science and Machine Learning:Python 编程、Pandas 和 sci kit-初学者学习教程 。我希望你觉得这篇文章有用/有趣。

本帖原载于 内置博客 。原片可以在这里找到https://builtin.com/data-science/how-to-create-list-array-python

处理极坐标数据框中的值

原文:https://towardsdatascience.com/manipulating-values-in-polars-dataframes-1087d88dd436

了解如何使用 Polars 中的various 方法来操作数据帧

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

杰西卡·鲁斯切洛Unsplash 上拍摄的照片

到目前为止,我已经谈论了如何使用 Polars 数据框架,以及为什么它是一个比 Pandas 更好的数据框架库。继续我们对 Polars 的探索,在本文中,我将向您展示如何操作 Polars 数据框架,特别是:

  • 如何更改每一列/行的值
  • 如何合计每一列/行的值
  • 如何向现有数据框架添加新列/行

准备好了吗?我们走吧!

创建示例数据帧

让我们使用元组列表创建一个 Polars 数据帧:

import polars as plmatrix = [
    (1, 2, 3),
    (4, 5, 6),
    (7, 8, 9),
    (10, 11, 12),
    (13, 14, 15),
    (16, 17, 18)
]df = pl.DataFrame(matrix, columns=list('abc'))
df

数据帧看起来像这样:

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

作者图片

让我们研究一些方法,您可以调用这些方法来操作数据帧中的值。

使用 apply()方法

apply()方法可用于:

  • 数据帧中的单个列,或者
  • 整个数据帧

应用于列

例如,假设您想要将’ a’ 列中的所有值乘以 2。您可以执行以下操作:

df.select(
    pl.col('a').**apply**(lambda x: x*2)
)

列’ a 中的所有值现在将乘以 2:

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

作者图片

在上面的 lambda 函数中,x将采用列 a 的单个值。当应用于一个列时,apply()方法逐个发送列的值。这为您提供了在决定如何更改值之前检查每个值的机会。例如,您可以只乘以那些大于或等于 5 的值:

df.select(
    pl.col('a').apply(**lambda x: x*2 if x>=5 else x**)
)

这将产生以下输出:

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

作者图片

一般来说,使用*apply()*方法实现逻辑比使用表达式实现逻辑要慢,并且占用更多内存。这是因为表达式可以并行化和优化,表达式中实现的逻辑是用 Rust 实现的,这比用 Python 实现(例如用 lambda 函数实现)要快。因此,尽可能使用表达式,而不是使用apply()函数。例如,早期的apply()方法也可以用一个表达式重写:

 pl.col('a').apply(lambda x: x*2)
    # rewritten as an expression
 **pl.col('a') * 2**

请注意,结果只包含一列。如果您希望其余的列也出现在结果中,请使用select()exclude()方法:

**q = (
    df
    .lazy()
    .select(
        [
**            pl.col('a').apply(lambda x: x*2),
         **   pl.exclude('a')
        ]
    )
)****q.collect()**

现在结果包含了所有的列:

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

作者图片

如果您想将所有列乘以 2,使用pl.col(‘*’)选择所有列:

q = (
    df
    .lazy()
    .select(
 **pl.col('*').apply(lambda x: x*2)**
    )
)q.collect()

所有列现在将乘以 2:

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

作者图片

如果要将列’ a’ 乘以 2,然后将结果存储为另一列,请使用alias()方法:

q = (
    df
    .lazy()
    .select(
        [
            pl.col('*'),
            pl.col('a').apply(lambda x: x*2)**.alias('x*2')**,
        ]
    )
)q.collect()

结果现在会有一个额外的列:

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

作者图片

使用 map()方法

另一个类似于apply()方法的功能是map()方法。与apply()方法不同的是,map()方法将一列的值作为单极性序列发送:

df.select(
    pl.col('a').**map**(lambda x: x*2)
)

在上面的 lambda 函数中,x是包含列 a 的值的 Polars 序列。上述语句产生以下输出:

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

作者图片

应用于行

注意到目前为止,数据帧中的应用了apply()方法。如果您想应用于数据帧中的该怎么办?在这种情况下,直接调用 dataframe 上的apply()方法。

为了理解它是如何工作的,我编写了一个test函数来打印出将apply()函数应用于 dataframe 时得到的值:

def test(x):
    print(x)
    return x

df.apply(test)

它返回以下内容:

(1, 2, 3)
(4, 5, 6)
(7, 8, 9)
(10, 11, 12)
(13, 14, 15)
(16, 17, 18)

这意味着apply()函数在应用于 dataframe 时,会将每一行的值作为一个元组发送给接收函数。这对于一些用例很有用。例如,假设您需要将一行中的所有数字除以 2,如果它们的和大于 10,那么您可以将 lambda 函数写成:

df.apply(lambda x: **tuple([i // 2 for i in x]) if sum(x) > 10 else x**)

结果会是这样的:

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

作者图片

如果想复制数据帧中的所有列,也可以使用apply()方法:

df.apply(lambda x: x*2)

数据帧现在有六列:

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

作者图片

注意apply()功能不能应用于 LazyFrame。

对数据帧中的值求和

通常,您需要按行或按列对数据帧中的所有值求和。

按列

合计每列值的最简单方法是在数据帧上使用sum()方法:

df.sum()

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

作者图片

要将上述结果附加到现有数据帧,使用concat()方法:

pl.**concat**([df, df.sum()])

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

作者图片

按行

要合计每行所有列的值,使用sum()方法,并将axis参数设置为1:

df.sum(**axis=1**)

结果是一个 Polars 系列:

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

作者图片

将 Polars 系列视为数据帧中的一列

您也可以使用select()方法来选择您想要求和的列:

df.**select(pl.col('*'))**.sum(axis=1)

以下代码片段将系列作为新列添加到 dataframe 中:

df['sum'] = df.select(pl.col('*')).sum(axis=1)
df

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

作者图片

如果您不想使用方括号索引(Polars 中不推荐使用),请使用select()方法:

df.**select**(
    [
        pl.col('*'),
        df.select(pl.col('*')).sum(axis=1).alias('sum')
    ]
)

https://weimenglee.medium.com/membership

我将在即将到来的新加坡 ML 会议(2022 年 11 月 22-24 日)上主持一个关于 Polars 的研讨会。如果你想在 Polars 数据框架上快速起步,请在https://ml conference . ai/machine-learning-advanced-development/using-Polars-for-data-analytics-workshop/上注册我的研讨会。

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

摘要

我希望这篇文章为您使用 Polars 数据框架增加了一些弹药。以下是何时使用apply()map()方法的快速总结:

  • 对表达式调用apply()方法,将函数应用于数据帧中 中的 单个 值。
  • 在表达式上调用map()函数,将函数应用于数据帧中的
  • 在数据帧上调用apply()方法,将函数应用于数据帧中的 s

保存这篇文章,并在下次使用 Polars 数据框时用作快速参考!

多种语言,一个深度学习模型

原文:https://towardsdatascience.com/many-languages-one-deep-learning-model-69201d02dee1

多语言理解比你想象的容易!

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

(来源)

*我们如何让基于自然语言的深度学习系统理解多种语言的数据?*一种简单的方法是在每种期望的语言上训练一个单独的深度学习模型。但是,这种方法非常繁琐。*如果我们需要创建一个接收来自 100 多种不同语言的数据的系统,该怎么办?*承担训练 100 个深度学习模型的成本,对于大多数从业者来说是不可行的。

幸运的是,最近的深度学习研究表明,多语言理解可能比看起来更简单。在 BERT [1]出现后不久,研究人员意识到双向转换器模型能够同时从多种语言中学习。这种方法使多种语言的深度学习变得简单——只需训练一个模型来处理所有语言。

“最近的发展表明,有可能建立通用的跨语言编码器,可以将任何句子编码到共享的嵌入空间中。”

—来自【2】

这些多语言模型几乎与 BERT 相同。然而,他们的自我监督预训练是在包含来自 100 多种语言的文本数据的多语言语料库上进行的。尽管对于训练这些多语言模型存在一些额外的考虑,但是总体方法与训练单语 BERT 模型惊人地相似。

多语言深度学习模型对于语言理解的主要好处有两个方面:

  • 简单性:单一的模型(而不是每种语言的独立模型)更容易使用。
  • 归纳转移:多种语言的联合训练使得跨语言模式的学习成为可能,这有利于模型性能(特别是在低资源语言上)。

对于深度学习实践者来说,这些模型非常有用,因为它们表现得惊人地好,并且不需要任何深入的语言理解。在这个概述的过程中,我将解释基于 BERT 的多语言模型的当前工作,包括对这种模型的行为/倾向的分析和对最近提出的模型的解释。

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

使用自我监督、屏蔽的语言建模目标对多语言 BERT 模型进行预训练(由作者创建)

多语言理解的基础

在自然语言处理(NLP)领域,大量的研究工作已经投入到制作通用(单语)句子表示(例如, FastTextWord2Vec 、GloVe【8】等)中。).BERT [1]的出现——在我的上一篇文章中解释过——彻底改变了这个领域,揭示了预先训练的双向变压器模型产生可微调的句子表示,以非常高的准确度解决语言理解任务。

除了单语方法,许多 NLP 研究人员已经研究了跨语言的单词或短语对齐问题[9,10],机器翻译[11]和跨语言表示学习[12]。其核心是,这样的研究提出了这样一个问题:有没有可能创建一个跨语言共享嵌入空间的通用句子编码器?

朝着这个方向发展,最近的研究发现,伯特风格、预先训练的变形金刚可以产生有用的多语言句子表示。通过简单地使 BERT 的预训练语料库多语言化,这些模型获得了对许多语言的体面理解,并可以进行微调以解决跨语言任务(例如,对多种语言的句子进行分类)。第一种方法叫做多语言 BERT (mBERT ),实际上是与 BERT 同时提出的。

多语言 BERT (mBERT)

最初的 BERT 出版物[1]没有提到多语言学习。然而,BERT 的公开版实际上包含了一个多语种版本的 BERT,名为(创造性地)多语种 BERT (mBERT)

该模型与 BERT 几乎相同,唯一的区别是:

简而言之, mBERT 是一个单一的模型,它学习跨大量语言的统一表示

预培训方法。 mBERT 接受了来自超过 100 种语言(而不仅仅是英语)的维基百科数据的预训练。为了构建预训练数据集,作者在维基百科上找到数据量最大的 100 种语言,然后将这些数据串联起来,形成多语言预训练数据集。mBERT 学习的所有语言都是基于大小为 110K 的单个单词块词汇嵌入的。

为每种语言分配一个概率,预训练更新从一种语言中抽取一部分文本数据,用于根据该概率进行的自监督更新,允许 mBERT 在整个预训练过程中接触所有不同的语言。不出所料,预训练数据集中的某些语言自然代表性不足——它们的数据比其他语言少。为了减轻这种不平衡的影响,每种语言的概率被指数平滑如下:

  1. 取每种语言的概率(例如,如果 21%的预训练语料库是英语,则英语具有 21%的概率)
  2. 用因子 s 对这个概率取幂(例如,mBERT 使用 s=0.7,得到 0.21⁰.7 = 0.335)
  3. 基于这些指数化的概率,重新归一化(即除以总和)每种语言的概率

这种平滑方法 (i) 略微降低了采样高资源语言的概率,而 (ii) 略微增加了采样低资源语言的概率。尽管平滑的量由 s 的选择来控制,但是这种技术确保了在预训练期间低资源语言不会被代表不足(反之亦然);见下文。

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

语言概率的指数平滑

对于那些感兴趣的人来说,语言概率的指数平滑法受到了用于时间序列预测的类似技术的启发。

**mBERT 真的很有用。**在 XNLI 数据集上评估时,发现 mBERT 在解决跨语言任务方面相当有效。跨多种语言的联合预训练带来了显著的性能优势,其中低资源语言的分类任务得到了最大的提升。这些结果表明,多语言预训练有助于正向归纳迁移——同时训练多种语言实际上比训练每种语言的单独模型更好。

应当注意,许多用于多语言(和单语)理解的现有方法依赖于专门的语言学方法。mBERT(和 BERT)的提议极大地简化了日常实践者解决 NLP 任务的过程。

数据集

有几个数据集可用于多语言深度学习模型的下游评估。这些数据集既包括分类风格的问题,也包括更复杂的问题,如命名实体识别或问题回答。

跨语言 NLI (XNLI)语料库。 XNLI 是流行的 multiNLI 语料库的多语言版本,是目前最流行的评估多语言语言理解的数据集。multiNLI 数据集包含 433,000 对已经用文本蕴涵信息进行了注释的句子(即,句子是否相互矛盾,相互蕴涵,或者是中性的)。multiNLI 数据集不同于其他自然语言推理数据集,因为它包含跨众多语音和文本体裁的句子。

XNLI 语料库是 multiNLI 的一个版本,已被翻译成 15 种不同的语言,由:

  • 使用人类来翻译开发和测试集
  • 机器翻译训练集

在 XNLI 数据集上进行训练的几种不同方法在文献中经常被报道,包括:

  • **翻译-训练:**对每种语言的训练集使用单独的模型进行训练和评估
  • **翻译-测试:**开发和测试集被翻译成英语,然后在训练集上微调单个英语模型并用于评估
  • translate-train-all: 在所有不同语言的训练集的机器翻译版本上微调单个多语言模型,然后使用每种不同语言进行评估。

也可以使用零测试设置来执行评估,在零测试设置中,某一语言被排除在训练集之外,但仍包括在评估中。

**其他数据集。**虽然 XNLI 非常受欢迎,但还有其他几个数据集用于评估多语言理解。例如,命名实体识别 (NER)的 CoNLL 数据集包含英语、荷兰语、西班牙语和德语的翻译。此外,对于问题回答, MLQA 基准采用了流行的小队基准用于英语,并将其扩展到西班牙语、德语、阿拉伯语、印地语、越南语和中文版本。最后,多语言模型仍然通常在 GLUE 基准上进行评估,以便更好地比较它们与单语模型的性能。最近还提出了更广泛的多语言基准,如 XTREME

出版物

我现在将概述几个研究多语言 BERT 模型的出版物。这些出版物中的两个提出了对底层模型的潜在修改,而其他的分析模型行为并研究对更复杂应用的扩展(例如,命名实体识别)。

跨语言语言模型预训练[2]

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

XLM 的语言嵌入(摘自[2])

与 mBERT 的提议同时,[2]的作者开发了跨语言语言模型(XLM)。XLM 是第一个使用生成性和跨语言预训练相结合的思想来创建多语言、基于转换的语言理解模型的模型之一。XLM 与伯特共享相同的架构,除了额外的“语言”嵌入被添加到模型输入中的每个令牌;见上图。

与 mBERT 类似,XLM 有一个共享的标记化方法和跨所有不同语言的嵌入空间。由于这种共享的嵌入空间,不同语言之间共享的标记级模式很容易学习。

“这极大地改善了共享相同字母表或锚标记(如数字或专有名词)的语言之间嵌入空格的对齐方式”

—来自【2】

与 mBERT 相反,作者考虑了 XLM 训练前数据的两个来源:

  • 来自每种不同语言的无监督的原始文本数据(与 mBERT 预训练数据相同)。
  • 不同语言的平行句子集(即一种语言的句子与另一种语言的相同句子成对出现)。

上面提到的第二种数据集类似于机器翻译数据集——它只包含成对的句子,其中每个句子都被翻译成了另一种语言。显然,获得这样的句子对比获得原始文本更困难,因为它需要翻译文本数据(通过机器或人工注释器)。

利用这两个数据来源,为 XLM 提出了几个不同的培训前任务:

  • 因果语言建模(CLM): 给定一个序列中的一组单词,预测下一个单词(这是一个普通的语言建模任务)。
  • 蒙面语言建模(MLM): 相同,自我监督 MLM 任务在 BERT 内部使用。
  • 翻译语言建模(TLM): 类似于 MLM,但是使用不同语言的两个平行句子作为输入(与单语输入相对)。

直观上,TLM 任务可以学习语言之间的对应关系。如果某个单词在一种语言中被屏蔽,该模型可以关注翻译句子的相应区域来预测被屏蔽的单词;见下文。

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

(来自[2])

因为 CLM 任务需要使用单向自我关注,三个独立的 XLM 模型使用 CLM、MLM 和 MLM+TLM 进行预训练。当对下游任务进行评估时,这些 XLM 模型在跨语言检测和机器翻译基准上取得了最先进的结果。使用 MLM 或 MLM+TLM 预培训目标会产生最佳效果。

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

(来自[2])

用 CLM 训练的 XLM 模型也显示出在下游语言建模应用中产生困惑改进。XLM 最显著的成绩提高发生在低资源语言上,揭示了多语言预训练对这类语言产生积极的归纳迁移。

在零元迁移领域,XLM 在推广新语言方面表现出色。特别是,由于跨语言的共享词汇,XLM 可以利用语言之间的标记相似性来推理未明确包括在其训练集中的语言。

多语言 BERT 的语言中立性如何?[3]

随着 mBERT 的公开发布,许多研究人员对模型的行为和属性产生了疑问。BERT 修改这么少怎么支持多种语言?从不同语言中学习到的表征是否对齐(即不同语言中的相似词有相似的表征)?通过更具体的调整来支持多种语言,可以提高 mBERT 的性能吗?

为了解决这些问题,作者在[3]中采用了 mBERT 模型,并研究了它在三个下游任务中的行为:

  • **语言识别:**对句子的语言进行分类
  • **句子检索:**在不同语言的文本语料库中查找句子的翻译版本
  • **词语对齐:**计算同一句子翻译版本中对应词语的对齐度
  • **机器翻译质量评估:**在不访问参考译文的情况下计算(机器生成的)译文的质量(即,这是一项更加细致/困难的任务。有关更多信息,请参见[3]的第 4 节)

在对这些不同任务中的每一个进行微调之后,作者进行了广泛的分析,从而对模型的行为产生了深刻的见解。有趣的是,人们发现 mBERT 表示由语言中立和特定于语言的成分组成— 由 mBERT 产生的表示并不完全是语言中立的。

例如,mBERT 能够以高准确度识别输入句子的语言。但是,当 mBERT 的表示居中/规范化时(基于语言中的所有其他表示),模型:

  • 在对源语言进行分类方面要差得多
  • 更擅长执行句子检索

这一发现揭示了一些语言特有的信息清楚地包含在 mBERT 的表征中。因此,mBERT 学习的模式并不是所有语言都通用的。尽管尝试了多种改进的微调方法,作者在使 mBERT 的表示更加语言中立方面并不成功。因此,产生具有改进的语言中立性的模型是未来的工作。

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

(摘自[3])

尽管有这些发现,但作者观察到,语言相似的语言在 mBERT 的嵌入空间中聚集在一起(见上文),并且 mBERT 擅长解决跨语言、单词级的语义任务(例如,单词对齐和句子检索)。尽管努力完成更复杂的任务,如机器翻译质量评估,mBERT 仍然能够在一定程度上捕捉跨语言的相似性。换句话说,mBERT 工作得很好,但必须加以改进,才能直接应用于更大范围的跨语言任务。

用 BERT 实现通用语命名实体识别[4]

如果你和我一样,关于这篇论文你会问的第一个问题是— *这个题目是什么,有什么含义?*首先,牛津语言对“通用语”的定义是:

“母语不同的人之间作为共同语言使用的一种语言.”

虽然标题有点花哨,但上面的定义实际上很好地概括了本文的目的— 找到一个可以跨多种语言同时执行命名实体识别的单一模型。特别是,[4]的作者在多种语言的 NER 数据集上联合训练了一个 mBERT 模型(如下所示)。

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

NER 的 mBERT 建筑(摘自[4])

人们发现 mBERT 完全有能力解决这样的任务。该模型可以在不同语言的 NER 任务上联合训练,这产生了 NER 性能的改善,尤其是在低资源语言上。

作者还表明,mBERT 能够执行高精度的零炮 NER 推断。鉴于先前的姆伯特/XLM 模型可以以类似的方式进行零炮推断,这似乎并不令人惊讶。然而,NER 是一个复杂的令牌级任务,与分类任务相比很难解决。尽管它简单易用,但在这个复杂的领域中,mBERT 的表现还是令人惊讶的好。

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

(摘自[4])

试图分析 mBERT 令人印象深刻的零射击性能,作者表明 mBERT 的令牌嵌入在预训练后排列良好,这意味着不同语言中的相似单词/短语具有相似的嵌入。因此,即使某种语言被排除在微调过程之外,嵌入空间中的这种对齐使得有用的信息能够被提取并用于推断。在微调过程中,对齐性能似乎会下降,但这可以通过简单地冻结早期网络层来解决。

大规模无监督跨语言表征学习[6]

[6]中的作者提出了 XLM-罗伯塔(简称为 XLM-R)模型,这是一个基于罗伯塔的多语言 BERT 模型(即 BERT 的变体)[7]。然而,作者没有建立在公开可用的 mBERT 模型上,而是从头开始建立自己的模型,强调在预训练过程中做出不同的选择可以导致更好的多语言理解下游模型。

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

(摘自[6])

伯特[1]和 XLM [2]接受了维基百科数据的预训练,这些数据是跨多种语言聚合的。[6]中的作者声称,这种预训练数据集限制了模型性能。取而代之的是,他们使用公共抓取库——一个公开的网络抓取数据数据库——构建了一个多语言文本数据语料库。语料库包括来自 100 多种语言的数据,比基于维基百科的数据集大两个数量级;见上文。

类似于 mBERT,XLM-R 模型在这个更大的语料库上被预训练,根据指数平滑的语言概率使用语言采样。然而,作者确实对基础模型和训练方案做了一些改变:

  • 共享令牌词汇表的大小从 110K 增加到 250K。
  • 采用更通用的标记化方法来去除 mBERT 所需的特定于语言的预处理。
  • 执行的预训练量显著增加(以前的模型显然训练不足!).

XLM-R 模型在多语言推理和问题回答任务上都明显优于 mBERT 和 XLM,确立了其作为多语言理解的首选模型的地位,并揭示了在源自普通爬行的较大语料库上进行预训练是非常有益的。同样,低资源任务的性能似乎从使用 XLM-R 中受益最大,但 XLM-R 在高资源语言上的表现也与单语模型有竞争力。

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

(摘自[6])

在消融实验中,XLM-R 使用不同数量的语言进行训练。作者揭示了一种现象,他们称之为多语制的诅咒。如果在保持模型容量/大小不变的情况下增加用于训练模型的语言数量,模型的性能最初会有所提高,但随后随着语言数量变得过大,性能会开始下降。虽然这个问题可以通过简单地增加模型大小来缓解,但它揭示了共同学习的语言的数量是使用这些多语言模型的从业者必须记住的一个考虑因素。

外卖食品

尽管多语言理解似乎是一项艰巨的任务,但最近的深度学习研究表明,当前的语言理解方法可以很好地处理这个问题。特别是,稍加修改的 BERT 版本可以通过多语言语料库进行联合预训练,然后进行微调,以惊人的准确度解决跨语言任务。

通过分析这些模型,已经表明:

  • 单个多语言 BERT 模型可以学习/理解大量(即> 100 种)不同的语言。
  • 多种语言的联合预训练产生了显著的性能优势(特别是对于缺乏大量训练数据的语言)。
  • 以这种方式训练的多语言模型在高资源语言(例如,英语或德语)上仍然具有与单语模型竞争的性能
  • 多语言 BERT 模型可以以零触发的方式推广到新的语言,因为它们跨语言高度一致、共享词汇/嵌入。

先前对多语言理解(以及一般的 NLP)的研究依赖于大量详细的语言理解。大多数任务通常使用复杂的、专门的架构来解决。有了(多语言)BERT,语言理解任务——甚至跨多种语言——可以用一个简单易懂的模型来解决。

**代码。**微调/使用这些模型比你想象的计算成本更低!因此,我再次强调 BERT 模型对任何深度学习实践者的实用价值。如果你有兴趣尝试这些方法中的任何一种,我在这里推荐 XLM-R 链接的代码示例。

**延伸阅读。**虽然我在这篇概述中涵盖了几篇论文,但我在研究过程中发现了许多其他真正有趣的论文。我最喜欢的一些是:

  • Xtreme:用于评估跨语言泛化的大规模多语言多任务基准——包含 40 种语言的多语言、多任务语言理解基准[ 论文 ][ 代码
  • mT5:一个大规模多语言预训练文本到文本转换器——流行的 T5 转换器架构的多语言变体[ 论文 ][ 代码
  • 用于语音识别的无监督跨语言表征学习—多语言语音识别模型[ 论文

结论

非常感谢你阅读这篇文章。如果你喜欢,请在 twitter 上关注我,或者订阅我的深度(学习)焦点时事通讯,在那里我挑选了一个双周一次的深度学习研究主题,提供了对相关背景信息的理解,然后概述了一些关于该主题的热门论文。我是 Cameron R. Wolfe ,ale gion的研究科学家,莱斯大学的博士生,研究深度学习的经验和理论基础。你也可以看看我在 medium 上的其他著述

文献学

[1] Devlin,Jacob 等,“Bert:用于语言理解的深度双向转换器的预训练”arXiv 预印本 arXiv:1810.04805 (2018)。

[2]兰普勒,纪尧姆和亚历克西斯·康诺。"跨语言语言模型预训练."arXiv 预印本 arXiv:1901.07291 (2019)。

[3]利博维克、Jindřich、鲁道夫·罗萨和亚历山大·弗雷泽。“多语伯特的语言中立性如何?."arXiv 预印本 arXiv:1911.03310 (2019)。

[4] Moon,Taesun,等.“用 bert 实现通用语命名实体识别”arXiv 预印本 arXiv:1912.01389 (2019)。

[5] Lample,Guillaume 等,“命名实体识别的神经结构”arXiv 预印本 arXiv:1603.01360 (2016)。

[6] Conneau,Alexis 等人,“无监督的跨语言表征学习的规模。”arXiv 预印本 arXiv:1911.02116 (2019)。

[7]刘,,等.“Roberta:一种稳健优化的 bert 预训练方法”arXiv 预印本 arXiv:1907.11692 (2019)。

[8]潘宁顿、杰弗里、理查德·索赫尔和克里斯托弗·曼宁。"手套:单词表示的全局向量."2014 年自然语言处理经验方法会议录(EMNLP)。2014.

[9] Mikolov,Tomas 等人,“单词和短语的分布式表示及其组合性”神经信息处理系统进展 26 (2013)。

[10] Ammar,Waleed 等人,“大规模多语言单词嵌入”arXiv 预印本 arXiv:1602.01925 (2016)。

[11] Johnson,Melvin 等,“谷歌的多语言神经机器翻译系统:实现零镜头翻译。”计算语言学协会汇刊 5(2017):339–351。

[12] Conneau,Alexis 等人,“XNLI:评估跨语言句子表征”arXiv 预印本 arXiv:1809.05053 (2018)。

映射、过滤、归约-用于功能数据管道设计的高阶函数

原文:https://towardsdatascience.com/map-filter-reduce-higher-order-functions-for-functional-data-pipeline-design-929935222475

深入探讨高阶函数,以及如何使用它们为函数式数据管道设计数据转换

概述

在我上一篇关于“控制流”的函数式编程特性的文章中,我提供了函数组合的概述,并讨论了高阶函数和递归作为“函数迭代”形式的使用。

在本帖中,我们将深入探讨高阶函数,以及它们如何用于设计函数式数据管道。

在此之前,我们先来看看典型的数据管道是什么样子的。

数据处理和数据管道设计模式

数据处理的经典方法是编写一个使用数据管道设计模式的程序。

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

数据管道设计模式(图片来自作者)

在典型的数据管道中,我们从源中读取数据,以某种期望的方式转换数据,并收集输出作为新数据。这就是通常所说的“提取、转换、加载”(ETL)过程。

  • 提取:在数据提取阶段,从源系统中提取数据并验证其正确性。
  • Transform :在数据转换阶段,一系列的函数被应用到提取的数据,以便为装载到目标数据存储做准备。
  • Load :在数据加载阶段,数据被加载到目标数据存储中——它可以是平面文件(比如 CSV 或 Parquet)或数据仓库。

用于数据转换的高阶函数

下面是 S3 桶中从数据库源到平面文件的典型 ETL 过程的简化示意图:

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

ETL 过程的草图(图片由作者提供)

数据提取和数据加载阶段取决于程序外部的源数据和目标数据存储的状态,而数据转换阶段则取决于程序本身内部的输入数据和应用于数据的函数。因此,数据转换可以自然地表达为由一系列函数组成的函数操作,也称为函数组合

对于支持函数作为一级对象的编程语言,函数组合可以用高阶函数的形式来表示。虽然我们可以编写自己的高阶函数,但有一些有用的内置高阶函数通常用于数据转换:

  • map
  • filter
  • reduce

本文的重点是探索这些内置的高阶函数,并讨论如何将它们用于设计功能性数据管道。

map

map函数接受一个函数作为输入,将该函数应用于值集合中的每个元素,并返回一个新的函数输出值集合。

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

map功能示意图(图片由作者提供)

例如,当我们用一个addSmile操作映射一个形状集合时,我们通过将操作应用于形状来“映射”集合中的每个形状。使用addSmile操作映射形状的输出被合并到一个新的形状集合中,并在输入形状中添加了一个微笑。

关于 Python 和 Scala 中的map实现的详细讨论可以在我之前的帖子中找到。

filter

filter函数接受返回布尔值(也称为谓词)的函数作为输入,将该函数应用于值集合中的每个元素,并将从该函数返回true的元素作为新集合返回。

谓词应该接受一个与集合中的元素类型相同的参数,用该元素评估结果,并返回true将元素保留在新集合中或false将其过滤掉。

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

filter功能示意图(图片由作者提供)

例如,当我们将hasFiniteEdges条件应用于形状集合时,我们根据集合中的每个形状是否满足hasFiniteEdges条件来“过滤”它。从hasFiniteEdges函数返回true的形状被合并到一个新的形状集合中,不满足条件的形状从集合中被过滤掉。

当我们查看 Python 内置函数filter的文档时,会发现filter函数接受一个谓词函数和一个 iterable 作为输入参数,并根据谓词函数返回 true [1]的 iterable 的元素构造一个迭代器。

在 Scala 中,包scala.collections中的每个集合类及其子集都包含由 ScalaDoc [2]上的以下函数签名定义的filter方法:

def filter(p: (A) => Boolean): Iterable[A]    // for collection classes
def filter(p: (A) => Boolean): Iterator[A]    // for iterators that access elements of a collection

函数签名的意思是,filter接受一个谓词输入参数p,该参数将类型A的一般输入转换为布尔值,并返回一个新的迭代器,该迭代器由满足谓词p的可迭代集合(类型A)的所有元素组成。

为了使用函数方法从现有的数字集合中创建一个新的偶数集合,可以使用filter函数通过对每个元素应用一个偶数谓词并将满足偶数谓词条件的元素收集到一个新的集合中来过滤掉集合中的奇数。

  • 在 Python 中:
def isEven(x):
    return x % 2 == 0def main(args):
    collection = [1,2,3,4,5]
    evenNums = list(filter(isEven, collection))
    print(evenNums)
  • 在 Scala 中:
object FilterEven { def isEven(x: Int): Int = {
    x % 2 == 0
  } def main(args: Array[String]) {
    val collection = List[1,2,3,4,5]
    val evenNums = collection.filter(isEven)
    println(evenNums)
  }}

在这两个实现中,filter函数接受一个应用于值集合中每个元素的输入谓词,并返回一个包含满足该谓词的元素的新集合。

reduce

reduce函数接受一个组合函数(通常为二元运算)作为输入,将该函数应用于值集合中的连续元素,并返回一个累积结果。

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

reduce功能示意图(图片由作者提供)

例如,当我们将composeAll操作应用于形状集合时,我们通过使用composeAll操作将部分结果和迭代中的形状折叠成单个结果,并将合成结果用作下一次迭代的部分结果,从而将集合中的形状“缩减”成单个结果。在迭代结束时,使用composeAll操作减少形状的输出作为单个结果返回(形状的组合)。

当我们在functools库中查看 Python reduce函数的文档时,会发现reduce函数接受一个带有两个参数和一个 iterable(带有一个可选的初始值,可以在计算中放在 iterable 的项之前)的函数作为输入参数,并从左到右【3】将函数累积应用于 iterable 的项。

在 Scala 中,包scala.collections中的每个集合类及其子集都包含由 ScalaDoc [2]上的以下函数签名定义的reduce方法:

def reduce(B >: A)(op: (B, B) => B): B

函数签名的意思是,reduce接受一个结果类型为B(类型为A的超类型)的二元运算符op,该运算符将集合中的两个元素转换为类型为B的值,并返回在集合中所有元素(类型为A)之间应用该运算符的结果。二元运算符op需要返回存储在集合中的相同数据类型A或类型B的超类型,以便reduce方法可以对操作的结果和集合中正在应用操作的下一个元素执行后续操作。

仔细观察reduce方法的 ScalaDoc,会发现以下操作条件:

  1. 二元运算符必须是关联的
  2. 对元素执行操作的顺序可能是不确定的

二元运算符的关联属性是一个必要条件,以确保在归约过程中执行运算的顺序不会改变不同运行的结果——只要被运算元素的顺序不变。

虽然关联属性对于从归约函数返回确定性结果是必要的(引用透明的必要条件),但它不是充分条件,因为在非交换二元运算符的情况下,如减法和除法,运算的顺序会产生不同的结果。

如果我们想要指定对集合的元素执行操作的顺序该怎么办?

在 Scala 中,我们在集合类中有reduceLeftreduceRight方法,它们分别以从左到右和从右到左的顺序对集合中的所有元素累积应用二元运算符。reduceLeftreduceRight方法由 ScalaDoc [2]上的以下函数签名定义:

def reduceLeft[B >: A](op: (B, A) => B): B
def reduceRight[B >: A](op: (A, B) => B): B

reduce的函数签名相比,reduceLeftreduceRight方法的函数签名的主要区别在于:

  1. 结果类型为B(类型为A的超类型)的二元运算符op获取部分结果(类型为B)和集合中的下一个元素**(类型为** **A** ) ,并将它们简化为类型为B的值。
  2. 二元运算中部分结果和集合中元素的顺序表示运算符沿着集合应用的方向。

为了使用函数方法获得数字集合的累积和,可使用reduce函数,通过在集合的连续数字之间应用加法运算符并执行运算,将数字集合缩减为单个值。

  • 在 Python 中:
def main(args):
    from functools import reduce
    collection = [1,3,5,2,4]
    totalSum = reduce(lambda x,y: x + y, collection)
    print(totalSum)
  • 在 Scala 中:
object SumNumbers { def main(args: Array[String]) {
    val collection = List[1,3,5,2,4]
    val totalSum = collection.reduce((x, y) => x + y)            
    println(totalSum)
  }} 

在这两个实现中,reduce函数接受一个二元运算符,该运算符应用于值集合中的连续元素之间,并返回一个结果。

使用二进制加法运算符对数字集合进行从左到右的归约(Scala 中的reduceLeft方法)的计算方式如下:

[1,3,5,2,4].reduceLeft((x, y) => x + y) // initialize var acc = null
(((1 + 3) + 5) + 2) + 4 // take first value, acc = 1
((4 + 5) + 2) + 4 // acc = 1 + 3 = 5
(9 + 2) + 4 // acc = 4 + 5 = 9
11 + 4 // acc = 9 + 2 = 11
15 // acc = 11 + 4 = 15 returned upon end of collection

类似地,从右到左归约(Scala 中的reduceRight方法)按以下方式计算:

[1,3,5,2,4].reduceRight((x, y) => x + y)// initialize var acc = null
1 + (3 + (5 + (2 + 4))) // take first value from right, acc = 4
1 + (3 + (5 + 6)) // acc = 4 + 2 = 6
1 + (3 + 11))// acc = 6 + 5 = 11
1 + 14 // acc = 11 + 3 = 14
15 // acc = 14 + 1 = 15 returned upon end of collection

由于加法运算符是关联和交换的,运算符应用的顺序不会影响结果,因此reduce方法可以安全地用于 Scala 实现中。

注意递归模式如何在归约过程中计算加法运算?reduce函数是函数式编程中fold的一个特例,指的是一族高阶函数,将递归数据结构中的元素递归组合成一个结果。

内置的收集方法sumproductminmax是基于reduce函数[4]及其对应的二元运算符定义的:

  • 总和:+
  • 产品:*
  • 最小:math.Ordering.min
  • 麦克斯:math.Ordering.max

虽然reduce函数有助于使用关联二元运算符将值集合缩减为单个值,但使用这些内置集合方法代替reduce可以提高可读性,而无需为数据管道设计中的预期用例重新发明轮子。

把它们放在一起

总而言之,内置高阶函数在构建数据管道内的数据转换序列时非常有用:

  1. map用于将函数应用于集合中的所有元素
  2. filter用于根据布尔条件选择集合中的元素
  3. reduce通过在连续元素之间使用一个关联运算符,将元素集合简化为一个结果

mapfilter返回一个可以用后续高阶函数处理的新集合时,reduce返回一个累积值。因此,在设计具有功能组合的功能数据管道时,通常将reduce方法及其衍生方法作为最终转换步骤来实施。

下一步是什么

在本帖中,我们将了解:

  1. 数据管道设计模式
  2. 用于数据转换的高阶函数:映射、过滤、归约

在我们探索高阶函数的 map-filter-reduce 三元组时,我们简要地提到了与函数式编程相关的两个有趣的概念:

  1. reduce作为fold的特例
  2. 集合类作为带有内置方法的数据容器

在本系列接下来的几篇文章中,我将详细阐述这些概念及其在设计函数式数据管道中的应用。

想要更多关于我作为数据专业人员的学习历程的幕后文章吗?查看我的网站:https://ongchinhwee.me !

参考

[1] 内置函数— Python 3.10.2 文档

[2] Scala 标准库 2 . 13 . 8—Scala . collections . iterable

[3] functools —可调用对象上的高阶函数和操作— Python 3.10.2 文档

[4]trait iterable once ops—Scala/iterable once . Scala at v 2 . 13 . 8

原载于 2022 年 2 月 5 日https://ongchinhwee . me

地图切片:定位区域、嵌套/父切片、坐标和边界框

原文:https://towardsdatascience.com/map-tiles-locating-areas-nested-parent-tiles-coordinates-and-bounding-boxes-e54de570d0bd

使用位置或缩放级别来确定要使用的图块,并以编程方式计算它们的坐标。

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

UnsplashDeva Darshan 拍摄的照片

在可视化地理信息时,数据通常被分割成段——跨越整个地球并根据缩放级别递减的块。这意味着作为用户,我们可以只加载我们感兴趣的信息。

然而,问题在于希望从 tileset 中提取数据,而不必每次都手动重新定位地图。为此,我们有两种方法:

  • 使用缩放级别和地理坐标查找单幅图块
  • 找到一个缩放级别上的图块,并从另一个缩放级别定位任何相应的图块。
  • 最后,我们可以颠倒整个过程,以获得瓷砖坐标,因此包围盒

基于坐标定位图块

查找相关图块的最简单方法(除了手动操作加载的地图)是从感兴趣的地方开始,决定我们想要的细节,并直接搜索它。

选择缩放级别

第一步是决定我们在地图上需要多少细节。OpenStreetMap 的下表给出了每个级别的规模。对于此示例,我将查看纽约,因此将基于代表列的“区域示例”选择缩放级别 11。

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

显示不同缩放级别及其相对比例的表格。来源:https://wiki.openstreetmap.org/wiki/Zoom_levels

从坐标计算图块

接下来,我们需要获得我们感兴趣的城市的纬度和经度。对于纽约,这是:40.7128° N, 74.0060° W

我们现在可以使用上面的下列函数来确定我们需要什么样的图块,如下等式:

import mpmath as mp **def** get_tile(**lat_deg,lon_deg,zoom**): *''' A function to get the relevant tile from lat,lon,zoom)'''*

   lat_rad = mp.radians(lat_deg)
   n = 2 ** zoom

   xtile = n * ((lon_deg + 180) / 360)
   ytile = n * (1 - (mp.log(mp.tan(lat_rad) + mp.sec(lat_rad)) / mp.pi)) / 2 **return** 'tile %d/%d/%d '%(zoom,xtile,ytile)

注意:由于我们坐标系的性质,由于这是向西 74 度,我们需要在计算时将其输入为负数。 *40.7128,* ***—*** *74.0060*

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

返回的卫星视图左(© Mapbox, © OpenStreetMap)和缩小的谷歌地图(地图数据:2022 谷歌)在右边。

get_tile(*40.7128,* ***—*** *74.0060 , 11)* 与 Mapbox 卫星 tileset 一起使用,我们得到了纽约最左边的图像tile: 11/602/770。这可以与谷歌地图进行比较,以确保我们有正确的位置。

从另一缩放级别查找嵌套或父平铺

我们可能面临的另一个问题是希望同一区域的分辨率更高或更低。在这种情况下,我们可能只有一个单独的位置,而没有产生它所需的坐标。我们可以简单地使用“n”来调整缩放级别,而不是逆向工程上述等式:

def tile_translator(z,x,y,newzoom):*'''Find the linking (left top) most tile from another zoom level'''* n = 2 ** z
   x /= n
   y /= n n2 = 2 ** newzoom
   x *= n2
   y *= n2 return '%d/%d/%d'%(newzoom,x,y)

在英国东北部(10/510/330)随机取一块瓷砖,我们可以根据newzoom参数的值生成它的父元素和子元素。

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

tile_translator 的输出(10,510,330,9). — via © Mapbox, © OpenStreetMap`

在需要右边单元格的坐标的情况下,我们可以将 1 加到x (511)并将+1加到y (331)以得到向下的单元格。如果探索子块,这个过程也是有用的(见下文)。

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

tile_translator(10,510,330,11) — via © Mapbox, © OpenStreetMap`的输出

将所有这些放在一起会产生以下结果:

def get_children(z,x,y):
   ''' Return the children of a tile '''

   tile = list(tile_translator(z,x,y,z+1).split('/').map(float)) return [[tile[0],tile[1]+i,tile[2]+j] for i in [0,1] for j in [0,1]]

查找图块边界

最后,我们可以颠倒这个过程来获得每个瓷砖的角点:

def tile2lon(z,x,y) :
   return x / 2**z * 360 - 180;def tile2lat(z,x,y) :
   n = mp.pi - 2 * mp.pi * y / 2**z;
   return float((180 / mp.pi) * (mp.atan(0.5 * (mp.exp(n) - mp.exp(-n)))))

将数字xy加 1,我们现在可以计算包围我们的图块的边界框:

def tile_bbox(z,x,y):
'''Return the bounding box of a tile'''

   w = tile2lon(z,x,y)
   s = tile2lat(z,x,y) 
   e = tile2lon(z,x+1,y)
   n = tile2lat(z,x,y+1) return [w,s,e,n]

结论

我们已经学习了如何使用经度和纬度以编程方式定位图块,以及在另一个缩放级别上找到相应的图块。其用途包括提取特定领域的信息,然后用于机器学习(文章即将发表)。

资源

代码的完整副本,以及一些进一步的阅读材料。

密码

关于 Tilesets 的更多信息

https://docs.microsoft.com/en-us/bingmaps/articles/bing-maps-tile-system?redirectedfrom=MSDN https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames

“MAPIE”准确地解释了你希望别人如何向你解释

原文:https://towardsdatascience.com/mapie-explained-exactly-how-you-wished-someone-explained-to-you-78fb8ce81ff3

一个 Python 库,可以将任何模型的预测转化为置信区间

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

[图片由作者提供]

当您为数值目标变量构建预测模型时,Scikit-learn、XGBoost、LightGBM、CatBoost、Keras 等经典 Python 库会生成点预测。不幸的是,

点预测总是错的。

事实上,假设您有一个预测旧金山房屋销售价格的模型。该模型已经预测出一栋房子将以 746,632.15 美元的价格出售。这是实际价格的可能性有多大,精确到每一分钱?实际上,零。

知道房子将以 70 万美元到 80 万美元之间的价格出售,有 95%的把握,这要有用得多(也安全得多)。其中 95%的置信度大致意味着——如果我们可以观察所有可能的宇宙——在 95%的情况下,售价实际上在 70 万美元到 80 万美元之间。这被称为区间预测

那么,我们如何在 Python 中从点预测得到区间预测呢?这就是 MAPIE 发挥作用的地方。

什么是 MAPIE,如何使用它

MAPIE 是一个用于获取区间预测的 Python 库。名字代表“模型不可知预测区间估计器”,其中重要的部分是“模型不可知”。事实上,与分位数回归或贝叶斯推断等更传统的方法相反, MAPIE 允许您保留您最喜欢的高度精确的模型

所以,我们来看看怎么用。为了在一些真实数据上测试 MAPIE,我将使用来自 StatLib 的加州住房数据集,该数据集可以在 Scikit-learn 中直接获得(在 BSD 许可下)。

from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split**# Get California housing dataset, and split it in 3 sets** X, y = fetch_california_housing(return_X_y=True, as_frame=True)X_train_and_cal, X_test, y_train_and_cal, y_test =
  train_test_split(X, y, test_size=1/3)X_train, X_cal, y_train, y_cal = train_test_split(
  X_train_and_cal, y_train_and_cal, test_size=1/2)

重要的是,我们有三组数据:

  • 训练数据:预测模型学习的数据。
  • 校准数据:MAPIE 校准间隔的数据。
  • 测试数据:我们用来评估区间好坏的数据。

在我们的例子中,每个集合由 6,880 个观察值和 8 个特征组成。

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

数据帧的形状。[图片由作者提供]

目标变量是加州各区的房价中值,以几十万美元表示。

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

测试集的前 5 个房屋的值。[图片由作者提供]

所以第一栋房子值 35.5 万美元,第二栋房子值 7.07 万美元,以此类推。

现在我们已经准备好了数据,让我们对训练数据拟合预测模型(我将使用 Scikit-learn 的随机森林回归器),对校准数据拟合 MAPIE 回归器。

from sklearn.ensemble import RandomForestRegressor
from mapie.regression import MapieRegressor**# Fit model on training data** model = RandomForestRegressor().fit(X_train, y_train)**# Fit MAPIE on calibration data
# Important: calibration data must be different from training data!**
mapie = MapieRegressor(estimator=model, cv="prefit"
  ).fit(X_cal, y_cal)

在这一点上,我们可以最终使用 MAPIE 回归器的“预测”方法,它为观察值产生预测间隔(为了方便起见,我将它们存储到 Pandas 数据帧中):

import pandas as pd**# Get interval predictions on test data, with alpha=5%** y_test_pred_interval = pd.DataFrame(mapie.predict(X_test, alpha=.05)[1].reshape(-1,2), index=X_test.index, columns=["left", "right"])

每个区间由区间的左端和右端定义。例如,这些是测试集的前 5 个观察值的预测间隔:

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

测试集的前 5 次观察的预测间隔。[图片由作者提供]

“阿尔法”的含义

如果您查看最后一段代码,您会注意到一个名为alpha的参数。如何解读这个参数?alpha公差。它回答了这个问题:

“我们愿意接受多少‘错误’?”

我所说的“错误”是指超出预测区间的观察结果。例如,如果alpha设置为 10%,这意味着我们预计不会有超过 10%的观测值超出 MAPIE 预测的区间。

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

alpha = 10%时的输出示例:10 次观察中有 1 次超出其预测区间。[图片由作者提供]

我们如何确保 MAPIE 预测的区间实际上与容差相匹配?这就是测试集存在的目的。统计y_test的观测值落在预测区间之外的次数并与alpha进行比较就足够了;

out_of_interval = ((y_test < y_test_pred_interval["left"]) | 
 (y_test > y_test_pred_interval["right"])
).sum() / len(y_test)

让我们对不同的alpha值重复此过程。这是结果:

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

将 alpha 与超出预测区间的观察值百分比进行比较。[图片由作者提供]

区间外观察值的百分比实际上非常接近alpha的相应值。这可能感觉像是魔术,但却出奇的简单!在下一段中,我将向您展示这是如何工作的。

引擎盖下的 MAPIE

MAPIE 背后的想法是从模型对一组数据(称为校准数据)产生的错误中学习。一旦我们知道我们应该期望什么样的误差(对于给定的容差),将它加在点预测的两侧就足够了,以获得一个区间预测。

MAPIE 基本算法包括 6 个步骤:

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

MAPIE 算法。[图片由作者提供]

这些步骤是:

  1. 根据训练数据拟合模型。
  2. 对校准数据进行预测。
  3. 计算模型对校准数据产生的绝对误差。
  4. 从前一点得到的绝对误差分布中得到 1- alpha分位数。
  5. 对测试数据进行预测。
  6. 通过将点 4 获得的分位数与点 5 获得的预测值相减(相加)来计算区间的左(右)端。

我们可以用几行 Python 代码轻松再现该算法:

**# 1\. Fit model on training data** model = RandomForestRegressor().fit(X_train, y_train)**# 2\. Make prediction on calibration data** y_cal_pred = model.predict(X_cal)**# 3\. Compute absolute errors made by the model on calibration data** y_cal_error = np.abs(y_cal - y_cal_pred)**# 4\. Get 1-alpha quantile from the distribution of absolute errors
#    Note: this is a single number** quantile = y_cal_error.quantile(q=.95, interpolation='higher')**# 5\. Make prediction on test data** y_test_pred = model.predict(X_test)**# 6\. Compute left (right) end of the interval by
#    subtracting (adding) the quantile to the predictions** y_test_interval_pred_left = y_test_pred - quantile
y_test_interval_pred_right = y_test_pred + quantile

这是y_cal_error的直方图:

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

校准误差直方图和α= 5%的分位数。[图片由作者提供]

alpha为 5%时,quantile等于 1.18。这意味着随机森林回归器产生的误差在 5%的情况下高于 1.18 亿美元(在 95%的情况下低于 1.18 亿美元)。此时,通过简单地将随机森林所做的预测加上和减去 118k $,就可以获得区间预测:

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

MAPIE 中点预测与区间预测的关系。[图片由作者提供]

就是这样。如果你已经理解了这段代码,那么恭喜你:你已经掌握了 MAPIE 背后的逻辑!

这个库还包含了这个基本算法的一些细微变化,我们将在下一段中看到。

其他模式

到目前为止,我们一直在“prefit”模式(cv="prefit")下使用 MAPIE。“Prefit”意味着模型(在我们的例子中是一个随机森林)是预先拟合的。但是,根据我们选择的参数,还有其他的可能性。这是MapieRegressor的大致结构:

MapieRegressor(estimator=model, cv=cv, method=method)

因此,决定 MAPIE 行为的参数是cvmethod。让我们分别来看:

  • cv:交叉验证的折叠次数(除非等于“prefit”,此时不进行交叉验证);
  • method:“幼稚”、“贱”、“加”、“最大化”之一。该参数仅在cv不同于“前缀”时使用。“naive”类似于“prefit”,但校准数据与训练数据相吻合。“base”类似于“prefit”,但是预测误差是从交叉验证过程中获得的。“plus”类似于 base,但每个区间都是测试预测的分位数加上验证残差。“最小最大值”类似于“加号”,但是使用了来自交叉验证模型的最小和最大预测值。

这里就不深究各种方法的细节了。我们将在一些真实数据集上尝试它们,看看它们的表现如何。

我们用来评估 MAPIE 输出质量的标准是与 **alpha**的正距离。的确,既然alpha被定义为我们愿意接受的错误百分比,那么问题就出在% out of interval大于alpha的时候。

因此,我们感兴趣的量是:

df["breach"] = (df["% out of interval"] — df["alpha"]).clip(lower=0)

在上面的示例中,这将是:

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

将 alpha 与超出区间的观察值百分比进行比较。[图片由作者提供]

因此, **breach** 的简单平均值是 MAPIE 预测的间隔有多差的指标:该数字越高,MAPIE 性能越差。

现在,让我们看看这种方法在不同的数据集上是如何变化的。除了上面引用的加州住房数据集,我还使用了来自 Pycaret 的“帕金森”、“钻石”和“交通”数据集,这是在麻省理工学院许可下。

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

各种数据集的 MAPIE 与 alpha 的平均正偏差(越低越好)。左上:帕金森数据集(Pycaret)。右上:加州数据集(Scikit-learn)。左下角:钻石数据集(Pycaret)。右下角:交通数据集(Pycaret)[图片由作者提供]

请注意,当你使用cv="prefit"时,不使用method,这就是为什么列prefit总是不变的原因。

简而言之,你要一直避开 **method="naive"** ,因为它的表现一直不好。关于剩下的选项,method="base"method="plus"method="minmax"工作得很好,但是你应该考虑到它们是基于交叉验证的,所以如果你处理真正的大数据,它们需要更多的时间。

总的来说,cv="prefit"的性能几乎和其他选项一样好,而且速度更快。此外,它在现实生活中更方便,在现实生活中,您已经有一个拟合的模型,并希望从中“提取”区间预测。

MAPIE 的弱点

我们都知道,直觉上,有些预测比其他的更难。这应该反映在间隔的宽度上。有理由预期,预测越不确定,区间越大

但是 MAPIE,至少是它的基础版本,并不满足这个属性。事实上,为了获得区间,我们在预测中加入和减去了校准误差的分位数。但是分位数是一个数字,因此所有观测值的区间宽度是相同的。

因此,基本上,这就像你只是估计一个与预测模型相关的区间,然后将它复制粘贴到所有的观察值上

当然,使用method="plus"method="minmax",输出间隔将不会有相同的确切宽度。但这只是一种“扰动”,最终的区间不会有实质性的不同。事实上,让我们来看看加州住房数据集的预测区间宽度的分布:

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

加州住房数据集上 method="plus "(左)和 method="minmax "(右)时预测区间宽度的分布。[图片由作者提供]

正如你所看到的,间隔的宽度没有太大的变化。采取“加”的方法(左):至少 75%的区间在 220k $和 223k $宽之间:它们的宽度几乎相同。

外卖食品

MAPIE 是一个 Python 库,用于将模型做出的点预测转化为区间预测。它是模型不可知的,因此您可以保留您最喜欢的 ML 模型,并且仍然具有强大的统计保证,即预测区间符合您设置的容差。

然而,你必须意识到,从根本上来说,间隔的宽度都是一样的。因此,与其为每个观察值估计一个时间间隔,不如只估计一个时间间隔,然后将该时间间隔应用于所有观察值。

如果你想知道如何预测与每次观察相关的风险的“定制”区间,你可以阅读我下面的文章“共形分位数回归”:

感谢您的阅读!我希望你喜欢这篇文章。如果你愿意, 在 Linkedin 上加我

绘制新型冠状病毒污水覆盖率图

原文:https://towardsdatascience.com/mapping-sars-cov-2-wastewater-coverage-48bff31e4e92

数据工程创建美国县水测试繁荣图。包括 pandas set()操作。

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

作者图片

背景

废水(下水道)数据可用作新冠肺炎病例的早期预警。这是一项开发良好的技术,可以对废水中的新型冠状病毒 RNA 片段进行计数,将计数与同一区域先前的值进行比较,以检测增加/减少,甚至可以对 RNA 进行测序,以确定病毒变体。

美国两套最全面的废水追踪数据由 CDC 国家废水监测系统(NWSS)Biobot Analytics 汇编和保存。(在美国还有其他更本地化的数据源,如州或大学。)

但是看着原始的 CDC 和 Biobot 数据集可能会令人沮丧。它们具有不同的布局,使用联邦信息处理标准(FIPS)县代码而不是可读的名称,并且没有按照位置的逻辑顺序排列。很难看出它们是否包含您想要查找的县,也很难判断特定的县是在一个文件中还是在两个文件中(或者都不在)。而且它们一点也不直观:美国的哪些地区在数据中得到了很好的体现,哪些地区被遗漏了?

我最近完成了一个数据工程项目来回答这些问题。目标是:

  • 在每个数据集中创建按字母顺序排列的县列表。
  • 创建按字母顺序排列的县列表,这些县与两个源重叠并跨越两个源-交叉点和联合点。
  • 制作美国的互动地图,显示每个县的废水数据集。使用颜色编码快速查看数据稀疏的区域。

由于数据集和县覆盖范围经常变化,我将每周重新运行此代码并更新地图。

数据工程

这个项目的 Python/pandas 代码直观上很简单:删除除 FIPS 县代码之外的所有关于水测试的信息;添加可读的州县名称;使用 Python set()操作创建县列表;并输出一个包含该信息的文件,该文件将成为地图的输入。当然,大多数应该简单的编程项目都有一两个缺点,这一个也不例外。

为了删除我们不关心的许多列数据,pandas 提供了两个选项:列出要删除的字段或要保留的字段。在这种情况下,后者要容易得多。

NwssDF = NwssDF[["county_fips"]]  # don't need any other columnsBiobotDF = BiobotDF[["fipscode"]]  # don't need any other columns

NWSS 数据集有一个棘手的问题。county_fips 字段有时包含不止一个 fips 代码,例如"['08013', '08123']"。在关系数据库术语中,这违反了第一范式。就我们的目的而言,这种格式使得不可能将文件与任何其他由 FIPS 代码键入的数据相结合。

修复方法是分解这些行,使每一行只有一个 FIPS 代码,然后清除周围的字符。

NwssDF["county_fips"] = NwssDF["county_fips"].str.split(",")

NwssDF = NwssDF.explode("county_fips") NwssDF["county_fips"] = NwssDF["county_fips"].str.strip("[]' ") 

Biobot 数据集还包含一个问题,即它抑制了 FIPS 代码中的前导零。所以数据中有9001为费尔菲尔德 CT,而不是正确的09001。Biobot 已经承诺解决这个问题,但在此之前,这个代码解决了这个问题。

BiobotDF.loc[BiobotDF["fipscode"].str.len() == 4, "fipscode"] = \
"0" + BiobotDF["fipscode"] 

使用 FIPS 代码连接/合并包含可读字符串STATE | COUNTY | FIPS的字段,这在县列表和地图上非常有用。如何做到这一点的细节在源代码和我最近关于 FIPS 代码和县名的文章中。

使用 Python set()操作获取各种县集:

all_counties = set(AllCountiesDF["STATE_COUNTY_FIPS"])
biobot_counties = set(BiobotDF["STATE_COUNTY_FIPS"])
nwss_counties = set(NwssDF["STATE_COUNTY_FIPS"])biobot_nwss_union = biobot_counties.union(nwss_counties)biobot_nwss_intersection = \ biobot_counties.intersection(nwss_counties)biobot_only = biobot_counties.difference(nwss_counties)nwss_only = nwss_counties.difference(biobot_counties)missing_counties = all_counties.difference(biobot_nwss_union)

使用 sorted()函数将集合写入输出文件,该函数将集合转换为按字母顺序排列的列表,并使用*运算符分隔列表以进行打印。比如:

with open(BIOBOT_LIST_FILE, 'w') as f:
    print(*sorted(biobot_counties), file=f, sep="\n")

从而产生可读的县文件: NWSS生物机器人仅 NWSS仅生物机器人交集联合缺失(不在 NWSS 或生物机器人)。

最后,创建一个数据帧和输出文件,它将被输入到地图

MapDF = AllCountiesDF # copy of DF with all US countiesMapDF["WBE_WHO"] = "none" # default for "who has wastewater data"MapDF.loc[MapDF["STATE_COUNTY_FIPS"].isin(biobot_only), 
"WBE_WHO"] = "biobot"  # Biobot onlyMapDF.loc[MapDF["STATE_COUNTY_FIPS"].isin(nwss_only), 
"WBE_WHO"] = "nwss"  # NWSS onlyMapDF.loc[MapDF["STATE_COUNTY_FIPS"].isin(biobot_nwss_intersection), 
"WBE_WHO"] = "biobot-nwss"  # bothMapDF = MapDF.rename(columns={"CountyFIPS":"FIPS"}) 
# to match Flourish naming

MapDF.to_csv(MAP_FILE, encoding='utf-8', sep='\t', index=False)

制作地图

制作地图的大部分工作是由 fluore 软件完成的,该软件提供了一个非编程接口来创建可视化效果,包括地图。Flourish 已经有了美国各县的几何图形,用颜色代码填充区域的简单设置,以及当用户悬停在某个区域上时自动弹出的窗口。

下面是如何创建我制作的同样的地图,你可以随意修改…

  1. https://fluid . studio创建一个帐户。
  2. 创建新的可视化效果。向下滚动到美国各县,并选择它作为您的起点。在左上角给你的地图命名。
  3. 转到预览/点层,并禁用它。如果需要,您也可以删除数据/点处的所有相关数据。
  4. 转到数据/区域,删除名称、标签、值和组的现有列条目。您将为这些分配新的值。
  5. 在数据/区域中,删除除几何图形和 FIPS 之外的所有列。现在,您的地图已缩减为仅包含县轮廓,可以接收废水数据了。
  6. 将上传选项更改为上传数据并合并。上传/合并您在上面创建(或复制)的地图数据文件。确保现有数据和传入数据的合并列都是 FIPS。
  7. 在数据/区域中,设置几何=几何列(可能是 A);name = STATE _ COUNTY _ FIPS 列(大概是 C);和值= the 世卫组织列(可能是 D)。
  8. 在预览/区域中,设置比例类型=分类。选择调色板。(我使用了带有十六进制颜色值的自定义覆盖,但这不是必需的。)
  9. 在预览/页脚中,设置数据源名称和 URL。
  10. 在“导出和发布”中,您可以将地图发布到 fluorescent 服务器上并获取其公共 URL,和/或下载 PNG 或 JPG 格式的图像文件。

未来的工作

这项工作的两个有价值的扩展是:

  • 在美国添加更多的县。看到整个国家的地图都充满了废水追踪,这将是一件很棒的事情,水测试结果将成为未来新冠肺炎病例的可靠预测器,以及它们将在哪里发生。疾控中心正在积极开展这项工作,覆盖的县的数量逐月增加。
  • 添加更多来自全球的国家。有两个项目(引用如下)正在跟踪国际废水测试,它们覆盖的国家数量正在稳步增加。然而,这项工作的一个重要组成部分是为所有国际测试结果创建一个单一、统一的数据集,以便于分析和可视化。

欲了解更多信息

https://biobot.io/data/(生物机器人数据)

https://Data . CDC . gov/Public-Health-supervision/NWSS-Public-新型冠状病毒-废水-数据/2ew6-ywp6 (疾控中心 NWSS 数据)

https://ucmerced . maps . ArcGIS . com/apps/dashboards/c 778145 ea 5 bb 4 daeb 58d 31 afee 389082和 https://sphere.waterpathogens.org/map(国际废水地图)

https://twitter.com/COVIDPoops19(关于加州大学默塞德分校废水的热门推特消息)

https://help.flourish.studio/category/10-flourish-basics(蓬勃发展入门)

用 Python 绘制世界飞行路线

原文:https://towardsdatascience.com/mapping-the-worlds-flight-paths-with-python-232b9f7271e5

用 Python 可视化连接世界各大洲的飞行路线

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

图片作者。

由于 covid 航空旅行在过去两年中明显减少,但它正显示出恢复昔日辉煌的迹象。2019 年,据估计,飞机运送的乘客总数达到 45 亿,创下历史新高。尽管如此,这些飞机的航线可能与大多数人的想法相去甚远,但想象和了解热门航线在哪里、涉及哪些国家以及国际旅游枢纽在哪里是很有趣的。在本教程中,我将解释如何使用开源数据和 Python 生成显示世界航线的醒目地图。这是一个数据操作和数据可视化的练习,你应该对像PandasGeoPandasMatplotlibShapely这样的库有更好的理解。

数据探索

数据来自于 openflights 数据库,并且可以在数据库内容许可下获得。简而言之,这意味着欢迎你按照自己的意愿使用这些数据,当且仅当你都承认来源并以免费许可的方式许可任何可供公众使用的衍生作品。

这种观想是一种数据操作的练习。openflights 数据库(这个数据库可能有点牵强)在一个文件中提供了一个机场列表,在另一个文件中提供了每个机场之间的航线数量明细。因此,数据集不包含每条路线的具体坐标,这是我们需要自己推导的。在一个理想的世界中,我们将拥有由一年中飞行的每架飞机的位置更新组成的飞行数据,并且我们可以构建该数据的 2D 直方图来展示飞行路径。不幸的是,这个数据很难得到,所以我们不得不凑合着用一个机场列表和每个机场之间的航线数量。我们的目标是创建一个描述每条路线的线串地理数据框架。我们据此做出的假设是,飞机直接从一个机场飞到另一个机场。

第一个数据集是机场数据。该数据包含机场及其位置的列表以及一些其他信息。总共有 7608 个独特的机场。重要的是要注意机场iata,它是每个机场的唯一标识符,以后将用于在路线中链接机场。

可以将数据绘制成散点图,以显示世界上机场的位置,或者至少是包含在该数据集中的机场的位置。像往常一样,在全球范围内,这张地图很大程度上只是成为了人口密度的一个代理,但看到世界机场的分布仍然很有趣。

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

根据 openflights 数据库的世界机场位置。图片作者。

第二个数据集是包含路由列表的 csv。这些航线采用iata对的形式,连接源机场和目的地机场。

数据操作

我们想要操作我们的数据,以便我们有一个LinestringsDataFrame来连接每条路线的源机场和目的地机场。我们将采用的为每条路线创建LineStrings的方法如下。

  1. 创建一个重复的机场DataFrame,将一个标记为来源,一个标记为目的地。
  2. 使用路线来源iata代码将来源DataFrame与路线合并。
  3. 使用路线目的地iata代码将目的地DataFrame与路线合并。
  4. 使用现在合并到路线DataFrame中的源机场和目的地机场的纬度和经度值创建一个代表该路线的LineString

下面我们复制了最初的机场DataFrame,并给其中一个机场的列标上了_source_destination

这两个DataFrames然后与路线DataFrame合并,以给出具有目的地和源机场的纬度/经度值的DataFrame。注意下面显示的列,每条路线有四列,lat_sourcelong_sourcelat_destinationlong_destination

然后使用shapely.geometry.LineString方法,用这些值为每条路线生成一个带有LineStringsGeoDataFrame。这需要一个纬度和经度对的列表,并创建一条连接这些点的线。

数据可视化

这些数据现在可以绘制成航线图。不幸的是,不可能简单地按原样绘制数据,因为在绘制线条时需要考虑地球的曲率。下面的地图显示了每个机场之间的直线,这是不正确的。

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

不考虑地球曲率的世界飞行路线。图片作者。

Cartopy可用于操纵线条的绘制方式。transform=ccrs.Geodetic()方法转换LineStrings来解释地球的曲率。我还将投影更改为罗宾逊投影,因为这是绘制全球数据集的更现实的方法之一,说明了地球不是平的这一事实。我还把alpha的值降低到 0.1,让它看起来更清晰一点。

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

瞧。世界飞行路线。图片作者。

结论

我们有它,一个美丽的地图显示了如何产生引人注目的数据可视化显示世界航线。这是计划展示如何使用 Python 使地理空间数据看起来令人惊叹的许多文章中的第一篇,请订阅以便您不会错过它们。我也喜欢反馈,所以请让我知道你会如何做不同或建议改变,使它看起来更棒。我每周都会在我的推特账户上发布数据可视化,看看地理空间数据可视化是不是你的菜【https://twitter.com/PythonMaps

medium 提供的额外收入确实有助于这个项目继续进行,所以如果你是一个粉丝,想取消你的帐户,然后用我的推荐重新注册,那就太好了。https://pythonmaps.medium.com/membership

描绘你最喜欢的高端连锁杂货店

原文:https://towardsdatascience.com/mapping-your-favorite-high-end-grocery-chains-5fe3d234cfd4

全食超市 vs. Trader Joes:他们的选址策略有多大不同?

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

布里塔尼·伯恩斯在 Unsplash 拍摄的照片

多年来,我在 Trader Joes 购物,喜欢他们低成本、自有品牌的销售方式。我不想要 14 种不同大小、价格和成本的花生酱。我想要一种成分干净的。交易者 Joes 比周围任何人提供的都好。

我也“避开”全食超市,因为它是不适合我的高端、昂贵的连锁店。在我看来,尽管这两家商店在很多方面很相似,但它们服务于两种不同的受众。然后我查看了数据,注意到他们选择商店的地点有显著的相似之处。事实上,他们的“典型”商店邮政编码几乎没有明显的区别。请亲自查看下面的数据。

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

商店邮政编码的中值。右手边是全国基准。作者图片

即使我知道这是一个相似的观众,我没有意识到这是相似的。看看这两家商店的人口、收入和年龄有多接近,以及它们与全国基准相比如何。

那么,知道了以上,数据能告诉我们这两个品牌的位置是什么呢?更重要的是,数据不能告诉我们什么,我们在哪里可以依靠我们的知识和直觉得出比数据本身更好的结论?

想自己对比数据? 查看本交互可视化

数据告诉我们的是

数据告诉我们,这两个品牌都位于人口和收入高的城市和郊区——这并不是一个惊人的见解或意外。让我们更仔细地看看典型的邮政编码人口统计。

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

典型(中值)邮政编码概况;图片作者。

一个典型的邮政编码地区的人口大约是全国基准的 10 倍。周围地区的人口(距邮政编码中心约 10 英里)几乎是基准的 30 倍,人口密度也比基准高出许多倍。这表明这些地点位于人口稠密的城市地区及其周围。典型的家庭收入比国家基准高出 35%——这也不足为奇。

经济活动指数是一项定制措施,旨在了解通常会吸引客流量的区域中其他企业的存在(如零售机构、健身房、餐馆等)。).接近 10 的数字表明一个地区有更多的经济活动,而接近 0 的数字表明该地区有更少的消费企业(想想一个更农村或住宅区)。两家公司都位于经济高度活跃的地区。这符合我(有限的)经验——它们通常位于购物中心或繁华的商业区。

“白领”工作(专业、管理、科学等)的就业百分比。)是全国基准的两倍多,这可能也与收入有关。典型年龄符合国家基准。

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

典型的家庭规模;作者图片

在这些企业经营的邮政编码区,大约有四分之一的家庭有孩子,两者的平均家庭规模都在 2.5 左右。与全国 28%的有孩子家庭(每户 2.7 人)相比,这些数字略低于平均水平。虽然范围很广,但我们可以说它们的位置稍微有利于没有孩子或只有一个孩子的两人家庭。

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

逐代人口;作者图片

就一代人而言,千禧一代的比例高于全国基准(约 20%)——这与早期关于家庭规模的调查结果一致。不是所有的千禧一代都到了做父母的年龄,也不是所有的千禧一代都选择在这个阶段做父母,所以看到更高比例的千禧一代和更小的家庭规模似乎是合适的。

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

全食超市和贸易商在热图上的位置;作者图片

最后,我们开始看到两个品牌在地理位置上的差异。如果我们仔细观察,我们可以看到全食超市在东北部和中西部(主要在芝加哥周围)的商店(暗红色)更集中,而 Trader Joes 往往在南加州更集中。

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

事实上,数据证明了这一点。这是在分析的数据中两个商店之间唯一真正的区别 Trader Joes 大约有一半的位置在西部地区,相比之下 Whole Foods 只有大约 33%。Whole Foods 的商店更多地分布在美国各地,而 Trader Joes 的商店更多地集中在西部(或者更恰当地说,在加利福尼亚州,占西部地区商店的大约 70%)。

数据没有告诉我们的是

在之前的分析中,我们研究了 Target 和沃尔玛以及它们的位置对其战略的影响。差异是清晰而明显的——目标位于周围客户群更富裕的城市及其周边的高密度区域。沃尔玛位于更多的郊区和农村地区,密度较低,收入低于平均水平。这些商店针对不同地区的不同顾客。

在没有更好了解的情况下,数据可能表明全食超市和 Trader Joes 瞄准了同一地理概况内的相同客户,有时在该国略有不同的地区。毕竟,数据清楚地表明了这两个品牌之间的相似之处。

在这里,我们可以开始深入思考这种情况,进一步理解它们之间的区别。我们可以用自己的经验、知识和直觉来补充数据,并得出比数据或自己的经验更好的结论。

在我看来——在没有数据支持的情况下——我会说,在相同的人口统计中,Trader Joes 的目标客户是想要健康食品的价格敏感型客户,而 Whole Foods 的目标客户是愿意为优质食材付费的健康敏感型客户。这两个客户群可以存在于同一个地点及其周围——事实上,他们经常没有重叠,我想你可以将这些商店定位在彼此靠近的地方,而不会互相蚕食。

以马萨诸塞州波士顿为例,虽然全食超市的数量越来越多,但该市 Trader Joes 的四个地点中有三个离全食超市很近,这表明地理距离并不总是限制靠近另一家类似企业。换句话说,了解你的目标客户——以及你的竞争对手——超越产品系列和人口统计资料,可以让你找到另一个类似的企业,同时两者都取得成功。

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

波士顿市中心 Trader Joes 和 Whole Foods 的位置;作者图片

位置数据(包括人口统计和附近的兴趣点)可以让我们清楚地了解谁住在一个地区,以及哪些其他类型的企业将该地区称为家。

然而,位置智能只是选址这个复杂等式的一部分。企业投入大量的时间、精力和资源来选择合适的地点。数据可以也应该成为讨论的一部分。不仅仅是孤立的数据——人口、收入、年龄等单一数据点。—但数据在上下文中(它与地方和国家基准相比如何?)和有方向的数据(它如何符合你的策略?根据你的产品和公司,谁是你的目标人群?我们能找到他们居住的地区吗?)将信息从数据转换为见解。

数据很少能帮你做决定,这个例子也不例外。然而,它可以将你的搜索范围从较大的地理区域缩小到较小的地理区域,从而更有效地利用你的时间和资源,此外还可以描绘出一个网站或地区的更完整的画面(你的竞争对手在哪里?附近还有哪些其他类型的企业,尤其是那些与您的企业互补的企业,比如距离餐馆仅几步之遥的冰淇淋店?).

有兴趣谈论位置数据&情报?在 jordan@jordanbean.com 给我发邮件或者在 LinkedIn 上联系我。

想自己下载数据?全食商店 的数据在这里 的交易员 Joes 在这里 ,还有美国人口普查局的人口统计数据。

三月版:数据和我们吃的食物(和饮料,和测量)

原文:https://towardsdatascience.com/march-edition-data-and-the-food-we-eat-56a2861c8b0c

烹饪,就像数据科学一样,融合了规则和违反规则,精确的测量和创造力

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

乔治·特罗瓦托在 Unsplash 上的照片

当我们遵循一个配方时,我们实际上是在将一个算法ML 模型投入生产吗?微调超参数就像用勺子蘸一锅煨肉汤来检查它是否调味充分吗?烟是从你的烤箱里冒出来的吗…元数据?这些问题对你这个有成就的数据专家来说可能听起来很傻,但对我这个曾经讨厌数学但一直喜欢烹饪的编辑来说很有意义。

人们经常告诉我们要走出自己的舒适区,但对于这个月刊来说——恰逢疫情和一个非常不和平的世界的两周年纪念日——踮着脚尖回到那个区域感觉是有道理的,或者至少是可以理解的。我希望你能迎合我对好面包和不可靠类比的热情,来分享一些数据科学和食品交叉领域的最佳 TDS 文章。

一旦你开始挖掘 TDS 档案时,总是如此,选择是困难的。下面的一些精选是带我们进入数据驱动的烹饪兔子洞的激情项目(真正的兔子在这个过程中受到伤害:零)。还有人以食物为出发点,探索编程、机器学习、物联网(IoT)。没有一个讨论饺子的,很可惜;如果你正在研究一些关于 varenyky、gyoza、manti 或他们任何胖胖的表亲的前沿数据科学研究,请发送给我们。(如果您正在进行其他主题的前沿研究,也请将它发送给我们。)

祝大家度过一个平安祥和的月份,

主编本·胡伯尔曼

英国烘焙展:兰登森林版

逐步介绍随机森林,这样您就可以看到每个成分的组合。

帕米拉·吴 (8 分钟)

双盲咖啡研究

一位浓缩咖啡专家讨论了为什么他们避免使用标准测试方法。

罗伯特·麦肯芦荟 (6 分钟)

发酵数据可视化

自学 Python 的一个夏天。

罗斯等待 (10 分钟)

数据科学家购买葡萄酒指南

分离出让葡萄酒好喝的化学物质。

芭芭拉·瓦纳基 (7 分钟)

城市健康:预测发展中国家的粮食不安全(第二部分)

我们能否应用机器学习技术来着手解决一个重大的全球性问题?

Dea Bardhoshi (7 分钟)

用 IoT 和 ML 制作更好的奶酪

使用低成本物联网和机器学习解决方案优化奶酪制作流程。

科恩拉德·普雷托里斯 (14 分钟)

衡量饭菜的相似度

在食品领域应用 Word2Vec 生成食品嵌入。

由亚龙·瓦扎纳 (4 分钟)

人工智能设计的“超级食物”可能有助于预防癌症

现代机器学习技术可以发现生物活性分子,其中一些类似于抗癌药物,并帮助设计营养,让我们活得更长更健康。

迈克尔·布朗斯坦、基里尔·维塞尔科夫和加布里埃拉·斯博多内(14 分钟)

感谢你这个月加入我们,感谢你对我们作者的所有慷慨支持,包括我们 2 月份加入我们的最新成员:向萨利赫萨利赫亚历山大魏安托万维拉提基隆斯皮灵让-马克布切特莉亚辛普森和雷麦克伦登尼古拉斯加西亚阿拉穆尼问好 坎·布恰克姆尔纳尔·古普塔普拉蒂克·奇卡拉艾伯特·维博沃梅茜(玛格丽特)摩尔本杰明·富尔穆罕默德·阿米·哈契查佩德罗·费拉里杰弗里·纳夫 https://medium.com/u/ca780798011a?source=post_page-----56a2861c8b0c-------------------------------- 奥斯卡·利奥尼克拉斯·朗凯西·程瓦莱拉斯·班格特维娅莱塔·阿普加尔亚当·科瓦奇莱昂·孙阿尔文·陈安德里·戈日洛夫斯基安德鲁·约瑟夫 早坂苏布拉曼亚·乔希朱利亚·维隆维贾伊·亚达夫艾薇·刘古斯塔夫·希尔罗兰·施策尔理查德·罗伯茨马丁·哈贝丹克 伊肯纳·奥格博古罗宾·奥普达姆丹尼尔·费恩塔里克·萨马里阿维·查德-弗里德曼维克托·德尔维涅安什·博尔迪亚拉斯·特尔·布拉克罗伯托·扎普 梅拉尔多·安东尼奥格拉汉姆·麦克尼科尔克鲁蒂·克里什纳帕安德烈亚斯·马丁森莱昂纳多·卡瓦尼斯亚尼夫·瓦克宁卢卡·克里萨卢卡·里布斯拉夫

具有实时浮游植物热点的野生动物监测系统

原文:https://towardsdatascience.com/marine-wildlife-monitoring-system-with-real-time-phytoplankton-hotspots-9b361dbd2d13

“海洋野生动物跟踪器”v0.2 版简介

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

图片由作者提供。蓝鲸的运动和十月浮游生物热点[1]

**“海洋野生动物跟踪器”**是由 GIS4 野生动物运动分析开发的地理框架,将于 2022 年 4 月在海洋保护项目中实施。由于 Argos 卫星的实时反馈,该框架能够以接近实时的方式检索野生动物跟踪数据集。野生动物的运动可以显示为动画,它可以包括直接来自数据库的历史数据集,该数据库具有无限的存储空间(由于 Movebank 而免费)。此外,它还与哥白尼海洋服务中心有联系,可以检索海洋生物地球化学和物理变量的数据集。其目的是为海洋科学家提供一种工具,支持海洋野生动物的保护、海洋保护区(MPAs)的评估和轨迹的运动分析(这要归功于后端移动的熊猫)

GIS4 野生动物运动分析提供个人定制平台。用户可以包括他们自己的分析算法和他们自己的补充数据集,如特殊位置或限制。“海洋野生动物追踪器”产品的特别之处在于,它有一个报警系统,可以向用户的个人手机警告海洋野生动物面临的威胁。此外,该框架可以作为 web 地图嵌入,并可以显示野生动物跟踪期间的实时运动。

查看使用海洋野生动物追踪工具制作的在线网络地图产品:

一月份大鲸鱼迁徙和浮游植物热点

“海洋野生动物追踪器”使用凭据工作,并提供对用户数据集的安全访问。一旦在海洋保护项目中实施,该软件只需要根据用户对可视化和警报系统配置的反馈进行维护。

蓝色经济模式的解决方案

GIS4 野生动物的蓝色经济模式旨在向更多用户开放平台。一旦该软件在 2022 年进行测试,那么它将被部署到网上,供更广泛的社区使用。该平台旨在与专注于保护的机构合作,帮助其保持在线。我们的愿景是在全球范围内实现这一目标。

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

图片由作者提供。2018 年浮游植物的年度变化和蓝鲸的运动轨迹[1]

请继续关注进展

如果你愿意跟踪“海洋野生动物跟踪 v0.2 Pro”的进展,你可以订阅时事通讯。它将概述该平台是如何开发和实施的。

查看简讯: GIS4 野生动物简讯

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

图片由作者提供。野生动物追踪者肖像。

代码

后端分析已经发表在地理空间数据科学的短文中,这些短文提供了一些特定情况下的编码工作流。该解决方案不仅适用于海洋动物,也适用于鸟类等不同物种。在这里查看一些关于产品如何在后台工作的代码:

黑背海鸥迁徙期间寻找筑巢地

本文是理解停止检测算法如何工作以及如何配置其参数的关键。

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

GBIF.org(2021 年 3 月 15 日)全球定位系统追踪北海南部海岸繁殖的小黑背鸥和银鸥https://doi.org/10.15468/dl.6vsh8k

在蓝鲸的活动中发现觅食点

本文可能有助于在您自己的工作流程中自动化停止检测算法。它使得算法参数的配置更容易,并帮助用户做更多的测试。

[## 蓝鲸 GPS 追踪中的停止检测—移动熊猫 0.6

towardsdatascience.com](/stop-detection-in-blue-whales-gps-tracking-movingpandas-0-6-55a4b893a592) 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Irvine LM、Palacios DM、Lagerquist BA、Mate BR、Follett TM (2019)数据来自美国加利福尼亚附近的蓝鲸和长须鲸的摄食行为,以及对猎物斑块的影响。 Movebank 数据仓库。DOI: 10.5441/001/1.47h576f2

可视化阿德利企鹅在南极洲的活动

这篇文章支持动物追踪数据集在两极的可视化:南极和北极。它给出了关于将空间数据投影到正投影坐标参考系统的说明。

在这张网络地图中查看阿德利企鹅的动向

该实验可视化显示了动物运动期间的停止检测算法。这有助于理解冰冻海洋上的觅食活动。

检查阿德利企鹅动作中的停止检测

按年份过滤巨头鲸迁徙路线

本文介绍了如何根据 GPS 轨迹创建线串几何。然后,它给出了按年份过滤的鲸鱼迁徙路线。

查看本网络地图中的巨头鲸迁徙路线

发现决定不迁徙的巨头鲸的觅食活动

本文旨在利用停止检测算法发现觅食活动,并参考 Silva 等人(2013)。算法的使用是实验性的,结果的验证需要海洋科学家的批判性观点。但是,该分析与研究杂志的结论相吻合,所以这篇文章展示了可以用来洞察鲸鱼迁徙的其他方法。

在网络地图中停止探测巨头鲸的迁徙

结论

GIS4 wildlife 提供了一个地理框架“海洋野生动物跟踪器”,旨在支持海洋保护、海洋保护区评估和运动分析。这一想法是在基于赞助的蓝色经济模式下工作,其愿景是向海洋科学界开放。

关于代码使用的文章展示了与出版的研究期刊的结论相匹配的内容。它们主要代表使用停止检测算法的教程和实验,结果的验证需要海洋科学家、生物学家、鸟类学家等的批判性观点。代码文章旨在提供有关“海洋野生动物跟踪器 v0.2 Pro”如何使用以及它如何支持野生动物跟踪项目中的研究和洞察力发现的可见性。

成为这个鼓舞人心的项目的一部分,支持海洋保护。如果你需要进一步的交流,请在这篇文章中留言或者在我们的网站上直接交流。

数据许可证

本文中可视化的数据集在 attribute 4.0 International(CC BY 4.0)和 CC0 1.0 Universal 下获得许可。

参考

[1] Irvine LM、Palacios DM、Lagerquist BA、Mate BR、Follett TM (2019)来自美国加利福尼亚州附近的蓝鲸和长须鲸摄食行为的数据,以及对猎物斑块的影响。 Movebank 数据仓库。DOI: 10.5441/001/1.47h576f2

[1] Sauzede R .、H. Claustre、J. Uitz、C. Jamet、G. Dall’Olmo、F. D’Ortenzio、b .根蒂利、A. Poteau 和 C. Schmechtig,2016:一种基于神经网络的方法,用于合并海洋颜色和 Argo 数据,以将表面生物光学特性扩展到深度:颗粒后向散射系数的检索,J. Geophys。海洋资源,121,doi:10.1002/2015JC011408。从蓝云虚拟实验室获取的浮游植物产品

环境署-WCMC 和自然保护联盟(2022 年),受保护的星球:世界保护区数据库(WDPA)和其他有效的区域保护措施世界数据库(补充)

营销组合建模 101

原文:https://towardsdatascience.com/marketing-mix-modeling-101-d0e24306277d

营销组合建模(MMM)的非技术性介绍—第 1 部分

“我花在广告上的钱有一半都浪费了;问题是我不知道是哪一半。”—约翰·沃纳梅克

约翰·沃纳梅克是一位成功的商人,是广告和其他许多领域的先驱。他在费城开设了第一家百货商店。他的百货连锁店被出售给多家公司,最终成为今天梅西百货的一部分。在他那个时代(1838 -1922),营销测量很可能是猜测,可能依赖于直觉。如果沃纳梅克先生正在天堂观看,他会很高兴,他会有一个更加精确和科学严谨的答案。可以帮助他的事情之一是营销组合建模,也就是嗯。

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

作者图片

MMM 试图帮助营销人员解决数百万美元的问题:衡量营销活动的效率,以及如何在未来优化预算分配。MMM 可以帮助回答这样的问题:
——KPI 的驱动力是什么?
—每个营销渠道的广告支出回报率(ROAS)如何?
—如果我在某些渠道或整体营销上花费更多或更少,KPI 会是什么?
—我应该在每个渠道上分配多少支出才能在下一个周期实现 KPI 最大化?

内容摘要

在这篇文章(MMM 系列的第 1 部分)中,我计划用以下主题对 MMM 进行非技术性的介绍:

  • MMM 模型包含哪些数据和变量
  • 理想的 MMM 心智模型中最重要的元素是什么
  • 哪些模型属性的选择非常适合所提出的心智模型

MMM 数据

MMM 是一个聚合模型,其数据粒度通常在渠道、国家/地区和/或产品级别,而不是用户级别。每天的支出数据可能很少且不稳定,因此每周或每月的汇总数据非常常见。业务 KPI 通常具有年度季节性和趋势性,因此该模型通常需要至少 2 年的历史数据(尤其是每周级别或每月级别)。也就是说,一切还是要看数据,对于某些数据量大、变化快的业务,每天和更短的周期也可能行得通。

MMM 模型通常包括以下目标和特征。

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

MMM 数据类别和示例-作者图片

感兴趣的 KPI 指标是响应变量。它可以是零售的销售额,在线商店的网站访问量,或者帐户注册数,谷歌搜索量等。

媒体变量应包括所有主要的营销渠道,并有可观的支出。例如付费搜索等在线媒体、付费社交媒体、电视等传统媒体和/或户外和直邮等离线媒体。建模单元可以是 spend,这更容易获得,因为它通常是内部跟踪的。但是,支出数据不考虑媒体成本。基于行动的变量,如点击、印象和 GRP 数据(如果可用且可靠)可能是更好的选择。

KPI 的其他重要驱动因素也应包括在模型中,以控制其影响。一些内部业务变量可以是促销、推荐和定价。其他外部控制包括季节性、趋势、重要节日等变量,以及可能导致 KPI 变化的事件(如 covid 或产品发布)、相关经济因素和竞争对手行为。

MMM 心智模型

所有的模型都是错的,有些是有用的。有用的模型是那些心理模型最接近现实的模型。以下要素对于一个好的 MMM 模型很重要,它们决定了应该采取什么样的模型形式。

  • 收益递减

收益递减说明了一个事实,即花在广告上的每一美元都不会产生相等的回报,随着我们在一个渠道上花更多的钱,一美元的回报将由于饱和而不断减少。开始时,有许多唾手可得的果实,最初的支出可以产生高回报。最终,随着市场越来越饱和,或者消费者对广告越来越厌倦,营销产生的回报会少得多,继续花钱就不值得了。这可以通过以媒体支出为 x 轴、KPI 为 y 轴的响应曲线图(见下例)来捕捉,这样我们就可以直观地看到支出的增加,以及 KPI 如何随之变化。

关于响应曲线应该是什么(C 曲线、S 曲线等),有一些假设。下面的例子显示了响应曲线的一个最流行的假设:曲线在开始时更陡峭,最终变得更平坦。尽管我们看到 KPI 持续增长,但每增加一个 KPI 的成本会大幅增加。重要的是要了解在什么水平的支出,ROAS 不再理想,我们应该停止支出。模型应该采取能够模拟这种凹形的形式。

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

回复治疗-作者图片

  • 遗留效应

广告的延续效应指的是消费者被广告感动的时间和消费者因为广告而转变的时间之间的时间差。假设有一天,我在回家的路上看到广告牌上有一个保险计划的广告,但是我不能马上买,因为我正在开车。这个广告仍然对我有一些挥之不去的影响。最后,一个星期后,我找到了一些时间,成为了他们的客户。这个广告对我的影响持续了一周。将我的经验扩展到成千上万的其他消费者,我们也可以有一个结转效应的平均衰减函数,也称为 adstock。参见下面的示例。该示例频道的广告效果在最初的一周大约为 40%,然后在接下来的一周下降到 20%,等等。

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

按周分类的广告——按作者分类的图片

虽然广告支出发生在第 0 周,但实际的广告效果直到后来才实现,因此在构建模型时,需要使用衰减率将第 0 周的支出公平分摊到接下来的 8 周。

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

存货、支出和转化支出——按作者分类的表格

adstock 衰减率需要针对不同的信道和目标。

广告库存可能因渠道而异。人们可以在一些频道上转换得更快,尤其是数字频道。例如,付费搜索渠道的用户可以很快转化,因为他们有更高的购买意愿,一次点击就可以带他们到商店或他们正在寻找的产品。另一方面,来自离线渠道的用户可能转换得慢得多,因为它可能需要一些时间来响应离线媒体。

adstock 也可能因业务而异。有些业务可能比其他业务慢。例如,如果你想成为 Lyft 的一名司机,需要时间来获得你的驾照和车辆检查和批准。因此,从接触广告到被认可为驾驶员之间的转换滞后时间较长。与注册网飞等视频流媒体服务不同,从看到广告到订阅可能只需要不到 5 分钟的时间。

  • 协同效应

1+ 1 > 2.你可能会担心,我怎么能称自己为拥有如此数学技能的数据科学家。但有时多项营销活动的组合可能会比每项活动单独运作的总和产生更大的效果,这就是营销的协同效应。
在这个信息爆炸的世界里,许多消费者不仅仅被一个媒体渠道所感动。例如,用户可以在回家的路上看到广告牌上的广告,然后他可能会在晚饭后看电视时看到关于同一产品的第二个广告。如果他只看了一个广告,他可能不会转化,但看了两个广告后,他可能会转化。

  • 趋势、季节性、节假日、事件和其他控制

除了目标和媒体特征之外,重要的是要理解业务 KPI 通常是季节性的和流行的,并且可能受到某些事件、假期和其他因素的高度影响。

快速增长的企业通常在目标上有上升趋势。零售商店可能在周末有更多的销售,而在一周内销售较少。一家面包店的销售额可能会突然发生变化,因为他们最近新开了三家分店。圣诞节促进了某些生意,因为许多人购买礼物。此外,由于竞争对手的大力促销,我们可能会看到销售额下降,当经济衰退时,开设投资账户的人会减少。

这些方面大多与营销活动没有什么关系,必须由模型很好地捕捉,以便进行无偏见的估计和合理的预测。

  • 纳入 的实证和实验结果

一个理想的 MMM 模型不应该纯粹由观测数据驱动,还应该结合实验结果、以前的经验见解、研究,甚至以前的模型。这将有助于模型解决数据问题,并产生与外部见解更一致且更具普遍性的结果。

通常,真实世界的数据,尤其是更细粒度的截面级别的营销数据可能非常稀疏,这可能会仅基于观察到的数据产生非常不合理的读数。在这种情况下,经验见解、以前的研究和行业基准可能会有所帮助。此外,具有较差数据质量的信道或 geo 可以使用来自具有稳健数据的类似信道或 geo 的信息来指导估计。例如,显示可以类似于编程显示。如果显示通道具有稀疏数据,我们可以使用从显示器上的编程显示中获得的信息来获得更合理的读数。新一代模型还可以利用以前版本模型的结果,并保持洞察力的一致性。

可信的实验结果被认为是理解因果关系和增量的圣杯。许多公司定期对营销渠道进行实验,以了解渠道增量。测试结果可能仅代表某一支出水平或短时间范围或渠道的子集。使用模型的测试结果可以利用两个世界的优势,并帮助校准模型结果。

模型属性的选择

模型属性和损失函数的许多选择可以适合上述心理模型。下面的图表总结了一些我认为可以满足心智模型关键要求的选择。

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

模型形式与心智模型—作者列表

为了捕捉不同信道之间的协同效应,假设信道可以以任何组合对用户产生协同效应,我们可以在 adstock 变换之后使用具有媒体的乘法模型形式。

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

媒体变量应使用 adstock 进行转换,考虑广告效果的预期长度、广告影响的预期峰值时间和衰减率。

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

然后,我们可以在函数的两端应用对数变换(加 1 以避免对数为零),方程就变成线性的了。对数转换为我们提供了凹形的介质成本曲线,也使扭曲的数据更加正常。可以通过对媒体数据应用附加变换来调整曲线的形状。

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

在上述等式之上,模型还应该是支持多变量和分解趋势、季节性、回归和误差项的时间序列模型。

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

贝叶斯框架是将外部信息整合到模型中的自然选择。贝叶斯框架允许使用具有期望变化水平的信息先验,以便结合先验知识和观测数据来估计后验概率。虽然媒体影响在短期内不会太不稳定,但营销杠杆和市场动态也可能会迅速变化,尤其是对新公司而言。在这种情况下需要时变系数,以便模型更加动态。

Orbit 是一个强大的 python 包,它可以构建支持上述属性的 MMM 模型。我有一个单独的介绍轨道的教程这里(这是一个关于轨道的一般用法的教程,不是专门为建造 MMM 的)。你可以在这里找到关于 MMM 系列第二部分的第二个故事,了解建立 MMM 模型时的挑战和陷阱,以及 MMM 与其他营销测量方法的比较。我还计划编写第 3 部分,使用 Orbit 用模拟数据构建一个 MMM 模型。

参考

[1] Dominique M. Hanssens,Leonard J. Parsons,Randall L. Schultz,市场反应模型——计量经济学和时间序列分析

[2] Edwin Ng,Zhishi Wang,,贝叶斯时变系数模型及其在营销组合建模中的应用

谢谢你,并关注我更多!

感谢您阅读到目前为止,并了解营销组合模式。如果你对 MMM 模型感兴趣,请关注更多,因为我计划为 MMM 写一系列故事。

敬请关注,关注我,订阅电子邮件了解更多关于数据科学和其他有趣话题的故事!

营销组合模型 102——好的、坏的和丑陋的

原文:https://towardsdatascience.com/marketing-mix-models-102-the-good-the-bad-and-the-ugly-f5895c86b7c3

营销组合模型(MMM)(和其他流行的营销测量方法)介绍第 2 部分

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

图片来自 Pixabay

公司每年在广告上花费数十亿美元,这使得营销活动的衡量和优化成为营销人员的一项重要任务。营销组合建模(MMM)通过提供营销活动如何驱动业务 KPI 的自上而下的视图来帮助回答这个问题。
在我的另一个故事营销组合建模 101 中,我介绍了什么是 MMM、MMM 数据、MMM 心智模型以及合适的模型形式。在这篇文章中,我将重点介绍

  • MMM 与其他一些衡量营销效率的方法相比如何?
  • 构建 MMM 时有哪些挑战,有哪些潜在的解决方案?

MMM 与其他营销测量方式的对比

营销的最终目的是影响或改变消费者的行为。衡量营销活动的效率就是要了解营销活动对 KPI 的增量效应是什么。在一个完美的世界中,我们希望有一对反事实:一个被广告感动的用户会发生什么,而如果同一用户没有被同样的广告感动,同时保持其他一切不变,会发生什么。然而,我们并不是生活在平行宇宙中(或许我们生活在平行宇宙中,但我并不知道。).

没有人会两次踏入同一条河。因为这不是同一条河,他也不是同一个人。—赫拉克利特

虽然只有随机实验被认为能够回答因果关系,我们仍然可以依靠其他建模技术来接近营销的增量。一些方法有助于衡量营销增量/效率:实验、营销组合建模(MMM)、多点接触归因建模(MTA)和混合方法——三者的全部或两者的组合。

实验

实验是理解因果关系的圣杯。有了随机化,它应该是我们能得到的最接近真实反事实的东西。实验和准实验广泛应用于市场测量中,以测试活动和渠道的增量。类型包括用户级测试、地理级市场测试、综合控制测试等。

在用户级测试中,用户被随机分配到控制组和治疗组。治疗组会暴露在广告下,而对照组不会。测试结束后,分析师可以比较两组之间的关键指标(例如转化率),并进行统计测试,以查看治疗组和对照组之间观察到的差异是否显著。例如(举一个简单的例子),如果一家公司想测试某种促销活动是否有效,以及多少折扣是理想的,他们可以有多个组——一个完全没有促销活动的控制组,促销活动减少 10 美元的处理组 1,以及促销活动减少 30 美元的处理组 2。

在某些情况下,用户级测试是不可行的,类似市场级测试或综合控制测试的准实验方法可能会奏效。例如,如果存在严重的网络效应,治疗将影响治疗组和对照组。就像优步一样,如果一个促销活动只针对某些司机,它可能会影响平台上的供应情况,并影响控制组中的司机。或者,如果我们想测试广告牌的效率,我们不能遮住某些人的眼睛,不让他们看到。但是,我们可以在一个城市进行治疗,而不在另一个城市进行治疗,并使用对照城市构建一个模型化/预测的反事实,与治疗城市的观察结果进行比较。

如果操作正确,使用实验/准实验的优势包括:

  • 这是真正理解一个活动或一个渠道的增量的最科学的方法。
  • 它可以灵活地理解活动级别、渠道级别、地理位置级别或营销有效性和边际性的整体级别(取决于创造性的实验设计)
  • 它可以为其他归因模型提供有价值的验证和校准
  • 它可以绕过一些模型难以解决的问题,例如付费搜索频道的自我选择偏差(在本文的后面部分会有更多相关信息)。
  • 对于历史很短但数量足够多的渠道和活动来说,实验比模型更有效。

也有缺点:

  • 对于许多渠道来说,实验可能是不可行的。原因可能是通道没有足够的容量或足够的功率来获得统计上显著的结果,或者通道不便于实验。准实验也受许多外部因素的影响,这些因素可能会影响治疗组和其预测因素之间的关系,从而使测试不准确。
  • 实验可能只能代表测试期间的市场情况和营销策略,而不能预测未来。它也可能受季节性和趋势的影响。仅仅使用实验结果来优化未来的预算分配,很难建立一个全面的、包罗万象的衡量框架。
  • 一个人不可能在给定的时间框架内运行无限数量的测试,尤其是对于较小的企业,或者当需要测试许多不同的处理方法时。
  • 这是主观的用户数据隐私倡议,如苹果没有 IDFA。没有用户级的跟踪数据,很难确定地将转化归因于活动,因此没有可靠的提升结果。

多点触摸归因模型(MTA)

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

转化前被多个广告接触的用户—作者图片

MTA 模型旨在将转化归因于转化前接触用户的不同渠道。在用户转化之前,他/她可以被多个频道的广告所触动。例如,用户可能会看到 Instagram 广告,并在转换前收到电子邮件广告。你如何将转化归因于不同的广告?如何确定哪个广告在推动用户转化方面是增量的,或者都不是?MTA 模型可能会有所帮助。

有许多方法可以建立 MTA 模型。有许多流行的方法:
1)简单但不精确的基于规则的方法,例如相等的权重(给所有通道相等的信用)、时间衰减(以固定/动态速率给远离转换的接触点较少的信用)、位置(给最后和/或第一接触通道更多的权重,假设它们对用户的决策具有更大的权重,并将剩余的信用分配给中间的其他通道)

2)合作博弈论与 Shapley 值。在博弈论中,Shapley value 是一种将积分公平分配给联盟中多个玩家(营销渠道)的解决方案(推动转化)。

3)机器学习模型,例如逻辑回归、树模型或神经网络。

4)上述的混合

优势:

  • MTA 模型是用户级和自底向上的。通过将用户级别聚合到所需的粒度级别并执行群组级别的分析,他们可以提供更精细和灵活的见解。
  • MTA 模型通常处于日线水平,能够对每日市场做出更快速的反应。
  • 允许广告客户深入了解用户旅程,更好地理解特定受众群体和粒度策略的细微差别和协同作用。

缺点:

  • MTA 模型只能覆盖数字媒体。你不能将广告牌广告接触归因于特定的用户。对于一家在线下媒体上投入大量资金的公司来说,这不会有什么好处。
  • 用于 MTA 模型的数据可能很难获得。MTA 数据旨在模拟整个用户广告旅程。然而,在现实中,由于跟踪困难,真实世界的数据可能是部分的,并且仅包括部分触摸点。
  • 大多数 MTA 方法利用点击数据,而不是印象,这往往会给更多点击渠道更多的信任,如搜索。这也会使分析出现偏差。
  • 像实验一样,MTA 也对用户数据隐私倡议持主观态度,比如苹果没有 IDFA,脸书没有 AMM。在可预见的未来,谷歌也将加入这一行列。没有用户级的跟踪数据,就无法建立 MTA 模型。
  • 它可能没有回答因果关系的问题,因为相关性不同于因果关系。

正如本文开头和我的 MMM 101 故事中提到的,MMM 也衡量不同营销渠道对 KPI 的影响。

与其他两种方法/模型相比,MMM 是一种聚合的自顶向下模型,具有以下优点和缺点:

优势:

  • MMM 提供了一个整体框架来评估营销渠道,控制许多其他因素,包括季节性、趋势、经济等。
  • MMM 可以生成有助于预算优化和分配的成本曲线。
  • MMM 不仅覆盖数字频道,还覆盖线下媒体,比 MTA 覆盖面更广,比市场水平测试更可靠。
  • MMM 对用户数据隐私倡议并不主观,因为它不需要用户级别的数据,这使得它是面向未来的。

缺点:

  • 相关性不等于因果性。MMM 本质上是一个回归模型。它没有反事实。虽然我们可以模拟假设情景,但它仍然不等同于随机控制实验。没有实验结果的校准,单独的 MMM 可能很难说它是否是因果关系。
  • MMM 需要相对较大的预算和较长的数据历史来进行可靠的读取。稀疏的数据和短暂的数据历史会使结果有偏差且不稳定。
  • MMM 倾向于低估上漏斗通道,高估下漏斗通道。
  • MMM 是一个聚合级别,这使得它不太灵活,不太可能获得更细粒度的洞察,并且不会显示用户旅程的细微差别。

统一 测量框架

以上都有一些利弊,没有人是完美的。我们可以将一种方法与另一种方法结合或校准,以利用所有方法的优势,并尽可能避免问题。例如,使用实验结果作为 MMM 的先验,并使用 MTA 结果来验证和校准 MMM。理论上,统一的方法应该比只使用一种方法更有效,但它需要更多的努力、规划、人才和预算,这对于许多公司来说在成本和收益方面可能没有意义。

挑战和陷阱

在高度了解 MMM 在营销测量领域的地位后,在本节中,我将深入探讨构建 MMM 模型时面临的挑战,以及一些挑战的解决方案。一些挑战可能不是 MMM 模型特有的,而是与一般回归相关的。

  1. 数据挑战

MMM 最具挑战性的数据限制包括三个方面:可用性、稀疏性/杂乱性以及有限的范围和数量。低质量的数据是无法治愈的,但是我们可以做一些事情来降低对模型的影响。(也就是说,垃圾进垃圾出,下面提出的解决方案只适用于通过最低要求的数据。)

  • 可用性:想要高质量的数据可能很难获得。例如,许多 MMM 模型使用媒体支出作为特征,然而,支出并不完美,因为它没有考虑媒体成本。在同样的支出水平下,我们以较低的媒体成本所能达到的范围要比以较高的价格所能达到的范围大得多。印象、点击和 grp(电视)可能是比支出更好的功能,但数据可能不可用或不可靠。
    可以从第三方数据中获取基于行动的数据,或者尝试建立更好的内部数据跟踪系统。没有基于行动的数据,花费数据仍然足够,但是,数据科学家应该注意媒体成本,并在模型形式和使用模型洞察力时解决它。
  • 稀疏和混乱:媒体数据也可能是稀疏和混乱的(不管是否使用支出作为特征),尤其是在更细粒度的层面上。这是营销预算工作的本质。例如,由于新品上市,支出可能会大幅增加,但之后的支出不会保持一致。对于某些渠道,由于市场动态或业务战略变化,预算可能会关闭一段时间,然后重新打开。
    在某些情况下,我们可以将被认为彼此行为相似的较小位置汇集在一起,并使用分层贝叶斯模型(相同的逻辑可以应用于类似的渠道)来估计它们,或者使用从实验或外部来源获得的可信先验来通知模型,以便数据不是决定系数的唯一因素。
    了解数据中的问题也有助于数据科学家利用模型做出更明智的决策 EDA 分析的重要性(我将有一篇关于它的单独文章)。
  • 有限的范围和数量:MMM 模型通常需要至少 2 年的每周数据(越长越好)和大量的媒体支出。如果我们有 2 年的周数据,只有 104 个数据点(假设一个横截面),我们可能有 10–20 个媒体渠道和外部因素,面临一个大 p(特征数)小 N(观察数)的问题。
    如果更长的历史或更细粒度的时间维度不在考虑范围内,一种可能的方法是在业务用例允许的情况下,通过合并较小的渠道并优先考虑较大的渠道来减少功能的数量。
    这是上面提到的 MMM 模型的弊端之一,没有足够的范围和历史数据量,不如不建立 MMM 模型,寻求其他营销测量的解决方案。

2.自我选择偏差和内生性

用技术术语来说,当模型中的一个回归变量与误差项高度相关时,内生性就发生了。这违反了基本的回归模型假设,并将导致有偏见的估计。

对于 MMM 来说,当一个频道中存在自我选择时,就会发生这种情况。最好的例子就是付费搜索,尤其是品牌付费搜索。有时,用户心中已经有了想要购买的品牌,并在网上搜索该品牌名称。然后她点击了付费搜索广告,进行了购买。这将招致广告支出,然而,购买将不是递增的,因为她无论如何都会购买。类似的案例在联盟营销中也经常发生。就拿我这个鬼鬼祟祟节俭的顾客来说吧。在我买东西之前,我会查看代销商应用程序中是否有返现优惠。我只是想看看我是否能节省一些钱,但返现并不影响我的购买决定。

自我选择偏差问题导致了另一个漏斗效应问题。漏斗上渠道获得的信贷比下游渠道少。例如,当用户首先在电视上看到广告,并想在线购买时。然后,他在谷歌上搜索该产品,并从付费搜索广告中购买。如果没有得到很好的处理,该模型可以将更多的信用归于搜索。

有几种方法可以解决内生问题并获得更准确的估计:
1)使用来自具有高选择偏差的渠道的可靠实验的信息先验来指导模型,并防止模型高估内生渠道。

2)使用仪器变量来更好地控制偏差。工具变量的基本思想是用其他与误差项不相关但与内生变量相关的预测因子来预测内生变量,并用预测替代内生变量。哇,那是一个令人费解的句子吗?LOL。一个简单的例子是两阶段最小二乘法。工具变量可能很难找到或构建。

3)使用 Google 开发的选择偏差修正方法(论文此处)。谷歌团队使用搜索广告环境的因果图,并根据因果推理文献中的后门标准(Pearl 2013)推导出一种统计学原理方法来纠正偏差。他们发现相关搜索量满足后门标准,并使用搜索查询作为控制。校正后,搜索系数比原始模型的搜索系数小得多,并与实验结果一致。

4)使用行业基准数据来减少从未修正模型直接估计的原始系数。这可能是最不可靠和最不推荐的方法,但可能是一个快速和肮脏的解决方案。

3.多重共线性

营销人员自然会以相关的方式在不同的渠道中分配他们的广告支出。例如,两个渠道可能一起发布,以相互加强或支持产品发布。

当构建模型时,高度相关的输入变量会导致模型具有高方差,并导致信道贡献的不稳定和不准确的分解,从而发生多重共线性。我能想到的检测多重共线性的方法有以下几种:1)检查解释变量之间季节性和趋势控制的相关性,2)检查方差膨胀因子(VIFs),即将每个要素与所有其他要素进行回归,并计算 VIF 以确定是否存在严重的多重共线性,3)更改模型中的要素组合并检查系数中是否存在高方差。

如果多重共线性问题严重,我们可以

  • 考虑减少特征的数量,并通过丢弃不相关的变量、合并相似的变量或使用 PCA(主成分分析)等更高级的方法来删除导致问题的变量。
  • 对变量进行一些转换或标准化,看看是否有帮助。
  • 在某些情况下,将规则应用于模型(如岭回归或套索回归)也可能有所帮助。

4.型号选择

在我的另一个故事营销组合建模 101 中,我讨论了 MMM 的良好心智模型需要考虑哪些方面。我就在这里总结一下

  • 报酬减少
  • 阿德斯托克
  • 季节性、趋势、假期和外部因素,如经济和竞争
  • 不同媒体之间的协同效应
  • 结合经验和实验见解进行模型校准,并提高解释因果关系的能力

在我们开始用模型拟合任何数据或开始解决数据问题或内生性或多重共线性问题之前,所选的模型形式至少应满足上述要求。

谢谢你,并关注我更多!

感谢你到目前为止的阅读,祝贺你已经完成了关于营销组合模型和其他营销测量方法的第二个故事。(此处看第一个。)我打算写一篇关于使用 Orbit 包的教程(你可以在这里找到 Orbit 的入门和基础教程)和模拟数据构建一个 MMM 模型,作为我 MMM 系列的第三个故事。如有兴趣,请关注更多!

敬请关注,关注我,并订阅电子邮件以获取更多关于数据科学和其他有趣主题的故事!

参考

[1] 使用类别数据改进媒体组合模型的分层贝叶斯方法由谷歌团队完成,2017
【2】媒体组合建模中的挑战和机遇由谷歌团队完成
【3】媒体组合建模中付费搜索的偏差修正,2017
【4】市场反应模型—计量经济学和时间序列分析**,** Dominique M. Hanssens,Leonard J. Parsons,Randall L. Schultz,

内容概要:本文档提供了DeepSeek R1大语言模型在本地设备上的快速部署指南。首先介绍并引导用户安装Ollama,这是一个致力于简化大语言模型本地部署的开源工具。接着详细列出从访问官网下载安装包、执行具体安装程序以及最后检验安装是否成功的每一个步骤。之后进入DeepSeek-R1的具体安装环节,根据用户的电脑内存大小推荐对应不同参数规模(如7B, 13B, 33B)的模型版本,并给予精确的下载与安装指令,使用户能针对性地完成特定版本的语言模型安装,同时提及若想改善用户体验可通过安装Cherry-Studio获得界面化的交互方式并创建属于自己的本地知识库。 适用人群:对大语言模型有兴趣且希望能够降低部署门槛的研究者、开发者乃至普适的一般用户。 使用场景及目标:帮助希望摆脱复杂云端依赖,寻求便捷本地部署解决方案的个人或者团队迅速将大语言模型集成入自身的工作环境中去,在保证性能的同时尽可能地简化流程,以便更快投入到相关的科研探索或是产品开发活动中。 其他说明:此手册注重实用性和简易性的平衡,在每一步都给出具体的指引和必要的注意事项,使得即便是不具备深厚技术背景的人也能顺利完成整个部署过程,另外,对于那些想要进一步提升效率与方便程度的人群还提供了一些可选但十分有价值的补充信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值