Azure Synapse Analytics 中的专用 SQL 池是什么?
Azure Synapse Analytics 中的大数据解决方案
弗兰基·查马基在 Unsplash 上拍摄的照片
TLDR
- Synapse SQL 池的背景
- 什么是专用 SQL 池?
- 怎么用?
- 创建您第一个专用 SQL 池
- YouTube 视频对以下步骤进行了直观描述
Synapse SQL 池的背景
自从我的上一篇帖子( SQL On-Demand:一种更简单的数据查询方式|作者 Dayo bami kole | toward Data Science)以来,Azure Synapse Analytics 已经向公众公开(正式发布),我在帖子中提到了 Synapse 的一些顶级功能,其中之一就是 SQL Pool。有几种方法可以在 Azure Synapse 中查询数据,有 SQL 池和 Apache Spark 池。有两种类型的 SQL 池:专用的和无服务器的。在随后的一篇文章中,我重点介绍了以前称为 SQL On-Demand 的无服务器 SQL 池。在这篇文章中,我将重点关注专用的 SQL 池。
什么事
SQL 池是传统的数据仓库。在加入 Synapse 家族之前,它的前身是 Azure SQL 数据仓库。它是一个大数据解决方案,以列存储的关系表格式存储数据。它还使用大规模并行处理(MPP)架构来利用多达 60 个节点来运行查询。一旦您将数据存储在专用的 SQL 池中,您就可以利用它从仪表板进行历史分析,将其用作机器学习的数据集,以及您可能用于大规模数据集的任何其他数据目标。
有关 Synapse SQL 架构的更多信息,请查看微软文档
https://docs . Microsoft . com/en-us/azure/synapse-analytics/SQL/overview-architecture
目标
使用专用 SQL 池的目标是存储大规模数据,并能够高效地进行查询。这更容易,因为它是以列格式存储的,并且您可以利用聚集列存储索引进行快速检索。
如何使用
你可能想知道如何将数据输入这个平台,对吗?
围绕专用 SQL 池,您会经常听到一个术语,即 Polybase。什么是 Polybase,它是一个允许你从外部资源查询数据的工具,例如 SQL Server,Oracle,Teradata,MongoDB 等。您可以看到使用专用 SQL 池的好处。一旦数据被摄取,Polybase 还提供了查询大数据的能力。
创建您的第一个专用 SQL 池
如果你已经有了 Synapse 环境,那就非常简单了。如果你需要一些帮助,看看我的介绍视频这里
在您的 Azure Synapse 环境中,单击管理
作者图片
在 SQL 池下,单击新建
作者图片
为专用 SQL 池命名
将性能级别扩展到您选择的级别。
作者图片
点击查看+创建
点击底部的创建
作者图片
创建您的第一个 SQL 池表
进入数据库部分。您可能需要刷新数据库部分。您应该会看到新创建的 SQLPool。展开它,您会看到 SQL Server 等数据库的相似之处。
要创建您的第一个表,您将右键单击“表”部分并选择“新 SQL 脚本”,然后选择“新表”
作者图片
这将创建一个默认的表脚本。您所要做的就是单击 Run 来创建您的第一个表
作者图片
显然,这只是一个示例脚本,您可以在这里编写各种类型的查询以用于大数据目的
结论
既然您已经创建了第一个专用的 SQL 池,那么您现在已经对 Azure Synapse 中有助于构建端到端数据解决方案的众多功能之一有了一些体验。请继续关注 Azure Synapse Analytics 的其他组件以及它们之间的联系。
什么是动态图,为什么它们很有趣?
由于复杂的现实生活情况可以用图表来模拟,它们随时间的演变可以用动态图表来捕捉。
一个无向图可以表示为 G ( V,E )其中 V 是顶点/节点,E 是两个顶点之间的边/连接。
我们以类似的方式定义一个动态图,但是作为一系列快照,即 G = (G₁,G₂,…)。Gₜ),其中 gₜ=(eₜvₜ),t 是快照的数量。在动态图中,新节点可以形成并创建与现有节点的链接,或者节点可以消失,从而终止现有链接。
这在某种程度上是一个正式的定义,但我们将使用一个简单的社交网络示例来理解动态图。
社交网络的演变
图一。社交网络示例(来源:作者)
让我们构建一个由 5 个人组成的小型社交网络图(见图 1)。这里的节点代表人,边代表两个人之间的友谊。这是 T = 0 时的情况。当他们相互作用一段时间后,一些新的关系会形成,一些会破裂。此外,请记住,新人可以在任何时间进入这个社交网络,现有成员也可以离开。
社交网络的演变(来源:作者)
在社交网络的发展过程中,我们在 3 个时间点获得了 3 个快照。所有这三个快照构成了动态图。我们见证了一些新友谊的建立,也见证了一些破裂。我们可能会遇到这样的情况:有新的输入节点(人们加入网络)和一些输出节点(人们离开网络)。
研究这些动态图表将为我们提供一些关于社交网络中人际关系的复杂行为的深刻见解。
这些动态图不仅适用于社交网络,还可以应用于其他领域,例如生物医学领域。让我们再看一个生物医学领域的例子,我们可以用动态图的形式来模拟一些生物实体。
蛋白质相互作用
蛋白质对于人类细胞中的大多数生物过程都很重要,如基因表达、细胞生长等等。但是蛋白质很少单独发挥作用,它们往往通过蛋白质-蛋白质相互作用 (PPIs)形成关联,以便在细胞内执行不同的分子过程。这些 PPI 是两个或多个蛋白质分子之间的物理接触,是细胞中发生的生化事件的结果。
这里,节点是编码蛋白质的基因,边是不同蛋白质之间的相互作用。有像 DNA 微阵列这样的实验使我们能够同时研究数千个基因的特性。这些微阵列为我们提供了检测基因的信息,这些基因可能会也可能不会被翻译成蛋白质。
来自微阵列实验的数据可以从几个样本细胞(健康的人类细胞、被冠状病毒感染的细胞等)中产生,并被存储为基因表达数据。这些实验在相同的基因上以规则的时间间隔进行,因此我们从这些基因表达数据中获得了时间信息。
作为动态图的 PPI 网络(来源:作者)
简单来说,我们有一个 T = 0 时的蛋白质相互作用图。我们使用来自基因表达数据的时间信息来识别哪些基因在什么时间点被激活,以便构建动态图。
例如,如果我们的 DNA 微阵列实验在 5 个不同的时间点(0h、3h、6h、9h 和 12h)进行,那么我们将在 5 个时间点得到 PPI 网络的动态图。
动态图的使用
正如我之前提到的,动态图有助于捕捉真实世界实体的复杂行为(比如社会网络中的人类,或者 PPI 网络中的基因编码蛋白质)。我们还将时间维度添加到数据集,以解释一个过程从开始到结束的演变。
为了从动态图数据中提取有价值的信息,我们可以采用机器学习技术。首先,我们需要学习动态图中存在的实体的数字表示,然后我们可以使用图形神经网络等方法来模拟几种用例,如节点分类、链接预测等。
这种图上的一个非常常见的任务是社区检测,这在 PPI 的上下文中被称为复杂检测。基本上,我们使用无监督的机器学习技术,如聚类,来识别每个时间点的重要组。对于 PPI 网络来说,这是有趣的,因为识别重要的蛋白质簇/复合物将导致更好的疾病药物发现。
我们还有一个图形比对任务,我们的目标是识别在不同类型的样品(如健康或受感染的细胞)中显示差异的蛋白质或复合物。这有助于生物学家找到他们在寻找治疗方法时应该关注的蛋白质。
在社交网络的情况下,我们可以使用动态图分析来识别网络中的垃圾邮件发送者(垃圾邮件检测)。动态图的核心思想是相同的,但不同的领域有自己的用例,我们可以使用机器学习模型来满足他们的需求。
使用链接预测,我们可以通过分析网络随时间的增长,向社交网络中的用户推荐朋友。对于 PPIs,我们可以提供一个蛋白质建议列表,这意味着我们希望提出一个具有形成新相互作用潜力的蛋白质列表。
结论
动态图的时间方面捕捉了网络的演变,这使我们能够对几个实体之间复杂的现实生活交互进行建模。存在最先进的机器学习技术,以在动态图的基础上建立预测模型,这具有强大的潜力来推动药物发现、人造肉(基于植物的肉生成)等的研究。
如果你看到了这篇文章的这一部分,感谢你的阅读和关注。我希望你觉得这篇文章内容丰富,并且可以通过 LinkedIn 、 Twitter 或 GitHub 联系到我。
机器学习中的集成方法有哪些?
作者图片
带有备忘单的机器学习集成方法的可视化漫游
背景
假设你搬到了一个新地方,想出去吃饭。你如何找到一个好地方?
解决方案 1: 找一位真正擅长自己工作的美食评论家,看看他/她对你所在地区的餐馆有什么推荐
解决方案 2: 使用谷歌,随机查看一个用户对几家餐馆的评论。
解决方案 3: 使用谷歌,查看多个用户对几家餐馆的评论,然后平均他们的评分。
让我们分析上述每一种解决方案。
解决方案 1:
- 食物评论家通常是非常准确的。
- 很难找到一个美食评论家
- 也许你找到的美食评论家是个严格的素食主义者,而你不是。在那种情况下,美食评论家的推荐将会有偏见。
解决方案 2:
另一方面,在网上随便拿起一个人对一家餐馆的星级评定就是
- 远不如准确
- 更容易找到
解决方案 3:
- 总的来说,它可以是你需要的正确的精确度
- 更容易在网上找到
- 因为给餐馆评分的用户来自不同的背景,所以不存在偏见。
因此,不需要问美食评论家,你只需看看一群随机的(但人数众多的)人的集体意见,就能得到相当不错的餐馆推荐。这就是所谓的 群体智慧 ,是各种信息网站的支柱,如 Quora、Stack-exchange 和 Wikipedia 等。
什么是系综方法?
机器学习中的集成方法集体使用多个弱学习器来预测输出。您不是为数据集训练一个大型/复杂的模型,而是训练多个小型/简单的模型(弱学习者)并聚合它们的输出(以各种方式)来形成您的预测,如下图所示
推论:系综法(图片由作者提供)
集合方法的类型
一般来说,有三种不同类型的集成方法目前常用于 ML
- 制袋材料
- 助推
- 堆垛
这些方法具有相同的 群体智慧 概念,但在细节上有所不同关注什么,使用 t 类型的弱学习者和用于形成最终输出的类型的聚集。
1.制袋材料
在 Bagging(Boot strapAggerating中,多个学困生被并行训练**。对于每一个弱学习者,输入数据是从原始数据集中随机抽样替换并训练的。具有替换的子集的随机采样创建了接近 iid 的样本。在推理过程中,测试输入被提供给所有弱学习者,输出被收集。通过对每个弱学习者的输出进行投票来进行最终预测。**
完整的步骤如下面的框图所示。
集合方法— Bagging(图片由作者提供)
在 bagging 方法中,弱学习者通常属于同一类型。由于替换随机抽样产生 iid 样本,集合 iid 变量不会改变偏差,但会减少方差,因此 bagging 方法不会改变预测中的偏差,但会减少其方差**。**
2.助推
在 boosting 中,多个弱学习者被顺序学习。每个随后的模型通过给予被先前的弱学习者错误分类的数据点更多的重要性来训练。以这种方式,弱学习者可以关注特定的数据点,并且可以共同地减少预测的偏差。完整的步骤如下面的框图所示。****
集成方法—增强(图片由作者提供)
通过对数据集中的所有数据点赋予相等的权重来训练第一个弱学习者。一旦训练了第一个弱学习者,评估每个点的预测误差。基于每个数据点的误差,更新下一个学习者的数据点的相应权重。如果数据点被经过训练的弱学习者正确分类,则减少其权重,否则增加其权重。除了更新权重之外,每个弱学习者还维护一个标量 alpha,该 alpha 量化弱学习者在分类整个训练数据集方面有多好。
随后的模型在这些加权的点集上被训练。对一组加权点进行训练的一种方式是表示误差中的权重项。不使用均方误差,而是使用加权均方误差,以确保具有较高分配权重的数据点在被正确分类时被赋予更大的重要性。另一种方式可以是加权采样,即在训练时基于它们的权重来采样点。
在推理阶段,测试输入被提供给所有的弱学习者,他们的输出被记录下来。如上图所示,在使用弱学习者的输出进行投票之前,通过用相应的弱学习者的权重α缩放每个弱学习者的输出来实现最终预测。
3.堆垛
在堆叠中,多个弱学习者被并行训练,这类似于装袋中发生的情况。但与 bagging 不同,stacking 不执行简单的投票来聚合每个弱学习者的输出,以计算最终的预测。相反,另一个元学习者在弱学习者的输出上被训练,以学习从弱学习者输出到最终预测的映射。完整的框图如下所示。
集合方法—叠加(图片由作者提供)
堆叠通常有不同类型的弱学习者。因此,对所有弱学习者的预测给予同等权重的简单投票方法看起来并不是一个好主意(如果弱学习者在结构上是相同的,它本来会是一个好主意)。这就是元学习者出现的地方。它试图了解哪个弱学习者更重要。
弱学习者是并行训练的,而元学习者是顺序训练的。一旦弱学习者被训练,他们的权重保持不变来训练元学习者。通常,元学习者是在不同于弱学习者的子集上被训练的。
小抄
下面的备忘单涵盖了可能会派上用场的集合方法的主题。
小抄综合方法(来源:http://cheatsheets.aqeel-anwar.com/
摘要
集成方法不是训练一个网络,而是使用多个弱学习者,并聚集他们各自的输出来创建最终的预测。不同集合方法的比较可以在下表中看到。
集成方法的比较(图片由作者提供)
奖金:
可以在下面的链接中找到这个主题和机器学习中许多其他重要主题的紧凑备忘单
****https://medium.com/swlh/cheat-sheets-for-machine-learning-interview-topics-51c2bc2bab4f ****
如果这篇文章对你有帮助,欢迎鼓掌、分享和回复。如果你想了解更多关于机器学习和数据科学的知识,请关注我@Aqeel an war或者在LinkedIn上与我联系。
Python 中的命名元组是什么
Python 中被忽略的扩展数据类型
Sebastian Pociecha 在 Unsplash 上拍摄的照片
介绍
元组是 Python 中最基本和最广泛使用的数据结构之一。大多数人不知道或者通常忘记的是,该语言附带了一个名为 Tuple 的扩展类型,它构建在核心 Tuple 类型之上。
在本文中,我们将探索命名元组——一个很少使用的集合,它增强了标准元组。我们将讨论它们的语法,如何在你的代码中使用它们,最重要的是何时使用。
什么是命名元组以及何时使用它们
字典提供键查找,非常适合我们需要使用助记键名称创建键值数据结构的情况。另一方面,列表和元组是任意对象的有序和可索引的集合。
命名元组位于字典和元组(甚至类!)因为它们便于位置和属性查找。这意味着集合中的对象可以通过它们的键或索引来访问。
“用于创建具有命名字段的元组子类的工厂函数”— Python 文档
命名元组容器数据类型是内置 [**tuple**](https://docs.python.org/3/library/stdtypes.html#tuple)
的替代。这种扩展类型增强了标准元组,因此它们的元素可以通过它们的属性名和位置索引来访问。
在namedtuple
实用程序下的 Python 标准库collections
模块中可以获得命名元组。该类型接受 typename 的名称和与之相关的字段名称作为参数。然后,该实用程序将返回一个新的元组子类,该子类用给定的 typename 命名。
在下面的代码片段中,我们创建了一个名为Employee
的namedtuple
typename,它包含 4 个不同的字段。
为员工创建命名元组
现在我们可以使用生成的namedtuple
typename 来创建对应于雇员的命名元组记录。
使用命名元组类型名创建雇员
注意,只要使用关键字参数,就可以通过以任意顺序传递参数来创建新的 typename 对象,如下所示。
使用关键字参数创建另一个雇员
现在我们可以通过属性或位置来访问命名元组中的元素
通过索引或命名属性访问命名元组中的元素
正如我们所见,命名元组结合了内置元组和字典的特征,甚至结合了 Python 类的特征。在幕后,这是通过创建一个从内置元组类型继承的新类(typename)来实现的。对于每个命名字段,添加一个@property
访问器,将属性名映射到相应的位置。
命名元组是一种扩展和自定义数据类型,它用额外的实用程序丰富了内置元组。在我们需要创建一个可以被元素的位置索引和命名属性访问的数据结构时,它们非常有用。
使用命名元组的更多操作
当转换为字典时,命名元组也可以支持键查找。_as_dict()
方法将返回一个OrderedDict()
,其中键是命名元组的属性。因此,通常的基于键的操作可以在返回的字典上执行。
将命名元组解析为有序字典
此外,命名元组支持解包元组赋值。这意味着可以使用元组赋值将namedtuple
的命名属性解包到相应的变量中。下面显示的代码片段演示了如何将命名属性解包到一个元组中。
解包命名元组的属性
除了可索引,命名元组也是可迭代的。Pyhton 中的 Iterables 实现了__iter__
并返回一个迭代器,该迭代器能够一次返回其成员的一个元素。
遍历命名元组的属性
默认情况下,命名元组还提供了一个可读的__repr__
,它表示元组的类型名及其键值属性:
最后,[typing](https://docs.python.org/3/library/typing.html)
包提供的typing.NamedTuple
是collections.namedtuple
的类型化版本。
namedtuple 的类型化版本
上面显示的类型化版本相当于下面的代码片段:
带有类型提示的完整示例:
最后一句话
尽管命名元组很少使用,但仍然非常强大。这种特殊的扩展数据类型共享来自内置元组、字典甚至类的特征。当我们需要构建可以通过位置索引或属性名访问的数据结构时,命名元组通常很有用。
在本文中,我们讨论了名称元组的用途,并探索了如何创建和访问它们。此外,我们讨论了命名元组的一些操作和特性,如迭代和基于键的查找(当转换为字典时)。
最后要注意的是,命名元组是不可变的,这意味着它们的元素不能就地改变。在下面的文章中,你可以读到更多关于可变和不可变对象类型之间的区别,以及两者如何服务于 Python 的动态类型模型。
什么是后决策状态?他们想从我们这里得到什么?
阐明强化学习中的转移函数和状态-动作对
一个井字游戏完美地展示了后决策状态的概念[作者自己的作品]
以一个经验丰富的强化学习老手的反高潮开始;后决策状态并不新奇或惊天动地。还没点开?很好,因为实际上有一些内容出现了。在本文中,我们将更深入地研究状态-动作对和转移函数的概念,提供从一个问题状态转移到另一个问题状态的过程的洞察力。
转换函数
在强化学习(RL)的最简单表示中,我们有一些概率函数 p(s_t+1|s_t,a_t)
引导我们到新的状态。我们处于状态s_t
,采取行动a_t
,并神奇地以某种概率p
转移到状态s_t+1
。此外,我们可以定义一个集合S’
,它包含所有的结果状态s_t+1
,在给定我们的动作的情况下,这些结果状态可以从我们的当前状态到达。自然地,该集合中所有状态的概率总和应该是 1。
听起来很简单,但是许多有趣的信息隐含在这个看似简单的概率函数中。如果我们的目标是更明确地试图描述从状态s_t
移动到s_t+1
的过程,我们可以称之为转移函数;一些明确的功能f()
引导我们从一种状态到另一种状态。拥有“一些”结果状态S’
并不是非常有用,因此在这一点上引入外部信息变量*ω_t*
*是很好的。*这个变量可以封装任何不在我们控制范围内的信息:骰子上的眼睛数量、明天的降雨量、比特币价格、未来的石油需求……简而言之,*ω_t*
捕捉到了我们转变的不确定性,并可能被视为区间(t,t+1]
中透露的信息。这就是强化学习的内容;我们部分地通过自己的行为来影响回报,部分地预测世界会给我们带来什么。目的是仔细选择我们的行动,这样我们就能在有利的位置上面对未来。
有了我们的外生信息变量ω_t
,我们现在可以尝试定义一个显式的转移函数。设Ω_t
是所有可能变量ω_t
的集合;将这些变量视为场景可能更方便。综上所述:我们从s_t
到s_t+1
的转变取决于当前(预决策)状态s_t
,被选择的动作a_t
和外生信息ω_t
的实现:
转换函数(从一个预决策状态到下一个状态)
决策后状态
到目前为止,一切顺利。现在让我们来讨论一下 Q 值。正如你可能知道的,基于值的 RL 算法学习对应于状态-动作对的值。这些 Q 值——用Q(s_t,a_t)
表示——捕获了我们当前行动的预期下游值。作为复习,看看 SARSA 算法的规范更新公式[2]:
用 SARSA 更新状态-动作对的 Q 值的函数
学习与状态-动作对相关的预期下游值听起来有点抽象,这就是后决策状态 — 在【2】中详细解释的地方——可能会有所启发。我们已经确定我们的转变是部分确定的(由于我们的行动a_t
)和部分随机的(由于ω_t
的随机表现)。为什么不把这两个元素分开,看看会发生什么?
首先,我们引入一个转移函数f^(1)
来从我们当前的预决策状态s_t
转移到后决策状态s_t^a
。请注意,这种转变是完全确定的,并且不需要时间来向前移动,我们可以在选择一个操作的瞬间计算它:
从预决策状态到后决策状态的转换函数
第二,我们有一个转换函数f^(2)
从决策后状态s_t^a
移动到下一个决策前状态s_t+1
。这个函数是完全随机的;完全取决于ω_t
的实现。根据定义,我们的动作是基于状态s_t
中嵌入的信息,因此,新信息ω_t
必须在采取动作后到达*。因此,第二个转换函数意味着时间的流逝,在此期间新的信息被揭示:*
从决策后状态到下一个决策前状态的转换函数
所以现在我们有两个转移函数,而不是一个。这看起来没什么进步,但是请耐心听我说。
井字游戏
有什么比用一个老式的井字游戏更好的方式来说明一个概念呢?让我们考虑一下游戏开始时的状态。决策前状态s_0
显然是一个空棋盘,而我们有九个可行的动作a_0(s_0)
,因此可能达到九个决策后状态s_0^a
(注意这相当于评估九个状态-动作对)。
决策前状态(左窗格),九个可达到的决策后状态(右窗格)[作者自己的作品]
为了真正达到决策后状态,我们必须选择一个动作并填写f^(1)(s_t,a_t)
。为了达到随后的预决策状态,我们必须等待——从我们的角度来看是外生的——对手的移动并填入f^(2)(s_t^a,ω_t)
第一个动作后的决策后状态(左窗格)和对手动作后的下一个决策前状态(右窗格)[作者自己的作品]
再举个例子?我们已经接近比赛的尾声了。我们有三个要考虑的行动,或者说,在上下文中,有三个可达到的决策后状态要评估。假设我们已经有了一些观察结果,我们可以知道两个后决策状态可能会产生很差的结果。
游戏接近尾声时可达到的决策后状态的可视化[作者自己的作品]
现在很容易看出价值函数Q(s,a)
和Q(s^a)
非常相似。后决策状态的关键是关于未来的确定性和随机性知识的综合分离。决策后状态提供了比决策前状态更多的最新信息,明确地捕获了最新的系统状态,而没有实际地及时向前移动。
特征设计
对于井字游戏来说,所有这些可能看起来有点做作,但是当我们为更现实的 RL 问题设计功能时,根据决策后状态进行思考的好处变得更加明显。通常,将这些特征建立在我们拥有的最新信息的基础上是有意义的。
假设我们有一个仓库,里面有一千种不同的商品,每种商品的数量反映在一个大的向量中(即状态)。根据预期的当前库存水平,我们决定(即行动)订购一定数量的每种商品。我们的决策后状态将是当前库存水平加上订单水平。这个更新的水平预测了,例如,预期的存储成本、过期库存和满足未来需求的能力——简而言之,预期的下游价值。因此,如果我们计算任何特征(例如所有项目的总体积、快速移动项目的数量),我们是基于决策后向量来这样做的。实际上,这里的后决策向量是状态向量和动作向量的简单相加。从后决策到下一状态的转换减去ω_t
的随机实现:
有 10 种产品类型的库存的转移函数示例。在左边的 f^(1),通过向现有库存添加新订单,从 s_t 过渡到 s_t^a
。右边的 f^(2),从s_t^a to s_t+1 by subtracting stochastic demand.
过渡
观察s_t^a
是我们确定满足未来需求能力的最佳预测器。因此,当基于状态计算特性时,我们可能会利用某个函数ϕ_f:s_t^a↦θ_f
(其中函数可以是神经网络,而s_t^a
是输入向量)。当然,ϕ_f:(s_t,a_t)↦θ_f
可能有完全相同的意思,但前者肯定更明确。正如 Python 的禅宗所说:
“显性比隐性好”
外卖食品
- 决策后状态与状态-动作对密切相关,但是提供了关于信息可用性的更明确的观点。具体地说,它们体现了将状态-动作对转换成单个信息变量。
- 我们将传统的转移函数分成两个部分,清晰地区分在单个时间点的确定性转移(基于选定的动作)和随着时间推移的随机转移(基于环境)。
- 从决策后状态的角度思考通常有利于特征设计,因为我们希望特征基于我们最近的信息。
本文关注状态-动作对和决策后状态之间的相似性。对差异感兴趣吗?请查看:
参考
[1]萨顿和巴尔托(2018 年)。强化学习:简介。麻省理工出版社。
[2]鲍威尔(2007 年)。近似动态规划:解决维数灾难。约翰·威利&的儿子们。
RMSE 和梅是什么?
评估指标的简单指南
均方根误差(RMSE)和平均绝对误差(MAE)是用于评估回归模型的指标。这些指标告诉我们我们的预测有多准确,以及与实际值的偏差有多大。
帕特丽夏·塞尔纳在 Unsplash 上的照片
从技术上来说,RMSE 是 E 错误的 S 方的 R oot,而 MAE 是Ab 错误的 M ean。在这里,误差是一个变量的预测值(由我们的回归模型预测的值)和实际值之间的差异。它们的计算方法如下:
仔细观察,你会发现两者都是误差的平均值。
我们用一个例子来理解这个。比如说,我想根据经验的年数来预测一个数据科学家的工资。所以,工资是我的目标变量(Y),经验是自变量(X)。我有一些关于 X 和 Y 的随机数据,我们将使用线性回归来预测工资。让我们使用熊猫和 scikit-lear n 进行数据加载和创建线性模型。
import pandas as pd
from sklearn.linear_model import LinearRegressionsal_data={"Exp":[2,2.2, 2.8, 4, 7, 8, 11, 12, 21, 25],
"Salary": [7, 8, 11, 15, 22, 29, 37 ,45.7, 49, 52]}#Load data into a pandas Dataframe
df=pd.DataFrame(sal_data)
df.head(3)
#Selecting X and y variablesX=df[['Experience']]
y=df.Salary#Creating a Simple Linear Regression Model to predict salarieslm=LinearRegression()
lm.fit(X,y)#Prediction of salaries by the model
yp=lm.predict(X)
print(yp)[12.23965934 12.64846842 13.87489568 16.32775018 22.45988645 24.50393187 30.63606813 32.68011355 51.07652234 59.25270403]
现在,我们有了“yp”——我们的工资预测数组,我们将通过绘制预测工资(yp)和实际工资(y)来评估我们的模型。我正在用 bohek 进行我的可视化。
from bokeh.plotting import figure, show, output_filep=figure(title="Actual vs Predicted Salary", width=450, height=300)
p.title.align = 'center'
p.circle(df.Exp, df.Salary)
p.line(df.Exp, df.Salary, legend_label='Actual Salary', line_width=3, line_alpha=0.4)
p.circle(df.Exp, yp, color="red")
p.line(df.Exp,yp, color="red",legend_label='Predicted Salary', line_width=3, line_alpha=0.4)p.xaxis.axis_label = 'Experience'
p.yaxis.axis_label = 'Salary'show(p)
从上图中,我们看到预测数据点和实际数据点之间存在差距。在统计学上,这种差距/差异被称为残差,通常被称为误差,用于 RMSE 和 MAE。Scikit-learn 提供了度量库来计算这些值。然而,我们将通过使用上面的数学表达式来计算 RMSE 和 MAE。这两种方法会给你同样的结果。
import numpy as np
print(f'Residuals: {y-yp}')
np.sqrt(np.mean(np.square(y-yp))) #RMSEnp.mean(abs(y-yp)) #MAE#RMSE/MAE computation using sklearn library
from sklearn.metrics import mean_squared_error, mean_absolute_errornp.sqrt(mean_squared_error(y, yp))
mean_absolute_error(y, yp)**6.48
5.68**
这是我们的基线模型。MAE 约为 5.7——似乎更高。现在我们的目标是通过减少这个误差来改进这个模型。
让我们用同样的模型对“experience”(X)进行多项式变换,看看我们的误差是否减少了。
from sklearn.preprocessing import PolynomialFeatures
pf=PolynomialFeatures() #Linear Equation of degree 2
X_poly=pf.fit_transform(X) lm.fit(X_poly, y)
yp=lm.predict(X_poly)
我已经使用 Scikit-learn 多项式特性创建了一个 1、X 和 X2 的矩阵,并将其作为输入传递给我的模型。
计算我们的误差指标和…
#RMSE and MAE
np.sqrt(np.mean(np.square(y-yp)))
np.mean(abs(y-yp))**2.3974
1.6386**
瞧……他们这次低多了。它比我们的基线模型更适合!让我们画出 y 和 yp(就像我们之前做的那样)来检查重叠部分。
两条线之间的间隙已经减小。让我们使用 seaborn 的残差绘图函数来观察残差或误差(y-yp)的分布
print(y-yp) #residuals
[ 0.333921 0.447306 0.84028668 -0.136044 -4.190238 -0.434767
-0.847751 5.488121 -2.584481 1.083648]import seaborn as sns
sns.residplot(y, yp)
plt.show()
我们看到残差往往集中在 x 轴周围,这是有意义的,因为它们可以忽略不计。
还有第三个指标——R 平方得分,通常用于回归模型。这衡量了我们的模型可以解释的变化量,即我们的模型返回的正确预测的百分比。它也被称为决定系数,通过以下公式计算:
让我们使用公式和 sklearn 库来计算 R2,并比较这些值。这两种方法应该给你相同的结果。
#Calculating R-Squared manually
a=sum(np.square(y-yp)) # a -> sum of square of residuals
b=sum(np.square(y-np.mean(y))) # b -> total sum of sqauresr2_value = 1-(a/b)
**0.979**#calculating r2 using sklearn
from sklearn.metrics import r2_score
print(r2_score(y, yp))
**0.979**
因此,总的来说,我们可以认为 98%的模型预测是正确的,误差的变化在 2 个单位左右。对于一个理想的模型,RMSE/梅=0,R2 分数= 1,所有的剩余点都在 X 轴上。对于任何业务解决方案来说,实现这样的价值几乎是不可能的!
我们可以用来提高模型准确性的一些技术包括:
- 变换/缩放功能
- 处理异常值(如果有)
- 添加新功能/功能工程
- 使用不同的算法
- 模型超参数调谐
在我的下一篇文章中,我将详细解释上面的一些概念。以上代码可以参考我的笔记本这里。
机器学习接下来要应对的最激动人心的挑战是什么?
随着机器学习和人工智能研究每天都在大步前进,人们常常会觉得该领域所有酷的创新前沿都已经有人问津了。如果你刚刚开始,尤其如此。本周,我们想提醒你(和我们自己)在这些领域还有多少需要学习、成长和提高的地方。如果你需要一点鼓励来继续下去,或者需要一点灵感来帮助你开始下一个项目,那就来吧!
- 熟悉三个有前途的机器学习挑战 。是的,大型语言模型和计算机视觉比我们几年前想象的还要强大。但是,正如 Vincent Vanhoucke 在他最近的帖子中明确指出的,仍然有很多事情要做。从逆向视频游戏问题到强化学习的下一阶段,文森特介绍了他认为该领域在未来几个月和几年将关注的三个方向。
- 探索利用 ML 和 NLP 支持心理健康服务提供者的新途径 。新冠肺炎让心理健康专家的工作变得比以往更加艰难:越来越多的人正经历焦虑和压力,人与人之间的联系更难(如果不是不可能的话)规划。 Tiffany Meshkat 和她在危机短信热线的同事使用自然语言处理方法来分析青少年的短信,使他们能够筛选和分类联系的人,并检测他们提出的问题的模式。
塞巴斯蒂安·佩纳·兰巴里在 Unsplash 上拍摄的照片
- 了解开放式强化学习的未来 。强化学习是人工智能的一个分支,在这个分支中,一个受奖励激励的代理人的任务是弄清楚一个环境及其规则。近年来,强化学习取得了令人印象深刻的进展。在 TDS 播客的最近一集里, Jeremie Harris 和他的嘉宾,DeepMind 的 Max Jaderberg,讨论了接下来会发生什么,以及人工智能代理如何很快能够赢得他们从未遇到过的游戏。
- 阅读可能彻底改变微生物分析的新研究 。使用深度学习方法, Sylwia Majchrowska 和jaros aw paw owski试图从根本上减少在培养皿中识别和计数微生物所需的时间。他们的帖子向我们介绍了他们的过程,分享了他们的结果,并指出进一步发展这种方法的前景。
- 探讨可持续深度学习模型的问题 。庞大的模型带来了巨大的成本——包括财务成本和环境成本。英特尔实验室的加迪·辛格在他的最新文章中,反思了持续科技进步带来的挑战。Gadi 建议公司和从业者专注于“分层访问结构”,这种结构可以让我们“增加能力,改善人工智能技术的成果,同时最大限度地降低功耗和系统成本。”
- 给你的数据科学工具包 添加哈希。如果本周你想获得更多的实践技巧,我们不会让你空手而归!Konstantin Kutzkov 的指南讨论了用于设计特定于数据的哈希函数的机器学习技术,并带您浏览了它们的应用。尽情享受吧!
如果你在本周的工作中遇到了新的令人兴奋的事情,我们很乐意听到它——留下评论,或者更好的是:写一篇关于它的帖子。感谢您一如既往地支持我们作者的工作。
直到下一个变量,
TDS 编辑
我们策划主题的最新内容:
入门
实践教程
- UMAP 降维——一种非常健壮的机器学习算法作者索尔·多比拉斯
- 由 Jamshaid Shahir 为口袋妖怪钻石璀璨和珍珠闪耀确定最佳口袋妖怪团队
- API 通过约翰·克莱门茨与 R 交互
- 你应该知道的时间序列预测误差指标作者康斯坦丁·林克
深潜
思想和理论
- 为什么斐波纳契数列的封闭形式不在竞技编程中使用?作者罗希特·潘迪
- Divya Gopinath和 David kuro kawa 的 ML 模型的 Shapley 值
- 处理生产环境中的泄漏、缺失数据作者 Sam Wilson
- 受限语言模型的力量作者卡雷尔·德·奥斯特林克
数据科学工作最受欢迎的技能是什么?求一个图形数据库!
通过用 TigerGraph、实际工作数据和 Kaggle API 构建 Indeed.com 工作图来寻找下一份工作
概观
图表无处不在,可以帮很多忙,包括找工作。像 LinkedIn 这样的平台由图表数据库驱动,帮助向你推荐工作。在这篇博客中,我们将创建一个可以帮助你回答一些问题的图表,比如什么技能最适合我想要的工作和工资范围。让我们构建图表,然后回答图表上的一些问题。
第一部分:在 TigerGraph 云上创建解决方案
首先,您需要在 TigerGraph Cloud 上创建一个解决方案。关注本博客了解更多详情:
https://www.tigergraph.com/blog/getting-started-with-tigergraph-3-0/
简而言之,您需要:
- 导航到https://tgcloud.io/.
- 单击“我的解决方案”选项卡。
- 点击右上角的蓝色“创建解决方案”按钮。
- 在第一页按“空白”。
- 不要更改第二页中的任何内容,然后按下一步。
- 根据您的详细信息定制第三页。
- 提交您的解决方案,等待它被创建。
第二部分:创建图表模式
现在让我们去 https://colab.research.google.com/的创建一个新的 Colab 笔记本。创建之后,让我们连接到图表,然后创建图表模式,这有点像我们将如何加载数据的地图。
步骤 1:连接到您的解决方案
首先,让我们安装并导入 pyTigerGraph。
!pip install pyTigerGraphimport pyTigerGraph as tg
接下来,让我们创建一个 TigerGraphConnection,将我们连接到我们刚刚创建的 TG 云解决方案。
注意:用您在第一部分中分配的子域和密码替换子域和密码。
conn = tg.TigerGraphConnection(host="https://SUBDOMAIN.i.tgcloud.io/", password="PASSWORD")
一旦运行,您就可以开始了!
第二步:创建您的模式和图表
现在我们已经连接到我们的解决方案,让我们创建一个新的图表,我们的 JobGraph。为此,我们将有六个顶点(工作、工作类型、职称、工资范围、公司和技能)和六条边。
print(conn.gsql('''CREATE VERTEX Job_Option(PRIMARY_ID job_id INT, job_link STRING, num_skills INT, num_reviews DOUBLE, num_stars DOUBLE)
CREATE VERTEX Job_Type(PRIMARY_ID job_type_id STRING) WITH PRIMARY_ID_AS_ATTRIBUTE="true"
CREATE VERTEX Job_Title(PRIMARY_ID job_title_id STRING) WITH PRIMARY_ID_AS_ATTRIBUTE="true"
CREATE VERTEX Salary_Range(PRIMARY_ID salary_range STRING) WITH PRIMARY_ID_AS_ATTRIBUTE="true"
CREATE VERTEX Company(PRIMARY_ID company_name STRING) WITH PRIMARY_ID_AS_ATTRIBUTE="true"
CREATE VERTEX Skill(PRIMARY_ID skill STRING) WITH PRIMARY_ID_AS_ATTRIBUTE="true"CREATE UNDIRECTED EDGE JOB_OPTION_JOB_TYPE(FROM Job_Option, TO Job_Type)
CREATE UNDIRECTED EDGE JOB_OPTION_JOB_TITLE(FROM Job_Option, TO Job_Title)
CREATE UNDIRECTED EDGE JOB_TYPE_JOB_TITLE(FROM Job_Type, TO Job_Title)
CREATE UNDIRECTED EDGE JOB_OPTION_SALARY_RANGE(FROM Job_Option, To Salary_Range)
CREATE UNDIRECTED EDGE JOB_OPTION_COMPANY(FROM Job_Option, To Company)
CREATE UNDIRECTED EDGE JOB_OPTION_SKILL(FROM Job_Option, To Skill)'''))
一旦你创建了顶点和边,把它们放在一起形成一个图,我们称之为 JobGraph。
print(conn.gsql('''CREATE GRAPH JobGraph(Job_Option, Job_Type, Job_Title, Salary_Range, Company, Skill,JOB_OPTION_JOB_TYPE, JOB_OPTION_JOB_TITLE, JOB_TYPE_JOB_TITLE, JOB_OPTION_SALARY_RANGE, JOB_OPTION_COMPANY, JOB_OPTION_SKILL)'''))
完美!通过按 Actions 和 GraphStudio 下的四个方块导航到 GraphStudio。
转到动作下的四个框,然后按“GraphStudio”(作者图片)
点击侧边栏中的“设计模式”。在那里,您将看到刚刚创建的模式!
查看 GraphStudio 中的模式(图片由作者提供)
第三步:更新你的图名和令牌
太棒了,我们快完成了!在加载数据和运行查询之前,让我们更新连接凭证。
conn.graphname = "JobGraph"conn.apiToken = conn.getToken(conn.createSecret())
完美!现在让我们输入数据。
第三部分:加载您的数据
第一步:创建一个 Kaggle 令牌
我们将从位于这里的 Kaggle 的 Indeed dataset 中获取数据。该数据包含数据科学家、数据分析师和数据工程师的工作信息。
https://www.kaggle.com/elroyggj/indeed-dataset-data-scientistanalystengineer
首先,在 kaggle.com 上创建一个帐户。
接下来,在主页中单击您的个人资料图片。在打开的边栏中,按下“帐户”
按下你的个人资料表,然后选择“帐户”(作者图片)
向下滚动页面,然后在 API 下,按“API 令牌过期”这将使任何现有的 API 过期。
按“过期 API 令牌”
接下来,按“创建新的 API 令牌”,它将自动下载您的令牌作为 kaggle.json。
按“创建新的 API 令牌”将下载“kaggle.json”(图片由作者提供)
完美!现在您已经有了 API 令牌,让我们在笔记本中加载数据。
第二步:从 Kaggle 加载数据
首先,您需要安装 Kaggle 库。
!pip install -q kaggle
接下来,让 Colab 提示您上传一个文件。上传刚刚下载的 kaggle.json 文件。
from google.colab import filesfiles.upload()
太棒了。现在让我们创建 Kaggle 文件夹并使其可访问,然后下载数据。我们将它存储在一个名为 data 的文件夹中。
! mkdir ~/.kaggle
! cp kaggle.json ~/.kaggle/
! chmod 600 ~/.kaggle/kaggle.json
! kaggle datasets list! kaggle datasets download -d elroyggj/indeed-dataset-data-scientistanalystengineer
! unzip indeed-dataset-data-scientistanalystengineer.zip -d data
! ls data
从结果来看!ls 数据,你会发现两个文件。有我们数据的文件是 indeed_job_dataset.csv(在 data 的目录下,所以 data/indeed_job_dataset.csv)。
ls 的结果(图片由作者提供)
太好了!现在让我们将数据加载到图表中。
第二步:将数据插入图表
让我们使用 pandas 创建一个 indeed_job_dataset.csv 的数据框架。
import pandas as pddata = pd.read_csv("data/indeed_job_dataset.csv")
接下来,让我们编辑一些列值和名称,以确保一切都可以向上插入。
data["id_val"] = [val for val in data["Unnamed: 0"]]
data = data.drop("Unnamed: 0", 1)data["Company"] = ["No Company Found" if type(i) != str else i for i in data["Company"]]
完美!现在我们的数据已经准备好了,让我们向上插入所有的顶点和边。
conn.upsertVertexDataFrame(data, "Job_Type", "Job_Type", attributes={"job_type_id": "Job_Type"})
conn.upsertVertexDataFrame(data, "Job_Title", "Job_Title", attributes={"job_title_id": "Job_Title"})
conn.upsertVertexDataFrame(data, "Salary_Range", "Queried_Salary", attributes={"salary_range": "Queried_Salary"})
conn.upsertVertexDataFrame(data, "Company", "Company", attributes={"company_name": "Company"})conn.upsertEdgeDataFrame(data, "Job_Option", "JOB_OPTION_SALARY_RANGE", "Salary_Range", "Job_Type", "Queried_Salary", attributes={})
conn.upsertEdgeDataFrame(data, "Job_Option", "JOB_OPTION_COMPANY", "Company", "Job_Type", "Job_Title", attributes={})
conn.upsertEdgeDataFrame(data, "Job_Type", "JOB_TYPE_JOB_TITLE", "Job_Title", "Job_Type", "Job_Title", attributes={})
conn.upsertEdgeDataFrame(data, "Job_Option", "JOB_OPTION_JOB_TITLE", "Job_Title", "id", "Job_Title", attributes={})
conn.upsertEdgeDataFrame(data, "Job_Option", "JOB_OPTION_JOB_TYPE", "Job_Type", "id", "Job_Type", attributes={})
由于“Skills”是数据帧中的一个列表,我们将分别向上插入每个顶点和边,而不是通过数据帧。运行此代码块以加载技能:
for job in range(len(data["Skill"])):
if type(data["Skill"][job]) == str:
for skill in eval(data["Skill"][job]):
conn.upsertVertex("Skill", skill, attributes={"skill": skill})
conn.upsertEdge("Job_Option", job, "JOB_OPTION_SKILL", "Skill", skill)
之后,我们将所有数据加载到我们的图表中!现在我们的图表已经准备好了,让我们开始查询我们的数据,从标题中提出问题。
第四部分:编写查询
问题 1:总体而言,什么是最受欢迎的技能(对于数据科学家、数据分析师和数据工程师而言)?
首先,我们来找最热门的整体技能。
conn.gsql('''USE GRAPH JobGraphDROP QUERY topSkillsCREATE QUERY topSkills () FOR GRAPH JobGraph {SumAccum<INT> @connectedJobs;Seed = {Job_Option.*};Res = SELECT tgt FROM Seed:s - (JOB_OPTION_SKILL:e) - Skill:tgt
ACCUM tgt.@connectedJobs+=1
ORDER BY tgt.@connectedJobs DESC
LIMIT 5;PRINT Res;}INSTALL QUERY topSkills''')
结果如下:
[
{
"Res": [
{
"attributes": {
"[@connectedJobs](http://twitter.com/connectedJobs)": 466,
"skill": "Python"
},
"v_id": "Python",
"v_type": "Skill"
},
{
"attributes": {
"[@connectedJobs](http://twitter.com/connectedJobs)": 434,
"skill": "Machine Learning"
},
"v_id": "Machine Learning",
"v_type": "Skill"
},
{
"attributes": {
"[@connectedJobs](http://twitter.com/connectedJobs)": 417,
"skill": "R"
},
"v_id": "R",
"v_type": "Skill"
},
{
"attributes": {
"[@connectedJobs](http://twitter.com/connectedJobs)": 351,
"skill": "SQL"
},
"v_id": "SQL",
"v_type": "Skill"
},
{
"attributes": {
"[@connectedJobs](http://twitter.com/connectedJobs)": 203,
"skill": "Data Mining"
},
"v_id": "Data Mining",
"v_type": "Skill"
}
]
}
]
因此,总而言之,最受欢迎的技能是:
- 计算机编程语言
- 机器学习
- 稀有
- 结构化查询语言
- 数据挖掘
完美!我们可以编写更多的查询来继续探索,但是我们现在已经回答了我们的主要问题。
第五部分:祝贺你!
恭喜你完成这篇博客!在这里,您了解了如何创建一个职位图来确定与数据相关的职位的主要技能。
如果您有任何问题,请随时加入 TigerGraph Discord 或在 TigerGraph 社区论坛中提问。
https://community.tigergraph.com/
流行的解释方法有哪些?
图片作者(艾瑞泽艾)
欢迎来到“切片”,这是一个新的博客系列,解释了 ML 概念的本质
与Amber Roberts合作撰写,ML 销售工程师 at Arize AI
机器学习(ML)的采用导致了一系列人工智能(AI)应用,这些应用涉及语言处理、计算机视觉、无监督学习甚至自治系统等不断增长的领域。
随着模型复杂性的增加,反思和理解模型为什么做出特定预测的能力变得越来越困难。它也变得越来越重要,因为 ML 模型做出的预测越来越影响我们生活的重要方面——从房屋贷款申请的结果到工作面试、医疗或甚至监禁决定。
可解释性是一种技术,旨在确定哪个模型特征或特征组合导致了特定的模型决策。比如一个模特是不是因为眼睛而认定某个动物具体是拉布拉多犬?鼻子?耳朵?还是各种各样的组合?
图像信用:用 LIME 进行图像分类的可解释机器学习
机器学习模型可能会根据看似不合理的解释给出答案。为了理解为什么给出一个推论,使用了可解释的方法。这允许模型构建者以更有目的和更程序化的方式改进模型,以产生期望的结果或调整标准。然而,值得注意的是,可解释性并没有解释模型是如何工作的——相反,它提供了一个解释人类可以理解的反应的基本原理。
这篇文章的目标是强调不同的可解释方法,并演示如何将它们合并到流行的 ML 用例中。
解释可解释的人工智能
在机器学习领域,深度学习模型用于进行复杂的预测和决策。这些高级模型为各种领域产生了令人难以置信的发现,然而,由于其内部工作的不透明性,它们被戏称为“黑盒”。因此,对于工程师来说,追溯一个预测的根本原因是非常困难的,这就是 ML 可解释性方法和技术发挥作用的地方。
在基于一组特征预测房价的情况下,可解释性对各种特征(平方英尺、卧室数量、邮政编码、最后销售价格等)的重要性进行分类和标准化。)到房屋销售价格的预测。
模型可解释性示例图像由作者(阿里泽艾)
ML 可解释性有哪些不同的方法?
基于用例和环境,团队可以使用不同的方法来解释。这些通常由以下因素驱动:
- 模型类型:神经网络、树、基于图像或基于语言
- 无论您的团队是否可以直接访问模型
- 速度与精度的权衡
- 计算成本
- 全局和局部特征重要性
- 人工智能治理、风险管理和合规需求
TL;博士: 可解释性是工具箱中的一个工具,帮助团队理解他们的模型所做的决策,以及这些决策对他们的客户/用户以及他们公司底线的影响。这本身就是一种近似,没有“完美”的解释者——每种方法都有一个权衡。
在快速概述了 SHAP 和莱姆之后,我们将把重点放在特定模型和模型竞争的可解释性技术。
什么是 SHAP?
SHAP(**Shapley Additive explations)**是一种用于分解复杂模型的单个预测的方法。SHAP 的目的是计算每个特征对预测的贡献,以便识别每个输入的影响。SHAP 解释技术使用植根于合作联盟博弈论的原理来计算沙普利值。就像合作博弈理论最初看起来如何识别玩家群体之间的合作(“联盟”)如何有助于联盟整体的收益一样,同样的技术也用于 ML 中来计算特征如何有助于模型的结果。在博弈论中,某些玩家对结果的贡献更大,而在机器学习中,某些特征对模型的预测贡献更大,因此具有更高的特征重要性。
在人工智能领域,这些复杂的模型极大地受益于一种经过验证的方法,这种方法能够为非线性模型提供预测。Shapley 值是所有可能联盟的所有边际贡献的平均值。数据实例的特征值作为联盟成员运行。Shapley 值的解释是以一种附加方法的形式来表达的,以归因于一个线性模型。SHAP 值不仅揭示了特征的相关性,还揭示了特征对预测的积极影响还是消极影响。在下面的欺诈模型示例中,特征“目的”和“贷款金额”不成比例地帮助确定模型是否预测欺诈。
图片由作者提供(Arize AI) | 在 ML 监控和可观察性平台中使用可解释性:SHAP 特征重要性,以平均绝对 Shapley 值度量
值得注意的是,基于内核的 SHAP 也有扰动,但这些都是基于背景或参考数据集。建立线性模型以基于扰动提取 Shapley 值。
什么是石灰?
LIME,或 局部可解释模型不可知解释 ,是一种通过用每个预测的可解释模型近似“黑盒”来提供局部 ML 解释的技术。这些局部模型是通过理解模型输入中的扰动如何影响模型的最终预测而创建的。
LIME 试图通过训练一个更易解释的模型(如线性模型)来了解特定示例的特征与模型预测之间的关系,该模型具有从原始输入的微小变化中导出的示例。在训练结束时,可以从线性模型学习到高于特定阈值的系数的特征中找到解释(在考虑一些归一化之后)。这背后的直觉是,线性模型发现这些特征在解释模型的预测中最为重要,因此对于此局部示例,您可以推断每个特征在解释模型所做预测中的作用。
假设您有一个黑盒模型,您只能访问推理数据和相应的模型预测,而不能访问初始训练数据。LIME 创建了一个新的数据集,由扰动的样本及其相应的黑盒模型预测组成。
在这个新的数据集上,LIME 训练了一个可解释的模型,该模型通过采样实例与感兴趣实例的接近度来加权。可训练模型应该是机器学习模型预测的局部良好近似,但不一定是良好的全局拟合。
LIME 可用于表格、图像或文本数据集。下面的一碗面包的例子有谷歌的 Inception V3 神经网络对图像分类的前两类(百吉饼,草莓)的石灰解释。对“百吉饼”的预测和解释非常合理,即使预测是错误的——显然没有百吉饼,因为中间的洞不见了。
图片来源:克里斯托夫·莫尔纳尔
选择 SHAP 还是莱姆:特征重要性与价值归属
SHAP 的可解释性方法旨在将一个结果——比如说,一个房价预测——归因于一个可测量的特征组合。我们认为这是一个模型的输出对一组输入的统计属性。例如,在 243 万美元的总房价预测中,房子的 4100 平方英尺贡献了 110 万美元。
LIME 方法生成了一组特征重要性,但是没有将这些特征重要性与模型输出的确切属性联系起来。例如,LIME 无法告诉您所贡献的平方英尺对预测房价的确切金额,但它可以告诉您该预测最重要的一个或多个要素。
TL;博士: 行业中的 ML 团队经常同时使用 SHAP 和 LIME,但是他们使用 LIME 来获得单个预测的更好解释,使用 SHAP 来理解整个模型以及特性依赖。
就计算时间和成本而言,LIME 比 SHAP 快。然而,虽然 Shapley 值需要很长时间来计算,但 SHAP 使计算全球模型解释所需的许多 Shapley 值成为可能。LIME 对于表格、文本和图像数据仍然很有用,尤其是在使用未解释的函数对模型进行训练的情况下。也就是说,由于 LIME 用一个更易解释的模型来近似这些模型,所以在 LIME 的复杂性和 LIME 的可信度之间有一个折衷。
模型类型不可知和模型类型特定的可解释方法
特定于模型的方法通过探索和访问模型的内部来工作,例如解释线性模型中的回归系数权重或 P 值,或者计算某个特征在系综树模型中使用的次数。
模型不可知的方法调查训练模型的 I/O 对之间的关系。它们不依赖于模型的内部结构。当没有理论或其他机制来解释模型中发生的事情时,这些方法是有用的。
特定型号
什么是 TreeSHAP?
树 SHAP 的图片作者(阿里泽艾)
TreeSHAP 是一个快速解释器,用于分析 Shap python 库中的决策树模型。TreeSHAP 是为基于树的机器学习模型设计的,如决策树、随机森林和梯度提升树。TreeSHAP 是作为 KernelSHAP 的快速、特定于型号的替代产品提供的。然而,它有时会产生不直观的特征属性。
鉴于 XGBoost 的流行,TreeSHAP 是各种团队大量使用的解释器方法。树解释器利用树算法的结构来提取和生成 SHAP 值,比内核解释器快得多。
TL;DR: 如果你有 XGBoost 或者 LightGBM,TreeSHAP 是一个很好的快速解释器。
TreeSHAP 以多项式时间计算,而不是指数时间。基本思想是同时沿着树向下移动所有可能的子集。要计算单树预测,您需要跟踪每个决策节点中子集的数量。这取决于父节点的子集和 split 函数。
神经网络:深层解释器
上图描述了深度解释器(深度 SHAP)的工作。图片作者(艾瑞泽艾)
TL;DR:深度解释器 (深度 SHAP)是一种可解释的技术,可用于基于神经网络架构的模型。这是最快的神经网络解释方法,并且基于运行原始 深度提升算法 的基于 SHAP 的版本。
利用 SHAP 值来解释深度学习模型(神经网络)预测的一种流行方法是使用方法 DeepExplainer。DeepExplainer 运行在深度学习框架上,通过使用 DeepLIFT 和 Shapley 值为神经网络模型添加可解释性。DeepExplainer 是 DeepLIFT (深度学习重要特征)的增强版,这是一种通过反向传播网络中所有神经元对输入的每个特征的贡献来分解神经网络对特定输入的输出预测的方法。
Lundberg 和 Lee,NIPS 2017 表明,可以选择 DeepLIFT 中的每节点属性规则来逼近 Shapley 值。通过对许多背景样本进行积分,DeepExplainer(深度 SHAP)估计近似的 SHAP 值,使得它们总计为传递的背景样本上的预期模型输出和当前模型输出之间的差(f(x)-E[f(x)]。
神经网络:期望梯度和综合梯度
预期梯度和综合梯度都是可解释的技术,可用于神经网络模型。
TL;DR: 期望梯度是一种对可微分模型有用的快速解释技术;它提供了不同于深度解释器的近似,并且比深度解释器慢。综合成分法是一种古老的地方方法,有助于解释每一个单独的预测。
预期梯度是一种对可微分模型有用的快速解释技术。你可以把期望梯度看作是基于 SHAP 的集成梯度,一种更古老的可解释技术。它将 Shapley 博弈论方法扩展到了构成要素,因此特征属性的输出总和等于输出。
集成梯度是一种将分类模型的预测归因于输入特征的技术。它可用于可视化输入要素和模型预测之间的关系。这是一种局部方法,有助于解释每个单独的预测。例如,在时尚 MNIST 数据集中,如果我们获取一只鞋的图像,那么正属性是图像的像素,其对将图像分类为鞋的模型产生积极影响。积分梯度法主要用于识别模型中的误差,其中可以进行校正以提高模型的精度。
线性回归:线性 SHAP
线性 SHAP 是一种为线性回归模型设计的可解释方法。它是特定型号的,速度很快。
线性回归模型将目标预测为其输入的加权和。学习到的关系的线性有助于解释。统计学家、计算机科学家和其他涉及定量问题的人长期以来一直使用线性回归模型。
模型类型不可知
KernelSHAP 是什么?
内核 SHAP —输入的缓慢迭代|作者图片( Arize AI )
KernelSHAP 是一种缓慢的、基于扰动的 Shapley 方法,理论上适用于所有类型的模型,但很少被野外的团队使用(至少在生产中)。
TL;DR: KernelSHAP 往往太慢,除了小数据之外,无法在实践中广泛使用。这也容易在团队中引起混乱。当团队抱怨 SHAP 慢时,通常是因为他们测试了 KernelSHAP。
KernelSHAP 通过计算每个特征值对实例“x”的预测的贡献来工作。KernelSHAP 由五个步骤组成:检查联盟,获得每个联盟的预测,使用核 SHAP 计算每个联盟的权重,创建加权线性模型并返回 Shapley 值“k”,即线性模型的系数。
什么是代理模型?
代理模型的工作,由 Arize AI 提供
代理模型是一种可解释的方法,旨在根据实际模型的预测构建透明模型。模型是与模型数据并行构建的。当感兴趣的结果不容易直接测量时,使用它,因此使用结果的模型来代替。
TL; 如果没有原始模型提取 SHAP,代理模型很有用;您可以构建模型决策的代理。对于监管用例来说,它不太理想,因为它高度依赖于模型看到的数据。
什么是个体条件期望(ICE)?
单个条件解释(ICE)图将每个实例可视化一行,以显示当特征发生变化时,实例的预测如何变化。
虽然 ICE 曲线可以揭示不同的关系,但是 ICE 曲线要求将两个要素绘制在多个重叠的表面上,这可能很难阅读。
按年龄划分的宫颈癌概率冰图。每条线代表一个人。对大多数人来说。随着年龄的增长,预测的癌症概率增加。对于一些预测癌症概率高于 0.4 的女性,该预测在较高年龄时不会发生太大变化。图片来源:克里斯托夫·莫尔纳尔
结论
随着研究的进行,可解释性是一个越来越受欢迎的领域。当你探索不同的解释方法时,希望这本入门书是有帮助的。
联系我们
如果这个博客引起了你的注意,并且你渴望了解更多关于机器学习可观察性和模型监控,请查看我们其他的博客和 ML 监控上的资源!如果您有兴趣加入一个有趣的 rockstar 工程团队,帮助模型成功生产,请随时联系我们,并在此处找到我们的空缺职位!
BI 工具能做什么——你应该知道的六种不同的 BI 工件
仪表板、图表、报告、电子表格、OLAP 立方体或直接 SQL 访问?
六件 BI 文物。通常,公司会经历一个电子表格->报告和仪表板->其他地方的旅程。
神器,来源于两个拉丁词,arte“通过技巧”和 factum“制造”。有目的地巧妙创造的东西。一个很好的词来描述由开发过程创造的东西。
在商业智能的学科中,在公司中收集“技术和过程”来系统地分析数据,我发现六个工件是大多数过程的基石。
在大多数关于数据架构的文章中,它们中的一些被遗漏了,或者至少适当的工具被遗漏了,也许是有意的,也许不是(例如,参见 a16z https://a16z.com/2020/10/15/the-emerging-architectures-for-modern-data-infrastructure上的精彩文章,该文章主要关注报告、仪表板&临时访问)。).
我认为数据的唯一价值是改善一些单位的决策。为此,我们需要回答一系列问题。但是根据问题的不同,使用其中一个工件来回答它们要容易得多。
换句话说:
“如果电子表格实际上是正确的答案呢?”(特里斯坦得心应手 )
因为有时候,就是这样。有时它是一个报告、一个 OLAP 立方体或一个直接访问管道。
六件 BI 文物
你应该记住的六个 BI 神器是…
- 普通的旧电子表格
- 视觉材料、报告和仪表板
- 古老的 OLAP 立方体
- 直接访问管道(通常通过 SQL)
- 写好的“故事”,笔记本
- 现代的东西,图形(比如图形数据库用户界面)
大多数数据最终用户的现实
那么,对于大多数数据终端用户来说,现实是怎样的呢?公司通常不会提供所有六种工件。而工具也没有提供。此外,仅仅为了找到正确的视角而经历这么多不同的数据查看方式似乎很令人困惑。然而,这意味着对于我们的绝大多数问题,我们将有一个次优的工具来回答它们。
这就是数据最终用户的生活。
但是事情是变化的,至少你通常会有不止一个可用的工件,所以了解所有这些工件并理解何时使用哪一个是有意义的。
(1)普通的旧电子表格
文件基金会和贡献者。截图:vul sphereMPL 2<>或 LGPL ,通过维基共享。
电子表格是 1979 年 Apple II 中的 VisiCalc 自带的。很长一段时间了。出于同样的原因,它们被广泛采用,可以通过任何文件共享方式共享,几乎任何人都可以使用。
电子表格允许绝大多数的数据、图形和计算操作。如果并排比较,电子表格将拥有它,因为它们的可扩展性和巨大的功能范围。
然而,电子表格让大多数数据人员感到恶心。两个原因可能是,由于它们的特性范围,它们不太方便。而且由于他们的地方性,他们不遵守共同的标准。您有多经常因为忘记保存电子表格而导致笔记本电脑崩溃?
是的,当你处理数据时,这是不应该发生的。它不具备开发良好、经过测试和版本化的数据工具。
尽管如此,在本地环境处于前沿的地方,在人们大量使用电子表格的地方,在开发、测试和版本控制不那么重要的地方,电子表格都有它们的位置。
常见的电子表格工具有 Google Sheets、Excel、Numbers 等。
(2)报告和仪表板
报告和仪表板有点像云化的电子表格。虽然从技术上来说,并不是所有的应用程序都必须实际存在于云中,有些应用程序允许你保存一个本地副本,这样你就可以自己处理了,但是这种集成使得它们非常好用。
报告和仪表板工具将这一切展现在桌面上,集成到数据环境中,并进行适当的共享。对于电子表格来说,要获取数据,要么必须导出它(这对于数据转储来说非常有用),要么通过一些自定义功能将它连接到数据源。
报告和仪表板工具通常由开发团队配置,以连接到您需要的所有资源。此外,它们允许个人或团队提供大量标准报告和仪表板,并与整个公司共享。
这使得 report & dashboard tools 成为“在感觉到电子表格大材小用之后”的最佳去处。
尽管如此,报告大多是“基于表格”的,它们允许过滤、排序等。大部分是“二维”的东西。所以这其中的问题是:如果你有一个新问题,有人必须为你扩展一个报告,修改一个过滤器,或者创建一个新的。
= >结果可能是包含 1000 个过滤器的 63 页报告。
因此,在感受到电子表格的痛苦后,报告和仪表板工具通常是公司的归宿,但它们也可能以电子表格的痛苦而告终…
常见的报表&dashboard 工具有 Metabase、redash、looker、tableau 等。
(3)OLAP 立方体
信息百科,CC BY-SA 3.0 ,通过维基共享。
在数据之旅的某个地方,一些公司开始意识到一些数据组合需要进行大量的“分析”。它们被过滤、向下钻取、排序、与另一种数据类型组合、再次过滤等。在报告表单中这样做意味着您必须为所有不同的数据组合准备大量的报告。典型的例子包括销售数据以及客户类型、年月、产品组等。
因此,1993 年,一个名叫 Edgar F. Codd 的人发明了 OLAP 立方体,这是一种对数据“立方体”进行切片和切块的简单方法,数据“立方体”本质上不再是一张表,而是一组 n 维数据。
“咄,为什么销售额比上个月下降了?—让我们先检查一下这个事实”,“啊,让我们看看哪些客户群买得更少”,“mmmh 仍然看不到任何东西,让我们改变到产品类型的角度”,“啊,我看到产品类型 X 有一个很大的突破”,“让我们看看人们在转换漏斗的哪些步骤中离开得最多,…”………等等都是典型的 OLAP 分析。
一个 OLAP 立方体实际上相当于一份有 1000 个过滤器的 63 页报告,但处理起来要好得多。但是如果你需要那种程度的灵活性。大多数公司只需要一些特定类型的核心数据组合。
成本:报告有趣的部分是因为它们是“固定的”,它们可以预先计算,所以它们真的很快(可以被制造出来)!OLAP 立方体也可以做得很快,但这意味着你必须付出相当大的努力,因为你必须找到“运行最多的查询”,然后聚集很多。因此,一个 OLAP 立方体可能比你的一堆报告要慢,而且花费更多。
因此,如果我们看到某些基础数据需要进行大量的切片和切割,公司可能会使用 OLAP 立方体。立方体将比 100 个报告更容易使用,但是它也将携带相当多的费用。成本在很大程度上取决于底层的“维度”,因此底层的数据越少,成本就越低。那么会发生什么呢?你最终会得到怪物立方体,因为人们喜欢加上“只有这一个维度”。事实证明,这样做会使立方体变慢,并增加开发成本。最后,你得到了一个昂贵而缓慢的立方体…
尽管如此,它还是比 100 份报告简单得多…
典型的 OLAP 工具是 Pentaho、MicroStrategy 或 Apache Kylin。
(4)直接访问
那么,我们如何能够在不产生 OLAP 怪物的情况下对大量数据组合进行深度分析呢?很简单,我们给人们技能去做,就像 OLAP 发动机在引擎盖下做的那样!我们让他们(通常是 SQL)访问我们的底层数据。我们对一些核心实体建模,并适当地记录它们。
这是一个很好的方法,但它也意味着提供更大的查询引擎,分解长时间运行的查询的方法,最重要的是,你需要一个非常懂技术的观众。我们可能还需要一个好的界面,这样人们就可以保存查询。
正在使用的工具:Presto、AWS Athena、…
所以我们可能仍然对报告、仪表板、OLAP 立方体和直接访问不满意。
⑸故事/笔记本
为了减轻这一点,一些公司在决策者和数据工程师之间有一些懂技术的人,“分析师”。他们使用报告、直接访问数据和创建深度分析来回答问题。
我喜欢“仪表盘已死”这篇文章,其中泰勒·布朗洛解释了为什么他们把 63 页的报告变成了一个可爱的笔记本——一个故事。其实是那篇文章让我写了这篇。我真的很喜欢他关于杀死一个恐怖神器,把他们所有的报道都改成“故事”的热情。
如果你看一下技术雷达,这是真的,泰勒·布朗洛使用的笔记本电脑,正在越来越多地生产。我喜欢这款笔记本的主要特点是它能够讲述一个小故事。一个普通的老记者无法讲述的故事。
然而,我们仍然依赖于我们的技术人员。最重要的是,在报告中过滤比在笔记本中更容易(尽管也是可能的)。
常见的工具有 Jupyter、上面提到的 Count 以及更多…
(6)图表
最后,一些公司使用图表。我是探索图形的图形用户界面的忠实粉丝。因为我认为,今天的许多企业实际上有很大一部分商业模式是“以图表的自然形式出现的”。
我还认为数据最好以其自然形式进行探索。就像因为扭曲,在地球仪上探索地球比在几十张卡片上探索要容易得多,我发现探索一个可视化的图形要容易得多。
图形用户界面实际上很好地让你显示一个完整的图形,或者让你过滤子图,过滤出新的图形,或者让你遍历它。
因此,如果您的业务模型中确实嵌入了某种图形,我建议您将图形用户界面作为探索问题的工具。当然,缺点是就像 SQL 直接访问一样,有些人必须精通技术才能做到这一点,但是当前的图形语言和 SQL 一样简单。
常用工具有 neo4j 等。
到处都是弱点
听起来每个艺术品都有严重的弱点。然而,我们真的不想有太多。这才是真正的困境。
我写这些是为了提醒自己。我们在考虑把我们的主要艺术品换成另一个。我喜欢记住,无论我们做什么,都不会尽善尽美。也不会是永久的。变化将会到来,所有三个组成部分,数据源,使用数据的人和他们的需求都会发生变化。
那么我们能做些什么呢?
我们基本上必须做我们在软件架构的其余部分做的同样的事情。
我们可以建立模块化的东西,架构,我们可以快速交换我们的 EL (T)中的 EL。在那里,我们可以快速将我们的存储、报告工具换成基于笔记本的架构。
我们可以建立进化的架构,在其中我们非常清楚我们的拟合函数,我们对当前问题的答案的质量。我们知道我们将采取小的迭代步骤来提供更好的答案。
就是这样!
进一步阅读
- Tristan Handy 谈现代数据堆栈的未来。
- A16zs 关于现代数据架构的帖子。
- 仪表板之死。
偏差-方差靶心图真正代表了什么
实践教程
它与欠拟合和过拟合有什么关系
在寻找偏差-方差权衡时,我们可以看到下面的靶心图:
偏差-方差的靶心图—图片由作者提供
它们看起来直观醒目,用一些蓝点来表示偏差和方差。但是它们到底是什么意思呢?中心点代表目标,但蓝点真正代表什么?这些牛眼是如何与欠适和过适联系在一起的?
与过度拟合和欠拟合的关系
偏差-方差权衡与过拟合和欠拟合的概念有关。为了说明这一点,我们可以举多项式回归的例子。在下面的例子中,x 和 y 之间的真实关系是二次的
- 所以如果我们使用简单的线性回归,模型是欠拟合;
- 如果多项式的次数太高(例如 8),那么模型过拟合。
- 最优模型为二次模型。
多项式回归、欠拟合和过拟合—作者图片
现在,如果我们回到靶心图,关系如下所示:
- 最优模型对应低方差和低偏差。(好吧,可以理解)
- 过拟合对应高方差低偏差。(但是为什么呢?如前图所示,它与 8 次多项式回归有什么关系?)
- 欠拟合对应高偏差和低方差。(但是为什么呢?它与上图中的简单回归有什么关系?)
- 那么高方差和高偏差呢?什么模式会导致这种情况?
偏差-方差与过度拟合和欠拟合-作者图片
如果我们将它们放在一起,我们如何将靶心中的点与回归图中的数据点联系起来?
更准确的表述
乍一看,靶心图还是挺直观和醒目的。但如果我们真的试着问自己这个问题:每个预测点都有两个坐标?两个维度是什么?
然后我们意识到眼睛只是目标变量值的艺术表现。因为我们通常只有一个目标变量。所以要想更准确,应该只展示一个维度。
中间的红点是我们试图预测的真实值(一个特定的观察值)。蓝点是我们建立的不同模型的预测。
因此,如果我们想更准确地描述目标值和预测值之间的比较,靶心将变成只有一个轴,它代表目标变量。
那么,它们到底代表了什么,我们怎样才能创造出一个具体的模型例子呢?我们编码吧。
多项式回归模型
我们将在以下过程中创建多个模型来说明(欠拟合和过拟合)与(偏差-方差权衡)之间的关系:
- 首先,我们选择从一个已知的函数生成一些简单的数据。
- 然后我们可以试着创造模型
- 对于一个或多个新的观察值,我们可以进行预测,并查看方差和偏差。
生成数据
我们可以生成一些真正的二次关系的数据。
import numpy as np
import pandas as pdn = 20
x = np.linspace(0,7,n) + np.random.randn(n)*0.1def f(x):
return (x-3)**2y = f(x)+np.random.randn(n)
我们可以用红色的实函数来绘制数据。
不适合的模型
为了用以前的数据创建欠拟合模型,我们可以创建简单的线性回归。利用从原始数据集中选择的一些训练数据,我们可以创建一些模型。
for i in range(20):
model = make_pipeline(PolynomialFeatures(1), LinearRegression())
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5)
model.fit(X_train, y_train)
y_plot = model.predict(X_seq)
plt.plot(X_seq, y_plot,c=”c”)
plt.scatter(4, model.predict([[4]]),s=300,c=”c”)
如果我们对 4 的值进行预测,我们可以得到下面的图:
- 红点是真正的目标值
- 蓝点是由训练数据样本创建的模型(简单线性回归)的预测。
现在,我们可以清楚地看到偏见。我们可以预测几个值
现在,让我们回顾一下不同的插图:
过度拟合的模型
对于过拟合,我们可以通过改变多项式的次数来创建相同的比较。
for i in range(20):
model = make_pipeline(PolynomialFeatures(8), LinearRegression())
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5)
model.fit(X_train, y_train)
y_plot = model.predict(X_seq)
plt.plot(X_seq, y_plot,c=”c”)
plt.scatter(4, model.predict([[4]]),s=300,c=”c”)
最优模型
当多项式的次数为 2 时,我们可以清楚地看到模型的预测具有低偏差和低方差。
回归树模型
我们也可以用回归树来说明
结论
我希望现在你能更准确地看到偏差-方差靶心。
如果是这样,最后一件事:什么样的模型可能具有高方差和高偏差?
当业务人员说细分时,他们实际上寻找的是什么
…以及如何使用 Python 创建有效的细分分析
梅尔·普尔在 Unsplash 上的照片
又到了重温我的 Python 技能的时候了!👩🏻💻
本周,我想分享我在前雇主德国金融科技初创公司做的一个项目。在这个项目中,我与营销团队合作,使用 Python 向提交了一份用户细分分析,最终推动了从机会主义增长战略到清晰的品牌定位和目标战略的转变,并将客户群从 5K 增长到 400K。
在这篇文章中,我很乐意用 Kaggle 数据集分享我的方法,并结合我最近在 MBA 课程“管理客户价值”中的收获。如果你对我在 INEAD MBA 的第一周感到好奇,请查看这篇文章了解更多细节!
除了这篇文章之外,你还可以在这里找到一个附加的 Kaggle 笔记本,它是用这里描述的方法实现的,基于一个不同的数据集:https://www . ka ggle . com/Yao wenling/clustering-analysis-and-CLV
如果你对我如何基于 RFM 模型进行具体的细分分析感兴趣,请点击这里查看!
以下是我的要点:
🎯当业务人员谈论细分时,他们不是在寻找一组数据点,而是一套清晰、可操作的标准,人们可以用这些标准来识别不同的、足够大的、价值驱动的细分市场,并通过现实检查。
🧩只使用一种算法是不够的。为了实现这个目标,我们需要结合回归、聚类、均值比较和综合。
🕵🏻♀️:只看内部数据是不够的。为了确保我们的细分市场通过现实检验,我们需要与产品 UX 研究人员和品牌营销团队密切合作。
真正的商业问题
在我加入前雇主的第二周,首席执行官问了我以下问题:“这是我们的第二年。我们已经积累了 5K 的客户群。注册会计师看起来不错。产品看起来不错。我们也在创收。我们应该去哪里?谁是我们最有价值的客户(MVC)?他们看起来怎么样?我们怎样才能获得更多的知识呢?
我们定义了预期的输出应该是什么样子:
- **分段应该足够清晰。**我们想将顾客分成几类。每个群体内的个体之间应该尽可能“近”,跨群体的个体之间应该尽可能“远”。
- **片段要足够大。**我们确定的群体应该代表我们的客户。换句话说,在总客户群为 5K 的情况下,每个确定的群体应该大于总人口的 10%。理想情况下,我们还希望将组的数量限制为最多 5 个。
- **细分市场应该以价值为导向。**已确定的团队应向企业展示不同的价值。在最好的情况下,我们能够确定一个占客户群 20%却贡献了 80%收入的客户群——著名的 80/20 法则。
- **奖励:片段应通过真实性检查。**换句话说,假设我们已经确定了一个完全不同的满足上述 80/20 要求的客户群,但这些客户的平均收入超过 20 万,我们可能需要重新考虑标准,因为市场上可能没有那么多收入如此高的人能够以合理的 CPA 收购。或者想象另一种情况,我们已经确定了一个有价值的客户群,但我们的用户研究表明,具有这种特征的用户需要的功能肯定超出了你的产品范围,那么我们也应该重新考虑我们的分类标准(或重新考虑你的产品范围:)。为了解决这两个问题,仅仅查看我们用户的数据是不够的,还需要与 UX 的研究人员以及营销团队进行广泛的合作 —在我后期分析的第二次迭代中,我有机会与这两个领域的人才一起工作,我将在本文结尾分享一些心得。
一种结合回归、聚类和均值比较的方法,最重要的是综合
我来自一个定量的背景,最初我认为我们需要一个聚类分析来产生细分和回归分析来识别客户价值的预测。我很快意识到,独立进行这两项分析无助于回答我们提出的问题。
为什么简单的回归分析是不够的
通常当我们问类似“什么样的客户给我们带来更高的收入?”,我们的直觉是将收入或 CLV(客户终身价值)作为因变量,并进行回归,以找出哪些预测因素可以帮助解释收入的差异。然而,回归模型的直接输出是不够的。
例如,回归模型可能会显示,假设所有其他条件相同,年轻客户比年长客户产生更高的收入,收入较高的客户产生更高的收入。这些见解很棒,但它们都基于一个单一的维度。然而,分割标准总是多维的。
也就是说,回归分析仍然很有意义——有了它**,人们可以对哪些变量是有影响的以及应该包含在我们的分析中有一个大致的概念。**
为什么简单的聚类分析是不够的
简单回顾一下什么是聚类分析,它给我们带来了什么:
- 聚类是一种无监督的机器学习算法,这意味着它不具有任何预测能力或解释目标变量的任何变化。
- 假设数据集中的每条记录都是一个单独的用户,并且有典型的人口统计变量,如性别、年龄和工作。聚类的输出是分配给每个用户的具有聚类标签(例如,1,2,3,…k,其中 k =生成的聚类的数量)的新列。
- 人们可以通过检查聚类内和聚类之间的数据点之间的距离来评估聚类性能。然而,没有正确或错误的答案,也没有更好或更坏的答案。
然而,聚类分析的直接结果并没有回答我们的问题。这是因为在大多数情况下,这些聚类本身并不一定形成“良好”的描述标准。例如,假设我们最终有两个集群 X 和 Y,我们检查这两个集群的描述性统计数据,我们可能会看到这两个集群的年龄范围都是 18–75 岁。**这是因为无论你的算法有多精细,你总会在一个集群中发现一些在某些维度上看起来像离群值的观察值。**例如,在平均年龄为 25 岁的聚类 X 中,您可能会发现一个 70 岁或 18 岁的用户,他/她被归类到聚类 X 中,因为他/她在所有其他维度上与其他聚类成员非常接近。然而,比较每个集群的平均年龄可能会给我们一个提示,即这些集群实际上在年龄分布方面互不相同。
因此,**为了生成清晰且可操作的标准,需要更深入一层,以生成关于集群特征的知识——我将这一过程称为“合成”。**在上面的示例中,通过查看每个聚类的 10%和 90%四分位数,可以得出一个更合理的年龄范围,其中确切的临界值取决于您的容忍度。我们可能会发现,集群 X 中 80%的用户年龄在 20-35 岁之间,而集群 Y 中的用户年龄在 45-55 岁之间。类似地,我们可能还会发现,集群 X 和集群 Y 中的用户从事各种类型的工作,但仔细观察就会发现,集群 X 中 80%的用户是开发人员,而集群 Y 中 80%的用户在金融行业工作。
**下一步是使用这些总结的知识来定义你的集群。**坚持上面的同一个例子,回想我发现集群 X 中 80%的人在 20 到 35 岁之间,80%是开发人员,我可以定义一个标准如下:1)年龄在 20 到 35 岁之间;2)他们是开发者。然后,我使用这些过滤器生成一个名为“年轻开发者”的细分市场。注意,如聚类算法所给出的,该片段肯定小于聚类 X(根据上面给出的假设,小 100%-80%*80%=36%)。然而,如果我们发现一个片段太小(例如,<总人口的 10%),我们需要考虑将其与其他片段合并。
跨定义的集群评估客户价值
在生成集群之后,我们想要检查这些集群是否有价值。检查的一种方法是比较集群间的平均 CLV。或者,也可以使用其他货币化指标,如平均。订单数量、转化率、CLV/注册会计师等。
**值得注意的是,这些与价值相关的指标不应该作为我们前面步骤中聚类算法的输入。**这是因为当我们定义聚类时,我们希望找到可以用来识别市场上客户的标准,而这些与价值相关的指标(例如,用户活动、收入、CPA)只有在获得用户后才会生成。然而,如果我们问一个不同的问题“我们可以根据客户的参与模式对他们进行分组吗?”,那么我们就可以使用这些价值相关的指标进行聚类。
在比较各集群的平均客户价值时,同样值得使用 Tukey 测试来检验统计显著性。
最后,为了取悦我们的业务涉众,我们可以基于 PCA(主成分分析)创建一个手动定义的聚类的 2D 图**,以显示这些聚类彼此之间有多么不同!**
业务影响
通过我在第二周所做的分析,我们能够确定一个我们称为“年轻专业人士”的细分市场,与“学生”、“城市家庭”和“退伍军人”等其他细分市场相比,该细分市场的收入表现显著。我与首席执行官和 CMO 交流了结果。**很快,我们从以“我们的应用帮助您省钱”为主要信息的大众营销转变为以我们的数字解决方案为特色的面向年轻一代的目标信息。与此同时,我们开始将我们的营销预算重点从电视转移到数字渠道(例如,CPC、社交媒体和应用内广告)**因为我们相信它们是吸引我们最有价值客户(MVC)的最佳渠道。
两年后,当我们的客户增长到大约 100,000 时,我受命重新进行这项分析。我重复了上面同样的方法。好消息是,我们看到“年轻专业人士”的比例有所增加,这些客户仍然同样有价值(即,他们的平均收入贡献没有因为我们试图收购更多此类客户而被稀释)。这次对我个人来说有所不同的是,我有机会与我们的产品 UX 研究人员和品牌营销团队合作。这是一次非常宝贵的经历,因为我看到了我的见解是如何被用来支持他们的用户研究和外部品牌机构的进一步市场研究的。
就是这样!如果你有想法或问题,请告诉我!
关于神经网络为什么会泛化,平坦度能教会我们什么?
思想和理论
它的不足之处在哪里?
这是一系列总结工作的第三篇文章,旨在提供深度神经网络(DNNs)的一般化理论。简而言之,的第一篇文章总结了用随机优化器(如 SGD)训练的 dnn 在参数空间中找到概率与其体积成比例的函数的证据,而的第二篇文章认为这些大体积函数是“简单的”,因此解释了为什么 dnn 会泛化。
在下文中,我们总结了[1]中的结果,这些结果解释了为什么“损失前景的平坦性”已被证明与一般化相关,这是一个众所周知的结果(例如参见[5])。他们提供了大量的经验证据,表明这种相关性实际上是(1)局部平坦性和周围函数的体积之间的弱相关性,和(2)体积和一般化之间的强相关性的组合。这种结合在“平坦”和概括之间产生了微弱的相关性。
它是和张硕丰一起写的,他是【1】的第一作者。
简介和背景
自 20 世纪 90 年代以来,直觉上认为损失景观的局部平坦性与深度 DNNs 中的良好概括相关,Hinton 和 Schmidhuber 认为,由于更平坦的最小值需要更少的信息来描述,它们应该比尖锐的最小值更好地概括(根据奥卡姆剃刀原理)。由于这种最初的兴趣,已经开发了许多不同的局部平坦度测量,并且已经发现设计来寻找平坦区域的算法可以改进一般化。
图 1: 来自 Keskar 等人【5】,其中平坦极小值和良好概括之间的联系被重新构建,以这幅漫画作为直觉。如果测试损失函数与训练损失函数略有不同,则在平坦最小值中,训练损失和测试损失之间不会有太大差异。然而,在尖锐的最小值中,在测试和训练损失之间可能有实质的差别。
尽管有这些工作,所有的平坦度测量都有严重的问题:它们受到α缩放问题的困扰:对于一个 ReLU 激活的 DNN,你可以通过(某个常数)α和 1/α分别缩放两个相邻层的权重,并且不会改变 DNN 在数据上表达的函数,因此不会影响泛化。不幸的是,(大多数)平坦度测量在α缩放后会有很大的变化。
更糟糕的是,α缩放只是一个重新参数化的例子,不会改变函数。这个重新参数化可以是层方式的,也可以是神经元方式的,这取决于具体的 DNN 架构。
许多工作已经为 SGD 训练的 dnn 发现了以下情况:如果 SGD 在损失函数中找到平坦的最小值,则平均而言,网络将比如果 SGD 找到尖锐的最小值概括得更好(参见图 1 以获得该论点的漫画)。然而,α-标度论点表明,任何平坦的极小值都可以变得任意尖锐,而不改变函数,以及一般化。
因此,平坦性不可能是概括良好的函数的定义特征。
在[2,3,4]中提出,我们应该开始考虑参数空间和功能空间之间的关系。毕竟,dnn 是高级函数逼近设备,很明显参数的选择相对于参数产生的函数来说是次要的 *。*我们需要问以下两个问题:
- 函数空间中的什么性质赋予函数良好的推广性?
- 平坦是如何融入其中的?
深度神经网络的函数空间观
dnn 是从输入空间 X 到输出空间 Y 的参数化函数。更具体地说,参数θ的选择决定了深度神经网络表达什么函数 f : X→Y :我们将把它写成 Y =f(X;θ) 。
对于某些数据集 D,有一个“真”函数 f : X→Y 描述了如何将 D⊂ X 中的输入映射到 Y 中的输出(其中 D 是数据流形)。我们的神经网络的工作是在给定一些训练数据 S ⊂ D 的情况下,尝试在整个 D 上精确地逼近 f 。需要强调的是,在训练之后,神经网络所表达的功能在 S 上总是相同的(如果你在 S 上训练到 100%的准确度),但是在 D 的其余部分上可能不同。这些差异会导致不同的概括错误。
例如,考虑 MNIST: X 是 28×28 灰度图像的空间, Y 是标签*{ 0–9 }的空间,f* 是从图像到标签的映射, D 是 X 中对应于手写数字的部分, S 是这些图像的子集。
更多细节和示例见第一篇文章。
在我们继续之前,我们需要定义[1]的中心量(参见图 2 的图示):
- V(f) 是某个神经网络的参数空间中的体积(具有高斯度量),使得f(x;θ)=f (x)。这意味着两件事:(1)所有函数的“总体积”是 1,以及(2)因此, V(f) 是参数空间的分数,这使得神经网络表达 f.
- Pₒₚₜ ( f | S ) 是像 SGD 这样的随机优化器在 s 上训练到 100%精度后找到函数 f 的概率
- *V( f | S) = P(S | f ) V(f) / V(S),*其中 V(S) 是与一个训练集 *S,*和 P(S | f ) =1 如果 f 与 S else 0 一致。
图 2: 这两个图总结了前两篇帖子中的论点。(a)是参数空间的动画,显示了当你根据训练集 S 对其进行划分时会发生什么。有些功能在 S 上不能很好地执行,而在那些有组合体积的功能中, *V(S),中,有些功能比其他功能占据了更多的体积。有人认为具有大的 V(f) 的函数“更简单”,因此更容易推广。量 V( f | S) 是 f (某白函数)的体积除以白函数的总面积。(b)认为,如果v(f | s)*有一个很大的范围,那么你期望 Pₒₚₜ ( f | S ) ≈ V( f | S) 。
[3]中的大量经验证据表明,DNNs 中的良好概括有以下三个原因:
- Pₒₚₜ ( f | S ) ≈ V( f | S) 用于优化器训练的 DNNs
- 体积较大的函数 V(f) 比体积较小的函数 V(f) 概括得更好
- [3]中的论点表明,这是因为高容量功能“简单”
直观地说,(1)是说优化者发现函数的概率与它们在参数空间中占据的体积成比例。优化器的选择将少量影响第一个近似等式,这可以解释一般化中的小变化。
需要澄清的最后一点是:我们如何度量函数的差异?当然,我们不可能计算所有可能数据的差异。相反,我们使用一个小的测试集 E⊂ D 。我们根据功能在 E 上的表现来区分它们。例如,假设你在大小为|S|=50000 张图片的训练集 S 上训练 MNIST,直到 100%的训练准确率。使用该停止条件训练的任何网络将在 S 上模拟相同的函数 f (即,它将以相同的方式对所有图像进行分类)。然而,根据随机种子,神经网络将在看不见的图像的测试集 E 上找到不同的可能分类。在图 2a 的漫画中,每个白色区域对应于这些看不见的图像的不同分类。这是一种对函数进行“粗粒化”的方法,因此我们可以以一种有意义的方式计算像 V(f |S) 这样的量。
该功能通常根据 X 中的一些数据 D 来定义。还有几个类似的微妙之处,这里有完整的解释。
注意,在第一篇文章中, V(f|S) 被标为 Pᵦ(f|S) 以强调这个量的贝叶斯解释。
平坦度和体积与泛化的关系如何?
所以,我们想问下面的问题:一般化是由前一节给出的论点解释的吗,或者平坦性有什么要补充的吗?
在 V(f) 范围内,局部平坦度可能有所不同,但似乎可以感觉到,高音量的函数平均来说比小音量的函数更平坦(考虑图 2b )。
然后,假设在体积和一般化之间有很强的相关性,体积和平坦度之间的弱相关性可能足以给出一般化和平坦度之间的弱相关性。
[1]的主要结果提供了支持这一主张的大量经验证据。
平坦度和一般化之间的相关性高度依赖于优化器,并且比体积和一般化之间的相关性弱得多(即使忽略平坦度-一般化相关性可以通过α缩放任意确定)。以下结果使用[5]中的最差情况锐度指标。为了迫使优化器找到泛化能力差的函数,将由错误标记的数据组成的“攻击集”添加到训练数据中。
***图 3:*MNIST 和 CIFAR-10 上音量 V(f) 锐度和泛化精度的相关性。对于 MNIST |S|=500,| E | = 1000 对于 CIFAR-10 |S|=5000,|E|=2000。攻击集大小|A|从 0 到|S|不等,并生成具有不同泛化性能的函数。(a)-©分别描述了 MNIST FCN、CIFAR-10 FCN 和 CIFAR-10 Resnet-50 的概化和数量之间的关系。(d)-(f)显示了相同的三个数据集-架构对的泛化能力和清晰度之间的相关性。在这个实验中,所有的 dnn 都用普通的 SGD 训练。
图 4: SGD 变体可以打破平坦度-一般化相关性,但不能打破体积-一般化相关性。这些图示出了在(a)和(d)上训练的 FCN 的泛化与音量或锐度的关系——具有熵-SGD 的 MNIST;(b)和(e)——MNIST 和亚当;©和(f)——带有自动监测系统的 CIFAR-10。对于与图 3 中相同的 S 和 E。请注意,与体积的相关性实际上与普通 SGD 相同,但与平坦度的相关性变化很大。
当我们在训练时直接比较同一 DNN 的平坦度和体积时,我们看到了更有趣的东西。在图 5 中,我们测量了在 MNIST 训练的 FCN 在每个时期的音量和锐度。在第 140 个时期达到零训练误差,我们又过度训练了 1000 个时期。从初始化开始,清晰度和音量都降低,直到达到零训练误差。随后,体积保持不变,但交叉熵损失继续减少,正如这类分类问题所预期的那样。这导致锐度降低,即使函数、音量和训练误差不变。这表明平坦度是一个相对的概念,例如,取决于训练的持续时间。
我们还研究了α缩放:图 5 还显示了您可以执行α缩放并影响锐度,而无需更改函数。如插图所示,由于函数 f 不变,体积在α缩放时最初是不变的。然而,α缩放可以将系统驱动到参数空间的不寻常部分,在损失函数中具有陡峭的梯度,这意味着 SGD 几乎立即脱离零训练误差流形。然而,该系统很快就松弛到基本相同的功能和体积。这一经验发现进一步表明了平坦性论点的局限性,同时加强了功能空间视图和体积作为与良好概括相关联的良好属性。
图 5: 锐度和音量如何随时代演进。在每个时期,我们计算|S|=500 的 MNIST FCN 的锐度和音量。绿色虚线表示时期 140,在该时期达到零训练误差并且后训练开始。红色虚线表示时期 639,其中α = 5.9 时发生α缩放。在α缩放时,清晰度显著增加,但随后又迅速降低。插图显示,在α缩放后,音量最初没有变化。然而,大梯度意味着在随后的 SGD 步骤中,在恢复到(几乎)相同的功能和体积之前,功能(和体积)会发生变化。
结论
我们讨论了以下结果:
- 随机优化者发现函数与它们在参数空间中占据的体积成比例(有点直观)。
- 高容量函数(最常见的函数)更可能是“简单”的,因此概括得更好(因此 DNNs 概括得更好)。
- 这些高音量函数在很大程度上比低音量函数局部更平坦。
因此,在平坦度和一般化之间观察到的弱相关性是由于(弱)平坦度-体积相关性和(强)体积-一般化相关性的组合。
注意,这是对[1]的删节总结。因此,我们把重点放在了我们认为最重要的部分,因此可能忽略了一些有趣的细节。
参考文献
[1]张硕丰,艾萨克·里德,吉列尔莫·瓦莱·佩雷斯,阿德·路易.为什么平坦度与深度神经网络的泛化相关。(2021)
【2】c .明加德,g .瓦莱-佩雷斯,j .斯卡尔斯,a .路易。SGD 是贝叶斯采样器吗?嗯,差不多了。(2020)https://arxiv.org/abs/2006.15191
【3】c .明加德、j .斯卡尔斯、g .瓦莱-佩雷斯、d .马丁内斯-卢比奥、v .米库利克、a .路易斯。神经网络先验地偏向于低熵函数。(2019)https://arxiv.org/abs/1909.11522
【4】g .瓦莱-佩雷斯,c .卡马戈,a .路易。深度学习泛化是因为参数-函数图偏向简单函数。(2018)https://arxiv.org/abs/1805.08522关于深度学习的大批量训练:泛化差距和尖锐极小值(2016)。https://arxiv.org/abs/1609.04836
ML 项目会出什么问题?
5 常见的事情,以及如何避免它们
托马斯·马图在 Unsplash 上的照片
TL;速度三角形定位法(dead reckoning)
启动一个包含机器学习(ML)的项目可能是一件棘手的事情。在这篇文章中,我们将探讨一些你在旅途早期可能遇到的陷阱,更重要的是,如何避免它们。
💡我已经按照你可能遇到的顺序把它们列出来了。但是你不需要按顺序读,直接跳到和你最相关的地方。
(1)️你的问题不太适合机器学习
ML 的存在,并不总是意味着我们应该使用它!ML 不是魔术,它当然也不是解决所有商业问题的灵丹妙药。但是,当应用于正确的用例时,它可以产生有希望的结果。
在决定使用 ML 是否是解决问题的正确方法之前,首先考虑一些好的老式数据分析是否能提供您需要的答案。
通常,通过一些数据汇总、过滤和总结,你通常可以识别出数据中的简单模式或趋势,比如“我们的产品在 Q2 的销量与 Q1 相比如何?”?
当数据中的模式不太明显时,我们倾向于使用 ML,例如“从 1000 件甚至 100,000 件产品的目录中,我的客户更倾向于购买什么产品”?
下面我列出了一些常见的问题和适用于 ML 的相关用例:
- 预测分析 —欺诈检测、预防性维护、点击率、需求预测、下一个最佳客户行动
- 处理非结构化数据 —注释视频、识别眼疾、对电子邮件进行分类
- 实现自动化 —安排维护、拒绝交易、统计零售客流量、扫描医疗表格
- 个性化 —客户细分、目标定位、产品推荐
🧐仍然不确定你的问题是否适合曼梯·里?看看机器学习问题框架介绍,谷歌免费在线机器学习速成班的一部分。
(2) ️Jumping 在没有原型的情况下进入发展
开始将您训练的第一个 ML 模型集成到您正在构建的最终解决方案或应用程序中是很诱人的。
要认识到的重要一点是,ML 模型开发是一个迭代过程。在项目开始时,不可能知道所有可能影响模型性能的变量。
一个快速的原型可以告诉你很多隐藏的需求和潜在的实现挑战,在它们成为你的模型进入生产的障碍之前。
例如,您可能会遇到缺失或脏数据。一种类型的模型比另一种产生更好的结果吗?你甚至关注正确的预测目标了吗?
最好从一个简单的模型开始,继续完善它,直到你达到你的目标,或者你满意的基线。
🛠:有很多工具可以用来创建快速 ML 模型原型,下面是我最喜欢的三个:
- BQML —如果您熟悉 SQL,您可以使用简单、简短的语句来创建、评估 ML 模型并从中获得预测。这就发生在使用 BigQuery 的数据表所在的地方。BigQuery 是来自 Google Cloud 的完全托管的无服务器数据仓库。
- Jupyter Notebooks——“Jupyter Notebook 是一个开源的 web 应用程序,它允许你创建和共享包含实时代码、等式、可视化和叙述性文本的文档”[1]。笔记本的美妙之处在于,每当您想要测试或更改 ML 模型代码的元素时,您可以独立地执行代码块,而不是编译和运行整个程序。如果你不想管理基础设施的麻烦,你可以在谷歌云上使用 Vertex AI 启动托管笔记本实例。还有一些方便的 python 库,比如 Lazy Predict 可以与笔记本结合使用,帮助快速向下选择最佳模型。
- AutoML —另一个 Vertex AI 产品,AutoML 使机器学习专业知识有限的开发人员能够根据他们的业务需求训练高质量的模型。AutoML 提供了一个无代码的用户界面,使您能够摄取训练数据集、训练模型并评估其性能。在幕后,它实际上是使用 ML 来确定用于解决您的问题的最佳 ML 模型🤯。如果您选择将它部署到生产环境中,它也使得最终服务于模型变得容易。也有一些其他供应商,如 DataRobot 和 H20.ai,给你更多的灵活性和对他们自己的 AutoML 正在比较的算法的洞察力,以排行榜的形式呈现结果。
(3) ️You 数据集不平衡
当您试图训练一个 ML 模型来对例外情况而不是规则进行分类时,这是一个常见的场景,例如银行交易中的欺诈检测。
您可能已经在培训数据集中验证了欺诈交易的实例。但是因为真实的实例往往不太常见,你会发现你的数据集是不平衡的。
考虑到我们的欺诈检测问题,假设非欺诈交易与欺诈交易的比例为 5000:1。如果数据集包含一百万个示例,那么数据集只包含大约 200 个欺诈交易的示例,这对于有效的训练来说可能是太少的示例。
这种数据不平衡会直接影响您的模型对欺诈交易进行准确分类的能力。
你能做些什么:
- 调整权重 —我们的目标是识别欺诈交易,但你没有太多的正面样本,所以你会希望你选择的 ML 分类器对可用的几个例子赋予更多的重要性(或权重)。大多数常见的 ML 分类器允许您通过参数传递每个类的权重。这将导致模型“更多地关注”来自代表性不足的类别的示例。[2]
- 过采样和欠采样 —这是一种技术,可用于调整数据集的分布,使其更加平衡。回到我们的欺诈检测场景,您可能会多次重复采样(重用)这 200 个欺诈交易示例,可能会产生足够多的有用训练示例。欠采样具有相反的效果,即从多数类中删除样本,在我们的情况下是非欺诈性交易。
⚠️当对训练数据进行过采样和欠采样时,你需要小心过拟合。
- 合成数据生成 —另一个选项是以编程方式创建您需要的数据。在某些情况下,这可能会更加困难,尤其是当您不知道训练数据集中哪些特征构成了代表性不足的类时。根据您用来构建 ML 模型的编程语言,有许多免费的库可以帮助生成合成数据。例如在 Python 中,流行的 Scikit-learn ,SymPy 或者 Pydbgen 都可以用来生成合成数据。
🧐想要一个更实际的、基于代码的例子吗?看看 TensorFlow 网站上的这个教程:不平衡数据分类
(4)模型训练耗时太长
模型训练是从输入数据中学习以建立 ML 模型的过程。
对于许多可能包含数百万行的真实数据集,训练可能需要数小时、数天甚至更长时间。
在您的模型被训练之后,您可以评估它的准确性(参见第 5 节了解更多信息!)来查看您是否在之前的训练迭代中取得了改进。
当您或您的团队试图快速迭代新的想法和技术时,培训时间可能会成为项目的巨大瓶颈,阻碍创新。
你能做些什么:
- 在不管理基础设施的情况下训练模型 —如果您在笔记本电脑或普通工作站上训练您的 ML 模型,那么您的硬件规模很可能会限制您快速训练模型的能力。一种选择是使用基于托管云的服务,例如 Vertex AI 。基本上,Google Cloud 根据您的培训需求,处理启动虚拟机实例的过程。你只需要带上训练你的 ML 模型所需的代码。或者使用 AutoML 实现无代码方法!
- 利用加速器,如GPU和TPU——大多数 ML 框架,如 TensorFlow,旨在利用适合大规模分布式处理的专用硬件。如果您需要处理数百万行数据,那么并行处理要比一次处理一个块高效得多!专门针对 Tensorflow 的 GPU 和 TPU 可以帮助我们实现这一目标。GPU 可以添加到物理硬件中,或者指定为云中虚拟机配置的一部分。TPU 是非常专业的硬件,只能通过谷歌云获得。
- 通过自动 超参数调整提高模型质量——如果构建 ML 模型的代码就像在烤箱中烘焙蛋糕的配料,您可以将超参数调整视为在烤箱的旋钮上进行的调整。超参数的值会影响训练模型所需的时间,您可以根据特定目标选择调整它们。虽然许多机器学习库包括超参数调整功能的某些方面。更进一步,例如, Vertex Vizier 提供自动超参数调整,对“烤箱旋钮”进行最佳调整,这样您就不必这么做了。
🚀如果您没有能力扩展您的计算资源,另一个选择是尝试使用较小的数据集子集。您也许能够训练一个足够好的模型,而不需要使用每一行来训练它。与第 2 节中提到的快速原型制作工具结合使用;在提交更大的训练数据集或算法之前,通过比较训练时间,您仍然可以取得快速进展。
(5) ️Model 精度不够好
有时,您可能会感到停滞不前,因为您的 ML 模型没有产生足够准确的预测来满足您的目标或业务目标。
你是否觉得自己撞上了一堵砖墙,无法再进一步提高准确率?
你能做些什么:
- 提高你试图解决的问题的领域专业知识 —也许你问了错误的问题,也许你试图预测的目标变量不会解决问题。有时候,后退一步,向他人咨询,尤其是领域专家,会有所帮助。他们可能会更好地理解今天是如何解决问题的(没有机器学习),并可以就成功的启发和衡量标准提供指导。这样你就可以有一个合理的基准来判断基于 ML 的方法的有效性。
- 包括更多不同的训练数据——我在以前的帖子中讨论过数据是 ML 模型的关键。回到你的数据源,你能找到更多的训练例子或者不同的特征来提高你的 ML 模型的准确性吗?质疑你所拥有的数据是否适合解决这个问题。
- 特征工程 —这是为你的 ML 模型修改特征或输入变量的过程。例如,您的训练数据可能包括来自银行交易日志文件的原始输出,但是您不一定需要每个字符来提取对您的模型影响最大的数据。您可以利用您的领域专家来帮助您找出那些属性可能是什么。
- 删除可能导致过度拟合的特征;从一个更小、更简单的模型开始,逐步添加功能— 过度拟合是指您创建的模型与训练数据匹配得如此紧密,以至于它无法对新数据做出正确的预测。有一些简单的方法可以减轻过度拟合的影响,首先通过将训练数据随机分为训练和测试数据集来识别它,并比较结果-如果您的模型在训练集上表现良好,但在测试集上表现不佳,则您很有可能过度拟合。如果您发现过度拟合,请尝试使用更大的数据集重新训练模型。
对于帮助解决模型准确性的更高级的技术,看一看交叉验证、正则化和集合(进一步阅读中的链接)。
如果你是因为自己的 ML 项目遇到了障碍才找到这里的,这篇文章的目的是给你一些新的研究途径。希望它能让你再次朝着正确的方向前进!
直到下一次👋🏼
📚进一步阅读和学习
- 🎥我对 TPUs 的解释,以及如何使用它们来加速 TensorFlow 模型的训练(是的,事情有所进展,但它确实提供了一个很好的视觉解释)。
- 📑机器学习中的过拟合:什么是过拟合以及如何防止过拟合
- 📑如何处理机器学习中的不平衡类
- 📑功能工程的最佳实践
📇参考
[2]https://www . tensor flow . org/tutorials/structured _ data/unbalanced _ data
关于概率的概率,篮球奇才凯文·杜兰特能教些什么?
让我们用上周日比赛中凯文·杜兰特的三分线来理解贝塔分布。
背景
上周日,密尔沃基雄鹿队以 11 分的优势击败布鲁克林篮网队,在东部半决赛中以 2 比 2 平。然而,网队的明星前锋凯文·杜兰特又一次贡献了出色的数据,但在三分线上的表现却非常糟糕。杜兰特是一个非凡的,非常高效的得分手,是有史以来最伟大的得分手之一,所以看到他八次三分球尝试中只有一次是很奇怪的。根据回归均值,杜兰特很可能会逆转他的统计数据,让事情变得公平。然而,我们可以从他相对低调的表演中获得一些振奋人心的见解。(PS:杜兰特 49 分 17 篮板 10 助攻点亮第五场,三分球 4/9)。
虽然篮球兴趣不是这篇文章的先决条件,但我希望你理解贝叶斯定理,概率分布(二项式和连续分布的基础)。
1.得分效率和掷硬币
从统计学的角度来看,每个 NBA 球员都可以被认为是硬币的主人。然后,我们可以用数学方法模拟每个球员通过掷硬币获得三分的机会。如果硬币正面朝上,玩家得分。因此,每个玩家的三分统计线都遵循二项分布,其中*得分概率= P(H)= P。*难题是估计硬币正面落地的概率§。
让我们重温一下杜兰特的 1/8 统计线。遗憾的是,由于我没有观看比赛(支持雄鹿!),我不知道他投篮不中的顺序。我们假设他犯了第一个错误,其余的都是错误。因此,我们的数学模型得出以下结果(顺序并不重要):
凯文·杜兰特的三点尝试:H,T,T,T,T,T,T,T
如果没有杜兰特职业生涯的先验知识,推断他得分的概率 P(H)=p=1/8 是合理的。本质上,根据他的数据,杜兰特有 12.5%的机会在他的第 9 次尝试中得分。
现在,让我们用贝叶斯统计来理解这一点。我们认为杜兰特投中三分球的概率是一个变量 p。接下来,我们评估杜兰特最有可能投中上述统计线的 p 值。这是一个基本的最大似然估计问题。使用贝叶斯定理,我们得到:
作者图片
上式有 P§项。很诡异,不是吗?毕竟 p 本身就是一个概率。我们必须确定这些概率之间的差别。P(H)=p 是杜兰特硬币落地头的几率(杜兰特三分命中)。P§是 p 等于特定值的概率。例如,如果 p=0.3,杜兰特有 30%的可能性投进三分球。P(p=0.3)量化了杜兰特投中三分球的概率是 0.3 的概率有多大。
总之,通过计算上面的 lhs,我们可以量化 p 等于值 p 的可能性。
P(Statline|p)是见证杜兰特 1/8 stat 线的几率给定他的三分得分概率为 p,如上所述,它遵循二项分布。
作者图片
熟悉贝叶斯统计应该有助于你回忆分母,P(统计线)是一个常数。此外,对于最大似然估计,P§遵循均匀分布。也就是说,我们假设 p 同样可能是 0 到 1 之间的任何值。因此,最大化 P(p|Stat-line)与最大化 P(Stat-line|p)是等价的。你可以承担所有计算的负担,或者相信我 P(p|Stat-line)对于 p=1/8 是最大的。
上述结果表明,如果杜兰特的三分得分概率为 1/8,那么他最有可能打出 1/8 的统计线
我们的下一步是确定 p 不是 1/8 的概率。 同样,由于 P(Stat-line)是一个常数,P§是均匀的,所以绘制 P(Stat-line|p)和度量可能性 P(p|Stat-line)就足够了。
假设 p=0.05,0.125,0.2,0.3 和 0.4。
作者图片
如前所述,P(H|Stat-line)在 p=0.125 时最大。然而,有一个合理的概率 p=0.2。类似地,尽管很少,p 仍然有可能等于其他值。
我们可以扩展上面的过程来绘制范围(0,1)中更多的 p 值。
作者图片
import numpy as np
import matplotlib.pyplot as plt
n=[20,30,100,1000]
f,ax=plt.subplots(2,2,figsize=(20,10))
ax=ax.flatten()
for i in range(0,4):
P=np.linspace(0,1,n[i])
Y=P*(1-P)**7
ax[i].plot(P,Y)
ax[i].set_title(str(n[i])+'points in range (0,1)')
ax[i].set_ylabel('Likelihood',size='15')
ax[i].set_xlabel('p',size='15')
请注意,当我们绘制更多 p 值的可能性时,我们会倾向于平滑连续的曲线。这暗示了这里有一个概率分布, 概率分布的概率准确地说是 ,埋在上面的情节里。
2.发掘分布
好吧,我们在杜兰特的 P(p|stat-line)似然图中建立了一个概率分布函数(pdf)的存在。如何获取?让我们反弹到 P(p|Stat-line)并解密贝叶斯方程。
作者图片
如果你学过连续概率分布,你一定学到的第一件事就是 pdf 曲线下的面积总是 1。因此,如果我们的目标是收集 P(p|Statline)的 pdf,我们可以将函数 P(Statline|p)除以它的面积,这正好等于 P(Stat-line),这是我们在上面的图中忽略的常数。
作者图片
接下来,由于 P§遵循 0 和 1 之间的均匀分布,我们应该用差分 dp 来代替它。不要被它在等式中的存在所困扰。它在 pdf 的情节中没有任何作用。因为 L.H.S 是 p=P(某数)位于区间(a
作者图片
你认识上面的功能吗?你遇到过吗?没有任何证据,我向你保证,这是臭名昭著的测试版。
作者图片
杜兰特的得分概率§因此,基于 1/8 的 stat 线,遵循参数为 2,8-beta(2,8)的 beta 分布。(比较贝塔函数方程和 P(p|Statline))贝塔分布服从一个有趣的规律。
3。贝塔分布的附加性质
首先,beta(1,1)只不过是一个均匀分布。记住,我们假设 P§服从均匀分布。在机器学习行话中,P§是先验,P(p|Stat-line)是后验。
为了估计概率分布,分析师建立一个先验的、有根据的分布猜测。在观察数据后,他们求解上述贝叶斯方程并计算后验概率,即修正的估计值。
在我们的问题中,先验是β(1,1),后验是β(2,8)。我们知道杜兰特投了 1/8 篮。从硬币的角度来看,八次投掷中,只有一次正面朝上。利用 toss 结果,你能把先验和后验联系起来吗?
作者图片
我们可以对此进行概括。如果有一个 beta 先验,其中参数 x,y- x 表示正面,y 表示反面,并且一个观察数据集有 h 个正面和 t 个反面,那么后验将是 beta(x+h,y+t)。你可以通过进行所有的计算来验证这一点。很简单。
4。更新凯文·杜兰特的先前
到目前为止,我们将凯文·杜兰特的三分得分能力建模为抛硬币。我们从一个统一的先验β(1,1)开始,并根据一个游戏将其更新为β(2,8)。将此作为一种赌博策略将是残酷的。是我们弥补的时候了。
在接下来的第五场比赛中,杜兰特三分球 9 投 4 中。重新评估后,他的后角是β(6,13)。
作者图片
根据第五场比赛的数据,杜兰特投中三分(抛头)的概率似乎最有可能在 0.3 左右。接下来,让我们用他前三场比赛的统计数据来计算后验概率。
游戏 1:1/4;游戏 2:4/6;游戏 3: 3/8
在考虑了所有 5 款游戏后更新了后验版:beta(14,23)
作者图片
最新的函数在 p=0.378 时达到最大值,非常接近杜兰特职业生涯的平均值 0.384。或许,的佐证回归到了的意思。此外,了解 pdf 如何在具有额外数据的精简区域中膨胀。贝塔曲线 的垂直膨胀或 递减平坦,在继承了更多数据后,流露出对特定概率估计的乐观。
作者图片
这是对凯文·杜兰特三分成功率概率建模的一次适度尝试
结论
在本文中,我试图提供一个直观的测试版背景。虽然我们关注的是三分球,但我们同样可以模拟任何其他遵循二项式分布的统计类别(抛硬币特性)。概率的 概率的 是一个难以解释的奇异理论。我希望你现在对此有所了解。更重要的是,beta 分布的特征,特别是降低的平坦度,是一个数学上的理由,解释了为什么一个人不愿意购买一个只有十个评价的 5 星产品(阅读更多相关内容)。根据最新数据,这一评级肯定会有所不同。谢谢你坚持到最后!
参考
https://www . basketball-reference . com/季后赛/2021-NBA-东部-半决赛-雄鹿-篮网. html
我们能从开放的芝加哥 Airbnb 数据中学到什么?
潜在的房东和房客都可以从免费提供的数据中了解到很多关于价格和位置的信息
图片来源:J. Crocker,via 维基共享资源
在天气暖和的时候去芝加哥玩很有趣,但是想出住在哪里和在 Airbnb 上找到最划算的地方却很有挑战性。我最近发现 Airbnb 公开了大量他们的数据——当然,这要求我利用一些机器学习和统计来理解它。
具体来说,这里有一些我想回答的问题:
- 哪些因素对上市价格的影响最大?息息相关:如果我刚在芝加哥买了一套房产,想在 Airbnb 上挂牌,应该定什么价格?
- 一年中,哪些社区的房价变化最大?
- 根据主持人给出的描述,我们可以了解到一些街区的什么特征?
我回答这些问题的代码和推理可以在这个 Github 库的 Jupyter 笔记本中找到。这个项目的数据是(在 2021 年 11 月 29 日)从 Airbnb 内部的下载的,这使得它可以在知识共享署名 4.0 国际许可下使用(免责声明在这里是)。
第一部分:价格建模
上面第一个问题基本上是关于价格建模的。这些数据包括每份房源的几十个特征,比如卧室数量、它所在的街区以及提供的便利设施。每个列表的每夜价格也给定了,因此有足够的信息来训练一个模型,该模型在给定列表中其他信息的情况下预测价格。
我最初的猜测是什么对价格影响最大?卧室的数量,邻居,和“房间类型”(共享房间,整个房子,等等。).我喜欢使用 violin plots 快速获得洞察力,它超越了平均值或中值等简单的统计数据,以直观清晰的方式提供了有关更广泛分布的大量信息。首先,我们来看看价格与房型的关系:
作者图片
对于给定的房间类型,给定价格的小提琴的宽度告诉我们这个价格有多常见,中间的白点代表中值价格。我们发现房间类型和价格之间有很强的相关性:整个家庭/公寓比合租房间要贵得多,酒店房间的价格显然相差很大。
价格也与卧室数量密切相关,并在一定程度上取决于社区:
作者图片
作者图片
一种叫做弹性网的技术对于定量评估不同因素的重要性是有用的。这是一个“智能”回归程序,试图自动找出哪些信息不会影响价格。此外,最终模型参数(即系数)的大小表明哪些因素最重要。
那么,弹力网给了我什么?以下是一些最重要的因素:
作者图片
请注意,所有这些功能都有积极的作用,除了只有一个浴室——当跟团旅行时,只有一个浴室会很不方便!事实证明,前九个因素都与房产大小有关:卧室、浴室的数量,或者可以容纳的人数(不幸的是,没有提供平方英尺)。
弹性网络模型在确定特征重要性方面做得很好,但它不是最好的价格预测器:它的中值误差为 31%。我尝试了其他几种模型;我取得的最好成绩是所谓的 k-最近邻模型,中值误差为 22%,这意味着对于大约一半的房源,它预测的价格在其标价的 22%以内。我可以用这个模型来为假设的芝加哥未来上市定价;例如,参见我的 Github 库。
第二部分:价格随时间的变化
如果我住在芝加哥的一套公寓里,想赚些外快,一个合理的做法可能是偶尔通过 Airbnb 出租我的房间或整个地方。当然,有客人来会带来一些不便,特别是如果我决定租下整个地方,并且在那段时间不得不找其他地方住,所以我会选择价格最高的时候。如果我是一个潜在的买家,我也会想知道哪些社区最适合实施这种策略——因此,问题是,随着时间的推移,哪些社区的价格变化最大?
对于每一处房产,我查看了其价格在一年中的标准差(可变性的一种度量),然后除以其全年的平均价格。例如,如果某项资产的结果是 0.2,那么该资产的价格在一年中平均变化约 20%。然后我看了看这些数字按街区的分布,得到了如下的小提琴图:
作者图片
有些社区,比如近西区和下西区,看起来不太适合实施我的策略。价格没有太大的变化:很少有房产的价格变化超过 30%。我不会从我的策略中获益多少。另一方面,Near South Side 看起来特别有前景,随着时间的推移,许多地方的价格波动很大。
因此,对我来说,更仔细地观察一下附近的南区,分离出哪些时段特别有利可图是有意义的。为了深入了解这一点,我可以绘制出这一地区一段时间内的平均房价:
近南区的房屋在一年中的平均价格。第 0 天是 2021 年 10 月 18 日。红点从左到右分别是 11 月 26 日星期五;12 月 31 日星期五;6 月 4 日星期六;9 月 19 日星期六。图片由作者提供。
显然,我应该把重点放在列出我周末出租的房子上;工作日的价格要低得多。我还应该在夏季更频繁地租房,从六月的第一个周末开始。我不应该太担心新年过后的租房问题,因为那时房价很低,变化也不大。最后,我可以在感恩节和新年周末以及九月中旬得到一个高价格(我猜这种需求是由许多大学生搬进来驱动的),所以我真的应该试着在这些时间租房。
第三部分:邻里是什么样的?
主人通常会简单描述一下他们房产所在的社区。从这些对附近房产的描述中,我可以了解到什么样的社区特征?
回答这个问题的一个很好的工具是“单词云”,它显示描述中最常见的单词,最常见的单词显示为最大的单词。这是林肯公园的一个:
作者图片
在我看来,密歇根湖、动物园、德保罗大学、自然和历史博物馆、一所温室和市区都在林肯公园附近。关于出行,我猜很多东西都在步行距离之外,棕色线穿过它。我猜这是一个相对古老的街区,有很多树,但附近也有很多购物场所,还有很多咖啡馆、餐馆和酒吧。我去过林肯公园,所以我知道上面单词云的这些建议是相当准确的。
我不太熟悉的近南区怎么样?
作者图片
难怪这个地区的物价在某些时候会很高。菲尔德博物馆、阿德勒天文馆、谢德水族馆、格兰特公园、自然历史博物馆和艺术学院都在附近。麦考密克会议中心就在附近,这也可以解释为什么这里的价格随时间的变化很大(当镇上有会议时,需求急剧增加)。熊队在这里的士兵球场比赛,这也可能在足球赛季的周末产生更多的需求。
显然,还有改进的空间和各种进一步的问题需要回答。我如何创建一个更好的定价模型?20%左右的中值误差仍然很高。此外,我如何确定最优价格(即最大化预期回报),而不仅仅是预测实际列出的价格?也许一些主机使用的价格太低或太高,通过更好的定价模式可以赚更多的钱。此外,数据中还提供了关于评论分数的信息,这将有助于主机了解哪些因素对糟糕的评论影响最大——这是另一个有趣且潜在棘手的建模问题。
一个复杂而重要的话题是 Airbnb 对住房负担能力的影响。提供数据来评估这一点是 Airbnb 内部的一项关键任务。虽然我预计非居民东道主会产生最大的影响,但在我看来,所有潜在的东道主都应该在其所在的城市进一步研究这一点。这是另一篇文章的主题,它必须整合来自另一个来源的关于长期租赁价格的数据。
我希望你喜欢我的帖子!请随意查看我的代码,如果有任何建议或研究想法,请联系我。
你能用 GNNs 做什么
图形神经网络的操作、效用和优势
由于图形数据结构无处不在的特性,图形神经网络(GNN)越来越受欢迎。图表使我们能够在诸如(但不限于)生物学、社会学、生态学、视觉、教育、经济学等领域对许多不同的科学问题进行建模。此外,图形表示使我们能够处理大规模的非结构化数据。
在本文中,我将展示如何在分类、聚类和可视化等任务中使用简单的 GNN。我将使用一个 GCN(图形卷积网络)运行的例子。这将为你提供巨大的直觉,将意识形态扩展到自己的领域。
艾莉娜·格鲁布尼亚克在 Unsplash 上的照片
GNN 的形式表示
任何 GNN 都可以表示为包含两个数学运算符的层,聚合函数和组合函数。使用 MPNN (消息传递神经网络)框架可以最好地理解这一点。
图:作者图
聚合
如果我们考虑上面的示例图,聚合器函数专门用于组合邻域信息。更正式地说,聚合可以表示为:
作者引用的等式(https://arxiv.org/pdf/1810.00826.pdf)
简单来说,第 k 个 GNN 层的节点 v 的邻域聚合是用层 **k-1 的邻居节点 u 、 hᵤ 的激活来表示的。**v 的邻居表示为 N(v) 。在第一层 k-1=0 ,即回退到节点特性。在第一层中,我们简单地聚集邻居的初始特征。在 GCN 的情况下,聚合器简单地是度归一化的平均值(每个消息通过 v 和 u 的度的乘积的平方根来归一化)。只要操作是顺序不变的(结果不会被混洗改变),人们可以想到各种聚合器,例如 max、mean、min 等。
结合
邻居信息与节点本身的组合在下面的等式中正式表示。
方程式由作者引用(https://arxiv.org/pdf/1810.00826.pdf)
这里可以使用不同的操作,例如连接、求和或元素池操作。不同的 GNN 架构依赖于不同的功能。GCN 使用平均值,我们将在下面讨论。
在上面的图图中,我们可以通过X1/(sqrt(7×2))
来聚合节点 1 到 6 的特征,X1 是节点 1 和 7 的特征,2 分别是节点 6 和 1 的度。对于每个节点,我们可以这样做。直观地说,我们可以认为这是每个节点通过平均其出度向其他节点传递消息,然后通过平均其入度接收其他节点的消息。因此得名 MPNN 。
对于邻接矩阵 A 和度矩阵 D 具有特征 X 的图 G(V,E) ,这可以通过 D(-1/2)XAD(-1/2) 轻松实现。通常情况下,邻接矩阵加上 I (单位矩阵)来体现节点自身的特征。在这种情况下, A 表示为**—(A 帽)并且 D 被替换为 D 帽,其中 D 帽对应于 A 帽。此时,我们已经在几个矩阵运算中执行了聚合和组合。得到的矩阵被馈送给可训练的可微分函数*【ɸ】***,该函数通常是 MLP(多层感知器),即神经网络。
堆叠层
我们讨论了在 GNN 层中会发生什么,现在想象我们堆叠几个这样的层。这意味着我们在邻接矩阵上做更多的乘法。如果你熟悉随机游走, D^(-1)A 被称为转移矩阵。其用于幂迭代直到收敛,以找到从给定节点到另一个节点的随机行走概率。直观上,我们添加的 GNN 层数越多,聚合的跳数就越多。或者换句话说,在一层之后,我们有节点及其邻居的信息。当我们再次这样做时,邻居(他们有他们的邻居)被再次聚集。因此是 2 跳,依此类推。
示例时间!
PyTorch 几何框架
使用 pytorch 几何库可以很容易地实现 gnn。在那里,您可以找到 GNNs 的许多实现和一个消息传递类,以供您自己的定制实现使用。请点击以下链接查看。
Cora 数据集
我们将使用受欢迎的 Cora 数据集,它由 7 类科学出版物组成。它通过引用连接,引用代表节点之间的边,这些节点是研究论文。
作者图片
使用 networkx 的图形可视化产生了上面的图像。我们可以看到很少的颜色聚集在一起,但我们从任何一种满足感。因此,让我们降低特性的维度,并进行更多的探索。
UMAP 论特征
解释数据的一个简单方法是查看那里有什么以及它们是如何放置的。UMAP 是一个非常有用的多元学习工具,它让我们能够做到这一点。让我们想象一下。
作者图片
我们可以看到一些类的本地化,但并不完美。上述操作的简化代码如下(完整代码在文末);
# essential imports that will be needed throughout the blog
import torch
import torch.nn.functional as F
from torch_geometric.datasets import Planetoid
from torch_geometric.nn import GCNConv
import matplotlib.pyplot as plt
import seaborn as sns
import umap
import networkx as nx
import numpy as npdataset = 'Cora'
path = "./"
dataset = Planetoid(path, dataset, transform=T.NormalizeFeatures())
data = dataset[0]embd = umap.UMAP().fit_transform(data.x.numpy())
plt.figure(figsize=(10, 10))
sns.scatterplot(x=embd.T[0], y=embd.T[1], hue=data.y.numpy(), palette=palette)
plt.legend(bbox_to_anchor=(1,1), loc='upper left')
我们肯定不满意我们所看到的,所以让我们试试 GCN,看看可视化。我的网络如下(由我从 pytorch 几何 github 实例修改而来);
class Net(torch.nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = GCNConv(dataset.num_features, 16, cached=True)
self.conv2 = GCNConv(16, 16, cached=True)
self.fc1 = torch.nn.Linear(16, dataset.num_classes) def forward(self):
x, edge_index, edge_weight = data.x, data.edge_index,
data.edge_attr
x = self.conv1(x, edge_index, edge_weight)
x = F.relu(x)
x = F.dropout(x, training=self.training)
x = self.conv2(x, edge_index, edge_weight)
x = F.relu(x)
x = F.dropout(x, training=self.training)
x = self.fc1(x)
return F.log_softmax(x, dim=1)
我们可以使用以下代码对此进行训练:
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model, data = Net().to(device), data.to(device)
optimizer = torch.optim.Adam([
dict(params=model.conv1.parameters(), weight_decay=5e-4),
dict(params=model.fc1.parameters(), weight_decay=5e-4),
dict(params=model.conv2.parameters(), weight_decay=0)
], lr=0.01)def train():
model.train()
optimizer.zero_grad()
F.nll_loss(model()[data.train_mask],
data.y[data.train_mask]).backward()
optimizer.step()
注意,在 Conv 层 2 中缺少 L2 正则化子,这是 GCN 的作者凭经验决定的(【https://github.com/tkipf/gcn/issues/108】)。
可视化后,输出如下所示;
作者图片
我们可以看到,不同的阶级有着非常明显的区别。这里,训练以 0.7800 的测试精度结束。我们能再多操纵一下吗?让我们看看。
嵌入损失
神经网络可以看作是连续的可微函数。分类本质上是学习预测的决策边界。点击此处了解更多关于决策界限的信息;
总之,如果我们强迫网络有更好的边界,我们可以有更好的可视化。这意味着,我们应该能够分别看到这些类。这在我们可视化集群数据时特别有用。我们能做的一件简单的事情是:
- 请 GNN 更紧密地嵌入类似的类
- 请 GNN 进一步嵌入不同的类
请注意,嵌入是网络的最终层输出或分类输出。在这种情况下,我们可以使用点积作为距离的度量。对于这种损失,我们准备如下的数据点对;
y_neg_pairs = []
y_pos_pairs = []data_idx = np.arange(len(data.x))
for idx1, y1 in enumerate(data.y[data.train_mask].cpu().numpy()):
for idx2, y2 in enumerate(data.y[data.train_mask].cpu().numpy()):
if idx1 > idx2 and y1!=y2:
y_neg_pairs.append([idx1, idx2])
if idx1 > idx2 and y1==y2:
y_pos_pairs.append([idx1, idx2])y_neg_pairs = np.array(y_neg_pairs)
y_pos_pairs = np.array(y_pos_pairs)
我们修改的损失函数如下:
model_out = model()[data.train_mask]
y_true = data.y[data.train_mask]
nllloss = F.nll_loss(model_out, y_true) #Negative loss
disloss_neg = F.logsigmoid(-1 * (model_out[y_neg_pairs.T[0]]*model_out[y_neg_pairs.T[1]])).sum(-1).mean()
#Positive loss
disloss_pos = F.logsigmoid((model_out[y_pos_pairs.T[0]]*model_out[y_pos_pairs.T[1]])).sum(-1).mean()
loss = 10 * nllloss - disloss_neg - disloss_pos
请注意,我们处理点积的极性,并将其传递给 logsigmoid,以获得基于点积的损耗。如果你感兴趣,这可以在 GraphSAGE paper(https://arxiv.org/abs/1706.02216)下研究。
现在我们的训练以损失 0.7720 结束,比以前略有下降。让我们想象一下 GNN 和 UMAP 的输出。
作者图片
我们可以看到集群现在更好了,噪音也稍微小了一些。尽管我们的准确度较低,但我们有更好的聚类分离。实际上,较小的测试损失是由于簇的不确定性。我们可以看到一些点自信地位于错误的颜色群中。这本质上是数据的性质决定的。
将该思想扩展到无监督聚类
当我们没有标签,只有特征和图形时,我们如何扩展这个想法。这已经在 GraphSAGE 中讨论过了。简单的想法是使用图拓扑将更近的节点嵌入更近的节点,反之亦然。代替我们的正对和负对,我们可以有直接连接对和随机对分别作为正对和负对。这在各个领域都显示了良好的效果,这是另一天的主题!😊
我希望你喜欢这篇文章,我相信这对你的研究也会有用!
和其他文章一样,这篇文章也附带了笔记本!
什么导致什么,我们怎么知道?
提示和技巧
面对关于新冠肺炎、气候变化、种族主义和其他争议的大量错误信息,数据科学家可以使用可靠的因果推理来帮助我们找出该相信什么
马库斯·温克勒摄于 unsplash . com:Markus-Winkler-yypmca 32 u _ M-unsplash . jpg
我们天生渴望了解为什么重要的事情会发生或可能发生,这是我们寻找因果关系的特征。然而,根据波兰经济学家和哲学家 Mariusz Maziarz (2020)的说法,2000 多年的思考并没有让我们就什么是因果关系或如何安全地断言因果关系达成一致。这使得人们很难区分真相和炒作。
根据 James Woodward (2005)的说法,哲学家从两个方面思考因果关系:
1.它是什么,我们如何推断因果关系,和/或
2.不同群体的人如何理解因果关系。
伍德沃德的第二点很重要,我会在另一篇文章中再谈。例如,我们如何理解(或未能理解)因果关系决定了我们如何解释关于新冠肺炎起源的陈述;测试对它的效用;应该如何、何时以及为谁进行测试;社会距离、遮蔽和疫苗是否真的有效;又是为了谁。
我们如何思考因果关系,以及我们选择如何推断因果关系,也决定了我们在哪里以及如何寻找因果关系。这在科学、医学和公共政策中很重要。我们对因果推理的假设和方法经常导致公共政策在应对气候变化或新冠肺炎等感知威胁时可能效果不佳。它们还影响联邦或私人资助的癌症研究投资规模、打击国内外恐怖主义、种族主义、健康和福利计划以及许多其他问题。
一种因果机制是否应该适用于所有人,或者因果关系是否会因性别认同、年龄、种族、民族、教育、地区、国家、时间段或收入水平而有所不同?我们将在下次调查这些问题。为了做好这一点,我们需要一个基本概念的基础,即一件事或事件引起另一件事或事件意味着什么,以及我们应该如何试图推断因果关系。我们还必须明白如何处理主要基于拙劣因果推理的错误信息(更不用说明目张胆的政治议程和权力欲了)。在这篇文章中,我将通过总结该领域领先专家的工作来提供基本的基础。
哪些因果观念引导着我们的思维?
关于因果关系的争论渗透到几乎每一个社会问题中,我们分裂的政治、离奇的阴谋论的存在以及关于哪些理论是阴谋还是真实的分歧都证明了这一点。因果推理方法(例如,我们如何决定我们幸福或疾病的真正原因)在许多问题上有很大不同。
例子包括观察到的原因和其声称的结果之间应该存在多长时间(如果有的话),以及关于安全地假设情况或事件确实是因果关系所需的证据的类型和数量的分歧。是事件 A 导致了结果 B 还是 B 导致了事件 A?或者,我们观察到的 B 的下游变化是否完全是由其他原因引起的?进行更多的测试会导致 COVID 病例的增加吗,正如一些知名人士所建议的那样,或者这些额外的测试只是发现了更多由于其他更可能的原因而已经存在的病例?
在某些情况下,A 和 B 可能会循环工作,相互造成。例如,投资股票市场可能会产生更高的收入和财富,这些收益可能会刺激更多的股票投资。这些先有鸡还是先有蛋的场景可能很难解析。
丹尼尔·塔特尔在 Unsplash.com 上的照片:丹尼尔-塔特尔-BPGPk_n7rkc-unsplash.jpg
Maziarz 和其他哲学家研究了五种分离因果影响的方法,包括如下。我们可以用这些来改进我们的因果推理,下面有一些附带条件。
规律性假设一个原因总会产生一个结果,没有例外。自然法则提供了行为规律性的例子。由重力引起的定期发生的波浪作用和潮汐就是例子。一些早期的哲学家要求必须存在一个“B 总是遵循 A”的模式来推断因果关系。
概率推理不要求一个原因每次都会产生一个结果。在这种情况下,原因提高了其结果的概率,但是结果并不总是发生。吸烟与心脏病和各种癌症之间的关系就是这样的例子——不是每个吸烟者都会患这些疾病,但有很高比例的人会。
反事实推理提出了如果 A 没有发生,事情会如何不同的问题。关于政府是否应该扩大失业救济以减少疫情经济困难的争议可以被视为对反事实情景的分歧。比如,一些人认为每周额外提供 300 美元的失业救济金导致了美国劳动力短缺。他们说,如果我们不这样做(即,在反事实情景下),更多的失业工人将寻找工作。不过,到目前为止,支持这种反事实观点的证据还很薄弱。在扩大的新冠肺炎福利到期后,劳动力短缺几乎没有改善,因此每周额外的 300 美元可能不会导致工人短缺(Combs 等人,2021)。
机械推理是另一个“如何”的问题,通常涉及深入探究 A 如何导致 b。例如,辉瑞和 Moderna 疫苗如何给新冠肺炎带来高水平免疫力的 mRNA 科学导致了因果关系的直接解释。这项科学极大地影响了这些疫苗的制造、储存、分发和应用,从而降低了 COVID 的住院率和死亡率。
操纵推理指的是“做 A”,而不是让 A 自然发生。这里的含义是,人类或其他对 A 的干预导致了结果 B。相关的问题包括,要使 B 可见需要多少 A,如果我们改变了 A 的水平,那么我们可以期望看到多少 B?旨在寻找最安全和最有效的新药剂量的研究就是操纵的例子。最低工资、就业和购买习惯之间的关系也说明了操纵因果关系的影响。
每种方法都有细微差别或亚型,它们在潜在的哲学基础、挑战和对公共政策的适合性方面有所不同,Maziarz 将他的大部分文本致力于这些问题。他还描述了这些因果推理方法在应用时如何相互重叠。下表大致基于他的工作,并呈现了我对他描述的五种方法的总结。
表 1:因果推理方法概述
当我们推断因果关系时,有五种方法可供选择,是否有一种方法在所有情况下都是最好的?不幸的是,每种方法都有优点和缺点,这些都是特定情况下的。表格中只列出了一些利弊。请参阅许多其他参考资料。
数据科学家如何提高因果推理?
考虑因果关系的多种方法将增加我们的因果解释是正确的可能性。如果几个(甚至至少两个)有效的方法已经被应用并导致一致的结果,并且如果其他执行良好的因果关系推断方法没有很快否定这些一致性,那么我们更有可能正确地推断出干预是否是真正的因果关系。
Russo 和 Williamson (2007)提供了这一概念的一个例子,他们说,将机械论和概率学方法结合起来,可以在医疗保健应用中产生关于因果关系的更强有力的见解。当药物或疫苗的作用机制及其预期效果发生的概率已知时,对因果关系的合理推断是可能的。
在无法进行精心设计和执行的随机对照试验的情况下,多重因果方法尤其有用。这种随机对照试验通常将理论与机械、操纵和/或反事实方法相结合。因此,RCT 可能会分离出干预对感兴趣结果的影响。执行良好的随机对照试验通过调整许多可测量和不可测量的因素来做到这一点,否则这些因素可能会混淆因果解释。
然而,在很多情况下,由于后勤、伦理、行为、预算或其他原因,RCT 无法进行。在这种情况下,好的准实验或其他仔细的研究也可以应用多种因果推理方法。综合起来,这些将导致更强的因果关系陈述,我们可以休息我们的帽子。
例如,在不同的情况下,通过不同的手段在不同的物种之间复制科学研究,并通过对烟草公司行为的新闻调查得到加强,导致吸烟导致癌症的广泛接受。没有 RCT 可以在人类身上解决这一假设,因为将吸烟状态分配给人们来看谁最终会得病,谁不会得病,这是不可能的,也是不道德的。
另一个例子是利用 DNA 研究来宣告那些被判无罪的人无罪,尽管早期的证据表明事实正好相反。例如,如果从留在谋杀现场的体液中提取的 DNA 表明嫌疑人不太可能犯罪(因为嫌疑人与可能的罪犯没有相同的 DNA 特征),他或她可能没有谋杀受害者。这将是一个概率因果推理的例子。
在这些领域和其他领域进行良好的概率、机械、反事实或操纵研究有助于阐明因果路径。他们还可以提供证据,证明早期调查中的错误成本。
局限性和进一步探索
已经有一些关于因果关系的有用的教科书和文章,作者是著名的思想家,他们在学术出版社和同行评审期刊上发表文章。他们的一些原理和方法已经在走向数据科学或媒体的其他地方的短文中描述过。我没有必要在这里详述他们在方法论上的贡献,也不可能在这么短的篇幅里给他们应有的空间。相反,我在这里的意图是提出 Maziarz (2020)描述的关于因果推理的哲学观点,然后将这些哲学与 Pearl (2009)、Morgan 和 Winship (2015)以及其他人(例如 Pearl 和 Mackenzie (2018))提到的一些原则和方法联系起来;Woodward (2005 年),以及 Russo 和 Williamson (2007 年)。
影响研究设计和方法的哲学和原则的深思熟虑的结合对于数据科学家和其他研究人员来说是非常有价值的。这将有助于他们为雇主、消费者和政策制定者令人信服地描述什么导致了什么,什么没有,以及如何最好地解决令人烦恼的商业或社会问题。在这次努力中,我只是触及了表面。
卡伦·艾姆斯利在 Unsplash.com 上的照片:kalen-emsley-G1qxBDxM8vE-unsplash.jpg
因此,这篇文章留下了许多未被覆盖的领域。我没有提到的其他重要问题包括:
如何应用五种方法中的每一种?每种方法的适当步骤是什么?Morgan 和 Winship (2015)在文中对社会科学研究中使用的反事实的原则和方法进行了全面的回顾。他们提出了一些问题,比如在决定学生在学校的表现以及他们成年后最终能挣多少钱时,家庭背景和内在智力哪个更重要。摩根和温希普还阐述了社会经济地位是否会导致健康水平和死亡率的差异。Maziarz (2020 年)回顾了所有五种因果推断方法的文献和若干应用,侧重于许多领域的经济政策分析。
采用坚实的概念或理论框架如何指导因果分析? 我读过的每一本关于人工智能、机器学习、深度学习的教科书都强调依靠坚实的理论和人类专业知识进行指导的价值。Pearl (2009)和 Morgan 和 Winship (2015)也是如此,他们描述了如何使用有向无环图来直观地显示因果关系。我们生活在一个不确定的世界,但是如果可靠的理论和方法被反复应用,不确定性并不排除因果推理。
这五种方法的影响力和受欢迎程度如何?对一种方法或特定方法组合的偏好在多大程度上帮助或伤害了对因果理解的探索? Maziarz (2020)在经济政策研究中解决了这些问题,Morgan 和 Winship (2015)为其他社会科学解决了这些问题。例如,在过去几十年的社会科学研究中,匹配干预和控制对象,或者在分析中给予这些对象不同权重的倾向得分方法已经大受欢迎。然而,像任何其他方法一样,倾向分数可以应用得好或不好,导致正确或不正确的因果陈述。摩根和温希普提供了详细的例子。
读者如何区分好的因果方法和那些来自非科学阴谋论的方法?Pearl(2009)的文章关注的是关于吸烟和癌症的争议,但他和他的合著者 Dana Mackenzie (2018)描述的因果阶梯方法对于找出许多阴谋论的错误也非常有用。他们的因果阶梯包括 Maziarz (2020)描述的五大因果方法中的几个,并在上表中进行了总结。关于新冠肺炎,其他研究人员正在应用对生物化学原理的强烈依赖,以及描述人体如何工作的机制的清晰说明,以帮助消除许多关于 COVID 疫苗的错误信息。
因果论错了的代价是什么?几十年来,关于吸烟的争论引发了数以百万计的心脏病、中风、残疾和死亡,我们看到了这些代价;Pearl (2009)很好地解决了这个问题。
我们也看到了今天错误的因果关系的代价,更多的病例,长期残疾和不必要的死亡,因为错误信息专家继续对所谓的新冠肺炎不严重的毫无根据的观点和口罩的有限效用,社会距离,测试和疫苗。不幸的是,错误信息的成本(即在关于 COVID 的争论中滥用因果推理的成本)被政治法令放大了,因为政治家错误地禁止或限制了使用有效的方法来解决疫情。
关于气候变化,犯错的代价可能从应对气候变化的资金不足或使用不当,一直到地球温度持续上升带来的生存威胁。关于因果关系的争论(例如,人类是否导致了全球变暖,我们真的能控制它吗?)还会继续。
科学指导下的有充分根据的因果解释可以为关于这些和许多其他争议的有益讨论提供基础,但只有当我们真正愿意资助好的研究并在安全的环境中进行尊重和深思熟虑的讨论时。
结论
虽然在过去的 30 年里,因果推理取得了重大进展,特别是由于上述作者及其同事的影响,但仍有许多问题需要解决。应用可靠的因果理论、原则和方法的数据科学家将帮助我们理解世界的真实运作方式。利用合理的因果推理方法,以及其他方法来对抗错误信息,将带来更好的研究、更聪明和更有效的公共政策,以及我们这个星球上更好的健康和福祉。
鸣谢
我要感谢 Mariusz Maziarz 博士审阅了本文的草稿,并提供了许多有用的评论,澄清了我对因果推理的理解和介绍。任何遗留的错误都是我的。
参考文献
K.Coombs,A. Dube 和 C. Jahnke 等人,提前撤销疫情失业保险:对收入、就业和消费的影响,https://files . michaelstepner . com/pandemicUIexpiration-paper . pdf
米(meter 的缩写))Maziarz,《经济学中的因果关系哲学》( 2020 年), Routledge-Taylor & Francis 集团,纽约
南 L. Morgan 和 C. Winship C,《反事实和因果推理:第二版》( 2015 年),剑桥大学出版社,英国剑桥
J.珀尔,《因果关系:模型、推理和推论》,第二版(2009 年),纽约剑桥大学出版社
J.Pearl 和 D. MacKenzie,《为什么之书:因果的新科学》( 2018 年),纽约基础图书公司
F.Russo 和 J. Williamson,解释健康科学中的因果关系(2007),科学哲学中的国际研究 21(2):157–170
J.伍德沃德,《让事情发生:因果解释理论》(2005),牛津大学出版社,英国牛津
可视化时间序列时使用哪种图表类型
关于可视化时序数据时如何以及何时选择条形图而不是折线图的提示
杰克·希尔斯在 Unsplash 上的照片
D 数据可视化是向更广泛的受众传达信息的强大工具。这意味着除了使用正确的配色方案、字体大小和字体类型之外;使用适当的图表类型来描述数据也很重要。
本文的重点,从标题可以清楚地看出,是时间序列。按照惯例,我们把时间序列想象成线形图。但是,如果我说这不总是正确的,我们甚至可以使用条形图来可视化时间序列。你会说我在歪曲数据吗,或者用条形图代替折线图可以吗?或者在使用条形图而不是线图时有例外吗?
为了理解这一范式,首先,让我们看看维基百科上的时间序列定义:
在数学中,时间序列是按时间顺序索引(或列出或绘制)的一系列数据点。最常见的是,时间序列是在连续的等间隔时间点取得的序列。因此,它是一个离散时间数据序列。时间序列的例子有海潮的高度、太阳黑子的数量和道琼斯工业平均指数的每日收盘价。
这意味着时间序列中的数据点是离散值,但如果与前面的点存在关系,则是连续的。如果我们看看股票市场,以前的事件会严重影响当前的价格。因此,我们可以有把握地说,历史数据影响当前数据,因此是连续的。我们使用线图来可视化这些类型的时间序列。因为两个数据点之间的斜率可以提供信息,或者我们可以对数据进行插值以提取新的信息。
另一种时间序列是数据点不相关的情况。这些类型的时间序列就像比赛,世界纪录,或者,比如说,一个国家获得的奥运奖牌。对于这种类型的时间序列,计算相邻数据点之间的斜率或对数据进行插值不会增加任何值。因为历史数据之间的关联非常弱。在这种情况下,最好使用条形图来表示数据。
现在的问题是,在处理时序数据时,应该选择哪种图表类型。试着回答以下问题。这些问题的答案将引导您找到最能代表您所追求的时间序列的图表类型。
—您正在处理什么类型的时间序列?
—当前数据是否受到历史数据的影响?
—对数据进行插值有意义吗?
—数据点之间的时间间隔是小还是大?
回答上述问题将有助于识别数据随时间的变化情况,并指导您选择正确的图表来显示时间序列。
具有相关观察值的时间序列
我们将使用来自 R 提供的内置数据的EuStockMarkets
数据集,并将时间序列绘制成条形图和线图。
第一个图是一个条形图,其中每个条形都是一个离散值,这种类型的图不能提供任何关于任何两个连续指数之间股票表现的信息。这是因为我们无法对数据进行插值,因为运行指数之间没有连续性。
作者图片
如果我们将上述数据重新绘制成一个线图,那么该图将提供两个相邻指数之间的更多信息。由于指数基本上是一个时间单位,所以对数据进行插值更容易从数据中获得隐藏的见解,这在使用条形图时是不可能的。
具有不相关观测值的时间序列
现在,我们使用另一个数据集创建相同的绘图类型。这里,我们将使用美国奥运会总奖牌榜(数据来源:维基百科)。
我们用线性插值(红色区域)将奥运会奖牌数据绘制成折线图,以计算 1980 年获得的奖牌的缺失值。这种图表类型是不正确的选择,因为这里提供的数据与美国队以前和将来的表现无关。一种说法是,两次不同奥运会的参赛队伍可能不一样,比赛场地不一样,天气也不一样,这都会影响运动员的表现。
作者图片
我们再一次用条形图描绘出美国队在奥运会上获得的奖牌总数。对于 1980 年,我们没有绘制数据,因为美国没有参加在俄罗斯举行的奥运会。在下面的图表中,我们要看的是该队在每届奥运会上的表现,所以用缺失值来预测该队在 1980 年的表现是不明智的,因为该数据与过去或未来的表现无关。
作者图片
结束语
从上面的例子中我们看到,当处理具有相关数据点的时间序列时;将数据绘制成线形图是一种很好的做法。如果数据是不相关的,那么条形图比折线图更好。
确定要实现的图表类型的最佳方法是通过询问数据。理解数据,理解它实现或描述的内容,可以打开正确表示数据的大门,而不会有错误的表述。它不仅对当前场景有效,也适用于其他图表类型。确保通过可视化呈现的数据向观众传达了正确的信息。
我撰写的其他与数据可视化相关的文章:
可以在 LinkedIn 和Twitter上与我连线,跟随我的数据科学和数据可视化之旅。或者您可以在 Medium 上关注我,了解有关 R 和 ggplot2 包的数据可视化的最新文章。
关于 A/B 实验分析,漫画能教会我们什么
运用漫画转场的原理讲述风险、回报和确定性的故事
作者图片
当我刚开始运行 web 实验时,我主要是设计和开发它们。一旦这些实验结束,它们就会去找一位分析师,我会被告知测试是否具有*【统计显著性】*。
CRO 的顾问和分析师总是被问到,在给定特定结果的情况下,对于一项实验,什么是正确的决定。但是,我们是否总是拥有有效建议所需的信息?我们确定我们知道我们的实验传达给我们什么吗?
即使在我更多地参与事物的分析方面之后,使用频繁主义的统计术语如“显著性”、“p 值”、“置信区间”、“z 得分”和“功效”都是抽象的概念难以 可视化和难以 沟通。当然,它们会给我们一个布尔型的“是”或“否”的回答,但这对需要细微差别的实验有用吗?
这些统计术语让我想起了斯科特·麦克劳德(Scott McCloud)在他的优秀著作《理解漫画**》中描述的“不符合逻辑的”画面过渡(作为一名* 漫画作家和漫画小说家 ,我倾向于从画面的角度来思考)。*
《剑桥词典》对不符合逻辑的定义是:
“与前一个陈述的意思不一致的陈述”
在书中,Scott 引用了非推理作为面板到面板转换的例子:
图片作者。一个不合理的面板过渡
非推理对于传达情绪和设定基调非常有用。他们邀请读者建立他们自己的联系,因此对一系列图像有意义。结果是一种主观体验——天生的个人和内省。
他提到了另一种更常见的面板到面板的过渡形式(希望是您更熟悉的一种):
图片作者。一个行动到行动面板过渡
这是一个“行动到行动”的面板转换。他们更不愿意被解读。在这里,作者可以更好地控制他们传达给读者的内容,因此,能够进行更加客观和直接的交流。
这与分析和统计有什么关系?嗯,漫画和面板过渡是一种交流方式。这里传达的信息恰好是一个通过一系列连续面板讲述的故事。
如果我们将统计术语和数据视图视为面板*,那么我们需要确保避免不符合逻辑的情况。相反,我们需要确保这些小组相互合作,像行动到行动小组过渡那样更明确地传达信息。*
在《赤裸裸的统计》中,查尔斯·惠兰写道:
“《纽约时报》指出,‘数据仅仅是知识的原材料。’统计是我们利用信息达到某种有意义的目的的最有力的工具……”
换句话说,统计学是从数据中提取含义的有力工具。但是我们试图从我们的实验中收集到什么意思呢?
嗯,我们通常想知道我们的下一步行动应该是什么。为了理解这些行为,我们可以根据目标将实验分为两类:
转化成功实验:这是为了获得转化成功而探索假设的地方。对于这些类型的实验,我们想知道我们的假设是否得到了验证。如果没有,那我们有什么可以学习的吗?
去风险实验:**在这种类型的实验中,人们希望“去风险”某个特性或变更。我们并不特别期待这些测试的胜利,而是确保没有变化的负面影响。我们想知道变异是否可以安全发射。我们会对一个“平淡”的结果感到满意。我们通常也在这里寻找一个快速的结果。
**去风险型实验的挑战在于,我们应该让实验运行多长时间才能确保结果平稳?这是一个很难回答的问题,因此有一种趋势是,这些实验会运行很长一段时间,以“收集更多的数据”。
在上面的两个例子中,当我们有明确的输赢时,frequentist 方法提供的布尔响应通常是好的。除此之外,他们都不是超级有用的。
我们的统计数据需要能够满足上述两种类型的测试。我们需要的是能够告诉我们风险、回报和确定性的统计视图。
我在寻找数据的不同视图,这些视图协调一致地工作,构建一个类似行动对行动小组的序列。结合起来,这些将传达我们需要的意义(或故事)。
希望结果能够为分析师和利益相关者提供更清晰的决策过程。
我还希望减少实验的运行时间。尤其是那些运行时间过长的去风险实验。所有这些以及减少了对高度专业化的统计知识的依赖*——毕竟,频率主义者的方法是复杂的。*
在我研究的过程中,我偶然发现了克里斯·斯图基奥的观点:一项研究揭示了对常客研究结果的普遍误解。辩论的另一方也有 T2 的文章。以及文章辩论辩论本身。
我很幸运在 Trainline 有一个惊人的数据科学团队,作为一个项目来进一步研究这个问题。他们提出了前面提到的克里斯·斯图基奥为 VWO 设计的预期损失。
克里斯解释了这种方法:
计算一个后验概率,用它来估计你选择 A(或 B)的预期损失是否低于关心阈值。如果是,停止测试。”
预期损失让我们看到了与选择测试的特定变体相关的“风险”——即选择变体与对照的转换成本是多少?
特定变异的风险越低越好。特定变体的理想风险为零。
你可以在这里阅读更多关于预期损失。你也可以阅读他的主题为的白皮书。这里就不赘述细节了。我也不会讨论贝叶斯的定义。有很多关于那个的在线资源,包括这个。
我将介绍的是预期损失的一个示例实现。例如,观察一段时间内累积的数据似乎是贝叶斯方法。为每个测试变量绘制一个预期损失线图是有意义的。**
这里有一个例子(这是基于大量实际实验的模型)*:*
图片作者。风险的故事。随着时间的推移绘制的累积“预期损失”。越低越好。
这个观点传达了我们实验中每个变异组的风险。风险越低越好。所以最接近零的变量是最好的。在上面的例子中,这就是控件。
我们可以看到,这条线本身就讲述了一个故事。开始时,数据通常过于嘈杂,无法读取。每个变量的预期损失线相互交错。一段时间后,线条趋于稳定,变得更加稳定。
我们可以选择给预期损失赋予一个货币值,以获得货币形式的风险。
但是风险只是一部分。下面是图片的另一部分(同样,这是基于多次实际实验的实体模型)*。*
图片作者。奖励的故事。随时间绘制的累积“转换率”。越高越好。
在这里,我们展示一下奖励的故事。我们展示了随着时间的推移每个变量的累积转化率。从这个角度来看,越高越好。**
我们现在开始讲述一个更好的实验故事。这个观点有点像预期损失观点的逆。控制组现在在最上面,因为它比变化组转化得更好。
随着时间的推移跟踪贝叶斯概率以及转换线图也很有用。这让我们看到了我们的确定性水平。这类似于频率主义术语中的显著性水平。它告诉我们什么是控制实际上比变异更好的概率**。**
既然我们已经有了讲述我们故事的所有片段,那么定义规则和过程来描述我们应该如何看待上面的视图是很有用的。
例如,我们可以进行一些稳定性检查,比如确保两个线形图显示过去七天数据的稳定读数,也就是说,线不应该交叉,而是显示过去七天的一致性。
然后检查转换率表现,以确定表现最佳的变量。在上面的例子中,控制组表现最好。
接下来,我们检查确定性水平。如果确定性不明确(例如,概率略低于 90%) ,那么我们应该检查预期损失,以验证无论如何推出变体会带来多大的损失风险。**
当我们将这一过程与数百个以前的实验进行对比时,我们确实发现结果更加清晰。值得注意的是,预期损失从未与之前的 frequentist 统计观点相矛盾,相反,它提供了一个更微妙的观点。
当与新实验的频率统计数据一起追踪时,我们发现这种观点确实增加了数据阅读的清晰度。从而为需要细微差别的实验提供了更清晰的图像。
由于这种清晰性,结果是减少了实验的运行时间,因为分析师更有信心调用测试的结果。利益攸关方也能更好地了解情况以做出决策。
所有的测试仍然运行一个最小的运行时间,但是有更少的实验连续运行数周而没有结果被调用,特别是那些被报告为“平淡”的实验。
此外,测试可以用更少的流量运行,在需要的地方用确定性换取风险。因此,这对于初创公司和小型企业来说非常有用,它们的流量水平不如大型企业。
结论
像漫画一样处理实验统计数据确实有助于给我们想要得到的含义带来清晰和意义。
通过弄清楚我们的的含义,并反向工作以确保统计和数据视图(我们的面板)能够提供它,可以帮助我们做出更好、更明智的决策。尤其是在需要更多细微差别的情况下。
我希望这能帮助其他人将这些原则应用到他们的工作中。如果你觉得这很有趣或有用,请告诉我,我很乐意收到你的来信。同时,感谢 Chris Stucchio 对预期损失函数实验的惊人贡献。
关于我
我是伊克巴尔·阿里**,漫画作家 ,前 Trainline 优化主管。**
我现在通过培训、建立流程和讲述他们的数据故事来帮助公司的实验项目取得成功!
这是我的 LinkedIn 如果你想联系。