TowardsDataScience 博客中文翻译 2019(二百三十六)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

Numpy 到底有多快,为什么?

原文:https://towardsdatascience.com/how-fast-numpy-really-is-e9111df44347?source=collection_archive---------4-----------------------

与标准 Python 列表的比较。

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

Photo by Lukas on Unsplash

最初 Python 不是为数值计算而设计的。随着人们开始使用 python 完成各种任务,对快速数值计算的需求也随之增加。一群人在 2005 年创建了 Numpy 来应对这一挑战。

在人工智能时代的今天,如果没有 Numpy 这样的快速数字库,就不可能训练机器学习算法。

以下是 Numpy 速度快背后的主要原因。

  • Numpy 数组是密集存储在内存中的相似数据类型的集合。一个 Python 列表可以有不同的数据类型,这在对其进行计算时会带来很多额外的约束。
  • Numpy 能够将一个任务分成多个子任务,并并行处理它们。
  • Numpy 函数是用 c 实现的,这也使得它比 Python 列表更快。

在这篇博客中,我们将对 Numpy 数组和 Python 列表执行以下计算,并比较两者所用的时间。

  • 添加标量
  • 点积
  • 串联
  • 删除

让我们先导入 Numpy 包。

import numpy as np

添加缩放器

让我们创建一个包含 10000 个元素的 Python 列表,并为列表中的每个元素添加一个标量。

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

现在创建一个包含 10000 个元素的 Numpy 数组,并为数组的每个元素添加一个标量。

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

对于这种计算,Numpy 的执行速度比 Python list 快 5 倍。

这个计算是在一个大小为 10000 的数组上执行的。让我们看看不同大小的阵列的时间是如何变化的。下图显示了 Numpy 数组在不同数组大小下速度更快的次数。

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

当数组大小接近 5,000,000 时,Numpy 的速度提高了大约 120 倍。随着数组大小的增加,Numpy 能够执行更多的并行操作,从而加快计算速度。

点积

点积是机器学习算法中最重要和最常见的运算之一。特别是在神经网络训练中,我们需要做大量的矩阵乘法。

现在我们来比较一下点积的速度。

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

Numpy 大约快 10 倍。让我们画出不同阵列大小的速度。

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

我们看到点积更快。这大约是我们转向大型阵列时的 140 倍。

串联

现在我们连接两个数组。我们来对比一下速度。

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

我们看到连接速度几乎是相似的。即使对于不同的数组大小,连接所用的时间也几乎是相似的。

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

Python 列表可以通过附加一个或多个列表来扩展。但是我们不能扩展现有的 Numpy 数组。当我们连接 2 个 Numpy 数组时,一个新的结果数组被初始化。所以在 python 列表中拼接操作相对更快。

删除

我们在这里花点时间,猜猜在执行删除操作的时候哪个东西会更快?

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

即使对于删除操作,Numpy 数组也更快。随着数组大小的增加,Numpy 比 Python List 快 30 倍左右。

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

因为 Numpy 数组由于其同构类型而被密集地打包在内存中,所以它也可以更快地释放内存。

因此,总的来说,在 Numpy 中执行的任务比标准 python 列表快 5 到 100 倍,这在速度上是一个巨大的飞跃。

在下一篇文章中,我将解释 Numpy 数据中的轴和维度。

[## 了解轴和维度| Numpy |熊猫

知道如何沿数据的不同轴应用函数。

towardsdatascience.com](/understanding-axes-and-dimensions-numpy-pandas-606407a5f950)

联合学习将如何彻底改变人工智能

原文:https://towardsdatascience.com/how-federated-learning-is-going-to-revolutionize-ai-6e0ab580420f?source=collection_archive---------6-----------------------

介绍

今年我们观察到了一个惊人的天文现象,这是第一次看到黑洞的照片。但是你知道这个黑洞在 5000 万光年之外吗?为了拍摄这张照片,科学家们需要一个和地球一样大的单圆盘望远镜!由于实际上不可能制造出这样的望远镜,他们将世界各地的望远镜网络聚集在一起——由此制造的事件视界望远镜是一个大型计算望远镜,其孔径与地球的孔径相同。

这是分散计算的一个很好的例子,它展示了分散学习的力量,这也可以在其他领域加以利用。

基于同样的原则,人工智能中出现了一个新的框架,它有能力在数百万台设备上进行计算,并整合这些结果,以提供更好的预测,增强用户体验。欢迎来到联合(分散)机器学习的时代。

什么是联合(分散)机器学习?

我们一会儿就到了。但首先,我们需要了解什么是传统的或集中式的机器学习。

集中式机器学习

世界上有数十亿台移动设备,这是一个计算能力巨大的时代。随着廉价计算能力的发明,我们已经有了硬件容量相当于笔记本电脑的手机。用不了多久,你的口袋设备将拥有 GPU(图形处理单元),它们将能够轻松地训练深度神经网络。

世界上几乎每个人都有个人设备,因此我们正在见证数据量的新一轮激增,这是过去从未观察到的,并且正在以指数速度增长。随着数据以不断增长的速度生成,它为提供更准确和个性化的 ML 模型开辟了新的可能性,这些模型可以增强客户体验并帮助他们做出决策。

集中式机器学习就是使用“训练数据”——样本数据——创建一种算法,以识别其中的模式和趋势。然后,机器使用算法来“学习”这种模式,并在类似于样本数据的更大数据块中识别它们(更详细的解释此处)

让我们现在进入细节。这个过程包括五个步骤

  1. 问题的识别
  2. 解决问题的数据准备
  3. 在中央服务器或机器上训练 ML 算法
  4. 将训练好的模型发送到客户端系统(或者提供公开 API 的 ML 服务)
  5. 对看不见的数据开始结果预测

因此,在当前的 ML 世界中,模型训练的方法是集中的。集中式培训要求将数据存储在一个中央位置或数据服务器上,从而限制了访问权限,也增加了安全隐患(如果这些数据被黑客攻击了怎么办!).

有没有想过谷歌地图是如何在恰当的时候建议替代路线的?三个词——实时计算

谷歌在其服务器上收集了数百辆已经经过你正在经过的同一条路线的车辆的数据,计算出大多数人选择的最佳路线,并将这些信息传递给你——让你的生活变得更容易(不客气)。

集中学习的局限性

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

Figure 2: Google Maps Route Suggestions

但是这些惊人的灵活性的代价是大多数人都没有意识到的。将数据存储在中央服务器上不仅会导致侵犯用户隐私,还会带来泄露其他个人数据的风险。大多数时候,用户数据存储在大公司拥有的云上,而他们甚至不知道。通过交换隐私,用户可以获得更好的、更个性化的应用程序。

不同国家的政府已经注意到这些隐私问题,并提出了严格的措施来确保数据隐私。其中包括 HIPAA——医疗保健行业的健康保险便携性和责任法案,以及 GDPR——通用数据保护法规。这些限制了任何组织对用户数据的访问,直到用户明确许可(通常是书面许可)。

那么,依靠个人数据生存的组织会怎么做呢?!初创企业和公司越来越难以构建能够为用户提供更好的个性化结果的应用。所有的 ML 应用都基于简单的逻辑,你输入的数据越多,它得到的数据就越准确,它返回的结果就越好,越个性化。如果不是通过对大量用户数据进行训练来构建,这些结果通常会很差且不个性化。这导致用户群体对新应用的适应性降低。

对于用户和组织来说,这些问题都可以在联合学习的帮助下得到解决。

回到最初的问题——什么是联合学习,它将如何提供帮助?

联邦学习是人工智能的一个新分支,它为机器学习的新时代打开了大门。

它可以利用现代世界中可用的“分散数据”(数据不存储在一个位置,因此容易受到攻击)和“分散计算能力”,在不损害“用户隐私”的情况下提供更个性化的体验。

现在可以通过同态加密在客户端和服务器之间共享信息,而不会损害用户隐私(参见 Andreas Poyiatzis 的文章)。简而言之,通过同态加密,现在可以在远程服务器位置对加密数据执行计算(不侵犯隐私),同样加密的计算结果将被发送回客户端,客户端可以解密个性化结果,而无需担心泄露其隐私。

它是如何工作的?

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

Figure 3: How Federated Learning works?

不要被复杂的图表所困扰。事情是这样的。

典型的联合学习解决方案从在位于中央的服务器中训练通用机器学习模型开始,该模型不是个性化的,而是作为基线开始。接下来,服务器将该模型发送到用户设备(步骤 1),用户设备也称为客户端(根据应用程序的用户群,客户端可以从数百到数百万不等)。随着客户端系统生成数据,本地模型(在各自的用户设备上)随着时间的推移而学习并变得更好。

所有客户端定期将它们的学习发送到中央服务器,而不会将用户的个人数据暴露给服务器(步骤 2)。这是借助同态加密完成的。然后,服务器汇总来自客户端的新知识,并继续改进共享模型(步骤 3)。新的共享模型再次被发送回客户端的系统,相同的循环一次又一次地重复。随着时间的推移,位于中央服务器的共享模型变得越来越好,越来越个性化。

这种从用户个人数据中学习的艺术,没有任何暴露它的威胁,在未来有很大的潜力衍生出新的可能性。

联邦学习的未来

自动驾驶联网汽车可以利用联邦学习来安全驾驶。如果自动驾驶汽车利用过去 1 小时内穿过同一坑洞的所有汽车的信息,而不是仅仅基于一套预定的算法和规则来避免坑洞,那么它肯定能够在乘客的安全性和舒适性方面做出更好的决定。

未来 5 年将会是联合学习非常有趣的一年。我们将看到大量新的应用程序利用联合学习,以一种前所未有的方式增强用户体验。许多公司将站出来,提供一个快速开发联合学习应用程序的平台。我们将会看到这样一个时代,用户将会因为与大公司分享他们的本地知识而获得回报。

谷歌已经以 Tensorflow Federated 的形式分享了它的联合学习平台。目前它还处于萌芽阶段,但这是一个很好的学习平台。即将发布的版本将提供新的功能,使用户能够构建端到端可扩展的联邦机器学习模型。

OpenMined 是一家已经在这方面开始认真工作的公司。他们的方法确保了全面的数据保护以及对客户分享其学习成果的奖励。如果你想在这个领域探索更多,我建议你访问他们的网站。

位置智能在食品技术行业中的应用

原文:https://towardsdatascience.com/how-food-delivery-companies-leverage-location-data-to-improve-customer-experience-58470406e7ed?source=collection_archive---------12-----------------------

食品配送公司如何利用位置数据来改善客户体验并获得更好的市场份额

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

Photo by Robert Anasch on Unsplash

我们生活在这样一个时代,如果我们下班回家晚了,或者突然饥肠辘辘,需要速食,我们就不需要费心做饭了。从我们最喜欢的餐馆点餐从未如此简单。

从数字来看,预计食品配送市场有望在 2019 年增长至 50 亿美元,到 2023 年增长至 150 亿美元。像 Swiggy 和 Zomato 这样的公司已经在几乎所有的印度一线和二线城市开展业务,随着新的参与者采取差异化战略,这个市场可能会快速增长。

根据数据情报平台 KalaGato 的一份报告,截至 2018 年上半年,Swiggy 的市场份额为 36.40%,FoodPanda 紧随其后,份额为 32.02%。Zomato 的市场份额为 23.78%。尽管 Zomato 的市场份额较小,但它已经在全球 300 多个城市开展业务。【来源】

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

Source

许多因素影响或帮助食品科技公司发展业务。实时流量、订单准备时间、交付执行效率等等。时间和距离在完成交货的各个环节中起着非常重要的作用。

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

Source

我们使用地图来定位一个地方的日子已经一去不复返了。食品科技公司正在利用位置数据来改善他们组织的各个方面。让我们来看看其中的一些吧!

搜索和发现

食品科技公司使用位置数据来帮助他们的客户搜索或找到他们附近的新餐馆。他们通过查找哪些餐厅可以接受订单并在最长送货时间内送货上门来做到这一点。这就是所谓的 适用性

这里的诀窍是找到合适的时间来确保送货,并提供足够多的餐厅选择,以便尽快计算出送货时间。

客户体验仍然是此类食品配送服务的重中之重。如果交付时间太长,或者如果用户没有看到很多餐馆,那么他/她可能不会在第一时间下订单!

交货任务

一旦你在手机上下单,离你最近的快递员就会把你的订单交给你。这背后有很多计算,例如送货主管的当前位置和餐厅之间的距离,以及到达客户位置所需的时间。

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

Source

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

Source

有时会出现餐馆从附近的顾客那里得到两份订单的情况。在这种情况下, 批处理 的概念开始发挥作用,单个交付执行人员被分配来交付两个订单。

如果一批订单中所有订单的交货时间与承诺给每个客户的估计交货时间相匹配,则称两个订单是可分批的。

最后一英里递送

最后一英里送货不仅仅是从餐馆到送货地点的旅程。食品科技公司使用他们自己的地图来精确计算估计的送货时间,其中甚至包括送货主管行驶“ ”最后一英里所用的时间(“ 例如从社交大门到顾客门口所用的时间)。

他们利用历史数据和实时信号来构建和改进自己的地图,以满足自己的需求。

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

优化交付成本和时间

食品配送是一个需要解决的复杂问题,因为它涉及到在维持良好的客户体验和保持高效率的订单交付之间找到平衡。他们通过优化时间、成本和路线来做到这一点,即使是在不可避免的情况下(如下雨、交通问题和可用交付执行人员减少)。

他们通过减少送货员在餐馆的等待时间(当食物正在准备时)或者通过减少送货员等待分配给他/她的下一个订单所花费的时间来最小化未被利用的时间来实现这个目标。

云厨房位置

随着“云厨房”的出现,就规模和技术进步而言,最后一英里配送正在市场上掀起巨大风暴。

位置智能和人工智能正在帮助他们预测客户的购买模式,并在离送货上门需求更多的地方最近的云厨房中准备库存。

实时地理围栏

汉堡王使用实时地理围栏和位置智能来寻找任何一家门店 600 英尺范围内的客户,以便在任何一家门店点餐时提供数字优惠券折扣。

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

通过这种方式,他们优化了客户参与度,这有助于他们提高知名度并有效赢得客户。【来源】

基于位置的广告

随着消费者对他们的数据越来越放松,食品科技公司正在利用这一点,并利用实时位置在正确的时间锁定正确的客户。

基于位置的广告有许多优点,如更好的实时数据,公司从中获得的牵引力非常高。例如,在他们最常订购午餐的地方(如大学或商业场所),他们可以对各种小吃店提供的早餐进行促销。

不仅仅是这些,公司还在使用位置智能来查找区域取消率,找到一个地区的食品和配送管理人员的需求和供应比率,并获得配送和餐厅客流量及其变化的快照。

观看这段视频,直观地了解食品科技公司如何利用地理位置来管理他们的业务!

折扣/优惠

一个受欢迎的餐馆预订平台 Eatigo 使用位置智能根据客户的位置和时间以及其他因素(如星期几和天气条件)向客户提供折扣。

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

其目的是确定客户是否愿意为获得大量折扣而旅行。例如,如果提供的折扣更高,一个人可能会旅行 10 公里左右。【来源】

实时交通监控

公司正在监控实时交通,以相对了解他们的商店和竞争对手之间的消费者步行交通模式。不仅如此,这些以“快速服务”闻名的品牌正在利用实时流量来更好地洞察钱包的相对份额、竞争对手的商店访问量和客户忠诚度。

实时流量监控还有助于他们跟踪任何会妨碍业务流程有效执行的不可预见的情况。它还可以帮助他们监控资源和人员流动,以便他们可以有效地处理任何危机情况,还可以减少浪费。

位置不仅仅是地图上的一个点。组织正在使用位置分析来扩大他们的业务。食品科技公司利用这些数据来识别趋势,并通过跟踪骑手活动来改善客户体验。您可以访问我们的网站或在 LinkedIn 上与我们联系,了解更多信息。

人们使用不同药物的频率如何?

原文:https://towardsdatascience.com/how-frequently-do-people-use-different-drugs-f29255dfb339?source=collection_archive---------15-----------------------

关于 最令人沮丧的一件事告诉你的孩子 ,来自前纽约时报记者间谍小说家的反大麻传单!)亚历克斯·贝伦森(Alex Berenson)最有趣的一点是,它最有趣的点几乎完全与其论题无关。这个中心思想——粗略地说,即大麻导致精神病和精神分裂症,而精神病导致暴力,因此大麻导致暴力——无论是表面上的还是事后的都不令人信服。

贝伦森在这本书里花了如此多的篇幅讨论这种紧张的论点令人沮丧,正是因为它对大麻及其支持者进行了有益的批评。 TYC 做了一件伟大的工作,例如,指出医用大麻主要是合法化的潜在障碍。虽然这种药物有医疗用途,但它们似乎很少出现在 T21——它肯定不像某些人所说的那样具有医疗价值。

同样,贝伦森强调了一些关于大量使用大麻频率的惊人数据。为了简洁起见,我将引用他在《华尔街日报》的专栏中从 TYC 推出的内容:

大量使用大麻的美国人数正在飙升。2006 年,约 300 万美国人报告每年至少使用该药物 300 次,这是日常使用的标准。到 2017 年,这一数字增加到 800 万——接近每天饮酒的 1200 万美国人。换句话说,只有 1/15 的饮酒者每天饮酒;大约五分之一的大麻使用者经常使用大麻。

这些数字来自美国药物滥用和精神健康服务管理局每年对 70,000 多名美国人进行的全国药物使用和健康调查。NSDUH 是一个奇怪的生物:大约一半的样本是 12 至 25 岁的人,大概是因为 SAMHSA 对年轻人的吸毒行为比对普通人群更感兴趣。尽管如此,对于(通常不可靠的)自我报告的药物使用趋势来说,这是我们得到的最好的数据来源,所以它经常被使用/引用。

贝伦森关于大量高频率大麻消费者的说法让我吃惊,不是因为我怀疑,而是因为我从未想过要核实。所以我想深入研究不同物质的频率分布到底是什么样的。

我在这里做的一切都是基于 NSDUH 2017,标准权重(ANALWT_C)。你可以在这里得到一个. tsv 和码本。我会尽量标记变量名。我还要说的是,这些是 2017 年的数据,因此代表了近一年的药物使用趋势。NSDUH 拥有追溯到 2000 年代早期的数据,但我使用这个数据集的原因很简单,加载完整的时间序列数据需要花费永远的时间,这只是一篇博客文章。尽管如此,我还是要告诫不要从一年的使用数据中得出太强的结论。

也就是说,这里是 2017 年大麻使用者过去一年使用天数(MJYRTOT)的分布。(从技术上讲,它包括大麻印度大麻脂,但是,嗯,我不知道很多印度大麻脂使用者。)

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

这里有几个值得注意的特点。你可以开始看到贝伦森提到的 u 形曲线——大量低频用户,大量高频用户。此外,您可以看到 NSDUH 回答者喜欢近似自己的使用,这就是为什么您会得到那些大尖峰。

这么大的领域,很难看出趋势。为了便于解释,我将把 x 轴分成 60 天左右的组。这有一个额外的好处,那就是界定一年 300 多天的用户,这是贝伦森早先对“日常使用”的定义。(此图表和所有后续图表不包括非用户。)

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

所以,是的,2017 年约有 20%的大麻使用者是 300-365 天范围内的使用者。从上一张图表中我们还知道,这主要是因为人们报告了 365 天的使用。

但是这和其他物质相比如何呢?在推特 , SB Nation 的 Seth Pollack 问我酒精(ALCYRTOT)如何比较。(注意,我的推文每个月都会删除——这也是这篇文章在 Medium 上发表的原因之一!)下面是同样的宁滨下的图表:

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

酒精缺乏同样的 U 型曲线:大多数饮酒者喝一点点(0-60 天=最多一天或一周左右的饮酒时间),而那些饮酒较多的人大约平均分布。每天吸食大麻的人比喝酒的人多得多。

但是其他药物呢?在这里,我做了同样的事情,但用了六种主要物质——大麻、酒精、香烟、可卡因(COCYRTOT)、海洛因(HERYRTOT)和甲基苯丙胺(METHDYSYR)。

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

(有趣的是,NSDUH 只问上个月的吸烟情况;我刚刚把这个数字(CIG30USE)乘以 12,得出了一个年度估计值。)

这是怎么回事?我们已经知道酒精是什么样的了。毫不奇怪,绝大多数吸烟者每天都吸烟;相比之下,去年吸食可卡因的人很少使用。我不确定为什么后一个事实是真的——值得注意的是,我没有查看裂纹,它在 NSDUH 中被定界,并且可能显示不同的模式。事实上,可卡因和甲基苯丙胺之间的相似性表明,这两种药物的低使用频率可能是其低市场可获得性的功能——尽管正如 I其他人所指出的,这两种药物的使用正在增加。

虽然注意到这一数据的有限性,但海洛因和大麻使用模式的相似性是有趣的。这两种药物都有很大比例的非频繁使用者,还有相当数量的少数人(15-20%)每天使用。

大麻不像海洛因那样是一种“镇定剂”— 它被归类为兴奋剂和镇静剂。但是两者都有镇静和 T2 止痛的效果,这也是为什么大麻的支持者经常争论这种药物 T4 可能是治疗慢性疼痛的处方阿片类药物的替代品的部分原因;他们指出证据表明,有医疗法的州阿片类药物过量率的增幅较低(贝伦森准确地指出,随后的分析显示这一趋势正在消失;其他研究限制了药物/阿片类药物滥用之间的联系。

那么,有一个有趣的问题,这两者在社会背景下的可替代性。人们大量使用海洛因,或者可能更有用的处方阿片类药物,是出于与导致他们大量使用大麻相似的原因吗?(原则上,人们可以出于同样的原因大量使用两种不同药物中的一种——尤其是两种都具有显著的镇静作用——而非大量使用人群可以出于不同的原因使用它们。)大麻和海洛因在药理上并不相似,但它们越来越多的使用可能是以不同的化学表现形式表现出来的共同社会病理的产物。

在推测的基础上评估这种说法需要比我在这里看到的更多的数据(至少,要梳理出一年的影响,还要看看阿片类药物和大麻的使用是否比各自与其他药物的使用更共病)。所以我想转向另一个问题:不同的群体如何使用?

NSDUH 人口统计变量有点糟糕——这是一项调查的功能,主要集中在年轻人人口统计上,老年人是一种事后思考。此外,如果你把调查分割得太细,你就不会有任何接近代表性的东西。尽管如此,这里还是有性别、种族/民族、城市化和年龄。

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

性(IRSEX):在所有这些药物的高频使用者中,男性更常见,除了香烟(显然女性吸烟更重!).这并不奇怪,因为男人通常从事更危险的行为。

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

三个最常见群体的种族/民族(NEWRACE2):非 Hisp。白色,非。-他的计划。黑人和西班牙人。我很确定 N 太小了,不足以得出关于海洛因/冰毒的合理结论。可卡因的使用在黑人受访者中更为频繁(正如我在别处所写的,这与非裔美国人更高的可卡因过量致死率相吻合)。有趣的是,白人受访者更有可能酗酒和吸烟;大麻在不同种族中似乎同样受欢迎,在中等使用群体中,非洲裔美国人使用大麻的频率略高。

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

这是城市化(COUTYP4)。农村人吸烟更频繁;每个人喝的都差不多;鉴于 n 大小的相对差异,其他一切都很难一概而论。

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

最后,NSDUH 的一个不可靠的年龄变量(CATAGE)。同样,对底行和顶行的亚组样本量的严重关切基本上表明,使用随着年龄的增长而增加(大麻除外,大麻的大量使用者集中在 18 至 34 岁之间)。

纵观这一切,我有三点建议。

首先:我认为对大麻依赖的担忧可能有些道理,特别是如果男性比女性更有可能是重度使用者的话(因为重度大麻使用可能与低地位男性目前面临的那种问题并存)。

第二:海洛因/大麻的类比值得进一步探索,尽管我绝对不会致力于此。我深入研究了这两种药物的止痛和镇静作用,因为这些作用显然与社会/文化对逃避、脱离和压抑体验的渴望有关。Jill Jonnes (我认为)谈论了药物宏观历史中的兴奋/沮丧周期(社会在兴奋和沮丧之间摇摆不定)。如果我们处于情绪低落期,那么大麻和阿片类药物使用者的核心群体的存在是有道理的。

第三:我想看看可卡因使用和快克可卡因使用的长期趋势,试图理解为什么大多数可卡因使用者不经常使用。可卡因过量死亡与处方阿片类药物过量死亡一样常见,但人们似乎很少使用可卡因。这是否意味着可卡因危机真的是仅仅是芬太尼掺假?大多数死亡是由于快速投球,而单独使用可卡因是(相对)安全的吗?随着在哥伦比亚的产量持续增长,可卡因问题只会变得更糟——如何解释人们的可卡因消费选择?

(更新:感谢 Michael Josem(@ MichaelJosem)在第一张图中捕捉到一个标签错误的轴。现在已经修好了。)

有 VAR 的英超球迷有多沮丧?用情感分析来观察他们的反应

原文:https://towardsdatascience.com/how-frustrated-are-premier-league-fans-with-var-c8ae9c227418?source=collection_archive---------32-----------------------

什么是 VAR?

国际足联引入了视频助理裁判(VAR)来支持裁判的决策过程。过去有许多有争议的事件导致了 VAR 的引入。其中一次是在 2010 年世界杯淘汰赛中,英国队以 2:1 落后于德国队,当时弗兰克·兰帕德的射门击中横梁下侧,弹过了大约一码的球门线。但是裁判没看到。德国以 4 比 1 赢得了比赛,英格兰被淘汰出局。另一个是臭名昭著的蒂埃里·亨利在 2009 年对阵爱尔兰的手球。VAR 被设定为只在改变比赛的情况下使用,如进球、点球和红牌。这样,他们应该对游戏有最小的干扰。

为什么 VAR 出现在新闻中的原因是错误的?

从本赛季(2019–20)开始在英超联赛中引入 VAR。自本赛季开始以来,VAR 在英超联赛中购买的争议多于解决方案。11 月 10 日利物浦对曼城的比赛中发生的两起事件(特伦特·亚历山大-阿诺德的手球和莫·萨拉赫的越位判罚)最近成为英超联赛中的热门话题。本赛季有类似的事件发生,这使得范质疑 VAR 在英超联赛中的使用。

通过对英超球迷关于 VAR 的推文进行情感分析,我试图理解:

1。总体而言,英超球迷对 VAR 的使用持积极还是消极态度?

2。他们在关于 VAR 的推文中表现出什么样的情绪?

3。英超球迷在发关于 VAR 的微博时常用的词语有哪些?

4。基于他们支持的俱乐部,球迷对 VAR 的反应有什么不同吗?

为什么使用 Twitter 进行情感分析?

社交媒体已经从人们相互交谈的平台转变为人们分享观点、表达不满以及赞扬或批评机构和公众人物的媒介。在社交媒体平台中,Twitter 是人们用来评论或抱怨产品和事件以及谈论个性的主要平台。与其他写长篇故事的平台不同,由于大小限制,用户可以专注于他们的关键信息,因此很容易在 Twitter 上找到主题的脉搏。

如何在 R 中做情感分析?

r 中有许多可用于分析 Twitter 情绪的软件包。下面给出了一个广泛使用的软件包的逐步流程:

创建 Twitter 应用

Twitter 开发了一个 API,可以用来分析用户发布的推文。这个 API 帮助我们以结构化的格式提取数据,以便于分析。这里的给出了创建 twitter 应用程序的过程。当您创建一个在分析过程中提取推文所需的 twitter 应用程序时,会生成以下四个键:

消费者密钥(API 密钥)

消费者秘密(API 秘密)

访问令牌

访问令牌秘密

安装包并提取 tweet

安装情感分析所需的软件包。

# Install packages
install.packages("twitteR")
install.packages("RCurl")
install.packages("httr")
install.packages("syuzhet")# Load the required Packages
library(twitteR)
library(RCurl)
library(httr)
library(tm)
library(wordcloud)
library(syuzhet)

TwitteR 包提供了对 Twitter API 的访问。 RCurlhttr 包提供的功能允许用户编写 HTTP 请求并处理 Web 服务器返回的结果。Syuzhet 包用于从文本中提取情感和基于情感的情节弧线。syuzhet 包下的 nrc lexicon 让用户在一个文本文件中计算出除了两种情绪之外的八种不同情绪的存在及其相应的效价。

由于免费的 twitter 应用程序只允许用户提取过去 7 天的推文,我分析了英超球迷对 2019 年 11 月 9 日和 10 日举行的 Gameweek 12 比赛的 VAR 的反应。以下是 Gameweek 12 的成绩:

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

安装必要的包后的下一步是设置 Twitter API,调用 Twitter 应用程序并使用关键字提取数据。用于提取推文的关键词是“VAR”和“epl”。

# authorisation keys
consumer_key = "XXXXXXXXXXXXXXXX" 
consumer_secret = "XXXXXXXXXXXXXXX" 
access_token = "XXXXXXXXXXXXXXX" 
access_secret ="XXXXXXXXXXXXXXX" 

# set up
setup_twitter_oauth(consumer_key,consumer_secret,access_token, access_secret)# search for tweets in english language
tweetVAR = searchTwitter("VAR epl", n = 10000, lang = "en")# store the tweets into a dataframe
tweetsVAR.df = twListToDF(tweetVAR)

数据清理
Gsub
功能从推文中删除不想要的内容,如标签、数字、停用词和 URL,以便推文可以进行分析。

#cleaning tweets
tweetsVAR.df$text=gsub("&amp", "", tweetsVAR.df$text)
tweetsVAR.df$text = gsub("&amp", "", tweetsVAR.df$text)
tweetsVAR.df$text = gsub("(RT|via)((?:\\b\\W*@\\w+)+)", "", tweetsVAR.df$text)
tweetsVAR.df$text = gsub("@\\w+", "", tweetsVAR.df$text)
tweetsVAR.df$text = gsub("[[:punct:]]", "", tweetsVAR.df$text)
tweetsVAR.df$text = gsub("[[:digit:]]", "", tweetsVAR.df$text)
tweetsVAR.df$text = gsub("http\\w+", "", tweetsVAR.df$text)
tweetsVAR.df$text = gsub("[ \t]{2,}", "", tweetsVAR.df$text)
tweetsVAR.df$text = gsub("^\\s+|\\s+$", "", tweetsVAR.df$text)
tweetsVAR.df$text = gsub("penalty", "", tweetsVAR.df$text)
tweetsVAR.df$text = gsub("football", "", tweetsVAR.df$text)tweetsVAR.df$text <- iconv(tweetsVAR.df$text, "UTF-8", "ASCII", sub="")

分析情绪和可视化

Syuzhet 根据 2 种情绪和 8 种情感对每条推文进行评分。在下一步中,我使用了一个条形图来可视化在推文中占主导地位的情绪类型。

# Emotions for each tweet using NRC dictionary
emotions <- get_nrc_sentiment(tweetsVAR.df$text)
emo_bar = colSums(emotions)
emo_sum = data.frame(count=emo_bar, emotion=names(emo_bar))
emo_sum$emotion = factor(emo_sum$emotion, 
                         levels=emo_sum$emotion[order(emo_sum$count, decreasing = TRUE)])# Visualize the emotions from NRC sentiments
var <- ggplot(emo_sum, aes(x=emotion, y= count, fill = emotion))+
  geom_bar (stat = "identity")+
  ggtitle("Sentiments and Emotions about VAR in EPL")var

情感分析的结果

有哪些关于 VAR 的感悟,展现了怎样的情绪?

英超球迷对 VAR 的使用总体持负面看法,因为负面看法的数量高于正面看法。就表达的情绪而言,悲伤、愤怒和恐惧等负面情绪主导了喜悦和惊喜等情绪。情况可能是这样的,消极情绪在本周的比赛中特别严重,因为在几场比赛中有许多有争议的决定,特别是利物浦对曼城和热刺对谢菲尔德联队。

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

英超球迷在发关于 VAR 的微博时常用的词语有哪些?

我使用了 wordcloud 软件包来了解不同类型的情绪是由哪些词组成的。 comparison.cloud 功能可以比较不同类别中不同单词的使用频率。在这种情况下,我比较了不同类型情绪下的单词频率。

# Create comparison word cloud visualizationwordcloud_tweet = c(
  paste(tweetsVAR.df$text[emotions$anger > 0], collapse=" "),
  paste(tweetsVAR.df$text[emotions$anticipation > 0], collapse=" "),
  paste(tweetsVAR.df$text[emotions$disgust > 0], collapse=" "),
  paste(tweetsVAR.df$text[emotions$fear > 0], collapse=" "),
  paste(tweetsVAR.df$text[emotions$joy > 0], collapse=" "),
  paste(tweetsVAR.df$text[emotions$sadness > 0], collapse=" "),
  paste(tweetsVAR.df$text[emotions$surprise > 0], collapse=" "),
  paste(tweetsVAR.df$text[emotions$trust > 0], collapse=" ")
)# create corpus
corpus = Corpus(VectorSource(wordcloud_tweet))# remove punctuation, convert every word in lower case and remove stop words
corpus = tm_map(corpus, tolower)
corpus = tm_map(corpus, removePunctuation)
corpus = tm_map(corpus, removeWords, c(stopwords("english")))
corpus = tm_map(corpus, stemDocument)# create document term matrix
tdm = TermDocumentMatrix(corpus)# convert as matrix
tdm = as.matrix(tdm)
tdmnew <- tdm[nchar(rownames(tdm)) < 11,]# column name binding
colnames(tdm) = c('anger', 'anticipation', 'disgust', 'fear', 'joy', 'sadness', 'surprise', 'trust')
colnames(tdmnew) <- colnames(tdm)
par(mar = rep(0, 4)) 
comparison.cloud(tdmnew, random.order=FALSE,
                 colors = c("#00B2FF", "red", "#FF0099", "#6600CC", "green", "orange", "blue", "brown"),
                 title.size=1, max.words=250, scale=c(2.5, 0.4),rot.per=0.4)

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

当我最初运行代码时,我发现像“惩罚”这样的词被归类到情绪的恐惧类别下,而“足球”被归类到快乐类别下。对于一般文本的情感分析,这是有意义的,因为处罚意味着支付罚款,而足球意味着进行一项可以归类为快乐的运动。但是对于这个特定的分析,这些分类没有意义,因此使用 gsub 函数将这些词从 tweets 中删除。

基于球迷支持的俱乐部,球迷对 VAR 的反应有什么不同吗?

我假设英超球迷对使用 VAR 的反应取决于他们的俱乐部在特定比赛周的表现,以及使用 VAR 对他们的球队产生积极还是消极的结果。因此,我为四家俱乐部(利物浦、曼联、阿森纳和托特纳姆热刺)创建了单独的数据框架,以使用“VAR”和各自俱乐部的官方 twitter id 作为关键词来提取推文。然后我对四个俱乐部进行了情绪分析。

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

正如假设的那样,在利物浦和曼联的球迷中,他们的球队在这个特定的比赛周赢得了比赛,而在阿森纳和托特纳姆的球迷中,他们对 VAR 的整体情绪是积极的,而在他们各自输掉的比赛中,他们的整体情绪是消极的。

在本赛季被引入英超之前,VAR 已经在 2018 年 FIFA 世界杯和欧洲俱乐部比赛中使用。事实证明,在很多情况下,这对于帮助裁判做出正确的决定至关重要。在 2019 年 4 月的冠军联赛半决赛中,VAR 排除了拉希姆·斯特林(Raheem Sterling)最后一分钟的进球,这个进球本来可以让曼城晋级。那个进球因越位被判无效,托特纳姆反而进步了。令人惊讶的是,英超裁判从未使用过球场边的监视器来辅助裁判。最近的股东大会上,英超联赛和 PGMOL 承诺改善 VAR 的实施和裁判对球场边监视器的定期使用,预计将减少围绕 VAR 的争议并改变围绕 VAR 的情绪。

与游戏网站相比,游戏玩家如何评价视频游戏。

原文:https://towardsdatascience.com/how-gamers-rate-video-games-compared-to-gaming-websites-a07d5c9f308a?source=collection_archive---------26-----------------------

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

洞察玩家对游戏和网站的不同看法

我记得当我拿到我的 Wii 时那种兴奋的感觉。我打开盒子,把游戏机连接到电视上。我打开了控制台。然后,我把 Wii Sports 的游戏插入 CD 槽。一个显示 Wii Sports 的新图标被创建在屏幕的多个框中的一个框中。

我点击它,它把我带到一个屏幕,让我从多种体育游戏中进行选择,如拳击、网球、高尔夫和棒球。然后,我开始玩这些游戏。玩这些游戏不仅仅是按下按钮在电视屏幕上创造运动,还可以完成不同的任务。

当我玩这些游戏的时候,我感到娱乐和受教育的同时。当我学习棒球中的一垒、二垒、三垒和全垒打时,我把它作为一种放松的方式。因此,我开始将游戏视为一种生活方式。

游戏绝对是一项引人入胜的活动,可以让你在网上和网下都玩得开心。游戏产业也生产很多游戏。当他们制作这些游戏时,他们试图从他们的观众那里得到反馈。

此外,网站评论家和游戏玩家都对这些游戏进行评级。在看了 YouTuber 对视频游戏的评论,并看到它们在网站上的评级后,我对双方的差异感到惊讶。

因此,我很想知道游戏玩家对视频游戏和网站的评价有什么不同。

数据集

我寻找代表我所寻找的最佳数据集,我在 Kaggle 上找到了一个 这里 。我下载上传到 Jupyter 笔记本进行编码。

我清理了数据集,删除了不必要的列,留下了重要的列,如平台、网站评级和用户评级。用于执行该清洁过程的代码是:

df_game = df_data_1[['platform', 'website_rating', 'user_rating']]

包含 android、iPhone 和 PC 游戏的行被删除,因为该研究主要与主机游戏相关。删除这些行的代码是:

df_game = df_game[df_game['platform'] != 'Android']
df_game = df_game[df_game['platform'] != 'iPhone'] 
df_game = df_game[df_game['platform'] != 'PC']

清理数据集后,创建了一个新的数据集。下面是新形成的数据集的快照:

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

A dataset of the gaming platforms with their respective website ratings and gamers’ ratings

最高等级的游戏

数据集被重新排列了两次。首先,找出哪个游戏在网站评分中是最高的。第二次是找出游戏玩家中评分最高的游戏。

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

Top 10 highest rated games based on website rating

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

Top 10 highest rated games based on gamers

根据网站评论,有史以来评分最高的游戏是 Wii 的 Xenoblade Chronicles、PS2 的《侠盗猎车手:圣安地列斯》、DreamCast 的《大都会街头赛车》、DreamCast 的《神木》和任天堂 64 的****的塞尔达Majora Mask。有史以来基于游戏玩家评分最高的游戏是 PS3 的游戏《XCOM:敌人在和愤怒的小鸟三部曲》。

游戏玩家评分与网站评分

首先构建了散点图,以查看游戏玩家的评级和网站评级之间的密切关系。

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

A scatter plot of gamers’ ratings vs website ratings

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

Correlation coefficient of website rating and gamers’ rating

根据散点图,它们具有中度正相关关系,相关系数为 0.477。这表明两党对大多数游戏的评级并不完全一致。

然后,绘制了一个图表来显示每个平台的平均玩家评分和网站评分之间的差异。这是图表:

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

Website ratings vs Gamers’ ratings by platform

根据图表,游戏玩家的评分用红条表示,而网站的评分用蓝条表示。游戏玩家和网站平均评分最高的游戏主机是任天堂 64,网站和游戏玩家的评分分别为 9.2 和 8.13。游戏玩家对游戏的平均评分最低的游戏主机是任天堂 DS,评分为 7.19。网站有史以来平均评分最低的游戏控制台是 N-Gage,评分为 6.33。

结论

根据最高评级游戏的结果、条形图和散点图,可以准确地说,网站评论家和游戏玩家对视频游戏应该获得的评级意见不一。

用于进行这项研究的完整版本代码可以在这里 看到。

游戏如何改变数据科学产业

原文:https://towardsdatascience.com/how-gaming-can-change-the-data-science-industry-a711e52e0fc7?source=collection_archive---------22-----------------------

游戏如何成为数据科学和人工智能发展的基准

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

AI AT PLAY — Walter Newton

数据科学的传播

O 在过去的几年里,数据科学变得越来越普及,越来越深入我们生活的方方面面。从亚马逊上的大规模营销活动到 YouTube 上的推荐标签,数据科学已经成为跟踪和分析日常决策的工具。即使你一开始没有意识到,数据科学也支配着我们生活的许多不同方面。这种多功能性使它成为最受欢迎的工作职位和大学专业之一。分析数据的能力已经成为任何工作的重要方面。

数据科学已经扩散到几乎每个行业,但仍有一些行业刚刚触及其表面,其中之一是游戏行业。从历史上看,游戏是一个主要以人为导向的行业。游戏一般是人类做出来给人类玩的。但最近,随着人工智能机器人的诞生,这种情况开始发生变化,这些机器人甚至可以玩最复杂的游戏,从在线扑克到大型多人游戏,如 Dota 2 和星际争霸 2。将人工智能引入游戏行业,为数据科学和这两个行业的合并开辟了一条全新的道路。

游戏中的数据

当想到游戏时,数据通常不是首先想到的。你可能会思考游戏背后的规则、策略,甚至是知识。但所有类型游戏的一个关键特征是数据。在玩游戏的时候,你在不断地收集数据,有意或无意地收集当前游戏状态的数据,并根据这些数据做出预测和决策。**根据数据做出预测和决策,**这就是数据科学的意义所在!游戏不仅加载了数据,而且数据本身比公共数据集更容易访问,也更有用。游戏数据也可以由个人收集,并且不需要过多的时间和资源。对于数据科学家来说,游戏是一种获得各种数据集的惊人方式,也是人工智能开发人员测试新算法和理论的绝佳方式。

面向数据的游戏

像《数据 2》和《星际争霸 2》这样的现代多人游戏是很好的游戏,可以将数据科学和游戏更紧密地结合在一起,使它们更容易理解。像 Dota 2 和 Starcraft 2 这样的游戏有大量的数据可以利用,然而,这些数据中有很多是对玩家隐藏的。例如,在 Dota 2 中,你并不总是知道你的约会在哪里,或者他们能看到地图的哪个部分。在星际争霸 2 中,地图以及你对手的基地和资源都是隐藏的。这种不完善的信息正是数据科学的用武之地。利用数据科学和游戏历史,你可以预测你的对手在做什么。这也是这些游戏成为训练 AI 新标杆的原因。有这么多不完善的信息,人工智能驱动的机器人需要实际学习游戏,并理解更复杂的游戏机制,如资源管理、耐心和长期战略发展。这就是为什么这些游戏是数据科学家获得大量数据进行分析和研究的绝佳机会。这些游戏也是一些全球最受欢迎和最知名的游戏,因此使它们成为将游戏和数据科学结合在一起的伟大发射台。

新一代游戏

有了这些数据,为什么不开发利用这些数据的游戏呢?通过创建一个围绕数据使用的游戏框架,将是为创新数据科学、机器学习和游戏创造环境的第一步。这个新的游戏框架将把数据科学、人工智能和游戏这三个行业结合在一起,并让人们有机会以一种全新的方式体验和参与人工智能开发和数据科学。随着对数据科学家的巨大需求,为那些对该领域感兴趣并积极参与的人创造一种有趣的互动方式将极大地推动数据科学和人工智能的发展。容易获取数据的另一个好处是节省时间。通过减少收集数据的时间和精力,数据科学家可以将更多时间用于创新和尝试新理论。

GANs 是如何工作的

原文:https://towardsdatascience.com/how-gans-really-work-2e1db1f407bb?source=collection_archive---------12-----------------------

通过对抗训练学习完整的概率分布

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

我是一名学习机器的学生,和我们一样,我听说到处都有人在研究甘、甘、甘。他们可以创造出看起来非常真实的图像。我没有真正注意,因为我当时(现在仍然)专注于强化学习,而不是计算机视觉。我当时正在批判这种“赶甘”,有一天我一头扎进去,看到了这一点。

假设你在一个空间 E 中有一个有限的点集 X,这些点集是从 E 上的一个概率分布π中采样得到的,X 是一个更大的集合 A 的子集,A 是π可以到达的整个点集(即严格正概率的点)。例如,X 由 1000 幅代表一只狗的图像组成,A 是一组完整的狗的图像。你想知道π,在给定子集 x 的情况下,π在 A 上采样。

可测性

如果 E 是不可测量的,也就是说,如果没有数据(例如,单词),我们就不能将 E 的元素彼此直接联系起来,那么问题就不再是问题了。除了离散的概率分布之外,我们没有什么可以“学习”的:计算 X 中每个点的出现次数,然后除以 X 的基数。X 中的每个元素的概率都是 0。如果我给你单词列表[“你好”、“你好”、“你好”、“好”、“坏”、“猫”、“猫”],对你来说最好的采样是什么?没有比概率 3/7 的“你好”,1/7 的“好”,1/7 的“坏”,2/7 的“猫”更好的了。

如果 E 是可测量的,就像图像一样(如果两个图像的像素接近,则它们可以是“接近的”),即一个可以比较元素的空间,那么问题就变得真实了。我们可以从我们拥有的数据集(X)中提取特征,从π中生成新的样本。对于狗的图像,我们期望从我们的数据集中提取特征来生成“假的”或“新的”狗图像,也就是说来自 A \ X 的元素。

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

什么不是甘

我想很早就明确。gan 是而不是对“最接近”或“最适合”数据集的点进行采样。他们没有最大化单个样本的可能性,但他们最小化了真实分布和生成分布之间的总距离(如 KL-divergence,JS-divergence 等)。这造成了巨大的差异,在我看来,许多人并没有意识到这一点。看起来学习分布,这是一个非常困难的任务,在“最佳拟合”任务中取得了非常好的结果。例如看起来像狗的狗的样本图像。但是 GANs 能够从我们的数据集 X 的分布中取样,不仅仅是找到一个“好”的匹配,或者一些“看似合理”的东西。它将对所有狗的图像进行采样(如果数据集足够大的话)。

因此,你有一组生活在 256^(NxN)-length 空间(对于 n×n 的灰色图像)的图像,或一组生活在 12^(64)长度空间的棋盘,或一组生活在 1000^(T)长度空间的声音,你想从这个集合的概率分布中取样。比方说,你有 X = A 的狗图像,即所有代表狗的图像。这个集合定义了图像集合的概率分布,其中大多数图像的概率为 0(如飞机或黄瓜),但一些图像(狗或相关动物)的概率较高。在实践中,我们没有所有的狗图像,我们假设 1000 或 10000 张图像足以近似分布。但是,我们如何学习分布,并从中取样来创建一个狗的图像呢?国际象棋棋盘也是一样:如果我们有一套最终棋(将死)棋盘,我们能知道所有将死棋盘的分布吗?

首先,我们需要一个生成器,一个可以对 s 元素进行采样的机器。神经网络是很好的“黑盒”机器,所以它是生成器的一个很好的选择。我们给网络高斯(或任何)噪声,它以 s 输出一些东西。下图左边的“z”是噪声,右边的 G(z)是生成的样本(此处为图像)。然后,我们将需要训练它,以便根据期望的分布进行采样。这是最难的部分。

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

A convolutional generator (source: DCGAN)

第一种方法

我们有一个生成器,一组数据 X,我们希望训练生成器从 X 的基本分布中正确采样。首先要计算输出分布和实际分布之间的交叉熵,并将其最小化。不幸的是,这两个我们都没有权限!我们不能直接计算输出密度,它只包含在发生器的参数中。真正的密度是我们试图学习的,即使训练一个网络逐点学习概率也是无用的。

我们还可以尝试使用可微分距离(交叉熵或 2 范数)将输出样本与来自 X 的真实样本进行匹配。但它只会给我们一个样本的“平均值”,就像一个重心,而不是一个真正的分布。

对抗方法

这个想法很简单,但是很神奇。博弈论里有个东西叫纳什均衡。这是非常强大的东西,它再次证明了自己的力量。如果你和某人玩一个零和游戏(也就是说,两者中只有一个能赢,另一个输),有一个最优策略可以玩,这个策略不能被利用。因此,你不会总是赢,但你不能输。最糟糕的事情可能是平局,如果在比赛中有可能的话。这个策略被称为纳什均衡。

我们将设计一个博弈,它的纳什均衡是当生成器在真实分布(A 的分布)上精确采样时。生成器将与鉴别器进行比赛,鉴别器将确定样本是真的(来自真实分布)还是假的(来自生成器分布),基本上为样本分配从 0 到 1 的分数。生成器的目标是欺骗鉴别器(也就是说具有尽可能高的分数),鉴别器的目标是很好地鉴别(也就是说对于假样本具有尽可能低的分数,对于真样本具有最好的分数)。这不是一个对称的游戏,但它是零和游戏。

鉴别器被教导同时将 1 分配给一批真实样本(来自 X),将 0 分配给另一批假样本。生成器试图最大化它的分数,所以它的损失只是减去鉴别器赋值。收敛时,鉴频器始终输出 0.5 和所需分布上的发生器样本。鉴别器不输出我们的分布概率( π)!

为什么有效?假设我们处于平衡状态,生成器没有对 X 的基本分布(即 A 的分布,或真实分布)进行采样。例如,对于某个点 x,真实概率是 0.3,生成器仅以 0.2 对其进行采样。那么在这个 x 上,鉴别器将被“输入”多于 0 的 1,因此 x 的分数将上升,超过 0.5。但是生成器想要最大化它的分数,所以由于每隔一个分数是 0.5,唯一的可能就是增加 x 的采样率,以便“攫取”这个额外的分数。

我们保证,有了一个完美的鉴别器,生成器将收敛到完美的解决方案。因此,拥有一个好的鉴别器非常重要。然而,如果鉴别器是完美的,他不会给生成器梯度,因为它的样本的分数总是 0。良好的混合是必要的

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

GAN algorithm

网络近似

另一点在遗传神经网络中至关重要:神经网络是逼近器。实际上,对抗式方法不需要近似,我们可以用“完美”模型来实现。但矛盾的是,它的力量会小得多。对于理想模型,当发生器分布是我们的有限集合 X 的分布时,就达到了最优。也就是说,生成器将只输出 X 的样本,而鉴别器将把 0.5 加到 X 的每个元素上,其他地方随机小于 0.5。但我们不想那样。我们想从 A 中取样,即“真实”集,而不是我们的数据。我们希望生成新的样本,新的情况,来描述与 x 相同的高级特征。这正是网络所做的:我们利用他们的弱点来获取利润。如果训练有素,网络不会过度拟合(令人惊讶的是,这是一个将损失降至最低的好主意),但接近于具有良好的验证测试分数。因此,生成器将从 A 而不是 X 进行采样,因为网络并不完美,并且会尝试进行泛化。

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

实践中

让我们看看它在实践中是什么样子的。我们将取 E = R,并尝试对特定分布进行采样。

建立

发生器和鉴别器是密集网络。第一个有 4 个隐藏层,每个层有 50 个神经元,中心高斯噪声作为维数 15 的输入,输出为 R。鉴别器有维数 2 的输入,3 个大小为[100,50,50]的隐藏层和一个单个乙状结肠输出神经元。除了最后一个乙状结肠激活外,所有激活都有漏洞。

学习率为 1e-5。优化器是 Adam 优化器,beta1 为 0.9,beta2 为 0.999。对于每个网络,我每个时代都采用 10 个学习步骤。这批货是 500 号的。

这个代码很大程度上是从这个中获得灵感的。

离散分布

这里 A 是有限的,取 X = A。我们在 A = {(-1,0)、(1,0)},π(a) = 1/2 上对 GAN 模型进行了测试,得到了以下结果:

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

如您所见,这些点很快会集中在所需的点(A)上,正如预期的那样,每个点的概率为 0.5。

圆形分布

这里 A 是一个以 0 为中心的圆,半径为 1。π也是 a 上的均匀分布。

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

这些点很快在圆上均匀分布。

和 VAE 呢?

让我们看看 VAE 的结果,以供比较(使用相同的参数、图层大小等)。

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

也许你更明白我之前说的话。vae 正在做这项工作,但结果模糊不清。

不收敛和模式崩溃

我有一个可怕的消息。gan 不能保证收敛。

正如我之前提到的,网络是不完美的。因此,他们可以“忘记”旧的数据点来记住新的数据点。假设 A 由 4 个点组成,(-1,0)、(1,0)、(0,1)和(0,-1),π也是 A 上的均匀分布。第一种可能性是 GAN 收敛于π,正如我之前仅用两个点展示的那样。还有一种可能是生成器和鉴别器会一直互相追逐,永远不收敛。生成器只能生成(-1,0),然后鉴别器将不断降低该点的分数,生成器将移动到下一个点,比如(1,0)。以此类推,无限期。这是一种可能的均衡状态,但不是纳什均衡。

让我们看看实际情况:

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

我稍微改变了一下网络的参数来强制不收敛。这种模式不再趋同,而是定期在三个不同的地方移动。

另一个密切相关的问题是模式崩溃。“模式”是我们发行版的主要特征。在 R 中,这实际上是不相关的,因为我们的模式是我们的 4 个点,但是例如 MNIST 图像有 10 个不同的模式,10 个可能的数字。生成器有时只生成有限数量的模式,而忘记其他模式。如果方差太小,它就走不出这个陷阱,因为梯度太小。模式崩溃在 GANs 中是一个真正的问题,而且经常发生。主要的解决方案是超参数调整,但是几年来已经有了许多有趣的尝试。

如果您想了解更多关于提高 GAN 性能的方法,我推荐您阅读本文。

结论

GANs 是从数据中恢复未知概率分布的强大工具。许多问题都与这个“密度估计”问题有关,因此它非常强大。

你可以在本帖上看到不同类型数据的奇特应用。

[1] I .古德费勒、j .普热-阿巴迪、m .米尔扎、b .徐、d .沃德-法利、s .奥泽尔、a .库维尔和 y .本吉奥。生成对抗性网络(2014 年),NIPS 2014 年。

利用主成分分析和聚类分析基因与白血病

原文:https://towardsdatascience.com/how-gene-expression-related-to-leukemia-type-using-pca-and-hierarchical-clustering-c8561303853a?source=collection_archive---------24-----------------------

机器学习:无监督学习

无监督学习的现实应用

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

Photo by NASA on Unsplash

在机器学习的世界中,无监督学习是在没有标记结果的情况下进行推理的过程。主成分分析和聚类是两种常见的无监督学习技术。

PCA 是将高维数据缩减为几层关键特征的过程。降维后,我们只需要处理一小部分特征,其他的就不考虑了。

聚类是将具有相似特征的数据输入分配给特定组的任务。聚类后,同一组中的数据点应该是相似的,但与其他组中的数据点明显不同。

在这篇文章中,我将把主成分分析和层次聚类应用于生命科学数据集,以分析特定基因如何影响白血病类型。

该数据集最初由 Yeoh 等人(2002 年)从 327 名患者(此处为)的 7 种白血病亚型中收集了 3141 个基因。

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

Photo by Dennis Kummer on Unsplash

#加载数据集并转换数据类型

将 leukemia_data 的数据类型由字符型改为因子型。

knitr::opts_chunk$set(echo = TRUE)
library(dplyr)
library(readr)
leukemia_data <- read_csv(“leukemia_data.csv”)
leukemia_data = leukemia_data %>% 
 mutate(Type=as.factor(leukemia_data$Type))#Display different types of leukemia and count the numbers of each type
#doing explorative data analysis is always preferred for all types of researchtable(leukemia_data$Type)BCR-ABL  E2A-PBX1 Hyperdip50     MLL    OTHERS     T-ALL    TEL-AML1 
15         27         64         20       79         43         79

一些描述性数据:BCR-ABL 是最不常见的白血病类型,TEL-AML1 是数据集中最常见的。

#降维

由于有 3141 个基因,我们应该使用主成分分析来减少数量,使之易于解释。

# generate PCA results;
# scale=TRUE and center=TRUE --> mean 0 and variance 1
pr.out=prcomp(select(leukemia_data,-1),scale=TRUE, center=TRUE)# pr.out$sdev: the standard deviations of the principal components; 
# (pr.out$sdev)²: variance of the principal components
pr.var=(pr.out$sdev)²# pve: variance explained by the principal component
pve = pr.var/sum(pr.var)# cumulative explained variance
cumulative_pve <-cumsum(pve)# Plot them 
par(mfrow=c(1, 2))
plot(pve, type=”l”, lwd=3) 
plot(cumulative_pve, type=”l”, lwd=3)

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

PVE and Cumulative PVE

这两个图直观地说明了几个关键特征可以解释总方差的大部分。

#问题:哪些基因在第一主成分(aka。PC1)?

#project loadings on PC1
Loadings_PC_1 <- pr.out$rotation[,1]#in absolute value
Loadings_PC_1_ABS <- abs(Loadings_PC_1)#print and sort the results
print(head(sort(Loadings_PC_1_ABS,decreasing = TRUE)))SEMA3F       CCT2       LDHB      COX6C     SNRPD2       ELK3 
0.04517148 0.04323818 0.04231619 0.04183480 0.04179822 0.04155821

PC1 上负载最高的前六个基因是:SEMA3F、CCT2、LDHB、COX6C、SNRPD2 和 ELK3。

#plot the data into the first two principal component dimensions
Projection_1_PC = pr.out$x[,1]
Projection_2_PC = pr.out$x[,2]rainbow_colors <- rainbow(7)
plot_colors <- rainbow_colors[leukemia_data$Type]plot(Projection_1_PC,Projection_2_PC,cex=0.4,col=plot_colors)
text(Projection_1_PC,Projection_2_PC,labels=leukemia_data$Type,col=plot_colors)

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

只有 T-all(右上角)是从人群中挑选出来的;其他类型的白血病还粘在一起。换句话说,前两种成分并不是分离的理想选择。

让我们试试第一台和第三台电脑。

Projection_3_PC = pr.out$x[,3]
rainbow_colors <- rainbow(7)
plot_colors <- rainbow_colors[leukemia_data$Type]
plot(Projection_1_PC,Projection_3_PC,cex=0.4,col=plot_colors)
text(Projection_1_PC,Projection_3_PC,labels=leukemia_data$Type,col=plot_colors)

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

相比之下,第 1 台和第 3 台电脑做得更好,因为分布分散在不同的地区。

#项目到 PCs

#install.packages(c(“ggridges”,”ggplot2",”tidyverse”))
library(ggplot2)
library(ggridges)
library(tibble)#project on PC1
z1 = pr.out$x[,1]#create a new tibble where the first column is the project of the data on the first PC and the second is the leukemia type
TB_1 = tibble(z1,leukemia_data$Type)#plot it 
ggplot(TB_1, aes(x = z1, y = leukemia_data$Type, fill = leukemia_data$Type)) + geom_density_ridges()

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

z1

看来 z1 分不清不同类型。

我们试试 z3。

z3 = pr.out$x[,3]
TB_3 = tibble(z3,leukemia_data$Type)
ggplot(TB_3, aes(x = z3, y = leukemia_data$Type, fill = leukemia_data$Type)) +
 geom_density_ridges()

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

z3

很好,我们将 E2A-PBX1(底部的橙色分布)稍微向左移动,将 hyperdip 50(E2A-PBX 1 上方的绿色分布)稍微向右移动。

#让我们应用层次化 聚类对不同类型的白血病进行分组

创建一个包括三种类型白血病的亚组:T-ALL、TEL-AML1 或 Hyperdip50。

library(dplyr)#subset
leukemia_subset <- filter(leukemia_data,Type==”T-ALL”|Type==”TEL-AML1"|Type==”Hyperdip50")#scale() function helps standardization
scaled_leukemia_subset <- scale(leukemia_subset[,-1],center=TRUE, scale=TRUE)#remove the first column and scale it#euclidean distance matrix
scaled_leukemia_subset_dist <- dist(scaled_leukemia_subset,method=”euclidean” )##hierarchical clustering using complete linkage
set.seed(1)
leukemia.hclust = hclust(scaled_leukemia_subset_dist,method=”complete”)plot(leukemia.hclust, labels=leukemia_subset$Type, main=’Hierarchical Clusting of Leukemia Subset Data’)

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

Hierarchical Clustering of Leukemia Subset Data, aka. a dendrogram

分级聚类做得非常好,因为同种类型的白血病聚集在一起,而不同类型的则远离。

喜欢读这本书吗?

请在 LinkedInYoutube 上找到我。

还有,看看我其他关于人工智能和机器学习的帖子。

地理测绘如何帮助识别全球恐怖主义的趋势

原文:https://towardsdatascience.com/how-geo-mapping-helps-identify-trends-in-global-terrorism-5881bf0a0659?source=collection_archive---------22-----------------------

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

联合国估计,到 2050 年,将近 70%的世界人口将生活在城市地区。住在城市有明显的好处,如公共交通基础设施、景点、购物和获得医疗服务。相反,缺点包括生活成本增加、噪音、光污染和空间有限。数据科学为我们提供了多种方法来量化城市住宅的利弊。该流程允许我们使用从分析流程中收集的见解做出明智的决策。

在本周的文章中,我试图确定与农村地区相比,城市是否提供了更高的安全性。如果是这样的话,我接下来想知道哪些国家提供了最安全的城市。在完成了对不同数据集的彻底比较后,我得出了这个概念。我决定围绕数据建立一个故事,而不是从叙述到数据。本文中使用的数据源包含 180,000 多条记录。这提供了足够的信息来创造一个故事,并获得有意义的见解。

试图回答城市和国家的安全问题的第一步需要选择正确的指标。这一结论是由现有数据确定的。在数据科学领域,Kaggle 因维护从葡萄酒评论到棒球统计数据的大量数据集而闻名。我选择了全球恐怖主义数据库,这是一个由墨尔本大学国家恐怖主义研究联盟维护的综合数据集。该数据库包含关于伤亡、动机、肇事者和地理信息的详细信息。

下一步是在 Jupyter 笔记本上用 Python 读取 Excel 表格。这个特定的数据集包括不同级别的地理指标。为了确定哪些国家的恐怖袭击发生率最高,我决定按地区分组。这是用一个叫做 Altair 的 Python 包完成的。这个可视化库提供了强大的特性集和令人印象深刻的视觉效果。

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

上图包含了恐怖袭击数量最多的三个地区的国家。值得注意的是,法国、英国和美国等地被排除在外,因为它们各自所在地区的攻击数量相对较少。这种视觉效果不是使用原始数字,而是给出了攻击最常发生的位置,并确定了最大的区域贡献者。

在大致确定了攻击发生的位置后,下一步包括探索数据以利用另一个指标。下图中的饼图描述了不同类型攻击的比例。虽然数据源按类型对攻击有不同级别的详细信息,但为了简单起见,只使用了最高级别的分类。另一个 Python 库 Matplotlib 包括一种称为“爆炸”的技术,它允许楔形突出。

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

当处理饼图中特别细的切片时,这种技术可以提供简单的视觉直觉。条形图为显示相关组提供了另一种选择,但是,我觉得饼图更好地展示了比例性。

虽然我们已经大致了解了全球攻击的主要国家,但只有地图才能提供这种情况的确切答案。全球恐怖主义数据库从其他数据库中脱颖而出,因为它包含了每个记录的经度和纬度坐标。这些坐标无疑是最精确的地理测绘选项。在全球制图范围内,歧义、不完整的名称和拼写的变化极大地限制了使用其他指标(如城市和城镇)的能力。Tableau 等程序擅长使用这些指标来确定位置,但是,在超过 180,000 条记录的规模上,必须采取其他方法。在这种特殊情况下,仍然有大约 30,000 行程序无法解释。

[## 恐怖分子地图

恐怖分子地图

TerroristMappublic.tableau.com](https://public.tableau.com/shared/SHZQDP26C?:display_count=no&:origin=viz_share_link)

谷歌的数据集搜索引擎是如何工作的

原文:https://towardsdatascience.com/how-googles-dataset-search-engine-work-928fa5237787?source=collection_archive---------24-----------------------

以及如何让它变得更好

谷歌数据集搜索出来已经一年了。工作起来很有魅力,但尽管付出了所有的努力,它仍然处于测试阶段。这篇文章的目的是让你知道它是如何工作的,以及你可以如何做得更好。

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

你一天在谷歌上搜索多少次?也许 10 次?或者可能超过 100 个,这取决于你的工作,没人会统计。但是我们对几乎每一个我们不知道的问题的基本直觉是——“谷歌一下”。

数据集也是一样,每当我们需要为我们的下一个项目找到一个强大的数据集时,我们经常求助于谷歌或任何其他你经常去的数据仓库,例如 UCI。对来自这些存储库的数据的关注是所有的数据集都被优先使用和探索。在谷歌上找到一个新的数据集不像你找到一部电影、一本书或一份工作那么容易。谷歌知道这一点。

数据集已经建立了很长一段时间,并且采用了不同的格式。没有办法从互联网深处找到原始数据或与这些数据集相关的元数据,这正是谷歌试图解决的问题。当每个人都试图从数据中获得洞察力时,谷歌试图一劳永逸地解决找到数据的问题。

具体是怎么运作的?

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

Source

当数据集具有支持信息(如名称、描述和分发格式)时,更容易找到数据集。谷歌严重依赖数据集提供商,无论大小,使用开放的schema.org/Dataset标准在他们的网站上添加结构化元数据。元数据指定了每个数据集的重要属性,从中可以很容易地找到数据集。

然后,数据集搜索工具使用这些元数据,将其与 Google 上的其他可用资源相链接(识别数据集的副本,通过查看 Google scholar 找到数据集的原始作者),并为这些丰富的元数据建立索引。一旦建立了索引,Google 就可以开始回答用户的查询,并在这个过程中了解哪些结果最符合查询。

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

Google Dataset Search

然而,虽然谷歌确实解决了大多数技术问题,但该项目在首次发布 1 年后仍处于测试阶段,如果你是一个每天或每周处理数据的人,你可以帮助谷歌,或者我敢说,帮助人类。

以下是你可以提供帮助的方式

有一些适用于所有结构化数据的通用准则。遵循这些准则将有助于谷歌轻松定位你的数据集,并将其包含在搜索结果中。

结构化数据指南

尽管谷歌不保证你的数据会出现在搜索结果中,但有一些最佳实践会给你最好的机会。

技术指南

为了有资格获得丰富的结果,使用三种支持的格式之一来标记您的网站页面将对您有很大的帮助。那些格式是, JSON-LD (推荐),微数据,RDFa。

质量方针

质量指南通常不可使用任何工具进行测试,但是不遵守这些指南可能会阻止语法正确的结构化数据在 Google Dataset 搜索中显示为结果。这些指南包括内容、相关性、完整性、位置、特异性和图像。要知道你到底能如何坚持这些指导方针,请跟随谷歌的这个指南

那么,如何将你的数据添加到谷歌数据集搜索中呢?

如果您有自己的描述数据的网页(或网页),那么在数据集中包含以下内容会对您有所帮助

  1. [必需]将 schema.org 中的元数据添加到包含数据集的每个页面。记住,这是一个必需的步骤 ,有一个文档可以帮你完成。
  2. 使用结构化数据测试工具验证标记产生结构化数据。
  3. [可选]对于那些有多个页面的人,创建一个站点地图,并将该站点地图添加到 Google 搜索控制台。

参考文献

  1. 构建谷歌数据集搜索并培育开放的数据生态系统(链接)
  2. 促进公共数据集的发现(链接)
  3. 数据集文档(链接)
  4. 结构数据指南(链接)
  5. 常见问题—数据集的结构化数据标记(链接)

我如何建造 9 GANS:人工智能生成的艺术画廊,第 1 部分

原文:https://towardsdatascience.com/how-i-built-9-gans-an-ai-generated-art-gallery-app-part-1-277b24718e2?source=collection_archive---------22-----------------------

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

这个系列是我用来构建 9 GANS 的技术的高级概述。

9 GANS 是一个展示 9 件艺术品的应用程序/网站,类似于一个画廊。不同的是,它使用 AI 每小时生成 9 张新图像,并删除旧图像。

这是一个与众不同的画廊,因为它是动态的,一直在变化。这件艺术品很快就会永远消失,这就产生了一个稀缺因素。

你可以在 https://9gans.com/查看

第一个版本只包括网站设置,但在第二个版本中,我添加了电子商务功能,即能够购买海报和画布上的印刷品。这需要一些技巧,但是对于本系列,我将主要关注我如何构建版本 1。

9 号楼 GANS 的主要阶段是:

  1. 准备,训练,从人工智能模型生成图像。
  2. 建立一个网站
  3. 增加了每小时刷新一批图像的功能。

在这篇文章中,我将把重点放在第一步。

这个想法

这一切都是从我发现这个开始的:

[## 此人不存在

此人不存在

这个人不是 Existthispersondoesnotexist.com](https://thispersondoesnotexist.com/)

该网站在今年早些时候发布时引起了轰动。你可以不断刷新页面,得到看似无穷无尽的不真实的人脸。

这让我很快找到了网站背后的算法:

[## NVlabs/stylegan

图片:这些人不是真实的-他们是由我们的允许控制不同方面的发生器产生的…

github.com](https://github.com/NVlabs/stylegan)

NVIDIA 的 StylegGAN 在发布时是最新最棒的 GAN 模型,能够生成非常逼真的图像。

然而,大多数人错过了它带来的最大突破。它最终解决了 GANS 的迁移学习问题。

在这种情况下,迁移学习是指采用已经训练好的模型,并根据您的数据集对其进行重新训练/微调的能力。

在那之前,像我这样没有价值数千美元的计算能力来从头开始训练一个 GAN 的平民是无法生成像这样酷的图像的。使用 StyleGAN,我不仅可以生成这些人脸(他们好心地发布了预先训练好的模型),还可以根据我自己的数据集对其进行微调。

StyleGAN 上迁移学习的例子很快就出现了。令人惊叹的 Gwern 发布了一个动漫版本:

如果你仔细看这个,你会发现生成的动画图像是肖像。这不是巧合。他从人脸模型开始,然后根据他的数据集将其微调为动画人脸。他有一个很棒的博客,里面有如何做到这一点的详细说明,我建议你去看看。

[## 用 StyleGAN 制作动漫脸

生成神经网络,如 GANs,多年来一直在努力生成质量不错的动漫人脸,尽管…

www.gwern.net](https://www.gwern.net/Faces)

我也想使用这个新工具,看看我能创造什么。我缺乏想象力的头脑自然而然地转向了艺术。

艺术的美妙之处在于,与人类的图像不同,图像中的缺陷(如头部形状怪异等)被认为是一种特征,而不是缺陷(谢谢达利)。我不需要花费无数的时间和计算来得到完美的艺术品。我只需要几天的训练就可以得到足够好的东西。

数据

我首先必须得到一个好的数据集。我用 Flickr 作为我的来源。

我在他们的 API 上使用了一个简单的 python 包装器来提取图像。这个 API 有它的局限性,但允许我进行基于单词的搜索,甚至过滤掉受版权保护的作品。即使创作出来的艺术品看起来是“原创的”,我也不想冒被起诉的风险。

我推荐一个 4-5K 图像的好起点。

模型

我所有的训练都是在 Google Colab 中完成的。如果你看过我的其他文章,你知道我是一个粉丝男孩。Google Colab 是一个超级容易运行的笔记本环境(一键打开),它给你一个免费的 GPU(每 12 小时重置一次)和大量的硬盘空间(GPU 设置超过 300 Gigs)。这是最好的免费训练方式。

一旦我有了数据,我就把 StyleGAN repo 克隆到 Colab 笔记本上。

我按照 Gwern 的说明(见上面的链接)设置代码和 hyper 参数,并使用最初的 NVIDIA 预训练的人脸模型作为我的起点。我对我的数据集进行了微调,几天后……嘣——我有了艺术作品。

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

AI burpppp

现在我有了一个模型,它能够生成可以作为艺术传递的图像,第二步是构建一个能够显示这些可爱之处的 UI。

我如何使用主题模型和潜在 Dirchlet 分配(LDA)构建大麻推荐应用程序非技术性

原文:https://towardsdatascience.com/how-i-built-a-cannabis-recommendation-app-using-topic-models-and-latent-dirchlet-allocation-lda-999598987ded?source=collection_archive---------14-----------------------

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

How I built www.rightstrain.co, a cannabis recommendation tool that used by online dispensaries

背景:

2018 年 10 月 17 日,大麻在加拿大成为合法

作为一名企业家,我总是阅读最新的科技创业公司,关注市场的发展,发现新兴机会。作为一名数据科学家,我一直在寻找数据驱动的解决方案来解决我发现的问题。

作为多伦多的居民,很自然地,我开始关注 T4 的大麻市场。

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

下面这篇文章将简要总结我是如何构建一个大麻推荐系统的。我会让它保持实用的技术性,这样那些想要建立一个类似应用程序的人可以遵循代码——而那些只是感兴趣的人仍然会发现它读起来很有趣。

问题:

2013 年,关于大麻在加拿大合法化的谈判开始。正是在这个时候,我知道合法化将会发生,所以我成为了一个早期投资者,并跟上了市场。

快进到 2018 年合法化,利用我在行业内的网络,我与一些大麻药房通了电话,了解到他们都有一个问题常见

当客户在网上订购时,发现他们最喜欢的商品(例如某种大麻品种)售罄,他们会停止购物,在另一家零售商那里找到相同的商品。

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

我了解到,这被称为的购物车废弃,据 统计 成本超过电商店铺销售额的 75%。

做进一步的研究,我发现亚马逊将其收入的 35%归功于推荐系统。

所以我建立了一个大麻产品的推荐系统。

建立推荐系统 101:

什么是推荐系统?

基本上,出于电子商务的目的,推荐系统只是找到与购物者正在购买的产品相似的产品,并推荐相似的商品,希望增加销售额。

那么,它是怎么做到的呢?

假设你在亚马逊上拥有一家销售家居饰品的电商店铺。你会注意到,当顾客购买卫生纸(A)时,他们也会购买毛巾(B)。此外,您会发现这种模式会在不同的客户群中重复出现,只是略有不同。

当其他顾客购买产品 A、B 和新产品 c 时,就会发生这种变化。

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

了解了这种模式,我们现在可以向传统上只购买产品 A 和 b 的客户推荐产品 C。

就是这样!

如何建立推荐系统:

首先,你需要从数据入手。

在我的案例中,我想为大麻产品建立一个推荐系统,所以我需要市场上各种大麻品种的数据。我快速搜索了一下,发现了一些包含大麻品种评论的数据库。

为了获取数据,我编写了一个简单的 Python Scraper,并在 Tor 网络下建立了隧道。这使得铲运机可以持续运行,并减少你的 IP 被禁止的机会。请看我写的关于开发 python 抓取工具(TBA)的文章。

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

重要提示: 从互联网上抓取数据时,请尊重你抓取的服务器,因为你很容易压倒一个没有准备好处理大量请求的服务器。

探索性数据分析:

我设法收集了 50 万条包含 1-5 星评级和评论的评论。我想我可以通过观察用户对每种菌株的评分模式来创建一个推荐系统(见上一节的逻辑)。

然而,看看这些数据:

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

Figure 1: Ratings of cannabis strains (x-axis) vs number of reviews (y-axis)

我发现了一个严重的范围限制。换句话说,大多数评论都在 4-5 星的范围内。

我猜大麻爱好者很容易被打动:)

鉴于这一发现,我决定不使用定量评级,因为推荐系统基本上会推荐其他评级高的菌株——实际上所有菌株的评级都很高。

这将违背推荐系统的目的。

输入自然语言处理:

自然语言处理(NLP)人工智能的一个子领域,专注于使计算机能够理解和处理人类语言。

那么,计算机是如何阅读人类语言的呢?

先来了解一下计算机是如何……计算的。基本上,计算机用二进制、1 和 0 来思考。这使得事情变得复杂,因为单词不是数字。

那么 NLP 是如何工作的呢?

最简单的形式,NLP 的工作原理是将单词转换成数字!例如,如果我们有一个文档,其中有三个单词,“狗吃食物”,每个单词都将被转换为一个向量(例如,将其视为一串数字)。所以单词“dog”可以用(1,0,1,1,1,0)来表示,“eats”可以用(1,1,0,0,0,0)来表示…等等。现在你可以想象一下,一旦所有的单词都被矢量化,计算机现在就可以识别出一个矢量(1,0,1,1,1,0)代表单词“狗”。

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

现在棘手的事情是让计算机理解的意思*。这个主题已经超出了本文的范围,但是我可能会继续撰写关于这个主题的另一篇文章。虽然 NLP 可以成功地将单词矢量化,以允许计算机识别单词,但让计算机理解单词的含义是极其困难的。如果你对这个话题感兴趣,请阅读更多关于深度学习和 NLP 的内容。*

主题建模和潜在目录分配:

现在我们所有的文本数据都已经被矢量化了,我们开始在数据中寻找模式。

主题建模非常适合这种类型的任务,它是一种统计建模技术,用于发现文档集合中出现的抽象“主题”。对此的一个非常简单的解释是,它梳理整个文档并识别:1)最频繁出现的单词和 2)出现在那些频繁出现的单词旁边的单词。这里的逻辑是,如果这些词总是一起出现,它们一定会形成某种主题。

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

现在你可能想知道,算法产生了多少主题?

嗯,这取决于你。

当您选择想要在模型中保留多少主题时,主题建模的艺术就开始发挥作用了。

我通常看两件事:1)相干值和 2)侵入者测试。让我们详细阐述一下这两者。

连贯性值可以被认为是每个主题成为“好”主题的概率。要了解更多信息,请查看这篇关于一致性价值的文章。

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

为了选择最佳拟合模型,您需要使用入侵者方法对每个主题进行定性评估。

上面,我已经画出了主题的数量和它们相应的一致性值。请注意,在 14 个主题之后,出现了大幅下降。根据一致性值,这里的最佳模型将是 14 个主题,然而,8 个主题的模型仅减少 CV 1 点。出于简洁和解释能力的考虑,我总是选择坚持使用更简单的模型。

那么入侵者有什么方法呢?

侵入者测试是使用一致性值的一个很好的后续测试。一旦你决定了你想要多少个主题,你就可以单独地看这些主题,并对它们进行定性评估。换句话说,你想问…“哪些词不属于这些话题?”**

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

*我们来看一下主题 1(或者本例中的 0)。这有点令人困惑,因为我们看到像“棒极了”、“最喜欢的”这样的词,但也有像“压力”、*抑郁”这样意思相反的词。这是一个人类不太能理解的主题的例子,但是在潜在的 Dirchelet 分配(LDA)中得分很高。这意味着我必须微调模型的超参数,以获得更好的输出。

让我们看看主题 2(模型 1),这个主题更清楚地说明了它的含义。看起来它可能指的是“受欢迎程度”这样的话题。

对于模型中的主题数量,您不断地这样做,逐个评估它们,寻找可能适合或不适合某个主题的单词。

创建推荐系统:

虽然从上面可能看不清楚,但我的最终模型产生了 8 个主题,其中有一些非常有趣的见解。例如,我发现大麻消费者喜欢吸烟有几个原因:1)一些人吸烟是因为他们喜欢大麻的味道和香味;2)另一些人吸烟是因为这让他们感到有创造力;3)另一部分使用者吸烟是因为这让他们感到精力充沛;最后 4)大多数使用者吸烟是因为这有助于缓解疼痛。

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

太酷了!

从本质上讲,主题模型所做的就是将我的数据分成不同的客户群。如果我从事营销和/或撰写文案的工作,我会更好地利用这些信息锁定目标客户群。

总之,回到数据科学。

利用这 8 个主题,我预测了每个菌株的综述中有多少包含这些主题。这样做给了我 8 个特征来区分我的菌株。换句话说,我基于每种菌株(例如,我正在与 200 多种菌株一起工作)在我发现的主题上的不同之处创建了一个数据集(例如,据报道,一些菌株提供了更多的创造性思维能力,而另一些菌株增加了能量)。

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

一旦完成,我就准备创建基于相似性的推荐系统。

选择相似性度量:

现在我们有了 8 个不同的特征(例如,主题)来描述我们的品系,是时候选择我们如何推荐它们了。有许多相似性度量可以使用(例如,余弦相似性、欧几里德距离、曼哈顿距离)。

在选择距离度量时,重要的考虑因素是:1)它在高维空间中如何处理?(例如,欧几里德距离在高维中开始失效)以及 2)推荐的准确度如何?

这给我们带来了一个问题,我们如何验证一个推荐系统?

有许多方法可以做到这一点。我认为最划算的方法是对你的数据进行回溯测试。例如,假设我们的数据集包含购买了产品 A、B、C & D 的客户 A 的数据。

一种验证方法是使用客户 A 的数据,预测他们在购买产品 A 后会购买什么,然后根据他们实际购买的东西进行验证!

结论

我使用主题建模和 LDA 方法来寻找新兴大麻市场的客户群。由此,我创建了一个推荐系统。这个项目最困难的部分是获取和清理数据——这在所有数据科学项目中都很常见。

如果我对这篇文章有足够的兴趣,我会写一篇技术文章,分享我的 MVP 代码。该产品已经发展,目前正在被许多药房使用!看看这里:www.rightstrain.co

如果你想看技术文章,请在评论中告诉我!

我如何在 AWS 上构建一个(微小的)实时远程信息处理应用程序

原文:https://towardsdatascience.com/how-i-built-a-tiny-real-time-telematics-application-on-aws-a9956f5afe65?source=collection_archive---------12-----------------------

这个故事最初发表在我的博客@ chollinger.com

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

在 2017 年,我写了关于如何构建一个基本的、开源的、Hadoop 驱动的远程信息处理应用程序(使用 Spark、Hive、HDFS 和 Zeppelin ),它可以在驾驶时跟踪你的运动,向你显示你的驾驶技术如何,或者你超速的频率——所有这些都不需要依赖第三方供应商代表你处理和使用这些数据。

这一次,我们将通过使用 Amazon 的 AWS、一个实际的 GPS 接收器和一台 GNU/Linux 机器,重新修补这个应用程序,并将其转换成一个更现代的“无服务器”实时应用程序。

【1】见结论

2019 年的微型远程信息处理

我最近写了一篇关于 Hadoop 与公共云的文章。结论的一部分是,公共云提供商(如 AWS、GCP 和 Azure)可以以牺牲对技术堆栈的自主权为代价提供巨大的好处。

在本文中,我们将看到这一新发展的好处如何帮助我们重新设计一个 2 年之久的项目。

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

体系结构

目标

我们的目标很简单:

  1. 应该捕获和收集在汽车中进行的每一次旅行;我们应该能够看到我们去了哪里,我们什么时候去的,我们走了什么路线,我们走得有多快
  2. 可视化应该显示我们的路线和速度
  3. 简单的问题,比如“我今天的最高速度是多少?”应该有可能
  4. 运行成本应该合理

指导原则

我们的指导原则应该如下:

  1. 应该实时接收和处理数据;如果您正在移动并且正在收集数据,那么输出应该最迟在几分钟内可用;如果您没有互联网连接,数据应该被缓存并稍后发送[1]
  2. 我们不想为基础设施和服务器管理而烦恼;一切都应该在完全受管理的环境中运行(“无服务器”)
  3. 架构和代码应该简单明了;我们希望它能在几个小时内准备好

超出范围

最后但同样重要的是,我们还忽略了一些事情:

  1. 使用的设备将是笔记本电脑;类似的设置也适用于 Android、RaspberryPI 或任何 SOC 设备,只要它有 Linux 内核
  2. 互联网连接将通过手机热点提供;将不使用单独的 SIM 卡来提供本地连接
  3. 电力传输将通过 12V 或电池完成
  4. 某些“企业”组件— LDAP 集成、VPC、长规则集、ACL 等。—超出范围;我们假设这些都存在于企业云中
  5. 认证将被简化;不使用 Oauth/SSAO 流——我们将使用设备的 MAC ID 作为唯一 ID(即使它实际上不是)
  6. 我们坚持查询 S3 的数据;更具可扩展性的解决方案,如 DynamoDB,将不在范围之内

架构图

这就引出了以下 AWS 架构:

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

通过这些步骤-

  1. 移动客户端通过使用 gpsd Linux 守护进程实时收集数据
  2. AWS 物联网 Greengrass 核心库通过直接在设备上运行 Lambda 函数来模拟本地 AWS 环境。物联网 Greengrass 为我们管理部署、认证、网络和各种其他事情,这使得我们的数据收集代码非常简单。一个本地函数将处理数据
  3. Kinesis Firehose 将获取数据,使用 Lambda 运行一些基本的转换和验证,并将其存储到 AWS S3
  4. AmazonAthena+quick sight将用于分析和可视化数据。QuickSight 的主要原因是它能够可视化地理空间数据,而不需要外部工具或数据库,如 nomist

[1]更快的处理很容易通过更多的钱来实现,例如通过 Kinesis 轮询间隔(见下文)——因此,我们定义了一个“接近实时”的目标,因为有人——我——必须为此付费😉

步骤 1:获取实时 GPS 数据

在最初的文章中,我们使用了 SensorLog ,一个很棒的 iOS 小应用程序,来获取 iPhone 的所有传感器数据,并将其存储到 CSV 文件中,然后在批处理加载场景中进行处理。这是一个简单的解决方案,但是投资 15 美元,你就可以得到一个真正的 GPS 接收器,它几乎可以在任何 GNU/Linux 设备上运行,比如 RaspberryPI 或笔记本电脑。

设置 gpsd

所以,这一次我们将依赖于 gpsd ,这是 Linux 内核的 GPS 接收器接口守护程序。使用这个和一个便宜的 GPS 加密狗,我们可以直接从 USB TTY 获得实时 GPS 数据。我们还将能够使用 Python 来解析这些数据。

我们将使用这个 GPS 接收器: Diymall Vk-172 ,对于硬件,我使用我的 System76 Gazelle 笔记本电脑,运行 Pop!_OS 19.04 x86_64 和 5 . 0 . 0–21 内核。还有其他选择。

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

这种设置很简单:

本质上,我们配置 gpsd 守护进程从正确的 TTY 中读取并在屏幕上显示它。上面的脚本只是一个指南—您的 TTY 界面可能会有所不同。

用测试这个

christian @ pop-os ➜ ~ gpsmon

你应该看到数据进来了。

只需确保您靠近窗户或室外,以便获得连接,否则您可能会看到超时:

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

TypeDescriptionDBUS_TYPE_DOUBLETime (seconds since Unix epoch)DBUS_TYPE_INT32modeDBUS_TYPE_DOUBLETime uncertainty (seconds).DBUS_TYPE_DOUBLELatitude in degrees.DBUS_TYPE_DOUBLELongitude in degrees.DBUS_TYPE_DOUBLEHorizontal uncertainty in meters, 95% confidence.DBUS_TYPE_DOUBLEAltitude in meters.DBUS_TYPE_DOUBLEAltitude uncertainty in meters, 95% confidence.DBUS_TYPE_DOUBLECourse in degrees from true north.DBUS_TYPE_DOUBLECourse uncertainty in meters, 95% confidence.DBUS_TYPE_DOUBLESpeed, meters per second.DBUS_TYPE_DOUBLESpeed uncertainty in meters per second,  95% confidence.DBUS_TYPE_DOUBLEClimb, meters per second.DBUS_TYPE_DOUBLEClimb uncertainty in meters per second,  95% confidence.DBUS_TYPE_STRINGDevice name

为了简单起见,我们将重点关注纬度、经度、高度、速度和时间。

第二步:AWS 物联网核心和绿草

AWS 物联网核心将为你的设备部署一个λ功能。这个函数将在本地运行,收集 GPS 数据,并通过 MQTT 将其发送回 AWS。它还将在互联网连接不可用的情况下处理缓存。

局部λ函数

首先,我们必须编写一个函数来实现这一点:

该功能使用 gps 和 greengrass 模块以预定义的批次收集数据。

在这一点上,我们还定义了我们的缺省值,在常见的情况下,某个属性——如纬度、经度或速度——不能被读取。稍后我们将使用一些 ETL/过滤器。

AWS 物联网集团

接下来,创建一个 AWS 物联网核心组(详情请参见 AWS 文档)。

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

创建组后,下载证书和密钥文件,并确保获得适合您的特定架构的正确客户端数据:

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

部署绿草客户端

然后,我们可以将 Greengrass 客户端部署到我们的设备上。默认配置假设有一个专用的根文件夹,但是我们将在用户的主目录中运行它:

如果您将它部署到一个专用的设备上(守护进程将持续运行,例如在 Raspberry Pi 上),我建议坚持使用缺省的/greengrass。

将该功能部署到 AWS

接下来,我们需要将我们的 Lambda 函数部署到 AWS。由于我们使用自定义 pip 依赖项,请参见 deploy_venv.sh 脚本,该脚本使用 Python 虚拟环境来打包依赖项:

在 AWS 控制台上,您现在可以上传代码:

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

创建一个别名和一个版本是很重要的,因为稍后在配置物联网管道时会参考到这一点:

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

在 AWS 物联网核心上配置 Lambda

接下来,回到我们之前创建的 AWS IoT 核心组,添加一个 Lambda 函数。

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

请记住:由于我们将无法运行容器(因为我们需要通过 TTY 与 USB GPS 设备对话),请确保配置正确:

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

另一个值得一提的是自定义用户 ID。客户端运行在某个用户名下,我强烈建议为它设置一个服务帐户。

完成后,点击 deploy,Lambda 函数将被部署到您的客户端。

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

在本地测试该功能

最后,在部署之后,确保用户正在运行容器并检查本地日志:

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

(这是在我的办公室运行的,因此仅显示纬度/经度为 0/0)

太好了!现在我们的 Lambda 函数在本地运行,并每秒钟将我们的位置发送给 AWS。干净利落。

第三步:Kinesis 消防软管和 ETL

接下来,我们将数据发送到 Kinesis Firehose,它将运行一个 Lambda 函数并将数据存储到 S3,以便我们以后可以查询它。

通过这样做(而不是直接触发 Lambda ),我们将数据打包到可管理的包中,这样我们就不必为每一条记录调用 Lambda 函数(并为此付费)。我们也不需要处理逻辑来组织 S3 桶上的键。

创建 ETL Lambda 函数

首先,我们将再次创建一个 Lambda 函数。这一次,这个功能将在 AWS 上运行,而不是在设备上。我们称之为远程信息处理-etl

该函数只是过滤无效记录(纬度/经度对为 0 的记录,这是我们前面定义的默认值),并将速度和高度的“nan”字符串更改为整数-999,我们将其定义为错误代码。

该函数的输出是 base64 编码数据以及一个“ Ok ”状态和原始的 recordID

我们还需要确保每行有一个JSON****并且没有数组,这是 json.dumps(data)的默认设置。这是 Athena 使用的 JSON Hive 解析器的一个限制。请原谅代码中的恶意代码。
自然,这里可以进行更复杂的处理。

完成后,将该功能部署到 AWS。

测试功能

完成后,我们可以用类似于下面的测试记录对此进行测试:

{ "invocationId": "85f5da9d-e841-4ea7-8503-434dbb7d1eeb", "deliveryStreamArn": "arn:aws:firehose:us-east-1:301732185910:deliverystream/telematics-target", "region": "us-east-1", "records": [ { "recordId": "49598251732893957663814002186639229698740907093727903746000000", "approximateArrivalTimestamp": 1564954575255, "data": "WyJ7XCJsYXRcIjogMC4wLCBcImxvbmdcIjogMC4wLCBcImFsdGl0dWRlXCI6IFwibmFuXCIsIFwidGltZXN0YW1wXCI6IFwiMjAxOS0wOC0wNFQyMTozNjoxMC4wMDBaXCIsIFwic3BlZWRcIjogXCJuYW5cIn0iLCAie1wibGF0XCI6IDAuMCwgXCJsb25nXCI6IDAuMCwgXCJhbHRpdHVkZVwiOiBcIm5hblwiLCBcInRpbWVzdGFtcFwiOiBcIjIwMTktMDgtMDRUMjE6MzY6MTAuMDAwWlwiLCBcInNwZWVkXCI6IFwibmFuXCJ9IiwgIntcImxhdFwiOiAwLjAsIFwibG9uZ1wiOiAwLjAsIFwiYWx0aXR1ZGVcIjogXCJuYW5cIiwgXCJ0aW1lc3RhbXBcIjogXCIyMDE5LTA4LTA0VDIxOjM2OjExLjAwMFpcIiwgXCJzcGVlZFwiOiBcIm5hblwifSIsICJ7XCJsYXRcIjogMC4wLCBcImxvbmdcIjogMC4wLCBcImFsdGl0dWRlXCI6IFwibmFuXCIsIFwidGltZXN0YW1wXCI6IFwiMjAxOS0wOC0wNFQyMTozNjoxMS4wMDBaXCIsIFwic3BlZWRcIjogXCJuYW5cIn0iLCAie1wibGF0XCI6IDAuMCwgXCJsb25nXCI6IDAuMCwgXCJhbHRpdHVkZVwiOiBcIm5hblwiLCBcInRpbWVzdGFtcFwiOiBcIjIwMTktMDgtMDRUMjE6MzY6MTIuMDAwWlwiLCBcInNwZWVkXCI6IFwibmFuXCJ9IiwgIntcImxhdFwiOiAwLjAsIFwibG9uZ1wiOiAwLjAsIFwiYWx0aXR1ZGVcIjogXCJuYW5cIiwgXCJ0aW1lc3RhbXBcIjogXCIyMDE5LTA4LTA0VDIxOjM2OjEyLjAwMFpcIiwgXCJzcGVlZFwiOiBcIm5hblwifSIsICJ7XCJsYXRcIjogMC4wLCBcImxvbmdcIjogMC4wLCBcImFsdGl0dWRlXCI6IFwibmFuXCIsIFwidGltZXN0YW1wXCI6IFwiMjAxOS0wOC0wNFQyMTozNjoxMy4wMDBaXCIsIFwic3BlZWRcIjogXCJuYW5cIn0iLCAie1wibGF0XCI6IDAuMCwgXCJsb25nXCI6IDAuMCwgXCJhbHRpdHVkZVwiOiBcIm5hblwiLCBcInRpbWVzdGFtcFwiOiBcIjIwMTktMDgtMDRUMjE6MzY6MTMuMDAwWlwiLCBcInNwZWVkXCI6IFwibmFuXCJ9IiwgIntcImxhdFwiOiAwLjAsIFwibG9uZ1wiOiAwLjAsIFwiYWx0aXR1ZGVcIjogXCJuYW5cIiwgXCJ0aW1lc3RhbXBcIjogXCIyMDE5LTA4LTA0VDIxOjM2OjE0LjAwMFpcIiwgXCJzcGVlZFwiOiBcIm5hblwifSIsICJ7XCJsYXRcIjogMC4wLCBcImxvbmdcIjogMC4wLCBcImFsdGl0dWRlXCI6IFwibmFuXCIsIFwidGltZXN0YW1wXCI6IFwiMjAxOS0wOC0wNFQyMTozNjoxNC4wMDBaXCIsIFwic3BlZWRcIjogXCJuYW5cIn0iLCAie1wibGF0XCI6IDAuMCwgXCJsb25nXCI6IDAuMCwgXCJhbHRpdHVkZVwiOiBcIm5hblwiLCBcInRpbWVzdGFtcFwiOiBcIjIwMTktMDgtMDRUMjE6MzY6MTUuMDAwWlwiLCBcInNwZWVkXCI6IFwibmFuXCJ9Il0=" }, ...

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

AWS Kinesis 消防软管

一旦我们的函数开始工作,我们希望确保来自设备的所有传入数据都自动调用该函数,运行 ETL,并将数据存储到 AWS S3。

我们可以这样配置消防水带流:

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

在第二步中,我们告诉流使用 telematics-etl Lambda 函数:

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

也是 S3 的目标。

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

以下设置定义了将数据推送到 S3 的阈值和延迟;此时,可以应用调优来使管道运行得更快或更频繁。

连接物联网核心和 Kinesis 消防软管

为了让它自动触发,我们只需要一个物联网核心操作,将我们的队列数据发送到 Firehose:

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

步骤 3.5:端到端测试

此时,建议通过简单地启动greengrasd服务并沿途检查输出来端到端地测试整个管道。

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

一旦服务启动,我们可以确保该功能正在运行:

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

物联网控制台上,我们可以跟踪所有 MQTT 消息:

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

一旦我们在这里看到数据,它们应该会出现在 Kinesis Firehose 中:

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

接下来,检查 CloudWatch 日志中的 telematics-etl Lambda 函数,最后是 S3 的数据。

关于收集真实数据的一个注记

可以想象,使用笔记本电脑收集数据可能会很棘手——除非你碰巧是一名警察,大多数商用汽车(和交通法😉)不占路上用终端。

虽然依靠一个无头的盒子当然是可能的(并且对于日常使用来说更现实),但是我建议至少用一个有屏幕的东西来运行一组数据收集,这样你就可以验证 GPS 数据的准确性。

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

步骤 4:分析和可视化数据

一旦我们收集了一些数据,我们就可以前往 AWS Athena,将一个 SQL 接口附加到我们在 S3 上的 JSON 文件。
Athena 使用的是 Apache Hive 方言,但确实提供了几个助手,让我们的生活更轻松。我们将首先创建一个数据库,并将一个表映射到我们的 S3 输出:

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

我们现在可以查询数据:

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

并查看我们的行程输出。

您可能已经注意到,我们跳过了一个更复杂的、基于 SQL 的 ETL 步骤,它会自动对旅行进行分组,或者至少以一种有意义的方式组织数据。为了简化流程,我们跳过了这一步——但它肯定属于需要改进的“待办事项”列表。

示例查询

“我们应该能够看到我们去了哪里,我们什么时候去的,我们走了什么路线,我们走得有多快”

正如我们的目标所指出的,我们想知道一些事情。例如,我们在 2019-08-05 旅行中的最高速度是多少?

简单—我们将速度(单位:米/秒)乘以 2.237,得到英里/小时,选择该速度的最大值,并按天分组:

这给了我们 58.7 英里每小时,这似乎是正确的洲际旅行。

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

肉眼观察

查询很好。但是视觉效果呢?

如概述中所强调的,我们使用 QuickSight 来可视化数据。QuickSight 是该用例的一个简单选择,因为它提供了开箱即用的地理空间可视化,其行为类似于 Tableau 和其他企业可视化工具包。请记住,在具有 d3.js 的 Elastic Beanstalk 上的自定义仪表板可以以更快的数据刷新速率提供相同的值—quick sight standard 需要手动刷新,而 QuickSight Enterprise 可以每小时自动刷新一次数据。

虽然这不符合“实时”的目的,但它有助于开箱即用的简单、基本的分析。在路上刷新数据会产生大约 1 分钟的延迟。

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

设置很简单——在 AWS 控制台上注册 QuickSight,添加 Athena 作为数据集,然后拖放您想要的字段。

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

编辑数据集时,可以为地理空间分析定义纬度和经度两个字段:

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

只需将正确的字段拖动到一些分析中,我们就会得到一个漂亮的小地图,显示一次旅行:

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

很多时候,你甚至不需要 SQL。如果我们想按分钟显示我们的平均速度,我们可以使用带有自定义格式(HH:mm)的时间戳值,并将默认的 sum(mph)更改为 average(mph)来构建一个图表,如下所示:

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

使用更多定制的 SQL 来做更好的事情也是微不足道的。例如,在数据集上查看“高速”场景可以这样进行:

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

然后添加到数据集:

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

突然间,你几乎可以看到亚特兰大东部那条路上的所有红绿灯。

请记住,QuickSight 是一个相当简单的工具,与其他“大型”BI 工具甚至是 Jupyter 笔记本电脑的功能无法相比。但是,从本文的精神来看,它易于使用和快速设置。

结论

与 2 年前的“微型远程信息处理”项目相比,这一管道更简单,以接近实时的方式运行,可以更容易地扩展,并且不需要基础设施设置。整个项目可以在几个小时内完成。

当然,我们已经跳过了几个步骤——例如,一个更深入的 ETL 模块,它可以准备一个更干净的数据集或一个更可扩展的长期存储架构,如 DynamoDB。

对“无服务器”体系结构的关注使我们能够快速启动并使用我们需要的资源—没有时间花费在体系结构管理上。

然而,闪光的不都是金子。虽然我们确实取得了快速的进展,手头也有了可行的解决方案(当然,带着笔记本到处跑可能只是一种“概念验证”状态😉),我们放弃了很多组件的自主权。这不完全是“供应商锁定”——代码很容易移植,但不会在另一个系统或云提供商上运行。

物联网核心 Greengrass 处理客户端部署、证书、代码执行、容器化和消息队列。

Kinesis Firehose 接管了 Spark Streaming、Kafka 或 Flink 等成熟流媒体框架的角色;它通过 Lambda 处理代码执行、传输、缩放、ETL 资源,并沉入存储阶段。

Athena 在一点点上弥合了差距——通过依赖 Hive 方言和开源 SerDe 框架,表定义和 SQL 可以很容易地移植到本地 Hive 实例。

Lambda 可以用类似的术语来看待——它只是 Python 加上了一些额外的库。关掉这些并使用例如 Kafka 队列将是微不足道的。

因此,结论——这又一次是一个完全没有意义的项目,尽管很有趣。它展示了即使是 AWS 的一个小子集也可以是多么强大,它是多么(相对)容易设置,如何将现实世界的硬件与“云”结合使用,以及如何将旧的想法转化为更时髦的——我更喜欢这个词,而不是“现代”——基础设施和架构。

所有开发都是在 PopOS 下完成的!19.04 在 2019 System76 Gazelle 笔记本电脑 上使用 12 个英特尔 i7–9750h v cores @ 2.6 GHz 和 16GB RAM 的内核 5.0.0 上,完整源代码可在GitHub上获得。

原载于 2019 年 8 月 7 日 https://chollinger.com**T21

我如何完成谷歌云认证挑战?

原文:https://towardsdatascience.com/how-i-could-achieve-the-google-cloud-certification-challenge-6f07a2993197?source=collection_archive---------3-----------------------

经过谷歌推荐的 12 周准备,我通过了云工程师助理考试,以下是我学到的可以帮助你的东西。

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

这个故事开始于 3 个月前,当我每天查看我的 Linkedin feed 时,我看到了来自 Google Cloud 的一篇关于认证挑战的帖子。我第一次读到这本书的时候,我正在考虑进行云专业化,并想知道我应该选择三个主要竞争对手中的哪一个。

我为什么选择谷歌云?

首先,当时的决定不是技术上的,因为我在 Azure、AWS 或 GCP 方面没有丰富的经验,只是 Azure 的基本项目和 GCP 大数据产品的一些步骤。我对 GCP 和他们的产品组织的第一印象是它感觉干净、简单和容易理解(UX ),并且对一个干净的控制台 UI 很重要。

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

Big Data and ML products in GCP [maelfabien]

在那段时间里,我还回忆起了我日常使用的所有谷歌产品(youtube、谷歌助手、照片等)。)和工作得有多好,我从《连线》杂志上找到了这句话:

这就是谷歌之所以成为谷歌的原因:它的物理网络,数千英里的光纤,以及成千上万的服务器,这些加在一起就是所有云之母。[连线]

所以带着这些想法,我准备在 GCP 开始新的学习竞赛!

谷歌云挑战到底是什么?

嗯,再次阅读这篇文章后,我了解到谷歌云有 7 个主要(也有其他测试版)认证:

  • 助理云工程师
  • 专业数据架构师
  • 专业数据工程师
  • 专业云开发人员
  • 专业云网络工程师
  • 专业云安全工程师
  • 专业协作工程师。

挑战(在一年内发起一项或多项)包括通过这些认证中的任何一项,为了实现这一点,谷歌帮助您获得了一些免费和付费资源的学习途径,在某些情况下,还提供了官方书籍和考试费用的折扣,此外,如果您在注册后的 3 个月内获得了认证,谷歌还会给您 100 美元的谷歌商店优惠券。

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

Google Cloud Certification Badges [Jhanley]

对我来说,我决定参加云工程师助理的入门级认证。该认证不需要以前的经验,并为您提供所有谷歌云平台组件的概述,如 IaSS、Kubernetes、PaSS、无服务器或托管服务。

协理云工程师认证谷歌推荐什么?(以及我的真实意见)

在第一个月,存在两个主要步骤 Qwiklabs 和预订您的认证。

qwiklab

在我看来,是在真正的谷歌云 项目(也叫 AWS)中实践的最佳平台之一。当我注册挑战时,谷歌给了我 1 个月的 Qwiklabs 无限制积分(1 个积分约 1 美元),所以我尽可能多地使用(直到今天我完成了超过 50 个实验室)此外,你可以将所有完成的任务添加到你的 Linkedin。在这里,谷歌建议完成:

这两个任务是相辅相成的,如果你刚到 GCP,这是一个很好的起点,对我来说,完成这两个任务花了我将近 3 周的时间(每周 4 小时)。

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

A good resource to practice [Linkedin]

预订您的认证

这是一件看起来微不足道的事情,尽管它很有帮助,因为它让你有了最后期限,并迫使你计划你的学习时间。在我的情况下,在我完成任务后,我收到了一个 25 美元的折扣代码来购买考试,所以最终价格是 100 美元。此外,这个代码作为一个链接来证明你正在完成挑战,所以记得这样做。

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

Voucher

Coursera 专精

在第二个月,谷歌给了我一个月的谷歌计算引擎专业化设计,这包括来自不同主题的 6 门课程,并不都与考试有关,但是,我建议完成所有课程,因为它给了你更多的实践经验(也包括更多的 Qwiklabs)和日常工作所需的良好理论知识。完成所有课程花费了我大约 1 个月的时间,我再次强烈建议您完成最后一门课程,在这门课程中,您将开发一个完整的云应用程序。

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

Coursera Specialization

这是谷歌推荐的三个主要资源,从我的角度来看,它们不一定足够,所以我想用我的个人经验来补充。

我如何为完成挑战做好准备?

当然,我遵循谷歌的三条建议,并补充如下:

  • 官书(谷歌也给八折买)。这本书有很好的理论信息,真正的考试题,练习练习,都遵循为考试准备的课程。
  • 参加实践考试,您不需要预约或支付任何费用,只需进入并开始回答。
  • 查看官方文档,特别是要了解定价方法和谷歌针对实际问题的最佳实践。
  • 练习!谷歌给你 300 美元的信用点用于 GCP,这样你就可以访问所有的产品,也有一个免费层。这是探索所有组件的绝佳机会。

到了第三个月,有了这些信息,我就可以准备考试了。

考试怎么样?

关于考试的一些有趣的信息是:

  • 慢慢来,你有 2 个小时(相信我,回答所有问题是准确的,验证几个问题需要几分钟)和 50 个问题(大多数情况下,你需要找出使用 GCP 产品的最佳选择)。
  • 结果不会马上显示出来,你必须等待 1 到 10 天。
  • 你必须亲自到认可的考试中心参加考试。
  • 结果不显示你的分数

奖励

你所有的努力都有回报,所以当我收到结果时,我感到非常满意:)

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

另外,我收到了承诺的礼券。

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

Gift voucher

PS 如果你有任何问题,或者想要澄清一些事情,你可以在 TwitterLinkedIn 上找到我。另外,如果你正在考虑参加Apache Spark 的 Databricks 认证,我写了一篇技术文章描述了我的建议。

[## 获得 Apache Spark 的 Databricks 认证后,我的 10 条建议

几个月前,我开始准备获得 Apache Spark 的 Databricks 认证。这不是…

towardsdatascience.com](/my-10-recommendations-after-getting-the-databricks-certification-for-apache-spark-53cd3690073)

我是如何创建超过 100,000 个带标签的乐高训练图像的

原文:https://towardsdatascience.com/how-i-created-over-100-000-labeled-lego-training-images-ec74191bb4ef?source=collection_archive---------3-----------------------

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

Some of the 300,000+ images I captured while leaving the machine running for a few days.

如果你是一个业余爱好者或从事人工智能项目的研究人员,很可能你已经遇到了不得不生成大量带标签的训练数据的不幸情况。当然,在花费了所有资金从一个不修边幅但心存感激的比特币矿工手中拿走一些粗略的 GPU 之后,你现在负担不起外包你的注释管道。

作为我寻求建造一个通用乐高分类机的一部分(更多文章随后!),我自己也碰到过这个问题。虽然大部分训练数据是自动生成的,但该项目仍然需要相对较少但相当数量的由人类标记的良好的旧地面实况图像。

大多数深度学习教程和教育似乎都假设你总是会得到一个漂亮整洁的数据集,准备好并等待处理,但对于大多数现实世界的应用程序来说,你不会将居中的手写数字归类到 0 到 9 的类别中。在一个真正的人工智能项目中,一些(如果不是大部分)艰苦的工作是处理简单的数据采集。我经历过这方面的艰难,我认为分享一些我学到的经验和技巧会有所帮助。

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

A sneak preview of the LEGO sorting machine prototype in action.

问题是

乐高分拣机的识别组件的工作原理是沿着摄像头下方的传送带,一次一个地收集乐高元素。为了开始标记过程,我让机器运行了几天,收集了大约 30 万张乐高元素的未标记图像。我可能无法将它们全部标记出来,但是,嘿,这些图像很容易收集。为什么不去疯?

有成千上万个不同的乐高零件编号,机器有可能被训练识别。然而,我已经排除了一些类别——目前我不在乎区分“瓷砖,圆形 2 x 2 与比萨饼图案”和“瓷砖,圆形 2 x 2 与中国新年汤图案”。但是,在你开始认为我显然让事情变得太简单之前,在一天结束时,我仍然有超过 2500 个零件类别。

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

Dealing with all these part numbers is definitely overkill — deduplication was heavily used.

(如果你想喝点中国新年的汤,你现在可以在 brick link 上为自己买一块 2 x 2 的瓷砖,只需 22.07 澳元)。

无论如何,为了获得用于训练的标记数据,我现在需要从 2500 多个可能的零件号中手动分配一个给机器运行时相机拍摄的每个乐高元素图像。

所有监督学习的目的是将现有黑盒神经网络(在这种情况下,是人脑)的知识转移到新的神经网络(通常在计算机上运行)。你的人脑黑盒分类器在教学任务中很棒,但不幸的是它非常慢。对于其他我们还不知道如何卸载到运行在亚马逊仓库中的 GPU 的任务,它也可能是需要的。

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

We might start getting into trouble if we do too much of this.

我们的总体目标是降低我们的大脑分类器标记一幅图像的时间。我可以采取 3 个关键步骤来大大加快这个过程。与所有伟大的工程解决方案一样,这三个步骤的共同主题是尽可能避免大量工作

第一步:作弊(又名:解决问题)

让您能够有效标记大量数据样本的最佳方法是首先利用生成样本的方式。通常,您对样本生成过程有一定程度的了解,尽可能多地滥用这种能力是个好主意。
在我的例子中,我注意到相机有一个大约 10–20 帧的窗口,用来拍摄零件在传送带上移动时的照片。因此,相机不是只拍摄一张图像,而是拍摄零件完全可见的每一帧图像,并将 10-20 张图像存储在一起。

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

An example bundle.

因此,虽然我的 30 万张左右的图像都没有标签,但我仍然可以访问一组非常有价值的元信息,这些信息告诉我每捆 10-20 张图像必须有相同的标签。这意味着,与尝试单独标记每张图像相比,我的标记速度提高了 10-20 倍。

顺便说一句:捕捉每个部分的多个图像也让我在实际分类性能方面获得了巨大的好处。我将在以后的文章中介绍更多的细节,但是如果您觉得您可以在自己的项目中实现类似的东西,请尝试一下!

第二步:懒惰(又名:简化过程)

对于任何实际情况,通过手动将值一次一个地放入“labels.csv”来创建注释,往好了说会非常慢,往坏了说则完全不切实际,尤其是当您的注释比简单的标签(例如,边界框或分段遮罩)更复杂时。因此,在几乎所有情况下,预先花点时间创建一个注释实用程序是值得的。

我的第一个版本的乐高标签工具非常简单,但却是让我以相当快的速度完成标签的最低要求。由于我不知道哪个零件号与特定的零件名称相关联,所以我需要添加一个简单的文本搜索实用程序,当出现一组要标记的新图像时,它将允许我搜索“砖 2 x 4”或“板 1 x 2”之类的内容。如果没有搜索工具,我将不得不使用谷歌或滚动我的零件数据库来查找一个元件的正确零件号。

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

The bare minimum for usability, but we can do better.

我很快就厌倦了必须手动输入零件号,而且坐在电脑前完成这一切有点麻烦。因此,我决定利用我的 web 开发经验,花几个小时组装一个简单的 web 应用程序。这最终成为一个巨大的胜利——不仅用户体验更加流畅,这意味着我能够更快地标记,而且因为它在我的手机上运行,我还能够用标记乐高积木来代替我通常在 Twitter 上无意识滚动的一些时间。这实际上是相当平静的体验(尤其是与 Twitter 滚动相比)。

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

Label Utility 2.0: Search, then tap the icon that matches the bundle at the top.

与手动搜索零件号并将其输入 labels.csv 相比,使用简单的标签应用程序的速度平均提高了约 2-5 倍,这还不包括能够在任何地方进行标签的便利性。

使用 web 应用程序作为标签应用程序还有一个非常有吸引力的第二个好处:只需给他们一个链接,就可以很容易地开始将其他人包括在标签过程中。我还没有尝试过这个项目,但是我很想尝试一下,尤其是在下一步的时候。

第三步:让其他人来做这件事(又名:使用人工智能辅助注释)

当你在标记你的数据的时候,你一直在原型化你的实际模型,并且在边上做模拟训练,对吗?你当然有!一旦你注释了大量的数据(比如说你的成品需要的 10-30%),你应该有能力训练你的网络来完成你的任务。例如,如果你正在构建一个分类器,你可能不会得到 95%的前 1 名准确率,而是得到 90%的前 5 名准确率。
这是我使用前两种策略手工标记了大约 30,000 张图片后发现自己所处的情况。我意识到,通过将这个“原型分类器”连接到我的标签实用程序,我可以进一步大幅提高我的标签速度。我不需要对每一束图像都进行文本搜索,我可以首先给出来自原型分类器的最高猜测,其中一个在 90%的情况下都是正确的。

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

Label Utility 3.0: Just choose one of the AI’s suggested options! The text search is still there for when the AI fails.

这又给了我 2-10 倍的速度提升——对于我不容易记住名字的奇怪部分尤其有效。我现在能够平均 1-2 秒钟标记一整捆图像。这相当于每秒 5-10 张图片!对人类来说还不错!

通过在我的标记管道中实现上述关键步骤,我能够在注释管道中实现 40-1000 倍的加速。在没有任何外部帮助的情况下,我已经标记了超过 100,000 张图片,而且这主要是在我通常浏览社交媒体的业余时间。

最后,这里有一个标签实用程序的实际使用视频。

我如何在 5 分钟内向数据科学家解释 OOP

原文:https://towardsdatascience.com/how-i-explain-oop-to-a-data-scientist-in-5-minutes-44faf72ecca7?source=collection_archive---------12-----------------------

每次你使用熊猫,你都在使用一个物体…

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

当我说数据科学家时,我实际上是指那些将大部分时间花在统计和分析上的人,那些建立各种模型并使用它来解决业务问题的人。

经常从身边的数据科学家那里听到的几个关键词——SQL、R、Python。许多与大数据主题相关的术语,如 Hadoop、Spark、Pig 和 Hive,被抛入日常对话中,但我几乎没有听到他们中的任何一个谈论面向对象编程(oop)。

尽管对于数据科学家来说,知道 OOP 是什么并不是必须的,但我认为如果他们至少对 OOP 有一个粗略的概念,那还是很好的。

所以几天前,在我午休的时候,我决定花 5 分钟的时间向我的一个同事解释 OOP 的概念。

由于 Python 一直是数据科学家最喜欢的语言,所以我选择用 Python 向 LH 解释 OOP。我是这样解释的。

我:今天我们用 Python 来做一个只有 1 个角色的角色扮演游戏吧!LH:好吧…?

我:你能给我写一个有名字,有生命,有法力,有等级的角色吗?LH:当然,小菜一碟。

name = "Jason"
health = 100
mana = 80
level = 3

我:现在我想给游戏添加一个怪物:D
LH:嗯……好吧……

hero_name = "Jason"
hero_health = 100
hero_mana = 80
hero_level = 3
monster_name = "Techies"
monster_health = 20
monster_mana = 0 
monster_level = 1

我:如果这次我要 10 个怪物呢?
LH: …?

hero_name = "Jason"
hero_health = 100
hero_mana = 80
hero_level = 3
monster_1_name = "Techies"
monster_1_health = 20
monster_1_mana = 0 
monster_1_level = 1
monster_2_name = "Sand King"
monster_2_health = 120
monster_2_mana = 20 
monster_2_level = 3... monster_10_name = "Chaos Knight"
monster_10_health = 150
monster_10_mana = 50
monster_10_level = 10

LH:这没有意义……
我:让我给你看看 OOP 是如何解决这个问题的!

解决这个问题的一个面向对象的方法是使用一个对象——把一切都当作一个对象。注意英雄和怪物都有相同的属性。我们可以有一个普通的职业叫做生物,由英雄和怪物共享:

class Creature():

    def __init__(self, name, health, mana, level):
        self.name = name
        self.health = health
        self.mana = mana
        self.level = level

什么是课?一个类就像一个对象的蓝图。

现在,每当我们想要一个新的怪物,英雄或任何其他生物,我们不必重新命名我们的变量或保持创建多个属性。使用我们刚刚声明的生物类作为蓝图,我们可以轻松地创建新对象:

hero = Creature("Jason", 100, 80, 3)
monster_1 = Creature("Techies", 20, 0, 1)
monster_2 = Creature("Sand King", 120, 20, 3)... monster_10 = Creature("Chaos Knight", 150, 20, 3)

要访问对象的属性,我们可以简单地这样做:

hero.name = "James"
monster_1.health = 0
monster_2.level += 1

LH:酷哥!这就是 OOP 的全部内容吗?我:这只是 OOP 提供的一部分,实际上还有更多。

我:下周我再给你讲讲 OOP 吧!LH:当然可以!期待啊!

我对数据科学和 Metis 训练营的感受

原文:https://towardsdatascience.com/how-i-feel-about-data-science-and-the-metis-bootcamp-experience-398b171289d0?source=collection_archive---------18-----------------------

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

在 Metis 训练营接近尾声时,记录我的数据科学相关想法

夏天到了,我的数据科学训练营也快结束了,它非常有趣、有见地、有收获,我会非常想念这种学习环境和我的 Metis 团队的其他成员(保持联系,伙计们!).在我们骑着马奔向夕阳之前,我想为后人记录下过去几个月的一些重要收获。

所以它来了——我的第一篇文章…

1.找出正确的问题是最难的部分。

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

让您的数据以一种干净且可用的格式存储可能是一件困难的事情。选择正确的模型和调整超参数有时也很有挑战性(hello grid search!).但老实说,很多时候最难的部分是找到一个有趣的、值得攻击的问题。

在训练营期间,我参与了四个大项目。我最纠结的一个是我的自然语言处理(NLP)项目。我怀着最美好的愿望开始了这个项目,但也不知道如何处理我的数据。

“我要从 Reddit 上下载一堆东西,用它做一些超级酷的东西!”我以为。

在我所有的项目中,这是最糟糕的一个。其他每个项目都有一个明确的目标:

  • 可靠地预测贷款违约,以构建一个干净的贷款组合,可以赚取巨大的回报。
  • 找出电影票房表现的驱动因素,这样电影公司就能更可靠地盈利。
  • 神经网络预测短期股票收益,战胜股市。

但是,尽管我学习了主题建模、情感分析和推荐系统,我并没有产生实质性的实际结果。这都是因为我不知道我要回答的是什么问题——因此也没有明确的努力目标。

经验教训—问题应该驱动我收集哪些数据,而不是相反。

2.冒名顶替综合症很严重。

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

在训练营,你基本上有三个月的时间从数据科学新手到训练深度神经网络。在此期间,你会被行业专业人士的资历所吓倒,也会被同学们的创造力所惊叹。在整个过程中,你会努力忽略那个声音——

“你将无法完成这一职业转型。你想为之工作的公司不会雇用你作为数据科学家,因为你没有合适的资格证书,或者因为你缺乏相关的经验。”

事实是我担心面试。在我签下那份工作之前,我会为找工作感到相当大的压力。

但是当我回头看的时候,我为我所学到的和付出的努力感到骄傲。虽然我们可能还有很长的路要走,但我和我的同学也已经走了很长的路。

冒名顶替综合症可能永远不会完全消失。但我相信,我和我的同学们不会屈服于这种不充分的感觉,而是会把它作为燃料,更快地学习,更努力地工作。

3.即使在数据科学领域,MBA 仍然有发展空间。

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

如今,尤其是在硅谷,MBA 们的名声很差。但是,对企业如何赚钱以及我们可以利用什么杠杆来赚更多的钱有一个直观的理解仍然是至关重要的。

探索数据、训练模型和预测事物都是非常有趣的。但大多数时候,我们仍然使用分析和数据科学来支持某种业务目标。

对这个问题的洞察将如何帮助我的公司变得更加成功?

有商业背景的人相对擅长用金钱来描述数据科学问题,并且经验丰富。所以对你当地的 MBA 好一点,即使他或她分不清熊猫熊猫的区别。

4.如果有一个梯度,那么我们可以下降。

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

Gradient descent is a versatile optimization method for finding minimum values

我数不清训练营中有多少关于特定算法的讲座是以这样的话结束的:

“最后,我们可以指定我们的成本函数,并使用梯度下降来最小化它,并估计模型的参数。”

在我看来,有两件事将几乎所有的数据科学联系在一起:

  1. 相关性 —数据科学就是寻找各种事物之间的联系。我之所以这么说,是因为与传统统计不同,我们经常处理杂乱的非结构化数据,如文本或图像。但在本质上,我们仍然在寻找我们杂乱的数据和我们关心的解释或预测的事情之间有趣而有见地的联系(信号)。
  2. 梯度下降 —因为我们经常最终需要分析大量杂乱的非线性数据,所以我们需要一种同样通用的方法来最小化成本函数(我们寻求最小化模型的成本函数,以便获得其最佳参数值)。梯度下降正是如此。它快速、有效、适应性强,是从逻辑回归到神经网络的动力。

如果你想对梯度下降有更深入的解释,我在我的关于神经网络的帖子中写了它(你将不得不向下滚动一段路,或者只是阅读全文,呵呵)。

5.收集正确的数据并雇用正确的人来从这些数据中挖掘见解,这可能是一个真实而持久的竞争优势。

我本质上是一个价值投资者,当我分析一家公司时,我习惯于寻找竞争优势的传统来源(如规模经济)。因此,在早期,我绝对不习惯将一家公司的数据和分析视为竞争优势的持久来源。

我之前持怀疑态度的原因是,几乎每个公司都有一些关于其客户的有趣的专有数据。所以我认为能够更好地分割数据或更好地预测是不可持续的——你的竞争对手自己可以雇佣更好的工程师和更好的模型,并轻松赶上。

但是像谷歌、脸书和亚马逊这样的公司证明这是非常错误的。据我所知,这三家公司和其他类似的公司通过使用以下渠道建立了巨大的竞争优势:

  1. 收集几乎所有东西的大量数据。
  2. 构建用于存储和清理所述数据的基础设施。
  3. 雇佣成千上万真正聪明勤奋的人来建立模型,挖掘所有可用见解的数据。
  4. 使用新收集到的见解向人们出售物品或让他们购买物品(资本家!).
  5. 从步骤 4 中的所有交互中收集更多的数据,以便迭代和改进模型以及生成的洞察。
  6. 不断重复步骤 3、4 和 5,直到竞争被远远甩在身后。

虽然并非大数据和机器学习的所有承诺好处最终都可能实现,但聪明运营的公司已经证明,通过数据科学,他们可以从以前认为毫无价值的数据中提取大量价值。

我从梅蒂斯训练营得到的另一个令人惊奇的东西是这个博客。如果没有以前 Metis 学生的一些好例子和导师的督促,我可能不会有时间写这么多。但现在我喜欢它,并将继续不畏艰难地写作。

祝我好运,因为我准备开始一个新的职业生涯(我对此非常兴奋)。感谢阅读!干杯!

从我这里查看更多。

我如何通过数据扩充提高 1%的准确率

原文:https://towardsdatascience.com/how-i-got-1-better-accuracy-by-data-augmentation-2475c509349a?source=collection_archive---------14-----------------------

放下你所爱的东西是很难的。是的,在本系列的第 5 篇文章之后,我真的以为我已经完成了,但是……来自和 MNIST 例子的准确性/误差指标开始困扰我,我非常确定我可以通过实现另一个简单的技巧来改进它们:数据增强。事实证明这很容易实现,而且效果非常好。

当你读完这篇文章,你可以试试我在这个互动 MNIST 游乐场上训练的一个小型神经网络!

此外,请查看该系列的所有零件:

数据扩充

数据扩充就是从你实际得到的数据中制造更多的数据——在不丢失数据携带的信息的情况下增加方差。这样做降低了过度拟合的风险,并且通常可以提高看不见的数据的准确性。

在图像作为输入数据的特定情况下(如 MNIST 数据集中的情况),增强可以是例如:

  • 仿射变换(旋转、缩放、平移等。)
  • 弹性变形
  • 卷积滤波器(例如,在 MNIST 的例子中,通过使用最大或最小内核使数字变得更粗或更细)
  • 添加噪声

我决定进行仿射变换。我以前在 CG 中使用过很多次,知道它们非常简单明了。

仿射变换

仿射变换将一个仿射空间映射到另一个仿射空间。更具体地说,我们可以说仿射变换可以通过旋转、缩放和平移等操作来变换特定的坐标,并告诉我们这些变化后的坐标是什么。仿射变换可以被表示为矩阵,并且可以被组合,使得一系列变换仍然可以被表示为单个矩阵。

例如(这里是二维描述的),我们可以这样构成变换 M:

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

当我们得到这个 M 时,只需将它与输入坐标相乘,就可以得到它们在目标空间中的新位置,如 M 所定义的。相反,我们可以将目标空间的坐标与 M 的倒数相乘,以返回到原始空间。

在 Java 中,创建这些仿射变换矩阵就像这样简单:

这就是我们将原始 MNIST 数字中的坐标转换为新的虚构数字中的坐标所需要的全部内容,这些数字是原始数字稍加修改的版本,用于训练网络。

该方法作为一个整体,是 DigitData-entity 上的一个 mutator(参见第 5 部分),看起来像这样:

正如您在第 29–41 行中看到的,上面的代码还具有插值功能,这使得转换后的结果更加平滑。

此外,还会进行一项检查,以查看生成的数字是否可能以某种方式进行了转换,使其部分溢出到目标 28×28 数组之外。当情况似乎是这样的时候,我们放弃那个改变并且再试一次。如果我们不能在 5 次重试内达到一个好的转换数字,我们跳过这一轮的转换,退回到原始数字。这很少发生。下一轮我们可能会更幸运,得到一个有效的转换。

说到巡房。我们多久改变一次输入数据?在每个训练时期之后,我像这样变换整个数据集:

这样,神经网络就不会两次看到同一个数字(如上所述,除了少数运气不好的变换尝试之外)。换句话说:*通过数据扩充,我们已经创建了一个无限的数据集。*当然,从严格的数学意义上来说,这是不正确的……但对于我们所有的训练目的来说,我们为随机仿射变换选择的分布方差绝对足以创建一个独特的数据流。

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

结果呢

我选定的那个小型神经网络(只有 50 个隐藏神经元,见前一篇文章)的错误率平均下降了 1%,现在可以稳定地训练到 1.7%-2%的错误率。

零钱。影响很大!

请在我创建的一个小型 MNIST 游乐场上测试一下这些训练有素的网络表现如何。

此外,如果你想仔细看看代码在这里:https://bit bucket . org/Tobias _ hill/mnist-example/src/Augmentation/

原载于 2019 年 1 月 26 日machine learning . tobiashill . se

我如何更好地学习机器

原文:https://towardsdatascience.com/how-i-got-better-at-machine-learning-63ce0f0e81d7?source=collection_archive---------20-----------------------

我多年来学到的提高机器学习的技巧和诀窍

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

Image by Bessi from Pixabay

对我来说,机器学习是一个需要计算机科学和数学知识很好结合的研究领域。虽然这是一个非常有趣的领域,但并不具有挑战性。我相信只要有足够的动力、勇气和时间,任何人都可以成为专家。

需要一些动力吗?

那我应该告诉你,在这个领域工作可以赚很多钱。不同行业有很多机会,所以你可以尝试不同的行业

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

Sources here, here and here

这些年来,我观察到一个有趣的现象(当然我也可能是错的),那就是机器学习的基础并没有改变。我这么说的意思是,我们现在所说的大多数‘模型’都是由众所周知的块组成的,比如全连接层、卷积层、残差层或归一化层。当然,并不是每个模型都是由这些组合构成的。有特殊的情况,如空间转换网络和注意机制。然而,对于不同类型的模型,一般的构造块或多或少是相同的。

那么这意味着什么呢?这意味着,如果你知道这些基本原理,你学习建立在这些基础上的更复杂的主题将会容易得多,花费的时间也更少。

所以今天我想分享一些帮助我“更好地”学习机器的技巧和诀窍。但请注意,我仍在学习机器学习,因为还有太多的东西有待发现。

1.享受学习的过程,慢但稳。

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

Image by Pexels from Pixabay

我这么说的意思是要投入大量的时间去理解机器学习的基础知识。

说得具体一点,学数学。

理解反向传播需要向量微积分。统计/概率对于理解信息论至关重要。优化对于了解幕后到底发生了什么至关重要,因为在一天结束时,这就是模型正在做的事情。

我知道刚刚起步的研究人员并不真的需要了解这些东西,这要感谢那些执行自动微分的软件包。我个人不相信学习这些基础知识会自动让你成为该领域的优秀研究者或从业者

然而,我相信学习和理解这些概念会让你的事情变得容易得多。对我来说是的。例如,在没有自动微分帮助的情况下,从零开始实际实现一个神经网络,可以让您具体了解模型是如何学习的。

2.与其他研究人员交谈,了解他们的工作

我目前是瑞尔森视觉实验室的一员,正在那里攻读硕士学位。久而久之,我在实验室里交了很多朋友,比如杰森和马修。

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

Image by Sasin Tipchai from Pixabay

我会不时瞥一眼他们的显示器,看看他们在做什么。

我经常会看到一些非常有趣的东西,比如自然图像的分割结果,或者他们正在处理的一堆代码。所以我会问他们一些问题,比如“代码是关于什么的?它在做什么?你在解决什么样的问题?”

然后一个对话火花。他们会教我一些他们正在解决的问题,我会学到一个新的概念或解决方案。这非常有用,因为当我解决类似问题的时候,我就不用从头开始了。此外,我还可以接触到以前不知道的新课题和论文。

虽然我经常不能完全理解他们在做什么,但我仍然感谢他们花时间和我交谈。毕竟,总有一天他们会解决我正在解决的问题,我也很乐意帮助他们。

3.为你感兴趣的理论或技术找到一个用例

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

Source: Link

我现在正在做的一些事情,比如风格转换。实际上,我是在看到一个宣传视频或 YouTube 视频后开始研究它们的。

有时候我会开始研究一个主题,只是因为我想做一些很酷的东西。在这个过程中,我经常找到不同的或者更好的方法来解决同一个问题。

当然,不能保证这些新方法会更好。但这是学习新事物的过程,完全理解它。达到一个水平,在那里我可以融入新的方法,真正帮助我变得更好。

这有助于我更好地学习机器的另一个原因是,我可以学习最佳实践。例如,当一个很酷的项目成为开源项目时,我只是从存储库中克隆它,并研究其他研究人员如何编写他们的代码。

这样做让我了解到其他研究人员在做什么,以及他们是如何组织代码的。显然,有时候很难理解研究人员写的东西,因为他们不是软件工程师。但看到他们做了什么还是有帮助的,我可以记下什么不该做。

结论

好了,你知道了。这些是我用来更好地理解机器学习的一些技巧和诀窍,我希望它们也能为你工作。

最终,我认为任何拥有永恒好奇心和毅力的人都将能够研究他们感兴趣的主题并学习机器学习。现在网上有很多优秀的深度学习内容。

虽然这些建议中的一些会对你有帮助,但也可能没有,这完全没关系。我们都是不同类型的学习者,并不是每个人都必须穿同样的鞋子。但是我真的希望这些建议至少能帮到你!

我是如何开始 Kaggle 竞赛的(这并不难)

原文:https://towardsdatascience.com/how-i-got-started-with-kaggle-competitions-its-not-that-hard-7666f25e9f93?source=collection_archive---------12-----------------------

数据科学社区的大多数人都知道 Kaggle 是一个学习和增长技能的地方。从业者提高的一个流行方法是在预测挑战中竞争。对于新人来说,跳进网站并在实际的挑战中竞争可能是压倒性的。至少,我一直是这么觉得的。

在旁观之后,我决定在 2018 年底最终涉足 Kaggle 竞赛竞技场。在很短的时间内,我学会并磨练了许多数据科学技能,否则我将无法实践这些技能。令我惊讶的是,我还发现竞争可以带来很多乐趣——即使是作为一名新人。

在这篇文章中,我试图揭开 Kaggle 竞赛的一些组成部分的神秘面纱,对于第一次参加竞赛的人来说,这些部分可能不会立即显现出来。总的来说,我希望展示 Kaggle 比赛可以成为一种有趣而有效的方式,在这一领域积极学习。

公共排行榜跟踪社区进度

让我们为任何不熟悉该平台的人介绍一下 Kaggle 101:在一个典型的 Kaggle 比赛中,数据科学家被提供了 训练测试 组数据。训练数据提供有竞争者试图预测的标签,而测试集没有标签。你的工作是编写一个算法来预测测试数据的标签。

在比赛过程中,Kagglers 可以提交他们的预测, 这些预测的一部分 (我稍后会解释为什么这很重要)会被评分并显示在公共排行榜上。这是一个很好的方式,让竞争对手在比赛过程中了解自己的实力。作为一个临时的竞争对手,在整个比赛过程中观看排行榜顶部的动态也很有趣。

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

在这张图表中,我绘制了最近一场名为“即时满足”的 Kaggle 比赛的公共排行榜。每条蓝线代表每个团队,橙色线显示领先团队的分数(在这场比赛中,得分指标 1 将是满分)。

公共笔记本保存共享的知识

当你追踪上面的情节时,你可能会问自己,为什么这么多的团队看起来彼此跟踪得如此之近。大量团队分数汇聚的深蓝色线条可以部分地通过公共 Kaggle 笔记本(以前称为 Kaggle 内核)来解释。

以前没听说过 Kaggle 笔记本?它们是一种基于云的方式,让社区分享关于他们预测模型的代码和想法。对于新手来说,这是一个很棒的设置,因为不需要构建本地环境、下载数据、安装包,也不需要陷入管理的泥潭。此外,这些虚拟机通常比一个人的本地笔记本电脑更强大。笔记本可以是私有的(只有您和/或您的团队可以看到)或公共的。Kaggle 的一个令人兴奋的方面,以及一个真正的“游戏中的游戏”及其自身的奖励,是一个人的公共笔记本被社区成员投票支持的可能性。

在每场比赛中,都会有由社区成员创建的公共笔记本,以帮助探索给定用例的基准模型。数据科学家使用这些笔记本来获得社区的认可,修补其他人的工作,并在隐喻性地牵着你的手前进的同时,一步一步地通过另一个人的代码。

那么,那些所有 Kaggle 分数汇聚的蓝色粗线?那就是当一个突破性的内核发布后,整个竞争领域都采用某人的代码或视角。在 2018 年的场外,我看到了笔记本的魅力,并最终在实际参加比赛之前,开始自己写作和出版它们。

论坛提供背景

如果你不想马上深入内核,那么你可以将注意力转向 Kaggle 论坛。他们是另一个开始的好地方。在这里,数据科学家分享他们的想法,提出问题,并进行对话。

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

Discussion posts by the top teams in the “Jigsaw Unintended Bias in Toxicity Classification” competition

比赛结束后,获胜的团队通常会发表他们的观点,以改善整个社区。

各种类型的戏剧都有

每场比赛都有意想不到的时刻:例如,处于劣势的球队跃居积分榜首位,或者戏剧性的数据泄露。

很多时候,在一场比赛中,一两支队伍会从排行榜的其他队伍中脱颖而出。根据社区对顶级竞争对手如何达到这一目标的猜测,最近被称为“寻找魔力”,通常是竞争对手和观察者的煽动者。

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

Tracking the CHAMPS competition public leaderboard (lower score is better)

在最近的几场比赛中,我创造了一些有趣的笔记本来跟踪公共排行榜。在“CHAMPS Molecular Properties”竞赛的上图中,你可以看到一个团队找到了脱离人群的方法的例子。

组队升军衔

在 Kaggle 上,合作是一个重要且常见的策略。它允许数据科学家在安全的环境中协作,并在其预测模型中获得协同动力。我通常通过设定个人目标和关注个人成功来开始比赛。一旦我缺乏改进我的模型的想法,我会考虑拓展业务,和其他人一起努力(但不是太多其他人——谷歌“林格曼效应”)。

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

All teams at the top of the leaderboard for the “Santander Customer Transaction Prediction” competition

Kaggle 的这一方面与个人职业生活中其他领域的项目合作没有什么不同。-它需要信任、道德取向和合作的心态。或者,在单人比赛中获得高分被广泛认为是 Kaggle 上最难做到的事情之一——事实上,为了获得比赛大师的地位,你必须获得一枚单人金牌,总共 5 枚金牌。

重组带来最终结果

任何给定 Kaggle 比赛中的公共排行榜仅在测试集的一部分上评分。可能会无意中创建在公开评分的测试集部分表现非常好的模型,但它们的模型准确性实际上并不能很好地转化为私有排行榜。这就是为什么有一个不仅准确,而且对公共和私人排行榜都通用的模型很重要。

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

社区将这种现象称为“过度适应公共排行榜”。当最终的结果被制成表格时,这种调整的效果有时会非常引人注目!上面的图显示了最近一次比赛中前 10 名的公共和私人团队-正如你可以看到的那样,公共前 10 名中只有一个团队留在了最终排名中。相对于一些著名的人事变动,这个例子实际上是相当温和的,在那些变动中,团队发现他们自己移动了数百个,有时是数千个位置。

健康竞争中的娱乐、学习和社区

排行榜、笔记本、论坛、戏剧、团队和最终结果:如果你决定参加 Kaggle 比赛,你会遇到很多事情。我想不出比加入一个更好的方法来提高我们的专业机器学习技能。推动您的预测解决方案策略的极限,与社区互动,并享受这一过程。

KaggleTwitter 上联系我,我会在排行榜上看到你。

我如何在 Spacenet 4 挑战赛中进入前 10 名

原文:https://towardsdatascience.com/how-i-got-to-top-10-in-spacenet-4-challenge-5dbf020b6ffb?source=collection_archive---------20-----------------------

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

比赛主持人的一些插图

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

挑战的任务简单地说就是

对我来说, Spacenet4 成为了第一个严肃的 DL 比赛。老实说,很多事情都出错了,但我获得了一次愉快而有益的经历,并设法提高了自己的技能。

可能是我在这次比赛中教会的最重要的事情:排行榜是唯一的真理。任何地方都容易犯错误,你发现和改正错误的速度决定了你的胜算。

TLDR

如果你错过了去年关于
@snakers41 参加类似挑战的帖子:
Spacenet 三:道路探测器人群 AI 地图挑战赛

——从不同视角拍摄的亚特兰大郊区卫星图像(最低点)分为三组:最低点、偏离最低点、非常偏离最低点。

任务的核心 —识别所有的建筑足迹。

最终进场

  • 带 augs 的 4 通道图像;
  • 具有迁移学习的 uresnext 101(UNet+resnext 101);
  • 每个最低点类别三个头;
  • Adam 优化器+ lr 衰减;
  • 用边界掩模和分水岭进行后处理;
  • 多边形近似;

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

示例模型性能

挑战

所有以前的 Spacenet 竞赛的一个关键挑战是在卫星图像上找到物体。这一次,参与者必须在卫星从不同视角(天底、离天底、非常离天底)和目标方位角拍摄的图像中识别所有建筑物。不仅仅是建筑,还有脚印。

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

将最低点从 39 更改为 53

数据集有 27 个采集点——同一地点的照片——最低点在 7 度到 54 度之间。

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

收集无建筑

嗯,收集,现在听起来没那么有挑战性了。我们可以拍摄最小的天底图片,对其运行一些分割管道,并通过稍微滑动蒙版来获得所有 collect 图像的足迹。组织者也是这么想的,他们从公开测试中删除了所有 collect 的图片,只保留了一个例子。

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

因此,我们不得不面对所有与建筑物倾斜和分辨率下降有关的非常糟糕的问题。这里的黄色多边形是预测遮罩

然而,天底本身在标题中是硬编码的,这使得在我的模型中使用角度作为特征成为可能,这已经完成了,但在下面会有更多。
关于数据集和比赛的更多信息,您可以在组织者的文章中阅读。

我的基线

如果基线需要一些复杂的技术,它就不是基线了。

模型

分割任务的标准方法:Unet-like 架构+从 Imagenet 迁移学习。
在 3 通道 896*896 图片上启动,检查发生了什么。

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

基线表现。看起来还不错但显然不够完美

失败

复合二元交叉熵+骰子损失

MOAR 头

此外,作者发表了文章,其中有一些开放基线的有趣实验。他们为每一组训练了三个独立的模型:天底、离天底和非常离天底的图像。
结果并不令人惊讶:

  1. 非常低的预测比其他预测更差;
  2. 每个模型显示了来自同一组的图像的最佳质量,即,仅在偏离最低点的图像上训练的模型检测到远离最低点的图像,但是在其他图像上失败。

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

文章中的三个开放基准模型评估性能

顺便说一句,指标也被算作三个最低点类别的平均值。

三头模型

三个独立的模型是一个好主意,但是三个头共享编码器层的模型更好(也更快)。

最终这个模型+下面的几个其他的黑客成为我的最终提交。

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

某些 3 头模型实验的局部验证指标

五头模型

除了视角,还有一个方位——天底是一样的,但是卫星是从另一边飞过来的。事实上,这是我的模型的另一个自由度和两个头。

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

不同方位的天底= 25°和天底= 34°。多边形是地面真理

已经尝试了一些其他的技巧

模型和数据处理

  • 一大堆各种各样的编码器是最有趣的;
  • 从我目前的个人经验来看,注意力不会让事情变得更糟,所以在这里它也有帮助;
  • Ofc MOAR 层层给了一些加分;
  • 使用 4 个图像通道而不是 3 个图像通道进行输入——指标提高了很多;
  • 标准图像增强——移位、裁剪、对比度等——我没有做足够的实验;
  • TTA——比分没有太大变化

此外,与本次挑战赛中的其他竞争对手相比,我们的模型收敛速度慢了 2-3 倍,这可能是由于非理想增强或 LR 机制。

优化器和损耗

  • 损失加权考虑建筑物大小和相互距离—无改善;
  • OpenAI AdamW 而不是 Adam optimizer——如果你正在为产品训练模型,效果很好,但对于竞争——缺乏最后 3-5%的性能;
  • LR 衰变。从高值开始,学习率在一定条件下逐渐降低(例如,损耗平台)。大概是我的模型一直过拟合,因为快速 lr 衰减提高了分数。

我想尝试许多其他想法/启发,比如外部数据集、处理遮挡房屋、集合等等,但是没有时间做所有的实验。

后处理和失败案例

嗯,那真的很痛苦。通过设置另一个阈值,提交分数可能会发生显著变化。大多数失败案例都是由于低质量而导致的非常低的图像。

失败案例

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

关天底图片的高层建筑遮罩(黄色)

密集建筑物和高阈值遮罩合并为一个,低阈值大建筑物被分成几个较小的。

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

非常低的密集建筑区,阈值较高。基线模型。红线-遮罩边界,多边形-gt。

流域

所有这些与门槛相关的问题引发了一些思考。

预测建筑物的边界也是必要的,我在模型输出中添加了边界遮罩

对于分割任务,我们需要稍微复杂一点的技术——例如,分水岭。在示例这里中可以找到一个默认用法,在我的例子中,它打破了一切。通过添加一些启发法解决了这个问题,例如,防止大房子(面具)的分割。

提交格式

…是多边形。这意味着我必须找到旧的库,并花一些时间进行近似调优。实际上,遮罩可以被扔进所有尖角的多边形中,不需要任何近似,但是它需要更多的时间,并且输出文件更重。

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

从 skimage 得到的多边形近似

第一个不愉快的时刻是,算法是随机的,并且从尝试到尝试的结果并不完全相同。第二个不愉快的时刻——一条近似的线在里面->面积变小->大概是借据<0.5 ->的错误

最终提交

我已经参加了比赛,第一次提交有点晚了。大多数错误,例如,错误的本地验证,必须立即更正。结果,一堆很酷的想法仍然没有得到验证。而且,因为我不想在最后一刻冒险进入前 10 名,所以最佳单人模特而不是合奏模特进入了最后的决赛。

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

最终排名

最终的第九名使得即使在重组后也不可能抓到前五名的怪物。然而,我仍然是一个 5 年制的学生,最大的动力是学生奖——最佳大学团队/参与者奖。因此,我振作起来,全力以赴,按照 TopCoder 指南提供了一个 dockerized 解决方案,这也有点挑战性。

老实说,我有点担心和害怕错过什么,所以我给 Topcoder 团队写了一封信,希望找到一些组织方面的东西,比如截止日期和学生的奖励要求。却没有得到回答。很长一段时间以来,我一直在竞争论坛和电子邮件中询问,但还没有从顶级程序员管理员那里得到任何关于一些问题的确切答案。这似乎有点令人沮丧,但我仍然不知道学生的奖项排名和我在私人验证中的最新分数。

原载于 2019 年 3 月 3 日spark-in . me

我如何处理不平衡的文本数据

原文:https://towardsdatascience.com/how-i-handled-imbalanced-text-data-ba9b757ab1d8?source=collection_archive---------7-----------------------

解决人工智能中最常见问题之一的蓝图

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

Photo by Form on Unsplash

不均衡类分布问题在数据科学领域普遍存在,ML 工程师经常遇到。我是 IMImoble Pvt Ltd 的聊天机器人开发人员,最近在培训意图分类模块时遇到了这种情况。现实世界的用户可以访问的任何实时业务聊天机器人都必然会吸引大量超出范围的查询以及与它被设计来执行的任务相关的消息。即使在相关的面向任务的消息中,不平衡也是可以预期的,因为机器人涵盖的所有主题不可能同样受欢迎。例如,在一个银行用例中,余额查询将超过房屋贷款申请。

Bot 构建不同于传统的应用程序开发。虽然后者相对稳定,更新频率较低,但前者需要频繁更新,以改善用户体验和机器人的智能。不平衡数据集是指属于一个类的数据明显高于或低于属于其他类的数据的问题。大多数 ML/DL 分类算法不能处理不平衡的类,并且倾向于偏向多数类。

为什么在不平衡数据集的情况下准确性是虚假的

仅针对不平衡数据集的高准确度可能会适得其反,因为像决策树和逻辑回归这样的标准分类器算法不具有处理其中包含的不平衡类的能力。这导致了对较大类的严重偏向,而具有较少数据点的类被视为噪声并经常被忽略。结果是与多数类相比,少数类的错误分类率更高。因此,当评估基于不平衡数据训练的模型的性能时,准确性度量并不相关。

考虑以下情况:您有两个类-A 和 B。A 类占数据集的 95 %, B 类占另 5%。通过简单地每次预测 A 类,您可以达到 95%的准确率,但是这为您的预期用例提供了一个无用的分类器。相反,正确校准的方法可能会实现较低的准确性,但会有更高的真实阳性率(或召回率),这确实是您应该优化的指标。

这篇文章解释了几种处理不平衡数据集的方法,但是它们中的大多数都不适用于文本数据。在这篇文章中,我分享了我用来平衡数据集的所有技巧和技术,以及将 f1 分数提高 30%的代码。

处理不平衡数据集的策略:

你能收集更多的数据吗?

您可能认为这不是您正在寻找的解决方案,但是收集更有意义和多样化的数据总是比采样原始数据或从现有数据点生成人工数据要好。

删除数据冗余:

  1. 删除重复数据——我处理的数据集包含大量相似甚至重复的数据点。“我的订单在哪里”和“订单在哪里”的语义是一样的。删除这些重复的信息将有助于你减少多数班级的人数。
  2. 有许多消息具有相同的语义,例如,考虑以下传达相同含义的消息。保留一两个这样的话语,去掉其他的,也有助于平衡阶层。那么,您可以在验证集中使用这些消息。有很多方法可以找到文本相似性,但我使用了 Jaccard 相似性,因为它非常容易实现,并且在计算相似性时只考虑唯一的单词集。你可以看看这篇文章中的其他技巧。

我可以更改送货时间吗?

我可以更改送货时间吗?

我可以更改送货时间吗?

3.合并少数民族类-有时多个类具有重叠的要素。还不如合并那几个小众班。这个技巧帮助我提高了超过 10%的 f1 分数。

重采样训练数据集:

修复不平衡数据集的最简单方法是通过对少数类的实例进行过采样或对多数类的实例进行欠采样来平衡它们。使用像 SMOTE(合成少数过采样技术)这样的高级技术将帮助你从少数类创建新的合成实例。

  1. 欠采样——努力从多数类中随机剔除数据点,直到类达到平衡。存在信息丢失的可能性,这可能导致较差的模型训练。
  2. 过采样—这是随机复制少数类实例的过程。这种方法可能会过度拟合,导致对测试数据的预测不准确。
  3. SMOTE-SMOTE 通过获取每个少数类样本并沿连接任意/所有 k 个少数类最近邻的线段引入合成样本来生成合成样本,如下图 GIF 所示。更重要的是,这种方法有效地迫使少数类的决策区域变得更普遍。查看这篇文章,了解简单的解释。不幸的是,这种技术不能很好地处理文本数据,因为从文本创建的数字向量是非常高维的。

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

SMOTE Illustration

如果很难收集到更多的数据,并且上面的技巧没有显示出有希望的结果,那么这里是最后的手段。

数据扩充:

数据增强是计算机视觉中常用的一种技术。在图像数据集中,它涉及通过变换(旋转、平移、缩放、添加一些噪声)数据集中的图像来创建新图像。对于文本,数据扩充可以通过将文档标记为句子、将它们混排并重新连接以生成新的文本,或者用同义词替换形容词、动词等以生成具有相同含义的不同文本来完成。任何预先训练好的单词嵌入或者 NLTK 的 wordnet 都可以用来寻找一个单词的同义词。

Kaggle 竞赛中使用的一个有趣的想法是将英语文本转换为任何随机语言,并使用神经机器翻译转换回英语。这一招帮我把 f1 成绩提高了 17%。检查这个 GitHub repo,找到关于使用语言翻译、spacy、 spacy_wordnet 和单词嵌入的数据扩充的代码

结论:

在处理不平衡数据集时,没有一站式的解决方案来提高评估指标。可能需要尝试几种方法来找出最适合文本数据集的技术。如果你曾经遇到过这样的问题,请告诉我你是如何解决的。

你想要更多吗?在LinkedInGitHub 上关注我。

[## kothiyayogesh/medium-商品代码

找到我所有媒体文章的代码。](https://github.com/kothiyayogesh/medium-article-code)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值