TowardsDataScience 博客中文翻译 2022(二百零七)

原文:TowardsDataScience

协议:CC BY-NC-SA 4.0

深度学习如何对病历进行编码

原文:https://towardsdatascience.com/how-to-encode-medical-records-for-deep-learning-fcd690630e8b

基于 Google Brain 的*可扩展、精准的深度学习与电子健康记录及其补充材料的简化图解。*

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

图片来源:pixabay.com

背景

十多年前,医疗保健行业开始系统地数字化医疗保健数据。希望有一天,我们能够协调来自不同来源的数据,形成患者的“纵向视图”,其中包括关于患者健康的一切,从门诊、住院和用药史到免疫记录、家族史和生活方式观察。人们普遍认为,一旦掌握了患者医疗保健数据的丰富性和完整性,我们就可以大大提高医疗质量、降低运营成本并推进医疗/药物研究。

如果你关注医疗保健技术领域的最新趋势,你会发现这一希望正在变成现实。在一些受控环境中,医疗保健提供商、支付者和研究人员开始从特殊的上游系统中收集越来越多的数据,以构建全面的患者记录。随着这一令人兴奋的发展,现在出现了一个价值百万美元的问题:我们如何真正去利用这些数据记录的力量?

虽然数据分析或机器学习模型开发通常会吸引更多的注意力,但不应忽视数据工程的重要性。这篇博文有一个非常具体的重点。它研究了如何对病历进行编码,并使其适合深度学习,特别是时间序列学习。用简化的例子和可视化的图形说明了 Google Brain 的“ 利用电子健康记录进行可扩展的、精确的深度学习 ”及其补充材料中提出的方法。如果你不想阅读原本 30+页的深奥内容,这篇博文对你来说是个不错的替代。事不宜迟,我们开始吧。

学习任务的设置

学习任务的设置是为重症监护室(ICU)病人做预测。谷歌大脑和许多其他研究人员选择 ICU 设置,因为与其他医疗保健数据相比,ICU 的数据通常是最完整的,可供研究使用。我们可以预测很多事情。我们可以预测临床结果——在这种情况下,死亡事件。我们可以预测资源利用率,在这种情况下,停留时间超过 7 天。我们可以预测护理质量,在这种情况下,出院后 30 天再入院。

传统方法/模型依赖于在预测时评估的精选特征变量。这篇博文最后总结了一些流行的 ICU 分析模型。然而,谷歌大脑团队假设,通过考虑所有可用的患者数据,并执行时间序列分析,可以实现对所有上述结果的更准确预测,这在数据验证中证明是成功的。这里的意义在于

  • 它不需要手动选择特征-模型将学习权衡和组合特征
  • 并且使用患者的所有历史数据,这与仅使用当前快照的其他流行的非深度学习模型相反。

现在,学习任务的设置已经清楚了,让我们深入编码过程,看看病历是如何为学习任务转换的。

编码程序

谷歌大脑团队首先将他们从合作医院获得的 ICU 数据转换为一种开放的医疗保健数据标准,称为 FHIR。要完全解释 FHIR,还需要另外 10 篇博文。但它的核心思想并不难理解。出于这篇博文的目的,我们可以把它想象成 JSON 数据。每个医疗保健概念都有一个 JSON 数据模式— PatientObservationConditionMedicationRequest等等,它们都是医疗保健概念。JSON 数据模式将各个医疗保健概念的字段形式化。比如Patient有一个name,一个birthdayObservationvalue等。从专有医疗保健数据到我们需要的 JSON 数据的转换相对简单,因为大多数专有医疗保健系统也基于公共医疗保健概念对其数据进行建模。

这里要注意的一件重要事情是,虽然结构转换是可以实现的,但医疗保健中的语义翻译极具挑战性。因为医疗保健数据采用各种(有时是专有的)编码系统。"Heart failure"在一个编码系统中可能是"123",在另一个编码系统中可能是"1a2b3c"。不同的编码系统有不同的粒度和层次。将所有东西整合到一个单一的编码系统中是一项艰巨的任务。谷歌大脑团队的方法不需要** 编码系统协调,这是一个至高无上的优势。正如我们将在后面看到的,他们可以做到这一点,因为他们将数据内容视为令牌,并将令牌转换为嵌入。因此,只要医疗数据集使用一套一致的编码系统(具体是什么并不重要),就应该没问题。下面我们来看看具体步骤。**

步骤 1:标记化

第一步是标记所有医疗保健概念中的所有字段。如果它是一个文本字段,我们就用空格来分隔它。比如"high glucose"变成了["high", "glucose"]。对于数值型字段,仅仅把普通的数字当作一个令牌是没有意义的。所以我们需要编码更多的上下文。我们将名称(通常是编码值、数量和单位)连接在一起,形成一个令牌。比如{code:"33747003",quantity:10.2,unit:"mmol/L"}变成了"33747003_10.2_mmol/L"。参见图 1 中的图解。可选地,我们可以量化数量以减少令牌的稀疏性。在步骤 1 之后,我们得到的是医疗保健概念的实例,其中每个实例的所有字段都进行了标记。我们将每个实例的时间戳计算为相对于预定义预测时间(图 1 中的dt1dt2)的以秒为单位的增量时间。预测时间通常是入院后 24 小时或出院时。

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

图 1:标记化+嵌入。图片作者。

第二步:嵌入

对于每个医疗保健概念中的每个领域,我们都建立了一个预定义大小的词汇表。我们不使用全球词汇,因为不同的领域有不同的医疗保健语义。将来自所有概念的所有标记甚至来自一个概念中所有领域的所有标记混合起来构建词汇表是没有意义的。然后,我们为每个令牌训练一个嵌入。嵌入是与预测任务一起学习的。请注意,我们特意为给定医疗保健概念中的所有字段选择相同的嵌入维度。正如我们将在后面看到的,它使聚合变得更加容易。

在步骤 2 之后,我们得到的类似于图 2。它开始类似于典型的自然语言处理输入,其中你有一系列嵌入,你可以馈送到递归神经网络(RNN)。然而,目前的格式有三个问题:

  1. 每个实例都是一个训练示例。ICU 设置中有数百甚至数千个数据点。我们知道 RNN 不擅长长序列。
  2. 训练示例具有可变的维度,这由所讨论的概念和实例中的标记数量来确定。RNN 不能处理可变长度的嵌入。
  3. 实例/训练示例的时间戳不是均匀分布的。特定事件何时发生具有重要的临床意义。嵌入没有捕捉到。

步骤 3 将解决所有 3 个问题。

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

图 2:一系列嵌入。图片作者。

第三步:聚合

长序列的第一个问题很容易解决。我们只需要将数据点分成均匀的时间步长。时间步长可以是 1 小时或几小时,可以作为超参数进行调整。我们将在给定的时间步长内聚合所有数据点,以形成单个训练示例。

请记住,给定医疗保健概念中的所有字段共享相同的嵌入维度。因此,我们可以取一个实例中所有字段嵌入的平均值,以形成该实例的聚合嵌入。如果一个概念有多个实例,我们可以进一步平均实例嵌入来形成这个概念的嵌入。由于医疗保健概念是一个预定义的枚举列表,我们可以将概念嵌入连接在一起,形成一个固定大小的示例。如果一个概念没有出现在时间步长中,我们只需将其嵌入设置为全 0。变维的第二个问题现在没有了。注意,我们使用 average throughout 进行聚合,但是您可以想象使用其他聚合方案。

为了解决时间戳含义的最后一个问题,我们取时间戳中所有实例的时间戳的平均值,并将其附加到我们通过字段->实例和实例->概念聚合获得的固定大小嵌入的末尾。这样,时间戳信号也在训练示例中进行了编码。

最终编码结果的图示见图 3。我们现在有了一个不太长的固定大小的嵌入序列,它考虑了事件时间戳。我们现在可以把它喂给 RNN 了。

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

图 3:RNN 的最终输入。图片作者。

结论

在这篇博客文章中,我们一步一步地演示了如何为 RNN 模型编码医疗记录。它首先将从合作伙伴组织接收的专有数据格式转换成开放的标准 JSON 格式。这使我们能够从结构上理解源数据集。然后,它将每个 JSON 字段中的内容标记化,并为每个标记构建一个嵌入。最后,它在合理的时间范围内聚合令牌嵌入,以创建适合 RNN 模型输入的合理长的固定大小嵌入序列。

上述数据处理的意义是双重的:

  1. 它不需要将病历整合到一个全球编码系统中,从而节省了大量的人工工作。
  2. 它以一种同质的方式对整个患者历史中的所有记录进行编码,以便在模型训练期间可以考虑所有这些记录。

附录:其他常见的非深度学习 ICU 数据分析模型

早期预警评分(EWS)通常在入院后 24 小时计算,以预测死亡的可能性。它使用呼吸频率、氧饱和度、温度、血压、心率和意识等级作为变量。每个变量都有一个由普通医学知识确定的正常范围。基于查找表计算得分,以表征变量离其正常范围有多远。如果所有分数的总和超过一个阈值,这意味着死亡的可能性很高。

再入院的医院评分通常在出院时计算。它考虑了血红蛋白水平、钠水平、入院类型、先前入院次数、住院时间、住院时间是否与癌症相关,以及住院期间是否进行了医疗程序。与上述 EWS 类似,基于已有的医学知识,每个因素的值被转化为风险分值,风险分值的总和描述了再入院的总体风险。

住院时间长的刘评分一般在入院后 24 小时计算。逻辑回归模型(使用适当的正则化技术)将年龄、性别、病情类别、诊断代码、接受的医院服务和生命体征的实验室测试等变量考虑在内,以产生长期住院的概率数字。

如何集成聚类算法

原文:https://towardsdatascience.com/how-to-ensemble-clustering-algorithms-bf78d7602265

意思是你从未见过的

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

照片由杜凡Unsplash 上拍摄

介绍

在人工智能背景下,集成是一种试图通过聚合多个机器学习模型的预测来提高性能的技术。它可以被认为是一种元学习,其中外部代理通过判断其他代理的单独预测来计算最终预测。

有几种方法可以集成监督算法,如 bagging 和 boosting。特别是,boosting 技术(尤其是 XGBoost)成为任何机器学习应用程序中不可或缺的工具。

另一方面,在无监督的问题中,我们没有听到很多关于集成技术。那么,有可能在聚类算法中使用这种技术吗?这不仅是可能的,而且这些年来已经发展了许多策略[1]。这篇文章探讨了其中的两个。

相似矩阵

与监督方法不同,在监督方法中,集成可以通过将学习者堆叠在其他学习者之上来直接完成,聚类不是那么简单。

在聚类中,数据的最终标签本身没有意义,一个点是在聚类 1 中还是在聚类 2 中并不重要,重要的是谁也在这个聚类中。因此,连接两个不同聚类结果的信息并不像在分类中比较最终标签是否相同那样简单。需要某种方法来计算不同分区上存在多少一致性。

相似性矩阵是将这些信息转换成数据结构的简单方法。它的构造如下:

考虑到我们的数据集上有 n 个点,相似性矩阵将是一个 n x n 矩阵,其中位置( i,j) 包含点 I 和 j 在同一个聚类中落了多少次。下图显示了该矩阵的一个示例。

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

相似性矩阵示例。图片由作者提供。

表示这些信息的更好方法是使用百分比而不是固体计数。在这种归一化形式中,每个位置( i,j )表示 I 和 j 一起落在同一聚类中的概率。这种标准化是通过将每一行除以其对角线值(总计数)来获得的。

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

标准化相似性矩阵示例。图片由作者提供。

这种方法更适合机器学习,因为所有值都落在范围[0,1]内。标准化的相似性矩阵将是我们接下来部分的基本构建模块。

具有图连通分量的系综

“图形连接组件”看起来像一个七眼怪物,但却是一个非常简单的技术。这种方法认为出现在一起超过 X%的时间(例如 10%或 50%)的两个点(在同一聚类中)应该在同一最终聚类中。

如果我们将相似性矩阵视为一个图,其中每个点都是一个节点,并且来自(I,j)的边的权重等于矩阵中(I,j)的值,那么这种方法实质上是移除值低于阈值(X%)的边,断开节点。保持连接的节点组是我们的最终集群。这就是这种方法被称为“连接组件”的原因。

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

从图表中删除边。图片作者。

因为它基于简单的阈值创建新的聚类,所以可以认为它等同于用于监督模型的简单 bagging 集成方法。

让我们看一个 Python 中的例子。

第一步是创建聚类数据集。

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

聚类数据集。图片由作者提供。

下面的代码使用 K-Means 应用了这种集成聚类技术。

完整代码可在 github 上获得,为了提高可读性,省略了实现细节。

我们来解释一下代码。

NUM_KMEANS=32 是集合中使用的 k 均值模型的总数。

该代码使用 MiniBatchKMeans 来减少训练时间。设置 n_init=1 是必不可少的,因为在默认情况下,sklearn 的 K-means 模型会执行多次,并且只保留最好的结果。因为我们希望存储所有结果,所以值 n_init=1 确保了这一点。减少 max_iter 和 batch_size 也可以提高代码速度。

ClusterSimilarityMatrix 只是一个创建相似性矩阵的简单模块。它接收聚类分区并迭代更新计数。相似矩阵建立后,进行归一化处理。

下面一行代码是模型的核心。

graph = (norm_sim_matrix>MIN_PROBABILITY).astype(int)

在这里,低于 MIN_PROBABILITY=0.6 的概率变成 0(从图中移除边),而高于 MIN _ PROBABILITY = 0.6 的概率变成 1(保持图中的边)。

MIN_PROBABILITY 的值作为一个超参数,应该被细化以达到预期的结果。如果它的值设置得太高(0.9–1.0),数据可能会分布在许多小簇中,如果它设置得太低(0.2–0.4),它可能会找到大簇。

在那之后,只是找到图的连通部分的问题。幸运的是,scipy 包已经给了我们代码。

所以,让我们看看结果。

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

k 均值图结果。图片作者。

正如我们所看到的,集成技术的结果与数据应该如何划分的预期更加一致。

这个技术挺有意思的。众所周知,K-means 只能找到球状星团,使用预定义的 k 值将空间划分为 Voronoi 单元。但是,通过在这种简单的集合技术中应用 k-means 的大军,他们能够找到更复杂形状的星团,如 HDBSCAN。

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

世卫组织会赢吗?图片由作者提供。

与其他聚类模型集成

许多聚类算法利用数据的中间表示,例如邻居图或距离矩阵,以便找到最终的聚类。例如,著名的 HDBSCAN 使用最小生成树来表示数据。

因此,许多聚类算法接受相似性/距离矩阵作为输入,而不是常规的点列表。因此,前面介绍的相似性矩阵可以输入其中。

这种方法背后的思想是使用一组“较弱的”聚类算法为后面的算法创建一个“较强的”基础。这种方法类似于监督机器学习中的推进技术。

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

K-均值和谱的集成。图片作者。

让我们看下面的例子,在这个例子中,我们使用常规的 K-Means 来“提高”谱聚类算法的性能。

重要的是要记住“改进”和“更好”的概念在集群中可能是棘手的,因为没有集群是/应该是什么样子的明确绝对定义[2]。

像以前一样,创建了一组 NUM _ 均值 K 均值模型。aggregator_clt 是负责聚类相似性矩阵的算法,创建最终的聚类标签。

128 个 K 均值模型被用作“较弱”的学习器,谱聚类被用作聚合器。设置 affinity="precomputed "很重要,这样模型才能理解相似性矩阵是为*传递的。*合体()【法。

:
谱聚类算法接受相似性矩阵,但并非所有超参数(sklearn)中具有 affinity="precomputed "或 metric="precomputed "的聚类模型都是如此。有的需要一个距离矩阵,正好相反。将归一化相似度矩阵转换为距离矩阵的简单方法是应用对数变换,距离= -log(相似度),只需使用一些技术来避免 0≥相似度或相似度> 1

EnsembleClustering 是一个简单的类,用于封装相似性矩阵的创建和模型的训练。

所以,让我们看看结果。

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

集合 K-均值+光谱与光谱独奏。图片由作者提供。

谱聚类不是像 k-means 那样简单的模型,(奇怪的是,它可以使用 K-Means 作为实现的一个步骤),但是它不能找到我们想要的聚类。集成方法在视觉上比单独的谱聚类执行得更好。

重要的是要记住,这篇文章使用迷你批处理 k-means 只是为了提高执行速度。任何聚类算法都可以用来构建相似性矩阵(只是要小心离群值)。因此,作为家庭作业,我建议尝试使用一组异构聚类算法运行代码,如下图所示。

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

使用不同来源构建相似性矩阵。图片由作者提供。

结论

集成技术在许多监督机器学习任务中达到了最先进的水平。另一方面,在集群中,它们不太出名,实现起来也不那么简单。希望这篇文章能让我们了解如何在聚类上进行集成。

我们能够使用 K-means 模型(最简单的聚类模型之一)来执行非球状聚类,而不需要传递 K 值。它还能够“改进”另一种聚类算法的结果。

当然,像生活中的一切一样,没有什么灵丹妙药,这篇文章也不是由“集群合奏公司”赞助的。

这篇文章的主要目的是介绍集成聚类的技术。尽管它们非常简单,但我希望这篇文章中涉及的技术能够帮助您理解这个过程是如何工作的。

这篇短文只是触及了聚类集成主题的表面,请在下面的参考资料中搜索更多信息。包含代码的 Github 存储库也在参考资料部分。

感谢您的阅读!😃

参考

GitHub 上的代码:
https://GitHub . com/jaumpedro 214/posts/tree/main/ensamble _ clustering

[1]t .布恩戈恩和 n .伊姆翁(2018 年)。集群集成:最近扩展和应用的方法综述。 计算机科学评论28 ,1–25。
[2]亨宁,C. (2015)。什么是真正的集群?模式识别字母64 ,53–62。
【3】Scikit-Learn,聚类算法官方文档
【4】维基百科文章,组件(图论)

如何确保你能解释为什么你的模型做出预测

原文:https://towardsdatascience.com/how-to-ensure-you-can-explain-why-your-model-makes-predictions-d2c769270e

从模型中提取信息来解释为什么会做出预测的技术

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

Unsplash 上拍摄的 77 人需求系统

可解释性是你可以在机器学习和数据科学中学习和应用的最重要的主题之一。建立一个表现良好的模型是一回事,帮助你和其他人理解为什么一个模型会产生它所产生的结果是另一回事。

我们举个例子。假设您正在构建一个机器学习模型,该模型将预测客户购买产品的可能性。我们可能有关于他们的不同的人口统计信息,我们可能有关于他们消费的其他产品的信息,我们可能有关于他们的营销信息。仅仅预测客户购买产品的可能性是不够的,我们需要了解他们为什么购买。

通过了解该模型的关键驱动因素,我们或许能够通过关注这些关键驱动因素来提高销售转化率。例如,我们知道人们在一个月或一天中的特定时间更有可能改变信仰;我们可以将我们的销售努力集中在那些更有成效的时间窗口。

现在回想一下你的基础统计学课程和学习简单的线性回归。我们大概都记得一条线的方程:Y = MX + B。我们利用这个等式和系数来预测Y的新值。许多机器学习模型也是如此。如果我们能解释一个模型的每个特征如何影响结果,我们就能帮助其他人理解它是如何工作的。关于简单线性回归的更多内容,请查看我的文章:了解 Excel 强大的线性回归工具。我们将从三个主要方面来解释你的模型。让我们跳进来吧!

  1. 线性和逻辑回归系数
  2. 特征重要性
  3. SHAP 价值观

数据和导入

对于我们今天的演示,我们将使用银行营销 UCI 数据集,您可以在 Kaggle 上找到该数据集。该数据集包含有关营销活动中银行客户的信息,以及可以在分类模型中使用的目标变量。该数据集位于 CC0:公共领域下的公共领域,可用于任何目的。

有关构建分类模型的更多信息,请查看:构建令人惊叹的二进制分类器所需要知道的一切通过多类和多标签模型超越了二进制分类。此外,查看一篇密切相关的文章 4 在机器学习模型中增强特征选择的方法

我们将从导入必要的库和加载数据开始。我们将利用 Scikit-Learn 来学习每一种不同的技术。

import pandas as pd

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import MinMaxScaler
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OrdinalEncoder
from sklearn.compose import make_column_selector as selector
from sklearn.pipeline import Pipeline

import xgboost
import shap

import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_csv("bank.csv", delimiter=";")

# This column has too much effect on the model, so we'll drop it
df = df.drop(["duration"], axis=1)

数据准备

我们需要对这个数据集做的第一件事是将我们的目标变量从其余数据中分离出来。因为它位于最后一列,所以我们可以使用iloc函数来分隔它。

# Separate the target variable from the rest of the data
X = df.iloc[:, :-1]
y = df.iloc[:,-1]

像往常一样,我们希望为机器学习准备数据。这意味着对分类值进行编码、对文本进行矢量化(如果合适的话)以及对数值进行缩放。我总是使用管道来确保数据的一致转换。查看我的文章,停止一步一步地构建你的模型。利用管道实现流程自动化!,了解更多关于管道的信息。

我们将利用一个ColumnTransformer并将MinMaxScaler应用于数字数据,将OrdinalEncoder应用于分类数据。有许多编码数据的策略,例如OneHotencoder。然而,出于解释的目的,我们将通过简单地使用序号编码器得到一个更易解释的结果模型集,因为对于每个分类值,列将保持为单个列,而不是多个列。

column_trans = ColumnTransformer(transformers=
        [('num', MinMaxScaler(), selector(dtype_exclude="object")),
        ('cat', OrdinalEncoder(),selector(dtype_include="object"))],
        remainder='drop')

利用我们的y值上的LabelEncoder来确保它被编码为一个数值也是一个最佳实践。

# Encode the target variable
le = LabelEncoder()
y = le.fit_transform(y)

最后,在我们开始之前,我们将把我们的数据分成训练测试组。

# Split the data into 30% test and 70% training
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

线性和逻辑回归系数

正如在引言中提到的,线性和逻辑模型是非常好解释的。我们可以很容易地提取每个特征的系数,并用它们来解释模型。如果你的数据适合线性或逻辑回归,它们往往是解释能力的最佳模型之一。您可以根据每个要素对结果的影响对其应用数学权重。让我们看一个数据集上的例子。

我们将从创建我们的分类器管道的实例开始,使适合我们的训练数据。

# Create a random forest classifier for feature importance
clf = LogisticRegression(random_state=42, 
                             max_iter=1000, 
                             class_weight='balanced')

pipeline = Pipeline([('prep',column_trans),
                        ('clf', clf)])

# Fit the model to the data
pipeline.fit(X_train, y_train)

现在我们有了 fit 管道,我们可以从中提取一些信息。这里,我们通过调用管道中分类器的coef_属性来提取每个特征的系数。

pipeline['clf'].coef_[0]
array([0.75471553, -1.11473323, -0.0714886 , -3.2587945 , 1.78373751,
        2.61506079,  0.02806859,  0.13490259,  0.1151557 ,  0.09080435,
       -0.47980448, -0.82908536, -0.5171127 ,  0.01441912,  0.14207762])

您可以看到数据集中每一列的每个系数,正的或负的。我们一会儿会让它更容易阅读。在此之前,我们先来看看intercept_

pipeline['clf'].intercept_[0]
-0.5418635990682154

让我们以更易读的格式显示系数。我们将首先创建一个包含系数和列名的数据框。

feat_list = []
total_importance = 0
# Make a data frame of Coefficients and Feature Names
for feature in zip(X, pipeline['clf'].coef_[0]):
    feat_list.append(feature)
    total_importance += feature[1]

# create DataFrame using data
df_imp = pd.DataFrame(feat_list, columns =['FEATURE', 'COEFFICIENT']).sort_values(by='IMPORTANCE', ascending=False)
df_imp.sort_values(by='IMPORTANCE', ascending=False)
 FEATURE  COEFFICIENT
5     balance     2.615061
4     default     1.783738
0         age     0.754716
14   poutcome     0.142078
7        loan     0.134903
8     contact     0.115156
9         day     0.090804
6     housing     0.028069
13   previous     0.014419
2     marital    -0.071489
10      month    -0.479804
12      pdays    -0.517113
11   campaign    -0.829085
1         job    -1.114733
3   education    -3.258795

现在我们可以很容易地看到每个特性对模型结果的影响。例如平衡的系数为2.615061。这意味着平衡每增加一个单位,正面结果的几率就会增加2.615061。我们还可以看到教育有一个-3.258795的系数。这意味着教育每增加一个单位,积极成果的概率就会减少-3.258795

在这种情况下,你可以与销售和营销人员沟通的一种方式是“关注平衡水平较高的人,避开教育水平较低的人”。

特征重要性

接下来,对于基于树的分类器和回归器,我们可以输出特征重要性。这是一个极好的功能,既可以选择最有影响力的功能,也可以帮助解释模型。让我们看一个使用数据集的例子。我们将以与之前相同的方式开始,创建分类器和管道的实例,然后使其适合我们的训练数据。

# Create a random forest classifier for feature importance
clf = RandomForestClassifier(random_state=42, 
                             n_jobs=6, 
                             class_weight='balanced')

pipeline = Pipeline([('prep',column_trans),
                        ('clf', clf)])

pipeline.fit(X_train, y_train)

类似于逻辑回归的coef_属性,我们有一个feature_importances_属性为我们提供相对重要性。与系数不同,特征重要性是每个特征重要性的相对度量。所有特征重要性的总和等于 1。您可以将这些视为相对重要性,而不是数学权重。

pipeline['clf'].feature_importances_
array([0.15169613, 0.1668886 , 0.13429024, 0.07288524, 0.05647985,
       0.02818437, 0.07880281, 0.03797838, 0.04328934, 0.00404282,
       0.02838248, 0.02165701, 0.04896554, 0.09215941, 0.03429777])

让我们用一种更易读的格式来显示特性的重要性。我们将首先创建一个数据框,其中包含要素重要性、列名以及所有要素重要性的累积和。

feat_list = []

total_importance = 0
# Print the name and gini importance of each feature
for feature in zip(X, pipeline['clf'].feature_importances_):
    feat_list.append(feature)
    total_importance += feature[1]

# create DataFrame using data
df_imp = pd.DataFrame(feat_list, columns =['FEATURE', 'IMPORTANCE']).sort_values(by='IMPORTANCE', ascending=False)
df_imp['CUMSUM'] = df_imp['IMPORTANCE'].cumsum()
df_imp
 FEATURE  IMPORTANCE    CUMSUM
1         job    0.166889  0.166889
0         age    0.151696  0.318585
2     marital    0.134290  0.452875
13   previous    0.092159  0.545034
6     housing    0.078803  0.623837
3   education    0.072885  0.696722
4     default    0.056480  0.753202
12      pdays    0.048966  0.802168
8     contact    0.043289  0.845457
7        loan    0.037978  0.883436
14   poutcome    0.034298  0.917733
10      month    0.028382  0.946116
5     balance    0.028184  0.974300
11   campaign    0.021657  0.995957
9         day    0.004043  1.000000

我们可以看到工作是最重要的特征,其次是年龄婚姻。再次注意,这和我们看系数的方式有点不同。例如,年龄很容易用系数来解释,因为数字越大,人的年龄就越大,但是对于工作,我们有一个编码特征,它不是真正有序的,这使得它对系数意义不大,但对特征重要性意义更大。这是你的管道和编码策略需要考虑的事情——你将如何解释结果?

SHAP 价值观

SHAP ,代表 SHapley 加法解释,是最先进的机器学习解释能力。该算法于 2017 年由 Lundberg 和 Lee 首次发表,是一种对任何预测算法的输出进行逆向工程的方法。

SHAP 基于博弈论的一个概念,我们有复制模型结果的游戏,而玩家是模型中包含的特征。SHAP 量化了每个玩家对游戏的贡献。

让我们看看 SHAP 是如何处理我们的数据集的。我们将首先创建一个分类器实例,在本例中是非常流行的 XGBoost 和 pipeline,然后使它适合我们的训练数据。

clf = xgboost.XGBRegressor()

pipeline = Pipeline([('prep',column_trans),
                        ('clf', clf)])

pipeline.fit(X_train, y_train);
model = pipeline['clf']

# explain the model's predictions using SHAP
explainer = shap.Explainer(model, 
                           pipeline['prep'].transform(X_train), 
                           feature_names=X_train.columns)
shap_values = explainer(pipeline['prep'].transform(X_train))

# visualize the first prediction's explanation
fig = shap.plots.waterfall(shap_values[1])
plt.tight_layout()
plt.savefig('explainability_01.png', dpi=300);

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

作者图片

瀑布图显示了对单个预测的解释。每一行都显示了每个要素的正(红色)或负(蓝色)贡献如何移动本次预测的预期模型输出值。

看 x 轴,可以看到期望值E[f(x)] = 0.112。该值是所有观测值的平均预测值。结束值为f(x) = 0.053,是本次观测的预测数。在本例中,我们有一个二进制目标值,因此该预测非常接近于0或在营销活动中无法转化的客户)。SHAP 值是介于两者之间的所有值。例如,婚姻状态的积极变化将增加0.04产生积极结果的概率。

结论

机器学习中的模型可解释性是你可以在实践中学习和实现的最重要的概念之一。理解如何解释为什么您的模型会以这种方式执行,可以转化为更好的业务决策和对您的模型的更多信任。在这篇文章中,我们看了几种解释我们模型的方法。我们查看了逻辑回归的系数,随机森林模型的特征重要性,以及 XGBoost 模型的 SHAP 值。您可以使用这些方法来解释您的模型,并帮助您理解为什么您的模型会做出这样的预测。快乐模型建筑!

这篇文章的所有代码都可以在 GitHub 上找到。

如果你喜欢阅读这样的故事,并想支持我成为一名作家,考虑注册成为一名媒体成员。一个月 5 美元,让你可以无限制地访问成千上万篇文章。如果您使用 我的链接 注册,我将为您赚取一小笔佣金,无需额外费用。

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

原文:https://towardsdatascience.com/how-to-estimate-and-reduce-the-carbon-footprint-of-machine-learning-models-49f24510880

轻松估算机器学习模型碳足迹的两种方法和如何减少碳足迹的 17 个想法

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

照片由 Unsplash 上的卡拉什尼科夫拍摄

机器学习模型的环境影响越来越受到关注,但主要来自学术界。在这里,对话往往集中在语言模型的碳足迹上,这些语言模型不一定代表一般的机器学习领域,并且对机器学习模型的操作阶段的环境影响关注不够。

此外,关于机器学习的环境影响这一主题的现有材料对如何实际估计和减少环境影响的强调太少。本文试图解决这些问题,是为从事机器学习实践的从业者和研究人员而写的。虽然这篇文章是考虑到机器学习而写的,但其中的一些内容也适用于一般的软件工程。

这篇文章的结构如下:

  1. 首先,我们来看一些来自机器学习的碳排放的具体例子。
  2. 然后,我将介绍两种工具,它们可以用来估计机器学习模型的碳足迹。
  3. 在第三部分,我将提出 17 个想法,告诉你如何减少机器学习相关工作的碳足迹。
  4. 最后,我将介绍一些机器学习可持续性的考虑因素,这些考虑因素在这里没有直接提到,但仍然很重要。

在我们开始之前,我想强调的是,这篇文章不是用来指责或者说教的。这样做的目的只是为了展示你可能会发现或可能不会发现与你的日常活动相关的信息。

1.数据科学和机器学习对环境的影响

所有软件——从运行在我们手机上的应用程序到运行在云中的数据科学管道——都消耗电力,只要我们的电力不是全部由可再生能源产生,电力消耗就会产生碳足迹。这就是为什么机器学习模型可以有碳足迹。

我将使用术语“碳足迹”来指代 CO₂e 的排放量,其中“e”是“当量”的缩写由于甲烷、一氧化二氮甚至水蒸气等其他气体也具有变暖效应,为了简化起见,CO₂-equivalents (CO₂e)通常提供一种标准化的方法来描述一定量的气体会产生多大的变暖效应。

据我所知,在撰写本文时,还没有报告试图估算机器学习领域的总碳足迹。这个结论最近得到了[1]的呼应。

然而,在估计全球数据中心行业的总电力消耗方面已经进行了多种尝试。2015 年和 2016 年报告的数据中心全球能耗估计值在全球电力消耗的 3-5%之间[2][3]。最近,一些人声称数据中心占全球用电量的 1%[4][5]。根据我对这一主题的一些文献的回顾,我的印象是 1 %的估计比 5 %的估计更准确。

如果我们看看组织层面上机器学习的能耗,谷歌说公司总能耗的 15 %用于研究、开发和生产中与机器学习相关的计算[6]。NVIDIA 估计 80–90%的机器学习工作量是推理处理[7]。类似地,Amazon Web Services 已经声明云中 90%的机器学习需求是用于推理的[8]。这远远高于一家未透露姓名的大型云计算提供商在最近的经合组织报告[1]中提出的估计。这家提供商估计,企业客户在计算基础设施上的总支出中有 7-10%用于人工智能应用,其中 3-4.5%用于训练机器学习模型,4-4.5%用于推理。

现在让我们来看看机器学习模型碳足迹的一些具体例子。

表 1 显示了一些大型语言模型的估计能耗和碳足迹的概况。碳足迹从 3.2 吨到 552 吨 CO₂e.不等。现在你可能会注意到,PaLM 的能耗明显大于 GPT-3,尽管 GPT-3 的估计碳足迹是 PaLM 的两倍多。这可能是由于用于训练模型的电力的碳强度的差异。为了客观地看待这些大型语言模型的碳足迹,平均每个美国人一年产生 16.4 吨 CO₂e 排放量[9],平均每个丹麦人产生 11 吨 CO₂e 排放量[10]。因此,GPT 3 号的碳足迹大约相当于 50 个丹麦人一年的碳足迹。

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

表 1:7 个大型深度学习模型的能耗。改编自[6]和[11]

查看几个使用语言模型进行推理的碳足迹示例,脸书估计他们基于转换器的文本翻译通用语言模型的碳足迹主要由推理阶段控制,使用的推理资源(65%)比训练(35%)多得多[40]。脸书的 ML 训练任务的平均碳足迹是现代对话代理中使用的 Meena 的 1.8 倍,是 GPT-3 的 0.3 倍。

BigScience 的开源语言模型 BLOOM 在 18 天内处理了 230,768 个请求,消耗了 914 千瓦时的电力,排放了 360 千克的二氧化碳,相当于每个请求大约消耗 1.56 gco₂e[41]。

这些大型语言模型在碳足迹方面是极端的情况,很少有数据科学家会从头开始训练这样的大型模型。因此,现在让我们考虑一个可能更接近大多数数据科学家和 ML 工程师日常生活的案例。我最近在法兰克福的 GPU 上训练了一个用于时间序列预测的 Transformer 模型3 个小时。这消耗了 0.57 千瓦时的电力,碳足迹为 340 克 CO₂e,大约相当于一个丹麦人年碳足迹的 0.003 %。

从历史上看,获得最先进结果所需的计算量每 3.4 个月就会翻一番[12],因此这个问题可能会变得更加复杂——这是[13]中的一个担忧——尽管一些人预计由于算法和硬件的改进,能耗会降低[6]。

综上所述,由于缺乏数据,很难描绘出机器学习领域碳足迹的全貌,但特定的模型,特别是语言模型,可能会有很大的碳足迹,一些组织在机器学习相关活动上花费了相对较大的总能耗。

</8-podcast-episodes-on-the-climate-impact-of-machine-learning-54f1c19f52d>

2.如何估计机器学习模型的碳足迹

在我们深入研究可以估计机器学习模型碳足迹的工具的细节之前,熟悉一下计算碳足迹的公式是有帮助的。这非常简单:

碳足迹= E * C

其中 E 是在一些计算过程中消耗的电力单位的数量。这可以量化为千瓦时(kWh)。 C 是指生产一单位电能所排放的 CO₂e 量。这可以量化为每千瓦时电力排放的千克 CO₂e,有时也称为电力的碳强度。碳强度因地理区域而异,因为能源来源因区域而异。一些地区有大量的可再生能源,一些地区则较少。给定这个等式,我们现在可以看到,任何估计一些计算程序的碳足迹的工具必须测量或估计 EC.

有几种工具可以用来估计机器学习模型的碳足迹。根据我的经验,这些工具分为两类:

  1. 估算碳足迹的工具估算E ( 能源消耗)
  2. 测量值E ( 能源消耗)估算碳足迹的工具

在本帖中,我们将仔细看看两个这样的工具:

  1. ML CO2 影响,依赖于 E估计值,因此属于上述第 1 类
  2. CodeCarbon 依赖于 E测量值,因此属于上述类别 2

请注意,其他软件包,例如carbon tracker【14】和experiment-impact-tracker【15】提供了与 CodeCarbon 类似的功能,但我选择关注 CodeCarbon,因为这个软件包似乎在不断更新和扩展,而最近对 carbontrackerexperiment-impact-tracker的提交是很久以前的事了。

必须注意的是,本文中介绍的工具仅估算了一些计算过程中所使用的电力的碳足迹。例如,他们没有考虑与制造运行代码的硬件相关的排放。

2.1.用 ML CO2 影响估计机器学习模型碳足迹

基于网络的免费工具 ML CO2 Impact [16]通过估计训练过程的电力消耗来估计机器学习模型的碳足迹。要使用此工具估算碳足迹,您只需输入以下参数:

  1. 硬件类型(例如 A100 PCIe 40/80 GB)
  2. 硬件使用的小时数
  3. 使用了哪个云提供商
  4. 计算发生在哪个云区域(例如“欧洲-北方 1”)

该工具然后输出你的机器学习模型排放了多少千克 CO₂e。其计算方法如下:

基于当地电网的功耗时间碳排放量,例如:

250 瓦 x 100h 小时= 25 千瓦时 x 0.56 千克当量。二氧化碳/千瓦时= 14 公斤 CO₂e

该工具还显示了碳密度较低的云区的排放量。

像 ML CO2 Impact 这样的工具的好处是,它可以事后用于估计你自己或其他人的模型的碳足迹,而你不必编辑你的脚本来计算估计值。

像 ML CO2 Impact 这样的工具的缺点是,它依赖于对能源消耗的估计,这自然意味着它对碳足迹的估计可能是错误的。事实上,这样的工具可以以 2.42 的比率关闭,如下图 1 所示。

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

图 1 [17]

2.2.用 CodeCarbon 估计机器学习模型的碳足迹

CodeCarbon [18]是一个适用于 Python 和其他语言的软件包,可以通过在命令提示符下运行pip install codecarbon来安装。CodeCarbon 是这样计算代码的碳足迹的:

CodeCarbon 以固定的时间间隔(例如 15 秒)直接测量执行代码的 GPU、CPU 和 RAM 的耗电量。请注意,CodeCarbon 既可以在本地机器上运行,也可以在云机器上运行。该软件包还监控代码执行的持续时间,并使用这些信息来计算代码的总耗电量。然后,CodeCarbon 会检索您的硬件所在地理位置的电力碳强度信息。如果您在云中训练,CodeCarbon 会自动检索您的云实例的位置信息。然后将电力的碳强度乘以该代码消耗的电量,以提供该代码消耗的电力的总碳排放量的估计值。

可以通过几种方式在您的代码中使用该工具。一种方法是初始化跟踪器对象。当跟踪器对象停止时,CodeCarbon 的默认行为是将结果保存到一个. csv 文件中,该文件将包含有关您的代码消耗了多少电力(以 kWh 为单位)以及该电力释放了多少 CO₂e(以 kg 为单位)的信息。代替写入文件系统,信息可以被发送到记录器[30]。假设您有一个执行模型训练的函数train_model(),那么您可以像这样使用 CodeCarbon:

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

另一种方法是使用 CodeCarbon 作为上下文管理器,如下所示:

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

最后,CodeCarbon 可以用作函数装饰器:

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

注意,如果构造函数的参数log_level被设置为默认值,CodeCarbon 会在每次对你的硬件进行能量消耗测试时打印出几行文本。这将很快淹没您可能有兴趣在模型训练期间在终端中查看的其他信息。如果您改为设置log_level="error" CodeCarbon 将只在遇到错误时打印到终端。

还可以可视化能源消耗和排放,该工具还可以推荐碳强度较低的云区[19]。

2.2.1。关于 CodeCarbon 方法的更多信息

碳强度©是进行计算的能源网格中使用的能源(如煤、风)产生的排放的加权平均值。这意味着 CodeCarbon 报告的碳足迹不是实际的碳足迹,而是一个估计值。电力的碳强度每天都在变化,因此计算碳足迹更准确的方法是使用实时的电力碳强度。当地能源网使用的能源被称为能源组合。该方案假设一种能源的碳强度相同,而不管这种能源是在世界上哪个地方生产的,例如,在日本和德国,煤的碳强度被认为是相同的。所有可再生能源的碳强度都是 0。

消耗的功率 (E) 以 kWh 为单位进行测量,并通过以频繁的时间间隔跟踪硬件的电源来获得。默认值是每 15 秒一次,但是可以用measure_power_secs构造函数参数进行配置。

https://kaspergroesludvigsen.medium.com/the-10-most-energy-efficient-programming-languages-6a4165126670

3.如何减少你的机器学习模型的碳足迹

在我们仔细研究如何减少机器学习模型的碳足迹之前,让我们确保我们在术语方面保持一致。

在下文中,我有时会区分训练机器学习模型的碳足迹和使用机器学习模型的碳足迹。前者将被称为“模型训练”或“模型开发”后者将被称为机器学习模型生命周期的“操作”阶段,或者使用该模型进行推理。

我还想指出,我有意不触及碳补偿。这不是因为我反对补偿,而是因为我想通过消除来减少碳排放。查看 Asim Hussain 关于碳足迹术语的精彩演讲,了解抵消和消除之间的更多区别【20】。

3.1.开始估计你工作的足迹

第一个建议很简单,不是关于如何减少单个模型的足迹,而是如何减少你的工作的足迹:开始估计你的模型的碳足迹。如果这样做,您将能够在选择型号时考虑这些信息。我最近遇到了这样一种情况,我的最佳型号比第二好的型号获得了低 13 %的 MAE,但与此同时,最佳型号的碳足迹却大了大约 9000%。你应该用模型误差的减少来换取碳足迹的大幅增加吗?嗯,这显然非常依赖于上下文,最终可能应该由企业根据您(数据科学家或 ML 工程师)提供的数据来决定。

3.2.指定碳足迹预算模型

页面权重预算是 web 开发中的一个术语。页面权重预算指定了一个网站被允许“加权”多少千字节的文件。具体来说,它是网页加载时通过互联网传输的文件的大小[21]。重要的是,在开发开始之前就要指定页面权重预算,并且该预算应该在从设计到实现的整个过程中充当一个导航星。

在数据科学中,我们可以培养一个类似的概念,例如,通过设置一个限制,我们将允许机器学习模型在其生命周期内排放多少。一个更简单的衡量标准是每个推论的碳足迹。

3.3.如果滑板可以带你去你想去的地方,就不要造跑车

下一个建议听起来似乎很简单,但我认为它值得我们不时提醒自己,你并不总是需要非常复杂的解决方案来解决你的问题。

当你开始一个新项目时,从计算一个合理的,但是便宜的基线开始。对于时间序列预测,这样的基线可以使用在 t-n 的值(n 可以是 24,如果您的数据具有每小时的分辨率并显示每日的季节性)作为 t. 的预测值。在自然语言处理中,一个合理的基线可以是作为正则表达式实现的一些启发式方法。在回归中,一个好的基线可能是使用你的目标变量的平均值,潜在地由一些其他变量分组。

一旦你有了一个合理的基线,你就可以与之比较,看看更复杂的解决方案是否值得额外的工作和碳排放。

3.3.测试如果你变小会发生什么

如果您决定神经网络架构适合您的问题,不要盲目选择 2048 的前馈层维度,因为这是研究论文所做的。最近,我用一个非常小的层(每层少于 256 个神经元,有时少得多)的模型在准确性上胜过了一个大型模型。这两个模型有相同的层数和类型——一个只有很小的层数。除了更准确之外,它在推理过程中也更快。

3.4。火车模型哪里能源更清洁

如果你使用的是 Google Cloud、AWS 或 Azure 等云提供商,你可以选择在哪个地区运行你的计算程序。研究表明,仅仅通过在使用更多可再生能源的地区进行实验,排放量就可以减少 30 倍[22]。下面的表 2 显示了在不同地区的谷歌云平台上使用 100 个 GPU 计算 100 小时排放了多少千克二氧化碳当量。很明显,电力的碳强度在不同地区之间差异很大。

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

表二。来源:毫升二氧化碳影响

3.5。火车模型能源更清洁

如下图 2 和图 2 所示,电力的碳强度每天都在变化,甚至每小时都在变化,图 2 和图 2 显示了 2022 年 1 月 1 日至 2022 年 10 月 7 日期间丹麦东部每天和每天每小时的平均碳足迹(g/kWh)。与普遍的看法相反,该数据显示,中午左右的电力比晚上更干净。

你可以通过将繁重的工作安排在能源更清洁的时段来减少工作的碳足迹。如果你不急着训练一个新的模型,一个简单的想法是当你的云区域的电力碳强度低于某个阈值时开始你的模型训练,当碳强度高于某个阈值时暂停训练。使用 PyTorch,您可以轻松地保存和加载您的模型。您可以硬编码或手动提供您所在地区拥有清洁能源的时间,或者您可以从付费服务中获取数据,如电力地图,该地图提供对各地区电力碳强度的实时数据和预测。

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

图二。丹麦东部一天中每小时电力的平均碳强度。作者配图。来自https://www.energidataservice.dk/tso-electricity/CO2Emis的数据

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

图 3。丹麦东部每天的平均电力碳强度。作者配图。来自https://www.energidataservice.dk/tso-electricity/CO2Emis的数据

3.6.优化能耗和模型准确性的超参数

当您运行超参数优化程序时,您可以定义一个双目标优化问题,在该问题中,您可以针对模型精度和能耗进行优化。这将在运营阶段减少模型的能源消耗,从而减少碳足迹。Dercynski 等人[23]使用转换器架构和贝叶斯超参数优化,在掩蔽语言建模任务中规定了困惑(NLP 中的准确性度量)和能量消耗的组合测量。为了在不牺牲复杂度或能耗的情况下确定无法进一步优化的模型,他们确定了帕累托最优模型。他们发现,最重要的参数似乎是隐藏层数、激活函数和位置嵌入类型。

3.7.注意你的激活功能

激活函数的选择会极大地影响模型的训练时间。如下图 4 所示,Dercynski [24]证明了在 MNIST 数据集上将影像分类模型训练到 90 %准确率所需的时间从几秒钟到 500 秒以上不等。除了证明激活函数的选择会影响训练时间,Dercynski 还发现

  1. 在一次对较小的集合进行推理的情况下,激活函数的选择似乎更有效
  2. 如果要避免特别昂贵的激活功能,应该在目标硬件上分析和调整应用程序

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

图 4。[24]

3.8.提取大型模型

通过提炼大型模型,你可以减少模型在生产中的碳足迹。模型提炼可以被认为是将知识从一个较大的模型转移到一个较小的模型的过程。有时这是通过训练一个较小的模型来模仿一个较大的、已经训练好的模型的行为来实现的。

蒸馏的预训练语言模型的一个例子是 DistilBERT。与未经提炼的版本 BERT 相比,DistilBert 的参数数量减少了 40 %,推理速度提高了 60 %,同时保持了 97 %的语言理解能力[25]。模型提取也已经成功地应用于图像识别[26],我敢说它也可以用于其他领域,例如用神经网络进行时间序列预测。

模型提取是一种有效的方法,可以在不牺牲准确性的情况下产生计算效率更高的模型。但是,如果您应用模型蒸馏的目的是减少模型的碳足迹,请注意蒸馏过程产生的额外碳排放不会超过模型生产期间您将获得的排放节省。

3.9.不要盲目地用更多计算机来解决你的问题

我想我们大多数人会直觉地认为减少某个过程的执行时间会减少它的碳足迹。我的理解是,如果你通过简单地编写执行得更快的更好的代码来加速你的代码,情况就是这样。然而,通过投入更多的计算能力来加速你的程序只会在一定程度上让它更环保——至少根据图 5 来源的研究结果是这样的。

作者测量了在具有不同数量内核的 CPU 上运行粒子物理模拟的处理时间和碳足迹。他们的结果显示在图 5 中。绿线显示运行时间,即运行模拟需要多长时间。橙色线显示了运行模拟产生的碳足迹。值得注意的是,当他们将模拟中使用的 CPU 内核数量从 30 个增加到 60 个时,执行时间几乎没有减少,碳足迹从大约 300 gCO₂e 增加到超过 450 gCO₂e.

由此作者得出结论,一般来说,如果运行时间的减少低于内核数量的相对增加,分配计算将恶化碳足迹。对于任何并行计算,都可能有一个特定的最佳内核数量来实现最小的 GHG 排放。

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

图 5。[27]

3.10。如果你的模特表现不佳或表现停滞不前,尽早停止模特训练

你可以做的另一件事是减少你的碳足迹,确保你没有浪费资源去训练一个不收敛或者已经收敛并且可能不会进一步改善的模型。实现这一点的工具是 Bjarte Sunde 的pytorchtools【28的提前停止模块。它非常容易使用。创建一个 EarlyStopping 对象,在每个时期之后,将模型的平均损失与模型一起传递给该对象。如果丢失有所改善,EarlyStopping 对象会创建模型的检查点,这意味着它会保存给定时期的模型参数。如果在通过构造函数参数“耐心”定义的多个时期内损失没有改善,则退出训练循环。

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

3.11。不要使用网格搜索进行超参数调谐

超参数是“烦人的”[29,第 7 页],但却是控制训练算法行为的非常重要的旋钮。它们对你的机器学习模型的性能有很大的影响,因此必须仔细调整。一种方法是通过指定一组超参数来试验和训练该组中可能组合的模型。这被称为网格搜索,并且对于大网格来说计算量非常大,因为模型是为每个可能的组合训练的。幸运的是,存在更有效的方法,如随机搜索和贝叶斯优化。除了计算效率更高之外,它们还被证明可以带来更好的模型性能[30]。Hyperopt [31]、Bayesian Optimization [32]和 Ray Tune [33]是一些 Python 包,可以让您进行高效的超参数调整。

3.12.在专门的数据中心接受培训

云数据中心的能效是典型数据中心的 1.4 到 2 倍,ML 专用硬件的能效是现成系统的 2 到 5 倍。例如,与英伟达的特斯拉 P100 处理器相比,谷歌定制的 TPU v2 处理器在训练一些大型语言模型时使用的能源分别减少了 1.3 倍和 1.2 倍。[17].使用高效的数据中心将减少开发和运营阶段的碳足迹。

3.13.小规模实例调试

减少机器学习模型开发的碳足迹的一个简单方法是减少模型训练程序运行的次数。通过在开始整个训练过程之前对数据的小子集进行试验,您可以更快地发现错误,并减少模型开发过程中的能量消耗。

3.14.尽可能使用预先训练的语言模型

这是显而易见的。除非万不得已,否则不要从头开始训练大型语言模型。相反,对已经可用的进行微调,例如通过 Huggingface [34]。作为一个斯堪的纳维亚人和开源爱好者,我想对我的董事会同事 Dan Saatrup 的 ScandEval 大声疾呼,它对大量开源的斯堪的纳维亚语言模型进行了基准测试[35]。

3.15.让您的服务仅在特定时间可用

最近的一篇文章表明,部署了大型语言模型的云实例的能耗相对较高,即使模型没有主动处理请求[41]。因此,考虑一下您的服务是否必须 24/7/365 可用,或者您是否可以有时关闭它。例如,如果你已经开发了一个基于 ML 的服务供组织内部使用,在某些情况下,你可以合理地预期没有人会在晚上使用这个服务。因此,运行服务的计算资源可以在夜间的几个小时关闭,并在早上再次启动。

3.16。使用稀疏激活的神经网络

神经网络可能需要大量的计算来训练,但稀疏激活的网络可以以更低的能耗产生相同的性能。稀疏网络可以定义为只存在一定百分比的可能连接的网络[36]。

大型但稀疏激活的 dnn 消耗的能量不到大型密集 dnn 的 1/10,尽管使用了同样多甚至更多的参数,但仍不会牺牲精度[17,第 1 页]

在我看来,稀疏神经网络是一个复杂的主题,在机器学习模型脱碳树上还有其他悬得较低的成果,但如果你想进一步探索这一点,这里有一些资源可以开始:

https://ai.googleblog.com/2020/09/improving-sparse-training-with-rigl.html https://ai.googleblog.com/2021/03/accelerating-neural-networks-on-mobile.html

3.17.将数据移动到低能耗存储解决方案

当然,这不是一个专门针对机器学习模型的建议,但它是一个关于如何减少整个应用程序的碳足迹的想法。一些数据存储解决方案比其他解决方案更节能。AWS Glacier 是高效数据归档解决方案的一个例子[37,~02:50]。从像 AWS Glacier 这样的解决方案中检索数据需要一段时间,但它比更快的存储解决方案更节能。

4.机器学习从业者和研究人员的其他可持续性考虑

在这一节中,我将简要指出一些本文没有直接涉及的其他可持续性考虑因素。

如果我们作为机器学习实践者和研究人员——通过提高我们对软件碳足迹的认识——激励数据中心所有者和运营商不断用更高效的硬件替换他们的硬件,那么在这种高效硬件上运行所节省的碳排放可能会被硬件的内含排放所抵消。

此外,碳足迹并不是与机器学习的环境可持续性相关的唯一因素,也不是更广泛的 IT 行业值得关注的因素。

其他考虑因素包括生物多样性评估和机器学习对其他地球边界的影响(如土地系统变化和淡水使用),来自制造、运输和报废影响的直接自然资源影响,以及来自机器学习应用的间接影响[1]。

我们也不能忘记,机器学习模型运行在硬件上,这些硬件是复杂价值链的结果。价值链上的环境影响包括土壤污染、毁林、侵蚀、生物多样性退化、有毒废物处置、地下水污染、水资源利用、放射性废物和空气污染[38]。

以上是机器学习的所有与环境相关的影响,但也存在其他影响,如社会影响[39]。

结论

这篇文章表明,虽然很难确定机器学习作为一个领域的环境影响,但从业者可以很容易地通过 CodeCarbon 或 ML CO2 影响来估计他们的机器学习模型的碳足迹。这篇文章还展示了如何减少机器学习模型碳足迹的 17 个具体想法。其中一些想法是非常容易实现的,而另一些则需要更多的专业知识。

就是这样!我希望你喜欢这篇文章🤞

请留下评论让我知道你的想法🙌

关注更多与可持续数据科学相关的帖子。我也写时间序列预测,比如这里的或者这里的。

此外,请务必查看丹麦数据科学社区可持续数据科学指南,了解更多关于可持续数据科学和机器学习的环境影响的资源。

并随时在 LinkedIn 上与我联系。

参考

[1]https://www . OECD-I library . org/science-and-technology/measuring-the-environmental-impact-of-artificial-intelligence-compute-and-applications _ 7 babf 571-en

[2]https://www . independent . co . uk/climate-change/news/global-warming-data-centers-to-consuming-triple-as-do-power-in-next-decade-experts-warn-a 6830086 . html

[3]https://www . climatechangenews . com/2017/12/11/tsunami-data-consume-fifth-global-electricity-2025/

[3]https://pisrt . org/PSR-press/journals/easl-vol-3-issue-2-2020/new-perspectives-on-internet-electricity-use-in-2030/

[4]https://www . border step . de/WP-content/uploads/2020/04/border step-data center-2018 _ en . pdf

[5]https://www . science direct . com/science/article/pii/s 0306261920304694

[6]https://arxiv.org/ftp/arxiv/papers/2204/2204.05149.pdf

[7]https://www . HPC wire . com/2019/03/19/AWS-upgrades-its-GPU-backed-ai-inference-platform/

[8]https://AWS . Amazon . com/blogs/AWS/Amazon-ec2-update-in f1-instances-with-AWS-inferentia-chips-for-high-performance-cost-effective-inferencing/

[9]https://www . Forbes . com/sites/robto EWS/2020/06/17/deep-learning-climate-change-problem/?sh=1ed2fd916b43

[10]https://kefm . dk/aktuelt/nyheder/2021/apr/foerste-officielle-vurdering-af-danmarks-globale-klimaaftryk

[11]https://arxiv.org/pdf/2204.02311.pdf

https://openai.com/blog/ai-and-compute/

[13]https://towards data science . com/deep-learning-and-carbon-emissions-79723 D5 BC 86 e

https://github.com/Breakend/experiment-impact-tracker

https://github.com/lfwa/carbontracker

[16]https://mlco2.github.io/impact/

【https://arxiv.org/ftp/arxiv/papers/2104/2104.10350.pdf

[18]https://github.com/mlco2/codecarbon

[19]https://medium . com/BCG gamma/ai-computing-emisses-co % E2 % 82% 82-we-started-measuring-how-amount-807 dec 8 c 35 e 3

https://www.youtube.com/watch?v=HXEnbi64TdQ&ab _ channel = DevoxxUK

【21】https://www . whole grain digital . com/blog/how-to-page-weight-budget/#:~:text = What % 20 is % 20a % 20 page % 20 weight,when % 20a %网页%20is%20loaded

https://arxiv.org/pdf/2002.05651.pdf

https://aclanthology.org/2021.sustainlp-1.12.pdf

https://arxiv.org/pdf/2006.07237.pdf

https://arxiv.org/abs/1910.01108

[26]https://arxiv.org/abs/1503.02531

https://arxiv.org/ftp/arxiv/papers/2007/2007.07610.pdf

[28]https://github . com/Bjarten/early-stopping-py torch/blob/master/pytorchtools . py

[29]https://arxiv.org/abs/1206.5533

[30]https://www.jmlr.org/papers/v13/bergstra12a.htmlhttps://wandb . ai/site/articles/Bayesian-hyperparameter-optimization-a-primer

[31]http://hyperopt.github.io/hyperopt/

[32]https://github.com/fmfn/BayesianOptimization

https://docs.ray.io/en/latest/tune/index.html

https://huggingface.co/models

[35]https://scandeval.github.io/

[36]https://numenta . com/blog/2020/10/30/case-for-sparsity-in-neural-networks-part-2-dynamic-sparsity #:~:text = We % 20 define % 20a % 20 sparse % 20 neural,some % 20 of % 20 the % 20 connections % 20 missing

[37]https://open.spotify.com/episode/52KcC2NUvFkgzij1cbbQnS?si=ezFjjfwRTt6-I2yTZ5IQEw

[38]https://anatomyof.ai/

[39]https://www.mdpi.com/2071-1050/13/5/2668

https://arxiv.org/pdf/2111.00364.pdf

https://arxiv.org/pdf/2211.02001.pdf

如何估计训练机器学习模型的时间和成本

原文:https://towardsdatascience.com/how-to-estimate-the-time-and-cost-to-train-a-machine-learning-model-eb6c8d433ff7

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

照片由 RODNAE Productions 从 Pexels 拍摄。

训练机器学习(ML)模型是一个过程,在这个过程中,机器学习算法被输入数据,以从中学习来执行特定的任务(例如分类),并最终具有进行预测的能力。术语“机器学习模型”是指作为训练过程的结果而产生的模型工件。

在本文中,您将学习如何估计训练机器学习模型的时间和成本。

机器学习生命周期的核心是模型训练,机器学习团队努力让算法适合数据。目的是创建一个训练有素的机器学习模型,具有良好的性能,可以对新的或未知的数据进行预测。

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

作者创建的图像

机器学习模型在许多方面都对企业有益,包括快速分析大量数据,定位异常,以及发现人类难以单独完成的模式。

有几种类型的机器学习模型,包括监督学习和非监督学习。

监督学习是通过使用带标签的数据集来教导算法如何正确地对数据进行分类或预测结果。随着数据被输入到机器学习算法中,其权重被改变,直到模型正确拟合。监督学习模型可以帮助公司大规模解决各种现实世界的问题,例如检测电子商务平台上的欺诈交易。

无监督学习涉及利用算法在不包含标记数据点的数据集中发现模式的过程。这种类型的学习被称为“没有监督的学习”。这些算法揭示了以前未知的模式或数据分组,而不需要数据科学家的任何参与。它非常适合于客户细分以及推荐系统,因为它能够发现信息中的相似性和差异,

为什么估计训练机器学习模型的时间和成本很重要?

对训练机器学习模型所需的时间和成本做出准确的估计是至关重要的。当您在云环境中针对大量数据训练模型时,尤其如此。如果你正在从事一个机器学习项目,了解训练期的长度可以帮助你做出重要的决定。

例如,如果训练周期比您预期的要长,您可以选择调整算法的参数或选择一个替代算法来实现,以缩短训练您的模型所需的时间。当你计划在短时间内运行各种机器学习实验时,这是非常重要的。

有很多机器学习从业者对找出训练一个机器学习模型需要多长时间感兴趣。例如,下面是在堆栈交流论坛中提出的问题。

“我想提前知道我的培训是 8 小时、8 天还是 8 周。(显然,8 是我任意选择的一个数字)。有没有可靠的方法估计一下需要的时间?我能把训练 20 万人所需的时间推断为训练 10 万人所需时间的两倍吗?如果能够估计这将需要几个小时、几天甚至几周的时间,那将会很有帮助,因为这样我就可以提前调整参数。”— by Chowza

您也可以通过以下链接阅读其他问题:

云实例具有不同的特性和成本。根据您的工作负载和特定数据,您可能会选择为高性能实例支付更多费用,或者通过使用低成本实例来节省资金。对于有经验和无经验的数据科学家来说,知道可以选择哪个云实例来训练机器学习模型都是一项挑战。

有时你可以选择使用价格低廉的云实例,但它可能会支持长时间训练你的机器学习模型,最终会增加比你计划花费更多的成本。另一方面,高性能云实例的成本可能会高得多,但它有助于更快地训练你的机器学习模型。

估计训练机器学习模型的成本可以帮助您规划预算,并为您的机器学习项目购买合适的云实例。

如何估算机器学习模型训练时间和成本

Aipaca 团队目前正在开发一个强大的开源工具,称为训练成本计算器(TCC) ,它可以帮助您预测完成神经网络(Tensorflow 和 Pytorch)训练过程所需的时间,方法是使用:

  • 模型的特征
  • 软件环境
  • 计算硬件

它还能够预测不同云实例上各种机器学习任务的云计算成本。TCC 是一个很好的资源,您可以使用它来预算您的计算成本并减少您的支出。

Aipaca 网站上的演示可以向你展示如何找出训练你的机器学习模型所需的时间和成本。

在演示部分,您必须填写以下与您想要在云环境中训练的机器学习模型相关的功能。

注: 演示结果随机生成,仅供概念验证之用。

1。模型中枢 这是一个预先训练好的自包含深度学习模型的集合,适用于广泛的应用。您可以选择以下模型中枢之一:

  • 拥抱脸
  • Pytorch 中心
  • 张量流集线器

2。模型名称 这是您希望用于项目的预训练模型的名称。以下是您可以从演示中选择的预训练模型列表。

  • 伯特
  • 蒸馏 2
  • GPT2
  • 罗伯塔

3。数据大小 你要指定数据集的大小,你要在这个数据集上训练你的机器学习模型。大小必须是千兆字节格式。比如 2 GB 或者 3.45 GB。

4。时期
这是一个超参数,它定义了学习算法在整个训练数据集中训练的次数。例如,您可以将历元数定义为 100。

5。批量大小 批量大小是一个超参数,指定在更新模型参数之前要运行多少个样本。例如,您可以将批次大小指定为 64 个样本。

现在您已经知道了所有必要的特征,您需要指定它们的值,以便估计训练您的机器学习模型的时间和成本。下一步是在演示中填入这些值。

例如:

  • 模特 Hub: 抱紧脸
  • **型号名称:**伯特
  • 数据大小: 5 GB
  • 历元数 : 100
  • 批量: 64

点击此处打开演示部分并填写数值。

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

来自演示的截图

点击计算按钮获得结果。

完成计算过程后,您可以查看结果,其中将包括云实例的名称、预测的训练时间和预测的成本。

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

来自演示的截图

从上面的结果可以看出,一个名为 c6g.8xlarge.od 的 AWS 云实例将花费 6.19 小时来训练机器学习模型,总成本为 **$6.75。**与其他云实例相比,成本可能很高,但如果你计划运行多个机器学习实验,你将节省大量时间。

贡献者

训练成本计算器(TCC)对于机器学习项目来说是一个非常好的提高生产力的工具。TCC 将使您能够快速确定适合您的项目的理想训练时间和云实例,而不是根据您的经验来估计训练您的模型需要多长时间以及要利用哪些云实例。

培训成本计算器(TCC)的第一个版本将很快发布,其中包含更多关于如何在您自己的环境中尝试估计云实例的培训时间和成本的功能和细节。

这是一个 100%开源的项目,我们渴望看到更多的贡献者加入我们的社区。

当 TCC 的第一个版本发布时,更多的细节将被添加到 Github 库。请参考资源库以获取未来的更新,或联系我们以了解任何问题。

如果你学到了新的东西或者喜欢阅读这篇文章,请考虑分享给其他人阅读。

如何用用户研究评估一个交互系统

原文:https://towardsdatascience.com/how-to-evaluate-an-interactive-system-with-a-user-study-d8fdb9b69afa

简要总结各种研究者如何设计用户研究,以评估从机器学习到数据提取的不同交互系统的有效性

近年来,交互系统的开发出现了热潮,例如应用程序、网站和端到端工具。交互式系统旨在帮助用户完成某些任务,如清除大型数据集中的错误或从成千上万的文档中快速提取表格。公司在这些项目上花费数千美元,而工程师花费数百小时来构建这些系统。然而,当他们将这些系统展示给用户或客户使用时,用户的反应可能从“这个系统非常难用”到“这个系统太棒了!”。

虽然很难预测你的用户会说什么,但是通过量化你的交互系统的有效性和有用性来减轻用户体验的问题是很重要的。阅读技术文献描述其他人如何进行用户研究来评估他们系统的有效性。

如何使用用户研究来评估交互系统的有效性?具体来说,系统在帮助用户完成目标任务方面有多大用处?

例如,假设你已经建立了一个系统,学习从用户给出的文本例子中自动提取数据。当用户提供电话号码的例子时,你的系统学习从数百个其他文档中提取电话号码。

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

但是,如何评价该工具是否真的帮助用户快速准确地提取文本呢?图片作者。

如何评价这样的系统是否真正帮助用户快速准确地提取文本?

大多数系统评估要么是基于 T2 算法的,要么是基于 T4 用户的。当您基于算法实现进行评估时,度量标准和方法与对用户进行评估时不同,后者需要招募和观察使用您系统的人。

这篇文章的重点是我所说的比较用户评估。这些评估将您的系统与基准系统进行比较。目标是根据一些选择的标准证明您的系统优于一些基线系统。招募人类,要求他们完成系统上的某些任务,并观察用户执行任务的情况。

我将简要提及十篇论文,它们对调试系统、机器学习系统以及数据转换和数据提取系统进行了比较评估。我将描述这些论文的比较用户评价的一些相似之处和不同之处。希望这篇简短的评论描绘出一个如何进行比较用户评估的总体思路。

选择一个基准系统来比较您的系统

运行比较用户评估包括将用户在您的系统上的表现与基准系统进行比较。

  • 基线系统可以是实际系统的“基本”版本,其核心特性——那些帮助用户完成任务的特性——被剥离了。
  • 或者基线系统可以具有实际系统的一些特征子集。
  • 或者基线系统可能是一个完全不同的系统,可能没有您的系统所具有的有用功能。

这种系统,无论是不同配置的系统还是完全不同的系统,也被称为实验条件*。*

与您系统的基本版本进行比较

例如, WhyFlow 是一个交互式可视化调试系统,其基线是 WhyFlow 的基本版本,其自动生成的错误解释功能被禁用。这个基线旨在模拟手动调试,因为这种自动生成的解释功能并不存在。

对比不同版本的系统

另一种类型的基线可以是系统本身的不同版本,以及启用或禁用的某些功能的组合。这方面的一个例子是在名为 DataPlay 的系统上进行的评估。DataPlay 是一个交互式数据库查询系统,支持试错查询规范。在评估中,用户被要求修复 SQL 查询中的错误。DataPlay 与 Dataplay 本身的两个不同版本进行了比较:

  • DataPlay 的一个版本仅启用了一个称为直接操作的功能。
  • DataPlay 的另一个版本,只启用了一个名为自动查询修正的特性。

与完全不同的系统相比

另一个选择是将你的系统与一个完全不同的系统进行比较,一个完成相同任务的系统。这个系统应该算是最先进的,你的目标是证明你的系统比最先进的系统更好。系统 RxFiddle 就是这样一个实验的例子。

RxFiddle 的用户不得不使用专门为调试反应式程序而设计的可视化工具来调试反应式程序中的错误。由于反应式程序的非线性执行和事件驱动的性质,调试反应式程序比在其他编程范例中调试稍微更具挑战性。当输出异步发生时,这使得用户很难识别错误的来源。由于用户传统上使用 Chrome 的开发工具来调试此类程序,RxFiddle 的对比用户评估是针对 Chrome 的开发工具进行的。

WhyFlow 和 RxFiddle 的相似之处在于它们与传统的调试系统进行了比较,传统的调试系统没有一些关键功能,例如可视化、自动生成的错误解释。

实验类型:受试者内部和受试者之间的用户研究

虽然用户研究设计有很多种,但我将特别关注进行主题内主题间用户研究的论文:

  • 受试者内用户研究:你招募的每个用户都将作为他们自己的基线。换句话说,同一个人测试系统的所有条件。
  • 受试者间用户研究:与受试者内用户研究不同,您招募的每个用户不会测试每个条件。换句话说,不同的用户测试每个条件。

例如,WhyFlow 进行了一项主题内用户研究。所有 10 名被招募的用户都暴露在 WhyFlow 的所有条件下。另一方面,RxFiddle 进行了一项受试者之间的用户研究。他们的一些用户被指示使用 RxFiddle 来完成调试任务。他们招募的其余用户被指示使用传统的调试工具(Chrome Dev Tools)来完成调试任务。

倾向于首选受试者内部用户研究。然而,由于每个被招募的用户都必须暴露于系统的每个条件下,大多数受试者内的用户研究通常会占用大量时间。例如,在 WhyFlow 的例子中,每个用户平均花费 2 个小时,因为每个用户为系统的每个条件花费大约一个小时。受试者内用户研究通常不会招募很多用户(少于 20 个,取决于系统的条件数量)。

受试者之间的用户研究占用每个用户更少的时间,因为他们只暴露于系统的一个条件下。在实验条件下,RxFiddle 用户平均总共花费 40 分钟来完成任务。跨学科用户研究通常会招募很多用户。RxFiddle 的用户研究共招募了 111 名用户。

然而,受试者内部的用户研究具有潜在的学习效应,其中将用户暴露在一种条件下的效应可能会溢出到用户在以下条件下的表现。在审查的受试者内用户研究中,他们通过随机化条件的顺序来降低潜在的学习效果:“工具顺序被随机化以分布可转移知识的影响”。此外,用户的任务在每种情况下都是不同的。

十个比较用户评估摘要

在这一节中,我们提供了十个在系统调试、机器学习和数据提取方面进行的比较用户评估的简要总结。请参见下表,对于每个系统的比较用户评估,我们列出了以下表格:

  • 任务:分配给用户的任务,如调试、标注机器学习模型、完成抽取任务等。
  • 比较:进行比较的系统或特性。
  • 受试者内 : Y 表示该研究为受试者内实验,否则 N 表示受试者间实验。
  • 用户数:招募用户总数。
  • 总时间 : 一个用户学习会话的总持续时间。这些持续时间中的一些包括用户阅读和签署同意书所需的时间、训练用户理解任务和系统所需的时间以及用户回答任何初步和/或研究后问卷所需的时间。
  • 收集的指标:作者在实验过程中记录的一些指标。流行的度量标准包括用户完成分配任务的持续时间以及任务完成的正确性、准确性或百分比。
  • 统计检验:我简单记下了用来比较样本的统计检验,这是一个单独的话题。

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

10 个比较用户研究表。图片作者。

观察

标记并学习iSeqL尺子是帮助构建机器学习产品的系统。 SEERChartSenseWranglerRousillonTable Repair 是提取数据的系统。我们将在后面详细描述这些系统。

请注意,大多数用户评估都是受试者内部的实验。一个用户会话的持续时间最长为 2 小时。招募的用户数量一般在 10 到 20 左右。

大多数研究收集了用户完成任务所需的持续时间。这个标准通常被用来证明用户使用目标系统比使用基线系统更快地完成分配的任务。大多数研究还收集关于用户表现的准确性指标。这里的准确性指标指的是用户对所分配任务的回答的正确性。

对于输出某种模型的系统,无论是机器学习模型还是数据提取模型(提取文本、表格、图像等的程序。根据文档),他们记录了传统的度量标准,如精确度、召回率和 F1 分数。

机器学习系统的比较用户评价

我们审查的机器学习(ML)系统侧重于帮助用户理解 ML 模型或标记训练 ML 模型所需的数据:

  • Label-and-learn:一个可视化工具,帮助开发人员在标记数据集和训练 ML 分类器时深入了解他们的数据集。在给定训练数据的某个子集及其在测试集上的性能的情况下,它可视化分类器的预测。
  • iSeqL:一个交互式工具,用于快速定制 ML 模型,以提取特定领域的概念,如药物评论数据集中包含药物不良反应的短语。用户迭代地标记数据并训练模型,直到它能够提取特定于领域的概念。
  • 标尺:自动生成标注规则的交互系统。标注规则可以快速标注数千个数据点,为手动标注提供了一种替代方法。传统上,标记规则是由人类手工编写的。Ruler 通过观察用户提供的演示来综合标注规则,从而自动化了这一过程。

**对研究设置的评论。**虽然在这篇论文样本中,受试者内实验很受欢迎,但 iSeqL 是通过在线进行的受试者间实验进行评估的,就像 RxFiddle 一样。有两种情况:(1)模型预测对用户可见的 iSeqL 版本,以及(2)预测不可见的 iSeqL 版本。这种设置允许 iSeqL 的创建者评估他们关于交互界面的一些设计决策。具体来说,在标注界面中显示模型的预测是否有助于用户识别将提高 ML 模型性能的相关短语?招募的用户的任务是建立一个 ML 模型,并通过提供相关短语来迭代改进它。

另一方面,标签学习和尺子的用户研究是受试者内部的实验。当用户标记训练数据时,标记和学习可视化了 ML 分类器的成功的可能性。Label-and-learn 的用户研究将其用于探索和标注数据的全功能可视化和界面与仅包含文本信息的基本版本的标注界面进行了比较。

我发现标签学习的用户任务与 Ruler 和 iSeqL 的任务不同。每个用户被要求标记 500 个数据点来训练一个二元分类器。在用户标记了 50、100、200 和 400 个实例之后,设置了一个检查点;为了评估用户对二元分类器的心理模型,给用户一个简短的测验。该测验测试了用户对分类器决策的理解。

与帮助人类用户标记数据的 Label-and-learn 和 iSeqL 不同,Ruler 专注于自动生成标记规则。标签规则传统上是在一个叫做 Jupyter 的系统中手工制作的。用户研究的设置很简单:将尺子生成的标注规则与 Jupyter 中手工制作的标注规则进行比较。用户的任务是编写标签规则,以训练垃圾邮件检测和情感分类的 ML 模型。他们记录了标签功能的个人和集体表现。

用户对数据提取系统的比较评价

我们审查的数据提取系统帮助其用户快速准确地执行数据提取或数据转换:

  • SEER:通过从用户突出显示的示例中自动生成提取规则来自动提取文本。
  • ChartSense:一个半自动交互式图表数据提取工具。它集成了可以检测标记的算法,例如条形图中的条、线形图中的标记等。用户可以与系统交互以修复提取中的任何错误。
  • Wrangler:一个用于清理和转换数据的交互系统。系统从用户演示的数据操作中学习数据转换。
  • Rousillon:一个编程系统,它从用户提供的提取内容的演示中学习编写复杂的 web 自动化脚本。
  • 表修复:交互式表修复管道。管道自动提取表格,并附带一个界面友好的手机和平板电脑用户可以轻松修复表格提取中的错误。

**对研究设置的评论。**大多数数据提取工具的对比用户研究的设置非常简单。用户被指示完成一组提取任务。所有的研究都是受试者内部的实验。这些系统与一个类似的系统进行了比较,后者缺少帮助用户快速准确完成任务的关键功能。

SEER 实验的用户的任务是提取文本实体,如日期和百分比增加/减少。SEER 与用户通过拖放界面手动创建提取规则的系统进行了比较。

ChartSense 实验的用户被要求从条形图和折线图中提取数据。ChartSense 与一个类似但有限的图表提取系统进行了比较,该系统称为 WebPlotDigitizer(用于条形图和折线图的图表提取系统)。

牧马人实验的用户被要求执行数据清理任务,例如值提取、缺失值插补和表格重塑。Wrangler 与 Microsoft Excel 进行了比较,后者允许用户通过一定程度的手动工作来完成这些数据清理任务。

Rousillon 实验的用户被分配了网页抓取任务。网络抓取是指从网站中提取数据。Rousillon 与 Selenium 进行了比较,Selenium 是为编写 web 抓取脚本的用户提供的传统 web 自动化库。

表修复有一个相当不同的用户研究设置。表修复被描述为一个表提取管道,而其用户研究集中在一个伴随的接口的能力,以帮助用户快速和容易地修复在表提取系统中发现的错误。该管道是独一无二的(在撰写本文时)。用户研究的条件由支持的用户交互和设备(手机或平板电脑)的不同组合来定义。

结论

这还远远不够全面,只提供了我在阅读比较用户评估时的一些观察的简要概述。当我们投入大量的时间、金钱和精力来构建这些系统时,我们也应该意识到评估我们的系统是否帮助我们的用户和客户的量化方法。

参考文献

如何评估任何表格合成数据集

原文:https://towardsdatascience.com/how-to-evaluate-any-tabular-synthetic-dataset-8865b7ee0c23

一系列机制和测试,可用于从相似性和实用性角度评估任何表格合成数据集

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

照片由 DeepMindUnsplash 上拍摄

为什么是合成数据?

合成数据的一些主要优势包括:

  • 可扩展性:真实的训练数据是以线性方式收集的,而合成数据可以产生大量,这缓解了复杂的 ML 任务需要获取大量高质量训练数据的问题。
  • 隐私:由于复杂的隐私要求,数据可用性仍然是一个挑战,尤其是在医疗保健领域。医疗保健研究人员通常很难获得用于次要目的的高质量个体水平数据(例如,测试新的假设,建立统计和 ML 模型)。使用合成数据可以 潜在地 解决这一挑战。

但是,请注意,仅仅让数据“合成”并不能保证隐私。已经表明,合成数据生成并不总是和完全地保护每个人的隐私,尤其是使用非差别隐私数据生成技术。根据经验量化合成数据集的隐私性能也极其困难。单一的隐私度量只能解决某种攻击策略(例如:重新识别攻击、重构攻击或追踪攻击等)。).针对一种攻击表现较好的数据集并不一定意味着它可以抵御不同的攻击。

此外,很难估计攻击者可以获得的知识范围,我们需要假设他们可以获得哪些信息,以及他们试图获得哪些机密信息。更不用说,这些都是已知策略——攻击者可能采用的未知策略数不胜数。这意味着,能够根据经验量化合成数据集的一个(甚至多个)隐私度量的性能,并不足以说明数据集是完全隐私的。

也就是说,本文只关注合成数据集的效用性能。

高斯 Copula 和 CTGAN 数据生成器概述

高斯连接函数

高斯 Copula 是一种用于数据综合的统计建模技术。

Copula 允许我们将联合概率分布分解为变量的边际(根据定义,它们没有相关性)和一个将这些边际“耦合”在一起的函数。换句话说,Copula 是一个“耦合”函数,或者是一个嵌入了相关信息的多元分布。因此,高斯连接函数是一个具有已知相关性的多元正态分布。

该数据生成器的高级流程如下:

  1. 学习每列的概率分布
  2. 对它们应用标准正态的逆 CDF 变换(即,将列的分布转换为正态分布)
  3. 了解这些新生成的随机变量的相关性,以构建 copula 模型
  4. 来自多元标准正态分布的样本,具有学习到的相关性

CTGAN

条件表格生成对抗网络(CTGAN)是一种深度学习数据合成技术。顾名思义,这是一种基于 GAN 的方法。

一个普通的 GAN 由两个神经网络组成:一个作为生成器,接受一些输入并从中生成合成数据。然后,有第二个神经网络作为鉴别器,看看他们是否能区分真实数据和合成数据。来自鉴别器的结果被反馈到发生器,以帮助发生器产生更好的合成输出。

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

非常高级的 CTGAN 架构概述。图片作者。

CTGAN 与普通 GAN 的区别在于:

  1. Conditional:CTGAN 架构引入了一个条件生成器,它根据某个离散列生成行,并根据该特定离散列的每个类别的对数频率对训练数据进行采样,而不是随机采样训练数据以输入到生成器中,这可能不足以表示高度不平衡的分类列的小类别。这有助于 GAN 模型均匀地(不一定均匀地)探索所有可能的离散值。
  2. 表格:与通常正态分布的图像像素值不同,表格数据中的连续变量可以遵循非高斯和/或复杂的多模态分布。为了解决这个问题,CTGAN 使用特定于模式的规范化来表示连续列。

关于 CTGAN 如何工作的详细描述,请参考他们在发表的论文

合成数据的效用评估

在我们生成一些合成数据后,自然的问题是刚刚生成的数据有多好。具体来说:

  • 合成数据是否保持与真实数据的统计相似性?合成数据保留单变量和多变量分布吗?(即相似性度量)。
  • 在一些计划任务中,用合成数据获得类似的结果并得出与真实数据相同的结论,这可能吗?(即效用度量)。

本文介绍了一系列机制和测试,可以用来评估任何表格合成数据,主要是从保留原始数据的统计属性(相似性)和 ML 功效(效用)的角度。

所有评估都是在来自 UCI 机器学习知识库的败血症存活最小临床记录数据集 (110,204 个实例 x 4 个属性)上进行的。我们使用来自综合数据仓库实施的高斯 Copula 和 CTGAN 模型生成综合数据。

个体分布

鉴于年龄分布在原始数据集中有多种模式,CTGAN 在保持这一属性方面做得更好,而高斯 Copula 仅将分布转化为单一模式。

另一方面,高斯 Copula 比 CTGAN 更好地保持了性别和目标变量类别之间的比例。与高斯 Copula 相比,CTGAN 更好地再现了集数的分布。

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

所有变量在三个数据集上的分布:真实数据集、高斯 Copula 合成数据集和 CTGAN 合成数据集。图片作者。

缺少值

所有变量最初都没有任何缺失值,来自 CTGAN 和高斯 Copula 的合成数据集能够重现这一点。

K-S 检验

双样本 Kolmogorov–Smirnov(K-S)用于检验两个样本是否来自同一分布。我们在真实和高斯 Copula 数据之间以及真实和 CTGAN 数据之间的所有变量上运行该测试。因为 KS 统计是两个 CDF 之间的最大距离,它越低,对我们的用例越好。

总体而言,与高斯 Copula 相比,CTGAN 的所有变量的平均 KS 统计量略小。

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

高斯 Copula 与真实数据以及 CTGAN 与真实数据的 2 样本 K-S 测试结果。图片作者。

成对相关

到目前为止,我们已经逐列研究了数据集。现在,让我们来看看两两之间的关系。

高斯 Copula 的成对 Pearsons 相关性的热图似乎与同一性数据的热图更相似。为了验证这一点,我们计算了相关精度。先将相关系数离散化为 6 个等级:[-1,-0.5)(强负),[-0.5,-0.3)(中负),[-0.3,-0.1)(低负),[-0.1,0.1)(无相关性),[0.1,0.3)(低正),[0.3,0.5)(中正),[0.5,1)(强正)。然后,计算合成数据集和原始数据集分配相同相关级别的配对的百分比。

高斯 Copula 的关联精度远大于 CTGAN (83% vs 67%)。

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

三个数据集之间成对相关的热图。图片作者。

ML 功效

假设一方无法访问原始数据集,他们有可能解决基于合成数据的机器学习问题,并得出尽可能接近真实数据的见解吗?为了回答这个问题,我们使用合成数据集来训练 XGBoost 分类器,并使用它对原始数据进行预测。然后,将这个分数与我们在原始数据上训练 XGBoost 所获得的分数进行比较。

与高斯 Copula 相比,CTGAN 能够实现更接近我们用真实数据实现的预测性能。

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

XGBoost 分类器的 AUROC 在合成数据上进行训练,并在真实数据上进行评估,与我们在真实数据上训练分类器的结果进行比较。

检测能力

为了评估区分真实实例和合成实例的难度,我们将两个数据集混在一起,并使用标志来指示数据是真实的还是合成的。然后训练一个试图预测这个标志的 ML 模型。预测标记越容易,真实数据和合成数据之间的区别就越明显。

对于这个测试,我们将 XGBoost 和逻辑回归训练为检测器。与高斯 Copula 数据相比,CTGAN 合成数据对 XGBoost 和 Logistic 回归提出了更难区分的挑战,因为它们对应的检测器的 AUROC 更低。

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

XGBoost 和逻辑回归检测器的 AUROC 性能,尝试区分真实和合成实例。图片作者。

结论

对于这个特定的脓毒症公共数据集,从个体变量评估的角度来看,CTGAN 和高斯 Copula 是不分上下的。然而,高斯 Copula 具有令人惊讶的更好的成对相关准确性,而 CTGAN 实现了更好的 ML 功效,并且更不可能被检测到。

如何在没有基础事实标签的情况下评估聚类性能

原文:https://towardsdatascience.com/how-to-evaluate-clustering-performance-without-ground-truth-labels-9c9792ec1c54

基于群集构造选择适当有效性度量的说明性指南

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

Unsplash 上由 steve_j 拍摄的照片

介绍

监督学习剧本中有许多方法可用于评估已知基本事实标签情况下的聚类性能。然而,当地面实况不可用时,性能评估就不那么简单了。在这种情况下,我们需要依赖有效性度量,这些度量给我们提供了一个关于如何定义集群的指示。这些有效性指标在很大程度上依赖于数据中聚类的基本构造。

对于由凸球状星团组成的数据,已经提出了多种有效性指标,最流行的是轮廓系数。其他指数包括卡林斯基-哈拉巴斯指数、戴维斯-波尔丁指数和邓恩指数。然而,并不是所有的数据都是由球状星团组成的。有些星系团可以呈现任意形状,由密度来分隔。在这种情况下,我们可以利用基于密度的聚类验证指标,或 DBCV。

*注:*下图中使用的数据是使用 scikit-learn 的 make_blobsmake_moonsmake_circles 函数生成的。

球状星团

对于主要为球状的星团,最常用轮廓系数 [1]来评估性能。这是一种基于数据点与其自己的聚类相比与其他聚类的相似程度的度量。其值的范围从-1(表示不正确的聚类)到+1(表示高度密集的聚类和良好的分离)。接近 0 的值表示重叠的簇。一个非常适合识别球状星团的算法是 K 均值

下面是一个由 4 个球状星团组成的数据示例(图 1)。这里聚类的标准偏差是 1.2,这导致一些聚类间重叠。然而,K-Means 仍然实现了体面的分离,轮廓系数为 0.44。

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

图 1:原始数据与 K 均值输出。剪影系数:0.44。

如果我们有非常明确的集群(图 2),我们会期待一个更高的有效性得分。这正是我们在下面的例子中获得的结果,它实现了 0.79 的轮廓系数。本例中聚类的标准偏差为 0.4,产生了更好的可分性。

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

图 2:原始数据与 K 均值输出。剪影系数:0.79。

然而,如果集群不是由球状形状表征的,轮廓系数可能不是合适的有效性度量。此外,K-Means 可能不是合适的聚类算法,因为它通常更喜欢球形。在下面的例子中,K-Means 明显错误地分类了新月的部分,即使剪影系数仍然产生了令人误解的体面值 0.49。

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

图 3:非球状数据的 K-均值聚类。

任意形状的簇

对于具有任意形状和大小的聚类,基于密度的聚类验证(DBCV) [2]是优选的评估度量。它根据群集内和群集间的密度来评估群集质量。通过簇内的高密度和簇间的低密度可以获得良好的结果。与剪影系数类似,DBCV 的范围从-1 到+1,分数越高表示聚类质量越好。

有各种常用的聚类算法能够识别任意形状的聚类,如 DBSCAN、HDBSCAN 或 OPTICS。对于下图,我将使用 HDBSCAN (针对有噪声的应用程序的基于层次密度的空间聚类)。

让我们看看 HDBSCAN 在两个新月上的表现:

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

图 4:月牙形星团上的 HDBSCAN。

由于这两个新月看起来可以通过密度来区分,因此毫不奇怪 HDBSCAN 可以很好地区分它们,相应的 DBCV 为 0.54。相比之下,基于 K 均值标签的 DBCV(图 3)为-0.76,表明如预期的那样,由于错误分类的数据点而导致不正确的聚类。

让我们看另一个任意形状的集群的例子:

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

图 5:圆形集群上的 HDBSCAN。

同样,这两个圆似乎可以按密度分开,因此,HDBSCAN 实现了 DBCV 为 0.61 的下降结果。相反,K-Means 很难将它们分开,结果,相关的 DBCV 是-0.8(图 6)。

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

图 6:圆形簇上的 K-均值。

结论

如果无法获得基本事实,就必须依赖基于模型的性能评估指标。虽然剪影系数对于由凸球状星团组成的数据来说是一个可靠的度量,但它通常不适用于任意形状的星团,并且尽管有明显的错误分类,但仍会产生令人迷惑的高分。在这种情况下,DBCV 是首选的度量标准,因为它可以更好地处理任意形状。

参考

[1]彼得·j·鲁瑟夫(1987 年)。"轮廓:聚类分析解释和验证的图形辅助工具."计算与应用数学 20:53–65。

[2] Moulavi,Davoud 等人(2014 年)。"基于密度的聚类验证."2014 SIAM 数据挖掘国际会议论文集。工业和应用数学学会。

如何评价生存分析模型

原文:https://towardsdatascience.com/how-to-evaluate-survival-analysis-models-dd67bc10caae

生存分析中最流行的性能评估指标介绍以及实际的 Python 示例

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

图片作者。

目录

  1. 简介
  2. 审查
  3. 考克斯比例风险模型
  4. 评估生存模型
    4.1 和谐指数(Harrell ’ s C)
    4.2Uno ’ s C
    4.3动态 AUC
  5. 结论
  6. 参考文献

1。简介

生存分析包括描述事件时间数据的统计方法的集合。

它源于临床研究,医生最感兴趣的是评估一种新疗法对对照组存活率的影响,或者某些特征如何及时代表不良事件的风险。

这篇文章介绍了与生存分析(审查)相关的挑战,并解释了评估生存模型的流行指标,同时分享了实用的 Python 示例。

2。审查

让我们想象成为临床研究人员。在我们研究的开始,我们招募了所需数量的患者,并将他们分成两组:

  • 干预组接受新的治疗。
  • 对照组进行标准处理。

由于我们希望评估新治疗在预防不良事件(如死亡)方面的显著效果,因此我们对两组患者进行了一段时间的监测。不幸的是,我们可能无法观察到这一事件,原因有几个,例如:

  • 在整个研究期间,患者不会经历该事件。
  • 患者退出研究。
  • 患者失访。

这种情况被称为右删截,是生存分析研究的一个共同特征。我们可以将其与左审查区分开来,后者发生在事件已经发生在登记之前(但时间未知)。

3.Cox 比例风险模型

现在让我们介绍一种流行的生存分析算法,Cox 比例风险模型。

首先,我们将存活率定义为一段时间后没有经历不良事件(死亡)的患者的百分比。Cox 比例风险模型可以评估变量和存活率之间的关联,并被定义为:

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

图片作者。

该公式表明,风险函数h(t|**xᵢ**)与基线风险函数h₀(t)和相对风险exp(**β'xᵢ**)成比例。

潜在风险函数h₀(t)不依赖于协变量。由于h₀(.)的形式未指定,该模型为半参数模型。而且,不估计h₀(.)也可以估计β

Cox 模型的一个重要优势在于其系数的可解释性。为了解释它,我们可以考虑一个只有一个协变量的简化场景。让我们考虑一个危险因素xᵢ,例如吸烟,作为二元变量(0:不吸烟者对 1:吸烟者)。Cox 模型可表示为h(t|xᵢ)= h₀(t)exp(βxᵢ),其中exp(β)表示吸烟与不吸烟相比,不良事件的相对风险:

  • 吸烟带来的风险:
    (xᵢ=1): h₀(t)exp(β⋅xᵢ) = h₀(t)exp(β⋅1) = h₀(t)exp(β)
  • 不吸烟带来的风险:
    (xᵢ=0): h₀(t)exp(β⋅xᵢ) = h₀(t)exp(β⋅0) = h₀(t)
  • 相对风险=吸烟带来的风险/不吸烟带来的风险:
    h₀(t)exp(β) / h₀(t) = exp(β)

很清楚为什么这个模型在临床场景中受到高度赞赏:它允许医生根据患者的历史和行为来估计不良事件的可解释风险。

让我们用一个利用scikit-survival包的实际 Python 例子来试试,这个包在 GNU GPL 3.0 许可下可用。步骤如下:

  • 导入所需的库:
from sksurv.datasets import load_whas500
from sksurv.linear_model import CoxPHSurvivalAnalysis
from sksurv.preprocessing import OneHotEncoder
from sklearn.pipeline import Pipelineimport numpy as np
import math
from tabulate import tabulate
  • 加载并返回由scikit-survival提供的伍斯特心脏病研究数据集 ⁴:
x, y = load_whas500()
  • 该数据集有 500 个样本和 14 个特征:
x.head()

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

图片作者。

  • 特征:
    • afb:房颤(0:否,1:是)
    • age:入院年龄(岁)
    • av3:完全性心脏传导阻滞(0:否,1:是)
    • bmi:体重指数(kg/m )
    • chf:充血性心脏并发症(0:否,1:是)
    • cvd:心血管疾病史(0:否 1:是)
    • diasbp:初始舒张压(mmHg)
    • gender:患者性别(0:男,1:女)
    • hr:初始心率(每分钟心跳数)
    • los:住院时间(天)
    • miord : MI 顺序(0:首次,1:复发)
    • mitype : MI 类型(0:非 Q 波,1: Q 波)【1】
  • 终点是死亡,有 215 名患者死亡(43.0%):
status, counts = np.unique(
    ['Censored' if i[0] == False else 'Event' for i in y],
    return_counts = True)dict(zip(status, counts))

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

图片作者。

  • 创建一个包含所有必需预处理步骤的管道,并符合 Cox 模型:
pipe = Pipeline([('encode', OneHotEncoder()),
                 ('cox_model', CoxPHSurvivalAnalysis())])pipe.fit(x, y)
  • 对于每个协变量xᵢ,我们可以观察它的系数β和相对风险exp(β):
table = np.array([
   x.columns,
   pipe['cox_model'].coef_,
   [math.exp(i) for i in pipe['cox_model'].coef_]
  ]).Tprint(tabulate(table, 
               headers = ['Risk Factor', 
                          'Coefficient [β]', 
                          'Relative Risk [exp(β)]'],
               tablefmt = 'fancy_grid',
               colalign = ('center', 'center', 'center'),
               floatfmt = '.3f'))

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

图片作者。

相对风险exp(β)可以是:

  • >1(或β>0)为事件(死亡)的风险增加。
  • <1(或β<0)为降低风险的事件。

我们注意到:

  • 考克斯假设比例风险。这意味着预测的风险exp(β)与时间无关。
  • 在现实应用中,医生感兴趣的是相对风险及其相关的 p 值置信区间。在之前的 post⁵中,我们分享了包括这些概念的 Cox 回归模型的更详细的应用。
  • 在这种情况下,Cox 模型被用作例子来达到我们的目的,即讨论评估生存模型的度量和方法。

既然我们将模型与我们的数据进行了拟合,我们想要确定这组相对风险是否可靠。此外,我们希望将该型号与其他型号的性能进行比较。

4。评估生存模型

为了公平地评估与特定估计量相关的误差,一个好的做法是随机地将初始观察值集分成至少个:

  • 训练集:用于拟合模型的观测值子集。
  • 测试集:仅用于评估模型性能的观测值子集。

这种策略背后的想法是,使用用于拟合模型的相同数据来估计模型性能会有偏差。

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

训练和测试设备。图片作者。

关于评估本身,我们知道像用于定量反应(回归)的 MSE 或用于分类反应(分类)的准确性这样的度量。生存分析问题与传统的回归和分类问题略有不同。此外,由于审查,我们还有一层额外的复杂性。我们可以采用什么标准来评估模型性能?

4.1 和谐指数

让我们考虑一对病人(i, j)。直觉上,风险越高应导致不良事件发生的时间越短。因此,如果模型预测第一个患者(ηᵢ > ηⱼ)的风险评分较高,我们也预期与另一个患者(Tᵢ < Tⱼ)相比存活时间较短。

从这个直觉出发,我们将满足这个期望的每对<i, j>(ηᵢ > ηⱼ : Tᵢ < Tjηᵢ < ηⱼ : Tᵢ > Tⱼ)定义为和谐对,否则为不和谐。大量的一致配对是模型质量的证据,因为与较低风险相比,预测的较高风险对应于有效较短的存活时间。

一致指数 ⁶,也称为 C 指数哈氏 c 指数,定义为一致对数除以可比对数:

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

这就是审查被考虑的方式:

  • 如果两个病人ij都被审查,我们就没有关于TᵢTⱼ的信息,因此这一对被丢弃
  • 如果只有一名患者被审查,只有当另一名患者在审查时间之前经历了该事件时,我们才保留这对患者。否则,我们没有关于哪个患者可能首先经历了该事件的信息,并且该对被丢弃。

哈氏 C 的计算过程可以直观地表示如下:

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

图片作者。

我们现在可以表达 c 指数 as⁶:

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

图片作者。

其中:

  • ij识别一对患者,分别具有生存时间(TᵢTⱼ)和预测风险(ηᵢηⱼ)。
  • I(.)是指标函数,如果其参数为真,则等于 1,否则等于 0。
  • 变量Δⱼ指示Tⱼ是否已被完全观察到(Δⱼ = 1)或未被完全观察到(Δⱼ = 0)。因此,乘以Δⱼ允许丢弃不可比较的对,因为较小的存活时间被删除(Δⱼ = 0)。

让我们使用scikit-survival包在一个实际的 Python 示例中展示所描述的过程:

  • 将数据集拆分为训练集和测试集。
from sklearn.model_selection import train_test_splitx_train, x_test, y_train, y_test = train_test_split(
     x,
     y,
     test_size = 0.2,
     random_state = 42)
  • 在训练集上拟合 Cox 估计量。
pipe = Pipeline([('encode', OneHotEncoder()),
                 ('cox_model', CoxPHSurvivalAnalysis())])pipe.fit(x_train, y_train)
  • 在测试集上评估模型性能(C-index)。
c_index = pipe.score(x_test, y_test)

在我们的例子中,我们在保留数据上获得了等于 0.709 的 C 指数。

C 指数的数值解释:

  • C = 1 :风险与事件时间的完美一致**。**
  • C = 0 :风险与事件时间的完美反协调
  • C = 0.5 : 随机赋值。该模型预测了风险和存活时间之间的关系,以及抛硬币的过程。
  • 理想值的范围在 0.5 和 1 之间。越接近 1,模型越能区分早期事件(高风险)和后期事件(低风险)。

注意事项:

  • c 指数保持着对 time⁷.的隐性依赖
  • censoring⁸.的数量越多,c 指数就变得越偏(向上)

出于这些原因,随着时间的推移,提出了 C 指数和其他指标的变化,如时间相关的 C 指数分析(Longato 等人。⁹,2020)和基于截尾权重逆概率的 c 指数(Uno 等人。⁸, 2011).

4.2 优诺的 C

对具有删截的较小观察时间(Δⱼ = 0)的观察值对的处理导致一致性 probability⁷.估计值的向上偏差因此,Uno 等人。⁸ (2011 年)提出了哈勒尔 c 的一个变体,包括审查权重的逆概率。简而言之,我们引入基于估计的截尾累积分布的权重。

在审查量较高的情况下,Uno 的 C 优于 Harrell 的 C。

scikit-survival包在sksurv.metrics.concordance_index_ipcw ⁰.实现了这个 c 统计这里有一个它的用法的例子。

值得注意的是,Uno 的 C 使用卡普兰-迈耶估计量进行截尾分布。这意味着审查应该独立于变量。然而,正如 paper⁸所说:

对于新的建议,我们假设删失分布是独立的协变量。在执行良好的临床研究中,这种假设并非不合理,尤其是当观察终点(例如,死亡或复合临床终点)时没有竞争风险,并且事件时间可能主要由于管理审查而被审查。[…].另一方面,根据我们模拟研究的结果,即使在删失依赖于协变量时,我们的建议似乎也相当稳健。

4.3 动态 AUC

在二元分类任务中, ROC 曲线(受试者工作特性曲线)绘制了不同分类阈值下的真阳性率(TPR = TP / (TP + FN))与假阳性率(FPR = FP / (FP + TN))的关系:

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

图片作者。

曲线下面积(AUC) 测量 ROC 曲线下的面积。简而言之,它可以被解释为模型对随机正例的排序比随机负例更高的概率。给定一个模型f,AUC 可以表示为一个威尔科克森-曼-惠特尼统计量:**

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

来自考尔德斯和西蒙(2007)。

在哪里

  • I(.)是指标函数(如果其参数为真,则为 1,否则为 0)。
  • D₀表示一组阴性(Class 0)观察值。
  • D₁表示一组阳性(Class 1)观察值。

在生存分析中,通过设计,真阳性率和假阳性率依赖于时间。原本健康的患者(真阴性)随着时间的推移会经历不良事件(变成真阳性)。因此,AUC 的表达变得动态。**

在文献中,可以找到右删失数据的动态 AUC 估计量的不同建议:

  • 希格蒂和郑(2005)。
  • Uno 等人,⁴ (2007 年)。
  • 洪和蒋(2010)。

我们可以通过scikit-survival包:sksurv.metrics.cumulative_dynamic_auc ⁶.来实现这个度量

给定一个估计患者i的风险评分ηᵢ的模型f(xᵢ),我们可以将时间t的 AUC 定义为:

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

动态 AUC。来自 sci kit-⁶.生存文档

其中wᵢ代表审查权重的逆概率。

现在让我们根据之前的 Python 示例来估计不同随访时间的 AUC。

首先,我们应该考虑到wᵢ的存在需要从训练数据中估计删失分布。因此,测试集时间范围应在训练集时间范围内:

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

图片作者。

mins = []
maxs = []
for split in [y_train, y_test]:
  mins.append(min(split, key = lambda t: t[1])[1])
  maxs.append(max(split, key = lambda t: t[1])[1])assert mins[0] <= mins[1] < maxs[1] < maxs[0], \
 'Test set time range must be contained in the train set time range'

此外,在定义计算 AUC 的时间点时,我们还应选择最后一个时间点,以使之后被审查的概率不为零:

import matplotlib.pyplot as plt
from sksurv.metrics import cumulative_dynamic_auc
plt.style.use('ggplot')**# Times <t> at which to calculate the AUC**
va_times = np.arange(1, 1500, 30)
**# where max(<t>) is chosen arbitrarily and < of follow-up time****# Risk scores <f(xi)> on test data**
cph_risk_scores = pipe.predict(x_test)**# AUC at times <t> and its average** cph_auc, cph_mean_auc = cumulative_dynamic_auc(
  y_train, y_test, cph_risk_scores, va_times
)**# Plot the dynamic AUC**
plt.figure(figsize = (12,8))
plt.plot(va_times, cph_auc, marker = 'o')
plt.axhline(cph_mean_auc, linestyle = '--')
plt.title('Test set AUC at different time points', fontsize = 20)
plt.xlabel('Follow-up Time')
plt.ylabel('Dynamic AUC')**# Draw textbox with average AUC**
textbox = 'Average: {:.3f}'.format(cph_mean_auc)
props = dict(boxstyle = 'round', facecolor = 'wheat', alpha = 0.9)
plt.text(1100, 0.55, textbox, fontsize = 18, bbox = props)
plt.grid(True)

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

图片作者。

5.结论

在本文中,我们讨论了用于评估生存分析模型性能的流行指标,并使用scikit-survival包提供了 Python 中的实际例子。官方文档和参考文献提供了更多关于该主题的示例和高级信息。

6。参考文献

[1] D. R. Cox,回归模型和生命表,皇家统计学会杂志。B 系列(方法学),第 34 卷,第 2 期。,第 187-220 页,1972 年。

[2]s . pl sterl, scikit-survival:一个建立在 scikit-learn 之上的时间-事件分析库,机器学习研究杂志,第 21 卷,第 212 期,第 1–6 页,2020 ( 包网站)。

[3]https://github.com/sebp/scikit-survival/blob/master/COPYING

[4]https://sci kit-survival . readthedocs . io/en/stable/API/generated/sk surv . datasets . load _ whas 500 . html

[5]https://towards data science . com/turning-web-browsing-activity-into-product-ratings-with-survival-analysis-5d 5842 af 2 a6d

[6] F.E. Harrell Jr,R.M. Califf,D.B. Pryor,K.L. Lee,R.A. Rosati,评估医学试验的产出,Jama,247,1982 ( 链接)。

[7] M.J. Pencina,R.B. D’Agostino,总体 C 作为生存分析中的一种判别方法:模型特定人群值和置信区间估计,统计。医学。2004 年 23 日(环节)。

[8] H. Uno,T. Cai,M.J. Pencina,R.B. D’Agostino,L.J. Wei,关于使用删截生存数据评估风险预测程序总体充分性的 C 统计,Stat .医学。,30,2011 ( 链接)。

[9] E. Longato,M. Vettoretti,B. Di Camillo,对预测时间-事件模型的评估和选择的一致性指数的实用观点,生物医学信息学杂志,第 108 卷,2020 年(链接)。

[10]https://sci kit-survival . readthedocs . io/en/stable/API/generated/sk surv . metrics . concordance _ index _ ipcw . html

[11]https://sci kit-survival . readthedocs . io/en/stable/user _ guide/evaluating-survival-models . html

[12] T. Calders,J. Szymon,分类的有效 AUC 优化,载于:J.N. Kok,J. Koronacki,R. Lopez de Mantaras,S. Matwin,D. Mladeni,A. Skowron,(编辑)数据库中的知识发现:PKDD 2007 ,计算机科学讲义,柏林,海德堡,2007 ( 链接)。

[13] Heagerty,P. J .和 Y. Zheng,生存模型预测准确性和 ROC 曲线,生物统计学,61,92–105,2005。

[14] Uno,h .、T. Cai、L. Tian 和 L. J. Wei,用删失回归模型评估 t 年幸存者的预测规则,美国统计协会杂志,102,527–537,2007 年。

[15] H. Hung 和 C. T. Chiang,具有生存数据的时间相关 AUC 模型的估计方法,加拿大统计杂志,第 38 卷,第 1 期,第 8-26 页,2010 年(链接)。

[16]https://sci kit-survival . readthedocs . io/en/stable/API/generated/sk surv . metrics . cumulative _ dynamic _ AUC . html

如何解释决策树的预测

原文:https://towardsdatascience.com/how-to-explain-decision-trees-predictions-7a10834fe54d

入门

如何解释决策树的预测

我们开发了一种方法来解释为什么一个学习过的树模型为一个给定的样本选择一个特定的类,提供了 Python 中的例子

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

从鸢尾数据集学习的决策树模型,其中花朵被分为三种不同的鸢尾属物种:Setosa、Versicolor 和 Virginica。下面的“可视化学习模型”中解释了这个情节。

随着机器学习模型在不同的用例中变得越来越流行,例如信用风险评估系统、诊断系统甚至节能应用;解释模型决策(或预测)的需要变得更加重要。如果拒绝向客户提供信贷,银行需要向客户解释拒绝信贷的原因;如果患者被诊断患有任何疾病,需要提供该诊断的理由;最后,如果节能应用程序关闭了某个房间的供暖,房主可能想知道为什么会发生这种情况。

一些模型的预测自然比其他模型更容易解释。一方面,神经网络可能在自然语言处理和计算机视觉等几项任务中表现出色,但为了做到这一点,必须训练数百万甚至数十亿个参数,这使得解释模型的输出成为一项非常困难的任务。另一方面,线性回归或决策树等简单模型更容易理解,因此它们的预测也更容易解释。正因为如此,在许多现代系统中,这些模型仍在使用。

在本文中,我们将关注决策树,以及如何解释用于分类的(经过训练的)决策树模型的输出。在接下来的部分中,我们将快速解释决策树是如何工作的,然后我们将看到如何根据导致给定输出的决策路径来解释决策树模型生成的预测。

决策树

决策树的目标是通过学习从数据特征(X)推断的简单决策规则来学习预测目标变量的值(我们的 Y 值或类)的模型。这里的关键是,我们的模型可以被视为一个流程图,其中每个节点代表非叶节点的一个条件或叶节点的一个标签。

我们可以很容易地使用 scikit-learn 训练一个决策树,如下所示。在这个例子中,我们将使用虹膜数据集 —一个众所周知的(无聊的)数据集,通常用作 ML 的玩具示例。我们将把我们的方法应用于这个数据集,但是您可以很容易地修改代码,以应用于您选择的任何其他数据集。下面,我们首先进行必要的导入,然后加载 iris 数据集,并进行 train_test 分割,以创建一个训练集和一个测试集。然后,我们使用训练集训练决策树分类器,将叶节点的最大数量设置为 3,以提高学习模型的可解释性。这降低了我们模型的准确性,如果我们打印分数,我们会看到模型获得 0.964 的分数,而如果我们在没有“max_leaf_nodes”参数的情况下训练决策树,学习后的模型将获得 1.0 的分数(满分)——哦,我们为提高模型的可解释性所做的牺牲!尽管如此,0.964 是一个不错的分数,所以让我们继续下去。

可视化学习到的模型

我们现在可以使用 scikit-learn 中的一种简便方法来绘制我们学习到的模型。我们将首先导入 matplotlib,然后从 scikit-learn 导入名为“plot_tree”的方法。当我们调用该方法时,我们将学习到的模型作为参数发送,然后使用 Iris 数据集数据设置 feature_names 和 class_names 参数。这将把这些数据添加到图中,使它更容易理解。我们可以在下面看到代码和结果。

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

为我们学习的决策树模型调用 plot_tree()的结果[图片由作者提供]。

我们可以看到,不同的框按级别组织,箭头显示数据点可以遵循的路径。我们从根开始——最上面的盒子。每个框的第一行显示在该树节点中评估的条件;如果对数据点的条件的评估为真,则遵循左边的路径,否则,我们遵循右边的路径。如果一个框不包含条件,这意味着我们已经到达了一个叶子,该叶子将用框的最后一行中所示的类标签来标记数据点。

在每个节点中,我们还可以在“样本”中看到到达该节点的数据点的数量,在“值”中,我们可以看到这些样本与其类别标签相关的分布,其中每个第 I 个元素代表第 I 个类别标签的数据点的数量。此外,每个方框还显示了基尼指数:节点中“杂质”的一种度量。

解释决策树的每个预测

我们现在可以手动回答问题“为什么这个数据点被标记为 X?”通过查看数据点特征,然后沿着该数据点在学习模型中经过的路径。然而,我们可能仍然想要产生一个解释这个路径的自动文本,所以让我们这样做。

我在“了解决策树结构中采用并修改了 Scikit-learn 提供的代码,这样我们就可以打印出决策树中给定样本所遵循的路径。我们可以在下面的例子中看到代码及其输出。

Rules used to predict sample 0:
node 0, feature: petal width (cm), (actual value) 2.4 > 0.800000011920929 (threshold)
node 2, feature: petal length (cm), (actual value) 5.1 > 4.950000047683716 (threshold)
leaf reached, label: virginica

首先,我们声明一些数组,对于给定的样本,我们需要遍历决策树。这些数组中的每一个都有注释,但是如果您仍然不确定其中任何一个的含义,您可以查看 scikit-learn 文章以获得更详细的解释。其次,我们声明样本 id(由它在 X_test 数组中的位置给出)并获得样本的决策路径。

然后,我们迭代路径中包含的所有节点:对于分裂节点(或非叶节点),我们打印节点的编号、条件中使用的特征、给定样本的该特征的值以及阈值,显示样本的值是大于“>”还是小于或等于“=

In the output we see a (somewhat rustic) explanation of why our model has predicted a certain label for the given sample: the petal width is greater than 0.8 and the petal length is greater than 4.95, which our tree model has learned to classify as virginica based on the samples included in the train set. If we check the tree plot, we see that a vast majority of the train samples that meet these conditions are indeed virginica, which explains the label predicted by our model.

Conclusion

We have managed to provide a rustic explanation to a decision trees’ predictions. With this, we aim to improve the trust in our model because any person can now see why a sample was given a certain label or class by our model. We have to keep in mind that we need to use decision trees for this approach to work, which can condemn the performance of our model. In a future article, we will see how we can use other tools such as Shapley values to explain other models different than decision trees.

Where to go from here

  • ”。了解决策树结构— Scikit-learn
    如果你想更深入地了解 scikit-learn 决策树,你可以阅读这篇非常有趣的文章。
  • 如果你对可解释的 ML(或可解释的 AI)感兴趣,你可能会对这本书感兴趣,这本书以实用的方式解释了如何使用 Python 实现可解释的模型。

如何用石灰解释图像分类器

原文:https://towardsdatascience.com/how-to-explain-image-classifiers-using-lime-e364097335b4

学习如何应用流行的可解释人工智能(XAI)方法来解释图像分类器

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

用石灰解释图像(作者提供的图像)

局部可解释模型不可知解释(LIME) 是最流行的可解释 AI (XAI) 方法之一,用于解释机器学习和深度学习模型的工作。LIME 可以为解决回归和分类问题提供模型不可知的局部解释,它可以应用于结构化数据集,甚至可以应用于文本和图像等非结构化数据集。在本文中,您将更深入地了解如何使用 LIME 来解释基于深度学习的图像分类器以及代码演练。

如果你对 XAI 概念不太熟悉,我强烈推荐你观看过去在 2021 年 APAC 人工智能加速器节上发表的关于 XAI 的演讲:

你也可以浏览我的书 应用机器学习可解释技术 并看看代码库以获得对其他 XAI 方法的实际接触。在本文中,我将参考《应用机器学习可解释技术》https://amzn.to/3cY4c2h一书中提供的 LIME 在图像分类器中的实际应用。

**https://www.amazon.com/Applied-Machine-Learning-Explainability-Techniques/dp/1803246154?_encoding=UTF8&pd_rd_w=Wr6SJ&content-id=amzn1.sym.716a1ed9-074f-4780-9325-0019fece3c64&pf_rd_p=716a1ed9-074f-4780-9325-0019fece3c64&pf_rd_r=6P2PM599T97MRG7NZD9J&pd_rd_wg=m4qUW&pd_rd_r=6e349d93-5ba0-4bfe-9055-905c0153fe58&linkCode=li3&tag=adib0073-20&linkId=35506e1847de5c011fc57aa66c2b1d8e&language=en_US&ref_=as_li_ss_il

如果你想得到关于这本书的详细反馈,这个视频可能对你有用:

现在,让我们开始吧!

将石灰应用于图像分类器

使用传统的要素重要性方法和其他框架,如莱姆和 SHAP,解释表格数据集仍然很容易。然而,主要的挑战总是在解释基于图像等非结构化数据训练的复杂深度学习模型时出现。

通常,深度学习模型在图像数据上比传统的 ML 模型更有效,因为这些模型具有执行自动特征提取的能力。它们可以提取复杂的低级特征,如条纹、边缘、轮廓、拐角和图案,甚至更高级的特征,如较大的形状和物体的某些部分。这些高级特征通常被称为图像中的感兴趣区域(RoI) ,或超像素,因为它们是图像中覆盖图像特定区域的像素集合。

现在,低级特征不是人类可解释的,但是高级特征是人类可解释的,因为任何非技术终端用户都将关于高级特征来联系图像。石灰也以类似的方式工作。该算法试图突出显示图像中对模型决策过程有积极或消极影响的超像素。那么,让我们看看如何使用 LIME 来解释图像分类器。

https://www.amazon.com/Applied-Machine-Learning-Explainability-Techniques/dp/1803246154?_encoding=UTF8&pd_rd_w=Wr6SJ&content-id=amzn1.sym.716a1ed9-074f-4780-9325-0019fece3c64&pf_rd_p=716a1ed9-074f-4780-9325-0019fece3c64&pf_rd_r=6P2PM599T97MRG7NZD9J&pd_rd_wg=m4qUW&pd_rd_r=6e349d93-5ba0-4bfe-9055-905c0153fe58&linkCode=li3&tag=adib0073-20&linkId=35506e1847de5c011fc57aa66c2b1d8e&language=en_US&ref_=as_li_ss_il

设置所需的 Python 模块

在我们开始代码演练之前,请检查代码库中提供的笔记本。笔记本包含实际应用这些概念所需的必要细节。在这一节中,我将向您演示代码,并解释笔记本教程中涵盖的所有步骤。如果尚未安装 Python 库的升级版本,请使用以下命令进行安装:

**!**pip install --upgrade pandas numpy matplotlib seaborn tensorflow lime scikit-image

导入 Python Jupyter 笔记本中已安装的模块

**import** warnings
warnings**.**filterwarnings("ignore")
**import** os
os**.**environ['TF_CPP_MIN_LOG_LEVEL'] **=** '3'

**import** numpy **as** np
**import** matplotlib.pyplot **as** plt
**import** matplotlib.cm **as** c_map
**from** IPython.display **import** Image, display
**import** tensorflow **as** tf
**from** tensorflow **import** keras
**from** tensorflow.keras.applications.xception **import** Xception, preprocess_input, decode_predictions
**from** tensorflow.keras.preprocessing **import** image

**import** lime
**from** lime **import** lime_image
**from** lime **import** submodular_pick

**from** skimage.segmentation **import** mark_boundaries

np**.**random**.**seed(123)

您可以打印安装在您的设置中的 tensorflow 版本。

print(f" Version of tensorflow used: {tf**.**__version__}")Version of tensorflow used: 2.3.1

加载数据

因为我们更感兴趣的是检查如何使用 LIME 解释黑盒图像分类器,所以我们将只关注推理部分。让我们加载任何通用的图像数据。对于这个例子,我们将从这个来源获取数据:https://unsplash.com/photos/GBDkr3k96DE

**def** load_image_data_from_url(url):
    '''
    Function to load image data from online
    '''
    *# The local path to our target image*
    image_path **=** keras**.**utils**.**get_file(
    "shark.jpg", url
    )

    display(Image(image_path))
    **return** image_path

image_path **=** load_image_data_from_url(url **=** "[https://images.unsplash.com/photo-1560275619-4662e36fa65c?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1200&q=80](https://images.unsplash.com/photo-1560275619-4662e36fa65c?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1200&q=80)")

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

图片来源—Unsplash—https://unsplash.com/photos/GBDkr3k96DE

我们将对图像进行一些初始数据预处理。

IMG_SIZE **=** (299, 299)
**def** transform_image(image_path, size):
    '''
    Function to transform an image to normalized numpy array
    '''
    img **=** image**.**load_img(image_path, target_size**=**size)
    img **=** image**.**img_to_array(img)*# Transforming the image to get the shape as [channel, height, width]*
    img **=** np**.**expand_dims(img, axis**=**0) *# Adding dimension to convert array into a batch of size (1,299,299,3)*
    img **=** img**/**255.0 *# normalizing the image to keep within the range of 0.0 to 1.0*

    **return** img

normalized_img **=** transform_image(image_path, IMG_SIZE)

使用预先训练的张量流模型作为我们的黑盒模型

对于本教程,我们使用预训练的 TensorFlow Keras 异常模型作为我们的黑盒模型。该模型在 ImageNet 数据集(https://www.image-net.org/)上进行预训练,这是最流行的图像分类基准数据集之一。预训练模型可以加载以下代码行:

from tensorflow.keras.applications.xception import Xceptionmodel = Xception(weights="imagenet")

现在让我们使用预训练的 XceptionNet 模型来生成预测。

**def** get_model_predictions(data):
    model_prediction **=** model**.**predict(data)
    print(f"The predicted class is : {decode_predictions(model_prediction, top**=**1)[0][0][1]}")
    **return** decode_predictions(model_prediction, top**=**1)[0][0][1]

plt**.**imshow(normalized_img[0])
pred_orig **=** get_model_predictions(normalized_img)

这将预测以下输出:

The predicted class is : tiger_shark

图像被预测为虎鲨,这是正确的预测,并且黑盒模型能够成功地给出正确的预测。现在,让我们看看前 5 个预测以及模型置信度。

model_prediction **=** model**.**predict(normalized_img)
top5_pred **=** decode_predictions(model_prediction, top**=**5)[0]
**for** pred **in** top5_pred:
    print(pred[1])

该模型生成的前 5 个预测是:

tiger_shark
great_white_shark
hammerhead
scuba_diver
sturgeon

正如我们所看到的,尽管该模型被很好地训练以产生正确的预测,但该模型有可能不只是查看图像中的主要对象,而是查看周围的背景。这一点从水肺 _ 驾驶员出现在前 5 预测列表的预测中可见一斑。因此,理解模型用来进行预测的图像的关键组件或部分对我们来说很重要。

https://www.amazon.com/Applied-Machine-Learning-Explainability-Techniques/dp/1803246154?_encoding=UTF8&pd_rd_w=Wr6SJ&content-id=amzn1.sym.716a1ed9-074f-4780-9325-0019fece3c64&pf_rd_p=716a1ed9-074f-4780-9325-0019fece3c64&pf_rd_r=6P2PM599T97MRG7NZD9J&pd_rd_wg=m4qUW&pd_rd_r=6e349d93-5ba0-4bfe-9055-905c0153fe58&linkCode=li3&tag=adib0073-20&linkId=35506e1847de5c011fc57aa66c2b1d8e&language=en_US&ref_=as_li_ss_il

用石灰解释模型

在本小节中,我们将了解如何使用 LIME 框架从模型使用的图像中识别超像素或区域,以预测具体结果。我们首先需要定义一个图像解释器对象:

explainer **=** lime_image**.**LimeImageExplainer()

接下来,我们需要将推断数据(normalized_img[0])传递给 explainer 对象,并使用 LIME 框架来突出显示对模型预测有最大积极和消极影响的超像素:

exp **=** explainer**.**explain_instance(normalized_img[0], 
                                 model**.**predict, 
                                 top_labels**=**5, 
                                 hide_color**=**0, 
                                 num_samples**=**1000)

我们的 explainer 对象已经准备好了,但是让我们来可视化由 LIME 算法创建的各种解释片段。

plt**.**imshow(exp**.**segments)
plt**.**axis('off')
plt**.**show()

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

由 LIME 生成的热图图像对我们推断的 sharp 图像(图片由作者提供)

现在,让我们使用顶部片段或超级像素来识别模型用来进行预测的图像的感兴趣区域。

**def** generate_prediction_sample(exp, exp_class, weight **=** 0.1, show_positive **=** **True**, hide_background **=** **True**):
    '''
    Method to display and highlight super-pixels used by the black-box model to make predictions
    '''
    image, mask **=** exp**.**get_image_and_mask(exp_class, 
                                         positive_only**=**show_positive, 
                                         num_features**=**6, 
                                         hide_rest**=**hide_background,
                                         min_weight**=**weight
                                        )
    plt**.**imshow(mark_boundaries(image, mask))
    plt**.**axis('off')
    plt**.**show()generate_prediction_sample(exp, exp**.**top_labels[0], show_positive **=** **True**, hide_background **=** **True**)

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

LIME 拾取的最重要的超级像素预测输出为虎鲨*(图片由作者提供)*

从上图中我们可以看到,模型能够识别正确的区域,这表明模型对结果的预测是正确的。

generate_prediction_sample(exp, exp**.**top_labels[0], show_positive **=** **True**, hide_background **=** **False**)

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

由 LIME 拾取的最重要的超像素,用于预测输出,如带有背景图像的虎鲨*(图片由作者提供)*

正如我们从前面的图像中看到的,我们也可以只突出超像素的轮廓,并包括背景。但是我们也可以突出正超像素和负超像素。

generate_prediction_sample(exp, exp**.**top_labels[0], show_positive **=** **False**, hide_background **=** **False**)

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

由 LIME 拾取的最重要的超像素预测输出为虎鲨,背景图像和绿色覆盖突出显示正面区域*(作者提供的图像)*

上述示例向我们展示了如何隐藏或显示背景以及超像素,甚至勾勒或突出显示超像素,以识别模型用于进行预测的感兴趣区域。我们从这里看到的确实有意义,也确实让我们增加了对黑盒模型的信任。我们还可以形成一个热图来显示每个超像素对于获得更精细的解释能力有多重要。

**def** explanation_heatmap(exp, exp_class):
    '''
    Using heat-map to highlight the importance of each super-pixel for the model prediction
    '''
    dict_heatmap **=** dict(exp**.**local_exp[exp_class])
    heatmap **=** np**.**vectorize(dict_heatmap**.**get)(exp**.**segments) 
    plt**.**imshow(heatmap, cmap **=** 'RdBu', vmin  **=** **-**heatmap**.**max(), vmax **=** heatmap**.**max())
    plt**.**colorbar()
    plt**.**show()

explanation_heatmap(exp, exp**.**top_labels[0])

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

使用石灰的解释热图(图片由作者提供)

https://www.amazon.com/Applied-Machine-Learning-Explainability-Techniques/dp/1803246154?_encoding=UTF8&pd_rd_w=Wr6SJ&content-id=amzn1.sym.716a1ed9-074f-4780-9325-0019fece3c64&pf_rd_p=716a1ed9-074f-4780-9325-0019fece3c64&pf_rd_r=6P2PM599T97MRG7NZD9J&pd_rd_wg=m4qUW&pd_rd_r=6e349d93-5ba0-4bfe-9055-905c0153fe58&linkCode=li3&tag=adib0073-20&linkId=35506e1847de5c011fc57aa66c2b1d8e&language=en_US&ref_=as_li_ss_il

摘要

正如我们在本笔记中清楚看到的,LIME 可以轻松地用于解释图像分类器。下次,每当你致力于训练深度学习模型来对图像进行分类时,我会强烈建议你尝试用 LIME 来解释你的模型,并了解模型是否正在研究图像的正确区域,以做出最终预测!如果你喜欢这篇文章,并想了解更多关于如何应用 LIME 来解释 ML 模型的信息,我推荐阅读这本书: 【应用机器学习可解释技术】 并探索 GitHub 资源库以获得实际操作的代码示例。

作者关于 TDS 的其他 XAI 相关文章:

  1. 用于在文本数据上训练的模型的可解释机器学习:将 SHAP 与变压器模型相结合
  2. EUCA——一个有效的 XAI 框架,让人工智能更贴近终端用户
  3. 理解可解释人工智能中使用的 SHAP 和沙普利值的工作原理

https://www.amazon.com/Applied-Machine-Learning-Explainability-Techniques/dp/1803246154?_encoding=UTF8&pd_rd_w=Wr6SJ&content-id=amzn1.sym.716a1ed9-074f-4780-9325-0019fece3c64&pf_rd_p=716a1ed9-074f-4780-9325-0019fece3c64&pf_rd_r=6P2PM599T97MRG7NZD9J&pd_rd_wg=m4qUW&pd_rd_r=6e349d93-5ba0-4bfe-9055-905c0153fe58&linkCode=li3&tag=adib0073-20&linkId=35506e1847de5c011fc57aa66c2b1d8e&language=en_US&ref_=as_li_ss_il

参考

  1. GitHub 中的 LIME 开源 Python 框架—https://github.com/marcotcr/lime
  2. 应用机器学习解释技术
  3. GitHub repo 自《应用机器学习可解释技术》——https://GitHub . com/packt publishing/Applied-Machine-Learning-explability-Techniques/**

如何用图论探索图像数据集

原文:https://towardsdatascience.com/how-to-explore-a-dataset-of-images-with-graph-theory-fd339c696d99

组合特征提取、相似性度量和最近邻图

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

k-最近邻图示例(图片由作者提供)

当你开始处理一个由图片组成的数据集时,你可能会被问到这样的问题:你能检查图片是否好吗?有什么异常吗?一个快速而简单的解决方案是手动逐个查看数据,并尝试对它们进行分类,但这可能是一项繁琐的工作,具体取决于您获得的图片数量。

例如,在制造业中,您可以从由不同类型和大小的电池组成的生产线上获得包含数千张图片的样本。你必须手动浏览所有图片,并按照类型、大小甚至颜色进行排列。

另一方面,另一个更有效的选择是走计算机视觉路线,找到一种可以自动排列和分类图像的算法——这是本文的目标。

但是我们怎样才能自动完成一个人的工作,也就是说,两个两个地互相比较图片,并根据相似性进行分类?这个问题没有统一的答案。尽管如此,我们可以将问题分成更容易的子问题,并逐一解决它们:从每幅图像中提取相关特征,定义特征之间的相似性度量,并根据相似性对它们进行排序。

为了解决每个子问题,我们将在本文中使用以下方法:

  1. 方向梯度直方图(HOG)提取特征
  2. 测量直方图之间相似性的 Wasserstein 距离
  3. K-最近邻图(K-NNG ),以便根据相似性对图像进行排序

方向梯度直方图

任何计算机视觉问题的第一步都是从图片中提取有用的特征。在我们的例子中,我们希望比较图像,并根据相似性对它们进行排序。所以我们希望我们的特征能够区分相似和不太相似的图像。目标检测中经常使用的一个特征是梯度方向直方图(HOG)。

HOG 特征是将图像表示为矢量,其中矢量中的每个元素都是定向梯度的直方图。推荐阅读这篇文章了解 HOG 算法的工作原理。

为了从图像中提取 hog 特征,我们可以使用 Scikit-image 库中的 HOG()函数。以下是在黑白图片上提取的渐变的视觉示例:

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

方向梯度直方图示例

既然我们已经从图像中提取了特征,我们需要定义这些特征之间的相似性度量。机器学习中常用的相似性度量是欧几里德距离,但是在我们的例子中,我们将使用 Wasserstein 度量来给出两个分布之间的距离度量。

瓦瑟斯坦距离

Wasserstein 度量,也称为推土机距离,是两个概率分布之间的距离度量。它基于测量将一种分布转换成另一种分布所需的“工作量”的思想。

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

Wasserstein 距离示例(图片由作者提供)

使用 Wasserstein 度量标准有很多原因。一个原因是它是概率度量空间中一个非常自然的度量。这是一个非常通用的指标,可以用来比较不一定相同的分布。

寻找特征向量之间的良好距离度量是许多机器学习算法的基本步骤。在我们的例子中,Wasserstein 度量测量两个直方图之间的距离,因此提供了两个图片之间的相似性度量。

HOG 从图片中提取特征,Wasserstein 度量提供每个特征之间的距离。下一步是绘制数据并探索数据集。对于这个任务,k-最近邻图因其简单性和可解释性而成为自然的选择。

K-最近邻图(K-NNG)

简单地说,K-最近邻图是每个节点都与其 K 个最近邻相连的图。K-NNG 有助于发现数据中的模式。例如,如果您有一个人的身高和体重的数据集,您可以使用 K-最近邻图来找出数据中是否有任何模式。

对于我们的最后一个例子,我创建了自己的玩具数据集,其中有一个杯子的 500 张照片,有几种位置和旋转。

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

具有不同位置和旋转的杯子数据集(图片由作者提供)

为了发现数据的全局结构,我们可以使用流形学习,例如 t-分布式随机邻居嵌入(t-SNE)来将 HOG 描述符的维度降低到仅二维。

通过这种布局,我们获得了一个分隔节点的图,如下图所示。

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

30-cup 数据集的最近邻图(图片由作者提供)

我们可以用这种方法轻松地分离不同类型的数据,但我们也可以探索数据集的底层结构。对于杯子的例子,我们能够区分五个水平位置,也能够区分杯子在图片中的旋转。

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

第一个位置的编码旋转(图片由作者提供)

结论

HOG 特征是一个强大的特征描述符,可用于各种计算机视觉应用。然而,它也是一个高维特征向量,可能很难处理。

然而,我们使用 Wasserstein 度量来计算每个直方图之间的距离,这在计算上是昂贵的,但是在比较两个分布时是自然的选择。

为了改进这种方法,我们可以降低 HOG 特征的维度。例如,我们可以使用更少数量的箱、更粗糙的宁滨方案或更小范围的值,但我们将在另一篇文章中讨论这一点。

最后,通过 K 近邻图,我们了解数据。这包括理解数据代表什么以及数据集的整体结构,这是迭代和细化探索性分析的良好起点。

好奇想了解更多关于 Anthony 的工作和项目吗?在媒体LinkedInTwitter 上关注他。

需要技术写手?将您的请求发送到https://amigo CCI . io

作为高中生如何探索机器学习和自然语言处理

原文:https://towardsdatascience.com/how-to-explore-machine-learning-and-natural-language-processing-as-a-high-school-student-d66b3685c186

从一个女孩到另一个女孩的简单、现实的指南

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

法比奥Unsplash 上的照片

那里有!你喜欢破译语言的细微差别,思考创造性的写作作品,并为你的校报制作突发新闻故事吗?但是,也许与此同时,在 5 月份的 AP 计算机科学考试后,你是否被所有可以用字符串做的时髦事情迷住了?

伙计,你让我想起了我自己!如果你在这里发现,哇——有一个应用计算机科学和语言的跨学科领域(咳咳,语言的计算分析),但所有在线指南要么是面向成年人的,要么只是为了一些探索目的而过于吓人——那么,这个指南对你来说是完美的!

到最后,你将对机器学习和自然语言处理有一个很好的总体看法,包括关键概念以及为什么它们在只有高中生背景的今天如此重要。至于有形的产品,你会带着一个小的迷你项目离开,然后你可以将这些知识应用到你未来的努力中去!

附:我向你保证,你对本指南了解得越多,它就越有趣。(结尾有拼图!)开头可能是一阵熟悉这个,熟悉那个的猛攻(希望我听起来不要太像 Google-Translate 阅读干巴巴的垃圾邮件哈哈),所以如果你睡着了我不怪你,但是你得到了这个!这是值得的!

目录

介绍

现在,在我开始之前,我想做一个免责声明:如果你在这里希望成为机器学习(ML)和自然语言处理(NLP)的专家,这本指南不适合你。本指南旨在帮助高中生任何其他好奇的灵魂,他们真正对这个迷人的领域感兴趣,并喜欢的起点来探索该领域中一些实际操作的可接近的行动项目,即使你没有研究或大学/行业导师来指导你。(事实上,如果你真的完成了这个指南,我认为这是一个很好的方式来证明你对 ML 和 NLP 的兴趣,当你申请暑期研究项目的时候,这些项目确实需要这个领域的背景知识!)

TL;DR——考虑到高中生在教育水平和时间方面的常见障碍(包括之前没有研究/项目经验),我构建了这个指南,因此我做出了一些适用于我和我认识的许多人的概括;当然,也有很多例外(事实上,我知道这么多令人惊讶的先进、有才华、谦逊的同学),但我希望这个指南对所有人都是可及的,无论起始水平如何。

说完了,我们来探索一下吧!

先决条件

尽管(从任何专业水平的角度来看)掌握微积分、线性代数和其他基础知识是理想的,但任何正在经历或已经经历过美国教育系统的人都可能会注意到:

  • **数学局限性:**大多数人直到大三或大四才开始学习微积分(对于那些特别有抱负的人来说是大一或大二),这意味着现实地说,一个好奇的 14 岁孩子可能很难通过购买线性代数教科书并试图理解基础知识来探索某个领域,因为他们甚至没有在学校完成代数 2 荣誉课程(Calc 预科的先决条件)。
  • **时间&优先事项:**学生们有很多事情要做,无论是音乐、体育、艺术、舞蹈、俱乐部、本地辅导还是其他兴趣,所以时间是最重要的。

因此,这些先决条件是意识到上面的两个警告,同时如果你真的对这个领域着迷,也让探索变得超级有趣。(如果您已经了解基本的 Python,请随意跳过这一步!)

1。学习基础编程…

…在任何方便的地方,无论是在学校还是在网上(APCS、暑期社区学院、Udemy、Edx 等)。这部分是不可避免的,但不是不可能!

如果你和我一样,在参加了 AP 计算机科学 A 考试或暑期社区大学(T2)Java I 课程(T3)后才知道 ML,那就太好了!对类、函数、数组和基本编程有了很好的了解,你已经为这个先决条件设置好了,可以直接跳到第 2 步了!

即使你没有,也不要担心;考虑到许多学生在大二就完成了 APCS,这并不是一个很大的挑战。如果你需要从某个地方开始,艾萨克·莱曼有趣地写了**当你读完这本书,你将学会如何编码是一个很好的切入点。从那里,在网上找一个简单的 Python 课程https://www.edx.org/course/introduction-to-computer-science-and-programming-7或者在你当地的社区大学注册一个学期来打下基础。**

我将继续假设你在高中时已经学过《计算机科学导论》或《APCS》中的 Java,这是学生们非常普遍的基础。

2。为数据科学学习 Python

现在有了编程(可能是 Java)作为基础,Python,一种创建 ML 项目的基本语言,将变得更加容易掌握!

这个 网站 是麻省理工学院为高中生开设的 Beaver Works 暑期学院 ,专门关注“[类似 Python 的]数据分析、机器学习、数值计算等 STEM 应用”,是一个完美的资源。仅仅通读的前两个模块就会以一种易于理解的格式给你一个足够坚实的语言理解,而不会强迫你理解与 ML 无关的概念。****

额外:如果你想更进一步,你还可以通过 BWSI 网站 报名参加他们相应的课程,进行选择题和练习题,还有机会参加他们大三的暑期项目!(课程对我来说是一个很好的学习机会,虽然我最终因为和另一个项目冲突而没有去参加他们的Cog * Works夏令营;有兴趣的话可以去看看!)

3。熟悉这些特定的库

有了 ML 和 NLP,事先理解 熊猫 库,让你轻松操作数据,是非常有帮助的。这个 YouTube 系列 很好地总结了这一点(尽管如果你真的没有时间,你可以跳过这一步,稍后花更多的时间去探索。)阅读一些关于图形的内容( matplotlib,seaborn ),你可以通过简单的谷歌搜索很容易地找到这些内容,这也会使体验变得有趣得多。

4.保持好奇!

可以说,从现在开始最重要的先决条件是好奇的心态;没有什么比简单的愿意挖掘和学习更重要的了。假设你已经有了相当于 APCS 的背景知识,以上可以在一周内完成如果你决定雄心勃勃;我故意这样做,因为我完全理解繁忙的高中生活方式的限制!

因此,正如我将在下面详细阐述的那样,作为一名高中生,你最终可能会发现的很多东西不是来自课程,而是来自你自己对 Stack Overflow、YouTube 和 Google 的挖掘。那样你真的会学得更深刻。准备好了?请继续阅读!

快速阅读和软件安装

有很多很棒的课程,比如吴恩达著名的斯坦福 ML 课程,所以如果这是你的学习方法,那就去吧!但是我希望这篇特别的文章成为一个探索指南,你可以相对快速地完成来评估你对这个领域的兴趣也许完成一个迷你项目,而不是正式潜入这个领域我提倡一种更实际的、把你扔进大海的方法。如果你觉得下面的资源很有趣,并且想花更多的时间,那么尽一切办法,参加所有在线的开源课程吧!但是,这里有一个方法可以让你了解一些背景知识就可以做的很酷的事情。

1。今天阅读关于 ML 和 NLP 的影响:

有点乱?我知道,我知道。我们都想直接进入项目时间,但在我看来,开始一件事最重要的因素不仅仅是决定你将做什么,而是决定你为什么要做。因此,探索以下网站会让你对现实世界的影响有更深的理解。(嘿,这是一种激励,为什么不呢?)

  • SpeechTek 杂志 :天哪,我简直无法抑制自己的激动!没有更好的方法来了解自然语言处理在当今世界可以做的所有史诗般的事情,从帮助医生到提高营销策略的效率和为世界各地的残疾人提供访问,然后这是所有最新的,突破性的自然语言处理技术的最新汇编。在我偶然发现这本书的那一刻,我无法停止阅读几个小时,鉴于我的记者心态(我们确实做了很多调查),我真的希望它对你有同样的影响。
  • **Google**:这是不是不言自明,完全没必要写下来?是的。我还在这里推广吗?是啊!如果 SpeechTek Mag 对你来说不是动力,那就去做一些你自己的研究,看看为什么 NLP 是如此重要!这将是一个疯狂的旅程,但完全值得。

**可以说,从现在开始最重要的先决条件是**一种好奇的心态;没有什么比简单的愿意挖掘和学习更重要的了。

2.ML 和 NLP 中的概念概述

撇开女学生的兴奋不谈,现在你已经准备好出发了,这里有一些读物可以让你对 ML 和 NLP 有一个简单易懂的概述,包括技术术语、管道和其他必要的工具。(最多 30 分钟,还没编码!)

A)ML 概述:

  • 机器学习,由麻省理工学院斯隆解释的 ,给出了 ML 是什么,ML 的三个子类别(监督、非监督、强化学习),其他 AI 子领域,及其适用性的大图。
  • ML For Dummies ,它确切地解释了 ML 在下面是如何工作的,更详细地解释了三个子类别、关键术语(即培训/验证/测试)和潜在偏差。

B)自然语言处理概述:

  • 什么是自然语言处理? 快速、概念性地了解 NLP 是什么以及如何使用它。
  • 温和开始使用 Python 进行自然语言处理 由 Rahil Shaikh。这篇文章非常简单地介绍了 NLP &如何使用代码来实现上一篇文章中的想法。您现在还不需要编写任何代码。(我们将在下一节中介绍这一点。)只是阅读作为一个开始!
  • 额外:速成计算语言学 如果你是伴随着约翰·格林的速成历史视频长大的,你很幸运!这是我在他们的语言学系列中发现的一个有趣的计算语言学视频,如果你想怀旧和吸收知识的话!

3.软件安装

现在,随着大部分概念性的大图阅读的进行,是时候安装您将使用的实际环境了。

  • ****选项 1: 安装 Jupyter Notebook 一个用于创建简单、交互代码的 web 应用(比通常枯燥的 IDE 有趣多了)。你可以随时在本地使用它,这意味着你不必连接到互联网!安装和学习使用 jupyter 笔记本,参考
  • ****方案二: 使用 Google Colab Google 的一款基于云的 Jupyter 笔记本,让你和别人分享你的代码变得超级简单,就像分享一个 google doc 一样。要学习如何使用 Google Colab,参考 这个

项目时间!(自然语言处理和毫升)

还和我在一起吗?去你的和你史诗般的注意力跨度!

可以说,本探索指南最令人兴奋的部分是有机会接触一些有趣的开始代码和等待它…迷你项目!等待结束了。我们出发了。

1。通过工作的基线编码指南

Ventsislav Yordanov 已经创建了一个绝对非凡的、易于理解的系列文章,它将带您浏览 NLP 管道各个方面的概念,从探索性分析到预处理,以及实际的代码。我强烈推荐你按照以下顺序,通过自己的努力来学习这些简单、巧妙的指南:

2。全面的 NLP 项目

几乎没有任何一个系列能比这个精彩的开源 系列的五个视频讲座 得到我更多的赞扬,这些讲座来自编写代码的女性以及她们相应的 开源项目代码、幻灯片和资源 ,它们带你经历创建 NLP 项目的整个过程,从 NLP 概念和工作流的基本介绍到探索性分析、预处理、各种方法的详细分步过程****

什么?是的,你没听错。

在 YouTube 上找到这个就像我是一个在圣帕特里克节中了大奖的小妖精,意识到我找到的不仅仅是一罐金币,而是一大罐永不枯竭的麻辣火锅。(Whaaat?如果你被困在一个岛上,火锅会更好。)但是我跑题了…如果你想创建一个有指导的迷你项目,几乎没有比这个坏男孩更好的交易了。

****TL;博士?让我再次链接 视频代码 来强调我发现这个资源有多棒!(获胜的被动攻击性>:))

3。更多 ML 导轨

如果你在#2 之后仍然渴望另一种味道,这里的https://machinelearningmastery.com/machine-learning-in-python-step-by-step/这里的这里的 是一些额外的指南和资源,在那里你可以用开放库中可用的数据集来处理一些项目。网上也有很多,所以尽一切办法去寻宝吧!让你想起一个重复出现的主题?****

可以说,从现在开始最重要的先决条件是一种好奇的心态;没有什么比愿意去挖掘和学习更重要的了。

北美计算语言学公开赛(前奥林匹克)

耶,你完成了你的第一个项目!现在,作为一个主要针对高中生的探索性指南,不提到美国官方奥林匹克竞赛之一的北美计算语言学公开赛(【NACLO)(与 AMC 的数学竞赛、USACO 的计算机科学竞赛等一起)是不完整的。)—只不过这次奥林匹克竞赛专门关注语言学难题,重点是计算语言学!****

NACLO 最突出的一点是,它像其他奥林匹克竞赛一样专门针对高中生,所以他们认为你对计算机科学或语言学一无所知(作为 NACLO 半决赛选手,我可以证明这一点;我在没有任何背景知识的情况下完成了他们的拼图。)换句话说,你可以纯粹地使用逻辑来解决他们的难题,同时发现关于 NLP 的迷人之处。以下是我最喜欢的几个关于自然语言处理和机器学习的例子:

另外,如果你感兴趣, NACLO 也有许多关于语言学领域本身的谜题,他们每年 1 月下旬都会举办一场比赛,高中生可以免费报名。美国和加拿大前 10%的选手有资格参加邀请赛,如果你在那里表现出色呢?你可以参加国际语言学奥林匹克竞赛!

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

布雷特·加伍德在 Unsplash 上拍摄的照片

其他资源

恭喜你坚持到最后!

在我结束这篇探索性指南之前,如果你想更深入,我完全推荐 这篇这篇 指南,作者是其他才华横溢的高中生,他们有一些非常好的建议,告诉你如何在中学阶段就开始学习 AI/ML(我个人不认识这些人,但我过去曾在网上参考过他们的文章,因为我自己也试图学习更多关于这个领域的知识。)

结论

我在自己尝试自己的项目以及与圣克鲁斯大学科学实习项目(UCSC SIP,强烈推荐)相结合的过程中,在网上找到了上述所有资源。)因为我喜欢探索和挖掘,它把我带到了难以想象的令人敬畏的地方。从 YouTube 行业深度挖掘到其他高中生创建的关于如何学习的惊人资源,可能性是无穷无尽的——对于十几岁的青少年来说,这是完全可以实现的!(看到那里的头韵了吗?)

你还在等什么?去探索一下,让我知道进展如何!如果你想更多地了解我是谁,请在这里阅读一些关于我的信息https://goofyseal.medium.com/hey-there-welcome-to-my-blog-ae3eb5de2324或者在这里联系我https://www.carolynwang.co/。最后,如果你有任何反馈或建议,我希望在评论中听到它们!❤****

最后一件事:我在本指南中提供的资源都是开源的,可以在网上找到,对我帮助很大。我与他们中的任何人都没有关系,也没有声称对他们的工作居功。继续探索!

可以说,从现在开始最重要的先决条件是一种好奇的心态;没有什么比愿意去挖掘和学习更重要的了。

呵呵,我真的很喜欢这句格言,嗯?

如何从 PDF 文件提取表格并将其转换为 Pandas 数据框架

原文:https://towardsdatascience.com/how-to-extract-and-convert-tables-from-pdf-files-to-pandas-dataframe-cb2e4c596fa8

因此,您有一些包含表格的 pdf 文件,并希望将它们读入熊猫数据框。让我告诉你怎么做。

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

约翰内斯·格罗尔在 Unsplash 上的照片

设置

出于本文的目的,我们将从英国住房协会于 12 月 2 日发布的住房统计文件中提取表格。pdf 文件的副本可以在这里找到。

我们将使用 tabula-py 库从 pdf 文件中提取表格。运行pip install tabula-py进行安装

确保您的系统中安装了 Java。如果遇到任何安装错误,请参考库的文档。

好了,我们都准备好撤离了!😎

Tabula:将 Pdf 表格提取到数据框

现在假设感兴趣的 pdf 文件在同一个工作目录中,让我们尝试从中提取表格。要做到这一点,我们需要做的是:

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

使用 Tabula 从 pdf 文件中读取表格的 Python 代码。(来源:作者)

如您所见,代码非常简单,不言自明。该代码为提取的每个单独的表返回 pandas 数据框的列表。

您可以通过运行len(tables)快速查看提取的表的数量,对于这个例子,T1 应该返回9。如果您看一下本文使用的 pdf 文件,整个文档中有 9 个表格。

现在,我们要做的就是对列表进行索引,将每个表作为一个数据框。例如,tables[0]应该返回第一个表,tables[1]应该返回第二个表。

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

使用 tables[0]从 pdf 文件中提取的第一个表格。(来源:作者)

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

从 pdf 文件中提取的第一个表格的实际版本。(来源:作者)

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

使用表[1]从 pdf 文件中提取的第二个表。(来源:作者)

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

从 pdf 文件中提取的第二个表格的实际版本。(来源:作者)

记住

从上面两个提取表格的例子可以看出,tabula 库在从 pdf 中提取表格方面做得非常好。但是,它并不总是干净和精确的。有时,我们必须进行一些手动清洁,以:

  • 更正表格的标题
  • 删除不必要的行和列
  • 拆分合并在一起的列。

这些问题通常在嵌套标题表中很突出,并且很容易解决。😄

最后的想法

在本文中,我们看到了使用 Tabula 库从 pdf 文件中提取表格并将其作为 pandas 数据框加载是多么容易。该库在提取表格方面做得很好,但是我们必须总是直观地验证表格的不一致性。大多数时候,任何不一致都很容易解决。

为了完整起见,值得一提的是用于 pdf 表格提取的另一个库: Camelot 。虽然这里没有涉及,但它是白板的一个很好的替代品。两者之间没有偏好,因为两者都做得很好。

现在您已经有了作为数据框的表格,可以随心所欲地操纵它们。😄

🚀希望这篇文章对你有用。 如果你愿意支持我,可以考虑使用我的 推荐链接 加入 medium。这将让你在这个平台上看到我所有的文章以及更多来自其他了不起的作者的文章!🙏

我写的其他文章,你可能会喜欢:

如何使用 Python 从 Twitter API 中提取数据

原文:https://towardsdatascience.com/how-to-extract-data-from-the-twitter-api-using-python-b6fbd7129a33

Tweepy 最新版本概述

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

卢克·切瑟在 Unsplash 上的照片

在许多情况下,从 Twitter 等社交网络获取外部数据是有价值的。

无论你是大公司还是个人,这都有助于进行和丰富特定主题的分析,监控竞争,评估特定产品的社会声誉,分析客户评论,跟踪对最近事件的反应等。

几年前,从 Twitter 和其他社交网络中提取数据是一场噩梦:没有 API,没有清晰的文档,没有库,并且您必须手动构建复杂的网络爬虫来从底层 HTML 代码中收集数据。

不用说,这是痛苦和笨拙的😰。

希望,事情已经挂起了很多。

在这篇文章中,我将向你展示如何从 Twitter 中提取有用且可操作的数据。为此,我们将使用一个名为 Tweepy 的 Python 包,它将与 Twitter API 交互以获取不同类型的元数据并自动执行任务。

希望你都准备好了。让我们看一看🔍

我们为什么需要 Twitter API?

想象一下:你是一名 web 开发人员,想要提取一个给定帐户的 tweets,以便将它们嵌入到你的应用程序中。您还想每天获取并更新这些推文,以获得最新的推文。

你会怎么做?

为了消费 Twitter 数据,你不需要访问 Twitter 的内部服务器和数据库。你也不需要理解 Twitter 是如何编码的。

您所需要的只是您和 Twitter 后端之间的一个中介,一个您可以请求(通过一些参数)以获得一些数据或与 Twitter 服务交互的中介。

简单地说,API 就是这样:它只是两个相互通信的独立应用程序之间的连接点。

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

作者图片

作为一种抽象,Twitter API简化了与第三方(开发者、应用、其他 API 等)的集成。).

下面是您可以用 Twitter API 做的事情:

  • 基于标签、关键词、地理位置等以编程方式搜索推文。
  • 构建自动转发预定义账户列表的 Twitter 机器人
  • 基于一系列过滤器实时传输推文
  • 自动关注用户列表
  • 等等。

该 API 允许您以编程方式执行您从界面中手动执行的任何操作。

看起来很有趣:现在让我们看看 Python 如何与 Twitter API 交互。

创建一个 Twitter 应用程序并设置凭证

为了能够重现以下步骤,你需要一个 Twitter 账户。

为了使用 Twitter API,你首先必须在开发者的网站上注册成为 Twitter 开发者。

注册后,您需要创建一个 Twitter 应用程序,该应用程序将设置一系列凭证:这些凭证稍后将由 Tweepy 库使用,以便对您进行身份验证。

首先,进入开发者的仪表盘

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

作者截图

点击左侧边栏中的概述并点击创建应用按钮。

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

作者截图

为您的应用程序命名。

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

作者截图

这将生成以下凭据。这是私人物品,不要和任何人分享。

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

作者截图

如果您在第一次看到凭据时没有进行复制粘贴,则需要重新生成凭据。为此,从左侧边栏访问您的应用程序,点击键和令牌边栏。

点击每个重新生成按钮,并将以下凭证保存在某处:

  • API_KEY
  • API_KEY_SECRET
  • 访问 _ 令牌
  • 访问 _ 令牌 _ 秘密
  • 不记名 _ 令牌

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

作者截图

您现在已经准备好使用 API 了。

连接到 Twitter API

为了能够使用 Python 与 Twitter API 进行交互,我们将使用一个名为 Tweepy 的库。

为了能够从源代码中隐藏凭证并将它们作为环境变量加载,我们将使用 python-dotenv

pip install tweepy
pip install python-dotenv

首先,创建一个.env文件来保存您的凭证。

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

作者截图

在包含.env文件的同一个目录中打开一个 jupyter 笔记本或 python 交互式 shell。

我们可以使用下面的脚本对 Twitter API 进行认证。

让我们检查一下发起这个连接的 Twitter 用户是不是我。

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

作者截图

为此,我们调用verifiy_credentials方法,该方法返回包含我的个人资料数据的用户对象。

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

作者截图

这个对象是一个包含大量元数据的 blob。我们可以将其中一些作为对象属性来访问,并将它们打印在屏幕上。

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

作者截图

这个用户肯定是我。您可以在我的档案中清楚地看到这些数据。

搜索和提取推文

Twitter API 的第一个应用是能够基于多种类型的过滤器以编程方式搜索推文。

例如,让我们搜索一些提到乌克兰🇺🇦.的推文

在设置了认证之后,我们将使用search_tweets方法,遍历提取的 tweets 并打印它们的文本。

下面是运行代码片段后发生的情况。

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

作者截图

👉在这个例子中,我们没有指定任何过滤器,但是您可以通过设置一些参数来定制搜索,例如您想要的推文数量(count)、语言(lang)、位置(geocode)、停止日期(until)等。
你可以在这里了解全部参数

👉您还可以使用更高级的搜索查询,直接在其中嵌入一些过滤器。
例如,如果您想要提取非转发的关于新冠肺炎的英语推文,您可以编写以下查询:covid-19 lang:en -is:retweet

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

作者截图

要了解更多关于 Twitter 搜索运营商的信息,请参考这个链接

使用分页搜索大量的推文

在前面的例子中,我们只提取了 15 条左右的 tweets:这是因为 Twitter 有分页机制,我们只得到第一页的结果。

为了循环多个结果页面/tweet,我们需要使用包装了search_tweets方法的光标

Cursor 类的每个实例都支持两种方法,这取决于您想要迭代的内容:

  • items:要迭代的最大项数
  • pages:迭代的最大页数

让我们使用items方法提取 250 条推文。

使用items方法时,我怀疑count参数没有作用。

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

作者截图

类似地,我们可以使用pages方法获得相同数量的 tweet:我们告诉 Cursor 对象迭代 5 个页面,并为每个页面提取 50 条 tweet。

⚠️如果您积极地使用搜索 API,您可能会遇到 429 错误代码,这表明您已经达到了特定端点的速率限制。

👉例如,/search/tweets/端点上的速率限制是每 15 分钟 180 次。这意味着,在这种限制下,您每 15 分钟最多可以获得 180 * count条推文(count是您在search_tweets方法中指定的参数)

你可以在这里了解更多关于 Twitter 费率限制的信息。

搜索特定账户的推文

假设你想分析埃隆·马斯克的推文:这相当简单。

你所需要做的就是在你的查询前面加上from关键字。
如果你想收集关于特斯拉的推文,你可以这样写:

tesla from:elonmusk lang:en -is:retweet

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

作者截图

流式实时推文

Twitter API 的一个有趣的功能是能够传输实时推文的样本。这尤其有助于跟踪现场事件并收集相关数据。

为了能够使用 API 的流功能,您首先需要授予对您的 Twitter 应用程序的写访问权限,然后将它移动到一个项目中。

然后,您需要重新生成凭证。

为了能够使用 Tweepy 获取流媒体 tweets,您必须定义一个自定义类,它是StreamingClient类的子类。

这个类需要覆盖一个名为on_tweet的方法,该方法在每次收到 tweet 时执行:为了简单起见,我们告诉这个方法打印 tweet 的 id 和文本。

为了从这个类中实例化一个定制的流,我们需要将无记名令牌传递给构造函数。

然后,我们需要附加一些规则来定义我们想要搜索的内容(注意 tweepy 允许在一个列表中有多个规则,但是在这个例子中我们只设置一个)。

最后,调用filter方法打开流,并对每个传入的 tweet 运行on_tweet方法。

下面的 GIF 说明了流打开后会发生什么。

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

作者 GIF

要了解更多关于 Tweepy 流的信息,请查看此文档

参考

结论

这篇文章简单介绍了 tweepy 和 Twitter API。它让我们有机会从离线到流媒体模式以各种方式提取推文和元数据。

如果你是一名数据科学家,将 tweepy 添加到你的技能中肯定会给你带来竞争优势,并帮助你用外部数据丰富你的分析。

但是我们只是触及了表面:显然还有更多要学的。如果你想更深入地挖掘,我鼓励你看看 API 文档,一如既往地实验,实验,实验。(3 次不够说)。

今天就这些了。直到下一次更多的编程技巧和教程。👋

新到中?你可以每月订阅 5 美元,并解锁各种主题的无限文章(技术、设计、创业……)你可以通过点击我的推荐链接来支持我

https://ahmedbesbes.medium.com/membership 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 charlesdeluvioUnsplash 上拍摄

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值