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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

9 本数据科学相关书籍向圣诞老人索要圣诞礼物

原文:https://towardsdatascience.com/9-data-science-related-books-to-ask-santa-for-christmas-37a1036478e9?source=collection_archive---------9-----------------------

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

Background source: fevzizirhlioglu at Pixabay — free stock images

我最喜欢的几本书的汇编。

本周,我打算上传一个关于对分类变量进行适当编码的重要性的故事,但鉴于我们非常非常非常接近圣诞节,我认为删除一些关于我在这一年中发现的书籍的内容是一个好主意,我自己也会喜欢收到这些书籍作为礼物。

这些建议将分为以下几类:

  • 非技术书籍
  • 技术书籍
  • 数据可视化书籍

你会发现每种都有 3 个,希望我会给你一些惊喜。

非技术书籍

裸统计 —评分:5 分中的 4 分

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

尽管有些章节可能过于基础,但 Charles Wheelan 带领我们浏览了许多我们在日常生活中经常使用和提到的东西,展示了所有这些概念的经典错误和良好实践。如果你正在学习,但还没有在这个领域工作,获取一些技术概念的真实例子也很有趣。

关于它的更多信息:

曾经被认为乏味的统计学领域正在迅速演变成一门学科,谷歌首席经济学家哈尔·瓦里安称之为“性感”。从击球率和政治民意调查到游戏节目和医学研究,统计学在现实世界中的应用继续突飞猛进。怎样才能抓住在标准化考试中作弊的学校?网飞怎么知道你会喜欢哪部电影?是什么导致了自闭症发病率的上升?正如畅销书作家查尔斯·惠兰在《赤裸裸的统计》中向我们展示的那样,正确的数据和一些精心挑选的统计工具可以帮助我们回答这些问题以及更多问题。

来源:http://goodreads.com/

赖以生存的算法 —评分:4.5 分(满分 5 分)

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

开始时有点慢,有时甚至有点重复,但之后有一些真正令人惊叹的章节,这是一本你可能必须读几遍才能完全理解的书。对我来说,它给了我日常生活和工作的工具,也给了我完成这本书后进一步阅读的问题和灵感。

关于它的更多信息:

我们所有的生活都受到有限的空间和时间的限制,这些限制会产生一系列特殊的问题。在一天或一生中,我们应该做什么,或不做什么?我们应该接受多大程度的混乱?什么样的新活动和熟悉的最爱的平衡是最有成就感的?这些似乎是人类独有的困境,但事实并非如此:计算机也面临同样的限制,因此计算机科学家几十年来一直在努力解决他们版本的此类问题。他们找到的解决方案有很多值得我们学习的地方。

来源:http://goodreads.com

隐形女性:为男性设计的世界中的数据偏差 —评分:5 分

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

正如我的一个朋友对我说的那样:不要因为它是“关于女人”的就放弃,因为那意味着它也是关于男人的!我还没有完成这本书,但迄今为止,它已经显示出惊人的。Caroline Criado-Pérez 所做的研究确实令人印象深刻,它揭示了一个我们都应该处理的问题的真实事实。

关于它的更多信息:

想象一下这样一个世界,你的手机对你的手来说太大了,你的医生开了一种不适合你身体的药,在车祸中你受重伤的可能性增加了 47%,你每周无数小时的工作没有得到认可或重视。如果这些听起来很熟悉,很可能你是个女人。

《看不见的女人》向我们展示了,在一个主要由男人建造并为男人服务的世界里,我们是如何系统地忽略了一半的人口。它暴露了性别数据差距——这是我们知识中的一个差距,是对妇女的长期、系统歧视的根源,并造成了普遍但无形的偏见,对妇女的生活产生了深远的影响。

来源:http://goodreads.com

额外收获:如果你不想读完整本书,或者你只是想先睹为快,我的另一个朋友向我推荐了《99%隐形播客中的一集,他们在那里采访了作者。

技术书籍

使用 Python 进行深度学习 —评分:4 分(满分 5 分)

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

爱 Python?想了解更多关于深度学习的知识?Francois Chollet 是最广泛使用的库之一 Keras 的作者。这本书从背后的直觉,到概念的实际应用,展示例子,让读者享受。

关于它的更多信息:

深度学习适用于越来越多的人工智能问题,如图像分类、语音识别、文本分类、问答、文本到语音和光学字符识别。这是脸书和谷歌的照片标签系统、无人驾驶汽车、智能手机上的语音识别系统等等背后的技术。特别是,深度学习擅长解决机器感知问题:理解图像数据、视频数据或声音数据的内容。这里有一个简单的例子:假设您有一个很大的图像集合,并且您想要与每个图像相关联的标签,例如,“狗”、“猫”等。深度学习可以让你创建一个理解如何将这种标签映射到图像的系统,只从例子中学习。该系统可以应用于新的图像,自动完成照片标记的任务。深度学习模型只需要输入任务的示例,就可以开始在新数据上生成有用的结果。

来源:http://goodreads.com

百页机器学习书 —评分 5 分

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

我开始在网上零零碎碎地阅读这本书,每次我需要更好地理解一个概念,但发现它非常好,清晰和有帮助,最近决定买印刷版本放在家里。它贯穿了机器学习中所有最重要的概念和算法。从技术和非技术的角度解释它们是如何工作的。

关于它的更多信息:

监督和非监督学习、支持向量机、神经网络、集成方法、梯度下降、聚类分析和降维、自动编码器和转移学习、特征工程和超参数调整!数学,直觉,插图,都在短短一百页里!

来源:http://themlbook.com/

额外收获:这本书有自己的网页,你可以找到不同的格式选项,以及不同人的评论和意见。

概率:对于热情的初学者 —评分:4 分(满分 5 分)

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

对自己的概率知识和技能感到有些生疏?那么这本书是给你的。它以一种非常友好的方式通过所有最重要的主题,充满了例子和解决的问题。重温概念,如组合学,概率规则,贝叶斯定理,期望值,方差,概率密度,共同分布,大数定律,中心极限定理,相关性和回归。关于这本书,你实际上没什么需要知道的。一本在家里就放在身边的方便的书。

数据可视化书籍

我发现数据可视化是数据科学如此重要的一部分,以至于不久前我发表了一篇文章,名为:'改善你绘图的 10 个技巧。因为在现实生活的数据科学中,绘图确实很重要。在那篇文章中,我写了一点为什么我认为数据可视化如此重要,但是如果你有兴趣阅读更多关于它的内容并提高你的理解和技能,那么接下来的书肯定会帮助你实现这一点。

好图表 —评分:4.5 分(满分 5 分)

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

作为一本百页的机器学习书,我首先在网上找到了这本书,读了一些章节,并决定买下来放在家里。对任何图书馆来说都是一个很好的补充,不仅因为这是一本设计精美的书,还因为这是一本读起来非常愉快的书。

关于它的更多信息:

一个好的视觉化可以比任何其他形式的交流更有力地交流信息和想法的本质和潜在影响。(……)制作好的图表正迅速成为经理们必备的技能。如果你不这样做,其他经理也会这样做,他们会因此受到关注,并因对公司的成功做出贡献而受到表扬。在好的图表中,dataviz maven Scott Berinato 为可视化如何工作以及如何使用这种新语言来打动和说服提供了重要的指导。今天的 Dataviz 相当于 20 世纪 80 年代早期的电子表格和文字处理器,正处于改变我们工作方式的尖端。Berinato 展示了一个系统,用于通过对话、草图和原型制作过程进行视觉思考和构建更好的图表。

来源:http://goodreads.com

量化信息的直观显示 —评分:4 分,共 5 分

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

不像好的图表那样吸引眼球,但内容极其丰富。这本书于 1983 年首次出版,在一段时间内,它一直是数据可视化的圣经。虽然现在这本书里的一些东西确实过时了,但是它第一次出版了你今天可能正在使用的概念和工具。

关于它的更多信息:

T 他关于统计图形、图表、表格的经典著作。数据图形设计的理论和实践,250 幅最好的(和一些最差的)统计图形的插图,详细分析了如何显示精确、有效、快速分析的数据。高分辨率显示器的设计,小倍数。编辑和改进图形。数据-油墨比率。时间序列,关系图,数据图,多元设计。图形欺骗的检测:设计变化与数据变化。欺骗的来源。美学和数据图形显示。

来源:http://goodreads.com

信息很美 —评分:4.5 分(满分 5 分)

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

这是我的一个朋友给我的推荐,所以尽管我不能给你我对这本书的看法,我还是把它的完整描述留在下面:

每一天,每一小时,每一分钟,我们都被来自电视,报纸,互联网的信息轰炸,我们沉浸在其中。我们需要一种与之相关的方式。David McCandless 和他令人惊叹的信息图表,以简单、优雅的方式与过于复杂或抽象的信息进行交互,除了视觉以外,无法掌握任何方式。McCandless 创造了视觉上令人惊叹的展示,将事实与它们的联系、上下文和关系融合在一起,使信息变得有意义、有趣和美丽。他的天才不仅在于寻找展示结果的新方法,还在于寻找新方法来令人兴奋地组合数据集。

《知识是美丽的》是可视化数据世界的迷人旋转,所有这些都带有大卫·麦坎德莱斯突破边界的标志性风格。畅销书《视觉杂集》( Visual Miscellaneum)《知识是美丽的》( Knowledge is Beautiful)引人入胜的后续作品,对世界及其历史进行了更深入、更广泛的审视,页面之间有了更多的联系,对原因和后果进行了更深入的探索,以及更具包容性的全球视角。《知识是美丽的》( Knowledge is Beautiful)的一部分内容来自 McCandless 的国际追随者,它从历史和政治、科学事实、文学流等方面对关键问题进行了革命性和民主的审视。

来源:http://goodreads.com

嗯,我想这就够了,至少对圣诞节来说。如果你确实购买并阅读了其中的任何一本书,或者如果你过去已经这样做了,请给我留下你自己的评论。我很想听听你的想法!

如果你喜欢这个故事,可以看看我的其他一些例子,比如我在训练测试中犯的 6 个业余错误或者5 分钟内抓取网页。所有这些都可以在我的档案中找到。

还有如果你想直接在你的邮箱里收到我的最新文章,只需 订阅我的简讯 😃

中号见!

2021 年你不能错过的 9 个数据可视化工具

原文:https://towardsdatascience.com/9-data-visualization-tools-that-you-cannot-miss-in-2019-3ff23222a927?source=collection_archive---------0-----------------------

在数据科学领域,数据可视化无疑是当今的热门词汇。无论你想分析什么数据,做数据可视化似乎都是必经的一步。但是很多人对数据可视化没有一个具体的概念,也不知道如何实现。因此,今天我将带您了解数据可视化的定义、概念、实施流程和工具。

1。 什么是数据可视化?

**科学可视化、信息可视化和可视化分析通常被视为可视化的三个主要分支。**由这三个分支结合而成的新学科“数据可视化”是可视化研究领域的新起点。

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

广义数据可视化涉及各种学科,如信息技术、自然科学、统计分析、图形、交互和地理信息。

1.1 科学可视化

科学可视化是科学中一个跨学科的研究和应用领域,主要研究三维现象的可视化,如建筑、气象、医学或生物系统。它的目的是用图形说明科学数据,使科学家能够理解、解释和收集数据中的模式。

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

1.2 信息可视化

信息可视化是对抽象数据的交互式视觉表示的研究,以增强人类的认知。抽象数据包括数字和非数字数据,如地理信息和文本。直方图、趋势图、流程图、树形图等图形都属于信息可视化,这些图形的设计将抽象的概念转化为可视化的信息。

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

1.3 视觉分析

视觉分析是随着科学可视化和信息可视化的发展而发展起来的一个新领域,其重点是通过交互式视觉界面进行分析推理。

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

From FineReport

2。 我们为什么需要数据可视化?

人类通过视觉获得的信息量远远超过其他器官。数据可视化是利用人类的自然技能来提高数据处理和组织效率。

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

可视化可以帮助我们处理更复杂的信息,增强记忆力。

大多数人对统计数据了解不多,基本的统计方法(均值、中位数、极差等。)都不符合人类的认知本性。最著名的例子之一就是安斯科姆的四重奏。按照统计学方法很难看到规律,但是数据可视化的时候规律就很清晰了。

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

3。 如何实现数据可视化?

从技术上讲,对数据可视化最简单的理解就是从数据空间到图形空间的映射。

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

一个经典的可视化实现过程是处理和过滤数据,将其转换为可表达的可视化形式,然后将其呈现在用户可见的视图中。

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

可视化技术栈

一般来说,专业的数据可视化工程师需要掌握以下技术栈:

基础数学:三角函数、线性代数、几何算法

图形学 : Canvas,SVG,WebGL,计算图形学,图论

工程算法:基础算法、统计算法、常用布局算法

数据分析:数据清理、统计、数据建模

设计美学:设计原则、审美、色彩、交互、认知

视觉基础:视觉编码、视觉分析、图形交互

可视化解决方案:图表的正确使用,常见业务场景的可视化

4。 常用数据可视化工具

一般来说,学术界用的是 R 语言,ggplot2,Python。普通用户最熟悉的工具就是 Excel。商业产品有 Tableau、FineReport、Power BI 等。

1)D3

D3.js 是一个基于数据操作文档的 JavaScript 库。D3 结合了强大的可视化组件和数据驱动的 DOM 操作方法。

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

评测 : D3 具有强大的 SVG 运算能力。它可以很容易地将数据映射到 SVG 属性,并且它集成了大量的数据处理、布局算法和计算图形的工具和方法。它有一个强大的社区和丰富的演示。但是,它的 API 太低级了。没有太多的可重用性,而学习和使用的成本很高。

2) 精细报告

FineReport 是一个用纯 Java 编写的企业级 web 报表工具,结合了数据可视化和数据录入。它是基于“无代码开发”的概念设计的。通过 FineReport,用户可以制作复杂的报表和酷炫的仪表盘,并通过简单的拖放操作构建决策平台。

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

评测 : FineReport 可以直接连接各类数据库,定制各种复杂报表,酷炫仪表盘,方便快捷。界面类似于 Excel 的界面。它提供了 19 个类别,超过 50 种风格的自研 HTML5 图表,具有酷炫的 3D 和动态效果。最重要的是它的个人版完全免费

3) 高图表

HighCharts 是一个用纯 JavaScript 编写的图表库,让用户可以轻松方便地向 web 应用程序添加交互式图表。这是网络上使用最广泛的图表工具,商业使用需要购买商业许可证。

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

评测:使用门槛很低。HighCharts 具有良好的兼容性,并且已经成熟,应用广泛。但是样式陈旧,很难展开图表。商业使用需要购买版权。

4)Echarts

Echarts 是百度数据可视化团队推出的企业级图表工具。它是一个纯 Javascript 图表库,可以在 PC 和移动设备上流畅运行,并且兼容当前大多数浏览器。

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

评测 : Echarts 拥有丰富的图表类型,涵盖了常规的统计图。但不如 Vega 等基于图形语法的图表库灵活,用户很难自定义一些复杂的关系图表。

5) 小叶

传单是一个用于移动设备的交互式地图的 JavaScript 库。它拥有大多数开发者需要的所有映射特性。

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

评测:可以专门针对地图应用,与移动的兼容性好。API 支持插件机制,但功能相对简单。用户需要具备二次开发能力。

6)织女星

Vega 是一组交互式图形语法,它定义了从数据到图形的映射规则、公共交互语法和公共图形元素。用户可以自由组合 Vega 语法来构建各种图表。

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

评测:Vega 完全基于 JSON 语法,提供了从数据到图形的映射规则,支持通用交互语法。但是语法设计复杂,使用和学习成本高。

7)deck . GL

deck.gl 是基于 WebGL 的可视化类库,用于大数据分析。它是由优步的可视化团队开发的。

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

评测 : deck.gl 侧重于 3D 地图可视化。内置地理信息可视化常见场景有很多。它支持大规模数据的可视化。但是用户需要有 WebGL 的知识,而且层扩展比较复杂。

8) 力量匕

Power BI 是一套业务分析工具,可以提供组织内部的洞察力。它可以连接数百个数据源,简化数据准备并提供即时分析。组织可以在 web 和移动设备上查看 Power BI 生成的报告。

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

评测 : Power BI 类似于 Excel 的桌面 BI 工具,而功能比 Excel 更强大。它支持多种数据源。价格不高。但它只能作为一个独立的 BI 工具,没有办法和现有系统集成。

9) 画面

Tableau 是一个可视化分析数据的商业智能工具。用户可以创建和分发交互式和可共享的仪表板,以图形和图表的形式描绘数据的趋势、变化和密度。Tableau 可以连接文件、关系数据源和大数据源来获取和处理数据。

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

评测 : Tableau 是桌面系统中最简单的商业智能工具。它不会强迫用户编写自定义代码。该软件允许数据混合和实时协作。但价格昂贵,在定制和售后服务方面表现不佳。

结论

数据可视化是一个涉及许多学科的巨大领域。正是由于这种跨学科的性质,可视化领域充满了活力和机遇。

您可能也会对…感兴趣

8 个最佳报告工具&改善您业务的软件

2021 年最受欢迎的 5 款商业智能工具

4 个参数查询功能,让您的数据可视化互动

制作销售仪表板的分步指南

新手如何设计酷炫的数据可视化?

通往成功数据产品的 9 个设计陷阱

原文:https://towardsdatascience.com/9-design-pitfalls-on-the-way-to-a-successful-data-product-6ea5a3e6842?source=collection_archive---------27-----------------------

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

The user has to do a lot of mental work in order to decode your data product. (Image credit: Evelyn Münster)

数据可视化产品是一个全新的领域,需要扩展的设计策略。

数据产品的用户界面的任务是使用户能够理解复杂性。任何想要构建需要与用户交流数据和复杂模型的数据产品的人都面临着一个特殊的挑战,这个挑战的难度出乎意料地高。

毕竟,数据产品不仅仅是另一种软件产品。85%的大数据和人工智能项目都失败了。原因?以我的经验,他们不是在技术上,而是在设计上。

我在 2010 年的第一个数据产品是一种在线营销的场景。它无情地失败了。从技术上来说,效果非常好。您可以连接任何数据源并配置自己的仪表板。从视觉上看,它看起来也很不错。但是几乎没有人想用它。

那确实使我沮丧。我想找出原因以及如何做得更好。我从事数据产品设计多年后的个人体会:成功的数据产品是可行的,如果你记住几件事。

那么,如何才能将成功的数据产品推向市场呢?答案与一种新的 UX 设计有很大关系。作为 UX 的设计师,我们正在处理几个传统软件产品通常没有的附加层:一个用户可能甚至不理解的非常复杂的系统,数据和数据可视化,可能是人工智能,最后但同样重要的是,一个完全不同类型的用户问题或要做的工作。

在开始设计数据 UX 之前,您应该问自己和您的团队以下 9 个问题。

1.你的产品到底解决了哪个用户问题?

指定类型根据用户需求或业务任务对数据产品进行分类:可操作的见解、绩效反馈循环、根本原因分析、知识创造和信任建立。这种情况下的本地化是有帮助的。上面的一些任务有非线性用户旅程,这需要新的 UX 方法。

您的数据产品的具体任务必须在一会儿就能让用户清楚地看到。

2.这个系统到底是什么样子的?

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

Don’t rely on the assumption that users already know everything to interpret the data correctly. (Image credit: Evelyn Münster)

好吧,数据背后的系统可能非常复杂。无论是化工厂的优化,手术室的程序标准化,还是一个家庭中异构设备的无缝交互:不仅整个项目团队必须有一个共同的理解,而且你的用户也需要一个足够准确和正确的心智模型。

不要依赖用户已经知道一切的假设来正确解释数据。心智模型的测试和训练是必不可少的。

3.数据质量有多好?

可悲但真实的是:数据不是事实。甚至衡量什么或收集什么数据的决定本身也是人的决定。通常,这仅仅取决于技术或法律上的可行性。通常只使用那些已经存在的数据。有时会有测量误差和失败。有时,统计转换和汇总是错误的、误导的或矛盾的。

另一个方面:在最罕见的情况下,真正需要的信息实际上是经过测量的。

假设你想衡量一所大学的教育质量。遗憾的是,这不可能直接实现。相反,你只能间接测量:最终成绩,或不及格率。然而,这些仅仅是可能表明学习质量的代表,但也可能是误导性的。数据相当模糊!

因此,数据质量必须反映在用户界面上。我们不希望用户盲目信任我们的应用程序,也不希望用户从根本上怀疑所有数据。一个好的数据用户界面会让用户产生一种知情的、至关重要的信任。

4.你的用户的图形能力和计算能力有多高?

数据可视化最终是在图形中编码的数据。读者必须首先对图表进行解码才能访问数据。这就是所谓的图形化。点、线、颜色、位置或长度是什么意思?读者是否理解不太熟悉的图表类型,如直方图或散点图?

一旦数据被解密,它必须被解释。有数字的用户有多好?对于这种数据产品,他们需要克服哪些统计挑战?

通过用户测试,确保您的目标群体能够解码并正确解释数据和可视化。

5.我需要什么样的详细程度?

用户需要知道多少细节才能了解情况,从噪音中检测出信号?平均值和总和足够了吗,分布会更好吗?哪些时间间隔适合做时间线?

你还应该记住汇总的数据通常过于抽象,无法与你自己的心智模型联系起来。不幸的是,“尽可能简单”太简单了。这是因为细节能够解释抽象的数据,而能够建立信任。另一方面,太多的细节会很快让人不知所措。

6.你在处理概率吗?

如果您想要交流的数据是基于预测、分类或样本,您应该警惕。询问数据科学家关于置信区间的问题,给她留下深刻印象。

天气应用的开发者似乎认为每个人都知道“60%的降雨概率”是什么意思。不幸的是,事实并非如此,因为概率很微妙,需要解释。

忽略所有不确定性的常见做法使得用户界面看似简单,但却很危险。这已经导致了许多误解和错误的决定。

7.设计团队里有数据可视化专家吗?

数据可视化的 UX 设计需要一套特殊的技能:数据 UX 设计人员的技能。从数据分析、数据设计工作流程、可视化工具和库到图表类型、调色板和数据故事——不一定是你作为 UX 设计师学到的东西。团队中有一个专家或者至少是一个触手可及的导师是件好事。

8.如何获得用户反馈?

一旦有了第一个原型,就应该通过用户测试来收集有价值的反馈。为此需要一个虚拟点击。但是,lorem ipsum 文本和虚拟数据并不特别适合数据产品。这是因为数据产品在功能和解决用户问题的方式方面通常是未知领域,即使对用户来说也是如此。

用户必须能够想象完成的应用程序将如何解决她的个人问题。只有这样,她才能评估价值主张并给出有用的反馈。

不连贯的随机数对于这个来说太抽象了。因此,所有的内容,尤其是数字和数据,都应该尽可能的真实和连贯。此外,通过点击虚拟物的交互路径应该讲述一个故事,例如一个问题是如何变得可见然后被解决的。因此,用户界面的许多元素将以优雅的方式不言自明。

9.用户界面能促进营销和销售吗?

如果用户界面清楚地传达了它是做什么的,过程是什么样的,它就有资格成为一份利润丰厚的兼职工作:它可以销售产品。有时候几乎无法用几句话来表达产品能做什么。尤其是如果还没有类似的已知产品。如果你是卖鞋的,在店门口放个牌子写着“鞋”就够了。大家都知道鞋子是什么,是做什么用的,怎么用。(这种情况下的重点是在竞争中脱颖而出。)

但是如果你想销售一个化工厂的预测维护系统,甚至客户的专家也不知道你的系统能做什么以及如何使用。但这正是一个做得好的用户界面能在一会儿时间内解释的。

我个人的结论

我们必须承认,数据产品是一个全新的领域。它们不仅仅是另一个软件产品,或者另一个商业智能仪表板。它也不仅仅是关于数据可视化。为了构建一个成功的数据产品,我们需要一个特殊的策略,一个先进的 UX 方法:数据 UX 设计。

想得到更多这样的数据设计内容?看看我的图表博士数据设计学院或者关注我的 LinkedIN

短短一个月,我从 Medium 博客中学到的 9 件事

原文:https://towardsdatascience.com/9-things-i-learned-from-blogging-on-medium-for-the-first-month-2bace214b814?source=collection_archive---------8-----------------------

为什么媒体是交流思想的好平台

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

Photo by Glenn Carstens-Peters on Unsplash

2019 年 9 月 5 日,我正式在 Medium 上写了我的第一个故事,今天差不多是我在 Medium 上的第一个月的尾声。在这一个月里,我发表了 10 个故事,获得了 24K 的浏览量,我的文章被阅读 11K 次,获得了 167 粉丝, 100 关注者。因为我把我所有的故事都放到了媒体合作伙伴计划中,我的故事的会员合约给了我134美元的报酬。我也成为了人工智能教育顶级编剧。这不多,但对我来说,这是非常令人鼓舞的。

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

It ain’t much …

现在数据已经出来了,我想说总体来说我第一个月感觉很积极。当然,这不是我第一次写博客,但这是我的故事第一次有如此大的影响力,为此,我感谢 Medium 和它的团队给我这个机会。我想和你们分享我一路走来学到的一些东西。我希望这能帮助那些也想开始在媒体上写作的人更快更顺利地开始。

质量!质量!质量!

在我开始在 Medium 上写作之前,我已经阅读 Medium 有一段时间了。我一直很欣赏它提供的高质量内容。内容相关性、组织、布局、编辑标准、漂亮的图像和应用程序用户界面,所有这些都意味着质量,让在媒体上消费内容成为一种享受。现在,我在内容创作方面,这里的高标准也鼓励我尽可能地保持好的质量给我的读者。这包括但不限于:

校对我的文章(我使用语法和人工校对)

仔细挑选那些漂亮的、相关的、没有许可证的照片(不透明的图片是一个很好的来源,内置在 Medium 的编辑界面中)

考虑一个好的标题/副标题,既吸引人又不俗套

尽我所能创建我自己的 GIF 动画,为我的页面注入更多的“能量”。

交叉引用资源并在相关的地方嵌入视频,以提供更丰富的背景知识。(当然也包括我自己的文章😉)

充分利用 Medium 丰富的编辑和布局工具,像 emoji、’ @ '、blockquote 等。让故事看起来不那么无聊,更有活力。

思考好的标签是多样化的,也是与增加接触相关的。

这个列表还可以更长,没有一个故事可以涵盖其中的每一项,但是在写作的时候记住这一点是非常有益的。我觉得这和我记下的课文一样重要。我总是努力让故事的质量尽我所能。这最终是尊重我自己的时间和我的读者的时间,我相信这就是媒体作为一个独特的媒体所促进和奖励的。

还有一点要注意的是,不要做得太过。经过一些润色之后,有时你永远不会觉得你的文章可以发表了。不要被分析麻痹了,点击发布按钮,把你的内容推给你的读者。你总是可以在以后改进它们。写作是一个旅程,而不是目的地。

善用媒体编辑

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

我猜你总是可以用你最喜欢的软件/应用程序来写,然后把它们导入到 Medium 中,但是我发现只在 Medium 的网站编辑器 UI 上写就足够令人愉快和高效了。有了几年的 UI/UX 经验,我可以说媒体编辑器设计得很好,因为它不碍事。这就是我们所说的’隐形设计。它只在你需要帮助的时候出现,当你专注于手头的任务时,它就会消失在背景中。该界面被设计为整洁,但在需要时功能强大。我发现熟悉编辑器所提供的东西真的让我的写作经历变得流畅和愉快。花些时间通读媒体的指南大有帮助。

数字不会说谎

作为一个和数字打交道多年的人,统计总是我最感兴趣的。我自己做了大量的数据可视化和仪表板设计工作,我发现 Medium 的统计页面非常干净,易于阅读。布局设计很漂亮,层次分明,最重要的数字在前面和中间,其他的都在背景中。唯一的抱怨就是在背景中隐藏更多的细节。这样,更懂数据的人可以挖掘得更深,普通的作者可以享受极简主义。也许那是另一个时代的另一篇文章。

我发现自己访问统计页面有点太多了,喜欢看数字一点点上升(请不要评判我)。你不必做同样的事情,但我鼓励你不时地访问统计页面,它让你知道每篇文章做得有多好,当你尝试不同的写作风格、新主题或社交媒体策略时,它提供了一个坚实的基准,所以你可以相应地调整。例如,当我试图大力推广我在脸书的文章时,我确实发现我从脸书来的访问量增加了很多,但仍然没有媒体策划的多。很有见地!这种对什么可行什么不可行的洞察显然是非常有价值的。

此外,对于 Chrome 用户,我建议安装一个名为“ Medium Enhanced Stats 的扩展,在统计页面上提供更好的 UI 和更多信息。

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

付费墙,还是不付费墙,这是个问题

这个争议比较大。很多人不喜欢付费墙。只要是付费墙,它就是坏的。不过,我对付费墙没什么感觉。只要你提供有价值的内容,作为一名作家获得报酬是非常合理的。这不亚于或更体面的任何其他业务。付费墙可能会降低你的影响力,但也会让你更加关注那些真正重视质量的人。至于 reach,我做了一些实验,发现 Medium 的 3 个免费付费故事实际上在大多数时候已经足够了。我在 Medium 上放了一篇免费文章和一篇付费文章,并在脸书推广。我看不出脸书的观点比两者有多大的不同。此外,Medium only 只负责策划付费墙后面的故事,而策划对扩大你的影响是巨大的。所以我最后把我所有的故事都放在付费墙后面,结果一点也不差。从我的文章中得到的报酬似乎不多,但它至少支付了我的媒体会员资格,这样我就可以自由地阅读所有伟大的内容。

你可以自己测试一下,如果你喜欢你的内容达到最大范围,那就尽一切办法把它设为免费内容。

顶级作家?顶级作家!

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

在我写了三四篇文章之后,其中的一篇得到了一些关注。当然不是病毒式的,但我的观点开始快速增长。它在一天内达到 2k,两天后,我收到一封来自 Medium 的电子邮件,说我现在是“人工智能”主题的顶级作家之一。我是多么的荣幸和卑微!我刚开始在媒体上写文章一个多星期,不到五篇文章,我已经成为我最关心的主题的顶级作家了!

一旦我从兴奋中稍微平静下来,我开始思考发生了什么以及为什么。当然,这是相当幸运的,我的一个故事得到了一些关注,或者被一些社交媒体推广。但这也表明了 Medium 独特的系统重视高质量、好内容,而不是你的业绩记录或品牌名称。因此,对于我和其他像我一样环保的人来说,流汗创作出伟大的内容实际上是一种优势:你将因为你的高质量工作而得到认可和奖励。虽然这个头衔不是永久的,但我认为如果我停止制作热门内容,它就会消失,但这很好。这是一种很好的压力,促使我写出更好的故事。

出版物事项

嗯,这是我第一次和出版物打交道。在我的第一个高质量的故事之后,数据科学的一个出版物找到我,问我是否想通过他们发表。在网上做了一些研究后,我发现出版对像我这样的新作家来说是有好处的,它可以增加我的影响力,还可以为我的写作提供一些建议等等。所以我欣然同意和他们一起发表我的一些故事。写了一些故事后,我觉得这本书确实帮助我引起了注意。我对其他更大的数据科学出版商做了一些研究,并开始向他们提交我的作品。

与不同的出版商出版实际上是可以的,我所做的是为了更严肃和重量级的文章,我会选择大出版商。对于更有趣和轻松的作品,我会提交给其他出版商,看看他们的反应如何。我仍处于“试错”过程中。我仍在探索与不同出版商的合作,一旦深入,我会分享更多的经验。

回应,而不是评论

我发现 Medium 的一个独特之处是响应系统。在 Medium 中,回复被视为**‘第一世界公民’**,这意味着它被视为一个故事。它将有自己的统计数据,人们可以在上面拍手,等等。正因为如此,我注意到人们真的在他们留下的回复上投入了更多的努力,导致了非常高质量的回复,这些回复经常启发我,或者指出我错过或错误的事情。我就是喜欢这个响应系统。它真的促进了高质量的交流和思想与观点的碰撞!

会员?算我一个!

媒体的会员费是固定的 $5 。它向你开放了整个媒体的内容,你可以自由地阅读它所提供的任何东西。对我来说,这完全值得。它不仅提高了我在写下我文章的第一个词之前做研究的能力(我说过 Medium 有高质量和相关内容吗?),这也使我能够与其他成员互动,并更深入地融入社区。

如何在媒介上赚钱

嗯,我可能没有资格谈论这个,毕竟我一个月前才加入 Medium。然而,我仍然想分享我对此的一些想法。因为你已经喜欢做的事情而得到回报的感觉真的很棒。我认为,支付系统是建立在“会员参与”的基础上的。越多的会员参与到你的内容中,他们的月会员费就越多。我认为这很公平,对吗?所以这意味着你会因为你感动人的深度和广度而得到回报。否则,人们不会与你接触,他们不会费心鼓掌、回应、强调等。这进一步鼓励作者写出真实的内容,只有当你真正表达你所写的内容时,人们才能感受到你。

结论

总的来说,我认为 Medium 以会员为基础、以质量为中心的在线出版模式确实发挥了一些作用。它充满了聪明勤奋的作者和好奇认真的读者。

它是一种媒介,通过高质量的内容、漂亮的界面和精心设计的系统将我们联系在一起。

欢迎任何反馈或建设性的批评。你可以在推特 @lymenlee 或者我的博客网站【wayofnumbers.com上找到我。

在 Pytorch 中训练快如闪电的神经网络的 9 个技巧

原文:https://towardsdatascience.com/9-tips-for-training-lightning-fast-neural-networks-in-pytorch-8e63a502f565?source=collection_archive---------4-----------------------

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

Don’t let this be your Neural Network (Image credit: Monsters U)

面对现实吧,你的模型很可能还停留在石器时代。我敢打赌,你仍然在使用 32 位精度或* GASP* 甚至可能只在单个 GPU 上训练**。**

😱.

我明白了,虽然有 99 个加速指南,但清单不是 1?(是的,那刚刚发生了)。好吧,把这看作是终极**,一步一步的指导,确保你挤压所有的(GP-Use)😂你的模型之外。**

这份指南从最简单到最大的 PITA 修改,你可以做出最大限度地利用你的网络。我将展示 Pytorch 代码的例子和相关的标志,你可以在 Pytorch-Lightning Trainer 中使用,以防你不想自己编写这些代码!

这本指南是给谁的?任何在 Pytorch 中从事非平凡深度学习模型工作的人,如工业研究人员、博士生、学者等。我们在这里讨论的模型可能需要你花多天时间来训练,甚至几周或几个月。

我们将涵盖(从最简单到最皮塔饼)

  1. 使用数据加载器。
  2. 数据加载器中的工作线程数。
  3. 批量大小。
  4. 累积的梯度。
  5. 保留图形。
  6. 转移到单个 GPU。
  7. 16 位混合精度训练。
  8. 移动到多个 GPU(模型复制)。
  9. 移动到多个 GPU 节点(8 个以上的 GPU)。
  10. 我的思考模型加速的技巧

py torch-闪电

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

你可以在 Pytorch 库 Pytorch-Lightning 中找到我在这里讨论的所有优化。Lightning 是 Pytorch 上的一个轻型包装器,它可以自动对研究人员进行培训,同时让他们完全控制关键的模型部件。查看本教程,获取更强大的示例

Lightning 采用了最新的最佳实践,最大限度地减少了可能出错的地方。

我们将在这里为 MNIST 定义我们的照明模型,并使用训练器进行拟合。

1.数据加载器

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

这可能是最容易获得一些速度增益的地方。保存 h5py 或 numpy 文件来加速数据加载的日子已经一去不复返了(等等…你们不会这么做吧??).使用 Pytorch dataloader 加载图像数据很简单(对于 NLP 数据,查看 TorchText

在 lightning 中,你不需要指定训练循环,只需要定义数据加载器,训练器会在需要的时候调用它们

2.数据加载器中的工作人员数量

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

加速的另一个神奇之处来自于允许批量并行加载。因此,您可以一次加载 nb_workers 批处理,而不是一次加载一个批处理。

3.批量

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

在开始下一个优化步骤之前,将批处理大小提高到 CPU-RAM 或 GPU-RAM 允许的最大值。

下一节将重点关注如何帮助减少内存占用,以便您可以继续增加批处理大小。

记住,你可能需要再次更新你的学习率。一个很好的经验法则是,如果你的批量加倍,学习速度也会加倍。

4.累积梯度

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

如果您的计算资源已经达到极限,并且您的批处理大小仍然太低(比如说 8),那么我们需要模拟一个更大的批处理大小用于梯度下降,以提供一个好的估计。

假设我们想要达到 128 的批量。然后,在执行单个优化器步骤之前,我们将执行 16 次向前和向后传递,批处理大小为 8。

在 lightning 中,这一切都是为你而做的。只需设置accumulate _ grad _ batches = 1

5.保留图形

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

炸毁 RAM 的一个简单方法是不要释放指向计算图的指针,比如说……为了日志记录的目的存储您的损失

losses = []...
losses.append(loss)print(f'current loss: {torch.mean(losses)'})

上面的问题是损失还有图的副本。在这种情况下,调用。项()来释放它。

# bad
losses.append(loss)# good
losses.append(loss.item())

Lightning 特别注意确保它永远不会保留图形的副本。

6.单 GPU 训练

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

一旦你完成了前面的步骤,就该进入 GPU 培训了。GPU 上的培训将在许多 GPU 核心上并行化数学计算。您获得的加速取决于您使用的 GPU 类型。我推荐个人用的 2080Ti 和公司用的 V100。

乍一看,这似乎令人不知所措,但你真的只需要做两件事:1)将你的模型移动到 GPU,2)每当你通过它运行数据时,将数据放在 GPU 上。

如果你使用 Lightning,你不需要对你的代码做任何事情。只需设置训练器(GPU = 1)

在 GPU 上进行训练时,需要注意的主要问题是限制 CPU 和 GPU 之间的传输次数。

# **expensive**
x = x.cuda(0)# **very** expensive
x = x.cpu()
x = x.cuda(0)

例如,如果内存不足,不要将数据移回 CPU 以节省内存。在采取这种方法之前,尝试用其他方法优化您的代码,或者在 GPU 之间进行分配。

另一件要注意的事情是调用强制 GPU 同步的操作。一个例子就是清除内存缓存。

# really bad idea. Stops all the GPUs until they all catch up
torch.cuda.empty_cache()

但是,如果您使用 Lightning,唯一可能出现问题的地方是当您定义 Lightning 模块时。闪电特别注意不要犯这种错误。

7.16 位精度

16 位精度是一个惊人的技巧,可以将内存占用减半。大多数模型都是使用 32 位精度数字进行训练的。然而,最近的研究发现,16 位的模型也能很好地工作。混合精度意味着对某些事情使用 16 位,但对权重等事情保持 32 位。

要在 Pytorch 中使用 16 位精度,请安装英伟达的 apex 库,并对您的模型进行这些更改。

amp 套餐会帮你搞定大部分事情。如果梯度爆炸或变为零,它甚至会缩放损失。

在 lightning 中,启用 16 位很简单,不需要修改模型中的任何内容,也不需要做我上面写的事情。设置训练器(精度=16)

8.移动到多个 GPU

现在,事情变得非常有趣了。有 3 个(可能更多?)多 GPU 训练的方法。

分批训练

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

A) Copy model on each GPU. B) Give each GPU a portion of the batch.

第一种方式应该叫做分批培训。这种策略将模型复制到每个 GPU 上,每个 GPU 获得一部分批次。

在 lightning 中,你可以增加你告诉教练的 GPU 数量,而不必做上述任何事情。

分割模型训练

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

Put different parts of the model on different GPUs. Batch moves sequentially

有时你的模型可能太大而不适合内存。例如,带有编码器和解码器的序列到序列模型在生成输出时可能会占用 20 GB 的 RAM。在这种情况下,我们希望将编码器和解码器放在不同的 GPU 上。

对于这种类型的训练,不要给闪电训练师任何 GPU。相反,把你自己的模块放到正确的 GPU 上的 LightningModule 中

混合两者

在上述情况下,编码器和解码器仍然可以从并行化每个 操作 中受益。我们现在可以变得更有创造力。

使用多个 GPU 时需要考虑的注意事项

  • model.cuda()不会做任何事情,如果它已经在那个设备上的话。
  • 始终将输入放在设备列表中的第一个设备上。
  • 跨设备传输数据非常昂贵,请将此作为最后手段。
  • 优化器和渐变将存储在 GPU 0 上。因此,GPU 0 上使用的内存可能会比其他内存大得多。

9.多节点 GPU 培训

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

Every GPU on every machine gets a copy of the model. Each machine gets a portion of the data and trains only on that portion. Each machine syncs gradients with the other.

如果你已经做到了这一步,你现在已经进入了训练 Imagenet 的领域!这没有您想象的那么难,但是可能需要更多关于您的计算集群的知识。这些说明假设您正在集群上使用 SLURM。

Pytorch 通过跨每个节点复制每个 GPU 上的模型并同步梯度,允许多节点训练。因此,每个模型在每个 GPU 上独立初始化,本质上在数据分区上独立训练,只是它们都从所有模型接收梯度更新。

在高层次上:

  1. 在每个 GPU 上初始化一个模型的副本(确保设置种子,使每个模型初始化为相同的权重,否则会失败)。****
  2. 将数据集切割成子集(使用分布式采样器)。每个 GPU 只在自己的小子集上训练。****
  3. 开着。backward()所有副本接收所有模型的渐变副本。这是模型之间唯一的一次交流。

Pytorch 有一个很好的抽象,叫做 DistributedDataParallel,可以帮你做到这一点。要使用 DDP,您需要做以下事情:

Pytorch 团队有一个不错的教程来看这个的全部细节。

然而,在 Lightning 中,这是为您提供的。只需设置节点数标志,剩下的事情就交给你了。

Lightning 还附带了一个 SlurmCluster 管理器,可以轻松地帮助您提交 SLURM 作业的正确细节(示例)。

10.奖金!在单个节点上进行更快的多 GPU 训练

事实证明,分布式数据并行比数据并行快得多,因为它执行的唯一通信是梯度同步。因此,一个好的方法是用它代替 DataParallel,即使是在单台机器上训练时

在 Lightning 中,这很容易通过将 distributed_backend 设置为 ddp 并设置 GPU 的数量来实现。

通过模型加速进行思考

虽然这个指南会给你一个提高网络速度的技巧列表,但是我会解释我是如何通过寻找瓶颈来思考的。

我将模型分成几个部分:

首先,我确保我的数据加载没有瓶颈。为此,我使用我描述的现有数据加载解决方案,但是如果没有一个适合您的需要,那么考虑离线处理并缓存到高性能数据存储中,比如 h5py。

接下来看看你在训练步骤中做了什么。确保你的向前传递是快速的,避免过多的计算,并尽量减少 CPU 和 GPU 之间的数据传输。最后,避免做降低 GPU 速度的事情(在本指南中讨论)

接下来,我尝试最大化我的批处理大小,这通常会受到 GPU 内存量的限制。这是一个关于跨 GPU 分布的游戏,同时最大限度地减少延迟,以有效地使用大批量(例如,在 Imagenet 上,我可能会尝试跨许多 GPU 获得 8,000+的有效批量。)

但是,您需要小心大批量。针对您的具体问题查阅文献,看看人们是如何解决的!

致谢

感谢 Jeff Johnson 带来的令人惊叹的 CUDA 洞察,感谢 Pytorch 团队帮助 DDP 工作(更不用说他们令人惊叹的框架和文档)。感谢我实验室成员的测试帮助(特别是辛乔恩·雷斯尼克)。

反向传播的 10 行证明

原文:https://towardsdatascience.com/a-10-line-proof-of-back-propagation-5a2cad1032c4?source=collection_archive---------18-----------------------

没有求和也没有索引的矢量证明。

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

Photo by Tim Marshall on Unsplash

TLDR

反向传播是深度学习的脊梁。虽然有大量关于这一主题的文献,但很少有人彻底解释反向传播所需的梯度公式(∂ 损耗 / ∂ W )从何而来。即使他们解释了,数学往往会变得很长,到处都是指数,因为问题的维度很高:你有一个样本数量的指数,一个层数的指数和一个每层神经元数量的指数。

所以每次我想更新我过去学到的机器学习概念时,我总是很难在不看教科书的情况下写出反向传播背后的数学。虽然我明白它是如何工作的,但我发现这些公式非常不直观,有时甚至令人困惑…

所以这篇文章的想法是用一种优雅的方式演示反向传播公式,只使用的矢量化演算:所以没有索引 i,j,k,… 并且根本没有求和∑! (我们将使用的唯一索引是表示层。)

介绍

假设我们有以下神经网络(NN)架构

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

NN with 2 hidden layers and an output of 3 classes

我们的神经网络有两个隐藏层和一个三类输出层。我们将对所有层使用 softmax 激活

训练这个模型意味着最小化我们的损失函数,即交叉熵(对数损失)。由于我们有 3 个班,所以日志损失为:𝜉( YXW₁W₂W₃ ) = 总和 [ Y日志(x₃)】
,其中:总和为所有"○"也被称为哈达玛产品

X₀ 是一个 n×3 矩阵,n 是最小批量的大小。
w₀是一个 3×5 的矩阵。它具有从层 0 到层 1 的过渡的权重。 X₁ 是一个 n×5 矩阵。它表示第一层的数据转换。 W₁ 是一个 5×4 矩阵。它具有从第 1 层到第 2 层的过渡的权重。 X₂ 是一个 n×4 矩阵。它表示第二层的数据转换。 W₂ 是一个 4×3 矩阵。它具有从第 2 层到第 3 层过渡的权重。 X₃ 是一个 n×3 矩阵。它表示第三层的数据转换。 Y 是一个 n×3 矩阵,3 是类的个数。

基本上,本文的目标是演示下面的差分表达式:(★)

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

带着𝜹₂=y-x₃𝜹₁ = ( 𝜹₂。w₂ᐪ**)x₂○(1-x₂)
𝜹₀ = ( 𝜹₁。w₁
)x₁○(1-x₁)。
和○为哈达玛产品
:Frobenius 产品
******

这种差异特别有趣,因为它揭示了反向传播期间权重更新所需的所有梯度

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

因此,在每一步中,Wᵢ 更新如下:【wᵢ=wᵢ+𝛼xᵢ𝜹ᵢ𝛼为学习率。***

如果你对如何找到(★)感兴趣,那么这篇文章就是为你准备的!

关键结果需要证明

1.与多项式回归的联系

实际上,如果你取我们网络的最后两层,它基本上是一个多项逻辑回归,X₂作为输入数据,X₃作为输出预测。

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

****𝜎为 softmax 函数,我们可以写出 X₃ =𝜎( X₂W₂
Z₂=X₂W₂,我们可以写成 X₃ =𝜎( Z₂

这样损失可以写成: 𝜉 = 总和 [ Y日志(𝜎(z₂)]

所以如果我们同意这确实是一个多项逻辑回归问题,那么我们就有以下结果:

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

为了使这篇文章简短,我们不会深入研究如何计算这些梯度的细节。但是如果你对这个证明感兴趣,那么让我知道,我会试着写一篇关于它的文章。

另一个要注意的有趣的事情是,由于我们对所有层使用 softmax 激活,那么我们可以推断:

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

for i in 1,2,3

2.矩阵的微分函数

这一部分相当重要,因为它将为我们提供一种优雅的方式来揭示最终的表达(★)。

f:矩阵- >标量

我们假设 f 是一个函数,它取一个矩阵,输出一个标量。如果 f 是可微的,那么:

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

with X and D having the same shape

因此,f 的微分写为:

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

以“:”为 Frobenius 产品[a:b=trace(ab)]。

f:标量- >标量,按元素应用于矩阵

让我们假设 f 是一个简单的函数,它接受一个标量并输出一个标量。现在让我们用 F 来表示这个函数,它将 F 独立地应用于矩阵中的每个元素。如果 f 是可微的,那么:

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

with dF, dX and D having the same shape.

因此,f 的微分写为:

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

“○”是我们之前看到的 hadamard 产品

3.Hadamard 和 Frobenius 产品的性质

设 A、B 和 C 是三个形状相同的矩阵。

  • 哈达玛产品的特性:

除了矩阵之外,它与简单的标量乘法具有基本相同的性质。

可交换的AB = BA**
联想的A○***(BC)=(AB)C = A【A*******

  • Frobenius 产品的特性:

分配式超额加法A:(B+C)= A:B+A:C****

下一个性质特别有趣,可以通过用 trace 公式替换“:”运算符来简单证明。

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

两个产品的联合性能:

运算顺序:
“○”比“:”优先级高,两者都比矩阵乘法优先级低。”即: .”>“○”>":
由此,A:B
C . D = A:(B*(C . D))*****

这两个运算符之间最重要的属性如下:

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

并且可以简单地通过用 trace 公式替换“:”操作符来演示。

反向传播公式的证明

1.区分损失

如果我们合并 1.a 和 2.a,我们有

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

由于 Z 是一个矩阵乘法,其区别如下:

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

因此

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

First 4 lines of the proof

我们现在有𝜉对 W₂和 X₂的 4 行证明。

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

2.区分隐藏层

现在让我们通过最后一个隐藏层反向传播。如果我们把 1.b 和 2.b 结合起来,我们得到:

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

这样𝜹₂w₂:dx₂就变成了

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

Last 6 lines of the proof

现在我们有了𝜹₂w₂:dx₂,共 6 行证明的微分。

把这个放回 d𝜉给了我们

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

原来其实就是这样。剩下的就是对剩下的层重复这个步骤。

通过对𝜹₁w₁:dx₁所做的与我们对𝜹₂w₂:dx₂所做的相同,我们得到:

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

3.把所有的放在一起

最后,把所有东西都放回 d𝜉,我们得到了最终的等式(★)

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

带着𝜹₂**=yx₃𝜹₁ = ( 𝜹₂。w₂ᐪ**)g₁**=(𝜹₂。w₂ᐪ**)x₂○(1-x₂)
𝜹₀ = ( 𝜹₁。w₁
)○g₀**=(𝜹₁。w₁ᐪ**)x₁○(1-x₁)****************

Tada!🎉

结论

就我个人而言,我发现这种证明更优雅,更容易从记忆中重现,而不需要看教科书。我希望你也是这样,我希望你喜欢这篇文章。

参考

**** [## 多项式逻辑回归

在统计学中,多项逻辑回归是一种分类方法,将逻辑回归推广到…

en.wikipedia.org](https://en.wikipedia.org/wiki/Multinomial_logistic_regression) [## Softmax 函数

在数学中,softmax 函数,也称为 softargmax 或归一化指数函数,[2] :198 是一个…

en.wikipedia.org](https://en.wikipedia.org/wiki/Softmax_function) [## 哈达玛乘积(矩阵)

在数学中,哈达玛积(也称为舒尔积或熵积)是一种二元运算…

en.wikipedia.org](https://en.wikipedia.org/wiki/Hadamard_product_%28matrices%29) [## Frobenius 内积

在数学中,Frobenius 内积是一种二元运算,它取两个矩阵并返回一个数。这是…

en.wikipedia.org](https://en.wikipedia.org/wiki/Frobenius_inner_product)****

将差分隐私融入深度学习模型的 5 步指南

原文:https://towardsdatascience.com/a-5-step-guide-on-incorporating-differential-privacy-into-your-deep-learning-models-7861c6c822c4?source=collection_archive---------19-----------------------

使用 PyTorch 和差分隐私对 MNIST 数字进行分类

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

Photo by Farzad Nazifi on Unsplash

介绍

到目前为止,我们都知道差分隐私的好处,它如何在保护个人隐私的同时仍然提供对大型数据集的准确查询结果。这篇文章将阐述如何将差分隐私应用于 MNIST 数字分类问题,并使用一种称为教师群体私人聚合(PATE)的技术对其进行分析。

方法学

首先,我们将私有数据分成 N 个集合(在本例中为 100 个),并在 N 个数据集的每一个上训练一个分类器。这些被称为的量词。然后,我们将使用教师分类器来预测公共数据的标签。对于公共数据集中的每个图像,N 个分类器预测最多的标签将被认为是该图像的真实标签。

现在,使用老师分类器的预测作为我们公共数据的真实标签,我们将训练一个学生分类器,然后可以用来分类新的看不见的图像。

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

Figure 2: Overview of the approach: (1) an ensemble of teachers is trained on disjoint subsets of the sensitive data, (2) a student model is trained on public data labeled using the ensemble.

MNIST 训练数据将被视为私有数据,我们将在此基础上训练我们的教师模型。然后,通过组合教师模型的预测而获得的学生模型将在 MNIST 测试数据上被训练(90%的测试数据将用于训练模型,而剩余的 10%将用于测试其准确性)

好吧,但是隐私部分在哪里起作用?

深度学习模型有过度拟合训练数据的趋势。神经网络可以学习个人的特征,而不是学习一般特征,然后对手可以利用这些特征来获取个人的私人信息。

通过不直接在私人数据上训练学生模型,我们防止它直接从数据集中学习单个人的关键个人特征。取而代之的是,由教师模型学习的概括特征和趋势被用于训练学生。

然而,有一个小警告。如果图像的标签可以通过移除单个教师的预测来改变,对手可以将搜索范围缩小到该模型。

为了避免这种情况,我们在选择预测最多的标签作为公共数据的真实标签之前,向教师模型的预测添加随机的 拉普拉斯噪声 。通过这种方式,我们增加了一点随机性,并扭曲了最终结果,这样真正的标签就不会因为去掉一个老师而轻易改变。

使用 PyTorch 实现差分隐私

第一步:加载数据

torchvision导入 MNIST 数据,定义一个函数生成数据加载器。

**import** **torch**

**from** **torchvision** **import** datasets, transforms
**from** **torch.utils.data** **import** Subset

*# Transform the image to a tensor and normalize it*
transform = transforms.Compose([transforms.ToTensor(),
                                transforms.Normalize((0.5,), (0.5,))])

*# Load the train and test data by using the transform*
train_data = datasets.MNIST(root='data', train=**True**, download=**True**, transform=transform)
test_data = datasets.MNIST(root='data', train=**False**, download=**True**, transform=transform)num_teachers = 100 *# Define the num of teachers*
batch_size = 32 *# Teacher batch size*

**def** get_data_loaders(train_data, num_teachers):
    *""" Function to create data loaders for the Teacher classifier """*
    teacher_loaders = []
    data_size = len(train_data) // num_teachers

    **for** i **in** range(data_size):
        indices = list(range(i*data_size, (i+1)*data_size))
        subset_data = Subset(train_data, indices)
        loader = torch.utils.data.DataLoader(subset_data, batch_size=batch_size)
        teacher_loaders.append(loader)

    **return** teacher_loaders

teacher_loaders = get_data_loaders(train_data, num_teachers)

现在,通过如上所述分割 MNIST 测试集来生成学生训练和测试数据。

*# Create the public dataset by using 90% of the Test data as train #data and remaining 10% as test data.*student_train_data = Subset(test_data, list(range(9000)))
student_test_data = Subset(test_data, list(range(9000, 10000)))

student_train_loader = torch.utils.data.DataLoader(student_train_data, batch_size=batch_size)
student_test_loader = torch.utils.data.DataLoader(student_test_data, batch_size=batch_size)

步骤 2:定义和培训教师模型

定义一个简单的 CNN 来分类 MNIST 数字。

**import** **torch.nn** **as** **nn**
**import** **torch.nn.functional** **as** **F**
**import** **torch.optim** **as** **optim**

**class** **Classifier**(nn.Module):
    *""" A Simple Feed Forward Neural Network.* 
 *A CNN can also be used for this problem* 
 *"""*
    **def** __init__(self):
        super().__init__()

        self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
        self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
        self.conv2_drop = nn.Dropout2d()
        self.fc1 = nn.Linear(320, 50)
        self.fc2 = nn.Linear(50, 10)

    **def** forward(self, x):
        x = F.relu(F.max_pool2d(self.conv1(x), 2))
        x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
        x = x.view(-1, 320)
        x = F.relu(self.fc1(x))
        x = F.dropout(x, training=self.training)
        x = self.fc2(x)
        **return** F.log_softmax(x)

现在定义训练和预测函数

**def** train(model, trainloader, criterion, optimizer, epochs=10):
    *""" This function trains a single Classifier model """*
    running_loss = 0
    **for** e **in** range(epochs):
        model.train()

        **for** images, labels **in** trainloader:
            optimizer.zero_grad()

            output = model.forward(images)
            loss = criterion(output, labels)
            loss.backward()
            optimizer.step()

            running_loss += loss.item()**def** predict(model, dataloader):
    *""" This function predicts labels for a dataset* 
 *given the model and dataloader as inputs.* 
 *"""*
    outputs = torch.zeros(0, dtype=torch.long)
    model.eval()

    **for** images, labels **in** dataloader:
        output = model.forward(images)
        ps = torch.argmax(torch.exp(output), dim=1)
        outputs = torch.cat((outputs, ps))

    **return** outputs**def** train_models(num_teachers):
    *""" Trains *num_teacher* models (num_teachers being the number of teacher classifiers) """*
    models = []
    **for** i **in** range(num_teachers):
        model = Classifier()
        criterion = nn.NLLLoss()
        optimizer = optim.Adam(model.parameters(), lr=0.003)
        train(model, teacher_loaders[i], criterion, optimizer)
        models.append(model)
    **return** modelsmodels = train_models(num_teachers)

步骤 3:通过组合教师模型的预测来生成聚合的教师和学生标签。

现在,我们需要选择ε值,我们首先定义差分隐私的正式定义

这个定义并没有创造差异隐私,相反,它是一个查询 M 提供多少隐私的度量。具体来说,它是在数据库(x)和并行数据库(y)上运行查询 M 之间的比较。正如您所记得的,并行数据库被定义为与一个完整的数据库(x)相同,只是删除了一个条目/人。

因此,该定义指出,对于所有并行数据库,数据库(x)上的查询和数据库(y)上的相同查询之间的最大距离将是 e^epsilon,但有时该约束不适用于概率增量。因此,这个定理被称为“ε-δ”差分隐私。

我们应该增加多少噪音?

添加到查询输出中的噪声量是以下四个因素的函数:

  • 噪声的类型(高斯/拉普拉斯)
  • 查询/函数的敏感性
  • 期望的ε
  • 所需的增量(δ)

因此,对于我们添加的每种噪声,我们有不同的方法来计算添加多少,作为灵敏度、ε和δ的函数。我们将重点讨论拉普拉斯噪声。

拉普拉斯噪声根据“比例”参数 b 增加/减少。我们基于以下公式选择“b”。

b =敏感度(查询)/ε

换句话说,如果我们将 b 设置为这个值,那么我们知道我们将有一个隐私泄露的<= epsilon. Furthermore, the nice thing about Laplace is that it guarantees this with delta == 0. There are some tunings where we can have very low epsilon where delta is non-zero, but we’ll ignore them for now.

**import** **numpy** **as** **np**

epsilon = 0.2**def** aggregated_teacher(models, dataloader, epsilon):
    *""" Take predictions from individual teacher model and* 
 *creates the true labels for the student after adding* 
 *laplacian noise to them* 
 *"""*
    preds = torch.torch.zeros((len(models), 9000), dtype=torch.long)
    **for** i, model **in** enumerate(models):
        results = predict(model, dataloader)
        preds[i] = results

    labels = np.array([]).astype(int)
    **for** image_preds **in** np.transpose(preds):
        label_counts = np.bincount(image_preds, minlength=10)
        beta = 1 / epsilon

        **for** i **in** range(len(label_counts)):
            label_counts[i] += np.random.laplace(0, beta, 1)

        new_label = np.argmax(label_counts)
        labels = np.append(labels, new_label)

    **return** preds.numpy(), labelsteacher_models = models
preds, student_labels = aggregated_teacher(teacher_models, student_train_loader, epsilon)

Step 4: Create the Student model and train it using the labels generated in step 3.

**def** student_loader(student_train_loader, labels):
    **for** i, (data, _) **in** enumerate(iter(student_train_loader)):
        **yield** data, torch.from_numpy(labels[i*len(data): (i+1)*len(data)])student_model = Classifier()
criterion = nn.NLLLoss()
optimizer = optim.Adam(student_model.parameters(), lr=0.003)
epochs = 10
steps = 0
running_loss = 0
**for** e **in** range(epochs):
    student_model.train()
    train_loader = student_loader(student_train_loader, student_labels)
    **for** images, labels **in** train_loader:
        steps += 1

        optimizer.zero_grad()
        output = student_model.forward(images)
        loss = criterion(output, labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()

        **if** steps % 50 == 0:
            test_loss = 0
            accuracy = 0
            student_model.eval()
            **with** torch.no_grad():
                **for** images, labels **in** student_test_loader:
                    log_ps = student_model(images)
                    test_loss += criterion(log_ps, labels).item()

                    *# Accuracy*
                    ps = torch.exp(log_ps)
                    top_p, top_class = ps.topk(1, dim=1)
                    equals = top_class == labels.view(*top_class.shape)
                    accuracy += torch.mean(equals.type(torch.FloatTensor))
            student_model.train()
            print("Epoch: **{}**/**{}**.. ".format(e+1, epochs),
                  "Training Loss: **{:.3f}**.. ".format(running_loss/len(student_train_loader)),
                  "Test Loss: **{:.3f}**.. ".format(test_loss/len(student_test_loader)),
                  "Test Accuracy: **{:.3f}**".format(accuracy/len(student_test_loader)))
            running_loss = 0

Here’s a snippet of the 训练损失精度实现。

Epoch: 9/10..  Training Loss: 0.035..  Test Loss: 0.206..  Test Accuracy: 0.941
Epoch: 9/10..  Training Loss: 0.034..  Test Loss: 0.196..  Test Accuracy: 0.949
Epoch: 10/10..  Training Loss: 0.048..  Test Loss: 0.204..  Test Accuracy: 0.943
Epoch: 10/10..  Training Loss: 0.046..  Test Loss: 0.203..  Test Accuracy: 0.943
Epoch: 10/10..  Training Loss: 0.045..  Test Loss: 0.203..  Test Accuracy: 0.945
Epoch: 10/10..  Training Loss: 0.049..  Test Loss: 0.207..  Test Accuracy: 0.946
Epoch: 10/10..  Training Loss: 0.032..  Test Loss: 0.228..  Test Accuracy: 0.941
Epoch: 10/10..  Training Loss: 0.030..  Test Loss: 0.252..  Test Accuracy: 0.939

步骤 5:让我们对聚合教师生成的学生标签执行 PATE 分析

**from** **syft.frameworks.torch.differential_privacy** **import** pate

data_dep_eps, data_ind_eps = pate.perform_analysis(teacher_preds=preds, indices=student_labels, noise_eps=epsilon, delta=1e-5)
print("Data Independent Epsilon:", data_ind_eps)
print("Data Dependent Epsilon:", data_dep_eps)

输出:

Data Independent Epsilon: 1451.5129254649705
Data Dependent Epsilon: 4.34002697554237

pate.perform_analysis 方法返回两个值——一个与数据无关的ε和一个与数据相关的ε。数据相关的 epsilon 是通过查看教师之间的一致程度而获得的 epsilon 值。在某种程度上,PATE 分析奖励用户构建彼此一致的教师模型,因为泄漏信息和跟踪个人信息变得更加困难。

结论

使用 PATE 分析方法指导的学生-教师架构是一种将差分隐私引入深度学习模型的好方法。然而,差分隐私仍处于早期阶段,随着该领域研究的深入,将会开发出更复杂的方法来减少隐私-准确性之间的权衡,以及差分隐私仅在大型数据集上表现良好的缺点。

参考

[1] Dwork,c .和 Roth,A. 《差分隐私的算法基础》 (2014),理论计算机科学的基础和趋势9(3–4),第 211–407 页。

[2] Abadi,Martin 等,具有差分隐私的深度学习 (2016),2016 年 ACM SIGSAC 计算机与通信安全会议论文集。ACM,2016。

[3]图 1,由法尔扎德·纳兹菲Unsplash 上拍摄的照片

[4]图 2,Nicolas Papernot 等人,PATE(2018)的可扩展私人学习,在 2018 年 ICLR 会议上作为会议论文发表

构建机器学习项目的 6 步现场指南

原文:https://towardsdatascience.com/a-6-step-field-guide-for-building-machine-learning-projects-6e4554f6e3a1?source=collection_archive---------2-----------------------

有数据,想知道如何用它来使用机器学习?读读这个。

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

I listened to Korn’s new album on repeat for 6-hours the other day and wrote out a list of things I think about when it comes to the modelling phase of machine learning projects. The whiteboard sums it up. Thank you Sam Bourke for the photo.

机器学习是广义的。媒体让它听起来像魔术。阅读这篇文章将改变这一点。它将向你概述机器学习可以用来解决的最常见的问题类型。同时给你一个框架来处理你未来的机器学习概念验证项目。

首先,我们将澄清一些定义。

机器学习、人工智能和数据科学有什么不同?

这三个主题可能很难理解,因为没有正式的定义。即使做了一年多的机器学习工程师,这个问题我也没有很好的答案。我会怀疑任何声称他们知道的人。

为了避免混淆,我们将保持简单。对于本文,您可以将机器学习视为在数据中寻找模式的过程,以了解更多信息或预测某种未来事件。

下面的步骤偏向于构建一些东西并观察它是如何工作的。边做边学。

下一个机器学习项目的 6 个步骤

机器学习管道可以分为三个主要步骤。数据收集、数据建模和部署。所有这些都相互影响。

你可以通过收集数据开始一个项目,建模,意识到你收集的数据很差,回去收集数据,再次建模,找到一个好的模型,部署它,发现它不起作用,制作另一个模型,部署它,发现它不起作用,再次回到数据收集。这是一个循环。

等等,模型是什么意思?部署是什么意思?我如何收集数据?

很棒的问题。

你如何收集数据将取决于你的问题。我们一会儿会看一些例子。但是一种方法可以是你的客户在电子表格中的购买。

建模是指使用机器学习算法在你收集的数据中寻找见解。

正常算法和机器学习算法有什么区别?

就像你最喜欢的鸡肉菜肴的烹饪食谱一样,一个普通的算法是一组如何将一组配料变成蜂蜜芥末酱的指令。

让机器学习算法与众不同的是,你不是有一套指令,而是从配料和准备好的最后一道菜开始。然后,机器学习算法会查看配料和最终的菜肴,并制定出一套指令。

有许多不同类型的机器学习算法,有些算法在不同的问题上表现得比其他算法更好。但前提仍然是,他们都有在数据中寻找模式或指令集的目标。

部署就是获取您的指令集并在应用程序中使用它。这个应用程序可以是任何东西,从向在线商店的客户推荐产品到医院试图更好地预测疾病的存在。

这些步骤的细节对于每个项目都是不同的。但是每一个的原理都是相似的。

本文主要关注数据建模。它假设你已经收集了数据,并希望用它来建立一个机器学习的概念证明。让我们来分析一下你可能会怎么做。

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

Machine learning projects can be broken into three steps, data collection, data modelling and deployment. This article focuses on steps within the data modelling phase and assumes you already have data. Full version on Whimsical.

  1. 问题定义 —我们试图解决什么业务问题?怎么把它表述成机器学习问题?
  2. 数据 —如果机器学习正在从数据中获得洞察力,我们有什么数据?如何匹配问题定义?我们的数据是结构化的还是非结构化的?静态还是流?
  3. 评价——什么定义了成功?一个 95%准确率的机器学习模型就足够好了吗?
  4. 特性 —我们的数据的哪些部分将用于我们的模型?我们已经知道的东西怎么会影响这个呢?
  5. 造型 —你该选择哪一款?怎么才能改善呢?怎么和其他车型比?
  6. 实验——我们还能尝试什么?我们部署的模型是否如我们预期的那样?根据我们的发现,其他步骤有什么变化?

让我们更深入地研究一下。

1.问题定义——将您的业务问题重新表述为机器学习问题

为了帮助决定您的企业是否可以使用机器学习,第一步是匹配您试图解决机器学习问题的业务问题。

机器学习的四种主要类型是监督学习、非监督学习、迁移学习和强化学习(也有半监督的,但为了简洁起见,我省略了它)。商业应用中最常用的三种是监督学习、非监督学习和迁移学习。

监督学习

监督学习之所以被称为监督学习,是因为你有数据和标签。机器学习算法试图学习数据中的什么模式导致了标签。受监督的部分发生在训练期间。如果算法猜错了标签,它会尝试自我纠正。

例如,如果你试图预测一个新病人的心脏病。你可能有 100 名病人的匿名医疗记录作为数据,他们是否有心脏病作为标签。

机器学习算法可以查看医疗记录(输入)和患者是否患有心脏病(输出),然后计算出医疗记录中的哪些模式会导致心脏病。

一旦你有了一个训练有素的算法,你就可以通过它传递一个新病人的医疗记录(输入),并预测他们是否患有心脏病(输出)。重要的是要记住这个预测是不确定的。它以概率的形式返回。

算法说,“根据我之前看到的,看起来这个新病人的医疗记录有 70%与心脏病患者一致。”

无监督学习

无监督学习就是你有数据但没有标签。这些数据可能是你的在线视频游戏商店顾客的购买历史。使用这些数据,您可能希望将相似的客户分组在一起,以便为他们提供专业的交易。你可以使用机器学习算法根据购买历史对你的客户进行分组。

检查完组后,您提供标签。可能有一群人对电脑游戏感兴趣,另一群人喜欢主机游戏,还有一群人只买打折的老游戏。这就是所谓的聚类。

这里需要记住的重要一点是,算法并没有提供这些标签。它发现了相似客户之间的模式,并利用你的领域知识,你提供了标签。

迁移学习

迁移学习是指获取现有机器学习模型学习到的信息,并根据自己的问题进行调整。

从头开始训练机器学习模型可能既昂贵又耗时。好消息是,你不必总是这样。当机器学习算法在一种数据中找到模式时,这些模式可以用于另一种类型的数据。

假设您是一家汽车保险公司,想要构建一个文本分类模型来分类提交车祸保险索赔的人是有过错(造成事故)还是没有过错(没有造成事故)。

你可以从一个现有的文本模型开始,这个模型已经阅读了整个维基百科,并且记住了不同单词之间的所有模式,例如,哪个单词更有可能一个接一个地出现。然后使用您的汽车保险索赔(数据)及其结果(标签),您可以调整现有的文本模型来解决您自己的问题。

如果机器学习可以用于你的业务,它很可能属于这三种学习类型之一。

但是让我们把它们进一步分解为分类、回归和推荐。

  • 分类 —你想预测某样东西是一个东西还是另一个东西?比如一个客户会不会流失?或者病人有没有心脏病?注意,可以有两个以上的东西。两类称为二元分类,两类以上称为多类分类。多标签是指一个项目可以属于多个类别。
  • 回归 —你想预测某个事物的具体数字吗?比如房子会卖多少钱?或者下个月会有多少客户访问你的网站?
  • 推荐 —你想给某人推荐点什么吗?比如基于他们之前的购买来购买产品?或者基于他们的阅读历史来阅读的文章?

现在你知道了这些事情,你的下一步就是用机器学习的术语来定义你的业务问题。

让我们以之前的汽车保险为例。你每天会收到数千份索赔,你的员工会阅读这些索赔,并决定提交索赔的人是否有错。

但是现在,索赔的数量开始超过您的员工的处理速度。你有数以千计的过去索赔的例子,这些索赔被贴上有错或没有错的标签。

机器学习能有帮助吗?

你已经知道答案了。但是让我们看看。这个问题符合以上三个中的任何一个吗?分类回归还是推荐?

让我们换个说法。

我们是一家汽车保险公司,希望将收到的汽车保险索赔分为有过失或无过失。

看到关键词了吗?分类。

事实证明,这可能是一个机器学习分类问题。我说有可能是因为有可能行不通。

当把你的业务问题定义为机器学习问题时,从简单开始,多一句话就太多了。需要时增加复杂性。

2.数据——如果机器学习是从数据中获得洞察力,你有什么数据?

您拥有或需要收集的数据将取决于您想要解决的问题。

如果你已经有了数据,它很可能是两种形式之一。结构化或非结构化。在其中的每一个中,都有静态或流数据。

  • 结构化数据 —想象一个由行和列组成的表格,一个客户交易的 Excel 电子表格,一个病人记录的数据库。列可以是数字的,如平均心率,分类的,如性别,或序数的,如胸痛强度。
  • 非结构化数据 —任何不能立即转换为行列格式的数据,如图像、音频文件、自然语言文本等。
  • 静态数据 —已有的历史数据,不太可能发生变化。你公司的客户购买历史就是一个很好的例子。
  • 流数据 —不断更新的数据,旧记录可能会更改,新记录会不断添加。

有重叠的地方。

您的静态结构化信息表可能有包含自然语言文本和照片的列,并且会不断更新。

对于预测心脏病,一列可能是性别,另一列是平均心率,另一列是平均血压,另一列是胸痛强度。

对于保险索赔示例,一列可能是客户为索赔发送的文本,另一列可能是他们随文本一起发送的图像,最后一列是索赔的结果。该表每天都会更新新的索赔或旧索赔的变更结果。

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

Two examples of structured data with different kinds of data within it. Table 1.0 has numerical and categorical data. Table 2.0 has unstructured data with images and natural language text but is presented in a structured manner.

原则依然存在。你想利用你所拥有的数据来获得洞察力或预测某事。

对于监督学习,这包括使用特征变量来预测目标变量。用于预测心脏病的特征变量可以是性别,目标变量是患者是否患有心脏病。

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

Table 1.0 broken into ID column (yellow, not used for building machine learning model), feature variables (orange) and target variables (green). A machine learning model finds the patterns in the feature variables and predicts the target variables.

对于无监督学习,你不会有标签。但是你还是想找到模式。也就是说,将相似的样本组合在一起,并找出异常的样本。

对于迁移学习,你的问题仍然是一个监督学习问题,除非你利用机器学习算法从你自己的数据源以外的其他数据源学习的模式。

请记住,如果你使用客户数据来改善你的业务或为他们提供更好的服务,让他们知道是很重要的。这就是为什么你到处都能看到“这个网站使用 cookies”的弹出窗口。该网站利用你浏览网站的方式,很可能伴随着某种机器学习来改进他们的产品。

3.评估——成功的定义是什么?一个 95%准确率的机器学习模型就足够好了吗?

你已经用机器学习的术语定义了你的业务问题,并且你有数据。现在定义什么是成功。

分类、回归和推荐问题有不同的评价指标。你选择哪一个取决于你的目标。

为了使这个项目成功,无论某人是否有错,这个模型都需要达到 95%以上的准确率。

一个 95%准确的模型对于预测保险索赔中谁是错的听起来可能相当不错。但是对于预测心脏病,你可能想要更好的结果。

对于分类问题,你应该考虑的其他事情。

  • 假阴性 —模型预测为阴性,实际为阳性。在某些情况下,比如垃圾邮件预测,漏报并不太令人担心。但如果自动驾驶汽车的计算机视觉系统预测有行人时没有行人,这就不好了。
  • 假阳性 —模型预测为阳性,实际为阴性。预测某人有心脏病,而他们没有,这看起来似乎没问题。最好是安全的,对吗?如果这会对患者的生活方式产生负面影响,或者让他们接受他们并不需要的治疗计划,那就不会。
  • 真阴性 —模型预测阴性,实际阴性。这很好。
  • 真阳性 —模型预测阳性,实际阳性。这很好。
  • 精度 —有多少比例的正面预测实际上是正确的?不产生假阳性的模型的精度为 1.0。
  • 回忆 —实际阳性预测正确的比例是多少?不产生假阴性的模型的召回率为 1.0。
  • F1 评分——精准与召回的结合。越接近 1.0 越好。
  • 受试者工作特征(ROC)曲线&曲线下面积(AUC)—ROC 曲线是比较真阳性率和假阳性率的曲线图。AUC 指标是 ROC 曲线下的面积。预测 100%错误的模型的 AUC 为 0.0,预测 100%正确的模型的 AUC 为 1.0。

对于回归问题(你想要预测一个数字),你会想要最小化你的模型预测值和实际值之间的差异。如果你试图预测房子的售价,你会希望你的模型尽可能接近实际价格。为此,请使用梅或 RMSE。

如果希望较大的误差更显著,请使用 RMSE。例如,预测一栋房子将以 300,000 美元而不是 200,000 美元出售,而价格下降 100,000 美元,这比价格下降 50,000 美元要糟糕两倍以上。或者说,如果损失 10 万美元比损失 5 万美元要糟糕两倍。

推荐问题更难在实验中检验。一种方法是把你的一部分数据藏起来。当您的模型建立后,使用它来预测隐藏数据的建议,并查看它是如何排列的。

假设你正试图在网上商店向顾客推荐产品。您有 2010 年至 2019 年的历史购买数据。你可以根据 2010 年至 2018 年的数据建立一个模型,然后用它来预测 2019 年的购买量。然后,这就变成了一个分类问题,因为你试图对某人是否有可能购买一件商品进行分类。

然而,传统的分类标准并不适合推荐问题。精准和召回没有排序的概念。

如果你的机器学习模型返回一个 10 条建议的列表,在你的网站上显示给客户,你会希望最好的被首先显示,对吗?

  • Precision @ k(Precision up to k)—与常规精度相同,但是,您选择截止值 k。例如,精度为 5,意味着我们只关心前 5 个推荐。你可能有 10,000 个产品。但是你不能把它们都推荐给你的客户。

首先,你可能没有每一项的确切数字。但是知道你应该关注什么指标会让你知道如何评估你的机器学习项目。

4.要素-您的数据具有哪些要素,您可以使用哪些要素来构建模型?

并非所有的数据都是一样的。当你听到有人提到特性时,他们指的是数据中不同种类的数据。

三种主要类型的特征是分类的、连续的(或数字的)和衍生的。

  • 分类特征 —非此即彼。例如,在我们的心脏病问题中,病人的性别。或者对于在线商店来说,不管是否有人已经购买。
  • 连续(或数值)特征 —平均心率或登录次数等数值。
  • 衍生特征 —从数据中创建的特征。通常被称为特征工程。特征工程是主题专家如何将他们的知识编码到数据中。您可以将登录的次数与时间戳结合起来,形成一个称为“自上次登录以来的时间”的特性。或者把日期从数字变成“是工作日(是)”和“是工作日(否)”。

文本、图像和几乎任何你能想象到的东西也可以成为一个特征。无论如何,在机器学习算法可以对它们建模之前,它们都被转换成数字。

谈到特性时,需要记住一些重要的事情。

  • 在实验(训练)和生产(测试)期间保持相同 —机器学习模型应该在尽可能接近其在真实系统中的用途的特征上进行训练。
  • 与主题专家合作 —你对这个问题已经了解多少,这对你使用什么功能有什么影响?让你的机器学习工程师和数据科学家知道这一点。
  • 他们值得吗? —如果只有 10%的样本具有某个特性,是否值得将它整合到模型中?偏好覆盖面最广的功能。很多样本都有数据。
  • 完美等于破碎 —如果你的模型实现了完美的性能,你很可能在某个地方有功能泄漏。这意味着你的模型训练的数据正被用来测试它。没有一种模式是完美的。

您可以使用特性来创建简单的基线度量。客户流失方面的主题专家可能知道某人有 80%的可能在 3 周不登录后取消他们的会员资格。

或者,知道房屋销售价格的房地产经纪人可能知道超过 5 间卧室和 4 间浴室的房屋售价超过 50 万美元。

这些都是简化的,不一定要精确。但这是你要用来看机器学习是否可以改进的。

5.建模——您应该选择哪种模型?怎么才能改善呢?怎么和其他车型比?

一旦你定义了你的问题,准备好你的数据,评估标准和特征,是时候建模了。

建模分为三个部分,选择一个模型,改进一个模型,和其他模型比较。

选择模型

选择模型时,您需要考虑可解释性和易于调试性、数据量、训练和预测限制。

  • 可解释性和易于调试 —为什么一个模型要做出它所做的决定?如何修复这些错误?
  • 数据量 —你有多少数据?这种情况会改变吗?
  • 训练和预测的局限性——这个和上面有关系,你有多少时间和资源用于训练和预测?

要解决这些问题,从简单开始。最先进的模型很容易让人去接触。但是,如果它需要 10 倍的计算资源来训练,并且预测时间比评估指标提高 2%要长 5 倍,那么它可能不是最佳选择。

逻辑回归等线性模型通常比神经网络等更深入的模型更容易解释,训练速度非常快,预测速度也更快。

但很可能你的数据来自真实世界。来自真实世界的数据并不总是线性的。

然后呢?

决策树和梯度增强算法(花哨的词语,现在不重要的定义)的组合通常最适合结构化数据,如 Excel 表格和数据框架。查看随机森林XGBoostCatBoost

神经网络等深度模型通常最适用于图像、音频文件和自然语言文本等非结构化数据。然而,代价是它们通常需要更长的训练时间,更难调试,预测时间也更长。但这并不意味着你不应该使用它们。

迁移学习是一种利用深度模型和线性模型的方法。它包括采用一个预先训练好的深度模型,并使用它学习到的模式作为你的线性模型的输入。这大大节省了训练时间,让你更快地进行实验。

我在哪里可以找到预先训练好的模特?

PyTorch hubTensorFlow hubmodel zoofast.ai 框架内都有预训练的模型。这是构建任何类型的概念证明的首选位置。

其他种类的模型呢?

为了建立概念证明,你不太可能必须建立自己的机器学习模型。人们已经为这些写了代码。

你要关注的是准备好你的输入和输出,使它们可以用于现有的模型。这意味着严格定义你的数据和标签,并理解你试图解决什么问题。

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

To begin with, your main job will be making sure your inputs (data) lines up with how an existing machine learning algorithm expects them. Your next goal will be making sure the outputs are aligned with your problem definition and if they meet your evaluation metric.

调整和改进模型

一个模型的第一个结果并不是最后一个。就像调整汽车一样,机器学习模型可以被调整以提高性能。

调整模型涉及改变超参数,如学习率或优化器。或者特定于模型的架构因素,例如随机森林的树的数量以及神经网络的层数和类型。

这些曾经是从业者必须手动调整的东西,但是现在越来越自动化了。并且应该尽可能地。

通过迁移学习使用一个预先训练好的模型通常会有额外的好处。

调整和改进模型的首要任务应该是再现性和效率。有人应该能够重现你为提高绩效所采取的步骤。因为你的主要瓶颈将是模型训练时间,而不是改进的新想法,你的努力应该致力于效率。

比较模型

把苹果比作苹果。

  • 模型 1,根据数据 X 训练,根据数据 y 评估。
  • 模型 2,根据数据 X 训练,根据数据 y 评估。

其中模型 1 和 2 可以改变,但数据 X 或数据 y 不能改变

6.实验——我们还能尝试什么?根据我们的发现,其他步骤有什么变化?我们部署的模型是否如我们预期的那样?

这一步涉及所有其他步骤。因为机器学习是一个高度迭代的过程,你需要确保你的实验是可行的。

你最大的目标应该是最小化离线实验和在线实验之间的时间。

离线实验是你的项目还没有面向客户时采取的步骤。在线实验发生在你的机器学习模型投入生产的时候。

所有的实验都应该在数据的不同部分进行。

  • 训练数据集 —使用该数据集进行模型训练,你的数据的 70–80%是标准的。
  • 验证/开发数据集 —使用该数据集进行模型调整,10–15%的数据是标准数据。
  • 测试数据集 —使用该数据集进行模型测试和比较,10–15%的数据是标准数据。

这些数量可能会略有波动,这取决于您的问题和您拥有的数据。

训练数据表现不佳意味着模型没有正确学习。尝试不同的模型,改进现有的模型,收集更多的数据,收集更好的数据。

测试数据表现不佳意味着你的模型不能很好地概括。您的模型可能会过度拟合训练数据。使用更简单的模型或收集更多数据。

部署(在现实世界中)后的糟糕性能意味着您训练和测试模型的内容与实际发生的情况存在差异。重温步骤 1 和 2。确保您的数据与您试图解决的问题相匹配。

当你实施一个大的实验性改变时,记录下是什么和为什么。记住,就像模型调整一样,有人,包括你未来的自己,应该能够复制你所做的。

这意味着定期保存更新的模型和更新的数据集。

将它放在一起进行概念验证

许多企业听说过机器学习,但不确定从哪里开始。最好的起点之一是使用上面的六个步骤来构建概念证明。

概念验证不应该被视为从根本上改变你的业务运营方式的事情,而是探索机器学习是否能为你带来商业价值。

毕竟,你不是在追求花哨的解决方案来跟上炒作。您追求的是增值的解决方案。

在概念证明上放一个时间表,2、6 和 12 周是很好的量。有了好的数据,一个好的机器学习和数据科学从业者可以在相对较短的时间内获得 80–90%的最终建模结果。

让你的主题专家、机器学习工程师和数据科学家一起工作。没有什么比机器学习工程师建立一个伟大的模型来模拟错误的东西更糟糕的了。

如果网页设计师可以改善在线商店的布局,以帮助机器学习实验,他们应该知道。

请记住,由于概念证明的性质,机器学习可能不是您的企业可以利用的东西(不太可能)。作为项目经理,确保你意识到这一点。如果你是一名机器学习工程师或数据科学家,愿意接受你的结论。

但是并没有失去一切。

失败的价值在于你现在知道什么是失败的,并且可以把你的努力引向其他地方。这就是为什么为实验设定时间表是有帮助的。时间永远不够,但是最后期限创造了奇迹。

如果机器学习的概念证明结果很好,再走一步,如果不好,就后退一步。边做边学是一个比思考更快的过程。

本文遗漏的内容

这些步骤中的每一步都值得单独写一篇文章。我会努力的。

同时,有一些事情需要注意。

数据永远是最重要的。没有好的数据开始,任何机器学习模型都不会帮助你。如果你想在你的业务中使用机器学习,它从良好的数据收集开始。

部署改变一切。线下的好模式不一定代表线上的好模式。本文主要关注数据建模。一旦你部署了一个模型,就会有基础设施管理、数据验证、模型再训练、分析等等。任何云提供商都有这方面的服务,但把它们放在一起仍然是一种黑暗的艺术。给你的数据工程师高薪吧。如果你是数据工程师,分享你所知道的。

**数据收集和模型部署是机器学习管道中最长的部分。**本文只关注建模。即便如此,它也忽略了如何让你的数据做好建模准备的细节。

交易的工具各不相同。机器学习是由许多其他工具组成的大工具。从代码库和框架到不同的部署架构。做同一件事通常有几种不同的方法。最佳实践在不断变化。这篇文章关注的是不相关的东西。

这篇文章是基于脸书的机器学习领域指南,混合了我自己的一些经验。

Reddit 上有效调查招聘的 7 步指南

原文:https://towardsdatascience.com/a-7-step-guide-for-effective-survey-recruitment-on-reddit-77837380cbe?source=collection_archive---------16-----------------------

关于如何开展在线调查的实用指南

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

Image: Unsplash

做调查可能看似简单。

Google FormsSurveymonkeyQualtrics 这样的大学购买服务让调查变得便宜、快捷和容易。

然而,在网上做研究有其潜在的方法论问题。在特定的平台上做研究会带来特定的问题。

Shatz ( 2016 )在 Reddit 上提供了有效招聘的 7 步指南。

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

Image: Unsplash

1.为你的研究找到一个合适的子主题

正如你在写报告时必须找到合适的来源一样,你也需要寻找一个合适的地方来发布你的调查。找到一个适合的地方,在那里用户更有可能对它感兴趣。尽管你应该敏锐地意识到回答者潜在的自我选择偏见。还要考虑通过选择一个拥有大量用户的子区域来达到**。**

2.必要时张贴在其他子栏上

有时,在一个子编辑区发帖是不够的。当这种情况发生时,考虑发布多个帖子。尽管这样做时,在汇总数据之前,单独分析结果以查看答案之间是否有任何显著差异是很重要的。

3.突出你的调查的性质,并使用相关的语言

在邀请参与者时,尽可能明确您的调查主题,并使用易于理解且与您发布的子主题相关的语言。简洁,但也要注意 Reddit 允许相当长的文章标题。另外,你可以查看以前的帖子,看看他们过去使用过什么类型的语言。

4.通过在特定的时间和日期发布来优化

您可以通过根据子编辑在特定时间和日期发帖来优化回复率。Reddit 的用户群主要是美国人,所以东部标准时间上午 9 点是个不错的选择。对于非美国人或多面手,你可以使用第三方网站,如 Reddit 的Delay或 Reddit 的Late来找出帖子最受欢迎的时间,作为用户活动的代理。

5.请注意,人口统计数据可能会在一天中发生变化

与上述考虑相关的是,子街道的人口统计数据可能会在一天中发生变化。例如,北美和欧洲用户的比例将根据时间的不同而不同。然而,24 小时开放的帖子可能会缓解这个问题。

6.保持简洁明了

调查时间越长,流失率越高。长时间调查的黄金法则是 10-20 分钟。较短的调查通常需要 10 分钟或更短时间。另外,如果调查很短,请注明。尽管不要为了降低流失率而夸大完成时间。因为这可能会引起社区的强烈反对,而且在伦理上是不正确的。

7.不要在你的岗位上保持沉默

发布调查链接后,继续与社区互动。尝试在评论区回答任何问题,并开放讨论。这将增加你作为研究者的可信度,并可能提高参与率。此外,如果你做任何后续研究,它可能会增加保留率。

完整引用

Shatz,I. (2016)“快速、免费和有针对性:Reddit 作为在线招募参与者的来源”,社会科学计算机评论,35(4),第 537-549 页。T4:10.1177/0894439316650163。

A*:向 Dijkstra 添加启发式

原文:https://towardsdatascience.com/a-adding-heuristics-to-dijkstra-9e4ddbeada35?source=collection_archive---------21-----------------------

A*通过利用启发式算法来加速著名的 Dijkstra 算法。

介绍

假设我们有一个图 G 有两个以上的节点,从这个图中选择两个节点 ab 。在连接这两个节点的所有路径中, ab 之间的最短路径(SP)具有最小的总边权重。这种路径在许多情况下非常有用,例如在道路网络中查找最快的路径,其中边权重表示穿过道路所需的时间,或者在转运网络中查找将货物从其来源转运到其目的地所需的最小成本。

Dijkstra 算法

Dijkstra 的算法可以说是最受欢迎的 SP 算法,它可以在任何具有非负边的图中工作。这是一种贪婪算法,寻找到达所有节点的最短路径,直到它到达目标。它盲目地从源顶点开始,从发现的最近的节点开始探索图形,直到该迭代。

为了在每次迭代中找到最近的节点,Dijkstra 首先假设所有节点都无限远离源。然后,它更新源节点邻居的距离信息(标签),因为它发现了一条比无穷大更短的路径。它挑选最近的邻居作为新的探测节点,并根据从源到该节点的路径长度更新其邻居的标签。如果一个节点已经有了一个标签,那么它的标签只有在新标签更小时才会更新。注意,在每一次迭代中,我们保证从源到探索节点的 SP 被发现,因为所有的边都是非负的,因此我们将不能在将来发现更短的路径。由于这一事实,标签更新会继续,直到目标成为新的浏览节点,当它停止时,会找到 SP。

举例来说,假设司机想在最短时间内从安塔利亚开车到里泽。如果我们从土耳其的城市构建一个图,其中边权重表示道路的估计交叉时间,使用 Dijkstra 和 Antalya 作为源,Rize 作为目标,我们可以找到所需的路径。

下图显示了 Dijkstra 对上述图表的迭代。在第一次迭代中,我们用边权重标记安塔利亚的邻居,发现伊兹密尔是最近的城市。我们用绿色标记伊兹密尔,并继续探索图形。然后我们标记安卡拉、阿达纳和伊斯坦布尔,找到通往里泽的道路。请注意,即使我们在第三次迭代中找到了一条到 Rize 的路径,我们也不会停止,因为我们还没有标记 Rize。在第四次迭代中,我们找到一条更短的路径,在第五次迭代中,我们标记 Rize。在最后一个例子中,我们展示了具有粗边的 SP。

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

Iterations of Dijkstra on the Turkish cities graph.

尽管 Dijkstra 设法发现了 SP,但直觉不同意 Dijkstra 的迭代。如果一个人被要求完成同样的任务,他/她可能不会搜索通过伊兹密尔和伊斯坦布尔的路径,因为它们是西部城市,而里泽在土耳其的东部。然而,Dijkstra 盲目地检查边权重并忽略图结构,即使它是可用的。

尽管算法与人类直觉相反不会造成问题,但是增加迭代次数会造成问题!通过考虑伊兹密尔和伊斯坦布尔,Dijkstra 浪费了一些迭代,因为这些城市不包括在 SP 中。为了减少浪费的迭代次数,我们将使用 A*算法

A*算法

Dijkstra 的问题源于它缺乏人的直觉。在 A中,我们将使用启发式方法来克服这个问题。启发式算法是一种通知算法实现更有针对性的搜索的功能。在 A中,使用试探法来决定每一步要考虑哪个节点。与 Dijkstra 仅通过到源节点的总距离来选择节点不同,A*将相同的标准与启发式函数相结合。

为了得到上图的启发,考虑在上图中寻找 SP 的人。我们说他/她将省略伊兹密尔和伊斯坦布尔,因为它们是西方城市。通过启发式,我们也可以驱动算法这样做!为了反映人类的直觉,让我们将每个节点的启发式算法定义为欧几里德距离来 Rize

使用这种启发式算法,A*将考虑两个标准:到 Antalya 的路径距离和到 Rize 的欧几里得距离。在每一步中,它将选择这两者总和最小的节点。为了最小化第一个标准,它会选择一个靠近安塔利亚的节点,就像在 Dijkstra 一样。另一方面,为了最小化第二个标准,它将选择一个靠近 Rize 的节点。请注意,这在 Dijkstra 中根本没有考虑到。

在下图中,我们看到每个城市都与其启发式的欧几里德距离相关联。我们看到 A*在更少的迭代中找到 SP。不考虑安卡拉、伊兹密尔、伊斯坦布尔,直接通过阿达纳到达里泽。

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

Iterations of A* on the Turkish cities graph.

让我们考虑另一种情况。假设我们有一个机器人在一个房间的中间,它想要到达角落里的一个目标。我们可以将房间建模为网格结构中的图形,并找到 SP 以最小化机器人的行进时间。

如果我们使用 Dijkstra 来寻找 SP,它将循环考虑每个单元,而带有欧几里得启发式的 A*将直接使用对角线。下图显示了这种情况。请注意迭代次数之间的巨大差异!你也可以参考更多网格场景的链接视频。

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

Dijkstra vs A* in a grid [1].

结论

A算法是 Dijkstra 的一种有价值的替代方法,尤其是在可以定义合理的启发式算法时,应该考虑这种方法。从某种意义上来说,A是一种灵活的算法,也可以在节点选择期间增加启发式函数的权重,以更加注重启发式,反之亦然。然而,大多数时候定义一个合理的启发是非常困难的。

参考

[1]https://www.youtube.com/watch?v=cSxnOm5aceA

A/B 测试设计和执行

原文:https://towardsdatascience.com/a-b-testing-design-execution-6cf9e27c6559?source=collection_archive---------4-----------------------

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

使用 Python 实现数据驱动的增长

如何以编程方式进行 A/B 测试

这一系列文章旨在解释如何以一种简单的方式使用 Python,通过将预测方法应用于您的所有行动来推动您公司的发展。它将是编程、数据分析和机器学习的结合。

我将在以下九篇文章中讨论所有主题:

1- 了解你的衡量标准

2- 客户细分

3- 客户终身价值预测

4- 流失预测

5-预测下一个购买日

6-预测销售额

7-市场反应模型

8-隆起建模

9- A/B 测试设计和执行

文章有自己的代码片段,使您可以轻松地应用它们。如果你是编程的超级新手,你可以在这里很好地介绍一下 PythonPandas (一个我们将在任何事情上使用的著名库)。但是仍然没有编码介绍,您可以学习概念,如何使用您的数据并开始从中产生价值:

有时候你必须先跑,然后才能走——托尼·斯塔克

作为先决条件,确保你的电脑上安装了 J upyter Notebook 和 P ython 。代码片段只能在 Jupyter 笔记本上运行。

好吧,我们开始吧。

第 9 部分:A/B 测试设计和执行

作为一名(数据驱动的)增长黑客,主要职责之一是试验新的想法和维持持续的学习。实验是测试你的机器学习模型、新动作和改进现有动作的好方法。我们举个例子:

你有一个准确率高达 95%的客户流失模型。通过给可能流失的客户打电话,给他们一个有吸引力的报价,你假设他们中的 10%会留下来,每个人每月带来 20 美元。

假设太多了。分解一下:

  • 该模型的准确率为 95%。真的吗?您已经根据上个月的数据训练了您的模型。接下来的一个月,会有新用户,新产品功能,营销&品牌活动,季节性等等。在这种情况下,历史准确性和实际准确性很难匹配。不经过测试是无法得出结论的。
  • 通过查看之前活动的结果,您假设有 10%的转化率。并不能保证你的新动作会因为上述因素而有 10%的转化。此外,由于这是一个新的群体,他们的反应在一定程度上是不可预测的。
  • 最后,如果这些客户今天每月带来 20 美元,这并不意味着他们会在你采取新行动后带来同样的收入。

为了了解将会发生什么,我们需要进行 A/B 测试。在本文中,我们将关注如何以编程方式执行测试,并报告测试背后的统计数据。在开始编码之前,有两个要点需要你在设计和 A/B 测试时考虑。

1-你的假设是什么?

继续上面的例子,我们的假设是,测试组将有更多的保留:

A 组→报价→更高留存

B 组→无报价→低留成

这也有助于我们测试模型的准确性。如果 B 组的留存率是 50%,显然说明我们的模式不行了。这同样适用于衡量来自这些用户的收入。

2-你的成功标准是什么?

在这种情况下,我们将检查两组的保留率。

程序性 A/B 测试

对于这个编码示例,我们将使用 numpy 库创建我们自己的数据集,并评估 A/B 测试的结果。

让我们从导入必要的库开始:

现在,我们将创建自己的数据集。数据集将包含以下各列:

  • **客户标识:**客户的唯一标识
  • ****细分市场:客户的细分市场;高价值还是低价值
  • ****组:表示客户是在测试组还是对照组
  • purchase_count :客户完成购买的数量

前三个很简单:

df_hv = pd.DataFrame()
df_hv['customer_id'] = np.array([count for count in range(20000)])
df_hv['segment'] = np.array(['high-value' for _ in range(20000)])
df_hv['group'] = 'control'
df_hv.loc[df_hv.index<10000,'group'] = 'test'

理想情况下,采购数量应该是泊松分布。将会有没有购买的客户,而购买次数高的客户将会减少。让我们使用 numpy.random.poisson() 来完成这项工作,并为测试组和对照组分配不同的分布:

df_hv.loc[df_hv.group == 'test', 'purchase_count'] = np.random.poisson(0.6, 10000)
df_hv.loc[df_hv.group == 'control', 'purchase_count'] = np.random.poisson(0.5, 10000)

让我们来看看我们的数据集:

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

太棒了。我们有一切来评估我们的 A/B 测试。假设我们向 50%的高价值用户提供服务,并观察他们在给定时间内的购买行为。检查密度的最佳可视化方法是:

输出:

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

结果看起来很不错。测试组的购买密度从 1 开始比较好。但是我们怎么能肯定地说这个实验是成功的并且这种差异不是由于其他因素而发生的呢?

要回答这个问题,我们需要检查测试组的上升是否具有统计学意义。 scipy 库允许我们以编程方式检查这一点:

from scipy import stats 
test_result = stats.ttest_ind(test_results, control_results)
print(test_result)

输出:

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

ttest_ind() 方法返回两个输出:

  • ****t-统计:代表测试组和对照组的平均值之间的差异,单位为标准误差。更高的 t 统计值意味着更大的差异,支持我们的假设。
  • ****p 值:测量零假设为真的概率。

Ops,什么是零假设?****

如果零假设为真,这意味着测试组和对照组之间没有显著差异。所以 p 值越低意味着越好。作为行业标准,我们接受 p 值< 5% 使得结果具有统计显著性(但这取决于你的商业逻辑,也有人们用 10%甚至 1%的情况)。

为了了解我们的测试是否具有统计显著性,让我们构建一个函数并应用于我们的数据集:

def eval_test(test_results,control_results):
    test_result = stats.ttest_ind(test_results, control_results)
    if test_result[1] < 0.05:
        print('result is significant')
    else:
        print('result is not significant')

如果我们将此应用于数据集:

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

看起来很棒,但不幸的是,事情没那么简单。如果您选择一个有偏见的测试组,默认情况下,您的结果将具有统计学意义。举个例子,如果我们把更多的高价值顾客分配到测试组,把更多的低价值顾客分配到控制组,那么我们的实验从一开始就是失败的。这就是为什么选择小组是健康 A/B 测试的关键。

选择试验&对照组

选择测试和控制组最常见的方法是随机抽样**。让我们看看如何通过编程来实现它。我们将首先从创建数据集开始。在这个版本中,它将拥有 2 万个高价值客户和 8 万个低价值客户:**

#create hv segment
df_hv = pd.DataFrame()
df_hv['customer_id'] = np.array([count for count in range(20000)])
df_hv['segment'] = np.array(['high-value' for _ in range(20000)])
df_hv['prev_purchase_count'] = np.random.poisson(0.9, 20000)df_lv = pd.DataFrame()
df_lv['customer_id'] = np.array([count for count in range(20000,100000)])
df_lv['segment'] = np.array(['low-value' for _ in range(80000)])
df_lv['prev_purchase_count'] = np.random.poisson(0.3, 80000)df_customers = pd.concat([df_hv,df_lv],axis=0)

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

通过使用 pandas 的 sample() 函数,我们可以选择我们的测试组。假设我们有 90%的测试组和 10%的对照组:

df_test = df_customers.sample(frac=0.9)
df_control = df_customers[~df_customers.customer_id.isin(df_test.customer_id)]

在这个例子中,我们提取了整个组的 90%,并将其标记为测试。但是有一个小问题会毁了我们的实验。如果数据集中有明显不同的多个组(在本例中,高值&低值),最好分别进行随机采样。否则,我们不能保证试验组和对照组的高值和低值的比率是相同的。

为了确保正确创建测试和控制组,我们需要应用以下代码:

df_test_hv = df_customers[df_customers.segment == 'high-value'].sample(frac=0.9)
df_test_lv = df_customers[df_customers.segment == 'low-value'].sample(frac=0.9)df_test = pd.concat([df_test_hv,df_test_lv],axis=0)
df_control = df_customers[~df_customers.customer_id.isin(df_test.customer_id)]

这使得分配对两者都是正确的:

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

我们已经探讨了如何进行 t 检验以及选择测试组和对照组。但是如果我们像上面一样在多组上做 A/B/C 测试或者 A/B 测试呢?是时候引入方差分析测试了。

单因素方差分析

让我们假设我们在相同的组中测试 2 个以上的变体(例如,对低价值高价值客户的 2 个不同的报价和无报价)。然后我们需要应用单因素方差分析来评估我们的实验。让我们从创建数据集开始:

输出:

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

为了评估结果,我们将应用以下函数:

def one_anova_test(a_stats,b_stats,c_stats):
    test_result = stats.f_oneway(a_stats, b_stats, c_stats)
    if test_result[1] < 0.05:
        print('result is significant')
    else:
        print('result is not significant')

逻辑类似于 t_test。如果 p 值低于 5%,我们的测试变得有意义:

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

让我们看看如果两组之间没有差异,谁会是这个样子:

df_hv.loc[df_hv.group == 'A', 'purchase_count'] = np.random.poisson(0.5, 10000)
df_hv.loc[df_hv.group == 'B', 'purchase_count'] = np.random.poisson(0.5, 10000)
df_hv.loc[df_hv.group == 'C', 'purchase_count'] = np.random.poisson(0.5, 10000)a_stats = df_hv[df_hv.group=='A'].purchase_count
b_stats = df_hv[df_hv.group=='B'].purchase_count
c_stats = df_hv[df_hv.group=='C'].purchase_counthist_data = [a_stats, b_stats, c_stats]group_labels = ['A', 'B','C']# Create distplot with curve_type set to 'normal'
fig = ff.create_distplot(hist_data, group_labels, bin_size=.5,
                         curve_type='normal',show_rug=False)fig.layout = go.Layout(
        title='Test vs Control Stats',
        plot_bgcolor  = 'rgb(243,243,243)',
        paper_bgcolor  = 'rgb(243,243,243)',
    )# Plot!
pyoff.iplot(fig)

输出和测试结果:

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

如果我们想知道 A 和 B 或者 C 之间是否有区别,我们可以应用我上面解释的 t_test。

双向方差分析

假设我们正在对高价值和低价值客户进行相同的测试。在这种情况下,我们需要应用双向方差分析。我们将再次创建数据集,并构建我们的评估方法:

双向方差分析需要建立如下模型:

import statsmodels.formula.api as smf 
from statsmodels.stats.anova import anova_lm
model = smf.ols(formula='purchase_count ~ segment + group ', data=df_customers).fit()
aov_table = anova_lm(model, typ=2)

通过使用段** & 组,模型试图达到购买 _ 计数。上面的 aov_table 帮助我们了解我们的实验是否成功:**

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

最后一列代表结果,向我们展示了显著的差异。如果不是,它将如下所示:

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

由此可见,(高价值或低价值)显著影响采购数量,但不影响,因为它几乎是 66%,远高于 5%。

现在我们知道如何选择我们的小组并评估结果。但是还有一个缺失的部分。为了达到统计显著性,我们的样本量应该足够了。让我们看看如何计算它。

样本量计算

为了计算所需的样本量,首先我们需要理解两个概念:

  • 效应大小:代表试验组和对照组平均值之间的差异大小。它是测试组和对照组之间平均值的方差除以对照组的标准偏差。
  • ****功效:这是指在你的测试中找到一个统计意义的概率。为了计算样本大小,0.8 是常用的值。

让我们构建数据集,并在一个示例中查看样本大小的计算:

from statsmodels.stats import power
ss_analysis = power.TTestIndPower()#create hv segment
df_hv = pd.DataFrame()
df_hv['customer_id'] = np.array([count for count in range(20000)])
df_hv['segment'] = np.array(['high-value' for _ in range(20000)])
df_hv['prev_purchase_count'] = np.random.poisson(0.7, 20000)purchase_mean = df_hv.prev_purchase_count.mean()
purchase_std = df_hv.prev_purchase_count.std()

在本例中,购买的平均值(purchase_mean)为 0.7,标准差(purchase_std)为 0.84。

假设我们想在这个实验中将 purchase_mean 增加到 0.75。我们可以如下计算效果大小:

effect_size = (0.75 - purchase_mean)/purchase_std

之后,样本量的计算就相当简单了:

alpha = 0.05
power = 0.8
ratio = 1ss_result = ss_analysis.solve_power(effect_size=effect_size, power=power,alpha=alpha, ratio=ratio , nobs1=None) 
print(ss_result)

α是统计显著性的阈值(5%),我们的测试和控制样本大小的比率是 1(相等)。因此,我们需要的样本大小是(ss_result 的输出) 4868。

让我们构建一个函数,在任何我们想要的地方使用它:

def calculate_sample_size(c_data, column_name, target,ratio):
    value_mean = c_data[column_name].mean()
    value_std = c_data[column_name].std()

    value_target = value_mean * target

    effect_size = (value_target - value_mean)/value_std

    power = 0.8
    alpha = 0.05
    ss_result = ss_analysis.solve_power(effect_size=effect_size, power=power,alpha=alpha, ratio=ratio , nobs1=None) 
    print(int(ss_result))

对于这个函数,我们需要提供我们的数据集、表示值的 column_name(在我们的例子中是 purchase_count)、我们的目标平均值(在前面的例子中 0.75 是我们的目标)和比率。

在上面的数据集中,假设我们希望将购买计数平均值提高 5%,并且我们将保持两组的规模相同:

calculate_sample_size(df_hv, 'prev_purchase_count', 1.05,1)

那么结果就变成了 8961。

你可以在这里找到这篇文章的 Jupyter 笔记本。

这是数据驱动增长系列的结束。希望你喜欢这些文章,并开始应用这里的实践。这些将被转换成电子书,并由一个全面的视频系列支持。敬请期待!

黑客快乐!

需要帮助来发展你的公司吗?点击这里与我一起预订免费课程

A/B 测试是分析的三轮车

原文:https://towardsdatascience.com/a-b-testing-is-the-tricycle-of-analytics-497ec4563184?source=collection_archive---------23-----------------------

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

像 A/B 测试这样的基本方法是现代分析程序的起点,而不是终点

当一个蹒跚学步的孩子第一次踩上踏板开始移动时,他们脸上的喜悦足以成为他们喜欢三轮车的理由,但事实证明三轮车也有很多发展方面的好处。学习骑三轮车不仅有明显的好处,发展肌肉,平衡和深度知觉需要准备一个孩子骑自行车和驾驶。这也有助于他们建立自信,在某些情况下,这是他们第一次体验独立自主的感觉。所以我带着对三轮车极大的亲和力和敬意说:如果你的分析程序的支柱是 A/B 测试,你是在骑三轮车。

在仇恨邮件蜂拥而至之前,让我解释一下。在许多情况下,如临床试验,或其他情况下,测试组和控制组可以清晰地分阶段进行,并随着时间的推移进行跟踪,AB 测试在如何简单地向非技术利益相关者解释结果方面非常重要。然而,A/B 测试正越来越多地被吹捧,并在严重不足的领域使用。当涉及到促销、活动表现或定价决策时,A/B 测试方法过于简单,无法解释现代营销计划的复杂性,因为现代营销计划在任何给定时间都可能有数以千计的不同信息通过许多渠道传播。简单的结果可能很容易在高层领导会议上交流,但结果比更复杂的多元方法更有可能是错误的。

多元检验& A/B 检验有什么区别?

多元变量实际上只是同时考虑许多变量的一种花哨说法。有许多方法属于这一类,包括大多数机器学习方法。多变量方法不仅考虑不同的测试组,还考虑组内不同的元素以及可能影响结果的潜在外部因素。根据使用的方法,您还可以确定因果关系和概率关系,并开发预测来预测未来的结果。

A/B 测试考虑了两个不同组做了两件不同事情的结果——有点简单。(即:餐厅 A 组出售 1 美元的墨西哥玉米卷,而 B 组运行标准菜单)。选择两组以确保它们具有可比性,并确保测试结果在统计上是有效的,这可能很复杂,但目标很简单——A 或 B 表现得更好吗?无论你如何合理化它——A/B 测试根本不能告诉你任何关于为什么 A 或 B 占上风的事情。它有助于清晰简单地交流结果,但清晰简单并不一定意味着它是最准确的(见我关于 XAI 的文章)

只是为了把水搅浑,或者更有可能是为了卖软件,我看到过博客帖子说“多元 A/B 测试”。这真的是个东西吗?算是吧。多变量分析可以应用于任何大型数据集,因此在分析的前端,您可以采取措施为测试中的每个元素创建计划/结构化 A/B,在后端,您可以应用多变量分析。事实上,将结构化测试协议的计划变化引入多元测试计划是一个明智的做法。这实际上并没有使它成为一个 A/B 测试,但是你可以在你现有的软件中使用分割测试功能来帮助实现和跟踪你想要测试的变化。

多元测试是人工智能驱动营销自动化的门户

在现实世界中,我们处理的数据集越来越大,越来越复杂,但并不总是丰富的。我们有大量关于人、地点、时间、内容和频道的信息,这些信息经常淹没在数据湖 Baykal 的底部,但只有很少一部分被转化为有意义的信息。让多元测试发挥作用需要更高水平的致力于丰富数据,这是大多数公司不擅长的。例如,如果你正在为一个数字营销平台构建一个多元测试引擎,你需要独立地识别每个爆炸的每个属性。例如,品牌折扣活动可能会通过多种渠道进行,为不同的客户群提供不同的艺术、产品功能、折扣、口号和个性化信息。它们也可能在一天中的不同时间以不同的天气事件影响不同的地理区域。所有这些都需要作为每次爆炸的独立属性进行跟踪。所有这些数据已经存在于参与这些营销活动的大多数组织中,但是大多数组织没有正确地组织这些数据,并且许多软件平台没有被设计来标记和混合这些数据。虽然开始管理这些数据可能听起来令人生畏,但实际上这比管理持续 A/B 测试的持续后勤工作要容易得多,后者需要根据市场条件不断进行重新校准。顺便说一句,如果你或你的投资者想象你公司的未来是由人工智能驱动的营销——这恰好也是第一步。丰富、干净、定义明确的数据是自学习算法的原始汤。

如果您刚刚开始数据分析,并且测试规程对您的组织来说是新的,那么,无论如何,在您积累数据和分析敏锐度作为计划演进的一部分时,让团队舒适地骑着 AB 测试三轮车。另一方面,如果你像许多公司一样试图在大数据领域导航,并且发现自己数据丰富而见解贫乏,那么你可能已经准备好了一辆大型儿童自行车,甚至是一辆带马达的自行车,你应该小心那些试图向你出售更快、更炫三轮车的人。

时间序列分析基础指南

原文:https://towardsdatascience.com/a-basic-guide-into-time-series-analysis-2ad1979c7438?source=collection_archive---------7-----------------------

利用时间序列分析 2014 年至 2017 年英国的日常事故

介绍

线性回归是数据科学家非常常用的模型。一个结果或目标变量由一组特征来解释。有一种情况是,随着时间的推移收集相同的变量,我们使用了一系列定期测量该变量的方法。欢迎来到时间系列。与标准线性回归的一个区别是数据不一定是独立的,也不一定是同分布的。处理时间序列可能会令人沮丧,因为这意味着您必须找到任何先前值预测的滞后或误差与其本身之间的相关性。此外,顺序很重要,改变顺序会改变数据的含义。由于时间序列的复杂性,数据科学家在进行时间序列分析时有时会迷失方向。在这篇博客中,我将分享一个完整的时间序列分析,由一个著名的数据科学方法指导:OSEMIN。

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

使用的上下文和数据

上面的图片展示了我在研究中从收集数据到得出结论的方法。

本次分析使用的数据包含了从 2014 年 1 月 1 日到 2017 年 12 月 31 日,英国每天发生的 1461 起事故的日期和数量。我在这个练习中使用了来自 Kaggle 的数据集。我下载了一个 CSV 文件,并使用一个流行的 python 代码‘PD . read _ CSV’将其存储到一个数据帧中。在这个分析中没有考虑其他独立变量,因为我关注的是时间序列。

本研究的主要目的是解释完整数据科学项目的不同步骤。其他目标是找出一天中的事故数量是否取决于任何给定一天中的事故数量。

这项研究试图回答的 3 个问题是:

  1. 当天和前一天的事故数量之间有什么关系?
  2. 有没有什么模式可以帮助预测(或预防)英国某一天的事故数量?
  3. 一年中的哪一个月或一周中的哪一天与当月的事故数量有关吗?

处理数据

数据相对干净,随时可以使用。然而,出于分析目的,我必须做一些转换。

首先,我将包含日期的列更改为数据框的索引。在 Python 中处理时间序列数据时,务必确保日期被用作索引值,并被 Python 理解为真正的“日期”对象。

第二,检查任何丢失的数据是很重要的,因为它会极大地改变数据集。数据中未发现缺失值。

最后,为了执行相关的 EDA,我向我的数据中添加了三(3)列:一列分别用于月、日和工作日名称。这应该有助于我理解基于一年中的月份、一周中的日期的趋势。此外,我可以根据这些新功能对数据进行分组,以便更好地了解我的数据。

下面是我的数据经过处理和添加 3 列后的样子。

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

A sample of my data generated using: data_cleaned_df.sample(5, random_state=0)

探索我的数据

数据科学项目中最重要的步骤之一是 EDA。探索性数据分析( EDA )是一种分析数据集以总结其主要特征的方法,通常采用可视化方法。可以使用或不使用统计模型,但主要是为了查看数据在正式建模或假设检验任务之外能告诉我们什么。EDA 让我很好地理解了我的数据。

快速展示我的数据:

每天的事故数量从 2014 年的 400 起/天减少到 2017 年的 356 起。2017 年,每日事故达到 322 起的低点。与日均相比,标准偏差约为每天 17 起事故。(不到平均值的 5%)。

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

Descriptive statistics of the series provided by “df.describe”

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

将数据绘制成直线可以显示任何现有趋势,而散点图是发现任何异常值的好方法。我们可以观察到,任何一天发生超过 475 起事故或者少于 200 起事故都是相当不正常的。然而,对于我的分析,我没有删除任何这些数字。此外,当数据在区间内有异常值时,箱线图是另一个很好的图形。

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

另外一些有趣的评论:如下图所示,事故数量在 12 月份一直在下降。当开始 EDA 时,我预计这个数字会因年终聚会而上升。然而,这可能是由于人们旅行或呆在家里花更多的时间与家人和朋友在一起。周日人数减少符合第二个假设。

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

Daily accidents per year.

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

Daily accident per day of the week — don’t focus on the order of the days 😉

最后,用数据集构建直方图让我了解了数据的分布情况。很明显,事故的数量接近一个略微倾斜的正态分布。

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

模型

在任何建模之前,我需要检查时间序列是否是平稳的。如果一个时间序列的统计特性(如均值、方差)在一段时间内保持不变,则称该时间序列是平稳的。由于大多数时间序列模型都假设**时间序列是稳定的,**验证该假设非常重要。对于一般的时间序列数据集,如果它在一段时间内表现出特定的行为,那么它在未来很有可能会遵循类似的行为。因此,很难找到正确的模型或进行任何预测。我将用任何趋势情况下的滚动平均值和滚动标准差来绘制数据。另外,我会进行迪基·富勒测试。

迪基富勒测试是一个测试平稳性的统计测试。检验的零假设是时间序列不是平稳的。因此,如果检验统计量小于临界值,我们拒绝零假设,并说序列是平稳的。

在进行了 Dickey Fuller 测试后,在 95%的置信水平下,我们拒绝了零假设。如下图所示,该系列是稳定的。

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

The data looks stationary. Also the Dickey Fuller test returns a p-value <0.05

在确认了序列的平稳性之后,我可以继续研究这个模型。我确保将我的数据分成训练集和测试集。测试集不用于建模过程,而是用于评估所选模型对未知数据的性能。

为了选择相关的时间序列模型,我构建了 ACF 和 PACF 来分别确定 ARIMA 的 q 值和 p 值。

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

经过不同的迭代,我选择了一个 ARMA (2,3)来表示数据。对于每一步,每当我得到没有意义的系数时,我不得不转移到另一个模型。

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

Based on this result, the number of accident would be explained by the number during two days prior and a moving average part (lag 3)

虽然这个模型的残差接近正态分布,但是 ARMA 发现在预测未知数据时失败了。记得我把我的数据分开并保留了一个测试集。通过将测试传递给模型,预测是可怕的。减少测试数据中的观察数量并没有提高预测的质量。我的结论是 ARMA 并不是代表数据的最佳方法。逻辑对吗?其他因素也会影响一天中的事故数量,如车辆类型、地区、司机年龄等。

结论和考虑

尽管我们没有得到一个“完美的模型”——无论如何对数据科学家来说都不是理想的——但一些问题通过 EDA 得到了回答。我们看到了一周中的日子与事故数量之间的关系,以及一年中的月份如何影响这些数字。这就是为什么在一个数据科学项目中,这一步不能被忽略。

在对我们的数据建模时,我们发现一天的事故值与前一天的事故数之间存在相关性。当然,如果你整合一些外生变量,我们的模型会表现得更好。那些应该使用领域知识和彻底的文献回顾来发现。ARIMAX 或 SARIMAX 更适合我们的活动。在这个过程中不断后退一两步可能会令人沮丧,但我确实相信这是数据科学的魅力之一,因为每一步都会带来更多的答案和更多的数字叙述。

任何想法,请给我留言,我们可以讨论。

我的代码、模型和使用的数据都在我的 GitHub 上。请使用下面的链接:

[## FabriceMesidor/time series _ accident _ UK

一个简单的时间序列回归,以了解不同的步骤建模线性回归是一个非常常见的模型…

github.com](https://github.com/FabriceMesidor/TimeSeries_accident_UK)

一种贝叶斯方法,用于估计内容和工作日对脸书页面上发布的帖子的影响

原文:https://towardsdatascience.com/a-bayesian-approach-to-estimate-the-effect-of-a-content-and-a-weekday-on-the-post-published-on-a-7d31873d3c08?source=collection_archive---------27-----------------------

  • 我假设读者有贝叶斯统计的知识
  • 这里的样本代码是这里的

如今,社交媒体已经成为一个互动平台,客户可以在这里交流想法并留下对产品的评论。根据市场统计数据,18-34 岁的成年人最有可能使用社交媒体关注他们最喜爱的品牌(95%) 。因此,这些成年人成为潜在客户和行业巨头的良好目标。几乎每个受欢迎的品牌都“理所当然”地使用这个工具,因为它:

对该品牌关于产品的新帖子印象深刻,该页面的追随者往往会通过“喜欢”来与该帖子“互动”,留下评论并与他们的联系人分享该帖子。交互的总数可以作为后影响的良好指标。可能会有巨大的影响,也可能完全没有影响。此外,影响的程度可能取决于其他因素,如帖子发布的工作日、其内容等。我们的目标是帮助企业主对脸书广告做出更明智的决策,方法是确定某个内容或某个工作日对该帖子的总互动次数是否有影响。为此,我们开发了分层条件自回归(CAR)模型,该模型考虑了时间相关性

我们使用的数据集与某知名化妆品品牌 2014 年在脸书的页面上发布的帖子相关。

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

在分析中,我们选择“总互动”作为主要响应变量,定义如下:

(1)	Total interactions = (# of likes + # of comments + # of shares)

为了模拟后期影响,我们选择了分类变量“类型”和“后期工作日”。在这里,“类型”将文章分为链接、照片、状态和视频。所有这些指标在发布之前都是已知的。“Post weekday”表示帖子是在一周的哪一天发布的。

首先,描述性分析显示,平均而言,脸书用户与视频帖子互动最多,而链接被点击最少。如直方图所示,“总相互作用”的分布高度向右倾斜。

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

由于模型期望正态分布的数据,我们对响应变量进行了对数转换(通过添加一个小常数)以获得正态分布的数据。

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

对于对数转换的“总相互作用”的未来参考,使用以下:

(2)	y = log(Total Interactions)

帖子的影响力可以通过帖子发布当天的总互动次数、内容和星期几来衡量。因为变量“工作日”是邻域相关的,所以假设它对 y 具有空间随机影响。假设另一个分类变量“类型”对 y 有固定的影响。因此,我们在最终模型中加入汽车模型和线性趋势项。对于所有“类型”和“工作日”的组合,我们将计算一个给定组合的边际均值是否高于其他组合的后验概率:

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

对于 j = {1,2,…,n}/{i},其中 n =“类型”和“工作日”组合的数量。此外,固定和随机效应参数的后验分布将帮助我们回答问题陈述问题。

模型

对于感兴趣的模型,让 y_ i 为第 i 个帖子的值。设 i ,范围从 1 到 500,是某一天发表的具有特定内容的帖子。我们假设 y_ i 是独立分布的。然后,对于给定的帖子, i = {1,2,3,…}:

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

其中平均值定义为:

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

其中天数的影响定义为:

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

此外,您可以看到我们如何在模型之前定义:

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

我们来分析一下。首先,作为标准差的扩散先验, 𝜎 ,我们选择了半柯西先验与正支持。第二,我们在所有固定效果参数𝛽=【𝛽1,𝛽2,𝛽3,𝛽4].】上选择了一致的先验 𝛽 的统一先验充分覆盖了线性趋势项的可能值,包括负趋势和正趋势。最后,假设汽车模型的参数 𝜌 具有均匀分布,受以下特征值的约束

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

我们使用 **Stan 和 R package“rstan”*从参数的后验分布中生成样本。采用了 4 链 MCMC,总共进行了 10000 次迭代和 5000 次老化迭代(我们将在下一篇文章中讨论 MCMC)*。我们最终为 𝜌𝛽𝛿𝜎 参数生成了 20000 个 MCMC 样本。下面给出了分裂链上潜在规模缩减系数。请注意,所有参数的 Rhat = 1,意味着 MCMC 正常收敛。

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

结果

在上表中,您还可以看到每个参数的后验中位数和 95%可信区间。此外,下面你可以找到 𝛽𝛿𝜌𝜎 参数的后验分布。

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

利用 𝛽𝛿 参数的所得后验概率,以及 𝜇_𝑖 的方程,我们计算了 𝜇_𝑖 的后验概率。之后,我们确定了每个 𝜇_𝑖 的边缘后中值和 95%可信区间。

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

我们的目标是确定帖子的内容或发布日期对帖子收集的总交互次数是否有影响。为了回答提出的问题,我们找到了后验概率,即对于给定的type + weekday,其边际均值是否高于其他均值(见上表)。video + thursday组合的后边缘均值最高,为 0.9529。这意味着如果一个帖子是周四发布的视频,那么它的影响力会更大。𝛿_𝑇ℎ𝑢的后验值比其他日子的值大,而 𝛿_𝑆𝑢𝑛 的后验值小。𝛿的可信区间很紧,在零附近,周四之后略微向左移动。

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

下图显示,平均而言,视频的总互动次数更高。状态和照片帖子收集几乎相似的互动。正如所料,链接帖子的总交互次数最少。

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

这种分析可以通过在模型中包括“类型”和“工作日”交互来进一步扩展。

最初发布于kgulzina . github . io

寻找上帝的贝叶斯探索

原文:https://towardsdatascience.com/a-bayesian-quest-to-find-god-b30934972473?source=collection_archive---------5-----------------------

贝叶斯定理和所有问题中最基本问题的概率答案:“上帝存在吗?”

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

The Creation of Adam (Creazione di Adamo) —Michelangelo. Source: Wikipedia

本文关注的不是公式和数字,而是一个有趣的故事,在这个故事中,贝叶斯定理在哲学、认识论和宗教中最具争议的讨论中确立了自己的地位。

我们数据科学家和统计学家喜欢贝叶斯定理。

一个看似简单的想法:我们通过用新获得的信息更新我们的初始信念来获得更新和改进的信念,贝叶斯定理被吹捧为产生知识的最有力的方法之一。

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

Sheldon explaining how he is estimating his life expectancy, using Bayes’s theorem. Source: Scientific America

艾伦·图灵用贝叶斯破解了英格玛——德国海军的秘密代码。我们使用贝叶斯程序将垃圾邮件扔进垃圾箱(“朴素贝叶斯,有人知道吗?”),评估我们的医疗记录,发现基因是如何控制和调节的,协助海岸警卫队和国土安全等。[1]它太受欢迎了,甚至在大爆炸定理上客串了一把。

有了如此丰富的实际应用,毫不奇怪,哲学家和神学家发现贝叶斯定理是一个新的框架,为一个古老而又不断引发争议的问题建立了新的理论基础:

我们能根据我们周围世界的证据对上帝做出理性的结论吗?

1。贝叶斯定理——概述:

贝叶斯定理非常简单。它与条件概率有关,也就是说,某个理论或假设对某个已经发生的事件为真的概率。

这个想法体现在一个著名的等式中:

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

我不想浪费你的时间在这些方程式上。事实上,我已经写了大量关于贝叶斯定理以及如何用贝叶斯方法进行推理的文章。您可以在以下网址查看:

我接下来想做的是给出一个激励人心的例子来展示这个优雅公式的巨大预测洞察力。

亚当(可能)是第一个使用贝叶斯定理的人

想象一下,有人来到我们美丽的世界(亚当或者他来自柏拉图的洞穴),第一次看到太阳升起。起初,他会认为这种现象是一种反常现象。然而,每一天他幸存下来并观察美丽的日出,他的信心增加,这是大自然的永久特征。这种推理的心理过程——通常被称为归纳——是如何发生的?

有两个令人感兴趣的事件:

  • 太阳每天升起(X)
  • 今天太阳升起了

亚当关心的是太阳每天升起的条件概率,给定今天太阳升起的观测值 P(X|Y)。现在,让我们指定一些数字来说明计算:

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

How Adam arrived at the conditional probability after the first sunrise

比方说,在第一次看到日出之前,亚当不相信,他认为太阳每天都升起***【X】***的概率只有 1%。当他看到日出时,他没有被说服,所以他分配了一个合理的机会,即今天的日出纯粹是巧合(即, P(Y|NX) = 1/7 ,因为一周有 7 天,但它实际上可能是 1/30、1/365 或 1/10 ⁰).如果亚当知道并使用贝叶斯定理来计算这些数字,他分配给初始假设的概率会从 1%增加到 6.6%。

贝叶斯定理的巧妙之处在于,随着更多证据的出现,我们可以多次更新我们的概率估计。当亚当每天醒来,惊叹于壮丽的日出时,他不断更新他的先验知识,重新运行贝叶斯公式,并得到他的假设的条件概率的更新估计:

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

How Adam arrived at the conditional probability after the second sunrise

在观察第二次日出时,亚当变得更加确信他的假设,将他的条件概率从 6.6%增加到 33.1%。这一过程一次又一次地重复,尽管从数学上讲永远不会达到 100%,但后来从字面上讲,太阳只是偶然升起也是不可能的。

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

Left: the posterior conditional probability of the statement “The sun rises everyday” as Adam updates his belief daily. Right: Comparison between two different initial priors (1% vs 0.01%)

用一些简单的 R 代码,我重复了上面的计算,并说明了亚当如何更新他的信念。你可以在这里找到源代码。他只需要短短 4 天就能在每天出现的日出中确信超过 99%。即使亚当更加怀疑(因为他应该反对蛇或撒旦 T.T ),并指定最初的信念只有 0.01%,仍然只需要 7 天就可以说服他。

2.贝叶斯定理和奇迹之神;

在这一节中,我将简化讨论(也就是彻头彻尾的欺骗):我们将专注于一个狭窄但同样有趣的话题,而不是检查上帝存在的概率性论点: 我们能相信奇迹吗?

我决定这样做有三个原因:

  • 奇迹的合理性,通常被定义为“违反自然法则”,一直是哲学争论的热门话题。
  • 从神学和哲学上来说,已经有很多关于奇迹的存在和神本身之间的直接联系的争论,所以我们离那不远了。
  • 一旦你明白了这个原理,就相对容易地重复同样的关于上帝存在的论点。

根据人们的证词,我们能相信奇迹的存在吗?

对于著名的苏格兰哲学家大卫·休谟来说,答案是响亮的“不”:

没有证词足以建立一个奇迹,除非证词是这样一种,它的谎言会比事实更神奇,它努力建立[2]

这很令人困惑。我们可以尝试用许多方法来解读它,但最有趣(也是最流行)的解释之一是贝叶斯理论。

让我们建立一些事件的定义:一个特殊的奇迹发生(M)和这样的奇迹见证记录(T)。我们可以使用相同的贝叶斯框架来构建给定一些证据的情况下,奇迹 真的 发生的条件概率。

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

为了阅读休谟,我们需要作出简化的近似,即 P(T|M)≈ P(∼M) ,因为两项都接近 1。这将允许我们简单地表述为:

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

稍加代数学,我们很容易看出 P(M|T) > 0.5 当且仅当P(M)>P(T | ~ M)。这正是休谟所说的*“虚假[【P(T | ~ M)]比它试图建立的事实[【P(M)]更不可思议[小于]。”*

这是基于休谟回应耶稣复活的证词的论点:

当任何人告诉我,他看到一个死人恢复了生命,我立即考虑自己,是否更有可能,这个人应该欺骗或被欺骗,或者他所涉及的事实,应该真的发生了。我权衡一个奇迹和另一个;根据我发现的优势,我宣布我的决定,总是拒绝更大的奇迹。[2]

他持怀疑态度的依据是复活的概率P(M =复活) 明显小于假见证的概率 P(见证|不复活) ,这就使得 P(复活|见证)< 0.5 。更一般地说,几乎不可能找到***【P(M)>【P(T | ~ M)】***的案例,所以我们永远无法可靠地将一个见证与一个原因——一个实际的奇迹——联系起来。

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

Left: David Hume. Right: Thomas Bayes — although many argues that it is not his portrait. Source: Wikipedia

我希望你能看到休谟论点的令人不安的本质。休谟认为,仅仅基于传统信仰、共存或证词,我们永远无法确定任何事情。在几篇震惊 1700 年欧洲知识界的文章中,休谟将这一观点发展得更远,他抨击了关于上帝存在的最古老的论点之一,即目的论论点。也就是说,一个智慧的创造者被自然界中被感知的故意设计所证明,上帝是万物的第一因。通过证明我们的归纳很少是可靠的,并彻底批判因果概念,休谟破坏了基督教信仰的核心原则。

3.休谟遗漏了什么:

这种解释的问题是,它没有认识到当我们听到奇迹的见证时,人类考虑的许多其他因素:

  • 有多少独立的证词?根据约翰福音,至少有三个关于空坟墓的见证(抹大拉的马利亚、西门彼得和“耶稣所爱的另一个门徒”)
  • 更大的问题是:我们需要多少不同的奇迹,才能确立上帝存在的条件概率?

让我们考虑多个独立证词的情况。考虑这个问题的一个好方法是对每个新来的人使用贝叶斯更新并作证。因此,我们得出了一个与上一部分中的日出示例非常相似的结果——其中条件概率收敛到 1。

在这里,让我们以稍微不同的方式处理这个问题,并尝试利用独立性假设来简化数学。假设对于一个特定的奇迹 M,一个人 i 将给出一个证词TI*,*我们为这个奇迹给出了 n 个证词建立了条件概率:

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

现在,假设这些证词是独立的(这是一个巨大的假设,我们知道在约翰的故事中这不是真的),并且有可能是真实的 pP(T|M) = p 以及有可能是假的 qP(T|~M) = q ,我们可以将这些术语简化如下:

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

这允许我们将条件概率简化为:

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

通常,我们会假设 q < p (即,当人们看到奇迹时,他们更有可能作证,而不是当他们没有看到奇迹时假装作证),这意味着当 n — > 0,(q/p)^n — > 0 时,条件概率接近 1。

另一个很酷的事实是,即使***【P(M)***可以很小,你总能找到 n 使得条件概率 > 0.5

关键是,无论你使用贝叶斯更新还是利用独立性假设,休谟的(已经有问题的)论点,即没有一个单独的证词是可靠的,并不排除合并证词是如此。

到目前为止,我所介绍的是用于对神学问题进行概率论证的基本结构。事实上,理查·斯温伯恩确实输入了一个数字,得出了一个令人欢呼的 97%的复活概率。我们可以很容易地把这个框架扩展到包括上帝的存在。例如,其中“ G ”代表“上帝存在”(其中“上帝”被经典地认为是创造了宇宙的最大力量、知识和善良的永恒存在),我们可以假设p(m|g)≫p(m |∞g)p(m |∞g)= 0p(m |∞g)

这种概率论证的问题是,即使数学完全说服了你,根据假设和设置,你也可以得出完全相反的结论。

然而,这篇文章旨在欣赏贝叶斯系统是如何错综复杂的美丽。怀疑论者大卫·休谟认为,从过去的经验中得出任何因果推论都是徒劳的,因为我们需要将过去外推至未来,而这是我们无法确定的。另一方面,贝叶斯——他认为理性在本质上是概率性的——会告诉休谟,如果一个人太温顺而不能理解自然,就不要责备自然;如果你走出怀疑的外壳,大胆地对它的行为做一些预测,也许你会离真相更近一点。

你可以在这里找到示例的源代码。

[1]麦克格雷因,莎伦·伯奇。不会消亡的理论:贝氏法则如何破解英格玛密码,追捕俄罗斯潜艇,并从两个世纪的争议中脱颖而出。耶鲁大学出版社,2011 年

[2]休谟,一个关于人类理解的询问 X,I,86

[3]史文朋,理查德,上帝化身的复活,牛津大学出版社,2003

Apache Spark 初学者指南

原文:https://towardsdatascience.com/a-beginners-guide-to-apache-spark-ff301cb4cd92?source=collection_archive---------4-----------------------

Apache Spark 与 Hadoop MapReduce——优势、劣势以及何时使用

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

什么是阿帕奇火花?

由 Spark 的创造者创建的公司 Databricks 在他们的Apache Spark 电子书 ( 强烈推荐阅读本文末尾提供的 PDF 下载链接)中最好地总结了它的功能:

“Apache Spark 是一个统一的计算引擎和一组用于在计算机集群上进行并行数据处理的库。截至本文撰写之时,Spark 是针对该任务开发的最活跃的开源引擎;让它成为任何对大数据感兴趣的开发人员或数据科学家的事实上的工具。Spark 支持多种广泛使用的编程语言(Python、Java、Scala 和 R),包括用于各种任务的库,从 SQL 到流和机器学习,并且可以在任何地方运行,从笔记本电脑到数千个服务器的集群。这使得该系统易于启动,并可扩展至难以置信的大规模大数据处理。”

什么是大数据?

让我们看看 Gartner 广泛使用的大数据定义,这样我们就可以理解 Spark 如何选择解决与大规模实时处理大数据相关的诸多挑战:

“大数据是高容量、高速度和/或高多样性的信息资产,需要经济高效、创新的信息处理形式来增强洞察力、决策制定和流程自动化。”

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

The Complex World of Big Data

**注意:**这里的关键要点是,大数据中的“大”不仅仅是指容量。你不仅会得到大量数据,而且这些数据还会以复杂的格式从各种来源实时、快速地向你袭来。因此,大数据有三个 v-容量、速度和多样性。

为什么大多数大数据分析公司在听说 spark 的所有有用功能时都会“眼前一亮”?

根据我的初步研究,似乎有三个主要因素使 Apache Spark 成为大规模高效处理大数据的领导者,这促使许多处理大量非结构化数据的大公司在其堆栈中采用 Apache Spark。

  1. Spark 是处理大数据的统一一站式商店—“Spark 旨在支持广泛的数据分析任务,从简单的数据加载和 SQL 查询到机器学习和流计算,通过相同的计算引擎和一致的 API 集。这一目标背后的主要观点是,现实世界的数据分析任务——无论是 Jupyter 笔记本等工具中的交互式分析,还是生产应用程序的传统软件开发——往往会结合许多不同的处理类型和库。Spark 的统一性质使得这些任务编写起来更加容易和高效”( Databricks 电子书)。例如,如果您使用 SQL 查询加载数据,然后使用 Spark 的 ML 库对机器学习模型进行评估,引擎可以将这些步骤合并为对数据的一次扫描。此外,数据科学家 在建模时可以从一组统一的库(例如 Python 或 R)中受益,而 Web 开发人员可以从 Node.js 或 Django 等统一框架中受益
  2. Spark 优化了其核心引擎的计算效率——“我们的意思是 Spark 只处理从存储系统加载数据并在其上执行计算,而不是永久存储本身。Spark 可以用于各种各样的持久存储系统,包括云存储系统,如 Azure Storage 和亚马逊 S3,分布式文件系统,如 Apache Hadoop,键值存储,如 Apache Cassandra,以及消息总线,如 Apache Kafka。然而,Spark 本身既不长期存储数据,也不支持其中任何一种。这里的主要动机是大多数数据已经驻留在混合存储系统中。移动数据的成本很高,因此 Spark 专注于对数据进行计算,无论数据位于何处”( Databricks 电子书)。Spark 对计算的专注使其不同于早期的大数据软件平台,如 Apache Hadoop。Hadoop 包括一个存储系统(Hadoop 文件系统,设计用于 Spark 4 商用服务器集群上的低成本存储)和一个计算系统(MapReduce),它们紧密集成在一起。然而,这种选择使得很难在没有其他系统的情况下运行一个系统,或者更重要的是,很难编写访问存储在其他地方的数据的应用程序。虽然 Spark 在 Hadoop 存储上运行良好,但它现在也广泛用于 Hadoop 架构没有意义的环境,如公共云(存储可以与计算分开购买)或流媒体应用。
  3. Spark 的库为它提供了非常广泛的功能 —如今,Spark 的标准库是开源项目的主体。自首次发布以来,Spark core 引擎本身几乎没有什么变化,但这些库已经发展到提供越来越多类型的功能,将其转变为多功能数据分析工具。Spark 包括 SQL 和结构化数据(Spark SQL)、机器学习(MLlib)、流处理(Spark 流和较新的结构化流)和图形分析(GraphX)的库。除了这些库,还有数百个开源外部库,从各种存储系统的连接器到机器学习算法。

Apache Spark vs . Hadoop MapReduce…应该用哪个?

简短的回答是——这取决于您的业务的特定需求,但根据我的研究,似乎 10 次中有 7 次答案是——火花。 对庞大数据集的线性处理 是 Hadoop MapReduce 的优势,而 Spark 则提供了 快速性能迭代处理、 实时分析、图形处理、机器学习等更多

好消息是,Spark 与 Hadoop 生态系统完全兼容,并且可以与 Hadoop 分布式文件系统(HDFS) 、Apache Hive 等顺利协作。因此,当数据太大,Spark 无法在内存中处理时,Hadoop 可以通过其 HDFS 功能帮助克服这一障碍。下面是 Spark 和 Hadoop 如何协同工作的可视化示例:

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

https://www.quora.com/What-is-the-difference-between-Hadoop-and-Spark

上图演示了 Spark 如何通过 HDFS 读取和存储数据、 MapReduce 进行可选处理、 YARN 进行资源分配,从而利用 Hadoop 的最佳部分。

接下来,我将通过在两个之间进行一个简短的面对面的比较**,来尝试突出 Spark 相对于 Hadoop MapReduce 的诸多优势。**

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

Source: https://data-flair.training/blogs/spark-vs-hadoop-mapreduce/

速度

  • Apache Spark — 它是一个快如闪电的集群计算工具。与 Hadoop 相比,Spark 通过减少对磁盘的读写周期数并在内存中存储中间数据,在内存和磁盘上运行应用的速度分别提高了 100 倍和 10 倍。
  • Hadoop MapReduce—MapReduce从磁盘读写,减缓了 的处理速度和整体效率。

易用性

  • Apache Spark—Spark 的许多库通过 (弹性分布式数据集) 方便了许多主要高级操作符的执行。
  • Hadoop —在 MapReduce 中,开发人员需要手工编码每一个操作,这使得它更难以用于大规模的复杂项目。

处理大量数据

  • Apache Spark—由于 Spark 通过将大部分数据存储在内存中而不是磁盘上来优化速度和计算效率,当数据变得如此之大以至于 RAM 不足成为一个问题时,它的性能可能不如 Hadoop MapReduce
  • Hadoop—Hadoop MapReduce 允许并行处理海量数据。它将一个大数据块分成几个小数据块,在不同的数据节点上分别处理。如果结果数据集大于可用 RAM,Hadoop MapReduce 可能会优于 Spark。如果处理速度不重要 并且任务可以通宵运行以便在第二天早上生成结果,这是一个很好的解决方案。

功能

阿帕奇 Spark 是这一类无可争议的赢家。以下是 Spark 优于 Hadoop 的许多大数据分析任务列表:

  • **迭代处理。**如果任务是反复处理数据——Spark 打败 Hadoop MapReduce。Spark 的弹性分布式数据集(rdd)支持内存中的多个地图操作,而 Hadoop MapReduce 必须将临时结果写入磁盘。
  • **接近实时处理。**如果企业需要即时洞察,那么他们应该选择 Spark 及其内存处理。
  • 图形处理。 Spark 的计算模型适用于图形处理中常见的迭代计算。Apache Spark 有 GraphX——一个用于图形计算的 API。
  • 机器学习。Spark 有 ml lib——内置的机器学习库,而 Hadoop 需要第三方提供。MLlib 有现成的算法,也可以在内存中运行。
  • **连接数据集。**由于其速度,Spark 可以更快地创建所有组合,尽管如果需要加入需要大量洗牌和排序的非常大的数据集,Hadoop 可能会更好。

Spark 的众多功能及其与其他大数据引擎和编程语言的兼容性的直观总结如下:

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

source: https://www.quora.com/Is-Spark-a-component-of-the-Hadoop-ecosystem

  1. Spark Core — Spark Core 是大规模并行和分布式数据处理的基础引擎。此外,构建在核心之上的附加库允许流、SQL 和机器学习的不同工作负载。它负责内存管理和故障恢复,调度、分发和监控与存储系统交互的集群上的作业。
  2. 集群管理 —集群管理器用于获取执行作业的集群资源。Spark core 运行在不同的集群管理器上,包括 Hadoop YARN、Apache Mesos、Amazon EC2 和 Spark 的内置集群管理器。集群管理器处理 Spark 应用程序之间的资源共享。另一方面,Spark 可以访问 HDFS、Cassandra、HBase、Hive、Alluxio 和任何 Hadoop 数据源中的数据
  3. Spark Streaming—Spark Streaming 是 Spark 的组件,用于处理实时流数据。
  4. Spark SQL : Spark SQL 是 Spark 中的一个新模块,它将关系处理与 Spark 的函数式编程 API 集成在一起。它支持通过 SQL 或 Hive 查询语言查询数据。Spark SQL 的数据帧和数据集 API 为结构化数据提供了更高层次的抽象。
  5. GraphX 是用于图形和图形并行计算的 Spark API。因此,它用弹性分布式属性图扩展了火花 RDD。
  6. MLlib (机器学习):MLlib 代表机器学习库。Spark MLlib 用于在 Apache Spark 中执行机器学习。

结论

随着大数据的大规模爆炸和计算能力的指数级增长,Apache Spark 和其他大数据分析引擎等工具将很快成为数据科学家不可或缺的工具,并将迅速成为实时执行大数据分析和解决大规模复杂业务问题的行业标准。对于那些有兴趣深入研究所有这些功能背后的技术的人,请点击下面的链接并下载 Databricks 的电子书—“Apache Spark 的一个温和介绍”、“Apache Spark 的一个温和介绍”或“Apache Spark 的大数据分析”,下面是“T21”。

[## Apache Spark 简介

编辑描述

pages.databricks.com](https://pages.databricks.com/gentle-intro-spark.html?utm_source=databricks&utm_medium=homev2tiletest&_ga=2.185801641.1051240058.1550856188-1502813917.1547430685) [## Apache Spark 上的大数据分析

Apache Spark 凭借其先进的内存编程模型成为大数据分析的事实框架…

link.springer.com](https://link.springer.com/article/10.1007/s41060-016-0027-9)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值