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

原文:TowardsDataScience

协议:CC BY-NC-SA 4.0

环境数据科学:介绍

原文:towardsdatascience.com/environmental-data-science-an-introduction-127b4b3422dc

处理环境数据的示例、挑战和观点

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

·发布于Towards Data Science ·7 min read·2023 年 9 月 5 日

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

图片由Francesco Gallarotti提供,来源于Unsplash

人类生活与环境深度交织。在当前的地质时期,人类世中,我们通过温室气体和化学产品的释放、广泛的基础设施建设和农业活动来塑造环境。

对于数据科学家来说,处理一个主题的自然方式是查看可用的数据及其潜力。环境数据科学领域相对较新,但正在日益受到关注。

气候变化的表现、生物多样性的丧失以及污染的增加,甚至到达深海,已经提高了我们对环境的敏感性。今天,可持续性是政治和非政府活动的主要焦点,我们必须紧急解决如何在保障生计的同时保护环境的问题。

气候变化人工智能倡议 正在与主要的机器学习会议合作,已经推出了一个环境数据科学的开源期刊,并且在环境研究和数据科学交叉领域建立了许多研究生项目,例如在帝国理工学院

据我了解,目前还没有明确的环境数据科学定义。在这篇博文中,我将分享我在环境数据科学方面的经验,基于我作为 AI 顾问在该领域的工作经验。首先,我将通过三个例子展示环境数据科学的多样性:

  1. 生物圈监测(分类)

  2. 空气污染预测(时间序列)

  3. 洪水损害驱动因素(特征重要性)

我将讨论与环境数据相关的挑战,涉及数据稀缺、质量和复杂性。环境数据不同于机器学习中遇到的其他领域的数据,我将提供我对如何应对这些挑战的看法。

最后,我将概述如果我们能够利用环境数据,并结合数据科学和机器学习的力量与对可持续解决方案的日益增长需求,我所看到的前景。

使用图像分类监测野生动物

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

由机器学习算法在照片中识别出的物种。原始图像:作者 GIRAUD Patrick — 自己的作品,CC BY 2.5,commons.wikimedia.org/w/index.php?curid=1093844。注释:作者。

随着人类活动扩展到偏远地区,许多动物和植物物种面临灭绝威胁。野生动物保护工作依赖于对各种感兴趣物种的准确监测。在Tuia 等人,Nature 2022中,作者列出了非侵入性数据收集设备,如“相机陷阱、消费者相机、声学陷阱[… 和]动物设备”。

收集的数据可以使用机器学习算法高效分析。例如,水坑附近的相机陷阱在动物经过时会捕捉图像。这些图像可以使用计算机视觉算法,如卷积神经网络进行分类。你可能遇到过猫与狗分类教程,这些教程可以适应于分类任何其他动物物种,只要有足够的标记数据。

预测空气质量时间序列

工业活动、运输和个人交通影响气溶胶的释放到大气中。气溶胶是轻质颗粒,可能对肺部和植物造成损害。它们的扩散不仅取决于释放的初始浓度,还取决于天气。在没有风的炎热日子里,气溶胶将比有轻风的日子停留在地面上更久。

许多城市已实施气溶胶监测系统,固定位置的站点全天测量气溶胶浓度。结果是一个时间序列,如下图所示,来自英国布里斯托尔市:

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

布里斯托尔三站点的 NOx 浓度数据(2022 年)。数据来源:data.opendatasoft.com/explore/dataset/air-quality-data-continuous%40bristol,布里斯托尔市政府,开放政府许可证。绘图:作者。

起初,这些数据将用于监测目的,例如检查是否达到了某些空气质量目标。但我们也可以使用这些数据进行分析,以识别恶劣气溶胶条件的驱动因素。类似于预测股票价格,我们可以使用机器学习生成空气质量预报,以帮助减轻气溶胶的影响。

示例 3:水文学—洪水损害监测

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

Jonathan Ford拍摄于Unsplash

洪水是最昂贵的自然灾害。2022 年巴基斯坦的大规模洪水事件造成 1700 人遇难,超过 800 万人流离失所,损失估计达到 150 亿美元[source]。估计有 18.1 亿人生活在可能受到洪水影响的地区[source]。

随着气候变暖和土地利用变化导致洪水事件的强度和频率增加,急需了解洪水损害的驱动因素。HOWAS 数据库收集了洪水事件的定性和定量数据,如建筑物与水源的距离、警报提前时间和建筑特征。目前,它正从最初关注德国和奥地利的数据扩展到全球数据。

Kellermann 等,《对象特定的洪水损害数据库 HOWAS 21》,自然灾害与地球系统科学(2021)中,使用了随机森林回归算法来预测总建筑损害。各种输入特征根据其对算法的重要性进行排名。像这样的高质量数据集有助于改善洪水预警和减轻损害。

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

通过特征重要性排名获得的洪水损害驱动因素。致谢:Kellermann 等,doi.org/10.5194/nhess-20-2503-2020

挑战

根据我在这一领域作为研究数据科学家的经验,我看到在使用环境数据方面有四个主要挑战。

数据稀缺

收集环境数据可能是一项繁琐的任务。为了获取数据,你实际上需要亲自前往一个地点,设置传感器,或手动采集样本。相比于在网上商店中客户数据通过互联网流入数据库的情况,获取单个样本的成本要高得多。一些地区的难以进入性可能使得获取具有足够空间和时间分辨率的数据变得困难。

通常,环境数据集由几百个样本组成,这些样本的获取成本很高。数据分析和算法必须经过精心选择,并根据需要进行调整。

专业数据格式

出于历史原因或方便,环境数据通常以机器学习算法和数据科学管道不容易识别的格式存在。根据我培训环境数据科学家的经验,受训者通常难以将标准机器学习教程中的概念转换为环境数据。

许多机器学习例程依赖于像标准仓库数据一样的数据,这些数据以 csv 或 json 文件形式提供,或以标准图像格式存在。环境数据通常由少数人收集,并且收集协议未考虑数据科学下游应用。因此,数据工程和清理通常是一项重要任务。

数据质量

即使数据量充足,数据质量也可能会有显著波动。例如,环境的摄影观察依赖于光线和相机角度,图像之间可能存在很大差异。传感器可能会失效或质量下降,像 HOWAS 这样的定性数据库维护成本高昂。

领域知识

处理环境数据、理解布局和提出正确问题的领域知识至关重要。环境数据的标注通常需要大量的专业知识。因此,跨学科项目是常态,其中数据科学家和机器学习专家与领域专家紧密合作。

视角

尽管处理环境数据面临诸多挑战,但我相信环境数据科学具有巨大的潜力。可持续性是当今政治和非政府组织讨论的主要焦点,良好的数据可以帮助做出明智的决策。企业正在根据实时数据制定战略,如果在可持续性讨论中看到数据类似的影响将会非常好。

有志于成为环境数据科学家的人员可能会发现,在可持续发展领域工作是有成效和令人满意的。在与自然资源保护、环境监测和可持续政策实施相关的项目中,他们发现比开发第百万个在线营销或加密货币预测算法更具目的性。

我希望未来环境数据科学能成为数据科学和机器学习的一个成熟领域。培养能在环境研究和编程交汇处工作的工程师和科学家是提升该领域成熟度的第一步。随着高质量数据的增加和对可持续性兴趣的增长,我相信环境数据科学在未来将会变得重要。

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

Marc Schulte 提供的照片,来源于 Unsplash

摘要

总结一下这次关于环境数据科学的介绍,我提供了三个例子来说明这个领域的多样性。处理环境数据面临独特的挑战,主要与数据稀缺性和数据质量相关。

与领域专家和数据科学家进行的跨学科项目可以利用未分析的环境数据。我希望未来环境数据科学能达到一个成熟的阶段,使环境数据直接指导决策并提升可持续性。

进一步阅读

普及生成式 AI 的环境影响

原文:towardsdatascience.com/environmental-impact-of-ubiquitous-generative-ai-9e061bac6800

如果数十亿人开始每天使用生成式 AI 技术,会对环境产生什么影响?

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

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

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

由 Johannes Plenio 拍摄,来源于 Unsplash

本文探讨了这样一个问题:大规模采用类似 ChatGPT 的生成式 AI 会对环境产生什么影响?也就是说,如果数十亿人开始每天广泛使用生成式 AI,那么环境影响可能是什么?

这个问题值得思考的原因在于,我们可以通过其答案来决定我们对这项新技术快速普及的担忧程度。

随着 AI 模型越来越大[1],并且像 OpenAI 和 Google 等公司使其广泛可用,AI 模型的环境影响——例如碳足迹和水足迹——已经成为学术界(如23)以及主流媒体(如45)讨论和研究的主题。

据报道,ChatGPT 的用户数量达到数亿——甚至可能是数十亿6——而 Google 将生成式 AI 嵌入到多个产品中[7],因此生成式 AI 可以说是当前最广泛采用的 AI 类型。结合生成式 AI 模型如 GPT-4 的巨大规模——传闻其规模是前代模型的近 6 倍[8]——生成式 AI 可能也是未来可预见的环境影响最大的 AI 类型。

本文是一个思想实验,考虑了大规模采用生成式 AI 可能带来的环境影响。它会导致环境灾难,还是只是一滴水中海洋,或者介于两者之间?本文的目的是为开始揭示这个问题提供基础。

在本文中做出的估算涉及许多假设,如果你想使用自己的假设进行实验,可以在 这个电子表格 中进行。

如果你想全面了解我关于 AI 环境影响的故事,请通过下面的链接成为 Medium 会员:

[## 通过我的推荐链接加入 Medium - Kasper Groes Albin Ludvigsen

作为 Medium 会员,你的会员费的一部分会分配给你阅读的作者,你将能完全访问每一篇故事……

kaspergroesludvigsen.medium.com

AI 系统生命周期的阶段

尽管本文并未分析特定模型,但区分 AI 模型生命周期的不同阶段仍具有参考价值。我们可以将 AI 模型的生命周期视为由 6 个不同阶段组成 [9]:

  1. 原材料开采

  2. 材料制造

  3. 硬件制造

  4. 模型训练

  5. 模型部署

  6. 生命周期结束

在本文中,我将重点关注硬件制造(第 3 阶段)、模型训练(第 4 阶段)和模型部署(第 5 阶段),因此下面将简要描述这些阶段。

硬件制造是指制造 AI 模型运行所需硬件的环境影响。模型训练是模型开发的阶段。模型部署是将模型“部署”到“生产环境”的阶段,用户可以使用模型。这有时也称为推理阶段或生产阶段。生命周期通常被描述为线性的,尽管许多 AI 系统在其生命周期内需要对模型进行重新训练或调整。

为了估算上述三个阶段的环境影响,我们需要了解大规模采用生成式 AI 需要多少硬件。这是我们在接下来的部分将考虑的内容。

## ChatGPT 的电力消耗

ChatGPT 可能在 2023 年 1 月消耗了相当于 175,000 人的电量。

[towardsdatascience.com

大规模生成式 AI 的采用需要多少硬件?

为了评估大规模采用生成式 AI 的潜在环境影响,我们需要了解处理每日数十亿次查询所需的硬件数量。

要确定所需的硬件数量,我们需要考虑技术将有多少用户以及他们将使用多少。用户越多,需要的硬件就越多。

那么,大规模生成性 AI 采用在用户数量方面会是什么样的呢?假设 35 亿人开始每天使用 ChatGPT 或类似技术,每天进行 30 次查询。那总共是 105B 次日常请求。鉴于 ChatGPT 的惊人用户数量以及 Google 和其他公司将生成性 AI 集成到各种产品中的努力,这种假设并不不合理。

现在我们需要了解处理 100B 日常请求所需的硬件种类和数量。

Patel 和 Ahmad 曾估算处理 195,000,000 次日常 ChatGPT 请求需要大约 3,617 台 Nvidia HGX A100 服务器,其中包含 28,936 个 Nvidia A100 GPU[10]。A100 GPU 是为 AI 工作负载设计的处理硬件。我们假设这些数字是正确的,并且可以推广到其他生成性 AI 服务。我们进一步假设 GPU 的数量与日常请求的数量呈线性增长。这意味着如果 3,617 台 HGX 服务器可以处理 195,000,000 次日常请求,我们需要 538.46 倍的计算能力——即 1,947,615 台 Nvidia HGX A100 服务器,总共 15,580,923 个 A100 GPU——来处理 105B 次日常请求。

现在我们已经了解了支持大规模采用生成性 AI 所需的硬件数量,让我们来看看制造这些硬件的环境影响。

大规模生成性 AI 在硬件制造阶段的环境影响

在上一节中,我们看到大规模采用生成性 AI 技术可能需要 1,947,615 台 Nvidia HGX 服务器和 15,580,923 个 Nvidia A100 GPU。让我们来看一下制造这些硬件的环境影响。

Nvidia 尚未发布其产品的碳足迹信息,因此我们必须使用一些代理数据,这意味着我们得到的数字高度推测,因此请谨慎对待并提出挑战。

根据惠普公司自己的估算,ProLiant DL345 Gen10 Plus 服务器的体现排放为 2,500 kgCO2e[11]。这是我找到的唯一一个具有体现排放数据的相似服务器,因此我们将以此作为类比,就像 Luccioni 等人以前所做的那样[9]。

ProLiant 服务器不包含任何 GPU,所以我们需要加上 8 个 A100 GPU 的体现排放。同样,Nvidia 并未公开这些数据,但其他人已使用了每个 GPU 150 kgCO2e 的数据[9] [12]。

我们假设使用的是带有 8 个 GPU 插槽的 Nvidia HGX,因此我们需要将 8 * 150 kgCO2e 加到 2,500 kgCO2e 中。这总共是每台 Nvidia HGX A100 服务器 3,700 kgCO2e。

记住,我们需要 1,947,615 台这样的服务器来处理 105B 次日常请求。因此,满足大规模采用生成性 AI 所需的 GPU 硬件的体现排放估计为 1,947,615 * 3.7 = 7,206,177 吨 CO2e。

让我们将这些排放均匀分布在硬件的使用寿命内。我们假设硬件的使用寿命为 5 年,之后要么磨损,要么被新技术替代 [13]。

基于此,大规模采用生成式 AI 所需硬件的碳足迹估计为每年 1,441,235.4 吨 CO2e。

[## 订阅 Kasper Groes Albin Ludvigsen 的文章以获取电子邮件通知。

订阅 Kasper Groes Albin Ludvigsen 的文章以获取电子邮件通知。通过注册,你将创建一个 Medium 账户,如果你…

kaspergroesludvigsen.medium.com](https://kaspergroesludvigsen.medium.com/subscribe?source=post_page-----9e061bac6800--------------------------------)

大规模生成式 AI 采用的训练阶段的环境影响

现在,让我们考虑训练支撑生成式 AI 的 AI 模型的环境影响。

ChatGPT 的初始版本基于一个名为 GPT-3.5 的大型语言模型(LLM),它是 GPT-3 的一个版本。最新版本的 ChatGPT 可能基于 OpenAI 最新的 LLM——GPT-4,但 OpenAI 尚未发布任何关于 GPT-4 的训练成本信息。不过,我们有关于 GPT-3 训练过程中的能耗的可靠估算。这些数据来源于谷歌和加州大学伯克利分校研究人员的一篇论文,他们估算训练 GPT-3 的能耗为 1,287,000 KWh [14]。我们可以假设其他公司训练的模型在同一范围内。

要计算 1,287,000 KWh 的碳足迹,我们需要了解生产 1 KWh 电力时排放了多少碳。这被称为电力的碳强度,并在不同地区之间有所不同,因为电力来源(风能、煤炭、太阳能等)因地区而异。在这个思考实验中,我们使用谷歌、亚马逊和微软数据中心使用的电力的平均碳强度。根据 ML CO2 Impact Calculator [18]的数据,这三家云服务提供商的电力平均碳强度为 484 gCO2e/KWh。

现在,为了获得生成模型年度碳足迹的估算,我们需要知道有多少公司提供这种模型以及它们的训练频率。假设在生成式 AI 领域将有 9 个主要参与者:OpenAI/Microsoft、Google、Meta、Anthropic、Inflection、Character、腾讯、字节跳动、百度。再假设他们每年训练一个模型。这将导致每年的训练碳足迹为 6,229 吨 CO2e。

本文这一部分的假设是最具推测性的。然而,正如我们将看到的,它们对整体图景的影响不大,因为训练阶段的环境影响与硬件制造和部署阶段的环境影响相比,显得微不足道。

大规模生成性人工智能部署阶段的环境影响

现在让我们考虑生成性人工智能模型部署阶段的环境影响。换句话说,让我们看看运行 1,947,615 台 HGX 服务器所需的电力。

一种计算方法是查看服务器的所谓热设计功率(TDP)。TDP 通常用于量化一块处理硬件运行所需的电力。HGX 服务器的 TDP 未知,但类似的 Nvidia 服务器 DGX 的 TDP 为 6.5 kW [15],我们假设 HGX 服务器也适用这一数据。因此,如果服务器全功率运行一个小时,则消耗 6.5 千瓦时(kWh)。然而,在这个思维实验中,我们假设所有服务器平均运行在其 TDP 的 75%,那么每小时将消耗 4.875 KWh。共有 1,947,615 台服务器,每台每小时消耗 4.875 KWh。这总计为每小时 9,494,625 KWh,每天 227,871,000 KWh,每年 83,172,915,000 KWh。

计算数据中心级硬件的电力消耗时,通常会将硬件自身的电力消耗乘以硬件所在数据中心的所谓电力使用效率(PUE)。PUE 是用于表达数据中心能源效率的指标。数据中心在冷却等方面使用的能量相对于实际计算硬件的电力使用得越多,PUE 值越高。微软的全球 PUE 为 1.18 [16],谷歌的为 1.10 [17],所以我们使用这两个值的平均数,即 1.14。

如果我们将 HGX 服务器估算的年电力消耗 83,172,915,000 KWh 乘以 1.14,则年电力消耗为 94,817,123,100 KWh。

接下来,为了计算碳排放,我们将乘以前一节中提到的 484 克/KWh 的碳强度。基于此,我们可以估算大规模生成性人工智能部署阶段的年碳足迹为 45,891,487 吨。

普遍采用生成性人工智能的综合环境影响

现在我们已经估算了硬件制造、训练和大规模部署生成性人工智能的阶段的碳足迹,让我们将这些数据结合起来,计算大规模生成性人工智能采用的年总碳足迹。

回顾我们估算了硬件制造的年排放量为 1,441,235 吨。然后,我们估算了训练阶段的年 CO2e 排放量为 6,229 吨。最后,我们估算了大规模生成性人工智能部署阶段的碳足迹为每年 45,891,487 吨。

因此,普遍采用生成性人工智能的总碳足迹可以估算为每年 47,338,952 吨 CO2e。

下图 1 展示了模型部署阶段的碳排放量比硬件制造和模型训练阶段大得多。因此,研究应关注如何减少部署阶段的排放,而非训练阶段的排放。

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

图 1:按生命周期阶段估计的大规模采用生成性 AI 的年碳排放量。图表由 Kasper Groes Albin Ludvigsen 提供

将大规模采用生成性 AI 的年碳足迹放入视角中

在整篇文章中,你可能会想:“这些数字究竟意味着什么?这多还是少?”

上面,我们估计大规模采用生成性 AI 的总年碳足迹为 47,338,952 吨 CO2e,包括硬件制造、模型训练和模型部署生命周期阶段。

这相当于 4,303,541 丹麦人的年排放量。这样看来,我认为这听起来很多。另一方面,430 万人只是全球人口的微不足道的一部分。因此,让我们也将普遍生成性 AI 的碳足迹与全球年排放量进行比较。

全球年 CO2e 排放量的估计因来源不同而有所差异,但 IAE [19] 估计 2021 年全球排放了 400 亿吨 CO2e。在这 400 亿吨中,47,338,952 吨占 0.12%。换句话说,如果 35 亿人每天对生成性 AI 模型如 ChatGPT 进行 30 次查询,这篇文章估计可能会使全球 CO2e 排放量增加 0.12%。我将留给读者自己决定是否认为这很多。

普遍生成性 AI 采用的水足迹

到目前为止,我们已经分析了大规模采用生成性 AI 的潜在碳足迹。但碳排放并不是数字技术的唯一环境影响。另一个重要的考量是冷却承载大 AI 模型的数据中心的水消耗。水消耗指的是那些丧失且无法再利用的水。

Pengfei Li 等人 [20] 的一篇最新论文分析了类似 ChatGPT 的大型语言模型的水消耗。在他们的论文中,作者提出了一种估计数据中心水消耗的方法,他们估计 ChatGPT 每进行 20 到 50 次查询会消耗 500 毫升水。数据中心的水消耗主要有两种方式:

  1. 直接消耗,即水分蒸发并在数据中心硬件冷却时被冲洗掉,以及

  2. 间接水消耗,即用于生产数据中心所需电力的水。

假设 ChatGPT 的水消耗可以推广到其他人工智能服务,并且 50 个查询需要 500 毫升的水,即每个查询需要 10 毫升的水。请记住,我们假设生成性人工智能模型每天会收到 105 亿个请求。这每天需要 1,050,000,000 升水,或者每年需要 383,250,000,000 升水。相比之下,成年人每年的推荐液体摄入量为 3.2 升[21],即每年的摄入量为 1,168 升。这意味着生成性人工智能的大规模应用产生的水消耗可以满足 328,135,000 成人的年液体摄入量。

你可能会想知道为什么水的消耗会成为一个问题。主要问题是,当大量用水的数据中心被放置在受旱灾影响的地区时。这是一个问题,因为我们通常没有将水跨大距离转移所需的基础设施。Pengfei Li 等人的论文展示了这张图,显示了美国受旱灾影响的地区。这些地区有成千上万的数据中心。

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

图片来源 arxiv.org/pdf/2304.03271.pdf

讨论

现在让我们讨论一下上述估算的潜在影响。

我们能否用可再生能源为大规模的生成性人工智能应用提供动力?

那么我们如何减少生成性人工智能大规模应用的环境影响呢?

如何估算和减少机器学习模型的碳足迹 ## 如何估算和减少机器学习模型的碳足迹

两种简单估算机器学习模型碳足迹的方法以及减少碳足迹的 17 种方法

[towardsdatascience.com

一个浮现在脑海中的想法是用可再生能源为这些数据中心供电。让我们考虑这个想法。

接下来,我将假设对生成性人工智能的所有查询都需要额外的能源。即,我假设这些查询不会替代对其他现有服务的查询。你可能会争辩说,一些 ChatGPT 查询当前替代了传统搜索引擎查询,但考虑到生成性人工智能正在被整合到 Bing 和 Google 中,我敢说几乎所有的生成性人工智能查询都会是额外的。

为了使生成性人工智能的大规模应用具有可持续性,因此能源必须通过额外的可再生能源容量来生成——即,我们需要安装额外的可再生能源容量。请记住,普遍的生成性人工智能可能每年需要接近 95 亿千瓦时的电力。平均风力发电机每年可以产生 600 万千瓦时的电力[22]。

因此,为了用风力涡轮机生产足够的可再生能源,我们需要安装大约 15,800 台新的风力涡轮机。为了提供背景,丹麦作为风能领域的领先国家,目前有 6,286 台活跃的风力涡轮机[23]。

因此,我认为可以安全地说,要建立足够的额外可再生能源以支持普遍的生成式人工智能采用,将是一项庞大而昂贵的工作。

附带说明一下,即使是可再生能源也被认为有碳足迹,因为生产和安装例如风力涡轮机所造成的排放会分摊到能源来源的使用寿命中。因此,来自离岸风力发电的电力被认为具有 12 gCO2e/KWh 的中位碳强度[24]。因此,即使所有生成式人工智能都由风能供电,它的年碳足迹也将达到 1,114,000 吨 CO2e——大致相当于 104,000 名丹麦人。

其利益是否超过成本?

在这场辩论中另一个有趣的方面是,我们是否能通过生成式人工智能获得的生产力提升足以证明其环境影响的合理性。在一篇尚未经过同行评审的文章中(即,需持保留态度),麻省理工学院博士生 Shakked Noy 和 Whitney Zhang 展示了使用 ChatGPT 在实验环境中提高了若干任务的生产力和工作质量[25]。Noy 和 Zhang 测量了撰写新闻稿、简短报告、分析计划和微妙电子邮件等任务的生产力。质量由(盲测的)在同一职业中工作的经验丰富的专业人士评估。

生产力提升是否值得其环境成本本质上是一种价值判断,但如果我们能确认生成式人工智能是否确实使我们更具生产力,将是辩论的良好开端。因此,需要进行更多的研究,使用生成式人工智能的公司应对生产力的影响进行严肃评估。

警示事项

本文提出的估计值应被视为有根据的猜测。这首先是因为我们试图预测未来会发生什么。其次,对这些类型的人工智能模型环境影响的任何估计都受到影响,因为提供者并未披露所需的信息,这意味着我们必须做出假设。通过撰写这篇文章,我希望激励其他人挑战我的假设或提供他们自己的估计。

尽管生成式人工智能是一个涵盖可以生成文本和/或图像的人工智能产品的总称,但本文专注于生成文本的模型。因此,这里的估计并未考虑图像生成技术的采用。

本文以 ChatGPT 的原始版本(基于 GPT-3.5)作为出发点,因为 OpenAI 最新模型 GPT-4 的相关数据尚不可用。如上所述,GPT-4 比 GPT-3 更大,这可能意味着它消耗更多的能源。然而,这不一定是事实。

我假设一家公司的生成式人工智能产品的环境影响将与其他公司提供的竞争产品大致相同,但也可能有些公司提供较小或更专业化的模型。

结论

在这个思想实验中,我们探讨了如果世界上很大一部分人口开始每天使用像 ChatGPT 这样的生成式人工智能,可能对环境产生的影响。这个思想实验的目的是为读者提供一个评估问题的基础:我们是否应该担心大规模采用生成式人工智能的环境影响?

我们估计,普及的生成式人工智能每年可能消耗 95B KWh 的电力,生产这些电力可能会排放 47,338,952 吨 CO2e。这占全球 CO2e 排放量的 0.12%。换句话说,本文估计如果 35 亿人每天向生成式人工智能服务发出 30 个查询,全球 CO2e 排放量可能增加 0.12%。另一个需要考虑的环境影响是水消耗。本文估计普及的生成式人工智能每年可能消耗 383,250,000,000 升水。这相当于 328,125,000 名成人的推荐年液体摄入量。

就这些了!希望你喜欢这个故事。告诉我你的想法吧!

关注我获取更多关于人工智能和可持续发展的内容,并订阅,以便在我发布时通过电子邮件获取我的故事。

我有时还会写关于时间序列预测的文章。

也欢迎在LinkedIn上与我联系。

参考文献

[1] huggingface.co/blog/large-language-model

2 arxiv.org/abs/1907.10597

3 arxiv.org/abs/1906.02243

4 www.forbes.com/sites/bernardmarr/2023/03/22/green-intelligence-why-data-and-ai-must-become-more-sustainable/

5 www.standard.co.uk/tech/ai-chatgpt-water-usage-environment-study-b1073866.html

6 www.similarweb.com/blog/insights/ai-news/chatgpt-growth-flattens/

[7] nypost.com/2023/05/10/google-integrates-more-ai-into-products-in-battle-with-microsoft/

[8] the-decoder.com/gpt-4-has-a-trillion-parameters/

[9] arxiv.org/pdf/2211.02001.pdf

[10] www.semianalysis.com/p/the-inference-cost-of-search-disruption

[11] www.hpe.com/psnow/doc/a50005151enw

[12] medium.com/teads-engineering/building-an-aws-ec2-carbon-emissions-dataset-3f0fd76c98ac

[13] cybersided.com/how-long-do-gpus-last/

[14] arxiv.org/ftp/arxiv/papers/2204/2204.05149.pdf

[15] www.nvidia.com/content/dam/en-zz/Solutions/Data-Center/nvidia-dgx-a100-datasheet.pdf

[16] azure.microsoft.com/en-us/blog/how-microsoft-measures-datacenter-water-and-energy-use-to-improve-azure-cloud-sustainability/

[17] www.google.com/about/datacenters/efficiency/

[18] github.com/mlco2/impact/blob/master/data/impact.csv

[19] www.iea.org/reports/co2-emissions-in-2022

[20] arxiv.org/pdf/2304.03271.pdf

[21] www.health.harvard.edu/staying-healthy/how-much-water-should-you-drink

[22] www.ewea.org/wind-energy-basics/faq/

[23] turbines.dk/

[24] en.wikipedia.org/wiki/Life-cycle_greenhouse_gas_emissions_of_energy_sources

[25] economics.mit.edu/sites/default/files/inline-files/Noy_Zhang_1.pdf

等规模谱聚类

原文:towardsdatascience.com/equal-size-spectral-clustering-cce65c6f9ba3?source=collection_archive---------2-----------------------#2023-02-06

对这种流行算法的一种修改,构建了点数平衡的簇

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 卡门·阿德里安娜·马丁内斯·巴博萨博士

·

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

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

阿姆斯特丹餐馆的等规模聚类。所有图像由作者创建。

聚类是一种用于将具有相似特征的数据点分组的方法。它广泛应用于探索性数据分析,并且在许多应用中已被证明非常重要,如模式识别、市场和客户细分、推荐系统、数据压缩和生物数据分析等。

尽管有大量的聚类算法,但没有一种能够生成点数平衡的聚类。这种等大小的聚类在某些领域非常重要,例如在最后一公里配送领域,其中大量订单可以聚合成等大小的组,以改善配送路线并最大化车辆容量利用率。

鉴于需要进行等大小的聚类,我和几位同事扩展了所谓的spectral clustering算法,以生成点数平衡的聚类。这个新算法基于数据点的地理信息构建具有相似点数的聚类。

完整代码可以在这个GitHub 仓库中找到。它旨在为数据科学社区做出贡献。如果你需要在地图上创建等大小的点聚类,可以试试!

等大小谱聚类:算法

等大小聚类由三个步骤组成:聚类初始化、计算每个聚类的邻居,以及平衡每个聚类中的点。我们来详细回顾一下每一步。

聚类初始化

在第一步中,我们通过使用Scikit-learn 的谱聚类算法实现来创建聚类。谱聚类在汇聚空间数据方面非常强大,因为它基于连接节点的边识别图中的社区。谱聚类算法特别适用于聚类遵循圆形对称性的点。如果你想了解更多关于这种方法的信息,可以阅读 William Fleshman 写的这篇精彩文章:

## 谱聚类

基础和应用

towardsdatascience.com

进行聚类初始化需要两个超参数:nclusters*,即所需的聚类数量,以及nneighbors,*即每个数据点的邻居数量。最后一个参数由谱聚类用于构建相似度矩阵。nneighbors的良好值在数据点的 7% 到 15% 之间。

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

步骤 1:通过谱聚类算法创建聚类。这些聚类的点数不相等。

计算每个聚类的邻居

一旦创建了簇,算法的第二步是计算每个簇的邻居。这一计算是如何进行的呢?通过估计每个数据点最近邻居的簇标签的众数。例如,如果点x属于簇A,而其大多数最近邻居属于簇B,这意味着簇B是簇A的一个邻居。

计算每个簇的邻居极其重要,因为簇的平衡是通过在邻近簇之间交换点来实现的。

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

步骤 2:左侧面板:估计每个簇的邻居。在这个示例中,我们可以看到簇 A 和簇 B 是簇 C 的邻居。右侧面板:通过在邻近簇之间交换点来平衡簇。

平衡每个簇上的点

算法的最后一步是平衡每个簇上的点。如上所述,我们通过在邻近簇之间交换点来实现这一点。大簇将点转移到较小的邻近簇。在平衡过程中,我们的目标是使簇的大小大致等于N/ncluster,其中N是数据点的总数。

为了平衡簇的大小,我们定义了超参数equity_fractionequity_fraction是一个定义在区间(0,1]内的数值,它限制了结果簇的平等程度。如果equity_fraction为零,则簇将保持初始大小。如果equity_fraction为一,则结果簇的大小将大致等于N/ncluster

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

步骤 3:最终的簇大小取决于equity_fraction。左侧:如果equity_fraction为零,簇保持初始大小。右侧:如果equity_fraction为一,簇的点数大致相同。

让我们做一个小小的插入,定义一个叫做簇分散的量。簇分散被定义为簇内点距离的标准差。你可以将其视为簇内距离的一个稍作修改的版本。

equity_fraction影响初始簇的分散,因为点的交换增加了簇内点之间的距离。在这种情况下,我建议使用优化算法来找到最优的簇超参数,以最小化簇的分散。在下一节中,我会提到如何从 Python 代码中获取簇的分散。

其他功能

重要的是要记住,相等大小的谱聚类可以用来创建空间点的聚合这个仓库提供了一个绘图功能,可以在你拥有数据点坐标的情况下使用。在下一节中,我们将看到这个功能的实际应用。

使用案例:阿姆斯特丹餐馆的聚类

假设你是荷兰的一家农场的主人,你希望将新鲜的高品质食物送到阿姆斯特丹的许多餐厅。你有 6 辆容量相同的车辆,这意味着它们能够大致送到相同数量的餐厅。

为了充分利用车辆的容量,你可以使用均等大小聚类来对餐厅进行分组,使得每辆车在不同餐厅之间的旅行距离不会过长。

首先,让我们读取餐厅的位置:

文件restaurants_in_amsterdam.csv包含了阿姆斯特丹中央车站 8 公里范围内的餐厅位置列表。你可以在GitHub 仓库datasets文件夹中找到这个文件。

coords数据框中列出的地点,可以估算出一个包含每对点之间旅行距离的矩阵。这个矩阵的形状是(n_samples, n_samples),并且它必须是对称的。这个矩阵是均等大小聚类所接收的输入。

现在我们可以运行均等大小光谱聚类。这跟调用SpectralEqualSizeClustering类一样简单:

在这个例子中,我们创建了 6 个簇。我们选择邻居数量nneighbors为输入数据集中点数量的 10%。由于我们希望簇尽可能相等,因此我们将equity_fraction设置为 1。

你可以看到如何通过调用fit方法获得每个数据点的簇标签。重要提示: 预测未包含在原始数据中的点的簇标签的函数尚未实现。如果你发现这段代码对你的工作有帮助,我鼓励你开发这个功能!

上述获得的簇标签可以添加到数据框coords中,以便在地图上绘制结果簇:

运行上述代码后,我们得到一个包含所有簇的交互式图,如图所示:

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

使用均等大小光谱聚类代码创建的簇。

在那个图中,你可以选择每个簇以单独进行可视化:

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

在上述用例中,超参数的优化是不必要的。然而,正如我之前提到的,如果需要,可以使用优化方法。在这种情况下,你可以使用作为优化指标的属性clustering.total_cluster_dispersion,它是所有簇离散度的总和。通过最小化这个量,得到的簇会更紧凑。

主要信息

在这篇博客中,我介绍了一个修改过的光谱聚类代码,该代码生成在点数上平衡的簇。这个算法可以用来生成空间点的均等聚合,并且在最后一公里配送领域的一些流程改进中可能也会有用。

等大小谱聚类的重要考虑因素如下:

  • 输入数据必须是一个与数据点坐标相关的对称距离矩阵。

  • 聚类代码的超参数包括期望的簇数(nclusters)、每个数据点的邻居数(nneighbors)以及确定簇大小是否相等的一个比例(equity_fraction)。你可以使用任何优化算法来找到最小化总簇离散度(total_cluster_dispersion)的最佳参数。

  • 等大小聚类也可以用于非空间数据,但尚未对这一目的进行测试。如果你想进行实验,请定义一个度量来创建代码所需的对称距离矩阵作为输入。务必先对变量进行归一化或标准化。

  • 该代码目前还没有prediction方法,但如果你觉得这个代码有用,欢迎贡献。

希望你喜欢这篇文章。再次感谢阅读!

致谢:等大小谱聚类是与 Mor Verbin、Lilia Angelova 和 Ula Grzywna 合作开发的。真是一个了不起的数据团队!

R 和 Python 的错误处理

原文:towardsdatascience.com/error-handling-in-r-and-python-5a4d60f3fba6

如果一个错误在函数中途出现,可以进行处理

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

·发表在 Towards Data Science ·阅读时间 5 分钟·2023 年 4 月 27 日

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

图片由 Joshua Hoehne 提供,Unsplash

介绍

一件事是明确的:如果你曾经编码过,你一定遇到过错误。就是这样。

错误并不总是坏事。我同意,有时候它们可能让我们抓狂,特别是当我们反复查看代码却找不到错误时。然而,错误信息必须被理解为代码中某些地方未按预期工作。

说实话,我们可以创建 N 个测试场景,但最终用户会发现 N+1 个错误。这没关系,只要我们能计划最常见的错误。

在本文中,我们将探讨一些已知的错误处理函数,这些函数可以在发生错误时让我们的代码继续运行。我们还将看到 R 和 Python 的代码片段。

继续阅读。

错误处理

错误处理是一种编程资源,可以让你的代码在发现错误后继续运行,而不会中断。

想象一下,你正在编写一个函数,该函数接受两个数字,计算它们之间的差值,并返回差值相对于第一个数字的百分比。这是一个相当直接的函数,但如果你将数字作为字符串输入,代码将崩溃并显示错误信息:我不能用文本进行数学运算,伙计。

这时,错误处理可能会很有用。如果我们知道这是来自最终用户的一种常见错误,我可以计划让我的代码绕过这个错误并返回结果,即使输入的数字是作为字符串输入的。

程序员可以说:

  • 尝试运行这段代码。

  • 如果这不起作用,你可以运行这段代码。

让我们继续,看看如何编写代码。

编程

R

在 R 中,用于错误处理的函数是tryCatch。如前所述,它将尝试运行主要代码,但如果它“捕获”到错误,则次要代码(解决方法)可以运行。

回到上一节的示例,一个没有错误处理的百分比差异计算函数如下。

# Function to calculate the percentage difference between two numbers
pct_difference <- function(n1, n2) {
  "Function that takes two numbers and return the percentual difference
   between n1 and n2, being n1 the reference number"

  pct_diff <- (n1-n2)/n1

  return ( cat('The difference between', n1, 'and', n2, 'is', n1-n2,
               ', which is', pct_diff*100, '% of', n1) )
}

# Test 1
pct_difference(10, 2)
[OUT] The difference between 10 and 2 is 8 , which is 80 % of 10

# Test 2
pct_difference(10, '2')
[OUT] Error in n1 - n2 : non-numeric argument to binary operator

请注意,在 Test2 中,如果我们输入字符串,代码不会继续执行。它会中断。

现在,我们可以使用tryCatch并使函数即使在输入数字作为字符串时也返回值。

# Function to calculate the percentage difference between two numbers
# with error handling
pct_difference_error_handling <- function(n1, n2) {
  "Function that takes two numbers and return the percentual difference
   between n1 and n2, being n1 the reference number"

# Try the main code
  tryCatch(pct_diff <- (n1-n2)/n1,

        # If you find an error, use this code instead
           error= return(
             cat( 'The difference between', as.integer(n1), 'and', as.integer(n2), 'is', 
                  (as.integer(n1)-as.integer(n2)), 'which is', 
                  100*(as.integer(n1)-as.integer(n2))/as.integer(n1),
                  '% of', n1 )#cat  
             )#return
           )#trycatch

  # If no error happens, return this statement
  return ( cat('The difference between', n1, 'and', n2, 'is', n1-n2,
               ', which is', pct_diff*100, '% of', n1) )
}

# Test 1
pct_difference_error_handling(10, 3)
[OUT] The difference between 10 and 3 is 7 which is 70 % of 10

# Test 2
pct_difference_error_handling('10', '3')
[OUT] The difference between 10 and 3 is 7 which is 70 % of 10

完美!它工作得很好。现在我们来看看如何用 Python 实现相同的代码。

Python

在 Python 中编写相同的函数也非常简单。在这种情况下,我们应该使用try ... except格式。正如你可能已经得出的结论,try 是主要代码片段,但如果发生异常(错误),则运行次要代码片段,即解决方法。

# Function to calculate the percentage difference between two numbers
# with error handling
def pct_difference_error_handling(n1, n2):
  '''Function that takes two numbers and return the percentual difference
   between n1 and n2, being n1 the reference number'''

  # Try the main code
  try:
    pct_diff = (n1-n2)/n1
    return f'The difference between {n1} and {n2} is {n1-n2}, which is {pct_diff*100}% of {n1}'

  # If you find an error, use this code instead
  except:
    pct_diff = (int(n1)-int(n2))/int(n1)
    return f'The difference between {n1} and {n2} is {int(n1)-int(n2)}, which is {pct_diff*100}% of {n1}'

# Test 1
pct_difference_error_handling(10,2)
[OUT] The difference between 10 and 2 is 8, which is 80.0% of 10

# Test2
pct_difference_error_handling('10', '2')
[OUT] The difference between 10 and 2 is 8, which is 80.0% of 10

非常好。代码运行正常。

最终

我们可以在两种语言中的任何一个函数中添加finally子句。这个子句会始终运行,无论 try 块是否引发错误。因此,它可以是一个完成消息或总结,例如。

try:
  print(x)
except:
  print("There's no x")
finally:
  print("Code ended")

[OUT] 
# There's no x
# Code ended
tryCatch( print(x),
          error= print('There is no x'),
          finally= print('Code ended') )

[OUT]
#[1] "There is no x"
#Error in value[[3L]](cond) : attempt to apply non-function
#[1] "Code ended"

我知道这些函数很简单,并且有更好的方法来创建它们而不使用错误处理。然而,我认为这是最温和的方式来教你如何编写带有异常的函数。

现在轮到你把它应用到你的工作中,以帮助你解决业务问题,适用于许多不同的用例和形式。

在你离开之前

在这个快速教程中,我们学习了如何使用 R 或 Python 处理错误。

错误处理是一个编程资源,它使你的代码在遇到预期错误时仍能继续运行。在我们的示例中,这个错误是输入了字符串而不是数字。

R 错误处理:

  • 使用函数tryCatch(expression, error, finally)

在 Python 中:

  • 使用函数try: expression except: expression finally: expression

如果你喜欢这个内容,请关注我的博客获取更多信息。

[## Gustavo Santos - Medium

阅读 Gustavo Santos 在 Medium 上的文章。数据科学家。我从数据中提取见解,帮助个人和公司……

gustavorsantos.medium.com](https://gustavorsantos.medium.com/?source=post_page-----5a4d60f3fba6--------------------------------)

也可以在LinkedIn找到我。

现在,我还有一个Topmate 页面,你可以在那里预约时间,如果你想讨论数据科学的话。

参考

[## Python Try Except

try 块让你测试一块代码是否有错误。except 块让你处理错误。else 块让……

www.w3schools.com](https://www.w3schools.com/python/python_try_except.asp?source=post_page-----5a4d60f3fba6--------------------------------)

en.wikipedia.org/wiki/Exception_handling

[## 如何在 R 中编写你的第一个 tryCatch() 函数 - Statology

你可以使用 tryCatch() 函数在 R 中返回某个表达式的值,或者在出现警告时生成自定义消息…

www.statology.org](https://www.statology.org/r-trycatch/?source=post_page-----5a4d60f3fba6--------------------------------)

机器学习中的分类问题关键评估指标

原文:towardsdatascience.com/essential-evaluation-metrics-for-classification-problems-in-machine-learning-69e90665375b

了解和评估分类模型性能的全面指南

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

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

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

图片由 Markus Winkler 提供,来源于 Unsplash

你是否对评估机器学习模型性能时使用的术语感到困惑?当遇到混淆矩阵、精确度、召回率、特异性和敏感性等术语时,是否会感到迷茫?别担心,因为在这篇博客文章中,我们将深入探讨这些评估指标,帮助你理解这些术语。

什么是混淆矩阵?

让我们从混淆矩阵开始。它是用于评估分类模型性能的表格。它包含四个值:真正例 (TP)、真负例 (TN)、假正例 (FP) 和假负例 (FN)。真正例是指模型正确预测正类,真负例是指模型正确预测负类,假正例是指模型预测为正类但实际为负类,假负例是指模型预测为负类但实际为正类。

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

图片作者

什么是准确率?

准确率 是衡量模型总体表现的指标。它是模型做出的正确预测占所有预测总数的比例。换句话说,它是正确预测的正例和负例数量除以预测总数。

准确率 = (TP+TN)/(TP+TN+FP+FN)

什么是精确度?

Precision 是衡量模型正例预测准确度的指标。它的计算方法是将真正例的数量与真正例和假正例的总和之比。高 Precision 表明模型大多数时间正确预测了正类。

Precision = TP / (TP + FP)

什么是 Recall?

Recall 是衡量模型识别正类能力的指标。它的计算方法是将真正例的数量与真正例和假负例的总和之比。高 Recall 表明模型能够识别大多数正实例。

Recall = TP / (TP + FN)

什么是 Specificity?

Specificity 是衡量模型识别负类能力的指标。它的计算方法是将真正例的数量与真正例和假正例的总和之比。高 Specificity 表明模型能够识别大多数负实例。

Specificity = TN / (TN + FP)

你可以将 Specificity 视为带有不同正负标签定义的 Recall,即正标签被视为负,负标签被视为正。

什么是 Sensitivity?

Sensitivity 是 Recall 的另一种术语,特别是在医学背景下,它指的是医学测试在实际患病的个体中检测疾病或情况的能力。

Sensitivity = TP / (TP + FN)

总结表:

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

作者提供的图片

什么时候 Precision-Recall 比准确率更好的指标?

Precision-Recall 用于数据不平衡时,而不是准确率,这意味着一个类别的样本显著多于另一个类别。

在这种情况下,准确率可能会产生误导,因为模型可以通过简单地预测多数类来实现高准确率。例如,在一个二分类问题中,如果 90% 的样本属于负类,那么一个总是预测负类的模型将有 90% 的准确率,即使它没有进行任何正确的正例预测。

当数据不平衡时,我们可能会有一个准确率非常高的模型。但由于 Precision-Recall 值低,模型是无用的。

Precision-Recall 是在这种情况下衡量模型性能的更好指标,因为它考虑了真正例和假正例的比例,以及假负例和真正例,这些在不平衡数据集中更为关键。Precision 衡量的是所有正例预测中真正例预测的比例,而 Recall 衡量的是所有实际正例样本中真正例预测的比例。

Precision-Recall 更适合用于评估不平衡数据集中的模型性能,而准确率在类别平衡时更为合适。

什么是 Precision-Recall 权衡?

理想情况下,我们希望我们的模型具有高精确度和高召回率。通常很难同时实现这两者。

精确度-召回率权衡的出现是因为优化一个指标通常会以另一个指标为代价。

这是为什么

  • 如果一个模型在预测中更为保守,它可能通过减少假阳性的数量来实现更高的精确度,但这也可能导致召回率降低,因为它可能会遗漏一些真实的正例。

  • 相反,假设一个模型在预测中更为激进。在这种情况下,它可能通过捕获更多的真实正例来实现更高的召回率,但这也可能导致精确度降低,因为它可能会产生更多的假阳性预测。

因此,为了确定我们应该优先考虑精确度还是召回率,我们需要评估假阳性和假阴性的成本。

在情况 1 中,设计了一种医学检测测试来检测人们是否患有疾病。

  • 假阴性案例的成本可能是——病人未能接受正确的治疗,如果疾病具有传染性,可能导致更多人感染。

  • 另一方面,假阳性案例的成本可能是——浪费资源治疗健康人群,并不必要地将其隔离。

因此,假阴性案例的成本远高于假阳性案例的成本。在这种情况下,更关注召回率更为合理。

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

图片由作者提供

在情况 2 中,一家银行设计了一个机器学习模型来检测信用卡欺诈。

  • 假阴性案例的成本可能是——银行在欺诈交易中损失金钱。

  • 假阳性案例的成本可能是——虚假的欺诈警报影响了客户体验,导致客户留存率下降。

因此,假阳性案例的成本远高于假阴性案例的成本。根据关于信用卡欺诈的研究,假阳性信用卡欺诈的损失收入是实际欺诈的 13 倍。在这种情况下,更关注精确度更为合理。

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

图片由作者提供

什么是 F1-Score?

在上述示例中,我们尝试优先考虑召回率或精确度,但这可能以牺牲另一个指标为代价。然而,也有许多情况,其中召回率和精确度是 同等重要的。在这种情况下,我们应使用另一种度量标准,称为 F1 分数。

F1 分数考虑了精确度和召回率,并提供一个总结模型整体表现的单一分数。其范围从 0 到 1,得分为 1 表示完美的精确度和召回率。

计算 F1 分数的公式是:

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

它也可以通过精确度和召回率的调和平均数来计算:

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

接收者操作特征曲线(ROC 曲线)和曲线下面积AUC)是什么?

接收者操作特征(ROC)曲线是二分类模型性能的图形表示,它预测事件发生的概率。ROC 曲线是通过将真正例率(TPR)与假正例率(FPR)在不同阈值设置下绘制出来的。

TPR=TP/(TP+FN)

FPR=FP/(FP+TN)

让我们考虑一个二分类问题的例子,我们希望预测一封电子邮件是否是垃圾邮件。假设我们有一个模型,它预测电子邮件是垃圾邮件的概率,我们希望使用 ROC 曲线来评估其性能。

要创建 ROC 曲线,我们需要设置一个阈值(即从 0 到 1),根据这个阈值我们将电子邮件分类为垃圾邮件,低于这个阈值则分类为非垃圾邮件。阈值是决定真正例率(TPR)和假正例率(FPR)之间权衡的决策边界。

例如,如果我们将阈值设置为 0.5,则任何预测概率大于 0.5 的电子邮件将被分类为垃圾邮件,而任何预测概率小于或等于 0.5 的电子邮件将被分类为非垃圾邮件。这个阈值会给我们一定的 TPR 和 FPR。

通常,随着阈值的增加,TPR 和 FPR 都会减少。在最极端的情况下,当阈值为 0 时,所有预测值都是正的,因此 TPR=FPR=1。相反,当阈值为 1 时,所有预测值都是负的,因此 TPR=FPR=0。

假设对于给定的数据集,我们计算了各种阈值下的 TPR 和 FPR,得到如下结果:

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

作者提供的图像

我们可以将这些值绘制在 ROC 曲线上,y 轴为 TPR,x 轴为 FPR,如下所示:

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

作者提供的图像

从图中可以看出,ROC 曲线是不同阈值下 TPR 和 FPR 之间的权衡。

曲线下面积AUC)衡量模型的整体性能,AUC 为 1 表示完美的性能,AUC 为 0.5 表示随机猜测(即表示随机预测的对角线)。

ROC 的主要要点:

  • 当类别平衡且假正例和假负例的成本相似时,ROC 在评估不同模型时效果更好。AUC-ROC 值越高,模型越好。

  • 从 ROC 曲线中,我们可以选择最佳阈值,这取决于分类器的应用目的——如果假阳性和假阴性的成本相似,那么接近 ROC 曲线左上角的阈值是最佳的。如果假阳性和假阴性的成本较高,我们可以选择较高的阈值。相反,如果假阴性和假阳性的成本较高,我们可以选择较低的阈值。

  • ROC 是阈值不变的。它测量了模型在一系列阈值下的表现。这意味着我们不需要提前使用 ROC 确定阈值,与基于特定阈值的精确度、召回率、准确性和 F1 分数不同。

什么是精确度-召回曲线(PRC)?

与绘制 TPR 和 FPR 的 ROC 曲线相比,精确度-召回曲线(PRC)在 y 轴上绘制精确度,在 x 轴上绘制召回率。PRC 曲线显示了模型在识别正例时如何避免假阳性。

PRC 曲线下面积可以衡量模型的性能。AUC-PRC 值越高,模型越好。AUC-PRC 为 0.5 的模型不比随机猜测好,而 AUC-PRC 为 1.0 的模型是完美的。

一般来说,随着阈值的增加,精确度会提高,而召回率会降低。在最极端的情况下,当阈值为 0 时,所有预测值都是正值,因此,召回率=1,精确度=0。相反,当阈值为 1 时,所有预测值都是负值,因此,召回率=0,精确度=1。

假设对于给定的数据集,我们计算了各种阈值下的精确度和召回率,并得到了以下结果:

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

图片由作者提供

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

图片由作者提供

PRC 的关键要点:

  • 在 ROC 和 PRC 曲线之间的选择取决于当前的问题。当类别平衡且假阳性和假阴性的成本相似时,ROC 曲线是有用的。PRC 曲线在类别不平衡或假阳性和假阴性的成本不同的情况下很有用。

  • 通过查看 PRC,你可以选择一个最佳阈值,根据你的具体使用案例平衡精确度和召回率。

我们已经覆盖了许多分类问题的评估指标。这些指标是相互关联的,每个指标在衡量模型准确性方面都有其优缺点。总体而言,理解这些指标对于开发有效的机器学习模型并根据预测做出明智的决策至关重要。

如果你想了解更多与统计学相关的文章,请查看我的文章:

感谢阅读!

如果你喜欢这篇文章,请点击掌声图标。如果你想看到我和其他数千位作者在 Medium 上的更多文章,你可以:

  • 订阅我的新闻通讯,以便在我发布新文章时收到邮件通知。

  • 注册成为会员以解锁对 Medium 上所有内容的完全访问权限。

机器学习的必读资料

原文:towardsdatascience.com/essential-readings-in-machine-learning-250980e30585?source=collection_archive---------9-----------------------#2023-01-12

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

·

关注 发布于 Towards Data Science · 作为 Newsletter 发送 · 3 min read · Jan 12, 2023

如果你在新的一年里希望扩展你对机器学习的知识,你来对地方了。无论你对算法、超参数调整还是 MLOps 有多少经验,你都可以找到多种进入这个主题的途径,而我们的作者——他们中的许多人都是经验丰富的 ML 专家——在将复杂概念转化为引人入胜且可操作的帖子方面具有特殊的天赋。

本周,我们精选了最近几周发布的一些最佳 ML 文章,包括初学者指南和更高级的教程及项目演练。选择一篇,或者阅读几篇,你一定会学到一些新东西。

  • 熟悉 ML 管道Chayma Zatout 说:“在生产环境中实施机器学习对许多公司来说可能是一个具有挑战性且耗时的过程,”这就是为什么 MLOps 已成为全局思考机器学习工作流的关键方法。阅读 Chayma 的帖子,获得对这一关键主题的通俗易懂的基础介绍。

  • 决策树,耐心解释。如果你渴望亲手操作一个实际模型,不要错过Frauke Albrecht的首篇 TDS 文章。这是一篇详细的逐步教程,展示了如何为分类问题构建决策树,涵盖了底层数学 以及 Python 实现。

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

Tabea Schimpf 摄影,来源于 Unsplash

  • 深入了解推荐系统Wen Yang 最近获得了她公司创新日奖,她的最新帖子带我们了解了获得该奖项的项目:一个基于机器学习的工具,为自然爱好者推荐远足路线。这是对在紧张时间内构建和训练模型的迷人探索,同时也是在黑客马拉松中取得成功的有用路线图。

  • 全面的特征工程指南。优化你训练的模型的数据可能是你项目成功的决定性因素。Dominik Polzer 对特征工程的深入探讨涵盖了七种常见的方法(从编码和向量化到特征交叉),并展示了如何将这些方法应用于真实数据集。

  • 仰望星空(它们真的是星星吗?)。如果你热爱机器学习和天文学,不要错过Mohammed Saifuddin的最新文章。它探讨了恒星分类问题——如何根据光谱特征将给定的天体识别为恒星、类星体或星系——并辅以详尽(且解释清晰)的建模过程。

  • **解决业务问题的最佳机器学习方法是什么?**随着越来越多的公司依赖机器学习来处理关键任务,如流失预测,选择正确的方法变得至关重要。Samuele Mazzanti最近解开了一个特别常见的困境:是依赖多个专门模型更好,还是选择一个通用模型更佳。

  • 超越机器:探索基于规则的学习Khuyen Tran的教程核心是一个重要观察:人类直觉和专业知识可以提升机器学习模型的表现。她接着展示了如何利用 human-learn Python 包来实现两全其美的结果。

一如既往,感谢您对我们工作的支持。为了最大限度地发挥影响力,考虑成为 Medium 会员

直到下一个变量,

TDS 编辑

使用滚动回归估计时间变化系数

原文:towardsdatascience.com/estimating-time-varying-coefficients-with-rolling-regression-66aca1f2c3f6

高斯随机游走作为回归系数的先验

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

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

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

照片由Myriam Jessier拍摄,来源于Unsplash

回归分析中的一个挑战是考虑到预测变量与响应变量之间的关系可能随时间变化的可能性。

从数据科学到计量经济学

数据科学家们经常遇到这样的情况:业务中存在假设,我们的模型必须考虑到它们可能是正确的。

普通回归模型在估计 E[Y|X]方面表现出色。Xᵢ(或βᵢ)的系数可以解释为当Xᵢ增加 1 时 Y 的增量变化。在计量经济学中,常常假设βᵢ随着时间变化,我们可以称之为βᵢₜ。我们真正尝试估计的是 E[Y|X,Time]。下面是一个公司的 2 年收入图表——它是一个季节性业务,没有理由相信β也依赖于时间。

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

图片由作者提供

在这篇文章中,我们将介绍回归中的时间变化系数的概念,并展示如何将其应用于市场营销组合模型。如果你还没看过,请查看我在Medium 系列上关于从零开始构建 MMM 的所有要素。简单回顾一下,市场营销组合模型是一个统计工具,帮助营销人员衡量不同营销活动(如广告、定价、促销等)对销售或其他结果的影响。一个典型的市场营销组合模型可以表示为:

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

其中yₜ是时间t的结果变量(如销售额),xᵢₜ是时间t的预测变量(如广告支出、价格等),βᵢ是衡量每个预测变量对结果变量影响的系数,Ɛₜ是误差项。

然而,这个模型假设系数在时间上是恒定的,这在某些情况下可能不现实。例如,广告对销售的影响可能会根据季节性、产品生命周期、竞争环境等因素而变化。为了捕捉这种变化,我们可以在回归中使用时间变动系数,使系数作为某些其他变量的函数随时间变化。例如,我们可以写:

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

其中*βᵢ(t)*现在是时间或其他变量的函数,这些变量捕捉了系数的动态变化。有不同的方式来指定这些函数,如使用样条函数、多项式、随机效应等。函数的选择取决于数据的性质和研究问题。

高斯随机游走

当媒体的效果随着时间变化时,可以通过时间变动的函数来捕捉系数。最受欢迎的选择之一是高斯随机游走。

你可能会感兴趣的是,这个过程被用来建模金融数据,如股票或黄金。

高斯随机游走是一种随机过程,模拟独立且同分布的随机变量的累计效应。它也被称为正态随机游走或维纳过程。高斯随机游走可以用一系列随机变量X₁X₂、…、Xₙ来表示,其中每个Xᵢ都服从均值为 0、方差为 1 的正态分布,并且前 3 个变量的总和

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

是随机游走者在时间 n 的位置信息。高斯随机游走有一些重要的特性,如是马尔可夫过程、具有平稳增量,以及在概率上是连续的。

贝叶斯时间变动 MMM 的代码

这是我在这篇文章中构建的 PyMC 模型的升级版本。我添加了按周、季度、学期或年变化的系数代码。这种回归形式也常被称为滚动回归。

让我们看看代码中有什么变化。

首先,你会注意到这个模型现在被包装在一个函数 BayesianMMM 中。这是为了方便,我们可以用不同的参数来运行它。这个示例接受一个名为splits的参数,用于决定时间的粒度定义——按周(W)、按季度(Q)、半年(H)或年比年(YoY)。

你还会注意到,PyMC 模型本身接受一个名为coords的参数,这本质上是你的时间变量。如果你选择每周变化系数,时间变量将是1…104。如果选择季度,则为1,1,1…,2,2,2…,3,3,3…4,4,4…,1,1,1…(记住,这是 2 年的数据)。

接下来,我们的系数现在是一个 GaussianRandomWalk 变量,而不是 TruncatedNormal。就像之前一样,我们在位置先验处初始化它(如果你不记得了,请回到这里)。在这种设置中,每个时间段都有自己的系数,但这些系数在连续时间段之间共享信息。 这是滚动回归的最大优势。

现在让我们来看看三个案例研究。

案例研究 1 — 上漏斗的媒体策略如何随着时间的推移而变化?

上漏斗营销指的是旨在生成潜在客户的意识和兴趣的活动,这些潜在客户尚未准备好购买。这通常很难衡量,因为它不会直接导致转化或销售,而是以微妙和长期的方式影响客户的旅程。然而,了解哪个渠道更有效以及趋势随时间的变化是有帮助的。

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

图片由作者提供

从中得出了非常有用的知识。在时间段开始时,直邮长期以来表现最差,直到它超过了电视。轶事证据证实,随着 CTV 的出现,电视的效果随时间逐渐减弱。

另一个观察是 CTV 的效果随时间的推移高于 Email。这些观察是有趣的,但在没有 A/B 测试的情况下,我们不能得出结论。

案例研究 2 — 我的业务是季节性的,在假日季节获得最多收入。

营销人员不应假设付费搜索的效果在全年保持不变,而应根据季度的波动和机会调整他们的活动。然而,尤其在零售和电子商务中,可以观察到一些一般趋势。

付费搜索的效果在第四季度通常较高,尤其是在假日季节,当在线购物活动增加,消费者更可能点击提供折扣、交易或礼品建议的广告时。相反,付费搜索的效果在第一季度可能会下降,当时消费者需求下降,广告商面临较低的转化率和较高的点击成本。第二和第三季度可能显示出更稳定或适中的结果,具体取决于特定行业和市场条件。

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

图片由作者提供

我们发现付费搜索的效果在第四季度如预期的那样最高。

案例研究 3 — 我想衡量媒体效果的年同比趋势。

年度趋势是指从一年到下一年发生的关键绩效指标(KPI)变化。它们可以帮助营销人员设定现实目标,调整预算,并根据有效和无效的情况优化战术。

通过分析历史数据、进行市场研究以及测试不同策略,营销人员可以优化他们的付费搜索效果,并在每个季度实现他们的目标。出版商的指导和内部 A/B 测试也可以帮助确定投资回报率(ROI)最高的时间。最后,这一切有助于校准我们的 MMM。

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

作者提供的图片

我们看到同比付费搜索效果提高了大约 2%。类似的趋势经常被报告,并归因于营销部门的成功。

结论

如果你跟随了我的 MMM 系列文章,你会发现我强调了你的 MMM(或任何其他测量方法)能够被利益相关者使用的重要性。时间变系数有助于回答许多可能会问到的普通 MMM 无法解答的问题。通过贝叶斯优化技术,我们可以对模型代码进行小的调整,使其本质上能够回答这些问题。

在回归分析中使用时间变系数的一个优势是它可以提供更准确和灵活的预测变量对结果变量影响的估计。它还可以帮助识别这些影响何时以及如何变化,以及驱动这些变化的因素。这可以帮助营销人员设计更有效和高效的营销策略,并优化他们的营销组合。

感谢阅读😊

估算总体实验影响

原文:towardsdatascience.com/estimating-total-experimentation-impact-ab6cd56bffb

如何控制在衡量组织整体影响时的虚假发现和选择偏差

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 贾雷德·M·马鲁斯金,博士

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

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

图片由 CHUTTERSNAP 提供,Unsplash

介绍

数据驱动的组织经常在任何给定时间进行数百或数千个实验,但所有这些实验的净影响是什么?一种简单的方法是将所有实验中显著且正面的处理效果的均值差异相加,并且这些实验已经投入生产。然而,这种估计可能极其有偏,即使我们假设各个实验之间没有相关性。我们将进行 10,000 个实验的模拟,并展示这种简单方法实际高估了影响 45%

我们回顾了一个理论偏差修正公式,由 李和申 [1] 提出。然而,这种方法存在两个缺陷:首先,尽管它在理论上是无偏的,但我们表明其相应的插件估计器由于与原始问题类似的原因仍然存在显著偏差。其次,它未能将影响归因于个体级实验。

在本文中,我们探讨了两个偏差来源:

  • 虚假发现偏差 — 由于假阳性使估计值被夸大;

  • 选择偏差 — 由于决策标准引入的偏差使估计值被夸大:对处理效果的低估被审查(假阴性),而高估则被奖励。

为了解决虚假发现问题,我们将构造一个概率,表示某一结果实际上为非零。这个概率是通过将 p 值密度与真实零假设的残差密度进行比较来构造的。

为了解决选择偏差,我们将为每个实验结果计算后验分布,使用经验分布作为我们的先验,并对假发现进行校正。

这一过程提供了我们模拟系列实验中平均实验影响的准确估计,将仅使用经验测量得到的原始*45%误差降低到 0.4%*误差。

效应分布

所以我们进行了很多实验,并希望量化我们所传递的总实验影响。为此,我们需要考虑效应分布,即治疗效应的分布。为了使这一点更加清晰,可以想象进行许多实验。每个实验都有一个真实的效应值θ,我们可以将其视为从某种真实效应分布p中抽取的随机变量。每个实验然后通过Xᵢ(我们可以视其为均值差异的平均值)来估计θᵢ。因此,我们得到如下的观察模型:

这里,σᵢ² ~ 1/nₛ,其中nₛ 是样本大小。我们将真实效应分布视为三种子群体的混合:真实零效应、正效应和负效应。为了描述效应分布,我们考虑三个参数:

  • λ = P(θ != 0) (有效性): 具有非零效应的实验所占的比例,

  • κ = P(θ > 0 | θ != 0) (不对称性): 在具有非零效应的实验中,具有正向效应的实验所占的比例,

  • ρ = P(θ > δ | θ > 0) (优势): 在那些具有正向(显著)效应的实验中,实际显著效应(即效应值大于δ)的实验所占的比例。

这些参数在下图中进行了说明。

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

治疗效应的分布: (1-λ) 为零,κ λ 为正,κ λ ρ 为实际显著。图像由作者提供。

对于较新的产品,可能容易提出产生显著效应的特性想法,因此λ会很高。然而,对于成熟的产品,实验导致显著变化的情况可能非常少见,λ 会较低。

同样,一个团队可能非常擅长提出实际产生正向效应的产品改进想法,使得κ > 1/2,而另一个团队可能提出了一堆导致性能下降的糟糕想法,使得效应趋向于负向,从而κ < 1/2

理论偏差估计器

考虑随机集合A,其中包含一系列实验中的正向显著结果,决策标准为X_i > c。定义总的真实效应和估计效应为

总期望偏差可以描述为b = E[Sₐ— Tₐ]。如果Xᵢ ~ N(θᵢ, σᵢ)Lee 和 Shen [1] 显示总期望偏差为:

其中ϕ是标准正态分布的密度。具体细节在2中进一步回顾。这个公式有两个主要缺点:

  1. 它依赖于真实效应θᵢ。因此,要实际使用它,我们必须用观察到的效应替换真实效应,即所谓的插件估计器。在我们的仿真中,我们展示了插件估计器可能导致显著偏差的估计。(我们还将展示如何通过考虑虚假发现来纠正这一点。)

  2. 求和是针对所有实验的,不仅限于那些有显著正结果的实验。因此,即使纠正了第一个问题,它也无法提供个别实验水平的影响估计,即所谓的归因问题

模拟实验平台

一些假设

让我们首先对我们分析的实验集做一些假设:

  • 每个实验测量相同顶线指标的均值差异(例如 DAUs、花费时间、收入);

  • 每个实验都使用相同的显著性水平α和效能β来计算效应大小δ(这是实际具有实际意义的最小效应);

  • 因此,每个实验具有相同的样本大小nₛ和拒绝标准Xᵢ > c

为了计算目的,我们将使用α = 0.05β = 0.8来计算效应大小δ = 0.1,这将得到c = 0.07 和nₛ = 785。注意:我们将α视为双侧显著性。实际的显著性对于正向测试是α/2

Python 中的仿真

接下来,我们在 Python 中构建一个模拟实验平台,如下所示。

class PlatformSim:
    def __init__(self, alpha=0.05, beta=0.80, delta=0.1):
        self.alpha, self.beta, self.delta = alpha, beta, delta
        self.z_crit = stats.norm.isf(self.alpha/2)
        self.n_s = int(np.ceil(delta**(-2) * (stats.norm.isf(alpha/2) - stats.norm.isf(beta))**2))
        self.theta_crit = self.z_crit / np.sqrt(self.n_s)

    def run(self, n, lambda_=0.2, kappa=0.5, rho=0.2, shape=3):
        self.n_null = int(n * (1 - lambda_))
        self.n_pos = int(n * lambda_ * kappa)
        self.n_neg = n - self.n_null - self.n_pos 
        # compute thetas
        thetas_null = np.zeros(self.n_null)
        scale = self.delta / scipy.stats.gamma.isf(rho, shape)
        thetas_pos = +np.random.gamma(shape, scale=scale, size=self.n_pos)
        thetas_neg = -np.random.gamma(shape, scale=scale, size=self.n_neg)
        self.thetas = np.concatenate((thetas_null, thetas_pos, thetas_neg))
        # for each theta, simulate result of an experiment        
        np.random.shuffle(self.thetas)
        self.x_values, self.z_values, self.p_values = self.simulate_results(self.thetas)
        self.results = (self.z_values > self.z_crit).astype(int)

    def simulate_results(self, thetas):
        X = np.random.normal(loc=thetas, size=(self.n_s, len(thetas)))
        self.X = X
        x_values = X.mean(axis=0)
        z_values = x_values * np.sqrt(self.n_s)
        p_values = 2 * stats.norm.sf(np.abs(z_values))
        return x_values, z_values, p_values

我们首先将*(1-λ)*的实验指定为真实的虚无效应。

对于其余的实验,我们使用伽马分布,确保在δ处生存函数为ρ

使用PlatformSim类,我们可以用几行代码运行仿真。我们将结果放入数据框df中,并为正向结果创建一个单独的数据框dfs。*注意:*这可以很容易地修改为建模不同的正向/负向分布。然而,为了我们的仿真,我们使用了伽马随机变量。

P = PlatformSim(alpha=0.05, beta=0.8, delta=0.1)
P.run(10000, lambda_= 0.2, kappa=0.5, rho=0.3, null_type=null_type, pos_type=pos_type, shape=3)
df = DataFrame({'theta': P.thetas, 'x': P.x_values, 'z': P.z_values, 'p': P.p_values, 'result': P.results})
df.sort_values('p', inplace=True, ignore_index=True)
dfs = df[df.result==1]
effect = dfs.theta.mean()
print(f"Average Effect (Actual): {round(effect, 6)}")  
print(f"Average Effect (Observed): {round(dfs.x.mean(), 6)}     REL: {100*round(dfs.x.mean() / effect - 1, 2)}%")  
print(f"False Discovery Rate: {round(100*len(dfs[dfs.theta <= 0]) / len(dfs), 2)}%") 
sig_i = 1 / np.sqrt(P.n_s)
imp_b = (dfs.x.sum() - sig_i * scipy.stats.norm.pdf((P.theta_crit - df.x) / sig_i).sum()) / len(dfs)
imp_0 = (dfs.x.sum() - sig_i * scipy.stats.norm.pdf((P.theta_crit - df.theta) / sig_i).sum()) / len(dfs)
print(f"Bias-Corrected True      Estimate: {round(imp_0, 6)}     REL: {round(100* imp_0 / dfs.theta.mean() - 100, 2)}%")
print(f"Bias-Corrected Empirical Estimate: {round(imp_b, 6)}     REL: {round(100* imp_b / dfs.theta.mean() - 100, 2)}%")
# Output ~
# Average Effect (Actual): 0.079171
# Average Effect (Observed):  0.113245    REL: 43.0%
# False Discovery Rate:  27.04%
# Bias-Corrected True      Estimate:  0.079023     REL: -0.19%
# Bias-Corrected Empirical Estimate:  0.062471     REL: -21.09%

使用我们的仿真,我们可以轻松地测量具有显著正效应的实验的观察到的平均处理效应和实际处理效应。在这个仿真中,真实的平均效应是0.0792,而我们测得的效应是0.1132,误差为+43%!我们还观察到 27%的虚假发现率。

我们还观察到,当使用真实的θᵢ时,理论偏差修正公式的效果非常好,误差为 0.19%,但当使用插件估计器时,效果不佳,产生了 21%的误差。理论估计器对偏差进行了过度修正。这是由于真实的虚无效应数量庞大,并且偏差公式拾取了随机分布在右侧的观测值,但没有拾取左侧的观测值,因为估计器值在接近决策边界的观测值处达到峰值。

我们可以绘制效应分布的直方图。下面是实际效应的直方图,正向测试结果用橙色突出显示。

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

真实效应的分布,橙色代表正结果。图片来源于作者。

我们注意到有大量假阳性,远远超过我们的α/2 = 2.5%显著性水平。假阳性与总体阳性的比例称为假发现率,我们将讨论如何估计和调整它。

现在,在进行一系列实验时,我们无法获得这种真实的治疗效应分布,而只能获得观察到的治疗效应分布,如下图所示。在这里,我们用橙色突出显示那些实际具有正效应的实验。这一视角使我们深入了解第二种我们必须解决的偏差类型:选择偏差

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

测量效应的分布,橙色代表实际存在效应的实验。决策边界由虚线垂直线表示。图片来源于作者。

为了理解选择偏差,考虑到假阴性的真实效应在垂直虚线的右侧。对于每个散布在左侧的实验,将有一个散布在右侧。因此,假阴性可以被视为对实际阳性的过高估计。选择过程本身因此产生了一种偏差:只有当观察到的效应大于c时,我们才会将结果视为统计显著。因此,我们选择那些随机具有比其真实效应更高效应的观察结果,而忽略了那些效应较低的观察结果。上述图中突出显示的所有假阴性“平衡”了测量效应被夸大的真正阳性。

假发现

在本节中,我们讨论λκ、功效和假发现率之间的一些理论关系。我们将在本说明中的模拟中使用这些关系。

估计λκ

为了使用实践中可用的观察数据来估计假发现率,我们首先需要估计总体参数λκ

要估计λ,我们考虑导致统计显著结果的实验的比例f。这些包括真正的阳性和假阳性。在*(1-λ)没有效应的实验中,我们期望α (1 — λ)产生假阳性。在λ具有实际效应的实验中,我们期望βₐ λ产生真正的阳性,其中βₐ*是这组实验的平均功效。因此,显著结果的预期比例由以下公式给出

这可以重新排列以生成估计值

其中βₐ是观察到的显著结果的平均功效。(我在显示的方程中使用了β^*表示βₐ,但它们是相同的。)

估计假发现率

虚假发现率(FDR)是指正结果中虚假正例的比例。我们在模拟中观察到了 27%的虚假发现率。

要估计这个,我们需要 平均正功效

这里,β(θ) = P(X > c | θ) 是观察到正显著效应的概率,给定 θ。接下来,我们将假设平均负功效 β₋ 可以忽略不计。

FDR 可以通过贝叶斯定律表示为

我们稍后将使用此公式来获得 27.6%的虚假发现率估计。这个近似等式提醒我们,我们忽略了负分布的功效,而在我们的模拟中,这一功效是可以忽略的。

密度估计和 p-概率

我们接下来探索一种方法,通过两步法调整虚假发现偏差:

  • 确定每个正结果是正确正例的概率;

  • 计算折扣平均处理效应,其中我们按其为虚假正例的概率对每个实验的效应进行折扣。

为了制定实验产生实际效应的概率,我们转向了 p-值。这里的关键观察是,在零假设下,p-值的分布是均匀分布。这在下面的图中很明显,该图表示了我们所有 p-值的直方图,并用橙色突出显示了实际零假设的 p-值。

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

p-值的直方图;实际零假设的 p-值以橙色绘制。图片来源于作者。

p-值的观察概率密度,并且 fₐ 表示半区间 [0.5, 1] 上的 p-值的平均概率密度。我们可以推断 fₐ 是真实零假设的平均概率密度,它在整个区间 [0, 1] 上是恒定的。

p-值方面,当 p < α = 0.05 时,我们拒绝零假设。对于给定的实验区间,比如 pᵢ,因此实验是正确零假设的概率为 fₐ / f(pᵢ),而它是正确非零假设的概率为 πᵢ = P(θᵢ != 0 | pᵢ) = 1 — fₐ / f(pᵢ),我们定义为 p-概率。注意,这一定义是双向的:大的正观察值或负观察值将具有相等的 p-概率,仅取决于效应的大小。

经验密度函数

为了实现这一点,我们需要一个经验密度估计。标准的方法是 分箱密度估计,定义为

其中,第i个区间由b_i = [i h , (i+1)h)定义,i=0, n_b-1h=1/n_b是区间宽度。区间大小受到偏差-方差权衡的影响:如果区间大小太小,会有高方差;但如果区间大小太大,会有高偏差。这个估计的问题是概率在边界p=0附近有一个峰值。区间大小必须足够小以捕捉接近零的行为,这会导致对单位区间其余部分的次优估计,且方差较高。

因此,我们提出了一种替代的经验密度,我们称之为最近邻密度估计

在这里,NNₖ(x)表示集合{X₁, … Xₙ}中距离x最近的k个“邻居”,范围表示集合的最大值和最小值之间的差异。

分箱估计保持区间大小不变,并测量每个区间内的数据点数量,而最近邻估计保持数量固定,并测量可变的区间大小。

为了在代码中实现这一点,我们计算了p值在* [0, 1]*区间上以 0.001 间隔的最近邻密度。这在下面的代码中实现。

 def knn(x, k, X):
    """ Returns the k nearest neighbors to x from the set X """
    n = len(X)
    X = np.sort(X)
    z = np.abs(X - x)
    start = np.argmin(z)
    stop = start * 1
    k_count = 1
    while k_count < k:
        if start == 0:
            stop += (k - k_count)
            k_count = k
            break
        if stop == n-1:
            start -= (k - k_count)
            k_count = k
            break
        if z[start-1] < z[stop+1]:
            start -= 1 
        else:
            stop += 1
        k_count += 1
    return X[start:stop+1]
# KNN-density estimate 
k, n_b = 200, 10000 # k, number of bins
h = 1 / n_b # bin size 
t = np.linspace(0, 1, n_b+1).round(4)
fp_knn = np.zeros(n_b+1)
for i in range(n_b+1):
    xnn = knn(t[i], k, df.p.values)
    fp_knn[i] = k / len(df) / (np.max(xnn) - np.min(xnn))
fp_base = fp_knn[t > 0.5].mean()
p_map = {p:f for p, f in zip(t, fp_knn)}
df.loc[:, 'f_p'] = df.p.apply(lambda x: p_map[round(x, 4)])
df.loc[:, 'p_prob'] = df.f_p.apply(lambda x: max(0, 1 - fp_base / x))
dfs = df[df.result==1] # positive significant results (for later)
dfs = dfs.reset_index(drop=True)

数值计算得到的密度函数在下图中绘制,并附有p值的归一化直方图。

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

p值的直方图;经验最近邻密度函数。图片作者提供。

估计假发现率

现在我们使用我们的p概率来估计假发现率,使用之前的计算,如下所示。

df.loc[:, 'power'] = stats.norm.sf(P.z_crit, np.abs(df.z))
beta_ = np.average(df[df.x > 0].power, weights=df[df.x > 0].p_prob) # average power of positive results
kappa_hat = np.average((df.x>0), weights=df.p_prob)
frac_sig = (np.abs(df.x) > 0.07).mean()
beta_0 = np.average(df.power, weights=df.p_prob) ## Two-sided average prob. of sig result
lambda_hat = (frac_sig - alpha) / (beta_0 - alpha)
FDR_hat = alpha*(1-lambda_hat) / (alpha*(1-lambda_hat) + 2 * beta_ * lambda_hat * kappa_hat)
# Outputs
# lambda     : 0.164780
# beta_      : 0.666541
# kappa      : 0.498272
# FDR true   : 0.270448
# FDR_hat    : 0.276170

这导致估计的假发现率为 27.6%,而实际的真实率为 27.0%。

纠正假发现的影响估计

我们还可以使用我们的p概率来控制假发现。

bias_sum = np.average(scipy.stats.norm.pdf((P.theta_crit - df.x) / sig_i), weights=df.p_prob) * df.p_prob.sum()
bias_sum += scipy.stats.norm.pdf((P.theta_crit - 0) / sig_i) * (len(df) - df.p_prob.sum())
imp_pcor = (dfs.x.sum() - sig_i * bias_sum) / len(dfs)
print(f"P-Corrected Average Effect : {round((dfs.x * dfs.p_prob).mean(), 6)}     REL: {round(100* (dfs.x * dfs.p_prob).mean() / dfs.theta.mean() - 100, 2)}%")
print(f"P-Corrected Bias Estimate  : {round(imp_pcor, 6)}     REL: {round(100* imp_pcor / dfs.theta.mean() - 100, 2)}%")
# Output
# P-Corrected Average Effect : 0.089668     REL: 13.26%
# P-Corrected Bias Estimate  : 0.082046     REL: 3.63%

在这里,我们重新计算了理论偏差估计,通过将每个观测值按其对应的p概率加权,得到一个误差为 3.6%的近似影响。(比之前未经修正的估计好得多!)这也大大改进了我们的经验观察影响估计,现在的误差仅为 13.3%。

选择偏差

真实正例的校准

为了了解导致选择偏差的原因,我们可以按观察到的影响X对数据进行分箱,过滤真实正例,并绘制每个区间内的实际影响。这在下面的校准图中显示。

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

理论(蓝色)和观察(红色)平均影响,经过真实正例过滤,并按观察到的均值差异分箱。图片作者提供。

后验估计

给定总体,θᵢ的期望值不再是观察到的均值Xᵢ。为了考虑总体效应,我们将改为考虑每个单独实验的后验效应分布 P(θᵢ | Xᵢ)。对于先验,我们将仅使用我们所拥有的最佳信息:调整过的p概率的经验分布。

其中πᵢ是第i个实验的p概率。因此,我们对每个观察点进行加权,以反映其作为真实非零结果的概率,然后将所有实验的零概率在原点合并。

θ的后验分布对于第i个实验可以表示为

其中nₛ是该实验的样本大小。(回忆一下Xᵢ是样本大小nₛ上的平均值。)

我们可以在 EffectDistribution 类中实现这些公式,如下所示。init 方法计算先验,而 getUpdate 方法返回后验。

class EffectDistribution:

    def __init__(self, x, p_prob, sort=True):
        x, f = list(x), list(p_prob)
        if (0 not in x):
            x.append(0)
            f.append(len(p_prob) - p_prob.sum())
        pmfmat = np.array([x, f])
        if sort:
            pmfmat = pmfmat[:, pmfmat[0, :].argsort()]
        self.x, self.pmf = pmfmat[0, :], pmfmat[1, :]
        self.zero_loc = np.argmin(np.abs(self.x)) 
        self.normalize()

    def __len__(self):
        return len(self.x)

    def normalize(self):
        self.pmf /= self.pmf.sum()

    def getProbNull(self):
        return self.pmf[self.zero_loc]  

    def getSample(self, n, pmf=None, prob=1):
        pmf = self.pmf if pmf is None else pmf
        sample = np.random.choice(self.x, size=n, replace=True, p=pmf)
        mask = np.random.choice([0, 1], size=n, replace=True, p=[1-prob, prob])
        return mask * sample

    def getUpdate(self, x_mean, n, sigma=1, inplace=False):
        pmf = self.pmf * np.exp(-n * self.x * (self.x - 2 * x_mean) / (2 * sigma**2))
        if inplace:
            self.pmf = pmf 
            self.normalize()
            return
        return pmf / pmf.sum()

现在我们可以遍历所有正显著结果,为每个结果计算新的预期影响以及来自后验分布的随机样本。

n_boot = 1000
B = np.zeros((len(dfs), n_boot))
E = EffectDistribution(df.x, df.p_prob)
for i, row in dfs.iterrows():
    pmf_ = E.getUpdate(row.x, P.n_s)
    dfs.loc[i, 'theta_hat'] = np.average(E.x, weights=pmf_)
    B[i, :] = E.getSample(n_boot, pmf=pmf_) #, prob=row.p_prob)
bootstrap_means = B.mean(axis=0)
print(f"POSTERIOR CORRECTED Estimate       : {round(dfs.theta_hat.mean(), 6)}     REL: {round(100*dfs.theta_hat.mean() / dfs.theta.mean() - 100, 2)}%")
# POSTERIOR CORRECTED Estimate       : 0.079478     REL: 0.39%

我们称这一过程为后验效应影响估计,因为它基于每个单独实验的后验分布。我们的最终校正估计显示 0.39%的误差,尽管自助法置信区间为(-3.3%,4.0%)。自助样本如下面所示。

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

后验-效应自助法估计。图片由作者提供。

此外,我们可以查看整体最终校准图(未筛选真实正例!):

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

校准图,显示了后验效应估计(蓝色)和实际影响(红色),按观察值进行分箱。对角线虚线表示未经校正的估计 X=X。图片由作者提供。

结论

在进行一系列大规模实验时,由于虚假发现选择,真实的总体影响往往会有所偏差。

此外,我们发现这些偏差在真实零结果的高比例λ下会加剧。这表明运行高质量实验至关重要,这些实验更有可能真正产生有意义的影响。另一方面,试验你能想到的一切,看看什么有效的方法会导致高虚假发现率和高偏差。这一挑战对于较成熟的产品来说更难,因为很难提出新的有意义的想法,而对于较新的产品来说,许多变化可能会带来产品改进。

为了纠正这些偏差,必须在两步过程中考虑所有实验的总体

  1. 使用p值计算每个实验实际上是非零结果的概率。

  2. 使用p概率校正的经验分布(所有结果)作为先验,计算每个正显著结果的效应的后验分布。

在我们的模拟中,简单观察的平均影响与真实效应相比产生了 45%的误差;对*p-*概率的校正将此误差降低到 13%,而最终的后验估计将误差进一步降低到 1%以下,置信区间为±3%。

额外阅读

如需更数学化的方法,请查看[1]。该论文提供了一个明确的公式,用于修正测量影响时的总体偏差。

[1] M.R. Lee 和 M. Shen,赢家的诅咒:在线控制实验中特征总效应的偏差估计(2018),KDD 18: 第 24 届 ACM SIGKDD 国际知识发现与数据挖掘大会论文集,2018 年 7 月,第 491–499 页

2 M. Berk,如何衡量团队的 A/B 测试影响(2021),Towards Data Science, 2021 年 6 月。

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

机器学习项目中的伦理考虑

原文:towardsdatascience.com/ethical-considerations-in-machine-learning-projects-e17cb283e072

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

图片由 Dall-E 2 提供。

在构建 AI 系统时不要忘记这些话题

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

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

使用敏感数据、基于个人信息的歧视、影响人们生活的模型输出……数据产品或机器学习模型可能以多种不同方式造成伤害。不幸的是, 有很多例子 确实出现了问题。另一方面,许多项目是无害的:不使用敏感数据,项目仅仅是改进流程或自动化无聊的任务。当有可能造成伤害时,你应该投入时间关注本文的话题。

是的,数据伦理并不是你能想到的最令人兴奋的主题。但如果你想负责任地使用数据,你可能会对不同的方式感兴趣,以确保这一点。本文包含六个重要的伦理主题和调查你的模型表现的方法。还有实用工具可以帮助你做到这一点。除了对个人造成的伤害,另一个需要负责任的重要原因是伦理考虑会影响技术的信任和信誉。如果技术被视为不可信和不透明,它可能会阻碍其采用并影响其有效性。人们会失去信任,不再愿意使用 AI 产品。

治理

首个要提到的话题是 AI 治理。数据科学和 AI 的治理方面包括为确保这些技术以伦理和负责任的方式使用而制定的监管、伦理指南和最佳实践。

治理是一个高层次的术语,包含了所有以下主题及更多。具体定义在不同组织和机构中可能有所不同。大型公司通常使用框架来定义 AI 治理的各个方面。这是Meta的一个例子。像谷歌的这个团队一样,有完整的研究团队专注于负责任的 AI。

AI 治理仍在不断发展。即将讨论的主题是基础内容,一个好的 AI 治理框架至少应包含这些主题。

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

AI 治理以及本文涉及的主题。图片来源:作者。

公平性

机器学习中的公平性指的是模型的预测不应对某些人群存在不公平的偏见。在将模型应用于现实世界时,特别是在医疗和刑事司法等敏感领域时,这是一项重要的考虑因素。不幸的是,曾经出现过许多失败的例子,比如COMPAS微软的聊天机器人 Tay以及招聘抵押贷款申请中的问题。

实际上,这是机器学习中的主要伦理问题之一:通过训练数据将偏见引入模型的可能性。解决偏见引入的方式以及可以采取的缓解措施非常重要。

有不同的方法可以提高模型的公平性并减少偏见。首先是使用多样化的训练数据。使用多样化且具有代表性的训练数据集,以确保模型不会对特定群体或结果产生偏见,这是实现公平 AI 系统的第一步。

为了提高公平性,开发了不同的工具:

透明性与可解释性

在数据科学和人工智能中,透明性指的是利益相关者能够理解模型如何工作以及它如何进行预测的能力。讨论透明性的重要性对于建立用户对模型的信任和审计模型的意义非常重要。有些模型易于理解,比如(不是很深的)决策树以及线性或逻辑回归模型。你可以直接解释模型的权重或遍历决策树。

透明的模型有一个缺点:它们通常比像随机森林、提升树或神经网络这样的黑箱模型表现更差。通常,在理解模型工作原理与模型性能之间存在权衡。与利益相关者讨论模型需要多透明是一个好的实践。如果你从一开始就知道模型应该是可解释的并且完全透明,你应该远离黑箱模型。

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

可解释性与性能之间的权衡。点击放大。图片由作者提供。

与透明性密切相关的是可解释性。随着复杂机器学习模型使用的增加,理解模型如何做出预测变得越来越困难。这就是模型可解释性发挥作用的地方。作为模型所有者,你希望能够解释预测。即使是黑箱模型,也有不同的方法来解释预测,例如使用 LIME、SHAP 或全局代理模型。这篇文章深入解释了这些方法。

鲁棒性

鲁棒性指的是 AI 系统在面对意外或对抗性情况时保持其性能和功能的能力,例如输入与系统训练时显著不同,或试图恶意操控系统。一个鲁棒的 AI 系统应能正确处理这些情况,而不会导致重大错误或伤害。鲁棒性对确保 AI 系统在现实场景中的可靠和安全部署非常重要,因为这些场景可能与训练和测试时的理想化场景有所不同。一个鲁棒的 AI 系统可以增加对技术的信任,减少伤害风险,并帮助确保系统符合伦理和法律原则。

鲁棒性可以通过不同的方法来处理,例如:

  • 对抗训练,这可以通过对系统进行各种输入的训练,包括对抗性的或故意设计来挑战系统的输入。应内置对抗攻击的防御措施,如输入验证和异常行为监控。

  • 定期测试和验证,使用与训练时显著不同的输入,以确保系统按预期功能运行。

  • 人工监督机制,例如允许人工用户审查和批准决策,或在系统出错时进行干预。

另一个重要部分是定期(或自动)更新和监控模型。这有助于应对随时间发现的潜在漏洞或限制。

隐私

数据科学和人工智能通常依赖大量个人数据,这引发了隐私问题。公司应讨论数据的负责任使用方式以及保护个人信息的措施。欧盟数据保护法,GDPR,可能是全球最著名的隐私和安全法律。虽然这是一份庞大的文件,但幸运的是有很好的总结和检查表。简而言之,GDPR 要求处理欧盟公民个人数据的公司征得同意、通知安全漏洞、透明使用数据,并遵循隐私设计原则。被遗忘权是另一个重要概念。违反 GDPR 的公司可能面临高达公司年全球收入 4%的巨额罚款。

所有主要的云服务提供商都提供了确保敏感和个人数据得到保护,并以负责任和伦理的方式使用的方法。这些工具包括Google Cloud DLPMicrosoft Purview 信息保护Amazon Macie。还有其他工具可供选择。

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

图片来源于 Dall-E 2。

责任

人工智能中的责任指的是个人、组织或系统对其行为、决策以及人工智能系统生成的结果进行解释和辩护的责任。组织需要确保人工智能系统的正常运作。

当人工智能做出错误决策时,需要有人负责。开发者之间对此的看法不尽相同,如你在这个 StackOverflow 调查问卷中可以看到。几乎 60% 的开发者认为,管理层对代码的伦理问题负主要责任。但在同一问卷中,几乎 80% 的人认为开发者应考虑其代码的伦理影响。

每个人似乎都同意的一点是:人们对人工智能系统负有责任,并应承担这一责任。如果你想了解更多关于人工智能责任的内容,这篇论文是一个很好的起点。它提到了一些人工智能责任的障碍,比如通常有很多人参与部署算法,并且错误是被接受和预期的。这使得人工智能治理成为一个复杂的话题。

结论

随着机器学习在我们生活中变得越来越普遍,设计和部署这些系统的方式必须符合社会价值观和伦理。这涉及隐私、透明度和公平性等因素。组织和个人应采取最佳实践,例如以维护隐私的方式收集和处理数据,设计透明且可解释的算法,以及检查系统以防止对某些群体的歧视。通过考虑这些伦理因素,机器学习技术可以赢得信任,并最小化负面影响,造福所有人。

相关

[## 利用机器学习检测数据漂移

通过简单的自动化过程了解你机器学习模型的性能退化情况。

medium.com ## 适用于任何机器学习模型的模型无关解释方法

解释方法概述:置换特征重要性、部分依赖图、LIME、SHAP 等。

[towardsdatascience.com ## 可解释的机器学习模型

对逻辑回归模型和决策树的解释进行了详细介绍。

[towardsdatascience.com

人工智能中的伦理:偏见算法的潜在根源

原文:towardsdatascience.com/ethics-in-ai-potential-root-causes-for-biased-algorithms-890091915aa3?source=collection_archive---------1-----------------------#2023-01-27

理解数据偏见的另一种方法

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

·

关注 发布于 Towards Data Science ·12 分钟阅读·2023 年 1 月 27 日

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

图片来源:Pixabay

随着数据科学应用数量的增加,滥用的潜力也在增加。很容易指责开发人员或分析团队算法结果的责任,但他们真的是主要的罪魁祸首吗?以下文章试图从不同角度讨论这个问题,并得出结论认为伦理滥用可能是我们社会数据中的真正问题

更美好的世界不会仅仅因为我们使用数据而到来;数据有其黑暗的一面。¹

偏见算法

如今,数据科学的讨论常常与商业和工业中的重大机遇相关联,以提供更准确的预测和分类解决方案,并改善人们在健康和环境领域的生活。² ³ 也许和这些好处一样重要的是,在评估数据分析中的新解决方案和方法时,应该考虑数据伦理挑战。作为伦理学的一个特定分支,数据伦理处理与数据、算法及相关实践有关的道德问题,以制定和支持道德良好的解决方案。⁴ 总体而言,数据的使用与滥用之间似乎存在一条微妙的界限。公司不仅收集数据以增加利润,还为了向客户提供量身定制的体验。⁵ 然而,当公司开始将其数据用于其他收集目的之外的外部利用时,就会出现伦理问题。除了这些隐私相关的问题外,另一个挑战是数据分析偏差,它可能以多种方式出现。例如,由有特定意图或框架的人设计的调查问题、从具有特定背景的群体中选择性收集数据,或数据来源本身的偏差。⁶

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

图片来源:Pixabay

算法歧视的流行例子

这些问题绝非理论上的——它们引发了实际关注,并在多个案例研究中引发了严重的讨论:

  • 犯罪预测中的种族歧视

    一个有问题且广为人知的例子是犯罪预测。2016 年,上海交通大学的一篇机器学习论文研究了是否可以通过面部特征分析来检测犯罪行为。⁷ 结果显示,那些外貌与平均水平“不同”的人更可能被怀疑犯有罪行。⁸ 另一个例子是美国用于预测被逮捕个体再犯可能性的风险评估算法。结果表明,底层算法倾向于将黑人被告的再犯可能性预测为白人被告的两倍,而白人被告则常被错误分类为低风险,即使他们实际上是再犯者。⁹

  • 招聘中的性别歧视

    另一个受偏见算法影响的领域是招聘。2014 年,亚马逊使用基于机器学习的软件来评估和排名潜在候选人的简历,以寻找新的顶级人才。2015 年,该公司发现其新系统在评估申请者时并未性别中立,特别是在软件开发职位上。根据过去十年的招聘情况,该系统惩罚了所有在简历中包含“女性”一词的申请。¹⁰

  • 社交媒体中的刻板印象

    性别和种族偏见也可以在 Facebook 的广告中找到。在他们 2019 年的实证研究中,Ali 等人发现,根据广告与不同受众的相关性,可能会对特定用户投放广告时存在偏见规则。这种相关性通常基于男性/女性刻板印象,通过分析数字广告媒体的图像分析软件进行分类和关联。¹¹

大数据伦理原则

如何防止这种情况的发生?这些案例只是现代世界中算法被偏见性使用的众多实例之一。许多专家讨论并评估避免数据分析偏见的方法,这在 Herdiana 发布的《大数据伦理 5 原则》之一中有所体现:“大数据不应固化诸如种族主义或性别歧视等不公平偏见。”¹² 虽然这一原则被认为是数据伦理中的通用规则,但给出的示例“如种族主义或性别歧视”似乎是最常见的情况。然而,更通用的描述可能是:

“大数据不应固化导致歧视的不公平偏见。”

加拿大人权委员会(CHRC)将歧视描述为因称为“理由”的原因而对某人或某群体的不公平对待。这些理由受到《加拿大人权法案》的保护,包括种族、民族或族裔来源、肤色、宗教、年龄、性别、性取向、性别认同或表现、婚姻状况、家庭状况、残疾、遗传特征以及已获赦免或注册被暂停的罪行。¹³ 在社会学中,歧视描述了基于个人或群体特征的贬低行为,这种行为是系统性地进行的,因此构成了严重的人权侵犯。¹⁴ 欧洲人权公约(ECHR)也在第 14 条中禁止在上述所有领域的歧视,并将语言、政治观点财产等添加到 CHRC 的名单中。¹⁵

欧洲经济和社会委员会(EESC)的一项研究题为“大数据的伦理:在欧盟政策背景下平衡经济利益和大数据的伦理问题”将算法偏见描述为大数据的关键伦理问题之一。他们将对算法的信任定义为一个伦理问题,因为大多数人认为机器天生是中立的。实际上情况并非如此,因此风险可能非常高。¹⁶ 但这种缺乏中立性的可能原因是什么?很难想象世界上最优秀的数据科学家在开发算法时有这样的目标。

根本原因分析

算法本身并没有偏见。然而,许多算法产生的结果是偏颇的,而对这些结果的原因和驱动因素的深入评估往往是肤浅的。此外,缺乏一个假设世界中没有算法的可能替代方案和结果。因此,对算法偏见的问题不应仅仅集中在算法的中立性上,还应强调(缺失的)原因。因此,以下分析旨在进一步探讨与偏见相关的问题,以及今天对开发者的伦理压力如何理解为一种集体责任。然而,必须强调消除技术和非技术世界中的歧视的重要性,因为这两者直接相关并相互影响。

  1. 一个有偏见的社会会导致有偏见的数据 从设计上讲,歧视在数据收集之前就已经发生,因为数据集是历史的集合,受到了社会本身的影响。要深入思考这个问题的技术方面,需要检查可能导致偏见系统的原因。在大多数论文和研究中,作者指出算法本身存在偏见,导致了歧视。¹⁷ ¹⁸ 然而,很难将歧视的根本原因归咎于算法本身,因为算法根据给定的输入和参数的交互以自动化方式执行决策规则。¹⁹ 机器学习算法背后的原理通常是一个优化问题,其中规则根据过去对结果的影响应用于参数。²⁰ 因此,在给定变量(例如性别)与目标(例如职位适合性)之间的交互中出现的偏见,并不是由算法本身造成的,而是由基础数据集造成的。以亚马逊招聘的例子来看,偏见的结果(即,男性申请者比女性申请者更受青睐)可以归因于最初输入到算法中的训练数据集。假设技术职位的前员工大多数是男性,算法就预期这会成为一个成功因素。因此,歧视并不是从算法或其开发者个人开始的,而是从公司长期以来的招聘行为开始的。

  2. 变量之间的隐藏偏见 挑衅地说,有人可能会认为每个数据集都在某种程度上存在偏见,因为它源于一个可能存在偏见的环境。算法只能考虑(偏见的)数据中存在的内容,而数据通常仅包含(偏见的)非技术世界中的内容。一种合理且符合常识的方法是,在开始建模之前,将这些歧视性变量从数据集中移除。然而,移除一个变量并不能保证消除该变量对数据集其余部分的存在或影响。我们可以设想一个虚拟的数据集,其中包含变量性别运动。这两个变量可能存在互动,例如“男性与足球、女性与骑马之间的相关性”,尽管这个直白的例子可能不能完全代表我们的社会,因为可能有女性更喜欢足球而非骑马,反之亦然。然而,由于数据集的不平衡(例如男性偏多),算法可能会间接地偏向于有足球偏好的人,因为训练过程是基于偏见信息的。这个例子表明,移除关键变量可以降低歧视的风险,但不足以完全防止歧视。此外,数据集如何平衡地代表变量的不同表现也非常重要。如果表达均匀分布,敏感(歧视性)项目可能不那么问题严重。如果某一部分条目被低估,算法可能会在负面上考虑这一点。因此,很难确定一个数据集是否真正无偏。²¹

  3. 技术决策与人工决策

    没有保证人类做出的决策比算法更少偏见。除了任何数据集都可能存在偏见并导致算法过程中的偏见结果这一观点外,另一个关键的指标是不完整数据形式的信息缺乏。²² 很难保证给定的数据集具有完整的可视性来解释目标行为。数据缺乏的常见原因可能是有限的访问权限、主动排除信息或对额外信息边际影响的缺乏了解。歧视的另一风险不仅源于技术实现,还可能根植于我们社会的现有结构。大数据与机器学习算法的结合优势在于能够将人类规则和决策应用于大量信息。如果算法被认为是有偏见的,人们可能会怀疑人类如何处理给定数据的分析。回顾社交媒体广告,个性化广告旨在根据个人的偏好做出个体化建议。这意味着算法支持个体主义。然而,算法却有相反的效果,因为它们基于一般模式而非个体模式处理自动化和标准化的决策规则。最终,可以认为算法支持集体主义而非个体主义。²³

结论

我们的分析表明,算法中的偏见主要是当今社会偏见的结果。后者支持收集带有偏见的数据集,这些数据集可能包含(隐藏的)关系,最终导致偏见结果。此外,我们质疑人类决策是否比算法规则更少偏见。最后,我们得出结论,更复杂的算法往往过于不透明。

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

图片来源:Pixabay

缓解策略

在关于机器学习算法偏见结果的责任讨论中,开发者或数据科学团队常常被指责为歧视性行为的源头。一方面,这种说法过于简单化,责任分配需要进一步区分。另一方面,任何使用机器学习算法的开发者都应意识到他们任务的敏感性及其相应的责任。由于算法支持集体主义,调查这些集体算法是否对个人做出决策或建议的公平性是重要的。文献建议了其他减少偏见的技术,例如设计一个对小样本查询进行随机化的系统,或使用倾向加权技术。²⁴ 对于基于人类内容的偏见,有几种量化歧视和评估算法公平性的思路。²⁵

公平作为共同责任:在技术和现实世界中 数据团队有责任识别和最小化其数据模型中的偏见行为。然而,鉴于本文所考察的歧视性因素,确保没有人通过技术系统或人为行为经历这种不公正是一项全球责任。

  1. 人类必须平等对待他人,不带有歧视

  2. 算法必须平等对待人类,不带有歧视

  3. 我们不应借助算法来为偏见和歧视性的人类行为辩解。

展望:接下来怎么办?

评估决策或预测时,不仅应考虑结果本身,还需考虑在解决方案中涉及的伦理问题。我们还需要重新思考涉及偏见行为的系统。然而,没有证据表明替代方案(以人为基础的决策)会导致总体上的更多平等。因此,我们不应仅关注技术内部的偏见问题,而应将讨论扩大到技术外部的偏见问题。然而,正因为如此无偏见的系统应有助于改善我们当前的社会弱点,并可能带来未来世界中的更多平等。人们可以利用 AI 更容易地检测非技术世界中的歧视。因为只要我们在数据中发现偏见,社会中也存在偏见

Jonas Dieckmann - Medium

阅读 Jonas Dieckmann 在 Medium 上的文章。分析经理兼产品负责人 @ Philips | 对…充满热情并撰写关于…

Jonas Dieckmann - Medium

希望你觉得这些内容有趣。请告诉我你的想法,并随时在 LinkedIn www.linkedin.com/in/jonas-dieckmann 上联系我,或者在 medium 上关注我。

也可以查看我的其他文章:

如何使用 Keras API 和 Google Colab 开始使用 TensorFlow

使用神经网络分析人类活动的逐步教程

案例研究:将数据科学过程模型应用于现实世界场景

供应链中材料规划的机器学习模型开发

towardsdatascience.com

参考文献

[1]: Loukides, M., Mason, H., & Patil, D. (2018). 伦理与数据科学。

2: Floridi, L., & Taddeo, M. (2016). 什么是数据伦理? 皇家学会哲学学刊 A: 数学、物理与工程科学,374(2083),20160360. doi: 10.1098/rsta.2016.0360

3: Google (2021). 社会公益中的人工智能:将人工智能应用于全球最大挑战. 检索日期:2021 年 3 月 10 日,来源:ai.google/social-good

4 Mittelstadt, B., & Floridi, L. (2015). 大数据伦理:生物医学背景中的当前和可预见问题. 科学与工程伦理,22(2),303–341. DOI: 10.1007/s11948–015- 9652–2

5 Hand, D. (2018). 在变化的世界中数据伦理的各个方面:我们现在处于何种状态? 大数据,6(3),176–190. DOI: 10.1089/big.2018.0083

6 Broad, E., Smith, A., & Wells, P. (2017). 帮助组织应对其数据实践中的伦理问题. 开放数据研究所。

[7] 吴晓林,张熙. (2016). 使用面部图像的犯罪推断自动化。

[8] Sullivan, B. (2016). 一个新程序判断你是否是罪犯通过你的面部特征. 检索日期:2021 年 3 月 10 日,来源:www.vice.com/en/article/d7ykmw/new-programdecides-criminality-from-facial-features

[9] Angwin, J., Larson, J., Mattu, S., & Kirchner, L. (2016). 机器偏见. 检索日期:2021 年 2 月 28 日,来源:www.propublica.org/article/machine-bias-risk-assessments-in-criminal-sentencing

[10] Dastin, J. (2018). 亚马逊取消了一个对女性有偏见的秘密人工智能招聘工具. 检索日期:2021 年 2 月 28 日,来源:www.reuters.com/article/us-amazon-com-jobsautomation-insight-idUSKCN1MK08G

[11] Ali, M., Sapiezynski, P., Bogen, M., Korolova, A., Mislove, A., & Rieke, A. (2019). 通过优化进行歧视. ACM 人机交互学刊,3(CSCW),1–30. DOI: 10.1145/3359301

[12] Herdiana (2013), “大数据伦理的 5 项原则,” 化学信息与建模学刊. 检索日期:2021 年 3 月 10 日,来源:aiforceos.com/2018/06/16/big-data-ethics

[13] 加拿大人权委员会. 什么是歧视. 检索日期:2021 年 2 月 28 日,来源:www.chrc-ccdp.gc.ca/eng/content/what-discrimination

[14] Hartfiel, G., & Hillmann, K. (1994). 社会学词典. 斯图加特:Kröner

[15] 欧洲委员会(1950)。《保护人权和基本自由的欧洲公约》。检索日期:2021 年 3 月 10 日,来自www.refworld.org/docid/3ae6b3b04

[16] 欧洲经济和社会委员会。(2017)。大数据的伦理。

[17] Eslami, M., Vaccaro, K., Karahalios, K. 和 Hamilton, K.(2017)‘小心;事情可能比看起来更糟’:理解评级平台中的偏见算法和用户行为。《国际 AAAI 网络与社会媒体会议论文集》,11(1)。

[18] Kim, P.(2017)审计算法以防歧视,166 U. Pa. L. Rev. 检索日期:2021 年 3 月 10 日,来自 scholarship.law.upenn.edu/penn_law_review_online/vol166/iss1/10

[19] Mittelstadt, B., Allo, P., Taddeo, M., Wachter, S., & Floridi, L.(2016)。算法的伦理:辩论的映射。《大数据与社会》,3(2),205395171667967。DOI: 10.1177/2053951716679679

[20] Lehr, D., Ohm, P.(2017)。数据的游戏:法律学者应当了解的机器学习,《UCDL 评论》51:653,671。

[21] Calders, T., & Žliobaitė, I.(2013)。为何无偏计算过程可能导致歧视性决策程序。《应用哲学、认识论与理性伦理研究》,43–57。DOI: 10.1007/978–3–642–30487–3_3

[22] Rosen, R.(2019)。缺失数据和插补。检索日期:2021 年 3 月 10 日,来自towardsdatascience.com/missing-data-and-imputation-89e9889268c8

[23] Saake. I., Nassehi, A.(2004)。伦理的文化化。卢曼文化概念的时代诊断应用。法兰克福/美因:102,135

[24] Ridgeway, G., Kovalchik, S., Griffin, B., & Kabeto, M.(2015)。带权重数据的倾向得分分析。《因果推断期刊》,3(2),237–249。doi: 10.1515/jci-2014–0039

[25] Floridi, L.(2016)。无过错责任:关于分布式道德行为的性质和道德责任的分配。《皇家学会 A 类:数学、物理和工程科学哲学交易》,374(2083),20160112。doi: 10.1098/rsta.2016.0112

ETL vs ELT vs 流处理 ETL

原文:towardsdatascience.com/etl-elt-streaming-etl-af6379ffdd26

探索数据处理的批处理和实时设计范式

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

·发布于 Towards Data Science ·阅读时长 8 分钟·2023 年 8 月 29 日

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

图片由 Compare Fibre 提供,在 Unsplash

提取、转换、加载(ETL)和提取、加载、转换(ELT)是数据处理中的两个基本概念,用于描述数据摄取和转换设计范式。虽然这些术语经常被交替使用,但它们指代的概念略有不同,适用于不同的用例,这些用例也要求不同的设计。

在这篇文章中,我们将探讨 ETL 和 ELT 的异同,并讨论云计算和数据工程领域的变革如何影响数据处理设计模式。此外,我们将概述这两种方法在现代数据团队中的主要优缺点。最后,我们将讨论流处理 ETL,这是一种新兴的数据处理模式,旨在解决传统批处理方法的各种缺点。

订阅数据管道,这是一个专注于数据工程的新闻通讯

三个关注的步骤

从外部来源将数据摄取并持久化到目标系统涉及三个不同的步骤。

提取 “提取”步骤包括从源系统中提取数据所需的所有过程。这些源可以包括应用程序编程接口(API)、数据库系统或文件、物联网(IoT)设备,而数据可以是任何形式的;结构化、半结构化或非结构化。在此步骤中提取的数据通常被称为“原始数据”。

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

在 ETL/ELT 管道中作为‘提取’步骤的一部分从源系统中提取原始数据 — 来源:作者

转换 在‘转换’步骤中,管道对原始数据应用转换以实现某个目标。这个目标通常与业务或技术要求相关。一些常见的转换包括数据修改(例如,将United States映射为US)、记录或属性选择、与其他数据源的连接或甚至数据验证。

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

在 ETL/ELT 管道中的‘转换’步骤中,对原始数据应用转换以实现某个目标 — 来源:作者

加载 在‘加载’步骤中,数据(无论是原始数据还是已转换数据)被加载到目标系统中。通常,目标是 OLAP 系统(即数据仓库或数据湖),但有时它甚至可以是 OLTP 系统,例如应用程序数据库。

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

作为 ETL/ELT 管道中‘加载’步骤的一部分将数据加载到目标系统中 — 来源:作者

显然,ETL 和 ELT 范式都涉及上述步骤。它们的主要区别在于执行这些步骤的顺序,这反过来在成本、计算能力和设计模式上具有重要影响。因此,应根据每种范式的优缺点选择最合适的范式。还需要提到的是,团队结构本身也可能是选择哪种范式的良好指标。让我们深入探讨以使这更清楚!

提取 转换 加载(ETL)

ETL 指的是一个过程,包括从源系统(或文件)提取数据,然后进行转换步骤以修改提取的原始数据,最后是加载步骤将转换后的数据导入目标系统。

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

提取-转换-加载(ETL)管道中的执行顺序 — 来源:作者

ETL 步骤:

  1. 从源系统提取原始数据

  2. 在暂存服务器(即目标系统/服务器之外)转换数据

  3. 将数据加载到目标系统

ETL 已经存在多年,并在公司开始使用数据仓库将数据集中存储在其技术生态系统中的中心点时获得了显著关注。

ETL 在数据世界中仍然相关,但在批处理方面表现出两个显著的缺点。第一个缺点与原始数据永远无法到达目标系统有关。这意味着每当需要新的变换时,必须执行新的 ETL 作业来从源头(再次!)获取数据,应用新的变换规则,并最终加载到目标系统中。第二个主要缺点是变换通常发生在暂存服务器中。

提取加载变换(ELT)

随着云技术的出现和数据存储成本的显著降低,现代组织现在能够存储大量的原始数据,然后根据需要应用任何变换或分析。

技术环境的这些变化也改变了数据团队摄取和分析数据的方式。ELT 范式使团队能够将数据加载到目标系统,然后进行任何必要的变换。

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

提取-加载-变换(ELT)管道的执行顺序—来源:作者

ELT 步骤:

  1. 从源系统提取原始数据

  2. 将提取的原始数据加载到目标系统

  3. 在目标系统内变换原始数据

使用 ELT,不需要维护(和支付)用于变换的暂存服务器。此外,原始数据随时可用,这意味着进一步的变换可以瞬间完成。

流式 ETL

流式 ETL 指的是一个概念,其中 ETL 范式持续执行。当数据进入(作为“提取”步骤的一部分)时,变换—包括连接、映射、过滤和窗口化—会在流数据上执行。处理后的数据会推送到下游目标系统,如数据库、仓库或甚至消息队列。

尽管 ETL 和 ELT 范式仍然非常相关且有用,但它们总是作为批处理过程进行。这意味着延迟增加,而数据的新鲜度减少。另一方面,流式 ETL 相较于批处理作业具有许多优势,包括较低的延迟、较高的数据新鲜度以及更多的灵活性(无论是在资源使用还是数据处理本身)和可扩展性。

以欺诈检测为例,这适用于许多不同的行业,特别是金融服务。在银行业中,欺诈可能通过盗用卡片、伪造或甚至网络钓鱼电话进行。检测欺诈活动是时间关键的,因为金融机构需要在检测到后执行某些操作(例如冻结账户或发送通知)。尽管检测恶意交易活动时需要考虑许多因素,但一个明显且关键的因素是同一账户是否在几分钟内在不同的地理位置进行交易(这些地点的距离与感兴趣交易之间的时间差异不匹配)。为此,我们可以利用时间窗口。

显然,批处理——可以以 ELT 或 ELT 管道的形式执行——无法满足时间关键型用例如欺诈检测。而这正是流处理发挥作用的地方。

流处理

流处理指的是在数据创建时进行连续处理的实践。通常,流处理管道包括原始数据的摄取或生成,对其进行的处理,包括聚合、过滤、窗口化、丰富等,最终将处理后的流传送到目标系统。

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

流处理管道的高级概述 — 来源:作者

批处理已经长期存在,但全球数据生成的快速增长以及挑战批处理架构的技术出现改变了这一现状。

显然,流处理的主要优势在于其实时处理数据的能力。这使得用户和组织能够更快地进行分析,从而加快决策过程。

此外,流处理系统比批处理过程更容易扩展,因为它们设计用于实时处理大量数据。这对于包含波动数据流的用例尤为重要,例如物联网应用。

与批处理作业相比,流处理可以减少与数据存储相关的数据处理成本。流处理作业仅处理需要处理的数据子集,而无需存储和维护包含未使用数据的大型数据集。

使用流式 ETL 与流式数据库

有不同类型的流式数据库提供各种不同的功能并支持不同的 SQL 变体。其中一个流式数据库是 RisingWave,我将使用它作为示例来描述一些流式 ETL 概念,因为我熟悉 Postgres SQL。

RisingWave是一个用于流处理的分布式 SQL 数据库,旨在提供构建实时和事件驱动应用程序的无缝体验。

该工具可以处理来自 Apache Pulsar、Apache Kafka、Kinesis 和 CDC 源的数据。同样,来自 RisingWave 的数据可以被引入到下游系统,包括数据仓库、数据湖和消息代理/队列。

该平台可以用于从上述源中提取数据,随着新数据的到来执行增量计算,并动态更新结果。由于 RisingWave 本身是一个数据库系统,用户能够高效、有效地访问数据。

显然,RisingWave 支持的众多用例之一是流式 ETL。数据可以从各种源中提取并引入流式数据库,在那里可以应用转换。然后,处理/转换后的数据会持续写入所需的目标系统。

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

使用 RisingWave 的流式架构 — 来源:RisingWave GitHub 库(根据Apache 许可证授权)

RisingWave 使用的流式 ETL 步骤

  1. 提取:RisingWave 支持从各种数据源中提取数据,包括日志文件、消息队列和来自数据库日志的 CDC 流。

  2. 转换:它提供了执行流数据转换所需的所有功能,包括映射、聚合、过滤、窗口、连接和有状态处理。

  3. 加载:最后,处理过的数据流可以从 RisingWave 加载到下游目标系统。

一些可以从流式 ETL 功能中受益匪浅的用例包括:

  • 持续数据集成

  • 物联网(IoT)数据处理

  • 实时欺诈检测

  • 实时警报

另一种流式 ETL 的解决方案是 FlinkSQL,它允许用户使用 SQL 开发流式应用程序。Databricks 和 Snowflake 最近也开始提供对流式应用程序的支持,可能也是不错的替代选择。

最终思考…

设计数据处理管道是一项具有挑战性的任务,因为没有一种通用的解决方案。因此,应该熟悉基本概念,以便在实施解决特定问题的解决方案时能够做出有价值的考虑。

在今天的文章中,我们讨论了数据处理上下文中常用的两种范式,即 ETL 和 ELT。此外,我们还讨论了现代组织如何利用实时能力,并使用 RisingWave 实现事件驱动架构,RisingWave 是一个用于流处理的分布式 SQL 数据库,可以支持实时分析、事件驱动应用程序以及流式 ETL 等功能。

订阅数据管道,这是一个专注于数据工程的新闻通讯

如何使用 GitHub Actions 构建简单的 ETL 流水线

原文:towardsdatascience.com/etl-github-actions-cron-383f618704b6

ETL 不一定要复杂。如果是这样的话,使用 GitHub Actions。

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

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

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

照片由 Roman Synkevych 🇺🇦 拍摄,Unsplash 提供

如果你对软件开发感兴趣,你会知道 GitHub Actions 是什么。它是 GitHub 提供的一个自动化开发任务的工具。或者用流行的话来说,是一个 DevOps 工具。

但人们很少用它来构建 ETL 流水线。

讨论 ETL 时,第一个想到的工具是 Airflow、Prefect 或相关工具。毫无疑问,它们在任务编排方面是市场上最好的。但我们构建的许多 ETL 都很简单,托管一个单独的工具往往是多余的。

你可以改用 GitHub Actions。

本文重点介绍 GitHub Actions。但如果你使用 Bitbucket 或 GitLab,你也可以使用它们各自的替代方案。

## 使用 Black 和 GitHub Actions 维护干净的 Python 代码。

没有人想要一个混乱的代码库;也很少有人有耐心去清理它。

towardsdatascience.com

我们可以在 GitHub Actions 上运行我们的 Python、R 或 Julia 脚本。所以作为数据科学家,你不必为此学习一种新的语言或工具。你甚至可以在任何 ETL 任务失败时收到电子邮件通知。

如果你使用免费账户,你每月仍然可以享受 2000 分钟的计算时间。如果你能估算你的 ETL 工作负载在这个范围内,你可以尝试使用 GitHub Actions。

## 如何移除你不小心上传到 GitHub 的敏感数据。

那么如何避免它们被误入呢?——一种出乎意料的简单处理方法。

[towardsdatascience.com

我们如何开始在 GitHub Actions 上构建 ETL?

开始使用 GitHub Actions 很简单。你可以参考官方文档。或者按照以下三个简单步骤操作。

在你的代码库中,创建一个目录 .github/workflows。然后在其中创建一个名为 actions.yaml 的 YAML 配置文件,内容如下。

name: ETL Pipeline

on:
  schedule:
    - cron: '0 0 * * *'  # Runs at 12.00 AM every day

jobs:
  etl:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: '3.9'

      - name: Extract data
        run: python extract.py

      - name: Transform data
        run: python transform.py

      - name: Load data
        run: python load.py

上述 YAML 自动化了一个 ETL(提取、转换、加载)管道。该工作流每天 UTC 时间凌晨 12:00 触发,由一个在 ubuntu-latest 环境中运行的单个任务组成(具体环境以当时可用的为准)。

这些配置步骤很简单。

该工作包含五个步骤:前两个步骤分别用于检查代码和设置 Python 环境,接下来的三个步骤按顺序执行 extract.pytransform.pyload.py Python 脚本。

该工作流提供了一种自动化和高效的方法,使用 GitHub Actions 每天提取、转换和加载数据。

## 我在几乎所有数据科学项目中使用的 5 个 Python 装饰器

装饰器提供了一种新的、方便的方法,用于缓存到发送通知等各种用途。

[towardsdatascience.com

Python 脚本可能会根据场景有所不同。这是众多方法中的一种。

# extract.py
# --------------------------------
import requests

response = requests.get("https://api.example.com/data")
with open("data.json", "w") as f:
    f.write(response.text)

# transform.py
# --------------------------------
import json

with open("data.json", "r") as f:
    data = json.load(f)

# Perform transformation
transformed_data = [item for item in data if item["key"] == "value"]

# Save transformed data
with open("transformed_data.json", "w") as f:
    json.dump(transformed_data, f)

# load.py
# --------------------------------
import json
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData

# Connect to database
engine = create_engine("postgresql://myuser:mypassword@localhost:5432/mydatabase")

# Create metadata object
metadata = MetaData()

# Define table schema
mytable = Table(
    "mytable",
    metadata,
    Column("id", Integer, primary_key=True),
    Column("column1", String),
    Column("column2", String),
)

# Read transformed data from file
with open("transformed_data.json", "r") as f:
    data = json.load(f)

# Load data into database
with engine.connect() as conn:
    for item in data:
        conn.execute(
            mytable.insert().values(column1=item["column1"], column2=item["column2"])
        )

上述脚本从虚拟 API 读取数据并将其推送到 Postgres 数据库。

## Python 到 SQL — 我现在可以将数据加载速度提高 20 倍

上传大量数据的好方法、坏方法和丑陋的方法

[towardsdatascience.com

部署 ETL 管道到 GitHub Actions 时需要考虑的事项。

1. 安全性: 使用 GitHub 的秘密存储来保护你的秘密,避免将秘密硬编码到你的工作流中。

你是否已经注意到我上面给出的示例代码包含了数据库凭据?这在生产系统中是不对的。

我们还有其他安全嵌入秘密的方法,如数据库凭据。

如果你在 GitHub Actions 中不加密你的秘密,任何有权限访问代码库的人都能看到这些秘密。这意味着,如果攻击者获得了对代码库的访问权限或代码库的源代码泄露;攻击者将能够看到你的秘密值。

为了保护你的机密信息,GitHub 提供了一项名为加密机密的功能,这使你能够在仓库设置中安全地存储你的机密值。加密机密仅对授权用户可访问,并且在你的 GitHub Actions 工作流中从不以明文形式暴露。

下面是它的工作原理。

在仓库设置侧边栏中,你可以找到 Actions 的机密信息和变量。你可以在这里创建你的变量。

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

作者截图。

在这里创建的机密信息对任何人都不可见。它们是加密的,可以在工作流中使用。即使你也无法读取它们。但你可以用新的值更新它们。

一旦你创建了机密信息,你可以通过 GitHub Actions 配置将它们作为环境变量传递。下面是它的工作原理:

name: ETL Pipeline

on:
  schedule:
    - cron: '0 0 * * *'  # Runs at 12.00 AM every day

jobs:
  etl:
    runs-on: ubuntu-latest
    steps:
      ...

      - name: Load data
        env: # Or as an environment variable
          DB_USER: ${{ secrets.DB_USER }}
          DB_PASS: ${{ secrets.DB_PASS }}
        run: python load.py

现在,我们可以修改 Python 脚本以从环境变量中读取凭证。

# load.py
# --------------------------------
import json
import os
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData

# Connect to database
engine = create_engine(
    f"postgresql://{os.environ['DB_USER']}:{os.environ['DB_PASS']}@localhost:5432/mydatabase"
)

2. 依赖关系:确保使用正确版本的依赖项,以避免任何问题。

你的 Python 项目可能已经有一个 requirements.txt 文件,指定了依赖项及其版本。或者,对于更复杂的项目,你可能使用像 Poetry 这样的现代依赖管理工具。

在运行 ETL 的其他部分之前,你应该有一个步骤来设置你的环境。你可以通过在 YAML 配置中指定以下内容来做到这一点。

- name: Install dependencies
  run: pip install -r requirements.txt
  1. 时区设置:GitHub Actions 使用 UTC 时区,在撰写本文时,你不能更改它。

因此,你必须确保使用正确的时区。你可以使用在线转换工具或在配置之前手动将本地时间调整为 UTC。

GitHub Actions 调度的最大陷阱是其执行时间的不确定性。即使你已配置为在特定时间点运行,如果那时需求量很高,你的任务将被排队。因此,实际任务开始时间会有短暂的延迟。

如果你的任务依赖于准确的执行时间,使用 GitHub Actions 调度可能不是一个好的选择。在 GitHub Actions 中使用 自托管运行器 可能会有所帮助。

4. 资源使用: 避免过载 GitHub 提供的资源。

即使 GitHub Actions,即使是免费账户,也有 2000 分钟 的免费运行时间,但如果你使用的是与 Linux 不同的操作系统,规则会有所不同。

如果你使用的是 Windows 运行时,你只会获得一半的资源。在 MacOS 环境中,你只会获得十分之一的资源。

## 如何在每次提交时使用 GitHub Actions 运行 Python 测试?

自动化乏味的任务,并通过 CI 流水线确保你的代码质量。

towardsdatascience.com

结论

GitHub Actions 是一个 DevOps 工具,但我们可以用它来运行任何计划任务。在这篇文章中,我们讨论了如何创建一个定期获取 API 并将数据推送到数据框的 ETL。

对于简单的 ETL,这种方法易于开发和部署。

但是,GitHub Actions 中的计划任务不必在完全相同的时间运行。因此,对于时间敏感的任务,这种方法并不适用。

感谢阅读,朋友!在 LinkedInTwitterMedium 上跟我打个招呼吧。

还不是 Medium 会员?请使用此链接 成为会员,因为这样你无需额外支付费用,我可以通过推荐你赚取少量佣金。

欧洲旅行优化:遗传算法和 Google Maps API 解决旅行推销员问题

原文:towardsdatascience.com/euro-trip-optimization-genetic-algorithms-and-google-maps-python-api-solve-the-traveling-salesman-4ad8e1548207

利用遗传算法和 Google Maps API 探索欧洲 50 个最受欢迎城市的魅力,解锁高效的旅行路线

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

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

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

来源:unsplash.com

还记得看像 EuroTrip 这样的电影后那种感觉吗?电影中的角色在风景如画的欧洲城市中穿梭,经历了一次终生难忘的冒险。这种感觉真是迷人。然而,现实很快提醒我们:在多个目的地之间组织一次旅行绝非易事。但这里有一个令人兴奋的转折——凭借编程技能和对遗传算法的掌握,我开始开发解决方案。想象一下能够精准优化跨越数十个地点的复杂路线。这就是数据科学与冒险规划艺术交汇的地方。在这篇文章中,我将展示一个优雅解决复杂 旅行推销员问题(TSP)的算法脚本,承诺将帮助旅行规划并提升我们对数据科学中优化的理解。

阅读这篇文章将帮助你清晰地了解 Python、Google Maps API 和遗传算法如何协同工作,为复杂任务提供数据驱动的解决方案。

理解旅行推销员问题

开始一段旅行通常会激发冒险的感觉,但在我们思考旅行的复杂性时,兴奋感可能会伴随着物流挑战。旅行商问题(TSP)就是一个几十年来吸引数学家、计算机科学家和物流专家关注的挑战。TSP 的核心提出了一个看似简单的问题:给定一组城市及其之间的距离,什么是使得推销员能每个城市访问一次并返回起点的最短路径?虽然问题的陈述很简洁,但其含义远远超出了表面的简单。

在优化和物流领域,旅行商问题(TSP)不仅仅是一个理论上的好奇,它具有巨大的实际意义。以配送服务为例,减少旅行距离直接意味着降低燃料成本和加快服务速度。

在这个看似简单的问题陈述之下,隐藏着深刻的复杂性。TSP 的组合性质源于随着城市数量增加,潜在解决方案呈指数增长。可能的路径数量迅速激增,超出了任何计算的可行性,使得传统的暴力破解方法在较大实例中变得不切实际。可能的路径数量等于

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

其中 n 代表城市数量 — 一个 阶乘爆炸 的现象,很快变得压倒性。仅仅 50 个城市,可能的路径数量就等于 3*10⁶²,这大致相当于 银河系中的原子数量

TSP 作为数学、计算机科学与现实世界物流挑战之间引人入胜的交汇点的典型例子。随着城市数量的增加,揭示最短路径需要超越传统计算方法的创新策略。

对于 TSP 高效解决方案的追求驱使研究人员探索各种方法。其中之一是遗传算法,这是一类受自然选择过程启发的优化技术。遗传算法在导航复杂的解决空间方面表现出色,使其成为解决像 TSP 这样的问题的自然选择,因为随着城市数量的增加,暴力破解方法迅速变得不可行。

本文旨在探讨这两个领域的结合——旅行推销员问题和遗传算法。具体而言,我们深入探讨一个实际应用:一个旨在利用遗传算法解决旅行推销员问题的 Python 脚本。我们的探索将突出这种算法融合如何有可能改善旅行规划、物流以及跨行业的优化挑战。当我们了解基于遗传算法的解决方案的内部工作原理时,数据科学和算法创新的世界将汇聚,承诺在即便是最复杂的路径中提供新的见解和高效途径。

遗传算法简介

从本质上讲,遗传算法(GA)是一种受自然选择和进化优雅过程启发的启发式搜索技术。

遗传算法的灵感来源于查尔斯·达尔文的进化论。遗传算法通过迭代演化潜在解决方案的种群,模拟自然选择的过程。在这个数字熔炉中,表现出有利特征的解决方案会生存并繁殖,将它们的“基因”传递给下一代。这种代际进化会持续,直到达到最优或近似最优的解决方案。

遗传算法的特征包括四个基本组件:

  1. 选择:就像在自然界中一样,选择机制识别并青睐适应度更高的解决方案,类似于“适者生存”的概念。

  2. 交叉:解决方案或“染色体”交换遗传物质,产生具有父母特征混合的后代。

  3. 变异:为了引入多样性并防止过早收敛到次优解,遗传算法采用变异操作。此操作随机改变解决方案的某些元素,类似于自然界中的基因突变。

  4. 适应度评估:这是对每个解决方案的适应度的确定,量化它执行当前任务的效果。适应度函数通过为优质解决方案分配更高的繁殖概率来指导选择过程。

遗传算法在处理优化问题时表现出显著的多样性。它们以非线性、多维的方式探索解决方案空间,使其非常适合复杂的现实世界挑战。无论是优化复杂的工程设计、微调神经网络参数,还是如我们即将看到的解决 TSP,遗传算法在传统算法失败的场景中表现优异。

将遗传算法应用于旅行推销员问题

现在,让我们深入探讨遗传算法(GA)如何解决旅行推销员问题(TSP)。

从本质上讲,遗传算法通过将每个潜在路线视为种群中的个体来处理旅行推销员问题。这个路线种群在代际中进化,每条路线代表旅行推销员的独特行程。

为了促进这种遗传进化,我们将每条路线表示为一个染色体——定义访问顺序的城市序列。例如:

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

作者提供的图片。

基本任务是发现最优染色体,即最小化总旅行距离的序列。每个染色体的适应度通过评估它在指定顺序下访问城市时的总距离来量化。距离越短,适应度越高,这与寻找最短路径的目标相一致。

用 Python 实现

现在,让我们按照高层次的步骤实现设计用于解决 TSP 的 Python 脚本。完整的代码可以在我的GitHub 仓库中找到。

获取数据

第一步是选择目的地。以这个例子为例,我选择了欧洲 50 个最受欢迎的城市。一旦确定了目的地,我需要获取每对城市之间的旅行距离和时间。对于这种查询,Google Maps API 代表了最先进的解决方案。在这里设置一个帐户后,你可以请求你的个人 API 密钥,用于身份验证。

向 Google Maps API 发送请求的方式如下:

初始化

该过程开始时生成一组初始路线。这些路线通常是随机创建的,或者通过启发式方法生成的。

适应度评估与选择

在每一步中,在生成后代和突变一些路线之后,计算每条路线的总距离以评估其适应度。这个步骤确保算法保持对选择最短路径的关注。

在自然选择的精神下,路线根据其适应度被选择进行繁殖。总距离较短的路线——即接近最优解的路线——更有可能被选择,使得具有有利特征的个体更有可能繁殖。

交叉与突变

针对这个问题的特定特点,没有进行经典的交叉操作。我选择了两种突变方式:

  1. 单点突变:为了保持多样性并引入新颖的解决方案,算法对选定的路线进行小的、随机的变化。这模拟了遗传突变,引入了轻微的变异。

  2. “交叉突变”:通过切割其基因组的随机子集并将其附加到另一个位置来突变一个解决方案。用生物学术语来说,这是一种无性繁殖的形式。

迭代

上述步骤重复进行若干代,使得种群随着时间的推移不断进化。每次迭代都使算法更接近最优解或接近最优解。

算法将持续迭代直到满足终止标准。在这种情况下,终止标准是达到预定的代数。

结果与结论

在这次探索中,我使用了一个种群规模为 200 个个体的遗传算法,并运行了 1000 代来解决包含 50 个城市的旅行商问题(TSP)。从初始代到最终结果的旅程展示了基于遗传算法的方法的显著效率。

在开始阶段,即第零代,第一个解的适应度为 70,755 公里:

('Sofia, Bulgaria', 'Nice, France', ..., 'Naples, Italy', 'Luxembourg City, Luxembourg')

这个初始解,如预期的那样,代表了城市的随机排列,标志着算法的起点。然而,随着遗传算法在连续的代数中进行,我们观察到了解的质量的显著变化。

在 1000 代之后,遗传算法找到了其路线。最终解的适应度为 21,345 公里——相比初始的随机解,旅行距离有了显著减少。这一近 49,410 公里的显著改进突显了遗传算法在优化像 TSP 这样复杂路线中的有效性。

我进行了 4 次试验,改变了种群规模。总体而言,更大的种群获得了更好的结果,但计算时间显然更长。我们可以看到,在每次试验中,适应度值在前几次迭代中迅速下降,并在后期稳定在一个平台值。这是收敛算法的典型行为。

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

图片来自作者。

尽管 TSP 仍然是一个 NP 困难问题,这意味着对于较大的实例来说,找到绝对最优解可能在计算上具有挑战性,但遗传算法在接近最优解方面的能力在实际应用中证明了其不可或缺的价值。这一成就为更高效的旅行规划、优化物流以及跨行业的增强优化开辟了新的道路。这次实验突显了数据科学与创新算法之间的共生关系,强调了如何通过受自然选择机制启发的进化计算优雅地解决现实世界中的复杂问题。

如果你喜欢这个故事,考虑关注我,以便了解我即将发布的项目和文章!

以下是我过去的一些项目:

## 使用 Numpy 从头构建深度神经网络

现代深度学习库是强大的工具,但它们可能使从业者对神经网络的…

towardsdatascience.com ## 从头开始使用 Numpy 构建卷积神经网络

随着计算机视觉应用在我们生活中无处不在,理解其功能原理变得越来越重要…

towardsdatascience.com ## 选择适合你神经网络的优化算法

由于神经网络开发过程的本质是迭代的,我们需要利用每一个可能的捷径…

towardsdatascience.com

参考文献

[1]: 三目标最优 PMU 布置包括准确的状态估计:配电系统的案例

使用 RAGAs 评估 RAG 应用程序

原文:towardsdatascience.com/evaluating-rag-applications-with-ragas-81d67b0ee31a?source=collection_archive---------0-----------------------#2023-12-13

一个包含指标和 LLM 生成数据的框架,用于评估你的检索增强生成流水线的性能

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

·

关注 发布于 Towards Data Science ·8 min read·2023 年 12 月 13 日

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

检索增强生成的风格化性能仪表板

到目前为止,我们知道,为检索增强生成 (RAG) 应用程序构建概念验证是容易的,但使其准备好投入生产却非常困难。使 RAG 流水线的性能达到令人满意的状态尤其困难,因为 RAG 流水线中有多个不同的组件:

  • 检索器组件: 从外部数据库中检索附加上下文,以便 LLM 回答查询。

  • 生成器组件:基于经过检索信息的提示生成答案。

评估 RAG 管道时,必须分别和共同评估两个组件,以了解 RAG 管道是否以及在哪些方面仍需改进。此外,为了了解您的 RAG 应用的性能是否在提高,您必须进行定量评估。为此,您将需要两个要素:评估指标和评估数据集

目前,确定正确的评估指标和收集良好的验证数据是一个活跃的研究领域。由于这是一个迅速发展的主题,我们目前看到各种 RAG 评估框架的方法,如 RAG Triad of metricsROUGEARESBLEURAGAs [1]。本文将重点介绍如何使用 RAGAs [1] 评估 RAG 管道。

RAGAs 是什么

RAGAs(Retrieval-Augmented Generation Assessment)是一个框架(GitHubDocs),为您提供了评估 RAG 管道组件所需的必要要素。

评估数据

RAGAs 有趣的是,它起初是一个用于“无参考”评估的框架[1]。这意味着,RAGAs 在后台利用 LLMs 进行评估,而不需要依赖评估数据集中的人类标注实际标签。

评估 RAG 管道时,RAGAs 需要以下信息:

  • question:RAG 管道的输入用户查询。输入数据。

  • answer:来自 RAG 管道生成的答案。输出结果。

  • contexts:用于回答question的从外部知识源检索到的上下文。

  • ground_truthsquestion的实际答案。这是唯一的人类标注的信息。此信息仅在指标context_recall(见 Evaluation Metrics)中需要。

利用 LLMs 进行无参考评估是一个活跃的研究话题。虽然使用尽可能少的人类标注数据使其成为一种更便宜、更快的评估方法,但仍存在一些关于其缺陷的讨论,例如偏见3。然而,一些论文已经展示了有前景的结果4。有关详细信息,请参见 RAGAs [1]论文的“相关工作”部分。

请注意,该框架已经扩展,以提供需要实际标签的指标和范式(例如,context_recallanswer_correctness,见 Evaluation Metrics)。

此外,框架为 自动测试数据生成 提供了工具。

评估指标

RAGAs 提供了一些 指标 来评估 RAG 管道的组件级别以及端到端。

组件级别,RAGAs 为您提供了评估检索组件(context_relevancycontext_recall)以及生成组件(faithfulnessanswer_relevancy)的指标 2

  • 上下文精确度 衡量检索到的上下文的信噪比。该指标使用 questioncontexts 计算。

  • 上下文召回率 衡量是否检索到了回答问题所需的所有相关信息。该指标基于 ground_truth(这是框架中唯一依赖人工标注真实标签的指标)和 contexts 计算。

  • 忠实性 衡量生成答案的事实准确性。正确陈述的数量除以生成答案中的总陈述数量。该指标使用 questioncontextsanswer

  • 回答相关性 衡量生成的回答与问题的相关程度。该指标使用 questionanswer 计算。例如,对于问题“法国在哪里,它的首都是什么?”,回答“法国位于西欧。”会获得较低的回答相关性,因为它只回答了问题的一半。

所有指标都被缩放到 [0, 1] 范围内,较高的值表示更好的性能。

RAGAs 还为您提供了评估 RAG 管道 端到端 的指标,如 回答语义相似度回答正确性。本文关注于组件级别的指标。

使用 RAGAs 评估 RAG 应用程序

本节使用 RAGAs 评估一个最小的基础 RAG 管道,以展示如何使用 RAGAs,并提供对其评估指标的直观理解。

前提条件

确保您已安装所需的 Python 包:

  • langchainopenaiweaviate-client 用于 RAG 管道

  • ragas 用于评估 RAG 管道

#!pip install langchain openai weaviate-client ragas

此外,请在根目录下的 .env 文件中定义相关的环境变量。要获取 OpenAI API 密钥,您需要一个 OpenAI 账户,然后在 API keys 下选择“创建新密钥”。

OPENAI_API_KEY="<YOUR_OPENAI_API_KEY>"

设置 RAG 应用程序

在你可以评估你的 RAG 应用之前,你需要进行设置。我们将使用一个基础的 RAG 流水线。我们将简要介绍这一部分,因为我们将在接下来的文章中详细描述相同的设置。

检索增强生成(RAG):从理论到 LangChain 实现

从原始学术论文的理论到使用 OpenAI、Weaviate 和 LangChain 的 Python 实现

towardsdatascience.com

首先,你必须通过加载和分块文档来准备数据。

import requests
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter

url = "https://raw.githubusercontent.com/langchain-ai/langchain/master/docs/docs/modules/state_of_the_union.txt"
res = requests.get(url)
with open("state_of_the_union.txt", "w") as f:
    f.write(res.text)

# Load the data
loader = TextLoader('./state_of_the_union.txt')
documents = loader.load()

# Chunk the data
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = text_splitter.split_documents(documents)

接下来,为每个块生成向量嵌入,并将其存储在向量数据库中。

from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Weaviate
import weaviate
from weaviate.embedded import EmbeddedOptions
from dotenv import load_dotenv,find_dotenv

# Load OpenAI API key from .env file
load_dotenv(find_dotenv())

# Setup vector database
client = weaviate.Client(
  embedded_options = EmbeddedOptions()
)

# Populate vector database
vectorstore = Weaviate.from_documents(
    client = client,    
    documents = chunks,
    embedding = OpenAIEmbeddings(),
    by_text = False
)

# Define vectorstore as retriever to enable semantic search
retriever = vectorstore.as_retriever()

最后,设置一个提示模板和 OpenAI LLM,并将它们与检索组件组合成一个 RAG 流水线。

from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema.runnable import RunnablePassthrough
from langchain.schema.output_parser import StrOutputParser

# Define LLM
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)

# Define prompt template
template = """You are an assistant for question-answering tasks. 
Use the following pieces of retrieved context to answer the question. 
If you don't know the answer, just say that you don't know. 
Use two sentences maximum and keep the answer concise.
Question: {question} 
Context: {context} 
Answer:
"""

prompt = ChatPromptTemplate.from_template(template)

# Setup RAG pipeline
rag_chain = (
    {"context": retriever,  "question": RunnablePassthrough()} 
    | prompt 
    | llm
    | StrOutputParser() 
)

准备评估数据

由于 RAGAs 旨在成为一个无参考的评估框架,因此评估数据集的准备工作最少。你需要准备 questionground_truths 对,从中你可以通过推断准备其余信息,如下所示:

from datasets import Dataset

questions = ["What did the president say about Justice Breyer?", 
             "What did the president say about Intel's CEO?",
             "What did the president say about gun violence?",
            ]
ground_truths = [["The president said that Justice Breyer has dedicated his life to serve the country and thanked him for his service."],
                ["The president said that Pat Gelsinger is ready to increase Intel's investment to $100 billion."],
                ["The president asked Congress to pass proven measures to reduce gun violence."]]
answers = []
contexts = []

# Inference
for query in questions:
  answers.append(rag_chain.invoke(query))
  contexts.append([docs.page_content for docs in retriever.get_relevant_documents(query)])

# To dict
data = {
    "question": questions,
    "answer": answers,
    "contexts": contexts,
    "ground_truths": ground_truths
}

# Convert dict to dataset
dataset = Dataset.from_dict(data)

如果你对 context_recall 指标不感兴趣,你不需要提供 ground_truths 信息。在这种情况下,你只需准备 question

评估 RAG 应用

首先,从 ragas.metrics 导入你想使用的所有指标。然后,你可以使用 evaluate() 函数并简单地传入相关指标和准备好的数据集。

from ragas import evaluate
from ragas.metrics import (
    faithfulness,
    answer_relevancy,
    context_recall,
    context_precision,
)

result = evaluate(
    dataset = dataset, 
    metrics=[
        context_precision,
        context_recall,
        faithfulness,
        answer_relevancy,
    ],
)

df = result.to_pandas()

以下是示例的 RAGAs 评分结果:

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

RAGAs 评分包括上下文精确度、上下文召回率、准确性和答案相关性。

我们可以做出以下观察:

  • context_relevancy(检索到的上下文的信噪比):虽然 LLM 认为所有上下文对最后一个问题是相关的,但也认为第二个问题的多数检索上下文是不相关的。根据这个指标,你可以尝试不同数量的检索上下文,以减少噪声。

  • context_recall(是否检索到回答问题所需的所有相关信息):LLMs 评估检索到的上下文包含回答问题所需的相关信息。

  • faithfulness(生成答案的事实准确性):虽然 LLM 认为第一个和最后一个问题回答正确,但对第二个问题的回答(错误地说总统没有提到 Intel 的 CEO)则被评为 0.5。

  • answer_relevancy(生成答案与问题的相关性):所有生成的答案都被评估为与问题较为相关。

如在评估数据中提到的,使用 LLMs 进行无参考评估是一个活跃的研究领域。我很想看看这个话题会如何发展。

摘要

构建概念验证 RAG 应用程序很简单,但让其性能达到生产就绪水平则很困难。像机器学习项目一样,你应通过验证数据集和评估指标来评估 RAG 管道的性能。

然而,由于 RAG 管道由多个组件组成,必须分别以及组合地进行评估,你将需要一套评估指标。此外,从人工注释者那里生成高质量的验证数据集既困难又耗时且昂贵。

本文介绍了RAGAs [1] 评估框架。该框架提出了四个评估指标——context_relevancycontext_recallfaithfulnessanswer_relevancy——这些指标共同组成了 RAGAs 评分。此外,RAGAs 利用 LLMs 进行无参考评估以节省成本。

现在你已经具备了评估 RAG 应用性能的工具,我推荐建立实验管道并开始使用以下调优策略来优化性能:

## 关于生产就绪 RAG 应用的 12 种调优策略指南

如何通过这些“超参数”提升你的检索增强生成(RAG)管道的性能……

towardsdatascience.com

你可以在这个 GitHub 仓库中找到生成这个数据集的代码。

享受这篇文章了吗?

免费订阅 以便在我发布新故事时收到通知。

[## 关注 Leonie Monigatti 的每次发布即可收到电子邮件。

关注 Leonie Monigatti 的每次发布即可收到电子邮件。通过注册,如果你还没有 Medium 账户,你将创建一个…

medium.com](https://medium.com/@iamleonie/subscribe?source=post_page-----81d67b0ee31a--------------------------------)

可以在 LinkedInTwitter以及 Kaggle找到我!

免责声明

在撰写本文时,我是 Weaviate 的一名开发者倡导者,Weaviate 是一个开源向量数据库。

参考文献

[1] Es, S., James, J., Espinosa-Anke, L., & Schockaert, S. (2023). RAGAs: 自动化检索增强生成的评估。arXiv 预印本 arXiv:2309.15217

2 RAGAs 文档 (2023)。文档(访问日期:2023 年 12 月 11 日)

3 Wang, P., Li, L., Chen, L., Zhu, D., Lin, B., Cao, Y., … & Sui, Z. (2023). 大型语言模型并不是公平的评估者。arXiv 预印本 arXiv:2305.17926

4 Liu, Y., Iter, D., Xu, Y., Wang, S., Xu, R., & Zhu, C. (2023). G-eval: 使用 GPT-4 进行 Nlg 评估,提供更好的人工对齐,2023 年 5 月。arXiv 预印本 arXiv:2303.16634, 6

图像

如果没有特别说明,所有图像均由作者创建。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值