用 Python 中的贝叶斯模型估计概率
(Source)
概率编程在 Python 中的一个简单应用
像最好的项目一样,它从几条推特开始:
Twitter is a great resource for data science!
这似乎是一个简单的问题——患病率与观察到的数据完全相同(50%的狮子,33%的老虎和 17%的熊),对吗?如果你相信我们所做的观察是对潜在真理的完美再现,那么是的,这个问题再简单不过了。然而,作为一个贝叶斯,这种世界观以及随后的推理却令人深感不满。
首先,我们如何确定这一次去保护区的旅行代表了所有的旅行?如果我们在冬天熊冬眠的时候去呢?考虑到有限的数据,我们需要将不确定性纳入我们的估算中。第二,我们如何将先前对形势的信念整合到这个估计中?如果我们从朋友那里听说保护区里每种动物的数量相等,那么这肯定会在我们的估计中起一些作用。
幸运的是,有一个解决方案可以表达不确定性并且将先验信息整合到我们的估计中:贝叶斯推理。
在本文中,我们将在学习概率分布、贝叶斯推理和基本概率规划以及 PyMC3 的过程中,探索在贝叶斯框架中从数据中估计概率的问题。完整的代码可以从 GitHub 上的 Jupyter 笔记本中获得。
PDF and trace values from PyMC3
背景:概念
通常,特别是在统计学中,我发现解决方案背后的理论比实际解决问题更令人困惑。(我相信统计学家为了证明统计数据的存在而将其复杂化。)对我来说,编码一个答案并可视化解决方案通常比阅读无尽的方程更有用。因此,当我着手解决这个问题时,我研究了足够的想法来编码一个解决方案,只有在之后的我才重新挖掘概念。
这反映了我一般的 自上而下学习新话题的方法。不要从基础开始——这通常是乏味和难以理解的——找出如何实现一个想法,这样你就知道为什么它是有用的,然后回到形式主义。所以,如果你觉得自己对这个理论感到沮丧,继续寻找解决方案(从下面的推理部分开始),如果你仍然感兴趣,再回到概念上来。
(这种自上而下的哲学在关于深度学习的优秀 fast.ai 课程中得到了体现。除了有效地教授神经网络之外,这些课程还对我学习新技术的方法产生了影响。)
贝叶斯模型
因为我们想用贝叶斯方法解决这个问题,所以我们需要构建一个情境模型。基本的设置是我们有一系列的观察结果:3 只老虎,2 只狮子和 1 只熊,从这些数据中,我们想估计野生动物保护区中每个物种的流行程度。也就是说,我们正在寻找在给定数据的情况下看到每个物种的后验概率。
在我们开始之前,我们想建立我们的假设:
- 把对一个物种的每一次观察当作一次独立的试验。
- 我们最初(先前)的信念是每个物种都有平等的代表。
整个系统是一个多项分布**,其中我们有 3 个离散的选择(物种),每个选择具有未知的概率和 6 个总观察值。多项式分布是二项式分布在有两个以上结果的情况下的扩展。多项式的一个简单应用是掷骰子 5 次,每次有 6 种可能的结果。**
具有 3 个离散结果的多项式的概率质量函数如下所示:
Probability Mass Function (PMF) of a multinomial with 3 outcomes
多项式分布的特征是 k,即结果的数量,n,即试验的数量,以及 p ,即每个结果的概率向量。对于这个问题, p 是我们的终极目标:我们想从观测数据中算出看到每个物种的概率。在贝叶斯统计中,多项式的参数向量从形成参数先验分布的狄利克雷分布中提取。
反过来,狄利克雷分布的特征在于,k(结果的数量)和α(称为浓度参数的正实值向量)。这被称为超参数,因为它是先前 **的参数。(这个链可以继续下去:如果 alpha 来自另一个发行版,那么这就是一个超优先级,它可以有自己的参数称为超超参数!).我们将通过显式设置 alpha 的值来停止我们的模型,每个结果都有一个条目。
超参数和先验信念
将 Dirichlet 参数向量视为伪计数的最佳方式是,在收集实际数据之前对每个结果进行观察。这些假计数捕捉了我们对情况的先验信念。例如,因为我们认为在进入保护区之前,每种动物的流行程度是相同的,所以我们将所有的阿尔法值设置为相等,比如说阿尔法=【1,1,1】。
相反,如果我们希望看到更多的熊,我们可以使用像[1,1,2]这样的超参数向量(顺序是[狮子,老虎,熊])。伪计数的确切值反映了我们对先前信念的信心水平。较大的伪计数将对后验估计值产生较大的影响,而较小的值将产生较小的影响,并将让数据支配后验估计值。当我们进入推理时,我们会看到这一点,但现在,记住超参数向量是伪计数,反过来,它代表我们先前的信念。
具有 3 个结果的狄利克雷分布如下所示,具有不同的超参数向量值。颜色表示浓度权重。
Effect of the hyperparameter vector alpha on the Dirichlet Distribution (source).
还有很多细节我们不需要在这里深入讨论,但是如果你仍然好奇,可以看看下面列出的一些资源。
我们的最终目标是根据数据和超参数,估计观察到每个物种的概率的后验分布, p :
The posterior distribution of the parameter is our objective. X is observations and alpha is hyperparameters.
我们的最终模型由具有狄利克雷先验的多项式分布组成,称为狄利克雷多项式,如下所示:
Model of problem
下面是问题细节的摘要:
Model specifics
如果你还想要更多的背景细节,这里是我所依赖的一些来源(第一个可能是最有价值的):
来源:
还有其他方法来解决这个问题;艾伦·唐尼的解决方案产生了类似的结果。
推论:从数据中做出估计
现在我们有了问题的模型,我们可以使用贝叶斯方法来求解后验概率。统计学中的推断是从数据中估计(推断)一个概率分布的未知参数的过程。我们的未知参数是每个物种的流行程度,而数据是我们从野生动物保护区观察到的一组数据。我们的目标是找到看到每个物种的概率的后验分布。
我们推导后验概率的方法将使用贝叶斯推理。这意味着我们建立模型,然后用它从后验数据中取样,用马尔可夫链蒙特卡罗 (MCMC)方法近似后验数据。当难以进行精确推断时,我们使用 MCMC,并且随着样本数量的增加,估计的后验收敛于真实的后验。
MCMC 的结果不仅仅是我们答案的一个数字,而是一系列样本,让我们量化我们的不确定性,尤其是在数据有限的情况下。我们将很快看到如何在 Python 中执行贝叶斯推理,但是如果我们想要一个单一的估计,我们可以使用分布的期望值。
预期值
期望值是后验分布的平均值。对于狄利克雷多项式,它可以用解析地表示为:
Expected value of a Multinomial with Dirichlet priors.
一旦我们开始输入数字,这个问题就很容易解决了。n 是试验次数,6,c_i 是每个类别的观测计数,alpha_i 是每个类别的伪计数(超参数)。设置所有α等于 1,可以计算预期物种概率:
species = ['lions', 'tigers', 'bears']
# Observations
c = np.array([3, 2, 1])
#Pseudocounts
alphas = np.array([1, 1, 1])expected = (alphas + c) / (c.sum() + alphas.sum())**Species: lions Prevalence: 44.44%.
Species: tigers Prevalence: 33.33%.
Species: bears Prevalence: 22.22%.**
这代表了考虑了伪计数的预期值,伪计数代表了我们对情况的初始信念。
我们可以通过增加伪计数的大小来调整我们对这个先验信念的置信度。这迫使期望值更接近我们最初的信念,即每个物种的流行程度是相等的。几个不同超参数的预期值如下所示:
Expected values for different pseudocounts.
我们对超参数的选择有很大的影响。如果我们对自己的信念更有信心,那么我们就增加超参数的权重。另一方面,如果我们希望数据有更大的权重,我们就减少伪计数。
虽然这个结果提供了一个点估计,但它具有误导性,因为它没有表达任何不确定性。我们只去过一次野生动物保护区,所以在这些估计中应该有很大的不确定性。通过贝叶斯推理,我们可以得到点估计和不确定性。
用 PyMC3 实现 Python 中的贝叶斯推理
为了得到一个估计范围,我们使用贝叶斯推理,构建一个情境模型,然后*从后验样本中取样以近似后验。*这是通过 PyMC3 中的马尔可夫链蒙特卡罗(或一种更有效的变体,称为不掉头采样器)实现的。与模型背后的理论相比,在代码中设置它很简单:
然后,我们可以从后面取样:
此代码在 2 个不同的链中从后部抽取 1000 个样本(丢弃 500 个用于调整的样本)。我们剩下一个trace
,它包含了运行过程中抽取的所有样本。我们用这个轨迹来估计后验分布。
PyMC3 有许多方法来检查轨迹,如pm.traceplot
:
PDF and trace of samples.
左边是采样参数的核密度估计——事件概率的 PDF。在右边,我们为模型中的每个自由参数绘制了完整的样本。我们可以从 KDE 看到,正如预期的那样,熊 pm.posterior_plot:
Posterior plots from PyMC3
下面是直方图,显示了从后验概率中采样每个概率的次数。我们有概率的点估计值——平均值——以及置信区间的贝叶斯等价值——95%的最高概率密度(也称为可信区间)。我们在这些估计中看到了极端程度的不确定性,这与有限的数据相符。
为了量化不确定性水平,我们可以得到结果的数据框架:
这显示了患病率的最佳估计值(平均值),而且 95%可信区间非常大。根据我们对保护区的一次考察,我们只能确定狮子的患病率在 16.3%到 73.6%之间。
贝叶斯推理之所以如此强大,就是因为这种内置的不确定性。在现实世界中,数据总是嘈杂的,我们通常比我们想要的少。因此,任何时候我们根据数据进行估计,我们都必须显示这种不确定性。对于这个问题,如果我们得到的野生动物保护区的熊的百分比不正确,没有人会受到伤害,但是如果我们用医学数据做一个类似的方法来推断疾病概率,会怎么样呢?
从后面取样
一旦我们有了踪迹,我们可以从后面取样来模拟去保护区的额外旅程。比如我们再考虑去 1000 次。每次旅行我们能看到多少个物种?
1000 samples drawn from the estimated posterior.
根据证据,有时候我们去保护区看到 5 只熊和 1 只老虎!当然,这不太可能,像这样的图表显示了可能结果的整个范围,而不是只有一个。我们去保护区的一次旅行只是一个结果:1000 次模拟表明,我们不能指望每次去保护区都得到准确的观察结果。
如果我们想在采样后看到新的狄利克雷分布,它看起来像:
Dirichlet distribution after sampling.
纳入附加信息
当我们去了 4 次保护区,并想在我们的模型中加入额外的观察结果,会发生什么?在 PyMC3 中,这很简单:
通过更多的观察,后验概率的不确定性将会减少,事实上,这就是我们在数量和视觉上所看到的。直觉上,这又是有意义的:随着我们收集更多的数据,我们对世界的状态变得更加确定。在无限数据的情况下,我们的估计将收敛于真实值,先验将不起作用。
Posteriors with more data
增加和减少对先前信念的信心
前面我们讨论了超参数如何被认为是代表我们先前信念的伪计数。如果我们将 alpha 的所有值都设置为 1,我们将得到目前为止看到的结果。如果我们降低或增加我们对患病率相等的最初理论的信心呢?要做到这一点,我们所要做的就是改变阿尔法矢量。然后,我们再次从后验样本(使用原始观察)并检查结果。
超参数对结果有很大的影响!较低的值意味着数据本身在后验概率中具有较大的权重,而较高的值导致伪计数具有较大的权重。随着该值的增加,分布相互收敛。在最后一种情况下,我们需要大量的数据来克服我们强大的超参数。
我们可以比较α= 0.1 和α= 15 时的后验曲线:
最终,我们对超参数的选择取决于我们对信念的信心。如果我们有充分的理由认为物种的流行是相等的,那么我们应该使超参数具有更大的权重。如果我们想让数据说话,那么我们可以降低超参数的影响。
结论
那么,对于流行率这个问题,我们的最终答案应该是什么呢?如果我们是好的贝叶斯主义者,那么我们可以提出一个点估计,但只能附带不确定性(95%可信区间):
- 狮子:44.5% (16.9% — 75.8%)
- 老虎:32.7% (6.7% — 60.5%)
- 空头:22.7% (1.7% — 50.0%)
我们估计下一个观察对象是一头熊?基于后验抽样,大约 23%。虽然这些结果可能不会让想要简单答案的人满意,但他们应该记住现实世界是不确定的。
贝叶斯推理的好处是我们可以整合我们先前的信念,并通过我们的答案得到不确定性估计。世界是不确定的,作为负责任的数据科学家,贝叶斯方法为我们提供了处理不确定性的框架。
此外,随着我们获得更多的数据,我们的答案变得更加准确。与贝叶斯推理的许多方面一样,这符合我们的直觉和我们自然地看待世界的方式,随着额外信息的增加,错误变得更少。最终,贝叶斯统计是令人愉快和有用的,因为它是最终有意义的统计。
一如既往,我欢迎反馈和建设性的批评。可以通过 Twitter @koehrsen_will 或者通过我的个人网站 willk.online 找到我。
“使用随机森林估计和推断异质处理效果”论文综述
本文原载于【blog.zakjost.com】
我最近读了很多技术论文,觉得用比学术论文不那么正式的语言来总结会很不错。我可能会也可能不会这样做不止一次。
一.动机
本文是关于尝试使用随机森林(RF)进行因果分析。RF 在构建分类或回归预测模型方面非常流行,但是对结果做出经典的统计声明并不容易。例如,你的置信区间是多少?你如何得到 p 值?
再者,本文想对的因果的影响做出主张,或者说是一种治疗的效果。例如,大学对收入有什么影响?由于许多原因,这很难做到,但最根本的是,你没有你确切需要的数据,即每个人都上过大学和没上过大学时发生了什么的数据。这当然是不可能的,因为在现实中,个人要么上过大学,要么没有,你不知道如果另一种情况发生会发生什么——即反事实。这种构建问题的方式被称为“潜在结果框架”,本质上是假设每个人都有多种潜在结果,这取决于他们是否接受了治疗。
本文中的一个关键假设,以及这种类型的一般因果估计技术,是未发现中的一个。这意味着一旦你控制了感兴趣的变量,一个人是否接受治疗是随机的。这使我们能够将附近的点视为微型随机实验。在药物试验的情况下,你可以随机分配治疗,所以这不是问题,但如果你在分析观察数据,治疗已经被分配了——一个人上过大学或没上过大学。
为了支持无根据性,你需要选择和衡量所有会影响治疗分配的变量。对于四年制学位对收入的因果影响,你可能想要选择的协变量之一是家庭收入,因为某人是否上大学可能与其家庭收入相关。年龄可能是另一个因素,因为 18 岁的人比 50 岁的人更有可能上大学。这个想法是,当你看着绘制在你的家庭收入/年龄图上的两个相邻点时,是否上大学的决定应该是随机的。这是很有价值的,因为你可以把没有上过大学的人的收入减去上过大学的人的收入,你就可以估计出大学在家庭收入/年龄空间中的影响。
但是这很难,因为你可能会忘记一个重要的变量,或者你没有这个变量的数据。因此,这个假设肯定不完全正确,但它可能是正确的,足以给出有用的答案。
但是假设你有正确的协变量,作者使用随机森林将数据分成自相似的组。随机森林是一种自适应最近邻方法,它决定空间的哪些部分对您来说是相似的,而大多数最近邻技术倾向于平等对待所有距离。然后,他们添加了约束条件,即生成的叶子至少有处理和未处理两类,然后可以通过减去平均值来计算每个叶子的因果影响,就好像这是一个随机实验一样。一旦完成单棵树的评估,就可以对每棵树的评估进行平均。他们称这种实现为因果森林。
二。这里有什么新鲜事
如上所述,要在传统统计学中做出稳健的统计声明,您需要像 p 值和置信区间这样的东西。这就需要知道统计量的渐近抽样分布*。在这种情况下,这意味着我们需要知道,如果我们在无限数量的树木/数据上对随机森林估计量的平均处理效果进行采样,分布会是什么样子。如果我们有这样的数据,那么我们可以这样说:“平均处理是 0.3,这种来自随机机会的可能性小于 0.1%”*
这里的内在假设是,我们可以推导渐近/无限数据情况的属性,并将其应用于有限样本的真实情况,但这通常是传统统计中的情况。
先前的工作已经完成,使渐近分析的随机森林,但本文建立的限制,需要适用于他们的因果森林。其中一个约束需要“诚实的树”,他们提出了两种增长算法。
三。方法
完整的证明是非常复杂的,我不会试图在这里重新创建它,但我会简要概述一些约束和它们使什么。
首先,从传统随机森林的先前工作中重新创建了一个渐近理论,表明它是一个均值为零的渐近高斯估计量,这意味着它是无偏的。他们还提到了一种叫做无限小刀切的技术,用于估计方差,其中包括有限样本校正。
作者能够通过包含“诚实树”的概念来利用先前的工作。基本的想法是,你不能使用结果变量来分割和估计平均影响——你必须选择一个或另一个。他们提出了两种方法来做到这一点。第一种是双样本树,将数据一分为二:一半用于估计影响,另一半用于进行拆分。分割标准是最小化结果变量的 MSE。在双样本情况下,看起来您可能丢弃了一半的数据,但这种情况是针对单棵树的,随机森林正在对每棵树的新训练集进行采样,因此您最终将使用所有数据进行分割和估计。
另一种方法是通过生长“倾向树”,这是一种分类树,旨在预测治疗类别而不是结果,然后结果变量仅用于估计每片叶子内的影响。他们强加了一个停止标准,使你停止分裂,以保持任何叶中每个处理类的最小值。这是必要的,这样你就可以比较结果来估计效果。
通过使用诚实树并依赖于未发现的假设和树叶内的处理类别重叠,他们能够稍微修改传统的处理,以给出相同的无偏高斯渐近结果。
四。实验结果
他们的基线使用的是 k-NN 算法。他们用已知条件创建一些模拟实验,模拟常见问题,然后应用因果森林和 k-NN 方法。
第一个实验将所有 x 的真实治疗效果保持为零,但在结果和治疗分配之间建立了关联,从而测试算法校正协变量以消除偏差的能力。这就像让算法自动计算出年龄和家庭是重要的,以及如何将它们分开。他们在不同的训练数据维度上多次运行该实验。他们报告了 MSE 和覆盖率,即真实值在估计值的 95%置信区间内的频率。因果森林比 10-NN 有一个数量级的改进,比 100-NN 有 5 倍的改进。CF 维持~0.95 的覆盖率到 10 维之后开始降级。10-NN 在 0.9 范围内保持了合理的覆盖率,100-NN 表现很差。值得注意的是,k-NN 的置信区间比 CF 宽得多,因此改进的覆盖率更令人印象深刻。
第二个实验有恒定的主效应和倾向,但真正的治疗效果只取决于两个协变量。然后,他们对不相关协变量的数量进行了缩放,以了解该算法在不相关协变量存在的情况下发现这种异质性治疗效果的能力。令人惊讶的是,CF 在高维比低维表现更好。他们通过注意到森林的方差取决于树木之间的相关性来解释这一点,并提出树木之间的相关性以及总体方差在更高维度时会降低。结果与实验 1 相似,MSE 好得多,或者至少与随维度扩展的更一致的覆盖相当。
注意到置信区间的覆盖范围在特征空间的边缘开始退化,特别是对于高维。这被解释为是一种由偏差支配的情况,在无限数据的渐近极限中会消失。值得注意的是,在边界的偏差是典型的树木,特别是最近邻非参数估计一般。
动词 (verb 的缩写)讨论
虽然因果分析不是我的专长,但对于假设无发现的最近邻法来说,这似乎是一个很好的进步。在维持名义覆盖率的同时,MSE 的显著改善令人印象深刻。
然而,我发现这篇论文的几个方面令人困惑。特别是那些与树的分裂标准相关的。在倾向树的情况下,他们正在训练一个分类器来分离治疗类别,但他们反过来要求每个叶子中类别的异质性约束,这与分裂标准直接相反。
类似地,在双样本框架中,它们被分割以最小化结果 MSE,该 MSE 将具有相似结果值的点分组。但关键是,在通过治疗分类分离要点后,结果是不同的,这种差异就是平均治疗效果。再一次,分裂标准似乎与最终目标相反。为此,他们参考了一篇论文(Athey 和 Imbens [2016]),其中可能包含澄清。
最后,有一句话我不明白,但听起来很困扰。
备注 4。(多点测试)我们注意到,通常不可能同时为所有 x 构建定义 4b 意义上的正则因果树。在实践中,如果我们想要建立一个因果树,可以用来预测许多测试点,我们可能需要分配不同的树对不同的测试点有效。然后,当在特定 x 进行预测时,我们将在该 x 被指定为有效的一组球座视为相关的森林,并对其应用定理 11。(第 19 页)
我不确定这是运营开销,还是更基本的东西。
你怎么想呢?
评估者再探:深度神经网络
在这一集的云人工智能冒险中,学习如何通过将线性模型转换为深度神经网络来训练日益复杂的数据集!
随着线性模型中要素列数量的增长,在训练中实现高精度会变得越来越困难,因为不同列之间的交互会变得更加复杂。这是一个已知的问题,对于数据科学家来说,一个特别有效的解决方案是使用深度神经网络。
为什么要深入?
深度神经网络能够适应更复杂的数据集,并更好地推广到以前看不到的数据,主要是因为它的多层结构,因此它们被称为深度。与线性模型相比,这些图层允许它们适应更复杂的数据集。然而,代价是该模型往往需要更长的训练时间、更大的规模和更少的可解释性。那么为什么会有人想用它呢?因为它可以导致更高的最终精度。
Where will your deep learning journey take you?
深度学习的一个棘手问题是让所有参数“恰到好处”。根据您的数据集,这些配置看起来几乎是无限的。然而,TensorFlow 内置的深度分类器和回归器类提供了一组合理的默认值,您可以立即开始使用,从而快速轻松地开始使用。
从线性到深度
让我们看一个如何将 iris 示例从线性模型更新为深度神经网络(通常缩写为 DNN)的示例。
我不打算展示一个 DNN 可以利用的 2000 列模型…所以我只使用我们在本系列中一直使用的 4 列。(要么全有,要么全无,对吧?)两种方式的机制都是一样的。
主要的变化来自于用 DNNClassifier 替换我们的 LinearClassifier 类。这将为我们创建一个深度神经网络。
Replace LinearClassifier with DNNClassifier
其他变化
事实上,其他一切都保持不变!深度神经网络需要一个额外的参数,这是我们之前没有包括的。
由于深度神经网络有多层,并且每层有潜在的不同数量的节点,我们将添加一个hidden_units
参数。
Add your hidden units argument to wrap things up
hidden_units
参数允许您为每个层提供一个包含节点数量的数组。这使你可以简单地通过考虑它的大小和形状来创建一个神经网络,而不是手工从头开始连接整个网络。添加或删除层就像在数组中添加或删除一个元素一样简单!
Changing your network configuration is a one-line change!
更多选项
当然,对于任何预先构建的系统,您在便利性方面获得的好处往往会在可定制性方面失去。DNNClassifier 试图通过包含一些您可以选择使用的附加参数来解决这个问题。如果不考虑,会使用一些合理的默认值。例如,优化器、激活函数和掉线率都可以和许多其他参数一起定制。
Yes, there’s an activation function called ‘ELU’
仅此而已
为了将我们的模型从线性转换到深度,你还需要做什么?没什么!这就是使用评估者框架的美妙之处:一种组织数据、训练、评估和模型导出的通用方法,同时仍然给你试验不同模型和参数的灵活性。
深入,简单的方法
有时,深度神经网络可以胜过线性模型。在这些情况下,TensorFlow 通过利用估算器框架来替换一个函数调用,可以很容易地从线性模型切换到深度模型,并且只需很少的代码更改。这意味着有更多的时间来处理数据、模型和参数,而不是建立训练循环。对于简单的深度神经网络,使用张量流估值器!
感谢阅读深度模型!如果你想了解更多,请务必订阅频道来了解云人工智能冒险的其余内容。
以太坊的 ERC-20 代币解释简单
区块链系列的未来
加密货币领域有很多缩写。这让新来者望而生畏。事实上,这个领域的首字母缩写有时甚至是字母和数字的组合,混淆了这种程度的恐吓。但是没有什么花哨的。长话短说,ERC-20 代币只是一种建立在以太坊平台上的加密货币。别担心,我会解释这是什么意思。
Review this image again after you read this article, and it’ll make much more sense to you if it doesn’t already.
许多人知道以太坊,因为它是一种可以在比特币基地交易的加密货币。比特币与众不同的一个独特之处(至少到目前为止)是它拥有编写智能合约的能力。智能合约只是营销用语,指你可以在区块链上运行的代码。本质上,你可以将代码写入以太坊区块链。因此,除了存储货币的历史交易,您还可以存储逻辑。逻辑的结合创造了我们熟悉和喜爱的程序和应用。
Cryptokitties has arguably been the most popular Dapp on Ethereum. You just breed and trade them.
但是,忠于行话,我们不能仅仅称它们为应用程序。毕竟,它们不像普通的应用程序——这些被写入以太坊区块链的应用程序本质上是去中心化的,因为以太坊本身就是去中心化的。因此,我们称它们为分散应用,简称 d apps(有些人说 d-apps ,其他人只是发音为 dapps )。
对于这些 dapp 中的大多数,创作者希望制作他们自己的硬币(统称为令牌),这意味着用户在与 dapp 互动时必须使用他们特定的硬币——这是好事还是坏事有待讨论,但我在这篇介绍性文章中不会回答这个问题。
ERC-20 是描述以太币的标准
人们很快意识到创造自己的硬币需要一定的标准。就像制作信用卡一样。每张卡的背面都有一个黑色的长条用来刷卡,大多数现代卡的正面都有一个芯片。到期日期、安全代码和所有者姓名都出现在卡上的标准位置,智能手机摄像头可以通过扫描快速识别它们。
但是想象一下,如果有人决定制作一张除了二维码之外没有任何信息的信用卡。当然,这听起来时尚简约,但没有商店会接受它,因为它不符合标准的信用卡设计规则,只是看起来很可疑。
ERC-20 正是应用于以太坊区块链智能合约代币创建的标准。这里有一个令牌必须遵守的规则列表,但是我不会在这个解释中涉及细节。如果你想更深入地了解 ERC-20 令牌标准的细节,请看一下维基百科的文章。
存储和交易 ERC-20 代币
因为 ERC-20 代币是在区块链以太坊上建造的,所以它们也可以在以太坊上兑换。你可以用你的以太坊钱包来存放它们,也可以发送到其他以太坊钱包。不过,有一点你应该小心,那就是永远不要使用交换地址。
不要纠缠于为什么不这样做的复杂细节,只要明白交换会为每枚硬币生成唯一的地址。换句话说,你的以太坊地址和你的 ERC 20 令牌地址是不同的。如果你试图发送一个 ERC-20 代币到你的交易所的以太坊地址,交易所不会识别它,你也不会得到 ERC-20 代币。不过,在你自己的钱包里,你可以存放任何你想要的以太币。你可能已经注意到我用了钱包和地址这两个词。如果你认为它们是一样的,那你就错了。在我的文章加密钱包与地址中了解更多信息。
为什么要在以太坊上建立 Dapps?
嗯,这是个好问题。简单的回答是,你不必。自从以太坊在 2015 年推出智能合约以来,许多其他区块链都出现了自己的智能合约功能。例如,NEO 是一个区块链,它使用 Java 等传统编程语言编写合同脚本,而以太坊有自己的语言 Solidity。但是如果我刚才说的对你没有意义,不要担心——只要知道除了以太坊,还有其他区块链可以托管智能合约。
不过,以太坊拥有先发优势,在所有支持智能合约的区块链公司中,它的市值仍然是最大的。简而言之,这意味着以太坊比其他竞争者得到了更多的支持。如果你试图建立一个 Dapp 和围绕它的公司,你可能会选择最安全的选择——一个可能在几年内仍然存在的选择。
当然,这并不是说竞争对手将不复存在。我当然相信并投资了其中的许多,尤其是因为以太坊确实有其自身的缺点。但是随着数千个 Dapps 的建立和对以太坊的大量投资,它在采用方面仍然远远领先于竞争对手。
每当有人说“以太坊令牌”或“ERC-20 令牌”或其他类似的东西,我希望你现在不会立即被吓倒,并在你的大脑中旋转加载屏幕,试图破译你刚刚听到的东西。这只是一种建立在以太坊区块链上的加密货币。
道德准则与道德准则
这就是为什么道德标准不起作用,而我们可以做的。
The current state (and usefulness) of ethical codes for AI.
在数据行业有很多关于道德的讨论,特别是当它涉及到算法的道德使用时。前美国首席数据科学家呼吁为数据科学家制定道德准则。美国统计协会和计算机械协会。谷歌提出了管理其人工智能努力的伦理原则,许多其他人也参与进来,从彭博到世界经济论坛的青年科学家小组,再到民主数据。
人们制定道德准则至少部分是因为他们对道德实践的状态不满意。但是道德规范并没有明显导致道德实践的增加。事实上,就像试图为任何事情创建标准一样,创建代码的唯一明确结果是额外代码的激增:
This applies to ethical codes as well. (Source: https://xkcd.com/927/)
简而言之,道德规范和实际的道德规范是有区别的。我想谈一谈前者,但主要是关于我们能做些什么来获得更多的后者。
我为什么关心道德
特别是在工业界,我认为看着这样一个话题,说“这种事情只是一个学术练习”或“这不是我的问题,因为我个人的行为是合乎道德的”这样的话是非常合理的因此,我想花点时间解释一下,作为一名在工业界工作的数据科学家,我个人为什么觉得我需要关注这个话题:
- 巴基斯坦。我曾经训练统计模型,为美国陆军提供战略情报。我模拟了巴基斯坦的军事和军事行动周期,我的结果与一个著名的政府政策声明相矛盾。我老板的老板把我叫进了他的办公室,痛骂了我半个小时后,叫我更改分析结论。这是我第一次被告知我需要伪造我的结果(也是第一次有人否认,老实说,我相信这是他们告诉我要做的)。
- **销售报告。**我在一家学生旅游公司工作,我老板的老板想要一张显示十年收入的图表,但他只有其中四年的数据;他想让我插入缺失的数据。他画了一张图,画出了他希望趋势显示的东西,那张图给出了过去几年非常不切实际的数据,并极大地改变了过去几年的数据。这是我第一次被告知伪造数据。
- **妖冶。**我在一家专注于投资当地消费品生产商的资产管理初创公司工作。我的老板真的想展示各国都符合 s 曲线——商业顾问对逻辑曲线的表述——有些国家消费水平非常低,有些国家正处于快速上升阶段,有些国家已经在高消费水平下趋于平稳。数据没有显示他想要显示的内容。他催促我尝试越来越复杂的模型,希望它们能显示出想要的模式。这是我第一次被告知要折磨数据,直到它承认为止。
- 教师工会、纽约时报和全美有色人种协进会。我得到了为一个特许学校网络创建数据科学团队的工作,这个团队如此突出,在政治上如此活跃,以至于在开始工作之前,我未来的雇主就被指控利用学生考试成绩拒绝、恐吓或清除不受欢迎的教师和学生。我做了尽职调查,认为这些攻击更多的是政治性的,而不是事实性的,我在那份工作中的经历证实了我最初的印象,但我知道,无论我建立了什么数据系统,都很容易被用来惩罚学生,而不是支持他们,即使我不是为此目的建立的。这是我第一次不得不不断地想象,在从设计到开发到部署的每一个阶段,有人如何利用我开发的东西来伤害其他人。
我认为数据科学有价值。我认为它值得吸引一些最优秀、最聪明的人进入劳动力市场。如果我们不坚持不懈地努力确保广泛的道德实践,并呼吁和纠正不道德的做法,越来越多的那些最优秀和最聪明的人将离开去做其他事情。理应如此。如果我们不建立一个道德的行业,那么我们就应该失去这些人,并看到我们的业务受到影响。我们个人保持道德是不够的:只有少数公司的行为不道德,所有公司都会因此受到影响。良好的道德规范在短期内往往是好生意。从长远来看,这总是一笔好生意。
道德规范既不必要也不充分
当试图让某人发展改变其行为的能力或意图,以避免道德陷阱时,在目前的讨论中,谈话是一种非常无效的交流方式。
Take a long time looking at this comic. Think about it until you understand it. It’s worth the effort. (Source: https://xkcd.com/1028/)
告诉人们危险很少能帮助他们避免危险。至少,它没有帮助他们这样做的任何一致性。道德准则从不出现。他们只会说。实际上,它们是目标陈述。这就是为什么他们不提高实践。它们本身引起了人们对问题存在这一事实的注意,但它们并不能阻止人们陷入危险,或者帮助他们脱离危险。道德规范不足以改善道德实践。
这当然不是新的信息——我还没有遇到任何人认为道德规范就足够了,尽管在参与撰写道德规范的社区时,我经常遇到像他们那样行事的人。问题是,如果我们可以展示危险而不是讲述危险,我们就可以避免或减轻危险而根本不用讲述。道德规范不仅不足以改善道德实践,也没有必要。
栅栏及其危险
不仅仅是道德规范对于道德实践来说既不必要也不充分。它们也有潜在的危害。道德准则是一个界限——一个人们不应该越过的界限。如果没有办法强制遵守准则,那么它就像沙子里的一条线——它在那里,但越过它不会带来任何后果,所以它还不如不在那里。
如果有一种方法来执行该准则,换句话说,如果有一个监管基础设施,那么它就像一个围栏。政策制定者喜欢围栏,因为它们是可扩展的。您所要做的就是以一种可以审计遵守情况的方式定义规则,然后培训和部署审计员。栅栏的问题在于它们引入了系统性风险:人们可以沿着栅栏的边缘建立各种各样的业务,甚至靠在栅栏上,而不用跨过它。当栅栏破裂时,其后果比栅栏一开始就不存在时更具破坏性。我以前写过这方面的文章。
有很多通过大规模围栏建设引入系统性风险的例子。2008 年金融危机前监管抵押贷款的规则就是一个例子,但也许更适合这一讨论的是区分 p 值低于 0.05 和高于 0.05 的围栏。这种限制已经在大学课堂、科学出版物以及(在较小程度上)行业标准中实施,并且这些法规已经与一整套实践一起发展,以选择模型特征或样本数据或两者,从而使结果符合这种限制。近年来,几个领域,最突出的是 T2 心理学和 T4 医学,都遭受了损失,因为太多的人认为结果是可信的,仅仅因为它们符合这个标准。
建围墙是有风险的,围墙越大,风险越大。除非别无选择,否则我们不应诉诸广泛的监管,即便如此,我们也应谨慎行事。
一组试验性的选择
现在让我用剩下的时间来谈谈道德准则和道德监管的替代方案。在这里我没有任何明确的答案可以提供。我认为有足够的理由相信,我们可以通过展示而不是讲述来建立一个更道德的行业,但我的想法仍然是初步的。如果作为一种职业,我们花同样多的时间和资源来开发这些想法,就像我们花同样多的时间和资源来开发道德准则一样,我们可能很快就有了可以实施的东西。我将从任何个体从业者都可以做的事情开始。那我就说一些团队或者公司可以做的事情。然后我会谈谈整个行业必须要发生的一些事情。
**用于设计的工具。**当我们训练一个预测模型时,有一些方法可以评估它的准确性,包括交叉验证等流程,这些流程有助于降低我们的方法提供过于乐观的结果的风险。有一些工具可以支持所有这些评估,它们跨许多不同的软件包和编程语言进行维护。新从业者接受这些工具的培训,并在他们不能使用这些工具时受到警告。我们做所有这些是因为我们训练模型和建立数据系统来完成某些目的,所以我们有一个有趣的评估我们的系统在多大程度上完成这些目的。
我们需要一个可比较的工具集来评估我们的系统会在多大程度上产生意想不到的后果。仅仅知道我们的工具做我们想让它们做的事情是不够的。我们需要确保他们没有做我们不希望他们做的事情。同样,这种道德要求也只是简单的商业意识:意想不到的后果会导致无法计划的成本。
有一些工具可以识别出意想不到的后果,但是它们远不如测量预期后果的工具数量多、用户友好或维护良好。例如,芝加哥大学数据科学和公共政策中心开发了一个名为 Aequitas 的工具,用户可以在其中指定算法的预期用途——例如,算法是否将用于惩罚或帮助人们——并将分析算法的结果,以查看一些子群体是否受到不成比例的影响。有一些工具可以自动搜索辛普森悖论的实例(这里有一个例子),当局限于某些子群时,整个数据集中显示的趋势会反转。
我们需要更多这样的工具。我们需要在工作流程中加入对意外后果的探索。这是每个数据从业者都能做到的。
**本地(不可扩展)法规。**大篱笆有风险。小栅栏没那么多。我说的不是自我调节。我说的是地方法规。地方法规可以依赖于展示道德问题,而不是告知,地方错误往往也停留在地方。
《华盛顿邮报》上有一篇很棒的文章,讲述了地方法规如何减少餐馆里的骚扰。员工们使用颜色编码系统将不舒服的客户行为分为黄色(令人毛骨悚然的氛围)、橙色(性暗示)或红色(明显的行为或重复的橙色事件)。一名员工所要做的就是报告颜色——“我在五号桌有一个橘子”——经理就采取了行动,没有问任何问题。红色意味着顾客被要求离开。橙色意味着经理接管了桌子。黄色表示如果员工愿意,经理可以接管桌子。
不难想象这在算法开发中是如何工作的。黄色表示员工感到不舒服,如果需要,它会提示转移到另一个项目,以及对该问题的团队审查。橙色表示员工可以指出具体的道德问题,它会提示转移到另一个项目以及团队评审。红色表示该员工有强烈的顾虑,它会将项目搁置,等待审核。不要怀疑员工的顾虑。只是行动。有可能。
**声誉系统。**已经有很多系统的例子了(Yelp,BBB,Glassdoor 等。)公开披露与公司私人互动的信息,这些系统改变了公司的行为。无论怎么想象,这些网站都没有给用户一个全面、客观的公司业绩/合意性/质量/良好性的观点。但是公司害怕差评。当一个不好的评论出现时,他们会花时间去解决它——证明事实上这个评论是错误的。没有真正解决问题的公司会得到更多的负面评价,因此吸引的顾客更少。这使得公司内部的做法影响了底线。当一家公司无法对 Glassdoor 上描述的问题给出令人满意的解释时,我个人已经退出了对某些工作的考虑。至少在一个案例中,引发危险信号的信息是关于道德问题的。声誉系统是改变行业行为的可行工具。
大多数这类系统的问题是它们试图适应所有的用例,所以差评可能是因为顾客受到性骚扰或者顾客没有意识到自己下错了订单。亚马逊上的书评,即使我们不考虑故意抬高或压低一本书声誉的暴民企图,也可以反映从论点结构到散文可读性到论文质量的任何东西。对于一个影响道德实践的声誉系统来说,范围需要更窄。
我们有工作要做
我理解这种渴望,当面对一个明确的道德问题时,就像那些经常成为新闻的问题,想要做些什么。我明白,试图制定清晰和令人信服的伦理原则是一件非常可行的事情。这是错误的。这解决不了我们的道德问题。在我看来,甚至没有任何帮助。事实上,它很可能会伤害。礼教实际上可以给不道德的演员提供掩护。我们不想那样。
我列出了以上三种解决不道德行为的方法,不是因为我认为它们能解决我们所有的问题(当然它们不会),而是因为它们给了每个人一些既现实又有效的事情去做。任何会编码和做分析的人都可以做设计工具。任何经理或高管都可以实施和执行关于道德审查和不报复提出问题的人的政策。如果你不在处理这些道德问题的地方工作,创建一个网站,让处理这些问题的人公开发布他们遇到的问题以及他们所在的公司。单独来看,这些事情都不会有太大的好处。综合起来,它们以及类似的想法可以让我们朝着正确的方向前进。
机器学习中的伦理
当我们读到这些领域的重大进展时,机器学习(ML)或人工智能(AI)系统如何运作的伦理是一个常见的想法。这种感觉会接管人类吗?还是会帮助我们到达一个乌托邦时代?绝对不是二元问题。但是,一个很少被问到的问题(也许是正确的)是“这是用正确的美德建造和建立的吗?”。这个问题并不像看起来那样关注建立一个 ML 系统背后的动机。
背景
如果你没有经验或者不知道什么是 ML 系统,就把它想象成一个黑盒。一个黑盒,当提出一个问题时,它输出一个正确概率很高的答案。为了得到这个高概率,我们需要首先设置黑盒。
在实践中,我们试图创建一组许多黑盒,并选择一个具有最高准确性的黑盒。为了建立这些模型,我们需要大量的数据和算法。把数据想象成一长串有正确答案的问题。算法从这些数据中学习。一组中的每个黑盒都有相同算法的稍微不同的版本。最后,我们选择最准确的版本(技术上称为调整超参数)。
问题
在 ML 中,作弊主要有三种可能的途径。它们是:
- 数据
- 算法
- 结果
1。数据
这可能是三个问题中最大的一个。一个好的 ML 系统需要大量的数据。但是我们从哪里获得这些数据呢?如果我们正在寻找的数据不存在,我们如何挖掘它?有时,所寻找的数据已经存在。它可能是开源和免费的。它可能会公开出售,但需要付费。或者数据可能被一群人私有。一切都很好,如果它是免费和开源的。即使可以买到,它也可能是好的。但是,如果你窃取了别人的私人数据,这是可以的吗?你可能倾向于“不”。但是,如果这些数据,目前只有少数人可以访问,可以帮助世界各地的数百万人与你的全新 ML 模型。那会不会被认为是对?突然间,这个问题似乎不再非黑即白了。
当我们谈论匿名跟踪人们,不经他们同意,收集数据时,答案变得更加模糊。这些数据也许可以用来探测不寻常的活动。我们已经知道我们的网络搜索正在被跟踪。如果你的 ML 系统可以通过跟踪普通人来帮助防止下一次恐怖袭击,那么跟踪他们是正确的吗?或者至少行动变得合理了吗?
2.该算法
许多重要而有用的算法都是开源的,这是一件好事。这意味着每个人都可以访问它,有些人甚至允许我们修改它并从中获利。这太棒了!现在,再一次,用数据想象同样的场景。如果一群人拥有一个专利算法,法律规定使用相同的算法是非法的。但是如果这个算法在合适的人手里可以帮助数百万人呢?自己的是非感可以用来逆向工程算法造福他人吗?这涉及窃取知识产权,但也是反洗钱的一个问题。
开发新算法的问题与数据集密切相关。如果你没有一个完整的数据集(也就是说,你有一个没有准确整合所有可能情况的数据集),那么你得到的 ML 系统可能会有偏差,并且它可能会开始辨别。例如,帮助银行决定是否投资某项特定业务的人工智能可以拒绝向所有信用记录不佳的人提供贷款,即使他们的业务潜力巨大(人类会注意到这一点并将其作为例外)。这是一个自动化人工任务的糟糕例子,而这些任务可能会在不被注意的情况下发生。
3.结果呢
前两个问题关系到大局。这个更孤立于 ML。在 ML 中,为了报告模型的准确性,我们将模型产生的结果与实际答案进行比较。它们越接近,精确度越高。有不同的方法来报告这个分数。
在这里,人们最常见的作弊方式是在数据集上训练他们的模型,并报告他们在同一数据集上得到的错误。这是初学者常犯的错误,因为他们不明白这是错的。这也是一个错误,有时是为了能够报告更高的准确性而故意犯的。
为什么这是错的?想象一下,你正在准备一场考试,有人给了你一份准备考试的问题和答案清单。如果你在考试中得到同样的问题,你的考试分数能很好地衡量你学到了多少吗?或者它是衡量你能记住多少的标准?电脑也是如此。如果您在您训练的同一数据集上测试该模型,您的模型将会产生很高的准确性,因为您的模型现在已经记住了数据集,并且知道所有的正确答案。但是如果我问它一个新的问题,很有可能答案是错的。这个问题被称为过拟合数据集。幸运的是,解决这个问题非常简单,但是超出了本文的范围。
另一种作弊方式是创建一个模型表现非常好的合成数据集,并使用它来报告准确性。
如果你想知道人们是否会这样做,看看一些 Kaggle 比赛的排行榜。在公共数据集(训练数据集)中,有许多具有高准确度的人。但是,当查看私有数据集(一个不可见的测试数据集)中的排行榜时,只有少数在早期排行榜中得分高的人得到了类似的结果。其他人的模型严重过度拟合了数据。这样的模式,如果付诸实施,只会对社会不利。
这似乎不是一个大的道德问题。唉!它仍然关注和质疑一个 ML 工程师的诚信。
一个版主?
我上面提出的很多问题都是主观的。对一个人来说可能是正确的,对另一个人来说可能是错误的。但是这些问题让我们思考我们愿意做什么来带来好的改变。我认为,我们需要的是一套规章制度,如果你愿意,一个行为准则,一个工程师在设计一个 ML 系统时应该遵守。违反本准则将导致禁止使用洗钱系统。
为什么所有这些都很重要?这很重要,因为有对错之分,我们必须确保始终选择正确的道路前进。
网络搜集中的伦理
我们都收集网络数据。我们这些处理数据的人会。数据科学家、营销人员、数据记者和数据好奇者都是如此。最近,我一直在思考这种做法的伦理问题,并对在这个问题上缺乏共识感到不满。
让我澄清一下,我说的是道德规范而不是法律。关于抓取网络数据的法律很复杂、模糊,改革的时机已经成熟,但那是另一回事。这并不是说没有人在思考或写作刮擦的道德问题,而是刮擦者和被刮擦者都无法就基本原则达成一致。
我两边都去过。我主要为个人项目收集数据,但我也把它作为工作中收集数据的一种形式。另一方面,我一直在纠结如何从我自己或我雇主的网络日志和分析中过滤掉“机器人”,以便专注于真正的客户。这是多年来生活的现实,与其与之抗争,不如让我们制定一些基本规则。
虽然我并不幻想这些规则是完整和绝对的,但它们涵盖了我多年来遇到的争论的关键点。
道德刮刀
我,web scraper 将遵循以下原则:
- 如果你有一个公共 API 提供我正在寻找的数据,我会使用它,避免拼凑。
- 我将始终提供一个用户代理字符串,使我的意图清晰明了,并为您提供一种有问题或疑虑时与我联系的方式。
- 我会以合理的速度请求数据。我将努力不被 DDoS 攻击所迷惑。
- 我只会保存我绝对需要的数据。如果我只需要 OpenGraph 元数据,那就是我要保留的全部。
- 我会尊重我保存的任何内容。我永远不会把它当成我自己的。
- 我会想办法把价值还给你。也许我可以给你的网站带来一些(真正的)流量,或者在一篇文章或帖子中表扬你。
- 我将及时回应您的请求,并与您合作解决问题。
- 我将为从数据中创造新价值的目的而努力,而不是复制它。
道德网站所有者
我,网站所有者将遵循以下原则:
- 我将允许道德刮刀访问我的网站,只要它们不会对我的网站的性能造成负担。
- 我将尊重透明的用户代理字符串,而不是阻止它们,并鼓励使用伪装成人类访问者的刮刀。
- 在永久屏蔽之前,我将联系刮刀的所有者(感谢他们的道德用户代理字符串)。出于现场性能或道德考虑,临时封锁是可以接受的。
- 我知道 scrapers 是开放网络的现实。
- 我会考虑使用公共 API 来提供数据,作为对抓取器的替代。
这给我们留下了什么?
The ease of scraping in Python
事实是,搜集数据很容易。有了几行 Python 代码和一些很棒的库的帮助,比如 urllib2 (或者 Requests ,如果你喜欢的话)和 BeautifulSoup ,你可以抓取并解析一个页面的 HTML。事实上,这很容易,负责任的使用比以往任何时候都重要。
当然,为一个周末项目搜集几千篇博文不是问题。见鬼,在我看来,即使是用于商业用途的刮痧也是符合道德的。对于我们这些依靠海量网络数据来创新、学习和创造新价值的人来说,最受关注的是针对可疑商业用途的大量网络抓取,这也带来了最高的风险。
只要有一点点尊重,我们就能让好事继续下去。
感谢阅读!你可以在我的网站上联系我或者阅读我的其他博客文章。
欧洲人工智能初创公司格局
欧盟人工智能初创企业资助研究
在看了欧洲的太空科技景观之后,我进一步探索前沿科技,深入挖掘欧洲的人工智能景观。我分析了 797 家总部位于欧洲的初创公司,它们来自我们在 Maxfield Capital 和 Pitch Book & Tracxn 数据库的网络。
这项研究的主要目标是概述:
- 人工智能创业公司中资金最充足的部门;
- 从受资助创业公司的来源来看,投资最活跃的国家
关于方法论的几句话:
- 初创公司根据以下几个方面进行细分:(1)垂直行业(如医疗保健或零售);㈡业务职能(如人力资源或营销);㈢产品类型
- 详述“产品类型”类别,我已经分离了“垂直和功能不可知”的部分,例如“人工智能工具”和“开发人员工具”,分别为开发人员提供核心人工智能应用程序(例如语音识别或计算机视觉)作为服务(针对 B2B)和 API 及其他产品
观察结果
- 欧洲人工智能初创公司中资金最充足的部门是:
(i)营销/广告;㈡安全;㈢人工智能工具;㈣医疗保健;㈤零售; - 虽然营销/广告和人工智能工具部门的资金由大量公司(分别为 40 家和 41 家)驱动,但安全和医疗保健主要由“大型轮次”驱动,如安全领域的 Darktrace (总资金 1.045 亿美元)和 Onfido (总资金 3030 万美元)以及医疗保健领域的慈善人工智能(总资金 1 亿美元);
- 就人工智能初创公司融资而言,英国是欧洲最发达的国家,融资额为 7.5511 亿美元,其次是德国(1.2558 亿美元)、法国(1.1342 亿美元)和北欧(1.0042 亿美元)。爱尔兰、比利时和西班牙紧随其后,分别融资 4629 万美元、3709 万美元和 3082 万美元
总而言之,这是包含所有数据的电子表格(链接),如果我错过了什么或者你想在 AI 上聊天,请发微博给我 @GalyaDegtyareva !此外,如果你想要更详细的概述,可以看看这些由法比安、大卫·凯尔纳和克里斯·奥布莱恩创作的德国、英国和法国人工智能风景。
推荐系统的评价指标
推荐系统在在线零售中越来越受欢迎,因为它们能够为独特的用户提供个性化的体验。K 处的平均精度(MAP@K)通常是用于评估推荐系统性能的选择度量。然而,使用额外的诊断指标和可视化可以对模型的性能提供更深入的、有时令人惊讶的见解。本文探讨了 K(MAR @ K)个性化列表内相似度的平均召回率,并使用这些指标来比较三个简单的推荐系统。
如果您想使用本文中讨论的任何指标或图表,我已经在 python 库 recmetrics 中提供了它们。
*$ pip install recmetrics*
Movielens 数据集
本例中使用的数据是流行的 Movielens 20m 数据集。该数据包含用户对电影的评级,以及电影类型标签。(为了增加训练时间,对该数据进行了缩减采样,以仅包括来自对超过 1000 部电影进行评级的用户的评级,并且移除了少于 3 颗星的评级。)
Example of user movie ratings
模型
测试和比较了三种不同的推荐系统。
- 随机推荐器(向每个用户随机推荐 10 部电影)
- 受欢迎程度推荐器(向每个用户推荐 10 部最受欢迎的电影)
- 协同过滤(使用奇异值分解矩阵分解方法)
让我们深入研究指标和诊断图,并比较这些模型!
长尾图
我喜欢通过查看长尾理论来开始每一个推荐项目。该图用于探索用户项目交互数据(如点击、评级或购买)中的流行模式。通常,只有一小部分项目具有高的交互量,这被称为“头部”。大多数项目都在“长尾”中,但它们只占交互的一小部分。
Long tail plot. (Sample of Movielens 20m ratings data)
因为在训练数据中有许多流行项目的观察值,所以推荐系统学习准确预测这些项目并不困难。在电影数据集中,最受欢迎的电影是大片和经典。这些电影已经为大多数用户所熟知,对它们的推荐可能不会提供个性化的体验或帮助用户发现新的、相关的电影。相关推荐被定义为用户在测试数据中正面评价的项目的推荐。这里确定的指标提供了评估建议的相关性和有用性的方法。
地图@K 和标记@K
推荐系统通常为测试集中的每个用户产生一个有序的推荐列表。MAP@K 提供了对推荐项目列表的相关程度的洞察,而 MAR@K 提供了对推荐者能够回忆起用户在测试集中正面评价的所有项目的程度的洞察。我不会详细描述 MAP@K 和 MAR@K,因为在这里可以找到很好的描述:
(好吧,这里有一个双关语。)既然你正在读这篇文章,你可能刚刚遇到了“平均精度”这个术语,或者…
sdsawtelle.github.io](http://sdsawtelle.github.io/blog/output/mean-average-precision-MAP-for-recommender-systems.html)
MAP@K 在 ml_metrics 库中可用,我已经让 MAR@K 在 recmetrics 中可用。
By MAR@K, the collaborative filter is able to recall the relevant items for the user better than the other models.
新闻报道
覆盖率是模型能够在测试集上推荐的训练数据中的项目的百分比。在这个例子中,流行度推荐器只有 0.05%的覆盖率,因为它只推荐了 10 个项目。随机推荐器具有预期的接近 100%的覆盖率。令人惊讶的是,协作过滤器只能推荐 8.42%的经过训练的项目。
Coverage comparison for three recommender systems.
个性化
个性化是评估一个模型是否向不同的用户推荐了许多相同的商品的好方法。它是用户推荐列表之间的相异度(1 余弦相似度)。一个例子将最好地说明个性化是如何计算的。
Example list of recommended items for 3 different users.
First, the recommended items for each user are represented as binary indicator variables (1: the item was recommended to the user. 0: the item was not recommended to the user).
Then, the cosine similarity matrix is calculated across all user’s recommendation vectors.
Finally, the average of the upper triangle of the cosine matrix is calculated. The personalization is 1-the average cosine similarity.
高个性化分数表明用户的推荐是不同的,这意味着该模型为每个用户提供了个性化的体验。
列表内相似性
列表内相似度是推荐列表中所有项目的平均余弦相似度。该计算使用推荐项目的特征(例如电影类型)来计算相似性。这个计算也最好用一个例子来说明。
Example recommendations of movie ids for 3 different users.
These movie genre features are used to calculate a cosine similarity between all the items recommended to a user. This matrix shows the features for all recommended movies for user 1.
可以为每个用户计算列表内相似性,并对测试集中的所有用户进行平均,以获得模型的列表内相似性的估计。
如果推荐系统向单个用户推荐非常相似项目的列表(例如,用户只接收浪漫电影的推荐),那么列表内的相似性将会很高。
使用正确的训练数据
可以对训练数据做一些事情来快速改进推荐系统。
- 从培训数据中删除热门项目。(这适用于用户可以自己发现这些项目,并且可能不觉得这些建议有用的情况)。
- 根据用户的价值(如平均交易价值)调整项目评级。这可以帮助模特学会推荐能带来忠诚或高价值顾客的商品。
结论
一个优秀的推荐系统会提供相关和有用的推荐。使用多个评估指标的组合,我们可以开始评估一个模型的性能,而不仅仅是相关性。如果您想使用这些指标和图表来评估您自己的推荐系统,请查看我的 python 库。有问题吗?请随意向伸出手放松!*
基于困惑度和香农可视化方法的语言模型评估
你的自然语言处理模型有多好?
你的语言模型有多好?
为了回答语言模型的上述问题,我们首先需要回答下面的中间问题:与那些很少遇到或有一些语法错误的句子相比,我们的语言模型是否为语法正确和频繁的句子分配了更高的概率?为了训练任何模型的参数,我们需要一个训练数据集。在训练完模型之后,我们需要评估模型的参数被训练得有多好;为此,我们使用完全不同于训练数据集的测试数据集,因此模型看不到它。之后,我们定义一个评估指标来量化我们的模型在测试数据集上的表现。
语言模型的体内评估
为了比较两个语言模型 A 和 B,让这两个语言模型通过一个特定的自然语言处理任务并运行作业。之后,比较模型 A 和 B 的准确性,以评估相互比较的模型。自然语言处理任务可以是文本摘要、情感分析等。
限制:耗时的评估方式。
语言模型的内在评价:困惑
困惑是由语言模型分配给测试集的概率的乘法倒数,由测试集中的单词数归一化。如果语言模型可以从测试集中预测未见过的单词,即 P(测试集中的句子)最高;那么这样的语言模型更准确。
Perplexity equations. Image credit: Speech and Language Processing (3rd edition), Chapter 3 Language Modeling with N-grams, Slide 33, available at http://web.stanford.edu/~jurafsky/slp3/3.pdf
因此,对于测试集来说,更好的语言模型将具有更低的困惑值或更高的概率值。
使用来自华尔街日报数据集 的 3800 万个单词训练并使用 150 万个单词测试的不同 N 元语言模型的示例困惑值
Image credit: Speech and Language Processing (3rd edition), Chapter 3 Language Modeling with N-grams, Slide 36, available at http://web.stanford.edu/~jurafsky/slp3/3.pdf
困惑背后的直觉作为一个评价指标和香农可视化方法
下面这个例子可以解释困惑背后的直觉:假设给出一个句子如下:教授给我的任务是 ____。一个更好的语言模型将通过基于使用训练集分配的条件概率值放置单词来产生有意义的句子。因此,我们可以说,语言模型能够多好地预测下一个单词并因此生成有意义的句子是由基于测试集分配给语言模型的困惑值来断言的。
香农可视化方法
这是一种从经过训练的语言模型生成句子的方法。假设经训练的语言模型是二元模型,则香农可视化方法创建如下句子:
根据概率选择一个随机二元模型(
,w)现在根据概率选择一个随机二元模型(w,x)以此类推,直到我们选择然后将单词串在一起
这里的和分别表示句子的开始和结束。例如:
Image credit: Speech and Language Processing (3rd edition), Chapter 3 Language Modeling with N-grams, Slide 39, available at http://web.stanford.edu/~jurafsky/slp3/3.pdf
近似于莎士比亚
Sentences generated from unigram, bigram, trigram and quadrigram language models trained using Shakespeare’s corpus. Image credit: Speech and Language Processing (3rd edition), Chapter 3 Language Modeling with N-grams, Figure 3.3, available at http://web.stanford.edu/~jurafsky/slp3/3.pdf
莎士比亚的语料库和句子生成使用香农可视化方法的局限性
令牌数= 884,647,类型数= 29,066。然而,在 V * V = 844 亿个可能的二元模型中,莎士比亚的语料库包含了大约 300,000 个二元模型。因此,大约 99.96%的可能二元模型从未在莎士比亚的语料库中出现过。结果,那些看不见的二元模型的二元模型概率值将等于零,使得句子的总概率等于零,进而困惑度等于无穷大。这是一个限制,可以使用平滑技术解决。
Quadrigram 更糟糕,因为它看起来像莎士比亚的语料库,因为它是莎士比亚的语料库,这是由于 Quadrigram 语言模型中的依赖性增加到等于 3 而导致的过度学习。
逼近华尔街日报
Sentences generated from unigram, bigram and trigram language models trained using The Wall Street Journal’s corpus. Image credit: Speech and Language Processing (3rd edition), Chapter 3 Language Modeling with N-grams, Figure 3.4, available at http://web.stanford.edu/~jurafsky/slp3/3.pdf
面向体貌特征抽取的无监督注意模型评估
1 背景
最近我在研究方面术语抽取问题。以无监督的方式提取体貌特征是一个非常具有挑战性的课题,大多数无监督的方法都是基于规则的。但是这些方法并没有达到良好的性能。你可以在 BiLSTM-CRF 中找到 1.1~1.3 的详细任务描述,用于方面术语提取。
在 Google 发表了“注意力是你所需要的一切”一文之后,注意力模型显示了它的无限潜力。所以我想知道如果使用注意力模型以一种无监督的方式提取体项会怎么样。然后我发现了这篇论文,一个用于方面提取的无监督神经注意模型。本文满足三个要求,无监督的方式,注意模型和方面提取。
在这篇文章中,我将展示我对这个无监督注意模型的实验过程。
2 无监督注意模型
这个注意力模型使用自动编码器架构,该架构分为两个部分。编码器部分是从嵌入层到编码器层(p_t
),解码器是从编码器层到解码器层(r_s
)。在编码器部分,注意力层会给每个句子中的每个单词分配注意力分数。然后通过使用注意力得分计算加权句子嵌入(Z_s
)平均句子嵌入。加权句子嵌入将编码为p_t
。最后,p_t
将被解码为r_s
。我们可以认为r_s
是Z_s
的重构。
首先,我们看到基于注意力的编码器部分,它包括注意力层。
e_wi
是每个单词在一个句子中的嵌入向量。y_s
是一个句子中所有单词的平均值。d_i
表示每个单词在句子中的权重如何,这是一个原始的注意力得分。最后用一个 softmax 层来标准化句子中的关注值,而a_i
就是一句话中每个词的关注分数。
Z_s
:注意力加权句子嵌入。
Z_s
是自动编码器的输入层,p_t
是编码器层,r_s
是解码层。
句子的重构:编码表示的降维-> Softmax 以确定方面的权重->方面嵌入的线性组合,其中权重来自计算的 Softmax。
2.2 损失函数
铰链损失,以最大化样本的编码表示和重构表示之间的内积,并最小化负样本的内积。
鼓励方面嵌入唯一性的正则化术语。任何两个不同方面嵌入的点积应该为零。
这是最终的目标函数。
2.3 培训后我们得到了什么
经过训练,我们可以得到一些有用的信息。
a_i
:每个词的注意力得分。我们可以用注意力得分来找出哪个词是体项。在下面的例子中,单词“beef”在句子中的值最大,所以体术语是“beef”。在找到方面项之后,我们将在后面为 clustring 使用它的嵌入。Z_s
:注意力增强句子嵌入。每个句子可以表示为一个嵌入向量。这可以用于其他自然语言处理任务,如类别分类和情感分类。T
:方面嵌入(k x d
维度矩阵,其中k
为训练前经验设定的推断方面类别数,d
为嵌入维度)。体貌嵌入用于近似词汇表中的体貌词。
- 每个方面类别的排名靠前的方面术语。
2.4 评估指标
即使论文中有几个评价指标,但大多数都需要人来识别结果。例如,在提取了方面术语单词之后,有人会识别这个单词是否属于特定的方面类别。在这个过程之后,我们可以计算 f1 的分数。
人类的认识可能包括错误。为了做一个公正的评价,我们用我们的方式来评价模型。
3 模型性能分析
我们首先看到每个方面类别中的顶部单词,以便对性能有一个直接的印象。
我们选择 SemEval2016 task 5 餐厅数据集(2000 个样本)作为测试数据集。我们首先在训练数据上使用 word2vec 来获得单词嵌入。然后在训练数据上训练注意力模型。最后,我们得到每个类别中的前 100 个单词。您可以检查这个 aspect.log 文件中的顶级方面术语。
这里我们拿第一个方面范畴来分析。我们可以认为这个方面类别与“职员”相关,因为顶部的词包含“女主人”、“服务员”、“服务员”等等。结果看起来很好。但如果我们仔细观察,会发现一些奇怪的东西。首先,顶部的单词包含一些像“电话”、“请求”、“问题”、“杂耍”这样的单词。意思是这个体范畴包含了很多不相关的词。第二,还有一些像“道歉”、“知情”、“无礼”之类的词。通常,体术语是名词,但这一类别包含许多动词和形容词。这意味着模型不能区分词性。如果我们看看其他方面类别,我们会发现同样的问题。
从另一方面来说,这可能只能说明聚类过程没有很好地工作。我们要直接看每句话中提取了哪些词。下面是分析笔记本:attention-word-analysis . ipynb。我们举一些例子来看表演。
我列出了每个句子中得分最高的前 3 个单词,但结果看起来并不好。在每个句子中,动词往往具有较高的注意力得分。
有几种方法可以提高性能:
- 将嵌入层设置为“可训练的”
- 用 Word2Vec 嵌入替换手套嵌入
- 尝试不同的方面类别号
尝试了这些方法后,我们之前提到的两个问题还是没有解决。因此,我们可以认为,这个模型可能不会很好地执行提取方面的术语任务。但是在其他任务中会有帮助吗?接下来,我们将评估该模型在其他 NLP 任务上的表现。
3.2 特征类别检测
SemEval2016 任务 5 有三个槽位。槽 1 是方面类别检测任务。共有 12 个类别。SERVICE#GENERA, AMBIENCE#GENERAL, DRINKS#PRICES, DRINKS#QUALITY, DRINKS#STYLE_OPTIONS, FOOD#PRICES, FOOD#QUALITY, FOOD#STYLE_OPTIONS, LOCATION#GENERAL, RESTAURANT#GENERAL, RESTAURANT#MISCELLANEOUS, RESTAURANT#PRICES, SERVICE#GENERAL
。我们需要给每个句子分类。
人工注意
槽 1 的基准 f1 分数是 0.59928。但我们不知道即使注意力模型工作得很好,注意力模型是否能改善槽 1 任务。因此,首先我们必须证明,如果方面术语具有“正确的”注意力分数,则槽 1 性能应该大于 0.59928。
我们用下面的等式计算嵌入的每个句子。w
表示体项词嵌入的权重。我们使用 GloVe 来获得 word 嵌入文件。
在这个slot 1-GloVe-attention . ipynb笔记本中,我们使用了两个手套文件:
- 手套 6B.200d
- 手套 6B.300d
- 手套. 840B.300d
而我们设置权重为 1,1.5,2,2.5,3,找出哪个权重最好。
结果如下。基准 f1 分数为 0.5993。在我们尝试了不同的权重后,最好的结果是 0.6506。因此,我们可以确认,如果注意模型给予体项高的注意分数,体范畴检测的性能将会提高。
嵌入具有更好的性能,但加载时间比其他两种文件长得多。而glove.6B.200d
的 f1-score 与glove.6B.300d
非常接近,所以我们选择glove.6B.200d
进行后面的实验。
真正的关注
在我们证明增强句子嵌入有效后,我们将在现实中测试注意力模型。
这个片段是模型架构的代码。Z_s
是每个句子中嵌入单词的平均总和。如果特征词有正确的注意分数,最终的 f1 分数应该大于基线。
结果看起来不太好。考试成绩只有 0.2057。即使我们对训练数据进行测试,f1 值也只有 0.4177,这与基线值相差甚远。
但是结果并不乐观。考试成绩只有 0.2057。即使我们对训练数据进行测试,f1 值也只有 0.4177,这与基线值相差甚远。
只使用句子嵌入可能不是一个好主意,所以我们一起使用 GloVe 和Zs
。
我们用三种方式(连接、乘、加)将手套词向量和注意句向量结合起来,然后在训练数据和测试数据上进行测试。训练数据上的 f1 值远大于测试数据上的 f1 值,因此我们认为该模型过度拟合。
对于测试数据的结果测试,最好的结果是 0.52,但仍然低于基线。并且该得分的最大贡献来自手套词向量。所以注意力增强句子嵌入仍然没有达到很好的效果。此时,有必要进一步测试该模型的性能。至少我们已经知道这个模型不是方面提取的好选择。
3.3 结果分析
为什么这个模型在其他数据集上如此有效?
一个原因是论文的评估过程是高度定制化的。在方面识别步骤中,作者将 9 个类别(方面)分成 3 个类别(黄金方面),以评估无监督注意模型的性能。这种分组过程可能会削弱评估的质量。
其次是损失函数。损失是通过重构句子向量(r_s
)和加权句子向量(Z_s
)来计算的,这意味着该模型是为了学习对于重构句子什么是重要的。我们不能保证体项是重构句子最重要的特征,动词和形容词也很重要。这就是为什么体术语有这么多动词和形容词的原因。
第三是 autoencoder 架构,我们认为这是最关键的原因。作者选择这种自动编码器来表达无监督的方法,因此不再需要设计损失函数。损失函数不能直接捕获教师信号。使用 autoencoder 来提取方面项是一个很好的尝试,但是并没有达到我们预期的效果。
4 试错法
这一节,我就说说实验中的试错过程。
在本地实现模型后,第一件事就是如何检查模型的性能。但是我不能得到和报纸上显示的一样的 f1 分数。原因是 k-means 初始化特征簇的方式。在评估代码中,群集名称是手动分配的。如果我们训练模型,方面顺序可能会变得不同。因此,如果我们想要评估结果,我们必须自己查看方面集群结果,并为每个方面分配方面类别标签。
根据该论文,大多数度量标准需要人工识别结果。但是这个过程会引入人为误差。而且在训练过程中,我们甚至看不到评估分数,因为评估是在训练之后。为了得到一个令人信服的分数来证明这个模型确实有很好的效果,我们决定使用一些客观的指标。换句话说,我们可以测试这个模型的可移植性。
更具体地说,我们可以使用模型在训练后学到的东西来测试其他任务。这就像单词嵌入技术。如果我们使用嵌入模型来学习一个好的单词表示,这将提高其他 NLP 任务的性能,如情感分析、命名实体识别等。在我们的例子中,如果无监督模型很好地提取了方面术语单词,那么该模型所学习的也应该促进其他 NLP 任务。如果其他 NLP 任务得到提升,也可以证明无监督注意模型工作良好。这就是我们选择 SemEval 2016 Task 5 Slot 1 进行性能测试的原因。如果这不起作用,就没有必要做其他实验。
正如结果显示的那样,结果看起来并不好。所以我们的实验在测试结束后就停止了。
5 一些建议
我在这个模型上花了很多时间和精力,但它真的让我心碎: (
幸运的是,我从这一课中学到了很多。我希望我的经历可以帮助那些遇到同样情况的人。
首先,当你在现实世界中遇到问题时,不要沉迷于新方法。我之所以实现这个模型,是因为它包含了注意力模型、无监督和特征提取等关键词。但是这种方法没有其他可行的方法。可能说明这条路并没有太大的潜力和研究价值。
第二,向工业界寻求建议。在实验过程中,我做了大量的研究,并从一家顶级 IT 公司的高级开发人员那里找到了一些有用的建议。一位开发人员告诉我,如果数据域有限,使用字典收集相关单词是简单但有用的方法。例如,我的数据集是基于餐馆评论的,我们可以只计算单词数,并选择常见单词作为方面术语。有时候,基于规则的方法并不是一个坏的选择。
第三,仔细思考哪种方法适合你的问题。这里的方法是指监督方法、半监督方法和非监督方法。首先,我想使用无监督的方法来提取方面术语。但这是错误的。我应该做的第一件事是做一些研究,看看哪种方法最适合这个问题。如果监督方法运行良好,您应该尽可能多地收集带注释的数据。这个过程可能会很乏味,但这将立即改善您的模型。至于无监督的方法,基于规则的方法在行业中非常常见。
总的来说,最重要的是做更多的研究,阅读一些调查/评论论文,然后再深入研究一个具体的问题。
查看我的其他帖子 中 同 一个分类查看 !
GitHub:bramble Xu LinkedIn:徐亮 博客:bramble Xu
即使是数据和技术工作,求职信也是推销你人际技能的最佳方式
我不从事数据科学领域的工作,所以如果你在寻找如何获得真正特定于技术的数据科学工作的建议,我不是你要找的人。酪我在数据科学的附近做的工作;我从事法律和政策方面的工作,与数据科学的交叉越来越多。如果我想在这个交叉领域找到一个合作伙伴,他们的人际技能对我来说比他们的数据技能更重要。
这就是为什么,在我看来,求职信是不可或缺的。这是向潜在雇主展示这些人际技能的最佳方式。
我先重复一下我哥哥在关于这个话题的帖子中所说的,千篇一律、标准格式的求职信是没有用的。他还说得对,大多数寻找候选人的人都能看出某人只是在说他们认为未来雇主想听的话。我看过很多求职信,告诉我申请的人渴望在不利的情况下为那些不幸的人努力工作;我很少在求职信中看到有人这样说是什么意思。
所以我不提倡在你的申请中附上一封平淡无奇的“正是因为这些原因,我相信我非常适合”风格的求职信。但是我提倡像写简历一样努力写求职信。因为有一些事情求职信可以做到,而简历做不到。
首先,一份简历不能向潜在雇主展示你能像人一样交流。简历是一份清单。但是人们不会在列表中说话。一页长的声望协会和先前工作的清单并不能告诉我你能写,比如,一封清晰简洁的更新邮件。在法律和政策领域,即使是最专注于技术的职位也不得不为一群非技术人员写更新邮件(事实上,最专注于技术的职位不幸地往往是在这方面最挣扎的人)。
简而言之,沟通是我工作领域的关键,你应该抓住每一个机会向潜在雇主展示你擅长沟通。(如果你不擅长,那就去做吧。像磨练技术技能一样磨练你的沟通技能。)
第二,如果没有像求职信这样的个人信息,你的简历只是一大堆看起来越来越相似的文件中的一张。你的材料会被技术人员看,但也会被人力资源部看,在我的世界里,至少会有几个律师。合格的技术人员在非技术人员(比如像我这样的人)看来都差不多。但是如果我看到一个真实的人,具有真实的人类特征,与那些合格的候选人混在一起,我就更有可能注意到。
第三,也许是最重要的,当我试图挑选一个人一起工作时,我总是在寻找那些已经知道我不能教的东西的人(或者至少是我不能轻易教的东西)。任何愿意的人都可以学习新的技能或主题。我花了一年时间向一位 IT 专家教授刑事诉讼和州政府基金(作为交换,我学会了 SQL 查询和数字法医调查)。人们可以学习他们需要学习的东西。
但在公共辩护领域工作多年后,我明白了最重要的事情是那些你教不了的。你不能教一个人去同情和他们不一样的人。你不能教人们放下自我去做艰苦的、朴实无华的工作。你当然不能轻易地教会人们如何在一个多样化的团队中有效地工作。
因为我一直在寻找那些已经有激情和能力与他人一起制定共同价值观的候选人,所以我一直在寻找一封展示这些东西的求职信。一份简历做不到这一点。
所以,如果你想推销你的人际技能,而不仅仅是技术技能,不要跳过求职信。
这是我哥哥乔丹·戈尔德迈尔(Jordan Goldmeier)一篇关于数据科学工作求职信的文章的对比。更多关于技术职位求职信的建议,请阅读他的文章。
事件驱动架构模式
入门和实践中的一瞥
这是用于开发高度可伸缩系统的最常见的分布式异步架构。该体系结构由单一用途的事件处理组件组成,这些组件监听事件并异步处理它们。
事件驱动架构中有两种主要的拓扑结构。
- 中介拓扑
- 代理拓扑
中介拓扑
中介拓扑有一个事件队列和一个将每个事件导向相关事件处理器的中介。通常,事件通过事件通道被送入事件处理器,以过滤或预处理事件。
事件队列的实现可以是简单消息队列的形式,甚至是大型分布式系统中的消息传递接口,该系统涉及复杂的消息传递协议,如 Rabbit MQ。下图展示了中介拓扑的架构实现。
Mediator Topology for Event Processing
代理拓扑
这种拓扑不涉及事件队列。事件处理器负责获取事件,处理和发布另一个表示结束的事件。正如拓扑的名称所暗示的,事件处理器充当链接事件的代理。一旦一个事件被一个处理器处理,另一个事件被发布,以便另一个处理器可以继续处理。
考虑下图。
Broker Topology for Event Processing
如图所示,一些事件处理器只是处理而不留下任何痕迹,一些倾向于发布新事件。这与我们在 NodeJS 应用程序中看到的非常相似。某些任务的步骤以回调的方式链接在一起,当一个任务结束时,就触发回调。所有的任务本质上都是异步的。
NodeJS 事件循环
下图展示了官方文档中描述的 NodeJS 架构。
┌───────────────────────┐
┌─>│ timers │
│ └──────────┬────────────┘
│ ┌──────────┴────────────┐
│ │ I/O callbacks │
│ └──────────┬────────────┘
│ ┌──────────┴────────────┐
│ │ idle, prepare │
│ └──────────┬────────────┘ ┌───────────────┐
│ ┌──────────┴────────────┐ │ incoming: │
│ │ poll │<─────┤ connections, │
│ └──────────┬────────────┘ │ data, etc. │
│ ┌──────────┴────────────┐ └───────────────┘
│ │ check │
│ └──────────┬────────────┘
│ ┌──────────┴────────────┐
└──┤ close callbacks │
└───────────────────────┘
所有传入的连接都被推入轮询,它们将被异步处理。这不会阻止正在处理的其他呼叫。因此,该架构提供了更大的单线程可扩展性。我们可以运行几个节点进程,在它们之上平衡负载,并相应地引导请求。
延伸阅读:https://nodejs . org/en/docs/guides/event-loop-timers-and-next tick/
少数事件驱动的 web 框架
- netty(JAVA)——https://netty . io
- 垂直。X (JVM 语言)— http://vertx.io
- spring Reactor(JAVA)——https://spring.io/guides/gs/messaging-reactor/
- http://reactphp.org
模式分析
该模式缺乏事务的原子性,因为不能保证事件的执行顺序。这是因为事件处理器被实现为高度分布式、解耦和异步的。结果预计将在未来某个时间提供,主要是以回调的方式。
易测性
由于处理的异步性质,测试具有事件驱动架构的系统并不容易
表演
由于任务本质上是异步和非阻塞的,所以执行是并行的。因此,这超过了提供高性能的排队机制的成本。
可扩展性和易开发性
尽管系统是高度可扩展的,但是开发工作是巨大的。这是因为单元测试和组件测试由于异步特性而变得困难,这使得系统具有可伸缩性。由于事件处理器的解耦特性,系统可以并行运行,从而提高可伸缩性和并行性。
秘密身份骗不了现代人脸识别
和我这个年龄的大多数人一样,我试图给我的孩子看 1978 年的原版《超人》,向他们介绍我最喜欢的超级英雄,这时我 4 岁的孩子大声问为什么没人认出克拉克·肯特就是超人:钢铁之躯。
这让我想到了超级英雄的秘密身份以及它们对现代人脸识别技术的有效性。
很有可能,如果一个 4 岁的孩子能认出某人,那么机器学习模型也能。所以我决定测试一下。
自然,我的第一个测试是看我能否训练一个模型来识别超人是克拉克·肯特。在电影中,他的伪装完美无缺。似乎没有人能看着克拉克的脸认出他是超人。在我的想象中,这是因为没有人真正看清楚超人(因为他总是飞来飞去什么的),所以很难回忆起他长什么样。但是面对现代 AI,要中止我的不相信越来越难了(哈哈)。
今天,几乎任何媒体公司都可以对其所有内容进行人脸识别,并注意到《星球日报》第二好的记者是来自氪星的外星人。下面是我如何进行测试的:
首先,我找了一张克拉克·肯特完全伪装的照片。
Christopher Reeve will always be Superman to me
我复制了照片的网址,并在我的电脑上打开了一个 Facebox 的实例。我在我的网络浏览器中打开控制台,向下滚动到/teach
终点,并使用小演示工具教 Facebox 这张图片。我给它贴上标签克拉克·肯特。
然后,为了测试它,我打开了控制台的 live demo 部分,粘贴了一个 URL 到一个超人看起来最帅的屏幕截图(他是怎么卷曲的?):
Screenshot of the Facebox console
它立刻认出了他。我只训练了一个例子的人脸识别模型!超人的秘密身份看来不妙。也许他应该换个发型?
Still image from Superman III
不——那也不起作用。
所以我决定测试其他超级英雄的秘密身份,看看他们如何对抗 Facebox。
卡拉·丹弗斯怎么样?
没有。
奥利弗·奎恩怎么样?
用这张图片教了 Facebox,让我们看看结果:
没有——还是认出了他。即使戴着面具和兜帽。
Facebox 和其他好的人脸识别系统将能够理解人脸的结构,而不管假眼镜、面具或头发是否模糊。
深度学习模型模糊地受到生物神经系统中信息处理和通信模式的启发。神经网络寻找其他方法来识别人脸,类似于人类如何识别。这就是为什么这些伪装骗不了一个深度学习模型。
Taught Facebox Dick Grayson on the left, tested it with Robin on the right.
实际上,我有点惊讶,它仅仅用一张照片就能很好地识别出这些人。其实你可能根本不相信我,我也不会怪你。这就是为什么我鼓励你自己尝试一下。下载 Facebox ,右键点击上面的训练图像并保存到你的硬盘上,然后,按照 Facebox 控制台上的指示教脸。教学后,在控制台中打开现场演示,用你在互联网上(或在这篇博客中)找到的任何图像进行测试。
享受吧。
每个人都讨厌垃圾邮件,我们如何阻止它?
我讨厌垃圾邮件。你讨厌垃圾邮件。每个人都讨厌垃圾邮件。但是我们如何阻止已故亚瑟·范·杜克爵士的儿子试图把他们的财产寄给我们呢?嗯,最显而易见的解决方案是雇佣一组猴子来阅读和检查每封邮件中的垃圾邮件。但是我想我们都同意这不太实际,说实话,猴子并不真的那么聪明。相反,像谷歌这样的大公司所做的是使用机器学习来区分恶意发送的电子邮件和来自老板的电子邮件,老板对你错过昨天的会议非常不满。
我们如何检测垃圾邮件?
垃圾邮件检测使用一种机器学习算法,可以将电子邮件分类为垃圾邮件/非垃圾邮件,它从您训练它的数据中学习如何做到这一点。Gmail 每天都会收到大量数据,这些数据来自像你我这样的人,他们报告说,如果他们的收件箱收到了垃圾邮件。每次你这样做,Gmail 的预测模型在识别垃圾邮件时都会稍微好一点。你可以想象,制作一个真正好的垃圾邮件分类器需要大量数据,这就是为什么 Gmail 有最好的分类器之一——多年来,他们收集了大量数据,以帮助他们更好地识别垃圾邮件。
人们能够对垃圾邮件进行分类的一种方法是使用逻辑回归。逻辑回归是一种预测模型,当您试图预测的数据是分类数据(1 和 0、是和否等)时,您可以使用它。逻辑回归使用逻辑函数来进行预测。
Logistic Function(Sigmoid) — Source
这是一个被称为 Sigmoid 的逻辑函数的图形,它被用于二元分类预测。基本上将事物分为两类。这个函数需要优化,以适应我们的数据集,这样它就可以做出很好的预测。为了做到这一点,我们使用一种叫做成本函数的东西——它计算出与我们的预测模型有多大的误差,然后我们试图通过使用梯度下降来修正它。这些都是相当复杂的话题,我不会多谈。如果你想了解更多,可以查看这个链接。
我们自己做
现在我们知道了垃圾邮件分类器的基本工作原理,我们可以使用 Python 创建自己的程序,只用 10 行代码就可以对邮件进行分类。
我们将只使用 Scikit-Learn 和 Pandas 作为我们的依赖项,然而,在最后会有一个 Google Colab 链接,在那里你将能够跟随代码并在线运行一切。
如果您想自己编写代码,请确保从这个链接中获取数据集!该数据集包含几千封不同的邮件,这些邮件都被分类为垃圾邮件和非垃圾邮件。
我们需要导入 Pandas 来加载我们用来训练模型的数据。我们将使用 Scikit-Learn 的内置逻辑回归作为我们的预测算法——这非常容易使用,让我们只用一行代码就可以建立一个模型,但是,如果你想从头开始学习如何编写逻辑回归模型,请查看这个链接。我们还需要 CountVectorizer,它对单词的重复次数进行计数,并将该数字放入一个数组中,这样我们的算法就可以在数据中找到模式。
现在,我们使用 pandas 加载数据,并初始化我们的逻辑回归模型和计数矢量器。Scikit-Learn 的逻辑回归模型已经配备了我们使其工作所需的所有部件;逻辑函数、成本函数和梯度下降。所以我们需要做的就是运行一个命令。
数据集的*“v2”列中的数据是我们想要分类的短语,而“v1”有标签(分别是“火腿”和“垃圾邮件”*)。计算机计算单词的重复次数,并将它们插入一个数组,这基本上只是将这些短语变成数字。这样做之后,我们创建另一个数组,其中包含消息中数据的所有分类器。最后,我们可以使用数据和目标来训练我们的模型。
在我们将数据拟合到我们的模型之后,我们可以对它进行一些预测!您可以运行这个命令,用您自己的消息替换引号内的内容,看看它是否被归类为垃圾邮件。
就是这样!创建我们的机器学习模型来检测垃圾邮件只需要 10 行代码。如果你想玩玩它,去我的 Google Colab 大纲。
在本文中,我们介绍了机器学习如何用于分类垃圾邮件,这可能是比使用猴子更好的替代方法。这是一个很酷的话题,我们每天都在体验这种努力的成果,但机器学习的应用确实是无限的,随处可见。
数据安全、医疗保健和在线一切等巨大行业已经被机器学习彻底改变了。请记住,这只是我们通过机器学习可以实现的目标的开始,可以改变我们生活的新技术每天都在被发现。
感谢阅读!我希望你喜欢我的文章,并学到一些新东西。如果有,请务必通过以下方式与我联系:
- 或者发邮件给我:aryanmisra@outlook.com
首席执行官需要知道的关于人工智能的一切
人工智能是如何工作的。你能用它做什么。以及如何入门。
人工智能就是把 A 和 B 连接起来
关于人工智能的信息经常令人困惑,有时甚至是彻头彻尾的误导。不过艾对于商业很简单:
“今天人工智能创造的 99%的经济价值都是通过一种人工智能来实现的,这就是学习 A 到 B 或输入到输出的映射。” 吴恩达
今天,人工智能的几乎每一个商业应用都是关于学习从某些输入产生某些输出:
AI 如何学会预测正确的输出?
- 您收集了输入->输出对的示例(越多越好)。
- AI 算法学习输入和输出之间的联系(这就是神奇之处)。
- 你将训练好的算法(即*“模型”*)应用于新的输入数据来预测正确的输出。
就是这样!几乎所有用 AI 做$$的人都是完全这样做的。
当你有很多数据的时候使用 AI
人工智能需要数据
人工智能是强大的,因为它将数据转化为洞察力。但是人工智能的学习效率不如人(是的,效率更低),所以它需要大量的数据来学习。如果你有大量的数据,你应该考虑人工智能!
数据是竞争优势,不是算法。
这就是为什么谷歌和脸书对开源他们的算法没有任何问题。但是他们绝对不会公开他们的数据。如果你有很多别人没有的数据,那么这就是建立一个独特的人工智能系统的绝佳机会。
找到你的人工智能用例的 3 个最简单的方法
所以你有很多数据。现在你做什么?以下是我知道的发现人工智能用例的 3 种最佳方式:
1.改善自动化决策
您在哪里拥有自动化基于规则的决策的软件?
例如:
- 呼叫路由
- 资信评分
- 图像分类
- 市场细分
- 产品分类
人工智能很有可能提高这些决策的准确性,因为人工智能模型可以捕捉更多连接 A 和 b 的底层复杂性。相比之下,当你手动将规则写入软件时(传统方式),你只能编码基本的依赖关系。
对于我们的一个客户(ImmobilienScout24),我们的电子邮件收入增加了 250%。只需将基于规则的电子邮件分段替换为更智能、更精细的 基于人工智能的分段 。
2.人们可以在< 1 second
Another great heuristic I first heard from Andrew Ng is:
中做的事情“一个正常人在< 1 秒内可以做的几乎任何事情,我们现在都可以用人工智能来自动化。” 推特
那么在< 1 sec?
- Who’s in that picture?
- Do I have a good feeling about this potential customer?
- Does this look like a problematic CT Scan?
Also many jobs are 一系列< 1 秒决策中,人类可以决定哪些事情。喜欢开车:
- 那个人要过马路吗?
- 我离人行道太近了吗?
- 我应该慢下来吗?
- …还有很多很多。
你能在不到 1 秒钟内完成的任何事情,AI 很可能也能做到。(或者很快就能)。
3.从 Kaggle 竞赛中获得灵感
像 Zillow 、 Avito 、 Home Depot 、 Santander 、 Allstate 、 Expedia 这样的大公司正在 Kaggle 上举办数据科学竞赛。这些是他们希望外部数据科学家解决的挑战。因此,这些比赛让你了解他们正在开发什么类型的人工智能解决方案。这真的是一个很好的资源。
看看比赛并从中获得灵感。
TL;DR:寻找人工智能用例:
- 升级已经自动化的决策
- 自动化人们在< 1 sec
- Get inspired by Kaggle competitions
Don’t wait until you have a Data Science Team
Building a good data science team is super hard (and expensive!)
Many companies struggle (and ultimately fail) to build an 高效数据科学团队中做的事情。为什么这么难?
- 关于雇佣谁的错误信息
- 激烈的人才竞争
- 很少有管理者能够有效地领导数据科学团队
更重要的是…
你还不知道你是否需要一个数据科学团队
你可能有很多数据和想法,但这并不意味着你需要自己的数据科学团队。只有在你建立了你的第一个人工智能系统之后,你才会真正知道从长远来看你需要多少人力。所以…
快速构建有效的东西
你的第一个目标应该是摘下挂得最低的 AI 果并快速完成。这会让你遥遥领先:
- 你会取得切实的成功,让投资者、董事会和你的团队兴奋不已;
- 你将了解人工智能的味道,并获得什么有效什么无效的真实体验;
- 你会对下一步在哪里使用 AI 有更好的想法。
有了第一个完成的系统,您就能更好地雇佣和培训数据科学团队。或者也许你发现你不想(或不需要)雇用整个团队,因为那个容易摘到的果子已经占了你可以用人工智能做的事情的 80%。
人工智能团队应该在整个公司范围内工作
如果你确实建立了一个 AI 团队,你应该为整个公司建立,而不仅仅是一个部门。一支横艾的队伍。
不要在部门中思考
人工智能体验是非常可转移的:对一个数据科学家来说,你的 CRM 数据看起来和你的库存数据几乎一样。对于算法来说,它们看起来更相似。因此,为整个公司建立一个人工智能工作组是非常有意义的。
旁注:为了工作,你也应该把你的数据放在一个地方!
更多救生技巧
不要听别人推销“更好的算法”
要么他们没有经验,要么他们试图向你出售开源软件以获取利润。在人工智能中,每个人都在用水做饭,这意味着他们使用公开可用的算法。
关注业务体验和工程质量
与那些花时间真正理解你试图解决的业务问题并且在工程质量方面有高标准的人一起工作。如果你想得到更多的结果而不那么麻烦,那么管道比流过管道的可爱算法更重要。
魔力三角会议😋
当你把三种类型的人放在一个房间里时,最好的想法就产生了:
- 了解当前业务重点的人(你?),
- 知道你拥有的数据的人(你的数据库工程师),以及
- 一个在构建人工智能系统方面有丰富实践经验的人。
这三个人一起就能做出现实的计划,真的很快。
TL;速度三角形定位法(dead reckoning)
就这样:
- AI 就是把 A 和 b 连接起来。
- 研究涉及大量数据和不到 1 秒决策的流程。
- 在你制定大计划之前取得第一次胜利。
如果你一路上需要帮助,给我写信。我总是很高兴听到令人兴奋的挑战: m.schmitt 在 datarevenue.de
最初发表于T5【www.datarevenue.com】。
关于 AutoML 和神经结构搜索你需要知道的一切
想获得灵感?快来加入我的 超级行情快讯 。😎
AutoML 和神经架构搜索(NAS)是深度学习城堡的新国王。它们是在不做太多工作的情况下,为您的机器学习任务获得巨大准确性的快速而肮脏的方法。简单有效;这就是我们想要的人工智能!
那么它是如何工作的呢?你如何使用它?今天你有什么选择来驾驭这种力量呢?
这里是您需要了解的关于 AutoML 和 NAS 的所有信息。
神经结构搜索(NAS)
开发神经网络模型通常需要大量的架构工程。有时你可以通过转移学习,但是如果你真的想要最好的性能,通常最好设计你自己的网络。这需要专业技能(从商业的角度来看,这很昂贵,),总体来说具有挑战性;我们甚至可能不知道当前最先进技术的极限!这需要反复试验,而且实验本身既耗时又昂贵。
这就是 NAS 的用武之地。NAS 是搜索寻找最佳神经网络架构的算法。大多数算法都是这样工作的。首先定义一组可能用于我们网络的“构建块”。例如,最先进的 NASNet 论文提出了图像识别网络的这些常用模块:
NASNet blocks for image recognition network
在 NAS 算法中,控制器递归神经网络(RNN)对这些构建块进行采样,将它们放在一起以创建某种端到端架构。这种架构通常体现了与最新网络相同的风格,如 ResNets 或 DenseNets ,但使用了非常不同的块组合和配置。
然后,这个新的网络体系结构被训练收敛,以在保留的验证集上获得一定的准确性。由此产生的精度用于更新控制器,使得控制器将随着时间的推移产生更好的架构,可能通过选择更好的块或进行更好的连接。控制器权重用策略梯度更新。完整的端到端设置如下所示。
The NAS algorithm
这是一种相当直观的方法!简而言之:让一个算法抓取不同的块,并将这些块放在一起组成一个网络。训练并测试网络。根据您的结果,调整您用来制作网络的块以及如何将它们放在一起!
这个算法成功的部分原因是因为它的约束和假设。NAS 发现的体系结构是在比真实世界小得多的数据集上训练和测试的。这样做是因为在像 ImageNet 这样的大型系统上进行训练需要很长时间。但是,这个想法是,在较小但结构相似的数据集上表现更好的网络也应该在较大和更复杂的数据集上表现更好,这在深度学习时代通常是正确的。
第二,是搜索空间本身相当有限。NAS 旨在构建在风格上与当前最先进的体系结构非常相似的体系结构。对于图像识别,这是指在网络中有一组重复的块,同时进行逐步下采样,如下左图所示。在当前的研究中,选择一组积木来建造重复积木也是非常普遍的。NAS 发现网络的主要部分是块如何连接在一起。
在右下方查看 ImageNet 网络的最佳发现块和结构。有趣的是注意到它们是如何包含看起来相当随机的混合运算,包括许多可分离的卷积。
建筑搜索的进展
NASNet 的论文具有惊人的进步性,因为它提供了深度学习研究的新方向。不幸的是,它的效率很低,而且谷歌之外的普通用户无法访问。使用450 GPU花了3-4 天的训练才找到那个伟大的架构。因此,NAS 的许多最新研究都集中在使这一过程更加高效。
渐进式神经架构搜索(PNAS) 提出使用所谓的基于序列模型的优化(SMBO)策略,而不是 NASNet 中使用的强化学习。使用 SMBO,我们不是随机地从外部集合中抓取和尝试块,而是测试块并按照复杂度增加的顺序搜索结构。这不会缩小搜索空间,但它确实使搜索以更智能的方式进行。SMBO 基本上是在说:*不要一次尝试所有的事情,让我们从简单开始,只在需要的时候变得复杂。*这种 PNAS 方法的效率是原始 NAS 的 5 到 8 倍(因此成本更低)。
高效的神经架构搜索(ENAS) 是另一种尝试,试图使一般的架构搜索更有效,这一次普通的 GPU 从业者都可以使用。作者的假设是,NAS 的计算瓶颈是训练每个模型收敛,只测量其测试精度,然后扔掉所有训练的权重。
研究和实践已经反复表明,迁移学习有助于在短时间内达到高精度,因为为有些相似的任务训练的网络发现相似的权重;迁移学习基本上只是网络权重的转移。ENAS 算法迫使所有模型共享权重,而不是从零开始训练到收敛。我们以前在以前的模型中尝试过的任何块都将使用那些以前学习的权重。因此,每次我们训练一个新的模型,我们本质上都在做一个转移学习,收敛得更快!
论文中的表格显示了 ENAS 使用单个 1080Ti GPU 半天的训练效率有多高。
Performance and efficiency of ENAS
深度学习的新方式:AutoML
许多人将 AutoML 称为进行深度学习的新方式,这是整个系统的一种变化。我们不用设计复杂的深度网络,只需运行预设的 NAS 算法。谷歌最近将这一点发挥到了极致,推出了云自动化。只需上传你的数据,谷歌的 NAS 算法就会为你找到一个架构,又快又简单!
AutoML 的想法是简单地抽象出深度学习的所有复杂部分。你需要的只是数据。让 AutoML 来做网络设计的难点就好了!深度学习就像其他工具一样变成了一个插件工具。获取一些数据,并自动创建一个由复杂的神经网络驱动的决策函数。
Google Cloud’s AutoML pipeline
Cloud AutoML 的价格高达 20 美元,不幸的是,一旦你的模型被训练好,你就不能导出它;你必须使用他们的 API 在云上运行你的网络。有几个完全免费的替代方案,但是需要多做一点工作。
AutoKeras 是一个使用 ENAS 算法的 GitHub 项目。它可以使用 pip 安装。因为它是用 Keras 编写的,所以很容易控制和使用,所以你甚至可以深入 ENAS 算法并尝试做一些修改。如果你更喜欢 TensorFlow 或 Pytorch,这里还有那些这里和这里的公共代码项目!
总的来说,现在有几种选择来使用 AutoML。这只是取决于你是否会玩弄你想要的算法,以及你愿意付出多少来获得更多的代码抽象出来。
NAS 和 AutoML 的未来预测
很高兴看到过去几年在自动化深度学习方面取得的长足进步。它使用户和企业更容易接触到它;深度学习的力量变得越来越容易为大众所接受。但是,总有一些改进的空间。
建筑搜索变得更加高效;像 ENAS 一样在一天的训练中找到一个只有一个 GPU 的网络是非常令人惊讶的。然而,我们的搜索空间仍然非常有限。当前的 NAS 算法仍然使用手工设计的结构和构建块,它们只是以不同的方式将它们放在一起!
一个强大的和潜在的突破性的未来方向将是更广泛的搜索,真正寻找新的架构。这种算法可能会揭示这些庞大而复杂的网络中隐藏的更多深度学习秘密。当然,这样的搜索空间需要高效的算法设计。
NAS 和 AutoML 的这一新方向为人工智能社区提供了令人兴奋的挑战,也为科学领域的另一次突破提供了机会。
你想知道的关于纽约市餐馆等级的一切
任何去过纽约市的人都可能注意到几乎所有餐馆的餐馆字母等级。字母等级是在 2010 年引入的,范围从 A 到 C,A 是最高(最好)的评级。餐馆被要求清楚地展示字母等级,尽管一些机构很有创意。
The “B” is for Brunch!
我一直对收视率很好奇,既然数据可以在网上获得,我想我应该亲自测试一下。TLDR:检查员不喜欢给除了 As 以外的分数,不喜欢周末工作,连锁餐厅也很干净。还有一个我无法解开的谜团(跳到结尾,关于餐馆多久被评论一次)。所有的代码都可以在这里找到。
无聊的东西
数据(186,185 行,12 列):
DBA 是餐厅名称,其余部分不言自明。餐厅的命名并不总是一致的(例如星巴克和星巴克咖啡),所以我必须稍微清理一下。
数据集提供了每家餐厅的历史评分以及最近的评分。但是评级也分为重要和不重要两类。因此,一个评级将有两行,一行表示严重违规,另一行表示非严重违规。所以我删除了关于违规描述/类型的信息,并删除了重复的内容。
由于数据集包含历史信息,我还为每个餐馆创建了一个惟一的键。为此,我创建了一个结合了餐馆名称、建筑、街道和邮政编码的值(例如,DARKHORSE 17 MURRAY STREET 10007)。
成绩的分类是什么?
分数从 0 开始。低分数是好的,因为它表示没有违规。每个违规都有一定的分值,因此 0 分意味着没有违规。有三种类型的违规:
- 一般——例如,没有正确消毒烹饪用具——最低 2 分
- 关键——例如,提供生的食物,如沙拉,但没有先清洗干净——最低 5 分
- 公共健康危害——例如,未能将食物保存在合适的温度下——最低 7 分
最终成绩是基于所有分数的总和。
- 0 到 13 岁的学生得 A
- 14 岁到 27 岁可以得 B
- 28 岁或以上得 C
下面可以看到按百分比分列的成绩细目,按最近成绩和所有成绩分组。
我并不感到惊讶,大部分成绩是 As,只有不到 2%的检查结果是 C。数字分数的分布情况如何?
在从 A 到 b 的分界点上有 14 个点的急剧下降。来自城市的网站:
两种类型的检查会导致字母等级:餐厅获得 A 的初次检查和获得 A、B 或 c 的再次检查。餐厅在每个检查周期有两次获得 A 的机会。如果它在第一次检查中没有获得 A,它被计分但未被分级。检查员通常会在一个月内突然回到餐馆,再次检查,并对再次检查进行评分。如果等级为 B 或 C,餐厅将获得等级卡和等级待定卡。它可以邮寄任何一张卡片,直到它有机会在行政审判和听证办公室健康法庭得到听证。直到一家餐厅有了分级检查,才在卫生部门网站上列为尚未分级。
因此,非 A 级最初不会被报道,餐厅还有一次机会。这抑制了报告的 B 和 C 等级。但是在 A 到 B 的分界点上的高分数是很奇怪的。我的猜测是,视察员在接近禁产门槛时会表现出宽容。如果很接近,检查员会给餐馆更高的分数,因为字母分数对顾客来说是最明显的部分。它也可能是分配给每个违规的分数的结果。例如,严重违规最低为 5 次,公共健康危害最低为 7 次。所以 10 分或 12 分应该更常见,这就是我们看到的。
检查员什么时候检查?
看来食品检查员不喜欢周末工作,尤其是周日。哦,他们在七月也很放松。
这些年来有分数膨胀吗?
呃,也不尽然。第一年只有大约 80%的 A 评级,但样本量只有大约 100 人。B 级和 C 级评级分别稳定在 12%和 4%左右。今年到目前为止还有很多 Z 或者还没有评分。
哪些餐厅的菜肴评价最高?
数据集对美食描述的命名不一致(例如,16 柄有时归类为美式,有时归类为冰淇淋)。在这种情况下,我使用了最常见的美食描述。我也排除了评级总数少于 50 的公司。分数越低越好(违规越少)。
收视率出奇的好,但我想这是大型连锁店的预期。记住高分是不好的。一些机构像苹果蜂的,Panera 面包和白色城堡(!)除了 a 之外从来没有拿到过一个公开的成绩,其他像达美乐这样的团体很不一致,经常很差(他们拿到的成绩只有 81%是 a,5%是 c)。然而,麦当劳在所有大型餐厅中拥有最差(最高)分数 62 分的可疑荣誉。
个别餐厅的评分如何随时间变化?
考虑这个问题的一个方法是通过滚动率。滚动率是从一种状态转换到另一种状态(或停留在同一状态)的概率。我根据从一个等级到另一个等级的概率创建了一个滚动率(关于如何创建滚动率的更简单的通用示例,请参见这个堆栈溢出问题)。
大约 90%的情况下,A 评级会在下一次检查中再次获得 A。在下一次评级中,B 级餐厅有 71%的机会获得 A 级,C 级餐厅有 68%的机会获得 A 级。这对那些在 B 级和 C 级餐厅用餐的人来说应该是一种安慰。
餐厅多长时间保持一个给定的等级?
我查看了每家餐厅点评的时间间隔。我把它按等级分类,因为我发现等级低的餐馆更容易被评论。
从上面看不出来,但是 A 级有双峰分布。
我花了一些时间试图找出区别,但我从来没有找到一个令人满意的答案。A 级天数的分布在几年内和几个月内都是一致的。一般来说,所有菜系和所有行政区都是双模式的。
这多少与餐馆被分级的频率有关,但不是绝对相关(例如,像星巴克这样的餐馆几乎都在右峰)。我可能遗漏了一些显而易见的东西,但我猜测这是由于一些没有报告的分数。如前所述,如果一家餐馆得到了 B 以外的分数,分数不会被报告,餐馆在一个月内还有机会得到 A。我的猜测是,未能通过这一未被报道的评级会导致餐馆更频繁地被审查。这就解释了为什么评级高的餐厅很少得到评级。即使你看看那些从未被评为 A 级以下的餐馆,双峰分布也是存在的,但那可能只是因为非 A 级餐馆没有被报道。
我对其他想法持开放态度。
It always existed
Large chains are still somewhat bi-modal
Even those with perfect grades are bi-modal
Bi-modal across months
No clear pattern between A-grade consistency and time at grade
推销员的进化:Python 的完整遗传算法教程
从自然选择中汲取灵感,遗传算法(GA)是一种解决搜索和优化问题的迷人方法。虽然已经有很多关于遗传算法的文章(见这里的和这里的),但很少有人展示用 Python 一步一步实现更复杂问题的遗传算法。这就是本教程的由来!继续学习,到最后,您将完全理解如何从头开始部署 GA。
Photo by chuttersnap on Unsplash
介绍
问题是
在本教程中,我们将使用遗传算法来寻找旅行推销员问题(TSP)的解决方案。TSP 描述如下:
给定一个城市列表和每对城市之间的距离,访问每个城市并返回起始城市的最短可能路线是什么
Illustration of a potential solution to the TSP (By Xypron [Public domain], from Wikimedia Commons)
有鉴于此,有两条重要的规则要记住:
- 每个城市只需要被访问一次
- 我们必须回到出发城市,所以我们的总距离需要相应地计算
方法
让我们从几个定义开始,在 TSP 的上下文中重新表述:
- **基因:**一座城市(用(x,y)坐标表示)
- **个体(又名“染色体”)😗*满足上述条件的单一途径
- **群体:**可能路线的集合(即个体的集合)
- **父级:**两个路由组合在一起创建一个新路由
- **交配池:**用于创建我们下一个种群(从而创建下一代路线)的亲代集合
- Fitness: 一个告诉我们每条路线有多好的函数(在我们的例子中,距离有多短)
- **变异:**通过随机交换路线上的两个城市,在我们的人口中引入变异的一种方式
- 精英主义:将最优秀的个体带入下一代的一种方式
我们的 GA 将按以下步骤进行:
1.创造人口
2.确定适合度
3.选择交配池
4.类型
5.使突变
6.重复
现在,让我们来看看实际情况。
构建我们的遗传算法
虽然我们 GA 的每个部分都是从头开始构建的,但我们将使用一些标准包来简化工作:
import numpy as np, random, operator, pandas as pd, matplotlib.pyplot as plt
创建两个类:城市和健身
我们首先创建一个City
类,它将允许我们创建和处理我们的城市。这些只是我们的(x,y)坐标。在 City 类中,我们在第 6 行添加了一个distance
计算(利用毕达哥拉斯定理),并在第 12 行使用__repr__
以更简洁的方式输出城市坐标。
我们还将创建一个Fitness
类。在我们的例子中,我们将适应度视为路径距离的倒数。我们希望最小化路线距离,因此较大的适应值更好。基于规则#2,我们需要在相同的地方开始和结束,所以这个额外的计算在距离计算的第 13 行中被考虑。
创造人口
我们现在可以制造我们的初始种群(又名第一代)。为此,我们需要创建一个函数来生成满足我们条件的路线(注意:我们将在教程的最后实际运行 GA 时创建我们的城市列表)。为了创建个人,我们随机选择访问每个城市的顺序:
这产生了一个个体,但我们需要一个完整的群体,所以让我们在下一个函数中这样做。这就像循环执行createRoute
函数一样简单,直到我们为我们的人口找到尽可能多的路线。
注意:我们只需使用这些函数来创建初始群体。后代将通过育种和突变产生。
确定适合度
接下来,进化的乐趣开始了。为了模拟我们的“适者生存”,我们可以利用Fitness
对种群中的每个个体进行排名。我们的输出将是一个有序的列表,其中包含路线 id 和每个相关的健身分数。
选择交配池
对于如何选择将用于创建下一代的父代,有几个选项。最常见的方法是健身比例选择(又名“轮盘选择”)或锦标赛选择:
- 适应度比例选择(下面实现的版本):每个个体相对于群体的适应度用于分配选择的概率。把这想象成被选中的适应度加权概率。
- 锦标赛选择:从群体中随机选择一定数量的个体,选择群体中适应性最高的个体作为第一个父母。如此反复选择第二个亲本。
另一个需要考虑的设计特点是使用精英主义。在精英主义下,群体中表现最好的个体将自动延续到下一代,确保最成功的个体得以延续。
为了清楚起见,我们将分两步创建交配池。首先,我们将使用来自rankRoutes
的输出来确定在我们的selection
函数中选择哪些路线。在第 3–5 行,我们通过计算每个人的相对健康体重来设置轮盘赌。在第 9 行,我们比较随机抽取的数字和这些重量来选择我们的交配池。我们还想保留我们的最佳路线,所以我们在第 7 行引入了精英主义。最终,selection
函数返回一个路由 id 列表,我们可以用它在matingPool
函数中创建交配池。
现在我们已经从selection
函数中获得了将组成我们的交配池的路由的 id,我们可以创建交配池了。我们只是从我们的人口中挑选出一些人。
类型
随着交配池的建立,我们可以在一个叫做杂交(又名“繁殖”)的过程中创造下一代。如果我们的个体是由 0 和 1 组成的字符串,而我们的两个规则不适用(例如,假设我们正在决定是否将一支股票纳入投资组合),我们可以简单地选择一个交叉点,然后将这两个字符串拼接在一起,产生一个后代。
然而,TSP 是独一无二的,因为我们需要一次包含所有的位置。为了遵守这个规则,我们可以使用一个叫做有序交叉的特殊繁殖函数。在有序交叉中,我们随机选择第一个父字符串的一个子集(见下面的breed
函数中的第 12 行),然后用来自第二个父字符串的基因按照它们出现的顺序填充路径的剩余部分,而不复制来自第一个父字符串的所选子集中的任何基因(见下面的breed
函数中的第 15 行)。
Illustration of ordered crossover (credit: Lee Jacobson)
接下来,我们将对此进行归纳,以创建我们的后代种群。在第 5 行中,我们使用精英主义来保留当前群体中的最佳路线。然后,在第 8 行,我们使用breed
函数来填充下一代的剩余部分。
使突变
变异在遗传算法中起着重要的作用,因为它通过引入允许我们探索解空间的其他部分的新路径来帮助避免局部收敛。类似于交叉,TSP 在涉及到变异时有一个特殊的考虑。同样,如果我们有一条 0 和 1 的染色体,突变就意味着基因从 0 变为 1 的概率很低,反之亦然(继续前面的例子,包含在后代投资组合中的股票现在被排除在外)。
但是,既然需要遵守我们的规则,就不能掉城。相反,我们将使用交换突变。这意味着,在指定的低概率下,两个城市将在我们的路线上交换位置。我们将在我们的mutate
函数中为一个人这样做:
接下来,我们可以扩展mutate
函数来运行新的人口。
重复
我们快到了。让我们将这些片段组合在一起,创建一个产生新一代的函数。首先,我们使用rankRoutes
对当前代中的路线进行排序。然后,我们通过运行selection
函数来确定我们的潜在父母,这允许我们使用matingPool
函数来创建交配池。最后,我们使用breedPopulation
函数创建新的一代,然后使用mutatePopulation
函数应用变异。
运动中的进化
我们终于拥有了创建 GA 的所有要素!我们所要做的就是创建初始种群,然后我们可以根据需要进行多次循环。当然,我们还希望看到最佳路线以及我们改进了多少,因此我们在第 3 行获取初始距离(记住,距离是适应度的倒数),在第 8 行获取最终距离,在第 9 行获取最佳路线。
运行遗传算法
一切就绪后,解决 TSP 就像两步一样简单:
首先,我们需要一个旅行城市的列表。对于这个演示,我们将创建一个 25 个随机城市的列表(看起来城市数量很少,但是蛮力将不得不测试 300 多条 sextillion 路线!):
然后,运行遗传算法就是一行简单的代码。这是艺术与科学相遇的地方;你应该看看哪些假设最适合你。在这个例子中,我们每一代有 100 个个体,保留 20 个精英个体,对给定的基因使用 1%的突变率,并运行 500 代:
额外功能:绘制改进图
知道我们的开始和结束距离以及建议的路线是很好的,但如果我们没有看到我们的距离是如何随着时间的推移而改善的,那将是我们的失职。通过对我们的geneticAlgorithm
函数的简单调整,我们可以将每一代的最短距离存储在一个progress
列表中,然后绘制结果。
以与之前相同的方式运行 GA,但现在使用新创建的geneticAlgorithmPlot
函数:
Sample output from the geneticAlgorithmPlot function
结论
我希望这是学习如何构建自己的 GA 的一种有趣的实践方式。自己试试,看看你能找到多短的路线。或者更进一步,尝试在另一个问题集上实现 GA;看看如何改变breed
和mutate
函数来处理其他类型的染色体。我们只是触及了表面!
结束注释
你可以在这里找到一个合并的笔记本。
参考文献:
- http://www . the projectspot . com/tutorial-post/applying-a-genetic-algorithm-to-traveling-salesman-problem/5
- https://gist.github.com/turbofart/3428880
- https://gist . github . com/nicolle Louis/d4f 88 D5 BD 566298d 4279 BCB 69934 f 51d
- https://en.wikipedia.org/wiki/Travelling_salesman_problem
对科学家和研究主题的关注的演变
科学奖项影响力的数据科学研究
为了了解公众对科学和科学家的关注如何演变,对描述科学家和研究主题的维基百科页面进行了一项研究,以了解人们如何感知、更新和访问这些内容。
特别是,比较了获得某种奖项或奖励(诺贝尔奖、图灵奖等等)的科学家和没有获得任何奖励的科学家之间的注意力(尽管他们贡献了一个关键的科学进步)。
显然,一个奖项的存在对科学家的受欢迎程度和受关注程度有着深远的影响。获奖科学家的文章在可见性和更新方面也增长得更快,即使是在获奖多年之后。
令人难以置信的是,这些奖项并没有增加相应科学主题的知名度和关注度,如下所示:
另一个有趣的问题是,主题文章是在科学家的页面创建之前还是之后创建的。对于获奖科学家,维基百科上 27%的研究主题页面是在科学家页面创建之后创建的,而只有 10%的研究主题是在未获奖科学家之后创建的,如下所示:
这项研究已经在阿姆斯特达姆举行的 2018 年网络科学大会上发表,作者是 Claudia Wagner ,Olga Zagovora,Tatiana Sennikova,Fariba 卡利米(德国科布伦茨-兰道大学社会科学学院)。
完整的文章可以在这里找到。
游戏分析的平台演变
viSource: https://pixabay.com/en/joystick-controller-game-play-38228/
自从 Dreamcast 和调制解调器适配器发布以来,游戏开发商已经能够收集玩家在野外的行为数据。游戏分析实际上可以追溯到 1999 年发布的 EverQuest 等早期在线电脑游戏。游戏服务器对于认证用户和群体游戏世界是必要的,但也提供了记录游戏数据的能力。
自 1999 年以来,收集和分析数据的环境发生了显著变化。现代系统可以跟踪活动并近乎实时地应用机器学习,而不是通过日志文件在本地存储数据。以下是我在游戏行业任职期间注意到的游戏分析系统的四个阶段:
- **平面文件:**数据保存在游戏服务器本地
- **数据库:**数据存放在平面文件中,然后加载到数据库中
- **数据湖:**数据存储在 Hadoop/S3 中,然后加载到数据库中
- **无服务器:**托管服务用于存储和查询
这一演变中的每一步都支持收集更大的数据集,并减少了从收集数据到执行分析的延迟。在本文中,我将介绍每个时代的示例系统,并讨论每种方法的优缺点。
游戏分析真正开始获得动力是在 2009 年左右。在 Bioware,Georg Zoeller 建立了一个在开发过程中收集游戏遥测数据的系统。他在 GDC 2010 上展示了该系统:
由于已达到此帐户允许的最大用户数,您已从 GDC Vault 注销。要访问…
www.gdcvault.com](https://www.gdcvault.com/play/1012227/Development-Telemetry-in-Video-Games)
不久之后,艺电开始收集游戏开发后的数据,以跟踪玩家在野外的行为。
将分析应用于游戏遥测的学术兴趣也越来越大。该领域的研究人员,如 Ben Medler,建议使用游戏分析来个性化体验。
[## 一代又一代的游戏分析、成就和高分。用于…的日志
一代又一代的游戏分析、成就和高分
Medler |海达莫斯。为…一代游戏分析,成就和高 Scoreswww.eludamos.org 的日志](http://www.eludamos.org/eludamos/index.php/eludamos/article/view/vol3no2-4/127)
虽然在过去的二十年里,游戏性分析渠道有了总体的发展,但不同时代之间的进展并没有固定的时间表。一些游戏团队仍然在使用早期的系统,这可能是最适合他们用例的。也有许多供应商的解决方案可用于游戏分析,但我不会在这篇文章中涉及这些。我关注的是那些希望收集游戏遥测数据并拥有正在使用的数据管道的游戏团队。
平面文件时代
Components in a pre-database Analytics Architecture
我在 2010 年开始在艺电从事游戏分析,那时艺电还没有一个围绕数据建立的组织。虽然许多游戏公司已经收集了大量关于游戏的数据,但大多数遥测数据都以日志文件或其他平面文件格式的形式存储在游戏服务器上。没有什么是可以直接查询的,计算月活跃用户(MAU)等基本指标需要大量的工作。
在电子艺界,重播功能被内置到 Madden NFL 11 中,这提供了一个意想不到的游戏遥测源。每场比赛后,一份 XML 格式的比赛摘要被发送到一个游戏服务器,其中列出了每场比赛的叫牌、比赛过程中的走法以及比赛结果。这导致了数百万个文件可以被分析,以了解更多关于球员如何在野外与马登足球互动的信息。2010 年秋季我在艺电实习期间,我建立了一个回归模型,分析了哪些特征对留住玩家最有影响。
The impact of win rates on player retention in Madden NFL 11 based on preferred game mode.
大约在我开始在 EA 实习的十年前,索尼在线娱乐已经在使用游戏分析,通过存储在服务器上的日志文件收集游戏数据。直到几年后,这些数据集才被用于分析和建模,但它仍然是游戏分析的首批例子之一。包括 Dmitri Williams 和 Nick Yee 在内的研究人员基于对 EverQuest 系列的数据分析发表了论文。
在本地存储数据是目前为止收集游戏数据时最简单的方法。例如,我写了一篇关于使用 PHP 存储由无限马里奥生成的数据的教程。但是这种方法有明显的缺点。以下是这种方法的利弊概述:
优点 -简单:以你想要的任何格式保存你想要的任何数据
缺点 -无容错能力
-数据未存储在中央位置
-数据可用性存在巨大延迟
-没有用于分析的标准工具或生态系统
如果您只有几台服务器,平面文件可以很好地工作,但它不是真正的分析管道,除非您将文件移动到一个中心位置。在 EA,我编写了一个脚本,将 XML 文件从几十个服务器拉到一个服务器上,这个服务器解析这些文件并将游戏事件存储在 Postgres 数据库中。这意味着我们可以对 Madden 的游戏数据进行分析,但数据集是不完整的,并且有很大的延迟。这是下一个游戏分析时代的先驱。
这个时代使用的另一种方法是废弃网站来收集游戏数据进行分析。在我的研究生研究期间,我放弃了 TeamLiquid 和 GosuGamers 等网站,建立了一个专业的星际争霸重播集。然后,我为建立一个预测模型,以确定生产订单。这个时代的其他类型的分析项目包括废弃网站,如 WoW 军械库,以及最近的蒸汽间谍。
数据库时代
Components in an ETL-based Analytics Architecture
在一个中心位置收集游戏遥测数据的效用在 2010 年左右变得明显,许多游戏公司开始将游戏遥测数据保存在数据库中。许多不同的方法被用来将事件数据放入数据库供分析师使用。
当我在索尼在线娱乐公司时,我们让游戏服务器每隔几分钟就将事件文件保存到一个中央文件服务器。然后,文件服务器大约每小时运行一次 ETL 过程,将这些事件文件快速加载到我们的分析数据库中,该数据库当时是 Vertica。这个过程有一个合理的延迟,从游戏客户端发送事件到数据在我们的分析数据库中可查询大约一个小时。它还可以扩展到大量数据,但需要使用固定的事件数据模式。
当我还是一个 Twitch 时,我们对我们的一个分析数据库使用了类似的过程。与 SOE 的方法的主要区别是,我们没有将游戏服务器 scp 文件放在一个中心位置,而是使用 Amazon Kinesis 将事件从服务器流式传输到 S3 的一个集结地。然后,我们使用 ETL 过程将数据快速加载到 Redshift 中进行分析。从那时起,Twitch 转向了数据湖方法,以便扩展到更大的数据量,并为查询数据集提供更多选项。
SOE 和 Twitch 使用的数据库对两家公司都非常有价值,但我们在扩展存储的数据量时确实遇到了挑战。随着我们收集更多关于游戏的详细信息,我们不能再在表格中保存完整的事件历史,需要截断超过几个月的数据。如果您可以设置维护这些事件的最重要细节的汇总表,这很好,但是这不是理想的情况。
这种方法的一个问题是,临时服务器会成为故障的中心点。当一个游戏发送了太多的事件时,也有可能出现瓶颈,导致事件在所有游戏中被丢弃。另一个问题是当处理数据库的分析师数量增加时的查询性能。几个分析师组成的团队处理几个月的游戏数据可能会很好,但在收集了多年的数据并增加了分析师的数量后,查询性能可能会成为一个重大问题,导致一些查询需要几个小时才能完成。
优点 -所有数据都存储在一个地方,可以用 SQL 查询
-可用的好工具,如 Tableau 和 DataGrip
缺点 -将所有数据保存在 Vertica 或 Redshift
这样的数据库中成本很高-事件需要有固定的模式
-截断表可能是必要的
使用数据库作为游戏数据的主要接口的另一个问题是,Spark 的 MLlib 等机器学习工具无法有效使用,因为相关数据需要从数据库中卸载才能进行操作。克服这种限制的方法之一是以一种格式和存储层存储游戏数据,这种格式和存储层可以很好地与大数据工具配合使用,例如在 S3 上将事件保存为拼花文件。这种类型的配置在下一个时代变得更加普及,并且避开了截断表所需的限制,降低了保存所有数据的成本。
数据湖时代
Components in a Data Lake Analytics Architecture
当我在游戏行业的数据科学家那里工作时,最常见的数据存储模式是数据湖模式。一般模式是将半结构化数据存储在分布式数据库中,并运行 ETL 过程来提取与分析数据库最相关的数据。许多不同的工具可以用于分布式数据库:在电子艺界我们使用 Hadoop,在微软工作室我们使用 Cosmos,在 Twitch 我们使用 S3。
这种方法使团队能够扩展到海量数据,并提供额外的容错能力。它的主要缺点是引入了额外的复杂性,并且由于缺少工具或访问策略,可能导致分析师访问的数据比使用传统数据库方法时少。在这个模型中,大多数分析师会以同样的方式与数据交互,使用从数据湖 ETL 中填充的分析数据库。
这种方法的好处之一是它支持各种不同的事件模式,并且您可以在不影响分析数据库的情况下更改事件的属性。另一个优势是,分析团队可以使用 Spark SQL 等工具直接处理数据湖。然而,我工作过的大多数地方都限制了对数据湖的访问,消除了这种模式的许多好处。
优点 -扩展到海量数据
-支持灵活的事件模式
-昂贵的查询可以迁移到数据湖
缺点 -显著的运营开销
- ETL 过程可能会引入显著的延迟
-一些数据湖缺乏成熟的工具
数据湖方法的主要缺点是,通常需要整个团队来保持系统的运行。这对大型组织来说是有意义的,但对较小的公司来说可能有些矫枉过正。利用数据湖而不产生运营开销的方法之一是使用托管服务。
无服务器时代
Components in a managed Analytics Architecture (GCP)
在当前时代,游戏分析平台整合了许多托管服务,使团队能够接近实时地处理数据,根据需要扩展系统,并减少维护服务器的开销。我在游戏行业工作时从未经历过这个时代,但看到了这种转变正在发生的迹象。Riot Games 正在使用 Spark 进行 ETL 过程和机器学习,并且需要按需旋转基础设施。一些游戏团队正在为游戏服务使用弹性计算方法,利用这种方法进行分析也是有意义的。
在 GDC 2018 之后,我决定尝试构建一个样本管道。在我目前的工作中,我一直在使用谷歌云平台,它似乎有很好的工具来建立一个托管数据湖和查询环境。结果就是这个教程,它使用数据流来构建一个可扩展的管道。
优点 -与使用数据湖
相同的优势-基于存储和查询需求的自动缩放
-最小的运营开销
缺点 -托管服务可能很昂贵
-许多服务是特定于平台的,可能不可移植
在我的职业生涯中,我在使用数据库时代方法方面取得了最大的成功,因为它为分析团队提供了对所有相关数据的访问。然而,这不是一个可以继续扩展的设置,我工作过的大多数团队后来都转移到了数据湖环境。为了使数据湖环境取得成功,分析师团队需要访问底层数据,以及成熟的工具来支持他们的过程。如果我今天要构建一个管道,我肯定会从无服务器方法开始。
本·韦伯是意外收获数据的首席数据科学家,我们的任务是建立最准确和全面的净值模型。意外收获团队正在壮大,并正在招聘工程师和数据科学家。
“内核”的进化:团队的支柱
由于其以丰富的可能性改善我们生活的潜力,人工智能正在成为每个行业不可或缺的一部分。虽然,获得人工智能可能对一家公司来说很有吸引力;是 a)伟大的思想,b)发现,c)耐心和 d)完成任务的能力的结合使它成为现实。
在小队,我们正在变革在线分类广告和市场的内容审核。我们帮助在批准最近上传到网站的用户生成的列表和保持列表质量的高标准之间取得平衡。目前,我们的客户在不牺牲质量的情况下体验到了极高的效率,节省了高达 70%的成本。
除了我们的产品,我们使用人工智能来自动化我们客户的大部分工作,这进一步降低了成本,并将交付质量大幅提高到一个新的水平。
内容审核问题通常涉及高度主观的判断,这需要一个思维过程,我们的人力受过良好的训练,而机器可能不会产生自信的判断。正如我们的首席执行官 Apurv Agarwal ,“我们本质上并没有解决那些可以通过机器学习直接解决的问题”。
可以说,为了解决艰巨的自动化任务,我们需要人在回路中,帮助稳健地训练机器学习算法。
第一个大挑战
当我们收到为我们的一个客户自动执行内容审核任务的第一个挑战时,该客户恰好是美国前 5 大 C2C 市场之一,像任何其他机器学习团队一样,我们开始进行探索性数据分析,了解重叠的类并识别独特的类,可视化不同的簇并探索随时可用的工具和方法,这些工具和方法可用于解决涉及文本和图像分类的复杂问题。
我们在最先进的深度学习架构和迁移学习上使用预先训练的模型进行了初步实验,认为我们希望为我们的 C2C 客户端自动化的大多数类已经存在于 imagenet 对象类中,令我们惊讶的是,所有模型的准确率都超过了 95%。早期实验的成功让我们很高兴,我们觉得我们已经完成了挑战,但有趣的是,它花了 6 个月的时间来真正解决端到端的问题。
最终,我们了解了探索阶段和生产环境之间的区别(在生产环境中,每个模型都必须 99%精确)。对于我们这样一个非常年轻的团队来说,在一个创业环境中工作,一切都必须从费米能级开始,有一系列的打击在等着我们。
自动化的马拉松
从一开始,在我们的数据科学家 Sanchit Aggarwal 的指导下,所有崭露头角的机器学习工程师都直接或间接地致力于不同内容审核用例的自动化,探索相关的 ML 算法,编写代码以进行快速实验,并根据我们的 C2C 巨头共享的指南持续分析和学习适当的模型。
我们训练了许多性能良好的基于图像和文本的模型,建立了一个像样的训练和测试结构,并不断探索其他改进方法,如跳格法、单词嵌入、一类学习、GMMs 等。
Figure 1: Devil’s in the tail: Large number of categories with mostly small data for various classes in long tail distribution.
我们还深入了解了数据集分布不均匀、类重叠的问题,以及模型和工作流集合的需求。当期望是 99.5%的精确度和召回率时,另一个挑战是挑选高质量的训练数据,以从关于目标标签严重重叠的真实世界列表中获得高度自动化。
Figure 2: Tensorboard Visualisations for RESNET features for various classes (different colors) showing high magnitude of overlap.
一旦我们收集了所需的数据集,我们就可以连续成功地从实验中获得结果,并且越来越接近与客户达成一致的 SLA 数字。
我们都对我们采用的机器学习实践感到非常兴奋,并享受着处理大量机器学习算法来解决复杂问题的新鲜感。在几个月的专门实验中,我们有了许多模型,它们可以部署在生产环境中,并用于进行实时质量检查。但是我们的团队没有预料到一个非常重要的桥梁,在我们跨越为客户列表的内容审核做出高质量实时预测的里程碑之前,需要建立这个桥梁。
Table 1: Evaluation of some of our generic models.
内核的进化
在尝试了各种聚类方法、数据清理技术、数据扩充、监督和非监督算法(如 SMOTE、KM-SVM)之后,我们意识到我们总是可以改进我们的模型,而且没有停止的标准。但是,为了给企业带来真正的价值,我们还需要一个稳定、强大的基础设施。
这是我们开始深入研究可用基础设施的时候。我们开始探索模型版本控制和预测系统的可用工具,如厚皮动物、火花、数据版本控制、 HDFS 等等。所有这些系统都非常复杂,需要进行大量的修改才能与我们现有的人在回路框架集成。我们意识到,开发自己的内部系统,内核,来处理实时预测会更快更容易。这时,我们感觉到团队内部需要更多的工程带宽。我们请来了 Ketan Bhatt,用他的精力和经验为 SquadAI 创建一个强大的基础设施。
在 Squad,我们遵循求解团队的概念。
在我们新的 solver 团队基础设施中,我们中很少有人开始专注于机器学习来学习高精度模型,而其他人则探索基础设施主干所需的数据库设计和架构,内核。我们一步一步地计划和解决每个问题,采用集中的方法和适量的协作,以 1%的自动化和 99%的精确度开始。下面的图表显示了复杂 C2C 用例的自动化水平稳步提高。
Figure 3: Graph showing continuous improvement over time for automating content moderation for our C2C client after we had created the bridge, Kernel.
我们不断改进最新的最先进的方法、微调模型、深度学习优化、文本分类中的 CNN、定义的可扩展流程和基础设施,以实现 AI + HI 工作流 50%自动化的目标,而不会影响判断的精确度。
为了更深入地理解我们自动化框架的技术方面, SquadAI 及其骨干 内核、 请参考我们的博客- SquadAI:用于构建、管理和评估机器学习工作流的众包驱动平台
非常感谢所有参与构建内核的 ML 工程师: Aniket Bhatnagar 、 Medha Katehar a、 Pragya Jaiswal 和 Priyank Jain 。
目标检测和定位算法的发展
通过对基本概念的直观解释,理解对象检测和定位的最新进展。
目标检测是计算机视觉中发展非常迅速的领域之一。感谢深度学习!每年都有新的算法/模型不断超越以前的算法/模型。事实上,脸书人工智能团队上周刚刚发布了一个最新的物体探测软件系统。这款软件名为 Detectron ,整合了众多针对物体检测的研究项目,由 Caffe2 深度学习框架提供支持。
今天,有太多的预训练模型用于物体检测(YOLO,RCNN,快速 RCNN,掩模 RCNN,多框等)。).因此,只需要很少的努力就可以检测出视频或图像中的大多数对象。但是我博客的目的不是谈论这些模型的实现。相反,我试图以一种清晰和简洁的方式解释基本概念。
我最近完成了吴恩达的 卷积神经网络课程的第三周,他在课程中讲述了物体检测算法。这个博客的大部分内容都是受那门课的启发。
**编辑:**我目前在做 Fast.ai 的《程序员前沿深度学习》课程,老师是杰瑞米·霍华德。现在,我已经使用 PyTorch 和 fast.ai 库实现了下面讨论的算法。这里是链接到代码。如果你想了解下面讨论的算法的实现部分,可以看看这个。实现已借用 fast.ai 课程笔记本,有注释和笔记。
CNN 简介
在我解释对象检测算法的工作原理之前,我想花一些时间介绍卷积神经网络,也称为 CNN 或 ConvNets。在深度学习时代,细胞神经网络是大多数计算机视觉任务的基本构建模块。
Fig. 1. Convolution demo in Excel
**我们想要什么?**我们想要某种算法,它查看图像,看到图像中的模式,并告诉图像中有什么类型的对象。例如,是猫或狗的图像。
什么是计算机的图像?只是数字矩阵。例如,参见上面的图 1。左边的图像只是手写数字 2 的 28*28 像素图像(取自 MNIST 数据),在 Excel 电子表格中表示为数字矩阵。
**我们怎样才能教会计算机学会识别图像中的物体?**通过让计算机学习像垂直边缘、水平边缘、圆形以及许多其他人类未知的模式。
**计算机如何学习模式?**回旋!
(看这个的时候看上图)卷积是两个矩阵之间给出第三个矩阵的数学运算。较小的矩阵,我们称之为过滤器或内核(图 1 中的 3x3 ),对图像像素矩阵进行操作。根据滤波器矩阵中的数字,输出矩阵可以识别输入图像中存在的特定模式。在上面的例子中,滤波器是垂直边缘检测器,它学习输入图像中的垂直边缘。在深度学习的背景下,输入图像及其随后的输出从许多这样的过滤器中通过。滤波器中的数字由神经网络学习,而模式则自行产生。
**为什么卷积有效?**因为在大多数图像中,对象在相对像素密度(数量级)上具有一致性,这可以被卷积利用。
我知道对于一个不了解 CNN 的读者来说,CNN 上只有几行字是不够的。但是 CNN 并不是这篇博客的主要话题,我已经提供了基本的介绍,所以读者在继续阅读之前不必再打开 10 个链接来理解 CNN。
看完这篇博客后,如果你还想了解更多关于 CNN 的信息,我强烈建议你阅读亚当·盖特吉的博客。
计算机视觉任务的分类
Fig. 2: Common computer vision tasks
以图 2 中的猫和狗图像为例,以下是计算机视觉建模算法完成的最常见任务:
- **图像分类:**这是最常见的计算机视觉问题,算法查看图像并对其中的对象进行分类。图像分类具有广泛的应用,从社交网络上的人脸检测到医学中的癌症检测。这种问题通常使用卷积神经网络(CNN)来建模。
- **物体分类与定位:**假设我们不仅想知道图像中是否有猫,还想知道猫的确切位置。目标定位算法不仅标记目标的类别,而且在图像中围绕目标的位置画出一个包围盒。
- **多目标检测和定位:**如果图像中有多个目标(如上图中的 3 只狗和 2 只猫)并且我们想检测它们,该怎么办?这将是一个目标检测和定位问题。这一点的一个众所周知的应用是在自动驾驶汽车中,其中该算法不仅需要检测汽车,还需要检测行人、摩托车、树木和帧中的其他物体。这类问题需要利用从图像分类和目标定位中学到的思想或概念。
现在回到计算机视觉任务。在深度学习的背景下,上述 3 种类型的任务之间的基本算法差异只是选择相关的输入和输出。让我用一个信息图来详细解释一下这条线。
1。图像分类
Fig. 3: Steps for image classification using CNN
图 3 中的信息图显示了用于图像分类的典型 CNN 的样子。
**1。**通过 n 个滤波器(图 3 中 n = 4)对具有一定高度、宽度和通道深度(上例中为 940、550、3)的输入图像进行卷积【如果您仍然不清楚卷积的确切含义,请查看此链接以了解深度神经网络中的卷积】。
**2。**卷积的输出用非线性变换处理,通常是最大池和 RELU。
**3。**卷积、最大池和 RELU 的上述 3 个操作被执行多次。
**4。**最终层的输出被发送到 Softmax 层,soft max 层将数字在 0 和 1 之间转换,给出图像属于特定类别的概率。我们使损失最小化,以便使最后一层的预测尽可能接近实际值。
2。物体分类和定位
Fig. 4: Input and output for object localization problems
现在,为了让我们的模型绘制对象的边界框,我们只需改变前面算法的输出标签,以便让我们的模型学习对象的类别以及对象在图像中的位置。我们在输出层增加了 4 个数字,包括物体的质心位置和图像中边界框的宽度和高度的比例。
简单吧?只需要加上一堆输出单位就可以吐槽出你要识别的不同位置的 x,y 坐标。这些不同的位置或标志对于我们所有的图像中的特定对象来说是一致的。例如,对于汽车,与图像中的其他点相比,高度将小于宽度,并且质心将具有特定的像素密度。
同样的逻辑,如果图像中有多个物体,我们想对它们进行分类和定位,你认为会发生什么变化?我建议你此刻停下来思考一下,你可能会自己找到答案。
3。多目标检测和定位
Fig. 5: Input and output for object detection and localization problems
为了检测图像中的各种对象,我们可以直接使用我们迄今为止从对象定位中学到的知识。不同之处在于,我们希望我们的算法能够对图像中的所有对象进行分类和定位,而不仅仅是一个对象。因此,这个想法是,只需将图像裁剪成多个图像,并对所有裁剪的图像运行 CNN 来检测对象。
算法的工作方式如下:
**1。**制作一个尺寸远小于实际图像尺寸的窗口。裁剪它并将其传递给 ConvNet (CNN)并让 ConvNet 进行预测。
**2。**继续滑动窗口,将裁剪后的图像传入 ConvNet。
**3。**在用该窗口尺寸裁剪完图像的所有部分后,再次重复所有步骤以获得更大的窗口尺寸。再次将裁剪后的图像传入 ConvNet,让它进行预测。
**4。**最后,你将得到一组裁剪区域,其中包含一些对象,以及对象的类和边界框。
这种解决方案被称为滑动窗口对象检测。这是一个非常基本的解决方案,有如下许多注意事项:
**答:计算量很大:**裁剪多幅图像并通过 ConvNet 传输,计算量非常大。
**解决方案:**有一个简单的 hack 来提高滑动窗口法的计算能力。它是用 1x1 卷积层替换 ConvNet 中的全连接层,并且对于给定的窗口大小,仅传递输入图像一次。因此,在实际实现中,我们并不是一次传递一个裁剪后的图像,而是一次传递完整的图像。
**B .不准确的边界框:**我们在整个图像上滑动正方形的窗口,可能对象是矩形的,也可能没有一个正方形与对象的实际大小完全匹配。虽然这种算法能够在一幅图像中找到并定位多个目标,但是包围盒的精度仍然很差。
Fig. 6. Bounding boxes from sliding window CNN
我已经谈到了对象检测问题的最基本的解决方案。但是它有许多注意事项,不是最准确的,并且实现起来计算量很大。那么,如何才能让我们的算法更好更快呢?
更好的解决方案?YOLO
原来我们有 YOLO(你只看一次),它比滑动窗口算法更准确,更快。它仅仅是基于我们已经知道的算法之上的一个小调整。这个想法是将图像分成多个网格。然后,我们更改数据的标签,以便为每个网格单元实现定位和分类算法。让我再用一个信息图来解释一下。
Fig. 7. Bounding boxes, input and output for YOLO
YOLO 轻松地说道:
**1。**将图像分成多个网格。为了便于说明,我在上图中画了 4x4 的网格,但是 YOLO 的实际实现有不同数量的网格。(7x7 用于在 PASCAL VOC 数据集上训练 YOLO)
**2。*标注训练数据,如上图所示。如果 C 是数据中唯一对象的数量,SS 是我们将图像分割成的网格数量,那么我们的输出向量的长度将是 SS(C+5)。例如,在上述情况下,我们的目标向量是 44(3+5),因为我们将图像划分为 4*4 的网格,并针对 3 个独特的对象进行训练:汽车、灯光和行人。
3。制作一个深度卷积神经网络,损失函数作为输出激活和标签向量之间的误差。基本上,该模型只需将输入图像通过 ConvNet 向前传递一次,即可预测所有网格的输出。
**4。**请记住,网格单元中存在的对象标签(P.Object)是由该网格中存在的对象质心决定的。这对于不允许一个对象在不同的网格中被多次计数很重要。
YOLO 的注意事项及其解决方案:
**A .无法检测同一网格中的多个对象。**这个问题可以通过选择较小的网格尺寸来解决。但是,即使选择较小的网格尺寸,该算法在物体彼此非常接近的情况下仍然会失败,例如一群鸟的图像。
**解决方案:锚箱。**除了每个网格单元有 5+C 个标签(其中 C 是不同对象的数量)之外,锚定框的想法是每个网格单元有(5+C)*A 个标签,其中 A 是必需的锚定框。如果一个对象被分配给一个网格中的一个锚定框,其他对象可以被分配给同一网格的另一个锚定框。
Fig. 8. YOLO with anchor boxes
B .多次检测一个物体的可能性。
解: **非 max 抑。**非最大值抑制移除与高概率边界框非常接近的低概率边界框。
结论:
截至今天,在不同的深度学习框架中有多个版本的预训练 YOLO 模型可用,包括 Tensorflow 。最新的 YOLO 论文是:《yolo 9000:更好更快更强》。该模型在 9000 个类上进行训练。还有一些基于选择性区域提议的区域 CNN (R-CNN)算法,我没有讨论过。由脸书 AI 开发的软件系统 Detectron 也实现了 R-CNN 的变体,屏蔽 R-CNN。
参考资料:
-
【https://arxiv.org/pdf/1506.02640.pdf】你只看一次:统一的、实时的物体检测
-
更好、更快、更强
https://arxiv.org/pdf/1612.08242.pdf -
吴恩达的卷积神经网络(deep learning . ai) https://www . coursera . org/learn/卷积神经网络
Spark 分析的发展
Apache Spark 是一个开源、可扩展、大规模并行的内存执行环境,用于运行分析应用程序。
数据科学家主要负责构建预测分析模型和构建洞察力。他将分析数据工程师使用机器学习工具(如沃森机器学习)编目和准备的数据。他将使用 Jupyter 笔记本电脑构建应用程序,RStudio
在数据科学家分享他的分析结果后,应用程序开发人员可以像认知聊天机器人一样构建应用程序。随着聊天机器人与客户互动,它将不断完善自己的知识,并帮助发现新的见解。
让我们站在数据科学家的角度,看看作为一名数据科学家,我想做些什么:
- 我想运行我的分析工作,我想运行社交媒体分析或文本分析
- 我想按需运行查询
- 我想在 Spark 上运行 R,Python 脚本
- 我想提交 Spark 作业
- 我想查看我的应用程序的历史服务器日志,以便比较我的作业性能并进一步改进
- 我想为我的调试查看守护进程日志
- 我想写笔记本
现在你知道我想做什么,现在让我们看看我一直在做什么来实现我真正想做的事情。几年前,如果我需要做同样的事情,我通常会这样做
我自己的裸机上的 Spark Analytics
如果我需要在我自己的机器上运行 Spark,我需要首先**获得硬件。**一旦我有了合适的可用硬件,我需要准备好它,以便安装 Spark 和我的其他分析产品。我需要做很多工作来让硬件为运行我的 Spark 工作负载做好准备。如果你有兴趣知道在裸机上设置你自己的 Spark 运行时会遇到哪些挑战,请参考我的另一个博客。以下是其中的几个。
- 设置网络 : Spark 是一个集群软件,所以我需要多台机器来运行我的 Spark 作业。为了在这些机器之间建立网络,我需要在它们之间设置正确的线路,我需要配置网络接口以便它们被适当地调整。
- 安装盘:一旦联网完成,我就可以访问那些机器了,我需要格式化这些盘,给它们贴上正确的标签,配置它们,使它们在重启时不会被破坏。我需要设置 raid 控制器,创建分区,为所有磁盘创建挂载点,并正确配置它们
- 维护:安装火花簇是容易的部分,维护起来比较困难。我将需要应用常规的操作系统补丁,监视磁盘错误并在需要时替换它们,我已经花费了许多资源来维护 Spark 集群
- 监视器:我需要确保我的集群中的各种组件都是健康的,并且需要安装和配置一些监视解决方案来监视故障并通知我
- **扩展:**我将需要添加更多的机器,并重复相同的过程在我现有的集群中添加新的节点。
- 合规:因为我是大企业的一部分,我需要确保我的分析管道中的所有组件都符合某些合规标准,如 ISO270001 等。
在我自己的虚拟机上激发分析
现在,我已经到了这样一个阶段,在我的组织中,运行分析工作的要求越来越高,我不能花费太多的时间和资源在裸机上设置 Spark 集群,我需要一种可以根据需要轻松快速扩展的产品。
为了满足不断增长的工作负载需求,我将寻求虚拟化解决方案。这当然会帮助我获得重复能力,但我仍然需要注意很多事情,如
- 维护
- 安全
- 监视器
- 升级
- 刻度
- 高可用性
对托管公共云产品进行 Spark 分析
许多云提供商,如 Google、IBM、Microsoft 和 Amazon,正在提供许多服务,这些服务将 Spark 运行时作为托管产品。
请参考以下大数据领域中流行的云服务的文档链接
- 亚马逊电子病历
- IBM 分析引擎
- 微软 Azure HDInsight
- 谷歌云 Dataproc
我可以从这些云提供商那里请求一个 Spark 实例,它为我解决了许多难题。比如说。我不需要担心购买硬件、准备机器、设置网络、安装和维护活动。
所有繁重的工作都由云提供商负责,但在这种情况下,我需要负责以下工作
- **配置:**许多云提供商提供的集群都带有基本配置,我需要对它们进行调整以适应我的需求。
- 定制:我需要安装运行我的作业所需的库,这可能需要几个小时才能完成。
- 为闲置时间付费:使用托管服务的一个主要问题是成本。我并没有一直使用这些集群,但是我为资源付费,即使它们没有运行任何东西。
托管云产品对于运行批处理、流和其他生产场景有其明确定义的用例。
无服务器火花
作为一名数据科学家,我真正想做的是运行分析工作。我对购买、准备机器、建立 Spark 集群和维护它们并不感兴趣。
同时,如果我不使用这些资源,我也不想为它们付费。
我也不想为了 Spark 集群出现在流行的云产品中而等待很长时间(甚至几分钟)。
作为一名数据科学家,我真正想要的是什么?
—无服务器 Spark 运行时
根据 Wikipedia "的说法,无服务器计算是一种云计算执行模型,其中云提供商充当服务器,动态管理机器资源的分配。定价基于应用程序消耗的实际资源量,而不是预先购买的容量单位”
我有哪些选择可以尝试无服务器 Spark?
Qubole 做了一件了不起的工作,让 Spark 在 AWS lamda 函数上运行。如果你对更多细节感兴趣,这里是博客。许多云提供商正在提供服务,该服务提供一个平台,允许客户开发、运行和管理应用程序功能,而无需构建和维护复杂的基础设施。
但是这种采用无服务器 Spark 的方法存在一些挑战
对于功能即服务,我没有得到火花簇,我只得到执行者
我也得不到和以前一样的体验。这里缺少历史服务器日志和监控工具。
如果我想选择这个选项,我还需要考虑以下一些因素。
无法直接通信: Spark 使用 DAG 执行框架产生多阶段作业。对于级间通信,Spark 需要跨执行器进行数据传输。许多功能即服务不允许两个功能之间的通信。这给在这种环境下运行执行器带来了挑战。
**极其有限的运行时资源:**目前很多函数调用都被限制在最大执行时长 5 分钟,1536 MB 内存和 512 MB 磁盘空间。Spark 喜欢内存,可以占用大量磁盘空间,并且可以产生长时间运行的任务。这使得函数成为运行 Spark 的困难环境。
其他新选项?—星火环境
IBM 宣布 Spark 环境将在 IBM Watson Studio 中正式发布!
Spark 环境定义硬件和软件配置,按需启动定制 Spark 集群。Spark 环境可以针对资源快速扩大或缩小规模。这使得它们非常适合各种用例,从在样本数据集上尝试新的机器学习算法到在分布式计算引擎上运行大型生产工作负载。Spark 环境可以与工具一起使用,如笔记本、模型构建器,或 沃森工作室 中的流编辑器。
对于每个 Spark 环境,我都有一个专用的 Spark 集群和专用的资源,这保证了我的应用程序在每次执行时都能在同一时间完成。
Spark 环境提供了许多好处:
- Spark kernel on-demand—节省时间和精力,专注于您的分析;在 Watson Studio 中创建一个 Spark 环境,并直接启动到笔记本中。
- 可配置的弹性计算 —配置您的 Spark 环境,并从 Watson Studio 中选择您的内核硬件配置。
- 轻松共享您的环境— Spark 环境是项目资产,因此您的合作者可以轻松使用它们。
- 多语言支持——为您的 Spark 内核选择最流行的语言(Python 2、Python 3、R、Scala)。
Spark 环境正在提供一些特性,这些特性为我提供了我已经习惯的使用 Spark 的相同体验。IBM 正在添加许多令人兴奋的新功能,如定制软件包管理的软件定制,以及对 Spark 历史服务器和 Spark 应用程序 UI 的访问,这将使我的体验更好。
如果你想尝试 Spark 环境,请阅读这篇公告博客文章
摘要
Apache Spark 是数据科学家的一个基本工具,为从大规模数据转换到分析到机器学习的各种应用程序提供了一个强大的平台。
从在裸机上部署它到在容器上运行它,再到提供其 as 无服务器产品,它已经发展了很多,这在易用性、成本方面为其用户提供了好处,并且仍然提供与他们正在使用的 Spark 相同的使用体验。
试用 IBM 的 Spark environments ,在试用该功能后,请在下面的评论或推文中给出您对本文的反馈 Rachit Arora
随机森林在金融中的应用实例:期权定价
今天,【2018 年 9 月 9 日下午 1.56,在埃隆·马斯克被发现在电视直播中吸烟后,特斯拉的股票价值 263.24 美元。
假设我预计接下来几天还会有埃隆马斯克的丑闻。
我预见到上述股票价格的下跌,所以我给你提供一个购买的选择,在任何时候,一个月内,每股 264 美元。万一我错了,股价上涨超过 264 美元,你就可以在市场上买卖你的股票并赚钱!
但是,如果特斯拉股票不断减少,你将永远不会行使你的期权,我会积极的,感谢你为这个期权支付的溢价。
问题,你愿意为这样的期权支付多少钱?当我在这个选项中加入其他股票时会发生什么?
期权定价
这就是所谓的期权定价理论,自 1973 年 Black 和 Scholes 模型首次出现以来,这是文献中一个众所周知的主题。
上述期权被称为美式期权(实际上是百慕大期权,即你只能在 T2 时间{T0,T1,…其中 T 是到期日或期权到期日)。
常见的方法,特别是在银行中应用的方法,回忆动态规划和 Longstaff Schwartz 算法来解决这个问题。
直觉上,你可以把它想成一个逆向过程,你在 T 点的期权收益是
其中 X_T 是特斯拉到期时的股价。
动态编程完全是一个视角问题!
假设我们在一个月内只能行使两次期权(两周时间,用 2W 表示,一个月内,用 T=1M 表示)。
那么在时间 t=2W 时你只有两个选择:
- 你要么运动(如果 X(2W) > K)。然后,你将得到(X(2W)- K) 投资于一个自由风险账户,每天支付无风险利率 r ,并在时间 T = 1 M 时得到 ( 1 + r ) 4 ∗ ( x ( 2 w ) − k ) 投资于一个自由风险账户,每天支付无风险利率 r,并在时间 T=1M 时得到(1+r)⁴*(x(2w)-k) 投资于一个自由风险账户,每天支付无风险利率r,并在时间T=1M时得到(1+r)4∗(x(2w)−k) 14(账户每天支付的两周的指数),
- 或者你期望特斯拉份额在 T 点更高(你这个疯狂的傻瓜),因此增加你的期权价值(所以你会等到 T 点)。
设 Y 为该期权价值价格。你在直观地解下面的逆向方程,
上述方程没有封闭形式的公式,但我们可以在数值上提供近似值。
我们如何获得上述方程的近似值?
回归
假设我们知道特斯拉股票在 2W 的价格。
已知 t=2W 时的所有信息,我们唯一的未知数是未来期权价值(Y_T)。换句话说,如果你在两周内(即未来),你的投资组合的期望值是多少,由这一个美式期权组成。
这时回归就出现了。
你有 2W 的信息,你想预测 100 万英镑的期权价值。
输入/标签:t = 2W 时特斯拉股价的所有样本
输出【at t = T = 1M 时的选项值
正向模拟
事先,我们需要模拟特斯拉股价的多种情景。
Geometric Brownian Motion simulation applied on Tesla Share
为了简化模型,我们假设特斯拉股票遵循几何布朗运动路径,平均 r(无风险利率)和波动率适马= 20%(我们让感兴趣的读者参考随机过程理论)。
注意:1 个月的时间大约相当于 0.08 年的时间。因此在这张图上 T = 0.08,2W = 0.04。
数据可视化
在左边,我们画出了 T 时对特斯拉股价的回报(你可以在这里认出非线性的 max 函数,或者深度学习读者的 ReLu 激活函数),在右边,画出了 t=2W 时对特斯拉股价的回报。
Left : Payoff against Stock price at t=1M— — Right : Payoff against Stock price at t=2W
回归
存在多种回归方法,在准确性和时间方面表现良好,以解决这种预测问题。在一个维度上(即只有一只股票,这里是特斯拉),我们可以想到多项式回归(你可以查看比约恩·哈特曼关于此事的帖子),或者高斯核回归。
第一个会导致角点问题(见下文,在 240 之前,回归在拟合数据下开始),而第二个在计算上可能是昂贵的。
NB :如果上面的交互代码无法加载,我在下面添加了预期的输出(感谢 William Koehrsen ,他的文章“如何在一篇中等大小的文章中放置完全交互的、可运行的代码”)和 Jupyter 笔记本(使用 Vera Chernova 的建议)。
但是,你是一个真正的玩家!
你查看新闻,注意到大众和脸书的股票正在慢慢恢复过去的势头。
我阅读了我这边的新闻,决定值得冒险,并向你提供一个类似的美式期权,这次到期日为 1 年,可以行使 4 次,几何平均回报(即,当你行使时,如果你希望你的银行账户为正,你需要特斯拉 x FB x VW 立方根的乘积大于我们今天定义的罢工)。
- 如今,这一几何平均值将等于(263.24 x 158.97 x 165.94)^(1/3)~ 190.78 美元
- 让我们解决一个罢工 K = 191 美元(我们称之为货币期权,因为它几乎是今天的价格)。
在这种情况下,我们仍然可以利用多项式回归,但如果我们决定玩更多的份额,它就不是可伸缩的!
我们如何在高维空间(即多股)为期权定价?
我们叫一个朋友,随机森林!
我邀请你提前(为新人)阅读一下威廉·科尔森的这篇关于随机森林回归的杰出解释。
尽管在一维空间使用它听起来像使用核武器,但它显示了在解决高维情况时的高效性。
回到我们的一维模型(只有特斯拉份额),应用随机森林回归看起来像
它在精确地建模和预测(从图中),甚至可能太多(过度拟合)。
然而,使用一些方差减少方法(如 Picard 迭代),并调整随机森林超参数,我们可以与文献中提到的大多数方法竞争(例如 Gobet 的超立方体、 Glasserman 和 Broadie s’ Mesh ,…).
当将随机森林应用于相关资产或超过 20 项资产的期权时,这一发现更加真实。
结论
我们在这里展示了机器学习方法如何应用于历史金融问题,如期权定价,以及它如何用于处理巨大的投资组合。
NB :下面是上面模拟用的 Jupyter 笔记本。
我向感兴趣的读者推荐 我在 2017 年 6 月提交给新加坡国立大学(应用概率统计系)的理学硕士论文 ,其中我们重点比较了用于期权定价的多种行业方法,包括随机森林、核回归、Mesh、…
如何将数据科学应用于真实的业务问题
专注于电子商务和医疗保健
*抬头,如果您想跳过简介直接进入示例,请滚动至第一个标题
数据科学和统计学不是魔法。他们不会神奇地解决公司的所有问题。然而,它们是有用的工具,可以帮助公司做出更准确的决策,并自动化团队需要做出的重复性工作和选择。
当提到自然语言处理、图像识别和聊天机器人时,机器学习和数据科学被引用了很多。
然而,你也可以应用数据科学技术来帮助你的经理做出决策、预测未来收入、细分市场、制作更好的内容和更有效地诊断病人。
下面,我们将讨论一些统计和应用数据科学算法的案例,它们可以帮助您的企业和团队产生更准确的结果。
这不需要复杂的 hadoop 集群和云分析。不是说这些不神奇。只是,让我们先从基础开始!
在我们跳进技术和炒作的兔子洞之前!
我们将举例说明电子商务和医疗操作。
我们的团队主要专注于实践和应用数据科学。因此,我们深入到我们过去的经验中,向你展示一些很棒但很容易应用的方法,你可以在今天利用统计数据开始做出更好的决策。
下面的方法通常只是一个更大系统的一小部分。我们相信获取这些小的部分和细节是开始构建准确有效的系统所必需的。
这些统计方法中的一些甚至不需要大量的编程或专业技术知识。然而,如果正确实施,这些基本技术可以在更大的系统中以更大的规模应用。
我们这样做是因为我们知道实现一个算法需要很大的努力。
团队必须适当地计划他们将如何集成数据库、业务逻辑、算法和新策略,以确保项目成功。
这需要大量的资源和时间。
欺诈检测和贝叶斯定理
无论您是一家处理医疗、财产或车辆索赔的保险公司。保险欺诈是一个大问题。
他们是怎么解决的?保险提供商必须要么建立一个算法,要么让审计员人工检查,看看索赔是否是欺诈性的。
信不信由你,仍有为数众多的保险公司手动完成这项工作(在这种情况下,我们正在考虑从数据库中获取一个数据,并手动在 excel 中过滤)。
保险提供商将在审计方面投入大量精力。至少出于这两个原因:
- 把钱拿回来
- 试图阻止未来的保险欺诈索赔
这里的问题是,这会占用宝贵的资源时间,如果他们错误地识别索赔,可能会在工资和其他资源方面花费更多的钱,而不是从欺诈性索赔中收回的钱。
在本例中,一家名为 Itena 的保险提供商创建了一种算法来帮助提高他们团队处理索赔的速度。
那么 Itena 如何知道他们开发的算法是否值得呢?
好吧,如果你有一个数学定理来分析你的算法呢!
哇哦。那太“元”了。
就当这是一次信心检查,以后可以帮助他们计算是否值得在算法上投资
在这种情况下,他们将使用贝叶斯定理
Original Post https://xkcd.com/1236/
贝叶斯最擅长的是提供统计数据来证明他们所得到的信息有多准确。
他们能有多信任自己的算法?因为它们很可能同时具有假阳性和假阴性。他们的算法到底有多准确?
假设 Itena 的数据科学团队知道收到的索赔中有 2%是欺诈性的。
他们计算出,如果他们能够正确识别所有欺诈性索赔,他们可以节省 100 万美元!
哇哦。他们刚刚让你所有的主管都签字同意了!我的意思是,这是 100 万美元!即使公司净赚 1 亿美元。这是一次伟大的拯救
厉害!
因此,Itena 数据科学团队开发了一种算法来检测欺诈性索赔。
它并不完美,但它是一个很好的开始!
但是,它到底有多准确呢?当然,他们知道 85%被预测为欺诈的欺诈性声明实际上是欺诈性的?
作为优秀的数据科学家和普通科学家。他们也知道你必须检查错误。比如误报。
对他们来说,去找管理人员说这个测试有 85%的准确性是不正确的!在正常索赔栏中查找。
他们也有 4%的假阳性率。这是怎么回事?
这时他们引入了我们的老朋友贝叶斯定理。
贝叶斯定理对于测试他们应该信任测试的程度非常有用。
像医学测试一样,算法也可能出现假阳性。
就像一些医学检查可能会返回癌症的假阳性一样。无论你是否应该获得贷款,以及当你访问 Amazon.com 时是否应该获得折扣,算法都可能对欺诈性索赔返回误报。
我们知道数据科学团队可能会为公司节省 100 万美元。然而,他们也将花费 Itena 的资金和资源小时。因此,他们需要确保回报大于成本!
那么这个算法有多精确呢?
他们可能会惊讶地发现这实际上是多么不准确!
这是一个粗略的数学公式:
P(欺诈索赔)= 2%
P(明确标记为欺诈|真实欺诈索赔)= 85%
P(非欺诈)= 98%
P(标记欺诈索赔|真实非欺诈)= 4%
*P(欺诈索赔)P(明确标记为欺诈|真实欺诈索赔)/
*(P(欺诈索赔)P(明确标记为欺诈|真实欺诈索赔)+ P(标记为欺诈索赔|真实非欺诈)+P(非欺诈))
在这种情况下,只有大约 30%被预测为欺诈的预测索赔实际上是根据贝叶斯定理。
为什么?
这是因为只有 2%的索赔是欺诈性的。也就是说尽管算法有 85%的准确率。对于 2%的数据,它只有 85%的准确率。
它还错误地将 98%的数据中的 4%分类。
他们的假阴性数据比真阳性数据多得多。
当你真正坐下来思考这个问题的时候,这很有趣。
现在的问题是,他们能证明节省的合理性吗?公司调查所有的索赔要花多少钱?这个真的要看索赔额度了。
如果他们处理的是医疗索赔中的 7 美元加价,可能就没那么多了。
另一方面,如果是 1 万美元的车祸理赔,公司还是会想扑上去的!
幸运的是,我们有可以快速运行这些算法的计算机,并且有望建立一个令人惊讶的过程,快速允许索赔得到裁定。
如果计算机不在那里,我们确实想把它放在正确的位置上。
如果取而代之的是,你有同样的准确性,并且让一个人来执行这项任务。假设他们花费了价值 200 美元的资源来对一项索赔进行分析!
如果索赔价值 500 美元,是否值得花费时间?
用户购买你的产品的可能性有多大
预计 2017 年电子商务的交易额将超过 2 万亿美元。虽然很多人直接通过亚马逊或阿里巴巴,但也有很多其他网站试图让顾客购买他们的产品。
这涉及大量的跨平台营销、内容营销和广告。
公司如何知道他们的广告或他们推广的网站实际上是否有效?他们得到的印象和参与真的变成了真金白银吗?
你如何开始回答这些问题?
假设你的公司在线销售厨房设备。
你支付几个网站交叉推广你的产品和电子商务网站。你知道你从每个网站获得的平均购买率,因为你一直在努力跟踪 cookies 并保持一个干净的数据库。
你想知道你应该在未来的活动中投入多少资金。根据目前的数据,你知道每小时有 10 个人购买来自“站点 A”的产品。你相信只要你有超过 80%的机会保持至少每小时 6 的速度。你可以证明市场成本的合理性。
我们该如何解决这个问题?
嗯,我们可以使用泊松分布来帮助我们。
如果你已经知道平均每小时有 10 个人从你的网站上购买产品,你可以计算出每小时有 n 个人出现的概率。
您可以将这些信息提升到更精细的层次。这将允许你利用季节性技术和泊松分布的组合来预测未来的收入和更有效地分配资金。
那将需要更详细的解释和大量的数据。现在,我们将关注第一个问题。
我们将利用泊松累积概率函数。本质上,你只是把泊松分布方程中每个大于 6 的概率相加。
如果你运行它的λ为 10,你会得到如下图。
使用泊松累积概率函数你会得到大约 94%
这样你的公司就可以继续支付网站 A 的营销费用了!
然而!
如果只有每小时 7 英镑的话。那么你只有 70%的机会在一小时内卖出至少 6 件商品!所以这个项目不得不被砍掉。
你可以很容易地设置这个阈值,并开始创建一个拍卖类型的系统,其中你的预算是自动分配的基础上,未来的回报和购买概率的比例!
那听起来像一个有趣的项目!
不要误解我们。归根结底,数据科学可用于创建与客户互动的系统。
然而,它也可以用来帮助提高准确决策的速度。以及开发具有故障保险的决策系统,限制由分析师和管理层做出的简单和复杂决策的数量。
应用线性回归
假设你在一家医院工作,你注意到在过去的几年里,某项手术的费用逐月上涨。
你想知道手术的月份和费用之间是否有线性关系。
你分析的第一步是弄清楚是否有一个模型可以用来预测手术费用的上涨。
还有第二步,我们不会再讨论,那就是找出原因!
数据科学不仅仅提供创建模型的工具。
它还提供了让人们找出原因的工具!所以当你完成这个模型后,你会想知道为什么。
也许你会认为这是因为工资、设备成本和步骤复杂性的增加,等等。与每次手术和每月的价格相比,这需要更复杂的数据。
如果您的散点图似乎遵循如下所示的线性模式。可以开始用线性回归或者甚至多元线性回归的概念来看问题。这取决于它看起来适合什么(或者更好的是,你的自动化系统检测哪个型号!)
这是一种最简单的预测形式,因为你只是试图创建一条趋势线。
尽管您可以使用 excel、python、R 或任何其他语言来找到线性回归模型。我们想给你看一段视频,教你如何手工制作。
这涉及到很多总结,但不要让这吓到你。最后,大多数人不动手做的原因不是因为数学很难
相反,数学非常简单。然而,很多事情都可能出错。尤其是简单的计算。
仅仅因为你完成了模型,并不意味着你完成了!您的数据集通常并不完全符合直线。所以测试你的模型的有效性是很重要的。
如何确定趋势线或线性回归模型的最佳拟合?
有几种方法。下面我们将讨论 R 平方误差。
什么是 R 平方?也称为决定系数。
大多数模型都有一种或几种方法来计算模型的精度。
在这种情况下,R 平方误差等于:
回归误差平方和是您正在检查的当前点与模型线上对应点之间的差值。
让你的趋势线上的点等于ŷ
((mx1+b)-ŷ )2+…((mxn+b)-ŷ )2
总变量是模型上的点和实际数据的平均值 y 之间的差。
(y1-y ) 2+ (yn-y )2
因此,在这种情况下,我们可以在 excel、R 或 python 中运行线性回归,并获得非常符合直线的模型。
在这种情况下,根据数据,R 平方误差为 0.93。这实际上只是说明了解释差异的数量。
重要的是要记住模型的用途!不是每条符合的线都是正确的!
尤其是当你开始开发更复杂的模型的时候!
这就是为什么数据科学家不仅仅是创造模型。他们也在寻找为什么!
这是近 20 年来最大的变化之一!我们有能力给出背景。在统计仅限于数字之前。
他们只能说出发生了什么和可能会发生什么。
关于需要改变什么的信息非常少!现在,数据科学家可以给出原因了!因此,当我们知道原因后,我们就有能力给出战略建议。
例如,在这种情况下,你可以向你的医疗主任展示这个简单的趋势,然后分析为什么!
当我们出去帮助团队的时候。我们的部分重点是帮助他们带着他们的分析去见他们的主管,以获得他们的批准。
这是数据驱动的开始。这需要好奇心和一点点创业精神。
有了上图的发现,如果你能发现你可以平均减少 5.37 美元的手术费用,医院每年做 100,000 例手术。
您可以证明您每年为公司节省了 537,000 美元。希望你能加薪!
记住“所有的模型都是错的,但有些是有用的”仍然很重要。
逻辑回归,二元评估
与线性回归不同,逻辑回归有一个二进制输出。通常是通过或失败,1 或 0。线性回归的输出是连续的,因为逻辑通常用是或否来定义。
这就是为什么它被大量用于商业任务,如决定你是否应该给某人贷款,我可以预测一个病人是否患有某种疾病,以及许多其他每天困扰我们的是或否类型的问题。
使用逻辑回归允许利用多个变量。因此,即使你有一个复杂的商业决策,需要考虑几个不同的变量,逻辑回归也是一个很好的解决方案。
我们可以回头看看欺诈索赔的例子。确定索赔是否欺诈的算法可以是逻辑回归模型?你可能对索赔是否欺诈有一定的了解。您可能有位置、患者信息、医院统计数据等。
假设你想知道一个医生是否真的在做心脏直视手术,而不仅仅是假装开账单(这有点牵强,但还是顺其自然吧)。
你可能知道,相同的心内直视手术索赔也应该包括特定设备的使用,如核磁共振成像或实验室工作。如果没有出现这种情况,很有可能是欺诈。
你也可以设计一些功能。您可以根据通过的索赔和审计,找到特定医生的心脏手术是虚假的可能性,您可以计算医生每天完成的手术数量,或者您的团队有主题专家或上下文数据支持的任何其他信息在虚假索赔中发挥作用。
这个模型很难手工计算。幸运的是!这就是为什么 R 和 Python 是令人惊叹的语言。下面是 R 代码实现(glm 代表通用线性模型库)。这基本上是一行实现
注意:这有点误导。虽然它看起来像一行实现。在使用之前的公式之前,可能需要进行大量的数据清理和标准化工作!
*model <- glm(formula = FraudulentClaim ~ ., family = binomial(link = "logit"),
data = train)*
来解释一下这个实现。公式变量的输出设置在左侧。那么波浪符号表示“欺诈性索赔”依赖于句点。在 R 中,句点表示训练集中除因变量之外的所有变量。
如果你的团队只认为这是另一组变量,那么他们可以使用下面的例子,而不是周期。
*model <- glm(formula = FraudulentClaim ~ income + age + X, family = binomial(link = "logit"),
data = train)*
数学模型看起来像这样:
图片来自http://www . saedsayad . com/logistic _ regression . htm[/caption]
这些“b”变量中的每一个都代表另一个可能的变量。可能是性别、年龄、收入(通常都是标准化)。)
这一统计学原理也可用于其他医院任务,如再入院、诊断和欺诈索赔
应用数据科学
这些是一些基本的案例研究,我们展示了如何在决策过程中实施一些定理和算法。
它们是一个很好的开始,可以用在更大的项目中,以帮助改善您的数据科学和公司的数据驱动文化!
随之而来的是一些我们想注意的事情
算法和数据科学使用的一些利弊
赞成的意见
关注数据驱动的决策,而不是政治和直觉
自动做出可能会造成财务和精神负担的决策
提高一致性、准确性,并迫使团队制定决策流程
减少花费在任务上的时间
骗局
如果算法不正确,团队可能会过度信任它
下一篇数据科学文章
我们的下一篇文章我们希望将重点放在一些更技术性和基于编程的实现和应用上!如果您有任何具体的案例需要我们探讨,请告诉我们!!
您可能喜欢的其他数据科学资源: