TowardsDataScience 博客中文翻译 2020(八十一)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

数据科学家的典型一天

原文:https://towardsdatascience.com/a-typical-day-as-a-data-scientist-7509f8e51b5b?source=collection_archive---------12-----------------------

来自德克萨斯州的数据科学家的一天。

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

Unsplash【1】上拍照。

目录

  1. 介绍
  2. 站立
  3. 吉拉—冲刺
  4. 代码审查
  5. 模型过程
  6. 摘要
  7. 参考

介绍

数据科学家的一天可能会有所不同,但日常工作有一个遵循一定顺序的总体流程。你可以期待有一个站立,用吉拉(或类似的任务管理平台)组织你的任务,和一个代码审查。还有其他更大的项目里程碑,但这包括更大的时间范围,在本文中,我们将重点关注典型数据科学家的日常工作。

我曾在几家较大的科技公司和一家初创公司工作过,包括 Indeed、home away(Vrbo-Expedia)和 ScaleFactor。虽然我不会具体说明哪家公司有哪种流程,但我会从我过去的职位中总结我的经验。

站立

大多数科技公司都有一个惯例,那就是“起立”。通常在早上进行,团队会聚在一起,大多数情况下,顾名思义,站起来讨论三个主要问题。站立的目的是确保同一个团队的每个人都在同一页上。这是突出单个成员的工作,同时强调流程的哪些部分被暂停,以便尽快就决议采取行动的有效方式。以下是站立时提出的主要问题。

  • 你最近在做什么?

—作为一名数据科学家,我通常会提到我目前正在从事的项目,以及我前一天做了什么。一个例子是:“昨天,我在调整集合机器学习模型的参数”。

  • 你今天在做什么?

—您将在与关键流程的会议以及与利益相关者、数据工程师、软件工程师、产品经理或主题专家的其他会议之后,讨论您正在从事的工作。此步骤的一个例子是:“我将输出结果,并概述预测变化之间的差异以及我调整的所有参数各自的准确性”。

  • 有没有屏蔽器?

—首先,这一步可能看起来令人尴尬或不舒服,因为你在强调你不知道的东西,或者在其他情况下,因为你当前控制之外的外部过程而不起作用的东西。但是,当你与你的团队会面时,你会变得更容易敞开心扉,这最终会成为你一天中的一个关键部分,为高效和有效的变革创造一个环境。拦截器的一个例子是:“对于我正在调整的一个参数,我的 Jupyter 笔记本一直坏,我想不出测试这个重要参数的方法”。也许,有人会在几秒钟内知道这个问题的答案,你就不必浪费一整个星期的时间试图自己找出答案。

吉拉—冲刺

有几个像吉拉一样组织任务的平台,所以如果你在未来的公司不使用它,你可能会遇到类似的事情。它的工作方式是显示你的 sprint(通常一两周长),并根据任务在你的数据科学过程中所处的位置对其进行分组。

首先,您将创建票证。票据本质上是一个项目,它概括了一个问题、一个数据拉取、一个请求,并且有一个带有注释的描述。基于完成任务的难度或预计时间,您可以应用故事点,以便利益相关者或其他数据科学家知道您预计需要多少天来完成任务。门票也可以细分。任务单或故事单就是一个例子。一个故事是一个项目的更大的总结,比如“流失预测模型”。它将链接与该故事相关的任务单,以便您可以将项目组织成更小的块,其他工程师、科学家和经理可以被分配到这些任务单。任务单的一个例子是:“代码/。随机森林参数网格的 py 文件”。

还有其他类似的票证类型,但命名约定不同,称为问题类型:

 **sub-task** - a smaller drill down of a task **bug** - an error in the code **epic** - the overarching theme of a data science team ("Churn") **improvement** - addition to an existing product (usually - engineers) **new feature** - a new part of a product (usually - engineers) **story** - logs the associated task tickets **task** - a main task assigned to a team member

在描述 sprint 的特性之前,你可以把你的票放在一个“backlog”里。这个区域存放下一个票据,或者在 sprint 中没有当前票据重要的票据。

吉拉及其 sprint 的一个例子如下:

  • 规划/可用

—您将进行本次冲刺的入场券

  • 在发展中

—您当前正在处理的票证

  • 测试

—您为其编写代码并正在测试的票证

  • 回顾

—票证已完成测试,但正在审核中,通常带有 GitHub 拉取请求

  • 完成的

—一旦你最终完成了任务

一个完整而典型的大纲将包括这些步骤或类似的内容:

1\. Planning/Available2\. In Progress3\. Testing4\. Review5\. Done

虽然吉拉和 sprints 可能看起来势不可挡,但关键是这些工具和过程能让你的项目和团队更有效率。因此,这些带有许多定义的票证可以按照您想要的任何方式使用。这取决于您和您的团队使用这些标签和功能来改善您的数据科学流程。你可以在这里找到更多关于吉拉和短跑的信息。

代码审查

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

李·坎贝尔Unsplash【3】上拍摄的照片。

代码审查对于拥有一个成功的数据科学团队非常重要。一些公司或团队将只整合一个 GitHub pull 请求,而其他公司或团队仍将面对面(或电话会议),并共享他们的屏幕和代码。此外,一些团队可能每隔一天而不是每天执行一次代码审查。

代码审查有助于确保您的团队了解您的代码变更。在你花了大部分时间编写和组织代码之后,现在是时候与你的队友分享了。这是有益的,就好像你被困在一些代码片段上,其他数据科学家可以帮助你,你也可以帮助他们。

总而言之,代码审查有以下好处:

  • 团队意见一致
  • 代码正确
  • 代码高效
  • 合作创新
  • 向他人解释代码有助于你更好地了解你的代码

模型过程

虽然建模过程需要几天、几周甚至几个月的时间来完成,但是这个过程的每个部分都有一个日常的方面。我将为一个数据科学家描述模型过程的主要步骤;提出问题,举例回答。数据科学家的典型建模过程如下所示:

业务问题陈述 —出现了什么问题,数据科学如何解决?有没有一些我们可以自动化的手动流程?

例子:客户在不断变化。

需求收集 —这个项目什么时候到期?谁会参与其中?涉众想要什么样的可交付成果?结果需要每天、每周或每月更新吗?

例如:我们希望客户流失的 CSV 输出,以及他们每周流失的概率。

数据位置 —数据在哪里?我们需要访问 API 来获取更多数据吗?这已经在本地数据库中了吗?

例:大量客户的数据在我们的本地 SQL 数据库中。

探索性数据分析 —分布是什么样的?是否存在缺失值?我们有足够的数据吗?我们需要更多的观察吗?

示例:当缺少值时,我们可以估算该字段的平均值。

特征工程 —哪些特征是重要的?哪些是多余的?我们需要查看相关性/多重共线性吗?

示例:使用 L1 特征选择移除冗余的、不重要的特征。

基础模型 —我们需要一个用 Python 制作的通用算法,还是需要一个实际的分类模型?最小可行产品是什么?

示例:导入没有参数调整的随机森林模型。

最终模型——我们需要多个模型吗?有些人比其他人做得更好?我们将使用哪些成功指标,为什么?

示例—我们可以对这些观察使用随机森林,对其他观察使用 xgboost,精确度是关键指标。

模型迭代 —我们需要调整参数吗?之前的结果看起来怎么样?我们能让模型火车更快更省钱吗?

示例—我们使用了一个参数网格,发现我们可以获得很高的准确度,同时将训练时间减少 20%。

结果输出 —输出是什么样子的?它应该只是一个 CSV 还是插入到 SQL 数据库中的数据?

示例—我们发现,我们可以在这个 SQL 数据库中用预测的客户流失标签和概率来更新我们的客户。

结果解释 —您将如何向利益相关者以及其他数据科学家解释您的模型及其结果?你会使用什么可视化工具或平台?

示例—我们可以使用 Tableau 在一个漂亮的彩色编码图表中显示我们的预测和概率得分。利益相关者可以访问这个仪表板。

摘要

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

Arnaud Mesureur 在Unsplash【4】上拍摄的照片。

有大量的数据科学家和公司。其中许多地方会有所不同,但它们的一些流程会有所重叠。我已经讨论了公司如何形成数据科学过程的类似方法。你可以期望有一个站立会议,使用吉拉或类似的平台来组织你的 sprint,并在代码评审中分享你的代码变更。数据科学家的日常工作可能会有所不同,但我们已经介绍了一天中最常见的步骤以及典型数据科学家的建模流程。

总体而言,数据科学可以涵盖工程和产品等业务的多个方面。数据科学家的职位可以有很多变化,但我希望我能阐明数据科学家每天将参与的主要流程和任务。

如果你想知道数据科学家通常会在哪里出错,以便你可以在未来避免同样的错误,请查看我的另一篇文章[5]。

[## 我作为数据科学家犯下的 10 个错误

可能出错的地方以及如何解决的例子

towardsdatascience.com](/10-mistakes-ive-made-as-a-data-scientist-f6118184e69)

我希望你觉得这篇文章有趣并且有用。感谢您的阅读!

参考

[1]照片由Unsplash(2018)上拍摄

[2]阿特兰西斯,吉拉软件,(2020)

[3]李·坎贝尔在 Unsplash 上拍摄的照片,(2016)

[4]Arnaud Mesureur 在 Unsplash 上拍摄的照片,(2016)

[5] M.Przybyla,我作为数据科学家犯下的 10 个错误,(2020)

MITRE 的新冠肺炎决策支持仪表板的用户界面设计审计

原文:https://towardsdatascience.com/a-ui-design-audit-of-mitres-covid-19-decision-support-dashboard-bf0c5cf6d697?source=collection_archive---------73-----------------------

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

我在米特新冠肺炎医疗保健联盟决策支持仪表板上执行了快速用户界面/UX 和数据可视化审计。请在这里观看,并查看我推荐的团队应该做出的设计更改。

随行视频: 【https://www.youtube.com/watch?v=TLtZmMrFDs0】

最近,我一直在做一些建议,以协助几个冠状病毒相关的黑客马拉松和新冠肺炎相关的数据科学和分析倡议。令人难以置信的是,看到这么多的人和私营公司走到一起,分享信息、知识、数据和见解,以解决这个疫情的各个方面。

我最近参与的一个团体是由 MITRE 领导的 Covid 19 医疗保健联盟,该联盟有一个团队正在从事一个名为“决策支持仪表板”的项目。该仪表板旨在帮助美国各州州长和地区政策制定者就“重新开放”做出基于数据的明智决策。在这个截屏视频中,我正在进行我的 UI 审计&补救计划服务的缩小版,以帮助团队从一个全新的角度看待他们的设计,以及他们可能想要改变什么,以使这个工具对目标受众来说更容易、更有用。我希望通过分享这些,他们也能对自己的工作多一些关注。

请注意,他们正在快速迭代,因此视频很可能与当前版本过时。特别赞扬 MITRE 团队迅速公开地协助决策者抗击冠状病毒!

仪表板 UI 审核—补救计划:

下面的设计变更列表代表了我向 MITRE 的仪表板团队提出的关于变更内容的建议。我做的这些大部分几乎没有关于目标用户或用例的信息,而这在我的正式审计中是关键的第一步。判断一个设计是主观的,除非我们事先定义了一些“好的设计”的标准因此,我对这里的目标客户做了许多假设,目标客户是州级决策者(例如,美国州长或向州长提出建议的下属)。以下是我在视频中讨论的一些变化的总结:

  • 地图:持续的缩放和缺少州级焦点让我感到沮丧(神奇鼠标:滑动手指缩放地图,而不是滚动页面=考虑取消鼠标驱动的缩放功能,因为它对设计来说并不重要)
  • 地图:不点击地图就无法调出数据感觉怪怪的(如果我搜索我的州,我认为州长会关心这个州,为什么它不把我的州数据载入整个页面?)
  • **过度关注比较:**如果真正重要的比较是“我的地区与科学和医学上可接受的地区相比”,为什么如此关注地区之间的比较我不理解这个工具如此注重“与其他地区的比较”如果领导者真的专注于管理自己的区域。
  • 地图:太大了— 对当地决策者来说,占用了太多的房地产。考虑将其缩小,以便更好地呈现下面的有用数据。
  • 默认显示(不要折叠)KPI 部分(如再现率)
  • 数据应该“表明立场” - >现在,还不是。看:如果像 1.1 这样的数字真的很糟糕,那么 UI 应该表明立场。别这么含蓄。视觉上帮我认识到“1.1 不好。”图标:不确定他们是否正在尽全力支持这项工作;他们感到胆怯和低调,但可能是视觉传达量化信息的强大盟友。
  • 欢迎信息可以放在别处/更安静。
  • 图表:感觉它们可以不那么高 (Y 轴=太高)
  • 复制率没有 x 轴 —为什么没有?我觉得我想看这个。
  • “我下一步做什么” —没有一个 KPI 建议我下一步可能采取什么行动,如果必要的话,接下来逻辑上应该检查什么更深入的数据,等等。
  • **这个设计需要大量的用户交互来获取价值:**我们能不能让我只需付出最少的努力就能获取我所在地区的信息?
  • **考虑让位置搜索非常直观/响亮,**立即设置背景。除了总统没有人[我们希望?]会在意国民的看法;这是一个虚荣心的衡量标准,但对地区决策没有多大用处。
  • 搜索:奇拼(bug?):Massacusets,MA,USA =这出现在 type-head 搜索中(需要归一化数据?).此外,通过搜索,我可以深入到地图上没有可用数据的粒度级别。因此,如果我无法从这个仪表板中获得“邮政编码”级别的数据,我会建议将地图/搜索重定向到一个适当的高度,比如“县”这可以通过用户界面和交互设计选项微妙地传达出来,例如“米德尔塞克斯郡(包括 02140 邮政编码)”
  • **定义:**不确定是否需要默认拼出;也许他们可以进入工具提示。我会在图表上方更“水平”地显示它们,而不是在一列中。
  • **“空状态”图表区不清楚/模糊:**有时 UI 中的“空”(空白)会令人困惑,我们需要有一个明确的“空状态”我认为那会有帮助。因此,举例来说,不要仅仅在“再现率”定义旁边显示白色/空/空,而是提供一个灰色/浅色的填充区域,其中包含 CTA(行动号召),例如位置搜索输入框。"输入县名以查看结果:[输入]. "这引起了交互,同时微妙地显示了 UI 区域的状态是“空的”
  • **显示“14 日趋势”标签:**我必须“调查”图形中有多少根棒线,这意味着什么,因为没有明确的标签/X 轴。
  • 对每个 KPI 使用明确的语言: 当前:“案例增长率:0 天持续下降”可能会显示得更好?如下面:
    “案件增速依旧【持平】【递增】。下一个里程碑:实现 7+天稳定下跌。”
  • …然后展示证据(图表)

觉得这有帮助吗?加入下面我的洞察邮件列表,了解设计以人为中心的数据产品的未来更新。

你也可以在这里查看 MITRE 最新版本的仪表盘。

在此了解我的 UI 审计和补救计划咨询服务。

关于我

我叫 Brian T. O’Neill,是一名设计师、顾问和 Designing for Analytics 的创始人,Designing for Analytics 是一家独立的咨询公司,帮助公司将分析和 ML 转变为不可或缺的数据产品和决策支持应用程序。我还主持了播客“体验数据”,并为数据科学、产品和分析领导者发布了一份见解邮件列表,介绍他们如何使用以人为中心的设计来创建更有用、可用和吸引人的数据产品。此处免费订阅。

— —

编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里

短文本聚类的独特方法(算法理论)

原文:https://towardsdatascience.com/a-unique-approach-to-short-text-clustering-part-1-algorithmic-theory-4d4fad0882e1?source=collection_archive---------13-----------------------

短文本聚类中的高维数挑战和使用 GSDMM 对抗稀疏性。

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

高纤维(呃)?!当然了。

问题是

最近我一直在读安·兰德的《阿特拉斯耸耸肩》(我知道……回到高中英语文学时代,那时我本来应该读它,但没有读)。安·兰德有很多东西,但简短肯定不是其中之一。在不少于 1000 页的篇幅里,兰德精心构思了这部杰作中的场景和人物。好像我必须知道窗外树叶下面的颜色,因为里尔登喜欢啜饮轻微掺水的威士忌。我花了太多时间阅读文章片段、新闻摘要和听优雅概括的播客,以至于我忘记了如何真正融入作者的大脑。在过去的 1000 页中,我对安·兰德的写作风格了如指掌,我甚至可以复制它。这让我想到我的大脑如何为这位作者构建了一个非常优秀的自然语言处理器,因为我向它提供了大量的数据。但是我看文章,文字,推文等等。尽管理解不同,但考虑到随着时间的推移对材料的吸收,我仍然能够得出一些结论。我对短文材料的理解与安·兰德长篇大论的独白有何不同?我的大脑处理许多小片段和一篇长文章的方式有什么不同吗?

鉴于许多机器学习模型是建立在我们大脑如何处理信息的假设基础上的,我认为在我们处理新问题时考虑这些问题是有用的。短文本聚类传统上是一个难题,原因如下:

  1. TF-IDF 意义不大,因为与文章相比,句子中的字数较少。如果一个句子中所有的词频都是 1(因为这个句子很短,没有重复的词),那么我获得了什么价值?
  2. 对高维数据使用向量空间会导致稀疏。这导致高计算和内存存储。
  3. 问题 1 和 2 的结果是,确定用于分离文本的聚类的数量越来越具有挑战性,因此我们失去了将数据解释成主题的能力。

什么是 GSDMM?

GSD mm(Gibbs Sampling Dirichlet Multinomial Mixture)是几年前由尹建华和王建勇在一篇论文中提出的短文本聚类模型。该模型声称解决了短文本聚类的稀疏性问题,同时还显示了像 LDA 这样的词主题。GSDMM 本质上是一种改进的 LDA(潜在狄利克雷分配),它假设一个文档(例如 tweet 或 text)包含一个主题。这与 LDA 不同,LDA 假设一个文档可以有多个主题。正如我在前面的 TF-IDF 陷阱中提到的,由于稀疏性,在一个文档中权衡多个主题对于短文本文档来说不是一个好方法。

使用称为“电影组方法”的类比来描述 GSDMM 的基本原理。想象一下,一群学生(文档),他们都有一个喜欢的电影(词)的列表。学生们被随机分配到 K 桌。在一位教授的指导下,学生们必须在脑海中为两个目标洗牌:1)找一张有更多学生的桌子 2)选择一张你对电影感兴趣的桌子。冲洗并重复,直到达到集群数量不变的稳定水平。

在这里可以找到对 LDA 和 GSDMM 之间差异的直观描述,而在这里可以找到对 LDA 更深入的分析。在这篇文章中,我将重点讨论尹和王论文中描述的 GSDMM 模型的参数和推导。

狄利克雷多项式混合物

对于该模型的第一部分,理解什么是狄利克雷分布是很重要的。狄利克雷分布本质上是多维度(文档)上的贝塔分布。贝塔分布是简单的概率分布,其表示文档加入聚类的先验状态可能性以及该文档与该聚类的相似性。两个参数(下面描述的α和β)控制β分布的形状。

数字万用表的组件

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

转自尹和王的论文

让我们来看看构成该模型的关键参数:

如上所述,α是一个影响我们概率分布形状的参数。更重要的是,alpha 是从文档被分组到一个簇中的概率中得出的。在电影例子中,这是学生选择桌子的概率。

**贝塔:**贝塔是我们分布的另一个形状参数。Beta 来自一个文档中的单词与另一个文档中的单词的相似性。与电影组相关,beta 是学生加入有相似电影选择的桌子的概率。例如,如果 beta 为 0,学生将只连接有共同电影的表。这可能不是最佳策略。也许两个同学都喜欢惊悚电影,但是他们没有列出相同的电影。我们仍然希望学生们最终加入同一批惊悚片爱好者。

phi :使用 k 个聚类(混合),phi 是聚类在单词上的多项式分布,使得 p(w|z = k) = phi,其中 w =单词,z =聚类标签

theta: 同样,theta 是考虑了 alpha 的多项式分布,所以 p(d|z=k) = theta 其中 d = document。

这些参数的最终结果是文档(d)是由假设 Dirichlet 先验的聚类(k)生成的概率。

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

转自尹和王的论文

此外,重要的是要指出,论文假设对称狄利克雷先验。这意味着相同的阿尔法和贝塔在开始时被假定。Alpha 表示相同的群集同等重要,而 beta 表示相同的单词同等重要。Yin 和 Wang 指出,在该算法的未来迭代中,betas 不应该具有对称的先验,而是更流行的词应该具有较低的重要性。如果一个单词出现在每个文档中,它就不是一个非常有价值的信号(再次参见 TF-IDF 的缺陷)。

吉布斯采样

Gibbs 抽样描述了基于条件分布遍历和重新分配聚类的方法。与朴素贝叶斯分类器的工作方式相同,基于最高条件概率将文档分配到聚类中。

其他短文本算法

我关注 GSDMM 是因为我通过一个个人项目对它了解最多(见下一篇文章)。短文本聚类还有其他方法,但我注意到 DMM 是其中许多方法的基本原则(GPU-DMM 和 GPU-PDMM 添加单词嵌入),因此我相信理解这些参数和基本构建块将有助于开发更复杂的模型。

参考

原论文由尹和王此处

这篇文章很好地总结了 GSDMM 与 LDA 和应用的关系。

我没有深入研究吉布斯采样。LDA 和 Gibbs 的另一篇好文章是

收集数据的有用工具:网络搜集

原文:https://towardsdatascience.com/a-useful-tool-to-collect-data-web-scraping-197655961a49?source=collection_archive---------15-----------------------

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

安德烈·季霍诺夫斯基在 Unsplash 上拍摄的照片

使用这一工具的好处和道德

第一节:简介

计算机的发展产生了许多有用的技术,可以创建大规模的数据库。一种技术是 web 抓取,这是统计学家、数据科学家、计算机科学家和 web 开发人员最常用的一种技术,用于积累大量数据,这些数据用统计方法进行处理,以便进行分析。顾名思义,web scraping 是一种从万维网中提取特定数字、文本和表格等信息的方法,使用的软件可以方便地存储和管理已下载的所有信息。

不管我们使用什么样的浏览器,每个网页都使用计算机语言,比如 XML/HTML、AJAX 和 JSON 来呈现网页中的信息。当一个人在互联网上进入一个网页时,无论是社交媒体、维基百科还是像谷歌或必应这样的搜索引擎,使用浏览器都意味着使用 HTML (Munzert et al .,2014)。网页在任何浏览器上呈现的信息与 HTML 中呈现的信息不同;换句话说,HTML 是网页的代码,浏览器能够确保用户友好的体验。特别是,本文将尝试解释 HTML 成功实现 web 抓取工具所具有的一些特性,以及它们与 Python 的关系。

本文的主要目的是展示 web 抓取背后的有用性,以及统计学家如何利用这种方法。在第 4 节的结尾,Python 代码提供了一个解释,以深入了解这种技术的范围。

这篇文章将由以下不同部分组成。首先,第 2 部分将解释为什么网络搜集对统计人员有用。第 3 节将解释为什么在某些情况下,网络抓取很难使用,以及进行网络抓取的法律后果。在第 4 节中,将提供 Python 代码来解释使用金融 web 页面的 web 报废的简单实现。最后,在最后一节给出了结论。

第二节:网页抓取的重要性

统计学家经常发现获取数据很困难。收集数据的方式通常是通过观察、抽样调查、访谈或焦点小组。在许多情况下,从上述方法中收集信息需要时间和金钱。如今,互联网已经成为许多专业人士和科学家的重要信息来源。从这个意义上说,要解决很多学术角度或者行业内的问题,从互联网上提取信息是容易、快捷、廉价的。例如,政府通过各自的统计局免费提供公共商业周期数据;世界各地的中央银行提供经济和金融数据;国际能源署(IEA)提供石油和天然气等信息。

作为从网络浏览器复制和粘贴信息到电子表格的替代方法,计算机程序可以比人类更快更精确地完成这项工作(Broucke 和 Baesens,2018 年)。此外,如果一个人需要从许多网页下载数据,该算法会自动将收集到的所有信息整理到一个数据库中,以便随时进行分析。

或者,API 是由网页的创建者提供的一组功能,以便程序员能够使用这些功能从特定网页中提取信息。此外,API 允许运行它的程序正确地与网页通信。正如 Broucke 和 Baesens (2018 年)所建议的,“例如,Twitter、脸书、LinkedIn 和谷歌都提供这样的 API,以便搜索和发布推文,获得你的朋友和他们喜欢的人的列表,查看你与谁联系,等等”。

不幸的是,该网站可能会提供一个昂贵或用途有限的 API,等等;因此,使用网页抓取可能是实用的。事实是,只要数据在 web 浏览器中是可见的,scraper 就可以使用程序来访问和提取一些信息。如果是这样,这些信息可以以任何方式被清理、存储和使用(Broucke 和 Baesens,2018)。

正如前面提到的,HTML 有一些特性可以用来用 Python 实现 web 抓取机器人。此外,程序员可以在 Python 中安装 web 抓取工具,比如 Selenium。这个抓取工具的主要功能是使浏览器自动化,以便可以加载网站,恢复其内容,并像用户一样使用浏览器执行操作。Selenium 可以通过使用不同的编程语言来操作,包括 Python、PHP、C #和 Java (Broucke 和 Baesens,2018)。出于本文的目的,将使用 Python。

假设一名统计学家已经成功地下载并安装了 Python 中的 Selenium,并创建了一个简单的代码来从 web 中提取一些信息。那个人运行代码,发现它不起作用;没有 web 浏览器,Selenium 本身无法工作。特别是,它将需要使用一个网络驱动程序。该工具适用于大多数浏览器,如 Chrome、Firefox、Safari 和 Explorer (Broucke 和 Baesens,2018)。web 驱动程序可以从互联网上下载,并且必须与将要用于执行抓取的浏览器具有相同的版本。通过下载正确的 WebDriver,然后运行前面介绍的代码,Python 通过 Selenium,它会“说”和浏览器一样的语言。这将使得能够从网页中正确地提取信息。

迄今为止,我们知道我们需要一个特定的程序来做网络搜集,Python 我们还需要在 Python 中安装 Selenium,以及一个能够与 Python 成功通信的 WebDriver。

有很多方法可以从网页上抓取信息。Selenium 可以在 HTML 代码中通过 ID、名称、XPath、链接文本、部分链接文本、标记名、类名和 CSS 选择器从特定网页中提取特定信息(Broucke 和 Baesens,2018)。上面提到的一个有用的框架是 XML Path 或 XPath。XPath 是一种分层寻址机制,类似于计算机用来在许多文件夹中定位文件的机制(Munzert 等人,2014 年)。换句话说,XPath 是指向信息在网页的 HTML 代码上的确切位置的路径。值得一提的是,Munzert 等人(2014)指出,XPath“只是从 HTML、XML 等标记文档中选择信息的一个非常有用的工具”。

第三节:使用网页抓取时的常见问题

本节将展示在进行网络抓取时可能出现的真实例子和复杂情况;刮网时问题是不可避免的,也是常见的。对于网络抓取来说,能够检测、抛出和管理这些错误是至关重要的(Mitchell,2013)。正如 Mitchell(同上)所言,“网络是杂乱的,你永远无法确定是否有某个元素,或者某个页面是否返回了你想要的数据,或者某个网站的服务器是否已经启动并在运行”。许多数据分析师在进行网络搜集时会遇到意想不到的问题。有趣的是,我曾经在一家投资银行工作,其中许多分析数据来自互联网,我们通过对金融网页进行网络抓取来提取这些数据。我们开发了这些工具来提取股票、债券和指数的金融时间序列,而不是将彭博或路透社作为主要的信息来源。

团队遇到的最常见的问题是网页模板的突然更新。换句话说,为提取特定网页的信息而开发的网络抓取工具将不能与网页的新结构一起工作。一个需要花费大量时间开发的代码可能在几秒钟内就变得无关紧要了。解决这个问题的一个方法是确保代码的结构足够灵活,以便能够更快地适应新的网页。

当试图下载信息时,一些网站可能不同意网页抓取器。例如,如果在同一个网站发送数百个 HTTP 请求,尽管许多网页相对健壮,但一些网页可能会停止工作,无法参加常规的用户流(Broucke 和 Baesens,2018)。网页之所以有效,是因为公司拥有可以处理大量用户的服务器。如果许多用户同时进入一个网页,这个网页很可能会崩溃。

同样的问题也发生在 Bidder’s Edge 上,这是一家致力于从拍卖网站收集数据并提供给网站的公司。用户可以在他们的网站上搜索列表,而不是在每个拍卖地点张贴许多申请。该公司被易贝起诉,并针对其网站上使用的机器人进行了有效辩护(H. Liu and Davis,2015)。

此外,一个新的问题出现了:网络抓取的合法性。在分析了一些涉及网络抓取的真实案例后,Munzert 等人(2014)确认“从这些令人不安的故事中吸取的教训是,不清楚哪些行为可以归入‘网络抓取’标签下,哪些行为实际上是非法的”。H. Liu 和 Davis (2015)指出“法律是模糊的。在很大程度上,公司已经成功地阻止了不必要的刮削——至少是部分地。但称这是一个既定法律领域还为时过早”。此外,Mitchell,R. (2013)也持类似观点,认为“网络抓取的法律先例很少”。

为了避免法律上的问题,遵循网站上的使用条款和版权文件(同上)是被普遍接受的。Broucke 和 Baesens (2018 年)还讨论了网络抓取的合法性,写道“显而易见的是,围绕网络抓取的法律格局仍在演变,许多被引用为违反的法律在我们的数字时代尚未成熟”。最后 13 洗。J.L .技术公司。& Arts 275 (2018)指出“技术往往领先于法律和政策。网络爬虫目前几乎完全受社会规范和礼貌的支配,国会、行政部门和法院都没有颁布法律”。很明显,使用网页抓取工具时存在灰色地带;大公司并没有打赢所有的官司。

为了避免网页出现问题,最近提出了一个想法,那就是 robots.txt 文件。这一概念是为了表明机器人可以或不可以访问存储在网站根目录中的文本文件中的数据(Munzert 等人,2014 年)。换句话说,这个文本文件“告诉”网页抓取工具哪些信息可以从网页下载,哪些不可以。然而,并没有表明 robots.txt 文件本身具有法律约束力,尽管服务条款通常具有法律约束力(Mitchell,r .,2013)。

最后,美国列出的最常见的法律问题有:违反条款;版权或商标侵权;《计算机欺诈和滥用法》(Fraud 侵犯动产;机器人排除协议;以及《数字千年版权法案》(DMCA)、《CAN-SPAM 法案》(Broucke and Baesens,2018)。

第四部分:网页抓取的示例

本节将帮助理解如何从金融网页实现 Python web 抓取代码。这个想法是给出一个概要,指定代码中最重要的部分;完整的代码可以在我的 GitHub 库中找到。如果你愿意,请随时检查和使用它。该机器人从不同的交易所交易基金(etf)中提取特定特征,并将其排列到数据库中(etf.com,2020)。ETF 是一组证券,如股票、商品、债券或投资类型的混合,其目的是复制或跟踪基础指数。每只 ETF 都有一个价格,投资者可以轻松地买卖它们(Investopedia,2020)。

首先,我们需要导入将在整个代码中使用的库。如前所述,我们将使用 Selenium、Chrome 作为浏览器,以及 Chrome WebDriver(因为 WebDriver 版本需要与浏览器版本相同)。从代码行 1 到 5,显示了将要使用什么库以及使用了特定库的什么功能。

为了更好地理解,库 openpyxl 帮助读写 Excel 文档,numpy 提供有用的数学函数,pandas 是一个帮助操作数据结构的包(PyPI,2020)。从这个意义上说,第 7 行将创建一个工作簿,存储从 web 下载的所有数据。

第 16、20、21 和 105 行是需要修改的特定目录,以便代码可以在另一台计算机上运行。具体来说,第 21 行包含工作簿,其中包含将要被剔除的 ETF 的输入。此外,第 20 行显示了 WebDriver 的位置,它将用于进行 web 抓取。

第 29 行显示了包含路径和如何显示浏览器的首选项的变量。第 34 行描述了将要从网页中提取的特性。因此,第 43 行显示了如何使用第 29 行创建的变量打开浏览器的命令。

XPath 语法出现在第 45、50、52、58、72、77、82 和 95 行。通过观察代码,在 XPath 代码之间,我们可以找到 try:和 except:参数。当代码在 HTML 代码中找不到 XPath 时,这很有帮助。否则,我们会在执行代码时看到一个错误。

一方面,第 38 行中的 for 循环将迭代从第 21 行的工作簿中提取的每个 ETF。另一方面,第 67 行和第 92 行将有助于迭代一些特定 ETF 的一些特征。最后,第 103 行累积了下载的所有信息;第 104 行将该信息保存在特定目录下的. csv 文件中,第 107 行关闭 WebDriver。下面的视频展示了这段代码的作用。

第五部分:结论

网络抓取是从网页中提取数据的强大工具。根据研究人员试图进行的分析类型,网络搜集可能会取代既费钱又难以实施的调查。如果对代码进行适当的编程,与人类相比,计算机可以提取和排列更多的信息。

尽管 web 抓取有许多方式,但本文解释了如何使用 Python 实现 web 抓取工具。此外,还展示了如何在 Python 代码上使用 Selenium,以及它与 HTML 的关系。最后,展示了使用 XPath 从 HTML 代码中提取特定信息的方法。

做网页抓取时出现困难;问题是不可避免的,但通常是可以解决的。这篇文章通过许多不同作者的研究证明,围绕这种技术工具的合法性并没有一条清晰的道路。关于这个问题的不确定性,建议先查看条款,建议有网站官方授权做网页抓取。如果没有正确的使用,网页抓取工具可能会被起诉。免费获取并不意味着必要的免费数据。

参考文献:

马蒂·阿尔钦。以及 j·伯顿·勃朗宁(2019)。 *Pro Python 3:专业开发的特性和工具。*压力。

Seppe vanden B .和 Bart B. (2018)。*面向数据科学的实用 Web 抓取:Python 的最佳实践和示例。*一种压力。

Munzert,s .,Rubba,c .,Meissner,p .和 Nyhuis (2014 年)。使用 R 的自动数据收集:Web 抓取和 Tex 实用指南。约翰·威利的儿子们。

米歇尔河(2013 年)。用 Java 进行即时网页抓取。打包。出版有限公司。

Gold,z .和 Latonero,M. (2018 年)。机器人受欢迎吗?网络爬行和抓取的道德和法律考量。华盛顿法律、技术杂志& Arts,13(3),第 277-281 页。

H.刘教授和戴维斯博士(2015 年)。网页抓取-免费样品的限制。滑坡,8(2(2015 年 11 月/12 月),第 1–5 页。

etf.com(2020 年)。 ETF.com:找到合适的 ETF——工具、评级、新闻。【在线】可在:http://www.etf.com获得。(etf.com,2020)

Investopedia。(2020). Investopedia 。【在线】可在:https://www.investopedia.com获得。(Investopedia,2020 年)

皮皮。(2020). PyPI 。【在线】可在:https://pypi.org找到。(PyPI,2020 年)

2020 年招募数据科学家的风险投资方法

原文:https://towardsdatascience.com/a-vc-approach-to-recruiting-data-scientists-in-2020-301c5e8c6f52?source=collection_archive---------64-----------------------

终极人工智能招聘指南,仅需 4 步

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

信用—安东·弗里茨勒

招募和留住新人才。

对于绝大多数希望着手人工智能相关新项目的公司来说,这是当今的主要挑战。

什么是人才?

企业人才是与你的文化和战略一致的有能力的关键人物(而不是资源)。

为什么是钥匙?

因为一个由人才组成的公司,还没有发现其成功的变量,不是注定要死亡,而是要转向。

相反,一个没有能力使其服务具体化的公司,可能会享受短期内维持其服务的可变因素,但长期来看会死亡。

自我逆转的市场

招聘市场遵循供求机制。

你提议。和人才需求。

至少他们做到了。

但一个重大事件彻底颠覆了市场:全球化。

全球化摧毁了所有的进入壁垒,改变了供求机制。

现在你问。和人才报价。

具体为什么?

  • 以前,人才不知道他们的选择。
  • 以前,公司只在一个本地化的市场上竞争。
  • 想想 Linkedin,它是这个星球上所有人才的窗口。他们知道提供什么,所有公司都可以联系他们。

就像所有的经济机制一样,这是一个零和游戏。

一个人才一次只能做一件事。

如果他不为你工作,他将自己工作或为另一家公司工作。

人工智能:紧俏的市场

与人工智能相关的学科,就像几年前的 web 开发一样,需要特定而复杂的技能,但对于绝大多数公司来说,正变得具有战略意义。

这使得 AI 中的一个天赋成为了一个不可多得的天赋。

因此,现有人才和需求之间机械地产生了差距,加大了公司的需求。

当需求超过供给时,价格就会上涨。宏观经济学 101。

你刚刚解释了为什么一些公司会为数据科学家支付几十万欧元。

那么如何吸引和留住 AI 人才呢?

不管人才如何,这里的逻辑都是一样的,但从教育学的角度来看,在一个紧张的市场中举一个具体的例子是很有趣的。

既然你主动提出要求。你必须推销自己。所以逻辑变得类似于产品的逻辑。

如果我们把问题分解到本质上,它会把我们带回四个基本问题:

  1. 一个人工智能专用的配置文件要寻找什么?→了解你的目标
  2. 竞争提供了什么?→基准测试
  3. 我能提供什么完美回答 1 并彻底摧毁 2 →创造竞争优势
  4. 如何获取个人资料以发现我的 3 →推销您的产品

1.人工智能专家档案寻找什么?

这个问题要求你了解不同的概况,他们的需求和决策标准。

第一步:列出你的需求和相应的资料

根据您的项目和策略,您将需要不同类型和粒度的概要文件。

  • 数据分析师、数据科学家还是数据工程师?
  • 初级还是有经验?
  • 经理还是运营?

第二步:了解应聘者的决策标准

从根本上来说,你需要了解一个人才为什么要加入一家公司。

了解他们的驱动力。

根据他的个性,他的项目和他的个人资料。

从为你的候选人增加价值的角度考虑。

你为你的服务做得很好。那就为你的候选人做吧。

初级数据科学家档案的标准记分卡示例如下:

  1. 学徒制——35%。
  2. 团队— 25%
  3. 工资— 20%。
  4. 自主性/灵活性— 15%。
  5. 收益——5%。

经验丰富的数据工程师的标准示例如下:

  1. 责任— 30%。
  2. 工资——25%。
  3. 团队— 20%
  4. 自主性— 20%
  5. 学徒期——5%。

第三步:列出尽可能多的候选人通用的标准,并按个人资料类型制作记分卡。

虽然每个申请人的标准各不相同,但所有与加入公司意愿相关的需求都有一个共同的基础。它们几乎是普遍的。

问问你现在的员工。

为了了解更多关于这些标准的信息,我建议你花一些时间在https://80000hours.org/上。

2.竞争提供了什么?

没有什么神奇的方法可以找出竞争对手提供了什么,但是看看 LinkedIn,和一些以前的候选人谈谈。

一定要和一群不同的人交谈,他们都很满足,有不同的观点,以确保你得到真实的意见。

列出他们提供的服务,并对照 1 中的列表进行检查。

我倾向于认为你并不是在和自由职业者竞争。根据定义,如果这是最适合人才的模式,你和它之间就没有真正的长远眼光。除非你的文化倡导同样的价值观:自主性、绩效结果和灵活性。

在这一点上,你甚至可以去乘坐 Fiveer,Upwork 或 Malt,寻找符合你的报价的配置文件。

3.创造竞争优势

在确定你的竞争优势之前,首先要问你自己的问题是什么首先定义了你。

你的内部文化是什么?你真正的价值观是什么?

诚实地回答这些问题将为您节省宝贵的时间,不仅因为您将知道哪些档案适合您的文化,还因为您的竞争优势将不言自明!

回答问题:你现在的员工真正加入你的原因是什么?我能提供什么来区分?

现在你知道了:

  • 你的目标和他们的决策标准
  • 你的价值观
  • 你的竞争对手和他们的报价

你要做的就是让自己与众不同。

你的目标群体重视学习,你的竞争对手没有真正的培训计划和一般的经理,打赌吧!

如果你的竞争对手擅长微观管理艺术,那就提倡自治和远程工作!

如果你的竞争对手提倡自主权,但薪酬相对较低,那就提高你的薪酬吧!

4.推销你的提议

职位描述

职位描述在公司里仍然是必不可少的。和简历一样。

没有互动很难判断一个人或者一个公司的好坏,但是锻炼是有用的。

工作描述应该吸引你的候选人,让他们愿意为你工作。它必须简洁,明确的使命,突出你的文化。

1.谈论你的义务和责任,而不是你的权利和要求。

我们在寻找一个有能力的人,我们的文化提倡 X,Y,Z,我们希望遇到重视 X,Y,Z 的人…

2.你很受欢迎。不要把好处放在最后而是放在开头!

从展示你的文化而不是公司历史开始,解释你的公司相对于你的竞争对手的优势。

3.不要用微弱的信号表达。

如果你想展示一种促进交流的轻松文化,在你的提议中明确这一点!

婴儿脚照片将被类似这样的句子取代:我们高度重视协作,我们通过 X,Y,z 大力投资于员工之间的关系。

4.把没有附加值的都去掉!

开门见山,不要增加不必要的价值。说你在寻找一个直爽、诚实、聪明、有团队精神、适应性强、有能力的人并不能增加价值。

再次坚持你与众不同的价值观。

例如:我们在寻找一个不怕拿起电话,不怕被拒绝,喜欢不断接受挑战,希望得到指导,能够让我们朝着既定方向发展的人!

5.不要夸大你的才能!

似乎显而易见。少说多做更好。

6.不要和市场结盟!

我向你保证,你要为你的才华付出高于市场的代价。这有几个原因:

  • 人才的质量就是你提供的质量。
  • 你可以把工资溢价转嫁到你的产品报价上。
  • 离职和招聘的成本是招聘溢价的 10 倍
  • 您将收到合格档案的请求和建议。
  • 你的员工会觉得他们的工作受到重视。
  • 你可以要求更高

我不断听到,“我们符合市场价格”。

但是真正符合市场价格的又是谁呢?

平均市场报价。

你为你的 iPhone 24 多付了两倍的钱,因为你看到了产品的附加值(或者因为你被他们的品牌所吸引,这也是他们自身的价值)。

为你的员工支付额外费用。

这是你能做的最好的投资。

这不是文化的替代品。

这一点很重要,值得在以后的文章中进一步阐述。

附加备注

  • 制作个人简介的证明,使任务更加明确。
  • 事先允许与您的团队会面
  • 为你的目标受众大量投资内容
  • 投资对员工进行再培训,例如希望成为架构师或数据科学家的数据库管理员或数据分析师。招聘不是唯一的解决办法。
  • 使用值得信赖的第三方服务,比如对你的文化了如指掌的独立招聘人员。

我叫 Eytan Messika,曾在风投行业工作,现在在 AI 咨询公司工作。我也帮助数据科学家找工作。随意连接上 Linkedin

模糊逻辑和模糊系统的简要介绍

原文:https://towardsdatascience.com/a-very-brief-introduction-to-fuzzy-logic-and-fuzzy-systems-d68d14b3a3b8?source=collection_archive---------4-----------------------

“随着复杂性的增加,精确的陈述失去了意义,有意义的陈述也失去了精确性”――卢特菲·扎德

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

介绍

许多任务对人类来说很简单,但对机器来说却是一个持续的挑战。这种系统的例子包括在杂乱的环境中行走、提升易碎的物体或停车。人类处理模糊和不精确数据的能力让我们很容易完成这些任务。因此,如果我们的目标是复制人类操作员的控制行为,我们必须能够模拟操作员的活动,而不是设备本身的活动。我们的模型必须能够处理模糊的信息。

基于模糊逻辑的系统恰恰做到了这一点;它们在特别复杂的系统中表现出色,已经成功用于从语音和手写识别到地铁列车速度控制的许多应用中。

本文着重于模糊集和系统的基本思想。

清晰的集合和逻辑

经典逻辑基于清晰集合,其中一组不同的对象被认为是一个集合。例如,白色和红色本身都是独立的物体,但是可以用符号{red,white}将它们视为一个集合。按照惯例,清晰集合被指定为大写字母,因此上述示例可以描述为:

F = {红白}

清晰子集可以从更广泛的集合中定义,其中集合的元素根据某种条件属于该子集。例如,集合 A 可以被定义为大于或等于 4 且小于或等于 12 的数的集合。可以使用以下符号来描述该语句:

A ={i | i 是一个整数,4 < = i < = 12}

如果我们引入集合的特征或指示函数的概念,则上述子集的图形表示是可能的,也就是说,在这种情况下,在整数集合上定义的函数,我们称之为 X,它指示 X 中子集 A 中元素的成员资格。这是通过将值 1 赋给 A 中的 X 元素,将值 0 赋给不在 A 中的 X 元素来实现的。因此,在我们的示例中,该集合的指示函数是:

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

这可以用图形显示如下:

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

图一。

两个集合的交集是包含两个集合共有的所有元素的集合。两个集合的并集是包含任一集合中所有元素的集合。集合 A 的否定是包含所有不在 A 中的元素的集合。

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

模糊集

模糊集是由洛特菲·扎德(1921–2017)在 1965 年引入的。

与清晰集合不同,模糊集合允许部分属于一个集合,该集合由隶属度定义,表示为,可以取从 0(元素根本不属于该集合)到 1(元素完全属于该集合)的任何值。

很明显,如果我们除去除了 0 和 1 之外的所有隶属值,模糊集将会崩溃为上一节所描述的清晰集。

集合的隶属函数是集合元素和它们的隶属度之间的关系。下图说明了如何将隶属函数应用于温度。

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

在上面的例子中,模糊集描述了发动机的温度范围,从很冷到很热。值是集合中成员的数量。例如,人们可以注意到,在 80 度的温度下,发动机可以被描述为0.8 倍,而非常热0.2 倍。

在上一节中,讨论了清晰集合的并集、交集和非运算符,因为它们提供了一种表达对推理至关重要的合取和析取(和/或)的方式。

计算两个模糊集合的并集的最常见方法是对集合应用最大值运算符。确实存在其他方法,包括在两个集合上使用乘积运算符。类似地,计算两个模糊集合的交集的最常见方法是对集合应用最小运算符。模糊集的补集是通过从 1 中减去集隶属函数来计算的。

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

一个重要的观察结果是,一个元素在一个集合和该集合的补集中都有一定的隶属度。因此,作为一个例子,元素 x 既可以在 A 中,也可以在“非 A”中。

模糊推理系统

模糊系统是一个模糊专家知识库,可以用模糊的术语而不是精确的布尔逻辑推理数据。专家知识是模糊隶属函数和一组模糊规则的集合,称为规则库,具有以下形式:

**IF** (conditions are fulfilled) **THEN** (consequences are inferred)

模糊系统的基本配置如下所示:

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

一个典型的模糊系统可以分为四个主要部分,即模糊化器、知识库、推理机和解模糊器;

模糊化器将一个真实的清晰输入映射到一个模糊函数,从而确定输入对一个模糊概念的“隶属度”。在许多控制器中,输入变量的值被映射到相应论域的值的范围。输入模糊集的范围和分辨率以及它们对模糊化过程的影响被认为是影响控制器整体性能的因素。

知识库包括应用领域的知识和伴随的控制目标。它可以分成一个数据库,该数据库包含用于在控制器中表达语言控制规则的定义,以及一个描述该领域专家所掌握的知识的规则库。直觉上,知识库是模糊控制器的核心元素,因为它将包含完成其执行任务所需的所有信息。各种研究人员已经应用技术来微调模糊控制器的知识库,许多人使用其他人工智能学科,如遗传算法或神经网络。

推理机提供控制器的决策逻辑。它利用模糊蕴涵和模糊推理规则来推导模糊控制动作。在许多方面,它可以被看作是对人类决策的模仿。

去模糊化过程将模糊控制值转换成清晰的量,即,它将单个点链接到模糊集,假定该点属于模糊集的支持。有许多去模糊化技术,最著名的是区域中心或重心。

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

其他去模糊化方法包括最大值优先和最大值平均。

几个推理模型使用模糊集来推理给定输入的系统输出。最流行的方法之一是由 Abe Mamdani 教授设计的,他使用模糊集来控制蒸汽机。另一个流行的模型是由 Tomohiro Takagi 教授和 Michio Sugeno 教授开发的。

在 Mamdani 推理中,模糊规则的前提和结果是模糊集。这种推理是基于广义假言,即模糊规则的结果的真实程度就是前件的真实程度。如果有一个以上的先行子句,则使用 min t-norm 运算符连接各个隶属度。如果模糊系统包含几个规则,它们的输出使用最大 s-范数算子组合。去模糊化是必要的,以便随后的动作可以用一个明确的值来表示。该过程的图示如下所示。

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

在 Takagi-Sugeno 推理模型中,结果是将清晰的输入值映射到规则清晰的输出的函数。因此,模糊规则的形式如下:

**IF** x IS X **and** y IS Y **THEN** z=f(x,y)

其中 f 通常是 X 和 y 中的线性函数。与 Mamdani 模糊系统相反,规则不是使用最大值算子来组合的,而是通过找到加权平均值来组合的,其中给定规则的权重是其前提的隶属度。因此,Takagi-Sugeno 系统不需要任何去模糊化。

模糊系统的设计

在本节中,我们将构建并执行一个简单的示例系统,以可视化模糊推理系统的设计和执行。这里考虑的假设系统根据环境的温度和湿度控制风扇的速度。因此,我们的系统由两个输入(温度和湿度)和一个输出(风扇转速)组成。

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

我们系统设计的第一步是定义模糊集来描述输入和输出变量。为简单起见,每个变量将由三个模糊集来表征,即:

Temperature: Cold, Medium, Hot
Humidity: Dry, Normal, Wet
Fan Speed: Slow, Moderate, Fast

下图显示了我们系统的输入和输出变量及其各自集合的图形表示。

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

可以注意到,三角形集合被用来描述这个系统的大多数集合;然而,“正常”湿度是用一个梯形集来指定的。模糊集反映了用户设计系统的知识,因此它们可以采取各种各样的形状。

注意,输出也是用模糊集描述的;因此,正在考虑的系统是一个 Mamdani 型系统,它使用模糊规则将与系统输入相关的模糊集链接到与系统输出相关的模糊集。

共有九条规则用于描述操作风扇所需的知识:

If Temperature is Cold and Humidity is Dry Then Fan Speed is Slow
If Temperature is Medium and Humidity is Dry Then Fan Speed is Slow
If Temperature is Cold and Humidity is Normal Then Fan Speed is SlowIf Temperature is Hot and Humidity is Dry Then Fan Speed is Moderate
If Temperature is Medium and Humidity is Normal Then Fan Speed is Moderate
If Temperature is Cold and Humidity is Wet Then Fan Speed is ModerateIf Temperature is Hot and Humidity is Normal Then Fan Speed is Fast
If Temperature is Hot and Humidity is Wet Then Fan Speed is Fast
If Temperature is Medium and Humidity is Wet Then Fan Speed is Fast

如果我们使用一个组合的模糊规则库,这些规则可以被可视化,这是一个网格,其中输入模糊集占据边缘,因此网格中的每个单元定义一个规则。下图显示了该系统的规则库。

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

当一个输入组合输入到系统时,会发生以下步骤,例如,假设温度为 18 度,湿度为 60%:

  • 确定每组输入变量的隶属度。因此我们可以说 18 度的温度是
0.48 Cold
0.29 Medium
0.00 Hot

60%的湿度是

0.0 Wet
1.0 Normal
0.0 Dry
  • 使用这种输入组合,两个规则以高于零的程度被触发,这可以在下面更新的模糊规则库中看到:

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

因此,我们的模糊输出将由激活度为 0.48 的慢速和激活度为 0.29 的中速组成。两个规则或系统模糊输出的综合效果如下所示:

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

使用重心去模糊化最终去模糊化输出集合,并且获得 36.814 的清晰值来驱动风扇。

结论

本文简要介绍了模糊集和模糊推理。它展示了如何使用语言术语来表示人类知识来实现对系统的控制。在下一篇文章中,将使用 python 从头开始构建一个模糊推理系统。

一个非常精确和快速的自动获取谷歌趋势数据的方法

原文:https://towardsdatascience.com/a-very-precise-fast-way-to-pull-google-trends-data-automatically-4c3c431960aa?source=collection_archive---------9-----------------------

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

图片来源:Unsplash 的 Alex Blajan。

一个一站式脚本,使用 Pytrends 通过精确的关键字自动拉动 Google trends

新冠肺炎为“谷歌趋势”在美国的使用提供了便利(见下图)。毕竟,它是一个免费的公开可用的工具,提供跨谷歌搜索引擎的实际搜索请求。越来越多的公司利用谷歌趋势来了解类别趋势、消费者热门搜索查询、竞争对手在“黑天鹅”疫情事件中的表现。

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

每个 Google Trends 请求包含 5 个独特的参数:

  • **关键词:**你的关键词在这里。您可以使用下拉框下的提示来选择正确的关键字。
  • **国家:**拥有国际足迹的公司可以使用这个功能来获取各国的趋势。
  • **日期区间:**选择趋势的时间范围。请注意,google 趋势数据是基于位置和时间进行标准化的。因此,不同的时间范围会产生不同的结果。
  • **类别:**表示您更喜欢搜索关键字的类别。
  • **搜索类型:**选择搜索源,即谷歌搜索、图片搜索、新闻搜索、谷歌购物和 YouTube 搜索。

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

挑战:

大规模收集谷歌趋势数据面临两大挑战。

1。单个关键字手动拉动是费时的。

虽然 Google Trends 提供了“比较”功能来比较关键词,但缺点是它根据输入的最流行的术语将结果从 0 到 100 进行缩放。不太受欢迎的关键字会很快失去敏感性,如果你把它与一个受欢迎的。比如你拿“耐克”品牌和“至尊”品牌对比,基本上会得到一条“至尊”的平线。在这种情况下,当报告“最高”搜索增长趋势时,你会犯很大的错误。因此,建议分别单独拉动“耐克”趋势和“至尊”趋势。

直到你有太多的关键词需要提取,你还是有时间的。例如,当比较 50 个服装和鞋类品牌时,您需要下载 50 个 excels 并将它们组合在一起。

。当前可用的自动化 python 方法不查询精确的关键字,这意味着它们不准确。**

使用 python 有许多可用的方法来获取谷歌趋势数据。然而,他们都没有建立自动代码,可以把精确的 关键词。单词通常有多种含义,这并不罕见。例如,“巴塔哥尼亚”可以是一家服装公司,也可以是南美的一个地区。简单地搜索“巴塔哥尼亚”会给我们含糊不清的结果,因为它包含两个搜索词。我们需要确保搜索到正确的关键词。

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

目标:

我们的目标是提供一个解决方案,精确地、单独地、自动地提取多个关键字的 google 趋势数据。

具体来说,我们将提取三个国家(美国、英国、德国)的六个服装/鞋类品牌(耐克、阿迪达斯、安德玛、Zara、H&M、路易威登)的谷歌趋势数据。使用 Python,有四个步骤可以实现这一点:

  • 第一步:安装pytrends API
  • 第二步:获取准确的关键词
  • 第三步:按照国家的关键词提取谷歌趋势数据
  • 第四步:可视化谷歌趋势

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

步骤 1:安装 pytrends API

首先,我们需要安装名为“pytrends”的软件包,该软件包旨在使用 python 拉取 google trends。只需从您的终端执行以下代码。你可以在这里找到 pytrends API 的完整文档。

pip install pytrends

然后我们将导入必要的包。

import pandas as pd
import pytrends
from pytrends.request import TrendReq
pytrend = TrendReq()

第二步:获取准确的关键词

如前所述,我们需要精确的关键词以避免歧义。Pytrends 提供了一个名为pytrend.suggestions的函数,可以为一个关键字返回几个建议。通常,第一个建议是最受欢迎的。“mid”列包含我们想要搜索的确切关键字。

KEYWORDS=['Nike','Adidas','Under Armour','Zara','H&M','Louis Vuitton'] 
KEYWORDS_CODES=[pytrend.suggestions(keyword=i)[0] for i in KEYWORDS] 
df_CODES= pd.DataFrame(KEYWORDS_CODES)
df_CODES

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

第三步:通过关键词获取谷歌趋势数据

接下来,我们将设置这 5 个参数。

EXACT_KEYWORDS=df_CODES['mid'].to_list()
DATE_INTERVAL='2020-01-01 2020-05-01'
COUNTRY=["US","GB","DE"] #Use [this link](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes) for iso country code
CATEGORY=0 # Use [this link](https://github.com/pat310/google-trends-api/wiki/Google-Trends-Categories) to select categories
SEARCH_TYPE='' #default is 'web searches',others include 'images','news','youtube','froogle' (google shopping)

然后,我们将编写代码,使用上述参数通过国家的精确关键字提取 google trends 数据。

Individual_EXACT_KEYWORD = list(zip(*[iter(EXACT_KEYWORDS)]*1))
Individual_EXACT_KEYWORD = [list(x) for x in Individual_EXACT_KEYWORD]
dicti = {}
i = 1
for Country in COUNTRY:
    for keyword in Individual_EXACT_KEYWORD:
        pytrend.build_payload(kw_list=keyword, 
                              timeframe = DATE_INTERVAL, 
                              geo = Country, 
                              cat=CATEGORY,
                              gprop=SEARCH_TYPE) 
        dicti[i] = pytrend.interest_over_time()
        i+=1
df_trends = pd.concat(dicti, axis=1)

我们会做一些清理工作,将这些关键词改回易读的品牌名称。

df_trends.columns = df_trends.columns.droplevel(0) #drop outside header
df_trends = df_trends.drop('isPartial', axis = 1) #drop "isPartial"
df_trends.reset_index(level=0,inplace=True) #reset_index
df_trends.columns=['date','Nike-US','Adidas-US','Under Armour-US','Zara-US','H&M-US','Louis Vuitton-US','Nike-UK','Adidas-UK','Under Armour-UK','Zara-UK','H&M-UK','Louis Vuitton-UK',
'Nike-Germany','Adidas-Germany','Under Armour-Germany','Zara-Germany','H&M-Germany','Louis Vuitton-Germany'] #change column names

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

第四步:可视化谷歌趋势

一眨眼的功夫,我们就得到了谷歌趋势数据。最后,让我们可视化路易威登跨国家的谷歌趋势。正如我们所见,路易威登显然受到了新冠肺炎的沉重打击,就像许多其他品牌和行业一样。

import seaborn as sns
sns.set(color_codes=True)
dx = df_trends.plot(figsize = (12,8),x="date", y=['Louis Vuitton-US','Louis Vuitton-UK','Louis Vuitton-Germany'], kind="line", title = "Louis Vuitton Google Trends")
dx.set_xlabel('Date')
dx.set_ylabel('Trends Index')
dx.tick_params(axis='both', which='both', labelsize=10)

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

摘要

随着各公司密切关注新冠肺炎期间消费者行为的变化,谷歌趋势工具的使用出现激增。为了帮助实现这一点,我们构建了一个轻量级应用程序来精确、自动地提取 Google 趋势数据。

最后,保持积极,感谢阅读!

云处理现在更简单,更便宜!

原文:https://towardsdatascience.com/a-very-simple-and-cheap-way-to-run-your-processing-job-on-the-cloud-c76af579f9e9?source=collection_archive---------37-----------------------

在云上运行/分发您的* 现有* 处理/训练代码的一种非常简单便宜的方式

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

作者图片

这发生在我身上,我相信也发生在你和许多从事中小型项目的数据科学家身上:

您已经在自己的训练管道(预处理->训练->测试)上投入了很多,使用不同的参数在本地尝试了几次,看起来很棒。但是……你意识到你需要更多的 RAM/CPU/GPU/GPU 内存或者所有这些加在一起才能充分利用它吗?

它的发生有很多原因——

  • 您的本地设置花费了太多时间来进行培训
  • 您需要更大的批处理大小,并且它不适合您的本地 GPU 内存
  • 你想要调整超参数,所以需要很多训练
  • 您希望将一些预处理步骤移到培训期间完成,例如,为了节省磁盘空间/加载时间,而 CPU / RAM 无法完成

因此,*,*理论上,你已经拥有了你需要的一切,但是你只需要在一个更好的硬件上运行它……这在今天应该不是问题,不是吗?

现有解决方案

确实有很多解决方案,这里有一些相关的技术/平台/解决方案:

通用

  1. Apache Airflow —“以编程方式创作、安排和监控工作流的平台”
  2. ——“快速简单的分布式计算”

云提供商 AI 解决方案

  1. kube flow——“kubernetes 的机器学习工具包”( pipelines )
  2. GCP 人工智能平台——“一个平台来构建、部署和管理机器学习模型”(训练管道分布式 PyTorch 、分布式 TensorFlow )
  3. Azure 机器学习——“企业级机器学习服务,更快地构建和部署模型”(培训)
  4. AWS Sagemaker —“面向每一个开发者和数据科学家的机器学习”(培训分布式 PyTorch分布式 TensorFlow )

分布式培训框架

  1. rays GD——“分布式深度学习的轻量级库”,构建在 Ray 之上
  2. Horovod——“分布式深度学习训练框架”

张量流

  1. TensorFlow 分布式培训文档
  2. TensorFlow 自己的 GCP 分布式 GCP 培训教程
  3. TensorFlow 培训(TFJob) 针对 Kubernetes(kube flow 的一部分)

PyTorch

  1. PyTorch 分发的培训文件
  2. PyTorch 自己的 AWS 分布式培训教程
  3. Kubernetes 的火炬控制器
  4. 在 CPU 或 GPU 上运行分布式 PyTorch 培训(使用 Kubeflow 管道)

所有现有解决方案的优缺点的比较值得一提(甚至是一系列),我肯定我忘了提到许多其他的:)

但是,我找不到一个可以让你运行我现有代码的工具,只需要很少或者不需要额外的编码,很便宜,也不需要很多之前的特定平台知识。我也只是想尝试拥有自己的开源项目,包括文档和完全自动化的测试和发布管道:)
这就是我想出simple-sagemaker和这篇文章的原因。

很简单-Sagemaker 来拯救

Simple——sagemaker允许您将现有的代码原封不动地放在云上运行,不需要或只需要很少的代码修改。

这篇文章的剩余部分展示了如何使用这个库进行通用处理。后续文章将展示如何将其用于更高级的案例,如 PyTorch 分布式培训等。

更全面的文档和例子可以在 github 项目上找到,还有一些更多例子,包括这篇文章中所有例子的源代码。

要求

  1. Python 3.6 以上版本
  2. 为 boto3 配置的 AWS 帐户+区域和凭证,如 Boto3 文档中所述

装置

pip install simple-sagemaker

运行 shell 命令

现在,要让 shell 命令cat /proc/cpuinfo && nvidia-smi在单个ml.p3.2xlarge****实例上运行,只需运行下面的ssm命令(关于ssm CLI 的文档在下面的中给出):

ssm shell -p ssm-ex -t ex1 -o ./out1 --it ml.p3.2xlarge --cmd_line "cat /proc/cpuinfo && nvidia-smi"

一旦任务完成(几分钟),输出日志就会下载到./out1:

正如您可能猜到的那样,使用这个命令行,您会得到:

  1. 选择一个用于运行代码的预构建映像(默认为 Sagemaker 的 PyTorch 框架映像)。
  2. 一个 IAM 角色(默认名称为SageMakerIAMRole_ssm-ex)和amazonseagemakerfullaccess策略被自动创建用于运行任务。
  3. 一个ml.p3.2xlarge spot 实例为你启动,你只需为你使用它的时间付费!
    注意:这比执行时间稍长,因为它包括启动(如下载图像、代码、输入)和关闭(保存输出)等时间。
  4. 在实例上执行 shell 命令。
  5. shell 命令 exist 代码为 0,因此它被认为已成功完成。
  6. 输出日志保存到 CloudWatch,然后从 CloudWatch 下载到./out1 文件夹。

很酷的第一名,不是吗?

分发 Python 代码

同样,在上运行下面的ssm_ex2.py两个ml . p 3.2x largespot实例**😗*

只需运行下面的ssm命令:

ssm run -p ssm-ex -t ex2 -e ssm_ex2.py -o ./out2 --it ml.p3.2xlarge --ic 2

输出被保存到./out2:

您可能已经猜到了,这里您还会得到以下内容:

  1. 本地 python 脚本被复制到 S3 上的一个专用路径([Bucket name]/[Project name]/[Task name]/[Job Name]/source/sourcedir.tar.gz)(更多细节在这里)。
  2. 两个 spot 实例用 S3 桶中的代码启动。

很酷的#2,不是吗?

高水位流量

这是一个代表高层次流程的图表:

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

一个功能全面的高级示例

现在是一个高级的和完全(嗯,几乎:)特色的版本,但实现起来很简单。注意:当我们定制图像时,需要 docker 引擎。

该示例由两部分组成,每一部分都展示了一些特性。此外,这两个部分是“链式”的,这意味着第一个部分的输出是第二个部分的输入。

为了举例说明大多数功能,使用了以下目录结构:

.
|-- code
|   |-- internal_dependency
|   |   `-- lib2.py
|   |-- requirements.txt
|   `-- ssm_ex3_worker.py
|-- data
|   |-- sample_data1.txt
|   `-- sample_data2.txt
`-- external_dependency
    `-- lib1.py
  1. 代码 —源代码文件夹
  • internal_dependency —源代码文件夹中的依赖项
  • requirements.txt — pip 需求文件列出了在运行 worker
    transformers==3.0.2之前需要安装的包

2.数据 —输入数据文件

3.外部依赖 —附加代码依赖

我们将使用 to 任务,首先得到两个输入通道

第一项任务

该任务获得两个输入通道:

  1. 数据通道——分布在两个实例之间的./data上的本地路径(由于ShardedByS3Key)
  2. 人物频道——S3 的一条公共道路

演示了以下内容:

  1. 命名项目(-p)和任务(-t)。
  2. 使用本地数据文件夹作为输入,它分布在实例中(— iShardedByS3Key)。该文件夹首先被同步到 S3 上专用于该特定任务的目录中(根据项目/任务名称),然后被提供给工人。如果你再次运行相同的任务,就不需要上传整个数据集,只需要再次同步即可。
  3. 使用公共 s3 存储桶作为附加输入(--is)。角色会自动添加到所使用的 IAM 策略中,以允许该访问。
  4. 构建一个定制的 docker 映像(--df--repo_name-- aws_repo_name),以使pandassklearn库对工人可用。基本映像是自动获取的(PyTorch 框架是默认的),映像在本地构建,然后上传到 ECR 供正在运行的实例使用。
  5. 超参数任务类型。任何额外的参数都被认为是超参数。在--(后面跟一个空格)之后的任何内容都按原样传递给执行的脚本命令行。
  6. 启动两个实例(--ic)。
  7. --force_running —确保我们再次运行任务(作为本例的一部分)。
  8. 使用按需实例(--no_spot)。
  9. requirements.txt的用法——因为它是源代码文件夹(-e)的一部分,所以在运行 worker 之前会自动安装。
  10. internal_dependecty文件夹作为源代码文件夹的一部分被复制。

很酷的 3 号,不是吗?

工人代码:

工人可以通过使用WorkerConfig对象或环境变量来访问其配置。例如:

  • worker_config.channel_data —输入数据
  • worker_config.channel_persons —来自公共 s3 桶的数据
  • worker_config.instance_state —实例状态,在相同任务的执行之间维护

在这种情况下,工作进程将输入通道数据中的文件“处理”到模型输出文件夹中,并将附加文件写入输出数据文件夹。

完整的配置文件可以在这里找到。

第二项任务

第二个任务也获得两个输入通道:

  1. ex3_1_model 通道—第一个任务的模型输出
  2. ex3_1_state 通道—第一个任务的状态

演示了以下附加功能:

  1. 链接—使用第 1 部分的输出(— iit)作为该部分的输入。模型输出和凝视都被采用。
  2. 使用附加的本地代码依赖项(-d)。
  3. 使用 TensorFlow 框架作为预建图像(-f)。
  4. 标记作业(-- tag)。
  5. 定义一个 Sagemaker 度量(-- md)。

很酷的 4 号,不是吗?

代码可以使用worker_config.ex3_1_stateworker_config.ex3_1_state访问其输入数据通道。

此外,分数日志由上面的ssm命令中的"Score=(.*?);"正则表达式捕获,然后可以在 AWS 控制台上查看度量图:

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

完整的代码

我们可以把这两个 worker 放在一个文件中,使用task_type超参数来区分这两种类型的执行:

结论

我希望我成功地传达了简单的信息,并说服您下次需要更强大的硬件来处理脚本时,尝试一下simple-sagemaker。上面的例子,以及总结你所得到的“非常酷”的观点,不言自明:)。

让我知道你是否喜欢它,在下面鼓掌/看 github 项目。

亚马逊 Sagemaker 上深度学习的一个非常简单的介绍

原文:https://towardsdatascience.com/a-very-simple-introduction-to-deep-learning-on-amazon-sagemaker-b6ca2426275a?source=collection_archive---------17-----------------------

这里有一个非常简单的方法来开始在云中进行深度学习!

介绍

在本文中,我将引导您将数据加载到 S3,然后在 Amazon Sagemaker 上构建一个 Jupyter 笔记本实例来运行深度学习作业。

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

🇨🇭·克劳迪奥·施瓦茨| @purzlbaum 在 Unsplash 上拍摄的照片

我将要回顾的方法并不是在云中运行深度学习的唯一方法*(事实上它甚至不是推荐的方法)*。但是这个方法是一个很好的开始方式。

优点:

  • 轻松过渡到云!比方说,我想在一台更大的机器上运行我已经建立的代码,或者我没有本地 GPU,我想在没有 Google Colab 超时的情况下运行一个更长的作业,那么这个方法应该允许您以更少的代码更改启动并运行 AWS!
  • 一旦你掌握了这种方法,你就可以转向更强大的选项。

CONS:

  • 目前,Sagemaker 没有针对笔记本实例的自动关机功能。为什么这很重要?好吧,假设我做一份培训工作,然后去看电影。当我回到家,我的笔记本\GPU 实例仍然在运行,即使作业在几个小时前就结束了。这样不好,因为我是为那个时间付费的(而且 GPU 也不便宜)。所以用这种方法,你基本上不能让你的机器处于无人监控的状态。

边注:有一种使用“脚本模式”自动关机的方法,但是它需要一些额外的编码。这是一个你可以探索的选项,如果你愿意,你可以在这里 阅读我关于脚本模式 的文章。

在我创建了一个 S3 桶和一个 Sagemaker 笔记本实例之后,我将向您介绍一些我编写并存储在 GitHub 上的示例代码。GitHub 上的笔记本遍历了如何在 S3 连接到您的数据,然后遍历了一些 hyperpt+tensor flow \ Keras 代码。在我的远视例子中,我正在为一个递归神经网络进行超参数搜索。

神经网络超参数调整动机

(有一点需要注意,笔记本上没有提到的是,远视是在 *精度上进行优化。*是重要的。Hyperopt 希望找到您的成本指标的最小值,在我的情况下就是准确性。所以用 精度找到精度最高的网络!)

好吧,如果你正在读这篇文章,那么你可能以前训练过神经网络。你甚至可能用 sklearn 来做神经网络随机搜索交叉验证,但是你想把它带到下一个层次。

首先,我推荐阅读下面这篇关于超参数调优的文章。简而言之,随机搜索实际上做得很好,不需要运行大量的迭代。但是不管你是使用随机搜索还是贝叶斯方法,你都可能遇到以下问题…

1.神经网络上的超参数调整需要很长时间(即使使用 GPU)。

2.在任何免费培训平台上运行长时间的作业(例如 Google Colab,Kaggle)通常会超时。

现在,你做什么?

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

照片由艾米丽·莫特Unsplash 上拍摄

好吧,你有两个选择:

1.买一台带 GPU 的个人电脑(这是要花钱的,大一点的会好一点)**

2.在云上租一个 GPU(也要花钱)**

就我个人而言,我最终购买了一台带 GPU 的笔记本电脑,但在此之前,我尝试了云选项。拥有一个个人 GPU 是很棒的,但随着你的进步,你会发现自己需要更多的能力,无论如何你都会回到云中(至少我是这么发现的)

好了,节目已经开始了,我们如何使用 Sagemaker 来建立我们的神经网络!

第一步:进入 AWS 并创建一个帐户。

似乎是合乎逻辑的第一步。转到下面的链接,然后单击“创建 AWS 帐户”(如果您还没有帐户)

https://aws.amazon.com/

步骤 2:将数据保存到 S3

因此,此时您应该在管理控制台上。

接下来,点击“服务”,然后点击“S3”。

现在点击“创建存储桶”。

现在按照提示创建您的 bucket,给它命名,等等。确保你选择了你所在的地区。我在美国东海岸,所以对我来说,北弗吉尼亚的作品。

如果你像我一样,只是在玩 Sagemaker,并且不太关心权限(因为存储的信息都不是敏感的)那么你可以点击“下一页”进入第 2-4 页。

当你完成后,你应该有一个新的 S3 桶!现在点击你的 S3 桶名。

这应该带你到你的 S3 桶,你可以上传数据!点击“上传”,然后点击“添加数据”,从本地机器中选择您的数据,并按照提示进行操作。再说一次,我并不太关心权限,所以我只是在选择了我的数据后,点击了很多次“下一步”。

(注:S3 是有代价的。因此,当您完成时,您可能希望删除您的数据集,甚至您的存储桶。)

第三步:启动 Sagemaker 笔记本

返回“服务”并找到\点击“Sagemaker”。

(注意:我们将启动一个运行在 ml.p2.xlarge 上的笔记本实例,它有一个 GPU,成本大约为 1.20 美元/小时。当您完成培训后,请确保关闭笔记本实例。还要注意的是,这份工作是要花钱的!!)

https://aws.amazon.com/sagemaker/pricing/

单击笔记本实例>“创建笔记本实例”

现在,我们将为笔记本命名,并确保选择一个 ml.p2.xlarge 来获取一个 GPU 实例。

你可能必须通过一些权限,如果你像我一样,你可以绕过很多这种。(我在这里不打算涉及这些)。此外,如果您像我一样,在访问 GPU 时可能会遇到一些问题,在这种情况下,只需通过“支持”下拉菜单联系支持人员,并提交专门针对 GPU 实例的配额增加。当 AWS 完成您的配额增加后,您必须返回“创建笔记本实例”并重新开始。

一旦您完成了“创建笔记本实例”步骤,笔记本实例现在将被创建。这可能需要一些时间…

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

迈克·肯尼利在 Unsplash 上拍摄的照片

创建实例后,您应该能够单击“打开 Jupyter ”,这将带您进入运行在新 GPU 实例\机器上的 Jupyter!

Jupyter 打开后,单击“新建”下拉菜单并选择“conda_tensorflow_36”,创建一个新的“conda_tensorflow_36”笔记本。

第四步:运行一些代码!

现在,您可以在 GitHub 上查看我的完整笔记本,其中包括如何连接到您的数据、安装 hyperopt 以及运行您的作业的注释!查看完整的 GitHub repo 与笔记本此处

第五步:全部关闭!

完成后,记得通过单击您的笔记本实例名称,然后单击“停止”来关闭您的笔记本实例。我甚至建议删除笔记本实例,以及重新访问您的 S3 存储桶并删除您的存储桶,否则将所有这些工作放在亚马逊上会让您损失金钱!

结束了!

谢谢大家,希望这对你有所帮助。快乐学习!😄

其他资源\参考资料:

*【https://github.com/hyperopt/hyperopt *

https://hyperopt.github.io/hyperopt/

https://sci kit-learn . org/stable/modules/generated/sk learn . model _ selection。RandomizedSearchCV.html

https://aws.amazon.com/

https://blog . cloud ability . com/AWS-S3-了解-云存储-节省成本/

https://github . com/yea music 21/Hyperopt _ On _ sage maker/blob/master/Hyperas _ mjy _ v1 _ 3 . ipynb

一种非常简单的利用马尔可夫模型查找表进行天气预报的方法

原文:https://towardsdatascience.com/a-very-simple-method-of-weather-forecast-using-markov-model-lookup-table-f9238e110938?source=collection_archive---------22-----------------------

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

奥斯曼·拉纳在 Unsplash 上拍摄的照片

天气是一个非常复杂的事件。即使你只是想预测降雨事件,这也是相当困难的。但是你知道,有一句名言是这样说的

历史会重演

基于此,我们将尝试使用马尔可夫模型来预测天气。但是,第一件事是,我们必须理解马尔可夫模型的概念。

马尔可夫模型

什么是马尔可夫模型?这是一个非常简单的概念。根据维基百科,马尔可夫模型是

概率论中,马尔可夫模型是一种随机模型,用于建模随机变化系统。假设未来状态只取决于当前状态,而不取决于之前发生的事件(即假设马尔可夫性质)。

我们必须注意的词是

未来状态仅取决于当前状态

你如何达到目前的状态并不重要,重要的只是我们目前的状态。这个很简单。为了说清楚,我们举个例子

1 和 1 和 1 和 1 和 1 和 2 和 1

在上面的字符串中,有 3 个唯一的字符,即“1”、“and”和“2”(为了简单起见,我们忽略空格(" ")也是一个字符的事实),这意味着我们有 3 种状态。为了确定如何从一个状态改变到另一个状态,马尔可夫模型有一个马尔可夫转移矩阵这是一个矩阵,它将某一种情况的概率映射到另一种状态,包括它本身。对于这种情况,矩阵的一般形式如下

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

我想你们都明白上面矩阵中的符号。反正 Prob 是概率的简称。现在我们如何在转移矩阵中确定这样的概率呢?我们从观测数据中抽样获得。让我们在示例字符串中映射所有改变状态的事件及其频率。

首先,这里所有的变化状态事件

1 和 1 和 1 和 1 和 1 和 2 和 1

[1-> and][and-> 1][1-> and][and-> 1][1-> and][and-> 1][and-> 1][1-> and][and-> 1][and-> 1][1-> and][and-> 2][and-> 2][and-> 1]

所以我们得到了

“1”更改为“和”(5/5 = 100%)

“与”变为“1”(6 个中的 5 个= 83.33%)

“和”更改为“2”(6 个中的 1 个= 16.66%)

“2”更改为“和”(第 1 个,共 1 个= 100%)

由此,我们得到了转移矩阵

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

有了这个矩阵,我们就知道了这样一个事实:如果我们当前的状态是“1”,那么下一个状态或下一个单词一定是“and”,从“and”到“1”的概率很大(83%),到“2”的概率很小(17%)。从“2”开始,它将在“和”中结束。哦,供你参考有几种马尔可夫模型这种假设系统完全可观测且自治的马尔可夫模型称为马尔可夫链。

使用马尔可夫模型预测天气

现在我们明白了什么是马尔可夫模型。我们知道引语(“历史重演”)和马尔可夫模型之间的关系。实际上,做天气预报的方法之一叫做模拟法。它是关于检查与我们当前状态相同的过去状态,并在这个状态之后根据过去发生的事情预测天气。因此,使用马尔可夫模型来应用模拟方法预测天气是完美的。

是时候继续我们的实验细节了。在马尔可夫模型的典型示例中,该示例总是关于天气预测,但是具有诸如“晴天”、“多云”和“雨天”的简单状态。在真实的天气报告或预测中并不是那样简单。真实报告或预测除了天气之外,还定义了当前或未来时间的温度、湿度、能见度和风。

在这个实验中,我们将把温度、湿度、能见度、风和天气的每一种独特组合视为一种状态。为了避免组合的无限可能性,我们对除天气以外的所有参数进行分组和舍入(除天气以外的所有参数都是实数,范围 0 到 1 之间有无限个实数)。分组和舍入的细节我们将在后面讨论。即使我们已经在做这个东西,参数的总可能组合将超过一千个。这就是为什么我们将构建一个查找表来映射数据集中所有现有的状态。

当我们发现一个新的唯一状态时,我们将对当前状态中所有参数的组合进行编码,并将其注册到当前状态及其未来状态的表中。当我们再次发现那个状态是当前状态时,它当时的未来状态将与那个当前状态的其他未来状态一起被附加到那个状态的未来状态的列表中。

当我们想用这个表来预测未来的天气时,首先将我们当前的天气参数的状态编码成一个关键字在我们的表中进行搜索。当我们发现相同的编码状态时,看看它未来状态的列表。挑选最频繁的编码状态并解码就这样。你得到了天气预报基于使用马尔可夫模型的模拟方法。很简单。如果你没有从表中找到我们当前的状态,这意味着我们无法预测这个状态。这就是为什么我们需要最小化可能的状态,需要一个大的数据集来最小化当我们想要预测天气时找到一个新的唯一状态的可能性。

我们将用于构建转移矩阵的数据集是元数据。METAR 是一个字母数字代码,包含某个区域每 1 小时或半小时的天气状况和其他参数。

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

元数据的例子

为了这个实验,我已经解码了一些从 2012 年 1 月 1 日到 2020 年 5 月 31 日的 JSON 格式的 METAR 数据。你可以在这里下载。这个 JSON 数据包含从这些 METAR 代码中提取的风速和风向、能见度、温度、露点和天气。在这个实验中,我使用 MongoDB 和 pymongo。

第一步,让我们建立转移矩阵或查找表。我们使用 2012 年 1 月 1 日至 2019 年 12 月 31 日的数据来构建该表。这是脚本

在这个实验中,我们将一天分为 4 个时段,即上午时段(当地时间上午 6 点-12 点)、下午时段(当地时间上午 12 点-下午 6 点)、晚上时段(下午 6 点-12 点)和午夜时段(当地时间下午 12 点-第二天早上 6 点)。我们的数据集的时间分辨率是半小时。因此,我们需要汇总每一节中的每一个参数值。对于除天气以外的所有参数,我们对每个部分的参数值进行平均。平均之后,是分组和四舍五入。对于天气,我们选择在该部分的时间段内发生的最重要的天气。

使用 GMT 或 UTC 作为时间指示器的 METAR 数据。我们所在地的当地时间是 GMT+7,所以我们需要调整从数据库获取数据的方式(请看上面代码中的第 77 行)。

之前我说过,我们将在后面讨论舍入和分组参数值。现在,是时候了。对于风速,我们将其分为 5 组:

  • < 5 knot wind (encoded it as “<5KT”)
  • 5–10 knot wind (encoded it as “5–10KT”)
  • 10–15 knot wind (encoded it as “10–15KT”)
  • 15–20 knot wind (encoded it as “<15–20KT”)
  • 20–25 knot wind (encoded it as “<20–25KT”)
  • 25 节风(编码为" > 25KT ")

对于风向,我们将其分组为 8 个方向

  • < 45° (encoded as “Northeast”)
  • 45–90° (encoded as “East”)
  • 90–135° (encoded as “Southeast”)
  • 135–180° (encoded as “South”)
  • 180–225° (encoded as “Southwest”)
  • 225–270° (encoded as “West”)
  • 270–315° (encoded as “Northwest”)
  • 315–360° (encoded as “North”)

Yeah, recently I realized that my classification of wind direction is not quite right. But it doesn’t matter because we just want to group the wind direction so it will not generate too much unique state.

对于能见度,我们将该值四舍五入为第一千个值,并以同样的方式编码,能见度值>为 1000 米。对于 500–100,我们将其视为 500 米(编码为“500”),最后对于所有能见度< 500 米,我们将其视为 0 米(编码为“0”)。特别为能见度,它有 2 个槽状态,即最低能见度和最高能见度。

对于温度,我们将其四舍五入为整数(编码与此相同)。

对于相对湿度(RH) ,有点特殊,因为我们数据库里没有 RH 数据。我们从温度和露点预测它的值。之后,我们在什一税中对值进行舍入(编码与此相同)。

对于天气,我们选择该部分时间段内最重要的天气。天气的重要程度定义如下:

上面的天气代码被编码以使其更短。比如小雨编码为-RA,雨编码为 RA,雷雨编码为 TS。下降越多,天气越重要。天气编码与此天气代码相同。当没有显著的天气时,我们将其编码为“NOSIG”。

在我们对所有参数进行编码后,我们将它们连接起来,并用“|”字符分隔。这就是我们如何对单个状态进行编码。

我们得到查找表后,就该尝试用这个表来预测天气了。我们将使用 2020 年 1 月 1 日至 2020 年 5 月 31 日的数据。这是脚本

这将生成一个 CSV 格式的新文件 result.dat。第一列是当前状态,第二列是下一个状态(真值),第三列是下一个状态的预测。

下面是我从上面的代码生成的 result.dat。

哇,有这么多“未知”的预测。“未知”意味着状态太新,所以我们无法预测它。但是,有些预测结果接近实际状态,不尽相同。看起来我们的表格需要更多的数据。当我在这么多“未知”的情况下得到这个结果时,我得出结论,我需要更多的数据至少 30 年的数据(这是气象学或气候学中看到某个地区天气正常模式的标准)。

这是模拟方法的应用,使用马尔可夫模型预测天气。下一次,也许我会尝试使用稳定指数数据,或者低层和高层大气的温度和相对湿度,这是一个非常决定性的参数,经常被预报员用来预测天气。

更新

你可以在这里访问完整代码

参考资料:

https://en.wikipedia.org/wiki/Markov_model于 2020 年 6 月 3 日进入

http://aviation.bmkg.go.id/web/于 2020 年 6 月 6 日进入

http://ww 2010 . Atmos . uiuc . edu/(Gh)/guides/mtr/fcst/mth/oth . rxml2020 年 6 月 6 日访问

机器学习操作基础设施的观点

原文:https://towardsdatascience.com/a-view-on-machine-learning-operations-infrastructure-e2bbc7cf0bdc?source=collection_archive---------46-----------------------

笔记本之后的现实:如何开发一个健壮的框架来确保对机器学习操作的控制

生成一个工作的(产生价值的)机器学习模型不是一件容易的事情。它通常涉及先进的建模技术和技能稀缺的团队。然而,这只是更复杂任务的第一步:将模型部署到产品中并防止其退化。

即使通过云转移得到缓解,至少三分之二的 IT 支出仍然集中在维护模式任务上。关于 ML 相关项目的这种划分是否成立的研究仍然很少,但我认为这一比例甚至会显著增加,因为 ML 工作负载有更多的“流动”输入和更少的控制杠杆,如下所示:

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

图 1—ML 工作负载维护中可变性和控制的影响

本质上,维护主要是由我们对系统中不同组件的可变性和控制水平驱动的。如图所示,有理由得出这样的结论:机器学习工作负载更倾向于维护任务。更糟糕的是,数据和代码(业务角色)的演进路径不一定需要一致。这在机器学习系统中隐藏的技术债务中有很深入的解释

有理由得出结论,机器学习工作负载更倾向于维护任务

因此,绝对有必要开发一个健壮的框架,以确保一旦我们的模型被部署到生产中,就能控制机器学习操作,同时确保模型的质量及其发展不受损害。

开发模型的科学(艺术)是一个被充分研究的领域,甚至有模型开发的行业参考框架,如 CRISP-D M,特定的 EdA 方法,所以在本文的其余部分,我们将假设我们已经有了一个具有可接受性能的经过训练的模型。

大规模运行机器学习,我们需要什么基础设施?

简而言之,我们需要设计三个大平台,当然除了构建初始模型、运行实验等的开发平台,还有另一个跨功能平台,如代码库、容器注册表、调度程序或监控系统。下图描述了这些平台:

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

图 2 — 基础 ML 平台组件

特色店内

本质上,特征库将特征工程过程与其使用分离。这对于输入数据受制于复杂的特征转换逻辑或一个特征被多个模型使用的情况尤其有用,在这些情况下,特征存储是一个很好的工程组件,因为它隐藏了复杂性并提高了可重用性。但是,在某些情况下,我们可以跳过此组件,例如,用于训练模型的数据处于其自然状态,或者模型本身包含特征生成器(例如,卷积、双向或嵌入层)。

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

图 3 — 功能商店内的组件

特征库由许多元素组成:

  • *摄取:*该组件负责将原始数据加载到特性存储存储中。应该支持批处理和在线摄取路径。
  • *特征转换:*该组件负责实际计算特征,同样应支持批处理和在线处理。设计该组件时,计算时间性能至关重要。
  • 特征服务层:实际为下游处理提供特征的组件。同样,可以在线或批量检索特征。

训练平台内

训练装备的目标是找到并产生最佳模型(在特定时间点),给定:(I)初始模型架构,(ii)一组可调超参数,以及(iii)历史标记特征集。

下图突出了我认为应该存在的主要组件,以确保顺利和有效的培训操作。

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

图 4 — 训练设备内部的组件

训练平台的输出是我所谓的*“黄金模型”*,换句话说,就是将在推理平台中部署的架构、权重和签名。为了产生这些资产,几个组件必须介入。

  • 重新训练检查器:该组件任务是检测何时需要重新训练当前黄金模型,有许多情况下必须引发重新训练事件。我建议部署一些评估人员来检查再培训条件。一些例子可以是特征的改变(添加或删除)、训练集中的统计差异(数据漂移)、或者训练数据和服务数据之间的差异(偏斜)、或者只是准确性度量的下降。生成的模型应该被传递给 promoter 组件,该组件将拥有将它部署到生产环境以及如何部署的最终决定权。
  • 黄金模型循环:这可能是最关键的一步,它实际上执行了训练。因此,在设计系统时,应考虑性能因素(例如,分布式基础设施和对硬件 asics 的访问)。另一个职责是生成模型签名,明确定义输入和输出接口以及任何初始化任务(如变量加载器)。
  • 下一个黄金模型循环:该组件旨在通过不断优化(或试图优化)当前黄金模型来发现潜在的新模型。有两个子循环,一个用于优化超参数(例如学习率、优化器…)和另一个用于启动对新模型架构(例如层数)的搜索。虽然有两个独立的循环,但是新的模型架构候选可以在超参数循环上进一步细化。该组件可能是资源密集型的,特别是如果搜索空间很大并且优化算法(例如网格搜索、hyperband)是贪婪的。从工程角度来看,应该考虑可恢复操作的检查点和作业优先级机制等技术。在采取任何额外措施之前,应进一步评估该组件的输出。
  • 模型发起人:该组件负责发布准备投入生产工作的模型,因此这一步需要进行大量的测试。在任何情况下,正如我们将在推理装备中检查的,没有新的模型将被公开部署到他们所有的潜在用户群。
  • 元数据存储:这个组件集中了所有与训练阶段相关的元数据(模型库,参数,实验…)

预测装置内部

预测平台的主要目标是执行推理。下图展示了实现这一目标的一组组件。

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

图 5 — 预测试验台内部的组件

推理阶段有几个组件:

  • *特性转换器:*即使已经有了一个特性存储库来将特性从数据生产系统中分离出来,我认为特性转换器仍然可以在推理时将低级的特定操作应用到潜在的可重用和更抽象的特性中。对于在线系统,延迟要求至关重要。
  • *调度程序:*调度程序的目标是将请求路由到特定的预测端点。我相信每一个请求都应该经过试验,这就是为什么调度员应该能够将呼叫重定向到一个特定的或许多现场试验,黄金模型或两者。每一个未经实验的请求都是一个改进机会的丧失。
  • *预测主干:*预测装备的马力取决于该组件,因此从工程的角度来看,针对传统的非功能性需求(如性能、可伸缩性或容错)进行设计至关重要。
  • *缓存层:*低延迟键值存储,快速响应重入查询。它必须实现经典的缓存机制(失效、基于特征散列的密钥计算、LRU 队列…)
  • *黄金推广者/去推广者:*随着 A/B 测试的进行,我们可能会达到这样一个点,其中一个真实实验实际上比当前的黄金模型更具性能,该组件任务是分析元数据,特别是特征存储中的基础事实数据,以建议用一个实验替换黄金模型。
  • *型号预热器:*当冷启动情况发生时,确保缓存和内存预热的组件(例如,新型号升级)
  • *解释器:*实现模型可解释性逻辑的组件(如锚点、CEM…)并为给定的请求返回它
  • *元数据存储:*该组件集中了与预测阶段相关的所有元数据(实时实验性能、预测数据统计…)

平台支持的一些用户旅程

这种架构可以表达几个旅程,我的目标不是提及所有旅程,但我想强调几个有趣的旅程:

在特征生成时

  • 合成一个复杂的要素并实时提供
  • 编写一个踢 LRO 的复杂特征,并在许多模型中一致使用
  • 在不影响转换和服务逻辑的情况下更改/更新特征信息生产者

训练时

  • 启动重新训练(分布式)作业,由训练集中包含的新功能触发
  • 基于数据(要素)依赖性的模型评估器
  • 为当前的 DNN 模型发现一种新的、更高性能的架构
  • 优化已部署模型的学习速度

在预测时间

  • 逐步推广新的黄金模式,将其覆盖范围扩大到所有人群
  • 查询预测及其黑盒解释

可管理性

  • 检查模型、特征、签名版本

可用于部署的技术

我们可以使用大量开源软件来构建一个包含上述所有组件的平台,但在考虑独立设计每个组件之前,我们可以用一种标准和统一的方式来解决非功能性需求,如可扩展性、安全性或可移植性,这不是很好吗?

幸运的是,我们可以依赖 kubernetes 作为部署组件的主要平台。下图显示了一份提案,其中包含开源产品/项目*的组件映射。

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

图 6 — ML 平台开源实例化

*FEAST 和 kubeflow 集成目前正在进行中

为了让事情变得更简单, kubeflow 已经以一种很好的方式打包了所有的组件,所以大部分的集成已经完成。

结论

甚至有人会认为,运行机器学习操作与传统操作有根本的不同,大多数软件工程原则实际上都成立,它们只是在不同的上下文中应用。在本文中,我们展示了一个逻辑高级架构,可以使用开源组件(如 kubeflow)轻松部署。

我在这里发布了一些关于这个主题的组件和示例笔记本

柏林 Airbnb 托管的可视化数据驱动研究

原文:https://towardsdatascience.com/a-visual-data-driven-look-at-airbnb-hosting-in-berlin-729eccd8bf9d?source=collection_archive---------44-----------------------

哪些社区最物有所值?有多少主机将 Airbnb 作为主要收入来源?我用数据通过可视化和预测技术来回答这些问题。

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

凯瑟琳·埃德格雷拍摄的照片

在最好的情况下,Airbnb 可以以合理的价格成为体验一座城市的绝佳方式。然而,正如经常出现的好事过多的情况一样,Airbnb 也可能对某些城市产生不利影响。为了应对因 Airbnb 的成功而导致的租金价格上涨,柏林市在 2018 年颁布了一项新法律,要求某些短期出租整个物业的主机必须获得许可。

利用 Airbnb 目前关于柏林房源和评论的数据——从 Airbnb 内部的获得——我决定自己更仔细地观察柏林的 Airbnb 景观。我想从商业的角度而不是客人的角度来调查,在新法律生效后,柏林实际上在经营什么样的房产和房东。此外,我自己在柏林断断续续住了 7 年,我也想看看使用 Airbnb 数据作为位置推荐工具的潜力,并看看结果如何与我自己的经验相吻合。关于这座城市最好、最便宜或最受欢迎的住宿地点,这些数据能告诉我们什么?

我决定专门关注这三个问题:

  1. 柏林有多少比例的 Airbnb 主机可能将主机服务作为主要收入来源(或者是业务)?
  2. 柏林各个社区的 Airbnb 价格有什么不同,哪些社区最划算?
  3. 我们能否预测一个列表的位置评级,以及哪些社区对这些评级有最大的影响?

由于这些问题不一定激发单一的、明确的答案,除了应用分类技术寻找答案之外,我决定选择使用 Plotly 和 follow 地图的交互式可视化。

柏林有多少比例的 Airbnb 主机可能将主机服务作为主要收入来源?

以我的经验来看,Airbnb 不仅用于柏林的短期旅游租赁,也用于长期合租,供租户搬走一段时间。有些房东只是在夏天有一个免费房间的人,而其他人已经决定购买多套公寓,以从托管中获得稳定的收入。我想知道这个崩溃到底是什么样子的。

我首先检查了柏林目前有共同主机的列表。特别是,我查看了有多少列表是来自各自主机的唯一的列表,以及来自同一主机的许多列表中的一个。

左侧显示的饼图显示了使用 Airbnb 只是为了出租房间或公寓的房东与使用 Airbnb 作为商业工具(即出租许多房间或公寓)的房东的房源百分比。我们看到超过 10% 的广告房源拥有至少 4 个房源的主机。

然而,当我们从主机总数的角度来看同样的细分时,如下图所示,拥有 3 个以上列表的主机的实际百分比仅为 1.63% 。柏林 Airbnb 上的大多数房东似乎只是把 Airbnb 作为出租自己房间或公寓的一种方式。

然而,1.63%的主机所拥有的大量列表(平均 7.5 个列表)反映在 10%的列表属于那一小部分主机的事实中。

这就引出了一个问题——我们如何区分那些只是偶尔出租房屋的房东和那些出租房屋做生意的房东?为了对选择什么样的阈值有一个概念,我们看一个主机的列表在一年中可用的平均天数,按主机有多少个列表细分。

从上图中可以看出,可用性的最大提升发生在拥有 3 个清单的主机和拥有 4 个清单的主机之间。对于只有一个房源的房东来说,一年中平均只有 49 天的空房率意味着这些房子很可能不是作为主要收入来源出租的。相比之下,那些拥有 4 个或更多房源的房东一年的平均可用时间超过 178 天(超过半年),这意味着所有者不可能在一年的大部分时间里住在这些房产中,而是可能将 Airbnb 作为主要收入来源的商业工具。

无法准确确定主机必须将其归入业务类别的列表数量的确切阈值,但从上述结果中,我们可以得出结论,拥有 4 个或更多列表的主机可能会将 Airbnb 作为主要收入来源或至少是副业。我们还可以得出这样的结论:柏林的绝大多数 ( > 90%)的主机都在把 Airbnb 作为一个产生第二收入来源的工具,这符合 2018 年制定的规定。

柏林各个社区的 Airbnb 价格有什么不同,哪些社区最划算?

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

使用叶子创建

上面的地图显示了柏林每个街区的 Airbnb 房源的平均价格(未填写的部分没有足够的数据)。显然,柏林市中心的平均价格略高,尤其是政府区 (Regierungsviertel) 以及亚历山大广场。

我们可能还想直接比较较大区域的社区价格。为了做到这一点,我们接下来看看每个地区的价格分布。

注意:只包括至少有一个评论的列表

上面的箱线图显示了柏林每个区的标价的中值、四分位数范围(值的第 25 至 75 个百分点)和异常值(以单个点的形式)。很明显,所有地区都倾向于 30 到 100 之间的较低值。似乎 T2 的 Mitte 和 T4 的 Friedrichshain-Kreuzberg 都拥有最昂贵的房产。米特也是住宿成本最高的地区,平均价格为每晚 83 美元,而赖尼克肯多夫是最便宜的,平均价格为每晚 46 美元。

那么,住在哪里呢?嗯,我们不仅要考虑价格。Airbnb 的评级系统对各种因素进行细分。除了对酒店的总体评级,数据集还包含对以下方面的评级:*位置、清洁度、准确性、沟通、价值和入住。*为了更好地了解城市不同地区的性价比,我们还想加入位置评分。下图在 y 轴上显示了每个地区的平均价格,而该地区的平均位置评级则由条形的颜色表示。

从图表中,我们或多或少可以看出哪些地区在价格价值方面是最优的。考虑到价格和价值,Friedrichshain-Kreuzberg、Charlottenburg-Wilmersdorf 和 Tempelhof-schneberg 是最理想的地方,因为它们的价格相对较低,但位置评级极高。

这些都是相当大的区域。我们可能还想更深入地了解哪些特定社区特别适合(或不适合)居住。为了做到这一点,我还将尝试预测位置评级,以了解各种社区/较小的地区和其他因素对评级的影响。

我们能否预测一个列表的位置评级,以及哪些社区对这些评级有最大的影响?

为了预测柏林的上市地点评级,我首先查看了这些评级是如何分布的。我发现收视率主要偏向高收视率,如下图所示。

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

结果显示,大约 70%的被评级房产的地理位置被评为 10/10,另外 30%的被评为低于 10。由于这些评级的性质,我选择简单地预测一处房产位置的评级是等于 10 还是小于 10。

通过建立一个旨在确定一个物业的位置是否值得 10/10 评级的分类器,我能够看到哪些基于位置的变量在这个预测中最有用。为了量化一个变量在预测位置评级中的重要性,我们看看模型中使用的系数,或效应大小。

注意:效果大小单位是标准化的,与原始单位无关

从上面的图中,我们可以看到,某些街区或区对位置评级有着显著的影响。特别是,我们可以做出一些有用的推论:

  • 位于 Prenzlauerberg Südwest(西南)或 Helmholtzplatz 的列表会导致明显更高的位置评级。相比之下,Osloer Straß、Parkviertel 和 central Wedding 的房源位置评分要低得多,这表明它可能真的不是最好的住宿地点。
  • 平房和别墅的列表与更好的评级相关联,这可能与它们位于城市中特别好的地段这一事实有关。
  • 从物业位置到最近的地铁站或火车站的距离与位置评级呈负相关,这意味着交通不便的房源在位置方面不太理想(如我们所料)。

外卖食品

在这篇文章中,我们利用现有的数据来了解柏林什么样的人在使用 Airbnb(企业与个人,自住物业与出租物业)。我们还研究了柏林的个别地区和较小的社区,比较了每个地区的房源价格,以及某些社区对预测房源位置评级的影响。

特别是,我们发现:

  1. 拥有 4 或更多房源的房东可能会将 Airbnb 托管视为一项业务,因为这些房源在一年的大半时间里都是可用的。拥有 4 个或更多列表的主机仅占数据中主机的 1.63%,但它们的列表占总列表的 10%以上。似乎有一些企业或主机使用 Airbnb 作为商业工具,但大多数只是在一年内短期出租他们的公寓/房间。
  2. 不出所料,最昂贵的房产位于更中心的位置,Mitte 提供最高的平均挂牌价格。Reinickendorf 和 Lichtenberg 是住宿最便宜的地区,中间价格都是每晚 40 美元,但就其地理位置而言,这两个地区的排名并不高。
  3. 数据集中许多基于位置的变量确实对一个列表的位置评级有显著影响。Prenzlauerberg Südwest 和 Helmholtzplatz 似乎是特别好的住宿地点(根据我自己的经验,我同意这一点),因为它们会导致良好的位置评级。相反,Osloer Straß和 central Wedding 可能不是最好的入住地点。

在这篇文章中,我们回顾了从柏林 Airbnb 数据中提取的一些有用的见解,这些见解使我们能够更好地了解托管人口统计以及该市各区和社区之间的差异。地理洞察可以用来提供关于在哪里住宿或购买物业用于租赁的建议,而主机分析可以证明有助于更深入地了解 Airbnb 的实际使用情况。

如果你想阅读更多关于我的分析或这篇文章的代码,可以点击这里的链接。

梯度下降法的直观解释(Momentum,AdaGrad,RMSProp,Adam)

原文:https://towardsdatascience.com/a-visual-explanation-of-gradient-descent-methods-momentum-adagrad-rmsprop-adam-f898b102325c?source=collection_archive---------3-----------------------

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

表面上 5 种梯度下降方法的动画:梯度下降(青色),动量(洋红色),AdaGrad(白色),RMSProp(绿色),Adam(蓝色)。左井是全局最小值;右井是局部最小值。

有无数的资源解释梯度下降,在这篇文章中,我想直观地向你展示这些方法是如何工作的。借助我建立的梯度下降可视化工具,希望我可以给你一些独特的见解,或者至少,许多 gif。

我假设基本熟悉梯度下降为什么以及如何用于机器学习(如果没有,我推荐这个由 3Blue1Brown 制作的视频)。我在这里的重点是比较和对比这些方法。如果你已经熟悉所有的方法,你可以滚动到底部观看几个有趣的“赛马”。

香草渐变下降

让我们快速复习一下。在机器学习的背景下,梯度下降的目标通常是最小化机器学习问题的损失函数。一个好的算法能够快速可靠地找到最小值(也就是说,它不会陷入局部最小值、鞍点或平坦区域,而是去寻找全局最小值)。

基本的梯度下降算法遵循梯度的相反方向指向较低区域的思想。所以它迭代地在梯度的相反方向上采取步骤。对于每个参数θ,它执行以下操作:

增量= -学习率梯度*

θ+=δ

Theta 是您想要优化的某个参数(例如,神经网络中神经元到神经元连接的权重,线性回归中某个特征的系数等)。在一个 ML 优化设置中可能有数千个这样的θ。 Delta 是算法中每次迭代后θ的变化量;希望随着每一次这样的改变,θ逐渐接近最佳值。

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

梯度下降算法的分步说明。

由于人类的感知仅限于三维,在我所有的可视化中,想象我们只有两个参数(或θs)要优化,它们由图中的 x 和 y 维表示。表面是损失函数。我们想找到曲面最低点的(x,y)组合。这个问题对我们来说微不足道,因为我们可以看到整个表面。但是球(下降算法)没有;它一次只能走一步,探索周围的环境,类似于在黑暗中只带着手电筒行走。

普通梯度下降是普通的,因为它只是在梯度上操作。下面的方法对渐变做了一些额外的处理,这样会更快更好。

动力

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

decay_rate = 1.0 时的动量下降(无衰减)。

动量梯度下降算法(或简称动量算法)借用了物理学的思想。想象在一个无摩擦的碗中滚下一个球。而不是停在底部,它积累的动量推动它前进,球不停地来回滚动。

我们可以将动量的概念应用到我们的普通梯度下降算法中。在每一步中,除了常规渐变之外,它还增加了前一步的运动。在数学上,它通常表示为:

*delta =-learning _ rate * gradient+*previous _ delta * decay _ rate(eq。1)

θ+=δ(等式。2)

我发现,如果我稍微修改一下这个等式,并跟踪梯度的(衰减)累积和,会更直观。这也将使我们稍后介绍 Adam 算法时事情变得更容易。

梯度总和=梯度+先前梯度总和衰减率*(等式。3)

delta =-学习率梯度总和*(等式。4)

θ+=δ(等式。5)

(我所做的是分解出-learning_rate。要看到数学上的等价性,你可以在 eq 中用-learning_rate * sum_of_gradient 代替 delta。1 获取情商。3.)

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

动量下降的逐步说明。在 app 中观看现场动画。在这篇文章的其余部分,我在可视化中草率地使用了渐变 x 和渐变 y;现实中因为是 gradient * descent,所以实际上是梯度的负数。*

让我们考虑两个极端情况,以便更好地理解这个衰减率参数。如果衰减率为 0,那么它与(香草)梯度下降完全相同。如果衰减率是 1(并且假设学习率合理地小),那么它就像我们在开始提到的无摩擦碗类比一样无休止地来回摇摆;你不会想那样的。通常,衰减率选择在 0.8-0.9 左右,这就像一个表面有一点摩擦,所以它最终会减速并停止。

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

具有全局最小值(左井)和局部最小值(右井)的表面上的动量(洋红色)与梯度下降(青色)

那么,动量法在哪些方面优于香草梯度下降法?在左侧的对比中,您可以看到两个优势:

  1. 动量只是移动得更快(因为它积累了所有的动量)
  2. 动量有机会逃离局部最小值(因为动量可能会将其推出局部最小值)。同样,正如我们将在后面看到的,它也能更好地通过高原地区。

阿达格拉德

不是像动量一样跟踪梯度的总和,而是 Ada 感受性 Grad ient 算法,或简称为 AdaGrad,跟踪梯度平方的总和,并使用它来适应不同方向的梯度。这些方程通常用张量表示。为了简化这里的语言,我将避免使用张量。对于每个维度:

sum _ of _ gradient _ squared = previous _ sum _ of _ gradient _ squared+梯度

δ=-learning _ rate * gradient***/sqrt(sum _ of _ gradient _ squared)***

θ+=δ

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

阿达格拉德血统的一步一步的插图。在 app 中观看现场动画。

在 ML 优化中,有些特征非常稀疏。稀疏特征的平均梯度通常很小,因此这些特征的训练速度要慢得多。解决这个问题的一个方法是为每个特征设置不同的学习速率,但是这很快就会变得混乱。

AdaGrad 使用这种思想来解决这个问题:您已经更新的特性越多,将来更新的就越少,这样就给了其他特性(例如稀疏特性)赶上来的机会。用视觉上的话来说,你更新了这个特征多少,就是说你在这个维度上移动了多少,这个概念是用梯度平方的累积和来捕捉的。请注意,在上面的逐步网格图中,如果没有重缩放调整(1b),球将主要垂直向下移动;通过调节(1d),它会沿对角线移动。

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

有鞍点地形上的阿达格拉德(白色)与梯度下降(青色)。AdaGrad 的学习率被设置为高于梯度下降的学习率,但是不管学习率如何,AdaGrad 的路径更直这一点在很大程度上保持不变。

这个特性允许 AdaGrad(以及其他类似的基于梯度平方的方法,如 RMSProp 和 Adam)更好地避开鞍点。阿达格拉德将走一条直路,而梯度下降(或相关的,动量)采取的方法是“让我先滑下陡坡,然后也许再担心更慢的方向”。有时,普通梯度下降可能会在两个方向的梯度都为 0 的鞍点处停止,并在那里完全满足。

RMSProp

然而,AdaGrad 的问题是它慢得令人难以置信。这是因为的梯度平方和只会增长而不会收缩。RMSProp(用于RootMeanSquarePropagation)通过添加一个衰减因子来解决这个问题。

sum _ of _ gradient _ squared = previous _ sum _ of _ gradient _ squared**** decay _ rate****+渐变*****(1-decay _ rate)***

delta =-learning _ rate * gradient/sqrt(sum _ of _ gradient _ squared)

θ+=δ

更准确地说,梯度平方的和实际上是衰减的梯度平方的和。衰变率表明只有最近的梯度才重要,而很久以前的梯度基本上被遗忘了。顺便提一下,“衰变率”这个术语有点用词不当。与我们在动量中看到的衰变率不同,除了衰变,这里的衰变率还有一个标度效应:它将整项按(1 - decay_rate)的因子按比例缩小。换句话说,如果 decay_rate 设置为 0.99,除了衰减之外,梯度平方之和将是 sqrt(1 - 0.99) = 0.1,即 AdaGrad 的 sqrt(1-0.99)= 0.1,因此对于相同的学习速率,步长大约大 10 倍。

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

RMSProp(绿色)vs AdaGrad(白色)。第一次运行只显示球;第二次运行还显示了由正方形表示的梯度平方和。

为了查看衰减的效果,在这个头对头的比较中,AdaGrad white)最初跟上 RMSProp (green),正如预期的那样,调整了学习率和衰减率。但是阿达格拉德的梯度平方和积累得如此之快,以至于它们很快就变得巨大无比(动画中方块的大小证明了这一点)。他们付出了沉重的代价,最终阿达格拉德几乎停止移动。另一方面,由于衰减率,RMSProp 一直将方块保持在可管理的大小之下。这使得 RMSProp 比 AdaGrad 更快。

圣经》和《古兰经》传统中)亚当(人类第一人的名字

最后但同样重要的是,Adam(Adam 的缩写)充分利用了动量和 RMSProp 的优点。根据经验,Adam 工作得很好,因此近年来,它通常是深度学习问题的首选。

让我们来看看它是如何工作的:

*sum _ of _ gradient = previous _ sum _ of _ gradient * beta 1+gradient (1-beta 1)【动量】

*sum _ of _ gradient _ squared = previous _ sum _ of _ gradient _ squared * beta 2+gradient (1-beta 2)【rms prop】

delta =-学习率梯度总和/ sqrt(梯度平方总和)*

θ+=δ

β1 是一阶矩的衰减率,梯度和(也称为动量),通常设置为 0.9。β2 是二阶矩的衰减率,梯度平方和,通常设置为 0.999。

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

亚当后裔的一步一步的插图。在 app 中观看现场动画。

Adam 从动量获得速度,从 RMSProp 获得适应不同方向梯度的能力。两者的结合使其功能强大。

结束语

现在我们已经讨论了所有的方法,我们来看几个我们到目前为止讨论过的所有下降方法的比赛!(不可避免地会对参数进行挑选。尝到甜头的最好方法就是自己在身边玩。)

在这个地形中,有两座小山挡住了通往全局最小值的路。亚当是唯一一个能够找到全局最小值的人。无论以哪种方式调整参数,至少从这个起始位置开始,其他方法都无法达到这个位置。这意味着单独的动量或自适应梯度都不能做到这一点。这实际上是两者的结合:首先,动量使亚当超越了所有其他球停止的局部最小值;然后,梯度平方和的调整将它拉向侧面,因为这是探索较少的方向,导致它的最终胜利。

这是另一场比赛。在这种地形中,全局最小值周围有一个平坦区域(高原)。通过一些参数调整,Momentum 和 Adam(由于其动量分量)可以到达中心,而其他方法则不能。

综上所述,梯度下降是一类旨在通过遵循梯度来寻找函数上的极小点的算法。普通梯度下降只是跟随梯度(按学习率缩放)。改进梯度下降的两个常用工具是梯度之和(一阶矩)和梯度平方之和(二阶矩)。动量法使用具有衰减率的一阶矩来获得速度。AdaGrad 使用无衰减的二阶矩来处理稀疏特征。RMSProp 使用具有衰减率的二阶矩从 AdaGrad 加速。Adam 同时使用一阶矩和二阶矩,通常是最佳选择。还有其他一些梯度下降算法,如内斯特罗夫加速梯度,阿达德尔塔等。,不在本文讨论范围之内。

最后,我将留给你们这个没有衰减的动量下降。它的路径组成了一个有趣的图案。我看不出它有什么实际用途,但在这里提出来只是为了好玩。【编辑:关于没有实际用途我收回我的话。在 https://en.wikipedia.org/wiki/Lissajous_curve 阅读更多关于这条曲线的信息。]

玩玩这个可视化工具,它被用来生成这篇文章中所有的可视化,看看你会发现什么!

参考文献及相关链接:

[1]http://www . cs . Toronto . edu/~ tij men/CSC 321/slides/lecture _ slides _ le C6 . pdf

https://ruder.io/optimizing-gradient-descent

[3]https://bl . ocks . org/EmilienDupont/AAF 429 be 5705 b 219 aaaf 8d 691 e 27 ca 87

多臂强盗实验的可视化探索

原文:https://towardsdatascience.com/a-visual-exploration-of-multi-armed-bandit-experiments-278f1f15c4f1?source=collection_archive---------39-----------------------

或者—“鱼与熊掌,不可兼得”

在营销数据科学部门工作有一个不变的事实:在实验和开发之间做出选择从来都不容易。当你想推出限时优惠时,尤其如此,因为你事先对不同版本的优惠效果知之甚少。

如果有时间,您可以运行一个多变量测试(A/B/C/…测试)来确定哪一个是最好的版本,但是到那时,从该知识中获益可能已经太晚了。

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

一个多臂土匪(原谅我改编自这里

有没有一种方法,我们可以创建一个报价的多个版本,但随着报价的运行,更倾向于表现最好的版本,向越来越少的人显示表现较差的版本?是啊!

进入多臂土匪(见上图)。Multi-Armed Bandit 方法的美妙之处在于,无论您有多长时间来运行测试,您都可以确保您正在做出长期的最佳决策,同时尽可能快地将表现不佳的变体的影响最小化。

我 magine 我们想运行一个在线报价,我们的报价有 5 种变化,如下所示。每一个都有一个内在转换率——看到优惠后继续购买的客户比例——但实际上我们不会提前知道这些转换率(如果我们知道,我们只会直接运行表现最好的一个!).

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

我们认为我们的广告有 5 种变体,每一种都有内在的,但未知的转换率。

这里设置的传统 A/B(/C/D/E)测试会在实验期间将我们网站的访问者随机分配到其中一个变量中。我们可以像这样想象这些随机分配,其中每个破折号是分配给该变量的访问者。我们可以看到,在整个测试过程中,它们都是随机分配的。

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

每个访问者被随机分配到一个变体

随着每个变量中访问者数量的增加,我们可以更好地了解该变量的潜在转换率(因为样本量的增加降低了总体均值估计的标准误差)。我们将在下面看到这个。

让我们暂时关注一个单一的变体。每个访问该网站的人都可以选择购买或不购买。访问的人越多,我们的样本量就越大,我们对该变量的转化率的估计就越好,这使得最终的概率密度函数在我们的估计值周围变得更窄。

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

随着我们对人口取样越多,我们对人口转换率的估计就越准确。

上图中,我们使用 beta 分布来估计购买和不购买的人口转换。

B 对多臂土匪的 ack。随着我们继续向访问者提供我们的服务变体,我们开始得到哪个变体表现更好的估计。我们可以用这个估计来调整我们的游客变量分配。有很多方法可以做到这一点,下面我将探讨两种。我们想要得到一个在概念上与此类似的分配:

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

多臂土匪和多变量测试之间分配差异的简化示例。

请注意,在多臂强盗的设置中,大部分的游客被分配到了表现最好的红色变种。这正是我们的目标。

ε-贪婪

贪婪分配背后的想法是,最好的变体应该得到所有的访问者。等一下,如果我们开始给所有的访问者分配一个变体,我们就不再得到关于其他变体的任何信息,如果我们过早地开始给每个人分配一个次优变体会怎么样?

这就是ε(ε)的由来。一小部分时间,ε,我们仍然随机分配访客,只是为了检查我们没有出错。大多数情况下,1-ε,我们将访问者分配到当前表现最好的变体。

在每个新访客之后,计算每个变体的当前估计转化率,如果找到更好的变体,将开始分配大多数访客,直到找到一个新的最佳变体。

回到我们的 5 个变量,我们可以绘制我们的分配(如我们之前所做的),以及我们的累积分配(占总数的百分比)。下面我们看到,在我们的贪婪分配发现红色变体是最好的之前,需要大约 50 个访问者,但是在提供结束时,大约 80%的访问者已经被分配到那个变体。这将给我们带来大约 28%的转换率,而不是我们在整个过程中随机分配所能达到的 16%(这些是作为不同转换率的加权平均值计算的)。这将比我们的报价增加+75%的销售额!

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

ε-贪婪地将访问者分配给变体(ε = 5%)。分配可能会被“卡住”,就像这里前面所做的那样。

值得注意的是,贪婪分配可能会在一段时间内“卡住”分配给错误的变体,就像这里早期的橙色变体一样,直到ε随机分配为红色变体提供了足够的关于其他变体的信息。我解决这个问题的一个方法是从一个大的ε值开始,这样在开始时有更多的探索,随着时间的推移减少到 5%,以便利用更好的信息。如果你对此感兴趣,我在下面链接了我的分析。

与上面类似,当我们继续分配访问者时,我们可以通过绘制每个分配的转换率的估计来可视化分配的进展。每一个概率分布(在左边)只有在另一个访问者加入到那个变量中时才会得到改善。提醒各位访客:

  • 95%的时间它们将被分配给具有当前最高样本均值(或“当前最佳猜测”)的变量。
  • 5%的时间它们会被随机分配给一个变量。

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

前 500 个访问者的分配,以及我们对每个变体的转换率的估计随时间的分布。(每个变体有两个条形,实线表示购买的访问者,阴影表示不购买的访问者。)

需要注意的是,当使用ε-greedy 进行分配时,我们只关心样本均值,而不关心分布。我们很快会看到一个替代方案,它也明确地使用了分布范围。

鉴于贪婪地分配也有不好的一面,我们有没有办法完全避免它?而不是根据分配我们对转换率的估计我们对每个估计的置信水平?是啊!其中一种方法,汤普森取样,是接下来要做的。

汤普森取样

利用前面的图来帮助解释,我们能不能想出一种抽样方法,既考虑到每个变量的概率分布的平均值又考虑到我们在其中的不确定性

一种这样的方法被称为汤普森采样。它的工作原理是根据我们迄今为止对它们的了解来计算每个变量的β分布(这正是上面左图所示的内容),但不是取每个分布的平均值来决定下一个分配(如在ε-greedy 中),我们从每个分布中随机抽取来这样做。

这样,如果我们有很少的访问者被分配到某个变体,那么 beta 分布将会很宽,有机会从该分布中随机抽取一个高值,将会有更多的访问者被分配到该变体,随着时间的推移,我们将会增加我们的信心(并使 beta 分布变得更窄)。

类似地,如果我们有许多访问者被分配到某个变体,那么 beta 分布将会很窄,我们有信心从这个变体中得到高或低的转化率,我们知道是否过多或过少地分配访问者到这个分布中。

这样,我们完全避免了对贪婪算法的需求,贪婪算法可能会陷入次优变量!

和以前一样,我将展示汤普森采样的多臂土匪方法的分配和分布。

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

使用 Thompson 抽样,根据我们有信心的位置以及平均值最高的位置进行分配。

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

与ε-贪婪分配不同,我们对红色变体优于其他变体有更大的信心。

有趣的是,在这个模拟中,ε-greedy 在分配给正确变量的访问者数量方面优于 Thompson 采样(85%比 72%),但是我们应该记住两个因素:

  • 在更长的时间范围内,Thompson 采样往往会表现得更好,因为它不会继续在较差的变量上“浪费”5%(或ε)。
  • Thompson 采样将在多个实验中获得更一致的结果,因为它不会“卡住”分配给次优变量。

直观显示第二点的一种方法是绘制有效转换率(我们在上面介绍的变量之间的加权平均转换率)与最佳情况下的转换率(表现最佳的变量的转换率)的比值随时间的变化图。如果我们只是把每个人都分配到红色变量,那么这个值就是 1,对于随机分配,这个值就是 0.53(在这个特定的例子中)。

我们现在为 Thompson 和ε-greedy 的许多模拟绘制这个图。

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

5 个变量的ε贪婪和 Thompson 采样分配各 100 次模拟

我们可以看到,通过这组变量,ε-greedy 在大多数情况下确实比 Thompson 更快地趋向于高有效转换率*,但有时会陷入较低的有效转换率。另一方面,Thompson 采样分配具有更加一致的结果(所有模拟线遵循相似的路径)。如果变量具有彼此更接近的内在转换率,则ε-greedy 可能会在更高的时间比例上停留在次优变量上,而 Thompson 采样不会与此相冲突。*

上面的图表与一个叫做后悔的概念密切相关。这是你因为没有从一开始就把所有访客分配到最佳版本而遭受的损失,也是你的产出指标的单位(例如,“我失去了 50 个销售,因为我没有从一开始就运行红色版本”,我的遗憾将是 50)。上面我选择显示有效转换率,因为当你运行越来越长的测试时,这个值会缩放到 1,而不是像后悔那样继续增加。

在总结中,我们介绍了多支武装匪徒的概念,我们将优先级从探索(如在传统的 A/B 或多变量测试中)转移到*开发。*我们已经直观地探索了两种可能的单克隆抗体分配方法,ε-greedy 和 Thompson 采样。我们还看到,Thompson Sampling 使用我们对样本均值的最佳估计(对于我们感兴趣的度量)和我们对该估计的信心,来将访问者分配到不同的变量。通过这种方式,我们可以有信心在整个营销活动中获得良好的有效转化率。

与传统的多变量测试相比,缺点是我们失去了表现较差的变量的统计显著性,因为我们故意减少了分配给这些变量的访问者数量,从而减少了测试期间的样本量。

所以,下次你不得不开展一个限时活动,或者一个产品改变,重点是商业结果,而不是统计意义,为什么不考虑一个多臂强盗的方法呢?

[## Paul Stubley -数据和决策科学家-在温哥华寻找下一个机会

我是一名经验丰富的数据科学家,在个人工作和管理团队方面都有卓有成效的工作经历

www.linkedin.com](https://www.linkedin.com/in/paul-stubley)

如果你想联系我,你可以在 LinkedIn 上联系我。如果你想看代码和分析(包括每个发行版背后的派生),可以在GitHub上查看。动画是用 Matplotlib 和 imagemagick 制作的。

决策树的可视化指南

原文:https://towardsdatascience.com/a-visual-guide-to-decision-trees-26606e456cbe?source=collection_archive---------34-----------------------

这是一个直观的可视化指南,介绍了用于预测美国各州投票模式的强大 ML 算法。

你有没有想过为什么某些州倾向于投票给共和党,而另一些州倾向于投票给民主党?有没有办法预测一个州在任何一年的投票结果?假设我们想要根据我们观察到的一些变量来预测一个状态是**【红色】还是【蓝色】**。为此,我们将使用决策树。

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

红蓝图,2016;图片来自维基百科

决策树是一种分类和回归监督学习模型,用于使用来自几个输入变量(x)的信息来预测目标变量(Y)的值。

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

作者图片

顾名思义,该模型在视觉上表现为一个倒置的树状结构,随着树的增长,数据集被分成越来越小的子集。每个内部节点或决策节点都包含一个需要回答的关于特定 X 变量的简单“对或错”问题。在此基础上,树分裂成分支——一个分支代表真,另一个分支代表假。每个分支的末端都是另一个问题。这个递归过程继续进行,随着每个决策的做出,树变得越来越深,越来越宽,直到它在做出预测的叶节点处结束。

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

作者图片

让我们举一个数据集的例子。我们有 Y 变量——一个州是红色还是蓝色,我们有 3 个 X 变量:教育、收入*** 和种族多样性*** 。现在,让我们尝试构建一个决策树来预测一个州的政治倾向,即基于这 3 个变量,它是红色还是蓝色。

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

作者图片

您可能想知道,当变量本质上是连续的或数字的,而不是简单的布尔值(真或假)时,决策树是如何进行拆分的。答案很简单。在引擎盖下,我们创建了多个变量来表示在不同的阈值下分割连续变量。这些划分通常是在该变量的不同十分位数或四分位数处进行的。在我们的例子中,让我们只使用每个变量的中值作为单个阈值。如果值小于中值,我们将把这些连续变量转换成二进制变量或布尔变量,如果值大于中值,我们将把值设置为假,将值设置为真。这些现在是布尔特征。

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

作者提供的图片

现在让我们开始创建决策树。为了创建第一个决策节点,我们必须选择一个变量进行分割。决策树使用一个叫做信息增益的标准来挑选合适的变量。信息增益是衡量我们在查看 x 后对 Y 了解多少的指标。例如,如果我们随机预测一个没有其他信息的州的政治倾向,则该州为红色的概率为。然而,如果我们知道关于那个状态的一些其他信息,我们可以更新我们关于那个概率的信念。

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

作者图片

让我们来看看,当我们在 3 个变量上一个接一个地分割树时,会发生什么。

当我们在教育上分裂时,我们看到真正的分支包含教育水平高于中位数的州,主要是蓝色州和一个红色州。错误的分支,或教育水平低于中间水平的州,大部分是红色州,少数是蓝色州。

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

作者图片

当我们在种族多样性上分裂时,我们看到真正的分支包含了多样性高于中间值的州,大部分是蓝色的州。假分支,或者多样性低于中间值的州,有几乎相等数量的红州和蓝州。这意味着知道一个州不是多元化的并不意味着有政治倾向。

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

作者图片

最后,让我们看看当我们在收入上分裂时会发生什么。这里,真正的分支包含收入高于中间值的州,大部分是蓝色州。错误的分支,或者收入低于中间值的州,有几乎相等数量的红州和蓝州。这意味着知道一个州的收入低于中值也不能有意义地表明政治倾向。

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

作者图片

在比较了要分割的每个可能的变量之后,决策树挑选出导致最纯粹分支的变量。在我们的例子中,教育上的分裂导致最纯的分支,因为真实分支只包含 1 个红色状态,而虚假分支包含的蓝色状态是红色状态的一半。从教育中获得的信息很多。种族多样性分裂将是最糟糕的选择。虽然真分支包含大部分蓝色状态,但假分支基本上是红蓝各半。知道国家缺乏多样性几乎不会给模型增加新的信息。从种族多样性中获得的信息非常少。

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

作者图片

在对教育进行了第一次拆分之后,我们现在来看看两个结果分支,并再次看看我们可以拆分哪些变量来进一步净化我们的分支。这样继续下去,直到我们到达纯分支或树的最大深度。我们最终的树在下面,它有大约 80%的准确率。考虑到我们只有 3 个变量,这太棒了。

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

作者图片

你可能会问:“为什么我们不简单地分割每个特征,并使树尽可能长,以得到一个完全符合数据的模型?”

这不是一个坏主意如果你有一个数据集是你正在研究的人群的超级代表。然而,问题是您的模型可能会开始进行如此多的分割,以至于它会学习特定数据集的古怪之处,并且无法拟合附加数据或做出可靠的预测。这是一个如此常见的问题,它有一个名字:过度拟合。过度拟合是当模型容量过大时遇到的问题。因此,一般来说,我们通过限制分裂的数量来减少这些树的容量,即限制树的深度。

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

作者图片

决策树是目前世界上最常见的模型。它们简单高效的本质,以及它们组合成非常强大的模型的能力,如随机森林梯度增强树,使它们成为许多开发人员的最爱。敬请期待未来了解这些。

要自己实现这个模型,请查看这个链接并使用左边的播放按钮运行每个单元格!

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

*各州家庭收入中位数(人口普查数据 )
** %本科或以上学历(2013-2017 年美国社区调查)

随机森林视觉指南

原文:https://towardsdatascience.com/a-visual-guide-to-random-forests-b3965f453135?source=collection_archive---------45-----------------------

直观的视觉指南和视频解释了强大的组装方法

机器学习中最明显的问题之一是“更多的模型比更少的模型更好吗?”回答这个问题的科学叫做模型组装。模型集成要求如何构建模型的集合,以提高测试准确性,同时降低与存储、训练和从多个模型中获取推理相关的成本。

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

我们将探索一个流行的应用于决策树的集合方法:随机森林。

为了说明这一点,让我们举一个例子。想象一下,根据野火的大小、位置和日期,我们正试图预测是什么导致了这场野火。

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

随机森林模型的基本构建模块是决策树,所以如果你想了解它们是如何工作的,我建议看看我在之前的帖子。作为快速复习,决策树通过递归地询问简单的真或假问题来执行分类或回归任务,这些问题将数据分成最纯粹的可能子组。

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

现在回到随机森林。在这种集成方法中,我们训练一组决策树(因此得名“森林”),然后在不同的树中进行投票。一棵树一票。

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

在分类的情况下,每棵树吐出一个类别预测,然后拥有最多投票的类别成为随机森林的输出。

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

在回归的情况下,每棵树的预测的简单平均值成为随机森林的输出。

随机森林背后的关键思想是群体中有智慧。从一大群模型中获得的洞察力可能比单独从任何一个模型中获得的预测更准确。

简单吧?当然,但是为什么这个有用呢?如果我们所有的模型都学习完全相同的东西,并投票给同一个答案会怎么样?这难道不等同于只有一个模型做出预测吗?

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

是的,但是有一个办法可以解决。

但是首先,我们需要定义一个词来帮助解释:不相关。我们需要我们的决策树彼此不同。我们希望他们不同意分裂是什么和预测是什么。不相关对随机森林很重要。一大群不相关的树在一个系综中一起工作将胜过任何一个组成树。换句话说,森林不会受到个别树木错误的影响。

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

有几种不同的方法来确保我们的树是不相关的:

第一种方法叫做**“自举”。Bootstrapping 是通过采样从我们的训练集中创建更小的数据集。现在,使用普通决策树,我们将整个训练集输入到树中,并允许它生成预测。然而,通过自举,我们允许每棵树随机采样训练数据*和替换,*产生不同的树。当我们允许替换时,一些观察结果可能会在样本中重复。通常,bootstrap 的样本大小与原始数据集的大小相同,但为了提高计算效率,可以对数据集的子集进行采样。使用自举来创建不相关的模型,然后聚合它们的结果被称为自举聚合**,或简称为 bagging

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

在我们的树中引入变化的第二种方法是通过改变每棵树可以分裂的特征。这种方法叫做**特征随机性。**请记住,使用基本决策树,当需要在一个节点上分割数据时,该树会考虑每一个可能的特征,并选择一个导致最纯粹子群的特征。然而,对于随机森林,我们限制了每棵树可以考虑分割的特征的数量。一些库在分割级别而不是树级别随机化特征。如果我们假设树是决策树桩,这并不重要,这意味着只有 1 个分裂,或者最大深度= 1。在这两种情况下,目标都是限制可能特征的数量,以便去相关各个树。

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

因为单个树非常简单,并且它们只在训练数据和特征集的子集上被训练,所以训练时间非常短,所以我们可以训练成千上万的树。随机森林广泛应用于学术界和工业界。现在您已经理解了这个概念,您几乎已经准备好实现一个随机森林模型来用于您自己的项目了!请继续关注随机森林编码教程和另一个集合方法的新帖子——梯度增强树!

看看下面的视频,看看你在行动中学到的一切!

https://youtu.be/cIbj0WuK41w

标准差的直观解释

原文:https://towardsdatascience.com/a-visual-interpretation-of-the-standard-deviation-30f4676c291c?source=collection_archive---------4-----------------------

对于那些被告知“只要记住公式”或者不知道为什么要关心的人来说,这是一个可视化的指南。

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

统计学中最核心的概念之一是标准差的概念及其与所有其他统计量(如方差和均值)的关系。入门课程的学生被告知“只需记住公式”,但是,相信我,这不是解释一个概念的最佳方式。在这篇文章中,我将尝试对标准差提供一个直观的解释。

假设你有一个成绩列表,在这种情况下,这将是我们的现实世界的测量。我们希望将这些测量中的信息“压缩”成少数几个量,我们以后可以用它们来比较,比如说,不同年级或不同年份的成绩。由于我们有限的认知能力,我们不想一个一个地检查成绩,找出哪个班级的平均分数更高。你需要总结这些数字。这就是为什么我们有描述性统计

有两种方法可以总结这些数字:量化它们的相似或不同之处。量化它们之间相似性的方法被正式称为“集中趋势的度量”。这些度量包括平均值、中间值和众数。量化它们之间差异的方法被称为“可变性测量”,包括方差和标准差。标准差应该告诉我们一组数字相对于平均值是如何不同的

让我们举一个实际的例子。假设您收集了学生成绩的数据(为了简单起见,我们假设这些成绩是总体数据):

2,8,9,3,2,7,1,6

让我们首先在一个简单的散点图中绘制这些数字

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

现在我们有了散点图中的所有数字,计算变化的第一步是找到这些数字的中心:平均值。

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

视觉上,我们可以画一条线来表示平均成绩。

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

现在我们有了一条平均值线,下一步是计算每个点和平均值之间的距离,然后平方这个距离。请记住,我们的目标是计算这些数字相对于平均值的变化。我们可以简单地用数学或视觉来做这件事

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

正如你在这里看到的,“平方”实际上就是画一个正方形。这里有两点:我们不能只取所有差异的总和。由于一些差异是正的,一些是负的,求和将使负数抵消正数,最终以零结束(这没有任何意义)。为了解决这个问题,我们采用差异的平方(我将在最后解释为什么我们采用差异的平方,而不是其他任何度量,如绝对值)。

现在,我们计算这些平方差的和(或平方和):

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

通过计算平方和,我们有效地计算了这些等级的总可变性(即差异)。理解可变性与差异的关系是理解许多统计估计和推断测试的关键。67.5 的意思是,如果我们把所有这些方块堆成一个巨型方块,它的面积将等于 67.5 点 2,这里的点是指等级的单位。任何一组测量值的总可变性是一个正方形的面积。

方差

既然我们已经得到了总的可变性或大方块的面积,我们真正想要的是平均可变性。为了求平均值,我们只需用总面积除以平方数。

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

出于最实际的目的,您希望除以𝑁−1,而不是𝑁,因为您将尝试从样本而不是总体来估计该值。然而,这里我们假设我们有总人口。重点仍然是你想计算这些小方块的均方差。我们刚刚计算的是方差,这是平均可变性,或均方差。

标准偏差

为什么我们不能继续用方差作为分数可变性的指标呢?方差的唯一问题是我们不能将其与原始等级进行比较,因为方差是一个“平方”值,或者换句话说,它是一个面积而不是长度。它的单位是点数 2,这与我们的原始分数单位(点数)不同。那么我们应该怎么做才能摆脱广场呢?取平方根!

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

最后,我们现在有了标准差:方差的平方根,是 2.91 点

这是标准差的核心思想。这种基本的直觉应该更容易理解为什么在处理 z 分数、正态分布、标准误差和方差分析时使用标准差的单位是有意义的。此外,如果您只是用标准偏差公式中的拟合(预测)线 Y 替换平均值,那么您将处理基本的回归项,如、均方误差(如果您没有使用平方根)、、均方误差(使用平方根,但现在是相对于拟合线)。此外,相关和回归公式都可以用不同量的平方和(或总变异面积)来表示。分割平方和是理解广义线性模型机器学习中的偏差-方差权衡的关键概念。

简而言之:标准差无处不在。

绝对值的问题

你可能会想,为什么我们要求差的平方,而不是只取绝对值。没有什么真的阻止你使用差异的平均绝对值,而不是均方差。平均绝对值将给予所有差异相同的确切权重,而对差异求平方将给予离平均值较远的数字更大的权重。这可能是你想做的事情。然而,大多数数学理论都利用了平方差(原因超出了本文的范围,比如可微性)。

不过我还是用一个比较容易理解的反例来回答这个问题(来源)。假设我们有两组平均值相同的分数,𝑥1 和𝑥2:

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

通过查看这些分数,你可以很容易地发现𝑥1 比𝑥2.有更低的可变性和数字分布让我们继续计算两者的平均绝对差(知道它们的平均值是 6):

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

哎呀!那应该很糟糕。两组给出了完全相同的可变性值,尽管我们希望看到𝑥1 的值比𝑥2 稍低,因为数字的可变性更小。然而,如果我们使用平方差,我们会得到:

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

由于求差的平方,这显然给了我们所希望的:当数字越分散,标准差就越大。

如最初出现在 我的博客

二值图像处理的可视化介绍(第一部分)

原文:https://towardsdatascience.com/a-visual-introduction-to-binary-image-processing-part-1-d2fba9f102a4?source=collection_archive---------19-----------------------

通过简单直观的可视化理解图像处理的基本方面

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

伊恩·帕克在 Unsplash 上拍摄的照片

目录:

  • 什么是二进制图像?
  • 阈值处理:从灰度图像到二值图像
  • 邻居
  • 连通分量算法
  • 二值图像
  • 中轴
  • 距离变换

什么是二进制图像?

二进制图像是其像素只有两个可能的亮度值的图像。在数字上,这两个值对于黑色的和白色的通常是 0,或者是 1 或者是 255。

二进制图像在图像处理领域特别有用的主要原因是因为它们允许容易地将对象从背景中分离出来。分割过程允许将每个像素标记为“背景”或“对象”,并分配相应的黑白颜色。

阈值处理—如何生成二值图像

通过遵循信息提取过程,从灰度图像获得二值图像。阈值处理是这个阶段使用的主要技术。

阈值处理的主要目标是从背景中提取前景

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

例如,这是一个二进制图像;)

第一步是绘制灰度图像强度的直方图**。选择阈值强度。低于该阈值的像素被标记为’白色’1 和高于该阈值的像素被标记为黑色0 。**

在最好的情况下,通过找到两个最高峰值之间的局部最小值,将容易地识别出区分黑色和白色的阈值。但情况并非总是如此…

下面的 gif 显示了改变阈值(红色箭头)到直方图的不同位置如何改变生成的二进制图像。

这是一个非常基本的表示,但我个人认为它足以描述阈值处理过程以及在正确位置设置阈值的重要性。

邻居

在现阶段,引入邻居的概念可能是有益的。一个像素可以有 4 或 8 个邻居。我们称直接邻居为我们感兴趣的像素共享一条边的邻居。

这个定义听起来可能很明显,但是在算法运行和标记像素值的方式上产生了巨大的差异**。**

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

例如,连通分量标记算法可以利用 4 或 8 个邻居,产生完全不同的结果!以下示例使用了 4 个邻居。

连接组件标签

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

作者

一旦我们成功地从前景中提取出背景,下一个合乎逻辑的步骤就是计算在我们的二值图像中可以找到的“物体”的数量。

例如,在我们左边的图像中,有 5 个对象。一个 4 岁的孩子可以回答这个问题。电脑是怎么做到的?

答案是连通分量标记技术。

第一步:

用唯一的整数标记每个白色像素。我们从顶行到底行系统地对像素进行编号,沿着列增加整数值。

作者

第二步:

现在,我们遍历每个像素。在每次迭代中,我们称当前像素为*【I】。我们看一下我们的‘I’像素的 4 个直接邻居。如果邻居的指定整数值(在步骤 1 中)小于‘I’,的当前值,那么‘I’*将取最小邻居的整数值。例如,这就是第三行中像素‘5’和‘9’的情况。或者“17”值像素的群集可能是更好的例子。

**这个步骤需要执行两次。 是的,两次。向后传递确保所有像素都被分配了可能的最小值。这将是连接成分标记技术的最后一步的基础。

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

最后一步(简单的一步;)

步骤 2 的结果给出了当像素与作为其直接邻居的较小值像素共享一条边时具有相同整数值的像素。

每个具有唯一值的像素聚类对应于我们的二进制图像中的一个“对象”。

因此,最后一步只是通过增加整数值来重新标记这些对象。这个图像有 9 个对象。 :一个四岁的孩子可能回答不出这个问题。

二值图像时刻

在本节中,我们将介绍:

  • 物体的质量
  • 一阶矩
  • 中心图像矩

既然我们已经在二进制图像中找到了对象,我们需要一种方法来表征它们。任何物体的形状**、伸长旋转位置都可以用少量的值进行编码。这些被称为图像时刻。**

****二进制图像矩提供了一种非常优雅的方式来描述二进制图像区域,其具有少量直观且极具描述性的值。

感兴趣对象的质量

我们从定义物体的总质量开始。这相当于我们的对象中值为 1 的像素总数。

变量 mn 对应于行和列, f(m,n) 对应于一个位置处的像素强度(在二进制中这显然将只有 0 或 1)。

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

感兴趣对象的矩

我们可以计算单个感兴趣物体的不同阶矩。时刻的顺序将产生不同的感兴趣的信息。例如,一阶矩除以总质量(值为 1 的像素数)即为质心。而二阶矩例如是物体的转动惯量。

任意阶矩的一般方程如下:

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

****阶矩等于 p+q. 这些可以取任意值,对于一阶矩我们举例设定

  • p=1q=0 (p+q = 1+0 =一阶矩)
  • 或 p=0q=1 (p+q = 0+1 =一阶矩)

一阶矩的结果公式示例如下:

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

用一阶矩除以物体的质量,就可以求出图形的质心。这给出了我们感兴趣的对象中的中间像素的位置。

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

中心图像矩

这些特别有用,因为它们对于翻译是不变的。所有计算都是相对于感兴趣对象的质心进行的。

****平移在图像处理中,就是通过给 x 坐标和 y 坐标加上一个指定的值,在坐标空间中移动图像中的一个对象。例如,向下移动一个对象意味着给对象中每个像素的 y 坐标增加一个值。

当我们平移一个形状时,质心的坐标也被平移。因此,通过考虑质心来计算中心图像矩使得计算结果对于平移不变。

p+q 的中心图像矩的一般方程为:

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

对于二阶的中心图像矩,存在三个 p+q 组合。由此产生的中心力矩方程如下所示:

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

中轴提取

对象的中轴是在对象边界上有一个以上最近点的所有点的集合。****

理解这一点的一个更容易和更直观的方法是查看所有接触两个或更多边界而没有越过任何边界的圆盘的中心所创建的线。

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

中轴对于字符和物体识别非常有用。我们图像中的每个感兴趣对象都有一个与其形状相关的唯一中轴。

距离变换

距离变换是一个通常只适用于二值图像的操作符。变换的结果是一个渐变颜色的图像,其形状与输入图像相同,除了“对象”区域内的点的强度被改变以显示从每个点到最近边界的距离

我们本质上想要找到物体中离边界最远的点。

下面的视频介绍了这个距离是如何计算的。第一个“层”被涂成红色,然后这个逐渐向内移动到边界的距离为+1。最终的中心红色像素对应于距离边界等距离和距离边界最远的像素。

非常感谢你的阅读!

如果您有任何关于如何改进的问题**、建议想法,请在下方留下评论!**

如果你喜欢我的作品,你可以关注我这里的T41。

这里我们来连线一下 LinkedIn

深度学习中正则化的视觉直觉

原文:https://towardsdatascience.com/a-visual-intuition-for-regularization-in-deep-learning-fe904987abbb?source=collection_archive---------24-----------------------

当我们应用正则化时,我们的模型会发生什么?

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

深度学习模型的优势和劣势——逼近任何函数的自由,以及逼近除了感兴趣的函数之外的任何其他函数的自由!

获得正则化的直觉

在机器学习中,正则化是一种用来对抗高方差的方法——换句话说,就是你的模型学习重现数据的问题,而不是关于你的问题的底层语义。以类似于人类学习的方式,这个想法是构建你的家庭作业问题来测试和构建知识,而不是简单的死记硬背:例如,学习乘法表而不是学习如何乘

这种现象在通过神经网络进行学习的过程中尤其普遍——随着学习能力的提高,记忆的可能性也越来越大,这取决于我们从业者如何引导深度学习模型吸收我们的问题,而不是我们的数据。你们中的许多人在过去会遇到这些方法,并且可能会对不同的正则化方法如何影响结果有自己的直觉。对于那些不知道的人(甚至那些知道的人!)这篇文章为如何通过正则化来调整神经网络参数提供了直观的指导。将这些方面形象化是很重要的,因为很容易将许多概念视为理所当然;本文中的图表及其解释有望帮助您直观地了解随着正则化程度的提高,模型参数会发生什么变化。

在本文中,我将把 L2 和辍学作为正规化的标准形式。我不会讨论其他方法(比如收集更多的数据)可能如何改变你的模型的工作方式;那可能是另一个时间。

所有的图形和模型都是用标准的科学 Python 栈制作的:numpymatplotlibscipysklearn,神经网络模型是用 PyTorch 构建的。

开发复杂功能

深度学习的核心原则之一是深度神经网络作为通用函数近似的能力。你可能感兴趣的任何东西——疾病的传播、无人驾驶汽车、天文学——都可以被压缩并由一个自学模型来表达,这种想法绝对令人惊叹!这是不管你感兴趣的问题实际上是否可以表达为某个解析函数 f 。当您通过训练来调节机器学习模型时,该模型采用参数 θ ,这允许该模型近似地学习 f *。

出于说明的目的,我们将查看一些相对简单的数据:理想情况下,一维数据足够复杂,以至于老派的曲线拟合令人痛苦,但又不至于难以抽象和理解。所以,我要创建一些任意复杂的函数,模拟周期信号,但加入一些古怪的东西。下面的函数实现了下面的等式:

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

我们自己的“复杂”功能

其中 A,B,C 是从不同的高斯分布中采样的随机数。这些值中的每一个的效果是在非常相似的函数之间添加滞后,使得它们随机地加在一起以生成非常不同的 f 值。我们还将向数据中添加白(高斯)噪声,以模拟正在收集的数据的效果。

让我们设想一个随机生成的数据样本:在本文的其余部分,我们将通过一个小的神经网络来重现这条曲线。

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

我们“复杂”功能的可视化。这对应于一个 X 和 Y 1D 数组,每个数组有 10,000 个元素长。

为了进行模型训练,我们将把它分成训练/验证集。为此,我将使用sklearn.model_selection中极其方便的train_test_split函数。让我们绘制训练集和验证集:

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

蓝色点对应测试,红色代表训练数据。

正如我们在图中看到的,两组数据在表示整体曲线方面做得相当好:如果我们去掉一个或另一个,我们可以收集到或多或少相同的数据所表示的图像。对于交叉验证来说,这是一个非常重要的方面!

开发我们的模型

现在我们有了一个数据集,我们需要一个相对简单的模型来尝试和重现它。为此,我们将处理一个四层神经网络,包括单个输入和输出值,有三个隐藏层,每个层有 64 个神经元宽。

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

我们的神经网络模型的简化图:奇异值输入和输出,有三个隐藏层,每个 64 个神经元宽(没有画出所有的神经元!)

为了方便起见,每个隐藏层都有一个 LeakyReLU 激活,在输出上有 ReLU 激活。原则上,这些不应该有太大的关系,但在测试期间,有时模型在学习一些“复杂”的功能时有困难,特别是当使用像 tanh 和 sigmoid 这样的激活时,这很容易饱和。就本文而言,这个模型的细节并不重要:重要的是,它是一个全连接的神经网络,具有学习逼近某个函数的能力。

为了证明该模型有效,我使用均方误差(MSE)损失和 ADAM 优化器执行了通常的训练/验证周期,没有任何形式的正则化,并以这些结果结束:

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

该模型的训练和验证工作良好:没有高方差或偏差的真实证据,并且两种损失在 100 个时期的过程中相对单调地减少。

当我们用这个模型来预测函数时:

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

我们的模型或多或少完美地得到了近似函数!

除了曲率快速变化的区域(接近 x =11),模型很好地再现了我们的“复杂”函数!

现在,我可以听到你问:如果模型运行良好,为什么我要做任何正则化?为了这个演示的目的,我们的模型是否过度拟合并不重要:我想要表达的是正则化如何影响一个模型;在我们的例子中,它甚至可以有害地影响一个完美的工作模型。在某种意义上,你可以把这理解为一句警告:当你遇到过度拟合时,就去处理它,而不是在此之前。用 Donald Knuth 的名言来说,“过早优化是万恶之源”。

正则化如何影响您的参数

既然我们已经解决了所有的样板文件,我们就可以进入文章的核心部分了!我们的重点是尝试并发展一种直觉,从三个角度了解不同的正则化方法如何影响我们的简单模型:

  1. 培训/验证损失会怎样?
  2. 我们的模型性能会发生什么变化?
  3. 实际参数会发生什么变化?

虽然前两点有些简单,但你们中的许多人可能不熟悉如何量化第三点。在这次演示中,我将使用核密度估计来测量参数值的分布/变化:对于那些熟悉 Tensorboard 的人来说,你会看到这些图;对于那些不熟悉的人,可以把这些图想象成复杂的直方图。目标是可视化我们的模型参数如何随正则化而变化,下图显示了训练前后 θ 分布的差异:

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

简单模型的模型参数的核密度估计值 θ

蓝色曲线被标为“均匀”,因为它代表了我们用均匀分布初始化的模型参数:你可以看到这基本上表现为一个礼帽函数,在中心具有相等的概率。这与经过训练的模型参数形成对比:在训练之后,模型需要非均匀的 θ 值,以便实际表达我们的函数。

L2 正则化

最直接的正则化方法之一是所谓的 L2 正则化:L2 指的是使用参数矩阵的 L2 范数。根据线性代数,矩阵的范数由下式给出:

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

任意 Lpq 范数的一般表达式

在前神经网络机器学习中,参数更经常被表示为向量而不是矩阵/张量,这只是欧几里德范数。在深度学习中,我们更经常地处理矩阵/高维张量,欧几里德范数并没有很好地扩展(超越欧几里德几何)。L2 范数实际上是上述等式的特例,其中 p = q =2,并且被称为弗罗贝纽斯或希尔伯特-施密特范数,其推广到无限维度(即希尔伯特空间)。

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

弗罗贝纽斯/希尔伯特-施密特(L2)范数。

在深度学习应用中,应用这种 L2 正则化的一般形式是在你的成本函数 J 的末尾附加一个“惩罚”因子:

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

我们的成本函数:第一部分是预测值和实际值之间的均方误差差,右边的部分是我们的 L2 正则化项。

非常简单,这个等式将成本函数 J 定义为 MSE 损失,以及 L2 范数。L2 范数对成本的影响乘以这个因数λ;这在许多实施中被称为“重量衰减”超参数,通常在 0 和 1 之间。由于它控制正则化的数量,我们需要理解这对我们的模型有什么影响!

在一系列实验中,我们将重复与之前相同的训练/验证/可视化循环,但是使用λ的一系列值。第一,对我们的训练有什么影响?

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

L2 正则化对模型训练的影响。

我们来分解一下上面的情节。较深的红色阴影对应于较大的λ值(尽管它不是线性贴图!),将训练损失的痕迹显示为 MSE 损失的日志。记住,在我们的非正则化模型中,这些曲线单调递减。这里,当我们增加λ的值时,最终的训练误差显著增加,并且在早期损失的减少也不显著。当我们试图用这些模型来预测我们的功能时会发生什么?

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

使用用指定的λ值训练的模型进行预测。

我们可以看到,在λ值很小的情况下,这个函数仍然可以表达得相当好。转折点出现在λ=0.01 附近,在这里,曲线的定性形状被复制,但不是实际的数据点。从λ>0.01 开始,*该模型只是预测整个数据集的平均值:就好像我们只是尝试进行线性回归一样。*如果我们根据我们的培训损失来解释这些,那么损失停止减少也就不足为奇了——用一条直线你只能做这么多!

参数的分布呢?

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

我们每个训练模型的参数分布,具有不同的λ值。分布的峰值被截断。

我们看到,当我们从低λ到高λ时,参数值的分布受到很大的阻碍。与均匀分布相比,参数值的分布越来越接近零,并且在λ=1.0 的情况下, θ 的分布看起来就像零处的狄拉克δ函数。由此,我们可以得出 L2 正则化用于约束参数空间——迫使θ非常稀疏且接近于零。

辍学怎么办?

另一种流行且经济有效的正规化方法是在你的模型中加入辍学者。这个想法是,随着每一个模型的通过,根据某种概率 p 通过将它们的权重设置为零来停用一些神经元。换句话说,我们对我们的参数应用了一个布尔掩码,每次数据经过不同的单元时都会被激活。这背后的基本原理是将模型学习分布在整个网络中,而不是特定的一个或两个层/神经元。

在我们的实验中,我们将在每个隐藏层之间包含丢失层,并将丢失概率从零调整到一。在前一个限制中,我们应该只有一个非正则化的模型,而在后一个限制中,我们应该有各自降低的学习能力*,因为每个隐藏层都被去激活*。

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

一系列退出概率的培训损失模型。

我们看到了与 L2 正则化非常相似的效果:总的来说,模型的学习能力降低了,并且随着丢失概率值的增大,最终的损失成比例地增大。

当我们试图用这些模型来预测我们的功能时:

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

越往下看,我们辍学的可能性越大。从 p =0.1 开始,我们可以看到我们的模型开始对它的预测相当不稳定:最有趣的是,它似乎近似地跟踪我们的数据,包括噪声!

p =0.2 和 0.3 时,这在 x =11 附近更加明显——回想一下,我们的非正则化模型很难正确得到函数的这个区域。我们看到,有遗漏的预测实际上使这个区域变得非常模糊,这几乎就像模型告诉我们它是不确定的!(稍后会详细介绍)。

p =0.4 开始,模型的能力似乎受到了充分的限制,除了第一部分之外,它无法再现曲线的大部分。在 p =0.6 时,看起来预测几乎接近数据集平均值,这似乎也发生在 L2 正则化的大值上。

我们的模型参数呢?

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

作为退出概率函数的模型参数分布。

与我们的 L2 常模结果比较:对于辍学者,我们的参数分布更广,这增加了我们模型的表达能力。除了 p =1.0 之外,即使有影响,退出概率的实际值也不会对参数的分布产生很大影响。在 p =1.0 时,我们的模型没有学到任何东西,只是类似于均匀分布。在降低的值 p 下,模型仍然可以设法学习,尽管速率降低。

带回家的信息

从我们简单的实验中,我希望你已经从我们探索的三个角度开发了这两种正则化方法如何影响神经网络模型的一些心智模型。

L2 正则化非常简单,只需调整一个超参数。当我们增加 L2 惩罚的权重时,参数空间的变化——因此模型容量——对于大值(0.01–1)下降得非常快。使用较小的值,您甚至可能看不到模型预测中的差异,尽管当您绘制出 θ的分布时,这一点变得很明显。

Dropouts 是一种更复杂的正则化方法,因为您现在必须处理另一层超参数复杂性( p 对于不同的层可以有不同的值)。尽管如此,取决于你如何看待它,这实际上可以提供模型表达的另一个维度:以模型不确定性的形式。我计划在另一篇博文中更多地介绍这一点(给我发消息鼓励我吧!).包含漏失的影响是 θ 的变化变得明显更大,并扩展到 θ的不同可能值。

在这两种方法中,我们已经看到正则化增加了最终的训练损失。这些人工形式的正则化(而不是获得更多的训练数据)的成本是,它们会降低您的模型的容量:除非您确定您的模型需要正则化,否则您不希望包含这些内容。然而,有了这个指南,你现在应该知道这两种形式是如何影响你的模型的了!

如果你感兴趣,你可以在 Binder 上运行一些代码。我不一定要运行torch模型(这会耗尽它们可怜的资源),但是你可以用它来探索笔记本中的代码。

进一步阅读

退学正规化

我的 github 回购与实验

请留意更多这类文章!你可以通过推特、T2、LinkedIn 和媒体网络联系我!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值