原文:TowardsDataScience Blog
协议:CC BY-NC-SA 4.0
原文:https://towardsdatascience.com/supply-demand-gaps-in-real-time-using-geospatial-data-b125a87119c1?source=collection_archive---------30-----------------------
今天,每个人都使用谷歌地图导航到任何地方。同样,为什么每个公司都不应该有自己的地图来了解其资产(人、自行车、滑板车、汽车、设备、产品)在哪里,以及它们应该在哪里?
如果你是一家在地面上有移动资产的公司,这些资产连接到互联网,并始终有一个唯一的位置——大约有 80%的数据有这个空间成分!
但是,我们都知道在 excel 表格中查看位置数据是没有用的。
为了理解纬度,你需要能够在地图上可视化它们,理解“它们从哪里来”,识别你的业务指标的空间模式,以及它们如何在一个城市和城市内的不同部门之间变化。
电子商务(服装)公司最重要的问题之一是欺诈和滥用折扣。在绘制他们的数据时,他们发现即使是欺诈也有空间模式!
大多数案件发生在大学周边地区,这意味着可能有学生滥用优惠券代码。
在空间模式的基础上更进一步,可视化您的位置数据也有助于您分析您的供需缺口以运行各种空间模型。
这个流行语,供需! 定义因组织而异。对于 Grab 来说,单个供应单位是在线且空闲的司机,单个需求单位是查询乘车费用的用户。对于 Airbnb ,供应单位是一个 Airbnb 单位。
优步
如果你是一家超本地/拼车/酒店公司,你的目标应该始终是确保订购送货/服务/乘车的用户与最接*他们的司机/送货/服务合作伙伴相匹配,从而在最短的时间内弥合差距。换句话说,
供需匹配是您业务的核心和灵魂。
弥补这些差距必然会带来更多的单位收入,从而提高用户的效率和体验。
您可以实施计划措施以在高需求区域产生供应,或者检查假设情景以增加高供应区域的需求!
现在你知道了这些差距在哪里,你会怎么做?
动态定价
让这些数据具有可操作性并弥合差距的一个简单方法是将你的“过剩供应”导向高需求领域。
像 Grab、Swiggy这样的公司已经建立了合作伙伴应用程序,显示需求区域的热图。他们根据收取的费用“激励”合作伙伴。
如果你对优步的飙升定价感兴趣,你可以点击这里:
** [## 位置数据如何帮助优步决定价格飙升
towardsdatascience.com](/how-location-data-helps-uber-decide-surge-in-price-7796ec9c8fba)
例如,在高需求时期,优步在其基础定价上增加了一个乘数,以确保司机涌入该地区赚取更多的钱,而负担得起的乘客可以乘坐,而其他人可以等到票价下降。
有道理,对吧?司机或合作伙伴不应该根据他们的直觉来估计他们空闲时要去哪里。那些动作背后应该有真实的数字,真实的地图做后盾!
事实证明,这在天气恶劣、交通繁忙、高峰时间或像除夕或排灯节这样的特殊事件时非常有效!
在拼车/拼车公司的情况下,偏离骑车人的原始路线是不太可能的。既然供给不能被篡改,那救市就有需求!
你可以向那些低需求地区的客户发送有针对性的促销信息——提供优惠和折扣来吸引他们。
每当你的供需比低于某个阈值时,将所有低需求区域聚集起来,并发送自动促销。尝试和构思,总结出在哪些地方、哪些类型的顾客身上有效的方法。
如果你想了解更多关于地理营销的信息,请查看:
[## 2020 年地理营销你需要知道的事情!
blog.locale.ai](https://blog.locale.ai/things-you-need-to-know-about-geomarketing-in-2020/)
供需缺口也有助于确定新配送中心的位置,或将一个仓库分成多个中心,或将所有中心集中到一个公共位置。
了解您当前的订单是如何聚集的大有帮助!聚类基本上是指使用一定的分类标准将大量数据分成更小的组。
根据可以更有效地联系到您的客户的位置,可以轻松确定位置。
如果你的模式更像是班车服务,那么当你的路线确定后,你也可以进行同样的练习——确定你的取货点应该在哪里,或者应该采用哪组新路线!
阿扎韦亚
需求预测在跨公司的数据科学活动中非常常见。然而,这些模型不包含“位置”元素。
如果贵公司处理自行车、自行车等资产的分配。的情况下,不仅应根据历史供需缺口优化位置,还应根据固定时间间隔内该地区的预测需求量优化位置。
例如,优步知道什么时候、哪一天、哪个地区的需求量最大。他们对一个城市的过去数据进行 3-4 周的处理,然后根据一天中的每个小时和一周中的每一天进一步深入特定的中心/口袋。
夺取
Grab 走得更远——它在骑手应用程序上有一个旅行趋势小部件,供骑手了解未来的预测需求。其目的是鼓励对时间不敏感的乘客选择晚点乘车,为有更紧急需求的乘客服务。
对于一家拥有仓库的超本地公司来说,了解和预测需求有助于在城市的不同配送中心储备不同的产品。
即使是一线城市也有表现得像三线城市的口袋。需求预测是棘手的,虽然它与您的历史数据有很大关系,但它也涉及到在您的模型中使用外部数据源,如天气、交通等,以使您的模型更加精确和准确。
爱彼迎(美国短租*台)
根据这篇 Airbnb 文章,
如果你没有基于位置的动态定价,你只是把大量的钱留在桌面上。
酒店公司有固定的供应或占用。这里的需求是季节性因素。即使在一个城市内,在一个吸引人的季节,需求也会根据分行所在的社区或位置而变化。
供需缺口有助于你设计好的推荐和定价策略。
毕竟,在超本地和打车领域,你的最大目标是确保你的用户在他们需要的时间和地点尽可能快和早地获得乘车服务,同时为你的乘客提供优质服务,为你的合作伙伴提供更好的生计。
在一天中的不同时段进行基于位置的精细定价、促销和分配可以证明非常有利可图!
在未来几年,你的成功很大程度上要归功于能够处理数据,预测客户想要什么,他们何时想要,通过什么渠道,最重要的是,他们希望在哪里可以获得。
如果不将空间环境添加到您的算法中,您最终会将所有这些操作决策留给猜测。
在locale . ai,我们的使命是为每一家收集位置数据的公司带来与优步和 Grab 相同水*的粒度分析。
我们使用一个由 颗粒 六边形网格 组成的系统来做这件事,我们把它当作最小的地理单元。这充当了在位置环境中工作的每个算法、分析和服务的基础。
要了解我们的工作,请查看:
[## 使用地理空间数据进行移动分析的产品
towardsdatascience.com](/a-product-for-movement-analytics-using-geospatial-data-2aa95b18d693)
毕竟,每个公司都需要自己的谷歌地图。
如果你想进一步钻研,可以在LinkedIn或Twitter上与我取得联系。原来贴 在这里。**
原文:https://towardsdatascience.com/support-vector-classifiers-and-logistic-regression-similarity-97ff06aa6ec3?source=collection_archive---------44-----------------------
我将展示一个逻辑回归的决策边界何时收敛到 SVC 的决策边界的例子(从左上到右下的图解),如这里在逻辑成本函数中减少正则化参数的步骤所示(C 是正则化的逆)。
支持向量分类器(SVC)和逻辑回归(LR)可以对齐到它们可以是完全相同的东西的程度。理解 SVC 和 LR 何时完全相同将有助于直观地了解它们到底有什么不同。
逻辑回归(LR)是一种使用 sigmoid 函数的概率分类模型,而支持向量分类器(SVC)是一种更具几何性的方法,可以最大限度地提高每类的利润率。它们的相似之处在于,它们都可以用决策边界来划分特征空间。我经常听到关于这两种机器学习算法之间差异的问题,对此的答案总是集中在 LR 中 log-odds 广义线性模型的精确细节以及 SVC 的最大边际超*面、软边际和硬边际上。
我觉得看相反的情况很有用:LR 和 SVC 什么时候完全一样?!
答案:当专门使用具有二元结果预测器的二元特征、没有正则化的 LR 模型和具有线性核的 SVC 时。
让我们简单回顾一下 LR 和 SVC,然后举例说明这些决策界限可以完全相同。
让我们举一个例子,使用癫痫发作的样子(符号学)和我们在大脑扫描中发现的东西,尝试确定癫痫发作是来自大脑中的颞叶还是其他地方(颞外)。
特征:癫痫发作时会发生什么,例如手臂抖动或拨弄手指(符号学)以及脑部扫描异常,称为海马硬化(HS)(所有特征都是二元的)
目标预测因子:癫痫发作来自颞叶吗?(二进制)
图 1:逻辑回归总结
逻辑回归是一个分类模型,尽管它的名字。基本思想是给模型一组输入 x,它可以是多维的,并得到一个概率,如图 1 的右图所示。当我们希望二进制目标的概率在 0 和 1 之间时,这可能是有用的,而不是线性回归(图 1 的左图)。如果我们重新排列上面的 sigmoid 函数并求解 x,我们会得到 logit 函数(也称为 log-odds ),这是一个清晰的广义线性模型(图 1 中的底部方程)。
LR 是在该模型中寻找最佳(θ)系数,从而通过梯度下降将总误差(成本函数)降至最低(图 2):
图 2: LR 成本函数使用颞侧与颞外癫痫病灶作为目标预测因子。左边的图像用 cost = -y.log(p(x)) — (1-y)表示。log(1-p(x))。其中 y 是真正的二进制标签。右图显示了使用系数偏导数的梯度下降。
向成本函数添加正则化参数(1/C)(乘以系数的*方和):
等式 1:LR 的 L2 正则化的成本函数。L2 意味着θ系数是*方的。y 是真正的二进制标签。y’是模型预测的标签概率:p(x)。
Sklearn 有一个 LogisticRegression() 分类器,默认的正则化参数是 penalty=L2 和 C=1。这个术语惩罚过度拟合。不幸的是,在下面的特殊情况下,这也可能导致拟合不足,从而导致交叉验证性能变差。但是当这种规范化被移除时,对于下面的特殊情况,我们将看到它合并成与 SVC 相同的模型。
图 3:左边的线性决策边界。右图显示了从 SVC 优化得到的最大硬边界超*面。图片来自https://towards data science . com/SVM-feature-selection-and-kernels-840781 C1 a6 c
LR 将绘制一个单一的边界来分隔时间和时间外癫痫发作,而线性 SVC 首先找到两个支持向量,然后找到最佳超*面(图 3 的右图)。为了优化这一点,SVC 使用了一种带有这些约束的拉格朗日乘数方法:边缘超*面必须尽可能多地分离数据,并且两者之间的距离必须最大化。通过 svm 中确定核的方法。SVC(kernel='linear') ,我们有一个线性 SVM。
现在让我们以 2D 二元特征空间分类问题为例:
图 4:当线性 SVC 和 LR 收敛时
SVC 模型的边缘线重合,因为右下角和左上角的所有数据都重合。因此,SVC 的最大裕量为零,其决策边界为黄色(图 4)。
LR 有一个正则化参数 1/C,它与对数损失成本函数(图 2,等式 1)相结合,可以降低系数的幅度(图 1 ),导致蓝色决策边界。通过将 C 设置为一个大的数字,从而将正则化减少到零,两者的决策边界(蓝色和黄色)开始收敛。
这将适用于大多数二进制特征数据。接下来是 Python 代码,因此您可以复制图 4 中的可视化的更简单版本,其中决策边界完全收敛。
可以在 GitHub 上找到一些简单的代码,用于合成基本数据,并拟合 SVC 和 LR(有和没有正则化),以便我们可以看到它们的决策边界收敛和重合:
https://github.com/thenineteen/ML_intuition
最终结果:
图 5:(上图)SVC 决策边界。(下图)LR 决策边界作为其成本函数中的正则化参数被减少。
线性核 SVC 和逻辑回归可以产生相同的决策边界,即完全相同的模型,因此可以产生完全相同的性能指标,尽管使用完全不同的方法。当所有特征都是二进制的,目标变量是二进制的,并且 LR 的正则化参数设置为零时,会发生这种情况。
原文:https://towardsdatascience.com/support-vector-machine-4b2fb9d3e71c?source=collection_archive---------58-----------------------
支持向量机学习算法简称 SVM,常用于分类问题。这给了我们一个更好的方法来理解一个非线性的决策边界。
让我们首先考虑一个场景,在这个场景中,我们可能想要对以下数据进行分类—
用于说明简单 SVM 模型的数据集。
很明显,可以使用简单的线性判定边界将数据分成各自的类别。然而,有多个这样的决策界限可以用来区分这两个类别。事实上,有无限多的线性决策边界可以用来区分红色和蓝色类别。考虑以下决策界限—
可用于数据分类的可能决策界限。
从上面的讨论中,我们可以得出结论,我们想要一个决策边界,它不要太靠*这两个类中的任何一个。为了帮助我们找到这样一条线,我们使用了 SVM。
支持向量机学习算法集中在两类中彼此接*的那些点上。这个想法是,如果一个分类器在分类具有挑战性的点方面做得很好,它很可能在数据上表现得更好。SVM 通过从这两个被称为支持向量的类中查找最*的点来做到这一点。一旦 SVM 找到了它的支持向量,它将试图找到一条距离这些点最远的线。在两点的情况下,垂直*分线是等距的线,因此离两点的距离最大。任何其他线都会比另一条线更靠*一个点。
我们还可以说,给定支持向量和多条线,我们将选择距离所有支持向量尽可能大的那条线作为我们的决策边界。
支持向量和超*面说明了 SVM 模型。
因此,SVM 试图找到一个超*面,将数据分为两类,同时试图最大化超*面和类的支持向量之间的距离。
n 维空间中的超*面是该空间的 n-1 维子集。它把空间分成两个独立的部分。在 1 维空间的情况下,点是超*面,在 2 维空间的情况下,线是超*面,在 3 维空间的情况下,*面是超*面,依此类推。
在实际场景中,数据并不像拟合线性决策边界那样简单。看一下下面的数据集——
用于 SVM 模型的数据集。
具有非线性决策边界的数据集。
对于数据集来说,使用直线作为决策边界绝对不是一个好的选择。
这里的解决方案是将我们的二维数据转换成一个更高的三维数据,从而使其可分离。让我们添加第三维度 z 作为 z=xy.*
这里应用的变换将一个二维数据集映射到一个更高的三维数据集以找到一个最佳超*面。这些变换被称为 SVM 的内核技巧。在内核技巧中,使用一个函数将数据映射到更高维度,以便数据变得可分离,并找到决策边界。
将数据转换到更高的*面。
观察到,通过应用核,蓝色类的所有点都被限制在 x-y *面上,绿色类的所有点都被提升到 x-y-z 空间,从而给我们一个*面作为我们的最优超*面。
为了简单起见,让我们假设 z=1 是最佳决策边界。然而,SVM 将输出一个超*面,使得它与任一类的支持向量的距离最大。
变换数据上的超*面。
我们通过使用转换 z=xy* 将我们的 2D 数据映射到 3D 数据。现在我们将把决策边界 z=1 从 3D 空间映射到 2D 空间。这给了我们 xy=1。这就是 SVM 变换数据并输出决策边界的方式。*
映射的决策边界。
线性、径向基滤波器、多项式、Sigmoid 和拉普拉斯是几种常用的 SVM 核。
内核的详细讨论超出了本文的范围。然而,让我们简要地讨论一下 SVM 模型的两个基本参数
正则化参数解决了这样一个问题,您希望在多大程度上避免对训练数据进行错误分类。值越高,训练数据的错误分类就越少。然而,模型可能会过度拟合。在 sklearn 中用 C 表示。
左图:较小的 C 值给出了简单的广义边界。右图:C 值越大,边界越倾向于过度拟合。
Gamma 决定将多少个样本作为支持向量。较小的值意味着只有更接*可能的超*面的实例将用于进一步拟合它。然而,大的值意味着在拟合超*面时也使用远离超*面的实例。
左图:Gamma 值越小,决策边界周围的实例数量越少。右图:gamma 值越大,意味着在拟合决策边界时包含的实例数量越多。
乍一看,你可能会认为 SVM 类似于逻辑回归,但是最优超*面由 SVM 中的支持向量控制,而不是逻辑回归中考虑的所有数据点。此外,逻辑回归遵循统计方法并输出概率,然而 SVM 是由几何方法支持的。SVM 旨在通过最大化支持向量之间的距离来输出最优超*面,从而降低错误率。
建议从逻辑回归开始,然后用线性核进行 SVM。在跟踪所选性能指标的同时,可以进一步尝试其他内核,如 RBF。
这是一个将癌症分为恶性或良性的例子。该示例使用具有线性核的 SVM,并使用准确度作为性能度量。请随意尝试不同的内核,并试验模型的超级参数。
[## 谷歌合作实验室| Abhishek Kumar
colab.research.google.com](https://colab.research.google.com/drive/1WfnJQ4z3tXVst7ZJxVjGBCtDHNeRdwPE?usp=sharing)
SVM 已在以下文件中详细讨论过—
[## 1.4.支持向量机-sci kit-学习 0.23.2 文档
scikit-learn.org](https://scikit-learn.org/stable/modules/svm.html)
我希望这篇文章能帮助你对 SVM 背后的直觉和相关参数如核、正则化和伽玛有一个公*的理解。
原文:https://towardsdatascience.com/support-vector-machine-803884d967e3?source=collection_archive---------12-----------------------
在这篇文章中,我们将讨论使用支持向量机(SVM)作为分类模型。我们将从探索其背后的思想开始,将这个思想转化为一个数学问题,并使用二次规划(QP)来解决它。
先从分析模型背后的直觉开始。线性分类算法的目标是将输入空间划分为由不同类别标记的区域。这样,我们可以根据任何新数据点所属的区域来预测它的类别。不同的统计模型在如何找到这个决策边界上存在分歧,在本帖中,我们将讨论 SVM 使用的策略。
下面我们有一个包含两个类的数据集。这里我们展示了由线 1 和线 2 表示的两个决策边界。很容易看出,有许多其他线可以以所有观察值都被正确分类的方式划分输入空间——事实上,有无限多条线。
那么 SVM 是如何选择路线的呢?主要有两个思路。注意点 A 离线 1 有多远。根据线 1 定义的决策边界,我们似乎可以直观地得出这样的结论:预测点 A 属于圆类比预测点 b 属于圆类更有把握。SVM 旨在最大化其在训练集中的预测可信度。还要注意,有许多点非常靠*第 2 行:这意味着对决策边界参数的任何调整都可能导致不正确地预测其中一些点的类别。这两个想法结合起来形成了 SVM 背后的直觉。
注意:在这篇文章中,你会看到超*面这个词的使用。超*面只是一个比其周围空间少一个维度的子集的花哨名称,SVM 决策边界就是这种情况。这意味着,如果输入空间在ℝᵖ,则决策边界具有(p-1)维。例如,在下图中,输入空间位于ℝ,因此 SVM 决策边界是一维的:一条线。
作者图片
SVM 是一个线性分类模型。对于输出 y ∈ {-1,1},我们可以将假设函数写成输入的线性组合:
我们预测:
直觉上,假设值离零越远,我们对自己的预测就越有信心。如果 h(x) = 10,我们比 h(x) = 0.1 时更有信心预测 y=1。
这可能会导致这样的想法,即我们希望找到参数( w ,b),当 y⁽ⁱ⁾ = 1 时,该参数将最大化 h 的值,而当 y⁽ⁱ⁾ = -1 时,该参数将最小化 h 的值。换句话说,我们可能倾向于最大化功能边际 γ̂:
但这有一个问题:注意预测的类如何只依赖于 h 的符号。这意味着我们可以缩放参数,例如( w ,b) → (10 w ,10b),而不改变预测的类。这会将 h 的值缩放 10 倍,并给出一个错误的想法,即我们的模型对其预测有 10 倍的信心。
这就是几何余量概念的由来。几何余量 γ̂被定义为第 I 次观察到判定边界的距离。与功能裕度不同,该度量对于参数的缩放是不变的。毕竟 w ᵀ x + b = 0 定义的超*面和 10wᵀx+10b = 0 定义的超*面是一模一样的。
SVM 寻找离每个类最*的成员尽可能远的超*面。看下面的图,我们可以看到 P₁和 P₂是每个班级最接*的观测值。SVM 判决边界与 P₁和 P₂等距,即 d₁ = d₂.最后也是最重要的一点是,在对训练集中的每个观察值进行正确分类的所有决策边界中,支持向量机具有最大的最小距离 d₂).min(d₁
换句话说,如果我们定义γ =最小γ⁽ⁱ⁾,SVM 寻找具有最大γ值的超*面。
SVM 旨在最大化最小几何余量。
作者图片
在继续之前,我们需要谈论一件处理 SVM 时非常重要的事情:特征缩放。由于 SVM 优化的目标是基于几何距离,具有非常不同的缩放比例的轴使模型倾向于具有最大值的方向。
例如,在下图中,我们可以看到,在缩放要素之前,SVM 会寻找一个决策边界,以使距离矢量 d₁具有尽可能大的垂直分量。这就是为什么我们应该在拟合 SVM 之前应用要素缩放。
在拟合 SVM 之前,请始终缩放要素
作者图片
正如我们之前所说,SVM 是一个线性模型,这意味着它擅长在数据中寻找线性关系。但是正如你所想象的,大多数真实世界的数据集不是线性的。虽然我们不能改变 SVM 本身的性质,但我们可以改变输入模型的内容。让我们看看为什么以及如何帮助。
下图很好地说明了更改输入如何帮助 SVM 模型建立非线性关系。在左边,数据显然不是线性可分的,也就是说,我们找不到一个点,它的右边是一个类,而左边是另一个类。
但是,让我们看看当我们向这个数据集添加一个额外的特征时会发生什么:即,每个观察到点(0)的距离。这意味着在原始输入空间上由(-3)定义的点现在由对(-3,3)表示;类似地,由(5)表示的点变成(5,5)。我们正在将输入空间从一维重新映射到二维。正如您在右图中看到的,这个强大而简单的技巧使数据在ℝ中可以线性分离,因此更适合 SVM。
我们可以通过对原始特征应用非线性变换来避开模型的线性限制。
作者图片
实现这一思想的一种常见方式是向训练集添加更高次的多项式。下图显示了一个具有两个要素(x₂x₁)的数据集,该数据集在ℝ显然不是线性可分的。
我们需要以一种数据变得线性可分的方式来转换输入(不要忘记在之后缩放它!).我们将添加三次多项式特征,重新映射从ℝ到ℝ ⁰的输入空间,使得(x₁,x₂)变成(1,x₁,x₂,x₁x₂,x₁,x,x。不幸的是,我们看不到很酷的 10 维图,所以我们满足于用原始特征来表示 2D。请注意,要对新数据点进行预测,我们需要在将其输入 SVM 之前应用相同的多项式变换。
作者图片
另一种解决 SVM 线性限制的方法是使用相似性度量,它是量化两个数据点之间相似性的简单函数。最常见的相似性函数之一是高斯径向基函数 (RBF),其定义为:
我们可以选择几个标志点,并将输入重新映射到包含到每个标志点的距离的向量。因此,如果我们有三个标志点( l ₁、 l ₂、 l ₃),并且我们正在使用径向基函数相似度函数ϕ,那么原本由 x 表示的观察结果就变成了(ϕ( x 、 l ₁)、ϕ( x 、 l ₂)、ε(x、)
但是我们如何挑选数据点作为地标呢?一种策略是只选择训练集中的每一点。这显然不能很好地扩展,因为我们为每个新的观察值创建一个额外的特征,这样一个具有 500 个观察值和三个特征的训练集就变成了一个具有 500 个观察值和 500 个特征的训练集(假设我们丢弃了原始特征)。
在这篇文章的后面,我们将介绍一种以更加优雅和高效的方式实现这个想法的方法。现在,我们可以在下面看到这个概念的一个更简单的实现,使用训练集中的每个观察值作为一个标志,以及它如何影响 SVM。
作者图片
如前所述,SVM 是一个线性分类模型,我们可以将其假设函数写成输入的线性组合:
我们预测:
现在是时候将寻找最大几何余量的 SVM 目标转化为一个数学问题了。给定一个点 x ⁽ⁱ⁾,它到由 w ᵀ x + b = 0 定义的决策边界的距离是多少?嗯,我们知道 w 是这个超*面的法向量,也就是说它垂直于*面。而如果 w 是法向量,那么 w /|| w ||就是垂直于*面的单位向量。
作者图片
现在让γ是从 x 到超*面的距离——我们可以说x-γ*(T24)w/| |w| |)落在超*面上(在上图中用 p 表示)。最后由于 p 是超*面上的向量,这意味着它必须满足超*面的方程 w ᵀ p + b = 0。这给了我们下面的方程组:
而如果我们求解γ,我们发现一个点 x ⁽ⁱ⁾到 SVM 判决边界的距离由γ⁽ⁱ⁾=(wᵀx⁽ⁱ⁾+b)/| |w| |给出。注意这个等式只对与法向量 w 方向相同的点有效,因为我们从 x 中减去了它;否则我们将不得不添加γ w /w ||。稍微调整一下,我们可以将广义的几何余量 γ写成:
我们可以再次验证,如前所述,几何余量对参数的缩放是不变的。还要注意,如果|| w ||= 1,那么几何余量和功能余量是相同的。
硬边界 SVM 假设数据是线性可分的,它强制模型对训练集上的每个观察值进行正确分类。如果第 I 个观察值的功能裕度大于零,则该观察值被正确分类:
还记得我们说过预测的类只依赖于 h 的符号,几何边界对于参数的缩放是不变的吗?这意味着我们可以在不影响模型的情况下向参数添加任意约束。对于任何拟合的 SVM,我们可以施加一个约束,如|| w || = 1,然后我们需要做的就是重新调整其参数,模型保持不变。
我们可以使用这个结果以及当|| w || = 1 时几何和功能裕度相等的事实来写出硬裕度 SVM 的优化目标:
第一个约束迫使每个观察值被正确分类。第二个约束迫使γ不仅是功能裕度的下限,而且是几何裕度的下限。这正是硬边际 SVM 的优化目标:
为了在没有任何错误分类的情况下最大化最小几何余量
如果我们有工具来解决这个约束优化问题,我们就可以到此为止了。但是不幸的是,|| w || = 1 是一个非凸约束,所以我们需要做一些修改来使这个问题变得更加友好。
我们可以通过将目标除以范数来摆脱讨厌的约束——如果γ是功能裕度的下界,那么γ/|| w ||是几何裕度的下界。所以我们的新问题可以写成:
现在是目标函数非凸,但是我们又*了一步。记住最后一次,我们可以给参数添加任意约束。因此,我们可以设置γ = 1,同样,这不会改变模型,只需重新调整参数即可满足要求。
我们新的优化目标是最大化 1/|| w ||,这相当于最小化|| w ||。最后,由于|| w ||在 0 处不可微,我们将最小化(1/2)*|| w ||取而代之,它的导数就是 w 。优化算法在可微分函数上工作得更好。
最后,我们将硬边际 SVM 优化目标定义为:
既然我们已经以一种可以有效估计的方式定义了 SVM 优化目标(一个二次目标和线性约束),我们就可以编写代码来解决它了。通读下面的代码(或者在这个 repo 中)或者尝试使用 SciPy 的最小化函数自己实现它。如果你阅读文档,你会看到要最小化的目标函数以一个列表作为参数,所以我们将把 w 和 b 放在同一个向量中。它还需要一个 constraints 参数,该参数可以表示一个等式(约束函数必须返回 0)或一个不等式(约束函数必须返回非负值)。我们将把广义约束重写为 y⁽ⁱ⁾(wᵀx⁽ⁱ⁾+b)——1≥0,以符合 SciPy 的规范。
现在我们可以看到我们模型与 SKLearn 的实现进行对比时的表现。不算太差!
作者图片
硬边际 SVM 有两个非常重要的局限性:
-它只对线性可分数据有效;
-对异常值非常敏感。
如果我们想要更多的灵活性,我们需要为模型引入一种允许错误分类的方法,我们使用松弛变量的概念来实现这一点。每个观察都有自己的松弛度量,它代表了特定数据点违反边界的程度。我们的新约束可以改写为:y⁽ⁱ⁾(wᵀx⁽ⁱ⁾+b)≥1-ϵ⁽ⁱ⁾.请注意,我们现在需要为每个观察值估计一个额外的变量。
现在只有一个问题。如果我们仍然试图最小化|| w ||,我们可以简单地让ϵ → ∞并且确保新的约束将被遵守。我们需要新的目标函数来表示软利润 SVM 冲突目标:我们仍然希望利润尽可能宽,我们希望松弛变量尽可能小,以防止利润违规。这为我们提供了软边缘 SVM 分类器目标:
我们引入了一个新的超参数 C,让我们控制冲突目标之间的权衡。随着 c 的增长,它迫使优化算法为ϵ.寻找更小的值下面你可以看到不同的 C 值是如何影响 SVM 的。
作者图片
在我们对软利润 SVM 的实现进行编码之前,我们需要引入一个新概念。
二次规划(QP)是一个解决特定类型的优化问题的系统,其中目标函数是二次的,约束是线性的-正是我们一直在处理的问题类型!
不同的算法如何解决 QP 优化超出了本文的范围。相反,我们将专注于推导 SVM 优化问题,该问题由像 libsvm 这样的库来解决。
给定 QP 问题定义为:
我们需要做的就是找出代表 SVM 问题的 P,q,G,h 的值,然后我们可以使用一个求解器(稍后我们将使用 cvxopt 来得到参数的估计值。
注意,我们需要重写 SVM 约束来适应 QP 约束的形状。它们将是:
因此,对于软余量 SVM ,让 X 是由 m×(n+1)矩阵(m 个观察值和 n 个特征)表示的训练集,用 1 列向量为截距进行左填充。然后 SVM·QP 问题被定义为:
为什么由于我们需要估计 b, w ,和 ϵ ,QP 问题的向量 u 就变成了【b,w₁,…,wₙ,ε₁,…,εₘ].然后:
-p矩阵用恒等式把 w 弄回来,用零抵消 b 和ϵ;
——q向量将 b 和 w 乘以 0,将 ϵ 乘以 c,这样我们就有了优化目标的第二部分——∑ᵢ₌₁ᵐε⁽ⁱ⁾;
——k矩阵给我们-y⁽ⁱ⁾(wᵀx⁽ⁱ⁾+b ),它右边的-Iₘ减去εᵢ. G 矩阵的底行代表-ϵ⁽ⁱ⁾≤0;
-最后 h 向量有-1 和 0,就像约束条件一样(≤ -1 和≤ 0)。
现在我们所要做的就是把这些值给 QP 软件,我们就有了软边际 SVM 的参数。你可以查看下面实现这个想法的代码(或者在这个 repo 里)。我们已经取得了很大进展,但我们还没有完成。
还记得我们在本文前面讨论过相似性度量作为解决 SVM 线性限制的一种方法吗?事实证明,对于这个问题,有一个比明确地将每个观察作为一个标志并转换输入更优雅和有效的解决方案。
我们接下来将讨论拉格朗日对偶。这将导致我们对软边际 SVM 优化问题的不同表示(称为其对偶形式)。我们将能够以更有效的方式在输入空间中应用非线性变换,使得 SVM 即使在非常高的维度中也能很好地工作。
拉格朗日方法的总体思想是通过将约束移入目标函数,将约束优化问题(原始形式)转化为无约束优化问题(对偶形式)。将 SVM 最优化问题写成对偶形式有两个主要原因:
希望在这篇文章结束时,这些原因会变得清晰。现在,让我们暂时把 SVM 放在一边,考虑一下如何解决下面这样的约束优化问题。
为简单起见,我们将分析一个只有不等式约束的问题(如 SVM),但结果可以很容易地扩展到等式。重写这个问题的一种方法是使用无限阶跃函数 g(u):
然后,我们可以将原问题改写为:
请注意,如果任何原始约束不满足,我们用正无穷项惩罚 J(x)。并且当所有的约束条件都满足时,那么 g(fᵢ(x)) = 0 ∀ i 和 J(x) = f₀(x).所以最小化 J(x)等价于原问题,但是我们还不能真正解决这个新的优化——阶跃函数既不连续也不可微。
如果我们用一个像 g(u) = α u 这样的线性函数代替无限阶跃函数会怎么样?如果我们强制α ≥ 0,那么当不满足约束时(α u > 0),惩罚至少是在正确的方向上。此外,g 现在是连续可微的:更适合于最优化问题。
因此,如果我们在上面的 J(x)方程中代入新的线性惩罚,我们得到 x 和α的函数,称为拉格朗日函数:
注意,如果我们最大化关于α的拉格朗日函数,我们会得到 j(x):αᵢ= 0 如果 fᵢ(x) < 0 (since αᵢ ≤ 0) and αᵢ → ∞ if fᵢ(x) > 0。所以原来的问题现在可以写成拉格朗日函数:
最后,由于对于任何函数 f,最小最大 f ≥最大最小 f,我们有:
minₓ L(x, α )称为对偶函数,它的最大值是原(原始)优化问题的一个下界。此外,可以证明,在某些条件下:
这样我们就可以解决对偶问题,而不是原始问题。幸运的是,SVM 满足这些条件(特别是 Slater 条件):目标函数和约束函数是凸的且连续可微的。
由于 SVM 满足正则性条件,如果原始问题有解,它必然在满足卡鲁什-库恩-塔克(KKT)条件的拉格朗日函数的驻点(x* ,α *)之间。此外,在 SVM(凸可微)的情况下,KKT 条件不仅是必要的,而且是最优性的充分条件。
KKT 条件是什么?如果原问题有解 x* ,α 是对偶问题的解,那么 L(x ,α ) = f₀(x).那么必须满足 KKT 条件:
下面我们有软边际 SVM 优化问题:
如果我们将这两个约束重写为:
拉格朗日量可以写成:
记住,由于 SVM 最优化问题满足一些特殊的条件(目标和约束函数是凸的和连续可微的),拉格朗日函数的任何解都是原始最优化的解,并且它必须满足 KKT 条件。从 KKT 我们有:
从双重可行性条件,我们有:
因此,基于 b 上的偏导数,基于 w 上的梯度,以及基于对偶可行性条件,我们导出对偶问题的约束:
我们快到了!回到拉格朗日函数,让我们用从 w 梯度得到的结果(w=∑ᵢ₌₁ᵐα⁽ⁱ⁾y⁽ⁱ⁾x⁽ⁱ⁾)代入拉格朗日和的最后一项:
让
然后把所有东西都代入拉格朗日方程:
最后,由于∑α⁽ⁱ⁾y⁽ⁱ⁾=λ⁽ⁱ⁾-α⁽ⁱ⁾= 0,我们终于有了软裕度 SVM 的对偶形式(在乘以-1 并将最大化转化为最小化问题之后):
现在我们只需要从拉格朗日乘数 α 中取回权重矢量 w 和偏差项 b。对于权重,我们可以简单地使用这样的事实:w =α⁽ⁱ⁾y⁽ⁱ⁾x ⁽ⁱ⁾.注意,我们只关心α⁽ⁱ⁾为 0 的指数。
为了让 b 回来,让我们最后看一下 KKT 的条件——从免费的宽松,我们有:
从第一个等式中,我们看到,当αᵢ* > 0 时,第 I 个约束必须有效,也就是说,它必须满足等式:
基于λ⁽ⁱ⁾ ϵ⁽ⁱ⁾ = 0 和 C - α⁽ⁱ⁾ - λ⁽ⁱ⁾ = 0,我们得到 0 < α⁽ⁱ⁾ < C => λ⁽ⁱ⁾ > 0 => ϵ⁽ⁱ⁾ = 0。我们将对训练样本的这个子集进行*均,以计算 b。如果 0 < α⁽ⁱ⁾ < C, we have:
where M is the subset of the training sample that satisfy 0 < α⁽ⁱ⁾ < C and nₘ is its size. Last, to make a prediction about a new observation x ,我们需要计算:
这是一个漫长的旅程,但我们刚刚导出了流行的库 libsvm 解决的精确优化问题!稍后我们将使用一个标准的 QP 求解器,但是如果你对他们如何更有效地求解它感兴趣,你可以看看这篇论文,其中他们展示了 libsvm 库所基于的序列最小优化(SMO)算法。
有两个非常重要的结果需要强调:
1.SVM 预测仅依赖于α⁽ⁱ⁾ > 0 的观测值。这些点代表训练样本的一个非常特殊的子集,称为支持向量。
一旦模型被训练,我们通常可以丢弃大部分训练集,只保留支持向量。
2.在训练和进行预测的过程中,我们只能通过内积来依赖数据点(x⁽ⁱ⁾)ᵀ x⁽ʲ⁾.这个美丽而重要的结果就是允许内核欺骗。
在非线性分类部分,我们讨论了在拟合 SVM 之前对原始要素应用非线性变换。这个简单的技巧允许线性 SVM 捕捉数据中的非线性关系。
例如,假设ϕ是一个特征映射函数,如下所示:
我们希望使用ϕ( x ,而不是使用原始特征(x₁、x₂)来拟合 SVM。我们已经看到,当使用对偶形式时,SVM 仅通过它们的内积依赖于数据点。这意味着我们只需要计算:
这就是内核的用武之地。在机器学习中,内核是仅基于原始向量( x ⁽ⁱ⁾、 x ⁽ʲ⁾).)计算内积ϕ(x⁽ⁱ⁾)ᵀϕ(x⁽ʲ⁾的函数不需要计算变换ϕ( x )甚至不需要知道它!
让我们看一个简单的例子。设ϕ( x 为如下定义的特征映射函数:
那么两个向量a=【a₁,a₂】和 b =[b₁,b₂】在应用变换ϕ后的内积为:
这是一个非常有趣的结果。变换向量的内积等于原始向量的内积的*方。您根本不需要应用转换!
如果我们要对此数据进行 SVM 拟合,我们可以简单地取原始向量的内积的*方,事实上,我们将为转换后的向量拟合一个模型。
内核的另一个例子是我们之前提到的 RBF 函数。原来,嵌入在 RBF 核中的转换将每个训练实例映射到一个无限维空间。
这是内核如何有用的一个完美例子:它允许 SVM 在一个高(或无限!)维特征空间,而只需要计算原始向量的核函数。
这都回避了一个问题:每个函数都可以用作内核吗?可以证明,如果一个函数 K( a , b )满足几个条件(默瑟条件,那么存在一个函数ϕ,它将 a 和 b 映射到另一个空间,这样:K( a ,b)= ϕ(a)ᵀϕ(b)。然后我们可以用 k 作为核,因为我们知道ϕ存在。所以只要一个函数满足 Mercer 的条件,就可以作为内核使用。
最后一点注意:如果我们使用核,我们通常不能从拉格朗日乘数得到权重向量。发生这种情况是因为,在转换输入后,w=∑ᵢα⁽ⁱ⁾y⁽ⁱ⁾ϕ(x⁽ⁱ⁾)和ϕ不一定是已知的。但是这没有问题,因为在其他地方我们只需要计算ϕ(x⁽ⁱ⁾)ϕ(x⁽ʲ⁾)= k(x⁽ⁱ⁾, x ⁽ʲ⁾).
既然我们知道了如何推导和解决 SVM 优化问题,我们就可以理解它背后的代码了。原始代码可在本报告中获得——唯一的变化是通过对 0 < α⁽ⁱ⁾ < C(而不是 0 < α⁽ⁱ⁾).)的实例进行*均来估计 b
就是这样!我希望你和我一样通过写这篇文章学到了很多。你可以在这里找到一个笔记本来玩我们在这个帖子中编码的三个模型。
——【http://cs229.stanford.edu/notes/cs229-notes3.pdf
-https://www-cs . Stanford . edu/people/David Knowles/la grangian _ duality . pdf
——https://gist.github.com/mblondel/586753
——Christopher Bishop——模式识别和机器学习(链接)
原文:https://towardsdatascience.com/support-vector-machine-explained-8d75fe8738fd?source=collection_archive---------10-----------------------
支持向量机(SVM)是一种监督机器学习算法,主要用于分类任务。它也适用于回归任务。
监督学习算法试图使用特征(自变量)来预测目标(因变量)。根据目标变量的特征,它可以是分类(离散目标变量)或回归(连续目标变量)任务。预测是通过将自变量映射到因变量的映射函数来完成的。SVM 的映射函数是一个判定边界,它区分两个或多个类别。如何绘制或确定决策边界是 SVM 算法中最关键的部分。
在创建决策边界之前,在 n 维空间中绘制每个观察值(或数据点)。“n”是使用的特征数量。例如,如果我们使用“长度”和“宽度”来对不同的“细胞”进行分类,则观察值被绘制在二维空间中,而决策边界是一条线。
二维空间中的 SVM
这是一个非常简单的例子,只是为了说明 SVM 的想法。你在现实生活中遇到这样的任务的可能性极小。在这种情况下,决策边界是一条线。如果我们使用 3 个特征,则判定边界是三维空间中的*面。如果我们使用 3 个以上的特征,决策边界就变成了一个超*面,很难可视化。
支持向量
主要动机是绘制一个决策边界,使支持向量的距离最大化。以到支持向量的距离最大化的方式绘制决策边界。如果决策边界离支持向量太*,会对噪声高度敏感,不能很好地泛化。即使独立变量非常小的变化也可能导致错误分类。
决策边界的错误选择
数据点并不总是线性可分的,如上图所示。在这些情况下,SVM 使用了核技巧,它测量高维空间中数据点的相似性(或接*度),以使它们线性可分。下面的图更容易理解。如你所见,二维空间中两个不同的类不能用一条线分开。使用内核技巧可以使它们线性分离:
图源
图源
在我详细讲述内核技巧之前,我想提一下 c 参数和 T2 的概念。
真实数据是有噪声的,并且在大多数情况下不是线性可分的。一个标准的 SVM 试图将所有的正面和负面例子(即两个不同的类)分开,不允许任何点被错误分类。这导致过度拟合模型,或者在某些情况下,无法使用标准 SVM 找到决策边界。过度拟合的 SVM 在训练集上取得了很高的精度,但在新的、以前未见过的样本上表现不佳。为了解决这个问题,1995 年,Cortes 和 Vapnik 提出了“软边界”SVM 的概念,它允许一些例子被错误分类或位于决策边界的错误一侧。软边际 SVM 通常会产生更好通用模型。当确定决策边界时,软裕度 SVM 试图解决具有以下目标的优化问题:
这两个目标之间显然有所取舍。决策边界可能必须非常接*一个特定类,才能正确标记训练集中的所有数据点。然而,在这种情况下,测试数据集的准确性可能会较低,因为决策边界对噪声和独立变量的微小变化过于敏感。另一方面,决策边界可能被放置在尽可能远的每个类,代价是一些错误分类的异常。这种权衡由 c 参数控制。
C 参数为每个错误分类的数据点增加一个惩罚。如果 c 很小,则对误分类点的惩罚也很低,因此以更大数量的误分类为代价选择了具有大余量的决策边界。如果 c 很大,SVM 试图最小化由于高惩罚导致的错误分类的例子的数量,这导致了具有较小裕度的决策边界。对于所有错误分类的例子,惩罚是不同的。它与到决策边界的距离成正比。
核函数是一种相似性度量。输入是原始特征,输出是新特征空间中的相似性度量。这里的相似性是指接*的程度。将数据点实际转换到高维特征空间是一个代价很高的操作。该算法实际上并不将数据点转换到新的高维特征空间。内核化 SVM 根据高维特征空间中的相似性度量来计算决策边界,而不实际进行变换。我想这也是为什么又叫内核绝招的原因吧。
图源
scikit-learn 中可用的核函数有线性、多项式、径向基函数(RBF)和 sigmoid。
RBF(或高斯 RBF)是一种广泛使用的核函数。它由伽马参数定义,该参数基本上控制单个训练点的影响距离。低 gamma 值表示较大的相似性半径,这将导致更多的点被组合在一起。对于高 gamma 值,这些点需要彼此非常接*,才能被视为在同一组(或类)中。因此,gamma 值非常大的模型往往会过度拟合。以下可视化更好地解释了这个概念:
数字来源
随着灰度系数的降低,分隔不同类别的区域变得更加一般化。非常大的 gamma 值会导致太特定的类别区域(过度拟合)。
对于线性核,我们只需要优化 c 参数。然而,如果我们想要使用 RBF 核,则需要同时优化 c 和γ参数。如果γ很大,c 的影响可以忽略不计。如果 gamma 很小,c 对模型的影响就像它对线性模型的影响一样。c 和γ的典型值如下。然而,根据应用可能存在特定的最佳值:
0.0001 < gamma < 10
0.1 < c < 100
对于 SVM 来说,记住输入数据需要归一化以使要素具有相同的比例和兼容性是非常重要的。
优点:
缺点:
我想通过一个简单的案例来展示语法和应该遵循的步骤。让我们从导入我们需要的库开始:
Scikit-learn 还提供实践数据集。乳腺癌数据集适合我们的任务:
我们需要使用 scikit-learn 的 train_test_split 函数来拆分用于训练和测试的数据集。然后,我使用线性核创建用于分类的支持向量机对象,并使用训练数据集对其进行训练:
使用我们训练的模型,我们可以预测测试数据集中的目标变量,并测量模型的准确性:
95%是一个相当不错的准确率,但是对于分类任务,还有另外两个衡量标准:精度和召回。这些术语非常重要,可以成为另一篇文章的主题。事实上,它们在谷歌的机器学习速成班中有明确的解释。
这是一个简单的线性可分的任务。对于不可线性分离的情况,我们可以使用 SVC 的核参数(即 kernel = 'rbf ')来使用核。我没有指定 c 参数,所以使用了默认值(c=1)。为了找到最佳参数,我们可以使用 scikit-learn 的 GridSearchCV() 函数。
感谢您的阅读。如果您有任何反馈,请告诉我。
原文:https://towardsdatascience.com/support-vector-machine-svm-for-anomaly-detection-73a8d676c331?source=collection_archive---------3-----------------------
伊万·班杜拉在 Unsplash 拍摄的照片
作为机器学习的专家或新手,你可能听说过支持向量机(SVM)——一种经常被引用并用于分类问题的监督机器学习算法。支持向量机使用多维空间中的超*面来将一类观察值与另一类分离。自然,SVM 用于解决多类分类问题。
然而,SVM 也越来越多地用于一类问题,其中所有数据都属于一个类。在这种情况下,算法被训练来学习什么是“正常的”,以便当显示新数据时,算法可以识别它是否应该属于该组。如果不是,新数据被标记为异常或异常。要了解更多关于一级 SVM 的信息,请查看 Roemer Vlasveld 的这篇长文。
最后要提的是,如果你熟悉库,你会注意到有一个算法是专门为所谓的“新奇检测”设计的。它的工作方式与我刚刚在使用一类 SVM 的异常检测中描述的方式类似。在我看来,只是上下文决定了是否称之为新奇检测或异常检测或类似的东西。
今天的文章是我的异常、异常值和欺诈检测算法系列的继续,并附有实际操作的示例代码。我之前的 7 篇文章谈到了异常检测领域中可用的不同工具和技术,如果您有兴趣了解它们,请访问以下链接:
下面是一个用 Python 编程语言编写的单类 SVM 的简单演示。请注意,我将异常值和异常值互换使用。
对于这个演示,我们需要三个核心库——数据处理库和,模型构建库和可视化库。
我使用的是网上著名的虹膜数据集,所以你可以跟着练习,不用担心从哪里得到数据,如何清理这些数据。
与其他分类算法中的超参数调整不同,一类 SVM 使用 nu 作为超参数,用于定义数据的哪一部分应被归类为异常值。 nu = 0.03 表示算法会将 3%的数据指定为异常值。
预测数据集将具有 1 或-1 值,其中-1 值是算法检测到的异常值。
红色的数据点是异常值
在这篇文章中,我想温和地介绍一下单类 SVM——一种用于欺诈/异常值/异常检测的机器学习算法。我展示了一些简单的步骤来建立直觉,但是当然,现实世界的实现需要更多的实验来发现什么对特定的环境和行业有效,什么无效。
感谢你的关注,要了解更多关于我的工作,你可以在推特或 LinkedIn 上关注我
原文:https://towardsdatascience.com/support-vector-machines-and-regression-analysis-ad5d94ac857f?source=collection_archive---------22-----------------------
来源:图片由作者创建—基于 Aurélien Géron 的“使用 Scikit-Learn 和 TensorFlow 进行机器学习”中的视觉模板
一个常见的误解是,支持向量机只在解决分类问题时有用。
使用支持向量机解决回归问题的目的是定义一个如上图所示的超*面,并在该超*面内尽可能多地拟合实例,同时限制边界违规。
以这种方式,以这种方式使用的 SVM 不同于分类任务,在分类任务中,目标是在两个单独的类之间拟合最大可能的超*面(同时还限制边界违反)。
事实上,支持向量机可以非常有效地处理回归建模。我们以酒店预订为例。
假设我们正在构建一个回归模型来预测酒店预订的*均每日价格(或客户*均每日支付的价格)。模型由以下特征构成:
请注意,还会为取消预订的客户填充 ADR 值—本例中的响应变量反映了如果客户继续预订将支付的 ADR。
Antonio、Almeida 和 Nunes (2016)的原始研究可从下面的参考资料部分获得。
使用如上所述的特征,在训练集(H1)上训练和验证 SVM 模型,将预测与测试集(H2)上的实际 ADR 值进行比较。
该模型被训练如下:
现在,对测试集中的特征使用相同的模型来生成预测的 ADR 值:
让我们在*均绝对误差(MAE)和均方根误差(RMSE)的基础上比较预测 ADR 和实际 ADR。
注意,SVM 对额外训练实例的敏感度由ε(ϵ)参数设置,即参数越高,额外训练实例对模型结果的影响越大。
在这种情况下,使用了大幅度的 1.5 。以下是使用 0.5 裕量时的模型性能。
我们可以看到,通过修改 ϵ 参数,MAE 或 RMSE 参数实际上没有变化。
也就是说,我们希望确保 SVM 模型不会过度拟合。具体来说,如果我们发现当 ϵ = 0,时达到最佳拟合,那么这可能是模型过度拟合的迹象。
这是我们设置ϵ = 0 时的结果。
鉴于当ϵ = 0 时,我们没有看到更高的精度,似乎没有任何证据表明过度拟合是我们模型中的一个问题——至少从这个角度看不是。
当使用相同的功能时,SVM 的性能精度与神经网络相比如何?
考虑以下神经网络配置:
模型被训练跨越 30 个时期,批量大小为 150 :
在测试集上获得了以下 MAE 和 RMSE:
我们观察到,当 SVM 模型的ϵ 设置为 1.5 时,MAE 和 RMSE 分别为 29.5 和 44.6。在这点上,SVM 在测试集上的预测精度与神经网络相当。
一个常见的误解是,支持向量机只适合处理分类数据。
然而,我们在这个例子中已经看到,SVM 模型在预测神经网络的 ADR 值方面非常有效。
非常感谢您的阅读,并感谢任何问题或反馈。
本例的 Jupyter 笔记本和数据集可在 MGCodesandStats GitHub 存储库获得。其他相关参考资料如下。
免责声明:本文是在“原样”的基础上编写的,没有任何担保。本文旨在提供数据科学概念的概述,不应以任何方式解释为专业建议。
原文:https://towardsdatascience.com/support-vector-machines-explained-25a685e4d228?source=collection_archive---------39-----------------------
来自像素的图像。
在本帖中,我们将 揭开发生在 SVM*身上的所有魔法,并讲述它们的一点历史 ,并阐明它们何时该用,何时不该用。*
我们将浏览支持向量机的理论和直觉 ,看到理解万物如何工作所必需的最少的数学量,而不深入细节。
言归正传!
支持向量机或 SVMs 是一个广泛使用的机器学习模型家族,它可以解决许多 ML 问题*,如线性或非线性分类、回归,甚至异常值检测。*
话虽如此,最好的应用是在应用于小型或中型复杂数据集的分类时。贯穿本文,将会清楚为什么。
为了理解支持向量机是如何工作的,我们最好先研究一下线性支持向量机、硬边界和软边界分类。
假设我们有以下一组数据,只有两个特征(特征 1 和特征 2* ,代表两个不同的类别(A 类和B 类))。*
我们数据的散点图
一个正常的线性分类器会试图画一条线,完美地分开我们的两类数据。但是,从下图可以看出,有很多行可以做到这一点。我们该选哪个?
使用线性分类器分离两类
之前的决策边界将训练数据完全分离,然而它们如此接*训练实例(红色和紫色的点,周围有黑色圆圈),以至于它们可能会对新数据*(图中的新样本)进行非常糟糕的概括。*
支持向量机分类器试图通过对模型拟合一条线来解决这个问题,该线试图最大化到最*训练实例(称为支持向量)的距离,以便*行于决策边界线的余量尽可能宽。
将决策边界想象成乡村道路的中心,将数据想象成树,道路的每一侧都有不同类型的树。支持向量机试图做的是找到尽可能宽的道路来分隔我们的两种树,这样我们就可以安全地开车穿过它,同时感到安全。它通过试图最大化利润来做到这一点。
来自 Flaticon 的支持向量机图标背后的直觉。
如果我们现在考虑之前的数据集,对其拟合线性支持向量分类器(线性 SVC ),并绘制决策边界及其余量,我们会得到下图:
线性 SVC 的判定边界
在这种类型的 SVC 中,没有点被允许越过边界:我们正在谈论一个 硬边界分类器 。当一些点被允许穿过边缘线,允许我们适应更宽的街道时,我们谈论的是一个软边缘分类器。
有趣的是,对于这个硬边界分类器,**来说,拟合只取决于支持向量*** 的位置:向我们的训练数据添加不接触街道(但在正确的一侧)的点,将使决策边界和边界保持不变。*
边界由这些关键支持向量点完全定义或支持,给它们和算法命名。 硬边界分类器 然而,只有当数据以线性方式完全可分时才起作用,并且对异常值也非常敏感。
为了解决这个问题,我们进入了 软边界分类器 ,这是一种更加灵活的模型,它允许一些点穿过边界,这使我们在街道有多宽以及有多少边界违规(位于街道内部或决策边界错误一侧的点)之间达成妥协。下图显示了一个线性软边距分类器。
软边界分类器
在大多数 SVC 实现中,我们用模型(Scikit-Learn 中的 C)的超参数来控制它。此参数的值越低,意味着我们的利润越大,违反利润的情况也越多,因此模型更加灵活,可以更好地概括。通过减少 C,我们可以调整我们的模型,如果我们认为它可能是过度拟合。
增加 C 的值将我们引向硬边界分类器。下图显示了这种行为:随着 C 值的减小,街道变宽了,但是我们有更多的点穿过它。
当我们减小 c 的值时,SVC 分类器的裕量发生变化。
然而,大多数时候,数据集并不是线性可分的,软化我们的利润并不完全奏效。
使非线性可分离数据集成为可分离数据集的一种方法是包括从原始数据集中得到的附加特征,例如使用多项式特征或相似性特征技术,如 径向基函数 (RBF)。
下图显示了如何使用二次多项式将只有 1 个要素的数据集转换为 2 个要素的数据集,从而线性分离两个现有的类。
将一个非线性可分离的数据集转换成一个可以用二次多项式线性分离的数据集
这里的问题是,随着要素数量的增加,计算高次多项式要素的计算成本急剧增加,使得模型运行缓慢。
另一种使数据集可线性分离的方式是前面提到的**径向基函数 。下面的例子显示了我们如何将一个非线性可分的数据集转换成一个可以使用 RBF 轻松划分的数据集:
具有两个特征的两个不可分离类的散点图。
现在,如果在前面图像所示的数据集上,我们使用以原点为中心的径向基函数计算第三个特征、**,并且我们将这个新特征与前两个特征一起绘制,我们的数据集被转换成下面的数据集,它可以被新特征r上高度为 0.7 的水*面线性分隔。**
先前数据的表示,带有使用 RBF 计算的附加特征
然而,在前面的例子中,我们选择了一个点来集中我们的 RBF,这给了我们很好的结果,在大多数情况下这不是一件小事。大多数情况下所做的是使用原始特征计算从数据集中的每个点到所有其他数据点的径向基函数,并使用这些径向基函数计算的距离作为新特征。
这里的问题是,如果我们有一个大的训练集,计算所有这些特征是非常计算昂贵的。当试图使用线性 SVC 来分离非线性数据时,我们再次遇到问题。
在这些问题的解决方案中,支持向量机的真正力量在于:内核。
在前面的两个例子中,为了能够分离我们的数据,我们需要计算一个变换(一个多项式变换,和一个 RBF 相似性函数),正如我们所看到的,这是一个计算量非常大的过程。
机器学习中的内核是一个数学函数,它允许我们计算两个向量的变换的点积,而实际上不必计算变换本身。
下面的公式说明了内核背后的思想。
公式 1:向量 a 和 b 的核
前面公式中的 K(a,b) 代表向量的核 a 和 b (一个随机核,后面我们会看到有很多不同的)。我们可以看到,这个内核等于 ϕ(a) 和 ϕ(b) ,的点积,其中 ϕ 表示作为参数提供给它的向量的特定变换(可以是多项式,也可以是 RBF 变换)。
为了理解这如何极大地简化了我们的问题,并且通过使用核,我们可以使用支持向量机来对非线性可分数据集进行分类,我们最好先看看支持向量机是如何被训练的。
最后,训练一个 SVM 分类器,归结为解决一个优化问题,称为对偶问题。SVM 像任何其他分类器一样进行预测:它获取输入向量 x ,将其乘以某个权重向量 w ,并添加一个偏差项 b ,如以下公式所示。
公式 2:预测方程。
如果这个操作给出的结果大于某个阈值(在我们的例子中是 0),那么这个样本被分类为阳性实例(1)。如果它产生的结果低于阈值,那么它被归类为负实例(0)。
为了获得权重和偏差向量,我们必须解决一个优化问题,该问题试图最大化我们谈到的街道的利润,同时限制利润违规。从数学上来说,这被转化为找到满足某个模糊条件或松弛(多少次以及有多严重的余量可以被越过)的权重向量的最小值。
这个优化问题可以使用普通的 QP 求解器来解决,因为它是一个凸二次问题。这个问题解决的最终方程如下
公式 3:优化。
然而,公式 3 并不完全正确。 α 应该是大于或等于 0 ,对于每个不是支持向量的数据点取这个最后的值。
不要在意 t(i) 或 t(j) ,关于这个方程有两件重要的事情:一旦我们求解它并得到 α 的值,我们就可以计算权重和偏置向量。另一件要注意的事情是橙色虚线内的术语:两个训练实例的点积,我们必须对所有训练集重复这个术语。
这就是我们之前谈到的内核技巧派上用场的地方:如果我们使用任何类型的转换来转换我们的训练实例,使它们可以分离,我们将不得不计算每个训练实例上的转换,做点积……从计算的角度来看,这将是非常昂贵的。这显示在下面的公式中。
公式 4:对我们的数据计算变换,并用它们代替内核。
如果像上面一样,我们使用一个内核,那么我们不需要实际计算变换*。酷吧?让我们看看一些最流行的内核:*
一些最流行的内核。
请注意,对于我们应用了 d 次多项式变换的两个向量的点积,理论上我们会增加数据的 n 个特征,从而增加复杂性,我们可以使用内核来避免计算该变换,只需计算 (γaTb+r)d.
这就是支持向量机的魅力所在。我们可以训练它们并做出预测,这有利于对我们的数据进行运算,而不需要实际计算这些运算。
现在让我们结束吧,看看这些预测是如何做出的。
正如我们之前看到的,为了进行预测,我们必须计算权重向量和新数据点 x(n) 的点积,并添加一个偏差项。为此,如果我们将通过求解优化问题获得的 w 的值代入公式 2 的方程,我们得到:
公式 5:用 SVM 预测
现在,还记得我们怎么说 α 对于所有不是 支持向量的数据点都是 0 吗? 这意味着,为了进行预测,我们只需计算支持向量的核和我们的新数据点,并添加偏差项。牛逼吧?
内核和支持向量机再次展示了它们的魔力。最后,这里有一些使用支持向量机的实用技巧和诀窍。
仅此而已!我们已经了解了支持向量机背后的直觉,以及它们如何工作的一些数学知识。
关于机器学习和数据科学的更多资源,请查看以下资源库: 如何学习机器学习 !有关职业资源(工作、事件、技能测试),请访问AIgents.co——一个面向数据科学家的职业社区&机器学习工程师 。
保重,享受人工智能!
感谢阅读!
原文:https://towardsdatascience.com/support-vector-machines-explained-with-python-examples-cb65e8172c85?source=collection_archive---------3-----------------------
支持向量机(SVM)是一种有监督的机器学习技术。而且,即使它主要用于分类,它也可以应用于回归问题。
支持向量机定义了一个决策边界和一个最大间隔,将几乎所有的点分成两类。同时也为错误分类留下了空间。
支持向量机是对最大间隔算法的改进。它最大的优点是可以通过使用核函数来定义线性或非线性的决策边界。这使得它更适合于现实世界的问题,在现实世界中,数据并不总是可以用一条直线完全分离的。
SVM 的主要目标是定义一个超*面,将点分成两个不同的类。超*面也称为分离超*面或决策边界。
所以让我们从超*面开始。可视化超*面最简单的方法是考虑一个二维数据集。
将点完全分成两个不同类的超*面。
将会有无限数量的超*面将点分成两类。但是,由于我们在二维空间中工作,我们定义的任何超*面将总是具有(2–1)= 1 维。所以,我们可以用一条简单的回归线来表示超*面。
定义了决策边界后,我们现在可以根据点相对于决策边界的位置对点进行分类。
基于向量相对于决策边界的位置进行分类。
如果你在处理两个以上的维度,比如,你的特征向量 X 有两个以上的特征,你在分类向量,而不是点。
因此,概括地说,所有低于决策边界的向量都属于第 1 类,如果它们高于决策边界,则属于第 1 类。
我们使用训练数据来定义决策边界。但是测试集的预测质量如何呢?
如果一个向量远离决策边界,我们可以确信它的类别,即使模型有一些误差。但是,当我们对一个向量进行分类并且它非常接*决策边界时,会发生什么呢?我们如何确定分配哪个类?
为了解决这个问题,支持向量机还在决策边界周围画了一个边界。这个余量的目标是尽可能地将向量与决策边界分开。其背后的直觉是,一个保证金给我们更多的信心,我们的预测。因为向量距离决策边界至少有边缘的长度,所以分类过程中的模糊性更小。
使用最接*决策边界的向量来定义边缘的位置。这就是为什么位于页边空白顶部的向量是支持向量。
有了边缘作为缓冲,我们可以根据它们相对于边缘的位置对向量进行分类。其中 M 是页边距的宽度。
基于向量相对于边距的位置的分类。
边缘的增加提高了测试集中预测的质量,但是它假设类是完全可分的。
但是,在大多数现实世界的问题中,数据是杂乱的,并且通常不是完全可分的。
这就是为什么 SVM 和它之前的算法——支持向量分类器——有一个重要的共同特征。它允许算法出错,并将错误的类分配给一些向量。
支持向量分类器的决策边界和余量,以及相应的支持向量。
因此,SMV 没有试图将向量完全分成两类,而是进行了权衡。它允许一些向量落在边缘之内,并落在决策边界的错误侧。
支持向量机在学习过程中允许一些错误分类。因此,它们可以更好地对测试集中的大多数向量进行分类。
除了利润,我们的模型现在还包括松弛变量,这将告诉我们两件事:
时差变量可能有三个值:
并且误分类向量的数量受参数 c 的限制
基于向量相对于边际的位置的分类,包括松弛变量。
我们可以看到这个模型捕捉到了更多的细微差别。但是它仍然建立在最大间隔分类器之上。例如,如果您将参数 C 设置为零,这意味着它允许零松弛变量,它会退回到最大间隔分类器。因此,你有一个线性的决策边界,一个尽可能大的边界,在它里面不允许有任何向量。
松弛变量的数量越多,允许的错误分类向量的数量就越多。这会影响边距的宽度,因为选择了不同的支持向量。它还控制模型的偏差-方差权衡。
松弛变量的数量如何控制偏差-方差权衡。
有一些错误分类的空间使得 SMVs 更加灵活,但是它只适用于有限的问题集。
在大多数现实世界的问题中,很难用线性决策边界将数据分成两类。即使有出错的余地。
支持向量机共享它之前的边缘分类器的特征。它们的独特之处在于它们如何定义线性和非线性决策边界。
为了支持非线性决策边界,SMV 使用函数将原始特征空间变换到新的空间,可以表示那些非线性关系。
例如,假设您用其特征的*方来增加原始特征空间。在这种情况下,您对原始要素集应用了二次函数来创建这些要素的*方。现在你有了你的原始特征和它们的二次版本,在这个扩充的空间里。因此,隐含地,有一个映射这两个特征空间的函数。
用原始特征的二次版本扩充特征空间。
如果你试图在原始特征空间中画出判定边界,它具有二次形状。但是如果你在增强的特征空间中训练你的模型,你会发现一个线性的决策边界来区分这两个类。因为它是一种变换,所以原始特征空间中的二次边界对应于扩充特征空间中的线性边界。
定义这些转换的函数被称为内核。它们作为训练集和测试集中观察值之间的相似性函数。
使用线性核(右)和多项式核(左)确定 SVM 的边界和余量,以及相应的支持向量。
只要你有一个用内积表示的模型,你就可以插入一个内核函数。例如,线性核与对特征空间应用线性变换是一样的。在这种情况下,它与支持向量分类器相同,因为决策边界是线性的。
使用多项式核,您可以将原始特征空间投影到多项式特征空间中。因此,用高阶多项式来定义分隔类别的判定边界。
核的使用是支持向量分类器区别于支持向量机的地方。它们为解决更复杂的问题提供了可能性。但是增加特征空间可能意味着额外的计算需求。因为,对于足够大的特征空间,拟合一个模型在时间和资源方面都可能是昂贵的。
尽管增加了特征空间,内核还是带来了显著的优势。支持向量机实际上并不计算每个观察值到扩充空间的变换。他们使用一个技巧,而不是在增广空间中计算观察值的内积,这在计算上要便宜得多。这就是所谓的内核把戏。
最后,支持向量机做出两个重要假设:
为了查看支持向量机的运行情况,我生成了一个随机数据集,并将其分成两个不同的类。下面是生成和绘制数据的代码片段。
在进行任何分类之前,训练集是这样的。
随机训练集。
两组数据点之间有一点空隙。但是越靠*中心,越不清楚哪个数据点属于哪个类。
二次曲线可能是分离这些类的一个很好的候选。因此,让我们用二次多项式核来拟合 SVM。
要查看拟合该模型的结果,我们可以绘制决策边界和边界以及数据集。
分类后的数据集,用圆圈标记决策边界(实线)、边界(虚线)和支持向量。
下面是绘制决策边界和边距的代码。
如果我们根据测试集计算这个模型的准确性,我们会得到一个很好的结果,假设数据集非常小并且是随机生成的。
具有二次多项式核的 SVM 模型的精度。
精确度不错,但是让我们看看更简单的方法是否能解决我们的问题。为了用线性核来拟合 SVM,我们只需要更新核参数。
用我们之前的方法画出决策边界。
分类后的数据集,用圆圈标记决策边界(实线)、边界(虚线)和支持向量。
现在看起来页边空白内的点更少了,错误分类的点也更少了。计算该模型的精度,它比多项式核模型的精度略高。
线性核 SVM 模型的精度。
因此,对于这个问题,一个更简单的模型,一个线性核的 SVM,是最好的解决方案。
希望你喜欢这些例子,并且你对支持向量机有了更好的理解,以及它们可以应用于什么样的问题。
感谢阅读!
原文:https://towardsdatascience.com/support-vector-machines-svm-c469d831a8b6?source=collection_archive---------49-----------------------
图片由 123rf 的维克多·邦达拍摄
这篇文章是关于支持向量机的介绍,理解数学直觉,正则化,在代码中实现概念,然后了解它的应用领域。好吧,那就系紧安全带,让我们进入这个美丽的概念支持向量机(SVM)的仙境。机器学习领域的先驱之一 Vladimir Vapnik 在 20 世纪 60 年代初发现了支持向量机。但他无法从计算上证明这种算法的魔力,因为他在 20 世纪 60 年代缺乏所需的资源。正是在 20 世纪 90 年代初,贝尔实验室邀请他前来美国进行相关的研究工作。早在 1993 年,在字符数字识别领域就有一项快速跟踪研究。Vapnik 打赌,他的支持向量机工作在数字识别方面可以比神经网络做得更好。因此,我的一位同事尝试应用 SVM,结果出乎意料地创造了奇迹。最后,这项在 20 世纪 60 年代发现的工作在 20 世纪 90 年代得到了认可,当时它实际上被实施以给出更好的计算结果。
支持向量机是一种用于分类和回归建模的监督机器学习算法。支持向量机的目的是识别空间中的样本,并根据类别对其进行分离。例如,如果我给你一个水果图片列表,那么算法会将输入的图片分类为苹果或草莓。记住,在上面的例子中,分类是基于类很容易分离的假设。如果图像的分布方式使得很难通过画直线来划分类别,那会怎么样呢?在我们朝这个方向分析之前,我们需要熟悉一些基础知识。
让我们进一步了解几个技术术语:
超*面:分隔在给定空间中分布的正负类的*面。
Margin: 在超*面的两边*行画出的一条分隔线,将正负类分开。
支持向量:距离位于超*面任一侧的边缘最*的正负点。
作者图片
我确信你的脑海中可能会出现一个问题,为什么我们不能在任何其他方向上找到一个分离的超*面和边缘。是的,这是可能的,但是我们必须确保我们选择超*面的方式使得超出边界的点的距离是最大的。为什么必须是最大值??只是为了避免该区域中的点的错误分类。分离边缘越宽,将获得更准确的分类。下图 1 显示了边距之间有足够的间隔,以避免新点的错误分类,并正确地将它们分配到各自的类中。图 2 示出了在这种方向上的超*面可能导致边缘之间的间隙不足,并最终导致错误分类的点。
作者图片
作者图片
作者图片
考虑一个向量 ŵ 在垂直于超*面的方向,如图所示。假设我们有一个未知点 u 位于超*面中。。由于我们有一个垂直于超*面的向量,我们可以考虑 ŵ 和 c. 任何未知点的内积,该点的存在是未知的,即,对于我们的数学假设,它是正点还是负点,我们认为它的点积至少大于常数 c.
ŵ∙u>= c
假设常数 — c = b
ŵ∙u—c>= 0
ŵ∙u+b>= 0—(1)
等式 1 是我们的决策规则,我们将在后面的阶段利用它。
假设*面右边的点是正的,表示为+1。
*面左侧的点为负,表示为-1。
因此,使用等式 1 中的判定规则,我们有以下两个等式,分别表示正负点。
ŵ∙(x+)+b>= 1—(2)
ŵ∙(x-)+b<=-1—(3)
现在为了数学上的方便,我们引入一个特征变量 y ,它满足上面的方程
ŵ∙(x+时 y = 1)+b>=+1—(4)
ŵ∙(x-时 y =-1)+b<=-1—(5)
从上面两个等式我们可以得出结论:将 Y 乘以等式(2)和(3) 任意点被正确分类的必要条件是下面给出的。
*y (ŵ∙x+b)>= 1—(6)
重新排列上面的等式,并考虑到该点仍然未知,我们可以将其等于零,得到如下
*y (ŵ∙x+b)—1 = 0—(7)
现在我们想要最大化两个边缘之间的距离,因此我们画出正点和负点边缘的正交向量 ŵ 。我们在边际上的支持向量可以认为是 X+ 和 X- 。我们的目标是计算边距上两个支持向量之间的最大距离。然而,我们绘制了一个范数为 w 的范数,这样距离( X+) — (X -)可以通过在范数 w 上描绘距离来计算。因此,将 w 的单位向量与距离相乘实际上不会改变值。
边距宽度=(x+)—(x-)=[(x+)—(😆]*(ŵ/| |ŵ| |)
作者图片
现在从方程(7)可以计算出 X+ 和 X- 的值。
通过将 X+的 Y = 1,我们得到 X+的值如下
*1 (ŵ∙(x+)+b)—1 = 0
(x+)=(1—b)/ŵ—(8)
对于 X,Y = 1,我们得到 X 的值如下
(-1)*(ŵ∙(x-)+b)—1 = 0
(x-)=(-1—b)/ŵ—(9)
将等式(8)和(9)代入页边距宽度计算:
边距宽度= (X+) — (😆
=[(x+)—(😆]*(ŵ/| |ŵ| |)
=(1-b+1+b)(1/ŵ)(ŵ/| |ŵ|)
*= 2 (1/| |ŵ|)
*我们的目标是最大化边距宽度= max(2 (1/| |ŵ|)
*以 y (ŵ∙x+b)—1 = 0 为条件
好了,我们终于得出了页边距宽度的公式。
结束了吗??不,不是真的!!!
我们在这里优化公式,使其一般化。为了优化公式,我们必须确保它达到凸性!!如果你不知道最优化的凸性,那也没关系。现在,如果没有数学上的便利,我们就无法实现最优化。
因此,我们将页边距宽度的等式重新定义为
min()*(| |ŵ| | ^2)
*以 y (ŵ∙x+b)—1 = 0 为条件
现在我们知道,当我们有一个目标函数和约束,然后我们可以利用拉格朗日乘数法,找到变量的拉格朗日依赖关系。所以利用目标函数和约束条件,我们可以构造拉格朗日函数。
l=()* | |ŵ| | 2—∑αI [易(ŵ∙x+b)—1]—--(1)
现在根据拉格朗日函数
∂L / ∂ŵ = 0
∂L / ∂b = 0
在我们的主函数(1)中应用同样的方法,我们得到
∂L / ∂ŵ = 0
ŵ — ∑ αi 易 xi = 0
ŵ = ∑ αi 易 Xi—--(2)
∂L / ∂b = 0
∑αI * yi = 0——-(3)
应用(1)中的(2)和(3)
*L = (∑αI * yi * Xi)(∑αj * yj * XJ)—(∑αI * yi * Xi)*(∑αj * yj * XJ)—b ∑αI * yi+∑αI
*L =∑αI—∑αI αj * yj * yj * Xi * XJ
所以我们最后得出结论,边距宽度的优化因子取决于任意两个样本或点 x.
回到我们的第一幅图,可以看到,通过画一条直线,积极的和消极的类别被如此干净利落地分开了。这种类型的分离被称为线性可分离变量。有没有可能一直通过画一条直线把两个类分开?如果我们在试图画一条直线时有大量错误分类的点,该怎么办?考虑下图,我们可以看到这些点是不容易分开的。在这种情况下,我们使用内核。核的作用是将任何给定维度空间中的点转换到更高维度的空间。例如,在下图中,我们有 2-D 中的点,通过应用内核,我们看到它们被转换为 3-D。令我们惊讶的是,我们看到现在通过绘制一条线,这些点可以线性分离。
图片由阿拉什·赛义德·普尔在研究之门上拍摄
想象一下这样一种情况,边距宽度变得最大,但同时出现了点的两个错误分类。在这种情况下我们会怎么做?我们会尝试重新排列超*面以避免错误分类吗?如果你仔细考虑,答案必须是否定的,因为我们在这里优化和概括的情况。虽然我们可能会错误地分类一些点,但我们不能每次都通过改变超*面来折衷边缘宽度。在这种情况下,我们将应用正则化的概念。这里,我们将在超*面的对齐和不允许错误或错误分类之间找到惊人的*衡,同时尝试最大化余量。我们包括两个变量误差, c 给我们错误分类的总点数和ɛ给我们错误分类的每个误差的值。这有助于我们实现规则化效果,即告诉 SVM 不要调整或包含异常值,也有助于我们计算 c 的值,从而在使模型免受某些错误分类的影响和同时确保边距宽度最大化之间找到一个惊人的*衡。
正则化= min()*(| |ŵ| | ^2)+∑ɛi
使用 SVM 的虹膜分类是理解 SVM 分类器概念的最好例子之一。鸢尾是一种大约有 250-300 种的花。在我们的例子中,我们有一个由花的细节组成的数据集,例如萼片宽度、萼片长度、花瓣宽度、花瓣长度。我们的目标是使用 SVM 分类器,基于数据集中可用的细节,将花分类为正确的种类。
作者图片
我们使用 sklearn 库中可用的方法将数据分成训练和测试数据。此外,我们从 sklearn 库中导入 SVC 分类器模型,并在训练数据上训练一个模型。
在集合上训练模型之后,我们然后将预测方法应用于测试数据集。使用各种准确性度量标准,我们然后使用混淆矩阵和分类报告检查并验证模型输出。
混乱矩阵作者的图片
作者图片
字符电子识别
生物信息学
图像分类
人脸检测
感谢您花时间阅读这篇文章!!
原文:https://towardsdatascience.com/support-vector-machines-svm-clearly-explained-a-python-tutorial-for-classification-problems-29c539f3ad8?source=collection_archive---------2-----------------------
手工制作草图作者。SVM 插图。
每个人都听说过著名且广泛使用的支持向量机 (SVMs)。最初的 SVM 算法是由 Vladimir N. Vapnik 和 Alexey Ya 发明的。1963 年的切尔沃嫩基斯。
支持向量机是监督的机器学习模型,通常用于分类 ( SVC —支持向量分类)或回归 ( SVR —支持向量回归)问题。根据目标变量(我们希望预测的)的特征,如果我们有一个离散目标变量(例如分类标签),我们的问题将是一个分类任务,或者如果我们有一个连续目标变量(例如房价),我们的问题将是一个回归任务。
支持向量机更常用于分类问题,因此,在本文中,我将只关注支持向量机模型。
在本文中,我不打算详细介绍算法的每一步(因为有大量的在线资源),而是解释关于支持向量机的最重要的概念和术语。
SVCs 的目标是找到最佳 超*面(也称为决策 边界)使得最佳 将(分裂)一个数据集分成两个类/组(二元分类问题)。
根据输入特征/变量的数量,决策 边界可以是一条线(如果我们只有 2 个特征)或一个超*面(如果我们的数据集中有 2 个以上的特征)。
为了获得主要思想,考虑如下:每个观察(或样本/数据点)被绘制在一个 N 维空间中,其中是我们数据集中特征/变量的数量。在那个空间中,分离 超*面的是一个 (N-1)维子空间。
超*面是 N - 维-空间的一个( N-1 )- 维-子空间。
所以,如前所述,对于一个二维空间,决策,边界将只是一条线,如下图所示。
手工制作草图由作者制作。使用只有两个特征(即 x1 和 x2)的数据集来说明 SVM 分类模型(SVC)的决策边界。决策边界是一条线。
数学上,我们可以定义决定边界为:
作者写的渲染 latex 代码。
如果你想在交互式路线图和活跃的学习社区的支持下自学数据科学,看看这个资源:https://aigents.co/learn
支持 向量就是距离分离 超*面最*的样本(数据点)。如果这些样本被移除,它们将改变分离超*面的位置。由此可见,这些就是最重要的** 最重要的 样本即定义****位置和方位的最佳** 决定 边界。****
****手工制作草图作者。在这个玩具二维 SVM 问题中,用紫色圈起来的点代表支持向量。
几条不同的线(或者一般来说,不同的决策边界)可以分隔我们的类。但是哪一个是最好的呢?
****手工制作草图由作者制作。此图显示了分隔两个类别的 3 个候选决策边界。
超*面与最*的数据点(样本)之间的距离称为余量。目标是在超*面和任何支持** 向量之间选择一个具有最大可能** 余量的超*面。** SVM 算法寻找最佳决策边界,如边际最大化。这里最好的线是黄线,如下图所示。******
****手工制作草图作者。最佳分隔线是最大化边距(绿色距离)的黄色分隔线。
在摘要中,支持向量机选择最大化到支持向量的距离的决策边界。以最大化到支持向量的距离的方式绘制决策** 边界。如果决策边界太靠*支持向量,那么它将对噪声敏感并且不能很好地概括。**
有时,我们可能想要(故意)允许一些误差(错误分类)。这就是“软** 边距”背后的主旨。软边界实现允许一些样本被错误分类或者位于决策边界的错误一侧,从而允许高度一般化的模型。**
一个软余量SVM解决了下面的优化问题:
很明显,这两个优化目标之间有一个的权衡。这种权衡由著名的 C 参数控制。简而言之,如果 C 为小,则误分类数据点的罚分为低,因此选择具有大 裕量的决策 边界,代价是更大数量的误分类。如果 C 是大, SVM 试图最小化误分类样本的数量,并导致判定** 边界具有较小 余量。******
如果我们有一个数据集是线性可分的,那么支持向量机的工作通常很容易。然而,在现实生活中,在大多数情况下,我们手头都有一个线性不可分的数据集,这正是内核技巧提供一些魔力的时候。
内核 技巧将原始数据点投影到一个更高维的空间中,以便使它们可以线性分离(在那个更高维的空间中)。
因此,通过使用核技巧,我们可以使我们的非线性可分的数据,在一个更高维的空间中线性可分。
内核技巧是基于一些内核 函数来测量样本的相似性。这个技巧实际上并没有将数据点转换到一个新的高维特征空间,显式地。核 SVM 根据高维特征空间中的相似性度量来计算决策边界,而不实际进行投影。一些著名的核函数包括线性、多项式、径向基函数(RBF)和 sigmoid 核。
****手工制作草图作者。内核技巧。在原始空间中,数据不是线性可分的,但是在投影到更高维空间后,它们是线性可分的。
提醒:虹膜数据集由 150 个花样本组成,每个样本具有 4 个特征/变量(即萼片宽度/长度和花瓣宽度/长度)。
让我们在 2D 绘制决策边界(我们将只使用数据集的 2 个特征):
以上 python 代码的输出。作者创作的赋格曲。
在虹膜数据集中,我们有 3 类花和 4 个特征。这里,我们仅使用 2 个特征(因此我们有一个 2 维特征空间)T1,并且我们绘制了线性 SVC 模型的决策边界。点的颜色对应于类别/组。
让我们在 3D 中绘制决策边界(我们将只使用数据集的 3 个特征):
以上 python 代码的输出。图由作者生成。
在虹膜数据集中,我们有 3 类花和 4 个特征。这里我们只使用了 3 个特征(所以我们有一个三维特征空间)和只有 2 个类(二进制分类问题)。然后,我们绘制了线性 SVC 模型的决策边界。点的颜色对应于 2 个类别/组。
以上 python 代码的输出。图由作者生成。
双 - 圆圈 点代表支持 向量。
** [## 时间序列预测:用脸书的先知模型预测股票价格
towardsdatascience.com](/time-series-forecasting-predicting-stock-prices-using-facebooks-prophet-model-9ee1657132b5) [## 用新冠肺炎假设的例子解释 ROC 曲线:二分类和多分类…
towardsdatascience.com](/roc-curve-explained-using-a-covid-19-hypothetical-example-binary-multi-class-classification-bab188ea869c) [## PCA 清楚地解释了——如何、何时、为什么使用它以及特性的重要性:Python 指南
towardsdatascience.com](/pca-clearly-explained-how-when-why-to-use-it-and-feature-importance-a-guide-in-python-7c274582c37e) [## 关于 Python 中的最小-最大规范化,您需要知道的一切
towardsdatascience.com](/everything-you-need-to-know-about-min-max-normalization-in-python-b79592732b79) [## Scikit-Learn 的标准定标器如何工作
towardsdatascience.com](/how-and-why-to-standardize-your-data-996926c2c832)
如果你喜欢并发现这篇文章有用,请关注我!
有问题吗?把它们作为评论贴出来,我会尽快回复。
[1]https://www.nature.com/articles/nbt1206-1565
https://en.wikipedia.org/wiki/Support_vector_machine
[2]https://sci kit-learn . org/stable/modules/generated/sk learn . SVM . SVC . html
原文:https://towardsdatascience.com/surprise-and-the-tale-of-entropy-c127da84937a?source=collection_archive---------57-----------------------
今天,我从一个有趣的问题开始我的小文章。假设有一天,外面正下着雨,你走出家门,发现你的露天庭院完全干涸了。你的第一反应会是什么?
惊喜!
为什么?
因为,当外面下雨时,你已经知道你的院子会是湿的。如果你已经看到了这一点,那么你就不会“收到”任何新的信息,因此就不会有惊讶的成分。但是既然你发现它没有湿,你就“接收”了一些信息。这让人感到意外。
现在,我们可以试着在这种情况下更正式一点。假设你已经知道庭院有 0.1%的可能是干的,0.9%的可能是湿的。(你注意到价值观的选择了吗?我选择它们的方式是,如果你把它们加起来,值就是 1.0。你能解释一下吗?)所以,在这个设置中,我们有两个变量。
现在,让我问这个问题(即使你没有完全理解它的意思,请耐心听我说)变量 X 的“熵”是什么?
在我们做数学之前,让我告诉你熵是变量不确定性的度量。越不确定,熵越高。那么基于这种直觉,你认为变量的熵会是多少?在这里停下来想一想。
好的。现在,让我们做数学。(如果对 Claude Shannon 的原论文感兴趣,可以查看一下这里我们说一个变量的总熵等于——
其中 p(x)代表事件的概率。
下面来一点 Python:)
我们知道 X 的概率是 0.1 所以,
根据同样的定律,Y 的熵是—
正如所料,X 的熵大于 Y 的熵(如果我们暂时忽略负号的话)。所以,我们可以从这个例子中看到,一个事件发生的可能性越小,这个事件的熵就越大。
如果我们愿意,我们也可以从这个角度来考虑——我们对一个事件的信息越少,也就是说,它越令人惊讶,这个事件的熵就越高。
现在,我们要问另一个问题。系统的总熵是多少?其实很简单。我们是这样衡量的—
系统的总熵
所以,基本上我们要把 X 和 Y 的值加起来,然后取反。
我们用称为“比特”的单位来表示这个量。所以我们可以说这个系统有 0.467 比特的熵。因此,你可以从这个系统接收那么多的信息。
为了完成这篇文章,我们要测量一次公*抛硬币的熵。它有多少比特的熵?
在公*抛硬币的情况下,我们可以像下面这样列出正面和反面的概率
所以,应用上面的方法,我们可以计算熵。它将是 1 比特。
这并不奇怪!
希望你喜欢这个关于熵和信息论的小介绍。这个小等式支撑着我们现在的整个通信系统。有个想法是好事。
如果你喜欢,请按拍手图标多次。这会鼓励我写更多。此外,你可以在这里关注我的未来文章,撰写关于信息论、复杂性理论、机器学习、算法、离散数学等方面的文章。
有关更多信息(!)和进一步的阅读—
原文:https://towardsdatascience.com/surprising-cost-based-route-optimization-results-513438fbeda7?source=collection_archive---------44-----------------------
基于真实世界成本的路线优化。图片由 Free-Photos 发自 Pixabay 。
基于成本的路线优化不同于仅考虑距离或时间的路线优化。
基于成本的路线优化在现实世界中很有用,因为它符合任何试图降低成本和提高效率的公司的业务目标。
相比之下,仅考虑距离的路线优化提供了一个有吸引力的假设结果-地图上看起来不错的路线。但仅此而已。
这很容易用几个例子来演示。
考虑以下 3 辆车和 50 个地点的交付时间表,该时间表需要针对伦敦周边的当天交付进行优化。
3 辆车,50 站距离成本仅路线优化由 Optergon 提供
车辆成本用 F/D/T ( 固定,距离&时间)表示。每辆车的基于时间的成本被设置为 0,这意味着时间不会影响系统的总成本(这显然不适用于现实世界中的送货公司)。距离成本为 1 美元/公里。
优化该交货计划(可能包括任何类型的交货和提货)会产生以下结果。
3 辆车,50 站距离成本唯一路线优化解决方案由 Optergon 提供
这看起来是一个相当不错的结果。的确如此。因为它只有基于距离的成本数据可以处理。
基于仅距离路线优化来优化其车队和交付时间表的公司永远不会怀疑他们没有利用最有效的路线优化解决方案。
从本质上说,他们把钱留在桌子上而不知道,因为没有办法通过简单地看结果来判断是否有更低成本的解决方案。
让我们稍微改变一下场景,为每辆车在路上花费的时间赋值。毕竟,司机的工资是按小时支付的,在运输、物流和配送公司的总成本中占很大一部分。
3 辆车,50 站距离和时间成本路线优化由 Optergon 提供
每辆车都有相同的基于时间的成本,每小时 10 美元。在优化该时间表之后(除了基于时间的成本的变化之外是相同的),我们获得了以下结果。
由 Optergon 提供的 3 辆车、50 站距离和时间成本路线优化解决方案
长得很像。事实上,鉴于每辆车基于时间的成本是相同的,这正是我们所期望的,对吗?毕竟,如果每辆车的成本完全相同,就不应该有变化。
除了,这里有一个微妙的区别。
返回到仅距离基于成本的路线优化解决方案,并查看总时间(显示在地图上方的)。现在将它与基于距离和时间的优化解决方案的总时间进行比较。
花的时间更少。大约少了 4 分钟。
最优路线被稍微改动了一下,以减少总的时间为代价,以少量的距离为代价,使优化的总成本最小化。
这里或那里的几分钟可能看起来不多,但这是一个非常小的优化,只有微小的差异。即使是现在,随着时间的推移,成本的降低也会累积起来,从而带来显著的节约。
如果我们远离这个简单的例子,即我们小型车队中的所有车辆都产生相同的成本,那么考虑基于时间和距离的成本的重要性就变得更加明显。
让我们假设我们的一辆车需要一名司机和一名合作伙伴来完成一些交付——基本上是那辆车基于时间的成本的两倍。
由 Optergon 提供的 3 辆车、50 个停车距离和可变时间成本路线优化
蓝色皮卡 III 现在的时间成本是每小时 20 美元,是其他两辆车的两倍。在此交货计划的所有其他方面保持不变的情况下,这是优化的结果。
由 Optergon 提供的 3 辆车、50 站距离和可变时间成本路线优化解决方案
同样,这看起来是合理的。仔细观察,您会注意到蓝色皮卡 III ,这款基于时间的运营成本翻了一番的车辆最终只使用了很短的时间。
这听起来可能很合理,因为我们凭直觉理解业务目标是降低车队的总体成本。
对于任何只考虑基于距离的成本的系统来说,这种类型的解决方案是完全不可能的。只有距离成本的系统仍然会返回类似于我们的初始路径优化解决方案的东西,该解决方案是时间成本不可知的。
现代公司运营着拥有许多不同车辆类型的多样化车队。这些不仅有不同的运载能力,他们也有不同的相关成本每距离。
让我们假设蓝色皮卡 I 是一辆稍微旧一点的车,不太省油。
3 辆车,50 站真实世界成本路线优化由 Optergon 提供
蓝色皮卡 I 的行驶距离成本为 1.20 美元——相比之下,两款较新的车型每公里成本仅为 1 美元。
结果非常有趣,可能不是你第一眼看到的那样。
3 辆车,50 站现实世界成本路线优化解决方案由 Optergon 提供
蓝色皮卡 I 实际上花了很长的时间送货。事实上,只比日程限制规定的 8 小时少了 10 分钟——几乎与最便宜的汽车蓝色皮卡 II 花费的时间相同。
然而,他们的优化路线有很大的不同。
仔细观察每个人走过的距离。蓝色皮卡 I 行驶了 68 公里多一点,而蓝色皮卡 II 行驶了两倍多,才刚刚超过 162 公里。
仅使用时间(或仅使用距离)进行交付规划的路线优化没有必要的数据来确保每辆车的行为方式降低车队的总体成本。
在这种情况下,前两辆皮卡不得不花很长时间停车,以防止昂贵的时基车(蓝色皮卡 III )抬高成本。
与此同时,第一辆皮卡需要尽可能少地行驶,以防止其膨胀的距离成本推高车队的整体成本。
这突出了不考虑基于时间和距离的成本之间复杂相互作用的路线优化的假设交付计划与降低现实世界中发生的总成本的优化解决方案之间的差异。
你可以在 Optergon 使用一个月的免费路线优化来尝试为自己的车队制定基于成本的交付计划。
最初发表于https://optergon.com。
原文:https://towardsdatascience.com/surprisingly-effective-way-to-name-matching-in-python-1a67328e670e?source=collection_archive---------1-----------------------
姓名匹配问题先睹为快,图片作者。
R 最*我偶然发现了这个数据集,在这里我需要分析数码产品的销售记录。我得到的数据集差不多有 572000 行和 12 列。我非常兴奋能够处理如此大的数据。我兴致勃勃地快速查看数据,发现同一个名字重复走不同的行。(啊!数据清理时间太长了!).
在一些产品栏上,它包含 iphone,而在另一个栏上,它写着 Iphone,或 iphone 7 +和 iphone 7 Plus,对于一些常规客户列表,有些有 Pushpa Yadav,而在其他 Pushpa Yadav(名称是伪的)。
先睹为快的问题视图(不是来自原始数据集),作者的图片。
这些是相同的产品名称和客户名称,但采取了不同的形式,即处理相同名称的不同版本。这类问题是数据科学家在数据分析过程中要处理的常见场景。这个场景有一个名字叫做数据匹配或模糊匹配(概率数据匹配)或简称为重复数据删除或字符串/名称匹配。
常见的原因可能是:
无论如何,作为数据科学家或分析师,我们有责任匹配这些数据,以创建主记录供进一步分析。
所以,我草草记下了解决问题的行动:
1.手动检查并解决。
2.寻找有用的库/资源,这些库/资源是由社区的精英们分享的。
对于这样一个扩展的数据集(572000* 12)来说,第一个选择确实很麻烦,所以我开始查看不同的库,并用模糊匹配器(conda 现在没有)尝试了这些方法,fuzzywuzzy 在核心上使用了 Levenshtein distance 和 difflib 。
然而,在使用它们的过程中,我发现对于这样的大数据,这是非常耗时的。因此,我需要寻找一种更快更有效的方法。
经历了许多天的挫折后,我终于知道了克里斯·范登贝格分享的解决方案。
因为我们的目标不仅仅是匹配字符串,而且是以更快的方式匹配。因此,ngram 的概念,具有余弦相似性的 TF-IDF 开始发挥作用。
在进入工作演示(代码工作)之前,让我们了解一下基础知识。
n 元语法广泛用于文本挖掘和自然语言处理,它是给定句子或(单词文件)中一组共现的单词。为了找到 n-gram,我们向前移动一个单词(可以根据需要移动任何一步)。
例如,对于房型“标准房海景威基基塔”
如果 N=3(称为三元组),那么 N 元组(三元组)将是:
公式为 Ngrams,图片作者。
从研究论文中探索更多关于 ngrams 的信息
为什么 n=3?
可能会产生一个问题,为什么 n = 3 可以被看作 n= 1(一元)或 n=2(二元)。
这里的直觉是,与单个词相比,双词和三词可以捕捉上下文信息。例如,当独立观察时,“房间海景”比仅仅“房间”、“海洋”和“景色”有更多的含义。
TF-IDF 代表术语频率-逆文档频率,而 TF-IDF 权重是信息检索和文本挖掘中经常使用的两个主要关注的权重。
1.用于评估一个单词对集合中的文档有多重要
2.重要性随着单词出现的次数成比例增加
TF-IDF 背后的两个想法
词频(TF),又名。一个单词在文档中出现的次数除以该文档中的总单词数,即它衡量一个术语在文档中出现的频率。
逆文档频率(IDF),计算为语料库中文档数量的对数除以特定术语出现的文档数量,即,它衡量术语的重要性。
TF-IDF 的公式。
在计算 TF 时,所有项都被认为是同等重要的。然而,众所周知,特定的词,如“是”、“的”和“那个”,可能会出现很多次,但没有什么重要性。
将每个单词拆分后,需要将这些单词(词条)转换为 SciKit 学习算法模型可以使用的向量,因为这些算法只理解数字特征的概念,而不考虑其底层类型(文本、图像和数字等)。)允许我们对不同类型的数据执行复杂的机器学习任务。
Scikit-learn 的 tfidf 矢量器旨在将一组原始文档转换为 TF-IDF 特征矩阵,它可以一次性计算字数、IDF 和 TF-IDF 值。
图片作者。
这样,我们就生成了 tf_idf_matrix,这是一个稀疏矩阵。与 Tfidfvectorizer 一样,我们将原始文本转换为单词和 n 元语法的数字向量表示。正如已经说过的,这使得直接使用变得容易;算法只理解数字特征的概念,而不管其基本类型(文本、图像、数字等)。).
两个文本文档在它们的上下文(表面接*度)和意义(即,词汇相似度和语义相似度)方面如何彼此接*被称为文本相似度,并且有各种方法来计算文本相似度,例如余弦相似度、欧几里德距离、雅克卡系数和骰子。
余弦相似性度量两个文档之间的文本相似性,而不考虑它们的大小。数学上,余弦相似性度量测量在多维空间中投影的两个 n 维向量之间的角度的余弦,并且取值范围从 0 到 1,
在哪里,
数学上:
余弦相似性公式。
然而, ING 批发银行高级分析团队的数据科学家发现余弦相似度有一些缺点:
因此两者都会导致使用更多的内存消耗和时间。
为了优化这些缺点,他们创建了他们的库,该库仅存储每行中前 N 个最高匹配,并且仅存储阈值以上的相似性。
获取更多关于库:sparse _ dot _ topn
他们自豪地声称,这种方法提高了大约 40%的速度,并减少了内存消耗。
有了这些基本的基础知识,我们开始我们的代码工作。
我假设你熟悉 Jupyter 笔记本和下载库。如果没有,请查看我之前的帖子,在那里我已经分享了探索性数据分析的初学者指南。
工作环境: 来自 Anaconda 的 Jupyter 笔记本
数据集: 房间类型
数据集快照
数据集的快照。
现在让我们导入所需的库/方法,读取我们的数据集并将其保存到“df”中,只要快速查看数据集,就可以将“df”命名为任何名称。
快速查看 5 行数据集。
这里,我们取 n = 3,因此 3-gram 或三元组,因为大多数房间类型包含两个或三个单词,并且我们将句子分成标记,去除所有特殊字符、标点符号和单个字符(,-。/).收集那 3 克。
为了验证,我们测试了“Deluxroom”的 3-gram 结果,输出如下:
“豪华客房”的 3 克结果。
看起来不错!
现在,在拆分每个单词(标记或词条(n-gram 生成的项目) )之后,我们需要对使用 Scikit-Learn 库提供的 Tfidfvectorizer 的每个文档中出现的单词进行计数,并将一组原始材料转换为 TF-IDF 特征矩阵。
让我们查看生成的稀疏 CSR 矩阵。
稀疏 CSR 矩阵。
看起来不错!
我们正在用sparse _ dot _ topn库处理一个 CSR 矩阵。****
我们存储前 10 个最相似的项目,并且只存储相似度高于 0.8 的项目,并显示模型所用的时间。
Selftime 0.0019,快!
然后,我们解包得到的稀疏矩阵;
我们观看比赛。
火柴看起来相当令人满意!
套房、 1 居室和豪华套房,1 居室很可能不是同一个房型,我们得到的相似度为 0.81。看起来不错!****
按照排序的顺序,我们查看我们的匹配。
排序匹配。
比赛看起来相当令人满意!余弦相似性给出了两种房间类型之间相似性的良好指示。大转角大床房 1 特大床和大转角大床房大概是同一个房型,我们得到的相似度为 0.93。
因此,正确的视觉评估和用这种策略进行的匹配是非常令人满意的。
因此,通过使用 ngram 进行标记化,使用 TF-IDF 进行向量矩阵,使用 TfidfVectorizer 对每个文档中出现的单词进行计数,并使用与 sparse_dot_topn 的余弦相似性,我们甚至可以最快地匹配大型数据集的字符串(使用 57200012 获得了良好的结果)。*
在我的 GitHub 中获取整个工作 Jupyter 笔记本。
喜欢这篇文章吗?成为一个中等会员继续学习,没有限制。如果您使用 以下链接 ,我将收取您一部分会员费,无需您支付额外费用。
如果你对这篇文章有任何疑问,或者想在你的下一个数据科学项目中合作,请在 LinkedIn 上 ping 我。
敬请关注下一篇与数据科学相关的帖子。
原文:https://towardsdatascience.com/surveying-corporate-americas-debt-d5dea58450f3?source=collection_archive---------69-----------------------
费利克斯·米特迈尔在 Unsplash 上的照片
(如果你想用我的代码, 你可以在我的 GitHub 这里找到。抱歉,还没清理/评论。此外,你需要订阅 Sharadar 美国基础和一个 Quandl API 密钥来运行它)
典型的美国公司有多健康?这是一个非常相关的问题。虽然有理由对新冠肺炎局势的改善保持谨慎乐观,但这只是第一步。接下来的事情(重新开放和恢复经济)将会同样困难或者更加困难。
当我们最终走出这条经济隧道的另一边时,许多大大小小的企业都将不复存在。今天,我们将研究潜在的财务数据,以了解美国企业的债务状况,以及是否存在任何明显的问题点。
公司破产最常见的原因是高昂的固定成本——换句话说,当收入骤降时,无法降低成本。公司有固定成本有多种原因:
今天,我们将重点探讨等式中的债务部分,因为巨额债务通常也是高运营杠杆的标志(除非一家公司像苹果一样拥有大量现金流,否则它通常需要借款才能支付前期基础设施投资)。
我们先来看看哪些行业负债最多。竞争动态(利润率、基础设施需求等。)不同行业的公司差异很大,因此我们应该预计债务的用途也会有所不同。我在下面按部门绘制了总资产负债表债务(包括长期和短期)。一些观察结果:
截至 2019 年底的行业负债情况(来源:Sharadar 美国基本面)
总债务水*很有趣,但更重要的是看相对于收入的债务水*,这是公司偿债能力的一个因素。我们可以通过将债务除以 EBITDA 并按行业绘制*均债务/EBITDA(如下)来实现。EBITDA 代表未计利息、税项、折旧和摊销前的收益。EBITDA 是一家公司手头用于偿债的现金流的合理指标。
2019 年底按行业划分的债务/EBITDA(来源:Sharadar 美国基本面)
让我们稍微集中一下我们的镜头,把市值也包括在我们的分析中。我们可以使用热图来直观显示按行业和市值划分的*均债务/EBITDA 水*(市值是公司规模的一个不错的代表)。
按行业和市值划分的债务/EBITDA(来源:Sharadar 美国基本面)
在我们深入研究这些数字之前,请注意,对于一家公司的债务/EBITDA 比率应该是多少,并没有正确的答案。这取决于管理层管理流动性的能力、债务的利率、现金流的周期性(如果你的公司在衰退中现金流骤降,那么它应该注意它借了多少钱),以及用这些债务融资的项目的回报。显然,这些变量因公司而异。它们还会根据经济状况或特定行业状况而变化——你可以打赌,如果衰退加深,EBITDA 将严重下降,以前看起来可控的债务将成为巨大的负担。
认识到债务不一定是坏事是很重要的。如果一家公司有大量且稳定的现金流,能够以低利率获得债务(由于今天的超低利率环境),并能够从债务中获得超过所支付利息的回报,那么它至少应该借一点点。只要管理层不高估现金流的规模和稳定性,像谷歌、苹果和伯克希尔哈撒韦这样的公司的超低利率债务几乎等同于免费资金。
好,回到我们的热图。总的来说,我注意到以下几点:
我注意到的另一件事是,除了工业类股,大型公司的*均负债水*高于同行业的大型公司(见下图)。我猜想,这是因为大型公司主导着各自的行业,享有规模竞争优势,因此利润率更高。因此,尽管以绝对美元为基础,相对于收入,他们可能会借更多的钱(由于他们更高的盈利能力),但大型公司实际上看起来负债更少。不过,我很惊讶地看到,在基础材料等大宗商品领域,债务存在如此明显的差异。
大盘股比超级大盘股负债更多(来源:Sharadar 美国基本面)
下面是能源、房地产和工业部门负债最多的 30 家公司的图表 (我只包括负债至少 50 亿美元的公司,因为我想把重点放在鲸鱼上) 。
看看前几名,他们主要是抵押贷款房地产投资信托基金(如卡普斯泰德和 AGNC)。与银行类似,这些公司借款是为了投资抵押债券组合(因此债务或多或少是他们业务的基本投入)。因此,高水*的债务是可以预期的,并不一定是一件坏事——只要抵押贷款房地产投资信托基金敏锐地管理其投资组合中的违约风险(在整个商业周期内),并恰当地匹配其资产和负债的期限(又称债务)。因此,我们应该越过房地产公司,专注于能源和工业(Brookfield Property Partners 是一个例外,它管理着办公楼、酒店、购物中心等。并可能在未来几个月陷入困境)。
抵押贷款房地产投资信托基金之后,你会看到财务管理不善的公司,如波音(太多的股票回购)和通用电气,以及能源公司,如越洋公司和阿帕奇公司。越洋公司是一个有趣的公司。2014 年前,当油价仍徘徊在 100 美元左右时,Transocean 的海上钻井船和钻机船队需求巨大。每艘船(或钻机)成本很高,但赚得更多——所以只要油价居高不下,借钱投资更大的船队是明智的。显然,随着石油价格跌至 20 年来的最低点,以及陆上页岩油产量的激增,Transocean 公司昂贵的船队在过去 5 年里已经成为一个巨大的财务拖累。
30 家负债最多的能源、房地产和工业公司
以下是除金融服务和房地产 (仅指负债至少 50 亿美元的公司) 之外的所有行业。这不是一个漂亮的列表。下面的大多数公司都受到了疫情的严重影响,即使经济重新开始,他们也会继续感受到痛苦:
请记住,企业业绩往往并不等同于股票表现,尤其是在短期内。股票表现完全取决于实际发生的情况和预期发生的情况。正如即使是伟大公司的股票也会在市场低迷时大幅抛售一样,管理不善和缺乏竞争力的公司的股票也能在牛市中表现出色,因为牛市中充满了动物精神。
30 负债最多的行业,除了金融服务和房地产(来源:Sharadar 美国基本面)
这只是洋葱的第一层。我计划在不久的将来深入研究债务结构、商业模式以及公司财务报表的其他领域。
最后,在我们开始之前,让我们检查一下总体债务水*在过去 5 年中是否增加了。他们有!除了基本材料,其他所有行业的债务都有所增加。当然,这是长期经济繁荣(刚刚结束)的副产品——随着公司的销售、利润和资产增长,他们能够借更多的钱,也确实借了。但这种行为也增加了经济低迷时期的违约风险——债务水*创下历史新高,而经济状况的恶化降低了利润和支付能力。
过去 5 年,几乎所有行业的债务水*都有所上升(来源:Sharadar 美国基本面)
希望这是有见地的。当我开始分析这些数据时,我脑子里并没有一个故事,只是想看看我能找到什么。我仍在分析,所以会有更多的来。干杯,保持安全,投资愉快!
原文:https://towardsdatascience.com/survival-analysis-for-predictive-maintenance-of-turbofan-engines-7e2e9b82dc0e?source=collection_archive---------6-----------------------
弗拉季斯拉夫·切尔卡先科在 Unsplash 上的照片
<免责声明:我的目的是展示模型开发过程中不同方法和选择的效果。这些影响经常使用测试集来显示,这被认为是(非常)不好的做法,但有助于教育目的。>
欢迎来到“探索 NASA 的涡轮风扇数据集”系列的另一部分。这将是对第一个数据集(FD001)的第四次也是最后一次分析,其中所有发动机在相同的操作条件下运行,并产生相同的故障。
在我的上一篇文章中,我们深入研究了时间序列分析,并探索了用于预测性维护的分布式滞后模型。最终模型表现相当好,RMSE 为 20.85。今天我们将探讨生存分析。这是一种我渴望尝试的技术,因为我已经多次听说和阅读过这种技术,它可能是一种适用于预测性维护的方法。然而,我从未遇到过满足我好奇心的示例实现。首先,生存分析到底是什么?
生存分析起源于医学领域,用来回答关于特定人群寿命的问题。如果你知道某人的年龄,可以预测某人的一生,你也可以估计那个人还能活多少时间。例如,这种技术应用于流行病学或疾病治疗研究。然而,它也可以应用于数据由持续时间和基于时间的事件组成的许多其他情况,例如流失预测和预测性维护。下面我快速总结了生存分析中使用的几个关键概念[1,2]:
事件:一个有趣现象的发生,在我们的例子中是发动机故障。
持续时间:持续时间是指开始观察到事件发生的时间或者观察停止的时间
删截:删截发生在观察已经停止但感兴趣的对象还没有他们的‘事件’的时候。
生存函数:生存函数返回在/过去时间 t 的生存概率
危险函数:危险函数返回事件在时间 t 发生的概率,假设事件直到时间 t 还没有发生
对我来说,生存分析的一个吸引人的方面是在还没有事件的模型中包括主体(或者在我们的例子中是机器)的可能性。在更传统的机器学习中,你会从数据集中丢弃“不完整的”或经过审查的主题,这可能会使结果有偏差[3]。解释了一些基础知识后,是时候开始了!
我们将读取数据并计算剩余使用寿命(RUL ),就像我们现在习惯的那样。
train.head()的结果
正如在以前的帖子中所讨论的,我们将剪裁任何高于 125 的 RUL 值,因为这将极大地提高模型性能。此外,从先前的探索性数据分析中得出的非信息特征被丢弃。
我们稍后将使用的模型需要一个事件列。因此,让我们添加一个细分列,指示引擎是发生故障(1)还是仍在运行(0)。
接下来,我们需要指出每个观察的开始和停止时间。由于数据集在多个时间周期内具有连续的测量值,因此每个观测值只是一个周期。我们可以使用 time_cycles 列来指示观察的结束,我们将添加一个等于的 start 列来指示观察的开始。
train.tail()的结果
注意时间周期、RUL、分解和开始列值,以检查我们所做的数据准备是否符合我们的预期,看起来不错!
在列车组中,每台发动机都出现故障,因此没有任何经过审查的观察结果。我们将通过忽略 200 个时间周期后的任何记录,人为地对我们的数据集进行右审查。这使得我们可以在一个更真实的环境中处理数据,混合使用已经发生和还没有发生故障的引擎。
所有的数据准备工作都完成了,是时候深入了解引擎的生存时间和概率了。我们可以使用卡普兰迈耶曲线来实现这一点,它所需要的是表明持续时间(时间周期)和事件(故障或功能)的最后一次观察
卡普兰迈耶曲线
这种方法已经为我们提供了一种粗略的工具,来估计来自相同群体的发动机在过去的时间 t 内存活的概率。例如,发动机有 100%的概率在第一个 128 个时间周期中存活。在这之后,第一个发动机开始出现故障,但是仍然有 46%的可能性发动机能够存活超过 200 个时间周期。请注意,这种方法仅表示超过某一点后的生存概率,但不能超出给定的数据进行推断。
提供更多信息的常见模型是 Cox 比例风险模型。它计算危险比率,例如指示故障风险,例如在特定设置下运行的发动机发生故障的可能性是在不同设置下运行的发动机的 1.85 倍。
python lifelines 包的 CoxPH 实现还附带了漂亮的“predict_expectation”方法,为您提供了一种估计事件发生时间的直接方法。由于这种 predict_expectation 方法,我尽了最大努力将 CoxPH 模型应用于我们的数据集。为了利用发动机随时间的退化,我使用“cluster_col”来表示发动机的 unit_nr,试图让模型考虑每个发动机的多个观察值。不幸的是,结果相当糟糕。下定决心要成功,我联系了《生命线》的作者卡梅伦·戴维森-皮隆。在这里,我了解到“cluster_col”并不是指与时间相关的样本,而是指具有与时间无关的观察值的组。例如,指示不同的处理组,或在不同操作设置下运行的发动机组。
为了利用数据集的时间序列特性,您必须使用时变模型。然而,这个模型的缺点是它没有一个方法来估计事件发生的时间。它预测了部分危险,解释起来不太直观,你会在下面看到。
训练模型非常简单,您实例化模型并调用 fit 方法,传递数据集、id_col 以指示唯一的引擎、event_col 以指示是否发生故障以及 start 和 stop 列,以便模型可以解释观察的持续时间。
接下来,我们将检查模型。
CoxTimeVaryingFitter 摘要
CoxTimeVaryingFitter 系数图
查看模型摘要,我们对对数似然、p 值和指数(coef)感兴趣。对数似然给出了拟合优度的指示,但仅在与包含较少特征的其他类似模型相比较时。更接* 0 的对数似然性被认为是更好的(不要与对数似然比相混淆!).当查看 p 值时,传感器 9 和 15 的值相当大,p > 0.50。然而,移除传感器 9 和 15 得到的对数似然值为-64.20,因此没有提高拟合优度[4,5]。
exp(coef)显示了结垢危害风险。例如,传感器 11 的传感器值增加 1 个单位,击穿的风险增加 167.43 倍[6]。该图本质上显示了特征的系数和置信区间。
训练好模型后,就该开始评估了。故障(或危险)的风险取决于基线危险和部分危险(见下面的公式)。
来源:生命线时变生存回归[7]
因为我们的发动机来自统一的群体(例如,所有发动机都在相同的运行条件下运行),所以它们的基准危害是相同的。因此,我们只需检查部分或对数部分危险,就可以得到故障风险的指示。部分危险只有在与同一人群的其他部分危险相关时才有意义。部分危险为 2e⁶的发动机发生故障的可能性是部分危险为 1e⁶.的发动机的两倍因为部分危险值相当大,所以显示部分危险的日志更容易。然而,测井局部风险降低了可解释性。一台发动机相对于另一台发动机的对数局部危险每增加 1 个单位,故障概率就增加 2.718(或 e )倍。
为了开始我们的评估,我们只需要还没有坏的引擎,它们的 log_partial_hazard 和计算的 RUL。
预测结果. head(10)
当将 log_partial_hazard 与计算的 RUL 进行比较时,您可以看到它通常很好地告知了即将发生的故障(此处显示了前 10 个)。对于更有故障风险的发动机,返回更高的 log_partial_hazards。然而,它并不总是准确的,例如,发动机 16 的危险比发动机 15 的危险高得多,尽管发动机 15 会更快损坏。
将所有 log_partial_hazards 与计算出的 RUL 相对照,会生成下图,其中有清晰可见的趋势。
log_partial_hazard 与 RUL 的关系图
由于我们处理的是时间序列数据,我们还可以预测 log_partial_hazard 随时间的变化,并观察它的表现。
一段时间内 log_partial_hazard 的图表
注意:这里要做的实际事情是为 log_partial_hazard 设置一个阈值,在此阈值之后应该执行维护。然而,如前所述,这并不能真正让你了解 RUL。您可以开发一个时间序列模型来预测何时达到该阈值,以获得更多的“事件发生时间”预测。
在现实环境中,我建议使用上面建议的两个选项中的一个。然而,由于之前的模型都预测了 RUL,我将尝试将对数部分风险值与计算出的 RUL 关联起来进行比较。
首先,我们将预测截尾训练集中每个观察值的 log_partial_hazard,并检查它的散点图
RUL 与对数部分风险的散点图
你可以清楚地看到我们的 RUL 削波器在图表顶部附*的影响,但是如果没有削波,扩散会更大。散点图中的关系是非线性的,可能是指数关系。有相当多的传播,使得很难根据 log_partial_hazard 精确定位 RUL,但让我们看看我们会如何进展。
我们将使用 scipy 的曲线拟合[8]拟合一个指数模型来从 log_partial_hazard 推断 RUL。推断出 RUL 后,我们将针对训练集和测试集的计算 RUL 对其进行评估,以了解其准确性。
拟合的思路:对数部分风险的指数模型对单位 nr 1 的 RUL。
首先,我们定义评估函数。
接下来,使用 scipy 的曲线拟合来定义和拟合指数模型。
z 是数据,a 和 b 是模型系数。
最后,准备测试集,并评估训练和测试预测。
27.13 的 RMSE 已经比我们的基准模型提高了 15%,基准模型的 RMSE 为 31.95。现在,让我们在完整的数据集上进行训练,看看模型的表现如何。
最终的 RMSE 是 26.58,比我们的基线提高了 16.8%,但还没有接*支持向量回归(RMSE = 20.54)或时间序列分析(RMSE = 20.85)的解决方案。部分不准确性可以通过在预测的 log_partial_hazard 上拟合另一个模型来解释,这导致错误上的错误(因为没有模型是完美的)。
我坚信,当你放弃我们一直使用的 RUL 范式,为 log_partial_hazard 设置一个阈值时,这种方法将非常适合于定义何时需要维护。
此外,您不会经常遇到在数据集中有这么多故障示例的真实用例。更少的故障使得准确预测 RUL 变得更加困难。在这种情况下,预测崩溃的可能性并让企业决定什么样的崩溃风险是可接受的,可能会产生更好的结果。
总而言之,我认为这项技术非常有趣,多学一点也无妨!
我要特别感谢 lifelines 的作者 Cameron Davidson-Pilon,他花时间为我提供了一些关于如何最好地利用 lifelines 包来处理手头数据集的指导。此外,我要感谢 Wisse Smit 和 Maikel Grobbe 为我的文章提供的意见和评论。你可以在我的 github 页面这里找到完整的笔记本。
我们对 FD001 的分析到此结束。下一次我们将深入研究的第三个数据集(没错,阅读文章找出原因),其中发动机出现了两个故障中的一个。一如既往,请在下面的评论中留下你的问题和评论。
参考资料:
【1】https://life lines . readthedocs . io/en/latest/Survival % 20 analysis % 20 intro . html
【2】https://en.wikipedia.org/wiki/Survival_analysis
【3】https://life lines . readthedocs . io/en/latest/Survival % 20 analysis % 20 intro . html #审查
【4】https://stats . idre . UCLA
原文:https://towardsdatascience.com/survival-analysis-with-deep-learning-in-keras-443875c486f2?source=collection_archive---------19-----------------------
叶夫根尼·切尔卡斯基在 Unsplash 上拍摄的照片
生存分析是统计学的一个特殊分支,用于分析一个或多个事件发生前的预期持续时间。它也被称为‘事件时间’分析,因为目标是估计一些感兴趣的事件发生的时间。它在机器学习中的应用没有限制:在寿命预期、客户保持、预测性维护等问题中应用这些技术是很常见的。
乍一看,生存函数估计似乎是一项艰苦的工作,但经过一些经验和基本的数学概念,它不是那么令人望而却步!最好的起点是头脑中有清晰的想法,我们需要知道什么是我们的时间和事件。只有这样,我们才能继续开发一个模型,为感兴趣的实体提供可靠的生存函数预测。通过一些技巧,我们可以利用生存函数的映射属性,并利用它的其他形式的派生(如危险函数)。
我已经在之前的文章中澄清了这些直觉,在那里我也使用梯度推进方法(比如 LGBM)来估计一个不常见场景中的生存函数。在这篇文章中,我试图遵循同样的目标:估计密度函数,但采用神经网络。
我们使用的数据集包含华盛顿特区首都自行车共享系统从 2011 年到 2012 年的两年历史数据,以每日和每小时的格式提供。提供了各种预测因子来生成预报,如时间或天气回归因子。现在我们考虑小时格式,因为我们需要大量数据来拟合我们的神经网络模型。
我们的范围是预测临时用户在某种时间和天气条件下注册了多少辆每小时的自行车租赁。
乍一看,这个任务可以像简单的回归问题一样轻松地执行。我们试图让事情变得更辣,采取一种生存的方法。我们必须估计每小时临时用户数量的累积密度函数(CDF)。在这个场景中,我们的时间变量由到目前为止注册的临时用户的数量表示,而事件日期被定义为小时结束时的用户总数。我们的模型将学习注册少于一定数量的用户的概率。
累积分布函数
为了处理这个问题,维持生存方法、线性或增强方法(如前后中所做的)需要尊重一些基本假设,以便提供生存函数的正确估计。这也包括,例如,对数据进行一点处理,或者对我们的目标应用一个简单的映射。对于神经网络,我们不关心这个,我们只需要选择正确的结构,并给它提供大量的数据。
一般来说,我们在构建自己的生存深度学习模型时,可以做出两种不同的选择:用回归或者分类来处理问题。这些方法能够估计我们期望的生存函数,提供不同的损失最小化过程,包括以两种不同的形式处理我们的目标。
与同一样本相关的目标示例,用于回归和分类
用神经网络和回归估计生存函数意味着直接估计每小时的 CDF。当临时用户的数量小于真实计数时,CDF 为 0,而在该值之后为 1。为了使我们的目标密度函数具有相同的长度,我们将可达用户的最大数量固定为 400。在我们使用的网络结构之下。它将我们的外部预测值(天气和时间特征)作为输入,试图复制我们的密度函数作为输出。最后一层中的 sigmoid 激活有助于将最终值限制在 0 和 1 之间。计算训练以最小化均方误差损失。
我们直接根据我们的模型估计的整个概率函数来计算我们的模型的优良性。为此,我们使用连续排名概率得分(CRPS)作为性能指标。
CRPS 对我们任务的提法
我们预测每个小时样本的完整生存曲线,最终,我们在我们的测试数据上达到 0.074 CRPS,这优于基于测试生存函数的虚拟估计的简单模型,其中 CDF 来自于训练(0.121 CRPS)。
使用回归进行每小时生存函数预测的示例
使用分类方法,我们将目标作为一次性实例来处理。我们的目标,长度等于可达用户的最大数量,对应于注册的精确计数等于 1,否则等于 0。我们的模型经过训练,可以预测到目前为止临时用户的准确数量。为此,我们的神经网络试图最小化分类交叉熵,并具有最终的 softmax 激活函数。
在预测期间,为了获得我们想要的生存函数,我们必须简单地对输出进行后处理,对每个预测应用累积和变换。利用我们估计的生存函数,我们可以像以前一样计算我们在测试集上的性能。利用分类方法,我们达到 0.091 CRPS,这比基于测试生存函数的虚拟估计的简单模型更好,其中 CDF 来自训练(0.121 CRPS)。
分类的每小时生存函数预测示例
在这篇文章中,我们开发了生存神经网络结构,它能够在给定一些外部预测的情况下估计生存函数。我们工作的特殊性包括在处理标准回归问题时改变观点。我们解决了这个问题,提供了对问题的生存解释,并展示了使我们能够通过深度学习来估计生存密度函数的策略。
查看我的 GITHUB 回购
保持联系: Linkedin
原文:https://towardsdatascience.com/survival-analysis-with-lightgbm-plus-poisson-regression-6b3cc897af82?source=collection_archive---------22-----------------------
在 Unsplash 上由 Philippe D. 拍摄的照片
生存分析经常被用来解决诸如“T4”这样的问题,一个特定的事件还要多久才会发生?’。事件和时间是这种方法的关键变量。这些事件被认为是每时每刻都可能发生的极端情况:典型的例子是搅动、死亡、故障等等。时间的定义很简单,但是有点抽象。我们认为时间是持续时间;从这个意义上说,很明显,并非所有的“极端事件”都已经发生。由于一些外部环境,我们无法查看所有的生命历史,这意味着将持续时间视为相对的,即开始可能发生在不同的时间。
传统上,生存分析被用来衡量个体的寿命。该分析不仅可以进一步应用于传统的出生和死亡,还可以应用于任何持续时间等……我们如何通过生存建模来处理分类/回归问题令人惊讶。我们需要定义的只是事件和时间。
在这篇文章中,我们开发了一个解决方案来预测在某种时间和天气条件下每天有多少自行车租赁被注册。任务是回归问题的形式,我们必须预测计数,这也可以提醒我们泊松回归问题,我们必须模拟离散变量。考虑到时间是逐渐“到达目前为止”的租赁次数,而事件是一天结束时记录的最终计数,我们的附加价值是将观点转换为生存方法。为了模拟这种现象,我们将使用一个经过调整的 LightGBM 估计器。
当时间和事件被定义时(即,我们分别有观察和目标),我们必须思考如何才能达到我们的最终范围:估计一个生存函数。
所有战略量化时间;它是一个非负的连续随机变量,其分布由概率密度函数 (PDF) 或累积分布函数 (CDF) 表征。
生存函数是时间的函数,它定义了死亡事件在时间 t 尚未发生的概率,或者等价地,给出了事件发生时间值大于 t 的人口比例。数学上,它是 1-CDF。危险函数 (H) 是事件发生的速率。给定一个固定的时间间隔,这是一个风险度量:危险越大,失败的风险越大。数学上,它是-log(S)。
生存函数估计中涉及的所有元素的直观映射。来源:生命线
有各种方法来拟合生存模型。具体来说,我们对所谓的半参数方法感兴趣,在该方法中,我们试图用一种非常优雅和简单的技巧来学习风险函数:我们假设可以将时间细分为合理的小区间,即我们在每个区间中考虑我们的基线风险常数。在这种格式中,分段比例风险模型相当于某个泊松回归模型。生存函数可以从风险函数中导出,反之亦然,这一事实特别有用,因为它允许我们根据自己的兴趣轻松切换目标。
我们使用的数据集与华盛顿特区首都自行车共享系统 2011 年和 2012 年的两年历史数据相关,这些数据以每日和每小时的格式在此公开提供。目前,我们认为每日数据将我们的注意力集中在预测一天结束时临时用户的数量上。各种预测器可用于生成预报,如时间或天气回归。
请记住,我们将时间变量定义为“到达目前为止”的租金,将事件定义为登记的最终计数,因此一个好的起点是绘制时间的 CDF。
在固定的最大可达数量(4000)下,很明显我们的 train-test 分区的 CDF 非常不同。
利用 LGBM 回归器,应用半参数指数法学习风险函数相当容易。这是可能的(如上所述),因为生存问题的负对数似然性与泊松回归的负对数似然性是一对一映射的,这在 LGBM 库中是默认初始化的。
我们需要做的就是为此目的整理我们的数据。特别地,数据集必须首先被扩展:每一行被复制成多行,从 0 到偶然计数登记,这是我们的死亡事件。然后生成两个新列:
生成的新变量示例
有了扩展的数据集,我们就可以开始训练了。拟合的计算一如既往:我们的目标由分数(一个 0-1 变量)表示,我们的回归变量是所有可用的外部变量加上迄今为止的计数,之前由我们自己生成。所有的魔法都是由我们的假设和泊松损失造成的。在预测阶段,我们必须像以前一样操作我们的测试数据,通过创建迄今为止的计数变量来扩展输入数据(得分未知)。为了使我们的生存函数有一个统一的形状并便于分数评估,一个好的做法是将目前为止的计数与其他预测因子一起扩展到一个预先设定的极限,对我们来说是 4000。还记得 LGBM 预测风险函数,为了获得相应的生存函数,我们必须操作这个简单的后处理转换:1-exp(cumsum(H))。
让我们用图表来检查一些预测:
如您所见,从风险函数中导出的预测生存函数试图复制从一天结束时临时用户的总数中构建的真实 CDF。我们预测总用户数的累积概率分布。换句话说,我们预测的每个值都表明了一天结束时最终计数小于或等于该数字的概率。
对我们结果的评估是根据这类任务的标准分数进行的。连续排序概率得分(CRPS)将 MAE 推广到概率预测的情况。
CRPS 对我们任务的提法
CPRS 是概率预测中使用最广泛的精确度指标之一。它需要评估所涉及的整个概率函数,因此需要估计每个每日样本的整个生存曲线。最后,我们可以在测试上达到 0.283 CRPS,这比基于测试生存函数的哑估计的简单模型更好,其中 CDF 来自于训练(0.291 CRPS)。
在这篇文章中,我们开发了一个生存 LGBM,它能够在给定一些外部预测和一些简单假设的情况下估计生存函数。我们解决了一个非经典的生存问题,在这个问题中,我们不需要估计在过去的时间中幸存的概率,但是我们估计了在一天结束时特定事件发生的概率。这是一个简单的例子,但它显示了如何应用生存建模技术,在一个不常见的场景中,我们的职责是估计概率密度函数。
查看我的 GITHUB 回购
保持联系: Linkedin
参考文献
Kaggle: NFL 大数据碗
生命线:生存分析介绍
普林斯顿大学:广义线性模型,第七章,生存模型
原文:https://towardsdatascience.com/survival-functions-101-bd57fb8be888?source=collection_archive---------31-----------------------
斯蒂芬·道森在 Unsplash 上拍摄的照片
在继续写这篇文章之前,我强烈建议你了解生存分析,因为这篇文章的主要焦点是生存函数,尽管已经提供了生存分析的简要介绍。
生存分析是一种建模技术,用于模拟事件发生的时间。它用于了解一个事件发生需要多长时间。这些事件可能是心脏病发作后的死亡时间、毕业后找工作的时间、一对夫妇保持婚姻的时间或机器正常工作的时间等。
生存分析包括三个部分:
这个函数可以帮助我们知道,一个感兴趣的物体,是否会在特定的时间后继续存在。这个感兴趣的对象可以是病人、机器或任何其他东西。
从数学上讲,生存函数用 S 表示,它显然是时间的函数。生存函数也可以解释为某个感兴趣的对象在超过某个时间 t 后生存的概率。
所以可以表示为:
s(T)=P(TT)
这里 T 是随机寿命,取自必须进行生存分析的群体,因此它不为零
该函数的值介于 0 和 1 之间(包括 0 和 1 ),并且是一个非递增函数。
存活函数有时也被称为存活函数或可靠性函数。
生存函数 S(t)也可以通过以下方式与累积分布函数 F(t)相关联:
S(t) = 1 - F(t)
因此它也被称为互补累积分布函数。
让我们看一个任意的例子,看看我们如何解释一个给定的生存函数。
任意生存函数
在观察了上面的生存函数之后,我们可以说,被观察的总人口中只有 25%存活超过 4 个月。
我们可以做出更多的预测,比如有百分之多少的人能活过 6 个月,大约是 17%,等等。
注意:这不是解释生存函数的唯一方式,根据分析师的需要,还可以进行其他解释,如中位生存。
生存函数主要分为两类:参数生存函数和非参数生存函数。这种区分基于可以是*均值、标准偏差、中间值等的参数。
让我们来看看一些参数生存函数:
在这种函数中,无论感兴趣对象的年龄是多少,失败的概率在每个时间区间都是相同的,所以对象的年龄不影响概率。
指数生存函数
该函数实际上扩展了指数生存函数,以允许恒定的、递增的或递减的危险率,其中危险率是对物品失效或死亡倾向的度量,取决于其达到的年龄。
威布尔生存函数
我们可以选择其他生存函数,如正态、对数正态、对数逻辑和伽玛,这取决于数据集的分布情况。对数逻辑生存函数如下所示:
对数逻辑生存函数
注:第二类生存函数是非参数生存函数,这里没有讨论,它通常使用著名的 Kaplan-Meier 估计量建模,这本身就是一个广泛的话题。要了解卡普兰-迈耶估计量,请访问 Pratik Kumar 的 了解卡普兰-迈耶估计量 。
存活函数构成了存活分析的主要部分,并帮助分析者获得与直到时间事件相关的有价值的知识。如果生存函数得到明智的解释,许多重要的问题都可以得到解答。
这篇文章是作为学生守则的一部分写的——在 2020 年。
学生代码是一个全球性项目,旨在向大学/大学预科学生介绍开源软件开发。
原文:https://towardsdatascience.com/survival-guide-implementing-big-data-analytics-e3870fd2684c?source=collection_archive---------79-----------------------
unsplash.com
在您的组织中实施大数据分析时,您是否感到有些迷茫?
你并不孤单。
把这看作是你创造分析文化的生存指南——包括通往成功的路线图,指引你正确方向的指南针,点燃你激情的火花。
实施大数据分析的 8 大挑战(以及如何应对挑战)
1。没有定义或传达的成功基准
没有可衡量的成功定义的分析计划比那些记录了 KPI 的计划更容易失败。但是比没有对你的成功进行基准测试更糟糕的是没有将它们传达给组织。
任何旨在改变现状的改变,都会有反对者和怀疑者。那些感觉受到威胁的人会质疑该计划的价值,并试图给它泼冷水,但当你大喊用屋顶上的数据推动商业决策的指数收益时,这很难做到。
成功是否包括使用新的流程来访问以前锁定的数据?如何让更多的终端用户获得数据控制面板?用预测分析影响关键业务目标怎么样?
为了帮助取得成功,在口袋中部署分析计划。
在各种业务单位中进行有管理的推广。让最终用户立即接触到新的解决方案,或者在新的流程在企业推出之前让几个部门参与其中。越多有经验的用户能够帮助新用户,你就能为你的团队和 IT 卸下越多的负担。
2。良好的输入不是主要关注点
虽然业务用户需求应该始终推动您的分析计划,但请注意不要忽略这些需求的潜在需求。业务用户最终关心的是分析的输出,因此很容易过分强调数据的可视化而忽略输入。
构建仪表板对于向业务领导者和利益相关者传达见解至关重要,但它是分析周期的最后一层。
仪表板是分析周期的最后一层。在数据可视化之前,必须对其进行查找、验证、准备、调查和建模。
作为一名变革者,你需要向利益相关者强调好的、干净的数据和合理的分析的重要性。对最终结果有狭隘的看法,而不事先关注和支持每一步,只会助长混乱。
有效的分析解决方案允许用户在分析生命周期的每一点了解他们的数据,而不仅仅是在结束时。
3。直到最后一分钟才被循环
由于利益相关者越来越大的压力和迫在眉睫的最后期限,让看门人不参加项目会议并希望他们会签字同意是很诱人的,甚至是很方便的。但是,如果您的业务和 IT 团队之间没有强大的协作,您如此努力点燃的运动将会在着火之前熄灭。
IT 在企业级解决方案、部署和数据治理方面拥有丰富的经验和良好的记录,知道如何实施分析计划。尽早寻求他们的建议,看着他们成为你最大的盟友。
不要忘记,目标是企业的分析能力。因此,您需要推动满足 IT 和最终用户需求的计划和软件部署。这个过程的标志应该是业务和 IT 协同工作,在美妙的、篝火般的和谐中。
4。数据访问的大门紧闭
为了传播企业分析能力,你必须致力于打开数据仓库。如果您的计划有任何回报,最终用户需要访问数据。拥有数据的终端用户越多,就意味着赢得的机会越多。请记住,这并不意味着缺乏数据治理。
结合现代技术的深思熟虑的流程将使您能够将数据保存在受控的环境中,同时仍然为用户提供他们需要的访问权限。
说你信任你的终端用户并向他们提供数据很容易,但这就是问题所在。准备好相信您的最终用户知道如何处理这些数据。他们可能会犯错误,但使用过时的流程和解决方案(如电子表格)会导致更多的错误(事实上,一项研究显示 88%的电子表格包含错误)。
将您的数据民主化并让好奇的人得到它,只会产生大量有益于业务的问答问题。
5。业务与 IT 权力之争仍在继续
根据内部历史和文化,准备调解业务用户和 IT 之间的权力斗争——他们可能会很快变得激烈。当用户自助服务时,他们通常认为没有必要,但事实上,情况恰恰相反。
对于自助服务分析这样的解决方案,一个普遍的误解是不需要它。其实完全相反。IT 的一个主要作用是为业务提供信息。
有了企业分析文化,支持变得更加重要。即使企业继续“拥有”数据,IT 部门也将负责存放和交付数据。
他们与业务用户合作,以确保他们拥有支持自己所需的资源。企业分析能力需要这种强大的业务和 IT 协作才能蓬勃发展。
6。不安全导致数据混乱
有效的分析文化将为企业带来许多新的见解。找到关于如何在几乎任何领域提高绩效的可操作信息对企业来说都是一个极好的好处,但增加透明度对一些人来说可能意味着痛苦的调整。
不习惯数据驱动文化的同事可能会对项目绩效受到关注感到不舒服。
如果一个企业没有在第一时间发现改进的机会,它就无法改善结果。
将分析和任何相关计划定位为公司的积极发展非常重要。拥抱和庆祝改进的发现,而不是拖着过去的错误。持续改进是关键词。
7。头衔和传统经验优先于数据
民主化数据和分析的承诺可能会威胁到那些拥有旧的做事方式所需的技能和培训的人。这是公司需要接受的严峻现实。
目前标准普尔 500 指数中大约有一半的公司将在 10 年后不复存在,这种趋势在全世界都存在。随着在创新竞赛中保持领先的压力越来越大,很明显,接受数字化转型和数据驱动文化的公司将在生存和发展的竞赛中胜出。
8。复杂的解决方案在实现其优势之前很久就过时了
当您的组织开发新的分析流程和软件时,很容易陷入过去的模式。大数据计划曾经庞大而昂贵。公司花费了数百万在复杂的、完全治理的解决方案上,这些解决方案需要两年时间来实施。
您的分析计划有如此多的活动部分,以至于最终看起来与 2005 年的商业智能(BI)实施惊人地相似,该实施未能获得用户采用,并且在痛苦的两年后未能获得投资回报。
在实施结束时,您的公司陷入了无法扩展、缺乏通用性且无法支持业务真正需要的广泛使用的分析解决方案或流程。
因此,当你在推动新的流程或分析软件时,选择那些有常识支持的、每个人都容易使用的、实际上让你的生活更轻松的软件。
成为数据驱动型意味着知情,而不是让事情变得过于复杂。
带路
你的 CEO 从来不会问:“你写了多少行 SQL 代码?”他们不在乎。相反,高管们会就你的分析和你的建议提出问题。
组织文化的改变需要整个组织的适应,那些接受这种改变的人将会明白,虽然方法可能会改变,但重点是不变的:从数据中寻找答案。更深刻的见解将成为点燃您的分析文化的火花。
分析实施过程中要避免的 8 种危险
1.没有确定的成功基准
2.好的输入不是主要的焦点
3.直到最后一分钟它才被循环
4.数据访问的大门紧闭
5.业务与 IT 权力之争仍在继续
6.不安全助长了数据混淆
7.头衔和传统经验优先于数据
8.复杂的解决方案在实现其优势之前很久就过时了
原文发布于此:https://www . alter yx . com/input/survival-guide-implementing-big-data-analytics
原文:https://towardsdatascience.com/surviving-a-coding-bootcamp-2963915e2285?source=collection_archive---------46-----------------------
照片由海斯特·拉斯在 Unsplash 拍摄
首先,简单介绍一下我。
我目前正在进行熨斗学校沉浸式数据科学项目的最后一周,最后一步是一个全包的顶点项目。
整个课程非常广泛,试图将两年的研究生课程压缩到仅仅五个月的强化课程中。
顶石是为了展示我新获得的数据科学家工具包而设计的,必须从头开始创建。不允许来自 Kaggle 的预制数据集。
在做最后一个项目的时候,我得到了一份全职的工作,网页开发员和数据科学家,这是我从一开始就梦想的工作。
从我最后的角度来看,整个经历在我脑海中相对清晰,我认为这将是一个与他人分享我的经历的好时机。
我将分享我在这段时间里使用的一些概念,这些概念帮助我保持领先,并在课程结束前两周获得了一份工作。
照片由蒂姆·马歇尔在 Unsplash 拍摄
数据科学训练营,或任何训练营,或实际生活中最重要的方面是社区。
成为拥有相似目标和兴趣的社区的一员是无价的。
有一句谚语说,“不要独自编码”,这乍一看似乎微不足道,但实际上是你学习编程时可以遵循的最佳建议。
在进入熨斗学校之前,我尝试过自己的编程教育。我使用了 FreeCodeCamp.org 大学的免费课程,顺便说一句,我强烈推荐这个课程。
我在一年半的时间里完成了那个项目的大部分工作,独自完成了数千小时的全栈 web 开发材料。
如果我当时知道我现在所知道的,团队合作比单干要好得多,我会立即开始在论坛上搜索一群人一起工作。
我在熨斗中学到的第一件事是,成为一个由志同道合的人组成的强大而专注的社区的一部分是多么有价值。
我们经常一起工作,互相分享我们的想法和支持,一起努力实现同一个最终目标。
我们成立了在线学习小组,持续了一天的大部分时间,轮流教对方我们刚刚学到的东西。
我是最强的程序员,所以我会教授与编程相关的话题。诸如网页抓取、http 请求和响应、面向对象编程等主题。
我们有一个在大学教数学的人,他教我们梯度下降背后的微积分和所有不同类型的数据。
每个人都有自己的位置,成为团队的一员感觉很棒。与单独工作相比,这种激励是无法相比的。
在这样一个艰难的过程中,拥有积极的支持是无价的,即使你觉得你可以自己处理一切,我保证你会通过拥有一个团队来激发你的想法,从而获得无价的知识和洞察力。
克里斯蒂安·威迪格在 Unsplash 上拍摄的照片
帮助我成功的第二个想法来自我不久前读到的一篇关于杰夫·贝索斯和他雇佣的第一批软件工程师的文章。
当他创办亚马逊时,他发布广告寻找有才华的开发者。
他不希望任何开发人员,但他希望最好的,他可以找到。
因此,他的广告声称他正在寻找极具天赋和动力的开发人员,但更具体地说,他正在寻找能够以三倍于其他开发人员的速度交付产品的开发人员。
当我第一次读到这本书时,我被深深地打动了。
首先,我印象深刻,因为贝佐斯要求潜在员工做到最好,而且他不怕把标准设得极高。
我们大多数人会寻找比其他开发者“更好”的开发者。
事实上,贝佐斯想要的不仅仅是更好,而是三倍好的开发人员,这改变了我制定目标和期望的方式。
其次,我被激励是因为这是一个软件开发人员可以量化的标准。
我想澄清的是,我确实理解一个糟糕的开发人员可以很快推出一个糟糕的产品,但这不是贝佐斯所说的。
相反,他期望他雇佣的开发人员能够创造出最高质量的产品,此外,他还期望他们能够在三分之一的时间内完成。
自从我读到这篇文章,我就被激励成为最优秀的开发人员之一,能够申请那份工作,并且知道我在行业的顶端。
训练营是实践这一信念的绝佳机会,也是见证它在行动中的有效性的绝佳机会。
如果一个模块预计在一周内完成,项目在下一周结束时到期,我会把在两三天内完成这个模块作为我的目标。
然后,我会用第一周的另一半时间做模块的最终项目的第一次尝试,到下周末,我将完成三个独立的项目。
这意味着当其他人第一次开始做他们的项目时,我已经完成了一次,第二次也快完成了。
我知道你在想什么。质量和数量呢?
我发现在一个项目中,每一次成功的尝试都会成倍地提高质量。不仅如此,花费的时间也减少了。
我在网上看到无数的帖子证实了我的观察,当你学习的时候,数量比质量更重要。
学习 web 开发的一般建议是创建尽可能多的应用程序,因为每一个连续的应用程序都是一个学习的机会,也是一个更熟悉你将使用的流程、库和工具的机会。
这就是我如何能够展示 Flatiron 迄今为止制作的一些最好的学生项目,以及我现在如何拥有比我的同龄人中任何其他训练营毕业生多三倍的经验。
TK Hammonds 在 Unsplash 上拍摄的照片
最后一条类似于贝佐斯规则,这是软件开发界的一个常见神话。
与其说它是一个具体的标签,不如说它是一个想法,如果不从字面上理解,如果你努力做到最好,它可以成为一个很好的目标。
这个想法是,有开发者会用 1/10 的时间,用 1/10 的代码行数,解决你的问题。
就像我说的,把编写代码的速度和效率提高 10 倍作为目标很可能会导致失望,然而,把开发人员始终致力于在最少的时间内交付最高质量的产品作为目标会更加现实,并且会产生一个了不起的开发人员。
围绕这个想法有无数的争论,其中大多数人都照字面理解这个定义,就像我警告过不要这么做一样。
相反,我把它作为一种激励工具,作为一种在我可以轻松休假让其他开发人员“赶上”的时候继续工作的方式。
我看到很多开发人员做这种“赶进度”的事情,他们在几个小时内完成一天的工作,然后决定休息一天。
有了这个 10 倍的目标,我就能在其他人完成后继续发展。
我提醒自己,我不是想成为一名普通的开发人员,而是想成为一名 10 倍的开发人员,10 倍的开发人员不会因为完成了当天的任务就扔掉他们的笔记本电脑,而不是自我意识或来自同行的压力。
我知道这种想法并不适合每个人,如果它适合每个人,那么它将成为标准,然后我将不得不以成为 100 倍开发者为目标,所以在某种程度上,我可以感谢不是每个人都有这么高的目标。
彼得罗·兰帕索在 Unsplash 上的照片
通过编码训练营绝对不容易。我注意到有几个人落在后面,退出了我的队伍。他们中的一些人放弃了,重新开始学习,一些人完全退出了,选择了另一个领域。
对我来说,我从来没有想过这些,因为这些目标和想法远远超出了最低限度,甚至失败都不是画面的一部分。
我承认,曾经有一段时间,我在个人目标上失败了。
我没有在一个模块结束时完成项目三次,而是只完成了两次。
把标准定得和我一样高,失败只意味着一种失望感,那就是我没能更快地掌握概念,尽管在课程中从来没有落后的危险。
我没有用三倍的经验构建一个项目,而是用两次重复构建一个项目。
这很令人失望,但我仍然有一个比团队中其他人完成的还要完美两倍的最终项目。
编写 bootcamp 需要大量的动力、时间、金钱,最重要的是对成功的渴望,就像许多其他事情一样,无论你付出多少努力,你都会从中获得回报。
对我来说,这是一次将我从自学成才的开发人员提升到专业人员的经历,我想向自己和他人证明,我可以在这方面做得很好。
最后,我很感激有机会参加熨斗学校,整个过程是我有过的最好的经历之一。
在项目结束前两周,我被录用了,现在我可以非常高兴地说,我是一名专业的软件开发人员。
感谢阅读。我希望有人发现这个信息鼓舞人心,并能够使用这里的想法,成为最好的开发人员。
请随时给我留下任何评论、问题或反馈,我真的很感谢有机会谈论我热衷的东西。
原文:https://towardsdatascience.com/surviving-zombie-apocalypse-with-random-search-algorithm-b50c584e8066?source=collection_archive---------40-----------------------
2019 年波兰北部的日落。私图。
想象一个典型的好莱坞僵尸启示录场景…
一群绝望的人,在一个魅力四射的英雄的带领下,在某个建筑里设置路障,试图坚持到电影结束。大量的嗜血生物敲着每一扇门和每一扇窗户想要进去。人们试图用他们能使用的任何东西来击退他们,但是由于他们的弹药越来越少,英雄需要派人去取更多的炮弹。
必须做出决定——权衡失去一名队员的风险和弹药耗尽的风险。听起来不像是一个优化问题吗?
虽然它肯定可以用这种方式来表达,但我们会看到,并不总是可以应用标准梯度下降算法 (SGD)。相反,我们将使用一种简单的替代方法,称为随机搜索。为了说明它的简单性,我们将用纯 python 实现它(参见:代码)。
为了便于讨论,让我们假设我们的魅力英雄有一台装有文本编辑器(例如 vim,如果他是一个真正的英雄)和 python3 的笔记本电脑——足以快速运行模拟并找出该做什么。
情况呈现如下:
情况看起来相当复杂,所以我们的第一步是建立一个模型。我们将使用它来模拟不同的场景,这将有助于我们找到答案。这一步在某种程度上相当于 SGD 中的正向传递。
我们知道系统完全是用 N,E,X 和成对的 (d_k,p_k) 来描述的。因此,将我们的模型实现为一个类并公开方法来执行我们的正向传递是很方便的。
让我们从构造函数开始。
是一个元组列表,代表具有相关回收风险的输入弹药舱(例如)。由于供应品耗尽,我们将其表示为“剩余天数”列表。一旦列表变空——就完了!
接下来,考虑到供应减少,我们定义以下受保护的方法:
每天消耗一箱弹药(第 3 行),然后所有的补给离到期日又*了一天(第 4 行),最后,过期的从列表中移除(第 5 行)。
另一件事发生在新的补给被收回的时候。
在每一种情况下,当我们产生更多的弹药,我们也增加了分数风险,这与我们选择从吊舱中取回多少箱子成正比。(如果成本> 1,我们可以将 is 视为损失一个以上人员的概率)。
为了便于向前传递,让我们再定义一个函数:
该函数只是选择与为给定日期安排的 pod 相关联的风险(如果已安排)。
最后,向前传球的本质:
该过程从一些(稍后将详细介绍)开始,总风险为零。然后,随着我们一天一天的移动,将会有“机会”获得弹药。如果在某一天有这样的机会,我们会根据回收计划尝试回收一定数量的弹药。每当涉及到风险点时,我们都会将它们添加到总体风险计数中。
然后,不管我们是否有更多的弹药,我们检查我们的供应状况。如果我们到达终点,今晚将是这个团队的最后一晚。该函数返回 0 弹药剩余,总牺牲和纪念日。如果没有,这个团队会在英勇保卫他们的要塞时消耗弹药,这个函数会返回相应的值。
这就是我们向前传球所需要的。现在,让我们看看优化。
图一。两个 pod 的成本函数与参数空间(z)的关系示例。较低楼层区域与违反约束相关联。
在涉及标准梯度下降的典型情况下,我们现在将设计反向传播通道,并讨论如何正确实施梯度。然而,这里没有梯度!描述风险累积的函数更像是一个过程。它是不可微的。(也没有僵尸参与……)
正因为如此,也因为我们之前提到的诸多限制,我们需要想出另一种方法来降低风险。这就是随机搜索算法的由来。
基本原则如下:
我们重复 3 遍。第四。只要需要改进,我们就可以应用硬停,例如,如果成本不再下降,时间用完,等等。
当然,这种方法并不能保证我们找到最好的解决方案,但是 SGD 也不能做到这一点。然而,凭直觉,我们可以认为,如果我们继续质疑“现状”并做出小的改进,我们应该会找到一个可能更好的解决方案。
我们来看一下实现。首先,初始化:
该函数接受 pod 的时间表(列表【d _ k,p_k} )和生存天数,并返回一个可能的计划,该计划描述了团队在每个机会可以取回多少弹药——这是一个整数列表。
也许你已经注意到这里没有涉及到随机数。没错,我们不会随机初始化它。在没有从哪里开始的偏好的情况下,随机初始化工作得很好。由于我们的僵尸危机充满了约束,我们可以从至少一个约束可以很容易满足的位置开始。因此,我们从一个保证生存的计划开始,给人们足够的子弹来完成它。
从此,我们可以优化。
函数是反向传播步骤的替代方法。我们可以将、和视为超参数,其中是搜索步骤的数量,是我们在每个步骤下采样的点的数量,表示( z )的邻域的“伸展”。
因为理论上计算需要一些时间,我们要做的第一件事是检查条件是否不合适,或者计划是否不会让他们死。例如,如果第一个豆荚的日期是在团队耗尽补给之后,就没有机会再补给,死亡是不可避免的。在这种情况下,我们可以停止计算,开始祈祷。
函数是一个简单的检查,如果计划中没有元素是负的()。
检查了可行性之后,我们终于可以开始为最小风险进行优化了。我们的参数空间的维数等于吊舱的数量(等于的长度)。该空间的采样意味着随机选取的一个元素,看看如果我们从 pod 中移除一些箱子会发生什么。然而,为了防止违反团队不得耗尽弹药的条件,我们也选择了的另一个元素来给这个数量。这创建了一个新的计划,我们使用验证该计划以获得新的结果。
然后一系列的语句检查剩余的约束,但是如果新的计划是可行的,我们将它添加到中,该计划包含具有相关成本函数的步骤的所有备选计划。然后,如果存在成本函数更低的替代方案,我们选择该方案用于下一次迭代(z’->z)。
在某一点上,对某一步骤将没有进一步的计划。当这种情况发生时,我们依靠最后一个可行的计划作为解决方案。
功能是我们定制的版本:
潜在的问题和替代方案就是这样!例如,跑步:
我们可以看到在寻找更好的计划和成本价值下降的进展。
图二。N = 100 和 10 个 pod 的随机搜索算法的最小成本(左)和最小时间(右),对“尝试”和“半径”的每个组合检查 10 次。获得了成本函数与回收箱子数量的线性相关性的结果。
不幸的是,如果我们多次执行这种优化,我们将很快发现最“最优”的计划会发生变化,并且成本值有时会高于其他计划。这是因为我们的算法是“盲的”。如果没有梯度,我们在每次迭代中只给它几次机会()来寻找更好的计划,而且我们是随机进行的。因此,算法到达一个地方 (z`) 就有一个很大的威胁,它不能再前进了——类似于局部最小值。
为了克服这个问题,我们可以自然地增加的数量以给它更多的机会,或者增加以允许更多的选择来找到更好的。
在极端情况下,我们可以选择循环遍历距离为的所有 (z,z’)对。这种方法相当于强制梯度,大大增加了我们达到全局最小值的机会。另一方面,这是要付出代价的。仅用,组合数 (z,z’)与成正比,其中。计算可能需要更长时间。
防御不死族的囤积的确是一个巨大的挑战。除了僵尸之外,在本文中,我们给出了一个简单的随机搜索算法的裸 python 实现。每当我们可以定义一个代价函数,但是我们不能保证它的可微性时,这个算法可以是 SGD 的一个可行的替代方案。此外,如果问题充满了约束,像这样,这里提出的方法可以应用。最后,我们还讨论了算法本身的计算复杂性,如果确实存在重大僵尸危机,这可能会影响下一个英雄的决策。
我计划把文章带到下一个层次,并提供简短的视频教程。
如果您想了解关于视频和未来文章的更新,请订阅我的 简讯 。你也可以通过填写表格让我知道你的期望。回头见!
原文:https://towardsdatascience.com/sustainable-privacy-compliance-requires-disciplined-data-management-24ae12056bb9?source=collection_archive---------63-----------------------
照片由 xdfolio 通过 pixabay (CC0)拍摄
自从 20 世纪 80 年代数据仓库时代开始以来,数据管理,包括元数据管理、数据治理、主数据管理,一直被提倡。然而,它很难实施或执行。没有它,企业仍然可以通过他们的数据仓库项目生存。然而,项目和组织的筒仓会引入数据重复、效率低下和没有明显的事实来源,这一直是许多组织头疼的问题,尤其是那些拥有多个系统的大量数据的组织。
随着最*数据隐私问题的增加以及几项法规的出台,这给每个组织敲响了警钟,要求他们优先实施严格的数据管理。它不仅适用于现有数据资产,还能确保在获取、收集、处理、使用和存储新数据时的法规遵从性。
两个先锋隐私法规是欧盟的 GDPR ( 通用数据保护法规,于 2018 年 5 月 25 日生效)和 CCPA ( 加州消费者隐私法案,于 2020 年 1 月 1 日生效)。这两项法规都旨在增强消费者的隐私权,以保护企业收集、使用或出售的个人信息。尽管受监管公司的规模、罚款金额以及消费者行使权利的方式有所不同,但这两项法规都规定了消费者的以下权利:
CCPA 将个人信息定义为“识别、涉及、描述、能够与特定消费者或家庭直接或间接相关联或可以合理链接的信息”GDPR 将个人数据定义为“与已识别或可识别的自然人(数据主体)直接或间接相关的任何信息,特别是通过提及标识符。”因此,CCPA 和 GDPR 之间的一个显著区别是,CCPA 的个人信息包括家庭,而 GDPR 的个人信息只包括个人。
对于一家公司来说,确保遵守一项法规已经是一项挑战,更不用说遵守两项或更多法规了。隐私法规将直接影响企业的大规模数据收集、使用和存储。对于没有工具和治理流程来精确定位包含个人信息的数据所在的位置、谁可以访问这些数据以及这些数据是如何被使用的组织来说,这可能是非常耗费资源和时间的。另一方面,如果一家公司在以下领域实施了有效的数据管理,实现法规遵从性应该是简单的。
设计良好的数据架构是成功数据管理的重要促成因素。数据架构和数据管理是不可分的。好的数据架构有清晰的文档,从业务需求、业务到数据的映射、业务术语表、命名约定和标准开始。它还应该在设计中考虑数据隐私和安全性。数据架构给出了每个数据对象到数据元素级别的清晰度、透明度和标准,包括收集、使用和存储个人信息的位置。这将带来清晰的设计、高效的实施和最佳的结果,因为 CCPA 和 GDPR 要求消费者遵守访问、遗忘和不出售其个人信息的权利。
2。元数据管理和数据治理
首先,用准确的分类和数据谱系对所有数据对象和数据元素进行编目将是实现隐私遵从性的一个极好的能力。一个很好的类比是图书目录。对于一个图书馆或多个图书馆中的大量书籍,图书馆目录在过去几十年中已经得到发展,以系统地跟踪书名、作者、位置、流派、出版日期等。不管一个图书馆有多少本书,目录允许用户搜索任何书,而不需要实际阅读它们。随着后来的数字技术的发展,用户也可以先阅读几页样本,然后再决定是借阅还是购买这本书。公司数据资产的数据目录应以同样的方式建立,以便快速搜索可以找出哪些系统中的哪些数据资产包含个人信息,它们是何时创建的,以及它们是如何使用的。
因为公司中的任何职能或部门都可以拥有数据,所以通常需要一个由这些部门的数据管理员参与的数据治理计划,以确保数据目录拥有正确和完整的信息。数据治理也是一个在整个企业中实施标准和策略的*台,以维持组织的法规遵从性。
3。清除数据保留策略
明确的数据保留政策对于公司的隐私合规性也至关重要。如果数据不再对组织有用,或者数据已经按照 GDPR 或 CCPA 等法规的要求保留了一段时间,则应将其删除。例如,GDPR 要求个人资料的保存时间必须"不超过处理个人资料的目的所必需的时间"(第 5(1)条)。随着当今数据科学和分析的快速发展,以多种方式利用数据,使用数据的用户可能会在不经意间创建许多包含敏感信息的数据对象。保留这些数据的时间超过法律要求或使用所需的时间可能会产生各种后果,例如增加数据泄露的风险以及违反与数据访问和数据隐私相关的合规性流程的风险。
4。具有安全性的集中客户信息
出于安全和隐私信息的考虑,公司的客户信息应该存储在尽可能少的地方。应该使用最佳的安全和隐私措施对其进行仔细管理。主数据管理最初旨在提供一个具有有保证的数据质量的真实来源。同时,它还实现了隐私合规性的最佳设计。有了集中的主数据即服务,组织中就不应该有其他地方来永久存储个人信息。对于主数据系统之外的任何操作,它应该到那里检索客户信息作为黄金记录,而不需要担心存储或处理它。另一方面,主数据管理将提供隐私信息的数据接收流程、处理的基本业务规则以及数据访问的仔细控制的清晰性和强制性。综上所述,主数据是公司保护其客户信息并确保完全隐私合规性的最佳设计。
5。自动检测潜在违规的强大数据控制
公司对隐私法规的遵守需要具有高度的可持续性。构建强大的数据控制流程并自动检测不合规情况是组织的重要组成部分。此流程旨在实施业务规则和程序,以便在任何个人信息被添加或填充到不应该添加或填充的位置时发出警报,或者发出任何其他潜在违规风险的警报。
GDPR 和 CCPA 等隐私法规标志着隐私法规在全球的兴起。我们预计很快会有更多的规则出现,每个规则都有其独特性,同时与其他规则有一些共性。这给企业带来了挑战,尤其是那些在多个洲和州拥有客户的企业,他们需要处理各种各样的合规流程。然而,通过精心设计的数据架构、集中且维护良好的元数据管理、数据治理、清晰的数据保留政策、主数据即服务以及强大的数据控制和自动化审计流程,公司将能够快速提出解决方案,并确保以经济高效的方式遵守所有隐私法规,从而获得最佳结果。
原文:https://towardsdatascience.com/svd-a-geometric-view-point-cfc0c689bdc0?source=collection_archive---------19-----------------------
(图片由作者提供)寻求在矩阵作用后保持垂直的垂直轴!
奇异值分解实矩阵的奇异值分解通常在线性代数的第一门课结束时讲授。通俗地说,实矩阵的奇异值分解无非是将矩阵表示为三个更好的矩阵的乘积。
说得更确切些,但仍然*淡无奇,实际结果如下:
设 A 为 n×m 实矩阵。然后是 a=uσvᵀ
如果那样..看起来有点*淡无奇,让我们借助一个例子来尝试理解这个结果的威力和效用。
这是一个非常实际的 2×2 矩阵
(图片由作者提供)A 是矩阵[[6,2],[-7,6]]
它实际上代表了一个相对于标准基准 e₁=(1,0 和 e₂=(0,1).的线性图线性地图 t 发送通常的基本元素 e₁⇝(6,−7 和 e₂⇝(2,6).现在,我们不仅知道 t 如何作用于 e₁和 e₂,我们实际上还知道它如何作用于任何(a,b)。例如
(图片由作者提供)求 T(2,3)是什么
让我们想象一下我们的线性变换 T 是如何作用于标准坐标轴的。我们可以看到,e₁,e₂的垂直轴被扭曲了,{T(e₁),T( e₂)}的图像不再垂直。
(图片由作者提供)T 在常用轴上的作用
因为使用垂直轴总是更容易,所以我们希望找到我们定义域的垂直轴(或者沿着这些轴的单位向量),即使在应用 t 之后,这些轴仍然保持垂直。显然,e₂}的{e₁不是一个好的选择。有好的选择吗?如果有,怎么找?
由彼此成对垂直的单位向量组成的向量空间的基被称为向量空间的标准正交基。因此,我们在更广泛的背景下的问题可以表述如下:
给定一个线性映射 T:R ᵐ →R ⁿ(相对于标准基用一个 n×m 矩阵 A 表示),我们能找到rt39】ᵐ的一个正交基 {v_1,v_2,…,v_m} 使得 {T(v_1),T(v_2
A 的奇异值分解恰恰回答了上面的问题!
设 a 的奇异值分解为 a=uσvᵀ
(图片由作者提供)寻找 T 作用后保持垂直的轴
回忆一下 A 的 SVD 中的 V 是一个 m×m 正交矩阵。因此,v 的列形成了 R ᵐ.的标准正交基{ v1,v2,…,v_m}
类似地,u 是正交 n×n 矩阵,所以 u 的列形成了 R ⁿ的正交基{u_1,u_2,…u_n}
但是 U 和 V 有什么关系呢?
将方程 a=uσvᵀ乘以 v,得到
av =(uσvᵀ)v =uσ(vᵀv)= uσ
所以 uσ的列正好是{t(v_1),t(v_2),…t(v_m)}⊂rⁿ
此外,由于σ是 n×m 矩阵,如果有的话,仅沿着对角线元素(σI,I)具有非零元素,所以 Uσ的列只是由σ的相应对角线元素缩放的 U 的前 m 列
(图片由作者提供)uσ长什么样
因此 T(v _ I)=(σI,i)u_i,它们相互垂直。由于 u_i 是单位向量,所以 T(v_i)的长度正好是对角线项σI,I。
给定一个线性映射 T: R ᵐ → R ⁿ(用一个 n×m 的矩阵 a 相对于标准基来表示),设 a=uσvᵀ是 a 的奇异值分解.那么 v 的列构成了 R ᵐ.的一个正交基此外,在ⁿ.中{T(v_i)}仍然保持相互垂直
向量{T(vi)}的长度由σ的对角线项编码。沿着{T(vi)}的单位向量可以完备化为ⁿ的标准正交基,这由 u 的列精确地给出
所以,你看矩阵的奇异值分解给了我们很多非常有用的信息!
由于σ的非零对角线元素恰好是 A 的降序的奇异值,所以σ对于给定的矩阵 A 是唯一的。
然而,V(以及 U)的列不是唯一的。首先,V 的列可以变化到符号(由于 T(v_i)只是 u_i 乘以一个常数,u_i 的符号也会改变)。为了理解为什么 U,V 不一定是唯一的,也不一定只有符号,考虑一下旋转矩阵 a 的奇异值分解是什么。
当然,人们可以(也应该知道如何)手动计算 SVD。但那是以后的事了。现在,我们将使用 numpy 中的 SVD 实现。
上述代码给出了
(图片由作者提供)使用 numpy 代码的 SVD
你可以检查 100,25 是 AᵀA 的特征值,因此 10,5 是 a 的奇异值
如果你真的用手算出奇异值分解,你会发现这相当于
(图片由作者提供)手写的奇异值分解
脚注
原文:https://towardsdatascience.com/svd-in-machine-learning-pca-f25cf9b837ae?source=collection_archive---------15-----------------------
来源:安迪 _ 贝来自皮克斯贝
本文讨论什么是主成分分析 (PCA),我们如何使用特征值分解 (EVD)或奇异值分解 (SVD),以及为什么 SVD 实现更好。
直观地说,PCA 是一种转换过程,它将具有可能相关特征的数据矩阵转换成一组线性不相关的变量,称为主成分。每一个主成分都是原始特征的线性组合( PCᵢ = Xϕᵢ ,这里 PCᵢ 代表第 I 个主成分),并且在与前面的成分正交时占最大可能方差(如I≦j,pcᵢ⋅pcⱼ=0)。
给定形状为 n × p 的特征矩阵 X ,即居中,即列均值已被减去,现在等于零,PCA 的典型用例包括:
从概念上讲,重要的是要记住,主成分分析是一种多变量数据分析的方法,EVD 和奇异值分解都是数值方法。
传统上,PCA 是基于样本协方差矩阵 C 上的 EVD。假设 X 居中:
C 形状为 p× p 。它是对称的,因此总是可对角化的。我们可以应用特征值分解:
Q 是一个正交矩阵,它的列是 C 的特征向量(q=[q₁, q₂ ,…, qₚ )。 ∧ 是对角线上特征值按降序排列的对角矩阵(λ₁≥λ₂≥…λₚ≥0):
这里 qᵢ 是 Q 的第 I 列,也称为第 I 个主方向。 λᵢ 是∧的第 I 个对角元素。主成分是原始特征矩阵在主方向上的投影,可以通过 XQ 获得。第 I 个主成分解释的总方差比例为 λᵢ / (λ₁ + λ₂ +..+λₚ)。
下面是通过 Python 中的 EVD 实现的 PCA:
对于矩阵 X,t 这里总是存在矩阵 U , , , V 这样:
U 和 V 都是正交的,σ是对角的。σ的对角元素称为奇异值(σ₁≥σ₂≥…≥σₚ≥0)。考虑协方差矩阵 C 😗*
对比上面我们知道 V 的列是主方向,第 I 个特征值 λᵢ = σᵢ /(n-1) 。主成分可以通过XV = uσ得到。
这比 EVD 实现好多少?
下面是在 Python 中通过 SVD 实现的 PCA:
我们将使用鸢尾花数据集来说明 PCA 如何作为无监督学习工具来帮助理解数据。
我们将从 scikit-learn 加载虹膜数据集。特征矩阵包含跨越 4 个属性的 150 个观察值。每行包含鸢尾花的萼片和花瓣的长度和宽度(以厘米为单位)。目标是花的类型(3 个中的 1 个),但是我们将只使用它来进行可视化。
加载数据集,执行数据预处理,并应用 SVD。准备 PCA 的一个基本问题是是否在中心化之上标准化数据集(即确保每列的标准偏差为 1)。从我的角度来看,如果特征是相同规模的,标准化是没有必要的。因此,我们将下面的特征矩阵居中。
计算并可视化由四个主成分和因子载荷解释的总方差的比例。因子负载是原始特征在主成分中的权重,通过用相应特征值的*方根缩放特征向量来获得。它们帮助我们将每个主成分解释为原始特征的加权和。
我们可以看到,第一主成分解释了总方差的 90%以上,它严重依赖于萼片和花瓣的长度。这意味着我们数据中的大多数变化可以用这两个特征的线性组合来解释。
使用 PCA 作为降维或特征工程工具通常会损害结果的可解释性。当特征的数量非常多时,每个主成分通常是太多不同的原始特征的线性组合,因此难以定义。
要查看标准化的效果,请转换特征矩阵,使每一列都有一个标准差,然后重复可视化。
我们可以看到结果变化很大。现在,第一个主成分只能解释总方差的* 75%,而第二个主成分可以解释* 95%。萼片宽度变得更加重要,尤其是对 PC 2。因此,对于我们是否应该对协方差或相关矩阵执行 PCA 的问题,没有普遍的答案。“最佳”方法是基于主观选择、仔细思考和一些经验。
这篇文章是何坤宇写的。Kunyu 目前是芝加哥大学计算分析专业的硕士生。他发现理解统计建模和机器学习技术、将它们应用于真实世界的数据并帮助创建金融服务行业的端到端解决方案是一件有趣的事情。在 LinkedIn 上联系昆玉!🐷
** [## 昆玉何-即将上任的全球量化策略非周期分析师-美银美林…
www.linkedin.com](https://www.linkedin.com/in/kunyuhe/)**
原文:https://towardsdatascience.com/svm-an-optimization-problem-242cbb8d96a8?source=collection_archive---------13-----------------------
这个博客将探索支持向量机的机制。首先,让我们对这篇文章进行一个 100 英里每小时的概述(强烈建议你在阅读这篇文章之前浏览一下)。基本上,我们给定了 n 维空间中的一些点,其中每个点都有一个二进制标签,并希望用一个超*面来分隔它们。用 x 表示这个空间中的任何一点,那么,任何超*面都可以表示为:w^T x +b=0。让我们列出一些术语。
在之前的博客中,我们导出了优化问题,如果解决了这个问题,我们就可以得到描述分离*面的 w 和 b(我们将从那里继续我们的方程编号,γ是一个虚拟变量),它最大化了“余量”或离*面最*点的距离。请注意,每个数据点有一个不等式约束。
等式(4): SVM 最优化问题
然后,我们做了一些忍术来消除γ,并简化为以下优化问题:
等式(7):简化的 SVM 优化问题
在这篇博客中,让我们来看看拉格朗日乘子的方法对于解决像这样的约束优化问题可以提供什么样的支持向量机的见解。
在本系列的前一篇博客中,我们获得了两个约束优化问题(上面的等式(4)和(7 )),它们可用于获得最大化余量的*面。有一种求解带约束优化问题的通用方法(拉格朗日乘子法)。为了保持重点,我们将在这里陈述配方,并使用它来挖掘关于 SVM 问题的见解。至于这个方法为什么有效,请阅读这篇博客其中详细介绍了拉格朗日乘数。如果我们有一个一般性的优化问题,
等式(8)一般约束优化问题。
步骤 1:定义拉格朗日函数:
方程式(9)拉格朗日函数
其中α_i 和β_i 是称为“拉格朗日乘数”的附加变量。不等式α_i 对应的乘数必须≥0,而等式β_i 对应的乘数可以是任意实数。这里再次提供了一些直观的原因。那么,为了使 w 成为最佳值,必须满足的条件(称为 KKT 条件)是:
等式(10):找到约束最优化问题的解的 KKT 条件。
方程 10-e 称为互补条件,它保证如果一个不等式约束不是“紧的”(g_i(w)>0 且不等于 0),那么对应于该约束的拉格朗日乘数必须等于零。事实证明,这是因为拉格朗日乘数可以被解释为指定不等式约束在最优点上被“推动”的力度。如果约束甚至不是严格的(有效的),我们在解中根本没有推动它,因此,相应的拉格朗日乘数,α_i=0。等式 10b 和 10c 非常简单,因为它们简单地陈述了原始优化问题的约束应该在最优点处得到满足(几乎是一个重言式)。
让我们回到支持向量机。在等式(4)和(7)中,我们根据每个点到分隔线的垂直距离(边距)为每个点指定了一个不等式约束。与线(边距)距离最小的点将是约束条件相等的点。如果有多个共享该最小距离的点,则它们的约束将根据等式(4)或(7)变成等式。这样的点被称为“支持向量”,因为它们“支持”它们之间的线(正如我们将看到的)。从问题的几何结构中,很容易看出必须有至少两个支持向量(与直线共享最小距离的点,因此具有“紧”约束),一个具有正标签,一个具有负标签。假设不是这种情况,并且只有一个具有最小距离 d 的点。在不失一般性的情况下,我们可以假设该点具有正标签。然后,在距离为 d+δd 的线的另一侧有另一个带有负标签的点。可以沿着 w 向量向负点移动δd/2 的距离,并增加相同距离的最小边距(现在,最*的正点和最*的负点都成为支持向量)。这意味着我们开始的另一行是一个假先知;不可能是真正的最佳利润线,因为我们很容易提高利润。
但是,这完全依赖于问题的几何解释。如果我们只得到最优化问题(4)或(7)(我们假设我们知道如何从一个问题得到另一个问题),我们会得到同样的结论吗?对于方程(4)中的问题,方程(9)中定义的拉格朗日量变成:
对γ求导,我们得到,
等式(11)
对 b 求导,
如果我们认为{I}是正标签的集合而{J}是负标签的集合,我们可以重写上面的等式:
等式(12)
等式(11)和(12)以及所有α都≥0 的事实意味着在每个正类和负类中至少有一个非零α_i。并且由于α_i 表示对应于第 I 个点的约束有多“紧”(0 表示一点也不紧),这意味着两个类中的每一个都必须有至少两个点,约束是活动的,因此拥有最小余量(跨越点)。
在上一节中,我们用公式表示了方程(4)中给出的系统的拉格朗日函数,并对γ求导。现在,让我们为等式(10)给出的公式形成拉格朗日量,因为这要简单得多:
等式(13):等式(7)的拉格朗日量
根据 10-a 对 w 求导,并设为零,我们得到:
等式(14):最优 w。
与之前一样,每个点都有一个与之对应的不等式约束,拉格朗日乘数α_i 也是如此。此外,除了与分隔线具有最小可能距离的点(等式(4)或(7)中的约束是有效的),所有其他点的α_i 都等于零(因为约束是无效的)。
从方程(14)中,我们看到这些点(α_ I = 0)对拉格朗日量没有贡献,因此对最佳线的 w 也没有贡献。同样容易看出,它们也不影响最优线的 b。因此,在定义直线时,只有最接*直线的点(因此它们的不等式约束变成了等式)才是重要的。这就是为什么这些点被称为“支持向量”。通常只有少数几个,但它们支持它们之间的分离面。
在这一节中,我们将考虑一个非常简单的分类问题,它能够抓住优化行为的本质。所以我们可以把正在发生的事情可视化,我们把特征空间做成二维的。让我们在上面放两个点,并像这样标记它们(绿色表示正标签,红色表示负标签):
很明显,分隔这两点的最佳位置是由 x+y=0 给出的紫色线。
现在让我们看看我们到目前为止学习的数学是如何告诉我们关于这个问题我们已经知道了什么。为什么要这么做?以便明天它能告诉我们一些我们不知道的事情。
由于我们有 t⁰=1 和 t =-1,我们从方程(12)得到,α_0 = α_1 = α。将此代入方程(14)(这是一个向量方程),我们得到 w_0=w_1=2 α。因此,我们立即得到,对于 x 和 y,该线必须具有相等的系数。我们还知道,因为只有两个点,所以对应于它们的拉格朗日乘数必须> 0,并且对应于它们的不等式约束必须变得“紧密”(等式;见第 2.1 节最后一行)。这意味着,
减去这两个方程,我们得到 b=0。所以,分离*面,在这种情况下,是直线:x+y=0,正如所料。
为了使问题更有趣,并涵盖一系列可能的 SVM 行为,让我们添加第三个浮点。因为(1,1)和(-1,-1)位于 y-x=0 的直线上,所以让第三点也位于这条直线上。让我们把它放在 x=y=u,同样,让我们给这个点一个正的标签(就像绿色的(1,1)点一样)。
只要 u>1,*面通过原点。但是当 u <1, the (u,u) point becomes the support vector and drives the separating purple plane downward.
Now, the intuition about support vectors tells us:
Let’s see how the Lagrange multipliers can help us reach this same conclusion. From equation (14),
Eq (15)
Also, taking derivative of equation (13) with respect to b and setting to zero we get:
And for our problem, this translates to: α_0-α_1+α_2=0 (because the first and third points — (1,1) and (u,u) belong to the positive class and the second point — (-1,-1) belongs to the negative class).
Eq (16)
Next, equations 10-b imply simply that the inequalities should be satisfied. For our problem, we get three inequalities (one per data point). All specified by (per equation (7)):
for our three data points we get:
But from equation (15) we know that w_0=w_1. Further, the second point is the only one in the negative class. So, the inequality corresponding to it must be an equality. Using this and introducing new slack variables, k_0 and k_2 to convert the above inequalities into equalities (the squares ensure the three inequalities above are still ≥0):
Eq (17)
And finally, we have the complementarity conditions:
Eq (18)
From equation (17) we get: b=2w-1. Further, since we require α_0> 0,α_2>0,我们用α_0,α_2 来代替。从等式(15)和(16)我们得到:
等式(19)
将 b=2w-1 代入等式(17)的第一个,
等式(20)
并进入等式(17)的第三个,
等式(21)
现在,方程(18)到(21)很难手工求解。幸运的是,有一个用于求解多项式方程组的通用框架,称为“Buchberger 算法”,上面描述的方程基本上是一个多项式方程组。我在这里写了一篇关于 Buchberger 求解多项式方程组的算法的详细博客。它可以用来根据我们感兴趣的变量简化方程组(简化的形式称为“Groebner 基”)。该算法在 python 库 sympy 中实现。让我们看看它是如何工作的。
等式(18)至(21)及其 Groebner 基,其中 k2 是第一个要消除的变量,k0 是第二个。由于只有五个方程,但有六个变量,所以 Groebner 基的最后一个方程将只用 k0 和 k2 来表示。
上面代码中变量的顺序很重要,因为它告诉 sympy 它们的“重要性”。它试图让 Groebner 基末尾的方程,用末尾的变量来表示。在这种情况下,我们有六个变量,但只有五个方程。并且由于 k_0 和 k_2 是最后两个变量,所以基的最后一个方程将仅用它们来表示(如果有六个方程,则最后一个方程将仅用 k2 来表示)。我们得到:
这意味着 k0k 2 = 0,因此,它们中至少有一个是零。然而,我们知道它们不可能都为零(一般来说),因为这意味着对应于(1,1)和(u,u)的约束都是紧的;这意味着它们都在离直线的最小距离处,这只有在 u=1 时才有可能。一个或另一个必须为 0 的事实是有意义的,因为(1,1)或(u,u)中恰好有一个必须最接*分隔线,使得相应的 k =0。
做一个类似的练习,但是用 u 和 k_0 表示的最后一个等式,我们得到:
这意味着要么 0 = 0,要么
类似地,根据 k_2 和 u 提取方程,我们得到:
这又意味着要么 k_2=0,要么
这意味着,如果 u>1,那么我们必须有 0 = 0,因为另一种可能性会使它成为虚数。因此,k_2 不可能是 0,而会变成(u-1)^.5.换句话说,对应于(1,1)的方程将变成等式,对应于(u,u)的方程将是“lose”(严格不等式)。这是有意义的,因为如果 u>1,(1,1)将是更接*超*面的点。
类似地,如果 u<1,k_2 将被迫变为 0,因此,k_0 将被迫取正值。我们看到了两点:(u,u)和(1,1)在 u 从小于 1 转变到大于 1 时切换作为支持向量的角色。另一方面,如果 u<0,则不可能找到均为非零实数的 k_0 和 k_2,因此方程没有实数解。
原文:https://towardsdatascience.com/svm-hyperparameters-explained-with-visualizations-143e48cb701b?source=collection_archive---------10-----------------------
照片由 Unsplash 上的 Aziz Acharki 拍摄
支持向量机(SVM)是一种广泛使用的监督机器学习算法。它主要用于分类任务,但也适用于回归任务。
在这篇文章中,我们深入探讨了支持向量机的两个重要的超参数, C 和γ,并用可视化的方法解释了它们的作用。所以我假设你对算法有一个基本的了解,并关注这些超参数。
SVM 使用决策边界来分离属于不同类别的数据点。当确定决策边界时,软边界 SVM(软边界意味着允许一些数据点被错误分类)试图解决具有以下目标的优化问题:
软边界 SVM 的决策边界(图片由作者提供)
很明显,这两个目标之间有一个折衷,它由 C 控制,对每个错误分类的数据点增加一个惩罚。
如果 C 很小,则对误分类点的惩罚也很低,因此以更大数量的误分类为代价选择了具有大余量的决策边界。
如果 C 很大,SVM 会尽量减少错误分类的例子,因为高惩罚会导致决策边界具有较小的余量。对于所有分类错误的例子,惩罚是不一样的。它与到决策边界的距离成正比。
举例之后会更清楚。让我们首先导入库并创建一个合成数据集。
(图片由作者提供)
我们将首先训练一个只需要调整 c 的线性 SVM,然后我们将实现一个具有 RBF 核的 SVM,并调整伽马参数。
为了绘制决策边界,我们将使用 Jake VanderPlas 的 Python 数据科学手册的 SVM 章节中的函数。
我们现在可以创建两个具有不同 C 值的线性 SVM 分类器。
(图片由作者提供)
只需将 C 值更改为 100,即可生成如下图。
(图片由作者提供)
当我们增加 C 值时,边距变小。因此,具有低 C 值的模型倾向于更一般化。随着数据集越来越大,这种差异变得越来越明显。
超参数的影响仅在线性核的情况下达到一定程度。对于非线性核,超参数的影响变得更加明显。
伽马是与非线性 SVM 一起使用的超参数。最常用的非线性核之一是径向基函数(RBF)。RBF 的 Gamma 参数控制单个训练点的影响距离。
低 gamma 值表示较大的相似性半径,这将导致更多的点被组合在一起。对于高 gamma 值,这些点需要彼此非常接*,才能被视为在同一组(或类)中。因此,gamma 值非常大的模型往往会过度拟合。
让我们用不同的伽马值绘制三个支持向量机的预测。
(图片由作者提供)
只需改变伽马值,以产生以下图形。
(图片由作者提供)
(图片由作者提供)
随着 gamma 值的增加,模型变得过拟合。数据点需要非常接*才能分组在一起,因为相似性半径随着灰度值的增加而减小。
伽马值为 0.01、1 和 5 的数据集上的 RBF 核的精度分别为 0.89、0.92 和 0.93。这些值表明随着 gamma 值的增加,模型过度适应训练集。
对于线性核,我们只需要优化 c 参数。然而,如果我们想使用 RBF 核,c 和 gamma 参数需要同时优化。如果γ很大,c 的影响可以忽略不计。如果 gamma 很小,c 会像影响线性模型一样影响模型。c 和γ的典型值如下。然而,根据应用可能存在特定的最佳值:
0.0001 < gamma < 10
0.1 < c < 100
原文:https://towardsdatascience.com/svm-implementation-from-scratch-python-2db2fc52e5c2?source=collection_archive---------0-----------------------
如果你明白了,干杯😉
在深入代码或技术细节之前,我想提一下,虽然有许多库/框架可用于实现 SVM(支持向量机)算法,而无需编写大量代码,但我决定用尽可能少的高级库来编写代码,以便您和我可以很好地掌握训练 SVM 模型(准确率为 99%,召回率为 0.98%,精确度为 0.98%)所涉及的重要组件。如果你正在寻找 SVM 的快速实现,那么你最好使用像 scikit-learn 、 cvxopt 等这样的包。要不,我们开始吧!
图 1: SVM 用一张图表概括— Ireneli.eu
SVM (支持向量机)是一种监督的 机器学习算法,通常用于二元分类问题。它通过输入带有标签示例的数据集来训练(xᵢ,yᵢ).例如,如果您的示例是电子邮件,而您的问题是垃圾邮件检测,那么:
使用这个数据集,算法找到一个超*面(或决策边界),该超*面理想地应该具有以下属性:
它是怎么找到这个超*面的?**通过找到定义该超*面的最优值 w(权重/法线)和b (截距)。通过最小化成本函数找到最佳值。一旦算法识别出这些最优值,则 SVM 模型 f(x) 被定义如下:
数学表达的 SVM 模型
在我们继续之前,让我们导入本教程所需的包,并创建我们程序的框架 svm.py :
我们将使用 Kaggle 上的乳腺癌数据集。数据集中的特征是根据乳腺肿块细针抽吸(FNA)的数字化图像计算得出的。它们描述了图像中出现的细胞核的特征。基于这些特征,我们将训练我们的 SVM 模型来检测肿块是良性的 B (一般无害)还是恶性的 M (癌变)。
下载数据集并将 data.csv 文件放在与 svm.py 相同的文件夹中。然后将这段代码添加到 init() 函数中:
read _ CSV()Pandas包的函数从。csv 文件并将其存储在数据帧和中。把DataFrame 想象成一个数据结构的实现,它看起来像一个带有标记的列和行的表格。下面是从 data.csv 中读取的数据在 DataFrame 中的样子:
图 2: 在 PyCharm IDE 中查看的数据帧中乳腺癌数据集的一部分
如您所见,我们的数据集的标签和结构得以保留,这使得 DataFrame 变得直观。
机器学习算法在一个数据集上操作,该数据集是一个由特征和标签组成的带标签的例子的集合,即在我们的情况下诊断是一个标签,【半径 _ *均,结构 _ *均,纹理 _ *均……特征,并且每一行都是一个例子。
在大多数情况下,您最初收集的数据可能是原始的;它要么与你的模型不兼容,要么妨碍它的性能。这时特征工程来拯救。它包括预处理技术,通过从原始数据中提取特征来编译数据集。这些技术有两个共同的特点:
****标准化是我们将要使用的众多特征工程技术之一。归一化是将数值范围转换为标准数值范围的过程,通常在区间[1,1]或[0,1]内。这不是一个严格的要求,但它提高了学习的速度(例如,在梯度下降中更快的收敛)并防止数值溢出。在 init() 函数中添加以下代码,以规范化您的所有功能:
我们将使用sk learn . model _ selection中的 train_test_split() 函数将数据集分成训练集和测试集。我们需要一个单独的数据集来进行测试,因为我们需要看看我们的模型在看不见的观察上表现如何。将此代码添加到 init() 中:
如果你对我们为什么在每一行加 1 感到困惑,那么不要担心。你会在下一节得到答案。
图 3: H1 并没有把阶级分开。H2 有,但幅度很小。H3 以最大的差距将他们分开— 维基百科
也称为目标函数。每个机器学习算法的构建模块之一,它是我们试图最小化或最大化以实现我们目标的函数。
我们在 SVM 的目标是什么?我们的目标是找到一个超*面,它以最大的裕度分隔+ve 和-ve 示例,同时保持尽可能低的错误分类(见图 3)。
我们如何实现这个目标?我们将最小化成本/目标函数,如下所示:
在训练阶段,较大的 C 导致较窄的裕度(对于无限大的 C,SVM 变成硬裕度),而较小的 C 导致较宽的裕度。
您可能见过另一个版本的成本函数,如下所示:
较大的λ给出较宽的余量,较小的λ导致较窄的余量(对于无限小的λ,SVM 变成硬余量)。
在这个成本函数中,λ基本上等于 1/C ,并且具有相反的效果,即较大的λ给出较宽的余量,反之亦然。我们可以使用任何上述成本函数,记住每个正则化参数(C 和λ)的作用,然后相应地调整它们。让我们看看如何计算(1)中给出的总成本,然后我们将继续讨论其梯度,该梯度将用于训练阶段以使其最小化:
您可能已经注意到,截距术语 b 不见了。这是因为我们把它推进了重量向量,就像这样:
将截距项推入权重向量。
这就是为什么我们在拆分数据集之前添加了一个全 1 的额外列。在本教程的剩余部分,请记住这一点。
成本函数的梯度
您可能已经注意到,等式(4)中的成本函数有一些变化。不要担心,如果你解析地解决它,它是相同的。现在让我们使用等式(5)实现calculate _ cost _ gradient()函数:
记得我在上面说过,“为了实现我们的目标,我们试图最小化或最大化成本函数”。在 SVM 算法中,我们最小化成本函数。
我们为什么要最小化成本函数?因为成本函数本质上是衡量我们的模型在实现目标方面做得有多差的指标。如果你仔细观察 J(w),为了找到它的最小值,我们必须:
铰链损失函数
因为我们的两个 SVM 目标都是通过最小化成本函数来实现的,这就是为什么我们要最小化它。
我们如何将它最小化?嗯,有多种方法,但我们将使用一种叫做随机梯度下降或 SGD 的方法。在深入 SGD 之前,我首先简单解释一下梯度下降是如何工作的。
图 4: 梯度下降
梯度下降算法的工作原理如下:
为什么它的运动方向与梯度方向相反?因为梯度是函数增长最快的方向。我们需要向相反的方向移动,使函数 J(w)最小。因此,在梯度下降中使用“下降”一词。
在典型的梯度下降(又名普通梯度下降)中,使用所有示例(1…N)计算上述步骤 1。然而,在 SGD 中,一次只使用一个示例。我不会在这里讨论 SGD 的好处,但是你可以在这个博客的末尾找到一些有用的链接。下面是如何用代码实现 SGD:
让我们通过添加以下代码在 init() 函数内部调用它:
在上面的 sgd() 实现中,我们运行了 5000 次循环(可能是任何次数)。每次迭代都花费我们时间和额外的计算。我们不需要完成所有的迭代。当满足中断标准时,我们可以终止循环。
停工标准应该是什么?有多个选项,但我们将使用最简单的一个。与之前的成本相比,当当前的成本没有降低很多时,我们将停止培训。下面是我们如何用停止标准定义 sgd() :
在使用 SGD 训练模型之后,我们最终获得了最优权重 w ,其定义了分离两个类的最佳可能超*面。让我们用这个超*面来测试我们的模型。将此代码添加到 init() 函数中:*
现在让我们调用 init() 函数:
以下是输出结果:
请注意模型的准确性、召回率和精确度分数,以及完成模型所需的时期。现在让我们尝试使用特征选择来改进它。
特征选择包括帮助过滤不相关或冗余特征的统计技术。相关性和 p 值就是这些统计技术中的一种。使用它们,我们将从我们的原始特征集中选择一个相关和重要的特征子集
什么是相关性?相关性是两个变量之间线性依赖(或线性关系)的程度。如果一个特征的值可以用第二个特征的某种线性关系来解释,则称两个特征相关。这种关系的程度由相关系数*(或“r”)给出。范围从-1.0 到+1.0。r 越接*+1 或-1,这两个变量的关系就越密切。*
为什么我们要删除其中一个相关特征?有多种原因,但最简单的原因是相关特征对因变量的影响几乎相同。此外,相关特征不会改善我们的模型,而且很可能会恶化它,因此我们最好只使用其中的一个。毕竟特征越少,学习速度越快,模型越简单(特征越少的模型)。
什么是 p 值?这个博客涉及的范围太广了。但是,在特征选择的背景下,p 值帮助我们找到在解释因变量(y)* 的变化中最重要的特征。*
在解释这种变化时,p 值低的要素意义更大,而 p 值高的要素意义较小。通常,我们设置一个显著性水* SL (阈值),如果一个特征的 p 值高于这个水*,它将被丢弃。我会在这篇博客的最后留下一些链接,对 p 值进行深入研究。
为什么我们要移除高 p 值的特征?因为它们不能说明因变量的行为。因此,当它们不能帮助我们预测结果时,为什么要保留它们,并不必要地增加我们模型的复杂性。
我们有两个名为remove _ correlated _ features()remove _ less _ significant _ features()的函数,分别用于移除高度相关的特征和不太重要的特征(使用 p 值和向后消除):
在应用规范化之前,让我们在 init() 中调用这些函数:
重新运行代码并检查输出:
可以看到准确率(99%)* ,精度(0.98) ,以及召回(0.98) 的分数都有所提高。而且,新币收敛得更快;训练在 2048 个纪元内结束,这与之前的一次(5000 个纪元)相比要少得多*
您可以在这个 Github 资源库中获得完整的代码:
* [## qandeelabbassi/python-svm-sgd
github.com](https://github.com/qandeelabbassi/python-svm-sgd)*
有用链接
原文:https://towardsdatascience.com/svm-kernels-what-do-they-actually-do-56ce36f4f7b8?source=collection_archive---------5-----------------------
由凯利·西克玛在 Unsplash 上拍摄的照片
你可能听说过所谓的核技巧,这是一种允许支持向量机(SVM)很好地处理非线性数据的策略。这个想法是将数据映射到一个高维空间,在这个空间中数据变成线性的,然后应用一个简单的线性 SVM。听起来很复杂,在某种程度上确实如此。然而,尽管可能很难理解内核是如何工作的,但理解它们试图实现的目标是相当容易的。请继续阅读,自己去看看吧!
首先:香草 SVM 是如何工作的?我们可以将支持向量机用于分类和回归任务,但是在本文中,我们将关注前者。让我们首先考虑具有线性可分的两个类的数据。我们将创建两个独立的点,并使用 scikit-learn 为它们拟合一个线性 SVM。请注意,我们在拟合模型之前对数据进行了归一化,因为支持向量机对特征的尺度很敏感。
自定义的函数,你可以在下面看到它的输出,由相当多的 matplotlib 代码组成——如果你好奇,可以在thisjupyter notebook中查看。
具有线性可分数据的线性 SVM 效果很好。
有许多线条完美地分隔了这两个阶级,确切地说是无限多。由 SVM 拟合的线是特殊的,因为它是用虚线标记的波段的中线,并且该波段是可以在两个类别之间挤压的最宽的波段。这样,SVM 决策线(标记为黑色实线)尽可能远离这两个类,确保模型能够很好地推广到新的示例。
用红色圈出的波段边界上的观察值称为支持向量,因为它们支持或确定波段的位置。如果我们增加一些波段外的观察,它不会改变位置。
作为一个旁注:这是一个硬边界分类的例子,这意味着不允许任何观察值进入波段。或者,我们可以做一个软边界分类:允许对波段进行一些观察,但不要太多,同时使波段更宽。这将对异常值更加鲁棒,并且可以通过中的参数 C 来控制:我们已经将其设置为 1,但是例如将其降低到 0.1,将会产生更宽的波段,但是其中会有一些观察值。不管怎样,这和我们的故事没多大关系。
大多数现实生活中的数据集不是漂亮的、线性可分的斑点。让我们看看线性 SVM 如何处理月亮形状的数据。
具有线性不可分数据的线性 SVM 根本不起作用。
这看起来不太好,是吗?让我们看看我们能做些什么。
在我们讨论内核和它们做什么之前,让我们先来看看它们利用的一个强大的思想:在高维空间中,数据有更大的机会变成线性可分的。
下面的一对图清楚地说明了这一点。当我们只有一个特征时, x1 ,我们不能用一行来分隔数据。添加另一个特征, x2,等于 x1 的*方,使得区分这两个类变得容易。
添加另一个特征使得数据可以线性分离。
那么,内核的诀窍是什么呢?内核只是向数据添加更多特征的一种聪明方式,希望使数据线性分离。聪明,因为它们不是实际添加它们,这会使模型变慢,而是利用一些神奇的数学属性(这超出了本文的范围),使我们能够获得与我们实际添加这些特性完全相同的结果,而不会使模型变慢。****
两个流行的内核是多项式内核和高斯径向基函数,或 RBF,内核。它们的不同之处在于它们(假装)添加的功能类型。让我们看看他们是怎么做的!
创建更多特征的一种方法是在一定程度上使用它们的多项式组合。例如,对于两个特征 A 和 B,2 次多项式将产生 6 个特征:1(任何 0 次幂的特征)、A、B、A、B 和 AB。我们可以使用 scikit-learn 的轻松地手动添加这些功能:
或者我们可以简单地使用多项式核:
您可以自己验证两种实现产生大致相同的图,有点像这样:
具有多项式核的决策边界。
使用内核化版本的优点是,您可以指定较大的程度,从而增加数据在这个高维空间中线性分离的机会,而不会降低模型的速度。
对于我们的月球数据示例,从散点图可以清楚地看出,3 次多项式就足够了。然而,对于更复杂的数据集,您可能需要使用更高的度数。这就是内核技巧的威力被释放出来的时候。
向数据添加更多特征的另一种方法是使用所谓的相似性特征。相似性特征测量现有特征的值与地标的距离。让我们实际一点:我们有一个具有单一特征的数据集, x1 。我们想要创建两个相似性特征,因此我们选择两个界标,即来自我们的单个特征的参考值。让我们以-1 和 1 为例。然后,对于 x1,的每个值,我们计算它离第一个地标有多远(继续阅读,看看如何定义‘远’)。这是我们新的相似性特征, x2 。然后我们做同样的事情,将 x1 的值与第二个界标进行比较,以获得 x3 。现在我们甚至不需要原来的功能 x1 !这两个新的相似性特征使我们的数据很容易分离。
相似性特征使得数据可以线性分离。
那么,我们如何计算每次观测到地标的距离呢?一个流行的选择是使用高斯径向基函数,或 RBF。它被定义为:
其中 x 是我们的原始特征,γ是一个参数,我将其设置为 0.3。
例如,在我们唯一的原创特性上,第一个观察得分为-3。我们计算出 x2 为 exp(-0.3 * (-3-(-1)) )≈0.30,而 x3 为 exp(-0.3 * (-3-(1)) )≈0.01。这是右边图上最底部的点。
在上面的例子中,我们幸运地选择了两个工作正常的地标。在实践中,可能需要大量的界标,这转化为许多新的相似性特征。这将大大降低 SVM 的速度——除非我们使用内核技巧!与多项式核类似,RBF 核允许我们获得完全相同的结果,就好像我们在原始要素的每个值处添加了一个界标,而不需要实际这样做。让我们用我们的月亮形状的数据来试试吧。
具有 RBF 核的决策边界,γ=0.3。
决策边界看起来相当不错,但是您可能已经注意到一些错误分类的例子。我们可以通过调整γ参数来修复它。它作为一个正则化因子,它越小,决策边界越*滑,从而防止过度拟合。然而,在这种情况下,我们似乎实际上欠拟合,所以让我们将γ增加到 0.5。
具有 RBF 核的决策边界,γ=0.5。
现在所有的例子都被正确分类了!
感谢阅读!
如果你喜欢这篇文章,为什么不在我的新文章上 订阅电子邮件更新 ?通过 成为媒介会员 ,你可以支持我的写作,并无限制地访问其他作者和我自己的所有故事。
需要咨询?你可以问我任何事情,也可以在这里 预定我 1:1 。
也可以试试 我的其他文章 中的一篇。不能选择?从这些中选择一个:
** [## 校准分类器
towardsdatascience.com](/calibrating-classifiers-559abc30711a) [## 线性回归中收缩法和选择法的比较
towardsdatascience.com](/a-comparison-of-shrinkage-and-selection-methods-for-linear-regression-ee4dd3a71f16) [## 非线性回归:基础扩展、多项式和样条
towardsdatascience.com](/non-linear-regression-basis-expansion-polynomials-splines-2d7adb2cc226)**
原文:https://towardsdatascience.com/svm-support-vector-machine-for-classification-710a009f6873?source=collection_archive---------7-----------------------
SVM:支持向量机是一种监督分类算法,我们在两个不同的类别之间画一条线来区分它们。SVM 也被称为支持向量网络。
考虑一个例子,我们有猫和狗在一起。
狗和猫(作者图片)
我们希望我们的模型能够区分猫和狗。
SVM 术语(图片来自作者)
在许多情况下,区分并不像上面显示的那样简单。在这种情况下,超*面维数需要从 1 维变为第 n 维。这叫内核。更简单地说,这是两个观测值之间的函数关系。这将为数据增加更多的维度,因此我们可以很容易地区分它们。
我们有三种类型的内核。
在实际生活中,很难得到一个直的超*面。考虑下图中混合在一起的点。您不能使用直线 2d 超*面来分离这些点。
作者图片
SVM 的一些使用案例:
让我们看看 SVM 是如何进行回归的。
作者图片
df.head()将给出每一列的前 5 行的详细信息。我们可以使用 df.tail()获得最后 5 行,类似地,使用 df.head(10)获得前 10 行。
这些数据是关于汽车的,我们需要使用上面的数据来预测汽车的价格
我们将使用决策树来获得汽车的价格。
dtypes 给出列的数据类型
作者图片
在上面的数据框中,一些列不是数字。因此,我们将只考虑那些数值为数字的列,并使所有的数字都浮动。
出局:
准备数据与分类任务一样,在本节中,我们将把数据划分为属性和标签,从而划分为训练集和测试集。我们将创建 2 个数据集,一个用于价格,另一个用于(df-price)。由于我们的数据框包含各种对象格式的数据,因此在本次分析中,我们将删除所有对象类型的列,对于所有 NaN 值,我们将删除该行。
这里,X 变量包含数据集中的所有列,除了标签“价格”列。y 变量包含“价格”列中的值,这意味着 X 变量包含属性集,y 变量包含相应的标签。
训练 SVM
我们将使用函数 SVM 创建一个对象 svr。我们将使用内核作为线性。
为了高效工作,我们将对数据进行标准化。SVM 的工作地点相距很远,所以我们所有的数据都必须采用相同的标准。
出局:
我们的数据已经标准化了。
检查我们的预测值
出局:
检查模态性能的时间到了。
出局:
出局:
我们对测试数据的 R sqrt 得分是 0.72,对训练数据的 R sqrt 得分是 0.85,这是一个很好的值。
实际值与拟合值
以上是实际值和预测值之间的曲线图。
SVM 进行分类
在这里,我们将使用我在之前关于 KNN 的故事中使用的糖尿病数据。https://towards data science . com/KNN-algorithm-what-when-why-how-41405 c 16 c 36 f
让我们使用 SVM 进行分类来预测相同的数据集结果。
数据集的数据。
我们将通过 pd.read.csv 读取 CSV 文件,通过 head()我们可以看到前 5 行。有些因素的值不能为零。例如,人的葡萄糖值不能为 0。同样,人类的血压、皮肤厚度、胰岛素和身体质量指数也不可能为零。
作者图片
对于数据 X,我们取范围从 0 到 7 的所有行和列。类似地,对于 y,我们取第 8 列的所有行。
我们有在程序开始时导入的 train_test_split,我们将测试大小定义为 0.2,这意味着所有数据中的 20%将被保留,以便在稍后阶段测试数据。
出局:
我们有一组数据,但我们需要评估我们的模型,以检查准确性。让我们从混淆矩阵开始
让我们检查一下混淆矩阵
出局:
我们有混淆矩阵,其中对角线 118 和 36 显示正确的值,0,0 显示我们错过的预测。
我们将检查准确度分数
出局:
我们的准确率是 0.78
让我们算出实际值和预测值之间的差异。
实际与预测
我们创建了 C 为 0.01 的线性模型。但是如何确保它的最佳价值。一种选择是改为手动。我们可以分配不同的值,然后逐个运行代码。但是这个过程非常漫长和耗时。
我们将使用网格搜索,其中我们将分配不同的 C 值,并且从该值的字典中,我们的模型将告诉用户根据模型哪一个是 C 的最佳值。为此,我们需要导入 GridsearchCV
这里我们为 c 定义了 10 个不同的值。
cv 代表交叉验证。verbose 为 1:表示布尔值,将创建消息。
出局:
出局:
这将为我们提供模型的最佳 C 值的结果
出局:
这是我们能从上述 C 值中得到的最佳精度。
以类似的方式,我们可以尝试 Kernel ='poly '。但是对于“rbf ”,我们也需要定义 gaama 值。param = {'C':(0,0.01,0.5,0.1,1,2,5,10,50,100,500,1000)},' gamma':(0,0.1,0.2,2,10)并且用正常的一个值 C 从 sklearn 导入 svm svm1 = svm。SVC(kernel='rbf ',gamma=0.5,C = 0.01) svm1.fit(X_test,y_test)。
以上代码可在 https://www.kaggle.com/adityakumar529/svm-claasifier 的查看。
你可以检查我的代码
[## Aditya Kumar | Kaggle
www.kaggle.com](https://www.kaggle.com/adityakumar529) [## adityakumar 529/Coursera _ Capstone
github.com](https://github.com/adityakumar529/Coursera_Capstone)
原文:https://towardsdatascience.com/svms-jack-of-all-trades-fd6fe3b49580?source=collection_archive---------45-----------------------
以下解释假设您对监督机器学习以及线性判别函数有基本的了解。
然而,如果你和我一样,拥有金鱼般的记忆力,让我们提醒自己以下几点:
监督机器学习 需要创建一种算法,该算法能够基于示例输入-输出对将输入映射到输出。换句话说,输入神经网络的数据已经预先分类,实际上是在“监督”这个过程。
在监督机器学习中,对我们的输入数据进行分类的一种原始而有效的方法是线性分类器,如 线性判别函数 。这些函数通过超*面决策表面有效地划分了我们的特征空间,该超*面决策表面有助于对存在于两侧的数据进行分类。
听着耳熟?让我们开始吧!
作为线性判别函数的子集,SVM 也用 N 维超*面对每个预定义类别的标记训练数据进行分类。n 是所考虑的属性的数量。
让我们考虑下面的红蓝圈数据集。在这种情况下,只有两个属性,x 和 y,导致超*面成为二维线。
多种可能的超*面方向
从图中可以清楚地看出,对于分隔两个类别的绿色超*面,存在多个可能的方向,这影响了模型的方差和偏差。
因此,SVM 试图解决这样一个问题:哪一个超*面是最优选择?
为此,边缘被定义为超*面表面和数据集中最*点之间的距离,称为支持向量。事实上,根据所选的支持向量,边距的宽度和方向可能会有所不同。因此,相应地选择它们以最大化分类的裕度。
位于边缘两侧的数据点被归类为属于相应的数据集。
线性判别函数的基本形式如下,
其中 w 是与数据点 x 相关联的权重向量,w0 是偏差或阈值权重。
在超*面 g(x) = 0 上,然后根据 g(x)>0 还是 g(x) <0, points are classified accordingly. If we plot g(x) for our dataset, we expect the final outcome to look as follows,
Now, let us define the vector b, which consists of -1s and 1s depending on which side of the hyperplane each data point x, is situated.
If we multiply g(x) with b(x), we expect all the data points to be translated on the right-hand side of the previous diagram, as all g(x)<0 points will be multiplied by -1.
As a result, the distance M, between g(x) =0 and the leftmost data point is defined as the margin.
However, if a support vector happens to be an outlier, an erroneous point in the dataset, it can result in poor classification as it skews the hyperplane.
As evident from the diagram, the rightmost red data point skews the hyperplane as it overfits to compensate for the anomaly. In fact, the optimum hyperplane remains the one positioned at a steeper gradient located equally between the two datasets.
如果有一种方法可以使 SVM 对支持向量不那么敏感,从而得到一个更一般化的结果呢?
我们可以定义一个软度值 C,它定义了数据点可以超过边界准则的程度,从而错误的支持向量不会危及我们的模型的准确性。C 的值可以从交叉验证技术中选择。
如果 C 的值太大,我们允许许多点超出确定的边界。然而,如果 C 的值太小,我们就定义了一个硬边界,并冒着过度拟合数据的风险。
随后,可以用新定义的与软度 C 相关的参数ε来更新余量最大化方程,如下所示,
在某些情况下,不可能线性分离数据集,相反,非线性映射能够将数据集分类到更准确的程度。常见的例子包括 XOR 数据集或循环数据集。
循环数据集
因此,需要非线性映射,将数据集放入可以确定合适分离超*面的高阶空间。该映射由变换函数φ执行,并且线性支持向量点积现在可以用φ(x)重新表示。
也许一个例子会使这更直观,
考虑上面的循环数据集。有可能用下面的变换函数将数据点从不可分的二维空间映射到可分的三维空间,
利用前述的φ(x ),判别函数更新如下,
此外,可以示出的是, w 总是 x(或φ(x ),如果在变换空间中操作的话)的线性组合,
结果,为了确定 SVM 判定边界,需要确定以下更高维度的点积[1],
尽管解决了问题,但是这种方法具有更高数量的计算操作。有 3×2 个操作来转换到 3 维空间,另外还有 3 个操作来执行点积。另外,计算复杂度为 O(n)。
为了简化过程,降低计算复杂度和成本,存在被称为内核的函数。
内核将线性不可分的数据转换为线性可分的数据,而无需将数据转换到更高维的空间并计算点积。
因此,可以使用如下内核来解决前面的示例,
与前面的方法相比,核方法使用 2 次计算操作,计算复杂度为 O(n)。
以下是线性内核的示例,其他常见内核包括:
多项式内核
其中 c 和 d 表示多项式次数,由用户定义,以优化分类。
线性分类器有 c=0 和 d=1。
径向内核
其中 d 是多项式次数,γ定义所选支持向量的接*度。高伽玛值选择最*的支持向量,而低伽玛值选择更远的支持向量。
更多内核类型可以在这里找到。
[1] 内核和内核技巧:讲座(犹他大学)
原文:https://towardsdatascience.com/svms-random-forests-and-unbalanced-datasets-predicting-hotel-cancellations-2b983c2c5731?source=collection_archive---------17-----------------------
不*衡数据集是指类别之间的样本大小不相等,这会导致分类器的预测出现重大偏差。
来源:照片由 Antranias 从 Pixabay 拍摄。
在这个特定的例子中(可从下面的参考资料部分获得),支持向量机(SVM)分类模型用于根据取消风险对酒店预订客户进行分类,即如果模型预测客户将取消预订,则为 1 ,如果客户将坚持预订,则为 0 。
H1 数据集用于训练和验证模型,而来自结果模型的预测则使用 H2 数据进行测试。
在这个特定的数据集中,非抵消类(0)的样本大小明显大于抵消类(1)。在前面的例子中,这是通过删除大量的 0 条目来处理的,以便在两个类之间具有相等的样本大小。但是,这不一定是最佳方法,因为在此过程中会丢弃许多数据点。
相反,SVM 模型可以被修改,以惩罚对小类的错误预测。让我们看看这是如何影响分析的。
使用树外分类器和向前向后特征选择方法进行分析时,所识别的特征如下:
SVM 是一种监督学习模型,可用于分类和回归任务。
当定义两个类之间的决策限制时,SVM 模型提供了对每个训练点的重要性的评估。
来源:图片由作者创建
位于两个类别之间的决策边界上的少数训练点被称为支持向量。
当比较准确度分数时,我们看到在每个混淆矩阵中都提供了大量的读数。
然而,在精度和召回之间存在一个特别重要的区别。
这两个读数经常相互矛盾,也就是说,通常不可能在不降低召回率的情况下提高精确度,反之亦然。
对理想指标的评估很大程度上取决于所分析的具体数据。例如,癌症检测筛查出现假阴性(即表明患者没有患癌症,而事实上他们患有癌症)是一大禁忌。在这种情况下,召回是理想的衡量标准。
然而,对于电子邮件,人们可能更喜欢避免误报,例如,将一封重要的电子邮件发送到垃圾邮件文件夹,而实际上它是合法的。
f1 分数在设计一个更通用的分数时考虑了精确度和召回率。
哪个因素对预测酒店取消更重要?
从酒店的角度来看,他们可能希望更准确地识别出最终会取消预订的客户,这使得酒店能够更好地分配房间和资源。确定不打算取消预订的客户不一定会增加酒店分析的价值,因为酒店知道,无论如何,很大一部分客户最终都会坚持预订。
上面概述的相关特征包括在内,用于确定客户是否将取消他们的预订。
然后,数据被分为训练数据和验证数据:
可以将“*衡的”类别权重添加到 SVM 配置中,这对于次要类别(在这种情况下,取消类别)上的错误分类增加了更大的惩罚。
以下是该模型在验证集上的分类性能:
第一类的回忆率为 69%,而 f1 分数的准确率为 70%。现在,让我们在 H2(测试集)上测试预测性能。
我们看到,1 类的召回率现在达到了 75%,而 f1 分数的准确率达到了 63%。值得注意的是,我们可以看到测试集上的 f1 分数较低,但召回率现在高于验证集。
在这方面,如果假设在这种情况下假阳性比假阴性更可容忍,那么人们可以认为该模型在此基础上表现得相当好。
在这个例子中,我们看到了如何使用支持向量机来处理不*衡的数据集,以及如何解释混淆矩阵以提高分类的准确性。
您可以在这里找到原始文章,以及本例中所示的数据集和笔记本的相关存储库的链接。
免责声明:本文是在“原样”的基础上编写的,没有担保。本文旨在提供数据科学概念的概述,不应以任何方式解释为专业建议。
原文:https://towardsdatascience.com/swap-softmax-weighted-average-pooling-70977a69791b?source=collection_archive---------30-----------------------
布莱克伊利亚 是新英格兰复杂系统研究所 的研究员。肖恩·贾恩 是微软研究院 的一名 AI 常驻者。
我们的方法 softmax-加权*均池(SWAP)应用*均池,但是通过每个窗口的 soft max 对输入重新加权。
我们提出了一种卷积神经网络的池化方法,作为最大池化或*均池化的替代方法。我们的方法 softmax-加权*均池(SWAP)应用*均池,但是通过每个窗口的 soft max 对输入重新加权。虽然向前传递的值与最大池化的值几乎相同,但 SWAP 的向后传递具有这样的属性,即窗口中的所有元素都接收渐变更新,而不仅仅是最大值。我们假设这些更丰富、更精确的梯度可以改善学习动力。在这里,我们实例化这个想法,并在 CIFAR-10 数据集上研究学习行为。我们发现交换既不能让我们提高学习速度,也不能提高模型性能。
在观看来自 DeepMind / UCL 深度学习课程的詹姆斯·马腾斯关于优化的讲座时,我们注意到他的观点,即随着学习的进行,你必须降低学习速率或增加批量以确保收敛。这些技术中的任何一种都会导致对梯度的更精确的估计。这让我们开始思考精确梯度的必要性。另外,我们一直在深入研究反向传播如何为所有类型的层计算梯度。在进行卷积和池化的练习时,我们注意到最大池化仅计算相对于窗口中最大值的梯度。这丢弃了信息——我们如何才能做得更好?通过使用所有的信息,我们能得到一个更精确的梯度估计吗?
Max-pooling 丢弃了梯度信息——我们如何能做得更好?
最大池通常在视觉任务的 CNN 中用作下采样方法。例如,AlexNet 使用 3x3 Max-Pooling。【引用
在视觉应用中,max-pooling 将一个特征图作为输入,并输出一个较小的特征图。如果输入影像为 4x4,则步幅为 2(无重叠)的 2x2 最大池操作符将输出 2x2 要素地图。max-pooling 运算符的 2x2 内核在输入要素地图上有 2x2 个不重叠的“位置”。对于每个位置,选择 2x2 窗口中的最大值作为输出特征图中的值。其他值将被丢弃。
图 1:最大池化的结果。来源:斯坦福 CS231n(通过 quora )。
隐含的假设是“值越大越好”,即,值越大对最终输出越重要。这种建模决策是由我们的直觉推动的,尽管可能不是绝对正确的。[艾德。:也许其他价值观也很重要!在接**局的情况下,将梯度传播到第二大值可能会使其成为最大值。这可能会改变模型学习的轨迹。也更新第二大值,可能是更好的学习轨迹。]
你可能会想,这是可微的吗?毕竟,深度学习要求模型中的所有操作都是可微分的,以便计算梯度。在纯数学意义上,这不是一个可微的运算。实际上,在向后传递中,对应于最大值的所有位置简单地复制入站梯度;所有非最大值位置简单地将其梯度设置为零。PyTorch 将其实现为一个定制的 CUDA 内核(这个函数调用这个函数)。
换句话说,最大池生成稀疏梯度。而且很管用!从 AlexNet [ cite 到 ResNet [ cite 再到强化学习[citecite],应用广泛。
已经开发了许多变体;Average-Pooling 输出窗口中的*均值,而不是最大值。扩大的最大池使窗口不连续;相反,它使用类似棋盘的图案。
图 2:扩大的最大池。来源: arXiv (通过 StackOverflow )。
有争议的是,Geoff Hinton 不喜欢 Max-Pooling:
卷积神经网络中使用的池操作是一个很大的错误,它如此有效的事实是一场灾难。
如果池不重叠,池将丢失关于事物位置的有价值的信息。我们需要这些信息来检测物体各部分之间的精确关系。的确,如果这些池有足够的重叠,那么特征的位置将通过“粗略编码”得到精确的保留(参见我在 1986 年关于“分布式表示”的论文中对这种效果的解释)。但是我不再相信粗略编码是表示物体相对于观察者的姿态的最佳方式(我所说的姿态是指位置、方向和比例)。
【来源:Reddit 上的 Geoff Hinton。]
最大池生成稀疏梯度。有了更好的梯度估计,我们能否通过提高学习速率来迈出更大的步伐,从而更快地收敛?
稀疏渐变丢弃了太多信息。有了更好的梯度估计,我们能否通过提高学习速率来迈出更大的步伐,从而更快地收敛?
虽然由最大池生成的出站梯度是稀疏的,但是该操作通常用于 Conv →最大池操作链中。注意,可训练参数(即滤波器值,)都在 Conv 算子中。还要注意的是:
dL/dF = Conv(X,dL/dO) ,其中:
因此,卷积滤波器 F 中的所有位置都获得梯度。然而,这些梯度是从稀疏矩阵 dL/dO 而不是密集矩阵计算的。(稀疏程度取决于最大池窗口大小。)
向前:
向后:
图 3:最大池生成稀疏梯度。(作者图片)
还要注意的是, dL/dF 是而不是稀疏,因为 dL/dO 的每个稀疏条目都将一个渐变值发送回所有条目dL/dF。
但这就提出了一个问题。虽然 dL/dF 本身不是稀疏的,但是它的条目是基于稀疏输入的*均来计算的。如果它的输入(dL/dO—Max-Pool 的出站梯度)是密集的,那么 dL/dF 会是真实梯度的更好估计吗?我们如何使 dL/dO 密集,同时仍然保留 Max-Pool 的“值越大越好”假设?**
一种解决办法是*均分摊。在那里,所有的激活都向后传递一个梯度,而不仅仅是每个窗口中的最大值。但是,它违反了 MaxPool 的假设“值越大越好”。
输入 soft max-加权*均池(SWAP)。正向传递最好解释为伪代码:
average_pool(O,weights = soft max _ per _ window(O))
图 4: SWAP 产生一个与 max-pooling 几乎相同的值——但是将渐变传递回窗口中的所有条目。(作者图片)
softmax 运算符将值归一化为概率分布,但是,它更倾向于大值。这给了它一个类似最大池的效果。
在向后传递中, dL/dO 是密集的,因为中的每个出站激活都依赖于其窗口中的所有激活—而不仅仅是最大值。 O 中的非最大值现在接收相对较小但非零的渐变。答对了!
我们在 CIFAR10 上进行实验。我们的代码可在这里获得。我们将网络架构固定为:
我们测试了“池”层的三种不同变体:两个基线(最大池和*均池),以及交换。使用 SGD,LR=1e-3 对模型进行 100 个时期的训练(除非另有说明)。
我们还训练了 LR 增加{25,50,400}%的 SWAP。这是为了测试这样一个想法,使用更精确的梯度,我们可以采取更大的步骤,而使用更大的步骤,模型会收敛得更快。
与两个基准相比,SWAP 的性能更差。我们不明白为什么会这样。LR 的增加没有带来任何好处;一般来说,随着 LR 的增加,观察到的性能比基线更差。我们将 LR 性能提高 400%比提高 50%归因于随机性;我们只测试了一个随机种子,并且只报道了一个试验。对于 400%的增长表现更好的另一个可能的解释是,用更高的 LR“覆盖更多的地面”的能力。
LR 的增加没有带来任何好处;一般来说,随着 LR 的增加,观察到的性能比基线更差。
虽然 SWAP 没有显示出改进,但我们仍然想尝试几个实验:
提高梯度精度仍然是一个令人兴奋的领域。我们还能如何修改模型或梯度计算来提高梯度精度?
原文:https://towardsdatascience.com/swarm-intelligence-swarm-based-dimensionality-reduction-dfb3cdc55259?source=collection_archive---------24-----------------------
一群椋鸟——由詹姆斯·温斯科特在 Unsplash 上拍摄
Ab——一种基于群体的降维方法,受群体智能(SI)和主成分分析(PCA)的启发。它使用粒子群优化(PSO)的矢量化实现,以提高计算效率。该模型以标准 PCA 为基准。
这些年来,技术发生了巨大的变化,随着个人和企业越来越能够访问更高的处理和计算能力、更大的内存容量、更智能和更高效的数据存储技术等等,无论是在内部还是在云中,技术访问差距都在逐年缩小。尽管如此,数据量仍呈指数级增长,预计这一趋势在可预见的未来还将继续。因此,降低海量数据集的维度是创建更有效的机器学习模型的最重要的方面之一。
目标是产生一个具有较低维度的新数据集,而不丢失其原始特征。与 PCA 一样,我们将使用协方差矩阵来确定方差和协方差。
考虑一个由 N 个特征和 M 个观察值组成的数据集。可以描述为一系列的 N 维向量,表示为一个 MN* 矩阵。
其中 i ∈ {0,…,M} 和 j ∈ {0,…,N} 。X 的协方差矩阵是通过从数据中减去*均值并乘以其转置,然后除以样本数而获得的。这是至关重要的,以便不同尺度的特征被同等地解释。它由下式给出:
如果已经扣除了特征的*均值,协方差矩阵可以写成:
请注意,您可能会遇到略有不同的符号版本 C_x ,特别是我们使用行向量来表示数据,而大多数引用将数据表示为列向量,这允许点积元素。尽管如此,使用这两种方法都会得到相同的结果。
我们对协方差矩阵感兴趣的原因是,它描述了数据集内的方差以及元素间的协方差。视觉上,主对角线元素保存方差,而协方差信息跨越非对角线元素。例如,给定一个具有标记为 {x,y,z} 的特征的三维数据集,我们得到以下表示:
PCA 的目的是找到一个线性变换,给定 X ,生成一个低维数据集 Y 。最终,我们会寻找另一个与原始基线性相关的基,它可以更有效地表示数据。这可以表示为:
其中 P 是线性变换矩阵。考虑到这一点,主成分分析设定了转换数据的两个主要目标,即:
在实践中,我们需要优化线性变换 P ,以便产生的数据集 Y 在强调数据信号和抑制噪声或冗余信号方面更有效地表示数据。为此,我们需要最大化主对角元素,最小化对应协方差矩阵 C_y 的非对角元素。
现在很清楚,这是一个最大化/最小化问题,非常适合优化算法,其中包括群体智能模型,我们将使用该模型将低维数据集 Y 拟合到最佳协方差矩阵 C_y 。
我们将在这里使用与前面描述的相似的符号,稍作修改以适应基于群体和矢量化的计算。我们为低维数据定义了以下符号:
其中 X 是一批 Np 输入,每个输入的尺寸为 MN* ,如前所述。
我们将 Y 定义为一批 Np 输出,其中每个输出的维数为 MK,其中 K∈ R 和 K < N ,以及 P 一批维数为 NK 的 Np 变换矩阵。变换矩阵的集合是要被训练并适合解的粒子。
遵循这种模式,并参考 C_y 定义,我们得出结论,矢量化协方差矩阵 C_y 将具有维度 NpKK 。
健身功能
适应度函数必须反映我们数据集的准确性,尽可能多地保留原始数据特征,并消除冗余或有噪声的数据。我们将提出两种适合度评估的方法,其中一种来自文献,而另一种已被证明在 Iris 数据集上优于它,因此将被使用。
我们可以将适应度定义为信噪比(SNR) [1]:
其中 σ_signal 表示方差, σ_noise 表示协方差。高 SNR (≫ 1)表示高精度数据,而低 SNR 表示受噪声污染的数据。请注意,本文中的适应度是一个真正的正数 SNR≥0 ,而不是一个百分比或有界数字。为确保信号最大化(方差→+∞)且噪声抵消(协方差→0),我们将 SNR 定义为:
通过使用上面的 SNR 定义作为我们的适应度函数,该模型将惩罚低方差和高协方差。我们使用对数标度来获得更好的适应性解释能力。
在 Iris 数据集预测上胜过 SNR 度量的另一种方法是通过将适应度函数视为方差和协方差的加权和:
其中 α_1 和 α_2 是控制各项贡献的加权系数。例如,为了进一步优化惩罚低方差,您可以使用 α_1=5 和 α_2=1 。
粒子运动
一旦评估了适应度,粒子被移动以扫描更好的解决方案,即实现更高适应度分数的解决方案。粒子运动由以下方程控制,该方程将粒子向其个人最佳值 p 和全局最佳值 g 的方向移动。
其中 v[i] 代表第 np 个 NK 个维质点在 i 时段的速度,其中NP∈{ 0;Np}* , v[i-1] 前一历元中的速度,R1和*R2Np**N * K*-均匀分布随机数的维矩阵,以及最后 ω 控制前一速度对新速度的贡献的加权系数。
上面执行了 Np 粒子速度的矢量化计算。之后,我们在知道每个粒子的速度的情况下计算粒子的新值:
一旦粒子被移动,我们可以重新评估适应值,并更新个人最佳值和全局最佳值。这要重复几次,直到满足终止标准。最终的全局最佳解决方案是最佳转换矩阵,在此基础上我们可以检索原始数据集 X 的低维表示 Y 。
我们将通过数据表达能力来评估模型。低维数据集的可表达性将根据加权方差和协方差总和来测量,但也可以根据前面描述的信噪比来测量。
在 Iris 数据集上进行的 1000 次 SBDR 运行的样本测试,每次有 100 个时期和 40 个粒子,获得了 5.87 的*均适应度得分,而标准 PCA 获得了 1.96 的适应度得分。下图显示了 SBDR 的表现,以适应度得分表示,并与标准 PCA 并列显示。
此外,生成的数据集用于在该数据集上训练随机森林模型,并在测试集上进行预测。标准 PCA 实现了 80%的预测准确度,而 SBDR 在 1000 次运行中实现了 86.5%的*均准确度。
如果你能走到这一步,谢谢你留下来!
[1] J. Shlens,2014,《主成分分析教程》
[2] J .肯尼迪,r .埃伯哈特,1995,“粒子群优化”
原文:https://towardsdatascience.com/sweeping-towards-better-coronavirus-forecasting-cce3b5d9a6f9?source=collection_archive---------55-----------------------
从 5 月 9 日开始,我们的一个模型在纽约市布朗克斯县的投影图像。实际案例显示为橙色,我们模型的预测显示为蓝色。你可以看到我们的模型准确地预测了总体下降轨迹,但是仍然没有捕捉到所有的日常噪音。
编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
随着新冠肺炎席卷全球,人们(尤其是美国人)急于重返工作岗位,我们现在比以往任何时候都更需要模型来有效预测新冠肺炎的传播。然而,目前许多模型在估计疾病传播和社会距离的整体影响方面表现不佳。在这篇文章中,我将回顾为什么疾病预测模型是有用的,当前模型采用的方法的问题/限制,以及使用深度学习方法的好处和障碍。
在讨论当前新冠肺炎预测模型的问题之前,让我们来看看它们为什么有用:
(1)一个好的模型应该有效地告知当选官员和决策者冠状病毒及其对其社区的影响。具体而言,该模型不仅应该提供预测,还应该提供可操作的见解,说明不同的政府政策将如何影响新增病例和死亡人数,以及病毒将如何给医院带来负担。与理想情况相反,该模型还应基于观察值运行。这是一个数据驱动的方法,而不是纯粹的数学方法,有意义的领域。例如,一个将社会距离政策作为输入,然后基于公民遵守该政策假设某种结果的模型,在现实中可能不会表现得很好。相反,模型需要了解政府社交距离政策的因果影响,首先,它们与移动数据的关系,其次,实际的病毒传播。
(2)另一个问题与特定地区的预测有关。虽然在国家层面预测病例和死亡的模型在广泛估计所需的个人防护设备和呼吸机数量方面有一定的效用,但它们没有太多进一步的用途。美国有许多不同的州,每个州都有不同的人口、资源和气候。在某些情况下,即使是州一级的预测也可能过于宽泛。例如,病毒在纽约市的传播方式可能与它在北部各县的传播方式非常不同。同样,病毒在芝加哥的传播方式可能与在卡本代尔的传播方式不同。县或市/镇一级的预报为地方官员提供了最大的价值。这些预测使城市/城镇能够仅根据其风险来计划应对措施。这有可能使更多的领域开放。例如,如果模型预测某个城市/城镇的风险较高,但该州另一边的另一个地区的风险较低,那么关闭后者但允许前者保持开放就没有什么意义了(当然,您也希望确保这些地区之间没有太多的旅行)。
(3)理想情况下,模型还可以预测特定县的入院人数,甚至更好地预测特定城市/城镇每天的入院人数。这将使医院能够规划人员配备、应急响应人员,并以最佳方式获得 PPE。特别是,如果模型提前一两周预测到高峰,那么医院有足够的时间准备应对。此外,预测 ICU 床位利用率对于及时建造野战医院至关重要。
(4)最后,好的模型可以潜在地突出各种促进进一步研究的传输机制。例如,假设说,如果一个模型发现紫外线是传播的一个主要因素,这可能会促进额外的流行病学研究。当然,对于这一点,我们必须非常小心,模型不仅仅是学习噪声。然而,机器学习确实有潜力在寻找包括病毒学在内的各种研究领域的新研究方向方面发挥核心作用。
当前大多数型号的困难
Nate Silver 在文章“为什么做一个好的新冠肺炎模式如此困难”中列举了新冠肺炎建模的许多困难。然而,这些困难中的许多来自于试图构建精确的数学/统计公式来预测新冠肺炎。Silver 讨论了使用无症状率和感染率等变量。这是有问题的,因为在经典 SEIR 模型中,我们必须为这些参数假定某些值。此外,像 IMHE 这样的模型,例如,主要依赖于曲线拟合。CurveFit 利用各种各样的变量提供给模型。首先,IMHE 利用样条曲线来拟合新冠肺炎曲线,然后依靠一些额外的调整来拟合数据。对于那些不知道的人来说,样条是一个数学多项式公式,用于绘制*滑曲线。这种方法仍然需要大量的手动参数和特征。四月份的一篇 VOX 文章指出了与 IMHE 模型相关的许多问题。具体来说,本文讨论了模型的置信区间的变化和更新预测的问题。例如,VOX 指出“该模型假设死亡人数会增加,然后又会下降;“虽然从广义上讲这可能是真的,但在日常层面进行预测时,报告中会有很多噪音和差异。第二,有许多不同的因素可以阻止真实数据有这样的轨迹。模型必须足够稳健,以确定噪声,从而不做一般假设。
其他模型,如日内瓦大学、加州理工学院、麻省理工学院、MOBS 大学、加州大学洛杉矶分校、弗吉尼亚大学和德克萨斯大学,在进行预测时,假设社会距离将继续以目前的形式存在。随着限制的放松,他们的数量可能会因此发生巨大变化。最后,大量模型仅在州和国家层面进行预测。这是深度学习最具潜力的领域,因为它能够学习输入特征之间的许多复杂交互,如季节性、社交距离和地理位置。此外,通过足够的数据扩充技术和迁移学习,该模型应该能够处理分布的变化,如社会距离的结束。然而,正如我们将在下面讨论的那样,使用深度学习来预测新冠肺炎仍然存在许多障碍。
我们的目标是整合深度学习的最新研究,用于时间序列预测,以解决这些问题。尽管许多人对流行病学中的深度学习保持警惕,但使用它有许多优势。例如,与纯统计模型不同,深度学习模型从现有的实际数据中学习。深度学习模型也有可能更好地整合所有复杂的变量,如天气和症状调查。然而,深度学习方法仍然存在许多挑战。使用深度学习最明显的最初挑战围绕着训练数据的缺乏:目前我们仍然只有 110 个时间步骤,对于许多美国县来说。此外,对于大多数县/州,我们有不到 90 个时间步长。另一个问题是时间步骤的不*衡,没有新病例。对于移动性,在疫情开始之前,我们几乎没有数据可以提供给模型。因此,利用迁移学习和数据扩充是取得良好结果的关键。
在 CoronaWhy 做志愿者并组建跨学科团队
我们的团队是 CoronaWhy 唯一专注于时间序列预测的团队。CoronaWhy 是一个由 900 多名志愿者组成的全球组织,致力于应用机器学习来更好地了解冠状病毒。大多数其他团队专注于白宫挑战 和利用 NLP 。我们的团队成立于 3 月初,旨在分析与冠状病毒相关的时间数据。从那时起,我们已经吸纳了来自世界各地的 30 多名成员。除了病毒传播预测,我们还有其他计划,如预测医院中的患者预后(不幸的是,由于缺乏 ICU 数据,这一计划受阻)。我们的团队与其他 CoronaWhy 团队密切合作,如 datasets 和 task-geo。
由于我们是一个全球性的志愿者团队,因此很难安排会议,因为我们在世界各地的成员也忙于他们的日常工作。出于这个原因,我们总是记录我们的会议,以便那些无法参加的人可以回放。此外,我们会在一整天的空闲时间积极沟通。虽然分散存在挑战,但也有一些优势。例如,当一些团队成员在睡觉时,其他人可以积极地工作并为项目做出贡献。我们在特雷罗董事会上管理所有问题,并尝试每周计划我们的工作。
对于像 COVID 这样的问题,拥有一个真正的跨学科团队至关重要。这就是为什么从一开始,我们的目标是搭载领域专家。到目前为止,我们有一位流行病学家和一位生物信息学家定期为这个项目做出贡献。拥有领域专家让我们能够以只有机器学习成员的团队无法做到的方式专注于我们的研究。例如,这些专家可以帮助我们了解这种疾病在生物层面上是如何传播的。同样,拥有各种各样的机器学习专家可以启发对模型的讨论。我们有来自更传统的统计背景的个人,NLP 研究人员,计算机视觉专家,和软件工程师。正如我们将在后面讨论的,计算机视觉和 NLP 的许多技术也可以直接应用于时间序列预测。
用于时间序列预测的元学习/迁移学习
如上所述,在这种情况下,有限的数据是有效利用机器学习的主要障碍之一。通常在这种情况下,我们会求助于已被证实的少量学习技巧。然而,尽管迁移学习在 NLP 和计算机视觉中取得了广泛的成功,但很少有文献研究它在时间序列预测中的效用。 TimeNet 使用预训练的 RNN 进行了测试,发现它提高了临床时间序列预测数据集的性能。然而,除了 TimeNet,只有少数论文研究了这个问题。拉普捷夫,于等。艾尔。,描述使用重建损失来帮助迁移学习。除了翻译研究之外,一些论文还探讨了其他方法。一篇题为“从多个城市学习:元学习方法”的论文着眼于美国各个城市的元学习出租车和自行车模式。在时间序列预测方面,我们可以考虑利用 NLP 和计算机视觉中的许多其他技术。采用流行的算法,如爬行动物和计算机视觉的 MAML,是另一种可能的途径,可以导致整体更好的少数镜头时间序列预测方法。在我们的一些初始模型迭代中,我们确实在选定的县看到了一些积极的转移(例如纽约市和芝加哥似乎受益于预培训),但是我们没有严格评估这些结果。这为未来的研究留下了大量的空间。
垂直合并数据
可以对各种时间序列预测数据集进行迁移学习。然而,最相似的数据可能导致最积极的转移。因此,我们正在努力从类似的流行病和病毒中收集数据。从 SARs、MERs 和 Zika 等疫情中收集数据可以帮助模型学习。我们也在研究更通用的迁移学习技术。我们还旨在回答几个关键问题:例如,通过通用嵌入层,风能/太阳能数据的预训练能否提高性能?有没有可以从任何时间数据中找到的一般地理空间模式?我们的思维过程是,即使数据完全不相关,它也可以作为迁移学习的有效方法,因为它可以帮助初始层有效地提取时间模式。另一种可能更有效的转移方法是在每个县、州和国家反复训练。这些只是我们垂直整合的数据类型的一些例子。当然,自相矛盾的是,疫情持续的时间越长,我们的模型就应该变得越好。这就是为什么我们正与基础设施和工程团队合作,随着更多数据的可用,创建一个持续改进/重新训练模型的框架。
对库克县四月份为期十天的迁移学习的预测。MSE 26515.275
未进行县调学习的同期预测。最终 MSE 30200.779(MSE 越低越好)。虽然转移似乎有助于这种情况下,我们没有进行严格的*衡研究,所以它可能是由于其他原因。此外,值得注意的是,在某些情况下,确诊病例数量的激增可能是由于报告延迟,而不是实际病例数量减少。因此,直接拟合数据的效用是另一个讨论的话题。
横向合并数据
我们正在横向集成各种各样的数据源。或许最重要的是,我们正在考虑整合来自谷歌、脸书和其他提供商的移动数据。我们还增加了天气数据,如湿度、温度、紫外线和风。我们仔细监控模型中的每一项添加对整体性能的影响。例如,我们从以前的案例和星期几变量开始。现在,我们正在整合移动数据和天气数据。接下来,我们将考虑纳入一个县的医院数量、到医院的*均距离、*均年龄、人口密度、总人口等人口统计数据。,以更好地预测录取和 COVID 传播。我们也在寻找增加来自 FB 和其他数据源的患者调查的方法。此外,更先进的地理空间数据可能证明是有价值的。
最初,当我们添加关于移动性的数据时,我们注意到与之前的新案例相比,性能有所下降。只有当我们扩展 forecast_history 时,性能才似乎有所提高。这可能是由于新冠肺炎的潜伏期较长。
接受移动数据+新案例培训的模特 Emilia Italy。这里我们注意到模型需要更长的预测历史来准确预测未来的情况。这与我们通常认为病毒在患者出现症状前需要几天时间的理解是一致的。特别是,我们发现 10 天或 11 天的回看窗口似乎可以为我们提供移动性数据的一些最佳结果。然而,我们也可以尝试探索更长的范围(15 天以上)
数据增强
有几种方法可以生成时间序列数据。TSAug 是一个提供不同方法来扩充 TS 数据的库。在 TSAug 中创建合成数据的一种简单方法是使用裁剪和漂移。还存在其他库和技术,如用于创建合成时间序列数据的 GANs。另一种可能增加数据的方法是创建更多的地理位置。例如,我们可以将邻*的县相加。这将具有为模型提供更多训练数据点的效果。
混合动力车型
有一些潜在的混合方法值得探索。例如,我们可以将深度学习与 SEIR 模型或上面提到的曲线拟合方法相结合。混合动力车型很有吸引力;例如,在“M5 预测竞赛”中获胜的模型使用了 RNN 和指数*滑的组合。此外,前面提到的谷友洋模型是一种混合 SEIR/ML 方法。
为有效转移创建模型
对时间序列数据使用迁移学习的部分困难在于缺乏统一的维度。不同的多元时间序列数据可能不包含所有相同的特征。寨卡数据包含感染信息,但没有相同的伴随移动数据。SARs 和 MERs 是最相似的病毒,但是官员们没有对它们进行广泛的追踪。因此,我们的模型需要处理可变数量的“特征”时间序列。处理这个问题的一个方法是实际交换“上层”在大多数迁移学习任务中,我们通常交换较低的层。然而,如果我们想要将多元时间序列数据映射到一个公共的嵌入维度,这里我们至少需要一个可交换的“上层”。
超参数
我们方法的另一个“缺点”是参数数量太多。因此,我们利用参数扫描来帮助我们搜索最有效的组合。为此,我们使用 Wandb 扫描工具,并可视化结果/参数重要性:
使用变压器模型时的参数扫描;在这里,我们查看编码器层数和 sequence_len 等参数如何影响整体 MSE。
安特卫普参数重要性图表示例。绿色表示较大的值导致较高的 MSE 损失(坏),而红色表示较大的值导致较低的 MSE 损失。
交代
将深度学习用于 COVID 的另一个障碍与解释和解释研究结果有关。许多统计模型因缺乏透明度而招致负面报道。这个问题可能会因 DL 模型而恶化,因为它有着充当黑箱的负面名声。然而,这个问题有潜在的补救措施,尤其是在使用变压器和其他变体时。例如,我们可以很容易地用变形金刚查看热图中模型的特征。类似地,各种方法,如利用卷积热图或交叉维度关注输入特征,可以帮助我们理解模型是如何学习的。最后,利用贝叶斯学习等方法可以帮助模型衡量自身的不确定性并生成区间。我们最*成功地将置信区间添加到我们的模型输出中,并计划将它们包含在所有未来的结果中。
评测
即使有各种各样的数据可用,评估一个模型也是复杂的。不幸的是,对于 COVID,我们的时态数据非常有限。因此,评估最多限于 40 个左右的时间步。最初,我们仅在 4 月份的一周时间内评估模型,但是我们很快发现我们的超参数搜索超过了一周的测试集。因此,我们最*在 5 月份将评估时间延长至两周。然而,这仍然有过度适应的可能。我们目前计划添加代码来自动评估测试集中每两周的排列。虽然不完美,但这确实提供了更多的评估数据点,并减少了仅将超参数调整到一个两周周期的机会。随着越来越多的数据在更大范围的季节、疫情的阶段和地点变得可用,我们希望开发出更强大的评估方法,包括在滚动的基础上评估数据。
选择合适的评估指标是另一个困难的决定。在我们的例子中,现在我们使用均方差(MSE)。然而,MSE 确实有一个基本问题,即它不是规模不可知的。因此,虽然比较特定县的模型很容易,但跨县的模型并不好。这就是标准化 MSE 或*均绝对百分比误差等指标发挥作用的地方。此外,*均绝对*方误差或 MASE 可能是另一种选择。
工作流程
从技术角度来看,我们如何训练和评估模型与权重和偏见密切相关。我们使用权重和偏差来有效地跟踪我们所有的实验。其次,Wandb 用于记录模型的各种性能结果,并在发布时将其导出到 Latex。我们还使用其他技术,如协同实验室、人工智能笔记本(当需要更多计算能力时)、GCS 以及 Travis-CI。然而,我们所有的关键代码都存储在一个中央存储库中,并通过单元测试进行跟踪。我们只使用笔记本来定义配置文件和从中央存储库导入功能/模型。然后将这些配置文件记录到 W&B,供以后分析。砝码和自动 UUID 一起自动存储在 GC 上,以识别它们的配置文件/结果。用于创建我们的组合数据集(即移动数据、新病例、天气、症状调查等)的代码。)存储在我们的存储库中。目前,这个代码必须手动运行,但我们正在努力建立数据管道与工具,如气流运行在日常基础上。我们正在积极努力的另一个领域是与我们的数据集团队一起改进整体数据架构。具体来说,我们正在考虑如何在成本方面最好地利用我们的资源,并使我们的架构能够在任何云环境中工作。
一个我们用来预测冠状病毒的配置的例子。您可以在这里看到,我们包括了各种各样的参数。这些参数中的一些权重和偏差在其扫描中进行优化,而一些是静态的。排除的层是不在原始配置文件中的层
更完整的例子请见这一要点
透明度
不像其他项目有封闭的源代码模型和/或不解释他们的决定,我们致力于尽可能的透明。我们的大部分代码都是开源的,在 GitHub 上(我们计划在接下来的几周内开源更多的部分)。我们所有的会议和讨论都发布在我们的 GitHub 页面上,因此任何人都可以观看。关于数据,大多数数据来源都是公开的,并将定期上传(仍在最后确定中)到 Dataverse。不幸的是,由于患者隐私,我们的一些数据必须保持隐私,但我们确实计划彻底概述人们如何申请访问这些数据源。此外,我们所有的结果都被记录到关于权重和偏差的公共项目中,这样任何人都可以分析我们所有的实验结果。无论背景或专业知识如何,来自外部社区的反馈总是受欢迎的。
深度学习有可能帮助创建更好的 COVID 预测模型,进而帮助公共政策规划。然而,有效使用 COVID 数据仍然存在许多障碍。这就是为什么我们目前正在加大努力,利用机器学习领域的前沿技术来克服这些挑战。如果你有兴趣志愿参加这项任务,请直接联系我或 CoronaWhy。我们对获得更多病毒学和流行病学领域的专家和合作者特别感兴趣。我们还希望获得更多的公共政策专家来思考我们的模型如何产生最积极的影响。最后,一如既往,我们继续寻找迁移学习、元学习、时间序列预测和数据工程方面的专家来充实我们的团队。
更多资源
除了上面列出的资源,您还可以在其他地方找到关于我们项目和其他工作的信息:
CoronaWhy
谈时间序列预测的注意事项
IMHE 模式
酉阳谷模式分析
游阳谷模型
洛斯阿拉莫斯模型
内特·西尔弗关于我们前进方向的博客文章(5 月 1 日发表)
疾控中心官方预测网站
原文:https://towardsdatascience.com/sweetviz-automated-eda-in-python-a97e4cabacde?source=collection_archive---------5-----------------------
探索性数据分析是一个过程,在这个过程中,我们往往使用可视化方法来分析数据集并总结数据集的主要特征。EDA 真的很重要,因为如果你不熟悉你正在处理的数据集,那么你将无法从这些数据中推断出一些东西。但是,EDA 一般需要很多时间。
但是,如果我告诉你 python 可以在一些库的帮助下自动化 EDA 的过程呢?不会让你的工作更轻松吗?那么让我们开始学习自动化 EDA 吧。
在本文中,我们将使用 Sweetviz 致力于自动化 EDA。它是一个 python 库,可以生成漂亮、高密度的可视化效果来启动您的 EDA。让我们详细探索一下 Sweetviz。
像任何其他 python 库一样,我们可以使用下面给出的 pip install 命令来安装 Sweetviz。
在本文中,我使用了一个包含 4 个属性和 200 行的广告数据集。首先,我们需要加载正在使用的熊猫。
广告数据集。
Sweetviz 有一个名为 Analyze()的函数,它分析整个数据集并提供详细的可视化报告。
让我们使用下面给出的命令来分析我们的数据集。
EDA 报告
我们开始了,正如您在上面看到的,我们的 EDA 报告已经准备好,包含了所有属性的大量信息。它很容易理解,只用 3 行代码就准备好了。
除此之外,Sweetviz 还可用于可视化测试和训练数据的比较。为了进行比较,让我们将此数据分为两部分,前 100 行用于训练数据集,其余 100 行用于测试数据集。
Sweetviz 的 Compare()函数用于数据集的比较。下面给出的命令将创建和比较我们的测试和训练数据集。
使用 sweetviz 进行对比分析
除此之外,Sweetviz 还提供了更多功能,您可以通过 进行操作。
你觉得这个漂亮的图书馆怎么样?继续尝试,并在回复部分提及你的经历。
还有其他一些自动化 EDA 过程的库,其中之一是 Pandas Profiling,我在下面的一篇文章中已经解释过了。
[## 使用 Faker 创建数据集并将其用于熊猫概况分析
towardsdatascience.com](/creating-dataset-using-faker-and-use-it-for-pandas-profiling-6fe26e1b9557) [## 逐步了解数据分析
towardsdatascience.com](/understanding-data-analysis-step-by-step-48e604cb882)
感谢 的阅读!如果你想与我取得联系,请随时通过 hmix13@gmail.com 联系我或我的 LinkedIn 个人资料 。 您也可以在我的**Github中查看我在这里使用的代码和数据。
原文:https://towardsdatascience.com/swift-meets-photos-framework-and-coreml-tech-details-behind-a-smart-tidying-up-app-38e1d4b9e842?source=collection_archive---------41-----------------------
卡尔·帕夫洛维奇在 Unsplash 的照片
在上一篇文章中,我分享了我的应用程序的产品创意,它使用智能建议来帮助整理手机上的照片,紧密基于KonMarie组织策略。
在这一部分,我分享了一些我开始 iOS 开发之旅的技术笔记和思考,重点是 AI/ML 和图像技术。我还讨论了在设备上构建个性化的 ML 模型。希望它能为未来的企业家或开始应用程序开发的人提供一些实用的技巧。
来源:Mindfire Solutions 的 Swift 发展
我是带着这个项目开始第一次学习 Swift 的。接触一些类似的编程语言确实大大加快了我的学习过程。
我对 Swift 的主要看法是:
就我个人而言,斯威夫特给人的感觉是一个聪明、老练的角色,这需要时间来熟悉,不像 Python 或 Ruby 那样友好、务实。
大多数时候,VS 代码是我首选的 ide。然而,对于 iOS 开发,我认为使用 Xcode 是更合适的选择。
Xcode 有助于调试、分析、运行模拟、所见即所得编辑器、管理构建和发布应用程序。它对于检查和管理 CoreML 格式的 ML 模型也很有用。它与 Xcode 服务器集成,用于 CI/CD 管道。
总的来说,良好集成的工具的重要性胜过其他问题,这让我免去了在多种工具之间切换的麻烦。
我很兴奋地用我的 iPhone 尝试一些神奇的照片。我对此并不失望,因为苹果确实提供了很好的库支持,用照片框架来处理图像。
最重要的是,使用照片框架确保了 iOS 用户一致且熟悉的 UX。例如,删除的照片将在“最*删除的”照片中保留 30 天,与通过默认相册应用程序删除的行为相同。
照片框架是现代和成熟的。作为另一个例子,它负责对共享照片资源的同步共享访问。这对于保持用户相册的一致状态非常重要,因为可能会有许多应用程序同时访问它们。下面是几行代码的例子。
照片框架也很好地支持缓存。我错误地了解了这件事。在最初的几次尝试中,如果没有缓存,渲染速度会非常慢。无论图像是来自 web 服务器还是本地存储,渲染大量照片(每张照片的大小都有几兆字节)都是一个很大的瓶颈。
就清理照片而言,浏览图像是一个核心功能,我希望它是正确的。
在这里,懒惰装载来拯救。Photos 框架支持预取,它可以在用户滚动时预测并缓存传入的图像,并适当地使缓存失效。可以按照下面的代码片段来完成。
结果是更流畅的渲染体验。
人工智能/人工智能技术正在迅速成为移动世界的一种规范,尤其是在 iOS 生态系统中。神经引擎(基本上是神经网络的加速硬件,像 Edge TPU)现在默认内置于最新的 iPhones 中。每个单元每秒能够执行万亿次矩阵运算,而不会损害手机的电池或计算资源。
Core ML 提供了一系列选项来将 ML 模型集成到 iOS 应用程序中,从面向消费者的“拖放”方式使用 CreateML 来训练 ML,到使用 Swift 的脚本方法(完全可定制)来训练定制的 ML 模型。
在下面的例子中,我正在制作一个模型来识别照片中的主体。基于这些信息,应用程序可以了解应该推荐保留什么。
CoreML 提供了许多现成的模型。mlmodel 格式。有用于图像识别、语音、声音和文本识别的 dnn。还有一些转换器可以将其他 DNN 模型格式(如 Tensorflow 或 tf-lite)转换成 CoreML 格式。
预先构建的模型,如 MobileNetV2、YOLO 或 SqueezeNet,针对移动推理进行了量化,并针对小型移动设备的使用进行了优化。它们可以按原样使用,也可以在分类/预测层进行微调,以用于后续的任务。
在检测照片中的主题的例子中,MobileV2 Net 可以通过几行代码来使用
Xcode 提供了方便的集成工具来检查模型的层,理解它的元数据,或者探测它的预测结果来动态地检测模型。
使用 MobileNet ML 模型识别的主题示例。有些模糊的照片无法分类或接*决策边界。
iOS 支持设备上的在线分布式培训,这使得为的每个用户建立真正个性化的 ML 成为可能。
(为了澄清,在某种意义上,正常的 ML 模型也可以被认为是个性化的,因为它们是用长尾数据训练的,并且在推理时,它们基于个人用户输入进行预测。然而,底层模型仍然在用户之间共享。这一特性不仅如此,还使得在每个设备上定制一个模型成为可能。
考虑这样一个场景,我想要一个 ML 模型来建议(二元决策)是否保留一个图像。理想情况下,该应用通过持续使用收集用户通常保留哪些照片的反馈。它是相关反馈的一种形式。
例如,如果我是一名敏捷教练,我可能想保存更多的便利贴照片,或者,如果我是一名家长,我可能想保存更多的孩子照片。
基于我的设备上的这种特定数据(这捕获了我的偏好),CoreML 可以通过 MLUpdate 任务更新“通用”模型。所得到的重新训练的模型可以被保存在设备上,换句话说,每个用户将拥有他们自己的个性化 ML。下面是一个代码示例:
这篇文章没有详细讨论 CoreML 的实现,我将在另一篇文章中讨论。我希望分享更多关于不同 CoreML 模型的优缺点,Core ML 从训练、微调到推理和监控的生命周期。
虽然 CoreML 是构建智能建议的一个强大选项,但有时,非 ML 替代方案也足够了。有时候,关注问题(不管是什么能解决问题)比关注解决方案更好。
就清理而言,我认为以下问题最适合应用 ML:
另一方面,还有其他一些唾手可得的功能,这些功能易于实现,对日常用户同样有效:
这是一个 ML 解决方案听起来很诱人的例子,但是有一个更简单的算法也可以完成这项工作,而且更快,更容易实现和测试。
这个想法很简单——将图像转换成哈希——相似的图像应该产生相似的哈希数,这样就可以比较接*程度。汉明距离就是为此而存在的。一些散列算法(查看相邻像素中的差异)是合适的。
资料来源:pyimagesearch.com
我利用的另一个东西是视觉框架,它内置了人脸检测功能,可以异步请求。它像用于 FaceID 一样工作稳定,并且很容易解决人脸识别的问题。下面是照片中人脸识别的一些例子的截图。
人脸识别示例
事后看来,拥有有效且准确的 ML 模型是很好的,但这不是我面临的最困难的挑战,也不是最有影响力的挑战。最大的问题是如何以有用、有价值和直观的方式将这些模型集成到应用程序中。
许多前端开发人员已经证实了处理异步事件和非阻塞 I/O 的重要性。Swift 提供了充分的支持,如 DispatchQueue /后台队列,以处理从用户交互到 ML 推理请求的事件,同时保持应用程序*稳运行。
随着时间的推移,代码库只会变得更加复杂和混乱。我发现对组织原则进行一些思考是很重要的,以确保项目可以持续迭代。
一些有用的提示包括:
为了成功启动 iOS 开发热潮,经过思考,我发现最重要的事情是:
这就是我的博客。我期待着在接下来的帖子中分享更多关于 CoreML、产品和设计思维的内容,这些都是我在应用开发中的经验。
原文:https://towardsdatascience.com/swish-booting-relu-from-the-activation-function-throne-78f87e5ab6eb?source=collection_archive---------10-----------------------
未修改的来源,图片免费分享。
答激活函数长期以来一直是神经网络的兴趣焦点——它们反复归纳输入,是神经网络成功的关键。长期以来,ReLU 一直被默认为深度学习社区中最好的激活函数,但现在有一个新的激活函数——Swish——来夺取这一宝座。
激活函数有着悠久的历史。首先,选择 sigmoid 函数是因为它容易求导,范围在 0 到 1 之间,并且具有*滑的概率形状。tanh 函数也被认为是 sigmoid 函数的替代函数,适合于-1 和 1 之间的范围,但是这些经典的激活函数已经被 ReLU 代替。整流线性单元(ReLU)是目前最流行的激活函数,因为当 ReLU 函数的输入为正时,梯度可以流动。它的简单性和有效性推动了 ReLU 和分支方法,如漏 ReLU 和参数化 ReLU,超越了 sigmoid 和 tanh 单元。
各种激活函数图示。来源:Swish Paper。
Prajit Ramachandran、Barret Zoph 和 Quoc V. Le 在他们的论文中提出了一个新的激活函数(底部的链接),他们称之为 Swish。Swish 很简单——它是 sigmoid 函数的 x 倍。
论文作者的研究表明,简单地用 Swish 单元替换 ReLU 单元可以将 ImageNet 上的最佳分类精度提高 0.9%,对于 Mobile NASNet-A 和 Inception-ResNet-v2 分别提高 0.6%。
Swish 激活功能。上面画着德斯莫斯。
正式来说,Swish 激活功能是…
像 ReLU 一样,Swish 在下面是有界的(意味着当 x 接*负无穷大, y 接*某个常数值),但是在上面是无界的(意味着当 x 接*正无穷大, y 接*无穷大)。然而,与 ReLU 不同,Swish 是*滑的(它没有运动或顶点的突然变化):
来源
此外,Swish 是非单调的,这意味着在整个函数中并不总是有一个奇异且连续的正(或负)导数。(重申一下,Swish 函数在某些点上具有负导数,在其他点上具有正导数,而不是像 Softplus 或 Sigmoid 那样在所有点上都只有正导数。
Swish 函数的导数是…
Swish 的一阶和二阶导数,标绘:
来源:Swish paper
对于小于约 1.25 的输入,导数的大小小于 1。
对于激活函数来说,无界是可取的,因为它避免了在*零梯度期间的缓慢训练时间 sigmoid 或 tanh 等函数上下有界,因此网络需要仔细初始化,以保持在这些函数的限制范围内。
ReLU 函数是对 tanh 的改进,因为它是上界的——这个属性非常重要,以至于 ReLU 之后的每个成功的激活函数都是上界的。
由于强正则化,在下面有界可能是有利的-在负无穷大的极限中接*零的函数在正则化方面很好,因为大的负输入被丢弃。这在训练开始时很重要,因为大量的负面激活输入是常见的。
这些界限由 Softplus、ReLU 和 Swish 满足,但 Swish 的非单调性增加了输入的“表现力”并改善了梯度流。
输入,在通过 Swish 之前和之后。来源:Swish paper
此外,*滑度有助于优化和推广神经网络。在下面的输出景观中,显而易见的是,ReLU 的输出景观由于其不*滑的性质而显得尖锐和不和谐,而 Swish 网络景观则*滑得多。
来源:Swish paper
输出景观*滑度与误差景观直接相关。更*滑的误差空间更容易遍历和找到最小值,就像走在喜马拉雅山脉不和谐的高度范围内,而不是走在英国乡村*滑起伏的山丘上。
你更愿意走在哪个上面?左图像源、右图像源。
Swish 论文的作者将 Swish 与以下其他激活功能进行了比较:
下表显示了在 9 次实验中,Swish 比概述的基线激活功能执行得更好、相等或更差的次数。
表格数据:Swish 纸
作者发现,通过用 ReLU 单元代替 Swish 单元,当层数从 42 层增加时(当优化变得更加困难时),与 ReLU 相比有显著的改进。
来源:Swish paper
作者还发现,对于不同大小的批处理,Swish 的性能优于 ReLU。
作者针对以下基线激活功能测试了 Swish,结果如下:
实现 Swish 非常简单——大多数深度学习库应该支持 Swish…
…或者可以表示为 x 乘以 sigmoid 函数
下次你在训练深度神经网络的时候,试试 Swish 吧!
感谢阅读!如果你喜欢,也可以看看我的其他作品。
此处可找到 Swish paper。
原文:https://towardsdatascience.com/switching-career-to-data-science-in-your-30s-6122e51a18a3?source=collection_archive---------2-----------------------
罗斯·芬登在 Unsplash 上的照片
你已经到了职业生涯中的一个点,继续做同样的事情是没有意义的。也许你很无聊,没有挣到你应得的那么多,或者像我一样,根本就不喜欢你的工作。在职业混乱中,你偶然发现了数据科学,并注意到转行有巨大的机会。另外,你已经在 YouTube 上找到了一些数据科学家的编码教程。
然而,尽管网上有许多专家,但他们中的一些人可能已经开始了向数据科学的职业转型。可能更少的人在 40 多岁时从一个完全不相关的领域做出这样的改变。这表明你一直在看/读的东西可能不适用于你的现实。也就是说,你应该半信半疑地看那些视频。毕竟,你不想浪费你的宝贵时间。因此,在转行从事数据科学之前,我希望处于类似职业和生活阶段的人能告诉我以下三件事:
1-选择 Python,继续前进。
如果您已经做了功课,那么您应该知道基本上有两种编程语言最适合从事数据科学:R 和 Python。虽然 R 在统计学家和研究人员中使用,并且它可以用于数据科学,但是 Python 是迄今为止你最好的选择。
对于那些很少或没有编程背景的人来说,Python 是最容易理解的编程语言。由于其简化的语法,它非常容易学习,这使得与其他编程语言(如 Java)相比,它的编码速度更快。这是一个优势,因为 Python 允许那些业余程序员阅读你的代码并与你合作。因此,Python 可以提高生产力,加速你的职业转换。
Python 允许您直接从 web 上获取数据,这对于那些想要进行数据分析并产生见解或预测某些人类行为的人来说是完美的。数据收集将是无痛的,这意味着你可以按照自己的节奏在 GitHub 上建立自己的投资组合。更重要的是,大部分使用机器学习的数据处理和围绕人工智能的研究都是用 Python 语言开发的。这是因为 Python 提供了数百个库,例如用于神经网络的 TensorFlow 和用于处理数组、矩阵和高级数学函数的 NumPy 。
不要纠结于需要学习哪种编程语言。这个决定可以为你节省宝贵的时间,尤其是如果你已经 30 多岁了。所以,选择 Python,继续前进。
2-不要沉迷于快速教程,优先考虑结构化课程。
由于数据科学是一个热门话题,许多 YouTubers 网站为初学者提供了快速替代方案:“快速轻松地学习 Python”或“10 分钟内学会熊猫”。然而,研究人员表示,学习过程相对缓慢,需要重复,并且当分布在间隔时间间隔内时最有效。因此,一个结构良好的课程对于建立一个新技能(如编程)的坚实基础至关重要。另外,不要忘记编程既需要认知能力(新语法),也需要运动技能(打字)。这意味着初学者几乎不可能在几个小时内学会 Python,更不用说在 10 分钟内通过手机观看视频了。
解决方法是什么?看你现阶段想投入多少了。以下是三个选项:
-无证书免费:只需去 Coursera 搜索密歇根大学的‘面向所有人的编程(Python 入门)’。
-一次性付款,成本低:去 Udemy 搜索何塞·波尔蒂利亚的《从零到 Python 中的英雄的完整 Python Bootcamp》。
-包月会员并且有点贵:在这个类别中,你可以从三个*台中选择( DataCamp 、 Codecademy 或者 DataQuest )。所有这些*台都提供了 Python track 数据科学。
我的推荐是试试 DataQuest 。不仅仅是因为结构良好的课程,还因为一些可能会让你感到惊讶的事情,这也是我希望有人之前告诉我的第三件事,也是最后一件事。
从实践中学习,而不是从观察中学习。
看视频教程似乎是 21 世纪首选的学习方法。网上找个视频很容易;你只需要点击播放,甚至可以多任务。但是在学习数据科学和编程的时候,看视频并不是最优的学习形式。
我相信你看过一个关于如何编写函数或代码的视频。但是,你有没有一边看着它,一边试图理解代码背后的逻辑并在键盘上打字?随着 Python 和函数变得越来越复杂,从视频中学习是行不通的。结果,你将不得不经常反复观看相同的解释,这是低效和费时的。基本上,你会花很多时间暂停视频,并试图找到你想再次开始观看的精确分钟/秒。这很烦人。
也就是说,我强烈推荐 DataQuest,因为他们的讲座不是视频而是文本。你必须阅读,然后开始把你读到的东西打出来。这看起来有点老派,但是对于初学者来说效果很好,他们需要更多的时间来处理他们所学的东西。它们为您提供了在同一屏幕上测试代码的指令和脚本区域。他们的形式对于那些寻求优化学习时间的人来说简直是完美的。
DataQuest 讲座的截图。
最后但同样重要的是,DataQuest 课程是基于现实生活中的数据创建的,如 Android & iOS 应用程序、MoMa 艺术品、S&P500。这很重要,因为你将在实践中学习。他们的方法将显著提高你的学习曲线。同样,这将为你节省宝贵的时间,并让你更有动力转行,因为你看到了作为一名数据科学家工作的感觉。我将在 DataQuest 上写一篇更深入的评论,所以请关注这个空间。
结论
总之,如果你正处于向数据科学的职业转型中,可能是在 30 多岁的时候,那么你不会想在已经有明确答案的问题上浪费时间。出于这个原因,我列出了我希望有人在我开始转行之前告诉我的话:
(1) 专注于 Python。
(2) 选择一门结构良好的课程,在你向更复杂的主题(如机器学习)前进时,获得坚实的基础。
(3) 通过做真实的项目来学习,而不是看简单的视频。
希望这篇帖子对你有所帮助。如果你想试试 DataQuest,那么只需访问他们的网站,开始免费试用。作为免责声明,我没有从 DataQuest 或这篇帖子中提到的任何其他*台获得任何报酬来换取我的推荐。所以,我们开始工作吧。
想获得 Medium 文章的全部访问权限并支持我的工作?使用以下链接订阅:
[## 通过我的推荐链接加入 Medium—Renato Boemer
boemer.medium.com](https://boemer.medium.com/membership)
参考文献:
J. D .卡皮克和 a .鲍恩施密特。间隔提取:无论相对间隔如何,绝对间隔都能增强学习 (2011)。J. Exp 心理学。37 (5) 1250–1257.
【2】n . j . Cepeda,等。学习中的间隔效应。最佳保持力的时间脊线 (2008)。Sage 期刊心理科学 19(11):1095–1102
原文:https://towardsdatascience.com/sybill-trelawney-and-the-confidence-interval-conundrum-df7659e3fc59?source=collection_archive---------46-----------------------
今天我将尝试一些不同的东西,我将我喜欢谈论的两个(完全不相关的)话题结合起来,希望创造一些有趣且有教育意义的东西。
…实际上,算了吧。如果你曾经读过我在 Medium 上写的任何东西,这实际上是很棒的品牌(向迈克尔·斯科特解释线性回归,有人吗?)在今天的文章中,我将解释什么是置信区间,如何计算置信区间,以及如何解释置信区间——所有这些都是通过哈利波特臭名昭著的占卜老师这个用例来实现的。
或者至少是对未来的一种统计上可能的猜测。GIF 由 gyfcat 提供
对于那些不熟悉哈利·波特和塞比尔·特里劳妮的人(我假设目前没有人在读这篇文章,因为这意味着你已经有 20 多年没有互联网了),她是一个女巫,她可以通过 99%的有根据的猜测和 1%的真实预言“预见未来”。至少在我看来,置信区间是非常相似的:基于一小组观察对整个人口做出有根据的猜测。但是,我们的工具不是水晶球和茶叶,而是标准差和样本均值。
特里劳妮教授在霍格沃茨任职期间有数千名学生,邓布利多正在审核她的工作,看看她在预测未来方面到底有多准确。然而,邓布利多是一个忙碌的家伙(试图追捕魂器和管理一所学校),无法接触到每一个上过特里劳妮课的学生。因此,他随机选择了 300 名以前的学生作为样本,并询问他们到目前为止,她的预测实现的比例是多少。
特里劳妮预测精度的左偏分布。图片由作者提供。
邓布利多收集了回答,发现回答的分布是左偏的,这意味着学生们更有可能发现特里劳妮的预测不准确。事实上,样本*均值为 55.6%,这意味着特里劳妮的“预测”比随机猜测好不了多少。
这让邓布利多非常担心,因为他不想要一个在教授占卜课时本质上是猜测的老师。他想知道她的预测的真实*均准确性是多少,如果他联系了她教过的每一个学生,是否会低于样本*均值 55.6%。
幸运的是,邓布利多记得一个麻瓜概念叫做中心极限定理(我能说什么呢,他是一个多面的家伙)这让他有能力接*特里劳妮预测的真实*均准确度。中心极限定理假设,当你有一个数据样本,你想找到真正的人口统计(即,一个常见的例子是均值,所以我将在本文中使用它,但它也可以是其他措施),你可以采取更小的样本组,并找到他们的均值(即,随机抽样 30 人一次,当你有 300 人的总样本和 30,000 人的总人口)。如果你有足够多的样本,并且这些样本满足一定的标准,那么样本均值将属于正态分布(不考虑数据的原始分布),样本均值(我有时讨厌统计)的样本分布的均值将接*真实的总体均值(如果你实际上调查了总体中的所有 30,000 人,这个均值)。
中心极限定理的应用。在这幅图中,你有 4 个从总体中随机抽取的样本,它们都是非正态分布的。但是当你从每个样本(以及更多随机样本)中取*均值时,样本*均值的分布就形成了一条正态曲线。这条曲线的*均值是真实的总体*均值(如果我们对总体中的每一个人进行抽样,我们只能得到真实的总体*均值)。图片由分析公司 Vidhya 提供
基于这个概念,邓布利多知道 55.6%的*均准确率是样本均值正态分布曲线上的某处,真正的准确率在这个同分布的中间。
老实说,他们应该让我上教科书信息图。奥雷利·HMU。图片由作者提供(因为还有谁会制作这个 LOL)。
然而,他仍然不知道样本均值在分布上的确切位置,以及它与实际总体均值的接*程度(表示为 μ )。这就是置信区间的由来。
置信区间创建以样本均值为中心的标准差区间。根据间隔的大小,您可以声明该间隔将包含 x%时间的真实总体*均值。许多研究人员和公司使用 95%的置信区间(每侧距离样本均值 2 个标准差),但根据您的使用情况,您可以提高或降低置信度(即距离均值 3 个标准差为 99.7%的置信度)。
样本均值分布的 4 种不同均值的 95%置信区间示例。浅紫色代表包含在以每个样本*均值为中心的 95%置信区间内的值。深紫色线代表理论总体*均值的 2 个标准偏差。
基于上面的例子,您可以看到落在总体均值(深紫色线内)的 2 个标准偏差内的样本均值如何将总体均值(蓝色虚线)包含在其 95%置信区间内。但是,距离总体均值超过 2 个标准差的样本均值不会将总体均值包含在其置信区间内。
由于正态分布中 95%的值位于*均值的 2 个标准偏差内,我们可以确信 95%的样本*均值将位于总体*均值的 2 个标准偏差内。据此,我们也可以说从该人群中抽取的所有随机样本的 95%将包括其 95%置信区间中的真实总体均值。
现在我们对置信区间的用途和作用有了一个大致的了解,我们可以回到霍格沃茨,帮助邓布利多计算特里劳妮教授预测准确度的置信区间。
置信区间计算公式。图片由统计如何提供
以上是计算置信区间的通用公式,其中 x̅ 是样本均值,t11】zt13】是我们希望区间跨越的均值的标准差个数,t15【s】t16是样本的标准差,t19】nt21】是组中样本的个数。****
公式的后半部分(z * s / √n)计算出 z 标准差是什么的实际值( z = 2 为 95%置信区间),你将这个值从【x̅】中加减,就可以求出你的置信区间的上下界。
如果邓布利多把评估值代入这个公式,他会得到:
上限
= 55.6 + (2 x (12.9/√300)
= 57.08%
下界
= 55.6 - (2 x (12.9/√300)
= 54.12%
这意味着特里劳妮教授预测的真实准确性很有可能在 54.12% — 57.08% 之间。然而,由于邓布利多只评估了一个样本,我们不能说这个样本*均值(55.6%)是否在总体*均值的 2 个标准差之内,以及它的置信区间是否成功地捕捉了真实的总体*均值。样本*均值有可能恰好在与*均值相差> 2 个标准差的 5%的数据中(也就是下面红色的坏 BOIS 之一),因此完全错过了总体*均值。
图片由麻省理工提供,由您真实标注。
邓布利多对下一步有几个选择:
邓布利多考虑了他的选择,决定暂时接受 54.12% — 57.08% 预测准确率的置信区间。他对结果并不十分激动,但看到区间的下限仍然大于 50%,他松了一口气,这意味着——至少——特里劳妮教授的预测比随机猜测要好!
他总结了自己发现,并将在特里劳妮教授下一次绩效评估中向她展示。也许他会建议她在未来几年的🧙教学大纲中增加置信区间🏼♀️🔮
GIF 由 Giphy 提供。
原文:https://towardsdatascience.com/syncing-data-from-snowflake-to-dynamodb-e28363b6432?source=collection_archive---------40-----------------------
图片来源: TanteTati 来自 pixabay
在实现移动和 web 应用程序时,使用 NoSQL 服务作为数据存储是显而易见的。这是因为它能够以低延迟处理操作,并且对开发人员来说很直观。在众多 NoSQL 数据库中,完全托管的 AWS DynamoDB(键值)是最常用的高可伸缩性数据库之一。
在本文中,我将带您了解如何将 DynamoDB 与 Snowflake 的性能增强功能相集成,以弥合低延迟数据存储和繁重复杂的数据计算之间的差距。
如果您以前使用过 NoSQL 数据存储,您会知道它的主要用途是存储和接收数据,而不是运行分析计算。然而,在数据驱动的应用程序中,总是有分析的元素。
给定一个“省钱”类型应用程序的典型场景,当客户本月的非公用事业支出比过去 12 个月的*均支出多 20%时,您可能想要提醒客户。要执行此操作,您可能需要:
从这里,你将需要客户,他们在过去 12 个月的支出,支出分类器,和一堆计算。这都是 DynamoDB 不擅长的事情,但雪花却非常擅长。
有一些集成或 EL 工具可以让您将 DynamoDB 加载到 Snowflake,但没有多少其他方法可以让您使用分析来驱动前端应用程序。
我想给你看一些我整理的东西,这些东西对我正在做的一个项目非常有用。最棒的是,它是一种无服务器和事件驱动的方法。
出于演示的目的,我已经将 2020 年 5 月的墨尔本停车场传感器数据加载到 Snowflake 上,以显示摄取量。
我将所有停车传感器数据卸载到 snowflake-drop2dynamodb S3 桶中,该桶包含大约 170 万行数据。请注意,我为 DynamoDB 表的“id”字段创建了一个散列,因为我没有惟一的标识符。COPY INTO 语句将创建文件块,最大大小为 10mb。对于每个数据块,Lambda 将被调用以接收到 DynamoDB 中(不保证顺序)。
一旦 Snowfload 中的 CSV 文件被卸载到 S3 存储桶中,执行超时为 1 分钟的 Lambda 就开始将文件加载到 DynamoDB 表上。它的建立受到了 AWS 演示的启发。python 函数不会将任何数据加载到内存中,到目前为止,这显示了有希望的结果。
通过使用支持触发器的 S3 和 Lambda,您可以轻松地在 Snowflake 和 DynamoDB 之间构建一个集成管道。这允许您按需或按计划将 DynamoDB 与来自雪花的数据同步。这样,您可以添加或更新属性,同步 DynamoDB 的在线 ML 要素存储和性能批处理计算。
由于我面临的一些挑战,我想实施一些改进,包括:
希望这篇文章对你有用!
我一直在帮助企业在生产 AI/ML、数据工程、无服务器和容器领域构建可扩展的云和数据解决方案,并且对前端开发越来越感兴趣。你可以在 LinkedIn 上和我联系聊天——只要告诉我你来自 Medium。
原文:https://towardsdatascience.com/syntactic-processing-for-nlp-e88e2eb4fa35?source=collection_archive---------18-----------------------
图片来自 Pixabay 的 PDPics
词法分析的目的仅仅是使用词干化、词汇化、纠正拼写错误等技术进行数据清理和特征提取。但是,在句法分析中,我们的目标是单词在句子中扮演的角色,解释单词和句子的语法结构之间的关系。
你可以在我以前的文章中读到关于词法分析的内容。
举个例子,就拿这两句话来说吧:
两个句子用词相同,但只有第一个句子语法正确,可以理解。基本的词汇处理技术无法进行这种区分。因此,需要更复杂的语法处理技术来理解句子中单个单词之间的关系。
句法分析关注句子中词法不关注的以下方面:
既然有了句法处理的基本思路,下面就来详细了解一下。
句法处理最重要的部分之一是解析。它意味着把一个给定的句子分解成它的“语法成分”。我们通过一个例子来了解一下。
假设你向一个问答(QA)系统提问,比如 Siri 或 Alexa,下面这个问题:“谁获得了 2019 年一级方程式锦标赛的冠军?”
只有当 QA 系统能够理解短语“一级方程式锦标赛”与短语“2019 年”相关时,它才能做出有意义的响应。短语“在 2019 年”指的是一个具体的时间框架,因此大大修改了问题。找到句子中短语之间的这种依赖性或关系可以通过解析技术来实现。
我们再拿一个句子来理解一个解析过的句子是什么样子的:“敏捷的棕色狐狸跳过桌子”。这个句子分为三个主要部分:
现在,让我们理解应用于任何给定文本的不同层次的句法分析。
先说句法分析的第一层——词性(词性)标注。一个单词可以被标记为名词、动词、形容词、副词、介词等。这取决于它在句子中的作用。分配正确的标签,如名词、动词、形容词等。是句法分析中最基本的功能之一。
例如,你问 Alexa 或 google home 一个问题——“好的谷歌,我在哪里可以获得在不同州之间旅行的许可?”。现在,“permit”这个词可能有两个词性标记——一个名词和一个动词。在短语“我需要一份工作许可证”中,“许可证”的正确标记是“名词”。另一方面,在“请允许我出去”这句话中,单词 permit 是一个动词。
分配正确的词性标签有助于我们更好地理解短语或句子的意图,因此是句法处理的一个重要部分。事实上,所有后续的解析技术(选区解析、依存解析等。)使用词性标签解析句子。
注意,POS 标签集不是标准的——一些书籍/应用程序可能只使用基本形式,如 NN、VB、JJ 等,而不使用粒度形式,尽管 NLTK 使用这一标签集。
虽然词性标注有助于我们识别单词在句子中的语言角色,但它不能让我们理解这些单词在句子中是如何相互关联的。因此,下一个层次的句法分析是必需的。
为了处理自然语言的复杂性和模糊性,我们首先需要识别和定义常见的语法模式。理解语法的第一步是根据单词在句子中的语法作用将单词分成组,称为成分、。
下面举个例子详细了解一下构成要素。考虑一个句子‘I shan—read—一篇关于句法分析的文章’。由连字符分隔的一组单词构成一个成分(或一个短语)。替换的概念提供了将这些词放在一个单元中的理由,也就是说,一个成分可以被另一个等价的成分替换,从而保持句子的句法有效性。
例如,用“午餐”(另一个名词短语)替换选区“关于句法分析的文章”(一个名词短语)不会影响句子的句法,尽管结果句子“Ishan read lunch”在语义上没有意义。
英语中最常见的选区有名词短语(NP) 、动词短语(VP) 、介词短语(PP) 。还有各种其他类型的短语,如状语短语、名词短语、名词短语 (N)等。,尽管在大多数情况下我们只使用上述三个短语和名词。
最后,自由词序语言(如印地语)很难使用选区解析技术进行解析。这是因为,在这种自由词序语言中,单词/成分的顺序可能会显著改变,同时保持意思完全相同。因此,我们需要对这种语言进行依赖分析。
在依存语法中,成分(如 NP、VP 等。)并不构成语法的主要元素,而是单词本身之间建立了依存关系。
让我们来看一个例句‘人看见狗’。依存关系可以这样说:‘man’是句子的主语(正在做某事的那个人);saw 是主要的动词(正在做的事情);而‘dogs’是‘saw’的宾语(对其做某事)。
所以,依存句法分析的基本思想是基于这样一个事实,即每个句子都是关于某件事情的,通常包括一个主语(做事情的人)、一个动词(正在做什么)和一个宾语(正在对谁做某事)。
一般来说,主语-动词-宾语 (SVO)是当前英语的基本语序(称为‘刚性语序’)。当然,尽管复杂的依存句法分析技术能够处理大部分句子,但是许多复杂的句子很难归入这个简单的 SVO 结构。
依存句法分析是一个相当高级的课题,它的研究涉及到对英语语法和句法分析算法的更深入的理解。因此,我们在这里不做详细介绍,让您自己去探索。
这是这篇文章的乡亲。如果您对本文中的任何内容不理解,或者需要任何主题的更多细节,请随时添加回复。如果你从这篇文章中学到了新的东西,请表示你的支持。
在这些艰难的时刻,照顾好你自己和你周围的人。干杯!
原文:https://towardsdatascience.com/syntactical-expressions-are-awesome-dc9ba5f25911?source=collection_archive---------42-----------------------
在 Julia 中,你可以用许多不同的方法来解决任何你想用语法解决的问题。虽然大多数语言可能会限制你做某些事情的方式,但 Julia 倾向于给程序员一个玩具盒,并说
“玩得开心!”
这使得 Julia 内部有了一些非常有趣的表达式,对于内联编程非常有用。在这些有趣的表达式中包含了调度行和鸭子打字,这在我之前的文章中已经讨论过了。然而,我想提醒你,Julia 程序员还有另外一个很棒的工具:
语法表达。
尽管它们的名字可能有点误导,听起来也相对标准,但它们绝对不是。Julia 中的语法表达式是这种语言的基本方法的一部分,它使这种语言更容易输入,特别是在 Julia 中所有的东西都放在一个方法中。你可能会惊讶地发现,Julia 的调度和面向对象编程技巧都是语法表达式的极致。
Julia 中的语法表达式使用断言操作数,更好的说法是等号。在 Julia 中,这个操作数变得更加有用,因为它可以与函数、逻辑和变量配对。考虑一下我写的这个减去 5 的函数:
虽然这个函数相对简洁,但我们可以在任何时候使用语法表达式来应用逻辑,而不是在一行而不是三行中使用函数,根本不必正确定义函数。正如我简单提到的,在断言操作数的另一端,我们也可以放置逻辑,这将为我们定义一个新的函数。
第二个例子不仅在编写方式上更胜一筹,而且在性能上也有所提升!
虽然最小性能提升可能在误差范围内,但它似乎是相对一致的。在三分之一的行中使用相同的逻辑无疑是可读性的一大进步。然而,正如我所说的;这仅仅是我们在语法表达方面的一长串能力的开始。
所有 Julia 程序员可能知道的第一个也是最明显的用途是使用语法表达式将 Julia 类型分派给不同的函数。我们可以将该系统应用于我们的减五函数,例如:
现在我们有一个函数来处理从一个整数中减去 5,以及从一个数组中减去 5。多亏了语法表达式,我们可以根据通过该方法传递的变量类型,在同一个方法下分派这两种类型。这是语法表达式的一个非常实用的用法,在 Julia 语言中非常常用。
然而,在 Julia 语言中不常用的是鸭子打字。使用语法表达式,我们实际上可以操纵 Julia 语言,通过创建语法方法,然后将它们断言为类型的子类型,使其更像面向对象的编程语言。
我们可以像在类似的面向对象编程语言中一样使用这些方法:
但用途不止于此。让我们暂时回想一下我们的根源,并思考这如何应用于机器学习。当然,经常有内嵌的统计可以做,但我认为将这个概念实际应用到模型的一个很好的例子是 sigmoid 或 relu。考虑这个 sigmoid 函数:
虽然这个函数确实很好,而且足够简洁,可以让你得到这份工作,但我认为,如果再用一个语法表达式来描述它,会比常规函数更让雇主着迷:
语法表达式无疑是 Julian 编程中最重要的特性之一。他们不仅使语言变得难以置信的有表现力和简单明了,他们还通过对一个操作数的一些额外使用完全形成了他们自己的方法,这在我看来很酷。语法表达式是 Julia 多范例灵活性背后的驱动力,并为该语言提供了几个有时甚至不通用的关键概念。总的来说,这种语法无疑是我在 Julia 编程语言中的一大优势。
原文:https://towardsdatascience.com/synthetic-data-vault-sdv-a-python-library-for-dataset-modeling-b48c406e7398?source=collection_archive---------12-----------------------
作者图片
在数据科学中,你通常需要一个真实的数据集来测试你的概念证明。创建捕捉实际数据行为的假数据有时可能是一项相当棘手的任务。几个 python 包试图完成这项任务。很少流行的 python 包是Faker拟态 。然而,主要是生成简单的数据,如生成姓名、地址、电子邮件、等。
要创建捕捉复杂数据集属性的数据,比如以某种方式捕捉实际数据的统计属性的时间序列,我们将需要一个使用不同方法生成数据的工具。Synthetic Data Vault(SDV)python 库是一个使用统计和机器学习模型对复杂数据集进行建模的工具。这个工具可以成为任何从事数据和建模工作的人的工具箱中的一个很好的新工具。
我对这个工具感兴趣的主要原因是为了系统测试:拥有从相同的实际底层过程生成的数据集要好得多。这样我们可以在现实的场景中测试我们的工作/模型,而不是有不现实的案例。我们需要合成数据还有其他原因,如数据理解、数据压缩、数据扩充和数据隐私【1】。
在论文“ The Synthetic data vault ”中首次介绍了Synthetic Data Vault(SDV)】,然后在 Neha Patki 的硕士论文“The Synthetic Data Vault:Generative Modeling for Relational Databases”中将其用于生成建模的上下文中。最后,SDV 图书馆是作为 Andrew Montanez 的硕士论文“ SDV:用于合成数据生成的开源图书馆”的一部分开发的。另一篇给 SDV 增加新功能的硕士论文是由徐磊完成的(使用条件 GAN 合成表格数据)。
所有这些工作和研究都是在麻省理工学院信息与决策系统实验室(LIDS,MIT)首席研究科学家 Kalyan Veeramachaneni 的监督下在麻省理工学院数据到人工智能实验室完成的。
我带来 SDV 历史的原因是为了欣赏这座图书馆背后的大量工作和研究。一篇关于使用这个工具的潜力的有趣文章,特别是在数据隐私方面,可以在这里找到。
该库的工作流程如下所示。用户提供数据和模式,然后使模型适合数据。最后,从拟合的模型中获得新的合成数据[2]。此外,SDV 图书馆允许用户保存适合的模型()以备将来使用。
SDV 工作流程(转载自[2])
概率自回归(PAR)模型用于对多类型多元时间序列数据建模。SDV 图书馆在类中实现了这个模型(来自时序模块)。
让我们设计一个例子来解释类的不同论点。我们将研究多个城市的温度时间序列。数据集将有以下几列:日期,城市,测量装置,地点,噪音。
在中,数据集中考虑了四种类型的列。
时序的 PAR 模型在模块的类中实现。如果我们想要对单个时间序列数据建模,那么我们只需要将类的参数设置为 datetime 列(说明时间序列顺序的列)。神奇发生在第 8-16 行!
SDV 能够拥有多个实体,即多个时间序列。在我们的例子中,我们有多个城市的温度测量值。换句话说,每个城市都有一组将被独立处理的测量值。
使用 PAR 模型的时间序列建模的详细示例可在这里找到。
在您使用指定数据模式之后,SDV 可以通过生成数据来对关系数据集建模。此外,您可以使用库内置函数绘制实体关系(er)图。元数据准备就绪后,可以使用分层建模算法生成新数据。你可以在这里找到更多信息。
SDV 还可以对单个表数据集进行建模。它使用的统计和深度学习模型是:
SDV 库提供了使用 SDGym 库对合成数据发生器进行基准测试的能力,以评估合成器的性能。你可以在这里找到更多的信息。
在这篇文章中,我们回顾了 SDV 图书馆的主要功能,以及它在基于真实数据生成匿名数据集方面的作用。主要特点是建模单表数据,时间序列,关系数据集,以及数据基准。这里要提到的一点是,您需要为 SDV 模型提供一个大型数据集来进行训练。这样,模型可以生成一个有意义的数据集,真正捕捉真实的过程。试试这个库,让我知道你的想法。
你可以在这里 找到这篇文章的笔记本 。
感谢阅读!
如果你喜欢这个帖子,你可以 在这里加入我的邮件列表 来接收更多关于数据科学、机器学习、统计以及有趣的 Python 库和技巧&技巧的帖子。也可以在我的 网站 、 中 ,或者LinkedIn关注我。
[1]徐磊,利用条件 GAN 综合表格数据,(2020),麻省理工学院硕士论文
[2] N. Patki 等人,合成数据仓库 (2016),数据科学和高级分析国际会议(DSAA-16)
[3]麻省理工学院新闻,合成数据的真正前景 (Ocotber 16,2020)
最初发表于https://www.ealizadeh.com
原文:https://towardsdatascience.com/synthetic-instrumental-variables-968b12f68772?source=collection_archive---------35-----------------------
我喜欢能让你走的报纸”这在事后看来是显而易见的。为什么以前没人尝试过?”一些 NLP 的人对变形金刚做了这样的评论(“注意力是你所需要的全部”)。对我来说,“多重原因的祝福”唤起了类似的感觉:为什么人们没有创造合成乐器?
本文假设对因果 Dag 和因果推理有基本的了解。如果你对这些术语不熟悉,请阅读我之前关于因果关系的文章的后三分之一,以获得简要概述。
此外,虽然有许多方法可以创建合成工具,但本文使用概率 PCA,因为它是最通用的方法之一。如果你对 PCA 不太了解,建议看一下这篇精彩直观的讲解。
工具变量由来已久,可以说是计量经济学的中坚力量之一。我们关心的是这个 DAG:
u 是一个未观察到的混杂因素。我们要估计 Y 对 Z 的因果作用,Y → Z,通过这个 DAG,我们可以估计 X → Y 和 X → Z,假设线性,我们有 X → Z = (X → Y) (Y → Z),我们可以代数求解 Y → Z。
在这个设置中,我们称 X 为工具变量,如果:
在实践中,找到一种工具是困难的。如果 X 与 Y 仅弱相关,那么因果效应估计可能会严重偏差。第二个条件无法测试或验证,所以我们只能争论假设的合理性,比如“蛋黄酱是一种工具吗?”
图片由玛丽亚·波尔娜
创新要求我们重新思考现有的方法。聪明之处在于:
如果寻找乐器很难,为什么不创造乐器呢?
原论文标题为“多重因缘的祝福”,因为多重因缘是创造我们自己的工具的必要条件。DAG 看起来有点像:
我们希望在存在共享的未观察到的混杂因素 u 的情况下,推断每个 Y 对 Z 的因果影响。可以将 Y 视为回归模型中的列名和预测值。我们假设没有干扰,没有互动——这当然过于简单,但很实用。
这个 DAG 看起来是限制性的,但是对于许多现实世界的过程来说,它是足够合理的(参考本文中的例子)。更重要的是,与直觉相反,这个问题比单一案例要简单得多:
这个“更简单”的 DAG 是不可能求解的。我们无法对因果关系做出无偏见的估计。
此外,这个问题假设没有未被观察到的单一原因混杂因素。未观察到的 V 的存在会打乱我们的估计:
然而,正如论文指出的,假设不存在这样的 V 是一个比不可忽略更令人舒服的假设。大多数使用协变量调整的因果分析假设我们根本没有不可测量的混杂因素。这里我们假设一些不可测量的常见混杂因素,只是没有不可测量的单一原因混杂因素。
现在我们将看到为什么多重因果关系是必要的。我们希望创建一个通用的仪器 X。这个 X 是一个局部变量,即每个观测值都有一个唯一的 X 向量(稍后将详细介绍)。
例如,我们可以拟合 PCA 并选择前几个主成分作为我们的 x。通过构造,排除限制得到满足,因为 PCA 不使用 z。我们不必为这一假设争论不休。
然而,如果使用整个数据集来训练 PCA,我们不知道 X 是否是好的工具。我们可以从随机噪声中获得主要成分,但 X 不能很好地预测 Y。此外,重新使用 Y 来估计仪器和因果效应在哲学上是有问题的,并将导致过度拟合。
一种思路是将数据集一分为二,在一半上使用 PCA,在另一半上执行推理。这导致了一个死胡同。对于看不见的数据(后半部分),我们对每个观察值的最佳猜测是 X =零向量,这简化为 OLS 回归。找出新方法的全部意义在于,我们知道 OLS 是行不通的。
本文通过删除每个观察值的随机 Y 来解决这个问题(比如说,一半)。经典 PCA 不能处理缺失值。概率主成分分析(PPCA),它的贝叶斯对应物,可以很好地处理缺失值。
PCA 使用 y = Wx 对每个观察值的 y 向量进行建模,其中 W 是权重矩阵,x 是潜在变量的向量。PPCA 假设存在高斯误差项ε,使得 y = Wx + ε。生成模型:
当σ → 0 时,我们得到 PCA。如果我们用允许对角线值变化的对角矩阵代替σ I,我们得到因子分析。
所以:
如果 X 具有良好的预测性能,那么我们有一个从 Y 综合创建的有效的工具(具体来说,在 PPCA 的情况下,残差是工具)。或者,由于 X 的概率性质,我们可以使用广义倾向得分来拟合潜在的结果模型,并获得因果效应估计。
这听起来好得难以置信吗?也许吧。但是合成控制也有代价:偏差-方差权衡。
创建合成仪器的贝叶斯模型具有其自身的估计不确定性,因此在消除偏差的同时增加了方差。作者建议遵循奥卡姆剃刀。在 PPCA 的情况下,每个额外的主成分都会增加方差,因此我们希望保留最少数量的成分,但仍能产生“良好”的预测性能。
虽然本文使用了 PPCA,但是只要潜在变量模型能够处理缺失值,它们通常就能工作。例如,PPCA 不适用于计数数据,因为它假设高斯误差。
原文:https://towardsdatascience.com/sysidentpy-a-python-package-for-modeling-nonlinear-dynamical-data-f21fa3445a3c?source=collection_archive---------33-----------------------
数学模型在科学和工程中起着关键作用。我们看到研究人员和数据驱动的专业人士使用许多不同的模型来分析和预测负荷需求、现金需求、股票交易数据、生物医学数据、化学过程等等。
当数据是动力系统的结果时,自回归模型通常是进一步检验的安全选择。在这方面,ARMAX(具有移动*均和外生输入的自回归模型)模型及其变体(ARX、ARMA、ARIMA 等。)是使用最多的模型类之一。然而,前述模型对于线性数据工作良好,因为它们是线性模型。这就是 SysIdentPy 的用武之地:一个用于非线性动力系统的 python 包。
系统本质上是非线性的。有人可能会说,在大多数情况下,线性*似效果很好,你不需要非线性模型…我非常同意。但是,如果想要获得一个动态的非线性模型呢?嗯,你可以用系统识别来做!
SysIdentPy 是一个使用 NARMAX 模型(具有移动*均和外生输入的非线性自回归模型)进行系统识别的开源软件包,由我与我的朋友 Luan Pascoal 、Samuel Oliveira 和 Samir Martins 合作开发。
NARMAX 模型是 ARMAX 族的推广。然而,NARMAX 模型不是 ARMAX 模型的简单扩展,它能够描述许多不同的复杂非线性系统。
目标是成为一个友好的用户和强大的工具。只需几行代码,您就可以构建一个 NARMAX 模型。下面的代码显示了如何使用该库的一个简单示例:加载样本数据、设置模型参数、拟合和预测模型、显示模型细节以及绘制两个残差测试的结果。很简单,对吧?
系统标识的默认输出
您可以使用以下命令安装 SysIdentPy
到目前为止,我们已经实现了几个关于 NARMAX 模型的传统算法。下面列出了其中的一些方法:
读者可参考官方文档和知识库了解更多详情:
[## 欢迎使用 sysidentpy 的文档!-系统识别
wilsonrljr.github.io](https://wilsonrljr.github.io/sysidentpy/index.html) [## wilsonrljr/系统识别
github.com](https://github.com/wilsonrljr/sysidentpy)
许多附加功能已经在开发中。很高兴能与你们所有人合作,使图书馆越来越完整。
欢迎在 Linkedin 或 Discord (wilsonrljr#3777)上联系我。此外,我们有一个 Discord 服务器来讨论 SysIdentpy(问题、贡献等等)。你可以在这里加入我们的不和谐。
原文:https://towardsdatascience.com/system-design-101-b8f15162ef7c?source=collection_archive---------2-----------------------
照片由乔纳森·辛格在 Unsplash 上拍摄
现在,系统设计面试是顶级科技公司流程的一部分。许多人害怕系统设计面试,因为没有一定的模式来准备。此外,系统设计问题是开放式的,没有标准的对错答案,这使得准备过程更加困难。
系统设计是软件工程中 最重要也是最令人畏惧的 方面。一个主要原因是每个人似乎都有不同的方法;没有明确的循序渐进的指导方针。
软件工程师与系统设计的斗争可以分为两个部分:
在这篇文章中,我们将逐步解决一个设计问题。这个指南可以帮助你设计一个系统。这个是根据我学习建筑课程的经验。
我们需要明确系统的目标。 系统设计就是这样一个浩瀚的话题;如果不把它缩小到一个具体的目标,设计系统就会变得复杂,尤其是对于新手。 有时候约束对系统是有好处的。这有助于将注意力集中在你试图设计的主要特征上。它澄清了关于系统功能的模糊之处。我们可以将这些需求分为两部分:
这是系统必须交付的需求。我们可以说它是系统的主要目标。在这里,功能被描述为输出和输入之间的行为规范。什么是系统输入,什么是输出,这些要求中应该明确。
现在是需要分析的更重要的需求。如果我们不满足这个要求,它将对项目的商业计划有害。这些需求通过不同的系统质量来限制系统设计。
性能、可修改性、可用性、可伸缩性、可靠性等。是系统设计中重要的质量要求。这些‘能力’是我们分析一个系统并确定我们的系统设计是否恰当所需要的。
系统设计的重点之一是了解系统的规模。当你在设计一个系统时,规模实际上意味着什么?文章浏览量,每秒生成时间轴的次数等。可以测量系统的规模。如果系统的测量值非常大,那么它们就是大规模系统。
另一个重要的估计是关于存储。我们需要知道系统需要多少存储,比如说 5 年。只能增加,但是你需要有一个估计。它将给出数据存储的方向。
在 URL 缩短服务的系统设计中,您可能会看到这样的计算:
让我们假设,系统将所有的 URL 缩短请求和它们的缩短链接存储了 5 年。由于我们预计每个月会有 5 亿个新的 URL,我们预计存储的对象总数将是 500 M * (5 * 12)个月= 30 B。现在让我们假设每个存储的对象大约为 100 字节。我们将需要 300 亿* 100 字节= 3 TB 的总存储容量。
因此,您知道需要多少存储空间。你开始向一个方向流动。
网络带宽使用率也是一个重要因素。在分布式系统中,带宽使用管理至关重要。例如,如果您想要有效地处理文件传输,您可能需要将文件分成多个块。
图:只传输更新的块(图片由作者提供)
如果我们在每次更新时都传输整个文件,如果文件大小为 100MB,我们可能需要每次传输 100MB 的文件。例如,我们将文件划分为 2MB 的块,并且只传输文件中修改过的部分,如图所示。这将减少用户的带宽消耗和云存储。
我们需要定义系统的数据模型,以及数据如何在不同的系统组件之间流动。我们需要弄清楚系统的实体和数据管理的不同方面。
对于系统设计新手,请记住,“如果你对系统设计从哪里开始感到困惑,请尝试从数据流开始。”
以下是类似于 Medium 的服务的一些实体:
用户:用户名,姓名,邮箱等。
文章:文章 ID,文章内容,时间戳,圈数等。
用户跟随:用户标识 1,用户标识 2
关注者:用户标识 3,用户标识 4
数据库系统选择是本节的一部分。NoSQL 或 SQL 数据库选择是一个常见的场景。另一方面,我们可能需要决定为照片和视频选择哪种存储方式。
如果我们试图一步到位地设计系统,这是一项艰巨的任务。所以,还是把它们当做高级组件来破比较好。然后,将这些组件分解成详细的设计。
试着画一个框图,用 5-6 个部分代表我们系统的核心组件。如果系统太大,它可以更多。对于我们可以将系统分成多少个部分,没有确定的规则。请记住,我们需要识别足够的组件来帮助解决系统的实际问题。
这里有一个设计文件存储和同步服务的高级图,比如 Google Drive。
图:Google Drive 的高层设计(图片由作者提供)
文件处理服务器将管理文件处理工作流。元数据服务器将处理文件信息、块大小和用户信息。通知服务器将让客户端应用程序知道将文件更新到客户端登录的所有其他设备。云存储将保存文件。
然后,我们可以根据系统需求分解这些组件,进行进一步的详细设计。
对于最后一步,我们需要更深入地挖掘对实现系统质量需求很重要的主要组件。
在这一步,我们可以分析解决问题的不同方法、它们的优缺点,并解释为什么我们更喜欢一种方法。权衡分析是这一部分的重要部分。这里可能有一些例子:
由于我们需要存储大量的数据,我们可能需要对数据进行分区,以分布到多个数据库。可能会有一个名人资料的问题,我们将如何处理这样的用户有很多追随者。
我们需要缓存多少数据来加快系统响应时间。我们应该在哪里使用负载均衡器,等等。?
下面是一个像 Google drive 这样的云文件存储服务的详细设计的例子。
图:Google drive的系统设计(图片由作者)
现在,我们有了系统的详细设计。我们必须找到系统的瓶颈,并找到不同的方法来缓解它们。例如:
作者图片
上面提到的步骤并不是设计系统的唯一方法。这是给刚接触系统设计的初学者的简化指南。为新手设计一个系统是非常困难的。本指南让您保持正确的方向,不要迷失在系统设计的潜在问题和解决方案的海洋中。
系统设计是一个如此广阔的话题;如果没有设定具体的目标,那么设计系统就会变得很有挑战性,尤其是对于新手来说。
尽量详细说明系统的要求。然后,找到数据模型和数据流。并且在一个高层次的设计之后,如果需要的话,不要犹豫添加组件。最重要的是,试着关注解决方案的权衡分析。祝你好运!!
感谢您阅读文章。祝你今天愉快🙂
本文是初学者系统设计系列的一部分。下面给出了一些文章链接:
设计限速器
系统设计基础:缓存入门
系统设计基础:客户端-服务器架构
系统设计基础知识:负载*衡器 101
谷歌自动建议服务的系统设计
谷歌驱动 系统设计分析
TinyURL系统设计分析
分布式系统中的可用性
原文:https://towardsdatascience.com/system-design-analysis-of-google-drive-ca3408f22ed3?source=collection_archive---------1-----------------------
Elle Cartier 在 Unsplash 上拍摄的照片
系统设计是 软件工程中最重要也是最令人畏惧的 方面。这个观点来自于我自己在一个建筑助理课程中的学习经历。当我开始我的助理架构课程时,我很难理解设计一个系统的想法。
一个主要原因是软件架构书籍中使用的术语一开始很难理解,并且没有清晰的逐步指南。每个人似乎都有不同的方法。当然,还有一个心理障碍,就是这些话题可能很难理解。
于是,我根据自己学习建筑课程的经验,着手设计一个系统。第一个是关于谷歌自动建议。对于这一个,让我们设计一个类似 Google drive 的云文件存储服务。这是一个文件存储和同步服务,使用户能够将他们的数据存储在远程服务器上。
图片作者作者
现在那些已经使用 Google drive 的人知道,我们可以从任何设备上传任何大小的文件,并且可以在我们的手机、笔记本电脑、个人电脑等上找到它。我们很多人都想知道系统如何处理如此大量的文件。在本文中,我们将设计一个 google drive 服务!!
这绝不是一个全面的指南,而是对系统设计的介绍,是开始成为软件架构师之旅的好地方。
我们需要明确系统的目标。系统设计是一个如此广阔的话题;如果我们不把它缩小到一个特定的目的,那么设计系统就会变得复杂,尤其是对于新手来说。
用户应该能够从任何设备上传和下载文件/照片。文件将在用户登录的所有设备中同步。
如果我们考虑 1000 万用户,每天 1 亿次服务请求,那么写和读操作的数量将是巨大的。为了简化,我们只是设计 Google Drive 存储。换句话说,用户可以上传和下载文件,这有效地将它们存储在云中。
在这一部分,我们决定系统的特性。我们可以将这些需求分为两部分:
用户应该能够从任何设备上传和下载文件。并且文件将在用户登录的所有设备中同步。
这些是系统的主要目标。这是系统必须交付的需求。
现在是需要分析的更关键的需求。如果我们不满足这个要求,它可能对项目的商业计划有害。那么,让我们定义一下我们的 nfr:
用户可以从任何设备上传和下载文件。该服务应该支持存储单个最大 1 GB 的大文件。服务应该在设备之间自动同步;如果从设备上传一个文件,该文件应该在用户登录的所有设备上同步。
对于系统设计新手来说,请记住,“如果你对系统设计从哪里开始感到困惑,请尝试从数据流开始。”
我们的用户在这个系统中可以上传和下载文件。用户从客户端应用程序/浏览器上传文件,服务器将存储这些文件。用户可以从服务器下载更新的文件。那么,让我们看看我们如何为如此大量的用户处理文件的上传和下载。
从图中我们可以看到,如果我们上传完整大小的文件,它将花费我们的存储和带宽。此外,完成上传或下载的延迟也会增加。
图:完整的文件传输需要更多的时间、存储和带宽。(图片由作者提供)
我们可以将每个文件分成更小的块。然后,我们可以只修改数据发生变化的小部分,而不是整个文件。在数据上传失败的情况下,这种策略也会有所帮助。我们需要将每个文件分成一个固定的大小,比如 2 MB。
图:将文件分成更小的块以优化存储利用率和带宽(图片由作者提供)
我们的块大小需要更小。这将有助于优化空间利用,网络带宽是另一个考虑因素,而作出决定。元数据应该包括每个文件块信息的记录。
因为我们有这篇文章作为练习,所以我们可以假设文件需要存储在 2 MB 的小块中。如果一个进程失败,对于文件 的较小片段,在重试操作 的情况下,我们也会受益。如果文件未上传,则仅重试失败的块。**
减少客户端和云存储之间的数据传输量将有助于我们缩短响应时间。我们可以只发送修改过的文件块,而不是传输整个文件。
图:只传输更新的块(图片由作者提供)
在这种情况下,文件的更新部分将被传输。我们将把文件分成 2MB 的块,只传输修改过的文件部分,如图所示。
从上图中,你可以看到,我们可以只更新修改后的 2MB 文件,而不是更新整个 10 MB 文件。这将减少用户的带宽消耗和云存储。最重要的是,响应时间会更快。
客户端组件 Watcher 将观察客户端文件夹。如果用户发生任何改变,它将通知索引控制器(另一个客户端组件)关于用户的动作。它还将监控其他客户端(设备)上是否发生任何变化,这些变化由通知服务器广播。
当元数据服务收到更新/上传请求时,它需要检查元数据数据库的一致性,然后继续更新。之后,将向所有订阅的设备发送通知,以报告文件更新。
我们需要一个负责保存文件、用户等信息的数据库。它可以是类似 MySQL 的关系数据库,也可以是类似 MongoDB 的 NoSQL。我们需要保存数据,如块、文件、用户信息等。在数据库里。
众所周知,我们必须在 SQL 或 NoSQL 这两种类型的数据库之间做出选择。无论我们选择什么,我们都需要确保数据的一致性。
使用 SQL 数据库可能给我们带来实现同步的好处,因为它们支持 ACID 属性。
NoSQL 数据库不支持 ACID 属性。但是它们提供了对可伸缩性和性能的支持。因此,我们需要在元数据服务器的逻辑中为这种类型的数据库提供对 ACID 属性的编程支持。
现在,客户端从设备更新文件;需要有一个组件来处理更新并将更改应用到其他设备。它需要同步客户端的本地数据库和远程元数据数据库。元数据服务器可以执行管理元数据和同步用户文件的工作。
现在想想吧;如此庞大的用户量同时上传文件,服务器如何处理如此大量的请求。为了能够处理如此大量的请求,我们可以在客户机和服务器之间使用消息队列。
图:消息队列提供可伸缩的请求队列和更改通知,以支持大量使用拉或推策略的客户端。(图片由作者)
当目标程序繁忙或未连接时,消息队列提供临时消息存储。它提供了一个异步通信协议。 It 是一个将消息放入队列,不需要立即响应就能继续处理的系统。RabbitMQ,阿帕奇卡夫卡等。是消息队列的一些示例。
在消息队列的情况下,一旦客户端接收到消息,消息将从队列中删除。因此,我们需要为客户机的每个订阅设备创建几个响应队列。
图:每个设备类型的响应消息队列(图片由作者提供)
对于大量的用户,我们需要一个可伸缩的消息队列来支持客户端和同步服务之间基于消息的异步通信。该服务应该能够在一个高度可用、可靠和可伸缩的队列中高效地存储任意数量的消息。例子:阿帕奇卡夫卡,rabbitMQ 等。
如今,有许多*台和操作系统,如智能手机、笔记本电脑、个人电脑等。他们提供随时随地的移动访问。
如果你将文件保存在笔记本电脑的本地存储中,并且你要外出,但想在手机上使用它,如何获取数据?这就是为什么我们需要云存储作为解决方案。
它存储用户上传的文件(块)。客户端可以通过文件处理服务器与存储器交互,从存储器发送和接收对象。它只保存文件;元数据 DB 保存文件的块大小和编号的数据。
客户端 A 上传 chunk 到云存储。客户端 A 使用元数据服务器更新元数据并提交 MetadataDB 中的更改。客户端得到确认,通知被发送到同一用户的其他设备。其他设备接收元数据更改,并从云存储中下载更新的块。
图:客户端 A 的文件处理工作流程(图片由作者提供)
我们需要对元数据数据库进行分区,这样我们就可以存储大约 100 万个用户和数十亿个文件/块的信息。我们可以对数据进行分区,将读写请求分布在服务器上。
i) 我们可以基于文件路径的第一个字母在分区中存储文件块。例如,我们将所有以字母“A”开头的文件放在一个分区中,而将那些以字母“B”开头的文件放在另一个分区中,依此类推。这被称为基于范围的划分。像“Z”或“Y”这样出现频率较低的字母,我们可以将它们组合成一个分区。
主要问题是有些字母在开头字母的情况下比较常见。例如,如果我们将所有以字母“A”开头的文件放入一个 DB 分区,并且我们有太多以字母“A”开头的文件,以至于我们不能将它们放入一个 DB 分区。在这种情况下,这种方法有一个缺点。
ii) 我们也可以根据文件的‘fileId’散列来分区。我们的散列函数将随机生成一个服务器号,并将文件存储在该服务器中。但是我们可能需要要求所有的服务器找到一个建议的列表,并将它们合并在一起以得到结果。因此,响应时间延迟可能会增加。
如果我们使用这种方法,仍然会导致分区过载,这可以通过使用一致散列来解决。
众所周知,缓存是一种提高性能的常用技术。这对于降低延迟非常有帮助。服务器可以在命中数据库之前检查高速缓存服务器,以查看搜索列表是否已经在高速缓存中。我们不能将所有数据都放在缓存中;太费钱了。
当缓存已满,我们需要用新的块替换一个块时。最*最少使用(LRU)可用于此系统。在这种方法中,首先从缓存中删除最*最少使用的块。
在文件共享服务中,用户数据的隐私和安全至关重要。为了解决这个问题,我们可以将每个文件的权限存储在元数据数据库中,以便让 perm 知道哪个用户可以看到或修改哪些文件。
客户端应用程序(web 或移动)传输用户上传到云存储中的所有文件。该应用程序将上传、下载或修改文件到云存储。客户端可以更新元数据,如重命名文件名、编辑文件等。
客户端 app 功能包括上传、下载文件。如上所述,我们将把每个文件分成 2MB 的小块,这样我们只传输修改过的块,而不是整个文件。
如果因为用户离线状态产生任何冲突,app 需要处理。 现在,我们可以在客户端保存元数据的本地副本,以便进行离线更新。
客户端应用程序需要检测客户端文件夹中是否有文件被更改。我们可能有一个组件,观察者。它将检查客户端上是否发生了任何文件更改。
客户端可以定期检查服务器是否有任何变化,这是一种手动策略。但是如果客户端频繁地检查服务器的变化,就会对服务器造成压力,使服务器保持忙碌。
我们可以使用 HTTP 长轮询技术来代替。在这种技术中,服务器不会立即响应客户端请求。服务器保持请求打开,而不是发送空响应。一旦新信息准备就绪,服务器就向客户机发送响应。
图:客户端应用程序向元数据服务器请求更新元数据信息(图片由作者提供)
我们可以将客户端应用程序分为以下几个部分:
本地数据库将跟踪所有文件、块、目录路径等。在客户端系统中。
块控制器会将文件分割成更小的部分。它还将执行从块中重建整个文件的任务。这部分将有助于仅确定文件的最*修改的块。并且只有修改过的文件块将被发送到服务器,这将节省带宽和服务器计算时间。
观察器将观察客户端文件夹,如果用户发生任何变化,它将通知索引控制器用户的操作。它还将监视同步服务广播的其他客户端(设备)上是否正在发生任何变化。
索引控制器将处理从观察器收到的事件,并更新本地数据库中已修改的文件块信息。它将与元数据服务通信,将更改传输到其他设备并更新元数据数据库。该请求将通过消息请求队列发送到元数据服务。
以下是该系统的完整示意图:
图:Google drive 的系统设计(图片由作者提供)
在这个系统中,我们没有考虑 UI 部分。系统中也没有考虑更新和离线编辑的历史。手机客户端可以按需同步,节省用户的带宽和空间。这里我们没有使用另一台服务器进行同步。元数据服务器正在执行该任务。
我们决定将文件分成更小的块,以节省存储和带宽使用,同时减少延迟。我们添加了负载*衡器,以便在后端服务器之间*均分配传入的请求。如果一个服务器死了,LB 将停止向它发送任何请求。
在云架构中,用户数据的隐私和安全至关重要。我们可以将每个文件的权限存储在元数据数据库中,以检查哪个用户可以看到或修改哪些文件。
这个系列的第一部分是关于谷歌汽车建议。如需了解系统设计步骤,请点击以下链接:
[## 系统设计 101
towardsdatascience.com](/system-design-101-b8f15162ef7c)
参考:钻研系统设计课程。对于视频参考,您可以查看此链接。感谢您阅读文章。过得愉快🙂
原文:https://towardsdatascience.com/system-design-interview-checklist-a-gateway-to-faangs-2b7fac80e423?source=collection_archive---------3-----------------------
通常,系统设计面试是冗长的,并涵盖了许多复杂的组件。这使得我们很容易迷失在小事情中,错过大的画面。因此,以这样一种方式组织你的面试变得非常重要,这样你就可以轻松地传达整个画面,而不会浪费时间在任何没有附加值的事情上。
下面是我遵循的结构,你也可以尝试。
格伦·卡斯滕斯-彼得斯在 Unsplash 上拍摄的照片
确保你是主导面试的人,而不是你的面试官。这并不意味着你不让他们说话,而是说,你应该是说话最多的人,在面试官指出你的设计中的问题之前主动提出来,处理面试官可能会戳到你的问题等等。
清楚地说出功能性和非功能性需求。目的是需求应该足够大,使问题具有挑战性,也足够有限,以便您可以在规定的时间内构建满足这些需求的系统。从非功能方面来说,试着做一个大规模工作的系统。设计一个在低规模下工作的系统有什么乐趣?
在最终确定财务报告和非财务报告之前,让你的面试官看一下,确保他们不想添加/删除某些东西。有时候,面试官确实有一些他们想要查看的特定用例。
问问你的面试官他们是否想了解这一点。许多人更愿意跳过计算,更多地关注设计,假设所需的内核数量或所需的磁盘数量等有足够大的*似值。
基于 FRs 和 NFRs,想出这些东西:
提供一个高级组件图,包括以下内容:
您的高级图表应该包括以下关键内容:
一旦你准备好了整个图表,仔细检查整个设计,一次一个用例,向你的面试官解释你的设计。谈谈你为什么在这里选择了一个特定的数据库,为什么使用了一种特定的通信模式,比如同步/异步等。如果你做了一个特别的设计选择,你也可以进入一个 RPC vs HTTP 类型的对话。你应该检查你的数据库中使用的是哪种数据复制策略,例如,你是使用主-从还是多主设置等。
如果这听起来有点吓人,你可以看看我通常是如何在这个视频中进行设计演练的。
警告:除非面试官要求,否则不要马上谈论 API、数据库模式等细节。大多数人在这一点上迷失在为一个系统设计 API 的过程中,并在以后耗尽时间。
印象分:大多数面试没有关于分析的 FRs 和 NFRs,但是如果你的设计涵盖了这一点或者为分析留下了足够好的范围,那么你的解决方案会提升很多。试着补充一下。比如你可以看看这个。
一旦你向面试官解释了整个流程,问他们想详细讨论哪个部分。通常,人们不想详细检查整个系统。让他们决定哪一个是他们想要深入研究的组件,然后您可以检查该特定系统的实现细节。
这里你应该涵盖的内容有:
这是大多数人跳过的,但这是你必须涵盖的最重要的事情之一,它涉及到你的系统有多大的弹性。在现实世界中,事情会发生变化,当它们发生时,你需要确保你能完全控制你的系统。
谈谈你是如何监控系统的。您有什么样的警报机制?你的 KPI(关键绩效指标)是什么,你如何跟踪它们?当发生故障时,当您的服务崩溃时,当您的数据库主节点宕机时,甚至当您的一个数据中心宕机时,会发生什么?
同样,如果你以前没有这样做过,看看我是怎么做的,在这个视频的后半部分。
这是我的清单,当我试图设计任何系统时,无论是在面试中还是在现实世界中,我通常都会遵循它。
这是系统设计,如果你想看看我是如何破解谷歌、脸书、亚马逊等公司的,看看我的总体准备策略:
[## 我是如何破解谷歌、脸书、亚马逊的采访的,你又是如何做到的!
medium.com](https://medium.com/@sandeep.1904/how-did-i-crack-a-bunch-of-faangs-and-how-you-could-do-it-too-d824cfc6b974)
希望这有所帮助!
原文:https://towardsdatascience.com/system-design-interview-prep-should-you-put-the-data-in-cache-56936697ee54?source=collection_archive---------32-----------------------
约书亚·索蒂诺在 Unsplash 上拍摄的照片
(这个帖子也在我的博客里)
缓存是一种以相对较快的速度提供数据的数据存储。有硬件和软件缓存。在系统设计面试中,我们将主要关注软件缓存。在许多情况下,缓存是存储数据的内存块。由于访问内存的速度比磁盘和网络等 IO 快得多,应用程序可以将数据放在内存中以避免访问 IO。因此,吞吐量可以增加,延迟可以减少。
缓存存储在内存中,它通常比持久性存储(如磁盘)小得多。因此,如果您的应用程序需要处理大量数据,将所有内容都存储在缓存中是不现实的。只有一小部分数据应该放在缓存中。当数据可以在缓存中找到时,它被称为缓存命中。如果没有,则称为缓存未命中。
对于系统设计人员来说,找出哪些数据需要放在缓存中是至关重要的。不难发现,只有经常被请求的热数据才应该留在缓存中。以设计脸书为例,帖子必须比用户简介更热门。而那些名人的帖子,一定比那些普通用户要火得多。所以,你应该在面试中优先考虑这个问题。
重要的是要知道,在所有类型的系统中,高速缓存都不会增加吞吐量。在某些情况下,它会对系统产生负面影响。例如,如果您的系统需要频繁更新或写入数据,缓存中的数据也需要不断变化。这会导致缓存大量失效。因此,应用程序需要将缓存中的数据标记为无效。此外,它还需要将更新后的数据写入其对应的持久性数据存储。在这个例子中,高速缓存的失效成为一个开销。因此,缓存只对那些读取量大而写入量小的应用程序有益。
当应用程序需要更新数据时,它需要:
直写:将新数据同步写入缓存和后台数据存储。
优点是数据在后备和缓存上都是一致的。即使停电,数据更新也不会丢失。
缺点是花费在写入上的时间要长得多,因为它不需要写入非常慢的持久数据存储。
回写:先写入缓存。在数据被替换之前,它不会写入后备数据存储。
优点是写更快,因为不需要更新后备数据存储。
缺点是它可能会丢失更新。此外,实现更加复杂,因为它需要跟踪哪个缓存块在缓存中被更新,但尚未写入磁盘。这种类型的缓存块称为脏块。
因为缓存很小,只保存一小部分热数据,所以它可能会超出限制。在这种情况下,当一个新请求到来时,如果出现缓存未命中,我们将需要为新数据逐出一个块。这个过程就是呼叫替换。有许多算法用于高速缓存替换,以找到要驱逐的高速缓存块。最佳策略取决于应用程序的用途。我在这里介绍两个著名的政策。
最*最少使用,LRU ,它丢弃最*最少使用的数据。在这个策略中,需要跟踪“何时”。
最不常用,LFU,丢弃最不常用的数据。使用计数被跟踪。
缓存是优化读取密集型应用程序的一种方式。它通过将相对少量的热数据放入内存来提高吞吐量并减少延迟,以便数据访问可以避免命中磁盘。根据您的应用程序,您可能需要相应地选择写策略和缓存替换策略,以获得最佳性能。要了解有关系统设计的更多信息,您可以在探索系统设计和设计数据密集型应用中找到更多信息。
我的其他帖子
系统设计面试:如何设计一个系统来处理长时间运行的作业
FAANG Ace 系统设计面试
我如何获得 6 个月的代码并获得 FAANG offer
这些都是帮我找到方工作的资源
系统设计面试准备:如何用长轮询、发布订阅和队列异步处理长时间运行的作业
系统设计面试的成功步骤
SQL(关系数据库)还是 NoSQL?the FAANG 系统设计面试
利用 Scipy 实现最小风险的投资组合优化—有效边界解释
交易策略:Python TA-Lib 技术分析
交易策略:与反向交易者进行反向测试
千禧一代对 Robinhood 的投资选择 vs. Motley Fool 股票顾问
组合风险股票投资,降低风险
交易:用熊猫计算技术分析指标🐼
用熊猫库获取交易数据🐼
在加拿大各大银行找工作?银行求职俱乐部给你洞察热门 IT 技能那里
从 CRUD web 应用开发到语音助手中的 SDE——我正在进行的机器学习之旅
全栈开发教程:将 AWS Lambda 无服务器服务集成到 Angular SPA 中
全栈开发教程:用运行在 AWS Lambda 上的无服务器 REST API 提供交易数据
全栈开发教程:在 Angular SPA 上可视化交易数据
强化学习:Q 学习简介
原文:https://towardsdatascience.com/system-design-of-url-shortening-service-b325b18c8f88?source=collection_archive---------2-----------------------
照片由 马库斯·斯皮斯克 发自 佩克斯
系统设计是软件工程中 最重要也是最令人畏惧的 方面。这个观点来自于我自己在一个建筑助理课程中的学习经历。当我开始我的助理架构课程时,我很难理解设计一个系统的想法。
一个主要原因是软件架构书籍中使用的术语一开始很难理解,并且没有清晰的逐步指南。每个人似乎都有不同的方法。
所以,我根据我学习建筑课程的经验着手设计一个系统。这是初学者系统设计系列的一部分(下面给出了链接)。对于这一个,让我们设计 URL 缩短服务。
在中,我们可以看到网址相当大,尤其是好友链接;当分享一篇文章时,我们倾向于缩短 URL。一些已知的 URL 缩短服务有 TinyURL、bit.ly、goo.gl、rb.gy 等。我们将设计这样一个网址缩短服务。
我们需要明确系统的目标。系统设计是一个如此庞大的话题;如果我们不把它缩小到一个特定的目的,那么设计系统就会变得复杂,尤其是对于新手来说。URL 缩短服务为长 URL 提供较短的别名。当用户点击缩短的链接时,他们将被重定向到原来的网址。
作者图片
在这一部分,我们决定系统的功能。我们需要关注的需求是什么?我们可以将系统需求分为两部分:
用户给出一个 URL 作为输入;我们的服务应该为该 URL 生成一个更短且唯一的别名。当用户点击较短的链接时,我们的系统应该将他们重定向到原来的链接。链接可能会在一段时间后过期。用户可以指定到期时间。我们这里不考虑用户自定义链接。
这是系统必须提供的一个需求。这是系统的主要目标。
现在是需要分析的更关键的需求。如果我们不满足这个要求,它可能对项目的商业计划有害。那么,让我们定义一下我们的 nfr:
系统应该是高度可用的。如果服务关闭,所有 URL 重定向都将失败。URL 重定向应该实时发生。没有人应该能够预测缩短的链接。
性能、可修改性、可用性、可伸缩性、可靠性等。是系统设计中一些重要的质量要求。这些‘能力’是我们分析一个系统并确定我们的系统设计是否恰当所需要的。
在这个系统中,可用性是主要的质量属性。安全性是另一个重要的属性。通常,可用性和可伸缩性是系统设计的重要特征。默认情况下,性能是重要的,没有人希望构建一个性能更差的系统,对吗?!
让我们假设,一个用户可能请求一个新的 URL,并使用它 100 次进行重定向。因此,写和读的比率应该是 1:100。所以系统的读取量很大。
我们需要在服务中处理多少 URL 请求?假设我们可能每秒收到 200 个 URL 请求。所以,一个月的计算,我们可以有 30 天* 24 小时* 3600 秒*200 =~ 500 M 的请求。
因此,每月会有* 5 亿个新的 URL 缩短请求。那么,重定向请求将是 500M * 100 = 50 亿。
要计算年份,你必须将这个数乘以 12。
让我们假设,系统将所有的 URL 缩短请求和它们的缩短链接存储了 5 年。由于我们预计每个月会有 5 亿个新的 URL,我们预计存储的对象总数将是 500 M * (5 * 12)个月= 30 B。
现在让我们假设每个存储的对象大约有 100 个字节。我们将需要 300 亿* 100 字节= 3 TB 的总存储容量。
如果我们想要缓存一些经常被访问的流行 URL,如果我们遵循 80–20 规则,这意味着我们从缓存中保留 20%的请求。
因为我们每秒有 20K 个请求,我们将得到
20K * 60 秒 60 分钟 24 小时=每天~ 17 亿**
如果我们计划缓存 20%的请求,我们将需要
0.2 * 17 亿 100 字节= 34GB 内存。*
对于系统设计的新手,请记住,“如果你对系统设计从哪里开始感到困惑,请尝试从数据流开始。”
现在,服务器端组件的主要任务之一是为输入 URL 生成唯一的键。在这里,我们的输入数据只是一个 URL。因此,我们需要将它们存储为一个字符串。输出是 URL 的另一个缩短版本。如果有人点击这个缩短的网址,它会重定向到原来的网址。现在,每个输出 URL 需要是唯一的。
例如,我们可以取一个随机缩短的网址“【rb.gy/ln9zeb】”。最后几个字符应该构成一个唯一的键。所以,我们的输入是用户给的一个长 URL。
我们需要计算输入 URL 的唯一散列。如果我们使用 base64 编码,6 个字符长的密钥将给我们 64 个^(6)= ~ 687 亿个可能的字符串,这对于我们的系统应该足够了。
问题:如果多个用户输入同一个网址,系统应该不会提供相同的缩短网址。如果一些字符串是重复的,系统会有什么行为?
解决方案:我们可以将带有递增序列号的输入 URL 附加到每个请求 URL。它应该使网址唯一。但是,序列号的溢出可能是一个问题。假设 user-id 是惟一的,我们可以将 user-id 附加到输入 URL。
在系统中,user-id 应该是唯一的,这样我们就可以计算唯一的散列。我们可以有一个独立的唯一密钥生成服务(UGS),它预先生成随机 id 并将它们存储在数据库中。
图:UGS 唯一密钥生成服务(图片由作者提供)
每当我们需要一个新的密钥时,我们可以从已经生成的 id 中选择一个。这种方法可以使事情变得更快,因为当一个新的请求到来时,我们不需要创建一个 ID,确保它的唯一性,等等。UGS 将确保所有的 id 都是唯一的,它们可以存储在数据库中,这样就不需要每次都生成 id。
因为我们需要一个字节来存储一个字符,所以我们可以将所有这些键存储在:
6(字符)* 68.7B(唯一键)~= 412 GB。
如果我们只保留 UGS 的一份拷贝,那就是单点故障。所以,我们需要做一个 UGS 的复制品。如果主服务器死了,备用服务器可以处理用户的请求。
每个 UGS 服务器都可以缓存 key-DB 中的一些密钥。它可以加快速度。但是,我们必须小心;如果一个服务器在使用完所有密钥之前就死掉了,我们就会丢失那些密钥。但是,我们可以假设,这是可以接受的,因为我们有将* 68B 个唯一的六字母键。
为了确保可用性,我们需要确保消除系统中的单点故障。数据复制将消除单点故障并提供备份。我们可以保留多个副本,以确保数据库服务器的可靠性。此外,为了实现不间断服务,其他服务器也需要副本。
在这个系统中,我们需要存储数十亿条记录。我们保存的每个对象可能小于 1 KB。一个 URL 数据与另一个不相关。因此,我们可以使用 NoSQL 数据库,如 Cassandra、DynamoDB 等。NoSQL 选择将更容易扩展,这是我们的要求之一。
为了支持数十亿个 URL,我们需要对数据库进行分区,以便将数据存储到不同的数据库服务器中。
I)我们可以根据哈希键的第一个字母对数据库进行分区。我们可以将以“A”开头的密钥放在一台服务器上,将“B”放在另一台服务器上。这被称为基于范围的分区。
这种方法的问题是它会导致不*衡的分区。例如,另一方面,以“z”开头的单词很少;我们可能有太多以字母“e”开头的 URL。
我们可以将不经常出现的字母组合到一个数据库分区中。
ii)我们还可以基于我们存储的对象的散列进行分区。我们可以采用关键字的散列来确定可以存储数据对象的分区。哈希函数将生成一个服务器号,我们将密钥存储在该服务器中。这个过程可以使分布更加随机。这就是基于散列的分区。
如果这种方法仍然导致分区过载,我们需要使用一致散列法。
我们可以缓存用户经常访问的 URL。在查询数据库之前,UGS 服务器可以检查缓存是否具有所需的 URL。那么它不需要再次进行查询。
缓存满了会怎么样?我们可能会用新的或流行的 URL 替换旧的未使用的链接。我们可以为我们的系统选择最*最少使用的(LRU)缓存回收策略。在此策略中,我们首先删除最*最少使用的 URL。
我们可以在系统的不同位置添加一个负载*衡层,在 URL 缩短服务器、数据库和缓存服务器之前。
我们可以使用简单的循环法来分配请求。在这种方法中,LB 在后端服务器之间*均分配传入的请求。这种 LB 方法实现起来很简单。如果一个服务器死了,LB 将停止向它发送任何流量。
问题:如果一个服务器过载,LB 不会停止向这个服务器发送新的请求。我们以后可能需要一个智能 LB。
如果到了 URL 的到期时间,链接会发生什么?
我们可以在数据存储中搜索并删除它们。这里的问题是,如果我们选择搜索过期的链接,将它们从我们的数据存储中删除,这会给我们的数据库带来很大的压力。
我们可以用另一种方法。我们可以定期慢慢删除过期的链接。即使一些死链接存在的时间更长,它也不应该返回给用户。
如果用户试图访问过期的链接,我们可以删除该链接并向用户返回一个错误。定期清理过程可以运行,从我们的数据库中删除过期的链接。随着存储越来越便宜,一些链接可能会留在那里,即使我们在清理时错过了。
移除链接后,我们可以将它放回数据库以供重用。
我们可以将每个 URL 的访问类型(公共/私有)存储在数据库中。如果用户试图访问他没有权限的 URL,系统会发回一个错误(HTTP 401)。
图:URL 缩短服务的最终设计(图片由作者提供)
在这个系统中,我们没有考虑 UI 部分。因为这是一个 web 服务,所以也不讨论客户端部分。唯一密钥生成是该系统的重要部分。因此,我们添加了一个额外的服务来创建和存储 URL 的唯一键。为了确保服务的可用性,我们使用了服务器复制,这样,如果一台服务器出现故障,其他服务器仍然可以提供服务。数据库也被复制以确保数据的可靠性。缓存服务器用于存储一些流行的查询,以加快延迟。并且添加了负载*衡器,以便在后端服务器之间*均分配传入的请求。
来源:钻研系统设计面试课程。
感谢您阅读本文。 过得愉快😃
本文是面向初学者的系统设计系列文章的一部分。这里是链接。
原文:https://towardsdatascience.com/system-design-proposal-for-serving-machine-learning-algorithms-best-practices-for-pipelines-for-8b14d4f6e13c?source=collection_archive---------40-----------------------
昆腾·德格拉夫在 Unsplash 上的照片
找到了。在处理一个长期难以解决的问题时,你发现了一个适销对路且有利可图的解决方案。为了简化您的纳税申报,您决定提交文件来启动您的有限责任公司。你意识到将个人和企业财务分开的重要性。如果你不能把你的财务分开,到时候报税会变得很麻烦。这个概念非常类似于为不同的环境构建管道,特别是开发/非生产和部署/生产环境。拥有这些独立环境的目的是什么?我们将在本节中介绍划分这些环境的好处。
在构建我们的数据科学解决方案的过程中,我们制定了一系列步骤来执行我们取得成功所需的操作。我们从源中提取数据,设计我们的特征,训练我们的各种模型,验证我们的源数据子集,然后上传我们的预测。虽然使用脚本构建我们的解决方案很简单,但是我们可以很快引入管道部署的复杂性。我们为什么以及如何做出这样的声明?我们在生产中使用的数据可能不同于我们在开发中使用的数据。
仅仅因为这个原因,我们需要有不同的考虑或额外的步骤来补偿这些差异。一旦我们开始考虑与数据湖同步数据,我们的数据科学解决方案不得将我们在开发中做出的预测与我们的客户将看到的数据湖同步。除了以上几点,稳定性和验证测试还会受到我们如何构建管道的影响。如果我们的管道已经合并成一个,那么创建检查来确保预期的功能将变得具有挑战性。通过遵循这些概念和思想,我们可以通过限制我们对简化我们的视野隧道和划分的关注来为我们自己节省一些“痛苦和折磨”。
在上一小节中,我们讨论了在开发和生产中运行我们的数据科学解决方案之间有两条不同管道的重要性。我们提高了管道的稳定性和可测试性。然而,如前一节所述,开发我们的管道很容易,因为我们已经在同一个脚本中集成了我们的训练和预测过程。通常,在这些情况下常见的是,布尔值被传递到软件中,以表示我们是预测我们的机器学习模型还是训练我们的机器学习模型。将两个根本不同的过程融合在一起会使数据科学代码库变得复杂,并降低软件和管道的可维护性。有软件概念和原则来增加可维护性和减少认知超载。可以应用单一责任原则来帮助使训练和预测过程更容易维护和管理。如果坚持并执行这一原则,预测管道实际上可以由五个基本操作和多达十个代码行组成。遵循这一原则减少了部署团队的每个成员需要了解的关于培训管道的内容。
感谢您阅读到目前为止!这是后续系列文章的一部分。
请保持关注!
一如既往,#快乐编码
原文:https://towardsdatascience.com/systematic-bias-in-artificial-intelligence-8698ffa20d57?source=collection_archive---------42-----------------------
数据真的有更好的想法吗?鸣谢:弗兰基·查马基
最*,詹妮弗·林肯医生做了一个抖音强调了非裔美国人在医疗保健中面临歧视的多种方式,例如接受较少的止痛药和在急诊室等待更长时间。该视频基于发表在《国家科学院院刊》( PNAS)上的研究,已在抖音获得 40 万次点击量,在推特上获得* 800 万次点击量。如果人工智能模型根据医疗记录进行训练,以预测患者的止痛药剂量,它可能会建议非裔美国人患者使用更低的剂量,因为它是在非裔美国人患者接受更低剂量的数据集上训练的。显然,这将变得非常成问题,因为这种人工智能的假设用例将进一步使种族主义制度化。
随着人工智能日益融入当前系统,系统偏差是一个不容忽视的重要风险。当模型输入的数据存在对某个种族或性别的偏见时,它们就不能有效地达到预期目的。根据准确性、利润等指标评估的模型将试图最大化所述指标,而不考虑其形成的偏差。如果不采取措施解决这个问题,更重要的是,人类或监管机构可能会对人工智能失去信心,阻止我们释放这项技术的潜力。为了理解这个问题的严重性,这里有两个更可怕的人工智能偏见的例子。
许多人工智能批评者表达的一个担忧是人工神经网络的“黑盒”性质:机器学习模型可以为我们提出的问题提供答案,但由于涉及的计算非常复杂,我们无法理解该模型如何得出答案。这种不透明性让偏见悄悄潜入。即使抛开偏见,消费者/企业也有兴趣了解人工智能是如何得出结论的。
解释人工智能如何做出高风险决策的一个潜在解决方案是可解释的机器学习。顾名思义,可解释机器学习涉及创建模型,其决策过程比黑盒模型更容易理解。为了变得可解释,这些模型被设计成具有诸如附加约束和领域专家的输入等因素。例如,防止贷款申请中的偏见的另一个约束是合规性:该模型必须遵守公*贷款法,不得歧视某一种族的消费者。
虽然可解释的机器学习模型由于其复杂性的增加而更加耗时和昂贵,但对于自动驾驶汽车、医疗保健或刑事司法等错误会产生严重影响的应用来说,可解释性层绝对是值得的。人性使社会抵制变化,但更透明的模型可以开始使公众/政府更容易接受人工智能的广泛采用。
其他潜在的解决方案关注模型使用的数据,而不是模型如何使用数据。一种提议的方法涉及获取通常保持机密的大型数据集(例如医疗数据)并在删除个人身份信息后向公众发布。这个想法是偏见将在这些匿名数据集中被过滤掉。然而,这种策略有其自身的风险,因为黑客可以交叉引用数据,使其通过匿名层。与此同时,有意识地纳入代表性不足的人群将支持缺乏多样性的数据集。最后,在设计这些算法的工程师中培养多样性应该有助于对抗偏见。
随着人工智能的快速发展,主动打击偏见仍然是当务之急。
[1] Cynthia Rudin,停止解释高风险决策的黑盒机器学习模型,转而使用可解释的模型,《自然》
[2]克里斯托夫·莫尔纳尔,可解释机器学习,Github
[3]朱丽亚·德雷塞尔,《预测累犯的准确性、公*性和限度》,科学进展
感谢阅读!
我是 Roshan,16 岁,对人工智能的应用充满热情。如果你对人工智能更感兴趣,可以看看我关于人工智能在医疗保健中的应用的文章。
在 Linkedin 上联系我:https://www.linkedin.com/in/roshan-adusumilli/
原文:https://towardsdatascience.com/systematically-pricing-financial-options-with-black-scholes-4998c591ccbd?source=collection_archive---------21-----------------------
M. B. M. 在 Unsplash 上拍摄的照片
金融市场上交易的普通金融期权有两种:美式期权——你可以在行权日之前的任何时候行使期权——以及欧式期权——你必须等到行权日才能行使期权。
“美国”和“欧洲”这两个名字实际上与期权的交易地点或公司的国籍无关。如果股票支付股息,并且行权日之前的时间包括除息日,那么这两种期权的估值将会有很大的不同——此时购买股票将不再授予你获得股息的权利。
Black-Scholes 假设了欧式期权,但它也可以用于不支付股息的美式期权。
获得诺贝尔奖的原始 Black-Scholes 公式指出,看涨期权的价格取决于股票现货价格 S 的函数的累积正态分布(此处用 N、表示)、以 K 值(等于执行价格)交易的无风险债券的现值、股票年化回报的波动率以及从今天到行权日的时间除以一个财政年度的天数(此处用 t 表示)
布伦娜·托里诺
如果你想知道更多关于公式推导的信息,这里有一个非常好的资源。在本文中,我将更多地关注公式的系统应用。
为了计算我们从期权中的潜在收益,我们需要一年(在本例中,2018 年 6 月 12 日至 2019 年 6 月 12 日)股票价格的历史数据和期权当前交易价格水*的数据,以便我们可以比较我们的结果。
历史数据可以从雅虎财经获取:进入历史数据下载一年的数据集。
首先,我们需要计算输入布莱克-斯科尔斯模型的波动率。传统上,我们使用股票年回报率的波动率,计算如下:
最后一行将检索股票行权日期为 7 月 24 日的看涨期权数据表。
下面是本文开头描述的相同的 Black Scholes 公式,但是现在用一个名为 black_scholes 的 Python 函数表示。请注意,无风险债券的现值公式就是债券价格 K 除以(1 +无风险利率)的时间分数的幂 T,,我们使用 Python 函数 cdf 来计算变量 d1 和 d2 的累积分布函数值。
计算出波动率(金融市场天数的*方根乘以年化回报的标准差)后,我们可以对我们目前拥有的所有执行价格进行估计。在特斯拉的案例中,我们有 35 种不同的看涨期权执行价格。
对于每个执行价格,我们输入股票的现货价格(目前为 972.84),循环遍历数据框 r,中的执行价格,我使用的无风险利率是 10 年期美国国债收益率,目前为 0.69%。
我们输出数据框 df_estimate ,我们可以用它来计算 Black Scholes 模型的估计值与期权在市场上的实际交易价格有多接*:
布莱克·斯科尔斯正确预测了期权的市场价值吗?
我们的*均估计误差为 0.49%,标准差为 2.46 个百分点。我们的中位数更有希望达到 0.29%左右。我们的标准差似乎仍然有点高,但仔细观察数据集,我们可以看到有几个合约今天根本没有交易,这扭曲了数据集,因为这些价格没有高度更新。
如果我们只包括今天至少交易过一次的合约:
对于估计误差,我们实际上可以产生更好的结果:
这里,我们有一个-0.13%的*均估计误差,这意味着与我们的估计相比,期权价格*均低估期权 0.13%,我们的标准差减少到只有 1.8 个百分点。
出于好奇,让我们分析一下布莱克·斯科尔斯误差超过 1%的几份合同:
大多数合约的交易量都很小,在股市交易日只交易一次。然而,4 号合约具有 1.4%的估计误差,具有 21 个合约和 466 个未*仓权益的高容量。执行价格在 850,这意味着如果股票价格高于 850+174.65 = 1021.65 美元,它将获利,而目前股票交易价格为 972.84 美元。在大约 31 个股市交易日中,这只上涨了 5.325%,这对特斯拉来说并不是一个困难的壮举。
我们的估计略低,但差异的一个原因可能是这些期权的非常大的价差,做市商以 6%的无风险利润退出。这表明,目前 7 月 24 日特斯拉期权的风险要高得多,考虑到这些交易的低交易量和行权日期的临*,这是有道理的。
雅虎金融期权数据的一个重要壮举是,它向我们展示了期权价格的隐含波动率,这可以通过从期权交易价格开始反向求解波动率的布莱克-斯科尔斯方程来计算。对于这个分析,我没有使用隐含波动率作为输入,因为我想比较市场参与者如何对期权定价与布莱克-斯科尔斯模型的估计。
隐含波动率是前瞻性,意思是它可以给我们一个感觉,交易者目前在期权中定价了多少未来波动率,T5,如果交易者是理性的 。当谈到隐含波动率时,最后一个假设很重要,因为其他因素,如行为经济学(由于这种信念,特斯拉是市场上最被做空的股票),当前疫情期间的非理性避险情绪,以及其他外部因素,都可以在期权定价中发挥作用,但不一定反映股票的预期波动率。
原文:https://towardsdatascience.com/systematically-tuning-your-model-by-looking-at-bias-and-variance-4986662315b2?source=collection_archive---------48-----------------------
作为数据科学家,我们在建立一个模型的时候经常会面临很多决策,比如用哪个模型、它应该有多大、需要多少数据、增加多少特征或者使用还是不使用正则化。虽然一些决策可以相对快速地进行评估,但其他决策(如收集更多数据)可能需要几个月的时间,然后才发现没有帮助。
在这篇文章中,我将实际演示一种基于观察偏差和差异做出这些决策的方法,这种方法改变了我在几乎每个项目中进行的方式。
由 Valentin Salja 在 Unsplash 上拍摄的照片
许多人在调整他们的模型时犯的错误是,他们只关注他们的验证错误。虽然这最终是最重要的数字(除了测试误差),但同时观察训练误差可能会给你几个提示,告诉你该如何使用你的模型。
偏差和方差可能有不同的更正式的定义,但实际上是这样的:
偏差是训练集的错误率(1-训练精度)
方差是验证集上的模型与训练集相比差多少的比率(训练精度-验证精度)
我将用一个实际的例子来说明这些概念的重要性。
让我们首先创建一个数据集,我们将使用它来训练和评估我们的模型。
我将使用 sklearn 的 make_classification 来完成这项工作,然后将数据集分成训练集和验证集。
接下来,我们将开始使用 Keras 创建一个相对较小的神经网络,并在我们的数据集上训练它。
经过训练的模型得到以下结果:
我们可以看到,我们的模型有一个非常高的偏差,同时有一个相对较小的方差。这种状态俗称欠配合。
有几种方法可以减少偏差,让我们脱离这种状态:
增加模型的尺寸
添加更多功能
减少正则化
让我们试试增加模型大小来减少偏差的方法,看看会发生什么。
为了做到这一点,我增加了每个隐藏层中神经元的数量。
我们更大的模型得到以下结果:
正如你所看到的,我们已经成功地减少了模型的偏差。事实上,我们已经完全消除了它,但是,现在方差增加了。这种状态俗称过拟合。
减少模型方差的方法有:
减小模型的尺寸
减少功能数量
添加正则化
添加更多数据
让我们这次尝试通过引入一些正则化来减少方差。
我以 Dropout(训练时随机忽略一组神经元)的形式将正则化添加到每一层。
我们新模型的结果是:
完美!我们现在非常接*一个最优状态,具有相对较低的偏差和相对较低的方差,这正是我们的目标。如果我们现在看看我们的验证误差(1-验证准确性或偏差+方差),这是迄今为止最低的。
也许你已经注意到,在最后一个场景中,与场景#2 相比,偏差又增加了一点。你也可以看到减少偏差和减少方差的方法是完全相反的。这种特性称为偏差-方差权衡,如下图所示:
偏差-方差权衡|作者图片
基本上,我们试图找到偏差和方差之间的*衡,即最小化总误差。
我们经历了基于偏差和方差调整模型的 3 种不同场景,以及可以采取的相应步骤。
可能存在第四种情况,即高偏置和高方差,这还没有被涵盖。然而,这通常意味着你的数据有问题(训练和验证分布不匹配,噪音数据等。),因此,很难给你一个确切的指导方针。
我希望这种方法能帮助你在项目中区分任务的优先级,并最终为你节省一些时间。
我用的所有代码都可以在 GitHub 上找到。
灵感来自吴恩达对机器学习的向往。
[## 主动学习能节省多少时间?
towardsdatascience.com](/how-much-time-can-you-save-with-active-learning-b4886f5da462) [## 零射击学习字母字符(代码实验)
towardsdatascience.com](/zero-shot-learning-the-alphabetic-characters-an-experiment-with-code-d1a0f23f4b4c)
原文:https://towardsdatascience.com/t-distributed-stochastic-neighbor-embedding-t-sne-bb60ff109561?source=collection_archive---------7-----------------------
在本文中,您将了解到:
如果一个数据集中有数百个特征或数据点,并且希望在二维或三维空间中表示它们,该怎么办?
两种常见的技术在保留数据集中大部分信息的同时降低了数据集的维度是
什么是 PCA 和 t-SNE,两者有什么区别或相似之处?
PCA 和 t-SNE 都是无监督的降维技术。这两种技术都用于将高维数据可视化到低维空间。
T-分布式随机邻居嵌入(t-SNE) 是由 Laurens van der Maaten 和 Geoffrey Hinton 开发的一种用于可视化的无监督机器学习算法。
t-SNE 是如何工作的?
第一步:在高维空间中寻找相邻点之间的成对相似性。
t-SNE 将数据点 xᵢ和 xⱼ之间的高维欧几里德距离转换成条件概率 P(j|i)。
D 高维空间中的数据(图片由作者提供)
xᵢ会根据以 xᵢ.点为中心的高斯分布下 xⱼ的概率密度比例来选择它作为邻居
σᵢ是以数据点 xᵢ为中心的高斯方差
一对点的概率密度与其相似度成正比。对于附*的数据点,p(j|i)将相对较高,而对于相距较远的点,p(j|i)将非常小。
将高维空间中的条件概率对称化,得到高维空间中的最终相似度。
条件概率通过对两个概率进行*均来对称化,如下所示。
对称化条件概率
步骤 2:基于高维空间中的点的成对相似性,将高维空间中的每个点映射到低维映射。
低维图将是二维或三维图
D 低维空间中的数据(图片由作者提供)
yᵢ和 yⱼ是高维数据点 xᵢ和 xⱼ.的低维对应物
我们计算条件概率 q(j|i ),类似于以点 yᵢ为中心的高斯分布下的 p(j[I ],然后对称化该概率。
步骤 3:使用基于 Kullback-Leibler 散度(KL 散度)的梯度下降,找到最小化 Pᵢⱼ和 qᵢⱼ之间不匹配的低维数据表示
Pᵢ 代表点 xᵢ.在所有其他数据点上的条件概率分布 Q ᵢ 表示给定地图点 yᵢ的所有其他地图点上的条件概率分布
t-SNE 使用梯度下降优化低维空间中的点。
为什么用 KL 发散?
当我们最小化 KL 散度时,它使得 qᵢⱼ在物理上等同于 Pᵢⱼ,因此高维空间中的数据结构将类似于低维空间中的数据结构。
基于 KL 散度方程,
第四步:使用 Student-t 分布计算低维空间中两点之间的相似度。
t-SNE 使用一个自由度的重尾 Student-t 分布来计算低维空间中两点之间的相似性,而不是高斯分布。
t 分布在低维空间中创建点的概率分布,这有助于减少拥挤问题。
如何在数据集上应用 t-SNE?
在我们用 python 写代码之前,让我们了解一些我们可以使用的 TSNE 的关键参数
n _ components:嵌入空间的维度,这是我们希望高维数据转换成的较低维度。二维空间的默认值为 2 。
困惑度:困惑度与 t-SNE 算法中使用的最*邻的数量有关。较大的数据集通常需要较大的困惑度。困惑度的值可以在 5 到 50 之间。 默认值为 30。
n_iter:优化的最大迭代次数。至少应为 250,默认值为 1000
learning _ rate:t-SNE 的学习率通常在[10.0,1000.0]范围内,默认值为 200.0。
我们将使用 sklearn.decomposition.PCA 应用 PCA,并在 MNIST 数据集上使用 sklearn.manifold.TSNE 实现 t-SNE。
加载 MNIST 数据
导入所需的库
获取 MNIST 训练和测试数据,并检查训练数据的形状
创建一个包含大量图像和图像中像素计数的数组,并将 X_train 数据复制到 X
混洗数据集,取 10%的 MNIST 训练数据并将其存储在数据框中。
在数据准备好之后,我们可以应用主成分分析和 t-SNE。
使用来自sk learn . decomposition .的 PCA 库应用 PCA
PCA 生成两个维度,主成分 1 和主成分 2。将两个 PCA 成分连同标签一起添加到数据框中。
只有可视化时才需要标签。
绘制 PCA 结果
导入 t-SNE 和可视化所需的库
首先使用默认参数创建一个 TSNE 实例,然后将高维图像输入数据放入嵌入空间,并使用 fit_transform 返回转换后的输出。
图像数据的维数应该是(n _ 样本,n _ 特征) 的形状
将标注添加到数据框中,这将仅在绘制时使用,以便为聚类添加可视化标注。
函数来可视化数据
可视化 MNIST 数据集的 SNE 结果
尝试不同的参数值并观察不同的图
不同困惑值的可视化
n _ ITER 不同值的可视化
我们可以看到,从 t-SNE 图生成的聚类比使用 PCA 生成的聚类更加明确。
代码在这里可用
主成分分析和 t-SNE 是两种常见的降维方法,它们使用不同的技术将高维数据降维为可以可视化的低维数据。
[## sk learn . manifold . tsne—sci kit-learn 0 . 23 . 2 文档
scikit-learn.org](https://scikit-learn.org/stable/modules/generated/sklearn.manifold.TSNE.html)
由劳伦斯·范·德·马滕和杰弗里·辛顿使用 t-SNE 可视化数据。
[## t-SNE
lvd maten . github . io](https://lvdmaaten.github.io/tsne/)
原文:https://towardsdatascience.com/t-shaped-skills-builder-guide-in-2020-for-end-to-end-data-scientist-33d2652511b0?source=collection_archive---------20-----------------------
由我设计
我父亲过去常说,如果一个人专攻一个领域,他就会很富有。对他这一代人来说,成为某个特定领域的专家将保证事业成功。几十年前,当我们还生活在信息时代,互联网还没有像今天这样普及时,信息是珍贵的,人们试图在非常有限的资源内逐个收集知识。那时,只有当他们频繁接触工作时,他们才能获得更多的信息和经验,因为他们几乎找不到可以快速学习的额外信息来源。这些专家因此成为公司的宝贵财富,没有人可以取代他们的角色。专注于一件事是他们独特的价值观,因此这有助于确保他们的工作以及确保事业蒸蒸日上。二十年前很难找到一个 Java 开发者,那时大学还在学士课程中教授 Pascal 或 C 语言,Coursera、Udemy 或 YouTube 还没有成立。这些开发人员经常获得极高的薪水,他们构建了我们现在所说的传统系统。每当我接触这些系统,我真的很尊重制造商。
如今,信息随处可见,不再是一个秘密,公司不再那么依赖拥有高度专业技能的员工。相反,该行业需要更多有能力根据这些大量信息进行总结、分析和决策的人。我们现在生活在概念时代,我们不仅拥有比以往更多的数据,而且面临更复杂的问题,需要综合技能和多学科来提供完整的端到端解决方案。这种趋势目前正在包括数据科学在内的所有行业迅速采用,这就是为什么公司现在需要更多独角兽或 T 型数据科学家来解决他们复杂的业务问题。换句话说,数据科学家应该在 T 形的横条(宽度)上拥有多样化的技能,同时在竖条(深度)上成为特定领域的专家。
基于我作为一名数据科学家非常有限的经验,我想为那些想成为数据科学领域 T 型人的人分享一个基本的构建者指南。
专家
成为某一方面的专家并不意味着你必须深入了解某一特定领域,事实上,你不应该太深入。时间是有限的资源,每个人每天都有同样的 24 小时。当你太专注于学习一项技能时,你将没有足够的时间去探索行业所需的各种技能。你能做的是建立一个核心知识,并在此基础上发展其他技能。
作为一名数据科学家,你应该知道关于统计和数学的基础知识(代数是必须的,可能还会有一点微积分)。统计学将为假设检验和理解数据特征提供工具,而微积分是分析数据变化或趋势的工具。没有统计学和微积分的相关知识,你将无法理解你的预测的置信区间和神经网络的消失梯度。
除了统计学和数学,尝试让自己熟悉一些机器学习模型,如分类、聚类和回归。他们将介绍机器学习的不同分支的概述,以便您可以为您的特定业务问题选择合适的模型类型。此外,您还可以了解一些高级的 ML 模型,如 Random Forest 和 XGBoost,因为它们是可解释的模型,非常准确,广泛用于大多数使用 ML 的常见问题。
深度学习将是一个加号。然而,由于最*没有关于神经网络架构的破坏性探索,并且每个网络结构的用例已经建立了多年,所以你应该认为自己是一名在应用这些模型解决实际业务问题方面经验丰富的人工智能从业者。此外,关于人工智能及其应用的信息现在在互联网上无处不在,因此你可以快速找到要使用的模型。有些甚至提供了代码和微调说明,假设你已经有了基本的知识。这里的问题是,当你坐在大学里时,你不会有足够的时间掌握所有这些领域。因此,你需要第二个核心技能:研究。
大多数数据科学家团队都是根据业务需求组建的,以解决业务问题为导向。他们必须为每种类型的问题提供非常具体的解决方案,因此团队必须拥有具备不同技能的人员来处理公司分配的任何任务。然而,他们通常不知道业务问题,因此也不知道需要事先学习的技能。换句话说,它必须在飞机上学习。在这种情况下,研究技能变得极其重要,因为它会帮助你快速、准确地了解事情,足以解决问题。例如,如果由于对变量类型的严格要求,项目要求您用 Typescript 编写代码,那么您将不得不学习 Typescript,即使您对 Python 更有信心。或者,如果企业主要求您构建一个 web 应用程序来为用户提供您的推荐模型,那么您将不得不学习 ReactJS 或 Angular,尽管您对前端开发的了解有限。
当然,你不可能在一两周内成为打字稿或前端开发的专家。然而,你可以交付一个完整的端到端解决方案,带来商业价值,而不是一个高度精确的模型,但没有人可以使用。
学习“如何学习”是最难的科目,没有人能教你。尽管流行的研究方法有一些共同的做法,但每个人的思维路径都是独特的,因为他们有不同的能力,生活条件,教育甚至习惯都会影响他们的思维方式。因此,人们以许多不同的方式学习,找到学习事物的最佳方式是你自己的冒险。这项技能将有助于拓展你在 T 型单杠上的技能组合,最终有助于你事业的成功。
多面手
随着核心知识的积累,你在机器学习和研究方法方面已经足够专业,然后你可以开始扩展技能集,成为多面手。你可以把 T 字横线上的这些技能想象成用来连接充电器和设备的不同类型的电缆。你有越多类型的连接器(微型 USB、USB-C 或 Lightning),你就有越多类型的设备可以充电。换句话说,作为多面手,你掌握的技能越多,你能涉足的行业就越多。以下是对在生产中使用数据的数据科学家有用的一些基本技能。
虽然“快速失败,经常失败”是数据科学中敏捷开发的关键概念,但如何从失败中立即恢复是团队应用敏捷所需要的。毕竟,您不希望您的应用程序经常失败,并且在事件发生后需要几个小时才能恢复。尽管自 1957 年初以来就出现了迭代和增量开发,但敏捷如今如此受欢迎的原因之一是,它现在得到了多种技术的支持,如容器、微服务、Kubernetes、持续集成/持续部署(CI/CD)和云计算。这些技术使系统更健壮,更容易出错,这样团队就可以从崩溃整个应用程序的恐惧中解放出来。本地系统几乎无法实现这些功能,并且通常需要昂贵复杂的硬件和软件配置。当公司无法快速扩展其系统并在团队中共享计算资源时,计算性能是另一个问题。
我曾经有机会在一个使用本地服务器的数据分析团队中工作,我可以确认这些难题是真实存在的。我的前半个工作日通常花在运行数据库查询和等待结果返回上。直到我把所有的数据转储到我的工作空间,我才能开始处理和分析它。有时,我的队友运行计算密集型查询和代码,使服务器挂起几个小时。然后,他们必须联系 DBA 来终止查询,并在下班后服务器不忙时运行查询。在这种情况下,如何快速测试您的假设并迭代数据科学流程?幸运的是,团队中的人都很聪明,他们都有办法以这样或那样的方式克服问题,完成工作。然而,这真的让他们慢了下来。
谷歌云*台(图片来源:博客。谷歌
云环境是解决上述所有问题的良方,因为它具有高可用性和可扩展性。该环境也是可复制的,因此即使整个系统崩溃,您也可以用最少的努力来重新创建它。此外,containers orchestration 解决方案将持续检查每个服务器(微服务)的健康状况,如果一个服务器出现故障,它将在几秒钟内自动启动一个新的服务器。您可以放心地测试您的代码和想法,而不必担心会导致应用程序崩溃的未知错误。如果您需要更多的计算能力,云计算实例也将自动扩展。
信不信由你,大多数公司都在努力寻找他们在云上的家,特别是当人们到处都在谈论数字化转型时,当前的疫情甚至增加了企业领导者将他们的公司转型为几乎百分之百数字化或数字化双胞胎的压力。因此,强烈建议拥有一两个云*台的一些经验。
你有一个非常精确的模型。现在怎么办?你不能仅仅使用 Jupyter Notebook,通过手动将看不见的观察结果输入笔记本并重新运行来服务数百个用户。相反,您应该将您的 ML 模型公开为一个服务,或者换句话说,一个 API。这里的意思是,您有一个服务器正在运行并接受预测请求。你所要做的就是发送一个带有未知数据的 HTTP 请求,服务器会自动返回一个预测值。
下面是一些流行的 Python web 框架,可以用来构建后端。
顶级 Python Web 框架(从 Google 搜索中获取)
你也可以在这里 (要学习的 10 大 Python Web 框架)阅读更多关于这些框架的内容。
请记住,这个列表中有两种类型的 web 框架:全栈和非全栈。如果你决定用微服务架构来构建你的应用,那么我会推荐你使用非全栈框架,比如 Flask,因为它灵活、轻量、容器友好。
有了后端之后,你的模型现在变成了一个活的服务。但是,您不希望用户输入一个很长的请求 URL 来获得预测结果。
你需要一个用户界面。
照片由哈尔·盖特伍德在 Unsplash 上拍摄
您应该知道一个前端框架来帮助您构建与后端通信的 UI。例如,如果您正在构建一个 web 应用程序来预测鸢尾花的种类,那么 UI 可能有四个输入框来获取萼片长度、萼片宽度、花瓣长度、花瓣宽度的用户输入,并有一个提交按钮来获取预测结果。在用户点击提交按钮后,前端将使用给定的参数构造请求 URL,并将其发送到模型服务的后端。之后,后端将回应预测的花卉品种,然后可以在前端显示。
React、Vue.js 和 Angular 是我写这篇文章时最流行的三个框架,你应该选择其中一个来学习。
React,Vue.js 和 Angular(图片来源: Hackernoon )
Docker-Kubernetes 在一起(由来自 Docker 博客的大卫·弗里德兰德插图)
在其他机器或云*台上运行您的代码时,环境依赖性是一个常见的问题,在软件工程中,容器被广泛用于解决这个问题。具体来说,代码和运行代码所需的必要组件都装在一个叫做容器的封闭盒子里。然后,可以将该容器部署到任何地方运行,而不用担心依赖性问题。
每个容器都可以被看作是一个微服务,执行一个更大架构的简单功能,如果一个服务被关闭,它不应该在系统中产生大的中断,恢复时间应该是最小的。考虑到这一点,熟悉 Docker 容器是你应该放在简历上的一项基本技能。
容器编排管理容器的生命周期,并确保*台上运行的每个服务的可用性。例如,您可能希望三个模型同时在线(副本),这样,如果一个模型出现故障,另外两个模型仍然可以为用户服务。它还可以执行其他任务,如负载*衡,以帮助利用所有可用的副本并提高*台性能。对于容器编排,您应该将 Kubernetes 添加到您希望学习的技能列表中。
图片来源: Katalon 博客
如果一个模型被重新训练或更新以包含一个新的特性,它应该在后端被更新,这个任务应该被自动完成以避免人为错误并缩短更新周期以获得一个真正的敏捷体验。为了使其无缝,并在为容器推出较新的机器学习模型时减少人力,建议使用 CI/CD(持续集成和持续部署)管道。
可以建立 CI/CD 管道来执行以下任务:重新训练模型,将较新的模型提交到 Git repo 中,自动测试和部署 ML 模型,等等。一些流行的 CI/CD 解决方案有 Travis CI、Jenkins 和 Gitlab CI,我个人更喜欢最后一种,因为它在一个*台中包括 Git repo 和 CI/CD 管道。
最后,作为一名数据科学家,你应该始终保持开放的心态,不要陷入偏见的陷阱,不让自己探索更有价值的见解。换句话说,不要轻易接受结果,轻易下结论。
让我们以著名的亚伯拉罕·瓦尔德和《琼斯母亲》中缺失的弹孔来结束这个故事。
回到第二次世界大战期间,英国皇家空军在德国防空炮火下损失了很多飞机。所以他们决定给他们穿上盔甲。但是盔甲放在哪里呢?显而易见的答案是观察执行完任务返回的飞机,统计各个地方的所有弹孔,然后在吸引最多火力的地方增加装甲。
显而易见却是错误的。正如匈牙利出生的数学家亚伯拉罕·瓦尔德当时解释的那样,如果一架飞机安全返回,即使它的机翼上有很多弹孔,这意味着机翼上的弹孔不是很危险。你真正想做的是武装那些*均来说没有任何弹孔的区域。
照片来自琼斯妈妈——违反直觉的世界
为什么?因为那些地方有弹孔的飞机再也回不来了。这就是为什么你在返回的子弹上看不到任何弹孔。聪明!
(来自琼斯妈妈)
特色图像中使用的图标的属性
原文:https://towardsdatascience.com/t-sne-behind-the-math-4d213b9ebab8?source=collection_archive---------27-----------------------
作为*年来谈论最多的降维算法之一,特别是对于可视化来说,我想我应该花一些时间来帮助其他人发展对 t-SNE 实际上在做什么的直觉。
由 Laurens van der Maatens 和 Geoffrey Hinton 于 2008 年开发的t-Distributed random Neighbor Embedding与主成分分析(PCA)不同,它是一种非线性方法,用于在人类可解释的维度(如 2D 或 3D)中可视化高维数据。
虽然主成分分析试图通过点的线性投影找到具有最大变化量的维度,但 PCA 有时无法在非线性情况下保持数据的内部结构,如正弦和圆柱关系。t-SNE 通过保存数据的内部结构克服了这一点。
t-SNE 试图保持点的邻域,即使它们是从高维转换到低维。该算法计算出彼此靠*的点和较远的点。邻域,即具有彼此接*的点的聚类被保留,并且即使存在多个聚类,这也保持良好。但是,变换后不会保留簇之间的距离。
SNE 霸王龙在做什么?
SNE 霸王龙试图找出这些点的相似程度,并根据相似程度对它们进行分组,因此能够保留数据的内部结构。
请看下图,t-SNE 计算出了点与点之间的距离,并将较*的点组合成较低维度的簇。
图一。使用 t-SNE l 从 2D 到 1D 的降维
SNE 霸王龙是怎么做到的?
对于一个查询点,假设是红色聚类中的一个点(图 1),测量所有点之间的距离,并沿着学生的 T 分布绘制,该分布类似于高斯曲线,但具有更高的尾部。t 分布能够更好地区分相对于查询点更远的点,因为它们的尾部更高。
以查询点为中心,测量每个点相对于其他点的距离。一个点离查询点越远,它的距离就会远离曲线的峰值。位于峰值附*的点将被认为是查询点的邻居。
图 2: t-SNE 嵌入查询点的邻居
图 2 显示了 t-SNE 是如何计算出红色星团邻域的。对所有点重复这一过程,以找出多个聚类。
使用 Python 的 PCA vs t-SNE
我使用了 MNIST 的数据进行比较。MNIST 数据包括各种手写数字图像,有利于光学字符识别。
图 3:执行 PCA 的代码
PCA 能够将 784 维数据转换成 2 维数据,但是可视化这是相当困难的。这些数字无法清楚地区分。
图 MNSIT 数据上的 PCA |[图片由作者提供]
现在让我们试着用 SNE 霸王龙来想象。它应该能够比 PCA 更好地将相似的数字组合在一起。
图 5:执行 t-SNE 的代码
下面(图 6)是 t-SNE 的图,它比主成分分析更好地聚类了各种数字,我们可以清楚地看到哪个聚类属于哪个数字。
图 6: t-SNE 在 MNSIT 数据上|[图片由作者提供]
SNE 霸王龙在哪里使用?
t-SNE 广泛用于高维数据的可视化,t-SNE 的一些应用领域如下:
1.癌症研究、生物信息学和音乐分析是 t-SNE 广泛用于可视化相似性和不可区分性的领域。
2.它广泛应用于图像处理、自然语言处理、基因组数据和语音处理中,用于从高维数据中获取相似性。
t-SNE 的谬论
1.作为一种随机算法,t-SNE 算法的结果在每次运行时都是不同的。
2.尽管 SNE 霸王龙能够保留数据的本地结构,但它可能无法保留数据的全局结构。
3.困惑度是邻域中要考虑的邻居数量,应该小于点数。理想情况下,范围从 5 到 50。
4.t-SNE 发现随机噪音的邻居,以及在低困惑,可以被误解。
参考文献
原文:https://towardsdatascience.com/t-sne-clearly-explained-d84c537f53a?source=collection_archive---------1-----------------------
资料来源:K. Movahedi,Y. Saeys,http://www.brainimmuneatlas.org/tsne-cp-irf8.php
你们很多人已经听说过像 PCA 这样的降维算法。其中一种算法叫做t-SNE(t-分布式随机邻居嵌入)。它是由劳伦斯·范德·马滕和杰弗里·辛顿在 2008 年开发的。你可能会问“我为什么要在乎?我已经知道 PCA 了!”这将是一个很好的问题。t-SNE 是一种叫做非线性降维的东西。这意味着这个算法允许我们分离不能被任何直线分离的数据,让我给你看一个例子:
线性不可分数据,来源:https://distill.pub/2016/misread-tsne/CC-BY 2.0
线性不可分数据,来源:https://distill.pub/2016/misread-tsne/CC-BY 2.0
如果你想玩这些例子,去访问蒸馏。
可以想象,当通过 PCA 解析时,这些例子不会返回任何合理的结果(忽略将 2D 解析为 2D 的事实)。这就是为什么至少知道一种处理线性不可分数据的算法是很重要的。
你需要记住,t-SNE 是迭代的,所以与主成分分析不同,你不能将它应用于另一个数据集。PCA 使用全局协方差矩阵来减少数据。您可以获得该矩阵,并将其应用于一组新数据,得到相同的结果。当您需要尝试减少您的特征列表并重用从训练数据创建的矩阵时,这很有帮助。t-SNE 主要用于理解高维数据,并将其投影到低维空间(如 2D 或 3D)。这使得它在处理 CNN 网络时非常有用。
让我们从 t-SNE 的 SNE 部分开始。我更擅长直观地解释事物,所以这将是我们的数据集:
它有 3 个不同的类别,你可以很容易地将它们区分开来。该算法的第一部分是创建一个表示邻居之间相似性的概率分布。什么是“相似”?原文陈述“数据点 xⱼ 到数据点 xᵢ 的相似度是条件概率 p_{j|i} ,即 xᵢ 会选择 xⱼ 作为其邻居”。
我们从数据集中挑选了一个点。现在,我们必须选择另一个点,并计算它们之间的欧几里得距离|xᵢ-xⱼ|
原始论文的下一部分指出,在以 xᵢ.为中心的高斯分布下,它必须与概率密度成比例因此,我们必须生成在 xᵢ 、处具有*均值的高斯分布,并将我们的距离放在 x 轴上。
现在你可能想知道 σ (方差),这是一件好事。但是让我们暂时忽略它,假设我已经决定了它应该是什么。计算完第一个点后,我们必须对每一个点做同样的事情。
你可能会想,我们已经完成了这一部分。但这只是开始。
在这一点上,我们的集群被紧紧地束缚在它的组内。如果我们有一个这样的新集群会怎么样:
我们应该能够应用与以前相同的过程,不是吗?
我们还没完。您可以区分相似点和非相似点,但是概率的绝对值比第一个示例中的要小得多(比较 Y 轴值)。
我们可以通过将当前投影值除以投影总和来解决这个问题。
如果你应用于第一个例子,看起来会像这样:
对于第二个例子:
这会缩放所有值,使其总和等于 1。这里很好的提一下,p_{i|i}设置为等于 0,而不是 1。
如果我们取两个点并试图计算它们之间的条件概率,那么 p_{i|j}和 p_{j|i}的值将是不同的:
这是因为它们来自两个不同的发行版。那么我们应该选择哪一个来计算呢?
其中 N 是维数。
现在,当我们将所有东西都缩放到 1(是的,所有的总和等于 1)时,我可以告诉你,我对你的过程并不完全诚实:)计算所有这些对算法来说将是非常痛苦的,这并不是 t-SNE 论文中的确切内容。
这是一个计算 p_{j|i}的原始公式。我为什么要骗你?首先,因为更容易对它的工作原理有一个直觉。第二,因为无论如何我都要向你展示低谷。
如果你看看这个公式。你可以发现我们的
是
如果我直接向您展示这一点,将很难解释 σ 的来源以及它与我们的集群之间的依赖关系。现在你知道方差取决于高斯和围绕它中心的点数。这就是困惑值来的地方。困惑或多或少是我们中心点的目标邻居数。基本上,困惑度越高,方差的值就越高。我们的“红色”组彼此靠*,如果我们将困惑度设置为 4,它会搜索合适的值来“适应”我们的 4 个邻居。如果你想更具体一些,你可以引用原文:
SNE 对西格玛的值进行二分搜索法,产生具有用户指定的固定困惑度的概率分布
在哪里
就是香农熵。但是,除非您想自己实现 t-SNE,否则您唯一需要知道的是,您选择的困惑与mu_i μi 的值正相关,并且对于相同的困惑,您将有多个不同的mu_i μi ,基于距离。典型的困惑值范围在 5 到 50 之间。
当你看这个公式的时候,你可能会注意到我们的高斯转换成
让我给你看看这是什么样子:
如果你玩一会儿 σ ,你会注意到蓝色曲线保持固定在点 x =0。只有当 σ 增加时,它才会拉伸。
这有助于区分邻居的概率,因为你已经理解了整个过程,你应该能够调整它到新的值。
t-SNE 的下一步是用与原始空间相同数量的点创建低维空间。点应该随机分布在一个新的空间。该算法的目标是在低维空间中寻找相似的概率分布。对于新分布,最明显的选择是再次使用高斯分布。不幸的是,这不是最好的主意。高斯的特性之一是它有一个“短尾巴”,正因为如此,它产生了一个拥挤问题。为了解决这个问题,我们将使用单自由度的学生 t 分布。关于如何选择这种分布以及为什么高斯分布不是最佳方案的更多信息,你可以在的论文中找到。我决定不在这上面花太多时间,让你在合理的时间内阅读这篇文章。所以现在我们的新公式看起来像:
而不是:
如果你是更“视觉化”的人,这可能会有帮助(X 轴上的值是随机分布的):
使用学生分布正是我们所需要的。它“下落”很快,而且有一条“长尾”,所以各个点不会被挤成一个点。这次我们不用为 σ 费心了,因为 q_{ij}公式里没有。我不会生成计算 q_{ij}的整个过程,因为它的工作原理和 p_{ij}完全一样。相反,只留下这两个公式,直接跳到更重要的事情上:
为了优化这种分布,t-SNE 使用条件概率 p_{j|i}和 q_{j|i}之间的 Kullback-Leibler 散度
我在这里不讨论数学,因为它不重要。我们需要的是的导数(它在原文内的附录 A 中推导)。
你可以把这个梯度看作点与点之间的排斥和吸引。为每个点计算一个梯度,并描述它应该被拉动的“力度”以及它应该选择的方向。如果我们从随机 1D *面开始,对之前的分布进行梯度计算,结果应该是这样的。
Ofc。这是一种夸张。SNE 霸王龙跑得没那么快。我跳过了很多步骤来加快速度。除此之外,这里的值并不完全正确,但足以向您展示这个过程。
t-SNE 表现不错,但也有一些改进,让它做得更好。
为了防止早期聚类,t-SNE 在早期阶段将 L2 惩罚添加到成本函数中。你可以把它当作标准的正则化,因为它允许算法不关注局部组。
这个技巧允许移动更多的(q_{ij})簇。这次我们在早期乘以 p_{ij}。因为集群不会妨碍彼此。
如果你还记得文章顶部的例子,现在是时候向你展示 SNE 霸王龙是如何解决这些问题的了。
来源:CC-BY 2.0
困惑 5、来源:https://distill.pub/2016/misread-tsne/CC-BY 2.0
**来源:https://distill.pub/2016/misread-tsne/CC-BY 2.0
困惑 5、来源:https://distill.pub/2016/misread-tsne/CC-BY 2.0
困惑 5、来源:https://distill.pub/2016/misread-tsne/CC-BY 2.0
所有运行执行 5000 次迭代。
t-SNE 在处理 CNN 特色地图时也很有用。你可能知道,深度 CNN 网络基本上是黑匣子。没有办法真正解释网络中更深层次的内容。一个常见的解释是,更深层次包含关于更复杂对象的信息。但这并不完全正确,你可以这样解释,但数据本身对人类来说只是高维噪音。但是,在 t-SNE 的帮助下,您可以创建地图来显示网络中哪些输入数据看起来“相似”。
其中一个翻译是由安德烈·卡帕西和 https://cs.stanford.edu/people/karpathy/cnnembed/cnn6k.jpg共同完成的。
卡帕西做了什么?他从 LSVRC 2014 中取了 50k 张图片,提取了一张 4096 维的 CNN 特征图(更准确的说是 4096 图来自 fc7 层)。
CNN 网络,来源: 使用整体视觉描述符在不同光照下拓扑模型中的分层定位
在得到每一张图像的矩阵后,他用 t-SNE 计算了 2D 嵌入。最后,他只是用 2D 海图上的原始图像生成了那张地图。对于特定的 CNN 网络,您可以很容易地找出哪些图像彼此“相似”。
t-SNE 是理解高维数据集的一个很好的工具。当您想要为 ML 训练执行维度缩减时,它可能不太有用(不能以相同的方式重新应用)。它不是确定性的和迭代的,所以每次运行时,它都可能产生不同的结果。但是即使有这些缺点,它仍然是该领域中最流行方法之一。
最初发布于https://erdem . pl。
原文:https://towardsdatascience.com/t5-text-to-text-transfer-transformer-643f89e8905e?source=collection_archive---------4-----------------------
通过谷歌人工智能博客为 QnA 提供 T5
随着迁移学习的蓬勃发展,深度学习已经取得了许多奇迹。更确切地说,在 NLP 中,随着 Transformer 的兴起( Vaswani 等人。艾尔。),出现了各种“语言建模”的方法,其中我们通过为一个非常通用的任务预先训练模型,然后针对特定的下游问题对其进行微调,来利用迁移学习。
在这篇文章中,我们将讨论 Google 的最新技术,T5—Text-To-TextTTransferTTransformer 模型,该模型是今年早些时候在论文中提出的,“用统一的文本到文本转换器探索迁移学习的极限”。本文本质上是对语言理解中使用的现代迁移学习技术的综述,因此提出了一个统一的框架,试图将所有的语言问题结合到一个文本到文本的格式中。我们将在接下来的章节中更详细地讨论这种方法。此外,作者还开源了一个新的数据集(为了方便他们的工作),名为C4—ColossalCleanCrawledCor pus。
如前所述,T5 试图将所有下游任务组合成文本到文本的格式。
通过谷歌人工智能博客为所有下游任务提供统一框架
考虑 BERT 风格架构的示例,该架构针对屏蔽 LM 和下一句预测目标进行预训练,然后针对下游任务进行微调(例如预测分类中的类别标签或 QnA 中的输入跨度)。这里,我们在不同的下游任务上分别微调预训练模型的不同实例。
相反,文本到文本框架建议在所有 NLP 任务上使用相同的模型、相同的损失函数和相同的超参数。在这种方法中,输入以这样一种方式建模,即模型应该识别任务,而输出只是预期结果的“文本”版本。参考上面的动画可以更清楚地看到这一点。
有趣的事实:我们甚至可以通过训练 T5 来输出预期输出的字符串表示,从而将 T5 应用于回归任务。
在巨大的未标记数据集上预先训练语言模型是一种刻板印象。通用爬虫就是这样的数据集之一。它是通过抓取网页并忽略 HTML 中的标记而获得的。它每月产生大约 20TB 的废弃数据。然而,普通爬行包含大量的像菜单或错误信息,或重复文本的乱码文本。此外,对于我们的任务来说,还有相当数量的无用文本,比如攻击性的词语、占位符文本或源代码。
对于 C4,作者从 2019 年 4 月开始使用普通抓取,并对其应用了一些清理过滤器:
这产生了 750GB 的数据集,不仅比大多数预训练数据集合理地大,而且包含相对非常干净的文本。
这是 T5 的主要关注点之一,因为这使得统一的文本到文本的方法成为可能。为了使所有下游任务使用相同的模型,将特定于任务的文本前缀添加到提供给模型的原始输入中。这个文本前缀也被认为是超参数。
例如,要求模型翻译句子“那很好”从英语到德语,模型将被输入序列“将英语翻译成德语:很好。“并将被训练输出” Das ist gut。
— T5 纸
类似地,对于分类任务,模型预测对应于目标标签的单个单词。
例如,在 MNLI 基准上,目标是预测一个前提是否暗示("蕴涵")、矛盾("矛盾"),或者都不是("中性")一个假设。经过我们的预处理,输入序列变成了" mnli 前提:我讨厌鸽子。假设:我对鸽子充满了敌意。"与对应的目标词"蕴涵。
— T5 纸
这里有一个问题。如果预测的单词是其他的东西,即不是“蕴涵”、“矛盾”或“中性”的,该怎么办?嗯,在这种情况下,模型被训练成认为所有其他单词都是错误的。
所提出的模型本质上是一个编码器-解码器变换器。艾尔。)进行了一些架构上的改变(如在子块之前应用层归一化,然后将初始输入添加到子块输出;也称为预规范)。而且,模型配置类似于 BERT base ( Devlin et。艾尔。)。
我们将跳过这些架构,因为它们超出了本文的范围。如果您特别想了解这些型号的规格,我已经在下面的文章中介绍了它们:
模型结构来自论文
在架构层面上,选择训练方法有几种选择:本文是对许多现代语言理解方法的详尽调查。因此,已经研究和比较了许多架构规范。
通过实验,编码器-解码器方法获得了最佳结果。
从到纸张的损坏跨度
关于培训前的目标,作者也在实践中探索了一些方法:
经过探索,去噪目标具有最有希望的结果。
从论文中探索无监督目标
首先,T5 已经在许多粘合、强力胶任务以及翻译和摘要基准测试中达到了最先进的水*。
T5 惊人地擅长这项任务。完整的 110 亿参数模型在 TriviaQA 、网络提问和自然问题上分别有 50.1%、37.4%和 34.5%的时间产生答案的精确文本。
— 谷歌人工智能博客
为了生成真实的文本,T5 依赖于填空类型的任务,由于预先训练,T5 对填空类型的任务很熟悉。因此,作者创建了一个新的下游任务,称为大小的填空。例如,给定句子“我喜欢吃花生酱和 4 三明治,【T11”),模型将被训练来预测空白的大约 4 个单词。
有趣的事实:该模型还根据所需的缺失文本大小来调整其预测。
以上的演示,参考官博。
通过谷歌人工智能博客对 T5 进行预训练和微调
在这篇文章中,我们深入研究了 Google 的 T5 模型,它是语言理解领域最先进的模型之一。我们看到了新的数据集:C4。这篇文章的主要收获是 T5 作者获得的关于训练方法、模型架构和数据集的实证结果。此外,还可以观察到,DL 越来越接*实现人类质量理解——在这种情况下,概括为许多 NLP 任务的一个模型。
github repo:https://github . com/Google-research/text-to-text-transfer-transformer
huggingface 用于模型架构和预训练权重的 API:https://huggingface.co/transformers/model_doc/t5.html
https://www.tensorflow.org/datasets/catalog/c4 C4 张量流数据集:
**T5 论文:【https://arxiv.org/abs/1910.10683 **
** [## 用 T5 探索迁移学习:文本到文本的迁移转换器
ai.googleblog.com](https://ai.googleblog.com/2020/02/exploring-transfer-learning-with-t5.html) [## 变形金刚解释
towardsdatascience.com](/transformers-explained-65454c0f3fa7) [## 伯特:语言理解变形金刚的前期训练
medium.com](https://medium.com/swlh/bert-pre-training-of-transformers-for-language-understanding-5214fba4a9af)**
原文:https://towardsdatascience.com/table-design-best-practices-for-etl-200accee9cc9?source=collection_archive---------33-----------------------
田宽在 Unsplash 上拍照
不久以前,在源系统(应用程序数据库)中设计表的方法曾经是——我们不关心 ETL。弄清楚后,我们将专注于构建应用程序。过去几年是 ETL 方法发展的大好时光,许多开源工具来自一些大型科技公司,如 Airbnb、LinkedIn、Google、脸书等等。随着云成为主流,Azure、谷歌和微软等提供商已经确保他们构建并支持数据工程领域的所有开源技术。
我参与过许多 ETL 项目,其中一些失败得很惨,其余的都成功了。ETL 项目出错的方式有很多。我们今天将讨论最重要的一个方面——源系统中的表设计。
ETL 管道和构建它们的源系统一样好。
不管在 ETL 管道的 T 层做了多少努力,这个说法都是完全正确的。转换层通常被误解为修复应用程序和应用程序生成的数据的所有错误的层。这绝对不是真的。不多说了,让我们看看在设计将要被 ETL 到目标系统的表时,您应该考虑的最低要求——
这一点应该不说,但我看到系统也没有强制执行(作为设计的一部分)。唯一键本质上是单列还是组合并不重要。但是,可能会要求用户在没有惟一键的情况下对表进行满负荷,并在每次满负荷后推断出变化。这个解决方案实际上比听起来更糟糕。
使数据工程师能够通过访问和等简单字段来识别新的和更新的记录。确保这两个字段都是由数据库而不是应用程序填充的。如果要从应用程序中填充日期时间或时间戳字段,应该有一个单独的日期时间或时间戳字段。这些应该被定义为—
只追加主键总是递增的表可以正常工作。您不需要为这些设置审计时间戳列。
在大多数情况下,我们将关系数据库作为源系统来处理。因此,理解源系统中的数据流和沿袭是非常重要的。在大多数情况下,负载的目标系统中的数据流和沿袭保持不变,尽管这不是强制性的。这里有两件事会有帮助——来自产生数据的应用程序的服务架构图和源数据库的 ER 图。
所有这些问题都可以被完全或部分解决,即使这些点在源系统中没有被注意到,但是没有一个解决方案是可持续的。是的,这就是开始构建一个整洁的 ETL 管道所需要的一切。
作为一个规则,ETL 系统的任务应该仅仅是通过一个通用的转换层将数据从一个地方移动到另一个地方(这个层不处理 bug,特殊的一次性情况)。记住垃圾进垃圾出的普遍原则——如果源系统中有错误的数据,那么目标系统也会有错误的数据。
我在很多地方看到的一个实践是,数据团队试图修补有问题的数据,并暂时处理它。它通常会一直工作到冲刺阶段结束,而同样的问题总是会回来困扰你。抵制诱惑,不要养成像这样解决问题的习惯。正确的做法是报告问题,修复源系统中的数据,并在有问题的时间段内进行干净的重新加载。与显示在应用程序 UI 和 data BI 仪表板上的不同数据相比,重新加载更容易证明。
[## 数据工程初学者指南—第二部分
medium.com](https://medium.com/@rchang/a-beginners-guide-to-data-engineering-part-ii-47c4e7cbda71) [## 设计数据密集型应用程序
www.oreilly.com](https://www.oreilly.com/library/view/designing-data-intensive-applications/9781491903063/) [## 为什么数据仓库项目会失败
www.timmitchell.net](https://www.timmitchell.net/post/2017/01/10/why-data-warehouse-projects-fail/)
原文:https://towardsdatascience.com/tableau-calculations-an-intro-9e89f92a3f68?source=collection_archive---------42-----------------------
照片由 奥列格马尼发自Pexels
这篇博客是我正在进行的“教学场景”博客的第三篇文章。在之前的文章中,我展示了如何从头到尾创建一个基本的仪表板,以及如何使用过滤器。本周的教程将复习“计算”。什么是计算?看起来很简单,但是 Tableau 对计算有三个定义。计算可以作为对数据源进行的查询的一部分写入,也可以在查询之后写入。这一秒钟后会更有意义。有基本计算、细节层次表达式(LOD)和表格计算。基本计算可以是聚合计算,如对整个数据集进行求和或求*均值,也可以通过计算单个行对数据源进行操作。基本计算是查询的一部分。LOD 表达式也是 Tableau 查询的一部分。Tableau 表示,它们允许我们“计算不在视图细节级别的聚合”。通过使用 EXCLUDE、INCLUDE 和 FIXED 函数,LOD 表达式可以在更详细的级别上工作。表计算写在查询之后,这意味着它们对作为查询结果计算的值进行操作。
虽然我们绝对有能力写出冗长复杂的计算,但有时简单的就足够了。如果我们点击一个药丸,并选择“快速表格计算”,有现成的表格计算供我们选择。
这种数据分析的蝙蝠侠工具带应该永远是你的首选。如果这些还不够,那么我们需要发挥脑力,进行更详细的计算。该字段可能不会显示,因为药丸可能只能使用基本计算。请记住,基本计算是在数据源上进行的,而表计算是根据查询结果在本地进行的。当我们有一个包含各种字段的可视化时,我们称之为“字段集”。例如,你可能有各种可以被分解的类别。我们可以把钢琴、吉他和贝司作为我们的“类别”。这些类别可以细分为“细分”,如声学和电气,其中包含总销售额等值,我们称之为“数量”。可以应用表格计算,但我们需要记住,当我们添加和删除字段时,表格计算也会相应地调整。
我们如何进行计算?首先,单击下面显示的下拉菜单,选择“创建计算字段”。
这将把你带到计算屏幕。在顶部字段中为您的计算命名。在这个例子中,我们希望看到所有超过 100 个单词的评论。对于这样的计算,基本的计算功能就可以了。其语法如下:IFTHEN【else IF
THEN。。。】【ELSEEND。使用这种语法,我们将在计算字段中键入:IF[Num Words]>100 THEN ">100 " ELSE "<100 " END,如下图所示。
Tableau 会在你输入的时候自动填充建议,所以如果你忘记了你的选项,这是一个很好的提醒。如果你真的不知道有哪些选项可用,你可以点击计算字段右边的三角形,在那里会出现另一个包含所有聚合函数的窗口供你浏览。花些时间浏览选项是熟悉可用工具的好方法,因为每个功能都有精彩的摘要。现在我们有了我们的计算,我们可以点击 OK,这将添加一个药丸到左边的数据窗格与我们的标题。现在,我们所要做的就是将适当的药丸添加到行和列部分,并构建我们的计算图表。
添加我们计算的药丸将我们的图表分割成一个图表,所有评论少于 100 个单词。另一种快速计算方法是双击列或行部分的字段,这将允许您直接输入计算结果。在这里,你甚至可以将药丸从数据窗格拖到字段中,这样你就不必把它们打出来。
让我们看一个 LOD 表达式的例子。对于这个例子,我将使用来自 Kaggle.com 的电子商务数据集。你可以在这里找到:链接假设我们想要一个月中每天的*均销售额。我们的图表看起来像这样:
如果我们仔细观察数据,我们可以看到,对于每个会话,用户可能会购买同一商品的多个实例或几个不同的商品。如果我们想找到每个会话的*均销售额,看看一个普通用户在某一天花了多少钱。为此,我们可以执行一个 LOD 表达式。首先,我们调出表格计算菜单。在输入字段中,我们可以写入以下表达式{ INCLUDE[User Session]:SUM([Price])}
这将给我们一个新的药丸,我们可以移动到行部分,并建立我们的图表。现在,我们需要做的就是从药丸的 Measures 下拉菜单中将聚合函数更改为 AVG。我们可以看到下面对比的表格。
语法以花括号开始和结束。LOD 表达式可以使用 INCLUDE、EXCLUDE 和 FIXED。我们在这里使用 include 是因为我们希望计算考虑视图中的日维度。FIXED 和 EXCLUDE 的区别在于,FIXED 是在维度筛选之前计算的,而 EXCLUDE 是在维度筛选之后计算的。它们不会像 INCLUDE 那样考虑视图中的尺寸。
我希望这个关于表格计算的基本概述能激起你对一些数字运算的兴趣。这些计算会变得相当复杂,所以花时间练习是绝对必要的。我也想给 Pris Lam 的博客一些关于 LOD 表达式的信息。在这里查看他的一些作品:链接。
原文:https://towardsdatascience.com/tableau-data-analysis-tips-and-tricks-775b48f04ac7?source=collection_archive---------48-----------------------
卢克·切瑟在 Unsplash 上的照片
Tableau 是最强大和最流行的数据分析工具之一。Tableau 拥有几乎 14% 的商业分析软件行业市场,拥有最高满意度的客户群。
这是 Tableau 提示和技巧系列之一,在这里我将告诉你一些数据分析的省时快捷方式。
我有一些技巧和提示,每个 tableau 用户都可以应用,使他们的分析更快更有效。所以让我们开始吧。
这是一个神奇的工具,它允许你复制并粘贴你的数据,以便更快地进行分析。(Windows: Ctrl + C 表示复制,Ctrl + V 表示粘贴)(Mac: Command + C 表示复制,Command + V 表示粘贴)
Tableau 允许对 Tableau 数据提取连接的*面文件执行拖放功能。
将用于分析的度量/维拖到视图中时单击鼠标右键,以获得快速聚集选项。
要重复和重复使用已存在于显示中的测量,请在移动它时按住 CTRL 键(Mac 命令)。
Tableau 是一个强大而智能的工具,我们可以使用分母 K 和 M(K-千,M-百万),而不是键入大量的零(千或百万)。
使用Ctrl+Shift+区域选择在查看大量时间数据时快速轻松地放大。
要交换视图中的测量值,请遵循以下步骤:“分析(菜单栏)”—“循环字段”。
使用“ ESC ”键移除应用于分析仪表板的所有过滤器,以恢复其初始状态。
菜单栏→“格式”→“格式化仪表板”以更改仪表板中的标题和文本
Tableau 有一个巨大的社区,成千上万的分析爱好者在这里回答问题,并向公众发布他们自己的仪表盘以供参考和使用。从头开始制作仪表板需要大量的时间和大量的创造力,但如果我们能够将我们的数据与公开可用的仪表板相匹配,那么我们的工作就减少了一半。
我建议考虑一下。选择一个您喜欢的仪表板,并尝试以创造性的方式整理您的分析数据。
当我们创建仪表板时,使用网格布局使其更具可读性和吸引力。网格布局还为最终用户增加了仪表板的可读性。它还为他们提供导航布局。
当你为你的仪表板选择颜色的时候要小心,因为它是值得注意的。我推荐你在这里看一看以获得更好的视觉练习。
当我们在仪表板中使用多种字体时,最好的做法是对仪表板的不同分析级别使用层次结构。这种方法将增加破折号的可读性。
数据科学世界在不断发展,我们也需要进化自己以适应变化。正如所说的
"也许正是我们的不完美让我们如此完美!"— 道格拉斯·麦克格兰斯
与他人合作,找出我们的不足之处,并做出相应的改进。这里有一些资源,你可以与其他 tableau 极客合作,提高你的数据分析和仪表板表示技能。
Tableau 用户组:加入一个群组,发布您的分析仪表板,并接收群组成员的意见,或者您可以创建自己的群组并邀请其他人。
Tableau 社区:加入社区,提出问题,接受行业专家和社区专家的解答。
这个博客到此为止。希望大家都喜欢,为之鼓掌。
我将带着更多的数据科学项目逐步指南的博客回来。
敬请期待!!
原文:https://towardsdatascience.com/tableau-desktop-specialist-certification-a-quick-guide-3b4650245c3f?source=collection_archive---------38-----------------------
在 Unsplash 上由 Carlos Muza 拍摄的照片
这个月早些时候,我通过了 Tableau 桌面专家考试。为了大家的利益,我愿意分享我的愉快经历。此外,我发现的学生有权获得高额奖金!
我把我的分享分成 5 个部分:
拥有 Tableau 桌面专家证书表明你有扎实的基础技能和至少三个月的经验。如果你是专家,还有更高级的证书。
我不认为参加这个考试是必不可少的,只要你能够证明你熟练使用 Tableau。例如,你可以在 Tableau Public 上发布你的一些可视化效果。然而,准备这个认证会让你学会正确的方法:基本概念。
还有什么比向画面的创造者学习更好的方法呢!好消息是,学生可以在Tableau e-Learning获得一个免费账户。你可以先注册你的 一年免费学生许可证 ,这也使你有权使用 Tableau Desktop。对于非学生,您需要付费):
[## 学生用桌子
www.tableau.com](https://www.tableau.com/academic/students#form)
考试前,我完成了桌面一和桌面二。尽管如此,推荐的课程只是桌面 I。这些课程涵盖了从最基本的概念到高级概念,以一个非常清晰的分步视频&教程。
对我来说,最大的收获是学习基本概念和不太明显的功能,如果我自己探索 Tableau,我不会知道这些。
除了参加在线学习,还有一些其他有用的资源可以帮助检查您的理解水*:
我按时接通了监考老师(监考老师)。在开始考试之前,我们花了将* 30 分钟来验证身份,检查互联网连接,房间条件和解释规则。
如果你想跳过一些问题,你可以标记它,以后再回来。我很早就结束了,还剩 15-20 分钟。所以肯定没必要急!每个问题有 2 分钟,有些问题可以在几秒钟内回答(特别是如果不是动手操作的问题)。
结果&提示
在你提交考试之后,结果会立即弹出。之后,你还会收到一封关于你的证书的电子邮件,并详细说明你在这四个方面的分数。我得了 95 分——我的大部分错误来自于对 Tableau 概念的理解部分。
最佳提示:你可以谷歌一下!这对于检查概念,甚至检查如何在 Tableau 中进行某些操作特别有用!
我希望我的分享能提供一些有用的见解。一旦你做好了适当的准备,通过考试绝对不是一件令人生畏的事情。最终,重要的是我们学习和提高。
干杯,祝你学习愉快!
查看我的其他文章:
[## 文字云中的圣经
medium.com](https://medium.com/illumination/the-bible-in-word-clouds-6a7dc3bb38ab) [## 混乱矩阵解释
towardsdatascience.com](/confusion-matrix-explained-5d42122a04d6)
加入我的电子邮件列表,每当我发布新帖子时都会收到通知!
[## 在这里加入我的电子邮件列表,我一发表你就会收到通知!
nathanthandoko.medium.com](https://nathanthandoko.medium.com/subscribe)
原文:https://towardsdatascience.com/tableau-public-for-data-visualization-using-shape-files-1782c9930f9?source=collection_archive---------40-----------------------
图片致谢—由作者使用 Tableau 开发
行人活动在任何国家都是生气勃勃和充满活力的象征。正如人们常说的,“步行对一个城市很重要”,步行活动是一个城市经济繁荣、安全和人们生活便利的标志。墨尔本市开发的自动行人计数系统实现了信息库的开发,该信息库可用于分析城市不同部分居民的活动。安装在城市不同位置的行人计数传感器将数据传输到中央服务器,然后可以用于更好的决策和未来规划。该项目旨在深入研究使用这些传感器收集的数据,以解决两个关键问题:
从数据收集、属性综合、数据争论、假设生成和数据可视化开始的五步迭代过程被用于获得关于手头问题的关键发现和见解。下面的图 1 概述了相同的详细过程。
图一。说明了回答分析问题上下文所遵循的分析过程。请注意,用于此问题内容的数据已经过整理,并已提前提供。图片致谢—由作者使用 Power Point 开发
用于此分析的两个独立数据集概述如下:
数据字典,即关于不同数据属性的信息包含在 Jupyter 笔记本中,也可以在这里找到。行人计数系统-传感器位置数据集位于传感器 ID 级别(主键),而行人计数系统-2019 数据集位于传感器 ID、日期-时间级别(主键)。
数据争论被定义为将数据结构化、清理并转换为一种格式的过程,这种格式有助于在更短的周转时间内做出更好的决策。数据是以表格形式获得的,因此不需要重组。然而,一个 Jupyter 笔记本被开发来寻找数据异常、缺失值、异常值和其他数据问题。争论的结果概述如下:
行人计数系统传感器位置 csv 文件包含 66 个不同传感器 id 的信息,其中四个传感器的方向信息缺失。在进一步的深潜中,发现这些传感器要么被移除,要么不起作用。关于这些传感器的信息可以在下面的图 2 中看到。“注释”栏中缺少大多数传感器的值。
图二。direction_1 和 direction_2 列缺少信息的传感器快照。图片来源——由作者使用 Jupyter 笔记本开发
speedman _ Counting _ System _ 2019 . CSV 数据集中没有任何列缺少值。数字列的快速描述/汇总统计表明这些数字在范围内。“每小时计数”栏表示行人计数的显著偏斜。记录的行人数量的第 75 百分位和最大值明显不同,这可归因于事件、假期、季节趋势等。异常值至少为-7%的传感器静态汇总如下图 3 所示。
方框图——图片来源——作者使用 Jupyter 笔记本开发
图 3。异常值为 7%的传感器的汇总统计数据和箱线图。注:为简单起见,7%被认为是一个阈值。由于行人数量会因时间、季节、事件和其他因素而有所不同,因此我们不会在本次分析中处理异常值。图片来源——由作者使用 Jupyter 笔记本开发
在进一步深入研究中,获得了 8 个传感器 id,它们是行人 _ 计数 _ 系统 - 传感器 _ 位置. csv 数据集的一部分,但是它们在行人 _ 计数 _ 系统 _2019.csv 数据集中不存在。调查结果如下:
自上而下的方法用于将问题分解为多个因素(假设)。然后根据数据可用性,使用 Tableau 中的可视化工具分析这些因素,以确定关键发现或趋势。假设综合的树形图可以在这里找到。
使用可视化方法在 Tableau 中研究数据,以检查数据异常。图 4 示出了由传感器收集的行人交通量向左倾斜,并且箱线图还示出了异常值的存在。如前所述,异常值不会被视为多个因素,如季节性、事件、时间和一周中的某一天会影响记录的行人流量。图 5 显示,一些传感器没有记录行人流量,例如传感器 32、63-66 等。如下面的条形图所示。由于大多数分析是基于地区和日期时间的行人流量,这些传感器没有被丢弃。
图 4。记录的行人流量直方图和箱线图。大多数数据向左倾斜,表明存在异常值。任何超出 Q1-1.5 倍和 Q3+1.5 倍的都被视为异常值。Q1 和 Q3 是四分位数,IQR 表示四分位数范围。图片致谢—由作者使用 Tableau 开发
图 5。郊区的传感器数量(#表示计数)和传感器 id 的行人数量。图片致谢—由作者使用 Tableau 开发
处理后的数据与两个 shapefiles 一起上传到 Tableau,以了解人口统计、郊区和感兴趣的区域对 2019 年行人计数的影响。使用下面的图 6、7 和 8 来表示可视化效果。
图 6。说明了 2019 年墨尔本各地传感器记录的行人数量。密度代表 2019 年的总行人量。图片致谢—由作者使用 Tableau 开发
调查结果:
2。土地用途可以大致分为娱乐、交通、农业、住宅和商业。与其他区域相比,商业和娱乐区域的客流量更大。与上图 6 所示的其他区域相比,2019 年记录的 CBD 及其周边地区的行人密度要高得多。拉筹伯街和尤里卡塔之间的地区是几家跨国公司和娱乐场所的所在地,2019 年的行人数量高于周边地区
3.与其他传感器点相比,靠*地铁站(如南十字车站和墨尔本中心车站)的传感器具有更高的行人计数
4.活动中心区(ACZ)是指导和促进活动中心土地使用规划的首选工具。下图 7 显示了分析区域周围的活动中心。内地铁和内东南区域有更多的活动中心,并在 2019 年观察到更高的行人流量,这是由这些区域及其周围的传感器捕捉到的
图 7。活动中心位于放置传感器的区域及其周围。使用 shapefile(澳大利亚政府,未注明)绘制活动中心。图片致谢—由作者使用 Tableau 开发
图 8。展示了传感器记录的郊区*均行人数量。由于不同的郊区安装了不同数量的传感器,因此考虑使用*均值来确保苹果与苹果之间的比较。调查结果与我们之前讨论的一致,与所有郊区相比,墨尔本郊区(墨尔本市)和 South Wharf 的*均行人流量更高。与帕克维尔、北墨尔本、卡尔顿和东墨尔本相比,码头区的客流量稍高。图片致谢—由作者使用 Tableau 开发
下面的图 9 和图 10 分析了一周中不同时间的行人流量变化。基于通常的预期量,一天中的时间被分类为不同的时段。
图 9。条形图和树形图分别说明了 2019 年不同日期和时间的行人流量变化。图片致谢—由作者使用 Tableau 开发
图 10。说明了 2019 年每个传感器捕捉的一天不同时间的*均行人流量。“一天中的时间”的定义如下。此外,请注意,该图通过使用周数和所考虑的传感器数量对*均行人交通量进行归一化,从而对其进行比较。图片致谢—由作者使用 Tableau 开发
一天中的时间:0-6:从中午 12 点到早上 6 点,6-8:清晨,8-12:高峰上午,12-16:下午,16-18:傍晚,18-20:高峰晚上,20-24:晚上。
调查结果:
1.澳大利亚政府(未标明)。搜索。[在线]data.gov.au。可从以下网址获得:https://data . gov . au/dataset/ds-DGA-af 33 DD 8c-0534-4e 18-9245-fc 64440 f 742 e/details
2.环境部,法律(未注明)。空间数据。【www.planmelbourne.vic.gov.au 在线】。地点:【https://www.planmelbourne.vic.gov.au/maps/spatial-data】T4
关于作者:高级分析专家和管理顾问,帮助公司通过对组织数据的商业、技术和数学的组合找到各种问题的解决方案。一个数据科学爱好者,在这里分享、学习、贡献;可以和我在 上联系 和 推特;
原文:https://towardsdatascience.com/tableau-server-impact-analysis-reports-accessing-metadata-9e08e5fb5633?source=collection_archive---------44-----------------------
元数据可以帮助你跟踪你的场景环境(图片由 Aron Visuals 在 Unsplash 上拍摄)
所有好的冒险都始于第一步。在本教程中,我们为 Tableau Server 构建影响分析报告的第一步是收集有关工作簿、视觉效果和底层数据库资产之间关系的信息。
如果你不知道我在说什么,花几分钟看看的介绍文章,这是一系列教程的开始,展示了我们如何为 Tableau 构建影响分析报告。
总而言之,我们的目标是提取存在于每个 Tableau 生态系统中的有价值的元数据,并为如何将这些数据转化为洞察力提供一个大纲。这一切都是为了提高我们的数据团队的生产力,并提供关于我们的数据谱系的定制的可视化信息,任何能够点击鼠标的人都可以轻松地与之交互。
所以让我们开始吧!
我想尽快进入如何进入,但是解释什么是很重要。我们的第一步要求我们获得一些关键信息,以便回答这些类型的问题:
我们可以继续,但我想你明白了。这些问题的重复主题是:工作簿、数据源和数据库表。
让我们深入本教程的任务:从元数据 API 中提取数据,并将其塑造成能让我们更接*回答上述问题的东西。
俗话说,“剥猫皮的方法不止一种。”我一直喜欢猫,所以一直不爱这个词组。我提出这个问题的原因是,它非常适合我们使用 Tableau 的元数据 API 的情况。
对于初学者来说,你可以采用无代码的方法,或者你可以反过来用代码做所有的事情。是的,每个人都有适合自己的东西。
我们将从无代码方法开始。您可以使用它来快速证明概念,或者依赖它作为您的首选数据收集方法,如果它提供了您所需要的,并且您不介意一点手工劳动的话。
在介绍了无代码方法之后,我们将扩展我们的 Python 肌肉,为您将元数据 API 集成到自动化工作流中铺*道路。走 Python 这条路还可以让我们做一些漂亮的事情,比如用其他来源的上下文信息丰富我们的元数据。
无论您选择哪种方法,您都需要安装 Tableau Server 2019.3 或更高版本才能使用元数据 API。如果你使用 Tableau Online,你就可以了。你知道你可以通过加入他们的开发者社区来申请一个免费的 Tableau 在线沙盒网站吗?现在你知道了。
这涵盖了本教程的范围,尽管我想我会在最后加入一两个基本的画面来证明我们提取的数据是真实的,并强调隐藏在其中的价值。
在未来的教程中,Python 将继续作为一个熔炉出现,成为我们查询元数据、存储库数据库和创建。超提取物为我们最终的影响分析仪表板提供燃料。
无需编写脚本来验证 Tableau 服务器环境并获取信息,您可以访问以下 URL 来访问您的元数据:
您将被提示像往常一样使用您的用户名和密码进行验证,但是您将看到内置的 GraphQL 界面,而不是通常的界面。顺便说一下,这不是上面的样本链接中的错别字。它是“graphiql ”,里面有一个“I”。
欢迎使用 GraphQL 元数据 API 沙箱
从这里开始,您可以自由构建一些基本的 GraphQL 查询。我之前说过没有代码吗?别担心,你会没事的。请随意复制并粘贴这些示例查询。如果你是喜欢冒险的类型,去的元数据 API 文档去掌握所有的东西。
例如,运行这个基本查询将获取您站点上的所有工作簿名称、工作簿 id 和工作簿所有者:
响应将以 JSON 格式出现在 GraphQL 界面的右半部分。我的输出如下所示:
可怕的蓝色是我屏蔽了我的超级秘密邮件地址。
你知道你可以直接连接 Tableau 桌面到 JSON 文件吗?是的,将元数据放入仪表板就是这么简单。只需复制 JSON 输出并将其粘贴到文本文件中。用. json 扩展名保存文件,就可以了。
下面你会发现整个过程在运行,用一个更高级的查询代替上面提供的玩具例子。该查询可以在 this Github Gist 中找到:
使用这个查询来跟进。
将生成的 json 数据存储到. JSON 文件后,打开 Tableau Desktop 并连接到该文件。
创建一个新的数据连接,并选择 JSON 文件选项
选择中所有可用的模式。json 文件,然后单击“确定”。
只需这么多,数据就在您的手中!
手动做事并不适合每个人,包括我自己。让我们来看看如何使用代码获得与上面相同的结果。当我们展望未来的教程时,这将为我们设置几乎无限的定制,所以我强烈建议投入时间到 Python 路线中。
在我的 tableau 服务器自动化工作流中,我广泛使用了 tableau-api-lib 和 pandas Python 包,所以如果您正在跟进,那么您会希望在命令行中运行这个命令:
与本节相关的完整 Python 脚本可以在GitHub Gist中找到:
不熟悉 Python?下载它,开始新的生活。
简要总结一下 Python 代码中发生的事情,我们将建立一个到 Tableau 服务器(或 Tableau Online)站点的连接,并针对元数据 API 运行 GraphQL 查询。本教程中的查询以工作簿、视图及其底层数据库资产为目标。您当然可以扩展这些查询,我鼓励您这样做。我们肯定会在后面的教程中重新讨论这个问题,并在这里所涵盖的基础上进行构建。
这里我们有一个熊猫数据框,里面有关于我们练习册的信息
GraphQL 查询返回 JSON 数据。虽然我们可以直接将其输入 Tableau,但让我们提前计划我们这个项目的未来里程碑,我们希望将我们的元数据与其他数据来源结合起来,例如存储库数据库,它将提供各种上下文,包括上次有人与我们的视觉效果进行交互的时间。
这里我们有一个熊猫的数据框架,包含了我们的观点
为了将来的成功做好准备,有必要花时间将我们的 JSON 数据整理成多个规范化的表,然后将它们合并成一个“非规范化”的表。这将与其他一次性元数据 API 查询和我们将在后续教程中使用的各种 PostgreSQL 查询配合得非常好。
最后,我们将 JSON 数据像煎饼一样展*,准备好迎接来自不同来源的其他数据。
现在,让我们来看看这些数据能为我们做些什么。
为了感受这些数据在创建影响分析报告方面可以为我们提供的价值,我们已经有了很多制作有用的东西所需的原材料。
显示:每个底层数据库资产的视觉效果的不同计数
通过三十秒的拖放操作,我们已经创建了如上所示的工作表!我们可以使用底层数据来构建定制的数据沿袭审计,让我们最不喜欢的业务部门因使用更多工作表而不是仪表板而感到羞愧,等等。
我们现在已经能够回答本教程前面提出的问题了。我们制作了一个手电筒,可以照亮我们的 Tableau 生态系统中最黑暗的角落。
这是我们在 Tableau 中构建详细的交互式影响分析报告的第一个里程碑。我们已经接入了 Tableau 的元数据 API,并提取了足够的数据来构建视觉效果,描述为我们的 Tableau 视觉效果提供信息的底层数据库资产。我们演示了两种收集数据的方法:通过内置的‘metadata/graphisql’接口手动收集,或者使用 Python 脚本等可重复的过程收集。
我希望这个教程能让你比刚开始的时候过得更好!收听下一个教程,我们将把重点转移到存储库数据库(内部 PostgreSQL 数据库)上,从中提取一些真正有用的信息,包括用户访问内容的次数以及每个工作簿或视图的最*交互日期。
我们收集的数据已经很有价值,但将它与 PostgreSQL 数据库的输出结合起来,将使我们能够更完整地描绘出 Tableau 生态系统中正在发生的事情。
我们的最终用户最常访问哪些视图和数据库?是否有任何内容过时且未被使用?放弃 John 四年前构建的旧数据库表安全吗?我们将在下一个教程中做的工作将帮助我们回答这些问题!
里程碑 2 (ETA 是 4/29/2020):在里程碑 1 的基础上,使用来自 Tableau 服务器存储库的补充数据,提供与每个工作簿(视图和仪表板)、数据源和流程相关联的交互数量。
里程碑 3 (ETA 为 5/6/2020):使用 hyper API 将里程碑 1 和 2 的组合输出转换为. Hyper 提取,并将内容发布到 Tableau 服务器(或 Tableau Online)。
里程碑 4 (ETA 是 5/13/2020):使用里程碑 3 中发布的数据源构建我们的第一个影响分析仪表板。
里程碑 5 (TBD)
原文:https://towardsdatascience.com/tableau-server-impact-analysis-reports-building-customized-interactive-visuals-85ce4798dead?source=collection_archive---------60-----------------------
更好地了解你的场景环境(照片由乔丹·麦克唐纳在 Unsplash 上拍摄)
在本文中,我们从前面的影响分析里程碑中停下来的地方开始,基于我们之前的工作生成的数据来构建交互式视觉效果。
作为更新,以前的里程碑将来自 Tableau 的元数据 API 和内部 PostgreSQL 存储库数据库的数据结合起来,将这些数据转换成 Tableau 超级摘录,并将这些数据发布到 Tableau 服务器。
如果这是您第一次关注这个系列,为了方便起见,下面是以前的里程碑:
这个里程碑是关于使用 Tableau Desktop(同类中最好的该死的数据 viz 工具)将我们的原始数据转化为有意义的东西。
这听起来可能很奇怪,但在某些方面,构建数据可视化就像做饭一样。你做的东西很大程度上取决于你现有的原材料。变质的肉不会成为任何获奖的菜肴,变质的数据也不会让你在 Tableau 用户中赢得多少人气。类似地,就像你用盐和香料给你的食物添加味道一样,你可以通过格式化和仔细的展示来放大你的数据可视化的价值。
既然我们已经把这个类比放在你面前,我想澄清一下我们在这篇文章中在做什么。这不是选美比赛。我们不是在烹饪一些异国情调的顶级厨师菜肴,我们也不是在构建性感和疯狂的实验数据可视化。虽然设计和制作漂亮的视觉效果是很有价值的技能,但这个系列本质上主要是功能性的,在本文中,我们将构建满足我们需求的交互式视觉效果。
我在这里的目标是向您介绍我能够非常快速地构建的报告,这些报告展示了 Tableau 的核心交互元素,以便您看到在我们之前的里程碑基础上构建仪表板,为您的运营团队增加巨大价值是多么容易。在未来的教程中,我们可能会更多地关注视觉效果的流行,但今天我们将重点放在构建一个工具,为我们提供所需的信息,以便我们继续我们的生活。
说到这里,让我们开始吧!
在我们构建任何东西之前,我们需要连接到我们在前一个里程碑中发布的 Hyper extract。
我们可以通过打开 Tableau Desktop 并建立到我们的 extract 的数据连接来做到这一点。在我的例子中,摘录位于 Tableau 服务器上,所以我将在那里查找:
没错,我们使用 Tableau 来构建我们对 Tableau 的影响分析。
这是我的数据窗格在连接后的样子。虽然这是另一个教程的主题,但我认为最好的做法是按文件夹组织我的计算字段,而不是让数据窗格成为一个混乱的噩梦(是的,我在这里充满了意见)。
作为我如何组织我的数据面板的速成班,我喜欢把我所有的原始字段放入名为“/ Original / ”的文件夹中。
我通常从不使用任何原始字段。在 Tableau 领域进行了多年的大量咨询之后,您学会了如何保护自己免受数据源交换或者将数据源从一个表指向一个视图之类的事情的影响。我喜欢为自己省去修复损坏的数据源字段引用的麻烦,所以我倾向于从不在我的视觉效果中使用原始字段。相反,我创建了引用这些字段的其他计算,这样我所有更高级的计算都不会与原始的“原始”字段引用结合在一起。
如果这令人困惑,让我们继续前进吧!您可以随时获取更多信息。
床单是我们的建筑材料
每一个画面仪表板都是建立在巨人的肩膀上。床单是无名英雄,让我们为他们唱首快歌。
让我们把一些简单的表放在一起,即使它们不是仪表板的一部分,也是有用的。一旦我们构建了这些表,我们可以将它们组合在一个仪表板中,Tableau 对交互式视觉效果的本地支持将使它们更加有用。
我的测试环境没有超级多样的数据库表,但是我们有一些。即使您的 Tableau 环境中有数百或数千个表,同样的视觉效果也可以快速地为您提供关于表影响了多少资产的信息。
那不是我真正的雪花主机名!
在我的测试环境中,看起来 TMDB 火车雪花表提供了大约 15 个视觉效果。就视觉效果的数量而言,这显然是最有影响力的数据库表。
然而,查看浏览量只是故事的一个方面。我们可以将用户的查看次数添加到 marks 卡上的“颜色”中,以便从不同的角度观察事物,例如用户查看与这些数据库表相关的资产的次数。
在此图中,用户交互决定了每个条形的颜色渐变。
对于该特定视觉,用户视图与视觉资产的数量一致。对于其他视觉效果,我们将看到情况并非总是如此。
让我们构建一个单独的工作表,显示我们的可视化资产是如何分布在我们的各种 Tableau 项目中的。
“默认”项目包含了最多的视觉效果。如果我们添加用户交互(视图)作为颜色渐变的驱动力,这种视觉效果会发生变化吗?
这很微妙,但仔细观察就会发现,“测试”项目比“测试替代”项目有更少的视觉效果和更多的用户互动。
让我们构建几个更基本的视觉效果,这样我们就可以将它们一起放到一个仪表板中。
这是视觉效果的普通版本。
下面我们看到的是用户交互(视图)决定颜色渐变的版本。我知道我在这一点上犹豫不决,但我觉得这很重要。尤其是一旦我们在交互式仪表盘中整合视觉效果,引入微妙的视觉元素可以完全改变你的仪表盘讲述的故事,在不增加不必要的混乱的情况下完成这一点更像是一门艺术而不是科学。
现在,虽然这个视觉结构与没有颜色渐变的视觉结构相同,但这个新的视角告诉我们一些我们无法从原始视角获得的东西:仅仅因为一些东西与更多视觉相关,并不一定意味着它更重要。您可能有 100 个工作簿受到一个后端表的影响,但是如果这 100 个工作簿只有 5 个用户交互会怎么样呢?这 100 个工作簿比一个有 894 个视图的工作簿更重要还是更不重要?
上图向我们展示了一些数据源产生了相对较少的视觉资产,但这些资产有时会带来相对较高的用户流量。
就这样,我将停止关于聪明使用颜色渐变的争论。我在野外经常遇到并且不推荐的一件事是用指示条的大小的相同度量来着色。例如,下面的视觉效果没有添加任何新信息,颜色渐变只是分散注意力,而不是增加价值:
不添加任何值的颜色渐变示例。这真的只是一道不令人兴奋的彩虹。
这种视觉现在是丰富多彩的,但毫无意义。作为一个在我多年咨询生涯中的某个时刻违反了所有视觉最佳实践的人,请从我的错误中吸取教训。
不要因为工具可用就随意从数据可视化工具箱中抓取工具。对你使用的工具要明智,我的建议是你总是尽量做到简约。不要成为有 1000 个切片的饼状图,没有人能读懂。成为条形图,立即告诉人们他们需要知道什么。
另一个香草视觉,但香草是一个经典!
这里没有什么新的东西,但是有了这个可视化,我们现在有了四个表,它们一起将为我们提供一个关于后端数据资产如何影响我们的 Tableau 可视化的相当全面的理解!
在构建仪表板时,我非常喜欢 z 模式。也就是说,将用户应该首先交互的内容放在仪表板的左上方,然后以 z 模式(左上->右上->左下->右下)跟踪他们的交互,这样他们的最终交互就在仪表板的右下方。
在这个简单的影响分析报告中,我将根据我所称的信息层次来确定工作表放置的优先级。我希望最高级别的信息(层次结构的顶部)在左上角,最细粒度的信息(层次结构的底部)在右下角。
考虑到这一点,我决定将我的数据库表列表放在左上角,将我的 Tableau 项目列表放在右上角,将我的数据源列表放在左下角,最后将我的工作簿和视图列表放在右下角。
它看起来是这样的:
就像我之前说的,这个仪表板没有赢得任何设计比赛。但是如果它没有告诉我我需要知道的东西,我会被诅咒的,特别是在增加了一些交互性之后!
这也是在不到一个小时的时间内完成的,所以总要考虑权衡。我确信,如果我们花一个月的时间美化它,我们可以使这个仪表板适合一个美术博物馆,但是这种果汁值得榨吗?随着经验的增长,我发现自己更喜欢实用性而不是外表。但那是个人喜好。出于类似的原因,我也开丰田车。
我已经教授了数百门 Tableau 培训课程,我总是在开始的几分钟内在观众面前建立一个交互式仪表板,展示在 Tableau 中建立一些动态的东西来回答你的问题是多么容易,甚至可能引发你没有考虑过的更重要的问题。
在 Tableau 中,你的工具箱中最好的交互工具之一是动作过滤器(技术上来说是‘过滤动作’,但我认识的每个人都说‘动作过滤器’)。
这些为什么这么棒?它们允许你点击一个工作表中的一个条目,然后 Tableau 自动地过滤其他工作表来反映与你点击的条目相关的数据。
添加动作过滤器有多简单:
看到我在右上角画的那个可怕的圆圈了吗?单击该按钮。
一次点击,宝贝。您只需点击一下鼠标,就能让您的仪表板完全互动。
单击该按钮后,让我们看看当我们单击该工作表中的某个内容时会发生什么:
这就缩小了范围。
现在我们知道了如果从我们的数据生态系统中删除 TMDB 测试表会发生什么。就 Tableau 而言,这将影响(a)我们的“测试替代”项目,(b)我们的“twb _ 测试(公共)”数据源,以及(c)我们的“twb _ live _ 雪花”工作簿。
看起来最多有 10 个用户会为此心碎,但在你我之间…我是唯一使用我的测试网站的人,所有 10 个用户都是我。
因此,这是您的速成课程,学习如何使用我们在之前的里程碑中构建的内容来整合交互式影响分析!在今天结束之前,让我们仔细看看我们创建的动作过滤器。
听着,动作过滤器并不复杂。不要让任何人告诉你他们是。我们点击一个按钮,一个动作过滤器就出现了。如果您想对您的动作过滤器做什么、过滤哪些字段或过滤哪些工作表有更多的控制,那么这一部分正好适合您。
即使我们点击了一个按钮来自动生成我们的动作过滤器,我们也可以从头开始构建它。
在我们的 Tableau 仪表板上,我们可以点击“仪表板”,然后点击“操作…”来查看幕后为我们构建了什么(或者我们自己从头构建)。
这里没有魔法,只是一个简单的东西,你可以学会为自己所用!
这是为我们生成的内容:“过滤器 1(已生成)”
如果我们点击“编辑”查看一下内部,我们会发现一些关于此过滤器行为的详细信息。
因此,我们可以看到过滤器的源(触发器)是“数据库表”表,过滤器的目标是仪表板上的所有内容。该过滤器通过在相关源表上的“选择”动作(点击)来执行。
差不多就是这么多了。如果你想自定义你的工作表如何互相过滤,只需在这里编辑这些关系!您可以构建几个操作过滤器(咳咳,过滤操作)并为每个过滤器指定不同的规则。
为了证明我不是一个只会构建条形图的机器人,让我们来演示一下我创建的另一个可视化工具。我喜欢这个,因为它让您能够看到最*与哪些视觉资产进行了交互。
影响分析过程的一部分是确定什么受到影响,但这最终会变成受影响的资产是否重要的问题。重要性的一个代表是:这个东西在过去的一个月里被使用过吗?过去的半年怎么样?怎么样…永远?
这里有一种方法可以回答这些问题:
呀,这么多红色。
哎哟。看起来我创造了很多我珍爱的用户(我)从未使用过的内容。我把它归咎于冬天!
在本文中,我们利用了我们在以前的里程碑中生成的数据,并开始构建交互式数据可视化,以帮助回答各种假设场景。
如果那张桌子倒了怎么办?有多少视觉资产会受到影响?哪些项目?哪些数据来源?这些受影响的视图有多受欢迎?这些视觉效果还在使用吗,或者它们是来自一个失落文明的古老遗迹?
这绝不是一个停止点。这是对你的一个启发,让你把你所看到的应用到你自己的环境中。我坚信任何公司的影响分析报告都不应该是相同的。每个团队都有独特的环境和独特的工作流程,他们用来做决策的工具应该反映这一点。
感谢收听!下次见。
里程碑 5 (ETA 是 5/20/2020):演示如何从所有站点提取元数据。在里程碑 1 中,我们从元数据 API 中提取数据。默认情况下,该数据特定于您通过身份验证进入的站点。使用 REST API,我们可以遍历所有可用的站点,并提取整个服务器的元数据。
里程碑 6 (ETA 为 5/27/2020):探索 Tableau 新的' metrics '特性,为方便的 KPI 分析打开了大门。我们将了解一种 KPI 分析方法来查看我们的影响分析数据。
原文:https://towardsdatascience.com/tableau-server-impact-analysis-reports-combine-metadata-with-postgresql-47447b830513?source=collection_archive---------40-----------------------
用 Tableau 的 PostgreSQL 存储库数据库发送(图片由 Bundo Kim 在 Unsplash 上拍摄)
就其本身而言,Tableau 服务器存储库对于任何想要深入 Tableau 环境的人来说都是一座金矿。但是今天,PostgreSQL 数据库并不孤单。在本教程中,我们将探索存储库数据库如何通过元数据 API 为可用的补充数据增添美味,从而构建强大的影响分析报告。
这篇文章继承了我们在之前的教程中的地方,在那里我们演示了如何访问关于工作簿、视图和底层数据库资产的信息(以及它们之间的关系)。
如果你一直怀疑你已经错过了一些重要的东西,那么就去看看这个系列的原始帖子来了解我们正在努力的方向。
让我们开始吧。
在本系列的前一阶段(里程碑 1) ,我们深入到元数据 API 中,为影响分析报告构建了一个坚实的基础。作为复习,这些影响分析报告是 Tableau 可视化,我们可以与之交互,以探索我们的 Tableau 内容和支持该内容的数据源之间的关系。
我们在前面的教程中看到,元数据 API 是一个收集动态信息阵列的优秀工具,能够提供高层次的概述和对细节的细粒度内省,具体到我们的视觉效果所引用的确切数据库列。
虽然元数据 API 自己做了很多工作,但 Tableau 的内部 PostgreSQL 数据库(也称为存储库数据库)中仍然存在大量有价值的数据。
就本教程的范围而言,我们将带着两个非常具体的目标来处理存储库数据库:
当我说这只是 PostgreSQL 数据库所提供的价值的皮毛时,我一点也不夸张。就个人而言,存储库数据库和元数据 API 都是强大的工具。将它们结合起来,为获得极其有价值的见解和创建专门的交互式影响分析报告的能力铺*了道路。
如果您在 Tableau Online 上,在撰写本文时(2020 年 4 月),您无法访问内部 PostgreSQL 数据库。
对于 Tableau 服务器上的人来说,你们很幸运!我们将直接使用这个数据库,跳过一些具体的细节。如果你想要更深入的信息,请随意跟随这篇教程,学习如何使用 Python 查询 Tableau 的存储库数据库。
我建议至少看一看上面链接的教程。为了不在本文中重复整篇文章,我们将简单地继续下面步骤,并假设您已经有了用 Python 设置 PostgreSQL 连接的经验。
在 Tableau 的内部 PostgreSQL 数据库中有许多表可供我们使用。在我写这篇文章的时候,我计算出我正在使用的“只读”帐户有 235 个可用的表。
这些表中的每一个都发生了什么?如果你是一个 SQL 迷,并且真的想获得内幕消息,那就深入 Tableau 的数据字典中的一些文档。
为了避免分析瘫痪,让我们专注于我们的目标,并解释与我们在本教程中需要的内容相关的表格。当你自己开始玩这个的时候,以后有足够的时间被所有的可能性麻痹。
我们这里的目标是识别任何给定内容的最*交互日期,以及用户与该内容交互的总次数。
我们在上一个教程中提取的元数据是以工作簿和视图(以及它们的底层数据库资产)为中心的,所以让我们放大每个视图(工作表)并提取与该视图最*交互的日期,以及用户访问该视图的总次数。
关于 Tableau 内部 PostgreSQL 数据库的更详细的解释可以写满多篇文章,所以让我们直奔主题,将我们需要的数据放入 Python,这样我们就可以将它加入到我们在上一篇教程中生成的元数据中。
使用这个 GitHub 要点作为相关 SQL 代码的参考:
这个查询只是实现相同目标的许多可行方法之一。
参见本文末尾的合并代码,获取将 PostgreSQL 结果与上一教程中的元数据 API 输出相结合的工作示例。
简而言之,我们将把新数据加入到第一个里程碑中生成的元数据中。两个数据集都被设计为有一个共同的“view_id”列,这使得连接成为可能。
让我们根据综合数据来看看一些基本的视觉效果。这些并不是为了赢得任何选美比赛(我们将把这一点留到后面的教程中),而是展示了我们现在如何获得信息,否则很难获得这些信息。
事实上,我们将这些数据放在一个交互式的 Tableau 仪表板中,这代表了它为桌面带来的大部分价值。有很多假设场景通常是非常乏味的,现在可以通过与 Tableau 中的数据交互来回答。
上面的仪表板允许我们放大至少 60 天没有互动的内容,提供一些关于我们服务器上哪些内容可能过时的见解。我们可以更深入地研究,以发现我们的数据源、表和单个视图的含义。
也许是时候淘汰一些用红色突出显示的陈旧内容了…
在未来的教程中,我们将会花更多的心思来构建我们的视觉效果。在这里,我们只是展示了一些我们已经取得的快速胜利,现在我们已经结合了我们的元数据和只是我们的 PostgreSQL 数据的味道。
看来雪花数据从我这里得到的爱最多,但是超市数据紧随其后!
本教程将我们在第一个里程碑(从元数据 API 获取数据)中学到的知识与从 Tableau 的内部 PostgreSQL 数据库中提取的数据结合起来。这两种信息来源各有特色,将它们结合在一起给我们带来了视角,如果我们局限于使用单一来源,我们就不会有这样的视角。
从这里,我们可以开始构建真正动态的影响分析报告和其他交互式视觉效果,展示 Tableau 生态系统的内部工作方式。
里程碑 3 (ETA 为 5/6/2020):使用 hyper API 将里程碑 1 和 2 的组合输出转换为. Hyper 提取,并将内容发布到 Tableau 服务器(或 Tableau Online)。
里程碑 4 (ETA 是 5/13/2020):使用里程碑 3 中发布的数据源构建我们的第一个影响分析仪表板。
里程碑 5 (TBD)
使用这个 GitHub 要点作为实现第二个里程碑的模板。请记住,这里的代码只是完成工作的一种可能的方法,您可以根据自己的需要修改它。
原文:https://towardsdatascience.com/tableau-server-impact-analysis-reports-harvesting-data-lineage-for-all-sites-7c207eef9ca5?source=collection_archive---------53-----------------------
马库斯·斯皮斯克在 Unsplash 上的照片
本系列中的前三个里程碑生成了 Tableau Hyper extract,其中包含来自元数据 API 的数据血统信息、来自 Tableau Server 内部 PostgreSQL 数据库的用户交互信息。第四个里程碑(我们之前的文章)基于该摘录构建了一个交互式 Tableau 仪表板。
在本文中,我们回到第二个里程碑,从元数据 API 中提取数据血统信息。在这里,我们将重新审视这个过程,并将范围扩大到包括 Tableau Server 上所有可用站点的数据沿袭信息。最初,该流程只为我们认证的活动站点提取数据。
如果这是您第一次关注这个系列,为了方便起见,下面是以前的里程碑:
到目前为止,Tableau 的 REST API 已经为我们扮演了一个使能器的角色。它是我们发布元数据 API 查询的网关,也是我们用来将 Hyper extract 发布到 Tableau 服务器(或 Tableau Online)的网关。
在本教程中,我们将利用'切换站点'端点来遍历服务器上所有可用的站点。这样做允许我们从不同的站点多次执行相同的元数据 API 查询。一旦我们检索了所有站点的数据沿袭信息,我们只需合并结果来构建整合的数据沿袭细节。
如果您习惯于手工从 GraphiQL 接口提取数据,而不是通过 REST API 发出元数据 API 查询,那么这里概述的过程可能会说服您转向 Python。为什么?因为在无代码方法中,您一次只能提取单个站点的数据。通过构建执行代码的自动化流程,我们能够自动化涉及切换站点和对多个站点重复相同查询的过程。
请注意,您的 Tableau 帐户只能看到您有权访问的网站。如果您的目标是为整个服务器构建准确的影响分析,请验证您是服务器管理员。如果您不是服务器管理员,请注意,由于您的用户没有分配相关权限,某些内容可能会对您隐藏。
即使你是这些教程的专家,在下面的步骤中使用最新版本的库也无妨。
为了避免重复不必要的内容,我将坚持新的内容,并假设您已经熟悉我们在本教程系列的第二个里程碑中完成的内容。
这个里程碑给我们留下了这个 GitHub 要点,我们将在本文中详细阐述。
我们这里的主要目标是将前面代码中的逻辑放入一个循环中,该循环将为我们的每个 Tableau 服务器站点执行。为了让这个迭代过程工作,我们首先需要获得我们想要遍历的站点。一旦我们有了这些网站,我们将建立一个类似这样的过程:
我喜欢使用 Python 库 tableau-api-lib 来处理这样的任务。图书馆里有一个方便的功能,可以拉出一个熊猫数据框,里面有我们网站的详细信息。
产生的 sites_df 看起来像这样:
我们真正需要的是名为“contentUrl”的列。当我们调用“切换站点”端点时,这是 REST API 需要的值。在我们的服务器环境中,每个站点的“contentUrl”值都是唯一的。请注意,这与网站名称是而不是相同的东西,尽管在某些情况下它们是相同或非常相似的。
我发现自己在这个服务器上有多个站点,但是这些站点中有许多与我无关。如果您希望您的服务器上的每个站点都包含在您的分析中,请跳过这一步。然而,如果你只关心网站的一个子集,那么这一部分就是为你准备的。
将我们的数据存储在熊猫数据框架中带来了某些便利。例如,我们可以根据逻辑条件轻松地修剪数据。下面的代码块演示了如何在查询相关元数据之前定义站点子集。
以下是我的结果:
虽然我不会去张贴这个重构过程的截图,但请注意,本文末尾的合并 GitHub 要点是我们在第二个里程碑中使用的要点的重构版本。
我将大部分代码放入函数中,努力将我们在这个里程碑中的注意力集中在循环本身上。
下面是最终代码的循环部分:
上面的代码执行以下操作:
下面是一个屏幕截图,显示了多个站点所需的数据现在如何存在于单个 Pandas 数据框架中:
既然我们可以为多个站点提取元数据,我们可以简单地用这个里程碑的输出替换第二个里程碑的输出。
在我们完成的第三个里程碑中,我们从 Tableau Server 的内部 PostgreSQL 数据库中提取信息。它已经有了我们所有站点的数据,所以当我们将这个输出与那个里程碑的输出相结合时,结果将是我们在这里看到的所有站点的数据。
本教程到此为止!我们已经扩展了我们的原始元数据里程碑,现在我们可以访问所有 Tableau 站点的数据,而不仅仅是我们认证的站点。
这是一个好消息,因为我们现在可以构建覆盖所有网站的影响分析报告,并在 Tableau 服务器上的一个集中位置发布这些报告!当您登录 Tableau Server 时,一次只能看到一个站点的数据沿袭。现在,您已经拥有了构建单个报告的必要工具,该报告在一个位置提供了所有信息。
使用这个 GitHub 要点作为将本教程集成到您自己的工作流程中的起点。
里程碑 6 (ETA 为 5/27/2020):探索 Tableau 新的“指标功能,这为方便的 KPI 分析打开了大门。我们将了解一种 KPI 分析方法来查看我们的影响分析数据。
原文:https://towardsdatascience.com/tableau-server-impact-analysis-reports-metadata-publishing-and-using-apis-54b203fdd183?source=collection_archive---------49-----------------------
Tableau 元数据现在就在你的手中(图片由 Rohan Makhecha 在 Unsplash 上拍摄)
在本系列的前三篇文章中,我们介绍了 Tableau 的元数据 API 和内部 PostgreSQL 数据库,并展示了如何将它们结合起来构建强大的数据集,从而推动我们的影响分析工作。
如果这是您第一次关注这个系列,为了方便起见,下面是以前的里程碑:
我们完成的最后一个里程碑留给我们一个 CSV 文件,它包含元数据 API 输出(我们的影响分析的核心)和 PostgreSQL 输出(增加了额外的味道,包括用户查看次数和最后交互日期)。
本文探讨了一些相关的后续步骤:一旦我们获得了想要的数据,我们应该如何存储这些数据?我们能否发布数据,以便其他 Tableau 用户可以自由构建自己的交互式报告?
处理这些数据的一个可行的方法是将其转换成 Tableau。超提取并发布到 Tableau 服务器。这是我们将在下面的章节中关注的。
到本文结束时,我们将有一个建立在先前里程碑基础上的工作流,将数据打包成一个表格。hyper 提取并发布数据到我们的 Tableau 环境中。
两个新工具进入本文:Tableau 的 Hyper API 和 REST API 。请注意,如果您以前有过使用 Tableau 的遗留提取 API 或遗留 Tableau SDK 的经验,那么 Hyper API 是您今后(Tableau 10.5 以上)构建提取文件时应该使用的。
Hyper API 允许我们创建高性能的数据提取,并允许我们从这些提取中添加或删除数据。的。hyper extract 文件是 Tableau 世界中的一等公民,所以与继续使用 CSV 或 JSON 文件的替代方案相比,这对我们来说是一种升级。
你可以去寿司店点通心粉和奶酪,但是谁会这么做呢?Tableau 中的数据存储也是如此。Tableau 已经构建了一个完整的提取引擎,为什么还要在 Tableau 服务器上使用 CSV 呢?超级文件?点该死的寿司。
一旦我们有了。hyper extract 文件准备就绪,我们将把接力棒传递给 Tableau 的 REST API,将摘录作为数据源发布在 Tableau 服务器(或 Tableau Online)上。
这里没有什么特别的,只是两个简单的用例,它们建立在 Tableau dev 团队提供的一些优秀工具的基础上。向 #DataDev 社区大声喊出来!
如果您需要赶上进度,请随意向上滚动到顶部,然后单击将带您完成早期里程碑的步骤的文章。
在下面的部分中,我们从第二个里程碑结束时停止的地方继续。我们拥有构建定制影响分析报告所需的核心数据,现在我们希望将这些数据放入. hyper extract 中,并将其发布到 Tableau Server(或 Tableau Online)。
本着将所有各种工具放在一个屋檐下的精神,我使用 Python 作为编排所有各种工具的霸主。下面是我们如何使用 Hyper API 将现有数据转换成. hyper extract。
让我们首先定义一个本地文件路径。hyper 文件将被存储(这建立在之前的里程碑中已经开发的 Python 代码之上——完整代码请参见本文末尾的综合 GitHub 要点):
我从 Hyper API 文档中借用了一些模板代码,并对其进行了修改,以构建熊猫数据帧的摘录,如下面的 GitHub 要点所示。本文末尾包含了包含整个过程的合并代码。
这个 GitHub 要点涵盖了与本节相关的代码片段,但是请注意,单独运行它是行不通的(请使用本文末尾的合并 GitHub 要点)。
在我自己的测试中,我还需要对数据帧进行一些清理,以使 Hyper API 不会抱怨某些输入为空。特别是,当从 pandas DataFrame 转移到. hyper extract 时,datetime 和 date 列一直是我的眼中钉,所以我倾向于强制 date 列键入“str ”,然后在 Tableau 中将该文本转换回日期。这样就避免了担心日期是用日期、日期时间、时间戳还是任何其他特定的日期格式来表示的麻烦。
现在我们有了提取文件,让我们把它推送到 Tableau 服务器(或者 Tableau Online)。这里我将使用的库是 tableau-api-lib ,它是我开发和维护的。它被设计成镜像在 Tableau 的 REST API 引用上找到的 REST API 端点。
这个库与其他 Python / Tableau REST API 库(比如 Tableau 自己的 Tableau 服务器客户端库)的主要区别在于,这个库的设计使得如果您在 Tableau 文档中看到一个端点,那么该端点将使用相同的命名约定来实现。
例如,现在我们需要发布一个数据源。查看 Tableau Server REST API 参考,我们找到了期望的端点:
“发布数据源”端点的 tableau-api-lib 实现为我们提供了一个实例方法,我们可以这样调用:
让我们把摘录出版吧!但是在我们发布它之前,我们需要知道我们要发布到的项目(更重要的是,项目 ID)。
我们可以使用 tableau-api-lib 轻松地获取有关项目的信息(注意,示例代码中的“conn”表示到 tableau 服务器的连接——有关更多详细信息,请参见本文末尾的完整代码):
下面是我的“项目 _df”的样子:
现在让我们将摘录发布到我的“Test Alt”项目中。
我们现在可以查看“response”变量内部,以验证此发布请求是否成功:
现在摘录已经发布,我们可以验证它在 Tableau 服务器上,我们可以用 Tableau Desktop 连接到它来构建我们的视觉效果。
这是我在 Tableau Desktop 中创建的一个快速视觉效果,它连接到已发布的摘录:
看起来,如果雪花或超市出了什么事,我的“默认”项目将受到最严重的打击。
关于我之前如何处理日期字段的一个小注意事项:因为我连接到一个已发布的提取,我需要构建一个计算字段,使用 Tableau 的 date()函数将我的每个“日期”字段转换成一个日期。
这一点也不困扰我,因为我已经因为不得不替换数据源而焦头烂额了很多次,我总是为我的字段建立占位符计算,并试图避免使用“原始”字段,因为它们会出现在 Tableau 中。但那是另一篇文章的话题了!
对于本教程来说,这就是我们的前两个里程碑(利用元数据 API 和内部 PostgreSQL 数据库)并将数据存储到 Tableau 中。超精华。
敬请关注下一个里程碑,我们将进一步了解如何在 Tableau 仪表盘中使用这些数据来构建交互式影响分析视觉效果!
里程碑 4 (ETA 是 5/13/2020):使用本文中发布的数据源构建我们的第一个影响分析仪表板。
里程碑 5 (ETA 是 5/20/2020):演示如何从所有站点提取元数据。在里程碑 1 中,我们从元数据 API 中提取数据。默认情况下,该数据特定于您通过身份验证进入的站点。使用 REST API,我们可以遍历所有可用的站点,并提取整个服务器的元数据。
里程碑 6 (TBD)
使用这个 GitHub 要点作为实现我们第三个里程碑的模板。请记住,这里的代码只是完成工作的一种可能的方法,您可以根据自己的需要修改它。
代码开始变长了(大约 300 行)。我是否建议让您的生产代码看起来像这里这样?没有。但是,将所有内容都放在一个文件中有利于概念验证的启动和运行。我将由您来决定如何将它集成到您自己的工作流中。
原文:https://towardsdatascience.com/tableau-tutorials-groups-hierarchies-a-little-extra-6e4c5d2d5cc9?source=collection_archive---------49-----------------------
照片由 麦克 发自 像素
欢迎来到我正在进行的 Tableau 教程系列的第四篇。这个博客将分为两部分,第一部分介绍组和层次结构,第二部分介绍使用计算和参数的集合和动态分组。在过去的博客中,我已经讨论了基本的数据——连接到仪表板、计算和过滤,同时非常简短地讨论了组和层次结构。在这篇文章中,我将深入到组和层次结构的更详细的解释。
当处理大型数据集时,您可能会得到比帕台农神庙更多的列。为了我们的理智和易于分析,我们希望能够以某种方式对我们的数据进行排序和分组。Tableau 为我们提供了使用集合、组、层次结构的选项,以及前面提到的根据数据或用户输入动态更新的分组的计算和参数。
首先,让我们回顾几个快速简单的概念。首先让我们考虑订购我们的数据。这通常是一项简单的任务。在这个例子中,我将使用来自电子商务网站的数据。如果我们想要查看购买最多商品的顶级用户列表,我们可以将适当的药丸拖动到列和行中来构建我们的图表。在这里,我们可以通过单击图表上的行轴或列轴上的下降条图标来轻松地对值进行排序。在这种情况下,我们希望对计数进行排序,因此我们单击列轴来显示具有最多实例或购买的用户 id。要按升序排序,我们只需再次单击同一个图标。
因为我们正在使用分组,所以让我们一直深入到最细粒度的层,也就是原始数据源。有几种方法可以查看数据源。我们可以单击看起来像数据表的图标,以及它上面的选定数据源,以查看一个弹出窗口,其中包含整体数据的视图。
为了获得更具体的信息,我们还可以单击图表中的任何一点,弹出一个窗口,显示各种选项,包括相同的数据图标。我们只需单击它,然后从随后窗口的底部,从“Summary”选项卡切换到“Full Data”选项卡。
既然我们可以向下钻取并查看我们的数据,那么让我们看看如何用层次结构对数据进行分组。顾名思义,这种方法涉及某种类型的顺序关系,允许您深入了解更多细节。例如,任何日期时间变量都会自动分组到一个层次结构中,允许您从年到月到日到小时进行钻取。在这个例子中,从 Data Source 选项卡,我将 Category Code(显示购买的项目,其间有句点以指示子类别)字段拆分为 General Category、item 和 Item Type 子类别。
若要创建层次结构,请将所需的字段标识为层次结构的第二级。将该字段拖放到您想要指定为顶级的字段上。在这种情况下,我希望 General 类别显示为顶层,所以我将项目 pill 拖动到 General 类别 pill 的顶部。从这里将出现一个窗口,我可以在其中命名层次。我称我的为“已购买项目”。您可以看到,在 Tables 部分中,药丸被分组到新的层次名称下。要添加更低的级别,我们只需将想要添加的药丸拖放到层次结构下的适当位置。当层次结构组成后,我们可以将它移动到列和行字段来构建我们的图形。要在层次结构中向下钻取,我们单击层次结构药丸中的加号,相反,要向上钻取,我们单击减号。为了构建下面的图表,我一路向下钻取,然后按项目数排序,如前所示。
我们可以组合字段中相关值的另一种方法是使用 Tableau 组。我们来举个例子。假设我们想要突出显示用层次结构生成的图表中“General Category”列下的计算机和电子产品值。在该视图中,我们可以按住 command 并单击计算机和电子设备字段,此时会出现一个弹出窗口。在此窗口中,我们单击回形针图标对这些值进行分组。
视图中的结果组将组合名称,但我们可以简单地右键单击并在“编辑别名”下将其重命名为“所有电子”。我们还可以在 Tables 部分下重命名生成的药丸。从这里,我们可以将药丸拖动到颜色部分,并从药丸下拉菜单中选择包括“其他”以根据我们的选择和“其他一切”进行分组。这使得我们能够突出显示该分组部分。
如果仅用视图进行分组很困难,我们也可以在“表格”部分右键单击我们想要分组的药丸,然后将鼠标悬停在“创建”上,然后单击“分组”,这将弹出一个菜单,我们可以在其中选择适当的字段。
在菜单中,我们还可以单击查找>>来搜索值。当我们选择了我们的字段,我们可以点击组,然后重命名。如果我们想将另一个类别添加到组中,我们单击该类别,然后在标有“添加到:”的下拉菜单中,我们可以选择它应该加入哪个组。从菜单中,我们还可以通过选择组,然后单击“取消分组”,轻松地选中“包括‘其他’”和“取消分组”。要编辑群组,请访问药丸的下拉菜单,然后单击“编辑群组…”。
分组是分离您感兴趣的值的一种强大且快速的方法。它还可用于修复拼写或数据输入错误,这些错误会导致多个字段,而实际上应该只有一个字段。使用一点脑力可以产生有趣和有用的方法来分组数据进行分析。遵循我的中等配置文件,并在下周详细了解集合和动态分组。
原文:https://towardsdatascience.com/tableau-unleashing-the-power-of-visual-analytics-3376ccf0c1f8?source=collection_archive---------28-----------------------
我用 Tableau 创建的仪表板示例
大约一个月前,我决定挑战自己,学习更多关于数据可视化的知识。在多次谷歌搜索寻找最佳数据可视化工具后,有一款产品不断脱颖而出, Tableau 。我决定安装它,试一试。作为一名学生,我可以免费使用它。然后,我打开它,看到一个大页面要求我连接数据或打开工作簿。我不知道下一步该做什么。
打开后的画面。
困惑之余,我查阅了许多关于如何使用 Tableau 的在线资源,并偶然发现了本·琼斯的用 Tableau 交流数据:设计、开发和交付数据可视化一书。我强烈推荐这本书。对于对利用 Tableau 的数据可视化能力感兴趣的初学者来说,这是非常简单明了和有用的。
它教会了我如何使用分类数据和连续数据来创建不同种类的图表,如条形图、时间序列图、散点图、箱线图和地理图。此外,我学会了如何使用过滤器、页面、标记等功能来创建高质量的工作表。最后,我找到了利用仪表板特性来构建交互式可视仪表板的窍门,这些仪表板可用于向人们讲述故事。
Tableau 是一个众所周知的快速分析和快速商业智能*台,没有更好的方式来描述它。我在过去一个月里对 Tableau 的体验非常令人兴奋。下面是一个简短的总结,介绍如何使用 Tableau 来构建漂亮的交互式视觉界面。
与 Python、R 或任何其他数据科学编程语言不同,Tableau 不需要您运行多行代码来加载数据、转换数据和创建图表。一旦你习惯了,这是非常简单的。你只需要通过将 Tableau 连接到服务器或本地文件来上传数据。一旦连接了数据,您就可以访问工作表并开始构建图表。
Tableau 上的空工作表
我喜欢 Tableau 的另一个方面是,我可以通过从 table 部分拖动字段并将其与用于创建工作表的功能集成来轻松构建图表。构建工作表的基本功能是列、行、过滤器、标记和页面。
当有人试图移动字段或操作要素时,可以立即在工作表上发现变化。我还可以使用演示功能来更改我的图表。我不再需要编辑我的代码,重新运行它,等待得到不同的输出。当你使用它时,它会不断变化。
左图是 2020 年基于收入的地图。右图是基于 2020 年人口的地图。
在上面的图表中,通过删除 marks 部分下包含收入的绿色条,并在几秒钟内用 population 替换它,进行了更改。
在工作簿中构建多个工作表后,可以将它们组合起来构建一个仪表板。Tableau 上的仪表盘可以按照你认为合适的方式进行交互。当观众/演示者与仪表板交互时,仪表板在图表中绘制见解或显示活动。这使得仪表板在讲述故事或提供高质量信息时非常有用。
交互式仪表板的一个例子
一旦建立了仪表板,用户可以决定在 Tableau Public 上与 Tableau 社区的其他成员共享它。这是通过创建一个 Tableau 公共帐户,并使用页面上的服务器功能,通过使用您的凭据登录,将仪表板连接到 Tableau 公共帐户来完成的。上传仪表板后,还可以添加仪表板的详细信息。
Tableau 是一个美丽的*台,我在过去的一个月里学会了如何使用它,我将在未来继续使用它。使用它让我对学习如何使用其他数据科学或数据可视化工具充满热情。首先,我很高兴见到了 Tableau。
下面是我通过重现汉斯·罗斯林的著名视频Stats 的喜悦 制作的视频。它显示了从 1800 年至今,不同国家的预期寿命和收入是如何变化的。我用我的 Tableau 知识建立了一个预期寿命与收入的散点图,并制作了一个交互式仪表盘。
预期寿命与收入的历史
感谢您的阅读。
原文:https://towardsdatascience.com/tableau-visualizations-dc9e544dc9a8?source=collection_archive---------19-----------------------
斯科特·格雷厄姆在 Unsplash 上拍照
Tableau 是一款端到端、强大、安全、灵活的交互式可视化分析软件,用于商业智能行业。它正在改变我们使用数据来发现和解决问题的方式。众所周知,它是发展最快的数据可视化*台之一。它的基本功能是将原始数据转换成易于理解的可视化数据,供许多个人和组织用于问题分析和决策制定。
如果你仍然不确定 Tableau 是否适合你,我建议你阅读下面的文章: Excel,Tableau,Power BI…你应该使用什么?
Tableau 产品:
让我们从这个教程开始吧。
a.转到public.tableau.com
b.点击右上角的注册
c.填写你的详细资料并记下来
a.前往 Tableau 桌面:https://www.tableau.com/products/trial
b.输入您的电子邮件地址并下载免费试用版。如果你有一个学生或教师帐户,你可以获得一年的免费许可证。
c.一旦应用程序被下载,注册自己。
你可以在这里找到这篇教程的参考资料。
让我们启动应用程序,并探索应用程序的主要组件。
第一次打开 Tableau 桌面应用程序时,会出现以下窗口。在此窗口的左侧窗格中,我们有不同的选项来连接不同的数据源,如 Tableau Server(您可以将报告直接发布到服务器)、Microsoft Excel、JSON File、Microsoft SQL Server、Google Analytics、MariaDB、MySQL 等。
在底部,tableau 提供了一些提供介绍的示例工作簿。
在右侧窗格中,我们有一些培训资源,可以帮助您更好地了解 Tableau 及其服务和功能。
在本教程中,我们将导入 excel 文件形式的数据
导入数据后,出现的窗口称为数据源窗口。
在左侧,我们有“连接”,它显示了您可以连接到的数据源。您可以在“连接”部分更新、编辑或删除选定的数据源。
下一部分是“文件”部分,通常显示数据源中的表格。
在它下面,我们有一个 Union 函数,允许您将数据追加到表中。例如,如果您有两个相似的雇员数据文件,您可以使用 union 选项来合并它们。
在 Union 选项的右侧,我们看到了表格的预览
在每个字段名的上方,我们有一个代表字段类型的图标,它由 Tableau 本身识别,可以通过点击它来修改。
在右上角,我们有另一个连接选项。在这里,Tableau 允许我们选择想要与数据建立的连接类型:实时连接或提取连接。
默认情况下,将选择实时选项。当您选择“提取”时,过滤器选项出现,这是一个非常重要的功能。使用过滤器,我们可以在我们已经过滤的特定数据上构建数据,这意味着我们不能使用我们已经过滤掉的数据。
a.点击右上角的“添加”。
b.单击出现的窗口中的添加按钮。
c.选择要在筛选器中使用的字段。例如:城市
d.在所选字段中选择您要过滤的值,然后单击“确定”
a.点击右上角的“添加”
b.在出现的窗口中,单击要编辑/删除的添加字段。
c.根据您想要执行的操作,选择“编辑”或“删除”按钮。
d.点击“确定”。
现在我们已经了解了过滤器的工作原理,让我们继续学习教程并开始创建图表。
选择窗口左下角的“第 1 页”选项,并选择您要存储摘录的位置。
现在,在左边我们可以看到我们连接的数据源。当您右键单击数据源时,您可以使用各种选项,如刷新、编辑、复制等。
在那下面,我们还有两个窗格:维度和度量
通常以蓝色显示的尺寸包含细分类别中的数据。你不能对它们进行数学运算。比如你不能把两个类别相乘。
通常用绿色表示的度量是维度的反义词。这意味着我们可以将两个场相乘。
您可以通过右键单击将度量移至维度。在这里,我们将右键单击“销售代理 ID”并将其从度量移至维度
请注意,像纬度和经度这样的字段在我们的数据集中并不存在,而是由 Tableau 在读取城市、州、地区等字段时自动添加的。
简单的方法是将类别拖到“行”和“列”字段中。
让我们将“区域”类别拖到行中,将“销售”类别拖到列中。Tableau 然后自动为我们创建一个条形图。
在 Tableau 桌面的右上角,我们有“演示”选项,Tableau 显示各种类型的图表,我们可以用它们来可视化我们的数据。
要清除工作表,您可以单击“清除工作表”图标。
要撤消或重做图表上的操作,可以单击应用程序左上角的箭头按钮。
现在让我们创建一个可视化视图来按月查看销售额。
首先,将“订单日期”拖到列中,单击它旁边的箭头并选择“月份”,因为我们希望按月查看我们的销售额。
你可能会注意到,有两个部分的年,季度,月等。第一部分仅表示日期的一部分,但第二部分显示月份和年份,因此我们将从第二部分中选择月份。
列字段以前是蓝色的,现在变成了绿色。这是因为我们把年份改成了月份。蓝色表示场是离散的,绿色表示场是连续的。连续基本上意味着连续的数据点。因为时间是连续的,所以它是绿色的,而像类别这样的字段是绿色的,因为类别彼此不相关,它们是离散的。
接下来,要按月显示我们的销售额,我们需要将“销售”类别拖到行字段中。当你这样做时,Tableau 自动将“SUM”操作添加到 Sales 类别中,这基本上意味着它对数据集的每一行进行求和。要查看除 SUM 之外要在数据集字段上执行的其他操作,请单击它旁边的箭头。现在我们将离开操作是一个总数。
接下来,让我们以这样一种方式来改变可视化效果,即用户可以按特定年份的月份来查看销售额。为此,我们需要按年份过滤数据集,因此将订单 ID 字段拖到“过滤器”卡上,并选择年份。然后选择特定的年份,在我们的例子中是 2019 年,最*的一年。
让我们整理一下我们的销售额,因为它是一种货币。因此,请转到“Measures”下的“Sales”字段,单击“Default Properties”并选择“Number Format”选项,因为这是我们打算更改的内容。然后选择“货币(标准)”并选择“英语(美国)”,因为我们的销售货币是美元。之后,转到“货币(自定义)”,将小数位数更改为 0,然后单击“确定”。您的图表应该如下所示:
接下来,我们引入一条*均线。
在窗口左上角的“分析”窗格中,将“*均线”选项拖到出现在窗口中的表格选项中。
要进一步自定义该行,请单击该行并转到编辑。选择一个自定义标签并输入“*均值:
此外,你可以选择线的类型,它的颜色等。
双击图表中的“工作表 1”。清除当前数据。写下“销售日期”,并在其前面添加一个动态日期,单击此窗口右上角的插入,并选择“年份(订单日期)”。
此外,您可以更改标题的字体类型或大小,将其加粗并居中对齐。
要检查我们的动态标题是否有效,或者只是查看不同年份的数据,右键单击“YEAR(Order Date)”过滤器,然后选择“Show Filters”选项。选择或取消选择任何年份,查看标题如何根据所选年份动态工作。
在标记窗格中,我们可以更改线条的颜色和大小。
要在每个点上添加标签,请将“销售”指标拖放到“标记”下的“标签”字段中。要修改标签,右键单击它,转到格式,单击默认下的“数字”,转到货币(自定义),将十进制值更改为“0”,并将数据前缀更改为“$”。
继续自定义标签,右键单击“标记”窗格下的“标签”,并在“字体”部分编辑字体,如下面的视频所示。
要进一步自定义图表,请右键单击图表上的任意位置,然后选择“格式”选项。您可以在“格式”窗格的“工作表”字段下更改字体样式。在本节中,您可以继续探索更多的功能。
除了这一部分的图标,我们有对齐部分,其次是阴影部分。在阴影部分,您可以更改图表的背景颜色。
要删除网格线,请单击“线条”选项,并将“网格线”字段更改为“无”。
首先,让我们双击当前工作表,将其重命名为“按年销售”。您可以通过单击窗口底部当前工作表名称右侧的“新建工作表”按钮来添加新工作表。然而,为了我们的教程,我们将右键单击我们当前的表并复制它。让我们将这个复制的图表重命名为“按类别销售”。
正如新工作表的名称所示,我们现在将在该工作表中创建一个不同的图表。从“列和行”节中删除“月”(订单日期)和“总额”(销售额)字段。相反,将 SUM(Sales)和 Category 字段分别从左窗格拖到 Columns 和 Rows 部分。这将自动为您创建一个条形图(如果没有,请选择窗口右上角的演示部分下的条形图选项)。
现在,我们可以通过在顶部窗格中将图表的适合度从标准更改为完整视图来增加条形的宽度,如下所示。
再次添加标签,将“销售”字段拖动到“标记”窗格下的“标签”部分
请注意,由于我们复制了我们的工作表,前一个工作表中的设置在这里仍然是相同的。例如,文本是粗体的,没有网格线,等等。
Tableau 的另一个功能是可以根据数据改变条形的颜色。为了更好地理解这一点,尝试将“销售”度量拖到“标记”窗格下的“颜色”上,它将显示如下。
蓝色最浅的条形销售额最少,蓝色最深的条形销售额最多。Tableau 在这里显示蓝色作为默认配色方案,但我们可以通过在“标记”窗格中单击“颜色”并编辑颜色来轻松选择不同的颜色组合。为了与之前的图表相匹配,我们将选择绿色作为条形图的配色方案。
为了对条形图进行排序,我们在顶部窗格中有一个升序和降序选项。
复制“按类别销售”表,并将其重命名为“产品/订单”。拖出并删除过滤器中除“年份(订单日期)”字段之外的所有字段。现在让我们创建一个直方图,看看在一个订单中是否售出了 2 个或更多的产品。为此,双击“数量”测量,并在“演示”选项中选择“直方图”。您希望确保容器大小为 2,因此右键单击“数量(容器)”维度,并将容器大小编辑为 2。
这个柱状图告诉我们的是,有 337 个订单的数量在 0-2 之间,1450 个订单的数量在 2-4 之间,以此类推。像我们之前更改其他图表的颜色一样更改直方图的颜色,以便我们在最后创建的仪表板的主题是统一的。您也可以通过按住 Ctrl 键并将 CNT(数量)从行拖动到标记窗格下的标签字段来添加数量标签。此外,双击图表的标签,因为这是一个不同的图表,而不是我们复制此工作表的图表。
复制直方图,并像我们之前做的那样将其重命名为“销售图”。将图表的标签也更改为销售地图。在开始绘制地图之前,我们需要创建一个层次结构,因为 Tableau 需要知道哪个是您的州字段,以及该字段链接到哪个国家。若要创建层次结构,请将“州”、“城市”和“邮政编码”维度拖到“国家/地区”维度上。确保您保持了层次结构,即首先必须出现“国家/地区”维度,然后是“州”、“城市”和“邮政编码”。如果出现错误,您可以随时将这些字段上下移动。此外,将层次结构拖到标记窗格下的“详细信息”字段。出现一张地图。您可能还注意到,“国家/地区,州”字段出现在标记窗格中,其左侧有一个“+”号。当您点击它时,下一个版本的层次结构就会出现,让我们开始吧。现在,双击“销售”度量,将销售值添加到地图中。此时,您的地图应该如下所示:
我们还可以在地图上以不同的方式显示我们的数据。只需转到演示并选择地图图表。(上图是一个符号图表。)就像我们前面所做的那样,我们可以通过在拖动“销售”字段(因为这会创建字段的副本)的同时按住 Ctrl 键,将“销售”的标签添加到我们的地图中,该字段已经存在于“标记”窗格中。要进一步格式化此标签,请右键单击并选择格式化。在“默认”下的“数字”字段中,将显示单位更改为千(K)。我们的地图现在看起来像这样。
像往常一样,复制以前的“销售地图”表,从标记窗格中拖出所有字段以及行和列。双击 Sales Measure,转到“演示”并选择应该是第一个选项的文本表。让我们对此进行一些定制。在顶部窗格中,将“标准”调整为“整个视图”。在“标记”窗格中,单击“文本”并增加字体大小,将对齐方式改为居中。现在我们的销售卡准备好了。您可以使用相同的方法为不同的类别创建卡片。
要创建仪表板,请单击窗口底部的“新建仪表板”按钮。
您创建的所有工作表都将出现在窗口的左侧。让我们将仪表板的大小更改为 1400 像素和 900 像素。此外,如果您希望更改仪表板背景颜色,您可以转到窗口顶部的仪表板选项并选择格式选项。
要将可视化添加到仪表板,只需将它们拖放到仪表板上。要隐藏可视化的标题/标签,右键单击并选择隐藏标题选项。这就是你的第一个仪表盘
目前,我们的仪表板正在显示 2019 年的销售数据。如果我们添加一个过滤器,用户可以选择年份,并相应地查看特定年份的所有可视化效果。为此,单击任何图表,并在过滤器选项下选择“订单日期年份”。这就是我们的过滤器。我们可以通过单击它旁边的箭头并选择“多值下拉”选项,将其更改为下拉过滤器。要确保此过滤器适用于选择特定年份的每个图表,请右键单击过滤器并转到“应用于工作表”下的“所选工作表”,选择“全部在仪表板上”选项,您就可以开始了。
最后,让我们将仪表板发布到 Tableau public。为此,单击窗口顶部的“服务器”,输入您的登录详细信息,命名您的仪表板。
本文到此为止。我希望你喜欢用 Tableau 可视化数据。
谢谢你阅读它!
原文:https://towardsdatascience.com/tableau-vs-r-shiny-which-excel-alternative-is-right-for-you-488da22e82b6?source=collection_archive---------16-----------------------
截至 2020 年底,有许多 dashboard/reporting/BI 工具,其中最受欢迎的是 Tableau、PowerBI 和 R Shiny 。问题很快就变成了— “我如何为我的特殊需求确定合适的工具?”今天,我们将比较财富 500 强公司最广泛使用的两种工具:
让我们弄清楚一件事——R Shiny 不是一个报告/仪表板工具。大多数人用它来做仪表盘,所以我们可以认为这个比较公*。如前所述,R Shiny 是一个完整的 web 框架。与 Tableau 等工具相比,它带来了一些明显的好处和一些需要注意的事项。
我们将检查 Tableau 和 R Shiny 相互竞争的以下领域,并宣布每个领域的获胜者(或*局):
Tableau 提供了两个与数据连接相关的选项。首先,你可以连接一个本地文件——比如 CSV 、 Excel 、 JSON 、 PDF 、 Spatial 等。或者,您可以连接到远程服务器。选项太多了,无法一一列出,所以这里有一个当前产品的截图(2020 年末):
所以是的,Tableau 有很多选择。另一方面,R Shiny 使用 R 作为编程语言的选择,所以 Shiny 可以连接到 R 可以连接的任何源。就像它的竞争对手一样,这里的选择是无限的。一个简单的 Google 搜索将会产生一个预制的库或者任何数据源类型的 API 调用示例。
对于特定领域的来源,R Shiny 有时会有优势。例如,使用 R Shiny,您可以加载和分析基因表达数据或 CAD 文件。这些来源对 Tableau 来说可能是个问题。
赢家(连通性):*手,在特定领域的情况下,R 的边发亮
再一次,Tableau 在这里并不缺乏,它有过多的可视化选项,如条形图、饼图、折线图和面积图,甚至还有更复杂的选项,如地理图。完整列表请参考下图:
尽管如此,R Shiny 在图表类型的可选性方面击败了竞争对手。使用最广泛的可视化库是和。以下是你可以用制作的可视化类型的概述:
来源:https://www.r-graph-gallery.com
这里有一些你可以用做的很酷的事情:
来源:https://plotly.com/r/
就图表选项而言,赢得这场战斗是显而易见的。
赢家(图表类型):R 闪亮
现在,我们将看到在 Tableau 和 R Shiny 中创建一个简单的条形图需要经历的困难程度。出于演示的目的,我们将使用 Titanic 数据集,因此如果您想继续学习,请下载此处链接的 CSV 文件。更准确地说,我们将创建一个条形图,在 x 轴上包含乘客等级,在 y 轴上包含*均年龄。
让我们从 Tableau 开始。数据导入后,创建可视化相对容易。只需遵循下图中的步骤:
这非常容易,因为 Tableau 被设计成对非技术人员来说直观和简单。这种易用性伴随着被称为可定制性的成本,但稍后会有更多的介绍。
用 R Shiny 创建一个简单的图表是完全不同的事情。我们需要编写实际的代码来得到一个简单的条形图。首先,我们需要以某种方式聚合庞大的数据集,这样我们就有了一个简洁的、可视化的数据格式。接下来,我们需要引入一些样板文件来管理 UI 和服务器。它只有几行代码——对于较大的项目来说可以忽略不计,但是对于非技术人员创建简单的图表来说却是一个真正的障碍。
请参考下面的代码:
结果如下:
如您所见,如果您需要的只是简单直观的数据可视化,而没有任何交互元素,那么使用就毫无意义。这就是 Tableau 大获全胜的地方。如果你仍然想用 R 来制作图表,并且你愿意努力去做一些完全可定制的东西,那么和是很好的选择。
然而,对于非技术人员来说,即使用 R 制作简单的图表也是一项繁重的任务。我们推荐 Tableau 来完成这类任务。
赢家(简单图表):Tableau
好吧,让我们看看谁会在仪表板之战中获胜。我们在这里不会太复杂,因为仪表板开发是一个涉及很多方面的非常广泛的主题。下面是我们将放入仪表板的图表概要:
此外,当用户更改两个筛选器之一时,所有三个图表都应该更新:
这是最后的仪表板在场景中的样子:
这整个仪表板需要 0 行代码。我们只需要几分钟点击正确的地方。在 R Shiny 中,仪表板的情况是不同的,因为我们需要在那里编写实际的 R 代码。然而,这不是一个太糟糕的交易,因为 R 相对容易学习,并且对于闪亮的仪表板来说,定制的可能性是无穷的。
以下代码重新创建了 Tableau 中的仪表板:
这是最终产品的样子:
如你所见,这个仪表板还没有完成。这就是我们将在文章的最后一部分讨论的内容。在这里很难宣布一个明确的赢家,但 R Shiny 的仪表板感觉更坚实。Tableau 的仪表板对意外点击太敏感了,在股票状态下,仪表板看起来非常相似。
然而,正如我们看到的,你可以用 Tableau 比用 R Shiny 更快地制作一个简单的仪表板。出于这个原因,我们将宣布 Tableau 是简单仪表板的赢家,但仅仅是因为的易用性。正如您将看到的,如果您打算提升仪表板的复杂性和视觉风格,R Shiny 是一个更好的选择。
获胜者(简单的仪表盘):被鼻子牵着鼻子走的画面
在我们的场景对比中,这是事情变得特别有趣的地方。在 Tableau 中,你不能对用户输入做什么——它非常有限,因为它不是为这类事情设计的。
然而,输入对于构建良好的交互式仪表板来说是必不可少的,因为它们提供了一种与应用程序交互的方式。互动性是 R Shiny 严重抢眼 Tableau 的地方。
R Shiny 提供了广泛的输入选项。与其罗列它们,不如展示其中的一些:
是的,这是很多,你当然可以用它们做任何任务。作为商业用户,你可能会立即想到一个问题:为什么交互性如此重要?
互动使得任何数据集都更容易分析。例如,文件输入组件可以让您上传自己的文件,以便在仪表板中浏览,然后通过日期(日期范围输入)和列选择器( var select )进一步过滤。这与只读仪表板形成对比,只读仪表板不允许用户上传数据或与数据交互。
使用 R Shiny 仪表板,您还可以构建具有密码和文本字段输入功能的完整交互式表单。这为闪亮的最终用户增加了另一个关键的可选层。交互性是简单仪表板与强大的企业级业务工具之间的主要区别。
赢家(用户输入):R 闪亮
不幸的是,你没有太多的办法来调整画面的视觉效果。它被设计成开箱即用的样子,并且由你来改变颜色、坐标轴、标题、字体和其他小东西。可调整方面的数量取决于你调整的情节类型,但一般来说,Tableau 不会像 Shiny 那样给你太多的控制。
以下是如何更改直方图颜色的示例:
亮亮完全是另一种动物。你可以定制一切。首先,在您的所在的位置创建一个文件夹。在里面,创建一个文件。是的,你说对了——我们可以使用 CSS 提供的一切来设计闪亮的仪表盘。
为了将闪亮的应用程序连接到 CSS 文件,我们可以将放在 R 文件中的之后。仅此而已。真的就这么简单。以下是我们用 CSS 和 R Shiny 在几分钟内完成的工作:
视觉造型部分的赢家再一次非常明显。当谈到视觉定制时,R Shiny 让 Tableau 相形见绌,即使 Tableau 仪表盘开箱后看起来相当不错。
获胜者(视觉造型):R 闪亮
根据我们的计算,最终结果如下:
那么,闪亮是所有情况下的明显赢家吗?嗯,不是。这取决于你需要做的工作类型。如果你需要快速绘制一个图表或图形,或者需要时不时地制作一个非常简单的仪表板,那么 Shiny 可能有些过头了。Tableau 正是为这类任务而设计的。此外,如果您是一个非技术人员,并且您不想过多地钻研实际代码,那么 Tableau 对于简单的图表和仪表板是一个很好的选择。
此外,请记住 Tableau 不是免费的。Tableau 许可证从每年 70 美元的基础上上涨,所以它不是一个便宜的软件。对于财富 500 强公司来说,这不是一个问题,但如果你是一个试图决定选择正确工具的个人,Tableau 的价格可能会成为一个交易破坏者。或者,R Shiny 是一个开源解决方案,完全免费使用(尽管如果你需要在线托管你的 Shiny 应用,你可能需要投资一个 RStudio Connect 许可证)。
加入我的私人邮件列表,获取更多有用的见解。
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
[## 通过我的推荐链接加入 Medium-Dario rade ci
medium.com](https://medium.com/@radecicdario/membership)
原载于 2020 年 10 月 14 日https://appsilon.comT22。
原文:https://towardsdatascience.com/tableaus-ai-enabled-explain-data-feature-c1c6380f9b66?source=collection_archive---------49-----------------------
图片由 chenspec 来自 Pixabay
数据分析师创建数据可视化的原因之一是为了发现意外和不寻常的情况。在 viz 中直接获得一些更详细的信息越容易,我们所有人的状况就越好。Tableau 通过其功能“解释数据”帮助满足了这一需求。据说是由“人工智能”驱动的,当请求解释数据时,会提供额外的见解。
使用我为早先的文章创建的工作簿,我可以进一步调查我的糖果销售数据。这是一个简单的例子,基于非常简单的数据,便于复制。
相关性并不意味着因果关系
在 Tableau 公共桌面应用程序中,我可以单击一个数据点。对于可用的数据点,您会看到一个小灯泡。点击那个灯泡。
这将创建一个弹出窗口,其中包含对该数据点的更多分析。如果单击带标记的图标(下面用黄色圈出),图表将作为新工作表添加到工作簿中。
对解释数据进行人工智能分析的重点是不同数据特征之间的相关性和关系。这是我提醒你的地方;再说一次,相关性并不意味着因果关系!这个过程试图根据这些相关性来解释数据点的价值。
我的例子非常简单。下面是 Tableau 提供的一个例子:
[## 解释数据
www.tableau.com](https://www.tableau.com/products/new-features/explain-data) [## 使用解释数据检查视图
help.tableau.com](https://help.tableau.com/v2020.3/public/desktop/en-us/explain_data.htm) [## 解释数据如何工作
help.tableau.com](https://help.tableau.com/v2020.3/public/desktop/en-us/explain_data_explained.htm) [## 解释数据:状态信息
help.tableau.com](https://help.tableau.com/v2020.3/public/desktop/en-us/explain_data_lm_status.htm)
如您所见,在 Tableau 应用程序中开始使用解释数据并不费力。这有助于指出哪些数据点可能需要进一步分析。这可能会节省你的时间,可以让你避免隐藏的惊喜。虽然统计分析在这个时候似乎仅限于关系和相关性,但 Tableau 开发更复杂的分析的大门是敞开的。
原文:https://towardsdatascience.com/tabpy-combining-python-and-tableau-511b10da8175?source=collection_archive---------1-----------------------
由paweczerwi324ski在 Unsplash 拍摄的照片
我们能把 Python 计算的能力和 Tableau 结合起来吗?
这个问题鼓励我开始探索在 Tableau 中使用 Python 计算的可能性,最终我得到了一个 TabPy。
那么,塔比是什么?如何使用 TabPy 来集成 Python 和 Tableau?
在本文中,我将介绍 TabPy,并通过一个例子说明如何使用它。
TabPy 是来自 Tableau 的分析扩展,它使我们作为用户能够使用 Tableau 执行 Python 脚本和保存的函数。使用 TabPy,Tableau 可以动态运行 Python 脚本,并将结果显示为可视化。用户可以通过在 Tableau 工作表、仪表板或使用参数的故事中进行交互来控制发送到 TabPy 的数据。
你可以在官方的 Github 资源库中阅读更多关于 TabPy 的内容:
[## 表格/标签
github.com](https://github.com/tableau/TabPy)
我假设您的系统中已经安装了 Python。如果没有,可以先去https://www.python.org/下载 python 安装来安装。然后你可以把它安装到你的系统中。
接下来,我们可以使用将 TabPy 安装为 python 包
一旦安装成功,我们可以使用以下命令运行服务:
如果一切顺利,您应该会看到:
奔跑的塔比。作者图片
默认情况下,该服务将在本地主机的端口 9004 上运行。您也可以通过在 web 浏览器中打开它来验证它。
TabPy 服务器信息。作者图片
现在,让我们去我们的桌子,并设置服务。我用的是 Tableau 桌面版 2020.3.0。然而,在以前的版本中也不会有什么不同。
首先,转到帮助,然后选择设置和性能,并选择管理分析扩展连接。
分析扩展连接位置。作者图片
然后,您可以设置服务器和端口。您可以将用户名和密码留空,因为我们不会在 TabPy 服务中设置凭据。
完成后,单击测试连接。如果成功,您将看到以下消息:
恭喜你!!现在,我们的 Tableau 已经和 TabPy 连接好了,可以使用了。
我们可以使用两种方法来进行 Python 计算:
在本文中,我将只展示如何做第一种方法,我们将直接编写代码作为 Tableau 计算字段。
例如,我们将对通过 Tableau 网站公开的 Airbnb 数据集执行聚类,您可以使用这个链接下载它。我们将使用几种流行的聚类算法,根据每个邮编的住房特征对其进行聚类。
第一步,让我们将数据集导入 Tableau。该数据集有 13 列。
因为我们的主要目标是了解如何使用 TabPy,所以我们不会专注于创建最好的模型。因此,我们将仅使用该数据集中的以下变量来执行聚类:
我们需要创建两个参数来选择我们的聚类方法和聚类数,它们是:
创建一个参数。作者图片
聚类数参数。作者图片
聚类分析算法参数。作者图片
我们将创建一个 python 脚本作为 Tableau 中的计算字段。
创建计算字段。作者图片
然后,您可以在计算字段中插入以下脚本。
这段代码封装在 Tableau 的 SCRIPT_REAL()函数中,将执行以下操作:
然后,我们将结果转换成字符串数据类型,使其成为分类数据。
还有一点需要注意的是,我们需要在 Zipcode 中进行表计算。因此,我们需要将默认的表计算更改为 Zipcode,以使该代码有效。
更改默认表计算。图片作者。
现在,是时候可视化结果了。我使用 Zipcode 创建一个地图来可视化聚类结果。我们可以使用参数来改变聚类的数量。
由 Elisha Terada 在 Unsplash 上拍摄的照片
让我们庆祝走到这一步!如果您按照步骤操作,您已经成功地集成了 Python 和 Tableau。这种集成是使用 Tableau 和 Python 的更高级用例的开始。
我期待着看到您用这种集成构建的东西!
Bima 是一名拥有 Tableau 桌面专家认证的数据科学家,他总是渴望扩展自己的知识和技能。他毕业于采矿工程师专业,通过 HardvardX、IBM、Udacity 等各种在线项目开始了他的数据科学之旅。目前,他正与 DANA Indonesia 一起在印度尼西亚建立一个无现金社会。
如果您有任何反馈或任何要讨论的话题,请通过 LinkedIn 联系 Bima。很高兴和你联系!
原文:https://towardsdatascience.com/tabular-prediction-using-auto-machine-learning-autogluon-de2507ecd94f?source=collection_archive---------15-----------------------
在这篇文章中,我分享了我使用 AWS labs 的Auto****MachineLearning(AutoML)autoglon对表格预测(使用剩余列预测表格数据集的目标列)的探索,以及关于其内部工作的细节。
A utoML 框架提供了诱人的选择,因为它们消除了新手训练高质量模型的障碍,并且对于专家来说,它们减少了第一个可行模型的时间,专家可以通过基于数据分析和领域知识的特征工程来进一步微调。一些流行的开源 AutoML *台有
AutoGluon 是一个用于深度学习的 AutoML 工具包,它自动执行端到端的机器学习任务,使我们能够用很少的代码行实现强大的预测性能。AutoGluon 目前支持下图所示的五个主要任务,并且还支持自定义 mxnet 或 PyTorch 模型。在这篇博客中,我们将深入探讨使用自动增长及其内部工作的表格预测任务。
自动登录中预定义的任务
对于表格预测任务,支持使用自动增长进行高质量建模的主要因素有
自动登录表格支持二进制分类、多类分类和回归问题类型,如果未提供问题类型,实际问题类型将根据目标列的值自动推断。自动增长表格目前训练所有以下模型
AutoGluon 表格深度神经网络是一个精心设计的神经网络,它由一个前馈网络组成,该网络具有线性快捷路径以及针对表格数据的每个变量嵌入,这些表格数据缺乏*移不变性以及可由卷积利用的图像或文本的局部性。表格深度神经网络的架构和模型细节如下所示。
自动旋转神经网络结构。图片来源:https://arxiv.org/pdf/2003.06505.pdf
自动增长神经网络模型详细信息
表格神经网络使用一个数字块,它由一个密集连接的神经网络层组成,并对实值特征进行重新激活。表格网络的宽和深块由一个混合顺序块组成,该混合顺序块具有两个密集连接的神经网络层,其大小为 256,128 ,根据多类分类的类数进行缩放。网络的广阔部分有助于记忆,网络的深层部分有助于归纳。
AutoGluon 还使用多层堆栈组合以及 k-fold bagging 来大幅降低最终预测的方差,如下图所示。下图所示的多层堆叠在基础层有多个模型,其输出被连接并提供给下一层,下一层也由多个堆叠器模型组成。这些堆叠器模型是具有与基础层相同的超参数的基础模型,并且被馈送了基础层模型的级联输出以及输入。
多层堆叠,image credit:https://arxiv.org/pdf/2003.06505.pdf
如果自动堆叠为真,则使用公式 min(1,max(0,math.floor ( number train rows /750))试探性地计算堆叠层数。 和使用公式 min(10,max(5,math . floor(num _ train _ rows/100))启发式地计算装袋折叠数
自动插补使用中值插补用于缺失数值,使用分位数归一化用于偏斜分布,标准归一化应用于所有其他变量。
对于分类特征,如果离散等级大于 4,自动生成使用嵌入层,否则使用一键编码。
AutoGluon fit() 函数调用实现了学习高质量预测模型的所有功能,下面的伪代码总结了整体训练策略。训练后的每个模型被立即保存到磁盘以用于容错,并且模型按照复杂度从低到高的顺序被连续训练以保持时间包络。
训练策略,形象学分:https://arxiv.org/pdf/2003.06505.pdf
fit()函数通过各种输入参数提供了良好的自由度,下图显示了所有主要的输入参数,以符合它们的默认值,从而生成可靠的高质量模型,并可以通过进一步试验这些参数进行改进。
自动拟合输入参数
重要参数之一,预置中的拟合函数控制预测精度、推理延迟和资源使用。下表显示了不同预设在奥托集团产品分类挑战赛中预测准确性、训练时间、推理时间和 kaggle 等级的详细比较。‘high _ quality _ fast _ inference _ only _ refit’提供预测准确性和推理延迟的最佳折衷。
奥托集团产品分类自动引导预设性能
另一个重要参数是 time_limits ,它控制 fit 函数应该运行多长时间,如果在线环境的训练模型在指定时间内实时更新模型是重要的话。基于堆栈级别、装袋折叠数和基础模型数,为不同的超参数优化分配时间限制。
*time _ limits _ hpo = time _ limits/(1+num _ bagging _ folds (1+stack _ ensemble _ levels))
安装 pip3 的指令
安装 MXNET 的说明
从 https://mxnet.apache.org/versions/1.7/get_started?选择基于操作系统/*台的合适版本
MXNET 配置,图片来自https://mxnet.apache.org/versions/1.7/get_started?*台=linux &语言=python &处理器=gpu &环境= pip&
安装自动旋转的说明
下载泰坦尼克号数据集
使用自动旋转训练模型
提交后,我们查看了 kaggle competition Titanic 上的分数,在我的提交页面下,我们得到了一个分数 0.78708 ,排名在 top 15% 之下的是好的,在应用了一个特征工程后,我们可以进一步提高这些模型的预测能力。
AutoGluon 在几行代码中实现了表格预测任务的竞争性准确性,并且对于新手和专家都有一个工具包是很好的。通过新颖的体系结构和时间约束容错训练策略,实现了自动旋转中预测任务的灵活性、效率和易用性。
感谢您阅读这篇文章,我希望这对您有所帮助。如果你有,请在你最喜欢的社交媒体上分享,这样其他人也可以找到它。此外,如果有不清楚或不正确的地方,请在评论区告诉我们。
原文:https://towardsdatascience.com/tackling-climate-crisis-with-machine-learning-d9426fe1f5a9?source=collection_archive---------45-----------------------
海洋温度上升严重影响海洋物种和生态系统。气温上升会导致珊瑚漂白,海洋鱼类和哺乳动物失去繁殖地。机器学习有助于预测水温上升的原因,并及时缓解温度上升。
在这个实验中,我使用了加州合作海洋渔业调查(CalCOFI)的数据集,它包含了 60 年的海洋学数据,托管在 ka ggle:https://www.kaggle.com/sohier/calcofi
CalCOFI 数据集代表了世界上最长(1949 年至今)和最完整(超过 50,000 个采样站)的海洋学和鱼类幼体数据时间序列。它包括关于温度、盐度、氧气、磷酸盐、硅酸盐、硝酸盐和亚硝酸盐、叶绿素、透射计、PAR、C14 初级生产力、浮游植物生物多样性、浮游动物生物量和浮游动物生物多样性的数据。这里我将重点介绍通过使用机器学习来预测水温的内容。让我们从导入库和数据开始吧!
我现在将重点关注一些变量,所以让我们将数据帧切片。
我们可以看到 7 个变量似乎与温度更相关。然而,我们将删除七个中的一个,因为它指的是瓶号,而不是一个重要的变量(BtlNum)。我们将在模型中保留 6 个参数,并移除其他变量。
如您所见,有 6 列。我们的目标变量将是 T_degC,它代表水温。其余的列将用于预测水温(目标变量)。因此,它是多种多样的。
看起来我们有很多缺失的值。有不同的方法来处理缺失值。一种方法是用*均值填充它们。首先,我们需要检查数据是如何分布的。
看起来对于 O2Sat 和 Oxy_ mol/Kg,我们可能希望使用归一化。fillna()使用*均值,而不是。dropna()。对于其他变量,似乎没有很大的区别。为了标准化,让我们用所有七个变量的*均值代替所有缺失值。最后,我们可以标准化我们的数据集。
完美!我们用*均值代替了所有 NA 值。
我们将通过以下步骤创建一个模型:
如果你看一下这个图表,你会发现这个分布几乎是正态的。最小 1.44°C,最大 31.14°C,跨度相当大。这就是为什么我们希望看到水数据(氧气、饱和度、盐度等)的关系。)和水温作为我们要了解的变量哪个影响最大。
前面的函数将 pandas 数据帧转换为 Numpy 数组。inputs_array 是输入变量的所有值的数组,输入变量是我们用来预测目标变量(或自变量)的特征,targets_array 是目标变量(即水温)的所有值的数组。因此,我们将数据转换为适合我们机器学习模型的格式。
结果如下:
下面的张量运算将 numpy 数组和转换成 PyTorch 张量。为了标准化,我们将数据类型设置为。
接下来,我们需要为训练和验证创建 PyTorch 数据集和数据加载器。我们将从创建一个开始。
现在,我们将把数据分成两个数据集:
实际上,我们正在使用这个数据集来“训练”我们的模型。机器学习模型基于它改变它的权重和偏差(我们假设它是线性回归)。
我们使用这个数据集来实际测试学习算法是否理解,而不是记忆。这模拟了模型在现实世界中的表现
这里,我声明 val_percent = 0.15,这意味着我将使用 15%的数据集作为验证数据集,85%的数据作为训练数据集。而且我是随机拆分的,这样学习算法案例就可以无偏地学习,增加性能更好的机会。
最后,我们可以为培训和验证创建数据加载器。
在这里,我使用 DataLoader 将数据分成几批。批次将 batch_size number 元素分组到 DataLoader 中的一个组中。此外,我将 train_loader 中的 shuffle 设置为 True,这意味着批次将被打乱,使得训练公*且随机,这再次增加了算法更有效地拾取的机会。在这里,我使用的批量大小为 32。
前面的函数可能看起来让人不知所措,但是我们可以分解它。nn。模块表明我们正在扩展 Pytorch 模块。在 init (初始化式)中,我们声明 self.linear = nn。使用 Pytorch 的线性建模。这本质上是一个简单的线性回归。因为线性模型最简单,而我们的目标变量是连续变量。不然就是分类问题了。
“Forward”函数将训练数据集中的输入变量 xb 插入到线性模型中,并通过模型获得预测的目标变量值,即水温。
training_step 函数返回每批的计算损失。损失函数是特定于问题的,即,它可以针对不同的数据集和 ML 问题而改变。这里,我使用 Huber 损失(*滑*均绝对误差)作为损失函数。与*方误差损失(MSE)相比,该函数对异常值不太敏感。我决定使用这个基于目标变量的准正态分布的损失函数。
Validation_step 函数使用验证数据集来评估使用训练集训练模型准确性。它还返回 Huber 损失函数的结果。
Validation_epoch_end 返回验证数据集评估的*均值(损失函数),然后返回损失的*均值。这里,设置为 20 个历元,意味着每 20 次迭代(历元=用于训练和改变权重和偏差的迭代),将返回*均值。
现在,让我们创建模型对象:
现在,让我们检查我们的默认权重和偏差。请注意,所有参数都是随机选择的,因此会给出不正确的结果。
这些是我们模型的参数。等式中的模型可以表示如下:
y =-0.2380 x1+0.3374 x2+0.1023 x3-0.0871 x4-0.2690 X5-0.2864 X6
其中 y 是水温。x1 是以米为单位的水深,x2 是盐度,x3 是以 ml/L 为单位的 O2 测量值,x4 是 sigma-theta(海水密度),x5 是氧饱和度,x6 是 Oxy_ mol/Kg。如您所见,盐度的权重最大,海水密度的权重最小。
现在,为了评估我们的模型,我们将定义如下两个附加函数:
evaluate function 计算每批验证数据集的损失函数值(请记住,我们也将验证数据集划分为批),并返回损失函数与预测值的*均值。这就给出了我们模型的最终评价。
Fit 函数接受 epoches(迭代次数)、学习率、模型、train_loader(训练数据)、val_loader(验证数据)、设置为梯度下降的 opt_function,这是我们之前讨论过的。该函数使用梯度下降算法和每个历元计算最小点,它使用验证数据和评估函数返回结果以返回其性能。
现在,这是初始参数性能的结果:
112 左右是分数,很高!现在使用梯度下降,让我们改进。
它看起来是这样的:
从默认参数的大约 112 的错误分数,我们把它降低到大约 0.4!现在,让我们用一些真实值进行实际测试!
0.16 C 左右的差距,还不错!看起来我们选择的变量可以很好地预测水温。
0.18℃左右的差价,还不错!
在此感谢 Jovian.ml 团队(尤其是 Aakash 先生)!
如果你对学习机器学习感兴趣,可以在 freecodecamp youtube 频道查看他们的视频。通过他们的材料学习 PyTorch 到目前为止是一次有趣的旅程!
如果你喜欢我的工作,想支持我…
原文:https://towardsdatascience.com/tackling-gender-bias-in-word-embeddings-c965f4076a10?source=collection_archive---------14-----------------------
照片由 Unsplash 上的 Dainis Graveris 拍摄
ord 嵌入是自然语言处理的基础。但是他们没有固有的偏见吗?想象一下,谷歌搜索“酷酷的程序员 t 恤”,谷歌只回复男性 t 恤。随着已经显示出性别偏见迹象的 BERT 被纳入谷歌搜索,人们不需要想象。随着我们不断看到这些系统在日常生活中的使用越来越多,保持定义人工智能的“智能”本质上无偏见是必不可少的。
这可能是单词嵌入最广为人知的成就。(来源—此处)。
当 Word2Vec 首次公布其成果时,这种关系也让计算机科学界产生了怀疑。单词的向量表示的概念是 NLP 的主要支柱之一。然而,正是这些词的嵌入甚至可以吸收人类世界的偏见。
事实上——当我在谷歌新闻向量上尝试时,我得到了惊人的结果。(来源——自己)
(In)上述著名结果真正指出了问题的隐含本质。事实上,这些庞大的模型是基于人类文学的语料库来训练的,这些语料库是有偏见的。
博鲁克巴斯等人。男人对于电脑程序员就像女人对于家庭主妇一样?消除单词嵌入的偏见 ”进一步阐明了对这种性别偏见的一些分析,以及我们如何努力克服它。幸运的是,这些模型包含了足够的信息,甚至可以在一定程度上减轻这种偏差。
本质上,模型被训练的语料库有一些性别中性的词,如“垒球”、“接待员”和“程序员”。还有一些性别专有的术语,如“女商人”、“父亲”和“母亲”。据观察,性别中立的术语获得刻板印象和偏见,由于他们在语料库中出现的语境。
例如,假设对于卡内基梅隆大学的计算机科学博士生,搜索查询是“cmu 计算机科学博士生”。现在,该目录为学生提供了 127 个几乎相同的网页——这些网页只是学生的名字不同...然而,单词嵌入也将与计算机科学相关的术语排序为更接*男性名字而不是女性名字…结果是,在两个仅名字 Mary 和 John 不同的页面之间,单词嵌入将影响搜索引擎将 John 的网页排序高于 Mary。
目标是“去偏向”这些性别中立的向量,同时保留嵌入中相同的语义关系。
偏见本身有两种类型,直接和间接。
直接偏见可以分为“足球”天生更接*男性“接待员”更接*女性。间接偏见源于语料库中的细微关联,导致“簿记员”更接*于“垒球”而不是“足球”,因为它们的女性联想更大。
在“他-她”空间上表示的向量。X 轴上方的是中性术语,X 轴下方的是特定性别术语。(资料来源——报纸)
如上所示,性别中立术语应该与他-她对等距,而性别特定术语应该继续传达其中嵌入的性别信息。
首先捕获这个性别嵌入的子空间。这是通过取定义性别概念本身的一些预先知道的集合的差来完成的。
等式对的子集用于确定性别子空间。(资料来源——报纸)
对这种相反性别对的子集执行 SVD,以最终获得这种偏差的方向或子空间。这种*滑是为了消除一些术语不同含义的影响,如“ man ”。
位于该子空间中的向量(性别中立项)被“中和”,使得它们与类似“他-她”的等式对保持等距。从技术上讲,所发生的是从向量中减去嵌入在偏移方向上的投影。
左侧—中和前,右侧—中和后。(来源——自己)
这个方向之外的嵌入(性别特定的术语)被“均衡”,或者*均为具有相同的向量长度。这样做是为了确保中性项与所有等式对等距。例如,术语医生应该与男女孩和男女人等距。
左侧—均衡前,右侧—均衡后。(来源——自己)
有时性别专用术语可能包含更多需要捕捉的含义,例如:到祖父法规。在这种情况下,我们可能只想基于一个参数“软化”性别偏见对嵌入的影响,比如说 λ 。
这里,我们不完全中和嵌入,而是仅在 λ 的范围内这样做。如果 λ = 0,那么本质上与硬去偏相同。
使用不同(无)偏向嵌入、左定型类比和右适当类比生成的类比数量。(资料来源——报纸)
上面显示的结果与任务的目标相一致,成功地从嵌入中消除了偏差,而不影响性能。对于所描述的问题,还有其他方法,比如清理语料库本身。
从本质上说,去除单词嵌入的偏见有助于满足对无偏见世界不断增长的需求。至少,机器学习不应该被用来无意中放大这些偏见,因为我们已经看到这种情况会自然发生。
使用论文作者在 GitHub 上发布的代码,我对我之前使用的 Google 新闻向量进行了硬去偏置,并获得了以下结果。
检验去偏见模型——性别偏见明显减轻。(来源——自己)
我们看到这种方法是如何利用中和与均衡来减少明显的偏差的。
有些人认为嵌入中的性别偏见捕获了有用的统计数据。然而,机器学习算法有很大的可能性放大性别刻板印象和歧视,最好在无偏见的系统上运行。
由于性别只是单词嵌入所表现出的偏见之一,种族或民族偏见的识别也会随之而来,这是迈向真正的#伦理的一大步
T .博卢克巴斯,K .常,J .邹,V .萨利格拉玛和 A .卡莱。男人对于电脑程序员就像女人对于家庭主妇一样?去偏置词嵌入。2016T21。
原文:https://towardsdatascience.com/tackling-the-small-object-problem-in-object-detection-6e1c9976ee69?source=collection_archive---------24-----------------------
在公共航空海事数据集中,无人机从上方看到的小物体
为了提高模型在小对象上的性能,我们推荐以下技术:
如果你喜欢视频,我也记录了这篇文章的讨论
小目标问题困扰着世界范围内的目标检测模型。不买?查看 COCO 对最新型号 YOLOv3 、 EfficientDet 和 YOLOv4 的评估结果:
查看 AP_S、AP_M、AP_L 的最新型号。小物件硬!( 引用 )
例如,在 EfficientDet 中,小对象的 AP 仅为 12%,而大对象的 AP 为 51%。这几乎是五倍的差异!
那么为什么探测小物体如此困难呢?
一切都归结于模型。物体检测模型通过聚集卷积层中的像素来形成特征。
PP-YOLO中用于物体检测的特征聚合
并且在网络的末端,基于损失函数进行预测,该损失函数基于预测和地面真实之间的差异对像素求和。
YOLO 的 损失函数
如果地面真值盒不大,训练时信号会变小。
此外,小物体最有可能出现数据标签错误,它们的标识可能会被忽略。
经验上和理论上,小物体很难。
分辨率,分辨率,分辨率…这都是关于分辨率。
非常小的对象在边界框内可能只包含几个像素,这意味着提高图像的分辨率以增加检测器可以从那个小框中形成的特征的丰富性非常重要。
因此,如果可能的话,我们建议捕捉尽可能高分辨率的图像。
一旦你有了更高分辨率的图像,你就可以放大你的模型的输入分辨率。警告:这将导致大型模型需要更长的训练时间,并且在开始部署时推断速度会更慢。您可能需要进行实验来找出速度和性能之间的正确权衡。
在我们的训练 YOLOv4 教程中,你可以通过改变配置文件中的图像大小来轻松缩放你的输入分辨率。
在我们关于如何训练 YOLOv5 的教程中,您还可以通过更改训练命令中的图像大小参数来轻松缩放您的输入分辨率:
注意:只有达到训练数据的最大分辨率时,您才会看到改进的结果。
检测小图像的另一个伟大策略是将图像*铺作为预处理步骤。*铺可以有效地放大小物体上的检测器,但允许您保持所需的小输入分辨率,以便能够运行快速推断。
在 Roboflow 中*铺图像作为预处理步骤
如果你在训练中使用*铺,记住你也需要在推理时*铺你的图像是很重要的。
数据扩充从你的基本数据集生成新图像。这对于防止模型过度适应训练集非常有用。
一些对小物体检测特别有用的增强包括随机裁剪、随机旋转和马赛克增强。
锚框是模型学习预测的原型边界框。也就是说,锚定框可以预先设置,有时对您的训练数据来说不是最佳的。这是很好的定制调整这些你手头的任务。幸运的是, YOLOv5 模型架构会根据您的定制数据自动为您完成这项工作。你所要做的就是开始训练。
类管理是提高数据集质量的一项重要技术。如果有一个类与另一个类明显重叠,则应该从数据集中过滤掉该类。或许,您认为数据集中的小对象不值得检测,因此您可能想要将其删除。您可以使用作为 Roboflow Pro 一部分的高级数据集健康检查快速识别所有这些问题。
类省略和类重命名都可以通过 Roboflow 的本体管理工具实现。
正确检测小物体确实是一个挑战。在本帖中,我们讨论了一些改进小型物体探测器的策略,即:
一如既往,愉快的检测!
原文:https://towardsdatascience.com/tafra-a-minimalist-dataframe-61c7561ded2b?source=collection_archive---------56-----------------------
大卫·s·富尔福德和德里克·w·特克。2020 年 6 月 17 日
图片来源: Pixabay
很明显,数据科学需要数据。当我们处理数据时,我们必须首先从数据源加载数据,并存入内存。我们的数据可能有不同的类型:文本、整数、小数、日期、时间戳等等。数据框架是我们在执行数据科学时存储这种异构数据的实际机制。
作为一个思想实验开始了它的生命:我们怎样才能把阿达 塔夫拉 我的想法(用像这样的库或者像这样的语言表达)减少到它有用的本质,同时切掉脚?
原始概念验证在处停止。从那以后,我们扩展了这个想法,构建了一个完整的库,产生了一个实用的 T4,我们希望你会发现它是一个有用的轻量级替代品,可以替代 T5 的某些用途。
一个或多或少是一组命名的列或尺寸。每一个都是长度一致的类型化,用行表示每一列的值。该库提供了用于操作行和列的轻量级语法、对管理数据类型的支持、对行和子帧的迭代器、式的支持和从 pandas 数据帧的转换,以及 SQL 风格的和操作。
如果我们在一个 Jupyter 笔记本中,我们得到一个第一行带有的 HTML 表格:
tafra 的 HTML 表格渲染
编写高性能代码(比如通过使用)需要严格执行您的数据类型。奇怪的是,Windows 将作为默认,而 Linux 和 MacOS 则是默认。需要改吗?可以接受接受的任何输入。
铸造类型是灵活和直接的
除了从其他数据结构中读取数据(例如 CSV 、 SQL 游标,或者行记录,以及许多其他数据结构),能够将转换为其他数据结构也很有用:
要将聚合函数映射到列:
group_by()运算
并将函数映射到行:
row_map 示例
方法提供了很大的灵活性。是唯一分组的,匹配唯一分组的行的索引,以及这些行的。例如:我们还没有构建 pivot 方法,但是执行您自己的方法非常简单:
有枢轴的塔夫绸
有一些适合熊猫的代码,或者只是一种你喜欢的做事方式?灵活:
回去也一样简单:
或
请注意,大多数函数的默认设置是将数据视为不可变的。存在许多函数的就地版本,这样做是为了明确每个函数的返回类型。也就是说,一个函数最多返回一个类型或者一个,而不是调用代码必须检查的另外两个类型的一个。
不同返回类型的另一个例子在和中。前者将在调用时在一个中返回所有记录,而后者将根据需要返回一个来消费。
在这种情况下,轻量级也意味着高性能。除了添加到库中的任何附加特性,应该为组织数据结构进行数值处理提供必要的基础。最重要的方面之一是快速访问数据本身。通过最小化访问底层,提供了数量级的性能提升。
对于那些需要更快性能的人来说,可以通过直接读写属性来进行绕过数据验证检查的“不安全”操作。这些分别是熊猫的 10 倍和 100 倍。
dataframe 式结构的主要用途之一是能够模拟 SQL 风格的和操作。在这些方面也很出色,即使是基本功能的性能也提高了10 倍。此外,我们提供了将任何函数映射到任何列的能力。
对于这些基本操作,至少快了一个数量级。而“不安全”赋值(直接赋值给属性)是 3 个数量级如果你想自己提供,或者在一组操作后调用。
操作时间的比较
这只是对的介绍。我们相信它非常适合许多工作流,这些工作流需要一个以类型为中心的数据帧类型的结构,而不需要所有的花里胡哨…或者如果您只是想要一个替代方案,不会妨碍您将传递到您想要它们去的地方。
在这里查看文档,并在这里随意发布任何问题、错误或贡献。
原文:https://towardsdatascience.com/tagging-genes-and-proteins-with-biobert-c7b04fc6eb4f?source=collection_archive---------6-----------------------
在 Unsplash 上由 Ani Kolleshi 拍照
临床领域的文本挖掘变得越来越重要,目前有大量的生物医学文档包含有价值的信息,等待通过 NLP 技术进行解码和优化。随着自然语言处理的加速发展,预先训练的语言模型现在可以携带数百万(甚至数十亿)的参数,并可以利用大量的文本知识来完成下游任务,如问答,自然语言推理,以及在我们将要完成的情况下,通过命名实体识别进行生物医学文本标记。所有代码都可以在我的 GitHub 上找到。
作为自然语言处理领域的最新突破,谷歌的研究人员开发了一种被称为 BERT 的语言模型。al,2018),该模型通过在其架构的所有层中联合调节文本的双向上下文来学习深度表示。这些表示对于严重依赖上下文的顺序数据(如文本)很有价值,迁移学习在该领域的出现有助于将编码的知识用于加强个人跨领域的较小任务。在迁移学习中,我们将这一步称为“微调”,这意味着预先训练的模型现在正在针对我们脑海中的特定任务进行微调。最初的英语语言模型在预训练中使用了两个语料库:维基百科和图书语料库。对于像 BERT 这样的变形金刚背后的更深层次的直觉,我会建议一系列关于它们的架构和微调任务的博客。
伯特建筑(德夫林等人,2018 年)
BioBERT (Lee et al .,2019)是来自高丽大学和 Clova AI 的前述模型的变体。研究人员用 PubMed 和 PMC 增加了原始 BERT 的语料库。PubMed 是生物医学引文和摘要的数据库,而 PMC 是全文期刊文章的电子档案。他们的贡献是一种生物医学语言表示模型,可以管理诸如关系提取和药物发现等任务。通过拥有包含通用和生物医学领域语料库的预训练模型,开发人员和从业人员现在可以封装生物医学术语,这些术语对于通用语言模型来说难以理解。
BioBERT 建筑(Lee 等人,2019 年)
在 BERT 和 BioBERT 中,文本被分解为单词片段标记器,该标记器将单词拆分为频繁出现的子单词,这样免疫球蛋白将被标记为 I ##mm ##uno ##g ##lo ##bul ##in 的组成片段。这些词块可以通过字符组合利用字符的灵活性以及一般的词义。使用 BioBERT 实现最先进结果的微调任务包括命名实体识别、关系提取和问题回答。在这里,我们将看看第一项任务,以及到底完成了什么。
命名实体识别(NER)是对大量专有名词(或给定的目标短语)的识别过程,我们将这些专有名词建立为要标记的实体类型。用于评估 NER 的数据集以 BIO(开始、内部、外部)模式构建,这是该任务中最常见的句子标记格式。此外,“S-Protein”中的“S”可用于推断单个标记。这样,我们就可以注意到根据训练数据预测的位置前缀和实体类型。
基于 BioNLP13 语料库的命名实体识别
本例中使用的数据集是由 BioNLP09 语料库、 BioNLP11 语料库和 BioNLP13 语料库组合而成。虽然我们关注基因和蛋白质,但还有其他实体类型,如疾病、化学物质和药物。这些实验中包含了 74 个标签,但为了简洁起见,下面是 BIO 模式中的 BioNLP13 语料库标签:
首先,我们要从原来的 GitHub 导入 BioBERT,并将文件转移到我们的 Colab 笔记本中。在这里,我们正在下载主要的 BioBERT 文件,提取 BioBERT 权重,并将其转换为适用于 PyTorch,以便与 HuggingFace API 一起工作。为了简单起见,我们移动了配置文件,现在可以开始了!
你需要 HuggingFace 的变形金刚库。关于安装和导入的完整列表,请查阅我的笔记本。我们将文本的最大长度和批量大小设置为约束条件,我们将在后面使用这些约束条件。我们还将在 Colab 中创建一个利用 GPU 进行计算的设备。BertTokenizer 类将从我们之前设置的 BioBERT 文件中获取 vocab.txt。
SentenceFetch 类将接收我们的数据,读取生物模式文本进入的 TSV 文件,并将句子和标签组织成可用的数据结构。然后我们就有了检索句子和标签的方法。
我们搜索根目录的所有子目录。在 Colab 中,我建议从 Google Drive 或本地硬盘上传数据。我们使用 SentenceFetch 类并创建一个在实验中使用的句子和标签列表。
我们创建一个助手函数来标记文本,而不会丢失每个标记的标签。我们的模型需要完整的标签。
现在,我们可以通过 Keras 中的“pad_sequences”将输入数据规范化。这用于保持固定长度与比我们的最大长度短的序列一致。
现在我们可以完成建模的数据准备工作了。当将序列批处理在一起时,使用注意屏蔽来指示应该观察哪些记号。我们在训练和验证数据之间分割输入和屏蔽。然后,我们将数据转换为张量,以便与 PyTorch 一起正常工作。之后,我们通过 PyTorch 中的数据工具传递这些张量,最终为我们的模型准备好数据。
在建模阶段,我们使用 BertConfig 类来使用模型的配置文件。我们还使用预先训练的权重来帮助建立我们的“状态字典”。“state_dict”是一个字典,它将每一层映射到它的参数张量,这大大增加了 PyTorch 中模型和优化器的模块性。
我们为 NER 模型创建了一个简单的 BioBERT 类。我们的属性是我们网络中的层以及一个向前传递的方法。
创建了主要模型后,我们设置了优化和学习率调度程序。我们还在这里设置了其他超参数。
创建了管理纪元训练的功能。在这里,我们通知各层我们正处于训练模式,因此批处理 norm 和 dropout 层在训练模式下工作,而不是在 PyTorch 中要求的 eval 模式下工作。计算梯度并更新模型权重。
创建第二个函数来评估我们的模型。正如人们所猜测的,我们知道需要通知层我们处于 eval 模式。我们还停用自动签名引擎,以减少内存使用和加快计算速度。将来,将这两个函数合并为 BioBERT 模型类中的方法会更简洁。
这里,我们将循环遍历我们的纪元,使用我们的两个函数,并打印训练和验证损失/准确性的结果。
我们的结果显示,训练准确率高达 96%,验证准确率高达 95%。考虑到它所花费的时间(尽管在这里模型在可用的 GPU 上运行得非常快!),没有理由增加 epochs。
当我们考虑损失时,学习曲线表示三个时期的合理损失:
现在我们可以从一篇生物医学论文摘要中随机标记一个句子:
我们看到它已经正确地标记了单个/单独的蛋白质提及。然而,考虑到大量的“0”表示与手头的任务无关的单词,由于训练数据中的示例数量太多,所以存在过度适合标记为“0”的结果。这种标签不*衡将是未来需要改进的地方。
我们大致了解了 BioBERT 是如何运作的,以及它是如何扩展 BERT 的工作的。通过利用 BioBERT,我们试图通过 NER 任务正确地标记生物医学文本。我介绍了我的 BioBERT 实现,它导入了必要的文件,预处理了数据,最后构建、训练和测试了模型。对于 Colab 中 BERT 的更深入分析,我强烈推荐 ChrisMcCormickAI 的教程。在实用自然语言处理的第 10 章中也有一些与 NLP 工具和应用直接相关的有价值的信息(包括 BioBERT!)在医疗保健行业。我希望这有助于引导您了解生物医学领域的最新模型。
[1]:德夫林等人。艾尔。(2018 年 10 月)。伯特:语言理解深度双向转换器的预训练https://arxiv.org/abs/1901.08746
[2]:李等。艾尔。(2019 年 9 月)。 BioBERT:用于生物医学文本挖掘的预训练生物医学语言表示模型【https://arxiv.org/abs/1901.08746
原文:https://towardsdatascience.com/tail-spend-analysis-chapter-03-data-preparation-7ae11af97487?source=collection_archive---------36-----------------------
第 03 章—逐步指南的数据准备
在花了几年时间用 Excel、Tableau、Python 进行采购分析,并详细评估了当前市场供应商的产品功能后,我可以自信地说,支出分析作为一个问题被高估和高估了。是的,在支出分析中,机器学习变得绝对必要(我们将在后续章节中讨论这些部分),但如果你的公司刚刚开始进行支出分析,Excel(或者任何可以切割数据的工具)将会很好地完成这项工作。一切都是为了准备和细节,而不是复杂的工具
我们现在将着手准备我们的数据集。你可以在这里找到样本数据集。除了我们在第 2 章中讨论的 4 列之外,我还添加了另外两列,即“供应商类别”和“采购订单类别”。“供应商类别”基于供应商数量,“采购订单类别”基于“采购订单数量”。
让我们继续添加我们的第一列“消费类”。请仔细遵循以下步骤:
步骤 1: 使用“raw_dataset”工作表插入一个透视文件,并重新排列行&列以匹配下图。确保以下字段处于正确的位置:
商品描述:成排
总 PO 值:In Values(商品描述的排列百分比运行合计)。确保该字段按升序排列。
注意:要获得表示为%(如上所示)的总 PO 值,您必须进入“值字段设置”选项。这可以通过点击值字段中的下拉箭头(“ITM _ 总计 _AM2 的总和”)&从下拉列表中选择来找到。之后,在“显示数值为”选项下,选择“ %运行总数在”。最后一步是选择一个基本字段。在这种情况下,基本字段是“商品描述”。
第二步:如第 02 章所述,我们的目标是从尾花中分割出主花。因此,向下滚动 total %列,直到达到 80%的数字。从 0%到 80%的项目(换句话说,前 80%)将被标记为“主要花费的项目。同样,从 80%到 100%(换句话说,最底层的 20%)的项目将被标记为“尾花”。将整个列表复制到一个新的单独的 excel 工作表中,并将其命名为“ WIP 工作表”。现在,您的 excel 文件应该类似于下图。
在新的 WIP 工作表中,插入一个新列,并将其命名为“支出类别”(列 C)。在这一栏中,我们会将每个项目标记为“主要支出”项目或“次要支出”项目。对于 B 列,我们有总支出百分比,滚动到 80%支出(即从 0%到 80%),并在 C 列(“支出类别”)中填写“主要支出”。对于剩下的 20%(即从 80%到 100%),写“尾花”。重复此过程,直到到达最后一项。您的"WIP 工作表"应该如下图所示:
步骤 3: 我们现在几乎准备好在" WIP 工作表"中使用这些数据,并将其填充回我们的主" raw_data "工作表中。现在只需要一个简单的 Vlookup 就可以了。返回到“raw _ data”工作表,如上所述,使用商品描述上的“Vlookup”功能,并选择消费类别来填充它。下面是这样做的公式:
= VLOOKUP(B2,' WIP 工作表'!$AC$6681,3,FALSE)
其中列 B2 暗示包含商品描述的“raw_data”工作表中的列 B
$A$1: $C$6681 表示“WIP 工作表标签”中的列,A 列包含商品说明,B 列包含累计百分比,C 列包含支出类别
完成后,“raw_data”工作表中的“支出类”列应该如下图所示。搞定!
让我们添加第二列“合同”。这个简单明了。请参考“ raw_data ”工作表中我命名为“主协议”的列。正如第 02 章所讨论的,逻辑很简单。如果“主协议栏为空(如下图所示),我们将填写“合同不可用”,如果“主协议栏不为空,我们将填写“合同可用”。我们将使用此逻辑填充所有单元格。
下面是这样做的公式:
=IF(I2 <>" ","合同可用","合同不可用")
其中 I2 表示“raw_data”工作表中的 I 列(名为“主协议”)。< >“符号表示“不等于”,“符号表示空白”。因此,在这个公式中,我们检查 I2 是否不等于空白,然后写“合同可用”或其他。
将此公式拖到“raw _ data”工作表的最后一个单元格。完成后,合同列应该如下图所示。搞定!
我们继续我们的下一个专栏“PO”。这里,我们将重复添加合同列时的相同步骤。只是,我们将使用 K 列( Purchase_Order ),而不是 I 列(主协议)。因此,如果“采购订单”列为空,我们将写“采购订单不可用”,如果“采购订单”列不为空,我们将写“采购订单可用”。使用此逻辑填充所有单元格。下面是这样做的公式:
=IF(K2 <>" ","采购订单可用","采购订单不可用")
其中 K2 表示“原始数据”工作表中的 K 列(名为“采购订单”)。“< >”符号表示“不等于”,“符号表示空白。因此,在这个公式中,我们检查 K2 是否不等于空白,然后写“PO Available”或其他。
将此公式拖到“raw _ data”工作表的最后一个单元格。完成后,PO 列应该如下图所示。搞定!
关键时刻之一已经到来。现在,我们将计算每种商品描述的供应商数量。如果你还记得第 2 章,我们首先想知道每个项目的供应商数量,然后将他们进一步细分为高、中、低类别。在 Python 中计算每件商品的供应商数量很容易,但在 excel 中有点复杂(至少我是这样做的)。
我的逻辑很简单,但需要几个步骤。我将首先获得每个商品描述的所有供应商名称的列表。供应商名称可以很多,但商品描述必须是唯一的。简而言之,一对多关系(一个商品描述可以有多个供应商名称)。
第二步是将这些信息复制到一个新的工作表中,然后在 raw_data 工作表中使用 COUNTIF 公式来获得实际的供应商数量。遵循下面提到的步骤来实现这一目标。
回到我们的数据透视表工作表,根据下图重新排列。如果你能自己做,你可以跳到第三步。否则,请遵循以下说明。
第一步: 我们先从拉商品描述和法定名称信息开始。在数据透视表的行部分,首先拉入“商品描述”,然后拉入“供应商的法定名称”。
第二步: 现在,让我们来改变一下我们透视表的布局。为此,选择数据透视表,然后您将能够在顶部看到 Design 选项卡。在 Design 选项卡下,单击 Report Layout 选项,您将能够看到几个选项。你必须选择下面提到的两个选项:
a .)选择“以表格形式显示”
b .)选择“重复所有项目标签”
第三步: 取消选择商品描述行的小计。这可以通过右击任何商品描述并取消选择“小计”选项来完成(参考第二张图片)。
一旦您完成了步骤 1、2 和 3,您的数据透视表应该如下图所示。如您所见,我们现在有一个表格,左边是商品描述字段,右边是供应商的法定名称。完美!
步骤 4: 现在让我们将此表复制到一个新的工作表“供应商数量”中。我们将在 A 栏中显示“商品描述”,在 B 栏中显示“供应商的法定名称”,如下所示。
现在,让我们开始计数。我们将使用此表来最终统计每种商品描述的供应商数量。导航回我们的“Raw_Data”工作表,在“供应商数量”列(我们之前插入的那个)中,使用 COUNTIF 公式。由于 COUNTIF 函数需要一个数据范围,我们将使用新的“供应商计数”工作表中的数据范围。下面是这样做的公式:
=COUNTIF('供应商计数'!$AB$13412,Raw_Data!B2)
其中 A1 表示 A 列(包含“商品 _ 描述”),B 列表示“供应商数量”工作表中供应商的法定名称。Raw_Data!B2 暗示到原始数据工作表中的 B 列(包含“商品描述”)。
将此公式(将在 Y 列中输入)拖动到“raw _ data”工作表中的最后一个单元格。完成后,“供应商编号”栏应如下图所示。我们最终获得了每种商品描述的供应商数量信息。搞定了。
这是我们在本章中增加的少数几个栏目之一。让我们创建一个新列,并将其标记为“供应商类”。如第 2 章所述,我们将进一步将该供应商分为 3 类(如下所述),以帮助我们进行分析。由于我们已经计算了每种材料描述的供应商数量,我们可以将它们分为以下类别之一:
a.) 单个供应商 (其中供应商计数为 1)
b.) 在 1 到 5 之间 (其中供应商数量在 1 到 5 的范围内)
c.) 超过 5 个 (其中厂商数大于 5)
注意:我选择了 5 个供应商作为我的上限。可以根据商品行情适当选择自己的上限。
下面是填充“供应商类别”列的公式:
=IF(Y2=1,“单一供应商”,IF(AND(Y2>1,Y2<5),“介于 1 和 5 之间”,“大于 5”))
其中 Y2 表示“raw_data”工作表中的 Y 列(包含“供应商数量”)。这里我们使用了一个 IF 条件。逻辑是针对供应商值的数量为 1 的情况,写“单一供应商”。对于供应商数量值介于 1 和 5 之间的情况,填写“介于 1 和 5 之间”,对于所有其他情况,在“供应商类别”栏中填写“大于 5”。
将此公式(将在“供应商类别列中输入)拖至“raw _ data”工作表的最后一个单元格。完成后,“供应商类”列应该如下图所示。搞定了。
类似于卖方编号,我们现在也需要计算“POs编号”列。让我们在我们的“raw _ data”工作表中添加一个新列,并将其标记为“位置编号”。通过我们在第 2 章中的初步分析,我们现在必须知道,我们的数据集中的每个行项目都有一个 PO。我们还有许多订单字段为空的行项目,因此我们在“ PO ”栏中填写了“ PO 不可用”。
计算【位置号】的逻辑很简单。我们必须计算商品项目描述字段在数据集中出现的次数。这是假设我们每个行项目都有一个采购订单,并且它是唯一的。在所有实际场景中,情况可能是这样,也可能不是这样。如果您遇到这种情况,我建议您遵循我们在“供应商编号”栏中采用的方法。
回到我们的数据集,使用 COUNTIF 函数计算一个商品描述在数据集中出现的次数是相当容易的。但是,我们必须减去数据集中“ PO 不可用”的情况。为了总结这一逻辑,我们必须做到以下几点:
(商品描述出现的次数)——(该商品描述出现 PO 不可用的次数)
为此,我们将使用 COUNTIFS 函数,而不是使用COUNTIFf函数。以下是填充“位置编号”列的公式:
= COUNTIFS($B$2:$B$72854,B2,$X$2:$X$72854,“PO Available”)
B2 暗示到“原始数据”工作表中的 B 列(包含“商品描述”),X2 暗示到 X 列(包含“采购订单”和采购订单可用值&采购订单不可用值)。通过选择“PO Available”过滤器,我们将得到同时满足两个条件的结果,即商品描述在数据集中出现的次数以及 PO Available 的条件。
将该公式(输入到栏的号中)拖动到“raw _ data”工作表的最后一个单元格。完成后,“POs 号”栏应如下图所示。搞定了。
与“供应商类别”栏类似,我们将“订单编号”信息进一步细分为 3 个类别(如下所述),以帮助我们进行分析。由于我们已经计算了每种材料描述的采购订单数量,我们可以将它们分为以下类别之一:
a.) 单个采购订单 (一次性采购:其中采购订单数为 1)
b .)1 到 12 之间 (采购订单数量在 1 到 12 范围内的现货订单)
c.) 超过 12 个 (高频 POs:其中 PO 计数大于 12)
我们的主要目标是找到高频 POs,以便进行整合。
注意:我将“高频 POs”定义为每月至少 1 个 PO(因此每年 12 个 PO)。您可以根据您的初步数据分析来更改该数字。
现在我们已经定义了我们的段,下面是填充“POClass”列的公式:
=IF(AA2=1,“单个采购订单”,IF(AND(AA2>1,AA2 <12),”Between 1 and 12",”More Than 12"))
其中 AA2 表示“原始数据”工作表中的 A 列(包含“采购订单数量”)。这里我们使用了一个 IF 条件。逻辑是针对 PO 值的数量为 1 的情况,写“单个 PO”。对于采购订单数量介于 1 和 12 之间的情况,请填写“介于 1 和 12 之间”,对于所有其他情况,请在“采购订单类别”栏中填写“大于 12”。
将此公式(将输入到“采购订单类别列中)拖动到“raw _ data”工作表中的最后一个单元格。完成后,“PO Class”列应该如下图所示。搞定了。
全部完成!我们在准备数据集方面走过了漫长的道路。事实上,我们现在都准备好开始我们的切块和切片!在下一章,你将会看到,我们如何从所有这些艰苦的工作中获得益处!
让我们从理解现有数据开始。然后,我们将通过解决 【隐藏的尾巴】 问题,深入分析我们的第一个大的成本节约机会。
[## 尾部支出中最大但经常被忽略的部分是什么?隐藏的尾巴!第 04 章
medium.com](https://medium.com/procurementintel/tail-spend-analysis-chapter-04-hidden-tail-4e5fdda97194)
我很感激你的评论,这样我可以进一步改进这些课程。
对于即将到来的采购课程的简短总结,您可以随时
订阅我的刊物:【https://medium.com/procurementintel】
在 LinkedIn 上关注我:https://www.linkedin.com/in/gsrm/
原文:https://towardsdatascience.com/tailor-figures-for-papers-and-presentations-63cd37228312?source=collection_archive---------79-----------------------
在合适的场合使用合适的尺寸。杰西卡·鲁斯切洛在 Unsplash 上的照片
你有没有坐在演示文稿中眯着眼睛看幻灯片,努力阅读带有微小文字的图表?或者更糟的是,在海报上看到一个模糊的身影,让人无法看清坐标轴?人们经常倾向于在不同的媒体上复制相同的数字,如网站上的文章、演示幻灯片、期刊文章(pdf 文档),导致不愉快的用户体验。让我们变得更好。
在这篇文章中,你会学到-
我分享的例子是用 python 写的,但是我提供了用 R 和 Matlab 复制相同方法的资源。
演示文稿和论文/网络文章之间的距离与屏幕大小的比率不同。来自 svgrepo.com和 clipartmax.com和的作品
人们在准备演示时最常犯的错误是使用他们在网上/杂志文章中使用的相同数字。这是错误的,因为人们从不同的感知距离观看文章和演示。当一个人从 2.5 英尺外的约 1 英尺屏幕上阅读文章时,他们从 40 英尺外的约 10 英尺屏幕上观看演示。
这意味着一个在计算机屏幕上看起来可读的图形在投影到幻灯片上并从房间的最后一排观看时可能是不可读的。因此,图形元素必须放大。根据经验,如果您正在笔记本电脑上制作图表/图形,但想将其包含在演示文稿中,请后退一步,检查图形是否可读。如果没有,放大注释并加厚线条/点,然后重试。
然而,为每个图形手动地做这件事,或者每次你想要转换你的图形是乏味的。我们如何实现自动化?
样式表是自动获取几个样式命令的简单方法。本质上,它们包含了改变不同元素的默认样式参数的指令,如图形大小、线条宽度等。尽管 matplotlib 和一起提供了几个预制的样式表,但是它们中的大部分都专注于美学而不是绘图媒介。
要为不同的媒体创建自己的样式表:
如果你是一个 R 用户,你可以使用级联样式表包跟随这篇文章。如果你是一个 Matlab 用户(我很同情),你可以创建自定义。使用本博客末尾提到的命令将 m 文件作为样式表。至此,让我们学习不同的媒体使用什么样的风格参数。
我们大部分的数字制作实践都是为文章和论文量身定制的,因为我们在创建它们的同一距离上观察它们。因此,当你创建一个图形时,只要看起来不错,在发布时就应该足够了。
我使用下面的样式表为我的在线文章创建图表(我的“article.mplstyle”文件的内容):
对于期刊论文,由于期刊之间的差异,我不会自己调整风格。相反,我使用的是 plotsettings ,这是一个专门为此构建的 python 包——根据每个期刊的规则自动裁剪数据。
为了演示,我加厚线元素,放大标记元素,提高分辨率,并将文本元素放大 1.5 倍。这大致与观看比率成比例(4/2.5 ~ 1.5),并确保我在笔记本电脑上创建的图形在投影仪上从最后一行观看时看起来相同。我使用下面的样式表为我的演示文稿创建图表(我的“presentation.mplstyle”文件的内容):
比较两个样式表产生的输出,差异是显而易见的:
使用两种不同的样式表比较同一个数字。图片作者。
最后,除了调整大小之外,还有许多其他的调整可以让你的数字在演示文稿中更具可读性。你可以减少显示的数据量,使用容易在投影仪上渲染的颜色,等等。在这篇精彩的 PLOS 文章中可以找到这样的提示。
有没有其他方法可以根据不同的媒介来裁剪人物?在下面留下回应。
原文:https://towardsdatascience.com/take-full-control-of-your-python-plots-with-jinja-15496a7ebf1d?source=collection_archive---------26-----------------------
照片由艾萨克·史密斯在 Unsplash 拍摄
你是否曾经花了太多的时间挖掘文档,试图让你的图看起来像你想要的那样?下一次,考虑放弃 matplotlib 或 seaborn,使用创建一个自定义的绘图。
Jinja 是一种 Python 模板语言,基于 Django 模板,你可能从 Flask 或 Airflow 等其他包中熟悉它。它有很多有用的功能,但你只需要一些基础知识就可以开始了。
在 Jupyter 中,您可以使用 Jinja 将您的视图制作成 SVG(工作流程与 D3 非常相似)并显示它们。
在我们进入正题之前,让我先介绍一些基础知识。SVG 代表可缩放矢量图形,这意味着所有图像数据都存储为矢量空间中的点,因此可以在不进行像素化的情况下调整大小(不像光栅图像)。
SVG 是基于 XML 的,有许多不同的标签,代表不同的路径和形状。一些关键标签是:
每个 SVG 元素都有自己可以更改的属性,但是大多数元素都有共同的属性来控制填充和笔画。
创建 SVG 时要记住的另一个关键点是, xy 坐标从左上角的 (0,0) 开始,随着向右下角移动而增加。
关于使用 SVG 的更多信息,请查看 Mozilla 的参考资料这里。
现在到金贾…
Jinja 的模板有很好的特性,比如循环、条件和模板继承,这只是皮毛;有大量的功能。
下面是一个 Jinja 模板的基本示例:
如果你用和渲染模板,你会得到…
更多关于 Jinja 模板的信息,请查看文档。
现在,让我们继续建立一个金贾的阴谋。
让我们使用 Jinja 用一些示例数据制作一个简单的演示散点图。
首先,这里是我将在模板中使用的数据和一些基本布局信息:
用于绘图的数据和布局信息。
现在让我们制作模板,它将是 SVG 的 XML 风格标记和特殊 Jinja 命令的混合:
让我们假设我们的模板作为一个字符串存储在变量中。
现在我们可以使用我们的 plot 和 layout 数据渲染模板,代码如下:
下面是作为 svg 的渲染图:
以下是作为参考的 png:
使用 Jinja 在 Python 中创建的 SVG 演示图
对于完整的代码,检查要点在这里。
如果你只是做 EDA 调用仍然是一条路要走,但如果你想能够完全定制你的情节,尝试使用 Jinja。启动可能需要更多时间,但您的模板很容易重复使用,并且您不会受限于您的绘图库所支持的绘图。
SVG 的另一个巨大好处是能够从另一个 SVG 复制路径,并将其合并到您自己的路径中。例如,如果您想将散点图中的点更改为您公司和竞争对手的徽标,您只需下载 SVG 徽标,并用徽标路径替换模板中的圆圈。
感谢阅读!我很想知道你对这项技术的看法——如果你有任何意见或建议,请告诉我!
原文:https://towardsdatascience.com/take-the-pain-out-of-data-cleaning-for-machine-learning-20a646a277fd?source=collection_archive---------28-----------------------
摄 Unsplash 上的创意交流
根据 Anaconda 最*的 2020 年数据科学状态 调查,这是一个很好的阅读,顺便说一下,大多数数据科学家 66%的时间仍然花在数据加载、清理和可视化上。
现实世界的数据集总是杂乱无章。包含缺失值和错误值、分类数据和缩放不当的变量。在我们可以使用这些数据来建立机器学习模型之前,数据科学家必须(通常是煞费苦心地)分析数据,以确定要应用的适当预处理技术。然后花更多时间执行这些数据清理和转换任务。
幸运的是,目前有开发人员正在研究这个问题的解决方案。在本文中,我将介绍四个开源 Python 库,它们使数据准备过程更容易、更健壮。
pandas-profiling 库是一个工具,它允许您快速了解数据集的质量,并在一行代码中计算基本的统计数据。这个包有一个名为的函数,默认情况下它会加载一个给定数据集的探索性摘要。
该软件包可以通过 pip 安装。
让我们加载一个数据集,并在 Jupyter 笔记本中运行标准 profile 报告。
配置文件报告显示如下所示。
Dabl 由 Scikit-learn 项目的核心开发者之一 Andreas Muller 开发,是一个数据分析库,旨在使机器学习项目的数据探索和预处理部分变得更加容易。
Dabl 可以通过 pip 安装。
Dabl 有一个内置的功能,可以自动检测数据类型和质量问题,并对数据集进行适当的预处理,为机器学习做准备。这包括执行诸如处理缺失值和将分类变量转换为数值之类的任务。
Dabl 库也有许多用于快速数据浏览的内置可视化功能。简单地在数据集上调用 将产生下面的一组图表。
Dora 库是另一个数据分析库,旨在简化探索性数据分析。
该软件包还包括用于清理、转换和可视化浏览数据集的实用工具。尽管它有别于其他类似库的一个特性是它的数据版本控制能力。
Dora 提供了一个简单的接口,可以在转换数据集时获取数据集的版本或快照。它还保留了所做更改的日志,以便您可以轻松地跟踪转换。
Dora 可以通过 pip 安装。
下面的代码演示了如何使用这个库来执行数据清理、预处理、数据版本控制和跟踪数据的变化。
Pretty pandas 旨在与核心 pandas 库一起工作,为您的数据提供一种创建“漂亮”汇总表的简单方法。这在与其他人共享数据时尤其有用,比如项目中的利益相关者。
要安装 run。
在下面的代码中,我们用漂亮的熊猫给数据集的汇总视图添加一个总*均值。
我们距离解决作为机器学习项目的一部分,需要在数据准备上花费多少时间的问题还有很长的路要走。这部分是由于现实世界中数据的高度可变性,因此这是一个难以自动化的过程。然而,本文中讨论的库在某种程度上减轻了这项耗时任务的痛苦。
感谢阅读!
我每月发一份简讯,如果你想加入请通过这个链接注册。期待成为您学习旅程的一部分!
原文:https://towardsdatascience.com/take-your-first-step-into-the-quantum-realm-a13e99fab886?source=collection_archive---------34-----------------------
作者使用 Canva
开始使用量子计算可能看起来令人生畏,如果你在网上搜索 start,你可能会得到和我第一次开始使用量子计算时一样的结果。我到处都在说,要开始,我需要有一些关于量子物理学、量子力学和基本线性代数的知识。一旦我这样做了,我需要学习如何使用 Qiskit (Python 库来编程量子计算机)或另一种编程工具来开始构建量子电路和实现量子算法!不要让我开始需要学习量子算法是如何工作的!
事情变得非常复杂非常快,这可能是相当令人沮丧的!😖
但是…
如果我告诉你,你可以开始构建量子电路,只需要基本的量子门的基本知识,不需要任何类型的编码,会怎么样?
是🤩
你没看错;我们将在不使用任何代码的情况下构建量子电路。
做到这一点的方法是使用一种叫做量子电路模拟器的特殊工具。要使用这些工具中的任何一个,你只需要知道量子计算的三个基础的定义,量子位,叠加和纠缠,以及一些基本的量子门是做什么的。
我们将从量子计算的基础开始:
你可以在我的文章“量子计算的三大支柱”中找到关于量子位、叠加和纠缠的更深入的信息
[## 量子计算的三大支柱
medium.com](https://medium.com/digital-diplomacy/the-three-pillars-of-quantum-computing-d80ff5f50ec7)
现在你已经知道了量子计算的基本原理,我们可以开始谈论基本的量子门,然后开始使用它们构建一些电路。
外面有许多量子门;一旦你完全理解了基本的,你甚至可以创建你的自定义门。量子门是量子电路的组成部分。它们是在一个或多个量子位上执行特定功能的操作符。它们是经典逻辑门的量子等价物,如今被用于所有技术中。然而,与大多数经典逻辑门不同,量子门是可逆的,这意味着你可以通过重新应用相同的量子位来撤销它们的影响。
数学上,量子门是用酉运算来表示的。酉运算就是方阵(行数和列数相等的矩阵)。另一方面,量子位的状态被表示为一个向量。从几何学的角度来说,向量通常有一个振幅和一个相位来表示它在空间中的三维位置。要找出对任何状态的量子位元应用闸的结果,我们只要用闸的矩阵乘以量子位元的状态向量。
作者使用 Canva
我们现在开始讨论单量子比特量子门。这些门一次只能控制一个门。这些门可以扩展到运行更多的量子位,我们很快就会看到。在本文中,我们将介绍六种基本的量子门:身份门、哈达玛门、泡利(X、Y 和 Z)门和受控非门。
身份门(符号为 I )是一个单量子位门,它保持量子位的状态不变。这可能看起来没用,我是说,为什么我们会有一个什么都不做的门?I 门有用有两个原因:
作者使用 Canva
非门( X )是一个单量子位门,它翻转它所操作的量子位。如果我们给它|0⟩,它会返回一个|1⟩,如果我们给 it|1⟩,它会返回一个|0⟩.在具有许多叠加态的应用中,该门用于将特定态与整体态隔离开来。
作者使用 Canva
哈达玛门(H)是魔法之门🌟。它是负责创造叠加态的门。不管输入态是不是|0⟩ or|1⟩.,这个门都将量子位置于|0⟩和|1⟩态的 50/50 叠加态 H 门可能是最重要的量子门,它是许多量子算法的基本构件。
作者使用 Canva
如果给 h 门一个|0⟩作为输入态,它将产生一个叠加态,量子人们称之为正态|+⟩.如果我们给 h 门一个|1⟩态,它会产生负态|–⟩.
作者使用 Canva
Y 门和 X 门类似,也是翻转门。然而,这些门之间的区别在于,y 门翻转状态|0⟩,然后将结果乘以一个虚数 j (给它增加一个相位)。这种额外的相位变化使得该门对于创建某些算法中使用的特定相长/相消干涉非常有用。
作者使用 Canva
Z 门也是翻转门;然而,这个门不会翻转状态的值;相反,它会翻转相位。这个门在将 state|1⟩的相位乘以-1 时保持 state|0⟩振幅不变。
z 门的力量来自于它只影响|1⟩州而不影响|0⟩。这个门经常被用来突出显示系统中的一些状态,而保持其他状态不变。
作者使用 Canva
我们刚刚走过的所有单门量子位都可以通过添加控制和目标量子位扩展到受控门。这种工作方式的一个例子是受控非门。
受控非(CX 或如图所示的 GIF)门是我们第一个操作两个量子位的门。这个门是一个条件门,当且仅当第一个量子位(控制量子位)的状态是|1⟩.时,它对第二个量子位(称为目标)执行 x 门结合其他的门,CX 门将允许我们构造各种多量子比特操作。
作者使用 Canva
好了,现在我们已经了解了基础知识,让我们来谈谈如何使用这些门——以及更多——来构建一个量子电路。我们将使用量子电路模拟器。
动作 gif中 FrOOtLooP 的图片
量子电路模拟器是一种特殊的工具,允许你建立和模拟量子电路,而不需要写任何代码或执行任何数学技巧!由于量子计算是一个正在进行的研究领域,新的工具经常被开发出来,以帮助人们熟悉量子门和量子电路,并为量子时代的到来做好准备。最好、最简单的基于浏览器的产品(无需安装😁)量子电路模拟器,在我看来是:
在本文的其余部分,我将使用 IBMQ circuit composer 来模拟两个简单的电路。然而,你可以使用上面的任何模拟器来实验量子电路。
一旦打开 IBMQ Circuit Composer,您将看到这个屏幕:
IBMQ 电路设计器
你可以通过简单的拖放来给特定的量子位设置门。如果你需要更多的量子位,你可以点击最后一个量子位下面的小+号,这将为电路增加一个量子位。您可以通过点击量子位并按下键盘上的 DELETE 键来删除量子位。在右侧,您可以看到一个条形图,显示电路的最终状态。空电路有一个状态|0000⟩.每次添加一个门,产生的状态都会相应地改变。
我们现在准备建立我们的第一个量子电路!让我们从一个简单的开始。
假设我们想要创造一个电路,只要它是 1,就翻转任何给定状态的最后一个量子位。例如,|1011⟩会变成|1010⟩,因为最后一位是 1。然而,如果输入状态是|1100⟩,电路不会做任何改变,将返回相同的状态。我如何才能做到这一点?
最初,所有的量子位都被设置为|0⟩状态,所以我们需要创建起始状态,例如,首先是|1011⟩状态,然后应用一些门来翻转该状态的最后一位。
在我们开始之前,状态通常是从右向左读取的,在 composer 中是从上到下。
步骤 1: 创建 starting|1011⟩状态
为了创建|1011⟩态,我们需要将 x 门应用于量子位 q[0]、q[2]和 q[3],如下面的视频所示。
第二步: 翻转最后一个量子位。
为了翻转最后一个位元,我们会在电路中再加入一个量子位元。这个额外的量子位将作为控制量子位。首先,只有当电路的最后一个量子位是 1 时,我才需要这个量子位处于|1⟩状态;否则,它将在|0⟩.这可以通过在 q[3]和 q[4]上使用 CX 门来实现。
如你所见,现在的结果是|10111⟩;我们可以忽略最后一个,因为它是我们刚刚添加的一个额外的量子位,以帮助我们实现我们的目标。也就是说我们的状态还是没变。接下来,我们将使用 q[4]作为另一个 CX 门的控制,并使用它来翻转 q[3]。
现在,我们得到的状态是|10101⟩,没有 q[4],它将是|1010⟩,这是我们想要的结果!耶!
但是,如果我输入最后一个量子位等于 0 的状态呢?让我们看看会发生什么!如果我们将状态|1000⟩输入到电路中,产生的状态将与我们的输入状态相同。
耶!你刚刚建立了你的第一个量子电路,没有进入量子力学或者写代码!👏
如果你知道如何使用电路模拟器工作,你可以建立任何电路,一旦你足够舒适,你可以开始使用代码来创建你的电路,因为你深入到量子领域。
[1] Brylinski,J. L .,& Brylinski,R. (2002 年)。通用量子门。量子计算的数学。
原文:https://towardsdatascience.com/take-your-histograms-to-the-next-level-using-matplotlib-5f093ad7b9d3?source=collection_archive---------4-----------------------
直方图是可视化变量分布的最常用方法。一个简单的直方图对于浏览数据非常有用。然而,与其他著名的绘图类型如饼图、条形图或折线图相比,它们看起来相当乏味。最重要的是,它们需要有统计学背景才能被正确解释。然而,在我们完全抛弃直方图之前,让我们试着让它更漂亮,信息更丰富,也更容易解释!
在本教程中,我们将采用一个标准的 matplotlib 直方图,并从美学角度对其进行改进,同时添加一些有用的组件。为此,我们将遵循一个三步程序,正如我的文章“从数据分析师到数据故事讲述者”中所阐述的:
对于本文,我们将使用来自 kaggle 的“鳄梨价格”数据集。市场中的价格分布是直方图的一个有用的应用。
为此,我们只需要这两个库:
因为我们只需要一列(“AveragePrice”),所以我们可以将数据作为一个系列而不是 dataframe 来读取。这样,我们将节省以后指定列的时间。
我们的第一个也是非常基本的历史程序可以使用下面的代码非常容易地绘制出来:
第一个情节
按照本教程的三个步骤,我们将得到这个最终结果:
我们开始吧!
一个显而易见的事情是添加一个标题和轴标签。如果你比较上面的两张图,你还会发现第二张图中的直方图没有那么“块状”。我们可以通过增加仓 的数量来实现这一点,这实质上是直方图将数据划分成的类的数量。更多的箱将使直方图更*滑。最后,您可能已经意识到第二个图形在直方图周围有一条线。这条线被称为核密度估计(KDE)。 KDE 试图计算变量的基本分布,这将在直方图周围画出一条非常*滑的线。然而,只有当我们将 y 轴从绝对值变为密度值时,KDE 才会起作用。这样做的缺点是密度值对大多数人来说很难解释。我们稍后会解决这个问题。首先,我们来编码这个!
添加信息绘图
我们可以看到,可视化现在包含了更丰富的信息。然而,这并不完全是美丽的,有点势不可挡。让我们减少信息量,让剧情更干净。
最后一个数字中的一些信息是不真实的,甚至是完全无用的。例如,对于大多数人来说,y 轴不再是可解释的。我们应该移除刻度和刻度标签并再次用“频率”标记轴。这将使读者了解轴的含义,而不会被不必要的数字所混淆。此外,KDE 还估算了 0 美元以下数值的密度。显然,我们需要通过重新调整 x 轴来解决这个问题。最后,在大多数情况下你可以删除图中的任何记号和刺而不会损失太多可读性。让我们应用所有这些:
用减少的信息绘图
这看起来已经干净多了。最后一步,我们可以强调特定的信息,并进行美学上的改进。
强调信息不仅仅意味着增加字体大小,也意味着选择一种有益于你试图用视觉传达的信息的配色方案。由于这一步需要更多的代码,我将分别展示代码片段。
首先,我们需要一组不同的颜色。前几幅图中的橙色/蓝色组合看起来不太好。改变绘图布局的一个简单方法是改变 matplotlib 样式表。就我个人而言,我喜欢“bmh”样式表。然而,这个样式表添加了一个网格,这会分散我们的绘图注意力。让我们把样式表改成“bmh”,去掉它产生的网格。
另一个美学上的改进是减少直方图的不透明度。这将使 KDE 更占主导地位,这将给读者一个整体更流畅的印象。
为了让标题更加突出,我们可以增加它的字体大小。“pad”参数也允许我们添加一个偏移量。
在这一步,我也想知道 y 标签“频率”是否是必要的。在测试了这两种变体之后,我发现 y 标签更令人困惑,而不是更有帮助。如果没有给出其他信息,我想我们直观的把 y 轴读成“频率”。
如果我们应用以上所有内容,我们会得到这个图:
带有强调信息的绘图(1/3)
此时,可视化已经为您的演示或报告做好了准备。然而,还有一件事我们可以做,使情节更容易理解。原则上,直方图包含了我们显示百分位数所需的所有信息。遗憾的是,无法直接从剧情中读出信息。如果我们想向老板展示鳄梨价格的第 75 百分位是多少,同时保留关于分布的所有信息,该怎么办?我们可以计算一些百分点,并在图中显示为垂直线。这类似于箱线图,但实际上集成到直方图中。让我们试试这个!
首先,我们要画出垂直线。为此,我们将计算分布的第 5、25、50、75 和 95 个百分点。一种方法是让每一条垂直线比前一条长一点,就像楼梯运动一样。我们也可以给内部线条比外部线条更高的不透明度。
为此,我们将把分位数、线不透明度和线长度存储在一个列表列表中。这将允许我们循环遍历这个列表,并自动绘制所有行。
带强调信息的绘图(2/3)
现在,我们需要添加标签。就像之前一样,我们可以使用不同的不透明度和字体大小来反映分布的密度。为了更好的可读性,每个文本应该相对于百分位线有一点偏移。
带强调信息的绘图(3/3)
我们现在可以使用这个直方图来做出以什么价格出售鳄梨的商业决策。也许我们的鳄梨比一般的鳄梨好一点,我们公司的鳄梨相当出名。也许我们应该收取分布第 75 百分位的价格(大约 1.65 美元)?这个直方图在某种程度上是直方图和箱线图的结合。
这是最终直方图的完整代码:
非常感谢您阅读这篇文章!希望你觉得有用。如果您有任何问题或批评,请给我留言或评论。
原文:https://towardsdatascience.com/take-your-programming-skills-to-the-next-level-bad506a1031c?source=collection_archive---------38-----------------------
尼古拉斯·酷(Nicolas Cool)在 Unsplash 上的照片
你曾经访问过你最*写的函数吗?也许你需要更新一个功能。但是,由于代码相当复杂,您通过使用“如果它有效,就不要碰它”的原则,让代码保持原样?
如果你现在打开你的遗留代码,你能马上理解它们吗?或者也许你需要花至少几分钟来记住代码是关于什么的?
如果你需要花更多的时间浏览,那么这篇文章很可能适合你。这里我们谈谈在不浪费时间的情况下理解遗产代码的方法 。
图片来源:尼克·帕帕斯上 Quora
如果你遵循我们在这篇文章中描述的原则,你可能不需要浪费更多的时间去理解你的遗留代码,因为它们永远不会过时。
农旺在 Unsplash 上的照片
最*,我开始创建一个图书馆。久而久之,库已经超过了几千行。有趣的是,随着库变得更先进,一些意想不到的问题开始出现。
随着代码规模的增长,实现新的功能需要更多的时间。
由于该库处于开发阶段,它可能会有一些功能部件表现不佳。
例如,一个函数可能会因为单元测试中没有考虑到的极端输入值而失败。
这就是为什么每当我实现使用库的其他部分的新功能时,首先,我需要花一些时间来理解相关的函数。
乔治·帕甘三世在 Unsplash 上的照片
在检查了一个新功能并处理了失败的部分之后,随着时间的推移,同一个功能的其他部分会被破坏。
当我回到最*重构的函数时,我发现自己几乎什么都不记得了。我不得不重新检查相同的功能。
这个问题导致我来回地去理解一些代码片段大部分时间在做什么。
在某种程度上,我已经停下来,并开始寻找什么是错的。
尼古拉斯·酷在 Unsplash 上的照片
当我在寻找解决方案时,我发现了一个“干净代码”视频课程[1],它是由《干净代码》一书的作者 Robert C.Martin 准备的。
最后,在干净代码视频课程的帮助下,我已经解决了我所有的问题。不再有导致我浪费时间的糟糕的实现代码。
在这里,我整理了《干净的代码》系列中的一些关键规则,即使过了几个星期,我仍然记得。通过应用干净代码原则,我所有的问题都解决了。
永远不要浪费时间借助干净的代码来理解一个函数的行为。
照片由美元吉尔在 Unsplash 拍摄
每个变量、类和函数名都应该描述自己。[1]
Guillaume TECHER 在 Unsplash 上拍摄的照片
让我们从回顾下面这段代码开始,这段代码是我在参加 Clean Code 视频课程之前写的。
示例 1:在重构命名之前
在这里,我们可以看到我们有一个网飞数据集,它提供了一种在数据集文件中加载电影的方法。
当我们深入研究这个函数的实现时,乍一看很难理解它到底在做什么。
现在让我们看下面的代码片段,例 1.1,它做的事情和例 1 完全一样。
示例 1.1-重构命名后
在代码示例 1.1 中,我们再次有一个加载电影的网飞数据集。但是,这一次,当我们查看 load movies 函数时,我们可以详细了解代码在做什么。
看代码就像一个英文脚本。
你甚至不需要阅读除了前 7 行之外的任何代码来理解代码在做什么,这与示例 1 相反,在示例 1 中,我们需要阅读所有的 12 行,并且还要弄清楚代码在做什么。
詹姆斯·巴尼特在 Unsplash 上的照片
在例 1.1 中,我们看到我们已经命名了很长时间的助手函数,这些函数只打算被 load_movies 函数使用。
因为没有其他函数会调用这些辅助函数,所以我们可以随心所欲地命名它们,对吗?
一天结束时,没有人再调用它们,我们只是在这里调用它们来给出有意义的函数名,并使代码本身更具描述性,而不需要任何注释。
此外,程序员通常需要理解 load_movies 函数在做什么,而不是理解它的实现细节,比如如何转换格式以及如何准确地从输入文件中读取数据。
如果一个程序员想弄清楚它们,那么他总是可以访问各自的私有函数,这些私有函数只由 load_movies 函数使用。
照片由大卫·特拉维斯在 Unsplash 上拍摄
简而言之,我们应该有长的描述性名字,带有私有函数,这些函数会被调用一两次。
此外,我们应该有简短明了的公共函数,因为不同的程序员会多次调用它们。
最后,函数应该有不超过 2 到 3 个参数以增加可读性。
注释意味着不能写出干净的代码。如果任何注释存在于公共 API 之外,接受你的失败。[1]
如果有任何评论,那么知道是很重要的。[1]
蒂亚戈·卡多佐在 Unsplash 上的照片
让我们回顾一下下面的代码,例 2。同样,你根本不需要理解它。仅仅通过查看代码,我们就可以看到存在相当多的注释来使代码更容易理解。
示例 2:重构之前
在示例 2 中,我们看到数据有一个时间约束,可以是时间框约束或最大限制约束。
为了理解代码,我们需要阅读代码的每一行,包括注释。即使全部看完,你可能还是对这个时间约束的目的细节不太满意。
现在让我们来看看下面的代码,它是我在应用干净代码原则后写的。
示例 2.1:重构后(重要部分)
在这里,我们看到存在两种取决于间隔的时间约束。如果间隔有效并且属于预期类型,则满足约束,否则不满足约束。
"在这里,我所做的唯一一件事就是试图删除评论."
如您所见,没有注释和复杂代码的 17 行代码传达了与旧版本的 58 行代码相同的信息。
以下代码片段是示例 2.1 的其余代码。
因为我们的目的是理解 TimeConstraint 类在做什么,我们甚至不需要回顾这段代码。因为,从它的名字区间来看,很清楚这个类是干什么的。
示例 2.2:重构后(剩余部分)
尽可能减少函数长度,直到不能。[1]
最佳函数长度为 4 到 10 行。[1]
沙哈达特·拉赫曼在 Unsplash 上拍摄的照片
让我们回顾一下示例 3,它加载了网飞数据集的用户电影评级数据。
示例 3:重构之前
这里我们看到 49 行长 load_ratings 函数。这个函数到底是如何实现其功能的还不太清楚。我们需要阅读每一行代码来彻底理解它。
现在让我们来看看代码的新版本,例 3.1,它遵循干净代码规则。
这里我们看到
我们有 7 行长负载额定值函数。load_ratings 函数本身很好地描述了它所做的事情,没有任何注释。我们甚至不需要阅读其他私有函数来理解代码。
示例 3.1:重构后
文件应该*均 50-100 行,最多 500 行。[1]
照片由 Maksym Kaharlytskyi 在 Unsplash 拍摄
最后但同样重要的是,现在让我们回顾一下来自推荐系统库的一个代码文件惊喜。
在示例 4 中,我们可以看到代码片段超过 700 行!
尝试阅读代码片段,您很可能会被冗长的注释卡住。
即使从这个库的设计者的角度来看,将文档放在代码内部可能很容易,但这确实使代码难以阅读,并且还会产生很大很长的文件。
永远不要在评论中放 HTML 或者任何格式的文本。这使得注释和代码难以阅读。
实例 4
在接下来的几周里,在应用干净代码原则后,我的代码中开始出现以下症状:
照片由 Nghia Le 在 Unsplash 上拍摄
从我的角度来看,只要阅读 17 行代码就能理解这 58 行庞大的代码在做什么。
这些原则使得代码更易维护、更干净、更简单,并且成本更低,因为没有程序员会浪费时间去理解它。
在使用干净代码原则之前,每当我回到一个无法理解的代码片段时,我会浪费相当多的时间去理解代码,而在这段时间里,我本可以为项目设计和实现新的特性。
照片由玛利亚·宝拉·孔特雷拉斯在 Unsplash 拍摄
总而言之,我可以说,只要习惯了我在下面总结的干净代码原则,你就可以创造出更专业的代码。
生成的代码简单、可伸缩、易读,并且易于维护。
1-每个变量、类、函数名都应该描述自己。
2-函数最多应该有 2 到 3 个参数来增加可读性。
3-如果有任何评论,那么知道是很重要的。
4-注释意味着不能写出干净的代码。如果任何注释存在于公共 API 之外,接受你的失败。
5-尽可能缩短函数长度,直到你做不到为止。
6-最佳功能长度为 4 到 10 行。
7-文件应该*均 50-100 行,最多 500 行。
永远不要在评论中放 HTML 或者任何格式的文本。这使得注释和代码难以阅读。
从我数百次不同的 Github 代码检查中,我意识到几乎没有一个程序员遵循所有的干净代码原则。
在您的代码中尽可能多地尝试它们,看看我得到的症状是否也会出现在您的代码中。
这些原则绝不是提高编程技能的全面清单。这些只是干净代码系列中所有技术的一小部分。还有很多其他的技巧可以让你更加进步。
克里斯托夫·杰施克在 Unsplash 上的照片
我希望您现在有动力开始学习干净代码原则,并在很大程度上提高您的编程技能。
尝试应用八个干净代码原则,并随意分享你对它们的感受。
想象一下,如果您可以通过使用 Clean 代码中定义的一些令人惊讶的有趣技术来学习如何确保一切都遵循这些规则。
你可以通过参加视频课程或阅读我们在下面提供的参考书籍,发现如何具体实施这些原则。
[## 不断增长的专业编程技能
medium.com](https://medium.com/cyber-explorer/growing-professional-programming-skills-577b7cc76187)
[1]罗伯特·C·马丁,干净代码视频系列(2016)
[2] Robert C.Martin,干净的架构:软件结构和设计的工匠指南
原文:https://towardsdatascience.com/take-your-sql-skills-to-the-next-level-by-understanding-the-self-join-75f1d52f2322?source=collection_archive---------30-----------------------
由 You X Ventures 在 Unsplash 上拍摄的照片
我写的前几篇博客对初学者来说非常棒(不用学习编码的数据概念或培养数据科学家的思维)。但是,我真的想推动自己为我的其他观众创造内容。所以今天,我们将进入更中级的数据分析领域。并讨论自我联接:它们是什么以及如何使用它们将您的分析带到下一个层次。
免责声明:这篇文章假设你已经理解了 SQL 中的连接是如何工作的。如果你还不熟悉这个概念,完全不用担心!把这篇文章留到以后吧,因为我认为当你将来掌握 SQL 时,它肯定会有用的。
自连接实际上是字面上的意思——它是将数据库表连接到自身。您可以使用任何类型的连接来执行自连接(左连接、右连接、内连接等)。)—使它成为自连接的是您在两端使用同一个表。只要确保为您的特定场景和期望的结果选择了正确的联接类型。
如果你在数据分析和数据科学领域工作或学习超过 5 分钟,你就会知道解决一个问题总有 27 种方法。当然,有些比其他的好,但有时差异几乎听不出来。
也就是说,很可能永远不会有一个确切的情况,你必须有一个自我连接,否则你的分析将会萎缩,无处可去。当然,如果你有的话,请在下面的评论中给我一个场景
但是,我至少在一些场景中使用了自连接来解决我的分析问题,无论是在工作中还是在个人分析中。下面是我自己对其中两个最好的(也就是我记得的和能想到的好例子)的看法。
假设有一个名为 Chats 的数据库表,它保存了在线服装店发送或接收的所有聊天消息。
对于服装店老板来说,知道她通常需要多长时间来回复顾客的信息是非常有益的。
但是,来自她的客户的消息和发送给她的客户的消息在同一个数据源中。因此,我们可以使用自连接来查询数据,并向店主提供这种分析。我们需要一份聊天表来获取客户的初始信息,一份聊天表来获取所有者的回应。然后,我们可以对与这些事件相关联的日期进行一些日期计算,以计算出店主需要多长时间做出响应。
我将把这个假设的自连接查询写成如下形式:
注意:这个 SQL 查询是使用 Transact-SQL 编写的。使用任何适用于您的数据库的日期函数。
这个查询相对简单,因为 RespondingTo 列为我们提供了要返回到哪个原始消息的一对一映射。
假设这次您看到了一个数据库表 AccountActivity,它保存了一个 yoga 订阅站点上可能发生的事件的日志。yoga 网站提供特定的“高级试用期”,顾客在首次加入时可以享受一段时间的会员折扣。在此表中,使用 Premium_Start 和 Premium ed 事件类型跟踪试验的开始和结束日期。
假设这家 yoga 订阅公司的一些业务员工在问 1。有多少人的保费试用期目前活跃,和 2。有多少曾经有高级试用期,但现在没有了。
同样,我们在同一个数据库表中获得了保费期开始和保费期结束的事件(以及其他帐户活动)。
要回答第一个问题,我们需要找到高级会员已经开始但尚未结束的活动。因此,我们需要将 AccountActivity 表连接到它本身,以查找高级开始和高级结束事件匹配。但是,这次我们不能使用内部连接。我们需要结束表中的空行…所以是左连接。
请注意我们是如何检查并确保我们加入的事件顺序正确的。我们希望高级试用从连接的左侧开始,高级试用在连接的右侧结束。我们还确保用户 Id 在两端匹配。我们不想参加两个不同客户的活动!
关于第二个问题,我们想找到那些甜 premium 试用已经结束的客户。我们将再次需要 self join AccountActivity,但这一次我们可以将它切换得更严格一些。我们需要左右两边的匹配,因为在这个人群中,试验已经结束。所以,这次我们可以选择一个内联接。
看,自我结合很有趣。如果在同一个数据库表中有相互关联的事件,它们会非常有用。感谢您的阅读,并祝您查询愉快。🙂
原载于 2020 年 8 月 13 日https://data dreamer . io。
原文:https://towardsdatascience.com/takeaways-from-my-first-data-science-internship-593b704b11bd?source=collection_archive---------43-----------------------
图片来自作者
目前,我是 NYU 数据科学中心的数据科学硕士学生。我完成了我在数据科学领域的第一次实习,我很乐意告诉你这一切。
我为一家上下文相关的人工智能公司工作,在那里我们检测来自各种*台的有害行为。
天啊。我玩得开心吗?答案是— 地狱是的!
需要注意的一点是,学术数据科学与行业数据科学有何不同。但是,这种转变让它如此令人兴奋。
原文:https://towardsdatascience.com/taking-a-machine-learning-white-paper-to-production-a25cfadcd16e?source=collection_archive---------53-----------------------
图片来自维基百科
当我阅读白皮书时,我通常是带着一个目的去做的,也就是说,手边有一个潜在的挑战,通常是一个很大的挑战。通常,它们真的符合要求。有时,他们甚至会在 Github 上发布源代码。那更好。
作者图片
这是一个简短的故事,讲述了在麻省理工学院从白皮书到生产的一个名为快速深度的项目中吸取的经验教训——在无人机上主动运行,为自主提供感知。
注意——我绝不是在批评快速深度报道、人物或作品。我和他们的交流很有成效。本白皮书讲述了从有趣的白皮书/概念工作证明到“生产”的过程。
能帮上忙的四件事:
尼古拉斯·托马斯在 Unsplash 上的照片
着眼于部署选择你的机器学习语言
有趣的机器学习模型的研究和开发通常是我们感兴趣的白皮书的重点。研究人员倾向于喜欢 PyTorch。与 Keras/Tensorflow 相比,它提供了额外的灵活性,例如在动态图形中。好吧。然而,Tensorflow 似乎在总体使用上占主导地位,尤其是在运行时性能方面。
实际上有两种方法可以在生产中运行您的模型:
如果你的交付允许 CUDA,你有更多的选择。然而,我倾向于参与上面的第二个项目——嵌入式 Linux 和智能手机项目。例如,在 2010 年 4 月发布的 1.0 版本框架移动神经网络(来自阿里巴巴),他们专注于后端,如 ARM CPU、OpenCL、OpenGL、Metal 和 Vulkan。并且针对 Adreno 和 Mali 系列的 GPU 进行了深度调优。正合我的胃口。
此外,从语言角度来看,“MNN 目前支持 Tensorflow、Tensorflow Lite、Caffe 和 ONNX(py torch/MXNet);后者通过算子融合、算子替换和布局调整来优化图形那就是,ONNX 当然看起来是二等公民。更进一步,它们支持 86 个 Tensorflow 操作,仅支持 34 个 Caffe 操作。
比赛可能不会总是跑得最快,但这是一个非常好的赌注。如有可能,使用 Tensorflow 进行部署。
找到一个有效的部署推理引擎
在之前的一篇文章中,我已经深入地写过这个。总的来说,有许多选择,完成这些选择是漫长而痛苦的。我发现了一个名为的移动人工智能计算引擎 (MACE),它是第一个在我的环境中运行良好的引擎。
您的里程可能会有所不同。为了获得最佳性能,我还想进一步探索 MNN(如上所述)和 tvm.ai 。
使用集中的训练数据调整您的模型
研究论文需要表明他们已经超越了以前的工作。他们的方法是使用基准数据集。在深度估计的情况下,正常的基准是 NYU 深度数据集 V2 。这个数据集来自 2012 年,包含大约 50 多张用 Kinect 摄像头获得的训练图像(RGB-D,D 代表深度)。(一个类似的汽车感知数据集被称为 KITTI,也来自这个时间段。)
(图片来源 NYU Depthv2 训练数据)
这是一个来自 NYU 深度 V2 数据集的样本。即纽约公寓和办公室的内部。
Jason Sung 和 Amy Elting 在 Unsplash 上的照片
相比之下,我们的重点是更多的砂砾,工业设置。
请注意更大的深度和“不同”类型的场景组成。
简而言之,根据 NYU 数据训练的模型在两个方面让我们失望:
下一步—查找新数据集
四处搜索,我们发现了二极管,一个类似的数据集,但两者都有更大的数据范围,高达 350 米,以及室内和室外场景。这个好用多了。
但是……(作弊部分……)
在高度相似的图像上训练高度特定的场景仍然是值得的。好吧,你可以说“作弊”,我会继续优化我们的结果,因为我们努力推广。简而言之,我们将从一个高度特定的环境中捕捉大约 5000 张图像,并在此基础上训练我们的模型。
这些最终的图像是用一个实感传感器捕捉的。这比 Kinect 更精确,但仍然受到 10 米(或更小)深度范围的限制。)
简而言之,行之有效的训练方案是:
这在期望的域内很好地工作。
然后,校准您的训练数据
你可能已经注意到,到目前为止,我们大概使用了几种不同的相机:(无论 Mobilenet 使用什么);Kinect 二极管;实感;别忘了无人机上的最后一个摄像头。摄像机具有不同的校准参数。
图片来自维基百科
参考针丨孔丨摄像机型号。这是高中数学,我就不拖累你了。但是对我们来说两个关键参数是焦距和主点。
焦距在上图中显示为 f。主点没有显示,但表示图像中心在图像*面上的位置,对于相机来说,这通常是关闭的。
你说,那又怎么样。事实证明,你真的不应该在同一个训练数据集中混合和匹配来自不同参数相机的图像。
好消息是相机之间的转换很容易。
下面是一些帮助转换的代码。使用的摄像机校准参数来自 ROS 框架。一般来说,通过的路径是:
下面是我为上面的#2 编写的 Python 代码:
总结
和往常一样,一个好的方法是迭代地进行,深入探索技术上未知/未证实的领域。上面概述的四件事将帮助你加速这个过程。
正如托马斯·爱迪生所说,“天才是百分之一的灵感,百分之九十九的汗水(T2)或者,用我的话来说,一个好主意是好的,一个概念的证明是伟大的,在现实世界中工作需要很多努力。
原文:https://towardsdatascience.com/taking-advantage-of-price-dips-in-flight-prices-328bf40d3c64?source=collection_archive---------45-----------------------
来源:像素
假设你手里有很多空闲时间,你想飞到很多城市,但是你不确定用哪种策略来计划你的旅行。你应该在那天买最便宜的票还是等几天找到最低价?如果你这样做,你能完成你的旅行吗?
我将探索这些想法,并从头开始编写算法,以展示哪些策略最适合我们的梦想之旅。
先做最重要的事情;
图 1:数据的初始视图
该数据包括所有可能日期的所有可能的航班组合。此处的总天数可以更改,可以添加新的城市,但用于此问题的数据集包括 6 个城市和 40 天(最多)。
首先,有每天选择最便宜航班的标准策略。如果我们在慕尼黑,最便宜的航班是去斯图加特,我们会选择去斯图加特。
标准策略
但是如果我们在慕尼黑,最便宜的航班是去斯图加特的,但是明天更便宜呢?这被称为价格下降,它存在于现实生活中的票价。
为什么会出现价格跳水?因为航空公司需要在确保每个座位都坐满和赚取足够的钱来支付运营成本之间找到合适的*衡。
出于这个原因,机票价格会根据与航班相关的许多不同因素,如商务旅行和实时预订,非常有规律地上下浮动。价格下跌策略通过比较当天第二天的价格来发现价格下跌。
价格下跌策略
价格跳水策略是否优于正常策略?为此,我们需要创建一个模拟,将一个随机项添加到原始数据库中。这样,该算法可以运行 1000 次,以找到总成本的列表,并且可以应用 T 检验来查看策略之间是否存在差异。
标准和价格下跌策略的分布
T 检验表明,两种策略之间存在显著差异,因此价格下跌策略更好。但是现在问题解决了吗?不幸的是没有,因为价格下跌策略跳过了很多天,需要很多天来总结所有城市。
来源: Pexels
t 检验结果显示价格下降策略比标准策略有显著的改进。但是有一个条件:价格下跌策略在大多数时候都不会结束。这意味着它不能在给定的时间内到达每个城市。为了解决这个问题,当只剩下一个城市的时候,我会去最后一个城市。因为大部分时间这条路线都错过了那一个要完成的城市。
修改后的价格下跌策略
现在让我们看看在给定的 6 个城市中,策略失败的频率。让我们看看改进的价格下降策略是否取得了更好的成功。
基于给定天数的策略完成率
在给定 25 天去所有 6 个城市旅行的情况下,标准策略在 4 %的时间里失败,价格下降策略在 39 %的时间里失败,而改进的价格下降策略在 5 %的时间里失败。
改进的价格下跌策略(Price-Dip-All)具有非常高的完成率,但是 t 统计显示它具有相似的成本,这意味着与正常的价格下跌策略相比,它在价格方面没有显示出显著的改进。
在这篇文章中,我们讨论了一些关于如何计划你的梦想之旅的想法。事实证明,每天购买最便宜机票的标准策略会让你游览每一个城市,但费用很高。
价格下跌策略的出现大大降低了总成本,但它并没有在给定的时间内完成每个城市。对于 6 个给定的城市和 20 天,该算法有 39%的时间无法访问所有城市。价格下跌策略被改变,并修改为访问最后剩下的城市时,有一个城市离开。改进后的策略具有前两种策略的优点,成本低,完成率高。
我希望这篇文章能给你一些关于为你的数据集实现你自己的算法的想法!有什么问题吗?在 Linkedin 上找到我,查看代码。
原文:https://towardsdatascience.com/taking-ai-models-from-jupyter-notebooks-into-real-hospitals-6fbc0832401e?source=collection_archive---------43-----------------------
图片来自 Unsplash
从放射学到病人护理,人工智能在医疗保健的许多领域都显示出惊人的潜力。AI 在放射学中的应用包括从胸部 X 射线中检测结核病,从 CT 扫描中检测新冠肺炎和颅内出血,从乳房 X 线照片中检测癌症,从 MRI 中检测脑肿瘤,从 PET 扫描中预测阿尔茨海默氏症的进展,等等。在 DeepTek,我们开发了仅从胸部 x 光就可以诊断 30 多种疾病的模型。除了放射学,人工智能还被应用于病理学,分析电子健康记录,疫情反应的接触追踪,预测再入院和死亡率,等等。强大的研究成果和活跃在这一领域的大量公司证明了人工智能从根本上改变医疗保健的承诺。
尽管如此,这一承诺在很大程度上仍未实现。许多令人兴奋的机器学习技术在基准数据集上表现出了显著的效果,但在学术论文和代码库中却没有使用。人工智能医疗创业公司的估值正在飙升,但他们没有收入,其中只有少数几家公司看到了任何形式的产品化人工智能和商业采用。
作为 DeepTek 的首席数据科学家 DeepTek 是少数几家成功实现其人工智能解决方案商业应用的公司之一——我想分享一下在开发在实践中实际工作的机器学习模型时所面临的关键挑战。以下是它们,没有特定的顺序。
是的,我们都听过这句话,不是吗?数据科学家总是抱怨没有足够的数据,过了一段时间后,团队的其他成员对这种抱怨充耳不闻。这是一个难以忽视的事实,但是让我们面对这个事实:根本没有办法绕过它。如果你没有数据,你就什么都没有。机器学习项目以数据开始,以数据结束——所有的创新都发生在两者之间。
神经网络渴望数据,它们不仅需要数据量,还需要输入的数据的多样性。成吨的医疗数据存在,但严重支离破碎。它存在于不同医院、诊所、个人电脑、USB 磁盘驱动器、电子邮件的小仓库中,其中很大一部分甚至没有数字化。即使医院允许你访问他们的数据,你也会发现跟踪、编辑和组织这些数据非常困难。HIPAA 和 GDPR 等数据隐私法规虽然本身非常重要,但却让事情变得更加困难。
监督机器学习需要数据样本和标签。该算法首先在匹配样本-标签对上进行训练,从数据中提取模式,并将它们提取到数学模型中。这个模型后来被用来预测任何看不见的样本的标签。一个困难是这些标签经常是嘈杂的。
考虑放射科医生针对给定的病理将 X 射线图像标注为阳性或阴性的情况。作为数据科学家,我们愿意相信这种标签是清晰、确定和明确的。现实有些不同。正如许多研究表明的[ 1 ][ 2 ],在评估 kappa 值范围为 0.3 至 0.8 的研究时,放射科医师之间存在高度的评分者间差异。因此,如果使用放射科医师的注释作为基础事实来构建 AI 模型,它们将从标签本身可能不准确的不确定基础开始。当注释不是来自一个放射科医生,而是来自一个由多个放射科医生组成的团队时,这个问题变得有些复杂——在处理大型数据集时可能就是这种情况。
开源研究数据集(NIH、MIMIC、Padchest 等。)带有使用 NLP 算法从报告中自动提取的标签。NLP 提取过程可能会在标签中引入错误,但是在使用它们时还有另一个微妙的问题。当人类放射科医师评估图像并撰写报告时,放射科医师可以访问患者的临床信息,并且他/她的诊断会考虑该信息。然而,这种额外的信息对于 AI 训练来说是不可用的。在缺乏这些关键信息的情况下,人工智能可能无法学习样本和标签之间的正确对应关系。
哦,这种事经常发生!考虑以下情况。我们从医院收集了大量的 x 光图像。我们的放射科医生会针对给定的病理(比如结核病)对这些数据进行注释。在这个数据集中,结核病的患病率为 25%。四分之一的样本被标记为结核。我们使用这个数据集训练我们的结核病模型。作为一个新项目的一部分,我们在一个从事结核病人群筛查的医疗保健中心部署了这一模型。在这个人群筛查项目中,结核病的患病率是 5%。该模型的性能如何?
在 DeepTek,这些挑战是我们日常生活的一部分。要了解我们如何克服这些困难,联系我们,我们将很乐意讨论更多。
不太好。该模型针对特定的流行情况进行了训练和评估。它预计在测试阶段会有同样的流行率。当然,有很多方法可以解决这个问题,但是也有更多的问题。医院的 X 射线设备可能与医疗保健中心的不同。患者位置可能不同。医院图像可能会显示导管和胸导联。人群筛查图像可能包括异物,如硬币、别针、珠宝和夹子,因为这些可能是在人们穿着衣服的情况下拍摄的。由于这些因素,模型训练所依据的数据可能与其预期的数据有很大差异。
这与上述问题有关,但需要一个单独的部分。医疗保健行业的流程和工作流处于不断变化的状态。医院会变的。医生会变的。年轻一代的医生和医疗从业者并不羞于使用技术。病人会变的。所有这些的净效果是数据分布一直在变化。一个模型,一旦被开发和部署,永远不会顺利地工作。事实上,在医院中采用人工智能可能会导致医院工作流程本身的根本变化,从而导致数据分布的变化。
分布漂移(也称为概念漂移或数据集漂移)发生在数据分布开始随时间变化时。为了在实践中成功部署人工智能解决方案,他们需要配备自动识别漂移发生的技术,并重新训练和更新模型以纳入这种漂移。
机器学习算法被优化以在给定数据集上实现最佳性能。尽管我们希望模型在训练中学习正确的特性,但情况可能并不总是这样。众所周知,模型会偷偷利用图像中可能与预测相关也可能不相关的未知特征。例如,如果数据集中的阳性图像主要来自一家医院,而阴性图像来自另一家医院,则模型可以学习区分图像的来源,而不是目标病理;因此,它可能会拾取图像中的对比度差异、扫描主要区域之外的一些文本标记、扫描周围的黑色边界区域或其他一些不相关的特征(也称为混杂因素),而不是学习根据指示病理的视觉症状来区分类别。如果这个模型也带有相同的混淆特征,那么它甚至可以在一个基准集上表现出优异的性能。
一个学习了不相关特征的人工智能模型的例子
在许多组织中,无论是研究机构还是行业机构,技术开发人员都与医疗从业者保持一定的距离。由于这种差距,他们开发的解决方案解决了一个与需要解决的问题有质的不同的问题,以使解决方案对医疗人员实用。确定合适的利益相关者,通过对话引出他们面临的问题,将这些转化为一组明确的要求,客观地制定这些要求,然后设计满足这些要求的解决方案,当你开始计算这个漫长过程中涉及的人数时,这并不是一件容易的事情。
人工智能可以彻底改变医疗保健。通过消除流程中的瓶颈,自动化日常任务,提高诊断准确性,提高人类生产力,并最终降低成本,人工智能可以成为让所有人都能获得医疗保健的游戏规则改变者。为了实现这一潜力,我们需要承认上述挑战,给予它们应有的尊重,并找到缓解它们的方法。在 DeepTek,这些挑战是我们日常生活的一部分。要了解我们如何克服它们,请联系我们,我们将很乐意讨论更多。
如果你喜欢这篇文章,可以在 中型 上查看我的其他作品,在LinkedIn或Twitter,查看我的 个人网页 ,或发邮件给我viraj@berkeley.edu
原文:https://towardsdatascience.com/talking-about-data-science-topics-with-business-minded-executives-b968df91935b?source=collection_archive---------27-----------------------
从艾米·赫斯基到 Unsplash
我从经理那里听说过一些数据科学家的故事,他们在技术能力方面非常出色,但缺乏一些基本的业务沟通技能。我还听到数据科学家抱怨说,高层管理人员不理解一些技术术语之间的区别,会在不理解其含义的情况下抛出一些术语,如“大数据”。
这篇文章的目的是帮助双方!数据科学家们,你可以阅读这篇文章,并获得用非技术术语解释行话的帮助。商业领袖,你可以深入了解当前数据术语的真正含义,也许还能更好地理解数据科学家的困境。
“人工智能!大数据!深度学习!我们需要在我们的组织中利用所有这些…尽快。”
从 Seema Singh 开始走向数据科学
我们可以将人工智能定义为“能够感知、推理、行动和适应的程序。”人工智能模仿人类表现出的认知功能,如推理和学习。
机器学习是一种特定类型的人工智能,它使用算法来学习数据和输出预测中的模式。机器学习需要相对较大的数据集,数据科学家通常会将数据分为训练集(用于构建模型)和测试集(用于测试模型性能和泛化能力)。
深度学习是一种复杂类型的神经网络(仅供参考:神经网络是机器学习的一个子集)。有些人会互换使用神经网络和深度学习这两个术语,但真正的深度学习是当神经网络至少有两个隐藏层时。如果你不知道隐藏层是什么,没关系,你需要知道的是深度学习算法比小型神经网络更复杂(因此计算成本更高)。
从 iauro onTwitter
大数据是一个巨大的时髦词。但是,在您的组织中拥有大量数据和真正拥有大数据之间有什么区别呢?上图概述了使数据被视为“大”的 4 个关键描述符
当您处理大数据时,规模通常以 TB 为单位。大数据是以多种格式出现的数据,如图像、文本、数字等。此外,如果您的公司也在讨论分析流数据(即持续生成的数据),那么您可能正在处理大数据。
“我们公司使用的是尖端的机器学习技术。”
来自丹·舍万在 wordstream.com的
数据分析和机器学习之间的一个巨大差异是它们寻求回答的问题。
在数据分析中,你想知道类似于我们公司在这个时间点的销售额发生了什么变化?为什么会发生这种事?在机器学习中,你想知道基于过去发生的事情,我们可以预期未来我们的销售会发生什么?
上图详细描述了一些可以通过机器学习解决的商业任务或问题。对于这些任务中的每一项,您都要创建一个模型,用数据训练该模型,然后测试其预测准确性(或另一个度量)。另一方面,数据分析只专注于分析趋势,然后寻找解释。
从贾格里特·考尔·吉尔到xenonstack.com
这些图形突出了深度学习和其他机器学习技术之间的两个重要区别(在我看来)。
从杰森·布朗利到machinelearningmastery.com
第一张图解释了深度学习的好处之一-除了执行分类任务之外,它还完成了特征提取的过程(即从初始数据集创建特征)。这意味着数据科学家可以将原始数据输入深度学习算法,例如图像中的像素值,这是他们无法用其他机器学习方法完成的。
第二张图说明了深度学习如何在大型数据集上表现得更好。根据您拥有的数据类型和数量,一种方法比另一种方法更适合您的项目。(计算资源也是一个重要的考虑因素——用大量数据训练算法会花费大量时间。)
最后,深度学习方法最常用于带有标签数据(即结果/分类已知的数据)的行业。机器学习方法通常用于对标记为或未标记的数据进行建模。
“那你能在周末之前给我一个预测模型吗?”
*这在我们的数据仓库中没有
来自吉尔出版社forbes.com
《福布斯》公布了 2016 年对约 80 名数据科学家的众筹调查数据。上面的饼状图描述了“你花最多时间做什么”这个问题的答案。
这项调查的一个重要收获是,数据科学家花费高达 80%的时间在数据收集和清理上(在上图中,收集数据和清理/组织数据的总和为 79%)。我曾与数据科学家交谈过,他们说高管们并不总是理解或考虑到简单地为项目准备数据所需的工作量。
从Cher Han Lau 博士上走向数据科学
这是我在个人项目中经常思考的问题,但它同样适用于专业项目。第一张图说明了一般的数据科学流程,但在算法投入生产或用于演示之前,建模步骤之后通常会有迭代。
从尼克·斯奇利科恩到ideatovalue.com
在这个迭代中有一个内在的权衡:随着你在一个模型上花费更多的时间,它的准确性/性能会增加,但会以一个递减的速率增加(见:收益递减的定律和这个图中标有 C 的部分)。
如果管理层要求某个准确度级别,例如 95%,他们必须明白,如果数据科学家带着一个准确度为 93%的模型回来,那么与在建模过程开始时增加准确度相比,增加最后 2%的准确度将花费更长的时间。
我对这里的数据科学家观众还有最后一个要求——清晰简洁地说明你要用你的模型/分析回答什么业务问题,以及项目将如何为公司增加价值。此外,只要有可能,计算你的项目的商业影响(最好用货币单位)。
我认为,如果你能获得技术数据科学技能、沟通技能、和用商业思维看待项目,你对任何公司都是非常有价值的!
感谢您的阅读!如果你觉得这篇文章有帮助,请在 LinkedIn或与你的团队分享。
如果您正在寻找更多关于数据科学主题的简单解释的文章,请查看我如何在我最受欢迎的文章中分解流行的机器学习模型的基础:
[## 向一个五岁的孩子解释机器学习模型
towardsdatascience.com](/machine-learning-models-explained-to-a-five-year-old-f2f540d9dcea)
原文:https://towardsdatascience.com/talking-to-python-from-javascript-flask-and-the-fetch-api-e0ef3573c451?source=collection_archive---------2-----------------------
一个样本网络— D. Ellis 2020
在数据科学领域,通常需要使用一系列工具,每种工具都与其工作相关。一个需要使用 web 界面可视化的角色,但是处理 Python 脚本,通常最好在 d3 或 THREE.js 中构建一个定制的可视化来显示它,然后根据需要获取数据。本文介绍了如何创建一个简单的 flask 应用程序,它可以使用 Fetch API 向 web 接口提供数据。
我们首先构建一个包含一个空的文件夹和一个文件的存储库。
我们的文件包含创建 web 界面所需的数据。为此,我们使用 flask ( ) python 库。为此,我们可以使用以下模板:
在这里,我们首先导入所需的功能、应用程序结构和运行命令来启动应用程序。
定义了 flask 应用程序后,我们现在需要创建一个模板网页。这可以通过将文件放在模板目录中来完成。
因为我们使用它作为模板,所以我们可以对某些关键字使用 react 风格的替换语法。在这个例子中,下面代码片段中的将被替换为字符串。
这定义了当到达 flask app 的主页时运行的代码,需要在 内的 和 行之间添加。****
最后,我们可以运行应用程序,使用并在 web 浏览器中导航到进行查看。
在传输数据时,我们依赖于 fetch API 中的 GET 和 POST 函数。这些术语不言自明:
在中,我们可以为 GET 请求创建一个 URL。下面的代码定义了调用 URL 时的响应。
在一个 GET 请求之后,我们定义一个包含一个元素的字典并序列化它。接下来,这将被发送回调用的 javascript 程序。
在将下面的代码添加到命令之前并执行它之后,我们可以访问——它应该会产生下面的结果:
现在我们已经设置了服务器端的东西,我们可以使用 fetch 命令从其中检索数据。为此,我们可以使用如下的承诺:
这里我们对运行一个 GET 请求,它将返回的 JSON 字符串转换成一个对象,然后将元素打印到 web 控制台。通常,JavaScript 代码应该嵌套在 HTML 文档中的标记之间。
现在我们有了一个工作示例,我们可以扩展它以包含实际数据。实际上,这可能涉及访问数据库、解密一些信息或过滤一个表。
出于本教程的目的,我们将创建一个数据数组,并从中索引元素:
在我们的 Flask 应用程序中,我们可以向 GET 请求添加可选参数——在本例中,是我们感兴趣的数组索引。这是通过页面 URL 中的附加页面扩展指定的。然后,该参数被传递到页面函数中,并在 return 命令中进行处理()。
fetch 请求保持不变,只是将 GET URL 改为包含我们感兴趣的数据元素的索引。这是在的 JS 脚本中完成的。
这一次,我们不是返回一个对象,而是返回一个字符串并解析它。然后可以根据需要在代码中使用它——无论是更新图形还是显示消息。
我们探索了一种使用 python 提取数据并将其提供给 javascript 代码进行可视化的方法(替代方法包括 web/TCP 套接字和文件流)。我们能够创建一个服务器端 python 代码来预处理或解密数据,并且只向客户端提供所需的信息。
如果我们有不断更新的数据、大型(高资源)数据集或我们不能直接提供给客户端的敏感数据,这是非常有用的。
本文中使用的附带示例代码可以在:找到
[## wolfiex/FlaskFetch
github.com](https://github.com/wolfiex/FlaskFetch)
原文:https://towardsdatascience.com/tapping-nasas-earth-data-via-opendap-apis-and-python-towards-earth-data-engineering-e6531095e8a0?source=collection_archive---------31-----------------------
美国宇航局在 Unsplash 拍摄的照片
NASA 地球数据对于地球科学家、水文学家以及对使用地球数据(例如,降水、温度等)感兴趣的任何人来说都是非常宝贵的资源。)用于教育、分析、可视化和建模等。这些数据可通过多个*台获得,包括美国宇航局戈达德地球科学(GES)数据和信息服务中心(DISC),以及美国宇航局地球科学数据系统(ESDS)计划等。然而,这些*台需要用户手动访问网站来下载所需的数据。很多时候,Python 程序员和不习惯地理格式的用户似乎无法访问数据格式(例如 netCFD、hdf 等)。
本文试图通过提供一个通过 OpeNDAP 访问这些数据的示例,来减少 python 用户访问 NASA 地球数据的障碍。我们将完全使用 python 来实现数据检索过程的自动化。因此,本指南也有利于地球数据工程和利用 NASA 的数据金矿开发数据管道。
我开发本指南的主要动机源于理解导致 2020 年 8 月下旬卡拉奇毁灭性洪水的降水事件的需要。美国宇航局地球数据包括大量数据集,其中包括基于卫星和历史降水事件的建模观测。本指南将说明如何在 python 中访问其中一个数据集,即 GPM IMERG 数据集,以提取卡拉奇及其所在地(2020 年 8 月下旬)的卫星降水数据。
通过 python 访问 NASA 地球数据集的关键先决条件是:
1)创建一个 NASA 地球数据账户。它是免费和即时的。
3)安装 pydap python 库。虽然有其他基于 python 的方法允许通过 OpeNDAP api 连接到 NASA 数据集,但 pydap 使用起来简单方便,应该可以与任何 python 3.6+版本一起工作。然而,我们建议通过以下命令从 github 提交安装:
一旦创建了地球数据登录并安装了 pydap 库,我们就可以通过 OpenDAP 建立与 NASA 数据集的连接,给定 opendap url。此处提供了一些可用的 OpenDAP 数据集的档案。我们有兴趣观察 2020 年 8 月下旬卡拉奇的次日降水模式。因此, GPM 半小时延迟降水是一个合适的数据集。以下代码块使 python 用户能够通过 pydap 连接到数据集(请提供 NASA 地球数据用户名和密码):
一旦与 GPM 数据集建立了连接(该连接在上面的代码中表示为“dataset”),我们就可以提取与我们感兴趣的空间区域相关的数据(在本例中为卡拉奇及其所在地),以及我们感兴趣的时间(在本例中为 2020 年 8 月 25 日至 28 日)。这里需要注意的是,GPM 数据集变量存储在三维数组中,时间作为第一个索引,纬度作为第二个索引,经度作为第三个索引(有关数据格式的详细信息,请参见这里的)。因此,为了从上述代码中的“数据集”请求一个(变量的)块,我们需要输入以下代码行:
如上所述,精确的数据请求需要 I)请求的变量的名称,ii)时间索引的范围,以及 iii)空间索引的范围(纬度和经度界限)。虽然理论上可以请求整个数据集,但是 GPM 数据集是全局的和海量的(至少万亿字节)。因此,请求整个数据集是不可取的。无论如何,这样的请求会在 NASA 的服务器上超时,不会通过。
这幅图中我们感兴趣的空间区域是卡拉奇及其所在地。因此,我们需要在跨越巴基斯坦卡拉奇的数据请求中提供纬度和经度索引。下面的代码块说明了如何确定这些索引的范围。变量“lat_range”和“long_range”应由用户定义,用于指定所请求数据的空间范围。剩下的代码查找对应于这个范围的 GPM 数据数组索引。
确定对应于 2020 年 8 月下旬(8 月 25-28 日)的 GPM 数据集时间指数,需要了解数据集本身的开始时间。根据 GPM 数据集的元数据,该数据的开始时间为 2000 年 6 月 1 日 00:00:00。此外,我们使用的 GPM 数据集是半小时一次的。因此,对应于 2020 年 8 月 25 日 00:00:00 的时间索引可以通过找到 20 00 年 6 月 1 日和 2020 年 8 月 25 日之间的 30 分钟间隔的数量来确定。下面的代码块在 GPM 数据集中找到开始时间索引,对应于 2020 年 8 月 25 日,按照上述逻辑。我们还通过核对与索引值相关联的时间变量来检查逻辑的有效性,以确保它确实是 2020 年 8 月 25 日。
现在我们已经确定了 GPM 数据的起始时间索引和感兴趣的空间索引,我们可以使用 pydap 请求 GPM 降水。请求 GPM 降水数据的代码如下。请注意,降水变量名为“precipcal ”,我们要求从 2020 年 8 月 25 日开始的 4 天(巴基斯坦卡拉奇)的数据。
通过 pydap 从 NASA 接收的数据被保存为一个“py DAP 模型”对象。这个对象的四个属性是特别感兴趣的,即‘time’,‘lat’,‘lon’和‘precipcal’(请求的变量名);“time”、“lat”和“lon”是表示请求的数据的时间、纬度和经度维度的 numpy 数组,“precipal”(请求的变量)是一个 3D numpy 数组,具有与时间、纬度和经度维度相对应的半小时 GPM 降水量值。下面的代码片段演示了如何将这些数据转换成 pandas 数据帧。
一旦检索到的数据被转换成数据帧,我们就可以通过一个简单的时间序列来快速查看 2020 年 8 月卡拉奇的毁灭性事件。让我们通过的时间序列图(代码也在下面给出)来想象这些雨是如何在卡拉奇 Cantt 地区展开的。
卡拉奇坎特地区 2020 年 8 月的降雨结果如何(图片由作者提供)
本文展示了如何使用 pydap 库和 OpeNDAP api 在 python 中访问 NASA 地球数据集。这里提供的代码片段也可以用作从 NASA 的地球数据开发数据管道的基线,还可以从 NASA 的数据仓库中挖掘出宝贵的见解。
我希望本文的内容对地球数据科学家、工程师和任何对探索地球数据感兴趣的人有用。你可以通过 linkedin 或 twitter 与我联系,进行任何询问、讨论等。
原文:https://towardsdatascience.com/target-encoding-and-bayesian-target-encoding-5c6a6c58ae8c?source=collection_archive---------9-----------------------
安妮·斯普拉特在 Unsplash 上的照片
分类变量的编码问题是特征工程中非常重要的一步。不幸的是,没有适用于所有情况的解决方案。人们发明了多种技术,我在这里介绍其中的一些、这里的和这里的。
在这篇文章中,我将讨论目标编码(又名*均编码)及其改进版本贝叶斯目标编码,以及其在采样贝叶斯编码器中的最新改进。
给定无限量的干净数据,您将不需要对类别进行编码。您可以为每个类别训练一个模型。例如,对于泰坦尼克号问题,你可以为男性和女性训练不同的模型。如果你有几个分类变量,你必须为它们的每一个组合训练一个新的模型。
这种方法有明显的问题:
通常,这种方法通常会导致过度拟合,并且不用于高基数分类变量。然而,正如在[1]中所证明的,开发正则化技术并实现这种方法的良好推广是可能的。在那里,这项技术被用于模拟 DNA 序列。
一般来说,分类变量的编码是用一个或多个数字变量替换分类变量的过程,以便得到的数据集可以用于期望数字变量的统计和机器学习算法中。许多编码技术,例如一键编码和顺序编码,都是在 20 世纪早期发展起来的,它们并没有失去它们的重要性。从 scikit-learn 查看一个很棒的用户指南。对于高基数分类变量,这两种技术变得不太有用。序数编码不能从分类变量中提取有用的信息。一键编码为高基数分类变量生成了太多的特征,并且往往产生较差的结果。我们将考虑下面两种对高基数分类变量非常有效的编码。
这种类型的编码被称为目标编码或均值编码。查看 Coursera 课程“如何赢得数据科学竞赛:向顶尖高手学习”中对此类编码的精彩解释
经典论文[2]给出了这种方法的理论基础。这个想法非常简单:让我们使用目标统计对分类值进行编码。正如论文中所描述的:
实际上,这意味着我们计算每个类别的目标变量的*均值,并用目标*均值对该类别进行编码。这种技术适用于二元分类和回归。对于多类分类,应用类似的技术,其中我们用新变量编码分类变量,其中是类的数量。
值得注意的是,尽管作者声称使用目标统计对分类变量进行编码,但实际上只使用了均值。虽然它对于二元分类来说是一个充分的统计量,但对于回归来说却不是,因为它忽略了目标变量的类内变化。贝叶斯目标编码解决了这个问题。
由于目标泄漏,目标(*均)编码有过度拟合的趋势。有各种技术可以解决这个问题。例如,在留一编码器中,从目标统计中减去当前目标值。这减少了目标泄漏。另一种技术是向编码值添加高斯噪声。噪声的强度是模型的超参数。
另一个问题是,一些类别几乎没有训练示例,并且这些类别的目标*均值可能采用极值,因此用*均值编码这些值可能会降低模型性能。为了解决这个问题,该类别的目标*均值经常与目标变量的边际*均值相混合[2]:
对于有许多训练示例的类别,权重λ接* 1,对于稀有类别,权重λ接* 0。例如,它可以被参数化为:
系数λ可用经验贝叶斯模型解释。在这种情况下,我们首先拟合边际分布,即我们基于整个数据集找到后验分布。然后,我们可以将这个后验分布用作模型的先验分布,即给定分类变量值的目标变量的分布。
目标(*均值)编码的这些和其他变体在 python 包类别编码器【3】中实现。目标编码的不同变体似乎从分类变量中提取出略有不同的信息,因此在数据科学竞赛期间,多种技术经常被用于各种叠加方案中。
贝叶斯目标编码的主要动机是在编码分类变量时,除了使用目标*均值之外,还使用类别内方差。它是在[4,5]中提出的(看似独立)。主要观点是我们应该计算后验分布的均值、方差和高阶矩。
在贝叶斯学习中,分布的参数本身被认为是随机变量。在看到任何数据之前,参数的分布称为先验分布。基于新数据更新该分布以成为后验分布。对看不见的数据的预测可以通过在参数空间上边缘化来得到。为了避免难以处理的积分,贝叶斯从业者经常使用共轭先验。它们的优点在于具有非常简单的更新规则,使得基于训练示例快速计算后验分布成为可能。更多解释请见下文[5]的摘录。
例如,考虑二进制分类问题。那么二元变量就可以用伯努利分布来描述,只有一个参数,就是它属于第一类的概率。第二类的概率是。在贝叶斯统计中,参数本身是一个随机变量,共轭先验是贝塔分布:
后验分布参数的更新规则非常简单:
后验分布参数的解释是α-1 成功和β-1 失败。
[4,5]中的想法是计算每个类别的成功和失败次数,然后根据后验分布的矩生成特征:*均值:
方差:
偏斜度:
可能还有更高的时刻。
同样的技术也可以用于回归和多类分类模型。在[5]中,这种方法被称为共轭贝叶斯模型(CBM)。对于多类模型,共轭先验是狄利克雷分布,对于回归问题,它是正态-逆伽玛分布。
如果我们只使用后验分布的一阶矩:它的均值,CBM 就简化为目标(均值)编码。通过添加更高的矩,我们可以添加目标变量的类别内分布的细节,这可以提高模型性能,前提是相同的分布对于看不见的数据是真实的。这是这种方法的一个弱点,因为模型可能会在更高的时刻过度拟合,而不会在看不见的数据上推广。在这种情况下,常规目标编码比 CBM 产生更好的结果。
在[5]中,先验分布是通过在整个训练数据集上拟合贝叶斯模型而得到的。这对于解决稀有类别的问题非常重要。实际上,您希望控制目标变量的边际分布对后验分布的影响程度,因此通常必须缩小先验分布,以实现更好的模型性能。
[4]中给出了贝叶斯目标编码的一个很好的实现:
[## Avito 目标编码
www.kaggle.com](https://www.kaggle.com/mmotoki/avito-target-encoding)
它只涵盖了二元分类的情况。在期间,我们计算成功和失败的次数。在阶段,我们生成具有条件分布的均值和其他统计属性的特征,如下摘录所示:
一个通用的 CBM 算法可用于不同的 github 编码:
[## aslakey/CBM_Encoding
github.com](https://github.com/aslakey/CBM_Encoding)
我希望这种分类编码技术能被合并到分类编码器包[3]或另一个广泛使用的特征工程库中。此外,我希望看到更多的理论讨论,将贝叶斯目标编码技术放在一个更广泛的统计学习的背景下。
最*发表的预印本 [6]建议对贝叶斯目标编码技术进行改进。不使用后验分布的矩作为新特征,而是建议对后验分布进行采样,并将采样值作为新特征。该思想基于这样的观察,即一般的目标编码,特别是贝叶斯目标编码,可以被表示为使用弱学习器来发现新特征的分层模型。弱学习者试图基于有限的数据子集学习目标变量的表示,在我们的例子中,只有一个变量。那么由弱学习者产生的预测可以被用作输入来训练更健壮的模型。这种技术用于集合模型,如随机森林和梯度增强树。从贝叶斯的角度来看,使用弱学习者来训练模型可以表示如下:
让我给你解一下这个等式。在我们的数据集中,我们有 M 个分类变量,这意味着我们为分类变量 m 的每个唯一值 v 训练 M 个弱学习器。在给定目标值的情况下,我们学习参数 θ 的后验分布 p_mv ,而不是取*均值。一般来说, θ 是一个矢量。类似于贝叶斯目标编码器,我们可以取几个一阶矩,或者通常将任何函数 f() 应用于后验分布的参数。注意,我们还没有得到参数的期望值!我们使用这些函数的输出作为输入(以及不需要编码的数值变量 ξ )来训练模型 y_θ ,然后只取后验分布的期望值。与贝叶斯目标编码器相比,这是采样贝叶斯编码器的主要贡献,在贝叶斯目标编码器中,在应用函数 f()之前过早地获取期望。这有助于减少目标泄漏和避免过度拟合。
为了计算期望值,我们可以从后验分布中生成一个样本。因为我们使用共轭先验,这很容易。一旦我们生成了一个样本,我们就可以像这样在上面的等式中估计期望值:
K 是样本大小,或者我们从后验分布生成的参数集的数量。这种方法类似于统计学中的多重插补方法。它对计算的要求也更高,尤其是对于更大的 K 。这篇论文的代码以及所有实验与其他方法的比较可以在 github 报告中找到。
贝叶斯目标编码技术是对标准目标编码的改进,因为它试图从目标变量的类内分布中提取信息,而目标编码忽略了这一点。该方法在 Kaggle 竞赛中证明非常有用,并在 WeWork 上建立了一个模型,该模型处理具有高基数分类变量的数据[5]。采样贝叶斯编码器[6]提供了贝叶斯目标编码的新视角,并为分类特征编码领域的研究和工程提供了更多机会。
[1]邓森,大卫&兴,传化。(2012).多元分类数据的非参数 Bayes 建模。美国统计协会杂志。104.1042–1051.2009.tm08439。
[2]丹尼尔·米西-巴雷卡。(2001).分类和预测问题中高基数分类属性的预处理方案..SIGKDD 探索。3.27–32.10.1145/507533.507538.
[3]麦金尼斯,威廉&肖,查普曼& S,安德烈&黄,韩宇。(2018).分类编码器:一个 scikit-learn-contrib 转换器包,用于对分类数据进行编码。开源软件杂志。3.501.10.21105/乔斯 00501
[4]马特·基托,贝塔目标编码,https://mattmotoki.github.io/beta-target-encoding.html
[5]斯莱基,奥斯汀&萨拉斯,丹尼尔&斯坎罗特,约尼。(2019).用共轭贝叶斯模型为 WeWork 线索评分引擎编码分类变量。
[6]迈克尔拉里奥诺夫(2020)。贝叶斯目标编码中的采样技术。 arXiv:2006.01317
原文:https://towardsdatascience.com/target-encoding-for-multi-class-classification-c9a7bcb1a53?source=collection_archive---------12-----------------------
在 Unsplash 上由 Toa Heftiba 拍摄的照片
这篇文章是我的上一篇文章的延续,我的上一篇文章解释了目标编码实际上是如何工作的。文章通过理论和实例说明了二分类任务的编码方法,以及 类别编码器 库如何对多类目标给出不正确的结果。本文展示了当 category_encoders 的 TargetEncoder 失败时,给出了编码多类目标、背后的理论,并提供了正确的代码,以及一个示例。
看看这个数据。颜色是一个特征,目标是好的...目标。我们的目标是基于目标对颜色进行编码。
让我们在这上面做通常的目标编码。
嗯,这看起来不太对,是吗?所有颜色都被替换为 1。为什么?因为 TargetEncoder 采用每种颜色的所有目标值的*均值,而不是概率。
虽然 TargetEncoder 适用于二进制目标为 0 和 1 的情况,但它不适用于以下两种情况:
所以,怎么办!?
下面是 Daniele Micci-Barreca 的原始论文中介绍的针对多类目标的均值目标编码。
假设标签中有 n 个类。
理论上说,第一步是一次性编码你的标签。这给出了 n 个二进制列,每个列对应于目标的一个类。然而,只有 n-1 个二进制列是线性无关的。因此,这些列中的任何一列都可以删除。现在,使用每个二进制标签对每个分类特征使用通常的目标编码,一次一个。因此,对于一个分类特征,您得到 n-1 个目标编码特征。如果数据集中有 k 个分类要素,则总共会得到 k 倍(n-1)个要素。
我们用一个例子来理解。
我们继续前面的数据。
第一步:一键编码标签。
请注意,Target_1 列表示目标中是否存在 0。如果目标中有 0,则为 1,否则为 0。类似地,Target_2 列表示目标中是否存在 1。
步骤 2: 使用每个独热编码目标对颜色进行编码。
对于 0 类
对于 1 类
对于二班
第三步:如果除了颜色还有更多分类特征,对所有特征重复第一步和第二步。
完成了!
因此,数据集转换为:
注意,为了清楚起见,我对所有三个 Color_Target 列进行了编码。如果您知道 one-hot 编码,那么您知道可以删除其中一列而不会丢失任何信息。因此,这里我们可以安全地删除 Color_Target_3 列,而不会丢失任何信息。
你是来拿密码的,对吧!?
我在这里给出了一个函数,它将 pandas 数据帧的特征和 pandas 系列的目标标签作为输入。特征 df 可以具有数字和分类特征的混合。
在这篇文章中,我指出了 category_encoder 的 TargetEncoder 的问题。我解释了关于目标编码的原始论文对多类标签的看法。我通过一个例子解释了这一点,并为您提供了一个可在应用程序中即插即用的工作模块代码。
在 LinkedIn 上和我联系!
在 GitHub 上看看我的一些很酷的项目!
原文:https://towardsdatascience.com/targeted-color-reassignment-tcr-3adce8b9ab0f?source=collection_archive---------34-----------------------
W hat 最初是一篇解释 K-Means 和理解如何使用“肘图”来选择 K-Means 中的聚类数的文章,后来转变为一个很好的例子,说明如何在图像处理领域使用数据科学中相当简单的概念 Kmeans 来解决图像中对象的相对复杂的目标颜色重新分配(TCR)问题。
我将广泛使用以下术语来解释 TCR 的过程。
单目标图像(SOI): 图像只包含一个目标。
多对象图像(MOI): 其中图像包含多个对象。
图 a:理解单个图像对象(左)和多对象图像(右)
我们正在努力实现的一个例子如下所示(图 b)。我们将拍摄 SOI 和 MOI 类别的输入图像,并尝试改变图像中出现的对象的颜色。例如,让我们看看图 b,我们把一件拉夫·劳伦的翻领套头衫的颜色从原来的棕色色改为我们选择的任何颜色,在这个例子中是蓝色。
图 b:文章的目标。棕色输入跳线(左)和蓝色输出跳线
这个项目有两个主要目标,第一是在单个对象图像(SOI)中重新分配一个对象的颜色,第二是在不改变其他对象的情况下,在多对象图像(MOI)中的目标对象中实现相同的颜色重新分配。回到毛衣的例子,我们的目标是改变毛衣的颜色,当只有毛衣出现在图像中时(SOI)以及当它被人装饰时(MOI)。
我们首先从加载图像开始,我们加载以下三个图像,一个蓝色衬衫的单对象图像和两个多对象图像,其中蓝色衬衫由一个人穿着。
阅读图像
图 c:蓝色衬衫的 SOI(最左边)和模特穿的蓝色衬衫的 MOI(中间和最右边)
在项目的这一部分,我们将只研究 soi 图 c(最左边)。我们将首先把输入图像从 RGB 空间转换到 HSV 空间,使我们更容易处理图像中的颜色。我将很快发布一篇博客,解释为什么在 HSV 空间工作对我们来说使用颜色更容易,敬请关注。我们现在需要查看输入图像中的颜色,让我们了解 SOI 中物体的颜色和背景的颜色,也就是我们需要查看图像的调色板。为了得到调色板,我们使用 OpenCV 包中的 Kmeans 算法对图像中的所有像素进行聚类。这将图像中具有相似颜色的所有像素分组到 K 个簇中,从而识别图像中 K 个最显著的颜色。
对于我们拍摄的输入图像,我们可以将 K 设置为 2,并将图像中的所有像素分组为两个集群,这两个集群代表两种最突出的颜色,在我们的情况下,它将是背景的颜色(白色)和对象的颜色(蓝色阴影),如下所示(图 d)。
图 d 物体输入单个物体图像的调色板
图 e K 均值的输入(左)。K 均值、TCR 滤波器的输出(右)
一旦我们对图像进行了聚类并获得了如上所述的聚类细节,我们可以看到质心为[104,227,122]的聚类 A 映射到目标对象像素,蓝色阴影,质心为[0,0,250]的聚类 B 映射到背景像素,白色阴影。我们现在构建一个 TCR 过滤器,它将帮助我们对图像中的选择性像素应用函数或操作。在输入图像的像素上外推的 K 均值算法的输出产生 TCR 滤波器(图 e 右侧)。TRC 过滤器现在使我们能够独立地改变一个簇中的所有像素。
****重新分配,假设我们已经成功分割了图像中的对象(集群 A ),我们现在可以使用 TCR 滤镜将这些像素重新分配给我们选择的任何颜色。TCR 过滤器使我们能够改变聚类 A 的像素,保持聚类 B 的像素不变,我们现在可以将 delta 值添加到聚类 A 的像素的色调,对象像素将其颜色从蓝色阴影变为红色阴影,同时保持背景不变。在这里,我把原来的蓝色衬衫变成了红色衬衫,如下图所示。
图 f:原始输入图像,蓝色衬衫(左)。TCR 输出,颜色重新分配的图像,红色衬衫(右)
单目标图像中的目标颜色重分配
既然我们已经在单物体图像(SOI)中实现了 TCR,我们现在将继续改变多物体图像(MOI)中物体的颜色。我们读取第二个输入图像,即 MOI(图 g 最左边),并将其转换到类似于 SOI 图像的 HSV 空间。
由于新输入图像(MOI)中的对象像素将位于来自 SOI 的对象群集的质心附*,因此我们使用在 SOI 中检测到的同一对象的群集来帮助识别目标对象像素,并为新输入 MOI 构建新 TCR 滤波器。例如,当我们绘制新输入 MOI(图 g 最左边)的 HSV 值时,蓝色衬衫的色调为红色,饱和度为黄色,值为黑色,如图 g(最右边)所示,我们清楚地观察到色调值峰值在大约 10 和 100** 处。图中 H=100 附*的尖峰靠* SOI 聚类的聚类 A [104,227,122]的质心色调,并代表 MOI 中的对象。我们可以从下面的 HSV 图(图 g 中间)中看到,X 轴上绘制的是色调,Y 轴上绘制的是饱和度,接* 100 的色调映射到蓝色阴影,这是我们输入的衬衫的颜色。**
图 g 多物体输入图像(最左边)。HSV 标度(中间)。HSV 图H:红色,S:黄色,V:黑色
MOI 中目标对象的新 TCR 过滤器是通过选择色调在从对象的 SOI 导出的群集质心的绑定距离内的像素来构建的。新的 TCR 过滤器允许我们更改或编辑属于目标对象的像素,而不会影响其他对象的像素。我们现在可以移动色调比例(图 g 中)来改变目标对象的颜色。对于蓝衬衫的输入多对象图像(图 H 中),我们选择的色调值与从蓝衬衫的 SOI 的 TCR 导出的簇 A 的质心(H=104)的色调处于绑定距离内。这将选择目标对象像素,在本例中为图像中的蓝色衬衫,并为 MOI 生成新的唯一 TCR 过滤器(图 h 最左边)。我们现在可以使用新的 TCR 滤镜给这些像素添加一个 delta 值来改变它们的色调。给色调增加 70 的增量会导致衬衫的颜色从蓝色变为红色。图 1 表示输入蓝色衬衫的颜色重新分配,不同的δ值导致不同的颜色偏移。****
****
图 MOI 的 TCR 滤波器(最左边)。原始输入图像蓝色衬衫(中间)TCR 输出,颜色重新分配的输出图像,红色衬衫(最右边)
图一:不同 delta 值的输出
多目标图像中的颜色重新分配
以下是我对其他不同风格和质地的服装进行的一些探索性试验。
****
图 j:探索性产出
这个可以用在哪里?首先,任何服装公司都希望以一种自动化的方式在他们的产品上探索更多的颜色选择。任何想省钱省时的企业(可能是初创企业)都可以雇佣模特来尝试他们为同一件物品提供的所有颜色选项。试衣间外的智能镜子的概念,顾客到试衣间后,喜欢上一件衣服就去试穿,然后站在智能镜子前,用户可以即时改变衣服的颜色并尝试实体店或网上商店可能没有的多种选择。****
为什么是服装?由于我是一名时尚相关零售行业的客户分析师,所以我从服装产品和其他时尚相关产品开始了这个项目。话虽如此,但这种算法可以用于任何其他项目或任何其他行业。例如汽车工业,我们可以同样容易地改变汽车的颜色,如下所示。
****
图 1:我会让你试着分辨出哪一个是原版,哪一个是数字再分配的输出
当在 HSV 空间中存在多个在色调标度中彼此非常接*的对象时,该算法努力识别 moi 中的可区分段。例如,当一个人穿的衣服颜色非常接*他的肤色。由于我们执行的是基于颜色的分割,因此当背景的色调值接*目标对象的色调值时,该算法也会遇到困难。****
这项工作还有很多工作要做,自动选择绑定值的范围,以便在 MOI 中选择对象。使用机器学习算法将 TCR 应用于借助对象检测算法检测到的特定对象。可以探索替代方法,如特征映射将对象从 SOI 映射到 MOI,伴随有凝聚聚类来构建用于 MOI 的 TCR 过滤器。
OpenCV 中的颜色空间:https://www . learnopencv . com/color-Spaces-in-OpenCV-CPP-python/
原文:https://towardsdatascience.com/targeted-estimation-of-heterogeneous-treatment-effect-in-observational-survival-analysis-e61c701c1316?source=collection_archive---------67-----------------------
在医学研究中,我们希望使用经验证据来估计治疗的效果:如药物或程序。评价治疗效果的黄金标准是随机对照试验(RCT ),因为它的随机性最大限度地减少了偏倚,最大限度地提高了我们识别因果关系的能力。然而,很明显,不可能依靠随机对照试验获得医学干预有效性所需的所有信息,因为它们并不代表真实世界的人群或环境,而且往往时间太短,无法检测长期效果。此外,RCT 旨在估计干预的*均效果,因此可能无法为临床实践中遇到的个别患者的决策提供信息。
最*,我提出了一个 框架 ,使用来自电子健康记录(EHR)的右删失观察数据,使用数据估计二元治疗方案(治疗与对照)对事件发生时间(存活)结果的异质性治疗效果(HTE)。这些估计说明了随访的损失,并允许测量干预的长期效果。
【https://github.com/EliotZhu/Targeted-Survival】代码可在:
****描述异质效应评估框架的图表。朱杰在生物医学信息学杂志上的图
第一步。估计个体治疗效果。
通过拟合治疗样本和对照样本的结果模型来评估个体治疗效果;然后,我们使用这些模型计算潜在的结果。这种双模型方法对治疗和对照结果的不同相关解释变量进行了编码,并已被证明可以提高潜在结果估计的准确性。
我们首先将原始的生存数据转换成一个计数过程:一段时间内的二元结果序列。然后,我们使用超级学习器来估计每个时间 t 的每个观察值 i 的条件风险率:其中是 i 的观察事件时间。然后通过概率链规则 t 推导出潜在的生存概率,从而得到 i 在时间 t 的初始治疗效果估计。
第二步。识别导致治疗效果不均匀的特征。
给定估计的 ITE,我们试图确定哪些特征有助于治疗效果的异质性。我们使用机器学习算法对 ITE 进行建模,并将重要特征定义为对减少模型预测误差贡献最大的特征。这里采用的回归方法有:贝叶斯加性回归树(BART)、自适应套索(AL)、弹性网(EN)和因果森林(CF)。先前的研究发现,与标准套索相比,AL 和 EN 给出了一致的协变量选择。或者,我们可以选择在相似倾向得分的阶层中模拟 ITE。然而,由于最*的工作表明倾向评分匹配(PSM)可能会导致观察性研究中协变量不*衡的增加,所以没有选择这种方法。
特征识别程序如下:
2.计算每个特征的可变重要性(VI)分数 S,
其中 D 是特征的数量。如果我们选择使用 CF,VI 分数对应于拆分的比例。在 BART 中,它对应于分裂比例的后验均值。在 AL 和 EN 中,它是正则化权重;
4.根据它们的总体重要性分数以降序排列特征,并将等级 R 分配给每个 X;
5.使用有序对(S,R)构建重要性分数曲线;
6.使用 Kneedle 算法识别拐点[ 1 ],将总体重要性分数高于拐点的特征标注为对异质效果有显著贡献。
第三步。CATE 的目标估计。
基于核的局部*均用于计算与由先前选择的特征定义的参考类相关联的 CATE。假设 x 是一个选定的特征,我们可以根据 x 的值将人群分为 Q 个阶层,然后对于每个阶层 q ,我们使用一步 TMLE 调整计算其边际条件*均治疗效果(MCATE)。
第一张图描述了在不同事件发生率下使用模拟的真实和估计的个体治疗效果:
真实 ITE 的分布(蓝绿色小提琴图)和超级学习者的估计效果(红色小提琴图)。纵轴显示事件发生率和估计的 NRMSE。横轴表示 ITE 的值。蓝绿色和红色十字标记表示真实的和估计的*均治疗效果。我们在样本大小(N=3000)、低混杂水*和特征维度(D=10)的默认设置下,从 50 个模拟中的一个模拟中描绘了时间 2、6 和 12 的 ite。缩写:ITE:个体治疗效果,NRMSE:标准化均方根误差。朱杰在生物医学信息学杂志上的图
第二张图描述了 CATE 估计值的偏差:
默认设置下 CATE 估计的绝对百分比偏差。对于每种情况,通过对 50 次重复的绝对百分比偏差进行*均来进行计算。朱杰在生物医学信息学杂志上的图
我们提出的框架的一个优点是,它根据治疗和对照条件下的存活概率的差异来报告效应的异质性。与相对指标(如风险比)相比,这种绝对指标为临床决策提供了更多信息。第二,我们为潜在结果建模、重要协变量识别和选择偏差调整提供了选择用户指定方法的灵活性。第三,我们自动化异质性发现过程,以避免特别选择子群。第四,对确定的亚组进行选择偏倚调整,以反映所选亚组内的治疗和筛选机制。
原文:https://towardsdatascience.com/targeting-and-removing-bad-training-data-8ccdac5e7cc3?source=collection_archive---------9-----------------------
照片由科尔·凯斯特从 Unsplash 拍摄。
在第 1 部分:建立一个图像数据库中,我们已经在网上搜集了关于植物及其对宠物的毒性的信息,对照第二个数据库交叉引用了这些字段,然后最终通过 Google Images 下载了每个类别的独特图像。
在第 2 部分:利用受控随机性进行训练中,我们使用新的 fast.ai 框架训练神经网络,以基于图片识别植物的种类。我们实现了一种在 NumPy、PyTorch 和 random 包中播种随机性的方法,以及在单独的训练运行中将图像标记为训练或验证样本的灵活方法。这有助于我们更公*地比较改变分类器其他方面的影响。
因为我们发现,我们的许多图像对我们的分类器的准确性有不利影响,因为我们的谷歌图像搜索结果的相关性越来越小,出现了像图画、图表和事实表这样的东西。这些将坏的训练样本放入我们的池中,使我们的模型在做我们想要它做的事情方面更差(根据自然照片对植物进行分类。)我们希望删除这些文件,但是手动检查 500 多个文件夹中的 150 个文件是一项非常艰巨的任务。用代码自动完成这项任务或者集中于最后的手工清理是一种更明智的做法。
此处的主要目标将是检查我们如何能够尝试专门针对不利于训练的图像(例如,错误标记或类的坏例子)。)并测量它们的去除对整体训练准确度的影响。
所有相关代码都可以在我的 Github repo 中找到。
fast.ai 内置了一系列有用的解释方法,用于分类问题,例如我们正在处理的问题。为了使用它们,我们首先重新创建一个学习者,并在使用准备解释类之前加载我们想要查看的保存状态。
这里我们使用一个在第 2 部分:可控随机性训练中创建和训练的学习器,它接受整个数据集,每个类 150 张图像。
准备口译。
fast.ai 为我们提供了一种简单的方法,现在可以用生成混淆矩阵,或者用查看最常相互混淆的类。然而,有这么多的类(这里我们有超过 500 个类),由于 RAM 的限制,我们会使试图生成如此密集的混淆矩阵的内核崩溃。幸运的是,fast.ai 有一个有用的功能,可以向我们展示一些最让模型吃惊的图像(导致最大的损失)。
plot_top_losses 向我们展示了学习者最自信的错误。从谷歌图片中抓取这些图片,大多数时候是因为图片标签不正确。
我们可以看到,这些图像标签中有许多是不正确的,这表明数据集的一个主要问题是图像的错误标签。详细说明每个类别的 F1 分数的分类报告可以帮助我们识别模型正在努力解决的类别。
使用将打印出分类报告。为了操作数据,我们应该用 Jupyter 的魔法命令拦截它,并将输入读回到数据帧中进行解释。
捕获分类报告的输出。
将捕获的输出分配给一个变量,并解析成一个数据帧。
有了这个数据框,我们可以一目了然地看到哪个班级的问题最多,并且可以更仔细地查看其文件夹中的图像。
按 F1 分数排序的班级。
绘制 F1 分数如何变化的图表也可以让我们了解这个问题的规模。
500 多个级别中每个级别的 F1 分数差异。
8 个最低得分等级的 F1 得分变化。
有趣的是,大约 8 个班级的 F1 分数急剧下降。让我们快速查看一个图像文件夹,以评估在训练分类器时哪些类型的图像可能会导致这些问题。
Peperomia peltifolia 班级的最后 60 幅图像样本,该班级是 F1 分数最差的班级之一。
来自 Iris domestica 班级(F1 分数最高的班级)的最后 60 幅图像的样本。
本质上,我们寻找的是与我们想象的用户用来识别特定植物的图像类型有显著差异的图像。在 Peperomia peltifolia 文件夹中的图像中散布着许多带有人工成分的图像(文本和/或图纸)以及许多分类错误或不相关的图像(科学图纸、种子样本)。这是由于谷歌图片搜索结果的相关性下降,因为越来越多的图片是从一个单一的查询中收集的。自然拥有更多可用搜索结果的类别较少受到这种趋势的影响(见 Iris domestica 图片)。
基于这一调查,我们可以得出两点结论:
让我们首先尝试用一些自动化过程来解决第二个问题。
第一步过滤将使用光学字符识别(OCR)来尝试在我们的每个文档中查找文本。考虑到最有可能出现的文本与图像所呈现的植物名称有关,文本可能会出现某种形式的数据泄漏。除此之外,在我们想象的用例中(从自然图片中识别植物),文本不太可能出现在任何图像中。
Tesseract 是 OCR 可用的开源软件,易于实现。在这里,我们使用它们的功能来检查用枕头打开后的图像。因为我们稍后需要查看整个图像文件夹,所以我们添加了一个简单的子句,告诉函数在返回找到的文本(如果有的话)之前,是否需要使用 Pillow 来打开图像。
在配置 Tesseract 时,PSM 会参考页面分割模式,该模式会影响 Tesseract 如何将图像分割成文本和文字行。我们在这里使用全自动分段(- psm 3)和默认的 OCR 引擎模式(- oem 3)。
由于许多图像沿框架的顶部或底部边缘包含一些文本,我们希望能够裁剪图像并重新检查文本是否仍然存在,从而使我们能够保留尽可能多的图像。如果失败,我们将简单地从数据集中删除图像(从而删除坏的训练示例)。
按图像总大小的给定百分比裁剪图像的顶部和底部。
现在,我们将和函数合并成一个函数,我们可以用它来遍历一个图像文件夹来搜索文本,并有选择地尝试裁剪(这里是 10%)图像的顶部和底部,看看这是否会删除文本,如果成功,则替换图像。因此,我们可以直接编辑和保留任何图像,只需少量的裁剪就可以轻松修复。
使用 PyTesseract OCR 在 Peperomia Peltifolia 文件夹上找到的示例图像和相关文本。这些图像可以被过滤掉,以改善我们的分类器的结果。
在这一阶段,我们将 OCR 过程的结果保存到数据帧中,供以后检查和处理。这样做是因为虽然过滤器捕捉到的许多图像可以被过滤掉而没有太大的后果,但是由于树叶、树枝和/或空白的排列,有大量完全没有文本的图像呈现为假阳性。
真阳性、假阳性和可裁剪图像的例子。
不幸的是,使用 OCR 检查图像没有考虑到图像在其他方面是人工的,这导致我们分析色调分布。
每幅图像都由许多色调组成,这些色调可以在一系列色调和亮度之间变化。我们可以利用这一点来创建关于每个图像色调分布的量化指标,并尝试识别图像之间不利于训练分类器的任何共性。
首先,让我们来看看神经网络将如何“看到”我们的图像。我们可以用 PIL 展开一幅图像,并把它转换成张量。
这表明每个图像只是一个单一的张量,有三个通道——红色、蓝色和绿色,按此顺序存储。我们可以分离出一个通道,并通过将其转换为彩色数据帧来进一步观察:
沿着这一思路思考,我们可以识别出具有大块颜色且变化很小的图像,就像通常在具有人工创建的元素(如文本或图画)的图像中看到的那样。让我们通过获取图像中每个像素的色调和亮度(从转换到 HLS)并绘制 z 轴作为给定(色调和亮度)对中存在的像素总数来准备一些图像统计图。
从像素 HSL 值生成图像直方图的代码。
使用上面的函数,我们可以检查每张图像的色调分布,并沿着每张原始图像绘制出来。直方图显示了具有给定色调/亮度对的每个像素的数量。例如,在下图中,我们可以看到直方图中最密集的像素是较浅的绿色和黄色,这在真实图像中得到了很好的反映。
色调和亮度值均匀分布的自然照片。
总的来说,我们看到自然的照片在像素与像素之间的色调和亮度上会有细微的抖动,这些抖动被捕捉并编码到图像中。这导致色调-明度群体更加*坦且分布更加均匀,具有相对较大数量的色调-明度配对(大约 2 万到 3 万)。
即使在拥有人工增白背景的自然图像中,色调-明度群体也是均匀分布的。
尽管这些图像看起来主要是绿色,但自然照片中细微的颜色变化会阻止任何特定的颜色阴影代表太大比例的像素。在上面的图像中,1000 个最密集(最强烈)的色调-亮度配对代表不到 40%的图像,即使在具有人工增白背景的图像中也是如此。
另一方面,当用颜色填充一个区域时,具有计算机生成元素的图像特别挑选出色调-明度对,导致给定色调-明度对的人为高群体密度。此外,人工图像可能只包含 1000 个独特的色调-亮度配对,与自然图像中常见的 2 万到 3 万个相差甚远。
一个人工图像,即使有一个梯度,将拥有相当少的变化,色调和亮度。
绘画也一样,在色调和亮度上显示较少的变化。
函数还计算一些简单的度量,我们可以使用这些度量稍后将图像标记为人工的(用于检查和稍后的移除)。也就是说,我们计算存在的色调-明度配对的数量,取一些()最多的配对,并计算它们所代表的图像的比例。从上面可以看出,那些具有人工成分的图像将有较大比例的图像由相对较少的色调/亮度对组成。让我们利用这一特性将图像标记为具有人工颜色分布!
这里的关键参数是和。如果给定的数量()最密集的色调/亮度配对代表整个图像的超过的比例,我们将该图像标记为在由该函数返回的数据帧中具有人工颜色分布。基于我们数据集的经验实验,我们使用 1000 对和 70%的阈值来检测人工图像,但这些值将根据您正在处理的图像类型而变化。
现在我们有了一些有用的指标(文本的存在和色调分布),可以用来判断一幅图像是否是人工的。
结合 OCR 和色调分布分析来标记人工图像。
该功能旨在做两件事:
如果没有检测到文本:如果给定数量()最密集的色调/亮度配对代表整个图像的超过比例,即具有过浅的色调分布,则将图像标记为具有人为色调分布。这里我们用的是 =1000 对和一个 70% 。
如果检测到文本:如前所述,仅使用 OCR 来识别不良训练样本的主要问题是经常出现误报。为了过滤掉这些,我们使用函数来准备一个数据帧,该数据帧包含由所有图像的最密集的色调/亮度对所表示的像素比例(通过将设置为真)。然后我们运行并将结果内部连接到一个包含颜色比例数据的数据帧中。
内联输出的结果
这使我们能够根据颜色比例对这些图像进行阈值处理,与那些没有文本的图像处于不同的级别。直观上,与添加了文本的图像(通常具有单一字体颜色)相比,错误检测到文本的图像将具有明显更分散的色调分布。在经验实验之后,我们得出一个 50%的阈值水*,这个水*可以很好地从我们的函数中去除任何假阳性。然后,假设检测到文本,在图像被标记为人工之前,我们需要一个较低的 50%的。这允许自然图像逃脱标记,同时仍然捕获大多数具有文本的图像。这里使用的将决定我们在试图剔除误报时有多积极。
以下是(a)来自 OCR 的不再被过滤掉的假阳性,和(b)真阳性的例子,都来自于 Zephyranthes drummondii 图像的文件夹。
西风东渐的光学字符识别结果。(A)错误地检测到字母 T 的假阳性。(b)真正的阳性。
现在我们已经选择了图像标记的参数,我们可以遍历每个文件夹,找到人造图像并使用删除它们。
现在,我们可以使用本系列第 2 部分中准备的学习器将我们的新数据集与原始数据集进行比较:可控随机性训练。在使用导入并使用所讨论的代码创建学习器之后,我们可以比较训练的结果,同时保持来自训练/验证、图像增强和批处理的随机性不变。
使用不同数量的图像比较训练的准确性。
在这里,我们看到这里详细描述的自动图像清理过程已经从数据集中移除了 6000 多幅图像,将前 5 名的精度从 0.809 提高到 0.819。这表明我们确实(大体上)移除了作为每个类的差训练样本的图像。但是,结果仍然比简单地使用数据集中的前 50 或 100 幅图像要差!
检查 F1 分数在所有班级的分布揭示了一些有趣的事情。虽然 F1 分数总体上有所提高,但 F1 分数最低的班级实际上表现不如以前。
比较所有班级 F1 分数的变化。
在自动清理不良训练示例后 F1 分数最低的类。请注意,Peperomia peltifolia 的 F1 得分已经下降到 0,而它以前是 0.06。
让我们仔细看看 Peperomia peltifolia 文件夹,弄清楚到底是怎么回事。
自动清理后 Peperomia peltifolia 类的最后 55 幅图像的样本。大多数人工/差的图像已经被自动去除,而许多错误分类的图像仍然存在。
看起来清理过程进行得相对较好,大多数图像是人为的/不良的训练样本,已经从文件夹中删除。然而,该过程不能识别和移除任何错误分类的图像。这导致该类别的 F1 分数总体降低,因为被移除的图像实际上具有许多相似性,而许多剩余的图像被错误分类并且具有很少或没有相似性。
在这一点上,提高我们的准确性的最好方法是通过一点点手动清理来专注于移除这些错误分类的图像。
我们不想为了删除分类错误的图片而查看每个文件夹。解决这个问题的更有效的方法是将我们的努力集中在问题最多的班级上。正如我们在这篇文章的第一部分所探讨的那样(用 fast.ai 进行分类解释),我们可以通过查看总体最高损失以及 F1 分数最低的类别来做到这一点。通过打开这些文件夹并删除我们认为是错误分类或较差训练样本的图像,我们可以快速提高分类器的性能。
我已经使用这种方法执行了许多手动清理步骤,然后每次都将这些数据集输入到相同的训练过程中,以查看我们的分类器如何改进。
经过几个手动清洗步骤后,分类准确度有所提高。
正如我们所看到的,每次我们删除几百张图像时,我们的分类器的性能都会显著提高,尽管每次只删除总数据集的 0.5%左右。
经过多轮手动图像清理后 F1 分数的最终分布。
检查 F1 分数的分布表明,F1 分数总体上有所提高,同样,分布末端的几个班级除外。
然而,一些班级的 F1 分数仍然很低。
这些分类是最难分类的,因为它们通常指的是更高的分类(龙血树对香龙血树)或非常具体的物种(盾叶胡椒树对胡椒树)。我们可以寻求改善这些类的性能的一种方法是出去专门为每个类收集高质量的训练图像,以使网络更容易区分相似的物种。目前,这不会影响我们对给定植物物种的毒性进行分类的目标,所以我们现在不会太担心它。
太好了!我们使用基线架构(ResNet34)通过自动(使用 OCR 和色调分布分析)和指导手动方式清理数据集,改善了训练结果。
接下来,我们将使用这个精炼的数据集,并基于我们在第 2 部分:受控随机性训练中创建的学习者。请尽快加入我的第 4 部分:探索 fast.ai 中的卷积神经网络架构,我们将比较网络架构变化的原因、方式和影响。
原文:https://towardsdatascience.com/tarot-cards-crystal-balls-and-fortune-tellers-c997c2e32c3a?source=collection_archive---------65-----------------------
资料来源:FAVPNG
如果你到目前为止一直在关注这个系列(第一部分和第二部分),你应该了解衡量生命价值的重要性,你甚至可能已经尝试过为自己的企业计算 RFM 分数。现在,您已经为 LTV 之旅的下一阶段做好了准备:构建预测模型。然而,在你进入本质之前,记住“大的闪亮的东西”的问题。当考虑构建一个更复杂的模型时,重要的是确定并同意您可以使用该模型采取的关键行动,每个行动都应该对核心业务 KPI 产生影响。模型/报告不是项目的输出,而只是达到目的的一种手段。
让我们假设你已经完成了基本的 RFM 分割,并且发现这个模型有点限制性。例如,您会注意到购买超过五次的客户更有可能再次购买,但购买少于五件商品的客户永远不会再次购买,并且该模型没有考虑这些细微差别。在这种情况下,你可能需要寻找你友好的邻居数据伙伴,这样你就可以找到一种方法来获得对未来支出的更准确预测。
我们上周讨论的 RFM 模型是历史模型的一个例子。它假设如果某人在过去有很高的*期价值、频率和货币价值,他们在未来也会有很高的价值,这在很多情况下是一个很好的代理。但是,wt 为什么不具体建模 R、F、M 如何影响客户价值?这就是预测模型发挥作用的地方。为了开发这些模型,我们查看了客户行为的历史数据,并对*期、频率和货币价值如何影响该期间的总体客户支出进行了建模,并使用这些数据来预测未来的终身价值。与构建宽泛的 R、F 和 M 桶相比,这提供了对未来客户价值的更准确理解,因为它考虑了特定的业务细微差别。
为了建立这个模型,我们从生存曲线开始。这种类型的曲线在历史上被用于生物学,预测病毒随时间存活的可能性,但我们将使用它来了解客户在一段时间内与您的企业保持联系的可能性。下面的曲线是单个客户的生存曲线示例,y 轴代表客户“活着”的可能性,垂直线代表客户购买。当顾客进行购买时,他们活着的可能性增加到 100%,然后随着时间的推移而减少,直到他们进行另一次购买;请注意,随着每次额外购买,这种可能性以较慢的速度下降(梯度不太陡),因为假设他们的忠诚度在增加。
图 6:生存曲线
为了建立这个模型,我们还需要建立一个“负二项分布”曲线模型(NBD ),以预测客户可能的购买数量。当我们将预期购买量乘以*均订单价值的估计值时,我们得到了 LTV:我们预测客户在给定时间段内将花费的金额。一旦你有了 LTV,你就可以画出这条美丽的曲线,这一定会给你的团队留下深刻印象。它告诉我们,20%的客户创造了 70%的未来收入。再一次,我们必须记得问:从这种洞察力中我们能采取什么行动?
图 7:显示客户和 LTV 分布的 LTV 曲线
使用您的奇特模型,您现在有了一组新的数据点:预期购买量、预期订单价值以及最重要的预测 LTV。该模型还将输出另一个称为 P(Alive)的指标,显示客户流失的概率。您可以采取的措施与上一篇文章中提到的措施相同:将数据分段!然而,现在您可以有一个更准确的数据集来用于您的细分:例如,您可以创建一个消费超过 200 美元的高 LTV 客户群。或者,您可以使用 P(存活)指标来划分“高风险客户”,即具有中高 LTV 和高 P(存活)的客户。在整个过程中,将这些行动放在首位,因为模型不会推动结果,但数据驱动的行动会!
最后一个想法真的让橡胶上路了…
假设您知道客户的 LTV,但现在您想更多地了解不同的客户。他们年纪大还是小?男的还是女的?他们第一次购买时是买电子产品还是化妆品?根据这些见解,你可能会采取什么行动?想象一下,你知道购买电子产品的客户可能是高价值客户。你可以瞄准电子网站,花更多的钱为电子产品做广告。,知道这些客户从长远来看很可能会花更多的钱。
这就是您的数据合作伙伴再次发挥作用的地方。他们将以符合隐私的方式聚合所有数据,一边是功能,另一边是终身价值。例如,我们知道,一个 25 岁的男性第一次买了一个胡须修剪器,他的 LTV 很高。但是一个 55 岁的女性购买化妆品的 LTV 值很低。然后,他们将建立一个模型,找出每个特征和 LTV 之间的关系,以回答一个非常重要的问题:什么类型的客户可能有更高的 LTV?然后,我们可以个性化和锁定新客户,这些客户可能对您的业务有更高的长期价值。
您甚至可以使用这些数据来预测新客户的终身价值。如果一个 25 岁的男性访问你的网站并购买了一个胡须修剪器,你应该根据当前有类似行为的顾客的行为,了解他们在一段时间内会花多少钱。因此,在这个旅程的最后阶段,我们可以预测客户收购后的 LTV。然而,我们经常受到在销售点收集的数据的限制,因此这样的模型可能没有足够高的准确性来使用。我们已经在收集更多数据的行业中成功地使用了这种类型的模型,比如银行业。在这个特定的用例中,我们可以根据用户的第一笔投资(他们设立了什么类型的账户)来预测他们一生中会投资多少?是什么类型的投资?他们投资了哪些产品?他们还使用了其他什么投资选择?)
希望这些例子告诉你,LTV 不是一个时髦词,而是一种新的思维方式。通过这个系列,我们展示了一些使用基于细分的 LTV 模型的简单方法:利用对历史客户行为的详细了解来预测未来的行为,并对您的客户进行细分。然后,您可以根据客户群采取适当的行动,为您的公司带来长期结果。
请在评论中分享一些反馈:你是如何使用预测 LTV 模式的?你学到了什么?
原文:https://towardsdatascience.com/task-cheatsheet-for-almost-every-machine-learning-project-d0946861c6d0?source=collection_archive---------1-----------------------
当我在为你们所有人创建一系列有价值的项目时,我想到了记录我从某人那里学到的或者在工作中开发的实践。
在这篇博客中,我记录了我在进行端到端 ML 项目时一直参考的任务清单。
为什么我需要一份清单?
因为你需要处理项目中的许多元素(争论、准备、问题、模型、微调等)。),很容易忘记事情。
它会引导您完成接下来的步骤,并督促您检查每个任务是否都已成功执行。
有时,我们很难找到起点,清单帮助你从正确的来源获得正确的信息(数据),以便建立关系和发现相关的见解。
让项目的每个部分都经历一个检查范例是一个最佳实践。
正如阿图尔·加万德在他的书《清单宣言》中所说,
我们所知的数量和复杂性已经超出了我们个人正确、安全或可靠地提供其益处的能力。
所以,让我带你浏览一下这份简明扼要的行动清单,它将减少你的工作量,提高你的产出…
这些是你在几乎每个 ML 项目中必须执行的 8-10 个步骤。一些步骤可以按顺序交替执行。
这是为了理解和阐明问题的业务逻辑。它应该告诉你:
在大多数情况下,如果您有数据,并且想要定义围绕它的问题以更好地利用传入的数据,则可以在第一步之前执行这一步。
根据您的问题的定义,您需要确定数据的来源,可以是数据库、数据仓库、传感器等。对于要在生产中部署的应用程序,这一步应该通过开发数据管道来保持传入数据流入系统,从而实现自动化。
在这一步,你要研究影响你的结果/预测/目标的所有特征。如果您有大量的数据,那么在这一步中对其进行采样,以使分析更易于管理。
要遵循的步骤:
是时候通过定义数据转换、清理、特征选择/工程和缩放的函数来执行上一步的发现了。
创建一个非常基本的模型,作为所有其他复杂机器学习模型的基线。步骤清单:
这需要成为你接*最终解决方案的关键步骤之一。主要步骤应包括:
交流的过程是多方面的。你需要记住所有现有的和潜在的利益相关者。因此,主要步骤包括:
如果您的项目需要在实时数据上测试部署,您应该创建一个 web 应用程序或 REST API,以便在所有*台(web、android、iOS)上使用。主要步骤(因项目而异)包括:
注意:清单可以根据项目的复杂程度进行调整。
通过这个渠道,我计划推出几个覆盖整个数据科学领域的系列。以下是你应该订阅频道的原因:
原文:https://towardsdatascience.com/teaching-a-computer-how-to-play-snake-with-q-learning-93d0a316ddc0?source=collection_archive---------23-----------------------
在 Unsplash 上由 Franck V. 拍摄的照片
我最*看了《T4》AlphaGo——电影,这是一部关于 DeepMind 的 alpha go 的纪录片。AlphaGo 是一个玩围棋的人工智能,纪录片详细描述了它与 Lee Sedol 比赛前的故事。当 IBM 的“深蓝”在 1997 年击败国际象棋大师加里·卡斯帕罗夫时,全世界的围棋选手都认为这在围棋上是不可能的。20 年后,谷歌的人工智能击败了世界上有史以来最好的围棋选手之一。据信,它采用的一些策略非常有创意,围棋专家正在研究这些策略。我发现这一切都很迷人。
虽然我无法构建这样的人工智能,但我想探索强化学习。我决定了贪吃蛇这个游戏(一个简单多了的游戏!)而且没用多长时间就得到一些相当不错的结果。我的代码通过 Github 完整共享。
质量学习,或 Q 学习,类似于训练一只狗。我们第一次把我的狗带回家时,它还是一只小狗。她不知道任何技巧。她不知道不要咬我们的鞋子。最重要的是,她没受过如厕训练。但是她喜欢零食。这给了我们一个激励她的方法。每次她按命令坐下或摇摇她的爪子,我们就给她一份礼物。如果她咬了我们的鞋子…嗯,真的没什么,她只是没有得到奖励。然而,随着时间的推移,当她需要出去上厕所时,她甚至学会了踩我们的脚。
Q-learning 是一种强化学习方法,它通过奖励良好行为和惩罚不良行为来教会学习代理如何执行任务。以蛇为例,靠*食物是有益的。离开屏幕是不好的。在游戏中的每一点,代理人都会选择预期报酬最高的行动。
一开始,蛇不知道如何吃食物,也不太“有目的”。它也倾向于以与现在相反的方向前进,然后立刻撞到尾巴而死去。但是代理学习如何玩游戏并不需要很长时间。不到 30 局就玩的相当不错了。
培训:
图片/GIF 作者
100 场比赛后:
图片/GIF 作者
让我们看看我们是如何到达那里的。
在这篇文章中,我们将更多地关注学习代理而不是游戏。也就是说,我们仍然需要一个游戏引擎。我发现 Edureka 的这个教程以 Snake 为例,很好地介绍了 Pygame。我对代码做了一些小的修改,使它能够与学习代理交互,它已经准备好了。谢谢 Edureka!
我们需要一种方法来定义当前的游戏状态。我们想用一种方式来定义它,我们可以代表游戏的所有可能的状态,或者至少是游戏的关键部分。我将我的状态定义为以下各项的组合:
这让我们对博弈做了一点概括,博弈的状态空间相当小。
作者图片
因为蛇的左边有直接的危险,而食物在蛇的上方和右边,所以所有 3 个场景都由相同的状态表示。
我们使用贝尔曼方程来计算一个行动的总期望回报,并将信息存储在一个 Q 表中。
在时间 t ,我们有以下状态和动作:
在这种状态下,我们对该行为的回报可以表示为:
当我们采取一个行动时,我们转换到下一个状态,在那里我们可以选择另一个行动来获得另一个奖励。除了眼前的奖励,我们还想向前看,看看未来是否会有更大的奖励。这对于像国际象棋这样的游戏来说尤其重要,因为代理人必须提前考虑好几个步骤。然后我们可以说在时间 t 的总期望回报是:
然后我们引入了不耐烦的概念——现在的奖励比以后的奖励好。也就是说,我们降低了未来的回报。折扣系数是一个介于 0 和 1 之间的数字。这个因素越大,我们给予未来奖励的权重就越大。
和简化,我们得到:
在代理人玩第一个游戏之前,它不知道任何行动的预期回报是什么。所以我们从全零的 Q 表开始。当代理进行游戏时,它会观察每个动作 a 的奖励值,从而了解哪个 a 最适合每个状态 s 。
在每个给定的状态下,代理查看 Q 表,并采取具有最高预期回报的行动。这里的要点是,蛇应该如何行动没有预先定义的逻辑。完全是从数据中学习来的。
但是这里还有其他的东西——一种叫做ε贪婪 的技术。大多数时候,它遵循 Q 表。但如果有一条尚未探索的道路通向更高的回报呢?这是开发(基于我们目前所知的最佳选择)和探索(寻找潜在的更好选择)之间的权衡。在培训阶段,我们告诉代理偶尔随机选择一个动作。在这种情况下,10%的时间。我们称之为 10%ε。
每次移动后,我们将使用贝尔曼方程更新我们的 Q 表。如果蛇靠*了食物,或者吃了食物,它会得到一个肯定的奖励。如果蛇撞到了自己的尾巴或墙壁,或者已经远离食物,它将获得负奖励。请注意历史列表的反向列表,它允许很容易地计算贝尔曼方程。
我们还想知道分数是否随着时间的推移而增加,或者是否已经稳定下来。因此,我们在每场比赛后输出分数,并绘制滚动的 30 个分数。我们在 100 场比赛后禁用 epsilon,看看它的表现如何。
作者图片
我们看到分数不断增加,直到大约 150 场比赛时才趋于*稳。下一节将详细介绍这一点。
在我的 Q-Learning 实现中,我的代理永远不会玩一个完美的游戏。除了躲避眼前的危险,它总是向食物靠*。但是我们知道这并不总是有效的。
作者图片
在这种情况下,蛇应该向下移动,绕过它的尾巴。相反,它会向上移动并被卡住。我需要改变状态空间,以一种能捕捉到它并从中学习的方式。
我很惊讶 Q-Learning 的实现是如此简单,如此有效。但是正如我们在上面看到的,它显然有它的缺点。有更复杂的强化学习方法,可以更好地处理更复杂的游戏。不久的某一天,我希望能够建造一个会下棋的人工智能。
完整的代码可以在我的 Github 上的这里找到。如果你对我如何改进我的代码或学习代理有任何想法,请分享!
原文:https://towardsdatascience.com/teaching-ai-to-learn-how-humans-plan-efficiently-1d031c8727b?source=collection_archive---------32-----------------------
图片由艾萨克在 Unsplash 上拍摄
人类的计划是分等级的。无论是计划像做饭这样简单的事情,还是像出国旅行这样复杂的事情,我们通常都是从我们想要实现的目标的粗略构想开始(“去印度,然后回国”)。然后,这个草图被逐步细化为一系列详细的子目标(“预订机票”、“打包行李”)、子子目标等等,直到比最初计划复杂得多的身体运动的实际序列。
有效的计划需要了解抽象的高层概念,这些概念构成了层次计划的本质。然而,人类如何学习这些抽象概念仍然是个谜。
在这里,我们展示了人类自发形成如此高层次的概念的方式,这种方式允许他们在给定任务、奖励和环境结构的情况下有效地进行规划。我们还表明,这种行为与潜在计算的形式模型一致,从而将这些发现建立在已建立的计算原则基础上,并将它们与以前的分层规划研究联系起来。
分层规划的例子[6]
上图描述了一个分层规划的例子,即某人可能计划如何从他们在剑桥的办公室去印度巴特那购买一件梦幻婚纱。圆圈代表状态,箭头代表在状态之间转换的动作。每个状态代表较低层的一组状态。较粗的箭头表示较高级状态之间的转换,这通常是首先想到的。
当应用于计算智能代理时,分层规划可以实现具有高级规划能力的模型。通过为特定环境的结构假设一个生成过程,可以从贝叶斯观点对分层表示进行建模。关于这个问题的现有工作包括开发一种计算框架,用于在一组关于层级的简化假设下获取层级表示,即,模拟人们如何在他们对无奖励环境的心理表示中创建状态簇,以便于规划。
在这项工作中,我们贡献了一个层次发现的贝叶斯认知模型,该模型结合了聚类和奖励的知识来预测聚类的形成,并将该模型与从人类获得的数据进行比较。
我们分析了静态和动态奖励机制的情况,发现人类将关于奖励的信息归纳到高水*的集群中,并使用关于奖励的信息来创建集群,并且奖励归纳和基于奖励的集群形成可以通过我们提出的模型来预测。
心理学和神经科学结合的一个关键领域是对人类行为与指定行为的正式理解。我们问:
当人类代理面临完成某项任务时,他们所采用的计划和方法是什么?人类如何发现有用的抽象?
鉴于人类和动物适应新环境的独特能力,这一点尤其有趣。以前关于动物学习的文献表明,这种灵活性源于目标的分层表示,这种表示允许将复杂的任务分解为低级的子程序,这些子程序可以扩展到各种环境中。
分块 的过程发生在动作被缝合在一起成为时间上延伸的动作序列以实现遥远的目标的时候。组块通常是学习从目标导向系统转移到习惯系统的结果,习惯系统以刻板的方式执行动作。
从计算的角度来看,这种分层表示允许代理在开放循环中快速执行动作,每当遇到已知问题时重用熟悉的动作序列,通过调整已建立的动作序列来更快地学习,以解决以前看到的问题,并在更长的时间范围内进行规划。代理不需要关心与目标实现相关的微小任务,例如,去商店的目标被分解为离开家、步行和进入商店,而不是起床、向前移动左脚、然后移动右脚等。
代理人应该如何做出有益的决策是强化学习的主题。分层强化学习(HRL)已经成为代表分层学习和规划的主流框架。在对 HRL 建模的研究中,围绕模型构建的潜在方法提出了几种想法。
我们关注人们自发地将他们的环境组织成约束规划的状态集群。这种分层规划在时间和记忆上比天真的或扁*的规划更有效率,后者包括低层次的行动,与人们有限的工作记忆容量相一致【3】。
在下图中,粗节点和粗边表示为了计算计划,它们都必须被考虑并保存在短期内存中,灰色箭头表示集群成员。我们观察到,在低层图 G 中,计划如何从状态 s 到状态 g 至少需要与实际执行计划一样多的步骤(上图),引入高层图 H 缓解了这个问题,降低了计算成本(中图),扩展层次递归进一步减少了计划中涉及的时间和内存(下图)。
分层表示降低了规划的计算成本[6]
Solway 等人提供了最佳层次的正式定义,但他们没有说明大脑可能如何发现它[2]。我们假设一个最优的层次结构依赖于环境的结构,包括图形结构和环境的可观察特征的分布,特别是奖励。
我们假设代理用图来表示他们的环境,其中节点是环境中的状态,边是状态之间的转换。状态和转换可能是抽象的,也可能是具体的,就像地铁站和它们之间的火车线路一样。
我们将可观察环境表示为图 G = ( V , E ),将潜在层级表示为 H 。 G 和 H 都是未加权的无向图。 H 由集群组成,其中 G 中的每个低级节点恰好属于一个集群,并且 桥接 或高级边连接这些集群。只有在某些 v 、V’、 V 之间存在边,使得 v 、 k 和V’、k’之间存在桥,即V、k和、k’中的每个高级边
在下图中,颜色表示簇分配。规划时会考虑黑边,而规划者会忽略灰边。粗边对应于跨簇的过渡。群集 w 和 z 之间的转换通过一个桥来完成。
示例高级图表(上图)和低级图表(下图)[6]
在添加奖励之前,学习算法在给定以下约束的情况下发现最佳层级:
然而,我们不希望集群太小——在极端情况下,每个节点都是它自己的集群,这会使层次变得无用。此外,虽然我们希望集群之间的连接稀疏,但是我们希望维护集群之间的桥,以便保留底层图形的属性。
我们使用离散时间随机中国餐馆过程(CRP)作为聚类的先验。层次的发现可以通过反转生成模型来获得层次的后验概率 H 来完成。[6]中正式提出的生成模型会生成这样的层次结构。
在图 G 的上下文中,奖励可以被解释为顶点的可观察特征。因为人们经常根据可观察的特征进行聚类,所以对奖励诱导的聚类进行建模是合理的[5]。此外,我们假设每个州提供随机确定的奖励,并且代理的目标是最大化总奖励[8]。
因为我们假设集群会产生回报,所以我们将每个集群建模为具有*均回报。该群集中的每个节点具有从以*均群集回报为中心的分布中提取的*均回报。最后,每个观察到的奖励是从以该节点的*均奖励为中心的分布中抽取的。在[1]中提供了正式的讨论。
为了简化推论,我们先假设奖励是不变的, 静态 。我们将可以在具有固定概率的观察值之间变化的奖励标记为 动态 。
我们进行了两个实验来测试我们关于人类行为的假设,并了解我们的模型可以预测到的程度。特别是,我们研究了集群在多大程度上推动了关于奖励的推论,以及奖励在多大程度上推动了集群的形成。对于每个实验,我们收集人类数据,并将其与模型的预测进行比较。
第一个实验的目标是了解奖励如何在州集群中推广。我们测试了图形结构是否驱动集群的形成,以及人们是否将在一个节点观察到的奖励推广到该节点所属的集群。
该实验是通过要求 32 名人类受试者选择下一个要访问的节点来进行的,如以下场景中所指定的。参与者被随机呈现下图或其翻转版本,以确保不会引入利手或图形结构的偏见。我们预测参与者会选择与位于较大集群中的标记节点相邻的节点,即第一种情况下蓝色节点左侧的灰色节点,第二种情况下蓝色节点右侧的灰色节点。
向参与者展示了以下任务和相关图表:
您在一个由多个独立矿井和隧道组成的大型金矿中工作。矿井的布局如下图所示(每个圆圈代表一个矿井,每条线代表一个隧道)。你按日计酬,当天发现的每克黄金可获得 10 美元的报酬。你每天只挖一个矿,并记录当天矿产出的黄金数量(以克计)。在过去的几个月里,你已经发现,*均来说,每个矿每天生产大约 15 克黄金。昨天,你挖了下图中的蓝色矿,得到了 30 克黄金。今天你会挖两个阴影中的哪一个?请圈出您选择的矿山。
向与会者展示的地雷图[1]
我们希望大多数参与者能够自动识别以下聚类,用桃色和淡紫色的节点来表示不同的聚类,并根据这些聚类来决定选择哪个矿。假设参与者会选择桃红色的节点,而不是淡紫色的,因为标签为 30 的节点,比*均奖励大得多,在桃红色的群中。
向参与者展示的地雷图,显示了可能的集群[1]
我们使用 Metropolis-within-Gibbs 抽样[4]对 H 进行*似贝叶斯推断,该抽样通过从其后部抽样来更新 H 的每个分量,在单个 Metropolis-Hastings 步骤中以所有其他分量为条件。我们采用高斯随机游走作为连续成分的建议分布,并采用条件 CRP 先验作为聚类分配的建议分布[7]。该方法可以解释为相对于由后验概率定义的效用函数的随机爬山。
人类组和模拟组各有 32 名参与者。模型输出的前三个分类如下所示(左图)。所有前三个结果都是相同的,表明该模型以高置信度识别了有色分组。参与者的结果以及静态奖励模型的结果在下面的条形图(右图)中可视化,描绘了选择接下来访问节点 2 的人类和模拟受试者的比例。黑色实线表示*均值,黑色虚线表示 2.5 和 97.5 个百分点。
集群内奖励泛化实验的结果[1]
下表中列出的p-值是通过右尾二项式检验计算的,其中空值被假设为选择左侧或右侧灰色节点的二项式分布。显著性水*为 0.05,并且人体实验结果和建模结果都具有统计学显著性。
人类采取的行动和静态奖励模型[1]
在第二个实验中,目标是确定奖励是否会导致集群。我们预测,具有相同回报的相邻节点将聚集在一起,即使仅图的结构不会导致聚集。
回想一下索尔维等人。al 表明,人们更喜欢跨越最少等级界限的路径[2]。因此,在两条完全相同的路径之间,选择一条路径的唯一原因是它跨越的层次边界更少。对此,一个可能的反驳理由是,人们会选择回报更高的道路。然而,在我们下面详述的设置中,奖励仅在目标状态下给予,而不是在所采取的路径上累计。此外,奖励的数量在不同的试验中有所不同。因此,人们不太可能因为某条路径上的节点有更高的回报而偏爱这条路径。
这个实验是使用亚马逊土耳其机器人在网上进行的。参与者被告知以下任务背景:
假设你是一名矿工,在一个由隧道连接的金矿网络中工作。每个矿每天都会产出一定数量的黄金(点数)。在每一天,你的工作是从一个起始矿导航到一个目标矿,并从目标矿收集点。在某些日子里,你可以自由选择任何你喜欢的矿。在那些日子里,你应该试着挑选能产生最多点数的矿。在其他日子里,只有一个矿井可用。该矿的点将以绿色书写,其他矿将以灰色显示。在那些日子里,你应该导航到可用的矿井。每个矿的分都会写在上面。当前矿井将以粗边框突出显示。您可以使用箭头键(上、下、左、右)在地雷之间导航。一旦到达目标矿,按空格键收集积分,第二天开始。这项实验将进行 100 天。
下图(左图)展示给了参与者。与之前的实验一样,为了控制潜在的左右不对称,参与者被随机分配了图中所示的配置或同一图表的水*翻转版本。还描绘了预期诱导的集群,其中节点被编号以供参考(右图)。
向 MTurk 参与者展示的地雷图(左),显示了可能的集群(右)[1]
我们将第一种情况称为 自由选择 ,第二种情况称为 固定选择 ,在第一种情况下,参与者可以自由选择任意一个矿。参与者每次试验都会得到金钱奖励,以阻止随机反应。
在每次试验中,奖励值以 0.2 的概率变化。新的奖励是从区间[0,300]中统一随机抽取的。然而,奖励的分组在试验中保持不变:节点 1、2 和 3 总是有一个奖励值,节点 4、5 和 6 有不同的奖励值,节点 7、8、9 和 10 有第三个奖励值。
前 99 次试验允许参与者开发一个集群层次。最后一项试验作为测试试验,要求参与者从节点 6 导航到节点 1。假设奖励诱导了上面所示的集群,我们预测更多的参与者会选择穿过节点 5 的路径,它只穿过一个集群边界,而不是穿过节点 7 的路径,它穿过两个集群边界。
我们对固定选择案例建模,假设所有 100 次试验中的任务都与呈现给参与者的第 100 次试验相同,即测试试验。首先,我们假设静态奖励,在所有试验中奖励保持不变。接下来,我们假设动态奖励,每次试验的奖励都会改变。
与之前的实验相反,在之前的实验中,参与者选择单个节点,模型预测该节点,这个实验关注的是参与者选择的从开始节点到目标节点的完整路径的第二个节点。因此,为了将该模型与人类数据进行比较,我们使用了广度优先搜索的变体,以下称为分层 BFS,来预测从起始节点(节点 6)到目标(节点 1)的路径。
静态奖励。 对于每个受试者,我们使用 Metropolis-within-Gibbs 抽样从后验进行抽样,并选择最可能的层级,即具有最高后验概率的层级。然后,我们使用分层 BFS 首先查找集群之间的路径,然后查找集群内节点之间的路径。
动态奖励。 对于动态奖励,我们采用在线推断。对于每个模拟参与者,我们允许每次试验的取样只进行 10 步。然后,我们保存了层次结构,并添加了关于修改后的奖励的信息。接下来,我们允许采样再次进行,从保存的层次结构开始。就像在人体实验中一样,在每次试验的开始,奖励有 0.2 的概率被重新随机分配到新的值,尽管奖励在组内总是相等的。这种推断方法模拟了人类参与者在多次试验过程中可能如何累积学习。为了这个实验的目的,我们假设人们一次只记住一个层次,而不是并行更新多个层次。我们还修改了对数后验概率来惩罚断开的聚类,因为这种聚类在这种类型的推断下变得更加常见。
人类组和两个模拟组各有 95 名参与者。零假设由相等数量的参与者选择通过节点 5 和通过节点 7 的路径来表示,因为在没有任何其他信息的情况下,并且给定两条路径长度相等,参与者同样可能选择任一条。
人类采取的行动以及静态和动态奖励模型[1]
如上表所示,人体实验和静态奖励模型的结果在α = 0.05 时具有统计学意义。此外,如下所示,人体实验的结果处于以 0.5 为中心的正态分布的第 90 个百分位数中,这是假定零假设的预期比例。在该图中,我们包括由静态奖励模型(第一行)、在不相连组件之间形成集群的静态奖励模型(第二行)和动态奖励模型(第三行)识别的集群。
通过模拟确定的集群[1]
静态奖励。 我们使用 1000 次 Metropolis-with-Gibbs 采样迭代来生成每个样本,burnin 和 lag 各为 1。静态奖励下的模拟当然倾向于通过节点 5 的路径,达到统计上显著的水*。此外,由于其目的是模拟人类行为,鉴于人类数据也具有统计显著性(0.0321 < α = 0.05),该结果是有意义的。
人类和模拟实验对象的选择[1]
动态奖励。 为了模拟人类试验,我们进行了 100 次试验,每一次都用 10 次 Metropolis-within-Gibbs 迭代从后验样本中进行采样。burnin 和 lag 再次设置为 1。在线推断方法似乎比静态奖励模型更好地模拟了人类数据,即使动态奖励模型下的模拟参与者组比静态奖励模型下的模拟参与者组离假设更远。与静态奖励模型下的 64 名模拟参与者(18.5%的差异)相比,动态奖励模型下的 56 名人类参与者和 54 名模拟参与者选择通过节点 5(3.4%的差异)。
上面的条形图显示了所选路径的第二个节点是节点 5 的人类和模拟受试者的比例。黑色实线表示假设为零时的预期比例,黑色虚线表示第 10 和第 90 个百分点。
人类似乎自发地将环境组织成支持分层规划的状态集群,使他们能够通过在不同抽象层次上将问题分解成子问题来解决挑战性问题。人们经常依靠这种层次分明的演示来完成大大小小的任务——从计划一天的生活,到组织婚礼,再到获得博士学位——通常第一次尝试就能成功。
我们已经表明,一个最佳的层次结构不仅取决于图的结构,而且还取决于环境的可观察特征,即奖励的分配。
我们建立了分层贝叶斯模型,以了解集群如何诱导静态奖励以及静态和动态奖励如何诱导集群,并发现大多数结果在我们的模型捕捉人类行为的紧密程度方面具有统计学意义。所有模拟和实验的所有数据和代码文件都可以在 GitHub 存储库中找到,链接这里。我们希望提出的模型,以及最*的论文中的相关结果,为未来研究铺*道路,以调查支持分层规划的基本认知能力的神经算法。
[1] A. Kumar 和 S. Yagati,麻省理工学院【2018】奖励泛化和基于奖励的层级发现
[2] A. Solway,C. Diuk,n . Cordova,D. Yee,a .巴尔托,Y. Niv 和 M. Botvinick,最优行为层次 (2014),PLOS 计算生物学
[3] G .米勒,神奇的数字 7 加或减 2:我们处理信息能力的一些限制 (1956),《心理评论》
[4] G. Roberts 和 J. Rosenthal,自适应 MCMC 的示例 (2009),《计算和图形统计杂志》
[5] J .巴拉格尔、h .斯皮尔斯、d .哈萨比斯和 c .萨默菲尔德,虚拟地铁网络中分层规划的神经机制 (2016),神经元
[6] M. Tomov,S. Yagati,A. Kumar,W. Yang 和 S. Gershman,发现有效规划的分层表示 (2020),计算生物学
[7] R. Neal,狄利克雷过程混合模型的马尔可夫链抽样方法 (2000),计算与图形统计杂志
[8] R .萨顿和 a .巴尔托,强化学习:导论 (2018),麻省理工学院出版社
原文:https://towardsdatascience.com/teaching-bart-to-rap-fine-tuning-hugging-faces-bart-model-41749d38f3ef?source=collection_archive---------16-----------------------
图片由来自 Pixabay 的 Krystyna Kaleniewicz 提供
在过去几年中,迁移学习为人工智能提供了一个难以想象的福音,在计算机视觉领域以及最*的 NLP 领域掀起了波澜,研究人员发现,在语言建模任务中训练的模型可以很容易(快速而廉价地)适用于其他任务。从从业者的角度来看,除了大量的新发现——在Arvix——拥抱脸上很容易获得——已经开发出难以置信的易用 API,允许任何人通过几行代码访问这些最新的开发。
尽管人们可以很容易地使用拥抱脸 API 进行即时推理和通过命令行风格的参数进行微调,但我在尝试微调 BART 模型时遇到了一点困难。我的目标是在我的硕士论文中使用它,我花了大量的时间编写代码来微调模型,因为我在这个过程中卡住了。然而,一旦我设法克服了这一点,我就对这种模式的力量感到惊讶。
TL;DR:查看这里的微调代码和这里的噪声代码。**
本文将简要概述如何微调 BART 模型,代码相当自由地借用了 Hugging Face 的 finetuning.py 脚本。然而,这将允许对如何试验模型有更多的控制。我已经使用 PyTorch Lightning 来处理训练,如果你是新手,我鼓励你熟悉它。实现非常简单,也许能够简化您的一些项目。虽然我在这里教过 BART 说唱,但这真的只是一个方便(而且好玩!)seq2seq 关于如何微调模型的示例。
只是快速概述一下我在培训过程中遇到的困难。我的模型的损失在每一批中都在快速下降,然而模型正在学习生成空白句子。很长一段时间,我都想不通为什么会这样。事实证明,在将令牌输入解码器之前,您需要手动将令牌向右移位,但是您必须将未移位的令牌传递给 loss 函数。
所以,事不宜迟,这就是教巴特说唱的方法。
我从这个 GitHub repo 中找到了一组很棒的歌词。作者解释了他们如何使用 Genius python API 来抓取歌词,但我只是下载了已经被抓取的歌词。然后我快速旋转了一个笔记本(这里),在那里我创建了一组歌词,下一行歌词对,比如:
这里 L(n)表示行“n”,L(n+1)表示下一行,而->表示这些行在训练数据中是成对的。我还做了少量的额外处理,以确保歌曲不会相互渗透,并且在训练对中,一行诗后面不会跟着一行合唱,反之亦然。我还删除了许多重复的线,因为没有这样做导致模型经常只是生成相同的线,一遍又一遍地重复(由于数据中的线->重复线对的重要部分)。
从这里,我输入了数据。因为 BART 被训练为去噪自动编码器,所以我认为最好将噪声数据传递到模型中进行训练。不过,我不确定这是否有必要。我用标记替换了 25%的数据,但是,我排除了歌词的最后一个单词被添加到替换池中,因为这个单词在支持押韵方案中起着至关重要的作用。
我还尝试以这样一种方式设置训练集,即一行可以不仅仅通过前一行来预测。这样做是希望在生成期间,模型能够在四行诗中有更大的一致性。具体地,如上所述,如果 L(n)表示训练集中的第 n 条线,则它被设置为:
然而,在这样做的时候,我发现尽管训练样本的数量显著增加(很明显),但是模型正在学习从数据集中复制输出行。我因此放弃了这个版本的训练数据。
训练相对简单(在我解决了直线下降的损失问题之后)。我使用 PyTorch Lightning 来简化模型的训练、加载和保存过程。我还使用“bart-base”作为预训练模型,因为我之前在 Google Colab 上使用“bart-large”时遇到了一些 GPU 内存问题。我训练了大约 10 个时期的模型。代码可在这里获得。
在生成文本时,我做了两件事。首先,我向 generate_text()方法(该方法使用了 BartForConditionalGeneration generate()方法)中输入了一个种子行,并自动回归生成了 k 个新行;其次,我用 25%-35%的噪声标记对每一行进行噪声处理。我发现像这样对标记进行噪声处理通常会给模型的输出带来更多的变化。最后,我对我能得到的结果感到非常惊讶。玩起来还挺上瘾的。这是一首我认为可以出现在歌曲中的四行诗(不是布可夫斯基,但是嘿)——第一行是我的:
你和我永远在城市的灯光下巡游
我希望你和你的兄弟们永远不会看到这些闪光
我永远闪耀在城市的灯光下
但是你永远不能改变你发光的方式
添加更长范围的歌词以供生成——尽管我用更长的引导歌词(两行和三行引导到目标行)创建更多训练数据的实验并不成功,但可能有一种方法可以改善这一点,例如,在句子中添加标记。
我认为观察巴特如何与不同类型的音乐合作也是很有趣的,比如乡村音乐或朋克摇滚。我还认为,如果在训练模型时不干扰源代码,看看会发生什么会很有趣。虽然,据我回忆,从原始 BART 论文来看,在训练模型时所有的数据都有噪声,但我不确定不去噪声数据是否有效。
最后,时不时地,当一个非常棒的行出现时,我会手动搜索训练数据,看看模型是只是复制它还是生成文本。大部分时间它都在生成文本,但是添加一个类似 BLEU 的度量来判断模型是抄袭还是“原创”会很有帮助。
当使用预先调整的模型时,现在有很多选择,特别是拥抱脸正在做的伟大工作,使最新和最棒的模型民主化。BART 在 seq2seq 任务的广泛范围内显示出了很大的前景,并且已经花了一些时间来更好地了解该模型,我非常希望看到其他的可能性。
原文:https://towardsdatascience.com/teaching-binary-search-to-someone-who-has-no-technical-knowledge-bc21849e4af?source=collection_archive---------21-----------------------
宝琳娜·坦基列维奇 | 佩克斯
教授基本算法可能是向一个人介绍计算机科学最具挑战性的部分之一。在假设的问题和抽象的思考之间,它会让人感到不知所措。
但不一定非要这样。
不受欢迎的观点:如果你恰当地设计问题,任何强有力的思考者都可以为一个基本的算法问题找到强有力的解决方案。
不相信我?在朋友身上试试这个。我敢打赌,到最后,他们会为二分搜索法开发一种算法,并理解这个概念,即使他们没有技术背景。
下面是极客上给极客们的二分搜索法的定义:
“给定一个 n 元素的排序数组 arr[],写一个函数在 arr[],搜索给定的元素 x。”
我学习软件工程,甚至当我读到这个的时候都会头疼。如果你使用那种语言,我保证你会左耳进右耳出。
所以不要做。
框定问题是成功的一半。做得对,成功的几率就高那么多。
如果你想用一种不那么专业的方式来问二分搜索法问题,这是一个很好的方法。
想象你有一大盒相同的鸡蛋,你想知道你的鸡蛋有多结实。你在一个 100 层的写字楼 工作,你想找到那个 最高的楼层 可以让鸡蛋掉下来而不打碎它。你如何尽可能快地做到这一点
虽然你不必完全遵循它,但在构思问题时,你应该记住一些提示。
对于非技术人员来说,计算机科学是可怕的。相信我,我知道。曾经有一段时间,我的编程知识是他们在电视节目中展示的 clickity-clack hacking。我绝对是一个对解释什么是程序或算法的人茫然凝视的人。
作为一名当今的软件开发人员,我意识到编程实际上比乍看起来要简单得多。语法有误导性。
如果你是一个强有力的思考者,不管你的技术背景如何,你都可以想出很棒的算法解决方案。
所以我的建议是?不要说代码。不要表现得好像这是一个编程问题。这只会吓坏他们。
“想象一个严格递增的整数值列表…”等等等等。信息过载。你也一样。我的建议是:不要解释。让常识为你工作。
是的,二分搜索法要求你要搜索的列表有一定的顺序和方向,但是你不需要说太多的话。
通过使用一个建筑物的类比,我以这样一种方式构建了这个问题,即每个潜在值(楼层数)都是一个严格递减的区间。这是用来自现实世界的非心照不宣的、无意识的知识完成的。
每个人都知道,如果你丢下一样东西,重力会把它拉向一个方向——向下。从常识来看,人们知道如果你能从某一楼层扔下东西而不摔碎,那么你也能在所有较低楼层做到这一点。
十有八九,常识比我们更能解释一个问题。好好利用。毕竟,每个人都宁愿解决一个实际上似乎具有现实世界、可想象的适用性的问题。
好吧,我们明白了。你是一名软件工程师或数学专业的学生,你喜欢你的华丽词藻。但是像任何其他领域一样,你日常使用的术语对于任何非技术人员来说几乎没有任何意义。就像外科医生在向病人解释手术程序时简化程序一样,尽量避免使用 CS 领域特有的术语。
记住,你是在试图教别人一个概念,而不是炫耀你的专业知识或教他们专业术语。
经验之谈,如果你使用行话,那就太专业了。
虽然“临界值”在算法世界中可能意义重大,但大多数非技术人员会发现这一点并不清楚。你会注意到,我没有说“关键楼层”,而是问了最高楼层。
使用简单的英语。这都是关于用他们能理解的语言说话。
是的,你可以定义关键这个词,但这有什么意义。对于问题来说,这是不必要的,它只是增加了另一个分散问题注意力的信息。跳过任何需要不必要定义的单词。求你了。
你会注意到我用 100 层来设计这个问题,而不是二分搜索法问题中常用的 n 层。
计算机科学家可能习惯于将每个问题中的“n”视为概括问题大小的一种方式,但大多数人认为“n”只是问卷中“否”的简称。虽然用任意值框定的问题可能有利于一般性,但是任意值不会改变问题的本质。
如果你想让某人理解一个问题,给他们一个漂亮的实数作为起点,这样他们就能理解这个问题。任意数字很难概念化。
让他们专注于手头的问题,而不是任意值“n”的可视化。
先解决问题,然后根据需要进行归纳。这是我解决任何算法问题的技巧,但是如果你和没有技术背景的人交谈,这一点尤其重要
在工作面试中成为你一直想要的面试官。不是指你在判断和评估,而是指你在需要的时候给出提示性的问题。
没有人喜欢坐在那里不知道下一步该去哪里。很沮丧,很尴尬。就像优秀的面试官在你陷入白板问题时会做的那样,如果有人陷入困境,帮助他们。
问他们一个问题,为他们指出正确的方向。或者,如果他们的解决方案是错误的,不要直截了当地告诉他们,而是给他们一个他们的解决方案不是最优的场景。让他们想清楚。耐心点。
设身处地为一个没有技术背景的人着想,乐得请人解决掉蛋问题。
当你认为一个算法与编程无关时,你会震惊于有多少人能解决这个算法。
玩得开心。你永远不知道,也许你最终会向某人展示编码并不像看起来那么令人畏惧。
原文:https://towardsdatascience.com/teaching-computers-to-recognize-human-actions-in-videos-81b2e2d62768?source=collection_archive---------31-----------------------
作者:伊莱·什利泽曼
照片由布鲁斯·马尔斯在 Unsplash 上拍摄
对于人类来说,仅仅通过观看视频来识别人们用身体做出的各种动作是一项自然而简单的任务。例如,大多数人可以很容易地识别出一个主题,比如,“来回跳跃,或者“用脚击球”。即使视频素材中显示的对象发生变化或从不同的视角录制,这也很容易识别。如果我们希望计算机系统或游戏机(如 Xbox、PlayStation 或类似设备)也能做到这一点,会怎么样?这可能吗?
对于一个人工系统来说,这个看似基本的任务并不像人类那样自然,它需要几层人工智能能力,例如(I)知道哪个特征在做决定时跟踪,以及(ii)命名或标记特定动作的 能力。
关于(I),视觉感知和计算机视觉的研究表明,至少对于人体来说,关节的 3D 坐标,即 骨架特征 足以识别不同的动作。此外,当前的鲁棒算法能够使用几乎任何视频源镜头实时跟踪这些特征,例如 OpenPose [1]。
Sam Sabourin 在标有骨骼特征的 Unsplash 上的照片
关于(ii),教导计算机系统使用这些特征在点的集合和动作之间进行 预测关联 证明是比仅仅单独选择所述特征更具挑战性的任务。这是因为系统被期望将特征序列分组到“类”中,并且随后将这些与相应动作的名称相关联。
基于骨架的动作识别:点(时间序列)集合和动作之间的预测关联
现有的深度学习系统试图通过一个称为“监督学习”的过程来学习这种类型的关联,其中系统从几个给定的例子中学习,每个例子都有对它所代表的动作的解释。这种技术在每一步都需要相机和深度输入(RGB+D)。虽然监督动作识别已经显示出有希望的进步,但是它依赖于大量序列的注释,并且每次考虑另一个主题、观点或新动作时都需要重新进行。
由雷蒙德·拉斯姆森在 Unsplash 上拍摄的照片
因此,特别有趣的是,相反,创造试图模仿人类感知能力的系统,这些系统学会以一种不受监督的方式进行这些关联。
在我们最*名为“预测&聚类:无监督的基于骨架的动作识别”[2]的研究中,我们开发了这样一个无监督系统。我们已经提出,系统将学习如何通过‘编码器-解码器’学习来预测序列,而不是教计算机将序列与它们的动作进行分类。这种系统是完全无人监督的,并且仅通过输入来操作,而不需要在任何阶段对动作进行标记。
预测和聚类:基于无监督骨架的动作识别
特别地,编码器-解码器神经网络系统学习将每个序列编码成代码,解码器将使用该代码来生成完全相同的序列。原来,在学习编码然后解码的过程中,Seq2Seq 深度神经网络将序列自组织成截然不同的簇。我们开发了一种方法来确保学习是最优的(通过固定解码器的权重或状态),以便创建这样的组织,并开发了工具来读取该组织,以将每个集群与一个动作相关联。
预测和聚类示意图
我们能够获得动作识别结果,优于之前的无监督和有监督方法。我们的发现为使用任何特征输入的任何类型动作的新型学习铺*了道路。这可能包括从识别飞虫飞行模式的行为到识别互联网活动中的恶意行为。
有关更多信息,请参见下面的概述视频和[2]中的论文。
带着和刘秀龙。
[1]打开姿势:https://github.com/CMU-Perceptual-Computing-Lab/openpose
[2]苏、昆、刘秀龙和伊莱·什利泽曼。"预测和聚类:基于无监督骨架的动作识别."IEEE/CVF 计算机视觉和模式识别会议论文集。2020.
原文:https://towardsdatascience.com/teaching-new-tricks-to-an-old-camera-5ab37f4a4406?source=collection_archive---------45-----------------------
(图片由作者提供)
住在乡下,我很幸运,对于许多食物,我可以步行到当地的农场。不过,对于大多数其他东西,我的家人都在网上购物。今年,我们相当长的车道真的需要重新铺设,这意味着在两个月内,任何送货或其他重型卡车都不能在上面行驶。我们在车道的尽头放了一个送货箱,但从我们的房子里看不到它,所以为了方便和安全,我们真的想在上面装一个摄像头。
(图片由作者提供)
我认为安装相机的一个好地方是车道旁现有的电线杆(在房产内),它距离房子不到 100 米(328 英尺),距离盒子大约 50 米(164 英尺);接下来的问题是如何最好地为 it 带来动力和连接。有很多方法可以做到这一点,从电池、太阳能电池和电池网络到无线电链路和电缆。为了降低成本,我想到了放在地下室里的一台用了 10 年左右的“机场级”相机。
(图片由作者提供)
电线杆在 PoE 范围内,所以运行它我只需要一些直埋电缆。我可以用最少的成本解决投递箱通知问题,将相机投入使用,并使用一些深度学习来获得一个现代探测器…这是一个太好的项目了,不能错过!
在汗流浃背地爬了一整天的电线杆,埋好、布线、固定和压接电缆之后,我把相机装了起来,开始拍摄。沿着阻力最小的路径,也为了看看我能学到什么,我决定让相机通过网络持续记录到 Linux 系统上,并在那里使用我不久前编写的 YOLO v3/v4 对象检测器来处理它。我很想在相机上运行推理,但它的 CPU ( 一个定制芯片)和存储很小,而且没有用于加速器的 USB 端口。
虽然功能非常丰富,但这款相机太老了,有些东西很难使用。例如,它有一个运动检测功能,但需要浏览器中的 Java 小程序支持才能轻松配置……对,没错。它可以记录到网络附加存储,但只能使用 SMBv1 协议。在我的系统上安装 samba 是一个的问题,但它需要一些更严肃的研究来找到中需要的“咒语,所以它会说 SMBv1:
通过记录到 Linux 系统,我可以轻松地访问数据(不需要研究它在相机上处理的 API),在我调整代码和神经网络时随意重新处理数据的能力,以及长期存档。我使用 OpenCV 来读取文件并创建小片段,然后包含在通知中。
不过,对文件进行检测确实引入了一点延迟:记录是以一分钟为单位进行的,直到完成才进行处理;除此之外,还有几秒钟时间让脚本注意到有一个新文件,几秒钟时间让它运行推理,几秒钟时间让它发出任何通知。总之,从检测到事件到发出通知可能需要大约一分半钟。我认为这已经足够好了,但另一个选择是使用相机和 OpenCV 都支持的 RTSP 流来处理视频。
摄像机对车道入口的观察也包括一些道路,你不会相信一条安静的乡村道路有多少…直到你得到每条道路的通知。不仅仅是汽车和卡车,还有早上 5 点遛狗的邻居,一个火鸡家庭或(防滑转向)山猫经过。
火鸡家族;山猫(作者图片)
在我的例子中,“进”和“出”之间的边界是一条直线,这使得道路很容易被忽略:
(图片由作者提供)
我还过滤掉了除少数检测类之外的所有检测类:我使用了使用 COCO 数据集训练的原始 YOLOv3 权重,其中包括“牙刷”、“斑马”和“消防栓”等类。实际上,任何这样的检测都是假阳性。
由于相机是 PTZ ,一开始我雄心勃勃地想训练一个神经网络来识别它指向哪里,并调整相关的检测区域。我可能还是会尝试,但是现在更简单的是不要改变方向。
对于通知,鉴于我之前的工作,最简单的方法似乎是给我自己发电子邮件,凭证来自 JSON 文件,这样它们就不在代码中了。
对于每个检测序列,我包括一个小的 MP4 剪辑和一个相应的高分辨率的“代表性”图像。通常我只需要图像,但也在我的手机上播放的剪辑可以帮助理解正在发生的事情,例如当有人决定在入口处转身时。我使用边框中面积最大的框架作为“代表性”图像。
(图片由作者提供)
该相机被设置为以 15 FPS 的速度录制 1080p 视频。在我的 Linux 系统上,使用一个管道并且只使用 CPU,我可以以大约 4 FPS 的速度处理它,所以我需要它更快。事实上,要快得多,这样即使被打断也能赶上。一些选项包括:
总而言之,在我的 4.5 GHz Intel i9–10900 x,32GB RAM Linux 系统上,我可以在不到 10 秒的时间内处理一分钟的片段,如果我让它使用 GPU,甚至更短。
我没有真正评估这个准确性,但确实遇到了一些假阳性…如果我决定长期运行这个系统,我可能会微调它以避免这些。
圆锥和涵洞被检测为“人”(图片由作者提供)
车道又可以开了,投递箱也不见了……话虽如此,我提到的大部分没有完成的事情都可以成为项目。我可能会试着在相机本身或者树莓 Pi 或者 T2 Arduino 上运行一些东西。使用相机的 PTZ 来跟踪检测也很酷。
在下面,但是你也可以在 GitHub 上查看。
使用风险自担!我通常开发代码测试驱动,但是我在这里做了很多实验,并没有将这个项目视为 TDD。
尽情享受吧!
原文:https://towardsdatascience.com/teaching-radar-to-understand-the-home-ee78e7e4a0be?source=collection_archive---------44-----------------------
詹姆斯·斯隆在 Unsplash 上的照片
计算机视觉利用商用相机、计算和机器学习算法,已经彻底改变了视频跟踪、对象检测和人脸识别。这为企业及其客户创造了巨大的价值,同时也带来了对隐私和个人信息控制的担忧。
对家庭环境中的人和物进行基于雷达的识别和定位相对于计算机视觉具有一定的优势,包括增加用户隐私、低功耗、零光操作和更灵活的传感器放置。与视觉系统相比,它确实有一些缺点。例如,雷达通常没有大多数基于摄像机的系统的分辨率,因此可能难以区分具有非常相似特征的物体。此外,虽然随着汽车和工业应用的增长,雷达的成本正在迅速下降,但它通常仍比长期以来依赖于移动电话单位体积的相机更昂贵。这些因素减缓了它在消费者应用中的采用。但更重要的是,能够用于训练或微调机器学习模型的雷达数据集非常少。这与计算机视觉数据集和模型的普遍存在形成了鲜明的对比。
在本文中,您将了解如何使用低功耗毫米波雷达精确检测人、宠物和物体,以及如何利用传统的基于摄像机的物体检测,利用自我监督学习来生成基于雷达的检测模型。自监督学习是自主监督学习。这是一种表示学习方法,消除了人类标记数据的需要[1]。
使用自我监督学习、训练和使用基于雷达的对象检测模型来收集数据的步骤如下。
Vayyar 的雷达芯片采用 Walabot 参考设计,鉴于其灵活性和广泛的可用性,是开发这些解决方案的绝佳选择。在谷歌的 Coral 边缘张量处理单元(TPU) 上运行的对象检测模型是另一个很好的选择,因为它可以比雷达扫描目标的速度快很多倍。
您可以在 radar-ml 找到关于该项目中使用的软件和硬件的更多详细信息。
下面是为此项目创建的培训设置的照片。Walabot 雷达安装在前方水*位置,摄像头位于其顶部中央。白色盒子包含通过 USB 连接到相机的谷歌珊瑚边缘 TPU,黑色盒子包含通过另一个 USB 连接到雷达的树莓 Pi 4。
显示雷达、摄像机、TPU 和树莓派的训练设置
TPU 在 grpc 上运行实时对象检测服务器,Raspberry Pi 上的客户端与该服务器通信。对象检测服务器代码可以在这里找到。Raspberry Pi 处理确定探测到的雷达目标是否与 TPU 探测到的物体相同所需的处理,以建立地面实况。Pi 和 TPU 通过专用的以太网链路进行通信,以最大限度地减少延迟,这对于准确确定雷达目标是否与探测到的物体相同至关重要。Pi 还使用训练好的模型对新的雷达目标进行预测,并用于将雷达目标数据的模型与地面实况进行拟合。
下图显示了雷达(XR,YR,YZ)、相机(XC、YC、ZC)、图像(x,y)和像素(u,v)坐标系。雷达被用作参照系。摄像机应放置在雷达装置的顶部中间,可以水*或垂直安装(USB 连接器用作参考,参见 Walabot 文档)。这确保了相机的光学 z 轴与雷达的 z 轴对齐,并且可以确定相机轴和雷达轴之间的固定偏移(这些被称为相机外部参数)。此外,你应该确保相机的视角与雷达的区域紧密匹配,该区域在 Python 模块 common.py 中定义。
雷达和摄像机坐标系之间的关系
理解这些关系对于将像素系统中的二维点(实际上是从相机中读取的)转换为雷达的参考系是很重要的。相机系统中的点以蓝色显示为 P(X,Y,Z),雷达系统中的对应点以绿色显示为 PR(XR,YR,Z)。请注意,在两个系统中,Z 是相同的,因为雷达的 Z 轴与相机的光学 Z 轴对齐,图像*面尽可能靠*雷达 z = 0。关于如何进行坐标转换,请参见下一节。
摄像机可以放置在它与雷达共享一个点的视图的任何地方,只要摄像机的外部参数是已知的,以便它的视图可以旋转并转换到雷达的参考系中。如这里所做的,将相机放置在雷达单元的顶部中心极大地简化了坐标系的转换,但是能够使用任意放置的相机进行传感器的自我监督学习在生成数据时会非常有效。
您必须首先校准相机,以确定其内在参数(x 和 y 焦点和主点)并校正失真。固有参数用于将图像坐标转换为雷达坐标。你可以使用 OpenCV 来很容易地进行摄像机校准,这个项目中就使用了它。
参见参考文献[5]、[6]和[7],了解更多关于相机和世界坐标系以及相机内部和外部参数的信息。
本节描述如何从雷达收集目标样本,以及如何建立地面实况(即目标识别)。雷达在一次扫描中可能会探测到多个目标,因此定位是这个过程的一部分。这里的一个关键挑战是实时地将三维雷达图像准确地转换成二维摄像机图像,因为人和宠物可以在场景中快速移动。因为雷达图像是三维的,所以可以使用目标的三个正交视图来生成数据集。选择要包含在数据集中的视图和每个视图的分辨率是模型复杂性、大小和准确性之间的权衡。
您可以使用 Python 模块 ground_truth_samples.py 通过从对象检测服务器收集的基于摄像机的观察来处理真实雷达样本。这些观察结果以被检测对象的边界框及其标签的质心坐标的形式从服务器返回。服务器有大约 20 毫秒的和推理延迟。这与 200 毫秒的雷达扫描速率(是竞技场大小和分辨率的函数)相比是很小的。这个 1:10 的比例被设计成最小化雷达感测到的和摄像机看到的之间的跟踪误差。
质心坐标通过下面所示的函数转换为雷达参照系,然后计算每个雷达目标和转换后的质心坐标之间的距离度量。
将坐标从相机转换到雷达系统的功能
如果距离小于阈值,则宣布匹配,并且雷达目标的返回信号和标签被存储为观察值。
下面的代码片段显示了主循环的简化版本,它为单次雷达扫描执行这些操作。
雷达观测地面真实码的简化主回路
您可以配置 ground_truth_samples.py 来实时可视化地面实况过程,以确保其正常工作。下面的屏幕截图显示了一个可视化示例。您可以在左侧窗口中看到,在雷达三维目标回波信号强度的三个二维投影中的每一个投影中,检测到的目标(绿点)的质心都靠*目标中心(红点)。右侧窗口显示基于摄像机的对象检测器的视图。
地面真实可视化
您可以使用 Python 模块 train.py 在雷达样本上训练 SVM 或逻辑回归模型。样本被缩放到[0,1]范围,类别被*衡,然后使用分层的 5 重交叉验证器来拟合模型。对拟合的模型进行校准、精度评估、序列化并保存到磁盘中。
从雷达可以获得目标回波信号的三个正交视图。您可以将这些视为三维目标信号在雷达的 X-Y *面、X-Z *面和 Y-Z *面上的二维投影。这些中的任何一个或它们的任何组合都可以用作观察值。使用所有这三种方法将产生最佳精度,但是数据集(每个样本约 10k float32)和产生的 SVM 模型(1.5k 训练样本约 10MB)可能很大,尤其是在雷达扫描分辨率很高的情况下。选择最佳组合是一个训练超参数,可在 train.py 中配置。
使用所有投影运行的训练结果如下所示。
使用所有预测对训练结果建模
仅使用 X-Y 投影的训练结果非常相似。与全投影情况相比,存在相对较小的降级。但模型训练时间和模型大小(约 10MB vs 1.6MB)差远了。使用所有视图进行训练似乎不值得,至少对于这个特定的数据集是如此。
最*训练的模型(使用所有投影)和数据集可以在这里找到。这个模型有“人”、“狗”和“猫”的标签。您可以轻松地将这些名称对应起来,以适合自己的家庭。该模型具有 10,011 个要素的输入向量,由来自 Y-Z 投影*面的 5,457 个要素、来自 X-Z *面的 3,872 个要素和来自 X-Y *面的 682 个要素组成。每个*面上的特征数量是雷达场大小和分辨率的函数,默认的训练场产生这些数量。
Python 模块 predict.py 用于说明如何使用训练好的模型对新的雷达样本进行预测。您可以使用不同于用于训练的雷达预测竞技场,因为预测模块会根据需要自动调整观测值。但是,您应该确保雷达阈值、过滤器类型和配置文件与用于训练的相似。此外,需要从训练中使用的相同正交*面构建观测值。
预测示例如下所示。
你可以使用这个模块和训练好的模型在你自己的 Walabot 雷达装置上运行预测。
基于雷达的感知比基于视觉的方法有一些优势,包括增加用户隐私和零光操作,但很少有合适的数据集来训练机器学习模型。利用传统的计算机视觉,自我监督学习可以有效地用于生成这些数据集。使用中等大小的数据集和浅层机器学习模型,如支持在低成本计算机上进行推理的支持向量机,可以实现基于雷达的高目标检测精度。这些高精度模型支持客户家中的许多应用,包括入住和入侵检测,并且可以扩展到检测坠落等事故。
使用自我监督学习、训练和使用基于雷达的对象检测模型来收集数据的步骤如下。
这项工作受到参考文献[2]、[3]和[4]的启发。
1.自我监督学习让我们更接*自主学习
2.基于雷达的实时人体活动识别
3.采用多对多编码器/解码器模式的实时穿墙姿态成像
4.使用射频雷达感应对工作表面进行不引人注目的活动识别和位置估计
5.摄像机校准和三维重建
6.摄像机校准
7.几何摄像机参数
原文:https://towardsdatascience.com/tech-and-bias-6e19b69bda4e?source=collection_archive---------38-----------------------
安迪·凯利在 Unsplash 上的照片
几周前,我写了一篇关于有偏见的算法的文章(如果你想回去读的话,这里有一篇文章)。在这篇文章中,我提到了一些事件,比如一个女性社交网络使用面部识别来确定你是否是女性,那一次亚马逊使用算法来确定最佳求职者,使用算法来决定谁能获得贷款,谁不能获得贷款,以及AirBnb使用算法来禁止它认为不受欢迎的人。在所有这些情况下,算法在某种程度上都有偏差,因为输入算法的数据有偏差,或者算法做出的假设有偏差,或者两者都有。考虑到这一切,为什么有相当一部分人认为算法不会也不可能有偏差?
在这一点上,我想我们都意识到每个人都有这样或那样的偏见。我们知道自己的一些偏见,但有些偏见我们可能甚至没有意识到。即使我们努力减少我们的偏见,它仍然会存在。然而,这并不是说我们一出生就有种族歧视、性别歧视或同性恋恐惧症。随着时间的推移,随着我们的成长,我们从周围的成年人那里学到了偏见。机器也是如此,但人们倾向于认为这不是真的原因是因为一个有趣的东西叫做自动化偏见。
自动化偏差被定义为一种偏差,“当人类决策者忽视或不根据被接受为正确的计算机生成的解决方案来搜索矛盾的信息时,就会出现这种偏差”(Cummings 2004,pg。2).换句话说,人类假设计算机是自动正确的,不会质疑它的决定,即使他们应该质疑。这是一个记录良好的现象,在飞行飞机(Mosier 1998)、开药(Lyell 2017)、军事指挥和控制行动(Parasuraman 2010)等许多领域产生了深远的影响。
当人们成为自动化偏见的受害者时,会出现两种类型的错误:
换句话说,遗漏的错误将是“我没有发现,因为计算机没有发现,”而委托的错误将是“我做了一些与我的训练和/或可用数据相矛盾的事情,因为计算机告诉我这样做。”在亚马逊有偏见的招聘算法的情况下,遗漏的错误可能是这样的,“我没有意识到这个人会非常适合这个职位,因为算法认为这个人不太适合,”而佣金的错误可能是,“我认为女性不太适合我们的空缺职位,因为算法认为女性不太适合,尽管我知道女性的属性不会使你不太适合某份工作。”显然,这两个错误会开始相互融合,有时人类基于算法误用而犯的错误是这里描述的两个错误的组合。
算法和 AI 越来越成为我们生活中不可或缺的一部分。这就是为什么我们需要不断地重新评估我们与技术的关系,以及我们对所述算法的使用的假设。特别是,我们需要评估我们自己对技术的偏见,并确定我们可能拥有的自动化偏见。显然,我们都想避免犯错误和遗漏,并拥有尽可能少的偏见。问题是,我们怎么做?同样的方式,我们处理每一个其他的偏见,我们努力减少:意识和责任。我们需要意识到我们的偏见,因为很明显,你无法将你没有意识到的事情最小化。我们还需要负责任,因为我们需要在一天结束时对我们的决定负责,即使那个决定是由机器帮助的。就飞行员而言。艾尔通发现:
与那些不认同这种看法的飞行员相比,那些报告对自己的表现和与自动化交互的策略“负责任”有内在看法的飞行员更有可能根据其他线索仔细检查自动化功能,并且更不容易犯错误。(Mosier 1998 年)
换句话说,如果我们想与我们使用的技术保持健康的关系,我们需要对我们的偏见、我们的行动和决定负责,这些可能会也可能不会得到某种技术的帮助。
[1]玛丽·卡明斯。"智能时间关键决策支持系统中的自动化偏差."在 AIAA 第一届智能系统技术会议上,第 6313 页。2004.
[2] Mosier,Kathleen L .,Linda J. Skitka,Susan Heers 和 Mark Burdick。《自动化偏差:高科技驾驶舱中的决策和绩效》国际航空心理学杂志 8,第 1 期(1998):47–63。
[3]莱尔、戴维、法拉·马格拉比、马格达莱纳·拉班、L. G .庞特、梅丽莎·贝萨里、理查德·戴和恩里科·科埃拉。"电子处方中的自动化偏差." BMC 医学信息学与决策 17,第 1 期(2017): 28。
[4]帕拉苏拉曼、拉贾和迪特里希·h·曼泽伊。"人类使用自动化的自满和偏见:注意力整合."人为因素 52,3 号(2010):381–410。
[5] Skitka,Linda J .,Kathleen L. Mosier 和 Mark Burdick。“自动化是否会影响决策?."《国际人机研究杂志》 51,第 5 期(1999 年):991–1006。
原文:https://towardsdatascience.com/tech-companies-want-your-help-fighting-the-coronavirus-f2cbb56e90dd?source=collection_archive---------46-----------------------
瑞士安德拉斯巴塔[via Pixabay]
我确信,对于我们中的许多人来说,在过去的几周里,在追踪新冠肺炎·疫情的过程中,《灵媒》成为了宝贵的事实知识来源。我特别想到了许多来自张庭等作者的第一手描述,他最*在中国深圳直接记录了他对这种病毒的日常体验。
对我个人来说,Medium 的精心策划和深思熟虑的作者身份幸运地将我的思想从主流媒体的瘴气中转移出来,让我可以深入到与新冠肺炎测试工具的可用性或囤积卫生纸背后的心理学完全无关的话题中。举例来说,我能想到的最有效的方式就是阅读简单彩虹背后的数学之美。
在这场全球健康危机中,很少有人见过其规模,我们不能简单地逃避思想或通过视频游戏、电影、书籍等“撒手不管”——至少不是 100%的时间。直接行动,即使是最小的措施,对我们的社区和我们自己都有意义。
作为一名关注数据和分析市场的行业分析师,过去几周让我看到了行动的价值,尤其是看到了技术供应商社区所做的一些贡献是如何产生影响的。例如,通信供应商思科、Avaya 和其他公司为被迫自我隔离的员工提供免费的协作服务。其他公司也在很好地利用他们的领域专长,微软推出了新冠肺炎跟踪器,英伟达呼吁其客户向 Folding@home 项目捐赠图形处理器(GPU)周期,许多公司承诺(并交付)大量资金给世界卫生组织的新冠肺炎基金呼吁。
是的,我意识到这些行为肯定不是完全利他的,因为它们最终会使这些公司受益。在这个关头,我们需要任何和所有有益的行为,无论动机如何。不管怎样,公司并不是唯一贡献时间、精力和金钱的公司。以数据和分析行业从业者的突然转变为例。在流行的数据科学竞赛网站 Kaggle 上,数据科学家和数据爱好者已经积极地为病毒贡献预测模型有一段时间了。然而,有趣的是,一月份开始的纯智力练习已经迅速演变为一项更紧迫的努力,正如周一(3 月 16 日)所证明的那样,当时白宫呼吁“ka gglers”积极与全球科学家合作,回答在 Kaggle 上发布的一些具体问题。
[更新于 2020 年 3 月 19 日:我们也看到分析供应商加入进来,数据可视化和发现领导者 Tableau 开放了 Covid19 数据资源中心,这是一个基于 JHU 数据流构建的现成仪表盘。Tableau 希望雇主和其他商业实体可以利用这个仪表板和数据反馈,根据员工位置数据检查疫情,跟踪临床供应等。]
许多其他类似的机会可供公民数据科学家和分析师参与打击这一全球性威胁。但是我想特别提请注意图形数据库供应商 TigerGraph 提出的一个方案,它基本上是开放其数据库的免费使用。这听起来可能不那么有影响力,除非你意识到除了 Kaggle 上正在进行的文本挖掘操作之外,还有很多工作需要做。
首先,我们需要清楚地了解病毒在特定人群中传播的方式。这种信息可以极大地帮助政府和社区领导人在逐个社区的基础上管理应对这场危机的最佳做法。最好的方法是采用图表分析,它直接查看两个或更多数据点之间的关系和距离——无论是社交网络中的朋友还是给定社区中的新冠肺炎感染者。
具体来说,TigerGraph 希望其用户可以帮助识别病毒感染群,隔离超级传播事件,并定义了解特定区域或社区内传播的起源和整体影响的最短路径。为了帮助这项工作,该公司在 Discord 上创建了一个信息和想法清理室,并打算提供许多针对这些问题的 TigerGraph 云初学者工具包,以帮助专业和业余从业者快速上手。
为什么这种分析会有帮助?不像地震和风暴,大流行发展缓慢。鉴于新冠肺炎的性质,我们可能会在未来一段时间内与疫情作斗争。为此,我们需要一种追踪和隔离任何突发事件的方法。为了了解特别致命的病毒的长期影响,我建议阅读唐纳德·j·罗伯逊的精彩帖子,瘟疫时期的禁欲主义,它戏剧化地描述了公元 2 世纪晚期安东尼瘟疫肆虐罗马帝国的过程。
当然,我们离解决像马可·奥勒留所面临的疫情长期问题还有很长的路要走。目前,我相信在未来的几周和几个月里,我们会看到许多类似的公司贡献时间和资源。对我来说,我真的被这些努力所鼓舞,因为它们宣扬了一个极其重要的信息:我们在一起,我们可以一起迎接保护我们自己、我们所爱的人和我们的 77 亿同居者的挑战,这些人组成了这个被称为地球的淡蓝色的点。
编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
原文:https://towardsdatascience.com/tech101-who-is-json-ab670914a9bb?source=collection_archive---------61-----------------------
虽然沃尔赫斯、斯泰瑟姆和德鲁洛各有所长,但我认为最好的 Json 应该是机器可读的文件格式。Json,或者更确切地说,JSON,是科技界一个重要的缩写词。JSON 代表 JavaScript 对象符号。数据专业人员、软件工程师和 It 人员经常使用它。如果你从来没有写过一段代码,这对你来说就像是一门外语。你猜怎么着?确实是。
我们来分解一下。
JavaScript 是一种脚本或编程语言,允许你在网页上实现复杂的功能(根据 Mozilla )。这是用于构建网站的最流行的编程语言之一。无论你是在访问 Zillow.com 的还是 Gap.com 的或或者几乎任何网站,在某种程度上,这种构建都很有可能依赖于 JavaScript。我怎么知道他们用的是 JavaScript?
让我们来看看。
**
去 Gap.com。右键单击并选择“检查”或“检查元素”。
**
在“Elements”或“Inspector”选项卡下,您可以查找提到“javascript”或“Inspector”的内容。js”文件。
代码的一个例子是这样一行:
上面的行调用一个特定的 JavaScript 文件来运行一组代码或指令。这些指令(即 JavaScript)改变了您与 Gap 主页交互时的外观和感觉。
韦氏词典将符号定义为艺术、科学、数学或逻辑中用来表达技术事实或数量的字符、符号或缩写表达的系统。一种常见的符号是用来表示数学中的未知值或变量。然而,在这种情况下,人类将 JSON 设计为一种机器可以轻松解释的特定符号。对于易于人们阅读的符号来说,一个恰当的比较是一个购物清单。下图显示了一个典型的杂货清单从普通人类符号到 JSON 格式的转换。
在此图中,对象是列表的名称、杂货项目的类别以及各种项目本身。每个对象都用花括号括起来,而其中的项目则写成“key”:“value”对。你可以试试用 JSON 格式写这里。
因为 JSON 文件对人类来说很难理解,程序员最终需要将输出转换成可读性更好的东西。如果你没有任何编程知识,需要解读一个 JSON 文件,网上有 JSON 查看器。我们可以用上图中 JSON 格式的购物清单测试一下。
从上面粘贴 JSON 字符串。
在“查看器”选项卡中,单击加号打开对象。
想象一下,尝试阅读一本 JSON 格式的哈利波特小说。读一整章可能要花上几个小时,而且会让你头疼。这与机器阅读和解释我们以段落形式写的小说的斗争是可比的,只是我不认为计算机会头痛。无论如何,机器读取 JSON 格式的文件要比读取人类可读格式的数据或文本快得多。程序员把速度称为性能。程序员喜欢他们的代码具有高性能(即执行速度快)。
来源: Unsplash
下次当你听到有人提到 JSON 时,它将不再像是一门外语。没有必要因为沮丧而咬你的铅笔。回想一下你的购物清单。JSON 所做的只是将信息转换成不同的格式。新的格式使机器能更快地读取信息。我相信你也会表现得很好。
~ 数据通才
原文:https://towardsdatascience.com/technical-analysis-of-stocks-using-ta-lib-305614165051?source=collection_archive---------7-----------------------
杰森·布里斯科在 Unsplash 上的照片
技术性能指标是对不同的股票参数如成交量、价格等进行的数学计算。它们帮助我们识别一只股票在特定时间内遵循或将遵循的不同模式。这些性能指标通常使用图表和图形来可视化。
TA-Lib 是一个开源 python 库,用于分析股票市场的历史数据,如股价、成交量等。为了预测未来的价格或市场方向,以便我们能够相应地进行投资。
Ta-Lib 包含大量用于研究市场的技术指标。我们可以将大量的指标可视化,以便决定我们未来的战略。在本文中,我们将探讨如何使用 TA-Lib 创建不同的技术指标。
Ta-lib 安装不同于其他 python 库,因为它不能使用 pip install 直接安装。正式上市。首先,我们需要访问链接,根据我们的 windows 版本下载 Ta-Lib 的 whl 文件。之后,我们可以使用 pip install 安装它,如下所示。
我们将致力于股票数据的技术分析,因此我们将导入数据库,除此之外,我们还需要导入一个 python 库来下载历史股票数据,以及将数据加载到数据框架中。我们还将使用 matplotlib 进行可视化。
我们将下载印度 NSE 上市公司“Powergrid Corporation”的历史数据。对于下载,我们将融资,然后使用 pandas 将下载的数据存储到数据帧中。
请求期间的库存数据
现在我们将开始使用 Ta-Lib 创建不同的技术指标。虽然有大量的技术指标,但我们只分析其中最重要的或者专业人士使用频率高的指标。
简单移动*均线(SMA)通过该范围内的周期数来计算选定范围内收盘价的*均值。
简单移动*均线
2.指数移动*均
指数移动*均线(EMA)是一种移动*均线(MA ),它对最*的数据点赋予更大的权重和重要性。也就是说,它通常被称为指数加权移动*均线。
指数移动*均值
3.*均定向运动指数(动量指标)
ADX 可以用来帮助衡量趋势的整体强度。ADX 指标是不断扩大的价格区间值的*均值。
ADX 动量指示器
4.布林线
布林线是一种统计图表,使用约翰·布林格提出的公式方法来描述金融工具或商品的价格和波动性。
布林线
5。相对强度指数
相对强弱指数是一种用于金融市场分析的技术指标。它旨在根据最*一个交易周期的收盘价来绘制股票或市场当前和历史的强弱。
相对强度指示器
这些是一些最常用的技术指标,我们可以用它们来可视化和分析市场趋势和未来预测
在本文中,我们看到了如何使用 whl 文件安装 Ta-Lib。之后,我们看到了如何使用 yfinace 加载数据并将其存储到 dataframe 中。然后我们使用这些数据进行技术分析,并使用 Ta-Lib 创建不同的技术指标。这只是对基本指标的介绍,在 Ta-Lib 下还定义了更多的指标,我们可以探索这些指标。
[## 下载股票数据并直观地展示出来
towardsdatascience.com](/downloading-stock-data-and-representing-it-visually-6433f7938f98) [## 使用 Plotly 构建蜡烛图:用于股票市场分析。
medium.com](https://medium.com/analytics-vidhya/using-plotly-for-building-candlestick-chart-for-the-stock-market-analysis-5305b48a5f75) [## 自动化机器学习
towardsdatascience.com](/automating-machine-learning-a486d365e423)
感谢 的阅读!如果你想与我取得联系,请随时通过 hmix13@gmail.com 联系我或我的 LinkedIn 个人资料 。 您还可以查看我的Github关于数据科学不同项目的简介。
原文:https://towardsdatascience.com/technical-challenges-for-ai-in-heavy-industry-7a77a5563e8c?source=collection_archive---------56-----------------------
插图由乔万娜·孔福尔蒂制作
决定已经做出了。我们正在寻找的公司已经决定实施新的数字战略,以节省成本并为未来的竞争业务奠定基础。在人工智能和工业物联网(IIoT)的帮助下,新 CEO 致力于数字化变革。在重工业中,有许多挑战需要考虑。我们在此调查的示例性矿业公司面临着许多工业部门的企业在进行数字化时面临的相同问题。
大多数公司都在努力吸引和保留合适的技术能力。这不仅影响到新系统的投资和新技术的采购,还影响到新的高潜力人才的聘用。毕业生进入这些行业的主要障碍是过时的专有技术,这需要耗时且昂贵的培训,并限制了未来的就业前景。结果,就业市场停滞不前,老一辈是唯一知道特定系统如何工作的人。
此外,传统工业工程文化盛行,这与计算机科学氛围截然不同。在机械和电子工程中,专利和秘密是需要保护的核心价值。在数据驱动的公司中,许多有价值的工具被共享,甚至在开源许可下免费赠送。从他们的角度来看,共享的好处超过了整个行业将数据保存在孤岛中的问题。他们通过其他独特的商业模式和专业知识赚钱。
人工智能的使用带来的结果与预期有很大的不同。很难收获某个过程 50%的改进,因为大多数度量已经很高了。可尝试的东西简直不多。这是因为物理定律是不变的,标准的优化方法已经到位,进一步的设备现代化是昂贵的。因此,2%的优化对公司来说是一个重大进步,可以通过实施人工智能解决方案来实现。
工业领域的一个常见说法是,它是独一无二的,与所有其他行业都非常不同。“你不能在这里这样做!”是一句经常听到的名言。重工业独立于真正的工程杰作的可理解的骄傲,实际上与其他工业有许多共同之处。重工业公司也以同样的方式优化他们的业务。即使在其他行业,安全问题较低,高商业价值不像重工业那样面临严重风险,但基本的经济原则仍然适用。
人工智能和数据科学方法在其他行业进行了测试,并取得了非凡的成果。这些技术节省了资金,并开启了新的商业机会。在旅程开始时,他们还面临着必须克服的巨大技术问题。当你看看 15 年前的亚马逊并检查 AWS 系统时,它们是弯曲的和临时拼凑的。无论如何都不适合关注安全的行业。但是现在,这些全球安装的系统显示出前所未见的可靠性。
数据的性质可能也是一个问题。它在处理和分析方面相当复杂,因为工业部门具有以高频率为特征的机器生成的数据,并且是以全自动的方式创建的。一方面,机器学习算法可以在拥有大量数据的情况下得到更好的训练。另一方面,公司必须克服非常具体的数据科学挑战和限制,同时缺乏处理此类数据的技能。
插图由乔凡娜·孔福尔蒂制作
当一位首席执行官希望在偏远和恶劣的环境中应用人工智能和物联网解决方案时,有一些独特的现实需要注意。矿山和其他生产设施可能位于交通不便的偏远地区。油田可能在海上,只能通过船运或空运才能到达。天气条件通常很差。网络和互联网接入在带宽和可靠性方面受到限制。恶劣的环境带来了特殊的挑战和限制。它们可以创造一个爆炸性的环境,产生气体和振动,或者处于水下或地下的高温或低温环境中。
更值得注意的是重工业使用的机器和系统。这些昂贵的设置是为了长期维持和活跃而创建的。通常,系统会随着时间的推移而增长。矿山或其他设施具有异构的机器园区和设置,并且它们没有协调的基础设施。这些机器不是用来连接互联网的。它们被设计成提供大量用于规划和控制的本地数据。这些系统大多需要实时控制。他们没有专门的接口来提取数据用于更一般的目的。
现有机器的一些技术要求也适用于新的 IIoT 和人工智能应用。它们需要能够在没有光源或没有电网的情况下工作,必须能够承受振动并且可靠。这些应用程序应该不会对生命造成威胁,并且能够应对各种各样的辍学和中断。
答人工智能系统需要高质量和高完整性的正确数据集来创建有价值的预测和优化操作。那么,如何着手设置新的传感器,改装旧机来获取这些数据呢?如何从现有系统中提取数据流,如何清理现有的数据流?虽然数字双胞胎对大规模制造和昂贵产品的设计很有吸引力,但在制造设施之外推广这项技术可能会更难。重工业在许多不同的配置下运行,它们使用来自不同供应商的设备。因此,需要一种适合 IIoT 的技术。
可用技术的一个例子是 IIoT 供应商 relayr 。该公司开发了巧克力棒形式的传感器来改装各种机器。它们被慕尼黑再保险公司以 3 亿美元的价格收购,并转型为设备即服务解决方案提供商。然而,这些新技术的问题仍然是系统集成。客户仍然需要证明所提供的技术是否符合需求,是否可以集成到现有的流程中。
插图由乔万娜·孔福尔蒂制作
经常发生的情况是,所需的数据来自过程控制和 mes 系统,而这些系统最初并不是为了分析的目的。过时的归档系统通常以不合适的格式存储数据。与此同时,信息的结构化和系统化程度很低。有时,由于某些人的参与,数据可能不准确。在一定程度上了解和理解该过程对于解释所有这些障碍是至关重要的。
很多技术流程需要实时决策和控制。在现货市场交易、时间紧迫的采购或事故处理中,业务流程需要快速决策。如何为传感器持续供电,以传输电网覆盖范围之外的孤立资产的状况和性能的关键任务数据?如何在没有现有移动网络的情况下传输所有需要的数据?如何在可能在最意想不到的时刻崩溃的不可靠网络中做出可靠的决策?
这些问题对于由工程师建造和运营的工业公司来说并不陌生。在数据工程中,传统工程中使用的原则同样适用。只是要达到的目标不一样。在这里,不间断的数据流是一个优先事项。实现这种高质量数据流的方法是不同的。传统工程师和软件/系统工程师有非常不同的培训和理念。这里有一些需要克服的文化差异。
有时,一些包含关键信息的数据可能会延迟很长时间才能到达系统。例如,实验室的分析结果几个小时后才为人所知。一些错误也会随着时间的推移而积累。如果一些传感器损坏,仍然需要确定一个模式并考虑它们,恢复丢失的数据。即使在生产使用中,模型也需要能够实时运行,并在并非过程的所有参数都精确已知的情况下返回建议或预测。需要使用许多技巧来重建和进行虚拟测量,以确保机器学习模型是可靠的,即使公司在不确定的条件下运营。
建立物联网基础设施的主要问题之一是电力供应。如今,随着低功耗 IIoT 设备的快速发展,很容易找到现成的组件作为起点。需要在获取的能量和快速发展的 IIoT 应用所需的数据量之间进行折衷。对于连接需求,新兴的边缘计算解决方案有助于克服这一问题。IIoT 和自动驾驶汽车依赖于设备本身内置的计算能力,而不是网络的带宽和接入。
专业工程师总是工业公司的起源。他们在使用数字和进行实验方面经验丰富。通过这种方式,选择成功标准、为模型定义特性或者设计 A/B 测试的过程变得更加容易。没有必要解释为什么在上线之前要进行测试。工程师习惯于根据数据而不是直觉做出决定。
一旦建立了物理基础设施,就必须讨论数据处理。数据具有金钱上的但无形的价值,公司不想与他人分享。公司看到了通过分享数据见解失去竞争优势的风险。有人担心数据可能会交叉污染。共享数据的好处,尤其是在供应链集成的情况下,往往超过对数据保护不足的担忧。利用更多可用数据的人工智能流程改进可以为整个行业以及单个公司带来更多价值。这种方法已经在许多其他部门得到了证明。这个数据池改善了人工智能系统的学习结果,从而改善了运营模式并降低了运营成本。对数据可能因网络攻击而丢失的担忧仍然存在,这影响了总体上共享数据的意愿,在云中也不起作用。安全和隐私是物联网项目面临的最大技术挑战。据 Gartner 称,这是由于缺乏熟练员工、复杂的供应商环境和不成熟的标准。
插图由乔万娜·孔福尔蒂制作
尽管有这些顾虑,创新还是被培养起来了,新产品的想法也出现了。在更广泛的基础上测试想法加速了开发,并被给定行业内的大量公司所接受。风险被分担了,每个企业的开发工作量也减少了。共享数据是匿名的,所以无法追溯到数据所有者。研究主导的倡议应该关注差别私有决策森林算法。这些算法最大限度地减少了对给定数据的查询次数。因此需要的计算能力更少,并且这些单独查询的敏感度更低。我们还看到,公司越来越开放地与原始设备制造商(OEM)交换数据,因为这对运营商来说更有利可图(例如,在飞机发动机的制造中)。
T 何全行业都在说,“什么东西都太贵了!一切都太复杂了!”不再有效。有很好的方法来开始数字化转型,并将有价值的 AI 和 IIoT 应用集成到每个公司。然而,有一些障碍需要克服。重工业中的旧机器和旧系统面临的具体挑战需要得到解决。首席信息官和其他数字传教士必须从业务回报和技术可行性的角度(从绝对值和回报期两个方面)对组织内的机会进行优先排序。全球研究和咨询公司 Gartner 建议大多数 AI 和 IIoT 项目应该在不到一年的时间内实现财务回报。
作为开始,采矿公司的首席执行官可以启动第一个项目和试验阶段。启动项目不一定需要高水*的技能、人力资源或现金支出。第一步可能包括使用开源工具构建人工智能解决方案。根据经验和概念验证,该项目可以迅速扩大规模,为整个公司带来即时价值。然而,有时技术概念验证并不能说服管理层在 IIoT 上花钱,因此考虑分配一些时间通过 IIoT 实施来证明价值。这也可能是一种选择,即接触现有的 AI IIoT 解决方案供应商,并与可靠的合作伙伴一起进入兔子洞。
插图由乔万娜·孔福尔蒂制作
原文:https://towardsdatascience.com/technical-countermeasures-to-deepfakes-564429a642d3?source=collection_archive---------25-----------------------
从Adobe Stock——蒂尔尼获得许可
这本书现已在亚马逊上架——https://www . Amazon . com/deep fakes-aka-Synthetic-Media-Humanity-ebook/DP/b0b 846 ycnj/
GAN 和 Deepfakes 已经不仅仅是研究课题或工程玩具。开始是作为一个创新的研究概念,现在它们可以被用作一种交流武器。Deepfakes 有许多积极的使用案例,但正如每一项创新一样,deepfakes 或人工智能生成的合成媒体可以被用作对个人和机构造成伤害的武器。
任何减轻恶意合成媒体负面社会影响的对策的主要目标必须是双重的。第一,减少对恶意 deepfakes 的暴露,第二,最小化它可能造成的损害。
为了捍卫真理和保障言论自由,我们需要一个多利益攸关方和多模式的方法。跨法律法规、*台政策、技术对策和媒体素养方法的协作行动和集体技术必须对恶意 deepfakes 的威胁提供有效和道德的响应。
在这篇文章中,我将分享一些对付 deepfakes 的技术对策。
我将在未来的帖子中分享我对立法、*台政策和媒体素养对策的想法。
由于 Deepfakes 是使用 AI 创建的,所以每个人的第一个倾向和一个更简单的假设是找到一个技术解决方案,作为一个技术问题的对策。技术对策并不简单,而且随着技术发展继续超过 AI 和 GANs 的能力,技术对策会立即显现出来。
deepfakes 的技术解决方案分为媒体认证、来源和检测。
媒体身份验证和出处工具可以验证内容的真实性,获取其来源,并识别其创建者。许多行业都在努力建立一套标准并协调认证、证明来源和识别权威来源的技术。这将需要一个像开放媒体联盟(AOM)这样的媒体标准机构和更广泛的行业合作伙伴来实现这个目标。
身份验证包括使用水印、介质验证标记、监管链记录和其他工具在介质的整个生命周期中验证真实性的解决方案。专家建议,认证是防止假媒体传播的最有效方法。
数字水印技术和媒体验证标记是商业上可获得的,并且被媒体组织和取证从业者广泛采用。这种技术可以在介质的整个生命周期中对其进行认证和跟踪,或者在终端验证证书。鉴于互联网上公开存在大量未经认证的媒体,媒体认证解决方案的覆盖范围总是有限的。尽管如此,媒体身份认证对广大受众还是有价值的,它为新闻广播等重要媒体提供了高度保证。
媒体认证工具还可以帮助*台收集信号,以对非权威内容采取行动。该动作可以包括添加标签或者甚至不允许*台上的内容。
出处解决方案可以提供有关媒体来源的信息,例如媒体过去发布或张贴的主要新闻和其他站点的列表。互联网上的反向图像搜索是检测单个伪造图像或缩略图的最有效和最简单的方法。必应或谷歌反向图片搜索就是一个可以用来确定媒体出处的工具的例子。如果 deepfake 是使用互联网上的另一张图片创建的,那么原始版本应该会出现在该搜索中。
由于逐帧搜索视频文件的固有挑战,反向视频搜索功能目前还没有广泛使用。
虽然今天媒体出处解决方案是可用的,但是由于因特网上可用的大量非结构化的、未适当标记的媒体数据,它们是有限的。
YouTube 内容 ID
YouTube 通过一个名为内容 ID 的系统,使版权所有者能够快速识别和管理他们的内容。YouTube 将根据内容所有者已经提交的数据库扫描任何上传的视频。只有符合特定标准的版权所有者才能访问 ContentID。获取 ContentID 的要求规定,所有者必须对他们上传到 YouTube 创作者社区的大量原创材料拥有专有权。对于如何使用内容 ID 有明确的指导原则。YouTube 持续监控内容 ID 的使用和争议,以确保创建者遵循这些准则。如果一个视频的内容与版权所有者的作品相匹配,他们可以决定如何处理这些内容,包括删除。对版权内容的错误声明也可能导致与 YouTube 的合作关系终止并撤销 ContentID。
Adobe 内容真实性倡议
Adobe 正在创建一个系统,为数字媒体提供出处和捕捉历史,为创作者提供一个工具来声明作者身份,并使消费者能够评估他们所看到的内容是否可信。内容真实性倡议 (CAI)创建了内容归属,随着不真实内容的激增,以及强大的编辑工具变得更容易访问,这对于在线透明度、理解和信任至关重要。CAI 旨在提供客观事实,说明内容是如何在没有判断的情况下产生的。Adobe 在最初的实现中侧重于图像,但打算指定一种统一的方法来创建、附加和显示任何媒体类型的属性数据。
微软乙醚媒体出处(AMP)
微软 AMP 是一个通过证明出处来确保媒体认证的系统。AMP 允许发布者为媒体实例创建一个或多个签名清单。这些清单存储在高度可伸缩和高性能的数据库中,以便从浏览器和应用程序中快速查找。舱单也可以由区块链这样的监管链分类账进行登记和签名。保管链解决方案的默认实现是使用 Azure Confidential Consortium 框架 (CCF)。CCF 使用硬件和软件来确保所有注册清单的完整性和透明度。AMP with CCF 将使媒体审计变得容易,并使媒体提供商联盟能够管理该服务。媒体真实性可通过浏览器中的可视元素传达给用户,指示 AMP 清单已被成功定位和验证。
FuJo 出处
2018 年 11 月,未来媒体与新闻研究所宣布,它将领导一个价值 240 万€的欧盟项目,出处,开发新的工具,以改善社交媒体上分享和接收信息的方式。出处的使命是为数字内容验证开发一个无中介的解决方案,从而给予社交媒体用户更大的控制权。它还将促进和鼓励信任、开放和公*参与价值观的社会共享。出处验证层将使用高级工具进行多媒体分析,如语义提升、图像取证和级联分析,以记录对内容资产的任何修改并识别类似内容。个性化的数字伴侣将满足最终用户的信息需求。出处将使用一系列监管解决方案,如区块链,以安全和可验证的方式记录内容创作者上传和注册的多媒体内容,或由出处社交网络监控器确定注册的多媒体内容。
Deepfake 检测通常包括利用多模式检测技术来确定目标媒体是否被操纵的解决方案。到目前为止,大多数检测研究和缓解工作都集中在自动 deepfake 检测上。使用 GANs 和其他技术,生成假冒数字内容的方法已经有了很大的改进。它呈现了一场比网络安全更糟糕的猫捉老鼠游戏[ 1 ]。
自动检测技术使用新的和创新的机器学习和人工智能技术来辨别媒体是否被操纵。
Deepfakes 经常生成人类很难注意到的伪像。研究人员提出了一些使用机器学习和人工智能的技术来识别这些不一致并检测深度假货。
2019 年,奥尔巴尼大学的 Yuezun Li 和 Siwei Lyu 提出了一种解决方案,通过检测面部扭曲伪影来识别 deepfakes [ 2 ]。他们的检测技术基于这样的观察,即当前的 deepfake 算法需要扭曲技术来匹配从源视频帧中提取的原始人脸。扭曲技术将在产生的 deepfake 中留下独特的伪像,这可以被卷积神经网络(CNN)充分捕获。
在一篇论文 fake catcher Detection of Synthetic Portrait video using Biological Signals 中,作者断言,隐藏在人像视频中的心跳、脉搏、血容量模式等生物信号可以用作真实性的隐含描述符,因为它们在虚假内容中既没有空间也没有时间保存[ 3 ]。
微软研究发表了一篇论文,观察被改变的脸作为检测的伪像融入到真实图像中。【 4 】。该技术将输入人脸图像转换为灰度图像,可以揭示输入图像是否可以分解为两幅图像的混合。该算法通过识别伪造图像的混合边界和真实图像的不混合来进行检测。
几种用于识别媒体中不一致性的技术可以用于 deepfake 检测。音频语音模式和嘴部动作之间的配音不一致、说话者特征和视觉面部特征(例如,声音变化,但是没有说话面部变化)不一致可以帮助获得深度伪造检测的置信度得分。
在论文《发现被操纵视频中的视听不一致(SAVI)》中,作者提出了通过算法来发现 deepfake 检测中检测到的场景类型之间的差异[ 5 ]。
普渡大学的视频和图像处理实验室发表了一篇论文,使用时间感知管道自动检测 deepfake 视频[ 6 ]。该算法利用卷积神经网络( CNN )来提取帧级对象特征。这些特征用于训练一个递归神经网络( RNN ),该网络通过发现视频是否受到操纵的时间不一致来学习分类。
生成对抗网络(GAN)正在推动图像处理的极限。甘在其生成的图像中留下特定的指纹,就像现实世界中的相机用其光响应不均匀模式的痕迹来标记获取的图像一样。甘指纹和分析数码相机独特的传感器通知(PNRU)可用于寻找视频的来源,并有助于检测[ 8 ]。
依赖于统计指纹和异常的算法检测技术可能会被有限的额外资源(算法开发、数据或计算)所欺骗。由于现有的媒体一代,deepfakes 严重依赖纯数据驱动的方法;他们容易犯语义错误。DARPA 的 SemaFor 计划专注于使用语义不一致进行检测。
来自伯克利的 Shruti Agarwal 和哈尼·法里德提出了一种软生物识别方法。这种法医技术对代表个人说话模式的面部表情和动作进行建模,用于深度伪造检测。虽然在视觉上并不明显,但这些相关性经常被制作的假视频的本质所违背。
深度神经网络(DNN)可以从媒体中学习基本特征,以创建通用分类模型。随着越来越多的新的 GANs 方法的出现,需要使用 GANs 创建图像的泛化能力。
在论文中,关于 GAN 图像取证的推广(Xuan et al .,2019),作者提出使用预处理的一组图像来训练取证 CNN 模型[ 10 ]。通过对真实和伪造的训练图像应用相似的图像级预处理,取证模型被迫学习更多的内在特征来对生成的真实人脸图像进行分类。在某些情况下,DNNs 在压缩媒体上的表现将优于传统的数字取证工具。
在这篇论文中,FakeSpotter 为识别人工智能合成的假脸建立了一个简单而稳健的基线[ 11 ]。作者提出,监控神经元行为可以作为检测假脸的资产,因为逐层神经元激活模式可能会捕捉到对假脸检测器来说很重要的更微妙的特征。
由于 deepfakes 是通过对抗性训练(主要是 GANs)创建的,因此 deepfakes 通过试图欺骗算法检测器并迭代结果变得更加可信。随着它们被引入新的检测系统,它们逃避基于人工智能的检测方法的能力将会提高。它提供了一个倾向于老鼠的“猫和老鼠”的过程,特别是在长期。
所有 deepfake 检测对策都集中在短期内解决问题,期望认证和来源技术将是 deepfake 问题领域的长期解决方案。
喜欢吗? 随便给我买本书
【1】https://www . Brookings . edu/research/fighting-deep fakes-when-detection-fails/
【2】https://arxiv.org/abs/1811.00656
【3】https://arxiv.org/abs/1901.02212
【4】https://arxiv.org/abs/1912.13458
【5】https://staff . fnwi . UVA . nl/t . e . j . mensink/publications/bolles 17 cvprwmf . pdf
【6】https://engineering . purdue . edu/~ dgueraco/content/deep fake . pdf
https://arxiv.org/abs/1812.11842
【8】https://www . researchgate . net/publication/329814168 _ Detection _ of _ deep fake _ Video _ Manipulation
【9】https://open access . the CVF . com/content _ CVPRW _ 2019/papers/Media % 20 forensics/Agarwal _ Protecting _ World _ Leaders _ Against _ Deep _ Fakes _ CVPRW _ 2019 _ paper . pdf
【10】【https://arxiv.org/abs/1902.11153】
【11】https://arxiv.org/abs/1902.11153
原文:https://towardsdatascience.com/technical-deep-learning-focused-articles-7ad3b0fe3b5a?source=collection_archive---------45-----------------------
照片由 Unsplash 上的 Dmitry Ratushny 拍摄
深度学习是机器学习的一部分,涉及利用人工神经网络进行计算机视觉、语音识别或自然语言处理任务。
深度学习的知识量是巨大的。尽管如此,从最简单的神经网络架构到最先进的复杂架构,仍然存在一些关键的基本概念和思想。
这篇文章将通过收集我以前写的文章来介绍一些基本的神经网络架构、技术、思想和算法。
卷积神经网络(CNN)是许多深度学习应用的基本构建模块。
通过实施精心设计的 CNN 架构,可以解决日常计算机视觉任务的解决方案,例如图像分类、对象检测、姿态估计、深度估计。
在我的学术和职业生涯中,我发现深入了解用于开发广泛使用的 CNN 架构的内部组件至关重要。
迁移学习和微调使得访问最先进的 CNN 架构变得更加容易。尽管如此,退一步回到最简单的架构和最早的深度学习研究论文,并理解我们今天所观察到的深度学习的最初构建模块是有益的。
下面的文章探讨了 AlexNet 的研究论文,还包括如何为图像分类任务实现一个 AlexNet CNN 架构。
“Alex net 赢得 ImageNet 大规模视觉识别挑战赛(ILSSVRC 2012 竞赛)后,首次在公共场合使用。正是在这次大赛上,AlexNet 展示了深度卷积神经网络可以用于解决图像分类。”
下面文章中 AlexNet 架构的实现是使用 Keras 和 TensorFlow 2.0 进行的。深度学习实践者非常熟悉的两个库。
[## 使用 TensorFlow 2.0+和 Keras 实现 AlexNet CNN 架构
towardsdatascience.com](/implementing-alexnet-cnn-architecture-using-tensorflow-2-0-and-keras-2113e090ad98)
下面这篇文章是介绍 AlexNet 架构的研究论文的细分。在这篇文章中,你会发现常见的机器学习术语的解释,如辍学,增强,规范化等。
除了理解神经网络架构的实现细节,对于机器学习从业者来说,了解研究人员当时所做的设计和实现决策背后的推理同样至关重要。
[## AlexNet 给深度学习世界带来了什么
towardsdatascience.com](/what-alexnet-brought-to-the-world-of-deep-learning-46c7974b46fc)
AlexNet 于 2012 年推出。
LeNet 论文展示了利用卷积层进行字符识别的可能性。它为 AlexNet、GoogLeNet 等网络以及今天几乎所有基于卷积神经网络的架构铺*了道路。
这篇研究论文值得一读,因为它介绍了一些技术和概念,如局部感受野、子采样、权重分配。
下面的文章介绍了使用 TensorFlow 和 Keras 实现 LeNet 架构。
[## 理解和实现 LeNet-5 CNN 架构(深度学习)
towardsdatascience.com](/understanding-and-implementing-lenet-5-cnn-architecture-deep-learning-a2d531ebc342)
下面的其余文章将更详细地探讨在 LeNet 研究论文中介绍的技术和概念。
[## (你应该)理解深度学习中的子采样层
towardsdatascience.com](/you-should-understand-sub-sampling-layers-within-deep-learning-b51016acd551) [## 理解卷积神经网络中的参数共享(或权重复制)
towardsdatascience.com](/understanding-parameter-sharing-or-weights-replication-within-convolutional-neural-networks-cc26db7b645a) [## 理解卷积神经网络中的局部感受野
towardsdatascience.com](/understand-local-receptive-fields-in-convolutional-neural-networks-f26d700be16c)
机器学习充斥着研究人员创造的技术和算法怪癖,这些技术和算法怪癖要么从神经网络中挤出最佳性能,要么控制某些神经网络的内部组件以实现最佳结果。
诸如辍学、批量标准化、l1/l2 正则化等技术在许多机器学习课程和课程中已经很常见。这些常见的技术在许多神经网络架构中频繁使用,因此从业者理解这些技术背后的直觉是至关重要的。
下面的文章涵盖了主要的机器/深度学习技术,包括如何使用 TensorFlow 和 Keras 实现它们。
[## 在 TensorFlow 和 Keras 中理解和实现辍学
towardsdatascience.com](/understanding-and-implementing-dropout-in-tensorflow-and-keras-a8a3a02c1bfa) [## 如何在 TensorFlow(Keras)中实现自定义正则化
towardsdatascience.com](/how-to-implement-custom-regularization-in-tensorflow-keras-4e77be082918) [## 正则化技术及其在 TensorFlow(Keras)中的实现
towardsdatascience.com](/regularization-techniques-and-their-implementation-in-tensorflow-keras-c06e7551e709) [## 神经网络中的批量标准化(代码)
towardsdatascience.com](/batch-normalization-in-neural-networks-code-d7c9b88da9f5) [## 解释了神经网络中的批量标准化(算法分解)
towardsdatascience.com](/batch-normalization-explained-algorithm-breakdown-23d2794511c)
深度学习领域具有压倒性的技术性,从业者很容易迷失在编程语言、库、开源项目和研究论文中。但是深度学习有一个有趣的部分,至少是它能得到的最有趣的部分。
自然风格转移(NST)是一种深度学习技术,它采用一个艺术作品的内容和另一个艺术作品的风格,并将两者结合起来,以创建两种不同艺术创作的独特外观。
更令人着迷的是风格转换技术是如何工作的。尽管 NST 的实际应用可能不会立即实现,但该算法的技术知识和创造力成分使得深度学习的这个主题值得探索。
[## 张量流中枢神经式传递
towardsdatascience.com](/neural-style-transfer-with-tensorflow-hub-dfe003df0ea7)
在这篇文章的结尾,我将对神经网络中的学习过程进行技术探索。梯度下降是许多机器学习从业者的入门话题。
“梯度下降是一种非常常见的优化算法,很可能是许多机器学习工程师和数据科学家引入的第一种优化算法。”
[## 理解梯度下降及其变体
towardsdatascience.com](/understanding-gradient-descent-and-its-variants-cf0df5c45478)
要联系我或找到更多类似本文的内容,请执行以下操作:
原文:https://towardsdatascience.com/technical-indicators-on-bitcoin-using-python-c392b4a33810?source=collection_archive---------10-----------------------
阿列克西·里斯在 Unsplash 上的照片
谈到交易,有很多种技术可以用来寻找最佳投资时机。有些人可以看看财务状况,看看幕后是否有价值。其他人可能会看每日新闻,观察它如何影响当前价格。另一组可能实际上观察过去的价格变动,并试图辨别可能的模式来确定未来的价格变动。
技术分析关注观察过去价格和运动来预测未来价格的群体。通过利用技术分析,我们可以从一个元素的价格历史中得出许多不同的模式。过去半个世纪发展起来的数学公式已经被用来从股票的价格和交易量历史中推导出新的价值。这些公式的返回值就是我们所说的技术指标。
在交易比特币这种资源的时候,除了它的价格历史和成交量,没有太多可以分析的。如果你看一下它的 雅虎财经页面 并与任何一只 随机股票的页面 进行比较,你会发现它少了一些财务信息。这是因为比特币不是公司而是货币。比特币没有资产负债表、损益表、等等。
在没有基本面信息的情况下,我们可以在交易比特币时利用技术指标。如果我们想要向交易算法或机器学习预测模型添加更多变量,那么我们可以向数据集引入更多特征(技术指标),而不是通常的价格和交易量历史。当利用机器学习模型时,这种策略可能有助于预测未来价格。
接下来,我们将利用 Python 的多个库,用 Python 编写这些技术指标。
在这里注册一个中级会员,可以无限制地访问和支持像我这样的内容!在你的支持下,我赚了一小部分会费。谢谢!
我们将尝试的技术指标有:
这些指标看起来很简单,我们可以开发一个函数来创建新的值和特性,并将其引入到我们的数据集中。
为了开发这些功能,让我们首先导入必要的库,同时下载比特币的最新价格历史。价格历史的另一个选项是使用金融数据 API,如 EOD 历史数据 。注册是免费的,你可以获得大量的金融数据。披露:我通过上面的链接从任何购买中赚取一小笔佣金。
运行这段代码时,请看一下熊猫数据帧:
显示 BTC 价格和交易量历史的数据框架
之后的另一个步骤是将索引转换成日期时间格式。这是一个简单的过程,只需要几行代码:
通过运行这些代码行,可视化该数据集中的任何列或要素将变得更加容易。
有了可供我们操作的数据,让我们从编写一些简单的函数开始,这些函数将给出我们需要的技术指标值。(这些指标的公式可以在技术指标的链接中找到)。
一旦我们在适当的列上运行这些函数,我们将从这些技术指标中获得一组新的特性。
不错!我们能够成功地进行特征工程,并将这些新数据引入到我们的数据集中。
但是,我们如何验证这些值呢?嗯,有在线查看的选项,例如带有指标的股票图表,它会向我们显示特定时间的正确值。一种选择是将我们的价值观与雅虎财务图表进行比较。
雅虎财经为 BTC 制作的图表
当我们将我们的技术指标值与图表进行比较时,我们可以看到并不匹配。可能是函数有问题,或者我们漏了一些计算。不管怎样,我们的功能并没有像我们希望的那样运行。
我们将何去何从?我们可以回去试着修改我们的代码,或者我们可以尝试一种更实际的方法。这种方法将使用已经为我们编写和提供的技术分析库。大多数时候,使用 Python 库进行这类计算比我们自己编写函数要好。
我们将使用的库简单地称为— ta 。您可以单击下面的链接,了解如何开始使用该库的说明:
[## 欢迎来到 Python 文档中的技术分析库!-技术分析库在…
python.readthedocs.io 中的技术分析库](https://technical-analysis-library-in-python.readthedocs.io/en/latest/)
这里提供的函数比我们创建的函数更加通用,所以让我们使用它们。
运行上述代码后,我们将得到下面的数据框架:
我们的价值观与助教图书馆的价值观相比
我们可以看到,我们创造的价值与 TA 的价值有很大的不同。我们还可以用雅虎财经的图表再次检查这些值的有效性,并看到它们确实匹配。
在尝试创建我们自己的技术指标函数之后,我们发现了一个更好的方法,那就是导入一个技术分析库。一般来说,最好使用 Python 库,而不是你自己编写的函数,因为它们通常比我们可能编码的任何东西都要优化得多。该库还为我们提供了添加更多指示器的选项,而不是试图自己编码。最后,我们能够练习编码出一些简单的算法和函数,尽管它们没有我们希望的那么精确。
一旦我们构建了这个充满新功能和价值的新数据框架,我们现在就可以将这些额外的数据输入到机器学习模型中。这些数据是易于理解的熊猫格式,可用于潜在的时间序列预测模型。希望我们可以通过使用这些额外的技术指标来改善预测结果。
在 Twitter 上关注我:@Marco_Santos
[## 马克桑 93/BTC-预报员
github.com](https://github.com/marcosan93/BTC-Forecaster) [## 欢迎来到 Python 文档中的技术分析库!-技术分析库在…
python.readthedocs.io 中的技术分析库](https://technical-analysis-library-in-python.readthedocs.io/en/latest/)
原文:https://towardsdatascience.com/technical-pattern-recognition-for-trading-in-python-63770aab422f?source=collection_archive---------8-----------------------
注来自《走向数据科学》的编辑: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
我刚刚出版了一本新书《Python 中的新技术指标》。它对复杂的交易策略进行了更完整的描述和补充,Github 页面致力于不断更新代码。如果你对此感兴趣,请随时访问下面的链接,或者如果你喜欢购买 PDF 版本,你可以在 Linkedin 上联系我。
* [## 交易策略之书
www.amazon.com](https://www.amazon.com/gp/product/B09919GQ22/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=B09919GQ22&linkCode=as2&tag=sofien-20&linkId=bc5df3f6ab0f3af2df79641c56b949ba)*
模式识别是搜索和识别具有*似相似结果的循环模式。这意味着当我们设法找到一个模式,我们有一个预期的结果,我们希望看到并通过我们的交易采取行动。例如,头肩顶形态是典型的技术形态,预示着趋势即将反转。文献对这一著名构型的预测能力有不同看法。在本文中,我们将讨论一些奇特的目标模式。我说客观是因为它们有清晰的规则,不像经典的模式,如头肩底和双顶底。我们将讨论由 Tom Demark 创建的三种相关模式:
关于其他技术交易模式的更多信息,请查看下面的文章,这篇文章展示了 Waldo 配置,并对其中一些进行了回溯测试:
* [## 沃尔多在哪?
medium.com](https://medium.com/@kaabar.sofien/wheres-waldo-67f73baa0929)*
TD 差分组已创建(或发现?)以便找到短期反转或延续。他们应该通过给我们一个额外的信念因素来帮助确认我们的偏见。例如,假设你预期美元兑加元在未来几周将会升值。你有自己的交易理由,你发现在更高的时间框架内有一些模式似乎证实了你的想法。这肯定会让你在交易时更舒服。下面是触发三种不同模式的条件汇总表。
三种价格模式的条件摘要。(图片由作者提供)
在我们开始单独介绍这些模式之前,我们需要从差异群体的角度来理解买卖压力的概念。为了计算购买压力,我们使用以下公式:
为了计算卖出压力,我们使用以下公式:
现在,我们将逐一介绍它们,首先展示一个真实的例子,然后用 python 编写一个搜索它们的函数,最后我们将创建基于模式的交易策略。值得注意的是,我们将回测 M5 棒线的非常短期的范围(从 2019 年 11 月开始),每笔交易的买卖价差为 0.1 点子(因此,每轮成本为 0.2 英镑)。
这种模式试图寻找短期趋势反转;因此,它可以被看作是小幅调整和盘整的预测指标。下面是一个 TD 差异模式的蜡烛图的例子。
该模式的示例。注意反应的短期趋势。(图片由作者提供)
如果我们想用 Python 编写条件代码,我们可以有一个类似于下面的函数:
买入(做多)触发器:
卖出(做空)触发器:
现在,让我们在尊重风险管理系统的同时回测这个策略,这个系统使用 ATR 来设置目标止损和止盈订单。我发现,通过使用 4 倍 ATR 的止损点和 1 倍 ATR 的目标点,算法可以产生最佳的利润(无论是正的还是负的)。很明显,这明显违反了基本的风险回报比规则,然而,请记住,这是一个系统化的策略,以牺牲风险回报比为代价,寻求命中率的最大化。
提醒: 风险回报比(或回报风险比)衡量*均来说,你愿意承担的每一个风险,你期望得到多少回报。例如,你想以 100 美元买入一只股票,你的目标是 110 美元,你的止损单是 95 美元。你的风险回报比是多少?很明显,你是在拿 5 美元冒险来获得 10 美元,因此 10/5 = 2.0。因此,你的风险报酬率是 2。通常建议比值始终高于 1.0,最佳值为 2.0。在这种情况下,如果你交易相等的数量(大小),并用你预期收入的一半冒险,你只需要 33.33%的命中率就能达到盈亏*衡。一个好的风险回报比将减轻追求高命中率的压力。
欧元兑美元-道指差异模式的信号图示例。(图片由作者提供)
10 种主要货币对的 TD 差异策略的权益曲线。(图片由作者提供)
看起来它在澳元和欧元上运行良好,但在一些中期表现不佳。此外,除了澳元兑美元、GBPUSD 元和美元兑加元之外,股票曲线的总体趋势是向上的。对于只基于一种模式的策略来说,如果我们添加其他元素,它确实会显示出一些潜力。如果我们看一下荣誉奖,澳元兑加元的表现指标还不错,命中率高达 69.72%,预期每笔交易为 0.44 美元。
如果你也对更多的技术指标和使用 Python 创建策略感兴趣,那么我关于技术指标的畅销书可能会让你感兴趣:
* [## Python 中的新技术指标
www.amazon.com](https://www.amazon.com/gp/product/B08WZL1PNL/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=B08WZL1PNL&linkCode=as2&tag=sofien-20&linkId=e3cb9716bb6a07cf6c8b9fb585412b07)*
这种模式寻求短期趋势的延续;因此,它可以被视为一个趋势何时足够强劲以继续下去的预测器。这是有用的,因为我们知道,趋势是我们的朋友,通过加入另一个朋友,我们可能有更多的机会制定有利可图的策略。让我们检查条件以及如何编码:
该模式的示例。(图片由作者提供)
买入(做多)触发器:
卖出(做空)触发器:
欧元兑美元-道指反向差异模式的信号图示例。(图片由作者提供)
TD 反向差异策略在 10 种主要货币对上的权益曲线。(图片由作者提供)
看起来它在 GBPUSD 和欧元上运行良好,但在一些中期表现不佳。权益曲线的总体趋势没有第一种模式那么令人印象深刻。如果我们看看一些荣誉提名,GBPUSD 的表现指标也不算太差,命中率高达 67.28%,预期每笔交易为0.34 美元。
这种模式也试图寻找短期趋势反转,因此,它可以被视为预测小的修正和巩固。它类似于 TD 差分模式。以下是 Python 函数遵循的条件。
该模式的示例。(图片由作者提供)
买入(做多)触发器:
卖出(做空)触发器:
欧元兑美元-道指反差异模式的信号图示例。(图片由作者提供)
TD 反差异策略对 10 种主要货币对的权益曲线。(图片由作者提供)
看起来远不如前两个策略给人的印象深刻。权益曲线的总体趋势是混合的。如果我们看看一些荣誉提名,欧元兑新西兰元的表现指标也不算太差,命中率最高为 64.45% ,预期每笔交易为0.38 美元。
请记住,我们有如此高命中率的原因是我们在回溯测试开始时强加的糟糕的风险回报比。目标在 1x ATR,止损在 4x ATR,命中率需要足够高,以补偿更大的损失。
我总是对模式着迷,因为我相信我们的世界包含一些可预测的结果,尽管从噪音中提取信号极其困难,但我们面对未来所能做的就是做好准备,准备到底是什么?它预测可能发生的情况,以便我们在它们到来时做好准备。在 《后验之书》 中,我讨论了更多关于烛台的图案,揭开了关于烛台图案的一些主流知识。
我总是建议你做适当的回溯测试,了解任何与交易相关的风险。例如,上述结果并不具有很强的指示性,因为我们使用的价差非常具有竞争力,可能被认为很难在零售交易领域持续获得。然而,有了机构买卖价差,就有可能降低成本,比如系统的中频策略开始盈利。
图片来自 Pixabay 的 msandersmusic
原文:https://towardsdatascience.com/techniques-for-handling-imbalanced-classification-datasets-5ee58b0b5e7a?source=collection_archive---------31-----------------------
在本文中,您将了解不*衡数据集以及分类数据集不*衡时出现的问题。了解常用技术,如过采样、欠采样、生成合成数据以处理不*衡数据集,最后,将所有概念应用于不*衡数据集。
在 Unsplash 上 Azzedine Rouichi 的照片
不*衡数据集是指一个类与其他类相比具有不成比例的观测值。数据集中的每个类并不具有相等的表示,不*衡会导致偏斜的类分布。
你必须运行分类算法来区分良性肿瘤和癌性肿瘤。良性肿瘤有 20,000 个观察值,而癌性肿瘤只有 100 个观察值;这导致数据集不*衡。
当观察结果的预测是良性时,不*衡数据集的影响是可见的,而它实际上是导致假阴性的癌性肿瘤。
精确度是分类最常见的性能度量,但避免使用精确度作为性能度量,因为它可能会产生误导,尤其是在不*衡数据集的情况下。当我们在数据集中有不成比例的类表示时,模型可能会预测所有预测的大多数类的值,并实现高分类准确性,也称为准确性悖论。
为了确保一个模型在现实世界中运行良好,需要将假阳性和假阴性保持在最低限度。精确度有助于计算假阳性的成本,而回忆有助于理解假阴性的成本。因此,精确度、召回率和 F1 值是衡量模型性能的更好指标。
作者图片
SMOTE 使用最*的 k-邻居生成合成数据(图片由作者提供)
您将利用保险交叉销售的不*衡数据集来构建物流回归,以预测现有客户是否会对车辆保险感兴趣。
导入所需的库并将数据读入数据框
显示数据集信息
将分类变量转换为指示器列
我们有一些分类变量,如性别和车辆损坏,需要转换为虚拟变量或指标变量。这里,我们通过将 drop_first 参数设置为 True 来移除第一层,以从 k 个分类层中获得 k-1 个虚拟层。
查看数据
创建特征和目标变量
查看目标变量分布
检查目标变量分布,以检查数据集是否*衡。
数据集是不*衡的,因为我们对不感兴趣购买车辆保险的客户的观察多于对购买车辆保险感兴趣的客户。
应用标准标量对特征进行标准化
将数据集分为训练和测试
对不*衡的训练数据集运行逻辑回归,显示准确度、精确度、召回率和 F1 分数。
绘制混淆矩阵
不*衡数据集上使用逻辑回归的混淆矩阵
在不*衡测试数据集上检查准确度、精确度、召回率和 F1 分数。
你可以看到我们有相对较好的准确率,召回率和 F1-score 非常糟糕。这证明了准确性悖论,其中准确性不是模型性能的良好度量。检查精确度、召回率和 F1 值是个好主意。
应用 class_weight="balanced" 将根据课程频率自动调整权重。类别权重与输入数据中的类别频率成反比。
类权重=数据集中记录总数/(类总数类内样本数)*
你可以看到准确性下降了,但我们有更好的 F1 成绩。
应用 class_weights 后显示混淆矩阵
混淆矩阵将 class_weights 应用于不*衡数据集
安装 imblearn 库,使用不同的技术处理不*衡的数据集
在这里,您将使用一个类来执行随机欠采样,它通过随机选取有替换或无替换的样本来对大多数类进行欠采样。
比较原始数据集和使用随机欠采样生成的训练数据集之间的观察数量
欠采样或欠采样多数类
使用随机欠采样的性能度量
使用随机欠采样的混淆度量
随机过采样通过替换随机选取样本来对少数类进行过采样。您可以将采样策略指定为参数,以对数据集进行重新采样。
比较原始数据集和使用随机过采样生成的训练数据集之间的观察次数。
过采样或上采样少数类
使用随机过采样器的性能度量
SMOTE 通过从少数类中抽取随机样本来执行过采样,找到其最*的 k 个邻居,这是一个可以指定的参数。在随机选择的数据点及其最*的 k 个邻居之间选择一个点,以生成合成数据。
比较原始数据集和使用 SMOTE 生成的训练数据集之间的观察次数。
应用 SMOTE 生成合成数据
使用 SMOTE 的性能指标
一个类的观测值明显多于其他类的数据集会产生不*衡数据集,从而扭曲测试结果。有不同的技术,如过采样少数类、欠采样或下采样多数类、成本敏感技术或使用 SMOTE 创建合成数据。
应用不同技术处理不*衡数据集的类的观察数量比较(图片由作者提供)
处理不*衡数据集的不同技术的性能指标比较(图片由作者提供)
原文:https://towardsdatascience.com/telecom-customer-churn-prediction-using-smote-powered-machine-learning-a7354d54380d?source=collection_archive---------42-----------------------
照片由 Nick Fewings 在 Unsplash 上拍摄
本博客和项目由 维谢哈·巴塔查尔吉 (纽约哥伦比亚大学商业分析硕士)& 皮尤什·贝里(SCMHRD 浦那商业分析 MBA)。
T 电信服务行业正在迅速成为最难生存的市场之一。最初只专注于通信技术的行业如今已经过渡到了云技术时代。如果有的话,这给该行业现有的困境增加了更多压力,因为今天的公司需要迅速调整其业务模式,以满足物联网、智能设备和增强现实等领域的客户需求。的确,数字化转型帮助电信公司从灭亡走向繁荣。
照片由尼克·费因斯在 Unsplash 上拍摄
生存是关键,所有电信公司都必须更好地了解他们的客户,并限制(如果不能防止的话)所谓的“流失”现象的发生。有了正确的方法来分析客户流失,公司就可以发现客户服务政策甚至营销和定价策略中可能存在的问题。
客户获取成本 (CAC)由营销费用、广告费用、销售费用等构成。并且一般总计为(CRC)的价值的 5 倍。因此,将高价值客户留在国内非常重要。
对于客户因非自愿原因流失的情况,电信公司无能为力,但公司完全有理由尝试识别自愿流失 T2 的客户,并为他们提供优惠,防止他们离家出走。
为了预测可能流失的客户,我们利用了公开可用的数据集“IBM 电信客户流失” 。
该数据集具有以下特征以及指示特定客户是否已经从该公司的服务中流失的目标变量:
在桌面上完成的可视化
一轮快速的探索性数据分析(EDA)将我们引向左侧的图表,该图表向我们展示了各行业中与客户流失相关的一个常见问题;阶层失衡。一类数据的总数远小于另一类数据的总数是机器学习中的一个问题。IBM 电信客户流失数据集的“未流失”类别代表率过高(73%),而“流失”类别代表率过低(27%)。
但是阶级不*衡的问题是什么呢?为什么一个分析师在创建预测模型的时候要如此担心呢?
事实证明,大多数用于分类的机器学习算法都被隐式地调整为在数据类别*均分布的情况下工作得最好。在类别分布不均匀的情况下,得到的分类模型表现出较差的性能,特别是对于代表性不足的类别,也称为少数类别。在我们的电信客户流失预测案例中,少数族裔或已经流失的客户是更重要的类别,而的高错误分类错误 会破坏首先识别他们的目的。**
SMOTE(合成少数过采样技术) 工作原理是对数据的少数类进行过采样。有几种方法可以做到这一点,比如简单地复制少数数据样本,但 SMOTE 通过创建新的原始样本来工作。****
简而言之,新值是通过考虑位于 特征空间 中少数类的随机选择样本附*的样本而创建的。使用一条线来连接这些样本,然后通过在这条线上随机选择一个点来创建一个新值。****
SMOTE 的图示
用于 SMOTE 应用和用于流失预测的数据预处理的 R 代码:
使用 ezgif 创建的 GIF
当涉及到处理多类分类和类不*衡分类问题时,通常的性能度量如可能会产生误导。通常,在类别不*衡数据的情况下,由于其中一个类别的过度表示,精度被过度报告。
在这种情况下,科恩的 Kappa 统计是一个方便的指标。Kappa 统计量可以很好地处理上述两种情况,并提供一个真实表示模型性能的稳健值。
科恩的卡帕定义为:
使用 MS Word 上的公式创建器创建的公式
其中 po 为观察一致,pe 为预期一致。简而言之,当与根据每个类别的频率随机猜测的分类器相比较时,该统计有助于理解我们的分类器的性能。因为 Cohen 的 Kappa 考虑到了分类器之间偶然发生一致的可能性,所以它给出了模型性能的更加健壮的视图。****
根据 兰迪斯和科赫(1977) ,对科恩的 Kappa 的解读方式如下:
我们使用 R 中的以下代码来生成 Kappa 统计数据和其他指标,如准确性、ROC、AUC 等。评估分析的最佳模型。可以在 CARET 库下选择各种模型进行进一步分析。
看一下在这种情况下使用的模型的准确性和 Cohen 的 Kappa 统计,获得了以下数据。
在 SMOTE 之前和之后,比较各种模型的模型精度和 Cohen 的 Kappa 统计量
注意,在实施 SMOTE 之前,模型的精确度相当高。但是考虑到阶级的不*衡,Kappa 提出了不同的建议(低值)。****
实施 SMOTE 后,模型的 Kappa 增加,现在属于上述“基本一致”的范围。还要注意精度的提高。****
现在,让我们来看看上面使用的各种型号的 接收机工作特性曲线 (ROC 曲线)。首先,我们将看到没有实施 SMOTE 的模型的 ROC 曲线。
无 SMOTE 模型的 ROC 曲线
现在,实施 SMOTE 后模型的 ROC 曲线为:
SMOTE 后模型的 ROC 曲线
从上述 ROC 曲线中可以注意到,在实施 SMOTE 后,曲线下的面积显著增加。****
因此,为了电信公司的客户流失预测模型的目的,我们使用随机森林模型,它提供了最高的精确度、ROC 曲线下的面积,以及最重要的 Kappa 统计数据。****
在这个媒体故事的开头提到了一个事实,即客户获取成本(CAC)是客户保留成本(CRC)的 5 倍。记住这一点,我们可以使用这个模型来分析和设计客户保持策略(感谢我们的低错误分类错误!).使用有针对性的营销活动,优惠和策划计划可以推出,以防止这些客户翻腾。
因此,当生活给你不均衡的数据时,击垮它,和 Kappa 统计交朋友!
邀请您查看 GitHub 回购,了解上述分析!
****** [## visha kha-b18/电信客户流失
github.com](https://github.com/vishakha-b18/Customer-Churn-in-Telecom)
在 LinkedIn 上与我们联系!
[## vishakha Bhattacharjee——助教——哥伦比亚商学院| LinkedIn
www.linkedin.com](https://www.linkedin.com/in/vishakha-bhattacharjee/) [## Piyush Beri 工商管理硕士商业分析-SCMHRD,浦那
www.linkedin.com](https://www.linkedin.com/in/piyush-beri/)******
原文:https://towardsdatascience.com/telephone-paintings-a7ef662f50a9?source=collection_archive---------39-----------------------
斯佩拉福特的电话绘画/(默兹曼施截图)
在 Instagram 出现之前很久,一位名叫的园艺家和包豪斯艺术家拉斯洛·莫霍利-纳吉(1895-1946)就用手机进行艺术创作。甚至在电话出现之前。但是如果没有这种远距离交流的工具,他的作品“电话图片”就不可能出现。
这个系列是怎么创作出来的?在当时常见的艺术过程中,艺术家通过触摸、用刷子、用锤子等方式直接创作出艺术品。但是莫霍利-纳吉使用了当时完全不同寻常的东西:一部电话:
1922 年,我通过电话向一家标牌厂订购了五幅搪瓷画。我面前有工厂的颜色图表,我在绘图纸上画了草图。在电话的另一端,工厂主管把同样的纸分成方块。他把听写的图形记在正确的位置上。(这就像通信下棋)…因此,这些照片没有“个人触摸”的优点,但我的行动正是针对这种过分强调。(来源:拉斯洛·莫霍利-纳吉,《新视野》(1947),引自《 电话绘画:挂上莫霍利 》作者路易·卡普兰)
莫霍利-纳吉用这个项目批评了艺术中“个人风格”的古典冲动。在这里,两个参与者制作了艺术品:艺术家按照他的指示,工厂按照他们的指示。
这位包豪斯艺术家甚至放弃了在自己的作品上签名:
我把带有必要数据的数字和字母放在画布的背面,就好像它们是汽车、飞机或其他工业产品一样。(资料来源:莫霍利-纳吉,同上)
这位艺术家消失在他的作品后面。在这种情况下,交流是艺术创作的方式。
一位数字艺术家兼游戏设计师 史蒂文·西奇 和视频艺术家 蒂莫西·托马森 用通讯的方式表达了他们对莫霍利-纳吉的敬意,标题同为“电话绘画”:
[## 电话绘画
spelafort.itch.io](https://spelafort.itch.io/telephone-paintings)
随着游戏类型“无尽的卷轴”,你正沿着一个永恒的程序生成的艺术画廊前进,有各种光线条件,一些建筑工地工具和墙上的绘画。这些画都有标题和描述。
而一切都是利用生成性对抗网络做出的。在这种情况下,艺术不是由一个叫生产的艺术家创造的,而是由 GANs 之间的交流创造的:
1。艺术品创作:StyleGAN。 这里用了一个 StyleGAN(或者 StyleGAN2?)模特,受过艺术品方面的训练。我想知道是阿甘还是维基亚特训练的。更多信息请点击此处:
[## 数据集的不可背叛性
towardsdatascience.com](/the-non-treachery-of-dataset-df1f6cbe577e)
2。对象检测:(YOLOv3) 对于模式识别和对象检测,作者使用了 YOLO 网络(你只看一次,在版本 3 )。该网络在抽象图像中发现物体(这已经是一个挑战——不仅对机器,对人类也是如此)。
3。讲故事(GPT-2) open ai 的 NLP 框架用它来提示作者和背景的简短描述。新艺术家的传记是在一个复杂的过程中创建的,包括微调博物馆描述的 GPT-2,以及程序性的名称生成。这就是为什么结果是一致的,鼓舞人心的,令人信服的。
我想,如果你愿意,使用 GPT-3 甚至可以生成一个博物馆指南,将作者组合成一个概念展览。
艺术体验不是即时的(现在实时使用 GANs 仍然是未来的事情),大约有 3000 件艺术作品被生成并随机呈现——如果你在这里足够长的时间,你可能会偶然发现已经看过的绘画。但是增加新作品的可能性是存在的——半永恒是可能的。
在展览中前进,你没有太多的选择,但要观看无止境的艺术展示,放大画面并阅读描述。但是,这正是你参观博物馆的目的。
如果你准备好投入进去,接受这出戏,你将享受独特艺术的快乐。因为这是你瞥见由人工智能生成的另一个现实的唯一机会。
这里只是我喜欢的一些艺术品和描述。
斯佩拉福特的电话绘画/(Merzmensch 截图)
请注意,德国医生和艺术收藏家 Ona Tymes,“用色彩的力量揭示了本体的潜在结构”。
斯佩拉福特的“电话绘画”(Merzmensch 截图)
如果你真的想,你会看到蓝猫。但这里有一个问题,这是否只是另一个盲目崇拜。
斯佩拉福特的“电话绘画”(Merzmensch 截图)
艾不仅观察到了“城市与工业景观的交汇点”,还观察到了“椅子上的一只猫”(大概是猫在物体探测 YOLOv3 中独领风骚,就像谷歌梦境中的恶犬)。
然后是这个:
斯佩拉福特的“电话绘画”(Merzmensch 截图)
斯泰西·莫亚似乎是个奢侈的家伙。他相信“找到上帝”并成为“圣经中的第一人称叙述”。然而:“注意猫的倒影”。对我来说,这个头看起来像猫眼。
Every time you explore a new artwork, it will soon disappear, with its visuals, background story, and artist. Trascience of art and all things, “mono no aware” (物の哀れ).
Spelafort 的电话绘画是对过去的 lászlo Moholy-Nagy 的美丽致敬,也是对未来的展望。以新的方式对生成艺术、阐释、玻璃透镜状的审美体验是艺术的未来和存在。
您将在此处找到 Unity 和 GAN 驱动的虚拟图库(在您的浏览器中运行):
[## 电话绘画
spelafort.itch.io](https://spelafort.itch.io/telephone-paintings)
你会发现哪些新世界和艺术品?
原文:https://towardsdatascience.com/television-and-data-science-its-complicated-2c6f7d62c638?source=collection_archive---------54-----------------------
衡量电视广告的效果可能是数据科学家工作的一部分
当我第一次开始寻找数据科学工作时,我非常确定我会在一家无聊的工程公司结束。我将不得不忘记我作为一名通讯科学家所学到的东西。
我越是高兴地发现有几个适合沟通和数据科学家的领域,比如为受众研究做因素分析。另一个用例似乎更有趣。虽然,我现在不急着填。
在我为几家媒体机构工作期间,我偶尔会看一下我们的客户为电视广告支付的账单。德国一家大型知名频道对十几秒钟的电视广告收费至少 5 位数。
难怪,广告商想要评估电视广告的效果,并将其与成本相匹配。
如果我们只有一个电视频道,只有电视作为一个频道,只有一个电视节目,只有一种格式,等等。我们只需看看电视广告前后的销售情况。然后从之后的利润中减去之前的利润,再减去广告费用,就得到我们从广告活动中获得的利润。
但是我们还要考虑几个变量。
我无法描述最终计算的所有方面。但其中之一,与我们生活的数字化有关,我想谈谈。它与电子商务业务有关。
虽然还没有证明这是一个 100%可靠的方法,但是有一些统计模型可以帮助测量电视广告引起的网站流量的上升。
主要的假设是,在看完一个电视节目后,一些用户在网上搜索品牌、产品、公司或其他任何东西,或者通过输入直接访问网站。当然,最后一个要求你有一个短而吸引人的网址。
因此,在该节目播出后,搜索量会激增。一家电子商务公司很乐意接受这些额外的点击,甚至可能是线索和转换,并将它们与完整的客户旅程相匹配。
电视广告被认为是提升品牌知名度的一种方法。然而,一个特定的点,尤其是如果顾客看了 X 次,或者已经有了另一个品牌的接触点,触发网上购买的决定也不是完全不可能的。
为了将电视广告数据和用户数据整合在一起,并从中得出合理的结论,数据科学小组开始发挥作用。
时间序列是最流行的(老实说,也是我唯一知道的)进行这种分析的方法。
你把网站流量(或线索)放在时间轴旁边,然后标记电视广告的时间戳。每次电视广告播出后,你应该会看到曲线上升,但会有一点延迟。这一次,人们需要接触他们的手机或台式机。
看起来是这样的:
时间轴上的点击和斑点
你在问自己,为什么你还需要在这里进行分析?就拿即时时间戳之后的点击量来说,对吗?
号码
出于我将要提到的许多原因,你们将面临一个基本问题的挑战:
哪些点击实际上受到了点的影响?
上升趋势不会急剧下降。它正在逐渐变回黑子之前的状态。你必须模拟低迷曲线,以获得所有相关点击。否则,你可能会高估或低估电视广告的效果。
时间轴上的点击和斑点:衰退曲线。
这就是为什么你想使用回归模型。此外,在建模过程中,你或你的数据专家必须确保一系列额外的独立变量及其影响被正确地考虑在内。
电视观众的日常生活,比如上班、吃饭、放松等等。影响他们为广告产品牺牲时间的意愿。这些客观因素包括:
-白天
-星期几
-频道及其受欢迎程度
-光斑的长度
-电视节目,现场集成在
-周围或其他频道上的任何重大事件
同样的光点表现不同,取决于这些变量的存在。
还有另外两个令人头疼的问题。
首先,一些点可以彼此靠得很*,它们的效果会重叠。你需要把效果分开。
重叠斑点
第二,很明显,你不能认为所有的点击都是随机产生的。即使不看电视广告,用户也会来到你的网站。巧合的是,他们中的许多人在现场运行后就这样做了。
独立于电视广告的用户数量被称为基线。你需要计算你的基线及其与变量相关的变化,如上所述,然后从点击量中扣除基线。剩下的叫做提升。
基本上,你只模拟上升,而不是所有的点击。
除了以上所述,在开始任何建模之前,您必须确保您有干净的数据可以使用。
有时,如果你的产品有一个非常具体的目标受众,或者你没有多少钱,你会在一些便宜的渠道预订航班,这些渠道的覆盖面有限。它们不会造成很大的流量。隆起会很小,很难定位。不知何故,你必须决定是否从你的数据中过滤掉这样的点,或者让它们存在并破坏你的模型。
如果您只有很小的通道,估计任何影响通常都是具有挑战性的。预订不太贵的航班比大量的廉价航班更有意义。
你还需要一个可靠的跟踪技术来捕捉所有的点击和线索。这需要将跟踪像素集成到 HTML 代码中。但追踪是如今电子商务的普遍必备,所以那应该不算新奇。
你必须区分点击,这取决于单次点击在网页上的来源。有些人键入一个网址,或点击一个附属链接,而大多数人会去搜索引擎,键入一个关键字。这里还有一个十字路口:一些用户点击你的搜索引擎广告,而另一些用户花时间滚动和访问你的网站,而不会为你产生额外的费用。
我在这里做一个简短的题外话来强调重要性。电子商务公司需要了解人们如何与他们的产品互动,为什么和如何购买,以及为什么一些用户不购买。这种互动历史被称为客户之旅。
顾客之旅由接触点组成。这些是用户与产品互动的场合。可以是他读到的关于产品的博文。然后一个搜索引擎广告。然后是电视广告。在最好的情况下,用户访问网站几次,然后产生一个线索。
一些在线渠道比其他渠道更有可能处于客户旅程的末端。因此,不同在线渠道的贡献是不*等的。它决定佣金。这就是为什么你的回归模型应该根据点击的来源来区别对待。有鉴别力,不是吗?
回归建模非常耗时耗力。你的数据越多,你的结论就越好。几个月后,模型变得越来越珍贵,但广告商不喜欢长时间的等待。
因此,没有多少媒体公司能负担得起回归建模。有时,电视巨头承担这项任务,以吸引他们的客户预订更多的位置。
差不多三年前,我进入了一家提供这种电视广告估算服务的小公司。很快他们不得不宣布裁员措施。还有一次,我去一家电视公司面试。这给了我一种感觉,那会是一个非常混乱的工作环境,所以我不想继续下去。
在电视市场特别大的国家,如美国,通信数据科学家可以成为一个稳定的职业道路。在德国,你也有一个严格的数据保护法规,这是特别困难的收获用户数据。如果人工智能的历史有了新的转折,事情可能会改变。
就目前而言,即使在大多数西欧国家,这种工作模式仍相当不成熟。
原文:https://towardsdatascience.com/tell-me-a-joke-how-to-add-small-talk-support-to-your-power-virtual-agents-chatbot-6a0eba974de2?source=collection_archive---------19-----------------------
梁杰森在 Unsplash 上的照片
不管你的聊天机器人是为了什么而设计的,也不管它的目的有多清晰或简单,你的用户总是会首先尝试聊天。
了解了这一点,即使是最简单的聊天机器人也必须具备得体的聊天技巧。但是这可能是一个挑战——特别是当您使用像 Power Virtual Agents (Power VA)这样的低代码产品时,因为这样的产品可能没有开箱即用的良好聊天功能。
在本指南中,我将向您展示如何使用 QnA Maker 作为 Azure 认知服务套件的一部分,向任何 Power VA 聊天机器人添加聊天功能,并在 Power Automate 的帮助下将这两种产品结合起来。
如果你是 Power VA 的新手,我在 Medium 上为你提供了一个简单的分步介绍这里。
让我们开始吧。
在微软 QnA Maker 的帮助下,我们可以为我们的聊天机器人创建一个知识库,其中包含大约 100 个聊天场景的预填充数据集,包括响应和样本查询。我们可以选择 5 种不同的性格和 9 种语言。你可以在 GitHub 上了解更多。
要创建我们的闲聊知识库,请转到https://www.qnamaker.ai/,登录并点击创建知识库。
点击创建 QnA 服务按钮,重定向到 Azure 门户,创建您自己的 QnA Maker 实例。
在 Azure 门户中,你必须命名一些资源。为创建的每个服务选择适当的名称和位置。
如果你没有 Azure 订阅,先注册一个 Azure 免费试用。
此外,如果你不是 Azure 专家,这可能会有点混乱。别担心,使用和我一样的设置。只需将西欧替换为您最*的位置,将 MyBot 替换为您聊天机器人的名称。其余部分遵循一些命名和简单部署的最佳实践。
在向导的最后点击,最后一次验证你的设置,然后点击创建。
等待您的部署已完成消息,并在浏览器中跳转回 QnA Maker 门户。
返回 QnA Maker 门户,单击刷新按钮,并从下拉列表中选择之前创建的 Azure QnA 服务实例。请注意,这可能需要您刷新(F5)多次,或者再等几分钟,实例才会出现。
像我一样,给你的 QnA Maker 知识库起一个响亮的名字。
现在我们可以添加一些闲聊的场景,并在 5 种不同的性格中进行选择。
准备好后,点击创建您的知识库。
当你的知识库准备好了,我们可以有选择地稍微调整一下。例如,你可以搜索“你是谁?”并更改其响应,以包含来自您的聊天机器人的个性化欢迎消息。
还可以添加新的 QnA 对,就像您企业的基本常见问题一样。玩玩它,当你觉得准备好的时候点击保存和训练。
现在我们可以转到发布选项卡并点击发布按钮。
发布成功后,门户向我们提供了必要的详细信息,如知识库 id 、主机、和端点密钥。保持此页面打开,因为我们稍后需要此信息。
在 Power VA 管理门户,打开你的聊天机器人,点击齿轮图标,选择系统回退。
通过点击添加按钮,我们启用回退系统主题。这取代了自动提示信息的默认行为,并允许我们挂接自定义逻辑。
添加回退系统主题后,点击转到回退主题打开设计器。
首先,我们使用每个画布上的三个点删除默认消息和升级重定向。
点击连接器末端的 + 图标,选择调用动作,点击创建流程。
这将启动 Power Automate 管理门户,为 Power VA 提供一个触发器和输出操作。
首先,我们点击+Add a Input,为我们的触发器添加一个新的输入。选择一个文本输入并将其命名为。
同样,我们使用 + 图标添加了生成答案(预览)动作。
在下一步中,我们必须配置到 QnA Maker 实例的连接。我们需要您之前在 QnA Maker 中发布知识库时显示的连接详细信息(请参考上面的截图)。
根据需要输入一个连接名—将 API 键映射到端点键并将站点 URL 映射到主机。再次验证您的设置并点击创建。
在下一步中,生成 应答动作再次要求相同的参数。我们还需要知识库 Id ,它只是 QnA Maker 门户中部署细节的 GUID 部分。
最后,我们将问题字段映射到上面触发器的新问题输入。
QnA Maker 可能会对一个问题给出多个答案。这就是为什么我们用接下来的两步从回答中“挑选”最佳答案。
首先,我们添加一个初始化变量的步骤,并创建一个名为的新对象。我们用从生成答案动作获得的第一个答案条目初始化对象。为此,我们使用下面的简单表达式。
这个表达式选择上面的第一个答案。
现在我们有了这个答案,我们添加一个解析 JSON 动作来从我们的最佳答案构造一个对象。为此,我们使用下面的 JSON 模式,您可以将它复制并粘贴到动作的模式字段中。
作为流程的最后一步,我们添加了两个输出。
首先,我们添加一个名为答案的文本输出,并将其映射到最佳答案的答案属性。
其次,我们添加一个名为 Score 的数字输出,并分别将其映射到 score 属性。分数是一个置信度值,表示 QnA Maker 对响应的确信程度。我们将在稍后使用这个值。
在点击保存之前,给你的流起一个更好的名字。
回到 Power VA 中的回退系统主题,我们现在可以添加新的流并将变量链接到流的问题输入。这样,我们只需将用户所说的传递给我们的流。
之后,我们使用连接器末端的 + 图标添加一个新条件。
我们测试分数变量是否大于 0 。在这种情况下,我们确保我们从 QnA Maker 收到了一个正确的答案,这个答案值得向用户显示,我们用一个使用 Answer 变量的简单消息来完成。
对于任何其他情况,我们用静态消息进行响应,表明即使我们的 QnA Small Talk 数据库也完全不知道用户说了什么。
最后,点击保存按钮,我们就可以测试我们聊天机器人的聊天技能了。只需抛出一堆愚蠢的问题,然后看看聊天机器人的反应。
就是这样。我们的聊天机器人表现得非常自然,可以回答许多最常见的问题。即使是一个不完美的答案也能带来令人捧腹的幽默对话。你的聊天机器人肯定会经受住你的第一次用户交互,并且总是有机会通过添加新的 QnA 对来改善结果。
👉,
塞巴斯蒂安
原文:https://towardsdatascience.com/tell-me-a-story-ai-one-that-i-like-4c0bc60f46ae?source=collection_archive---------42-----------------------
书的形象:Pixabay。代码图像:Unsplash。
既然我们都被孤立了,我们比以往任何时候都更需要故事。但并不是所有的故事都让我们感兴趣——喜欢浪漫的人可能会对神秘故事嗤之以鼻,反之亦然。有谁比 AI 更适合给我们讲为我们量身定做的故事?
在这篇文章中,我将通过给我们讲故事来指导你编写一个人工智能的过程和代码,使隔离变得更加有趣和有趣——这些故事是为我们的口味量身定制的。
这篇文章将被分成几个部分:
我们希望人工智能给我们讲故事。理想情况下,在真正的技术复兴时尚中,我们希望训练一个递归神经网络或其他一些生成方法。然而,根据我处理文本生成的经验,它们要么需要花费非常非常长的时间来训练,要么最终过度适应数据,从而违背了“原始文本生成”的目的。另外说明一下,在 Kaggle 上,训练一个表现良好的模型所需的时间超过了 8 个小时,即操作时间限制,而 ka ggle(据我所知)是训练深度学习模型最高效的免费*台。
相反,我希望这个项目是快速和通用的,每个人都可以实现。这个人工智能不是训练 RNN 或生成模型,而是在“故事数据库”中搜索人类创造的故事,并找到最好的一个。这不仅保证了基本的常识和故事质量(由人类制作,为人类服务),而且速度更快。
对于我们的“故事数据库”,我们将使用 Kaggle 上的维基百科电影情节数据集。拥有 35000 部电影的故事,包括所有类型、国家和时代,这是你能找到的最好的故事数据库。
在这些列中有发行年份、标题、电影的国籍、类型和情节的文本描述。
现在我们有了数据,我们可以开始设计一个粗略的大纲/蓝图。
请注意,选择大约五个最有区别的故事是为了用有限的数据量给模型提供尽可能多的信息。
我们强化学习系统的基本路线图。就是不断的学习!
最初,这个程序会询问你对三个故事快照的看法。在程序看来,这三个故事最能代表数据中的每个分类。
在你回答了前三个问题以大致判断你的口味后,模型将开始生成它认为你会喜欢的故事。
如果你对某个故事的片段感兴趣,程序会打印出整个故事供你阅读。
你是否喜欢一个故事被添加到模型的训练数据中,以改进它的推荐。当你阅读故事时,这个模型不断地学习。如果你不喜欢一个片段,程序不会打印出完整的故事,并继续生成一个新的。
在对几个谋杀和警察片段做出“1”反应后,该程序开始学习,并开始向该方向推荐越来越多的故事。
这个程序就像蒙特卡罗树搜索一样,开始朝着优化回报的方向前进,当它走得太远(也许它已经偏离你喜欢的故事类型太远)而无法优化你的体验时,它就会撤退。
我们将用 ' 加载数据。
我们有电影的发行年份、片名、国籍、导演、演员、类型、该电影的维基百科页面的 URL 以及情节的文本描述。我们可以摆脱导演和演员——对于我们的推荐算法或聚类方法来说,有太多的类(确切地说,有 12593 个独特的导演和 32182 个演员)无法从中获得任何东西。然而,这种类型是有用的,有少量的类别——30 个类别的电影超过 100 部——代表 80%的电影(其余的属于更小的子类别,可以简单地标记为“其他”)。因此,我们可以放弃导演和演员。
我们遇到的另一个问题是括号引用。正如你所熟悉的,维基百科引用其来源时会在括号内加上一个与来源相对应的数字(例如[3])。
例如,在上面的字符串中,我们想要删除[1]。对此最简单的解决方案是创建一个包含每个括号值([1]、[2]、[3]、[98]、[99])的列表,并从字符串中删除它们。这是可行的,因为我们可以确定没有一篇文章的引用次数超过 99 次。虽然不是最有效的,但它可以完成混乱的字符串索引或拆分工作。
这就产生了“黑名单”——一个充满我们不需要或不想要的引用的列表。
使用黑名单,我们可以创建一个应用于该列的函数。
这就结束了我们的初级数据清理。
我们系统的一个关键要素是总结情节。因为故事通常太长而无法阅读,所以总结故事很重要,这样用户就可以选择是否继续阅读。
我们将使用基于图形的摘要,这是最流行的文本摘要方法。它创建一个文档单元图(而大多数其他方法使用句子作为基本单元),然后选择具有适合该场景的 PageRank 版本的节点。Google 最初的 PageRank 版本使用类似的基于图形的方法来查找网页节点。
PageRank 算法计算图中节点的“中心性”,这在测量句子中的相关信息内容时很有用。该图是使用单词袋特征序列和基于余弦相似度的边权重构建的。
我们将使用库来总结长文本。与前面的示例一样,实现起来很简单:
[输出]:
总结是有意义的(如果你愿意阅读整篇文章的话)。图表汇总是最有效的汇总方法之一,我们将在我们的图表中使用它。让我们创建一个函数,它接收文本并输出摘要。然而,我们需要满足两个条件:
如果不满足这两个条件中的任何一个,它将返回文本的摘要。然后,我们将创建一个列来总结这些图。
这需要几个小时来运行。但是,这是一次性成本,有一个总结可以节省以后的时间。
让我们看看它在数据集的一些示例文本上的表现:
总结为
为什么,这是一个伟大的完整的故事的结果!这些摘要读起来很快,并能让你对电影情节中的重要句子有一个很好的了解。这已经很好地解决了。
应用于真实数据集的可分叉笔记本中的代码可以在这里找到。
为了找到最有区别的故事情节,我们将使用 K 均值将情节的文本聚类到最佳数量的聚类中。文本的聚类标签以及电影的国籍、类型和年份将被聚类以在电影中找到聚类。最接*每个质心(聚类中心)的电影应该最能代表它们的聚类,因此最具歧视性。这个想法背后的主要思想是
询问用户有多喜欢那些最具歧视性的电影,对于一个之前没有用户口味信息的模型来说,应该提供了最多的信息。
电影的国籍、类型和年份都代表了电影在文本中可能传达的方面,这有助于我们快速找到合适的推荐。理论上,最“准确”的建议是非常非常长的图的矢量化之间的某种相似性,但这需要很长时间。相反,一个图可以用它的属性来“表示”。
对文本进行聚类是一次性的事情,它不仅为我们提供了用于对电影进行聚类的附加特征,还提供了在我们实际进行推荐时用作电影属性的特征。
我们开始吧!首先,我们需要删除所有的标点符号,并使所有的文本小写。我们可以使用正则表达式创建一个函数来做这件事。
使用 ' ,该功能可以应用于所有的地块。
现在,让我们对数据进行矢量化。我们将使用术语频率逆文档频率(TF-IDF)矢量器。这个矢量器还可以帮助区分重要的单词和不重要的单词,从而得到更好的聚类。矢量器强调在一个文档中出现较多但在整个语料库中出现较少的单词(更有鉴别能力),而不强调在所有文档中出现的单词。
我们将把非常非常稀疏的矩阵保存到变量中。因为 K-Means 是基于距离的,这意味着它会受到维数灾难的影响,我们应该通过将向量中的最大元素数设置为 500 来尽最大努力降低矢量化文本的维数。(当我没有实现限制时,文本将除了集群 2 中的一个文本和集群 3 中的一个文本之外的所有文本分类为集群 1。这是 K-Means 上的维数灾难的结果——距离是如此扭曲,以至于在 TF-IDF 的词汇中可能有成千上万个维度,除了离群值之外的一切都被归入一个类别。
出于同样的原因,在我们将数据输入 K-Means 模型之前,对数据进行缩放是一个好主意。我们将使用,它将数据放在到的范围内。
现在,是时候训练 K 均值模型了。理想情况下,集群的数量(我们需要问的问题的数量)将在 3 到 6 之间,包括 3 和 6。
因此,我们将对列表中的每个聚类数运行 K-Means 模型。我们将评估每个分类的轮廓分数,并找出最适合我们数据的分类数。
首先,让我们初始化两个列表来存储聚类数和轮廓分数(我们的图的 x 和 y ):
接下来,我们将导入的和。
然后,对于四个可能的聚类中的每个聚类数,我们将使用 n 个聚类来拟合 KMeans 模型,然后将该聚类数的轮廓分数附加到列表。
从这里,我将在 Kaggle 上单击“Commit ”,让它自己运行——运行一遍需要几个小时。
最后发现表现最好的聚类数是三个聚类,轮廓得分最高。
现在我们有了文本标签,我们可以开始将电影作为一个整体进行聚类。然而,我们确实需要采取一些措施来清理数据。
比如从 1900 年代开始计时。如果取字面上的整数值,会使模型混乱。相反,让我们创建一个返回电影年龄的列,它就是 2017 年(数据库中最年轻的电影)减去电影发行的年份。
现在,年龄从 0 开始计数,实际上意味着一些东西。
专栏很重要——一个故事的风格和味道通常可以追溯到它的来源。然而,这个列是绝对的,这意味着它的形式是。要把它转换成机器可读的东西,我们需要一次性编码,用 sklearn 的很容易做到。
现在,nation 存储每一行的独热编码值。一行的每个索引代表一个惟一的值——例如,第一列(每行的第一个索引)代表。
然而,目前,它只是一个数组——我们需要在数据中创建列,以便将信息真正转化为我们的数据。因此,对于每一列,我们将命名该向量的列对应的国家(返回原始列的数组,索引数组中每行的第个值)。
我们已经成功地将每个故事的国籍数据添加到我们的数据中。让我们对故事的类型做同样的处理。这可能比国籍更重要,因为它传达了关于故事在某种程度上讨论什么的信息,而机器学习模型根本不可能识别这些信息。
然而,有一个问题:
部分剪断;类别比较多。
似乎很多流派都不为人知。不要担心,我们稍后会解决这个问题。现在,我们的目标是对这种类型进行编码。我们将遵循与之前类似的过程,但略有不同——因为有太多的流派因名称不同而被视为不同(例如,“戏剧喜剧”和“浪漫喜剧”),但几乎相同,我们将只选择最受欢迎的 20 个流派,并将其余的归入 20 个流派中的一个。
请注意,我们最终从列列表中删除了'',这就是最初选择前 21 个流行流派的原因。接下来,让我们根据处理流派,这样,如果一个流派不在前 20 个最流行的流派中,它将被替换为字符串值“”。
然后,像以前一样,我们将创建一个一键编码器的实例,并将它对数据的转换以数组形式保存到变量中。
为了将数组集成到数据中,我们将再次创建列,其中数据中的每一列都用数组中的一列填充。
太好了!我们的数据是一次性编码的,但是我们仍然有一个未知值的问题。现在所有的数据都被一次性编码了,我们知道列的值为 1 的行需要估算它们的类型。因此,对于每个需要估算类型的索引,我们将用一个值替换它们的类型,这样我们稍后使用的 KNN 估算器就可以识别出它是一个缺失值。
既然所有缺失值都被标记为缺失,我们可以使用 KNN 估算值。然而,除了发行年份和国籍,恐怕没有太多的数据来估算这些数据。让我们使用 TF-IDF 矢量器,从故事中选择前 30 个单词,作为 KNN 正确分配体裁的额外补充信息。
文本必须总是事先清理,所以我们将使用正则表达式删除所有标点符号,并使一切小写。
我们将设置英语标准停用词,并将最大功能数设置为 30。清理后的矢量化内容将以数组的形式存储到变量中。
像前面一样,我们将把数组中的每一列信息转移到我们的数据中的一列,用中的列所对应的单词来命名每一列。
这些词将为故事内容提供更多的语境,有助于推断故事类型。最后,是时候估算一下流派了!
我们的估算器将识别标记为缺失值的值,并自动使用关于国籍和数据中的单词的包围数据,以及电影的年代来估算类型。结果以数组的形式保存到一个变量中。像往常一样,我们将转换数据:
在删除了我们已经一次性编码或不再需要的列之后,比如用于或分类变量的列…
…数据准备就绪,没有丢失值。KNN 插补的另一个有趣的方面是,它可以给出十进制值——也就是说,一部电影有 20%是西方的,还有其他一些是另一种类型,或者几种类型。
这些特性都将很好地服务于集群。结合之前实现的文本聚类标签,这些特征应该是一个很好的指标,表明一个故事在人们的偏好领域中所处的位置。最后,我们可以开始聚类——像以前一样,我们将故事分成 3、4、5 或 6 个聚类,看看哪一个表现最好。
绘制分数时…
…像以前一样,三个集群表现最好,具有最高的轮廓分数。让我们仅在三个集群上训练我们的 KMeans:
每个集群都有相对均匀的电影分布,这很好。让我们得到聚类中心,可以用方法访问它:
部分剪断。
首先,让我们给每个项目分配标签。
对于每个聚类,我们希望找到在欧几里德距离方面最接*聚类中心的数据点。这将是该集群中最具代表性的一个。两点 p 和 q 之间的距离由 p 和 q 对应尺寸的差的*方和的*方根给出。你可以在这里找到我对欧几里德距离的证明(多维度中的勾股公式)。
因为欧几里德距离是 l2 范数,这可以用的线性代数能力:很容易地计算出来。
让我们查看整个代码以计算代码,并找到与分类具有最小欧几里得距离的故事。
这将初始化搜索。首先,我们存储其标签等于我们当前正在搜索的分类的故事。之后,我们从子集中删除'【T3]'。为了存储原始索引供以后参考,我们将把索引存储到一个变量中。之后,我们将重置上的索引以确保*滑的行索引。然后,我们将选择当前聚类的中心点,并启动一个包含两列的字典:一个列表用于存储主数据集中某个故事的索引,另一个列表用于存储得分/距离。
这段代码遍历子集内的每一行,记录当前索引,并计算和记录它与中心的距离。
这将分数转换成熊猫数据帧用于分析,并打印出离中心距离最*的故事的索引。
看起来具有最*欧几里德距离的第一个分类有四个故事,但是分类 1 和分类 2 只有一个故事。让我们来看看这些是什么故事。
集群 0:
[输出]:
集群 1:
[输出]:
集群 2:
[输出]:
太好了!我们已经得到了三个最有区别的故事情节。虽然它对人类来说可能不那么有歧视性,但在我们的机器学习模型的头脑中,这些将立即给它提供最多的信息。
推荐引擎将只是一个机器学习模型,预测哪些电影情节有更高的机会被用户高度评价。该引擎将接受电影的特征,如其年龄或国籍,以及一个 TF-IDF 矢量化版本的摘要,限于 100 个特征(不同的词)。
每个电影情节的目标将是 1 或 0。模型将根据可用数据(用户已评级的故事)进行训练,并预测用户对故事进行正面评级的概率。接下来,最高概率图将被推荐给用户,并且用户对该故事的评级将被记录,并且该故事将被添加到训练数据列表中。
作为训练数据,我们将简单地使用每部电影的数据属性。
我们可能会想要一个决策树分类器,因为它可以进行有效的预测,快速训练,并开发一个高方差的解决方案,这是推荐系统努力的方向。
在下一部分中,我们将把我们之前的工作整合在一起。
我们先从用户对三部最具歧视性的电影的评分进行编码开始。对于每个输入,程序确保输出为 0 或 1。
这个很好用。接下来,让我们将数据存储到训练数据集 DataFrame 中,并从数据中删除这些索引。
现在,是时候创建一个循环了。我们将在当前的训练集上训练一个决策树分类器。
然后,对于数据中的每一个指标,我们都会做一个概率预测。
为了确保快速选择,我们将随机选择大约 1/3 的数据,方法是随机排列数据并选择前 10,000 行。该代码将索引保存到数据帧中。
最初,它以概率 1 对许多电影进行评级,但随着我们的进步和模型学习更多,它将开始做出更高级的选择。
我们将把表现最好的电影的索引保存到变量中。
现在,我们需要从中获取关于的信息并显示出来。
在验证用户的输入是 0、1 或-1 之后,退出…
…我们可以开始增加我们的训练数据。然而,首先,如果用户想退出,我们必须打破这个循环。
此外,不管用户喜欢还是不喜欢这部电影,我们仍然要将它添加到训练数据中(目标只是不同):
最后,如果响应等于 0,我们将把 0 附加到 y 上。用户不想喜欢这个故事。
然而,如果用户喜欢,程序将打印完整的故事。
我们将再次收集用户的输入,并确保它是 0 或 1,
…并相应地给 y 加 0 或 1。
最后,我们将从数据中删除这个故事,这样用户就不会再看到同一个故事。
我们已经完成了!每次迭代,训练数据都会更新,模型会越来越精确。
我希望你喜欢!也许你会用这个程序来阅读几个有趣的情节,或者可能会检查情节所属的电影。在这个孤立的时期,处理数据中的问题和挑战,创造一些东西来娱乐我们,这很有趣。
如果你想玩玩这个程序,你可以在这里找到它。它仍然可以得到显著的改进,所以我对你们可以用这些代码做什么很感兴趣!
原文:https://towardsdatascience.com/tell-stories-using-data-top-10-strategies-to-follow-ee886f73d26c?source=collection_archive---------47-----------------------
由 You X Ventures 在 Unsplash 上拍摄的照片
创建图表和图形很容易。从这些图表中提取故事很有挑战性。因此,数据分析师的角色不是制作吸引人的视觉效果;*面设计师可以做到这一点。数据分析师的重要部分是确保受众能够通过这些图表唤起精确的信息。不是每个人都能读取数据。作为数据分析师,我们有责任用一个激动人心的故事来解释这些图表。
额外提示:让一切变得简单。简单导致伟大的思想。
这些策略给了我很多启发。我从 Linkedin 的一个名为“学习数据科学:用数据讲故事”的学习课程中获得了这些见解,该课程由道格·罗斯主讲。我强烈推荐查看这个免费的课程,以获得更多的见解。在评论里补充一些我漏掉的你的想法。
我的电子邮件—hpprasad2000@gmail.com
我的 Linkedin 个人资料— 点击此处
原文:https://towardsdatascience.com/tell-stories-with-data-communication-in-data-science-5266f7671d7?source=collection_archive---------13-----------------------
照片由 Unsplash 上的 Dmitry Ratushny 拍摄
在数据科学的世界里,一个人必须擅长数据创造、怀疑和交流。来自数据分析的有趣见解必须与高层决策者和关键利益相关者分享,以实现最大的影响。
通过创造引人入胜的故事,向科学数据分析领域之外的受众有效展示和交流发现的能力,是任何成功的数据科学家的决定性特征。好消息是,用数据寻找和讲述故事是一门艺术,跨越学科,任何人都可以学习。
数据科学家的工作不仅仅局限于数据库。作为一名数据科学家,你不会仅仅花几个小时钻研数据集、处理数字或解释关键发现来得出结论。您还必须:
这需要大量的沟通。
数据科学家必须具有说服力、说服力和可信度,而做到这一点的最佳方式就是“数据故事”。《有效的数据故事讲述:如何用数据、叙述和视觉效果推动变革》一书的作者 Brent Dykes 认为,数据故事讲述是一种传达数据洞察力的结构化方法,包含三个关键要素:数据、视觉效果和叙述。
在本文中,我们将讨论后两个元素。叙述可能有助于向你的听众解释数据表明了什么,以及为什么见解很重要。视觉效果——图形、图表、图示——可以用来以电子表格和仪表板无法做到的方式突出洞察力。
叙事和视觉的结合可以用来吸引你的观众和推动可操作的见解,从而实现有效的决策。
统计数据可能很难理解,尤其是如果你没有排除不必要的信息或给数据添加叙述的话。你希望以一种能引起目标受众共鸣并对其产生影响的方式展示和传达你的见解。下面是该如何做:
如果你看到一个没有任何上下文层次的数字“25”,你不会知道它的真正含义。是某人的年龄吗?是客户转化率的百分比变化吗?是网站访问量吗?
虽然在真空中展示数据无助于我们对其意义的理解,但将数据置于更大的环境或背景中可以使其获得真实和完整的意义。
你必须问自己,为了更好地理解你的发现,什么样的背景信息是相关的或必要的。通过这种方式,您可以将无意义的数据转换为真实的信息,这些信息可以用作可操作的见解。您还必须:
a .了解你的听众— 考虑一下你要向谁展示你的发现和见解。是对整体业务表现感兴趣的高管吗?是营销经理想要确定特定的社交媒体活动是否有效吗?销售团队是否需要知道本季度是否能达到配额?你的演示和数据可视化需要围绕你的听众已经拥有的信息水*和他们想要的信息来构建。
b .与你的听众相关—哈佛商业评论进行了一项关于讲故事的神经生物学研究,发现“带有情感内容的人物驱动的故事可以更好地理解演讲者想要表达的要点。”这意味着决策通常是基于情感而非逻辑。通过与你的观众建立概念驱动的联系,你可以增加观众的参与度。
人们听到的是统计数据,但他们感受到的是故事——布伦特·戴克斯
你展示信息的方式可以塑造你的观众的看法和行为。强大的故事都是在更大的画面内诬陷****——它们有一个勾,气势和销魂目的 。思考如何组织故事可以帮助你找到吸引人的故事,让人们了解复杂的问题,并激发关于提议的解决方案的对话。
那么,你如何构建你的故事,并形成一个强有力的叙述呢?考虑以下问题:
数据故事化(通过叙述)的目标是激发商业决策的批判性思考和讨论——你应该能够通过行动号召来引发听众的回应。
想象一下,你只有有限的时间或一句话来向你的听众传达信息。你会怎么说?你只需要告诉他们需要知道的。以这种方式思考你的陈述,将使你能够简洁、清晰、简明地讲述你想要讲述的故事。
请记住,好的数据故事只包含与分析目标直接相关的信息,超过这个数量,你的听众将很难理解你想要表达的观点。
数据可视化——图形、图表、图解——是赋予数据生命的绝佳方式。强大的可视化通过统计信息的图形描述讲述一个故事。通过创造性地使用数据和统计数据来展示模式并得出关于假设的结论,你可以抓住并保持你的听众的注意力。
Deliveroo 是一个受欢迎的英国食品交付应用程序,已经筹集了数百万美元的投资者资金,它使用大数据和机器学习来推动食品交付。工程副总裁这样评价数据可视化:
图表帮助我们的运营团队了解趋势并做出反应,整个企业的代理每天 24 小时都在对我们的数据集进行查询——Dan Webb
理解什么时候最适合使用某些数据可视化也很重要。疯狂的蛋用一个超级酷的信息图来演示这一点:
疯狂鸡蛋信息-图片
用适当的数据可视化来说明你的结论是一种动态的说服形式。它让你的观众发现模式,看到趋势,并以更快的速度消化大量的数据。
总之,当数据适合一个故事时,它的价值就增加了。那些处理数据的人必须能够传达出数据为什么吸引人或有用,否则数据的价值就会丧失。你的目标受众必须能够对你的分析解决方案产生共鸣或反应。通过在叙述中呈现数据(并辅以视觉效果),你可以从人的角度看待事实数据,以增加观众对你的发现的理解,并获得有价值的见解。
原文:https://towardsdatascience.com/telling-stories-with-google-trends-using-pytrends-in-python-a11e5b8a177?source=collection_archive---------11-----------------------
Google Trends 从 2006 年开始向公众开放,让他们搜索可以追溯到 2004 年的某些关键词的相对受欢迎程度。从谷歌的数据中,我们可以了解不同国家或地区之间的相对受欢迎程度。
米切尔·罗在 Unsplash 上的照片
在本教程中,我将分享如何跟踪多个关键词的相对受欢迎程度(我说的是一次几十个,甚至几百个关键词)。
我使用 Python 连接到 Google Trends API 使用 Pytrends ,迭代关键字列表上的数据收集,并使用一个关键字作为参考来整合它们。我们需要这样做,因为谷歌趋势一次只允许最多 5 个关键词比较。
直接在谷歌趋势上比较关键词
现在让我们搜索关于食物的关键词。这将是有趣的,因为不同类型的食物可能有不同的季节性和受欢迎程度,这可能是一个很好的研究餐饮业。还有,我饿了。所以让我们开始吧!
准备
首先,我们需要准备关键字列表,并选择一个参考关键字来实现比较的集成。注意谷歌趋势给出的是相对受欢迎程度的数据,而不是实际的搜索量。来自谷歌趋势页面:
“数字代表在给定地区和时间内相对于图表最高点的搜索兴趣。值 100 是该术语的最高流行度。值为 50 表示该术语的流行程度减半。得分为 0 意味着没有足够的数据用于这个术语。
再者,从我的经验来看,选择一个不太热门的参考关键词是一件好事,因为我们会得到更有特色的对比。但是,引用关键字也应该足够受欢迎,不会获得 0 相对受欢迎度。
所以让我们制作一个关键词列表,可以直接在 Python 或者任何电子表格中制作。为了这个教程,我列出了世界上几个受欢迎的菜系的 100 种食物。
连接谷歌 API &收集数据
现在让我们跳进 Python 吧。首先要做的是导入库并连接到 Google API :
接下来,读取列表并创建迭代以获得列表中所有关键词的 Google Trends 数据。为此,我创建了一个函数来收集一段时间内的 Google Trends 数据(时态数据):
我还创建了一个函数来按地区或国家收集 Google Trends 数据(空间数据):
几个重要参数(详情此处):
每个函数产生 25 个文件(100 个关键字除以 4),每个文件包含 4 个关键字+参考关键字的比较。接下来,我们将整合这些文件,并相应地归一化相对流行度。
数据整合
通过将所有文件的列连接在一起,我们得到了完整的数据集,每行代表时间或空间维度。然而,我们可以观察到,在不同的比较之间,参考关键词的相对流行度的值可能是不同的。
下一步是将这些值标准化,这样我们就可以得到所有 100 种食物的完整的相对比较。我们使用以下公式来计算每个关键字的归一化值:
归一化关键字相对流行度的公式
为了实现上面的公式,让我们运行我创建的下面的函数。注意,为了避免无限值,如果参考关键词的相对流行度太小,以至于 Google 报告为 0,我假设相对流行度为 0.01(来自 Google Trends 的最小值)。
我们在 Python 中做的最后一步是整理和融化数据帧。
我们的数据已经可以可视化了!
数据可视化使用Tableau
几个好吃的发现:
披萨统治
2.甜点的季节性(其他也是)。夏天吃冰淇淋,冬天吃蛋糕,经典。
随着时间的推移而流行
3.欢宴&节日模式。例如,人当每年有两次高峰,分别发生在伊斯兰节日开斋节和宰牲节。
印度尼西亚食物
4.更多花样:每年二月的薄饼 ❤
此外,几乎所有的食品都在 2020 年 4 月至 5 月突然涨价,这可能是由于新冠肺炎封锁和检疫的影响。
绉效应日
请随意浏览此处提供的完整表格仪表盘。
完整仪表板
我希望这篇教程对你有所帮助,并可能激发更多的分析来!
完整的 Jupyter 笔记本是 这里有 。
可以通过 LinkedIn 联系我。之前我还用 Google Trends 做了一个 Tableau 仪表盘,关于家庭娱乐设备这里有。
原文:https://towardsdatascience.com/templates-of-sql-queries-to-google-bigquery-that-will-take-your-reports-to-another-level-d0ebc1b8957d?source=collection_archive---------30-----------------------
来源:沉积照片
在这篇文章中,我们分享了一些报告模板,你可以用 SQL 查询来构建 Google BigQuery 数据。
首先,您将了解从 GA360 到 GBQ 的标准导出可以计算什么。
接下来,在 OWOX BI Pipeline 的帮助下,您将发现哪些独特的指标可以添加到标准的谷歌分析指标中。
谷歌分析报告是用户友好和方便的,尽管你可能会面临采样,数据聚合和其他限制。抬头!有一个解决办法:使用标准的数据导出到 Google BigQuery 来规避限制,并通过 SQL 请求构建更全面的报告。
假设您已经在网站上实施了新的指标或更新了现有指标,以衡量对您的业务至关重要的 KPI。您可以使用网站上的点击量变化报告来查看数据是否发送正确,并及时对任何分析错误做出反应。对于此报告类型,您需要以下维度:
常规的谷歌分析报告不会为你提供所有上述信息,因为它只允许同时选择 2 个维度,而定制报告则建议更多——5 个维度。SQL 查询没有这样的限制,让您可以在报告中提取您想要的所有指标和维度。
我们在 PDF 文件中提供的 SQL 查询模板将帮助您了解会话、用户和点击是如何在浏览器、设备和点击类型之间分布的。如果需要,您可以向查询中添加更多的维度。例如:
通过添加这些维度,您将得到下表:
图片由作者提供
你也可以将 CRM 或 ERP 系统中的信息导入 Google BigQuery。因此,您将能够跨任何所需的指标分析用户行为:产品目录、利润、产品类别、用户描述、订单完成等。例如,您发送一个查询来获取交易数据,然后将它们与来自 CRM 的已付款订单相结合,并计算在线完成订单的百分比。这将帮助您了解从下订单到付款或交货的过程中是否存在任何问题。
如果你想建立用户群并建立个性化的时事通讯,你需要关于在线用户行为的信息。细节越多,分割的选择就越多。Google Analytics 不会为您提供所有点击类型的用户行为报告,如浏览量、事件、社交、计时以及增强型电子商务事件(点击、详细信息、添加、删除、结账、购买、退款)。您也不能查看某个用户点击类型的*均值、最大值或最小值。然而,所有这些信息都可以通过一个 SQL 查询获得,这个查询可以在这篇文章的 PDF 文件中找到。
上述查询还将帮助您计算每个用户的以下*均值、最大值和最小值:
使用完全相同的 SQL 查询,您还可以为每个会话计算这些值:
手头有了这样的信息,就可以预测重复购买和微转化。
为了完善你的销售漏斗,你需要在购买之前对用户在你的网站上所做的给予适当的信任。GA 中的用户浏览器报告将为您提供所有类型的用户操作信息(浏览量、事件、社交、计时)。然而,这可能是复杂和耗时的,因为您将只能看到单个用户的这种统计数据,为此应用了高级细分和产品 ID 过滤器。
然而,基于从 GA360 到 Google BigQuery 的标准导出,构建一个报告将为您提供关于您网站上所有用户操作的数据,通过 GA 代码进行跟踪。例如,我们前面谈到的 SQL 查询将帮助您对查看过一些产品页面的用户进行分组。因此,您可以提醒那些没有付款就把商品放在购物车里的用户他们感兴趣的产品,并推荐其他产品,甚至建立客户档案。
上一段提到的所有情况也适用于本报告。使用我们的 PDF 文件中的 SQL 查询,您将构建一个报告,其中包含购买了某个特定商品的用户的姓名。这些名称将允许您向用户提供与已经购买的产品相似的产品或配件。
比方说,你在博客上发表了一篇文章,鼓励你的客户订阅时事通讯。要跟踪这样的转换,您需要两个事件:阅读文章和订阅。问题是你不能在谷歌分析中将这两者结合起来,因为它们是两种不同的目标类型——浏览量和事件。
此外,在 GA 中设置目标还有其他限制:
将数据导出到 Google BigQuery 和一个简单的 SQL 查询将帮助您规避上述限制。你可以建立一个包含任何必要步骤的漏斗,找到网站上任何狭窄的范围,并了解用户在哪个阶段掉得最多。
您还可以发现用户查看产品描述的频率,以及这种查看如何影响转化率。在我们的例子中,漏斗是这样的:
1.产品页面视图→ 2。产品描述视图→ 3。将产品添加到购物车。不过,你可以将任何用户操作设置为漏斗步骤,以便在网站上进行跟踪。结果,你会得到一个类似的图表:
图片由作者提供
你可以通过改善网站的内部搜索来提高转化率。例如,分析零搜索结果的百分比并更新网站内容,添加类似产品、特价商品等等。另一种选择是使用搜索查询报告,将查询最多的产品类别切换到更高的位置。
GA 报告中的维度和指标需要处于同一级别:点击级别、会话级别、用户级别或产品级别范围。这意味着,在包含维度的单个报表中,您无法查看产品 SKU 或跨会话 ID 的搜索查询排名。
该模板将有助于评估搜索查询会话的性能,并检查网站可用性的假设。
SQL 查询也将为您提供这些数据:
如果您还没有 GA 360 订阅,但真的愿意用您的业务所需的附加信息来丰富您的 GA 数据,OWOX BI Pipeline 将帮助您并为您提供必要的原始数据。事情是这样的,谷歌分析只允许导入跨广告活动的总成本数据,而标准导出模式根本不提供这样的信息。
使用 OWOX BI Pipeline,您可以组合来自所有广告*台的数据,并将其发送到 Google BigQuery,甚至可以查看所有会话的成本。这将允许您将您的支出和收入分组到用户级别、细分或群组级别,甚至是登录页面级别。
下面,我们提供了无法通过标准导出来计算的指标,但是可以通过 OWOX BI 来计算。以下所有报告都可以通过 SQL 查询或简单提问 OWOX BI 智能数据获得。
该报告将为您提供特定时期的成本信息,以及设定时间内的指标变化信息。你可以将获得的信息与之前的信息进行比较,评估不同来源的广告效果。
下面是 OWOX BI 智能数据的一个报告示例:
图片由作者提供
从上面的图表中,你可以看到 facebook/cpc 的成本在 6 月 7 日急剧下降。这可能是一个信号,让营销专家检查哪些活动、广告组和特定来源的关键词开始减少点击。很可能,由于竞争对手的广告,广告浏览量减少了。为了解决这个问题,营销专家可以调整出价、更新广告内容等等。
如前所述,Google Analytics 和 BigQuery 的标准导出不允许您计算每个会话、用户和群组的成本。但是,OWOX BI 肯定会让你这么做。
借助下面的报告,您可以了解不同城市和时间段的*均客户获取成本。查看它在 OWOX BI 智能数据界面中的外观:
图片由作者提供
通常,每个地区的广告活动都有不同的设置。前面提到的报告会让你知道该关注哪个地区。例如,从上图可以看出,达拉斯的客户获取成本(CAC)最高。这意味着你应该更仔细地观察这个地区的广告活动,计算每个用户的*均收入,广告活动的 CAC,将其与客户终身价值(LTV)进行比较。如果广告活动没有回报,你可以调整出价或干脆取消一些广告。
这样的报告可以帮助您评估广告的表现,并通过 CRM 中的订单完成率和产品主要成本来查看活动的贡献。要获得这个报告,您需要首先将订单数据从 CRM 或 ERP 系统导入到 Google BigQuery。下面您可以看到报告在 OWOX BI 智能数据界面中的外观:
图片由作者提供
从图表中你可以看到活动的表现,从最好的到最差的。营销人员将能够对每一次营销活动给予适当的肯定,了解其中一些活动成功或失败的原因,并为未来的营销努力选择最有效的渠道。
有了这份报告,你就可以找到任何与下订单或支付选项有关的问题。为了构建报告,您必须将关于已完成订单的 CRM 数据上传到 Google BigQuery。接下来,您将能够使用我们的 SQL 模板,根据您需要的指标提出智能数据问题,并最终获得以下报告:
图片由作者提供
这个气泡图显示了用户通过信用卡(onlineCard)支付四次的三次或两次:当选择客户上门取件或邮局上门取件递送选项时。但是,客户也可以通过信用卡支付快递服务。如果没有使用这种方法,你的网站可能会有一些问题。
对于这个报告,您还需要来自 CRM 系统的已完成订单的数据。该报告将允许您检查在某些城市是否有任何递送问题。
图片由作者提供
例如,您可以看到伦敦的交付时间最长。如果*均送货时间比你网站上说的要长,你可能需要查一下那个地区是否有当地的线下商店或仓库。如果还没有的话,去找一个可能是个好主意,因为这会减少送货时间。另一个好主意是检查你的客户在这个地区的满意度。
标准的数据导出到 Google BigQuery 和 SQL 查询以及 OWOX BI 工具在克服默认的 Google Analytics 限制和创建深入分析报告时非常方便。例如,您可以:
OWOX BI Pipeline 将丰富您的 Google BigQuery 数据,并帮助您了解:
原文:https://towardsdatascience.com/temporal-concept-localization-on-videos-91b540d95dbf?source=collection_archive---------46-----------------------
在多伦多机器学习峰会上的演讲
我是理科硕士毕业的。多伦多大学应用计算专业。我的主要兴趣在于计算机视觉领域。我目前是 Layer6 AI 的机器学习科学家,在那里我从事大规模图像检索和视频上的动作识别。
视频中的概念是给予视频中的片段的高级标签。它们可以是“滑板”、“跳舞”等动作,也可以是“木吉他”、“婚礼”等更一般的实体。本演示将概述关于 YouTube-8M 数据集的概念识别和本地化任务。它将涵盖最*文献中的方法和我们在数据集上达到最先进结果的方法。
视频上的时间概念定位
原文:https://towardsdatascience.com/temporal-convolutional-networks-the-next-revolution-for-time-series-8990af826567?source=collection_archive---------0-----------------------
这篇文章回顾了 TCN 解决方案的最新创新。我们首先介绍了一个运动检测的案例研究,并简要回顾了 TCN 架构及其相对于卷积神经网络(CNN)和递归神经网络(RNN)等传统方法的优势。然后,我们介绍了几部使用 TCN 的小说,包括《改进交通预测》、《声音事件定位与检测》和《概率预测》。
TCN 简评
Lea 等人(2016)的开创性工作首先提出了用于基于视频的动作分割的时间卷积网络(TCNs)。该传统过程的两个步骤包括:首先,使用(通常)编码时空信息的 CNN 计算低级特征,其次,将这些低级特征输入到使用(通常)RNN 捕获高级时间信息的分类器中。这种方法的主要缺点是它需要两个独立的模型。TCN 提供了一个统一的方法来捕获所有两个层次的信息。
编码器-解码器框架如图 1 所示,关于该架构的更多信息可在前两篇参考文献中找到(见本文末尾)。最关键的问题提供如下:TCN 可以采取一系列的任何长度,并输出同样的长度。在使用 1D 完全卷积网络架构的情况下,使用因果卷积。一个关键特征是在时间 t 的输出仅与在 t 之前出现的元素进行卷积。
Lea 等人(2016 年)
《自然》杂志最*发表了严等人(2020)在进行天气预报任务的研究成果,这甚至引起了周围的议论。在他们的工作中,对 TCN 和 LSTM 进行了对比实验。他们的结果之一是,在其他方法中,TCN 在时间序列数据的预测任务中表现良好。
颜等(2020)
接下来的部分提供了这个经典 TCN 的实现和扩展。
改善交通预测
拼车和在线导航服务可以改善交通预测,改变路上的生活方式。更少的交通堵塞、更少的污染、安全和快速的驾驶只是通过更好的交通预测可以实现的基本问题的几个例子。由于这是一个实时数据驱动的问题,因此有必要利用即将到来的流量的累积数据。为此,戴等(2020)最*提出了一种混合时空图卷积网络(H-STGCN)。总体思路是利用分段线性流量密度关系的优势,将即将到来的交通量转换为其行程时间当量。他们在这项工作中使用的最有趣的方法之一是图形卷积来捕捉空间依赖性。复合邻接矩阵捕捉了流量*似值的固有特性(更多信息,请参考李瑟娥,2017)。在下面的体系结构中,给出了四个模块来描述整个预测过程。
戴等(2020)
声音事件定位&检测
声音事件定位和检测(SELD)领域继续发展。理解环境在自主导航中起着至关重要的作用。Guirguis 等人(2020)最*为声音事件 SELD-TCN 提出了一种新的架构。他们声称他们的框架优于该领域的最新技术,训练时间更快。在他们的 SELDnet(架构如下)中,以 44.1 kHz 采样的多声道音频录音通过应用短时傅立叶变换提取频谱的相位和幅度,并将其作为单独的输入特征进行叠加。然后,卷积块和递归块(双向 gru)被连接,随后是全连接块。SELDnet 的输出是声音事件检测(SED)和到达方向(DOA)。
Guirguis 等人(2020 年)
为了超越它,他们提出了 SELD-TCN:
Guirguis 等人(2020 年)
由于扩展的卷积使网络能够处理各种输入,因此可能需要更深入的网络(这将受到反向传播期间不稳定梯度的影响)。他们通过调整 WaveNet (Dario 等人,2017 年)架构克服了这一挑战。他们表明,SELD 任务不需要循环层,并成功地检测到活跃声音事件的开始和结束时间。
概率预测
陈等人(2020)设计的新框架可用于估计概率密度。时间序列预测改进了许多业务决策方案(例如,资源管理)。概率预测可以从历史数据中提取信息,将未来事件的不确定性降到最低。当预测任务是预测数以百万计的相关数据序列时(如在零售业中),它需要令人望而却步的劳动力和计算资源来进行参数估计。为了解决这些困难,他们提出了一个基于 CNN 的密度估计和预测框架。他们的框架可以学习序列之间潜在的相关性。他们作品的新颖之处在于他们提出的深层 TCN,正如他们的建筑所展示的那样:
陈等(2020)
编码器-解码器模块解决方案可能有助于实际大规模应用的设计。
在这篇文章中,我们介绍了最*的工作,涉及时间卷积网络,并优于经典的 CNN 和 RNN 方法的时间序列任务。如需更多信息,请随时给我发电子邮件。
— — — — — — — — — — — — — — — — — — — — — — — — —
Barak 获得了以色列理工学院的航空工程学士学位(2016 年)、硕士学位(2018 年)以及经济和管理学士学位(2016 年,成绩优异)。他曾在高通工作(2019-2020),在那里他主要研究机器学习和信号处理算法。巴拉克目前正在海法大学攻读博士学位。他的研究兴趣包括传感器融合、导航、深度学习和估计理论。www.Barakor.com
https://www.linkedin.com/in/barakor/领英
推特:巴拉克 2
— — — — — — — — — — — — — — — — — — — — — — — — —
时间卷积网络:动作分段的统一方法。欧洲计算机视觉会议。施普林格,查姆,2016。
行动分割与侦测的时间回旋网络。IEEE 计算机视觉和模式识别会议论文集。2017.
闫,吉宁,等。enSo 预报的时间卷积网络。科学报告10.1(2020):1–15。
李,亚光,等。扩散卷积递归神经网络:数据驱动的交通预测。 arXiv 预印本 arXiv:1707.01926 (2017)。
雷萨格、达里奥、乔迪·庞斯和泽维尔·塞拉。"用于语音去噪的波网." 2018 IEEE 声学、语音和信号处理国际会议(ICASSP) 。IEEE,2018。
陈,易天,等。“时间卷积神经网络的概率预测”神经计算 (2020)。
SELD-TCN:通过时间卷积网络的声音事件定位和检测 arXiv 预印本 arXiv:2003.01609 (2020)。
原文:https://towardsdatascience.com/temporal-fashion-recommender-59c26313fa25?source=collection_archive---------46-----------------------
设计任何推荐系统(RecSys)的最大挑战之一是处理时间变化。由于时尚界随着时间而发展,我们设计的推荐人也必须适应变化的潮流。
在本文中,我们将考虑如何使用时间权重将季节性服装的微妙之处纳入我们的卷积神经网络(CNN)模型。
我们想象中的电子商务公司happy panda co .正在全球扩张,并将推出季节性系列。产品要求是:
从 DeepFashion、开源从 刘 z 等 挑选春夏秋冬服装
从深层的时尚数据中,我选择适合四季的服装。例如,在冬天,大多数人会穿上更厚的夹克来保暖。另一方面,春天和夏天是穿着轻便的衣服在阳光下享受时光的时候。因此,温度在影响人们穿着方面起着重要作用。例如,如果我们考虑一个特定城市全年的*均温度,马德里(西班牙),我们可以将我们选择的服装放置在不同的时间,以观察服装和温度之间的关系。****
马德里(西班牙)温度来自 Kaggle —气候变化:地球表面温度 ( CC BY-NC-SA 4.0 )由伯克利地球
更重要的是,季节之间的过渡需要几周时间,我们的模型应该能够随着时间的推移调整推荐,帮助我们的用户逐渐过渡到下一个季节。****
当然,在现实世界中,我们将有机会获得更丰富的时间序列数据。例如,随着时间的推移,客户的查看/购买趋势,热卖品,或像韩国 Kpop 时尚这样的时尚。这里的天气数据说明了纳入时间序列数据的潜力,而不是问题的最终或唯一的数据解决方案。
在深入研究代码之前,让我们看一下模型的输入/输出,以获得对问题和建议的解决方案的直觉。
输入:
输出:
季节性系列为马德里(西班牙)选择的服装。左:100%冬天。右:100%弹簧。中间:冬春各占一半。服装来自 DeepFashion,开源来自 刘等
从冬天到春天,从一月到五月,马德里的天气逐渐变化。季节性系列可以通过将冬季(外套、长袖、长筒装)的特点与春季(更轻的材质、多彩的穿着、更少的层次感)的特点融合成一个新的“春天来了系列”,从而为过渡期打造一个新系列。我们在这里使用的比例是 50–50,所以冬天和春天在最终的混合中具有相同的权重(我们将在代码部分探讨这个概念)。
季节性系列为墨尔本(澳大利亚)选择的服装。左:100%夏天。右:100%秋天。中间:25–75 度夏秋季混合。服装来自 DeepFashion,开源来自 刘等
与马德里形成鲜明对比的是,墨尔本的夏天迅速过渡到秋天,气温每周都会下降几摄氏度。因此,我们需要积极引入秋季系列的元素,以满足顾客对保暖的需求。使用 25–75 的混合比例,我们为秋季系列赋予了更高的权重,让我们的模特展现出必要的属性,如层次感、长袖和更厚的材料,为顾客保暖。
可见国产化的重要性;针对不同城市不同时期调整模型。对于 RecSys 来说,没有放之四海而皆准的解决方案,尤其是当我们想要跨时态数据进行推荐时。****
链接到 Colab 上的代码 (你只需要一个免费的 Google 账号就可以在云端运行 GPU 上的代码)。
季节性收集建立在卷积神经网络上,从 ResNet 和*似最*邻进行转移学习。我将不深究个别的理论,因为它们已经在许多文章中被很好地涵盖了:
整体设置说明:
卷积神经网络:
ResNet 与迁移学习:
*似最*邻居:
相反,我将专注于季节性系列的核心逻辑:
获取上面墨尔本示例的服装列表的命令是这行代码:
冬季与春季的比率为 1.00。来自 DeepFashion、开源由 刘 z 等人
冬季与春季的比率为 0.75。服装来自 DeepFashion,开源由 刘 z 等人
冬季与春季的比率为 0.50。各路人马出自 DeepFashion,开源出自 刘 z 等人
冬季与春季的比率为 0.25。来自 DeepFashion、开源由 刘 z 等人
冬季与春季的比率为 0.00。服装来自 DeepFashion,开源来自 刘等
我们可以通过调整比率来混合不同的集合,从而直观地将季节性和时间序列数据纳入 RecSys。然而,在现实世界中确定这个比例并不容易。我们将需要进行大量的 AB 测试,并收集来自用户、领域专家、产品团队的反馈。此外,我们将不得不在不同的地区和市场本地化解决方案,以迎合时尚趋势甚至天气的差异。
原文:https://towardsdatascience.com/temporal-graph-networks-ab8f327f2efe?source=collection_archive---------4-----------------------
本帖与 伊曼纽罗西 合著。
一个动态的 Twitter 用户网络,用户可以与 tweets 互动并互相关注。所有的边都有时间戳。给定这样一个动态图表,我们希望预测未来的互动,例如,用户会喜欢哪条推文,或者他们会关注谁。
今年,图形神经网络(GNNs)的研究已经成为机器学习领域最热门的话题之一。GNNs 已经在生物学、化学、社会科学、物理学和许多其他领域的问题上取得了一系列的成功。到目前为止,GNN 模型主要是为不随时间变化的静态图开发的。然而,许多有趣的现实世界的图表是动态的,随着时间的推移而演变,突出的例子包括社交网络、金融交易和推荐系统。在许多情况下,正是这种系统的动态行为传达了重要的见解,否则如果只考虑静态图,就会失去这些见解。
一个动态图可以被表示为一个有序的列表或者一个异步的定时事件“流”,比如节点和边的增加或删除[1]。像 Twitter 这样的社交网络是一个很好的例子:当一个人加入这个*台时,一个新的节点就产生了。当他们跟随另一个用户时,会创建一个跟随边。当他们改变他们的配置文件时,节点被更新。
该事件流被编码器神经网络接收,该编码器神经网络为图的每个节点产生依赖于时间的嵌入。然后,该嵌入可以被馈送到为特定任务设计的解码器中。一个示例任务是通过尝试回答以下问题来预测未来的交互:在时间 t 节点 i 和 j 之间有边的概率是多少?回答这个问题的能力对于推荐系统至关重要,例如,推荐系统建议社交网络用户关注谁或决定显示哪些内容。下图说明了这种情况:
tgn 编码器摄取具有七条可见边(时间戳为 t₁到 t₇)的动态图的示例,目标是预测节点 2 和 4 在 t₈时间(灰色边)的未来交互。为此,TGN 在 t₈.时间计算节点 2 和 4 的嵌入然后,这些嵌入被连接并被馈送到解码器(例如,MLP),该解码器输出交互发生的概率。
上述设置中的关键部分是可以用任何解码器训练的编码器。在前面提到的未来交互预测的任务中,训练可以以自我监督的方式进行:在每个时期,编码器按照时间顺序处理事件,并根据先前的事件预测下一个交互[2]。
Temporal Graph Network(TGN)是一个通用编码器架构,我们在 Twitter 上与同事法布里齐奥·弗拉斯卡、大卫·艾纳德、本·张伯伦和费德里科·蒙蒂共同开发。该模型可以应用于在表示为事件流的动态图上学习的各种问题。简而言之,TGN 编码器通过基于节点的交互来创建节点的压缩表示,并在每个事件发生时更新它们。为了实现这一点,TGN 具有以下主要组件:
记忆。存储器存储所有节点的状态,充当节点过去交互的压缩表示。它类似于 RNN 的隐藏状态;但是,这里我们为每个节点 i 都有一个单独的状态向量sᵢ(t)。当一个新的节点出现时,我们添加一个相应的初始化为零向量的状态。此外,由于每个节点的内存只是一个状态向量(而不是一个参数),当模型接受新的交互时,它也可以在测试时更新。
消息功能是更新存储器的主要机制。给定在时间 t 节点 i 和 j 之间的交互,消息函数计算两个消息(一个给 i 一个给 j ),用于更新存储器。这类似于在消息传递图神经网络中计算的消息[4]。该消息是在交互之前的时间 t⁻ 的情况下节点 i 和 j 的存储器、交互时间 t 和边缘特征[5]的函数:
存储器更新器用于用新消息更新存储器。这个模块通常被实现为一个 RNN。
假设一个节点的记忆是一个随时间更新的向量,最直接的方法是直接用它作为节点嵌入。然而,实际上,由于陈旧性问题,这是一个坏主意:假设只有当节点参与交互时,内存才会更新,节点长时间的不活动会导致其内存过期。举个例子,想象一个用户离开 Twitter 几个月。当用户回来的时候,他们可能已经发展了新的兴趣,所以他们过去活动的记忆不再相关。因此,我们需要一种更好的方法来计算嵌入。
嵌入。一种解决方案是查看节点邻居。为了解决陈旧问题,嵌入模块通过在节点的时空邻居上执行图形聚合来计算节点的时间嵌入。即使一个节点已经不活动了一段时间,它的一些邻居也可能是活动的,并且通过聚集它们的记忆,TGN 可以为该节点计算最新的嵌入。在我们的例子中,即使当用户离开 Twitter 时,他们的朋友仍然是活跃的,所以当他们回来时,朋友最*的活动很可能比用户自己的历史更相关。
图嵌入模块通过对目标节点的时间邻域执行聚合来计算目标节点的嵌入。在上图中,当在大于 t ₂ 、t ₃ 和 t ₄ 但小于 t ₅ 的某个时间 t 计算节点 1 的嵌入时,时间邻域将仅包括在时间 t 之前出现的边。因此,具有节点 5 的边不包括在计算中,因为它在未来发生。相反,嵌入模块聚集来自邻居 2、3 和 4 的特征(v)和存储器(s)以及边上的特征,以计算节点 1 的表示。在我们的实验中,表现最好的图形嵌入模块是图形注意力,它能够根据邻居的记忆、特征和交互时间来学习哪些邻居是最重要的。
下图总结了 TGN 对一批训练数据进行的整体计算:
TGN 对一批训练数据进行的计算。一方面,嵌入模块使用时态图和节点的存储器产生嵌入(1)。然后,嵌入用于预测批次相互作用并计算损失(2,3)。另一方面,这些相同的交互用于更新存储器(4,5)。
通过查看上图,您可能会想知道与内存相关的模块(消息功能、消息聚合器、和内存更新器)是如何训练的,因为它们似乎不会直接影响损耗,因此不会接收到梯度。为了让这些模块影响损失,我们需要在预测批次相互作用之前更新内存。然而,这将导致泄漏,因为内存中已经包含了我们试图预测的信息。我们提出的解决这个问题的策略是用来自之前批次的消息更新内存,然后预测交互。下图显示了训练存储器相关模块所需的 TGN 的操作流程:
训练记忆相关模块所需的 TGN 的操作流程。引入了一个新的组件,原始消息存储,它存储了计算消息所必需的信息,我们称之为原始消息,用于模型过去已经处理过的交互。这使得模型可以将交互带来的内存更新延迟到后面的批次。首先,使用从先前批次(1 和 2)中存储的原始消息计算的消息来更新存储器。然后可以使用刚刚更新的存储器(灰色链接)(3)来计算嵌入。通过这样做,存储器相关模块的计算直接影响损耗(4,5),并且它们接收梯度。最后,这个批处理交互的原始消息被存储在原始消息存储库(6)中,以便在将来的批处理中使用。
在对各种动态图进行的大量实验验证中,TGN 在未来边缘预测和动态节点分类任务中,无论是在准确性还是速度方面,都明显优于竞争方法[6]。一个这样的动态图是 Wikipedia,其中用户和页面是节点,交互表示用户编辑页面。编辑文本的编码被用作交互特征。这种情况下的任务是预测用户在给定时间将编辑哪个页面。我们将 TGN 的不同变体与基线方法进行了比较:
根据预测准确性和时间,比较 TGN 和旧方法(戴雷普、TGAT 和乔迪)在维基百科数据集上的未来链接预测的各种配置。
这项消融研究阐明了不同 TGN 模块的重要性,并让我们得出一些一般性结论。首先,记忆很重要:它的缺失会导致性能的大幅下降[7]。其次,嵌入模块的使用(与直接输出内存状态相反)很重要。基于图注意力的嵌入表现得最好。第三,具有存储器使得仅使用一个图关注层就足够了(这极大地减少了计算时间),因为 1 跳邻居的存储器给予模型对 2 跳邻居信息的间接访问。
作为结束语,我们认为对动态图的学习几乎是一个未开发的研究领域,有许多重要和令人兴奋的应用以及重大的潜在影响。我们相信,我们的 TGN 模型是向提高在动态图上学习的能力迈出的重要一步,巩固并扩展了以前的结果。随着这一研究领域的发展,更好、更大的基准将变得至关重要。我们现在正致力于创建新的动态图形数据集和任务,作为开放图形基准的一部分。
[1]这种场景通常被称为“连续时间动态图”。为简单起见,这里我们只考虑节点对之间的交互事件,用图中的边来表示。当一个端点不在图中时,节点插入被认为是新边的特殊情况。我们不考虑节点或边的删除,这意味着该图只能随着时间的推移而增长。由于一对节点之间可能有多条边,从技术上讲,我们拥有的对象是一个多图。
[2]多个交互可以具有相同的时间戳,并且模型独立地预测它们中的每一个。此外,通过将有序的事件列表分割成固定大小的连续块来创建小批量。
[3] E. Rossi 等动态图上深度学习的时态图网络 (2020)。arXiv:2006.10637。
[4]为了简单起见,我们假设该图是无向的。在有向图的情况下,将需要两个不同的消息函数,一个用于源,一个用于目的地。
[5] J. Gilmer 等人量子化学的神经信息传递 (2017)。arXiv:1704.01212。
[6]我们并不是第一个研究动态图的人。然而,大多数先前的方法集中于离散时间动态图的更有限的情况,例如 A. Sankar 等人通过自我注意网络的动态图表示学习,Proc .WSDM 2020,或者时态知识图的具体场景,比如 A. García-Durán et al. 学习序列编码器用于时态知识图完成 (2018)。继续。EMNLP 或 Z. Han 等. Graph Hawkes 神经网络用于时态知识图的预测2020。参见 s .卡泽米等人的动态图的表示学习:一个调查以获得这种方法的更广泛的概述。另一方面,在动态图上进行深度学习的方法屈指可数,如 R. Trivedi 等人的 dy rep在动态图上进行表示学习 (2018),arXiv:1803.04051,D. Xu 等人的在时态图上进行归纳表示学习 (2020),arXiv:2002.07962 和 S. Kumar 等人的 Jodie在时态上预测动态嵌入轨迹我们证明了这些方法可以作为 TGN 的特殊构型得到。出于这个原因,TGN 似乎是迄今为止在动态图上学习的最通用的模型。
[7]虽然存储器包含关于节点过去所有交互的信息,但是图嵌入模块只能访问时间邻域的样本(出于计算原因),因此可能无法访问手头任务的关键信息。
作者感谢 Giorgos Bouritsas、Ben Chamberlain 和 Federico Monti 对本文的校对,并感谢 Stephan Günnemann 参考了动态知识图的早期作品。本帖的 中文翻译 由 刘止庸 提供。参见 Twitter Research GitHub 资源库中的 TGN 代码 。对图形 ML 和几何深度学习感兴趣?参见我的 其他文章 在走向数据科学, 订阅 到我的帖子,获取 中等会员 ,或者关注我的 推特 。
原文:https://towardsdatascience.com/ten-eisen-features-that-changed-the-way-i-do-deep-learning-f0358f664dec?source=collection_archive---------59-----------------------
一个简单的“pip 安装艾森”将如何节省几天的工作,并解决(几乎)你所有的问题。
克里斯娅·克鲁兹在 Unsplash 上的照片
Eisen 是一个 python 包,可以促进和加速深度学习模型的训练和开发。我已经在之前的一篇博文中谈到了这个项目。总之,Eisen 构建于 PyTorch 之上,提供加载、转换数据、训练模型、实现模型和数据并行、利用混合精度训练等功能。这些功能是为医学图像分析量身定制的,但可以轻松扩展到其他方面。
作为一名专业的深度学习开发者和研究人员,我很好地利用了艾森的特性。我想在这篇博文中分享十个最好的特点。
有时模型太大,我们无法在单个 GPU 的内存中容纳它们。这种情况经常发生在高分辨率断层扫描数据(如 CT、MRI)、视频数据和通过数字病理学获得的图像中。
在这种情况下,唯一的解决方案是在不同的 GPU 之间划分模型,这将在多个处理器上分布层,并利用增加的可用内存和计算能力。这种技术被称为模型并行。众所周知,模型并行性很难实现,团队可能会花费数周甚至数月的时间来实现它。
Eisen 仅用一行代码就在多 GPU 机器中实现了自动模型并行。
这个特性是 Eisen 独有的,坦率地说非常有用。我已经在另一篇博文中写了关于 Eisen 中的模型并行性,并进行了一次基准测试,所以请随意关注这个链接以了解更多信息。
数据并行也可以通过 PyTorch 实现,作为一个具有几乎相同接口的单行程序。
观察培训进展的指标和指示对于了解什么有效,什么可以改进是至关重要的。我在自己的工作中每天使用的功能之一是 Eisen 中包含的 Tensorboard 摘要生成功能。
这个功能最好的方面是它是全自动的!需要定义一个 TensorboardSummaryHook 并将其与工作流关联起来,以获得工作流进度的详细报告。
这简单的一行将生成捕获工作流每个方面的摘要。
我在这里提供了几个截图,展示了上面写的一行代码可以实现的信息粒度。
每个输入、输出、损失和指标的标量摘要。令人惊讶的是,有时查看输入和输出的*均值和标准差是多么有用。
影像摘要直观地展示了网络的输入内容。一整批被整理在一起,以便给出一个更完整的代表。可选地,也可以绘制有用的表示,例如混淆矩阵和 PR 曲线。
分布(和直方图)为我们提供了输入、度量、输出和损失的范围和分布的直观表示。
自动混合精度(AMP)可以加快训练速度,降低深度学习模型的内存占用。NVIDIA 在开发和展示减少精确训练的优势方面投入了大量精力。例如,张量核通过使用专门的硬件来执行一些运算,如矩阵乘法,以降低的精度提供非常快速的计算。AMP 旨在自动和动态地选择是否在每一层中使用降低的精度。
如果你已经安装了 NVIDIA Apex ,艾森提供专门的混合精度训练工作流程。一旦 Torch 1.6.0 变得稳定,这一功能将作为原生 pytorch 功能和通过 APEX 提供给
声明 AMP 工作流很简单
一旦 AMP 的本地 PyTorch 实现发布后,将会非常相似。
你想参加公开挑战吗?你有兴趣在来自Grand-Challenge.org或 Kaggle 的数据集上尝试你的想法吗?你想为即将到来的 MICCAI 比赛做好准备吗?
艾森能够从 11 个不同的公共数据集加载数据,随着项目的进展,对其他数据源的支持只会进一步扩展。这是迄今为止任何旨在促进医学成像深度学习的包所支持的最高数量的数据集。
唯一需要做的事情是下载数据,解压 zip 文件,并使用 eisen 中实现的一个数据集来加载它。这通常是一行程序,指定数据被解包的目录。其余的都是自动处理的。截至目前,艾森支持:
谁没梦想过不用写一行代码就能建立深度学习模型呢?艾森实际上实现了可视化实验大楼,它允许控制实验的每个方面,从随机种子选择、数据集、优化器并行策略等。通过在直观的 web 界面中拖拽&来执行培训/验证。
拖放 Eisen 模块来构建实验和模型,无需编写任何代码。
本练习的结果将是一个 JSON 格式的配置文件,可以通过 CLI 使用。
Eisen 可以以多种不同格式保存模型,甚至支持用户扩展可能需要的自定义保存/打包功能。ONNX 允许模型部署在各种生产场景中,从嵌入式设备、专业加速器(如 NVIDIA Jetson)、手机,甚至通过 ONNX.js 部署在网页中。
虽然艾森目前正在进行 TensorRT 车型包装, ONNX 车型保存已经成为现实。这个功能可以作为钩子使用,这样一旦训练或验证损失/度量表明模型实际上运行良好,它就可以在训练期间自动完成,或者它可以作为一个独立的功能来完成。
当用作挂钩时,该功能可通过编写以下内容来使用:
否则,可以通过编写以下内容来使用独立版本:
艾森与 PyTorch 生态系统的整体是相容的。也就是说,如果您有一个用 PyTorch 编写的模型,它将直接与 Eisen 兼容,您将能够直接使用它,而无需在 Eisen 工作流中进行更改。艾森适应任何自定义模型,无论输入输出的类型和数量以及它可能拥有的层。
除了这一功能之外,Eisen packs 还包含了一些常见的网络架构:
尽管这些没有预先训练好的权重,但是如果您想要实现一些健壮的基准测试并与这些架构进行比较,它们是非常有用的。
教程还展示了如何在 Eisen 中使用 Torchvision 模型。
我每天都会用到的另一个特性是加载各种数据类型的能力。Eisen 的 I/O 功能基本上支持每一种可能的医学成像文件格式,甚至更多。
支持医学特定格式包括 ITK 格式,例如。mha,。mhd 等,Nifti 格式。nii 和. nii.gz 和 DICOM .dcm 当然。png,。PIL 仍然支持 jpeg 和所有其他图像格式。
文档阐明了这些能力。
为了使数据适合于训练,我们要花费多少时间来编写代码来转换数据?在我们的项目中使用可靠的数据转换和增强链之前,我们通常需要找出多少错误?如果 Eisen 生成的 Tensorboard 摘要通常足以发现数据处理代码的错误和问题,那么使用 Eisen 为大量场景提供的开箱即用、经过测试且可靠的转换可能是个好主意。
Eisen 中的数据集总是以字典的形式返回数据点。每个训练示例被表示为具有多个字段的字典。
艾森转换对这些字典进行操作,可以添加、删除或修改字段。例如,数据集可能返回图像的路径,而不是图像本身。然后,转换链将包括将图像替换为数据字典中的路径的数据加载。标签可以作为数据集的一些高级处理的结果来计算,例如使用与患者相关的原始元数据。转换可能会包括完全成熟的人工智能模型,这些模型处理来自不同字典领域的信息,并因此创建新数据。
Eisen 目前包含 18 种变换,用于执行图像重采样、调整大小、填充、裁剪等任务。文档提供了关于如何为定制用途开发新转换的见解。
此外,Eisen 与 PyTorch 中使用的任何数据转换都兼容,几乎无限扩展了它的数据处理能力。
艾森实施工作流程进行培训、验证和测试。这意味着没有必要再次编写训练代码。每个工作流透明地执行完成其目的所需的所有操作。无论模型是数据并行还是模型并行,无论您有一个还是多个丢失,无论使用什么类型的优化器:一旦任务的所有部分,例如模型、丢失、数据加载器等。只需要一条语句就可以得到一个可以运行的工作流。
我已经多次声明 Eisen 完全兼容大多数 PyTorch 生态系统包。火炬视觉可能是最好的例子。torchvision 中的模型、转换、数据集和几乎所有其他东西都可以直接使用或通过使用包装器来使用。
为此,艾森实现了模型/层,转换和数据集包装器,在这里解释。
例如,人们可以通过简单的书写来使用火炬视觉的 MNIST 数据
并通过以下方式使用火炬视觉(预训练或裸)模型
我希望你喜欢这篇文章,并且我希望你能继续键入唯一必要的命令来改善你作为一个 AI 开发者的生活:
原文:https://towardsdatascience.com/ten-machine-learning-concepts-you-should-know-for-data-science-interviews-70107ca84754?source=collection_archive---------1-----------------------
马克斯·兰格洛特在 Unsplash 上的照片
如你所知,数据科学和机器学习可以提供无穷无尽的信息和知识。也就是说,大多数公司测试的核心理念屈指可数。这是因为这十个概念是更复杂的想法和概念的基础。
在这篇文章中,我将涵盖我认为你应该学习和理解的十个最基本的机器学习概念。
说到这里,我们开始吧!
你可能想知道为什么我要费心把这个放进去,因为它太基本了。然而,我认为重要的是,你要真正理解两者之间的区别,并能够交流这些区别:
监督学习包括在标记为的数据集上学习,其中目标变量是已知的。
无监督学习用于从输入数据中得出推论和发现模式,而不需要参考标记的结果——没有目标变量。
现在你知道了两者的区别,你应该知道一个机器学习模型是有监督的还是无监督的,你也应该知道一个给定的场景是需要有监督的学习算法还是无监督的学习算法。
例如,如果我想预测一位客户是否会购买牛奶,因为他们已经购买了谷类食品,这需要有监督或无监督的学习算法吗?
为了理解偏差-方差权衡,你需要知道什么是偏差和方差。
偏差是由于简化模型的假设而产生的误差。例如,使用简单的线性回归来模拟病毒的指数增长会导致较高的偏差。
方差是指如果使用不同的训练数据,预测值的变化量。换句话说,更重视训练数据的模型将具有更高的方差。
现在,偏差-方差权衡本质上表明,在给定的机器学习模型中,偏差和方差之间存在反比关系。这意味着当你减少模型的偏差时,方差增加,反之亦然。然而,存在一个最佳点,在该点上,特定量的偏差和方差导致最小量的总误差(见下文)。
偏倚方差权衡的可视化(由作者创建)
最常见的正则化方法称为 L1 和 L2。L1 和 L2 正则化都是用于减少训练数据过拟合的方法。
L2 正则化,也称为岭回归,最小化残差*方和加上λ乘以斜率*方。这个附加项被称为岭回归惩罚。这增加了模型的偏差,使得对训练数据的拟合更差,但是也减少了方差。
如果采用岭回归罚分并用斜率的绝对值替换它,则得到套索回归或 L1 正则化。
L2 不太稳健,但有一个稳定的解决方案,而且总是一个解决方案。L1 更稳健,但是具有不稳定的解,并且可能具有多个解。
交叉验证本质上是一种用于评估模型在新的独立数据集上表现如何的技术。
交叉验证最简单的例子是将数据分为三组:训练数据、验证数据和测试数据,其中训练数据用于构建模型,验证数据用于调整超参数,测试数据用于评估最终模型。
这就引出了下一点——机器学习模型的评估指标。
有几个指标可供选择来评估您的机器学习模型,最终选择哪一个取决于问题的类型和模型的目标。
如果您正在评估回归模型,重要的度量标准包括以下内容:
分类模型的指标包括:
降维是减少数据集中特征数量的过程。这主要在您想要减少模型中的方差(过度拟合)的情况下很重要。
最流行的降维技术之一叫做主成分分析或 PCA。从最简单的意义上来说,PCA 涉及将高维数据(例如 3 维)投影到更小的空间(例如 2 维)。这导致数据的维度降低(2 维而不是 3 维),同时保持模型中的所有原始变量。
PCA 通常用于压缩目的,以减少所需的内存并加速算法,以及用于可视化目的,使汇总数据更容易。
数据角力是将原始数据清理并转化为更可用状态的过程。在采访中,你可能会被要求列出一些你在争论数据集时采取的步骤。
数据争论中一些最常见的步骤包括:
Bootstrap 采样方法是一个非常简单的概念,是 AdaBoost 和 XGBoost 等一些更高级的机器学习算法的构建模块。
从技术上讲, bootstrap 抽样法是一种使用带替换的随机抽样的重抽样方法。
如果这听起来令人困惑,请不要担心,让我用图表来解释一下:
假设你有一个有 3 个观察值的初始样本。使用 bootstrap 抽样方法,您也将创建一个包含 3 个观察值的新样本。每个观察都有均等的机会被选中(1/3)。在这种情况下,第二个观察值是随机选择的,将是我们新样本中的第一个观察值。
在随机选择了另一个观察点后,你选择了绿色的观察点。
最后,再次随机选择黄色观察值。记住,自举抽样使用随机抽样的与替换。这意味着已经选择的观察结果很有可能再次被选择。
而这就是 bootstrap 抽样的精髓!
虽然深度学习不是每个数据科学工作都需要的,但它的需求肯定在增加。因此,对什么是神经网络以及它们如何工作有一个基本的了解可能是一个好主意。
从根本上来说,神经网络本质上是一个数学方程网络。它接受一个或多个输入变量,并通过一个方程式网络,产生一个或多个输出变量。
在神经网络中,有一个输入层,一个或多个隐藏层,以及一个输出层。输入层由一个或多个特征变量(或输入变量或独立变量)组成,表示为 x1,x2,…,xn。隐藏层由一个或多个隐藏节点或隐藏单元组成。节点就是上图中的一个圆圈。类似地,输出变量由一个或多个输出单元组成。
就像我一开始说的,神经网络只不过是一个方程网络。神经网络中的每个节点由两个函数组成,一个线性函数和一个激活函数。这是事情变得有点混乱的地方,但是现在,把线性函数想成一些最佳拟合线。另外,把激活功能想象成一个电灯开关,它会产生一个介于 1 或 0 之间的数字。
一些最好的机器学习算法结合了这些术语,因此,理解什么是集成学习、bagging 和 boosting 是非常重要的。
集成学习是一种多种学习算法联合使用的方法。这样做的目的是让您获得比单独使用单个算法更高的预测性能。
Bagging 又称 bootstrap aggregating ,是用原始数据集的自举样本对同一学习算法的多个模型进行训练的过程。然后,像上面的随机森林示例一样,对所有模型的输出进行投票。
装袋过程(由作者创建)
Boosting 是 bagging 的一种变体,其中每个单独的模型都是按顺序构建的,并重复上一个模型。具体来说,任何被前一个模型错误分类的数据点都会在后一个模型中得到强调。这样做是为了提高模型的整体准确性。这里有一个图表,可以更好地理解这个过程:
推进过程(由作者创建)
一旦建立了第一模型,除了第二自举样本之外,还采用错误分类/预测的点来训练第二模型。然后,针对测试数据集使用集合模型(模型 1 和 2 ),并且该过程继续。
仅此而已!我希望这对你的面试准备有所帮助,并祝你在未来的努力中好运。希望这能为你在数据科学面试中应该了解的机器学习概念提供一个很好的指导。
不确定接下来要读什么?我为你挑选了另一篇文章:
[## 数据科学面试中你应该知道的十个 SQL 概念
towardsdatascience.com](/ten-sql-concepts-you-should-know-for-data-science-interviews-7acf3e428185)
原文:https://towardsdatascience.com/ten-more-ai-papers-to-read-in-2020-8c6fb4650a9b?source=collection_archive---------16-----------------------
苏珊·尹在 Unsplash 上的照片
答几周前,我发布了一篇关于人工智能(AI)论文的文章,将在 2020 年阅读。如果算上所有的附加阅读建议,总计 27 篇。然而,这份清单还远未完成。许多宝石被遗漏或只是简单提及。在这篇文章中,为了你的阅读乐趣,我列出了今年人工智能论文的十个建议(和其他几个进一步阅读的建议)。
在这个列表中,我主要关注那些没有提出新架构的文章。这不会是最*的 YOLO 或 ResNet 变种。相反,它强调了损失公式、理论突破、更新的优化器等方面的最新进展。
至于上一个列表,我将重点介绍计算机视觉和 NLP,因为这些是我最熟悉的话题,并从一两个经典开始。对于每一篇论文,我都会给出其主要贡献的摘要和阅读它的理由列表。最后,我在每篇文章的结尾都给出了关于该主题的具体阅读建议,并将其与其他最新进展或类似观点联系起来。
我们继续:)
彭宁顿、杰弗里、理查德·索彻和克里斯托弗·d·曼宁。“手套:单词表示的全局向量。”2014 自然语言处理经验方法会议论文集。2014.
虽然今天的社区非常关注神经网络,但许多早期结果是通过简单得多的数学获得的。从经典算法开始,GloVe 是一个基于降低单词共现矩阵维度的单词嵌入模型。与以前的方法不同,GloVe 使用隐式公式,这使得它可以扩展到大规模文本语料库。
原因#1: 如果你从自然语言处理(NLP)开始,这是一个很好的阅读材料,可以了解单词嵌入的基础知识以及它们为什么重要。
理由#2: 曾几何时,并不是一切都以变形金刚为原型。阅读早期的作品是找到那个“被遗忘的想法”的一个极好的方式,这个想法可以将艺术水*推得更远。
原因 3: 本文中提到/提出的许多概念后来被许多其他作者扩展。今天,单词嵌入是自然语言处理(NLP)文献中的主要内容。
延伸阅读:大约在同一时期,Google 发布了 Word2Vec ,另一个众所周知的生成语义向量的模型。不久之后,这些想法被生物学界采用,作为表示大蛋白质和基因序列的方法。今天, BERT 是单词表示和语义理解的主导人物。
弗氏,Yoav 罗伯特·沙皮雷(1997 年)。在线学习的决策理论概括和 boosting 的应用。
经典的机器学习模型一点也不灵活。大多数配方都有惊人的局限性,这使得它们无法扩展到越来越复杂的任务。这个问题的第一个解决方案是将最佳可用模型集成到民主投票中。1997 年, Freund 和 Schapire 提出了 AdaBoost 算法,这是一种元启发式学习器,能够将许多“弱”模型转化为“强”分类器。
简而言之,该算法基于迭代训练更多的分类器,并将每个训练样本重新加权为“容易”或“困难”随着训练的进行,集合通过更多地关注更难分类的样本而进化。该算法非常有效,以至于即使是复杂的问题也容易过度拟合。
理由#1: 可以认为神经网络是弱分类器(神经元/层)的集合。然而,神经网络文献已经独立于整体而发展。读一篇关于这个主题的论文可能会对神经网络为什么工作得这么好有一些见解。
原因#2: 许多新手认为经典的机器学习方法过时且“薄弱”,在几乎所有事情上都倾向于使用神经网络。AdaBoost 是经典机器学习一点也不弱的一个很好的例子。而且,与网络不同,这些模型是高度可解释的。
原因#3: 有多少论文是从一个赌徒因与朋友赌马屡输而沮丧的故事开始的?我希望我敢开一份那样的报纸。
延伸阅读:其他流行的集成方法是随机森林分类器、梯度增强技术,以及广受好评的 XGBoost 包,这些方法因在几个机器学习比赛中获胜而闻名,同时相对容易使用和调整。该家族的最新成员是微软的 LightGBM ,面向大规模分布式数据集。
萨布尔、萨拉、尼古拉斯·弗洛斯特和杰弗里·e·辛顿。“胶囊间动态路由” 神经信息处理系统的进展。2017.
神经网络文献从感知器模型开始,并到达卷积神经网络(CNN)。下一次大跃进是一个备受争议的话题。Sara Sabour、Nicholas Frosst 和图灵奖获得者 Geoffrey Hinton 提出的胶囊网络就是其中之一。
理解胶囊网络的一个简单方法是用“胶囊”代替“物体探测器”每一层“对象检测器”试图识别图像中的相关特征,以及其姿态(方向、比例、倾斜等)。).通过堆叠检测器,可以得到物体的鲁棒表示。本质上,胶囊并不像 CNN 那样将本地信息聚集到高级特征上。取而代之的是,他们检测对象的各个部分,并对它们进行分层组合,以识别更大的结构和关系。
理由 1: 作为科学家,我们都应该寻找下一件大事。虽然我们不能说胶囊网络将成为下一个摇滚明星,但我们可以说他们试图解决的问题是相关的。并且,至于所有相关的问题,最终都会有人来回答。
理由#2: 这篇论文提醒我们,CNN 并不完美。它们对于旋转和缩放不是不变的。虽然我们使用数据增强来缓解这种情况,但没有创可贴曾经治愈过一个人。
原因#3: 在深度学习成为主流之前,许多对象检测方法依赖于识别容易发现的对象部分,并针对数据库/本体进行模式匹配。Hinton 和他的团队正在做的是使这种早期的方法现代化。这就是为什么我们都应该时不时地阅读经典著作。很多东西都可以更新。
延伸阅读:在过去的一年中,有一件事得到了很多关注,那就是注意力机制。虽然它没有试图取代或增加卷积,但它确实为全局推理提供了一个途径,这是现代网络的许多阿基里斯脚跟之一。
彼得·w·巴塔格利亚等人“关系归纳偏差、深度学习和图形网络” arXiv 预印本 arXiv:1806.01261 (2018)。
部分立场文件,部分评论,部分统一,这篇文章总结了 Deep Mind 团队认为深度学习中的下一件大事:图形神经网络(GNNs)。用作者自己的话说:
(…).我们认为,组合概括必须是人工智能实现类似人类能力的首要任务,而结构化表示和计算是实现这一目标的关键。正如生物学合作利用先天和后天,我们拒绝在“手工工程”和“端到端”学习之间的错误选择,而是提倡一种从它们的互补优势中受益的方法。我们探索了在深度学习架构中使用关系归纳偏差如何促进对实体、关系和组成它们的规则的学习。(…)
旁注:归纳偏差是学习算法对数据做出的所有假设。例如,线性模型假设数据是线性的。如果一个模型假设数据有特定的关系,它就有一个关系归纳偏差。因此,图形是一种有用的表示。
原因#1: 当前的 CNN 模型是“端到端”的,这意味着它们处理原始的、大部分未经处理的数据。特征不是由人类“设计”的,而是由算法自动“学习”的。我们大多数人被告知特征学习更好。在本文中,作者提供了相反的观点。
原因 2: 大多数早期的人工智能文献都与计算推理有关。然而,计算直觉占了上风。神经网络不考虑输入;它们会产生相当准确的数学“预感”图表可能是通向直觉推理的桥梁。
原因 3: 组合问题可以说是计算机科学中最关键的问题。大多数都处于我们认为易处理或可能的边缘(或更远)。然而,我们人类自然地、毫不费力地进行推理。图形神经网络可能是答案吗?
延伸阅读: GNNs 是一个令人兴奋且不断发展的领域。从图论中,我们知道几乎任何东西都可以被建模为图。谢尔盖·伊万诺夫在 GNNs 中列出了一份极好的新趋势列表,其中引用了大量来自即将到来的 2020 年 ICLR 会议的论文。
[## 2020 年图形机器学习的主要趋势
towardsdatascience.com](/top-trends-of-graph-machine-learning-in-2020-1194175351a3)
Frankle,Jonathan,David J. Schwab,Ari S. Morcos .“训练批处理范式和唯一批处理范式:论细胞神经网络中随机特征的表达能力” arXiv 预印本 arXiv:2003.00152 (2020)。
您相信仅 ResNet-151 的批量标准化层就能在 CIFAR-10 上实现+60%的准确率吗?换句话说,如果你锁定所有其他层的随机初始权重,并训练网络五十个左右的时期,它将比随机的表现更好。我不得不复制这张纸来亲眼看看。“魔力”来自于经常被遗忘的批处理规范的γ和β参数:
批处理规范化操作的完整定义。γ和β是两个可学习的参数,允许图层在标准化发生后缩放和移动每个激活图。
理由 1: 这是一个足够疯狂的想法,值得一读。打破常规的想法总是受欢迎的。
原因#2: 你可能会问自己批处理规范层怎么能学到任何东西,你可能还会想为什么有人会关心这个。对于数据科学中的很多东西,我们认为批量范数是理所当然的。我们相信这只会加速训练。显然,它可以做得更多。
原因#3: 本文可能会引起您的兴趣,让您了解所有常见图层都具有哪些参数和超参数。
延伸阅读:大部分课程讲授的是批量范数层对抗所谓的内部协方差移位问题。最*的证据显示情况并非如此。相反,作者认为 BN 层使整体损失情况更加*稳。另一个别出心裁的想法是彩票假说,也是由 Frankle 等人提出的。
宫藤,Takeru,等人“生成性对抗网络的谱规范化” arXiv 预印本 arXiv:1802.05957 (2018)。
在 GAN 文献中, Wasserstein 损失改进了训练 GAN 的几个关键挑战。然而,它要求梯度必须具有小于或等于 1 的范数( 1-Lipschitz )。损失的原始作者建议将权重修剪为[-0.01,0.01],作为一种加强小梯度的方式。用计算机科学术语来说,就是黑客。作为回应,谱范数被提出作为一个*滑的替代方案来约束权重矩阵,以产生最多一个单位梯度。更清洁的解决方案。
原因 1: 标准化是一个比大多数人意识到的要大得多的话题。许多特殊属性可以通过专门的规范化和精心的激活功能设计来实现。
原因#2: 这除了是一种规范,也是一种正则化,是神经网络设计中经常被忽略的话题。除了辍学之外,阅读关于这个问题的成功论文令人耳目一新。
延伸阅读:归一化技术的其他最新进展是组归一化和自适应实例归一化技术。前者解决了小批量批量标准的一些缺点,而后者是任意风格转换的关键突破之一。
约翰逊、贾斯汀、亚历山大·阿拉希和李菲菲。“实时风格转换和超分辨率的感知损失”T2【欧洲计算机视觉会议】T3。施普林格,查姆,2016。
大多数神经网络背后的驱动力是损失函数。亏损越能描述什么是好什么是坏,我们就能越快地收敛到有用的模型。在文献中,大多数损失相对简单,只能测量低水*的属性。除此之外,捕捉高级语义是众所周知的棘手。
感知损失论文认为,预先训练的网络可以用来测量语义相似度,而不是手工设计复杂的损失函数。在实践中,生成的和地面真实的结果通过预先训练的 VGG 网络,并比较特定层的激活。相似的图像应该有相似的激活。早期图层捕捉广泛的特征,而后期图层捕捉更细微的细节。
原因#1: 亏损是培养优秀模特最重要的方面之一。没有适当的反馈信号,任何优化过程都不会收敛。这就是好老师的作用:给予反馈。
原因#2: 成功的新亏损往往是一个里程碑。甘斯所达到的质量,是在感知丧失被发明出来之后的飞跃。理解这部作品对于理解后来的大部分文献是必不可少的。
原因#3: 这些神经损失既神秘又有用。虽然作者对这些模型的工作提供了合理的解释,但它们的许多方面仍然是开放的,就像神经网络中的大多数事情一样。
延伸阅读:神经网络的一个迷人之处是它们的可组合性。这项工作使用神经网络来解决神经网络问题。拓扑损失论文将这一思想扩展到图像分割问题。神经架构搜索(NAS) 文献利用神经网络寻找新的神经网络。至于计算机视觉的其他损失,这里有一个综合指南。感谢Sowmya yelapragada将这个伟大的名单放在一起:)
[## 理解计算机视觉中的损失函数!
medium.com](https://medium.com/ml-cheat-sheet/winning-at-loss-functions-2-important-loss-functions-in-computer-vision-b2b9d293e15a)
多扎特蒂莫西。“把内斯特洛夫的动力融入亚当” (2016)。
我们大多数人都熟悉 SGD、Adam 和 RMSprop 等术语。有些人还知道一些不太熟悉的名字,如阿达格拉德、阿达德尔塔和阿达马克斯。然而,很少有人花时间去理解这些名字的含义,以及为什么亚当是现今的默认选择。Tensorflow 捆绑了 Nadam,这是对 adam 的改进,但大多数用户都没有意识到这一点。
理由#1: 这份技术报告对大多数神经网络优化器提供了全面而直接的解释。每一种都是对其他产品的直接改进。很少有论文能在两页半的篇幅内涵盖如此数学化的主题。
原因 2: 我们都认为优化者理所当然。理解它们的基本原理对改进神经网络非常有用。这就是为什么当 RMSprop 不收敛时,我们用 Adam 代替它,后来又用 SGD 代替它。
延伸阅读:自 2016 年以来,已经提出了许多其他对优化器的改进。有些会在某个时候并入主流图书馆。看看拉达姆、前瞻和游侠的一些新想法。
Nakkiran,Preetum,et al. 《深度双重下降:更大的模型和更多的数据带来的伤害》 arXiv 预印本 arXiv:1912.02292 (2019)。
传统观点认为,小型号不足,大型号过多。然而,在彩虹之上的某处,更大的模型仍然闪耀着光芒。
在这篇论文中,Nakkiran 等人展示了几个模型在规模增长时表现出“双重下降”现象的证据。测试精度下降,然后上升,再下降。此外,他们认为拐点在“插值阈值”:模型大到足以插值数据的点。换句话说,当一个模型被训练得超越了该领域所建议的一切,它就开始改进了。
理由 1: 大多数课程都教授偏差/方差权衡。显然,这个原则只在一定程度上适用——是时候复习基础知识了。
原因#2: 如果增加历元数也穿过插值点,我们都应该放弃早期停止,看看会发生什么。集体来说,我们都可以做科学。
原因 3: 这一点和第五点都很好地提醒了我们还有很多我们不知道的。不是所有我们学到的都是对的,也不是所有直觉的都是正确的。
延伸阅读:更轻松的阅读是图像分类锦囊论文。在这本书里,你会找到几个简单可行的建议来从你的模型中提取额外的性能下降。
弗朗索瓦,乔莱。《论智力的衡量》 arXiv 预印本 arXiv:1911.01547 (2019)。
大多数人都在努力多走一步,弗朗索瓦·乔莱(Franç ois Chollet)正在努力实现梦想。
在这个列表中,所有提到的文章都将实践和理论的最新水*推进了一步。有些已经被广泛采用,有些支持这种或那种技术,还有一些为融合提供了很好的改进。然而,房间里的大象智力仍然是一个神秘而难以捉摸的话题,更不用说神秘莫测了。
时至今日,人工智能领域向一般智能的进步只能用“成就”来粗略衡量。每隔一段时间,一种算法就会在一项复杂的任务中击败人类,比如国际象棋、Dota 2 或围棋。每当这种情况发生时,我们就说我们离目标更*了一步😃。然而,这不足以衡量智力的技能获取效率组成部分。
在这篇(很长的)文章中,Chollet 认为:“为了朝着更智能、更像人类的人工系统稳步前进,我们需要遵循适当的反馈信号。”换句话说,我们需要一个合适的机器智能基准。一种智商测试。由此,作者提出了抽象与推理语料库(ARC) :
“ARC 可以看做通用的人工智能基准,可以看做程序合成基准,也可以看做心理测量智能测试。它的目标是人类和人工智能系统,旨在模仿类似人类的一般流体智能形式。”
理由 1: 虽然数据科学很酷很时髦,但人工智能才是真正的东西。如果没有人工智能,就不会有数据科学。它的最终目标不是在数据中寻找洞察力,而是建造能够拥有自己想法的机器。花点时间思考一些基本问题:什么是智力,我们如何衡量它?这篇论文是一个良好的开端。
原因#2: 在过去的几十年里,IA 社区被来自数理逻辑和演绎推理的思想所主导。然而,在没有任何形式的显式推理的情况下,支持向量机和神经网络在该领域的发展远远超过了基于逻辑的方法。ARC 会引发经典技术的复兴吗?
原因 3: 如果 Chollet 是对的,我们距离创建能够解决 ARC 数据集的算法还有好几年的时间。如果你正在寻找一个数据集在你的业余时间玩,这里有一个会让你忙起来:)
延伸阅读:2018 年,Geoffrey Hinton、Yosha Bengio 和 Yan LeCun 因其在深度学习基础方面的开创性工作获得了图灵奖。今年,在 AAAI 会议上,他们分享了他们对人工智能未来的看法。可以在 Youtube 上看:
我想引用杰弗里·辛顿的一句话来结束这篇文章,我认为这句话概括了一切:
"未来取决于某个对我所说的一切深感怀疑的研究生。"
GloVe 通过隐式的方式抑制了共现矩阵。AdaBoost 制造了数百个最先进的弱分类器。胶囊网络挑战 CNN,而图形神经网络可能会取代它们。关键进步可能来自规范化、损失和优化器,而我们仍然有空间质疑批量规范和训练过度参数化的模型
我想知道还有多少关于辍学和重新学习的事情有待发现。
我希望这本书对你和我来说都是令人兴奋的。请让我知道你认为符合这个列表的其他文件。我将很高兴阅读和考虑他们的未来列表😃
编辑:写完这个单子,我用十篇 GAN 论文编了三分之一,2020 年读。如果你喜欢阅读这份(以及之前的)清单,你可能会喜欢阅读第三份:
[## 甘 2020 年要读的论文
towardsdatascience.com](/gan-papers-to-read-in-2020-2c708af5c0a4)
欢迎评论或联系我。如果你刚接触媒体,我强烈推荐订阅。对于数据和 IT 专业人士来说,中型文章是 StackOverflow 的完美搭档,对于新手来说更是如此。注册时请考虑使用我的会员链接。你也可以直接支持我请我喝杯咖啡😃
感谢阅读:)
原文:https://towardsdatascience.com/ten-more-random-useful-things-in-r-you-may-not-know-about-f7c39cac7e6b?source=collection_archive---------18-----------------------
我很惊讶于人们对我去年的文章的积极反应,这篇文章列举了十件人们可能不知道的事情。
我有一种感觉,R 作为一种语言已经发展到如此程度,以至于我们中的许多人现在都在以完全不同的方式使用它。这意味着可能有许多我们每个人都在使用的技巧、包、函数等等,但是其他人完全不知道,如果他们知道了,就会发现它们很有用。
老实说,我上次努力把它保持在 10 个,所以这里有 10 个关于 R 的东西,帮助我的工作更容易,你可能会发现有用。如果这些对你目前的工作有帮助,或者如果你对其他人应该知道的事情有进一步的建议,请在这里或 Twitter 上留言。
顾名思义。它允许您对数据库使用。如果你从事数据库工作,并且你从未听说过,那么你很可能仍然在你的代码中使用 SQL 字符串,这迫使你在你真正想要思考整洁的时候去思考 SQL,并且当你想要抽象你的代码来生成函数之类的时候,这可能是一个真正的痛苦。
允许您使用创建您的 SQL 查询。它通过建立一个可以使用函数操作的数据库表,将这些函数转换成 SQL 来实现。例如,如果您有一个名为的数据库连接,并且您想要在中操作一个名为的表,那么您可以将这个表设置为:
然后,您可以在上执行常见的操作,如、、、等,所有这些都将在后台翻译成 SQL 查询。非常有用的是,直到您使用函数最终获取数据时,数据才真正下载到 R 会话中。这意味着您可以让 SQL 做所有的工作,并在最后收集您操作的数据,而不是一开始就必须拉整个数据库。
关于的更多信息,你可以查看我以前的文章这里和教程这里。
人们说 Python 更适合网络抓取。那可能是真的。但是对于我们这些喜欢在 tidyverse 中工作的人来说,和包可以通过使用并允许我们使用管道命令来使简单的网页抓取变得非常容易。鉴于网页上的 HTML 和 XML 代码通常是大量嵌套的,我认为使用构建抓取代码是非常直观的。
通过最初读取感兴趣的页面的 HTML 代码,这些包将嵌套的 HTML 和 XML 节点分成列表,您可以逐步搜索和挖掘感兴趣的特定节点或属性。将它与 Chrome 的 inspect 功能结合使用,可以让你快速从网页中提取你需要的关键信息。
举个简单的例子,我最*编写了一个函数,可以从这个相当时髦的页面中抓取历史上任何时间点的基本 Billboard 音乐图表作为数据帧,代码如下:
更多关于这个例子这里,更多关于 这里,更多关于 这里。
k-means 是一种越来越受欢迎的统计方法,用于对数据中的观察值进行聚类,通常是为了将大量的数据点简化为少量的聚类或原型。包现在允许对纵向数据进行 k 均值聚类,其中的“数据点”实际上是数据序列。
这在你研究的数据点实际上是一段时间的读数时非常有用。这可能是对医院病人体重增加或减少的临床观察,或者是雇员的补偿轨迹。
首先通过使用函数将数据转换成类的对象。然后,它使用“爬山”算法对数据进行划分,对几个值分别测试 20 次。最后,函数允许您以图形方式查看每个的算法结果,并决定您认为的最佳聚类。
最新版本的 RStudio 中的 connections 窗口允许您浏览任何远程数据库,而不必进入像 SQL developer 这样的独立环境。这种便利现在提供了完全在 RStudio IDE 中完成开发项目的机会。
通过在“连接”窗口中设置与远程数据库的连接,您可以浏览嵌套模式、表、数据类型,甚至可以直接查看表以了解数据的摘录。
RStudio 最新版本中的“连接”窗口
更多关于连接窗口的信息,请点击。
R 数据帧中的默认行为是,如果某个特定观察没有数据,则该观察的行不会出现在数据帧中。当您需要将该数据帧用作某个东西的输入时,这可能会导致问题,该数据帧期望看到所有可能的观察值。
通常情况下,当您将数据发送到某个图形函数中,而该函数预期在没有观察值的情况下会看到零值,并且无法理解丢失的行意味着该行中的零值时,就会出现这种问题。当您进行未来预测并且起点缺少行时,这也可能是一个问题。
中的函数允许您填补所有没有数据的观察值的空白。它允许您定义想要完成的观察,然后声明使用什么值来填补缺口。例如,如果您正在对不同品种的公狗和母狗进行计数,并且您有一些组合在样本中没有狗,您可以使用下面的方法来处理它:
这将扩展您的数据框架以确保包含所有可能的和的组合,并且它将用零填充的缺失值。
目前动画图形非常流行,包允许那些使用的人(我会说是大多数 R 用户)非常简单地扩展他们的代码来创建动画图形。
的工作原理是获取存在于一系列“过渡状态”的数据,通常是几年或其他类型的时间序列数据。您可以绘制每个转换状态中的数据,就好像它是一个简单的静态图表,然后使用函数创建一个在转换状态之间移动的动画。对于如何过渡有许多选项,并且功能允许图形以多种形式呈现,例如动画 gif 或 mpeg。
这里有一个例子,我使用一个管道命令生成了汉斯·罗斯林著名的气泡图:
代码见这里和一个关于的很好的一步一步的教程,我发现真的很有帮助见这里。
D3 是一个非常强大的 javascript 数据可视化库。越来越多的软件包开始变得可用,允许 R 用户在 D3 中构建 viz,例如,这很棒,尤其是因为它允许我们欣赏有史以来最好的十六进制贴纸之一(见这里)。
我最喜欢的 R 的 D3 包是。它已经存在了一段时间,非常适合以一种反应灵敏或美观的方式绘制图形或网络数据。特别是,它可以使用绘制力定向网络,使用绘制桑基图,使用绘制弦图。这是我创建的一个简单的 sankey 网络的例子,它显示了英国退出欧盟公投中各地区的投票流量。
英国退出欧盟全民投票中使用网络的投票流量 3
更多关于这个具体的例子这里和更多关于网络 3 这里。
包是从 R 到 DataTables javascript 库的接口。这允许在一个闪亮的应用程序或 R Markdown 文档中非常容易地显示表格,这些表格具有许多内置功能和响应能力。这使您不必编写单独的数据下载函数,为用户提供了数据显示和排序的灵活性,并具有内置的数据搜索功能。
例如,一个简单的命令,如:
能做出像这样好的东西:
更多关于 DT 这里,包括如何设置各种选项自定义布局和添加数据下载、复制和打印按钮。
是 Qiu 开发的一个软件包,它提供了一组简单的主题来为您的 RMarkdown 文档创建一个不同的、更漂亮的外观。当你只是想让你的文档变得更有趣一些,但是没有时间自己设计它们的样式时,这是非常有用的。
真的很好用。对文档的 YAML 标题进行简单的编辑,就可以在整个文档中调用一个特定的样式主题,有许多主题可用。例如,这将在标题、表格、嵌入式代码和图形中调用可爱的干净蓝色和样式:
更多关于 这里。
RMarkdown 是记录您的工作的一种很好的方式,它允许您编写一个叙述性的内容,并在一个地方捕获您的代码。但是有时你的代码可能会让人不知所措,对于那些试图阅读你的工作的叙述,而对你如何进行分析的复杂性不感兴趣的非编码人员来说不是特别令人愉快。
以前,我们仅有的选择是在我们的选项中设置或,要么在文档中显示我们的代码,要么不显示。但是现在我们可以在 YAML 头球中设置一个选项,给我们两个世界最好的东西。默认情况下,在 YAML 标题中设置将隐藏代码块,但是在文档中提供了小的下拉框,以便读者可以随时查看所有代码或特定的代码块,就像这样:
R Markdown 中的代码折叠下拉
这就是我接下来的十个随机 R 技巧。我希望这些能有所帮助,请随意在评论中添加你自己的建议,让其他用户阅读。
最初我是一名纯粹的数学家,后来我成为了一名心理计量学家和数据科学家。我热衷于将所有这些学科的严谨性应用到复杂的人的问题上。我也是一个编码极客和日本 RPG 的超级粉丝。在 LinkedIn 或Twitter上找我。
有话要说...