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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

IBM 和加多图像演示人工智能模型发布任务原型

原文:https://towardsdatascience.com/ibm-and-gado-images-to-demonstrate-ai-model-release-assignment-prototype-17f33345a23c?source=collection_archive---------27-----------------------

系统自动检测图像中可能需要模型发布表单的人

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

New system identifies people who may need a model release form, even if their faces are obscured. Here, the system distinguishes a person from another object (a car). Underlying photo credit Gado Images.

视觉人工智能可以做一些不可思议的事情。2019 年,使用来自多家供应商的现成人工智能和机器学习解决方案,媒体许可方可以自动标记海量图像库,在图像中找到地标或标志,甚至可以获得全文字幕,看起来像是由一个人写的。光学字符识别(OCR)可以从图像中提取文本,即使是手写的,或者是一些微小的视觉元素,如路标,并自动将其翻译成 100 多种语言。

考虑到人工智能仅在几年前所处的位置,这些现成的能力是非凡的。对于许多用户来说,预先训练的模型和现成的解决方案为他们的应用提供了足够多的智能,而且通常成本很低。但是,如果您的解决方案更复杂,并且特定于媒体许可行业,该怎么办呢?

将模型发布形式分配给图像是当今许可行业面临的一个特别具有挑战性的问题。对于用于商业目的的图像(如在广告或政治活动中),图像中任何可识别的人都必须签署一份授权使用其肖像的发布表格。当投稿人向媒体许可方上传新图像时,许可方需要确定该图像是否包含可识别的人,以及这些人是否签署了发布表格。

起初,在图像中寻找人似乎是一项简单的人工智能任务。但是,看看任何主要的图像库,复杂性立刻就清楚了。如果一个人背对着镜头呢?如果他们戴着口罩,或者使用某种设备来部分遮挡他们的脸,比如呼吸器或外科口罩,会怎么样?如果图像使用了像运动模糊或选择性聚焦这样的创造性技术,一些人脸模糊或扭曲了怎么办?所有这些因素使得识别图像中的人,从而分配适当的释放形式,比它最初出现时更具挑战性的人工智能问题。

考虑到分配模型发布的复杂性(以及出错时可能承担的责任风险),许多媒体授权机构会付钱给审查人员,让他们查看收到的每张图片,手动识别人员,并确保每个需要发布表格的人都有一份存档。这既费时又费钱。

这就是定制人工智能解决方案的用武之地。许多供应商提供定制的人工智能解决方案,但该行业中一个突出的参与者是 IBM Watson。自从 2011 年在电视节目《危险边缘》中战胜人类对手以来,沃森一直是全国关注的焦点。从那时起,IBM 已经将 Watson 从一个为特定任务而专门构建的人工智能带到了一个平台,该平台正在各个行业对人工智能和机器学习的实施进行革命性的变革,从制造和建筑到文化遗产和媒体许可。

在 10 月份的 DMLA 第 24 届年会上,作为以谷歌云、Imagga 和 CloudSight 为特色的实用人工智能会议的一部分,加多图像和 IBM Watson 将展示一个新的定制人工智能系统的原型,该系统专门用于为图像分配模型发布表单。该系统将查看一幅图像,自动找到图像中的所有人,无论他们是在看相机(就像在一幅直截了当的肖像中),站在人群中,背对着,甚至穿着遮住他们面部的衣服。仅这一功能就向许多机构的工作流程自动化迈出了一大步。

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

The system has successfully identified a person who would need a model release form for this image to be used commercially. Underlying photo credit Gado Images.

该系统最终将超越这一点,确定人脸是否足够小、模糊或选择性聚焦,从而不需要发布表单。

如果该系统获得成功,它将为定制人工智能解决具体的、具有挑战性的行业问题的能力提供一个很好的例子。

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

Crowd scenes, especially in low light, are challenging, but the system correctly identified the people present in the scene. Some people in the scene are facing away from the camera and are obscured enough that a release form may not be needed. Underlying photo credit Gado Images.

数字媒体许可协会第 24 届 DMLA 年会将于 10 月 27 日至 29 日在加州玛丽娜·德尔瑞举行,而实用人工智能会议将于 10 月 28 日星期一上午 11 点举行。

使用机器学习的 ICC 2019 板球世界杯预测

原文:https://towardsdatascience.com/icc-2019-cricket-world-cup-prediction-using-machine-learning-7c42d848ace1?source=collection_archive---------4-----------------------

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

Photo by Aksh yadav on Unsplash

用数据做很酷的事情

被困在付费墙后面?点击这里阅读完整故事与我的朋友链接!

2019 年 ICC 男子板球世界杯准备于周四(5 月 30 日)开始。第 12 届板球世界杯将在英格兰和威尔士进行近一个半月。本次锦标赛将有 10 支球队参加,他们将在一个循环赛小组中进行比赛,小组赛结束时的前四名将进入半决赛。

预测未来听起来像是魔术,无论是提前发现潜在客户购买你产品的意图,还是计算出股票价格的走向。如果我们能够可靠地预测某事的未来,那么我们就拥有巨大的优势。机器学习只是放大了这种神奇和神秘。

应用程序

体育预测的主要目的是提高团队的表现,增加赢得比赛的机会。一场胜利的价值以不同的形式表现出来,比如涓涓细流渗透到体育场座位上的球迷、电视合同、球迷商店商品、停车、优惠、赞助、注册和保留。

数据

真实世界的数据是肮脏的。我们不能指望像 Kaggle 提供的那样有一个良好的格式和干净的数据。因此,数据预处理至关重要,我怎么强调都不为过。这是最重要的阶段,因为它可能占据整个工作流程的 40%-70%,仅仅是清理要提供给模型的数据。

我从 Crickbuzz 网站上刮了三个脚本,包括截至 2019 年 5 月的球队排名,2019 年世界杯的比赛细节以及每支球队在历届世界杯上的历史细节。我将上述数据存储在三个单独的 csv 文件中。对于第四个文件,我从 Kaggle 的另一个 csv 文件中抓取了 1975 年至 2017 年间比赛的 odi 数据集。在这个文件中,我删除了 1975 年到 2010 年的所有数据。这样做是因为过去几年的结果只会影响我们的预测。由于我没有得到 2018 年和 2019 年的数据,所以这个模型可能不是那么准确,但我仍然相信这给出了一个相当好的想法。然后,我根据我的需要对数据进行了手动清理,以制作一个机器学习模型。

环境和工具

  1. Jupyter 笔记本
  2. Numpy
  3. 熊猫
  4. 海生的
  5. Matplotlib
  6. sci kit-学习

我一步一步地遵循一般的机器学习工作流程:

  1. 数据清理和格式化。
  2. 探索性数据分析。
  3. 特征工程和选择。
  4. 在性能指标上比较几种机器学习模型。
  5. 对最佳模型执行超参数调整。
  6. 评估测试集上的最佳模型。
  7. 解释模型结果。
  8. 得出结论并记录工作。

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

Machine learning workflow

代码在哪里?

事不宜迟,让我们从代码开始吧。github 上的完整项目可以在这里找到

我从导入所有的库和依赖项开始。

然后我加载了包含历届世界杯各队历史详情的 csv 文件。我还加载了包含 2010 年和 2017 年之间比赛结果的 csv 文件。

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

1.数据清理和格式化

接下来,让我们显示印度队比赛的详细情况。

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

接着,我创建了一个专栏来展示 2010 年的比赛细节,并将其作为未来工作的参考。

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

2。探索性数据分析

之后,我把今年参赛的队伍的详细情况和他们过去的成绩合并在一起。

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

我删除了比赛日期、胜算和比赛场地等栏目。这些特征看起来对我们的预测并不重要。

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

3。特征工程和选择

这可能是机器学习工作流程中最重要的部分。由于算法完全取决于我们如何将数据输入其中,因此对于每个机器学习项目来说,特征工程应该被赋予最高的优先级。

特征工程是将原始数据转化为特征的过程,这些特征可以更好地代表预测模型的潜在问题,从而提高未知数据的模型准确性。

特征工程的优势

减少过度拟合:冗余数据越少,基于噪声做出决策的机会就越少。

提高精度:误导性数据少意味着建模精度提高。

减少训练时间:数据点越少,算法复杂度越低,算法训练越快。

所以继续工作,我创造了这个模型。如果团队 1 赢了比赛,我给它分配标签 1,否则如果团队 2 赢了,我给它分配标签 2。

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

然后,我使用 pandas 函数 *pd.get_dummies 将 team-1 和 team-2 从分类变量转换为连续输入。*此变量只有两个答案选择:团队 1 和团队 2。它创建一个由 0 和 1 组成的新数据帧。在这种情况下,数据帧将有一个 1,这取决于特定游戏的团队。

此外,我将训练集和测试集分开,分别占训练集和验证集的 70%和 30%。

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

Train/Test Split

4。在性能指标上比较几个机器学习模型

我使用逻辑回归、支持向量机、随机森林和 K 近邻来训练模型。

随机森林以 70%的训练准确率和 67.5%的测试准确率超过了所有其他算法。

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

Photo by Lukasz Szmigiel on Unsplash

随机森林结合了数百或数千棵决策树,根据一组略有不同的观察值训练每棵树,考虑有限数量的特征来分割每棵树中的节点。随机森林的最终预测是通过对每棵树的预测进行平均而得到的。

RFs 使用随机数据样本独立训练每棵树。这种随机性有助于使模型比单个决策树更健壮,并且不太可能过度适应训练数据。

5。对最佳模型进行超参数调整

Training set accuracy:  0.700
Test set accuracy:  0.675

随机森林模型的流行是由它的各种优势解释的:

  • 在大型数据库上运行时准确高效
  • 多个树减少了较小集合或单个树的方差和偏差
  • 抗过度配合
  • 可以在不删除变量的情况下处理数千个输入变量
  • 可以估计哪些变量在分类中是重要的
  • 为估计缺失数据提供有效的方法
  • 当大部分数据丢失时保持准确性

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

Decision boundary from random forests (as more trees are added)

6。评估测试集上的最佳模型

我们继续。我增加了 ICC 的球队排名,今年优先考虑排名更高的球队获胜。

接下来,我添加了新的列,为每支球队排名,并对前 45 场比赛的数据集进行切片,因为总共有 45 场联赛阶段的比赛。

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

然后,我根据每个团队的排名位置将团队添加到新的预测数据集中。

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

之后,我添加了获取虚拟变量的脚本,并添加了与模型训练数据集相比缺少的列。

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

7。解释模型结果

最后,下面的代码是为了得到每个联赛阶段比赛的结果。

有关结果,请随意参考相应的 jupyter 笔记本。因此,进入半决赛的四支队伍是新西兰、印度、英格兰和南非。

然后我创建了一个函数来重复上面的工作。这是预测 2019 年 ICC 板球世界杯冠军的最终函数。

我运行了半决赛预测功能。

新西兰和印度
冠军:印度

南非和英格兰
冠军:英格兰

因此,进入决赛的两支队伍是印度和英格兰,这是显而易见的,因为他们被认为是今年的夺冠热门。此外,他们是国际商会排名第一和第二的球队。

8。得出结论并记录工作

最后运行主函数。

印度和英国

获胜者:英国

按照这种模式,英格兰很有可能赢得本届世界杯。

本文旨在展示如何使用机器学习来计算模拟中的概率,并不试图实际获得正确的结果,因为使用的数据还不够(或者事件本身根本不可预测)。请把这当成一个教程,用世界杯比赛只是因为这是一个很酷的和最新的主题。应该使用更深入的方法来获得更好的结果,并使它们更有意义。

需要进一步改进的领域

  1. 数据集——为了改善数据集,你可以通过从 ESPN 网站上抓取 2018 年和 2019 年的数据来考虑它们,也可以使用球员的数据来评估每个团队球员的质量。
  2. 尝试更复杂的机器学习算法,如 Xgboost 和微调 hyper 参数
  3. 一个混淆矩阵将会很好地分析模型出错的游戏。
  4. 我们可以集合,也就是说,我们可以尝试将更多的模型堆叠在一起,以提高精确度。
  5. 更进一步,基于玩家统计数据建立一个模型。

参考资料/进一步阅读

[## 为什么随机森林是我最喜欢的机器学习模型

“模特就像一副护目镜。它让某些事情成为焦点。”—我的数据科学导师。

towardsdatascience.com](/why-random-forest-is-my-favorite-machine-learning-model-b97651fa3706) [## 运动成绩预测的机器学习框架

您的浏览器禁用了 JavaScript。请启用 JavaScript 以使用此页面上的所有功能。机器学习…

www.sciencedirect.com](https://www.sciencedirect.com/science/article/pii/S2210832717301485) [## 为什么人工智能在 2018 年 FIFA 世界杯上失败了?

以下是我们从人工智能未能预测 2018 年俄罗斯世界杯结果中学到的东西。

medium.com](https://medium.com/futuristone/artificial-intelligence-failed-in-world-cup-2018-6af10602206a)

在你走之前

github 上相应的项目可以在这里找到。

[## abhinavsagar/ICC-2019-WC-预测

我用机器学习做了一个模型,用 scikit-learn,pandas,numpy,seaborn 和 matplotlib 来预测…

github.com](https://github.com/abhinavsagar/ICC-2019-WC-prediction)

2019 年 15 月 7 日更新 1 —英格兰确实赢得了世界杯。

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

Eoin Morgan holding the trophy

联系人

如果你想了解我最新的文章和项目,请关注我的媒体。以下是我的一些联系人详细信息:

快乐阅读,快乐学习,快乐编码!

ICLR 19 集锦(诸如此类)

原文:https://towardsdatascience.com/iclr-19-highlights-and-all-that-jazz-659c294f991d?source=collection_archive---------30-----------------------

会议关于强化学习、GANs、公平和其他主题的笔记

与 Ofri Mann 的联合帖子

我们去 ICLR 展示了我们在使用不确定性和注意力调试 ML 模型方面的工作。在美妙的新奥尔良的鸡尾酒会和爵士乐表演之间(我们能在 NOLA 举行所有的会议吗?)我们也看到了很多有趣的讲座和海报。以下是我们从会议中得到的主要收获。

主要主题

伊恩·古德费勒在的演讲中对这些主题做了一个很好的总结,他在演讲中说,直到 2013 年左右,ML 社区一直专注于让 ML 发挥作用。现在,在给定足够数据的情况下,它正在许多不同的应用程序上工作,重点已经转向为我们的模型添加更多功能:我们希望它们遵守一些公平、问责和透明的约束,保持稳健,有效地使用标签,适应不同的领域等等。

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

伊恩·古德费勒演讲中关于人工智能主题的幻灯片

我们注意到几个话题引起了很多关注:强化学习,GANs 和对立的例子,公平是最突出的。在训练和优化技术、VAEs、量化和理解网络的不同行为方面也做了大量的工作。

虽然会议的最后一天展示了许多关于不同 NLP 任务的论文,但计算机视觉对我们来说就像是一个已解决的问题,很少有应用的视觉论文。然而,大多数关于优化、理解网络、元学习等的工作实际上都是在图像上完成的。尽管会议的重点是学习表示,但在结构化或表格数据的学习表示方面并没有太多的工作。

下面的笔记是根据主题分类的。

强化学习

有三个研讨会和整个海报会议(约 90 篇论文)致力于强化学习。

今年讨论的一个突出主题是稀疏奖励或无奖励强化学习。这个主题在任务不可知强化学习 研讨会中得到了很好的体现,多张海报和简短的演讲,以及 Pierre-Yves Oudeyer 的精彩演讲,讨论了好奇心驱动的学习,其中信息增益被用作内在奖励,允许算法探索它们的环境并专注于信息增益最高的领域。这些内在的奖励可以和外在的奖励结合起来,几乎不需要明确的练习就能完成任务。在他的演讲中,Oudeyer 展示了机器人如何在没有事先练习的情况下学会操纵环境和执行任务,以及一种新颖的数学教学方法,其中好奇心驱动的算法用于个性化每个孩子的课程,专注于他/她较弱的科目。

另外两个研讨会讨论了 RL 中的结构:

强化学习中的结构&先验 研习班专注于学习结构的不同方式,并将先验引入 RL 任务,以便允许它们从更少的示例中学习,并以更低的计算成本获得更高的泛化能力。

深度强化学习符合结构化预测 研讨会建议将结构预测视为一个连续的决策过程,并专注于利用深度强化学习的进步来改进结构化预测的论文。

生成对抗模型和对抗范例

除了 Goodfellow 的主题演讲(重点介绍 GAN 在不同 ML 研究领域的应用)之外,还有一个完整的海报会议专门讨论 GAN 和对立的例子。这些也在调试 ML 模型 研讨会高度结构化数据的深度生成模型 研讨会安全机器学习:规范、健壮性和保证 研讨会中得到了很多关注。

例如,在他的演讲**“对立例子的新观点”** 中,Aleksander Madry 声称模型从健壮的特征和与标签相关的非健壮特征中学习,健壮的特征捕捉一些对人类可解释的意义。由于非鲁棒特征对于最大化模型的准确性同样有用,所以模型也关注它们。因此,他声称,我们不能指望训练后的可解释性,因为模型的一些预测能力来自于非稳健的特征。我们称这些特性为对立的例子,但是从模型的角度来看,健壮特性和非健壮特性之间没有真正的区别。为了提高可解释性,Madry 提出了一些方法来迫使模型在训练过程中只关注健壮的特征。

公平、问责、安全和人工智能对社会有益

今年有很多(不一定是技术性的)关于公平、安全和人工智能对社会公益的相关问题的讨论。

Cynthia Dwark 做了一个很棒的主题演讲关于算法公平的最近发展,她在演讲中提出了两个公平的概念——群体公平,它解决了不同人口统计群体的相对待遇,以及个体公平,它要求对于给定的分类任务,相似的人应该被该任务的分类器相似地对待。她谈到了与这两个概念相关的挑战,以及最近旨在弥合这两个概念之间差距的工作,强调了多重校准的概念——针对不同的群体进行校准,以及公平的排名和评分。

另一个旨在引发对 ML 中可能存在的危险的讨论的演讲是 Zeynep Tufekci 的“虽然我们都担心 ML 的失败,但如果它(大部分)有效,会潜伏什么危险?”

AI for social good 研讨会的重点是应用人工智能来解决医疗保健、教育和农业等重要的社会问题。 Safe ML 车间,专注于指定系统用途,使其更加健壮并对其进行监控**。ML 车间的再现性和调试 ML 车间(我们在此介绍了我们关于不确定性和注意力的工作),主要关注公平性和可解释性。**

我们认为会议组织者对公平性、问责制和透明度(FAT)的高度重视是公开邀请机构群体参与这一重要讨论,作为主要 ML 会议的一部分。虽然大多数相关论文都发表在指定的会议上,如 FAT conference ,并且今年没有太多相关论文出现在主赛道上,但我们预计这种情况在未来几年将会改变。

我们喜欢的其他东西

除了上述主题之外,还有许多其他有趣的论文。很难从发表在《ICLR 19》上的 500 多篇论文中选出几篇。

针对我们感兴趣的一些话题,我们整理了几个。

迁移学习

伊利诺伊大学的一个研究小组提交了一篇非常有趣的论文,知识流——改进你的老师。该思想是一种新颖的迁移学习方法——“知识流”架构。

在新任务上训练的“学生”网络使用来自一个或多个“教师”网络的中间层权重,在其他任务上预先训练。通过使用可训练的变换矩阵和权重向量,该模型学习每个教师对网络不同部分的学生做出多少贡献。

此外,知识流动损失函数包括学生对教师的依赖,这种依赖随着培训的进行而减少。

使用这种方法,教师对初始培训步骤的贡献很大,允许学生网络的快速“热启动”。当学生在新的任务上训练时,老师的影响减少了,直到最后的训练步骤,当学生变得独立于老师,只使用自己的重量。

这在监督和强化学习任务上都有效,并在几个测试集上取得了最好的结果和更快的收敛。

我们发现另一篇有趣的迁移学习论文是K for the price of 1:Parameter efficient multi task and transfer learning

它展示了迁移和多任务学习的统一框架。这个想法是使用模型补丁——一组特定于每个任务的小的可训练层,与现有层交错。

这些补丁可用于迁移学习,方法是仅微调新任务上的补丁参数,同时使其余预训练层保持不变。对于多任务学习,这意味着除了任务特定的补丁之外,模型共享大部分权重。

不确定性(我们最喜欢的主题!)

深度神经网络的偏差减少的不确定性估计,显示了不确定性估计的类似“过拟合”的现象,在较简单的情况下,不确定性估计在训练开始时有所改善,但在多次迭代后会下降。为了防止这种情况,建议对训练或早期停止的不同检查点进行平均。

用对冲实例嵌入对不确定性建模:如果我们学习概率嵌入而不是学习确定性嵌入,会怎么样?暹罗网络使用建设性损失进行训练,但不是像往常一样输出 z,而是输出期望值和标准偏差,定义表示嵌入的高斯。高斯的大小以后可以作为不确定性估计来处理。

为什么批量归一化工作?

我们有三篇值得一提的论文阐明了批处理规范化是如何工作的:走向理解,批处理规范化中的规范化, 批处理规范化的平均场理论,以及批处理规范化自动速率调整的理论分析

关于出勤的几点思考

听众是学术界和工业实验室的混合体。大量的论文来自行业研究中心——deep mind 大约有 50 篇论文,谷歌大约有 55 篇,微软和脸书各有大约 30 篇。还有相当数量的工作来自工业公司。

我们玩得很开心,带回了许多我们迫不及待要开发的想法!

ICLR 2019:克服有限的数据

原文:https://towardsdatascience.com/iclr-2019-overcoming-limited-data-382cd19db6d2?source=collection_archive---------13-----------------------

从几个例子中学习的论文摘要

上周(5/6/19)标志着学习代表国际会议(ICLR)的开始。因此,我想我会深入研究一些我认为最有趣的 ICLR 文件。这些论文中的大多数都与我个人感兴趣的领域相关(无监督学习、元学习、注意力、NLP),但我选择其中一些只是因为它们在各自领域的高质量和影响力。这第一部分将解决小数据集深度学习领域的突破。第二部分将讨论解决 NLP 和其他类型的序列数据的突破的论文。最后,第三部分将是我觉得有趣的杂七杂八的论文。

迁移、元学习和无监督学习

训练数据有限的问题影响了很多行业,包括医疗保健、农业、汽车、零售、娱乐等。在其他情况下,有很多数据,但是没有注释。由于收集和注释数据的时间/成本过高,这个问题经常成为深度学习集成的障碍。

学习无监督学习规则 s

这篇论文建立在元学习和无监督学习的思想之上。具体来说,该论文提出利用元学习以无监督的方式学习下游任务的有效表示。这篇论文的重点是“半监督”分类,但它特别有趣的是,至少在理论上,学习规则“可以被优化,以生成任何后续任务的表示。”这是有用的,因为在大多数关于表示的无监督学习的工作中,作者定义了特定的训练算法或损失函数。而在这里,模型“*学习【s】*创建由元目标确定的有用表示的算法这些自定义规则通常需要大量的实验和领域知识,因此不容易适应新的领域。这方面的一个例子是使用自动编码器,它通过尝试编码来学习表示,然后解码与原始输出相同的输出。自动编码器通常需要专门的损失函数。

为了准确理解这是如何工作的,回想一下元学习通常有一个内部循环和一个外部循环。在内部循环中,模型处理特定的任务,例如在图像分类中,这可以是识别狗和猫。正常情况下,内部循环将在一定数量的 n 个示例上运行(通常 n 在 1 到 10 之间)。然后,外环将使用来自内环的一些参数(权重本身、累积损失或其他)来执行元更新。这种元更新的细节因模型而异,但它们通常遵循这种方法。

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

Overview of the meta-learning process.

考虑到这一点,他们模型的架构本质上是元学习一种在创建表示后更新内部模型的方法。此规则在创建表示后更新内部模型时有效地取代了 SGD。此外,无监督更新规则在循环结束时更新,这与 MAML 如何更新权重本身或者在 SNAIL 的情况下更新注意力模型的权重形成对比。这意味着这种无监督学习规则不仅可以应用于类似的任务,还可以应用于全新的任务、新的基础模型,甚至是新的数据形式(例如从图像到文本)。

作者首先通过展示先前方法的问题来评估他们的结果。例如,随着时间的推移,VAE 会遭受目标函数(即损失)不匹配的影响,从而导致性能下降。而原型网络传递特征,因此如果任务之间的特征维度不同,它就开始崩溃。相比之下,因为 Metz 等人的方法学习更新,所以在少数镜头分类任务中,它可以比 VAE 更好地概括。他们还在训练元更新时显示,网络可以概括为改进文本分类,即使它只在图像分类任务上训练(尽管他们确实看到,如果元函数在图像分类任务上训练太长时间,因为它过度适合图像任务,则性能会急剧下降)。

总的来说,这是一篇非常好的论文,也是无监督技术的一大进步。尽管它没有设定任何最先进的结果,但它肯定可以应用于许多数据匮乏的领域。这篇论文的作者代码可以在下面的链接中找到。

通过元学习的无监督学习

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

有趣的是,ICLR 今年发表了两篇论文,都提议将元学习和无监督学习结合起来,尽管是以两种完全不同的方式。在本文中,不是使用元学习来学习无监督学习规则,而是使用非监督学习来划分元学习数据集。

这篇论文是我的最爱之一,因为它为没有明确任务描述的元学习打开了大门。元学习的部分问题是,它通常需要非常明确的任务集。这将元学习限制在拥有非常大的带注释的元数据集(已经被划分成不同的子数据集)的领域。这种方法提出将数据集自动划分成不同的子集。作者发现,即使使用简单的无监督聚类算法,如 K-means,元学习者仍然能够从这些任务中学习,并在随后的人类标记的任务中比直接在这些嵌入中学习的方法表现得更好(如无监督学习后进行监督分类的情况)。他们使用的两种元学习技术是质子和 MAML。本文演示了一种有趣的半监督学习形式,其中我们有无监督的预训练,然后是监督学习。在这种情况下,“受监督的”组件正在进行少量的学习。

作者在四个数据集(MNIST、Omniglot、miniImageNet 和 CelebA)上将他们的方法与无监督学习方法进行了比较。最后,他们发现他们的方法比所有其他非监督+监督学习方法都要好,包括聚类匹配、MLP、线性分类器和 KNN。总的来说,这篇论文在使元学习更容易处理各种不同类型的问题,而不仅仅是那些有明确任务划分的问题方面迈出了很好的一步。

【潜在嵌入优化元学习】

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

本文旨在将基于梯度的元学习与潜在表征网络相结合。LEO 分两步操作:首先它学习模型参数的低维嵌入,然后在模型的低维嵌入空间上执行元学习。具体来说,首先给模型一个带有输入的任务 T,然后输入被传递给编码器。编码器产生一个潜在代码,然后被解码成一组参数。关系网络是这个编码器的一部分,它帮助代码变得依赖于上下文。然后在内环中优化这些参数,而在外环中优化编码器、解码器和关系网。作者指出,他们工作的主要贡献是表明元学习在低维嵌入空间中比在高维空间中工作得更好,如 MAML 使用的空间。LEO 在 tieredImageNet 和 miniImageNet 数据集上都取得了很好的实验结果(包括在 1-shot 5 way 基准上令人印象深刻的 61%的准确率和在 5 shot 5 way 上的 77%)。像许多其他论文一样,它只对图像数据进行测试,所以还不清楚它对其他类型数据的推广效果如何。

跨流程转移学习

由于这篇论文的作者已经发布了一篇关于它如何工作的详细的 Medium 文章,所以我不会对技术方面进行过多的描述。在其他元学习论文的大背景下,这篇论文有几个值得强调的部分。首先,它评估了少量学习场景和大量数据场景。这很重要,因为元学习算法通常不考虑元优化在有大量例子时的工作情况,但仍然太少,无法从头训练模型。它还着眼于其他几个尚未探索的领域。具体来说,它解决了“远迁移”这一经常未被充分探索的领域,远迁移是在显著不同的任务之间实现积极的知识转移。

学习深度多维聚类的变分自动编码器中的潜在超结构

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

本文讨论了使用一种新型的变分自动编码器(VAEs)来更好地聚类高维数据。将项目聚类成不同的组是无监督学习中重要的初步步骤。作者指出,许多类型的数据可以通过其属性的许多不同部分进行聚类。作者指出,“LTVAE 产生多个数据分区,每个分区由一个超级潜在变量给出。”

LT-VAE 不仅学习每个聚类的位置以最好地表示数据,还学习它们的数量和底层树的层次结构。这是通过三步学习算法实现的。步骤 1 是编码器和解码器神经网络的传统训练,以改善它们对数据的拟合。步骤 2 是类似 EM 的优化,以在学习后验之前更好地拟合潜在的参数。并且步骤 3 调整潜在先验的结构以提高其 BIC 分数[3],这平衡了潜在后验与潜在先验的参数数量(以及因此的复杂度)的良好拟合。

这种方法的主要优点是,即使总体结果在对数似然性方面不尽如人意,它也能提高聚类的可解释性。此外,基于特定方面进行集群的事实使得它对许多实际应用程序很有吸引力。虽然这篇文章不同于许多其他的论文,并且没有明确地解决少数几次学习的问题,但是我认为它的聚类方法在与少数几次学习方法相结合时会被证明是有用的。例如,它可能被用作“通过元学习设置的无监督学习”中的任务划分

通过元学习进行深度在线学习

本文关注于使用元学习和一个中国餐馆过程来快速更新在线运行的强化学习模型。这是受到这样一个事实的启发:人类经常面临我们以前没有(确切地)经历过的新情况;然而,我们可以利用过去的经验结合新经验的反馈来快速适应。

作者的方法首先利用 MAML 对模型进行初始训练。在 MAML 给出一个有效的先验后,就出现了在线学习算法的使用。在线学习算法利用中国餐馆过程来产生具有适当初始化的新模型或者选择现有模型。然后使用 SGD 根据结果更新模型参数。作者将这种提议的方法命名为在线学习的元学习(简称为 MoLE)。

作者在几个 RL 环境中评估了他们的方法。第一个环境是模拟猎豹穿越不同难度的斜坡。第二个环境是腿残废的六足履带式机器人。MOLe 优于基于模型的 RL、具有元学习的 k-shot 适应以及具有元学习的连续梯度步骤(尽管有趣的是,它仅略微优于具有 ML 的梯度步骤)。

通过最大化迁移和最小化干扰来学会学习而不遗忘

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

当神经网络学习一系列任务时,它通常会遇到一个叫做灾难性遗忘的问题。随着灾难性的遗忘,神经网络不再能够很好地执行它之前被训练的任务。灾难性遗忘可以被认为是迁移学习的一个特例,其中存在显著的负向迁移。迁移学习(正如大多数人所说的)和元学习通常寻求在最终任务上最大化正向迁移,但通常不注意对原始任务的影响。本文试图在他们仍然希望进行正迁移的地方取得更多的平衡,但不能以灾难性遗忘(干扰)为代价。

为了解决这个问题,里默尔等人提出了一种称为元体验回放(mer)的方法。MER 利用标准的经验重放,其中过去的训练示例与当前的训练示例交错,以防止灾难性的遗忘。这些过去的例子给出了较低的学习率。其次,MER 采用流行的元学习算法爬虫对新数据进行训练。然而,MER 将来自存储缓冲器的先前样本与新进入的样本交织到由爬行动物驱动的内部训练循环中,以防止灾难性的遗忘。

我喜欢这篇论文同时探讨了正迁移和负迁移的观点。它在 Omniglot 和强化学习设置上的结果看起来相当不错。然而,特别是在监督分类设置中,作者只对“玩具”数据集进行测试。他们还应该在 CIFAR-10 benchmark、CALTech-Birds 或 CORRE50 上进行测试。在这一点上,当有许多其他更现实的 CL 数据集时,没有真正的理由只在置换 MNIST 或 Omnigolt 上进行测试。另外。我发现他们的一些术语令人困惑,因为作者“重命名”了几个以前命名的概念。此外,理想情况下,在连续学习的情况下,我们不必对任何先前的数据进行再训练(因为再训练增加了计算成本)。然而,所有这一切都是朝着正确的方向迈出的一步,我希望更多的论文关注正向迁移和反向迁移。关于这篇论文的更多信息,IBM 有一篇博客文章代码位于这里

样本高效自适应文本到语音转换

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

这是元学习在 seq2seq 建模中的一个有趣应用。在这种情况下,作者使用元学习来实现对说话者声音的少量调整。这很重要,因为很多时候你可能没有一百个或一千个特定人声音的例子。具体来说,作者扩展了 WaveNet 架构,以便整合元学习。有趣的是,根据作者的说法,MAML 在他们的初步实验中没有产生有意义的先验。因此,他们不得不开发自己的架构。

该体系结构在三个步骤中起作用:(1)在来自各种说话者的文本说话对的大型语料库上训练模型;(2)在来自单个说话者的几个文本说话对上调整模型;以及(3)最后对纯文本执行推理并将其转换成适当的语音。作者讨论了少镜头学习的两种情况:带有嵌入式编码器的参数化少镜头适应(SEA-ENC)和带有微调的非参数化少镜头适应(SEA-ALL)。在 SEA-ENC 的情况下,作者训练辅助嵌入网络,该网络在给定新数据的情况下预测说话人嵌入向量。相比之下,对于 SEA,所有作者一起训练网络和嵌入。在评估中,SEA-ALL 似乎表现最好,尽管作者指出该模型似乎过度拟合了 SEA-ALL。因此,他们建议使用早期停止。(只有在 10s 范围内,他们的模型优于以前的论文)。

这篇论文是一个很好的例子,它将少量镜头学习应用于典型图像分类领域之外的棘手问题,并为其实际工作进行必要的调整。希望在未来,我们能看到更多将少量学习应用于生成模型的尝试。作者有一个网站,你可以在那里演示他们的 TTS 模型,不幸的是,它似乎不包含他们的实际代码。

ICLR 大学其他相关论文的简短摘要

K 为代价 1:参数高效多任务与迁移学习

Mudrarkarta 等人介绍了一种模型补丁,它由少量可学习的参数组成,这些参数将专用于每个任务。这种方法代替了微调网络最后一层的常见做法。作者发现,这种方法不仅减少了参数的数量(从 100 多万减少到 35k),而且提高了迁移和多任务学习环境下的微调精度。唯一的缺点是这个补丁看起来相当特定于架构。

距离度量学习的无监督域适应

尽管这篇论文的第一部分标题是“无监督的领域适应”,但它实际上是针对迁移学习的。回想一下,对于域自适应,目标域通常具有相同的标签集。然而,在这种情况下,作者假设一个未标记的目标域。正如一些评论者指出的,由于这个原因,这篇论文令人困惑;然而,它仍然有几个值得带走。作者提出了特征转移网络 FTN,以分离源领域和目标领域的特征空间。作者实现了跨种族人脸识别的艺术表现。

学习语法引导程序综合的元解算器

本文讨论了如何应用元学习来合成程序。在这本书里,他们构建了一个语法引导的程序,该程序采用一个逻辑公式和一个语法,然后生成一个程序。这是一个很好的应用元学习的例子,超越了典型的少数镜头图像数据集。

深度线性网络中泛化动力学和迁移学习的分析理论

本文探讨了学习和迁移学习的理论。作者声明“我们的理论揭示了知识转移敏感地,但可计算地依赖于[信噪比]和成对任务的输入特征排列。”总的来说,这篇论文对那些喜欢钻研理论的人来说很有趣。

结论

我希望这能很好地概述今年 ICLR 大学的大部分少数几个学习论文(尽管我可能错过了一些)。正如你所看到的,有各种有趣的新技术正在开辟在数据受限的情况下使用深度学习的方法。请继续关注我的三部分 ICLR 系列的第二部分,在那里我将讨论 NLP 的进展(包括面向目标的对话),新的和更好的注意机制,以及一些有趣的新型递归架构。

ICLR 再现性访谈#4: Aniket Didolkar

原文:https://towardsdatascience.com/iclr-reproducibility-interview-4-aniket-didolkar-c0b1c1a15960?source=collection_archive---------28-----------------------

再现 h-分离:朝着更好的优化修改 LSTM 梯度

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

我们对 Aniket Didolkar 的最后采访涵盖了他的工作,再现了一种解决 LSTMs 中爆炸梯度问题的方法。安妮特是 ICLR 再现性挑战中唯一的单独参与者。

继续读下去,看看我们围绕处理长期培训工作的技巧和再现研究时组织的重要性的讨论。

采访摘要(TLDR):

  • 由于时间限制,Aniket 能够从论文作者那里检索代码库,并重现所有实验,除了一个关于图像字幕任务的实验。
  • 对于一个市场来说,再现性意味着拥有关于超参数的细节、调整学习速率、库和包版本、预处理、数据指针等等。以一种有组织的方式与代码库一起工作,并且围绕测试的、失败的超参数有更多的透明度,可以帮助社区更接近可再现性。
  • 如果有更多的资源,Aniket 就不必在实例耗尽之前保存所有数据,也不必重复下载数据。他也会用更多的种子进行实验。注意:作者确实指出训练较慢,因为他们是按顺序训练的(通常 PyTorch 和 Tensorflow 并行发送数据)

再现性报告详情:

团队成员:

面试

>为便于阅读,本次采访经过编辑

Cecelia: 开球。我很乐意让你介绍一下自己。

是的。我的名字是阿尼基特。我是印度马尼帕尔大学的三年级本科生。我第一次对深度学习感兴趣是在去年的第三个学期,从那时起,我在我的大学里选修了很多课程,并参与了一个与机器人相关的学生项目,我还在一家与 NLP 合作的公司实习。这基本上是我在机器学习方面所做的全部工作。

Cecelia: 你是如何发现再现性挑战的?

Aniket: 我是在 Quora 上的一个问题回答中发现的。有哪些对 AI 有贡献的好方法?怎么做才能让自己变得更好?我不记得是谁,但答案是来自 Yoshua Bengio 教授接受这个再现性的挑战。

Cecelia 你为什么有兴趣参加?

因为我实际上对深度学习非常感兴趣,我想做一个好的项目,我认为再现性将是一个非常好的机会,可以对我所做的论文进行大量深入的学习。有时我在读一篇论文,但我不能完全理解它,但实际上进入并实施它有助于更深入、更好地理解它。

Cecelia: 你如何定义再现性?

Aniket: 如果作者报道了某些实验,那么这些实验在任何情况下都应该可以被任何人复制。比如这个问题我觉得我发现了很多。每当我工作的时候,特别是强化学习的时候,会有很多论文,但是你真的不能复制结果,我认为这是一个问题。但是我认为再现性挑战是一个伟大的倡议,因为他们有这样的条件,一些实验,你必须再现它们,这对社区真的很好。

Cecelia: 对于你试图复制并遇到挑战的论文,你遇到了什么样的问题?

Aniket: 举例来说,我在从事强化学习,我们正在研究某些算法,比如 PPO,但我们无法让我们的网络收敛。我们一直在关注报纸,但在某些事情上,他们就是不一致,我们不知道哪里出了问题。我认为最重要的原因之一是没有支持代码。我认为当有代码时,人们很容易在纸上阅读它,并更清楚地理解它。

你认为再现性很重要吗?如果是,为什么?

是的,这很重要,因为研究界不断发表许多新技术和新论文,但他们应该能够将这些应用到现实生活中。有如此多的初创公司正在崛起,行业中有如此多的公司应该能够应用它们,并且许多这些算法应该是可复制的。对其他研究人员来说,在这些算法的基础上进行开发会更容易。

Cecelia: 你能描述一下你选择这份报纸的具体原因吗?

Aniket: 本文基于 LSTMs。这是一种训练 LSTMs 的新算法,处理 LSTMs 中的爆炸梯度问题。我选择这个的原因是因为我觉得和 LSTM 在一起有点舒服。我以前和他们一起工作过,对此我很有信心。我真的很喜欢这个想法——我认为它很简单,我认为它非常有效,我能够重现结果,所以它非常有效。

作者报告说,当 LSTM 的权重很大时,沿着线性时间路径的梯度得到抑制。这条路径很重要,因为它携带了关于时间依赖性的信息。为了防止这种情况,h-分离块随机地渐变通过 h-状态…

你能描述一下你是如何从头到尾复制这篇论文的吗?

Aniket: 基本上,首先我读了论文两三遍,然后我实际上实现了一个较小的版本,我发现它与我之前运行的其他 LSTM 模型相比有点慢,就像通常的 LSTMs 实现是在 PyTorch 或 Tensorflow 中。所以我联系了作者,他们非常友好,给了我他们自己实现的代码库,他们说这很慢,因为他们是按顺序训练的,一般来说,PyTorch 和 Tensorflow 是并行发送数据的。他们这样做是为了确保他们算法的正确性,之后我用了他们的库,因为我可能犯了一些小错误。有了他们的回购,我可以专注于调整超参数和所有。所以我直接使用了他们的回购协议,并进行他们在论文中给出的实验。所以基本上有复制任务,最初给 LSTM 一个特定的数字序列,并要求在特定的时间间隔后复制该序列。有一个连续的 MNIST 任务,其中 MNIST 数据给 LSTM 像素。然后,他们必须进行消融研究,以证明他们的方法与正常的 LSTMs 相比非常有效。事实上,它与另一种称为 c-detach 的算法进行了比较——基本上是分离 lstm 的 c 状态中的梯度,而不是我告诉过你的其他部分。而且,在他们的实验中,他们证明了这真的很有效…有一个实验我没有重现,叫做转移复制任务,因为时间不够。

Cecelia: 从开始到结束——从你看报纸到完成这个挑战——你花了多长时间?

**安妮特:**这花了我大约一个半月的时间。主要的瓶颈基本上是网络的培训。对于每个实验来说,大约需要三四天。

好的。你提到你联系了作者,他们实际上给了你这个代码库,这很好。你知道为什么他们一开始没有在论文中包括代码库吗?

我不确定。是啊。他们没有包括它。他们现在可能已经包括它,但是我还没有检查它。当时,他们没有包括它——我不确定,也没有问他们这个问题。

**塞西莉亚:**明白了。你是通过公开评论与作者交流,还是通过某种方式获得了他们的联系方式?

Aniket: 我得到了他们的邮件信息,我通过邮件联系了他们。

找到你了。好的,看起来一旦你有了代码库,事情就变得非常简单了,但是在你有代码之前,你在试图复制论文时遇到了哪些挑战?

首先,最初我看了报纸。我对算法有一个相当好的想法,但是我不确定我是否完全正确,所以我不得不从头到尾读两三遍。我想出了一个小的实现方案,并对它进行了测试,结果显示效果不错,但我仍然不确定。就像我告诉你的,真的很慢。他们的实现需要三到四天,但我的实现甚至更慢,所以我有点担心,因为我不确定我是否能完成所有的实验。这也是我联系他们,询问这件事的原因。

Cecelia 你将你的实现描述为一个小的实现。你能说得更详细些吗?你说小是什么意思?

Aniket 基本上我所做的就是获取一个样本数据集,我只是在 PyTorch 中实现了他们提到的同一个 LSTM 实现,并直接使用了它。

抓到你了。所以你只是从某处获取了一些样本数据。

但是那时我还没有建立一个合适的知识库来记住所有我必须运行的实验。只是试运行。

Cecelia 那么当他们给你这个他们工作过的仓库时,里面有什么?这只是一个代码,还是他们也包括他们使用的数据?

Aniket 数据是…所以对于复制任务,数据是由代码本身生成的。有了 MNIST,数据可以被下载,下载数据的代码包含在他们的代码中,他们有不同的分支,用于他们独立进行的实验。这相当简单——我克隆了它,它马上就运行了。我不需要做任何改变。

Cecelia 明白了。好在它是可运行的代码。当您最初运行这些实验时,需要三到四天的时间才能完全运行。你最初用什么做实验?

最初,我是在 Google Colab 上运行它们的。

好的,他们使用了什么样的环境?

T21:代码是用 PyTorch 写的,我用起来很舒服。测试代码也在 PyTorch 中。我不确定他们用的是哪种 GPU,但我用的是 Colab。我有一段时间可以在中间使用 GTX 1060,那段时间我使用它,但大多数时候,我使用 Colab。

明白了。你也是…实验一开始进行得很慢,但你会说当你试图复制论文时,你面临着计算极限吗?

是的。例如,主要的事情是它花了三天运行。因此,在一次实验中,Google Colab 只运行了十二个小时。所以我不得不不断重启,保存所有东西,一次又一次地下载数据,这是主要的限制。

**塞西莉亚:**明白了。这真是令人沮丧。如果你有更多的时间或资源,你会做些什么不同的事情呢?

Aniket: 如果我有更多的资源……目前我可以进行实验,但是我只进行了两个种子的实验,而作者报告了许多种子的结果。如果有更多的资源,我会这么做。我会用更多的种子来测试算法。有一个实验(围绕图像字幕任务)我没有重复,如果我有更多的时间,我会做这个实验。

这篇论文的作者似乎很容易接受。

他们非常支持我。我甚至对算法本身和论文中的概念有些怀疑,我只是给他们发了电子邮件,他们给了我一个回复,并对其进行了适当的解释。

Cecelia: 你能解释一下为什么吗,因为其他一些参加挑战的人在 Open Review 上发帖,他们找不到作者的电子邮件。那么,如果你找不到所有这些电子邮件,你会如何尝试与他们沟通?你会在公开评论上提问吗?

Aniket: 我在公开评论上提问时会更加小心。我会试着自己弄清楚,因为这是一个公共论坛,但我很容易就获得了电子邮件 ID,我认为给他们发电子邮件会很容易。

Cecelia: H 完成挑战后,你描述了你之前对再现性的看法,挑战改变了你对机器学习研究的看法吗?

Aniket: 不,没变。我希望机器学习研究朝着我们不断发表论文的方向发展,但我想改变的一点是,每篇论文都应该发布一些代码,以便向人们提供如何使用论文中算法的基本想法。

所以要复制一个实验,你认为代码是必要的吗?

T21:是的,我认为代码或者甚至每篇论文都应该有一个部分来解释他们的方法和一切是如何工作的。

完成挑战后,你会如何以不同的方式对待自己的工作?

是的,我认为完成这个挑战后,我会做的不同的是,每当我开始做某事时,我会尝试首先创建一个存储库,组织它,并从项目开始到结束保持它的组织性。所以这是我从做这个项目中学到的一件事——以一种更有组织的方式使用你的代码库。

Cecelia: 那么如果你现在就开始建立一个存储库或者推荐一个存储库结构,那么这个存储库中会包括什么呢?

Aniket: 所以基本上不同的分支都有我要报告的每个实验的代码。无论我的算法需要什么数据,指针都应该有数据和下载方法,以及数据需要的任何预处理。我认为任何 NLP 项目的代码库都应该有预处理步骤。

你认为如果你与多人合作,或者如果你有一个团队,你的体验会有所不同吗?

如果我们有一个小组,我们可以做更多的实验,但这是唯一的事情:我们可以做更多的实验。但除此之外,我不认为会有任何不同。

Cecelia: 你认为什么将有助于使机器学习研究更具可重复性,并且接下来——可以说是框架第一个问题——你认为研究人员今天在使他们的工作可重复性方面面临的挑战是什么?

我认为在机器学习方面有很多事情需要收敛:这些小的超参数会产生很大的影响,你如何调整学习速率等等。所以我认为这是再现性的主要障碍之一。有时候代码库——我也遇到过这种情况,我见过一些人——是如此的混乱,以至于他们实际上并没有发布它。其次,有很多东西你必须从外面进口,你必须使用不同的软件。这对于开源代码来说可能是不可行的。包含如何运行它的文档会非常冗长。有时运行任何一段代码都会发生这种情况,这取决于你使用的软件和不同的版本。报告所有这些有时会非常冗长,这就是人们不开源代码的原因。

Cecelia: 你描述了几个不同的挑战——围绕所有超参数、外部导入的事情,就像所有这些细微差别一样——你会将这些细节视为代码的一部分还是代码的外部?

我认为,有时当人们展示他们的结果时,他们只会展示某一组超参数,而不会谈论他们尝试过但失败了的其他超参数。对于我的论文,作者尝试的超参数在同行评审网站上,而不是在论文或代码库中。当我开始复制这篇论文时,评论还没有公开,随着时间的推移,它们堆积了起来。

Cecelia: 对,所以最初的讨论很有帮助。你认为有什么工具或最佳实践可以让这个过程变得更容易、更好吗?

Aniket: 我不认为有固定的最佳实践,但这一倡议,可再现性挑战,可以在每个会议上进行,而不仅仅是在 ICLR,进行适当的审查应该是所有主要会议都可以采用的实践。

你认为机器学习的某些领域比其他领域更容易重现吗?

从我的经验来看,我认为每当我从事 NLP 或计算机视觉之类的工作并完成某篇论文时,我都能够重现它,但当我从事强化学习时,我会遇到很多问题。

你认为这是为什么?

我不确定实际上是什么,但确实是个东西。我没有答案。我不是很确定,但是我观察了很多次。我认为这可能是由于 RL 算法难以理解,但如果提供支持代码,就更容易理解这篇论文。此外,有时在一种环境下运行良好的算法在其他环境下并不运行良好。因此,我认为研究社区专注于构建 RL 算法非常重要,这些算法可以在不同的环境中进行归纳并给出一致的结果。

有兴趣了解更多关于再现性挑战的信息吗?点击阅读我们的开篇文章

想了解 Comet 如何帮助你跟踪、比较、解释和重现你的机器学习实验吗?了解更多

深度预后:预测 ICU 的死亡率

原文:https://towardsdatascience.com/icu-mortality-5d0e80539b9e?source=collection_archive---------31-----------------------

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

在医学院,我们学习识别实验室异常,它们的原因和治疗。当观察到患者的血钾为 5.5 毫摩尔/升时,医生可以迅速确定罪魁祸首(如肾衰竭、急性肾损伤、ACE 抑制剂诱导等)。)根据患者的病史和表现。

对提供者来说,更困难的问题是:这位患者的高钾血症究竟如何影响她未来的健康结果?如果病人的钾是 5.2 而不是 5.5 mmol/L 会怎样?如果她的血钾在 3 天内而不是 5 天内从基线水平上升会怎样?如果她有慢性肾病病史呢?此外,病人“问题清单”上和她过去病史中的所有其他项目如何影响她的结果分布?如果它们的相互作用不仅仅是相加的呢?我们有希望理解成百上千个因素之间的相互作用吗?这些因素决定了一个病人的结果。

如果我们希望成功,我们应该关注复杂的患者,他们可能提供最大的洞察力和机会。重症监护室(ICU)里的病人是医院里最复杂的病人。在我用于这个项目的数据集中,仅在 ICU 时,平均每个病人就被赋予 13 个独特的 ICD-9 诊断代码。这些患者在医院中死亡率最高:美国每年有 400 万 ICU 入院,其中约 50 万导致死亡。他们的护理是最昂贵的:使用包括机械通气、透析和输液在内的强化治疗,住在 ICU 每天的费用可能超过 10,000 美元。对于这个项目来说,最重要的是,这些患者产生了大量的数据——生命体征、实验室结果、干预措施、进度记录等。

有可能用这些丰富的数据来预测这些患者的存活率吗?

这种模型将能够回答上述难题。此外,它将提供一个单一的指标,病人的敏锐度,可以很容易地解释由大型和各种医院团队。它将提供客观的信息,有助于提供者、患者和家属之间的临终讨论。重要的是,该工具可以保持灵活性,以便它可以预测死亡以外的事件。

数据:预处理和特征工程

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

Overview of the Data

我在这个项目中使用了 eICU 合作研究数据库。由麻省理工学院管理,由 Physionet 发行,它是公开的,在访问之前只需要 HIPAA。它是在两年多的时间里(2014 年和 2015 年)从美国各地的 ICU 收集的,包含了超过 200,000 名 ICU 住院患者的大量数据。在这些住院病人中,超过 10,000 人的住院导致了死亡。

数据预处理

首先,将 16 岁以下的患者和在 ICU 停留不到 7 小时的患者从数据集中剔除。

每种类型的数据集都需要不同的清理步骤:诊断、治疗、既往病史、周期性生命体征、非周期性生命体征和实验室结果。每一个都是根据需要独立加载和预处理的。

为了训练该模型,需要识别阳性和阴性患者,并且需要保存这些事件的时间点以用于以后的特征提取。因为我选择保持模型的灵活性,所以需要不同的标注算法来识别数据集中的死亡率和其他事件。在死亡率预测的情况下,所有过期的患者被识别,并且该患者的最后事件(治疗或诊断)被用作时间戳。在诊断的情况下,仅选择在入院后三个小时以上收到该诊断的患者,并将该诊断的第一个实例用作时间戳。

特色工程

在选择阳性和阴性患者后,为所有这些例子生成特征向量。我使用了三类数据——分类数据、数字数据和序列数据。

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

分类特征包括种族、性别、入院单位等。这些是一次性编码的。

数字特征代表了特征工程工作的大部分,包括生命体征、实验室结果和静态值,如入院体重。我在这里创造了 66 个特征,运用了我的医学教育。例如,一个特征是血尿素氮(BUN)与血清肌酸酐的比率,其用于指示急性肾损伤的位置。对于每个特征,最大值、最小值或平均值是在三个窗口之一上计算的,即“当前时刻”(即预测时间点)之前的 4 小时窗口,从入院到当前时刻的窗口,或持续入院前六个小时的基线窗口。其他特征,如尿素氮与肌酐的比率、肌酐相对于基线的变化或动脉与吸入氧的比率(PF 比率)都是从这些第一特征中计算出来的。这些特征允许有缺失值,尽管缺失最大数量特征的 10%的示例被移除。剩余的缺失值将替换为特征平均值并进行缩放。

最后,顺序特征包括过去的病史诊断(以英语给出)、直到当前时刻在 ICU 中给出的诊断(以英语和 ICD-9 代码给出)以及直到当前时刻的治疗和诊断干预。在将所有过去的病史诊断翻译成通用语言 ICD-9 代码后,所有这些事件都按时间戳排列——按照它们实际发生的顺序。

多模态深度学习模型

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

A flexible, multimodal model for predicting diagnoses or survival from ICU data.

我选择按顺序对每个病人进行诊断和治疗,以保留我认为重要的临床模式。例如,一个有恶性肿瘤病史的病人,现在有单侧腿部肿胀,相对来说很可能被诊断为肺栓塞。

我需要一个尊重顺序信息的模型架构,所以我使用了一个长短期记忆(LSTM)网络,它有一个双向包装器和 32 个单元。我还希望模型能够学习每个诊断和治疗的表示,所以我使用了一个包含 32 个元素向量的嵌入层,模型在训练时会学习这些向量。

使用三个 16 单元隐藏层,如通过超参数调谐所确定的,RNN 实现了 0.85 的 ROC 曲线下面积(AUROC)。

接下来,我只对分类数据和数字数据训练了一个 DNN。三个隐藏层各有 32 个单元,每层之间有 50%的压差,在这里效果最好,经过特征选择和工程设计,DNN 达到了 0.87 的 AUROC。

为了将两个模型结合起来,我去掉了每个模型的最后一层,并将输出连接起来。该层用作 3 层 64 单元 DNN 的输入。来自分类/数字 DNN 的附加辅助输出确保网络的一部分学习对最终任务有用的表示。那么复合模型表现如何呢?

结果

在最后的时间点,复合材料模型达到了 0.91 的最先进的 AUROC。但是,即使距离最后一次观察还有几天,该模型也表现良好——可靠地识别出预后最差的患者。

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

At every timepoint, the composite model performs best. Even days out, the model performs well.

如果我们观察一段时间内单个患者预测的例子,我们可以看到模型如何对新信息做出反应:

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

The model recognizes a patient’s worsening clinical picture.

随着患者的临床状况随着一系列不吉利的事件(中风、呼吸衰竭、肺炎、休克)而恶化,该模型正确地提升了其输出,表明分数可以被视为严重性指数。

查看模型已经学习的嵌入的第一个主要组件的表示,我们看到一个有趣的模式:

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

升压药在最右边——去甲肾上腺素,血管加压素,去氧肾上腺素。机械通风也在那里。这是有道理的,因为血液动力学不稳定和通气应该是预后不良的标志。

但是如上所述,我希望模型保持灵活性——这样新的模型就可以通过改变诊断来训练。

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

Training a new model is as easy as changing one input.

我包括了各种各样的特征——肾、肺、肝和心血管——因此该模型在其他诊断中表现良好。

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

The model performs well across a variety of diagnoses.

结论

总之,我为提供商、医院和保险公司建立了一个多模态、灵活的深度学习模型和工具,它不仅可以为患者的严重程度和死亡可能性提供单一指标,还可以预测其他事件。

我在这个项目中获得了很多乐趣。感谢阅读!

莱姆和 SHAP 背后的想法

原文:https://towardsdatascience.com/idea-behind-lime-and-shap-b603d35d34eb?source=collection_archive---------2-----------------------

ML 解释模型背后的直觉

在机器学习中,在模型复杂性和模型性能之间存在权衡。复杂的机器学习模型,如深度学习(其性能优于线性回归等可解释模型),已被视为黑盒。Ribiero 等人(2016 年)题为“**我为什么应该相信你”**的研究论文恰如其分地用 ML 黑箱概括了这个问题。模型可解释性是一个不断发展的研究领域。请在此阅读了解机器可解释性的重要性。这篇博客讨论了石灰SHAP 背后的 理念

这个博客不是关于如何使用/编码/解释莱姆或 SHAP 的(这方面有很多好的资源)。这些资源显示了如何单独使用给定自变量的石灰和 SHAP 值*(一个数据点的一个变量对应一个石灰/SHAP 值*)。这个博客是关于理解 我们是如何得到这些值的,以及我们在使用石灰和 SHAP 库 时实际在做什么。先跳石灰再跳 SHAP,几个引物比较好理解。

本地与全球可解释性

在线性回归模型中, Beta 系数解释所有数据点的预测(如果变量值增加 1,则每个数据点的预测增加 Beta )。这是全球保真。在因果分析中,它被称为“平均”因果分析。但是,这并不能解释个体差异(异质性)。一个变量对一个用户的影响可能不同于另一个用户。这就是局部保真度(对独立变量联合分布的单个数据点或局部子部分的解释)。局部函数解释(预期的)可能比全局解释更准确,因为在局部区域,函数(更高的概率)是线性和单调的。甚至局部区域也可能是高度非线性的,并且局部可解释性将失败——这些方法的限制。(这也是平滑度假设的一部分——没有平滑度假设,很多情况下都无法实现,因为很多优化模型都会失败)。莱姆和 SHAP 探索并使用局部可解释性的属性来构建黑盒机器学习模型的代理模型,以提供可解释性。图 1 中的几个例子。

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

Figure 1. Global vs Local and Surrogate model

代理模型

莱姆和 SHAP 是代理模型(图 1)。这意味着他们仍然使用黑盒机器学习模型。他们稍微调整输入(就像我们在敏感度测试中做的那样)并测试预测中的**变化。这种调整必须很小,以便它仍然接近原始数据点(或在局部区域中)。莱姆和 SHAP 模型是替代模型,用于模拟预测中的变化(根据输入的变化)。例如,如果通过调整变量的值,模型预测没有太大变化,则该特定数据点的变量可能不是重要的预测值。因为代理模型仍然将 ML 模型视为黑盒,所以这些模型是 模型不可知的 。****

可解释的数据表示

必须将数据点转换成一种更易于构建代理模型的格式(在原始数据点附近采样数据点)。这种表示被称为可解释的(在 LIME paper 中),因为它是人类可以理解的(它将数据转换为二进制)。如图 2 所示,x: d 维数据转换为*x:*d '-维 二进制矢量数据用于其可解释性表示。图 2 给出了一些例子。图 2 还展示了 LIME 如何在代理模型中使用可解释的数据格式来提高可解释性。目标(粗略地)是最小化 x 和它的邻居之间的响应(预测)差异。

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

Figure 2. Interpretable data format and LIME as a surrogate model

石灰

现在我们有了了解石灰的背景。如果我们选择一个点 x,我们可以通过关闭一些二进制维度(来自 x’)表示(通过邻近度测量加权)来围绕 x 绘制个样本(z’)。一旦我们得到了样本,从 z '中恢复一个变量 z。比如 (1) 设 f(z)是检测一个句子是否可恶的深度学习模型。我们的数据集包含句子。 (2) 如果我们考虑一个数据点(一个句子 x),我们先把它转换成 x’(单词有无)的格式。 (3) 从 x’开始,我们在 x’的邻域周围采样 z’(通过均匀地关闭一些二元向量)。 (4) 这些样本转换成 z(句子恢复)。在 z 中,有些单词可能不存在。 (5) 用 z 作为输入,得到值 f(z)。图 3 显示了一个采样示例。它还包括什么是单个数据点(和每个变量)的 LIME " " 以及我们如何获得它。它展示了我们如何从一个变量的局部重要性(可解释性)得到全局重要性。粗略地说,这意味着将局部权重相加,从而最大限度地覆盖关闭的维度(当我们穿过 SHAP 时,记住这一点很有用)。如前所述,有很多好的资源告诉我们如何使用(或解释)这些价值观,所以本博客不会涉及这些内容

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

Figure 3. Example of sampling in the neighborhood of a data point x and Getting the LIME values

石灰的缺点

虽然 LIME 具有可加性(单个影响的总和等于总影响)这一理想属性,但它在缺乏稳定性、一致性(如果变量的贡献增加或保持不变,改变模型不会减少变量的属性)和缺失(缺失变量的属性应为 0)方面受到了一些批评。所有这三个属性都由 SHAP 实现(因此更常用)。还有,LIME 需要定义“本地”。

SHAP

**SHAP 值使用与石灰相似的概念。SHAP 基于沙普利值的博弈论概念提供了理论保证。请看 这段 **关于 Shapley value 的短视频阅读前进一步了解 SHAP。Shapley 值的理论背景也可以看这个

SHAP 代表上海、应用、T2 和 T4。“添加剂”是一个重要的关键术语。像石灰一样,SHAP 具有加性属性。一个数据点的所有变量的 SHAP 值之和等于最终预测值。如图 4 所示,只要记住石灰,就可以理解 SHAP。图 4 显示了 SHAP 值是如何计算的。在 SHAP,我们不需要建立一个局部模型(像 LIME 中的线性回归),而是使用相同的函数 f(x)来计算每个维度的 shapley 值。

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

Figure 4. SHAP calculation

Shapley 值保证每个变量的公平分配(LIME 不提供这种保证)。莱姆假设局部模型是线性的,SHAP 没有任何这样的假设。SHAP 值计算非常耗时(因为它检查所有可能的组合:它通过蒙特卡罗模拟而不是蛮力来完成)。SHAP 值是而不是有和没有变量的预测之间的差,而是变量对实际预测和平均预测之间的差的贡献。通过将每个单独数据点的 SHAP 值的绝对值相加,给出了全局级别的变量重要性。虽然 SHAP 使用了所有的变量,但如果我们想减少变量的数量,我们可以选择一些变量重要性更高的变量,丢弃其他变量并重新运行 SHAP(因为像一致性这样的属性,变量重要性的顺序不会改变,所以不太重要的变量可以忽略)。

最后的话

我希望我们在莱姆和 SHAP 所做的事情的背景更加清晰。两者都是模型不可知的,并且该库可用于标准的机器学习模型。由于其理论保证和简单性,SHAP 被广泛使用,也许更容易接受[6]。现在,我们需要定义我们是如何看待一个“邻居”的。此外,我们构建了一个线性局部模型,它在一个非常复杂的决策面中可能不是线性的(甚至在局部级别)。在 SHAP,我们可以使用使用训练数据训练的相同模型。

参考

这篇博客摘自里贝罗等人的论文
【1】莱姆
【2】SHAP伦德伯格和李

以下与本博客一脉相承,从较低层次解释石灰与 SHAP:
【3】石灰前必读
【4】SHAP 前必读
【5】关于石灰的中等博客由 Lar

关于我们为什么要考虑可解释性的其他来源:
【6】H20 视频
【7】Scott Lundberg 的博客
【8】白盒 vs 黑盒

这个博客不是关于如何使用莱姆和 SHAP 图书馆或者如何解释他们的结果。你可以在以下网址找到如何使用它们:米格尔的
【9】中型博客
【0】中型博客

想法:数据冲刺的设计方法

原文:https://towardsdatascience.com/ideas-design-methodologies-for-data-sprints-9d10a32090e4?source=collection_archive---------17-----------------------

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

Photo by William Iven on Unsplash

我最近在一个研究实验室呆了四天,与一群数据科学家和一些行为科学家一起深入一个庞大而杂乱的数据集,看看我们是否能找到与群体动力学相关的见解。它被设计为一个初步的潜水,四处看看,对有用的研究见解的潜力进行初步评估,然后根据那周的发现建立一个两到三个月的工作提案。

理论上,我是以行为科学家的身份参加的,但由于我也痴迷于创造性的问题解决过程,或设计思维(我非常固执己见),以下是对我们使用的过程的一些反思和下一步的想法。

大量的过程方法论占据了软件开发、数据分析和创造性问题解决学科之间重叠的空间:UX、设计思维、思考错误、谷歌设计冲刺、敏捷、看板、用于小组冲刺的新兴数据分析方法等。这很棒,因为如果你很好奇,你可以获得一个相当大的工具集,让一群人聚在一起,在不同的时间内对各种不同类型的问题进行创新——从两个小时的会议到 18 个月的项目。挑战,或者说作为一个主持人对实践的掌握,不仅仅是学习方法论或练习本身的术语,而是学习群体动力学、创造力、心理学和神经科学背后的潜在科学。

在这次研讨会期间,我们有两种不同类型的专业人员在房间里——社会科学和数据科学,每一种在这些分组中都有互补的技能组合。它们对数据集来说都是全新的,当我们第一次看它时,它相当混乱。sprint 赞助商的指导非常广泛,在为期三天的 sprint 中,我们可以了解到这些员工对团队动力的总体认识。

不幸的是,直到第二天下午,我们才清楚地确定了什么样的见解最有用的方向。在那一点上,社会科学组分开来头脑风暴一系列不同的问题,可以问关于群体动力学,以及哪些理论和研究问题正在成为该领域特别感兴趣的问题。除了确保整个团队对研讨会的方向有一个清晰的想法,以及关于团队动力的什么问题主题是最有用的(即小型工作团队的表现,团队组成随时间的变化,在聚集在一起的人群中寻找模式,等等)我们也需要设计约束,但是没有识别它们。介绍设计思维使用一般的文氏图来说明设计必须成功满足的标准,以获得资金/努力开发高保真解决方案的许可。各公司制定了自己的特定标准,这些标准通常属于这些范畴。在没有确定我们自己的情况下,团队依靠聚集在房间里的人的专业知识和直觉。不错——每个人都非常聪明,非常了解自己的领域;但如果你想最大限度地利用资源来理解最重要/最有影响力的问题,这并不太好。

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

via Legacy Innova

在前两天,我们的主持人采用了 UX 和设计思维练习——人物角色和需求陈述。他们的目的是让小组确定具体的问题,然后由整个团队投票决定。第三天,几个小组被分开,每个小组回答一两个可能会被问到的数据问题。通常,人物角色和需求陈述是一种非常可靠的方法;他们在各种情况下工作。但是在这个冲刺阶段,许多人发现当他们被告知要寻找关于群体动态的洞察力,而不是个人角色时,他们感到沮丧。

人物角色方法的第一个挑战是,它们被设计为与深思熟虑的思维模式或系统 2(从快速思考和慢速思考)一起使用,该系统 2 获取各种各样的、看似不相关的信息——通常是定性的人种学——并将其综合以得出一些详细的需求陈述。由于事先没有关于数据集中的人的信息,我们只能查看原始数据的电子表格,并将卡通人物虚构为角色。整个团队勇敢地去做,并试图利用它,但时间可以更好地利用。

关于选择人物角色方法的第二个挑战是,它们应该在设计过程中使用,而设计过程的结果是为原型个体服务的产品或服务。人物角色的问题和解决方案——解决人物角色的需求——之间有关系。对于本次研讨会,我们的团队并不打算生产产品或服务,而是交付见解。而不是人物角色,我们应该探索和绘制群体动力学的复杂概念的空间。

在这个工作坊中,一些设计思维/ UX 方法的笨拙使用和对其他方法的拒绝是完全可以理解的。随着设计冲刺成为一种受欢迎的、合理的工具,让企业将多学科团队聚集在一起,开发新颖的概念和产品,设计和软件开发方法的广阔空间已经进入了一个陌生的领域——数据分析。虽然我对评论设计方法很有经验,但数据科学对我来说还是一个新领域。根据我所做的文献综述,以及分析团队有限的商业经验,似乎他们自己也在纠结什么方法最适合群体数据冲刺。传统上,分析是单独进行的,或者并排进行,不需要更正式的团队流程。三种力量正在推动数据科学家开发群体分析方法:数据科学领域随着专业化和工具数量的不断增加而分成两个部分,数据量呈指数级增长,数据科学正在向以前使用几乎无处不在的定性方法和工具进行分析的学科蔓延,因此多学科团队正在成为常态。在过去的五到七年里,有几篇学术文章和博客描述了群体数据分析过程。

我的博士研究包括开发一个联合设计过程,利用 3D 数据可视化软件来分析一个复杂的概念——幸福。我一直在思考我们如何让团队一起调查和交流复杂的概念,团队和个人的早期工作需要发现,以便最终做政策,服务和产品设计。试图理解复杂的系统和复杂的概念是一件完全不同的事情,甚至比综合人物角色细微的心理和社会需求还要难。口头文化有非常不同的思考和讨论复杂性的方法,我相信我们西方占主导地位的,有文化的,技术文化有很多东西可以向他们学习,关于如何分析复杂性。

我想把这些想法提供给多学科团队,他们致力于在庞大、杂乱的数据集中发现真知灼见。我很好奇其他人在做什么,并希望得到一些反馈。

首先,这是我用来组织设计冲刺的框架,围绕着解决特定原型人物角色的特定需求。四个象限对应于通常与设计思维相关的四个阶段:采访和观察用户,需求综合,构思,原型和测试。我发现这有助于我作为一名辅导员理解我试图引导我的参与者练习不同方法的思维模式。将思考模式与问题和解决方案之间的清晰界限结合起来也是有帮助的。试图同时对问题和解决方案进行头脑风暴是一种混乱的方法,会偏离轨道。这个 2x2 的框架在为围绕理解用户需求和开发一些东西来解决它的研讨会设计练习时最有用——一个软件产品界面,一个家庭用品,一个社会服务。

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

复杂性,即群体动力学,需要一个不同的框架来思考在冲刺阶段选择哪种方法和使用哪种思维模式。在我们的 sprint 中,工作围绕着获得洞察力、提炼原始数据集和梳理复杂的主题。再次使用 2x2 矩阵,复杂的概念和原始数据集在其中一个轴上代替了问题和解决方案。对于第二个轴,我们可能会使用不同的闪耀和聚焦模式,而不是那些服务于思考个体原型的定义需求的模式,两个例子是归纳/演绎和陈述/模态。Rottman 商学院的 Mihnea Moldoveanu 博士领导了一项长达十年的研究工作,以了解超越学科界限的思维模式或适应性智能。他的训诫本质上是有意识地选择最适合问题和手边人群的思维模式,或思维模式的模式。

另一个数据冲刺的一组假设的方法可能是:1)绘制与所讨论的复杂概念相关的尺度、层和理论,2)向下选择最重要的一组主题或元问题来询问数据集,3)对原始数据集的探索性分析,4)开发一个模式并开始清理数据并将其组织到一个易于访问的数据框架中, 5)分成小组,每个小组处理一个主题或元问题,并使用交替闪烁和集中的思维模式,如归纳/演绎和陈述/模态,以迭代方式分析数据,开发假设性见解,并通过更多的数据分析来完善它们。

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

这个方法论空间——尤其是 sprint 方法论——使用多学科团队来询问大数据集的复杂问题,确实令人兴奋。我们的政策制定者、科学家和研究人员所面临的许多最有趣的问题都坐在传统上不必找到共同语言就能合作的领域的交叉点上的大量数据上。主持人、数据科学家和设计从业者可能会开发出新的理论,说明如何更好地组织团队,以便更快、更有效地从大型、混乱的数据集中获得洞察力。不可避免地,有人会试图用漂亮的图形图标和简化的描述来将它商品化。但现在这是一个有趣的、协作的社区探索空间,因为我们想出了如何将更多的学科和专业与数据科学家和原始数据结合在一起。

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

Photo by Startaê Team on Unsplash

使用词云识别热门话题

原文:https://towardsdatascience.com/identify-top-topics-using-word-cloud-9c54bc84d911?source=collection_archive---------8-----------------------

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

Photo by AbsolutVision on Unsplash

我最近在处理文本数据时发现了单词云。我真的很着迷于它们是如何通过一张图片揭示如此多的信息,以及它们是如何通过一个轻松创建的。因此,我决定做一个快速项目来理解它们。

单词云或标签云是词频的图形表示,对在源文本中出现频率更高的单词给予更大的重视。— 更好的评估

基本上,单词云以云的形式显示一组单词。一个单词在文本中出现的频率越高,它就会变得越大。因此,通过简单地看一看云,你就能识别出关键词和热门话题。

词云使用的众多领域

我发现云这个词实际上可以用在很多领域。其中一些是:

  1. **社交媒体上的热门话题:**如果我们可以阅读并获取用户发出的帖子/推文的文本,我们可以从中提取热门词汇,并可以在趋势部分使用它们来分类和组织各个部分下的帖子/推文。
  2. **热门新闻话题:**如果我们可以分析各种新闻文章的文本或标题,我们可以从中提取出热门词汇,并确定一个城市、国家或全球最热门的新闻话题。
  3. **网站导航系统:**每当你访问一个由类别或标签驱动的网站时,实际上可以创建一个词云,用户可以直接跳转到任何主题,同时知道该主题在整个社区中的相关性。

项目—发现热门新闻话题

我做过一个项目,从这里的获取新闻文章的数据集,并根据新闻文章的标题创建一个单词云。完整的代码以 Jupyter 笔记本的形式出现在 Word Cloud repository 中。

导入库

当使用导入库时,我发现我没有包wordcloud。Jupyter 提供了一种在笔记本内部执行命令行命令的简单方法。只需在命令前使用!,它就会像在命令行中一样工作。我用它来得到wordcloud包。

!pip install wordcloud

我现在有了我需要的所有库,所以我把它们都导入了。

我们让库numpypandasmatplotlibcollections使用 Counter 和wordcloud来创建我们的单词云。

使用数据集

首先,我首先将数据集文件导入 pandas 数据帧。注意,为了正确读取,该文件的编码是latin-1。然后,我输出列名来识别哪个与标题匹配。

我们可以看到有 6 列:作者、日期、标题、read_more、text 和 ctext。然而,在这个项目中,我将与头条新闻。因此,我使用lower()方法将所有的标题转换成小写,并将它们组合成一个变量all_headlines

词云

现在,我们准备创建我们的单词云。做了一轮分析后,我确定其中一个顶上的词是will。但是,它没有提供关于该主题的任何有用信息。因此,我将它包含在停用字词集中,以便在从标题中识别顶部字词时不考虑它。

然后,我使用这些停用词调用WordCloud方法,将输出图像的背景设为white,并将最大字数设为1000。图像保存为wordcloud

我用rcParams来定义图形的大小,并将axis设置为off。然后我用imshow显示图像,用show显示图像。

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

Word Cloud

从图像中,我们可以清楚地看到前两个话题分别为IndiaDelhi。可以清楚地看到,词云对于识别文本集合中的顶级词是多么有用。

我们甚至可以使用条形图来验证热门词汇。

我首先从组合标题中分离出所有单词,同时避开停用词,从而得到filtered_words。然后,我用Counter来统计每个单词的出现频率。然后,我提取前 10 个单词及其数量。

接下来,我绘制数据,标记轴,并定义图表的标题。我用barh显示了一个水平条形图。

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

Bar Chart of top 10 most frequent words

这也与来自单词云的结果一致。而且由于Delhi的计数更高,在字云中比India更粗更大。

结论

在这篇文章中,我讨论了什么是词云,它们潜在的应用领域,以及我为理解它们所做的一个项目。

一如既往,请随时分享您的观点和意见。

识别和纠正机器学习中的标签偏差

原文:https://towardsdatascience.com/identifying-and-correcting-label-bias-in-machine-learning-ed177d30349e?source=collection_archive---------6-----------------------

随着机器学习(ML)变得越来越有效和广泛,它在具有现实生活影响的系统中变得越来越普遍,从贷款建议到工作申请决策。随着使用的增加,偏见的风险也随之而来——有偏见的训练数据可能导致有偏见的 ML 算法,这反过来又可能使社会中的歧视和偏见永久化。

在谷歌的一篇新的论文中,研究人员提出了一种新的技术,即使在有偏见的数据集下,也可以公平地训练机器学习算法。该技术的核心思想是,有偏见的数据集可以被视为经过有偏见的代理操纵的无偏数据集。使用这个框架,有偏数据集被重新加权以适应(理论上的)无偏数据集,然后才作为训练数据输入到机器学习算法中。该技术在几个常见的公平性测试中获得了最先进的结果,同时呈现相对较低的错误率。

背景

当试图评估算法中的偏差时,研究人员通常会查看四个关键指标:

  1. 人口统计均等-分类器应该以与整个人口相同的比率对受保护的人口群体做出正面预测。
  2. 完全不同的影响-类似于人口统计均等,但分类器不知道存在哪些受保护的人群以及哪些数据点与这些受保护的人群相关。
  3. 机会均等——分类器在受保护人群中的真阳性比率应与整个人群中的比率相等。
  4. 均衡优势分类器在受保护人群中应具有与整个人群相同的真阳性假阳性率。

每个高级度量都表示为一个非负数,它描述了分类器与完全公平的接近程度,0 分表示没有偏差。

近年来,研究人员提出了几种方法来减少算法中的偏差。这些可以分为三个关键类别:数据预处理、数据后处理和算法增强(拉格朗日方法)。

数据预处理

在预处理中,研究人员试图通过在训练算法之前操纵训练数据来减少偏差。预处理在概念上是简单的,因此具有潜在的吸引力,但是存在两个关键问题:

数据后处理

在后处理中,研究人员试图通过在训练算法后操纵训练数据来减少偏差。与预处理一样,后处理的一个关键挑战是找到能够准确识别偏差的技术,从而降低偏差并保持算法精度。

算法增强(拉格朗日方法)

最近的一种方法是通过惩罚有偏差样本的影响,将公平性纳入训练算法本身。这是通过一种叫做拉格朗日乘数的数学技术来完成的,它接收公平性约束(例如,老年人应该以与年轻人相同的比率被接受)作为输入,并使用它们来影响训练算法中的损失。拉格朗日方法是目前最流行的,但通常难以实施,并给训练过程增加了相当大的复杂性。

偏差校正框架

如前所述,在提出的框架中,我们假设有偏数据集(y_bias)是对(理论上的)无偏数据集 y_true 进行操作的结果。这可以表现为:

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

该技术的第一步是学习λk 的值,λk 表示无偏数据集 y_true 和有偏数据集 y_bias 之间的联系。学习的λk 值用于计算每个训练样本的权重 wk,有偏样本得到低权重,无偏样本得到高权重。然后,ML 算法接收数据点和权重作为输入,并使用它们来训练无偏的分类器。

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

On the left is y_true, the middle is y_bias, and the right (“Our loss”) represents the result of the unbiased classifier. The different hues of red represent the different label values, which change due to the biasing process. The model learns the weights in order to undo the work of the theoretical “biased labeler” (Image: Jiang & Nachum)

如论文中所述,学习λk 的工作方式如下:“其思想是,如果对于一个保护类 G 的正预测率低于整体正预测率,那么相应的系数应该增加;即,如果我们增加 G 的正标签样本的权重并减少 G 的负标签样本的权重,那么这将鼓励分类器增加其对 G 中的正标签样本的准确度,而对 G 的负标签样本的准确度可能下降。”

在实践中,我们的过程包含两个部分——系数学习过程,以及基于无偏数据的 ML 模型的最终训练。重要的是要注意,虽然约束学习过程使用分类器来发现λk 偏差系数,但是在构建 ML 模型时不需要使用相同的分类器。

在实践中,我们的过程包含两个部分——系数学习过程,以及基于无偏数据的 ML 模型的最终训练。重要的是要注意,虽然约束学习过程使用分类器来发现λk 偏差系数,但是在构建 ML 模型时不需要使用相同的分类器。

系数学习过程包括四个不同的阶段:

  1. 评估人口统计约束,提供约束违反损失函数。
  2. 根据约束违反更新λk 系数,意味着尝试最小化损失函数。
  3. 计算每个训练样本的权重 wk。
  4. 用更新的权重重新训练分类器。

重复这些阶段,直到不再违反约束,这意味着数据集不再存在偏差。此时,计算的权重可用于模型构建阶段,每个训练样本基于其预期偏差接收不同的权重。

结果

在五个常见的 ML 偏差框架中使用逻辑回归测试了所提出的技术——银行营销(对直接营销活动的反应)、社区和犯罪(各种社区的犯罪率)、COMPAS(累犯)、德国 Statlog 信用数据(个人的信用风险)和成人(收入预测)。将结果与领先的预处理(“Unc”)进行比较),后期处理(“Cal。”)和拉格朗日(“Lagr。”)关于四个常见偏差指标的方法——人口统计均等(“Dem。标准杆。”),不同的影响(“Disp。小鬼。”),机会均等(“情商。Opp。”)和均衡赔率(“Eq。赔率”)。在大多数情况下,所提出的技术(“我们的……”)在牺牲很少准确性的情况下取得了最好的结果。没有其他技术是类似的准确和公正。

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

In each column, the “Err.” (left) represents the error of the unbiased classifier and the “Vio.” (right) is the numerical bias value. (Image: Jiang & Nachum)

研究人员还通过创建标签偏差在 MNIST 上测试了该技术,随机选择 20%的训练数据点,并将它们的标签更改为 2。然后,他们将数据输入算法,约束条件是“每个数字应该出现 10%的时间”,并将结果与预处理、后处理和拉格朗日方法进行比较。结果再次是所提出的无偏倚技术(“我们的方法”)的最高分:

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

Unconstrained = pre-processing method, Calibration = post-processing method (Image: Jiang & Nachum)

实施细节

该技术是用于偏差校正的通用框架,因此独立于任何软件平台或实现。自然地,增加一个体重发现阶段将会延长任何使用它的训练过程。

结论

在他们的偏差校正框架中,Jiang 和 Nachum 提出,在有偏差的数据集背后,可以假设一个隐藏的无偏数据集,并表明相应地重新加权有偏差的数据集可以在几种偏差减少技术中获得最佳结果。随着越来越多的最大似然算法涉及到我们的日常生活,预计偏差减少技术将变得越来越重要,并且看起来 Jiang 和 Nachum 技术现在是这种技术的新基准。

使用单词矢量化和 K-Means 聚类识别竞争对手

原文:https://towardsdatascience.com/identifying-competitors-using-word-vectorization-k-nearest-neighbors-412f1cea2506?source=collection_archive---------29-----------------------

面向小型企业的数据科学

构建一种算法来帮助小企业利用 Yelp 数据。

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

Yelp 为企业提供了丰富的信息来源,在分析相对于竞争对手的销售和服务表现时可以加以利用。利用这些数据是完全不同的事情。我想创造一种算法,让小企业相对容易地做到这一点。

在本帖中,我们将探讨如何使用分类标签,通过词汇矢量化和 k-means 聚类来确定企业最相关的竞争对手。为了便于说明,我们将使用纽约市我最喜欢的当地餐馆之一: Chano’s Cantina 。使用 Yelp API ,我获得了阿斯托里亚墨西哥餐馆&酒吧的前 50 个搜索结果,并将它们保存到 dataframe 中。

我们的目标是确定 Chano’s 与其竞争对手相比如何,确定餐厅做得好的地方和有待改进的地方。然而,试图将一家餐厅与 49 家潜在竞争对手进行比较可能会引入太多噪音,以至于很难提取出任何有意义的结果。相反,我们想找出 5-10 个在价格和产品供应方面与 Chano 最相似的竞争对手。我们如何找出哪些餐厅在这方面最相似?k-均值聚类!

数据选择

让我们看看 Chano 的 Yelp 页面,看看哪些信息可能最适合手头的任务。

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

https://www.yelp.com/biz/chanos-cantina-astoria

从上面,我们看到了一个带有两个美元符号的价格估计,以及几个关于鸡尾酒吧和*新墨西哥美食的标签。*很自然,我们希望将 Chano’s 与类似的餐厅进行比较,因此我们希望找到标签和价格范围相同的餐厅。问题是大多数餐馆不会完全匹配,所以我们想尽可能接近。

如果我们回顾我们的 API 结果,我们会看到相关信息在列类别价格中。请注意,我们没有使用评级变量,因为这将是我们以后的目标。让我们清除一些混乱,以便更好地理解我们正在处理的内容。

预处理

这里我们有 50 条记录,我们希望使用类别和价格数据将其减少到不到 10 条。两个问题:

  • 类别是以字符串形式保存在内存中的字典列表。
  • 用美元符号表示的价格,不容易被机器解释。

价格是更容易处理的问题:我们可以用一个表示美元符号数量的整数来代替这个值。然后我们可以用四舍五入到零位的平均价格来填充空值。

df.price.replace(to_replace = ['$', '$$', '$$$', '$$$$'], 
                 value = [1, 2, 3, 4], 
                 inplace = True)df.price.fillna(np.round(df.price.mean(), 0), inplace = True)

关于分类标签,我们需要 Python 将每个企业的字符串值作为代码读取,这样我们就可以分离出我们需要的信息。例如,Chano’s Cantina 的类别保存为:

"[{'alias': 'cocktailbars', 'title': 'Cocktail Bars'}, {'alias': 'newmexican', 'title': 'New Mexican Cuisine'}]"

我们希望 Python 将这个字符串解释为字典列表,而不是将其作为字符串读取。幸运的是,通过使用抽象语法树库并调用 literal_eval 方法,然后将结果保存为变量,我们可以很容易地做到这一点。从这里开始,只需遍历每条记录,获取标题单词,删除标点符号,并将所有单词转换为小写。我们可以将这些结果与价格值结合起来,并将结果保存到一个名为*标签的列中。*代码以及 Chano 的相关输出如下。

import ast
import redf['tags'] = ''for ix in df.index:
 *# Evaluate categories as code*    cat = ast.literal_eval(df['categories'][ix])

 *# Save tags as single string*    words = ''
    for tag in cat:
        words += f"{tag['title']} "

 *# Remove punctuation*    words = re.sub(r'[^\w\s]', ' ', words)df.loc[ix, 'tags'] = ' '.join([words.lower(), str(int(df.loc[ix, 'price']))])OUTPUT:
'cocktail bars new mexican cuisine 2'

我们可以使用自然语言工具包(NLTK)将这些输出转换成单词标记列表。

from nltk import word_tokenize
df['tags'] = df['tags'].map(word_tokenize).valuesOUTPUT:
['cocktail', 'bars', 'new', 'mexican', 'cuisine', '2']

您可能会问自己,为什么我们不为类别创建虚拟变量。这种方法会是一种更直接的方式;然而,这也将导致对类别的解释是独特的离散。这种方法的问题是,诸如“墨西哥”和“新墨西哥美食”的标签非常相似。通过使用虚拟变量,我们会错过这种细微差别。为此,我们将使用单词表示的全局向量 (GloVe)来解释分类标签。

单词矢量化

如果你不熟悉的话,单词矢量化是一种在高维空间中用数字表示单词的方法。那是什么意思?好吧,假设我们想根据动物的毛绒绒程度和友好程度来比较它们,我们把它们放在 1-10 的范围内。一只博美犬可能因为非常蓬松而得到 10 分,因为非常友好而得到 9 分。(我妻子告诉我博美犬不是特别友好,但让我们假装它们是!)

另一方面,一只短吻鳄可能在两个评分中都得到 1 分。我们可以用图表直观地表示这些单词:

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

使用这些维度,我们可以将每种动物表示为一个向量,第一个值表示蓬松度,第二个值表示友好度。更重要的是,我们可以想象在这条线上的不同点可能存在其他动物。你能想到一种比短吻鳄更蓬松、更友好,但没有博美犬蓬松、友好的动物吗?狒狒怎么样?如果我们计算这两个向量的平均值,我们就能算出狒狒在图上的位置。我们可以用算法将这一过程表示如下:

pomeranian = np.array([10, 9])
alligator = np.array([1, 1])baboon = (pomeranian + alligator) / 2
baboonOUTPUT:
array([5.5, 5.])

输出表示在图表上放置狒狒的坐标。我们可以无限地扩展这个概念来描述各种各样的词,并理解它们之间的关系。面对如此无限的可能性,我们该从哪里开始呢?幸运的是,我们不必回答这个问题,因为斯坦福大学已经建立了一个模型,包含英语中 60 亿个单词的单词向量:这是 GloVe。每个单词都被表示为一个 50-300 维的向量,并且可以免费访问以用于您自己的模型。可以这里下载;请记住,该文件高达 822 兆字节。

用手套来代表单词

zip 文件包含四个以 UTF 8 格式编码的文本文件。每个文件包含相同的单词库,每行代表该单词的向量。文件之间的区别在于维数:50、100、200 和 300。出于我们的目的,我们将使用 50 个维度,因此我们首先将文件 glove.6B.50d.txt 保存到与 Jupyter 笔记本相同的路径。

将向量分配给唯一单词的过程非常简单。

  1. 创建一个在我们新创建的标签栏中使用的独特词汇列表。
  2. 从 GloVe 中获取代表每个单词的向量。
  3. 将结果保存为字典,使用单词作为键,向量作为值。
*# Get unique words* total_vocabulary = set(word.lower() for tag in df['tags'] for word in tag)def get_vectors(vocabulary):
    *# Function to get vectors for words in vocabulary*
    glove = {}
    with open('glove.6B.50d.txt', 'rb') as f:
        for line in f:
            parts = line.split()
            word = parts[0].decode('utf-8')
            if word in vocabulary:
                vector = np.array(parts[1:], dtype=np.float32)
                glove[word] = vector

    return gloveglove = get_vectors(total_vocabulary)

有了我们的相关向量字典,我们现在想将它们应用到每个企业的特定标签集,获得每个公司的平均向量。我们可以创建一个类来完成这项工作,使用 map 函数将它应用到 tags 列。

class W2vVectorizer(object):

    def __init__(self, w2v):
        *# Takes in a dictionary of words and vectors as input*
        self.w2v = w2v
        if len(w2v) == 0:
            self.dimensions = 0
        else:
            self.dimensions = len(w2v[next(iter(glove))])

    def fit(self, X, y):
        return self

    def transform(self, X):
        *# Get mean value of vectors from a list of words*
        return np.array([
            np.mean([self.w2v[w] for w in words if w in self.w2v]
                    or [np.zeros(self.dimensions)], axis=0) 
                    for words in X])

该类接受单词和向量的字典,并通过调用 transform 方法为任何单词列表提供平均向量。

不戴手套的话

超过 40 万个单词有 60 亿个代币,很难想象一个单词不会在手套中找到。然而,在这个例子中我们确实遇到了一种:腹足类。有趣的是,这个单词的单数形式是存在的,所以使用词干和词汇化是这个问题的第一个潜在解决方案。然而,在 NLTK 库中也没有找到这个单词。是时候发挥创造力了!

我的下一个想法是使用韦氏词典查找音节,但是没有。最简单的解决方案是为丢失的单词插入零向量,或者从所有标签中删除它,但是我不想丢失信息。相反,我们可以从韦氏词典获得字典定义,并应用与上面类似的方法获得单词定义的平均向量。

这个任务从使用美汤的一些网页抓取开始。作为下一篇文章的一部分,我们将更详细地讨论网络抓取这个话题,所以,现在,我将只向您展示从韦氏词典的网站上获取任何单词的定义的代码。

from nltk import word_tokenize
import requests
from bs4 import BeautifulSoup as bsdef get_definition(word):
 *# Get webpage data for word definition*    url = f'https://www.merriam-webster.com/dictionary/{word}'
    r = requests.get(url)

 *# Parse html*    soup = bs(r.content, 'lxml')
    definition = soup.find("span", {"class" : "dt"})
    tag = definition.findChild()
    definition = tag.find('strong').next_sibling.strip()

 *# Clean text & return tokenized definition*    clean_def = re.sub(r'[^\w\s]', ' ', definition)
    return word_tokenize(clean_def)

有了这个函数,我们就可以搜索 GloVe 中没有的单词,获得标记化的定义,然后使用我们的 vector 类获得相关单词的近似向量。

*# Get tokenized definitions for words not in Glove* no_vectors = {}
for word in total_vocabulary:
    if word not in glove.keys():
        no_vectors[word] = get_definition(word)*# Add unique words from tokenized definitions to glove dictionary* for key in no_vectors.keys():
    words_to_add = []
    for word in no_vectors[key]:
        if word not in list(glove.keys()):
            words_to_add.append(word)

    words_to_add = list(set(words_to_add))
    new_vects = get_vectors(words_to_add)
    glove.update(new_vects)*# Calculate vectors for missing words to glove* vectors = W2vVectorizer(glove)
for key in no_vectors.keys():
    vect = vectors.transform(no_vectors[key])
 **glove[key] = np.average(vect, axis=0)**    
print(sorted(list(glove.keys())))OUTPUT:
['1', '2', '3', 'a', 'american', 'bar', 'bars', 'beer', 'breakfast', 'brunch', 'chicken', 'cocktail', 'coffee', 'cuisine', 'event', 'gastropubs', 'grocery', 'high', 'irish', 'italian', 'latin', 'lounges', 'meals', 'mex', 'mexican', 'new', 'of', 'offers', 'or', 'peruvian', 'plates', 'pub', 'pubs', 'quality', 'seafood', 'small', 'southern', 'spaces', 'spirits', 'sports', 'tacos', 'tapas', 'tavern', 'tea', 'tex', 'that', 'traditional', 'venues', 'wine', 'wings']

需要记住的一点是,向量的平均值返回高维空间中的值。但是,我们希望返回一个与所有其他单词形状相同的值,这由加粗的代码行处理。

随着我们所有的标签被正确地矢量化,我们现在可以继续进行聚类,以确定 Chano 的最直接的竞争对手。

k 均值聚类

有很多博客文章详细介绍了 k-means 聚类的无监督学习机制,所以我在这里不打算全部重复。主要要知道的是,k-means 聚类是一种无监督的学习方法,它根据数据点的相似程度对它们进行分组。

为了说明这一点,让我们回到短吻鳄和博美犬的比较。这一次,我们将在图表中添加一些其他动物。k-均值聚类的目的是识别一组随机动物的适当分组。

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

在这里,我们可以看到青蛙比鳄鱼友好一点,但一点也不蓬松。哈巴狗不如博美犬蓬松,但它更友好一些。然后还有蜜獾和狼蛛,有点蓬松,但不是特别友好。基于他们的分数,k-means 聚类旨在找出如何最好地对他们进行分组。

这个任务看起来很简单,但是如果我告诉你有必要把这些分成两组而不是三组呢?或者改为四组怎么样?我们可以想象,如果不知道最佳的组数,任务会变得更加复杂。

我们的目标是根据他们的 Yelp 标签和价格估计,找出 5-10 个与 Chano 最相似的竞争对手。对于本分析的其余部分,我们将重点关注 k-means 聚类的实现。尽管如此,如果你不熟悉算法的机制,我还是建议你看一看甲骨文的这篇简介。

寻找最佳的聚类数

有两种传统的方法来为 k-means 算法找到最佳的聚类数:

  1. 肘法
  2. 剪影法

对于每种方法,我们为一组组构建多个 k 均值算法,组的数量由字母 k 表示。在这种情况下,我们将设置 2 到 10 个组或集群。使用肘方法,该算法估计每个分类的中心,然后测量分类中每个点离中心的平均距离。取这些距离的平均值得到了误差平方的组内和(WCSS)。随着星团数量的增加,我们可以绘制 WCSS,寻找 WCSS 趋于平稳的点。

为了说明这一点,我们随机生成一组点来代表 100 种不同的[理论上的]动物,并绘制在下面。

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

我们可以看到有三个不同的集群。让我们为 2–10 个集群构建 k-means 算法,看看 WCSS 会发生什么。

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

我们可以看到,在 3 个星团中,WCSS 到达了一个山谷。直觉上这是有道理的,但是区别并不总是清晰的,使得解释有些主观。更重要的是,我们不希望每次运行算法时都必须进行视觉检查。相反,我们将使用剪影法。

剪影法

使用剪影方法,我们查看一个簇中的点之间的平均距离,这被称为内聚。这个数字与组间的平均距离进行比较,这是对间距的测量。用非常简单的术语来说,我们寻找分离和内聚之间的差异最大化的簇的数量。和肘法一样,我们可以画出这些点。

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

同样,我们可以看到最佳聚类数是 3,因为这是轮廓得分最大化的地方。然而,与 Elbow 方法不同,我们得到了一个清晰的最大值,可以很容易地通过编程来识别。

把所有的放在一起

有了手套向量和寻找最佳聚类数的方法,我们现在可以确定与 Chano 最相似的竞争对手。您可能已经从上面推断出,我们将需要多次实现该算法。幸运的是,这是这个过程中最简单的部分。

第一步:导入 K 均值算法。

*from sklearn.cluster import KMeans*

步骤 2:将标签转换为向量。

*vectors = W2vVectorizer(glove)
X = vectors.transform(df['tags'])*

第三步:找到最佳的聚类数。

*sil = []
kmax = 10for k in range(2, kmax+1):
   kmeans = KMeans(n_clusters = k).fit(X)
   labels = kmeans.labels_
   sil.append(silhouette_score(X, labels, metric = 'euclidean'))

maxpos = sil.index(max(sil))
n_clusters = maxpos + 2*

步骤 4:分配组标签并保存到数据帧。

**# Divide into k groups using k-mean clustering* model = KMeans(n_clusters=n_clusters, init='k-means++',
               max_iter=300, n_init=100)
model.fit(X)

*# Create group label column* df['group'] = list(model.labels_)*

第五步:筛选与 Chano 不在一个组的企业。

*group = df[df['name'] == "Chano's Cantina"]['group'].values[0]
new_df = df[df['group'] == group].reset_index(drop=True)*

步骤 6:对新的数据帧重复步骤 2 到 5,直到记录数少于 10。

结果:下面,我们可以看到 Chano’s 及其主要竞争对手的基本数据。

后续步骤

既然我们已经正确地确定了 Chano 的主要竞争对手,我们就可以开始深入评论了。查看 review_count 列,我们可以看到我们有近 1000 条评论要解析,但是 Yelp API 对可以访问的评论数量有严格限制。要绕过这一点,需要使用漂亮的汤进行一些繁重的网络抓取,但这是另一天的主题。

通过机器学习识别 OpenStreetMap 覆盖中的缺口

原文:https://towardsdatascience.com/identifying-gaps-in-openstreetmap-coverage-through-machine-learning-257545c04330?source=collection_archive---------23-----------------------

本帖由 冉戈特 、新光科技、、GFDRR Labs/World Bank。

OpenStreetMap (OSM)是数字时代的奇迹之一:成立于 2004 年,它允许志愿者绘制大约 4200 万座建筑物和 100 万公里道路的地图——创造了一个在完整性和易用性方面往往超过官方地图的宝贵资源。

在很少情况下,完整的地图比备灾和救灾更重要。巴哈马的飓风道林只是最新的例子,救援机构依靠 OSM 的数据来了解受灾房屋、学校和诊所的位置。

但是我们如何评估 OSM 在给定区域覆盖的完整性呢?请继续阅读我们使用的关键步骤——以海地为例——以区分完全测绘的地区和额外测绘(例如通过众包活动)将带来最大收益的地区。

评估 OSM 完整性

麦吉尔大学最近的一项研究发现,OSM 拥有世界上大约 83%的街道和道路,但在治理薄弱和互联网接入较少的国家,覆盖差距更大。在本帖中,我们将特别关注构建足迹。

你已经可以使用人道主义 OpenStreetMap 团队的缺口检测地图,将 OSM 建筑的足迹与全球人类居住层进行比较。有了机器学习工作流,我们可以走得更远一点。我们将利用免费和开源的卫星数据,以更高的分辨率对 OSM 覆盖范围的缺口进行建模,评估模型的准确性,并预测地图绘制不足的区域。

1.获取和检查 OSM 数据

对于一个地区的 OSM 数据的探索性可视化,Python 库 OSMNx 是一个非常有价值的资源-它有助于精确调用 transition API,将您需要的数据段提取到笔记本环境中。

在下图中,我们展示了城市三个人口密集区的建筑足迹。这些平方英里地块的坐标是通过在谷歌地图上放一枚大头针选择的,卫星图像显示那里有密集的建筑覆盖。

显然,太子港的一些地区已经开展了大量的制图工作,但其他地区还没有。为了进行全面的分析,我们获取了整个海地的建筑足迹数据(使用诸如 GeoFabrik 这样的服务器)。

Python code: Download OSM building footprints for selected locations in Haiti

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

Building footprints: Three square mile plots for dense areas of Port-au-Prince (note differential coverage)

2.构建一组预测功能

一些地理空间层可能被证明可以预测建筑密度,特别是那些来自免费、公开获取的最新卫星图像的地理空间层。现有产品,如全球人类住区图层(GHSL)在描绘城市区域方面做得很好,但它们没有捕捉到自发布日期以来的任何变化-将实时卫星数据引入我们的工作流可以弥补这一点。

我们评估了几种遥感方法作为建筑物覆盖范围的潜在预测指标,包括:

夜间发出的光的强度(VI IRS);

源自 Sentinel-2 图像的植被和建筑区光谱指数(如 NDVI、NDBI、SAVI);

表面结构(基于 Sentinel-1 的合成孔径雷达数据);

海拔和坡度;

其他 OSM 衍生图层,包括道路交叉点的密度。

就像机器学习一样,更高质量的特征意味着更好的预测精度和更少的噪声。我们评估了 16 个预测要素,利用谷歌地球引擎(GEE)有效地创建和聚合遥感衍生层。下面的代码片段突出了 GEE 提供的便利和强大功能;在这里,我们引入了过去三年的 VIIRS 图像,这是一个高分辨率数据集,从 2012 年开始作为当地经济增长的替代物提供了巨大的好处,并绘制了整个海地的中值夜间照明强度。

Google Earth Engine code (Javascript): Median night-light intensity over Haiti, 2015–2018

3.创建培训和测试数据

我们将区域划分为网格(您可以使用 QGIS 来实现)。我们将单元格的大小设置为 500m500m,但是如果您愿意,也可以使用任何其他大小。我们的目标是根据预测值预测像元中 OSM 建筑物覆盖区的覆盖范围(覆盖区的总面积)。*

为了创建训练数据,我们手动标记网格单元,其中我们评估至少 75%的要完全绘制的建筑物(我们依靠高分辨率卫星图像作为此评估的基础层)。大约 1,600 个细胞被标记为完全映射。

然后,我们将这些细胞中的 70%作为训练数据,并将剩余部分作为测试数据——它在模型训练期间保持不可见。

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

Left: Complete cells are tagged to create training and test data; Right: Remote sensing layers such as night-lights intensity (pictured) serve as predictive features.

4.构建和评估模型

我们的训练数据包括我们判断接近完全 OSM 映射的区域上的大约 1,100 个像元(即,根据目测,至少 75%的建筑物出现在 OSM 上)。

多元线性回归分析表明,九个变量的综合效应可以解释一个单元中 OSM 建筑占地面积变化的 82%。这些变量加在一起的预测精度远远高于每个变量独立的预测精度:例如,仅使用世界定居足迹只能解释 62%的变异。

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

Model evaluation: actual vs. predicted building floorspace

使用随机森林算法,我们看到了更高的预测精度。该模型预测每个单元的 OSM 建筑占地面积的 89%的变化。模型中最重要的预测因子是全球城市足迹和世界住区足迹,其次是 NDBI、道路交汇点数量和 VIIRS 夜间照明。

产出:已确定的 OSM 差距

发现我们的模型足够有效后,我们将其应用于预测整个海地的 OSM 建筑足迹,以及预测将被完全映射但实际上未被 OSM 覆盖的标志单元。

海地的许多地区缺乏他们建筑的完整地图。检查太子港的预测,我们看到这些地图黑点与 OSM 覆盖密集、详细且相对完整的其他单元共存-考虑到许多发展中国家社区地图的间歇性,这可能并不奇怪,在这些国家,2010 年地震等紧急情况激发了人们的努力。

当住宅、学校、诊所和其他重要基础设施所在的区域没有被绘制成地图时,规划和应对极端事件就变得非常困难。但是一个简单的机器学习工作流程可以通过指出额外的地图绘制活动提供最大利益的区域来帮助通知众包工作。

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

致谢:感谢新光科技的珍妮·曼尼克斯和布拉德·博顿斯为这个项目做出的贡献。

识别特定于音乐流派的语言

原文:https://towardsdatascience.com/identifying-langauge-specific-to-a-musical-genre-58dc27bb74c3?source=collection_archive---------33-----------------------

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

“音乐是人类的通用语言.” 亨利·沃兹沃斯·朗费罗

不管说什么语言,人类都有一种与他们所听的音乐建立联系,并通过他们创作的音乐与他人交流的天生能力。随着音乐的发展,我们已经开发出了通过口语和书面语谈论音乐的新方法。例如,音乐记谱法被作为一种以书面形式记录一段音乐的手段,这样任何熟悉这种记谱法的人都可以拿起它来演奏。

在现代社会,音乐变得更加容易理解和广泛传播,音乐风格也更加多样化。这种现象导致了基于流派对音乐进行分类的关注。在许多情况下,这些流派围绕它们发展出了完整的亚文化。一种特定音乐风格的粉丝可能会在更多方面认同这些亚文化,而不仅仅是他们选择听的音乐。他们可能穿着特定的时尚,经常去特定的场所,甚至发展出一种特定的方式来谈论他们喜欢的音乐。

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

人们通常用一些术语来描述音乐,但我想看看我是否能分析人们在特定流派中使用的语言的差异。为了做到这一点,我创建了一个机器学习模型,以测试计算机能够在多大程度上根据一个人正在使用的单词来确定他可能在谈论什么类型。作为案例研究,我选择了比较两种特定的流派:EDM 和 Rock。用于分析的数据来自 Reddit 上关于这两种类型的帖子。我从 subreddit r/EDM 中抽取了一组帖子,从 r/rock 中抽取了另一组帖子,以获取人们专门谈论这两种音乐的文本数据。这个项目的链接可以在这里找到。

这个过程的下一步是清理文本,以便可以正确处理它。因为这些是 Reddit 的帖子,里面有很多东西不是真正的单词,比如 YouTube 视频和播放列表的链接,所以这些必须被删除。因为单词本身是唯一相关的内容,所以所有的标点都被删除了。除了帖子本身的内容之外,我选择使用帖子的标题,因为对于这些特定的子主题,在许多情况下,标题和内容一样重要。

一旦文本都被适当地清理了,就该使用自然语言处理来分析文本了。我通过计数矢量器运行了所有帖子,它识别了帖子中所有独特的单词,并计算了每个单词在每个帖子中出现的次数。我还尝试了一种稍微不同的方法,使用 TF-IDF 矢量器处理该文本,它不是简单地计算所有单词,而是考虑包含该单词的帖子的数量。这些结果现在可以通过一个模型来运行,该模型能够预测一个给定的帖子来自两个子帖子中的哪一个。我还分析了同时出现的两个单词的任何组合,这有助于考虑单词的上下文,从而提高模型的性能。

我试用了几种型号,比较了一下,看看哪种性能最好。每个模型使用不同的算法根据帖子的内容将帖子分类为 r/EDM 或 r/rock。我选择比较的模型是朴素贝叶斯、逻辑回归、随机森林和 K-NN。每个模型都用计数矢量器和 TF-IDF 矢量器进行了测试。每个模型预测文章类型的准确度结果如下所示:

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

性能最好的模型是朴素贝叶斯,它在与 TF-IDF 矢量器一起使用时比与计数矢量器一起使用时表现更好。该模型能够正确预测近 90%帖子的类型,要么是 EDM,要么是 Rock。这表明,人们用来描述不同音乐流派的语言存在显著差异,足以让一个模型能够仅根据分析人们使用的词汇来区分这些方言。

我们甚至可以识别与特定风格高度相关的特定单词,这提供了一些关于哪些特定单词使每种风格独一无二的深刻见解。随着越来越多的人在谈论某种音乐时更频繁地使用这些词,他们开始围绕一种音乐流派塑造语言和文化。为了进行预测,我的模型会学习哪些单词是最重要的,并相应地对它们进行加权。为了确定最重要的词,我检查了哪些词在我的模型中权重最高,并找出了 EDM 和 rock 的前 15 名。

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

从上面的图表中可以看出,与某个流派联系最紧密的词符合你期望看到的行话。直观地说,这两种类型的第一个词就是类型本身的名字。对于摇滚流派,我们可以看到“乐队”这个词的排名几乎和“摇滚”一样高。这表明“乐队”这个词在人们谈论摇滚音乐时非常流行,这是有道理的,因为大多数摇滚艺术家都是乐队。我们会看到“吉他”或“金属”这样的词在这张图上排名靠前,这也是有道理的,因为摇滚通常涉及大量的吉他演奏,而金属是摇滚乐中一个受欢迎的子类别。

对于涉及 EDM 的最重要的词,我们可以看到类似的趋势。例如,像“混音”、“DJ”、“节日”和“下降”这样的词,出于不同的原因,都与电子音乐高度相关。大多数 EDM 艺人都是 DJ,这些 DJ 通常会将另一位艺人的歌曲进行混音。许多现场 EDM 活动是大型音乐节,歌曲通常围绕一个被称为“下降”的高潮部分我们对这些热门词汇了解得越多,我们就越能了解每种音乐风格的文化。

这个概念当然可以应用到其他流派,我希望能找到与上述每种流派相关的独特语言。人们确实以非常不同的方式谈论不同风格的音乐,在这个领域总有更多的东西可以探索。通过更多的数据和对我的清理和建模过程的微调,我相信我可以提高这个模型的准确性,甚至超过 90%,但这些结果仍然显示了自然语言处理在确定特定风格音乐周围的独特方言方面的有效性。我有兴趣在未来的其他音乐领域尝试一下,但我发现这是一个非常有趣的案例研究。我希望你也是!

使用随机森林算法识别传奇神奇宝贝

原文:https://towardsdatascience.com/identifying-legendary-pokémon-using-the-random-forest-algorithm-ed0904d07d64?source=collection_archive---------17-----------------------

okémon,一群可爱的动物和平地居住在一个星球上,直到人类出现并让它们互相争斗,以获得闪亮的徽章和自称为神奇宝贝大师的权利,听起来很疯狂,对吗?

在这个世界上,存在着一群稀有且往往强大的神奇宝贝,被称为传奇神奇宝贝。

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

Legendary Pokémon Mew

不幸的是,没有明确的标准来定义这些神奇宝贝。

识别传奇神奇宝贝的唯一方法是通过官方媒体的声明,如游戏或动漫。

这个问题突然出现在我的脑海里。

如果我们可以使用机器学习来识别传说中的神奇宝贝会怎么样?

为了回答这个问题,我们将使用随机森林算法。

随机森林

随机森林是一种灵活、易于使用的机器学习算法,即使没有超参数调整,也能产生很好的结果。

它是一个由许多决策树组合而成的集成分类器。它在随机数据子集上构建每棵树,这是一种被称为打包的技术。

集成分类器聚合每棵树的单个预测,并使用多数投票将它们组合起来以做出最终预测。

随机森林通常防止过度拟合并降低**方差,**由于其随机性(双关)。

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

Example Random Forest constructed from 2 trees

数据集

对于这个项目,我们将使用统计数据数据集口袋妖怪。

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

Pikachu

它包含 800 只神奇宝贝的数据,包括它们的名字、统计数据,最重要的是它们是否是传奇。

首先,让我们看看典型的神奇宝贝在数据集中是什么样的。

dataset = pd.read_csv("../input/Pokemon.csv")
# Display first row of dataset
dataset.head(1)

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

First row in dataset — Bulbasaur

神奇宝贝的类型表明它具有哪些属性(可能有一种或两种类型)。目前游戏中有 18 种类型,从火和水到龙和精灵。

与神奇宝贝相关的统计数据( stats )决定了游戏中战斗的各个方面。

例如,速度统计决定了神奇宝贝在战斗中的行动顺序,例如,速度较高的神奇宝贝通常会在速度较低的其他神奇宝贝之前先行动。

我们将使用类型和统计作为随机森林的输入,这些输入被称为特性

一个热编码

接下来,所需的数据将被预处理成适合随机森林分类器的格式。大多数机器学习算法不能对标签值进行操作,而是需要输入数值。这是由于这些算法的有效实现,而不是苛刻的限制。

所以我们通常使用 一热编码 将这些标签值编码成二进制形式。

在这个数据集中,有两个特征需要编码:类型 1 类型 2。

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

Bulbasaur is a grass and poison type

如前所述,一个类型可以有 18 个不同的值。

一个热编码将把每种类型的特征转换成 18 个独立的特征,例如‘是草’,‘是毒’等等。

这些新特性中的每一个都将填充一个 10。

幸运的是,我们可以使用一个名为 get_dummies 的熊猫内置函数来执行编码。

dataset = pd.get_dummies(dataset)

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

Bulbasaur’s Type 1 is Grass

这种数据的二进制编码使模型能够更好地从数字上解释我们的数据,并更准确地进行预测。我们现在总共有 42 个特征被输入到算法中。

分成训练和测试数据集

对数据进行编码后,我们需要将数据划分为训练集和测试集。在此之前,回答以下问题会超级有帮助:

数据集中到底有多少传说中的神奇宝贝!?

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

Number of Legendary Pokemon in Dataset

从上面我们可以看到,数据内有 65 个传说中的神奇宝贝,只占数据集的 7%!

这种数据的不平衡在训练我们的森林时不会有帮助,因为它会导致过度拟合。

过度拟合是指我们的模型不能很好地从训练数据归纳到看不见的数据。这是因为数据中特定类别的过度表示,从而使模型更难学习数据中的潜在信号。

为了解决这个问题,我使用了两种常用的统计方法来减少不平衡:

  • 多数类的欠采样(正常神奇宝贝)
  • 小众类的过采样(传说中的神奇宝贝)

欠采样普通口袋妖怪

为了对多数类进行欠采样,我将数据集中普通神奇宝贝的数量减少到了 100 个。

然后我在数据集上应用了一个 70/30 列车测试分割x是每个神奇宝贝的特征,y是相应的真相标签(如果是传奇,则为真)。

X_train, X_test, y_train, y_test = train_test_split(x,y, random_state = 47, test_size = 0.30)

使用 SMOTE 对传奇神奇宝贝进行过采样

为了对传说中的神奇宝贝进行过采样,我使用了 SMOTE 算法(这里用很好地解释了)。

SMOTE 算法能够通过使用现有的示例数据来合成新的传奇神奇宝贝。这意味着我们可以增加训练数据中传奇的数量,在训练数据中产生 1.0 的比率!

from imblearn.over_sampling import SMOTEsm = SMOTE(random_state=12, sampling_strategy= = 1.0)X_train_res, y_train_res = sm.fit_sample(X_train, y_train)

这种过采样技术只有应用于训练集,以防止测试数据流入 SMOTE 算法。这确保了该模型在尚未用于创建合成数据的数据上得到验证。

训练随机森林

有了训练数据,我们现在可以建立我们的森林了!

from sklearn.ensemble import RandomForestClassifiermodel = RandomForestClassifier(n_estimators=100,max_depth=7)model.fit(training_data,training_labels)

n_estimators参数决定了林中使用的决策树的数量。森林中每棵树的max_depth被设置为 7 级,主要是为了可视化的目的。我们不想看巨大的树!

估价

那么,森林如何处理这些数据呢?

Accuracy Score on train data:  0.99
Accuracy Score on test data:  0.96

我们可以看到森林在测试数据上达到了 96% 的准确率简直牛逼!这表明森林已经避免了过度适应,并且能够很好地概括看不见的例子!

特征重要性

由于决策树的贪婪本性,它们能够在分类时突出哪些特征是重要的决定因素,这被称为特征选择

这将有助于我们理解在决定神奇宝贝传奇的过程中,哪些特征相对重要。

Sk-learn 有一个被称为[feature_importances_](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier.feature_importances_)的简洁功能,它可以通过查看该功能平均降低森林熵的程度来衡量该功能的重要性。它对结果进行缩放,使所有重要度之和等于 1。

得分最高的功能如下所示。

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

Top 10 Important Features

有趣的是,似乎最具决定性的特征是 Total ( 所有基础统计的总和)。

传说中的神奇宝贝通常比普通的神奇宝贝更强大,所以总属性是传说中地位的一个重要指标是有道理的。

此外,我们可以看到重要性值从总体到次要特征快速下降。这向我们表明,某些特征,如类型实际上并没有给我们多少识别传奇口袋妖怪的信息。(Type 1_Bug 只降低熵 0.6%的时候!)

所以它们可能会被从我们的数据集中删除,因为它们只是噪音。

让我们想象一棵森林中的随机树,看看它是如何利用这些特征进行预测的!

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

Random tree from the forest

在这个特殊的树中,总数、攻击和防御统计被用作决定因素。我们可以看到,这棵树已经学会了避免将总数而攻防的口袋妖怪错误归类为传奇,这很酷!

结论

在这篇文章中,我们了解到,我们可以仅使用统计数据来准确识别传奇神奇宝贝!

神奇宝贝的世界里没有太多的传奇故事,不幸的是,这意味着我们可以利用的数据更少了。然而,随着时间的推移和传奇数量的增加,这也意味着传奇的标准可能会发生变化。所以某些特性的重要性也必然会改变!

随机森林工作起来很有趣,但是由于它们的大小,很难可视化和分析。尽管如此,使用森林的features_importances_属性让我们从数据中掌握了什么是传奇神奇宝贝的有用指标。

感谢您的阅读!我希望这篇文章已经向您展示了如何将 ML 应用于最牵强的问题。如果你有什么问题或者只是想聊聊天,就在下面留言评论吧!

我的 python 笔记本可以在这里找到

下次再见:)

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

Photo by Kamil S on Unsplash

用 R 确定英国围产期精神健康指标的地区差异

原文:https://towardsdatascience.com/identifying-regional-differences-in-perinatal-mental-health-indicators-in-the-uk-with-r-1e8a8f1e7fb0?source=collection_archive---------14-----------------------

fingertipsR 包提供了一个简单的接口来访问指尖 API。该库包含由英国公共卫生部管理的大量公共卫生指标。

我将重点关注与围产期心理健康相关的数据,因为我们的实验室对早期逆境的表观遗传嵌入(以及其他方面)感兴趣。围产期心理健康问题发生在怀孕期间或孩子出生后的第一年。多达 20%的女性患有围产期精神疾病。围产期心理健康问题也会对儿童的情感、社交和认知发展产生长期影响。如果不进行治疗,它会对妇女及其家庭产生重大而持久的影响。

我认为在监测指标上使用主成分分析和中等量分割来识别区域差异会很有意思,这可以为这些区域的控制提供改进(就像对 TB 所做的那样)。

# load the needs package to load a bunch of libraries quickly (or install them if you don't already have them)
library(needs)needs(purrr,
      dplyr,
      tibble,
      fingertipsR,
      tidyr,
      magrittr,
      FactoMineR,
      impute,
      DT,
      broom,
      stringr,
      skimr,
      cluster,
      ggplot2,
      ggfortify,
      viridis,
      hrbrthemes,
      ggthemes,
      cluster,
      maptools,
      gpclib
      )

让我们看看指尖 API 中有什么

profiles() 功能用于搜索 profiles —与特定疾病或风险因素相关的指标。

profs <- profiles()
DT::datatable(profs, rownames= FALSE)

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

如前所述,我对围产期心理健康感兴趣,所以我会选择这些档案。

sel_profs <- profs[grepl("Perinatal Mental Health", profs$ProfileName),]
DT::datatable(sel_profs, rownames = FALSE)

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

有四个领域围产期心理健康相关。在这些领域中,有许多在不同时期、不同地域、不同性别、不同年龄段等出现的指标

peri_inds <- indicators(ProfileID = sel_profs$ProfileID)
DT::datatable(peri_inds, rownames= FALSE)

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

这给了我们 49 围产期心理健康指标,我们现在可以使用**指尖 _ 数据()**函数结合调用 purrr::map() 来提取这些指标。

peri_df <- peri_inds$IndicatorID %>% map(~fingertips_data(IndicatorID = .))

这导致 49 不稳定;但是,许多是空的,需要删除。

我将对这 49 个指标使用降维(PCA)和聚类(PAM)来生成具有类似围产期心理健康指标特征的县的聚类。这可能有助于确定区域差异,并可能有助于改进研究和控制工作的未来框架。

我将从风险&相关因素领域中选择**抑郁症:%记录患病率(18 岁以上)**作为所有其他指标匹配的关键指标。下面的代码在县一级提取这些数据,将值变量重新编码为最近的发病率,并提取病例的总体发病率。我过滤掉缺失的数据,并调整时间段来代表每个滚动平均值的最后一年。

peri_inc <- as_tibble(peri_df[[10]]) %>% 
        dplyr::filter(AreaType %in% "County & UA") %>% 
        dplyr::select(AreaName, Timeperiod, rec_inc_rate = Value) %>% 
        mutate(Timeperiod = Timeperiod %>% 
                 str_split("/") %>% 
                 map_chr(first) %>% 
                 as.numeric() %>% 
                 {. + 2} %>% 
                 as.character())peri_df_extraction <- function(peri_df, var_name, area_type = "County & UA") {
  df <- peri_df %>% 
    filter(AreaType %in% area_type) %>% 
    dplyr::select(AreaName, Value, Timeperiod) %>% 
    rename_at(.vars = vars(Value), funs(paste0(var_name)))

  return(df)
}var_names <- c("fertility_rate",
               "booking_under_20",
               "reproductive_age",
               "non_UK",
               "birth_under_20",
               "booking_over_40",
               "booking_BAME",
               "poverty",
               "IDACI",
               "homelessness",
               "contraceptions_under_18",
               "single_parent",
               "sever_mental_illness",
               "drug_treatment",
               "alcohol_treatment",
               "child_protection", 
               "child_in_need", 
               "infant_mortality",
               "child_looked_after", 
               "sole_birth",
               "complex_social_factors",
               "multiparity",
               "caesarean",
               "preterm",
               "stillbirth",
               "abuse", 
               "skin_contact",
               "distress_lb", 
               "distress_ub", 
               "mild_depressive_lb", 
               "mild_depressive_ub", 
               "chronic_SMI", 
               "postpartum_psychosis", 
               "PTSD", 
               "severe_depressive",
               "booking_detection",
               "booking_substance",
               "booking_support",
               "booking_alcohol",
               "booking_complex_social_factors",
               "booking_early",
               "less_14_days",
               "review_8_weeks",
               "review_12_months",
               "antenatal_MH_detection",
               "postnatal_MH_detection",
               "postnatal_emotional_change",
               "postnatal_MH_support"
               )extracted_tb <- map2(peri_df[-10], var_names, ~peri_df_extraction(.x, .y)) %>% 
    reduce(full_join, by = c("AreaName", "Timeperiod"))com_peri_df <- peri_inc %>% 
  left_join(extracted_tb, by = c("AreaName", "Timeperiod")) %>% 
  mutate(year = Timeperiod %>% as.numeric) %>% 
  mutate_if(is.character, as.factor) %>% 
  dplyr::select(-Timeperiod)skimr::skim(com_peri_df)

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

我们需要检查数据的完整性:

get_frac_missing <- function(df) {
  df %>% 
    nest() %>% 
    mutate(missing = map(data,~map_dfr(. ,~sum(is.na(.))/length(.)))) %>% 
    dplyr::select(-data) %>% 
    unnest(missing) 
}## Get the proportion missing per variableby year
peri_miss_per_year <- com_peri_df %>% 
  group_by(year) %>% 
  get_frac_missing %>% 
  mutate_all(~round(., 2)) %>% 
  arrange(year)## Drop full missing variables
peri_partial_miss_year <- peri_miss_per_year %>% 
  select_if(~!sum(.) == length(.))## Full missing variables
com_miss_vars <- setdiff(names(peri_miss_per_year), names(peri_partial_miss_year))## Which year has the most complete data
peri_complete_years_all_vars <- com_peri_df %>% 
  group_by(year) %>% 
  nest() %>% 
  mutate(missing = map(data,~mean(colSums(is.na(.))/nrow(.)))) %>% 
  dplyr::select(-data) %>% 
  unnest(missing) %>% 
  mutate(missing = round(missing, 2)) %>% 
  arrange(year)DT::datatable(peri_complete_years_all_vars, rownames = FALSE)

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

通常我会用最新的可用数据;然而,在这种情况下,它是相当稀疏的,所以让我们看看来自 2015 年的数据。

peri_df_2015  <- janitor::remove_empty(com_peri_df) %>% 
  filter(year == 2015) %>% 
  filter(rec_inc_rate > 7.39) %>% 
  select(-year)DT::datatable(peri_df_2015, rownames = FALSE)

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

这给我们留下了 2015 年以来 38 个县的 8 个孕产妇心理健康指标的整洁数据集。

降维

我们现在准备对数据进行一些聚类分析。第一步是使用 PCA 降低数据的维数。我们使用 FactoMineR 包中的 estim_ncp 函数(该函数使用本文中概述的方法)来估计所需的主要组件的数量。然后,我们执行主成分分析,并绘制每个成分解释的方差,作为对 estim_ncp 的检查。以下所有分析都是使用嵌套 tibbles 完成的,因此可以很容易地推广到更高维的用例。

让我们使用 estim_ncp 函数计算主成分的最佳数量,使用 prcomp 函数执行 PCA,并绘制每个成分解释的方差,作为对 estim_ncp 的检查。

df <- as.data.frame(peri_df_2015)
FactoMineR::estim_ncp(df[2:9], ncp.min = 2, ncp.max = 10) 

组件的最佳数量为 4。

peri_pca <- peri_df_2015 %>% 
  nest() %>% 
  mutate(
    numeric_data = map(data, ~select_if(., is.numeric) %>% 
                         as.data.frame()),
    optimal_pca_no = map(numeric_data, ~estim_ncp(., 
                                                  scale = TRUE, 
                                                  ncp.min = 2, 
                                                  ncp.max = 6)) %>% 
      map_dbl(~.$ncp),
    pca = map(numeric_data, ~prcomp(.x, 
                                    center = TRUE, 
                                    scale = TRUE)),
    pca_data = map(pca, ~.$x),
    pca_aug = map2(pca, data, ~augment(.x, data = .y)))## Variance explained
var_exp <- peri_pca %>% 
  dplyr::select(-optimal_pca_no) %>% 
  unnest(pca_aug) %>% 
  summarize_at(.vars = vars(contains("PC")), .funs = funs(var)) %>% 
  gather(key = pc, value = variance) %>% 
  mutate(var_exp = variance/sum(variance) * 100,
         cum_var_exp = cumsum(var_exp),
         pc = str_replace(pc, ".fitted", "") %>% 
           str_replace("PC", ""))## Plot variance explained
var_exp %>% 
  rename(
    `Variance Explained` = var_exp,
    `Cumulative Variance Explained` = cum_var_exp
  ) %>% 
  gather(key = key, value = value, `Variance Explained`, `Cumulative Variance Explained`) %>%
  mutate(key = key %>% 
           factor(levels  = c("Variance Explained", 
                              "Cumulative Variance Explained"))) %>% 
  mutate(value = value / 100) %>% 
  mutate(pc = factor(pc, levels = as.character(1:max(var_exp$pc %>% as.numeric)))) %>% 
  ggplot(aes(pc, value, group = key)) + 
  geom_point(size = 2, alpha = 0.8) + 
  geom_line(size = 1.1, alpha = 0.6) + 
  facet_wrap(~key, scales = "free_y") +
  theme_bw() +
  labs(
    title = "Variance Explained by Principal Component",
    subtitle = paste0("The optimal number of principal components suggested by estim_ncp was ",
                      peri_pca$optimal_pca_no, " which explains ", round(var_exp$cum_var_exp[[2]], 0), "% of the data."),
    x = "Principal Component",
    y = "Variance Explained (%)",
    caption = "[@MattOldach](http://twitter.com/MattOldach) Source: Public Health England (fingertipsR)"
  )

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

## Perform pam on pca data 1 to 6 groups
peri_pca_pam <- peri_pca %>%
  mutate(centers = list(2:10)) %>% 
  unnest(centers, .preserve = everything()) %>% 
  dplyr::select(-centers, centers = centers1) %>% 
  group_by(centers) %>% 
  mutate(
    pam = map(pca_data,
              ~ pam(x = .x[, 1:optimal_pca_no], k = centers, stand = TRUE)),
    clusters = map(pam, ~.$clustering),
    avg_silhouette_width = map(pam, ~.$silinfo$avg.width),
    data_with_clusters = map2(.x = data, .y = clusters, ~mutate(.x, cluster = factor(.y, ordered = TRUE)))
  ) %>% 
  ungroup## Get max silhouette width
max_silhouette_width <- peri_pca_pam %>% 
  dplyr::select(centers, avg_silhouette_width) %>% 
  unnest(avg_silhouette_width) %>% 
  arrange(desc(avg_silhouette_width)) %>% 
  slice(1)

## Plot average silhouette width
peri_pca_pam %>% 
  dplyr::select(centers, avg_silhouette_width) %>% 
  unnest(avg_silhouette_width) %>% 
  ggplot(aes(x = centers, y = avg_silhouette_width)) +
  geom_line(size = 2, alpha = 0.4) +
  geom_point(size = 3, alpha = 0.8) +
  theme_bw() +
  scale_x_continuous(breaks = seq(1, 10, 1), minor_breaks = NULL) +
  scale_y_continuous(limits = c(NA, NA), breaks = seq(0, 1, 0.01), minor_breaks = NULL) +
  labs(title = "Average Silhouette Width by Number of PAM Clusters",
       subtitle = paste0("The optimal number of clusters identifed by avg. silhouette width was ",
                      max_silhouette_width$centers,
                      " with an avg. silhouette width of ", 
                      round(max_silhouette_width$avg_silhouette_width, 2)
       ),
       x = "Clusters",
       y = "Avg. Silhouette Width",
       caption = "[@MattOldach](http://twitter.com/MattOldach) Source: Public Health England (fingertipsR)")

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

## Plot clusters
pca_plot <- peri_pca_pam %>% 
  filter(centers == max_silhouette_width$centers) %>% 
  select(data_with_clusters, pca) %>% 
  mutate(pca_graph = map2(.x = pca, 
                          .y = data_with_clusters,
                          ~ autoplot(.x, x = 1, y = 2, 
                                     loadings = TRUE, loadings.label = TRUE,
                                     loadings.label.repel = TRUE,
                                     loadings.label.size = 2, loadings.alpha = 0.8,
                                     loadings.label.vjust = -1, data = .y, 
                                     label = TRUE, label.label = "AreaName",
                                     label.size = 1.5, label.vjust = -1, 
                                     alpha = 0.3, frame = TRUE, 
                                     frame.type = 'convex', frame.alpha= 0.05,
                                     colour = "cluster", size = "rec_inc_rate") +
                            theme_bw() +
                            labs(x = paste0("Principal Component 1 (Variance Explained: ",
                                            round(var_exp$var_exp[[1]], 1), "%)"),
                                 y = paste0("Principal Component 2 (Variance Explained: ",
                                            round(var_exp$var_exp[[2]], 1), "%)")) +
                            guides(colour=guide_legend(title = "Cluster", ncol = 2), 
                                   fill=guide_legend(title= "Cluster", ncol = 2),
                                   size = guide_legend(title = "Depression: % recorded prevalence",
                                                       ncol = 2)) +
                           scale_color_manual(name = "Cluster",
                                              values = c("#6b5b95",
                                                         "#feb236",
                                                         "#d64161",
                                                         "#ff7b25",
                                                         "#87bdd8")) +
                           scale_fill_manual(name = "Cluster",
                                              values = c("#6b5b95",
                                                         "#feb236",
                                                         "#d64161",
                                                         "#ff7b25",
                                                         "#87bdd8")) +
                            theme(legend.position = "bottom", 
                                  legend.box = "horizontal") +
                            labs(
                              title = "Maternal Mental Health in England",
                              subtitle = "The arrows are variable loadings and points are counties coloured by cluster membership",
                              caption = "[@MattOldach](http://twitter.com/MattOldach) Source: Public Health England (fingertipsR)"
                            )
  )) %>% 
  pull(pca_graph) %>% 
  firstpca_plot

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

sum_peri_df <- peri_pca_pam %>% 
  filter(centers == max_silhouette_width$centers) %>% 
  pull(data_with_clusters) %>% 
  map(~ gather(., key = "Variable", value = "value", -AreaName, -cluster)) %>% 
  first %>% 
  rename(Cluster = cluster)plot_cluster_diff <- sum_peri_df %>% 
  ggplot(aes(x = Variable, y = value, col = Cluster, fill = Cluster)) +
  geom_violin(draw_quantiles = c(0.025, 0.5, 0.975), alpha = 0.2, scale = "width") +
  geom_jitter(position = position_jitterdodge(), alpha = 0.3) +
  coord_flip() +
  theme_minimal() +
  scale_y_continuous(breaks = seq(0, 100, 6), minor_breaks = NULL) +
  scale_fill_manual(name = "Cluster",
                                              values = c("#6b5b95",
                                                         "#feb236",
                                                         "#d64161",
                                                         "#ff7b25",
                                                         "#87bdd8")) +
  scale_color_manual(name = "Cluster",
                                              values = c("#6b5b95",
                                                         "#feb236",
                                                         "#d64161",
                                                         "#ff7b25",
                                                         "#87bdd8")) +
  theme(legend.position = "bottom") +
  labs( 
    title = "Maternal Mental Health in England; Summarised by Cluster",
    subtitle = "Violin plots are scaled by width, with the 2.5%, 50% and 97.5% quantiles shown.",
    x = "Variable",
    y = "Recorded % depression prevalance (aged 18+) for rec_int_rate, otherwise proportion (0-100%)",
    caption = "[@MattOldach](http://twitter.com/MattOldach) Source: Public Health England (fingertipsR)")plot_cluster_diff

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

从这些图中,我们看到,显示较高近期增长率的第三组有较高比例的产后精神病、轻度抑郁和苦恼。

我们可以在地图上用英国数据服务提供的英国各县的轮廓来绘制每个县的聚类成员关系(在此下载 ShapeFiles,在此下载)。

peri_cluster_map <- function(peri_pca_pam) {
gpclibPermit()england_counties <- rgdal::readOGR("england_ct_2011.shp") %>%
  fortify(region = "code") %>% 
  as_tibbleengland_urban_areas <- rgdal::readOGR("england_urb_2001.shp") %>% 
  fortify(region = "name") %>% 
  as_tibble %>% 
  filter(id %in% c("Sheffield Urban Area", 
                   "Plymouth",
                   "Skelton (Redcar and Cleveland)",
                   "Brighton/Worthing/Littlehampton",
                   "Leicester Urban Area"
                   ))## Make custom positions for urban area labels
urban_area_labels <- england_urban_areas %>%
  group_by(id) %>% 
  slice(100) %>% 
  ungroup() %>% 
  mutate(long = long - 200000,
         lat = lat + 20000)

peri_cluster_results <- peri_pca_pam %>% 
  filter(centers == max_silhouette_width$centers) %>% 
  pull(data_with_clusters) %>% 
  firstperi_cluster_results <- peri_df[[14]] %>% 
              dplyr::select(AreaName, AreaCode, AreaType) %>% 
  filter(AreaType %in% "County & UA") %>% 
              unique %>% 
  left_join(peri_cluster_results,
            by = "AreaName") %>% 
  left_join(england_counties, by = c("AreaCode" = "id"))peri_cluster_results %>% 
  rename(Cluster = cluster) %>% 
  drop_na(Cluster) %>% 
  dplyr::select(long, lat, Cluster, group) %>% 
  ggplot( 
                 aes(x = long, 
                     y = lat,
                     fill = Cluster)) +
    geom_polygon(data = england_urban_areas, 
                 aes(group = group, fill = NULL),
                 alpha = 0.4) +
    geom_path(data = peri_cluster_results, 
              aes(group = group, fill = NULL), 
              alpha = 0.4) +
    geom_polygon(data = peri_cluster_results, 
                 aes(group = group, fill = NULL),
                 alpha = 0.1) +
    geom_polygon(aes(group = group), alpha = 0.6) +
    geom_line(data = urban_area_labels %>% 
                bind_rows(urban_area_labels %>% 
                            mutate(long = long + 200000, 
                                   lat = lat - 20000)),
              aes(fill = NA, group = id), alpha = 0.8) + 
    geom_label(data = urban_area_labels,
              aes(label = id), fill = "grey") +
    scale_fill_manual(name = "Cluster",
                                              values = c("#6b5b95",
                                                         "#feb236",
                                                         "#d64161",
                                                         "#ff7b25",
                                                         "#87bdd8")) +
    coord_equal() +
    theme_map() +
    theme(legend.position = "bottom") +
    labs(title = "Maternal Mental Health Indicators; Map of County Level Clusters in England",
         subtitle = "Using data from 2015",
         caption = "Selected urban areas are shown (dark grey) and labelled.
[@MattOldach](http://twitter.com/MattOldach) Source: Public Health England (fingertipsR)
Contains National Statistics data © Crown copyright and database right 2019\. 
         Contains OS data © Crown copyright and database right 2019")
}plot_peri_cluster_map <- peri_cluster_map(peri_pca_pam)plot_peri_cluster_map

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

用掩蔽 R-CNN 模型识别低分辨率图像上的屋顶

原文:https://towardsdatascience.com/identifying-rooftops-on-low-resolution-images-with-masked-r-cnn-model-6edd79310ec0?source=collection_archive---------25-----------------------

工作由 传承巴胡古纳*拉西卡乔希 完成。*

在我之前的帖子中,我写了我们如何使用 U-Net 模型来识别低分辨率卫星图像中的屋顶。我还写了我们如何利用一个 ML 爱好者社区来构建解决方案。在这篇文章中,我将分享另一个模型的结果,即掩蔽 R-CNN。如果你想了解更多关于我们正在解决的问题,请阅读机器学习如何在清洁能源领域带来一个新时代

由于来自印度(和大多数发展中国家)的卫星图像的质量是低分辨率的,手头的任务的复杂性增加了。类似的解决方案如谷歌天窗项目只适用于高分辨率图像,不适用于大多数发展中国家。

面具 R-CNN 是由脸书人工智能研究小组制造的。Mask R-CNN 的工作原理相当简单。研究人员将两个先前存在的模型结合在一起,并对线性代数进行了研究。该模型可以分为两部分——区域建议网络(RPN)和二值掩码分类器。第一步是获得一组可能包含相关对象的边界框。第二步是给盒子上色。

我们使用该模型的目的是分割或分离图像中的每个屋顶实例。

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

Example of outputs we want

我们的挑战始于缺乏数据,因为没有屋顶数据集。

我们使用在“coco”数据集上训练的来自 Mask R-CNN 网络的权重作为我们模型的起点,该数据集最初被训练来识别 80 个类,但是没有屋顶。Resnet 101 被用作主干结构。我们开始为“头”层训练我们的模型,即网络的 RPN、分类器和掩码头;因为训练整个网络将需要大量的数据,并且因为它是在许多不同的类上预先训练的模型,所以这将是一个好的开始。然后,为了查看它在预测中产生的差异,我们将培训提升到 Resnet 101 体系结构的第 4 和第 5 阶段。

我们也尝试了不同的变化。图像大小从 1024X1024 更改为 320X320,因为我们的训练图像大小为 300X300,而填充将其增加到 1024 似乎不是一个好主意。

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

Multiple models that we used with changing image size and processing

下面是一些输入图像的结果。

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

Original Image (1)

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

我们比较了另外 20 个屋顶的结果,我们的结果显示模型 4 通常表现最好。

然后,我们尝试将最小检测置信度阈值从 0.9 更改为 0.7。低于该值的感兴趣区域(ROI)将被跳过。这样做是因为对于检测屋顶来说,0.9 似乎是一个非常高的阈值,当它可以被降低到足以预测任何区域作为屋顶时,因为屋顶不是复杂的,定义良好的和非常具体的区域;因此,任何地区,可以成为一个很好的候选屋顶应予以考虑。值为 0.7 时,我们有更多的区域,但它也显示了许多重叠的屋顶区域,而值为 0.9 时,我们有几个大斑点将所有相邻的屋顶作为一个区域。

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

Detection confidence 0.7

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

Detection confidence 0.9

除此之外,我们试图通过将优化器从随机梯度下降(SGD)改为 Adam 优化器来训练模型。

以下是使用 SGD 和 Adam optimizer 训练的模型的结果图像。训练是有 70%和 90%的把握完成的。对每个训练好的模型进行 70%和 90%置信度的测试。

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

Adam Optimizer 0.7 threshold

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

SGD 0.7 threshold

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

Adam Optimizer threshold 0.7

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

SGD threshold 0.7

我们的发现:

1.与 SGD 训练模型相比,Adam optimizer 训练模型无法预测所有实例,也无法区分相邻屋顶。

2.SGD 训练的模型比 Adam 训练的模型预测更清晰的遮罩。这表明 SGD 对我们的模型更好,我们将继续使用它。

关于 SGD 变化:

1.以 70%的置信度训练模型增加了遮罩的数量,因为它已经被训练为也考虑低概率屋顶,这导致重叠遮罩。而 90%的训练是给更干净更少的面具。所以,用 90%训练似乎是更好的选择。

2.现在,用 70%的置信度还是 90%的置信度来预测口罩?90%太精确,可能会删除其他选项,而 70%将包括它们,如图 4 和 7 所示。因此,在训练了更多数量的图像(目前训练了超过 95 张图像)之后,我们将能够看到哪一张能够最终被使用。

作为识别各个屋顶的最后一步,我们做了一些后期处理。我们从奇怪的彩色形状中创造出规则的形状。在 607 幅图像的数据集上进行后处理。

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

Output from Masked R-CNN

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

Individual rooftops

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

最后,我们还要感谢 Paul 和 Piyush 提供了培训数据。如果有人想进一步帮助我们,请加入我们的 git repo 或联系 rudradeb@savera.ai

确定纽约曼哈顿对狗最友好的社区

原文:https://towardsdatascience.com/identifying-the-most-dog-friendly-neighborhoods-in-manhattan-new-york-city-732080688353?source=collection_archive---------24-----------------------

介绍

无论你是狗主人还是狗护理行业的企业,确定城市中对狗友好的地点始终是一项重要的任务。在世界各地的大都市中,纽约市(NYC)被认为是对狗最友好的城市之一,它有许多公园、狗场和适合散步的社区。根据纽约市政府的在线数据平台纽约开放数据(New York Open Data)的数据,截至 2019 年 7 月 26 日,该市有 345,727 只狗拥有有效的许可证。这份报告旨在确定曼哈顿对狗最友好的社区,这是纽约市狗最密集的一个区。

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

A heat map of New York’s dog population per capita by Nate Rattner showing that Manhattan is the most dog-dense borough in New York City

目标

这份报告评估了曼哈顿社区的友好程度,从而为这个大都市的狗主人和狗护理企业确定了最佳社区。为此,我们主要集中分析曼哈顿社区养狗所需的公共设施的可用性,即公园、狗场和宠物设施。这份报告的发现将为纽约市,尤其是曼哈顿的狗主人和狗护理行业的企业提供有用的信息来源。

数据

为了实现其目标,该报告使用了以下数据:
·纽约大学的纽约市社区列表,包含 5 个区的 306 个社区:https://geo.nyu.edu/catalog/nyu_2451_34572
使用 Python 地理编码包
获得每个社区的经度和纬度;使用 Foursquare API 获得每个社区的场地数据。特别是,Foursquare API 提供了基于位置的体验,提供了关于地点、用户、照片和签到的各种信息。它支持实时访问地点,将用户分配到特定位置。

方法学

首先,我们需要创建一个数据框,其中包含曼哈顿所有街区的完整列表及其坐标纬度和经度。此步骤需要:
从纽约大学的空间数据存储库中加载 2014 年纽约市街区名称数据集,并将其转换为 panda 数据框。
使用 Geocoder 检索每个街区的经度和纬度,这是一个允许我们将位置地址转换为地理坐标的包。

下一步,我们将使用 Foursquare API 探索曼哈顿附近的场地位置。Foursquare API 是一种社交定位服务,允许用户探索他们周围的世界。有了 Foursquare 开发人员帐户,我们可以使用我们的用户凭证来搜索附近特定类型的场馆,探索特定的场馆,以及搜索某个位置周围的热门场馆。

出于这个项目的目的,我们将主要关注公共公园和遛狗场,这两个设施对于任何一个对狗友好的社区都是必不可少的。使用 Foursquare API,我们可以很容易地在曼哈顿的各个街区检查公园和狗跑的出现频率的平均值。从这里开始,我们评估曼哈顿社区对狗友好程度的任务可以归结为找出公园和狗赛跑出现频率最高的社区。为了使结果在视觉上引人入胜,我们还会将邻域分组,并为每个分组分配颜色和标签。这一步将通过采用 k-means 聚类来完成,k-means 聚类是最简单和最流行的无监督机器学习算法之一,它将数据点分组到以质心为中心的最近的聚类中。

最终结果将是代表曼哈顿公园和狗群不同聚集程度的彩色编码地图。

结果和观察

我们的数据分析显示,曼哈顿公园最集中的 3 个街区是:
·斯图文森镇
·巴特利公园市
·晨边高地

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

Manhattan’s neighborhoods with the highest concentration of parks

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

A Map of Stuyvesant Town showing that the neighborhood has plenty of parks and open spaces

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

A map of Manhattan showing clusters of neighborhood by the concentration of parks

值得注意的是,对公园最集中的社区 Stuyvesant Town 的场馆的进一步检查表明,在该社区 1 公里范围内的 30 个顶级场馆中,不仅有各种公园,还有一条小径、一个风景了望台、一家宠物咖啡馆甚至一家宠物服务店!这表明 Stuyvesant 镇确实是一个有各种选择或享受活跃的狗的社区。

关于狗跑,以下 3 个街区是最集中的区域:

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

Maps of Roosevelt Island showing that the neighborhood has plenty of parks and open spaces

对罗斯福岛附近热门场馆的进一步调查还显示,该岛附近 30 个顶级场馆中有 7 个是开放空间,包括 4 个公园、一个观景台、一个休闲公园和一个滨水区!在像纽约这样的混凝土丛林中,狗友好型社区是多么好的选择啊!

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

Map of Manhattan showing clusters of neighborhoods by the concentration of dog runs

讨论

有趣的是,在我们的分析中,炮台公园城是第二个最集中的公园社区,也被美国房地产市场 Street Easy 选为 2017 年纽约市对狗最友好的社区。Street Easy 的分析是基于每个社区的以下关键变量:(1)宠物友好型租赁单元的份额(2)狗保姆的份额(3)狗公园、狗跑道和非牵引带区域的数量(4)兽医的份额。我们的分析和 Street Easy 的相似性表明,公园和遛狗场等开放空间的高度集中确实是决定任何社区对狗友好的一个重要因素。

然而,我们也注意到,除了这些开放空间,还有相当多的其他设施对享受狗的乐趣同样重要,但我们没有能力包括在这份报告中,如步行人行道,宠物友好型餐厅和咖啡店,兽医诊所和宠物护理店。此外,除了所有必要的设施之外,一个社区只有在拥有大量健康的狗和热情的主人的情况下,才能真正做到对狗友好。事实上,在像纽约这样的大城市找到一个具备所有这些元素的社区并不容易。希望有了越来越多的有用信息,比如这份报告中提供的信息,狗的父母将会在为他们自己和他们毛茸茸的孩子选择最好的家时得到充分的信息。

局限性和进一步研究的建议

正如在讨论中提到的,在这项研究中,我们只研究了公园和遛狗区这两个对狗友好的社区的基本设施。我们认为,有相当多的其他变量应该包括在内,以提高研究的全面性。这些变量包括(但不限于)可步行性、安全性、宠物友好型餐厅和咖啡店的可用性、兽医诊所以及拥有有效许可证的狗的数量。据我们所知,纽约市/曼哈顿区的此类变量数据仅以邮政编码为单位。由于邮政编码不是一个通用的地理区域,而是由美国邮政服务为邮件投递创建的路线和地址的集合,因此通常更难处理。未来的研究可以找到一种方法将这一单位转换成相应的地理区域,以便上述数据可以很容易地投入使用。

参考资料:

  1. https://www . nytimes . com/interactive/2018/02/08/real estate/dogs-of-new-York . html
  2. https://medium . com/@ nater attner/new-York-city-most-dog-dense-zip-codes-3697 e 2993908
  3. https://street easy . com/blog/nycs-most-dog-friendly-neighborhoods/
  4. https://data . cityofnewyork . us/Health/NYC-Dog-Licensing-Dataset/nu7n-tubp/data

使用 BERT 识别单词的正确含义

原文:https://towardsdatascience.com/identifying-the-right-meaning-of-the-words-using-bert-817eef2ac1f0?source=collection_archive---------16-----------------------

使用语境化单词嵌入的一个重要原因是,标准嵌入为单词的每个含义分配一个向量,然而,存在多个含义的单词。假设上下文的使用可以解决将多个意思的单词(同音异义词和同形异义词)分类到同一个嵌入向量中的问题。在这个故事中,我们将分析伯特嵌入是否可以用来对一个词的不同含义进行分类,以证明语境化的词嵌入解决了这个问题。

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

Duck or duck — based on images from Pixabay

构建数据集

使用“鸭子”这个词的想法来自我今天早些时候看到的一条推文。由于单词有多种含义,这种误解比较常见。根据韦氏词典,单词“duck”有 4 个意思。为了这个项目的简单,我把动词‘duck’和相应的名词归类为相同的意思:

  1. a)各种游禽(鸭科,鸭科),颈和腿短,足有蹼,喙通常宽而平,雌雄之间的羽毛通常不同
    ; b)这些鸟的肉可用作食物
  2. 突然低下头或身体
  3. a)一种耐用的紧密编织的通常是棉布的纤维
    b)鸭子复数 : 轻便的衣服尤其是鸭子做的裤子

Misunderstanding the meaning of ‘duck’ — Tweet by natsmama75 on Twitter

为了建立一个数据集,我使用了你的字典的句子数据库,搜索包括‘duck’的句子。从给出的例子中,我排除了那些我不能区分含义的名字、长句和案例。

最终数据集可在 GitHub 中获得。它包含 77 个句子,分布如下:50 个是指动物(类型 0),17 个是动词的一种形式(类型 1),10 个是指织物(类型 2)。

The duck dataset

伯特嵌入

对于这个故事的下一部分,我们将使用原始 BERT 基础无案例模型[1]中的 BERT 嵌入。这意味着使用最后一个隐藏层,我们为每个单词生成一个 768 大小的向量。

我们根据句子为每个单词生成上下文嵌入向量。然后,我们只保留“duck”单词标记的嵌入。这个故事的问题是,我们能否用这 768 个大小向量来对不同的意义进行分类。

主成分分析

PCA 是一种正交变换,我们将使用它来降低向量[2,3]的维数。PCA 以最大化降维数据的方差的方式为投影找到特殊的基向量(特征向量)。使用 PCA 有两个重要的好处。一方面,我们可以将 768 维向量投影到 2D 子空间,在那里我们可以将其绘制成数据。另一方面,它保持最大可能的方差(投影丢失信息),因此,它可能保持足够的方差,以便我们可以识别图片上的类别。

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

Maximising variance for the first principal component — Equation from Wikipedia

使用带有[sklearn.decomposition.PCA](https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html)的 PCA 是一行程序:
duck_pca = PCA(n_components=2).fit_transform(duck_embs)

下图显示了使用前两个主成分的预测结果。这些类是手动注释的类型。正如我们所看到的,使用主成分分析,我们可以很容易地将动词类型与其他类型分开。

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

Duck meaning types. Projection using PCA

最近邻分类

由于数据集相对较小,我们将使用 k-NN 分类器,而不是神经网络[4]。k-NN 使用 k 个最接近的样本来预测新样本的类别。因为我们在第三类中只有 10 个样本,所以需要使用 k <20 as the k-NN selects the most represented class from the neighbourhood.

For the validation, we will use LOOCV (Leave One Out Cross-Validation) [5]. This means that for every sample, we build a model based on the other 76 samples and validate it with the single sample. Then, we calculate the accuracy of these 77 successful or unsuccessful prediction.

Using 【 , these steps are well prepared and easy to execute:

The evaluation of the LOOCV states精度为 92.208% 标准差为 26.805%。

与谷歌翻译的比较

我的母语匈牙利语用不同的词来表达“鸭子”的不同含义。因此,使用英匈翻译器,我们可以识别翻译器背后的神经网络(称为 GNMT [6]) 认为,‘鸭子’是哪个意思。

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

Google Translate English-Hungarian translation of the ‘duck’ sentences

上表显示,所有鸟型“鸭”字都使用正确的类型进行翻译,17 个动词型字中有 8 个被翻译,但是,所有织物“鸭”字都被识别为鸟。这个结果显示了 75.641% 的准确率。

摘要

在这个故事中,我们展示了使用语境化的单词嵌入可以成功地解决多义词的问题。实验支持假设,即当我们使用 k-NN 分类器重建类型时,BERT 嵌入存储单词的不同含义。

所有对应的代码都可以在 Google Colab 上找到。

参考

[1] Devlin,j .,Chang,M. W .,Lee,k .,& Toutanova,K. (2018 年)。 Bert:语言理解深度双向转换器的预训练。 arXiv 预印本 arXiv:1810.04805

[2]皮尔逊,K. (1901 年)。 LIII。在最接近空间点系统的直线和平面上。 《伦敦、爱丁堡和都柏林哲学杂志和科学杂志2 (11),559–572 页。

[3]h .霍特林(1933 年)。将复杂的统计变量分析成主要成分。 《教育心理学杂志》24 (6),417 页。

[4]盖,t .,&哈特,P. (1967 年)。最近邻模式分类。 IEEE 信息论汇刊13 (1),21–27。

[5]拉兴布鲁奇,P. A .,&米基,M. R. (1968 年)。判别分析中错误率的估计。 技术计量学10 (1),1–11。

[6]吴,m .舒斯特,陈,z .乐,Q. V .,m .马切里,w .,… &克林纳,J. (2016)。谷歌的神经机器翻译系统:弥合人类和机器翻译之间的鸿沟。 arXiv 预印本 arXiv:1609.08144

用伯特的故事学习 NMT

  1. BLEU-BERT-y:比较句子得分
  2. 嵌入关系可视化(word2vec,BERT)
  3. 机器翻译:一个简短的概述
  4. 使用 BERT 识别单词的正确含义
  5. 机器翻译:对比 SOTA
  6. 使用 TensorFlow 2.0 的简单 BERT】

确定曼谷冬季空气污染的来源第一部分

原文:https://towardsdatascience.com/identifying-the-sources-of-winter-air-pollution-in-bangkok-part-i-d4392ea608dc?source=collection_archive---------10-----------------------

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

Air Pollution Map near Bangkok in January 2019

在许多亚洲国家,空气污染是一个严重的环境威胁。在泰国,由于 2019 年冬季曼谷的空气污染程度较高,这个问题最近变得更加突出。空气污染通过空气质量指数(AQI)来报告,数值越高表明空气污染越严重。了解当前的室外空气质量可以帮助你保护自己。

游客和当地人可能会有这样的疑问:空气污染越来越严重了吗?是否存在一天中的某个时间或一周中的某天的依赖性?曼谷以外的省份呢?在这篇博文的第一部分,我将通过可视化公开的空气污染数据来回答这些问题。根据这些数据,我们可以对空气污染的来源提出一些假设。在这篇博文的第二部分,我将对空气污染数据进行建模。

用于生成这些图的代码可以在 GitHub 上我的笔记本中找到。这项工作的灵感来自于数据狂人在脸书的一篇帖子。看看我早先的博客的帖子,详细介绍了如何从政府网站上删除空气污染数据。

AQI 是如何计算的?

环境机构使用空气质量指数(AQI)报告空气污染测量值。如何将这些测量值转换成数字的细节取决于当地法律。一般来说,环境机构需要监测四种污染源:地面 ozone(O₃、颗粒污染(PM2.5 和 PM10)和有毒气体(NO₂、CO、SO₂).下面的快照显示了泰国环境署网站提供的 2019 年 2 月 2 日泰国各监测站的 CO,NO₂,O₃,SO₂,PM10 和 PM2.5 水平的报告。空气污染指数在大多数地方都是正常的,除了北部省份的高水平 PM2.5,以红色显示。

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

计算每种主要污染物的 AQI 值(每种都有自己的公式),并报告 24 小时内的最高平均 AQI 值 。由于上述数据表明 PM2.5 污染物较高,我们将重点分析 PM2.5 数据。

PM2.5 是对大气中小于 2.5 微米的颗粒的测量。在美国,PM2.5 浓度高于 35.4 g/m 相当于 AQI 为 100,对于普通人群来说被认为是中度污染,对于敏感人群(儿童、孕妇和老年人)来说是不健康的。高于 55.4 克/立方米的 PM2.5 对应的 AQI 为 150,被认为是不健康的。

是什么导致了去年冬天曼谷高度的空气污染?PM2.5 颗粒的主要来源是汽车发动机、发电厂和农业废物燃烧的废气,这导致了许多理论——停滞的气流、老旧的柴油车、燃煤电厂和邻近省份的农业燃烧。随着公众对这个问题关注的增加,人们也开始怀疑空气污染是否正在恶化。政府提出了一些短期措施来解决这个问题。但是为了最有效的缓解,我们需要了解污染的来源。

曼谷的冬季阴霾

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

PM 2.5 pollution in Bangkok over time( the gray vertical bands are guide to the eyes), and the corresponding google trend

让我们从寻找一般趋势开始。这些数据来自伯克利地球 T2 数据库 T3。曼谷的空气污染似乎是季节性的,在冬天会激增。这似乎不是一个新问题,但公众的认识只是最近才提高的。曼谷的空气质量实际上仍然比许多亚洲国家好。

空气污染越来越严重了吗?我取了每年年末(9 月—5 月)的平均值,并计算了 PM 2.5 AQI 较高的天数:

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

Yearly average PM 2.5 AQI and the number of bad air days

PM2.5 AQI 的年平均值在 2018-2019 年冬季似乎略有增加,而前几年的污染情况相当。这可能是由于测量次数较少,因为 2018-2019 年冬季剩余时间的数据尚未测量。对于天数图,我使用前几年同一时间的天数来估计缺失的数据。在空气不良天数方面,2017-2018 年冬季有 70 天空气质量指数非常高,比上一年多 10 天。在没有更多数据的情况下,很难从这张图表判断情况是否在恶化。

如果你担心空气质量,作为一名去曼谷旅游的游客,你应该避开哪几个月?作为一名居民,什么时候去慢跑最合适?放假大家都不在的时候空气污染好一些吗?为了回答这些问题,我使用 2017 年和 2018 年的数据绘制了不同月份的日平均值。

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

Daily average of PM2.5 pollution in 2017 and 2018

我们再次看到 PM2.5 污染的季节性趋势。2017 年和 2018 年,污染大约从 10 月下旬开始,持续到 4 月初。2017 年新年假期期间的空气质量似乎更好,但 2018 年的数据缺失,因此无法确定。平均来说,游客应该在 10 月底到 4 月初避开曼谷。你可能在想,“但那是我休假的时候!我还能去哪里?”我建议您去普吉岛或苏梅岛。泰国南部全年 AQI 较低,如下图所示。

当地居民呢?空气质量是早上好还是周末好?高峰时间污染会激增吗?要回答这些问题,让我们来看看冬季的每小时平均值。请注意,为了更好地进行比较,我绘制了标准化数据。

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

Normalized average PM 2.5 for different days

周末的空气污染并没有好转。这可能是因为交通同样糟糕(这是真的,周六交通非常糟糕)。或者高空气质量指数是由其他因素造成的。首先,让我们仔细看看空气污染与交通的关系。

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

Hourly average of PM2.5 pollution

在早高峰时段(早上 6-10 点)有一些高峰,但在晚高峰时段没有。由此,我们可以假设其他因素,如温度和风,在决定空气污染水平方面起着更重要的作用。

北方的人们受苦更多

随着季风季节的开始,曼谷的天气会变好,公众对这个问题的关注可能会消退。然而,如果不立即采取政策措施,这个问题将在明年冬天再次出现。事实上,曼谷地区并不是唯一遭受颗粒空气污染的地方。下面,我展示一张 2019 年 2 月的颗粒物污染图。

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

particle pollution map in February 2019

季节性污染不仅限于中部地区。虽然曼谷的空气污染在 1 月份达到顶峰,但污染转移到了北部省份。事实上,从下面显示的全国最高污染水平来看,他们的情况要糟糕得多。请注意,这是一个月平均值的最大值图,用于剔除异常值。

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

maximum particle pollution in each province

北部省份,如南邦、清迈和清莱,空气污染比曼谷更严重,但受到的媒体关注却少得多。南部省份,如普吉、宋卡和庄,全年空气质量良好。

总之,PM 2.5 污染在曼谷和北部省份有季节性趋势,只是最近才受到公众关注。在这次冬季雾霾期间,有害颗粒污染水平全天都很高,包括周末。在这篇博文的第二部分,我将尝试使用机器学习来识别曼谷的空气污染源。

感谢您的阅读,敬请期待第二部分!如果你有任何建议,请在下面留下你的评论。我将给你们留下一张泰国每月平均颗粒污染的 gif 图。

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

确定曼谷冬季空气污染的来源第二部分

原文:https://towardsdatascience.com/identifying-the-sources-of-winter-air-pollution-in-bangkok-part-ii-72539f9b767a?source=collection_archive---------1-----------------------

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

Mae Fah Luang University Campus on March 2019. (Photo by MFU Photoclub with permission)

在之前的博客里,我看了一下曼谷冬天的空气污染。主要污染源来自小于 2.5 微米的颗粒物(PM 2.5 颗粒物)。这些颗粒比人类头发的宽度还小,可以很容易地进入我们的身体,甚至进入我们的血液。上周(2019 年 3 月 17 日),泰国北部多个省份因颗粒污染出现全球最差的空气质量指数(AQI)。到目前为止,还没有提出长期的解决方案,因为 PM 2.5 颗粒污染的来源还没有明确指出。在这本笔记本中,我通过机器学习模型识别了曼谷高 PM 2.5 颗粒物的来源。代码可以在我的 GitHub 页面找到。

高 PM2.5,罪魁祸首是谁?

关于曼谷的空气污染源有三个主要的理论:(1)逆温效应,冷空气和污染物被困在接近地球表面的地方。这一理论是政府在 2019 年冬季开始时提出的。政府将污染归咎于旧柴油发动机的排放。(2)农业焚烧,无论是本地的还是周边省份的。在冬天,全国各地都有大量露天农业焚烧。一些官员试图通过减少露天农业燃烧来解决空气污染问题。(3)来自其他省份或国家的污染。一些非政府组织将污染归咎于发电厂附近。

我的分析过程如下:建立一个机器学习模型(ML)来预测曼谷的空气污染水平,使用环境因素,如天气,交通指数和火灾地图。在模型中包括日期-时间特征,如当地时间、工作日与周末,以捕捉人类活动的其他影响。使用 ML 模型提供的重要性特征识别主要污染源。

如果污染源是本地的,那么空气质量指数将取决于天气模式(风速、湿度、平均温度)、本地交通和一天中的时间等因素。如果污染来自农业燃烧,空气质量指数将取决于活跃的火灾,并有一定的时间滞后,以说明地理分离。根据与曼谷的距离,包括消防活动。另一方面,如果污染与火灾地图不相关,那么模型应该更加重视天气模式,例如风向和风速。

以下是我考虑的特性及其数据来源的列表:

  • 来自美国宇航局公司项目的主动火力信息
  • 天气模式:温度、风速、湿度和降雨,从天气地下网站上刮来
  • 交通指数来自龙道交通
  • 日期时间特性:一天中的小时、一天中的时间和假日模式(在第一部分博客文章中探讨)

让我首先介绍一下该模型中包含的所有功能。

农业烧荒是个大问题!

东南亚的农民选择一月至三月作为焚烧季节。对于泰国北部和东北部省份来说,这些燃烧活动的规模足以使这些省份成为这段时间世界上污染最严重的地方之一。对于曼谷,有人可能会说,因为该地区是重工业而不是农业,它可能不会受到农业燃烧的影响。但事实并非如此。

由于 PM 2.5 颗粒的尺寸很小,它们可以长时间悬浮在大气中,并且可以传播很远的距离。从天气数据来看,平均风速为 10 公里/小时。报告的 PM 2.5 水平是 24 小时的滚动平均值。粗略估计,目前的 PM 2.5 读数可能来自 240 公里以外的来源。下图显示了美国宇航局的卫星在 2018 年 1 月 8 日和 2018 年 2 月 8 日测量的火灾地图,指示了农业燃烧。黄圈表示曼谷 240 公里以内的区域。1 月 8 日的火灾数量(污染水平可接受)远低于 2 月 8 日的火灾数量(污染水平不健康)。

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

Fire spots from NASA’s satellites

事实上,火灾模式与 PM 2.5 模式密切相关。

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

The number of fires aligns with spikes in PM 2.5 levels

天气模式

逆温效应经常发生在冬季,因为近地面温度较低。顶部较热的空气阻碍了冷空气的流动。这种停滞的大气条件使 PM 2.5 颗粒在空气中悬浮的时间更长。另一方面,较高的湿度或雨水将有助于清除大气中的颗粒。这也是过去空气污染严重时,政府向空气中喷水的原因之一。不幸的是,这种缓解措施似乎并不有效,因为水量与实际降雨量相比微不足道。天气模式对空气污染的影响有多大?让我们比较一下冬天和其他季节的天气。

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

compare the weather pattern in winter and other seasons

冬天的温度、风速和湿度都较低,但幅度不大。现在,让我们来看看其中每一项与 PM 2.5 水平的关系。

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

Effect of temperature, wind speed, and humidity on PM 2.5 level in winter

较高的温度(这破坏了逆温效应)、风速和湿度与污染水平呈负相关。

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

Effect of wind on PM 2.5 level in winter

在有风的日子里,污染明显更好。与无风天气相比,有风天气 PM 2.5 水平分布的中值较低。

事实上,污染程度也取决于风向,正如这个图所示。为了简单起见,我只选择了四个主要的风向。

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

PM2.5 relationship with the wind direction in winter

在风从南方吹来的日子,污染水平可能较低,因为泰国湾在曼谷的南面。干净的海风改善了空气质量。来自其他三个方向的风通过陆路。然而,在风平浪静的日子里,有任何风都比停滞不前的大气条件要好。

在雨天和无雨天,PM 2.5 中值水平的变化较小。冬季的雨天较少,因此数据有些嘈杂,但在累积密度函数中可以观察到差异。

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

Effect of rain PM 2.5 level in winter

交通指数

PM 2.5 颗粒物的来源之一是汽车发动机尾气。虽然争取更多公共交通的使用总体上有利于环境,但减少 PM 2.5 污染的有效性尚不清楚。原因如下。

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

traffic index and air pollution

我们已经看到 PM 2.5 水平与一天中的时间有关。下午 3 点左右污染程度较低,但在夜间仍然很高。当相对于交通数据绘图时,与污染水平的关系非常嘈杂。似乎没有很强的相关性。

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

PM2.5 relationship with traffic index

将一天中的时间和工作日与周末的信息包含到模型中可能会使关系更加清晰。

自回归过程

当前的 PM 2.5 值也可以依赖于之前的值。下面的部分自相关图显示了 1 小时时滞的强相关性,这意味着 PM 2.5 水平是一个自回归过程。因此,我在模型中包括了 24 小时的平均值,并限制模型只允许查看以前的值来进行未来预测。这个特征的重要性应该与粒子在大气中停留的时间直接相关。

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

机器学习模型

下图显示了根据 Spearman 相关性计算的所有输入特征的 dedrogram。树状图有助于识别可以从模型中移除的冗余特征。各种距离内的火灾数量和 PM 2.5 的水平密切相关。其他功能就更远了。我最终在模型中使用了所有这些特性。

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

dendrogram of inputfeatures

为了确定污染的主要原因,我使用了随机森林回归来拟合模型,因为它简单且易于解释。在超参数调整期间,25%的数据分配给验证集。使用整个数据集再次重新训练该模型。该模型在训练集上达到 0.99 的 R 平方。由于这项研究的目的是了解过去空气污染的来源,所以我将重点放在训练集上。下图对每个影响因素的重要性进行了排序。重要性是根据置换列时 R 平方值的减少以及重新归一化所有列的总和来计算的。

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

feature of importance

不出所料,之前的污染水平是最重要的预测指标。其次是从最近到最远的火灾次数。远在 720 公里以外的火灾数量对空气质量的影响比当地的湿度、交通甚至降雨更大。一天中的时间是比交通指数更重要的预测因素。在天气特征中,湿度是最重要的特征。

下面使用 2019 年 1 月 13 日上午 8 点 96 分 2.5 级的数据的树解释器来说明每个特征的影响。

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

model interpretation on Jan 23, 2019

我们从平均值 26 开始。前一个小时的 PM 2.5 水平是 62,因此该模型增加了一个值 20。在 240 公里的半径范围内有 150 起火灾,因此该模型将污染水平增加了 10 级。现在的值是 56。240-480 km 之间有 1649 处起火,480-720 km 之间有 896 处起火,模型分别加值 9 和 8。低风速和早高峰时间(早上 8 点)给模型增加了 8。在预测 PM 2.5 水平的 96 个因素中,这六个因素占了 81 个。右侧的其余要素不太重要,因此增加的预测污染值较少。

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

model interpretation on Feb 2, 2019

在一个美好的日子,如 2019 年 2 月 2 日晚上 7 点,PM 2.5 水平为 10。前一小时的污染水平较低,因此模型减去了 10 的值。该地区仍然有许多火灾,该模型增加了值 2。风速很高,使数值降低了 2。天气和交通都很好。许多因素的综合导致 PM 2.5 的预测水平较低,为 10。

结论

PM 2.5 水平与各种因素有着复杂的关系:火灾数量、天气模式和交通。但这个分析证实了很多人的怀疑——农业焚烧是泰国 PM 2.5 污染的根本原因。燃烧活动远至 720 公里以外的曼谷,一个延伸到缅甸,老挝和柬埔寨的地区,会导致曼谷的空气问题。解决这个问题并不容易。这需要东南亚国家的国际合作。

我留给你一张 2019 年 3 月 17 日的火灾地图,这是有史以来最糟糕的一天!

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值