TowardsDataScience 博客中文翻译 2019(二百八十五)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

改进深度神经网络

原文:https://towardsdatascience.com/improving-deep-neural-networks-b5984e29e336?source=collection_archive---------22-----------------------

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

深度神经网络是自然语言处理、计算机视觉、语音合成等复杂任务的解决方案。提高他们的表现和理解他们如何工作一样重要。要了解它们是如何工作的,你可以参考我以前的帖子。在这篇文章中,我将解释与改善神经网络相关的各种术语和方法。

偏差和方差

偏差和方差是解释网络在训练集和测试集上表现如何的两个基本术语。让我们用一个 2 类问题来简单直观地理解偏差和方差。蓝线表示由神经网络计算的决策边界。

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

  1. 最左图显示神经网络存在**偏高的问题。**在这种情况下,网络已经学习了一个简单的假设,因此不能根据训练数据进行适当的训练。因此,它不能区分不同类别的示例,并且 的训练集和测试集上都表现不佳。我们也可以说这个网络不适合。
  2. 最右边的图显示神经网络存在方差高的问题。在这种情况下,网络已经学习了一个非常复杂的假设,因此不能概括。因此, 在训练数据上表现出色,而在测试数据 上表现不佳。我们也可以说网络过度拟合。****
  3. 中心图显示了一个 【恰到好处】 的神经网络。它已经学习了理想假设,这有助于网络过滤掉异常,并对数据进行归纳。我们的目标应该是实现这样的网络类型。

训练食谱

既然我们知道什么样的神经网络是可取的;让我们看看如何实现我们的目标。这些步骤首先解决偏差问题,然后解决方差问题。

我们应该问的第一个问题是“是否存在高偏差?”如果答案是,那么我们应该尝试以下步骤:

  • 培养一个更大的网络。它包括增加隐含层的数目和隐含层中神经元的数目。
  • 长时间训练网络。可能的情况是,完整的训练尚未完成,将需要更多的迭代。
  • 尝试不同的优化算法。这些算法包括 Adam、Momentum、AdaDelta 等。
  • 反复执行上述步骤,直到偏差问题得到解决,然后进入第二个问题。

如果答案是**否,说明我们已经克服了偏倚问题,是时候关注方差问题了。我们现在应该问的第二个问题是“方差高吗?”如果答案是是的,**那么我们应该尝试以下步骤:

  • 收集更多的训练数据。随着我们收集更多的数据,我们将获得更多的数据变化,从较少变化的数据中习得的假设的复杂性将被打破。
  • 试试正规化。我将在下一节谈到它。
  • 反复执行上述步骤,直到方差问题得到解决。

如果答案是**否,**说明我们已经克服了方差问题,现在我们的神经网络是 【刚刚好】

正规化

正则化是一种逻辑技术,有助于减少神经网络中的过拟合。当我们将正则化加入到我们的网络中时,我们添加了一个新的正则化项,并且损失函数被修改。修改后的成本函数 J 的数学公式为:

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

带有λ的第二项称为正则化项。术语 ||W|| 通称为 弗罗贝纽斯范数 (矩阵中元素的平方和)。随着正则化的引入,λ成为新的超参数,可以对其进行修改以提高神经网络的性能。上述正则化也被称为 L-2 正则化。

之前,我们使用以下更新规则来更新权重:

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

由于在包括正则化的修改的成本函数 J, 中有新的正则化项,我们将以如下方式更新权重:

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

这里我们可以看到权重值减少了一个小于 1 的小数值。因此,我们也将这类正则化称为 权重衰减。 衰减值取决于学习率α和正则项λ。

为什么正规化行得通?

训练神经网络的最终目标是最小化成本函数 J 以及正则化项。现在我们知道了什么是正则化,让我们试着理解它为什么有效。

第一个直觉是,如果我们增加λ、 的值,那么 Frobenius 范数 就变小了,权重值就变得接近 0。这种方法主要清除某些神经元,使网络变得很浅。可以认为是将学习复杂假设的深层网络转换成学习简单假设的浅层网络。我们知道,简单假设导致复杂特征减少,过拟合就会减少,我们就会得到一个 【恰到好处】 的神经网络。

另一种直觉可以从应用正则化时神经元的激活方式中获得。为此,让我们考虑 tanh(x) 激活。

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

如果我们增加λ的值,那么 Frobenius 范数 变小,即权重 W 变小。因此,该层的输出将变小,并将位于激活函数的蓝色区域。我们可以看到,蓝色区域的激活几乎是线性的,网络将表现得类似于浅层网络,即网络将不学习复杂的假设(将避免尖锐的曲线),并且过拟合将最终减少,并且我们将获得一个 【恰到好处】 神经网络。

因此,λ的值过小将导致过拟合,因为 Frobenius 范数 将会很大,并且神经元将不会被清除,并且层的输出将不会在线性区域中。类似地,过大的λ值将导致欠拟合。因此,找到λ的理想值是提高神经网络性能的一项至关重要的任务。

辍学正规化

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

丢弃正则化是另一种正则化技术,其中我们丢弃某些神经元以及它们在神经网络中的连接。概率 keep_prob 决定了将要丢弃的神经元。在神经元被移除之后,网络在剩余的神经元上被训练。重要的是要注意,在测试时间/推断时间期间,所有的神经元都被考虑用于确定输出。让我们借助一个例子来理解这个概念:

# Define the probablity that a neuron stays.
keep_prob = 0.5# Create a probability mask for a layer eg. layer 2\. The mask should # have same dimensions as the weight matrix so that the connections # can be removed.
d2 = np.random.rand(a2.shape[0],a2.shape[1]) < keep_prob# Obtain the new output matrix.
a2 = np.multiply(a2,d2)# Since few neurons are removed, we need to boost the weights of    # remaining neurons to avoid weight imbalance during test time.
a2 = a2/keep_prob

由于我们首先丢弃概率为 keep_prob 的神经元,然后用 keep_prob 提升剩余的神经元,这种类型的丢弃称为 反向丢弃。

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

dropout 之间的直觉是,它禁止神经元只依赖于某些特征,因此,权重是分散的。可能的情况是,神经元变得依赖于某些输入特征来确定输出。在 dropout 正则化的帮助下,对于训练过程中的不同训练样本,特定神经元每次只获得少量特征作为输入。最终,权重分布在所有输入中,网络使用所有输入特征来确定输出,而不依赖于任何一个特征,从而使网络更加健壮。它也被称为L2 正则化的自适应形式。

我们也可以为每一层单独设置***【keep _ prob】。由于被丢弃的神经元数量与 keep_prob 成反比;建立keep _ prob的一般标准是,密集连接应该具有相对较少的keep _ prob*以便丢弃更多的神经元,反之亦然。

另一个直觉是,随着退出正规化,深层网络在训练阶段模仿浅层网络的工作。这进而导致减少过拟合,我们获得一个 【恰到好处】 神经网络。

提前停止

早期停止是一种训练方法,在这种方法中,我们在较早的阶段停止训练神经网络,以防止它过度拟合。我们跟踪 train_lossdev_loss 来确定何时停止训练。

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

刚好 dev_loss 开始超调;我们停止训练过程。这种方法论被称为。但是,由于以下两个原因,早期停止不是训练网络的推荐方法:**

  1. 当我们停止训练过程时,损失不是最小的。
  2. 我们正试图减少训练不当的网络上的过度拟合。

过早停止会使事情变得复杂,我们无法获得 【恰到好处】 神经网络。

参考

  1. 维基百科—激活功能
  2. Coursera——深度学习课程 2

我想感谢读者阅读这个故事。如果你有任何问题或疑问,请在下面的评论区提问。我将非常乐意回答这些问题并帮助你。如果你喜欢这个故事,请关注我,以便在我发布新故事时获得定期更新。我欢迎任何能改进我的故事的建议。

用数据科学改进 ERP 数据

原文:https://towardsdatascience.com/improving-erp-data-with-data-science-9c7cc00bc4bf?source=collection_archive---------15-----------------------

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

企业资源规划(ERP)数据有助于公司在专业平台的帮助下管理其日常运营,这些平台从多个流中收集信息,并允许公司获得实时反馈,以做出更好的决策。

企业可以通过雇佣数据科学家来提高他们的 ERP 使用率,这些数据科学家知道如何理解来自 ERP 界面的信息,并使用它来推动有利可图的行动。

实现更好的需求预测

数据科学家对如何识别历史数据中的模式有着透彻的理解。考虑到 ERP 平台通常包含有关销售随时间波动的信息,数据科学家可以更深入地挖掘,以发现有助于公司确定多快订购更多产品以及客户最想要哪些产品的趋势。

一家公司雇佣的数据科学家可以评估每年、每月和每周的季节性因素,并为企业领导人提供从防晒霜到雪铲等各种产品的库存指导。此外,记住其他一些可能影响顾客需求的事情也很重要。

如果一个名人带着一个随处可见的钱包在颁奖典礼的红地毯上漫步,这种知名度可能会让消费者想要购买它。或者,如果一位受人尊敬的思想领袖发布了一条关于某个产品的推文,这种提及也可以刺激需求。ERP 软件提供公司需要的硬数据,数据科学家通过确定让人们想要产品的明显和不太明显的因素来帮助连接这些点。

在零售业中很容易看到这种优势,但这种优势也扩展到了制造业和客户服务领域。例如,对含有难以获得的成分的消费品的需求增加可能会导致公司或其供应链合作伙伴扩大其网络以采购该商品或寻找替代方法来配制该产品。

或者,购买新发布的智能手机的人数迅速上升,这可能需要品牌的客户支持团队成员在处理关于该技术产品的大量问题之前进行额外的培训。一旦企业依靠数据科学家来更好地理解需求相关模式,他们应该能够更好地预测和满足不断变化的需求。

帮助公司对解决问题更有信心

企业领导经常会遇到这样的情况,需要他们评估各种选项,并针对给定的场景做出最合适的选择。这通常始于公司代表选择 ERP 软件。例如,他们评估是现场还是基于云的 ERP 解决方案更好,然后得出结论,答案取决于企业的需求。

上一节讨论了在数据科学家的帮助下预测未来需求如何帮助企业取得成功。如果公司依靠数据科学家在规范性分析领域提供帮助,或者在解决已知问题时找出最佳方法,他们也可以表现出色。这是因为获得必要的洞察力来进行规定性分析需要关注数据的数量和质量

幸运的是,对于已经在使用 ERP 软件的公司来说,他们需要的大部分或全部数据都在这个平台上。然而,数据科学家通过评估数据来确保数据没有错误或重复记录,如果在分析开始前不从数据库中删除,这些错误或重复记录可能会扭曲结果。

毕马威开展了一项 CEO 调查,发现 67%的受访者不相信过去几年从数据分析或计算机驱动模型中得出的结论。他们说,他们未能根据数据显示采取行动,因为这与他们的直觉或经验相矛盾。如果领导人怀疑数据库中包含错误,可能会导致不正确的结论,他们会感到更加怀疑。

让数据科学家在仔细检查数据之前仔细准备数据,并不能保证解决公司领导层对可用信息缺乏信心的问题。但是数据专家会清理数据以减少不准确的结果。这意味着,如果数据科学家首先处理 ERP 中的信息,并检查其问题和有用性,公司高管就可以更权威地对信息采取行动。

协助从多个 ERP 工具中编译数据

当一家跨国公司在全球范围内使用多个 ERP 系统,并需要将信息整合到一个平台时,从 ERP 界面处理公司数据变得异常复杂。全球最大的啤酒品牌百威英博就是如此。

该品牌以前在其全球子公司中使用近 30 个单独的 ERP 平台,但现在正在过渡到一个单一的标准化系统,该系统将在未来五年或更短时间内主要在云中运行。在过去的一年半中,该品牌的 80 名工程师团队参与了 30 个数据项目,所有这些都是该公司数字化转型的因素。

当公司处于类似的情况下,他们希望开始使用一个 ERP 解决方案,而不是几十个或更多,数据科学家可以缓解否则可能是一个棘手的过渡。

然而,由于分析师预测对数据科学家的需求将会增加,公司领导人应该立即做出招聘决定,并向候选人提供有吸引力的雇佣条件。

数据科学家和 ERP 工具:实用配对

这一概述强调了数据科学家的专业知识如何改善公司使用 ERP 的方式。此外,它表明了为什么公司领导人越来越多地将让数据科学家加入他们的团队视为一项明智的投资。

图像由 Rawpixel 组成

用数据改善精神卫生保健

原文:https://towardsdatascience.com/improving-mental-health-care-with-data-84489f69d8c9?source=collection_archive---------26-----------------------

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

photo by Clément Falize

五月是心理健康宣传月。这是一年中我们(额外)被鼓励向为最弱势人群之一服务的非营利组织捐款的时候。是时候强调围绕心理健康、消除污名和庆祝改善生活的创新的话题了。本着这个月的精神,这篇博文将概述美国精神卫生保健系统面临的挑战,这些挑战是从公开报道和我自己的职业经历中总结出来的。我还将探索技术专家和数据科学家如何寻求创建实用的数据驱动解决方案来解决这些复杂问题的例子。

全国精神疾病联盟:数字

  • 在美国,大约五分之一的成年人(4660 万人)在特定年份患有精神疾病。
  • 在美国,大约每 25 个成年人中就有 1 人(1120 万)在给定的一年中经历过严重的精神疾病,这些疾病严重干扰或限制了一种或多种主要的生活活动。
  • 估计有 26%住在收容所的无家可归的成年人患有严重的精神疾病,估计有 46%患有严重的精神疾病和/或物质使用障碍。
  • 大约 20%的州囚犯和 21%的地方监狱囚犯有精神健康状况的“近期病史”。
  • 非裔美国人和西班牙裔美国人使用心理健康服务的比率分别是白种美国人的一半和亚裔美国人的三分之一。

美国被认为是“去机构化”运动的领导者。从 20 世纪 60 年代开始,这一运动受到这样一种观点的启发,即每个精神疾病患者在小社区比在大医院能得到更好的照顾。在财政激励和新药物协议的推动下,美国决策者迅速同意并关闭了大多数国营精神病医院。

美国比任何其他西方国家都更大幅度地减少医院。1955 年至 1994 年间,大约有 487,000 名精神病患者从州立医院出院。目前,约有 220 万患有严重精神疾病的人根本没有接受任何精神治疗。大约 20 万精神分裂症或躁郁症患者无家可归。

基于社区的护理的想法在理论上是非常美好的,因为它的目标是给病人更多的自主权,让他们融入社会。不幸的是,它从未得到充分实施,尤其是在后勤上不可行的小城镇或农村社区。医院关闭了,但是社区诊所没有取代它们。这导致了目前美国精神卫生保健的危机。

如此迫切需要的治疗、稳定和庇护失去了,最需要的人找到了其他公共机构,主要是监狱。无法得到疾病治疗的人在监狱、收容所或街头游荡。他们挤满了急诊室,有时故意让自己生病,等待医院的床位开放,并希望得到一个干净的淋浴和一顿热饭。有些人变得暴力,但更多时候他们是暴力的受害者。

其余的国家精神病医院现在资金不足,人员不足,员工工资低,人员流动率高。环境压力大,拥挤不堪,有时还很危险。这造成了令人难以置信的低质量的护理和不断的创伤循环。T2 的医院简直是人满为患,每 10 万人只有 12 张病床。根据治疗倡导中心的报告,“去机构化:失败的历史”,这与 1850 年的比率相同。

私营精神病医院也跟不上患者的需求,这使得医院管理者可以挑选他们想要治疗的患者,并拒绝接收他们认为在他们的项目中“不成功”的严重精神疾病患者。是的,没错——私立医院拒绝给病得太重的病人治疗是合法的。

除了没有病床、缺乏社区资源以及持续的耻辱和歧视之外,护理协调也是一个突出的问题。医院、精神病医生、初级保健医生和其他专家通常不相互交流或共享关键信息。这可归因于过时的记录管理系统、确保患者信息隐私的低效方法(HIPAA)以及医务人员和病例管理的频繁变动。临床医生依靠自我报告的信息或部分医疗记录来做出关键决定。

在目前的状态下,美国精神卫生保健系统往往无法防止可避免的悲剧和不公正。这些后果不仅影响精神疾病患者,还会在家庭、社区、学校、工作场所和社会中产生反响。为了做出有意义的改变,精神卫生保健必须进入 21 世纪。尽管如此,还是有一些好消息——专注于自动化、数据科学和精神健康护理交叉领域的科学研究和创新公司正在增长。

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

photo by Ron Smith

哥伦比亚大学精神病学研究部:蛋白石中心

O优化与 P 针对精神分裂症患者的个性化干预 A 横着Lif espan。

“开发和测试精神障碍循证治疗的临床研究环境与大规模实施这些干预措施的现实世界临床实践环境之间存在巨大差距。”— 蛋白石中心

美国大约有 280 万精神分裂症患者,其中 40%将得不到治疗。研究表明,早期干预,包括药物治疗,可以改变这种疾病的性质,并大大改善患者的长期结果。抗精神病药物是治疗精神分裂症的重要组成部分。早期的经历会对患者对药物治疗的态度产生持久的影响,精神病的首次发作是优化治疗的关键时刻。

OPAL 是一个开发、适应和检查干预措施的平台,这些干预措施解决了精神分裂症治疗和服务提供中的重要问题。他们利用心理健康数据科学以及生物统计学的专业知识来开发机器学习精确模型和数据分析。即将开展的一个项目专注于通过智能手机数据进行药物管理。

开出尽可能好的药物和剂量是一项挑战。这个问题的一个促成因素是缺乏关于药物如何治疗症状、副作用以及患者相应的行为、认知和情绪体验的准确信息。精神病医生通常依赖病人对过去一个月感觉的回忆。这是有问题的,因为被诊断患有精神分裂症的人容易出现记忆困难和认知偏差。

该项目将使用智能手机应用程序从首次经历精神病发作的患者中收集实时症状和当前患者功能数据。这些输入将允许临床团队利用相关和及时的数据做出更好的治疗决策。其目的是在疾病的早期阶段用尽可能好的信息进行治疗,以产生持久的终身影响。

阈值项目:自动化患者记录和预测需求

Data Kind 是一家非营利组织,汇集了志愿数据科学家和社会变革组织,以“解决教育、贫困、健康、人权、环境和城市领域的关键人道主义问题。”

在 Data Kind 志愿者和芝加哥非营利组织 Thresholds 的共同努力下,他们致力于收集多个平台的患者数据,并使用预测分析来识别可能需要早期干预的高风险患者。如果无法获得重要和最新的患者数据,卫生保健提供者很难就患者需要的护理和援助做出合理的决策。

该团队首先创建了一个数据仓库,其中包含从 Thresholds 的内部数据库、伊利诺伊州医疗保健和家庭服务部以及库克县监狱中提取的原始数据。他们建立了一个自动报告系统和一个仪表板,员工可以使用它来快速了解患者的需求和护理质量。这种自动化为组织节省了重要的时间和资源,因为收集和处理这些信息通常是手动完成的。新工具允许工作人员以易于理解的格式可视化数据,识别新趋势,并在特定患者中进行筛选,以更好地定制他们的护理。

他们还利用来自匿名数据流的患者信息,对 2013 年至 2015 年接受阈值治疗的近 4000 名患者进行了预测。这些信息包括病例管理文件、医疗数据以及认知、健康和康复服务的治疗数据。通过这些数据来源,他们能够开发一个系统来标记需要立即干预的高危患者。

Kaiser Permanent:分析电子健康记录预测自杀风险

评估自杀风险的传统方法包括临床评估和问卷调查。这些方法被发现远不如数据驱动模型准确。来自 Kaiser Permanent 的研究人员观察了 2009 年至 2015 年间近 300 万名心理健康和初级保健医生的患者。为了建立一个回归模型,他们从电子健康记录中提取了数据,包括过去的自杀企图、精神健康或物质使用诊断、医疗诊断、精神药物治疗、住院或急诊护理以及抑郁问卷。

T2 的 eam 发现,在就诊后的 90 天里,预测风险最高的 1%的患者中自杀企图和死亡的发生率是预测风险最低的一半的患者的 200 倍。该研究还显示,因精神健康问题去看医生的患者风险得分在前 5%,占自杀企图的 43%和自杀死亡的 48%。

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

photo by Hillie Chan

使用自动编码器提高 PewDiePie 的相机质量

原文:https://towardsdatascience.com/improving-pewdiepies-camera-quality-with-autoencoders-583635de1cde?source=collection_archive---------23-----------------------

让我们来看看如何通过自动编码器将深度学习用于图像超分辨率。

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

Comparison of the 480p input (left) to an Autoencoder trained for the task of image super-resolution, with it’s higher quality output at the same resolution (right).

最近,我一直在阅读各种图像超分辨率技术,这些技术利用深度学习来提高图像清晰度。使用像 GANs自动编码器这样的技术来完成这项任务,已经取得了一些令人印象深刻的成果。可以有把握地推测,如今大多数智能手机相机和其他图像处理软件都利用这种人工智能来“增强图像。

在这篇文章中,我想探索和详细说明自动编码器对于这项任务的有效性,并在最近的 PewDiePie 的视频中展示一些结果。

为什么是派迪派?

如果你最近一直在关注订阅量最大的 YouTuber,你就会知道他面临着很多批评和嘲笑,因为尽管他使用了昂贵的摄影器材来录制视频,但他的视频质量很低。

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

这让我认为,这将是玩超分辨率人工智能算法的完美用例,并看看我们可以用它们实现多少更好的视频质量。

什么是图像超分辨率?

低分辨率(LR)模糊图像可以被放大以输出更清晰、更详细的高分辨率(SR)图像的技术被称为单图像超分辨率。目的是恢复图像中由于相机质量差或照明条件差而丢失的对象信息。

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

An example of image super resolution using Neural Networks (ESRGAN). [Source]

卷积神经网络(CNN)已被证明在这类任务中相当出色,尤其是与更传统的插值技术相比。由于能够学习常见物体的形状和纹理,CNN 在恢复信息方面非常有效,否则这些信息甚至可能不会出现在 LR 图像中。因此,让我们看看如何训练一个基于 CNN 的自动编码器来完成这项任务。

收集培训数据

首先,我们来看看我们的训练数据。我们将使用 Pewds 的一对低分辨率-高分辨率(LR-HR)图像来训练我们的自动编码器网络。

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

Generating training data

收集这种类型的数据相当容易,即使这是监督学习。我们只需要高分辨率的图像,通过对图像进行简单的缩小和放大操作,很容易生成低分辨率的图像,如上图所示。这给了我们用于网络训练的输入输出对。

自动编码器架构

自动编码器网络包含两个主要模块——编码器和 T2 解码器。下图显示了整个编码器-解码器网络设置。

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

LR -> Encoder -> Encoding -> Decoder -> SR

编码器的任务是接收 LR 图像,并找到该图像的高级表示,称为编码。为此,它使用各种卷积层。输出编码包含图像中各种对象的形状和纹理信息,并且比输入图像的尺寸小得多。然而,人类并不能真正理解这种编码,而只是这种特定网络能够理解的一种表示。

解码器的任务是进行编码并创建更高分辨率的图像。为此,它使用各种上采样模块,并从编码器的早期卷积层获得帮助,以恢复图像中可能在转换为编码时丢失的一些信息。这在上图中用上方的箭头表示。请将此视为解码器在平滑和锐化接收到的信息时向编码器询问原始图像的具体细节。

最后,我使用的特定网络将图像放大到与输入图像相同的分辨率,但质量更清晰,像素细节更多。如果感兴趣,你也可以尝试超越 LR 分辨率。

结果

我使用生成的图像和地面实况之间的基本 MSE 损失度量来训练网络。这当然不是你可以用来比较图像的最佳损失度量,所以在这方面还有很大的改进空间。

无论如何,即使使用 MSE,我也能得到相当不错的结果,这让我相信基于 CNN 的自动编码器对这项任务非常有效。以下是 LR 输入和 SR 输出之间的一些示例比较。

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

Left: input to autoencoder. Right: output of autoencoder. Both images are 480x480.

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

Left: input to autoencoder. Right: output of autoencoder. Both images are 480x480.

更多视频格式的结果,请查看我的 YouTube 频道下面嵌入的视频。

结论

虽然来自自动编码器的结果相当不错,但在实践中它们并不十分先进。还有各种其他基于 GAN 的方法用于训练图像生成器,产生看起来更真实的输出。总之,与 GAN 的发生器-鉴频器设置相比,基于 MSE 的损耗,甚至我们在这里可以用于纯自动编码器的任何其它损耗,都是不利的。

在任何情况下,这肯定是非常令人印象深刻的,我们可以用人工智能实现这些天,所以它值得关注最新的研究,如果你对图像超分辨率感兴趣!

感谢您的阅读。如果你喜欢这篇文章,你可以在媒体GitHub 上关注我的更多作品,或者订阅我的 YouTube 频道

利用语义搜索和自然语言处理改进栈溢出搜索算法

原文:https://towardsdatascience.com/improving-the-stack-overflow-search-algorithm-using-semantic-search-and-nlp-a23e20091d4c?source=collection_archive---------7-----------------------

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

如果你是一个曾经尝试过编写一段代码的人,你肯定会遇到栈溢出(这很有名)。对于那些生活在岩石下的人来说,栈溢出为程序员提供了一个最大的 QA 平台。用户提出问题/疑问,他们的同伴试图以最有帮助的方式提供解决方案。答案越好,得到的票数就越高,这也提高了用户的声誉。

鉴于它的受欢迎程度,可以肯定地说,那里有大量的数据。然而,这种巨大的信息量也使得人们很难找到自己想要的解决方案。对于编程老手和其他有经验的专业人士来说,这并不是什么大问题,因为他们知道获得适当答案所需的正确关键字。然而,对于一个初级程序员来说,这是一个很大的问题。例如,如果他需要学习使用 Python 的*‘如何制作服务器’,他不太可能在搜索框中使用术语‘Django’‘Flask’*。因此,这可能会威胁用户使用该平台。

因此,一个最佳的搜索引擎是必要的导航通过这个烂摊子。然而,就目前的情况来看,Stack Overflow 的搜索引擎也有一些自身的缺陷。让我举个例子来说明:

假设我是 NodeJS 的初学者,我想运行我的应用程序。因此,我转到 Stack Overflow 并键入以下内容:‘Node—如何运行 Node app . js?’。这是我得到的:

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

但是确实存在节点——如何运行 app.js 的结果:

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

理想情况下,它应该返回两个查询的结果,但是没有。

休斯敦,我们有麻烦了

但你问,何必呢? 栈溢出的主要收入来源是通过广告收入。因此,他们的目标是最大限度地提高用户参与度,以推动更多的广告,从而赚更多的钱。由于他们的搜索引擎的次优性能,用户将很难通过他们的网站清除他的疑虑,因此将决定使用更复杂的搜索引擎,如谷歌。

当谷歌建议使用 Stackoverflow 之外的资源时,问题就出现了。对于每一个离开他们网站的用户来说,他们损失了他们本可以赚到的钱。

一个可能的解决方案

我们的目标是让平台真正理解用户试图搜索的内容,然后基于此返回最相似的结果。

自 20 世纪问世以来,自然语言处理(NLP)已经走过了漫长的道路。由于快速的处理器和复杂的模型架构,人工智能的这个子领域在过去几年中已经被证明工作得非常好,因此在解决各种语言理解任务方面具有巨大的潜力。

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

Sneak Peek into of the final result

(要观看动画版本,点击这里

该解决方案分为两个子任务:

  1. 标签预测: 给定用户查询,我们希望预测给定查询最好属于哪些标签
  2. 信息检索: 基于用户查询,返回与用户查询最相似的现有问题

给你一个鸟瞰图,解决方案的流程如下:

  • 从 Google BigQuery 收集 Stackoverflow 问题/答案数据
  • 预处理和标准化收集的数据
  • 仅过滤掉最常见的标签(使用了 500 个标签)
  • 使用 Word2Vec 训练单词嵌入
  • 使用 LSTM 模型训练标签分类器(提示:您不能使用二进制交叉熵损失来训练它。阅读更多了解原因
  • 使用经过训练的单词嵌入来为我们数据库中的所有问题创建句子嵌入
  • 将查询与每个句子进行比较,并使用基于余弦距离的度量对语义相似的结果进行排序。
  • 使用 ReactJS 和 Flask 创建 web 应用程序来部署训练好的模型

对于有流程图癖的人来说,这里有:

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

The Brain

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

The web app architecture

不要太花哨,对吗?如果您熟悉这些概念中的每一个,请随意直接进入代码(它也有很好的文档记录codegasm)。

[## agr awal-rohit/stack overflow-语义搜索

Team Maverick 的 IBM Hack Challenge Stack overflow 条目为……提供了最大的学习资源之一

github.com](https://github.com/agrawal-rohit/stackoverflow-semantic-search)

宝贝程序员们,请继续阅读:)

**小旁注:**我不会在文章中解释每一行代码(repo 中的 jupyter 笔记本已经考虑到了这一点)。相反,我会专注于关键的结果和它们背后的直觉

1.数据收集

为了理解数据并从中学习,我需要收集 Stack Overflow 上发布的问题和答案。因此,我需要以下内容:

  • 标题
  • 问题主体
  • 这个问题的答案
  • 为每个答案投票

由于关于堆栈溢出和更好的健全性检查的大量数据,我将数据限制为仅与“Python”相关的问题。然而,整个过程对于其他主题也是可重复的

Google BigQuery 数据集包括堆栈溢出内容的档案,包括帖子、投票、标签和徽章。该数据集被更新以反映互联网档案上的堆栈溢出内容,并且也可通过堆栈交换数据浏览器获得。关于数据集的更多信息在 Kaggle Stackoverflow 数据集中给出

我们的任务所需的数据可以通过以下 SQL 查询来收集:

*SELECT q.id, q.title, q.body, q.tags, a.body as answers, a.score FROM 'bigquery-public-data.stackoverflow.posts_questions' AS q INNER JOIN 'bigquery-public-data.stackoverflow.posts_answers' AS a ON q.id = a.parent_id WHERE q.tags LIKE '%python%' LIMIT 500000*

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

Raw Data from Google BigQuery

该查询连接两个表(stack overflow . posts _ questionsstack overflow . posts _ answers)并收集与python相关的 500000 个问题所需的数据。因此,每行包含一个问题和一个答案。 ( 注: 可能存在问题相同但答案唯一的行)。

2.数据预处理和标准化

数据预处理 101 —检查缺失值:

df.isna().sum()
--------------id         0
title      0
body       0
tags       0
answers    0
score      0
dtype: int64

正如我之前提到的,我们的数据集可能包含具有相同问题但唯一答案的行。我们希望将所有这些不同的行合并为一行,同时汇总每个答案的投票并合并所有答案。

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

Data after combing rows with identical questions

Max score before:  5440 
Max score after:  9730

现在我们终于准备好了原始数据,我们可以继续清理和预处理这些原始文本数据了。我实现了基本的文本处理,包括以下步骤:

  1. 将原始文本转换为令牌
  2. 将令牌转换为小写
  3. 删除标点符号
  4. 删除停用词

**注意:**我跳过了删除数字数据,因为我觉得这会删除宝贵的上下文信息。

我还跳过了**‘词干化/词汇化’**这一步,因为我不想改变我们语料库中使用的特定领域术语,以免丢失宝贵的信息

如果您仔细观察数据集,您会发现问题和答案的原始文本是与 HTML 标记一起给出的,它最初是用 HTML 标记显示在 StackOverflow 上的。这些通常指的是p标签*、*h1-h6*标签和、*标签。因为我只需要每篇文章的文本部分,所以我执行了以下步骤:

  • 我通过组合标题、问题主体和所有答案(稍后将用于训练 Word2Vec 嵌入)构建了一个名为“post_corpus”的新特性列
  • 我把标题加在问题正文的前面
  • 我跳过了“代码”部分,因为它们没有为我们的任务提供有用的信息
  • 我为每个问题构造了 URL,在问题 id 后面附加了“【https://stackoverflow.com/questions/】T2
  • 我使用开源的文本块库为情感构建了两个特征

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

Preprocessed Data

每篇文章都有不同数量的标签。为了缩小更精确模型的选择范围,我决定用 **20 个最常见的标签。**计划仅过滤包含至少一个 most_common_tags 的数据

['python',  'python-3.x',  'django',  'pandas',  'python-2.7',  'numpy',  'list',  'matplotlib',  'dictionary',  'regex',  'dataframe',  'tkinter',  'string',  'csv',  'flask',  'arrays',  'tensorflow',  'json',  'beautifulsoup',  'selenium']

好了,最后一个快速枯燥的数据处理步骤,然后我们开始有趣的事情:)

  • 我为“processed_title”创建了一个单独的列,因为我想保留原始标题,因为我想在应用程序中提供原始标题
  • 我还标准化了数字“分数”

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

Preprocessed and Normalized Data

3.仅过滤掉最常见的标签

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

尽管我们在数据处理步骤中确实过滤掉了许多标签,但是仍然存在许多 【杂散】 标签,与其他标签成千上万次的出现相比,这些标签可能只出现一次或两次。这增加了地面真实数据的维度,这对于我们的模型是不期望的。

因此,我们根据出现的次数提取前 500 个标签。(考虑到我们有大约 140,000 个数据点,500 个标签似乎是一个很好的实验数字

最后,我们修改了标签数据,使其只包含这 500 个标签中的一个标签,以获得更好的模型准确性

4.使用 Word2Vec 训练单词嵌入

为了让我们的模型理解原始文本数据,我们需要对它进行矢量化。单词包和 TF-IDF 是非常常见的矢量化方法。然而,由于我将使用人工神经网络作为我的模型(LSTM),BOW 和 TFIDF 的稀疏特性会造成问题。因此,我决定选择单词嵌入,这是密集的向量表示,因此非常适合我们的神经网络。

人们在 StackOverflow 上交谈的方式是非常技术性的,他们使用非常特定的词汇,所以使用预先训练的单词嵌入不是一个好主意(尽管谷歌有很多好的嵌入),因为他们是在简单的英语文本(如莎士比亚)上训练的,无法理解我们词汇表中单词之间的关系。因此,我决定使用 Word2Vec 从头开始训练一个单词嵌入模型。

我们数据集中的列post_corpus在这里开始发光。由于 Word2Vec 是一个无监督的模型,只需要一个语料库进行训练,我们需要为它提供尽可能多的文本,以便它理解词汇表。因此,我们使用post_corpus来训练 Word2Vec,因为它是一篇文章的标题、问题和所有答案的组合。

训练成功后,我们得到以下结果:

Terms most similar to "django"
[('flask', 0.5827779173851013), ('project', 0.5168731212615967), ('mezzanine', 0.5122816562652588), ('wagtail', 0.5001770257949829), ('drf', 0.4827461242675781), ('framework', 0.48031285405158997), ('cms', 0.47275760769844055), ('admin', 0.467496395111084), ('database', 0.4659809470176697), ('app', 0.46219539642333984)]
--------------------------------------------------------------------
Terms most similar to "api"
[('apis', 0.6121899485588074), ('webservice', 0.5226354598999023), ('service', 0.49891555309295654), ('framework', 0.4883273243904114), ('postman', 0.47500693798065186), ('webhook', 0.4574393630027771), ('rpc', 0.4385871887207031), ('oauth2', 0.41829735040664673), ('twilio', 0.4138619303703308), ('application', 0.4100519120693207)]
--------------------------------------------------------------------
Terms most similar to "gunicorn"
[('uwsgi', 0.5529206991195679), ('nginx', 0.5103358030319214), ('000080', 0.4971828758716583), ('supervisord', 0.4751521050930023), ('arbiterpy', 0.4701758027076721), ('iis', 0.46567484736442566), ('apache2', 0.45948249101638794), ('web1', 0.45084959268569946), ('fastcgi', 0.43996310234069824), ('supervisor', 0.43604230880737305)]
--------------------------------------------------------------------
Terms most similar to "server"
[('webserver', 0.5781407356262207), ('servers', 0.48877859115600586), ('application', 0.488214373588562), ('app', 0.4767988622188568), ('vps', 0.4679219126701355), ('client', 0.46672070026397705), ('localhost', 0.46468669176101685), ('service', 0.457424521446228), ('apache', 0.4540043771266937), ('nginx', 0.4490607976913452)]

很酷,对吧?

5.使用 LSTM 模型训练标签分类器

这一部分处理我们的第一个子任务:

“给定用户查询,我们希望预测给定查询最好属于哪个标签”

准备用于训练模型的数据包括:

  1. 对地面真实数据进行一次性编码
  2. 分成训练集和测试集
  3. 标记化和填充
  4. 创建嵌入矩阵

(我将在这里包含代码,但是对于每个部分的详细解释,请参考存储库中的 jupyter 笔记本)

为解决手头的子任务而创建的模型在嵌入层之后立即使用了 LSTM 层,因为它们在处理顺序数据和文本数据方面很熟练。随后添加密集图层,并去除正则化以构建稳健的模型

**秘方——损失函数:**由于我们在这里处理的是多标签分类问题,我们不能使用二进制交叉熵损失来训练模型。这是因为二进制交叉熵损失会推动你的模型预测一个或两个包含在地面真相中的标签,而不会因为遗漏了其他标签而惩罚它。

因此,我分别对每个类使用日志损失,然后根据类的数量计算其平均值。

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

The loss function used

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

Model Performance

然后,我们可以借助下面的函数获得任何句子的标签:

Test Case: selecting n1d array nd array numpy
--------------------------------------------------------------------
Predicted: [('arrays', 'numpy', 'python')]
Ground Truth: [('numpy', 'python')] Test Case: taking info file
--------------------------------------------------------------------
Predicted: [('python',)]
Ground Truth: [('python', 'python-2.6', 'python-2.7')] Test Case: python find txt continue causing fault
--------------------------------------------------------------------
Predicted: [('python',)]
Ground Truth: [('python', 'python-3.x')] Test Case: fabric rsync read error connection reset peer 104
--------------------------------------------------------------------
Predicted: [('django', 'python')]
Ground Truth: [('django', 'python', 'windows')] Test Case: fllter pandas dataframe multiple columns
--------------------------------------------------------------------
Predicted: [('dataframe', 'pandas', 'python')]
Ground Truth: [('pandas', 'python')]

目前看来已经足够好了😃。完成这个子任务后,进入下一个任务

6.使用经过训练的单词嵌入来为我们数据库中的所有问题创建句子嵌入

子任务 2 要求如下:

“基于用户查询,返回与用户查询最相似的现有问题”

要比较两个句子有多相似,我们可以找到它们之间的‘距离’。为了能够计算这样的距离,句子必须属于相同的向量空间。这是通过句子嵌入完成的。我也使用过的最流行的距离度量之一是余弦距离。余弦距离越小,两个向量之间的相似度越高

为了计算整个句子的嵌入,我定义了以下函数,该函数对每个有效标记的嵌入进行平均,并用于计算数据库中所有问题的句子嵌入:

7.将查询与每个句子进行比较,并使用基于余弦距离的度量对语义相似的结果进行排序

尽管余弦距离本身就足以为我们提供这个特定任务的良好结果,但我决定定义一个自定义的相似性度量。其给出如下:

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

其中 q =用户查询和 t =已有问题

  • 它将余弦距离视为基本度量
  • 它根据帖子在 StackOverflow 上获得的用户投票来考虑帖子的受欢迎程度
  • 它考虑了人们所作出的反应的总体情绪。积极的情绪意味着答案是有帮助的,因此是一篇好文章

运行以下代码片段可以向您展示运行中的算法:

对于用户查询**“组合列表列表”,**我们得到:

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

Query Results

web 应用程序只是通过用户界面翻译这些结果

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

在这篇文章中,我不会讨论我是如何创建 web 应用程序的,你可以在资源库中查看代码。如果你有任何疑问或建设性的反馈(讨厌有毒的人可以去吸阿迪…),欢迎在下方随意留下回应。我很乐意收到你的来信😄

直到那时,再见~

[## agrawal-rohit —概述

在 GitHub 上注册您自己的个人资料,这是托管代码、管理项目和与 40…

github.com](https://github.com/agrawal-rohit)

在移动设备上使用人工智能改善用户体验

原文:https://towardsdatascience.com/improving-user-experience-with-ai-on-mobile-ede5c567f703?source=collection_archive---------20-----------------------

对于许多用户来说,他们的移动设备是他们接触网络世界的首选界面。设备智能并不是什么新鲜事——想想智能助理、预测文本——但这些系统往往涉及简单的预测模型或基于规则的系统。虽然深度神经网络是当前图像和视频分析的最先进技术,但它们复杂的结构带来了沉重的计算负担,而且许多繁重的工作通常都是在云中完成的。当任务可以在后台执行时,这很好,但实时沉浸式用户体验需要比往返于数据中心更快的响应时间。

即使在世界上最先进的地区,移动网络覆盖也不是无处不在。

除了延迟和传输时间之外,应用程序必须能够容忍较差的数据连接,并在不可用时从容地失败。如果支持人工智能的功能对于保持一致的性能和行为至关重要,那么除了在用户硬件上运行,可能没有其他选择,因为即使是有线连接也有停机时间。

令人欣慰的是,功能越来越强的智能手机——通常带有专用加速器——正在为设备上更大的智能打开大门。

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

多快才算够快?

当提供对用户交互的响应时,显然越快越好。尽管应尽可能减少任何延迟,但在运行复杂操作和提供响应时,我们应考虑三种不同的时间框架:

  • 在 0.1 秒内系统感觉像是在瞬间响应,因此不需要特殊的机制来管理用户的注意力。这一类别的一个例子是在屏幕上拖动鼠标光标,或者观看视频的实时更新。
  • 在 1.0 秒内系统感觉反应灵敏,用户能够将动作与反应联系起来,尽管他们会注意到延迟。想象一下点击一个按钮,然后等待事情发生。
  • 在 10 秒钟内用户可以保持专注于手头的任务,但是你需要让他们参与进来——在更长的时间里,用户可能会想转换任务,做些别的事情。

一般来说,一个“不确定”的进度指示器对于几秒钟的等待时间就足够了——它显示某事正在发生,但不显示完成的时间。超过 5 秒左右,如果用户知道他们还要等待多长时间,他们会更舒服。

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

For delays of 2–5 seconds, an indeterminate progress indicator (L) is sufficient; for 5+ seconds, a determinate progress indicator ® is a better choice

我们如何使用这些信息来确保我们的人工智能有利于用户体验?首先,用户认知链的中断必须被最小化,这样用户界面才会有反应。必须考虑推理时间,长时间运行的操作应该作为后台任务运行,这样用户就不用等待响应了。

举个例子,把一个人脸探测器应用到一幅图像上。如果实时运行,结果可以用来检查对象在拍照前是否睁开了眼睛。在这种情况下,一切都在等待人工智能,它给系统带来了延迟,所以它必须尽可能快地运行。或者,面部探测器可以在拍照后用来帮助标记朋友——在这种情况下,它可以作为后台任务运行,一旦他们准备好,就会提供建议。这样,用户就不用等待人工智能,他们的认知链也不会中断。

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

上面的例子可以通过云服务来运行,例如谷歌云视觉 API亚马逊认知——响应时间通常不到一秒。作为后台操作,这没什么问题,如果不需要经常发生,作为对用户工作流的中断,这也是可以接受的。但是如果:

  • 你有大量的数据?
  • 你想要一个真正的,身临其境的实时产品?
  • 你想要在任何情况下都可靠?

为了提供最佳的用户体验,有必要在用户设备上运行推理:要么在应用程序内,要么作为嵌入在网页中的客户端代码(例如 TensorFlow.js )。

设备上计算

我们在这里真正讨论的用例是什么,在移动硬件上运行这些用例有多实际?计算机视觉应用是要求最高的,但也是最令人兴奋的。相机可以成为与世界互动的手段和获取信息的方式,例如通过图像搜索。深度神经网络已经迅速成为图像分析任务的首选工具,例如对象检测、图像分类或特征提取。

大多数常见的网络架构使用卷积层堆栈从图像中提取特征。添加层和更复杂的结构通常可以提高性能,但代价是增加计算要求和/或执行时间,以及内存和存储要求。

令人欣慰的是,一些较新的神经网络体系结构是专门为此应用而设计的。 MobileNets 是一系列网络,旨在有效利用嵌入式或移动设备等受限平台上的有限资源。至关重要的是,通过控制网络的规模和复杂性,可以在精度和速度之间进行权衡,以适应应用要求:

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

该图显示,根据我们的优先级,我们可以选择具有广泛性能特征的神经网络模型。MobileNets 在对付像 Inception 这样的重量级模型时表现得相当好,运行速度也快得多。模型文件的大小也小了很多——如果您希望定期将更新的模型推送到用户设备上,这是非常重要的。

量化是在受限硬件上获得良好性能的技巧之一。神经网络模型可以被压缩和简化,就像图像可以被压缩成 JPEG 文件一样。当我们这样做时,不仅神经网络变得小了很多,而且它也运行得更快了。不幸的是,目前的移动 GPU 技术对量化模型的支持有限,因此它们最终只能在 CPU 上运行。不过,随着硬件的发展,这种情况可能很快就会改变。

选择具有不同执行时间和精度的模型意味着我们可以选择一个适合用户工作流的模型。但是,要注意运行你的应用程序的各种硬件,尤其是 Android。遗留设备可能需要更长的时间,所以在 UI 中找到一个合适的方法来处理任何潜在的长时间运行的操作。

这就是目前人工智能和移动设备的全部内容。在下一篇文章中,我们将关注人在回路中以及用户交互如何帮助保持人工智能模型的新鲜和最新。

Rupert Thomas 是一名技术顾问,专门研究机器学习、机器视觉和数据驱动产品。@ Rupert 托马斯

本文原载于black lab . ai

参考

  1. 用户界面响应时间—史蒂夫·亨蒂
  2. 响应时间:3 个重要限制—雅各布·尼尔森
  3. TFLite 图像分类模型性能
  4. 材料设计—进度指标
  5. 比较五大计算机视觉 API

使用蒙特卡罗模拟和概率锥改进你的算法交易

原文:https://towardsdatascience.com/improving-your-algo-trading-by-using-monte-carlo-simulation-and-probability-cones-abacde033adf?source=collection_archive---------2-----------------------

使用统计技术来提高你交易成功的几率

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

我对将统计工具应用于现实世界的介绍并不好。我在一家中型航空航天公司负责质量保证。虽然我们在工厂车间广泛使用统计过程控制(SPC ),但我们现在决定使用一些先进的统计工具,如实验设计,来纠正棘手的制造污染问题。

我把任务交给了我的博士统计学家。在回顾了这个项目之后(在进行任何实验之前),他回来问我“现在我理解了这个项目,你想向你的老板(首席执行官)提出什么结论?无论你选择什么结论,我都可以从实验和统计的角度来证明。”

我还以为。使用统计学不是为了找到答案,而是为了支持一个“宠物”答案,任何宠物答案。这让我畏缩。不出所料,我把这个项目交给了一个希望实验推动结论的人,而不是相反。

这些天来,我喜欢用统计数据来证明一个信念,而不是引导我走上一条明智的道路。

我是一个算法交易者,统计工具对我帮助很大。在这篇文章中,我将介绍如何使用蒙特卡罗模拟和概率锥来更有效地交易。

在我开始讨论之前,先提醒几句。首先,我绝不是统计学专家。除了参加一些本科和研究生水平的统计学课程,我对统计学的许多方面一无所知。我绝对不是蒙特卡洛分析或概率锥的专家。

我擅长的是作为日常实践者使用这些工具。我可能在做一些纯粹主义者会嗤之以鼻的事情,但这对我来说没问题。最后,我知道这些工具,以及我如何使用它们,对我的交易有很大帮助。交易利润说话,他们告诉我,我做的事情是对的——也许只是理论上不对。

此外,这里显示的所有交易结果都是假设的。过去的表现不代表未来的结果,你应该只用你能承受损失的钱来交易。交易风险很大。

抛开这些免责声明,让我们来谈谈这些工具,以及我如何在我的算法交易中使用它们。

什么是蒙特卡洛分析?

抛一枚硬币,你知道它正面着地的几率是 50%。假设你每出现一个正面就赢 1.25 美元,每出现一个反面就输 1 美元。你有 10 美元的资金,如果跌到 6 美元,你就会退出。那是你的毁灭点。问题是,这种情况发生的几率有多大?

对于这样一个简单的例子,你可以在维基百科上找到一个近似结果的理论方程:https://en.wikipedia.org/wiki/Risk_of_ruin

但是,如果情况更复杂呢?如果有各种各样的可能结果,而不是一个双头硬币,硬币有 25 个面,所有被选中的概率都不同,会怎么样?在这种情况下,理论计算变得更加困难,甚至不可能。

进入蒙特卡洛分析。蒙特卡罗分析利用计算机模拟来解决问题、计算概率等,而无需求解理论方程。这在理论上的答案甚至不可能得到的情况下尤其有用。

蒙特卡洛分析被广泛应用于各种领域,包括一些你可能想象不到的领域。在 20 世纪 40 年代,蒙特卡罗模拟实际上被用于第一颗原子弹的研制。我在交易中使用它,这是一种更温和的方法(虽然交易账户有时会爆炸!).

当在交易中使用时,蒙特卡罗可以帮助建立许多重要性能指标的概率:

破产的风险

最大和中值下降

年回报率

回流/提取比率

有了这些信息,交易者可以在策略选择、头寸规模、资本部署和分配方面做出更明智的决策。

如何在交易中使用蒙特卡洛

在典型的形式中,蒙特卡罗分析采用假设回溯测试产生的所有交易,并随机选择一笔又一笔交易来产生一条权益曲线。这个想法是,通过一个适当设计的回溯测试,对未来表现的最佳估计来自于使用过去的交易(稍后,我将讨论为什么这可能不成立的许多原因)。

这方面的一个例子如图 1 所示。

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

Figure 1- Hypothetical Backtest Curve, With Multiple Possible Future Paths

深蓝色的粗曲线是假设的回溯测试,而细曲线显示了权益曲线未来可能走的一些路径。未来曲线是基于从回溯测试曲线中随机选择的交易。( **注:**在本例中,采用了一种称为“置换取样”的方法。基于随机选择过程,回溯测试中的每笔交易都可以选择多次。有些交易可能根本就不选。这导致期末权益价值的范围很广。如果使用“无替换抽样”,那么最终所有的权益曲线将收敛到一个共同的终点,因为每个回溯测试交易使用一次,而且只有一次。

当蒙特卡洛运行时,会生成成千上万条潜在的未来曲线。然后可以对这些结果进行分析,为未来的表现建立概率。

我通常是这样考虑蒙特卡洛的:当你执行历史回溯测试时,在你运行蒙特卡洛分析之前,你会得到一条发生了什么的权益曲线,如图 2 中的权益曲线。

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

Figure 2- Hypothetical Backtest Curve

毫无疑问——这就是实际发生的情况。但是,如果事情略有不同呢?举例来说,如果交易在回溯测试中以不同的顺序出现会怎样?

在这种情况下,图 3 所示的任何权益曲线(路径)都可能发生。

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

Figure 3- Slightly Altered History Leads To Different Possible Equity Curves

当然,许多其他未显示的路径也可能发生。因此,通过使用蒙特卡洛分析,并结合结果,我们可以得出某些事件发生的概率。

使用蒙特卡洛的优势

对我来说,蒙特卡洛分析的最大优势是它改变了我对 T2 算法交易的看法。当我开始思考交易中的概率时,蒙特卡洛强迫你这么做,我发现自己做出了更好的决定。例如,我不再认为“市场肯定会下跌”。相反,我想“市场可能会下跌,但如果不会,我会安全吗?”

以典型的交易者为例,在我们的交易生涯中,我们都曾有过这样或那样的经历。你在周一开始交易一个新的策略,一个历史上表现很好的策略。但是在连续 4 次实时亏损后,你就放弃了这个系统,因为在回溯测试中你只有 3 次连续亏损。然后你继续下一个策略,永无止境地追求完美。当然,在你退出后不久,你原来的方法就从 4 个失败者那里恢复了。不幸的是,你没有享受到康复的乐趣!

如果你通过蒙特卡洛模拟运行你的系统,也许它会显示 40%的机会连续 4 次失败。然后,当 4 个失败者真的发生时,你会感到沮丧,但你可能没有放弃这个策略。毕竟,你知道有 40%的可能性会出现这么多连续的输家。

这样蒙特卡洛才能真正帮助你理解自己的交易策略。虽然我在我的 algo 交易中使用它,但它可以被任何交易者使用,只要他或她有有效和稳定的交易历史。然而,要求有效的交易历史也导致该技术的一些严重缺点。

蒙特卡洛的弊端

使用蒙特卡罗进行 algo 交易策略分析存在相当多的危险。第一个缺点是历史结果需要稳定。我说的“稳定”不是指实际的交易结果,而是指交易方法。坚持用相同的系统或方法交易的交易者有稳定的方法。一个交易者周一尝试 algo 交易,周二随机猜测,周三订单流交易,没有稳定的方法。

如果你不断调整你的交易方法,你的历史交易将毫无意义。对于有效的蒙特卡罗分析,历史结果应该是一致的;整个回溯测试只有一种策略,或者一种方法。

一个相关的概念是如果市场发生重大变化。当市场发生“阶跃”变化时,蒙特卡洛分析不再有效。这方面的一个例子是瑞士央行 2015 年的行动。2015 年 1 月 15 日,这家瑞士银行取消了它在 2011 年确立的与瑞士法郎挂钩的所谓“挂钩”政策。这种挂钩将瑞士法郎的价值与欧元挂钩。

随着联系汇率突然取消,市场反应激烈,再也没有回到以前的状态。因此,考虑到 2015 年市场的结构性变化,对 2011 年至 2015 年的历史结果使用蒙特卡洛毫无意义。人们不能合理地预期过去 2011 年至 2015 年期间进行的交易会持续到 2015 年及以后。市场已经发生了根本性的变化。

蒙特卡罗的另一个可能的缺点是交易的序列相关性。序列相关性是交易历史的一个特征,其中当前交易结果依赖于(相关于)先前的交易结果。标准的蒙特卡罗分析假设每笔交易都独立于前一笔交易。我的经验表明,对于许多交易系统来说,这通常是正确的(或者实际上是正确的)。

所以,如果你有一个具有序列相关性的策略(不管是不是特别内置的),蒙特卡罗结果将是错误的。一个简单的均线交叉系统就是这样的例子,信号根据之前交易的盈亏而变化。下面给出了串行相关策略的伪代码。

非序列相关策略

如果收盘穿越 10 日均线,那么买入

如果收盘价低于 10 日均线,那么卖空

串行相关策略

如果收盘穿越 10 日均线,则

如果之前的交易有利可图,则卖空

如果之前的交易没有盈利,那么买入

如果收盘价低于 10 日均线,则

如果之前的交易有利可图,那么买入

如果之前的交易无利可图,则卖空

序列相关系统将包含一个历史,其中交易[i]的结果依赖于交易[i-1]的结果。当进行传统的蒙特卡罗分析时,这种重要的依赖性将会消失。幸运的是,在这种情况下,有一些方法既可以检测序列相关性,又可以随后用改进的蒙特卡罗分析来处理它(超出了本文的范围)。

蒙特卡洛的最后一个缺点是古老的计算机编程格言“垃圾进,垃圾出”除了在这种情况下,它更像是“杰作进,杰作出。”

这是什么意思?简而言之,如果你的回溯测试看起来很棒,那可能是因为曲线拟合、过度优化、事后诸葛亮等等。在这种情况下,回溯测试杰作将产生一个很好的蒙特卡洛结果——破产的可能性很小,提款概率很小等等。

在这种情况下,蒙特卡洛模拟实际上会让你过于自信,并导致你做出一些糟糕的决定。所以,如果结果看起来好得不真实,你应该小心。在大多数情况下,他们可能是!

从一个示例案例开始

市场上有许多免费的和商业的蒙特卡罗模拟器,都有不同的功能和特性。一个很好的免费模拟器可以从 TickQuest 获得。这个特殊的模拟器有一些可视化结果的好方法。

另一个免费的模拟器是我为微软 Excel 创建的,可以在我网站的计算器页面上找到。Excel 版本的好处是,如果你可以用 Excel 宏语言编程,你可以很容易地扩展模拟器的功能。这使得它非常适合想要增加头寸规模和其他功能的自己动手的交易者。

我将使用我的免费 Excel 蒙特卡洛模拟器作为下面的例子。

首先,在运行蒙特卡洛分析之前,你必须对交易进行历史回溯测试。这是由您使用的交易平台为您选择的策略和工具生成的。交易结果可在策略绩效报告中找到。如前所述,关键是交易结果不要过度优化或曲线拟合,因为这将给出过于乐观的模拟结果。

交易显示在图 4 的权益曲线中,前 10 笔交易显示在图 5 中。

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

Figure 4- Sample Equity Curve

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

Figure 5 — First 10 Trades For Sample Equity Curve (From Strategy Backtest)

这些交易代表大约一年的交易结果,有 150 笔交易,19,000 美元的利润和大约 7,000 美元的最大亏损。

有几点需要注意:首先,这里使用的交易结果不一定代表一个好的或坏的策略——它仅仅是一个例子。第二,可靠的蒙特卡罗分析通常包括 5-10 年的回溯测试结果。这个样本策略只有一年。

要运行模拟器,需要以下数字,如图 6 所示:

A —回溯测试的交易结果

B —模拟的起始权益(模拟器还将运行 10 个额外的起始权益值,从您输入的值开始递增)

C —退出股权点——如果在模拟过程中股权下降到低于该金额,模拟运行将停止,并被视为“破产”的情况很多时候,该值被设置为交易交易所的最低要求保证金,因为这是账户中启动新交易所需的最低金额。

D —一年的平均交易次数。模拟器运行了 1 年,进行了许多交易。

E —系统名称标识符

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

Figure 6- Inputs for Monte Carlo Simulation

一旦输入了所有需要的值,用户点击“计算”按钮,模拟开始。模拟器为 11 个不断增长的股票价值中的每一个运行 2500 个案例。结果显示在图 7 f 部分的表格中

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

Figure 7- Monte Carlo Output Results

蒙特卡洛结果

黄色表格包含蒙特卡洛模拟的结果:

G — Ruin:如果你用这个系统交易一年,一年时间内跌破退出点权益©的概率是多少?这就是破产的风险百分比。

H —中值下降:基于 2,500 次模拟运行,您有 50%的机会在第一年中获得高于所示值的最大下降。您希望这个数字尽可能低。请记住,即使有这个提款值,你仍然有 50%的机会,你的提款实际上会更高。相反,你也有 50%的机会,你的最大提款将会降低。

I —中间利润:基于 2500 次模拟运行,您有 50%的机会在第一年获得高于所示值的最大利润。您希望这个数字尽可能高。请记住,由于这是一个中间利润值,你的利润实际上很有可能会更低或更高。

J —中值回报:基于 2500 次模拟运行,你有 50%的机会在第一年获得高于所示数值的最大百分比回报。您希望这个数字尽可能高。同样,更高或更低的值都有 50%的可能性。

K —收益/DD 比率:收益对提取比率。与 Calmar 比率密切相关,Calmar 比率将回报和下降合并为一个指标。return/dd 值越高通常越好。不过要小心——如果 return/dd 太高,这可能意味着过度拟合。如果价值太低,你为给定回报所要承受的风险就会太高,这个策略就不值得交易。

L — Prob > 0:如果你用这种策略交易一整年,那么这一年盈利的可能性。

敏锐的读者会注意到,对于提款、利润和回报,给出了 2,500 次模拟运行的中值。这显然忽略了一些最糟糕的情况,许多交易者对此更感兴趣。电子表格是完全解锁的,因此可以修改这些值来反映任何所需的百分比。例如,第 95 百分位的提款通常很受欢迎。

假设蒙特卡洛结果是可接受的,交易者现在可以决定过渡到实时交易(模拟或用真钱)。这种现场表演可以通过使用概率锥来测量和跟踪。

什么是概率锥?

在制造业中,生产优质零件的最佳方式之一是在工厂车间利用统计过程控制(SPC)。SPC 帮助生产团队监控制造过程,并在不良零件生产出来之前采取措施。

在交易中,SPC 技术可以用来监控交易系统的性能。一种方法是使用控制图。图 8 显示了一个例子。

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

Figure 8- Statistical Process Control Chart

对于这种方法,记录每个交易结果,如果满足某些条件(例如,如果一个零件[交易]超出或低于 3 sigma 水平),则流程(策略)被视为失控,可能需要采取措施。在交易中,这可能就像关闭策略一样简单。

不过,使用控制图来监控交易系统的表现有一些问题。一个问题是,对于“失控”的情况有许多规则,并不是所有的规则都适用于大多数交易系统中的非序列相关交易。我的经验是,控制图可能有用,但并不理想。

监控实时交易表现的一个更好的方法是使用概率锥,也称为累积图。图 9 显示了一个示例图表。

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

Figure 9- Sample Probability Cone Chart

在此图表中,绘制了以下值:

回溯测试权益曲线(黑线)

回测的平均性能(灰线)

在策略开发结束时,策略进入实时交易阶段:

上部概率圆锥带(绿色实线和虚线)

低概率锥形带(实线和红色虚线)

实际交易,真钱还是模拟(蓝线)

如果实时股票曲线高于或低于绿色和红色定义的波段,很多时候停止交易是明智的,直到交易系统回到正常区域-在红色和绿色虚线之间。

如何在交易中使用概率锥

概率锥是监控交易系统实时表现的一种相对简单的方法。如果你有很多交易系统要监控,这是很理想的,对于多样化的算法交易者来说经常是这样。

开始分析只需要 4 个数字:

M——回溯测试中每笔交易的平均利润

N —交易回溯测试结果的标准差

O —内带阈值,表示为平均值以上的标准差

P —外带阈值,表示为平均值以下的标准偏差

一旦建立了分析,当交易实时结束时,每个单独的交易被添加到 Q 列。蓝色曲线描绘了这些交易。

图 10 显示了一个例子。

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

Figure 10 — Inputs For Probability Cones

因为概率锥分析是蒙特卡洛分析的自然延伸,所以我在蒙特卡洛工作簿中为它提供了一个单独的工作表。

使用概率锥的优势

使用概率锥的最大好处是对结果没有隐瞒。如果与回溯测试相比,您的实时策略表现不佳,这一点很明显(参见图 11)。

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

Figure 11- When Cone Levels Are Crossed, Strategy Should Be Stopped

概率圆锥图帮助交易者做出公正的决定。例如,这可能有助于决定何时停止交易,这通常是一件情绪激动的事情(谁喜欢放弃他们用血汗和眼泪创造的策略?).

概率圆锥图的另一个优点是它实现简单,易于理解。如果股票曲线在上限和下限之间,交易系统很可能运行正常。如果权益曲线超过上限,谨慎是有保证的,因为这种良好的表现比预期好得多。诚然,这是一件好事,但市场发生变化了吗?系统会很快开始表现不佳,回到它的长周期平均水平吗?

如果权益曲线低于下限,也许系统坏了,或者市场变了。停止交易这种策略可能是合适的。

概率锥的缺点

即使这些圆锥是一个很好的工具,也有一些缺点。首先,对于具有非正态分布结果的策略,圆锥可能是不准确的。在这种情况下,建议使用回溯测试交易结果通过蒙特卡洛模拟生成上下曲线,而不是仅使用平均值和标准差。这种方法将提供更精确的波段。

该工具的第二个缺点是决定上下波段值。是否应该使用 1 标准差?在这种情况下,波段将更接近平均值,由于正常波动,策略可能会过早关闭。另一方面,如果使用了 3 个标准差波段,在现场交易突破其中一个波段之前,可能要交易很多次。这可能意味着一项失败的战略会损失大量资金。

概率锥的最后一个缺点是,正如蒙特卡罗分析一样,分析的效用是后验测试结果的直接函数。在后验测试结果过拟合或过优化的情况下,圆锥不会有很大帮助。一个过度优化的系统最终会跌破下限,但前提是交易者在交易一个不应该交易的系统时出现不必要的亏损。

样本案例

继续使用之前在蒙特卡洛分析中显示的相同交易系统,我们可以使用概率锥分析来监控我们的实时交易表现。

要进行这种分析,唯一需要的额外数字是实时交易结果(图 10 中的 Q)和内外带值(图 10 中的 O 和 P)。这些都输入到电子表格中,如图所示。

内带和外带西格玛值以标准差的数量输入,给出了基于正态曲线的概率:

1 标准偏差= 68%的实时权益曲线应落在上下内带内

2 标准差= 95%的实时权益曲线应落在上下外带内

图 11 显示了一个实时交易结果的示例。在这种特殊情况下,策略性能明显下降。许多交易者会考虑在下方的红色实线被突破时关闭策略。更保守的交易者会在虚线红线水平关闭策略。

但是,如果发生了这样的事件,仍然应该跟踪策略。如果策略表现后来有所改善,那么交易者可以考虑恢复交易策略。

结论

统计工具,如蒙特卡洛分析和概率锥,可以为交易者提供有用的交易系统信息。通过正确使用这些工具,交易者可以避免交易一个糟糕的策略,也可以知道什么时候停止交易一个表现不佳的系统。这些工具让交易者更容易控制(没有双关语的意思!)的交易。

虽然这些工具很有用,但请注意它们只是工具。交易者必须仍然负责,由交易者决定每次分析的结论是否恰当,是否应该遵循。盲目地遵循这一点(或任何分析)可能是危险的。我个人发现蒙特卡罗和概率锥都是有用的,但我知道它们的局限性和缺点。总的来说,我觉得这些工具让我成为更好的交易者,这是真正的终极考验。

10 分钟内:为数据专业人员提供美味汤和硒的网络刮擦

原文:https://towardsdatascience.com/in-10-minutes-web-scraping-with-beautiful-soup-and-selenium-for-data-professionals-8de169d36319?source=collection_archive---------1-----------------------

分析权威指南

使用 BS4 和 Selenium 快速从维基百科和电子商务中提取关键信息

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

WebScraping — Free Image

介绍

网络抓取是从网站和在线内容中提取有价值信息的过程。这是一种提取信息和接收数据集以供进一步分析的免费方法。在这个信息实际上高度相关的时代,我相信网络抓取提取替代数据的需求是巨大的,尤其是对我这个数据专业人员来说。

本书的目标是让你了解使用快速和肮脏的 Python 代码搜集任何公开可用信息的几种方法。只需花 10 分钟来阅读这篇文章——或者更好的是,投稿。然后你可以快速浏览一下你的第一个网络抓取工具的代码。

在这篇文章中,我们将学习如何从维基百科和电子商务(Lazada)中抓取数据。我们将清理、处理数据,并将数据保存到中。csv 文件。我们会用美汤和硒作为我们主要的网页抓取库。

什么是美汤和硒

美味的汤

Beautiful Soup 将 HTML 解析成机器可读的树格式,以便快速提取 DOM 元素。它允许提取特定段落和具有特定 HTML ID/Class/XPATH 的表格元素。

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

Parsing of DOM elements compared to Tree Dir Folder

每当我需要一个快速和肮脏的方法来提取网上信息。我将永远把 BS 作为我的第一步。通常我会在不到 10 分钟的时间内提取 15 行代码。

[## 美丽的汤文档-美丽的汤 4.4.0 文档

美汤 4 是通过 PyPi 发布的,如果不能用系统打包器安装,可以安装…

www.crummy.com](https://www.crummy.com/software/BeautifulSoup/bs4/doc/)

Selenium 是一款旨在实现 Web 浏览器自动化的工具。质量保证(QA)工程师通常使用它来自动测试 Selenium 浏览器应用程序。

此外,由于这些自动化功能,它对 web scrape 非常有用:

  1. 单击特定的表单按钮
  2. 在文本字段中输入信息
  3. 提取浏览器 HTML 代码的 DOM 元素

[## Selenium - Web 浏览器自动化

Selenium 得到了一些最大的浏览器供应商的支持,这些供应商已经(或正在)采取措施使 Selenium 成为一个…

www.seleniumhq.org](https://www.seleniumhq.org/)

编写你的第一个网络抓取工具

(Github 在本文末尾)

美味的汤

问题陈述

假设你是联合国大使,打算访问世界各地的城市,讨论关于气候变化的京都议定书的状况。你需要计划你的旅行,但是你不知道每个国家的首都。因此,你谷歌了一下,在维基百科上找到了这个链接。

[## 国家首都列表-维基百科

这是一个国家首都的列表,包括领土和属地的首都,非主权国家包括…

en.wikipedia.org](https://en.wikipedia.org/wiki/List_of_national_capitals)

在这个链接中,有一个表格将每个国家映射到首都。你会发现这很好,但你不会止步于此。作为一名数据科学家和联合国大使,您希望从维基百科中提取表格,并将其转储到您的数据应用程序中。你接受了挑战,用 Python 和 BeautifulSoup 编写了一些脚本。

步伐

我们将利用以下步骤:

  1. Pip 安装beautiful soup4、Pip 安装请求。请求将从 URL 获取 HTML 元素,这将成为 BS 解析的输入。
  2. 检查表格引用的是哪个 DOM 元素。右击鼠标并点击检查元件。Chrome 浏览器的快捷键是 CTRL+I (inspect)。
  3. 点击左上角的检查按钮突出显示您想要提取的元素。现在您知道了元素是 HTML 文档中的一个表格元素。

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

National Capitals Elements Wikipedia

4.在您的请求中添加标题和 URL。这将在维基百科链接中创建一个请求。标题对于欺骗您的请求很有用,这样它看起来就像来自合法的浏览器。

对于维基百科来说,这可能无关紧要,因为所有的信息都是开源的,可以公开获得。但对于其他一些网站,如金融交易网站(SGX),它可能会阻止没有合法标题的请求。

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36'}
url = "https://en.wikipedia.org/wiki/List_of_national_capitals"
r = requests.get(url, headers=headers)

5.启动 BS 和列表元素提取表格中的所有行

soup = BeautifulSoup(r.content, "html.parser")
table = soup.find_all('table')[1]
rows = table.find_all('tr')
row_list = list()

6.遍历表中的所有行,遍历每个单元格,将其添加到 rows 和 row_list 中

for tr in rows:
    td = tr.find_all('td')
    row = [i.text for i in td]
    row_list.append(row)

7.创建熊猫数据框架并将数据导出到 csv

df_bs = pd.DataFrame(row_list,columns=['City','Country','Notes'])
df_bs.set_index('Country',inplace=True)
df_bs.to_csv('beautifulsoup.csv')

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

Result of web scraping in csv

恭喜你!只需 7 个步骤和 15 行代码,你就成为了一名专业的 web scraper

美丽的汤的局限性

到目前为止,BS 为我们成功地进行了网络搜集。但是我发现根据问题的不同有一些限制:

  1. 请求过早地接受 html 响应,而不等待 Javascript 的异步调用来呈现浏览器。这意味着它不能获得 Javascript 异步调用(AJAX 等)生成的最新 DOM 元素。
  2. 在线零售商,如亚马逊或 Lazada 在网站上安装了反机器人软件,可能会阻止你的爬虫。这些零售商将关闭任何来自 Beautiful Soup 的请求,因为它知道这些请求不是来自合法的浏览器。

如果我们在 Lazada 和 Amazon 等电子商务网站上运行 Beautiful Soup,我们会遇到这种连接错误,这是由他们的反垃圾软件阻止机器人发出 http 请求造成的。

https connection pool(host = ‘www . Amazon . com ',port=443):超过 url 的最大重试次数:/(由 SSLError 引起(SSLError(1,’[SSL:CERTIFICATE _ VERIFY _ FAILED]证书验证失败(_ssl.c:833)'),))

解决这个问题的一个方法是使用客户端浏览器,并自动化我们的浏览行为。我们可以通过使用硒来实现这一点。

硒万岁!!

问题陈述

假设您正在创建价格波动模型来分析 Lazada 和 Amazon 等电子商务提供商。如果没有网络抓取工具,你需要雇人手动浏览大量的产品页面,并把价格一个一个地复制粘贴到 Excelsheet 中。这个过程是非常重复的,特别是如果你想每天/每小时收集数据点。这也将是一个非常耗时的过程,因为它涉及许多手动点击和浏览来复制信息。

如果我告诉你,你可以自动化这个过程:

通过让 Selenium 为您进行产品探索和点击。

通过让 Selenium 打开你的谷歌 Chrome 浏览器来模仿合法用户的浏览行为。

让 Selenium 将所有信息抽取到列表和 csv 文件中。

你很幸运,因为你所需要做的就是写一个简单的 Selenium 脚本,然后你就可以在睡个好觉的同时运行 web 抓取程序了。

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

Extracting Lazada Information and Products are time consuming and repetitive

安装

  1. 皮普安装硒
  2. 安装硒浏览器。请参考此链接确定您最喜欢的浏览器(Chrome、Firefox、IE 等)。将它放在与项目相同的目录中。如果你不确定使用哪一个,可以从下面的 Github 链接下载。
  3. 包括这些导入
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException

4.通过插入可执行路径和 url 驱动 Selenium Chrome 浏览器。在我的例子中,我使用相对路径来查找位于与我的脚本相同的目录中的 chromedriver.exe。

driver = webdriver.Chrome(executable_path='chromedriver')
driver.get('https://www.lazada.sg/#')

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

Selenium Running Chrome and Extract Lazada and Redmart Data

5.等待页面加载并找到元素。这就是 Selenium 与 Requests 和 BS 的不同之处。您可以指示页面等待,直到呈现出某个 DOM 元素。之后,它会继续运行它的网络抓取逻辑。

您可以停止等待,直到满足预期条件(EC)以通过 ID*“Level _ 1 _ Category _ No1”进行查找。*如果已经过了 30 秒没有找到该元素,则通过 TimeoutException 关闭浏览器。

timeout = 30
try:
    WebDriverWait(driver, timeout).until(EC.visibility_of_element_located((By.ID, "Level_1_Category_No1")))
except TimeoutException:
    driver.quit()

恭喜你。我们已经设置了 Selenium 来使用我们的 Chrome 浏览器。现在我们已经准备好自动化信息提取了。

信息提取

让我们从 Lazada 网站中识别几个属性,并提取它们的 DOM 元素。

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

Extracting the DOM Elements via ID, Class, and XPATH Attributes

  1. find_element by ID 返回相关的类别列表。
category_element = driver.find_element(By.ID,'Level_1_Category_No1').text;
#result -- Electronic Devices as the first category listing

2.获取无序列表 xpath (ul)并提取每个列表项的值(li)。您可以检查元素,右键单击并选择 copy > XPATH 来轻松地生成相关的 XPATH。请随意打开以下链接了解更多详情。

[## 如何在 Chrome 和 IE 浏览器中定位元素以构建 Selenium 脚本- Selenium 教程…

这是我们 Selenium 在线培训系列的教程#7。如果您想查看本系列的所有 Selenium 教程…

www.softwaretestinghelp.com](https://www.softwaretestinghelp.com/locate-elements-in-chrome-ie-selenium-tutorial-7/)

list_category_elements = driver.find_element(By.XPATH,'//*[@id="J_icms-5000498-1511516689962"]/div/ul')
links = list_category_elements.find_elements(By.CLASS_NAME,"lzd-site-menu-root-item")
for i in range(len(links)):
    print("element in list ",links[i].text)
#result {Electronic Devices, Electronic Accessories, etc}

点击和操作

  1. 自动行动。假设你想从 Lazada 主页浏览 Redmart,你可以模仿点击 ActionChains 对象。
element = driver.find_elements_by_class_name('J_ChannelsLink')[1]
webdriver.ActionChains(driver).move_to_element(element).click(element).perform()

从 Redmart 提取所有产品列表

  1. 创建产品标题列表。我们可以提取并打印它们如下
product_titles = driver.find_elements_by_class_name('title')
for title in product_titles:
    print(title.text)

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

Redmart Best Seller Title Extractions

2.提取产品名称、包装尺寸、价格和等级。我们将打开几个列表来包含每一项,并将它们转储到一个数据帧中。

product_containers = driver.find_elements_by_class_name('product_container')

for container in product_containers:    product_titles.append(container.find_element_by_class_name('title').text)
pack_sizes.append(container.find_element_by_class_name('pack_size').text)    product_prices.append(container.find_element_by_class_name('product_price').text)
rating_counts.append(container.find_element_by_class_name('ratings_count').text)

data = {'product_title': product_titles, 'pack_size': pack_sizes,'product_price': product_prices, 'rating_count': rating_counts}

3.将信息转储到熊猫数据帧和 csv 中

df_product = pd.DataFrame.from_dict(data)
df_product.to_csv('product_info.csv')

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

CSV Dump for each of the product in Best Seller Redmart

恭喜你。你已经有效地扩展了你的技能,提取任何网上找到的信息!

目的、Github 代码和您的贡献

这个概念证明(POC)的目的是作为我自己的项目的一部分创建的。这个应用程序的目标是使用 web 抓取工具来提取任何公共可用的信息,而不需要太多的成本和人力。

在这个 POC 中,我使用 Python 作为脚本语言,Beautiful Soup 和 Selenium library 提取必要的信息。

Github Python 代码位于下面。

[## Vincent tatan/网页抓取

美汤硒网刮。为 VincentTatan/Web 抓取开发做出贡献,创建一个…

github.com](https://github.com/VincentTatan/Web-Scraping)

您可以随意克隆这个库,并在有时间的时候贡献自己的一份力量。

美汤和股票投资

代替今天关于 python 和 web 抓取的主题。你也可以看看我的另一篇关于为有抱负的投资者搜集信息的文章。您应该尝试通过这个演示来指导您编写快速而肮脏的 Python 代码,以便收集、分析和可视化股票。

[## 价值投资仪表盘,配有 Python Beautiful Soup 和 Dash Python

价值投资的 Web 抓取与快速 Dash 可视化概述

towardsdatascience.com](/value-investing-dashboard-with-python-beautiful-soup-and-dash-python-43002f6a97ca)

希望从这篇相关的出版物中,您可以学习如何收集关键信息并开发有用的应用程序。如果你喜欢,请阅读并联系我。

最后…

咻…就是这样,关于我的想法,我把它写成了文字。我真的希望这对你们来说是一个伟大的阅读。因此,我希望我的想法可以成为你发展和创新的灵感来源。

在下面评论出来建议和反馈。

快乐编码:)

关于作者

Vincent Tatan 是一名数据和技术爱好者,拥有在 Visa Inc .和 Lazada 实施微服务架构、数据工程和分析管道项目的相关工作经验。

Vincent 是土生土长的印度尼西亚人,在解决问题方面成绩斐然,擅长全栈开发、数据分析和战略规划。

他一直积极咨询 SMU BI & Analytics Club,指导来自不同背景的有抱负的数据科学家和工程师,并为企业开发他们的产品开放他的专业知识。

请通过 LinkedIn Medium Youtube 频道 联系文森特

免责声明

本免责声明告知读者,文中表达的观点、想法和意见仅属于作者,不一定属于作者的雇主、组织、委员会或其他团体或个人参考文献是从列表中挑选的,与其他作品的任何相似之处纯属巧合

这篇文章纯粹是作者的个人项目,与任何其他隐藏的目的无关。

12 分钟:熊猫和 Scikit 的股票分析-学习

原文:https://towardsdatascience.com/in-12-minutes-stocks-analysis-with-pandas-and-scikit-learn-a8d8a7b50ee7?source=collection_archive---------0-----------------------

使用 Python 快速分析、可视化和预测股票价格

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

Predicting Stocks with Data Analysis

一天,我的一个朋友告诉我,财务自由的关键是投资股票。虽然在市场繁荣时期这是非常正确的,但在今天兼职交易股票仍然是一个有吸引力的选择。鉴于网上交易平台的便捷性,有许多自我价值投资者或家庭主妇交易者。甚至有成功的故事和广告吹嘘“快速致富计划”,学习如何投资股票,回报率高达 40%甚至更多。如今,投资已经成为职业人士的福音。

**现在的问题是:**哪些股票?你如何分析股票?与竞争对手相比,这只股票的回报和风险如何?

本书的目的是让你了解一种使用快速而肮脏的 Python 代码来分析股票的方法。只需花 12 分钟来阅读这篇文章——或者更好的是,投稿。然后,你可以快速浏览一下,编写你的第一份财务分析。

为了开始学习和分析股票,我们将从快速浏览历史股票价格开始。这将通过从熊猫网络数据阅读器和雅虎财经中提取最新的股票数据来完成。然后,我们将尝试通过探索性分析来查看数据,例如关联热图、matplotlib 可视化以及使用线性分析和 K 近邻(KNN)的预测分析。

正在加载 YahooFinance 数据集

Pandas web 数据阅读器是 Pandas 库的扩展,用于与最新的金融数据进行通信。这将包括以下来源:雅虎财经、谷歌财经、英格玛等。

我们将使用以下代码提取苹果股票价格:

**import** **pandas** **as** **pd**
**import** **datetime**
**import** **pandas_datareader.data** **as** **web**
**from** **pandas** **import** Series, DataFrame

start = datetime.datetime(2010, 1, 1)
end = datetime.datetime(2017, 1, 11)

df = web.DataReader("AAPL", 'yahoo', start, end)
df.tail()

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

Stocks Prices from Yahoo Finance

这段代码将提取从 2010 年 1 月到 2017 年 1 月的 7 年数据。如果你认为有必要,可以随意调整开始和结束日期。在接下来的分析中,我们将使用收盘价,它表示股票在一天结束时的最终交易价格。

探索股票的滚动平均和收益率

在这个分析中,我们使用两个关键指标来分析股票:滚动平均值和回报率。

滚动平均(移动平均)——确定趋势

滚动平均/移动平均(MA)通过创建不断更新的平均价格来平滑价格数据。这有助于减少价格图表中的“噪音”。此外,这种移动平均线可以作为“阻力”,这意味着从股票的下跌趋势和上涨趋势中,你可以预计它将跟随趋势,不太可能偏离其阻力点。

[## 如何用均线买股票

移动平均线(MA)是一个简单的技术分析工具,它通过创建一个持续的…

www.investopedia.com](https://www.investopedia.com/articles/active-trading/052014/how-use-moving-average-buy-stocks.asp)

让我们开始计算滚动平均值:

close_px = df['Adj Close']
mavg = close_px.rolling(window=100).mean()

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

The Last 10 Moving Average

这将计算股票收盘价的最后 100 个窗口(100 天)的移动平均值,并取每个窗口移动平均值的平均值。正如你所看到的,移动平均线在窗口内稳步上升,并不跟随股价图的锯齿状线。

为了更好的理解,让我们用 Matplotlib 把它画出来。我们将移动平均线与股票价格图重叠。

%matplotlib inline
import matplotlib.pyplot as plt
from matplotlib import style

*# Adjusting the size of matplotlib*
import matplotlib as mpl
mpl.rc('figure', figsize=(8, 7))
mpl.__version__

*# Adjusting the style of matplotlib*
style.use('ggplot')

close_px.plot(label='AAPL')
mavg.plot(label='mavg')
plt.legend()

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

Apple Stocks Price with The Moving Average (mavg)

移动平均线使线变得平滑,显示股票价格的上升或下降趋势。

在这张图表中,移动平均线显示了股价上涨或下跌的上升趋势。从逻辑上讲,你应该在股票下跌时买入,在股票上涨时卖出。

回报偏差——确定风险和回报

预期回报衡量投资回报的概率分布的平均值或期望值。投资组合的预期回报的计算方法是将每项资产的权重乘以其预期回报,然后将每项投资的价值相加——Investopedia。

下面是你可以参考的公式:

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

Formula for Returns

基于这个公式,我们可以将我们的回报绘制如下。

rets = close_px / close_px.shift(1) - 1rets.plot(label='return')

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

Plotting the Return Rate

从逻辑上讲,我们理想的股票回报应该尽可能的高且稳定。如果你是风险厌恶者(像我一样),你可能会想避开这类股票,因为你看到了 2013 年 10%的跌幅。这个决定很大程度上取决于你对股票的总体看法和对竞争对手的分析。

分析竞争对手的股票

在这一部分,我们将分析一家公司相对于其竞争对手的表现。让我们假设我们对科技公司感兴趣,并想比较一下*大公司:*苹果、通用电气、谷歌、IBM 和微软。

dfcomp = web.DataReader(['AAPL', 'GE', 'GOOG', 'IBM', 'MSFT'],'yahoo',start=start,end=end)['Adj Close']

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

Stocks Price for Apple, General Electrics, Google, IBM, and Microsoft

这将返回一个光滑的雅虎财经股票收盘价表。整洁!!

相关性分析——一个竞争对手会影响其他竞争对手吗?

我们可以通过运行熊猫的百分比变化和相关函数来分析竞争。百分比变化将发现多少价格变化相比,前一天的定义回报。了解相关性将有助于我们了解回报是否受到其他股票回报的影响

retscomp = dfcomp.pct_change()

corr = retscomp.corr()

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

让我们用散点图把苹果和通用电气画出来,看看它们的回报分布。

plt.scatter(retscomp.AAPL, retscomp.GE)
plt.xlabel(‘Returns AAPL’)
plt.ylabel(‘Returns GE’)

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

Scatter Plot of GE and AAPL

我们可以看到,通用电气的回报和苹果的回报之间存在轻微的正相关关系。似乎在大多数情况下,苹果的回报越高,通用电气的回报也越高。

让我们通过绘制 scatter_matrix 来进一步改进我们的分析,以可视化竞争股票之间可能的相关性。在对角点,我们将运行核密度估计(KDE)。KDE 是一个基本的数据平滑问题,根据有限的数据样本对总体进行推断。它有助于生成总体分布的估计值。

[## 核密度估计-维基百科

在统计学中,核密度估计(KDE)是一种估计概率密度函数的非参数方法

en.wikipedia.org](https://en.wikipedia.org/wiki/Kernel_density_estimation)

pd.scatter_matrix(retscomp, diagonal='kde', figsize=(10, 10));

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

KDE Plots and Scatter Matrix

从这里我们可以看到大多数股票之间近似正相关的分布。

为了证明正相关,我们将使用热图来可视化竞争股票之间的相关范围。请注意,颜色越浅,两只股票的相关性越强。

plt.imshow(corr, cmap='hot', interpolation='none')
plt.colorbar()
plt.xticks(range(len(corr)), corr.columns)
plt.yticks(range(len(corr)), corr.columns);

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

Heatmap of Correlations among competing stocks

从散点图和热图中,我们可以发现竞争股票之间有很大的相关性。然而,这可能不会显示因果关系,可能只是显示技术行业的趋势,而不是显示竞争股票如何相互影响。

股票回报率和风险

除了相关性,我们还分析每只股票的风险和回报。在这种情况下,我们提取回报率的平均值(回报率)和回报率的标准差(风险)。

plt.scatter(retscomp.mean(), retscomp.std())
plt.xlabel('Expected returns')
plt.ylabel('Risk')
**for** label, x, y **in** zip(retscomp.columns, retscomp.mean(), retscomp.std()):
    plt.annotate(
        label, 
        xy = (x, y), xytext = (20, -20),
        textcoords = 'offset points', ha = 'right', va = 'bottom',
        bbox = dict(boxstyle = 'round,pad=0.5', fc = 'yellow', alpha = 0.5),
        arrowprops = dict(arrowstyle = '->', connectionstyle = 'arc3,rad=0'))

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

Quick Scatter Plot among Stocks Risk and Returns

现在你可以看到这张简单的竞争股票的风险和回报对比图。从逻辑上来说,你想最小化风险,最大化回报。因此,你需要为你的风险回报承受能力画一条线(红线)。然后,你可以创建规则,买入红线以下的股票(MSFT、通用电气和 IBM),卖出红线以上的股票(AAPL 和谷歌)。这条红线展示了你的期望值阈值和你的买入/卖出决策基线。

预测股票价格

特征工程

我们将使用这三种机器学习模型来预测我们的股票:简单线性分析、二次判别分析(QDA)和 K 近邻(KNN)。但是首先,让我们设计一些特征:高/低百分比和百分比变化。

dfreg = df.loc[:,[‘Adj Close’,’Volume’]]
dfreg[‘HL_PCT’] = (df[‘High’] — df[‘Low’]) / df[‘Close’] * 100.0
dfreg[‘PCT_change’] = (df[‘Close’] — df[‘Open’]) / df[‘Open’] * 100.0

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

The end Data Frame Produced

预处理和交叉验证

在将数据放入预测模型之前,我们将使用以下步骤清理和处理数据:

  1. 丢弃缺失值
  2. 在这里分离标签,我们要预测 AdjClose
  3. 缩放 X,这样每个人都可以有相同的线性回归分布
  4. 最后,我们希望找到 X 年末和 X 年初(训练)的数据序列,用于模型生成和评估
  5. 分离标签并将其识别为 y
  6. 通过交叉验证训练测试分割分离模型的训练和测试

请参考下面的准备代码。

# Drop missing value
dfreg.fillna(value=-99999, inplace=True)# We want to separate 1 percent of the data to forecast
forecast_out = int(math.ceil(0.01 * len(dfreg)))# Separating the label here, we want to predict the AdjClose
forecast_col = 'Adj Close'
dfreg['label'] = dfreg[forecast_col].shift(-forecast_out)
X = np.array(dfreg.drop(['label'], 1))# Scale the X so that everyone can have the same distribution for linear regression
X = preprocessing.scale(X)# Finally We want to find Data Series of late X and early X (train) for model generation and evaluation
X_lately = X[-forecast_out:]
X = X[:-forecast_out]# Separate label and identify it as y
y = np.array(dfreg['label'])
y = y[:-forecast_out]

模型生成——预测乐趣的开始

但是首先,让我们为我们的 Scikit-Learn 插入以下导入:

**from** **sklearn.linear_model** **import** LinearRegression
**from** **sklearn.neighbors** **import** KNeighborsRegressor

**from** **sklearn.linear_model** **import** Ridge
**from** **sklearn.preprocessing** **import** PolynomialFeatures
**from** **sklearn.pipeline** **import** make_pipeline

简单线性分析和二次判别分析

简单的线性分析显示了两个或多个变量之间的线性关系。当我们在两个变量之间画这个关系时,我们得到一条直线。二次判别分析类似于简单的线性分析,只是该模型允许多项式(例如:x 的平方)并会产生曲线。

给定自变量(x)作为输入,线性回归预测因变量(y)作为输出。在绘图过程中,这将给我们一条直线,如下所示:

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

Simple Linear Regression

这是一个惊人的出版物,它展示了一个非常全面的线性回归审查。请参考下面的链接查看。

[## 用 Scikit 学习 Python 线性回归的初学者指南

有两种类型的监督机器学习算法:回归和分类。前者预测…

towardsdatascience.com](/a-beginners-guide-to-linear-regression-in-python-with-scikit-learn-83a8f7ae2b4f)

我们将即插即用现有的 Scikit-Learn 库,并通过选择我们的 X 和 y 训练集来训练模型。代码如下所示。

*# Linear regression*
clfreg = LinearRegression(n_jobs=-1)
clfreg.fit(X_train, y_train)*# Quadratic Regression 2*
clfpoly2 = make_pipeline(PolynomialFeatures(2), Ridge())
clfpoly2.fit(X_train, y_train)

*# Quadratic Regression 3*
clfpoly3 = make_pipeline(PolynomialFeatures(3), Ridge())
clfpoly3.fit(X_train, y_train)

k 最近邻(KNN)

该 KNN 使用特征相似度来预测数据点的值。这确保了分配的新点与数据集中的点相似。为了找出相似性,我们将提取点来释放最小距离(例如:欧几里德距离)。

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

KNN Model Visualization where you would group the questioned element in k number of elements

请参考此链接,了解有关该模型的更多详细信息。这对提高你的理解能力真的很有用。

[## k 近邻介绍:简化(用 Python 实现)

注意:这篇文章最初发表于 2014 年 10 月 10 日,更新于 2018 年 3 月 27 日

www.analyticsvidhya.com](https://www.analyticsvidhya.com/blog/2018/03/introduction-k-neighbours-algorithm-clustering/)

*# KNN Regression*
clfknn = KNeighborsRegressor(n_neighbors=2)
clfknn.fit(X_train, y_train)

估价

一种简单快速且肮脏的评估方法是在每个训练好的模型中使用评分方法。评分法用测试数据集的 y 值来计算 self.predict(X)的平均准确度。

confidencereg = clfreg.score(X_test, y_test)
confidencepoly2 = clfpoly2.score(X_test,y_test)
confidencepoly3 = clfpoly3.score(X_test,y_test)
confidenceknn = clfknn.score(X_test, y_test)# results
('The linear regression confidence is ', 0.96399641826551985)
('The quadratic regression 2 confidence is ', 0.96492624557970319)
('The quadratic regression 3 confidence is ', 0.9652082834532858)
('The knn regression confidence is ', 0.92844658034790639)

这显示了大多数模型的巨大准确性得分(> 0.95)。然而,这并不意味着我们可以盲目地放置我们的股票。仍然有许多问题需要考虑,特别是不同的公司,随着时间的推移有不同的价格轨迹。

为了进行健全性测试,让我们打印一些股票预测。

forecast_set = clf.predict(X_lately)
dfreg['Forecast'] = np.nan#result
(array([ 115.44941187,  115.20206522,  116.78688393,  116.70244946,
        116.58503739,  115.98769407,  116.54315699,  117.40012338,
        117.21473053,  116.57244657,  116.048717  ,  116.26444966,
        115.78374093,  116.50647805,  117.92064806,  118.75581186,
        118.82688731,  119.51873699]), 0.96234891774075604, 18)

绘制预测图

基于预测,我们将使用现有的历史数据来可视化绘图。这将有助于我们直观地看到模型如何预测未来的股票定价。

last_date = dfreg.iloc[-1].name
last_unix = last_date
next_unix = last_unix + datetime.timedelta(days=1)

**for** i **in** forecast_set:
    next_date = next_unix
    next_unix += datetime.timedelta(days=1)
    dfreg.loc[next_date] = [np.nan **for** _ **in** range(len(dfreg.columns)-1)]+[i]dfreg['Adj Close'].tail(500).plot()
dfreg['Forecast'].tail(500).plot()
plt.legend(loc=4)
plt.xlabel('Date')
plt.ylabel('Price')
plt.show()

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

Predictions Displayed in Plot

我们可以看到蓝色展示了基于回归的股票价格预测。该预测预测,经济低迷不会持续太久,然后就会复苏。因此,我们可以在下跌时买入股票,在上涨时卖出。

未来的改进/挑战

为了进一步分析股票,这里有一些关于你如何做贡献的想法。这些想法将有助于对股票进行更全面的分析。如果需要更多的澄清,请随时告诉我。

  • 分析经济定性因素,如新闻(新闻来源和情感分析)
  • 分析某个国家的 HPI、公司来源之间的经济不平等等经济数量因素

目的、Github 代码和您的贡献

本概念证明(POC)是作为我目前管理的投资方项目的一部分而创建的。这个应用程序的目标是帮助您快速检索和显示关于某个公司股票价格的正确的金融见解,并预测其价值。

在 POC 中,我使用 Pandas- Web Datareader 来查找股票价格,使用 Scikit-Learn 来预测和生成机器学习模型,最后使用 Python 作为脚本语言。Github Python 笔记本代码位于下面。

[## Python Analytics/第 3 课用于数据分析的基本 Python(股票预测)。主机上的 ipynb

这是一个存放我的 Kaggle 和 iPython 笔记本的地方——python analytics/第三课基础…

github.com](https://github.com/VincentTatan/PythonAnalytics/blob/master/Youtube/Lesson%203%20%20Basic%20Python%20for%20Data%20Analytics%20%28Stocks%20Prediction%29.ipynb)

您可以随意克隆这个库,并在有时间的时候贡献自己的一份力量。

价值投资

代替今天关于股票分析的话题。你也可以访问我的价值投资出版物,在那里我谈到了搜集股票金融信息,并将其显示在一个易于阅读的仪表板上,该仪表板根据价值投资方法处理股票估值。请访问并投稿:)。

[## 价值投资仪表盘,配有 Python Beautiful Soup 和 Dash Python

价值投资的 Web 抓取与快速 Dash 可视化概述

towardsdatascience.com](/value-investing-dashboard-with-python-beautiful-soup-and-dash-python-43002f6a97ca)

来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

感谢

我想感谢我的会计和金融朋友们,他们给了我关于这本书的建设性反馈。我真的很高兴得知你从我的出版物中获得了很多价值。

最后…向我伸出手

咻…就是这样,关于我的想法,我把它写成了文字。我真的希望这对你们来说是一个伟大的阅读。因此,我希望我的想法可以成为你发展和创新的灵感来源。

请通过我的 LinkedIn 联系我,订阅我的 Youtube 频道

如果你喜欢,请给我掌声

下面评论出来建议和反馈。

快乐编码:)

免责声明:本免责声明告知读者,文中表达的观点、想法和意见仅属于作者,不一定属于作者的雇主、组织、委员会或其他团体或个人参考文献从列表中挑选,与其他作品的任何相似之处纯属巧合

本文纯粹是作者的个人项目,绝无任何其他不可告人的目的。

在人工智能中就像在生活中一样…专注于旅程

原文:https://towardsdatascience.com/in-ai-as-in-life-focus-on-the-journey-dd2fe319cdaf?source=collection_archive---------28-----------------------

让人工智能工作的架构决策

现在的趋势是对机器学习和深度学习编程框架、课程和最流行的算法的巨大迷恋。梯度推进机器、支持向量机、卷积神经网络、递归神经网络和长短期记忆(LSTM)风靡一时。在线培训和课程多如牛毛。教育机构、企业甚至政府都在快速推出人工智能培训项目——很难跟上!

  • 285 亿美元-2019 年第一季度全球分配给机器学习的资金总额。(【statista.com】T2
  • 180 亿美元——未来五年人工智能助理市场的估计价值。(【teks.co.in】T4)
  • 1200 亿美元——到 2025 年底,人工智能驱动的硬件的估计全球销售额。(teks.co.in)
  • 13 万亿美元——人工智能到 2030 年可能带来的潜在全球经济。(mckinsey.com)
  • 14 倍——自 2000 年以来人工智能初创公司数量的增长率。(aiindex.org)

虽然人工智能的价值没有受到挑战——人工智能不仅仅是最热门的算法和 TensorFlow 或 Keras 中编写神经网络的几行代码——它需要一个完整的工作流程。从 ETL、预处理、特征工程、转换(以及代表实际算法的几行代码)、训练和推理——并使所有这些在生产环境中可扩展和健壮。问题不在于哪种算法或数学优化技术是最新的“时尚”问题是:如何使整个流程对组织可行?

这是人工智能工作流程的一个很好的代表:

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

Source: Building your AI data pipeline: The IBM IT Infrastructure Blog

这条管道的不同阶段具有不同的特征和相关的技术需求。例如:

接收或数据收集受益于边缘软件定义存储的灵活性,并要求高吞吐量。

数据分类和转换涉及聚合、规范化、分类数据以及用有用的元数据丰富数据的阶段需要极高的吞吐量,包括小型和大型 I/O。

模型训练需要一个性能层,能够以极高的吞吐量和低延迟支持机器学习和深度学习模型训练中涉及的高度并行的过程。

带推理的模型再训练不需要那么大的吞吐量,但仍然要求极低的延迟。

归档需要一个高度可扩展的容量层来存储冷归档和活动归档数据,该容量层以吞吐量为导向,并支持大型 I/O、流和顺序写入。根据要求,其中任何一项都可能发生在本地或私有或公共云中。

在代码方面,在每个 AI 学习者的旅程中,都有一段时间,他们对下面的 TensorFlow 实验感到高兴:

[## sunny-ML-DL/simple _ 张量流

从 sklearn 导入 tensorflow 作为 tf 导入 pandas 作为 pd .预处理导入 MinMaxScaler #关闭 TensorFlow…

github.com](https://github.com/Sunny-ML-DL/simple_tensorflow/blob/master/python_game_earnings)

一年前,我也会很开心。这是我之前看过的一个文档,叫做: 架构决策指南 *。*我推荐任何参与实施 AI 的人阅读这篇文档,甚至是那些立志成为实践者的人。

以下是文件中的一些问题:

**数据源:**对于关系数据库和 OLTP 系统,访问企业数据的最佳方式是什么?随着实时数据(例如股票市场数据),这个问题变得更加重要。例如,您是否需要使用云对象存储?记住,股市数据会在几秒钟内失去价值!

**数据清理和转换:**这里要考虑的问题是正在使用什么样的数据源类型,需要什么样的吞吐量。当涉及到集群级数据处理和机器学习时,Apache Spark 往往是首选。

数据仓库— 数据的持久存储:存储成本、数据类型、备份、存储容量等问题由此产生。大多数情况下,这可以是一个 SQL 或 NoSQL 数据库。

数据探索和可视化— Pandas、Scikit-Learn 和 Matplotlib 是这里的热门技术。要解决的问题:需要静态还是交互式可视化(Matplotlib 是静态的)?有哪些编码技巧?像 IBM SPSS Modeller 这样的技术不需要任何编码技能。

**创造可操作的见解:**每一项数据科学工作的好坏都取决于从中获得的可操作的见解。这里的关键问题是你有什么技能,需要并行或基于 GPU 的训练和推理吗?R and R 工作室可能因为 Python 和 Anaconda 而出名。但是对于并行和基于 GPU 的工作来说,它们并不理想。然而,所有 Apache Spark 作业本质上都是并行的。

**最后,模型可能是优雅而美丽的——但是你想过你将创造的数据产品吗?**你如何让你的模型被商业用户消费?在这里,你要考虑你的目标受众和所需的定制程度。Node-RED 在这里是一个很好的选择。虽然 Node-RED 是一个无代码/低代码数据流/数据集成环境,但由于其模块化特性,它支持各种扩展,包括仪表板扩展。

最后但同样重要的是,数据安全和治理!今天上网看看,你很可能会找到关于黑客的新闻。安全的基础设施和云服务是确保数据保护的良好开端。

这是一次旅行,不是吗?虽然用最流行的框架学习最新的 ML/DL 算法很诱人…最好专注于掌握上述所有步骤的一项关键技术/方法。那么我们可能会更好地准备实施端到端的人工智能工作流。

以防你错过了

原文:https://towardsdatascience.com/in-case-you-missed-it-bc143491ca4e?source=collection_archive---------34-----------------------

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

我最喜欢写的博客文章的精选列表

到目前为止,2019 年是我的博客年。我在五月份开始认真地写博客,五个月后,我必须说这是我所从事的最有回报的职业努力之一。通过我的博客,我学到了新的东西,认识了新的人,并对工作和生活形成了一种更加自律和勤奋的态度。

我很高兴地告诉大家,我现在已经写了足够多的博客来证明一次回顾。因此,今天我将重点介绍我的五篇博客文章——这些是迄今为止我发现学习和写作最愉快的文章。事不宜迟,这是清单。

  1. 理解神经网络**——我在这篇文章上拼了命。直到今天,它仍然是我花了最多时间研究、写作和创作图形的帖子。这不是我阅读或鼓掌最多的作品,但却是我最引以为豪的一部。当他们想到人工智能时,神经网络是大多数数据人员目前想到的。在这篇文章中,我尽力用简单的英语和友好的视觉来解释神经网络是如何工作的。写这篇文章的时候我学到了很多,当我需要处理神经网络的时候,我还会时不时地引用它(我很健忘)。在我所有的帖子中, 理解神经网络 最能代表这篇博客的主旨。**
  2. 提高技能的更好方法——虽然这是我迄今为止读过最少的作品之一,但也是写起来最有趣的作品之一。我对训练营行业(以及教育技术)充满热情——我最近完成了梅蒂斯的训练营,非常喜欢,并且我对如何改善体验有很多(主动提供的)意见。教育技术目前最大的缺点是事后发生的事情——尽管学习很有趣,但我们仍然需要找到一份体面的工作,这样我们才能支付账单。虽然 bootcamps 等人在教授学生基础知识方面做得很好,但他们目前在帮助学生建立必要的可信度以获得聘用方面做得不够(这个问题对于转行者来说尤其明显)。在这篇文章中,我想出了一个商业点子来解决这个缺点。
  3. 我有足够的钱退休吗?——开发和运行投资者退休前和退休期间财富的蒙特卡洛模拟是我过去几年工作的一大部分。在幕后工作,我从未直接感受到我公司的产品对客户的影响。因此,通过这篇文章分享我在工作中获得的一些知识真的很令人满意——如果它能帮助一些人改善他们的退休准备,那就太棒了!
  4. **维度的诅咒了解 PCA —我作弊挑了两个。因为这两个职位是密切相关的。 维度的诅咒 **探讨了为什么高维数据会困扰数据科学家。我个人从写这篇文章中获益匪浅——因为在写这篇文章之前,虽然我知道高维数据很麻烦,但我不知道为什么。做研究,拿出例子和插图确实巩固了我的概念。 了解 PCA 探索主成分分析,一种处理高维数据的流行算法。PCA 是一种非常有用的算法。你可能听说过自然语言处理中的主题建模吧?主成分分析对于数字就像用线性判别分析或 NMF 进行主题建模对于文字一样——主成分分析提取你的特征,并从你的数据中提取关键的潜在趋势(也称为主题)。这些潜在趋势有助于提高您对数据的理解,并最终允许您构建更好的模型。
  5. 让我们玩 21 点(用 Python)教一个神经网络玩 21 点——我又一次作弊,选了两个帖子。编写这两个程序花了我很多时间——感觉我又回到了训练营。现在我全职工作,要写出像这样更复杂的作品并不容易。但是当我最终点击发布时,我获得的成就感是非常棒的。神经网络帖子特别有趣。起初我认为把它们放在一起很简单——只要用我的 21 点代码生成数据,放入神经网络,瞧。但这绝不是——我实际上花了相当多的时间来思考模拟我的目标变量的最佳方式,以便根据它训练的模型的输出是有用的。这个项目很好地提醒了我们,虽然每个人都喜欢模型,但数据科学家的真正工作(以及优秀分析师/科学家与伟大分析师/科学家的区别)是深入理解您的数据以及您试图用这些数据回答的问题。

我希望你喜欢阅读我过去作品的精选。谢谢你的支持和欢呼!

对于我所有的帖子,请在这里查看我的帖子!

在数据科学中:细节很重要

原文:https://towardsdatascience.com/in-data-science-details-matter-ec8b27f626fc?source=collection_archive---------11-----------------------

等级制度。文字。颜色。

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

Credit: Graphiq

从建筑实践到数据科学领域,我一直对细节有着深刻的欣赏和兴趣。建筑必须经过深思熟虑的制作才能美丽——以熟悉、温暖和吸引人的尺寸和比例汇集材料。外部建筑系统必须细致入微,以保证热效率——冷时保持热量,反之亦然。

建筑的教训是细节很重要。然而,这个原则超越了建筑设计。史蒂夫·乔布斯曾经告诉我们:

“细节很重要,值得等待,直到把它做好。”

数据科学专业应该听从乔布斯的建议,尤其是在解释数据发现的时候。数据科学家有无数的库可以直接从 Python 中更快更容易地可视化数据集:Matplotlib、Seaborn、Plotly、Bokeh,不胜枚举。今天,我们期待即时的满足。我只需点击“立即购买”,几小时后我的包裹就会送到我家门口。或者,我简单地在 Seaborn 中运行一两行代码,得到一个甜蜜的条形图,对吗?好吧,我问你——细节在哪里?

建筑师的手绘草图可以有效地向另一个建筑师快速解释设计思想。同样,快速绘图可能有助于数据科学家快速浏览数据,或者与办公桌前的同事讨论数据。但是像架构一样,数据可能很难向实践之外的人解释。可视化必须经过提炼、修饰和精心策划,才能讲述一个关于数据的清晰而美丽的故事。还是那句话,细节很重要。

但是在数据可视化中,我们应该重点关注哪些细节呢?我认为我们可以将其分为三类:

1。层级

2。正文

3。颜色

等级制度

谈到数据可视化,大多数人说最好的经验法则是尽可能简单地讲述数据的故事。使数据易于导航的一种方法是在图形中使用层次结构。

等级的意思是“去排位”。因此,通过将信息分解为“分级”元素,我们可以在数据可视化中给予某些元素或多或少的权重。层次结构为读者提供了快速浏览内容的结构,并找到他们感兴趣的内容。层次结构向读者展示了如何参与和浏览数据可视化,从大的发现,一直到更精细的细节。

我们可以用多种方式提供层次结构,例如,标题、小标题、注释和更小的细节。此外,文本可以通过文本大小 (12pt 对 24pt)粗细(粗体对浅色)和其他重点(斜体对下划线)来提供层次。颜色还可以通过突出图形的某些元素来提供层次和引起注意。

所以教训是:

层级对信息进行“分级”,因此我们知道理解什么是重要的。

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

Credit: Canva

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

Credit: Alyssa Leverenz

文本

在我们的生活中有两种主要的字体:衬线字体和无衬线字体。

衬线应该用于文本长度较长的项目,比如书籍和文章。纵观历史,许多人声称衬线字体有助于处理长文本,因为它们有助于眼睛沿着一行平稳移动,从而使阅读更容易、更快——尤其是在文本行很长的情况下。考虑 serif 字体,如 Garamond、Georgia 或 Times New Roman。

无衬线字体应该用于文本长度较短的项目。Sans serif 是标题、致谢名单、列标题、图表中的文本等的绝佳选择。无衬线字符更简单,更容易区分任何大小。当您的数据分发给有视觉障碍的读者或仍在学习英语的读者时,这可能会有所帮助。考虑无衬线字体,如 Avenir,未来,或 Helvetica。

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

It takes people longer to understand the numbers in the serif graph on the right than it does to understand the numbers in the sans serif graph on the left. Credit: Howard Coale

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

Serif fonts can have many idiosyncrasies in their endpoints, widths, curves, and shapes that add more for the eye to take in at any given moment. In essence, serif creates more “data” for a reader to take in for each letter or number! Credit: Howard Coale

对比对于区分文字也很重要。你永远不知道你的数据结果会被如何使用。想象一下,你的情节通过视频投影仪显示在演示文稿中,投影仪洗掉了你的纯白背景上所有柔和的灰色文本,没有人能看懂任何内容!那太可惜了。为确保在任何设置下的易读性,建议的最小比率至少为 4:1

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

Max contrast is 21:1 — this means pure white text on a pure black background, or vice-versa. 1:1 means that the background color and your text color are the same. The recommended minimum for text contrast is 4:1. Source

所以教训是:

对较短的文本使用无衬线字体。对较长的文本使用衬线。有充足的对比。

颜色

选择颜色很难。听说过 RGB 颜色系统吗?它从红色、绿色和蓝色的组合中产生所有可能的颜色。告诉计算机定义每种颜色强度的数字输入范围为 0-255。所以举个例子:如果 R = 0,那么颜色中没有“红色”。如果 R = 255,G = 0,B = 0,那么颜色就是纯“红”。所以理论上,你可以把 R,G,B 组合成 256256256 = 16,777,216 种可能的颜色。那么,我们如何选择几种颜色,以最清晰、最容易理解的方式来可视化我们的数据呢?首先,我们必须了解颜色的基本元素。

颜色归结为三个要素:色调,价值和饱和度。

色调描述颜色本身。色调就是我们通常认为的描述颜色的东西:红色、蓝色、绿色等等。是一个色调有多亮或者有多暗。例如,具有暗值的蓝色是“深蓝”,具有亮值的蓝色是“浅蓝”。饱和度是色调的强度或强度。低饱和度意味着更暗、更灰的颜色,高饱和度意味着更强烈的鲜艳颜色。例如,低饱和度的蓝色看起来像多云的天空,而高饱和度的蓝色看起来像晴朗的天空。

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

Hue is the color itself. Saturation is the intensity of the color. Value is the lightness/darkness of the color. Source

在某些情况下,色调、饱和度和值的组合有助于直观地显示数据中的模式趋势。然而,如果你的数据尽可能的简单,观众会更快的理解你的数据。如果定量值在图表中很重要,最好用单色条或点来显示结果。如果有必要,您可以使用颜色在同一个图表上显示不同的类别。

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

The plot on the left converts all categories into a different color and merges them into a single bar. Keep it simple instead! The bar plot on the right only needs one color, because it breaks out each category as a separate bar. Quantities are much easier to compare in the graph on the right. Credit: Datawrapper

我们可以使用色相、明度和饱和度让数据更加清晰。我们可以用颜色来表示刻度,即增加或减少数值的等级。一种想法是使用渐变调色板,在较宽的值和饱和度范围内融合相反的色调(紫色和黄色,红色和绿色,或橙色和蓝色)。特别是,更大范围的值使得调色板即使对于色盲的人也是可访问的。

对于连续数据,您使用颜色渐变,对于分类数据,您使用不同的颜色。

梯度意味着:

“我是一个可能高于或低于我周围另一种颜色的量.”

鲜明的颜色意味着:

“我和我周围的其他颜色毫无关系。”

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

In the graph on the left, the all-blue gradient color scheme may imply that “Ivan” is more important in the data than the other three people, when really, he is not. The graph on the right uses different hues, to give equal weight to all people being compared. The graph on the right also uses light and dark values to allow the categories to be distinguished even by those who are colorblind. Credit: Datawrapper

当数据讲述一个关于“低到高”趋势的故事时,可以使用渐变。当使用渐变显示数据时,渐变应该尽可能以相同的步长从亮到暗逐渐变暗。无论是彩色的还是黑白的,渐变都应该看得很清楚。

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

Intuitively, people understand light colors for low values and dark colors for high values. If using a gradient, limit the number of hues to one or two colors at a maximum. (Ex: light grey to dark blue, or light yellow to dark blue.) Credit: Datawrapper

**直观上,人们理解浅色代表低值,深色代表高值。**如果使用渐变,最多限制一到两种颜色。例如,浅灰色到深蓝色,或浅黄色到深蓝色。

如果比较的数据可能高于或低于平均值或基线量,那么发散调色板是一个不错的选择。使用这个调色板的好例子可能是显示各县的平均工资,或各州的平均气温。建议在渐变的中心使用浅灰色,在渐变的两边使用深色和互补的色调(紫色和黄色,红色和绿色,或者橙色和蓝色)。

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

A diverging palette should use two complementary hues, that are dark in value, with a light, desaturated color in the middle. The right graph is the better choice. Credit: Datawrapper

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

Complementary color pairs are recommended in a diverging color palette. Complementary colors are always on the opposite side of each other on the color wheel. Credit: Lacie Lynnae

你的绘图颜色越中性,就越容易使用颜色来突出显示数据。灰色是背景数据、注释的绝佳选择,或者只是为了让情节尽可能简约。为了让情节更生动,灰色可以是暖色的微妙阴影,如红色、橙色或黄色。

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

Too many colors can make the plot too noisy — making it hard to extract key insights. If you want to call attention to one particular element on your plot, use grey throughout and use one color to highlight. Credit: Datawrapper

为您的数据使用直观的颜色!比如我们都知道红色代表“热”,蓝色代表“冷”。在自然界中,我们都把绿色和树联系在一起,把蓝色和水体联系在一起。在美国,我们都知道共和党通常显示为红色,民主党显示为蓝色。当谈到交通、行为或表现时,从小我们就被教导红色意味着“停止”或“不好”,而绿色意味着“行”或“好”。

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

Use intuitive colors for people to understand the data faster. Avoid using other colors just to be different — and avoid using colors associated with something else (for example, using blue and red for male and female, because blue and red are so heavily associated with politics). Credit: Datawrapper

所以教训是:

为了强调,尽量少用颜色。对连续数据使用单色或双色渐变。分类数据使用不同的色调。使用直观的颜色。

记住——在一天结束时,我们数据科学家必须向世界展示的一件有形的东西,就是我们的图。把所有的精力都放在只有你能看到的 Jupyter 笔记本上,而花很少的时间在与人分享的情节输出上,这似乎是一种耻辱。因此,将层次、文本、 颜色的原则置于您的支配之下,使您的数据可视化易于阅读且美观。抓住它!

在我们信任的数据中

原文:https://towardsdatascience.com/in-data-we-trust-517bc40d1d35?source=collection_archive---------24-----------------------

每个算法都有一个设计者。每台计算机都有一个用户。所有数据的背后都是现实。那么,我们对技术有多确定呢?

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

Photo by Matthew Henry on Unsplash

奈特氏不确定性是经济学家弗兰克·奈特在 1921 年提出的一个观点。将近 100 年后,奈特的想法比以往任何时候都更加重要。

奈特对风险感兴趣。在经济学中,风险是可以被赋予发生概率的东西。例如,硬币正面落地的风险是 50%。另一方面,不确定性发生在结果未知的时候,因此任何给定的结果都不能被可靠地赋予概率。例如,想象翻转一个有无限多面的硬币;假设硬币是公平的,硬币落在任何一面的概率只有在面的数量已知的情况下才能知道。在那之前,我们是不确定的

现在,让我们考虑奈提不确定性。想象一下,在掷硬币和足球比赛上下注(足球,如果你愿意的话)。硬币是由计算机抛的,它只能报告正面或反面,而足球比赛是冠军决赛,所以平局是不可能的。鉴于两种情况都有两种结果,我们可以说都是 50/50 的赌注。但这是真的吗?

直觉上,我们知道它不是。我们知道每个足球队都是不同的,由不同水平的球员组成。我们知道环境因素可能会影响比赛的结果,下雨可能有利于一个队,而阳光可能有利于另一个队。我们知道体育运动中会发生很多不可预测的事情,从躲闪的铲球到侥幸的射门,再到短暂的辉煌时刻。考虑到所有这些事情,我们直观地知道,仅仅因为有两种可能的结果,这两种结果中任何一种的可能性都是不一样的。

这是奈特氏不确定性。从形式上讲,奈提不确定性是关于风险概率分布的不确定性。如果你感到困惑,考虑一下抛硬币电脑。硬币通常是公平的,计算机被编程为只有两种结果。减少了可能影响硬币翻转的情有可原的因素的数量,因此我们非常确定硬币正面着地的风险是 50%。

在世界末日之后

下一个问题是为什么奈提不确定性很重要?大多数情况下,奈提恩不确定情景被认为是不确定的,并被自动视为不确定的。但有时人们不会——事实上,你可能已经犯了这个错误。

考虑一下这个问题:你是否倾向于相信计算机抛硬币比人抛硬币更确定,如果是这样,为什么!?我从来没有明确指出电脑扔的硬币是公平的,也没有说电脑插上电源了!你可能会说这是不公平的诡计,但这也证明了奈特氏不确定性的核心偏见:诬陷

奈特氏不确定性是人们相信——通常是不公正的——某些框架比其他框架更确定的证据。技术哲学家大卫·比尔认为这是一个问题,尤其是计算机、数据和算法。比尔认为,因为人们通常不理解技术,算法等技术具有一种社会力量,可以对我们的行为产生不适当的影响。

这种现象的例子比比皆是。在新闻媒体中,认为数据支持自己立场的专家通常比那些提出自己观点的专家更有权威,尽管后者可能比前者更有经验。如果这太轶事了,考虑一下 2008 年金融危机前风险价值(VaR)的广泛使用。

VaR 是一种统计技术,它使用历史业绩数据来估计给定风险水平下的资产价值。使用标准差来衡量结果——标准差越大,事件发生的可能性越小。金融危机之前,VaR 被广泛使用。在危机期间,高盛(Goldman Sach)的大卫·维尼亚(David Viniar)有一句名言:“我们连续几天看到的都是 25 倍标准差的事件。”从数学上来说,宇宙的热寂应该发生在这个之前——显然有什么事情发生了。

VaR 是有缺陷的,因为它使用了历史数据,是的,但这是一个已知的缺陷。风险值作为一种技术的扩散有一个单独的原因:因为计算机这么说。大多数城市交易者不明白 VaR 在做什么,但是他们相信计算机和数学。这是奈提不确定性的一个经典例子,奈提不确定性是由奈提不确定性促成的,奈提不确定性被奈提称为技术无意识。对计算机的信任是毋庸置疑的,尽管进入计算机的数据以及由此得出的答案是完全不确定的;完全人类

谁害怕天网?

“数据更了解数据”这句口头禅是可以理解的,尤其是在大数据能够发现个人可能永远看不到的宏观趋势之后。但这一口号也掩盖了两个重要的担忧。

首先,我们有被这种对数据的依赖剥夺权利的风险。大数据并没有产生我们希望理解的世界——但如果通过理解我们说服自己认识到自己的无知,人们可能会相信是数据而不是我们在幕后操纵。

其次,不质疑数据是一种诱惑。作为一句话,“数据知道得更好”,并不是有意的独裁,而是当我们记住所有技术背后都是人类行动者时,它在实践中变得如此。如果我们不首先将数据视为数据,就无法收集数据算法可以反映我们的偏见;编写代码的人的兴趣可能与用户的兴趣不一致。那么,数据知道得更多,可能会掩盖情况的隐含现实:控制数据的的人知道得更多。

这些风险是技术无意识的产物,“数据知道得更好”,这是天生的。第三个来自奈特不确定性:如果所有数据、算法和计算机背后都是我们通常不会押注的人,那么押注于数据、算法和计算机的风险要比我们可能意识到的大得多。

所有这些并不是说我们不应该广泛使用数据。但是盲目地依赖数据会让我们变得盲目;如果我们没有大脑,那会对我们创造的机器说些什么呢?

深入看看卢卡·东契奇的表现

原文:https://towardsdatascience.com/in-depth-look-at-luka-doncics-performance-b69ff60004ba?source=collection_archive---------18-----------------------

卢卡·东契奇可以说是 2018-19 赛季迄今为止的年度最佳新秀,
他的表现让达拉斯小牛队有现实的可能性
进入今年的季后赛,目前在第八名中仅获得 5.5 场比赛。
他创造了惊人的数据,可以与一些历史上最伟大和目前最活跃的球员相媲美。
我稍后会详细介绍这一点,因为现在我想探索一下他游戏中的一些特定领域。

离合器时间是卢卡时间

每当我继续观看卢卡的精彩表演时(我住在欧洲的克罗地亚,所以不幸的是
没有赶上很多比赛,因为他们开始得晚,尤其是那些来自西部联盟的比赛),我总是注意到
卢卡是在比赛后期处理小牛进攻中所有棍子的家伙。

这让我在关键时刻看到了他的数据,这些数据令人印象深刻。在下图中:

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

Total clutch points for players in 2018–19 season — Image by Author

你可以在关键时刻查看前 60 名得分手。x 轴表示总得分,y 轴表示真实投篮命中率。除了东契奇,其他一些突出的球员还有奥拉迪波(他比东契奇高得多)和总得分前 3 名的球员(肯巴、哈登和垂怜经)。但考虑到东契奇只是一名 19 岁的新秀,这些数字简直令人吃惊。这让我想知道过去几年新秀在关键时刻表现如何。我收集了 2003-04 赛季(勒布朗的第一个赛季)以来的关键得分,得到了这张图表:

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

Total clutch points for rookies since 2018–19 — Image by Author

从图表中可以看出,卢卡是该范围内最好的新秀之一。得分比他高的运动员依次是布兰顿·詹宁斯、凯文·杜兰特、泰瑞克·埃文斯和德里克·罗斯。同样值得注意的是,他们的统计数据达到了全明星赛的水平,所以在接下来的几周内,东契奇可能会提高这些数据。总积分排名前十的其他公司是利拉德、马克卡宁、米切尔、威斯布鲁克和克里斯·保罗,这是一家非常好的公司。

东契奇的拍摄图表和播放/拍摄类型选择

拍摄图表是我在分析过程中最喜欢创建的东西。对于初学者,我们有定期拍摄图表。

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

Luka Dončić’s shot chart — Image by Author

这张图表并不真的令人难以置信,但我们通常可以看到卢卡在几乎所有领域都高于平均水平。而且他投了很多三分球,也没有满足于很多中距离跳投(尽管他远非真正的莫雷球投篮图)。

为了补充之前的短暂关键时刻分析,这里是迄今为止卢卡在关键时刻的所有投篮的投篮图。

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

Image by Author

他在中距离投篮非常有效,尽管大多数投篮来自三分球区和篮下。

NBA 的跟踪有几个类别的比赛,他们分为球员的每一个镜头。我试图想象出 don ici 更喜欢哪些行动,以及他在这些行动中效率如何。这里有一个图表显示。

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

FGM/FGA for Dončić based on play — Image by Author

这里要注意的是,这些并不都是 Donč ić制造/尝试的射门,而只是那些有某种分类的射门,如果我必须假设这些类型的比赛是什么,它们可能代表类似于接球射门和类似类型的比赛。所以即使我们说所有其他的比赛都是接球投篮,那也意味着他总共有 208 次接球投篮。这仍然会给我们留下更多他自己创造的镜头(无论是开车,后退镜头还是正常的引体向上镜头)。这消除了选秀前的疑虑,专家们质疑,鉴于他的一般运动能力,东契奇是否能为自己创造投篮机会。

卢卡和(退后一步)跳投

在那之后,我开始想象卢卡跳投的类型。

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

Jump shots taken by Luka Dončić — Image by Author

被称为跳投的投篮类型代表了我之前提到的接球投篮类型。从这张图表中我们可以看到,卢卡已经在开发一个标志性的动作,后退跳投。这肯定是相当复杂的动作。我想检查所有其他球员后退跳投的效率,但不幸的是,很难获得所有数据(由于从 nba api 获取数据的问题),所以我只是看了看一些应该是优秀射手和后退射手的球员。

因此,我用今年的一些最佳射手(至少是那些不是主要从内线/近距离进球的人)和卢卡·东契奇做了一个图表。

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

Step Back jump shots for some of the best scorers this year — Image by Author

他实际上离垂怜经并不远,场均只有 3 分。这真的很有趣,尽管他是新秀,但他与所有这些球员的效率相当接近,甚至比他们所有人都要多,除了哈登,他只是采取了荒谬的后退次数。对于东契奇来说,19 岁就拥有如此强大的工具将是一个巨大的优势。

为了完成这一简短的后退投篮和卢卡,我绘制了一张投篮图,其中包含了卢卡本赛季尝试的所有后退跳投。

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

Luka Dončić’s shot chart for step back jump shots — Image by Author

助攻

除了出色的得分能力,卢卡还擅长拥有出色的球场视野和寻找艰难的传球路线。他场均 5.4 次助攻,在新秀中排名第二,仅次于特雷·杨。他的 AST%(由该球员助攻的队友投篮百分比,因此 33%意味着球员 x 助攻了其他队友投篮的 33%)也很高,几乎达到了 Trae Young 的水平(27.5%比 36.5%),但鉴于 JJ Barea 在几场比赛前受伤,他的 AST%为 45%,是联盟最高的,所以 Donč的数字可能会在整个赛季进一步上升。在没有巴里亚的情况下,东契奇场均 8.8 次助攻(然而只有 6 场比赛)。

话虽如此,我很想知道谁是他在队中最喜欢的目标。

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

Field goals made on assist by Luka Dončić — Image by Author

迪安卓是他最喜欢的目标,几乎大部分的助攻都以扣篮结束。巴恩斯是第二受欢迎的目标,他在东契奇助攻下的射门更加分散。我也想象到了。

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

Shot Distance on field goals made by Dončić’s assist — Image by Author

我省略了三个助攻得分最少的球员,这样图表看起来不那么拥挤。在东契奇的所有助攻中,只有 14 个是中距离跳投。

结论

卢卡·东契奇正在经历一个惊人的赛季。我只涉及了他比赛的几个方面,并试图探索一些不常被提及的东西(比如后退跳投)。我甚至没有给出基本的统计数据,如 PTS/G,REB/G,AST/G,但他在今年所有球员以及过去几年的新秀中排名相当高。

有一点我真的没提那么多,就是他的 TS%很高。这应该值得一提,因为在三分时代(1979/80 至今),他是 3PA 所有新秀中第二位的,场均 6.7 分,他现在是 35.5%。

我没有成功形象化的是 Luka 的 BPM(Box Plus-Minus)。他目前的得分是 3.7,这让他在三分时代的新秀中排名第 11。老实说,这些先进的统计数据有点可疑,我没有去研究它们的细节,但总的来说,我会说 BPM 是预测谁将发展成为全明星级别的球员甚至更多的很好的指标。

生成所有这些图表的完整代码可以在我的 jupyter 笔记本中找到。我的 github 库上有更多关于篮球分析的东西。

数据来自 stats.nba.com篮球参考

软演员评论家深度评论

原文:https://towardsdatascience.com/in-depth-review-of-soft-actor-critic-91448aba63d4?source=collection_archive---------5-----------------------

了解最先进的强化学习算法

介绍

在本帖中,我们回顾了 Soft Actor-Critic (Haarnoja 等人,2018 & 2019),这是一种非常成功的强化学习算法,在连续控制任务(如机器人移动和操纵)中实现了最先进的性能。软演员评论家使用最大熵学习的概念,这带来了一些简洁的概念和实际的优势,我们将在本文中讨论。

以下是这篇文章的结构:

首先,我们将简要回顾一般策略迭代(我将假设读者熟悉马尔可夫决策过程),这是理解任何强化学习算法的基本概念。然后,我们将讨论软演员-评论家背后的直觉,以及它带来的概念上的好处。接下来,我们将讨论软政策迭代,软行动者-批评家(SAC)近似的理论框架,然后继续讨论 SAC。我还将在整篇文章中提供解释算法的代码片段。

SAC 是如何实现顶级性能的?

本质上,SAC 寻求的是在政策中最大化“熵”,以及从环境中获得的预期回报。政策中的熵可以解释为政策中的随机性

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

Left: high(orange) and high (blue) entropy in categorical probability distributions | Right: high (orange) and low (blue) entropy in Gaussian distributions. Inspired by(https://medium.com/@awjuliani/maximum-entropy-policies-in-reinforcement-learning-everyday-life-f5a1cc18d32d)

从上图中,我们看到低熵的概率分布倾向于“贪婪地”采样某些值,因为概率质量分布相对不均匀。也就是说,奖励高熵的政策带来了几个概念上的优势:首先,它明确地鼓励探索状态空间,改善了收集的转换数据;第二,它允许策略捕获多种模式的好策略,防止过早收敛到坏的局部最优。

这种动机和提法在软演员-评论家论文中得到了实证验证;在许多 MuJoCo 控制任务中,软演员-评论家优于其他最先进的算法:

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

Performance of SAC (2018) and SAC (2019) against other algorithms on MuJoCo tasks. Taken from Haarnoja et al. (2019) paper

背景:一般策略迭代

在经典的 MDP 理论中,寻找最大化每个州的预期累积折扣奖励的最优政策的标准方法是政策迭代。策略迭代是在策略评估和策略改进之间交替的两步迭代方案。

在策略评估步骤中,我们希望找到当前策略的准确值函数。为此,我们反复应用如下定义的贝尔曼算子:

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

Bellman operator

策略改进步骤通过重复应用贝尔曼最优算子来执行:

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

Bellman optimality operator

其在给定初始值函数V的情况下,保证收敛到真实(最佳)值函数V*。特别地,Bellman 算子和最优性算子的收敛性质是由于它们都是压缩映射。再者,理论上,最优策略pi*可以从最优值函数中构造出来;给定一个初始策略pi,我们最小化当前策略和派生的更新策略之间的一些度量。

因此,通过交替策略评估和策略改进,我们可以在表格情况下(即,有限状态-动作空间和无函数近似)找到马尔可夫决策过程的精确解。

软策略迭代

在论文中,Haarnoja 引入了软策略迭代,它是一般策略迭代的一种扩展,将策略的熵作为一个附加的奖励项。特别是,代理人寻求最大化环境的预期回报和政策的熵。

为此,原始的贝尔曼算子增加了一个熵正则项:

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

Soft Bellman operator

如同在非正则化的情况下,熵正则化的 Bellman 算子对任何初始 Q 函数的重复应用保证收敛到最优的“软”Q 函数。

对于策略改进步骤,我们将策略分布更新为当前 Q 函数的 softmax 分布(要了解为什么会这样,请查看哈尔诺贾等人的论文,(2017) )。特别是,我们希望最小化两个分布之间的距离(“散度”)。这是通过最小化两种分布之间的 Kullback-Leibler (KL)散度来实现的:

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

如 Haarnoja 等人(2018)所证明的,这种更新方案保证了在表格情况下(即当状态和动作空间是有限的并且没有使用函数近似时)策略的单调改进。后来,艾斯特等人(2019)将这些性质推广到正则化子的任何公式。

软演员-评论家(警告:密集!)

对于具有高维和/或连续状态-动作空间的复杂学习域,找到 MDP 的精确解几乎是不可能的。因此,我们必须利用函数逼近(即神经网络)来找到软策略迭代的实际逼近。

为此,Haarnoja 等人将软 Q 函数建模为表达性神经网络,将策略建模为动作空间上的高斯分布,将当前状态作为输入,将平均值和协方差作为神经网络输出。下面是这些代码在实现过程中的样子:

Models

此外,软行动者-批评家是一种非策略学习算法,这意味着我们可以用从不同于当前策略的策略中收集的经验数据来更新 Q 网络和策略参数;对于每个演员的推出,我们将所有的过渡数据保存在重放缓冲区中(在下面的等式中表示为 D )。

通过使用预测动作值和目标动作值q_t之间的均方损失的梯度,可以在每个更新步骤优化 Q 函数参数:

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

这里,alpha项代表“熵温度”,即我们对政策的“随机性”与环境回报的权重。

在代码中,我们可以这样实现:

Soft Q-network update in code

现在进入策略改进步骤:在实践中,软行动者-批评家使用软策略迭代的一些修改。利用 Q 参数可微的事实,Haarnoja 等人对策略输出使用“重新参数化技巧”来获得低方差估计量;特别地,我们将动作表示为应用于 z 值的双曲正切(tanh ),该 z 值是从策略神经网络输出的平均值和协方差中采样的。

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

neural network transformation on Gaussian policy to obtain action

此外,为了解决我们的无界高斯分布的动作界限,我们必须将log(pi)计算修改为:

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

log(pi) computation

这里,log(mu)表示根据来自策略神经网络的均值和协方差计算的累积分布函数(CDF)。也许这在代码中更清楚:

log(pi) computation

然后,可以通过最小化来自软策略迭代的简化形式的 KL 发散来直接优化策略参数;我们取目标函数的随机梯度:

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

Policy objective for which we will compute the gradients

这种简化形式来自于忽略 Q 的 softmax 分布的分母,因为它对目标函数的梯度没有贡献。

在代码中,我们可以这样实现:

Policy update in code

可选:自动调节我们的熵温度alpha

在 SAC (2018)的第一个版本中使用了固定的熵温度alpha。尽管原始 SAC 的性能令人印象深刻,但alpha却是一个非常敏感的超参数。为了补救这一点,SAC (2019)的第二个版本将alpha转换为可更新的参数。特别地,我们通过取下面的目标函数的梯度来更新:

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

Objective function for dynamically adjustable entropy temperature

其中 H_bar 表示所需的最小熵,通常设置为零向量。建议将 SAC (2019)与此可调alpha一起使用,因为它提高了算法的性能和稳定性。

在代码中:

alpha initialization and update

这就结束了软演员-评论家算法的审查!

全面实施

为了使我的帖子尽可能简洁,我只包含了相关的、特定的实现片段;要查看完整的实现,请查看我的 GitHub 库:

[## cy oon 1729/策略-梯度-方法

策略梯度系列中算法的实现。目前包括:A2C,A3C,DDPG,TD3,SAC …

github.com](https://github.com/cyoon1729/Policy-Gradient-Methods)

参考资料:

  1. 软行动者-批评家:带有随机行动者的非策略最大熵深度强化学习。哈尔诺贾等人(2018)
  2. 软演员-评论家算法和应用。哈尔诺贾等人(2019 年)
  3. 正则化马尔可夫决策过程理论。艾斯特等人(2019)

PyTorch 的就地操作

原文:https://towardsdatascience.com/in-place-operations-in-pytorch-f91d493e970e?source=collection_archive---------7-----------------------

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

Photo by Fancycrave.com from Pexels

它们是什么,为什么要避开它们

今天先进的深度神经网络有数百万个可训练参数(例如,参见本文中的比较),试图在 Kaggle 或 Google Colab 等免费 GPU 上训练它们往往会导致 GPU 上的内存耗尽。有几种简单的方法可以减少模型占用的 GPU 内存,例如:

  • 考虑改变模型的架构或使用具有较少可训练参数的模型类型(例如,选择 DenseNet-121 而不是 DenseNet-169 )。这种方法会影响模型的性能指标。
  • 减少批处理大小或手动设置数据加载器工作进程的数量。在这种情况下,模型需要更长的训练时间。

在神经网络中使用就地操作可能有助于避免上述方法的缺点,同时节省一些 GPU 内存。但是,由于几个原因,不建议使用就地操作。

在这篇文章中,我想:

  • 描述什么是就地操作,并演示它们如何帮助节省 GPU 内存。
  • 告诉我们为什么应该避免就地操作或非常谨慎地使用它们。

就地操作

“就地操作是直接改变给定的线性代数、向量、矩阵(张量)的内容,而不制作副本的操作。”—定义摘自本 Python 教程

根据定义,就地操作不会复制输入。这就是为什么在处理高维数据时,它们可以帮助减少内存使用。

我想演示就地操作如何帮助消耗更少的 GPU 内存。为此,我将使用这个简单的函数来测量 PyTorch 中的非适当位置 ReLU 和适当位置 ReLU 的分配内存:

Function to measure the allocated memory

调用函数来测量为不合适的 ReLU 分配的内存:

Measure the allocated memory for the out-of-place ReLU

我收到如下输出:

Allocated memory: 382.0
Allocated max memory: 382.0

然后调用就地 ReLU,如下所示:

Measure the allocated memory for the in-place ReLU

我收到的输出如下:

Allocated memory: 0.0
Allocated max memory: 0.0

看起来使用就地操作可以帮助我们节省一些 GPU 内存。但是,在使用就地操作时要极其谨慎,要检查两遍。在下一部分,我将告诉你为什么。

就地操作的缺点

就地操作的主要缺点是,**它们可能会覆盖计算梯度所需的值,**这意味着会破坏模型的训练过程。这就是 PyTorch 官方亲笔签名文件所说的:

在亲笔签名中支持就地操作是一件困难的事情,我们不鼓励在大多数情况下使用它们。Autograd 的积极的缓冲区释放和重用使其非常有效,并且很少有就地操作实际上降低内存使用量的情况。除非你的内存压力很大,否则你可能永远都不需要使用它们。

有两个主要原因限制了就地作业的适用性:

1.就地操作可能会覆盖计算梯度所需的值。

2.每个就地操作实际上都需要实现重写计算图。不在位置的版本只是分配新的对象并保持对旧图的引用,而在位置操作中,需要改变表示该操作的函数的所有输入的创建者。

小心就地操作的另一个原因是它们的实现非常棘手。这就是为什么我会推荐使用 PyTorch 标准的就地操作(就像上面的就地 ReLU ),而不是手动实现。

让我们看一个路斯(或 Swish-1)激活函数的例子。这是路斯的不合时宜的实现:

Out-of-place SiLU implementation

让我们尝试使用 torch.[sigmoid](https://en.wikipedia.org/wiki/Sigmoid_function)_ 就地函数实现就地路斯:

Incorrect implementation of in-place SiLU

上面的代码错误地实现了就地路斯。我们可以通过比较两个函数返回的值来确定这一点。实际上,函数silu_inplace_1返回sigmoid(input) * sigmoid(input)!使用torch.sigmoid_就地实施路斯的工作示例如下:

这个小例子演示了为什么我们在使用就地操作时应该小心谨慎并检查两次。

结论

在本文中:

  • 我描述了就地操作及其目的。演示了就地操作如何帮助减少 GPU 内存消耗。
  • 我描述了就地作业的重大缺点。人们应该非常小心地使用它们,并检查两次结果。

赞美职业改变者

原文:https://towardsdatascience.com/in-praise-of-the-career-changer-d734a39de1d9?source=collection_archive---------35-----------------------

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

Photo by Ian Schneider on Unsplash

这通常很难,也不被人欣赏,但这里要确保你的努力和奋斗不会被忽视

转行者经常被低估。我认为这是因为我们的社会倾向于反对不满或无聊。如果有人正在努力保持对工作的专注,社会的回应是,“忍着点,做个专业人士。”内疚之旅的回应也很受欢迎,“这么多人甚至没有稳定的薪水,所以不要抱怨了。”

改变职业需要勇气和一定程度的自省——你已经看到了“你”的现状,并决定在职业上需要改变。这不是一个容易的决定。放弃一份体面的薪水,即使你不再喜欢这份工作,也是很难的。当你意识到,不管是好是坏,你辞职后,你的工作是你身份的主要部分,这就更难了。没有它,你会感到更加脆弱和暴露。

但请大胆尝试。其他人可能会说你愚蠢、误入歧途,甚至自私。但是我知道你实际上是勇敢的,好奇的,真诚的。

认识到需要做出改变是很难的;更难鼓起行动的主动性。

所以这篇文章是写给你的,勇敢的职业改变者。你选择的路很长,终点也不确定。但是几年后当你回头看的时候,你会意识到第一步,你在开始你的转变之旅时已经迈出的那一步,实际上是最难的一步。因为不是每个人都有勇气接受。

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

Photo by 2Photo Pots on Unsplash

情感的过山车

转行者在到达最终目的地之前会经历各种各样的情绪。我最近刚从数据科学训练营毕业,在过去的几个月里,我和我的朋友经历了以下一系列情绪变化:

  1. 等待录取结果时的紧张。“伙计,我答对概率问题了吗?我希望他们不会因此责备我。”
  2. 兴奋一旦你被录取,“这是我通往新事业的门票!”
  3. 不安全感当你向前一家公司递交辞职通知时,“实际上,这份薪水还不错……我能确定在我完成训练营后,我能在新的领域找到另一份类似的工作吗?”
  4. 害羞和尴尬在你训练营的第一天——“我已经工作了很长时间,回到教育环境中感觉很奇怪。”
  5. 热情和好奇当你开始和你的同伴一起学习新东西时,“我学到了很多,我很快就会成为一名数据科学家。”
  6. 随着你学的越多,你越会意识到你实际上知道的是多么少,“这么多要学的,这么少的时间,我能做到吗?”
  7. 随着毕业日的临近,你还没有得到你的第一次面试机会(与此同时你的存款也在减少),“我想知道我要多久才能找到一份工作……”
  8. 恼怒又一个过分热心的招聘人员联系你,说“你有一个在职业生涯中迈出下一步的绝佳机会”,然后鬼鬼祟祟地跟着你——生命中只有三件事是确定无疑的——死亡、纳税和被招聘人员鬼鬼祟祟。
  9. 当你经历面试、带回家的作业和咖啡会议的严峻考验时,“如果我不用去参加另一场面试,我会很开心。”
  10. 嫉妒当你的朋友得到了你梦寐以求的工作,而你正坐在连续第五次被拒的边缘时,“伙计,我真不敢相信他是怎么突然袭击我的!”
  11. 当你最终得到第一份工作时,兴高采烈地说:“终于有人要我了!”
  12. 当你在新工作的第一天出现时,“我想知道他们多久才会意识到我是个菜鸟。”

在短短 4 到 6 个月的时间里,经历了很多起起落落——几个月没有薪水,一次又一次的拒绝,当你的朋友找到工作而你在找工作时,心情复杂。一直以来,你都在努力学习数据科学,并向世界证明你知道它。这可能是一场艰苦的斗争,但这也是让你最终获得胜利的原因。

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

Photo by Jason Hogan on Unsplash

一些我个人认为鼓舞人心的成功故事

虽然斗争是真实的,但也不是毫无意义的。我想分享几个我个人觉得鼓舞人心的成功故事(来自我的朋友)。他们都是正在或已经成功进入数据科学领域的职业改变者。

Mohammad Bakir——莫是我 METIS (数据科学训练营)队列中的一员。莫好奇、聪明、热情。但最重要的是,他是一个骗子和磨工。训练营结束几周后,当他的生活费开始减少时,他开始开车去优步。但他不仅利用优步来支付账单,还把它作为一个社交机会。莫是我所知道的唯一一个通过开得到面试和工作机会的人(他拒绝了,因为不是很合适)。他没有被吓倒,继续努力,我很高兴地告诉大家,他上周收到了苹果公司的邀请。恭喜莫!

雷迈·瓦格斯——一个西雅图梅蒂斯大学的毕业生,我通过博客认识了她(她也写博客!)。训练营毕业两年后,雷迈发现自己正处于十字路口:工作中的学习速度放缓,而且缺乏从事数据密集型项目的机会。感觉就像是现在或永远都不要做出改变,雷迈做了一些让我惊讶的事情:她辞去了工作,这样她就可以全职寻找她梦想的工作。她做了搜索。她的会议和社交活动安排得如此之满,让我震惊和印象深刻(社交让我昏昏欲睡)。对于我们中的许多人来说,当我们失去了学校或工作的日常结构时,就会变得懈怠和拖延。不是她,雷迈把找工作当成了她的工作,最终她的自律得到了回报。她现在是一名快乐的数据专家。恭喜雷迈!

黑乌鸦(詹姆斯·吴)——我个人并不认识詹姆斯,但我对他丰富的博客内容印象深刻。詹姆斯是 Metis 首届新加坡毕业生(恭喜你们!),他和他的同事们目前正在努力进入就业市场(如果你是新加坡的一名雇主,你想要一名充满激情和渴望数据的人,你应该去看看詹姆斯里贾纳莉安娜)。你可能已经猜到了,我非常赞成把写博客作为一种手段,来弥补学习新事物和真正精通新事物之间的差距(学习新事物的最好方法是教它)。因此,我很高兴看到詹姆斯,我相信他正忙于招聘和面试,仍然找到时间推出教程和撰写他的激情项目(我希望你保持下去!).

在我的朋友身上挣扎,但记得要开心

对数据科学工作的不懈追求有时会令人窒息。这就是为什么你需要经常提醒自己为什么要做这件事。

你想要一份有趣、刺激、有挑战性的工作(从好的方面来说)。因此,在社交和面试之间,花些时间学习一种新算法,或者和一些朋友参加一场 Kaggle 比赛——任何能提醒你数据科学(和学习新事物)有多有趣的事情。

因为如果不好玩,那你还不如呆在原来的工作岗位上。

更多数据科学相关帖子由我:

数据科学家是做什么的?

数据科学家挣多少钱?

拿到了数据科学的工作?

技能提升的更好方法

让数据科学面试变得更好

用 Python 进行业务模拟

在 R Shiny 中,什么时候一个错误才是真正的错误?

原文:https://towardsdatascience.com/in-r-shiny-when-is-an-error-really-an-error-702205ebb5d5?source=collection_archive---------18-----------------------

如何测试你的服务器端输出并阻止不必要的红色死亡错误信息出现在你的用户界面上

对于 R 用户和整个世界来说,R Shiny 是一个真正的超级礼物。本质上,它允许你以一种用户友好的方式向他人公开你的代码,这意味着非 R-coder 可以利用你开发的功能。

但是当 R 的红色死亡错误消息从服务器端流过并出现在不必要的用户界面时,它看起来会有点不专业和“不整洁”。例如,这对最终用户来说非常糟糕:

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

有两种方法可以轻松改善最终用户体验,并避免用户向您反映并非真正错误的错误,而只是用户输入选择的结果。

假设您创建了一个应用程序,该应用程序根据某些用户输入过滤一个数据集,然后对过滤后的数据进行一些统计。

假设在服务器端创建了一个用于计算统计数据的反应式过滤数据帧,我们称之为filtered_df()。一种常见的可能性是用户选择了太多的过滤器,以至于在filtered_df()中没有留下任何数据,事实上它是一个没有任何行的数据帧。

选项 1 —编写特定的错误信息

如何处理这个问题的一个选择是使用stop()函数为这个事件写一个特定的错误消息。例如,您可以这样做:

checked_filtered_df <- shiny::reactive({

  if (nrow(filtered_df()) == 0) {
    stop("No data available for chosen filters!")
  } else {  
    filtered_df()
  }})

在用户过滤掉所有数据的情况下,这将返回一个红色的错误消息,就像上面的一样,除了它将包含特定的语言“错误:没有可用于所选过滤器的数据!”。这稍微好了一点,但在我看来,对最终用户来说还是很糟糕。另外,这真的是一个错误吗?我不这么认为——你的代码实际上没有任何问题。我不是这样使用stop()的粉丝。

选项 2——使用 Shiny 强大的验证功能

闪亮的validate()功能非常适合这种情况。它可以对您的服务器输出执行测试,您可以告诉它在测试失败时显示什么。它用不那么可怕的灰色文本显示,重要的是,它不称之为错误。

validate()中,您可以使用need()功能设置测试标准,并编写一条消息,在测试失败时显示。重写上面的代码以使用validate()而不是stop()看起来像这样:

checked_filtered_df <- shiny::reactive({ shiny::validate(
    shiny::need(nrow(filtered_df()) != 0, 
         "No data available for chosen filters!")
  ) filtered_df()})

现在,当用户向下筛选到一个空数据集时,UI 中将出现以下内容:

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

这就不那么令人担忧了,而且对于最终用户来说,他们已经将数据集过滤得一无所有,这一点也更清楚了。

如果你以前没有在 Shiny 中做过类似的事情,那么这是值得进一步研究的。随着每个新版本的发布,Shiny 包含了越来越多的方法来平滑用户界面和控制预期的问题。这里有更多关于validate() 的技术细节

最初我是一名纯粹的数学家,后来我成为了一名心理计量学家和数据科学家。我热衷于将所有这些学科的严谨性应用到复杂的人的问题上。我也是一个编码极客和日本 RPG 的超级粉丝。在 LinkedIn Twitter上找我。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值