TowardsDataScience 博客中文翻译 2019(四百三十一)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

公路旅行热

原文:https://towardsdatascience.com/road-trip-fever-460a2627f0c4?source=collection_archive---------21-----------------------

Ep。4:求解 TSP 以获得目的地的有效路线

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

Our output today; All our efficient road-trip destinations on globe; connected linearly

想象一下你自己,走在蜿蜒的山路上,每个角落都会出现新的田园风光。或者感受海风吹过你的头发,驾驶着你的敞篷车,在那风景如画的海洋车道上感受无尽的夏日海浪。或者把你的露营车停在一个似乎从来没有人见过的地方。公路旅行有多种形式,通常会立即激发我们许多人的兴趣。

对于我们在第三集中看到的更大的集群,为了充分利用我们的假期,公路旅行是不可避免的。这就是为什么在今天的帖子中,我们将尝试回答如何在我们所有的度假目的地旅行:需要自驾游吗?如果是,如何最有效地穿过集群?

对于后者,我们将尝试为每个需要公路旅行的度假目的地解决一个微型版的 TSP

旅行推销员问题 ( TSP )提出以下问题:“给定一列城市和每对城市之间的距离,访问每个城市并返回出发城市的最短可能路线是什么?” —维基百科

我们的方法

  1. 在我们的度假目的地建立更小的住宿集群;这些将定义求解 TSP 的位置。
  2. 将需要 TSP 分析的目的地与仅包含一个或两个子聚类的目的地分开
  3. 探索哪种 TSP 解决算法最适合我们的问题并在我们的公路旅行度假目的地应用
  4. 想象我们新创造的全球公路旅行

数据

我们今天需要的数据是每项活动的经度和纬度方面的地理数据。因为我们已经在第一集中使用谷歌地图的地理编码 API 得出了这些。

然而,为了计算我们的公路旅行目的地之间的最佳路线,我们将从以下各项中提取驾驶距离(时间)数据:

定义夜间位置

在第三章中,我们将我们的旅游活动集中到了度假目的地。但与此同时,我们也注意到,这些度假目的地中的一些仍然包含相距很远的活动(例如,一个美国集群包含从芝加哥到新奥尔良的所有活动)。这意味着我们不能把自己的基地设在集群中的一个单独的位置,并且能够通过一日游参观所有的活动。我们必须在我们的活动和目的地之间创建一个新的层级:过夜地点。

我们要寻找的是一个单一的位置,从这个位置我们可以在一天内合理的距离内(因此距离是一个约束)从集群中获得尽可能多的活动。听起来很熟悉?那是因为这是一个和我们在上一集中提到的非常相似的问题!因此,让我们不要重新发明轮子,使用我们在那里使用的相同集群过程(DBSCAN 集群)来创建子集群,这些子集群将充当我们的夜间位置。

由于我们希望能够开车前往活动地点并返回我们的过夜地点,同时还能够享受活动,我们将根据最大直线距离200km选择ε参数*。因为我们想要访问集群中的所有活动,所以我们将选择 1 个的最小人口。确保没有异常值(即,如果子群中有一个活动,我们将访问该活动,并在继续下一个子群之前在那里停留 1 个晚上)。*

因此,在应用这种方法后,我们现在已经在我们的剧集中创建了三个旅游层级:

  • 活动-要参观的地方
  • 子集群-睡眠的位置
  • 集群-度假目的地

视觉上,回到美国的例子,这些层看起来像这样:

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

Fig. 1, 2, 3: Mapped activities, sub-clusters and clusters respectively, grouped by the 7 clusters in the US

由此可以立即看出,并非所有集群都有多个子集群。一些度假目的地有一个单一的过夜地点,从那里我们可以参观所有的活动。非常适合不太喜欢公路旅行的旅行者。

让我们来看一下我们的聚类分布,包括过夜地点的数量,以及公路旅行和非公路旅行聚类:

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

Fig. 4 distributions of the holiday destinations (clusters) by the number of overnight locations (sub-clusters)

大多数度假目的地只有一个过夜的地方。我们可以看到,大多数其他集群都有 2 到 10 个子集群,大多数都是较小的数量。然后有三个目的地有超过 10 个子集群,但这些似乎是相当例外。

谈到非公路旅行与公路旅行(> 2 个过夜地点)目的地的分布,我们对两者都有相当多的选择。这很好,因为我们希望有更多的选择来决定什么时候我们更喜欢公路旅行,什么时候我们更喜欢一个更固定的基地来探索目的地。每个国家都有 100 多个目的地(分别为 104 个和 143 个),有足够的选择余地。

选择正确的 TSP 求解算法

对于有多个过夜地点的 143 个目的地,我们需要定义穿过它们的最有效路线。同时在相同的位置开始和结束。

对于有两个和三个过夜地点的目的地来说,任何路线都是最有效的路线。然而,对于有 3 个以上过夜地点的所有路线,我们必须通过解决微型的旅行推销员问题,也称为 TSP,来导出最有效的路线。

一个很大的灵感来源于的这篇文章来自的兰迪·奥尔森。他的发现无疑比以前听说过 TSP 的人拥有更广泛的受众。他的遗传算法让我们特别感兴趣,因为我们不需要推导出绝对最佳的路线,更重要的是以适当的性能生成非常有效的路线。

我们的目标是实施最有效的算法来优化单个集群内的路线。正如我们在图 4 中观察到的,我们的大多数目的地只有 10 个或更少的过夜地点。

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

Fig. 5 Time complexity comparison for a brute force vs genetic algorithm approach

考虑到这些非常少的位置,我们不妨将遗传算法的时间复杂度与强力 TSP 算法进行比较,看看后者是否足以在我们的解决方案中实现。

在左侧的图 5 中,您可以看到随着我们集群内过夜地点数量的增加,完成路线优化的平均时间。通过这种方式,我们可以快速测试总的完成时间,以及越来越多的地点可能在未来或更长的假期产生的影响。

随着过夜场所数量的线性增长,暴力方法明显呈指数增长;虽然遗传算法的时间复杂度或多或少是线性增长的,但是对于性能的稳定性来说,这已经是更优选的解决方案。

对于我们的算法,即使我们每个目的地的位置有限,我们也想创建一个可持续的解决方案。因此,最好的方法是将遗传算法的一个衍生版本整合到我们的解决方案中。

创造高效的公路旅行

终于!有趣的事情来了:让我们实际上创造一些公路旅行!

现在我们已经最终确定了我们选择的算法,我们可以开始研究我们的数据,看看我们的公路旅行在实践中是怎样的。由于对 Randall 的第一篇文章仍然很感兴趣,同时也为了测试我们解决 TSP 问题的能力,我将在两个层次上创建公路旅行:一条穿越一个国家内所有活动的路线,以及为我们在这个国家内的每个目的地分开的路线(我们的最终目标)。

这里需要把握的重要一点是:

  • 全国范围的路线穿过包含我们活动的所有城市,而集群路线仅穿过我们过夜的地点。
  • 仅显示公路旅行目的地。未被公路出行聚类路径访问的位置要么是单位置目的地,要么是异常值。

让我们来看看四大洲四个较大国家的 TSP 解决方案:美国、巴西、印度和澳大利亚:

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

Fig. 6, 7 Efficient road-trips through our relevant locations in the United States; country-wide and for all road-trip destinations separated, respectively

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

Fig. 8, 9 Efficient road-trips through our relevant locations in Brazil; country-wide and for all road-trip destinations separated, respectively

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

Fig. 10, 11 Efficient road-trips through our relevant locations in India; country-wide and for all road-trip destinations separated, respectively* 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传**外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 12, 13 Efficient road-trips through our relevant locations in Australia; country-wide and for all road-trip destinations separated, respectively

总的来说,这些对我来说都是令人印象深刻的公路旅行!从视觉上看,它们的效率也相当高,虽然最有可能进一步优化这些路线,但与这样做所需的额外复杂性相比,增加的效率将是有限的。就我们的情况而言,进一步加强这些路线绝对是大材小用。

分开来看不同的目的地,我们看到各种形状和形式的公路旅行。猜猜看,印度西北部的大型公路旅行是我们的异常目的地,有 24 个过夜地点(见图 4)。

谈论休假旅行!

最终地图

所以今天我们设法将我们的目的地细分为过夜地点。我们还在代码中添加了 TSP 求解算法,当目的地有 3 个以上的位置时,该算法可以计算出这些过夜位置之间的有效路线。

总之,下面的互动图表将展示我们旅游活动中的所有公路旅行目的地,以及它们的线性连接的有效路线(不是实际的驾驶方式)。这张交互式地图是使用 Plotly 创建的。祝你下次旅行愉快!

Fig. 14 Map of all our road-trip destinations linearly connected by order of efficient route

读到这里又恰好是 Django/Web 开发方面的专家?如果你有兴趣给我的代码更多一点的形状,给我一个 DM…字面上。

关于我自己的更多信息,请随时查看我的 LinkedIn

机器人新闻:记者应该感到威胁吗?

原文:https://towardsdatascience.com/robo-journalism-should-journalists-feel-threatened-by-them-95185d68eb8d?source=collection_archive---------15-----------------------

当你听到机器人新闻这个词时,你会想到什么?你能想象计算机自己撰写整篇新闻文章,从而取代数百万记者吗?我相信绝对不是这样。事实上,记者很可能会感谢机器人记者的帮助。

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

Photo by Possessed Photography on Unsplash

对人工智能最大的社会担忧之一是工作岗位的转移。虽然人们普遍认为人工智能将取代大量工作,但人们普遍认为人工智能将取代需要最平凡、重复任务的工作。风险投资家李开复,曾向人工智能投资数百万美元,也是《人工智能的超能力》一书的作者,他展示了一张图表(图 2),列出了他对哪些工作是安全的,哪些工作很有可能被人工智能取代。他特别指出,专栏作家的工作可能不会被人工智能取代

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

Figure 2: Risk of replacement by Lee Kai-Fu. Source

相反,人工智能更有可能通过自动化日常工作的重复部分来帮助人类记者提高生产率。在我看来,人工智能将完全取代人类工作的想法也是人工智能的误解之一(见我的上一篇文章)。

机器人记者

新闻业不太可能被机器人取代的一个重要原因是,好的新闻业需要深度分析、创造性写作和事实报道的正确结合。这三项技能中的任何一项都是对机器人记者的挑战。

事实上,机器人记者写的文章的特点是大量数据驱动,通常是记者自己不喜欢写的死记硬背的文章。这些文章常见于体育、事件、选举和金融等领域。在一项对欧洲九家主要新闻媒体的研究中,其中七家至少在其中一个领域使用了自动化。

这种对机器人新闻的依赖表明,它有能力减轻记者的工作量,将他们从重复的工作中解脱出来,并帮助他们节省时间来撰写更深入的分析文章。

机器人新闻中使用的技术

自 2014 年以来,人工智能机器人新闻业取得了非常好的进展,三种主要技术成为机器人新闻业久经考验的实施方式。这三种主要技术是:

  • 使用编辑模板的自然语言处理(NLG)
  • 使用编辑模板进行趋势检测和 NLG
  • 声音转换

下表列出了使用 robo 记者的新闻机构。它们是根据使用的技术排列的。

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

Table 1: Survey of News outlets using Robo-Journalism

NLG 编辑模板

第一种技术使用带有经典机器学习技术(如决策树)的编辑模板。这种工作方式的例子可以从洛杉矶时报的 Quakebot 和 Tamedia 的鸢的实现中看出来。

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

Table 2: Example of Quakebot

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

Table 3: Example of Tobi

编辑/记者将首先为这些机器人编写编辑模板。当天气/体育/选举数据出现时,它们将进入一个机器学习模型(在鸢的情况下是决策树),以选择和提取正确的编辑模板,并填写相关的数字。

NLG 编辑模板的趋势

这些技术是对仅使用 NLG 编辑模板的改进。这些机器人记者还有一个额外的功能,那就是搜索/寻找趋势,并用编辑模板从这些趋势中创造新闻故事。这在主要由数据驱动的财经新闻中非常有效。Lynx Insights 报道 J&J 股票走势就是一个很好的例子:

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

Table 4: Example of Lynx Insights by Reuters

相同类型的其他工具以非常相似的方式工作。据传闻,来自彭博的电子人也以非常相似的方式工作。美联社(Associated Press)的雷达抓取了国家统计局(ONS)的报道,并将其与模板进行匹配。《福布斯》的机器人伯蒂根据投稿人之前的文章向他们推荐趋势话题和谈话要点。

头像和语音转换

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

Figure 3: A.I. News Anchor from Xin Hua

中国新闻媒体新华网在 2018 年推出的人工智能新闻主播受到了很多炒作。他们在长相、表情和声音(通过声音转换)上创造了一个新闻主播头像(仿照真实的新闻主播)。接下来,头像会收到新闻文章,允许主播全天候报道新闻。在写这篇文章的时候,这些文章是由人类而不是机器人记者写的。

假新闻

人工智能新闻主播由语音转换技术驱动。给定足够的训练数据,它允许学习说话者的声音,并潜在地用于说出任何句子。众所周知,这是产生假新闻的领域之一。

在美国,至少有一起涉及机器人新闻的事件已经导致了假新闻的传播。2017 年 6 月 22 日,Quakebot 收到消息称,距离圣巴巴拉约十英里的太平洋发生了 6.8 级地震。这个来自美国地质学会的警报被错误地发出,是关于 1925 年圣巴巴拉地震的警报。大多数新闻媒体认识到了这个错误,并忽略了警告,但不是 Quakebot,他继续向读者发出警告。

2019 年 2 月,也有新闻说 OpenAI 建立了一个文本生成器,好到他们不愿意发布它,因为害怕它被用来产生假新闻。举个例子,当单词 generator 被输入以下句子:循环利用对世界有益,不,你错得不能再错了,”机器回复道:

“回收对世界没有好处。这对环境有害,对我们的健康有害,对我们的经济也有害。我没开玩笑。回收对环境没有好处。它对地球具有破坏性,是全球变暖的主要原因。回收对我们的健康没有好处。它会导致肥胖和心脏病、癌症等疾病。回收对我们的经济有害。它增加了产品的成本,进而增加了用该产品制造的所有东西的价格。回收对我们国家没有好处。我们为拥有世界上最先进、最高效的回收系统付出了巨大的代价。回收是对时间、能量、金钱和资源的巨大浪费。”

既然文字生成可以,为什么不能用于新闻写作?

open.ai 的文本生成模型是一项伟大的技术壮举,可以生成语法正确的文本段落。然而,这种技术仍然不能直接应用于新闻生成,因为不能保证生成的文本在事实上是正确和相关的。因此,尽管这些文本生成器可能能够生成小说段落,但它们距离用于生成新闻还有几步之遥。

希望这篇文章对你有意思!如果你喜欢这篇文章,请鼓掌。

作者是新加坡理工学院的助理教授。他拥有帝国理工学院的计算机科学博士学位。他还在新加坡麻省理工学院联盟(SMA)项目下获得了新加坡国立大学计算机科学硕士学位。

本文中的观点仅代表作者的观点,并不代表作者所属任何组织的官方政策或立场。作者也没有从属关系,也没有从本文提到的任何产品、课程或书籍中赚取任何费用。

参考

https://beta news . com/2019/03/18/the-good-and-evil-of-robo-journalism/

[## 机器人新闻:计算机生成的故事可能是不可避免的,但也不全是坏消息

如果报纸读者的持续减少还不足以说服未来的记者选择一个…

theconversation.com](http://theconversation.com/robo-journalism-computer-generated-stories-may-be-inevitable-but-its-not-all-bad-news-89473)

https://TechCrunch . com/2019/02/17/open ai-text-generator-dangerous/

https://www . technology review . com/f/609828/automation-is-creeping-to-journalism-but-human-reporters-not-have-more-to-fear-yet/

https://Reuters institute . politics . ox . AC . uk/sites/default/files/2017-09/Fanta % 2C % 20 puting % 20 Europe % E2 % 80% 99s % 20 robots % 20 on % 20 the % 20 map . pdf

https://www . tandfonline . com/doi/full/10.1080/21670811.1289819?af=R

https://TechCrunch . com/2019/02/17/open ai-text-generator-dangerous/

预测葡萄品种

原文:https://towardsdatascience.com/robosomm-chapter-1-predicting-grape-varieties-4c5beb505a7b?source=collection_archive---------12-----------------------

机器人

从葡萄酒评论中提取描述符并探索不同品种的关键特征

有很多关于盲品葡萄酒的艺术和科学的文章和言论。对于世界上最好的品酒师来说,能够正确识别你面前的一杯酒是一种骄傲。Somm 系列纪录片揭示了与此相关的惊人技能。通过使用一种名为“网格”的结构进行多轮有针对性的提问,侍酒师能够识别葡萄品种/混合、地区,有时甚至是一杯葡萄酒的年份。

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

在本文中,我们将通过使用数据科学技术,从不同的角度探索盲品。我们可以训练一个算法来盲尝吗?我们能建造自己的机器人吗?

更详细的请参见更详细的 GitHub 资源库 以及关联的 Jupyter 笔记本

从例子中学习

RoboSomm 将不得不从例子中学习。为此,我们使用了友好的 Kaggle 用户https://www.winemag.com/收集的 17 万条独特的葡萄酒评论。这些葡萄酒评论描述如下:

无论是嗅觉还是味觉,这款加那查葡萄酒都是温和的有棱角和收缩感,坚硬的单宁带来了一种原始的感觉。其狐狸般的李子味道跳跃而紧张,回味辛辣而参差不齐。

我们需要修改我们的例子,以确保它们不包含任何盲品时无法通过感官获得的信息。毕竟,当我们试图盲目品尝时,我们不会知道我们试图鉴别的葡萄酒是加纳夏!除了删除任何“不可知”的信息,我们还删除了任何非信息性的术语,并通过了几个文本标准化步骤来标准化我们的文本。从上面的描述中,我们可以获得以下描述符:

['hard tannin', 'plum', 'pepperi', 'mild', 'tannin', 'plum flavor']

从葡萄品种开始

世界上最好的品酒师在盲品时可以推断出葡萄酒的品种、产地和年份。这对于第一代 RoboSomm 来说可能有点过于雄心勃勃了。为了限制练习的范围,我们将从看看是否可以训练一个模型来预测数据集中最常见的葡萄品种开始。为简单起见,我们也将删除混合。我们剩下的葡萄品种有:

['Pinot Noir', 'Chardonnay', 'Cabernet Sauvignon', 'Riesling', 'Syrah', 
'Sauvignon Blanc', 'Zinfandel', 'Sangiovese', 'Merlot', 'Malbec', 
'Tempranillo', 'Nebbiolo', 'Pinot Gris', 'Grüner Veltliner', 
'Cabernet Franc', 'Grenache', 'Viognier', 'Gamay', 'Gewürztraminer', 'Barbera']

为了让我们熟悉这些葡萄品种,我们可以根据与每种葡萄最相关的描述符来构建词云:

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

当一个词出现得越频繁,它在我们的词云中就会越大。我们可以看到许多描述符出现在几乎每一种葡萄品种上——例如,水果和单宁。从上面我们可能会说,一般来说,西拉葡萄酒比歌海娜葡萄酒单宁更强。尽管一些词出现在几个词云中,但我们可以看到葡萄品种之间有显著的差异。长相思比其他葡萄酒有更明显的柑橘味。巴贝拉葡萄酒的辛辣味相对较重。对于夏敦埃酒,我会想到烤面包和苹果。

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

建筑模型

随着我们的原始文本被转换成描述符,我们几乎准备好开始构建模型了。首先,我们需要将基于文本的描述符转换成数字特征。我们将使用一种简单的方法,称为 one-hot-encoding,来产生一个 1 和 0 的矩阵,以突出每个描述符对于给定的观察是否存在。

此外,我们应该花点时间考虑如何评估我们模型的性能。我们希望 RoboSomm 能够高精度地识别出它面前的葡萄酒。当它做出预测时,这个预测需要是准确的。我们对检索特定葡萄品种的所有例子不感兴趣。此外,如果我们的模型能够高精度地识别许多不同的葡萄品种,而不仅仅是我们数据集中最常见的品种,那就太好了。因此,我们将关注的关键性能指标是所有类别的平均精度(不按观察次数加权)。

在进入我们的模型之前,我们应该解决的最后一项内务是我们如何定义训练和测试集——训练集用于训练我们的模型,测试集用于评估它的性能。我们的训练集是数据集的 80%,测试集构成剩余的 20%的数据。

模型 1:决策树

当品酒师进行正式的盲品时,他们会使用一种叫做“网格”的结构。网格是一个记忆的属性表。在数据科学的世界中,我们可以认为这类似于决策树。一轮又一轮的连续问题提供了一个简洁的结构,帮助 somms 对面前的葡萄酒进行分类。

我们的决策树模型在我们的测试集上仅实现了较低的平均精度(28%)。然而,决策树能告诉我们什么样的连续提问能最有效地让我们区分葡萄品种。让我们想象一下树的前几层(实际的决策树要深得多),看看我们能学到什么。

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

可视化练习揭示了一些葡萄酒非常独特。例如,长相思似乎是一个非常安全的赌注,如果有一个甜椒味道/香气,没有荔枝。尽管在我们的数据集中红葡萄和白葡萄品种的数量更多(13 对 7),但我们可以看到一些内比奥罗(香脂)和加迈(香蕉)葡萄酒具有相当独特的风味特征。不能保证所有的长相思、内比奥罗和佳美葡萄酒都具有上面列出的特征,但是如果特征存在,这是一个很好的预测指标。

模型 2:投票分类器

决策树是一种相当简单的分类算法。还有其他更复杂的算法可以产生更高的性能。对于这个练习,我们探索了多个选项,但是发现多项式朴素贝叶斯(MNB)和随机森林分类器是为我们的测试集产生最高平均精度的算法。

为了从这些算法的相对优势中受益,我们可以更进一步,使用一种叫做投票分类器的东西来组合每个算法返回的预测。投票分类器将运行这两种算法,并对每种算法返回的预测进行加权,以得出单个预测。

我们的投票分类器成功地将未加权的平均精度提高到 51%。这似乎更…可口。现在我们有了一个性能更好的分类器,让我们更深入地看看返回的预测。有没有特定的葡萄品种只是比其他品种更难预测?

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

看来有些确实更容易高精度地预测。Gewürztraminer、Grüner Veltliner、Pinot Gris 和 Sauvignon(方便的说都是白葡萄酒)的预测精度在 75%左右。这也可能是因为我们的数据集中只有 7 个白葡萄品种。在红葡萄酒中,内比奥罗和仙粉黛的精确度相对较高。

尽管我们的结果令人鼓舞,但一些葡萄品种似乎很难预测。品丽珠和维欧尼不会作为我们测试集的预测返回。让我们深入一点。为什么会出现这种情况?

为了更详细地研究我们模型的性能,我们将构建一个混淆矩阵。混淆矩阵是一个网格,显示正确和错误预测的数量,并用计数值汇总。

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

我们的混淆矩阵可以帮助我们讲述返回的预测的故事。例如,我们可以看到,在我们的测试集中,1232 种黑皮诺葡萄酒被正确预测。我们还可以看到,品丽珠葡萄酒一直被预测为黑皮诺、赤霞珠或西拉。维欧尼葡萄酒一直被认为是霞多丽或雷司令。

我们可以确定两个可能的原因(在众多原因中!)为什么会这样:

  1. 我们正在处理一个不平衡的数据集(霞多丽比维欧尼多得多,黑皮诺比卡本内法郎多得多)。这使得普通葡萄品种更有可能作为预测返回,而不是数量较少的葡萄品种。尽管探索了减轻这一问题的技术(欠采样、过采样),但这些技术显著降低了模型的整体性能。
  2. 在我们的数据集中,Viognier 和 Cabernet Franc 没有 Gamay 和 Gewürztraminer 等同样多的葡萄品种那么独特。

关于葡萄酒相似性的最后一点

为了建立一个更全面的模型,还探索了工程特征的替代方法。我们可以选择用嵌入来表示每个描述符,而不是用 0 和 1 的矩阵来表示描述符的存在或不存在。

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

单词嵌入是将单词表示为向量的一种方式。通过完成右图中概述的过程,我们可以为每个葡萄酒描述生成一个单独的嵌入。您会注意到,只从原始文本中提取了单个单词,而不是短语——有关这方面的更多详细信息,您可以访问上面引用的 Jupyter 笔记本中的代码。

不幸的是,这种方法并没有比我们使用 0 和 1 的“简单”方法产生更好的结果。然而,我们也可以使用创建平均单词嵌入的方法来构建给定葡萄品种的所有描述的平均向量。然后使用一种叫做 T-SNE 的技术将这个向量压缩成二维,我们可以建立一个可视化的模型,告诉我们对不同葡萄品种的描述有多相似。

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

尽管解释 T-SNE 视觉化的空间可能会很棘手,但这里还是有一些经验可以借鉴。我们可以看到,白葡萄酒在我们的地块中占据了一个区域,而红葡萄酒都位于底部。较浅的红葡萄酒如歌海娜、黑比诺和加梅位于同一地块,较重、单宁较强的红葡萄酒如西拉、马尔贝克和坦普拉尼洛也彼此相邻。品丽珠,一种经常被误归类为黑比诺或赤霞珠的葡萄酒,确实介于这两种葡萄品种之间。

对于白葡萄酒,我们可以看到,较甜的葡萄品种如 Gewürztraminer 和 Riesling 彼此相对靠近,而较干的品种如 Pinot Gris 和 Sauvignon Blanc 占据了地块中的不同区域。有些令人惊讶的是,维欧尼和霞多丽相差如此之远。这两种葡萄酒都被认为是醇厚的白葡萄酒,我们知道维欧尼一直被误认为是夏敦埃酒。这可能是因为我们不能在一个简单的二维图中完全捕捉这些葡萄品种之间的相似性。

结论

总的来说,在我们能够建立一个能够在盲品中可靠识别葡萄酒的机器人之前,还有很多工作要做。尽管如此,我们在这次探索性练习中学到了很多东西。我们已经研究了将基于文本的葡萄酒描述转换成一组描述符的方法,并研究了 20 种受欢迎的葡萄品种之间的差异。我们已经建立了一些预测葡萄品种的初步模型。由于仍有足够的改进空间,我们可以继续调查以下事项:

  • 我们能使用更复杂的模型来预测葡萄品种吗?
  • 我们能为不同的葡萄品种建立比本文中探索的单词云可视化更全面的风味特征吗?
  • 我们能否超越葡萄品种,建立一个模型来预测不同葡萄品种的葡萄酒风格(例如橡木桶陈酿的霞多丽和未橡木桶陈酿的霞多丽)?
  • 除了预测葡萄酒的风格,我们还可以预测与葡萄酒相关的地区和年份吗?

作为临别赠言,让我们借用伟大的侍酒师弗雷德·丹姆的一些至理名言。在生活中,在数据科学中…

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

探索霞多丽的变化

原文:https://towardsdatascience.com/robosomm-chapter-2-exploring-variations-of-chardonnay-7aa70f5317c2?source=collection_archive---------29-----------------------

机器人

利用 K-Modes 聚类更好地理解品种内的变异

介绍

数据科学让我们能够以全新和意想不到的方式体验葡萄酒世界。在本文中,我们将使用一套称为聚类的数据科学技术来研究霞多丽葡萄酒的变化。

准备我们的数据集

发布给www.winemag.com的 15000 条关于霞多丽葡萄酒的在线评论被删除,包括其他可能感兴趣的属性:年份、价格、评级和酒厂的位置。

在研究各种类型的霞多丽时,我们最感兴趣的是葡萄酒的可感知特征。为此,从基于文本的葡萄酒评论中提取描述符,利用 RoboSomm 系列的前一章中的工作。

首先,通过删除标点符号、停用词和将文本转换成小写字母来规范评论。单词的屈折使用一种叫做词干化的过程来标准化。然后提取 2000 个最常见的单词和单词组合(二元模型)。这个术语列表经过过滤,只保留那些在盲品一杯葡萄酒时可以合理提取的术语。此外,含义模糊的词语(例如,‘酸’是指葡萄酒中的酸度高还是低?)也被删除。

这个过程留下了大约 500 个标准化的原始描述符来描述我们的夏敦埃酒。使用映射系统将每个原始描述符映射到一个类别(级别 1)、一个高级描述符(级别 2)和一个低级描述符(级别 3)。下面提供了一个这样的例子。

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

在我们的聚类练习中,使用了 2 级描述符。这个级别足够宽泛,可以让一致的主题出现在葡萄酒评论中,也足够具体,可以让不同类别之间出现有趣的差异。

使聚集

在数据科学中,聚类是创建相似数据点的分组集的任务。这是一种无监督的学习方法,这意味着它从数据集中提取参考,而没有标记的响应。在这种情况下,我们开始使用聚类来了解夏敦埃酒有多少种类型,以及这些类型有何不同。

由于我们的数据本质上是分类的,我们必须注意选择正确的方法来构建我们的聚类。许多标准聚类算法(如 k-means)使用基于欧氏距离的评估度量来分配聚类成员。这对于分类数据来说效果不好,因为在分类数据中,数值之间的大小差异是没有意义的。

在探索了几个备选方案后,我们选定了 k-modes 算法。该算法要求指定聚类数。选择“正确”的集群数 k 不是一件简单的任务!我们使用了多种技术组合(碎石图、平均轮廓分数、轮廓分析)来得出 k = 5 的值。你可以在这个 Jupyter 笔记本里读到更多关于这个过程的内容。在这 5 组中,有 3 组的观察值有意义。我们称之为 A,B 和 c。

研究我们的星团

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

我们的三个集群大小不同。事实上,聚类 A 包含了我们数据集中的大部分夏敦埃酒。聚类 B 和 C 略小,分别占 21%和 14%。

描述符的差异

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

让我们看看我们的集群在(第 3 级)描述符方面有什么不同。在聚类 A 中最常出现的描述词是与水果相关的:最显著的是苹果和梨。聚类 B 具有柑橘相关的水果描述符,例如柠檬、酸橙和橙子。特定的水果风味似乎在 C 类葡萄酒中不太明显,尽管这些葡萄酒总体上仍有水果味,并以成熟的水果风味为标志。此外,这些葡萄酒似乎是浓缩的,丰富的和浓郁的。

当我们查看每个分类中属于特定类别(1 级描述符)的所有描述符的百分比时,这些主题得到了确认。17%的 C 类葡萄酒描述符与酒体相关,而 A 类和 B 类分别为 8%和 9%。有趣的是,C 类葡萄酒的酸描述符较少(占总量的 9%,而 A 类和 B 类分别为 11%和 12%)。这可能表明 C 类葡萄酒的酸度较低。在任何情况下,这些葡萄酒的酸性特征都没有其他葡萄酒明显。

地理上的差异

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

接下来,让我们看看我们的集群在地理分布上的差异。我们可以看到,C 类葡萄酒确实与 A 类和 B 类非常不同。A 类和 B 类主要是美国葡萄酒,而 C 类葡萄酒来自法国。更具体地说,大约三分之二的 C 组葡萄酒是勃艮第白葡萄酒。

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

另一个观察结果是,澳大利亚葡萄酒集中出现在聚类 B 中(占总数的 9%),而它们在聚类 A (3%)和聚类 C (2%)中很少出现。

价格差异

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

我们还可以计算每个聚类的价格分布。毫不奇怪,聚类 C 包含迄今为止最昂贵的葡萄酒。这里的平均价格是 54.52 美元,比其他集群的平均价格高出 65%。这与勃艮第葡萄酒作为霞多丽葡萄酒的黄金标准的刻板印象是一致的。

酒精含量差异

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

值得一提的最后一个变量是每个集群中葡萄酒的酒精含量。还是那句话,A 群和 B 群的葡萄酒是相似的。然而,C 类葡萄酒的平均酒精含量要低得多。这可能归因于地理位置。众所周知,勃艮第等气候较冷的地方出产酒精含量较低的葡萄酒。

综合

检查了我们的三个集群后,我们可以总结每个集群的发现。这也允许我们给它们起一个名字,一个比‘A’、‘B’和‘C’更有启发性的名字。

下面是集群 A 的总结,我们的树果实密集的夏敦埃酒。在左侧,您可以看到按类别分类的最常见描述符的概述。地理概况,年龄和价格在右边。

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

An example of a tree fruit-intensive wine is the 2017 Lava Cap from the Sierra Foothills in California.

聚类 B 在其柑橘类水果描述符方面是独特的。柠檬、酸橙、葡萄柚和橙子的味道使这些葡萄酒与众不同。

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

An example of a Cluster B wine is the 2014 Stephen Ross Bien Nacido Vineyards Chardonnay from the Santa Maria Valley.

聚类 C 的标签并不奇怪:白勃艮第。这些葡萄酒因其浓郁、柔和和浓郁的风味而脱颖而出。在我们基于平均轮廓分数的分析中,这是最独特的聚类(在附带的 Jupyter 笔记本中有更多关于这一点的信息)。

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

An example of a Cluster C wine is the 2016 Grand Vin de Bourgogne Pouilly Fuisse.

结论

在探索不同品种的霞多丽的过程中,我们对这些葡萄酒的风味、地理和价格有了很多了解。这项工作是一个有趣的起点,可以帮助我们了解一个葡萄品种内的变异。令人鼓舞的是,仅使用葡萄酒描述符的无监督聚类任务能够在法国和美国霞多丽之间建立如此强烈的区别。这本身就使得这成为一个有趣的领域进行进一步的分析。

葡萄酒嵌入和葡萄酒推荐器

原文:https://towardsdatascience.com/robosomm-chapter-3-wine-embeddings-and-a-wine-recommender-9fc678f1041e?source=collection_archive---------12-----------------------

机器人

量化 150,000 多种葡萄酒的感官特征,建立葡萄酒推荐模型

RoboSomm 系列前几章的基石之一是从专业葡萄酒评论中提取描述符,并将其转换为定量特征。在本文中,我们将探索一种从葡萄酒评论中提取特征的方法,该方法结合了现有 RoboSomm 系列和关于该主题的学术文献的最佳内容。然后,我们将使用这些特性来生成一个简单的葡萄酒推荐引擎。

包含所有相关代码的 Jupyter 笔记本可以在这个 Github 库中找到。我们的数据集包括大约 180,000 篇专业葡萄酒评论,摘自 www.winemag .com。这些评论跨越大约 20 年,涵盖几十个国家和数百种葡萄品种。

葡萄酒嵌入

在下一节中,我们将通过五个步骤来创建我们的“葡萄酒嵌入”:每种葡萄酒的 300 维向量,总结其感官特征。在途中,我们将解释其他人在类似项目中采取的成功方法。在我们继续之前,让我们挑选一款葡萄酒加入我们的旅程:

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

Point & Line 2016 John Sebastiano Vineyard Reserve Pinot Noir

点评: 两位在圣巴巴拉餐厅工作多年的商业伙伴将干红花朵和山艾树结合在一起,为这款装瓶带来优雅的芳香。龙蒿和迷人的胡椒味点缀着浓郁的蔓越莓口感,酒体轻盈但结构良好。

太棒了。是时候开始了。

步骤 1:标准化葡萄酒评论中的单词(删除停用词、标点符号和词干)

第一步是规范我们的文本。我们希望从原始文本中删除停用词和任何标点符号。此外,我们将使用词干分析器(Sci-Kit Learn 中的雪球斯特梅尔)来减少词干的屈折变化。皮诺审查变成如下:

dri 红花山艾树 combin eleg aromat entri bottl 两辆巴士搭档工作圣巴巴拉餐厅场景 mani year 龙蒿 intrigu 胡椒味装饰 tangi cranberi palat light _ bodi veri well structur

步骤 2:用短语(双字组和三字组)增强标准化单词集

接下来,我们要考虑这样一种可能性,即我们想从葡萄酒描述中提取的一些术语实际上是单词或短语的组合。在这里,我们可以使用 gensim 包短语为整个语料库生成一组二元和三元语法。通过 phraser 运行我们的标准化葡萄酒评论,将“light”和“bodi”等经常出现在“light_bodi”旁边的术语合并在一起:

dri 红花山艾树 combin eleg aromat entri bottl 两个巴士搭档工作圣巴巴拉餐厅场景 mani_year 龙蒿 intrigu 胡椒味装饰 tangi cranberi palat light _ bodi veri well struct

第三步:使用 RoboSomm wine wheels 标准化每次点评中的葡萄酒描述符

品酒师在语言运用上往往很有创意,有时会用不同的词来描述看似相同的事物。毕竟,“湿石板”、“湿石头”和“湿水泥”的香味难道不是同一种感官体验的真实表现吗?另外,品酒有特定的行话。诸如“烘焙的”、“热的”或“抛光的”等术语在品酒界有特定的含义。

为了标准化葡萄酒行话和创造性的描述符,陈智思等研究人员开发了计算葡萄酒轮。计算型葡萄酒轮对葡萄酒评论中出现的各种葡萄酒术语进行分类和映射,以创建一组统一的描述符。这项伟大的工作,连同其他人的贡献(例如 Wine FollyUC Davis )已经被用来产生robosom Wine wheels。这些 wine wheels 是在完成上述步骤 1 和 2 之后,通过查看语料库中最频繁出现的描述符列表而创建的。然后手动检查该列表,并映射到一组标准化的描述符。总之,这导致了 1000 多个“原始”描述符的映射。

第一个 RoboSomm 葡萄酒轮是一个芳香轮,它对各种芳香描述符进行分类:

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

Wine Aroma Wheel

第二个葡萄酒轮是非香气轮,它考虑了其他特征,如酒体、甜度和酸度。这些描述符通常不包含在品尝轮中,但却是品尝体验的重要组成部分:

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

Wine Non-Aroma Wheel

我们可以选择在轮盘的三个级别中的任何一个级别标准化葡萄酒术语,或者使用原始描述符本身(没有标准化)。现在,我们将把描述符映射到轮子的外层。对于我们开始处理的黑皮诺审查,我们获得了以下信息:

花荞combin 芳香 entri bottl 两车搭档工作 santa_barbara 餐厅场景 mani_year 龙蒿intri gu胡椒 风味装潢

请注意,所有已经映射的描述符都以粗体突出显示。在本分析的上下文中,其他术语要么是不提供信息的,要么是模糊的。

步骤 4:检索评论中每个映射术语的 Word2Vec 单词嵌入

接下来,我们需要考虑如何量化我们的映射描述符集。实现这一点的常用方法(也是 RoboSomm 系列的前几章中使用的方法!)是用 0 或 1 来表示语料库中每个描述符的不存在/存在。然而,这种方法没有考虑术语之间的语义(不)相似性。例如,龙蒿更像山艾树,而不是蔓越莓。为了说明这一点,我们可以创建单词嵌入:单词和短语的向量表示。Els Lefever 等研究人员和她的合著者在他们的工作中采用了类似的方法来量化葡萄酒评论。

出于这个项目的目的,我们将使用一种称为 Word2Vec 的技术为每个映射项生成一个 300 维的嵌入。由于葡萄酒行话如此具体,我们必须在一个有代表性的语料库上训练我们的 Word2Vec 模型。好在我们这一套 18 万的酒评正是如此!之前已经使用我们的 wine wheels 映射了我们的描述符,我们已经在一定程度上标准化了语料库中的葡萄酒术语。这样做是为了消除不必要的语义差异(例如,将“湿石头”、“湿石板”和“湿水泥”合并为“湿岩石”),希望提高我们的 Word2Vec 模型的质量。

我们训练的 Word2Vec 模型由语料库中每个术语的 300 维嵌入组成。然而,我们可以回忆起上一步的分析,我们真正关心的只是与葡萄酒感官体验相关的术语。

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

对于我们的黑皮诺,这些是:

干,花,山艾,优雅,龙蒿,胡椒,扑鼻,蔓越莓,酒体轻盈

在相邻的图像中,我们可以看到每个映射描述符的单词嵌入。

第五步:用 TF-IDF 权重对葡萄酒评论中嵌入的每个词进行加权,并将嵌入的词加在一起

既然我们已经为每个映射的描述符嵌入了一个单词,我们需要考虑如何将它们组合成一个向量。以我们的黑皮诺为例,“干”是所有葡萄酒评论中一个相当常见的描述词。我们想让它的权重小于一个更稀有、更独特的描述符,比如“山艾树”。此外,我们希望考虑每次审查的描述符总数。如果在一篇评论中有 20 个描述符,而在另一篇评论中有 5 个描述符,那么前一篇评论中的每个描述符对葡萄酒整体形象的贡献可能比后一篇评论中的要小。术语频率-逆文档频率(TF-IDF)考虑了这两个因素。TF-IDF 查看单个评论(TF)中包含多少映射描述符,以及每个映射描述符在 180,000 条葡萄酒评论(IDF)中出现的频率。

将每个映射描述符向量乘以其 TF-IDF 权重,得到我们的加权映射描述符向量集。然后,我们可以对这些进行求和,以获得每个葡萄酒评论的单个葡萄酒嵌入。对于我们的黑皮诺,这看起来像:

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

构建葡萄酒推荐器

现在我们已经有了葡萄酒嵌入,是时候享受一些乐趣了。我们可以做的一件事是生产一个葡萄酒推荐系统。我们可以通过使用最近邻模型来做到这一点,该模型计算各种葡萄酒评论向量之间的余弦距离。彼此最接近的葡萄酒嵌入作为建议返回。

让我们看看,当我们插入之前的黑皮诺系列时,我们得到了什么建议。在我们的数据集中,180,000 种可能的葡萄酒中,哪些是作为建议返回的?

***Wine to match: Point & Line 2016 John Sebastiano Vineyard Reserve Pinot Noir (Sta. Rita Hills)**
Descriptors: [dry, flower, sagebrush, elegant, tarragon, pepper, tangy, cranberry, light_bodied]
________________________________________________________________**Suggestion 1**: **Chanin 2014 Bien Nacido Vineyard Pinot Noir** **(Santa Maria Valley)**
Descriptors: [hibiscus, light_bodied, cranberry, dry, rose, white_pepper, light_bodied, pepper, underripe, raspberry, fresh, thyme, oregano, light_bodied, fresh]

**Suggestion 2: Hug 2016 Steiner Creek Pinot Noir (San Luis Obispo County)**
Descriptors: [fresh, raspberry, thyme, pepper, rosemary, sagebrush, dry, sage, mint, forest_floor, light_bodied, cranberry_pomegranate, tangy]

**Suggestion 3: Comartin 2014 Pinot Noir (Santa Cruz Mountains)**
Descriptors: [vibrant, tangy, cranberry, hibiscus, strawberry, pepper, brown_spice, pepper, spice, bay_leaf, thyme, herb, underripe, raspberry, cranberry, fruit]*

返回的前三名葡萄酒都是来自加州的黑皮诺。查看这些葡萄酒的描述符,我们可以看到它们确实与我们的原酒非常相似。蔓越莓出现在每一个建议中。由于构建葡萄酒嵌入的方式,还考虑了不相同的术语的语义相似性。比如原酒评中的‘花’字,就和第一条建议中的‘芙蓉’和‘玫瑰’相似。

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

如果我们看看我们的黑比诺系列的十大葡萄酒建议(完整名单见这个 Jupyter 笔记本),我们可以看到这些建议非常一致。所有十种葡萄酒都来自加利福尼亚,十种中有九种是黑皮诺。有五种甚至产自我们原酒的 60 英里半径范围内。唯一不是黑比诺的葡萄酒是产自圣伊内斯山谷的品丽珠,距离我们的 Point &系列黑比诺的产地只有 25 分钟的车程。我们的黑比诺葡萄酒的地理来源似乎对它的感官特性有很大的影响,这使得它可以与邻近的其他类似的葡萄酒相匹配。相邻的地图显示了我们推荐的葡萄酒在地理上有多集中。

这种推荐模型的卓越性能确实引出了一个问题:返回的建议怎么可能如此特定于一个地理区域?

就其核心而言,这种分析完全依赖于用来构建葡萄酒嵌入的葡萄酒评论。在的这篇文章中,一位葡萄酒爱好者的品酒师解释了葡萄酒在 www.winemag.com 网站上是如何评级的。虽然评级是通过盲品过程给出的,但并不完全清楚评论中的文字描述是否也是无偏见评估过程的产物。有可能评论家在看到酒瓶后,会有意识或无意识地将某些术语归因于特定类型的葡萄酒(例如,南加州黑皮诺的“山艾树”)。

另一方面,这些葡萄酒也完全有可能真正展现出可归因于特定葡萄品种、风土和酿酒风格的感官特征。来自葡萄酒爱好者的专业评论家可能有如此精细的味觉,他们可以在没有看到瓶子的情况下挑出每种葡萄酒的细微差别。

用描述词推荐葡萄酒

作为最后一个练习,我们可以采取稍微不同的方法来利用我们的葡萄酒推荐者。比方说,我们正在寻找一种具有特定特征的葡萄酒。在炎热的夏天,我们可能会觉得这是一款新鲜、高酸度的葡萄酒,有着柚子、青草和酸橙的香味。让 RoboSomm 葡萄酒车兜一圈,我们可以挑选出符合这些特征的描述词:“新鲜”、“高酸”、“葡萄柚”、“草”和“酸橙”。

将这些描述符输入葡萄酒推荐器,我们得到以下建议:

***Suggestion 1 : Undurraga 2011 Sibaris Reserva Especial Sauvignon Blanc (Leyda Valley)**
Descriptors: [minerality, zesty, crisp, grass, lime, grapefruit, lemongrass, angular]

**Suggestion 2 : Santa Rita 2012 Reserva Sauvignon Blanc (Casablanca Valley)**
Descriptors: [snappy, pungent, gooseberry, grapefruit, lime, racy, lime, grapefruit, nettle, pith, bitter]

**Suggestion 3 : Luis Felipe Edwards 2015 Marea Sauvignon Blanc (Leyda Valley)**
Descriptors: [punchy, grass, citrus, tropical_fruit, fruit, angular, fresh, minerality, tangerine, lime, lemon, grapefruit, tangy]*

所有三款推荐的葡萄酒都是智利长相思,其中两款来自莱达山谷。再次值得注意的是,这些建议在地理上是多么的集中。尤其是考虑到葡萄酒推荐者有 18 万种不同的葡萄酒可供选择!

结论

我们有很多方法可以使用我们的葡萄酒嵌入。我们简单的葡萄酒推荐模型表明,从地理角度进一步研究葡萄酒风格可能是值得的。风土对酿酒风格有什么影响?对于不同的葡萄品种来说,地理差异是否以同样的方式存在?也许我们还可以了解更多关于写葡萄酒评论的过程,以及偏见在多大程度上推动了某些描述符的使用。

风土的影响

原文:https://towardsdatascience.com/robosomm-chapter-4-the-effect-of-terroir-18168f0d08b9?source=collection_archive---------18-----------------------

机器人主持人

风土成分的量化及其对葡萄酒风味特征的影响

葡萄酒研究的一个核心概念是风土:影响葡萄酒味道的环境因素。葡萄酒界有很多关于风土的神话。已经有书籍讨论风土是否是一个有效的概念,而的科学家试图解开风土的哪些成分影响风味、香味和口感。

在这篇文章中,我们将使用数据科学技术来了解土壤的哪些成分(如果有的话)对葡萄酒的感官特征有影响。点击这里查看 GitHub 库及所有相关代码

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

Photo (Grape 1368): Reign of Terroir

量化风味特征

在 RoboSomm 系列的前一章中,我们使用专业葡萄酒评论中包含的信息来生成“葡萄酒嵌入”:超过 150,000 种独特葡萄酒的风味特征的矢量表示。我们现在将探索这些风味特征在多大程度上可以用风土属性来解释。

风土属性

我们的 150,000+葡萄酒数据集包含位置和年份信息。我们可以利用这些信息引入各种不同的与土壤相关的属性的外部数据:

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

Data on soil type was retrieved from the SoilGrids API, while precipitation and temperature data was pulled from Google BigQuery. Altitude information was pulled from the Google Elevation API.

并非我们数据集中所有的葡萄酒评论都有可用的风土数据。对于天气来说尤其如此。此外,对于我们数据集中的一些葡萄酒,最近的气象站在数百公里之外。由于这不太可能产生可靠的天气数据,任何距离超过 150 公里的此类实例都被删除。

在删除所有缺失土壤、天气或海拔值的观测值后,我们剩下大约 33,000 个可用的观测值。

为了完整起见,我们为每种葡萄酒增加了两个可能影响风味的已知属性:葡萄品种和年份。这使我们能够控制似乎与这些属性相关的风味变化,并更密切地研究风土的真实影响。

建模对风味特征的影响

现在我们准备建立一个模型!眼前的问题是一个多元回归问题:我们希望使用我们的风土、品种和年份数据来预测一个 300 维的葡萄酒嵌入向量。这些葡萄酒嵌入的高维度是一个挑战。我们可以使用主成分分析(PCA)将我们的 300 维输出向量压缩到更低维的空间中。似乎我们葡萄酒嵌入的 70%的变化可以用 41 个维度来解释。因此,这些 41 维的压缩葡萄酒嵌入将是我们多元回归问题中的因变量。这仍然是一个很高的维数,但比我们开始时的 300 维有所提高。

我们将基于数据集中 80%的观察值构建模型,保留 20%作为测试集。SciKit-Learn 中的随机森林回归器本身支持多输出回归,是我们的首选模型。

即使在超参数调整之后,我们的模型在我们的测试集上也只达到了 36 % 的 R 平方值。换句话说:在我们的模型中,风土、葡萄品种和年份可以解释葡萄酒风味差异的三分之一以上。这是否意味着葡萄酒口味的其他三分之二的变化是由其他变量如酿酒风格来解释的?

嗯,可能不会。由于收集当地天气、土壤和海拔数据的不完善,36%很可能是人为的低。这个百分比还基于这样一个假设,即我们能够在我们的葡萄酒嵌入中完全解释葡萄酒的风味特征;这又依赖于专业侍酒师的评估。

尽管有这些警告,似乎风土能够解释一些风味的变化。但是风土的哪些成分最有冲击力?

哪些风土属性最重要?

我们可以使用两种技术来评估特征的重要性:对预测葡萄酒嵌入有最大影响的土壤属性。

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

Feature importance, mean impurity method

首先,我们可以使用平均减少杂质方法来计算特征重要性

从相邻的图表中,我们可以看到年龄似乎有着最大的影响。其次是一些精选的葡萄品种,海拔也有很大贡献。首先出现的土壤属性是 CEC sol _ 0(0cm 深度的阳离子交换容量)和 SLT PPT _ 30(30cm 深度的土壤质地部分粉砂)。看起来最重要的天气属性是秋季第三个月的降水(收获?)和第二个夏季月份的平均最高温度。

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

Feature importance, Shapley value method

作为现实检查,我们将使用第二种技术来评估特性的重要性:Shapley 值。Shapley 值是博弈论中的一个概念,它计算每个特征对整体预测的边际贡献。我们可以对训练数据集中的所有观察结果进行汇总,以评估哪些功能具有最大的影响。

再次,年龄似乎是风味的主要贡献者。CECSOL_0 和 SLTPPT_30 似乎又是起最大作用的土壤因素。突出了海拔的重要性,以及第二个夏季月份的平均最高温度。

了解了哪些土壤变量对风味特征有最大的影响后,让我们更仔细地检查那些有最大明显影响的变量。

海拔高度

在高海拔地区种植的葡萄受制于低海拔地区所没有的独特的条件。白天更多的阳光直射会使葡萄长出更厚的皮,据说这有助于提高浓度和单宁。此外,白天和夜晚之间更大的温度波动允许这些葡萄保留更多的天然酸度。

为了了解海拔如何建立风味特征,我们可以计算低海拔(底部四分位数)葡萄酒与高海拔(顶部四分位数)葡萄酒中描述符的相对频率。两个类别中相对频率差异最大的描述符可以总结为一个词云:

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

虽然我们没有控制葡萄品种,年龄或任何其他与风土相关的变量,但我们可以看到低海拔和高海拔葡萄酒之间的一些有趣的差异。高海拔的葡萄酒似乎比低海拔的葡萄酒表现出更丰富、成熟和浓厚的特征。这可能是他们接受阳光量的结果。“坚定”意味着高水平的单宁和/或酸度,这与高海拔葡萄酒的普遍看法一致。相反,低海拔的葡萄酒似乎透露出更多的红色水果和橡木的味道。有趣的是,这些葡萄酒似乎也更具草本和泥土气息。这可能是葡萄经受较高平均温度的产物。

秋季降水

众所周知,酿酒师担心收获季节的降雨量。如果葡萄吸收水分,这有可能稀释葡萄中的糖分和味道。水也可能粘在葡萄树的叶子和树枝上,无意中与收获的葡萄一起被加工。收获期间过多的降雨也会提高葡萄的 pH 值,降低葡萄酒的酸度。再一次,让我们通过查看我们的相对频率描述词来测试这些理论。

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

“低秋雨”这个词描绘了一幅生动的画面。这些葡萄酒与更多的浓度,丰富和成熟联系在一起。此外,左边单词 cloud 中出现“crisp”似乎表明酸度较高。这似乎与关于晚季降水影响的流行理论相一致。

夏季平均最高气温

夏季第二个月的日平均最高温度似乎对风味特征有显著影响。传统上,高温与较高的酒精含量和较低的酸度联系在一起。

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

在我们的数据中,夏季低温与黑莓和黑醋栗等浆果口味有关。甜味和草本特征似乎在夏季平均温度较低的葡萄酿造的葡萄酒中更为普遍。较高的最高平均温度更多地与樱桃味以及八角和丁香等香料气味联系在一起。

阳离子交换容量

阳离子交换容量(CECSOL)是对土壤保持正电荷阳离子能力的一种度量。具有更高 CECSOL 值的土壤通常具有更高的粘土含量和更大的保持养分的能力。关于 CECSOL 值对葡萄酒风味影响的理论很少。

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

词云中的描述词与葡萄酒颜色高度相关。在左边,我们看到几乎所有与白葡萄酒相关的描述符注释,而右边的词云主要包含红葡萄酒描述符注释。这使得很难挑出与 CECSOL 相关的感官品质。我们可以在未来的研究中重新审视这一点,同时控制葡萄品种。

含泥量

据说,生长在淤泥含量高的土壤中的葡萄能够产出酸度较低的顺滑葡萄酒。淤泥经常与“黄土联系在一起,这是一个更通用的术语,描述由风吹尘埃堆积形成的沉积物。黄土酿出的酒,可以酿造出具有矿物特色的酒。

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

在我们的数据中,低水平的淤泥似乎与更干、更结实和更成熟的葡萄酒相关联。“新鲜”是酸度较高的指标,也似乎与低含量的淤泥有关。这符合关于淤泥和酒的流行思维。高水平的淤泥与更美味的葡萄酒相关,可以被描述为草本或绿色。

结论

模拟风土对葡萄酒的影响是一项具有挑战性的工作。这篇文章的分析开始揭示似乎具有最大影响的风土因素。海拔、土壤类型、降水和温度都有影响。在这些因素中,海拔似乎影响最大。虽然我们表面上已经开始识别与这些风土相关的描述符,但我们才刚刚开始剥洋葱皮。根据年龄和葡萄品种等因素,风土表现可能完全不同。这种分析的下一个好的步骤是关注土壤的细微差别,同时更好地控制这些因素。关于葡萄酒和大自然母亲,还有很多需要学习的地方…

食物和葡萄酒搭配

原文:https://towardsdatascience.com/robosomm-chapter-5-food-and-wine-pairing-7a4a4bb08e9e?source=collection_archive---------20-----------------------

机器人主持人

使用自然语言处理来解包和匹配食物和酒的特征

葡萄酒和食物的搭配是一种黑暗的艺术。最终成就完美搭配的是葡萄酒和食物中酒体、非香气和香气特征之间的微妙平衡。在本文中,我们将使用数据科学技术和流行的葡萄酒/食物配对理论来构建一个葡萄酒配对引擎。你可以在这里和找到所有相关代码的 Jupyter 笔记本。

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

Chicago-style hot dog

为了陪伴我们踏上这段旅程,我们将带上一位可靠而谦逊的朋友:芝加哥风味的热狗。这是大芝加哥地区每一个运动场所的主要美食,通常都配有一杯塑料杯的淡啤酒。RoboSomm 能不能帮我们选一款葡萄酒,让我们用它来享受呢?

提取食物特征

在我们考虑配对之前,我们需要仔细分析热狗的属性。我们如何量化菜肴的非香气和香气特征,以便我们可以根据这些相同的维度来搭配葡萄酒?

我们这里的第一步是训练一个 Word2Vec 模型,为各种不同的食品相关术语生成一个 300 维的单词嵌入。假设我们可以找到一个足够扩展和描述性的文本语料库来训练这个模型,我们将期望这些嵌入能够捕捉到我们食物特征的变化。幸运的是,亚马逊美食数据集正是如此:大约 50 万条关于过多食品的评论。

在训练这个模型之后,我们可以计算热狗的嵌入量。我们将把它分解成单独的成分:热狗、番茄、洋葱、泡菜、调味品、芹菜盐、胡椒和芥末。我们将假设满载的热狗是这些成分的单词嵌入的平均值。

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

Generating normalized non-aroma values for food (illustrated in two dimensions)

为了量化非香味属性,我们将使用经过训练的 Word2Vec 模型来定义非香味(香味、甜味、酸味、咸味、辣味、脂肪和苦味)的嵌入。然后,我们将计算无香味嵌入和一系列示例食品之间的余弦距离,如上面的咸味示例。该距离使用最小最大值定标器在 0 和 1 之间标准化,最小距离是离盐嵌入物最近的食物(培根),最大距离是离盐嵌入物最远的食物(覆盆子)。上图显示了此过程的简化版本。我们可以看到我们的热狗在咸度表上排名很高,数值为 0.9。

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

对每一种非香味物质进行这些步骤,我们就能得到热狗的大致风味。最显著的非香味是咸味。还有明显的酸味,可能是由于调味品、泡菜和胡椒的缘故。热狗也很辣,脂肪和浓郁,但苦味和甜味排名较低。

为我们的葡萄酒提取香味和非香味

为了创造我们的葡萄酒搭配,我们还需要为不同类型的葡萄酒绘制出有香味的和没有香味的。这一过程与 RoboSomm 系列的前一章中采用的方法非常相似,但有几个关键区别。我们从来自 www.winemag.com的大约 150,000 篇专业葡萄酒评论中提取信息,并根据语料库中与葡萄酒相关的术语训练一个 Word2Vec 模型。重要的是,我们区分不同类别的术语,标记每个术语是属于香气还是非香气。下面是一个例子。

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

对于每种葡萄酒,我们可以计算每个类别的平均嵌入量(TF-IDF 加权)。在葡萄酒评论不包含所有属性的信息的情况下,我们在我们的数据集中插入所有葡萄酒的非香气平均嵌入量。

接下来,我们根据葡萄品种和次区域对数据集中的所有葡萄酒进行分组(例如,来自美国华盛顿州瓦拉瓦拉谷的霞多丽)。少于 30 个观察值的任何类型的葡萄酒都被丢弃,因为它们不太可能包含足够的信息来准确地模拟所有属性。

为了减少非香气属性的维数,我们应用了具有一个成分的 PCA。由于非香气类别中的描述符是非常一维的(例如,低单宁与高单宁),我们能够在这一维中捕捉这些属性中的绝大多数变化。产生的标量使用最小最大标量在 0 和 1 之间归一化。

我们留下了一个包含 500 种不同类型葡萄酒的数据集,每种葡萄酒都有一个 300 维的香气向量,一个用于酒体的标量和六个用于其他非香气属性的标量。

葡萄酒和食物搭配

现在是有趣的部分。我们的芝加哥风味热狗可以配什么酒?我们需要具体规定如何搭配食物和酒。我们可以使用一个 5 步骤的过程,这个过程受到奇妙的书葡萄酒愚蠢:万能版:大师指南中列出的葡萄酒配对技巧的启发。

(一)酒的酒体应该大致与食物的酒体相匹配。

(II)排除任何非香气属性与食物中的非香气不协调(不和谐)的葡萄酒。不一致的匹配显示在下面的灰色线条中。

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

Wine Folly flavor pairing chart

(III)用一些经验法则排除搭配不好的酒(酒应该比食物更酸,酒应该比食物更甜,苦酒不要和苦食物搭配)。

(IV)识别哪些配对是全等的或对比的。一致的搭配具有强烈的非香味,这也可以在食物中找到。对比搭配有强烈的非香味,与食物中的非香味和谐搭配。这些匹配在上图中用蓝线表示。消除任何不一致或对比的配对。

(V)根据葡萄酒香气嵌入物与食物嵌入物的接近程度对剩余的葡萄酒进行排序。这确保了食物与具有相似微妙风味的葡萄酒相匹配。

结果

那么,我们的芝加哥风味热狗要喝点什么?RoboSomm 给了我们四点建议:

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

搭配建议非常多样,从新西兰的黑比诺到加州内陆山谷的霞多丽。所有的搭配都有很好的酸度来匹配调味品、泡菜和胡椒的酸味。夏敦埃酒的油腻反映了食物的油腻。搭配中等至浓郁,与热狗的主体相匹配。推动这种搭配的互补的葡萄酒香气是胡椒、烟和香料;热狗的香肠中体现的味道。

让我们带着机器人再转一圈。一种非常不同的食物怎么样,比如一道美味的开胃菜,有黄瓜、熏鲑鱼、酸奶油和莳萝?

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

Smoked Salmon Cucumber Bites

这与我们的热狗有所不同,鲑鱼和酸奶油的脂肪含量更高。由于鱼肉和黄瓜的影响,酒体变得稍淡,但由于酸奶油的存在,酒体仍然适中。

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

太棒了。我们有几种白葡萄酒可供选择。葡萄酒有大量的酸来补充食物的新鲜度,并且都表现出一些盐份来搭配熏鲑鱼。阿尔萨斯混合白葡萄酒和以色列霞多丽葡萄酒中的柠檬香味与黄瓜和鲑鱼非常相配,而长相思和新西兰比诺葡萄酒中的草药味突出了我们食物中的莳萝。

没有甜点,我们的饭就不完整。让我们看看什么酒可以配一片漂亮的桃子派。

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

Lattice-Top Peach Pie

到目前为止,桃子派与我们测试过的食物相比,具有非常不同的非香味特征,有大量的甜味和脂肪,还有一些来自水果的酸味。

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

葡萄酒建议是全等的搭配,反映了我们食物的甜味和桃子的酸味。爱达荷雷司令似乎是其浓郁的树果香味和活泼的酸度的绝佳搭配。其他建议也有强烈的甜味,伴随着桃子的香味来反映食物。

结论

RoboSomm 能够仅使用基于自然语言的技术产生相当合理的葡萄酒搭配建议。这种产生搭配的新方法很有前途,并为葡萄酒与食物搭配的更多开箱即用方式打开了大门。

现在,让我们为芝加哥风味的热狗举杯(黑皮诺、梅洛或霞多丽)。

(机器人)数据科学家即服务

原文:https://towardsdatascience.com/robot-data-scientists-as-a-service-80224f5e928a?source=collection_archive---------7-----------------------

用符号回归和概率规划自动化数据科学。

如何成为懒惰的(数据)科学家并从此快乐地生活

早起的人不会取得进步。它是由懒惰的人试图找到更简单的方法来做某事而制造的。”海因莱茵

答根据预测机器的福音,近年来的人工智能革命主要意味着一件事:预测的经济成本正在迅速降低,因为图书馆、云服务和大数据对从业者、初创公司和企业来说变得广泛可用。

虽然这个故事作为人工智能采用前景的“大图”当然很有吸引力,但从地面上看,几个行业中应用人工智能/机器学习/数据科学(选择你最喜欢的流行语)的现实是非常不同的。

虽然如今数字数据集确实比以前更容易获得,但现实生活中的用例仍然需要高技能的工作人员利用时间和知识以有意义的方式解释数据模式。以下图表显示了收入数据与云支出的关系:

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

Revenue data on the y-axis, as a function of cloud expenses on the x-axis (data points are machine generated, but they could easily come from any of our clients or many of our startup peers).

如果企业需要提前计划并最终确定预算,准确理解收入和费用之间的关系显然是一个非常重要的话题。怎么才能做到呢?

好吧,一个选择是让你的数据科学家看一看数据并建立一个解释模型;这通常是可行的,但显然这只是企业感兴趣的众多变量中的两个——那些在数据湖中徘徊的我们尚不了解的变量呢?换句话说,数据科学家是伟大的(一个真正无偏的估计!)但它们不一定成规模:在企业内部,即使是制作“探索性分析”也仍然是大量的工作。

第二个选择是去掉所有花哨的东西,只用一个模型来解决所有问题:对于线性回归的人来说,一切看起来都像一个斜坡。这非常方便,并且是市场上几种基于人工智能的解决方案中使用的一种值得尊敬的策略:

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

“Automated data science” often just means pre-defined models for widgets in your dashboard (excerpt from a real industry white paper).

然而,第二种方法的问题是显而易见的:并不是所有的东西都是直线,这意味着一些“见解”可能是噪音,一些模式将无法被发现;换句话说,一种模式并不也不适合所有人。

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

Revenues vs cloud expenditure again. Not everything is a straight line, as the best fit here is a 2nd degree polynomial — the ROI for our (imaginary) infrastructure scale very well!

我们不能做得更好吗?我们认为我们可以:如果我们可以写一个程序,然后其他程序来为我们分析这些变量,会怎么样?

虽然我们的客户使用的完整解决方案已经超出了这篇文章的范围,但是我们将展示如何结合概率编程和符号回归的思想来构建一个强大的元程序,它将为我们编写有用的代码(你可以在这里运行为这篇文章编写的代码)。

正如智者所说,任何足够先进的技术都无法从埃隆马斯克的推特中分辨出来。

符号回归入门

" 94.7%的统计数据都是由编造的."—匿名数据科学家

我们将用不超过三分钟的时间用一个简单的例子介绍符号回归之外的直觉(熟悉它的读者——或者只是对讨厌的细节不感兴趣——可以放心地跳到下一节)。

考虑下面的 X-Y 图:

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

The familiar image of a scatterplot: what is the relation between X and Y?

看着这些数据,我们可以拿出笔和纸,开始对 X 和 Y 之间的关系进行一些合理的猜测(甚至仅仅局限于简单的多项式选项):

Y = bX + a (linear)
Y = cX^2 + bX + a (quadratic)

我们衡量什么是最好的,并利用我们所学到的来产生更好的估计:

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

Comparing two hypotheses: R-squared is 0.65 and 0.74 respectively.

似乎我们可以尝试更高次的多项式来实现更好的拟合:

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

R-squared for a third-degree polynomial is 0.99 (it looks like overfitting but we swear it’s not).

这听起来是个合理的策略,不是吗?

简而言之,符号回归是我们手动做的事情的自动化版本,只有很少的函数和两个“代”。

那就是:

  1. 从一系列适合手头数据集的函数开始;
  2. 衡量他们做得有多好;
  3. 拿那些表现最好的去换,看看你能不能让它们变得更好;
  4. 重复 N 代,直到满意。

即使是这个玩具例子,很明显,通过智能地探索可能的数学函数空间来拟合数据模式具有有趣的优点:

  • 我们不必一开始就指定很多假设,因为过程会进化出越来越好的候选者;
  • 结果很容易解释(因为我们可以产生诸如“增加 a X 将导致增加 b Y”的见解),这意味着新知识可以在所有业务部门之间共享。

作为一个缺点,评估大量的数学表达式可能会很耗时——但这对我们来说不是问题:我们的机器人可以在晚上工作,并在第二天为我们提供预测(这就是机器人的作用,对吗?).

对于我们的目的来说,关键的观察是,在模型表达能力、智能探索和数据拟合之间存在一种基本的权衡:可能解释数据的数学关系空间是无限的——虽然复杂的模型更强大,但它们也容易过度拟合,因此,在简单的模型失败后,应该考虑这些模型。

既然关系是用数学的语言来表达的,为什么我们不利用形式语法的自然组合性和表达性来导航这种权衡呢(是的,在也是如此我们做爱语言)?

这就是我们将符号回归的直觉——自动进化模型以获得更好的解释——与 概率编程 的生成能力相结合的地方。由于模型可以表示为特定领域的语言,我们的回归任务可以被认为是"贝叶斯程序合成"的一个特殊实例:一个通用程序如何编写特定的"程序"(即数学表达式)来令人满意地分析看不见的数据集?

在下一节中,我们将构建一种表达函数的最小形式语言,并展示语言结构上的操作如何转化为有效探索数学假设的无限空间的模型(忠实的读者可能还记得,我们以类似的方式解决了在之前的帖子中介绍的“序列游戏”)。换句话说,现在是时候建立我们的机器人大军了。

加分技术点:符号回归通常以遗传编程为主要优化技术;一群函数被随机初始化,然后算法适应度决定群体向非常适合手头问题的表达式进化。我们为这篇文章选择了一种概率编程方法,因为它与最近关于概念学习的一些工作非常吻合,并且让我们直接在浏览器中分享一些工作代码(彻底的比较超出了这篇文章的范围;更多对比和彩色图,见文末附录;在校对文章时,我们还发现了这种非常新且非常有趣的“神经引导”方法。对遗传编程感兴趣的非懒惰和 Pythonic 读者会发现 gplearn 令人愉快:Jan Krepl 的 data science-y 教程是一个很好的起点。]

打造一个机器人科学家

“除了黑艺术,只有自动化和机械化。”洛尔卡

正如我们在上一节中看到的,符号回归的挑战是我们需要考虑的巨大可能性空间,以确保我们在拟合目标数据集方面做得很好。

构建我们的机器人科学家的关键直觉是,我们可以在这个无限的假设空间中强加一个熟悉的“语言”结构,并让这一先验知识指导候选模型的自动探索。

我们首先为我们的自动化回归任务创建一种小型语言,从我们可能支持的一些原子操作开始:

unary predicates = [log, round, sqrt]
binary predicates = [add, sub, mul, div]

假设我们可以选择变量(x 0 ,x 1, … x n )、整数和浮点数作为我们的“名词”, L 可以生成如下表达式:

add(1, mul(x0, 2.5))

完全等同于更熟悉的:

Y = X * 2.5 + 1

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

Plotting the familiar mathematical expression “Y = X * 2.5 + 1”

【我们跳过语言生成代码,因为我们在别处讨论了生成语言模型。从概率编程的角度来看科学问题的概观,从奇妙的 ProbMods 网站开始。]

由于我们不能直接将一个先验置于一组无限的假设之上,我们将利用语言结构来为我们做到这一点。因为生成线性表达式需要较少的(概率)选择:

add(1, mul(x0, 2.5))

与二次表达式相比:

add(add(1, mul(x0, 2.5)), mul(mul(x0, x0), 1.0)))

第一种是在观察之前的更可能的假设(即,我们在奥卡姆剃刀的精神中获得一个优先支持简单性的假设)。

A simple WebPPL snippet generating mathematical expressions probabilistically.

我们需要的最后一个细节是如何衡量我们的候选表达式的性能:当然,在数据点之前,线性表达式比二次更有可能,但是我们通过观察能学到什么呢?由于我们将我们的任务框定为贝叶斯推理,贝叶斯定理建议我们需要定义一个似然函数*,如果潜在假设为真(后验 ~= 先验+似然),它将告诉我们获得数据点的概率。例如,考虑以下三个数据集:*

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

Three synthetic datasets to test likelihood without informative prior beliefs.

它们是通过向以下函数添加噪声而生成的:

f(x) = 4 + 0 * x (constant)
f(x) = x * 2.5 (linear)
f(x) = 2^x (exp)

我们可以利用 WebPPL 中的observe 模式探索(没有信息先验)可能性如何影响推理,预先知道生成数据的数学表达式是什么。

A simple WebPPL snippet to test the likelihood of some generating functions against synthetic data.

从下面的图表中可以清楚地看出,在只有 25 个数据点的情况下,可能的数学表达式的概率分布非常集中在正确的值上(还要注意,常数参数在真实值 4 上分布很窄,对于指数的例子也是如此)。

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

Original data (N=25), probability distribution over expressions, parameter estimation for the CONSTANT and EXP example (original data from WebPPL exported and re-plotted with Python).

然后,结合(基于语言的)先验和可能性,我们最终的机器人科学家被组装起来(如果你对一个小而粗糙的程序感兴趣,不要忘记运行这里的片段)。

现在让我们看看我们的机器人能做什么。

让我们的机器人科学家投入工作

“人类让我兴奋。”—匿名机器人

现在我们可以创造机器人科学家,是时候看看他们能在一些有趣的数据模式上做些什么了。下面的图表显示了用数学表达式的简单语言构建的数据集(如上所述),显示了每种情况下的:

  • 具有目标数据点的散点图;
  • 生成数学表达式(即真理);
  • 被机器人科学家选为最有可能解释数据的的表达式(请注意,在运行代码时,您可能会得到不同但在外延上等价的表达式的几个条目,如x * 44 * x)。

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

Four synthetic datasets (left), the underlying generator function (center, in red), and the best candidate according to the robot scientist (right, in blue).

结果相当令人鼓舞,因为机器人科学家总是对测试数据集中与 X 和 Y 相关的潜在数学函数做出非常合理的猜测。

作为画龙点睛之笔,只需要多几行代码和一些标签,就可以用简单的英语添加一个很好的调查结果摘要,以便下面的数据分析:

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

From data analysis to an English summary: we report model predictions at different percentiles since the underlying function may be (as in this case) non-linear.

会自动总结为:

According to the model '(4 ** x)':

At perc. 0.25, an increase of 1 in cloud expenditure leads to an increase of 735.6 in revenuesAt perc. 0.5, an increase of 1 in cloud expenditure leads to an increase of 9984.8 in revenuesAt perc. 0.75, an increase of 1 in cloud expenditure leads to an increase of 79410.5 in revenues

Going from model selection to explanations in plain English is fairly straightforward (original here).

还不错吧。看起来我们的数据科学团队终于可以休息一下,在机器人为他们工作的同时,去享受他们应得的假期了!

当不懒惰的读者更多地摆弄代码片段并发现这些机器人 1.0 版可能出错的各种事情时,我们将回到我们的企业用例,并就如何在现实世界中利用这些工具做一些临别笔记。

下一步:跨企业数据扩展预测

“简单的事实是,当人类和机器作为盟友而不是对手一起工作,以利用彼此的互补优势时,公司可以实现最大的业绩提升。”多赫蒂

让我们回到我们的预测问题:我们有关于云服务如何影响我们公司收入的数据,我们希望从中学习一些有用的东西。

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

Our X-Y chart: what can we learn from it?

当然,我们可以尝试使用为这个问题设计的机器学习工具*;如果我们相信深度学习的宣传,那么在整合,对未知数据集的推广和解释方面,这有明显的缺点。我们可以尝试部署内部资源,如数据科学家,但在投资回报时间和机会成本方面会有负面影响。最后,我们可以尝试优先考虑速度,运行一个简单的一刀切模型,牺牲准确性和预测能力。*

在这篇文章中,我们概述了一条非常不同的路径来应对挑战:通过将统计工具与概率编程相结合,我们获得了一个足够通用的工具来在各种设置中产生可解释的精确的模型。我们从自动化人工智能中获得了最佳效果,同时保持了数据科学的良好部分——可解释的结果和建模灵活性。

从科学的角度来看,以上显然只是如何跳出框框思考的初步草图:当从 POC 转向成熟的产品时,一个自然的扩展是在特定于领域的语言中包含高斯过程(并且,一般来说,利用我们所知道的关于贝叶斯程序综合的所有好的东西,本着例如优秀的 萨阿德 的精神)。

就产品而言,我们为价值数十亿美元的公司部署这些解决方案的经验既具有挑战性,也是有益的(正如企业经常做的那样)。他们中的一些人起初持怀疑态度,因为他们被大型云提供商今天作为“自动化人工智能”大力营销的预制解决方案所困扰——事实证明,这些工具除了最简单的问题之外什么也不能解决,仍然需要时间/学习/部署等方面的重要资源…但最终,他们都接受了我们“程序合成”的过程和结果:从自动预测到数据重构,客户喜欢教学机器的“交互式”体验,并通过类似人类的概念与它们合作;结果很容易解释,通过无服务器微服务大规模实现了大规模自动化(关于我们的 WebPPL 无服务器模板,请参见我们的专用帖子,代码为)。

在 Tooso,我们确实相信近期的人工智能市场属于能够实现人类和机器之间协作的产品,这样各方都可以做自己最擅长的事情:机器可以在数据湖中做定量的跑腿工作,并为进一步分析提供最有希望的路径;人类可以对选定的问题进行高级推理,并向算法提供反馈,以良性循环的方式产生越来越多的见解和数据意识。

总而言之,尽管梦想邪恶的机器人军队很有趣(是的埃隆,又是你),但未来仍有很多肯定需要我们

再见,太空牛仔

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

如果你有问题或反馈,请将你的人工智能故事分享给jacopo . taglia bue @ tooso . ai

别忘了在领英、推特Instagram 上关注我们。

附录:比较回归模型

让我们考虑一个稍微复杂一点的数据集,其中我们的目标变量 Y 在某种程度上依赖于 X 和 Z:

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

Y depends on both X and Z: what is the exact relation between them (we plotted the “true surface” as a visual aid)?

为了以一种相当直接、非参数化的方式拟合数据,我们从一些经过战斗考验的决策树回归器开始:决策树可能不会让你谈 NIPS,但是它们非常健壮,并且在实践中被广泛采用,所以从那里开始是有意义的:

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

Fitting a decision tree to our dataset: good but not great.

定性的(结果表面的形状,有点“块状”)和定量的(R 平方= 0.84)结果都很好,但并不例外。

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

Fitting symbolic regression to our dataset: much better!

符号回归产生了更平滑的表面和更好的定量拟合,以及更好的样本外数据预测;此外,系统的输出很容易解释,因为它是一个标准表达式:

sub(add(-0.999, X1), mul(sub(X1, X0), add(X0, X1)))

那就是:

Y = (−0.999 + Z) − ((Z−X) * (X+Z))

(关于更长的讨论,请参见来自 gplearn精彩文档)。

基于图像分割的机器人行走路径

原文:https://towardsdatascience.com/robot-following-a-walkway-using-image-segmentation-272bebd93a83?source=collection_archive---------34-----------------------

在我之前的故事中,我正在教一只覆盆子驱动的机器人坦克自己在人行道上导航。瓶颈是道路识别——我通过 OpenCV 使用了一种简单的颜色过滤方法,结果并不可靠。

一般来说,这是一个图像分割的任务。有一篇的好文章描述了最流行的方法。它们很简单,通常不会在现实生活的照片上产生完美的效果。和我基于颜色的实现一样。

为了寻找改进的方法,我决定使用语义分割。神经网络只是在最近才被用于这项任务,但已经展示了令人印象深刻的结果。来自 PyImageSearch 的这篇很棒的文章给了我灵感,并将我从理论推向了实践。本文介绍了用 E-net 神经网络进行图像分割。

原来,E 网是比较年轻,不知名的网络。它是基于更著名的 U-net 架构的成功而开发的。

优信网

U-net 是第一个也是最著名的用于语义分割的神经网络。最初它是为德国的医疗需要而开发的。原始文档在这里可用。

人们很快发现这种方法可以用于比 x 光阅读更广泛的用途。有一些关于如何训练和使用 U-net 在城市图像上进行道路分割的文章:

有很多有趣的和新的信息,但我正在寻找一个现成的网络来使用我的坦克了。不幸的是,搜索没有很快产生结果。

所以转回到 E-net。

电子网络

E-net 是基于 U-net 产生的想法。根据来源,它最初是为城市图像分割而设计的。一些开放数据集用于在道路场景上进行训练:

剑桥街道数据集又名 CamVid

德国和瑞士街道数据集又名城市景观

有一篇关于 E-net 的介绍性文章。

如果有人想深入了解,这里有一份关于如何训练和使用 E-net 网络的详细文件。我认为这是一个强制性的步骤——根据自己的需要和要求定制网络。

但是我太兴奋了,不能马上得到结果,决定使用上面提到的来自 PyImageSearch 的现成网络。

运行电子网络

到目前为止,我的目标是只识别人行道,而不是网络训练检测的 20 类物体。为此,我用颜色编辑了文件,忽略了除道路以外的所有类。

然后从文件系统中读取模型:

def load_segment_model():
    try:
        classes = None
        with open(PiConf.SEGMENT_CLASSES) as f:
            classes = f.read().strip().split("\n")
        colors = None
        with open(PiConf.SEGMENT_COLORS) as f:
            colors= f.read().strip().split("\n")
        colors = [np.array(c.split(",")).astype("int") for c in colors]
        colors = np.array(colors, dtype="uint8")
        print("[INFO] loading model...")
        net = cv2.dnn.readNet(PiConf.SEGMENT_MODEL)
        return net, classes, colors
    except Exception as e:
        logging.exception("Cannot load segment model")
    return None, None, None

进行细分:

def segment_image(image_path, seg_net, seg_classes, seg_colors): image0 = cv2.imread(image_path)
    image = cv2.resize(image0, (1024, 512), interpolation=cv2.INTER_NEAREST)
    blob = cv2.dnn.blobFromImage(image, 1 / 255.0, (1024, 512), 0, swapRB=True, crop=False) seg_net.setInput(blob)
    start = time.time()
    output = seg_net.forward()
    end = time.time() print("[INFO] inference took {:.4f} seconds".format(end - start)) (numClasses, height, width) = output.shape[1:4] classMap = np.argmax(output[0], axis=0) mask = seg_colors[classMap] mask = cv2.resize(mask, (image0.shape[1], image0.shape[0]), interpolation=cv2.INTER_NEAREST)
    classMap = cv2.resize(classMap, (image0.shape[1], image0.shape[0]), interpolation=cv2.INTER_NEAREST) gmask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
    gmask = cv2.resize(gmask, (128, 64), interpolation=cv2.INTER_NEAREST)
    gmask = gmask[0:64,32:96] output = ((0.6 * image0) + (0.4 * mask)).astype("uint8")       
    return output, gmask

第一个问题出现在代码中,它是输入图像的尺寸。该网络在相当大的 1024x512 图像上进行训练。为了节省处理资源,我的树莓相机设置为 320x240。

分段测试

代码移植后,是时候处理坦克已经在人行道上拍摄的照片了。

首次测试

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

只能认出走道的左边部分。

缩小图片并将其中心切割为 64x64(此遮罩由另一个神经网络决定方向)。

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

方向网络(它是一个 3 级分类器)命令向左行驶。不是最好的决定,但可以忍受。

第二次测试

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

类似的情况,右下角又不识别了。大概是湿漉漉的表面把网络搞糊涂了。但是道路的最大部分被正确识别。面具看起来很一致:

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

而方向网决定往前走。

第三次测试

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

这是一个失败的状态——机器人位于人行道中间,需要向右走。

这条路几乎完全被认出来了。

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

方向分类器命令向右。就是这样。

因此,道路识别的结果要比旧实现中简单的颜色过滤好得多。让我们在真正的坦克上运行它。

在覆盆子馅饼上奔跑

不幸的是,注意到的输入图像大小立刻引起了问题。覆盆子太慢了,无法处理这么大的图像。一次分割大约需要 6 秒钟,这对于实时车辆来说是不可接受的。神经网络工作得很好,但当它工作时,坦克偏离了道路。

所以唯一的解决方案是用更小的图片来训练我自己的电子网络。

此外,使用外部电源进行分割也可能是一个好主意,例如英特尔神经计算机棒或类似产品。

最后一幅图表明,即使是道路决策也是有效的,因为它们做得太晚了。

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

链接

基于 OpenCV 和 Tensorflow 的机器人行走

原文:https://towardsdatascience.com/robot-following-a-walkway-with-opencv-and-tensorflow-a631eb72cb8c?source=collection_archive---------13-----------------------

如何用树莓 Pi,计算机视觉,卷积神经网络制作自动驾驶机器人?

我的机器人学会了如何跟随一条线之后,一个新的挑战出现了。我决定走到户外,让机器人沿着人行道移动。如果机器人像狗一样跟着主人穿过公园就好了。

行为克隆给出了实现思路。当人工智能学习提供的行为输入和输出,然后对新的输入做出决定时,这是自动驾驶汽车非常受欢迎的方法。有一篇来自 Nvidia 的文章介绍了这种方法。

许多好文章都在描述这种想法:

更令人兴奋的实现是在现实生活中。最好的例子就是 DonkeyCar 和它的神经网络

不幸的是,一种天真的方法——在彩色照片上训练神经网络——没有成功。秋天的公园照片大多是灰色的,所以对调整大小和模糊的照片进行训练的神经网络没有提供可靠的结果。

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

为了简化人工智能的任务,我决定用计算机视觉技术对图像进行预处理。OpenCV 库有许多功能,当我需要检测地板上的白线时,它工作得很好。

这项任务结果并不容易。照片大部分是灰色的,主要问题是“哪种灰色是走道的颜色”。观察发现,人行道就像“完美的灰色”——其 RGB 值之间的差异极小。

亮度是另一个标准。很难自动确定走道的亮度,所以第一张图片用于调整颜色参数。然后根据参数进行颜色过滤,我们得到了一个带有人行道轮廓的蒙版。

轮廓的形状不精确,并且取决于颜色过滤参数。

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

下一步是根据走道遮罩做出决定(直走还是左转/右转)。分类的总体思路是查看人行道的右侧边缘:如果边缘更靠左,那么我们需要向左转向。如果没有边缘——向右转向。如果边缘从右下角以一个适中的角度向上——什么也不做,只是开车。

考虑到模糊的斑点形状,仅使用几何图形很难识别边缘特征。然后我依靠神经网络来寻找模式。所以我把走道面具放在三个不同的文件夹里,并在上面训练 NN。

左、右和直遮罩的示例:

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

从机器学习的角度来说,这是一个具有三类的图像分类任务。灰度图像是理想的输入数据,因此即使是最简单的卷积网络也能显示出出色的结果。我用 Keras over Tensorflow 来教网。

model = Sequential()activation = "relu"model.add(Conv2D(20, 5, padding="same", input_shape=input_shape))
    model.add(Activation(activation))
    model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))model.add(Conv2D(50, 5, padding="same"))
    model.add(Activation(activation))
    model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))model.add(Flatten())
    model.add(Dense(500))
    model.add(Activation(activation))model.add(Dense(cls_n))opt = SGD(lr=0.01)model.add(Activation("softmax"))model.compile(loss="categorical_crossentropy", optimizer=opt,       metrics=["accuracy"])

下一个挑战是在 Raspberry Pi 上运行一切。

我用的是旧 Tensorflow 的 Raspbian 8 Jessie,由 Sam Abrahams 和 OpenCV 3.4 构建(我必须自己构建)。该版本的 Tensorflow 相当旧,无法与 Keras 模型一起工作。

好在最近 Google 支持了 Tensorflow 的 Raspberry Pi,但是需要 Raspbian 9 Stretch 和 python 3。所以我不得不把所有的机器人固件都移植到新的平台上。OpenCV 也是在那一年开发的,我必须构建 OpenCV 4.0。

把一切放在一起——机器人正在公园里散步。

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

结论

最难的是认路。没有台词使这项任务变得困难。识别参数必须根据光线和当地条件进行调整。但是灰度掩模是完美的材料,即使是简单的 CNN 也能得到可预测的结果。

链接

GitHub repo 与 python 上的完整坦克固件

神经网络的数据和代码

为 Raspbian 预建 OpenCV deb 包

油箱装配说明

关于坦克的更多信息

机器人坦克与树莓派和英特尔神经计算机棒 2

原文:https://towardsdatascience.com/robot-tank-with-raspberry-pi-and-intel-neural-computer-stick-2-77263ca7a1c7?source=collection_archive---------18-----------------------

我之前的文章中,我通过 OpenCV-DNN 和 Enet 做了一个道路图像分割。

这个实验因为性能而失败:分割过程对 Raspberry 来说太重了。

有两种方法可以解决这个问题:

  • 教 Enet 将更小的图片,希望它会更快
  • 在一些硬件上运行神经网络的分段

第二个想法似乎更有趣,在我得到英特尔神经计算机棒 2 的几天后。

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

它相当大,不容易将模块放入机器人布局中。

由于大小,它不适合树莓较低的 USB 插槽。考虑到左边的插槽在相机支架后面,因此不可用,唯一的方法是将 NCS 插入右上角的插槽。GPS 模块已经在那里,所以它用一根电缆延长,并移动到右下方的插槽。

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

英特尔 NCS

英特尔最近发布了他们的神经计算棒的第二个版本,新的 API 被证明与上一个版本不兼容。

新的 API 叫做 Open Vino,包括 OpenCV 和一些神经网络工具。

有一些关于 NCS2 和 Open Vino 框架的介绍性文章:

开始与 NCS 合作很容易。英特尔支持 Raspbian 开箱即用,所以安装没有问题。

结果是 NCS 只支持它自己的神经网络格式。Open Vino 包含一个工具模型优化器来转换一些格式。一些支持的选项有— Caffe、Tensorflow、PyTorch 等。

此外,英特尔还在一个专门的模型动物园中为不同的应用提供了一组预训练模型。

语义分割有两种模型:

不幸的是,高级模型无法在 NCS 上运行。

网络控制系统中的神经网络

在 NCS 上运行神经网络推理有几个步骤。

初始化设备

设备名“MYRIAD”,单词“plugin”和加载库的路径——看起来像是旧时代的产物。

from openvino.inference_engine import IENetwork, IEPlugin ncs_plugin = IEPlugin(device="MYRIAD", plugin_dirs = "/opt/intel/openvino/inference_engine/lib/armv7l")

负载模型

然后我们需要将神经网络模型加载到设备中。

这是一项繁重的工作。我使用的小模型加载时间大约为 15 秒。

好消息是只需要做一次。

model = IENetwork(model=xml_path, weights=bin_path)         
net = ncs_plugin.load(network=model)

运行推理

然后我们可以进行推理,得到一个输出张量。

input_blob = next(iter(model.inputs))     
out_blob = next(iter(model.outputs))     
n, c, h, w = model.inputs[input_blob].shape     
images = np.ndarray(shape=(n, c, h, w))     
images[0] = image     
res = net.infer(inputs={input_blob: images})     
res = res[out_blob]

单一过程问题

突然间,使用来自两个不同过程的 NCS 变得不可能了。

模型加载会产生错误:

E: [ncAPI] [    684447] resetAll:348     Failed to connect to stalled device, rc: X_LINK_ERROR 
E: [ncAPI] [    691700] ncDeviceOpen:672        Failed to find suitable device, rc: X_LINK_DEVICE_NOT_FOUND 
Traceback (most recent call last):     
net = ncs_plugin.load(network=model)   
File "ie_api.pyx", line 395, in openvino.inference_engine.ie_api.IEPlugin.load   
File "ie_api.pyx", line 406, in openvino.inference_engine.ie_api.IEPlugin.load 
RuntimeError: Can not init USB device: NC_ERROR

英特尔支持论坛搜索发现了类似的问题。该主题引用了文档,其中明确指出:

单个设备不能跨多个进程共享。

基于开放 Vino 的图像分割

Open Vino 已经包含了一个现成的语义分割和样本模型。

这个模型的效果不如 Enet 的好,但也不差。

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

反正 Enet 的这个实现是老 Torch 格式的,Open Vino Model Optimizer 不支持。

对了,开 Vino 模型不开——还有人,不过建议用一个类似 PyTorch 的模型和调音。

性能比赛:NCS+open vino segmentation vs Raspberry+Enet NCS 以极大优势获胜:0.8 秒 vs 6。

方向决策

坦克(又名 PiTanq)使用图像分类器来决定走哪条路:左,右或直。详情见专用文章

分类网络已经用 Keras 进行了训练,并且用 Tensorflow 处理 Raspberry 有一个针对 Keras 格式的适配器)。

该模型非常简单,即使在 Raspberry 上也显示出良好的性能:每张图像 0.35 秒。

但是,有了 NCS,我们可以期待一些性能提升。所以,我们需要在 NCS 上运行一个 Keras 模型。Open Vino 支持很多不同的 NN 格式,有 Tensorflow,但是没有 Keras。

将 Keras 转换为 TF 是一项常见的任务,并且有许多可用的资源。我用了这本指南

同一作者还有另一篇文章讲述了如何在 NCS 上运行 Keras 的所有步骤。

此外,英特尔还为此案例提供了文档

最后,我得到了基于所有来源的代码:

import tensorflow as tf
from tensorflow.python.framework.graph_util import convert_variables_to_constantsfrom keras import backend as K
from keras.models import load_model
from keras.models import model_from_jsondef load_keras_model(json_file, model_file):
    jf = open(json_file, 'r')
    loaded_model_json = jf.read()
    jf.close()
    loaded_model = model_from_json(loaded_model_json)
    loaded_model.load_weights(model_file)
    return loaded_modeldef freeze_session(session, keep_var_names=None, output_names=None,     clear_devices=True):
    graph = session.graph
    with graph.as_default():
        freeze_var_names = list(set(v.op.name for v in tf.global_variables()).difference(keep_var_names or []))
        output_names = output_names or []
        output_names += [v.op.name for v in tf.global_variables()]
        input_graph_def = graph.as_graph_def()
        if clear_devices:
            for node in input_graph_def.node:
                node.device = ""
        frozen_graph = convert_variables_to_constants(session,    input_graph_def, output_names, freeze_var_names)
        return frozen_graphmodel = load_keras_model('./model.json', './model.h5')
frozen_graph = freeze_session(K.get_session(),
                              output_names=[out.op.name for out in model.outputs])tf.train.write_graph(frozen_graph, ".", "ktf_model.pb", as_text=False)

同样的代码在 GitHub 上也有。

现在我们有了一个 TF 模型,然后通过模型优化器将其转换为 Open Vino:

python mo_tf.py --input_model "model/ktf_model.pb" --log_level=DEBUG -b1 --data_type FP16

基准测试显示了显著的差异:每幅图像 0.007 秒(而不是 0.35 秒)。

所有车型(Keras,TF,Open Vino)都在 GitHub 上。

物体检测

物体探测任务是机器人的另一个特点。它是用 OpenCV-DNN 和移动 SSD 模型实现的。

英特尔模型动物园包含许多基于移动 SSD 的窄特异性检测器,但整个模型缺失。

但在兼容 Tensorflow 模型列表中有提及。

利用之前网络转换的经验我们生成 MobileSSD 2018_01_28 的开放 Vino 模型。

有趣的是,如果你试图用 OpenCV-DNN 打开这个版本的 MobileSSD,它会失败:

cv2.error: OpenCV(4.1.0-openvino) /home/jenkins/workspace/OpenCV/OpenVINO/build/opencv/modules/dnn/src/tensorflow/tf_importer.cpp:530:  error: (-2:Unspecified error) Const input blob for weights not found in function 'getConstBlob'

但是当我们尝试转换 OpenCV 兼容版本 MobileSSD-11_06_2017 时,转换也失败:

[E0919 main.py:317] Unexpected exception happened during extracting attributes for node FeatureExtractor/MobilenetV1/Conv2d_13_pointwise_1_Conv2d_2_1x1_256/Relu6\. Original exception message: operands could not be broadcast together with remapped shapes [original->remapped]: (0,) and  requested shape (1,0,10,256)

到目前为止,如果我们想同时使用开放 Vino 和 OpenCV-DNN 方法,我们需要两个不同版本的 MobileSSD。

Open Vino 赢得基准:0.1 秒对 1.7 秒。

MobileSSD 的新版本看起来不如以前的版本稳定:

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

图像分类

PiTanq 的另一个能力是用 Imagenet 上的 Tensorflow 和 Inception 对图像进行分类。

坦克在《盗梦空间》中使用了一个相当老的版本——2015 年 12 月 5 日。从那时起有足够的时间,现在《盗梦空间》有四个版本!

好消息是它们都是由 Open Vino 支持的。

上图中的旧版本指标是:

  • 笔记本电脑,笔记本电脑 62%
  • 笔记本电脑,笔记本电脑 11%
  • 13 秒
  • 猫在哪里?

在 NCS 上运行分类器:

  • 笔记本电脑,笔记本电脑 85%
  • 笔记本电脑,笔记本电脑 8%
  • 0.2 秒
  • 还是没有猫

结论

所有使用 Tensorflow 和 OpenCV-DNN 的神经网络的场景都被 NCS 取代。

这意味着 Tensorflow 可以退出董事会了。说实话,这个框架对树莓来说太重了。

NCS 的性能允许更广泛地使用神经网络。例如,利用实时对象检测来流式传输视频,或者应用实例分割。

单进程的限制是有限的,但是有一种方法可以通过一个专用的服务来包装 NCS。

链接

基于图网络的机器人控制

原文:https://towardsdatascience.com/robotic-control-with-graph-networks-f1b8d22b8c86?source=collection_archive---------8-----------------------

内部 AI

利用关系归纳偏差提高概括和控制

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

source

正如任何对技术感兴趣的人无疑都知道的那样,机器学习正在帮助改变不同行业的许多领域。在过去的几年里,由于深度学习算法,计算机视觉和自然语言处理等事情发生了巨大的变化,这种变化的影响正在渗透到我们的日常生活中。人工智能预计将带来巨大变化的领域之一是机器人领域。几十年前,科幻作家设想由人工智能驱动的机器人与人类社会互动,或者帮助解决人类的问题,或者试图毁灭人类。我们的现实与此相去甚远,我们今天明白,创造智能机器人是一个比当年预想的更艰巨的挑战。机器人必须感知世界并理解它们的环境,它们必须思考它们的目标和如何实现它们,并使用它们的驱动装置执行它们的计划。

当我们人类想到从桌子上拿起一杯水时,我们可能会对我们的手行进的轨迹有一个大致的想法,但为了实际做到这一点,我们的大脑需要通过神经系统发送一个非常长而复杂的电信号序列,以引起肌肉的正确收缩。我们的感觉系统观察这些电信号的影响(我们看到我们的手是如何移动的),我们的大脑使用这种反馈来补偿误算。这个过程被称为反馈控制,是机器人设计师和机器人研究人员面临的挑战之一。我们的机器人不仅需要计划它的手臂应该如何在空间中移动以抓住一个物体,它还必须指定需要施加到它的马达上的电压,以便实现适当的扭矩和力,并完成目标。

反馈控制是一个广阔的领域,具有非常丰富的理论,在我们生活的几乎每个方面都有许多应用。电梯、汽车、飞机、卫星和无数其他日常物体依靠控制算法来调节其内部操作的某些方面。控制理论为控制工程师提供了为许多关键系统设计稳定可靠的控制算法的工具,而这些方法通常依赖于对我们系统的潜在动态的深刻理解。

在设计稳定飞机的控制系统及其自动驾驶软件时,工程师们非常依赖于几十年来在飞机动力学方面的研究和经验。飞机如何对其操纵面角度的变化作出反应是一个相对容易理解的过程,这在试图找出如何控制这样一个系统时提供了很大的好处。

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

source

不幸的是,并不是所有的系统都被理解到这种程度的细节,而且获得这种知识的过程通常是非常漫长的,需要多年的研究和实验。随着技术的进步,我们构建的系统的复杂性也在增加,这给控制工程师带来了许多挑战。

在这个机器学习的时代,一个直接的方法当然是从实验期间收集的数据中学习动力学模型。例如,我们可以想到一个带有简单抓钳的机械臂。手臂的状态由每个关节的角度和角速度组成,我们可以采取的行动是关节内每个电机的电压。这些电压会影响机械臂的状态,我们可以将其视为一个函数:

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

这意味着我们的动力学可以被认为是一个将状态-动作映射到状态的函数,通过学习,我们可以使用类似神经网络的模型来近似它:

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

其中θ代表我们神经网络的参数。这一过程也经常在基于模型的强化学习算法中完成,在该算法中,学习到的动态模型用于加速学习策略的过程。令人失望的是,这经常失败,并且除了使用前瞻时出现的复合误差现象之外,学习的模型倾向于很差地概括到它以前没有见过的状态。学习模型不能很好地推广的原因之一是因为许多神经网络架构非常一般函数逼近器,因此推广到看不见的现象的能力有限。

神经网络和感应偏置

让我们用一个简单的例子来形象化这一点。假设我们从一个类似于直线的函数中采样点,并尝试用一个学习模型来拟合这个函数。

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

source

如果我们尝试使用一个简单的前馈神经网络来近似这个数据,我们可能会在我们的数据被采样的值的范围内获得稳定的性能,如果我们做得好,我们可能会在某种程度上做得很好,甚至超过这个范围。但是,任何使用过神经网络的人都知道,如果我们对输入值范围从 0 到 1 的网络进行训练(如上图所示),并试图预测类似 1000 的输出,我们将得到完整的、完全无用的输出。然而,如果不使用神经网络,而是使用线性近似作为我们的模型,我们可能仍然会获得相当好的性能,甚至远远超出训练输入范围。这是因为我们的数据是从有噪声的线性线中采样的,并且使用线性近似减少了模型的假设空间,我们必须首先只搜索那些良好的候选模型。神经网络是一个更加通用的模型,可以近似任意结构的函数,但这并不意味着它是这项工作的最佳选择。

当卷积神经网络用于图像处理时,观察到类似的现象。原则上,前馈神经网络可以逼近任何函数,包括图像分类器,但这可能需要庞大的模型和令人难以置信的数据量。卷积网络(或 CNN)通过利用问题中固有的结构来更有效地执行这些任务,例如相邻像素之间的相关性和对神经网络中移动不变性的需要。

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

source

图形网络

回到我们近似机器人系统动力学的问题,对于这个问题,传统神经架构的一个共同特征是,它们将系统视为单个组件。例如,当建模我们的机械臂时,我们可以将神经网络的输入作为一个向量,包含我们手臂的所有角度和角速度。

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

source

这是系统在通用 RL 基准中建模的标准方式,通常在策略优化任务中工作良好。但当试图了解我们的机械臂的动力学时,这是不够的,因为机械臂不仅仅是角度和角速度的向量。一个机器人手臂有结构,它由几个关节组成共享相同的底层物理,并以一种与它们如何组装有关的方式相互作用。

记住这一点,我们希望我们的神经网络架构以这样一种方式来处理系统,事实证明,我们可以通过一个对图形数据进行操作的特殊神经网络来做到这一点。

来自谷歌 DeepMind 的研究人员在 2018 年发表了一篇题为“关系归纳偏差、深度学习和图形网络”的论文。在这篇论文中,他们介绍了一种新的神经网络架构,他们称之为图网络,并表明它可以用来非常准确地模拟对象之间相互作用中发生的不同物理现象,如多体引力系统中的行星,刚体粒子之间的相互作用,甚至句子和分子。可以对图形数据进行操作的神经网络的想法早于本文,但是图形网络架构概括了图形神经网络(gnn)的许多先前变体并扩展了它们。

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

source

这种方法的一个明显的限制是,我们需要了解系统的结构,以便用图来建模。在某些情况下,我们可能没有这些知识,但在其他许多情况下,我们有,利用这些知识可以使我们的学习问题变得容易得多。

那么这些图形网络是如何工作的呢?简而言之,图的 DeepMind 公式由规则的节点和边组成,此外还有一个全局向量。在网络的每一层中,每条边都使用它开始和结束的节点进行更新。之后,使用结束于每个节点的边的集合来更新每个节点,然后使用所有节点和边来更新全局向量。

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

source

这个过程可以在论文的上图中看到;首先,通过将它们的特征与它们的发送者和接收者节点的特征一起进行更新,并使用前馈神经网络来更新边缘特征向量。之后,通过将节点的特征与所有传入边的集合一起进行更新,并对它们应用另一个神经网络。最后,将所有节点和边的集合作为全局向量,用另一个神经网络更新全局向量特征。

具有学习模型的模型预测控制

在同时发表的另一篇论文中,名为“图形网络作为推理和控制的可学习物理引擎”,DeepMind 的研究人员使用图形网络来建模和控制不同的机器人系统,包括模拟和物理系统。他们将这些不同的机器人系统建模为图表,并使用数据来学习动力学模型。从论文中可以看到这样一个图表的例子:

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

source

以这种方式对系统建模,作者实现了对未来状态的非常准确的预测,这种预测可以很好地推广到参数变化的系统,例如更长的躯干或更短的腿。

许多应用中使用的一种强大的控制方法是模型预测控制(MPC)。在 MPC 中,我们的控制器使用动态的线性模型来提前规划固定数量的步骤,并对轨迹采用解析成本函数的导数,以使用梯度下降来优化轨迹。例如,假设我们有一个机器人手臂的线性模型,我们希望它遵循一个期望的轨迹,我们如何找到这样做所需的动作?

假设我们的成本函数是这样的形式:

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

这意味着,在每一步,我们希望最小化我们希望遵循的参考轨迹和实际轨迹之间的距离,我们还希望最小化能量消耗,这就是第二项所做的(假设 a 是我们在电机中使用的电压)。

利用我们有一个线性动力学模型的事实,我们可以把它写成:

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

由于我们的成本函数和模型都是可微分的,我们可以对这个成本函数的动作集求导,并使用梯度下降迭代优化它。

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

同样的事情可以用更复杂的动力学图形网络模型来完成。它对于动作也是可微分的,并且我们可以以类似的方式执行模型预测控制。

事实证明,这非常有效,在许多情况下,使用学习模型的控制与使用这些模拟机器人系统背后的真实物理模型的控制一样有效。这是向学习复杂机器人系统的动力学模型和控制策略的能力迈出的非常大的一步,具有对不确定性的鲁棒性和对系统物理参数的灵活性。

使用 UIPath 的机器人流程自动化(RPA)

原文:https://towardsdatascience.com/robotic-process-automation-rpa-using-uipath-7b4645aeea5a?source=collection_archive---------4-----------------------

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

(Source = https://www.laserfiche.com/ecmblog/what-is-robotic-process-automation-rpa/)

“我们对机器人着迷,因为它们是我们自身的反映。”

—肯·戈德堡

介绍

RPA 是一项正在开发的技术,用于自动化手动任务。RPA 与传统编程的区别在于其图形用户界面(GUI)。RPA 自动化是通过分解用户执行的任务并重复它们来执行的。因此,这种技术可以使基于图形的过程的自动化更容易编程。RPA 应用程序的示例包括[1]:

  • 从扫描的文档(如 pdf)中提取数据。
  • 生成电子邮件/监控电子邮件帐户。
  • 读取和创建发票。
  • 自动化薪资处理。
  • 在静态环境中自动化复杂的基于软件的任务。

RPA 利用软件机器人在 Web/桌面或 Citrix 环境中执行任务。平均而言,机器人执行同等过程的速度比人快三倍,而且它们能够全年 24 小时不间断地工作。RPA 擅长于任何类型的基于规则的重复性应用程序[2]。RPA 公司的一些常见例子有 Automation Anywhere、UIPath 和 blueprism [3]。

UIPath

UIPath Community Edition 是一款免费软件,可以在 Windows 上下载。使用 UIPath,可以实现复杂的工作流,创建基于序列和流程图的架构。然后,每个序列/流程图可以由许多子活动组成,例如记录机器人要执行的一组动作或筛选和数据采集指令。此外,UIPath 还支持错误处理机制,以防决策情况或不同流程之间出现意外延迟。这可以通过使用控制流命令来完成,例如:

  • If 语句。
  • 等待某个 UI 元素出现或消失。
  • 增加延迟。
  • 使用调试模式分解工作流执行。

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

Figure 1 : UIPath Interface

UIPath 的另一个特别的功能是它能够处理结构化的表格(例如 XLSX 和 CSV 文件)。这允许开发人员循环通过和过滤来自表的数据,以处理和创建从 web 或任何其他基于桌面的应用程序收集信息的结构化数据。

作为一个应用程序示例,我创建了一个 web 抓取工具来打开 Chrome,以遍历所选类别的所有 Amazon 页面。然后,我可以在一个 CSV 文件中存储该类别中每篇文章的名称、价格和链接。最后,可以对这个文件进行分析(使用 python ML 算法),以查看价格如何随时间变化,并将不同供应商的产品进行比较。

Video 1: Amazon Data Scraping Example

UIPath 目前正在开发其测试版,以将计算机视觉集成为其工作流记录应用程序的一部分。这可能允许在虚拟环境中更好地集成 UIPath,使机器人能够更详细地远程识别不同的 UI 组件。

RPA 业务应用程序

在我与 Documation 软件在的实习期间,我有机会使用 UIPath 进行 RPA 工作。作为实习的一部分,我成功地实现了两个工作流的自动化:

  1. 在财务系统中注册供应商(从结构化数据集中获取数据)。
  2. 使用来自 web 服务的数据在财务系统中创建发票。

这两个工具可以大大加快大中型公司的工作流处理速度。

为了改进上述工作流程,可以添加错误处理机制,在 CSV 文件中存储机器人执行的每个单独流程的状态日志,并标记任何异常。这将允许人类操作员稍后检查机器人如何处理该过程,并查看机器人如何对任何意外事件做出反应。

联系人

如果你想了解我最新的文章和项目,请通过媒体关注我,并订阅我的邮件列表。以下是我的一些联系人详细信息:

文献学

[1] 57 RPA 用例/应用:深度指南[2019 更新]=https://blog . ai multiple . com/robotic-process-automation-Use-Cases/

[2]德意志银行=https://www.youtube.com/watch?v=ZDKQAJuEQhY

[3] Analytics Insight,Kamalika Some=https://www . Analytics Insight . net/top-10-robotic-process-automation-companies-of-2018/

机器人在做科学

原文:https://towardsdatascience.com/robots-are-doing-science-de5fd2b5295f?source=collection_archive---------12-----------------------

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

Data driven AI approaches combined with robotic systems are rapidly transforming science. Image from Propagator Ventures

边缘的科学

这是一件好事

一次一个研究实验室,机器人正在接管科学。

他们正在发现新的药物,生长纳米管的新方法,并扩大我们的新材料库。

他们不会厌倦,也不会浪费时间去思考生命的意义。他们也没有威胁要组织工会或请病假。

他们中的一些人甚至开始形成自己的假设,并进行他们设计的实验——来解决他们选择的问题。

遇见亚当

亚当是世界上第一批机器人科学家之一。目前他在英国剑桥进行酵母实验。

酵母或 酿酒酵母 是负责葡萄酒、面包和啤酒的真菌。就像狗和它们的品种一样,酵母也有许多种类,每一种在基因上都略有不同。像一个雄心勃勃的研究生一样,亚当希望在尽可能多的酵母菌株上进行实验,以达到他的目标。

亚当的形状像一个移动诊所,有机器人手、离心机、冰柜和恒温箱。他没有脸也没有声音,但如果你仔细观察下面的视频,你会发现他有一个性格——偷偷写在他小心翼翼的动作中,写在他行动之间的停顿中,写在他问自己的问题中。

他从冰箱中挑选特定的酵母菌株,并将其转移到一个微量滴定器——一个有许多小试管或*“井”的盘子*。每个试管里都有一种营养丰富的含糖液体和一些精选的添加剂。

每隔 30 分钟,将该板放入阅读器中,仔细测量每个孔反射的光。亚当可以利用这些信息来确定每个孔中酵母的生长速度。这能告诉他添加到井中的特定化学物质对真菌是有益还是有害。

如果他愿意,他可以进入其中的一个井,舀起一些细胞,让它们在另一个井中生长,他也监测这些细胞。

亚当同时运行了一千个酵母实验,每个实验持续长达 5 天。

在这个酵母宇宙中,亚当是一个仁慈的无所不知的上帝。

亚当不仅仅是一台无脑的机器,运行着一个又一个盲目的实验。

从他庞大的数据库中,他可以挑选出一种酶,并猜测可能对此负责的基因。然后,他进行有针对性的实验来证实或反驳这一假设。

没有人参与这个过程。管理亚当的团队不知道他在看哪种酶,也不知道他提出了什么假设。他们只有在亚当检查了他的预感后才能看到结果。

Adam 的初步结果确定了超过 15 种酶的遗传标记。

但更重要的是,它宣布了一个新范式的诞生,即自主科学家

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

Robot scientist Eve, located at the University of Manchester. Eve studies new drug candidates for diseases. Eve is a close cousin of Adam.

虽然目前是一个小部落,但这些自主科学家的潜力如此之大,以至于许多人认为我们正处于一场重大科学革命的边缘——我们的知识每隔几年就会翻一番。

*如果是这样,这可能是科学探索中“*爱迪生”方法终结的开始。

爱迪生范例

1878 年,托马斯·阿尔瓦·爱迪生即将发现第一个商用电灯泡。

物理学是众所周知的:

  1. 电流通过任何材料(例如:铜线、丝绸、气体)都会使其升温。
  2. 炽热的物质发光。

如果设计巧妙,这些无处不在的双重观察可以放在一起制造电灯。

然而,为了产生足够的光,这些材料需要被加热到极高的温度。这意味着大多数物质要么与周围的空气发生反应,要么变成液体,这两种情况都不是我们想要的结果。

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

The light of the bulb is generated by the extremely hot filament at the center. The choice of the filament material is the result of massive scientific and engineering effort lasting years. Photo by Yuichi Kageyama on Unsplash

爱迪生面临的挑战是为他的灯泡找到不会自焚的合适材料。至少,候选材料应该能够让电流通过:也就是说,要有良好的导电性。这排除了粘土、木材和玻璃。

此外,它应该满足一些常识性的要求。它应该至少持续几天——如果可能的话甚至更长。它不应该太贵,只有爱迪生才能买得起。

然而在那个时候,还没有一本材料手册列出世界上所有的材料以及它们的光学、电学、热学、化学和机械性能。

因此爱迪生着手对一种又一种材料进行物理测试。

据估计,他用了 2000 多种材料做实验,包括他自己的头发,直到他发现了由异国情调的东方竹子制成的碳丝。

科学的劳动

现代科学的肮脏秘密是,它仍然以爱迪生 150 年前开创的同样方式运行。

当然,我们肯定已经走了很长的路,因为这个过程的大部分现在是由我们深厚的科学知识和直觉驱动的。我们知道我们使用或需要的东西背后潜在的物理和化学,这有助于大大缩小搜索空间。今天的科学家不太可能把自己的头发放入熔化的金属中,而是希望得到 vibranium。

来自外部的科学遵循高度组织化的逻辑进程,其中每一步都是先验知识和思考的结果。

但在内部,仍然存在混乱和任意选择。

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

Closed loop workflow of data driven science. The potential chemical space available for exploration is impossibly vast. Theoretical models and computer simulations help us narrow this down to smaller subset of combinations — which is too big for manual exploration but might be accessible to autonomous systems. The robotic agent studies a smaller subset of this region, measures the results and uses this information to improve its own selection and planning criteria. Image taken from ‘Using artificial intelligence to accelerate materials development

例如,为了制造一种轻质钢,基础物理和化学知识可能会告诉冶金学家,他的最佳选择是在铁中添加镍、铬或锰。

但是从这里开始,没有真正的前进道路,除非这些组合中的每一种都是物理合成的,并且最终的合金在实验室中对其物理和化学性质进行表征。这些实验可能很简单,也可能很复杂。可能需要重复,直到我们能够确定结果。

在地面上,科学是人类的努力,立足于对真实自然现象的公正观察。

如果有一千个计算或方程式指出镍是与铁搭档的最佳金属,只要有一个观察反驳它,这并不重要。

发现新药、电池元件、汽车零件、玻璃、溶剂、纺织品、陶瓷、电子材料、合金、液体、凝胶等仍然是一项艰巨的任务,需要令人生畏的体力劳动。

这就是像亚当和夏娃这样的自主机器人科学家承诺要创造一场革命的地方。

高通量实验

与人类科学家相比,使用机器人进行实验的明显优势是可以探索更大的搜索空间。

亚当研究了数千种酵母菌株,在他的项目周期中进行了超过 600 万次测量。一个在一年内研究 50 种酵母菌株的研究生会被认为是超级明星。

在时间和空间上进行大量实验的能力是发现新材料的一个特别重要的要求。

我们知道元素周期表中的大约 120 种元素——为什么我们不能把它们每一种都成对地混合起来,看看我们最终会创造出什么?也许这里有一种超级合金或者一种新的磁铁。甚至可能是超导体?

仅仅是元素按 50:50 比例的二元组合就需要我们创造和研究 7140 种材料。但是这里的问题是,我们需要研究所有可能的组合比率!

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

The workflow of Science. The current paradigm typically takes 10 to 20 years to scale a product from conception to commercialization. The emergent AI driven approaches are promising to reduce this time to as little as 5 years. From [‘Inverse molecular design using Machine learning: Generative design for matter engineering’](https://science.sciencemag.org/content/361/6400/360)

目前正在努力解决这些问题的一小部分。国家可再生能源实验室的高通量实验数据库包含超过 60,000 个金属样品薄膜。该数据库包含这些材料的结构、电学和光学信息,可供公众查阅。

空军研究实验室的自主研究系统 (ARES)一直在研究快速生长碳纳米管的最佳条件。通过结合数学见解和遗传算法,该系统已经达到其目标增长率,确定了对碳纳米管生长最有影响的条件。它通过一天运行 100 个实验达到了这个目标。

随着深度学习的爆发,科学家们正在将敌对网络和变分编码器等技术与机器人技术相结合,以创建更高级版本的 Adams。这些系统不仅进行了大量的实验,涵盖了组成空间的巨大区域,而且它们还随着每次迭代而自我完善——就像人类科学家会做的那样。

自主科学家最近进入了商业领域,如atom wisebenevolent aiZymergen 等公司致力于开发闭环系统,以发现材料、有机物和药物。**

然而,人类科学家并没有被机器人取代的危险。我们提供了先进的自动化所不能提供的东西:创造力。

如果有的话,这可能意味着未来的研究生院将是一个非常不同的地方,每个学生都能够同时进行成千上万的实验。

然而,科学将会永远改变,用太多的知识淹没我们,让我们不知如何是好。

新的材料和设备将使世界变得无法辨认,而这些现在都不存在了。

机器人正在从事科学研究,这是一件好事。

延伸阅读

  1. Philip Ball,利用人工智能加速材料开发, MRS 通报,2019 年 5 月
  2. 罗斯·金等人,科学的自动化,科学,2009
  3. Alan Guzik 和 Kristin Persson,材料加速平台,2018

您应该知道的健壮和非健壮的数据简化方法

原文:https://towardsdatascience.com/robust-non-robust-methods-for-data-reduction-you-should-know-a1dc7347a802?source=collection_archive---------18-----------------------

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

网络技术的快速发展、云计算、移动互联网的出现以及物联网设备的出现(如家用电器和自动驾驶汽车)导致了大量数据的创建、交换和存储。但是,这些数据中的大部分可能包含大量冗余和噪声。提高机器学习(ML)模型的预测精度在于选择最小和最紧凑的有用数据集;数据清理过程中的一个棘手问题。减少数据大小(维度)的原因包括实现 CPU 和 GPU 计算工作时间的减少。不用说,没有人希望在确定预测模型大致准确之前,花费数百美元运行云计算能力。可以通过几种方式对数据集进行数据缩减。在数据分析和机器学习预测建模中,我们经常会问这样的问题,所有的属性、子集或至少一个预测因素是否有助于解释反应?

观测值减少

在减少观测数据的情况下,粗略的方法是将数据切成两半,或者任何其他比例。假设观察结果*是真正随机的,*尽管有好处,也不建议这样做。例如,如果我们要收集大量的曲目和用户级别的音乐元数据,那么我们可以选择数据集中的前几行,并且仍然能够很好地表示整个数据群体。然而,如果数据不是随机的,这可能会带来麻烦。假设我们有一个音乐记录的数据集;第一行可能是特定于“Jazz”这样的流派的数据点—在这种情况下,样本是有偏差的。最安全的选择是分层抽样。比方说,我们的模型需要“流派”作为由类变量组成的解释属性;爵士乐、摇滚乐、古典音乐、流行音乐等。我们可以对原始数据集中出现的每个变量进行相同分布百分比的采样。

减少数据观察是很容易的,但是我们不能说属性也是一样。数据集包含多达数百个属性,这些属性不应该挤在预测模型中。

简单属性约简技术

当谈到属性约简时,工具和概念变得相当复杂。我们可以通过使用数据集的专业知识、可视化和执行简单的统计分析来决定移除属性,或者使用一种强大的统计工具来减少数据。让我们看一个例子,展示在 IMDB 5000 电影数据集上的可视化和简单的统计分析。我们想检验“流派”是否对 IMDB 分数有任何影响。也就是说,如果我们想要拟合一个模型来预测 IMDB 分数,我们需要“流派”作为一个解释属性,还是完全删除它?

我们首先从下面的链接下载 IMDB 数据集,并运行下面的代码。

library(data.table)library(GGally)
IMDB <- read.csv("movie_metadata.csv")sum(duplicated(IMDB))IMDB <- IMDB[!duplicated(IMDB), ]ggplot(imdb_score, aes(imdb_score)) + geom_histogram(binwidth = 0.5, color = "dark gray")

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

IMDB 分数显示了在 6 到 8 之间向右倾斜的分布。除了一些低频类型,这使我们认为,给定足够的类型样本数,我们往往会发现他们的平均 IMDB 分数也在这个范围内。这是考虑该属性对 IMDB 分数的解释价值很小的良好开端,但是我们将通过使用平均值的简单统计来确认这一点。

“流派”是由一个或多个流派组合的字符串组成的分类属性。在这个分析中,我们避免解析字符串中的流派,并计算它们的平均值以避免复杂的平均值相加。相反,我们选择了电影业中最常用的电影类型配方。

sort(summary(IMDB$genres),dec=T) #topmost commonly used movie genres excluding ‘others’gnr.df <- as.data.frame(IMDB[,c("genres", "imdb_score")])gnr.df$'Comedy|Drama' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Comedy|Drama") 1 else 0)gnr.df$'Comedy' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Comedy") 1 else 0)gnr.df$'Horror' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Horror") 1 else 0)gnr.df$'Drama' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Drama") 1 else 0)gnr.df$'Documentary' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Documentary") 1 else 0)gnr.df$'Comedy|Drama|Romance' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Comedy|Drama|Romance") 1 else 0)gnr.df$'Comedy|Romance' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Comedy|Romance") 1 else 0)gnr.df$'Drama|Romance' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Drama|Romance") 1 else 0)gnr.df$'Crime|Drama|Thriller' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Crime|Drama|Thriller") 1 else 0)gnr.df$'Action|Crime|Drama|Thriller' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Action|Crime|Drama|Thriller") 1 else 0)gnr.df$'Action|Crime|Thriller' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Action|Crime|Thriller") 1 else 0)gnr.df$'Drama|Thriller' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Drama|Thriller") 1 else 0)gnr.df$'Crime|Drama' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Crime|Drama") 1 else 0)gnr.df$'Horror|Thriller' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Horror|Thriller") 1 else 0)gnr.df$'Crime|Drama|Mystery|Thriller' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Crime|Drama|Mystery|Thriller") 1 else 0)gnr.df$'Action|Adventure|Sci-Fi' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Action|Adventure|Sci-Fi") 1 else 0)gnr.df$'Comedy|Crime' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Comedy|Crime") 1 else 0)gnr.df$'Documentary' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Action|Adventure|Sci-Fi") 1 else 0)gnr.df$'Drama' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% "Comedy|Crime") 1 else 0)gnr.df$'Comedy' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% " Action|Adventure|Thriller") 1 else 0)gnr.df$'Horror' <- sapply(1:length(IMDB$genres), function(x) if (IMDB[x,10] %like% " Drama|Mystery|Thriller ") 1 else 0)means <- rep(0,17)for (i in 1:17) {means[i] <- mean(gnr.df$imdb_score[gnr.df[i+2]==1])}plot(means, type = "b", col = "dark red", ylim = c(1,8), xlab = "Genres")

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

上图显示,体裁作为一种预测因素,并不能很好地解释反应 IMDB 得分,因为平均而言,使用频率最高的体裁组合的 IMDB 得分在 6 到 7 之间。实际上,我们可以通过消除流派来合理而自信地减少数据集的维度。

属性约简:相关性分析

相关性测试的思想是识别两个属性之间的线性强度或者它们之间的相关性强度。这种分析有助于我们确定属性的相互依赖性。一方面,可能有完全的独立性,而另一方面,我们可能有共线性;其中一个变量是另一个变量的线性函数。换句话说,由于这两个属性往往会一起增加或减少,因此很难区分给定预测模型对响应的单独影响。

必须指出的是,在相关性分析中,属性量化了一对属性(即两个属性)之间的关联,而不是大量属性之间的关联。当处理具有数百个属性的大型数据集时,将会有成千上万个相关性的矩阵。即使数据是完全随机的,你也会偶然发现一些属性对之间有很高的相关性。

掌握相关分析背后的技术概念是值得的。如果你不喜欢这些定义,可以随意跳过。我们首先定义两个统计概念;协方差和相关性。

协方差、相关性和相关系数

协方差:类似于方差,它测量单个随机变量与其均值的平方偏差(Var(X)= E(X)-E(X)))。协方差衡量两个属性如何一起波动。换句话说,如果第一个属性很大,第二个属性也很大,两者会一起波动。

相关性就是协方差的归一化版本。对此的解释是,协方差数量很少用作推断两个属性之间关系强度的描述性统计,因为协方差数量取决于两个属性的单位度量。换句话说,如果我们有两个属性,用两个独立的单位来度量,那么得到的量就是一个我们不能与任何一个单位相关联的数字。因此,协方差通常通过除以两个属性的标准偏差的乘积来标准化(即,零均值和方差为 1),从而得到一个称为相关系数皮尔逊相关系数的量。

从数学上也可以看出,相关系数是两个标准化列向量(即,属性值)之间角度的余弦。例如,如果两个单独的属性值接近,则两个向量之间的角度将很小,其余弦值接近+1,这表明正相关性很高。如下图所示,相对方向(正和负)的向量(箭头)相对于水平轴(深红色)属性是非正交的或相对平行的,以指示某种数量的关系。

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

Vectors with various degrees of correlation and directions

计算相关系数

为了进行相关分析,我们使用 r 等统计软件来计算相关系数,这是一个相当简单的操作。相关系数是一个介于+1 和-1 之间的数字。正号或负号表示相关的方向。正号表示直接相关;第一属性的单位值的增加使第二属性增加一个单位值,而负号表示负相关;第一属性的单位值的增加使第二属性减少一个单位值。但是,如果属性之间没有明显的线性关系,则相关性为零或接近于零。

前面的陈述带有一些警告:

1 —接近零或零相关系数不一定意味着没有关系,而是意味着 没有线性关系 。这基本上告诉我们,这两个属性具有零或接近零的相关性,但却相互依赖,通常以非线性方式*。*

2 —尽管相关系数旨在量化一对变量之间的线性关联强度,非线性关联有时会产生不反映关系强度的相关性

3 —计算具有明显非线性关系的一对变量的相关系数通常是不明智的。因此,相关性并不是属性内关系的详尽总结。一个好的做法是绘制属性,并对其统计数据摘要进行可视化检查。

4-相关系数的使用很大程度上取决于一对属性是从高斯(正态)分布中抽取的样本这一事实。因为有些属性比其他属性具有更高的分散性,所以值得检查每个属性的分布形式,并考虑是否有任何属性需要转换。例如,对数变换通常用于减少正偏度,并产生更接近正态的分布。

5-分析最终有助于在检查随机属性时识别一些潜在的冗余。但是某种程度的相关性不应该总是意味着其中一个是冗余的,尽管如果相关性非常高,那么其中一个可能是“几乎冗余的”。

以下面的代码示例为例,绘制一个数据集来说明第 1、2 和 3 点。

*set.seed(1)x = rnorm(600) #vector withdrawn from a normal distributiony = 1 + x + 0.5*x^2 #nonlinear function (1)plot(x,y)legend(-3,12, c("Pearson",round(cor(x,y),2)))y = 1 + x^2 #nonlinear function (2)plot(x,y)legend(-3,15, c("Pearson",round(cor(x,y),2)))*

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

在图的左侧,皮尔逊相关系数很大(> 0.8),但是属性呈现非线性关系。图的右侧是另一个非线性关系,其中相关系数接近于零。如果不直观地检查属性,我们将无法看到关联的真实性质。

让我们运行另一个代码示例,但这次是在汽车数据集上,以显示冗余。我们想从数据集中得到的答案来自以下内容:每加仑英里数(mpg)可以从其他属性中预测出来吗?

*library(GGally)path = "http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data"auto_data <- read.csv(path, header = F, sep = "", quote = "\"'", na.strings ='?')colnames(auto_data) <- c('mpg', 'cylinders', 'displacement','horsepower', 'weight', 'acceleration', 'model_year', 'origin', 'name')str(auto_data) #we see there is '?' value in the datasetround(cor(auto_data[,c(-7,-8,-9)]),2)ggcorr(auto_data[,c(-7,-8,-9)], label = T)*

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

Various correlation values between set of attributes

气缸和排量高度相关(+1)。它们之间共线性的存在意味着气缸提供的关于响应 mpg 的信息在位移存在时是多余的。即使我们从力学的角度来分析这两个属性,也是如此。

高维空间中的多重共线性问题

到目前为止,我们已经讨论了线性相关性可以通过相关系数来检测。但是,在高维空间(即大型属性集)中,我们仍然可以看到三个或更多属性之间的共线性,而不会显示每对属性之间的高度相关性。这种现象称为多重共线性。我们不会进一步讨论这个话题,但是,解决方案可能相对简单的是,使用主成分分析(PCA),虽然这不是它的全部。

主成分分析

PCA 可能是最广泛使用的数据简化技术。即使该技术实际上并不涉及删除属性本身,而是通过将一组相关属性转换成所谓的主成分来实现约简。每个主成分都是原始属性的线性组合,所有主成分都是相互正交的,所以没有冗余信息。此外,每个新的主成分应该指向原始数据中最大可能方差的方向。简单地说,主成分将给出方差的方向和大小,这将帮助我们更好地预测响应。

但是为什么 PCA 关注数据集中的方差呢?请记住,信息都是关于可变性的。当一个属性的方差为零时,它不会泄露任何有价值的信息,因为这意味着它的所有观测值都是相同的。此外,PCA 与转换连续属性(即定量)有关。

PCA 的另一个好处是它还允许我们可视化大量的属性。假设我们有一组 10 个属性,如果我们要为每个属性组合创建一个散点图,以确定任何可能的相关性,我们最终会有 45 个图!当属性的数量非常大时,这不是一个可行的尝试。

PCA 是一种无监督方法,因为它处理一组属性而不考虑响应属性。也就是说,没有关于它们对反应的影响的指导。我们稍后将回到这一点。此外,PCA 不假设原始数据集的潜在概率分布。即,它是否是正态(高斯)l 分布。幸运的是,在现实世界中,数据是高斯分布的,PCA 通常是一种健壮的技术,因此我们可以松一口气了。

为了直观显示这一过程,下图显示了以 x、y、z 轴表示的数据集的 1A 图,该数据集包含四个不同颜色和形状的实验数据集。我们可以看到数据集表现出一定的线性。第一和第二主成分 PC1 和 PC2 一起将数据集转换为最具可变性方向上的一组新的基向量。1B 图是数据集到由 PC1 和 PC2 轴表示的二维空间的变换。我们可以看到,数据集的最大方差或动态性主要是沿着 PC1 解释的,而 PC2 方差相对更接近于零,因此其等级更低。如果我们沿着 PC1 线投影 1B 图中的数据,最后一句话会更好理解,其中显示 PC1 仍然靠近原始数据集,并且具有最大的方差,而 PC2 投影将给出较小的方差,并且距离原始数据集最远。

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

3-dimensional observations sample are transformed onto a 2-dimensional space that maintains the largest variance in the data.

存在许多计算主分量的方法,如幂法、谱分解、特征值分解(ED)、奇异值分解(SVD)和神经网络算法。r 软件包提供了内置函数 prcomp()来计算使用奇异值分解(SVD)技术的 PCA。在计算一组属性的主成分之前,它们应该被标准化为具有一个和零均值的方差。实际上,该计算从相关矩阵而不是协方差矩阵中找到主分量(请参见上面的相关和协方差概念)。

求解 PCA:特征向量和协方差

如果你不喜欢,这部分可以跳过。我们可以通过特征值分解(ED)技术来解释 PCA,以帮助我们发展技术直觉。它的要点可以归结为以下几点:

1-减去数据集 x 中每个属性的平均值。

2-求 x 的协方差的特征向量。

3-执行基的改变:位于 m 维空间中的数据集(即> = 2)。PCA 询问是否存在另一组基向量,它是原始基向量的线性组合,可以更好地表达数据集?我们所说的更好是指方差和投影最大的方向最接近原始数据集。用线性代数的话来说,基的变化是一个矩阵 P,它将把数据集 X {V1,V2,…,Vn}变换成 Y {V1,V2,…,Vn},其中 V 是一个向量。这种新的数据表示用这组新的基向量来表示,这些基向量是彼此正交的主分量,并且指向变换数据集的最大方差的方向。基本上,我们要求一个矩阵 P 来完成这个转换。

a.计算数据集 Y 的协方差,并将其命名为 CY,它捕获所有可能的属性对之间的协方差。这个平方协方差矩阵将具有非对角线上的协方差值和对角线上的方差值。

b.通过矩阵 p 对角化 cy 来优化协方差 CY,以达到最小化数据集中冗余的目的,即 CY 中的所有非对角值(协方差值)都应该为零。

c.前一点指的是线性代数方法,该方法认为对角化 CY 的正交矩阵 P 是数据集 X 的协方差的特征向量,因此是其主分量。

d.CY 的对角线值是 X 数据集属性的方差。

e.根据最大方差对 CY 进行排序,以帮助找到 p 中最重要的对应主成分。

虽然 PCA 仍然是一种健壮的技术,但是它肯定有一个缺点,即 PCA 关于每个主成分的重要性的决定不依赖于响应属性。换句话说,在等级中被降级的具有低方差的主成分对于预测响应也可能是重要的,并且在某些情况下甚至更重要。因此,有其他方法可以帮助克服这种偏见。可以使用稳健的方法偏最小二乘法(PLS ),该方法简单地利用响应来识别新属性,该新属性不仅很好地估计了旧属性,而且与响应相关,实际上,它找到了解释响应和预测值的方向。

总结

我们已经讨论了用于执行预测建模的各种数据简化方法。目的是缩小属性和观察值的选择范围,简洁地解释响应,并帮助快速运行所选的模型。一些归约方法可能需要数据集的专业知识,或者可视化和执行统计分析。一些方法是不稳健的,包括通过分层采样的观察减少,或通过 2 维或更多维空间的相关性分析的属性减少,以及最后,使用 PCA,一种稳健的技术,用于减少数据集的维度空间而不丢失高维空间中的重要信息。我们还解释了每种方法都有其独特的挑战或缺点,但这不应该阻止人们进一步探索这些方法。

鲁棒优化的 BERT 预训练方法

原文:https://towardsdatascience.com/robustly-optimized-bert-pretraining-approaches-537dc66522dd?source=collection_archive---------21-----------------------

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

Photo by Joakim Honkasalo on Unsplash

用于增强 BERT 模型性能的预训练方法的变化摘要

自然语言处理(NLP)近年来一直处于上升趋势。这都归功于语言模型(lm)预训练方法。由于各种原因(训练数据、计算成本和超参数选择),仔细比较 lm 预训练方法几乎是不可能的。在这篇文章中,我将总结 BERT 的预训练方法中的一些变化,这些变化影响了最终的结果,因此它在 9 个胶合任务中的 4 个中实现了最先进的结果。要获得详细的理解,请阅读下面的文章。

[## RoBERTa:一种鲁棒优化的 BERT 预训练方法

语言模型预训练带来了显著的性能提升,但是仔细比较不同的方法…

arxiv.org](https://arxiv.org/abs/1907.11692)

伯特训练不足

我们几乎认为 BooksCorpus英文维基百科数据集(总共 16 GB)足以让一个语言模型获得对语言的基本理解,但事实并非如此。脸书和华盛顿大学的研究人员(论文作者)在 DGX-1 机器上训练了罗伯塔总共 160 GB 的未压缩英语数据集,每台机器都有 8 x 32GB 的英伟达 V100。

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

Table 1: Comparing the dataset size and the performance of various models. (image is taken from the paper)

在上表中,我们可以看到,在类似的设置下,RoBERTa 在小队和 MNLI-m 任务中仅用了 100k 步就超过了 BERT large model(相比之下,BERT 用了 1M)。

下一句预测损失

BERT 使用两种不同类型的训练目标,一种是掩蔽语言模型(MLM),另一种是下一句预测(NSP)。在 MLM,BERT 选择 15%的标记进行替换,其中 80%的标记被替换为*【面具】*,10%保持不变,10%被随机选择的词汇标记替换。

NSP 是一个二元分类任务,它预测两个输入段是否同时出现。该目标旨在改进下游任务,因为它需要模型理解两个给定序列的关系和上下文。正如在论文中观察到的,去除 NSP 会损害自然语言理解(NLU)任务的表现。但是在最近的一些模型中,如 XLNetSpanBERT 等,NSP 损失的必要性受到质疑。

因此,在各种设置(段对、句子对、完整句子、文档句子)下进行实验,以比较 NSP 损失对模型性能的影响。在 SEGMENT_PAIR(有 NSP 损失)中,设置原始 BERT 的原始输入格式被使用,类似地,在句子对(有 NSP 损失)中,设置输入被从来自相同文档或不同文档的连续部分取样。但是在全句子(没有 NSP 损失)中,设置输入由来自一个或多个文档的完整句子组成,类似地,在文档句子中,设置输入与来自相同文档的完整句子打包在一起。这些实验的输入大小保持在 512。

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

Table 2: Comparison of performance of models with and without NSP loss (image is taken from the paper)

该表显示, DOC-SENTENCES(无 NSP 损失)设置中的模型优于所有其他模型。如同在其他设置中一样,该模型不能学习长程相关性。尽管如此,RoBERTa 使用完整句子设定训练目标。

静态屏蔽与动态屏蔽

在 MLM 训练目标中,BERT 在数据预处理过程中仅执行一次屏蔽,这意味着在每一个历元都将相同的输入屏蔽提供给模型。这被称为静态屏蔽。为了避免每个时期使用相同的掩码,训练数据被复制 10 次。如果每次将序列输入模型时都执行屏蔽,则模型会看到同一句子的不同版本,屏蔽位于不同的位置。这里,这种类型的屏蔽被称为动态屏蔽。

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

Table 3: Comparison of performance of models trained with static and dynamic masking

用动态掩蔽训练的模型的性能稍好于或至少可与 BERT(即静态掩蔽)模型中使用的原始方法相比,因此用动态掩蔽训练 RoBERTa。如果您有兴趣了解屏蔽是如何工作的,以及它如何提高 BERT 模型的整体性能,您可以查看这个链接。

大批量小批量训练

如果相应地提高学习速度,用大的小批量训练可以提高优化速度和最终任务性能。这显示在以前的工作(显示论文链接)在机器翻译中完成。为批量大小为 256 的 1M 步骤训练模型的计算成本相当于为批量大小为 8K 的 31K 步骤训练。用大的小批量训练模型改善了 MLM 目标的复杂性,同样,通过分布式数据并行训练更容易并行化。即使没有大规模并行化,效率也可以通过梯度累积来提高。

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

Table 4: Comparison of the effect of increasing batch size (bsz) and learning rate and performance of the model

字节对编码

字节对编码(Byte-Pair Encoding,BPE)是字符级和单词级表示的混合,它只依赖于子单词单元。这些子词单元可以通过对训练数据集执行统计分析来提取。一般来说,BPE 词汇表的大小范围从 10K -100K 子词单位。

BERT 使用 30K 的字符级 BPE 词汇大小,它是在用启发式记号化规则预处理之后学习的。罗伯塔使用了由拉德福德等人(2019) 在论文中讨论的编码方法。这里,BPE 子词词汇表减少到 50K(仍然大于 BERT 的 vocab 大小)个单位,具有编码任何文本的能力,而没有任何未知标记,并且不需要预处理或标记化规则。在某些情况下,使用这种编码会降低最终任务的性能。尽管如此,这种方法还是用于编码,因为它是一种通用的编码方案,不需要任何预处理和标记化规则。

结论:

  1. 在选择预训练策略(和超参数选择)时,即使是最小的决策也对模型在最终级任务中的性能起着至关重要的作用。
  2. 大多数最先进的变压器模型训练不足。即使是训练时间最长的 RoBERTa 模型在 500k 步后也没有过度拟合。

ROC 曲线,完整介绍

原文:https://towardsdatascience.com/roc-curve-a-complete-introduction-2f2da2e0434c?source=collection_archive---------3-----------------------

作者:雷扎·巴盖里

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

ROC(接收器操作特性)曲线是一种有用的图形工具,用于评估二元分类器的性能,因为其区分阈值是变化的。为了理解 ROC 曲线,我们应该首先熟悉二元分类器和混淆矩阵。在二进制分类中,给出了一个对象集合,任务是根据对象的特征将其分为两组。例如,在医学测试中,我们希望分类器根据某些特征(如医学测试结果)来确定患者是否患有某种疾病。

评估分类器意味着测量预测类或标签与评估集中真实标签的匹配程度。在二元分类法中,我们通常把两类中较小的和较有趣的称为正类,把较大的/另一类称为负类。在医学诊断问题中,患有疾病的患者通常是阳性的,而其他人是阴性的。图 1 显示了一个简化的数据集,其中只有一个特征和两个标签。横轴表示特征 x,纵轴表示标签,可以是正的也可以是负的。在这个图中,蓝圈是正数,红圈是负数。

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

Figure 1

这是我们的训练数据集,每个点称为一个例子。现在,我们希望我们的分类器学习训练数据集,并仅基于特征值预测示例的标签。分类器预测可能不完美,并且在预测实际标签时可能出错。因此,二元分类器的预测有四种可能的结果:

True Positive ( TP ):这里分类器预测或标记一个肯定的项目为肯定的,这是一个正确的预测。

真否定( TN ):这里,分类器正确地确定否定类别的成员应该得到否定标签,这又是正确的预测。

假阳性( FP ):分类器误将一个阴性项目预测为阳性,称为 I 型分类错误。

假阴性( FN ):分类器错误地将一个阳性项目标记为阴性,称为 II 型分类错误。

图 2 显示了这些结果的图形表示。

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

Figure 2

这四个结果定义了一个 2×2 a 的列联表或混淆矩阵,如图 3 所示。为了记住这些术语,您可以分别用正确和不正确替换 True 和 False,也可以分别用选择和拒绝替换肯定和否定。

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

Figure 3

所以,比如假阳性( FP )就是选错了。现在,我们可以根据这些新概念为分类器定义一些评估统计数据或指标:

准确率:正确预测数与总预测数之比。所以:

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

灵敏度也称为召回或真阳性率( TPR ):它测量被分类器正确预测(或召回)为阳性的初始阳性的比例。

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

精度:分类器的肯定预测中真正肯定的部分。

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

特异性或真阴性率( TNR ):被分类器正确预测(作为阴性被拒绝)的阴性比例。

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

假阳性率( FPR ):被错误选择为阳性的阴性比例。

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

图 4 显示了这些指标的图形表示。

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

Figure 4

随机分类器

现在,我们考虑一些特殊情况,并尝试为它们计算这些性能指标。对于第一种情况,我们假设我们有一个预测任何数据点为阳性的差分类器。如图 5 所示,这个分类器从不拒绝任何数据点为负,所以 *TN = 0。*它也从不漏掉一个正数,所以 FN=0 。现在我们有:

回忆或 TPR = TP/(TP+FN) = TP/TP = 1

FPR = FP/(FP+TN) = FP/FP =1

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

Figure 5

对于第二种情况,我们假设我们有另一个糟糕的分类器,它拒绝所有的数据点,并且从不选择任何数据点作为阳性(图 6)。由于没有选择(无论是正确的还是不正确的) *TP=FP=0,*所以:

回忆或 TPR = TP/(TP+FN) = 0/(0+FN) = 0

FPR = FP/(FP+TN)= 0/(0+TN)= 0

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

Figure 6

到目前为止,我们有两个总是选择或拒绝所有数据点的分类器。现在我们假设有第三个分类器位于两者之间。它被称为随机分类器。对于每个数据点,它以相等的概率随机地将它们标记为正或负。因此,这就像挑选一个数据点,然后抛硬币来决定应该给它分配哪个标签。现在想象我们总共有 N 个数据点,并且 N 是一个非常大的数字。我们还假设实际正的数量是 Np ,实际负的数量是 Nn 。现在,对于分类器选取的每个点,它实际上是正数的概率是 Np/N ,它实际上是负数的概率是 Nn/N 。对于阳性点,其被分类器标记为阳性或阴性的概率为 0.5。现在我们可以计算这个分类器得到每个结果的概率。

对于一个 TP 为正的概率是 Np/N ,被预测为正的概率是 0.5 所以总概率是 (Np/N)×0.5 。用类似的方法,我们可以计算出其他结果的概率。

FN= (Np/N)×0.5

FP= (Nn/N)×0.5

TN=(Nn/N)×0.5

所以我们看到得到 TP 的概率等于 FN 也就是说 TP=FN 。同理, FP=TN 。这意味着:

TPR = TP/(TP+FN)= TP/(TP+TP)= 0.5

FPR = FP/(FP+TN)= FP/(FP+FP)= 0.5

如果分类器选择了一个概率较低的正呢?例如,想象一个分类器,它以 0.3 的概率预测一个肯定的结果,并以 0.7 的概率将其拒绝为否定的结果。然后:

TP= (Np/N)×0.3

FN= (Np/N)×0.7

FP= (Nn/N)×0.3

TN= (Nn/N)×0.7

TPR = TP/(TP+FN)= 0.3/(0.3+0.7)= 0.3

FPR = FP/(FP+TN)= 0.3/(0.3+0.7)= 0.3

所以,通过改变选择概率, TPRFPR 都会改变,但始终保持等于选择概率。事实上,我们之前研究的前两个分类器也可以描述为随机分类器的一个特例。对于预测一切为正的分类器,选择概率为 1,所以 TPR=FPR=1 ,对于拒绝一切的分类器,选择概率为零,所以 TPR=FPR=0 。图 7 显示了 TPRFPR 的关系图,以及这些分类器各自的分数。

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

Figure 7

在该图中,点 B 代表一般随机分类器,其以概率 p 预测正点。A 点是预测一切为负的分类器,可以认为是随机分类器 p=0 。C 点是预测一切为正的分类器,是随机分类器 p=1TPRFPR 的范围都是从 0 到 1,并且所有这些点都位于对角线上。通过改变选择概率,可以改变随机分类器沿对角线的位置。

我们现在可以用一种更数学的方式来表达选择概率。对于数据集中的每个点 i ,我们将使用 x(i) 来表示输入特征,使用 y(i) 来表示我们试图预测的实际标签或目标变量。在二进制分类的情况下, y(i) 取二进制值。这里我们假设对于正的点 y(i)=1 ,对于负的点 y(i)=0 。因此,一对 (x(i),y(i)) 定义了训练数据集中的每个点或示例。我们的任务是学习一个函数 h: X → Y 使得 h(x)y 对应值的良好预测器,函数 h 称为假设。 h(x) 应该给出每个点的正标签的概率 x(i) ,其数学上可以写成:

P(y=1|x) = h(x)

其中 P 是给定 x 对于每个点 i 的条件概率 y=1 。因为我们只有两个可能的类别,所以负标签的概率简单地是:

P(y=0|x) = 1-h(x)

分类器应该使用 x 值为每个点计算 h(x) 以预测该点的标签。我们如何定义随机分类器的 h(x) ?这里我们假设 h(x) 在 0 和 1 之间具有均匀分布。这种分布具有恒定的概率,并且这与我们的随机分类器一致,该随机分类器总是以恒定的概率选择阳性。所以:

h(x) ~均匀(0,1)

但是 h(x) 仅仅给出了点 x(i) 具有正标签的概率。我们怎么能说它是积极的还是消极的呢?我们定义了一个选择阳性的阈值。如果 h(x) 大于或等于阈值,我们将 x 标记为正,如果小于阈值,我们将它标记为负:

h(x) ~均匀(0,1)

如果 h(x)≥阈值则 y(I)= 1

y(i)=0 如果 h(x) <阈值

现在我可以说明,如果你想让随机分类器的选择概率为 p ,阈值应该等于 1-p

我们知道:

如果 h(x)≥阈值,y(I)= 1

X 是一个随机变量,可以取 x 的值。如果我们假设 h(X) 在 0 和 1 之间具有均匀分布。那么 h(X)概率分布函数 ( pdf )简单来说就是 1。

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

现在我们可以计算它大于阈值的累积概率:

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

所以h(X)≥阈值的概率是 p 也就是说 y(i)=1 的概率也是 p ,分类器以概率 p 预测一个正。

当选择概率为零时,阈值将为 1 ( TPR=FPR=0 ),当选择概率为 1 时,阈值将为零( TPR=FPR=1 )。因此,在图中,通过将阈值从 1 变为 0,我们沿着图 8 中从点 A 到点 C 的对角线移动。

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

Figure 8

现在我们将学习如何用 Python 实现这个随机分类器。首先,我们需要定义一个非常简单的数据集(清单 1)。

如果您运行这个代码,您将得到这个数据集的图,如图 9 所示。

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

Figure 9

这里我们有 50 个只有一个特征的例子( x )。一半点标为负( y=0 ),另一半点标为正( y=1 )。正负点之间没有重叠(在 x 值上)。现在我们需要定义假设函数 h(x) (清单 2)。函数predict_proba()负责为每个 x 返回 h(x) 。它接受一个数据实例数组( x ),并使用Numpy的均匀分布返回一个概率数组。因此,现在每个点都被赋予一个概率,该概率来自 0 和 1 之间的均匀分布。

现在我们定义准备 ROC 曲线中的点的函数(清单 3)。该函数获取由predict_proba()生成的所有点的概率数组以及实际标签数组( y )。然后,它定义介于 0 和 1.1 之间的阈值。你可能会问为什么门槛的上限是 1.1?而不是 1?稍后我会解释。对于每个阈值 t ,如果该点的 h(x) (具有正标签的概率)大于或等于 t ,则该函数预测为 1,否则为零。然后基于这些预测值和 y 中的实际值,建立混淆矩阵,计算出 TPRFPR 值。最后,它为每个阈值返回具有相应值 TPRFPR 的阈值数组。 TPRFPR 阵列将用于绘制 ROC 曲线。

图 10 显示了使用 Python 代码绘制的 ROC 曲线。你可能会注意到 ROC 曲线没有那么接近对角线,这也意味着每个阈值的 TPRFPR 值不够接近。

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

Figure 10

这是因为我们没有那么多的数据点。想象你有一枚公平的硬币,你把它抛 10 次。正面和反面的总数不一定相等,但是,如果你增加投掷次数,正面和反面的总数会更接近。因此,如果我们显著增加例子的数量,我们将得到一个更真实的 ROC 曲线。清单 4 通过将示例数量增加到 10000(同样,一半的点标记为 1,另一半标记为 0,没有重叠)做到了这一点。结果如图 11 所示。现在 ROC 曲线非常接近对角线,并且清楚地表示随机分类器。

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

Figure 11

这些结果表明, TPR vs FPR 的图可以用于评估二元分类器的性能,然而,我们迄今为止所研究的分类器并不真正有用,因为它们都是盲目工作并随机选择正数据点。我们如何在这个图中包含一个真正的分类器?

逻辑回归分类器

逻辑回归是一种统计模型,可用于二元分类。这里我们使用逻辑回归来研究二元分类器的行为。我假设您已经对此很熟悉,并且只给出了简要的描述。该模型假设假设具有以下形式:

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

其中 xi 为特征, g 称为逻辑函数或 sigmoid 函数。图 12 显示了 sigmoid 函数的曲线图。

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

Figure 12

ai 的最佳值将在学习过程中确定。因为我们的数据集中只有一个特征:

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

现在和以前一样,我们有:

P(y=1|x) = h(x)

P(y=0|x) = 1-h(x)

所以,成为正点的概率,现在用一个 sigmoid 函数来描述。我们现在准备将逻辑回归应用于 Scikit-learn 中的一个简单数据集。我们首先定义我们的数据集,它有 20 个例子:

然后我们使用 Scikit-learn 中的逻辑回归模型来拟合数据。该模型将 sigmoid 函数拟合到数据集,以预测每个特征输入的阳性标签的概率。Scikit-learn 的LogisticRegression模型有一个叫做predict_proba()的方法可以返回这个概率。清单 6 中使用了这种方法来预测一些测试数据点的概率。需要注意的是,predict_proba()返回的是负标签和正标签的概率,正标签的概率存储在它的第二列中(第一列存储负标签的概率,所以如果我们将第二列的值称为 p ,第一列的值就是 1-p )。因此,我们应该首先通过分割返回的数组来分离概率,并将其存储在skl_prob变量中。

图 13 显示了原始训练数据集加上predict_proba()预测的概率图(红色曲线)。很明显,它是 s 形的。换一种方式来剧情也是有启发的。我们可以先定义一个 sigmoid 函数。然后让LogisticRegression返回它学习到的 sigmoid 函数的系数( a0a1 in h(x) )。这些系数存储在clf.coef_ ( =a1 )和clf.intercept_ ( =a0 )中。我定义了一个名为logistic_predict_proba()的函数,使用这些系数来计算 h(x) 。如果我们用这些系数绘制 h(x) ,我们会得到与 Scikit-learn 的predict_proba()方法完全相同的结果(图 13 中的黄色曲线)。在该图中,我用 p 标记了 y 轴,以强调它是一个概率,但是它也可以标记为 h(x ),因为 h(x) 是一个概率,并且我在这里绘制了它的值。

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

Figure 13

但是这些概率如何变成每个数据点的 0 或 1 标签呢?再次使用阈值。对于该模型,预测概率与阈值 0.5 进行比较。如果概率大于 0.5,它将被指定为 1,否则为 0。

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

在清单 7 中,我定义了一个名为logistic_predict()的函数,使用我们之前生成的概率来预测标签。它将概率作为一个参数,并将其与作为阈值的 0.5 进行比较,以预测标签。我们实际上不需要定义这样一个函数。Scikit-learn 的LogisticRegression模型有一个叫做predict()的方法来做同样的事情。它获取输入要素并使用之前由模型计算的概率(与我们使用predict_proba()检索的概率相同),并以类似的方式预测标注。

清单 7 的输出显示两个函数给出了相同的结果。现在我们有了所有必要的工具来绘制这个分类器的 ROC 曲线。我们使用与随机分类器相同的过程。我们产生一些介于 0 和 1.1 之间的阈值,对于每个阈值,使用来自LogisitcRegression模型的概率来预测标签。然后,我们使用这些预测标签和每个数据点的实际标签来计算 TPRFPR 值。为此,我们可以很容易地使用之前定义的roc_curve()函数。最后,我们可以使用生成的 TPRFPR 值绘制 ROC 曲线(图 14)。

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

Figure 14

同样,我们真的不需要定义自己的函数。Scikit-learn 有一个名为metrics.roc_curve()的函数,它在清单 9 中做了同样的事情。

它非常类似于我的函数,具有相同的参数和返回值,结果图将类似于图 14。检查其返回的数组是有益的。在清单 10 中,我取了一个阈值(实际上是 threshold 数组的第二个值),并使用该值预测标签。然后,我计算混淆矩阵, TPRFPR 的值。这些值等于metrics.roc_curve()TPRFPR 数组中返回的对应阈值的值( TPRFPR 数组的第二个值)。

如果您检查阈值的值,您会注意到它从一个大于 1 的数字开始。这里我解释一下原因。如您所知,阈值 1 意味着我们想要一个不预测任何阳性标签的分类器。我们知道:

如果 h(x)≥阈值,y(I)= 1

对于随机分类器,我们可以取 pdf 的积分来计算 P(h(x)≥threshold) 。问题是我们通常不知道 pdf 函数取这个积分。相反,我们计算由该阈值产生的阳性和阴性标签的数量,并直接计算概率。这个概率总是小于或等于 1,但是阈值仍然需要从一个大于 1 的数开始。这是因为当概率大于或等于阈值时,roc_curve()函数预测一个正标签。现在有可能某些 h(x) 值等于 1。如果阈值等于 1,该函数仍然预测它们的正标签。所以分类器仍然预测一些阳性标签,这不是我们想要的分类器。我们知道 h(x) 是一个概率,永远不可能大于 1。现在,通过将阈值设置为 1.1,我们确保阈值总是大于所有概率( h(x) 值),并且不会预测到阳性标签。结果是一个不预测任何肯定结果的分类器。

因此,现在应该清楚 Scikit-learn 中的roc_curve()函数是如何工作的了。现在让我把重点放在 ROC 情节本身。在图 15 中,突出显示了 ROC 曲线中的一些点。这个数字有点夸张,因为当通过数据点时,s 形曲线的斜率应该慢得多(如图 13 所示)。

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

Figure 15

A 对应于大于 1 的阈值,对于该阈值分类器不选择任何东西。以前研究过这种分类器。由于没有选择 TP=FP =0 ,并且 TPR=FPR=0 如前所示。对于 B 点,只有一些正点选择正确,所以 0 < TPR < 1 ,但是 FPR 仍然为零。对于点 D,所有的正点都被正确选择,但是一些负点也被选择为正点,所以 TPR=10 < FPR < 1 。对于点 E,我们有一个阈值 0,分类器为其选择所有内容。所以, TN =FN = 0 。我们之前也展示过,对于这种情况, TPR=FPR=1

重要的是要注意,无论您对分类器使用什么模型,ROC 曲线的这两点总是相同的。大于 1 的阈值总是给出 TPR=FPR=0 ,而 0 的阈值总是给出 TPR=FPR=1 。结果,所有的 ROC 曲线都经过这两点。我们还有一个点 C,它对应于阈值 0.5。如图 15 所示,对于这个特定的数据集,这个阈值正确地预测了一切。因此,不存在不正确的选择或拒绝以及 FP=FT=0 。因此:

TPR = TP/(TP+FN) = TP/TP = 1

FPR = FP/(FP+TN) = 0

因此,我们有一个理想的分类器,可以在阈值为 0.5 的情况下正确预测训练数据集的所有标签。理想的分类器总是经过这个点( TPR=1,FPR=0 ),这个 ROC 曲线就是这种分类器的特征曲线。

如前所述,逻辑回归模型总是使用阈值 0.5 来预测标签。那么用其他阈值来绘制 ROC 曲线有什么意义呢?答案是,我们使用一系列所有可能的阈值以某种方式扫描我们的数据集,并查看数据点在特征空间中的结构。如果我们只有理想的分类器,ROC 曲线就没有多大用处,然而,在许多情况下,分类器不能正确预测所有事情,这就是 ROC 曲线对我们有用的地方。让我在清单 11 中定义一个新的数据集。

图 16 显示了该数据集的曲线图。它有 50 个数据点。一半的点标记为 1,另一半标记为 0。但是,与之前的数据集相比,有很大的不同。这里正负点部分重叠。这意味着对于一些负点来说, x 的值高于正点的最小 x 值。

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

Figure 16

我们使用前面的步骤来拟合逻辑回归模型并绘制 ROC 曲线。这次只使用了 Scikit-learn 功能。首先,我们计算概率( h(x) )。

图 17 显示了带有数据集点的结果概率曲线。

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

Figure 17

最后,我们使用清单 13 中的这些概率绘制 ROC 曲线。

得到的 ROC 曲线绘制在图 18 中。

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

Figure 18

这个 ROC 曲线现在和之前的相比有点不同。图 19 突出显示了这条曲线上的一些点,以便更好地理解它。

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

Figure 19

如前所述,阈值 0 和大于 1 的阈值(点 A 和 E)保持在相同的位置。例如,对于阈值为 0.9 的点 B,我们仍然在重叠区域之外。这里 TPFN 都大于零,但是 FP 还是零。所以 FPR=00 < TPR < 1 和 B 点位于垂直线上。对于 C 点,我们在重叠区域内,所以 FP 不再为零,该点偏离垂直线。此外,如图所示,C 点位于对角线上方,这意味着 TPR > FPR 。我们可以简化这个不等式:

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

从图中可以清楚地看出,这个不等式对于这个数据集是成立的。这是因为当我们开始降低阈值时,我们首先会遇到正的点。换句话说,实际的正点平均起来具有更高的 h(x) 或者被预测为正点的概率更高。

对于 D 点,我们又在重叠区域之外,但是这次 FN=0TNFP 都大于零,所以 TPR=10 < FPR < 1 和 D 点位于水平线。事实是重叠点的标签不能通过仅使用一个特征来预测。您需要一个以上的特征来分离这些点。

如果我们增加数据集中重叠点的比例会发生什么?清单 14 定义了这样一个数据集,然后绘制了 ROC 曲线。数据集和 ROC 曲线分别显示在图 20 和 21 中。

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

Figure 20

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

Figure 21

正如你所看到的,现在我们有了一个更大的重叠区域,所以从垂直线的偏离开始得更快了。有一种方法来表征 ROC 曲线与理想分类器(只有一条垂直线和一条水平线)的偏离。为此,我们计算 ROC 曲线下的面积,如图 22 所示。

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

Figure 22

我们称这个量为 AUC(曲线下面积)。对于理想的分类器,AUC 是长度为 1 的矩形的面积,因此它正好是 1。对于随机分类器,它大约是下三角形的面积 0.5。对于其他分类器,AUC 介于 0.5 和 1 之间。AUC 越高,分类器越好,因为它更接近理想的分类器。要在 Scikit-learn 中计算 AUC,您可以使用metrics.auc()函数,该函数接收由metrics.roc_rurve()函数生成的 TPRFPR 数组,并返回 AUC 值。清单 13 和清单 14 中都使用了这个函数。

但是我们可以将重叠区域的大小增加多少呢?最坏的情况是正负点完全重叠。清单 15 定义了这样一个数据集,并符合逻辑回归模型。结果如图 23 所示。如你所见,假设函数看起来像一条直线,而不是一个 sigmoid 函数。

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

Figure 23

接下来,我们绘制清单 16 中的 ROC 曲线。

ROC 曲线如图 24 所示。如您所见,它类似于随机分类器的 ROC 曲线,AUC 也接近 0.5。事实上,如果增加数据集中的点数,ROC 曲线会看起来更平滑,AUC 会更接近 0.5。

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

Figure 24

但是为什么它看起来像一个随机分类器呢?图 25 解释了原因。正如您看到的

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

事实上,当数据点完全重叠时,分类器无法仅使用一个特征来区分它们,并且它将正标签分配给几乎一半的数据点,而将负标签分配给其他数据点。因此,这个分类器并不比随机分类器好。

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

Figure 25

因此,表现得像一个随机分类器似乎是最糟糕的情况。但是有可能在对角线下面有一条 ROC 曲线吗?我指的是每一点都有 AUC < 0.5. To have such a case, we need a classifier which is even worse than a random classifier! Such a classifier should favor a wrong label for each data point which means something is systematically wrong with it. Let’s build a classifier like this.

As you see, this classifier is similar to a logistic regression classifier. In the logistic regression model, the function 【 returns the probability of being a positive ( p 的曲线。这里我定义了一个名为logistic_mispredict_proba()的新函数,它返回 1-p 。事实上,对于明显错误的正点,它返回负点的概率(由逻辑回归分类器计算)。这样,它会支持每个数据点的错误标签。现在,我们使用清单 18 中的这些错误概率来绘制图 16 中相同重叠数据集的 ROC 曲线。

图 26 显示了由logistic_mispredict_proba()返回的数据点和概率函数( h(x) )。正如你看到的,它类似于图 17,然而,概率函数现在是沿着 x 轴镜像的。

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

Figure 26

图 27 显示了 ROC 曲线,其现在位于对角线下方,AUC 为 0.02。

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

Figure 27

最后,图 28 将 ROC 曲线上的点连接到概率函数上的点。

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

Figure 28

对于 B 这样的点,现在 TPR 小于 FPR 。当你得到这样的 ROC 曲线时,说明学习算法没有正常工作,是在错误标注数据点。

数学解释

这是本文的最后一部分,我将讨论一些更高级的话题。如果你对 ROC 曲线的数学理论不感兴趣,可以跳过这一节。

为了描述 ROC 曲线的数学解释,我们需要定义一种新的符号。正如你所记得的,最初我们有一些积极和消极的数据点。我们用 D+ 来表示一个数据点的实际标签为正的事件(我们简称它们为正),用 D-来表示一个数据点的实际标签为负的事件(我们简称它们为负)。我们还使用 T+ 来表示数据点的预测标签(通过分类器)为正的事件,以及 T- 来表示数据点的预测标签为负的事件。

现在我们可以定义一个类似于 P(T+|D+) 的条件概率。它是在给定数据点的实际标签为正的情况下,预测该数据点为正的概率。其实就是指得到一个 *TP 的概率。*现在假设具有实际正标签的点的总数是 Np 。分类后,它们中的一些将被正确地预测为阳性,而另一些将被错误地预测为阴性。前者是 TP ,后者是 FN 。所以, Np = TP+FN。同样,如果真否定的总数是 Nn 那么 Nn = TN+FP。根据定义 P(A|B) = P(A,B)/P(B) ,所以

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

如果你还记得,这就是灵敏度或者 TPR 的定义。所以,灵敏度实际上是从正数据点中得到一个 TP 的概率。

同理, P(T-|D-) = TN/(TN + FP) 等于特异性P(T-|D-) 表示假设一个数据点的实际标签为负,则该数据点被预测为负的概率。所以,特异性是从负点中得到一个 TN 的概率。最后, FPR 是从负点中得到一个 FP 的概率。FPR = P(T+| D-)= FP/(FP+TN)。如你所见,我们可以描述所有我们之前定义为条件概率的量。

如前所述,分类器通常不是理想的,并且有可能错误标记测试点。想象一下,一个分类器预测一个测试数据点的阳性标签,这个点真的是阳性的可能性有多大?数学上,我们感兴趣的是计算 P(D+|T+) 。这是一个重要的量。例如,一个分类器应该根据一些特征,比如他的医学测试结果,来预测一个病人是否患有某种疾病。如果分类器预测患者患有该疾病,那么这个患者真的患有该疾病的可能性有多大?要回答这个问题,我们需要贝叶斯定理。贝叶斯定理描述了一个事件发生的概率,基于可能与该事件相关的条件的先验知识。让事件 A1,。。。,Ak 形成空间 S 的分隔,使得

Pr(Aj) > 0 对于 j = 1,.。。,k ,设 B 为事件,使得 Pr(B) > 0 。然后,对于 i = 1,.。。,k

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

其中 P(Ai|B) 称为事件 Ai 的条件概率,假设事件 B 已经发生。在这个等式中 P(Ai) 通常被称为先验概率,因为 P(Ai) 是在我们知道关于事件 B 的任何事情之前该事件的概率,而 P(Ai|B) 被称为后验概率,因为它是在事件 B 发生之后事件 Ai 的概率。此外, P(B|Ai) 称为给定 AiB 的可能性,表示事件 B 给定事件 A 的可能性有多大。

事实上,贝叶斯定理通过纳入观察事件 B 提供的证据,将先验概率 P(Ai) 转化为后验概率 P(Ai|B)

在二元分类的情况下,数据点最初应该是正的或负的,因此:

P(D+)+P(D-)=1

因此贝叶斯定理给出:

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

P(D-) 替换为 1-P(D+) :

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

为了简化这个方程,我们可以把分子和分母都乘以*(1-P(D+)/P(T+| D-)*。然后我们有:

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

为了使这个等式更简单,我们需要定义一个新概念。在概率论中,一个事件 e几率 定义为该事件发生的概率, *P(e),*除以该事件不发生的概率, 1 — P(e)

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

因此,如果我们知道一个事件的概率或几率,我们可以很容易地计算出另一个。举个例子,如果一个特定事件的概率是 0.9,那么这个事件的几率就是事件 0.9 除以 0.1,也就是 9:1。根据这个等式,当概率为零时,赔率也为零,但当概率为 1 时,赔率无穷大。此外,在赔率和概率之间存在相关性:

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

现在我们可以用这个概念来简化为 *P(D+|T+)导出的最后一个方程。*我们可以将 P(D+)/(1-P(D+)) 替换为 odds(D+) 得到:

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

如果我们重新排列这个等式,我们得到:

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

但是左手边简直等于赔率(D+|T+) 。所以最后我们有了:

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

术语 P(T+|D+)/P(T+|D-)T+ 的两种可能性之比,我们称之为似然比( LR )。一般来说,可能性比率是特定事件 A 发生的概率除以事件ABB未发生的概率。事件 T+ 实际上是阈值的函数,因为当 h(x) (由分类器计算的点的阳性标记的概率)大于或等于阈值时,分类器预测数据点的阳性标记:

P(T+| D+)= P(h(x)≥阈值| D+)

P(T+| D-)= P(h(x)≥阈值| D-)

因此,对于具有特征 x 的数据点,似然比是假定该数据点的真实标签为正的情况下h(x)≥阈值的概率除以假定该数据点的真实标签为负的情况下h(x)≥阈值的概率。现在还记得我展示了 P(T+|D+) 等于 TPRP(T+|D-) 等于 FPR ,所以我们有:

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

对于对应于 ROC 曲线上一点的每个阈值, TPR/FPR 等于似然比( LR )。这也等于连接原点和该点的直线的斜率。例如,在图 29 中,点 tLR 等于将其连接到原点的蓝线的斜率。

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

Figure 29

这个等式能告诉我们什么?假设我们有一个数据集。我们通常知道 D+ 的先验赔率。例如,考虑图 16 的数据集,其中 25 个点是正的,25 个点是负的。这里:

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

这是我们对 D+ 的先验概率,或者说是我们在观察分类器预测之前的初始知识。请不要混淆 P(D+)h(x)h(x) 是在给定特征 x 的情况下预测正点的条件概率,由分类器*,计算,但 P(D+) 是在开始分类之前,点的实际标记为正而不考虑其特征 x 的概率。现在给我们一个测试点。我们不知道它的 x 值,因此我们也不知道 h(x) 的确切值,但是我们有一个阈值,我们被告知 h(x) > = threshold。这意味着分类器预测该测试点的阳性标签。现在,这个点真的是正的概率是多少?如果我们没有这个预测,我们对这个测试点的最佳猜测仍然是先前的赔率赔率(D+) 。*

但是有了这个预测,我们就可以计算 ROC 曲线上给定阈值的似然比,然后计算后验 odds 也就是 odds(D+|T) 。后验概率可以转换回概率,这是测试点确实为正的概率。现在,再次查看图 19。对于垂直线上的点,如点 B,我们有:

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

因此,通过观察事件 T+ (这意味着分类器预测具有点 B 的阈值的正标签),我们可以 100%确定我们有一个 D+ 事件,这意味着该点的实际标签是正的。这是有意义的,因为高于该阈值的所有点实际上是阳性的(图 19)。

对于像点 D 这样的水平线上的点:

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

所以通过观察一个 T+ 事件或一个 TP 预测与 D 点的阈值,后验赔率或概率变得大于前验赔率或概率。换句话说,这样的观察减少了我们对测试数据点实际标签的不确定性。但是 P(D+|T+) 不像上一种情况是 1。那是因为在这个阈值以上有一些负的点被预测为正的( FP ),有可能我们的测试点就是其中之一。

事实上,对于非理想分类器对角线上方的任何点(如图 19 中的点 C ),我们有类似的情况。对于这样一个点TPR>FPRso1<LR<无穷大,我们得到同样的结果。

对于随机分类器,所有点都在对角线上,因此:

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

随机分类器不会改变先前的概率,并且由于其盲目的性质,它不能改变我们对测试数据点的实际标签的不确定性。对于对角线下方的点,如图 28 中的点 B:

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

我们知道这个分类器给出了一个错误的答案,所以当它预测一个肯定的答案时,更有可能答案是错误的,并且测试点的实际标签是否定的,所以给出这个预测的实际肯定的几率(或概率)变得低于先前的几率。同样,这个观察结果(尽管它是一个错误的预测)减少了我们对测试数据点的实际标签的不确定性。

到目前为止,为 T+ 事件计算了似然比,这意味着h(x)>=阈值。但是,我们可以有其他条件。通常,对于事件 e:

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

推导和前面一样。将 T+ 替换为 e 即可。例如,我们可以有两个阈值 t1t2 ,并计算事件 t1≤h(x) < t2 的可能性。

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

现在我们可以稍微简化一下这个分数。我们知道:

P(t1≤h(x)<T2 | D+)= P(h(x)≥t1 | D+)—P(h(x)≥T2 | D+)

前面说过,*P(h(x)>= threshold | D+)= P(T+| D+)*等于 TPR 。因此

P(t1≤h(x)<T2 | D+)=TPR(t1)**—TPR(T2)

TPR(t1) 表示使用阈值 t1 计算的 TPR 。此外:

P(t1≤h(x)<T2 | D-)= P(h(x)≥t1 | D-)—P(h(x)≥T2 | D-)

=[1—P(h(x)<t1 | D-)]—[1—P(h(x)<T2 | D-)]

但是:

P(h(x)<t1 | D-)= P(T-| D-)=特异性

根据定义FPR = 1-特异性,所以

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

最后,我们有

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

现在,请看图 30。如果我们在 ROC 曲线上有两个阈值为 t1t2 的点,LR 实际上是连接它们的直线的斜率。我们现在可以用这个 LR 来计算 D+赔率

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

Figure 30

我们又有了一个测试点。我们不知道它的 x 值,所以我们不知道 h(x) 的确切值;我们只知道这个测试点的 t1≤h(x) < t2 。*odds(D+| t1≤h(x)<T2)*给出 odds 这个测试数据点在这个条件下确实是正的。

这可以带给我们一个关于 ROC 曲线的结论。LR 实际上是两个条件概率的比值。根据定义,概率是正数,所以比率也是正数。这样一来,任意两点之间的斜率(with 等于 LR )永远不可能是负数,ROC 曲线永远是增函数。

现在,请看图 31。我们在 ROC 曲线上有五个点 t1t5 ,每个点对应一个阈值,这个阈值用相同的名字来称呼。如果你还记得,当我们从 TPR=FPR=0TPR=FPR=1 时,阈值是递减的。所以我们有五个阈值t1<T2<T3<T4<t5

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

Figure 31

t4t5 用垂直线连接。这条线的斜率是无穷大,这意味着 LR 也是无穷大。

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

所以如果一个数据点的 h(x) 位于这个阈值范围内,那么它的实际标号肯定是正的。以图 19 中的点 B 为例,显示了对于这样的间隔,我们只有实际标签为正的点,这是一致的结果。

t1t2 用一条水平线连接。这条线的斜率为零,这意味着 LR 也为零。因此:

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

所以当 h(x) 在这个阈值范围内时,我们就可以确定该点的实际标签为负。以图 19 中的点 D 为例,可以看出在这样的区间中,我们只有实际标签为负的点,这解释了为什么几率为零。

连接 t3t4 的直线斜率远大于连接 t2t3 的直线斜率。这意味着:

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

因此,当 *t3≤h(x) < t4,*数据点的实际标签为正的机会比 t2≤h(x) < t3 高得多。

最后,连接点 t1t5 的线永远是对角线。这条线的斜率是 1,所以 LR 也是 1。结果,LR 不改变后验 odd,并且前验 odd 等于后验 odd。这也是有道理的。记住对于像 t1TPR=FPR=1阈值> 1 这样的点。这是拒绝一切的分类器。此外,对于像 t5TPR=FPR=0阈值=0* 这样的点,因为这是预测一切为正的分类器。所以当我们说 t1≤h(x) < t5 时,意思是 h(x) 可以取 0 到 1 之间任何可能的值。这是一个不添加任何关于 h(x) 的更多信息的条件,因为我们已经知道 h(x) 是一个概率,并且在 0 和 1 之间有界。结果,通过观察这个条件,我们关于测试点的不确定性没有改变。该区间的 LR 为 1,后验概率保持与先验概率相同。*

因此,ROC 曲线也可以被认为是一种显示似然比的图形工具,而似然比是计算后验概率所必需的。一个好的分类器是给出高后验概率的分类器。这意味着当分类器预测一个正点时,分类器是正确的概率很高,并且该点确实是正的。现在,请看图 32。这里显示了三个分类器 ROC 曲线。一种是理想分类器(分类器 A)。其他的都不理想,但是有一个比较接近理想的分类器(分类器 B)。

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

Figure 32

我们知道逻辑回归使用 0.5 的阈值。所以对应于每个分类器的这个阈值的点已经被标绘。连接这些点和原点的线也已经显示出来。如前所述,这条线的斜率给出了该阈值的 LR 。分类器 A 是理想的分类器,斜率是可能的最高值(无穷大)。所以 LR 和后验几率都是无穷大,后验概率等于 1。这意味着当分类器预测到阳性标签时,我们可以确保它是正确的标签。

现在我们比较一下量词 BC 。对于分类器 B ,连接原点到 t=0.5 点的直线的斜率明显较高。这意味着 LR 、后验几率以及后验概率更高(我们假设对于所有这些分类器,我们具有相同的先验几率)。因此,当分类器 B 做出预测时,预测的标签更有可能是正确的。事实上,分类器 B 的预测比 C 更可靠,这使其成为更好的分类器(它也具有更高的 AUC) 。随着 t=0.5 点越来越接近( TPR=1,FPR=0 ),这个斜率越来越大,后验概率也越来越大。

但是 AUC 的统计解释是什么? AUCTPR vs FPR 的曲线下面积。所以数学上:

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

随机变量 X 的累积分布函数( cdf ) 定义为:

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

并且 cdf 与该随机变量的概率分布函数( pdf )之间存在关系:

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

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

类似的等式适用于条件 cdfpdf:

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

现在我们可以根据 cdf: 来写 TPRFPR

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

你可能注意到了,我把 h(x) < t 换成了 h(x)≤t 。如果我们假设 h(x) 具有连续分布,那么 P(h(x)=a)=0 对于任意数 *a、*和多加一个点不改变概率。同样,我们有:

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

现在我们可以写:

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

但是我们知道:

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

现在我们可以在积分中替换它,但是这会把我们的积分变量从 FPR 变成 t ,所以积分的极限也应该改变。我们已经有了 FPR 的 cdf。使用 cdf 的定义,我们有:

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

现在,如果 t=-infinity ,积分将为 1,因为 pdf 被归一化,如果 t=infinity ,积分为零。所以:

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

需要注意的是,当我们用一个 pdf 到*计算 FPR 和 *TPR 时,的阈值范围是从-无穷大到无穷大。这是因为 pdf 不是一个概率,不在零和 1 之间。然而,在代码中,我们使用了 0 到 1.1 的阈值范围。这是因为我们没有使用 pdf 直接计算介于 0 和 1 之间的概率。

现在我们有:

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

现在我们应该用 pdf 替换 G :

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

将其代入 AUC 方程,我们得到:

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

现在我们用一个小技巧来简化它。我们可以将 g 乘以一个系数,该系数可以是 0 或 1:

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

为了进一步简化,我们可以使用指示器功能:

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

事件的指示器函数在事件发生时取值 1,在事件未发生时取值 0。事件 E 的指示函数的期望值等于 P(E) :

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

如果我们回到 AUC 等式,我们看到当 s 在-无穷大和 t 之间或者简单地小于等于 t 时,系数为 0,当 s 在 t 和无穷大之间或者简单地大于*t 时,系数为 1(事实上它大于或等于 t ,但是所以我们可以用事件 s > t 的指示函数来代替。但是 s 是随机变量 h(X)|D+ 的值 t 是随机变量 h(X)|D-的值。所以指标作用是针对事件h(X)| D+>h(X)| D-。*

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

值得注意的是,该指示函数有两个变量,为了计算其期望值,我们应该对 s 和 t 进行积分。最后,通过用指示函数替换虚拟系数,我们得到:

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

但这意味着什么呢?假设我们从带有实际正标签( D+ )的点中随机抽取一个点 x1 ,从带有实际负标签( D- )的点中随机抽取一个点 x2AUC 简单来说就是 h(x1) > h(x2) 的概率。你应该注意到这不是 x1 预测为正而 x2 预测为负的概率。预测是将 h(x) 与阈值进行比较的结果。这里我们只是针对这些点比较 h(x) 。然而,这个概率给了我们一些关于数据集中正负点的可分性的信息。

*请看图 13。对于一个理想的分类器 AUC=P(x1 > x2)=1 。这意味着,如果我们随机选择一个正点和一个负点,正点的 h(x) 将总是更高。这是因为所有的正点都比所有的负点具有更高的 h(x) 。现在,请看图 23。对于随机分类器 AUC=P(x1 > x2)=0.5 。意思是,如果我们随机选择一个正的和一个负的,那么 h(x1) > h(x2)h(x1)≤h(x2) 两者的概率是相等的。这是数据点重叠的结果。对于对角线上方的非理想分类器 *AUC=P(x1 > x2) > 0.5。**AUC 越高,数据集中出现的重叠越少,并且在将最佳 sigmoid 函数拟合到该数据集后,预测正确的标签将更容易。

*如你所见,ROC 曲线的数学理论与我们在前面章节中所学的一致。这里我们假设数据集只有一个特征 *x,并且 xh(x) 都是标量。如果我们有一个以上的特征,那么 x 将是一个矢量,但是 h(x) 仍然是一个标量,这里推导的所有方程仍然有效。

在本文中,我们只使用了 Scikit-learn 的逻辑回归模型。Scikit-learn 有更多的机器学习算法,但绘制 ROC 曲线可以用类似的方式完成。首先,您使用该模型的predict_proba()方法来计算概率。然后你需要将这些概率和真实标签放入metrics.roc_curve()中,以计算 TPRFPR 。您也可以使用计算出的 TPRFPR 通过metrics.auc()计算 AUC。您最终可以使用类似matplotlib的绘图库来绘制结果。

我希望你喜欢阅读这篇文章。如果您有任何问题或建议,请告诉我。本文中的所有代码清单都可以作为 Jupyter 笔记本从 GitHub 下载,网址:https://github.com/reza-bagheri/ROC_curve_article

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值