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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

人工智能监控的平台方法

原文:https://towardsdatascience.com/the-platform-approach-to-ai-monitoring-dcc43dee6c6e?source=collection_archive---------54-----------------------

不要相信开箱即用的监控解决方案。你的意见至关重要。

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

资料来源:莫纳实验室公司。

如果你一直在努力让你的人工智能模型在生产中的表现变得透明,你在一个好公司里。监控复杂的系统总是一项挑战。监控具有内在不透明性的复杂人工智能系统是一个根本性的挑战。

随着企业中人工智能方法、底层技术和用例的激增,人工智能系统正变得越来越独特。为了满足他们的业务需求,每个数据科学团队最终都会构建一些非常独特的东西;每个人工智能系统都是一片雪花。

人工智能技术、使用案例和数据环境的巨大多样性消除了一刀切的监控解决方案的可能性。例如,自主监控解决方案通常是不够的,因为它们自然不会扩展到少数用例之外。对于这些解决方案来说,扩展或扩展是一个巨大的挑战,因为要在没有用户上下文的情况下监控人工智能系统,人们必须对指标、它们的预期行为以及它们发生变化的可能根本原因做出大量假设。

一个显而易见的解决方案是为每个用例构建独立的点解决方案,但是这是不可扩展的。那么,有没有一个框架或解决方案是为(几乎)所有人设计的呢?

是的。这是平台方法。

监控黑匣子的平台方法

人工智能系统监控的平台方法是通用自主方法定制方法之间的最佳点。这意味着,一方面,监控系统根据用户人工智能系统的独特特征进行配置,另一方面,它可以毫不费力地进行扩展,以满足新的模型、解决方案架构和监控环境。

这是通过实施通用监控构建模块来实现的,然后由用户动态配置,以实现定制的专用监控解决方案。这个监控环境适用于任何开发和部署栈(以及任何模型类型或 AI 技术)。此外,由于监控平台是独立的,并且与堆栈分离,因此它可以实现超级快速的集成,不会影响开发和部署流程,更重要的是,监控可以跨越堆栈中的所有层。

系统的可配置性意味着数据团队不局限于他们系统的预制定义:他们实际上由一个“工程部门”授权,该部门给予他们对监控策略和执行的完全控制。

灵活、适应性强的解决方案

除了平台方法可以解决行业的监控问题之外,其无限的灵活性以行业特定的自主解决方案所不具备的方式使用户受益。这听起来可能是一个反直觉的假设,因此这里有几个不可知系统中固有的特性的例子,这些特性通过自主解决方案根本无法实现,即使这些特性是行业特定的:

**通过上下文(或系统)监控,而不是通过模型。**如果在模型运行一段时间后,您获得了基本事实(或关于成功/失败的客观反馈),那么您会希望将新信息与推理时捕获的信息关联起来。这种场景的一个例子是营销活动目标模型,该模型接收关于活动成功的反馈(转化率、CTR 等)。)几周之内。在这样的用例中,我们希望监控能够将模型的预测和业务结果联系起来。

如果您正在比较运行在相同数据上的两个不同的模型版本(在“影子部署”场景中),那么通过上下文进行监控也是非常宝贵的。

如果您有多个运行在相同数据上下文中的模型,并且可能相互依赖,那么您需要有一种方法来推断一个模型失败的真正根本原因是否与另一个模型相关。例如,在 NLP 设置中,如果您的语言检测模型的准确性下降,下游的情感分析模型也可能表现不佳。

**配置你的异常检测。**异常总是在上下文中出现,因此在许多情况下,明显的异常(甚至表现不佳)是可以接受的,数据科学家可以忽略它。配置您的异常检测的能力意味着监控解决方案不会简单地检测一般的性能不佳,而是定义哪些定制配置的异常可能指示性能不佳。

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

来源:莫纳实验室公司;人工智能监控中有三种异常类别:异常值(左)、漂移(中)、突变(右)

比如:你分析推文的情绪。监控解决方案发现,20 个字符以下的推文(短推文)的预测可信度降低。你可能会接受这种缺点(例如,如果这符合客户的期望)。然后,您的监控解决方案应该使您能够从分析中排除这一部分(短推文),以避免扭曲其余数据的测量结果(如果短推文占数据的很大一部分,这一点尤为重要)。

在任何阶段跟踪任何指标。最常见的情况是,团队会跟踪和检查模型精度和召回率(这需要“标记数据”)。即使没有这样的“基本事实”,也可能有许多重要的指标需要跟踪,这些指标可能指示模型的不当行为。例如:如果您有一个文本类别分类器,您可能希望跟踪没有类别得分超过某个阈值的推文的相对流行程度,作为低分类置信度的指标。这种度量需要从原始结果中计算出来,因此它不是微不足道的,并且不是现成的。

此外,可以根据度量行为可能发生变化的多个维度对每个度量进行进一步细分(例如,如果您的度量是文本分类置信度,那么维度可能是文本的长度或编写文本的语言。)

此外,如果您只关注模型的输入和输出,那么您会错过对您的预测可能不重要但对治理却至关重要的维度。例如:种族和性别不是(也不应该是)贷款算法中的特征,但它们是评估模型行为的重要维度。

没有人比你更了解你的人工智能

一个强大的监控解决方案可以为您的人工智能系统提供真实、有价值的见解,它需要与您独特的技术和环境相关,并且能够灵活地适应您的特定用例以及未来的开发需求。

这样的系统应该是 stack 不可知的,所以你可以自由地使用任何技术或方法进行生产和培训。它需要全面地看待你的人工智能系统**,这样特定的生产和性能领域就不会被视为筒仓,而是在整个系统的环境中。最重要的是,它需要在您独特的背景下审视您的系统,只有您能够提供和微调。人工智能监控的平台方法旨在实现这一目标。**

原载于 2020 年 8 月 12 日https://www . monalabs . io**

不归路:过去 6 个月使用 nbdev 改变了我在 Jupyter 笔记本上编码的方式

原文:https://towardsdatascience.com/the-point-of-no-return-using-nbdev-for-the-past-6-months-changed-the-way-i-code-in-jupyter-2c5b0e6d2c4a?source=collection_archive---------27-----------------------

有了 nbdev,Jupyter 笔记本现在是一个有文化的编程环境。有了 nbdev,我的生产力提高了。我的代码现在更有条理了。我处理新项目的方式永远改变了。

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

凯特琳·贝克Unsplash 拍摄的照片。

nbdev 是什么?—如果你在问这个问题,请做好准备,因为你即将发现的东西会让你的大脑爆炸。不是字面意思,不用担心。你会没事的。如果你已经使用了 nbdev,你可能会对我的故事的某些方面感兴趣。请告诉我,我很想听听你的经历。

"nbdev是一个允许你在 Jupyter Notebooks 中完全开发一个库的库,把你所有的代码、测试和文档放在一个地方。那就是:你现在拥有了一个真正的有文化的编程环境,正如唐纳德·克努特在 1983 年所设想的那样!”—引用 nbdev 存储库。

作为一名研究人员和数据科学爱好者,我每天都与数据打交道。没有空气、水和食物,我们人类就无法生存。对于数据科学家来说,数据应该是列表的一部分。

我在日常生活中使用 Jupyter 笔记本,这是我编码、解决问题和试验新想法的环境。然而单单 Jupyter 笔记本就有一个重要的局限性。当需要将代码转移到生产环境并创建 python 包时,有必要将所有代码复制到 Python 模块中。无数次我花了很多时间来重组和清理代码。一个以大量复制、粘贴和调试为特征的过程。

我可以忍受这种工作程序,它并不理想,但我不知道最好的。这在我去年生日的时候改变了。同一天,杰瑞米·霍华德宣布了新的 nbdev 图书馆。这一天当然是一个巧合,但它感觉像一个生日礼物。在读到它的承诺后,我立刻意识到这是一件大事。

在接下来的三个部分中,我将介绍nbdev 的主要特性如何开始使用 nbdev 以及它如何在过去的 6 个月中改变了我的编码方式。然后,我将最后说几句话。让我们开始吧。

nbdev 的主要功能

在我看来,nbdev 最令人兴奋的特性如下:

  • 从笔记本中自动生成 Python 包;
  • 该包的文档也是从笔记本中构建的,包括您可能希望包含在笔记本中的带有图形和图像的代码示例;
  • 默认情况下,自动生成的文档可以在 GitHub 页面中以好看的格式查看。
  • 当你把你的代码推送到 GitHub 时,会自动进行一系列的检查,以确保笔记本的格式是干净的,你包含在包中的测试也会运行;
  • 您的包可以通过一个命令上传到 PyPi。
  • 所有这些开发过程都可以扩展到大型项目。如果你想要一个例子,那就去看看从 70 台 Jupyter 笔记本中生成的 fastai2 库。

如何开始使用 nbdev

nbdev 入门非常简单。在我阅读了 GitHub 页面上的描述后,我马上开始使用它。任何问题通常会在包装的文档中回答,或者以检查 fastai2 笔记本为例。基本步骤是:

  • 从他们提供的模板中创建一个 GitHub 库
  • 克隆存储库并运行nbdev_install_git_hooks命令为您的项目进行配置;
  • 用基本信息编辑并完成settings.ini文件,比如包的名称、你的 GitHub 用户名等等;
  • 开始在 Jupyter 笔记本上开发您的代码;

笔记本的第一个单元格应该包含#default_exp module_name,以告诉如何调用从笔记本自动生成的 Python 模块。每个笔记本将是一个不同的 python 模块。为了告诉 nbdev 如何处理每个笔记本单元格,您在单元格的顶部写了一些注释标签。您通常会使用:

  • #export —用于包含应导出到 Python 模块的代码的单元格;
  • #hide —隐藏不想在文档中显示的单元格。

有几个命令可以在命令行上运行。它们从nbdev_开始,你可以使用 tab 补全来找到所有现有的命令,但是大多数时候你需要nbdev_build_lib来构建库和nbdev_build_docs来构建文档。

值得一提的是,nbdev 也使得为你的包创建控制台脚本变得非常容易!

一旦一切准备就绪,就可以用pip install -e .在本地安装这个包,但是你可能想把它上传到 PyPi。在这种情况下,只要你遵循了配置步骤,你只需运行make pypi,nbdev 就会处理好一切。

nbdev 如何在过去的 6 个月里改变我的编码方式

在过去的 6 个月里,在我的大部分项目中使用 nbdev 对我的编码方式产生了显著的影响。不仅仅是因为 nbdev 功能本身,还因为它让我更多地思考我应该如何构建代码。为了充分利用 nbdev,代码需要有一些组织。

回顾过去

  • 我的代码非常杂乱,通常由无数个 Jupyter 笔记本组成,它们有相同进程的不同版本和非提示性的文件名;
  • 大多数时候我会为自己写代码;
  • 如果几个月后我不得不回头看我自己的代码,我会努力去理解它;
  • 我从来不敢创建 PyPi 包,对于一个简单的项目来说,这看起来太费力了。

现在看看现在

  • 自从我开始使用 nbdev 以来,我的代码逐渐变得更加结构化,更易于共享和重用;
  • 现在,我创建我的笔记本,认为它们是要被人类理解的;
  • 当我不得不回到一个我暂时没有做的项目时,我可以很容易地通读笔记本来刷新我的记忆;
  • 使用 nbdev,创建包只是笔记本中代码的结构和组织的自然结果。从那以后,我创建了一些包。我在另一个名为的故事中讲述了一个最近的例子,用 Python 分割重叠的边界框。

[## 在 Python 中分割重叠的边界框

从问题公式化到创建 PyPI 包,用 5 个步骤完成教程,使用来自全球…

towardsdatascience.com](/split-overlapping-bounding-boxes-in-python-e67dc822a285)

最后备注

为人类编写代码是当今世界需要接受的一个概念。Jupyter 笔记本是分享想法和知识的绝佳方式。想法和知识是建设美好未来的基石。如果我们能够更有效地共享构建模块,我们将会加速进步。把想法打磨成简单优雅的形式需要时间。但这很重要。因为否则所有试图建立这些想法的人将不得不为了他们自己的理解而单独润色它们。在某种程度上, nbdev 以一种简单而优雅的形式让分享想法变得更容易、更省时。nbdev 负责自动化的工作,让开发人员有更多的时间专注于笔记本的展示。

我希望这个故事对你有用并有所启发!

关于我

[## 我的 3 年历程:从零 Python 到深度学习竞赛高手

自从 2017 年开始学习 Python 以来,我一直遵循的道路是成为一名独自参加 Kaggle 比赛的大师…

towardsdatascience.com](/my-3-year-journey-from-zero-python-to-deep-learning-competition-master-6605c188eec7)

感谢阅读!祝您愉快!

新冠肺炎的政治和经济前景

原文:https://towardsdatascience.com/the-political-and-economic-perspective-of-covid-19-c35c046ceffc?source=collection_archive---------21-----------------------

一些数据和想法告诉我们可能的发展方向

我们大多数人都没有经历过类似现在的情况。在接下来的几周内,世界上许多国家的学校、大学、商店、酒吧、餐馆和其他娱乐设施都将关闭。随着航班和火车被取消,边境被关闭,宵禁被讨论和整个封锁的引入,我们的行动越来越受到限制。当然,所有这些都是为了一个很好的理由:减缓新型冠状病毒的传播。

似乎我们的生活即将停止并发生巨大变化。这些限制正在对我们的经济造成损害,并对政治产生重大影响。在这篇文章中,我将看一些图表来描述经济和政治(特别是在美国)已经发生的事情,以及这对未来可能意味着什么。请记住,今年 11 月美国将举行总统选举。

注意:这篇博文应被视为一种观点,而非预测。

新冠肺炎的威胁有多严重?

毫无疑问,这是对整个世界人口的严重威胁。这篇文章很好地阐述了为什么我们必须今天就采取行动,否则许多人将会死亡,全球的医疗保健系统将会崩溃。新病例呈指数增长,在意大利、伊朗、韩国和中国等一些国家呈爆炸式增长。然而,美国、德国、法国、西班牙和其他国家只比受影响更严重的国家落后几天。

直到 3 月 16 日,中国的确诊病例比其他所有国家的总和还要多。然而,中国完全关闭公共生活有助于拉平增长率。各大洲的许多其他国家正在对其公民采取类似的限制。

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

确诊病例(直线)和死亡率(分散)相互对照。来源:朱莉娅·尼库尔斯基,数据来自约翰·霍普金斯大学。

意大利是病例数第二高的国家,并且仍在呈指数增长,其次是伊朗、西班牙、韩国和德国。这张图也显示了 T2 医疗系统在应对新冠肺炎疫情时遇到的困难。这是其他国家的前兆,这些国家与意大利有着相同的轨迹,只是落后了几天。

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

确诊病例(线)和死亡率(分散)相互标绘,不包括中国。来源:茱莉亚·尼库尔斯基,数据来自约翰·霍普金斯大学

新闻里在谈论什么?

几乎不可能忽略目前正在进行的疫情。所有关于新冠肺炎的更新都淹没了其他与疫情无关的内容。其中之一是民主党初选和 11 月大选的竞选活动。

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

该图描绘了选举相关新闻(橙色)和新冠肺炎新闻(蓝色)每天的新闻报道数量。词云显示了美国数字媒体和报纸在二月中旬和三月中旬关于这些话题谈论最多的词。来源:朱莉娅·尼库尔斯基,数据来自媒体云

上图显示了美国数字媒体和报纸上发布的关于新冠肺炎和选举相关新闻(美国)的新闻故事的发展。在二月底,新冠肺炎新闻报道的数量首次超过了选举新闻报道的数量,这甚至发生在超级星期二之前!除此之外,冠状病毒的新闻报道数量激增。

有趣的是,这些新闻报道中讨论的事情是如何随着时间的推移而变化的。虽然在 2 月中旬,选举新闻报道中的主要关注点是新罕布什尔州的初选、伯尼·桑德斯、民主党和特朗普,但在 3 月中旬,这种关注转移到了特朗普、乔·拜登和冠状病毒。二月中旬到三月中旬,新冠肺炎相关新闻的话题也发生了变化。虽然大多数故事围绕着二月份搁浅的游轮、中国局势和“新病毒”,但这在三月中旬变成了特朗普的行动成为关注的焦点。

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

每天花在选举相关新闻上的时间百分比。广播时间以 15 秒为单位。用于搜索的关键词有:拜登、桑德斯、沃伦、克洛布查尔、Buttigieg、加巴德、初选、党团会议、选举。资料来源:Julia Nikulski,数据来自 GDELT 项目。

电视新闻以同样的方式从报道与选举相关的话题(党团会议、初选、民主党总统候选人等)转移开来。)几乎 50%的播出时间增加了冠状病毒的覆盖范围。截至上周,三大有线新闻频道(CNN、MSNBC、福克斯新闻)在病毒爆发上花费了近 20%的播出时间。

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

每天花在新冠肺炎相关新闻上的时间百分比。广播时间以 15 秒为单位。用于搜索的关键词是:新冠肺炎、冠状病毒、病毒、冠状病毒。资料来源:Julia Nikulski,数据来自GDELT 项目

有趣的是,在所有新闻频道中,福克斯新闻花了最多的时间讨论疫情。与其他媒体不同的是,福克斯新闻对川普与新冠肺炎的关系没有 T4 那么多批评。那里的报道可能会极大地影响不同党派的美国人如何看待冠状病毒的威胁(下文将详细介绍)。

经济反应如何?

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

从 1984 年至今标准普尔 500、纳斯达克、DAX、道琼斯和恒生指数的价格发展。来源:朱莉娅·尼库尔斯基,数据来自雅虎财经。

至少可以说,不太好。与过去 35 年的经济衰退和股票损失相比,标准普尔 500、纳斯达克、道琼斯、DAX 和恒生指数只是处于熊市的开始。

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

标准普尔 500 过去 35 年的 10 大损失和 10 大收益。来源:朱莉娅·尼库尔斯基,数据来自雅虎财经。

就标准普尔 500 过去 35 年来的最大每日损失和收益而言,2020 年 3 月 16 日仅次于 1987 年的黑色星期一。其第三大毁灭性的一天是 2020 年 3 月 12 日。然而,由于当前形势的不确定性和每日更新,损失在第二天几乎完全恢复,使得 2020 年 3 月 13 日成为第三高的涨幅。更重要的是:所有其他日期,无论是亏损还是盈利,都处于严重的经济衰退之中,这表明我们可能也会陷入更长时间的衰退。

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

标准普尔 500、纳斯达克、DAX、道琼斯和恒生指数在过去三个月的价格发展。来源:朱莉娅·尼库尔斯基,数据来自雅虎财经。

更仔细地观察过去 3 个月的发展,从 2 月中旬开始,所有这些指数的总体下降趋势变得明显。在绘制确诊病例数和指数价格时,有明显的负相关关系。

中国大量的确诊病例掩盖了其他国家病例的发展。2 月中旬后,中国设法拉平了曲线。但是大约在那个时候,标准普尔 500 指数和 DAX 指数开始下跌。

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

图表描述了与全球确诊新冠肺炎病例上升相比,德国 DAX 指数和标准普尔 500 指数的价格发展。来源:茱莉亚·尼库尔斯基,数据来自雅虎财经约翰·霍普金斯大学

不包括中国表明,在 2 月中旬,韩国的病例开始上升,关于被检疫的游轮(2 月 15 日后出现在图表最底部的紫色水平线)的新闻得到了越来越多的关注。

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

该图描述了德国 DAX 指数和标准普尔 500 指数的价格发展,并与全球(不包括中国)确诊新冠肺炎病例的上升进行了比较。来源:朱莉娅·尼库尔斯基,数据来自雅虎财经和约翰·霍普金斯大学。

《市场观察》上有一篇关于道琼斯指数发展的精彩文章,文章展示了经济陷入衰退后,道琼斯指数的复苏需要多长时间。它花了 25 年时间来弥补大萧条的损失,花了 16 年时间从 20 世纪 70 年代和 80 年代的经济和政治动荡中复苏,花了 6 年时间来恢复 2008 年金融危机期间失去的东西。目前,我们仍处于熊市的开端,所以我们不知道股市何时会好转,也不知道需要多长时间才能收复失地。但是监管者认为下降趋势将持续数周。

周日晚上,美联储将利率下调至接近 0 %的水平,试图安抚投资者。然而,投资者并不认为这是信心的表现。纽约证券交易所开盘后第二天就停止了交易,因为标准普尔 500 指数下跌超过 7%。

与 2008 年金融危机的不同之处在于,我们正在应对一场健康危机。超国家、国家和地方政府采取的任何措施都旨在避免全球卫生保健系统的灾难性崩溃。然而,在短期和中期,这些限制会立即影响公司的底线,导致失业。

世界各国正试图通过对经济的紧急刺激方案,甚至对公民的直接现金支付(如川普政府所宣布的)来减轻打击。所有迹象都表明经济衰退。但问题是它会停留多久。一些人希望会有一个快速反弹,但是没有确定性。看看中国就知道,复苏可能需要比预期更长的时间。

今年不是有选举吗?

今年 11 月,美国确实有地方、州、国会和总统选举。新闻大量报道了民主党总统初选,然而,自二月底以来,人们的注意力已经转向新冠肺炎。竞选集会被取消辩论在没有观众的情况下播出甚至一些州的初选也被重新安排到稍后的日期,以避免病毒的进一步传播。

从历史上看,经济衰退时期的总统连任竞选是艰难的,当经济萎缩时,现任总统连任的机会就会减少。这将意味着,如果经济将陷入持续数月的衰退,特朗普再执政 4 年的机会正在减少。吉米·卡特(Jimmy Carter)在长达数月的经济衰退中输掉了连任竞选,奥巴马在 2008 年的金融危机中获胜,希拉里在 1992 年击败乔治·h·w·布什(George H. W. Bush)的部分原因是一年半前结束的经济衰退。

虽然经济是选举的一个很好的预测因素,而且的这篇文章认为,2020 年前两个季度的衰退可能会导致特朗普失败(考虑到他的选举人团优势),但在特朗普时代,预测结果可能会更复杂。

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

特朗普总统任期内的支持率。资料来源:Julia Nikulski 基于来自fivethirtyeeight的数据和图表。

他的总体支持率从来都不是很高,大约在 30%到 40%之间。然而,它们一直是稳定的。无论是被弹劾,因支持白人至上主义者而被公开谴责,还是因空袭索莱马尼而被自己的政党批评,都没有太大的变化。

此外,这些评级掩盖了对他的表现的高度党派分歧。他有一个非常忠诚的基础,就像有一些非常忠诚的永远不会出牌的人一样。在当前的冠状病毒危机中也可以观察到这种分歧。根据三月第一周进行的由五月三十八日汇总的民意调查,共和党人高度赞同川普抗击疫情的措施,而民主党人则强烈反对。

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

在调查受访者中,对特朗普处理冠状病毒疫情的方式表示一定程度或强烈赞同的比例。资料来源:Julia Nikulski 基于来自fivethirtyeeight的数据和图表。

此外,我们早些时候在描述冠状病毒电视报道的图表中看到,福克斯新闻花了很多时间报道这个话题。但是这个网络的政治评论员淡化了恐惧,表明回声室并不局限于脸书。在社交媒体、假新闻和高度党派分歧的时代,经济可能仍然是选举的决定性因素。然而,把所有的牌都押在经济上不一定会导致民主党总统候选人获胜。

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

调查受访者会为每个阵容中的哪些候选人投票。资料来源:Julia Nikulski 基于 FiveThirtyEight 的数据和图表。

上述调查没有显示的是选举人团将如何影响最终的选举结果。此外,川普已经开始听取他的顾问们的意见,比如安东尼·福奇医生。在否认病毒的威胁不起作用后,他现在提议向经济注入数十亿美元现金,以避免经济下滑。所有这些都可能影响选民最终如何评判特朗普在 11 月投票中的表现。

结论

从上述图表和数据中得出的想法当然只是对当前形势的一种解释,当前形势非常不稳定,每天都有新的、改变日常生活的信息发布。经济和政治正在适应冠状病毒创造的新环境,经济是否会进入衰退,衰退会持续多长时间和多严重,以及这是否会导致白宫发生变化,仍有待观察。

这篇文章中使用的所有图表和数据都可以在我的 GitHub 上获得。

你想在媒体上阅读更多高质量的故事吗?考虑注册一个支持我和其他媒体作者的会员。

[## 通过我的推荐链接加入 Medium-Julia Nikulski

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@julia.nikulski/membership)

想读一些与我们当前严峻的现实无关的东西吗?查看我关于用不同的机器学习算法预测自行车共享数据的时间序列的文章。

[## 基于 AdaBoost、随机森林和 XGBoost 的时间序列预测

我们能从不能给我们很好预测结果的数据科学项目中学到什么

towardsdatascience.com](/go-highly-accurate-or-go-home-61828afb0b13)

土豆列车——使用 Python 处理极大数量和任意精度的二项式概率

原文:https://towardsdatascience.com/the-potato-train-using-python-with-extremely-large-numbers-and-arbitrary-precision-for-binomial-68213de30b87?source=collection_archive---------41-----------------------

数学很难,我们去购物吧——当然是为了辅导课。我真希望在尝试用 Python 做一些涉及极大数字的事情(n 的大值的二项式概率)和我的代码开始崩溃之前,我已经阅读了这篇教程。

但是等等,我听到你说,Python 可以处理任意大的数字,只受 RAM 大小的限制。当然,只要这些都是整数。现在,为了更好地衡量,尝试混合一些浮点值,事情开始崩溃。在 vanilla Python 中,任意大的数字混合任意精确的浮点数并不好玩。

让我们尝试在计算二项式分布时逐渐增加 Python 中整数运算的需求,看看会发生什么。

欢迎来到…

土豆火车

这是冷战时代。在遥远的冰封之地,有一个非常大的工业中心。那里寸草不生,所以工人们只能靠食物维生。偶尔会有一列满载土豆的火车到站。

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

现在,这是硬东西——我们正在谈论暴风雪和风暴——所以土豆被损坏了。事实是,在每次运输中,有 20%到达车站的土豆是坏的。

好了,轮到你做晚饭了,所以带上一个又大又重的包去车站吧。20 个土豆足够你们队吃了。但是现在已经熄灯了,一片漆黑,领导已经明智地把所有的精力都分配到工厂去完成配额,所以你只能盲目地随意采摘土豆。

你挑选的所有土豆都是好的几率有多大?只有一个土豆是坏的几率有多大?还是 2 坏,还是 3 坏?还是都不好?(这肯定会毁了晚餐)

或者也许同志们说:*“瞧,我们都知道是怎么回事,只是这次尽量不要挑超过 4 个坏土豆。20 个中最多 4 个坏就可以了。我们会活下来的。越少越好。多了就不好了。”*你的团队这次不会吃悲伤的晚餐的可能性有多大?

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

这就是你遇到你的死敌的地方:

二项式分布

有一个非常大的 A 型或 b 型对象堆。A 型对象在堆中的分数是 p,其中 0 < = p < = 1;剩下的都是 b 型,从那堆里面,你挑 n 个对象,n 比整堆的大小小很多。在你挑选的 n 个物体中,k 是 A 型的几率有多大?

换句话说,你从一列土豆中挑出 n=20 个土豆,其中 p=0.2(或 20%)是坏的。你挑出来的 k 个土豆(k 在 0 到 20 之间)坏的几率有多大?

这是概率的公式:

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

许多 Stats 101 书籍会给你某种证明(见最后的学分)。我只做土豆,所以我们继续吧。

但在此之前,请注意公式中的阶乘。阶乘可以很快变得很大。这将扭转过来,并在以后的代码中很好地咬我们。

但还不是时候。我们会慢慢开始,先用小数字。相信我,我是个工程师。一切都会好的——暂时如此。

我们来编码吧!

打开你的 Jupyter 笔记本,跟我来。让我们进口好东西:

实现概率公式:

并计算所有 k 值的概率:

让我们看看结果:

print(df)
     probability
0   1.152922e-02
1   5.764608e-02
2   1.369094e-01
3   2.053641e-01
4   2.181994e-01
5   1.745595e-01
6   1.090997e-01
7   5.454985e-02
8   2.216088e-02
9   7.386959e-03
10  2.031414e-03
11  4.616849e-04
12  8.656592e-05
13  1.331783e-05
14  1.664729e-06
15  1.664729e-07
16  1.300570e-08
17  7.650410e-10
18  3.187671e-11
19  8.388608e-13
20  1.048576e-14

所有土豆都是好的概率大概是 1%。只有 1 个土豆坏的概率在 5%左右;认为 2 个土豆坏的占 14%;三个坏土豆是 21%,四个坏土豆是 22%,从那以后就开始走下坡路了——17%,11%,等等。所有的土豆都是坏的是不太可能的——1000 亿分之一。

累积概率如何——4 个或更少的土豆是坏的?是队友问的。让我们看看:

dfcs = df.cumsum()
dfcs.rename(columns={'probability': 'cumulative probability'}, inplace=True)
print(dfcs)
    cumulative probability
0                 0.011529
1                 0.069175
2                 0.206085
3                 0.411449
4                 0.629648
5                 0.804208
6                 0.913307
7                 0.967857
8                 0.990018
9                 0.997405
10                0.999437
11                0.999898
12                0.999985
13                0.999998
14                1.000000
15                1.000000
16                1.000000
17                1.000000
18                1.000000
19                1.000000
20                1.000000

有 63%的可能性,只有 4 个或更少的土豆是坏的。几乎三分之二的情况下,你的队友会觉得晚餐是最不可接受的。嘿,可能会更糟。

但是眼见为实,让我们画出所有 k 值的概率。代码:

df.plot(figsize=(16,9))
dfcs.plot(figsize=(16,9))

和图像结果:

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

情节(的腰围)变粗了

但是,唉,这并不是它的结束。你做饭做得这么好,现在他们想让你为工厂的整个精密模具部门做饭。这是一群团队,你认为每个人需要 200 个土豆。因此,抓住生产工具,在这种情况下是几个麻袋,找个人来帮助你,然后前往火车站。

那是 n=200,所以大概 40 个或者更少的坏土豆对同志们来说是可以接受的,假设所有的团队都像你一样。让我们看看可能性有多大。

更改代码中 n 的值,然后重新运行它。这就是事情变坏的地方,就像火车上的许多土豆一样:

---------------------------------------------------------------------------
OverflowError                             Traceback (most recent call last)
<ipython-input-4-c84b1e23a65f> in <module>
      7 # compute probabilities for all k
      8 for k in tqdm(range(n + 1)):
----> 9     df.loc[k] = bin_prob(n, p, k)<ipython-input-3-60f4e81371ca> in bin_prob(n, p, k)
      1 def bin_prob(n, p, k):
----> 2     arr = math.factorial(n) / math.factorial(k) / math.factorial(n - k)
      3     bp = arr * (p ** k) * ((1 - p) ** (n - k))
      4     return bpOverflowError: integer division result too large for a float

啊,是的。我们在计算 200!在那里,有 375 个数字(不是开玩笑)。/操作符想把事情当做 float 来处理,Python 在那个范围内做不到 float。

但是等等,//运算符也做除法(地板除法,够近了),把一切都当做整数类型来处理。Python 对整数的唯一限制是 RAM 的大小。那两个除法在那个公式里无论如何都是整数(想想为什么),所以用//代替也没问题。让我们在 n=200 时再试一次:

它非常好用:

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

40 个或更少的土豆变坏的几率约为 54%。这很粗略,但是嘿,你是去工作的,不是去享受美食的,所以坚强点,同志。

工业规模马铃薯种植

有时我们会失败。有时我们会成功。有时候,就像他们在东欧集团常说的,我们太成功了。

尽管土豆烂了,你的厨艺还是很棒,现在你得为整个工厂做晚饭了。对许多饥饿的工人来说,这相当于 2000 个土豆。带上你的队友,跳上卡车,开到火车站。为了祖国的荣耀。

你从火车上带回来的赏金中,400 个或者更少的土豆会是坏的几率有多大?更改代码,使 n=2000,然后再次运行它。结果相当令人难过:

---------------------------------------------------------------------------
OverflowError                             Traceback (most recent call last)
<ipython-input-5-d85e2d80093f> in <module>
      7 # compute probabilities for all k
      8 for k in tqdm(range(n + 1)):
----> 9     df.loc[k] = bin_prob(n, p, k)<ipython-input-4-88c12493fe27> in bin_prob(n, p, k)
      1 def bin_prob(n, p, k):
      2     arr = math.factorial(n) // math.factorial(k) // math.factorial(n - k)
----> 3     bp = arr * (p ** k) * ((1 - p) ** (n - k))
      4     return bpOverflowError: int too large to convert to float

我们正在尝试计算 2000!在那里。那个号码有 5736 个数字。在普通 Python 中,您无法解决这个问题。这个整数很好,但是你必须让它和 float 一起运行,而普通 Python 在这个范围内不支持 float。

小数来救场。它可以处理任意数量的数据。默认情况下,它的工作精度为 28 位,但是您可以根据需要将其更改为任意值,在某些情况下,它确实会动态更改。

import decimal
print(decimal.getcontext())
Context(prec=28,
        rounding=ROUND_HALF_EVEN,
        Emin=-999999,
        Emax=999999,
        capitals=1,
        clamp=0,
        flags=[],
        traps=[InvalidOperation, DivisionByZero, Overflow]
)

它甚至嵌入了一些数学函数,所以 int(decimal。上下文()。幂(2,3))是 2 = 8。在处理格式时,您可能需要将格式转换成十进制,然后再转换回常规的 float 或 int,但这对于消除大小限制来说是很小的代价。只是要记住它比普通的数学图书馆慢一点,所以只有在紧急情况下才打碎这个玻璃。

让我们来修正我们的函数:

我们用 Decimal()包装所有内容的原因是我们在处理浮点值;如果这些参数是整数,ctx.power()会直接接受它们。最后,在我们返回它之前,我们把十进制格式转换成浮点数。

哇,这有用吗:

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

400 个或更少的土豆变坏的概率是 51%。也许你不会为整个工厂做饭太久。

到无限和更远

十进制很牛逼。我已经把它提高到 n=20000。它花了 10 分钟完成,单线程,但它做了工作。此时,您可能希望切换到多处理。

源代码

如果你想看 Jupyter 的笔记本,里面有本教程的全部代码,这里有

捷径

当然,您总是可以导入 scipy 并使用库函数进行相同的计算…

import scipy.stats as ss
n, p, k = 2000, 0.2, 40
ss.binom.cdf(k, n, p)

…这将为您提供上面艰难计算出的相同的累积概率(如果您想要普通概率而不是累积概率,请使用 pmf()而不是 cdf())。

但这不是重点——重点是展示 Python 如何处理专业库之外的大量数据,并在此过程中探索一些统计数据。

信用

《统计学的基本实践》,第 8 版,作者摩尔、诺茨和弗利格纳

非本人制作的图片来源:

[## 苏联柴油动力由 jpachl 对 DeviantArt

1986 年夏天,一列由苏联制造的 M62 发动机(东德 120 级)为首的货运列车正在等待…

www.deviantart.com](https://www.deviantart.com/jpachl/art/Soviet-diesel-power-807993256) [## 马铃薯

马铃薯是一种原产于美洲的块根蔬菜,是马铃薯的淀粉块茎,也是一种植物…

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

门控线性网络在线学习的潜力

原文:https://towardsdatascience.com/the-potential-of-gated-linear-networks-for-online-learning-70ca5ea073a?source=collection_archive---------37-----------------------

DeepMind 最近的一份出版物对样本高效在线学习提出了一个有趣的新观点。

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

门开着,进来吧。(照片由Á·加萨·德品内Unsplash 上拍摄)

现代深度学习系统的两个最大缺点是它们对数据的渴望程度和训练时间(我在看着你 GPT-3 )。这些系统在训练时可以访问它们的所有数据,并且在它们的许多学习时期中多次重新访问每条数据。因此,当你将这些技术应用于在线学习时,毫不奇怪它们并没有真正起作用。

当在“离线设置”(即针对多个时期的静态数据)中训练的模型被部署到现实世界中时,它们无法利用新看到的数据,因为它们的参数被冻结,这意味着它们不再学习。如果底层数据分布不变,这是没问题的,但在现实世界中通常不是这样。考虑零售推荐:一个项目的受欢迎程度会随着时间的推移而消长,这意味着一个静态的系统将提供不一致和过时的推荐。一种解决方案是定期用收集到的所有新数据重新训练系统,但现实世界与模型所学之间仍有差距。

另一方面,在线学习系统从每一段数据中顺序学习,因此可以更快地适应变化(并且不必重新部署)。这代表了与离线学习完全不同的学习场景。DeepMind 最近的一项技术,门控线性网络,提出了一种新的在线学习方法,可以与等效的离线学习技术相媲美。

门控线性网络有什么不同?

门控线性网络最酷的一点是网络中的每个神经元都可以单独预测目标。

在神经网络分类器中,神经元按层排列,较浅的层向较深的层提供输入。为了学习,预测的结果(即最终网络输出的损失)通过反向传播通过网络向上传回,并且每个神经元被稍微调整以减少这种损失。网络的前向传递产生预测,后向传递更新网络以(有希望地)提高性能。正如 DeepMind 的门控线性网络论文中所说:

反向传播长期以来一直是事实上的信用分配技术,是诸如卷积神经网络和多层感知器(MLPs)之类的流行神经网络架构的成功训练的基础。

关于门控线性网络(GLNs)的一个有趣的事情是,它们不使用反向传播。虽然反向传播在允许网络学习“高度抽象的特定任务特征”方面是有效的,但训练这些系统的过程需要许多时期和大量数据。从训练过程中去除反向传播克服了这些问题,这意味着 GLN 可以在数据集的单次传递中进行训练,使其适合在线学习。

然而,在不使用反向传播的情况下,网络(即最终层)的预测误差如何返回到网络的较浅层?GLN 的酷之处在于网络中的每个神经元**都单独预测目标。这意味着你可以选取网络中的任何一个神经元,并将其输出解释为最终预测。例如,如果你正在对猫(0)和狗(1)进行训练,而一个 GLN 神经元预测 0.9,那么它非常有信心这个特定的输入是一只狗——**并且你可以对网络中的任何神经元进行训练!相比之下,如果没有网络的上下文,常规神经网络中神经元的输出是没有意义的;只有最后一层神经元的输出实际上与预测目标有任何关联。

当 GLN 中的每个神经元预测目标时,它们可以在本地进行训练,而无需通过网络传回任何信息。给定一些输入信息,神经元进行预测,将其与输出标签进行比较,并更新其权重,而不依赖于最终的网络输出。尽管如此,神经元仍然是分层排列的;浅层神经元的输出形成了深层神经元的输入。网络的前向传递与传统神经网络基本相同,只是后向传递发生了变化。

在门控线性网络神经元内部

GLN 中的一个神经元产生一个二元事件的概率预测。这样做的内部机制使用门控几何混合:一种将一组不同的概率预测组合成单个预测的方法。为了理解引擎盖下到底发生了什么,我们必须首先理解门控几何混合。

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

天气预测的几何混合——你相信谁会告诉你带把伞?

假设你醒来想知道当天晚些时候是否会下雨,但是你并不真正相信任何单一的信息来源(从什么时候开始气象员可以预测天气了?)。你可以查看各种天气预报来源:气象局、你的室友、、你最喜欢的古代天气知识——他们都会给出不同的预报,你对每个来源的信任程度也不同。几何混合是一种数学模型,它允许你将不同的概率预测组合成一个单一的预测,因此你可以决定是否带一把伞去工作(除非你被困在家里工作)。每个信息源可以基于其可靠性而被不同地加权;如果输入源确实不正确,几何混合甚至允许负权重。

在某些条件下,一些天气来源可能比平时更可靠,而另一些则不那么可靠。如果早上天气晴朗,你的室友可能会有一种不可思议的正确预测下午天气的能力。这是门控几何混合的门控部分:在给定一些其他数据(称为边信息)的情况下,改变输入数据的权重。输入数据是相同的,但是你改变了每个信息源的权重,从而得到不同的结果。

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

你更信任你的室友,因为现在天气晴朗,而且你可以更准确地预测当天下午是否会下雨。

所以在内部,GLN 中的神经元正在执行门控几何混合。它结合先前神经元的预测,并使用由一条附加边信息确定的一组权重,产生自己的单个预测。网络的最后一层仅由单个神经元组成,这提供了网络的整体预测。网络中的每个神经元通过将自己的预测与目标标签进行比较来更新其几何混合权重,通知它哪些输入源更可靠并且将来应该被信任。

大局

如果我们再次缩小来考虑整个网络,就有可能拼凑出 GLN 是如何做出预测的。它需要从一些初始的基本预测开始,以输入到网络中;这些通常只是输入数据的简单转换。然后,网络的每一层开始进行预测,这些预测可以输入到后续的层中,每一层都有希望做出比前一层更好的预测。边信息允许神经元切换它们当前使用的权重集,以更适合当前的上下文。

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

GLN 的表现与流行的离线学习方法的比较。(来源 DeepMind )

DeepMind 在一些不同的数据集上将他们的 Gln 与现有的机器学习技术进行了比较。在这些实验中,GLNs 仅被训练一个时期(即,仅一遍数据),而其他系统被训练 100 个时期。尽管每段数据只看一次,GLNs 的性能与其他技术相当,证明了它们的样本效率和用于在线学习的潜力。

我目前正在编写门控线性网络的 Python 实现,以便用它们进行实验;期待在不久的将来会有更多关于它们如何工作的讨论和更好的细节!

算法群体的力量。

原文:https://towardsdatascience.com/the-power-of-algorithmic-crowds-be930baf2139?source=collection_archive---------39-----------------------

数字是有力量的…甚至对于机器学习算法也是如此。

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

罗布·柯伦在 Unsplash 上的照片

介绍

在詹姆斯·苏洛维耶茨基(James Surowiecki)的《群体的智慧》(The Wisdom of Crowds)一书中,可以找到关于群体力量的最引人入胜的历史例子之一。在该书中,一个由工程师、海洋学家、打捞人员和数学家组成的团队被要求对可能在哪里找到某艘沉没的潜艇“蝎子号”(Scorpion)做出最佳估计(海军没有足够的人力来搜索整个区域,需要更具体的猜测)。就个人而言,这些猜测非常不准确,但是小组的综合平均猜测距离沉没潜艇的实际位置只有 220 米!

事实反复证明,得出一个估计值的最好方法是询问许多不同背景的人——越多越好。我们如何将这一社会学概念应用于机器学习?

集成学习

集合模型只是模型的集合,这些模型被平均以提供“群体的猜测”正如人类有偏见一样,模型也带有固有的假设和偏见。在几个模型中取平均值几乎可以保证减少误差。

数据

对于这个例子,我使用了来自 Kaggle 的一些信用卡欺诈数据。第一项工作是选择一个评估标准。我注意到有一个巨大的类别不平衡 (99.8%的数据被标记为正常交易量,另外 0.2%是欺诈性交易),因此准确性指标不在考虑范围内。对于这类问题,最好选择精度,召回,或者 F1 的分数。为了简单起见,我选择了精确。

模特们

看了一下数据后,我训练了五个模型:K-最近邻、逻辑回归、随机森林、XGBoost 和朴素贝叶斯。每一次之后我得到的精度如下表所示。

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

五种不同算法的精度。

显然,朴素贝叶斯和 KNN 分类器并不理想,但其他三个做得相当好。我们使用单个模型的最大精度是 0.96。记住这个数字。

民主(几乎)

将这些输出转化为“类似人群”格式的方法之一是让每个模型根据其收到的答案进行投票。本质上,如果随机森林算法预测为 0,它会投“0”如果所有其他算法都预测 1,它们都会投“1”这意味着最终的结果是四个 1 和一个 0。在这种情况下,最终输出将是 1。

我使用了一个“加权投票模型”,其中表现最好的模型拥有最多的票数。下面的图表详细说明了我给每个算法投了多少票。

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

给每个算法的投票。

这些数字是由每个模型的相对精度决定的。现在让他们投票吧!

结果呢

运行投票方法后,我收到了以下结果:

预测值:0,实际值:0 → 56,868(真负值)

预测:1,实际:0 → 2(假阳性)

预测:0,实际:1 → 21(假阴性)

预测:1,实际:1 → 71(真阴性)

**这转化为 0.973 的精度!**请注意,对于该数据,假阴性是代价最高的结果,因为这意味着交易是欺诈性的,但我们的模型预测是正常的交易。

为了证明群体比个人更好,这里有一个图表,显示了每个算法被群体正确“投票否决”的次数(即一个算法投票不正确,但其他算法投票正确,因此“投票否决”了第一个算法)。

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

个人失误但群体成功的事件。

正如所料,我们的朴素贝叶斯模型被否决的次数最多,但即使是随机森林也被其他算法正确否决了 23 次!朴素贝叶斯模型也在投票中胜出,所以即使它不是表现最好的,它仍然是有用的。

结论

使用集成方法的好处包括将糟糕的模型变成重要的投票。这种方法几乎没有缺点,应该是每个数据科学家的工具箱中的一项。使用超参数优化可以获得更好的结果,但是我在这个例子中只使用了股票模型。

如果你喜欢这篇文章,你可以关注我以获得更多类似的内容。感谢阅读!

使用 PyMC3 估计贝叶斯推理的能力

原文:https://towardsdatascience.com/the-power-of-bayesian-inference-estimated-using-pymc3-6357e3af7f1f?source=collection_archive---------32-----------------------

内部 AI

如果您因为贝叶斯回归的复杂性而避开了它,那么本文将展示如何在 Python 中将简单的 MCMC 贝叶斯推理应用于带有异常值的线性数据,使用线性回归和高斯随机游走先验,测试关于正态与 Student-T 先验分布的观测误差的假设,并与普通最小二乘法进行比较。

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

Ref:Jupyter 笔记本 GitHub 资源库

贝叶斯方法的美妙之处在于,它们能够根据对模型参数行为的先验预期,生成衍生模型质量的概率估计。我们得到的不是单点解,而是每个解都有指定概率的分布。对数据行为的先验预期被公式化为一组先验*,即模型参数的概率分布。*

以下场景基于 Thomas Wiecki 的精彩文章“GLM:稳健的线性回归”,探索了 Python 库 PyMC3 作为使用 Python 中的马尔可夫链蒙特卡罗(MCMC)方法对数据建模的方法,并讨论了派生的贝叶斯模型的预测能力。考虑了不同的先验,包括正态、Student-T、Gamma 和 Gaussian 随机游走,目的是使用广义线性模型(GLM)和采用非参数方法对样本数据进行建模,从估算的先验直接估计观测数据。

抽样资料

我们的样本数据生成为一个简单的线性模型,具有给定的截距和斜率,并在每个观测值中添加了一个额外的随机高斯噪声项。为了使任务有趣,少量的离群值被添加到与真实线性模型没有代数关系的分布中。我们的目标是尽可能接近地模拟观察到的线性模型,对异常值和观察误差项的破坏具有最大可能的鲁棒性。

正常与学生-T 优先

我们比较了基于正态和 Student-T 观察误差先验的模型。Wiecki 表明,由于分布具有较长的尾部,Student-T 先验在处理异常值方面优于正态分布,传达了异常值不应被视为完全意外的概念。

真实线性模型和普通最小二乘(OLS)回归

我们从 y=ax+b+epsilon 形式的模拟观察数据集开始,噪声项 epsilon 来自正态分布。这里,我们 1)根据“真实”线性模型,在 0 到 1.5 的范围内创建观察值,2)添加测试异常值,3)将 x 轴从 1.5 扩展到 3.0,这样我们就可以测试我们的模型在该区域的预测能力。

在预测区域中,我们使用了 numpy。MaskedArray()

可视化模拟数据以及真实回归线和普通最小二乘回归非常有用。

Seaborn 库允许我们绘制这个 directly⁴图,我们还可以设置一个’健壮的’标志来计算回归线,同时去除离群值的权重。

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

样本点图、真实回归线、普通最小二乘回归(OLS)和稳健 OLS。

PyMC3 贝叶斯回归

F 按照 Wiecki 的例子,我们可以在 PyMC3 中创建线性回归模型(GLM),从 y(x)=***‘y ~ x’***生成线性模型。

为了测试稳健回归的概念,我们创建了两个模型,一个基于观测误差的正态先验,另一个基于 Student-T 分布,我们预计其受异常值的影响较小。

***pymc 3 . sample()***方法允许我们对条件先验进行采样。在正常模型的情况下,默认先验将用于ε中的截距、斜率和标准差。在 Student-T 模型的情况下,先验将用于截距、斜率和 lam⁷.

运行这两个模型创建了 trace 对象,这些对象包含在所有链上为每个模型采样的一族后验概率,以观察结果为条件,从中我们可以绘制各个 glm 回归线。

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

样本点图、真实回归线和贝叶斯线性模型,具有正态和学生 T 先验

正态与学生 T 误差分布的比较

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

参数分布的汇总可以从***pymc 3 . summary(trace)***中获得,我们在这里看到,来自 Student-T 先验的截距为 1.155 ,斜率为 **2.879。**因此比正常先验更接近于 1,3 的期望值,这给出了截距 2.620 ,斜率 1.608

Student-T 误差分布的细化

从上面的图中可以清楚地看出,我们已经通过使用 Student-T 先验改进了回归,但是我们希望通过改进 Student-T 自由度参数来做得更好。

**模型:**正态模型的标准偏差先验分布是一个半柯西分布,一个具有一个⁴自由度的正域 Student-T,它反映了我们之前的模型。

我们还需要构建一个新的 Student-T 模型,其中除了参数化 glm 之外,我们还在自由度参数 nu 上创建一个先验。

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

***结果:*总结(迹) 我们可以看到,从 Student-T 误差分布得到的截距改进为 1.144 ,斜率 2.906 相对于之前的结果 1.155 ,斜率 2.879

可视化可信区间:**拟合线性模型并获得每个样本的截距和斜率后,我们可以计算出轴上每一点的期望 y( x) ,然后使用*numpy . percentile()*将这些样本聚合到可信区间中(CI)⁹在 x )。

当所有马尔可夫链的所有值都保存在跟踪对象中时,我们可以将采样的条件先验的平均值、50%和 95%的可信区间可视化。下面清楚地说明了 Student-T 模型的可信区间与真实回归的接近程度。

在本文的后面,我们考虑一个非参数模型,该模型遵循线性趋势线,同时对观测值的波动进行建模,这可以传达我们可能希望保留的局部信息。

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

具有正态和学生 T 先验的贝叶斯线性模型的可信区间图

后验预测能力

B ayesian 推理通过寻求对参数化先验概率分布的修改来工作,以最大化先验参数上观察数据的似然函数。

那么,在样本数据缺失的地区,预期后验概率会发生什么变化呢?我们应该发现,考虑到误差项引起的波动,后验预测遵循回归线。

模拟未观测数据

我们已经创建了一个y _ 预测的** 观察值阵列,该阵列在区域 1.5 到 3 中被屏蔽,表明这些是 未观察到的 样本。PyMC3 添加这些缺失的观察值作为新的先验值, y_missing ,并计算整个样本空间的后验分布。**

用这个扩展的样本空间重新运行上述模型产生了现在包括估算的观察值的统计数据。

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

当我们运行这个模型时,我们在 摘要 中不仅看到 a0、b0、nu0 的先验,还看到所有缺失的 y,如 y_0_missing。

推断出预测样本观测值的全部范围后,我们可以绘制这些后验均值以及可信区间。

我们在下面看到,推断的观察值已经很好地符合预期的线性模型。

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

具有正态和 Student-T 先验的贝叶斯线性模型的预测样本图

非参数推理模型

验证了线性模型之后,如果我们能够用非参数模型对这些样本观察值进行建模,那就太好了。在非参数模型中,我们无需寻找截距和斜率参数,而是尝试使用样本空间中每个数据点的先验信息直接对观察数据进行建模。

非平稳数据和随机游走先验

非参数模型的简单假设是数据是稳定的,因此每个数据点的观察样本不会以系统的方式呈现趋势。

但是真实世界的数据确实经常趋向于,或者至少受到相邻数据点的平滑要求的约束,因此先验的选择是至关重要的。

在我们的方案中,数据是不稳定的,因为它在 x 上有一个明显的趋势。如果我们对我们的观测值使用简单的高斯先验,那么即使在用观测数据进行调节之后,只要我们进入未观测区域,预测的观测值就会迅速返回到它们的先验均值。

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

y 上具有平稳先验的非参数模型的预测样本图,适用于正态和 Student-T 先验

高斯随机游走先验

G 高斯随机游走先验为我们提供了对非平稳数据建模的能力,因为它基于之前的数据点状态加上一个随机游走步骤来估计一个可观测值。PyMC3 实现还允许我们模拟一个漂移参数,该参数为每个随机行走步骤添加一个固定的标量。

在这两个推理模型中,我们使用了单个标量漂移参数,在这种情况下,该参数相当于数据在漂移方向上的斜率。

重要的是,数据(包括异常值)以相等的样本步长正确排序,因为先验将在数据建模中假设这种行为。由于这个原因,离群值被插入到 x 数组的索引点,而不是被附加为(x,y)。

下面我们运行两个模型,第一个模型的漂移参数设置为零,导致最后一个观测点的静态线,第二个模型的漂移是从数据中推断出来的。

可以看出,这个最终模型非常好地拟合了线性趋势,特别是在使用受异常值影响较小的 Student-T 先验时。

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

对于正态和 Student-T 先验,在 y 上无漂移的随机游走的非参数模型的后验均值图

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

对于正态和 Student-T 先验,在 y 上随机游走的非参数模型的后验均值图

绘制高斯随机游走后验样本

此外,我们现在可以看到局部扰动中的异常值对线性的影响。

下面我们来看一些实际的随机漫步样本。

我们不应该期望任何特定的路径接近样本数据的实际预测路径。从这个意义上说,这是一个真正的随机方法,因为我们的结果是从采样路径的统计平均值得出的,而不是从任何特定的样本路径得出的。

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

具有 y 上漂移先验的随机游走的非参数模型的预测样本图,适用于正态和学生 T 先验

异常值对随机游走预测后验概率的影响

已经看到异常值对后验均值的影响,我们推测预测样本的噪声可能是由于异常值引起的随机游走的扰动。

为了测试这一点,我们在这里删除了异常值,并重新运行相同的两个预测模型。

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

无异常值数据的预测后验均值图,具有 y 上的漂移先验的随机游走,用于正态和学生 T 先验

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

无异常值数据的预测样本图,具有 y 上的漂移先验的随机游走,用于正态和学生 T 先验

可以看出,预测样本要干净得多,在随机游走样本中具有非常紧密的可信区间和小得多的偏差。这给了我们信心,对于正确的模型,高斯随机游走是非平稳模型拟合的良好条件先验。

结论

本文的目的是展示使用 PyMC3 进行贝叶斯学习的简单性和强大功能,希望我们已经:

  • 表明在稳健线性回归中,Student-T 误差先验比正态先验表现更好;
  • 证明了在 Student-T 误差先验上改进的自由度提高了对回归线的拟合;
  • 显示了我们可以快速和容易地绘制线性回归和非参数模型的后验样本的置信区间;
  • 证明了使用具有漂移的高斯随机游走的非参数模型可以预测未观测区域中的线性模型,同时允许我们可能想要保留的观测数据中的模型局部波动;
  • 研究了高斯随机游走先验,并表明其混沌行为允许其探索广泛的样本空间,同时不妨碍其生成平滑的预测后验均值。

感谢阅读,请随时添加评论或更正。完整的源代码可以在 Jupyter 笔记本GitHub 资源库中找到。

参考

[1] T .威茨基, GLM:稳健线性回归 (2018),PyMC3

[2] J. Salvatier1,T. Wiecki,C. Fonnesbeck,使用 PyMC3 在 Python 中进行概率编程 (2016),PeerJ 计算机科学

[3] J. Salvatier1,C. Fonnesbeck,T. Wiecki, GLM:具有异常值检测的稳健回归 (2016),PyMC3

[4] M. Waskom,seaborn . reg plot(2012–2020),seaborn.pydata

[5] J. Jones,M. Mastanduno,T. Larsen,机器学习与统计:何时使用每一个—healtc care . ai(https://healthcare.ai/Machine-Learning-vs-Statistics-use/),health care . ai

[6]达林,线性回归 vs 贝叶斯回归 (2017),教育研究技术

[7] PyMC3 开发团队,连续发行 (2018),PyMC3 API

[8] A. Gelman,学生最佳实践-T 优先 (2015),统计建模,因果推断

[9] 贝叶斯可信区间 (2020),维基百科

[10] PyMC3 开发团队,推断抽样 (2018),PyMC3 API

[11] P. Orbanz,Y. W. Teh,贝叶斯非参数模型 (2010),牛津大学统计系

[12] T .约尔达诺娃,平稳和非平稳过程介绍 (2020),Investopedia

[13] A. Gelman,优先选择建议 (2020),斯坦-dev/斯坦

[14] Hiro,贝叶斯回归使用 PyMC3 (2019)

[15] Paul, PYMC3 贝叶斯预测锥 (2017)堆栈溢出

数据的力量:我的野外之旅

原文:https://towardsdatascience.com/the-power-of-data-science-my-journey-into-the-field-84043f61963f?source=collection_archive---------41-----------------------

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

Unsplash 上的 Matese Fields 拍摄

在意想不到的地方发现数据科学

我的数据科学之旅始于一个我从未预料到的地方。在我大学学习数学的时候,我拿起了查尔斯·杜希格的名著《习惯的力量》。我一直对行为心理学感兴趣,我的几个朋友曾向我推荐过它。这很大程度上是一本关于习惯如何在商业场景中形成、改变和巧妙利用的书,但杜希格很狡猾,通过几个有趣而难忘的故事解释了习惯的力量。

当时,我正在学习成为一名数学老师,但我对学术界的兴趣正在减弱,我正在考虑其他选择。杜希格在书中讲述的两个故事包括数据科学的出色应用,这些应用在各自的领域产生了巨大影响。这些故事立即抓住了我的注意力,让我看到了数据的力量。我记得我对自己说,“伙计,如果我能找到一份这样的工作……那将是一个梦想!”

现在,两年后,我是一名研究数据科学的硕士研究生,并在该领域寻求职业生涯。我想在这篇文章中分享最初激发我对数据世界兴趣的故事。它们改编自杜希格的书。

目标的怀孕预测值:

我敢肯定,大多数数据爱好者现在都听说过关于 Target 怀孕预测器的故事。作为一个没有数据背景,也很少接触数据的许多用途的人,我被震惊了。这个故事让我大吃一惊!

一天下午,营销部门问为 Target 工作的数据专家安德鲁·波尔(Andrew Pole ),他是否可以建立一个模型来预测他们的哪些客户怀孕了。你可能会问,为什么?

几乎没有比这更有利可图、渴求产品、对价格不敏感的集团存在了。不仅仅是尿布和湿巾。有婴儿的人太累了,他们会买他们需要的一切——果汁和卫生纸,袜子和杂志——无论他们在哪里购买奶瓶和配方奶粉。更重要的是,如果一个新的父母开始在塔吉特购物,他们会持续回来很多年。

查尔斯·杜希格

因此,新父母利润惊人,但是塔吉特怎么知道如果新父母开始在塔吉特购物,他们会持续回来很多年?

这个问题的答案可以在现代营销理论中找到:人们的购物习惯在重大生活事件后更有可能改变。有什么比生孩子更大的人生大事?是的,初为人父母的人会买很多东西,但与他们通过改变购物习惯所获得的利润相比,他们最初购买的收入根本不算什么。

这就是为什么零售店会不择手段寻找新的父母。一些大公司,如华特·迪士尼公司,甚至向产科病房的新妈妈赠送礼品篮。然而,塔吉特想要做得更好。他们想抢先那些大公司一步。如果他们能识别出怀孕的妇女并把她们带进他们的商店,他们就会抢在别人之前抓住她们。因此,目标要求提供一名怀孕预测员。

波尔急切地接受了挑战。他开始深入 Target 的婴儿送礼会登记簿,分析他所知道的怀孕女性的购物习惯。由于这些妇女向 Target 提供了她们的预产期,Pole 能够将预产期与她们的购买历史联系起来,以确定她是在哪个三月购买的。

通过收集所有的信息,他能够识别出大约 25 种不同的产品,当用于数学模型中时,可以预测女性的孕期和预产期。

住在布鲁克林的 35 岁的 Liz Alter 购买了五包毛巾、一瓶“敏感皮肤”洗衣液、宽松的牛仔裤、含有 DHA 的维生素和一系列保湿霜?她有 96%的机会怀孕,可能会在五月初分娩。39 岁的旧金山人凯特琳·派克购买了一辆价值 250 美元的婴儿车,但除此之外什么也没买?她可能是为朋友的婴儿送礼会买的。另外,她的人口统计数据显示她两年前离婚了。

查尔斯·杜希格

一旦应用于 Target 数据库中的所有女性,该算法就可以识别出数十万名可能怀孕的女性及其预产期。Target 可以向他们发送针对他们可能会在购物习惯最容易改变的最佳时间购买的产品的广告。即使只有一小部分女性和她们的家人继续在塔吉特购物,塔吉特也会让她们的收入增加数百万。

这就是问题所在!这种模式投入使用大约一年后,一名男子走进明尼苏达州的塔吉特百货公司,抱怨他们给他正在上高中的女儿发婴儿服装和婴儿床的广告。经理道了歉,几天后又打电话来再次道歉。父亲很尴尬。

“我和女儿谈过了,”他说。“原来我家里有一些活动,我并没有完全意识到。”他深吸了一口气。“她的预产期在八月。我欠你一个道歉。”

查尔斯·杜希格

所以,这个算法起作用了——真的很好!

现在,当然,你可以争论这是否道德,但是不可否认这是完全的智慧和预测模型的力量。巧妙利用数据可以取得惊人的成就。

击中宋的科学:

除非你在过去的二十年里一直生活在岩石下,否则你一定听过这首歌“嘿呀!”由 2000 年代早期最受欢迎的音乐团体之一 OutKast 演唱。如果没有对数据的巧妙运用,这首歌可能永远不会变得像以前那么大,现在依然如此。

在 21 世纪初,音乐行业开始使用数据策略来预测听众的习惯。多音 HMI 是一家成立于西班牙巴塞罗那的音乐分析公司,它开发了一个名为热门歌曲科学(Hit Song Science)的程序,预测一首曲子是否有可能成功。他们使用了几个特征,如速度、音高、旋律和和弦进行来实现这一点。

大约在同一时间,奥特卡斯特制作了歌曲“嘿呀!”唱片公司正在联系 DJ,说这首歌会很受欢迎。当他们通过热门歌曲《科学》进行测试时,它获得了前所未有的最高分。这首歌会大受欢迎的!然而,人们花了一些时间才意识到热门歌曲科学模型已经知道了什么。

一家测量广播听众的公司 Arbitron 开发了一种新技术,可以显示在特定时间有多少人在收听广播电台。它还可以显示听众何时换台。他们在费城排名前 40 的电台 WIOQ 上测试了这一点,该电台开始播放“嘿呀!”人们对听众会喜欢这首歌的期望很高,但他们发现三分之二的听众在这首歌的前 30 秒内换了台。听众鄙视“嘿呀!”发生了什么事?

一个试图回答这个问题的人是 Rich Meyer。迈耶设计了描述广播听众趋势的公式,并为广播电台增加听众提供了见解。他花了很多时间研究的一个问题是,为什么某些歌曲会导致很少人换台。DJ 称这些歌曲为“粘性”当“嘿呀!”被释放后,他开始摆弄阿比创收集的数据。他也坐下来听了几首被认为有粘性的歌,发现了一些有趣的东西。

迈耶意识到粘性歌曲听起来不一定彼此相似,但它们听起来完全符合他对特定流派歌曲的预期。他们听起来都很熟悉。

做决定需要很大的脑力劳动。很多时候,我们实际上并没有选择喜欢或者不喜欢某样东西。相反,我们的大脑遵循一种习惯,对线索和奖励做出反应。对习惯做出反应需要更少的精神努力,让我们可以把更多的精力放在其他更重要的活动上。当然,所有这些都是下意识发生的。

例如,当我们在收音机里听到一首熟悉的歌曲时(提示),我们会被奖励以跟着唱或哼的能力。这就形成了持续倾听的常规或习惯。我们甚至不用再去想它了。当一首歌开始时,我们要么跟着唱,要么换台。

这就是为什么“嘿呀!”没人听。它还不熟悉。广播听众不想有意识地决定他们是否喜欢它,所以他们通过改变电台来回应他们的习惯。

问题是像热门歌曲《科学》这样的计算机程序非常擅长预测人们的习惯。但是有时候,那些算法发现了实际上还没有出现的习惯…“嘿呀!”需要成为一个既定的聆听习惯的一部分,才能成为热门。

查尔斯·杜希格

电台 DJ 需要做出“嘿呀!”感觉很熟悉,为了做到这一点,他们使用了现在教科书上的播放列表理论。他们夹着“嘿呀!”介于里奇·迈耶认为很黏的那类歌曲之间。WIOQ 采用这一策略后不久,更换电台的听众比例从 26.6%下降到 13.7%。两个月后,下降到 5.7%。使用相同技术的其他电厂也经历了类似的趋势。

当听众听到“嘿呀!”一次又一次,它变得熟悉起来。一旦这首歌流行起来,WIOQ 就播放“嘿呀!”一天多达十五次。人们的倾听习惯已经转变为期待——渴望,甚至是“嘿呀!”一声“嘿呀!”习惯出现了。这首歌后来赢得了格莱美奖,卖出了超过 550 万张专辑,并为电台赚了数百万美元。

查尔斯·杜希格

最终,现实追上了计算机程序已经知道的东西:“嘿呀!”会变得很大!这就是数据的力量。

[1]: 杜希格,查尔斯。习惯的力量:为什么我们在生活和商业中做我们该做的事。纽约:兰登书屋,2012 年。打印。

机器学习中集成方法的力量

原文:https://towardsdatascience.com/the-power-of-ensemble-methods-in-machine-learning-7ddd28d7d8e6?source=collection_archive---------38-----------------------

如何通过装袋和增压来提升性能

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

张阳Unsplash 上的照片

一般来说,在团队中工作的人比个人更有可能表现得更好。群体的一个优势是他们能够从许多不同的角度来完成一项任务,而这对于个人来说是不可能的。我们没有意识到的问题可能会被同事发现。分组的优势也适用于机器学习模型。我们可以通过对个别弱学习者进行分组来创建一个健壮的、高度精确的模型。在机器学习领域,集成方法用于组合基础估计器(即弱学习器)。两种类型的集成方法是平均(例如 bagging)和增强(例如梯度增强、AdaBoost)。

集成方法不仅提高了性能,而且降低了过拟合的风险。考虑一个评估产品性能的人。一个人可能过于关注某个特定的特征或细节,因此无法提供一个很好的概括评价。另一方面,如果一群人评估产品,每个人可能会关注不同的功能或细节。因此,我们降低了过于关注一个特性的风险。最后我们会有一个比较概括的评价。类似地,集成方法导致良好的一般化模型,从而降低过拟合的风险。

装袋

打包意味着聚合几个弱学习者的预测。我们可以把它想成平行结合弱学习者。将几个弱学习者的预测平均值作为整体预测。最常见的使用 bagging 方法的算法是随机森林

随机森林的基本估计器是决策树,它通过反复提问来划分数据。随机森林是由多个决策树结合 bagging 方法构建的。如果用于分类问题,总体预测基于从每个决策树接收的结果的多数投票。对于回归,叶节点的预测是该叶中目标值的平均值。随机森林回归取决策树结果的平均值。

随机森林的成功高度依赖于使用不相关的决策树。如果我们使用相同或非常相似的树,总体结果将不会比单个决策树的结果有太大的不同。随机森林通过自举特征随机性实现不相关的决策树。

bootstrapping是从带有替换的训练数据中随机选取样本。它们被称为 bootstrap 样本。下图清楚地解释了这一过程:

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

图源

特征随机性通过为随机森林中的每个决策树随机选择特征来实现。随机森林中每棵树使用的特征数量可通过 max_features 参数控制。

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

特征随机性

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

自助样本和特征随机性为随机森林模型提供了不相关的树。

超参数是学习算法的关键部分,它影响模型的性能和准确性。随机森林的两个关键超参数是 max_depthn_estimators。

max_depth: 一棵树的最大深度。树的深度从 0 开始(即根节点上的深度为零)。如果未指定,模型会一直拆分,直到所有叶子都是纯的,或者直到所有叶子包含的样本数少于 min_samples_split。过度增加深度会产生过度配合的风险。

n_estimators: 代表一个森林中的树木数量。在一定程度上,随着森林中树木数量的增加,结果会变得更好。然而,在某个点之后,添加额外的树不会改进模型。请记住,添加额外的树总是意味着更多的计算时间。

助推

Boosting 就是把系列的几个弱学习者组合起来。我们最终从许多顺序连接的弱学习者中得到一个强学习者。梯度增强决策树(GBDT)是最常用的集成学习算法之一。像在随机森林中一样,GBDT 中的弱学习器(或基估计器)是决策树。然而,组合决策树的方式是不同的。

梯度提升算法以这样的方式顺序地组合弱学习器,即每个新的学习器适合于来自前一步骤的残差,从而改进模型。最终的模型汇总了每一步的结果,从而形成了一个强学习者。梯度提升决策树算法使用决策树作为弱学习器。损失函数用于检测残差。例如,均方误差(MSE)可用于回归任务,对数损失(log loss)可用于分类任务。值得注意的是,当添加新的树时,模型中现有的树不会改变。添加的决策树符合当前模型的残差。

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

梯度推进决策树

学习率n 估计量是梯度推进决策树的两个关键超参数。学习率,表示为α,简单地表示模型学习的速度。每增加一棵树都会修改整个模型。修改的幅度由学习速率控制。

学习率越低,模型学习越慢。较慢的学习速率的优点是模型变得更加健壮和通用。在统计学习中,学习速度慢的模型表现更好。但是,慢慢的学习是要付出代价的。训练模型需要更多的时间,这就引出了另一个重要的超参数。 n_estimator 是模型中使用的树的数量。如果学习率低,我们需要更多的树来训练模型。然而,我们需要非常小心地选择树的数量。使用太多的树会产生过度适应的高风险。

关于过拟合的说明

随机森林和梯度推进决策树之间的一个关键区别是模型中使用的树的数量。增加随机森林中的树木数量不会导致过度拟合。在某个点之后,模型的准确性不会因为添加更多的树而增加,但是也不会因为添加过多的树而受到负面影响。由于计算原因,您仍然不希望添加不必要数量的树,但是没有与随机森林中的树的数量相关联的过度拟合的风险。

然而,梯度推进决策树中的树的数量在过度拟合方面非常关键。添加太多的树会导致过度拟合,所以在某个时候停止添加树是很重要的。

感谢您的阅读。如果您有任何反馈,请告诉我。

特征工程的力量

原文:https://towardsdatascience.com/the-power-of-feature-engineering-b6f3bb7de39c?source=collection_archive---------22-----------------------

为什么您可能只应该使用逻辑回归来建模非线性决策边界(使用 Python 代码)

作为一名数据科学家,我不禁被复杂的机器学习技术所吸引。用一些深度神经网络(DNN)获得额外的 1%的精度,并且在这个过程中必须旋转一个 GPU 实例,这是一件非常令人满意的事情。然而,这些技术经常把思考留给计算机,让我们对模型的工作原理知之甚少。所以,我想回到基础。

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

在这篇文章中,我希望教你一些关于特征工程的知识,以及如何用它来建模一个非线性的决策边界。我们将探讨两种技术的优缺点:逻辑回归(使用特征工程)和神经网络分类器。将给出用于拟合这些模型以及可视化其决策边界的 Python 代码。你也可以在 GitHub[1] 上找到完整的项目。最后,我希望让你理解为什么特征工程可能是其他非线性建模技术的更好的替代方案。

什么是特征工程

每当从原始数据创建要素或将现有要素的函数添加到数据集中时,您都在进行要素工程。这通常是利用特定领域的领域知识来完成的【2】。例如,假设我们想要预测一个人从手术中恢复所需要的时间(Y)。从之前的手术中,我们已经捕捉到了患者的恢复时间、身高和体重。根据这些数据,我们还可以计算出每个患者的身体质量指数=身高/体重。通过计算并在数据集中包含身体质量指数,我们正在进行要素工程。

为什么我们要做特征工程

特征工程是强大的,因为它允许我们将非线性问题重新表述为线性问题。为了说明这一点,假设恢复时间与身高和体重有如下关系:

y =β₀+β₁(height)+β₂(weight)+β₃(height/weight)+噪音

看第 3 项,我们可以看到 Y 和身高体重不是线性关系。这意味着我们可能不会期望线性模型(如线性回归)在估计β系数方面做得很好。你可以尝试使用非线性模型,比如 DNN,或者我们可以通过做一些特征工程来帮助我们的模型。如果我们决定将身体质量指数作为一个特征,则关系变为:

y =β₀+β₁(height)+β₂(weight)+β₃(bmi)+噪音

y 现在可以建模为我们 3 个变量的线性关系。因此,我们期望线性回归在估计系数方面做得更好。稍后,我们将看到同样的想法适用于分类问题。

为什么不让计算机来做这项工作呢

如果你想得到技术,特征工程本质上是核心技巧,因为我们将特征映射到一个更高的平面【3】。虽然,对于内核技巧,通常涉及的思想较少。内核函数被视为一个超参数,可以使用蛮力找到最佳函数——尝试不同函数变量的负载。使用正确的核函数,您可以建立非线性关系的模型。给定适当数量的隐藏层/节点,DNN 还将自动构建你的特征的非线性函数【2】。那么,如果这些方法可以模拟非线性关系,我们为什么还要为特征工程费心呢?

我们在上面解释了特征工程如何允许我们捕捉数据中的非线性关系,即使是线性模型。这意味着,根据问题的不同,我们可以获得与非线性模型相似的性能。我们将在本文的后面详细讨论一个例子。除此之外,使用特征工程还有其他的好处,使这项技术值得一试。

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

首先,你会对模型的工作原理有更好的理解。这是因为您确切地知道模型使用什么信息来进行预测。此外,通过直接查看特征系数,可以很容易地解释像逻辑回归这样的模型。第二个原因源于第一个原因,即该模型更容易解释。如果你在工业界工作,这一点尤其重要。你的同事也更有可能接触到一些更简单的模型。第三个原因是,您的模型不太可能过度符合训练数据。通过强力加载不同的超参数,很容易在数据中模拟噪声。相比之下,通过深思熟虑的特性,你的模型将是直观的,并可能模拟真实的潜在趋势。

资料组

让我们深入一个实际的例子。为了让事情尽可能清楚,将使用人工生成的数据集。为了避免这个例子变得令人难以置信的枯燥,我们将围绕它创建一个叙述。那么,假设您的人力资源部门要求您创建一个模型来预测某个员工是否会得到晋升。该模型应考虑员工的年龄和绩效得分。

我们在下面的代码中为 2000 名假设的雇员创建特性。雇员的年龄可以在 18 到 60 岁之间。性能分数可以在-10 到 10 之间(10 为最高)。两个特征都被混洗,因此它们不相关。然后,我们使用以下年龄(a)和表现§的函数来生成目标变量:

γ(a,p)= 100(a)+200§+500(a/p)-10000+500(噪声)

当γ(a,p)≥ 0 时,员工被提升;当γ(a,p) < 0 时,员工不被提升。我们可以看到,术语 a/p 包含在上面的函数中。这意味着决策界限将不是年龄和表现的线性函数。随机噪声也包括在内,因此数据不能完全分离。换句话说,一个模型不可能 100%准确。

如果上面的步骤有点混乱,也不用担心。我们可以用下面的代码可视化数据集,让事情变得更清楚。这里我们创建了一个数据散点图,结果如图 1 所示。只有两个特征,很容易看出到底发生了什么。y 轴代表员工的绩效得分,x 轴代表员工的年龄。获得晋升的员工的分数为红色,未获得晋升的员工的分数为蓝色。最终,2000 名员工中有 459 人(23%)获得了晋升。对于不同的随机样本,该比率会略有变化。

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

图 1:促销数据散点图

虽然这个数据是生成的,但是我们还是可以为剧情想出一个现实的解释。在图 1 中,我们可以看到 3 组不同的员工。首先是绩效得分在 0 分以下的群体。由于表现不佳,这些员工中的大多数没有得到提升,我们也可以预计他们中的一些人已经被解雇。我们可以期待得分高于 0 的员工要么获得晋升,要么接受其他地方的聘用。分数特别高的员工往往会离职。这可能是因为它们的需求量很大,而且在别处有更好的报价。然而,随着雇主年龄的增长,他们需要更高的绩效分数才能离开。这可能是因为年纪大的员工在目前的职位上更自在。

无论叙述如何,很明显,决策边界不是线性的。换句话说,不可能画一条直线来很好地区分提升组和未提升组。因此,我们不会期望线性模型做得很好。让我们通过尝试仅使用年龄和表现这两个特征来拟合逻辑回归模型来演示这一点。

逻辑回归

在下面的代码中,我们将 2000 名员工分成一个训练集(70%)和一个测试集(30%)。我们使用训练集来训练逻辑回归模型。然后,使用这个模型,我们对测试集进行预测。测试集上的准确率为 82%。这似乎不算太糟,但我们应该考虑到只有不到 23%的员工获得了晋升。因此,如果我们只是猜测没有一个员工会得到晋升,我们应该预计准确率在 77%左右。

通过使用下面的代码可视化它的决策边界,我们可以更好地理解模型在做什么。这里我们在样本空间内生成一百万个点。然后,我们使用逻辑回归模型对所有这些点进行预测。就像图 1 中的散点图一样,我们可以画出这些点。每个点的颜色由模型的预测决定——如果模型预测促销,则为粉红色,否则为浅蓝色。这为我们提供了一个很好的决策边界近似值,如图 2 所示。然后我们可以在这些点上绘制实际的数据集。

查看决策边界,我们可以看到模型做得很糟糕。该公司预测有晋升机会的员工中,大约有一半没有得到晋升。然后,对于大多数获得晋升的员工,它预测他们没有获得晋升。请注意,决策边界是一条直线。这强调了逻辑回归是一个线性分类器。换句话说,模型只能构建一个决策边界,它是您给它的特征的线性函数。在这一点上,我们可能会尝试不同的模型,但让我们看看是否可以使用特征工程来提高性能。

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

图 2:逻辑回归模型的决策边界

特征工程逻辑回归

首先,如下面的代码所示,我们添加了额外的特性(即年龄与性能的比率)。从那时起,我们遵循与先前模型相同的过程。列车测试分割与我们对“随机状态”使用的值相同。最终,该模型实现了 98%的准确率,这是一个显著的改进。

该模型仍然只需要雇员的年龄和表现来进行预测。这是因为附加特征是年龄和表现的函数。这允许我们像以前一样可视化决策边界。这是通过在样本空间中的每个年龄表现点使用模型的预测。我们可以看到,在图 3 中,通过添加额外的功能,逻辑回归模型能够模拟一个非线性的决策边界。从技术上来说,这是年龄和表现的非线性函数,但它仍然是所有 3 个特征的线性函数。

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

图 3:具有特征工程的逻辑回归模型的决策边界

使用逻辑回归的另一个好处是模型是可解释的。这意味着模型可以用人类的术语来解释【4】。换句话说,我们可以直接查看模型系数来了解它是如何工作的。我们可以在表 1 中看到模型特征的系数及其 p 值。我们不会涉及太多的细节,但是这些系数可以让你从获得晋升几率的变化来解释特征的变化。如果一个特性有一个正的系数,那么这个特性值的增加会导致升职机会的增加。

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

表 1:逻辑回归模型总结

从表 1 中我们可以看出,随着年龄的增长,升职的可能性也在增加。另一方面,对于性能来说,这种关系并不明显。性能的提高也会降低年龄/性能比。这意味着绩效提高的效果取决于员工的年龄。这很直观,因为它与我们在散点图中看到的一致。在这种情况下,可能没有必要以这种方式使用系数来解释模型。仅仅可视化决策边界就足够了,但是随着我们增加特征的数量,做到这一点变得更加困难。在这种情况下,模型系数是理解模型如何工作的重要工具。

同样,p 值可以帮助我们理解模型。由于系数是统计估计值,它们周围有一些不确定性。低 p 值允许我们确定我们的系数不同于 0。换句话说,我们可以确定一个系数要么是正的,要么是负的。这一点很重要,因为如果我们不能确定系数的符号,就很难用概率的变化来解释特征的变化。从表 1 可以看出,所有系数都具有统计学意义。这并不奇怪,因为我们使用特征的函数生成数据。

总的来说,当我们生成数据时,上面的分析非常直接。因为我们知道使用了什么函数来生成数据,所以很明显,这个附加功能将提高模型的准确性。实际上,事情不会这么简单。如果你对数据没有很好的理解,你可能需要和人力资源部的人谈谈。他们也许能告诉你他们过去看到的任何趋势。否则,通过使用各种图和汇总统计数据来研究这些数据,您可以了解哪些特征可能是重要的。但是,假设我们不想做所有这些艰苦的工作。

神经网络

为了比较,让我们使用一个非线性模型。在下面的代码中,我们使用 Keras 来拟合神经网络。我们只使用年龄和表现作为特征,因此神经网络的输入层的维数为 2。有 2 个隐藏层,分别有 20 个和 15 个节点。两个隐藏层都具有 relu 激活函数,而输出层具有 sigmoid 激活函数。为了训练模型,我们使用 10 和 100 个时期的批量大小。训练集大小为 1400 时,我们有 14000 步。最终,该模型在测试集上取得了 98%的准确率。这与逻辑回归模型的精度相同,但是我们不需要做任何特征工程。

查看图 4 中 NN 的决策边界,我们可以看到为什么它被认为是一个非线性分类算法。即使我们只给出模型年龄和性能,它仍然能够构建非线性决策边界。所以,在一定程度上,模型为我们做了艰苦的工作。你可以说模型的隐藏层已经自动完成了特征工程。那么,考虑到这个模型具有很高的准确性,并且需要我们付出较少的努力,我们为什么还要考虑逻辑回归呢?

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

图 4:神经网络的决策边界

神经网络的缺点是它只能被解释。这意味着,与逻辑回归不同,我们不能直接查看模型的参数来了解它是如何工作的。我们可以使用其他方法,但最终,理解神经网络的工作原理会更加困难。向非技术人员(如人力资源主管)解释这一点就更难了。这使得逻辑回归模型在行业环境中更有价值。

在工业界和学术界都有许多问题,其中大部分比本文给出的例子更复杂。所提出的方法显然不是解决所有这些问题的最佳方案。例如,如果你试图做图像识别,你不会用逻辑回归得到任何东西。对于更简单的问题,逻辑回归和对数据的充分理解通常是你所需要的。

图像来源

所有图片都是我自己的或从www.flaticon.com获得的。在后者的情况下,我拥有他们的高级计划中定义的“完全许可”。

参考

[1]奥沙利文(C. O’Sullivan),medium-articles(2020),【https://github.com/conorosully/m】T4edium-articles

[2] T .哈斯蒂,r .蒂布希拉尼,j .弗里德曼,
统计学习的要素【第 150 页】(2017),https://web.stanford.edu/~hastie/ElemStatLearn/

[3] Statinfer,非线性决策边界(2017),https://statin fer . com/203-6-5-The-Non-Linear-Decision-Boundary/

[4] R. Gall,机器学习可解释性 vs 可解释性:两个可以帮助恢复对 AI 信任的概念(2018),https://www . kdnugges . com/2018/12/Machine-Learning-explability-interpretatibility-AI . html

[5] UCLA,我如何解读 Logistic 回归中的优势比?(2020 年),https://stats . idre . UCLA . edu/stata/FAQ/how-do-I-interpret-odds-ratios-in-logistic-regression/

(本地二进制)模式的力量

原文:https://towardsdatascience.com/the-power-of-local-binary-patterns-3134178af1c7?source=collection_archive---------20-----------------------

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

图片由 Unsplash 上的 H Heyerlein 拍摄

实践教程

无监督贝叶斯推理(降低维度和挖掘特征)

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

(摄于 Unsplash 上的布拉德利·布里斯特)

基于边缘和纹理的聚类

你能说出这些图像之间的区别吗?简单对吗?我敢肯定,你们中熟悉经典机器学习方法的人可以很快找到一种分类算法来自动完成这一过程。

但是当我们没有任何标签的时候呢?希望对你们中的一些人来说,一些新奇的无监督聚类算法浮现在脑海中。但是,当我们在计算病理学或其他形式的复杂医学图像分析领域工作时,我们如何在 13 英寸的 MacBook Pro 上实现数百张 2GB 以上的图像呢(正如我目前正在尝试的)?

谢天谢地,有一大堆令人兴奋和有用的技术来帮助我们实现这一点!

在这个系列中,无监督贝叶斯推理(降低维度和挖掘特征),我们将探索一系列无监督贝叶斯统计模型,这些模型相当于三重威胁的机器学习:

降维

特征抽出

使聚集

不确定性量化

好吧,有四个,但是四重威胁听起来不太一样…

但是我们可以把前两者结合起来。

看,已经学会如何降维了!

所以,事不宜迟,让我们进入我们的第一篇文章 : 局部二元模式 (或者 LBP,为了节省我们的时间)令人难以置信的力量在于它能够区分纹理和地形的微小差异,识别关键特征,然后我们可以用这些特征区分相同类型的图像——不需要费力的标记。

在本文中,我们将涵盖 LBP 背后的关键概念;这个惊人简单的算法所具有的力量;以及我们可以从其实施中获得的许多巨大好处。

LBP 的目标是通过检测边缘、拐角、凸起或平坦区域以及硬线条来编码图像的几何特征;允许我们生成图像或图像组的特征向量表示。

通过对图像之间或给定未知类别的单个图像的共性进行编码,我们允许将它们的特征与另一个图像的特征进行比较。通过这种比较,我们可以确定我们的目标图像和看不见的图像之间的相似程度,并且可以计算所呈现的图像与目标图像具有相同种类或类型的概率。

虽然相当简单,当然也不是什么新东西(它最早是在 2002 年发明的),但这种无监督学习方法能够仅使用最少的数据来区分惊人相似的图像(具有显著的准确性)。作为一个额外的好处,这是在不需要训练模型的情况下实现的(无论如何在传统意义上)。简单地构建一个比较表示就足以使用这种技术。幸运的是,对于我们这些不太熟悉矢量化表示的人来说,这些表示可以用一种更加用户友好的方式显示:直方图。

为了解释为什么会这样,让我们更深入地研究 LBP 是如何工作的。

LBP 可以分为 4 个关键步骤:

简单化

二元化

概率密度函数计算

(上述功能的)比较

简化

在我们开始创建 LBP 之前,我们首先需要简化我们的图像。这是我们的数据预处理步骤。本质上,这是我们降维的第一步,它允许我们的算法纯粹关注亮度的局部差异,而不是担心任何其他潜在的特征。

因此,我们首先将我们的图像转换成单通道(通常是灰度)表示(见下文)。这创建了我们的“窗口”,我们可以为其创建 LBP 特征向量来表示图像。

对我们的每个目标图像(代表我们的类型或组的图像)以及我们的输入图像都这样做是很重要的。最棒的是,我们可以处理给定类型或组的单个代表性图像,允许我们以无监督的方式对小数据集的输入进行分类。

二元化

接下来,我们计算相对局部亮度变化。这允许我们基于亮度创建每个像素的局部、低维、二进制表示。

对于我们窗口中的每个像素,我们从其局部“邻域”中取出 k 个周围像素,并依次与中心像素进行比较,顺时针或逆时针移动。方向和起点无关紧要,只要我们坚持一个方向,依次对每个像素进行计算。对于每次比较,我们输出二进制值 0 或 1,这取决于中心像素的强度(标量值)是大于还是小于(分别)比较像素。这形成了一个 k 位的二进制值,然后可以转换成一个基数为 10 的数;为该给定像素形成新的强度。我们重复这一过程,直到每个像素都有一个新的像素强度,表示相对于其邻居的累积局部强度(其中强度值的范围从 0–2^k)。这给我们留下了原始图像的降维 LBP 表示。

在实践中,我们首先定义我们的 LBP 参数。这包括设置我们的单元格大小、半径和比较点数( k )。我们的单元格大小指的是任意的像素大小,我们可以用它来进一步分割我们的窗口。然后,可以在每个单元上独立地使用上述计算,而不是在整个窗口上。这允许更快和更有效地并行处理图像,并且还提供了使用重叠单元区域来拾取局部模式的可能性,如果我们使用整个窗口来计算 LBP,则局部模式可能会被过于严格地划分。作为标准,我们将单元格大小设置为 16x16 像素(任意)。

半径定义了当生成 LBP 表示时,对于图像中的每个中心像素,我们从其采样我们的比较像素的邻域的大小(即,它是每个比较像素将远离中心像素的像素数)。这准确地定义了我们所说的“本地”的含义。

最后,我们的 k 值指的是我们邻域内要采样的点的数量。通常,这是 8,从而为每个像素生成 8 位值;留下我们的最终像素强度值在 0 和 255 之间的范围(2^8).

幸运的是,Scikit-Image 有一个我们可以借用的简单方便的实现,它抽象了这些技术细节:

一旦我们为窗口中的每个细胞生成了 k 位 LBP 表示,我们就可以将它们组合起来形成我们的特征向量。

培训补充说明:

这里生成的二进制模式实际上有两种类型:均匀的和不均匀的。这些指的是二进制数在十进制转换之前产生的模式。

当我们说“一致”时,我们是说二进制数在整个模式中最多包含两个值变化(0-1 或 1-0)(例如,11001111、1111110、00011000 和 00111110 是一个字节数据的潜在示例)。相比较而言,(也许并不奇怪)其他一切都是不一致的。

但是我们究竟为什么要关心一个二进制数的变化次数呢?尤其是当我们只使用它来计算基数为 10 的恭维?

很高兴你问了。你看,这种二进制模式的美妙之处在于,它保留了每个像素的局部亮度,以这种方式,编码信息变得旋转不变。这意味着当我们计算我们的 LBP 时,不管图像的方向如何,我们将最终获得相同的 PDF(我们的 LBP 的特征向量表示)。

相比之下,任何不一致的模式都不能产生相同的 PDF,无论方向如何。因此,我们将冒着将相同的图像编码为不同输入的风险,通过使用这些不同的特征模式;可能会破坏我们模型的完整性。

PDF 计算

现在,回到手头的任务!

那么,我们如何将我们的 LBP 图像表示转换成更有用的东西(老实说,更容易理解)?

当然,我们把它们转换成特征向量!本质上,我们创建一个直方图。这是我们稍微偏离贝叶斯统计的部分,并从我们的常客表亲那里借用了一个老把戏。没错,你猜对了,我们要统计特征。我们以直方图的形式绘制这些结果,连接来自每个单元的 LBP 表示以创建窗口级特征向量表示。同样,在 Scikit-Image 表示法中,大部分都是从我们这里抽象出来的。

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

作者图片

现在我们有了低维的局部特征表示,我们可以选择将它们用作强大分类器的可轻松训练的输入,如支持向量机或极端学习模型(请关注关于这些的文章),或者我们可以探索这些特征向量,以发现表征我们图像的重要潜在几何特征。

或者,我们现在有能力进行无标签分类(或聚类),具有不确定性分类的额外好处。

比较

最后但同样重要的是,你们一直在等待的部分,是时候 Kullback-Leibler 散度:D(p,q)了。这意味着,分布 q(我们的样本分布)与样本 p(我们的目标分布)相差多少。贝叶斯统计模型的精髓。如果有一件事你需要知道,对于这个系列,对于任何未来学习贝叶斯统计建模,它是 KL 散度(从现在开始被称为 KLD)。

这种强大的贝叶斯算法允许我们比较两个概率密度或质量函数(或者本质上,任何一对分布),创建一个新的概率分布来解释它们之间的关系。这就告诉我们分布‘q’中的数据点有多大可能来自相同的基础分布‘p’。

然而,需要注意的是,KLD 是不可交换的(它并不能确定 p 是 q 的可能性有多大,只能确定 q 是 p 的可能性有多大)——即 D(p,q) ≠ D(q,p)。

我将继续发表一篇关于这个关键概念的更详细的文章,但是现在重要的是你要理解这个算法想要达到的目的。对于那些现在迫切需要更多具体细节的人,请参见下面的基本 Scikit-Image 实现:

所以…

正如你所看到的,LBP 允许我们生成图像的低维表示,强调局部地形特征。通过比较无标签图像的关键视觉特征,这些可用于对无标签图像进行分类,以确定每幅图像从同一群体中取样的概率。

这为我们提供了许多重要的好处:

我们可以创建图像的低维表示,这些图像可以用作更复杂模型的输入向量,现在将更容易分析这些模型(更低的输入复杂度意味着对模型复杂度和计算要求的需求降低)

我们现在有了一种计算简单的高维图像特征提取方法(潜在地减少了存储内存需求)

我们有一个非常精确的分类器,可以在几秒钟内创建和使用(计算效率高,内存需求最小)

我们有一个概率分类器,它为我们提供了真正的可能性,而不是严格强加的类别,并为我们提供了一种不确定性量化的方法

我们可以根据我们想要识别的目标的例子对看不见的图像进行分类,而不需要冗长乏味的标记工作

最后,如果这些术语中的任何一个对你来说看起来复杂或令人困惑,请不要惊慌。虽然旨在让机器学习和统计新手获得 LBPs 中正在发生的事情的“要点”,但我特意为那些想尝试概率建模和维度缩减技术的人提供了一些更复杂的细节。

我将很快发布一系列关于贝叶斯统计和更简单的机器学习方法的文章,在这些文章中,我们将更深入地了解本系列中提到的更基本的元素。如果您有任何问题,请随时联系我们。

为阅读干杯,下一篇文章再见。

参考

LBP 方法的所有功劳和它的使用的细节去下面详述的原始论文。LBP 代码实现的所有功劳归于 Scikit-Image

[1]t .奥贾拉和 m .皮蒂凯宁,1999 年。基于特征分布的无监督纹理分割。模式识别32 (3),第 477–486 页。

[2]茨韦塔纳·奥贾拉和茨韦塔纳·皮蒂凯宁和马恩帕,2002 年。基于局部二值模式的多分辨率灰度和旋转不变纹理分类。 IEEE 模式分析与机器智能汇刊24 (7),第 971–987 页。

数学独创性的力量

原文:https://towardsdatascience.com/the-power-of-mathematical-ingenuity-49c7b6cfe05e?source=collection_archive---------23-----------------------

用于倾斜校正、文本倒置、旋转分类、单应性和应用数学的对象搜索的计算机视觉

“纯数学方法解决视觉问题的日子已经一去不复返了,现在人工智能已经开始涉足了”——这可能是深度学习实践者最容易误导的想法之一,他们忘记了传统的计算机视觉技术。如果你是其中之一,那么这里有一个让你重新思考的尝试。

许多“在边缘上运行”的计算机视觉算法使用传统数学,而不是计算和存储密集型神经网络。考虑一下,我们有包含文本内容的扫描图像。让我们把人工智能放在一边,解决扫描图像中的经典问题**,即。倾斜、旋转和文本倒置,**确定性。特征匹配&物体搜索也使用数学魔法,进一步激励你。

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

下面所有案例分析的源代码都可以在这里 找到。

文本倒置

从图像中识别倒置的文本字体是一项艰巨的任务。颠倒扫描文件时,可能会发生反转**。**即使在旋转或倾斜校正后,文件也可能会反转,因为 90+θ的旋转被检测为 90-θ,或-90-θ被检测为-90+θ。因此,文本倒置是一个常见的问题,但是很难识别。

让我们来看看如何用数学公式表示反演。

方法一:双峰

  1. 将像素投影到 y 轴上。每一行将导致一个峰值,事实上,由于英文字符的形状,有两个峰值。

2.与高斯滤波器卷积以平滑噪声。

3.计算峰(线)的分数,子峰在右侧。

下图说明了这种方法

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

蓝色:原装。橙色:平滑。线条:平滑投影的平均值。

如果文本是大写字母或其他语言,上述方法将不起作用,因为“双峰逻辑”可能会出错。

另一个解决问题的数值方法是利用字体形状,如*“水填充技术”【1】*,或者用数学方法表示字符形状,如下所示。我们可以使用形状上下文和对数直方图来数学描述任何形状。这些尝试证明了**“数学独创性”是解决各种问题的有效方法。**

方法 2:使用 Log-Bin 直方图形成上下文

a.使用 EAST 从图像中找到文本边界框。{下面}

b.边框内的裁剪图像应用 Canny** 边缘检测。**

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

裁剪图像

c.以字母数字作为基本输入的虚拟图像。从步骤(b)中的基本输入和图像中找到每个字符周围的边界框。执行步骤{d}-{h}找出字符对之间的最佳对应关系。

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

现在,把数字图像作为基本输入

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

裁剪图像上的字符边界框

d.从每个字符形状的边缘元素中随机抽取 N 个点。

e.构建一个新的形状描述符——形状上下文。一个点的形状上下文捕获了其他形状点相对位置的分布,因此总结了全局形状。****

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

对数极坐标系统中的形状上下文

f.使用皮尔森卡方检验或余弦距离比较对数极坐标直方图。

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

h.为基础图像中的每个边界框找到距离最小的数字对每个包围盒的成本值求和,找出适马(φ)。

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

将每个数字与基图像中每个数字的形状进行比较

I .反转来自步骤(b) 的裁剪图像,并进行步骤{d}-{h}以计算适马(φ’)。比较适马值以了解文本反转。

如果适马(φ)<适马(φ’)

然后输入图像是直立的

否则输入图像被翻转

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

文本反转代码的输出

东(一种高效准确的场景文字检测器)

图像中的文本内容可以使用 EAST 算法进行本地化。

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

自然场景上的东方文字检测(礼貌)

同样,我们可以使用 math-hack 来定位图像中的文本,而不是使用基于人工智能的 EAST 算法**。你可以找到像素的 y 投影的连续局部最小值,从而找到对应于图像中线分离的连续波谷。找到一行后,您可以从步骤(b)开始运行方法 2。**

无论字体大小写或语言如何,上述方法都有效。****

歪斜校正

大多数扫描的文件是歪斜的。因此,在送入 OCR 或甚至显示之前,需要消除图像的倾斜。

方法 1:迭代投影

  1. 将图像从-10 度旋转到+10 度。

2.计算所有像素在 y 轴上的投影。

3.计算像素的入射密度。****

4.将旋转角度步进 0.5 度,并重复步骤 2、3

5.求像素入射密度最大的角度θ**。**

上述算法的缺点是:****

a.迭代计算增加了时间复杂度。****

b.由于步长大小,潜在误差为 0.5 度。

大多数情况下,扫描文件为表格格式或包含线条的表格数据或线条的点分布**(由于扫描或打印质量不足,扫描图像中的线条可能不连续)。因此,问题归结为**“给定一个点扩散作为输入,我们是否可以计算直线和θ?”

方法 2:霍夫变换峰值

  1. 读取倾斜的图像并进行谨慎的边缘检测

2.霍夫空间=调用霍夫变换(边缘检测图像)

3.在霍夫空间变换(累加器矩阵)中寻找最大值

4.使用斜率的切线找到显著线的θ****

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

5.计算斜率的中间值,θ’

6.将图像旋转θ’****

霍夫变换

  • 直线可以用等式来表示,ρ= Xcos+Ysin,
    其中(X,Y)表示该点,(φ,ρ)表示法线距离原点的角度和距离。
  • 如果我们认为(X,Y)为常数,那么 ρ依赖于
  • 于是,我们会得到一条对应于点(X,Y)的(ρ,φ)平面上的正弦曲线。
  • 对应每个像素,在(ρ,c)平面画正弦曲线。
  • 对应于代表直线边缘的像素的正弦曲线将在(ρ,φ)平面的特定点相交。****
  • ****交点给出了常数(ρ,φ),使用该常数我们可以在(X,Y)平面上绘制实际的直线。这里 0<180 度< 180 度。
  • 我们可以用同样的方法来检测高维特征。
  • 对于圆,a、b、r 应该被参数化为霍夫空间,从而将复杂度增加到 3 维。

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

霍夫空间中的正弦曲线投票数组可以如下图所示。

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

投票阵列的霍夫空间可视化

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

从正弦曲线交点重建直线

去歪斜源代码:

去歪斜输出:

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

检测到斜角:-0.881403996582

请注意上图计算倾斜角度的准确性。在迭代方法中,角度θ的误差可能是【步长/2】,更不用说巨大的迭代计算成本了。****

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

去偏斜流水线的功能工作流程

注意:如果扫描的文档不包含您的情况下的线条点扩散,那么运行上述峰值算法来查找文本周围的边界框。包围盒的水平边缘的角度θ对应于偏斜度。

旋转分类

旋转是扫描图像中的常见问题。扫描时,文档可以旋转 90°或更多。

可以使用如下 CNN 模型将图像分为 4 个象限。但是为什么要加载神经网络,当你可以用算术方法解决它的时候?此外,即使在象限旋转之后,图像也可能保持倾斜。

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

四象限分类的 CNN 模型

****可以用上面的歪斜校正代码求θ,旋转。唯一的缺点是,90+θ的旋转可能被检测为 90-θ,而-90-θ可能被检测为-90+θ。因此,一旦旋转,图像就会翻转!

原因:如果旋转 90-θ而不是 90+θ,那么

(90-Θ) + (90+Θ) = 180°

解决方案:要解决上述问题,只要把去歪斜的图像传递给文本反转码,如果认为有必要,就把它翻转过来

单应

比方说你想在一个包含多个对象的更大的图像中找到一个对象(模板)。我们可以使用带有注释的查询图像的对象检测模型,如 SSD 或 YOLO,来训练要找到的不同类别的对象。但是,我们如何使用简单的数学在更大的图像中找到并定位一个对象呢?****

我们可以使用单应来寻找点对应,并将坐标从一个角度转换到另一个角度。单应性是一种变换(3×3 矩阵),它将一幅图像中的点映射到另一幅图像中的相应点。

这些是你可以遵循的步骤。

  1. 首先,打开模板图像和要匹配的图像。
  2. 从两幅输入图像中查找所有特征。
  3. 创建一个 ORB 关键点检测器,它比 SIFT 和 SURF 计算量小。
  4. 使用 orb 检测器找到关键点及其描述符。
  5. 创建描述符的匹配,然后根据距离对它们进行排序。
  6. 用 cv2.drawMatchesKnn 画出所有 k 个最佳匹配。
  7. 从两幅图像中提取匹配的关键点。
  8. 求单应矩阵,做透视变换

源代码:

匹配输出:

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

找出匹配点对应关系

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

透视变换后的对象定位(黑色矩形)

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

在我的书桌上发现了一本书的要点对应

对象搜索

比方说,你需要从一组图像中找到一个物体。你可以使用人工智能模型,因为它是图像分类的经典案例。但是,我们能用传统数学来做这个吗?以下是如何…

  1. 读取要搜索的对象的图像(查询图像)
  2. 进行 Canny 边缘检测,并找到轮廓周围的包围盒。
  3. ****随机抽取“n”个随机点来描述图像内部的形状。
  4. 迭代,获取输入文件夹中的所有图片。
  5. 对每张图片执行步骤 2 和 3。
  6. 计算“查询图像”的随机形状点与文件夹中每个图像的形状点的相关值
  7. 找到具有最小相关值的图像。此图像包含您正在搜索的对象的最接近匹配。****

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

相关方程:u 和 v 是要比较的向量

上述等式从概念上将相关性表示为平均值附近偏差的相似性。因此,分子表示分布相似性,分母量化 L2 范数以进行归一化。

输入图像和查询对象

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

不同物体的图像作为输入

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

查询图片:小型化分段车

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

输出:输入图像与查询图像的匹配值比较

请注意,具有相似形状的不同汽车(紫色)具有第二接近的匹配值,就在红色汽车之后。与其他形状的相关距离明显更大。因此,你可以看到形状匹配是有效的。

请注意相关值不会为 0,即使是相同的图像,因为随机采样点是为了描述形状**。有其他方法来描述形状而不需要随机采样但是形状匹配的时间复杂度会变得更高。其中一种称为转向功能的方法描述如下。**

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

左转时增加,右转时减少。边长=曲线长度。

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

求最小 Lp 范数来度量旋转不变曲线的相似性

以上所有案例分析的源代码都可以在 这里 找到。

结论

从上面的案例研究中,你可以看到确定性解决方案比迭代或基于人工智能的解决方案更精确,计算量更小。虽然人工智能可以在许多复杂的任务中表现出色,但谨慎的做法是尝试基于数学的解决方案,并将人工智能作为最后手段。你不需要大锤来敲碎坚果。如果上面的阅读激发了你去欣赏传统技术的美,那么它就达到了目的。

如有任何疑问或建议,可在此 联系我

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

参考文献

[1]文本文档图像中的反转检测。 Hamid Pilevar,A. G. Ramakrishnan,电气工程系医学智能和语言工程实验室,印度科学研究所,Bangalore (JCIS,2006 年)

[2]形状上下文:一种新的用于形状匹配和物体识别的描述符。塞尔日·贝隆吉、吉滕德拉·马利克和扬·普济查。加州大学伯克利分校电气工程和计算机科学系(NIPS 2000)********

****【3】利用形状上下文进行形状匹配和物体识别。塞尔日·贝隆吉、吉坦德拉·马利克和扬·普济查。加州大学柏克莱分校计算机科学系(PAMI 2002 年)

【4】https://medium . com/machine-learning-world/shape-context-descriptor-and-fast-characters-recognition-c 031 EAC 726 f 9

[5]https://stack overflow . com/questions/55654142/detect-if-a-text-image-is-upsided

https://github.com/argman/EAST

离线强化学习的力量:第一部分

原文:https://towardsdatascience.com/the-power-of-offline-reinforcement-learning-5e3d3942421c?source=collection_archive---------9-----------------------

可能扩展到现实世界问题的 RL 算法

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

来源

线上 RL 的局限性

强化学习在过去几年中发展迅速,从只能解决简单玩具问题的表格方法到处理难以置信的复杂问题的强大算法,如下围棋、学习机器人操纵技能或控制自动驾驶汽车。不幸的是,RL 在现实世界应用中的采用有些缓慢,虽然当前的 RL 方法已经证明了它们能够找到高性能策略来解决高维原始观察(如图像)的挑战性问题,但实际使用它们通常很困难或不切实际。这与监督学习方法形成了鲜明的对比,监督学习方法在工业和研究的许多领域非常普遍,并获得了巨大的成功。这是为什么呢?

大多数 RL 研究论文和实现都面向在线学习设置,其中代理与环境交互并收集数据,使用其当前策略和一些探索方案来探索状态-动作空间并找到更高回报的区域。这通常以下列方式说明:

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

原创艺术

这种在线 RL 算法与环境交互,并立即或通过一些重放缓冲器使用收集的经验来更新策略。重要的是,数据是直接在环境中收集的,并且只有这些数据用于学习,学习和收集是交替进行的。

这带来了几个困难:

-代理必须收集足够的数据来学习每项技能/任务,这对机器人或自动驾驶汽车等系统来说可能过于昂贵。

-代理使用部分训练过的策略与环境进行交互,这可能会采取潜在的不安全行为,例如给患者服用错误的药物。

-使用训练环境为每个任务收集专门数据的需求通常会导致非常狭窄的状态分布,这可能会导致策略易受轻微变化的影响,从而使其不值得部署。

当将 RL 应用于现实世界的问题时,这些并不是人们可能面临的唯一困难,但是它们可能是决定不在您的任务中使用 RL 的主要因素。简单地浏览一下当前的 RL 研究论文就足够了,即使是相对简单的模拟任务也经常需要数百万个交互步骤来学习一个好的策略,那么在真实的机器人上尝试这一点并为每个新任务收集如此大量的数据会有多实际呢?

有趣的是,这些问题在监督学习中并不常见。当训练图像分类器或对象检测网络时,从业者通常可以在不同的现实世界设置中访问大量标记数据的数据集。这就是为什么许多这样的监督学习模型有时甚至在与训练期间遇到的图像非常不同的输入图像上也能惊人地推广,并且通常可以针对具有非常少的标记任务数据的新任务进行微调。在 NLP 社区中可以看到类似的事情,在那里,在巨大的数据集上预处理的大型模型对于学习新任务非常有帮助,使得该过程变得可行,并且在标记的任务数据方面只有适度的要求。

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

来源

那么,为什么不在学习政策时也这样做呢?假设我们想从图像中学习一些机器人技能,我们不能只使用在 ImageNet 上预先训练的模型吗?事实证明,这与我们在监督学习中习惯的好处不太一样,因为这样的模型没有给我们任何关于我们应该做什么的线索,因为它没有经过任何任务的训练。还有什么办法可以缓解这个问题,让 RL 更适用于现实问题?

非政策 RL 和分配转移

2018 年发表了一篇令人印象深刻的论文,名为“ QT-Opt:基于视觉的机器人操纵的可扩展深度强化学习”。在这篇论文中,作者(谷歌…)使用几个机器人同时收集数据,并训练了一个抓取垃圾箱中物体的策略。他们连续进行了几个月的实验,并在此过程中进行了 58 万次抓取尝试,产生了一个最先进的抓取策略。在其核心,他们的方法是基于 Q 学习,这是一种基于动态规划的 RL 方法。我们在 RL 中的目标是找到最大化期望值的策略:

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

对于给定的状态,策略的价值函数告诉我们,通过遵循来自该状态的策略,我们可以期望得到的折扣奖励的总和是多少,并且 RL 的目标是找到在所有状态上期望值最大的策略。我们还可以描述 Q 值,这是我们希望通过采取特定行动,然后从现在开始遵循该政策而获得的值:

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

在 Q 学习中,我们试图通过最小化贝尔曼误差来找到最优 Q 函数(或最优策略的 Q 函数):

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

对于所有状态动作,贝尔曼误差为零的 Q 函数保证是最优的,并且我们可以通过在每个状态采取具有最高 Q 值的动作来提取最优策略:

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

当然,对于实际问题,Q 函数是由一些深度神经网络来近似的,并且需要对基本的 Q 学习方法进行一些修改,以使其以这种方式工作。QT-Opt 论文使用了这种基于 Q-learning 的方法,并获得了非常令人印象深刻的结果(这需要 Google scale 资源),但他们在论文中进行了另一个有趣的实验;他们收集了训练期间收集的所有数据,并试图仅使用这些数据从头开始训练一个新的 Q 函数,而不与机器人进行任何进一步的交互。

原则上,这应该是可行的。如果我们看上面的数学,我们可以看到 Q-learning 算法实际上不知道数据的来源,这意味着我们可以将其应用于通过任何其他策略或程序收集的数据,特别是我们应该能够在记录的训练数据上使用它。这种特性被称为非策略学习,这也是 Q-learning 是一种高效学习方法的主要原因之一,因为它可以重用来自任意来源的数据。然而,令人惊讶的是,作者观察到原始策略(在它收集的相同数据上训练,因为它正在收集它)和使用静态数据训练的策略之间存在显著的性能差距,并且从静态数据中学习产生了更差的性能。这种从静态数据中学习策略或 Q 函数而不与环境进一步交互的过程称为离线 RL (有时称为批量 RL),与我们直接从环境中收集新数据的在线 RL 设置相反。

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

原创艺术

上图是离线 RL 的样子;数据由某个或某些来源(策略、脚本、人员等)收集。)并保存在某个缓冲区中,策略仅使用该数据进行离线训练,然后在完全训练后部署到现实世界中。

如果收集的数据足够好,可以成功地学习第一个策略,为什么离线训练时效果不好?让我们再次检查 Q 学习算法的贝尔曼误差:

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

在实践中实施时,我们会这样做:

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

对于以下形式的转换,我们试图最小化贝尔曼误差:

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

其包含状态、从该状态采取的动作、通过采取该动作获得的奖励以及在采取该动作后观察到的状态。计算贝尔曼误差的目标值时:

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

我们采用我们的 Q 函数认为通过采取行动**a’**可以得到的最佳 Q 值,并使用它来校正我们对状态 s 的 Q 值的当前估计。这被称为自举,是 Q-learning 的一个重要方面。由于我们的 Q 函数不是最优的(特别是在训练的早期阶段),这个目标值有时肯定是错误的,并且会导致我们将误差传播到对 s 的 Q 值的估计。由于这个原因,在线 RL 来救援,并且由于 Q 函数估计中的错误将导致政策采取错误的行动,它将直接体验采取这些行动的结果,并且最终能够纠正其错误。然而,在离线情况下,这种情况会发生,因为策略不与环境交互,也不收集更多数据,因此无法知道它正在传播错误的值并纠正它们。

更糟糕的是,使用 max 运算符会导致对具有最高数值的 Q 值进行几乎对立的搜索,这通常是非常错误的。在许多情况下,这可能导致预测的 Q 值偏离,训练完全失败。在这种情况下,我们的 Q 函数认为它可以获得极高的回报,而事实上,它不能。从形式上来说,这个问题的出现是因为在收集数据的策略和我们现在学习的策略之间存在分布转移,并且当我们在**s’**上评估我们的 Q 函数并寻找具有最高分数的动作时,我们正在对我们的模型查询它从未见过的状态动作,并且可能是完全错误的。

那么如何才能缓解这个问题,在线下的设定下学好呢?一种方法是通过诸如 KL-divergence 之类的发散度量来约束策略,使得它保持接近数据收集策略。这将阻止 Q 函数传播高度乐观的分布外 Q 值,但可能会阻止它学习比数据收集策略更好的策略。如果数据收集策略不是很好,这可能是一个主要问题,因为离线 RL 的一个主要诉求是改善我们以前拥有的东西,否则我们可以只使用行为克隆并完成它。一个更微妙的约束是强制策略选择与数据集中出现的动作接近的动作,同时允许策略偏离数据收集策略。乍一看,这似乎毫无意义,如果强制使用数据集中相同的操作,策略又怎么会不同呢?下图说明了这一点:

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

原创艺术

在上图中,右图描绘了我们的数据中存在的两条轨迹,一条从 A 到达 B,另一条从 B 到达 C。我们希望学习从 A 到达 C,但该轨迹实际上并未出现在数据集中。幸运的是,轨迹之间有一些重叠,这允许仅使用数据集中的动作来学习从 A 到 C 的轨迹。这是动态编程 RL 的主要优势之一,它可以将部分轨迹缝合在一起,并学习比数据中呈现的更好的策略。然而,需要注意的是,在大型状态和动作空间中以现实的方式实施这样的约束(仅使用来自数据集的动作)需要我们以某种方式对数据收集策略建模,这通常需要首先用一些神经网络对其进行近似,然后在离线 RL 期间使用它。这种近似的数据收集策略是错误的潜在来源,一些研究论文证明了行为建模的改进提高了这种离线 RL 方法的性能。

这实际上是一个比从文献中乍一看更具挑战性的问题。我们在离线 RL 中的希望是使用从多个来源随时间积累的大量先前经验的数据集,这可能包括像脚本化的政策和人类示威者这样的事情,它们可能以非马尔可夫方式表现,使得对它们的行为建模非常困难。理想情况下,我们希望我们的 RL 算法不需要这样的行为模型,并且简单和可扩展。

保守的 Q 学习

最近,Berkeley 的研究人员发表了论文“保守 Q-Learning for Offline Reinforcement Learning”,其中他们开发了一种新的离线 RL 算法,称为保守 Q learning (CQL),它看起来表现非常好,同时相对简单,并保持了一些不错的属性。正如我们之前所看到的,当对离线数据执行天真的 Q 学习或 actor critic 算法时,我们在最小化贝尔曼误差时传播高度乐观的 Q 值,并且贝尔曼误差中的 max 算子找出这些误差。CQL 通过对目标函数的简单添加解决了这个问题。

在标准 Q-learning 中,我们的损失是:

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

作者建议增加以下内容:

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

通过积极地尝试最小化我们的政策认为很高的国家行为的 Q 值,我们逐渐地迫使所有那些乐观的错误,并迫使 Q 值不大于它们实际应该的值。作者证明,通过适当选择α,得到的 Q 函数可以由“真实的”Q 值(未知的)限定,因此是这些值的保守估计。他们从经验上证明确实如此,并且预测的 Q 值低于通过部署学习的策略获得的 Q 值。事实上,得到的 Q 值有点过于保守,作者提出了损失函数的另一个补充:

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

这种添加试图最大化数据集中出现的状态动作的 Q 值,鼓励策略坚持更熟悉的动作,并使 Q 值不那么保守。作者证明了期望的结果 Q 值是由“真实的”Q 函数上界的,并证明了这种变体产生更好的结果和更精确的 Q 值。他们在广泛的离线 RL 基准上测试了他们的方法,并表明它优于现有的方法。

这种方法的好处在于它相对简单,解决了核心问题,并且以一种直观的方式运作。它还具有不需要数据收集策略模型的优点,这消除了潜在的错误来源,并从过程中移除了冗余的机器和模型。

使用先前数据集的归纳技能

我们已经看到,使用庞大的离线数据集来学习在现实世界中通用的强有力的政策有很大的潜力,离线 RL 算法的改进正在使这一愿景更接近现实,但有一件事一直困扰着我。我看到的大多数研究论文似乎都假设我们想要学习执行某个任务 X,并且我们有一个大型的离线数据集,该数据集标注了针对该任务 X 的适当奖励。这似乎不现实,因为使用离线 RL 的整个前提是能够利用随着时间的推移从不同来源收集的大型数据集,事后来看,假设我们能够用针对我们任务的奖励来标注这样的数据集是可疑的。人们怎么可能用图像来注释机器人开门的数据集,以奖励抓取物体呢?

CQL 论文作者的一篇名为“ COG:用离线强化学习将新技能与过去的经验联系起来的新论文解决了这个问题,并证明了未标记的离线数据可以用于增强和概括我们任务的较小的注释数据。作者使用了一个机器人的例子,这个机器人被训练来抓取放在一个打开的抽屉里的物体,使用的数据是通过一些脚本化的策略收集的(任务数据)。除此之外,还存在机器人与环境交互的更大数据集,用于其他任务,例如打开和关闭抽屉、拾取和放置物体等(先验数据)。使用一些离线 RL 算法(如 CQL)在任务数据上训练我们的策略将在任务上产生良好的性能,并且机器人将很可能能够以高概率从打开的抽屉中抓取对象。然而,如果我们以某种方式显著地改变初始状态,例如关闭抽屉,那么期望我们的策略现在成功是不现实的,因为任务数据不包含这样的信息。

作者提出了一个简单的解决方案;用稀疏二进制奖励(完成任务+1,否则为 0)注释任务数据,用 0 奖励注释所有先前的数据。然后,将数据集合并,并使用 CQL 对结果大数据集进行训练。正如我们之前看到的,使用动态编程的离线 RL 算法具有看似神奇的能力,可以将部分轨迹缝合在一起,并学习比其部分总和更大的东西。作者证明,CQL 能够将 Q 值从最终目标到达状态一直传播到初始条件(抽屉打开,物体放在里面),并进一步传播到抽屉关闭的状态,从而学习将任务概括为新的看不见的初始条件,这在为我们的任务收集数据时从未遇到过。

在我看来,这是一个强有力的证明,当提供了先前的未标记数据时,一个简单而优雅的算法可以做什么。我希望在未来,我们将看到更好的方法被开发出来,大量的数据集被收集起来,这将使 RL 在工业和研究中被广泛采用,释放它的全部潜力。

对于感兴趣的读者,我强烈建议阅读谢尔盖·莱文(伯克利研究小组负责人)关于离线 RL 的媒体文章。

Pickletools 的力量

原文:https://towardsdatascience.com/the-power-of-pickletools-handling-large-model-pickle-files-7f9037b9086b?source=collection_archive---------22-----------------------

处理大型 ML 模型 pickle 文件

数据量正在增加。数据越多,我们就越能利用它来解决不同的问题。假设您为某个解决方案训练了一个机器学习模型,并希望保存它以供以后预测。下面来介绍一些序列化-反序列化的方法:Pickle(Pickle,cPickle,Joblib,JsonPickle,Dill,Mlflow),保存为 PMML 格式为管道(sklearn2pmml),保存为 JSON 格式(sklearn _ json,sklearn _ export,msgpack,JsonPickle)。

您还可以使用 m2cgen 库将您的模型导出到 python/java/c++代码,或者编写您自己的代码来序列化和反序列化您的模型。

当你建立一个机器学习模型,通过使用大量数据来解决一些问题时,这个模型也将是巨大的!因此,当您试图将这种巨大的编码保存到您的系统时,问题就出现了(我在这里将讨论我试图处理的大型 RandomForestClassifier 模型/pickle 文件)。

解决方案 1:

更多的数据意味着大尺寸的模型。尽量减少你的数据,又不丢失数据中你有价值的信息。去除重复或近似重复分层欠采样可以在这里拯救你。

解决方案 2:

尝试通过调整模型参数来缩小模型尺寸,而不影响精度。在这种情况下,超参数调整将对您有所帮助。我的基本型号 RandomForestClassifier 有很大的 60 GB,但是超参数调优设法把它降到了 8 GB。还是大号?让我们看看下一种疗法。

解决方案 3:

现在,您已经尽一切努力使您的模型更轻,而没有牺牲太多的预测能力,并且仍然获得 8 GB 的 pickle 文件。哦,亲爱的,生活太不公平了。

坚持住,还有一些希望。Pickletools 前来救援!

该库帮助您减小 pickle 文件的大小,并使 pickle 文件作为 RF 对象的加载变得更加容易和快速。

虽然 Joblib 和使用压缩方法如 zlib、gzip 使我的 pickle 文件缩小到 1 GB,但是将该文件作为随机森林分类器对象加载回来是一件令人头痛的事情。加载我的 pickle (1 GB 大小)和反序列化 RF 对象需要 16 GB 以上的 RAM,这将导致 MemoryError。

使用 Pickletools 解决了缩小 pickle 文件大小和更快加载 pickle 文件的问题,而不会占用超过系统处理能力的内存,如下所示。

要序列化:

clf.fit(X_train, y_train) #your classifier/regressor modelimport gzip, pickle, pickletoolsfilepath = "random_forest.pkl"
with gzip.open(filepath, "wb") as f:
    pickled = pickle.dumps(clf)
    optimized_pickle = pickletools.optimize(pickled)
    f.write(optimized_pickle)

要反序列化/加载回:

with gzip.open(filepath, 'rb') as f:
    p = pickle.Unpickler(f)
    clf = p.load()

呜哇!!虽然 gzip 有助于减小 pickle 的大小(到 1 GB),但 pickletools 有助于 pickle 文件加载更快,而不会消耗太多内存(这次占用了 7 GB RAM)

为此,您还可以设置 pickle 属性 fast = True,但将来可能会被弃用,因为文档中是这么说的:

import picklefilepath = "random_forest.pkl"with open(filepath, 'wb') as f:
    p = pickle.Pickler(f)
    p.fast = True
    p.dump(clf)with open(filepath, 'rb') as f:
    p = pickle.Unpickler(f)
    clf = p.load()

额外解决方案:

如果您可以通过让 CPU 的每个核心同时工作来以任何方式并行化整个过程,那么在某种程度上,它也可以拯救您!

好了,该你自己试试了。愿原力与你同在!

延伸阅读及参考文献:

  1. 【https://docs.python.org/3/library/pickle.html#pickle. Pickler.fast
  2. https://docs . python . org/3/library/pickle tools . html # pickle tools . optimize
  3. https://wiki.python.org/moin/ParallelProcessing
  4. https://stack overflow . com/questions/23916413/celery-parallel-distributed-task with multi-processing
  5. https://docs.python.org/3/library/multiprocessing.html

质量保证的力量——为 SQL 数据分析管道设计强大的质量保证流程

原文:https://towardsdatascience.com/the-power-of-quality-assurance-designing-robust-qa-processes-for-sql-data-analysis-pipelines-2b85e9a3928a?source=collection_archive---------33-----------------------

如何构建完整的质量保证程序来保护您的分析管道

“一毫克的预防抵得上一公斤的治疗”——约翰·罗伯特·科伦坡

错误时有发生。虫子似乎可以从任何地方出现。数据源可能会在一瞬间动摇,使您的整个分析管道失效。作为一个分析团队,最终解决这些问题并确保您的报告、交付成果和见解尽可能准确是您的责任。设计一个强大的质量保证(QA)流程对于巩固团队对产品的信心至关重要。

本文将概述设计一个健壮的 QA 过程以节省时间、金钱和资源的一些关键步骤;这将确保你通过分析产生最积极的影响。

为什么质量保证很重要?

有太多的理由说明为什么一个健壮的 QA 过程对你的企业和团队是无价的。以下是一个完整的质量保证过程的一些最有意义的结果:

  • 确认业务决策是利用尽可能好的洞察力做出的
  • 提高产出效率,减少重复工作
  • 提高对数据问题的反应能力
  • 维护利益相关者的信任和客户关系
  • 提高分析师对输出的信心,允许更快的工作方式

基于虚假数据的商业决策对所有相关方来说都是昂贵的。这可能意味着工作重复,绩效下降,金钱损失,或者更重要的是,对你产出的信心受到打击。对你和你的团队所提供的见解和建议的信心,对于获得利益相关者的信任,以及对你的工作产生更大的影响是至关重要的。你不希望一个小错误影响你和你的团队未来的表现。大多数大型公司可以将整个团队投入到 QA 流程中,但是在无法访问此类资源的中小型公司中,分析团队作为一个集体,有责任确保构建适当的基础架构,以减少交付物中任何不必要的错误。强大的 QA 流程在预防任何此类问题方面提供了切实、可靠的价值,从而实现高效、有效的数据驱动型决策。

有效的质量保证方法

QA 不仅仅是检查你的代码。具有许多移动部件、不断变化的容量和第三方数据源的管道可能难以管理。形成一个考虑到任何直接挑战并考虑到未来错误情景的全面而稳健的 QA 流程,需要从多个角度解决这个问题:

  1. SQL 可读性和翻译
  2. 单元和集成测试
  3. 在管道的所有阶段监控数据流
  4. 减少依赖性
  5. 同行评审和优化

本文将概述每个阶段如此重要的原因,建议保持高性能的最佳实践,并确保您的时间花在提供尽可能多的价值上。

SQL 可读性和翻译

通常,我们的绝对代码效率是我们的编码决策的最前沿。在复杂的查询中操作大量数据确实需要勤奋的思考,以节省处理资源的时间和金钱。但是,通常有机会在绝对性能和可读性之间进行权衡,以改进查询的计算方式。

使用一个简单的 SQL 示例,假设我们想要列出我的记录集合中所有的 vintage 记录的名称。我们可以使用以下查询来解决这个问题:

SELECT t_my.record_name 
FROM my_records t_my
INNER JOIN vintage_records t_vin
ON t_my.record_id = t_vin.record_id;

如果我拥有一个非常大的、完全不可能的数十亿条记录的集合,这可能接近最佳解决方案,而不是使用计算量更大的子查询。然而,如果我不得不把它交给一个朋友来运行同样的查询,它没有我们通过其他方式可能达到的一目了然的可读性。考虑新分析师在运行查询之前需要解决的问题:

  • 查询的目的是什么?
  • vintage_records 的内容有哪些?
  • 内部联接是否导致了任何重复?
  • record_id 是主键吗?

在这些情况下,增加这个查询的运行时间几毫秒,以换取一些更可转移、更可读的代码,这是一个非常值得的权衡。通过使用子查询重写并添加简单的注释,我们以非常相似的性能获得了更加清晰的结果:

--Returns ALL record names from my collection that are vintageWITH vintage_record_ids AS (SELECT DISTINCT record_id FROM vintage_record)SELECT record_name 
FROM my_records
WHERE record_id IN vintage_record_ids;

相同的结果,相似的性能和更好的可读性。注意:

  1. 目的明确,便于快速解释
  2. 使用 WITH 语句允许自上而下的可读性
  3. 清除概述其内容的子查询表的名称
  4. 消除了联接的需要,从而简化了代码

良好的可读性最佳实践包括注释掉查询的目的、利用 WITH 语句(cte)、大写函数、保持查询简短并具有清晰的处理逻辑。由于我们的更改,我们现在已经清楚了查询的许多细微差别。我们现在知道了它的用途,并且我们正在返回我的记录集合中的所有结果(不仅仅是唯一的结果)。由于有了子查询,我们可以更快地解释代码,而不必担心任何错误的连接逻辑。更慢但更干净的代码在这里绝对是赢家。

虽然看起来它在这样一个简单的查询上节省了很少的时间,但每次运行它时,它所获得的实际值都将继续得到回报。当您的 SQL 基础设施包含复杂的、数千行的脚本,并且这些脚本都相互集成时,以清晰的方式编写代码的回报将呈指数级增长。更不用说在较小的团队中经常被忽略的因素——当这些脚本的主要分析师休假或请病假时会发生什么?另一个分析师能有效接剧本吗?分析师对提高业务运营的效率有很大的贡献,因此将这一点应用到他们自己的过程和实践中也是至关重要的,以产生可读和可转移的代码的形式。

单元和集成测试

测试和重新测试任何生产脚本是最大的不可协商性。我们必须在隔离的片段中测试代码(单元测试),并且测试这些隔离的片段在一起工作得有多好(集成测试)。例如,测试是否正确创建了临时表,然后确保任何使用临时表的查询都能正确地与它交互。

SQL 简单得令人难以置信,学会预测重复并习惯于诊断错误连接可以为您的日常分析带来更多安宁。注释掉代码以评估每个查询是否产生了预期的结果(单元测试),并确保它们不会破坏您的任何其他依赖查询(集成测试),这本身就是一项值得开发的技能。至少,您应该包括回答以下问题的单元测试查询和注释:

  • 我的连接前后的计数是预期的吗?
  • 我的任何主键被复制了吗?
  • 我的联接字段格式相同吗?
  • 我的 CASE WHEN 语句是否按预期工作?
  • 这个结果有逻辑意义吗?

下一步是确保这些单独的查询与脚本中的任何其他查询协调工作。检查一段代码是否正常工作,但是未能测试该查询如何适应更大的数据管道会产生不必要的、容易避免的漏洞。

花点时间并**记录你的思考过程——这将通过防止错误并确保错误被快速识别和解决而获得巨大回报。以清晰简洁的方式给出尽可能多的细节。如果结果是正确的,但与直觉相反——在评论中解释它!这里的目标是使您的输出可重复,并允许其他人轻松验证结果。**在 SQL 脚本编写过程中概述上述内容将很快成为您的第二天性,您将对反复出现的错误形成自己的直觉。除了在我们的工作中建立更多的信心,我们也让我们的同行能够拿起剧本,理解其目的,并以最少的麻烦评估其功效。

监控您的数据流

令人难以置信的是,对数据接收的许多看似无关紧要的更改会影响您的数据管道。这里有一些例子:

  • 由于贩运问题而出现的空值
  • 日期格式、内部 id、国家代码在供应商之间变化
  • 由于 API 故障而出现的重复
  • 手工输入的数据填写不正确

这些问题中的任何一个都可能以看似模糊的方式影响多个查询,从导致连接失败、中断 NOT IN 语句到弄乱 WHERE 子句。如果在每个处理阶段都没有清晰的数据可见性,这些问题往往会被忽视,最终导致头痛。问题出现的时间越长,后果就越严重——尽早发现这些问题是顺利运营的关键。

清晰的数据可视化是解决这个问题的关键。一种简单的方法是创建一个管道监控表,在数据处理的每个阶段插入关键指标的计数,并在 BI 工具中可视化输出:

INSERT INTO qa_pipeline
(SELECT table_name
,CURRENT_TIMESTAMP() as run_timestamp
,count(*) as row_count 
,COUNT(primary_key) as primary_key_count
,COUNT(distinct_primary_key) as distinct_primary_key_count 
,COUNT(*) FILTER (WHERE important_field > '') as important_field_population
,SUM(important_kpi) as important_kpi_sum
FROM raw_table)

这是一个非常有用的,通用的格式,我们希望如何跟踪我们的数据。创建表的可视化,如 qa_pipeline ,并跟踪重要值,如行数、字段填充、KPI 总和以及查询之间的主键交互,可以实现快速调试。例如,在原始表中,主键总是唯一的。在您创建新表并加入额外信息的清理脚本中,如果我们现在看到主键计数增加,我们知道清理脚本导致了一些重复。相反,如果我们看到不同的主键计数减少,我们知道有些已经被过滤掉了:

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

2020 年 1 月 1 日完整数据管道的可视化示例(Qliksense)

上图展示了这些 qa_pipeline 表格的威力。显而易见,最终表格中的每个指标都加倍了,这表明脚本中产生 final_output 的逻辑有错误,这导致了重复。通过简单地观察每个脚本或查询的真实输出,可以发现许多问题。如果我们看到 *important_kpi_sum,*显著下降,这将表明在使用 important_kpi 时出现了错误,或者在聚合逻辑中出现了错误——这是应该审查代码的明显迹象。虽然对许多分析团队来说,定期手动检查整个输出可能需要太多的资源,但是每天早上快速检查这些汇总可视化将导致更主动的解决方案来诊断不正确的 SQL 脚本。

同一个表的另一个用例是确保您的数据被正确接收— **原始数据的质量将反映您的输出质量。**使用 qa_pipeline 表格可视化查看您的摄取表格指标,可以轻松监控您的数据是否符合预期格式。可以轻松快速地识别异常结果,如低行数、缺失天数和大量缺失字段:

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

一月第一周 raw_table 人口的可视化示例(Qliksense)

快速浏览一下,我们可以看到我们的 raw_table 存在一些摄取问题。在 1 月 3 日运行该脚本时,我们看到的行数是我们看到的不同主键的三倍,这表明数据可能被摄取了三次。此外,在 1 月 5 日,我们可以看到我们的 important_field 没有完全填充,这暗示了一些跟踪问题。只需看几秒钟的图像,我们就可以清楚地评估数据的质量并突出任何问题,进一步提高我们对问题做出反应并有效解决问题的能力。

在展示这些计数时发挥你的创造力,以适应你的业务用例。你的直觉在这里是一个有价值的资源——学会预测你的代码将如何影响你的数据,并将其与这些 qa_pipeline 表提供的可视化进行一致的比较。在接收时、数据清理期间和生成可交付结果之后设置这些 INSERT INTO 查询,可以让您对脚本的执行情况有一个端到端的清晰了解,从而节省调试和防止任何错误的宝贵资源。

减少依赖性

一个有能力的分析师可以解决任何问题。理论上,如果数据质量保持不变,所有代码都应该运行良好。然而,当管理来自不同来源的多个数据流的摄取时,这种数据质量从来没有得到保证。保持高质量数据的最简单方法可能是**自己控制它,当问题出现时,允许完全的自主性和更大的反应能力。**下次您接收第三方数据时,请考虑以下几点:

  1. 如果我们发现了一个错误,那么源头能多快解决它?
  2. 我可以通过在内部生成这些数据来获得自主权吗?
  3. 是否有任何手动流程可以自动化以减少人为错误?
  4. 我们如何利用这些资源来减少对它们的依赖?

考虑这个场景:

“一个国际第三方正在以每日 excel 报告的形式提供时间序列数据。由于他们所在地区的夏令时,他们提供的时间戳都晚了一个小时,这意味着您在提供的报告中少了一个小时的数据。他们处于完全不同的时区,直到早上才能纠正问题,而客户要求在当天结束前提交一份重要报告。”

这可不是什么好玩的地方。你可以强有力地证明第三方甚至不是同谋,因为这个过程由于许多原因存在固有的缺陷。然而,如果我们对他们提供的数据有自主权,例如通过直接查询他们的 API 我们可以简单地再打一个电话,在几分钟内纠正时间框架。不再错过最后期限,不再有不满意的客户。

事实上,第三方可能没有您可能已经习惯的相同资源、基础架构、实践或方法。这种差异可能会导致摄取、处理或呈现中的错误,如果您出于任何原因需要请第三方重新格式化或再现数据,修复这些错误的速度可能会很慢。尽可能保持对数据的自主权,使您能够更快地应对变化,更快地找到解决方案,并将生产优化到您可以控制的水平。

同行评审和优化

在我的分析师生涯中,帮助我的一个关键因素是我向他人学习的能力。我真的很喜欢学习为什么人们在他们所做的事情上成功,以及他们所拥有的特质,我可以把这些运用到我自己的生活和事业中。来自他人的一致的、建设性的反馈确实可以加速你的学习,并激励你做得更好,在分析环境中,同行评审对此至关重要。让同事审查您的代码有很多好处:

  • 为您的数据输出增添更多信心
  • 创造学习新技术的机会
  • 在团队和同事之间分享知识
  • 提供另一个思考角度,引发对方法的讨论,并促进更具创新性的解决方案

一双新鲜的眼睛对改进你的代码有着不可思议的影响。让某人处理相同的问题,思考相同的过程并得出相同的结论,对于在过去两个小时内一直盯着同一个多重连接,无法确定它是否正常工作的人来说是非常有益的。我不记得有多少次我带着一个困扰我的 bug 走到队友桌前,只为了让他们在 30 秒内发现它,或者建议一个更有效的方法来达到预期的结果。其中一个最大的原因是,bug 或重复经常出现在最难注意到的、模糊的和不明显的 SQL 交互中,包括最不重要的情况。

作为一名分析师,您识别潜在边缘情况并对其进行解释的能力,最好是在它们发生之前,对于在它们成为现实之前防止任何问题是至关重要的。单独考虑每一个潜在的边缘情况是极其困难的,几乎是不可能的,所以利用你所拥有的最好的资源——与你的团队和同事进行富有成效的讨论。在您的工作流程中建立一致的同行评审,以确保没有任何代码在没有被至少一个同事看到的情况下投入生产,这对于增加您作为分析师的自信大有帮助,并且可以极大地加快工作的交付。

结论

确保你的交付品尽可能的高质量意味着尽可能多的考虑错误场景。一旦应用了上面的基础设施和 QA 过程,你会很快发现在 bug 检测、错误管理、交付质量和利益相关者满意度方面有了巨大的改进。我希望这篇文章对您有用,并且您可以应用其中的一些实践来改进您的数据管道过程。

如果你喜欢这篇文章,并想与我联系,请随时在 LinkedIn 上联系我:https://www.linkedin.com/in/michael-gendy-a04263161/

A/B 测试实用指南

原文:https://towardsdatascience.com/the-practical-guide-to-a-b-testing-28c8b3235905?source=collection_archive---------47-----------------------

你的统计学课本没有让你做好准备

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

Unsplash 上由路易斯·里德拍摄的照片

我在 Squarespace 担任数据科学家期间,花了很多时间在 A/B 测试上 。许多人对实验不屑一顾,认为这是“分析工作”,并且对此不太感兴趣。对我来说,A/B 测试是更多地参与产品开发的一种方式,并对出货的产品产生重大影响。老实说,我真的很喜欢。

我很早就意识到,你在统计学教科书上学到的东西和实验在实践中的运作方式之间存在着巨大的不匹配。在 A/B 测试中取得成功并不取决于分析方法。是流程和人的问题。

知道你在做什么测试

这不是关于 t 测试或 z 测试。这不是贝叶斯和频率主义方法的问题。除了你选择如何评估结果之外,还有不同种类的 A/B 测试。首先,你必须设定实验的背景。测试前的不确定性导致测试后的错误决策。

好的 A/B 测试分为三类:大赌注、健康检查和迭代。先说大赌注。这些测试会以某种方式对你的主要指标产生很大的影响。可能有一些尚未被证实的假设驱动着这个实验。这里有一个问题:如果变体和控制之间没有显著的区别,你会遵从控制。发布没有影响力的特性会导致产品混乱,并浪费时间来维护代码。

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

远离危险区域

像大赌注一样,健康检查是产品中相当大的变化。它们的不同之处在于测试的上下文。这些都是你想要推出的新功能或大的产品变化。它们可能是组织内较大计划的最小可行版本,或者它们只是为用户提供了更好的体验。您不需要检测出显著的差异来发布这些更改。您只需要确保它们不会有意义地损害度量标准。思考这些测试的一个聪明的方法是,第一个版本代表了这个变体可能的“底线”。当然,这取决于后续工作流程。如果没有“下一步”的愿景,那么这是一个危险信号,你可能会把一个大赌注误认为是一次健康检查。

好的 A/B 测试落入的最后一个绑定是迭代。当大多数人想到 A/B 测试时,想到的就是这个。这就是我们熟知并喜爱的 50 种蓝色的例子。不要期望这些测试会产生巨大的影响,但是如果你有足够的流量,它们会很强大。值得注意的是,对于大多数组织来说,这是一个很大的“如果”。在这里认真对待功耗分析。如果测试需要 2 个月的时间,那么它还不足以成为 A/B 测试的优势。那里有更低的悬挂,更有影响力的水果。

在上面的可视化中,还有一个象限我没有触及。危险区域是当您预期对您的主要指标有小的影响,但即使没有显著差异也愿意推出它。如果你是谷歌,也许这是有道理的。如果你不是谷歌,这是一个不必要的预防措施,会占用带宽,导致没有可操作的结果。为了安全起见,我通常建议首先推出这一阶段的测试,然后在之后监控指标。

把一切都写下来

在开始 A/B 测试之前,你有很多理由想把所有的事情都写下来。这不是一个新颖的建议,但它也是我不得不提及的许多常见失误的根本原因。

**大规模进行 A/B 测试是一项跨职能的努力。**可能会涉及数据科学和分析、产品、工程,可能还包括设计。对于所有这些不同的接触点,你需要一个“真相来源”文档。这是你可以给人们指出足够的背景的东西。

考试前把事情写在纸上的另一个好处是——它帮助你避免偏见。产品负责人应该清楚地陈述他们运行测试的假设和前提。这有助于其他人回顾并确保他们理解。在测试完成后拥有它也很好,这样你就可以很容易地检查假设是有效的还是无效的。

最后,文档是关键。在一个集中的、可搜索的地方保存这些 A/B 测试文档的运行日志将会在以后带来巨大的好处。这变成了你在构建产品时所学一切的知识库。团队中的老手将参考它来获得产品见解,而新手将能够更快地建立对产品的理解。

“纸是用来写下我们需要记住的东西的。我们的大脑是用来思考的。”——阿尔伯特·爱因斯坦

了解您的主要衡量标准

与最后一个写下来的要点相关,你应该在测试之前陈述你所关心的指标。在大多数情况下,我喜欢将这些分为主要的、次要的和“将监控”的。

很多人出错的地方在于他们想要跟踪太多的指标。有一系列次要的和“将被监控”的指标是可以的,但是你只能有一个主要的指标。这是你的主要决策标准。如果你试图在多个数据点之间进行权衡,你会偏向于扭曲数据,使偏向于你的先入之见

这看起来很简单,但可能很难。如果您正在运行一个结账优化测试,并且您发现变体提高了转换数量,但是降低了平均购买价值,该怎么办?你如何处理这些相互冲突的变量?需要考虑的因素很多,但是预先对哪些指标最重要有一个统一的看法会让您在决策时更加轻松。

如果需要,与工程部门合作

我不确定 A/B 测试基础设施在您的组织中是如何建立的。我发现不同的公司有很大的不同。有大的科技公司,他们什么都有,也有小的创业公司,他们在西部蛮荒。如果你不是前者,赋值逻辑永远不会像看起来那么简单。

您应该在书面文档中详细说明谁将被分配,他们将被分配到什么唯一的 id,以及该分配何时发生。如果您的基础设施不能为您处理这种复杂性,那么就需要处理这种复杂性。你可能需要与工程合作,以正确的方式实现事情。这不是世界上最有趣的工作,但值得投入时间和精力来做好这件事。否则,到了评估时间,你会发现自己在试图拼凑破碎的作业,而你不会过得很愉快。

洞察力转化为未来的测试

因此,您最终运行了测试,并耐心等待结果。这就是事情变得令人兴奋的地方!奇怪的是,数据科学家在这里变得懒惰。他们报告关键指标,命名获胜的变体,然后收工。这是一个错过的机会!

A/B 测试中最有趣的部分隐藏在分析中。这是你了解人们如何使用你的产品的地方。你应该写下这个分析,并作为你报告的一部分,与参与测试过程的每个人分享。这种分析通常会暴露其他假设,导致更多的测试等等。这就是实验的周期性。测试不是线性的。它们相互补充。

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

精益启动

将你的思维产品化

当您的组织达到一定规模时,您将遇到这个奇怪的中间地带,您有一个数据科学团队准备好处理更专业的问题,但 A/B 测试仍然占用了过多的时间。你在这里做什么?

如果你想在你的组织中推广 A/B 测试,那么你需要将你的想法产品化。你听说过 Airbnb 和脸书的工具,员工可以用它们来发起和评估测试,都是自助式的。这是一个将数据科学过程封装到任何人都可以使用的工具中的很好的例子。从技术上和文化上来说,这是一个艰难的转变,但这是一个你总有一天要完成的转变。这应该是你的想法,最好是在为时已晚之前。

离别的思绪

我之前提到过 A/B 测试是一项跨职能的工作。像任何团队运动一样,有时你必须为了更大的利益而妥协。这可能意味着以不太准确、更容易理解的方式呈现结果。这可能意味着在考试前花更多的时间写下你的思维过程。这可能意味着在测试启动后将破碎的任务数据拼凑起来。

这些权衡在每次测试中都在发生。你可以忽略它们,或者承认它们的存在,并一起努力达到可能的最佳状态。当你选择后者时,最终会收获颇丰。

向 Josh Laurito、Greg Allen、Andrew Bartholomew 和我在 Squarespace 一起工作的所有人大声喊出来,同时缓慢但坚定地捡起这些东西。

感谢阅读!在 Twitter 上找到我,不要忘记 订阅 我的每周简讯,获取任何新帖子和有趣的链接。看看下面一些类似的帖子:

我希望在开始数据分析时就有实用的 SQL 指南

原文:https://towardsdatascience.com/the-practical-sql-guide-i-wish-i-had-when-i-started-data-analysis-537c93907268?source=collection_archive---------18-----------------------

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

照片由阿伦视觉Unsplash 拍摄

SQL 已经成为各行各业和各种工作岗位的通用技能要求。公司要求他们的数据分析师、数据科学家和产品经理至少熟悉 SQL。这是因为 **SQL 仍然是数据的语言。**因此,为了实现数据驱动,人们需要知道如何访问和分析数据。

当我作为一名分析师寻找学习 SQL 的资源并为面试做准备时,所有的网站都有一套非常标准的“员工-薪水”表,其中包含非常基本的查询。虽然我从这些例子中很好地理解了 SQL 的基础知识,但是它没有理解在我们通常处理较大查询的实际环境中哪些概念是最重要的。所以我决定总结一些关键的提示,我希望我在开始我的旅程时就已经强调过了。

了解你的基本查询结构

这是最基本也是最重要的提示。无论问题有多复杂,您都应该记住基本结构,并将查询的每个部分分解成这个结构。即使当我处理多个表和连接时,它也总是有助于记住基本结构。

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

基本 SQL 查询结构

了解你的等级和分区

在我做分析师的这些年里,接受几次采访是最常用的功能之一。这用于根据特定值对行进行排序,并按其他属性进行分区,或者查找聚合函数的滚动值。

当您需要所有行的唯一等级时,务必使用 row_number 而不是 rank/dense_rank。(3 种类型在秩函数上的区别是一个常见的面试问题。这里是一个很好的总结,供参考。)

这些功能可以帮助我们解决多个问题,例如:

查找特定过滤器中的最新条目—

查找累计金额—

从表格中删除重复行-

以及更多我可能还没有遇到的问题。

使用时间和弦

我用过的最常见的过滤器通常是基于时间和字符串的。这里有一些操纵时间的重要函数

重要的日期函数

对于 string,你应该熟悉LIKE函数中使用的所有条件来识别模式。你可以参考一个完整的列表,但是总结一下,%用来表示任意数量的字符,而_用来表示单个字符。[]可在 SQL Server 中用于检查多个字符。例如,在一列name中查找名字,其中第二个字符有一个元音,最后一个字符是“t”

SELECT name from Table WHERE lower(name) **LIKE '_[aeiou]%t'**

一个额外的提示,如果你把结果导出为。csv 始终记得删除所有字符串列中的逗号,以确保文件的格式正确。使用regexp_replace(column_name, ’,’ , ’’) as column_name删除列中的逗号。

熟悉连接并使用正确的格式

不幸的是,您几乎不会只处理一个表,大多数查询都有许多子查询和连接。所以你必须总是把你给定的问题分解成更简单的查询,然后解决问题。在这种情况下,连接的基本知识非常重要。(也是很常见的面试问题)。

我使用的最常见的连接是左连接,这是我们需要保留第一个表中的所有数据,不管我们是否在第二个表中找到匹配。让我们在下一节的例子中看到这一点。

此外,当处理多个表时,具有适当缩进的代码格式是最重要的。写任何代码时都要记住这一点——如果我把它交给第三个人,理解起来会有多容易。

过滤计数和总和输出的用例

你可以在过滤输出时使用 case,就像在 Excel 中使用 count if 一样。

(另一个常见的面试问题是count(*) 的区别,它返回 null 和非 null 的行数 vs count(1) 将计算所有的行,因为表达式“1”对于每一行都计算为非 null vs count(column_name) 对于给定的列计算具有非 null 值的行)

让我们在下面的查询中看到这一切,我们将尝试找出阿姆斯特丹取消最多的顶级优步司机,并查看他们的登录时间和完成的骑行。我们将把包含所有已登录司机详细信息的登录时间表与包含所有状态为“成功完成”、“提前完成”、“被客户取消”或“被司机取消”的预订的预订表连接起来。

我希望这个指南能帮助你在编写 SQL 查询时变得更加自信,并解决你作为一名分析师甚至是一名受访者所面临的下一个问题。

感谢阅读。

本赛季英超发生了什么。

原文:https://towardsdatascience.com/the-premier-league-wrap-up-1cc60c89894e?source=collection_archive---------74-----------------------

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

图片来源:https://www . pexels . com/photo/football-green-Liverpool-premier-league-104706/

世界上最具娱乐性的足球联赛分析

他的英超赛季直到最后一刻都充满了享受、悬念和戏剧性。利物浦以 99 分赢得联赛冠军,并打破了许多纪录,如在还剩 7 场比赛的情况下赢得联赛冠军。尽管曼城的表现高于平均水平,但仍落后冠军 18 分。

曼联在签下布鲁诺·费尔南德斯后踢出了一些令人惊叹的足球,布鲁诺·费尔南德斯已经被证明是顶级球员,并且与在弗兰克·兰帕德手下度过了一个不错赛季的切尔西一起获得了冠军联赛的参赛资格。对莱切斯特和布伦丹·罗杰斯来说太糟糕了,他们从第二名跌至第五名。

在赛季末,托特纳姆踢了一些精彩的足球,一些漂亮的团队合作,并在下赛季之前展示了一些惊人的前景。说到下赛季,阿森纳将永远是阿森纳,因为他们已经处于自 1995 年以来的最低点,他们没有希望了。

在冠状病毒爆发中经历了这个伟大的足球赛季后,我决定想象一下球队和球员在 2019/20 赛季英超联赛中的表现

英超联赛 2019/20 分析

收集了球队和球员赛季表现的数据,并使用 r 进行分析。最终的排行榜是通过这个链接获得的。

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

2019/20 赛季英超积分榜

新的冠军利物浦获得 99 分,距离曼城创造的 100 分的联赛纪录还差一分,曼城排名第二,在向欧足联提出上诉后,现在有资格参加冠军联赛。曼联和切尔西分别获得第三和第四名,曼联以净胜球领先。伯恩茅斯,沃特福德和诺维奇城在降级区结束后被降级到英冠。

最大赢家对最大输家

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

左图是以降序排列的获胜游戏条形图。右图是以降序排列的输了的游戏的条形图。

毫不奇怪,利物浦赢得了最多的胜利。在一个一边倒的赛季后,利物浦赢了 32 场比赛。曼城以 26 胜排名第二。切尔西以 20 胜排名第三,复兴的曼联 18 胜。在获胜图表的底部可以看到两支降级的球队:沃特福德和诺维奇城。

本赛季最大的输家是诺维奇,输了 27 场。那是毁灭性的。伯恩茅斯和阿斯顿维拉分别以 22 负和 21 负的成绩位列第二和第三。我的球队利物浦,输了最少的比赛,3 场。

本赛季最大的积分分享者

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

各队抽签游戏数量的条形图

具有讽刺意味的是,并列第一的是三支球队:阿森纳、狼队和布莱顿队。他们都平了 14 场比赛。谢菲尔德和曼彻斯特联队以 12 平的成绩位居第二。曼城和利物浦各三场比赛,平局最少。

进球与失球

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

左图是进球数柱状图,右图是失球数柱状图

曼城以 102 球进球数最多。利物浦在这一部分获得第二名,落后 17 球。切尔西第三,进了 69 个球,莱斯特第四,进了 67 个球。沃特福德,水晶宫和诺维奇城似乎失去了他们的射门靴,因为他们是最后三名。

不出所料,诺维奇城以 75 个失球成为失球最多的球队,平均每场比赛丢 2 个球。阿斯顿维拉和伯恩茅斯分别位居第二和第三,分别丢了 67 和 65 个球。利物浦队的防守再次被证明是严密的,因为他们丢了最少的球。

玩家分析

使用这个链接从英超联赛网站收集关于球员表现的信息。

最高得分者

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

2019/20 赛季进球最多的前 20 名球员

杰米·瓦尔迪在本赛季处于巅峰状态,进了 23 个球后获得了金靴奖。奥巴姆扬以 22 个进球位居第二。说到稳定性,这和他上赛季的进球数是一样的。Ings 也是第二名。斯特林在过去的几场比赛中进了很多球,他的总进球数达到了 20 个,并攀升至第四名。萨拉赫以 19 个进球排在第五位。

顶级组织核心

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

2019/20 赛季助攻最多的前 20 名球员

德布鲁恩已经做了一些工作,他平了蒂埃里·亨利单赛季 20 次助攻的纪录。这使他在助攻方面位居第一。紧随其后的是两位出色的利物浦组织核心。亚历山大·阿诺以 13 次助攻排名第二,罗伯逊以 12 次助攻排名第三。

最干净的床单

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

2019/20 赛季最干净的前 20 名球员

在确保 16 场零失球后,埃德松在后防线上非常强大。他赢得了本赛季的金手套奖。排在第二位的是尼克·波普,他这个赛季表现出色,15 场比赛没有失球。阿里森、德赫亚、舒梅切尔、帕特里西奥和亨德森都以 13 场零失球排名第三。

结论

这个赛季是我有史以来最好的英超赛季之一,因为利物浦终于举起了 30 年来的英超奖杯。为了确保前四名的位置和避免降级的底部都有战斗,这使得观看比赛直到最后都很有趣。

有趣的事实

利物浦足球俱乐部在过去三个赛季中输掉了 9 场比赛,这与曼城本赛季输掉的比赛数量相同。

用于执行项目的完整版代码可以在这里看到

感谢您的阅读。

在风城搭车的特权

原文:https://towardsdatascience.com/the-privilege-to-get-a-ride-in-the-windy-city-7431513004e?source=collection_archive---------55-----------------------

不出所料,富人骑得更频繁。

绰号“风城”的芝加哥无疑给人一种寒风刺骨的印象。平均而言,芝加哥的气温在 10 月份下降最为明显。2019 年万圣节,据芝加哥论坛报报道“雪最大的万圣节”,气温特别低,达到 24 度。

除了独特的天气之外,芝加哥还以一个种族隔离的城市而闻名,那里有一些“明显的贫富分界线”(芝加哥商业)。根据同一篇文章,该市的中产阶级正在萎缩,“五分之四的前中产阶级成年人已经沦为低收入阶层。”

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

照片由贾斯汀·艾斯纳Unsplash 上拍摄

在上述背景下,我有兴趣调查分层的芝加哥的拼车模式如何受到十月天气减少的影响,提供了由芝加哥拼车公司生成的 出行数据集 **。**本文的其余部分是对芝加哥市在其数据门户上提供的交通网络提供商出行数据集的研究。我将介绍:

  1. 假设和方法
  2. 数据集分析
  3. 形象化
  4. 相关性的线性回归
  5. 结论

假设和方法论

数据集的在线仪表板的可视化结果可以证明,10 月份拼车的使用有所增加。因此,我把我的问题集中在拼车模式是如何在整个城市发生空间变化的。我的假设是,拼车使用的变化对城市的影响是不均衡的:

  • 较富裕的社区与较贫穷的社区表现出不同的模式,因为较富裕的社区有更高的可支配收入,因此在寒冷的天气里可以负担更频繁的拼车。
  • CTA“L”服务可以抵消邻近区域的增加,因为它提供了一种选择。

为了测试这一假设,我将比较 2019 年 10 月上半月和下半月的乘车份额模式。2019 年 10 月 17 日将是两个组的划分日期,我将想象每个人口普查区域的以下特征:

  • 平均每日出发和到达次数
  • 到达时的平均行程持续时间和行程里程

可视化将有助于确定 10 月份拼车模式的变化。绘制整个城市的变化图,我想在空间上将这些变化与中等家庭收入的分布和同一地区的铁路线进行比较。

涉及的其他数据集包括:

数据集分析

数据分析包括几个步骤:

数据收集: 所有数据集均从上述链接站点获取。

聚集: 经过一些初步的清理,旅行数据集以 10 月 17 日 00:00am 为时间点分为两组,上半年 16 天,下半年 15 天。通过表连接,每月上半月和下半月的以下拼车功能将汇总到人口普查区域级别:

  • 平均每日接送
  • 到达时行程持续时间和行程里程的平均值、中间值和标准偏差

准备可视化: 将所有未投影的数据集投影到状态平面。连接表中设计了几个功能:

  • 上半月平均每日接送率
  • 平均每日接送百分比变化
  • 中位行程持续时间和中位行程里程的百分比变化

百分比变化计算如下:(second_half - first_half ) / first_half

形象化

为了通过比较得出有意义的结论,本文中所有关于拼车的可视化都与城市中值收入分布的可视化并列。

每日接送率,上半月

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

作者图片

虽然城市的大部分地区显示出混合的接送率,但接送率似乎最稳定(约 12~15%),并且集中在北部、东部的红线和西部的蓝线之间,与最富裕的社区相对应。

日均接送百分比变化

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

作者图片

总的来说,存在着南北分界线,这也与财富线相对应。灰色区域显示接送人数略有增加的趋势(≤ 15~17%),而橙色区域增加显著(≥ 15%)。蓝色区域略有下降(≤11~16%)。

中位行程持续时间和中位行程里程的百分比变化

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

作者图片

关于旅行持续时间和里程的变化,模式不太明显。灰色区域显示行程持续时间和里程没有显著变化(5%以内)。浅蓝色显示略有下降(≤ 11~12%),而橙色显示略有上升(≤ 10~19%)。

相关性的线性回归

鉴于可视化,我想测试之间的相关性变化接送与收入,距离市中心,以及车站的数量。我将通过线性回归测试它们的相关性:

Change = income + distance_downtown + number_station + constant

距市中心距离: 粗略目测,选择市中心作为普查地段 8391 的质心。到市中心的距离计算为人口普查区域 8391 的质心和每个人口普查区域的质心之间的欧几里德距离。

站点数量: 执行空间连接以计算落入每个普查区域的站点数量。

标度: 收入、离市区的距离和站数都是百分排名。

回归: 普通最小二乘回归使用包statsmodel:

import statsmodels.api as sm# same for dropoff and pickup
X = datamodel.dropna()[['income', 'distance', 'station']]
X = sm.add_constant(X)
Y_d = datamodel.dropna().change_dropoffmod_d = sm.OLS(Y_d, X).fit()
mod_d.summary()

模式摘要:

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

左图:衰减变化的模型总结;右图:皮卡变化的车型总结;作者图片

虽然调整后的 R 平方对于两个模型来说都非常低,但我们仍然可以认为收入和离市中心的距离都与下降或上升的变化强烈相关,由小 P 值支持。就系数而言,收入为正,而距离为负。

最后,站的数量相关性相当弱。

结论

我们可以得出结论,出行分担率变化的空间格局与收入分布和离市中心的距离相关。当天气变冷时,富人会更频繁地骑车。然而,贫困社区和远离市中心的地区乘客数量的下降却没有得到很好的解释。

虽然我没有测试旅行持续时间和里程,但他们的可视化并没有显示出城市大部分地区的太大变化。然而,两者在边缘地区的增长无疑表明了与市中心距离的相关性。

本文是为哥伦比亚大学建筑、规划和保护研究生院城市规划系教授 Boyeong Hong 教授的课程城市信息学撰写的。

缺失数据的问题

原文:https://towardsdatascience.com/the-problem-of-missing-data-9e16e37ef9fc?source=collection_archive---------30-----------------------

关于缺失数据的关键概念

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

全球范围内的数据生成正以指数级和分布式的方式增长。一些因素促成了这种情况,例如数据存储设备在存储空间和数据访问速度方面的发展,以及存储这种数据的方式。

美国犹他州一家名为 DOMO 的数据集成公司在 2018 年进行了一项名为“数据从不睡觉 6”的研究。它的主要目的是回答以下问题:我们每分钟产生多少数据?
他们得出结论,预计到 2020 年,每人每秒将产生 1.7 兆字节的数据,即每分钟 1020 兆字节。图 1 说明了一些公司在 2018 年产生的估计数据。

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

图 1:2018 年各公司每分钟产生的数据量图解。来源:改编自 Domo Inc [DOMO,2018]

已经开发了标准统计方法和/或机器学习算法来分析矩形和完整的数据集。通常,数据矩阵的行表示单元,根据上下文也称为案例、例子、观察或主题,列表示为每个单元测量的变量或特征。数据矩阵中的条目几乎都是实数,要么代表基本上连续的变量的值,如体重、身高和收入,要么代表可能有序(教育水平、社会阶层)或无序(性别、婚姻状况)的类别。

当数据矩阵中的某些条目没有被观察到时,就有一种现象叫做数据缺失。丢失数据的一些原因是,例如,拒绝回答调查中的一些问题,热或温度传感器故障。有一些处理缺失数据的策略,如通过为数据矩阵中未观察到的条目创建一个或多个特殊代码来识别未回复,如“不知道”或“拒绝回答”,另一种方法是排除具有缺失值的单元。这最后一个策略是非常不合适的,因为我们通常感兴趣的是对整个目标群体进行推断,而不是对某个数据集的目标群体的一部分进行推断。

缺失数据模式

当分析数据集的某些不易察觉的知识时,这些数据是以表格格式(矩形或矩阵)观察的。从这个意义上说,可以观察到缺失数据的一些模式。斯查费和格雷汉姆[2002]认为,识别这些缺勤模式是选择最佳技术来填充这些值并对这些模式进行一般(或随机)或特定分类的重要一步。

在缺乏一般(或随机)模式数据的情况下,正如分类本身所表明的,这种缺乏分散在数据集中的任何记录中。关于特定的缺席模式,这些被分为两个单变量和单调的亚型[斯查费和格雷厄姆,2002]。

在被分类为单变量的模式中,当单个变量出现在项目 Y 中时,存在指向单个变量的缺席分布,但是 p 其他项目 X1,…,Xp 的集合保持完整。这种模式还应该包括这样的情况,即 Y 表示一组完全观察到的或完全缺失的项目,简而言之,被限制到一个数据集变量。在单调模式中,在不止一个变量中观察到缺失,使得一组项目 Y1,…,Yp 在排序时,如果 Yj 包含缺失值,那么 Yj + 1,…,p 也将包含【斯查费和格雷厄姆,2002】。图 2 说明了这些概念。

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

图 2:矩形数据集中的缺失模式:(a)单变量模式,(b)单调模式和任意模式。在每种情况下,行对应于可观察的单位,列对应变量。来源:改编自[Schaferand Graham,2002 年]

缺失数据机制

应该观察的另一个特征是数据缺失的机制,换句话说,是什么导致了缺失。斯查费和格拉汉姆[2002]指出,根据统计文献,机制可能是一个过程,通过这个过程,一些数据产生,而另一些数据丢失。Little 和 Rubin [2019]认为该机制与数据丢失的过程有关,并指出了解数据缺失是否与数据集变量的潜在值有关的重要性。

Statistically Little 和 Rubin [2019]对它们的定义如下: Y 为完全数据集, M 为缺席集,缺席机制的特征是给定 Y,f (M | Y,φ) 的条件分布 M 其中, φ 表示未知参数。

Rubin [1976]定义了缺席机制的三种表现形式:完全随机(MCAR——完全随机缺席)、随机(马尔——随机缺席)和非随机(NMAR——非随机缺席)。

当数据缺失的真正原因未知,并且与任何其他数据集属性没有关系时,即当 M 不依赖于 Y 的值时,数据缺失被分类为完全随机的,因此如果对于所有的 Yφf (M | Y,φ) = f (M | φ) ,数据缺失机制被分类为完全随机的。如果缺失值依赖于任何数据集属性,则被归类为随机。设 YobsY 的完全观测子集, Ymis 为缺失数据的观测子集,对于随机的缺失机制, Ymis 必须依赖于 Yobs ,即对于每一个 Ymis,φ ,如果 (M | Y,φ) = f (M | Yobs,φ) 。还有第三种称为随机的缺失机制,在这种情况下,缺失分布 M 取决于由 Ymis 表示的缺失值。Graham 和 Donaldson [1993]将这种缺勤机制定义为不可使用,因为它不可测量,因此不可用于评估。

分析后,可以采取一些措施来解决缺失数据,忽略这种缺失是一种可能的措施,但用实际增加值代替缺失值是解决这一问题的一种非常合理的方法,Rubin [1988]。一篇即将发表的文章将讨论这个话题。

参考资料:

  1. DOMO(2018). data never sleeps 6.0 .https://www.domo.com/assets/downloads/18DOMO data never sleeps 6+verticals . pdf
  2. 斯查费和格雷厄姆(2002 年)。缺失的数据:我们对技术现状的看法。心理学方法,7(2):147。
  3. Little,R. J .和 Rubin,D. B. (2019 年)。缺失数据的统计分析,第 793 卷。
  4. 鲁宾博士(1976 年)。推断和缺失数据。生物计量学,63(3):581–592。
  5. 格雷厄姆、J. W .和唐纳森(1993 年)。用差异营养评价干预:无反应机制的重要性和随访数据的使用。应用心理学杂志,78(1):119。
  6. 鲁宾博士(1988 年)。多重插补概述。美国统计协会调查研究方法部分的进展,第 79-84 页。Citeseer。

面向企业的人工智能开发工具的问题(以及宜家与它的关系)

原文:https://towardsdatascience.com/the-problem-with-ai-developer-tools-for-enterprises-and-what-ikea-has-to-do-with-it-b26277841661?source=collection_archive---------7-----------------------

一年多前,我分享了我关于为什么大多数专注于企业深度学习工具的初创公司会失败的想法。这个帖子引起了很多关注(在彼得·诺维格的帮助下,他发布了一个关于它的视频),不止一个上述初创公司的创始人告诉我,他们的投资者让他们写了一份回应。我为造成的任何不便道歉,但在这个空间进行更多的审查肯定会有所帮助。

不幸的是,从那以后,情况并没有太大的变化。我亲切地描述这些天来大多数人工智能开发者栈的方式是,他们是*“就像 DIY 工艺包,缺少说明书和 70%的部件”*。创新需要时间。

为了解释我们如何走到这一步,并帮助指导我们需要去哪里,我总结了在技术创新生命周期的早期阶段常见的三个主要挑战。最重要的是,我们还没有为 ML 平台找到一个主导的设计,这导致了具有不明确接口的不同范围和形状的系统的扩散。因此,事实证明,为面向企业用户的人工智能开发工具创造合适的外形非常困难。最后,这就是宜家的用武之地,如今企业消费这些工具的主要方式不幸遭遇了宜家效应

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

图 1 : ML 平台通常缺少很多部件,几乎没有汇编指令(图片由作者提供,徽标来自开源项目 SparkTensorFlowAirflowKubernetesDocker

“今天的开发者书库就像 DIY 工艺包,缺少说明书和 70%的零件。”

人工智能开发工具缺乏主导设计

新技术的出现通常伴随着可能的解决方案设计数量的扩展和收缩。人工智能将改变许多行业,这不再是有争议的,往往会成为一种战略优势,甚至创造新的“人工智能优先”的商业模式和公司。因此,所有主要的云供应商(和无数的创业公司)都在堆积资源,将人工智能开发工具带给更广泛的受众,最重要的是大企业。所有这些供应商都试图解决相同的用户需求,但采用截然不同的方法和结果,导致不同设计的激增。

ML API 中的主导设计

这种现象存在于堆栈的每一层,通常是自下而上的。作为 2016 年谷歌大脑团队的一名项目经理,我记得我试图合理化谷歌内部为 TensorFlow 出现的 20 多种不同的高级 Python APIs。最终,我们集中于估算器和层 API(在 TensorFlow 2.0 中与 Keras 合并)。

一旦某个设计的用户采用率远远超过其竞争对手,它就会成为标准(或“主导设计”),该领域的其他参与者也会遵循它,例如,参见 PyTorch 中的等效 API。对主流设计的融合需求在平台产品中尤为明显,因为维护无数竞争设计的成本非常高,就像 ML 框架的情况一样,数据科学家、ML 工程师、ISV、教育工作者等等。无法应对成百上千的重叠和不兼容的 API。

ML 平台的主导设计

当我们谈论“面向企业的人工智能开发工具”时,我们实际上是在谈论一种叫做“ML 平台”的新兴技术。事实上,我们缺少 ML 平台的主导设计也意味着没有普遍接受的定义,所以我只给你一个非常基本的定义:ML 平台是一种水平技术(即不特定于垂直用例),它提供覆盖 ML 应用程序整个生命周期的所有功能。我之前的博客文章中的图有助于说明这样一个平台的不同组成部分。

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

图 2 :被认为是 ML 平台一部分的不同组件的简单概述(图片由作者提供)

在这个时间点上,业界甚至没有就 ML 平台的范围达成广泛的一致,也就是说,它们在哪里开始和结束。例如,一些 ML 平台产品完全缺乏*预培训(数据准备)*类别的功能。

有几个原因可以解释为什么我们还没有达成一个 ML 平台的主导设计。仅举几个最重要的例子:

  • 底层技术尚未成熟。ML 平台中利用的许多技术本身都处于其生命周期的早期。当用于所述模型的 ML 框架对其检查点格式进行向后不兼容的改变时,很难构建提供持续更新的 ML 模型的 ML 平台。想象一下,试图在没有定义后端 API 的情况下为 web 应用程序构建 UI。随着 API 的发展,你可能会不经意地回头修改一些东西,在 ML 领域,API 发展很快。
  • **ML 平台创造者不知道他们不知道的事情。*我花了无数时间与工程团队交谈,他们有构建规范 ML 平台的宏伟计划。在大多数情况下,他们的心智模型只有构建一个 ML 平台所需的大约 20%,因此,极大地低估了他们所从事的工作的难度。一个我过去在谷歌如何提出这一点的小故事可能会有所帮助:如果一个随机的谷歌工程师想要制造一辆无人驾驶汽车,并向他们的主管询问人数,典型的反应是“这太难了,我们已经在这方面投入了大量资源;去 Waymo 工作"。然而,如果一个随机的谷歌工程师想要建立一个 ML 平台,并向他们的主管询问人数,典型的反应是“听起来不错,这里有两个工程师”*。当然,我们最终到达了这样一个点,即构建一个 ML 平台的努力被普遍认为更像是构建一辆无人驾驶汽车(在某种程度上有些夸张,以使我自己的工作听起来更重要),Alphabet 的大多数人开始使用 TFX
  • **ML 平台消费者不知道自己不知道的。*特别是在企业领域,有许多公司购买了所谓的“ML 平台”,却不知道他们应该期待的功能或他们应该提出的问题。对于企业来说,评估这些产品几乎是不可能的,因为它们听起来都一样,但提供的功能却大相径庭。一位客户曾经这样对我说“在 ML 平台领域存在等价性问题”*,这意味着他们推销的每一种产品听起来都是等价的,当他们意识到差异时已经太晚了。下面是我今年早些时候在 MLSys (以前的 SysML)的一次演讲中使用的一张图表来说明这一点。

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

图 3 :半开玩笑地说明了 TFX库伯弗洛MLflow 的感知重叠和实际重叠之间的差异(摘自我 2020 年 3 月在 MLSys 的演讲)(图片由作者提供)

人工智能开发工具有一个外形问题

对于细心的读者来说,前一节应该已经给他们带来了麻烦。如果我们还没有在一个主导的设计上达成一致,我们怎么能在合适的外形上达成一致呢?首先,让我解释一下我所说的外形的含义。通常,这个术语用来指电子元件(例如主板),或者更接近我的用法,指技术如何为用户包装的不同体现。例如,iPhone 定义了智能手机的主要外形。我挪用这个术语来概括你在谈论“产品表面”、“用户体验”或“开发者体验”时会考虑的一切。当我们说开发人员在使用一个 ML 平台时,他们实际上在与什么进行交互?

现在,大多数人工智能开发工具的形式因素就像不同 API 表面和服务的狂野西部。让我举个例子来说明这一点。为了涵盖训练和部署 ML 模型所需的最小技术集,您可以:

  1. 用 Spark 这样的数据工程产品来扯皮数据。
  2. 使用像 TensorFlow 这样的库来训练你的 ML 模型。
  3. 使用 Docker 打包这些模型。
  4. 使用 Kubernetes 来编排这些 Docker 容器。

你可以提出这样的论点,应该将关注点分开;数据工程师应该编写数据管道,数据科学家应该训练模型,软件工程师应该编写部署系统;ML 平台不可能提供所有这些功能。但是,我在企业中一次又一次地看到,这种人为的关注点分离(这是在 ML 平台出现之前很久就划定的技术界限的结果)导致了 ML 项目的显著减速、代价高昂的错误和总体较高的失败率。

我们不能假设几十年前为软件工程创造的工具和过程可以神奇地转移到 ML。例如,您不应该仅仅将您的 ML 模型工件(其大小可能相当大,并且包含敏感数据)签入旨在用于代码的版本控制系统。这就是为什么在 Databricks,我们建立了 MLflow 模型注册中心来管理 ML 模型的版本和部署生命周期。如果您想让您的数据科学家或软件工程师能够管理整个 ML 生命周期,这些工具需要面向广泛的用户,而不仅仅是 DevOps 专家。在谷歌这样的公司,一个人拥有从数据管道到模型部署的整个生命周期并不罕见。其他人也意识到了这一点,并为此创造了一个广泛的“ML 工程师”角色。

“我们不能假设几十年前为软件工程创造的工具和过程可以神奇地转移到 ML 上。”

尝试更一致的外形

一些供应商意识到需要您掌握 Spark、TensorFlow、Docker 和 Kubernetes 的解决方案的目标受众是有限的,他们试图创建不同的形式因素来消除这种复杂性。然而,他们大多以痛苦的方式失败。让我举两个说明性的例子:

  • SQL ML :有一些产品声称它们*“让机器学习像编写 SQL 查询一样简单”*,在这篇文章中这些产品将保持匿名。然而,为了做到这一点,他们让你注册一个 Python 代码片段作为一个过程,或者他们简单地在 SQL 中镜像相同的 Python APIs(例如,在你的 SQL 查询中定义神经网络的层)。不用说,仅仅允许某人注册 Python 代码并从 SQL 调用它并不能真正实现任何新的东西。事实上,这只会让一切变得更加困难(比如调试 Python 代码)。如果您正在使用硬件加速器(例如 GPU),您可以理解我所说的违反抽象层次的基本原则是什么意思:现在您的 SQL 查询将抛出特定于您运行它的硬件的错误。或者,更糟糕的是,它会无声无息地失败,而您不得不去寻找日志文件。
  • 所见即所得/UI ML :另一类产品试图为所谓的公民数据科学家提供无代码解决方案。漂亮的基于 UI 的工作流程旨在引导用户完成典型的数据科学& ML 模型构建步骤。我观察到这类产品有两种常见的失败模式:(1)在工作流程中的一个或多个步骤,通常是建模步骤,它们要求用户指定低级参数,如 L1 正则化。要求了解什么是 L1 正则化,或者如何为它选择一个好的值,就错过了构建基于 UI 的 ML 产品的要点。(2)在大多数情况下,这些工具只解决最高层次的抽象,并不为用户达到极限时提供“逃生出口”。结果,许多企业发现基于 UI 的 ML 工具无法解决现实生活中的用例。这两个原因导致了典型的产品/市场不匹配,这一类别中的大多数工具除了玩具演示和概念验证之外并没有获得太多的吸引力。

这里的潜在问题当然是边界不明确(因为缺少主导设计)和不尊重抽象层次的新形式因素的创建。这在很大程度上与 ML 工具发展的速度有关,通常由研究发现和开源贡献驱动,损害了严格的工程原则(这会减慢进展)。灵活性和稳定性之间的平衡是技术生命周期中各个阶段的函数,这意味着随着这些工具的成熟,它们可能会有重大的变化。仅举一个我承担部分责任的例子:在 TensorFlow 中曾经有一个tpuestimulator。Estimator API 是相当高的级别,TPUEstimator 甚至没有试图隐藏它正在对它运行的硬件(TPUs)做出假设的事实;明显违反了抽象层次。在较新版本的 API 中,硬件分配发生在较低的 API 级别(作为一种分发策略)。

当你选择一个人工智能堆栈时,要小心宜家效应

最后,由于既没有占主导地位的设计,也没有合适的形式因素,难怪许多企业都在努力采用 ML 平台,更不用说将他们的公司转变为“人工智能优先”的商业模式了。那些尝试过的人经常遭受宜家效应。

人工智能开发工具正慢慢开始得到广泛使用。工程师喜欢建造东西,他们喜欢获得新技能。因此,许多工程师在网上学习水平太低的 ML 课程。我通常告诉任何想听的人,如今没有数据科学家或 ML 工程师需要知道像 backprop 这样的事情实际上是如何工作的。然而,许多人参加网上课程,教授的正是这个。(公平地说,我也从零开始学习了如何编写大多数流行的 ML 算法。但是,话又说回来,我是 AI 开发者工具的 PM)。所有这些工程师,受到他们新获得的关于 ML 的本质细节的知识的鼓舞,然后走出去,试图将它们应用于他们的企业业务问题。这就是宜家效应的来源。

宜家效应指的是人们赋予自己帮助创造的产品更多价值的现象。事实证明,这种效应广泛适用于各种产品(家具、蛋糕粉、玩具等)。).我的推测是,同样的效果在拥有强大工程文化的公司中占主导地位。一个从头开始构建自己的 ML 平台的工程团队,尽管可能有缺陷,也会比从供应商那里购买现成的东西更有价值。他们给它起了一个花哨的名字,写了关于它的博客,每个人都得到了提升。

当然,这同样适用于任何一种新技术。然而,现在没有人会说*“让我们从头开始建立我们自己的数据库”*。ML 平台的特殊挑战是,因为我们缺乏一个主导的设计和通用的形式因素,人们不知道他们不知道的东西,所以认为你可以只用几个工程师就能做出有意义的东西是太容易了。随着故事的发展,一个软件工程师去找他们的主管要人手来建立一个 ML 平台…

“一个从头开始构建自己的 ML 平台的工程团队,尽管它可能有缺陷,但会比他们从供应商那里购买现成的东西更有价值。”

10 年后 AI 开发者工具会是什么样子?

最后你可能会问自己,10 年后人工智能开发工具会是什么样子?如果你有足够长的时间,你可能会说类似这样的话:“好的,我明白了,克莱门斯,这些都是任何新技术的常见问题。你可以在 20 年前写同样的关于分布式数据处理引擎的博文。我会说“谢谢,这正是我的观点”。如果你认为,10 年后,数百万人将使用低级 Python APIs 来指定他们确切的模型架构(“我想知道 skiplayer 或卷积是否会有所帮助?”)并且摆弄上百个参数,我敢打赌你是错的。事实上,在理想世界中,构建“数据驱动的应用程序”(这实际上是 ML 模型所属的更广泛的类别)的整个过程只是任何软件工程师工作的一个普通部分,而不必获得 AI 博士学位或 Kubernetes 硕士学位。

冒着说出显而易见的事实的风险,以下是我对未来几年将会发生什么来应对上述挑战的预期:

  • **我们将致力于 ML 平台的主流设计。**当我们谈论 ML 平台时,我们认为“盒子里面”是什么?今天,许多供应商只关注 ML 培训部分,忘记了 ML 中的大部分时间都花在数据争论上。最有可能的是,一个产品将获得牵引力,并引领定义类别的方式。许多其他供应商将退出市场,其他供应商将遵循主流设计。
  • **对于不同的目标受众,将会有一些有意义的外形规格。**我们不需要单一的外形。事实上,我认为拥有不同的抽象层是可取的。每一层都需要很好地定义,抽象不应该在层之间泄漏。我认为我们还没有看到最高抽象级别的好例子(例如,SQL 或基于 UI 的 ML)。
  • **企业客户会意识到,构建自己的 ML 平台并不是他们的比较优势。**当然,每个公司都可以雇佣一个工程团队,尝试搭建自己的 ML 平台。然而,随着主导设计的到位,这种努力是多么徒劳,这不是(也不应该是)大多数公司的核心竞争力,这一点将变得更加明显。对于大多数企业来说,价值来自于将 ML 平台应用于他们的业务问题,而不是来自于构建自己的 ML 平台并维护它们。

正如你可能猜到的,我对 ML 平台的主导设计和良好的外形有自己的看法。如果你对解决这些挑战感兴趣,并定义 ML 平台的未来,我碰巧正在招聘一名 ML 平台产品经理。

Clemens Mewald 领导 Databricks 的数据科学和机器学习产品团队。此前,他在谷歌大脑团队工作了四年,为 Alphabet 构建人工智能基础设施,包括 TensorFlow 和 TensorFlow Extended (TFX)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值