原文:TowardsDataScience
协议:CC BY-NC-SA 4.0
超市排队的博弈论
原文:https://towardsdatascience.com/the-game-theory-of-queuing-bdc42
我们如何最大限度地减少排队时间?博弈论与我们日常生活中的决策。
本文登上了 TDS 2022 集锦
一天吃午饭时,我的同事告诉我们他是如何预订了一家很受欢迎的火锅店海底捞,这让我想到了我们在排队时是如何做决定的。
“有趣的是,这实际上并不是预订一张桌子,只是预订一个优先队列。”
“哦,就像迪斯尼乐园的快速通道一样!”
“……但是,如果每个人都预订了优先队列,那会怎么样呢;那正常排队岂不是更快?”
Photo by Lisanto 李奕良 on Unsplash
有些同事说,有一个系统,优先队列会比正常队列移动得更快。但是我们最终得出结论,即使你有一个优先预约,也总会有一个更合理的长度去正常队列。
然后有人说了一句我们都同意的话:
“如果我们是一群人,就分开,在两个队列里排队.”
“如此经典的新加坡人怕输 *举动,不知道其他国家的人会不会这么做。”
*怕输:害怕失去(新加坡式英语)
“这只是博弈论,在两个队列中排队是社会的纳什均衡。”
“如果你离开他的队伍加入另一个队伍,排在你后面的人也不会生气!”
这是新加坡人“怕输”的结果,还是博弈论?
博弈论是一个数学领域,帮助我们理解不同参与者系统中的决策。
纳什均衡是每个参与者的一套策略,其中没有参与者有任何动机改变他们的策略,即使在知道其他参与者的策略之后。(以数学家约翰·纳西的名字命名)。
从经济学最优性的角度来看,纳什均衡是一种最优状态,每个参与者在考虑其他参与者的最优策略的同时做出最优行动。
让我们考虑一个普通的排队系统,例如在超市的收银台。有两个队列提供完全相同的服务,并且有两种类型的玩家(购物者)——(1)团体中的玩家,以及(2)单独的购物者。
我们将合理地假设每个购物者都想尽快结账,也就是说,更少的排队时间=更高的回报。
在我们的世界里,我们认为不理性的购物者是不存在的,他们看重的是与朋友一起排队的美好时光,而不是更快的结账速度。因此,这个世界上的每个人都只想最小化他们的排队时间,其他任何行为都没有成本。
我们还将假设每个队列移动的速度有一些不确定性,因为这取决于一些变量,如收银员的速度和你前面的每个人需要多长时间。有一种可能性是,一个有更多人的队列实际上可能会更快,但这无法事先知道。
如果没有不确定性,那么较短的队伍将永远是所有购物者的最佳选择!
由唐纳德·詹纳蒂在 Unsplash 上拍摄的照片
我会建议…
这个系统中的纳什均衡是这样的:
(1)群体购物者分成两个队列,
(2)单个购物者应该随机选择一个队列。
(1)团体购物者将自己分成两个队列
不管队伍有多长,团体购物者最好分散风险,分头行动。这是因为我们的“理性”假设,因此分手没有成本。因为队列移动的速度是不确定的,所以最好分开排队。
*事实上,除了是一个纳什均衡,这也是一个优势策略,*,因为不管所有其他购物者(群体或单个)决定做什么,分开仍然是最优的。
出于讨论的目的,如果拆分有一些成本呢?如果另一个队列长得不成比例,选择最短的队列会更好,这样拆分的成本将超过长得多的队列移动得更快的可能性。
但是会不会存在一个队列过长的情况呢?因为团体购物者分开并在两个队列中排队,所以影响队列长度的将是单个购物者。单身购物者会继续选择更长的队列,导致一个队列变得不成比例地长吗?
(2)单个购物者应该随机选择一个队列
单个购物者必须在两个队列中做出选择。不管单个购物者采取什么策略,团体购物者总是会分开。因此,就纳什均衡而言,我们只需要为单个购物者找到一种策略,在这种策略下,他们没有动力去改变另一种策略。
较短的队列不一定是更好的选择,因为存在以下不确定因素:
- 出纳效率
- 你面前的每位顾客拥有的商品数量
- 你前面的组数(他们跳到另一个队列的机会)。
也许如果一个
- 通过观察每个收银员一段时间,收集足够的信息,
- 改进了一种根据购物车的大小估计购物者所需时间的方法,
- 并绘制了不同场景的群体购物者的马尔可夫链…
人们可以确定哪个队列更有可能移动得更快(即更高的预期回报)。
实际上,我们不知道在这种情况下哪个队列移动得更快。即使有一个队列比另一个队列移动得快很多倍,我们也不会知道这个概率,我们也没有心理能力/时间来计算超市中的这个。
因此,在不知道队列的实际概率的情况下,人们可以通过随机选择一个队列(即抛硬币)来最大化他们的预期回报。在博弈论中,这也被称为混合策略。
Calculating the expected pay-off from choosing a queue at random Let’s say there is some probability *p* that queue A moves faster than queue B, but *p* is not known.If we choose the queue that moves faster, the pay-off is 1\. If no, the pay-off is 0\. The expected pay-off from selecting queue A is *p*, whilst the expected pay-off from selecting queue B is *1-p*. Expected pay-off from selecting queue A: *p* Expected pay-off from selecting queue B: *1-p* Without knowing what *p* is, we cannot make a decisive choice whether queue A or B is better. Obviously if *p* >0.5, queue A is better, if not, queue B is better.By giving both queue A and queue B a 50-50 chance of being selected, our expected pay-off would be: probability of selecting A and A being faster + probability of selecting B and B being faster = (0.5) * (*p*) + (0.5) * (*1-p*) = 0.5 * (*p* + (*1-p*)) = 0.5 * (1) = 0.5Regardless of the probability distribution *p*, randomising will always give us an expected pay-off of 0.5\.
不管一个队列比另一个队列移动得更快的概率如何,50-50 随机选择的预期收益将总是 0.5 ,因此在给定不确定性的情况下将是最优选择。这是一个纳什均衡,因为无论群体购物者如何决定,都没有改变策略的动机。
附注:由于每位购物者也随机选择了一个队列,因此每个队列中的购物者人数应该是相等的,这加强了我们之前的论点,即不存在过长的队列!
单身购物者会随机化吗?
在“思考快与慢”中, 丹尼尔·卡内曼描述了我们在做决策时使用的大脑的两个系统。系统 1 快速决策,快速反应。决策是潜意识的,我们甚至经常意识不到我们正在做一个决定(例如,转弯以避开倒下的树枝)。系统 2 用于更慢和更深层次的思考(例如解决一个代数问题)。
照片由 Mukul Joshi 在 Unsplash 上拍摄
即使它能最大化预期收益,购物者会在超市收银台扔硬币吗,或者甚至认为是随机的吗?购物者更有可能使用系统 1 来快速做出决定,因为我们都希望不用太多努力就能继续我们的生活。
没有太多考虑,大多数人会简单地选择最短的队列。这是因为随着时间的推移,我们开始相信,不管正确与否,越短的队伍移动得越快。
从全局来看,我们最好不要过多考虑简单的决定,让系统 1 领先…
但是知道了你现在所知道的,下次你在超市结账时,你会扔硬币吗?
感谢你阅读这篇关于我们日常生活中决策的小思想实验!我很想听听你对模型假设的看法,是否有其他策略、纳什均衡甚至是优势策略。欢迎在下面给我留言评论!
如果你喜欢这篇文章以及关于数据科学和数学的文章,今天就注册一个中级会员,可以无限制地访问我的故事。
https://medium.com/@leannechannie/membership
研究和健壮人工智能之间的差距
原文:https://towardsdatascience.com/the-gap-between-research-and-robust-ai-d3849ccaf6c
即使是最先进的人工智能也有它的缺陷
Miquel Parera 在 Unsplash 上拍摄的照片
你会说深度学习模型已经变得如此之好,以至于强大的人工智能系统不再是一个梦想,而是一个现实吗?
你认为你可以在任何现实世界的问题中安全地使用研究人员发布的最新模型吗,比如自动驾驶汽车?还是机场的人脸识别软件?
确信机器在处理和理解图像方面已经比人类更好了?
我也是。直到我意识到用几行代码就可以欺骗一个最先进的模型,比如 DeepMind Perceiver。
在本文中,我将通过一个实际操作的例子向您展示如何在不到 10 分钟的时间内做到这一点。在路上,我们将理解这个例子对现实世界中安全和健壮的人工智能有什么影响。
我在这篇文章中展示的所有代码都可以在 这个 repo 中公开获得,而在这个 Colab 笔记本 中,你可以运行得快得惊人。
让我们开始吧!
问题是
深度学习模型是高度灵活和强大的机器,用于捕捉数据中非常复杂的模式。
它们是视觉任务(计算机视觉)、文本任务(自然语言处理)和机器人现实世界决策问题(强化学习)的首选解决方案。
然而,它们对于稀有的输入也非常脆弱。
当您发送给模型的输入数据与用于训练模型的数据相似时,机器学习模型会按预期工作。
当模型面对的输入与训练集中的输入相差太大时,模型可能会开始犯愚蠢的错误。
你可能会想…
这很有道理,但它并不适用于这些由 DeepMind、OpenAI、特斯拉和其他科技巨头开发的基于数十亿参数的大规模变压器模型?
当这些模型在数千万(甚至上亿)个例子上被训练时,怎么会有人生成稀有的输入呢?
嗯,其实也有可能骗过这些模型。这是我接下来要展示给你们的。
让我们看看你如何生成一个罕见的输入来欺骗 DeepMind 感知者,这是当今最新最热门的深度学习模型之一。
深度心灵感知者
DeepMind 感知者2021 年上映。这是一个基于 transformer 的模型,可以处理来自任意设置的数据,包括图像、视频、文本或音频。
这个模型向真正的通用架构迈出了坚实的一步,而不是特定于任务的架构,它可以处理任意的输入和输出序列。
你可以想象,这不是一个玩具模型,而是世界顶级人工智能实验室之一 DeepMind 生产的真正强大的工程作品。
我将在这个例子中使用的确切版本是在 HuggingFace 模型库中公开提供的版本,您可以在这里找到https://huggingface.co/deepmind/vision-perceiver-learned。它是一个具有超过 6200 万个参数的模型,在 ImageNet 数据集上进行了预训练,该数据集包含属于 20k 个类别的超过 1400 万个图像。
欺骗深层心灵感知者的三个步骤
本节我展示的所有代码都在这个 笔记本 里。
为了简单起见,我们将从您在 HuggingFace 模型卡中可以找到的相同示例开始, 此处为 。
图像是这样的:
图片来自 COCO 数据集
正如所料,该模型正确地将这张图片识别为一只猫
>>> Predicted class: tabby, tabby cat
让我们稍微调整一下这个图像来愚弄模型,产生一个所谓的对抗性例子。这个对立的例子看起来与原始图像非常相似,但是模型很难理解它。
为了从原始的猫图像中生成一个对抗的例子,我们将使用 Cleverhans 库和一个最简单的算法:快速梯度符号法(又名 FGSM),由 Goodfellow、Shlens 和 Szegedy 在这篇开创性的论文 中介绍
如果你想了解更多关于 FGSM 和其他对抗性例子的技术,我推荐你阅读我以前关于对抗性例子的文章
第一步。负载模型
首先,我们从 HuggingFace 模型中心加载感知者模型和预处理器。
>>> Number of parameters: 62,255,848
函数feature_extractor
将输入图像裁剪为 224×224 的分辨率,并使用平均值和标准偏差对像素值进行标准化。这种预处理是深度学习视觉模型的常见做法。
image2class(图片由作者提供)
第二步。辅助功能
我写了一个辅助函数,它逆转了这种预处理,并从归一化张量返回图像。我称这个函数为inverse_feature_extractor
逆向特征提取器(图片由作者提供)
第三步。快速梯度符号方法攻击
接下来,我们导入 Cleverhans 的fast_gradient_sign
方法。该函数主要接受两个输入,即:
- 我们要修改的原始形象→我们心爱的猫。
- ε,这是我们允许的每像素最大失真的大小→
eps
。该值始终为正且很小。
一旦我们设置了eps
,我们运行一个fast_gradient_sign
步骤,从原始图像生成一个新图像。一般来说,你需要尝试不同的eps
值,看看哪一个适合你正在使用的图像。
在这种情况下,我花了 10 分钟发现eps = 0.1
产生了一个对立的例子。
>>> Predicted class: English setter
顺便说一下,英国雪达犬是一个犬种…
如果你仔细看这张图片,你会注意到在左边的猫身上有一团蓝色和绿色的点。除了这个微小的差别,这幅图像基本上与原作相同。然而,感知者未能预测正确的类别,并认为我们的猫实际上是狗。
这是一个对立的例子。
反例(作者图片)
对真实世界安全和健壮的人工智能的影响
总之,欺骗模特比训练她们要容易得多。这就是训练和欺骗深度学习模型之间存在的不对称。
因此,对立的例子限制了深度学习模型在现实世界中的适用性,并提出了以下问题:
在像自动驾驶汽车这样关系到人类生命的关键任务中,使用容易被愚弄的深度学习模型安全吗?"
有方法可以缓解这个问题,但都不是完全的解决方案,像 对抗性训练 。然而,对对抗性例子进行辩护的问题还远远没有解决。
因此,鲁棒人工智能是人工智能研究中的关键问题之一。
我们不会通过专注于标准的图像分类数据集(如 ImageNet)来弥合研究和强大的人工智能之间的差距。
相反,我们需要创建算法来提高深度学习模型的鲁棒性和可解释性。
你可以在 这个回购 里找到所有的代码。
想支持我吗?
你喜欢阅读和学习现实世界中的 ML、数据科学和自由职业吗?
可以无限制地访问我在 Medium 上发布的所有内容,并支持我的写作。
👉🏽今天就使用我的 推荐链接 成为会员吧。
https://pau-labarta-bajo.medium.com/membership
👉🏽订阅 datamachines 简讯 。
👉🏽关注我TwitterMediumLinkedIn。
祝你愉快🤗
避寒胜地
高斯分布解释了
原文:https://towardsdatascience.com/the-gaussian-distribution-explained-19d8417fb047
MATLAB 中的一个例子
在某些条件下,滚动骰子可以建模为高斯分布。由 Unsplash 上的 Edge2Edge 媒体拍摄
高斯分布是许多可以描述数据集的统计分布中的一种,它是一种非常重要的分布,因为许多现实生活中的过程都遵循这种分布。高斯分布的例子包括财务回报和人口身高。
在本例中,我们将从高斯分布中人工生成一个样本数据,将其绘制成理论上的高斯分布曲线,然后应用 Kolmogorov-Smirnov 测试,确定数据集是否是高斯分布的一部分,在本例中显然是高斯分布的一部分,因为它是从正态分布中生成的。
高斯模型
在这个例子中,我们将使用 MATLAB,但是当然,使用 numpy 和 Matplotlib 是一对一等价的。高斯模型概率密度函数显示了某些值相对于其他值的概率。
几个μ和σ值的高斯分布概率密度函数。来源:维基百科(公共领域图片)。
第一步是创建高斯分布模型。在这种情况下,我们将使用μ等于 2,σ等于 1。μ代表平均值,σ代表 68%的数据所在的位置。使用 2 σ将提供 95%数据的位置。适马(σ)是从平均值(μ)开始测量的,代表数据与平均值有多远或多近。
绘制数据
第二步,我们将绘制两个图,一个绘制样本数据,另一个绘制样本数据的直方图和理论高斯曲线。
这创建了两个图:
图一。样本数据集。使用 Matlab online 创建的图像。
图二。样本数据集直方图。使用 Matlab online 创建的图像。
在绘制数据点时,我们可以看到它们是如何集中在μ附近的,并且大部分数据(68%)包含在μ-σ和μ+σ内。
在第二张图中,我们看到理论上的高斯曲线比我们的数据集的比例小得多,这是因为我们必须将数据集的面积比例为 1。Matlab 可以通过一个归一化参数自动完成这项工作:
图 3。具有理论等效高斯曲线的样本数据集直方图。使用 Matlab 在线生成的图像。
测试数据集是否为高斯分布
在本例中,我们从高斯分布模型中人工生成了数据。这显然意味着数据是高斯分布的。虽然有时这是有意的(我们可能想要一个直接来自正态分布的数据集),但大多数时候我们只会面对本质上似乎是高斯分布的数据,我们希望验证这一假设。
有几种方法可以测试一个数据集是否是高斯分布的。其中之一是 Kolmogorov-Smirnov 检验,该检验评估数据是高斯的零假设。
默认的 Kolmogorov-Smirnov 检验是基于均值为 0 且 sigma 为 1 的数据样本。因此,如果我们对数据集进行测试,我们将返回数据集不是高斯型的。实际上,它是关于指定平均值和 sigma 的。
如果我们减去期望的平均值并除以方差,我们就可以正常地进行检验。
分位数-分位数图
Q-Q 图是检查数据集是否为高斯分布的直观方法。在 MATLAB 中,有指定分布或不指定分布的选项,尽管两个图看起来相同。正确的是第二个图(使用我们创建的分布的图),因为它生成了精确的轴(平均值和 sigma)。
图 4。使用标准正态分布的 图。使用 Matlab online 创建的图形。
注意第二张图是如何围绕我们的分布均值的:
图 5。使用高斯分布的 图。使用 Matlab online 创建的图形。
分位数到分位数图是显示数据集如何适应高斯模型的一种简单而直观的方式。
偏斜度和峰度
偏斜度和峰度是两种众所周知的可以应用于高斯分布的度量。偏斜度衡量平均值周围的不对称性,这是一个数值,它会告诉你在平均值的右边或左边是否有更多的值。完美的对称高斯将导致偏斜度值为 0。小于 0.5 的偏斜值或多或少是对称的,介于 0.5 和 1 之间的值是中度不对称的,大于 1 的值是高度不对称的。具体的阈值将取决于您的具体模型。
峰度是对分布尾部极端程度的度量,有时也被称为分布峰值形状的度量,尽管这种解释是不可信的。因此,它可以作为一种特征来确定异常值在特定分布中的范围。
这两种度量都很容易在 Matlab 中获得。对于偏斜度,使用 0 作为附加参数将减去平均值。这两个命令的详细信息可以在 Matlab 文档中找到。
摘要
高斯分布可能是许多学科中最重要的统计分布,通常需要对数据应用许多变换和数学方法。了解如何创建高斯数据集、如何解释其概率分布函数、如何归一化数据以及如何验证数据集是否为高斯数据集,这些都是数据科学中迟早需要的基本技能。
客户评论的金矿——量化客户体验
原文:https://towardsdatascience.com/the-goldmine-of-customer-reviews-quantifying-customer-experience-2da2beedf161
通过对客户评论进行情感分析,生成净推介值
照片由乔恩·泰森在 Unsplash 上拍摄
语境
随着社交媒体、在线购物和相关活动的激增,客户倾向于提供越来越多的关于他们消费的产品和服务的评论。评论已经变得如此强大,以至于消费者根据对产品或服务的评分来做出购买决定。
让评论更强大的是评论的内容提供了一个名副其实的信息金矿。自然语言处理(NLP)库的进步使得从这些内容中提取信息变得更加容易和准确。
客户评论能做什么?
从客户评论的内容中产生的 NLP 用例的数量是无限的。我想强调几个非传统但功能强大的用例,它们可能来自客户评论:
- 量化您的客户体验 —如何使用客户评论文本的 情感分析 生成净推介值
- 构建动态客户情绪仪表板针对不满意的客户和潜在收入流失发出实时警报
- 竞争对手分析 —对比潜在竞争对手的 品牌突出度&情感得分
- 产品或服务的 SWOT 分析利用 主题建模
- 根据客户评论确定购买倾向(概率)
这篇文章的目的是给你一个从情感分析中计算 NPS 的方法的概述,从而识别支持者和反对者。让我们开始吧。
什么是净推广分数?
净推动者得分(NPS)是量化客户体验和识别潜在推动者和贬低者的最有效方法之一。
有 3 个组成部分用于计算 NPS — 推动者、中立者和诋毁者。
- 促销员是您最快乐、最忠诚的顾客,他们在适当的时候会转变成品牌大使,并不断推荐品牌。这些客户是业务增长的关键,因此维持他们的客户体验对品牌至关重要。
- 中立者通常是满意的顾客,但通常不会刻意去推广你的品牌。中立者可能会输给竞争对手的风险始终存在。企业应该通过了解中立者的需求,寻找将他们提升为促销员的方法和途径。
- 诽谤者是不高兴的顾客,他们会破坏品牌形象,通过阻止其他人购买你的品牌来降低你的收入。值得注意的是,负面宣传比正面宣传效果更好,速度更快,因此对业务非常不利。
NPS 的计算方法如下:
NPS = %推广者— %反对者
参赛:https://www.netpromoter.com/know/
常规核动力源和相关挑战
NPS 通常通过让客户回答一个关键问题来计算——“你向他人推荐一种产品/服务/品牌的可能性有多大?—在 1 到 10 的范围内评分。这通常是通过在购买时向客户发送调查问卷或通过单独的沟通来完成的。这种方法的常见挑战是:
- 调查的回复率相对较低。
- 收集大量的调查数据可能是一件既费时又费钱的事情。
- 发送调查问卷的费用相对较高。
- 这些回答通常是定量的。很少有定性信息解释反应的原因。
NLP 来救援了
通过采用稍加修改的非常规方法来收集核动力源数据,可以在一定程度上缓解上述挑战。品牌可以利用对顾客评论和社交媒体帖子的情感分析,根据情感得分得出 NPS 的别名,而不是发出调查。
*免责声明:*请记住,客户评论不会直接回答计算 NPS 的核心问题。然而,它们很好地描述了顾客对该品牌的态度,因此可以作为替代品。
什么是情感分析?
情感分析也被称为“观点挖掘”。情感分析根据文本中使用的单词的情感语调给一串文本分配一个分数。
情绪得分——正面、负面和中性
- “我对这项服务非常满意”是一个积极情绪的例子。这通常会有一个更接近+1 的情绪得分。
- “我对服务非常失望”是一个带有负面情绪的字符串的例子,其情绪得分接近于-1。
- “我在五月的最后一周利用了这项服务”是一个带有中性情绪的句子的例子。这将具有接近 0 的情绪得分。
情感分析是如何工作的?
情感分析模型基本上是文本分类模型,将句子分类为正面、负面或中性。模型的 x 变量或输入是文本上下文字符串中使用的单词。基于单词标记和上下文,预先训练的情感分析模型预测句子的情感得分。
情感分析技术的范围从原始的词袋模型到最新的上下文相关模型。随着像 BERT 这样的变压器模型的出现,情感分析模型已经提高了准确性,并且给出了更可靠的情感分数。在讽刺检测方面,他们不太容易受到与旧型号相关的挑战。
症结——如何从情感分析中计算 NP?
以下是可以用于从情感分析分数计算 NP 的最简单的方法:
- 计算每个客户评论的情绪得分。
- 对于每个客户,计算平均情绪得分。
- 根据平均情绪得分将客户分类为支持者或反对者。
或者,您也可以为客户发布的评论数量提供额外的权重。这源于这样一个想法,即我们希望关注经常发布评论的客户,而不是很少购买/发布评论的客户。然后可以将分数归一化,得出 0 到 10 的范围。这种标准化数据可用于识别推动者、诋毁者和中立者,从而计算 NPS。请在下面找到一个在电子表格中工作的示例:
基于加权分数的 NPS 计算(使用最小-最大归一化)
如何使用 NPS 来提升客户体验
如此获得的 NP 可以提供几个强有力的见解。让我们探索其中的几个:
- 首先也是最简单的——确定你的品牌的推广者、反对者和中立者
- 计算推广者与反对者的百分比,让你深入了解你的品牌正在朝哪个方向发展。促销员的百分比越高,表明潜在的收入增长,反之则表明你的品牌正在下降。
- 来自极度负面评论的特定文本字符串将让您深入了解需要改进的地方。一个简单的正面和负面评论的单词云将让你洞察什么对你的品牌最有效,什么无效。
- 每个季度重复的相同练习将让您洞察客户体验的趋势——是促进者的趋势越来越多,还是反对者的趋势越来越多?
摘要
总之,有了大量可用的客户评论,基于情感分析计算 NPS 可以带来对客户体验的强大洞察力,并帮助您快速提取客户的脉搏并采取行动。
好的,坏的和数据
原文:https://towardsdatascience.com/the-good-the-bad-and-the-dataspell-a86fec8fd6e1
软件开发
JetBrain 的数据科学 IDE 在使用一年后的真实回顾
“一个施展法术的代码编辑器”,至少根据 DALL E 2
免责声明( 发源于此处)):此非赞助文章。我和 DataSpell 或者它的创造者没有任何关系。本文对 IDE 进行了公正的概述,旨在使数据科学工具能够为更多的人所使用。
D ataSpell 于去年 11 月在正式发布,然而早在8 月和9 月勤奋的数据科学作者已经发布了一些预览版的评论。有人可能会说所有主要的 DataSpell 功能都已经展示出来了,那么为什么还要在这个问题上再做一篇文章呢?
首先,自去年以来,IDE 中的情况发生了变化。但最重要的是,我使用 DataSpell 进行数据科学研究和开发机器学习应用程序已经整整一年了。因此,我使用这个工具的里程数可能足够高,可以将它的特征减少到最有用和最痛苦的特征。
让我们从三个数据难题开始。不过,我建议你不要一开始就绝望,继续通读,因为这些工具的三大好处是无价的。
数据混乱问题
1。资源使用率高
在这方面,DataSpell 甚至可能不是 Visual Studio 等其他 IDE 的竞争对手。虽然 JetBrains 建议 8 GB 内存足够运行程序,但如果你处理 1M 行或更多的数据集,你不应该满足于任何小于 16 GB 的内存。就 CPU 而言,拥有比 i7(或其他供应商的同类产品)更老的一代也是不明智的,除非你有很多时间可以消耗。IDE 使用了大量的资源,特别是在启动的时候(初始化解释器和扫描文件和软件包的时候),或者如果你附加了一个自动同步到云端的文件夹。然而,当它完成启动时,下降速度相当快,或者至少和它的前身 PyCharm 的速度差不多。
不是你能找到的最敏捷的 IDE 作者图片
2。bug
正式版仍然有一些错误,尽管如此,对我来说升级到新版本解决了很多错误。例如,嵌入式 Jupyter 服务器有一个重大缺陷,无法加载保存的笔记本,但后来的一个版本为我修复了这个问题。另一个解决的错误发生在使用代理连接到许可证服务器时,这在以前的版本中根本不起作用。一个尚未解决的 bug 是 Jupyter 调试器并不总是工作,即使工作也非常慢。我通过简单地将代码复制到一个常规脚本文件并在那里执行调试来处理这个问题。我真的希望他们解决这个问题只是时间问题,因为 Jupyter 调试会很有用。无论如何,bug 论坛似乎是一个非常活跃的论坛,所以当你遇到一个 bug 时,你总是可以请求修复,甚至可能找到解决方案。
DataSpell 有很棒的特性,但也有不少 bug。Justin Lauria 在 Unsplash 上拍摄的照片
3.它(有点)不免费
个人使用每月花费 9 美,但作为 JetBrains 教育包的一部分,学生或教师可以免费使用。
DataSpell 津贴
1.舒适的数据视图
在新标签页中打开打开数据框的宽而长的视图。它不仅允许您只需鼠标就可以对列进行排序或隐藏,当数据面板在一个分割标签中打开时,运行一个调试还可以让您观察您的数据帧如何随着每一行代码(!)。事实证明,这在排除代码仅在某些特定单中表现异常的原因时非常有用。
你可以忘掉 sort_values() 和 pd.options.display.max_rows()。作者图片
列显示选项。解释您的工作从未如此简单。作者图片
一个单一个单地调试数据操作。相当酷。作者图片
2.增强型 Jupyter
DataSpell 显著改进了 Jupyter:代码完成更快、更彻底,具有嵌入式文件资源管理器(不再需要 Jupyter Lab),具有已经嵌入的目录(不需要安装附加组件或弄清楚如何使菜单浮动),并且已经为所有单格预设了行编号。总而言之,一旦你习惯了,Jupyter 的整体体验会更好。
DataSpell 已经基本将 PyCharm 代码补全嵌入到 Jupyter notebook 中。作者图片
浏览文件、查看目录,以及对行进行编号—无需任何设置。作者图片
我没有办法回到这个…作者的图片
3.一站式商店
在使用 DataSpell 一年后,我几乎忘记了做打开 Jupyter 笔记本这种可能很基本的事情需要多长时间和多痛苦:你必须打开 anaconda,运行 jupyter 笔记本,等待网络浏览器打开并确保文件夹路径正确。然而在 DataSpell 中,你直接在 ide 里面打开一个笔记本文件,也就这样了。运行第一个代码块将在后台启动 Jupyter server,几秒钟后你就可以操纵笔记本了,就好像它只是另一个 Python 脚本一样。
这一切都归结到这一点…太神奇了!作者提供的图片
笔记本和脚本之间的切换将变得非常容易。此外,DataSpell 中的研究和开发更加错综复杂:DataSpell 使直接将功能写入生产脚本并将其导入笔记本以供进一步研究变得更加容易,而不是将大量功能写入笔记本并最终复制到脚本中。因此,Dataspell 有效地让我们享受到了两种工具的真正好处:Jupyter 的交互式和图形化输出,以及 PyCharm 的快速高效的代码编写。
你只需要运行一段代码来打开 Jupyter。作者图片
因此,从 DataSpell 运行 Jupyter 相当简单。更重要的是,IDE 是一个真正的一站式商店,因为:执行研究(在笔记本中)、探索数据(在数据面板中)、开发和调试生产就绪代码(在脚本中)——都在同一个地方完成!
IDE 可以被视为一个真正的一站式商店,因为:执行研究(在笔记本中)、探索数据(在数据面板中)、开发和调试生产就绪代码(在脚本中)——都在同一个地方完成!
当在高度安全和敏感的客户环境中工作时,这种数据处理能力变得至关重要。您不再需要解释为什么需要单独安装 PyCharm、Jupyter Notebook 或 Lab 或 Microsoft Excel。你可以通过安装一个 exe 文件来获得这些工具的大部分好处。此外,如果您关心定期更新该工具和管理其他 JetBrains 工具,请尝试安装 JetBrains 工具箱,它能够以鼠标的方式更新和降级 DataSpell(和其他工具)。
JetBrains 工具箱可以轻松打开、更新、回滚和卸载 DataSpell。作者图片
摘要
DataSpell 是 JetBrain 面向数据科学家的旗舰 IDE。它并不是最轻量级的 IDE,它仍然有很多 bug,而且大多数情况下你都必须为它付费。尽管如此,好处可能大于痛苦:查看数据的交互方式,增强的 Jupyter 体验,以及在一个地方进行研究和开发,这些都是值得的。
欢迎分享您的反馈,并通过 LinkedIn 联系我。
感谢您的阅读,祝您好运!🍀
构建 Python 项目的好方法
原文:https://towardsdatascience.com/the-good-way-to-structure-a-python-project-d914f27dfcc9
作为一名数据初学者,我希望我知道的一些简单的 Python 建议
照片作者菲奥娜·斯莫伍德
无论你是独自完成一个项目,还是与他人合作,都有三个简单的小贴士帮助你保持空间整洁。
- 提示 1:创建虚拟环境
- 提示#2:为测试创建一个单独的目录
- 技巧 3:创建不同的内容目录
如果你想更进一步,你还应该:
- 技巧 4:记录你的代码
- 提示 5:使用 GitHub 进行版本控制
有些部分与 PyCharm 有关。如果您使用其他 IDE,可以跳过它。
技巧 1:创建一个虚拟环境
为了保持你的项目空间运行,创建一个虚拟环境并保持你的依赖关系是一个好主意。
可以使用 Python 的venv
模块,指定 Python 版本和环境名。在下面的例子中,我使用 Python3 并调用环境 venv。一旦创建了目录,您需要在其中运行脚本activate
。
作者图片
命令概要:
python3 -m venv venv
→ 创建一个虚拟环境source venv/bin/activate
→ 激活环境deactivate
→ 解除环境
👁🗨·皮查姆见解
如果您正在使用 PyCharm,您将会看到一个venv
目录出现在左侧的项目目录中。一些东西会自动安装在里面。最有可能的是,你只关心activate
脚本——正如我们在上面看到的。
作者图片
重要的是,在 PyCharm 中,您应该采取额外的步骤,以便您的程序可以在您的虚拟环境中运行。
去右下角。您应该看到 PyCharm 使用的是哪个解释器。
作者图片
“添加解释器”并选择“现有环境”选项。
接下来,导航到您创建环境的文件夹,并从bin
目录中选择 Python。
作者图片
如果一切正常,您应该在右下角看到虚拟环境中存在的 Python 版本。不错!🎊
作者图片
简而言之,虚拟环境允许您:
- 保持依赖性隔离。这避免了您的项目使用不同的包版本,并且每次您需要运行一个项目时,您都要全局卸载/重新安装您需要的东西。
- 与他人分享你的依赖。
一旦安装了项目需要的所有包,就可以运行:
pip freeze > requirements.txt
pip freeze
是“冻结”当前正在使用的所有包/版本。然后你通过一个 txt 文件传输(即保存)了pip freeze
的输出。
使用您的程序的其他人将会运行:
pip install -r requirements.txt
并且能够一次性安装所有的软件包和正确的版本。很神奇吧?🚀
作者图片
技巧#2:为测试创建一个单独的目录
您听说过为您的代码创建测试是一个好主意。所以你正在编写 Python 代码,并试图用 Pytest 测试它。
例如:假设你创建了一个名为greetings.py
的文件和另一个名为test_greetings.py
的文件来编写一些测试。
在这个例子中,我将使用 Pytest 作为测试包。Pytest 有很多命名约定。文件名以test_
开头就是其中之一。如果您遵循它,Pytest 将自动在当前目录及其下的目录中查找以test_
开头的文件并运行它们。
要创建新文件,您可以在终端中使用touch
命令:
作者图片
在 PyCharm 的右上方,您应该会看到这样的内容:
作者图片
打开greetings.py
,写一个简单的函数:
在您的终端中,您可以运行pip install pytest
来安装pytest
模块,然后简单地安装pytest
。由于您尚未定义任何测试,pytest
将运行,但会收集 0 个项目。
作者图片
打开test_greetings.py
并编写一个测试函数:
如果您注意到,函数名也需要以test_
开头,例如test_say_hello
。这是另一个 Pytest 命名约定。
如何调试模块未找到错误
另一个好主意是将所有的测试收集在一个目录中。
然而,如果您只是这样做,当您现在运行pytest
时,您将会看到您的测试都没有工作。如果你仔细看,你可能会得到一个ModuleNotFoundError
。
让我们看看发生了什么以及如何修复它。
作者图片
Pytest 试图导入greetings
模块,但是失败了。
解决这个问题最简单的方法是假设test
目录是一个包(即模块的集合)。在目录中,创建一个名为__init__.py
的文件
作者图片
这是一个完全空的文件:
作者图片
然而,在那里的简单事实使您的测试再次工作。
作者图片
瞧啊。🍷
技巧 3:创建不同的内容目录
既然您已经有了创建一个__init__.py
文件的想法,那么您可以创建任意多的目录。
例如:
基本上:
__init__.py
用于将目录标记为 Python 包目录
如果您删除了__init__.py
文件,Python 将不再在该目录中寻找子模块。因此,如果您试图将该模块导入到其他地方,它将会失败。
技巧 4:记录你的代码
记录你的代码对于“未来”的你和其他阅读你的项目的人都是非常重要的。一些程序员甚至说:
如果很难记录你的代码,考虑改变设计。
有 3 件重要的事情你应该记住:
- 在每个文件的开头添加一个带有描述的 docstring
作者图片
2.向每个函数和类添加一个 docstring
作者图片
3.每当你定义一个函数或者一个类的时候使用类型提示
作者图片
类型提示(1)使函数和类更具可读性,(2)允许你绕过在文档中指定参数的类型,以及(3)你可以使用它们通过mypy
自动检查你的代码。🎖
有很多写好文档的风格指南。我个人比较喜欢Google Style Python Docstring。
技巧 5:使用 GitHub 进行版本控制
如果你和其他人一起工作,Git + GitHub
对于进行代码审查和避免合并冲突是必不可少的。
如果您是独自工作,它们仍然有助于保存您的工作,并能够恢复更改和“回到过去”。
🐢如果您不熟悉这些概念,您可以在这里找到更多信息:
- 面向 Python 开发者的 Git 和 GitHub 介绍(免费)
- 新杂志:哦,妈的,饭桶!(已付费)
😱如果您发现自己在开始使用版本控制时感到恐慌:
- 哦,妈的,饭桶!?!
💪如果您想了解更多信息:
- 欢迎学习 Git 分支
使用 Git 的第一种方法很糟糕,但是我保证会有回报的。我们都经历过🙇♀️
我希望这是有用的!⚡️
参考文献
- 新课程:用 pytest 测试您的 Python 程序
- https://flax.readthedocs.io/en/latest/philosophy.html
- http://web.archive.org/web/227/
- http://jaynes . Colorado . edu/python guidelines . html # module _ formatting
- https://realpython.com/lessons/type-checking-mypy/
- 什么是 init。py 用于?
图形的语法或如何在 Julia 中进行 ggplot 风格的绘图
原文:https://towardsdatascience.com/the-grammar-of-graphics-or-how-to-do-ggplot-style-plotting-in-julia-1b0ac2162c82
照片由法新社跟随在 Unsplash 拍摄
Julia 统计绘图软件包的比较介绍
图形语法(GoG) 是由 Leland Wilkinson(The Grammar of Graphics,Springer,1999 )和 Hadley Wickham(A Layered Grammar of Graphics,Journal of Computational and graphic Statistics,vol. 19,no. 1,PP . 3–28,2010 )提出的概念; pdf )。
它的主要思想是,每一个统计图都可以由一些基本构件(或机制)组合而成。这允许
- 可视化的简单明了的定义
- 通过仅交换以模块化方式受影响的构建块,可视化的简单适应
- 可重用的规范(相同的可视化可以应用于不同的数据)
韦翰表明,这个概念不仅是一个很好的理论。他在非常流行的 R 包[ggplot2](https://ggplot2.tidyverse.org)
中实现了它。Julia 编程语言也有一些 GoG 实现。
在这篇文章中,我将首先解释图形语法的基本概念和思想。在后续文章中,我将展示以下四个完全或部分基于 GoG 的 Julia 图形包:
- 牛虻. jl
- VegaLite.jl
- Plots.jl (带 StatsPlots.jl )
- Makie.jl 和代数图形
为了让您能够对这些 Julia 包进行一对一的比较,我将在每篇文章中使用相同的示例图和相同的基础数据。在本文的第二部分,我将给出示例中使用的数据,因此我不必在后续的每篇文章中重复这些内容。
图形语法
在接下来的章节中,我将解释威尔金森的“图形语法”和韦翰的“图形分层语法”的基本思想。我不会深入到每一个细节,在两个概念不同的方面,我会有意识地选择一个,给出一个相当“统一”的观点。
对于代码示例,我使用的是 Julia 的牛虻包(vers。1.3.4 &朱莉娅 1.7.3)。
主要成分
可视化的主要构件是
- 数据
- 美学
- 几何学
数据 这三个概念大家最熟悉的大概就是数据。这里我们假设数据以表格的形式出现(就像一个数据库表)。对于可视化来说,区分数字和分类数据是很重要的。
例如,我们这里有一个水果经销商的库存清单:
Row │ quantity fruit price ──────────────────────────────── 1 │ 3 apples 2.5 2 │ 20 oranges 3.9 3 │ 8 bananas 1.9
它由三个变量quantity
、fruit
和price
组成。fruit
是一个分类变量,而另外两个变量是数值。
美学 为了可视化一个数据变量,它被映射到一个或多个美学。
数字变量可以映射到例如
- 在 x 轴、y 轴或 z 轴上定位
- 尺寸
分类变量可以映射到例如
- 颜色
- 形状
- 纹理
几何 除了数据变量和美学,我们至少需要一个几何来指定一个完整的可视化。几何学基本上告诉我们想要哪种类型的图。一些例子是:
- 线 (=线图)
- 点 (=散点图)
- 条形图 (=条形图)
基本示例
现在我们有足够的信息来建立我们的第一个基于图形语法的可视化。对于使用牛虻包的代码示例,我们假设上面的库存表位于一个名为inventory
的变量中,变量的类型为DataFrame
。
首先我们想看看数量是如何按价格分布的。根据所选的几何图形,我们可以得到散点图或线图:
- 将价格映射到 x 轴,数量到 y 轴
使用牛虻中的点几何体
:plot(inventory, x = :price, y = :quantity, Geom.point)
散点图[图片由作者提供]
- 将价格映射到 x 轴,数量到 y 轴 使用线几何 在牛虻:
plot(inventory, x = :price, y = :quantity, Geom.line)
线图[图片由作者提供]
在下一步中,我们想额外看看,哪些水果涉及。所以我们也必须将fruit
映射到一个合适的审美。在下面的两个例子中,首先使用形状,然后使用颜色。
- 将价格映射到 x 轴,将数量映射到 y 轴,将水果形状映射到
使用点几何
牛虻plot(inventory, x = :price, y = :quantity, shape = :fruit, Geom.point)
水果映射成形状[图片由作者提供]
- 将价格映射到 x 轴,将数量映射到 y 轴,将水果颜色T59 使用点几何 牛虻:
plot(inventory, x = :price, y = :quantity, color = :fruit, Geom.point)
水果映射到颜色[图片由作者提供]
也可以将一个变量映射到几个美学。例如,我们可以将fruit
映射到形状以及颜色。
- 绘制价格到 x 轴,数量到 y 轴,
果到一个形状,果到一个颜色,
使用一个点几何 在牛虻:plot(inventory, x = :price, y = :quantity, shape = :fruit, color = :fruit, Geom.point)
水果映射到形状和颜色[图片由作者提供]
使用条形几何图形我们可以绘制库存数量的统计表。这里我们将一个分类变量( fruit )映射到 x 轴上的位置。
- 将水果映射到 x 轴,数量到 y 轴使用牛虻中的杆几何 :
plot(inventory, x = :fruit, y = :quantity, Geom.bar)
条形几何[图片由作者提供]
如果我们将水果也映射到一种颜色,那么条形将以不同的颜色显示:
- 将水果映射到 x 轴,数量到 y 轴,水果到一个颜色
使用一个几何形状 牛虻:plot(inventory, x = :fruit, y = :quantity, color = :fruit, Geom.bar)
酒吧几何和水果映射到颜色[图片由作者提供]
这些基本示例很好地展示了如何使用几个简单的构建块来指定可视化,从而组成一种强大的可视化语言。
它们还表明,这些规范使图形包能够为可视化的各个方面导出有意义的缺省值,这些缺省值没有明确给出。
所有的例子都
- x 轴和 y 轴的有意义的刻度(通常使用比给定数据变量稍大的间隔)
- 连同适当的记号和轴和标记
- 以及一个描述性的标签(简单地使用变量名)
一些例子甚至有自动生成的图例。这是可能的,因为图例只是数据映射到美学的反函数。例如,如果我们将变量水果映射到一个颜色,那么相应的图例就是从颜色到水果的反向映射。
更多配料
老实说,为了一个完整的可视化,我们需要更多的素,而不仅仅是数据、美学和几何。
比例 为了将数字变量映射到位置美学(如 x 轴或 y 轴上的位置),我们还需要一个比例,将数据单位映射到物理单位(如屏幕、窗口或网页)。
在上面的例子中,默认使用了一个线性标尺。但是我们也可以用对数标度来交换。
也可以将数字变量映射到颜色。然后使用连续色标进行映射,如下例所示:
- 将价格映射到 x 轴,数量到 y 轴,数量到一个颜色
使用一个点几何 在牛虻:plot(inventory, x = :price, y = :quantity, color = :quantity, Geom.point)
使用色阶[图片由作者提供]
坐标系 与标尺密切相关的是坐标系的概念,定义了位置值如何映射到绘图平面上。在上面的例子中,默认使用了笛卡尔坐标系。其他可能性是极坐标或重心坐标系统或用于地图投影的各种系统。
有趣的是,我们可以从相同的数据和美学映射生成不同类型的图表,只需改变坐标系:例如,条形图基于笛卡尔坐标系。如果我们用极坐标系统替换它,我们会得到一个 Coxcomb 图,如下例所示,来自数据科学的https://r4ds.had.co.nz/index.html(Hadley Wickham 和 Garret Grolemund,O’Reilly,2017)。
条形图和统计图【来源:见正文;在知识共享许可下使用
结论
有了这两个额外的概念,我们现在有了基本 GoG 的完整图像。在这篇短文中,我当然只能呈现所有可能的美学和图形的子集,还有更多 GoG 素,如统计和小平面*。但是到目前为止,我们所看到的是图形语法的核心,应该足以抓住主要思想。*
Julia 图形软件包的比较
现在让我们转到不同的 Julia 图形包的比较,我将在几篇后续文章中介绍这些比较。作为一种准备,我现在将在这些后续文章中展示不同示例图所用的数据(这些数据的灵感来自 YouTube 教程 Julia Analysis for 初学者,来自频道 julia for 天才业余爱好者),并展望我将使用何种图表进行比较。
按国内生产总值划分的国家
用于绘图示例的数据基础是 2018 年和 2019 年所有国家及其 GDP 和人口规模的列表。它来自这个维基百科页面(从国际货币基金组织和联合国的数据库中获得数据)。这些数据也可以从我的 GitHub 知识库中以 CSV 格式获得。
国家列表摘录[图片由作者提供]
列表中的列具有以下含义:
ID
:唯一标识符Region
:国家所在的洲Subregion
:每个大陆又分为几个次区域Pop2018
:2018 年全国人口【百万人】Pop2019
:2019 年全国人口【百万人】PopChangeAbs
:2018 年至 2019 年人口绝对数量变化【百万人】PopChangePct
:类似于PopChangeAbs
,但以百分比[%]表示GDP
:2019 年国内生产总值【百万美】GDPperCapita
:GDP
除以该国居住人数【美/人】;该列不在源文件中,但将被计算(见下文)
使用以下 Julia 代码下载文件并转换为DataFrame
:
第 7 行计算上面提到的新列GDPperCapita
,并将其添加到countries
-DataFrame 中。
汇总数据
每个国家有一行(210 行)的详细列表将在两个级别上进行分组和汇总(使用DataFrame
-函数):
*级别 1 —区域:*以下代码通过Region
(即洲)对列表进行分组,省略第 1 行中的列Country
和Subregion
(使用嵌套的select
),然后创建一个汇总所有数字列的聚合(第 2–5 行)。
2 级—子区域:第 7-11 行的子区域级应用了相同的操作。首先通过省略列Country
(第 7 行)的Subregion
对国家进行分组,然后根据该数据创建汇总;再次对所有数字列求和。此外,地区的名称是从每个小组中挑选出来的(:Region => first
得到的数据帧regions_cum
和subregions_cum
如下所示:
按区域汇总(regions_cum)
按次区域汇总(次区域累计)
摘要
数据帧countries
、subregions_cum
和regions_cum
是即将发表的关于不同 Julia 图形包的文章中绘图示例的基础。在这些文章中,我们将看到如何创建
- 条形图
- 散点图
- 直方图
- 盒子情节和小提琴情节
在这些图形包中。
第一篇文章将呈现牛虻。敬请关注!
大数据辩论:分拆还是捆绑?
原文:https://towardsdatascience.com/the-great-data-debate-unbundling-or-bundling-7d7721ee8514
感谢“Bundlegate”,这是疯狂的几个星期。事情是这样的,我想我们要去哪里。
巴克罗姆·图尔萨诺夫在 Unsplash 上拍摄的照片
在数据推特上,这是一个疯狂的几周,又一个新的热门辩论。
当我躺在床上辗转反侧,思考现代数据堆栈的未来时,我不禁感到了写另一篇观点文章的压力;)
到底发生了什么?
如果你是 MIA, Gorkem Yurtseven 以一篇名为 解开气流 的文章引发了这场争论。
他解释说,一旦小产品成为大平台,它们就适合分拆,或者将其组件功能抽象为更小、更专注的产品。Craigslist 就是一个很好的例子——它的社区部分被 Nextdoor 接管,个人信息被 Tinder 接管,论坛被 Reddit 接管,出售被 OfferUp 接管,等等。
Gorkem 认为,在数据世界中,同样的事情正在气流中发生。
“在数据堆栈碎片化之前,创建带有气流的端到端管道并不罕见。组织过去几乎将整个数据工作流构建为由内部数据工程师开发的自定义脚本。更大的公司甚至在 Airflow 内部构建了自己的框架,例如,具有类似 dbt 的 SQL 转换功能的框架,以便让数据分析师更容易编写这些管道。
如今,数据从业者拥有许多工具,他们很少需要像气流这样的工具…如果气流的分解意味着所有繁重的工作都由单独的工具来完成,那么剩下的是什么?”
——戈尔凯姆·尤尔特塞文
作为数据团队中的一员,我们最终为 R 和 Python 中的转换构建了类似 dbt 的功能,Gorkem 的话击中了要害。
Airflow 的目的已经内置于摄取工具(Airbyte、Fivetran 和 Meltano)、转换层(dbt)、反向 ETL (Hightouch 和 Census)等等。
气流的分解。图片由 Gorkem Yurtseven 提供;在他的允许下分享到这里。
不幸的是,这导致了数据堆栈中大量的碎片。我经常拿这个开玩笑,但老实说,我为现在购买数据技术的人感到难过。即使是像我这样的内部人士也很难完全理解这种分裂和重叠。
Elementl 的尼克·施勒克 在 Dagster 的博客上写了一篇题为“ 重新绑定数据平台 ”的回应,再次打破了数据社区。他同意 Gorkem 的观点,即数据堆栈正在被拆分,并表示这种拆分正在产生自己的一系列问题。
“我想没有人相信这是一个理想的最终状态。邮报本身主张合并。拥有如此多的工具而没有一个一致的集中控制平台是疯狂的,对于数据从业者及其利益相关者来说是一个可怕的结局……然而,这就是我们在这个‘分散’的世界中懒散地走向的现实。”
—尼克·施勒克
然后,在我写这篇文章的时候, Ananth Packkildurai 加入了这场辩论——先是发了一条推文,然后是他的最新一期 数据工程周刊 。
Ananth 同意这一观点,即分拆已经发生,但将其与一个更大的问题联系起来。随着数据团队和公司的发展,数据变得越来越复杂,数据编排、质量、沿袭和模型管理已经成为重大问题。
为解决这些具体问题而拆分的数据堆栈,导致了孤立的“管道胶带系统”。
“数据社区经常将现代技术栈与 Unix 哲学 相比较。然而,我们缺少数据的操作系统。我们需要将模型和任务执行单合并成一个单。否则,我们在没有统一的情况下构建的任何抽象都会进一步放大数据的无组织性。数据作为一种资产仍将是一个令人向往的目标。”
—阿南思·帕克尔杜赖
那么…我该拿什么?我们要去哪里?
在数据世界里有两种人——一种相信捆绑销售,另一种认为非捆绑销售是未来。
我相信答案就在中间的某个地方。以下是我的一些预测和看法。
1.从我们当前版本的现代数据堆栈中,肯定会有更多的捆绑。
现代数据栈的当前版本是不可持续的,每 45 分钟就有一家新公司诞生。我们绝对处于 MDS 创新的黄金时代,由风险资本美慷慨资助——都是为了寻找下一片雪花。我听说过 FAANG 公司中非常快乐的(数据)产品经理被授予数百万美以“尝试任何想法”的故事。
这种兴奋有很大的好处。许多聪明人正在解决数据团队最大的工具挑战。他们的工作使现代数据堆栈成为现实。它使“数据功能”变得更加主流。最重要的是,它刺激了创新。
但是,说实话,这不会永远持续下去。现金会枯竭。合并、兼并和收购将会发生。(随着 dbt 进入度量层,以及 Hevo 在其数据摄取产品中引入反向 ETL,我们已经开始看到这一点。)最重要的是,客户在选择数据堆栈时,将开始要求更低的复杂性。这是捆绑销售开始胜出的地方。
来自 Reddit 上关于 Gorkem 博客的一段对话。Atlan 截图。
2.然而,我们永远不会(也不应该)有一个完全捆绑的数据堆栈。
信不信由你,数据世界是从完全捆绑的数据堆栈的愿景开始的。十年前,像 RJ 度量和 Domo 这样的公司旨在创建他们自己的整体数据平台。
完全捆绑的堆栈面临的挑战是资源总是有限的,创新会停滞不前。这种差距将创造一个机会,因此我相信我们将经历捆绑和拆分的循环。也就是说,我认为数据空间尤其具有特殊性,这使得捆绑平台很难真正获胜。
我和我的联合创始人瓦伦花了大量时间思考公司或产品的 DNA。我们认为这很重要——也许是决定谁能在某一类产品中取得成功的最重要的因素。
让我们看看云之战。例如,AWS 一直很大程度上专注于规模——他们在这方面做得很好。另一方面,来自微软的 Azure 一直有一个更关注终端用户的 DNA,这源于它的 MS Office 时代。毫不奇怪,AWS 在创建世界级的、以用户体验为中心的应用程序方面不如 Azure,而 Azure 在扩展技术工作负载方面不如 AWS。
在我们谈论数据世界的 DNA 之前,我们必须承认它的多样性。数据人员包括数据工程师、分析师、分析工程师、科学家、产品经理、业务分析师、公民科学家等等。这些人中的每一个人都有自己最喜欢的、同样多样化的数据工具,从 SQL、Looker 和 Jupyter 到 Python、Tableau、dbt 和 r。数据项目有自己的技术要求和特点,有些需要实时处理,有些需要特定分析的速度,这导致了一整套数据基础设施技术(仓库、湖边小屋和介于两者之间的一切)。
由于这种多样性,每个不同角色和用例的技术都有非常不同的 DNA。例如,构建 BI 的公司应该关注最终用户体验,而构建数据仓库的公司应该关注可靠性和可伸缩性。
这就是为什么我认为虽然捆绑销售会发生,但它只会发生在产品基本 DNA 相似的领域。例如,我们可能会看到数据质量与数据转换的融合,以及潜在的数据摄取与反向 ETL 的融合。然而,我们可能不会看到数据质量与反向 ETL 捆绑在一起。
3.数据是在多样化的数据堆栈中打开和谐之门的钥匙。
虽然我们会看到更多的整合,但数据和数据人的基本多样性永远不会消失。总会有 Python 比 SQL 好或者实时处理比批处理好的用例,反之亦然。
如果你理解这一基本事实,你就必须停止寻找一个适用于所有人的通用“捆绑数据平台”的未来,而是找到让我们的非捆绑数据堆栈的不同部分完美和谐地一起工作的方法。
数据混乱。这并不意味着工作需要。
我相信帮助我们的数据堆栈协同工作的关键在于激活数据。我们只是触及了数据能为我们做的事情的表面,但是充分利用数据的潜力可以从根本上改变我们数据系统的运行方式。
今天,数据用于(相对)简单的用例,如数据发现和数据目录。我们从一堆工具中提取一堆数据,并将其放入一个我们称之为数据目录或数据治理工具的工具中。这种方法的问题在于,它基本上是在已经孤立的数据堆栈上增加了一个孤立的工具。
相反,花一点时间想象一下,如果你可以在现代数据堆栈中获得分段或 Zapier 式的体验,世界会是什么样子——其中数据可以在我们所有的工具之间创建和谐,并为完美的体验提供动力。
图片由 Atlan 提供,来自我在 Starburst Datanova 的演讲。
例如,数据激活的一个用例可以简单到通知下游消费者上游的变化。
图片由 Atlan 提供。
这个简单过程的类似 Zap 的工作流可能是这样的:
当数据存储发生变化时…
- 刷新数据:抓取数据存储以检索其更新的数据。
- 检测变化:比较新的数据和以前的数据。确定任何可能造成影响的更改—例如,添加或删除列。
- 查找依赖关系:使用沿袭来查找数据存储的用户。这些可能包括转换流程、其他数据存储、BI 仪表板等等。
- 通知消费者:通过消费者偏好的沟通渠道——Slack、吉拉等通知每个消费者。
该工作流也可以作为更改数据存储的测试阶段的一部分。例如,更改数据存储的 CI/CD 流程也可以触发此工作流。然后,编排可以在生产系统改变之前通知消费者。
用斯蒂芬·贝利的话来说,“没有人知道十年后数据栈会是什么样子,但我可以向你保证:数据将是粘合剂。”
我认为这场辩论远未结束,但它激起了如此多的见解和热门话题(就像这篇文章),令人惊讶。
为了让讨论继续下去,我们刚刚邀请了戈尔凯姆·尤尔特塞文、尼克·施勒克和阿南特·帕克尔杜赖参加我们的大数据辩论。
查看这里的录音!
发现此内容有帮助?在我的时事通讯《数据周刊》上,我每周都写关于活动数据、数据操作、数据文化和我们的学习建设的文章 【亚特兰】 。 在此订阅。
格罗莫夫-沃瑟斯坦距离
原文:https://towardsdatascience.com/the-gromov-wasserstein-distance-835c39d4751d
Python 中对象匹配的度量与实例
作者使用人工智能工具 Dreamstudio 生成的封面照片(授权为https://creativecommons.org/publicdomain/zero/1.0/
在过去的几十年里,我们看到在我们可能想到的每一个领域的数据收集都取得了突破,包括运输、零售、金融、生物信息学、蛋白质组学和基因组学、机器人学、机器视觉、模式匹配等。为了分析和组织这些数据,定义对象或数据集相似性的概念很重要。在本文中,我们将互换使用对象和数据集。在这方面,我们可以提出以下几点来界定:
- 选择合适的数据集表示
- 定义两个数据集之间相等的概念
- 定义一个度量空间,使所有对象的空间。度量必须使得到对象的距离为零,对象是相等的。其中一个距离是格罗莫夫-沃瑟斯坦距离。
对象匹配的概念不仅有助于建立两个数据集之间的相似性,也有助于其他类型的问题,如聚类。
为了理解格罗莫夫-沃瑟斯坦距离,我们首先定义度量测度空间。但是在我们进入度量空间之前,让我们定义一些术语。
度量:集合 X 上的一个度量 d 是一个函数使得 d(x,y) = 0 if x = y,x ∈ *X,Y∈Y,*并且满足对称性和 三角形不等式它也被称为 距离功能 。
度量空间:度量空间是一个非空集,其上定义了度量。它可以被认为是有序对(m, d ,使得d:m×m ℝ.我们用ℝ来表示实数集。
现在我们定义度量测度空间。
度量度量空间
与度量空间相反,度量度量空间是一个三组(M, d , p ),其中 p 是一个概率度量。度量测度空间类似于度量空间,但是被赋予了概率的概念。我来解释一下。在许多应用中,我们喜欢将权重与每个点相关联,如图 1 所示。权重可能代表我们对这些数据点的信任程度。如图 1 所示,我们考虑两个度量度量空间(简称 mm-space),每个空间有两个点。这里我们定义p₁=[;]而 p₂ = [,],总和必须是概率(或σ代数)规则定义的 1。
图一。由作者创建
让我们再定义几个术语:
等距:假设为双射的度量空间之间的距离保持变换。等距变换将素映射到相同或不同的度量空间,使得新空间中素之间的距离与原始素之间的距离相同。
同构:同构是保结构映射。在线性代数的意义上,正如大多数数据科学家所熟悉的,两个向量空间 V 和 W 被称为同构,如果存在从 V 到 W 的可逆线性变换(称为同构),T。考虑图 2。在图 2 中,我们有两套国际象棋。它们在国际象棋游戏中是同构的,尽管棋子看起来可能不同。
两个 mm-空间是同构的,如果存在一个等距映射ψ:X→y
图二。来源。左:【https://unsplash.com/photos/WtdIwprWnB4】T2,右:https://unsplash.com/photos/R0t2pAukP9E
前推测度:考虑两个度量空间 X 和 Y 之间的可测映射 f: X → Y 和 p 的概率测度。前推测度是通过将一个测度(在我们的例子中,它是一个概率)从一个可测空间转移到另一个可测空间而获得的测度。它被表示为 f# p(A) = p(f ⁻ (A))其中 A = 𝔅(Y),𝔅是σ-代数(为了简单起见,就认为σ-代数定义了我们所知道的概率的概念。我参考了乔治·卡塞拉斯的统计推论以获得关于这个主题的更多细节)。我们可以把 mm 空间的前推度量写成 ψ#(p₁) = p₂.
考虑 R ⊂ X × Y 是 X 和 Y 之间的对应关系。然后我们定义 π₁® = X 和 π₂® = Y 。一个概率度量 *p,*对 X × Y 是 p₁ 和 *p₂、*之间的耦合,如果 *π₁#(p₁) = p,π₂#(p₂)= p。把𝓤 ( p₁,p₂ )看作是 p₁ 和p 8832】*之间所有耦合的集合。
定义格罗莫夫-沃瑟斯坦距离
考虑度量度量空间上的两点(x,y)和(x’,y’)。进一步,考虑点 q ≥ 1。
(x,y,x ‘,y’ ) ↦ |dₓ(x,x ‘)—dᵧ(y,y’ )|^q 并挑选一个 p ∈ 𝓤 ( p₁,p₂ ),那么我们定义 q 阶的格罗莫夫-瓦瑟斯坦距离为:
格罗莫夫-瓦瑟斯坦距离的应用
格罗莫夫-沃瑟斯坦距离可用于许多与数据科学、数据分析和机器学习相关的任务。下面列举了几个例子:
- 统一多个数据集的流形对齐。
- 形状分析
- 原子环境的分类
- 用于生物数据的多模态分析
- 图形对齐
- 点云分析
Python 中的格罗莫夫-瓦瑟斯坦距离
我们将使用POT
python 包作为 GW 距离的数值示例。它可以通过以下方式安装:
pip install POT
使用 GWdistance,我们可以计算不属于同一度量空间的样本的距离。我们在二维和三维空间中采样两个高斯分布。
图 4。作者用 Python 代码画的图
现在,让我们计算距离核,并将其归一化。
图 5。作者用 Python 代码画的图
现在,我们计算 GW 距离:
上述代码的输出是:
It. |Loss |Relative loss|Absolute loss ------------------------------------------------ 0|6.e-02|0.000000e+00|0.000000e+00 1|3.e-02|8.e-01|3.e-02 2|2.e-02|3.e-01|9.e-03 3|2.e-02|2.e-01|5.e-03 4|2.e-02|5.e-02|1.e-03 5|2.093137e-02|3.e-03|7.e-05 6|2.093137e-02|0.000000e+00|0.000000e+00 Gromov-Wasserstein distances: 0.0
图 6。作者用 Python 代码画的图
执行上述 GW 模拟的完整脚本可以从https://github . com/rahulbhadani/medium . com/blob/master/01 _ 26 _ 2022/GW _ distance . py获得。
https://github.com/PythonOT/POT/blob/master/ot/gromov.py中提供了 GW 距离的详细实现。
如果你觉得这篇文章有用,你可能也会喜欢我关于歧管对齐的文章。
感谢您的阅读。如果你喜欢我的文章并想支持我的内容,我请求你通过【https://rahulbhadani.medium.com/membership订阅 Medium。
参考
- 梅莫利,法孔多。"格罗莫夫-瓦瑟斯坦距离和物体匹配的度量方法."计算数学基础 11.4(2011):417–487。
- 梅莫利,法孔多。"格罗莫夫-沃瑟斯坦距离:概述."公理3.3(2014):335–341。
- 同构(抽象代数):https://www.youtube.com/watch?v=BAmWgVjSosY
- https://optimal transport . github . io/slides-peyre/gromovwasserstein . pdf
为我的项目选择正确数据库的指南:MongoDB 与 MySQL
原文:https://towardsdatascience.com/the-guide-to-choosing-the-right-database-for-my-project-mongodb-vs-mysql-256e270d29b8
本文是一个全面的指南,可以帮助您为自己的用例选择合适的数据库类型
图片由 Daniil Silantev 在 Unsplash 上提供
介绍
数据类型(如关系型和非关系型)的不断变化是公司在实施数据驱动型应用程序的过程中面临的众多挑战之一,因此更难选择正确的数据库类型。
这个概念博客将试图让你的决策过程不那么繁琐,特别关注 MongoDB 和 MySQL,这两个数据库在各自的 web 应用领域中是最受欢迎和最具竞争力的。
我们将首先提供每个数据库的清晰定义。然后,我们将深入指导您为您的使用案例选择正确的解决方案。在最后一节中,我们将介绍一种技术,它可以帮助您轻松有效地管理应用程序的管理面板。
MongoDB 和 MySQL 的快速概述
在深入对比分析之前,我们先了解一下 MySQL 和 MongoDB 数据库是什么。
什么是 MySQL?
MySQL 是一个开源的关系数据库管理系统(简称 RDBMS ),将数据存储在表和行中。MySQL 使用结构化查询语言(SQL)范式与数据进行交互,以访问和传输数据。下表可以说明关系数据。
结构化格式的假想候选人信息(图片由作者提供)
MySQL 最初创建于 1995 年,目前由 Oracle 拥有和维护。MySQL 中的“My”是一个开发者女儿的简称。
什么是 MongoDB?
MongoDB 是一个开源的非关系数据库管理系统(简称 DBMS)。
MongoDB 最初创建于 2007 年,旨在提供存储海量数据的可伸缩性和敏捷性。“Mongo”一词来源于“humongous”这个方面。
它是面向文档的,这意味着它可以将数据存储在单个文档中。这些文档类似于 JSON,如下所示。
非结构化格式的假想候选人信息(图片由作者提供)
什么时候应该使用 MongoDB 或 MySQL?
MongoDB 和 MySQL 都是很棒的数据库,为企业和小型企业提供了突出的优势。因此,它们之间的选择很大程度上取决于它们所应用的用例。在本节中,我们将帮助您获得做出正确选择的所有工具。
什么时候应该使用 MongoDB?
在以下情况下,MongoDB 应该是数据库的首选:
→ 🤷🏻♂️你 不知道你的应用将来会如何演变 。在这种情况下,您可能需要一个动态数据结构,这样您就可以在需要时添加新数据,而不用担心一个简单的更改会破坏整个系统。
→ ✅你 想构建具有即时访问和数据恢复需求的现代 web 应用 。这一点很重要,因为 MongoDB 在全球不同的服务器上保留了相同数据的冗余副本,这使得它具有容错性,因为单个服务器故障不会影响应用程序。
→ 🚀 速度是您最关心的问题 ,因为 MongoDB 将信息存储在单个文档中,这使得读写操作比处理可能需要多个连接来检索所需数据的关系数据库更快。
→ 💵你 关心定价,没有足够的预算 由于 MongoDB 是开源的,所以能够完全免费实现。
→ 📈您的 应用程序需要按需扩展 。MongoDB 可以保证这一点,因为它可以跨多个服务器扩展以存储和处理数据,以便随着性能要求和数据量的增长而自动适应,而不是投资非常昂贵的大型机。
→ 🌏您 需要将您的应用程序部署为服务 。这项功能是由 MongoDB Atlas 提供的,它帮助用户通过多个云供应商(如 Amazon Web Services、Google Cloud 和 Microsoft Azure)将 MongoDB 作为数据库即服务来使用,而无需担心管理数据库的过程。
实现 MongoDB 的一些用例是物联网(IoT)、移动应用程序、实时分析、产品目录等。
什么时候应该使用 MySQL?
与 MongoDB 类似,MySQL 最流行的用例也是基于 web 的应用程序。但是,在以下情况下,您应该选择 MySQL:
→ 🎯你是 在处理一个固定的关系数据模式 ,你确定它在很长一段时间内都不会改变。
→ 🎬您正处于业务的早期阶段, 没有太多的可伸缩性和分布限制,也没有太多的数据库管理专业知识 ,因为 MySQL 易于使用,并且要求较低的可定制性,这意味着用户需要复杂支持的机会较少。
→ 💵你关心定价,但没有足够的预算,因为 MySQL 也是开源的,这使得完全免费实现它成为可能。
→ 🔐 安全性是您的应用程序的一个大问题 因为即使 MySQL 在数据一致性和可靠性方面也超过了 MongoDB。
除了 web 应用程序开发,MySQL 的另一个主要用例是存储事务数据库、电子商务门户开发、概念验证项目等。
如果您不想担心管理数据库的问题,该怎么办?
无论您是在处理 MongoDB 还是 MySQL,您都必须在某个时候处理数据库管理。
如果您只想专注于您的业务专长,而不担心管理数据库,该怎么办?
→这就是像[ForestAdmin](https://www.forestadmin.com/)
这样的工具派上用场的地方!
在本节中,我们将清楚地了解什么是 ForestAdmin 以及它是如何工作的。
什么是 ForestAdmin?
该解决方案通过提供一个管理所见即所得 界面编辑器来增强用户的能力,该编辑器通过一个基于 API 的框架来管理他们的应用程序,以帮助实施任何特定的业务任务,例如从关系和非关系数据库中创建、读取、更新和删除(CRUD)。
ForestAdmin 是如何工作的?
ForestAdmin 基于以下两个主要组件的交互工作:
Forest Liana
,它是一个托管在用户站点上的本地后端,用于分析全部数据并生成用于管理目的的 API 凭证。Forest UI
对应的是一个软件即服务的 web 应用程序,可以从任何浏览器访问,它的目标是使用之前生成的 API 在管理员用户和数据库之间建立通信。
ForestAdmin 使用两步身份验证来帮助管理员用户以安全的方式连接到 Forest Admin 的服务器和 API。
如今,数据隐私对于任何组织来说都是一个大问题。ForestAdmin 使用一种架构来解决这个问题,这种架构将您的数据直接传输到您的浏览器,使其对服务器不可见。
结论
这个概念博客通过提供它们如何工作的全球概述,涵盖了 MongoDB 和 MySQL。然后,它提供了一步一步地帮助您选择适合您的用例的数据库。最后,它涵盖了有效管理应用程序的最伟大的技术之一。
下一步将通过完整的分步教程对 ForestAdmin 进行深入解释。
你可以通过下面的链接进一步阅读。还可以在 YouTube上关注我,了解更多互动内容。
- 为您的所有数据构建一个内部工具
- 构建更快,构建更智能
- MySQL 文档
- 关于 ForestAdmin 的原始简化出版物
- 免费试用森林管理并链接到以下网址。
软技能背后的努力
原文:https://towardsdatascience.com/the-hard-work-behind-soft-skills-8bc2d
一名成功的数据科学家不仅仅是一系列技术能力(尽管这些能力可能很重要)。我们的工作伙伴首先是人:他们的性情、交流习惯和解决问题的方法至少和他们对 Python 的掌握一样重要。本周,我们选择了一些最近的文章,这些文章专注于帮助数据专业人员脱颖而出的所谓软技能。让我们开始吧。
- 心智模式和人格框架是无形的——但至关重要的 。对于阿尼·马杜尔卡(Ani Madurkar)来说,好奇心、适应力甚至幽默感等个人品质都是表现的有力指标,以至于“称这些概念为‘技能’几乎是一种伤害,因为它们更多的是人格框架,比传统技能需要更长的时间才能掌握。”不过,好消息是,我们可以在这些领域继续发展,就像我们在编码或数学领域一样。
- 迈出构建网络的第一步 。到目前为止,一个广为接受的事实是,人脉是获得(并擅长)一份新工作的关键。Sophia Yang 为新晋数据科学家提供的实用建议涵盖了可能是最困难的部分:开始工作并为未来的成功奠定基础。
- 你的时间宝贵吗?更明智地使用它 。感觉日子过得飞快,待办事项越来越多?我们大多数人都知道这一点;我们很少有人喜欢它。梅根·迪布尔最近分享了几个让你充分利用工作日的具体想法,从并行处理到持续优化。Megan 的建议侧重于数据分析师的工作流程,但也很容易转移到其他以数据为中心的领域。
- 给你的技术工作注入设计思维 。做出明智的数据讲述决策需要软硬结合的技能。 Brian Perron 鼓励数据科学家超越特定工具和技术方法的限制来思考他们的工作——他的见解可以激励你对可视化过程进行微小但可见的调整。
- 如果没有人能读懂你的代码,那么你的代码就是不好的。编程?一个软技能?!生产功能性代码可能确实是一项高度技术性的活动,但正如朱利安·维斯特提醒我们的,没有数据科学家或开发人员会在真空中编码。Julian 创建可读代码的五个策略确保您的工作在协作项目中保持相关性和面向未来。
照片由 Maranda Vandergriff 在 Unsplash 上拍摄
对我们最近的其他亮点感兴趣吗?他们覆盖了这么多地方!以下是一些我最喜欢的:
- Hajar Khizou 讲述了ML ops 原则的基础,并解释了为什么你应该考虑在你的下一个 ML 项目中应用它们。
- 通过跟随 Varshita Sher 博士最新的专注于 Python 的教程,学习如何更有效地调试代码。
- 你觉得统计术语令人生畏吗?不要错过凯西·科兹尔科夫的新入门书,这本书用清晰易懂的英语解释了基本(和不太基本的)概念。
- 另一方面,如果你对统计数据感觉良好,但对获得下一次统计数据采访,艾玛·丁有一个很好的概述。
- 在他的第一篇 TDS 文章中, Lars ter Braak 分享了一篇关于 ML 环境下概率分类的全面而有用的介绍。
我们一如既往地感谢您的支持,以及您为我们出版的作品投入的时间。
直到下一个变量,
TDS 编辑
阻碍不同员工成功的隐藏偏见
原文:https://towardsdatascience.com/the-hidden-biases-keeping-diverse-employees-from-success-d5180dce844
一些鲜为人知的数学概念是如何阻碍不同的员工获得公平的机会的
有一种观点认为,商业上,或者说生活中成功的主要决定因素是努力工作和一点点运气。人们会说他们只是碰巧在正确的时间出现在正确的地方,或者他们的努力最终得到了回报。
我不会试图阻止你这样做——努力工作和运气是人生成功的关键因素。但是这种运气从何而来?什么因素导致某人在工作中得到“幸运的突破”,你如何从某人在其职位上的实际表现水平中理清这一点。
让我们从讨论一些你可能没听说过的事情开始:马太效应
马太效应
因为凡有的,还要加给他,他就有馀了。没有的,连他所有的也要夺去。
— 马修 25:29,RSV
马太效应是一个经济概念,以耶稣的一个寓言命名,假设一个人在生活中获得更多的东西,如声望、财富、地位等,他们在这些东西上增加的概率也增加。这真的是对世界运行方式的描述不是吗?当某人开始获得成功时,你经常会看到这种成功滚雪球般变成进一步的成功,然后滚雪球般变成其他的成功,直到这个人觉得成功几乎是不可避免的。
为什么会这样?
考虑以下场景:
简和杰克都在争取升职,他们都是同样熟练的员工,但他们之间有一个关键的区别:杰克在之前已经在公司得到了提升,所以当杰克和简都去和他们的经理谈话时,有趣的事情发生了…
杰克更有可能冒险。
杰克以前在公司内获得过成功的晋升,他更有可能提出大胆的想法,因为毕竟这种想法上次对他有效,所以他觉得没什么可失去的。之前在组织中的成功使杰克在组织中的安全感产生了心理上的转变,这推动了他的前进并影响了他未来的行动。
现在简。
简作为一名从未被提升过的员工,会比杰克更担心地加入谈话。她会更加自我怀疑,更加自我批评。她还没有获得“心理资源”来让自己更多地参与进来,所以她不想在谈话中冒太多风险,因为她个人觉得她会失去更多东西。
这就是马太效应
就像一个富人比穷人有更多的资源来冒险,所以他们有更大的潜在回报而不用担心破产一样,在一个组织中拥有更多心理资源的人将在晋升、认可和成功方面拥有更多优势。
这一概念与优先依附的想法紧密相连——实际上它们可以被认为是同一件事。
优先附件
优先依附的想法来自于长尾分布或幂律分布的数学概念。幂律分布描述事件超出典型正态分布的情况。正态分布是你习惯看到的典型的“钟形曲线”。
由作者创建
这个钟形很好地描述了人类的智力。平均智商集中在 100 点左右,然后两边急剧下降。一个类似的图表可能描述了美国的平均寿命——大约 76 岁的集群和两边的概率悬崖。
正态分布的信息通常有一个适当的尺度——某人只活到 5 岁被认为是悲剧,某人活到 100 岁被认为是非凡和令人惊讶的。
然而,正如我们所知,生活中有些东西不是正态分布的。事实上,生活中有些东西的分布方式甚至没有一个我们容易归类的尺度。他们似乎还在继续。这种模式就是幂律分布。
在美国,平均年收入约为 6.3 万英镑,但因为这是一个幂律分布,我们可以理解将有许多人高于或低于这一平均值。事实上,三分之二的美国人收入低于平均水平。在美国,有些人的收入如此之高,以至于他们甚至无法在这样的图表中找到合适的位置。他们打破了尺度。
优先附加描述了复合成功的数学模型。
基本上,有钱的越来越有钱,该升职的越来越升职。
收视率最高的电视节目收视率最高,Instagram 上最受关注的影响者最有可能获得新的关注者,最受尊敬的公司获得最多的申请人。
复合偏见的危险
现在我们知道了一个真实的现象,即个人已经取得了成功,而组织继续取得成功,这也应该很清楚,这是一个危险:被机会忽略的个人,在概率上是非线性的,在未来有被忽略的危险
偏见越来越多。
在一个组织内,如果招聘经理的偏见或招聘人员的偏见对多化的候选人不利,那么这些偏见可能会继续对该个人产生影响,由于偏好依附和马太效应,它们可能会导致为员工创造平等机会的难度增加。
考虑以下场景:
我们回到杰克和简。想象一下,如果他们两个都想当 CEO。
在一个简单的数学模型中,我们可以将杰克和简的晋升机会建模为一个概率事件。每次他们获得提升时,都有 50%的提升机会.一个人可能需要 15 次晋升才能成为首席执行官,而一个人需要抓住每一次晋升机会才能成为首席执行官。
使用这个模型,我们可以将 Jane 晋升的机会设定为 40 %, Jack 晋升的机会设定为 50%——这是相当慷慨的,因为一些数据暗示女性的机会要低得多。
Jack = .5^15 = 0.000031Jane = .4^15 =0.000001
晋升率 10%的差异在高层变成了近 30 倍的差异。
关键要点:
- 在组织中获得晋升的个人将更有可能在组织中继续获得晋升。为了确保员工得到公平的评判,有效的绩效评定指标是必不可少的。
- 小小的偏见会产生巨大的影响。查看你的数据,真正了解你的不同人口统计群体相对于其他群体被提升的可能性,并试图了解如何解决这些偏见。
- 需要有意识地建立心理资源(心理安全、信心)来创造公平的竞争环境——明确基于先前成就的晋升没有障碍。每个晋升周期都是一张白纸。
让我们来谈谈你
最后,我希望您对相对未知的小因素如何在组织中产生巨大影响有一个更清晰的认识。最终,复合偏差意味着员工获得公平晋升的机会可能取决于他们进入组织的初始条件或他们以前在组织中的成功。
因此,当你评估招聘实践、绩效管理实践或仅仅是你自己的职业生涯时,考虑一下形势会如何对你有利或不利。
如果你喜欢这篇文章,请订阅我的时事通讯或者在这里关注我!
数据科学中复杂性的隐性成本
原文:https://towardsdatascience.com/the-hidden-costs-of-complexity-in-data-science-6bbfb
如何知道你已经走得太远了
我们都经历过,我们都在做一个项目,但它并没有完全走到一起。我们认为能让我们实现目标的模式没有成功。因此,我们很想增加一点复杂性,“如果我为这个项目定制一点这个函数会怎么样?”
其他时候,我们开始一个项目,头脑风暴前进的道路。我们把伟大的想法放在黑板上。他们都处于数据科学的前沿。每个人都很兴奋,但有一种挥之不去的感觉,也许事情已经走得太远了。
作为数据科学家,我们喜欢走在前沿。我所知道的最成功的数据科学家喜欢修补和改进——他们希望成为最前沿。这是难以置信的强大。但是修修补补是有隐性成本的,总是走在最前沿。
最佳解决方案会权衡尖端技术的优势与可靠性、可扩展性、可解释性和资源可用性的成本。数据科学中的最佳解决方案是在每个决策点对复杂性采取深思熟虑的方法。
照片由洛伊克莱雷在 Unsplash 拍摄
以上两种情况都不是天生的坏。事实上,他们通常来自一个充满激情的地方,尽我们所能做好工作。但是,这种激情需要仔细的自我监控。问题是,我们倾向于不断增加复杂性,并且作为数据科学家,我们经常忽略这样做的成本。为什么?
因为复杂性的好处几乎总是不言而喻的:我们添加模块、代码、子模型的原因就在我们面前。它是如此真实,我们可以看到,感觉到,品尝到,触摸到。然而,成本往往被掩盖,哪怕只是一点点。充其量这是我们的第二个想法。最坏的情况是,我们完全忽略它。因此,当我们构建一个模型时,我们最终会试图在复杂性之上增加复杂性,在成本之上增加成本。当我们放弃的时候,我们的模型会变得不可收拾。
通往地狱的路是由良好的意愿铺成的。对吗?
在其他学科中并不是一个陌生的问题。几十年来,工程师们一直在处理类似的问题。在第二次世界大战中,美国设计的谢尔曼坦克使用高度可互换的零件。如果一辆坦克被撞毁,可以从另一辆坦克上取下零件。谢尔曼是一种相对简单的机器,如果在战斗中损坏了,可以在战场上很快修复。
另一方面,德国设计了老虎。老虎是强大的,精确的和复杂的。这是一辆像瑞士表一样调得很好的坦克。盟军非常害怕一只全面作战的老虎。问题是,如何让老虎跑起来?精密工程意味着定制零件和知识。如果你想修理一只老虎,你需要老虎的特定部分。如果你想修理老虎,你需要老虎的专业知识。
谢尔曼坦克照片由 Unsplash 上的丹·Kb拍摄
因此,盟军大规模生产了谢尔曼,并继续服役。另一方面,老虎的价格是谢尔曼的六倍,而且损坏意味着它经常不得不被遗弃在野外。
Sherman 是一个几乎没有定制的数据科学模型。它的开发者持续监控复杂性的成本。它的各个部分对我们的同事来说是可识别的、可解释的和可修复的。它构建高效,并以适当的准确度完成工作。
老虎是数据科学模型,通常以极大的热情构建,其开发者对复杂性的成本视而不见。当它工作时,它是一台不可思议的机器。它的精确性意味着它会断裂。当它坏了的时候,只有很少一部分人有能力修理它。他们将尽最大努力这样做。
但是复杂性本身并不是坏事。作为数据科学家,我们的工作需要一定程度的复杂性。复杂性是一个光谱,我们必须监控我们在这个光谱上的位置。
摄陶赫在 Unsplash
为了控制复杂性,我通过设定复杂性限制来开始一个项目。这个决定由三个主要问题引导:
- *“模型的最低要求精度是多少?实现这一目标的最低复杂度是多少?”*我们不能忽视项目的需求,因此需要考虑模型的复杂性。这有助于设定一个起点“我知道我至少需要这个项目的中等复杂程度。”
- “这个项目需要某种缩放吗?”如果项目要扩展,那么我会对复杂性限制更加严格。牺牲可靠性将被认为是非常昂贵的成本。
- *“项目有多少资源可用?”*我可以支配的资源将进一步影响我让项目变得有多复杂。如果我有很多时间、系统或人员可用于项目,那么我会更愿意增加复杂性。
然后,在设计和开发阶段,我监控我在复杂性谱中的位置。每当我向一个模型添加一个新的组件或定制时,我都会问自己“我刚才添加的是一个简化吗?不复杂?有点复杂?非常复杂?”这允许我不断更新我在复杂性谱上的位置。
通过监控这个位置,我强迫自己开始权衡。我开始思考我还剩下多少空间,以及每一件复杂的事情是否值得付出代价。“我真的需要添加这种定制吗?它的成本是多少?有哪些替代方案?”这里的关键是所有的复杂性都是有代价的,只是它被隐藏的程度不同。
照片由斯蒂芬·斯坦鲍尔在 Unsplash 上拍摄
因此,我监控的复杂性的具体成本是:
1)可靠性:“这种变化会让模型变得脆弱吗?这是否意味着输入的一个小变化就能打破它?或者对代码做一点小小的改动就可能导致它崩溃?”
2)可伸缩性:“这种变化是否意味着模型将变得非常特定于任务?这是否意味着它将很难自动化并应用于许多不同的数据集?”
3)可解释性:“这个变化是我的同事们会很容易理解的吗?足够让他们能够在没有我的帮助下纠正任何问题?1 个月、3 个月或 6 个月之后,当我回过头来看这个问题时,我能理解这个变化吗?”
4)资源需求:“做出这个改变需要付出多大的努力?需要几分钟吗?几天?几周?”
这意味着在每一个决策点,我都可以问自己,“我是否愿意在我的复杂性谱上移动那个很远,同时为了我看到的利益牺牲那个我强迫自己揭露隐藏的后果,所以现在我可以诚实地评估形势。
你可以想象这发生在二战时期的坦克设计室。很难想象谢尔曼的设计师会比老虎的设计师对他们的工作更没有激情。他们可能会喜欢定制设计每个组件,使其尽可能适合他们的特定应用。
“我知道我们想用一个普通的底盘,但是如果我把这种金属做得厚一些,坦克会更坚固。”一定有人有过这种想法。但是更重要的是,*“但是等等,这一点点复杂性将会对我的设计的可伸缩性和可修复性造成巨大的代价”*这种想法也一定是被强行灌输到他们的头脑中的。
这难道不是常常为我们数据科学家铺平通往地狱之路的良好意图吗?*“我知道我们想要使用我的团队成员构建的这个函数,但是如果我只是让这个回归成为非线性的,我的预测就会准确得多。”*我们都有这样的想法,一直都有。它们不是坏想法,它们很棒。他们是伟大数据科学家好奇心的体现。
但重要的是接下来会发生什么。你是否勇往直前,一层又一层地增加复杂性,一次又一次地增加成本,直到最终陷入数据科学的地狱?或者你会给自己一点时间来寻找隐藏的成本,权衡利弊,然后再继续前进吗?
取得联系
通过 LinkedIn 联系我,了解更多关于数据科学领域的观点!
[1]杰西·贝克特, 谢尔曼坦克——猛兽还是半身像?
[2]塞思·马歇尔,老虎和谢尔曼:批判的目光
发展数据技能的理想数据源:你自己
原文:https://towardsdatascience.com/the-ideal-data-source-and-activities-for-developing-data-skills-yourself-347e58a1567e
自我追踪和个人科学导论
图片由作者提供。
我在一个研究生项目中教授数据入门课程,学生们以前没有处理数据的经验,也没有本科统计学或研究方法课程的痛苦记忆。我非常喜欢帮助学生建立解决现实世界问题的基本数据技能。我工作中最喜欢的部分是当学生们有一个啊哈的时刻,意识到他们不仅在处理数据方面有的才能和的兴趣。这是成功的三个关键因素中的两个——第三个是机会。最成功的学生是那些主动出击,寻找机会处理课堂活动和作业之外的数据的学生。
虽然使用数据的机会很多,但将现有项目与符合新学员技能的需求联系起来是一项挑战。学生还有许多与其他课程和实习竞争的需求,进一步限制了机会。我鼓励学生利用我认为最理想的数据源:你自己。这个建议实质上意味着捕捉和分析你自己生活中某个方面的数据。围绕这个概念存在着一个完整的社区,通常被称为个人科学和量化自我。发表在杂志公众对科学的理解上的以下文章提供了对该运动的详细描述,可在此处访问:
作者截图。
许多人已经用智能手表或移动设备跟踪行为和活动,监控步数、睡眠模式、心率等。许多应用程序让你可以访问你的数据,让你有机会重新分析数据。你可以用应用程序来验证你的结果,或者用一种对你更有意义的方式来展示结果。这些现有的数据源是极好的技能发展机会。但是,我鼓励你超越现有的应用程序,创建你的数据收集系统。我将首先描述为什么这些项目对新手来说是理想的,然后提供启动你的项目的技巧。
为什么自我跟踪项目是理想的?
暴露于完整的数据生命周期
自我跟踪项目向您展示了数据生命周期的一整套活动。即使是一个简单的项目,您也可以获得收集、管理、清理、管理、分析、可视化和呈现数据的宝贵经验。这些活动可以揭示你的强项和弱项,为你集中发展技能提供极好的见解。
技能发展的效率
将您的技能应用到真实世界的数据中是培养技能的最有效的方法之一。课堂活动和作业是技能发展的基础,但这些技能只有在你能应用到现实世界时才有意义。此外,当您加入一个数据项目时,您可能很难控制您能做的工作。启动你自己的项目是一个很好的方法,可以立即积累你的技能和经验。
有意义的数据和见解
学生可能理解给定程序的步骤或机制,但对数据的深刻理解对于产生有意义的见解是必不可少的。课堂活动和作业可以鼓励技能的死记硬背,特别是当学生专注于正确解决年级问题时。自我跟踪项目有助于克服这个问题,因为你对数据有深入的理解,特别是当你跟踪的行为或活动对个人有意义时。
我最近开始了一个新的健身和健康计划,将我的锻炼和睡眠记录到谷歌表格中。我使用 Tableau 从一个简单的电子表格中创建了许多不同的数据视图。跟踪过程有助于显示我的进步和一致性,这有利于让我进一步参与和激励我的健身活动。从这个角度来看,这个项目的回报不仅仅是处理数据。
来自自我跟踪项目的作者自己的数据和仪表板。
概念化项目
概念化项目的能力是一项需要培养的重要且具有挑战性的技能。概念化项目的一部分是考虑项目范围、时间、资源、技能水平和评估成功的方法。自我跟踪项目让你立即接触到这一基本技能,当事情没有按计划进行时,允许你快速迭代。你最初的项目可能不会成功,但是你构思和实现的每个项目都会给你宝贵的经验。
自我跟踪的建议
保持你的项目简单
复杂的项目,尤其是那些涉及大量数据收集的项目,注定会失败。如果你是一个新的学习者,专注于一个单一的行为或活动是非常好的。记住,你可以用一个小而简单的数据集做很多事情。
追踪有可变性的东西
例如,如果你倾向于一天只喝一杯咖啡,跟踪你的咖啡因摄入量就不会令人兴奋。但是,对其他人来说,比如我自己,我的咖啡摄入量是相当可变的——包括时间和数量。这种可变性提供了更多的机会来练习你的分析技能和产生洞察力。不过,要小心。有时候太多的可变性会使你的项目更难维护。
追踪一些对个人有意义和有趣的事情
我认为与健康相关的行为是追踪的最佳起点之一。例如,睡眠跟踪是一个很好的起步项目,尤其是如果你对揭示可能影响你睡眠的趋势或模式感兴趣的话。事实上,你可能有一个应用程序为你做这些,但也许有一个睡眠的维度你的应用程序没有跟踪或以理想的格式为你提供数据。
我曾经和一些学生一起工作,他们创建了关于饮酒、跟踪学习一项新技能(例如,用 R 和 Python 编程)、训练小狗(例如,“事故”发生的时间和地点)、看电视和说脏话的项目。虽然许多自我跟踪项目关注与健康相关的行为,但这并不是必需的。我强烈推荐探索 Giorgia Lupi 和斯蒂芬妮·波萨维克的 【亲爱的数据】 项目的工作。他们花了整整一年的时间收集和发送明信片上的个人数据手绘。每周都是不同的主题,为你的自我跟踪项目提供许多想法。他们追踪了所有的事情,从骂人、他们遇到的门的样式、赞美、犹豫不决、笑声和告别,等等。
作者截图来自http://www.dear-data.com/theproject
关注客观的衡量标准
客观测量意味着获取可以直接测量或计算的数据。例如,你可以直接测量你上床睡觉的时间和起床的时间——那些是客观测量。这些测量比主观测量具有更大的有效性和可靠性,例如对你睡眠质量的感知或你感觉休息的程度。客观评估受偏见的影响较小,可以为您提供更好的见解,尤其是在初次接触数据时。
围绕你的项目建立时间界限
如果你在第一周取得了成功,你可以延长项目的时间范围。如果你失败了,你希望失败得更快。你可以重复你最初的想法或推出新的东西。只要记住,成功和不成功的项目都有必不可少的学习机会。
标准化您的数据收集
尝试创建一个系统来保持数据收集工作的一致性。确保你关注数据收集提供的学习体验。许多作为课堂活动或作业的一部分而被提供数据的新学习者并不完全理解创建和管理高质量数据集的复杂性。
专注于创建数据产品
试着用你的数据创造一些东西,尽可能地引导出有意义的见解。例如,您可以使用数据透视表或简单的数据可视化来汇总您的数据,这可以帮助您了解您正在跟踪的行为。
结论
将您的数据技能应用于真实世界的情况是培养真实世界数据技能的最高效和最有效的方法之一。创建您的自我跟踪项目提供了跨数据生命周期培养技能的绝佳机会。保持你的项目简单,并与你现有的技能相匹配。
我最近的大部分工作都集中在帮助新学习者发展实用的数据技能上。如果你对这个话题感兴趣,请随时关注我。
可解释人工智能对人类检测人工智能盲点能力的影响
原文:https://towardsdatascience.com/the-impact-of-explainable-ai-on-the-ability-of-humans-to-detect-blind-spots-in-ai-6e991da400b3
人与人工智能互动研究及 XAI 的贡献
图像是使用 DAllE-2 生成的
TL; 在一句俏皮话中,我的研究检验了向用户提供对人工智能决策的解释是否会影响用户识别人工智能是否有盲点的能力。
在数据科学的背景下,盲点是指人工智能由于对环境的有缺陷的表示而产生系统性错误的情况,这可能导致错误的决策和非最优的结果。关于可解释的人工智能,这个领域正在成为数据科学生命周期不可或缺的一部分,并被假设为支持数据科学家对 ML 模型决策的理解。
关于研究
在研究过程中,进行了两项研究,都是在自主车辆(AV)领域;参与者被要求观看一个在高速公路上驾驶时做出决策的模拟视频。
第一项研究调查了参与者在多大程度上发现了 AV 是否有盲点。第二项研究检验了为 AV 决策提供 XAI,特别是奖励分解解释,是否会提高参与者发现 AV 盲点的能力。
结果表明,参与者能够区分有盲点和无盲点的 AV,但 XAI 并没有显著改善他们对人工智能盲点的评估。然而,XAI 与学习 AV 决策的时间增加有关。
快速介绍
人机协作
人类-人工智能合作是一个相当宽泛的术语,它解决了人类和人工智能算法之间的各种交互,旨在实现一个共同的目标。这种合作涉及各个方面,涉及每一方的角色、人工智能的人类心智模型(Bansal 等人,2019 年)和任务的领域。理想的合作有望产生互补的团队绩效,有望超过各方单独的绩效(Wilder,Horvitz 和 Kamar,2020)。在实践中,很少实现互补性能,在某些情况下,联合努力甚至不如单独的人工智能性能(Bansal 等人,2020)。
与人类相比,人工智能算法执行给定任务的高级能力导致对互补性能的追求集中在另一个方面,即更好地监控人工智能代理的行动。换句话说,获得互补性能的一个潜在方法是利用人的能力来识别代理的弱点并决定如何正确地行动。
可解释的艾(XAI)
*图片来自 Pexels 的 energepic
近年来,XAI 领域的研究越来越受到人们的关注。XAI 的主要目标之一是以各种方式解决机器学习算法的不透明性。DARPA(国防高级研究计划局)将 XAI 定义为“能够向人类用户解释其基本原理,描述其优势和弱点,并传达对其未来行为方式的理解的人工智能系统”(Gunning 等人,2019)。
解释方法的一个例子是可视化哪些输入特征对于分类器是重要的图形(Lundberg & Lee,2017;里贝罗、辛格和盖斯特林,2016 年)。
可视化哪些输入特征对分类器重要的解释( Lundberg SM 等人,2020 )。
虽然 XAI 方法似乎很有前途,但它们尚未证明如预期的那样有效(Kaur 等人,2020)。此外,解释可能会给用户带来过多的信息,使其难以将呈现的内容转化为有价值的见解(Poursabzi-Sangdeh,Goldstein,Hofman,Vaughan 和 Wallach,2018)。在其他情况下,用户往往不会投入所需数量的精神资源,而在这种情况下,为了充分理解 AI 的帮助,这些精神资源往往是必要的。
关于 XAI 对人类心智模式影响的理论综述
XAI 领域的大部分研究依赖于评估人类对该系统的心理模型。系统的心智模型是人-人工智能交互领域的基本理论构造。这个结构被定义为“人类能够产生的机制:(1)对系统目的的描述,(2)对系统功能和观察到的系统状态的形式解释,以及(3)对未来系统状态的预测(Rouse & Morris,1985)。心智模型的结构是一个动态的结构,受与系统交互的影响(Gentner,2014)。一个精确的心理模型被假设来帮助用户判断何时信任或忽略人工智能的帮助。
盲点
盲点是一个相当宽泛的术语,可以定义为一个人无法进行判断或辨别的区域。盲点是指决策者没有意识到决策过程中涉及的某个方面,从而导致做出非最优决策。在人工智能的背景下,盲点通常被定义为状态空间中的区域,其中代理人在现实世界中犯下系统错误,导致相当大的负面奖励(Ramakrishnan 等人,2019)。
盲点示例—一辆不区分紧急车辆和非紧急车辆的特斯拉。*照片由来自 Unsplash 的 Josh Couch 拍摄。
当前研究
这项研究旨在检验 XAI 是否能够促进人类识别人工智能盲点的能力,从而改善人类与人工智能的合作。这项研究扩展了研究的范围,通过比较 XAI 对人工智能的人类心理模型的影响,当处理有盲点的人工智能和没有盲点的人工智能时。
主要研究问题有:
(1)参与者能否区分有盲点和没有盲点的人工智能?
(2)XAI 能影响参与者区分有无盲点的人工智能的能力吗?
实验领域
*照片由 Pavel Danilyuk 从 Pexels 拍摄。
最近,人们对自动驾驶汽车(AV)技术越来越感兴趣,这将极大地影响我们的驾驶行为。将一名人类驾驶员放入 AV 中,监控 AV 的决策,理解其决策并知道何时信任它是至关重要的。在高速公路上尤其如此,因为错误决策的代价可能是巨大的。
为了这项研究的目的,开发了一个基于自主车辆(AV)概念的虚拟模拟。该模拟示出了在三车道高速公路场景中导航的 AV,旨在完成道路行程,同时最小化行程持续时间并最大化与其他车辆的安全距离。该模拟提供了一个鸟瞰的 AV,以及其他几个传统的,人类驾驶的车辆(HDV)。
高速公路场景的图解。蓝色车辆代表 AV。
为该场景定义了三种不同的驾驶风格:标准、缓慢和危险驾驶风格。
AV 的政策
对于这个实验,我模拟了一个人工智能代理,而不依赖于真正的强化学习算法。AV 的策略是通过开发描述 AV 策略的决策树来设计的。定义 AV 策略的好处是控制策略的复杂性及其盲点。收到的 AV 奖励由两个子分数组成— (1)安全驾驶分数和(2)接近目的地分数。
AV 的盲点
我选择把重点放在人类驾驶的车辆的驾驶风格作为一个盲点。这一特定特征被选作盲点,因为与监控 AV 决策的人类驾驶员相比,AV 要考虑这一点相当现实且相当复杂。
带盲点的 AV 和不带盲点的 AV 之间的区别在于,带盲点的 AV 不区分车辆的驾驶风格,而不带盲点的 AV 可以正确地考虑其他车辆的未来位置。如下图所示,具有盲点的 AV 认为所有车辆都具有与“车辆 A”相同的驾驶风格。这种差异会影响 AV 的决策,因为它可能会导致车辆在缓慢行驶或错过移动到不太繁忙的车道的机会后被延迟。
两种自动驾驶汽车的区别:
(1)没有盲点的 AV
(2)一部有盲点的 AV。
模拟
模拟包括 4 个场景,其中包括若干次试验;这些场景被设计为离散的顺序决策任务,其中 AV 呈现有一系列决策点,每个决策都导致后续的决策点。AV 可以执行 5 个动作:(1)加速,(2)减速,(3)换到左侧车道,(4)换到右侧车道或者(5)保持相同的速度和车道。
截图场景对场景的第一次测试,是主任务的一部分。该图像将高速公路可视化,包括 AV(蓝色汽车)和人类驾驶的车辆(HDV)。
主要测量值
直接盲点估计。 旨在明确评估参与者是否识别 AV 盲点的测量。参与者被要求评价 AV 在多大程度上考虑了前方车辆的驾驶风格。
预测正确性。 一种旨在评估参与者在多大程度上可以预测 AV 的动作的测量。
参与者 共有 163 名参与者参与了研究,其中 66 人自愿无偿参与实验,其余人参与是为了获得课程学分。
实验设计
用于本实验的受试者间设计,其中参与者被随机分配到两种条件之一——“有盲点的 AV”条件或“没有盲点的 AV”条件。两种情况的唯一区别是 AV 的决策是主要任务的一部分。主要任务的目标是使参与者能够推断出 AV 对公路的各种状态做出什么决定。
实验程序的说明。
实验 1 —结果
盲点估计 —发现两组之间有显著差异(p < .001)。
盲点估计结果。关于“AV 在多大程度上考虑了 HDV 的驾驶风格”这一问题的试验条件差异报告。
预测任务
可以证明,“没有盲点的 AV”组中的参与者的平均正确反应率高于“有盲点的 AV”组中的参与者的平均正确反应率。(p = .003,d=0.52)。
预测任务结果。实验组的准确率差异被用来预测给定一系列状态时 AV 会采取什么行动。
研究 1 结论
研究结果表明,参与者已经区分了有盲点和无盲点的 AI,这得到了先前研究的支持,该研究发现,参与者能够识别哪个 Atari 代理因盲点而发生故障(Olson 等人,2021)。关于预测任务,两组都预测了人工智能的决策高于机会水平。这一发现意味着,在某种程度上,与人工智能的互动足以理解人工智能政策的某些方面。
根据这些发现,剩下的问题将是——当与人工智能合作时,如何提高人类识别人工智能盲点的能力。这个问题让我们检验了向参与者提供一种可解释的人工智能技术,特别是“奖励分解解释”,是否会促进他们区分有盲点和无盲点的人工智能的能力。
研究 2——概述和研究问题
在这项研究中,我调查了向参与者提供解释是否会提高他们对人工智能代理决策的理解。更具体地说,我研究了当面对 XAI 时,参与者对人工智能盲点的估计和对其决策的预测是否更准确。
我用来描述自主车辆(AV)决策的解释技术被称为奖励分解解释。奖励分解解释反映了 AV 在场景结束时预测的未来累积分数。给定一个决策点,解释详细说明了三种可能行动的未来预测得分。此外,解释详细说明了每个子分数对未来预测分数的贡献。详细说明了两个子分数:(1)行程持续时间和(2)安全性。
使用奖励分解解释背后的基本原理是,当处理真实环境时,基于任务的子分数可以对应于 AI 试图实现的两个不同的目标。例如,在真实环境中,AV 可以被编程以实现多个目标,例如(1)安全驾驶,(2)在合理的时间内到达目的地,(3)遵守驾驶规则,(4)最小化燃料使用等等。
奖励分解解释的一个例子。
上面的屏幕截图说明了提供给参与者的解释,而下面的屏幕截图说明了如何将解释传达给参与者。
研究 2 —方法
共有 155 名参与者参与了这项研究,其中 46 人自愿自由参与实验,而其余的人是为了课程学分而参与的。
测量值
直接盲点估计+预测正确性。 同实验 1。
间接盲点估计。
程序
该程序与研究 1 的程序基本相同
研究 2 —结果
直接盲点估计
在“无盲点 AV”的参与者中,获得 XAI 的参与者的中位数略高。在“有盲点的 AV”的参与者中,获得 XAI 的参与者的中值评级是相同的。
直接盲点估计报告。该图表描述了关于 AV 考虑其他车辆驾驶风格的程度的参与者中间值之间的差异。
间接盲点估计
在“AV 无盲点”组和“AV 有盲点”组的参与者中,获得 XAI 的参与者的平均评级略低。
间接盲点估计报告。参与者报告之间的差异,涉及 AV 在多大程度上会针对一组状态做出正确的决定。
预测任务
在“没有盲点的 AV”的参与者中,获得 XAI 的参与者的平均正确率更高。在“有盲点的 AV”的参与者中,获得 XAI 的参与者的平均正确率较低。
预测任务准确度。参与者在预测任务中准确性的差异。
试用时间
每种情况下观看审判的平均时间是分开计算的。这项计算只包括看 AV 的时间,而不包括参与者看 XAI 的时间。
可以看出,在每种情况下,观看试验的平均时间随着时间的推移而减少,与另一组相比,参与者观看 XAI 的 AV 的平均时间较高。
观看不同情景下的单个试验所花费的平均时间。与没有配备 XAI 的参与者相比,被分配到配备了 XAI 的 AV 组的参与者平均每次试验花费的时间更长。
讨论和研究的主要目标
这项研究的重点是人类是否可以识别人工智能的盲点,以及 XAI 是否可以帮助理解人工智能是否有盲点。从当前的研究中可以得出的主要结论是:(1)参与者可以区分有盲点和无盲点的人工智能。参与者可以将没有盲点的人工智能描述为比有盲点的人工智能更多地考虑其他车辆的驾驶风格,因此比有盲点的人工智能做出更好的决策。(2)当向参与者提供了奖励分解解释时,参与者没有表现出改进的表现。
理论和实践意义
关于为什么奖励分解解释没有促进更好地识别这项研究中的盲点,可能有几种可能的解释。XAI 的认知过程可能依赖于 XAI 的内容以及它被利用和推广到其他情况的方式。从理论的角度来看,解释人工智能以开发人工智能的准确心理模型,取决于一个人的感知、认知能力、期望和经验。
针对 XAI 技术,根据研究结果,奖励分解解释技术不能推广到其他决策点和状态。在 XAI 上花费的时间和参与者的准确性之间缺乏显著的相关性,这表明应该检查 XAI 技术的内容和向参与者传达它的方式。一个可能的含义是,如果我旨在向参与者提供对人工智能盲点的理解,我应该使用支持全局理解的解释,这种理解支持演绎推理,而不是提供支持归纳推理的局部解释。
人类对任务的参与以及他们对人工智能的心智模型
参与者花费在与 XAI 相关的主要任务上的认知努力可以以多种方式解释,这也可能表明参与者愿意更好地理解人工智能的决定。虽然目前的研究结果没有为这种说法提供坚实的基础,但这些结果可能会间接表明 XAI 与短期的参与度增加有关。
限制
目前的研究有几个局限性:
(1)与人工智能的交互量是有限的,以便实验可以在合理的时间内进行。
(2)我模拟了一个不一定具有最优策略的人工智能代理。这影响了奖励分解解释的计算方式,并可能影响参与者区分人工智能错误根本原因(非最优策略或实际盲点)的能力。
(3)从方法论的角度来看,与要求参与者比较两个代理的性能的先前研究相反,当前研究中的参与者仅观察到一个代理(有或没有盲点)。如果不与另一个人工智能代理进行比较,参与者可能很难评估人工智能代理的性能,并估计它是否有盲点。
未来研究
主要的公开问题是为什么参与者不能从 XAI 中受益,尽管研究结果表明他们愿意花费认知资源,如增加观看主要任务和重新播放场景的时间。未来的研究方向可以集中在 XAI 技术的检查和影响 XAI 心理过程的知觉和认知方面。
个人动机
今年早些时候,我从 Technion 毕业,研究人机交互和可解释的人工智能。
在这篇博文中,我简要描述了我的研究论文,该论文是在 Avi Parush 副教授和 Ofra Amir副教授的指导下完成的。非常感谢他们在整个研究过程中给予的指导和支持。
除非另有说明,所有图片均为作者所有。
参考文献
Bansal,g .,Nushi,b .,Kamar,e .,Lasecki,W. S .,Weld,D. S .,& Horvitz,E. (2019)。超越准确性:心智模型在人-人工智能团队绩效中的作用。人类计算和众包 AAAI 会议记录,7(1),19。
班萨尔,g .,吴,t .,朱,j .,福克,r .,努什,b .,卡马尔,e,…韦尔德,D. S. (2020)。整体是否超过其部分?人工智能解释对互补团队绩效的影响。1(1), 1–26.
根特纳博士和史蒂文斯。).(2014).心智模型。心理学出版社。
Gunning,d .,Stefik,m .,Choi,j .,Miller,t .,Stumpf,s .,和 Yang,G. Z. (2019)。XAI-可解释的人工智能。科学机器人学,4(37),0–1。
Kaur,h .,Nori,h .,Jenkins,s .,Caruana,r .,Wallach,h .,和 Vaughan,J. W. (2020 年)。解读可解释性:理解数据科学家对机器学习可解释性工具的使用。1–14.
Lundberg,S. M .,& Lee,S. (2017 年)。解释模型预测的统一方法。(第 2 节),1–10。
奥尔森,M. L .,卡纳,r .,尼尔,l .,李,f .,,黄伟光(2021)。基于生成深度学习的强化学习主体的反事实状态解释。人工智能,295,。
Poursabzi-Sangdeh,f .,Goldstein,D. G .,Hofman,J. M .,Vaughan,J. W .,& Wallach,H. (2018 年)。操纵和测量模型的可解释性。
Ramakrishnan,r .,Kamar,e .,Nushi,b .,Dey,d .,Shah,j .,和 Horvitz,E. (2019)。克服现实世界中的盲点:利用互补能力进行联合执行。IAAI 2019 和第九届 AAAI 人工智能教育进步研讨会,EAAI 2019,6137-6145。
里贝罗,M. T .,辛格,s .,& Guestrin,C. (2016)。“我为什么要相信你?”解释任何分类器的预测。ACM SIGKDD 知识发现和数据挖掘国际会议论文集,13–17-Augu,1135–1144。
劳斯,W. B .,,莫里斯,N. M. (1985)。《透视黑箱:寻找心智模型的前景和局限》(DTIC AD-A)。佐治亚州亚特兰大:佐治亚理工学院。
b .怀尔德、e .霍维茨和 e .卡马尔(2020 年)。学习与人类互补。
交叉验证在机器学习中的重要性
原文:https://towardsdatascience.com/the-importance-of-cross-validation-in-machine-learning-35b728bbce33
解释为什么机器学习需要交叉验证,以及如何在 Python 中完成
安娜斯塔西娅·内伦在 Unsplash 上的照片
交叉验证方法用于测试经过训练的机器学习模型,并独立评估其性能。为此,底层数据集分为训练数据和测试数据。然而,该模型的准确性是专门根据测试数据集计算的,以评估该模型对尚未看到的数据的响应程度。
为什么需要交叉验证?
为了训练一个通用的机器学习模型,我们需要数据集,以便模型可以学习。目标是识别和学习数据中的某些结构。因此,不应忽略数据集的大小,因为太少的信息可能会导致错误的见解。
然后将训练好的模型用于实际应用。也就是说,他们应该用人工智能以前没有见过的数据做出新的预测。例如,一个随机森林被训练来根据测量数据将生产零件分类为损坏或未损坏。人工智能被训练有关于以前的产品的信息,这些产品也被唯一地分类为损坏或未损坏。然而,之后,经过全面训练的模型将决定生产中新的、未分类的零件是否完美无缺。
为了在训练中模拟这种场景,数据集的一部分故意不用于人工智能的实际训练,而是保留用于测试,以便能够评估模型如何对新数据做出反应。
什么是过度拟合?
有针对性地扣留不用于培训的数据还有另一个具体原因。目的是避免所谓的过度拟合。这意味着该模型对训练数据集的适应性太强,因此对这部分数据提供了良好的结果,但对新的、可能略有不同的数据却不是这样。
这是一个真实的虚构的例子:让我们假设我们想要训练一个模型,该模型应该能够提供完美的床垫形状。如果这个人工智能在训练数据集上训练了太长时间,它可能会结束对训练集特征的加权。这是因为反向传播仍然试图最小化损失函数的误差。
在该示例中,这可能导致这样的事实,即主要是侧卧者出现在训练集中,因此模型了解到床垫形状应该针对侧卧者进行优化。这可以通过不将数据集的一部分用于实际训练,即用于调整权重,而仅用于在每次训练运行后针对独立数据测试一次模型来防止。
交叉验证是做什么的?
一般来说,交叉验证(CV)是指在训练过程中使用新的、未知的数据来估计模型的准确性或质量的可能性。这意味着在学习过程中已经有可能评估人工智能在现实中的表现。
在这个过程中,数据集分为两部分,即训练数据和测试数据。在模型训练期间使用训练数据来学习和调整模型的权重。反过来,测试数据用于独立评估模型的准确性,并验证模型已经有多好。据此,开始新的训练步骤或者停止训练。
这些步骤可以总结如下:
- 将训练数据集拆分为训练数据和测试数据。
- 使用训练数据训练模型。
- 使用测试数据验证人工智能的性能。
- 重复步骤 1-3 或停止训练。
要将数据集分成两组,可以根据数据量选择不同的算法。最著名的是坚持和 k 倍交叉验证。
拒绝交叉验证是如何工作的?
保持法是获取训练数据和测试数据的最简单的方法。许多人不熟悉这个名字,但大多数人以前都用过。这种方法只保留 80%的数据集作为训练数据,20%的数据集作为测试数据。该分割可以根据数据集而变化。
训练测试拆分示例|来源:作者
虽然这是一个非常简单快速的方法,也是经常使用的方法,但它也有一些问题。首先,训练数据集和测试数据集中的素分布可能会非常不同。例如,可能会发生这样的情况,船只在训练数据中比在测试数据中更常见。因此,经过训练的模型在探测船只方面非常出色,但会根据其探测房屋的能力进行评估。这将导致非常差的结果。
在 Scikit-Learn 中已经定义了函数,利用这些函数可以在 Python 中实现拒绝方法(例如 Scikit-Learn )。
# Import the Modules import numpy as np from sklearn.model_selection import train_test_split from sklearn import datasets from sklearn import svm# Load the Iris Dataset X, y = datasets.load_iris(return_X_y=True)Get the Dataset shape X.shape, y.shapeOut: ((150, 4), (150,))# Split into train and test set with split 60 % to 40 % X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.4, random_state=0)print(X_train.shape, y_train.shape) print(X_test.shape, y_test.shape)Out: ((90, 4), (90,)) ((60, 4), (60,))
保留交叉验证的另一个问题是,它应该只用于大型数据集。否则,可能没有足够的训练数据来找到统计上相关的相关性。
k 倍交叉验证是如何工作的?
k-Fold 交叉验证通过允许来自训练数据的数据集也出现在测试数据中来弥补这两个缺点,反之亦然。这意味着该方法也可以用于较小的数据集,并且它还防止了训练和测试数据之间的属性的不均匀分布。
数据集被分成 k 个大小相等的块。随机选择其中一个块作为测试数据集,其他块是训练数据。到这一点,和坚守法很像。然而,在第二训练步骤中,另一个块被定义为测试数据,并且重复该过程。
交叉验证示例|来源:作者
块的数量 k 可以任意选择,并且在大多数情况下,选择 5 到 10 之间的值。过大的值会导致模型偏差较小,但过度拟合的风险会增加。太小的 k 值会导致更有偏差的模型,因为它实际上对应于保留方法。
Scikit-Learn 还提供现成的函数来实现 k 倍交叉验证:
# Import Modules import numpy as np from sklearn.model_selection import KFold# Define the Data X = ["a", "b", "c", "d"]Define a KFold with 2 splits kf = KFold(n_splits=2)# Print the Folds for train, test in kf.split(X): print("%s %s" % (train, test))Out: [2 3] [0 1] [0 1] [2 3]
这是你应该带走的东西
- 交叉验证用于测试经过训练的机器学习模型,并独立评估其性能。
- 它可以用来测试人工智能对新的,看不见的数据的反应有多好。这个特性也叫做泛化。
- 如果没有交叉验证,可能会发生所谓的过度拟合,即模型过度学习训练数据。
- 最常用的交叉验证方法是保留法和 k 折叠法。
https://medium.com/@niklas_lang/membership
亲吻和测试的重要性(当混合编程语言时……以及一般情况下)
原文:https://towardsdatascience.com/the-importance-of-kiss-ing-and-testing-when-mixing-programming-languages-and-in-general-3c20ead71d9f
简单+经过测试的代码=问题更少
疾控中心在 Unsplash 拍摄的照片
对于那些懒得阅读整篇文章,只想看简短的“执行摘要”的人来说,这个故事的寓意是:
- 保持简单愚蠢(吻)!我不能过分强调这一点的重要性。你的依赖越少,你需要担心的事情就越少!
- 尽管有时不得不假设所有的包都像包装上描述的那样工作,但是如果可能的话,写一些测试来确认一下是没有坏处的!
混合编程语言
根据具体情况,混合编程语言有时是有益的。但是,如果可以用不同的语言分离组件,并将其容器化(例如用 docker ),那将会使生活变得容易得多。因为混合语言通常会带来额外的复杂性,这使得您的应用程序功能更难测试或调试。这不是不可能处理的,但在走这条路之前,你真的应该考虑一下是否值得。
如果你还不知道,那么肯定会有你最喜欢的语言的软件包,可以调用另一种语言并与之接口,如果你想使用另一种语言的一些现成功能,这实际上是非常方便的。一些例子是:
- PyCall ,这是一个 julia 包,可以用来调用 python 函数
- pyjulia ,反过来,用 python 调用 julia 函数
这些包旨在提供语言之间的无缝转换,大多数时候都是如此。但是由于每种语言都有自己不同的方式,并且随着语言的不断更新或修补,我们不能排除会有过渡语软件包不能按照我们期望的方式工作的情况。因此,即使一种语言(例如 python)中的函数按照我们期望的方式工作,当通过另一种语言(例如 julia)调用这个函数时,编写等价测试来检查它是否以同样的方式工作也没有坏处(除了多花一点时间)。
在 python 和 julia 中使用 LightGBM 的案例研究
这就把我们带到了我们的案例研究,关于如何使用 python 或 julia 调用光梯度增强机器(LightGBM) 。LightGBM 是微软做的机器学习框架,免费开源。有一个 python 包(由微软在 GitHub 上维护)和一个 julia 包(目前由 IQVIA-ML 在 GitHub 上维护)用于使用这个框架。在问之前,在 julia 或 python 中运行 LightGBM 在计算资源或时间方面应该没有任何明显的优势或劣势,因为这两个包都直接与 LightGBM 的 C API 交互。
所有参考代码都记录在两本 jupyter 笔记本中,可以在本 github 报告中找到。(边注:你知道吗,项目名称 Jupyter 的由来是对三种核心编程语言 Julia、Python 和 R 的引用?).
在理想情况下,通过 julia 或 python 调用 LightGBM 应该是等效的。因此,当我们使用 julia 调用 python(然后调用 LightGBM)时,如果我们假设一切都可以无缝转换,那么我们也应该期待等价性。但是如果这个没有经过测试,我们怎么知道呢?
调用 LightGBM C 库的不同方法(来源:作者)
所以,下面是我们如何测试它的(详细代码见 github repo ):
- 为了测试中所有运行的一致性:
-使用来自 LightGBM 包的相同的样本训练数据集
-使用相同的参数输入(见下文):
参数输入(来源:作者)
- 我们修复了库的版本:
-Python(3 . 8 . 5)
-light GBM v 3 . 1 . 0
-Julia(1 . 5 . 3)
-light GBM v 0 . 4 . 2
-py call v 1 . 92 . 2 - 我们测试:
1。在 python
2 中直接运行 python LightGBM 包。在 julia
3 中直接运行 julia LightGBM 包。通过 PyCall 在 julia 中间接运行 python LightGBM 包 - 对于每个测试,我们将 LightGBM booster 作为一个字符串写到一个文件的末尾,这样我们就可以使用类似于 meld 的工具来比较每个运行结果的细节(见下文)
不同测试生成的 LightGBM 模型字符串比较(来源:作者)
思想
当我们比较仅在 python 或 julia 中运行的 LightGBM 时,输出加速器看起来几乎相同,这正是我们所期望的。然而,有趣的是,当我们使用 julia 调用 python lightgbm 包来运行框架时,输出 booster 与前两次运行不同,包括每棵树的细节和特性重要性。
我说清楚!我并不是要批评 PyCall 或 LightGBM,因为总会有边缘情况(就像这个例子……我的意思是,有多少人会这样称呼 LightGBM?)那些都不一定考的好!
现在,我们可以尝试修复 julia 的 PyCall + LightGBM 组合运行中出现的问题,但这肯定会陷入兔子洞。人们可能会找到解决办法,但我们真的需要这个吗?也可能是我在设置这个 julia -> PyCall -> python-lightgbm 调用时出错了(希望不是!)!即便如此,调用多种语言/框架的这种额外的复杂性在我们想要了解发生了什么的时候并没有帮助。如果一个本地包可以工作,为什么不直接使用它呢?
这可能是一个幼稚的案例研究,但希望它说明了为什么我总是喜欢保持事情简单。当然,在开发时,可能会有我们无法避免混合语言的情况。在这种情况下,至少编写一些等价测试会安全得多,这样我们就知道它正在做我们期望它做的事情!
承认
非常感谢雅各布·阿尔万和迪内什·瓦特瓦尼富有洞察力的讨论和这篇文章的校对。
注意事项:
- 文章最初发表于 2021 年 1 月blog.chilledgeek.com
- 免责声明:本文表达的内容和观点完全是我自己的,不代表我现在或过去的雇主的观点或意见
理论在数据科学中的重要性
原文:https://towardsdatascience.com/the-importance-of-theory-in-data-science-3487b4e93953
四个例子说明了为什么数据科学家知道自己在做什么是至关重要的
数据科学是一个庞大的、定义不清的、不断变化的学科,在过去十年中已经变得非常民主化。只要对编程有一点基本的了解,并能访问 YouTube,任何人都可以在不了解算法工作原理的情况下盲目地实现算法(我已经多次成为这种情况的受害者,尽管我不愿意承认)。虽然有许多资源涵盖了数据科学概念的理论基础,但很少有人展示为什么拥有这些基础在实践中如此重要。本文给出了四个数据科学“陷阱”的例子,通过理解理论可以避免这些陷阱。
马。图片作者。
示例 1:单变量特征选择
问题是
特征选择的过程虽然很重要,但却常常令人疲惫和困惑。在回归设置中,最常见的第一步是分析目标和潜在特征之间的相关性。第一个例子将说明丢弃相关性小的特征的危险。
假设我们有以下数据集,具有三个潜在特征(x1、x2 和 x3)和一个连续目标(y):
数据集的前 5 行。图片作者。
由于计算的限制和利益相关者的要求,我们只想选择对预测至关重要的特征。也许直观的开始是查看相关矩阵:
数据集的相关矩阵。图片作者。
我们立即注意到 x1 与 y 有中等相关性,而 x2 和 x3 几乎没有相关性。错误的是,我们认为 x1 是唯一有用的特性,我们把它扔进了一个随机森林。该模型适合于训练集,并在测试集上进行评估:
# Create training and testing sets x_train, x_test, y_train, y_test = train_test_split(data[['x1']], data['y'], test_size=0.20)# Fit a random forest using only x1 as input model = RandomForestRegressor(n_estimators=500, max_depth=10) model.fit(x_train.values.reshape(-1,1), y_train)# Evaluate predictions on the test set preds = model.predict(x_test)fig, ax = create_fig() ax.scatter(y_test, preds) ax.set_xlabel('Actual') ax.set_ylabel('Predicted') ax.set_title('Actual vs Predicted Target using $X1$ as a Feature')print(f'MAPE between actual and predicted: {mean_absolute_percentage_error(y_test, preds)}') print(f'R-Squared between actual and predicted: {r2_score(y_test, preds)}')
仅使用 x1 作为功能的随机林性能。图片作者。
毫不奇怪,该模型在测试集上表现不佳——在看到数据集中的低相关性后,我们(错误地)预料到了这一点。只是为了开心,我们决定将 x2 和 x3 放入模型中,看看测试性能:
# Create training and testing sets x_train, x_test, y_train, y_test = train_test_split(data[['x1','x2','x3']], data['y'], test_size=0.20)# Fit random forest using all features model = RandomForestRegressor(n_estimators=500, max_depth=6) model.fit(x_train, y_train)# Evaluate predictions on test set preds = model.predict(x_test)fig, ax = create_fig() ax.scatter(y_test, preds) ax.set_xlabel('Actual') ax.set_ylabel('Predicted') ax.set_title('Actual vs Predicted Target using all Features')print(f'MAPE between actual and predicted: {mean_absolute_percentage_error(y_test, preds)}') print(f'R-Squared between actual and predicted: {r2_score(y_test, preds)}')
使用所有功能的随机森林性能。图片作者。
令人惊讶的是,通过添加两个与目标不相关的特征,我们观察到测试性能有了天文数字的提高(+0.63 R 平方,-5.18%平均绝对百分比误差)。这怎么可能呢?
解决方案
这是一个经典的例子,说明了为什么单变量特征重要性度量(如相关性)可能具有欺骗性。在该数据集中,输出与输入之间的关系如下:
y 与输入的关系。图片作者。
数据集是用 python 创建的,代码如下:
Create a fake dataset n = 50000x1 = np.random.normal(size=n) x2 = np.random.normal(size=n) x3 = np.random.normal(size=n)y = x1*x2 + x32 + x1data = pd.DataFrame({'x1':x1, 'x2':x2, 'x3':x3, 'y':y})
因为皮尔逊相关只能测量线性关系的大小和方向,它无法拾取 x1 和 x2 之间的交互作用,或者与 x3 的二次关系。
对于这个玩具的例子,我们可能已经完全绕过了特性选择过程,因为只有三个特性可用。然而,人们可以想象这个原理如何应用于高维数据集。最终,特征选择过程需要考虑非线性和相互作用,这些不能总是由单变量测量来考虑。
示例 2:基于树的模型的外推
问题是
在示例 1 中,读者可能已经注意到目标(y)和特征(x1、x2 和 x3)之间的关系是确定的。也就是说,对于给定的一组特征,我们可以精确地计算目标值的值。然而,即使将所有特征输入随机森林,结果也远非完美:
体面,但不完美的随机森林结果。图片作者。
我们知道随机森林能够处理非线性关系,那么为什么这个模型不能完美地预测目标呢?
解决方案
问题是测试集包含训练集域之外的特征。因此,测试集中的相应目标值在训练集的域之外。最好通过查看目标的摘要统计信息来了解这一点:
训练集的目标摘要统计信息。图片作者。
测试集的目标摘要统计信息。图片作者。
虽然这两种分布之间的差异很小(并且没有统计学意义),但它们足以欺骗随机森林。标准回归树的输出,以及随后的随机森林,是由目标的最大值和最小值限制的。这在许多应用中是可以的,因为我们通常不期望我们的模型外推至域外的例子。然而,在物理学和许多其他科学领域,外推往往是目标。
在实践中,对于这个问题有一些解决方案,但是对于这个例子,我们展示了一个线性模型如何能够给出完美的测试性能。让我们稍微欺骗一下,假设我们非常怀疑目标与示例 1 中给出的等式中的特征相关。我们向训练集和测试集添加了以下功能:
# Add quadratic and interaction features x_train['x1x2'] = x_train['x1']*x_train['x2'] x_train['x3^2'] = x_train['x3']2x_test['x1x2'] = x_test['x1']*x_test['x2'] x_test['x3^2'] = x_test['x3']2
然后将这些新特性输入线性模型,并在测试集上评估结果:
# Fit linear model model = LinearRegression() model.fit(x_train, y_train)# Evaluate predictions on test set preds = model.predict(x_test)fig, ax = create_fig() ax.scatter(y_test, preds) ax.set_xlabel('Actual') ax.set_ylabel('Predicted') ax.set_title('Actual vs Predicted Target using all Features')print(f'MAPE between actual and predicted: {mean_absolute_percentage_error(y_test, preds)}') print(f'R-Squared between actual and predicted: {r2_score(y_test, preds)}')
完美推断非线性关系的线性模型。图片作者。
线性模型能够完美地外推,因为它只是将方程中的每一项乘以系数 1。当然,这个例子是不现实的,因为我们事先已经知道了基本方程。然而,即使我们没有这些信息,我们也可以使用像符号回归这样的算法获得同样的结果。
示例 3 —统计显著性与效应大小
问题是
我们为一家健身公司工作,该公司设计了两个肌肉锻炼计划,我们的老板问最新的计划是否能帮助我们的客户在两个月内增加肌肉量。很自然,我们会观察两个项目中增加的肌肉量的分布:
增加的肌肉质量分布(磅)。图片作者。
我们还查看了汇总统计数据:
旧程序肌肉质量增加(磅)。图片作者。
新计划肌肉质量增加(磅)。图片作者。
我们很兴奋,因为新计划比旧计划平均增加了 0.50 磅。因为我们是数据科学家,我们觉得必须检查统计意义。进行双样本 z 检验以检查旧组中增加的平均肌肉与新组中增加的平均肌肉之间的差异是否不同。这个测试的 p 值是 0.002,所以我们向老板展示了的统计显著性发现并庆祝。该公司决定推广这些结果,并对新程序收取更高的费用——许多客户转而购买。
在新计划实施两个多月后,该公司面临着巨大的反弹,因为客户抱怨他们没有获得旧计划中那么多的肌肉。我们的老板因为错误的发现责备我们。
解决方案
这里的问题触及了频率统计的核心——大样本量决定了统计意义。这在许多倾向于使用小样本的统计学入门课程中通常不会涉及。我们可以通过观察当样本量趋于无穷大时测试统计量的变化来从数学上理解这个问题:
当样本量达到 z 统计量的无穷大时,限制。图片作者。
随着样本量的增加,表达式的分母趋向于 0,z 统计趋向于无穷大。当然,随着检验统计量趋向于无穷大,p 值趋向于 0。这意味着,如果样本量足够大,分布之间即使最微小的差异也可能具有统计学意义。这就是我们需要效果尺寸的地方。
统计检验的效果大小试图衡量观察结果的真实强度,而不考虑样本大小。这并不意味着不考虑样本量,而是大样本量并不主导效应量的计算。均值差异测试的一个流行的效果大小度量是 Cohen 的 d:
科恩的 d .作者形象。
注意平方根中的分子和分母是如何随着样本量线性增长的。这使得我们可以通过相应的样本大小来衡量每个样本的标准偏差,而不会出现问题。科恩的 d 有普遍接受的阈值来确定影响大小有多大:
科恩的 d 效应大小阈值。图片作者。
我们可以为我们的测试计算 Cohen 的 d:
# Compute effect size sd_pooled = np.sqrt(((n1-1)*old_program.std()2 + (n2-1)*new_program.std()2) / (n1 + n2 - 2))cohen_d = (new_program.mean() - old_program.mean()) / sd_pooled
科恩的 d 为平均肌肉质量增加之间的差异。图片作者。
这告诉我们,虽然我们观察到的差异在统计上是显著的,但真正的影响可能很小。如果我们在分享我们的结果之前知道效果的大小,我们可能不会对这个新项目做出如此强烈的声明。
我们还可以通过查看考虑整个分布的统计数据来改进我们的分析,而不仅仅是平均值和标准差。例如,像人口稳定指数或Kolmogorov–Smirnov 统计量这样的统计量对于比较任意分布之间的差异非常有用(即,我们不必假设正态性)。这些统计数据还带有普遍接受的效应大小阈值。
示例 4-基于树的特征重要性
问题是
在最后一个例子中,我们为一所大学工作,我们的任务是确定哪些学生可能毕业,哪些学生可能辍学。在这种情况下,我们关心特征的重要性,因为我们想知道哪些学生属性有助于毕业的可能性。我们首先读入数据集并做一些预处理:
# Read in academic success data data = pd.read_csv('Dropout_Academic Success - Sheet1.csv')# Only include students that have graduated or dropped out data = data[data['Target'] != 'Enrolled']# Convert target to a binary value data['Target'].replace({'Graduate':1, 'Dropout':0}, inplace=True)
我们只会考虑已经毕业或者退学的学生。这个数据集有很多分类特征,所以我们决定建立一个 Catboost 分类器来预测一个学生是否会毕业。在此之前,我们需要确定分类特征:
cat_cols = ['Marital Status','Application mode','Course','Daytime/evening attendance', 'Previous qualification','Nationality',"Mother's qualification", "Father's qualification","Mother's occupation","Father's occupation",'Displaced', 'Educational special needs', 'Debtor','Tuition fees up to date','International']
接下来,创建添加了随机特性的训练集和测试集。随机特征是高斯分布的样本,用作比较其他特征预测性的基准。
# Create train/test split x,y = data.drop('Target', axis=1), data['Target']# Add random variable to inputs to evaluate feature importance x['rv'] = np.random.normal(size=len(x))x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.20)
我们对训练数据拟合分类器,然后评估特征重要性:
# Evaluate feature importance feature_importances = model.get_feature_importance()feat_imp_df = pd.DataFrame({'Feature':model.feature_names_, 'Importance':feature_importances}) feat_imp_df.sort_values("Importance", ascending=False, inplace=True)fig,ax = plt.subplots(figsize=(15,15)) sns.barplot(x=feat_imp_df['Importance'], y=feat_imp_df['Feature'])
预测值改变分级分类器的特征重要性。图片作者。
令人震惊的是,只有七个特征的重要性比随机特征高。我们得出结论,我们的大部分特征是噪声,并将其从模型中删除。然而,这样做之后,模型的表现明显变差。这怎么可能?
解决方案
我们在这里的陷阱是我们不明白【Catboost 是如何计算特性重要性的。【Catboost 的默认重要性类型是“预测值变化”,用于衡量输入要素发生变化时模型输出的变化程度。基于树的模型倾向于锁定高粒度特征(比如我们添加的连续随机特征);从这些导致最终模型对其敏感的噪声特征中学习伪分区。这就是我们在这个例子中观察到的情况。该模型已经从训练集的随机特征中学习了噪声,并且作为响应正在改变其预测。
一个简单的解决方案是在 Catboost 中使用“LossFunctionChange”重要性类型。这种重要性类型查看从模型中排除要素时损失函数的变化程度。至关重要的是,这需要对测试集进行评估,这有效地揭示了随机特征没有预测能力。我们可以用下面的代码来评估这个特性的重要性类型:
# Create catboost pool object test_pool = Pool(x_test, y_test, cat_features=cat_features)# Evaluate feature importance feature_importances = model.get_feature_importance(data=test_pool, type='LossFunctionChange')feat_imp_df = pd.DataFrame({'Feature':model.feature_names_, 'Importance':feature_importances}) feat_imp_df.sort_values("Importance", ascending=False, inplace=True)fig,ax = plt.subplots(figsize=(10,10)) sns.barplot(x=feat_imp_df['Importance'], y=feat_imp_df['Feature'])
损失函数改变分级分类器的特征重要性。图片作者。
新的特性重要性图表显示,在测试集上,只有一个特性的性能比 random 差。此外,我们看到随机特征导致模型在被包含时失去预测性(如预期的那样)。这个特征重要性图表与我们的直觉更加一致,并且证实了大多数特征是可预测的。
最后的想法
这四个例子虽然只是表面现象,但却描述了缺乏理解如何让数据科学家陷入困境。关键的一点是,数据科学家在使用某样东西之前,应该对它的工作原理有一个坚实的(不一定完美的)理解。同样重要的是知道在应用程序中使用哪些方法。感谢阅读!
喜欢我的文章?给我买杯咖啡:【https://www.buymeacoffee.com/HarrisonfhU】
数据团队之外的重要紫色人
原文:https://towardsdatascience.com/the-important-purple-people-outside-the-data-team-e97f4bfbc192
何时将公司内的人带入数据团队,以及在这样做之前需要考虑什么
dbt 的 Anna Filippova 写了关于我们如何需要更多“紫色”人才——能够驾驭商业环境和现代数据堆栈的通才。
我招过的一些最好的员工都是公司其他部门的紫色员工,他们想去做数据工作。他们可能在客户支持部门工作,并已成为团队中解决数据相关问题的关键人物。或者他们可能是一名客户经理,已经建立了销售团队中每个人都使用的出色的仪表板。
这些人带来了对业务的深刻理解和学习数据的动力的独特组合。您很幸运,在许多情况下,他们希望转移到数据团队。
他们自然会很好地调整自己,以解决推动业务投资回报的实际问题。他们了解自动化繁琐的客户健康评分流程的影响,因为他们知道手动完成这项工作有多痛苦。他们理解为什么一个为期 3 个月的项目来衡量营销活动对销售的影响是没有意义的,因为销售团队系统地不按时记录电话。
作者图片
您可能会发现自己与这些人中的一些人一起工作,并且可能已经努力将他们融入数据团队。
无论你在天平的哪个位置,我都建议你要慎重考虑如何与他们合作,为数据团队创造最佳成果,并给他们最好的职业发展机会。如果做得好,它们将作为数据团队的扩展,帮助解决重要问题和处理临时请求。
与数据团队以外的人一起创造成功的实用技巧
从描绘出这些人是谁开始。如果你是管理人员,你可以问你的团队,他们会知道的。
我发现这些步骤很有效
- 找出数据团队之外从事类似数据工作的每个人,并让您的团队选择最有影响力和最渴望学习的人
- 邀请一些人成为数据团队惯例的一部分。给他们一个数据团队的导师,邀请他们参加你的异地会议和每周团队会议。这能让你更好地了解他们是如何工作的,并给他们一个学习的机会
- 如果双方都很合适,而且他们的经理也同意,你可以考虑让他们加入数据团队。如果你这样做了,我建议做一个 3 个月的试用期,在此期间设定明确的期望
如果你发现这很有效,考虑把它变成一个任何人都可以申请的更正式的数据轮换计划。
从数据团队外部引入人员时的常见陷阱
不幸的是,当人们加入数据团队时,这并不总是有效的。我已经看到了一些常见的陷阱,您应该尽早警惕
- 他们很难放下旧角色的工作,并不断陷入 DMs 或以前的利益相关者的运营工作中
- 他们努力改变自己的思维模式,不花时间去学习第一次做正确的事情,最后抄近路
- 他们在数据团队中没有得到适当级别的支持,也没有被很好地接纳
一定要尽你所能确保他们有最好的成功条件,并利用 3 个月的试用期尽早向他们提出反馈,这样他们就有机会改进。
当您在数据团队之外拥有整个类似数据的团队时会发生什么?
让人们加入数据团队是一个双赢的局面。如果做得好,你将获得很大的价值,并帮助渴望和雄心勃勃的人转向数据。
当您开始看到核心数据团队之外的整个团队在做类似数据的工作时,情况就更复杂了。这些人通常从事业务关键工作,例如制作预测模型以确定哪些支持代理应该在何时工作,或者构建数据模型以确定客户的信用评分。
如果做错了,这些团队会带来数据可靠性恶化的风险,并会降低整个公司决策的质量。
作者图片
数据的可靠性取决于链条中最薄弱的一环。
你可以把它想成一个等式:
数据可靠性= lowest(upstream data quality, data model quality, dashboard quality, …)
在上面的例子中,您可能会遇到这样的情况
- CRM(销售团队)中严格的电话记录=
high
→ - 测试覆盖率高的 dbt 模型(数据团队)=
high
→ - 有逻辑错误的零碎 LookML 代码(销售运营)=
low
不管上游和数据建模层的质量如何,用于决策的数据都是低质量的,因为质量取决于最薄弱的环节。
就像你不能在上游生产者的不可靠数据上建立可靠的数据一样,如果下游团队没有按照你期望的标准做出决策,你也不能自信地依靠数据驱动的决策。
“类似数据的团队经常致力于解决高度重要的业务问题,但数据团队往往不了解或不参与他们的工作。有时,高级利益相关者绕过数据团队以加快移动速度,但最终却造成了长期的数据债务”
值得一提的是,数据工作绝不应该是数据团队成员的专利。事实上,从事数据工作的人越多,你的数据文化就越强。然而,你需要清楚你期望的高质量在哪里。这可能意味着您创建一个规则,对于最关键的数据用例,数据团队至少需要得到通知。
如何发现做类似数据工作的团队
以下是您应该留意的一些迹象,以发现您可能希望让哪些团队更接近数据团队。
一群销售运营分析师用零碎的 LookML 代码制作仪表板,供数百人使用,而数据团队对此一无所知。
一个运营团队维护着一个预测模型,该模型决定了 Pandas 内置的工人轮班开始和结束的时间,每天早上在本地机器上手动运行。
一个商业战略团队决定使用 Google Data Studio 作为投资者的仪表板,因为有人在以前的工作中使用过它,尽管数据团队的政策是使用 Looker。
一个信用分析师团队已经开始为数据模型开发他们自己的 dbt 项目,这些数据模型用于决定允许哪些客户借钱。
不知不觉中,业务关键决策将由使用仪表板和数据模型的人做出,而数据团队对此一无所知。
你需要为团队和个人何时应该加入核心数据团队以及何时应该保持独立建立一个系统。
作者图片
高重叠:你冒着以混乱结束的风险,最终将回到数据团队来解决。您应该考虑让他们成为核心数据团队的一部分,对他们抱有与其他任何人一样的期望和态度。
有些重叠:数据和决策的质量在很大程度上取决于他们,但他们的工作与数据团队的工作大相径庭。邀请他们参加一些数据仪式,并让他们与数据团队的导师配对。
很少重叠:他们在构建自己的仪表板,这很好,但你不应该在这方面投入太多时间,因为你有分散精力的风险。取而代之的是,提供办公时间和每月一次的最佳实践培训。
结论
数据团队中一些最优秀的雇员可能已经在你公司的其他地方工作过了。
- 构建将数据团队之外的人带进来的方式。逐步让他们成为数据团队的一部分,有一个目标明确的试用期
- 数据可靠性取决于链条中最薄弱的环节。即使有很好的数据源和很好的数据建模,如果分析师做出草率的指示板,你最终会根据错误的数据做出决策
- 对于如何与数据团队之外的类似数据的团队打交道,要有一个策略。如果他们的工作与您在数据团队中的工作非常相似,您应该考虑让他们成为核心团队的一部分
如果你在如何最好地从数据团队之外引入数据类人员并创建可靠的数据链方面有经验,我很想听听你的意见
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://sigusoft.com/dataspell/4582.html