TowardsDataScience-博客中文翻译-2016-2018-十一-

TowardsDataScience 博客中文翻译 2016~2018(十一)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

数据科学职业生存指南

原文:https://towardsdatascience.com/data-science-career-survival-guide-a51e96b31498?source=collection_archive---------3-----------------------

我最近读了一些关于数据科学中的问题和角色的文章,主要是组织没有真正做好数据的例子,以及这如何影响崭露头角的或有经验的数据科学家。

阅读这些文章引起了我的共鸣。我认识到所有的问题,我不认为我是一个人。下面,在一点介绍之后,是在工作生活中导航的方法,尝试和探索当生活不完美时我们能得到什么好处,成为一个更好、更全面的数据科学家。

背景

我认为最好的写作包括:

您应该如何构建您的数据科学和工程团队? by @math_rachel 谈团队结构问题

如何不雇佣你的第一个数据科学家 by @mrogati

避免成为 @Springcoil 的数据科学家

以及这个由 @treycausey 发布的 twitter 帖子,这感觉就像是一个可怕的熟悉的数据科学灾难列表。

常见的主题是,许多数据科学工作并不像他们宣传的那样。好吧,生活不总是达到预期并不是最令人震惊的故事——这些说明了围绕数据科学的工作很难这一事实所带来的悲哀。

感觉就像全世界都在对组织大喊,“要么使用你的数据,要么去死”,但是弄清楚如何交付却远非易事。理解数据科学家和工程师应该做什么,如何让团队适应业务,以及哪些项目将积极地触及底线,需要一套非常特殊的技能和经验,因此文章阐述了日常挫折。

我不想重复上面文章中的常见问题,而是想为构建您的数据科学体验提供一些建设性的建议。当这些情况出现时,就有机会了。我相信,如果你知道如何从一种情况中获得良好的经验,你就可以继续走在幸福的道路上,在你的职业生涯中前进。

这里有一个潜在的假设:你正在接近数据科学,目标是用数据解决问题。没有某种数据科学定义的数据科学文章是不完整的。作为一名数据科学家意味着身兼数职,解决许多组织的问题意味着灵活。我相信数据科学家是定义和衡量 Kaggle 竞赛的人,而不总是获胜的 ML 研究员。一个负责收集和理解相关数据及其与业务问题的相关性。

将数据转化为有效的数据产品,不仅仅是掌握最新的人工智能或深度学习方法论的问题。这在实验室可能行得通,但在成千上万销售真实产品并存在日常数据问题的公司中却行不通。同样,如果成为一名数据科学家仅仅是数字技能的话,上面的文章都不需要写。

如果你的职业目标是解决一般的人工智能,并且你在脸书和 DeepMind 有 5 年的经验,那么不,我不能保证下面的内容会有一点点帮助。

如果你的目标是有所作为,用数据解决问题,这是让你成为一名真正有吸引力的雇员的那种东西,你正在阅读,让我们使用上面雷切尔·托马斯的文章,并思考“妈的,这就是我!”(我做了,因此这篇文章)那么请充分利用这个机会。

这些问题

A terrible business intelligence metaphor but I miss my Subaru.

数据科学团队面试一位具有令人印象深刻的数学建模和工程技能的候选人。一旦被录用,候选人将被安插在一个需要简单业务分析的垂直产品团队中。数据科学家很无聊,没有利用他们的技能。

这就是“我们需要一个商业智能平台”的情况。管理层可能不知道这一点,否则他们不会聘请数据科学家。您可能正在编写大量的 SQL,甚至可能认为 Excel 真的是这方面的合适工具…

所以,是的,解决 BI 问题。要查看的工具是 LookerModeGoogle Data Studio 。你自己的目标是不再做 BI,让你现在的角色过时,实际上只需要几个小时就可以运行一个演示。

如果数据科学的核心是数据产品,那么 BI 平台将提供实际构建产品的体验,但没有太多的复杂性。客户,市场,需求都为你布局好了。

你将了解到拥有客户、采用和反馈——这是正确的解决方案,但你不能把复杂的 UI 强加给一大群用户。好好分享你的 demo

在业务方面,你将了解真正重要的指标,即使技术不是挑战,你也将了解是什么改变了你组织的底线。销售团队每天需要多少号?他们要求什么,什么数字真正让 CEO 夜不能寐?什么是你的客户喜欢的令人敬畏的仪表板?

在技术方面,您将了解到 SQL 是非常强大的,而那些需要很长时间才能完成的连接只需要几秒钟。数据集比你的硬盘还大,更不用说 RAM 了。SQL 简单多了。Hadoop 产生 Hive 产生 Impala 产生 Presto 是有原因的。或者大查询。或者 SparkSQL。条条大路通 SQL。这可能是数据科学家能够学到的最实用的技能。

您将学习结构化数据、OLAP、优化查询,可能还会学到很多关于索引数据的知识,可能还会学习 ETL 和使用 Airflow 或 Luigi 进行调度。从那里,将所有事情自动化。比如预测模型和构建完整的数据产品。

数据科学团队是独立的(不嵌入其他团队)。他们创造了从未被使用过的很酷的东西。组织中的其他人对他们所做的工作没有认同,一些数据科学家对什么可以实际投入生产没有很好的认识。

为什么数据科学家不了解什么可以投入生产?这份工作的目的是要有所作为,而达不到生产目标会让人非常沮丧。数据科学不能孤立存在,但在一些支持下,你可以取得很大进展。你需要学习如何在组织内部建立团队,数据科学是一项团队运动。你的团队需要谁?

Data Science is Team Sport

第一个实际变化:确保交付是设计过程的一部分。对于一个推荐系统来说,改变你的网站可能很难,但是你能给客户发邮件吗?您如何从客户那里获得特征向量?什么是最简单、最容易的生产路线。模型不是产品制造出来的。

其次,一些好消息是,开发和部署之间的技术壁垒每天都在变小。部署模型所需的支持一直在减少——谷歌的 CloudML、亚马逊的机器学习和 Azure 的 ML Studio 都提供了将模型作为服务发布的途径。采用这些服务可以使您更加敏捷,并减少工程开销。想想看,5 年后会是什么样子?

第三——从根本上说,你需要把什么东西投入生产?当软件需要一天 24 小时运行时。你将如何知道什么时候出了问题,并修复它,检查你没有破坏其他任何东西?这些都是关键的工程技能,也是最起码要理解和理想地掌握的重要技能。

将您的工作投入生产是一个重要的面试问题,需要展示,您在这里可以学到的一切都是为了培养您的数据科学技能。

数据科学家生产模型的速度远远快于工程支持将模型投入生产的速度。

暂时忘记,你是在建模型。同样的问题也经常发生在用户界面的改变上。或者营销信息。有大量的创造性工作无法投入生产。积压背后的原因之一是没有测试资源来评估新想法。你是 A/B 测试新模型,当然?

将优化模型的问题转化为在最短时间内优化决策的问题。部署新模型的潜在风险是什么?您的业务不会受到数据建模能力的限制,即使您是一名出色的数据科学家,但当涉及到测试平台时,您的业务会受到限制。这为数据科学家提供了不同的角度、技能和发展机会。

也许你有一个成熟的测试过程,但是如果新特性超出了测试能力,那么问题就变成了优先级的问题。平均来说,大约 10%的分割测试成功,我会找到链接。每次测试都要付出在测试期间运行劣质产品的代价。这意味着您可以通过优化成功的测试来建立竞争优势。如果 10%转移到 20%,你只是转移了底线。哪些支持数据改进了您的设计流程?测试新产品不仅仅是随机的想法,而是短暂的“了解你的客户”。

获取领域知识,了解客户,并以此打造更好的产品。或者形成更好的假设,这不是很吸引人,但在技术上更正确。少犯错就好。

Both Engineering and Bridge Building are important data science skills

数据基础设施工程师独立于数据科学家。管道没有数据科学家现在要求的数据,数据科学家没有充分利用基础设施工程师收集的数据源。

假设除了基本的 R 脚本之外,你还有一些编程经验,这里的机会是参与数据工程。作为数据科学家、数据工程管道的客户,您在构建优秀的数据管道方面处于非常有利的位置。如果数据是垃圾、杂乱、非结构化的,你需要对其进行清理。你的既得利益,至少意味着你有动力和对质量的眼光,这是很少有纯数据工程师会有的。你的工作和未来取决于能否把这件事做好。

但是——不是坏事——这真的意味着学习 Java。也许你有很好的 Python 基础设施,但是 Java,或者至少 JVM,是这里的第一类公民。Java 最难的是过滤掉 20 年的历史,所以找个好的来源,从 Java 8 开始。http://www.baeldung.com/才华横溢,为许多常见的数据问题提供了清晰的教程(JSON,我在看着你,你这个反复无常、前后矛盾的混蛋)。

对于框架,Spark 现在是 2.2,Apache Beam 是 2.0.0,Kafka 接近 1.0。这些平台比过去的原始 Hadoop 要好得多,可以很快在云中创建实例。

任何当前的数据工程师都应该能够用持续集成、Git 来支持你,并指导你完成代码评审和编码标准。这些都不是坏事。事实上,这是非常好的。掌握数据工程技能将使你远远超过许多候选人。无论如何,数据科学中 80%的数据准备实际上是数据工程——你理解的那一部分然后形成数据。

如果这还不能令人信服,我能求助于权威吗?http://threaded . stitch fix . com/blog/2016/03/16/engineers-should nt-write-ETL/

该公司已经明确决定了功能/产品 x。他们需要一名数据科学家来收集一些支持该决定的数据。数据科学家觉得项目经理忽略了与决策相矛盾的数据;项目经理认为数据科学家忽略了其他业务逻辑。

我认为从这次经历中可以吸取两个教训。

首先,世界上显然有人不相信全球变暖,尽管所有的证据都与此相反。伟大的数据科学需要伟大的故事讲述和令人信服的论点。通过理性讨论形成观点的能力是很难的。如果可以的话,你可以从非常遗憾地错过的汉斯·罗斯林身上汲取灵感。在那里,制造简单的直觉案例来尝试改变看法。

其次,对数据保持谦逊,并理解数据科学是而不是业务。

这自然意味着 数据科学团队不是业务中最重要的部分。数据科学现在非常热门,但我们必须记住,大多数企业都是通过其他方式赚钱的(https://data science . Berkeley . edu/mailchimp-John-foreman-data-smart/)

考虑一个运行中的分割测试——产品负责人想知道哪个版本胜出了,或者至少一个版本更好的可能性。是 73%。16 周后。他们将推出新功能。需要做出决定。其他因素在做出这个决定时起着重要的作用,很少有单一的最佳答案。

额外技能

有战略眼光。如果你能发现上面的问题,你就比任何人都更有资格提供解决方案。

简单的思维实验——你可以立即获得每一种 ML 技术的全面知识,但你必须留在你目前的公司。你在做什么项目,你在哪里度过你的时间?我认为,回答这个问题是铺平更长久职业生涯的大门。技术和工具总是在发展,没有人能跟上每件事,但是理解如何应用这些技术对领导者来说仍然是一项有价值的技能。

几个警告

数据科学是一个不断发展的领域,它不像软件工程那样成熟,这个术语涵盖了许多不同的领域和工作描述。对我来说,数据科学是关于利用数据获得一些好处,希望是社会的,好的,但金融、商业和组织都适合。

  1. 不要卡住。不要呆在无聊的地方,不断转移到不同的领域,即使它们并不完美。以上每一部分都是一个警告,也是一个机会。一旦你不再学习,不再解决问题,继续前进。
  2. 一条红线是没有得到解决问题的支持。如果你受雇于一个商业智能角色,但没有得到支持或授权来引入工具,那么尽快行动。你不会成长发育。

最后一句话

开头的文章强调了这位领先的数据科学家目前在实践中面临的一些重大挑战:从理论到模型再到产品。很容易将每一点理解为“缺少技能 X,正确做 X ”,但这些挑战中的每一个都提供了学习和发展的机会,并为下一代创造更好的工作场所。

当今的数据科学家

  • 了解每个必要领域所需的技能、面临的挑战和最佳实践
  • 可以围绕这些领域建立一个团队
  • 定义战略
  • 可以将这些产品推向市场

将成为明日的产品经理、团队负责人和首席数据官。

获得大量领域的经验可以让你更加全面,并为建立团队和提供目前非常罕见的数据领先地位铺平道路。不仅要学习技术,还要学习技术如何随时间变化,它将走向何方。了解如何与企业和您的数据客户合作、新兴的专业领域以及团队中需要哪些人来让数据为您的企业服务。

请谅解。今天的经理们也在努力解决这个问题。像你希望被支持一样去支持别人。

The End

数据科学案例研究:物联网中的分类

原文:https://towardsdatascience.com/data-science-case-study-classification-in-iot-474726c7559?source=collection_archive---------5-----------------------

Don’t let your health and youth go to waste. Also, that’s me squatting!

介绍

我们将研究来自 UCI 机器学习库日常运动和活动数据集。这项工作的目标是训练一个分类器,根据从连接到所有四肢和躯干的设备收集的传感器数据来预测用户正在进行的活动。这将通过巧妙的传感器数据特征工程和训练机器学习分类器来实现。

我们将从这两篇文章中引用机器学习研究人员所做的工作:

人类活动分类

识别日常和体育活动

科学是同行评审的

请查看这项工作的 Jupyter 笔记本

动机

物联网(IoT)是一个不断增长的技术领域,它寻求在汽车、家用电器,是的,甚至(特别是)人身上安装电子监视器。物联网可穿戴设备越来越受用户、公司和城市的欢迎。物联网的承诺是更智能地向电网输送能源,更智能的交通控制,实时健身反馈等等。毫不奇怪,初创公司正在寻求利用物联网的前景。

The promise of a smarter city.

Fitbit 已经成为健身可穿戴设备的代名词。它受到各种各样的人的欢迎:马拉松运动员全程记录自己的心率,而普通人只是想增加他们每天的步数。

Fitbit watch

Spire.io 的目标是利用从他们的可穿戴设备收集的生物特征数据,不仅跟踪心率和活动持续时间,还跟踪用户的呼吸频率,以提高注意力。冥想已经在西方社会大规模传播开来。神经科学继续证明冥想对身体和心理健康的益处。Spire.io 肯定会加入其他初创公司的行列,这些公司寻求向越来越多寻求更好地预防身心疾病的用户提供技术。

Spire wearable

Comfy 利用物联网和机器学习来智能监控和调节工作场所的舒适度。他们的设备和分析可以自动调节工作场所的温度,并减少了员工投诉,提高了生产率。

Intelligent climate control

可穿戴设备和其他显示器的快速普及要求数据科学家能够分析这些设备产生的信号数据。凭借必要的技能,数据科学家可以为营销和产品团队提供可操作的见解,并构建数据驱动的产品,从而提高用户参与度,让我们的生活变得更加轻松。

关于数据

8 个用户都参与相同的 19 个活动。5 个设备(4 个肢体和 1 个躯干)中的每一个都有 9 个传感器(x、y、z 加速度计、x、y、z 陀螺仪和 x、y、z 磁力计)。对于每个用户的每个活动,以 25 Hz 的频率在总共 5 分钟的 5 秒时间段内收集数据。

这 19 项活动是:

坐着(A1)、
站着(A2)、
仰卧和右侧躺着(A3 和 A4)、
上下楼梯(A5 和 A6)、
站在电梯里(A7)
并在电梯里走动(A8)、
在停车场行走(A9)、
在速度为 4 公里/小时的跑步机上行走(在平的和 15 度倾斜的位置)(A1 0 和 A11)、
在速度为 8 公里/小时的跑步机上跑步
在踏步机上锻炼(A13)
在交叉训练器上锻炼(A14)
在健身车上以水平和垂直姿势骑行(A15 和 A16)
划船(A17)
跳跃(A18)
打篮球(A19)。

数据结构:

19 个活动(a)(按上述顺序)
8 个用户(p)
60 个分段(s)
躯干(T)、右臂(RA)、左臂(LA)、右腿(RL)、左腿(LL)上的 5 个单元
每个单元上的 9 个传感器(x、y、z 加速度计、x、y、z 陀螺仪、x、y、z 磁力计)

数据检查|探索性数据分析

Let’s dive right in!

为了简单起见,让我们加载一个单独的片段,看看一个人在停车场行走的数据是什么样子。

我们可以从左腿和躯干加速度图中看出,这个人必须以正常的速度行走。这一点从波峰之间的间距大致恒定这一事实可以明显看出。如果有人以不规则的步速行走(即慢-快-慢行进),那么我们会看到频率的变化(稍后将详细介绍频率)。

设备在所有三个空间维度上的加速度是周期性的,以时间不变平均值为中心。

出于好奇,垂直维度是 X 方向,Z 方向指向远离设备的方向,与地面平行。有关尺寸和设备方向的更多信息,请参见识别日常和体育活动

上面的配对图显示了条件概率:人的加速度的 X,Y,Z 维度是如何相互关联的。对角线图显示信号分布近似为高斯分布。我们还可以看到,在底部三角形中,分布的中心彼此靠近。顶部的三角形以散点图的形式显示了维度之间的条件关系。

这些观察很重要。由于信号近似正常,我们可以在特征工程阶段利用这一事实(稍后将详细介绍)。

特征工程

Feature Engineering is cleaver transformations.

我们将基于两篇论文的成功研究,采用他们的方法进行特征工程。

我们将为每个细分市场添加新功能。新特征是每行分布的均值、方差、偏斜度和峰度(因为信号是正态的,正如我们前面看到的,我们可以计算它们的统计矩)自相关
序列的前十个值,以及具有相应频率的段的离散傅立叶变换
的最大五个峰值。

我们将每个特征归一化为[0,1]之间的值,然后将每个 5 秒的片段展平为具有 1140 个特征的单行。如此大量的特征将引入维数灾难并降低大多数分类器的性能。因此,我们将通过应用主成分分析 (PCA)来降低维度。

然后,每个展平的行将成为结果数据矩阵中的单个样本(行),分类器将最终对其进行训练和测试。

步伐

1.为原来的 45 个特性中的每一个获得 19 个附加特性。
2。归一化[0,1]
3 之间的所有特征。减少每个片段的尺寸
4。将这些片段堆叠起来,为每个人建立一个数据集

1.提取 19 个附加特征并转换数据集格式

让我们依次检查工程特性。

均值、方差、偏斜度和峰度

我们看到每个信号的分布都是近似正态的。这意味着我们可以对每 5 秒的片段取前四个统计矩。通过包含这四个时刻,我们正在帮助我们的模型更好地学习每个独特活动的特征。

自相关

在一些时间序列任务中,例如在 ARIMA 中,希望最小化自相关,以便将序列转换为平稳状态。我们可以在下图中看到,在滞后两步之后,我们在之前看到的序列中出现了统计上不显著的自相关。

出于我们的目的,我们希望从每个样本的自相关中提取前 10 个点,并将这 10 个点中的每个点视为一个新特征。我们为什么要这么做?这个想法是,每一个物理活动将有一个独特的自相关序列。因此,我们希望捕捉这种独特性,以帮助我们的模型了解活动之间的差异。

查看另一个人跳跃的下一个自相关图。我们可以看到,该活动没有统计上显著的自相关(除了滞后为零时的完美自相关)。我们看到跳跃的自相关序列不同于行走。

这是使用自相关图的前 10 个点创建新要素的直觉和理由。最终,这一点或任何工程特征的有效性将由模型的性能决定。

离散傅立叶变换的最多五个峰值

傅立叶变换函数在时间和频率空间之间来回映射信号。每个信号都是正弦函数(正弦和余弦)的线性组合。

第一个等式将信号从时间空间(t)变换到频率空间(ω)。第二个方程是逆变换。

这些方程显示了连续的变换。实际上,像 Python 的 SciPy 这样的编码包要么计算离散情况,要么对连续情况进行数值逼近。

下图显示了如何将信号分解成正弦曲线,确定每条曲线的频率,并最终将原始时间序列表示为频率序列。

Pretty cool, huh?

下面我们有一个人行走系列的躯干加速度的 Y 方向图。第一个图显示了时间序列信号的样子,第二个图显示了相应的频率信号的样子。

出于我们的目的,我们将提取 5 个最大峰值,并为每个样本中的每个值创建特征。我们为什么要这么做?回想一下上面的傅里叶变换图像,频率最高的曲线负责宏观振荡,而无数的小频率曲线负责微观振荡。这些宏观振荡决定了曲线的总体形状。每个活动的信号都有不同的一般形状。通过捕捉这些有影响的频率,我们的机器学习模型将能够更好地区分活动。

2.正常化所有特征

所有要素都在值 0 和 1 之间重新调整。

3.减少每个部分的尺寸

上图显示了所有 1140 个特性的解释差异。我们可以看到,解释的方差迅速下降到接近零。

底部曲线显示,在第 40 维之后,解释的方差几乎不变。这里的目标是减少维度的数量,并尽可能多地包含可解释的差异——这是一种平衡行为。两篇研究论文都表明,他们将维数降低到 30,收到了极好的效果。因此,我们将效仿他们的工作,将数据集的特征减少到 30 个。

如果我们创建并遵循我们自己的启发式方法来决定保留多少特征,我们可能会选择排除除了最小数量的特征之外的所有特征,这些特征解释了 90%的差异。

我们要取前 30 个主成分向量。

建模和预测

最后,到了性感的部分!我们将探索两种预测用户活动的方法。

方法 1

我们将创建包含来自每个用户的混合样本的训练和测试集。因此,该模型将根据来自每个用户的数据进行训练,并预测测试集中每个用户的活动。

方法 2

我们将包括 7 个用户的数据作为训练集,并将剩余的
个用户的数据作为测试集。这里的目标是预测模型从未见过的用户的活动。*

在每种方法中,我们将遵循相同的模型构建框架:

  1. 将数据分为定型集和维持集
  2. 优化模型超参数
  3. 通过分析学习曲线交叉验证模型性能

模型

在此分析中使用的机器学习模型是逻辑回归(LR)、支持向量机(SVM)和随机森林(RF)。为了简洁起见,我们将重点放在 LR 和 SVM。

建模方法 1

  1. 创建包含来自每个用户的混合样本的训练集和测试集。
  2. 根据来自每个用户的数据训练模型,并预测测试集中每个用户的活动。

网格搜索|优化的内存管理

对于每个唯一的超参数组合,简单的网格搜索实现会将数据集的副本从磁盘读入内存,这大大增加了运行网格搜索所需的时间。

一个更简单的网格搜索实现将只使用单个内核来顺序训练模型。请记住,拟合一个模型与拟合其他模型是完全独立的任务。因此,在数据工程社区中,这项任务通常被称为令人尴尬的并行任务。

以下网格搜索实现使用 ipyparallel 包来创建本地集群,以便同时运行多个模型拟合——与可用的内核数量一样多。

这个网格搜索实现还利用了 Numpy 的内存映射功能。每次拟合模型时,我们不会从磁盘读取数据集的副本,而是将数据的只读版本映射到内存,每个内核都可以引用它来拟合模型。

并行化和内存映射的结合大大缩短了网格搜索过程。

交叉验证|学习曲线

在我们深入研究这些图告诉我们关于我们的模型的什么之前,让我们确保理解这些图是如何生成的。

生成学习曲线

我们为四个指标绘制了一条学习曲线,我们将使用这四个指标来评估我们模型的性能:准确度、精确度、召回率和 f1 分数。这些图表上绘制的每个点都是由以下交叉验证流程生成的指标得分。

首先,数据被分为训练集和保持集。训练集被进一步分成 k 个折叠,并且每个折叠被迭代地用作训练集的一部分或验证集,以便训练模型。一旦模型定型,它就用于预测定型集和维持集的值。蓝色曲线表示对定型集进行的预测,绿色曲线表示对维持集(我们在这里也称为测试集)进行的预测。)

分析学习曲线|逻辑回归

学习曲线包含了关于我们模型的丰富信息。

让我们看看精确度学习曲线。我们可以看到,当我们将训练集的大小从 1000 个样本增加到 2000 个样本时,测试集的分数增加了大约 5%。随着我们继续增加训练集的大小,我们看到测试的准确性没有增加。测试集精度的这种饱和表示模型的偏差。偏差表明模型不够复杂,无法从数据中学习,因此无论对多少训练点进行训练,都无法提高其性能。这也被称为欠拟合

训练曲线和测试曲线之间的差距表明了模型预测中的方差的数量。理想情况下,模型在这两条曲线之间会有一个非常小的间隙,这表明模型可以很好地概括看不见的数据。这是合乎需要的,因为替代方案是更大的差距,表明测试分数比训练分数差。这表明模型正在学习只预测以前看到的数据,而不是学习可概括的趋势和模式。这被称为过拟合。我们可以看到,逻辑回归既有偏差又有方差。

最后,我们可以看到逻辑回归的所有指标从未超过 50%。如果我们随机猜测样本属于哪一类,我们的正确率大约是 5%(因为有 19 个活动)。虽然 LR 的表现比 random 更好,但我们想做到比 50%的准确率好得多。

分析学习曲线| SVM

支持向量机模型的表现明显优于逻辑回归。看一下精度曲线。它表明,该模型能够在预测训练集的活动分类方面做得近乎完美。

更重要的是,该模型以接近 99%的准确率对测试集中的活动进行分类。测试曲线显示,随着在更大的数据集上进行训练,SVM 的性能有所提高。训练曲线和测试曲线之间的差距可能看起来很大,但请记住,这两条曲线之间的差异约为 0.01%,这是一个非常小的差异。我们可以从这些学习曲线得出结论,SVM 遭受了非常小的偏差和方差。这就是我们在即将投入生产的车型中所期望的性能类型。

精确度|召回

到目前为止,我们一直专注于准确性度量,但精度和召回呢?

Precision 告诉我们预测为肯定的分类实际上是肯定的百分比。为简单起见,假设我们正在处理一个二元分类问题,其中 100 个样本被预测属于正类。100 个肯定预测中有 90 个实际上属于肯定类别,在这种情况下,我们将这些预测标记为真肯定 ( TP )。另一方面,100 个阳性预测中有 10 个实际上不属于阳性类别,它们是被错误预测为阳性的阴性样本,在这种情况下,我们将这些预测标记为假阳性 ( FP )。

回忆告诉我们模型能够多好地识别属于正类的点。这听起来很像精确,但事实并非如此。召回将 TP 与假阴性 ( FN )进行比较,其中 as 精度将 TP 与 FP 进行比较。这里的区别在于,对于每个被错误地预测为属于负类的样本,模型可以正确识别为属于正类的样本就少了一个。

回忆是对区分积极和消极分类失败的一种度量。

精度是对正确预测肯定分类失败的度量。

最后,f1 分数是精确度和召回率的加权平均值。f1 分数用于衡量这两种类型的失败。

回到我们的案例研究,看看 SVM 的精度曲线。它告诉我们,100 个被预测为属于正类的样本中,有 99 个实际上属于正类。现在,因为我们的数据集有 19 个类,而不是 2 个,标签“积极”和“消极”类失去了意义。当存在两个以上的分类时,我们可以重新解释测试集精度学习曲线,以表示预测属于特定类的 100 个分类中有 99 个实际上属于该类。

建模方法 2

  1. 创建一个由 7 个随机选择的用户组成的训练集和一个由剩余用户组成的测试集。
  2. 训练模型来预测以前未见过的用户正在从事哪些活动,而不仅仅是针对以前见过的用户。

分析学习曲线| SVM

哇哦。发生了什么事?

记住,训练集包含 7 个用户,测试集包含第 8 个用户。学习曲线显示了大量的过度拟合。蓝色的训练曲线代表训练集中的 7 个用户。该模型可以预测已经看到的用户的活动。然而,绿色曲线告诉我们,该模型无法推广到新用户。

这些结果可能归因于我们采用的特征工程方法。人们走路、跳跃、上下楼梯等等的方式都是独一无二的。我们有理由得出这样的结论:我们已经成功地捕捉到了特定个体特有的身体运动,但还没有捕捉到对这些活动在人群中是如何进行的概括理解。

根据我们的目标,我们可以得出我们成功了或者没有达到目标的结论。如果我们的目标是为每个人建立并奉献一个模型,那么我们可以得出结论,这项工作是一个巨大的成功!

另一方面,如果我们的目标是建立一个模型,从任何用户那里学习行走信号或跳跃信号的样子,那么我们将不得不承认我们有所欠缺。

结论

我们已经看到了对时间序列数据和信号处理的理解如何能够导致工程特性和构建机器学习模型,这些模型能够以 99%的准确率预测用户正在从事的活动。

事实证明,我们的方法成功地构建了一个模型,该模型可以预测出现在训练集和测试集中的用户活动。该模型能够学习哪些信号对应于特定用户的行走或跳跃等活动。然而,当用户被限制出现在训练或测试集中时,我们看到该模型不能获得独立于用户的关于哪些信号对应于特定活动的概括理解。

这项工作可以直接应用于 Fitbit 和 Spire 这样的物联网创业公司。两家公司都在从可穿戴设备上收集信号数据。对用户参与的活动类型进行分类是有价值的信息,可用于构建数据产品和推动营销工作。

关于作者

Alexander Barriga 拥有 GalvanizeU (纽黑文大学)的数据科学硕士学位和加州大学伯克利分校的物理学学士学位。他目前是旧金山大会的数据科学讲师。

数据科学案例研究:优化零售中的产品布局(第 1 部分)

原文:https://towardsdatascience.com/data-science-case-study-optimizing-product-placement-in-retail-part-1-2e8b27e16e8d?source=collection_archive---------8-----------------------

利用数据科学创造价值的实用方法

之前的一篇文章中,我写了一种我在数据科学项目中创造价值的方法。快速回顾和总结我在那篇文章中所说的,数据科学的目标是赋予更好的决策能力。这样做需要我们有 同理心 来确保我们问了正确的问题并且使用了正确的信息。

当与价值主张画布并置时,数据科学项目可以被视为满足客户需求(即决策)的产品,处理与做出这些决策相关的挑战,并最大化从做出正确决策中获得的利益。

数据

在今天的帖子中,我将使用的数据集来自 Analytics Vidhya 的' Big Mart Sales III '数据集,该数据集可通过他们的一次练习比赛获得。你可以通过下面的链接来看看。

[## 练习题:大卖场销售 III

练习题:大卖场销售 III |知识与学习

datahack.analyticsvidhya.com](https://datahack.analyticsvidhya.com/contest/practice-problem-big-mart-sales-iii/)

数据描述(取自比赛现场)

BigMart 的数据科学家收集了不同城市的 10 家商店的 1559 种产品的 2013 年销售数据。此外,还定义了每个产品和商店的某些属性。

数据集中包含的数据如下:

  • Item_Identifier: 唯一产品 ID
  • 项目 _ 重量产品重量
  • Item_Fat_Content: 产品是否低脂
  • Item_Visibility: 商店中分配给特定产品的所有产品的总展示面积的百分比
  • Item_Type: 产品所属的类别
  • Item_MRP: 产品的最高零售价格(标价)
  • Outlet_Identifier: 唯一店铺 ID
  • 奥特莱斯 _ 成立 _ 年份:店铺成立的年份
  • 商店占地面积的大小
  • Outlet_Location_Type: 商店所在城市的类型
  • 商店类型:商店是杂货店还是超市
  • Item_Outlet_Sales: 特定商店中产品的销售额。

问题定义

如前所述,在这个项目中,我们将试图找到最佳的产品植入选项,以最大化 Item_Outlet_Sales 变量。为此,我们将创建一个模型来预测某些商品的价值,然后提出可能的方法来改进该产品的位置。

利用我们所知道的创建我们的客户档案我们得到:

  • 工作:优化植入式广告
  • 痛苦:忽视影响销售的因素
  • 收获:洞察客户喜好。

制定方法

为了创建正确的数据产品,我们将这样做:

  1. 建立用于创建销售预测的模型
  2. 了解影响销售的因素
  3. 根据影响销售的因素,提供增加原始预测的建议

发现最重要的,但易处理的特征

我认为值得分享的是,我使用 XGBoost 的特性重要性函数来确定我想要操作的特性,以便改变销售预测。下图显示了数据集中各种要素的重要性:

A graph showing the features that have the greatest impact on sales.

Pretty Simple eh?

在图表上显示的所有特性中,请务必注意 Item_MRP、Outlet_Type、Item_Visibility、Outlet_Size 和 Outlet _ Location _ Type——这些是易处理的特性。对于这个项目,我假设我们希望让 MRP 保持原样。其中最重要的是“Outlet_Type”变量。调整预测主要意味着选择将产生最有希望的预测的出口类型。

在这样做的时候,我决定最好在现有的商店(和它们各自的配置)中循环,因为只有 10 个 BigMart 商店。

这样做的代码如下:

Creating an Item-Outlet pairing for generating an Adjusted Forecast.

生成我们的新预测相当简单,是这样完成的:

最后的结果

运行我编写的程序后,产生了以下建议:

I recommend that Item '**FDW58**', be moved from Outlet '**OUT049**', to Outlet '**OUT027**'.
The adjusted forecast is expected to be **64.0%** better (**2606.40**), than the original forecast of **$1589.31**.Configuration details:
Outlet_Size:  Medium --> Medium
Outlet_Location_Type: Tier 1 --> Tier 3
Outlet_Type: Supermarket Type1 --> Supermarket Type3
Outlet_Age: 19 --> 33

理解价值主张

将所有这些与我之前提到的价值主张设计和数据科学项目联系起来,我们可以将我们的设计总结如下:

  • 产品和服务:为产品建议最佳放置选项的数据产品。
  • 止痛药:减少决策的不确定性。
  • 收益创造者:产品在最需要它们的顾客触手可及的地方。

请注意,在这个例子中,我们的解决方案不仅为大商场的员工解决了一个问题,还影响了他们的顾客。考虑那些受我们产品支持的决策影响的人,对于创造正确的产品至关重要。

结论

值得注意的是,这种算法通常出现在“完美系统”用例中,如游戏和模拟,其中系统的所有规则都是已知的,没有未知变量。不幸的是,生活不是这样的。应用于“假设”场景的机器学习技术仅用于提供关于什么可能产生最佳结果的指导。

尽管我们获得了销售数据,但我们仍然不确定所观察到的购物习惯的季节性,这肯定会对推荐的质量产生影响。这个系统的一个更好的版本将能够找到多种产品的最佳放置选项,同时允许用户优先考虑一种产品。

我希望这篇文章给了你一个清晰而实用的方法,用你的数据科学为项目创造价值,我希望你能学到一些新的东西。像往常一样,我欢迎您的反馈,并期待产生更多的内容。

在这篇文章的最后,我想对一些非常重要的人大声疾呼。首先,我要感谢 数据助手 的可爱员工,感谢他们为我们提供问题、指导和数据科学帮助。如果你正在寻找一位数据科学导师,我强烈建议你从那里开始。我还要感谢Rachael Tatman让我加入他们,也感谢她在 Kaggle 在数据科学教育方面所做的出色工作。

如果您想了解更多关于我用来构建本案例研究中提到的解决方案的工具,请查看下面的链接:

** [## XGBoost

xgboost -可扩展、可移植和分布式梯度增强(GBDT、GBRT 或 GBM)库,用于 Python、R、Java、Scala…

github.com](https://github.com/dmlc/xgboost) [## XGBoost 中超参数调整

在本教程中,您将学习使用本机 XGBoost API(对于 sklearn API,请参见上一教程),它…

cambridgespark.com](https://cambridgespark.com/content/tutorials/hyperparameter-tuning-in-xgboost/index.html#training-and-tuning-an-xgboost-model)**

成为数据科学家@ LinkedIn

原文:https://towardsdatascience.com/data-science-connect-linkedin-5e6e3f6c5712?source=collection_archive---------16-----------------------

Data Science Connect 是一个关于一切数据的免费网络研讨会。我们的主要目标是帮助尽可能多的有抱负的数据科学家,将他们与聪明的头脑联系起来。有这么多的路线可以选择,听到一个以上的声音总是最好的。

在我们的第一个系列中,我们有幸采访了一位来自 LinkedIn 的数据科学家。你可以在这里观看完整的采访。

Avinash Ahuja 在 LinkedIn 从事市场动态方面的工作,他的工作已经产生了很大的影响。

你可以从任何行业进入数据科学。不是计算机专业出身或者没有编程经验都没关系。你可以随时捡起来。真正重要的是你有解决问题和积极进取的态度。只是想找到解决办法。

土木工程到数据科学 7:10

当你看着我们周围的世界。我们正在努力优化一切。这适用于任何领域。我们正试图找到提高效率的最佳解决方案。无论想最小化什么,我们都可以用 ML。令人惊讶的是所有这些是如何完美地结合在一起的。

他于 2013 年来到美国学习土木工程。他花了整整一年的时间才意识到优化才是他真正感兴趣的。他在研究土木工程中的计算机视觉和最优化问题。"我是班上倒数 25%的学生。"他不是优等生。他使用了大量的线性代数和微积分,特别是对他自己在土木工程领域的研究。

我什么都不知道…当事情变得艰难时,你会投入时间和精力。你是什么军衔并不重要。每个人都有糟糕的时候。你要做的就是继续努力,不要停下来。

他花了一年时间参加了 ML 课程,然后在 2014 年秋天,他参加了他的第一个机器学习课程。他花了很长时间才明白 ML 是什么。2014 年春天,他上了社会经济学网络课。现在他对 DS na 感兴趣,知道 ML 的具体细节。他申请了 2015 年的 DS 团契,他在芝加哥完成了他的团契。他于 2016 年毕业于 din,并在 linkedin 开始工作。

帮助客户/会员成功:18:00

任何时候你做任何分析,我们关注的是什么会给会员带来价值。什么能帮助我们的成员实现他们的目标。你如何追踪它?你的方法是始终专注于此。总是问自己我们如何为会员价值做出贡献。

让会员站在我们所做一切的最前沿。

其中一个核心问题是,这如何为会员创造价值。其他的都是次要的。我们都有不同的指标,每个指标都被用作我们成员体验的指南。基于这些属性,我们优化了会员的行为和体验

从学术界过渡到客户成功指标的挑战(业务)19:30

转变为关注客户成功指标的角色所带来的挑战。在学校里也没怎么涉及到。这很有挑战性,因为这是数据科学行业中人们不会说的话。问题是学校可能只是以一种非常抽象的方式教授这些算法。就像这里,这个 viz 适合这个数据,这个 viz 适合那个数据。使用回归,在这种情况下使用决策树。当你用神经网络处理大量数据时…

真正重要的是学会如何理解你的用户。而这并不是学校真正教的。与用户感同身受。这对用户有什么帮助?我们没有学到的是如何强调用户和产品。这应该是数据科学课程的一部分。

对用户的同情是我遇到的一个问题。从用户的角度来看。每个用户都是不同的,真正了解他们对产品的体验取决于你。这是学校里没有教的东西,需要学习。

其次是讲故事。最初,当我们进行分析时,我们有一个漂亮的图表。有这些图表和模型。但重要的是了解这如何转化为会员体验,以及如何影响业务。始终展示您的分析如何影响业务和用户的价值。您的指标需要转化为对用户和公司的影响。从收入、找到工作的可能性等方面来看。

数据科学如何入门 23:00

做数据科学的第一步就是模仿,直到你真正理解并内化了所有的概念。随着你的进步,你开始学习什么问题适合什么技术/分析。一旦你对这些工具和技术的使用有了大致的了解,你就可以开始寻找你自己的数据了。找到一个你想解决的问题,并对它进行分析。他的建议是你最初跟 Kaggle 学。但那不会让你走那么远。你必须超越这些,找到你自己的问题。新事物。有洞察力的东西。不一定是机器学习。它必须是新颖的,新的分析,解决问题的新方法。那就分享一下。这就是你学习和被关注的方式。

我学到了什么 27:55

在他的机器学习课程中,他学习了各种算法和技术,如决策树、回归、SVM 和内核。要记住的一件重要的事情是,你不应该只是学习这些算法来应用它并做出预测。真正重要的是理解模型背后的数学原理,并从头开始实现这些模型。不管你使用什么语言,是 python、java、matlab 等等,它实际上是构建整个模型和管道本身。真正了解模型的本质细节、科学和基本原理。这真的很有帮助,因为它给了你理解这些概念的信心,你可以和任何人谈论它们。本质上,你最终会知道如何从根本上优化这些模型。

我的学习方法 31:40

我做的第一件事就是暴力。我会参加一个 ML 课程并完成它。一开始你可能会很糟糕,但没关系。随着你的学习,你会开始知道你不知道的事情。这是你需要深入挖掘和学习的概念。你从这些事情中学习,然后重新开始。判断自己知道什么,不知道什么。

  1. 采取行动,开始学习
  2. 重新评估你的经验,看看你知道什么和不知道什么
  3. 学习你不知道的东西,然后再回头看一遍。

只要你随着时间的推移不断提高,这就是最重要的。

工具

  • Python 和 R: R 的统计量更大。适用于汇总统计。Python 更适合生产。r 和 Python 是微不足道的,它真的取决于你从哪里来。对于大部分地方来说,无所谓。如果你知道 R,你就能处理 Python。有时候我会用 python,R,或者 Scala(取决于项目)。
  • 线性代数和统计:统计很重要,因为你需要能够谈论数据。你需要知道什么是置信区间、方差、稀疏性、数据分布、均值/中值/众数和 A/B 检验。统计学是数据科学的基础。
  • 其他:如果你想出人头地,你需要知道某些编程范式,了解 GIT、数据结构、OOP、网络算法之类的东西。这些如何在实验中发挥作用,以及它如何优化您的工作流程

文件和反馈的重要性 48:35

长话短说:开始记录吧。不要担心初稿的质量。去做吧。有一个完整的想法。考虑和未来的自己对话,告诉自己在做什么。过度记录没关系。如果你不做记录,你就会忘记你为什么做这做那。

  1. 记录你的模型、分析、可视化…重要的是把你的想法写出来。提醒你未来的自己为什么没有成功。比如,“嘿,随机森林没用,XGboost 也没用。看起来基于树的模型不起作用。”评论树算法不起作用。让我们尝试另一种算法,尝试回归。记下来,从中学习,然后重复。
  2. 你不会尽可能高效地编码。你编码是为了不让事情搞砸。作为一个整体意识形态来保护它。

反馈:这很重要,不要往心里去。试着自己走一遍,和别人谈谈你的模型,你可能会意识到你犯了不同的错误。人们的反馈让你明白人们会犯错误。如果是错误,那就从中吸取教训并改正它。

LinkedIn 1:00:00 的生活

日子变化很大。有时,根据不同的日子,我会和人们谈论他们的工作以及我所做的工作。但是在任何一天,我的工作要么是和别人分享我的工作,要么是喝咖啡,或者只是从他们正在做的事情中学习。没有议程。我对 LinkedIn 作为一家公司在做什么有一个整体的想法。它太大了。你需要积极主动地了解公司发生了什么,看看你能利用什么来帮忙。与人交谈并传播思想。也许我一周工作的 50%是从 SQL、构建代码审查、Hadoop 中提取数据。另外 50%是交谈,分享想法,和成员交谈。

`注释结束

凯尔和我很想听到你的反馈,尤其是你从第一集学到了什么。

要报名或获取更多信息,请访问我们位于 www.datasciencedreamjob.com的网站

👉加入我们在 www.datasciencedreamjob.com/free-tips的邮件列表,获得如何进入这个领域的免费提示

👉如需提前注册我们未来的网络研讨会,请点击此处:https://lnkd.in/gMT2pJd

30 条数据科学妙语

原文:https://towardsdatascience.com/data-science-conversation-starters-84affd2347f6?source=collection_archive---------2-----------------------

浓缩成 30 句引言的假日阅读清单

对于那些喜欢在假期吃大脑食物的人来说,这里有一个方便的索引,列出了我从 2018 年开始的所有文章,归结为 30 个(偶尔厚颜无耻的)妙语,帮助你避免/引起家庭活动和假日聚会上的尴尬沉默。

章节: 数据科学与分析,ML/AI 概念,如何不在 ML/AI 上失败,数据科学领导力,技术,统计学。

额外收获:视频、播客、供你的非英语朋友和家人欣赏的外语翻译,以及为你们当中的 Pythonistas 提供的端到端深度学习教程。

数据科学和分析

数据科学到底是什么? 快速浏览数据科学、数据工程、统计学、分析学、ML 和 AI。

数据科学是让数据变得有用的学科。

Twitter definitions circa 2014.

优秀的数据分析师做什么,为什么每个组织都需要他们 。优秀的分析师是数据工作取得成效的先决条件。让他们放弃你是很危险的,但是如果你低估了他们,他们就会这么做。

这三个数据科学学科各有所长。统计员带来严谨,ML 工程师带来性能,分析师带来速度。

秘密段落摘自《HBR 分析篇》 一篇从上面文章中略去的沉思集。我们来谈谈混合角色,研究的本质,Bat 信号,数据江湖骗子,牛逼的分析师!

买家请注意:有许多冒充数据科学家的数据骗子。没有魔法能把不确定性变成确定性。

人工智能和数据科学十大角色 。职位指南,按招聘顺序排列。

如果研究员是你的第一份工作,你可能没有合适的环境来好好利用他们。

ML/AI 概念

你会读到 对机器学习最简单的解释。机器学习是一种事物标签,你可以用例子而不是指令来解释你的任务。

机器学习是一种新的编程范式,一种向计算机传达你的愿望的新方式。这很令人兴奋,因为它让你能够自动化不可言喻的事物。

你是不是用错了“AI”这个词? 定义不清的术语,实际上并不存在正确使用它们的问题。我们都可能成为赢家,但这里有一个快速指南,可以让你了解 AI、ML、DL、RL 和 HLI 的字母汤。

如果你担心每个橱柜里都潜伏着一个类似人类的智能,请放松呼吸。所有这些行业人工智能应用都忙于解决实际的商业问题。

【向孩子(或你的老板)解释监督学习。**我的目标是让所有人熟悉一些基本术语:实例、标签、特征、模型、算法和监督学习。

不要被行话吓倒。例如,模型只是“配方”的一个花哨的词

机器学习——皇帝穿衣服了吗?通过图片和猫迷因,初学者可以轻松了解核心概念,包括算法和损失函数。

不要因为简单而讨厌机器学习。杠杆也很简单,但它们可以移动世界。

Neural networks may as well be called “yoga networks” — their special power is giving you a very flexible boundary.

无监督学习去神秘化 。无监督学习通过为你将相似的东西分组在一起,帮助你在数据中寻找灵感。结果就是一张帮助你做梦的罗夏卡片。

把无监督学习想象成让“物以类聚”的数学版本。

如果你拒绝把决策权交给你不了解其过程的事情,那么你应该解雇你所有的人类工人,因为没有人知道大脑(及其一千亿个神经元!)做决策。

如何不在 ML/AI 上失败

为什么商家在机器学习上失败 。许多企业没有意识到应用 ML 与 ML 算法研究是非常不同的学科。

想象一下,试着雇佣那些一辈子都在制造微波炉零件,却从来没有做过饭的人来开一家餐馆……会有什么问题呢?

Which of these are you selling? The right team to hire depends on your answer.

寻找 AI 用例建议 。我寻找应用机会的头脑风暴技巧始于想象人工智能是一个骗局…

企业犯的一个常见错误是假设机器学习是神奇的,因此可以跳过对做好任务意味着什么的思考。

AI 的第一步可能会给你带来惊喜 。启动一个 AI 项目的正确方法是什么?获得 AI 学位?不。雇一个人工智能巫师?没有。挑一个牛逼的算法?也不是那个。钻研数据?又错了!以下是如何做得更好的方法。

永远不要让一个博士团队“去把机器学习洒在业务的顶部,这样……好事就会发生。”

“What is my purpose?”

你的 AI 项目没戏吗? 在你雇佣任何工程师或者为一个应用的 ML/AI 项目获取任何数据之前,你应该通过的一个(现实)清单。

不要为了 AI 而在 AI 上浪费时间。被它能为你做什么所激励,而不是被它听起来有多科幻。

AI 入门?从这里开始! 决策者在应用 ML/AI 项目中的角色和职责的详细指南。

仅仅因为你能做某事,并不意味着这是对任何人时间的一种很好的利用。我们人类爱上了自己倾注心血的东西……哪怕是一堆有毒的垃圾。

AI 犯错是谁的错?人工智能的要点是你用例子而不是指令来表达你的愿望。为了让它起作用,例子必须是相关的。

如果你使用的工具没有经过安全验证,那么你造成的任何混乱都是你的错。人工智能和其他工具一样。

数据科学领导地位

数据驱动?再想想 对于数据驱动的决策来说,驱动决策的必须是数据,而不是其他东西。看起来很简单,但在实践中却很少见,因为决策者缺乏一个关键的心理习惯。

分割数据的方式越多,你的分析就越容易滋生确认偏差。解药是提前设定你的决策标准。

数据科学是泡沫吗? 了解更多关于自称“数据科学家”的人,以及为什么这个行业在玩一场危险的游戏。

“我认为你可能会像毒枭为他的后院买一只老虎一样雇佣数据科学家,”我告诉他。“你不知道你想要这只老虎做什么,但其他毒枭都有一只。”

I don’t know any actual drug lords (or tigers), so I’m not sure what’s in those backyards. But you get my point.

数据科学领袖:你们 太多了。有什么计划来培训决策者,让他们掌握让数据科学团队成功的技能?希望不是策略!

…一种亲数学的亚文化,在这种亚文化中,对任何闻起来像“软”技能的东西表示蔑视是一种时尚。这都是关于你是多么热衷于熬夜证明一些定理或用你的第六语言编码。

反思数据科学中的快与慢 产品开发团队是否有可能调和快速迭代与深度研究过程的缓慢移动的庞然大物,或者他们必须选择一个?

灵感是廉价的,但严谨是昂贵的。

面试:给数据科学家的建议 坦诚回答数据科学家同事的问题。主题包括:喜爱的资源、职业、统计教育和数据科学领导。

有用比复杂更有价值。数据质量比方法质量更重要。沟通技巧比另一种编程语言更有价值。

技术

关于 TensorFlow 你应该知道的 9 件事。如果你有大量数据和/或你在追求人工智能的最新发展,TensorFlow 可能是你新的最好的朋友。这不是数据科学瑞士军刀,这是工业车床。这是它的新特性。

有了 TensorFlow Hub,您可以从事一种历史悠久的传统的更有效的版本,即帮助自己使用他人的代码并将其称为自己的代码(也称为专业软件工程)。

5 个一口大小的数据科学总结 Google Cloud Next SF 2018 最喜欢的 5 场演讲。5 个视频摘要。5 分钟或更少。

人工智能花了半个多世纪被大肆宣传,而不是发生。那么,为什么是现在?许多人没有意识到,今天应用人工智能的故事实际上是关于云的故事。

统计数字

不要把时间浪费在统计 上。如何确定是否需要统计,如果不需要怎么办。

统计学是改变你想法的科学。

永远不要从一个假设开始 。从假设而不是行动开始是那些学习数学却没有吸收任何哲学的人的一个普遍错误。让我们看看如何利用统计数据进行决策。

假说就像蟑螂。当你看到一个,它永远不会只是一个。附近总有更多的藏身之处。

统计来去匆匆的人 。曾经希望有人能告诉你统计学的意义是什么,术语用简单的英语表达是什么意思吗?让我试着在 8 分钟内实现你的愿望吧!

数学就是建立一个零假设宇宙的玩具模型。这就是获得 p 值的方法。

——你做错了 。只有当你想要的信息(人群)和你拥有的信息(样本)不匹配时,统计方法才有意义。如果项目负责人不知道他们想要什么信息会怎么样?

在从样本到人群的伊卡洛斯式的飞跃中,如果你不知道你的目标是什么,那么期待一个大的冲击。

统计精明自测 。你能通过这个测试你统计专业知识的小测验吗?如果你相信他们在 STAT101 告诉你的,你可能不会…

如果你有事实,你就不需要统计数据了。

无能,授权,人口 。如果决策者没有正确的技能,你的整个统计项目就注定要失败。统计学家什么时候应该大惊小怪,什么时候应该温顺地服从命令?

如果你的目标是用数据说服人们,你也可以把严谨扔出窗外(因为那是它的归属),转而制作漂亮的图表。

翻译

我的第二个 Medium 账号上有其他语言的社区翻译文章。下面是阿拉伯语中文荷兰语法语德语印地语印尼语意大利语日语葡萄牙语、【BR】、俄语西班牙语土耳其语(如果你愿意自愿做翻译,请阅读此处。)

播客

DI 播客:我为那些喜欢音频的人读我的文章

关于决策智能的 30 分钟 GCP 播客

65 分钟关于让数据科学变得有用的 DataCamp 播客

视频

29min talk about ethics and responsibility in AI

19min talk introducing Decision Intelligence

15min talk explaining Google Cloud’s ML offerings in terms of making pizza. If you’ve already watched one of the videos above, start at 5:25.

感谢阅读!YouTube 课程怎么样?

哇!你一直坚持到最后吗?耐力挑战成功了!你已经准备好迎接速度挑战了…你能在 5 秒钟内鼓掌几次?😃

如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:

Enjoy the entire course playlist here: bit.ly/machinefriend

喜欢作者?与凯西·科兹尔科夫联系

让我们做朋友吧!你可以在 TwitterYouTubeSubstackLinkedIn 上找到我。有兴趣让我在你的活动上发言吗?使用表格取得联系。

数据科学课程从零开始 2018(第一部分)

原文:https://towardsdatascience.com/data-science-curriculum-from-scratch-2018-part-1-35061303c385?source=collection_archive---------5-----------------------

Photo by rawpixel on Unsplash

由于我的药学背景,我不具备数据科学家所需的任何技术知识,在此之前我甚至不知道线性代数的存在。那时,我真的不太可能一头扎进很酷的数据科学领域。我被自己知识的匮乏所压倒,我认为一个全面的课程会真正帮助我,或者像我这样的人。

好消息是,网上并不缺少数据科学课程。坏消息是,我既没有收入也没有时间去试驾每一门课程,我需要一门适合我的课程。

根据我缺乏的技能开发定制课程是下一个最好的选择。我从工作门户网站中提取技能,查阅了班级中心的大量评论,结合社区的建议,几个版本之后,我自己的数据科学课程形成了。

这是我展示我的课程和提供这些课程的个人评论的系列的第一部分。

免责声明 :遵循课程并不能保证成功。我也不是来自任何有资格出版我自己的课程的学术机构。本课程的目的是为您提供数据科学入门指南,即使您缺乏技术知识。

数据科学导论

统计数据

概率

微积分

线性代数

Python 编程

机器学习

深度学习

学习如此复杂的题目没有硬性规定。在线学习的美妙之处在于,你可以选择你需要的和让你兴奋的东西。

对于这个系列的第 1 部分,我将回顾我所学的数学和 python 基础课程。请注意,这些是我的个人意见,可能会也可能不会引起你的共鸣。不管怎样,我们走吧。

https://www.udemy.com/datascience/

数据科学导论

我想特别提到基里尔·叶列缅科和超级数据科学团队的数据科学 A-Z。这是我第一次参加数据科学领域的课程,基里尔·叶列缅科做得非常好,激起了所有数据科学爱好者的兴趣。不要期望从本课程中学到任何工具或技术技能,而是欣赏更大的画面基里尔·叶列缅科试图描绘,他将带你了解一个标准数据科学项目的整个工作流程。

您可以使用一些数据集,完成简单的任务,如数据清理、建模、模型选择、基本 SQL 和数据表示。这是数据科学入门课程中最完整的内容,会让你渴望更多。此外,本课程也是对你的现实检验。如果这不是你作为数据科学家所期望的,也许追求数据科学并不是你的最佳选择。总体而言,如果您对数据科学家的角色仍有疑问,建议您这样做。

统计数据

继续,机器学习所需的数学基础。您可能已经意识到我包含了来自 MITx 的统计和数据科学 MicroMasters 程序,但这完全取决于您的偏好。没有这个项目你也能做得很好。对于统计和概率,我正在使用该计划的课程,但我可以列出一些其他的替代建议。

  1. 描述性统计简介uda city
  2. Udacity介绍推断统计

除了它们经常在我搜索的时候出现之外,我没什么好评论的。下面的评论让我知道这是不是一个好的选择。MITxMITx的统计基础还没有开始他们的课程,所以我将把它留到另一天。

可能性

现在我只想说,概率——不确定性和数据的科学是一门极好的课程。这是我带过的最有活力、要求最高的 MOOC。该课程估计在 16 周内每周要花费大约 12 个小时的努力,但我很容易就完成了每周两倍的时间。有每周到期的问题集和每 4 周一次的定时考试,迫使你经常重温这些材料。一句忠告,认真对待前提条件。在学习新的深入概念时,你不会想与基本的微积分作斗争。做好心理准备,把你的大部分空闲时间花在习题集上,但我保证这是值得的。这门课程可能是你在数据科学中唯一需要的概率课程。甚至有人会说,你不需要这么高级的概率。这可能是真的,但是让你自己沉浸在一门数学繁重的课程中,会让你更好地为你将来会遇到的所有数学符号做好准备,无论是来自机器学习算法还是阅读未来的科学研究论文。结论:如果你有时间和决心,这是一门优秀的课程,强烈推荐。

你可以免费旁听课程,不需要证书,否则,证书费用为 300 美元。如果您负担不起,edX 将提供高达 90%的经济资助。

多元微积分和线性代数

我将它们放在一起提及,因为我在这些方面几乎使用了相同的资源。Coursera 和 Khan academy 的机器学习数学互为补充,为您提供足够的基础知识来理解机器学习算法。坦率地说,与课程中的其他课程相比,它们相形见绌。《机器学习的数学》旨在介绍机器学习中微积分和线性代数的各种实现,但短片和练习作业的缺乏使概念难以坚持,难以理解,并让您比以前更加困惑。

这就是可汗学院的用武之地。Khan Academy 为机器学习的数学中引入的每个概念提供了详细的解释。通过关注可汗学院 Coursera 课程引入的主题,它大大减少了微积分和线性代数所需的时间。对于我们在数据科学中的应用,有些主题比其他主题更重要。可汗学院的主要缺点是缺乏任务,但不要担心,因为当你进入机器学习算法时,你会得到大量的练习。

可汗学院对所有人都是免费的,你可以免费旁听 Coursera 课程。

https://www.youtube.com/channel/UCYO_jab_esuFRV4b17AJtAw

这里还要特别提一下。3Blue1Brown 的《线性代数精要》在为常见的线性代数运算提供直观性方面做得很好。这一系列 youtube 短视频绝对值得一看,不会占用你太多时间。

麻省理工学院吉尔伯特·斯特兰教授的线性代数课程也很受欢迎。我还没有浏览过这些材料,但是考虑到矢量化实现在机器学习中的重要性,我一定会在不久的将来参观这个课程。

Python 编程

为什么是 python?对我来说,与 R 相比,我喜欢它是一种通用语言,语法对我来说也很直观,很容易掌握。

来自 Udemy 的完整 Python 训练营在教授语法、面向对象编程方面做得相当不错,并且提供了 Jupyter 笔记本作业来练习。这对初学编程的人来说是很棒的,Jupyter 笔记本作业是一个加分项。开始习惯 Jupyter 笔记本,因为它无疑是我们工具箱中最重要的工具之一。对于那些有编程经验的人来说,你最好阅读官方的 python 文档

另一方面,MITx 的两门课程(Python 中的计算机科学和编程入门,计算思维和数据科学入门)都值得仔细研究。编程语言很像自然语言,需要练习。每周的习题集、测验和考试给你充分的练习机会,评分员会对你的代码提供即时的反馈。计算思维和数据科学也涉及数据科学技术,如优化算法、蒙特卡罗模拟、随机漫步和其他有用的技能。对我来说,这是最接近真实课堂环境的了。完成每个问题集后的成就感强化了你的理解,激励你走得更远。

再次强调,旁听 MITx 课程是免费的,但是每张证书的费用是 75 美元,并且有资格获得 edX 90%的经济资助。

这就是这个系列的全部内容。接下来,我将讨论机器学习和深度学习的课程。

我个人的建议是处理这些课程

  1. 好好计划你的时间表。edX 上提供的大多数课程都是教师指导的,这意味着你的作业有评分的最后期限
  2. 以 1.5 到 2 倍的速度观看视频
  3. 记笔记
  4. 如果你没有马上理解这个概念,不要太担心,当你应用这些知识的时候,重新审视它们
  5. 申请,申请,申请。做一些项目,研究有趣的数据集,在 kaggle 上竞争

“我没有特殊才能。我只是强烈好奇。”

阿尔伯特·爱因斯坦

这是我的 Github 链接,里面有更多资源和一些数据科学电子书的可下载 pdf 文件https://github.com/Benlau93/Data-Science-Curriculum

对于该系列的第 2 部分,点击此处

数据科学解密:什么是样条?

原文:https://towardsdatascience.com/data-science-deciphered-what-is-a-spline-18632bf96646?source=collection_archive---------3-----------------------

本周在德国实验室的一次会议上,我有了一个认识。我们没有使用正常人的语言。有趣的是,数学术语是如此神秘,而事实上,它们(通常)指的是不那么复杂的东西!

本周,术语是拟合一条基本样条,起初让我大吃一惊。让我们仔细分析一下。

**免责声明:在你进一步阅读之前,这篇文章中没有数学。我将尝试研究样条,使它们在更简单的术语中有意义。如果你正在寻找一个已被证实的样条的数学定义, 查阅本章 **

合适才有意义

“适合”这个词并不可怕。我们一直在用这个词!试衣、在电梯里试衣、穿旧衣服——仅举几例……令人惊讶的是,数学术语“试衣”的意思几乎是一样的。

比方说,你正在购买一些新的自行车鞋。你怎么知道你有一个“完美的契合”?如果鞋子太松,你的脚会扭动。如果鞋子太紧,你会有意外的拇趾囊肿。很难找到完美的契合。你可能不得不以某种方式妥协,在太紧和太松之间找一双鞋。

现在想象一下图表上的一堆数据点。假设你想找到一条符合这些点的线。“拟合曲线”基本上意味着找到一条尽可能接近数据的曲线。这很像找到一双完美的鞋子。你的数据点(你的脚)通常是独一无二的,你穿的线(鞋子)看起来很可能与数据不完全一样。

看看这条符合一组数据的线:

请注意,最终曲线并没有穿过每个数据点。相反,它找到了一个很好的中间地带。这个中间地带是由你选择适合的数学函数/算法决定的。听起来很奇怪,你可以说今天你通过一个可变阻尼因子的高斯-牛顿算法探索了数据拟合曲线。或者你可以说你找到了一双新的自行车鞋。

样条是…

这是什么…一束仙人掌刺?

可惜不是。😦

维基百科的定义:“由多项式分段定义的函数”也没有多大帮助。这个定义假设你知道一个多项式分段函数意味着什么。这可能是下一篇数据科学解密文章的好主题(是的,我希望做得更多!).

让我们用更简单的术语来说。你用过 PowerPoint 上的线条工具吗?如果不是,这基本上可以概括为:

原来,PowerPoint 知道怎么做样条!样条曲线将曲线加在一起,形成连续的不规则曲线。使用此工具时,每次点击都会为线条创建一个新区域,或一个线段。每次点击还会创建一个所谓的控制点,或者决定曲线形状的点。

这就是样条的要点。他们用不规则的数据点创建平滑的曲线——很酷,对吧?!

好了,基础样条

基本样条只是一种样条形式。根据您使用的类型,样条曲线的外观可能会有所不同。这是有道理的——有许多不同的方法可以通过数据点形成一条线。

以这张图片为例:

source

每条彩色线都是不同类型的样条线。红线是一种基本样条!

为什么要用基样条拟合曲线?

这个问题有点超出了本文的范围。本质上,当您想要将一堆点拟合为平滑曲线,但不确定数据点的基本结构是什么时,这些类型的线非常有用。

数据有时是不可预测的:

基础样条有助于理解它!

数据科学转移

原文:https://towardsdatascience.com/data-science-diversions-33d741087506?source=collection_archive---------2-----------------------

2017 年 4 月 21 日

如果您喜欢像这样的内容每周出现在您的收件箱中,请注意这是数据科学社区时事通讯的一部分。报名 这里

Street art by unknown artist. Gowanus Brooklyn 2017. Photo by Laura Norén

在每周撰写数据科学时事通讯的过程中,我会遇到一些与大学、公司或政府无关的故事,但仍然值得一读。有时,它们是关于数据科学的伦理影响的很好的长篇读物。有时候,我也会收录播客片段。但本周的故事大多很有趣,而且都是书面的(这次没有播客,但一定要发给我你喜欢的数据科学剧集)。

和你的伴侣吵架?有一个应用程序可以做到这一点!南加州大学的夫妇移动传感项目(多好的名字)的研究人员让 34 对夫妇捕捉他们的语音和 GPS 坐标,同时可穿戴设备测量他们的皮肤电导率、身体活动和体温。34 对夫妇中有 19 对在一天的收集期内发生了冲突。(我感觉到,这些夫妇中的一方可能比另一方更热衷于这个研究项目,制造了否则可能不会发生的冲突。啊,我们以科学的名义做的事情。)机器学习过程在 79.3%的时候准确地预测了冲突。希望这些预测可以让手机上的应用程序提供“有用的建议”来缓解冲突。给一对争吵不休的夫妇增加两部智能手机,我并不觉得这是个好主意。

J 范德比克把水厂的奖金从骰子显示的 4 倍提高到 7 倍。如果玩家还拥有电力公司呢?费用从 10 倍到 17 倍不等。

摄影师摩根·特林布尔阿什利·罗布森** 预测 非洲 75%的大象因偷猎而“失踪”。深感悲哀,一点也不好玩。**

在密歇根大学的地球 222/环境 232 课程中,一位教授记录了学生使用电脑的情况。然后她制作了一张 幻灯片 列出了他们在课堂上在线做的所有事情。有些活动是可以预测的——脸书、纽约时报、购物、他们的编程作业。有些远没那么容易预测:把特朗普总统的头像 PS 到布偶上,聊天时和男朋友分手(不推荐)。

Lego characters at a flea market in New Orleans. 2016. Photo by Laura Norén. Reminding us of youth.

T 何美国人口普查发布了一份关于年轻人生活的引人入胜的描述:《1975 年至 2016 年年轻成年期的经济和人口统计变化》 。【网飞还有一个 有争议的 新原创节目,可以说是关于改变年轻人生活的: 13 个理由 。]

人口普查报告中的一些要点。“超过一半的美国人认为结婚生子对于一个成年人来说并不重要。“在 20 世纪 70 年代,80%的人在 30 岁前结婚。今天,不到 45 岁就结婚的人 10 人中有 8 人
3。“如今,住在父母家中的年轻人比其他任何安排都多:2015 年,三分之一的年轻人,即大约 2400 万 18 岁至 34 岁的年轻人,住在父母家中。”我承认在我写论文的时候,我逃离了纽约几次,去我父母的地下室写论文。他们的地下室是一个非常适合居住的地方。
4。“1975 年,25%的 25-34 岁的年轻男性年收入低于 3 万美元。到 2016 年,这一比例上升至 41%(收入以 2015 年美元计算)。”我们必须开始讨论男人身上发生了什么,尤其是单身男人。我不是在暗示什么因果箭头,只是指出数据显示单身男性在健康结果或工作晋升方面不如已婚男性公平。

Kevin HoofIDEO创建了 一个交互式 字体图 使用卷积神经网络进行聚类。Ho 写道,“选择字体是设计师最常见的视觉决策之一”,但如果没有一个易于导航的目录,他们通常会“依赖于他们以前使用的字体,或者在 serif、san-serif 或 grotesque 等类别中搜索”。在这种情况下,如果我们将创造力定义为在一个人现状之外的领域建立想法,计算的应用可能会导致更多的创造力,而不是更少。

永远的数据科学!

原文:https://towardsdatascience.com/data-science-for-good-9f18fb70e75?source=collection_archive---------21-----------------------

Dubai Data Science community

这个周末,我很荣幸地在 In5 Tech 共同主持了九月份的迪拜数据科学会议。meetup 由迪拜的开放数据科学社区组织,汇集了数据科学家、领域专家和行业领袖的最大聚会。作为 9 月 meetup 的支持者,我有机会与来自金融、安全、运营、航空业甚至天体物理学等各种背景的现场专家交流,了解他们的经验以及他们如何使用数据科学解决复杂的工业挑战!

Kicking off the meetup with Developers coming in from all across UAE!

由于 IBM 是 meetup 的赞助商,我有机会邀请来自迪拜数据科学界的开发人员参加代码征集挑战,这是一项全球性的多年计划,旨在激励开发人员用可持续的软件解决方案解决紧迫的全球问题。2018 年的比赛要求参赛者建立能够显著改善其社区和世界各地备灾现状的解决方案。这一点尤其重要,因为 2017 被列为有记录以来灾难性事件最严重的年份之一,包括火灾、洪水、地震和风暴,我们只会看到这种情况在 2018 年继续。

从事机器学习和数据科学工作的开发人员肯定可以通过解决挑战来提供帮助,例如如何使用机器学习、深度学习和视觉识别来改善关键流程或者能够理解、分析和预测健康&营养需求来改善数据科学服务

除了其他好处(高达 20 万美元的现金奖励!),最具影响力的项目将在 IBM、Linux 基金会联合国人权委员会美国红十字会的帮助下,实施到最需要的社区。

Inviting developers to participate in the Call for Code!

然后,我们以 Sethu Raman 关于数据科学成熟度模型的演讲开始了第一场会议,在此期间,他谈到了数据科学家如何根据多个重要标准评估他们的模型,而不仅仅是评估其性能。这可以通过针对愿景&一致性、风险(治理、风险&合规性)、责任&技术/平台对其成熟度进行评分来实现。Sethu 浏览了几篇论文和令人难忘的防止对抗性 攻击的例子模型可解释性时间,以及减轻&避免在 ML 系统中传播偏见的最佳实践与 Kate Crawford 对解决偏见的建议:使用公平辩论,创建跨学科系统,以及“更加努力地思考分类的伦理”。他的演讲让房间里的数据科学家大开眼界,并让他们意识到,在发布之前,考虑他们的模型的社会影响并根据这样一个成熟度模型进行评估也同样重要。

Sethu sharing A Maturity Model for Data Science

接下来是由 Evgenii Makarov 针对面部标志检测和 MSQRD 如何工作等不同用例的演讲,而其他人如 Vivek Kalyanarangan 演示了像这样的数据科学家使用 Docker 容器部署机器学习模型的基本技能

Facial Alignment by Evgenii & Deploying ML Models using Docker by Vivek

下一个有趣的演讲是由 Pavel Golubev 做的,关于使用马尔可夫决策过程(MDP)来优化航空公司的机上餐食。Pavel 带我们了解了 S7 航空公司项目的商业和技术方面(如果你喜欢乐队 OK Go ,你可能会认出他们)。了解正在解决的核心业务问题(每月大量未消费的机上餐食)是非常有趣的,它与公司的年度 KPI 以及项目的实际实施相关联——从了解为什么 MDP 与线性模型相比是一个很好的 ML 选择,以及通过识别主要代理、状态、行动、成本函数&转移概率来应用 MDP 来构建解决方案的模型。然后,他向我们展示了这是如何与正确的项目团队一起推出的,并通过他们的调度投入生产,使用针对 Python 的 MDP 工具箱的大规模修改版本来安排&预订系统。这个相当简单的 ML 实现将膳食过剩从 80%减少到只有 12%!

Pavel speaking about optimising S7’s onboard meal ordering system

最后,最后一场会议是关于帕维尔·内斯特罗夫使用开源 RASA 工具创建聊天机器人的简短讨论,他向我们展示了一个 Jupyter 笔记本,展示了数据科学家如何使用 RASA 核心创建聊天机器人。

Pavel speaking about open source vs proprietary tools for chatbots

meetup 最精彩的部分是与来自不同行业的开发人员会面,了解他们如何使用多种数据科学工具应用描述性、预测性和规范性分析来解决复杂的业务问题。这真的让你大开眼界,看到了使用数据科学解决挑战性问题的全部能力&我迫不及待地想看到迪拜数据科学界如何通过构建成熟的模型和开发备灾和救灾的可持续解决方案来充分利用这些技能。

想学以致用吗?在【http://callforcode.org】独自或组队参加一场有意义的全球在线比赛。了解开发人员如何通过更好的灾难准备来尽自己的一份力量,让世界变得更美好。当然,现金奖对获奖者的奖励只是奖金!
您也可以参加我们在
meetup.com/IBMCloud-Dubai/举办的下一次开发者聚会

真实的数据科学

原文:https://towardsdatascience.com/data-science-for-real-c09f088b6550?source=collection_archive---------9-----------------------

借助高级分析和机器学习实现物业管理转型

“它是有形的,它是坚实的,它是美丽的。从我的角度来看,这是艺术,我就是喜欢房地产。”- 唐纳德·特朗普

我通常不同意特朗普总统的观点。事实上,恰恰相反。尽管——关于房地产——我们似乎有共同的爱好。

几千年来,房地产一直是财富的代名词,帮助人们积累了大量财富,未来几代人可能还会继续如此。通过房地产投资创造价值的一个关键因素是健全的物业管理。

虽然已经开发了久经考验的财产管理技术,但其中许多方法是在模拟世界中开发的。我们现在生活在一个设备变得越来越智能、万物互联、算法正在抢走我们工作的时代。我们已经从模拟转向数字。在这个新的数字时代,物业经理仍然扮演着重要的角色,但我们现在越来越有能力让他更有效率,让他把时间花在对业务有更大影响的任务上。

房地产公司可以通过多种方式利用数据科学来改善物业管理——从集成智能建筑技术到为租户管理实施机器学习模型。本文将讨论为使用这些技术做准备的一些方法,并展示高级分析和机器学习模型在物业管理中的具体用例。

跑之前先走

使用机器学习算法来推动利润听起来很酷——它可能是价值的巨大驱动力,但在这些技术能够得到充分利用之前,需要对业务流程、结构和治理有所了解。

过程

首先,应该清楚地理解和定义业务流程。业务流程管理,或者被从业者称为 BPM,可能已经过时了,但是仍然可以从绘制流程图和分析流程中获得有价值的见解。BPM 可以清楚地了解当前的流程,并且更容易看到流程的哪些部分可以用新技术改进,哪些应该保持原样。对您的流程采用模块化方法,并分析每个步骤中所需的输入和输出。始终考虑简化和标准化的方法,因为这将使数字化和自动化更加容易。

从电子表格到数据库

像微软的 Excel 这样的电子表格程序取得了巨大的成功。它们被世界上数百万的企业所使用,对于许多特殊的任务,它们表现得非常好。但当涉及到报告和更高级的任务时,电子表格可能会很麻烦,容易出错,并且无法提供模型所需的正确数据。当然,您可以通过集成 Visual Basic 代码使您的工作表变得智能,并创建伟大的宏,但这可能很难开发出一个潜在的噩梦来维护。

就其本质而言,易于操作和更改,电子表格并不是报告和其他日常任务的理想解决方案。这几乎肯定会导致错误和模糊性的增加。从电子表格转向更像数据库的世界,使得机器学习算法更有效地应用于问题成为可能。在一个更加结构化的系统中,任务可以被更大程度地分析和自动化。这对于想要涉足数据科学的公司来说至关重要。

数据治理

如何处理数据,如何保护和存储数据,谁可以插入、更新或删除记录,这些都是数据治理中的关键问题。企业从数据治理中受益,因为它有助于确保数据的一致性和可信性,并符合法规约束。

从数据科学的角度来看,数据的质量和一致性至关重要。老话“垃圾进,垃圾出”在训练和使用机器学习模型时尤其适用。没有好的数据,模型会变得更弱,它们的输出和预测会变得不可信。因此,强烈建议在实施高级机器学习项目之前,建立一个良好的数据治理流程。

使用数据科学

有了正确的流程、数据治理和架构支持,现在是时候在数字化之旅中勇往直前了。数据科学——将高级分析和机器学习模型应用于行业问题——是下一个自然的步骤。下面是几个例子,说明如何利用这项技术来加强物业管理。

租户流失

客户流失建模是数据科学的经典应用之一。几十年来,银行、保险和电信等行业一直使用客户流失模型来预测客户行为,它在物业管理方面也有明显的用例。

在其最简单的形式中,流失模型是一个二元分类模型,给定一组预测值或输入变量,输出一个分类。例如,如果租户租用一个单元,流失模型可以用来预测租户在给定的时间范围内(例如 1 年)离开的概率。

有了这些知识,物业经理可以更好地了解租户组合将如何随着时间的推移而变化,以及哪些单元可能会很快可用。这将使经理能够主动锁定高流失率的候选人,并为他们延长合同提供激励。此外,该模型可以突出哪些单元可能需要在未来被填充,从而可以减少单元的空缺期。

流失模型也可以有效地用作大型预测模型的组件,其中流失的概率被纳入未来现金流,并在广泛的租户群体中进行汇总。通过这样做,一家房地产公司可以对其现金流做出更准确的预测,从而在不增加风险的情况下增加其总杠杆。最终,导致更有效地利用资本。

房地产公司认真对待租户管理的一个例子是 Spire 物业管理。他们使用 MRI(一种专用的房地产软件解决方案)来帮助防止客户流失。据 Spire 的执行董事肖恩·保罗称,他们使用 MRI 来“简化客户关系管理……组织、自动化和评估其保留工作——跟踪租赁和租赁周年纪念、租户记录、维护活动和工作订单”。有效地为物业管理公司和租户创造双赢的解决方案。

为新租户带来商机

你知道谁是你最好的房客吗?他们是有最高支付意愿和能力的人,还是那些总是延迟支付以便你可以收取滞纳金的人?或者,最好的租户可能是一至两年周转期短的租户,这让你有机会签订新合同并提高租金。这个问题的答案无法通过机器学习模型来回答,而是应该从商业角度进行评估,与公司的整体战略保持一致。

一旦明确定义了最佳租户,并且公司知道它想要谁作为租户——请记住,这可能因建筑而异——就有可能使用机器学习算法来绘制出这些理想租户的特征。然后,可以在各种潜在客户列表中运行该功能集,以确定哪些客户有可能成为最佳租户。当特征集丰富而复杂时,机器学习模型通常在超人的水平上执行这种类型的分类,并且比人类好得多。

对于商业房地产,也有一些供应商帮助公司产生线索,增加销售。Vainu 就是这种公司的一个例子。他们成立于 2013 年,正在使用机器学习模型和大型数据库来辅助销售过程。房地产公司 Technopolis 的一项案例研究显示,与以前相比,他们在销售机会挖掘方面所用的时间减少了三分之一。这种类型的解决方案可能特别适用于希望增加其商业单位销售线索的物业经理。

员工的位置优化

考虑下面的场景。一家公司拥有两栋带有几个单元的办公楼,并且有员工使用这两栋楼。由于意想不到的情况,办公空间的使用出现了不平衡,导致一栋建筑超负荷使用,而另一栋却未得到充分利用。这种次优情况如何用技术改善?

使用分析和传感器系统,可以监控员工的位置,并且可以配置自动消息系统来通知员工不平衡,并引导该组的子集到较少占用的空间。这种类型的优化工作实施起来并不困难,但如果经常出现不平衡,可以节省大量资金,并可以减少办公空间的总体使用量。

智能建筑技术

智能建筑技术有望让物业经理受益匪浅。有些创新相当新,它们的潜力还没有完全发掘出来,但有几个用例非常突出。

预测性维护

预测性维护可以帮助您在建筑物出现问题之前发现问题,从而采取措施防止故障或限制维修造成的停机时间。这可以使维护人员更加有效,从而降低成本,并可能增加设备的总寿命。对于租户来说,缩短关键基础架构维修的停机时间也是有利的。

使用预测性维护技术的第一步是为需要监控的设备添加传感器。来自这些传感器的数据然后被收集在数据库中,并且在操作一段时间后,关于系统操作的时间序列数据被累积。假设我们有足够的观察结果,那么时间序列就包含了建立预测系统下一次故障的机器学习模型所需的数据。

这些机器学习模型通常是分类模型或回归模型。在分类模型的情况下,我们将尝试预测在接下来的 n 个时间步骤内失败的概率。通过回归模型,我们可以预测下一次故障之前还剩多少时间,这通常被称为“剩余使用寿命”。无论选择哪种模型,都将取决于系统的类型和建模可用的数据。

建筑信息建模

建筑信息建模,简称 BIM,是智能建筑领域的另一项激动人心的技术发展。基本的想法是,该建筑有一个完全相同的数字孪生与示意图和三维模型。虽然许多建筑公司使用 BIM 来帮助他们的建筑过程,但他们也可以在物业的生命周期内提供显著的优势,从而帮助物业经理。

BIM 对物业管理有用的一个典型例子是当建筑中的系统出现故障时。由于建筑本身具有完整的 3D 模型,维护工程师可以在穿越建筑时使用增强现实,并在进行维修时获得关键的建筑信息。可以提供给工程师的数据包括服务历史记录、系统规格和合同信息,使维修过程更容易、更快,并且与预测性维护一样,还可以缩短关键基础设施的停机时间。

超越物业管理

值得注意的是,我们主要讨论了如何利用数字化和数据科学来改善物业管理。这当然只是房地产行业的一个子集,对于整个行业来说,数据科学还有很多其他可能的应用领域。机器学习模型现在被用来预测从价格和租金收入到人口趋势的任何事情。随着我们继续使用更多的物联网设备和算法变得更好,我们肯定会看到更多的用例发展。

通过使用新兴的数字技术,有许多方法可以加强物业管理。但是,为了充分利用分析和机器学习方面的最新进展,一个组织需要一定程度的数字成熟度。然而,一旦达到这个阈值,数据科学就可以以多种方式使用。通过更好地了解租户及其流失情况,或者通过使用预测性维护技术和 BIM 模型,可以节省成本,通过销售线索挖掘模型可以增加销售额。

如果您喜欢这篇文章,并希望看到我的更多内容,或者希望使用我的服务,请随时在 https://www.linkedin.com/in/hans-christian-ekne-1760a259/的 LinkedIn 上与我联系,或者访问我在 https://ekneconsulting.com/的网页,查看我提供的一些服务。如有任何其他问题或意见,请发邮件至hce@ekneconsulting.com给我。

感谢阅读!

参考资料:

[## 磁共振成像软件-解放你的房地产业务

MRI 软件提供创新的房地产解决方案,解放您的公司。了解我们的开放和互联…

www.mrisoftware.com](https://www.mrisoftware.com/) [## 租户流失会如何影响盈利能力

租户,作为商业建筑的主要收入来源,是关键,因此租户保留应该是首要的…

www.bizcommunity.com](http://www.bizcommunity.com/Article/196/567/158822.html) [## 预测性维护的机器学习技术

在这篇文章中,作者探讨了如何建立一个机器学习模型来进行系统的预测性维护…

www.infoq.com](https://www.infoq.com/articles/machine-learning-techniques-predictive-maintenance) [## 什么是数据治理(DG)?-WhatIs.com 的定义

数据治理(DG)是对数据的可用性、可用性、完整性和安全性的全面管理…

searchdatamanagement.techtarget.com](https://searchdatamanagement.techtarget.com/definition/data-governance) [## 什么是 BIM |建筑信息建模| Autodesk

BIM(建筑信息建模)是一个智能的三维模型为基础的过程,给建筑,工程和…

www.autodesk.com](https://www.autodesk.com/solutions/bim)

创业数据科学:博客->书籍

原文:https://towardsdatascience.com/data-science-for-startups-blog-book-bf53f86ca4d5?source=collection_archive---------9-----------------------

Publishing a blog series as a book.

数据科学家写书有很多令人信服的理由。我想更好地理解新工具,并记录我过去在行业中的一些经验。基里尔·叶列缅科也声称写作让你更快乐、更善解人意、更有效率。

我实现这个目标的最初方法是使用 Medium 发布一系列关于走向数据科学的博客文章。我的第一篇文章反响很好,我分享的后续文章也得到了很好的反馈。一旦我在这个系列上取得了一些好的进展,我就受到启发,使用“基于博客的同行评审”来写一本书。这种方法是由加州大学圣克鲁斯分校的教授诺亚·沃德里普-弗鲁恩在创作他的书《表达处理》时首创的。我没有采用这种正式的方法来进行同行评审,但是在将博客文章转化为书籍章节时,我采纳了反馈意见。

这个过程的结果就是《创业公司的数据科学》这本书。它以多种格式在线免费提供,印刷版也免版税。书中所有例子的代码都可以在 Github 上找到,我也发布了这本书的源代码。以下是一些格式:

在这篇文章中,我将讨论用来创作这本书、构建这本书和自助出版的工具,以及我使用的写作过程。

工具作业

对于创作内容,我使用 Medium 来编写作为博客帖子的章节初稿。与其他编辑器相比,我喜欢使用 Medium 进行写作,因为我不必担心格式问题,有一个内置的拼写检查器,并且很容易包含代码片段。在使用该平台一段时间后,我发现它为创作提供了一个很好的流程。在创作一本书时,缺少一些有用的功能,例如能够引用图表、代码块或参考书目条目,但它确实提供了一个很好的起点。

为了构建这本书,我使用了 bookdown 包,这是一个 R 库,它将 R markdown 文件转换为 PDF、epub 和 web 格式,以便出版一本书。因为它基于 R markdown,所以您可以使用 R 代码来生成可视化,作为图书编译过程的一部分。将 Medium posts 转换成 R markdown (Rmd)文件需要做一些工作,我将在下一节详细讨论。过去,我用 LaTeX 写论文。对于这本书,我发现 bookdown 更容易使用,不会失去对内容布局的控制。当使用 bookdown 构建 PDF 时,库首先将 R markdown 转换为 TeX 文件,然后使用 Pandoc 生成输出文件。

出版方面,我用的是 Kindle Direct Publishing,现在有了平装本选项。KDP 提供了很好的工具来审查书籍内部的内容,提供了一个有用的封面设计师,并提供了各种各样的书籍尺寸。你的书出现在亚马逊市场上只需要几天时间。我也探索了使用 CreateSpace 和 Lulu,但发现 KDP 有最好的打印质量价格。

写作

我很清楚我想在这本书里涵盖什么内容,我在我的介绍帖子里做了概述。然而,我并没有一个完全实现的计划,来计划我将构建什么样的系统,然后在本书中介绍这些系统。理想情况下,我想做一个完整的游戏分析平台,然后在不同的章节中讨论这个系统的不同部分。实际上,我构建了数据平台各部分的 MVP,并使用公开可用的数据集来减少我在撰写章节之前需要做的系统构建工作。在撰写技术书籍时,了解您采用以下哪种方法来创作内容是很有用的:

  1. 建立一个系统,然后记录它是如何工作的
  2. 编写介绍不同主题的教科书

我从第一种方法开始,然后在写作过程中转向第二种方法。我应该从一开始就决定采取哪种方法,并坚持下去。

因为我已经有了一个很好的大纲,我想涵盖的内容,我把重点放在按顺序写每一章。以下是我使用的过程:

  1. 创建章节大纲
  2. 为章节中的教程编写代码
  3. 创建可视化效果和代码片段
  4. 写下这一章的正文部分

我发现第二步通常花费最多的时间,尤其是在探索新工具时,比如使用 Google Datastore。

一旦我在 Medium 上发布了帖子,我就需要将帖子转换成 Rmd 格式。为此,我将文章中的文本复制到一个新文件中,添加了部分和子部分的标题,添加了代码块标识符,用脚注替换了超链接,并使用 knitr 中的 include_graphics 函数添加了图像。我还抽查了产生的章节输出,并修改了间距以消除孤儿和其他文本工件。我还修复了媒体上突出显示的或回复中提到的任何错别字。

我的建议是,在写一本技术书籍时,如果可能的话,尽早锁定工具,并留出比你认为写一本书所必需的时间更多的时间,尤其是如果你打算在写作过程中学习一些新东西的话。总的来说,我发现这种体验很有价值,并会推荐更多的数据科学家来尝试一下!

创业数据科学:商业智能

原文:https://towardsdatascience.com/data-science-for-startups-business-intelligence-f4a2ba728e75?source=collection_archive---------1-----------------------

roleSource: rawpixel at pixabay.com

我正在进行的关于在初创公司建立数据科学学科的系列文章的第四部分。你可以在 简介 中找到所有帖子的链接,还有一本基于这个系列的关于 亚马逊 的书。

在初创公司建立数据科学涉及的大量繁重工作是说服产品团队使用仪器并关心数据。如果你能够实现这个目标,下一步就是能够回答你的组织内所有关于产品健康的问题。数据科学家新手可能会认为这类工作超出了数据科学家的职责范围,但确定产品健康的关键指标是该角色的核心方面之一。

我将这篇文章命名为商业智能,因为一旦你建立了数据管道,初创公司的数据科学家就应该回答所有关于数据的问题。考虑到新的数据洪流,这并不奇怪,但也是数据科学家为组织的其他人设定期望的时候了。作为一名初创公司的数据科学家,你的职责不是回答数据问题,而是告知领导层哪些指标应该是重要的。

这篇文章讲述了如何将原始数据转化为可以总结产品健康状况的成熟数据的基础知识。我将讨论在处理原始数据时采用的几种不同的方法,包括 SQL 查询、R markdown 和供应商工具。总的来说,就是展示处理数据集有几种选择,您应该选择一种适合您团队目标的解决方案。我将讨论过去使用 Tableau 等工具的经验,并提供在团队中扩展自动化报告的建议。

在这篇文章中,我们将使用两个数据源。第一个是公共数据集,我们将使用关键指标对其进行汇总和总结。第二个是本系列第二章中跟踪 API 生成的数据。我们将关注用于将原始数据转换为已处理数据的第二个数据集,以及用于将已处理数据转换为熟数据的第一个数据集。

KPI

关键绩效指标(KPI)用于跟踪初创公司的健康状况。为了确定对产品所做的改变是否有益,跟踪捕捉参与度、保留率和增长的指标是很重要的。作为一家初创公司的数据科学家,你的职责是确定哪些指标是重要的。该职能与领域知识的数据科学能力相一致,是数据科学家极具影响力的领域之一。

由早期数据科学家建立的 KPI 可能会产生巨大的影响。例如,我过去工作过的许多公司的公司目标都是基于数据科学家过去的分析。在电子艺界,我们专注于提高会话指标,在 Twitch,我们希望最大限度地提高观看内容的数量,在索尼在线娱乐,我们希望提高免费游戏的保留指标。这些是游戏行业的衡量标准,但还有更通用的衡量标准,如参与度、增长和货币化,这些在创建公司时非常重要。

在初创公司建立数据科学学科时,确保您的团队从事高影响力的工作非常重要。我在过去的公司看到的一个问题是,数据科学家被拉入数据工程和分析类型的工作。当公司只有一名数据人员时,这是意料之中的,但是您不希望支持太多无法扩展的手动数据流程。这就是为什么为报告和分析建立可重复的方法是重要的。几个月后重新运行一个分析应该是微不足道的,并且其他团队成员在最少的指导下也可以这样做。

我对新数据科学家的主要建议是,为防止被产品经理和其他团队的请求淹没,为数据科学团队建立一个接口,缓冲直接请求。与其让公司的任何人都能够询问数据科学团队事情的执行情况,不如设置一组基线仪表板来跟踪产品性能。鉴于数据科学家可能是初创公司的首批数据角色之一,这一职责最初将由数据科学家承担,为了在初创公司支持这一职能,熟悉许多不同的工具非常重要。

用 R 报告

作为一名数据科学家,您在创业时可以实现的一个关键转变是从手动报告流程迁移到可重现的报告。对于这种类型的工作来说,r 是一种强大的编程语言,它可以以多种不同的方式提供自动化的报告功能。本节讨论如何使用 R 来创建绘图、生成报告和构建交互式 web 应用程序。虽然 Python 和 Jupyter suite 也提供了许多这样的功能,但是对自动化的关注比用于实现这一目标的语言更重要。

用 Excel 或 Google Sheets 可以实现这类功能,但我建议初创公司不要用这种方法。这些工具非常适合创建演示图表,但不适合自动报告。对于数据科学家来说,基于这些类型的报告来支持一家初创公司是不可持续的,因为可能需要如此多的手动步骤。像 Excel 中的 ODBC 这样的连接器对于自动化来说似乎很有用,但是当试图在另一台机器上运行报告时可能就不起作用了。

本节涵盖了用 R 构建报告的三种方法:直接使用 R 创建图,使用 R Markdown 生成报告,以及使用 Shiny 创建交互式可视化。本节列出的所有代码都可以在 Github 上获得。

Base R
幸运的是,有一个公共数据集可以帮助回答这类问题:BigQuery 的纽约出租车和豪华轿车出行公共数据集。此旅行数据集合包括付款信息,您可以使用这些信息来确定付款类型随时间变化的趋势。

我们将用来回答这个问题的第一种方法是使用 R 中的绘图库来创建一个绘图。采用这种方法时,我推荐使用 RStudio IDE 。此外,这种方法实际上不是“Base R ”,因为我使用了两个额外的库来完成汇总数据集和绘制结果的目标。我将这个部分称为 Base R ,因为我使用了 R 的内置可视化功能。

R 的一大优点是有各种不同的库可用于处理不同类型的数据库。BigQuery库为 big query 提供了一个有用的连接器,可以用来从 R 脚本中的公共数据集中提取数据。下面显示了用于汇总一段时间内的支付历史并将结果绘制成图表的代码。

library(bigrquery)
library(plotly)
project <- "your_project_id"sql <- "SELECT  
  substr(cast(pickup_datetime as String), 1, 7) as date
  ,payment_type as type 
  ,sum(total_amount) as amount
FROM `nyc-tlc.yellow.trips`
group by 1, 2"df <- query_exec(sql, project = project, use_legacy_sql = FALSE)
plot_ly(df, x = ~date, y = ~amount, color = ~type) %>% add_lines() 

该脚本的第一部分包括除最后一行之外的所有内容,负责从 BigQuery 中提取数据。它加载必要的库,声明要运行的查询,并使用 bigrquery 获取结果集。将数据放入数据框后,脚本的第二部分使用 plotly 库将结果显示为折线图。脚本中排除了一些额外的格式化步骤,完整的代码清单可以在 Github 上找到。在 RStudio 中,图表将在 IDE 中显示为交互式绘图,Jupyter 也提供了类似的功能。下面的图表显示了这段代码的结果。

Monthly Spending by Payment Type

该查询使用 2009 年至 2015 年的数据,按支付类型计算纽约市出租车旅行的每月总支出。结果显示,信用卡(CRD)现在是比现金(CSH)更受欢迎的支付方式。要回答最初关于实现哪种类型的支付系统的问题,我建议从接受信用卡的系统开始。

此时值得一提的一个话题是数据质量,因为图表中有许多不同的标签似乎代表相同的值。例如, CASCSH 都可能指现金支付,应该组合在一起以获得准确的现金支付总额。处理这类问题超出了这种方法的范围,但是有一些方法可以用于这类场景。最简单但可伸缩性最差的方法是编写考虑这些不同类型的查询:

,sum(case when payment_type in ('CSH', 'CAS') then amount else 0 end) as cash_payments

可以使用的另一种方法是创建一个维度表,将所有原始的 payment_type 值映射到净化的类型值。这个过程通常被称为属性丰富,在从原始数据或经过处理的数据构建成熟的数据集时非常有用。

我们已经回答了关于确定最流行的支付方式的第一个问题,但如果我们有第二个问题,关于纽约市的交通市场是否在增长呢?我们可以使用现有数据集轻松绘制数据来回答这个问题:

total <- aggregate(df$Amount, by=list(Category=df$Date), FUN=sum)
plot_ly(total, x = ~Category, y = ~x) %>% add_lines()

此代码计算所有不同支付类型的每月总支付额,并将合计值绘制成单线图。结果如下图所示。基于对该数据的初步观察,第二个问题的答案尚不清楚。从 2009 年到 2013 年,纽约市的出租车支出稳步增长,但有季节性波动,但支出在 2014 年夏天达到顶峰。优步和 Lyft 可能解释了这一趋势,但需要进一步分析才能得出明确的结论。

Total Monthly Spending

本节展示了如何使用 R 从 BigQuery 中的汇总数据生成图表。虽然这个示例使用了一个固定的数据集,但是同样的方法也可以用于一个随时间增长的动态数据集,重新运行脚本将会包含更多的最新数据。这还不是自动报告,因为它涉及到在 IDE 或笔记本中手动运行代码。可以使用的一种方法是将绘图输出到图像文件,并作为 cron 作业的一部分运行脚本。这种方法的结果是定期更新的绘图图像。这是一个很好的起点,但是在 r 中还有更好的自动化报告解决方案。

R Markdown
R Markdown 提供了这种能力,可以使用 R 代码生成 pdf、word 文档(DOCX)、网页(HTML)。甚至可以用 R Markdown 写本书!R Markdown 扩展了标准 Markdown,支持可用于生成可视化效果的内联 R 代码片段。嵌入式 R 代码几乎可以执行任何标准的 R 功能,包括使用 R 库和连接数据库。这意味着我们可以将上面的代码转换成 R markdown 文件,并定期运行脚本来构建自动化报告。

下面的 markdown 代码片段是以前的 R 代码,现在嵌入到一个报告中,该报告将生成一个 HTML 文件作为输出。文件的第一部分是关于报告的元数据,包括所需的输出。接下来,markdown 用于向报告添加注释。最后,使用 R 代码块从 BigQuery 中提取数据并绘制结果。运行此报告时,生成的 plotly 对象嵌入到文档中。

---
title: "Business Intelligence"
author: "Ben Weber"
date: "May 21, 2018"
output: html_document
---
## Taxi Payments 
R Markdown can outputs reports as PDF or HTML.```{r echo=FALSE, message=FALSE, warning=FALSE}
library(bigrquery)
library(plotly)
project <- "your_project_id"sql <- "SELECT  
  substr(cast(pickup_datetime as String), 1, 7) as date
  ,payment_type as type 
  ,sum(total_amount) as amount
FROM `nyc-tlc.yellow.trips`
group by 1, 2"df <- query_exec(sql, project = project, use_legacy_sql = FALSE)
plot_ly(df, x = ~date, y = ~amount, color = ~type) %>% add_lines()

生成的 HTML 文档如下图所示。它包括与之前相同的情节,以及在代码块之前列出的降价文本。此输出可能比图像更有用,因为文件中嵌入的 plotly 图表是交互式的,而不是渲染的图像。它对于创建具有各种不同图表和指标的报告也很有用。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2016to2018/-/raw/master/docs/img/09016c0bbaccd14a843c2186688f4ffe.png)

The interactive web page generated from the R Markdown file.

要自动创建该报告,您可以再次设置一个 cron 作业。将 Rmd 文件转换为报告的命令是:

Rscript -e "rmarkdown::render('BI.Rmd')"


我们现在有了一种生成报告的方法,并且可以使用 cron 开始构建一个自动化的报告解决方案。然而,我们还没有提供过滤和深入功能的图表。

**R Shiny** [Shiny](https://shiny.rstudio.com/)是一个直接在 R 中构建仪表板的解决方案,它提供了构建具有过滤和下钻功能的报表的功能,可以作为 Tableau 等工具的替代。使用 Shiny 时,您可以指定要包含在报告中的 UI 组件,以及报告中不同组件的行为,例如基于对 slider 组件的更改应用过滤器。结果是一个交互式的 web 应用程序可以运行您的嵌入式 R 代码。

我已经基于与上述报告相同的代码创建了一个示例 Shiny 应用程序。代码的第一部分是相同的,我们将数据从 BigQuery 拉至 dataframe,但是我们还包含了闪亮的库。代码的第二部分定义了不同组件(服务器)的行为,以及不同组件(ui)的布局。这些函数被传递给 shinyApp 调用以启动仪表板。

library(shiny)
library(bigrquery)
library(plotly)
project <- "your_project_id"sql <- "SELECT
substr(cast(pickup_datetime as String), 1, 7) as date
,payment_type as type
,sum(total_amount) as amount
FROM nyc-tlc.yellow.trips
group by 1, 2"
df <- query_exec(sql, project = project, use_legacy_sql = FALSE)server <- function(input, output) {
output\(plot <- renderPlotly({ plot_ly(df[df\)date >= input$year, ], x = ~date,
y = ~amount, color = ~type) %>% add_lines()
})
}ui <- shinyUI(fluidPage(
sidebarLayout(
sidebarPanel(
sliderInput("year", "Start Year:",
min = 2009, max = 2015, value = 2012)
),
mainPanel(plotlyOutput("plot"))
)
))shinyApp(ui = ui, server = server)


UI 函数指定如何在仪表板中布置组件。我从包含滑块和直方图的 [Hello Shiny](http://rstudio.github.io/shiny/tutorial/#hello-shiny) 示例开始,并修改了布局以使用 plotOutput 对象代替 plot output。滑块指定允许选择的年份,并设置默认值。behavior 函数指定如何响应 UI 组件中的变化。该图与 behavior 相同,但有一处修改,当使用数据帧`df$date >= input$year`时,它现在过滤起始数据。结果是如下所示的交互式仪表板。移动滑块将会过滤图表中包含的年份。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2016to2018/-/raw/master/docs/img/24943b1a3237a8b6cd3daa86f6f07d21.png)

An interactive Chart in R Shiny.

我已经展示了使用 R 生成报告的三种不同方式。如果您需要交互式仪表板,那么 Shiny 是一个很好的工具,而如果您希望构建静态报告,那么 R Markdown 是一个很好的解决方案。这两种方法的一个关键好处是,你可以在你的图表中嵌入复杂的 R 逻辑,比如使用脸书的 [prophet library](https://research.fb.com/prophet-forecasting-at-scale/) 向你的图表添加预测值。

## ETLs

在关于数据管道的文章中,我讨论了使用原始数据、经过处理的数据和熟数据。大多数用于商业智能的报告应该基于熟数据,在熟数据中数据被聚合、丰富和净化。如果您在构建报告时使用经过处理的数据或原始数据,而不是熟数据,您将很快遇到报告管道中的性能问题。例如,不是在上面的 R 部分中直接使用 *nyc-tlc.yellow.trips* 表,我可以创建一个预先计算了聚合值的表。

ETL 是提取-转换-加载的缩写。这些类型的流程的主要用途之一是将原始数据转换为处理过的数据,或者将处理过的数据转换为熟数据,例如聚合表。设置聚合表的一个主要挑战是保持表的更新和准确。例如,如果您开始使用新的缩写(例如 CAH)来跟踪现金支付,您将需要更新计算每月现金支付的汇总流程,以包括这种新的支付类型。

数据管道的输出之一是一个原始事件表,其中包含所有编码为 JSON 的跟踪事件的数据。我们可以设置的一种 ETL 过程是原始数据到已处理数据的转换。在 BigQuery 中,这可以为登录事件实现,如下所示:

create table tracking.logins as (
select eventVersion,server_time
,JSON_EXTRACT_SCALAR(message, '\(.userID') as userID ,JSON_EXTRACT_SCALAR(message, '\).deviceType') as deviceType
from tracking.raw_events
where eventType = 'Login'
)


该查询过滤原始事件表中的登录事件,并使用 JSON 提取标量函数解析 JSON 消息中的元素。运行此 DDL 语句的结果将是跟踪模式中的一个新表,其中包含所有登录数据。我们现在已经处理了带有可以直接查询的 *userID* 和 *deviceType* 属性的登录数据。

在实践中,我们希望逐步构建一个这样的表,只转换自 ETL 过程最后一次运行以来到达的新数据。我们可以使用下面的 SQL 代码中所示的方法来实现这一功能。我们不是创建一个新表,而是插入到一个现有的表中。使用 BigQuery,您需要为插入操作指定列。接下来,我们找到最后一次更新登录表的时间,表示为 *updateTime* 值。最后,我们使用这个结果来连接自上次更新以来发生的登录事件。这些原始事件被解析成已处理的事件,并添加到登录表中。

insert into tracking.logins
(eventVersion,server_time, userID, deviceType)
with lastUpdate as (
select max(server_time) as updateTime
from tracking.logins
)
select eventVersion,server_time
,JSON_EXTRACT_SCALAR(message, '\(.userID') as userID ,JSON_EXTRACT_SCALAR(message, '\).deviceType') as deviceType
from tracking.raw_events e
join lastUpdate l
on e.server_time > updateTime
where eventType = 'Login'


可以使用类似的方法从处理过的数据中创建熟数据。上面登录 ETL 的结果是,我们现在可以直接查询 *userID* 和 *deviceType* 字段。这些经过处理的数据使得按平台计算有用的指标(如每日活跃用户(DAU))变得很简单。下面是在 BigQuery 中计算这个指标的一个例子。

create table metrics.dau as (
select substr(server_time, 1, 10) as Date
,deviceType, count(distinct userID) as DAU
from tracking.logins
group by 1, 2
order by 1, 2
)


运行该查询的结果是一个预先计算了 DAU 度量的新表。烹饪数据表中显示了该数据的一个示例。与前面的 ETL 类似,实际上我们希望使用增量方法来构建这个度量表,而不是使用完整的数据集来重建。这里需要采用稍微不同的方法,因为如果 ETL 在一天中运行多次,那么当天的 DAU 值需要更新多次。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2016to2018/-/raw/master/docs/img/9ac19e7b8f2d238675eb613b6d3e4761.png)

Cooked Data: DAU by Platform

一旦有了一组要为数据管道运行的 ETL,您就需要安排它们定期运行。您可以采用的一种方法是使用 cron 来设置任务,例如:

bq query --flagfile=/etls/login_etl.sql


为这样的流程设置监控非常重要,因为数据管道早期的故障会对下游产生重大影响。诸如 [Airflow](https://airflow.apache.org/) 等工具可用于构建复杂的数据管道,并提供监控和警报。

## 报告工具

虽然 R 确实为执行商业智能任务提供了有用的工具,但它并不总是构建自动化报告的最佳工具。当技术和非技术用户需要使用报告工具时,这是很常见的,并且用于构建仪表板的供应商解决方案通常对这些类型的场景很有用。以下是我过去用过的几种不同的工具。

谷歌数据工作室
如果你已经在使用 GCP,那么谷歌数据工作室值得探索,为你的组织内部共享建立仪表板。然而,它比其他工具稍显笨拙,所以最好推迟构建仪表板,直到您有了要构建的报告的基本完整的规范。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2016to2018/-/raw/master/docs/img/dba749aaa458f1a1e4bcfa8ff8fc1126.png)

Setting up a Custom Data Source in Google Data Studio

上图显示了如何在 Google Data Studio 中设置一个自定义查询,以提取 R 报告中使用的相同数据集。与之前相同的报告,现在用 Data Studio 实现,如下所示。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2016to2018/-/raw/master/docs/img/8667fda5e9ffc681fc8be1cdd382f38c.png)

The Taxi Report recreated in Google Data Studio

这个工具的主要好处是它提供了许多内置于其他工具的协作特性,比如 Google Docs 和 Google Sheets。它还会根据需要刷新报告以防止数据过时,但可用的计划选项有限。

**Tableau** 我用过的最好的可视化工具之一就是 Tableau。当您有一个完整的规格时,它非常适合构建仪表板的用例,以及在执行探索性分析时构建交互式可视化。DC Universe Online 的热图是用 Tableau 构建的,是可以构建的许多不同类型的可视化之一。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2016to2018/-/raw/master/docs/img/477cc103f093317d52a0560c1d37fa91.png)

A heatmap in Tableau for the game DC Universe Online

Tableau 的主要优点是易于构建可视化和探索新数据集。主要的缺点是许可证的定价,以及缺乏 ETL 工具,因为它关注的是表示而不是数据管道。

在 Twitch,我们使用了一个名为 Mode Analytics 的供应商工具。Mode 使得与其他分析人员共享查询变得简单,但是它的可视化功能非常有限,并且只关注于表示,而不是 ETL 类型的任务。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2016to2018/-/raw/master/docs/img/ac874a76d8d49ea9fd83450aaf4d8dec.png)

Line Charts in Mode Analytics

**定制工具** 另一种可用的方法是使用 D3.js 和 Protovis 等工具创建定制可视化。在电子艺界,D3 被用于为游戏团队创建客户仪表盘,例如由 Ben Medler 创建的用于可视化死亡空间 2 中游戏测试数据的[数据破解](https://dl.acm.org/citation.cfm?id=1979288)工具。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2016to2018/-/raw/master/docs/img/0191b5f0dd25c10d5d13c81b8ee2b088.png)

The Data Cracker Tool for Dead Space 2\. Source: GDC Vault 2011

使用定制工具提供了最大的灵活性,但是也需要维护一个系统,并且通常需要做更多的工作。

## 结论

数据科学家在初创公司的一个关键角色是确保其他团队可以有效地使用你的产品数据。通常这采取提供仪表板或其他自动化报告的形式,以便为不同的团队提供 KPI 或其他指标。它还包括确定哪些指标对公司的测量是重要的。

这篇文章介绍了在 R 中设置自动化报告的三种不同方法,从直接在 R 中创建图表,使用 R Markdown 生成报告,到使用 Shiny 构建仪表板。我们还讨论了如何编写 ETL 来将原始数据转换为经过处理的数据,并将经过处理的数据转换为熟数据,以便可以用于报告目的。最后一节讨论了一些不同的报告供应商解决方案,以及它们的优缺点。

在为商业智能设置好工具之后,大部分工作都已经就绪,可以更深入地研究数据科学类型的工作了。我们可以超越回顾性的问题,前进到预测、预测性建模和实验。

# 创业公司的数据科学:数据管道

> 原文:<https://towardsdatascience.com/data-science-for-startups-data-pipelines-786f6746a59a?source=collection_archive---------0----------------------->

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2016to2018/-/raw/master/docs/img/28eb363300e7bb63101590c49d38138f.png)

Source: TheDigitalArtist at pixabay.com

我正在进行的关于在初创公司建立数据科学学科的系列文章的第三部分。你可以在 [*简介*](/data-science-for-startups-introduction-80d022a18aec) *中找到所有帖子的链接,还有一本基于这个系列的关于* [*亚马逊*](https://www.amazon.com/dp/1983057975) *的书。*

建立数据管道是初创企业数据科学的核心组成部分。为了构建数据产品,您需要能够从数百万用户那里收集数据点,并近乎实时地处理结果。虽然我的[上一篇博文](/data-science-for-startups-tracking-data-4087b66952a1)讨论了收集什么类型的数据以及如何将数据发送到端点,但这篇博文将讨论如何处理已经收集的数据,使数据科学家能够处理这些数据。即将发布的关于模型生产的博文将讨论如何在这个数据平台上部署模型。

通常,数据管道的目的地是数据湖,如 S3 上的 Hadoop 或 parquet 文件,或者是关系数据库,如 Redshift。理想的数据管道应该具有以下特性:

*   **低事件延迟:**数据科学家应该能够在事件被发送到数据收集端点的几分钟或几秒钟内,在管道中查询最近的事件数据。这对于测试和构建需要近实时更新的数据产品非常有用。
*   **可扩展性:**一个数据管道应该能够扩展到数十亿个数据点,随着产品的扩展,可能会扩展到数万亿。一个高性能的系统不仅应该能够存储这些数据,还应该能够查询完整的数据集。
*   **交互式查询:**一个高功能的数据管道应该支持长时间运行的批处理查询和较小的交互式查询,使数据科学家能够探索表和理解模式,而不必在采样数据时等待几分钟或几小时。
*   **版本控制:**您应该能够对您的数据管道和事件定义进行更改,而不会导致管道中断和数据丢失。本文将讨论在改变事件模式的情况下,如何构建一个支持不同事件定义的管道。
*   **监控:**如果某个事件不再被接收,或者某个特定区域的跟踪数据不再被接收,那么数据管道应该通过 PagerDuty 等工具生成警报。
*   **测试:**您应该能够使用测试事件来测试您的数据管道,这些测试事件不会出现在您的数据湖或数据库中,但是会测试管道中的组件。

数据管道应该具有许多其他有用的属性,但这是一个创业的良好起点。当您开始构建依赖于您的数据管道的附加组件时,您会想要设置用于容错和自动化任务的工具。

本文将展示如何建立一个可伸缩的数据管道,将跟踪数据发送到数据湖、数据库和订阅服务,以便在数据产品中使用。我将讨论管道中不同类型的数据,数据管道的发展,并通过 PubSub、DataFlow 和 BigQuery 在 GCP 上实现一个示例管道。

在部署数据管道之前,您需要回答以下问题,这些问题类似于我们关于跟踪规格的问题:

1.  谁拥有数据管道?
2.  哪些团队将使用数据?
3.  谁将对管道进行质量保证?

在小型组织中,数据科学家可能负责管道,而大型组织通常有一个基础架构团队负责保持管道的运行。了解哪些团队将使用数据也很有用,这样您就可以将数据传输到适当的团队。例如,营销可能需要登录页面访问的实时数据来为营销活动进行归因。最后,应该定期彻底检查传递到管道的事件的数据质量。有时,产品更新会导致跟踪事件丢失相关数据,应该建立一个流程来捕获这些类型的数据变化。

## 数据类型

根据已执行的修改量,管道中的数据通常有不同的名称。数据通常用以下标签分类:

*   **原始数据:**是未经处理的跟踪数据。这是以用于发送跟踪事件的消息编码格式存储的数据,如 JSON。原始数据尚未应用模式。将所有跟踪事件作为原始事件发送是很常见的,因为所有事件都可以发送到单个端点,并且模式可以稍后在管道中应用。
*   **处理过的数据:**处理过的数据是已经被解码成事件特定格式的原始数据,并应用了一个模式。例如,JSON 跟踪事件被转换成具有固定模式的会话启动事件,这些事件被视为已处理数据。已处理的事件通常存储在数据管道中不同的事件表/目的地中。
*   **熟数据:**经过汇总或汇总处理的数据称为熟数据。例如,处理后的数据可以包括会话开始和会话结束事件,并被用作汇总用户日常活动的熟数据的输入,例如会话的数量和网页在网站上的总时间。

数据科学家通常会处理经过处理的数据,并使用工具为其他团队创建成熟的数据。这篇文章将讨论如何构建一个输出处理过的数据的数据管道,而商业智能文章将讨论如何将熟数据添加到您的管道中。

## 数据管道的演变

在过去的二十年里,收集和分析数据的环境发生了巨大的变化。现代系统可以跟踪活动并近乎实时地应用机器学习,而不是通过日志文件在本地存储数据。初创公司可能希望使用早期的方法进行初始测试,但应该真正寻找更新的方法来构建数据管道。根据我的经验,我注意到了四种不同的管道方法:

1.  **平面文件时代:**数据保存在游戏服务器本地
2.  **数据库时代:**数据存放在平面文件中,然后加载到数据库中
3.  **数据湖时代:**数据存储在 Hadoop/S3 中,然后加载到 DB 中
4.  **无服务器时代:**托管服务用于存储和查询

这一演变中的每一步都支持更大数据集的收集,但可能会引入额外的操作复杂性。对于一家初创公司,目标是能够在不扩展运营资源的情况下扩展数据收集,而向托管服务的发展为增长提供了一个很好的解决方案。

我们将在本文的下一节中介绍的数据管道是基于最新的数据管道时代,但介绍不同的方法是有用的,因为不同公司的需求可能更适合不同的架构。

**平面文件时代**

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2016to2018/-/raw/master/docs/img/706aa30c46d2c6c8d5b4054933780e8c.png)

Components in a pre-database Analytics Architecture

2010 年,我在电子艺界开始研究数据科学,那时 EA 还没有围绕数据建立组织。虽然许多游戏公司已经收集了大量关于游戏的数据,但大多数遥测数据都以日志文件或其他平面文件格式的形式存储在游戏服务器上。没有什么是可以直接查询的,计算月活跃用户(MAU)等基本指标需要大量的工作。

在电子艺界,重播功能被内置到 Madden NFL 11 中,这提供了一个意想不到的游戏遥测源。每场比赛后,一份 XML 格式的比赛摘要被发送到一个游戏服务器,其中列出了每场比赛的叫牌、比赛过程中的走法以及比赛结果。这导致了数百万个文件可以被分析,以了解更多关于球员如何在野外与马登足球互动的信息。

在本地存储数据是目前为止收集游戏数据时最简单的方法。例如,上一篇文章中介绍的 PHP 方法对于设置轻量级分析端点非常有用。但是这种方法有明显的缺点。

这种方法很简单,使团队能够以任何需要的格式保存数据,但是没有容错能力,不将数据存储在一个中心位置,在数据可用性方面有很大的延迟,并且具有用于构建分析生态系统的标准工具。如果您只有几台服务器,平面文件可以很好地工作,但它不是真正的分析管道,除非您将文件移动到一个中心位置。您可以编写脚本将数据从日志服务器拉到一个中心位置,但这通常不是一种可伸缩的方法。

**数据库时代**

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2016to2018/-/raw/master/docs/img/26a7bdbd9df74f0dcac4de800b1abe28.png)

Components in an ETL-based Analytics Architecture

当我在索尼在线娱乐公司时,我们让游戏服务器每隔几分钟就将事件文件保存到一个中央文件服务器。然后,文件服务器大约每小时运行一次 ETL 过程,将这些事件文件快速加载到我们的分析数据库中,该数据库当时是 Vertica。这个过程有一个合理的延迟,从游戏客户端发送事件到数据在我们的分析数据库中可查询大约一个小时。它还可以扩展到大量数据,但需要使用固定的事件数据模式。

当我还是一个 Twitch 时,我们对我们的一个分析数据库使用了类似的过程。与 SOE 的方法的主要区别是,我们没有将游戏服务器 scp 文件放在一个中心位置,而是使用[亚马逊 Kinesis](https://aws.amazon.com/kinesis/) 将事件从服务器传输到 S3 的集结地。然后,我们使用 ETL 过程将数据快速加载到 Redshift 中进行分析。从那时起,Twitch 转向了数据湖方法,以便扩展到更大的数据量,并为查询数据集提供更多选项。

SOE 和 Twitch 使用的数据库对两家公司都非常有价值,但我们在扩展存储的数据量时确实遇到了挑战。随着我们收集更多关于游戏的详细信息,我们不能再在表格中保存完整的事件历史,需要截断超过几个月的数据。如果您可以设置维护这些事件的最重要细节的汇总表,这很好,但是这不是理想的情况。

这种方法的一个问题是,临时服务器会成为故障的中心点。当一个游戏发送了太多的事件时,也有可能出现瓶颈,导致事件在所有游戏中被丢弃。另一个问题是当处理数据库的分析师数量增加时的查询性能。几个分析师组成的团队处理几个月的游戏数据可能会很好,但在收集了多年的数据并增加了分析师的数量后,查询性能可能会成为一个重大问题,导致一些查询需要几个小时才能完成。

这种方法的主要好处是,所有事件数据都可以在一个位置使用 SQL 查询,并且有很好的工具可以使用,如 Tableau 和 DataGrip,用于处理关系数据库。缺点是将所有数据加载到像 Vertica 或 Redshift 这样的数据库中的成本很高,事件需要有固定的模式,并且可能需要截断表来保持服务器的性能。

使用数据库作为数据的主要接口的另一个问题是,Spark 的 MLlib 等机器学习工具无法有效使用,因为相关数据需要从数据库中卸载才能进行操作。克服这种限制的方法之一是以一种格式和存储层存储游戏数据,这种格式和存储层可以很好地与大数据工具配合使用,例如在 S3 上将事件保存为拼花文件。这种类型的配置在下一个时代变得越来越普遍,它避开了需要截断表的限制,并降低了保存所有数据的成本。

**数据湖时代**

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2016to2018/-/raw/master/docs/img/ef013abda5d519e7fd15577b81910709.png)

Components in a Data Lake Analytics Architecture

当我在游戏行业担任数据科学家时,最常见的数据存储模式是数据湖。一般模式是将半结构化数据存储在分布式数据库中,并运行 ETL 过程来提取与分析数据库最相关的数据。许多不同的工具可以用于分布式数据库:在电子艺界我们使用 Hadoop,在微软工作室我们使用 Cosmos,在 Twitch 我们使用 S3。

这种方法使团队能够扩展到海量数据,并提供额外的容错能力。它的主要缺点是引入了额外的复杂性,并且由于缺少工具或访问策略,可能导致分析师访问的数据比使用传统数据库方法时少。在这个模型中,大多数分析师会以同样的方式与数据交互,使用从数据湖 ETL 中填充的分析数据库。

这种方法的好处之一是它支持各种不同的事件模式,并且您可以在不影响分析数据库的情况下更改事件的属性。另一个优势是,分析团队可以使用 Spark SQL 等工具直接处理数据湖。然而,我工作过的大多数地方都限制了对数据湖的访问,消除了这种模式的许多好处。

这种方法可以扩展到大量数据,支持灵活的事件模式,并为长时间运行的批处理查询提供了一个很好的解决方案。不利的一面是,它可能涉及大量的操作开销,可能引入大量的事件延迟,并且可能缺乏针对数据湖的最终用户的成熟工具。这种方法的另一个缺点是,通常需要整个团队来保持系统的运行。这对大型组织来说是有意义的,但对较小的公司来说可能有些矫枉过正。利用数据湖而不产生运营开销的方法之一是使用托管服务。

**无服务器时代**

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2016to2018/-/raw/master/docs/img/6a3cf08638c00d7c7b2172dac81e854b.png)

Components in a managed Analytics Architecture (GCP)

在当前时代,分析平台整合了许多托管服务,使团队能够接近实时地处理数据,根据需要扩展系统,并减少维护服务器的开销。我在游戏行业工作时从未经历过这个时代,但看到了这种转变正在发生的迹象。Riot Games 正在使用 [Spark](https://www.slideshare.net/SparkSummit/video-games-at-scale-improving-the-gaming-experience-with-apache-spark) 进行 ETL 过程和机器学习,并需要按需旋转基础设施。一些游戏团队正在为游戏服务使用弹性计算方法,利用这种方法进行分析也是有意义的。

这种方法有许多与使用数据湖相同的好处,可以根据查询和存储需求自动伸缩,并且操作开销最小。主要缺点是托管服务可能很昂贵,采用这种方法可能会导致使用无法移植到其他云提供商的平台特定工具。

在我的职业生涯中,我在使用数据库时代方法方面取得了最大的成功,因为它为分析团队提供了对所有相关数据的访问。然而,这不是一个可以继续扩展的设置,我工作过的大多数团队后来都转移到了数据湖环境。为了让数据湖环境取得成功,分析团队需要访问底层数据,以及成熟的工具来支持他们的流程。对于初创公司来说,无服务器方法通常是开始构建数据管道的最佳方式,因为它可以根据需求进行扩展,并且只需要最少的员工来维护数据管道。下一节将通过托管服务构建一个示例管道。

## **一个可扩展的管道**

我们将构建一个数据管道,使用 Google 的 PuSub 作为端点来接收事件,并将事件保存到数据湖和数据库中。这里介绍的方法将事件保存为原始数据,但是我还将讨论将事件转换为处理过的数据的方法。

执行所有这些功能的数据管道相对简单。管道从 PubSub 读取消息,然后转换事件以实现持久性:管道的 BigQuery 部分将消息转换为 TableRow 对象并直接传输到 BigQuery,而管道的 AVRO 部分将事件批处理到离散的窗口中,然后将事件保存到 Google 存储中。操作图如下图所示。

![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2016to2018/-/raw/master/docs/img/499a24636ba95726b43c91267311dfc1.png)

The streaming pipeline deployed to Google Cloud

**设置环境** 构建数据管道的第一步是设置编译和部署项目所需的依赖关系。我使用了以下 maven 依赖项来为向管道发送事件的跟踪 API 和处理事件的数据管道设置环境。

Source: 4047259 at pixabay.com

我正在进行的关于在创业公司建立数据科学学科系列的第十部分,第一篇文章从 R 移植到 Python 。你可以在 简介 中找到所有帖子的链接,以及一本基于 R 系列关于 亚马逊 的书。

这篇博文是对使用 Keras 深度学习框架解决经典(浅层)机器学习问题的简要介绍。它展示了一个案例研究,来自我在意外之财数据公司的经历,我在那里研究一个模型,预测美国数亿套房产的房价。

我最近开始与 R 一起阅读“深度学习”,我对 R 对深度学习的支持印象深刻。然而,现在我将我的博客系列移植到 Python,我将直接使用 Keras 库,而不是 R 包装器。幸运的是,这本书还有一个 Python 版本。

[## 使用 Python 进行深度学习

使用 Python 的深度学习介绍了使用 Python 语言和强大的

www.amazon.com](https://www.amazon.com/Deep-Learning-Python-Francois-Chollet/dp/1617294438)

书中介绍的一个用例是预测波士顿的房价,这是一个有趣的问题,因为房价可能会有很大的变化。这是一个机器学习问题,可能最适合经典方法,如 XGBoost,因为数据集是结构化的,而不是感知数据。然而,它也是一个数据集,深度学习提供了一个真正有用的能力,即编写新的损失函数的容易程度,这可能会提高预测模型的性能。这篇文章的目标是展示深度学习如何通过使用自定义损失函数来改善浅层学习问题。

我在处理金融数据时遇到过几次的一个问题是,您经常需要构建预测模型,其中的输出值可能有很大的范围,跨越不同的数量级。例如,在预测房价时会发生这种情况,一些房屋的价值为 10 万美元,而其他房屋的价值为 1000 万美元。如果你在这些问题上使用标准的机器学习方法,如线性回归或随机森林,通常模型会过度拟合具有最高值的样本,以减少平均绝对误差等指标。但是,您实际需要的可能是用相似的权重处理样本,并使用相对误差等误差度量来降低用最大值拟合样本的重要性。

**# Standard approach to linear regression** fit <- lm(y ~ x1 + x2 + x3 + ... + x9, data=df)**# Linear regression with a log-log transformation** fit <- nls( log10(y) ~ log(x1*b1 + x2*b2 + ... + x9*b9), 
   data = df, start = list(b1=1, b2=1, ... , b9 = 1))

我实际上是在 R 中使用诸如非线性最小二乘法( nls )之类的包显式地做到了这一点。Python 也有一个 NLS 库,但是我在解决住房问题时没有探索这个选项。上面的代码示例显示了如何使用内置优化器构建线性回归模型,该优化器将对具有较大标签值的样本进行加权,以及使用 nls 方法,该方法显示了如何对预测值和标签执行对数转换,这将给予样本相对相等的权重。第二种方法的问题是,您必须明确地说明如何使用模型中的特性,这就产生了一个特性工程问题。这种方法的另一个问题是,如果不编写自己的似然函数和优化器,它不能直接应用于其他算法,如随机森林。这是一个针对特定场景的,在该场景中,您希望将误差项排除在对数转换之外,而不是简单地将对数转换应用于标签和所有输入变量。

深度学习为处理这些类型的问题提供了一个优雅的解决方案,其中,您可以探索不同的内置和自定义损失函数,这些函数可以与提供的不同优化器一起使用,而不是编写自定义的可能性函数和优化器。本文将展示如何在使用 Keras 时用 Python 编写自定义损失函数,并展示如何使用不同的方法对不同类型的数据集有益。我将首先展示一个使用 Keras 的分类示例,然后展示如何使用自定义损失函数进行回归。

下图是我将在这篇文章中涉及的内容的预览。它显示了在波士顿房价数据集上训练的四个不同的 Keras 模型的训练历史。每种模型使用不同的损失函数,但是根据相同的性能指标,平均绝对误差进行评估。对于原始数据集,自定义损失函数不会提高模型的性能,但在修改后的数据集上,结果更有希望。

Performance of the 4 loss functions on the original housing prices data set. All models used MAE for the performance metric.

装置

开始深度学习的第一步是建立一个环境。在我过去的帖子中,我提到了在 AWS EC2 实例上设置 Jupyter。我们将为 Python 安装两个额外的库:tensorflow 和 keras。此外,当处理深度学习问题时,加速更大的机器是有用的,例如 t2.xlarge。下面是我用来在 EC2 上建立深度学习环境的步骤。但是,这种配置不支持 GPU 加速。

**# Jupyter setup** sudo yum install -y python36
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
sudo python36 get-pip.py
pip3 install --user jupyter**# Deep Learning set up** pip3 install --user tensorflow
pip3 install --user keras
pip3 install --user  matplotlib
pip3 install --user  pandas**# Launch Jupyter** jupyter notebook --ip *Your_AWS_Prive_IP*

一旦连接到 Jupyter,就可以通过运行以下命令来测试您的安装:

import keras
keras.__version__

输出应该显示正在使用 TensorFlow 后端。

用 Keras 分类

为了开始深度学习,我们将建立一个二元分类器,根据过去的购买情况,预测哪些用户最有可能购买特定的游戏。我们将使用我在关于推荐系统的帖子中展示的数据集。数据集中的行包含指示玩家是否购买了游戏的标签,以及具有值 0 或 1 的其他游戏的列表,其指示购买了其他标题。目标是预测哪些用户会购买游戏。本节介绍的代码的完整笔记本可在这里获得。

使用 Keras 构建模型的一般过程是:

  1. 建立模型的结构
  2. 编译模型
  3. 符合模型
  4. 评估模型

我将在下面更详细地讨论这些步骤。首先,我们需要包含 keras 和绘图所需的库:

import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as tf
import keras
from keras import models, layers
keras.__version__

接下来,我们下载数据集并创建训练和测试数据集。我拿出了 5000 个样本,我们将把它们作为一个维持数据集。对于训练数据集,我将数据帧分成输入变量( x )和标签( y )。

df = pd.read_csv(
"[https://github.com/bgweber/Twitch/raw/master/Recommendations/games-expand.csv](https://github.com/bgweber/Twitch/raw/master/Recommendations/games-expand.csv)")train = df[5000:]
test = df[:5000]x = train.drop(['label'], axis=1)
y = train['label']

现在我们可以创建一个模型来拟合数据。下面的模型使用了三层具有 relu 激活功能的全连接神经元。输入结构在第一层中指定,它需要匹配输入数据的宽度。输出被指定为具有 sigmoid 激活的信号神经元,因为我们正在执行二进制分类。

model = models.Sequential()
model.add(layers.Dense(64, activation='relu', input_shape=(10,)))
model.add(layers.Dropout(0.1))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dropout(0.1))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

接下来,我们指定如何优化模型。我们将使用 rmsprop 用于优化器,使用 binary_crossentropy 用于损失函数。我们将使用 ROC AUC,而不是使用准确性作为指标,因为数据集有很大的类别不平衡。为了使用这个度量,我们可以使用 tensorflow 提供的 auc 函数。

def auc(y_true, y_pred):
    auc = tf.metrics.auc(y_true, y_pred)[1]
    keras.backend.get_session().run(
        tf.local_variables_initializer())
    return auc

model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',metrics=[auc]

最后一步是训练模型。下面的代码显示了如何使用训练数据集、100 个训练时期(批量大小为 100)和 20%的交叉验证拆分来拟合模型。

history = model.fit(x,
                    y,
                    epochs=100,
                    batch_size=100,
                    validation_split = .2,
                    verbose=0)

如果 verbose 设置为 1 或 2,模型的进度将在训练期间显示。为了绘制结果,我们可以使用 matplotlib 来显示训练和测试数据集的损失值:

loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1, len(loss) + 1)plt.figure(figsize=(10,6)) 
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.legend()
plt.show()

结果图如下所示。虽然训练数据集的损失值随着更多的时期继续降低,但是测试数据集的损失在大约 10 个时期后变平。

Plotting the loss values for the binary classifier.

我们还可以在每个时期后绘制 AUC 指标的值,如下所示。与损失值不同,测试数据集上的模型的 AUC 度量随着额外的训练而继续改善。

Plotting the AUC metric for the binary classifier.

最后一步是评估模型在维持数据集上的性能。可以使用下面所示的代码计算维持数据的损失值和 AUC 指标,从而得到约 0.82 的 AUC。

x_test = test.drop(['label'], axis=1)
y_test = test['label']results = model.evaluate(x_test, y_test, verbose = 0)
results

本节讨论了使用深度学习模型和 Keras 框架构建一个简单的分类器。一般来说,深度学习在像这样的浅层学习问题上的表现不如 XGBoost,但它仍然是一种有用的探索方法。在下一节中,我将讨论如何使用自定义损失函数来改进模型训练。

自定义损失函数

深度学习的一个很大的特点是,它既可以应用于感性数据的深度问题,如音频和视频,也可以应用于结构化数据的浅层问题。对于浅层学习(cclassic ML)问题,通过使用提供有用信号的自定义损失函数,您经常可以看到对浅层方法(如 XGBoost)的改进。

然而,并不是所有的浅层问题都能受益于深度学习。我发现,在构建需要为不同数量级的数据创建预测的回归模型时,自定义损失函数非常有用。例如,预测某个地区的房价,该地区的房价可能会大幅波动。为了展示这在实践中是如何工作的,我们将使用 Keras 提供的波士顿住房数据集:

[## 数据集— Keras 文档

来自 IMDB 的 25,000 个电影评论的数据集,由情绪(正面/负面)标记。评论已经过预处理…

keras.io](https://keras.io/datasets/#boston-housing-price-regression-dataset)

这个数据集包括 20 世纪 70 年代波士顿郊区的房价。每条记录有 13 个描述房屋属性的属性,在训练数据集中有 404 条记录,在测试数据集中有 102 条记录。在 R 中,数据集可以如下加载:boston_housing.load_data()。数据集中的标签代表房屋的价格,以千美元计。价格从 5k 美元到 50k 美元不等,价格分布如左图所示。原始数据集具有相似数量级的值,因此自定义损失函数可能不适用于拟合该数据。右侧的直方图显示了标签的变换,这可能得益于使用自定义损失。

The Boston data set with original prices and the transformed prices.

为了转换数据,我将标签转换回绝对价格,对结果求平方,然后除以一个大因子。这导致最高和最低价格之间的差别是 100 倍,而不是 10 倍。我们现在有一个预测问题,可以受益于自定义损失函数的使用。生成这些图的 Python 代码如下所示。

**# Original Prices** plt.hist(y_train) 
plt.title("Original Prices") 
plt.show()**# Transformed Prices** plt.hist((y_train*1000)**2/2500000) 
plt.title("Transformed Prices") 
plt.show()

Keras 中的损失函数

Keras 包括许多有用的损失函数,用于训练深度学习模型。像mean_absolute_error()这样的方法对于数值数量级大致相等的数据集很有效。还有一些函数,比如mean_squared_logarithmic_error(),可能更适合转换后的房屋数据。以下是 Keras 提供的一些损失函数:

mean_absolute_error()
mean_absolute_percentage_error()
mean_squared_error()
mean_squared_logarithmic_error()

为了真正理解这些是如何工作的,我们需要跳入 Python 损失代码。我们将探讨的第一个损失函数是均方误差,定义如下。该函数计算预测值和实际值之间的差值,对结果求平方(使所有值为正),然后计算平均值。注意,该函数使用的是对张量对象而不是 Python 原语进行操作的后端操作

def mean_squared_error(y_true, y_pred):    
    return K.mean(K.square(y_pred - y_true), axis=-1)

我们将探讨的下一个内置损失函数基于预测值和目标值的自然对数之间的差异来计算误差。这里定义,如下图所示。该函数使用 clip 操作来确保负值不会被传递给对数函数,并且将 1 加到 clip 结果确保所有对数变换的输入将具有非负的结果。这个函数类似于我们将要定义的函数。

def mean_squared_logarithmic_error(y_true, y_pred):    
    first_log = K.log(K.clip(y_pred, K.epsilon(), None) + 1.)
    second_log = K.log(K.clip(y_true, K.epsilon(), None) + 1.)    
    return K.mean(K.square(first_log - second_log), axis=-1)

我们将探讨的两个自定义损失函数在下面的 Python 代码段中进行了定义。第一个函数 mean log absolute error(MLAE)计算预测值和实际值的对数变换之间的差值,然后对结果取平均值。与上面的内置函数不同,这种方法不会平方误差。与上面的对数函数的另一个不同之处是,该函数对数据应用了一个显式的比例因子,将房价转换回其原始值(5,000 到 50,0000)而不是(5,50)。这很有用,因为它减少了将+1 加到预测值和实际值上的影响。

from keras import backend as K**# Mean Log Absolute Error** def MLAE(y_true, y_pred):    
    first_log = K.log(K.clip(y_pred*1000, K.epsilon(), None) + 1.)
    second_log = K.log(K.clip(y_true*1000, K.epsilon(), None) + 1.) 
    return K.mean(K.abs(first_log - second_log), axis=-1)**# Mean Squared Log Absolute Error**
def MSLAE(y_true, y_pred):    
    first_log = K.log(K.clip(y_pred*1000, K.epsilon(), None) + 1.)
    second_log = K.log(K.clip(y_true*1000, K.epsilon(), None) + 1.)
    return K.mean(K.square(first_log - second_log), axis=-1)

像 Keras 函数一样,自定义损失函数需要对张量对象而不是 Python 原语进行操作。为了执行这些操作,您需要使用 from 语句获得对后端的引用。在我的系统配置中,这将返回对 tensorflow 的引用。

第二个函数计算对数误差的平方,类似于内置函数。主要的区别是,我对值进行了缩放,这是针对住房数据集的。

评估损失函数

我们现在有四个不同的损失函数,我们希望评估原始和转换后的住房数据集的性能。本节将介绍加载数据、编译模型、拟合模型和评估性能。本节的完整代码清单可以在 github 上找到。

在完成上一节中的安装步骤后,我们将加载数据集,并将我们的转换应用于倾斜房价。最后两个操作可以注释掉使用原房价。

**# load the data set** from keras.datasets import boston_housing 
(x_train, y_train), (x_test, y_test) = boston_housing.load_data()**# transform the training and test labels** y_train = (y_train*1000)**2/2500000
y_test = (y_test*1000)**2/2500000

接下来,我们将创建一个用于预测房价的 Keras 模型。我已经使用了“用 R 进行深度学习”中的样本问题中的网络结构。该网络包括两层全连接的 relu 激活神经元和一个无变换的输出层。

**# The model as specified in "Deep Learning with R"** model = models.Sequential()
model.add(layers.Dense(64, activation='relu', 
          input_shape=(x_train.shape[1],)))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(1))

为了编译这个模型,我们需要指定一个优化器、损失函数和一个度量标准。我们将对所有不同的损失函数使用相同的指标和优化器。下面的代码定义了一个损失函数列表,对于第一次迭代,模型使用均方误差。

**# Compile the model, and select one of the loss functions** losses = ['mean_squared_error', 'mean_squared_logarithmic_error',
           MLAE, MSLAE]model.compile(optimizer='rmsprop',
              loss=losses[0],
              metrics=['mae'])

最后一步是拟合模型,然后评估性能。我使用了 100 个 epochs,批量大小为 5,20%的验证分割。在训练数据集上训练模型之后,使用测试数据集上的平均绝对误差来评估模型的性能。

**# Train the model with validation** history = model.fit(x_train,
                    y_train,
                    epochs=100,
                    batch_size=5,
                    validation_split = .2,
                    verbose=0)**# Calculate the mean absolute error** results = model.evaluate(x_test, y_test, verbose = 0)
results

训练完模型后,我们可以使用 matplotlib 绘制结果。下图显示了训练和测试数据集的损失值。

loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1, len(loss) + 1)plt.figure(figsize=(10,6)) 
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.legend()
plt.show()

Loss values for the training and validation data sets.

我用不同的损失函数训练了四个不同的模型,并将这种方法应用于原始房价和转换后的房价。所有这些不同组合的结果如下所示。

Performance of the Loss Function of the Housing Price Data Sets

在原始数据集上,在损失函数中应用对数变换实际上增加了模型的误差。这并不奇怪,因为数据是正态分布的,并且在一个数量级内。对于转换的数据集,平方对数误差方法优于均方误差损失函数。这表明,如果您的数据集与内置损失函数不兼容,自定义损失函数可能值得探索。

转换数据集上四个不同损失函数的模型训练历史如下所示。每个模型使用相同的误差度量(MAE ),但不同的损失函数。一个令人惊讶的结果是,所有应用对数变换的损失函数的验证误差都要高得多。

Performance of the 4 loss functions on the transformed housing prices data set. All models used MAE for the performance metric.

深度学习对于浅层学习问题来说是一个有用的工具,因为你可以定义定制的损失函数,这可能会大大提高你的模型的性能。这并不适用于所有问题,但如果您有一个不能很好地映射到标准损失函数的预测问题,这可能是有用的。

本·韦伯是 Zynga 的首席数据科学家。我们正在招聘

创业数据科学:探索性数据分析

原文:https://towardsdatascience.com/data-science-for-startups-exploratory-data-analysis-70ac1815ddec?source=collection_archive---------6-----------------------

Source: wynpnt at pixabay.com

我正在进行的关于在初创公司建立数据科学学科的系列文章的第五部分。你可以在 简介 中找到所有帖子的链接,还有一本基于这个系列的关于 亚马逊 的书。

一旦你建立了数据管道,收集了用户行为的数据,你就可以开始探索这些数据,以决定如何改进你的产品。探索性数据分析(EDA)是调查数据集以了解数据形状、特征之间的相关性以及数据中可能对构建预测模型有用的信号的过程。

能够用查询语言和脚本语言来执行这项任务是很有用的。r 为快速理解数据集的形状提供了有用的工具,但只能分析能放入内存的数据集。为了处理大规模数据集,SQL 对于计算整个数据集的汇总统计和分布非常有用。

本文介绍了四种探索性分析,包括计算汇总统计数据、绘制要素、相关性分析和简单线性模型的要素重要性加权。执行这类工作的目标是能够更好地理解用户行为,确定如何改进产品,并调查数据是否为构建数据产品提供了有用的信号。

对于 EDA 示例,我们将使用 Natality BigQuery 数据集。这个数据集提供了美国过去 50 年的出生信息。该分析的目的是确定哪些因素与出生体重相关,并建立一个线性回归模型来预测结果。

汇总统计数据

当探索一个新的数据集时,我们要做的第一件事是计算帮助我们理解数据集的汇总统计数据。这可能包括平均值和中值等统计数据,以及最小值和最大值等极端值。r 提供了一个名为 summary 的函数,用于计算数据框中每一列的统计数据。下面的代码片段显示了使用该函数的示例。

library(bigrquery)
project <- "your_project_id"sql <- "
 SELECT year, plurality, mother_age, father_age,    
       gestation_weeks, ever_born, mother_married, weight_pounds
 FROM `bigquery-public-data.samples.natality`
 order by rand() 
 LIMIT 100000"df <- query_exec(sql, project = project, use_legacy_sql = FALSE)
summary(df[, 2:5])

该脚本在 BigQuery 中查询出生率数据集,并在本地提取一个样本数据集。接下来,将结果集的第二到第五列传递给 summary 函数。调用该函数的结果如下图所示。对于每一列,该函数计算每个属性的最小值、平均值、最大值以及第 25、50 和 75 个百分点。它还计算缺失(NA)值的实例数。

Summary Stats for the Natality Data Set

摘要提供了一种快速理解数据集的方法,但通常需要进一步挖掘才能真正理解数据的形状。下一节将展示如何使用直方图来更全面地理解数据集。数据集中一个有趣的特征是 multiple 列,它描述了怀孕过程中携带的子女数量(产仔数)。中位数略高于 1,因为很少出现双胞胎、三胞胎甚至更多的孩子。由于这种分布的偏态性,汇总的统计数据不能很好地概括人类怀孕中双胞胎或三胞胎的常见程度。

为了弄清楚双胞胎和三胞胎有多常见,我们可以使用 sqldf 库,它允许在 R 数据帧上执行查询。下面的代码显示了如何计算导致多胎分娩的怀孕次数。结果显示,双胞胎出现的频率约为 2.4%,三胞胎出现的频率约为 0.1%,四胞胎出现的频率约为 0.009%。

library(sqldf)
df <- df[!is.na(df$plurality), ]
sqldf("select plurality, sum(1) as Babies 
from df group by 1
order by 1")

这些结果是基于 1,000,000 例妊娠的样本。理想情况下,我们希望跨计算数据集计算这些统计数据。min、max 和 mean 等聚合值很容易计算,因为 SQL 内置了这些运算的聚合。然而,计算中间值以及第 25 和第 75 个百分位数通常并不简单。如果您试图将 percentile_cont 操作应用于 1.38 亿次怀孕的完整数据集,BigQuery 将会抛出一个异常,因为这是一个分析函数,会将所有记录混排到一个节点中。

有几种不同的方法可以解决这个限制。BigQuery 确实提供了一个近似的分位数函数来支持这种大小的数据。您还可以使用随机生成的值(如 rand()*10)对数据集进行分区,并取平均值,以获得近似结果。这些方法适用于第 25、50 和 75 百分位值,但对于极端结果(如第 99.9 百分位)则不太准确。第三种方法是提供一个分区键来分割数据,防止太多的数据被转移到一台机器上。我们可以使用 year 字段,如下面的查询所示。

select year, sum(1) births, min(father_age) Min
 ,avg(Q1) Q1, avg(Q2) Median, round(avg(father_age), 1) Mean
  ,avg(Q3) Q3, max(father_age) Max
from (
  select year, father_age
   ,percentile_cont(father_age, 0.25) over (partition by year) as Q1
   ,percentile_cont(father_age, 0.50) over (partition by year) as Q2
   ,percentile_cont(father_age, 0.75) over (partition by year) as Q3
  FROM `bigquery-public-data.samples.natality`
  where mod(year, 5) = 0 and year >= 1980
)
group by 1 order by 1

这种方法为父亲年龄列计算第 25、50 和 75 个百分点。 percentile_cont 函数是一个分析函数,这意味着它为每条记录返回一个结果,并且需要进行聚合以创建汇总统计数据。上面的查询显示了如何使用 BigQuery 计算由 R summary 函数提供的相同统计数据,同时按出生年份对数据进行分区。该查询生成下表,其中显示了关于父亲年龄的统计信息。

Birth Summary Statistics by Year (Father Age)

这些数据中有一些有趣的趋势值得注意。第一个是 99 年的一致值,作为最大父亲年龄。这可能是数据质量问题,当父亲的年龄未知时,99 可能被设置为年龄。另一个趋势是,父亲的平均年龄逐年增加,从 1980 年的 28 岁增加到 2005 年的 32 岁。对于第一个孩子来说,这并不正常,但汇总统计数据确实表明了一种趋势,即家庭开始晚育。

测绘

汇总统计数据提供了一种快速获取数据集快照的方法,但通常不能很好地概述数据是如何分布的。为了更完整地理解数据集的形状,用各种方法绘制数据是很有用的,比如使用直方图。

hist(df$weight_pounds, main = "Distribution of Birth Weights", 
    xlab = "Weight")

上面的 R 代码显示了如何在我们的采样数据集中绘制出生体重的直方图。结果是下面的直方图,它似乎表明值是正态分布的。大多数新生儿的体重在 6 到 9 磅之间。

Distribution of Birth Weights in the Sampled Natality Data Set

直方图对于可视化分布是有用的,但是它们确实有许多问题,例如桶的数量影响分布是单峰还是双峰。直接从直方图中确定百分位数通常也很困难。累积分布函数(CDF)是一种能够更好地传达这类信息的可视化方法。下面的代码展示了如何可视化相同的数据,但是使用了 CDF 而不是直方图。

plot(ecdf(df$weight_pounds), main = "CDF of Birth Weights", 
   xlab = "Weight", ylab = "CDF")

该代码应用经验累积分布函数,类似于计算运行总和并除以数据集中的实例总数。CDF 图的一个主要好处是,您可以直接从可视化中读取百分位值。这两种类型的可视化都可以使用 SQL 生成,然后在 Excel 等工具中绘制结果,但直方图通常计算成本较低,因为它们不需要分析函数。

The same data, plotted as a Cumulative Distribution Function (CDF)

在研究数据集时,另一个有用的技巧是变换要素,例如应用对数变换。当数据集不是正态分布时,这很有用。例如,会话数据通常是具有长尾的单侧分布,应用对数变换通常可以在绘制时提供更好的数据汇总。

hist(df$gestation_weeks, main = "Gestation Weeks", xlab = "Weeks")
hist(log(df$gestation_weeks), 
    main = "Gestation Weeks (Log Transform)", xlab = "log(Weeks)")

上面的代码显示了如何使用对数转换来转换妊娠周数特征。这对于具有长尾且只有正值的分布很有用。代码生成了下面两个图,它们显示了相似的结果。对于这个例子来说,转换是没有用的,但是当您需要将数据从偏态分布拟合到更接近正态分布时,这是一个值得探索的技巧。您也可以应用平方根变换来生成有用的图。

Log Transforming Gestation Weeks and Plotting Histograms

直接传达百分位数信息的 CDFs 的替代方法是箱线图。箱形图显示了第 25、50 和 75 个百分位数,以及四分位数范围和异常值。在比较不同数据分区的中值时,这种类型的图通常很有用。

sample <- df[df$ever_born <= 6, ]
sample$ever_born <- sample$ever_born - 1 
boxplot(weight_pounds~ever_born,data=sample, main="Birth Weight vs Prior Births", 
        xlab="Prior Children Delivered", ylab="Birth Weight")

上面的代码片段显示了一个在 R 中创建盒状图的例子。该代码根据母亲分娩的前几个孩子的数量,创建了一个不同四分位数范围的图。该图没有显示出明显的模式,但看起来第一个分娩的孩子比母亲分娩的其他孩子的体重略轻。

Birth weight based on number of previous children.

另一种有用的可视化是散点图,它比较数据集中两个不同特征的值。散点图可用于显示两个要素是强相关还是弱相关。下面的 R 代码显示了如何绘制妊娠期和出生体重的比较图。我过滤掉了孕育期超过 90 周的值,因为这些是可疑记录。

sample <- df[1:10000, ]
sample <- sample[sample$gestation_weeks < 90, ]
plot(sample$gestation_weeks, sample$weight_pounds, main = "Birth Weight vs Gestation Weeks",
      xlab= " Gestation Weeks", ylab = "Birth Weight")

结果如下图所示。从图中可以清楚地看出,明显较短的妊娠期会导致较低的出生体重,但对于超过 35 周的妊娠期,这种相关性有多强还不清楚。总体而言,对于样本数据集,这些要素的 R 平方值为 0.25。为了确定哪些特征与出生体重相关,我们需要使用下一节讨论的不同方法。

A comparison of the gestation period and birth weight features.

相关分析

了解某些特征是否可以预测数据集中的其他值非常有用。例如,如果我们知道使用某个产品特性的用户比其他用户保留的时间更长,这就为产品开发提供了有用的洞察力。相关性分析有助于了解数据集中哪些要素是相关的。每个要素都与数据集中的所有其他要素进行比较。然而,通常目标只是理解单个特征之间的相关性,而不是完整的比较矩阵。

避免仅基于相关性分析得出强有力的结论也很重要,因为不可能建立因果关系。通常,更专注的用户会探索应用程序提供的更多选项,所以试图驱使用户执行特定的操作并不一定会增加用户的保留率。例如,在应用程序中添加社交关系可以提高用户的留存率,但促使用户在应用程序中添加朋友可能不会带来长期用户留存的预期结果。最好使用受控方法进行实验,我将在以后的帖子中讨论这一点。

r 有一个用于执行相关性分析的内置函数。 cor 函数使用指定的方法计算数据帧中所有不同列之间的相关性。pearson 方法在处理连续值时很有用,而 spearman 方法在处理离散值(如调查数据)时很有用。下面的 R 代码片段展示了一个计算相关矩阵的例子。

res <- cor(df, method = "pearson", use = "complete.obs")
res <- ifelse(res > 0, res^.5, -abs(res)^.5)
library(corrplot)
corrplot(res, type = "upper", order = "hclust", tl.col = "black")

为了可视化结果,我包含了 corrplot 库,它创建了一个矩阵图。我注意到数据集中不同特征之间的相关性很弱,所以我应用了平方根变换使结果更具可读性。结果图如下图所示。如前所述,妊娠期不是决定出生体重的最重要因素。多胎实际上是出生体重最强的预测因素。

Correlation Matrix for the Natality Data Set (R-values have been square-rooted for visibility).

与绘制直方图类似,在计算相关性时尝试不同的要素变换很有用。例如,在预测房价时,房屋平方英尺的对数变换通常比原始平方英尺值更能反映房屋价值。

特征重要性

通常,探索数据集的目标是确定哪些特征对预测结果有用。这类似于相关性分析,但不是孤立地评估每个特征的影响,而是在包括所有其他特征时确定单个特征的重要性。相关性分析是理解特征的边际效应的一种方式,而特征重要性是理解特征的独特效应的一种方式。这对于处理高度相关的特性很有用,比如会话数量与总会话长度之比。两者都可能与用户保持度相关,但其中一个特征比另一个特征更能说明问题。石灰是这种值得探索的分析类型的概括。

虽然下一篇文章将更详细地介绍预测建模,但我们将在这里使用一个简单的线性模型来展示如何执行特征分析。本例的目标是预测出生体重,这是一个连续的特征。考虑到这个问题规范,回归非常适合预测结果。我们可以建立一个线性回归模型,然后评估模型中不同特征的重要性,以确定哪些因素是结果的强预测因素。下面的代码示例显示了如何在 R 中构建一个线性回归模型,并使用不同的方法来度量功能的重要性。

library(relaimpo)
fit <- lm(weight_pounds ~ . , data = df)
boot <- boot.relimp(fit, b = 10, 
    type = c("lmg", "first", "last", "pratt"), 
    rank = TRUE, diff = TRUE, rela = TRUE)booteval.relimp(boot) 
plot(booteval.relimp(boot,sort=TRUE))

这个脚本的结果显示在下面的图中。使用不同的方法对特征进行加权,所有这些方法都表明,多元性是决定出生体重的最强特征。该脚本首先通过将 weight_points 指定为目标值来拟合线性回归模型,然后使用相对重要性库来确定哪些特征在决定结果方面是重要的。

Feature Weighting for the Natality data set.

结论

探索性数据分析是初创公司数据科学家的关键能力之一。您应该能够挖掘新的数据集,并根据结果确定如何改进您的产品。EDA 是一种理解数据集形状、探索数据中的相关性以及确定是否存在基于不同特征的结果建模信号的方法。

探索性分析通常涉及一些轻量级建模,以确定数据集内不同特征的重要性。在下一篇文章中,我们将深入探讨预测建模,它侧重于基于许多不同的特征来估计结果。

创业数据科学:简介

原文:https://towardsdatascience.com/data-science-for-startups-introduction-80d022a18aec?source=collection_archive---------0-----------------------

Source: rawpixel at pixabay.com

我最近换了行业,加入了一家初创公司,负责建立数据科学学科。当我加入时,我们已经有了一个可靠的数据管道,但我们还没有可重复分析、放大模型和执行实验的流程。这一系列博客文章的目标是概述如何为初创公司从头构建数据科学平台,提供使用谷歌云平台(GCP)的真实示例,读者可以自己尝试。

本系列面向希望超越模型培训阶段,构建对组织有影响的数据管道和数据产品的数据科学家和分析师。然而,对于那些希望更好地了解如何与数据科学家合作进行实验和构建数据产品的其他学科来说,它也可能是有用的。它面向有编程经验的读者,将包括主要用 R 和 Java 编写的代码示例。

为什么是数据科学?

为你的初创公司雇佣数据科学家时,首先要问的问题之一是
数据科学将如何改进我们的产品?在意外之财数据,我们的产品是数据,因此数据科学的目标与公司的目标非常一致,即建立最准确的模型来估计净资产。在其他组织,如移动游戏公司,答案可能不那么直接,数据科学可能更有助于理解如何运营业务,而不是改进产品。然而,在这些早期阶段,开始收集关于客户行为的数据通常是有益的,这样你就可以在未来改进产品。

在初创企业中使用数据科学的一些好处包括:

  1. 确定要跟踪和预测的关键业务指标
  2. 构建客户行为的预测模型
  3. 运行实验来测试产品变化
  4. 构建支持新产品功能的数据产品

许多组织在前两三个步骤上停滞不前,没有充分利用数据科学的潜力。这一系列博客文章的目标是展示托管服务如何用于小型团队,以超越仅用于计算业务运营指标的数据管道,并过渡到数据科学为产品开发提供关键输入的组织。

系列概述

以下是我计划在这个博客系列中涉及的主题。当我写新的章节时,我可能会添加或移动章节。如果你觉得还有其他的话题需要讨论,请在文章的最后提供评论。

  1. 简介(这篇文章):提供了在创业公司使用数据科学的动机,并概述了这一系列文章所涵盖的内容。类似的帖子还有数据科学的功能缩放数据科学我的 FinTech 之旅
  2. 跟踪数据: 讨论了从应用程序和网页中捕获数据的动机,提出了收集跟踪数据的不同方法,介绍了隐私和欺诈等问题,并用 Google PubSub 给出了一个例子。
  3. 数据管道: 介绍了分析和数据科学团队收集数据的不同方法,讨论了平面文件、数据库和数据湖的方法,并介绍了使用 PubSub、DataFlow 和 BigQuery 的实现。类似的帖子包括一个可扩展的分析管道游戏分析平台的演变
  4. 商业智能: 确定 ETL、自动化报告/仪表板以及计算业务运营指标和 KPI 的常见实践。用 R Shiny 和 Data Studio 给出了一个例子。
  5. 探索性分析 : 涵盖用于挖掘数据的常见分析,如构建直方图和累积分布函数、相关性分析以及线性模型的特征重要性。使用出生率公共数据集进行示例分析。类似的帖子还有聚类前 1%10 年数据科学可视化
  6. 预测建模 : 讨论有监督和无监督学习的方法,并介绍流失和交叉提升预测模型,以及评估离线模型性能的方法。
  7. 模型制作 : 展示了如何扩大离线模型的规模,对数百万条记录进行评分,并讨论了模型部署的批处理和在线方法。类似的帖子还有在 Twitch 制作数据科学用数据流制作模型
  8. 实验:介绍产品的 A/B 测试,讨论如何建立一个实验框架来运行实验,并给出一个使用 R 和 bootstrapping 的实例分析。类似岗位包括分阶段推出的 A/B 测试
  9. 推荐系统:介绍了推荐系统的基础知识,并提供了一个为生产系统扩展推荐器的示例。类似的帖子还有原型推荐
  10. 深度学习:简单介绍了最适合通过深度学习解决的数据科学问题,例如将聊天消息标记为攻击性的。提供了使用 R 接口到 Keras 的原型模型和使用 R 接口到 CloudML 的产品化的例子。

该系列还以网络印刷格式出版。

工具作业

在整个系列中,我将展示构建在 Google 云平台上的代码示例。我选择这个云选项,因为 GCP 提供了许多托管服务,使小团队可以建立数据管道,将预测模型产品化,并利用深度学习。还可以注册 GCP 的免费试用,并获得 300 美元的积分。这应该涵盖了本系列中介绍的大多数主题,但如果您的目标是深入研究云上的深度学习,它将很快过期。

对于编程语言,我将使用 R 编写脚本,Java 用于生产,SQL 用于处理 BigQuery 中的数据。我还将介绍其他工具,如 Shiny。推荐一些 R 和 Java 的经验,因为我不会涉及这些语言的基础。

本·韦伯是游戏行业的数据科学家,曾在电子艺界、微软工作室、黎明游戏和 Twitch 任职。他还在一家金融科技初创公司担任第一位数据科学家。

创业公司的数据科学:模型生产

原文:https://towardsdatascience.com/data-science-for-startups-model-production-b14a29b2f920?source=collection_archive---------0-----------------------

Source: cwizner at pixabay.com

我正在进行的关于在创业公司建立数据科学学科系列的第七部分。你可以在 简介 中找到所有帖子的链接,还有一本基于这个系列的关于 亚马逊 的书。

数据科学家可以为初创公司提供价值的一个重要方式是构建可用于改进产品的数据产品。从模型训练到模型部署的转变意味着学习一套全新的工具来构建生产系统。模型的产品化意味着数据科学团队需要支持运营问题,以维护一个活跃的系统,而不仅仅是输出一个报告或模型的规范。

我用来缓解这种过渡的一种方法是托管工具,如 Google Dataflow,它为将模型投入生产提供了一种托管和可扩展的解决方案。本文中讨论的大多数方法都使用无服务器方法,因为它通常比手动配置服务器更适合初创公司。使用像 Dataflow 这样的工具还可以使数据科学家与工程团队更紧密地合作,因为它可以建立一个暂存环境,其中数据管道的一部分可以在部署之前进行测试。初创公司的大多数早期数据科学家也可能通过构建数据产品来扮演 ML 工程师的角色。

数据科学家应该拥有缩放模型所需的工具,而不是依赖工程团队将模型规范转化为生产系统。我过去完成这项工作的方法之一是使用预测模型标记语言( PMML )和谷歌的云数据流。以下是我推荐的构建和部署模型的工作流程:

  1. 用 R 或 Python 训练离线模型
  2. 将模型翻译到 PMML
  3. 使用数据流作业获取 PMML 模型用于生产

这种方法使数据科学家能够在本地处理用于训练模型的采样数据集,然后在完整的数据集上使用生成的模型规范。第三步可能需要工程团队的一些初始支持,但只需要设置一次。使用这种方法意味着数据科学家可以使用 PMML 支持的任何预测模型,利用托管数据流服务意味着团队无需担心维护基础架构。

在这篇文章中,我将讨论几种不同的模型产品化方法。首先,我讨论了如何在 R 中训练一个模型并将规格说明输出到 PMML。接下来,我提供了两种模型部署的例子:批处理和实时。最后,我将讨论一些我见过的团队用于产品化模型的定制方法。

构建模型规范

为了建立一个预测模型,我们将再次使用出生率公共数据集。在这篇文章中,我们将建立一个线性回归模型来预测出生体重。用于执行模型构建和导出过程的完整笔记本可在线获得。脚本的第一部分从 BigQuery 下载数据,并将结果存储在数据框中。

**library**(bigrquery)
project <- "gcp_project_id"sql <- "
 SELECT year, plurality, apgar_5min, mother_age, father_age,    
       gestation_weeks, ever_born, mother_married, weight_pounds
 FROM `bigquery-public-data.samples.natality`
 order by rand() 
 LIMIT 10000 
"df <- query_exec(sql, project = project, use_legacy_sql = FALSE)

接下来,我们训练一个线性回归模型来预测出生体重,并计算误差指标:

lm <- lm(weight_pounds ~ ., data = df)
summary(lm)cor(df$weight_pounds, predict(lm, df))
mean(abs(df$weight_pounds - predict(lm, df))) sqrt(mean(abs(df$weight_pounds - predict(lm, df)^2)))

这会产生以下结果:

  • 相关系数:0.335
  • 平均误差:0.928
  • RMSE: 6.825

模型性能相当弱,可以探索其他算法和功能来改进它。由于这篇文章的目标是专注于将模型产品化,因此经过训练的模型就足够了。

下一步是将训练好的模型翻译成 PMML。 r2pmml R 包和 jpmml-r 工具使这一过程变得简单,并支持多种不同的算法。第一个库将 R 模型对象直接转换成 PMML 文件,而第二个库需要将模型对象保存到 RDS 文件,然后运行命令行工具。我们使用第一个库直接进行翻译:

**library**(r2pmml)
r2pmml(lm, "natality.pmml")

这段代码生成了下面的 pmml 文件。PMML 文件格式指定用于模型的数据字段、要执行的计算类型(回归)以及模型的结构。在这种情况下,模型的结构是一组系数,定义如下:

<RegressionTable intercept="7.5619">   
  <NumericPredictor name="year" coefficient="3.6683E-4"/>   
  <NumericPreda ictor name="plurality" coefficient="-2.0459"/>   
  <NumericPredictor name="apgar_5min" coefficient="9.4773E-5"/>   
  ...
  <NumericPredictor name="mother_married" coefficient="0.2784"/>  
</RegressionTable>

我们现在有了一个模型规范,可以将其产品化并应用于我们的整个数据集。

批量部署

在批处理部署中,模型被应用于大量记录,结果被保存以备后用。这与实时方法不同,后者几乎实时地将模型应用于单个记录。可以将批处理方法设置为定期运行,例如每天运行,或者根据需要临时运行。

SQL 查询 我将用来执行批处理模型部署的第一种方法是最容易采用的方法之一,因为它直接使用 BigQuery,并且不需要增加额外的服务器。这种方法通过在查询中直接编码模型逻辑来应用模型。例如,我们可以如下应用 PMML 文件中指定的线性回归模型:

select weight_pounds as actual,  
  + 11.82825946749738
  + year * -0.0015478882184680862
  + plurality * -2.1703912756511254
  + apgar_5min * -7.204416271249425E-4
  + mother_age * 0.011490472355621577
  + father_age * -0.0024906543152388157
  + gestation_weeks * 0.010845982465606988
  + ever_born * 0.010980856659668442
  + case when mother_married then 1 else 0 end * 0.26494217739205
    as predicted
from records

结果是,数据集中的每条记录现在都有一个预测值,该值是根据模型规范计算的。对于这个例子,我手动将 PMML 文件转换为 SQL 查询,但是您可以构建一个工具来执行这个功能。因为所有的数据都已经在 BigQuery 中,所以这个操作运行起来相对较快,执行起来也不昂贵。还可以根据 SQL 中带有现有标签的记录来验证模型:

select sum(1) as records
  ,corr(actual, predicted) as Correlation
  ,avg(abs(actual - predicted)) as MAE
  ,avg(abs( (predicted - actual)/actual )) as Relative
from predictions

该查询的结果表明,我们的模型的平均绝对误差为 0.92 lbs,相关系数为 0.33,相对误差为 15.8%。使用 SQL 并不局限于线性回归模型,可以广泛应用于不同类型的模型,甚至深网。下面是如何修改前面的查询来计算逻辑回归而不是线性回归:

1/(1 + exp(-1*(
    --regression calculation
)))as predicted

我过去也使用这种方法来部署增强模型,比如 AdaBoost。当模型的结构相对简单,并且您需要数据库中的模型结果时,这很有用。

数据流—大查询

Components in the BigQuery Batch Model Deployment

如果您的模型更复杂,Dataflow 为部署模型提供了一个很好的解决方案。当使用 Dataflow Java SDK 时,您可以定义一个要在一组对象上执行的操作图,该服务将根据需要自动提供硬件进行扩展。在这种情况下,我们的图是一组三个操作:从 BigQuery 读取数据,计算每条记录的模型预测,并将结果写回 BigQuery。该流水线生成以下数据流 DAG:

The Dataflow graph of operations used in this tutorial.

我使用 IntelliJ IDEA 来创作和部署数据流作业。虽然设置 Java 环境超出了本教程的范围,但是用于构建项目的 pom 文件可以在这里获得。它包括对数据流 sdkJPMML 库的以下依赖关系:

<dependency>            
  <groupId>com.google.cloud.dataflow</groupId>              
  <artifactId>google-cloud-dataflow-java-sdk-all</artifactId>   
  <version>2.2.0</version>        
</dependency><dependency>            
  <groupId>org.jpmml</groupId>            
  <artifactId>pmml-evaluator</artifactId>            
  <version>1.3.9</version>  
</dependency>

如上图所示,我们的数据流工作由三个步骤组成,我们将详细介绍这三个步骤。在讨论这些步骤之前,我们需要创建管道对象:

PmmlPipeline.Options options = PipelineOptionsFactory
  .fromArgs(args).withValidation().as(PmmlPipeline.Options.class); 
Pipeline pipeline = Pipeline.create(options);

我们创建一个管道对象,它定义了应用于对象集合的一组操作。在我们的例子中,管道正在对一组 TableRow 对象进行操作。我们将一个选项类作为输入传递给 pipeline 类,该类为数据流作业定义了一组运行时参数,例如用于运行作业的 GCP 临时位置。

管道中的第一步是从公共 BigQuery 数据集中读取数据。从这一步返回的对象是 TableRow 对象的一个p 集合。特征查询字符串定义要运行的查询,并且我们指定在运行查询时要使用标准 SQL。

private static final String featureQuery =     
  "SELECT year, plurality, apgar_5min ... weight_pounds\n" +
  "FROM `bigquery-public-data.samples.natality`";pipeline.apply(BigQueryIO.read().fromQuery(featureQuery)           
       .usingStandardSql().withoutResultFlattening())

下一步是将模型预测应用于数据集中的每条记录。我们定义了一个 PTransform 来加载模型规范,然后应用一个 DoFn 在每个 TableRow 上执行模型计算。

.apply("PMML Application", new PTransform<PCollection<TableRow>,
  PCollection<TableRow>>() {model = new RegressionModelEvaluator(PMMLUtil.unmarshal(
  Resources.getResource("natality.pmml").openStream()));return input.apply("To Predictions", ParDo.of(
    new DoFn<TableRow, TableRow>() {           
     @ProcessElement          
     public void processElement(ProcessContext c) throws Exception {

     /* Apply Model */
}})))

应用模型代码段如下所示。它检索 TableRow 以创建估计值,为 pmml 对象创建输入字段的映射,使用模型来估计出生体重,创建新的 TableRow 以存储出生的实际和预测体重,然后将该对象添加到 DoFn 的输出中。总而言之,这个应用步骤加载模型,定义一个函数来转换输入集合中的每个记录,并创建预测对象的输出集合。

TableRow row = c.element();HashMap<FieldName, Double> inputs = new HashMap<>();            
for (String key : row.keySet()) {              
  if (!key.equals("weight_pounds")) {                   
    inputs.put(FieldName.create(key), Double
        .parseDouble(row.get(key).toString()));              
  }
}Double estimate =(Double)model.evaluate(inputs)
  .get(FieldName.create("weight_pounds"));TableRow prediction = new TableRow();            prediction.set("actual_weight", Double.parseDouble(
    row.get("weight_pounds").toString()));            prediction.set("predicted_weight", estimate);c.output(prediction);

最后一步是将结果写回 BigQuery。在本课的前面,我们定义了将记录写回 BigQuery 时要使用的模式。

List<TableFieldSchema> fields = new ArrayList<>();    
fields.add(new TableFieldSchema()
   .setName("actual_weight").setType("FLOAT64"));    
fields.add(new TableFieldSchema()
   .setName("predicted_weight").setType("FLOAT64"));    
TableSchema schema = new TableSchema().setFields(fields);.apply(BigQueryIO.writeTableRows()
  .to(String.format("%s:%s.%s",  PROJECT_ID, dataset, table))   
  .withCreateDisposition(BigQueryIO.Write.CreateDisposition     
  .CREATE_IF_NEEDED).withSchema(schema));pipeline.run();

我们现在已经定义了一个管道,可以运行它来为整个数据集创建预测。这个类的完整代码清单可以在这里找到。运行这个类将启动一个数据流作业,该作业将生成上面显示的 DAG,并将提供许多 GCE 实例来完成该作业。下面是一个用于运行此管道的自动缩放示例:

Autoscaling the Model Predicting Task

当作业完成时,输出是 BigQuery 项目中的一个新表,它存储了出生率数据集中所有记录的预测和实际权重。如果我们想要运行一个新的模型,我们只需要在数据流作业中指向一个新的 PMML 文件。运行离线分析和数据流项目所需的所有文件都可以在 Github 上获得。

数据流—数据存储

Components in the Datastore Batch Model Deployment

通常,部署模型的目标是使结果对端点可用,以便应用程序可以使用它们。过去的两种方法将结果写入 BigQuery,这不是存储需要在事务中使用的数据的最佳位置。本节讨论的数据管道不是将结果写入 BigQuery,而是将结果写入 Datastore,web 服务或应用程序可以直接使用 Datastore。

执行此任务的管道重用前面管道的前两部分,从 BigQuery 读取记录并创建具有模型预测的 TableRow 对象。我在管道中添加了两个步骤,将 TableRow 对象转换为数据存储实体,并将结果写入数据存储:

.apply("To Entities", ParDo.of(new DoFn<TableRow, Entity>() { @ProcessElement
  public void processElement(ProcessContext c) throws Exception {
    TableRow row = c.element(); // Create a lookup key for the record
    String keyName = "Record" + row.get("recordID").toString();
    Key.Builder keyBuilder = Key.newBuilder();
    Key.PathElement.Builder path = Key.PathElement.
        newBuilder().setKind("Profile").setName(keyName);
    keyBuilder.addPath(path);
    Key key = keyBuilder.build(); // set the experiment group
    String expGroup = Double.parseDouble(row.get("predicted_weight")
        .toString()) >= 8 ? "Control" : "Treatment";
    Value value = Value.newBuilder().
        setStringValue(expGroup).build(); // create an entity to save to Datastore
    Entity.Builder builder = Entity.newBuilder().setKey(key);
    builder.putProperties("Experiment", value);
    c.output(builder.build());
  }
}))
.apply(DatastoreIO.v1().write().withProjectId(PROJECT_ID));

数据存储是一个 NoSQL 数据库,可由应用程序直接使用。要创建数据存储条目的实体,您需要创建一个键。在这个例子中,我使用了一个 recordID,它是使用 BigQuery 中的 row_number() 函数为出生记录生成的惟一标识符。该键用于存储关于配置文件的数据,可以使用该键作为查找来检索该数据。该操作的第二步是根据预测的出生体重,将记录分配给对照组或治疗组。这种方法对于手机游戏可能很有用,在手机游戏中,有很高购买可能性的用户可以被放入一个实验组,该实验组提供购买的提示。该代码片段的最后一部分构建实体对象,然后将结果传递给 Datastore。

存储在数据存储中的结果实体可以在客户端应用程序或 web 服务中使用。下面的 Java 代码片段展示了如何从数据存储中检索值。例如,基于预测模型的输出,可以使用 web 服务来检查登录时提供给用户的报价。

public static void main(String[] args) {
  Datastore datastore = 
      DatastoreOptions.getDefaultInstance().getService();
  KeyFactory keyFactory =
      datastore.newKeyFactory().setKind("Profile"); // get a user profile
  Entity profile = datastore.get(keyFactory.newKey("User101"));
  System.out.println(profile.getString("Experiment"));
}

实时部署

到目前为止,我们介绍的方法都有很大的延迟,并且对于创建实时预测没有用,比如根据用户当前的会话活动为他们推荐新内容。为了近乎实时地构建预测,我们需要使用不同类型的模型部署。

Web 服务 为模型提供实时预测的方法之一是建立一个计算输出的 Web 服务。因为我们已经在关于跟踪数据的帖子中讨论了 Jetty,所以我们将在这里重用它来完成这项任务。为了使这种方法有效,您需要将所有的模型输入指定为 web 请求的一部分。或者,您可以从像 Datastore 这样的系统中检索值。下面是一个使用 Jetty 和 JPMML 实现实时模型服务的示例:

public void handle(...) throws IOException, ServletException {
  // load the PMML model
  final ModelEvaluator<RegressionModel> evaluator;
  try {
    evaluator = new RegressionModelEvaluator(PMMLUtil.unmarshal(
        Resources.getResource("natality.pmml").openStream()));
  }
  catch (Exception e) {
    throw new RuntimeException(e);
  } // create a map of inputs for the pmml model
  HashMap<FieldName, Double> inputs = new HashMap<>();
  for (String attribute : modelFeatures) {
    String value = baseRequest.getParameter(attribute);
    inputs.put(FieldName.create(attribute), 
        Double.parseDouble(value));
  } // output the estimate
  Double estimate =(Double)evaluator.evaluate(inputs).
      get(FieldName.create("weight_pounds"));
  response.setStatus(HttpServletResponse.SC_OK);
  response.getWriter().println("Prediction: " + estimate);
  baseRequest.setHandled(true);
}

该代码处理一个消息请求,其中包含使用模型输入值的参数。该代码片段首先加载 PMML 规范,使用 web 请求参数创建要素的输入地图,应用赋值器获取预测值,并将结果作为输出写入。模型特征数组包含 PMML 文件中指定的特征列表。可以通过以下方式向服务提出请求:

[http://localhost:8080/&year=2000&plurality=1&apgar_5min=0&mother_age=30&father_age=28&gestation_weeks=40&ever_born=1&mother_married=1](http://localhost:8080/?year=2000&plurality=1&apgar_5min=0&mother_age=30&father_age=28&gestation_weeks=40&ever_born=1&mother_married=1)

在浏览器中输入这个 URL 的结果是一个网页,其中列出了 7.547 磅的预测体重。实际上,您可能希望使用消息编码,比如 JSON,而不是传递原始参数。这种方法很简单,延迟相对较低,但是需要管理服务。向上扩展很容易,因为每个模型应用都可以独立执行,并且在提供预测后不会更新任何状态。

数据流—发布订阅

Components in the PubSub Live Model Deployment

也可以在流模式下使用数据流来提供实时预测。我们在数据管道上的 post 中使用了流式数据流,以便将事件流式传输到 BigQuery 和下游的 PubSub 主题。我们可以使用类似的方法进行模型预测,使用 PubSub 作为数据流作业的源和目的地。下面的 Java 代码展示了如何设置一个数据管道,该管道使用来自 PubSub 主题的消息,应用模型预测,并将结果作为消息传递给输出 PubSub 主题。该代码片段不包括加载 PMML 文件的过程,我们在本文前面已经介绍过了。

// Read messages from PubSub
PCollection<PubsubMessage> events = pipeline
   .apply(PubsubIO.readMessages().fromTopic(inboundTopic));// create a DoFn for applying the PMML model to instances
events.apply("To Predictions", ParDo.of(
    new DoFn<PubsubMessage, PubsubMessage>() {@ProcessElement
public void processElement(ProcessContext c) throws Exception {
  PubsubMessage row = c.element(); // create a map of inputs for the pmml model
  HashMap<FieldName, Double> inputs = new HashMap<>();
  for (String key : row.getAttributeMap().keySet()) {
    if (!key.equals("weight_pounds")) {
      inputs.put(FieldName.create(key),
          Double.parseDouble(row.getAttribute(key)));
    }
  } // get the estimate
  Double estimate = (Double)evaluator.evaluate(inputs).
      get(FieldName.create("weight_pounds")); // create a message with the prediction
  String message = "Prediction:" + estimate;
  PubsubMessage msg = new PubsubMessage(
      message.getBytes(), new HashMap());
  c.output(msg);
}}
.apply(PubsubIO.writeMessages().to(outboundTopic));

该代码从传入的主题中读取一条消息,然后从该消息中解析不同的属性,以用作模型的特征输入。结果保存在传递给出站主题的新消息中。由于数据流作业设置为在流模式下运行,管道将在收到消息时近乎实时地处理消息。这条管道的完整代码清单可以在 Github 上找到。

在实践中,PubSub 可能有太多的延迟,这种方法对于在应用程序中直接处理 web 请求来说是无用的。当需要将预测传递给系统中的其他组件时,这种类型的方法非常有用。例如,它可以用来实现一个用户保留系统,向有高流失可能性的移动游戏用户发送有针对性的电子邮件。

定制工程 提供实时模型部署的其他可行方法有 Spark streaming、AWS Lambda 和 Kinesis analytics(针对简单模型)。

有时,数据科学团队不可能直接构建数据产品,因为需要应用模型的系统属于不同的工程团队。例如,电子艺界使用预测模型来改善匹配平衡,而构建该模型的团队可能无法直接访问执行该模型的游戏服务器。在这样的场景中,有必要有一个可以在两个团队之间传递的模型规范。虽然 PMML 是这里的一个选项,但定制模型规范和编码在行业中很常见。

过去,当数据科学团队需要与远程工程团队合作时,我也见过这种流程崩溃。如果一个模型需要被翻译,比如说从一个 Python 笔记本到 Go 代码,在翻译过程中可能会出现错误,这个过程可能会很慢,而且一旦部署了模型,就不可能对其进行修改。

结论

为了给初创公司提供价值,数据科学家应该能够构建支持新功能的数据产品。这可以通过与工程团队合作来完成,也可以由数据科学单独负责。我对初创公司的建议是,在构建数据产品时使用无服务器技术,以降低运营成本,并实现更快的产品迭代。

这篇文章介绍了将模型产品化的不同方法,从直接在 SQL 查询中编码逻辑到构建 web 服务,再到在数据流任务中使用不同的输出组件。将模型产品化的结果是,现在可以在产品中使用预测来构建新功能。

我还介绍了根据预测结果将用户分成不同实验组的想法。在下一篇文章中,我将讨论可以使用的不同实验方法,包括 A/B 测试和分阶段推出。

创业数据科学:模型服务

原文:https://towardsdatascience.com/data-science-for-startups-model-services-2facf2dde81d?source=collection_archive---------3-----------------------

Source: maxpixel.net

我的创业数据科学第二部分 系列 s 重点介绍Python

为了让数据科学家在初创公司高效工作,他们需要能够构建其他团队可以使用的服务,或者产品可以直接使用的服务。例如,数据科学家不应该仅仅定义一个预测用户流失的模型,而应该能够建立一个端点,为玩家流失的可能性提供实时预测。本质上,目标是提供一个模型作为服务,或者产品可以直接使用的功能调用。

鉴于初创公司的规模较小,数据科学家能够在不需要工程支持的情况下站起来支持一个端点是很有用的。团队实现这一功能的方法之一是使用 AWS Lambda 或 GCP 的云服务。这些通常被称为无服务器计算,但另一种看待它们的方式是功能即服务。AWS lambda 等工具使数据科学团队能够建立面向客户的服务,同时最大限度地减少支持实时服务的开销。

在我的模型生产帖子中,我介绍了这些服务的一些替代方法,其中讨论了如何使用 Jetty 将模型预测设置为 web 端点。这种方法的主要问题是,数据科学团队现在需要维护一个 web 服务器,这可能不是团队专业知识的一部分。我还讨论了使用 PubSub 进行接近实时的预测,但是这种方法不适合提供需要毫秒级延迟来生成预测的端点。

这种类型的功能提供亚毫秒级延迟的模型预测,可以归类为提供模型即服务。AWS lambda 提供了一种实现这些功能的好方法,但是确实需要一些设置来使用通用 ML 库。这篇文章的目的是展示如何使用 AWS lambda 来设置一个可以提供模型预测的端点。它可用于大多数可使用 pickle 序列化的 scikit-learn 型号。我首先讨论设置一个公开在开放 web 上的函数,然后展示如何将 sklearn 预测打包成函数。

这篇文章建立在我之前的文章中讨论的 AWS 设置之上。它假设您已经设置了一个 AWS 帐户,并分配了一个具有 S3 访问权限的角色。这篇教程的完整源代码可以在 GitHub 上找到。

创建测试函数

AWS lambda 使团队能够编写服务或 web 客户端可以调用的功能,而无需设置任何基础设施。它被称为无服务器,因为团队专注于编写功能而不是构建系统。首先,我们将设置一个 Hello World 函数,该函数解析输入参数并将参数作为响应的一部分返回。对于本教程,我主要关注 web 请求,其中参数作为查询字符串的一部分输入,响应是一个 web 请求,请求体包含 html 内容。我们将首先设置一个测试功能,然后使用 API 网关将该功能暴露给开放的 web。

第一步是登录 AWS 控制台,然后深入 lambda 屏幕。首先,我们将使用 Python 3.6 和内联编辑器创建一个新函数,如下所示。

Creating our first lambda function

对于没有外部依赖的简单函数,您可以使用“内联编辑代码”功能直接在 AWS web 界面中创作 lambda 函数。对于更复杂的函数,我们需要在本地或 EC2 实例上编写代码,然后上传打包的函数。

创建并保存一个函数后,您应该能够使用“test”按钮来测试它。这将提示一个对话框,您可以在其中配置发送给该函数的参数,我们现在将其留空,但在下一步中进行修改。继续保存默认配置,然后单击“测试”。结果应该看起来像下面的对话框。

A successful run of the Hello World function.

该函数向控制台输出“Hello from Lambda ”,表明该函数调用成功。下一步,我们将希望在函数中使用参数,以便稍后我们可以将这些参数作为输入提供给模型。对于本教程,我们将使用附加到 web POST 命令的查询字符串参数,但是 lambda 可能有许多不同的配置。将服务放入 lambda 函数中是很常见的,这需要一种不同的方法来使用本文没有涉及的参数。

我们将对 AWS 定义的默认 Hello World 函数做一些修改。我添加了一个事件对象的打印语句,将消息参数附加到 Hello 语句的末尾,并修改了 return 语句以返回 web 响应而不是字符串。下面是我们新函数的代码:

def lambda_handler(event, context):
    print(event)    
    esult = 'Hello from ' + event['queryStringParameters']['msg']
    return {  "body": result }

如果您尝试运行这个代码块,您将会得到一个错误。该函数试图从查询字符串参数中检索 msg 参数,这将引发一个异常,因为它未被定义。为了调用这个函数,我们需要更新我们的测试事件来提供这个参数,如下所示:

{
  "queryStringParameters": { "msg": "Data Science for Startups!"}
}

如果您再次测试该函数,您现在将得到一个成功的响应:

{
  "body": "Hello from Data Science for Startups!"
}

我将响应包装为 web 响应,因为我们希望将函数开放给开放的 web,如果 return 语句只提供一个字符串,lambda 函数将不能用作 web 调用。

设置 API 网关 我们现在有了一个 lambda 函数,可以在我们的虚拟私有云(VPC)中使用,但不对 web 开放。为了将该函数设置为 web 调用,我们需要配置一个 API 网关,将该函数公开给开放的 web。有了 lambda,你可以在多个函数中使用同一个网关,在本文中,我们将在测试和预测模型函数中使用同一个网关。

Setting up an API Gateway

上图显示了为 lambda 函数添加 API 网关的 GUI。您需要为网关设置一些参数,以下是我用来配置我的设置的内容:

  • "创建新的 API "
  • API 名称:“暂存”
  • 部署阶段:“准备阶段”
  • 安全性:开放

一旦你设置了这些参数,你需要再次点击保存按钮。然后,您可以单击网关来配置您的设置,如下所示。

Configuring an API Gateway

AWS lambda 提供了几种在将功能部署到野外之前测试它们的方法。上图显示了您的函数在进行调用时将使用的组件的子集,单击“TEST”提供了一种通过网关测试该函数的方法。

Testing the API Gateway

我们现在可以模拟在 web 上调用该函数。选择“POST”作为方法,并设置 msg 参数来测试功能。当您点击 test 时,您应该会得到一个类似上面显示的对话框的结果。

既然我们已经测试了 API 网关,我们终于可以向全世界部署我们的功能了。点击“Actions”->“Deploy API”之后,您应该会看到一个对话框,其中列出了您的网关的 URL。如果您点击网关 URL,您将得到一个错误,因为您需要添加函数名和 msg 参数。下面是我的端点的 URL,以及如何从 web 上调用它:

**# API Url** [https://vkdefzqrb8.execute-api.us-east-1.amazonaws.com/staging](https://vkdefzqrb8.execute-api.us-east-1.amazonaws.com/staging)**# Useable endpoint** [https://vkdefzqrb8.execute-api.us-east-1.amazonaws.com/staging/lambdaTest?msg=TheWeb](https://vkdefzqrb8.execute-api.us-east-1.amazonaws.com/staging/lambdaTest?msg=TheWeb)

在所有这些设置之后,我们现在有了一个 lambda 函数,我们可以从开放的 web 上调用它。继续尝试一下!下一步是创建一个响应传入参数提供模型预测的函数。

使用 SKLearn

如果你想使用外部库,比如在定义 lambda 函数时使用 sklearn,那么这个过程比我们刚刚讨论的要复杂一点。关键区别在于,您不能使用内联代码编辑器,而是需要设置一个目录,其中包含部署该函数所需的所有依赖项。下面是创建依赖外部库的 Python lambda 函数的一般过程:

  1. 在本地机器(或 EC2 实例)上创建一个工作目录
  2. 使用 pip -t 将库安装到这个目录
  3. 将所有代码和资产添加到您的工作目录中
  4. 将该目录的内容压缩到一个. Zip 文件中
  5. 上传。压缩文件到 S3
  6. 使用从 S3 上传的. zip 文件定义一个 lambda 函数

您可以在本地机器上完成这项工作,或者使用 EC2 实例来完成这项任务。由于我使用的是 Windows 笔记本电脑,我更喜欢 EC2 路线。我在之前关于 Python 的帖子中讨论过 EC2 的设置。以下是我用来设置环境的步骤:

**# set up Python 3.6** sudo yum install -y python36
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
sudo python36 get-pip.py
pip3 --version

下一步是在本地目录中建立外部库。通过以这种方式安装模块,您可以在定义 lambda 函数以创建模型预测时包含所有依赖项。我喜欢使用的一些库相当大(50MB+),但是 lambda 现在毫无问题地支持这些库,最大可达 128MB。过去,你必须用一个特殊设置来构建 scikit-learn,以满足 lambda 的有效载荷需求。

**# install dependencies to a target directory** mkdir classifier
pip3 install scipy -t classifier
pip3 install pandas -t classifier
pip3 install sklearn -t classifier
cd classifier

我们现在已经为 python 模型脚本设置了库。下一步是训练一个模型,我们将把它保存为 pickle 文件。我运行了下面的脚本来输出一个模型文件(logit.pkl ),我们将在 lambda 函数中使用它。

import pandas as pd
from sklearn.externals import joblib
from sklearn.linear_model import LogisticRegressiondf = pd.read_csv(
 "[https://github.com/bgweber/Twitch/raw/master/Recommendations/games-expand.csv](https://github.com/bgweber/Twitch/raw/master/Recommendations/games-expand.csv)")y_train = df['label']
x_train = df.drop(['label'], axis=1)model = LogisticRegression()
model.fit(x_train, y_train)joblib.dump(model, 'logit.pkl')

下一步是定义我们希望通过 lambda 公开的模型预测函数。我创建了一个新文件, logit.py ,其中包含了我们希望作为端点启用的预测函数:

from sklearn.externals import joblib
import pandas as pdmodel = joblib.load('logit.pkl')def lambda_handler(event, context):    
    p = event['queryStringParameters']
    print("Event params: " + str(p))
    x = pd.DataFrame.from_dict(p, orient='index').transpose()
    pred = model.predict_proba(x)[0][1] result = 'Prediction ' + str(pred)
    return {  "body": result }

在创建 zip 文件并通过 S3 上传之前,在本地测试代码也很有用。我使用这个片段来测试预测函数:

event = { 'queryStringParameters': {'G1':1, 'G2':0, 'G3':1, 'G4':1,
    'G5':0, 'G6':0, 'G7':1, 'G8':0, 'G9':1, 'G10':0 }}
lambda_handler(event, "")

我们现在有一个函数和环境设置,我们想上传到 lambda。我使用 zip 命令和 AWS CLI 将文件上传到 S3。要使用这个命令,首先需要运行aws configure

zip -r logitFunction.zip .
aws s3 cp logit.zip s3://bucket/logitFunction.zip

我们现在有一个函数,我们已经测试并打包成 zip 文件发送到 S3。

部署功能 我们将遵循与之前相同的步骤来设置和部署该功能,其中有一个主要变化。我们现在将使用“从亚马逊 S3 上传文件”并选择我们的 zip 文件,而不是使用“内嵌代码编辑器”。我们还需要为函数指定一个入口点,它是文件名和函数名的组合。我用了: logit.lambda_handler

您可以使用与之前相同的步骤来测试该函数,但是我们需要包括更多的参数。该模型以 10 个参数作为输入:
G1 — G10。我更新了测试事件,以输入以下参数:

{ "queryStringParameters": {"G1":1, "G2":0, "G3":1, "G4":1,
    "G5":0, "G6":0, "G7":1, "G8":0, "G9":1, "G10":0 }
}

现在,调用该函数将返回模型预测结果:

{
  "body": "Prediction 0.10652960571858641"
}

最后一步是重用之前的 API 网关并部署 API。一旦一切都设置好了,您应该能够通过 API 调用模型,如下所示:

[https://vkdefzqrb8.execute-api.us-east-1.amazonaws.com/staging/logitModel?G1=1&G2=1&G3=1&G4=1&G5=1&G6=1&G7=1&G8=1&G9=1&G10=1](https://vkdefzqrb8.execute-api.us-east-1.amazonaws.com/staging/logitModel?G1=1&G2=1&G3=1&G4=1&G5=1&G6=1&G7=1&G8=1&G9=1&G10=1)

您还需要启用限制选项,以确保端点不会被滥用。我们现在已经设置了一个端点,可以在构建产品时使用。本教程将 lambda 函数设置为 web 端点,但是许多其他配置选项也是可能的。

结论

能够将模型设置为不同服务或产品可以调用的端点是很有用的。预测模型可以直接在产品中使用,例如确定是否应该在移动游戏中向用户追加销售某个项目,或者通过其他服务使用,例如确定向用户分配哪个细分市场的实验平台。

本教程展示了如何使用 AWS lambda 部署用 scikit-learn 库构建的预测模型。由于该库提供了各种各样的预测模型,因此相同的配置可以用于许多不同的用例。lambda 和 GCP 上的云功能等服务的关键优势在于,它们以服务的形式提供功能。这意味着维护服务所需的运营开销最小。它们使数据科学团队能够部署可在产品中使用的端点。

这篇文章展示了如何使用一个火车模型,它被打包成上传的 zip 文件的一部分。常用的扩展之一是从 S3 读取模型文件,这样就可以部署新的模型,而不需要重新部署 API 网关。

本·韦伯是 Zynga 的首席数据科学家。我们正在招聘

创业公司的数据科学:预测建模

原文:https://towardsdatascience.com/data-science-for-startups-predictive-modeling-ec88ba8350e9?source=collection_archive---------4-----------------------

Source: Aichi8Seiran at pixabay.com

我正在进行的关于在创业公司建立数据科学学科系列的第六部分。你可以在 简介 中找到所有帖子的链接,还有一本基于这个系列的关于 亚马逊 的书。

机器学习可以用来预测未来。您提供一个包含定型实例集合的模型,使该模型适合此数据集,然后将该模型应用于新实例以进行预测。预测建模对初创公司很有用,因为你可以制造基于预期用户行为的产品。例如,如果观众一直在观看流媒体服务上的同一家广播公司,应用程序可以在启动时加载该频道。预测模型也可以用于构建数据产品,例如可以向观众推荐新广播公司的推荐系统。

这篇文章简单介绍了机器学习的预测建模。我将讨论不同类型的预测问题,介绍一些常用的方法,介绍使用开放工具和脚本语言构建模型的方法,并提供一个聚类的应用示例。这篇文章的目标不是提供对具体方法的深入理解,而是展示如何使用各种工具快速构建不同类型的模型。

预测模型的类型

机器学习模型通常分为两类:监督学习和非监督学习。对于监督问题,用于拟合模型的数据具有指定的标签或目标变量。比如,如果目标是识别一款手游中哪些用户有可能成为购买者,我们可以用过往用户的交易数据作为标签,其中 1 表示付费用户,0 表示免费用户。标签用作监督算法的输入,以在将模型拟合到训练数据集时提供反馈。分类和回归算法是监督学习的两种类型。在分类任务中,目标是预测结果的可能性,例如移动游戏用户是否会购买。对于回归来说,目标是预测一个连续变量,例如给定不同特征描述的房屋价格。

对于无监督的问题,没有为训练模型提供显式标签。最常见的无监督学习方法是聚类,它通过在数据集中形成不同实例的组来推断标签。聚类有助于回答细分问题,例如产品应该支持哪些不同的用户原型。

还有另外两类机器学习模型我就不在这里讨论了:半监督学习和强化学习。半监督学习是一种识别目标标签的过程,作为训练过程的一部分,通常用深度学习中的自动编码器来实现。强化学习是基于奖励策略更新的模型,其中模型采取的行动提供正面和负面的反馈信号,并用于更新模型。

对于一家初创公司,你可能会从分类和回归模型开始,这通常被称为经典或浅层机器学习问题。有很多种不同的方法可以使用。一些常见的分类方法是逻辑回归、朴素贝叶斯、决策树和集成方法,如随机森林和 XGBoost。常见的回归方法包括许多与分类相同的方法,但线性回归用于代替逻辑回归。十年前我读研究生时,支持向量机很流行,但现在 XGBoost 似乎是浅层学习问题之王。

了解不同的算法是如何实现的很重要,因为如果你想将预测模型作为产品的一部分,它需要是可靠的和可伸缩的。通常,在运送产品时,渴望型模型比懒惰型模型更受青睐。急切模型是在训练过程中生成规则集的方法,如线性回归模型中的系数,而懒惰模型在运行时生成规则集。例如,最近邻(k-NN)模型是一种懒惰的方法。惰性方法通常对构建在线学习系统有用,在这种系统中,模型在部署时会频繁地用新数据更新,但可能存在可伸缩性问题。

如何评估预测模型的性能取决于所执行问题的类型。例如,平均绝对误差(MAE)、均方根误差(RMSE)和相关系数等指标可用于评估回归模型,而 ROC 曲线下面积(AUC)、精度、召回率和提升率可用于分类问题。

训练分类模型

本节介绍了几种不同的方法,可用于构建分类模型。我们将使用与 EDA 上的过去帖子相同的数据集,但不是在出生率数据集中预测出生体重,而是试图预测哪些怀孕将导致双胞胎而不是单胎。

首先,我们需要在本地提取一个数据集,作为不同工具的输入。下面的 R 代码展示了如何对 100k 次怀孕进行采样并将数据帧保存到 CSV 文件中。这个查询类似于上一篇文章中的查询,但是我在 where 子句中加入了额外的约束,以避免提取缺少(NA)值的记录。

library(bigrquery)
project <- "your_project_id"
options(stringsAsFactors = FALSE)sql <- "SELECT year, mother_age, father_age, gestation_weeks
 ,case when ever_born > 0 then ever_born else 0 end as ever_born
 ,case when mother_married then 1 else 0 end as mother_married
 ,weight_pounds
 ,case when plurality = 2 then 1 else 0 end as label
FROM `bigquery-public-data.samples.natality`
where plurality in (1, 2) and gestation_weeks between 1 and 90
  and weight_pounds between 1 and 20
order by rand() 
LIMIT 100000"df <- query_exec(sql, project = project, use_legacy_sql = FALSE)
write.csv(df, "natality.csv", row.names = FALSE)

这个数据集的一个挑战是,这个数据集中的反面例子比正面例子多得多。在抽样数据集中,只有 2.4%的怀孕有“1”的标签,表明是双胞胎。这意味着我们需要使用除准确性之外的指标来衡量不同方法的性能。对于像这样的大类不平衡问题,准确性不是一个好的度量,因为预测每个记录的标签为 0 会导致 97.6%的准确性。相反,我们将使用 AUC 曲线度量来评估不同的模型,因为它对于处理不平衡类的问题很有用。

评估不同模型时的另一个考虑是使用不同的定型、测试和维持数据集。维持数据集保留到模型定型过程结束,并且仅用于一次评估。在构建和调整模型时,可以根据需要频繁使用训练和测试数据集。10 重交叉验证等方法对于构建模型性能的稳健估计非常有用。这是我在构建模型时通常采用的方法,但是为了简洁起见,并没有在下面所有不同的例子中涉及到。

Weka 我喜欢用来探索性分析和评估不同建模算法的工具之一是 Weka ,它是用 Java 实现的,提供了一个探索不同模型的 GUI。现在它有点过时了,但我仍然发现它对于快速挖掘数据集并确定是否有很多信号可用于预测结果非常有用。

Visualizing different features in the data set with Weka.

上图显示了数据集中不同特征的可视化效果。红色数据点代表正例(双胞胎),蓝色数据点代表负例(单胎)。对于具有强信号的特征,通常可以画一条垂直线来分隔大部分红色和蓝色数据点。这个数据集就不是这样了,我们需要结合不同的特征来构建一个好的分类器。

我使用 Weka 研究了以下算法,并在使用 10 重交叉验证时计算了 AUC 指标:

  • 逻辑: 0.892
  • 朴素贝叶斯: 0.893
  • LogitBoost: 0.908

在我研究的算法中,性能最好的算法是 LogitBoost。该算法具有多个超参数,例如迭代次数,可以对其进行调整以进一步提高模型的性能。Weka 中可能有其他算法在这个数据集上工作得更好,但我们最初的探索已经产生了有希望的结果。

Visualizing the ROC Curve with Weka

上图显示了逻辑回归模型的 ROC 曲线。使用 Weka 还可以探索逻辑回归模型中不同特征的重要性。您可以直接检查模型的系数。比如体重 _ 磅的系数值最高,为 0.93。还可以使用 InfoGain 属性排名器来确定哪些特征对分类任务最重要。Weka 发现体重 _ 磅(0.0415)是最有影响力的特征,其次是妊娠 _ 周(0.0243)。

Weka 通常不是产品化模型的最佳选择,但它确实为探索各种不同的算法提供了一个有用的工具。

BigML 我在创业经历中用过的另一个工具是 BigML 。这个工具类似于 Weka,因为它提供了一个 GUI(基于 web 的),用于探索不同类型的模型,而不需要任何编码。该工具的选项比 Weka 少,但有更新的模型,如 DeepNets。

Evaluating Feature Importance in a Logistic Model with BigML

上图展示了 BigML 提供的一个特性重要性工具。这些工具有助于了解哪些特征有助于预测结果。我用 BigML 研究了两种不同的模型,得出了以下 AUC 指标:

  • 逻辑: 0.890
  • DeepNet: 0.902

我没有使用 10 倍交叉验证,而是使用一个 80/20 的数据分割来评估不同的模型。BigML 中模型的性能与 Weka 相似,但与 LogitBoost 的性能不太匹配。

Evaluation Metrics provided by BigML

除了绘制 ROC 曲线,如上所示,BigML 还可以绘制其他有用的可视化图形,如提升图。BigML 还提供了有用的分类指标,比如精度、召回率和 F1 分数。

R — Glmnet 我们可以使用 R 中的 glm 库实现我们已经评估过的逻辑回归模型。通过指定二项式族作为输入,可以将广义线性模型函数应用于逻辑回归。加载 CSV 并训练逻辑回归模型的 r 代码如下所示。

df <- read.csv("Natality.csv")
fit <- glm(label ~ .,family=binomial(),data=df)
fitlibrary(Deducer)
rocplot(fit)

拟合模型后, fit 语句输出模型的系数。为了评估模型的性能,我使用了包含 rocplot 函数的演绎库。对于这个基本的模型拟合方法,我没有进行任何交叉验证。结果是训练数据集的 AUC 为 0.890。

ROC Curve for the logistic regression model in R.

为了在拟合 R 中的逻辑回归模型时使用正则化,我们可以使用 glmnet 库,它提供了 lasso 和 ridge 回归。下面的代码显示了一个使用这个包来评估特性重要性的例子:

library(glmnet)
x <- sparse.model.matrix(label ~ ., data = df)
y <- as.factor(df$label)fit = glmnet(x, y, family = "binomial")
plot(fit, xvar = "dev", label = TRUE)

默认情况下,使用“最小二乘法”模型来拟合训练数据。下图显示了模型的系数如何随着其他因素用作模型的输入而变化。最初,只有 weight_pounds 要素被用作输入。一旦这一项开始变得不利,大约值为-0.6,就要考虑模型的附加特征。

Feature weights based on different lambda values for glmnet.

cvfit = cv.glmnet(x, y, family = "binomial", type.measure = "auc")
cat(paste("ROC:", max(cvfit$cvlo)))
plot(cvfit)

glmnet 包提供了内置的交叉验证功能,可用于优化不同的指标,如 AUC。上面的 R 代码显示了如何使用这个特性训练一个逻辑回归模型,并在下图中绘制了结果。正则化逻辑回归模型的 AUC 度量是 0.893。

Performance (AUC) of the glmnet model based on different lambda values.

Python-scikit-learn 我想在本节介绍的另一个工具是 sci kit-learn,因为它提供了一种探索不同类型模型准确性的标准化方法。到目前为止,我一直专注于模型拟合和 EDA 的 R,但是通过 scikit-learn 获得的 Python 工具非常有用。

**# load the data set** import pandas as pd
df = pd.read_csv('./Natality.csv')**# build a random forest classifier** from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier()
x = df.drop('label', axis=1)
y = df['label']
rf.fit(x, y)**# evaluate the results** from sklearn.metrics import roc_curve, auc
false_positive_rate, true_positive_rate, _ = roc_curve(y, rf.predict(x))
roc_auc = auc(false_positive_rate, true_positive_rate)**# plot the curve** import matplotlib.pyplot as plt
plt.plot(false_positive_rate, true_positive_rate, 
    'b', label='AUC = %0.2f'% roc_auc)
plt.legend(loc='lower right')
plt.show()

上面的 Python 代码显示了如何使用 pandas 读取数据框,使用 sklearn 拟合随机森林模型,评估模型的性能,并绘制结果,如下图所示。对于这个模型,我在评估模型时没有应用任何交叉验证。使用 scikit-learn 的好处之一是 fit 和 score 函数在不同的算法中是一致的,这使得探索不同的选项变得很简单。

ROC Curve for the Random Forest model in scikit-learn

集群

对初创公司有用的分析类型之一是了解是否有不同的细分市场或用户群。这类工作的一般方法是首先识别数据中的聚类,为这些聚类分配标签,然后根据带标签的聚类为新记录分配标签。本节展示了如何使用 2016 年美联储消费者金融调查的数据来执行这种类型的过程。

该调查数据集提供了美国成千上万个家庭的资产明细。这种聚类分析的目的是确定是否存在不同类型的净资产超过 100 万美元的富裕家庭。加载数据和执行分析的完整代码在本 Jupyter 笔记本中提供。在这篇博客文章中介绍了之前对该数据集的分析。

对于每一个被调查的家庭,我们都有许多列来说明如何为该家庭分配资产,包括住宅和商业房地产、企业股权、退休金和许多其他资产。我们要做的第一件事是确定哪些资产具有对用户进行聚类的强信号。我们可以使用 PCA 和因子图来实现这个目标:

**# filter on affluent households, and print the total number**
affluent <- households[households$netWorth >= 1000000, ]
cat(paste("Affluent Households: ", floor(sum(affluent$weight))))**# plot a Factor Map of assets** 
fviz_pca_var(PCA(affluent,  graph = FALSE), col.var="contrib",    
  gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE)+
  labs(title ="Affluent Households - Assets Factor Map")

下图显示了富裕家庭中不同的资产类别。最重要的因素是企业权益。其他一些因素包括投资资产(股票、债券)和房地产资产/退休基金。

A factor map showing differences in asset allocations.

要使用多少个集群?
我们现在已经有迹象表明,百万富翁有不同的类型,资产也因净资产的不同而不同。为了理解资产配置如何因净值部分而不同,我们可以使用聚类分析。我们首先识别富裕调查受访者中的聚类,然后将这些标签应用于调查受访者的总体人口。

k <- 7
res.hc <- eclust(households[sample(nrow(households), 1000), ],
  "hclust", k = k, graph = FALSE) 
fviz_dend(res.hc, rect = TRUE, show_labels = FALSE)

为了确定使用多少个集群,我使用上面的代码片段创建了一个集群树图。结果如下图所示。我还改变了集群的数量, k ,直到我们有了最大数量的可清楚识别的集群。

A hierarchical visualization of the cluster assignments.

如果您更喜欢采用定量方法,您可以使用 fviz_nbclust 函数,该函数使用轮廓度量计算最佳聚类数。对于我们的分析,我们决定使用 7 个集群。

clarax <- clara(affluent, k)
fviz_cluster(clarax, stand = FALSE, geom = "point", ellipse = F)

为了将富裕家庭分成独特的群体,我使用了克拉拉算法。不同集群的可视化如下所示。结果类似于上面讨论的 PCA 和因子图方法。

A visualization of the two-principal components identified by PCA.

聚类描述 既然我们已经确定了要使用多少个聚类,那么检查这些聚类并根据特征集分配定性标签是很有用的。下面的代码片段显示了如何计算 7 个不同分类的平均特征值。

groups <- clarax$clustering
results <- as.data.frame(t(aggregate(affluent,list(groups),mean)))  
results[2:18,]

该代码块的结果如下所示。基于这些结果,我们提出了以下集群描述:

  • V1:股票/债券——占资产的 31%,其次是家庭基金和共同基金
  • V2:多元化——53%的商业股权,10%的房产和 9%的其他房地产
  • V3:住宅房地产——占资产的 48%
  • V4:共同基金——资产的 50%
  • V5:退休— 48%的资产
  • V6:企业权益— 85%的资产
  • V7:商业房地产——59%的资产

除了仅包含 3%人口的星团 V7 之外,大多数星团的大小相对均匀。第二小的聚类代表人口的 12%,而最大的聚类代表 20%。您可以使用 table(groups) 来显示未加权的集群人口规模。

Asset allocation amounts for the 7-identified clusters.

按净值段对人群进行聚类 该分析的最后一步是对总体人群应用不同的聚类分配,并按净值段对人群进行分组。因为我们只对富裕家庭进行聚类训练,所以我们需要使用分类算法来标记人口中的非富裕家庭。下面的代码片段使用 knn 来完成这项任务。剩余的代码块计算每个净值段被分类为每个聚类的家庭数量。

**# assign all of the households to a cluster** groups <- knn(train = affluent, test = households, 
  cl = clarax$clustering, k = k, prob = T, use.all = T)**# figure out how many households are in each cluster** clusters <- data.frame(
  c1 = ifelse(groups == 1, weights, 0), 
  ... 
  c7 = ifelse(groups == 7, weights, 0) 
)**# assign each household to a net worth cluster** nw <- floor(2*log10(nwHouseholds))/2
results <- as.data.frame(t(aggregate(clusters,list(nw),sum)))**# compute the number of households that belong to each segment**
results$V1 <- results$V1/sum(ifelse(nw == 4, weights, 0))
...
results$V11 <- results$V11/sum(ifelse(nw == 9, weights, 0))**# plot the results** plot <- plot_ly(results, x = ~10^Group.1, y = ~100*c1, type = 'scatter', mode = 'lines', name = "Stocks") %>%
  add_trace(y = ~100*c2, name = "Diversified") %>%
  ...
  add_trace(y = ~100*c7, name = "Commercial R.E.") %>%
  layout(yaxis = list(title = '% of Households', ticksuffix = "%"),
     xaxis = list(title = "Net Worth ($)", type = "log"), 
     title  = "Cluster Populations by Net Worth")

这一过程的结果如下图所示。图表显示了一些明显和新颖的结果:房屋所有权和退休基金构成了非富裕家庭的大部分资产,2M 美元(不包括商业房地产和商业股权)附近的资产组合相对均匀,商业股权主导了超富裕家庭的净资产,其次是其他投资资产。

How the distribution of clusters varies based on Household Net Worth.

对于这个聚类示例,我研究了调查数据并确定了七种不同类型的富裕家庭。然后,我使用这些聚类为剩余的家庭分配标签。类似的方法可以在创业时使用,以将细分标签分配给用户群。

结论

预测建模是机器学习的一种应用,具有各种各样的工具,可用于入门。建立预测模型时,首先要考虑的事情之一是确定您试图预测的结果,并建立用于衡量成功的指标。

在这篇文章中,我展示了四种不同的方法来建立预测怀孕期间双胞胎的分类模型。我展示了如何使用基于 GUI 的工具 Weka 和 BigML 来评估逻辑回归模型、集成模型和深度网络。我还编写了用 R 执行正则化逻辑回归和用 Python 执行随机森林的脚本示例。我用一个集群的例子结束了这篇文章,这对于执行创业公司的细分任务可能是有用的。

独立于用于构建预测模型的方法,能够输出模型规格作为训练过程的结果是很重要的。这可以是线性回归模型的系数权重列表,随机森林模型的节点和权重列表,或者深度学习网络的神经元权重和激活列表。在下一篇帖子中,我将讨论如何将预测模型扩展到数百万用户,并且能够将训练好的模型表示为规范是生产的先决条件。

创业数据科学:PySpark

原文:https://towardsdatascience.com/data-science-for-startups-pyspark-1acf51e9d6ba?source=collection_archive---------12-----------------------

Source:Wikimedia Commons

我的创业数据科学第三部 系列 s 现在重点介绍Python

Spark 是一个很好的工具,可以让数据科学家将研究代码转化为生产代码,PySpark 使这种环境更容易访问。虽然我一直是谷歌用于产品化模型的云数据流的粉丝,但它缺乏一个易于原型化和部署数据科学模型的交互环境。Spark 对于初创公司来说是一个很好的工具,因为它既提供了执行分析的交互式环境,又提供了将模型投入生产的可伸缩性。这篇文章讨论了如何在 GCP 上启动集群并连接到 Jupyter,以便在笔记本环境中使用 Spark。

有各种不同的生态系统可用于与 Spark 合作,从自托管到供应商选项。以下是我过去探索过的一些 Spark 选项:

  1. 阿帕奇安巴里+阿帕奇齐柏林
  2. GCP DataProc + Jupyter
  3. AWS EMR + SageMaker
  4. 供应商:DataBricks、Cloudera

除了 SageMaker 之外,所有这些设置我都亲自操作过。在与大型企业合作时,我更喜欢供应商解决方案,但初创公司可能希望避免这种选择。最佳方法取决于您需要处理多少数据,您预计您的公司将增长多少,以及您需要用该基础架构支持多少数据科学家。

这篇文章的目标是展示如何尽快使用 PySpark 的云解决方案。我决定使用 GCP,因为该平台提供免费积分,并且进入笔记本环境是微不足道的。下面的帖子是 GCP 星火计划的一个很好的起点:

[## 数据科学家的谷歌云平台:在谷歌上使用带有 Apache Spark 的 Jupyter 笔记本…

结合使用 Jupyter 笔记本电脑和 GCP,您将获得熟悉的数据科学体验,而不会有乏味的…

cloud.google.com](https://cloud.google.com/blog/products/gcp/google-cloud-platform-for-data-scientists-using-jupyter-notebooks-with-apache-spark-on-google-cloud)

这个例子的完整源代码可以在 GitHub 上找到。

设置

首先,我们需要设置一个集群,我们将用 Jupyter 连接到这个集群。我们将使用大多数默认设置,即创建一个包含一个主节点和两个工作节点的集群。我们将指定的一个初始化步骤是运行位于 Google Storage 上的一个脚本,它为集群设置 Jupyter。

  1. 从 GCP 控制台,选择汉堡菜单,然后选择“DataProc”
  2. 从 DataProc 中,选择“创建集群”
  3. 分配一个集群名:“pyspark”
  4. 单击“高级选项”,然后单击“添加初始化选项”
  5. 添加如下命令(如下所示):
    GS://data proc-initial ization-actions/jupyter/jupyter . sh
  6. 点击“开始”

Adding the Jupyter initialization step.

群集将需要几分钟的时间来启动。准备就绪后,状态将从“正在调配”变为“正在运行”。在开始使用 Jupyter 之前,我们需要为集群设置连接规则。推荐的方法是设置 SSH 隧道,如这里的所述。为了快速启动并运行,我们将修改防火墙以接受来自特定 IP 的连接。

The initialized Spark cluster.

要修改防火墙以接受来自您的计算机的连接:

  1. 点击集群“pyspark”
  2. 单击“虚拟机实例”
  3. 对于“pyspark-m ”,单击 3 个垂直点,然后单击“查看网络详细信息”
  4. 从左侧,选择“防火墙规则”
  5. 选择“创建防火墙规则”
  6. 对规则使用以下设置
    -名称:jupyter
    -目标标签:http-服务器
    -源 IP 范围:您的 v4 IP
    • tcp: 8123(脚本在此端口上设置 jupyter)
  7. 点击“创建”

现在您应该能够测试到您的 DataProc 集群的连接了。浏览回“VM Instances”并单击“pyspark-m”以获取集群的外部 IP。然后点击“编辑”,启用“允许 HTTP 流量”,然后“保存”。将“:8123”附加到集群外部 IP 的末尾,并将结果粘贴到您的浏览器中。您应该会看到 Jupyter,如下所示。

Jupyter set up for GCP DataProc.

我们现在已经为 PySpark 的云部署设置了 Jupyter 笔记本!

PySpark

设置好 Jupyter 环境后,您可以通过选择“新建”然后选择“PySpark”来创建新笔记本。虽然已经安装了一些常用库,如 matplotlibnumpy ,但是您可能希望通过 pip 添加额外的库。我们可以直接在笔记本上完成:

!pip install --upgrade  pandas
!pip install --upgrade  pandas_gbq
!pip install --upgrade  pyspark

上面的代码片段在集群上安装 Pandas,以及 Pandas 的 BigQuery 连接器和 PySpark,我们将使用 py Spark 来获取对 Spark 上下文的引用。我们将遵循 GCP 的例子,从将数据从 BigQuery 拉入 Pandas 数据帧开始。此时,我们实际上并没有利用 Spark 的功能,因为使用 Pandas 需要将所有数据加载到驱动程序节点的内存中。但这是在担心 Spark 的一些复杂性之前快速启动和运行的一种方式。

下面的代码片段显示了如何在 BigQuery 上运行查询,并将结果拉入驱动程序节点上的 Pandas 数据帧。当处理较大的数据集时,应该使用 BigQuery 连接器以 Spark 数据帧而不是 Pandas 数据帧的形式返回结果。

from pandas.io import gbqproject_id = "your-project_id"
query = """
    SELECT * 
    FROM `bigquery-public-data.samples.natality` 
    limit 10000
"""births = gbq.read_gbq(query=query, dialect ='standard', project_id=project_id)
births.head()

因为我们将结果作为熊猫数据帧返回,所以我们可以使用 hist 函数来绘制不同属性的分布。下图显示了出生体重和母亲年龄的分布。

Histograms of different attributes in the data set.

为了充分利用 Spark 的分布式计算能力,在使用 PySpark 时最好避免使用 Pandas。这意味着避免 toPandas() ,直接将数据加载到 Spark 而不是 Pandas 数据帧中。然而,Pandas UDF是在 Spark 环境中使用 Pandas 的一种很好的方式,但是调试起来很有挑战性。

首先,我们将展示如何从 Pandas 数据帧转换到 Spark 数据帧。关键的区别在于 Spark 数据帧是延迟评估的,并且分布在集群中,这意味着在需要计算结果之前不执行任何操作。当使用 Pandas 数据帧时,所有的操作都以一种急切的模式执行,并被立即拉入内存,即使结果在后面的步骤中不被使用。在使用 Spark 数据帧之前,我们首先需要获得对 Spark 上下文的引用,如下面的代码片段所示。一旦获得,我们可以用它来转换从熊猫到火花数据帧。

from pyspark.context import SparkContext
from pyspark.sql.session import SparkSession# Get a reference to the Spark Session 
sc = SparkContext()
spark = SparkSession(sc)# convert from Pandas to Spark 
sparkDF = spark.createDataFrame(births)# perform an operation on the DataFrame
print(sparkDF.count())# DataFrame head 
sparkDF.show(n=5)

许多 Spark 操作类似于 Pandas 操作,但是执行流程有很大的不同。上例显示了如何使用显示功能执行与操作类似的结果。Spark 的主要好处是执行是分布式的和懒惰的,从而产生可伸缩的管道。

结论

Spark 是构建数据管道的强大工具,PySpark 使这个生态系统更容易访问。虽然使用 spark 有多种选择,但本文主要关注如何使用 GCP 的 DataProc 和一个 Jupyter 初始化脚本来快速交互式访问 Spark 集群。有效地使用 PySpark 需要重新学习许多在 Python 中执行数据科学的标准方法,但结果是大规模可扩展的数据管道和分析。

本·韦伯是 Zynga 的首席数据科学家。我们正在招聘

创业公司的数据科学:R -> Python

原文:https://towardsdatascience.com/data-science-for-startups-r-python-2ca2cd149c5c?source=collection_archive---------3-----------------------

Source: Yuri_B at pixabay.com

在我的博客系列初创公司的数据科学中,我收到的一条反馈是,对于加入初创公司的数据科学家来说,Python 将是一个更好的选择。如果 Python 已经是执行数据科学任务的首选语言,这就很有意义了。就我而言,我在 R 方面有更多的经验,我想用一种我以前用来解决问题的语言来介绍如何与初创公司合作。

现在我已经完成了这个系列,并把它变成了一本,我想开始深入研究 Python 作为数据科学的脚本语言。目前,我仍然更喜欢使用 Java 来生产模型,使用数据流,但是随着我对这种语言越来越熟悉,这种偏好可能会改变。我想把我以前的一些文章从 R 移植到 Python,为更广泛的读者提供一个介绍。以下是我探索 Python 的主要动机:

  • 创业工具:许多创业公司已经在使用 Python 进行生产,或者他们的部分数据管道。使用 Python 来执行分析任务是有意义的。
  • R 和 Java 不能很好地过渡到交互式创作 Spark 任务。可以用 Java 做 Spark,但是不太适合做探索性的工作,从 Python 过渡到 PySpark 似乎是学习 Spark 最平易近人的方法。
  • 深度学习:我对深度学习很感兴趣,虽然有 Keras 等库的 R 绑定,但最好还是用这些库的母语编码。我之前用 R 创作过自定义损失函数,调试错误有问题。
  • Python 库:除了为 Python 提供的深度学习库,还有许多其他有用的工具,包括 FlaskBokeh 。有可以扩展的笔记本环境,包括谷歌的联合实验室和 AWS SageMaker

我还想介绍两个主题,这是我在最初的系列文章中没有提供的内容:

  • 虚拟化:一旦您开始运行大型作业,您需要一个更好的环境来进行扩展以处理大型数据集。在最初的系列文章中,我使用了 Google 的数据流,但是我想展示一些工具,这些工具在交互工作时对扩大分析规模很有用。
  • Spark: 我想探索更多的 Spark 生态系统,包括像最近宣布的 MLflow 这样的工具。Spark 为处理大规模数据提供了一个很好的环境,可以更容易地从勘探转移到生产任务。

首先,我计划重温我以前的帖子,这些帖子都是 R heavy,并向 Python 提供这些帖子的一个端口。以下是我的原始系列中需要翻译成 Python 的主题:

其中许多部分可以直接翻译,但商业智能等帖子需要使用不同的库,如 Bokeh 而不是 Shiny。我不会更新数据流中的部分,因为它们是用 Java 编写的。然而,使用 Python 编写数据流任务是可能的。我不会将 Java 移植到 Python,而是探索用于产品化工作的新工具,比如 Spark 和 SageMaker。

这篇文章的目标是激励我向 Python 的过渡,并介绍如何使用 Jupyter 笔记本。鉴于我对虚拟化的新关注,我还想展示如何在 AWS 上使用远程机器。本文的剩余部分将讨论如何在 AWS 上启动 EC2 实例,为远程连接设置 Jupyter 笔记本,以及用 Python 从 BigQuery 查询数据。

设置 Jupyter

Python 有很多很好的 ide,比如 PyCharm。然而,我将重点关注 Jupyter,因为它是一个笔记本环境,许多用于可扩展数据科学的工具都基于笔记本,如 Spark、Colaboratory 和 SageMaker 的 DataBricks。在学习这门语言的基础知识时,从 IDE 开始可能是有用的,但是熟悉笔记本环境也是有益的,因为这种类型的环境对于大型工具来说非常流行。

开始使用 Python 时讨论的一个常见任务是设置一个虚拟环境,以便使用诸如 virtualenv 之类的工具安装 Python 和任何必要的库。使用 Python 时设置一个虚拟环境是一个很好的实践,因为库之间可能会有冲突,您可能需要运行多个版本的 Python,或者您可能想要创建一个全新的安装来重新开始。Docker 是另一个选择,但比 virtualenv 更重要。在这篇文章中,我将讨论在 AWS 上启动 EC2 实例来设置 Python 3 环境。这也比使用 virtualenv 要重要得多,但是在处理较大的数据集时,如果有必要,它提供了扩大机器大小的能力。这也是更熟悉 AWS 并开始虚拟化数据科学任务的好机会。

设置笔记本电脑环境时,安全性是另一个重要的考虑因素,因为您不希望您的工作空间对外界开放。在使用 AWS 时,连接到 Jupyter 笔记本最安全的方法是设置一个带端口转发的 SSH 隧道,这可以确保客户端只有在拥有所需的私钥时才能连接到笔记本。另一种选择是将笔记本电脑开放给开放的 web,但是限制哪些机器可以连接到 EC2 实例。我将在本文中介绍后一种方法,因为它需要的步骤更少,但是强烈推荐前一种方法用于任何实际任务。

启动 EC2 实例 这篇文章假设你已经创建了一个 AWS 账户。AWS 提供了许多自由层选项,您可以使用它们来熟悉该平台。EC2 是一项服务,可用于启动和连接虚拟机。我们将启动一个 EC2 实例,并使用它来托管 Jupyter 笔记本。关于使用 EC2 的文档可以在这里找到。

Launching an EC2 instance on AWS

从 EC2 仪表板执行以下步骤启动机器:

1.点击
的【启动实例】2。选择“亚马逊 Linux AMI 2018 . 03 . 0”
3。选择“t2.micro”,这是符合条件的自由层
4。点击
5【审核并启动】。点击“Launch ”,然后选择通过 SSH 连接的密钥
6。单击“启动实例”,然后单击“查看实例”

我们还需要编辑机器的配置,以便允许端口 8888 上的入站 Jupyter 连接。默认情况下,EC2 实例只允许使用私钥进行身份验证的端口 22 上的入站连接。关于配置安全组的文档可在这里获得。

Setting up an exception for port 8888 for Jupyter.

我们将只允许主机在端口 8888 上连接到 EC2 实例。从 EC2 仪表板执行以下步骤:

1.选择您的 EC2 实例
2。在“描述”下,选择安全性(如启动向导-1)
3。点击【操作】->-【编辑入站规则】
4。添加新规则:将端口改为 8888,在 source 下选择“我的 IP”
5。点击“保存”

执行完这些步骤后,您现在就有了一个正在运行的 EC2 实例,并有一个开放的端口可用于连接 Jupyter。为了连接到您的实例,您需要一个工具,比如 Putty。此处提供了针对 Windows 用户的说明。另一个选择是使用 Java 直接连接到您的实例。不过我之前没用过这个,在 Chrome 里已经弃用了。

安装 Jupyter
一旦您能够连接到您的实例,您将需要设置 Python 3 和 Jupyter。该实例应该已经安装了 Python 2.7,但是我们希望使用一个更新的版本。运行以下命令安装 Python 3、pip 和 Jupyter:

sudo yum install -y python36
python36 --version
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
sudo python36 get-pip.py
pip3 --version
pip3 install --user jupyter

亚马逊 linux 发行版是基于 RedHat 的,所以 yum 是用来安装软件的。Pip 是 Python 的包管理器,我们将在后面的步骤中使用它来安装库。我还包含了检查安装版本的语句。

Private IP and Public IP details for my test instance.

默认情况下,Jupyter 只接受来自本地机器的连接。这可以通过使用--ip命令来改变。为了在 EC2 实例上工作,您需要使用机器的私有 IP。这就是上图中的172.31.60.173。您可以使用以下命令启用远程连接并启动 Jupyter:

jupyter notebook --ip *Your_AWS_Prive_IP*

当 Jupyter 启动时,它会提到一个特定的 URL,需要复制到您的浏览器中才能运行笔记本。因为我们将 Jupyter 配置为使用私有 IP,所以这是在启动 Jupyter 时打印出来的内容。要连接到机器,你需要复制链接,还要将 IP 从私有 IP 修改为公有 IP,也就是上图中的18.206.244.128

# output from running the command
The Jupyter Notebook is running at:
[http://*Your_AWS_Private_IP*:8888/?token=dd921a6c4ebc3a3bb90fcd8ac44394692a80685705da30e3](http://172.31.60.173:8888/?token=dd921a6c4ebc3a3bb90fcd8ac44394692a80685705da30e3)# switch the internal IP to external to run in a browser
[http://Your_AWS_Public_IP:8888/?token=dd921a6c4ebc3a3bb90fcd8ac44394692a80685705da30e3](http://172.31.60.173:8888/?token=dd921a6c4ebc3a3bb90fcd8ac44394692a80685705da30e3)

如果一切顺利,您现在应该会在浏览器中看到 Jupyter。

The Jupyter landing page on my EC2 instance.

现在,您已经有了一个用于创作交互式 python 3 脚本的笔记本!

连接到 BigQuery

现在我们已经有了一个 Jupyter 笔记本,在深入研究商业智能和 EDA 之前,我想探索的第一步是弄清楚如何将数据从 BigQuery 提取到 Pandas 数据框架中进行分析。虽然谷歌确实提供了一个在 Python(谷歌云存储)中使用 GCP 的库,但我们不需要在这个特定的用例中使用它。 pandas-gbq 库使得在本地提取结果集进行分析的任务变得容易。要设置该库以及用于绘图的 matplotlib ,在终端中运行以下命令:

pip3 install --user pandas-gbq
pip3 install --user matplotlib

我们可以切换回 Jupyter 环境,开始使用 BigQuery 公共数据集。下面代码片段中的第一行加载 pandas 库,它是在安装 pandas-gbq 时作为一个依赖项安装的。第二行标识运行查询时使用的产品 id。第三个命令运行一个查询,从出生率数据集中提取一个数据样本,并将结果集分配给 pandas 数据帧。最后一步显示关于 df 对象中数据类型的信息。当您第一次运行这个脚本时,笔记本会提示您输入一个密钥,作为向 Google 进行身份验证的一部分。单击提供的链接并复制密钥以继续。

import pandas as pdprojectid = "your_project_id"df = pd.read_gbq("""SELECT * 
    FROM `bigquery-public-data.samples.natality` limit 100""",
    projectid, dialect = "standard")df.info()

对于 R 用户来说,Python 中的 info() 类似于 str()describe() 类似于 summary() 。如果您想了解数据集的形状,可以使用 DataFrame 对象的一些内置绘图函数,这些函数使用 matplotlib 生成绘图。下面的代码片段显示了如何从 DataFrame 中选择两列,并为这些属性绘制直方图:

df[['weight_pounds', 'mother_age']].hist()

这将生成以下 matplotlib 可视化效果:

Histograms of attributes in the Natality data set.

我们现在已经建立了一个环境,可以将 BigQuery 中的数据提取到 pandas 数据帧中进行分析。该工作簿可在 Github 这里获得,渲染版本可在这里获得。我已经用 Jupyter 笔记本进行了一些分析,所以在这个环境中用 BigQuery 建立 Python 连接是将我的 R 分析移植到 Python 的良好开端。下一步是学习如何使用 Python 库执行探索性数据分析、可视化和建模。

结论

作为我的创业数据科学系列的下一步,我将探索使用 Python 代替 R 来完成脚本任务。Python 提供了许多激发这个端口的伟大库,包括深度学习、对 Spark 更温和的介绍,以及可扩展的笔记本环境。这篇文章展示了如何设置 EC2 实例并远程使用 Jupyter 笔记本。它还展示了如何从 BigQuery 中提取数据。现在我已经为开始使用 Python 打下了一些基础,我可以开始将我的一些帖子从 r 移植到 Python。

创业公司的数据科学:跟踪数据

原文:https://towardsdatascience.com/data-science-for-startups-tracking-data-4087b66952a1?source=collection_archive---------4-----------------------

Source: kristinakasp at pixabay.com

我正在进行的关于在初创公司建立数据科学学科的系列文章的第二部分。你可以在 简介 中找到所有帖子的链接,还有一本基于这个系列的关于 亚马逊 的书。

为了在创业时做出数据驱动的决策,你需要收集关于你的产品如何被使用的数据。您还需要能够衡量产品变更的影响以及营销活动的效果,例如在脸书上部署定制受众进行营销。同样,收集数据对于实现这些目标是必要的。

通常数据是由产品直接生成的。例如,移动游戏可以生成关于启动游戏、开始附加会话和升级的数据点。但是数据也可以来自其他来源,例如电子邮件供应商提供关于哪些用户阅读和点击了电子邮件中的链接的响应数据。这篇文章主要关注第一种类型的数据,即产品生成的跟踪事件。

为什么要记录产品使用数据?

  1. 跟踪指标:您可能希望记录绩效指标,以跟踪产品健康状况或其他对业务运营有用的指标。
  2. 进行实验:为了确定对产品进行改变是否有益,你需要能够衡量结果。
  3. 构建数据产品:为了做出类似推荐系统的东西,你需要知道用户在和哪些项目进行交互。

有人说数据是新的石油,有各种各样的理由从产品中收集数据。当我刚开始进入游戏行业时,从产品跟踪的数据被称为 遥测 。现在,从产品中收集的数据经常被称为跟踪

这篇文章讨论了收集什么类型的产品使用数据,如何将数据发送到服务器进行分析,构建跟踪 API 时的问题,以及跟踪用户行为时需要考虑的一些问题。

录什么?

部署新产品时首先要回答的问题之一是:

关于用户行为,我们应该收集哪些数据?

答案是,这取决于您的产品和预期的用例,但有一些关于在大多数 web、移动和本机应用程序中收集什么类型的数据的通用指南。

  1. 安装:用户基数有多大?
  2. 会议:用户群的参与度如何?
  3. 货币化:用户花了多少钱?

对于这三种类型的事件,数据可能实际上是从三个不同的系统生成的。安装数据可能来自第三方,如 Google Play 或 App Store,会话开始事件将从客户端应用程序生成,在应用程序中花钱或查看广告可能会被不同的服务器跟踪。只要您拥有生成数据点的服务,就可以使用相同的基础设施来收集不同类型事件的数据。

收集关于有多少用户启动和登录应用程序的数据将使您能够回答关于您的基础规模的基本问题,并使您能够跟踪业务指标,如 DAU、MAU、ARPDAU 和 D-7 保留率。然而,它没有提供太多关于用户在应用程序中正在做什么的信息,也没有提供许多对构建数据产品有用的数据点。为了更好地了解用户参与度,有必要跟踪特定领域或产品的数据点。例如,您可能希望在控制台的多人射击游戏中跟踪以下类型的事件:

  1. GameStarted: 追踪玩家何时开始单人或多人游戏。
  2. PlayerSpawn: 追踪玩家何时产卵进入游戏世界,并追踪用户正在玩的职业,比如战斗医疗兵。
  3. 玩家死亡:追踪玩家死亡和卡住的地方,并允许计算指标,如 KDR(杀死/死亡比率)。
  4. 等级:追踪玩家升级或解锁新等级的时间。

这些事件中的大多数可以很好地转化为其他射击游戏和其他类型,如动作/冒险。对于特定的游戏,例如 FIFA,您可能希望记录游戏特定的事件,例如:

  1. 进球得分:追踪球员或对手得分的时间。
  2. 球员替换:跟踪球员何时被替换。
  3. RedCardReceived: 追踪玩家何时收到红牌。

像先前的事件一样,许多这些游戏特有的事件实际上可以推广到体育游戏。如果你是一家像 e a 这样的公司,拥有不同的体育项目组合,那么在你所有的体育项目中跟踪所有这些事件是很有用的(红牌事件可以概括为点球事件)。

如果我们能够收集关于玩家的这些类型的事件,我们就可以开始回答关于玩家基础的有用问题,例如:

  1. 收到更多红牌的用户更有可能退出吗?
  2. 在线专注玩家比单机专注玩家玩的多吗?
  3. 用户玩的是刚发布的新职业模式吗?

大多数跟踪事件都集中在收集已发行游戏的数据点上,但也有可能在开发过程中收集数据。在微软工作室,我与用户研究团队合作,为游戏测试进行跟踪。因此,我们可以生成可视化效果,用于向游戏团队传达玩家遇到的困难。将这些可视化整合到游戏测试结果中,会得到游戏团队更好的接受。

Ryse: Son of Rome Playtesting — Microsoft Studios User Research

当您第一次将跟踪添加到产品中时,您不会知道对记录有用的每一个事件和属性,但是您可以通过询问团队成员他们打算问什么类型的关于用户行为的问题,以及通过实现能够回答这些问题的事件来做出一个很好的猜测。即使有好的跟踪数据,你也不可能回答每个问题,但是如果你有好的覆盖率,你就可以开始改进你的产品。

跟踪规格

一些团队编写跟踪规范来定义产品中需要实现的跟踪事件。其他团队没有任何文档,只是简单地采用最佳猜测方法来确定记录什么。我强烈推荐编写跟踪规范作为最佳实践。对于每个事件,规范应该确定触发事件的条件、要发送的属性以及任何特定于事件的属性的定义。例如,web 应用程序的会话启动事件可能具有以下形式:

  • 条件:当用户第一次浏览到该域时触发。当用户点击新页面或使用后退按钮时不应触发该事件,但当用户浏览到一个新的域并返回时应触发该事件。
  • 属性:网络浏览器和版本、用户标识、登陆页面、引用 URL、客户端时间戳
  • 定义: referring URL 应列出将用户推荐到该域的页面的 URL,或者将用户推荐到该网页的应用程序(如脸书或 Twitter)。

跟踪规格是非常有用的文档。小型团队可能没有编写跟踪规范的正式过程,但是许多场景会使文档变得至关重要,例如在新平台上实现事件,为新的后端服务重新实现事件,或者让工程师离开团队。为了使规格有用,有必要回答以下问题:

  1. 谁负责编写规范?
  2. 谁负责实施规范?
  3. 谁负责测试实现?

在小型组织中,数据科学家可能负责跟踪的所有方面。对于一个更大的组织,所有者通常是产品经理、工程团队和测试团队。

客户端与服务器跟踪

为产品设置跟踪时的另一个考虑是确定是从客户端应用程序还是后端服务发送事件。例如,一个视频流网站可以直接从 web 浏览器或者从提供视频的后端服务发送关于用户正在观看的视频的数据。虽然这两种方法各有利弊,但如果可能的话,我更喜欢为后端服务而不是客户端应用程序设置跟踪。服务器端跟踪的一些好处是:

  1. 可信来源:您不需要在 web 上公开端点,并且您知道事件是从您的服务而不是机器人生成的。这有助于避免欺诈和 DDoS 攻击。
  2. 避免广告拦截:如果您将数据从客户端应用程序发送到暴露在 web 上的端点,一些用户可能会阻止对端点的访问,这会影响业务指标。
  3. 版本化:你可能需要对一个事件进行修改。您可以根据需要更新 web 服务器,但通常不能要求用户更新客户端应用程序。

从服务器而不是客户端应用程序生成跟踪有助于避免欺诈、安全和版本控制方面的问题。然而,服务器端跟踪有一些缺点:

  1. 测试:出于测试目的,您可能需要添加新的事件或者修改现有的跟踪事件。这通常更容易通过在客户端进行更改来实现。
  2. 数据可用性:您可能想要跟踪的一些事件不会调用 web 服务器。例如,一个控制台游戏可能在会话开始时没有连接到任何 web 服务,而是希望直到多人游戏比赛开始。此外,诸如引用 URL 之类的属性可能只对客户端应用程序可用,而对后端服务不可用。

一般原则是不要相信客户端应用程序发送的任何内容,因为端点通常是不安全的,并且没有办法验证数据是由您的应用程序生成的。但是客户端数据非常有用,所以最好将客户端和服务器端跟踪结合起来,并保护用于从客户端收集跟踪的端点。

发送跟踪事件

向服务器发送数据的目的是使数据可用于分析和数据产品。根据您的使用案例,可以使用许多不同的方法。本节介绍了向 web 上的端点发送事件并将事件保存到本地存储的三种不同方式。下面的示例不是产品代码,而是简单的概念证明。本系列的下一篇文章将讨论构建处理事件的管道。以下示例的所有代码都可以在 Github 上获得。

网络呼叫 建立追踪服务最简单的方法是通过网络呼叫网站的事件数据。这可以用一个轻量级 PHP 脚本来实现,如下面的代码块所示。

<?php
    $message = $_GET['message'];
    if ($message != '') {
        $dataFile = fopen("telemetry.log", "a");
        fwrite($dataFile, "$message\n");
        fflush($dataFile);
        fclose($dataFile);
    }
?>

这个 php 脚本从 URL 中读取消息参数,并将消息附加到本地文件中。可以通过 web 调用来调用该脚本:

http://.../tracking.php?message=Hello_World

可以使用下面的代码从 Java 客户端或服务器进行调用:

// endpoint
String endPoint = "http://.../tracking.php";// send the message
String message = "Hello_World_" + System.currentTimeMillis();   
URL url = new URL(endPoint + "?message=" + message);  
URLConnection con = url.openConnection();  
BufferedReader in = new BufferedReader(new 
    InputStreamReader(con.getInputStream())); // process the response 
while (in.readLine() != null) {}  
in.close();

这是开始收集跟踪数据的最简单的方法之一,但它不可扩展,也不安全。这对于测试很有用,但是对于任何面向客户的东西都应该避免使用。我过去确实用这种方法为一个马里奥级别的生成器实验收集玩家的数据。

Web 服务器 您可以使用的另一种方法是建立一个 Web 服务来收集跟踪事件。下面的代码展示了如何使用 Jetty 来建立一个收集数据的轻量级服务。为了编译和运行这个例子,您需要包含下面的 pom 文件。第一步是启动一个处理跟踪请求的 web 服务:

public class TrackingServer extends AbstractHandler { public static void main(String[] args) throws Exception {
    Server server = new Server(8080);
    server.setHandler(new TrackingServer());
    server.start();
    server.join();
  } public void handle(String target, Request baseRequest,
      HttpServletRequest request, HttpServletResponse response) 
      throws IOException, ServletException { // Process Request
  }
}

为了处理事件,应用程序从 web 请求中读取消息参数,将消息附加到本地文件,然后响应 web 请求。此示例的完整代码可从这里获得。

// append the event data to a local file 
String message = baseRequest.getParameter("message");
if (message != null) {
  BufferedWriter writer = new BufferedWriter(
      new FileWriter("tracking.log", true));
  writer.write(message + "\n");
  writer.close();
}// service the web request
response.setStatus(HttpServletResponse.SC_OK);
baseRequest.setHandled(true);

为了用 Java 调用端点,我们需要修改 URL:

URL url = new URL("[http://localhost:8080/](http://localhost:8080/?message=Hello_World)?message=" + message);

这种方法可以比 PHP 方法扩展得多一点,但是仍然不安全,不是构建生产系统的最佳方法。我对构建生产就绪跟踪服务的建议是使用流处理系统,如 Kafka、Amazon Kinesis 或 Google 的 PubSub。

订阅服务 使用 PubSub 等消息服务使系统能够收集大量的跟踪数据,并将这些数据转发给许多不同的消费者。Kafka 等一些系统需要设置和维护服务器,而 PubSub 等其他方法是无服务器的托管服务。托管服务非常适合初创公司,因为它们减少了所需的开发运维支持量。但是代价是成本,使用托管服务来收集大量数据的成本更高。

下面的代码展示了如何使用 Java 向 PubSub 上的主题发布消息。完整的代码清单可从这里获得,用于构建项目的 pom 文件可从这里获得。为了运行这个例子,您需要建立一个免费的 google cloud 项目,并启用 PubSub。关于设置 GCP 和 PubSub 的更多细节可以在这篇文章中找到。

// Set up a publisher
TopicName topicName = TopicName.of("projectID", "raw-events");
Publisher publisher = Publisher.newBuilder(topicName).build();//schedule a message to be published
String message = "Hello World!";
PubsubMessage pubsubMessage = PubsubMessage.newBuilder()
    .setData(ByteString.copyFromUtf8(message)).build();// publish the message, and add this class as a callback listener
ApiFuture<String> future = publisher.publish(pubsubMessage);
ApiFutures.addCallback(future, new ApiFutureCallback<String>() {
  public void onFailure(Throwable arg0) {}
  public void onSuccess(String arg0) {}
});publisher.shutdown();

此代码示例显示了如何向 PubSub 发送一条消息来记录跟踪事件。对于一个生产系统,您将希望实现 onFailure 方法来处理失败的交付。上面的代码显示了如何用 Java 发送消息,同时也支持其他语言,包括 Go、Python、C#和 PHP。它还可以与其他流处理系统(如 Kafka)连接。

下一段代码显示了如何从 PubSub 读取消息,并将消息附加到本地文件。完整的代码清单可在这里获得。在下一篇文章中,我将展示如何使用数据流消费消息。

// set up a message handler
MessageReceiver receiver = new MessageReceiver() {
  public void receiveMessage(PubsubMessage message, 
    AckReplyConsumer consumer) { try {
      BufferedWriter writer = new BufferedWriter(new
        FileWriter("tracking.log", true));
      writer.write(message.getData().toStringUtf8() + "\n");
      writer.close();
      consumer.ack();
    }
    catch (Exception e) {}
}};// start the listener for 1 minute
SubscriptionName subscriptionName =
    SubscriptionName.of("your_project_id", "raw-events");
Subscriber subscriber = Subscriber.newBuilder(
    subscriptionName, receiver).build();
subscriber.startAsync();
Thread.sleep(60000);
subscriber.stopAsync();

我们现在有了一种从客户端应用程序和后端服务获取数据到一个中心位置进行分析的方法。显示的最后一种方法是用于收集跟踪数据的可扩展且安全的方法,并且是一种托管服务,使其非常适合具有小型数据团队的初创公司。

消息编码

将数据发送到端点进行收集时,需要做出的决策之一是如何对发送的消息进行编码,因为从应用程序发送到端点的所有事件都需要序列化。当通过互联网发送数据时,最好避免特定语言的编码,比如 Java 序列化,因为应用程序和后端服务可能用不同的语言实现。当使用特定于语言的序列化方法时,还会出现版本控制问题。

编码跟踪事件的一些常见方法是使用 JSON 格式和谷歌的协议缓冲区。JSON 的优点是可读性强,并且受到多种语言的支持,而 buffers 提供了更好的理解,可能更适合某些数据结构。使用这些方法的好处之一是在发送事件之前不需要定义模式,因为消息中包含了关于事件的元数据。您可以根据需要添加新的属性,甚至更改数据类型,但这可能会影响下游的事件处理。

当开始构建数据管道时,我推荐使用 JSON 开始,因为它是人类可读的,并且受到多种语言的支持。避免管道分隔格式之类的编码也很好,因为在更新跟踪事件时,您可能需要支持更复杂的数据结构,如列表或地图。下面是一个消息的示例:

# JSON
{"Type":"Session","Version":1.0,"UserID":"12345","Platform":"iOS"}# Pipe delimited
Session|1.0|12345|iOS

XML 呢?不要!

构建跟踪 API

要构建一个生产系统,您需要在跟踪代码中增加一点复杂性。生产系统应该处理以下问题:

  1. 传递失败:如果消息传递失败,系统应该重试发送消息,并有退避机制。
  2. 排队:如果端点不可用,比如没有信号的电话,跟踪库应该能够存储事件以供以后传输,比如当 wifi 可用时。
  3. 批处理:与其发送大量的小请求,不如批量发送跟踪事件。
  4. 优先级:有些消息比其他消息更需要跟踪,比如更喜欢货币化事件而不是点击事件。跟踪库应该能够优先处理更关键的事件。

拥有一个禁用跟踪事件的过程也很有用。我见过客户端应用程序发送太多数据导致数据管道爆炸,如果不关闭所有跟踪,就无法禁止客户端发送有问题的事件。

理想情况下,生产级系统应该有某种审计,以便验证端点是否接收到所有发送的数据。一种方法是将数据发送到构建在不同基础设施和跟踪库上的不同端点,但是过多的冗余通常是多余的。一种更轻量级的方法是为所有事件添加一个顺序计数属性,因此如果一个客户端发送 100 条消息,后端可以使用这个属性来知道客户端尝试发送了多少个事件并验证结果。

隐私

存储用户数据时需要考虑隐私问题。当数据可供分析和数据科学团队使用时,所有个人身份信息(PII)都应该从事件中剔除,包括姓名、地址和电话号码。在某些情况下,用户名,如玩家在 Steam 上的玩家代号,也可能被视为 PII。从任何被收集的数据中去除 ip 地址也是很好的,以限制隐私问题。一般建议是收集尽可能多的行为数据来回答有关产品使用的问题,同时避免收集敏感信息,如性别和年龄。如果你正在基于敏感信息构建一个产品,你应该有强有力的用户访问控制来限制对敏感数据的访问。GDPR 等政策正在为收集和处理数据制定新的法规,GDPR 在运送带跟踪功能的产品前应接受审查。

摘要

跟踪数据使团队能够回答关于产品使用的各种问题,使团队能够跟踪产品的性能和健康状况,并可用于构建数据产品。这篇文章讨论了收集用户行为数据所涉及的一些问题,并提供了如何将数据从客户端应用程序发送到端点以供以后分析的示例。以下是这篇文章的要点:

  1. 如果可能,使用服务器端跟踪。它有助于避免各种各样的问题。
  2. QA/测试您的跟踪事件。如果你发送的是错误的数据,你可能会从数据中得出不正确的结论。
  3. 有一个版本控制系统。您需要添加新事件和修改现有事件,这应该是一个简单的过程。
  4. 使用 JSON 发送事件。它是人类可读的、可扩展的,并且受到多种语言的支持
  5. 使用托管服务收集数据。你不需要启动服务器,就可以收集大量的数据。

随着您运送更多的产品和扩大您的用户群,您可能需要更改到不同的数据收集平台,但此建议是运送带跟踪的产品的良好起点。

下一篇文章将介绍构建数据管道的不同方法。

本·韦伯是游戏行业的数据科学家,曾在电子艺界、微软工作室、黎明游戏和 Twitch 任职。他还在一家金融科技初创公司担任第一位数据科学家。

LGBTQIA+社区的数据科学?

原文:https://towardsdatascience.com/data-science-for-the-lgbtqia-community-f476c10b45cb?source=collection_archive---------2-----------------------

Technically minded queers need to think about how to contribute back to our community.

数据收集在边缘化群体中并不真正享有很高的声誉。我们经常听到关于以安全为名监视移民、有色人种社区和社会正义活动家的新闻。对收集个人数据的不信任不足为奇,因为这可能会导致更多的监管。

除了这种明显的数据滥用,还有一些故事表明,机器学习算法确实可能是种族主义和性别歧视的。关于数据科学中遵循的道德规范,人们正在进行讨论。然而,我严重怀疑大多数数据科学家对种族、性别等有足够的分析,并且算法将继续偏向更有特权的个人。如果你愿意,可以称我为技术悲观主义者。

在过去的 5-10 年里,数据科学领域出现了爆炸式增长。随着我们进入一个新时代,一切都在收集你的数据,公司正在寻求利用这些数据的方法。数据科学家相当于几十年前的经典统计学家。我们当然会做统计,但我们也会花很多时间编程和管理所谓的“大数据”。这是一份非常有魅力的工作。我开玩笑。

我花了一些时间思考的一件事是,我如何使用随机森林算法来推进我们为酷儿正义和解放而战(:数据科学中的笑话是,我们把随机森林扔向一切,然后就到此为止)。

这就引出了一些数据分析可能已经成熟的问题。以下是预测分析可用于社会公正的一些例子:

  1. LGBTQ 个人更有可能被监禁。如果你是有色人种就更是如此。你可以想出几个可能造成这种情况的关键因素,但哪些因素影响最大,哪些因素影响最小?这将给我们一种感觉,我们的社区可以如何重建自己,以防止我们的成员被监禁。例如,如果你能够获得被监禁的同性恋者的人口统计数据,人口普查相关数据,教育相关数据,健康相关数据,并与那些没有被监禁的同性恋者进行比较,是否有任何有趣的趋势可以为潜在的决策者和非营利组织提供信息?围绕累犯的因素呢?是否有数据驱动的方法可以证明是有用的,从而可以产生实际的(和经济上可行的)解决方案来解决我们社区中的这个问题?
  2. 与他们的异性恋、异性同龄人相比,LGBTQ 个体面临着更多的健康差异。你可以想到影响我们社区差异的一大部分社会因素。这些因素包括:支付健康保险的能力、被健康提供者歧视的经历、去健康中心的距离和可行性、与同性恋相关的健康问题的教育计划、职业和/或就业状况、是否无家可归、年龄、种族、性别等。具体问题包括改善获得艾滋病教育和预防计划的机会,变性人获得激素的医疗机会,改善我们的 LGBTQ 老人的酷儿健康。

回答这些问题的困难在于从我们的社区获取数据的能力。幸运的是,我怀疑全国各地的非营利组织都有自己的内部数据库。在这个重视数据的时代,我怀疑这些非营利组织似乎也在参与大数据游戏,以帮助指导他们的政策工作。然而,搜索“酷儿”和“数据科学”收效甚微。我毫不怀疑有数据科学家是 LGBTQ,但似乎没有兴趣将其应用于我们社区的社会公益。

这并不是说数据科学家不打算利用机器学习的力量来改善社会。事实上,有专门的节目。我想我的观点是,有太多的数据科学家关心在世界上所有的 Facebooks、Googles 和 Amazons 上获得轻松的工作,而没有足够的人真正将他们的技术专长集中在影响我们整个社会的问题上。

所以,对于所有在拥有数据的组织中工作的激进同性恋者们:你们希望看到数据如何被使用?你希望回答什么问题?

米歇尔是波士顿的 LGBTQ 活动家和数据科学家。你可以在她的 LinkedIn 或者她的 个人网站 上找到更多关于她的信息。

“数据科学 A-Z 从零到 Kaggle 内核大师”

原文:https://towardsdatascience.com/data-science-from-zero-to-kaggle-kernels-master-f9115eadbb3?source=collection_archive---------2-----------------------

我最后一年学习数据科学的一个简短故事

我来自巴西,世界各地的许多人都与我联系,询问在数据科学领域学习或获得空缺职位的技巧,所以我决定写这篇文章,让内容更加“结构化”,并以更好的方式为刚刚开始这一旅程的人做出贡献。

在这第一篇文章中,我将为我打算写的下一篇文章做一种语境化,在那里我将更深入地探讨我将在这篇文章中阐述的一些主题。

我将在数据区讲述我到目前为止的故事,最后,我会留下一些提示,以帮助那些正在起步,也想进入该领域但不太清楚该做什么,从哪里开始或去哪里的人。

我第一次接触数据科学是在一年半多以前,2017 年 5 月 25 日。我失业了,试图在股票市场上坚持不懈地操作,尽管我掌握了许多行之有效的技术,但这需要巨大的情绪控制,在经历了很多压力后,我在《福布斯》上看到了一篇关于数据科学的文章,其中引用了“21 世纪最性感的职业”及其原因。这让我从一开始就受到了很多关注,它谈论的是高平均工资,以及对这种类型的专业人员的巨大需求,这种专业人员必须掌握很多东西,如商业、数学、统计和编程,在许多人眼中,这是一种罕见的专业人员,他的能力越高、越平衡,就可以被视为“独角兽”。

我毕业于会计专业,曾在公司金库工作,在股票市场交易,在互联网上销售商品,由于我的生活,我一直对商业、创业和金融数学有一定的感觉。在大学里,我有数学和统计学,但在编程方面,我的概念接近于零。

我也是哲学和知识理论的狂热爱好者,我相信这帮助我构建了我想要学习的形式,因为我已经从自学阶段走出来,我开始寻找解释数据科学/ ML /大数据的网站、博客和新闻,我发现了这些概念背后的东西,对于我遇到的每个新主题,我都试图更深入地搜索参考资料。当时我还不知道 MOOC 的概念,MOOC 是一种更适合 21 世纪教学的在线课程,那些有纪律的人可以荒谬地优化学习时间,节省金钱,仍然拥有等同于甚至领先于课堂课程的知识。当时,我还买了一本名为《从零开始的数据科学 Python 的首要原则》的好书,在最初的几周内,这本书吸引了我的业务资料,并表现出了极大的兴趣,尽管我对该领域几乎一无所知,但一些采访已经出现了。

我总共通过 LinkedIn 参加了 10 场面试,但我没有在任何一场面试中获得工作,但这给了我很大的力量继续全职投入(周一至周一每天大约 12 小时至 14 小时的学习),因为我意识到确实有很多需求,如果我这样做了,我无疑会有机会,因为这是一个全新的行业,许多人甚至说这是新的石油。

我遇到的第一个 MOOC 是 Udemy。起初,我觉得很有趣,很快就出现了从 20.00 美元起的促销活动。所以我忘乎所以,买了许多课程,包括“机器学习 A-Z”,“从零到英雄的数据科学”,一些 Tableau,但很快我意识到我有多愚蠢,我最终要求报销这 3 门课程,因为我当时的英语很糟糕,而且课程只是视频。在此期间,我认识了其他平台,其中一个去了 Udacity,在那里赌了我的筹码。

我看了很多视频,都在谈论纳米学位的课程,这引起了我的注意。尤其是现代的教学和纠正是由一个“真人”来完成的,他会反馈信息。第一部分非常快,非常兴奋,虽然它没有代码,但我喜欢这个过程。但当它到达代码的部分时,我开始越来越难理解,而且当时仍然有很多没有葡萄牙语字幕的视频。

我在 Python 中做的第一次单独分析是在 2017 年 7 月 21 日,用泰坦尼克号数据集并应用我在统计模块中学到的概念,这个项目有助于澄清许多关于数据科学的应用,即使是在这样一个简单的数据集中。在下一个模块中,我无法继续学习,因为我无法理解部分代码。我的结论是,没有编程基础,我只是在浪费时间。

在我要求取消课程之前,我试图通过参加各种课程和 YouTube 课程,如 Gustavo Guanabara 和其他几位非常优秀的人,他们致力于在互联网上免费教授逻辑和编程,来学习逻辑。一个多月后,我致力于开发 Python 的这个基础,我遇到了 Datacamp,这是一个改变我学习和在线观看教学方式的平台。

My position on “Datacamp Rank” with 250k exp | January 2018

Datacamp 非常适合我,因为我的英语仍然很不稳定,而且有书面的说明和材料,我经常不得不去谷歌翻丨译丨公丨司“确保”,还为你提供了一个区域来放置你制作的代码并提交测试,自动更正,如果你达到了分辨率,你将在平台上获得积分。我开始测试一些课程,因为我发现平台与我已经测试过的平台不同,所以我决定尝试付费版本,并开始“Python 数据科学家跟踪”,如果我不能开发代码或理解问题,我可以单击“提示”,任务的提示或说明就会出现,如果我仍然不知道如何做,只需再次点击提示,系统就会显示完整的代码。我正在学习这门课程,并通过《零数据科学》( Data Science of Zero)这本书、更多具体的书籍、文本、博客、论文、小组、论坛、Youtube 上的视频以及其他一些参考资料来完成理论,以便更好地理解每个概念和应用……但当它开始机器学习的部分时,我开始感到非常不安全,因为它给人的印象是我“没有在学习”,这对任何领域的初学者来说都是正常的,而且还没有将学习付诸实践。

沮丧之余,我不确定该做什么,我决定尝试“R 的数据科学家之路”,因为我知道 R 是一种统计语言,因为我对 Python 感到失望,所以我深入研究了 R,也许现在对 Python 有点熟悉了,我对 R 语言非常熟悉,在很短的时间内就完成了。 我还强化了大多数概念,并将其重新应用于其他数据集……完成本课程后,我决定再学习一门 R 课程,重点是金融领域,“R 量化分析师课程”,在这里我学到了许多有趣的新东西。 直到 2017 年 12 月,我得到了一个实习机会,由于工作中要用到 Python,我又回到了 Datacamp 的 Python 课程。

由于我使用 Python 已经有一段时间了,所以当我回来时,我感到非常失落,而且是在我必须将我的知识应用于第一个“真实数据集”的时候,任务是为一家公司预测欺诈,而这一次,没有人告诉我该做什么,如何分析,使用什么以及什么指标是重要的……没有太多的对错。

在第一瞬间,我完全迷失了,不知道从哪里开始,因为在那之前,我只看到了理论,特别是对于一个不“受欢迎”的数据集(如虹膜、蘑菇、纽约出租车、乳腺癌等),其中应该研究的变量有些明显并且非常有限。

My total exp and completed Courses on Datacamp on August 2018

随着时间的推移,事情变得越来越有意义,项目按时交付,最终我们在欺诈预测方面取得了良好的结果,但即使一切顺利,对我来说也很紧张,因为我仍然在做任何涉及代码的事情时遇到了一些困难,正如我听说的 Kaggle 一样, 这是一个预测建模和分析竞赛的平台,在这个平台上,统计学家和数据挖掘者竞争产生最好的模型来预测和描述最近被谷歌收购的公司和用户发送的数据集,我去寻找他们推荐给我的一个经典数据集, 这是德国信用风险的,其目标是开发一种分析,并根据客户的历史预测信贷是否可以授予特定客户,因为我是一名会计师, 我有一定的能力来探索和展示数据,这最终为我赢得了数据平台上的许多投票,并激励我继续开发更多的内核,直到我对不同数据类型和不同行业的代码和不同分析方法足够熟悉,尝试以更抽象的形式关注数据,但总是考虑每个行业的不同细微差别。

我很快意识到,金融/经济方面的分析很有市场,出于某种原因,很少有人关注这种类型的分析,但这种分析得到了很好的接受。

我和 Kaggle 的第一次互动是在 2018 年 1 月 8 日,在一个半月的时间里,我达到了 Kaggle 专家内核的水平。我非常兴奋,真的被我所学的一切迷住了,仅仅几个月后,我在 Kiva 的 Kernels Data Science for Good 中获得了第一名,获得了一千美元的奖金。在 2018 年 4 月比赛开始的同时,我换了我的公司,去了一家可视化真正大数据的公司工作,在一个自己的平台上使用 javascript(当时我还不知道 javascript),我已经以数据科学家的身份参加了比赛,一个月后,5 月 20 日,我是世界上第 21 个获得 Kaggle 内核大师资格的人,也是第一个获得 ka ggle 内核大师资格的巴西人。

经过我在 Kaggle 所做的所有分析和工作,以及过去几个月我为大公司参与的项目,加上长时间的学习,我已经积累了很好的行李,能够很好地理解和频繁地洞察数据、产品、分析,并且通常仅通过好奇心或知识本身。对于任何喜欢学习、不怕挑战的人,尤其是喜欢解决问题的人来说,这是一个非常有趣和丰富的领域。

就我目前所见,数据科学家没有单一的个人资料或共识,这是非常自由的,因为它为来自社会最广泛领域的人打开了空间,尽管许多人试图将无数的限制和你的领域或学术地位作为先决条件,但重要的是你可以思考、理解、解释和主要应用任何类型的数据集中的知识。

我在这里写了太多,我讲述我的故事只是为了将我给朋友和在 LinkedIn 或 Kaggle 上给我打电话的人的提示联系起来,并表明只要有奉献精神和专注,在短时间内高质量地学习是可能的。

我目前与世界各地的人就数据进行了很好的对话,并且主要是与获奖的大师 Anderson L. Amaral 在许多自动化解决方案和机器学习咨询方面进行了非常密切的合作,包括特征工程、建模、预处理、优化,甚至数据清理。

此外,我正在寻找一个以英语为母语的国家,以提高我的英语和数据/ML 技能;我真的很喜欢学习,这种语言的更好的领域将帮助我提高我的其他技能。所以我打算尽快去。

最后,这里有一些给处于这种方式并希望成为数据科学家的人的提示:

1 —这需要时间

正如你不可能在几周或几个月内减肥或变得肌肉发达,不要指望数据科学会有什么不同。虽然我有很多空闲时间来学习,但学习的主要因素将是一致性和你花在任务上的时间。你投入得越多,学得就越快。

总是认为,为了学习新的东西,变得更聪明,我们需要像举重、跑马拉松或任何其他类型的高性能活动一样多的努力,所有这些都需要奉献和纪律。

2 —接受提问

不要接受不了解事情是如何运作的。一开始会有点难,因为有很多概念和区域相关。然而,随着时间的推移,这些概念会不断重复,因此,这些概念会变得直观。要考虑的一件好事是,没有人会从你那里拿走你的知识,所以尽可能地“错过”,但要理解概念。

我通常用来激励自己的一件事是寻找儿童、残疾人,甚至老人来做我打算做的事情。

3 —通过数据思考

当你在学习一些东西时,把它作为一种思考工具可能会很有趣…在这种情况下,观察事物并尝试用数据、产品、指标来思考解决方案,这些数据、产品、指标可能适用于你正在观察的事物和相关事物…所以你已经训练了自己分析和直觉应用概念的能力。

当雇用数据科学家时,公司的目标是增加利润,减少一些开支或防止损失/欺诈,所以如果你想为公司工作,请意识到“业务”的重要性。

4 —运用你的知识

在通过课程、MOOCs、视频、书籍积累知识一段时间后,有趣的是,你尝试自己做分析并发展自己的“风格”。我发现 Kaggle 在这方面非常出色,但还有许多其他平台,如 drivendatadata.world 。在开始的时候,优先考虑应用你在某个领域的数据集中的知识,并以简单的形式列出试图回答的初始问题。这是我一开始选择许多金融数据集的原因之一。此外,仅仅因为你在独自练习,就要知道你已经是一个局外人了。

5 —让人们知道你在做什么

这是当今最有趣的领域之一,但仍有许多人抱怨他们在这个领域没有机会,在我看来,其中一个主要原因是人们不知道你在做什么。学会良好的沟通是必不可少的。

My profile on Kaggle in August 2018

我认为这对于一篇介绍性的文章来说已经足够了。我上面写的是一年半以来所做的一切的总结,我打算再写一些文本,深入研究上面提到的主题,并就不同的数据科学概况、快速学习的技术和技巧、帮助理解数据集的方法以及如何从数据探索中获取价值进行一些观察。 还有关于人工智能的自动化,这是我一直致力于的事情,毫无疑问,它将越来越成为世界各地科学家日常工作的一部分。

很快我就会回来,我感谢那些已经阅读的人,如果它变得非常重复,我道歉,因为我不习惯写这么多。此外,对任何英语错误感到抱歉。

请在评论中给出您的反馈,并分享这篇文章,以帮助其他也正在开始的人。此外,请随时在 LinkedIn 上与我联系,如果你有兴趣,请访问我在 KaggleGitHub 上的个人资料,我通常会在那里发布一些我正在开发的项目。

如果你有生意,想开发以盈利为导向的数据科学项目,访问:https://trich.ai/并请求你的预算;

非常感谢大家的关注,继续学习!

数据科学在行动:分析马德里的空气污染

原文:https://towardsdatascience.com/data-science-in-action-analyzing-air-pollution-co-in-madrid-37dc465d78fc?source=collection_archive---------19-----------------------

近年来,马德里某些干旱时期的高污染水平迫使当局采取措施禁止汽车在市中心使用,并被用作提议对该市城市化进行重大改革的理由。感谢马德里市议会开放数据网站,空气质量数据已经上传并公开。有几个数据集,包括从 2001 年到 2018 年登记的污染水平的每日每小时的历史数据,以及用于城市污染和其他颗粒分析的站点列表

数据集非常庞大,所以我决定只分析一种污染物——一氧化碳(CO)。从 2001 年到 2018 年,每天 24 个不同站点的数据每小时公布一次,尽管缺少 2002 年、2006 年至 2010 年这种污染物的数据。

为了得到一个大概的情况,我找到了一年中每一天的平均值,基于所有 24 个站点。这个过程在我的笔记本电脑上花了大约一个小时。通过执行这个操作和绘制接收到的数据,我们已经可以得出一些结论。

从上图中我们可以看出,已经采取的措施对城市中的一氧化碳水平产生了积极的影响。这些年来,这种污染物的平均数量急剧下降。

因为我不是一个经常研究空气质量的人,也不理解它的机理,所以我想知道为什么这个图是三角形的。根据图表,我们可以很容易地说,有些月份污染水平较高,有些月份较低。我想知道那些时期。

为了找出这一点,我决定找出每年的最大值和最小值,并将它们放入不同的表中。我也把这些值标在了图上。说真的,没有得到任何有价值的信息,但它有助于解释一个小窍门。所以,当我第一次绘制这些值时,图表看起来是这样的:

你看,因为最大值和最小值之间的巨大差异,我们看不到最小值的趋势——它几乎是一条直线。我们可以通过将“Y”刻度改为对数来改进它。

plt.yscale('log')

Much better, no?

所以回到我们每年的最小值和最大值。下面你将会看到完整解释一切的表格。(月份是数字,我希望你明白 1 是 1 月,8 是 8 月,不过下一次我将创建一个函数,将这些数字翻译成人类语言:D 语)

Min values

Max values

我真的很惊讶,最大的污染发生在冬季,最小的污染发生在夏季。所以我用我的解题算法来寻找答案。这是我得到的。

一些污染源,如工业排放,无论什么季节,全年都相当稳定。但是冬天轰鸣的壁炉、柴炉和空转的车辆都会增加颗粒物(构成烟雾的颗粒)和一氧化碳(来自汽车尾气)的含量。

除此之外,寒冷的温度和停滞的空气有办法在地面附近创造这些物质的积累,特别是在一种叫做逆温的天气现象期间。在其他季节或天气条件下,暖空气靠近地面,空气很容易上升并带走污染物。在逆温层中,冷空气被一层暖空气限制在地面附近。温暖的空气就像一个盖子,压住这些物质。在逆温期间,烟雾不会上升,一氧化碳会达到不健康的水平。从空气质量的角度来看,风暴是一个受欢迎的天气事件。风、雨和暴风雪有时被称为洗涤器,因为它们有助于清除和分散令人担忧的物质。

更多详细信息可点击此处— “为什么冬天空气污染更严重?”这里— “寒冷天气如何影响空气质量”

作为一个生活在城市的人,我认为空气污染在夏天更严重,但数据显示完全相反,我无法否认这一点——这就是为什么我热爱数据科学,这就是为什么我热爱我的工作,因为数据从不说谎。是的,作为一个人,你可以在代码中做出不正确的解释或错误,这将扭曲结果,但尽管如此,数据。从来没有。谎言。

希望这篇文章也让一些人大开眼界,如果是的话,请留下评论,你肯定不是一个人🙂

原载于sergilehkyi.com

数据科学在行动:用统计学解释心理学

原文:https://towardsdatascience.com/data-science-in-action-explaining-psychology-using-statistics-be21abf912fb?source=collection_archive---------12-----------------------

Photo by Riccardo Chiarini on Unsplash

是的,使用正确的方法,我们可以获得很多真知灼见

想象一下,你正在淋浴,享受热水,你可以听到远处另一个房间的手机铃声。想象一下,下车,擦干身体,头还湿着跑步,几秒钟后当对方挂断电话时拿起电话。多么重大的事件。它一定会留在你的记忆中。不会停留的是你正在洗澡,享受着水,想着“嘿,电话没响”。不会留在你记忆中的是一天中你的电话响了很多次,而你没有在洗澡。

我猜,你肯定收到过你朋友的来信,或者对自己说过“每次我洗澡的时候电话都会响”,“我的公交车总是晚点”,“我写文章的时候总有人给我发信息”(刚刚发生在:D)。这些片面的事件对我们自己产生了巨大的影响。我们倾向于相信预言性的梦,我们倾向于重视罕见但随机的事件,这没关系。因为这是我们大脑的工作方式,这是认知过程。我们把熟悉的面孔放进梦里,随机事件无时无刻不在发生——我们只需要认识到这一点,并更加小心地做出判断。很多事情都可以用自然的手段来解释。但是让我们面对现实——如果有人做了一个梦,梦见明天他们的狗会死,他们的宠物真的会死,我不会说服这个人。即使告诉你狗不是永生的,它们可能会死,这只狗也有可能在你做这个梦的某一天死去。

但是如果我们稍微修改一下这种体验。想象一下,你做了一个关于你的狗死了的噩梦后醒来,你迅速站起来,去查看它,发现你的毛绒绒的伴侣正坐在窗户前思考更重要的事情。一切都好。你回到你的床上,忘记一切。

这是一个极端的例子,但这种事情经常发生。例如,我的同事发起了一场讨论,他说:“每当我看手机时,小时和分钟的数字都是一样的。看都 19:19 了!”。所以我决定做一个小实验,看看每天能看到几次“幸运数字”的概率。我们都是人,我们会说,当我们连续看到某样东西 3-4 次时,我们总是能看到它。知道了上面描述的效果,事情就没那么复杂了,因为一天中看到几次“幸运时刻”就足够了,甚至不一定要连续看到。

让我们从一个我们称之为“幸运时刻”的协议开始。我决定将零时(14:00,22:00)、相同的小时和分钟(21:21,02:02)以及还原的小时和分钟(23:32,15:51)归入这个类别,总共 64 次。我们知道一天有 24 小时或 1440 分钟,通过简单的计算 64/1440 = 0,04(4),我们发现发现“幸运时刻”的概率约为 4.4%。这并不像掷硬币有 50%的几率或掷骰子有 1/6 的几率那么容易,但这是可能的。

这个过程可以用二项式分布来描述:我在白天随机检查手机- >我看到“幸运时刻”或者正常。真或假。为了应用这一点,我需要一个人查看手机的平均次数。回答这个问题,谷歌是最好的。不同国家的不同研究显示了不同的结果,从 20 到 150,所以我收集了那些在不同来源中重复最多的数字。此外,我采取了三种不同的措施:28,47,86 作为最低,平均和最高。我也认为看到不同之处会很有趣。

下面的代码执行所有的计算。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as snssns.set()np.random.seed(666)
a_min = np.random.binomial(28, 0.044, size=10000)
p_a_min_2 = np.sum(a_min > 1) / 10000
p_a_min_3 = np.sum(a_min > 2) / 10000
p_a_min_4 = np.sum(a_min > 3) / 10000a_avg = np.random.binomial(47, 0.044, size=10000)
p_a_avg_2 = np.sum(a_avg > 1) / 10000
p_a_avg_3 = np.sum(a_avg > 2) / 10000
p_a_avg_4 = np.sum(a_avg > 3) / 10000a_max = np.random.binomial(86, 0.044, size=10000)
p_a_max_2 = np.sum(a_max > 1) / 10000
p_a_max_3 = np.sum(a_max > 2) / 10000
p_a_max_4 = np.sum(a_max > 3) / 10000
# print statements removed, link to github will be below

这是我打印在控制台上的内容:

=假设普通人每天查看手机 28 次= 每天看到两次‘幸运时刻’的概率:0.3543,三次:0.1284,四次:0.0357

=假设普通人每天查看手机 47 次= 每天看到两次“幸运时刻”的概率:0.6115,三次:0.3404,四次:0.1449

=假设普通人每天查看手机 86 次= 每天看到两次“幸运时间”的概率:0.8966,三次:0.734,四次:0.5271

如你所见,概率相当高!如果我们每天查看手机 86 次,那么看到 4 个“幸运时刻”的几率大约是 53%!不要忘记新机器人的功能——永远显示(如果 Iphones 有同样的功能,就没有线索了)。当然,你会得出结论,你看到的只是这些“神奇的时刻”。

您可能会注意到这种类型的事件甚至超过 4 次,模拟显示这个数字甚至可以达到 12 次。看看这个直方图:

从最后一个数字我们可以看出,如果我们经常查看手机,那么看不到“幸运时刻”的可能性比看到它的可能性要小 8!每天次。

我试图更进一步,找出连续两次看到这些神奇数字的概率,但通过 1000 万次模拟,我一无所获。这是代码,如果有人想试试。(请纠正我,如果我犯了错误,这也可能是:D)

n_sequential = 0
size = 28
sample = 10000000

for _ in range(sample):
    rare = np.random.random(size=size) < 0.044
    n_rare = np.sum(rare)
    if n_rare > 1:
        for i in range(size):
            if i == size-1:
                break
            elif rare[i] is True & rare[i+1] is True:
                n_sequential += 1

结论:连续发现两个“幸运数字”的概率非常非常低,当然是随机检查手机。那么怎么谈 3、4 呢?但由于我们头脑中的这些过程,我们告诉人们,当我们查看手机时,我们只能看到“神奇的时间”。

这是一个愚蠢的例子,如果你继续告诉别人你拥有奇异博士管理时间的超能力,这不会对你的生活产生任何影响。我希望我们在作出判断和主张之前稍微思考一下,用科学的方法找到我们问题的答案,打开我们的思维,从第一眼看去,考虑对非自然事物的自然解释,考虑可能与我们不同的其他观点。固执就像被关在你自己的房间里,是的,它是舒适、平静和安全的,但外面是多么美丽啊!宽阔平静的湖泊和河流,新鲜冰冷的海水,有着可爱海滩的大海和波涛汹涌的大海,树叶间洒满阳光的宁静森林和无限的五颜六色的花田,有着令人惊叹的景色的山脉和丘陵,繁忙的城市和宁静的村庄…

我猜,离开你的房间是值得的;)

附:用代码链接到 Github。

最初发表于T5【sergilehkyi.com】

算法交易的数据科学

原文:https://towardsdatascience.com/data-science-in-algorithmic-trading-d21a46d1565d?source=collection_archive---------4-----------------------

在这篇文章中,我计划给你一瞥算法交易的资产模型。这个世界模型应该允许我们根据过去发生的事情来预测将要发生的事情,并通过交易这些信息来赚钱。模型和交易策略只是一个玩具示例,但我提供的是代码中的数据科学部分,这样你就能真正感受到建模工作的真实性。

几个月前我开始为这篇文章写代码,现在我把它和我们获得了 SEC 的 Investifai 许可的消息一起发布!

自从我 2018 年 9 月在 TMLS 的Investifai.com演讲以来,我一直在问我们的专有数据是什么,坦率地说,我不是在说话。需要指出的是,仅凭彭博和汤森路透的“标准”市场数据,你就要与整个金融科技世界为敌,后者为访问这些数据付费。因此,新的数据来源让你在做出其他市场参与者可能没有数据的预测时拥有优势。

在这篇文章中,我将向你展示如何识别经济数据,并将其与可交易资产匹配。我们将获取数据,清理它,询问它,并在一个简单的模型中设置它。

“所有的模型都是错误的,但有些是有用的”——乔治·博克斯

我们在这个玩具练习中的资产是货币对 USD/CAD 。我们可以从 Open Data Canada 这里获得该资产从 20 世纪 50 年代开始的每日历史数据。

下面的代码清理这些数据,将其转换成可用的格式。

以下是 fxtop.com 图表中的美元/加元数据:

这是我们从加拿大开放数据中心提取的数据:

The exchange rate for trading one USD into CAD excluding fees.

两个图表上的数据都在相同的地方下降,再进行一些抽查,我们确信这就是我们所认为的数据。

到目前为止,我们已经看到,为了以一种良好的格式获取数据,需要做一些偷偷摸摸的清理工作。这是数据科学的故事:大部分工作是将数据处理成你观察相关性所需的格式,然后做出预测。

现在,我们继续获取一些数据,我们认为这些数据将有助于我们预测美元/加元资产的走势。该数据也将来自加拿大开放数据公司,以工业产品价格指数(IPPI) 的形式提供,这应该与加拿大货币相对于美国货币的走势有关。如果东西更贵,也许这能告诉我们一些关于经济和货币(相对于美国)的信息。还有很多信息我将跳过部分,这些数据来自以及如何收集和计算。现在抓紧你的座位。开始了…

The full dataset (left) looks right. Taking a closer look at one decade (right) also looks reasonable. We see that not all signals start or end at the same points in time.

上面的两个数字是我们对模型的经济数据的初步分析。我们从数据指南中得知,IPPI 指数挂钩“指数,2010=100”,我们可以清楚地看到从 20 世纪 50 年代到 2019 年的长期数据(左)中的挂钩。一切都汇聚在 2010=100,然后从那里向外扩展。

数据中的特定信号也有一些奇怪之处。下图显示了 2008 年至 2016 年名为“纸质办公用品”的 IPPI 因子的归一化图表。大多数信号不存在这个问题,但要记住数据集并不完美,这一点很重要。

Normalized graph for the IPPI factor called ‘Paper office supplies’ from 2008 to 2016

使用这个数据集有一些严重的限制。首先,它只能按月使用。这对于真正的交易算法来说太慢了。第二,这个指数中的因素都是关于加拿大的,当谈到美元/加元交易时,这是故事的一半或更少。第三,我们没有包括来自新闻或其他数据来源的数据。所有这些都没问题,因为我们只是展示了它在原理上是如何工作的。事实上,有很多方法可以在日常交易中利用月度宏观数据,并将多种类型数据的输入合并到一个模型中。记住这些注意事项,下面是我们如何将 IPPI 数据提取为模型可用的格式:

机器学习模型具有一些输入观察值“x”和一些输出预测值“y ”,其中该模型是建立 y=f(x)关系的函数。模型“f”从观察值映射到预测值。在我们的例子中,“x”是 IPPI 的数据,我们想用它来预测 USD_CAD 的价格变化,这是我们的“y”输出。在我们做出预测之前,我们应该深入研究 IPPI 和美元兑加元之间的相关性,以验证这些东西确实如我们假设的那样相互关联。我们还将看看相关性以外的东西,看看基于 IPPI 数据中的过去值,我们在 USD_CAD 的未来值中看到什么相关性。换句话说,我们将寻找 IPPI 有信号的迹象,我们可以用它来预测 USD_CAD。

让我们首先将经济数据与资产数据结合起来,观察一些很酷的东西。以下所有数据科学的代码都可以在这里找到:

从“大画面”看数据:20 世纪 50 年代至今

预处理后,数据集中保留了 931 个因子。让我们先来看看在整个数据期间(20 世纪 50 年代至今)与 USD_CAD 密切相关的因素。

在第一张图表中,我们看到了一系列有趣的相关性。例如,木材和相关的精炼产品如新闻纸、纸浆和纸张与美元的强势相关。有道理。来自加拿大的昂贵纸张导致需求减少,众所周知,加拿大和美国在软木木材定价上有着永无休止的争端。这告诉我们,来自加拿大的廉价木材给 USD_CAD 带来压力。

接下来,让我们看看哪些因素与美元兑加元走软相关。我们可以从下面的图表中看到,石油和天然气行业发挥着重要作用,矿石和采矿行业也是如此。这是有道理的。加拿大生产矿石(如萨德伯里的镍),也出口石油(如阿尔伯塔省的沥青),因此有理由认为,它们价格的上涨与加元的下跌相关。

以下是每个 IPPI 系数及其与美元兑加元的相关性的缩小视图:

这些是很好的相关性,但是相关性和交易预测不是一回事。我们需要利用因果关系,而不是相关性来赚钱。因此,我们需要某种基于相关性观察预期收益数据。

下图显示了 IPPI 系数与下个月 USD_CAD 值变化之间的相关性。一个警告是,调查数据可能不可用,甚至一个月后,但让我们假设我们可以获得这种及时的数据访问。

Many factors correlate with future changes in USD_CAD

美元兑加元与工业品价格指数的长期总体关系不同于每十年的关系。这是一个好主意,让我们更深入地研究数据,以帮助我们了解 IPPI 因素和美元 _ 加元走势之间的变化关系。在本文的下一节中,我们将研究 1990 年代、2000 年代和 2010 年代的十年数据。

20 世纪 90 年代——美元兑加元的牛市

让我们先来看看 90 年代与美元强势最相关的东西。我们看到一些常见的疑点,如汽车和纸制品(如上所述,价格上涨对 CAD 不利)。有趣的是,IPPI 名列榜首,这表明加拿大工业产品价格普遍较高,意味着美元走强。

在这段时间里,美元被踢了屁股,所以几乎所有东西的价格上涨都与美国的统治地位相关。这是上世纪 90 年代的价格图表:

正如我们在下图中看到的,在 20 世纪 90 年代,只有少数 IPPI 因素与 USD_CAD 负相关。木浆是一种奇怪的负相关,因为大多数其他木材相关因素最终都是正相关。

为了保持一致性,我们来看看这个时间段的相关图。

像以前一样,我们更关心交易信号而不是原始相关性,因此下图显示了每个 IPPI 因子如何与从当前月的 USD_CAD 到下个月的 USD_CAD 的变化(汇率的变化)相关联。

请注意,尽管大多数因素与 USD_CAD 正相关,但与 USD_CAD 变化正相关的因素并不多。此外,请注意,许多在 20 世纪 90 年代没有数据的东西的相关性在结果中被隐藏了。在前面查看所有数据的部分中,任何地方有数据的任何因素都可以关联。既然我们看到的是一个更小的数据子集,我们只能说一些在 20 世纪 90 年代有数据的因素。

下面快速浏览一下数据框的样子,以显示许多因素在数据集中早期是不可用的:

现在让我们继续用 2000 年的镜头来看看支撑我们模型的数据。

21 世纪——一个变化的世界

让我们回过头来看看数据中最高的正相关和负相关,就像我们在上世纪 90 年代对整个数据集所做的那样。

在 2000 年,我们继续看到美元兑加元的强势与汽车类股以及木材/纸张类股之间的强相关性。

我们从下面的负相关性中看到,金属和石油仍然是美元兑加元疲软的原因之一。

那么是什么改变了呢?从放大的角度来看,这种变化是微妙的,但基本上,20 世纪 90 年代美元兑加元的上涨没有持续。这是 IPPI 因子和美元兑加元之间相关性的放大图,右边是 20 世纪 90 年代,左边是 2000 年代。

我们看到与美元兑加元相关的因素发生了戏剧性的逆转,变成了与美元兑加元负相关的因素。这向我们表明,使用从 20 世纪 50 年代到现在的这些因素作为我们预测模型的训练数据将是一个错误。使用所有的数据会忽略这些因素在现实生活中如何应用的制度变化。然而,我们可以用滑动窗口进行回溯测试,学习新的东西,抛弃旧的东西。这是一种非常常见的测试“远”到过去的策略的策略。

现在,为了保持一致性,让我们看一下显示一个月后各种因素如何与 USD_CAD 变化相关的图表。

这是一个相当平衡的情况,数据中显示了大量的正相关和负相关。对于试图预测这一时期美元兑加元的走势来说,这是一个好迹象。事实上,相关性的方向并不像强度和信号的相互独立性那么重要。最终关键因素是我们赚了多少钱。这里的想法是持有加元和美元,并根据我们的模型预测的时间每月在它们之间切换。

2010 年代——有史以来持续时间最长的经济扩张

我很好奇,想看看数据中的高相关性信号是怎么回事。相关性是什么样的?好吧,看看下面图表中的雪地车价格和 USD_CAD。

Super high correlation between USD_CAD and snowmobile prices at the factory gate. You can see it just by looking at it.

工厂门口的雪地车价格和美元的强势之间的这种相关性是一个真正的加拿大故事。买雪地车花费越多,加拿大元在美国的能量就越少。有意思。很可能是一些其他潜在的因果因素,如石油和金属价格,创造了这种动态,但看看一些数据来验证它是有意义的仍然是好的。

事实证明,在 2010 年代,一些 IPPI 因素和美元兑加元之间存在非常强的相关性。我们继续看到 SUV 等汽车产品,以及战争产品在美元走强中发挥了重要作用。我认为,2001 年 9 月 11 日的袭击以及由此引发的战争传递了一个潜在的信息,即提升了美元作为避风港和军事强国的地位。我认为这将延续到 2010 年。这些相关性将木材故事挤出了搜索结果的前列。尽管争议仍未解决,但加拿大的许多纸浆和造纸厂在 2010 年代干脆关闭了。

我们在下图中看到,石油和相关产品以及金属继续成为 USD_CAD 负相关的一部分。

在 2010 年代,数据集中有更多可用的因素。下图显示了 USD_CAD 相关性在这些因素中的分布。

现在让我们来看看如何使用这些因素来进行预测。

与 20 世纪 90 年代不同,相关性和预测分布之间似乎存在对应关系。请记住,这些图表中的因素顺序并不相同,因此这些数据并不能告诉我们与 USD_CAD 相关的因素是否也预测 USD_CAD 的变化。

快速总结,然后开始模型生成

我们看到,总体数据集在这十年中包含的内容比过去几十年多,而几十年前的数据可能与今天的我们无关。在一些关键的时间点上,数据中潜在的故事发生了变化,我们无法使用之前的数据来预测之后的时期。

Correlations between the economic data and asset data vary depending on the time period observed and the signals available during the time period in question. The bottom left is for the 1990s. The top left is for the 2010s. The top right is for the 1990s. The bottom right is for the full dataset.

我们还看到,就我们对世界的预期而言,这些数据是合理的。基于这些数据的模型应该是相对可解释的。例如,如果几个因素指向美元兑加元的上涨,我们应该能够看到这些因素是什么,并验证这种多头或空头头寸是有意义的。

在这一点上,我想回到我关于 的文章,很多事情你在建立交易策略时不应该做 。在我们继续构建模型时,请记住这一点。这是一个玩具示例,现在你已经有了如何复制这项工作背后的数据科学的代码,包括数据集。我鼓励你尝试一下,看看你能想出什么。

预测算法交易模型

为了制作我们的预测模型,我们需要设置我们上面讨论过的张量“x”和“y”。输入“x”将是 IPPI 数据的进一步清理版本,我们的“y”将是两个类别之一:长型和短型。更有趣的事情,比如决定 USD_CAD 中多少预测的变化证明一个行为是合理的阈值,超出了这个玩具示例的范围。我选择了一个形状像自动编码器的前馈深度学习模型(DNN),在输入端添加了一些噪声,以帮助避免过拟合。

为了做出预测,我们回顾了过去 3 个月的 IPPI 指标。

所以:

为了进行预测,我们仅使用与 USD_CAD 的预期回报至少有 10%相关性的指标。这减少了“x”中的维数。此外,在测试期间,我们使用来自训练运行的经过训练的缩放器,因为我们事先不知道如何缩放还没有发生的东西。让我们将费用设定为每笔交易 0.20 个基点(IB 中列出的)。每个模型运行都是模型的一个全新的训练和测试实例(从头开始)。

让我们根据 2000 年到 2012 年初的数据进行训练,然后从 2012 年到 2017 年 Q1 奥运会结束时进行回溯测试。这是 12 年的月度训练数据,即 12*12=144 个训练数据点。事实上,在切掉一个 NaN 后,我们得到 143 个训练样本,每个样本有 39 个数据点。当缺乏数据样本时,我喜欢把它们想象成一组方程组,我们正在寻找一个近似的解决方案。这不会是完美的,但当我们看到这种模式为我们赚钱时,我们就会知道它是否有效。

Before Tuning: Model performance for 10 simulation runs before tuning the network and massaging the training data. The results are pretty random.

After some effort, but before fees: Model performance for 10 simulation runs. These simulations did not include fees. The results look promising.

A trading algorithm is born: These are the results with fees included. We make a bit less money, but have a bit more consistent performance. Fees are only paid when we buy in or change position. All 9 of 10 simulations eventually ended in profit.

在我停止浪费时间的时候(见上文),模型已经在运行之间建立了一致性。然而,在模拟的前 3 年,所有的模型都亏损了。这是一个问题,我打算让它保持原样,因为这是一个玩具问题。在 2012 年 1 月 1 日至 2017 年 3 月 1 日期间,模拟的平均最终值为 118.7。这相当于 5.25 年的交易。因此,年化回报率为 3.32%。不是很好,但不是 0 或负的。我不打算讨论我们如何利用杠杆来增加回报,或者对风险调整后的回报进行分析。训练准确率始终在 80%的范围内,而测试准确率大多在 50%以上,如下表所示。

我们可以看到,训练精度并不是上一个模型(#9)不是好模型的好暗示。在这里,最大化利润的最聪明的方法是将模型堆叠在一起,并平均这种类型的误差。想象一下,将 10 美元放到 10 个模型的手中,而不是将 100 美元放到一个模型实例的手中。

整个模拟周期持续时间较长会产生以下结果:

Buy and hold USD_CAD for the duration of the testing period.

叠加这些主动和被动策略,我们得到了下面的图表。

我们看到持有美元兑加元会很好。不幸的是,如果没有某个模型告诉我们该怎么做,我们无法提前知道买入并持有 USD_CAD 是否有利可图。与股票市场不同,真正的长期策略是买入并持有,货币对不遵循这一逻辑。相反,法定货币对随着相关经济体和政府的兴衰而变化。

什么因素导致了预测?( 展示使用精美工具 )

我们有一个赚钱的模型,这很酷,但如果能更好地了解它的作用,那就更好了。我用 DeepSHAP 得到了那张照片。首先,我使用来自 x_train 的 75 个样本设置了一个先验(背景)期望。x_train 的其余部分用于获取下一步中使用的 SHAP 值。下图显示了使用上一步中获得的 SHAP 值的 x_test 数据的汇总图。

The relative contribution of each of the factors in our little model. Each factor is preceded by an m1 if it is from the month before the prediction, or m2 if it is from 2 months before the prediction.

我们马上就能看到这个模型并没有像我们想象的那样运行。它最关心的是男士西装(纺织品)、家禽、清洁用品、烟草和化妆品。这些都是我们在上述分析中没有考虑太多的因素。还好我们看了。现在,后退一步,我们看到沥青和喷气燃料等油基物质在这里,这是一个好迹象,表明我们并没有完全出局。我们也看到了与纸相关的东西,比如新闻纸,这是一个好迹象,表明我们期望看到的东西还在那里。从这个分析中我们了解到,你认为重要的东西可能最终并不是最重要的因素。在这种情况下,结果是我们考虑的东西在列表中,但对预测的影响小于模型中的其他因素。

最后,本文中介绍的方法还有一些限制值得一提。使用数据仓库比这种手工方法更好,使用回溯测试框架也更好。我尽量让这篇文章保持独立,不引用任何专有代码。

从这里去哪里?

Investifai.com终于有了 SEC,所以我们现在可以接管资产了!当我们对用户界面和 KYC 流程进行最后的润色时,迪拜的办公室一片繁忙。如果你是一个合格的投资者,并希望投资于初始基金,请联系 hello@investifai.com

在加拿大,我们的内部审计产品 AuditMap.ai 随着客户的加入而不断成熟。这里有更多关于那东西的信息。

如果你喜欢这篇关于算法交易模型开发中的数据科学的文章,那么看看我过去最常阅读的一些文章,比如“如何为人工智能项目定价”和“如何雇用人工智能顾问

下次见!

丹尼尔

初创企业中的数据科学?

原文:https://towardsdatascience.com/data-science-in-start-ups-c3cb13286dc4?source=collection_archive---------5-----------------------

Data Science can be a very good tool for Growth Hacking!

通过我和很多人关于数据科学和人工智能的讨论,经常听到有人说:“初创企业不需要数据科学。让我们专注于通过构建用户想要的功能来获取用户。”,或类似的意思。对于大多数创业者来说,当他们在创业时,数据科学很少被列为优先事项。

大多数讨论围绕以下不采用数据科学的原因;数据科学被描绘成昂贵的(巨型基础设施!),占用太多时间,非常具有挑战性(需要专业知识来工作,而专业知识非常稀缺),数据科学只能在有大量数据的情况下工作。

我对此持不同意见。我的观点是肯定的,初创企业最初不需要“复杂的”机器学习,但现在正是考虑和准备组织中的数据科学能力的时候。

数据收集和管理流程

初创企业通常有一张“更干净的纸”(与大型企业相比),因此这是讨论要收集哪些数据、要收集的数据的质量、应该在业务流程的哪个阶段收集数据等的合适机会。通过在早期进行这样的讨论,在不同的业务流程在组织中扩展并变得更加复杂,成为“一大碗意大利面条”之前,数据收集可以很容易地工作到业务流程中。与修理高速行驶的巨型汽车(大企业)相比,修理低速行驶的汽车更容易。

例如,大多数初创企业都对快速增加受欢迎的功能感兴趣,他们需要一种更加数据驱动的方法来确定受欢迎程度(即进行 A/B 测试)。数据(应该在业务流程的哪个部分收集数据,要收集的数据的粒度)和基础设施(应该使用哪个数据库)等资源可以提前讨论,以允许初创企业对捕获的数据进行快速分析,或者决定某个功能是否受欢迎,或者当分析显示不是这样时,果断地转向其他有价值的追求。

其次,收集数据需要时间。高质量的数据不会神奇地出现。它需要从数据收集、数据质量到数据存储和检索的规划。以正确的质量水平收集数据可以减少在进行任何分析之前所需的大量数据准备工作。时间是收集足够数据的基本要素。

有了早期收集的数据,初创企业可以了解他们的战略和节约资源的影响(资源在初创企业中很宝贵,对吗?)如果影响不是积极的或巨大的。

第三,如果初创企业经历了几轮融资,那么通过尽早开始数据收集,初创企业将存储构建人工智能能力所需的关键资源之一。尽管如果我们看到 AlphaGo Zero 的进一步发展,这种情况可能会改变。

数据科学需要海量数据?

这种误解可能是由“大数据”一词引起的,该词被广泛用于在公司中创造采用数据科学的紧迫性。

如果初创企业要立即利用他们的数据获取价值,首先要做的是建立报告流程,或者建立一个运营和战略仪表板。根据当前的业务战略,为每个仪表板确定相关的指标。

对于运营仪表板,与战略仪表板相比,初创企业可以更定期地刷新指标。这里的关键是让初创企业的每个人都了解当前的运营情况;我们是否达到了为客户规定的服务水平,关键领域的用户体验是否有所下降等等。因此,新公司可以将有限的资源转移到正确的区域,以在正确的服务级别维持运营。

对于 strategic dashboard 来说,初创企业更需要了解他们当前的商业模式是否有效,商业策略(如获取用户、扩大现有用户的使用范围等)是否有效。

这两个控制面板不需要大量数据,因为捕获的数据可以立即进行处理以获得洞察力(更高的刷新频率)。它可以帮助初创企业快速有效地管理他们的运营和战略,确保有限的资源用于具有最大积极影响的领域。

数据科学很贵?

数据科学不一定很昂贵。一家初创公司不应该在没有良好的长期使用计划的情况下将大量资金投入到工具中。我的建议是,规划出初创企业希望使用的数据科学用例,并研究可用的工具,然后看看使用开源工具或企业工具是否有意义。只有当这些工具产生的价值超过工具的成本时,才承诺购买这些工具。我坚信,基础设施应该与初创企业使用数据科学所产生的价值一起增长。没有一个好的 it 计划就立即购买企业工具,很可能导致对初创环境中稀缺资源的巨大浪费。

如前所述,在初创企业的初始阶段进行的分析或机器学习的类型不需要复杂,因此初创企业或许可以为实习生提供进行分析或机器学习的机会,让他们获得相关经验,从长远来看,这些经验可以极大地有益于他们的职业生涯。这创造了一个双赢的局面,因为初创企业以低成本获得了可行的用例,并理解了数据科学的价值,这可能包括在此过程中意外发现数据科学人才。实习生可以实践他们在本科学习中所学到的东西,并看到他们当前技能的优势和劣势。也许为了确保双赢的局面产生最大的影响,有一位导师来指导实习生将是有益的。更重要的是,导师需要有实践经验,并且以前从事过数据科学项目。

获取数据科学资源

我见过的大多数数据科学家总是在寻找有趣的挑战,假设他们有足够的报酬。换句话说,吸引数据科学家的不仅仅是薪水,还有所提供的挑战。因此,如果初创企业能够提供良好的挑战和支持它的环境,他们就能吸引到相当数量的数据科学家。

风投和天使投资者可能希望聘请一名数据科学家(永久职位或顾问职位),从事由风投和投资者的初创企业投资组合提供或确定的数据科学项目。

总之

初创企业应该尽早开始考虑建立数据科学能力。尽早开始的最大好处是收集的数据量,因为它们不会很快出现。早期规划使初创企业能够收集高质量的数据,快速迭代,并比竞争对手更早地提升数据科学学习曲线。

基础设施应该与从用例中获得的价值一起增长。或者更重要的是,实现用例的成本与业务价值同步移动。这将为初创企业采用数据科学创造一个可持续的势头。

初创企业在开始时不需要大量的数据。他们可以开始从他们捕获的任何数据中获得洞察力,并使用这些洞察力来节省资源和关注更重要的领域。

希望博客有用!祝您的数据科学学习之旅愉快,请访问我的其他博客文章LinkedIn 个人资料

特朗普时代的数据科学

原文:https://towardsdatascience.com/data-science-in-the-age-of-trump-a6c91abbf829?source=collection_archive---------6-----------------------

Marching for Science. And Data | AP Photo | April 2017

唐纳德·特朗普(Donald Trump)不是一个技术人员(他不信任个人电脑,也很少使用电子邮件),但他对数字的热爱是出了名的:评级、推文、人群规模。在过去的一年中,我们多次见证了他如何熟练地寻找统计数据来支持他的政策建议,甚至更擅长于寻找统计数据来钻对手立场的空子。有人知道数据的价值,并且不怕使用它。

当我们的生活充斥着各种类型的数据时,当我们所做的一切——从我们的经济吞吐量到我们看的电影,再到我们约会的人——都被衡量、消化、分析和重新激活,以使我们成为更有效率的社会成员时,我们的总统是最终的现代人。像今天大多数年轻人一样,他不知道计算机如何工作,也不知道一个芯片上能装多少个晶体管,但他不在乎。他的注意力集中在手掌中的设备和电视屏幕上的新闻上。作为我们这个时代的产物,他是一个数据消费者,一个数据生产者——一个数据信徒。

这对数据科学来说是个好兆头,是吗?

一方面,特朗普的迅速崛起在很大程度上归功于数据科学。当他的竞选活动开始使用来自剑桥分析公司的数据和算法时,他在总统竞选中获得了提升,这已经得到了很好的记录。在去年年底发表在 Das Magazin 上的一篇文章(并且在主板上以英文再版)中,作者汉尼斯·格拉斯格和米凯尔·克罗格鲁斯对所发生的事情提供了可能是最好的解释。至少,是最多彩的之一。这是一个关于疯狂的学术研究、心理测试和高风险现实生活实验的迷人故事。我们可以从整体上讨论这种提升的规模,但有一点是明确的:在竞选的最后几天,随着佛罗里达州、宾夕法尼亚州或威斯康星州等州出现最后一刻的犹豫不决和极其微弱的竞争,数据科学是唐纳德·特朗普最好的朋友。

另一方面,科学研究在白宫 2018 财年的拟议预算中受到了重大打击:国家卫生研究院削减了 22%,能源部削减了 17%,海洋和大气研究办公室削减了 22%,等等。当然,气候研究是政府的目标,但基础能源科学、纳米科学、核物理、生物医学研究、碳排放监测等也是。就连人口普查局也感受到了压力,开始担心自己没有资源来完成 2020 年的人口普查。美国科学促进会(AAAS)估计,根据特朗普的预算,总研究经费将下降 16.8%,这将“摧毁美国的科技企业”。国会山的乐观主义者指望国会从现在到 10 月控制损失,但是毫无疑问,其中一些削减会持续下去。

那么,当一位总统热爱数据而讨厌科学时,数据科学会发生什么?

回答这个问题还为时过早,但提出这个问题也不算太早。我们已经有了一些答案,特朗普的竞选活动在去年年底撼动了民调行业。投票既是一门艺术,也是一门科学,尤其是在政治领域。景观不断演变,样本量小,投票率难以预测。世界顶级民调机构已经花了几十年时间研究选民——他们的心理、信念、不安全感,是什么让他们过早地支持某个候选人,在最后一刻改变忠诚,或者决定完全跳过投票站。他们知道如何提问,如何理解没有回应。拥有比历史上任何一次选举都多的数据,以及更复杂的方法来理解这些数据,他们以惊人的方式集体错过了目标。发生了什么事?

美国公众意见研究协会(AAPOR)刚刚发布了一份经过充分研究的事后分析。他们能够证实 2016 年全国民调的表现正如人们可能预期的那样好(克林顿预计将赢得 3%的全国选票,最终以 2.1%的优势获胜),但另一方面,一些州级民调很难跟上竞选活动最后一刻的变化,在许多情况下遭受了不完整的统计调整(特别是未能纠正受访者中大学毕业生的过度代表性,而这一群体更倾向于投票给克林顿)。该报告还批评了综合预测模型——那些无处不在的“克林顿有 90%的胜算”估计,在最后几天占据了所有的头条——因为它们传达了不必要的确定性,可能会让选民离开。

总而言之,这一分析是对 2016 年该行业缺点的坦率回顾,但它没有带来悲观和厄运,而是为民调的未来奠定了强大的基础。它基于从美国广播公司新闻到密歇根州立大学的 23 家民调机构的数据,以及来自皮尤研究中心、范德比尔特大学、YouGov 和全国其他顶级智库的分析师的交叉询问。在一个拥挤的领域,相互竞争的组织基本上走到一起,找出他们是如何出错的,并确保下次不会出现系统性的问题。这是一个显著的发展。

我没有天真到相信现在每个人都是内特·西尔弗最好的朋友,但民调机构受到了打击,这种打击迫使他们认真检查自己的手艺,因此这个领域越来越强大。提高标准符合每个人的最佳利益。这意味着收集更好的数据,开发更好的方法。

当然,投票并不完全是数据科学。连大数据都算不上。但是,在这一职业中发生的事情是整个科学领域正在发生的事情的症状:人们意识到,科学的优势和相关性已经被认为是理所当然的,是时候走上街头,旋转离心机,重写教科书了。

说唐纳德·特朗普正在帮助振兴数据科学领域有点不现实,特别是在像环境保护署(EPA)这样的政府机构正在取消科学顾问的时候,但你知道:在一个崇拜数据但对数据持怀疑态度的社会的压力下,以及一个在对自己不利时迅速怀疑数据的人的压力下,数据科学家必须提高他们的游戏水平。科学没有数据不行,数据没有科学也不行。就这么简单,但也这么复杂。

川普时代的数据科学将是一场狂野之旅。

感谢阅读,它意味着世界!请查看美洲杯上的 人与机器 ,了解在完全不同的背景下使用数据科学的观点!

现实世界中的数据科学

原文:https://towardsdatascience.com/data-science-in-the-real-world-e97e2534e43?source=collection_archive---------12-----------------------

阅读数据科学家的实际工作。剧透:一点也不像 kaggle。

帮助学生和爱好者为数据科学家的工作做准备的网络世界是巨大的。访问数据和获取信息的方式多种多样。有人可能会认为,从数据科学中创造价值就像旋转 Jupyter 笔记本并更改几行代码一样简单。你只要上几门网络课程,全是彩虹独角兽。

Photo by Boudewijn Huysmans on Unsplash

我在柏林的大众集团创新车 Carmeq 领导数据和人工智能项目。我们通过在自动驾驶汽车、个人辅助和神经网络验证领域的工作来支持大众品牌。这篇文章旨在揭示作为数据科学家工作时可能遇到的机遇和非常规挑战。您将浏览一个真实的用例,对数据科学家的工作有一个更现实的认识。剧透提醒:不全是彩虹和独角兽。

问题是

每个数据科学项目都始于你想要解决的问题。记住这一点很重要。太多时候,数据科学家四处奔走,寻求用机器学习来解决问题。应该是反过来。

首先是问题,其次是数据科学。

我们的用例始于法律领域的彻底变革。2018 年欧盟(EU)通用数据保护条例【GDPR】的出台,影响的行业不仅仅是网络营销。GDPR 旨在加强欧盟个人的隐私权。这项规定受到隐私倡导者的广泛欢迎,但在业内也同样遭到疏远。

Convert GDPR — www.Convert.com/GDPR/

公司通常很难解释 GDPR 将如何应用于具体的用例,因为还没有任何示范性的规则。本质上,GDPR 要求公司给予个人要求和删除其数据的权利。此外,公司应该只收集特定的、预先确定的用例所需的数据。GDPR 禁止不必要的个人数据囤积。这项立法带来了严重的不确定性,因为执行的实际限制仍有待探索。

This is you, the wandering Data Science unicorn. Photo by Andrea Tummons on Unsplash

现在想象一辆自动驾驶汽车在欧盟的街道上漫游。他们经常用相机记录他们的环境。根据定义,人脸和车牌被视为个人数据,需要得到保护。汽车制造商应该如何在不无意中收集个人面孔和车牌的情况下四处行驶?有些人会说这几乎是不可能的。在这里,我们发现了一个与我们的合作伙伴相关的问题。我们也相信机器学习可以带来解决方案。让我们开发用例。🚙

使用案例

汽车公司需要在不侵犯 GDPR 保护的个人数据权利的情况下收集真实世界的数据。有很多方法可以解决这个问题:只在没有人类或汽车的区域行驶,只在晚上收集数据,完全依赖模拟数据等。这些解决方案都不理想。数据驱动的函数开发需要真实世界的数据,没有约束。

我们可以检测人脸和车牌,并将其匿名。从技术上讲,这将是伪匿名化,但由于缩写,我们将在本文中坚持匿名化。

He is anonymized.

你可能会注意到,我们甚至还没有谈到使用机器学习!我们应该如何解决这个问题完全取决于找到最佳方法,这不一定需要机器学习驱动。

我们理解有必要对图像和视频中的个人进行匿名处理,以保护他们的隐私。在进行一些研究后,我们可以证明深度学习是准确检测图像中对象的最先进方法。接下来让我们定义项目的范围。

主要目标是关注从外部汽车摄像头记录的人脸的匿名化。首先,我们需要检测图像中的人脸。第二,我们会用面具代替脸。还有其他方法可以替代人脸,比如用合成脸,但我们不会在这篇文章中讨论。

定义目标

一个机器学习产品,如果只代表自己,那就没什么价值。通常,您会将您的模型集成到现有的管道中,或者围绕产品构建一个管道。当前的工程框架是构建微服务。微服务只处理它们被设计去做的孤立的任务。它们很容易集成到现有架构中。这样做的标准工具是 Python FlaskDocker containers 。这就是我们想要的。

为了形式化我们的方法,我们保证使用目标和关键结果(okr)。在这篇帖子中,我们了解了使用 OKRs 来指导我们的数据科学项目的好处,因此我们提出了以下目标:

这些 okr 是成熟的面部匿名化项目的雄心勃勃的延伸目标。在这篇文章的后面,我们将看到项目的范围仅限于原型,因此 OKRs 也应该改变。

创建项目

作为一名数据科学家,无论你在哪里工作,你总是与其他利益相关者一起在一个团队中工作。在我们开始工作之前,我们需要跨越第一个障碍,创建一个项目推介来说服我们的合作伙伴。我们的目标是让一个数据科学家在这个项目上工作一段时间,以原型解决方案。

管理层非常清楚数据隐私问题。毕竟,他们有责任确保公司遵守法律要求。对图片内容进行匿名处理也有直观的意义!在小范围内,我们使用上面定义的 OKRs 和一个有说服力的故事来说服管理层赞助一个项目的原型解决方案。如果它足够有前景,我们将寻找更多的合作伙伴,并将项目推向下一个阶段。

Photo by Steve Johnson on Unsplash

恭喜你!我们得到了一个机器学习项目。现在,让乐趣开始。👩‍🔬

这项工作

深度学习大师吴恩达建议尽快拿出一个工作模型,然后不断重复这个想法,直到目标实现。Andrew 建议在调整现有预训练模型以适应我们的特定用例之前,先对其进行实验。

如果我们看看我们的 okr,我们意识到我们需要采取三个步骤:研究可用的人脸检测模型,收集数据,并比较不同模型的性能。让我们从第一部分开始。

研究可用模型

几十年来,人脸检测一直是计算机视觉研究的重要组成部分。我们的假设是,找到一个好的模型来检测人脸应该很容易。像 OpenCV 这样的开源包从一开始就提供内置的人脸检测模型

Hi there, Adrian! Check out PyImageSearch for more great OpenCV tutorials.

然而,缺点是许多人脸检测模型专注于识别靠近摄像机的人脸。在我们的汽车环境中,当面孔就在摄像机前时,我们再去识别它们已经太晚了!

Too late if you recognize the face just now!

此外,道路上的汽车将在昏暗的光线条件下从不同的姿势记录有遮挡的人脸,如帽子和太阳镜。因此,我们应该将研究重点放在满足这些需求的模型上。

我们分析了最近关于最先进的人脸检测模型的研究论文,并从这些论文中获得了关于其他现有模型的线索。一个特别的模型引起了我们的注意:小脸模型!

显然,该模型是在一个数据集上训练的,该数据集包括处于不同姿势、光照条件、有遮挡并且聚焦在小的、远处的人脸上的人脸。它看起来非常适合我们的用例。

许可——沉睡的野兽

研究人员很容易做到——发布的数据集或模型的许可证通常可用于科学目的。业余 kagglers 也不必考虑许可证,因为他们只是尝试供个人使用的模型。然而,当你为一家盈利性公司工作时,这种情况就变了。突然之间,很多数据集或者模型都成了禁忌!

作为一个提示,如果你读到一个模型许可,上面写着“不用于商业目的”,那么这个模型对你来说是遥不可及的。你甚至不能测试它的内部原型。让我们忘记这个模型,研究一些预先训练的更有利于行业的模型。

收集数据

在我们确定了合适的模型之后,是时候让它们在真实世界的数据上自由活动了。由于我们在汽车行业工作,我们可以确保获得大量干净和有标签的数据!

别急,菜鸟。如果你不在一家初创公司工作,你的公司很有可能被分成不同的品牌和子公司,这些品牌和子公司的组织结构经常变化。此外,GDPR 使得在不同用例的部门之间共享数据变得更加困难。可想而知,找到合适的数据集等于大海捞针!

Go ahead, find the needle. Photo by Lucas Gallone on Unsplash

所以我们没有真正需要的数据。这对于读者来说可能有些离谱,但没有正确的数据是数据科学项目失败的最常见原因之一,不管你为哪家公司工作。

有一个很棒的公共数据集叫做宽脸。不幸的是,发牌野兽又来了。谷歌发布了其开放图像数据集,其中包含许多带标签的人脸,并可免费用于商业用途。这些图像仍然不是真实世界的数据,我们需要我们的模型在这些数据上表现良好。

因此,我们可以继续的唯一方法是收集我们自己的数据集。幸运的是,我们有设备来收集我们想要做好的真实世界的数据。我们兜一圈,收集一些可控环境下行人的数据。

应用模型

现在我们已经收集了一些数据,是时候试验这些模型了。我们花了大部分时间研究模型和收集数据,所以我们没有足够的时间来标记数据集。我们怎样才能摆脱这种痛苦?我们帮助自己进行近似,例如比较检测到的面部计数和关于哪个模型表现更好的良好直觉。

这应该是一个中间结果。表演显示了获胜者,因此我们收集了另一个更真实的数据集,并创建了一个展示视频作为我们的结果。我们尝试了一些东西,如超参数调整,以消除太多的假阳性,以改善展示,但这个项目的时间紧迫。我们将代码容器化,呈现我们的结果。

我们完成了我们的项目!我们展示了人脸检测在汽车工业中保护 GDPR 数据的作用。接下来,我们必须说服其他利益相关者和合作伙伴来赞助我们已经收集了上述 okr 的完整项目。接下来的步骤可能包括车牌检测、超参数调整、准备适当的数据集、收集更多数据等。在这个项目完成后不久,来自 understand.ai 的了不起的人们开源了他们的匿名化代码,所以我们肯定也应该尝试一下。

结论

正如您所看到的,这个 picture pretty 用例的实际工作是混乱的。数据并不总是可用的。使用许可证时要小心。对你的项目的资助可能会被限制在某一点上。优先事项和情况会发生变化。你必须保持灵活性,在给定的时间限制内工作,即使你不喜欢它。

Photo by Todd Cravens on Unsplash

通过这篇文章,我希望我可以通过一个小项目来揭示数据科学家在现实世界中的工作。挑战肯定不总是一样的,但我认为不同的公司面临的挑战是相似的。现在,你要做好准备,数据科学世界并不全是彩虹和独角兽。

关键要点

作为一名现实世界的数据科学家,您应该意识到以下挑战:

  • 你需要说服管理层和利益相关者赞助你的新项目
  • 合并现有模型或数据集时,检查许可是否正确
  • 你正在做的大部分工作是研究和数据准备
  • 你需要保持在预定义项目的时间范围内

如果你喜欢这篇文章,请不要忘记展示你的💛并且或者 LinkedIn 上关注我。你也可能喜欢 这些 帖子。如果你认为有什么需要补充的,请评论。干杯!☮️

Datanest 的数据科学实习计划

原文:https://towardsdatascience.com/data-science-internship-program-at-datanest-7826cc6a0ce5?source=collection_archive---------19-----------------------

Datanest Logo

在过去的 3 个月里,我一直在印度尼西亚的一家初创公司 Datanest 做数据科学家实习生。简而言之,Datanest 是一家提供数据科学服务的初创公司。该公司为企业提供完整的端到端解决方案,利用人工智能和机器学习算法来利用他们的数据。由于我知道机器学习和人工智能正在获得他们当之无愧的关注,我希望分享我的实习经历-我觉得这非常有益-希望它可以帮助你们塑造自己作为数据科学家的职业生涯。

我将文章分为三个部分:

  1. 选拔过程
  2. 实习经历
  3. 如何应聘【他们在招人!]

我已经总结了每一部分中每一点的所有详细解释,所以如果你是那种不喜欢阅读整篇文章的人,只要阅读我放在每一部分标题下面的要点就可以了。

选拔过程

在选择过程中,你必须做 4 件事:

  1. 将你的简历发送到相应的邮箱
  2. 在线访谈
  3. 判例案件
  4. *案例展示

下面将提供详细的解释。

在线面试

在我寄出简历的第二天,Datanest 打电话给我,我们安排了一次在线面试。在线采访期间,首席执行官 Pak Manggala 和前数据科学家 Kak Aji 向我提问。面试用英语和印尼语进行(但大部分是英语)。这些问题围绕着我的背景,我为什么想进入数据科学,以及我对数据科学本身的了解。这不是一个紧张的问题,所以不要害怕,但我建议你可以准备一下,特别是如果你不习惯用英语说话(你也必须想给你的雇主留下最好的印象,对吗?) ).

测试用例

就像我听说过的任何数据科学实习项目一样,Datanest 也要求其申请人做一个测试案例。在线面试结束后,我收到了一组数据及其字典——解释了每个变量——并被要求从数据中提出见解(以及图表和故事),并以 powerpoint 形式提交。我有大约两周的时间来完成测试(因为有 lebaran 假期)。谈到数据集,它大约有 15,000 行,并且没有经过清理,所以请注意异常值、重复值、缺失值和没有意义的值。仅供参考,我之前没有任何关于数据挖掘的知识,所以我当时根本不知道如何处理这些数据。我使用了数据透视表(感谢 Awe、Ko Efram 和 Tepen ),还使用 Excel 制作了图表。如果你能使用 Tableau,我会推荐你使用它,因为它提供了更好的可视化,但如果你不能,就考虑使用谷歌电子表格或 Excel 来代替。关于见解,我建议你有不明白的地方可以发邮件问 Datanest。我意识到产生见解可能不是每个人都喜欢的,但不要害怕失败,只要有创造力,尽可能多地探索数据(因为这正是我所做的)。

测试用例截止日期后大约两周,结果出来了。

*在我的选择过程中没有案例演示,但将来可能会添加。

实习经历

有 5 个要点让我觉得这可能是我参加过的最好的实习项目:

  1. 我能够在仅仅 3 个月的时间里学到很多东西;不仅是数据科学,还有商业智能技能。
  2. 我也能够向其他部门学习(例如:后端、前端等。).从我的角度来看,对于非计算机专业出身的学生来说,了解这个行业中使用的术语及其工作原理是非常重要的。
  3. 我有机会做任务,并由 CBO 直接监督。这是一个难得的机会,我从商业角度学到了很多东西。
  4. 每月有两次名为 Datanest Talks 的聚会,其主要目的是交流技能以及发展员工技能。
  5. 工作环境很棒。所有的员工都非常能干和随和。你甚至可以向董事会(首席执行官和 CBO)寻求建议,这不仅限于工作方面;例如:我得到了许多关于我主人计划的建议。

**附加信息:我获得了免费参加 2018 年亚洲科技展的机会!我必须告诉你,那感觉很奇妙:)T7

First Runner Up of Tech in Asia 2018 ARENA Pitch Battle, congrats!

事不宜迟,下面我来阐述一下我的经历。

数据科学课程

在第一周,我从 Kak Aji 那里学习了 SQL 和 Excel VBA。那时我基本上没有 SQL 和 VBA 的经验,所以我发现这些对提高我的技能很有帮助。如果你像我一样有数学背景,你会非常熟悉 VBA,因为它和 Matlab 非常相似。接着,我和另一名实习生 Kak Rahmat 也帮助做了一些关于数据探索和见解的 Datanest 项目。我们还学习了购物篮分析(MBA)以及如何使用 Excel VBA 制作简单的购物篮分析。在那之后不久,我们被教授了 Python、机器学习和深度学习概念。在我看来,学习 Python 可能需要相当长的时间,所以我建议你通过在线课程来练习,如 UdacityDatacamp 、e dX 等。对于深度学习部分,我们尝试使用 Keras 制作多层感知器(MLP)和卷积神经网络(CNN)。此外,我和 Kak Rahmat 还有机会通过 Udacity 免费课程学习 A/B 测试的概念。我的一些 Python 代码和 A/B 测试概念的文档可以在这里找到(请注意,它们都是印度尼西亚语言)。

商业智能课程

关于 BI(商业智能)部分,我们也有机会尝试许多 BI 工具,如 Metabase、Redash、Google Data Studio、Holistics 和 Tableau。CBO thi baud 指导我们创建由数据中的相关信息组成的仪表板。“相关”这个词在这里相当模糊,尤其是如果你缺乏商业经验的话。我个人认为,培养你的商业意识是一个边做边学的过程。学习它的最好方法是直接处理真实数据,幸运的是,我通过这个实习项目得到了这些数据。但是,请记住,您还必须向业务领域的专家请教,以更好地了解客户希望在仪表板中看到什么。

数据巢会谈

Datanest Talks 是一个 30 分钟的演示和问答节目,每月举行两次。作为一名数据科学家实习生,我真的觉得与其他人交流技能很重要。例如,我参加了我们的项目经理 Kak Bagus 的“Scrum 简介”演示,主要讲授如何管理项目,如何管理人员,以及如何进行良好的沟通。我觉得交流技能对每个人来说都是必不可少的,因为不可否认的是,有时技术人员在交流方面有困难,而非技术人员在理解技术部分方面有困难。因此,Datanest 讲座将是向最优秀者学习的绝佳机会!

Datanest Talks

工作环境

我之前提过,这里的工作环境超级棒。令人欣慰的是,Datanest 的所有人都非常善良,愿意教其他人。我确实意识到的一件事是:如果你在一家大公司工作,你不能轻易让不同部门的其他人来教你,更别说 CBO 或首席执行官了。这就是为什么我认为你可以在 Datanest 获得这个机会是一个巨大的优势,因为他们每个人都是专家,很容易交谈。更不用说,当你和董事会说话时,你甚至感觉不到任何障碍。

如何申请

投简历到 jobs@datanest.io,主题“实习数据科学家”。

如果你没有 SQL 的先验知识,建议你从 Udacity 免费课程 中学习。

最后,我非常感谢 Pak Sapto 推荐我加入 Datanest,感谢 Thibaud、Pak Manggala、Ci Vina、Kak Aji、Kak Fajara、Mas Nabih、Kak Rahmat 以及 Datanest 的其他人(抱歉没有一一提及),感谢你们的好意和在我实习期间愿意教我很多东西。我自豪地说:

每天花 3-4 个小时从我家到办公室,反之亦然,绝对值得!😄

数据科学面试指南

原文:https://towardsdatascience.com/data-science-interview-guide-4ee9f5dc778?source=collection_archive---------0-----------------------

数据科学是一个相当大且多样化的领域。因此,做一个万事通真的很难。传统上,数据科学将专注于数学、计算机科学和领域专业知识。虽然我将简要地介绍一些计算机科学的基础知识,但本博客的大部分内容将主要涵盖数学基础知识,人们可能需要温习这些知识(甚至需要上一整门课)。

软件工具

在大多数数据科学工作场所,软件技能是必须的。虽然我知道你们中的大多数人在阅读这篇文章的时候更注重数学,但是要意识到大部分的数据科学(我敢说 80%以上)正在收集、清理和处理数据,使之成为有用的形式。

程序设计语言

Python 和 R 是数据科学领域中最流行的。不过我也接触过 C/C++,Java,Scala。不过,我个人会推荐 Python,因为它有所有的数学库,以及用于查询各种数据库和维护交互式 web UIs 的专用库。常见的 Python 库有 matplotlib、numpy、pandas 和 scikit-learn。

数据库管理

常见的情况是,大多数数据科学家属于两个阵营:数学家和数据库架构师。如果你是第二个,博客帮不了你多少(你已经很牛逼了!).如果您是第一类人(像我一样),您可能会觉得编写双重嵌套的 SQL 查询是一场彻头彻尾的噩梦。也就是说,了解一些查询优化的知识很重要(对于 SQL 和 noSQL 系统都是如此)。

地图缩小

考虑到 Apache 项目一直在添加新工具,大数据技术有点难以理解。但是,我会推荐学习 Hadoop 或者 Spark(虽然我个人推荐是 Spark)。两者都使用相似的 Map Reduce 算法(除了 Hadoop 在磁盘上执行,而 Spark 在内存中执行)。Scala、Python 和 Java 中都有常见的 Spark 包装器。

附加说明

有关数据科学应用软件开发的更多信息,这里是我的一些其他博客:

数据收集和清理

既然我们已经涵盖了软件需求,我们将开始平稳过渡到数学领域。围绕这部分流程,一般需要有一些数据收集和后台清理。这可能是收集传感器数据,解析网站或进行调查。收集数据后,需要将其转换成可用的形式(例如,JSON 行文件中的键值存储)。一旦收集了数据并将其转换成可用的格式,就有必要执行一些数据质量检查。一些常见的质量检查如下所述:

NaN 处理

NaN 或“不是数字”是缺失数据的常见占位符。如果特定要素的 nan 数量很少,通常用平均值(整个数据集或窗口)或 0(稀疏数据集)填充 nan 就足够了。

数据集中的 NaNs 通常表示:
-数据不存在
-数据存在但我们不知道它是什么
根据具体的用例,应该采取相应的措施。

阶级不平衡

特别是对于监督学习模型,类(或目标)的平衡很重要。然而,在欺诈案件中,严重的类别不平衡是非常常见的(例如,只有 2%的数据集是真正的欺诈)。

这些信息对于确定特征工程、建模和模型评估的适当选择非常重要。如需了解更多信息,请查看我关于极端阶级不平衡下欺诈检测的博客。

单变量分析

当试图寻找方差中的异常值和异常峰值时,单个特征的单变量分析(忽略共变量效应)很重要。常见的单变量分析选择是直方图。

双变量分析

在双变量分析中,每个要素都与数据集中的其他要素进行比较。这包括相关矩阵、协方差矩阵或我个人最喜欢的散布矩阵。

散点图让我们能够找到隐藏的模式,例如
-应该设计在一起的特征
-可能需要消除以避免多重共线性的特征

多重共线性实际上是线性回归等多个模型的问题,因此需要相应地加以处理。

特征工程

一旦收集、清理和分析了数据,就该开始创建要在模型中使用的要素了。在本节中,我们将探索一些常见的特征工程策略。

转换

有时,该功能本身可能无法提供有用的信息。例如,想象使用互联网使用数据。你会发现 YouTube 用户的流量高达千兆字节,而 Facebook Messenger 用户的流量只有几兆字节。这里最简单的解决方案是取这些值的对数。另一个问题是分类值的使用。虽然分类值在数据科学领域很常见,但要知道计算机只能理解数字。为了使分类值具有数学意义,需要将其转换为数字形式。通常,对于分类值,通常执行一次热编码。在一个热编码中,为每个分类值创建一个新的特征,以表明它是否出现在给定的记录中。下面给出了一个热编码的例子:

结合

某些功能本身是多余的,但是组合在一起就很有用。例如,假设您有一个交通密度预测模型,每种类型的汽车都有一列。自然,你不关心车的类型而是车的总数的频率。因此,可以对所有汽车类型进行逐行求和,以创建新的“all_cars”变量。

降维

有时,稀疏维度过多会影响模型的性能。对于这种情况(如通常在图像识别中所做的),使用降维算法。

通常用于维数减少的算法是主成分分析或 PCA。学习 PCA 的机制,因为它也是常见面试问题中的一个话题!!!要了解更多信息,请查看迈克尔·加拉尼克关于 PCA 使用 Python 的博客。

特征选择

既然您已经设计了您的特性列表,现在是时候选择将有助于为用例构建最佳模型的特性了。本节解释了常见类别及其子类别。

过滤方法

过滤方法通常用作预处理步骤。特征的选择独立于任何机器学习算法。取而代之的是,特征的选择是基于它们在各种统计测试中与结果变量的相关性的分数。这里的相关性是一个主观术语。这一类别下的常用方法有皮尔逊相关、线性判别分析、方差分析和卡方检验。

包装方法

在包装方法中,我们尝试使用特征的子集,并使用它们来训练模型。基于我们从之前的模型中得出的推论,我们决定在您的子集中添加或移除特征。这个问题本质上归结为一个搜索问题。这些方法通常在计算上非常昂贵。这一类别下的常见方法有向前选择、向后消除和递归特征消除。

嵌入式方法

嵌入式方法结合了过滤器和包装器方法的优点。它是由具有内置特征选择方法的算法实现的。套索和脊是常见的。作为参考,以下等式中给出了正则化:

套索:

山脊:

话虽如此,了解 LASSO 和 RIDGE 背后的面试技巧是非常重要的。

机器学习模型

既然我们已经有了最佳特性,现在是时候训练我们的实际模型了!机器学习模型分为两个阵营:有监督的和无监督的。监督学习是标签可用的时候。无监督学习是标签不可用的时候。明白了吗?监督标签!双关语。也就是说,不要混淆监督学习和非监督学习的区别!!!这个错误足以让面试官取消面试。此外,人们犯的另一个 noob 错误是在运行模型之前没有规范化特征。虽然一些模型对这个问题有抵抗力,但是很多模型(如线性回归)对缩放非常敏感。因此。经验法则。在使用前,一定要将功能正常化!!!

线性和逻辑回归

线性和逻辑回归是最基本和最常用的机器学习算法。在进行任何分析之前确保首先进行线性/逻辑回归作为基准!人们在面试中常犯的一个错误是从神经网络这样更复杂的模型开始分析。毫无疑问,神经网络是高度精确的。然而,基准很重要。如果你的简单回归模型已经有 98%的准确率,并且非常接近过度拟合,那么得到一个更复杂的模型就不是明智之举。也就是说,线性回归用于连续目标,而逻辑回归用于二元目标(主要是因为 sigmoid 曲线迫使特征输入朝向 0 或 1)。

我建议学习逻辑回归和线性回归的推导(单变量和多变量)。除了为面试做准备,线性回归模型还被用作一系列其他机器学习模型的基础。因此,这是一项长期投资。

决策树和随机森林

比线性回归模型稍微复杂一点的模型是决策树。决策树算法基于信息增益在不同的特征处分裂,直到它命中纯叶(即,只有 1 个标签的一组记录)。决策树可以在一定数量的分裂后停止,以阻止它获得纯叶子(修复过度拟合问题的常用策略)。

为分裂树而计算的信息增益是重要的。常见面试问题!确保您知道信息增益是如何计算的!!!常见的信息增益计算函数有基尼和熵。

在上面的曲线中重要的是,与基尼系数相比,熵给出了更高的信息增益值,因此导致了更多的分裂。

当决策树不够复杂时,通常会使用随机森林(只不过是在数据子集上生长多个决策树,并进行最终多数投票)。如果没有正确确定树的数量,随机森林算法可能会过度适应。关于决策树、随机森林和基于树的集成模型的更多信息,请查看我的另一个博客:关于 Scikit-Learn 上的决策树和集成的研究

k 均值和 KNN

K-Means 是一种无监督的学习模型,它将数据点分类到聚类中。提供了聚类的数量,使得模型移动质心,直到它迭代地找到最佳聚类中心。KNN 是一样的,除了它是一个监督模型,集群充当标签。

使用肘形曲线来确定聚类的数量。

聚类的数量可能容易找到,也可能不容易找到(特别是如果曲线上没有明显的扭结)。此外,要认识到 K-Means 算法是局部优化,而不是全局优化。这意味着您的集群将依赖于您的初始化值。最常见的初始化值是在 K-Means++中计算的,其中初始值尽可能彼此远离。关于 K-Means 和其他形式的无监督学习算法的更多细节,请查看我的另一个博客:[基于聚类的无监督学习](http://Clustering Based Unsupervised Learning)

神经网络

神经网络是这些天每个人都在关注的热门算法之一。

虽然我不可能在这个博客上涵盖复杂的细节,但了解基本机制以及反向传播和消失梯度的概念是很重要的。认识到神经网络本质上是一个黑盒也很重要。如果案例研究要求您构建一个解释模型,要么选择一个不同的模型,要么准备好解释您将如何发现权重对最终结果的影响(例如,在图像识别过程中隐藏层的可视化)。

集合模型

最后,单一模型可能无法准确确定目标。某些功能需要特殊型号。对于这种情况,使用多个模型的集合。下面给出一个例子:

在这里,模型是分层或堆叠的。每一层的输出是下一层的输入。

模型评估

分类分数

评估模型性能的一种最常见的方法是通过计算记录被准确预测的记录的百分比。

学习曲线

学习曲线也是评估模型的常用方法。在这里,我们要看看我们的模型是太复杂还是不够复杂。

如果模型不够复杂(例如,当模式不是线性时,我们决定使用线性回归),我们最终会得到高偏差和低方差。当我们的模型太复杂时(例如,我们决定对一个简单的问题使用深度神经网络),我们最终会得到低偏差和高方差。高方差,因为结果会随着我们对训练数据的随机化而变化(即模型不是很稳定)。不要在面试中混淆偏倚和方差的区别!!!现在,为了确定模型的复杂性,我们使用如下所示的学习曲线:

在学习曲线上,我们改变 x 轴上的训练测试分割,并计算训练和验证数据集上模型的准确性。如果它们之间的差距太大,就太复杂了(即过拟合)。如果两条曲线都没有达到预期的精度,并且曲线之间的差距过小,则数据集有很大偏差。

皇家对空观察队

当处理具有严重类别不平衡的欺诈数据集时,分类分数没有太大意义。相反,接收机工作特性或 ROC 曲线提供了一个更好的选择。

45 度线是随机线,其中曲线下面积或 AUC 是 0.5。曲线离这条线越远,AUC 越高,模型越好。一个模型能得到的最高 AUC 是 1,其中曲线形成一个直角三角形。ROC 曲线也可以帮助调试模型。例如,如果曲线的左下角更接近随机线,则暗示模型在 Y=0 处分类错误。然而,如果右上角是随机的,则意味着误差发生在 Y=1 处。此外,如果曲线上有尖峰(而不是平滑的),这意味着模型不稳定。对付诈骗模特,ROC 是你最好的朋友。欲了解更多详情,请阅读接收器工作特性曲线解密(Python 语言)

附加材料

[## 如何构建数据科学产品组合

数据科学怎么找工作?了解足够的统计,机器学习,编程等,能够得到一个…

towardsdatascience.com](/how-to-build-a-data-science-portfolio-5f566517c79c) [## 斯坦福机器学习| Coursera

关于这门课程:机器学习是让计算机在没有明确编程的情况下行动的科学。在…

www.coursera.org](https://www.coursera.org/learn/machine-learning) [## 华盛顿大学机器学习专业| Coursera

这种专业化从领先的研究人员在华盛顿大学向您介绍了令人兴奋的…

www.coursera.org](https://www.coursera.org/specializations/machine-learning) [## 深度学习专业化| Coursera

来自 deeplearning.ai 的深度学习如果你想打入 ai,这个专精会帮你做到。深…

www.coursera.org](https://www.coursera.org/specializations/deep-learning)

数据科学正在颠覆我们看待数据的方式

原文:https://towardsdatascience.com/data-science-is-disrupting-the-way-we-look-at-data-223dd1f0122e?source=collection_archive---------10-----------------------

以及如何制作自己的机器学习分类器来分析数据

哪种动物有长长的尾巴、尖尖的耳朵和胡须,是常见的家庭宠物?

Photo by MIKHAIL VASILYEV on Unsplash

如果你猜是一只猫,你就猜对了!

现在假设你是一名汽车销售员,销售一辆零售价约为 40,000 美元的货车。一个 22 岁年薪 5 万美元的男人会买你的车吗?

这个场景有太多的变数,让任何人都很难回答!然而,这在数据科学中是可能的。

什么是数据科学,它能提供什么帮助?

数据科学是一个新兴领域,数据科学家使用算法从海量数据中提取洞察力。

当我让你辨认猫的时候,应该不会太难,因为你一生中见过很多猫。你可以利用你对猫的特征的先验知识来识别这种动物。类似地,如果你有很多数据(性别、年龄、薪水等等)。)对于已经购买和尚未购买你的汽车的人,你应该能够预测是否有人会购买你的汽车。

这可能仍然是一个很难完成的任务。一个人如何浏览所有这些数据,解读这些数据,并得出结论?这就是机器学习发挥作用的时候了。一个机器学习分类器可以通过将他们的信息与成百上千其他可能或可能没有购买汽车的人的信息进行比较,来预测某人是否会购买你的汽车。

现在这听起来可能很复杂,但是如果你想进一步理解它或者你想制作你自己的分类器,我将分解这是如何完成的!

如何制作机器学习分类器(Python)

GitHub 资源库:

https://github . com/ve dant-Gupta 523/randomforestclassification

导入库和数据集

为了开始解决这个问题,我们从导入我们从消费者那里收集的信息开始:

# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd# Importing the dataset
dataset = pd.read_csv('Customer_Information.csv')
X = dataset.iloc[:, [2, 3]].values
y = dataset.iloc[:, 4].values

Left: Importing Libraries and Dataset, Right: Customer_Information.csv

我们导入了 3 个库,这将有助于我们的 ML 模型。我们还导入了数据集“Customer_Information.csv”。这个集合包含了 400 个人的信息,他们的性别,年龄,年薪,以及他们是否买了这辆车。

x 和 y 分别代表自变量和因变量。因变量(y)是我们试图弄清楚的,并受自变量(X)的影响。在我们的案例中,因变量是客户是否购买了汽车。自变量是年龄和估计工资。" dataset.iloc[]。values”是从数据集中选择我们想要的行和列。对于因变量,我们选择了第 5 列中的所有内容(ID: 4)。对于自变量,我们从第 3 列和第 4 列(IDs 2 和 3)获取所有数据。

将数据集分成训练集和测试集

在学校,老师给我们布置家庭作业,从中我们学习各种概念。过了一段时间,我们会接受一次测试,看看我们是否能运用从作业中学到的知识来解决相似但不同的问题。当我们训练我们的机器学习分类器来确定谁会购买我们的汽车时,我们遵循类似的过程。我们将数据集分成两个不同的集合,一个训练集和一个测试集。该模型使用训练集来查找因变量和自变量之间的相关性。然后,我们给它测试集(没有因变量),它使用它学到的知识对因变量进行预测。之后,我们可以比较结果,看看我们的模型有多精确。

# Splitting the dataset into the Training set and Test set
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)

在上面的代码片段中,我们使用 sklearn.cross_validation 库中的 train_test_split 模块来划分数据集。我们的数据集存储在 4 个变量中:X_train(训练自变量)、y_train(训练因变量)、X_test(测试自变量)和 y_test(测试自变量的实际答案)。我们的完整数据集的 25%被放入我们的测试集(test_size = 0.25)。

特征缩放

创建机器学习模型时,并不总是需要进行特征缩放,但在这种情况下却是如此。如果我们把我们的数字变量(如年龄,工资等。)在我们的分类器算法中,我们的结果会变得有偏差。尽管年龄和薪水代表了两种完全不同的东西,但该算法显然会将它们视为数字。当它将值 22(年龄)和 50,000(薪水)输入到公式中时,它不会考虑不同的权重。可以把它想象成在不转换单位的情况下比较毫米和千米。

特征缩放的目的是获取每个数值,并将其放在相同的比例上。这样,算法可以公平地使用这些值。

# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

为了做到这一点,我们使用 sklearn.preprocessing 库中的 StandardScaler 模块来缩放我们所有的独立变量。

使分类器适合我们的训练集并进行预测

终于到了开始训练我们的算法和预测我们的训练集结果的时候了!

# Fitting Random Forest to the Training set
from sklearn.ensemble import RandomForestClassifier
classifier = RandomForestClassifier(n_estimators = 10, criterion = "entropy", random_state = 0)
classifier.fit(X_train, y_train)# Predicting the Test set results
y_pred = classifier.predict(X_test)

虽然有许多不同的分类器可用,但对于这个问题,我选择了随机森林分类器。我首先从 sklearn 库中导入 RandomForestClassifier 模块。我继续使它适应(训练)我们的训练集。

在代码片段的第二部分,我创建了一个新变量 y_pred。y_pred 是分类器对测试集(X_test)所做的预测。

评估我们的结果

要知道没有一个机器学习模型是 100%准确的。如果你的模型显示有完美的准确性,这可能是由于过度拟合。过度拟合意味着您的模型严格遵循它在训练集中找到的精确规则。例如,如果您试图预测一个年薪 35,000 美元的 40 岁男子是否购买了一辆汽车,而分类器没有在这个确切的数据点上进行训练,它可能会默认为他们没有购买,即使这可能不准确。

检查有多少预测是正确/错误的快速方法是使用混淆矩阵:

Confusion Matrix outline

# Making the Confusion Matrix
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)

迷茫?不要!混淆矩阵的结果分为四个部分,如第一幅图所示。左上角的数字将代表我们预测有人会买车的次数,而他们确实买了。右上角的数字将代表我们预测有人会买车,但没有买车的次数。对于底部的 2 个数字,情况正好相反。需要注意的重要一点是,左上和右下的总和代表我们答对了多少题!

让我们来看看这个问题的可能混淆矩阵:

Confusion Matrix

我们的混淆矩阵告诉我们,100 个测试预测中有 92 个是正确的(63 + 29)。

可视化结果

最后一步是在图上可视化我们的分类器的结果!

# Visualising the Training set results
from matplotlib.colors import ListedColormap
X_set, y_set = X_train, y_train
X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
                     np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))
plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
             alpha = 0.75, cmap = ListedColormap(('red', 'green')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(y_set)):
    plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
                c = ListedColormap(('red', 'green'))(i), label = j)
plt.title('Random Forest (Training set)')
plt.xlabel('Age')
plt.ylabel('Estimated Salary')
plt.legend()
plt.show()# Visualising the Test set results
from matplotlib.colors import ListedColormap
X_set, y_set = X_test, y_test
X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
                     np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))
plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
             alpha = 0.75, cmap = ListedColormap(('red', 'green')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(y_set)):
    plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
                c = ListedColormap(('red', 'green'))(i), label = j)
plt.title('Random Forest (Test set)')
plt.xlabel('Age')
plt.ylabel('Estimated Salary')
plt.legend()
plt.show()

使用 matplotlib 库,我们可以创建漂亮的图表来可视化模型在训练期间建立的相关性以及预测遵循这些相关性的程度。

Left: The rules the Random Forest Classifier identified with training, Right: Results after applying the rule to the test set

让我们来分解一下我们在上面的图表中看到的内容。每个红点代表没有买车的人,每个绿点代表买车的人。如果一个点落在红色区域内,分类器将认为该人没有购买汽车,反之亦然。

我们注意到的总体趋势是,收入较高的老年人购买这款车的可能性更大。对于那些试图改善销售/营销策略的人来说,这可能是非常有价值的信息!

关键要点

数据科学将极大地提高我们决策的效率和准确性,并允许我们进行人类无法单独完成的分析。未来,每当你面临一个与数据相关的难题时,你都可以创建自己方便的机器学习模型,帮助你做出可能的最佳决策;)

“信息是 21 世纪的石油,分析是内燃机”

—埃里克·施密特

数据科学不在 SOL 列表中。我还有资格做公关吗?

原文:https://towardsdatascience.com/data-science-is-not-in-the-sol-list-will-i-still-be-eligible-for-pr-cb15e21b2892?source=collection_archive---------0-----------------------

这里有一个简单的问题——你选择了数据科学,你对在澳大利亚攻读硕士学位感到兴奋。然而,你的最终目标是获得公关。但是你听说数据科学不在技能职业列表(SOL)中。可恶!你的朋友告诉你,你不能用一份已列出的工作申请 PR。你去 Quora、facebook、whatsapp,会听到 100 种不同的观点——有些人说你不能申请公关,有些人建议选择不同的工作,还有一些人说这只是有点困难。然后你会发现一丝希望,相信数据科学将很快被添加到 SOL 列表中,因为来吧,它的需求如此之大!但最终,你只是简单地感到困惑。

我希望在这篇文章结束的时候,你会再困惑 100 次——并最终对整个过程有一个正确的概述,关于一份非技能清单的工作。

但在此之前,我们必须一劳永逸地解决一个问题。

首先,为了申请永久居留,有必要有一份工作吗?

答案是响亮的是。这是强制性的,你有一个公关工作。事实上,申请公关的第一步是从名单中提名一个职业!这里有一张来自移民和边境保护部(DIBP)网站的截图,上面提到了技术独立签证的要求。

✪注意:签证子类 189 是 PR 的专有名称。还有一个国家赞助的签证子类 190。

这是另一个来自 DIBP 的—

随着时间的推移,这一点会变得更加明显。但在此之前,这份中长期战略技能清单到底是什么?!

注:自 2017 年 4 月 19 日'中长期战略技能清单 ' ( MLTSSL )取代之前的'技能职业清单(SOL)。然而,在本文中,我将继续使用术语 SOL。如果你在任何地方看到这个长短语,只要记住他们指的是被称为 SOL 的东西。

✪ ✪:当我写这篇文章的时候,DIBP 已经更新了它在 Visa 189 上的页面,新的页面更加清晰。这是一个例子—

既然我们已经解决了这个问题——首先,让我们从 PR 流程的概述开始,因为它与那些没有 SOL 列出的工作相关——我们将在后面详细检查每个步骤。

步骤 1-提名工作

让我们从第一步开始——从 SOL 列表中提名一份工作。目前,没有“数据分析师”或“数据科学家”的职位,但有一些相近的职位,如“数据库管理员”、“分析程序员”等。

这让我们想到一个重要的问题——

问题:既然 SOL 列表中没有数据科学工作,我如何提名一份工作?这是否意味着我将不得不找一份业务分析师或分析程序员的工作,而在获得 PR 之前不能从事数据科学家的工作?

回答:

是的,这是一种选择。你可以攻读数据分析硕士学位,然后开始你的商业分析师生涯——仅仅是为了公关。然而,还有另一个选择。你实际上不需要有确切的工作——你的工作可以是‘与你提名的 密切相关’。这是个好消息!

查看 ACS 网站上的截图。(我们将讨论谁是 ACS?后来)。

✪注意:ANZSCO 代码仅仅意味着你的职位。比如“261311 —分析师程序员”或者“261111 ICT 商业分析师”。

现在一个显而易见的问题来了——“密切相关”是什么意思?谁来决定我的主人是不是近亲?好吧,继续读。我们将在技能评估的第三阶段解决这个问题。

步骤 2 —技能评估

一旦你从 SOL 中提名了一份你认为最接近你的资格和就业的工作,你将把你所有的文件送去进行技能评估。

计算机科学、IT、分析相关领域的评估机构是澳大利亚计算机学会 ( ACS )。一旦你最终确定并提名了一个职业,你就可以将你的申请提交给 ACS——并希望他们将结果确定为“密切相关”。

最终目标是在评估结束时,你会被贴上“合适”的标签——记住这个词,因为我们会多次提到它。

重要的是要知道 ACS 将评估两件事—

  1. 你的学历(你的硕士学位,包括每个单元)
  2. 你的工作经历

: ICT 就是“信息和通信技术”的意思,有点像。

第一步——确定你的资格符合哪个 AQF 等级。你会得到一个介于“1 级”和“10 级”之间的结果。我们稍后将探讨这一点。

第二步——分析你所有的课程和单元。您的评估结果将是以下之一——ICT 专业、ICT 次要或不充分。再一次,稍后会详细介绍。

第三步——确定你的单位中有多少与你提名的工作相关。

第五步——评估你的工作经历。

在我们开始详细探讨这四个步骤之前,这将是一个很好的休息时间,来谈谈“适合性标准”——具体来说,ACS 对合适的 ICT 技能评估结果的标准要求的总结

还记得我们上面说过——被贴上“合适”的标签是公关流程第二步的全部目标。

获得“合适的 ICT 技能”评估的要求—

这是 ACS 给出的指导方针的截图。我们将在下面详细分析它。

让我们来分解一下——非常重要!

●你应该先完成澳大利亚学士或硕士学位——也就是说,你不能在继续攻读的时候申请。

●记得在技能评估的第二步中,在分析你的单位后,结果会以三个选项给出吗?(主要、次要或未列出)嗯,您必须接受结果为“主要”。你怎么知道的?别担心,我们会搞定的。

●你应该有 1 年的相关工作经验,或者你可以完成 ACS 专业年计划(这将花费你大约 60 万卢比)

●请记住,你的工作经历应该是在完成硕士学位的 之后的

再说一次,有一个非常清晰、明确的准则来决定你的工作经验是否相关。我们很快就会谈到这一点。

好了,现在我们已经理解了适合性标准的要求,让我们回到理解技能评估过程中的每个阶段。

第一阶段——AQF 可比性

所以在澳洲,有一种叫做 AQF 水平的东西——你教育的每一部分都有一个特定的水平。我会把这个图表贴出来,我们不需要被这个困扰,但是如果需要的话,你可以来参考这个。

既然我们在 9 级,我们应该担心这个。继续前进。

第二阶段——从你的老师那里评估每个单元

这很重要,所以请对我耐心点。

决定你的资格是否被视为主要、次要或未列出的指导方针—

首先是截图,然后我们会进一步详述。

简单来说—

如果你的课程没有先修课程(ICT 专业学士学位——如 IT 专业、计算机科学等),那么,

●你至少要有 2 个学期或 1 年的全日制 ICT 内容(什么 ICT 内容?我们会谈到它)

●总体而言,在两年制硕士课程中,50%的单元必须是 ICT。

●然而,如果你的课程确实有这样的先决条件,你的 33%的单元必须有 ICT 内容。

如果你满足这些,你将被归类为拥有 ICT 专业。但这还不够。你还需要让自己的资历与你提名的工作“密切相关”。

✪注意——除了“专业”之外,要“与你的工作密切相关”, 65%的单元必须与你第一步提名的职业相关!

现在一个大问题来了—

阶段 3 —这些“相关单元”是什么?

这些相关单位都是针对具体工作的,这就是为什么仔细研究哪份工作最适合你的资历和工作经验是很重要的。

✪注意:假设你通过提名一个职位来提交申请——在评估结束后,他们认为你的资格更适合另一个职位(从而增加你获得 PR 的机会),你可以支付 200 美元的费用,先改变你提名的职位。然而,在整个评估过程(大约持续 12 周)完成之前,ACS 无法指导您的资格是否合适。

回到正题,有一个东西叫做 ANSZCO 代码,它非常清楚地概述了与你提名的工作“密切相关”的单位和工作经验。我将在下面贴几张截图,并在底部附上手册的链接。

了解 ANSZCO 代码中的单元是非常有帮助的,这样你就会在你的硕士课程中选择那些特定的选修课!

首先,这些是我们作为数据科学家可以提名的工作。

以下是这些工作所需的课程—

1.ICT 业务分析师

✪:在你的课程中有足够的核心 ICT 课程是很重要的。多少钱?我不确定。

你可以在我下面附上的 pdf 文件(ANZSCO 代码)中查看其他工作的必修课程。

附加信息—

  1. 他们还接受微软和思科的认证,但仅限微软认证解决方案专家和微软认证解决方案开发人员。
  2. 如果你有这些供应商证书,你将被视为 AQF 五级 ICT 专业。(文凭级别)。
  3. 关于供应商认证可能还有其他条件,我建议您参考手册(第 10 页)。

我们到达了“资格评估”的末尾,这结束了第三阶段。现在,让我们继续工作经历。

第 4 阶段—相关工作经验

这一步也相当复杂,我不能公平对待所有的读者,因为他们来自不同的背景和不同的经验水平。我只是简单地提一下重点,你可以参考手册了解更多细节。

注意 : 只有你在硕士毕业后的工作经验才会被算作技术就业,并用于移民目的。

好吧,让我们再看一遍这张截图:

与你的课程单元相似,你推荐信中 65%的“职责和责任”必须与你提名的工作相关。

但是后来,

我如何知道哪些“职责和责任”与提名中的工作密切相关?

让我们回到 ANZSCO 代码信息— 以及所需的 ICT 课程单元,这也提供了需要在特定工作的推荐信中提及的必要职责和责任。

我就贴一个例子。剩下的你可以自己看。

最后,这里有一封就业推荐信的样本。(同样,还有许多其他你应该注意的事情和条件可能适用于你个人——因此,我强烈建议你阅读手册第 11 页)

最后一个问题:没有相关工作经验怎么办?有替代方案吗?

是啊!

幸运的是, ACS 还提供了职业年项目—

●这个为期一年的培训项目可以弥补任何工作经验的不足

●大约花费 60-70 万卢比

●在技术职业列表中,你还会因为完成这个项目而获得 5 点公关积分。

更多详情和资格标准请点击此处—https://www . ACS . org . au/CPD-education/professional-year-program . html

好吧,就这样。唷!

当然,还有十亿件其他的小事——但是作为没有工作的数据科学家,在开始我们的项目之前,这些是我们应该知道的事情——这样我们就可以仔细选择我们的选修课。

干杯!

参考文献—

  1. 189 签证 DIBP 页及其要求——【https://www.border.gov.au/Trav/Visa-1/189-#tab-content-1】T4
  2. 申请人技能评估指南 ( 手册!)—http://more . ACS . org . au/_ _ data/assets/pdf _ file/0020/7319/Skills-Assessment-Guidelines-for-applicants . pdf
  3. ACS 合适的 ICT 技能评估结果的标准要求概要http://more . ACS . org . au/_ _ data/assets/pdf _ file/0016/7324/Summary-of-Criteria-2014 . pdf
  4. ANZSCO 代码描述——http://more . ACS . org . au/_ _ data/assets/pdf _ file/0018/7641/ANZ SCO-Descriptions-2015 . pdf
  5. 关于技能评估和评估机构的 DIBP 页面https://www . border . gov . au/Trav/Work/Work/技能评估和评估机构
  6. 中长期战略技能清单(MLTSSL)——https://www . border . gov . au/Trav/Work/Work/Skills-assessment-and-assessing-authorities/skilled-occupations-lists/MLTSSL

面向计算机科学学生、毕业生和软件工程师的数据科学工作

原文:https://towardsdatascience.com/data-science-jobs-for-computer-science-students-grads-and-software-engineers-2fc49a85489a?source=collection_archive---------1-----------------------

数据科学正在迅速从软件工程的一种专门分支扩展到它自己的学科。作为一门学科,它大量利用计算机科学、统计学和数学来实现其主要目标。不幸的是,对于招聘经理来说,这种广度在典型的本科甚至研究生学位中并没有体现出来。尽管大学正慢慢开始引入数据科学课程来解决这一技能短缺问题,但今天的数据科学家主要是那些通过大量自学来弥补正规教育不足的人。

对于自学者来说,好消息是随着数据科学的成熟和组织发展他们的数据科学团队和能力,专业化的机会增加了。这意味着,尽管数据科学团队的成员以前被要求是在数据科学的所有可能领域拥有广泛知识的“独角兽”,但今天许多较大的团队都有专攻某个领域的成员。作为一名计算机科学毕业生或工程师,你在这一领域大有可为。

数据监管的机遇

作为一个相对新兴的领域,“数据科学”仍然没有统一的定义,但所有数据科学家都关注两个非常广泛且不同的领域:数据分析和数据管理。分析是从数据中提取有用的知识。这可能是人们最常与数据科学家联系在一起的广泛活动:数据科学家是处理数字并从数据中产生可操作的见解和预测模型的人。但在数据科学的讨论中,硬币的另一面经常被忽略:沿途某处的某人必须找出如何有效和高效地收集、管理、保存、记录、转换、更改和访问数据,以使分析成为可能。在学术界,这些活动通常被称为数据管理,在这一领域能力不强的专业数据科学团队做不了多少事情。

事实上,在一些组织中,相对于监管,历史上一直过度强调分析,这对 2017 年的计算机科学学生、毕业生和工程师来说是个好消息。许多博士统计学家和物理学家因其在分析方面的技能被数据科学团队聘用,而这些团队通常严重缺乏数据监管能力。

在专业领域,数据监管专家的常见头衔包括数据工程师数据开发人员商业智能开发人员、大数据专家或有时只是数据科学家。有计算机科学背景的人在这种职业道路上有很好的开端。物理学家或统计学家可能没有在数据结构或模式或实体关系模型方面受过广泛的培训,但这些都是计算机科学教育的基石。有了这些知识,你就可以直接学习现代科技公司用于数据监管的技术。

作为一名数据工程师,您至少应该努力深入了解以下内容:

  • 关系模型及其各种实现(SQL Server、Oracle 数据库、MySQL 等。).
  • NoSQL 数据库包括:
  • 根据db-engines.com的说法,文档存储模型,尤其是 MongoDB,是撰写本文时最流行的 NoSQL 数据库。
  • 像 Cassandra 这样的宽列数据库。
  • 像 Redis 这样的键值存储。
  • 尽可能多的处理其他 NoSQL 模型:这篇维基百科文章是一个很好的起点。
  • MapReduce 编程模型及其在 Apache Hadoop 中的实现。
  • 云计算平台,比如亚马逊网络服务和微软 Azure。

当然,在我点击“发布”这个帖子的时候,上面提到的具体技术可能会过时,但是概念和想法不会。数据监管专家是数据创建、捕获、建模、管理、文档编制、存储、转换和检索方面的专家,需要熟悉成功的组织用来完成这些任务的所有工具。受过数据结构和计算机科学方面的正规教育和培训的人很有可能成为这些领域的专家,并在数据科学团队中领导数据监管活动。

数据分析中的机会

同样,分析可能是大多数人与术语数据科学家联系最紧密的领域,与统计学专业或在高度量化领域拥有博士学位的人相比,学习分析需要 cs 专业的正规教育填补更多空白。对计算机科学专业的学生来说,好消息是,与物理学家或纯粹的数学家相比,你将更容易开始使用数据分析的工具:作为一名程序员,从示例和文档中学习如何使用新工具是你的第二天性。

记住这一点,您也可以从熟悉这些工具开始。我认识的大多数数据科学家都广泛使用 R 和 Python,有些人更喜欢其中一种。如果你已经知道这些语言中的一种,那么这种语言可能是最好的起点。如果你打算使用 R,我所知道的在数据科学中使用 R 的最佳环境是 RStudio ,它是一个 IDE,对交互式编程、编写脚本、制作图形和许多其他分析目标都有很大的支持。如果你想使用 Python,你要安装很多库,把它变成一种数据科学语言;幸运的是,Continuum Analytics 的人们已经构建了一个名为 Anaconda 的 Python 发行版,它附带了用于进行数据科学的主要统计计算库,以及一个名为 Jupyter Notebook 的伟大工具,它以可读的交互式笔记本格式促进计算。顺便提一下,Anaconda 和 Jupyter 笔记本是我们在 BrainStation 即将到来的数据科学课程中使用的主要工具。

从这里开始,一个自然的地方是学习如何使用机器学习来建立一个预测模型。在这里,你可以为不同层次的抽象和理解而努力。为了深入理解各种模型和算法是如何工作的,你需要至少相当于几门本科数学课程的内容:至少两个学期的微积分,至少一个学期的线性代数,可能还有一门概率课程。数据科学团队的成员应该至少具备这种理解水平。也就是说,在 R 中执行线性回归只需要一行代码,使用比这更复杂的模型就行了。从每种算法如何工作的特定细节中抽象出来,有一个更高层次的范式来管理如何用机器学习来构建模型:模型被训练、测试、调整、验证和部署,数据科学家应该理解这个过程中的每一步。有可能实现对如何应用机器学习原理和技术来构建预测模型的高级理解,而不必理解每个特定算法的特定细节。一个很好的起点是 Max Kuhn 的书应用预测建模,它从试图从真实世界的数据中做出最佳预测的角度介绍了机器学习技术,而不是试图理解任何特定算法或模型的微小细节。参加和研究 Kaggle 竞赛也是一个简单地尝试并开始模型制作的好方法。

程序员的机会

工具正在被构建,以将极其复杂的机器学习能力带到不一定手头有博士数学家团队的组织。像 Kerash2o.ai 这样的工具包已经在制作了,这样任何有一点编码经验的人都可以轻松地构建生产质量的机器学习应用程序。这为程序员创造了巨大的机会:未来的挑战将不是构建模型,而是将这些现成的工具包集成到他们组织的生产堆栈中,这需要计算机科学知识和编程经验。出于这个原因,对于工程师和程序员来说,现在是开始学习机器学习和数据科学的最佳时机。

想了解更多关于数据科学的知识吗?看看我们即将推出的兼职数据科学课程

数据科学领导者:你们人太多了

原文:https://towardsdatascience.com/data-science-leaders-there-are-too-many-of-you-37bff8088505?source=collection_archive---------1-----------------------

Here’s the audio version of the article, read for you by the author.

数据科学有问题。几个问题,其实不过从头开始,先说一个:领导。

今天,我在数据科学(横跨机器学习人工智能统计数据汇总和可视化的学科)领导人峰会上发言。当我看着领导当今数据科学团队的最聪明的开拓者的脸的海洋时,我发现自己在想,“你们太多了。”

Nate Silver of FiveThirtyEight speaking to the same audience of data science leaders

想想这是怎么一回事!在峰会上问任何人,他们可能会告诉你,如果你认为人才短缺很糟糕,那么数据科学领域的领导人才短缺就更糟糕了。

今天的大多数数据科学领导者都是我喜欢称之为“超越数据科学家”的人那些追求科学、工程或统计方面正规训练的人,然后,奇迹般地,有一天醒来发现他们更感兴趣的是让数据变得有用,而不是为了追求数学的复杂性。

数据科学的领导者克服了所有的困难。

数据科学领导者:你们太多了,因为你们的存在是排除万难的。因为几乎没有做什么来训练你,你比我们应得的要多。这个幸福的意外是怎么发生的?没有人教你如何做你所做的,所以你的存在是我们的幸运。你的计划是希望在研究了十几年的方程式后,你就能知道如何领导了吗?如何做出好的决策?正如我的 SRE 同事会说的,“希望不是策略。”

你应该有更多的人,但是计划是什么?

如果你喜欢定理,这里有一个:你的时间是有限的,所以如果你用它来学习费曼德费内蒂,你就不会花同样多的时间来培养其他技能。我们不能指望数据科学家超越并立即知道如何成为优秀的领导者和决策者。谁会教他们这些?你不会通过整天写代码或证明定理来学习它。

相反,要成为优秀的领导者和决策者,他们必须谦逊地认识到自己萎缩肌肉中的弱点,并勤奋地掌握第二项技能。有时他们会带着很多伤痕艰难地学习。作为一个一开始就认为概率论宇宙中最热门的东西的人,我非常清楚这有多痛苦。

有个态度问题。我们真的重视这些技能吗?

如果你的经历和我一样,你可能已经在一个亲数学的亚文化中长大,在这个亚文化中,对任何闻起来像“软”技能的东西表现出蔑视是一种时尚。这都是关于你是多么热衷于熬夜证明一些定理或用你的第六语言编码。当你被夹在那种视角中间时,你可能不会想到你应该重视领导力(或者沟通、商业意识、创造力和同理心等)……如果你变得软弱,你的同学会尊重你吗?

你称之为“软”技能。我称它们为“最难自动化的”

部分解决方案是改变时尚,让这些技能成为像原始数据科学这样有吸引力的领域中不可或缺的一部分。如果昂首阔步必须是年轻人的一部分,那么让我们至少让他们相信,最高的荣誉是同时拥有两种肌肉。毕竟是事实。

When it comes to ensuring that data science teams are lead effectively, are we relying on luck or training?

门槛很高,并不是每个有工作的人都能真正做到。

数据科学领域的领导力不仅仅是一学期的数字。是它自己的怪兽。你不仅必须对决策和信息如何推动行动有深刻的理解,还需要敏锐的嗅觉来发现如何有效地影响特定业务领域的细微差别,如果这还不够,你还需要了解各种技能的生态系统,这些技能需要汇集在一起才能使大规模数据科学项目取得成功。而这只是进入这个游戏的最低要求。

这是一个相当高的门槛,并不是每个领导数据科学团队的人都能达到。雇主们,你怎么知道你是否真的在雇佣一个人来领导你的数据团队呢?如果您的团队已经有了糟糕的数据科学领导,该怎么办?你怎么知道的?几乎没有任何关于这个角色的智慧可供你依靠。你能问谁呢?

数据科学是泡沫吗?

当今世界正在产生前所未有的数据。然而,有时我会被问到类似这样的问题, “数据科学是泡沫吗?” 我希望我能回答,坚定而有说服力,“肯定不会!”事实是,这要看情况。可悲的是,当我与各行各业的人聊天时,我不断听到同样的故事:“我们的数据科学家毫无用处!他们所做的就是坐着发表论文。”我们会有足够多有经验的领导者来防止这种太普遍的现象吗?如果数据科学家不能证明自己的价值,他们不会在这些岗位上呆很久。

期望一个刚毕业的科学博士知道如何对商业做出有意义的贡献是不公平的。那不是他们花了那么多年学的东西。如果没有了解数据科学所涉及的内容并知道如何将数据与业务联系起来的人的指导,他们将面临重重困难。为了确保数据科学不是泡沫,我们迫切需要专业化的领导。它将从哪里来?

数据科学领导者的培训项目在哪里?希望不是策略。

人们,让我们感激我们是多么幸运!不知何故,优秀的数据科学领导者确实存在,技能也在那里。不是有效获得的技能,因为双重掌握是连续获得的,也许很痛苦,但仍然是正确的技能。我希望你和我一样强烈地感受到这种紧迫性。我们中少数几个经历了艰难困苦的人需要开始用更好的方式训练我们更多的人。

就我而言,我承诺尽我的一份力量。在过去的几年里,我一直在谷歌努力培养新一代的思考者,定位于作为团队的一员有效地领导或工作,专注于将数据科学应用于实际问题。为了培养正确的技能,我们从数据科学和工程中汲取了一些想法,并用行为科学和管理科学对其进行了补充。结果只是看起来跨学科,直到你看到共同的核心:决策和驱动它们的信息。这就是为什么我们开始称它为决策智能(不过如果你愿意,你也可以把它当成应用数据科学++来看待)。

让我们培养一种新的思考者:拥有让数据科学团队成功的技能的决策者。

我一直认为,数据科学是一项受益于技能多样性的团队运动,所以我设计了我们的培训计划,以鼓励各种背景的人参与进来。事实证明,伟大的数据科学领导者不一定是被超越的数据科学家。

我为我们在谷歌员工中培养这些技能所取得的成就感到骄傲…但这还不够。没有必要让每个人都依赖快乐的意外和完全沉浸在一个以上的学科中来建立相同的技能。我希望阅读这篇文章至少能激发一些了解数据科学决策者技能的人和我一起认识到数据科学本身就是一门学科,并尽可能广泛地分享我们的智慧。

感谢阅读!YouTube 课程怎么样?

如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:

Enjoy the entire course playlist here: bit.ly/machinefriend

与凯西·科兹尔科夫联系

让我们做朋友吧!你可以在推特YouTubeLinkedIn 上找到我。有兴趣让我在你的活动上发言吗?使用表格联系。

我们如何在 S&P 全球推广数据科学素养

原文:https://towardsdatascience.com/data-science-literacy-for-the-enterprise-fadaf9268494?source=collection_archive---------14-----------------------

标准普尔全球市场情报首席数据科学家 Zak Brown

无论是大公司还是小公司,都在成倍增加他们的数据科学团队,以此来转变他们的业务,并通过数据科学推动整个企业的技术变革。但是仅仅雇佣数据科学家并不能保证大多数公司设想的范式转变。这一关键转变的关键是数据科学素养。

数据科学、高级分析和开源技术提供的优势对于现代企业在快速发展的技术环境中保持相关性和竞争力至关重要。创业公司正在通过利用新的技术和分析技术来改变客户对整个行业的期望,从而颠覆各种行业。许多较大的组织可能难以采用新的分析方法,而广泛采用的最佳方式是通过在业务的各个方面利用分析的文化转变。

S&P Global——信用评级、数据和分析、研究和基准的金融服务提供商——我们以提供重要见解的悠久历史而自豪。该公司的历史可以追溯到 1860 年,当时 Henry Varnum Poor 出版了一本美国铁路行业投资者指南,为投资者做出明智的投资决策提供了重要的见解。

该公司诞生于数据和分析流程的智能、有效的应用,现在我们可以在任何地方用预测模型补充这些应用;我们的核心竞争力围绕着我们的模型驱动能力。正如许多公司可能意识到的那样,保持和发展这种方法不仅仅意味着数据科学家团队处理数据,为了真正实现文化变革,我们需要用基本的数据科学素养武装员工。

从哪里开始?

首先,我们必须决定用什么机制来对分布在全球各地的 17,000 名员工进行数据科学教育。我们需要弄清楚如何实施一个能够以有趣和互动的方式扩展的培训计划。我们还需要考虑对广泛的参与者群体有价值的一组正确的资源和材料,教育那些数据科学新手,同时也为更高级的学习者提供有用的实践经验。

我们决定提供一种数据科学教育的混合方法,利用大规模在线开放课程(MOOCs)中提供的开源学习材料,并补充额外的内部资源,将所有课程模块与特定的“熟悉”应用联系起来。为此,我们确定了本次会议的四个主要组成部分:

●来自开源 MOOC 的视频和练习

●由内部专家主持的实时互动审查会议

●在线论坛,促进参与者之间的讨论和交流

●在线数据科学平台,以促进技术材料的管理、交付和执行

在选择正确的课程时,我们开始寻找一个既能提供足够的广度和深度来吸引广泛的基础,又不牺牲技术严谨性的课程。信不信由你,虽然数据科学对业务至关重要,但对普通员工来说,学习数据科学可能不是最大的吸引力。

我们的目标是确定一门与员工工作优先级相一致的课程,以及一门我们可以将领域和公司特定信息融入其中的课程。在互动会议中,我们邀请了 S&P 全球市场智能数据科学部门的成员来主持讨论,并展示现有的计划,以展示数据科学技术目前在组织中的应用情况。我们还希望找到一个免费且易于使用的论坛平台,让参与者与讲师互动,更重要的是,与其他参与者互动。最后,我们需要从技术上简化员工设置数据科学环境并获得所需的技术支持。

我们是这样做的。

  1. 我们求助于 Udacity 的开源课程 UD120:机器学习简介进行基于计算机的指导培训,包括讲座(视频)和编码练习,员工在 GitHub 库中进行了为期 10 周的培训。
  2. 我们利用 Piazza 的免费 Q & A 平台来促进员工之间的异步沟通和协作。
  3. 我们主持了每周一次的现场会议,进行同步评审。在这些会议期间,我们做了几件有助于评估项目进展和持续成功的事情:
  4. 复习本周的材料。
  5. 提供补充信息或推荐资源,为员工提供进一步研究的话题。
  6. 回顾编码练习并解决任何障碍或挑战。
  7. 参与互动、开放式的问答。
  8. 将课程学习和练习应用到标准普尔的实际数据科学项目中。
  9. 我们求助于 Domino 数据实验室平台,从本质上充当支撑这个项目的“粘合剂”。
  10. 托管我们的课程材料。
  11. 为员工提供了一个共享的工作平台,使他们能够根据需要轻松增加和减少计算资源,并促进轻松的协作和结果共享。
  12. 简化了向员工“推送”课程材料更新的流程。

最近怎么样?我们看到了什么结果?

该计划首次运行了 10 周,在此期间,来自多个全球部门的 130 多名员工参与其中。在整个 10 周中,在每次指导学习会议和在线论坛中,参与都很活跃。

我们一直在收集非常积极的反馈。以下是我最喜欢的一些参与员工的轶事:

●“复习课很有用,因为它引导了课程,澄清了中途出现的疑问。”

●“很难在 10 周内涵盖数据科学模型的广度。我认为数学课和编码实践的结合是理解的最好方法。”

●“我认为技术练习很好地激发了你的好奇心,人们一头扎进了有趣的部分。引导式会议非常有利于看到真实世界的例子,也是提问的机会。”

●“我喜欢听不同的数据科学家解释概念。视觉效果很棒,回答问题也很有帮助。”

在所有 17,000 名 S&P 员工都具备“数据科学素养”之前,我们还有很长的路要走,但我们已经有了一个良好的开端,并期待看到该计划如何培养一种比我们今天更受模型驱动的文化。

艺术的数据科学、机器学习和人工智能

原文:https://towardsdatascience.com/data-science-machine-learning-and-artificial-intelligence-for-art-1ac48c4fad41?source=collection_archive---------2-----------------------

苏富比线程天才团队见面

数据科学、机器学习和人工智能是计算机科学中已经渗透到世界各地许多行业和公司的领域。它们的采用几乎肯定与过去十年“大数据”的崛起有关。

高级数据分析有可能改变公司理解见解、组织活动和创造价值的方式。编程语言、开源库和云计算的进步也使得这些方法更容易有效地应用于数据。

到目前为止,艺术品市场仍然是一个数据分析革命尚未真正开始的领域。

这篇博客文章将解释最先进的数据科学、机器学习(ML)和人工智能(AI)方法如何被 Thread Genius 用于艺术市场,该公司被世界上最古老的国际拍卖行苏富比收购。1744).我会给你一些关于我们团队动态的见解,我们正在解决的问题以及我们是如何做的。

An auction at Sotheby’s in 1957

机器学习和人工智能到底是什么?

这个问题问得好。首先,数据科学是一门使用和分析数据来测试假设、回答问题和理解见解的学科。

机器学习是利用计算工具和统计技术赋予计算机从数据中学习的能力。来自 Google Cloud 的 Yufeng在他的文章:用数据回答问题中使用了一个更精炼的定义。

人工智能是指计算工具开始拥有认知能力——出于本文的目的,AI 将指的是使用人工神经网络的“深度学习”技术

谁是线程天才?

Thread Genius 是一家人工智能初创公司,由 Ahmad QamarAndrew Shum 于 2015 年创立,并于 2018 年 1 月被苏富比收购。两位创始人在创办 Thread Genius 之前都曾在 Spotify 工作。其技术的主要用途是一个视觉搜索引擎,该引擎使用人工神经网络为时尚行业应用深度学习技术。

Thread Genius using deep learning to identify similar handbags

通过训练人工神经网络,Thread Genius 能够从图像中识别服装,以找到视觉上相似的服装。阅读他们的媒体文章“机器人比尔·坎宁汉:用深度神经网络实现时尚的 Shazam”了解更多信息。

有趣的是,Thread Genius 还将这项技术应用于艺术:阅读“艺术天才:用视觉搜索发现艺术品”了解更多信息。

Art Genius — Thread Genius using deep learning to identify similar art

我们的团队是如何分解的?

现在,Thread Genius 是一个由机器学习工程师、软件和数据工程师、数据科学家和设计师组成的不断壮大的团队,总部位于纽约市的苏富比。

我们最初的努力包括大规模数据管道的软件开发,用于清理和标准化历史苏富比的数据宝藏,以便我们可以进行数据分析并大规模应用 ML 和 AI。

阅读 Fast Company 关于我们的这篇文章了解更多详情。

我们试图解决的是什么?

那么,我们试图通过使用和分析数据来检验的假设和回答的问题是什么呢?

The galleries at Sotheby’s New York

苏富比拥有艺术市场中一些最好的数据,包括历史交易、每个价位的个人艺术偏好、图像、物品和艺术品信息等等。通过有效利用这些数据,我们希望实现以下任务:

利用苏富比的梅·摩西数据库。这体现了我们围绕分析艺术作为一种资产所做的努力。Sotheby's Mei Moses 数据集是一个独特的数据库,包含八个收藏类别中超过 50,000 次重复拍卖——最早记录的拍卖是在 17 世纪初!它是由纽约大学斯特恩商学院教授梅建平博士和迈克尔·摩西博士于 2002 年首次开发的——点击此处阅读学术论文

该数据集使用同一幅画在两个不同时刻的购买价格(即重复销售)来衡量独特艺术品的价值变化。我们计划使用这些信息来分析独特物品的价值如何随着时间的推移而变化,并将艺术品作为资产的投资业绩与其他资产类别的投资业绩进行比较。

解锁供给。如果我们的客户选择出售他们的艺术品,我们希望让他们更容易这样做。我们的目标是使用数据来提供更低的壁垒,以帮助人们出售他们的艺术。我们目前正在开发产品,通过各种机器学习技术来提供价格透明度。

一个推荐引擎。在收购之前,Thread Genius 专门研究使用卷积神经网络的基于味道的图像识别和推荐技术。通过使用苏富比的数据,我们将使用深度学习向我们的客户推荐将要出售的艺术品或物品。

打造最好的数据产品。通过将这三项任务整合在一起,我们的目标是提高运营效率,打造艺术品市场中最好的数据产品,以便我们的客户在苏富比参与艺术品交易时能够获得最佳体验和透明信息。

我们要怎么做?

我们主要使用 Google Cloud 平台来完成我们的所有工作——从 Dataprep 中的数据清理,从数据流中的数据处理和标准化,到大查询中的数据存储,在 Datalab 中的数据分析,最后,ML 和 AI 使用 GCP 的整套机器学习能力

我们主要用 Python 编码,但是我们的软件开发人员正在使用 Node 和 Ruby 进行后端开发。我们将为上面列出的一些任务构建自定义应用程序。

Various products and software offered by Google Cloud Platform

为什么这个问题很难

虽然我们正在使用先进的数据分析来理解来自图像和数据的见解,但艺术从根本上来说是主观的——无论是在价值上还是在品味上。

每当我们从分析中发现见解时,对照我们的专家所拥有的领域知识来验证它们是至关重要的。在整个过程中,人的参与是非常重要的。我们很幸运,苏富比拥有世界上最好的艺术专家,他们可以全程帮助我们。

此外,这将是第一次有人在艺术市场上做这样的事情——我们基本上是在一张空白的画布上工作。像这样的挑战非常令人兴奋,我们很高兴能够为未来的发展指明方向。

Auction of Contemporary Art at Sotheby’s New York

想帮我们吗?

苏富比的目标一直是成为艺术市场创新和技术的领导者,并支持艺术和技术的未来。

我们很高兴能够在艺术市场应用先进的机器学习和人工智能,并与我们在苏富比的专家直接合作,以便我们能够创造出业内最好的数据产品。

如果你有数据科学、机器学习、NLP 和/或人工智能方面的背景,并且对改变世界感兴趣,请随时与我们联系,我们总是有兴趣与你,我们的观众交谈。

随着我们继续迈向数据科学的旅程,我们将继续在这份出版物上撰写关于我们项目的更多细节,敬请关注!

感谢您的阅读,

Vishal

在你离开之前…

如果您觉得这篇文章很有帮助,请按住👏按钮,在脸书、推特或 LinkedIn 上分享这篇文章,这样每个人都能从中受益。

Vishal 是苏富比 Thread Genius 的前沿数据科学家。你可以在 LinkedIn 上通过邮箱 与他取得联系。

数据科学、神经科学和医疗设备

原文:https://towardsdatascience.com/data-science-neuroscience-and-medical-devices-ff5e601d3d34?source=collection_archive---------9-----------------------

首先,我想感谢那些在过去的一年里关注我在《走向数据科学》中的文章的人。我已经达到了 2000 名追随者的里程碑,这在很大程度上要感谢你愿意阅读我的文章。

你们很多人不知道的是,除了我在人工神经网络和优化方面的工作,我还有十年的经验与马修·勒梅一起研究生物神经网络(大脑!)以及如何修改。

2010 年,我与人共同创立了 Nuraleve ,这是一家神经技术研究和医疗器械公司,专门从事神经调节治疗成瘾、慢性疼痛和其他疾病的临床和商业进展。我们是一个由研究人员、医生和疼痛管理专家组成的团队,乐观地认为当时的现有科学指向一个全新的一线治疗类别。神经科学的重大突破正在改变我们认为可能的事情,所以我们决定加入这场竞争,开发一种治疗神经疾病的医疗设备。正如快速经颅直流电刺激(tDCS)和相关协议(如 TMS、tRNS、tACS、DBS、ect、VNS、taVNS 和许多其他方案)今天仍然是活跃的研究领域,仅 tDCS 就有超过 2,000 篇同行评议的出版物,并且多年来有广泛的媒体报道。

在本文中,我想谈谈我使用生物神经网络进行的几个数据科学项目。这包括对大脑的扫描,进入大脑的信号,改变大脑功能,以及从大脑中获取信号。

在 Nuraleve,我帮助开发了一种用于治疗慢性疼痛、成瘾和其他适应症的非侵入性神经刺激设备。这种经过临床验证的治疗方法用于通过放置在头皮特定位置的电极刺激大脑区域。刺激运动皮层 (M1)来治疗某种慢性疼痛,而刺激背外侧前额叶皮层(DL-PFC)来减少吸烟和其他毒瘾。还有一个认知增强协议

tDCS 通过头皮和大脑发送微弱的电流。最新的科学表明,tDCS 通过修改神经元的放电阈值来改变大脑活动。刺激可以增加皮层兴奋性,引起长时程增强(LTP)。这种类型的刺激导致神经递质谷氨酸的释放,谷氨酸与突触后神经元中的 NMDA 和 AMPA 受体结合,引起 LTP。改变神经元兴奋性受治疗强度和持续时间的影响。刺激是在病人醒着的时候施加的,我可以从第一手经验告诉你,这并不痛苦。使用口腔内电极阵列(见下文),感觉有点像嘴里的流行摇滚,带有金属余味。这有点像试图向你描述一种你从未见过的颜色。

Brain research takes a long time.

Nuraleve 创建了专有的医疗协议和软件,供医疗专业人员在评估和治疗患者时使用,经过多年的 R&D 和保护关键想法的专利,它终于进入了市场。本文中描述的项目都在公共领域。

[## US8942811B2 -经颅电流刺激装置和方法-谷歌专利

一种用于经颅刺激的装置。

patents.google.com](https://patents.google.com/patent/US8942811B2/en)

Nuraleve 的设备是 ce 标志,加拿大卫生部批准用于治疗
慢性疼痛、成瘾和其他适应症。欧洲批准的适应症包括慢性疼痛、急性疼痛、成瘾,包括肥胖、酒精、药物(大麻、可卡因、阿片类药物、甲丨基丨苯丙胺)、吸烟、抑郁症、中风后康复和认知缺陷。这是一个巨大的市场。

通过结合对照临床试验和专有数据来衡量治疗的临床疗效。这个数据才是我要重点关注的。Nuraleve 的专有应用软件从每个大脑刺激器中捕捉实时数据。对于数据科学家来说,这些数据非常酷。

All the stuff used during a typical treatment session.

让我们来讨论一下该设备的功能和测量内容。Nuraleve 的大脑刺激器在大脑中施加直流电,在 3D 模式下,这意味着在治疗过程中,通过皮层的电流密度会有的变化。当通过脑组织应用这种治疗时,该设备检查以确保它附着在患者身上,并且在这样做时,它每秒钟对大脑进行多次多频扫描。这种安全特性还有一个额外的好处,那就是告诉我们在治疗过程中大脑内部发生了什么。这个领域被称为阻抗谱。

Voltage between electrodes during treatment measured at one frequency. Note the drop in resistance/impedance/voltage as the scalp charges up with ions during treatment,

我与赫歇尔·凯塔克和我的论文导师教授米奥德拉克·博利奇博士一起准备了一份关于生物阻抗的会议海报,查看如上图所示的数据,并找出阻抗随时间的变化如何与头皮、硬脑膜、皮层等的变化相关联。基本上,我们必须考虑有多少治疗穿透了保护大脑的多层外壳。赫歇尔实际上正在写关于神经刺激和光谱学的博士论文。这是一个相当数据密集型的研究领域,使用有限元模型来模拟大脑中发生的事情。

从数据角度来看,大脑扫描端不仅有数据科学工作,大脑刺激端也有数据科学工作。我们对通过脑神经的多电极大脑刺激进行了一系列研究,以获得与大脑的更好连接。简而言之,使用口腔电极通过舌头的连接比通过头骨和头皮的连接“更好”。

[## US8874220B2 -神经刺激系统、装置和方法-谷歌专利

公开了一种用于个体脑神经刺激的设备,具有用于产生刺激信号的信号驱动单元

patents.google.com](https://patents.google.com/patent/US8874220B2/en)

在专利中,我们描述了如何使用电极阵列作为大脑的输入来玩游戏。

[## 低成本双向人机接口——IEEE 会议出版物

在过去的十年里,人机界面的开发和应用取得了许多进展…

ieeexplore.ieee.org](https://ieeexplore.ieee.org/abstract/document/5480231/)

我们认为这个设备不仅仅是一个大脑修改(神经调节)设备,而是一个人机界面,既可以向大脑发送信息,也可以从大脑接收信息。

Polyamide and gold pads were used to make this biocompatible electrode array, More on this process in this IEEE paper we wrote just about this line of research.

正如埃隆·马斯克如此专业地确定一样,信号来自大脑的神经接口将成为游戏改变者(认为让事情发生),而将信号发送到大脑的接口更多的是当今的技术,而不是科幻小说。我们的世界已经有了仿生眼睛、四肢和手,以及市场上其他神经接口的感官替代产品。

在医疗器械研究中,通常会有材料科学的成分。这通常在设备和患者之间的界面处。例如,我参与了几个项目来设计更好的电极。

[## 经颅直流电刺激用高吸水性聚合物电极

高吸水性聚合物(SAP)被认为是经皮刺激电极的一种可行的碳替代品。

ieeexplore.ieee.org](https://ieeexplore.ieee.org/abstract/document/6549760/)

一些研究涉及数据收集,这里有一个超级有趣的例子:我做了一个记录活蚯蚓大脑信号的项目,在用伏特加麻醉它们使它们更顺从之后。回想起来,这非常有趣,但在当时它并不那么有趣,更多的是“我不敢相信我在做这件事”。

This is a screenshot from one of my research reports.

下表是神经改造科学结果的一个很好的例子。所有花哨的曲线和装置都归结为简单的数字和物理相关性测量。

R&D 日常医疗设备中的数据科学远远超出了设备本身。HIPAA 规则要求非常详细的文档和软件验证,以确保医疗记录在设备和云之间的安全存储和传输。此外,临床试验记录必须保持最新,不良事件报告不仅针对该公司的设备,而且针对任何其他公司的设备。因此,定期有大量的统计工作来计算治疗所需的数量、疗效等等。

你可以在公司网站上了解更多关于 Nuraleve 的信息。

因此,总而言之,数据科学是医疗设备开发的一个关键方面,它提供了从大数据集获得的洞察力。在下一篇文章中,我将介绍我们已经研究了很长时间的东西,它可以帮助企业在内部审计期间自动分析非结构化报告。

如果你喜欢这篇关于医疗设备数据科学的文章,那么请点击关注按钮,看看我以前读过的一些文章,比如“如何为人工智能项目定价”和“如何聘请人工智能顾问”除了与业务相关的文章,我还准备了一些关于寻求采用深度机器学习的公司所面临的其他问题的文章,如“没有云和 API 的机器学习

下次见!

-丹尼尔
丹尼尔@lemay.ai ←打个招呼。
LEMAY . AI
1(855)LEMAY-AI

您可能喜欢的其他文章:

移动数据科学——如何实现?问问新妈妈!第二部分

原文:https://towardsdatascience.com/data-science-on-the-go-how-ask-a-new-mom-part-ii-33161c73758d?source=collection_archive---------16-----------------------

这是一位新妈妈(我)分享的关于在旅途中学习数据科学的技巧和诀窍的帖子的第二部分。在第一部分中,我讨论了即使你认为自己根本没有空闲时间(比如一个新妈妈),你也可以如何找到时间学习,并分享了一些我个人用来在旅途中学习的资源。在这篇文章中,我将谈论如何跟上数据科学领域的最新发展。

保持关注的最简单方法是收听播客、订阅时事通讯并在 Twitter 上关注数据科学家。

听,宝贝…听播客!

他们说婴儿应该尽可能多地接触语言?那么,为什么不听播客呢?好吧,我开玩笑的!:)我不会给我 6 个月大的儿子打开关于数据科学的播客,至少现在不会。但是我经常在带着宝宝散步或者赶着做家务的时候听它们。你可以在通勤、在镇上散步或在家时做这件事。

我订阅了以下播客:

  • data framed—一个 DataCamp 的官方播客。最近的主题包括采访来自不同公司(如 StitchFix、麦肯锡、Airbnb 等)的数据科学家,以及讨论数据科学在不同行业的应用。
  • 线性离题 s 播客涵盖了各种主题:从解释各种算法(例如,关于自动编码器、傅立叶变换、学习索引结构等的章节)及其背后的直觉,到讨论数据科学家可能面临的实际问题(如如何分配项目、如何解决隐私等)。
  • 人工智能在工业中与 Dan Faggella——讨论数据科学在不同行业的应用以及数据科学家面临的实际挑战
  • data crunch与上面列出的节目不同,这一个节目更高级,主要包括数据科学的历史或在商业中使用大数据的意义等主题。
  • SuperDataScience。****由基里尔·叶列缅科主持的播客,讲述数据科学和个人经历中的各种事情。
  • 会说话的机器 提供了各种各样的话题:从具体的 DS 工具和算法到对数据科学家的采访,从对 ML 应用的具体讨论到对在我们生活中应用机器学习的社会影响的讨论。

发送给您的新闻…

…直接发送到您的电子邮件收件箱!我说的是时事通讯。我喜欢每周收集该领域最流行的文章,所以我订阅了几份时事通讯。

  • ODSC 迅 这是一份来自 ODSC 的每周简讯,发送 ODSC 门户网站上最热门的文章。在教程的链接旁边,你会找到很多关于使用某些算法或工具的技巧。

  • 艾周刊 。顾名思义,这是一个关于人工智能行业的每周新闻集。

通过推特获取知识

那些拥有 Twitter 账户的人(我敢打赌,如果你曾经试图做某种情绪分析,你就有一个 Twitter 账户)可以建立自己的“数据科学”新闻订阅。Twitter 上有很多非常活跃的优秀数据科学家,关注他们将有助于你了解最新消息。以下是我关注的一些 Twitter 账户:

因此,正如你所看到的,即使你非常忙,睡眠不足,认为自己根本没有时间,也有很多机会学习数据科学。试着分析你的一天,也许在通勤或散步的时候学习,或者在午休的时候抽出一些时间。了解您手头有哪些工具(智能手机、平板电脑、笔记本电脑?)并将其用于学习目的。

做母亲教会了我珍惜时间,我鼓励你也这样做!

请告诉我你对学习资源的看法。如果你在评论中分享你关注的博客、时事通讯、播客和其他资源,我会很高兴。

祝你好运!

Photo by Dakota Corbin on Unsplash

面向所有人的数据科学性能指标

原文:https://towardsdatascience.com/data-science-performance-metrics-for-everyone-4d68f4859eef?source=collection_archive---------2-----------------------

准确性、召回率、精确度、灵敏度、特异性……—数据科学家使用如此多的性能指标!你如何向非技术背景的观众解释它们?作为一名数据科学家,我发现向每个人描述这些概念对我的工作来说既有挑战性、有趣又至关重要。这篇博文将使用普通的语言和图片来解释许多绩效指标,这样你公司的每个人都能理解它们。

最近,我开发了一个机器学习模型,来预测下周哪些接受透析的患者将被送入医院。这个模型在我的公司(费森尤斯医疗护理北美公司)受到了很多关注,所以我向包括数据科学家、数据分析师、护士、医生甚至高管在内的广泛受众介绍了这个模型的细节。根据经验,我知道每个人对“准确性”的解释都不一样,所以我必须非常小心地解释性能指标及其含义。

通过这篇博文,我们将使用预测下周哪些病人将住院的例子。这是一个分类问题的示例,我们试图预测每个患者是否应该被放入预测阳性组(即预测将住院)或预测阴性组(即预测将不住院),如下所示。

预测模型很少能完美地预测一切,因此有许多性能指标可用于分析我们的模型。像我这样的数据科学家喜欢看方程,但这在非技术背景的人的演示中很少奏效。如果你想阅读一篇使用等式作为性能指标的文章,我强烈推荐威廉·科尔森最近的文章

当你对你的人口进行预测时,你的结果可以分为如下所示的 4 个部分(本文中的数字是受维基百科的启发):

  • 真阳性:住院的人,你预测他们会住院
  • 真正的负面因素:没有住院的人,你预测他们不会住院
  • 误报:没有住院的人,你预测他们会住院
  • 假阴性:你预测住院的人不会住院

在我们继续之前,让我们把患病率这个术语定义为人口中的阳性部分。在我们的例子中,大约 2%的透析人群将在一周内住院(即患病率= 2%)。

4 项绩效指标

最常见的性能指标是准确性,它被定义为您正确预测的分数,如下所示

当描述一个模型时,这个度量并不总是最好的。例如,如果你总是预测人们不会住院,你的准确率将是 98%,但你不会预测任何实际住院。

为了解决这个问题,数据科学家使用其他指标来代替。两个常见的是回忆(也称为敏感性)和特异性。在我们的例子中,回忆是指你预测所有住院病人中有多少人会住院。特异性是你预测在所有未住院的人中,有多少人不会住院。

数据科学家使用的另一个性能指标是精确度。在我们的例子中,这将是所有你预测要住院的人中实际住院的比例。

到目前为止,我们还没有讨论预测模型如何将患者分配为预测住院或预测不住院。在大多数情况下,预测模型将给出阳性(即住院)的概率。我们可以选择哪些概率被指定为预测正和预测负。如下所示,我们可以调整这个阈值,这会改变性能指标,这通常会导致指标之间的权衡。例如,降低阈值会增加灵敏度,但会降低特异性。

两个真实的例子

在一些演示中,我发现这些抽象的定义直到你为模型提供一个实际的有形数字的表格才被理解。让我们通过两个例子来展示流行对某些固定阈值的影响。在第一个例子中,我们假设患病率为 50% (50%住院,50%未住院)。给定 100 名患者,我们有以下分解和性能指标。

在第二个例子中,让我们假设患病率为 3% (3%住院,97%未住院)

我们可以看到,不同的患病率在两个例子之间保持了相同的灵敏度和特异性,但准确度和精密度发生了变化。事实上,当您的患病率较低时,通常您的精确度较低(即,预计住院人数比实际住院人数多得多)。

结论

在本文中,我们讨论了 4 个性能指标(准确度、灵敏度、特异性和精确度)。我们还讨论了流行度如何影响性能指标,特别证明了流行度越低,精度越低。如果您有兴趣,我推荐您阅读其他高级性能指标,如曲线下面积(AUC)或 F1。

数据科学、慈善事业和第三部门——海量的好代码

原文:https://towardsdatascience.com/data-science-philanthropy-and-the-third-sector-magnanimous-coding-for-good-cf2f9caf6fc6?source=collection_archive---------15-----------------------

用你的技能改善世界和人们的生活

Photo by Егор Камелев on Unsplash

不可否认,数据科学是当前的主要趋势之一,从人工智能研究、疾病诊断和自动驾驶汽车,到欺诈检测、数字营销、人力资源管理等等。

读到这里的许多人很可能是数据科学家,你应该已经知道这些了。你们中的一些人可能不知道,但听说过很多,你们中的一些人可能不知道,但对如何在你们的领域应用它有专业兴趣。

许多组织已经接受了数据科学,并可以支持大型团队开展各种工作,从从数据中提取洞察力以做出更好的决策,到大规模开发和实施机器学习模型。许多组织就是没有这样的资源;可能没有规模经济来让第一个数据科学家雇佣工作,或者可能总是有项目必须得到优先考虑。

但是,有一个答案。一个有利于数据科学家和那些正在发展他们的技能和投资组合的人,一个有利于许多这些组织的人。在本帖中,我们将简要介绍我们如何定义数据科学,慈善机构和第三部门组织如何使用数据科学——为非数据科学家服务,以及数据科学本身如何作为资产捐赠,以推动变革和进步。

新技术正导致可用数据的数量和类型呈指数级增长,为通知和改造社会以及保护环境创造了前所未有的可能性。政府、公司、研究人员和公民团体都在积极尝试、创新和适应新的数据世界,在这个世界里,数据比以往任何时候都更大、更快、更详细。这就是数据革命。

有些人已经生活在这个新世界里了。但是,由于缺乏资源、知识、能力或机会,太多的人、组织和政府被排除在外。在获取数据和信息以及使用数据和信息的能力方面,存在着巨大且日益加剧的不平等。

为了进一步探索商业与数据科学的结合,在 Twitter 上关注 Chris

什么是数据科学?

我们的世界正在以惊人的速度产生数据。随着越来越多的设备利用互联网连接来提供更多功能和便利——即“物联网”——我们产生这些数据的速度将会继续提高。除了一些最明显的应用,如在线购物车中改进的产品推荐和一组更相关的“up next”猫视频,数据科学可以带来数据中的知识,只等着被发现。有些知识可能会改变世界,甚至只是解决一个小问题的第一步。

如果你问十个人,关于什么是数据科学,数据科学家做什么,你可能会得到十种不同的定义。从根本上说,数据科学是关于使用统计和计算技术将来自无数来源的数据转化为发现和结论,从而产生洞察力,促进明智的决策,揭示模式和趋势,并允许我们进行预测。

“新技术正导致可用数据的数量和类型呈指数级增长,为通知和改造社会以及保护环境创造了前所未有的可能性。政府、公司、研究人员和公民团体都在积极尝试、创新和适应新的数据世界,在这个世界里,数据比以往任何时候都更大、更快、更详细。这就是数据革命。

有些人已经生活在这个新世界里了。但是,由于缺乏资源、知识、能力或机会,太多的人、组织和政府被排除在外。在获取数据和信息以及使用数据和信息的能力方面,存在着巨大且日益加剧的不平等。"

-联合国秘书长数据革命促进可持续发展独立专家咨询小组

数据科学如何惠及慈善和第三部门组织?

很容易看出数据科学如何在某些领域得到应用。例如,银行可以建立分析管道,在信贷申请中寻找与贷款违约相关的特征;流媒体视频网站可以根据你的观看历史推荐电影,移动电话公司可以建立模型来预测客户是否不会续签合同,并为他们提供适当的优惠。

数据科学如何在专注于慈善和进步活动的组织中得到应用,可能不会立即显而易见,但数据科学在这些领域可以像在蓝筹股业务或科技初创公司中一样有效和有用。

从基本的有效性和效率开始,数据科学可以为组织管理的各个方面提供信息,从员工招聘和保留,到市场营销,再到资产和运营。在最近一个将机器学习应用于设施管理的例子中,谷歌能够使用其算法将用于冷却其数据中心的能源量减少 40%

随着机器学习方法开始在组织的更多活动中应用,通过提高效率实现的潜在节约可能会对成本产生重大影响,降低每笔捐赠中用于组织开销的百分比。

尽管降低运营成本可以最大限度地提高每笔捐款的使用价值,但人们总是希望确保捐款用在能够产生最大影响的地方,并确保捐款的有效性受到监控。

数据科学也可以在这方面发挥作用,基于人工智能的模型可以在预期项目中寻找与强劲表现和成功结果相关的特征,而算法可以实时评估项目的表现,从使用情绪分析跟踪社交媒体意见,使用统计分析寻找特定行业的经济增长提升,或者使用数据科学技术组合和补充来自不同来源的数据以推动医疗保健计划,如在纳米比亚的疟疾控制

根据我在多个领域讨论数据科学应用的经验,比如采购和库存管理、可持续时尚和旅游,通常唯一的限制是你的想象力。如果你能让一位数据科学家和一位领域专家在下班后一起喝杯咖啡或啤酒,进行一次随意的交谈,你很可能会惊讶于一个晚上能在一张餐巾纸上写下多少想法。

数据科学本身就是慈善事业

很明显,数据科学不仅可以增强慈善项目的选择和管理,确保捐赠物尽其用,而且数据科学中有越来越多的活动成为捐赠。

随着组织不仅对自己的数据基础设施、获取、存储和分析进行大量投资,而且对其数据科学家进行大量投资,公司的数据科学职能是一项宝贵的资产,并且有可能在组织内外提供价值。这一价值使得“慈善数据科学”成为企业拓展和社会责任项目的一个不断增长的领域。

万事达基金会的包容性增长中心是全球企业利用其资源和专业知识回馈社会的一个例子。该中心的核心理念是利用“公司的核心资产,通过研究、数据慈善、项目和参与,推动包容性增长的行动。”

不仅仅是跨国公司通过数据科学回馈社会。像 DataKind 这样的组织给数据科学家一个回馈的机会,将他们自己的时间和专业知识贡献给那些可能已经积累了数据,但没有内部技能来利用这些数据的项目。

另一个组织,驱动数据,运行:

“拯救世界的数据科学竞赛”

竞赛内容涵盖从环境保护到改善公共服务的方方面面。如果你想提高你的数据科学技术,同时知道你编码和构建的东西可能会改变某人的生活,无论你在哪里,都有办法做到这一点。

随着越来越多的组织继续开发新的数据科学工具作为产品,并将数据科学驱动的流程应用于其业务流程的其他方面,数据驱动的方法可能会在所有行业变得越来越普遍。随着这种扩张推动数据科学资源的增加,组织所有领域的个人都找到了利用这些资源的方法,数据科学的应用无疑将在慈善事业、筹款和发展中得到体现。

我能做些什么让世界变得更美好?

在我看来,探戈需要两个人。需要有一个数据科学家愿意回馈社会,也需要有一个组织愿意让他们这样做。

对于数据科学家来说——特别是如果你处于职业生涯的早期阶段,希望在更多的项目中获得更多的经验——找到一些慈善组织,他们的事业对你有吸引力,并与他们联系。你可能不想承诺这个世界,但是看看他们是否愿意进行第一次对话;让双方都思考并对合作感到兴奋。

对于组织来说,让他们容易。是的,你可能会对让人们泄露你的数据有所保留,但字段通常可以从数据库或匿名或聚合的个人身份信息中删除。如果你想成为一个数据驱动的组织,或者至少尝试一下,第一步是建立一种文化,允许你考虑成为数据驱动的组织;如果没有人看到其中的潜在价值,那么这位数据科学家的电子邮件就不太可能得到积极的回复。

有很多优秀的数据科学家想要回馈社会,也有很多人在努力让世界变得更美好。让我们看看是否能把更多的人聚集在一起,加速这个过程。

数据科学学院 101:来自街头从业者的西北大学数据科学硕士项目回顾

原文:https://towardsdatascience.com/data-science-school-101-review-of-northwestern-masters-in-data-science-program-from-a-street-2d192f9ee9bc?source=collection_archive---------10-----------------------

“你知道你已经有硕士学位了吗?”—我的妻子,博士

35 岁返校?

坦白地说,在我妻子开始做生意让她晚上忙起来后,我决定重返校园攻读第二个硕士学位。我坐在沙发上,我的妻子,一个崭露头角的摄影师,在办公室学习 Lightroom,网飞流视频不是一件事。大多数晚上我都有点无聊地坐在沙发上。

我的一个同事正在参加西北大学预测分析硕士项目,他向我施压,让我考虑这个项目,因为他知道我与 R 和几个 Coursera 课程的新恋情。在办公室,我负责为 OTC 能源资产定价的团队,我正在探索 R 或 Python 如何成为更有用的工具,以取代传统的基于 Quant 的语言,如 Matlab、VBA 或 C++。我还在研究一些机器学习模型如何具有相当强的预测场外能源市场行为的能力。

虽然我已经有了统计学、定量金融和数据建模的实践背景,但我认为西北大学的项目将有助于充实我的知识,让我有更深的理解,并最终提供更广泛的信息。2012 年,我启动了预测分析项目,最终演变成了他们的数据科学项目。如果你正在考虑在任何学校开设这样的课程,这篇文章就是为你准备的!

项目概述和成功之道

西北大学的项目在他们的网站上已经非常清楚地展示出来了,所以我不需要重复你在那里能读到的一切。总结一下就行;期望参加大约 10 门真正的分析型课程(例如,数学、编码、分析、数据可视化和数据库的一些变体)、简单的项目管理或领导力课程,以及论文或顶点项目课程。总共 12 门课程是你的目标;理想情况下,大约三年后,或者如果你是我,五年后,因为你需要休息,而且不时会有重要的工作项目出现。

所有的课程都遵循一个标准模式;每周一次视频/网络分享会议,如果你抽不出时间,就录制下来,并就本周的一些关键概念展开讨论。大多数课程每隔几周都会有重要的作业或测试。总的来说,教授们保持前进的步伐,所以在一个主题或概念上落后可能是危险的。课堂上的所有参与都利用了“Canvas ”,这是一个相当好的在线教育和协作平台,比我记得的 15 年前我的前任老师的旧黑板系统好得多。所有工作要么在 Canvas 中完成,如案例讨论和测试(测验),要么在提交论文或代码时直接在 Canvas 中上传。与教授的所有互动和你的成绩都在画布上,这也便于查看你做得好或不好。Canvas 展示了每个特定周的可交付成果,如阅读作业、特定论文、测试和教授发布的其他信息。

每门课成功的关键。进入处理每周任务的流程。对我来说,最简单的方法是从周日晚上开始,了解下一周的周日应该做什么。我通常会尝试在周日和周一晚上做一周的阅读作业,在周三参与论坛主题的讨论,并开始任何重要的作业。周四是我完成那周或长期项目 90%重要任务的夜晚。星期五喝酒是为了一杯苏格兰威士忌——或者三杯——和妻子一起看电影(总是要为妻子留出时间!)周六的几个小时将完成那周的所有工作。描述的是我作为一个专业人士、丈夫和两个孩子的父亲的流程,晚上 8 点以后是我完成作业的唯一时间。这种方法效果很好,通常意味着从周日到周四,我每晚至少花一个小时,周六晚上还要做一点工作。一些班级要求更多,但不超过两倍,并为短期突发。

虽然这一切听起来很好,也很简单,但考虑到该计划的在线和自定进度方法,不落后是非常重要的。会有这样的几周,但不要指望一周就能过去,除非你知道下周你会加倍努力。此外,对于我们这些已经拥有高级学位或抢手技能的优秀专业人士来说,视角可能是一件非常强大的事情。正如我的妻子,一位发展心理学博士所说:

有时你需要抄近路或者不做你想要的事情,这是可以的——有时。从来没有人问过我以前学位的平均绩点是多少,我相信没有人会在意我在西北大学的 3.8 分。

职业生涯中期专业人士的价值

20 年前上大学时,我在我妈妈的办公室实习,她是一个政府资助的职业培训主任的秘书。虽然办公室里可能有 15 个人,但只有两个人使用 Excel,第三个人是我。我对执行各种分析任务和预算自动化工作的办公室立即产生了价值。一晃 20 年过去了,我已经雇佣了超过 25 名实习生,他们每个人都知道 Excel,因为它现在是任何进入任何行业的人的必备技能。一个新的趋势也正在发生,我现在发现来自各种大学的各种本科项目的实习生都有 Python、R 和 Tableau 方面的经验,无论是通过课程学习还是独立学习。

The expected commodity skill of Excel will be replaced by Python, R, or other analytical programming skills in the next decade, will you be able to compete?

以上未来派的说法,我不是随便说的。大数据管理、分析和机器学习的当前趋势正在推动所有知识工作者在这种背景下具备基本能力。这意味着当前利用基于 Excel 的范例的分析师、经理和领导者将需要成长和学习新的技能来竞争。如果你认为自己是一名专业人士,希望成为自己公司的领导者或开创自己的公司,那么你很可能需要具备从西北大学这样的项目中学到的技能的分析师。你也可能需要用这些技能来管理员工;有什么比有能力做他们正在做的工作更有效的领导呢?能够质疑团队工作、概述方法、期望,并最终能够将分析表述为你理解的东西的领导者,作为一名领导者,将是所有未来领导者的期望。

这一切对你来说意味着什么?该计划将让你接触到各种用于操作、构建和生成机器学习模型的编程语言,大部分是用 R 和 Python 完成的,带有一点 SAS(针对那些在政府工作的人或大量投资于 SAS 的公司)。你将深入研究从传统回归到神经网络的各种机器学习方法/技术。最后,您将探索解释模型结果的最佳实践。您还将能够研究围绕数据库、整理数据和数据可视化方法的各种主题。这个项目最活跃的部分是“结果解释”,其中大部分作业都需要大量的工作来解释模型的方法,解释模型的含义,最重要的是,解释模型的局限性。我发现这是这个项目中最重要的技能。能够批判性地理解模型的应用并通过这样的镜头理解结果有助于确保我不会发现自己站在一个坏模型的错误一边。由于人们想要证明自己,证明数据科学“事物”,被激励只获得成功,因此有许多糟糕的模型在流传,这导致领导者可能会忽视这样一个事实,即糟糕模型的业务决策比没有模型更糟糕。

再来一次?

我的妻子现在让艾伦忙起来,以确保我不会再做出另一个多年的承诺!她支持我重返校园,并理解鉴于她在统计和分析方面的背景,该项目的价值,但她也提供了强有力的观点,即 15 年来没有人问过我的 GPA。在这个节骨眼上,考虑到这个领域在过去五年中的发展,我会怀着更强烈的愿望再次参加这个项目。它给我在 CME 集团(cmegroup.com)(一家大型衍生品交易所)担任数据产品经理的职业生涯带来的价值和可信度是无与伦比的。我发现我的产品设计和产品创造的方法集中在如何从客户互动中获得数据,从而在未来创造更好的产品。建模客户需求、定价方案和费用影响都可以基于其他内部数据集进行建模。最终,这个项目的影响创造了一个产品经理 3.0 版本的我,在我的工作中融合了产品管理和数据科学的学科。如果你是一名传统的分析师、产品经理、项目经理,或者是任何数据驱动领域的领导者,希望并有能力学习编程、统计和可视化,那么这个项目是你职业发展的基础。

你有什么想法或问题吗?

你做过节目,刚开始,还是有疑问?欢迎在下面提问,我会给你我的观点,或者其他人也会加入进来。

数据科学简化版第 3 部分:假设检验

原文:https://towardsdatascience.com/data-science-simplified-hypothesis-testing-56e180ef2f71?source=collection_archive---------1-----------------------

著名的匈牙利裔美国物理学家爱德华·泰勒曾经说过:

“事实是每个人都相信的简单陈述。它是无辜的,除非被判有罪。假设是没有人愿意相信的新奇建议。它是有罪的,直到发现有效。”

假设检验的应用在数据科学中占主导地位。对其进行简化和解构势在必行。就像犯罪小说故事一样,基于数据的假设检验将我们从一个小说建议引向一个有效命题。

概念

假说源于希腊文作品琥珀(下)和论文(放置)。这意味着一个想法来自有限的证据。这是进一步调查的起点。

这个概念简单而有力。我们每天都直觉地进行假设检验。这是一个 7 步流程:

  1. 做出假设。
  2. 采取初始位置。
  3. 确定备用位置。
  4. 设定验收标准
  5. 进行基于事实的测试。
  6. 评估结果。评估是否支持最初的立场?我们有信心这个结果不是偶然的吗?
  7. 得出以下结论之一:拒绝原来的立场,赞成替代立场或不拒绝最初的立场。

过程

让我用一个故事来解释假设检验的概念。霍尔马维克是冰岛西部的一个小镇。这个小镇有它的独特之处。它以巫术博物馆而闻名。

即使是现在,西峡湾还有人自称是巫师。埃西铎和甘道夫就是这样的人。埃西铎和甘道夫自称是巫师。他们自称是千里眼。一位统计学家想要证明或否定这种说法。他们玩 千里眼纸牌游戏

游戏规则如下:

  • 埃西铎和甘道夫看到了从一套扑克牌中随机选择的十张牌的反面,并被问及四张中哪一张适合它。
  • 他们必须识别卡片所属的花色。
  • 对他们中的每一个重复该测试十次。

还确定对于一个正常人来说,预测正确的平均次数在 6 次左右。这是我们进行假设检验的基础。我们将从统计学上确定他们是否是巫师。

第一步:做出假设

不同种类的假设检验做出不同的假设。假设与数据分布、采样和线性度有关。一些常见的假设是:

  • 分布:数据遵循特定的分布。理解数据的基本模式。许多自然发生的数据点的分布,如股票市场数据、人的体重和身高、在酒吧喝酒的人的工资等。,可以用正态分布来近似。正态分布简单来说就是大量的观测值在中间。少数观察值大于或小于中间值。中间值也被称为中值
  • 抽样:假设为测试抽样的数据是随机选择的。没有偏见。

对于千里眼纸牌游戏,以下假设是正确的:

  • 在千里眼纸牌游戏中,所选纸牌的分布将是正态分布的。这是真的,因为卡是随机选择的。随机选择卡片意味着十张卡片中的每一张都有相等的概率被选中参加测试。
  • 有问题的卡片没有偏见。

第二步:零假设

零假设是初始位置。这是现状。是被拒绝或者拒绝失败的立场。这是一个需要验证的位置。才是需要考验的岗位。

对于千里眼纸牌游戏,无效假设如下:

  • H0:埃西铎/甘道夫不是先知。

他只是在猜测。他很幸运。

第三步:替代假设

替代假设是与零假设相反的立场。如果有统计学上显著的证据表明替代假设是有效的,那么无效假设被拒绝。

对于透视纸牌游戏,另一个假设如下:

  • 哈:埃西铎/甘道夫是一个先知。

步骤 4:设定验收标准

定义了无效假设和交替假设。现状是无效的假设。现在,需要设定一个阈值。我们知道一个普通人,即不是巫师的人,10 次中有 6 次是正确的。如果埃西铎和甘道夫能够在一次测试中预测出超过六张正确的卡片,那么就有更多的证据表明他们可能确实是巫师。一个称为 t-statistics 的指标计算估计值与假设值的差距。高 t 统计量使得替代假设看起来越来越可信。

假设检验结果可能出错。有四种可能的情况:

  1. 测试发现埃西铎/甘道夫是一个千里眼。他是一个千里眼。
  2. 测试发现埃西铎/甘道夫不是千里眼。他不是千里眼。
  3. 测试发现埃西铎/甘道夫是一个千里眼。他不是千里眼。
  4. 测试发现埃西铎/甘道夫不是千里眼。他是一个千里眼。

测试击中了靶心,结果 1 和 2 是正确的。结果 3 和 4 的测试失败了。

  • 当零假设为真时,结果 3 拒绝零假设。这是一个误报。该误差也被称为I 型误差。
  • 当零假设为假时,结果 3 接受零假设。这是一个的假阴性。该误差也称为第二类误差。

像所有的统计检验一样,假设检验必须处理不确定性。它必须考虑概率。没有绝对。

需要设定一个概率水平,以便确定 I 类错误发生的可能性。这个水平被称为显著性水平alpha (α) 表示它。较低的α意味着测试非常严格。相对较高的α意味着测试没有那么严格。α的值是根据假设检验的性质设定的。典型值为 0.001、0.05 或 0.1

如果观察到的值仅仅是偶然的呢?如果只是巧合呢?如果他们只是在测试进行的当天运气好呢?这种不确定性需要缓解。假设检验有一个度量标准来处理这种不确定性。 p 值是度量。

p 值表示为概率。这意味着它的值介于 0 和 1 之间。p 值是在假设零假设为真的情况下偶然观察到的 t 统计的概率。

对于千里眼纸牌游戏来说,如果埃西铎能猜对 8 张以上的牌,那么另一个假设是合理的。他可能确实是一个千里眼。t 统计量为 8。

成为透视者不会有生命危险。没有人有危险。显著性水平设定为 0.05。α为 0.05。

第五步:进行测试

动作发生了。统计学家测试埃西铎和甘道夫的超视力。卡片显示出来了。预言已经做出。注意到了结果。该过程重复十次。统计引擎在收集的数据上运行。结果如下:

埃西铎:

  • t 统计:8
  • p 值:0.1

-甘道夫:

  • t 统计:9
  • p 值:0.01

第六步:评估结果

概率(p 值)和显著性水平之间的比较产生以下结果:

对于埃西铎:

  • t 统计量是 8。这意味着,平均来说,他已经正确预测了八张牌。这比正常人所能预测的要高。
  • p 值为 0.1。这意味着观察到的 t-统计量是偶然的概率是 10%。p 值很高。
  • 设定的显著性水平(α)为 0.05。翻译过来就是 5%。
  • p 值大于设定的显著性水平,即 10% > 5%。

对甘道夫来说:

  • t 统计量是 9。这意味着,平均来说,他已经正确预测了九张牌。这比正常人所能预测的要高。
  • p 值为 0.01。这意味着观察到的 t-统计量是偶然的概率只有 1%。
  • 设定的显著性水平(α)为 0.05。翻译过来就是 5%。
  • p 值低于设定的显著性水平,即 1% < 5%.

Step 7: Conclude

The tests have ended. The metrics are known. Who is the real wizard?

对于埃西铎:p 值大于设定的显著性水平(10% > 5%)。即使平均来说,他已经正确预测了八张牌;从统计学上看,结论如下:

  • 埃西铎的结论:没有实质证据反对零假设。零假设未能被拒绝。

对于甘道夫:平均来说,他已经正确预测了九张牌。p 值低于设定的显著性水平(1% < 5%)。

  • 甘道夫的结论:有充分的证据反对无效假设。无效假设被拒绝。接受替代假设。

埃西铎崩溃了。甘道夫得意洋洋。然而,埃西铎可能会感到安慰,因为没有证明他不是一个千里眼。零假设未能被拒绝。这并不意味着交替假设不成立。这只是意味着没有足够的证据来拒绝零假设。埃西铎普遍维持现状。

结论

没有必要进行假设检验来找出埃西铎和甘道夫中谁是巫师。我们都知道甘道夫是巫师。

假设检验是机器学习的基础概念之一。许多评估方法使用假设检验来评估模型的稳健性。在本系列中,我们将进一步深入它的构造。

数据科学简化第 2 部分:统计学习的关键概念

原文:https://towardsdatascience.com/data-science-simplified-key-concepts-of-statistical-learning-45648049709e?source=collection_archive---------2-----------------------

在本系列的第一篇文章中,我已经谈到了数据科学的关键概念和过程。在这篇文章中,我将深入探讨一下。首先,我将定义什么是统计学习。然后,我们将深入研究统计学习中的关键概念。相信我;很简单。

什么是统计学习?

根据维基百科,统计学习理论是从统计学和功能分析领域汲取的机器学习框架。

机器学习是通过软件应用实现的统计学习技术的一种表现形式。

这在实践中意味着什么?统计学习指的是使我们能够更好地理解数据的工具和技术。让我们回到这里。我们理解数据是什么意思?

在统计学习的背景下,有两种类型的数据:

  1. 可以直接控制的数据,又称独立变量。
  2. 不能直接控制的数据,也称为因变量。

无法控制的数据,即需要预测或估计的因变量。

更好地理解数据是从自变量的角度更好地了解因变量。让我用一个例子来说明:

假设我想根据分配给电视、广播和印刷品的广告预算来衡量销售额。我可以控制预算,我可以分配给电视,广播和印刷。我不能控制的是它们将如何影响销售。我想把我不能控制的数据(销售额)表达成我能控制的数据(广告预算)的函数。我想揭开这种隐藏的关系。

统计学习揭示隐藏的数据关系。非独立数据和独立数据之间的关系。

参数和模型

运营管理中一个著名的商业模式是 ITO 模式。代表输入-转换-输出模型。很简单。有输入。这些输入经历一些转换。产生一个输出。

统计学习也应用类似的概念。有输入数据。输入数据被转换。需要预测或估计的输出就产生了。

转换引擎被称为模型。这些是估计输出的函数。

这种转换是数学上的。数学成分被添加到输入数据中以估计输出。这些成分被称为参数。

让我们看一个例子:

是什么决定了一个人的收入?说收入是由一个人一年的教育和多年的经验决定的。估计收入的模型可以是这样的:

收入= c + β0 x 学历+ β1 x 经验

β0 和β1 是将收入表示为教育和经验的函数的参数。

学历和经历是可控变量。这些可控变量有不同的同义词。它们被称为独立变量。它们也被称为特征

收入是不可控的变量。他们被称为目标

培训和测试

当我们必须准备考试的时候,我们做什么?学习。学习。喝点酒。记笔记。练习模拟试卷。这些是学习的工具,也是为未知的考验做准备的工具。

机器学习也使用类似的概念进行学习。数据是有限的。现有数据需要谨慎使用。建立的模型需要验证。验证它的方法如下:

  • 将数据分成两部分。
  • 用一部分进行训练。让模型从中学习。让模型看到数据。这个数据集被称为训练数据。
  • 使用另一部分测试模型。用看不见的数据对模型进行“测试”。这个数据集被称为测试数据。

在竞争性考试中,如果准备充分,如果学习扎实,那么在考试中的表现也会令人满意。同样,在机器学习中,如果模型从训练数据中学习得很好,它将在测试数据中表现良好。

类似地,在机器学习中,一旦在测试数据集上测试了模型,就评估了模型的性能。根据估计的输出与实际值的接近程度进行评估。

方差和偏差

英国著名统计学家乔治·博克斯曾经引用过:

“所有型号都是错的;有些是有用的。”

没有模型是 100%准确的。所有模型都有误差。这些误差有两个来源:

  • 偏见
  • 差异

让我尝试用一个类比来解释这一点。

Raj,一个七岁的孩子,刚刚开始学习乘法的概念。他已经掌握了表 1 和表 2。他的下一个挑战是学习三表。他非常兴奋,开始练习 3 的乘法表。他的桌子是这样的:

  • 3 x 1 = 4
  • 3 x 2 = 7
  • 3 x 3 = 10
  • 3 x 4 = 13
  • 3 x 5 = 16

拉吉的同学鲍勃也在同一条船上。他的桌子看起来像这样:

  • 3 x 1 = 5
  • 3 x 2 = 9
  • 3 x 3 = 18
  • 3 x 4 = 24
  • 3 x 5 = 30

让我们从机器学习的角度来研究 Bob 和 Raj 创建的乘法模型。

  • 拉吉的模型有一个无效的假设。它假设乘法运算意味着在结果后加一。这个假设引入了偏差误差。假设是一致的,即输出加 1。这意味着拉吉的模型有一个低偏差。
  • Raj 的模型得出的结果总是与实际相差 1 个数字。这意味着他的模型有一个低方差。
  • 鲍勃的模型的输出到处都是。他的模型输出与实际值相差很大。偏离没有一致的模式。Bob 的模型有高偏差高变化。

上面的例子是对方差和偏差这一重要概念的粗略解释。

  • 偏差是模型由于没有考虑数据中的所有信息而不断学习错误的东西的倾向。
  • 方差是模型获取随机事物的趋势,与真实信号无关。

偏差-方差权衡

我有一个学校的朋友,他是一个很棒的学生。他的数学相对较差。他过去学习数学的方法是死记硬背。他学会并记住了数学问题。他能很好地“背诵”它们。

挑战如下:考试问题与他记忆的问题不同。这些问题是数学概念的一般应用。显然,他很难通过考试。

机器学习问题遵循同样的模式。如果模型学习了太多关于特定数据集的知识,并试图将相同的模型应用于看不见的数据,它将具有很高的误差。从给定的数据集中学习太多被称为过拟合。它还没有推广对看不见的数据有效应用的学习。另一方面,学习太少会导致不适应。模型太差了,甚至无法从给定的数据中学习。

阿尔伯特·爱因斯坦简洁地总结了这个概念。他说:

“一切都应该尽可能简单,但不能再简单了。”

机器学习问题中的一个持续努力是取得正确的平衡。创建一个不太复杂也不太简单的模型。创建一个通用模型。创建一个相对不准确但有用的模型。

  • 过度拟合的模型是复杂的。它在训练数据上表现非常好。它在测试数据上表现不佳。
  • 一个低于的模型太简单了。它不会对训练和测试数据都执行 will。
  • 一个好的模型能平衡欠拟合和过拟合。它概括得很好。这是尽可能简单,但不简单。

这种平衡行为被称为偏差-方差权衡。

结论

统计学习是复杂机器学习应用的构建模块。这篇文章介绍了统计学习的一些基本概念。这篇文章的 5 大要点是:

  1. 统计学习揭示隐藏的数据关系。非独立数据和独立数据之间的关系。
  2. 模式是变革的引擎。参数是实现转换的要素。
  3. 模型使用训练数据进行学习。模型使用测试数据进行评估。
  4. 所有型号都是错的;有些是有用的。
  5. 偏差-方差权衡是一种平衡行为。平衡以找到最佳模式。找到最佳平衡点。

我们将在本系列的后续文章中更深入地研究机器学习模型的细节。

数据科学简化版第 10 部分:分类模型介绍

原文:https://towardsdatascience.com/data-science-simplified-part-10-an-introduction-to-classification-models-82490f6c171f?source=collection_archive---------1-----------------------

韦伯斯特对分类的定义如下:

根据已建立的标准在组或类别中的系统安排。

周围的世界充满了量词。分类器有助于防止垃圾邮件。分类器有助于识别可能流失的客户。分类器有助于预测是否会下雨。这种监督学习方法在商业应用中无处不在。我们认为这是理所当然的。

在这篇博文中,我将讨论分类模型的关键概念。

分类类别

回归模型估计数值变量,也称为因变量。对于回归模型,目标总是一个数字。分类模型有一个定性目标。这些目标也称为类别。

在大量的分类问题中,目标被设计成二元的。二进制意味着目标将只取一个 0 或1值。这些类型的分类器被称为二元分类器。让我们举个例子来理解这一点。

回归模型估计数值变量,也称为因变量。对于回归模型,目标总是一个数字。分类模型有一个定性目标。这些目标也称为类别。

在大量的分类问题中,目标被设计成二元的。二进制意味着目标将只接受 0 或 1 值。这些类型的分类器被称为二元分类器。让我们举个例子来理解这一点。一家银行的贷款审批部门希望使用机器学习来识别潜在的贷款违约者。在这种情况下,机器学习模型将是一个分类模型。根据模型从输入的数据中获得的信息,它会将贷款申请人分为两类:

  • 第一桶:潜在违约者。
  • 第二桶:潜在的非违约者。

在这种情况下,目标将是一个类似于“ will_default_flag”的属性。 “这个目标将适用于每一个贷款申请人。它的值为 0 或 1。如果模型预测为 1,则意味着申请人很可能违约。如果模型预测它为 0,这意味着申请人可能不会违约。一些分类器还可以将输入分类到许多桶中。这些分类器被称为多类分类器。

线性和非线性分类器

假设我们想要建立一个分类器,对潜在的贷款违约者进行分类。收入和信用评级的特征决定了潜在的违约者。

上图描述了这个场景。为了简单起见,让我们说特征空间是收入和信用评级的交集。绿点表示未违约,粉点表示违约。分类器基于数据的输入特征(收入和信用评级)进行学习。分类器创建一条线。这条线将特征空间分成两部分。分类器创建一个模型,以下列方式对数据进行分类:

  • 任何落在线左侧的人都是潜在的违约者。
  • 任何落在线左侧的人都是潜在的非违约者。

分类器可以用一条线分割特征空间。这种分类器称为线性分类器。

在这个例子中,只有两个特征。如果有三个特征,分类器将适合将平面分成两部分的平面。如果有三个以上的特征,分类器创建一个超平面。

这是一个过于简单的场景。一条线或一个平面可以将数据点分成两个桶。如果数据点以下列方式分布会怎样:

在这里,线性分类器无法施展它的魔法。分类器需要绘制一条曲线来区分违约者和非违约者。这种分类器被称为非线性分类器。

有很多算法可以用来创建分类模型。像逻辑回归这样的算法是很好的线性分类器。其他如神经网络是良好的非线性分类器。

分类器的直觉如下:

用函数(线性或非线性)划分特征空间。对其进行划分,使特征空间的一部分包含来自一个类的数据。特征空间的另一部分具有来自其他类别的数据

我们对分类器如何工作有一种直觉。我们如何衡量一个分类器做得好不好?这里出现了的概念混乱矩阵。

让我们举个例子来理解这个概念。我们建立了一个贷款违约分类器。这个分类器接受输入数据,对其进行训练,然后是它学习的内容。

  • 分类器将 35 名申请人归类为违约者。
  • 分类器将 65 名申请人归类为非违约者。

基于分类器执行的方式,又导出了四个度量:

  1. 在那些被归类为违约者 的 中,只有 12 人是实际违约者。这个度量被称为真阳性(TP)。****
  2. 在被归类为违约者 的 中,有 23 人实际上没有违约。这个指标被称为假阳性(FP)。****
  3. 在那些被归类为非违约者 的 中,只有 57 人是真正的非违约者。这个度量被称为真负值(TN)。****
  4. 在被归类为非违约者的中,有 8 人是实际违约者。这个指标被称为假阴性(FN)。

这四个指标可以列表成一个矩阵,称为 混淆矩阵。

从这四个度量中,我们将为分类器导出评估度量。让我们来讨论这些评估指标。

精确度:

准确性衡量分类器对真阳性和真阴性情况的正确率。数学上,它被定义为:

准确率=(真阳性+真阴性)/总预测。

在这个例子中,贷款违约分类器的精度是:(12+57) / 100 = 0.69 = 69%。

敏感性或回忆:

回忆测量分类器获得正确真值的次数。数学上,它被定义为:

召回=真阳性/(真阳性+假阴性)

在示例中,贷款违约分类器的召回率是:12/(12+8) = 0.60 = 60%。

特异性:

特异性衡量分类器获得正确否定的次数。数学上,它被定义为:

特异性=(真阴性)/(真阴性+假阳性)

在示例中,贷款违约分类器的特异性为:57/(57+23) = 0.7125 = 71.25%。

精度:

精度衡量预测为正的总数中实际为正的有多少。数学上,它被定义为:

精度=(真阳性)/(真阳性+假阳性)

在这个例子中,贷款违约分类器的精度是:12/(12+23) = 0.48 = 48%。

这些是很多指标。我们应该依赖哪些指标?这个问题在很大程度上取决于业务环境。在任何情况下,一个单独的度量标准都不能给出分类器有多好的全貌。让我们举一个例子。

我们建立了一个识别欺诈交易的分类器。该分类器确定交易是否真实。历史模式显示,每 100 笔交易中就有两笔欺诈交易。我们构建的分类器具有以下混淆矩阵。

  • 准确率为 98%
  • 召回率是 100%
  • 精确度为 98%
  • 特异性为 0%

如果这种模型是基于准确性、召回率和精确度的标准来部署的,那么公司肯定会完蛋。虽然这个模型表现很好,但事实上,它是一个愚蠢的模型。它没有做它应该做的事情,即标记欺诈交易。这个模型最重要的指标是特异性。其特异性为 0%。

因为不能依赖单一的度量来评估分类器,所以创建了更复杂的度量。这些复杂的指标是上述所有指标的组合。这里解释几个关键的。

F1 分数:

F1 分数是精确度和召回率之间的调和平均值。常规平均值平等对待所有值。调和平均值对较低值给予更大的权重。因此,只有在召回率和精确度都很高的情况下,分类器才会得到高的 F1 分数。它被定义为:

F1 = 2x(精度 x 召回)/(精度+召回)

受试者工作特征(ROC)和曲线下面积(AUC):

接收机工作特性又名 ROC 是一个视觉指标。这是一个二维的情节。它在 X 轴上具有假阳性率或 1-特异性,在 Y 轴上具有真阳性率或灵敏度。

在 ROC 图中,有一条线测量一个 随机分类器 将如何预测 TPR 和 FPR。它是直的,因为它有相等的概率预测 0 或 1。

如果一个分类器做得更好,那么与 FPR 相比,它应该具有更大比例的 TPR。这将把曲线推向西北方向。

曲线下面积(AUC)是 ROC 曲线的面积。如果 AUC 是 1,即 100%,这意味着它是一个完美的分类器。如果 AUC 是 0.5,即 50%,这意味着分类器不比掷硬币好。

有很多评估指标来测试一个分类器。分类器需要根据业务环境进行评估。需要根据上下文选择正确的指标。没有一个神奇的标准。

结论

在这篇文章中,我们已经看到了分类器的基础知识。分类器在数据科学中无处不在。有许多实现分类器的算法。各有各的优缺点。我们将在本系列的后续文章中讨论一些算法。

原载于 2017 年 9 月 18 日datascientia . blog

数据科学简化版第 11 部分:逻辑回归

原文:https://towardsdatascience.com/data-science-simplified-part-11-logistic-regression-5ae8d994bf0e?source=collection_archive---------4-----------------------

在本系列的最后一篇博文中,我们讨论了分类器。讨论了分类器的类别以及如何对它们进行评估。我们还深入讨论了回归模型。在这篇文章中,我们将深入探讨回归模型如何用于分类任务。

Logistic 回归 是一种广泛用于分类任务的回归模型。像往常一样,我们将通过例子来讨论。

没有一家货币银行向我们提出问题。该银行希望建立一个模型,预测他们的哪些客户会拖欠贷款。提供的数据集如下:

有助于我们构建模型的功能包括:

  • 客户 Id:唯一的客户标识
  • 信用评分:介于 0 和 800 之间的数值,表示借款人信用历史的风险。
  • 贷款金额:这是完全还清的贷款金额或违约金额。
  • 当前工作年限:一个分类变量,表示客户在当前工作中已经工作了多少年。
  • 信用记录年数:自客户信用记录第一次录入以来的年数
  • 月债务:客户现有贷款的月付款额
  • 信用问题的数量:客户记录中信用问题的数量。
  • IsDefault:这是目标。如果客户违约,那么它将 1 否则它 0。

这是一个分类问题。

逻辑回归是回归模型的化身。它将回归模型转换为分类器。让我们首先理解为什么普通回归模型不能作为分类器。

默认情况下,目标值为 0 或 1。我们可以把它重新定义为一种概率。重新架构如下:

  • 如果违约概率> = 0.5,则客户将违约,即 IsDefault = 1
  • 如果违约概率< 0.5 then the customer will not default i.e. IsDefault = 0

Recall our discussion on Linear Regression Model. In the regression model, we had defined an dependent variable y 是自变量的函数。为了简单起见,让我们假设我们只有一个自变量 x 。等式变成了。

y = β0 + β1.x

  • β0 是截距。
  • β1 是 x 的系数。

在贷款违约模型的例子中,Tim 使用信用评分作为自变量。因变量(y)是客户违约概率的估计值,即 P(违约)

该等式可以写成:

p(违约)= β0 + β1 .信用评分

Tim 在统计软件包上运行回归模型。统计软件包为β0 和β1 提供了以下系数:

  • β0 = 0.73257
  • β1 = -9.9238e-05

估计违约概率的等式现在变成了:

p(默认值)= 0.73257 + -9.9238e-05。信用评分

如果某人有很高的信用评分,比如 8000,那么他会不会违约?让我们引入一些值并检查一下。

0.73257+-9.9238 e-05 x 8000 =-0.06134。

如果我们用信用评分和回归线绘制 p(违约),我们会得到以下曲线:

传统回归模型面临挑战。数字-0.06334,一个负概率,没有意义。从图表中也可以明显看出。对于信用分高的,概率小于零。概率需要介于 0 和 1 之间。

怎么做才能把等式转换成概率总是在 0 和 1 之间?

这就是 T2 乙状结肠 T3 的用武之地。

sigmoid 或逻辑 函数是具有特征“S”形曲线或 sigmoid 曲线的数学函数。数学上,它定义如下:

sigmoid = ey/(1+ey)

乙状结肠的形状如下:

它转换 0 和 1 之间的所有值。假设我们有一组从-5 到 10 的数字。当使用 sigmoid 函数对这组数字进行变换时,所有值都在 0 和 1 之间。

这变得有趣了。使用 sigmoid,任何数字都可以转换成等价的概率分数。

既然我们有了将目标转化为概率的方法,让我们看看它是如何工作的。使用 sigmoid 函数转换后的回归方程如下:

y = β0 + β1 .信用评分

p(默认值)= ey/(1 + ey)

p(默认值)= sigmoid(y)

让我们来看看当信用评级较高(即 8000)时,sigmoid 模型的表现如何

y = 0.73257+-9.9238 e-05 x 8000 =-0.06134。

p(默认值)= sigmoid(y)= sigmoid(-0.06134)= 0.4846

p(默认值)= 48.46% => IsDefault = 0

可以通过添加更多的变量来增强逻辑回归模型。我们需要做的就是把简单的线性回归模型提升为多元回归模型方程。这种模型的一个例子如下:

y2 = β0 + β1 .信用评分+ β2。贷款金额+ β3。信用问题数+ β4。月负债+ β5。自上次拖欠后的月数+ β6。信用卡数量

p(默认)= sigmoid(y2)

让我们试着用这个模型来预测潜在的违约者。贷款数据集按 80:20 的比例分为训练集和测试集(80%训练,20%测试)。

回想一下,有许多度量来评估分类器。我们将使用 AUC 作为模型评估的指标。让我们看看新型号的性能如何。机器学习程序用于评估测试数据上的模型性能。

新型号性能不太好。测试数据的 AUC 分数约为 60%。

我们现在了解逻辑回归模型的工作原理。我们现在知道它是如何构建分类器的。分类器的 AUC 分数不好。我们需要寻找更好的模型。在本系列的下一篇文章中,我们将研究交叉验证。

原载于 2017 年 10 月 2 日datascientia . blog

数据科学简化第 5 部分:多元回归模型

原文:https://towardsdatascience.com/data-science-simplified-part-5-multivariate-regression-models-7684b0489015?source=collection_archive---------1-----------------------

在这个系列的上一篇文章中,我们讨论了费尔南多的故事。一个想买车的数据科学家。他使用简单的线性回归模型来估计汽车的价格。

Fernando 创建的回归模型根据发动机尺寸预测价格 用一个自变量预测一个因变量。

简单线性回归模型的公式为:

价格= β0 + β1 x 发动机尺寸

统计软件包计算了参数。线性方程估计为:

价格= -6870.1 + 156.9 x 发动机尺寸

该模型从两个方面进行了评估:

  • 鲁棒性——使用假设检验
  • 准确度——使用决定系数,即 R 平方

回想一下,度量 R 平方解释了模型预测值与实际值的平均值之间的方差分数。该值介于 0 和 1 之间。它越高,模型就越能解释方差。Fernando 创建的模型的 R 平方是 0.7503,即训练集的 75.03%。这意味着该模型可以解释 75%以上的变异。

然而,费尔南多想让它变得更好。

他沉思道:

  • 如果我能给模型输入更多的信息会怎么样?会提高准确率吗?

Fernando 决定通过向模型提供更多输入数据(即更多独立变量)来增强模型。他现在已经进入了多元回归模型的世界。

概念:

线性回归模型为监督学习提供了一种简单的方法。它们简单而有效。

回想一下,linear 有如下含义:排列成直线或者沿着直线延伸。线性表明因变量和自变量之间的关系可以用直线表示。

这条线的方程是 y = mx + c。一个维度是 y 轴,另一个维度是 x 轴。可以在二维平面上绘制。它看起来像这样:

线的方程是 y = mx + c. 一个维度是 y 轴,另一个维度是 x 轴。可以在二维平面上绘制。它看起来像这样:

这种关系的概括可以表示为:

y = f(x)。

没有任何花哨的意思。它的意思是:

定义 y 为 x 的函数 即定义因变量为自变量的函数。

如果因变量需要用多个自变量来表示呢?广义函数变成:

y = f(x,z) 即把 y 表示成 x 和 z 的某种函数/组合

现在有三维 y 轴,x 轴和 z 轴。它可以绘制为:

现在我们有不止一个维度(x 和 z)。我们有一个额外的维度。我们想把 y 表示成 x 和 z 的组合。

对于一个简单的回归线性模型,一条直线将 y 表示为 x 的函数。现在我们有了一个额外的维度(z)。如果在一条线上增加一个额外的维度会怎么样?它变成了一架飞机。

平面是将 y 表示为 x 和 z 的函数的函数。外推线性回归方程,现在可以表示为:

y = m1.x + m2.z+ c

  • y 是因变量,即需要估计和预测的变量。
  • x 是第一个自变量,即可控变量。这是第一个输入。
  • m1 是 x1 的斜率。它决定了线的角度(x)。
  • z 是第二个自变量,即可控变量。这是第二个输入。
  • m2 是 z 的斜率。它决定了线(z)的角度。
  • c 是截距。当 x 和 z 为 0 时,确定 y 值的常数。

这就是多元线性回归模型的起源。有一个以上的输入变量用于估计目标。具有两个输入变量的模型可以表示为:

y = β0 + β1.x1 + β2.x2

让我们更进一步。如果我们有三个变量作为输入会怎么样?人类的可视化能力在这里是有限的。它只能可视化三维。在机器学习的世界里,可以有很多维度。具有三个输入变量的模型可以表示为:

y = β0 + β1.x1 + β2.x2 + β3.x3

多元回归模型的通用方程可以是:

y = β0 + β1.x1 + β2.x2 +…..+ βn.xn

模型公式:

现在我们已经熟悉了多元线性回归模型的概念,让我们回到费尔南多。

费尔南多向他的朋友寻求更多的数据。他要求他提供更多关于汽车其他特征的数据。

以下是他已经掌握的数据点:

  • 品牌:汽车的品牌。
  • 燃料类型:汽车使用的燃料类型。
  • nDoor:门的数量。
  • 引擎大小:汽车引擎的大小。
  • 价格:汽车的价格。

他获得了额外的数据点。它们是:

  • 马力:汽车的马力。
  • peakRPM:峰值功率输出附近的每分钟转数。
  • 长度:汽车的长度。
  • 宽度:汽车的宽度。
  • 高度:汽车的高度。

Fernando 现在想要建立一个模型,根据额外的数据点预测价格。

他建立的多元回归模型是:

估计价格作为引擎大小、马力、峰值转速、长度、宽度和高度的函数。

= >价格= f(发动机尺寸、马力、峰值转速、长度、宽度、高度)

= >价格= β0 + β1。发动机尺寸+ β2 .马力+ β3。峰值转速+ β4 .长度+ β5 .宽度+ β6 .高度

模型构建:

费尔南多将这些数据输入他的统计包。该包计算参数。输出如下所示:

多元线性回归模型为价格估算提供了以下等式。

**价格= -85090 + 102.85 *发动机尺寸+ 43.79 *马力+ 1.52 *峰值转速- 37.91 *长度+ 908.12 宽度+ 364.33 高度

模型解释:

多元模型的解释提供了每个自变量对因变量(目标)的影响。

记住,这个等式提供了对价格平均值的估计。 每个系数在所有其他预测值保持不变的情况下进行解释。

现在让我们来解释这些系数。

  • 引擎大小:在所有其他预测因素保持不变的情况下,如果引擎大小增加一个单位,平均价格将增加102.85 美元。
  • 马力:在所有其他预测因素保持不变的情况下,如果马力增加一个单位,平均价格将增加43.79 美元。
  • 峰值转速:在所有其他预测因素保持不变的情况下,如果峰值转速增加一个单位,平均价格将增加1.52 美元。
  • 长度:在所有其他预测因素保持不变的情况下,如果长度增加一个单位,平均价格就会减少37.91 美元(长度有一个-ve 系数)。
  • 宽度:在所有其他预测因素保持不变的情况下,如果宽度增加一个单位,平均价格就会增加908.12 美元
  • 身高:在所有其他预测因素保持不变的情况下,如果身高增加一个单位,平均价格就会增加364.33 美元

模型评估

模型已经建立。它被解释了。所有的系数都重要吗?哪些更有意义?这个模型解释了多少变化?

统计包提供了评估模型的指标。现在让我们来评估一下这个模型。

回忆一下关于 t-stat、p 值和决定系数定义的讨论。这些概念也适用于多元回归模型。该模型的评估如下:

  • 系数:所有系数都大于零。这意味着所有的变量都对平均价格有影响。
  • t 值:除了长度,所有系数的 t 值都显著大于零。对于长度,t-stat 是-0.70。这意味着汽车的长度可能不会对平均价格产生影响。
  • p 值:对于除长度以外的所有变量,完全偶然观察到 p 值的概率相当低。长度的 p 值为 0.4854。这意味着观察到的 t-stat 是偶然的概率是 48.54%。这个数字相当高。

回想一下关于 R 平方如何帮助解释模型中的变化的讨论。当更多的变量被添加到模型中时,r 平方不会减小。只会增加。然而,必须有一个平衡。调整后的 R 平方努力保持这种平衡。调整的 R 平方是 R 平方的修改版本,已经针对模型中的预测器数量进行了调整。调整后的 R 平方补偿变量的增加,并且仅在新项增强模型时增加。

  • 调整后的 R 平方:R 平方值为 0.811。这意味着该模型可以解释训练数据中出现的 81.1%的变异。优于上一款(75.03%)。

基于这些评估,Fernando 得出以下结论:

  • 除了汽车的长度之外的所有变量都对价格有影响。
  • 汽车的长度对价格没有显著影响。
  • 该模型解释了 81.1%的数据变化。

结论:

费尔南多现在有了更好的车型。然而,他有些不知所措。他知道汽车的长度不会影响价格。

他想知道:

如何为模型构建选择最佳的变量集?有没有选择最佳变量子集的方法?

在本系列的下一部分,我们将讨论变量选择方法。

数据科学简化第 6 部分:模型选择方法

原文:https://towardsdatascience.com/data-science-simplified-part-6-model-selection-methods-2511cbdf7cb0?source=collection_archive---------6-----------------------

在本系列的上一篇文章中,我们已经讨论了多元线性回归模型。Fernando 创建了一个基于五个输入参数估算汽车价格的模型。

费尔南多确实有一个更好的模型。然而,他想选择最好的输入变量。

本文将详细阐述 的选型方法

概念

模型选择方法的思想是直观的。它回答了以下问题:

如何为最优模型选择正确的输入变量?

最佳模型是如何定义的?

最佳模型是将数据与评估指标的最佳值相匹配的模型。

可以有很多评估指标。 调整后的 r 平方是多元线性回归模型所选择的评价指标。

有三种方法可以选择最佳的变量集。它们是:

  • 最佳子集
  • 向前逐步
  • 向后逐步

让我们深入了解这些方法的内部工作原理。

最佳子集

假设我们有 k 个变量。最佳子集法的过程如下:

  1. 从零模型开始,即没有预测值的模型。让我们称这个模型为 M0。
  2. 找到有 1 个变量的最优模型。这意味着该模型是一个只有一个独立变量的简单回归变量。让我们称这个模型为 M1。
  3. 找到有两个变量的最优模型。这意味着该模型是一个只有两个自变量的回归变量。让我们称这个模型为 M2。
  4. 找出有 3 个变量的最优模型。这意味着该模型是一个只有三个独立变量的回归变量。让我们称这个模型为 M3。
  5. 以此类推……我们得到了钻头。重复这个过程。测试最佳模型的所有预测值组合。

对于 k 个变量,我们需要从以下一组模型中选择最佳模型:

  • M1:单预测器的最优模型。
  • M2:有两个预测因子的最优模型。
  • M3:有 3 个预测因子的最优模型。
  • Mk:具有 k 个预测值的最优模型。

从 M1…Mk 中选择最佳型号,即最适合的型号

最佳子集是一个复杂的过程。它梳理了整个预测列表。它选择可能的最佳组合。然而,它也有自己的挑战。

最佳子集为每个预测值及其组合创建一个模型。这意味着我们正在为每个变量组合创建模型。模型的数量可以是非常大的数量。

如果有 2 个变量,那么就有 4 个可能的模型。如果有 3 个变量,那么就有 8 个可能的模型。一般来说,如果有 p 个变量,那么就有 2^p 可能模型。可供选择的型号很多。假设有 100 个变量(相当常见)。假设有 100 个变量(相当常见)。会有 2^100possible 模特。令人难以置信的数字。

在 Fernando 的情况下,只有 5 个变量,他必须从 2^5models 创建和选择,即 32 个不同的模型。

向前逐步

尽管最佳子集是详尽的,但它需要大量的计算能力。这可能非常耗时。逐步向前尝试减轻痛苦。

假设我们有 k 个变量。向前步进的过程如下:

  1. 从零模型开始,即没有预测值的模型。我们称之为 M0。向模型中添加预测值。一次一个。
  2. 找到有 1 个变量的最优模型。这意味着该模型是一个只有一个独立变量的简单回归变量。我们称这个模型为 M1。
  3. 给 M1 再加一个变量。找出有两个变量的最优模型。请注意,附加变量被添加到 M1。我们称这个模型为 M2。
  4. 给 M2 再加一个变量。找出有 3 个变量的最优模型。请注意,附加变量被添加到 M2。我们称这个模型为 M3。
  5. 等等..我们拿到钻头了。重复此过程,直到 Mk,即只有 k 变量的模型。

对于 k 个变量,我们需要从以下一组模型中选择最佳模型:

  • M1:单预测器的最优模型。
  • M2:有两个预测因子的最优模型。这个模型是 M1 +一个额外的变量。
  • M3:有 3 个预测因子的最优模型。这个模型是 M2 +一个额外的变量。
  • Mk:具有 k 个预测值的最优模型。这个模型是 Mk-1 +一个额外的变量。

再次选择 M1 Mk 中的最佳模型,即具有最佳拟合度的模型

与最佳子集方法相比,向前逐步选择创建更少的模型。如果有 p 个变量,那么将有大约 p(p+1)/2 + 1 个模型可供选择。远低于从最佳子集方法中选择模型。想象有 100 个变量;基于向前逐步方法创建的模型的数量是 100 * 101/2 + 1,即 5051 个模型。

在 Fernando 的案例中,只有 5 个变量,他必须创建 5*6/2 + 1 模型,即 16 种不同的模型,并从中进行选择。

向后逐步

既然我们已经理解了模型选择的向前逐步过程。让我们讨论一下向后的逐步过程。这是向前逐步过程的逆过程。向前逐步从没有变量的模型开始,即零模型。相反,反向逐步从所有变量开始。向后步进的过程如下:

  1. 假设有 k 个预测器。从完整模型开始,即包含所有预测因素的模型。我们称这个模型为 Mk。从完整模型中去除预测因子。一次一个。
  2. 找到 k-1 个变量的最优模型。从 Mk 中移除一个变量。计算所有可能组合的模型性能。选择具有 k-1 个变量的最佳模型。我们称这个型号为 Mk-1。
  3. 找出 k-2 变量的最优模型。从 Mk-1 中删除一个变量。计算所有可能组合的模型性能。选择具有 k-2 个变量的最佳模型。我们称这个型号为 Mk-2。
  4. 等等..我们拿到钻头了。重复这个过程,直到 M1,即只有一个变量的模型。

对于 k 个变量,我们需要从以下一组模型中选择最佳模型:

  • Mk:具有 k 个预测值的最优模型。
  • Mk-1:具有 k — 1 个预测值的最优模型。这个模型就是 Mk——一个附加变量。
  • Mk-2:具有 k — 2 个预测值的最优模型。这个模型是 Mk——两个额外的变量。
  • M1:单预测器的最优模型。

模型结构

既然车型选择的概念已经很清楚了,让我们回到费尔南多身上。回想一下这个系列的上一篇文章。费尔南多有六个变量发动机尺寸、马力、峰值转速、长度、宽度和高度。他想通过创建多元回归模型来估算汽车价格。他想保持平衡,选择最好的模式。

他选择应用向前逐步模型选择方法。统计软件包计算所有可能的模型,并将 M1 输出到 M6。

让我们解释一下输出。

  • 模型 1:它应该只有一个预测器。最佳拟合模型仅使用发动机尺寸作为预测值。调整后的 R 平方为 0.77。
  • 模型 2:它应该只有两个预测器。最佳拟合模型仅使用发动机尺寸和马力作为预测指标。调整后的 R 平方为 0.79。
  • 模型 3:它应该只有三个预测器。最佳拟合模型仅使用发动机尺寸、马力和宽度作为预测值。调整后的 R 平方为 0.82。
  • 模型 4:它应该只有四个预测器。最佳拟合模型仅使用发动机尺寸、马力、宽度和高度作为预测值。调整后的 R 平方为 0.82。
  • 模型 5:它应该只有五个预测器。最佳拟合模型仅使用发动机尺寸、马力、峰值转速、宽度和高度作为预测指标。调整后的 R 平方为 0.82。
  • 模型 6:它应该只有六个预测器。最佳拟合模型仅使用所有六个预测值。调整后的 R 平方为 0.82。

回想一下关于创建最简单而有效的模型的讨论。

所有的模型都应该尽可能的简单,但是不能再简单了

Fernando 选择了性能最佳的最简单型号。在这种情况下,它是模型 3。该模型使用发动机尺寸、马力和宽度作为预测值。该模型能够得到 0.82 的调整后的 R 平方,即该模型可以解释训练数据中 82%的变化。

统计软件包提供以下系数。

估计价格作为引擎大小,马力和宽度的函数。

价格= -55089.98 + 87.34 发动机尺寸+ 60.93 马力+ 770.42 宽度

模型评估

费尔南多选择了最好的型号。该模型将使用引擎大小、马力和汽车宽度来估算价格。他想评估模型在训练和测试数据上的性能。

回想一下,他将数据分成了训练集和测试集。Fernando 使用训练数据训练模型。测试数据是看不见的数据。Fernando 根据测试数据评估模型的性能。这是真正的考验。

在训练数据上,该模型表现得相当好。 调整后的 R 平方为 0.815 = >该模型可以解释训练数据 81%的变异。然而,要使模型被接受,它还需要在测试数据上表现良好。

Fernando 在测试数据集上测试模型性能。模型根据测试数据计算出调整后的 R 平方为 0.7984。这意味着即使在看不见的数据上,模型也能解释 79.84%的变化。

结论

费尔南多现在有了一个简单而有效的模型来预测汽车价格。但是发动机大小,马力,宽度的单位不一样。他沉思着。

  • 如何使用通用的比较单位来估计价格变动?
  • 发动机尺寸、马力和宽度的价格弹性如何?

本系列的下一篇文章即将发表。它将讨论转换多元回归模型以计算弹性的方法。

原载于 2017 年 8 月 9 日datascientia . blog

数据科学简化版第 7 部分:对数回归模型

原文:https://towardsdatascience.com/data-science-simplified-part-7-log-log-regression-models-499ecd1495f0?source=collection_archive---------3-----------------------

在本系列的最后几篇博文中,我们讨论了简单线性回归模型。我们讨论了多元回归模型选择正确模型的方法。

费尔南多现在创造了一个更好的模型。

价格= -55089.98 + 87.34 发动机尺寸+ 60.93 马力+ 770.42 宽度

费尔南多考虑了以下几点:

  • 如何使用通用的比较单位来估算价格变化?
  • 发动机尺寸、马力和宽度的价格弹性如何?

在这篇文章中将会解决这个问题。本文将详细介绍双对数回归模型。

概念:

为了解释对数回归模型的概念,我们需要后退两步。首先让我们了解导数、对数、指数的概念。然后我们需要理解弹性的概念。

衍生品:

让我们回到高中数学。遇见衍生品。高中数学和物理中教授的最迷人的概念之一。

导数是表示变化的一种方式,即函数在某一给定点的变化量。

变量 y 是 x 的函数,定义 y 为:

y = f(x)

我们对 y 相对于 x 求导,表示如下:

dy/dx = df(x)/dx = f'(x)

这意味着:

  • y 相对于 x 的变化,即如果 x 改变,y 会改变多少?

难道不是费尔南多想要的吗?他想知道价格(y)相对于其他变量(cityMpg 和 highwayMpg)的变化。

回想一下,多元回归模型的一般形式如下:

y =β0+β1 . x1+β2 . x2+…+βn . xn+𝛆

假设 Fernando 构建了以下模型:

价格= β0 + β1。发动机尺寸,即将价格表示为发动机尺寸的函数。

费尔南多对价格和引擎大小进行了求导。他不应该能够根据发动机尺寸的变化来表达价格的变化吗?

唉,事情没那么简单。线性回归模型假设线性关系。线性关系定义为:

y = mx + c

如果计算 y 对 x 的导数,则得出以下结果:

dy/dx = m . dx/dx + dc/dx

  • 某物相对于自身的变化总是 1,即 dx/dx = 1
  • 常数相对于任何事物的变化总是 0。这就是为什么它是一个常数。不会变的。即 dc/dx = 0

等式现在变成了:

dy/dx = m

对发动机尺寸的价格应用导数只会产生发动机尺寸的系数。

一定有办法改变它。又来了两个数学字符。满足指数和对数。

指数:

现在让我们看看指数。这个字符又是高中数学中的一个常见字符。指数是一个有两个算子的函数。底数(b)和指数(n)。它被定义为 b^n 。它的形式是:

f(x) = b^x

基数可以是任何正数。欧拉数(e)也是统计学中常用的基数。

几何上,指数关系具有以下结构:

  • x 的增加不会导致 y 的相应增加,直到达到一个阈值。
  • 在阈值之后,对于 x 的小幅度增加,y 的值迅速上升。

对数:

对数是一个有趣的字符。让我们只了解它适用于回归模型的个性。对数的基本性质是它的底。对数的典型底数是 2、10 或 e。

让我们举一个例子:

  • 我们乘多少个 2 得到 8?2 x 2 x 2 = 8,即 3
  • 这也可以表示为:log2(8) = 3

以 2 为底的 8 的对数是 3

对数还有另一个共同的基础。它被称为“欧拉数(e)”其近似值为 2.71828。它在统计学中被广泛使用。以 e 为底的对数称为自然对数。

它还具有有趣的变革能力。它将 指数关系转化为线性关系。 让我们看一个例子:

下图显示了 y 和 x 之间的指数关系:

如果对数同时应用于 x 和 y,则 log(x)和 log(y)之间的关系是线性的。它看起来像这样:

弹性:

弹性是衡量一个经济变量对另一个经济变量变化的反应程度。

假设我们有一个函数:Q = f(P)那么 Q 的弹性定义为:

E = P/Q x dQ/dP

  • dq/dP 是 Q wrt 变化在 p 中的平均变化。

将所有这些整合在一起:

现在让我们把这三个数学特征放在一起。导数、对数和指数。他们的交战规则如下:

  • e 的对数是 1,即 log(e) = 1
  • 指数的对数是指数乘以底数。
  • log(x)的导数是:1/x

让我们举一个例子。想象一个函数 y,表示如下:

  • y = b^x.
  • => log(y) = x log (b)

那么对于线性回归模型意味着什么呢?我们可以利用导数、对数和指数来玩数学杂耍吗?能不能改写线性模型方程,求 y 的变化率 wrt 在 x 的变化率?

首先,让我们把 y 和 x 之间的关系定义为指数关系

  1. y = α x^β
  2. 我们先把这个表示成 log-log 的函数: log(y) = log(α) + β。log(x)
  3. 方程#1 看起来不像回归模型吗:Y= β0 + β1。x1?其中β0 = log(α);β1 = β.这个方程现在可以改写为: log(y) = β0 + β1。log(x1)
  4. 但是它是如何代表弹性的呢?让我们对 log(y) wrt x 求导,我们得到如下结果:
  • d. log(y)/ dx = β1。log(x1)/dx。
  • => 1/y . dy/dx = β1。1/x => β1 = x/y . dy/dx。
  • β1 的方程就是弹性。

模型构建:

现在我们理解了这个概念,让我们看看费尔南多是如何建造模型的。他建立了以下模型:

log(价格)= β0 + β1。log(发动机尺寸)+ β2。log(马力)+ β3。原木(宽度)

他想估计汽车价格的变化,作为发动机尺寸、马力和宽度变化的函数。

Fernando 在其统计包中训练该模型,并获得以下系数。

该模型的方程式为:

log(价格)= -21.6672 + 0.4702.log(引擎大小)+ 0.4621.log(马力)+ 6.3564。原木(宽度)

以下是对模型的解释:

  • 所有系数都是重要的。
  • 调整后的 r 平方为 0.8276 = >该模型解释了 82.76% 的数据变异。
  • 如果发动机尺寸 增加 4.7% 那么汽车价格增加 10%。
  • 如果马力增加 4.62% 那么汽车价格增加 10%。
  • 如果汽车宽度增加 6% ,那么汽车的价格就会增加 1 %。

模型评估:

Fernando 现在已经建立了双对数回归模型。他评估模型在训练和测试数据上的性能。

回想一下,他将数据分为训练集和测试集。训练数据用于创建模型。测试数据是看不见的数据。测试数据的性能才是真正的考验。

在训练数据上,该模型表现得相当好。调整后的 R 平方为 0.8276 = >该模型可以解释训练数据的 82.76%的变化。要使模型可以接受,它还需要在测试数据上表现良好。

Fernando 在测试数据集上测试模型性能。该模型根据测试数据计算出调整后的 r 平方为 0.8186。这很好。这意味着即使在看不见的数据上,模型也能解释 81.86%的变异。

请注意,该模型估计的是日志(价格),而不是汽车的价格。要将估算的 log(价格)转换成价格,需要有一个转换。

该转换将对数(价格)视为 e 的指数。

e^log(price)=价格

结论:

最近的几篇帖子是一段相当长的旅程。统计学习奠定了基础。假设检验讨论了无效假设和替代假设的概念。简单的线性回归模型使回归变得简单。然后我们进入了多元回归模型的世界。接着讨论型号选择方法。在这篇文章中,我们讨论了对数回归模型。

到目前为止,建立的回归模型只有数字自变量。下一篇文章我们将讨论交互作用和定性变量的概念。

原载于 2017 年 8 月 14 日datascientia . blog

数据科学简化版第 8 部分:回归模型中的定性变量

原文:https://towardsdatascience.com/data-science-simplified-part-8-qualitative-variables-in-regression-models-d1817d56245c?source=collection_archive---------4-----------------------

本系列的最后几篇博文讨论了回归模型。费尔南多选择了最佳车型。他建立了一个多元回归模型。该模型采用以下形状:

价格= -55089.98 + 87.34 发动机尺寸+ 60.93 马力+ 770.42 宽度

该模型预测或估计价格(目标),作为发动机尺寸、马力和宽度(预测值)的函数。该模型将所有预测值作为数值。

如果有定性变量呢?如何使用定性变量来增强模型?定性变量是如何解释的?

这是这篇博文将要回答的几个问题。

费尔南多得到两个这样的定性变量:

  • 燃料类型:使用的燃料类型。该值可以是天然气或柴油。
  • 驱动轮:驱动轮的类型。它有三个值 4 轮(四轮驱动),后轮(RWD)和前轮(前轮)。

数据集是这样的。

费尔南多想找出这些定性变量对汽车价格的影响。

概念

定性变量是非数值变量。它将数据分类。它们也被称为分类变量因子。

因素有层次。水平只不过是特定定性变量的唯一值。

  • 燃料类型有两个唯一的值。汽油还是柴油。这意味着燃料类型有两个因素。
  • 驱动轮有三个独特的价值。四轮驱动,后轮驱动和前轮驱动。这意味着驱动轮有三个因素。

当回归模型使用定性变量时,统计引擎会创建虚拟变量。虚拟变量的概念很简单。它只需要两个值 0 或 1。

让我们看一个例子。样本数据有 5 辆汽车,每辆汽车都有柴油或气体燃料类型。

燃料类型是一个定性变量。它有两个级别(柴油或天然气)。统计软件包创建一个虚拟变量。它创建了一个名为 fuelTypegas 的伪变量。此变量采用 0 或 1 值。如果燃料类型是气体,则虚拟变量为 1,否则为 0。

数学上,它可以写成:

  • 如果燃料类型是气体,xi = 1
  • xi = 0 表示燃料类型为柴油

回归模型创建的虚拟变量的数量比定性变量中的数字因子值少一个。

让我们来看看它是如何在回归模型中表现出来的。仅将价格和燃料类型作为输入的简单回归模型提供了以下系数:

只有一个系数和一个截距。回归模型为定性变量(本例中为气体)的因子值创建一个虚拟变量。

上面写着:

  • 如果虚拟变量为 0,即汽车的燃料类型为柴油,则价格= 18348 + 0 x (-6925) = $18348
  • 如果虚拟变量为 1,即汽车的燃料类型为天然气,则价格= 18348 + 1 x (-6925) = $11423

具有两个因素水平的定性变量的处理方式是清楚的。两级以上的变量呢?让我们检查另一个例子来理解它。

驱动轮是一个有三个因素的定性变量。在这种情况下,回归模型创建了两个虚拟变量。让我们看一个例子。样本数据有 4 辆汽车。

创建了两个虚拟变量:

  • 驱动轮前进:如果驱动轮类型是前进,则为 1,否则为 0
  • 如果驱动轮类型是 rwd,则为 1,否则为 0

数学上,它可以写成:

  • 如果驱动轮向前,xi1 = 1;如果驱动轮不向前,则为 0。
  • 如果驱动轮是后轮,xi2 = 1;如果驱动轮不是后轮,则为 0。

请注意,4WD 没有虚拟变量。

它们在回归模型中是如何体现的?回归模型处理它们的方式如下:

  • 首先,它为价格估算创建了一个 基线 。基线是没有创建虚拟变量的定性变量的平均价格。这是截距值。基线方程适用于 4WD。这是一辆四轮驱动汽车的平均价格。
  • 对于前轮驱动:前轮驱动的平均价格估计为基线+1×前轮驱动系数。即价格= 7603+1×1405+0×10704 = 9008 美元。这意味着平均来说,一辆四轮驱动汽车比一辆四轮驱动汽车贵 1405 美元。
  • 对于 RWD:后轮驱动(红色)的价格估计为基线+1 x RWD 系数。即价格= 7603+0×1405+1×10704 = 18307 美元。这意味着平均而言,一辆后轮驱动汽车比一辆四轮驱动汽车贵 10704 美元。

所有具有两个以上因子值的定性变量都以类似方式处理。

模型结构

既然定性变量的处理机制。让我们看看费尔南多是如何将其应用到他的模型中的。他最初的模型如下:

价格= -55089.98 + 87.34 发动机尺寸+ 60.93 马力+ 770.42 宽度

他增加了两个定性变量。燃料类型和车轮驱动。该模型的一般形式写为:

价格= β0 + β1 .发动机尺寸+ β2 .马力+ β3 .宽度+ β4 .燃油类型+β5 .驱动轮 fwd + β6 .驱动轮 rwd

Fernando 在其统计包中训练该模型,并获得以下系数。

该模型的方程式为:

*价格= -76404.83 + 57.20 *发动机尺寸+ 23.72 *马力+ 1214.42 *宽度— 1381.47 *燃油类型气-344.62 *驱动轮 fwd + 2189.16 驱动轮 rwd

这里混合了定量和定性变量。变量是相互独立的。现在让我们来解释这些系数:

  • β0:注意,没有为柴油汽车和 4WD 汽车创建虚拟变量。 β0 代表柴油和 4WD 汽车的平均价格。是负值。这意味着,如果有柴油四轮驱动,平均价格将是负值。这是不可能的。该模型可能违反了线性回归假设。
  • β1:这种解释与多元回归的解释相同。 发动机尺寸增加 1 个单位,解释为汽车价格平均增加。 发动机尺寸每增加 1 个单位,汽车价格平均增加 57 美元。
  • β2:这种解释与多元回归的解释相同。 马力增加 1 个单位,解释为车价平均增加。 马力增加 1 个单位,汽车价格平均增加 23.72 美元。
  • β3:这种解释与多元回归的解释相同。 宽度增加 1 个单位,解释为车价平均增加。 宽度增加 1 个单位,汽车价格平均增加 1214.42 美元。
  • β4:该系数是虚拟变量(燃料型气体)的结果。 它解释为柴油汽车和燃气汽车的平均价格差。 这意味着,平均而言,一辆燃油型汽车比一辆柴油车便宜 1381.47 美元。
  • β5:该系数是虚拟变量(驱动轮向前)的结果。 它解释为四轮驱动和四轮驱动汽车之间的平均价格差。这意味着平均来说,一辆四轮驱动汽车要比一辆四轮驱动汽车便宜 344.62 美元。
  • β6:该系数是虚拟变量(驱动轮 rwd)的结果。 它被解释为一辆四轮驱动汽车和一辆 RWD 汽车之间的平均价格差。这意味着平均来说,一辆 RWD 轿车要比一辆四轮驱动轿车贵 2189.16 美元。
  • 调整后的 r 平方为 0.8183。这意味着该模型解释了训练数据中 81.83%的变异。
  • 请注意,并非所有系数都很重要。 事实上,在这种情况下,定性变量对模型表现没有意义。

结论

这个模型并不比最初创建的模型更好。然而,它已经完成了它的工作。 我们了解回归模型中定性变量的解释方式。 很明显,原来的型号配 马力,引擎尺寸和宽度比 要好。然而,他想知道:马力、发动机尺寸和宽度是分开处理的。

马力、发动机尺寸、宽度有关系怎么办?这些关系可以建模吗?

本系列的下一篇博文将回答这些问题。它将解释互动的概念。

原载于 2017 年 8 月 19 日datascientia . blog

数据科学简化版第 9 部分:回归模型的相互作用和局限性

原文:https://towardsdatascience.com/data-science-simplified-part-9-interactions-and-limitations-of-regression-models-4702dff03820?source=collection_archive---------6-----------------------

在本系列的最后几篇博文中,我们详细讨论了回归模型。费尔南多建立了一个多元回归模型。该模型采用以下形状:

价格= -55089.98 + 87.34 发动机尺寸+ 60.93 马力+ 770.42 宽度

该模型预测或估计价格(目标),作为发动机尺寸、马力和宽度(预测值)的函数。

回想一下,多元回归模型假设独立预测因子之间是独立的。它将马力、发动机尺寸和宽度视为不相关。

实际上,变量很少是独立的。

如果马力、发动机尺寸和宽度之间有关系呢?这些关系可以建模吗?

这篇博文将回答这个问题。它将解释互动的概念。

概念:

预测值之间的独立性意味着如果一个预测值发生变化,它会对目标产生影响。这种影响与其他预测因子的存在或变化无关。目标和预测值之间的关系是加性和线性的。

让我们举个例子来说明一下。费尔南多的方程式是:

价格= -55089.98 + 87.34 发动机尺寸+ 60.93 马力+ 770.42 宽度

它被解释为发动机尺寸的单位变化使价格变化 87.34 美元。

这种解释从来没有考虑到发动机的尺寸可能与汽车的宽度有关。

难道不能是车越宽,发动机越大吗?

第三个预测值捕捉引擎和宽度之间的相互作用。这个第三预测值被称为 相互作用项。

由于发动机尺寸和宽度之间的相互作用项,回归模型具有以下形状:

价格= β0 + β1。发动机尺寸+ β2。马力+ β3。宽度+ β4。(发动机尺寸。宽度)

方程的部分 (β1。发动机尺寸+ β3。宽度)称为主效果。

术语发动机尺寸 x 宽度是相互作用术语。

这个术语如何描述发动机尺寸和宽度之间的关系?我们可以将这个等式重新排列为:

价格= β0 + (β1 + β4。宽度)发动机尺寸+ β2。马力+ β3。宽度

现在,β4 可以解释为宽度增加 1 个单位对发动机尺寸的影响。

模型构建:

费尔南多将这些数据输入他的统计包。该包计算参数。输出如下所示:

等式变为:

价格= 51331.363–1099.953 x 发动机尺寸+ 45.896 x 马力— 744.953 x 宽度+ 17.257 x 发动机尺寸:宽度

价格= 51331.363—(1099.953–17.257 x 宽度)发动机尺寸+ 45.896 x 马力— 744.953 x 宽度

让我们来解释这些系数:

  • 发动机尺寸、马力和发动机尺寸:宽度(交互项)是重要的。
  • 汽车的宽度并不重要。
  • 发动机尺寸增加 1 个单位,价格降低 1099.953 美元。
  • 马力增加 1 单位,价格增加 45.8 美元。
  • 相互作用项是重要的。这意味着真正的关系不是相加的。
  • 发动机尺寸增加 1 个单位,价格也会增加(1099.953–17.257 x 宽度)。
  • 测试数据的校正 r 平方为 0.8358 = >该模型解释了 83.5%的变化。

注意,汽车的宽度并不重要。那么将其纳入模型有意义吗?

这里出现了一个叫做的等级原则。

分层原则: 当交互包含在模型中时,主特效也需要包含在模型中。即使单个变量在模型中不显著,也需要包括主要影响。

Fernando 现在运行模型,并根据测试数据测试模型性能。

该模型在测试数据集上表现良好。测试数据的调整后 r 平方为 0.8175622 = >该模型解释了 81.75%的未知数据变化。

费尔南多现在有一个最优模型来预测汽车价格和购买汽车。

回归模型的局限性

回归模型是数据科学的主力。这是数据科学家工具箱中的一个神奇工具。当被有效利用时,他们在解决许多现实生活中的数据科学问题方面表现惊人。然而,它们也有其局限性。简单解释了回归模型的三个局限性:

非线性关系:

线性回归模型假设变量之间是线性的。如果关系不是线性的,那么线性回归模型可能不会如预期的那样执行。

实用提示:使用 log 等变换将非线性关系转换为线性关系

多重共线性:

共线性是指两个预测变量相互关联的情况。当有许多预测因子并且这些预测因子之间存在相关性时,称为多重共线性。如果预测值彼此相关,那么特定预测值对目标的影响就很难被隔离。

实用提示:通过仔细选择预测器使模型更简单。限制选择过多的相关预测因子。或者,使用像主成分这样的技术来创造新的不相关变量。

异常值的影响:

异常值是指远离模型预测值的点。如果目标变量中有异常值,模型会被拉伸以适应它们。对少数异常点进行了过多的模型调整。这使得模型偏向异常值。这对大多数人来说都没有什么好处。

实用提示:去除建模中的离群点。如果目标中有太多的异常值,可能需要多个模型。

结论:

这是一段不平凡的旅程。在最近几篇博文中,简单线性回归模型被解释。然后我们又涉猎了多元回归模型对型号选择方法进行了探讨。处理定性变量和交互作用也进行了讨论。

在本系列的下一篇文章中,我们将讨论另一种监督学习模型:分类。

原载于 2017 年 8 月 27 日datascientia . blog

数据科学简化版第 4 部分:简单线性回归模型

原文:https://towardsdatascience.com/data-science-simplified-simple-linear-regression-models-3a97811a6a3d?source=collection_archive---------1-----------------------

在本系列之前的文章中,我们讨论了统计学习假设检验的概念。在本文中,我们深入线性回归模型。

在我们开始之前,让我们回忆一下统计学习的一些重要方面。

自变量和因变量:

在统计学习的背景下,有两种类型的数据:

  • 自变量:可以直接控制的数据。
  • 因变量:不能直接控制的数据。

无法控制的数据,即需要预测或估计的因变量。

型号:

模型是一个转换引擎,帮助我们将因变量表达为自变量的函数。

参数:

参数是添加到模型中用于估计产量的成分。

概念

线性回归模型为监督学习提供了一种简单的方法。它们简单而有效。

等等,我们说的线性是什么意思?

Linear 含有如下含义:沿着直线或近似直线排列或延伸。线性表明因变量和自变量之间的关系可以用直线表示。

回忆一下高中的几何课。一条线的方程是什么?

y = mx + c

线性回归不过是这个简单方程的一种表现形式。

  • y 是因变量,即需要估计和预测的变量。
  • x 是自变量,即可控变量。它是输入。
  • m 是斜率。它决定了线的角度。它是表示为β的参数。
  • c 是截距。当 x 为 0 时,决定 y 值的常数。

英国著名统计学家乔治·博克斯曾经引用过:

“所有的模型都是错的;有些是有用的。”

线性回归模型并不完美。它试图用一条直线来近似因变量和自变量之间的关系。近似导致误差。可以减少一些误差。有些错误是问题的本质所固有的。这些错误无法消除。它们被称为不可约误差,真实关系中的噪声项,任何模型都无法从根本上减少。

同一条直线的等式可以改写为:

β0 和β1 是代表截距和斜率的两个未知常数。它们是参数。

ε 是误差项。

制定

让我们通过一个例子来解释线性回归模型的术语和工作原理。

费尔南多是一名数据科学家。他想买一辆汽车。他想估计或预测他将要支付的汽车价格。他有一个朋友在汽车经销公司。他询问了各种其他汽车的价格以及该车的一些特性。他的朋友向他提供了一些信息。

以下是向他提供的数据:

  • 品牌:汽车的品牌。
  • 燃料类型:汽车使用的燃料类型。
  • nDoor:门的数量。
  • 引擎大小:汽车引擎的大小。
  • 价格:汽车的价格。

首先,Fernando 想要评估他是否真的可以根据引擎大小预测汽车价格。第一组分析寻求以下问题的答案:

  • 汽车价格与发动机大小有关吗?
  • 关系有多牢固?
  • 关系是线性的吗?
  • 我们能根据发动机尺寸预测/估算汽车价格吗?

费尔南多做了相关分析。相关性是两个变量相关程度的度量。它是通过一种叫做相关系数的度量来衡量的。其值介于 0 和 1 之间。

如果相关系数是一个大的(> 0.7) +ve 数,这意味着当一个变量增加时,另一个变量也增加。大的 ve 值表示一个变量增加,另一个变量减少。

他做了相关分析。他绘制了价格和发动机尺寸之间的关系。

他将数据分为训练集和测试集。75%的数据用于训练。剩余的用于测试。

他建立了一个线性回归模型。他使用统计软件包来创建模型。该模型创建了一个线性方程,将汽车的价格表示为发动机尺寸的函数。****

以下是问题的答案:

  • 汽车价格与发动机大小有关吗?
  • 是的,有关系。
  • 关系有多牢固?
  • 相关系数为 0.872 = >有很强的相关性。
  • 关系是线性的吗?
  • 一条直线可以拟合= >使用发动机尺寸可以做出合理的价格预测。
  • 我们可以根据发动机尺寸预测/估算汽车价格吗?
  • 是的,汽车价格可以根据发动机的大小来估算。

Fernando 现在想要建立一个线性回归模型,根据发动机的大小来估算汽车的价格。将方程式叠加到汽车价格问题上,Fernando 为价格预测制定了以下方程式。

价格= β0 + β1 x 发动机尺寸

模型建立和解释

模型

回想一下早先的讨论,关于数据需要如何被分成训练测试集合。训练数据用于了解数据。训练数据用于创建模型。测试数据用于评估模型性能。

Fernando 将数据分为训练集和测试集。75%的数据用于训练。剩余的用于测试。他建立了一个线性回归模型。他使用统计软件包来创建模型。该模型产生一个线性方程,该方程将汽车的价格表示为发动机尺寸的函数。****

他将数据分为训练集和测试集。75%的数据用于训练。剩余的用于测试。

他建立了一个线性回归模型。他使用统计软件包来创建模型。该模型创建了一个线性方程,将汽车的价格表示为发动机尺寸的函数。****

该模型估计参数:

  • β0 估计为-6870.1
  • β1 估计为 156.9

线性方程估计为:

价格= -6870.1 + 156.9 x 发动机尺寸

解释

该模型提供了在给定特定发动机尺寸的情况下预测平均汽车价格的方程式。该等式的含义如下:

发动机尺寸每增加一个单位,汽车均价就会增加 156.9 个单位。

估价

模型已经建立。需要评估模型的稳健性。我们怎么能确定这个模型能够预测出令人满意的价格呢?这一评估分两部分进行。首先,测试以建立模型的稳健性。第二,测试评估模型的准确性。

Fernando 首先根据训练数据评估模型。他得到了以下统计数据。

里面有很多统计数据。让我们把重点放在关键的(用红色标记的)。回想一下关于假设检验的讨论。使用假设检验评估模型的稳健性。

需要定义 H0 和 Ha。它们的定义如下:

  • H0(零假设):x 和 y 之间没有关系,即价格和发动机尺寸之间没有关系。
  • Ha(替代假设):x 和 y 之间存在某种关系,即价格和发动机尺寸之间存在某种关系。

β1:β1 的值决定了价格和发动机大小的关系。如果β1 = 0,则没有关系。在这种情况下,β1 为正。这意味着价格和发动机尺寸之间有某种关系。

t-stat:t-stat 值是系数估计值(β1)远离零多少个标准差。此外,价格和发动机尺寸之间的关系越远离零越强。系数是显著的。在这种情况下,t-stat 是 21.09。离零足够远了。

p 值: p 值是一个概率值。它表示在假设零假设为真的情况下,看到给定 t 统计量的机会。如果 p 值很小,例如< 0.0001,这意味着这是偶然的且没有关系的概率很低。在这种情况下,p 值很小。这意味着价格和引擎之间的关系不是偶然的。

有了这些指标,我们可以安全地拒绝零假设,接受替代假设。 价格和发动机尺寸之间有着密切的关系

关系就建立了。准确性怎么样?模型有多精确?为了感受模型的准确性,一个名为 R 平方或决定系数的度量是很重要的。

R 平方或决定系数:为了理解这些指标,让我们把它分解成它的组成部分。

  • 误差(e) 是实际 y 和预测 y 之间的差值。预测 y 表示为ŷ.对每个观察值评估该误差。这些误差也被称为残差。
  • 然后将所有剩余值平方并相加。这一项称为残差平方和(RSS)。RSS 越低越好。
  • R 平方的等式还有另一部分。为了得到另一部分,首先,计算实际目标的平均值,即估计汽车价格的平均值。然后计算平均值和实际值之间的差异。然后将这些差值平方并相加。它是总平方和(TSS)。
  • R 平方 a.k .决定系数计算为 1- RSS/TSS。此指标解释了模型预测值与实际值的平均值之间的差异分数。该值介于 0 和 1 之间。它越高,模型就越能解释方差。

让我们看一个例子。

在上面的例子中,RSS 是基于三辆汽车的预测价格计算的。RSS 值是 41450201.63。实际价格的平均值是 11021。TSS 计算为 44,444,546。r 平方计算为 6.737%。对于这三个特定的数据点,模型只能解释 6.73%的变化。不够好!!

然而,对于费尔南多的模型,这是一个不同的故事。训练集的 R 平方为 0.7503,即 75.03%。这意味着该模型可以解释 75%以上的变异。

结论

瞧啊。!费尔南多现在有一个很好的模型。它在训练数据上的表现令人满意。但是,有 25%的数据无法解释。有改进的余地。增加更多的独立变量来预测价格怎么样?当添加一个以上的自变量来预测因变量时,会创建一个多元回归模型,即一个以上的变量。

本系列的下一期将更深入地研究多元回归模型。敬请关注。

数据科学技能:使用 python 进行网页抓取 javascript

原文:https://towardsdatascience.com/data-science-skills-web-scraping-javascript-using-python-97a29738353f?source=collection_archive---------0-----------------------

使用 python 有不同的抓取网页的方法。在我的上一篇文章中,我通过使用库:requestsBeautifulSoup介绍了 web 抓取。然而,许多网页是动态的,并且使用 JavaScript 来加载它们的内容。这些网站通常需要不同的方法来收集数据。

[## 数据科学技能:使用 python 进行网络搜集

作为一名数据科学家,我在工作中接受的第一批任务之一就是网络搜集。这完全是…

towardsdatascience.com](/data-science-skills-web-scraping-using-python-d1a85ef607ed)

在本教程中,我将介绍几种收集包含 Javascript 的网页内容的不同方法。使用的技术如下:

  1. selenium与 Firefox 网络驱动一起使用
  2. 使用带phantomJS的无头浏览器
  3. 使用 REST 客户端或 python requests库进行 API 调用

TL;DR 关于用 python 抓取 javascript 网页的例子,你可以在 GitHub 上找到本教程涵盖的完整代码。

2019 年 11 月 7 日更新:请注意,被抓取的网页的 html 结构可能会随着时间的推移而更新,本文最初反映的是 2018 年 11 月发布时的结构。这篇文章现在已经更新,可以在当前网页上运行,但将来可能会再次改变。

第一步

开始教程,我首先需要找到一个网站刮。在继续使用 web scraper 之前,务必检查您计划抓取的网站上的条款和条件以及隐私政策,以确保您没有违反他们的任何使用条款。

动机

当试图找到一个合适的网站来演示时,我首先看到的许多例子都明确表示禁止使用网络爬虫。直到看了一篇关于酸奶含糖量的文章,想知道在哪里可以找到最新的营养信息,激发了我在哪里可以找到合适的网站的另一个思路;网上超市。

在线零售商通常有使用 javascript 加载内容的动态网页,因此本教程的目的是从在线超市的网页中抓取酸奶的营养信息。

设置您的环境

由于我们将使用一些新的 python 库来访问网页内容和处理数据,这些库将需要使用您常用的 python 包管理器pip来安装。如果你还没有beautifulsoup,那么你也需要在这里安装它。

pip install selenium
pip install pandas

要使用selenium作为网络驱动程序,还有一些额外的要求:

火狐浏览器

我将使用 Firefox 作为我的网络驱动程序的浏览器,所以这意味着你要么需要安装 Firefox 来跟随这个教程,要么你可以使用 Chrome 和 Chrome。

壁虎

要使用 web 驱动程序,我们需要安装一个 web 浏览器引擎 geckodriver。您需要为您的操作系统下载 geckodriver ,提取文件并设置可执行路径位置。

您可以通过几种方式来完成此操作:
(i)将 geckodriver 移动到您选择的目录中,并在您的 python 代码中定义此可执行路径(参见后面的示例),

(ii)将 geckodriver 移动到一个已经设置为可执行文件所在目录的目录中,这就是您的环境变量 path。
您可以通过以下方式找到您的$PATH中有哪些目录:

窗口 转到:

控制面板>环境变量>系统变量>路径

Mac OSX / Linux
在你的终端中使用命令:

echo $PATH

(iii)将壁虎驱动程序位置添加到您的PATH环境变量中

窗口
窗口
转到:

控制面板>环境变量>系统变量>路径>编辑

Mac OSX / Linux 给你的.bash_profile (Mac OSX)或者.bash_rc (Linux)加一行

# add geckodriver to your PATH
export PATH="$PATH:/path/to/your/directory"

重新启动您的终端,并使用(ii)中的命令检查您的新路径是否已经添加。

幻象

类似于 geckodriver 的步骤,我们也需要下载 PhantomJS 。下载完成后,按照上述相同的说明,解压文件并移动到选择的目录或添加到可执行文件路径。

REST 客户端

在这篇博客的最后一部分,我们将使用 REST 客户端向 API 发出请求。我将使用失眠,但是你可以随意使用你喜欢的任何一个客户端!

使用 BeautifulSoup 抓取网页

按照我的web 抓取入门教程中概述的标准步骤,我检查了网页,并想要提取重复的 HTML 元素:

<div data-cid="XXXX" class="listing category_templates clearfix productListing ">...</div>

作为第一步,您可以尝试使用 BeautifulSoup 通过以下脚本提取这些信息。

# import libraries
import urllib.request
from bs4 import BeautifulSoup# specify the url
urlpage = '[https://groceries.asda.com/search/yogurt'](https://groceries.asda.com/search/yoghurt') 
print(urlpage)
# query the website and return the html to the variable 'page'
page = urllib.request.urlopen(urlpage)
# parse the html using beautiful soup and store in variable 'soup'
soup = BeautifulSoup(page, 'html.parser')
# find product items
# at time of publication, Nov 2018:
# results = soup.find_all('div', attrs={'class': 'listing category_templates clearfix productListing'})# updated Nov 2019:
results = soup.find_all('div', attrs={'class': 'co-product'})
print('Number of results', len(results))

没想到的是,在运行 python 脚本时,即使我在网页上看到很多结果,返回的结果数也是 0!

[https://groceries.asda.com/search/yoghurt](https://groceries.asda.com/search/yoghurt)
BeautifulSoup - Number of results 0

当进一步检查页面时,网页上有许多动态特征,这表明 javascript 用于呈现这些结果。
右键单击并选择View Page Source有许多<script>元素在使用中,搜索上面包含我们感兴趣的数据的元素不会返回匹配结果。

抓取该网页的第一种方法是使用 Selenium web driver 调用浏览器,搜索感兴趣的元素并返回结果。

使用 Selenium 抓取网页

1.硒配壁虎

由于我们无法使用 Beautiful Soup 访问 web 页面的内容,我们首先需要在 python 脚本中设置一个 web 驱动程序。

# import libraries
import urllib.request
from bs4 import BeautifulSoup
from selenium import webdriver
import time
import pandas as pd# specify the url
urlpage = '[https://groceries.asda.com/search/yogurt'](https://groceries.asda.com/search/yoghurt') 
print(urlpage)
# run firefox webdriver from executable path of your choice
driver = webdriver.Firefox(executable_path = 'your/directory/of/choice')

正如在安装 geckodriver 时提到的,如果可执行文件不在可执行路径中,我们可以在 python 脚本中定义路径。如果它在一个可执行路径中,那么上面的行变成:

# run firefox webdriver from executable path of your choice
driver = webdriver.Firefox()

设置完成后,我们现在可以连接到网页并找到感兴趣的元素。当在浏览器中加载网页时,结果通常需要一段时间来加载,甚至可能直到我们向下滚动页面时才加载。
考虑到这一点,我们可以为 web 驱动程序添加一些 javascript 来执行这些操作。下面是一个让页面滚动的简单例子,有更有效的方法可以做到这一点,为什么不在这里测试你自己的 javascript,让我在评论中知道什么最适合你!

我们还添加了一个睡眠时间,作为等待页面完全加载的另一种方法。

# get web page
driver.get(urlpage)
# execute script to scroll down the page
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);var lenOfPage=document.body.scrollHeight;return lenOfPage;")
# sleep for 30s
time.sleep(30)
# driver.quit()

如果我们现在运行脚本(你也可以在最后取消对driver.quit()的注释以确保浏览器关闭),当你的 python 脚本运行时,Firefox 将打开指定的 url 并向下滚动页面。希望在脚本运行完成之前,您应该已经加载了许多产品。

接下来,我们要获取感兴趣的元素。以前,我们使用 Beautiful Soup 试图根据标签和类属性查找所有元素,但是,在本例中,我们将使用一种稍微不同的方法来访问产品信息。相反,我们可以基于 XML 结构或 css 选择器,通过 xpath 搜索元素。

我们可以检查感兴趣的元素,在工具栏中,右键单击突出显示的元素,然后复制>复制 xpath(或复制选择器)。这是理解 html 结构的另一种有趣的方式。在这种情况下,我们将使用 xpath 来查找元素,然后我们可以打印匹配的结果数:

# find elements by xpath# at time of publication, Nov 2018:
# results = driver.find_elements_by_xpath("//*[[@id](http://twitter.com/id)='componentsContainer']//*[contains([@id](http://twitter.com/id),'listingsContainer')]//*[[@class](http://twitter.com/class)='product active']//*[[@class](http://twitter.com/class)='title productTitle']")# updated Nov 2019:
results = driver.find_elements_by_xpath("//*[@class=' co-product-list__main-cntr']//*[@class=' co-item ']//*[@class='co-product']//*[@class='co-item__title-container']//*[@class='co-product__title']")
print('Number of results', len(results))

使用 xpath 而不是使用元素的一个主要原因是结果有一些元素,其中 id 的词干是带有一些附加单词的listingsContainer,所以contains函数被用来选择所有结果,但也排除了容器中的任何其他div元素,例如广告。

Firefox Webdriver - Number of results 38

现在我们已经有了页面的一些结果,我们可以循环每个结果并保存感兴趣的数据。在这种情况下,我们可以保存产品名称和链接。

注意,网页上实际上有 38 个以上的结果。根据连接到页面时加载的结果数量,这个数字也可能会有所不同。所有的结果都可以通过改变我们执行的 javascript 来收集,或者其他的方法将在下面的章节中探讨。

# create empty array to store data
data = []
# loop over results
for result in results:
    product_name = result.text
    link = result.find_element_by_tag_name('a')
    product_link = link.get_attribute("href")
    # append dict to array
    data.append({"product" : product_name, "link" : product_link})

在这个循环之外,我们可以关闭浏览器,因为我们导入了pandas库,我们可以通过将我们抓取的数据保存到 dataframe 来利用它。我们可以打印数据帧来查看内容。

# close driver 
driver.quit()
# save to pandas dataframe
df = pd.DataFrame(data)
print(df)

在这种格式下,我们可以非常简单地将数据写入 csv。

# write to csv
df.to_csv('asdaYogurtLink.csv')

将 Selenium 与 geckodriver 一起使用是一种快速抓取使用 javascript 的网页的方法,但也有一些缺点。我发现有时页面无法加载(我确信通过改变我们如上所述执行的 javascript 可以更有效,但是我是 JS 新手,所以这可能需要一些时间),但是加载浏览器和等待页面加载也需要时间。

另一个选择,我们可以使用无头浏览器。这将加快抓取速度,因为我们不必每次都等待浏览器加载。

2.带无头浏览器的 Selenium

当使用 PhantomJS 代替 geckodriver 作为无头浏览器时,唯一的区别是 web 驱动程序是如何加载的。这意味着我们可以遵循上面的方法,但是改变初始化 web 驱动程序的行,变成:

# run phantomJS webdriver from executable path of your choice
driver = webdriver.PhantomJS(executable_path = 'your/directory/of/choice')

这里要注意的是,对 PhantomJS 的 Selenium 支持已经贬值,并提供了一个警告。

通过使用 headless 选项,还可以对 geckodriver 使用 headless 模式:

from selenium import webdriver
from selenium.webdriver.firefox.options import Optionsoptions = Options()
options.headless = True
driver = webdriver.Firefox(firefox_options=options, executable_path = 'your/directory/of/choice')

通过使用无头浏览器,我们应该看到脚本运行时间的改进,因为我们没有打开浏览器,但不是所有的结果都以类似于在正常模式下使用 firefox webdriver 的方式收集。

发出 API 请求

我们将在本教程中讨论的最后一种方法是向 API 发出请求。当检查网页 XHR 文件时,当页面加载时,该页面显示正在进行的请求。在这个列表中有一个/search请求,它调用一个 API 端点来获得页面上显示的结果。

我们可以使用 REST 客户机或几行 python 来发出同样的请求。

如果我们检查search文件,查看文件头、包含关键字的请求 url 以及发出请求所需的其他参数。在一般细节下面是我们以后可能需要的响应和请求头。

Inspect tool showing the search request headers

为了获得响应,我们可以获取请求 url,并作为测试将它输入到浏览器的地址栏中。因为参数是在字符串中添加的,所以我们也可以尝试删除除关键字参数之外的所有参数,以测试是否还需要其他参数。在这种情况下,关键字查询在浏览器中返回结果,因此我们也可以使用 REST 客户机或 python 来执行相同的请求。

失眠休息客户

使用失眠症,我们可以输入请求 url 并发送请求。

这将返回一个包含我们正在寻找的数据的 JSON 响应!

Preview of JSON response in Insomnia

这个例子非常简单,不需要头或安全令牌。对于其他情况,REST 客户机允许您输入任何附加的响应参数,这些参数可以在收集请求细节时从 inspect 工具获得。

Python 请求

我们也可以使用urllib.request库从 python 发出同样的请求,就像我们在抓取之前连接到网页一样。

通过添加一些参数来缩进和排序关键字,可以使 JSON 响应更具可读性,这样我们现在就可以打开文件,并在进行搜索时看到提供给网页的响应数据。

# import json library
import json# request url
urlreq = '[https://groceries.asda.com/api/items/search?keyword=yogurt'](https://groceries.asda.com/api/items/search?keyword=yogurt')# get response
response = urllib.request.urlopen(urlreq)# load as json
jresponse = json.load(response)# write to file as pretty print
with open('asdaresp.json', 'w') as outfile:
    json.dump(jresponse, outfile, sort_keys=True, indent=4)

目前,我们将保留所有数据。我的下一篇教程将更详细地介绍数据结构和输出,这样我们就可以操作 JSON 并找到相关的数据。

摘要

本教程概述了一些我们可以用来抓取使用 javascript 的网页的方法。这些方法包括:

使用 web 驱动程序抓取内容

  • 使用 selenium web 驱动程序连接到带有 Firefox web 驱动程序、PhantomJS 和 headless 浏览器的网页
  • 使用 web 驱动程序查找感兴趣的元素
  • 循环结果并保存感兴趣的变量
  • 将数据保存到数据帧
  • 写入 csv 文件

发出 HTTP 请求

  • 检查网页以查找 HTTP 请求的详细信息
  • 使用浏览器、REST 客户端或 python 发出 GET 请求

虽然 HTTP 请求方法在本教程中实现起来更快,并且从一个请求中提供了我们需要的所有数据,但情况并不总是这样。并非所有网站都会显示它们的请求,过期的身份验证令牌可能会带来额外的安全性,或者输出数据可能需要大量清理,这比使用带有一些 javascript 的 web 驱动程序来加载所有结果并在所有页面上循环需要更多的工作。本教程提供了一些不同的选择,你可以尝试使用它们来抓取 javascript。

在我的下一个教程中,我们将探索数据结构,操作数据和写入输出文件或数据库。

感谢您的阅读!如果你喜欢我的文章,那么订阅我的每月简讯,在那里你可以将我的最新文章和顶级资源直接发送到你的收件箱,或者在我的网站上了解更多关于我正在做的事情。

如果您是 python 的新手或者想要提高,请查看我的文章,其中包含学习资源列表,包括数据科学课程:

[## 学习编码。学习 Python。

你想学习编码但是不知道从哪里开始吗?开始您的编码之旅,并决定 python 是否…

towardsdatascience.com](/learn-to-code-learn-python-efb037b248e8)

数据科学技能:使用 python 进行网络搜集

原文:https://towardsdatascience.com/data-science-skills-web-scraping-using-python-d1a85ef607ed?source=collection_archive---------0-----------------------

作为一名数据科学家,我在工作中接受的第一批任务之一就是网络搜集。这在当时对我来说是一个完全陌生的概念,使用代码从网站收集数据,但这是最符合逻辑和最容易获得的数据来源之一。经过几次尝试,网页抓取已经成为我的第二天性,也是我几乎每天都要使用的技能之一。

在本教程中,我将通过一个简单的例子来说明如何从快速通道中抓取一个网站来收集 2018 年前 100 家公司的数据。使用 web scraper 自动完成这一过程避免了手动收集数据,节省了时间,还允许您将所有公司数据保存在一个结构化文件中。

TL;关于 python 中一个简单的 web scraper 的快速例子,你可以在 GitHub 上找到本教程中的完整代码。

入门指南

在开始使用任何 python 应用程序之前,首先要问的问题是“我需要哪些库?”

对于 web 抓取,有几个不同的库可以考虑,包括:

  • 美味的汤
  • 要求
  • Scrapy

在这个例子中,我们将使用美丽的汤。使用 Python 包管理器pip,您可以用以下代码安装 Beautiful Soup:

pip install BeautifulSoup4

安装好这些库之后,让我们开始吧!

检查网页

要知道 python 代码中需要哪些元素,首先需要检查网页。

要从技术跟踪 100 强公司收集数据,您可以通过右键单击感兴趣的元素并选择 inspect 来检查页面。这将显示 HTML 代码,从中我们可以看到包含每个字段的元素。

Right click on the element you are interested in and select ‘Inspect’, this brings up the html elements

因为数据存储在一个表中,所以只需几行代码就可以轻松完成。如果你想熟悉抓取网站,这是一个很好的例子,也是一个很好的起点,但是要记住,事情不会总是这么简单!

所有 100 个结果都包含在<tr>元素的行中,这些结果都可以在一个页面上看到。情况并非总是如此,当结果跨越多个页面时,您可能需要更改网页上显示的结果数量,或者循环所有页面以收集所有信息。

在排行榜网页上,显示了包含 100 个结果的表格。当检查页面时,很容易看到 html 中的模式。结果包含在表的行中:

<table class="tableSorter">

重复的行<tr>将通过使用 python 中的循环查找数据并写入文件来保持我们的代码最少!

补充说明:另一个可以完成的检查是检查网站上是否发出了 HTTP GET 请求,该请求可能已经以结构化响应(如 JSON 或 XML 格式)的形式返回了结果。您可以在 inspect tools 的 network 选项卡中检查这一点,通常在 XHR 选项卡中。页面刷新后,将显示加载的请求,如果响应包含格式化的结构,使用 REST 客户端(如 失眠症 )返回输出通常会更容易。

Network tab of the page inspect tool after refreshing the webpage

使用美汤解析网页 html

现在你已经看到了 html 的结构,并且熟悉了你所抓取的内容,是时候开始使用 python 了!

第一步是导入将用于 web scraper 的库。我们已经在上面谈到了 BeautifulSoup,它帮助我们处理 html。我们要导入的下一个库是urllib,它连接到网页。最后,我们将把输出写到一个 csv 文件中,所以我们还需要导入csv库。作为替代,这里可以使用json库。

# import libraries
from bs4 import BeautifulSoup
import urllib.request
import csv

下一步是定义您正在抓取的 url。如前所述,此网页在一页上显示所有结果,因此地址栏中的完整 url 在此给出。

# specify the url
urlpage =  '[http://www.fasttrack.co.uk/league-tables/tech-track-100/league-table/'](http://www.fasttrack.co.uk/league-tables/tech-track-100/league-table/')

然后,我们连接到网页,我们可以使用 BeautifulSoup 解析 html,将对象存储在变量“Soup”中。

# query the website and return the html to the variable 'page'
page = urllib.request.urlopen(urlpage)
# parse the html using beautiful soup and store in variable 'soup'
soup = BeautifulSoup(page, 'html.parser')

我们可以在这个阶段打印 soup 变量,它将返回我们所请求的网页的完整解析的 html。

print(soup)

如果有错误或变量为空,则请求可能没有成功。此时,您可能希望使用[urllib.error](https://docs.python.org/3/library/urllib.error.html)模块实现错误处理。

搜索 html 元素

因为所有的结果都包含在一个表中,所以我们可以使用find方法搜索表的 soup 对象。然后我们可以使用find_all方法找到表中的每一行。

如果我们打印行数,结果应该是 101,这 100 行加上标题。

# find results within table
table = soup.find('table', attrs={'class': 'tableSorter'})
results = table.find_all('tr')
print('Number of results', len(results))

因此,我们可以循环结果来收集数据。

打印 soup 对象中的前 2 行,我们可以看到每一行的结构是:

<tr>
<th>Rank</th>
<th>Company</th>
<th class="">Location</th>
<th class="no-word-wrap">Year end</th>
<th class="" style="text-align:right;">Annual sales rise over 3 years</th>
<th class="" style="text-align:right;">Latest sales £000s</th>
<th class="" style="text-align:right;">Staff</th>
<th class="">Comment</th>
<!--                            <th>FYE</th>-->
</tr>
<tr>
<td>1</td>
<td><a href="[http://www.fasttrack.co.uk/company_profile/wonderbly-3/](http://www.fasttrack.co.uk/company_profile/wonderbly-3/)"><span class="company-name">Wonderbly</span></a>Personalised children's books</td>
<td>East London</td>
<td>Apr-17</td>
<td style="text-align:right;">294.27%</td>
<td style="text-align:right;">*25,860</td>
<td style="text-align:right;">80</td>
<td>Has sold nearly 3m customisable children’s books in 200 countries</td>
<!--                                            <td>Apr-17</td>-->
</tr>

表格中有 8 列,包括:排名、公司、地点、年末、年销售额上升、最新销售额、员工和评论,所有这些都是我们可以保存的有趣数据。

这种结构在网页的所有行中都是一致的(并非所有网站都是如此!),因此我们可以再次使用find_all方法将每一列分配给一个变量,我们可以通过搜索<td>元素将该变量写入 csv 或 JSON。

遍历元素并保存变量

在 python 中,将结果附加到列表中,然后将数据写入文件,这很有用。我们应该在循环之前声明列表并设置 csv 的头,如下所示:

# create and write headers to a list 
rows = []
rows.append(['Rank', 'Company Name', 'Webpage', 'Description', 'Location', 'Year end', 'Annual sales rise over 3 years', 'Sales £000s', 'Staff', 'Comments'])
print(rows)

这将打印出我们添加到包含标题的列表中的第一行。

您可能会注意到有几个额外的字段WebpageDescription,它们不是表中的列名,但是如果您仔细查看我们打印上面的 soup 变量时的 html,第二行包含的不仅仅是公司名称。我们可以使用一些进一步的提取来获得这些额外的信息。

下一步是遍历结果,处理数据并添加到可以写入 csv 的rows

要在循环中查找结果:

# loop over results
for result in results:
    # find all columns per result
    data = result.find_all('td')
    # check that columns have data 
    if len(data) == 0: 
        continue

由于表中的第一行只包含标题,我们可以跳过这个结果,如上所示。它也不包含任何<td>元素,因此当搜索该元素时,不会返回任何内容。然后,我们可以通过要求数据长度不为零来检查是否只处理包含数据的结果。

然后我们可以开始处理数据并保存到变量中。

 # write columns to variables
    rank = data[0].getText()
    company = data[1].getText()
    location = data[2].getText()
    yearend = data[3].getText()
    salesrise = data[4].getText()
    sales = data[5].getText()
    staff = data[6].getText()
    comments = data[7].getText()

上面的代码只是从每一列中获取文本,并保存到变量中。然而,这些数据中的一些需要进一步清理,以移除不需要的字符或提取进一步的信息。

数据清理

如果我们打印出变量company,文本不仅包含公司名称,还包含描述。如果我们打印出sales,它包含了不需要的字符,比如脚注符号,删除这些字符会很有用。

 print('Company is', company)
    # Company is WonderblyPersonalised children's books          
    print('Sales', sales)
    # Sales *25,860

我们想把company分成公司名称和描述,这可以用几行代码来完成。再次查看 html,对于该列,有一个仅包含公司名称的<span>元素。本专栏中还有一个链接,链接到网站上的另一个页面,该页面有关于该公司的更多详细信息。我们稍后会用到它!

<td><a href="[http://www.fasttrack.co.uk/company_profile/wonderbly-3/](http://www.fasttrack.co.uk/company_profile/wonderbly-3/)"><span class="company-name">Wonderbly</span></a>Personalised children's books</td>

为了将company分成两个字段,我们可以使用find方法保存<span>元素,然后使用stripreplacecompany变量中删除公司名称,这样就只剩下描述了。
为了从sales中删除不想要的字符,我们可以再次使用stripreplace方法!

 # extract description from the name
    companyname = data[1].find('span', attrs={'class':'company-name'}).getText()    
    description = company.replace(companyname, '')

    # remove unwanted characters
    sales = sales.strip('*').strip('†').replace(',','')

我们希望保存的最后一个变量是公司网站。如上所述,第二列包含到另一个页面的链接,该页面包含每个公司的概述。每个公司页面都有自己的表格,大部分时间都包含公司网站。

Inspecting the element of the url on the company page

要从每个表中抓取 url 并将其保存为变量,我们需要使用与上面相同的步骤:

  • 在快速通道网站上查找包含公司页面 url 的元素
  • 向每个公司页面 url 发出请求
  • 使用 Beautifulsoup 解析 html
  • 找到感兴趣的元素

查看一些公司页面,如上面的截图所示,URL 位于表格的最后一行,因此我们可以在最后一行中搜索<a>元素。

 # go to link and extract company website
    url = data[1].find('a').get('href')
    page = urllib.request.urlopen(url)
    # parse the html 
    soup = BeautifulSoup(page, 'html.parser')
    # find the last result in the table and get the link
    try:
        tableRow = soup.find('table').find_all('tr')[-1]
        webpage = tableRow.find('a').get('href')
    except:
        webpage = None

也可能有公司网站不显示的情况,因此我们可以使用try except条件,以防找不到 url。

一旦我们将所有数据保存到变量中,仍然在循环中,我们可以将每个结果添加到列表rows

 # write each result to rows
    rows.append([rank, companyname, webpage, description, location, yearend, salesrise, sales, staff, comments])print(rows)

然后在循环之外打印变量是很有用的,在把它写到文件之前,检查它看起来是否像你期望的那样!

写入输出文件

您可能希望保存这些数据以供分析,这可以在 python 中从我们的列表中非常简单地完成。

# Create csv and write rows to output file
with open('techtrack100.csv','w', newline='') as f_output:
    csv_output = csv.writer(f_output)
    csv_output.writerows(rows)

运行 python 脚本时,将生成包含 100 行结果的输出文件,您可以进一步查看详细信息!

摘要

这篇关于使用 python 进行 web 抓取的简短教程概述了:

  • 连接到网页
  • 使用 BeautifulSoup 解析 html
  • 遍历 soup 对象以查找元素
  • 执行一些简单的数据清理
  • 将数据写入 csv

这是我的第一个教程,所以让我知道你是否有任何问题或意见,如果事情不清楚!

感谢您的阅读!如果你喜欢我的文章,那么订阅我的每月简讯,在那里你可以将我的最新文章和顶级资源直接发送到你的收件箱!

你可以在 Medium 上关注我以获取更多文章,在 Twitter 上关注我,或者在我的网站上了解更多我正在做的事情。

数据科学承担公共教育

原文:https://towardsdatascience.com/data-science-takes-on-public-education-f432910ea9f0?source=collection_archive---------15-----------------------

使用机器学习帮助分析教育问题

“high-angle photography of group of people sitting at chairs” by Mikael Kristenson on Unsplash

“教育是你可以用来改变世界的最强大的武器”——纳尔逊·曼德拉

介绍

纳尔逊·曼德拉是对的。教育是强大的武器,也是人生最大的礼物之一。在美国,有各种各样的儿童教育项目可供选择,如公立学校、特许学校和私立学校。虽然有几种教育途径可供选择,但它们都是为了实现学生成功的相同目标吗?

问题

我在 Kaggle 上遇到了一个挑战,叫做 PASSNYC:为了好的数据科学。这项挑战是由 PASSNYC 创建的,这是一个非营利组织,旨在帮助纽约市的公立学校学生,通过使用公开可用的数据来量化他们在学校面临的挑战,以及如何鼓励学生参加专门高中入学考试(SHSAT) 来评估学生的需求。PASSNYC 想找到哪些学校需要帮助来增加参加考试的学生人数。虽然这个挑战本身很有趣,但我想用机器学习的方法来解决一个不同的问题:我们如何帮助公立学校提高学生的成功率?

目的:我们能预测公立学校的学生成绩等级吗?

在数据中,有一个字段对每所学校的学生成绩进行评级,我用它来确定学校是否达到了学生成功的目标。学生成绩评定有 4 个不同的等级:未达到目标、接近目标、达到目标、超过目标。这将使我们的分析成为监督的多分类机器学习任务:

监督:我们得到了训练数据的目标数据

多类分类:目标数据有 4 个不同的分类值(我后来把它们变成了 3 个,以提高模型的性能)

探索性数据分析

与任何数据科学项目一样,第一种方法是理解数据。数据集中有 160 个特征/列,包括数值和分类值。基于这些特征,我能够发现 4 种不同类型的组:经济组、种族组、教育评级组和测试组。例如,属于经济组的特征包括学校收入估计(数值)和经济需求指数(数值),它们用于识别公立学校的经济状态。

在最终的模型中,我删除了最多的特性是测试。这些特征包括参加专门高中入学考试(SHSAT)的学生总数。在第一次分析中,我包括了所有这些功能,但后来发现它们并不能帮助我们解决问题,也不能提高模型的性能。我将只包括测试的平均分数(ELA 和数学测试),但不包括参加测试的学生人数。

  • 学生成绩等级的分布最初是什么样子的?

通过查看学生成绩等级的分布,我意识到需要做一些清理工作。数据中只有 6 所学校没有达到学生成绩的目标,相比之下,超过 600 所学校达到了目标。由于只有少数学校没有达到目标,模型很难做出预测。因此,我决定将未达到目标的值改为接近目标,因为在现实中,它们都是:A)未达到学生成绩的目标,B)努力达到目标(嗯,至少我希望是这样)。其他特性也有 4 个评级等级(未达到目标、接近目标、达到目标、超过目标)、,因此也对这些值进行了更改。做出这些改变后,学生成绩的分布如下所示:

目标和特征之间的关系

分析的下一步是寻找目标和特征之间的关系。为此,我绘制了一些密度图。通过按目标(学生成绩等级)给密度曲线着色,这显示了分布如何基于等级而变化。

在我看来,经济需求指数和学生成绩之间的关系是意料之中的。经济需求指数的值介于 0 和 1 之间,值越接近 1,意味着学校的经济需求越大。在这里,与其他评级相比,有更多经济需求指数值高的公立学校被评为接近目标。在这里,许多具有高经济价值指数(超过 0.8)的公立学校的学生成绩评级接近目标。换句话说,需要经济支持的学校没有良好的学生成绩。**

学校收入估计与学生成绩的关系与经济需求指数相同。许多估计收入较低(低于 5 万美元)的公立学校的学生成绩评级接近目标。

在进一步调查后,我发现学校预计收入超过 10 万美元的公立学校要么达到目标,要么超过目标。基于这些观察,我推测学校的收入/经济状况将在分析中发挥重要作用。

特征工程/选择

流程的下一步是对功能进行更改,以优化模型的性能。使用 one hot encoding ,具有百分比值的列从数值变为序数值,从 0 变为 3。例如,特征百分比西班牙裔的值为 23% (0.23)的观察值被更新为序数值 1,而相同特征的值为 88% (0.88)的观察值被更新为值 3。对所有具有百分比(数值)值的要素执行此操作可提高模型的准确性!

对于评分值为的特性,我还使用了一个热编码:接近目标:1,达到目标:2,超过目标:3。该程序还包括目标,即学生成绩评定。

分析的另一部分是查看特征之间的关系。经济需要指数和种族之间的关系显示出一种显著的模式:

在这里,我注意到经济需求指数因特定种族的学校而异。例如,西班牙裔人口较多的公立学校(3 分)被认为更需要财政援助。另一方面,白人比例较高(3 分)的公立学校似乎不太需要财政援助。

模型选择和测试

由于这是一个受监督的多分类机器学习分析,我创建了四个分类模型:

  • 随机森林分类器
  • 线性支持向量分类(LSVC)
  • 高斯朴素贝叶斯(GNB)
  • 线性判别分析(LDA)

公制

为了评估模型的预测,我使用了微 F1 分数。由于这是一个多类问题,我必须平均每个类的 F1 分数。同时也考虑到标签的不平衡。平均计算所有类别的假阳性、假阴性和真阳性的总数,然后使用这些计数计算精度、召回和 f 值

对数据进行 10 重交叉验证,对模型进行 10 次训练和测试,结果如下:

使用 10 重交叉验证,线性判别分析(LDA) 模型具有最高的微观 F1 分数,为 0.66(越高越好)。随机森林(RF)模型排名第二,得分为 0.62。(令人惊讶的)表现不佳的模型是高斯朴素贝叶斯(GNB),其得分大大低于其他模型。

使用随机森林模型,我对功能的重要性进行了排序,以查看顶级功能在分析中的帮助程度:

ELA 和数学考试的平均分数是最重要的特征。这是有道理的,因为学校的平均考试成绩越高,学校的学生成绩等级就越高。特征重要性的一个方面是两个基于经济的特征的高排名:经济需求指数和学校收入估计。种族特征在分析中很重要,但没有我想象的那么重要。

结论

以下是我从分析中学到的一些东西:

  • 收入水平较低的学校似乎需要改进。如果 PASSNYC 想要为学校提供资金/援助,他们应该关注经济困难的学校和少数族裔(黑人/西班牙裔)比例较高的学校
  • 学校的经济地位对学生的成就起着重要的作用:学校越需要经济,学校的成就越低
  • 学校的经济地位因学校的主要种族而异:学校的少数民族(黑人/西班牙裔)学生越多,其经济需求就越大
  • 与其他模型相比,线性判别分析(LDA)在这种多类机器学习分析中得分较高。

尽管最佳模型在预测纽约公立学校的学生成绩评级方面做得很好,但我在这个过程中了解到的一些问题可能会在未来的项目中帮助我:

  • 去更新型号选择/工程总是很棒的!尽管这个建议在几乎所有数据科学相关的资料中都有推荐,但我完全理解它的价值。Kaggle 提供的数据有 100 多个特征,我在最初的几个模型中使用过,但在回到选择/工程流程后,我删除了其中的大部分。这些功能可用并不意味着它们会有用。
  • 更多(非冗余)功能。提供的数据本可以有更有用的特征,如学校规模或师生比。这种类型的数据可能会提高我们模型的准确性。

请随时给予反馈或建设性的批评!:)还有,跟我上 推特

这篇文章使用的所有代码都可以在 GitHub 上找到,组织在这个笔记本上。

数据科学:诗人和官僚

原文:https://towardsdatascience.com/data-science-the-poet-and-the-bureaucrat-581fb9aeb649?source=collection_archive---------5-----------------------

我们都知道一个伟大的讲故事的人。这个人能够吸引他们的观众,引导他们进行一次愉快的冒险,吸引他们的喘息和不屈的关注。

但这是一种技能,它不仅仅是向你的朋友清楚地表达凌晨 3 点在麦当劳的那个疯狂的无家可归的人。在我的领域,数据科学,从数据中创造故事的能力是必不可少的。

在评论故事在数据科学中的重要性之前,我们先绕道。

故事的起源

从理性的管理者到放荡不羁的人,每个人都从他们所听到的故事中成长。为什么我们对他们如此崇拜?这种喜爱从何而来?

“小说是关于作为一个该死的人是什么样的。”——戴维·福斯特·华莱士

华莱士的断言是准确的,但不完整。

人类通过因果关系寻求解释。在我们对解释性理性的渴望中,我们经常犯下编造故事来解释现象的错误。太阳为什么会升起?因为赫利俄斯和你我一样醒来。为什么今年的庄稼比去年更丰收?因为今年我们为德米特里牺牲了更多的羔羊。

因此,小说和非小说之间的差异可能会变得模糊不清。有意识到自己是虚构的虚构,也有被描述为非虚构的虚构。希腊神(以及其他神)被认为是非虚构的,拥有支配自然的力量的实体。当人类为太阳升起的原因设计了一个更合理的故事——地球绕着太阳旋转——古代的神被嘲笑,一个新的故事诞生了。

在非虚构小说的情况下,由叙事墨水构成的“真相”在某种程度上远比冰冷事实中呈现的那些更有力量,无论所说的“真相”是否真实,尽管现代试图让我们的头脑更倾向于统计思维,但本能地,故事似乎更引人注目。

因此,是我们内在的对答案的渴望驱动了我们对故事的热情吗?部分是,但华莱士的断言仍然成立。回想一下你的成长经历。大多数健康的童年被认为伴随着大量的小说,这是有充分理由的。故事可以作为一种机制,教会我们这个世界是如何运转的;对手如何克服不祥的困境,尽管困难重重,但最终还是学到了一些东西。这样的故事有助于构建一种情感基础设施,通过这种基础设施,可以储存与情境相适应的反应,为未来与他人的互动创造先例。或者通俗地说,就是做一个该死的人。[注意:对于数据科学,性格发展和情感能力并不重要,但构建情节的能力至关重要]

那么它是从哪里开始的呢?故事从来没有源自任何特定的文化或文明,或者疯狂的吉姆·琼斯式的传教士。它们存在于整个人类历史进程中,从地球树的所有独立分支,我们不用交叉路径就可以讲述和重复故事——亚马逊部落的人就像阿拉斯加的爱斯基摩人一样讲述故事。

我们是一个高度社会化的物种,因此从进化的角度来看,讲故事在生理上根植于我们是有益的。对叙事的关注有助于我们了解这个世界和彼此。这种对故事的热爱说明了为什么故事占据中心舞台的媒介,如书面小说和通常的电影,几乎得到了普遍的赞赏(每个人都喜欢哈利波特),而音乐等媒介,大多数通过声音表达的故事都让位于旋律,则更加小众。

在实践中

那么,如何在数据科学领域将它付诸实践呢?答案很容易理解:表达从讲故事中提取的见解,你猜对了。

作为一名数据科学家,我的部分工作是试图将统计模型的输出及其见解翻译给利益相关者。从数据中提取真知灼见的能力只有在它们能够被清晰地表达出来,能够被理解并有希望付诸行动时才变得有用。

不管你有多兴奋,告诉一个没有 STEM 学位的人调整后的 R 为 log。注册。你刚才测试的模型超过 95%就像试图向一个五岁的孩子解释迪伦的《荒凉山庄》和艾略特的《荒原》之间的相似之处;用露骨的言语是做不到的。

为了向外行人呈现统计概念,你必须结合有说服力的叙述和见解来解释这些见解的含义以及它们为什么重要。正如我们所看到的,仅仅数字证据不足以影响人们——例如,西方世界对叙利亚战争看法的转变,不是因为被迫离开家园的难民人数而是因为一个库尔德儿童(艾伦·库尔迪)的形象,他和他的家人试图到达欧洲时,他的身体面朝下躺在沙滩上。尽你所能通过逻辑和推理来说服人们,但是除非你有好的叙述,否则你的工作通常是徒劳的。

像其他技能一样,讲故事是可以学习和提高的。一些你可能已经听过一百遍或者更多的高层次的建议:多读,多写,了解你的听众,多做报告。

要知道,在现代,很少有人有足够的注意力去阅读,视频是表达想法的主要媒介,所以要确保你的故事是视觉化的。如果他们做得好,他们会被记住。

记忆。说服力。订婚。

TL;博士:做一个诗人,而不是一个官僚。

评估 ico 的数据科学

原文:https://towardsdatascience.com/data-science-to-evaluate-icos-f5d59948f05a?source=collection_archive---------3-----------------------

投资 ICO 游戏

我最喜欢的一句话是约翰·梅纳德·凯恩斯的:“市场保持非理性的时间,可以超过你保持偿付能力的时间”。投资者可以在动荡的加密货币市场中赚(或赔)很多钱,并将他们的成功归功于技能。

因为我不投机,也不自称有任何“阅读”或把握市场时机的技能,所以我寻找区块链平台或应用程序的长期技术潜力。最终,该平台的成功取决于开发人员对该协议的采用,以及它支持广泛应用的能力。

因此,首要标准是技术的实力,以及团队在执行长期愿景方面的技术实力。由于这些协议需要被开发人员采用,一个公共 github 提供了大量的验证。我已经收集了一些顶级令牌的数据,并计算了质量分数。这表明了开发者社区的力量。我还为他们的白皮书打分,作为平台长期生存能力的指标。综合起来,我计算出“技术质量得分( TQS )”将 TQS 与市值进行比较,以了解市值是由基本面因素驱动还是由市场炒作驱动。

TQS 方法:TQS 是从 Github 中提取的统计数据的加权分数计算出来的:提交、贡献者、明星和观察者的数量,以及分叉和问题的数量。我手动评估了白皮书的分数,但我可以看到将来如何实现自动化,至少可以达到一级。最好的论文描述了协议、融合和安全性的理论证明、合理的治理和现实的技术实现。平庸的论文通常只是描述实现,没有声音证明或设计选择的优雅的理由。更糟糕的只是描述了一种意识形态或未来的路线图。

我使用机器学习方法来计算验证数据集的权重。在没有可用数据的情况下,例如当成员不是公共成员时,模型会考虑缺少的值(未设置为 0)。由于明显的原因,我没有公开确切的方法或验证集。权重经常被重新计算,以防止对统计数据的任何操纵。

我不太重视网络形象。这可能意味着一场强大的营销活动,以促进代币的购买,尤其是在技术基础薄弱的情况下。正如 Kevin Mehrabi 在他的文章中描述的那样,这些有时是诈骗 ico 的迹象。

我希望未来在模型中包含并自动化的内容:

  • 评分技术白皮书:自然语言处理可用于检查一个良好的协议描述,该协议描述具有收敛性和安全性、治理和技术实现细节的理论证明。此外,我们可以检查真正的创新,而不是从过去的白皮书中借鉴思想。
  • 用定理证明器和解算器验证数学证明
  • 对代码质量评分:这可以通过两种方式来完成,a)通过贡献者的 github 档案来查看他们的实力,b)检查代码创新,或者如果创建者只是对其他项目进行增量改进。

这种数据收集和评分可以自动进行,为注重价值的投资者提供实时更新。对于那些真正相信自己产品及其长期影响的有才华的技术人员,以下几点让我对他们的 ICO 更有信心:

  • 智力诚实:一个协议,从设计上来说,需要做出一些权衡。因此,它不能声称对每个应用程序都是好的。确保事务健壮性的协议将牺牲可伸缩性。例如,Tangle (IOTA)协议预先说明了其对物联网的假设和适用性。
  • 关于可伸缩性的基准:伸缩性能测试,以及性能下降的点。区块链开发者知道,显示 10 万 TPS 的结果,并声称它因此是稳健的 100 万 TPS,是不成立的。
  • 模拟:模拟多智能体系统是简单的,其中每个异构智能体遵循具有不同效用函数的协议。与可伸缩性基准一样,社区需要为协议开发人员创建开源平台来运行这些模拟。

奖励积分:

  • 经验证据:理论结果以及模拟结果并不遵循现实世界的轨迹,尤其是在交易涉及人员的情况下。由于行为偏差和有界计算,收敛和安全属性可能不成立。来自真实用例的经验结果更有分量。
  • 样本应用:以太坊在此大放异彩。他们使得用示例代码开发应用程序变得很容易,这使得许多开发人员来到他们的平台上。

2019 年数据科学趋势

原文:https://towardsdatascience.com/data-science-trends-for-2019-11b2397bd16b?source=collection_archive---------6-----------------------

发生了很多事情,2018 年发生了什么,2019 年看起来有什么前景?

这一年可以被认为是人工智能(AI)的蓬勃发展。看看那些标语中带有人工智能的创业公司的数量就知道了;大公司的收购集中在哪里;以及最大的科技会议的主题。人工智能无处不在——即使只是作为一个的流行语。但是人工智能到底是什么?那是一个相当难回答且有争议的问题。

Hype bag-of-words. Let’s not focus on buzzwords, but on what the beneath technologies can actually solve.

明确的是,数据科学正在解决问题。数据无处不在,我们对数据的利用越来越多,对社会的影响也越来越大。让我们关注数据科学,而其他人则对人工智能的最佳定义进行哲学思考。

当其他流行语保持繁荣时,数据科学怎么样了?

Interest for “data science” term since December 2013 (source: Google Trends)

兴趣一点都不差!我一直坚持认为数据科学不是一个时髦的词。即使对于现在加入数据科学的人来说——他们有很多——你只需要在 LinkedIn 上快速搜索工作,你会惊讶于提供的数量。让我们先来看看 2018 年发生了什么,然后关注 2019 年的热点话题。

今天

去年,我发表了一篇文章,阐述了我对 2018 年数据科学趋势的预期。我提到的主要发展是:工作流的自动化、可解释性、公平性、数据科学的商品化以及特征工程/清理工具的改进。

关于自动化,数据科学家的工作通常是他们自己工作的自动化。如今,公司开源自己的自动化管道非常普遍。其他的,只是继续卖,但是每天都有更多的竞争(例如,微软 AzureH2O数据机器人谷歌)。幸运的是,数据科学是一门横向学科,医疗保健中使用的相同算法经过一些调整也可以用于农业。因此,如果一家公司在一个垂直领域失败了,他们的发展可以很快适应另一个领域。

这些工具正成为常规的商品,你甚至不需要知道如何编码就能使用它们。其中一些诞生于几年前数据科学人才的匮乏,后来变成了有利可图的产品。这让人想起了返工书的原则之一——卖掉你的副产品。

Ways to make humans trust machines are being paved (image by rawpixel)

可解释性公平性在 2018 年有了很大的发展。现在有更多的可用资源。仅仅是 Python alpha 版本的工具已经成熟(例如 SHAP )。此外,你可以很容易地找到关于这个主题的结构化和支持性的书籍,如 Christoph Molnar 的可解释机器学习书。通过减少障碍,理解高度复杂的模型正朝着正确的方向前进——谷歌的 假设工具 就是一个很好的例子。

特征工程仍然是数据科学解决方案的主要秘密武器之一——看看 Kaggle 中关于家庭信用违约风险获胜解决方案的描述。虽然许多最好的特征仍然是手工创建的,但是特征工具成为今年主要的特征工程库之一,为懒人(聪明?)数据科学家。这些工具的问题是,您需要在整个业务中有数据标准,也就是说,如果您的一个客户端以一种格式交付数据,您应该确保第二个客户端遵循相同的过程,否则,您将有许多不希望的手工工作。

最后,如果我们给编程语言颁发奥斯卡奖, Python 可能会收到其中一些。根据 Stack Overflow 的说法,连续第二年成为增长最快的主要编程语言和最受欢迎的语言。按照这种速度,它正迅速成为使用最多的编程语言。

明天

那么,下一步是什么?还能做什么?

上述主题大有可为。在 2019 年和接下来的几年里,它们将继续成为数据科学家的一些主要关注点。重点将放在成熟的技术上,同时回答以下问题:

  • 我们如何最大限度地减少数据科学家在数据清理和功能工程上花费的时间?
  • 我们如何在机器学习的背景下定义信任
  • 如果说一个机器模型是公平的,那么它的特点是什么?

What are the principles according to which we can say that we trust a robot? (image by Andy Kelly)

但是,除了这些难以回答的元问题之外,还有什么有希望的话题呢?

强化学习在它的一生中可能经历了许多寒冬。然而,看起来我们正在接近另一个春天。一个很好的例子就是 Dota 2 中的精彩表现。有很多事情要做,需要大量的计算能力……但是,无论如何,强化学习是我们目前最像人类的学习行为,看到它的应用令人兴奋。

我们很可能会看到这些概念验证变成实际的产品。如果你有时间,看看它们,用 OpenAI gym 来开发它们。

GDPR 的叙文 71:数据主体应该“有权……获得对所作决定的解释……并对决定提出质疑。”

通用数据保护法规 (GDPR)自 2018 年 5 月 25 日起在欧盟生效,并直接影响数据科学。问题是:企业仍在理解这一新规定的局限性。两个主要的开放主题是:

  • 数据隐私。错误处理个人数据的公司现在面临巨额罚款的威胁。这是否意味着获取数据对于研究来说将变得更加困难?我们会看到数据综合的新发展吗?我们能真正做到匿名化数据吗?
  • 解释权 。完全自动化的决策必须是可解释的。嗯,那很好…但是“可解释的”实际上是什么意思呢?我们会看到机器学习可解释性算法的标准化吗?欧盟实体对此没有给出答案——我们可能只是在等待有史以来最大的一笔罚款被执行。

可信的人工智能有两个组成部分:(1)它应该尊重基本权利、适用的法规以及核心原则和价值观,确保“道德目的”,以及(2)它应该在技术上强大和可靠,因为即使有良好的意图,缺乏技术掌握也可能造成无意的伤害[ 欧盟人工智能伦理 ]

随着算法对社会的影响越来越大,我们有权确保偏见得到缓解,并且它们的使用是为了整体而不是少数人的利益。幸运的是,公司和机构正在致力于此。欧盟人工智能伦理草案和谷歌人工智能原则就是很好的例子。伦理还有很长的路要走,但它现在是一个经常讨论的话题——这很好。

EU’s draft on AI ethics is an example on how governmental institutions are tackling the subject.

随着算法变得越来越复杂,更多的数据随时可用(现在每个小工具都会产生数据,对吧?),使用笔记本电脑进行数据科学研究的人会越来越少。我们将使用基于云的解决方案,即使是最简单的项目(例如 Google Colab )。时间是稀缺的,GPU 不是…笔记本电脑的发展速度不够快,无法跟上所需的计算能力。

Google Colab: making it easier to share notebooks and using more computational power.

现在,假设你看到一家公司有一个“工程师”的职位空缺——就是这个。那太好了…但是现在有 100 种工程师。是机械工程师吗?航天?软件?“工程师”太通才了。

一两年前,公司会发布一个“数据科学家”的职位空缺。嗯,开始觉得不完整。如果你在这个领域刚刚起步,成为一名普通数据科学家可能会太难了。在掌握了这个领域之后,你最好专注于一个特定的主题。以网飞为例,它有九个数据角色:

Netflix data roles (source: Netflix Tech Blog)

有许多以前不存在的专业领域,数据科学家专注于一个领域来表明立场,这对于 T2 来说变得越来越重要。如果你还没有找到你自己的,现在是时候了。在我看来,数据工程技能是未来几年最有趣的技能。如果你的团队中没有他们,你可能只是在 Jupyter 笔记本上玩数据科学。公司也意识到了这一点。

2019 年将再次成为令人惊叹的一年。有很多事情要做,这不仅仅是技术和书呆子!真正需要解决的问题正在等待着。

作为结束语,记住时间是我们最大的财富。你花在做无价值的事情上的每一秒钟,都是你没有做伟大的事情而失去的一秒钟。选择你的话题,不要认为你的工作是一切照旧。

雨果·洛佩斯

使用无监督学习的数据科学&天文学数据的可视化

原文:https://towardsdatascience.com/data-science-using-unsupervised-learning-visualization-of-astronomy-data-b6b1c61f6922?source=collection_archive---------23-----------------------

复杂数据的简单可视化使其背后的科学变得显而易见。

上图是埃德温·哈勃爵士在 1929 年绘制的数据图,显示星系越远,离我们越远,也就是红移。

随着我们绘制更多已知宇宙区域的地图,我们发现了最大尺度的惊人结构。在 2 或 3 维地图中可视化这种结构让我们直观地掌握宇宙中星系的组成和性质,以及创造这种结构的力量。

有大量的公共数据可用于科学研究,如斯皮策 S4G 数据——星系内恒星结构的调查。这是一些星系的斯皮策数据集片段。

SPITZER S4G Data of Galaxy Clusters

  • mstar(太阳质量):log10(恒星质量)
  • 在 Eskew 等人(2012 年)的校准中使用单克隆抗体 1 和单克隆抗体 2
  • c31 _ 1:3.6 微米时的 r75/r25 浓度指数
  • c42 _ 1:3.6 微米时的 5*log10(r80/r20)浓度指数
  • phys_size:单位为 KPC(千秒差距)。1 秒差距= 3.26 光年
  • mabs1 和 mabs 2:3.6 和 4.5 微米处光波长的绝对幅度。

注:R75 和 R25 分别是封闭光度为 75%和 25%时的半径

如需更多参考资料,请查阅:

[## S4G 目录定义

S4G 目录提供了来自 IRAC 图像的光度学和模型参数,以及一个到摘要的链接…

irsa.ipac.caltech.edu](https://irsa.ipac.caltech.edu/data/SPITZER/S4G/gator_docs/s4g_colDescriptions.html)

这些星系的样本描述可以在维基百科上找到:

[## NGC 4725 -维基百科

NGC 4725 是一个中等棒旋星系,有一个突出的环状结构,距离我们大约 4000 万光年

en.wikipedia.org](https://en.wikipedia.org/wiki/NGC_4725) [## NGC 4707 -维基百科

NGC 4707 具有 Sm 或 Im 的形态类型,这意味着它大部分是不规则的或具有非常弱的旋臂。的…

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

做一个散射矩阵图可以快速给出上述参数之间的关系,如星系的物理大小和恒星质量。

使用像 PCA 和 t-SNE 这样的无监督学习可以进一步帮助评估这些数据。

这是该数据与 6 个参数的 PCA 图。

结果是双峰的。主成分分析根据椭圆型(红色)和螺旋型(蓝色)对星系进行聚类

另一种方法是绘制具有各种困惑值的 t-SNE 无监督学习算法。这里尝试的不同值是 5、10、15、30、40 和 50。

这些绘图与主成分分析相一致。我们可以进一步放大以选择该数据中的一个口袋。选择一部分数据用于进一步分析。

绘制 30 个星系的选择性数据的 mstar & phys_size,对照它们的形态类型代码“t”(参考:https://en . Wikipedia . org/wiki/Galaxy _ morphologic _ class ification))显示:

结论显示,我们在 30 个星系中发现的星系高度集中,并且具有较低的恒星质量。

今年 4 月 25 日,盖亚公布了它的 DR2 档案。我在浏览这个档案时,无意中发现了这个视频。

基于以上学习的一些快速绘图给出了以下可视化

基于有限弧数据的造父变星可视化。造父变星是测量空间距离的烛台。由于每种造父变星的光度都是恒定的,因此很容易推断它们离地球的距离。赤经和赤纬是位置坐标。赤经是从太阳三月分点开始,沿着天赤道向东测量的特定点的角距离。赤纬是天赤道以北或以南一点的角距离。

Above visualization shows the placement of various Cepheid between 73 & 80 RA and -65 and -67 Decl.

使用 python 中的 Bokeh plot 绘制 GAIA 系外行星数据,包括相对于地球的半径和质量。

还有许多其他参数,如亮度、温度等,可以从这些数据中可视化。在我的下一篇文章中,我计划通过从这些数据中创建一些可视化和推论来向开普勒致敬,并在 2019 年迎接苔丝。

一个更一致和更深入的倡议可以促进天文学家、统计学家、数据科学家和信息与计算机专业人员之间的合作,从而有助于加快我们对周围空间的了解。

数据科学#天文学#盖亚

Dhaval Mandalia 喜欢数据科学、项目管理、培训高管和撰写管理战略。他也是古吉拉特邦管理协会社区的贡献成员。在推特和脸书上关注他。

参考资料:

盖亚档案:【https://gea.esac.esa.int/archive/

斯皮策数据:https://irsa.ipac.caltech.edu

Python 数据科学:Matplotlib 数据可视化简介

原文:https://towardsdatascience.com/data-science-with-python-intro-to-data-visualization-and-matplotlib-5f799b7c6d82?source=collection_archive---------1-----------------------

介绍

当数据科学家处理数据时,数据通常存储在 CSV 文件、excel 文件、数据库和其他格式中。此外,这些数据通常作为熊猫数据帧加载。为了简化示例,我将使用包含我们数据的 Python 列表。我假设您对 Python 数据类型、函数、方法和包有所了解。如果你没有这方面的知识,我建议你阅读我之前的文章,它涵盖了这些话题。

数据可视化

数据可视化是数据分析中非常重要的一部分。您可以使用它来浏览您的数据。如果你很好地理解你的数据,你将有更好的机会找到一些见解。最后,当你发现任何见解时,你可以再次使用可视化来与他人分享你的发现。

比如看下面好看的剧情。这张图显示了 182 个国家在 2015 年的预期寿命和收入。每个泡泡代表一个国家,颜色代表一个地区,大小代表那个国家的人口。

Life Expectancy vs Income in the 2015 year. Source: https://www.gapminder.org/downloads/updated-gapminder-world-poster-2015/

如果你对使用的数据来源感兴趣,你可以在这里找到更多信息。此外,这张图表还有一个很棒的互动版本在这里,你可以玩历史时间序列,搜索某个国家,改变轴上的数据等等。这里的是一个展示如何使用这个交互式图表的视频。

然而,这里的想法是学习数据可视化和 Matplotlib 的基础知识。所以,我们的情节会比那个例子简单得多。

基本可视化规则

在我们看一些类型的情节之前,我们将介绍一些基本规则。这些规则帮助我们做出好的、有信息的情节,而不是令人困惑的。

  • 第一步是选择合适的绘图类型。如果有各种选项,我们可以尝试比较它们,选择最符合我们模型的一个。
  • 第二,当我们选择你的绘图类型时,最重要的事情之一是标记你的轴。如果不这样做,剧情信息量就不够。当没有轴标签时,我们可以试着查看代码,看看使用了什么数据,如果幸运的话,我们可以理解这个图。但是如果我们只是将情节作为一个图像呢?如果我们把这个情节给你那个不懂 Python 制作情节的老板看呢?
  • 第三,我们可以加一个标题,让我们的剧情更加翔实
  • 第四,需要时为不同类别添加标签
  • 五、可选地,我们可以在有趣的 数据点添加文本或箭头。
  • 六、在某些情况下我们可以使用一些数据的大小颜色来使情节更具信息性。

Matplotlib 的可视化类型和示例

有许多类型的可视化。最著名的有:线图散点图柱状图箱线图条形图饼图。但是在这么多选择中,我们如何选择正确的可视化呢?首先,我们需要做一些探索性的数据分析。在我们知道数据的形状、数据类型和其他有用的统计信息之后,选择正确的可视化类型将会更加容易。顺便说一下,当我使用“绘图”、“图表”和“可视化”这些词时,我指的是同一个意思。在这里,我发现了一个对图表建议有用的图片。

Python 中有很多可视化包。其中最著名的是 Matplotlib。它可以用在 Python 脚本、Python 和 IPython shells、Jupyter 笔记本和 web 应用服务器中。

在我们开始定义和例子之前,我想向您展示一下matplotlib.pyplot子包的一些基本功能,我们将在下面的例子中看到。这里,我假设matplotlib.pyplot子包是用别名plt导入的。

  • plt.title(“My Title”)将为您的剧情添加一个标题“我的标题”
  • plt.xlabel(“Year”)会在你的 x 轴上加一个标签“年份”
  • plt.ylabel(“Population”)将在您的 y 轴上添加一个标签“人口”
  • plt.xticks([1, 2, 3, 4, 5])将 x 轴上的数字设置为 1,2,3,4,5。我们也可以传递和标签作为第二个参数。例如,如果我们使用这个代码plt.xticks([1, 2, 3, 4, 5], ["1M", "2M", "3M", "4M", "5M"]),它将在 x 轴上设置标签 1M、2M、3M、4M、5M。
  • plt.yticks() -与plt.xticks()相同,但针对 y 轴。

线形图 : 一种类型的图,将信息显示为一系列由直线连接的数据点称为“标记”。在这种类型的绘图中,我们需要测量点按排序(通常按其 x 轴值)。这种类型的绘图通常用于可视化时间间隔内的数据趋势,即时间序列
用 Matplotlib 做一个线图,我们调用plt.plot()。第一个参数用于横轴上的数据,第二个参数用于纵轴上的数据。该函数生成您的图,但不显示它。为了显示绘图,我们需要调用plt.show()函数。这很好,因为我们可能想在显示它之前给我们的图添加一些额外的定制。例如,我们可能想要为绘图的轴和标题添加标签。

Simple Line Plot

散点图:这种类型的图显示所有单个数据点。在这里,它们不用线连接。每个数据点都有 x 轴值和 y 轴值。这种类型的图可用于显示趋势或相关性。在数据科学中,它显示两个变量如何比较。
要用 Matplotlib 制作散点图,我们可以使用plt.scatter()函数。同样,第一个参数用于横轴上的数据,第二个参数用于纵轴上的数据。

Simple Scatter Plot

直方图:数值数据分布的精确表示。要创建直方图,首先,我们将整个数值范围分成一系列区间,然后,我们计算每个区间内有多少数值。间隔也被称为。箱是变量的连续且不重叠的区间。它们必须相邻,并且通常大小相等。
要用 Matplotlib 制作直方图,我们可以使用plt.hist()函数。第一个参数是数字数据,第二个参数是箱的数量。bins参数的默认值是 10。

Simple Histogram

Simple Histrogram Ouput

从上面的直方图中我们可以看到:

  • 5 个介于 0 和 3 之间的值
  • 3 介于 3 和 6 之间的值(包括 3 和 6)
  • 2 介于 6(不含)和 9 之间的值

盒图,也叫****盒须图:一种显示基于五位数汇总的数值分布的方式:最小值第一个四分位数中值第三个四分位数最大值

  • ****最小值最大值只是我们数据中的最小值和最大值。
  • ****中位数是将数据的上半部分与下半部分分开的值。按以下步骤计算:对你的值排序,找到中间的那个。在我们的数值计数是偶数的情况下,我们实际上有 2 个中间数,因此这里的中值是通过将这 2 个数相加并将和除以 2 来计算的。例如,如果我们有数字1, 2, 5, 6, 8, 9,你的中值将是(5 + 6) / 2 = 5,5
  • ****第一个四分位数数据值的中值,位于有序值中值的左侧。例如,如果我们有数字1, 3, 4, 7, 8, 8, 9,第一个四分位数是1, 3, 4值的中值,所以是3
  • ****第三个四分位数数据值的中间值,在我们的有序值中间值的右边。例如,如果我们再次使用这些数字1, 3, 4, 7, 8, 8, 9,第三个四分位数是8, 8, 9值的中值,所以是8
  • 这里我还想再提一个统计。那就是 IQR(四分位间距)IQR 近似于数据中间 50%的扩散量。公式第三个四分位数——第一个四分位数。****
  • 这种类型的图也可以显示异常值。离群值是位于总体模式之外的数据值。它们被可视化为。当我们有异常值时,最小值最大值被视为非异常值的最小值和最大值。有许多方法可以识别什么是异常值。一个常用的规则是,如果一个值比第一个四分位数-1.5 * IQR或比第三个四分位数1.5 * IQR,那么这个值就是异常值。************

哇!那可是强大的剧情不是吗?让我们看一个例子来更好的理解剧情。

Box Plot. Source: http://www.physics.csbsju.edu/stats/box2.html

现在,当我们有了一些关于盒图的知识,我们可以看到用 Matplotlib 创建这个图是非常容易的。我们需要的只是函数plt.boxplot()。第一个参数是数据点。

Simple Box Plot

Simple Box Plot Output

在这个例子中,值1, 2,21异常值,最大值10,最小值5。并且,的意思是就是7。****

如果不是什么都懂也不用担心。我写了很多关于这个的信息。我还想分享一个免费可汗学院课程叫做“汇总量化数据”。本课程涵盖了箱线图的许多细节。当你完成这门课程后,你会更容易理解这种类型的情节。

条形图:用矩形条表示分类数据。每个条形的高度与其代表的值相对应。当我们想要比较不同类别的给定数值时,这很有用。它也可以与 2 个数据系列一起使用,你可以在这里找到更多信息
要用 Maplotlib 制作条形图,我们需要plt.bar()函数。

Simple Bar Chart

Simple Bar Chart Output

从这个例子中,我们可以看到不同编程语言的用法是如何比较的。请注意,一些程序员可以使用多种语言,因此这里的百分比总和不是 100%。

饼状图:圆形图,分成若干片以显示数字比例。它们在商界被广泛使用。然而,许多专家建议避开它们。主要原因是很难比较给定饼图的各个部分。此外,很难跨多个饼图比较数据。在许多情况下,它们可以用条形图代替

我们在看饼状图的时候会做角度判断,但是角度判断的不太好。-娜奥米·罗宾斯

作为一个例子,我们将看到饼状图和条形图上的数据,代表每种特定类型的葡萄酒的收入百分比。查看饼图,并尝试按照从大到小的顺序排列切片。你有什么麻烦吗?

Wines revenue using a pie chart. Source: http://www.perceptualedge.com/articles/08-21-07.pdf

现在,我们可以看到同样的数据显示在条形图上。这乘以收入百分比很容易比较。

Wines revenue using a bar chart. Source: http://www.perceptualedge.com/articles/08-21-07.pdf

你可以找到更多关于“为什么饼图不好?”来自本文档的问题。

用 Matplotlib 做饼状图,可以用plt.pie()函数。autopct参数允许我们使用 Python 字符串格式显示百分比值。

Simple Pie Chart

我的其他博客文章

你也可以看看我以前的博文。

时事通讯

另外,如果你想在我发表新的博客文章时得到通知,你可以订阅我的最新时事通讯。当我找到一些额外的资源时,我会很乐意在整个过程中与您分享。

商务化人际关系网

这是我在 LinkedIn 上的简介,如果你想和我联系的话。我将很高兴与你联系在一起。

最后的话

谢谢你的阅读。我希望你喜欢这篇文章。如果你喜欢,请按住拍手键,分享给你的朋友。我很高兴听到你的反馈。如果你有什么问题,尽管问。😉

使用 Python 的数据科学:使用 pandas 加载、子集化和过滤数据简介

原文:https://towardsdatascience.com/data-science-with-python-intro-to-loading-and-subsetting-data-with-pandas-9f26895ddd7f?source=collection_archive---------1-----------------------

Source: https://www.star-spain.com/en/blog/transittermstar-nxt-tooltips/filtering-data-records-termstar-nxt

介绍

作为数据科学家,我们经常处理大量数据。我们想要加载的数据可以用不同的方式存储。最常见的格式是 CSV 文件Excel 文件数据库。此外,数据可以通过 web 服务获得。当然还有很多其他的格式。为了处理数据,我们需要用一个表格结构来表示它。任何表格形式的东西都排列在一个有的表格中。

在某些情况下,数据已经是表格了,很容易加载。在其他情况下,我们处理非结构化数据。 非结构化数据 不是以预定义的方式组织的(纯文本图像音频网页)。在这篇文章中,我们将着重于从 CSV(CommaSseparatedValues)文件中加载数据。

熊猫

Pandas 是 Wes McKinney 开发的 Python 编程语言的开源库。这个库非常高效,提供了易于使用的数据结构和分析工具。

数据帧

Pandas 包含一个用于数据操作快速高效对象,称为 DataFrame。熊猫的一个常用别名是pd。该库可以加载许多不同格式的数据。当我们的数据是干净的和结构化的,每一行代表一个观察,每一列代表一个特征。行和列可以有标签

在下面的例子中,为了更好地理解我们正在改变的东西,我将用透明矩形标记一些部分。此外,为了简单起见,我们将使用数据集中非常小的子集。该数据集包含给定国家和年份的移动电话用户。完整数据可在这里找到。我事先做了一些清理,使数据整洁。

这是我们想要加载到 Pandas 数据框架中的数据。它被上传到 GitHubGist web 应用程序中,并在这里以表格结构显示出来。不过,我们可以在这里看到它的 raw 格式。同样,我们可以看到这个文件包含了 c omma s 单独的 v 值。

为了加载这些数据,我们可以使用pd.read_csv()函数。

Loading data from a CSV file.

为了创造这些例子,我用了一个 Jupyter 笔记本。如果代码单元格中的最后一行包含值,则打印该行。所以,这就是为什么我把变量cellular_data放在例子的最后一行。

我们可以看到数据已加载,但有些奇怪。这个Unnamed: 0栏目是什么?我们的 CSV 文件中没有这样的列。在我们的例子中,这一列包含数据的行标签 ( 行索引),我们必须告诉熊猫。我们可以使用index_col参数做到这一点。

Loading data from a CSV file using index_col

在其他情况下,我们的数据可以是而没有行标签。在这些情况下,熊猫会从0开始到rows — 1的长度自动生成这些标签。让我们看看没有行标签的相同数据的例子。

Loading data from a CSV file.

现在我们的数据帧看起来很好。有时,我们希望更改行标签,以便以后更容易地处理数据。在这里,我们可以将行标签设置为每行的国家代码。我们可以通过将熊猫数据帧的index属性设置为一个列表来实现。列表的长度和行的长度必须与相同。之后,我们可以很容易地对我们的数据进行子集划分,或者使用国家代码查看给定的国家。

在许多情况下,我们不希望手动设置索引,我们希望索引是数据帧中的列之一。在这种情况下,我们可以使用 DataFrame 对象的方法调用set_index。注意 pandas 不会永久设置索引 ,除非我们告诉它。如果我们想永久地设置索引,我们可以使用inplace参数来实现。****

Setting the country column to be the index for our DataFrame.

Setting the country column to be the index for our DataFrame.

在上面的例子中,我们没有告诉熊猫永久设置索引,当我们打印cellular_data数据帧时,我们看到索引没有改变。让我们用inplace参数再试一次。

Setting (inplace) the country column to be the index for our DataFrame.

现在,我们可以清楚地看到,当我们使用inplace = True时,我们的数据帧的索引永久地改变。****

索引和选择数据

有许多方法可以从数据框中选择数据。在这篇博文中,我们将看到如何使用方括号和方法 lociloc 来实现这一点。

使用方括号,您可以从行中选择选项,也可以从列中选择选项。对于一个行选择,我们可以使用一个索引列表或者一个切片。我们可以像这样使用切片来选择行:sliceable[start_index:end_index:step]

end_index 不包含。我已经在之前的一篇名为数据科学 Python 基础的博客文章中写过关于切片的内容。可以快速看一下“子集列表部分了解一下。虽然那里的例子都是带列表的,这里的想法是一样的。我们这里只使用数据帧,它们也是可切片的

Select all rows.

Select the first 2 rows.

Select the all rows from the third to the end.

Select the second row.

对于一个选择的列,我们可以使用一个包含所需列表。如果我们只将一列作为字符串而不是列表传递,结果将是 熊猫系列 。熊猫系列是一个一维数组,可以标为。如果我们将 2 个或更多系列粘贴在一起,我们将创建一个数据框架。在某些情况下,我们可能只想选择一列,但将数据保存在 DataFrame 中。在这种情况下,我们可以传递一个只有一个列名的列表。

Select the “country” column only as series.

Select the “country” and “cellular_subscriptions” columns.

****方括号很有用,但是它们的功能有限。我们可以从给定的数据帧中只选择。在许多情况下,我们需要同时选择列和行。 lociloc 方法给了我们这种能力。

loc 方法允许我们根据标签选择数据的行和列。首先,你指定左侧的行标签 ,然后你指定右侧的列标签iloc 允许我们做同样的事情,但是基于我们数据帧的整数位置**。**

如果我们想选择所有的行或列,我们可以简单地输入:来选择行或列。同样,如果我们想要选择特定行所有列,我们可以只传递行标签

用例子理解比较容易,那就来看一些吧。在这些例子中,我们将比较这两种方法的用法。

Select the first row as Series.

Select the first row as DataFrame.

Select the rows for Bulgaria and Romania.

Select the rows for Russia and the United Kingdom and the “year” and “cellular_subscriptionscolumns.

Select all the rows and the “year” and “cellular_subscriptionscolumns.

Select the all the columns and the rows for Bulgaria, Russia, and Denmark.

Python 中的比较运算符

****比较运算符可以告诉我们 2 个值如何将相互关联。在很多情况下, Python 无法告诉我们不同类型的 2 个值如何相互关联,但也有一些例外。比如我们可以比较浮点数和整数。需要记住的是,我们可以比较布尔值和整数。True对应 1False对应 0 。这些运算符非常简单。

The comparison operators in Python.

让我们看一些非常简单的例子。

Simple Comparison Operators

过滤熊猫数据帧

比较运算符可用于熊猫系列。这可以帮助我们根据特定条件过滤我们的数据。我们可以对序列使用比较运算符,结果将是一个布尔序列。如果满足条件,这些系列的每一项将为True,否则为False。有了这些布尔序列后,我们可以应用一个行选择来得到一个过滤后的数据帧。

Creating a boolean series called is_small_subscr

注意,我们已经使用了的另一种语法在这里得到了** cellular_subcription DataFrame[column_name]DataFrame.column_name代码块返回相同的结果。**

但是,要小心使用点语法(在这些示例中使用),因为您的列可能与 DataFrame 的方法同名。例如,如果我们有一个名为“ min ”的列,我们就不能使用点语法从该列中获取值。那是因为 DataFrame 对象有一个名为“ min ”的方法。现在让我们看看如何使用上面的布尔序列来过滤我们的数据帧。

Filtering the DataFrame using the boolean series from the previous example

让我们看另一个例子。假设我们希望获得所有记录,其中国家英国。****

Get all records where the country is the United Kingdom

布尔运算符

既然我们知道了如何生成满足某些条件的布尔序列,我们现在可以对它们使用布尔运算符来创建更多的复杂过滤

3 种类型的布尔运算****

  • ——取 2 个布尔值,如果都是则返回**True** **True**。这个操作符是一个短路,如果第一个参数是**True**,它只计算第二个参数。
  • -取 2 个布尔值,如果中至少有一个为 T1,则返回**True**。这个操作符也是一个短路符**,如果第一个参数是**False**,它只计算第二个参数。**
  • ——取一个布尔值,返回对面的。该运算符优先级低于非布尔运算符。例如,not x == y被解释为not (x == y),而x == not y是一个语法错误。还有就是当我们需要组合不同的布尔运算然后想要对结果求反时常用的。********

Simple Boolean Operations

多条件子集化

当我们想要通过多个条件过滤我们的数据帧时,我们可以使用布尔运算符。这里需要注意的一点是,当我们想要对熊猫使用布尔运算符时,我们必须如下使用它们:

  • &用于和****
  • |或****
  • ~而非****

当我们对两个大小相同的布尔序列应用布尔运算时,布尔运算将适用于每一对。

使用“与”运算符

我们可以看到 pandas 不使用and操作符,它需要**&**操作符。现在,让我们再试一次。这里的目标是只得到那些多于** 240 乘客 少于 300 乘客的航班。**

使用“或”运算符

让我们找出所有低于** 200 大于 375 名乘客的航班。记住,对于操作符,我们使用管道 **|** 字符。**

使用 not 运算符反转条件

在某些情况下,我们希望否定我们的条件。在这种情况下,我们可以使用而不是操作符。对于这个操作符,我们使用波浪号** **~** 字符。**

假设我们想得到 11 月的而不是** 的所有航班。**

复杂条件

我们可以基于非常具体的条件进行更加复杂的过滤

让我们看看 1952 年和 1954 年 11 月 22 日在 T21 的所有航班。

现在,让我们得到 1952 年和 1954 年之间的所有航班,月份是八月或九月。

isin 方法

假设我们想要比较单个列与多个值的相等。假设我们想要得到以下月份的所有航班:二月八月九月。实现这一点的一种方法是像这样使用多个or条件。****

有一个重复码这是繁琐的。使用**isin**方法还有一种更好的方法可以达到同样的效果。我们需要传递一个列表或者设置给这个方法,它将返回想要的布尔序列。****

当然,我们可以把这个方法返回的布尔级数和其他布尔级数组合起来。

假设我们想得到 1954 年和 2 月8 月9 月的航班。****

between 方法

当我们想要选择一个范围内的值时,这个方法可以使我们的代码更干净。代替的写法 2 布尔条件,我们可以用这个方法。

假设我们想要得到 1955 年到 1960 年之间的所有航班

********

同样,我们可以将这种方法与另一种条件过滤相结合。

让我们得到所有在 1955 年和 1960 年之间并且在 10 月的航班。

isnull 和 isna 方法

这个**isna**方法指示值是否缺失(数值数组中的**NaN**,对象数组中的**None****NaN**,datetimelike 中的**NaT**)。**isnull**方法是**isna**方法的别名。这意味着这两种方法完全相同,但是名称不同。

我已经改变了我们使用的航班数据框架。在列中有一些**NaN**值。让我们来看看如何获取个月缺失的所有记录

****

在许多情况下,我们希望得到没有缺失值的数据。让我们设法得到没有错过月份的航班。我们可以使用带有**~** 字符not 运算符**isna**方法返回的布尔序列求反。****

notna 方法

还有一种方法叫**notna**。此方法是 **isna** 方法对面的。使用这种方法,我们可以获得与上一个示例相同的结果。****

通过一行中的条件进行子集设置

我们现在看到的所有例子都可以用一行写出来。有人喜欢,有人讨厌。当我们通过只设置一个条件时,在很多情况下,在一行中编写我们的过滤器会更好更容易。

我们先来看一个只有一个条件的子集化例子。

通过一行中的多个条件进行子集设置

在某些情况下,用一行写一个简单的表达式还行,但在另一些情况下,就非常不可读。我这里的建议是把简单的写一行复杂的写多行。如果你的行很长,它可能不可读,所以要小心。

使用.loc方法对布尔序列进行子集化。

还记得**.loc**法吗?我们可以用这种方法根据标签选择行和列。好的一面是我们可以传递布尔序列而不是传递行或列选择的标签,这样就可以了。

我们在上面的例子中使用的所有生成的布尔序列都可以传递给行选择。

注意,如果我们不使用** **loc** 方法进行列选择 ,那么的结果与使用方括号** **[]**进行子集化的是相同的。****

文章注释

为了简单起见,本文中使用的数据集非常小。实际上,我们需要处理的数据集要大得多。但是不管您是在处理 100 MB 还是 10 GB 的数据集,子集化总是一种有用的技术!

练习

我已经创建了一个 Jupyter 笔记本文件,里面有一些关于加载和子集化数据的练习。如果你想检查你的技能,你可以从这个库下载。该存储库还包含另一个 Jupyter 笔记本文件,其中包含解决方案

数据资源

我的其他博客文章

你也可以看看我以前的博文。

时事通讯

如果你想在我发表新的博客文章时得到通知,你可以订阅我的时事通讯

领英

这是我在 LinkedIn 上的简介,如果你想和我联系的话。

最后的话

谢谢你的阅读。你喜欢这篇文章吗?如果你喜欢,请按住鼓掌按钮👏并分享给你的朋友。

Python 数据科学:将条件循环转化为 Numpy 向量

原文:https://towardsdatascience.com/data-science-with-python-turn-your-conditional-loops-to-numpy-vectors-9484ff9c622e?source=collection_archive---------0-----------------------

矢量化技巧是数据科学家非常熟悉的,通常用于编码,以加速整体数据转换,其中简单的数学转换是在可迭代对象(如列表)上执行的。不太为人所知的是,对非平凡的代码块(如条件循环)进行矢量化也是值得的。

http://www.freepik.com" Designed by Harryarts / Freepik

Python 正迅速成为数据科学家选择的事实上的编程语言。但与 R 或 Julia 不同,它是一种通用语言,没有现成的函数语法来分析和转换数字数据。因此,它需要专门的图书馆。

Numpy ,简称数值 Python ,是 Python 生态系统中高性能科学计算和数据分析所需的基础包。它是几乎所有高级工具如 Pandasscikit-learn 构建的基础。 TensorFlow 使用 NumPy 数组作为基本的构建模块,在此基础上他们构建了用于深度学习任务的张量对象和 graphflow(在一个长列表/向量/数字矩阵上大量使用线性代数运算)。

许多 Numpy 操作都是用 C 实现的,避免了 Python 中循环、指针间接和每元素动态类型检查的一般开销。速度提升取决于您正在执行的操作。对于数据科学和现代机器学习任务来说,这是一个无价的优势。

我最近的故事展示了基于 Numpy 的简单数据转换任务矢量化的优势,引起了读者的兴趣也受到了读者的好评。关于向量化对代码简单性的效用,有一些有趣的讨论。

现在,基于一些预定义条件数学变换在数据科学任务中相当常见。事实证明,通过首先将简单的条件循环块转换成函数,然后使用numpy.vectorize方法,可以很容易地对其进行矢量化。在我之前的文章中,我展示了简单数学转换的 numpy 矢量化的速度提升数量级。对于目前的情况,加速没有那么显著,因为内部条件循环仍然有些低效。然而,与其他普通 Python 代码相比,执行时间至少有 20–50%的改进。

下面是演示它的简单代码:

import numpy as np
from math import sin as sn
import matplotlib.pyplot as plt
import time**# Number of test points**
N_point  = 1000**# Define a custom function with some if-else loops**
def myfunc(x,y):
    if (x>0.5*y and y<0.3):
        return (sn(x-y))
    elif (x<0.5*y):
        return 0
    elif (x>0.2*y):
        return (2*sn(x+2*y))
    else:
        return (sn(y+x))**# List of stored elements, generated from a Normal distribution**
lst_x = np.random.randn(N_point)
lst_y = np.random.randn(N_point)
lst_result = []**# Optional plots of the data**
plt.hist(lst_x,bins=20)
plt.show()
plt.hist(lst_y,bins=20)
plt.show()**# First, plain vanilla for-loop**
t1=time.time()
for i in range(len(lst_x)):
    x = lst_x[i]
    y= lst_y[i]
    if (x>0.5*y and y<0.3):
        lst_result.append(sn(x-y))
    elif (x<0.5*y):
        lst_result.append(0)
    elif (x>0.2*y):
        lst_result.append(2*sn(x+2*y))
    else:
        lst_result.append(sn(y+x))
t2=time.time()print("\nTime taken by the plain vanilla for-loop\n----------------------------------------------\n{} us".format(1000000*(t2-t1)))**# List comprehension**
print("\nTime taken by list comprehension and zip\n"+'-'*40)
%timeit lst_result = [myfunc(x,y) for x,y in zip(lst_x,lst_y)]**# Map() function**
print("\nTime taken by map function\n"+'-'*40)
%timeit list(map(myfunc,lst_x,lst_y))**# Numpy.vectorize method**
print("\nTime taken by numpy.vectorize method\n"+'-'*40)
vectfunc = np.vectorize(myfunc,otypes=[np.float],cache=False)
%timeit list(vectfunc(lst_x,lst_y))**# Results** Time taken by the plain vanilla for-loop
----------------------------------------------
**2000.0934600830078** us

Time taken by list comprehension and zip
----------------------------------------
1000 loops, best of 3: **810 µs** per loop

Time taken by map function
----------------------------------------
1000 loops, best of 3: **726 µs** per loop

Time taken by numpy.vectorize method
----------------------------------------
1000 loops, best of 3: **516 µs** per loop

请注意,我在任何地方都使用了% time itJupyter magic command来编写一行表达式。通过这种方式,我有效地运行了至少 1000 次相同表达式的循环,并平均执行时间以避免任何随机影响。因此,如果您在 Jupyter 笔记本上运行整个脚本,您可能会对第一种情况(即普通 for-loop 执行)产生略微不同的结果,但接下来的三种情况应该会给出非常一致的趋势(基于您的计算机硬件)。

有证据表明,对于这种基于一系列条件检查的数据转换任务,使用 numpy 的矢量化方法通常比一般的 Python 方法提高了 20–50%的速度。

这可能看起来不是一个巨大的改进,但每一点时间节省都会在数据科学管道中累积起来,从长远来看是值得的!如果数据科学工作需要这种转换发生一百万次,这可能会导致 2 天到 8 小时的差异。

简而言之,只要您有一个很长的数据列表,并且需要对它们执行一些数学转换,就应该考虑将这些 python 数据结构(列表、元组或字典)转换成numpy.ndarray对象,并使用固有的矢量化功能。

Numpy 提供了一个 C-API 来实现更快的代码执行,但是它带走了 Python 编程的简单性。这篇简洁的讲稿展示了你在这方面的所有相关选项。

一位法国神经科学研究者写了一整本关于这个主题的开源在线书籍。点击这里查看

如果您有任何问题或想法要分享,请联系作者在tirthajyoti【AT】Gmail[DOT]com。你可以查看作者的 GitHub 资源库 中其他有趣的 Python、R 或 MATLAB 代码片段和机器学习资源。此外,如果你像我一样对机器学习/数据科学/半导体充满热情,请随时在 LinkedIn 上添加我在 Twitter 上关注我

你需要知道的数据科学!A/B 测试

原文:https://towardsdatascience.com/data-science-you-need-to-know-a-b-testing-f2f12aff619a?source=collection_archive---------2-----------------------

这是 5 篇系列文章的第 2 部分,旨在快速介绍数据科学和数据分析中的一些核心概念,特别关注我认为被忽略或在其他材料中简单讨论过的领域。

这篇文章概述了 A/B 测试,以及计划和建立你自己的健壮的 A/B 测试的必要步骤。

这个职位适合从事产品开发的数据科学家,以及希望与数据科学家更好沟通的产品经理。

谦逊的 A/B 测试(在其他科学中也称为随机对照试验,或 RCT)是产品开发的有力工具。

除了可能是估计效果大小(以及 ROI)最准确的工具之外,它还能够为我们提供因果关系,这是数据科学中非常难以捉摸的东西!有了因果关系,我们终于可以平息“相关性与因果性”的争论,并证明我们的新产品确实有效。

假设你是亚马逊的首席执行官,并试图找出将你的网站重新安排成一种新的格式是否会影响转化率(即亚马逊的访问者成为客户的比例):

一种方法是对选定的客户运行两个版本,并仅根据这些数字做出判断:

在这种情况下,我们会得出结论,布局 B 优于布局 a。

然而,这种简单的方法有两个可能的错误,统计学学生对此非常熟悉:

  • 第一类错误——或者错误地认为你的干预是成功的(这里可能错误地认为布局 B 比布局 A 好)。也称为假阳性结果。
  • 第二类错误——错误地认为你的干预不成功。也称为假阴性结果。

这些错误源于我们在[上一篇文章](http://“Data science concepts you need to know! Part 1” https://towardsdatascience.com/introduction-to-statistics-e9d72d818745)中提到的一个问题;也就是说,试图从一个样本(在这种情况下,是参与我们布局试验的访问者)中得出关于人群(在这种情况下,是所有亚马逊客户)的结论。

A/B 测试将使我们能够准确地量化我们的效应大小和误差,从而计算出我们犯下 I 型或 II 型错误的概率。

我认为,只有当我们理解了我们的结果的真实影响大小和稳健性,我们才能继续做出商业影响决策。换句话说,一旦我们了解了我们的效果大小和误差,我们应该只估计新产品的 ROI(投资回报)。

输入统计数据:

这篇文章将概述 A/B 测试的设计原则,以及如何确保一个试验是有效的和经济的。我们将依赖于在我们的[上一篇文章](http://“Data science concepts you need to know! Part 1” https://towardsdatascience.com/introduction-to-statistics-e9d72d818745)中介绍的概念(统计功效和 p 值),所以如果这些需要更新,请随意返回一篇文章。

一旦你理解了数据科学中的 A/B 测试,你也会理解随机试验,它通常用于:

  • 医学,了解一种药物是否有效
  • 经济学,来理解人类行为
  • 外国援助和慈善工作(至少是有声望的),以了解哪些干预措施在缓解问题(健康、贫困等)方面最有效

A/B 测试的原则

我们可能会根据同事的问题或想法开始考虑 A/B 测试。例如,我们可能有预感贷款还款短信提醒将减少贷款违约。稍加努力,我们可以将这个问题转化为一个假设,然后进行 A/B 测试,评估新 SMS 系统带来的确切收益(或收益缺失)

为此,我们首先需要将我们的问题形成一个假设,然后我们需要制定出我们的随机化策略样本量,最后是我们的测量方法

假设

假设是描述您想要测试的关系的正式陈述。假设必须是一个简单、清晰且可测试的陈述(更多关于可测试性的内容见下文),将对照样本(如布局 A)与处理样本(如布局 B)进行对比。

为了形成一个假设,我们将“SMS 系统能改善还款吗”重新表述为两个陈述,一个无效假设和一个替代假设:

  • 零假设(H0):零假设通常表示治疗组和对照组之间没有差异。(换句话说,我们说我们的治疗结果在统计上与我们的控制结果相似)
  • 替代假设(H1):替代假设表明治疗组和对照组之间存在差异。(换句话说,治疗结果将在统计上不同于对照结果)

值得注意的是,假设应该包括参考被研究的 人口(Amazon.com 美国游客、伦敦银行客户等)、干预(网站布局 A 和 B、有针对性的贷款偿还短信)、比较组(比较什么)、结果(你将测量什么)以及时间(你将在什么点测量它****

P 人口增长, I 干预, C 比较, O 结果, T ime = PICOT 。在定义你的假设时,请记住 PICOT。

从我们的亚马逊例子中给出一个结构良好的假设的例子:

  • 零假设(H0):与接受布局 A 的游客相比,接受布局 B 的 Amazon.com 游客不会有更高的参观结束转化率
  • 另一个假设(H1):与接受版面 A 的游客相比,接受版面 B 的 Amazon.com 游客将有更高的最终转化率

请注意,上面清楚地说明了我们的 PICOT:

  • 人群:访问过 Amazon.com 网站的个人
  • 干预:新网站布局(布局 B)
  • 比较:访问者接收布局 A
  • 结果:转换率
  • 时间:Amazon.com 访问结束

我们可以将此与农业背景下的弱假设进行对比,例如:

  • H0:颜色好看的银行不会还贷
  • H1:颜色好看的银行会还贷

为什么这么糟糕?在继续阅读之前,花点时间思考一下。

  • “更好的颜色”没有明确的定义,我的好和你的好可能不匹配。这是 PICOT 的不良干预定义的一个例子
  • 什么银行?在哪里,什么级别?我们指的是银行分行吗,如果是,我们是研究世界各地的所有分行,还是只研究曼彻斯特市中心的分行?这是一个很差的人口规格
  • 我们如何衡量这一点?贷款违约率、逾期天数、分行总损失?这是来自 PICOT 的结果规范的一个例子。

强有力的假设将 A/B 测试结合在一起,并为设计和分析提供指导。你可以看到,上述假设对这些任务是没有用的。

随机化

回到我们的亚马逊例子,一旦我们有了一个良好的假设,我们就可以考虑随机化策略。为了扩展上面的例子,我们可以用两种方法随机选择我们的访问者:

  • 将游客随机分配到布局 A 或布局 B
  • 允许访问者选择加入新的布局测试版

这两种设置有什么不同?在我们回答这个问题之前,让我们检查一下为什么我们在 A/B 测试中随机化的原因。

A/B 测试中的随机化有两个相关目的:

  1. 均匀分布协变量
  2. 消除统计偏差
  3. 共变量是可能影响你的结果变量的因素,例如,游客地理位置、性别和风险偏好。请注意,其中有些是可观察和可测量的(如位置和性别),有些是不可观察(如风险偏好,难以测量)。
  4. 当你的样本与你的目标人群大相径庭的时候就会出现统计偏差。在 A/B 测试中,我们假设我们的样本代表我们的总体,偏离这一假设会导致我们对我们的总体产生不正确的理解,并得出看似可靠但实际上无效的结论!**

在 A/B 测试设计的这一阶段,常见的偏差形式(也会影响我们的协变量分布)有:

  • 随机化偏倚 —由于不良随机化导致的偏倚不平衡的治疗/对照组(例如,与我们的对照组来访者相比,我们的治疗组来访者中德州来访者过多)。这使得一些共同变量(如德州人)在一个群体中比在另一个群体中发挥更大的影响。**
  • 选择偏差 —如果我们允许访问者将他们自己分配到治疗/对照组,也会产生偏差。这是因为可能存在与治疗/控制选择相关的不可观察的协变量。例如,有更多风险偏好的访问者可能会选择进入测试组,因此我们的治疗访问者可能会同时产生治疗效果风险偏好效果**

这两种情况都将导致所谓的混杂偏倚,这意味着将很难理清由于不良随机化造成的影响与由于实际干预造成的影响。**

然而,如果每个参与者都有平等的机会被随机分配到治疗/对照组,那么随机化将没有偏倚。这将导致可观察的(如位置)和不可观察的共变量(如风险偏好)被平均分配到治疗组和对照组。正是这种共变量的传播让我们能够理解因果关系。

回到我们在这一节的开头的例子,我们在两个策略之间的选择:

  1. 将游客随机分配到布局 A 或布局 B
  2. 允许访问者选择加入新的布局测试

从统计学的角度来看,这些策略中哪一个更好?

虽然可能有后勤或组织上的原因,为什么我们不能做前一个策略,但它肯定是一个更有统计学意义的试验。这是因为我们有完全的控制权来分配访问者(因此协变量)到每个组。如果我们使用策略 2,允许访问者选择新的布局,那么可能会有不可观察的因素在起作用,这可能会削弱我们的 A/B 测试,并将不可观察因素的影响与我们的结果变量混淆。

因此,完全随机地选择治疗组和对照组是很重要的,最好的方法是让 R 为你做这件事。我在下面加入了一个函数,可以帮你做到这一点。请注意 set.seed 函数的使用——我们将使用随机数将我们的参与者分配到治疗/控制状态,因此 set.seed 将使这种随机性可重现。

现在让我们看看分配治疗/控制状态的函数,我在这里称之为RCT _ 随机:

**#lets first make up a fake list of  IDS from 1 to 1000 and 1000 random variables drawn from a normal distributiondf = data.frame("ID"=seq(1,1000), "randomvariable"=rnorm(1000))#lets now make a function to do the work - you can copy paste this function into your own scripts
# it needs to be given a dataframe and a list of naming options
# Options might be "treatment" and "control", or if there are more than 2 options then it might be "Control", "treatment1", "treatment2", or just "LayoutA", "LayoutB"RCT_random = function(dataframey, values_to_add){

  set.seed(111)
  dataframey$values_to_add[sample(1:nrow(dataframey), nrow(dataframey), FALSE)] <- rep(values_to_add)
  colnames(dataframey)[which(colnames(dataframey)=="values_to_add")] = "Status"
  return(dataframey) }# so this will take the dataframe called "df" and randomly assign each ROW to "Treatment" or "control"
df_new = RCT_random(df, c("Treatment","Control"))**

我们现在已经获得了原始数据帧

并用我的函数“RCT _ 随机”给他们随机分配治疗和控制状态:

我们现在应该仔细检查我们的随机化,以确保它按预期进行,为此,我们可以查看最重要的关键变量的分布。也可以运行适当的假设检验来评估分布是否不同。对于这些假设检验,我们将 P 值阈值设置为 0.01(而不是通常使用的 0.05),这是由于我们将在另一篇文章中讨论的多重比较问题

现在让我们看看治疗组和对照组的汇总统计数据,并确保“randomvariable”是相似的:

他们看起来非常相似!到目前为止,随机化是成功的。

突击测验

让我们看看下面的一些随机化策略的例子,并尝试判断它们是正确的还是不正确的随机化:

  1. 参与者可以决定是加入治疗组还是对照组
  2. 任何身份证号码以奇数结尾的参与者被分配到治疗组,任何身份证号码以偶数结尾的参与者被分配到对照组。
  3. 我办公室东边的参与者被指定为控制组,我办公室西边的参与者被指定为治疗组
  4. 我们抛硬币来决定一个参与者是控制还是治疗

以上哪些是真正随机化的?在继续下面的建议答案之前,花点时间思考一下这个问题。

  1. 参与者可以决定是加入治疗组还是对照组。这不是随机的,因为参与者可能有理由选择一个会导致自我选择偏差的群体
  2. 任何身份证号码以奇数结尾的参与者被分配到治疗组,任何身份证号码以偶数结尾的参与者被分配到对照组。几乎是随机的,但不完全是!这里的问题是,可能有一些未知的因素与影响我们的结果的国民身份证。如果我们 100%知道国家 id 是随机产生的,那就没问题,但是我们不知道我们应该使用另一种方法
  3. 我办公室东边的参与者被指定为对照组,我办公室西边的参与者被指定为治疗组。这是一个可怕的想法,这可能会导致混淆性偏见,因为东西方参与者之间可能存在地理差异
  4. 我们抛硬币来决定参与者是控制还是治疗,正面意味着治疗,反面意味着控制。这是唯一一个真正随机的系统,因为它仅仅基于偶然性

聚类随机化

有时,我们不能在个体水平上随机化,但我们仍然想在那个水平上测量。例如,如果我们要随机评估对银行员工的激励对客户贷款偿还率的影响,那么不可能在客户层面进行随机化(因为这些共享银行,因此也共享银行员工),我们需要在银行层面进行随机化,同时仍然测量客户层面的结果(偿还率)。

在一个水平上随机化而在另一个水平上测量的过程导致我们的 A/B 测试设计复杂化。具体来说,共享一家银行的客户的固有相似性(在上面的例子中)将导致我们有更窄的分布,并低估我们的误差。反过来,这将对我们的研究能力和研究结果产生连锁反应(即,由于我们数据中的错误置信度,我们将有更高的假阳性率)。在群体中接受治疗的个体行为相似的概念被称为群集,我们的解决方案是使用群集随机试验群集 A/B 测试。****

整群随机试验类似于 A/B 试验,但是我们的随机单元变成了整群而不是个体(所以在上面的例子中,银行就是整群)。我们可以使用群内相关性ICC 来测量聚类,这将告诉我们群内个体的响应有多相关。ICC 从 0(同一个集群的成员之间没有关联)到 1.0(完全关联)运行。更高的相关性会导致更多的分析问题,所以我们希望这个值为 0!

ICC 会导致我们的分布看起来比实际更窄,这反过来会对我们的统计功效、系数、置信区间和 p 值产生连锁反应。它本质上导致了对我们结果的错误信任。使用前一篇文章中概述的概念,你应该能够合理解释为什么低估我们的误差会导致这些影响。

使用历史数据在审判前计算 ICC 是可能的。这个估计的 ICC 将使您能够根据需要调整您的方法,以产生一个可靠的试验。

让我们首先看看如何计算 ICC:

***# make some fake data*

*#this data will have an ID number, variableA (our variable of interest), the bank name and the district name*
df = data.frame(ID=seq(1,100), variableA=rnorm(100,500,50),  bank_name=c("first_bank","second_bank","third_bank","last_bank"), District=c("A","B"))

library(knitr)
kable(df[1:5,], format="markdown", align="c")**

我们可以使用下面的代码片段来计算 ICC:

**ICC_CI <- function(cluster_level,outcomevar, dataf){

  #load library
require(ICC)
  set.seed(123)
  si = round(dim(dataf)[1]*0.66)
  values_f <- c()
  for(i in seq(1:50)){
  samp_f = dataf[sample(nrow(dataf), si), ]
  x_f = ICCbare(cluster_level,outcomevar,samp_f)
  values_f <- c(values_f, x_f)
  }
  # note that 1.96StDevs = 95% confidence interval bounds in a normal dist.
   ret = data.frame("Mean ICC" = round(mean(values_f, na.rm=TRUE),3), "CI" = round(1.96*sd(values_f, na.rm=TRUE),3))
   ret$Significant = ifelse(ret$Mean.ICC > ret$CI, "Y", "N")
  return( ret)

  }

stored_ICC <- ICC_CI("bank_name", "variableA", df)**

从这个计算可以看出,我们在同一家银行的客户之间的 ICC 是(0.022 +/- 0.081)。当置信区间(CI)过零时,我们可以看到这并不显著(因此“显著= N”)。换句话说,银行似乎在客户之间的相似性中占的比例可以忽略不计。

然而,如果我们有一个重要的 ICC,那么我们将需要调整我们的试验设计和分析计划,以减轻 ICC 的影响。我们通常有两种选择:

ICC 解决方案 1

选项 1:计算每个集群的汇总指标(如集群平均值)。然后,每个聚类只提供一个数据点,并允许我们继续假设我们的数据是独立的,然后我们可以像往常一样继续使用标准统计工具(例如 T-test)。**

因此,如果我们有 45 组 500 个人,我们最终有 45 个数据点。这意味着我们的功率、样本大小和分析计算也需要在集群级别执行。这也意味着我们可以简单地在聚类级别分析我们的数据,并从这里开始忽略 ICC(因为我们本质上设置 ICC = 1.0 并继续这个假设)。

ICC 解决方案 2

使用 ICC 和个人数量来计算我们的新样本量。

对于选项 2,我们将继续在个人层面计算功效、样本大小和分析指标,但会进行一些修正,以解释错误的窄分布。

对于我们的样本大小,我们将使用下面的ICC_correction函数来扩大它:

**ICC_correction <- function(samplesize, num_clusters, ICC_estimate){

  average_cluster_size = samplesize/num_clusters

  factor_inflate = 1 + (average_cluster_size - 1) * ICC_estimate

  return(data.frame("New sample size"=round(samplesize*factor_inflate), "Old sample size"=samplesize   ))
}

ICC_correction(200, 50, 0.2)**

因此,200个客户的初始样本量,30 个集群(银行)和一个0.2的 ICC 将导致新的样本量为320。请注意一个相对较小的 ICC 是如何将我们的样本量增加 50%以上的。

我们还可以探索添加新集群与在现有集群中添加新个体之间的区别。例如:

**scenario1 <- ICC_correction(200,20,0.2)$New.sample.size #average 10 farmers per cluster, and  20 clusters

scenario2 <- ICC_correction(200,40,0.2)$New.sample.size # average 5 farmers per cluster, and 40 clusters**

`场景 1= 560 '

`场景 2= 360 '

我们可以看到,将集群数量增加一倍(但保持参与者数量不变,以便客户分散到更多的集群中)会导致校正后的样本量大幅减少。

我在下面运行了一个模拟,该模拟将绘制添加新个体(到现有聚类)与添加新聚类之间的关系,以及这如何影响样本大小(保持功效常数为 0.8):

总的来说,我们可以看到,在现有的集群中增加新的集群而不是新的个体,在较小的程度上扩大了我们校正后的样本量(在这篇文章的底部有一个到这个模拟代码的链接)。

通过添加新的聚类,我们将最小化由聚类内方差解释的方差,从而获得信息。另一个直观的解释是,如果我在一个群集中已经有 10 个个体,并且我们有非零 ICC,那么该群集中的每个额外个体提供的信息越来越少,并且她的特征基于群平均值越来越可预测。

NB。在下一篇文章中,我们将看看用固定和随机效应模型对 ICC 数据的实际分析。

p 值阈值,也称为 alpha

一旦我们有了一个可检验的假设和随机化策略,我们将会考虑数据分析。通常,我们会用假设检验来检验干预的有效性。这个假设检验将产生一个 p 值,这是我们的数据可能纯粹是偶然产生的概率——换句话说,我们错误拒绝 H0 的概率(一个假阳性结果)。

当使用假设检验时,我们必须设置一个可接受的假阳性率,也称为 p 值阈值α水平。最常见的 p 值阈值是 0.05 ( 一个非常随意的数字)。这意味着我们愿意接受产生假阳性的 5%的风险,并错误地断定我们的治疗之间有差异,而事实上没有差异。

我们可以在下面证明这一点,如果我们从相同的人群* 中随机测试两个**样本,那么我们将有 5%的机会错误地将样本识别为来自不同的人群:**

在某些情况下,我们可能希望将阈值设置为 0.01 (1%)或 0.1 (10%)。一般来说,我们越不愿意不正确,门槛就越低。因此,对于可能对客户产生负面影响的干预,我们希望非常确定正面影响(0.01 阈值),而不愿意接受负面影响(0.1 阈值)。请注意,我们的阈值越低,检测任何效果所需的样本量就越大。

和往常一样,这些数字的完整 R 代码可以在这篇文章的底部找到。

实践中的样本量计算

结合这篇文章和文章#1 的材料,给了我们一个很好的样本量计算的理论基础。然而,我想在这里提出的一个常见问题是:“我从哪里获得样本量计算的数据?”。我们可以使用上面的亚马逊布局试用示例来理解如何回答这个问题。

在计算样本量之前,需要的主要信息是对干预效应大小的估计。通常有两种方法可以为我们的计算得出效应大小的估计值:

  • 分析历史数据或试点研究
  • 设置最小可检测效应(MDE)

根据历史数据或试点研究进行估计

第一个包括文献回顾和/或小规模试点研究,以评估治疗组和对照组之间的差异。请注意,如果您使用试点数据,那么效果大小的估计可能会非常粗略,因此我建议将效果大小减半以保守,并将其用于计算。如果你再次使用文献值,谨慎对待它们,将任何文献值视为效应大小的上限估计(这是由于赢家的诅咒现象,这将在后面的帖子中讨论)。

最小可检测效应

也许对这个问题最有商业头脑的方法是利用 MDEs。

MDE 方法将询问“为了使干预有价值,我需要看到的最小效果是什么?”,然后我们将效果大小设置为该值。这里的理由是,如果提议的干预的投资回报(ROI)是负的(或非常小),那么我们不需要能够精确地测量这样小的值来做出决定。

例如,在 Amazon.com 实施布局 B 可能相当昂贵。我们可以计算出该实现将花费大约 20,000 美元的员工时间,在这种情况下,我们只关心是否能够检测到超过 20,000 美元的影响。为了便于讨论,我们假设 20,000 美元相当于美国市场转换率增加 2 个百分点,然后我们将 MDE 设置为 2 个百分点,将我们的效果大小设置为 2 个百分点。

MDE 方法可能非常强大。在预分析(估计样本大小)和后分析期间明智地使用它来说明使用 0.8 倍的光焦度我们能够检测到什么样的尺寸效应。您可以在下面看到一个预分析 MDE 的工作示例,我还包含了一个函数plot_MDE,您可以对自己的数据使用它。

**#make some fake data, let's pretend its baseline data

dat <- data.frame("mean.client.expenditure" = rnorm(1000,100,10))

#this function will plot MDE for various differences
# differs is a list of intervention effects that you want to consider
plot_MDE <- function(historical_data, differs){

  #initialise empty vec
p <- c()

#remember our effect size function from post 1?
cohen_d <- function(d1,d2) {  
  m1 <- mean(d1, na.rm=TRUE)
  m2 <- mean(d2, na.rm=TRUE)
  s1 <- sd(d1, na.rm=TRUE)
  s2 <- sd(d2, na.rm=TRUE)
  spo <- sqrt((s1**2 + s2**2)/2)
  d <- (m1 - m2)/spo
  rpb <- d / sqrt((d**2)+4)
  ret <- list("rpb" = rpb, "effectsi" = d)
  return(ret)  } 

#load libs
require(pwr)

for(i in seq(1:length(differs) ) ) {
  samp1 <- historical_data
  xnu = differs[[i]]
  #this is a better version if you can understand it:
    samp2 <- samp1 + rnorm(length(samp1), xnu, xnu/10) #add some noise
  inp <- cohen_d(samp1, samp2)

  p[i] <- pwr.2p.test(h=inp$effectsi , sig.level=0.05, power=0.8, n=NULL)$n

}

require(ggplot2)
print(ggplot() + geom_point(aes(x=p, y= differs), size=3, color="blue", shape=1) + geom_line(aes(x=p, y=differs), size=1.2, color="blue") + xlab("Sample size")+ ylab("MDE") + ggtitle("Minimum detectable effect vs. sample size"))

library(knitr)
mde_tab = data.frame("MDE"=differs, "Sample size"=p)
kable(mde_tab, digits=2) 

}

#set some differences for the loop, here, 1,2,5 (etc) are dollar increases
diffs <- c(1,2,5,7.5,10,15,20,25)

#plot
plot_MDE(dat$mean.client.expenditure, diffs)**

请注意,这个函数将为您提供 Y 轴,无论您为该函数提供什么单位(在本例中是美元)。您可以使用 MDE 来计算初始样本大小,然后使用 ICC 校正来获得该 MDE 的 ICC 校正样本大小。

尺寸

A/B 测试的最后一部分是测量本身。这通常是测试设计中被忽视的部分,因此也是后来分析问题的主要来源。任何假设都需要有一个好的测量策略才有用。

我想用一个题外话来描述我对马拉维一家电信公司的通话时间使用(又名电话信用)的 A/B 测试所做的一些分析,以说明这里的陷阱。

这项 A/B 测试考察了新产品对通话时间使用的影响。在 A/B 测试中,我们要求人们回忆他们上个月在通话时间上花了多少钱,而他们不知道的是,我们还从电信公司获得了相同客户的实际花费数据。当我们比较这两个指标时,我们发现相关性很小!此外,当我们观察谁最有可能高估他们的通话时间时,我们发现是年轻的城市男性。

现在考虑一下——如果我们只有自我报告的数据,我们会认为年轻的城市男性是广播时间的大支出者,从中得出许多结论,并发现许多“具有统计学意义”(根据< 0.05) relationships! We would have made many recommendations to the telecommunications company about the new product, and our results would have held up to thorough statistical interrogation. In short — there would have been very little way to know we were wrong, but we would have been wrong nevertheless!

的 P 值,这个故事的寓意是,世界上最好的统计数据也不能挽救糟糕的测量试验。另一个寓意是,自我报告的数据往往是可怕的(当心调查-重非政府组织!),因为它受人们希望被如何看待的影响(可能是面试官、社区或他们自己对“低”通话时间的尴尬)。

重要的是花一些时间思考衡量策略的注意事项和弱点,然后尝试尽可能地减轻这些弱点(例如,通过获得上述确证数据)。

最后,一旦数据被收集和分析,让它可访问和可复制是很重要的。这意味着编写干净的代码(最好是在 R-markdown 或 Jupyter notebook 中)并将原始数据保存在公司服务器上。

一家新接触大数据的公司中的每一位数据科学家都目睹了散布在数十个员工硬盘上的一连串随机 CSV 文件和分析脚本。一个存储这些文件和脚本以备将来使用的系统是必要的,并且完全值得拥有自己的博客帖子!

如果你喜欢这个帖子,或者觉得有用,那么请鼓掌让我知道!

摘要

我们现在已经看到了 A/B 测试的关键部分:

  • 假设**:一个好的假设是可检验可测。它必须有一个明确定义的评估标准(例如,我们是测量平均值还是中位数?个人层面还是群体层面?).**
  • 随机化:我们必须使用 R 随机化,并确保我们的治疗组和对照组是平衡的。我们可以使用 RCT 随机函数来实现这一点。我们还应该考虑群集效应,并使用正确的随机化单位。可以计算 ICC 并相应地调整样本大小,假设 ICC 为 1.0 并根据聚类数计算样本大小也是合理的
  • ****功效:了解你在试验前后的统计功效、样本量和 MDE(见上一篇)
  • ****测量:测量必须稳健可靠,考虑我们可能不准确的地方,并在您设计的任何研究中尽量减少自我报告指标的重要性!

你可以在我的 GitHub 上查看这篇文章的完整版本(包括所有 R 代码)

下次

线性模型,混合效应模型,以及更多关于假设检验的内容!

原载于Michael-bar . github . io**

数据科学的肮脏小秘密

原文:https://towardsdatascience.com/data-sciences-dirty-little-secrets-15184d814486?source=collection_archive---------2-----------------------

尽管在这个主题上有相当多的贡献,但是定义今天的数据科学家的知识和技能集被证明是一个相当大的问题。这一挑战并没有阻止贸易专家预测世界范围内对这类“专家”的供需缺口【第二】【第三】;而 LinkedIn 的 2017 年十大最具市场价值技能调查则突出了统计分析、数据建模和数据呈现【iii】。自从威廉·克利夫兰(William Cleveland)在 2001 年提出“数据科学”这一术语作为计算机科学和统计学领域之间的结合点以来——“超级明星”、“忍者摇滚明星”和“性感独角兽”等最高级词汇对商业和高等教育理解这一行业的具体情况几乎没有帮助。究竟是什么让数据科学家与该领域的其他人区分开来?

有几个原因可以解释为什么这个行业在定义角色上有这么多困难。大多数组织倾向于使用这个术语作为一个包罗万象的短语,似乎包括统计学家、业务分析师和数据工程师。多年来统计工具和方法的快速发展并没有让这项任务变得更容易:专业知识的标准变得越来越雄心勃勃。数据科学家的营销与其他技术相关行业没有太大不同:IT 行业在不断重塑传统职位头衔的过程中,历史上一直表现出一种“本月流行”的心态。在回顾了当前职位空缺对数据科学家的要求后,人们应该想知道是否有数据科学家不能做的事情。

鉴于这份技能和能力的清单,也许更有前途的方法是列出数据科学家不是什么。Chuck Russel 的贡献提出了一些有效的观点。他表示,这个头衔并不附带数学、计量经济学或决策科学的高级学位。根据候选人对供应商统计平台培训视频的使用情况来判断他们是否是数据科学家就更加困难了。参加新兵训练营或专业在线课程的证书并不能区分专业人员。数据科学家不像专业人士那样擅长处理数据,而是练习解决组织问题。

如果数据、平台和编程方面的专业知识还不够,那么数据科学家的特质是什么?在我们看来,这一切都始于候选人对特定市场和行业逻辑的理解。数据科学也是一种思维框架,数据科学家不断扫描他们的物理和数字环境,寻找需要解决的问题。他们的日常工作包括探索要解决的问题的本质,鉴定手头的数据,确定哪些方法可以在给定的环境下产生更好的选择,以及将数据转化为有洞察力的行动。他们不会把自己孤立在电脑前,但正如李·贝克所说,他们充当公司和客户现实的侦探,以及组织内部技术和运营服务之间的中介。总之,数据科学家根本不是专家,而是人类决策活动的永恒学生。

这种对决策而非数据的关注,让我们对一名优秀的数据科学家与众不同的地方有了一些了解。贸易知识是不可替代的——理解市场如何运作是数据科学的基础。理解人们如何“看待”数据,以及决策中隐含的启发和认知偏差与数据本身一样重要。寻找要解决的问题是找到解决方案的前提。专注于通过数字讲述故事是促进有效决策的关键。数据科学不是一个职业头衔,而是一个组织每天带到工作中的思维方式。

改善管理决策是商业分析研究所的核心和灵魂。在我们位于巴约纳的暑期学校,以及我们在欧洲的大师班,我们让数据科学为您和您的组织服务。该研究所专注于管理者数据科学的五个应用:在数字时代工作、数据驱动的决策、机器学习、社区管理和可视通信。数据驱动的决策会对你未来的工作和职业生涯产生影响。

Lee Schlenker 是 Pau 商学院的教授,也是 http://baieurope.com 商业分析学院 的负责人。【www.linkedin.com/in/leeschlenker.】你可以在推特上关注我们https://twitter.com/DSign4Analytics


【I】参见例如 Smith,A. (2016),如何成为数据科学家,Experfy

【ii】Cap Gemini(2017)介意数据科学技能差距

【iii】Ficher,C. (2016),能让你在 2017 年被录用的顶级技能,LinkedIn

【iv】罗素,C. (2015),你不是数据科学家,中等

【v】贝克 L. (2016)。《50 种灰色阴影——数据科学家的心理学》

数据科学的再现性危机

原文:https://towardsdatascience.com/data-sciences-reproducibility-crisis-b87792d88513?source=collection_archive---------4-----------------------

Photo credit: Serg from the Swarmrobot.org project via Wikipedia

什么是数据科学中的再现性,我们为什么要关注它?

紧接着 Joelle Pineau 在今年的国际学习表示会议(ICLR) 上关于深度强化学习的可复制性、可重用性和健壮性的精彩演讲,似乎数据科学世界(或至少是数据科学研究世界)中的每个人都在谈论可复制性和可复制性。

这个问题不是数据科学独有的。事实上,根据 Nature 杂志 2016 年的调查,大多数科学领域都面临着可复制性危机。具有讽刺意味的是,根据调查受访者的说法,导致再现性危机的最重要因素之一是统计知识不足。这一结果很可能至少部分受到生物和医学领域大量受访者的影响(906/1500),他们通常在相关统计数据方面接受过次优培训。鉴于数据科学和机器学习从业者的职业性质,人们会希望他们具有更高的统计培训总体水平。然而,尽管该领域强调统计和确定性建模,但数据科学仍然面临着再现性方面的挑战,这些挑战往往突出了在大多数科学领域推动再现性危机的结构和组织力量。

什么是再现性?

在我们讨论数据科学中的再现性之前,我们需要从一个明确的定义开始。Chris Drummond 认为,许多关于“可复制性”的讨论实际上都是围绕着“可复制性”展开的(有些人将后者称为“可重复性”)。在他看来,可复制性是另一个人使用同样的工具和同样的数据产生同样结果的能力。在像数据科学这样的计算领域中,这个目标经常是微不足道的,对于“真实世界”的研究来说并不成立。任何人都可以派生一个开放访问的存储库,使用相同的数据运行完全相同的代码,并获得相同的结果。实验室环境很少如此完美地可复制,这意味着实验复制通常涉及一些实验参数的低水平扰动。通常,即使完全相同地复制别人的实验室工作也意味着从相同的来源订购原材料,重新配制他们的试剂,在你的机构中找到类似的设备,并在出版物允许的范围内尽可能严格地遵循他们的方法。正如 bench 科学家所说,“我为自己的研究复制了这个实验,这个方法在我手里也管用。”

但是实验复制的保真度在实验室和计算学科之间是不同的。计算复制的保真度通常被认为是非常高的。如果另一位研究人员将相同的代码应用于相同的数据,那么任何确定性算法都会产生相同或非常相似的结果。从本质上来说,大多数开源项目都满足这种可复制性要求,因此对于该领域大多数有意义的研究来说,停止在这种实验性复制水平上可能是微不足道的。然而,尽管它是琐碎的,这种练习仍然是至关重要的,可以作为其他从业者推出新工具或算法的积极控制。

相反,在德拉蒙德看来,再现性涉及更多的实验变异。我们可以把实验性复制看作是一种存在于从近乎完美的相似到完全不相似的连续体上的活动。在高保真度的一端,我们有一个分叉的项目,在没有任何改变的情况下重新执行。在天平的另一端,我们有通常保留给烹饪博客上食谱评论的那种废话。"我没有做这种面包的面粉,所以我用碎牛肉代替,它尝起来很难吃!"从这个角度来看,实验室实验中的实验复制看起来更像是计算实验中的复制。

Good reproduction is about finding a middle ground between replication and irrelevance.

我们为什么要关心?

可重复的实验是每个科学领域的基础,事实上,甚至是科学方法本身。卡尔·波普尔在《科学发现的逻辑》中说得好:“不可复制的单一事件对科学没有意义。”如果你是这个世界上唯一能取得特殊成果的人,其他人可能会发现很难信任你,尤其是如果他们已经花费时间和精力试图复制你的工作。在一个单一的未经证实的轶事上建立一个产品或理论是鲁莽和不负责任的,如果你把轶事作为一个可靠的现象,它会消耗时间和资源,否则这些时间和资源会花在实际的生产工作上。

不可复制性并不总是恶意的,甚至是故意的,但在科学领域它很少是积极的。科学贡献的有效性在于它们作为一种工具或视角对其他人应用于他们自己的问题的有用性。我们钦佩那些解决我们发现难以解决的问题的研究人员,或者那些开发工具来解决我们苦苦挣扎的困境的研究人员。作为科学家,我们应该努力创造工具和想法,帮助他人实现自己的目标。这样做,我们(希望)能丰富我们自己的成功和职业地位。

如果我们缺乏再现性的标准,或者如果我们陷入实施再现性护身符的陷阱而不考虑它们的真正目的,我们就有浪费我们自己和其他人的时间的危险。科学是超越单个从业者的思维连续性。当我们离开时,不管出于什么原因,其他人应该能够从我们离开的地方继续产生新的知识。同事们应该能够实施我们的想法,而不用我们在他们的肩膀上徘徊。

科学是一种将我们独特的经历和兴趣运用到世界上的方式,这种方式可以帮助其他人的经历和兴趣。我们不能总是预见到我们的新知识如何应用到我们自己的兴趣中去帮助别人,我们也不需要这样做。我们只需要尽最大努力,用可靠的方法解决我们感兴趣的问题。以无法复制的方式获得的知识对任何人都没有帮助,也没有潜力这样做。所以没有可重复的实践,我们只是在浪费我们自己和其他人的时间。

Photo credit: rawpixel.com on Pexels.

数据科学再现性的障碍

既然我们已经有了一个基本的框架来解释什么是再现性以及为什么它很重要,我们可以开始讨论如何解决它。有几个障碍导致了数据科学中的再现性危机,其中一些将非常难以解决,如果不是不可能的话。常见的问题包括数据和模型的可用性、基础设施、出版压力和行业标准,以及许多其他不经常讨论的问题。几乎所有这些问题都有多种不同的驱动因素,每个因素都需要自己的解决方案。因为我们是数据科学家,谈论模糊和复杂的概念,它可以帮助做我们最喜欢的任务之一:分类。

大多数问题都有“硬”和“软”因素驱动。硬驱动代表着执行上不可逾越的障碍。具备适当的基础设施就是一个很好的例子。有时你只是没有足够的存储空间或 GPU 来复制别人的作品。也许你不能访问临床或商业数据,因为你不能获得许可这样做。

另一方面,软挑战代表了这样一类问题,其中有一个概念性的解决方案,但行业或专业压力阻止你这样做。最典型的例子就是学术实践者,他们真的很想复制别人的作品,但是没有理由花时间去研究一些期刊不愿意发表的东西。

在许多情况下,解决数据科学家面临的再现性挑战需要对多个不同领域有细致入微的了解。这些问题中的大多数无法通过单一的规则或政策来解决,因此有时可用的最佳解决方案是开始讨论如何改进数据科学和相关分析领域的实践。随着本系列的继续,我希望深入探讨影响数据科学可再现性危机的每个最大挑战,并讨论我们作为一个新的独特的行业可以采取的潜在解决方案。

数据科学家:从优秀到卓越

原文:https://towardsdatascience.com/data-scientist-from-good-to-great-5e6aed447b69?source=collection_archive---------6-----------------------

你们中的许多人刚开始学习数据科学,并且正在寻找关于学习什么的资料,可能已经遇到过绘制的康威的维恩图关于数据科学的含义。我有一个改编自他的不同版本,并写在我的帖子中。

经过深思熟虑,我看了吴恩达关于在百度研究院建立他的数据科学团队的帖子(当时他还和他们在一起),我问自己一个问题:一个优秀的数据科学家如何才能成为一名伟大的数据科学家。

团队成员

我想到的一件事是,对于任何从事数据科学工作的人来说,他们都无法逃避成为团队的一员。他们必须学会如何成为一名好的领导者和好的追随者,以便扮演好支持角色,尤其是当数据科学家必须与数据工程师和业务用户沟通时。每个人都在使团队有效和高效的过程中发挥作用,没有团队成员的合作,领导者就不能有效,没有领导者的指导、保持专注、管理时间表和激励团队成员,团队成员也不能有效。

沟通技巧

除此之外,在我看来,要成为一名伟大的数据科学家,沟通技巧非常重要。能够以管理层能够理解的方式传达相关的见解,需要投入大量的思考。例如,演示应该如何组织,以便见解易于理解。

伟大的数据科学家需要了解人们是如何学习的,什么样的沟通媒介可以有效地传递信息/见解,以便他们容易理解并可以用来做出更好的决策。

移情

综上所述,作为一名优秀的领导者、优秀的追随者和优秀的沟通者,他们都需要一个共同的“要素”,那就是换位思考,能够设身处地为他人着想。

拥有同理心可以让一个人明白,如果“故事”以某种方式呈现,哪些行为可能被选择,哪些感知可能被采纳。这使数据科学家能够预测可能的结果,并为此做好准备,还能提出成功的演示。

例如,如果一个数据科学家必须准备一个特别的分析,他/她应该能够预料到听众可能会问的问题,并相应地准备好数字,以便在提问时可以方便地使用。能够回答观众的这些问题,可以增加数据科学家的可信度。

因此,要成为一名优秀的数据科学家,我建议这个人接受培训并具备以下方面的知识:

  1. 数学建模

  2. 数据& IT 管理

  3. 领域专长

要从优秀的数据科学家成长为伟大的数据科学家,需要的第四项技能是

4)人际技能——团队精神、沟通技能和同理心

Moving from Good to GREAT!

总之,数据科学家不仅应该拥有可以通过书籍和其他媒介获得的“硬”技能、知识和技能,还应该拥有只能通过经验和实践获得的“软”技能。

好消息是它们可以并行拾取。所以去把它捡起来!开始团队项目,抓住更多的机会做演示!

希望博客有用!如果你有兴趣了解还需要哪些软技能,请访问第二部分这里。祝您的数据科学学习之旅愉快,请务必访问我的其他博客文章LinkedIn 个人资料

补充说明:作为我 2020 年新年计划的一部分,我已经建立了自己的网站,最新消息请访问这里。感谢支持!

数据科学家:从优秀到卓越(第二部分)

原文:https://towardsdatascience.com/data-scientist-from-good-to-great-part-2-614f1ed2aaeb?source=collection_archive---------12-----------------------

在我写了关于如何成为一名伟大的数据科学家的博客文章后,我继续问这个问题,“一个人如何才能成为一名伟大的数据科学家,不断改进并为组织增加价值?”。经过大量的研究和思考,除了我在之前的博客文章中提到的,这里还有一些技巧。

研究技能

作为一名数据科学家,我们是各种各样的解决方案提供商,寻找信息/见解的金块,帮助组织克服当前的挑战或沿着持续改进的道路前进。

数据科学家不可能知道他们正在从事的项目的所有信息,因此非常需要研究解决方案。它可能是研究解决类不平衡的技术,集成不同的技术或新的机器学习技术,或者是在 R 或 Python 中寻找合适的函数的非常简单和常见的任务。

那么研究技能呢?在我看来,良好的研究技能包括两个方面。

(1)适宜性——找到正确的信息。能够搜索能够充分回答你的问题的信息。

(2)速度——快速查找信息。

拥有良好的研究技能(即快速找到正确的信息)有助于减少数据科学家用于其他重要任务的时间,如数据探索、数据管理、功能工程、提高代码可读性等。

好消息是,为了快速找到正确的信息,人们必须在搜索引擎中使用的关键字上下功夫。每当我研究一个特定的主题时,我会考虑我需要的关键字,以便搜索引擎“抛出”一个适合我当前需求的结果列表。

通过“锐化”关键词,它帮助搜索引擎更好地“理解”你在搜索什么,并生成所需的结果。除了所用的关键词,我还会注意关键词的顺序,以改善搜索结果。搜索引擎现在提供自动完成功能,所以好好利用它,快速获得你想要的结果。

我也倾向于使用单一的搜索引擎进行研究。这是为了“训练”搜索引擎理解我通常寻找什么,以便它可以提供我需要的必要信息。

高效学习

考虑到数据科学家涉及的众多领域,能够高效地学习非常重要。数据科学家学习或掌握的知识越多,他/她为组织提供的价值就越大。

能够快速获取知识也许是高效学习的一个方面。我认为高效学习的第二个方面是能够将每个领域的不同部分联系起来。换句话说,能够在不同领域之间建立许多相关的联系。能够建立相关的联系,有助于保持知识,也加强了对最近学到的概念的理解。

我们每个人都有自己的高效学习模式,因此快速发现并应用它对我们来说非常重要,尤其是如果我们正在提升数据科学学习曲线的话。

另一点需要补充的是,数据科学家工作的环境是非常动态的,有大量的变化。有时,我们需要“取消学习”以便快速学习新的东西,这意味着我们必须放弃某些我们以前已经学习过的东西中根深蒂固的概念。我们需要不断质疑我们根深蒂固的假设和概念,质疑它们的相关性。

师徒&教学

指导和教学如何帮助数据科学家从优秀走向卓越。我能想到两种方法。

首先,指导和教学有助于强化数据科学家的现有概念。让一群受训者/团队成员来指导或教学有助于验证一个人所持有的当前概念,无论它是否有用,或者在什么情况下是无用的。我坚信数据科学家在协作环境中会茁壮成长,因此即使是经验丰富的数据科学家也可以从其他人那里学到一两件事,因为他们可以带来新鲜/更新的观点。

其次,指导和教学有助于提高数据科学家的沟通技巧。在我主持的辅导课程中,它帮助我练习我的沟通技巧,因为我必须找到各种方法来解释同一个概念,以便我的学员能够很好地理解这个概念。通过寻找不同的方法来传达概念,使其易于理解,这与向业务用户传达见解非常相似,有助于用户很好地理解所提供的见解。

结论

这里分享的技能是为了帮助数据科学家增加他们对雇用他们的组织的价值,这些是软技能(类似于之前的帖子),不容易从书上/网上学到,但可以通过经验积累,所以现在就开始努力吧。😃

我希望这个博客对你有用。如果有,一定要分享。一两下掌声也是一种鼓励。祝您的数据科学学习之旅愉快,请务必访问我的其他博客文章LinkedIn 个人资料

补充说明:作为我 2020 年新年计划的一部分,我已经建立了自己的网站,最新消息请访问这里。感谢支持!

数据科学家——这是 21 世纪最性感的工作吗?

原文:https://towardsdatascience.com/data-scientist-is-it-the-sexiest-job-of-the-21st-century-35a5bf409363?source=collection_archive---------7-----------------------

关于我们前进方向的思考。

The Path Forward?

我们已经快到 2019 年了。2012 年,我们开始了解 21 世纪最性感的工作。从那时起,正如这篇文章所预测的那样,我们有了突飞猛进的数据科学家。

数据科学家最基本、最通用的技能是编写代码的能力。五年后,当更多的人在他们的名片上有“数据科学家”的头衔时,这可能就不那么真实了。更持久的是,数据科学家需要用所有利益相关者都能理解的语言进行交流,并展示用数据讲故事所涉及的特殊技能,无论是口头上、视觉上,还是理想情况下两者兼而有之。

— HBR

同意。这份工作不错,但不是以我们梦想的方式。如果下一部分感觉像是大企业无法从他们宝贵的数据科学家身上创造价值的咆哮,我感到非常抱歉。

但这确实是事实,需要有人说出来。

首先,数据科学真的很性感吗?

对此有两个阵营。有些人把数据科学称为、“新电力”。但是我越深入研究这个问题,就越发现数据科学家只不过是反复试验的大师。或者是 非常擅长高效利用集群资源的工程师

这张 xkcd 图很好地总结了这个问题。

Is Data Science just tuning?

我在这里想说的是— 数据科学的发展方式真的是正确的吗?所以,正如你现在已经猜到的,我不会把我的工作称为性感,尽管它有它的额外津贴。

  • 我的大部分时间都浪费在手动数据管理任务上,剩下的时间,模型创建部分(据说是有趣的部分)实际上只是一个尝试新模型和超参数调整的 无休止的循环。
  • 虽然我们看到图形社区等其他流正在用 GPU 计算做令人敬畏的事情,在他们的电影中有令人惊叹的设计,在他们的主机游戏中有不断扩展的真实世界,但我们 数据科学家仍然只是在做非常基本的线性代数 。当我们这样看的时候,似乎不太性感。并且从工作角度提醒你,使用 GPU 集群的人在做 【最好的工作】 有。

Thought Provoking?

  • 在开始阶段设想的数据科学的 用例并没有很好地实现 。我们自己的上帝,内特·西尔弗,在做选举预测时动摇了。我们在过去几年中使用深度学习解决的图像分类和检测的用例,虽然是很大的研究问题,但仍有很多需要改进的地方。
  • 企业没有真正准备好接受工作方式的改变 。首先想到的是金融领域。面对所有的法规和企业混乱,我注意到,除了简单的逻辑回归之外,在生产中部署任何东西都需要做大量的工作。当我观察业务伙伴或首席执行官的需求时,他们真的不想要模型,而是想要 【高级可视化】 。基本分析的一个美化的术语。 仪表板几乎是每个项目都有的。 虽然从一个数据科学家的角度来看,如果我能使用基本的可视化和模式提供良好的业务结果,我会很高兴,但这带走了我们作为从业者被承诺的性感。

总而言之,我们被困在新品牌重塑的名义下,做着和以前完全一样的工作。我们需要打破这个链条,追求卓越。

那么接下来呢?

  • 数据科学家需要在决策桌上 随着问题变得更加清晰,这将有助于设想更好的用例。此外,我们设想的任何新项目都有其自身的数据问题。数据仓库系统是遗留的,需要大修。
  • 沟通是关键。过去一代的商业领袖,现在的远见者,以及研究界 需要以有意义的方式走到一起来铺平前进的道路。**
  • 也是迄今为止最重要的— 研究团队正在筒仓里做着大量伟大的工作。有了大量可用的人力,合作和众包这样的工作实际上可以推动我们走向人工智能的最终目标。 正如埃隆·马斯克(Elon Musk)所说——“如果我们在一艘正在下沉的船上,我们或许应该分享水桶设计。”

我们正处于人类历史的关键十字路口。我们正在涉足有关人工智能的问题,但老实说,我们正处于整个生态系统的萌芽阶段。是时候从这种虚幻心态的陷阱中走出来,认识到我们的缺点,并共同努力建设一些伟大的东西了。接下来的步骤将决定我们为这一代人取得的成就。希望接下来的步骤是正确的,因为我们不能错过这个机会。

PS:以上是我自己的个人观点。

数据科学家不仅仅是数据科学家

原文:https://towardsdatascience.com/data-scientist-is-not-just-a-data-scientist-ca867f277520?source=collection_archive---------9-----------------------

一个不争的事实是,在过去的几年里,数据科学这个术语已经得到了企业界和学术界的广泛支持。

互联网上有许多文章解释什么是数据科学,它如何在不同行业中使用,以及为什么它在就业前景中获得了独角兽地位。

在这篇文章中,我想阐明一个成功的数据科学家在组织中需要扮演的隐含角色。

数据科学家的典型职位招聘要求的技能包括但不限于统计学、计算机科学、线性代数、数据挖掘、机器学习、数据库、可视化、演示和沟通技能。

尽管数据科学家需要上述所有技能来执行日常任务,但他们扮演一些职能角色来成为一名成功的数据科学家也很重要。因此,成功的数据科学家不仅仅是传统意义上的数据科学家,

一名侦探

组织/公司经常会偶然发现神秘的趋势、虚假的相关性甚至异常的数据指标。作为广泛接触基础数据及其数据库之旅的人,数据科学家拥有独特的能力来解释否则不合理的结果背后的原因。

这也是数据科学最令人兴奋的地方,能够扮演一个福尔摩斯,调查数据杀人案。调查包括询问负责数据之旅的每个团队和流程。在大多数情况下,通常怀疑是数据输入错误、缺失数据、异常值、数据标准化问题等。

说书人

无论你熟练地构建了多么宏伟的模型,它都取决于你传达其本质的能力。这就是像 Kaggle 这样的平台与现实世界数据科学脱节的地方。

虽然构建准确的模型很重要,但围绕从模型中收集的见解构建可靠的故事同样重要,如果不是更重要的话。

这个讲故事的技巧需要经验和练习,大量的练习。随着 auto-ml 平台和黑盒深度学习框架的出现,这是数据科学家在未来必须提供的最重要的增值技能之一。

一个说客

数据科学家,尤其是初创公司的数据科学家,有机会与从营销到销售到产品和客户支持的不同团队进行互动。很多时候,这些团队所做的决定是基于古老的假设或被反驳的假设。

数据科学家需要游说和宣传更多数据驱动的决策。在说服其他人对业务流程进行更改时,预计会遇到阻力。但是需要有意识的努力来引导决策过程中的变化,一小步一小步的。

首先,就数据和分析的最佳实践对组织内的关键利益相关者进行培训。构建自助分析工具,以便他们能够轻松访问和利用数据。建立你的关系网,获得他们的信任。做一个聪明的销售人员,即使在他们没有要求的情况下,也要软推销这些改变。

魔术师

一般来说,该组织对数据科学家有很高的期望,并要求他们施展魔法。他们需要回答每个问题,从什么是最有利可图的营销渠道,到公司主页上应该使用哪种字体。

当没有现成的答案时,或者当时间-价值权衡不平衡时,有一些锦囊妙计来摆脱那些棘手的情况是很好的。这并不是说应该拒绝所有无聊和耗时的任务,而是对任意问题的答案进行粉饰,以便将时间和精力用于更有价值的工作。

最后,用数据科学的魔力让他们大吃一惊。

凭借深度神经网络模型的能力、推荐系统的能力和无监督学习方法的多功能性,机会是无限的。

组织中没有比他更好的人来认识数据所能提供的真正潜力。

数据科学家需要战略思维

原文:https://towardsdatascience.com/data-scientist-need-strategic-thinking-8039435639dd?source=collection_archive---------7-----------------------

Should Business Intelligence be part of Data Science?

做了一段时间的培训和指导后,我注意到一些我遇到的大多数数据科学课程都没有教授的内容,但在我看来,这是数据科学家需要的一项基本业务知识。

让我们不要纠结于为什么数据科学课程中没有包含它,而要考虑为什么数据科学家知道它很重要。

洞察力和反馈

在很久以前,当大多数事情都不容易衡量时,企业所有者或首席执行官只能通过损益表了解其商业战略的成功,而且是在整个商业战略已经执行之后。这肯定不是理想的,因为在策略执行过程中会消耗极度稀缺的资源。

随着技术的发展,过去无形的东西现在可以被测量,这就是商业智能的闪光之处。对战略管理有了很好的理解,数据科学家可以提出可能的指标,这些指标可以确定战略是否在正轨上,如果没有,则能够确定其原因。对指标如何随时间变化的良好理解有助于企业更好地了解他们所处的市场和环境,稀缺资源的使用效率如何,最重要的是,如何改进下一个战略。

鉴于战略的进展现在可以被跟踪,如果企业发现战略没有奏效,他们现在可以节约稀缺资源。

例如,如果一个企业希望改善其品牌形象,并致力于推动一系列的广告。企业可以提出标签,看看情绪如何,信息传递了多远。通过测量情绪和信息的传播范围,企业可以决定他们营销活动的有效性。如果情绪是跨时间测量的,企业可以看到市场如何对每个新的营销元素做出反应,并阻止不理想的元素,扩展有效的营销元素。这是一个将资源(营销资金)从无效资源转移到更有效资源的例子。

最重要的是,现在有了数据,企业可以通过将手指放在正确的位置(即设置正确的指标)来轻松地寻求所需的反馈,并更有效地利用资源,而不是在战略执行结束时才发现战略无效。

实施分析

对战略管理有了很好的理解,数据科学家将会更好地了解如何收集数据,以及在哪里可以使用机器学习模型来帮助企业在战略执行期间做出快速而明智的决策。

例如,数据科学家将能够提出交叉销售模型和市场购物篮分析,以帮助超市通过电子邮件营销活动销售更多产品,减少受垃圾邮件影响的人。

对战略管理有很好的理解,数据科学家将理解并能够帮助企业从收集的数据中提取更多价值,方法是提出如何在现有流程中使用机器学习模型来协助执行业务战略。

可操作的见解

对于希望为所在组织提供价值的数据科学家来说,能够提供“可操作”的见解至关重要。对战略管理的良好理解,有助于数据科学家理解极具价值和可操作性的见解,并能够提前思考。

能够战略性地思考有助于数据科学家通过提供可以采取行动的见解来不断提供价值,并在此过程中建立可信度。(听说过喊狼来了的男孩吗?同样,如果数据科学家不能提供可操作的见解,就没有人会再关注他/她了)。

总之,我认为战略管理是数据科学家应该具备的基本知识,因为它有助于增加数据科学家可以带来的价值。

如果你渴望了解数据和战略管理是如何结合在一起的,我建议你仔细阅读一下平衡计分卡

我已经提出了我的观点,数据科学家需要了解战略管理,并乐于听取您的意见。我希望所有读者有一个有趣的数据科学学习之旅,并访问我的其他博客文章LinkedIn 个人资料

数据科学家:通过这 5 个领域外的阅读增长你的专业知识

原文:https://towardsdatascience.com/data-scientists-grow-your-expertise-with-these-5-out-of-field-reads-7dee32570630?source=collection_archive---------23-----------------------

我在 2018 年阅读的前 5 本非数据科学书籍帮助我设计了更好的人工智能

从一名优秀的数据科学家转变为一名伟大的数据科学家的关键不仅仅是技术知识。相反,你在职业生涯中取得的进步越大,就越有必要联系和综合其他地方的想法。对各种主题领域的主题有很好的理解可以在日常生活中激发伟大的想法,并最终在你的技术工作中带来巨大的突破。

那么如何培养这种能力呢?阅读各种各样的主题可以让你建立一个知识基础来联系想法,让创新变得更容易。我在 2018 年读的这五本书对我在数据科学和人工智能领域的工作影响最大。

这五本书跨越了多个学科,包括神经学、词典学、心理学、社会学和进化生物学——这些主题乍一看似乎并不相关。但是每一个都对我构建人工智能系统的方式产生了重大影响,以及它们可能带来的影响。

1.意识之河奥利弗·萨克斯著

数据科学家致力于:人类级人工智能、AGI、计算机视觉、强化学习、机器人技术。

阅读:更好地理解进化和神经科学的科学发现,包括视觉系统、记忆和意识。

内容是:

这本散文集在萨克斯 2015 年去世前概述,探索了生物学、心理学和神经科学历史上许多相互关联的主题。我为我们这些构建复杂人工智能应用的人找到了无数的见解,包括对记忆可靠性的丰富讨论,动物王国中存在的各种视觉系统,以及认知速度差异带来的问题。萨克斯对包括达尔文和弗洛伊德在内的其他著名科学家的深思熟虑的讨论是亮点,并鼓励我更深入地挖掘他们与这位科学家的作品。萨克斯深入研究了作为历史人物的这些巨人以及他们的重要工作,从而对背后的科学和科学家有了更深入的了解。

虽然有些人喜欢保持他们的藏书整洁,但我却相反。我越喜欢这本书,它的磨损就越严重——我把边角折起来,写在页边空白处。《意识之河》是我图书馆里标记最多的书之一。

热门引用:

在通常情况下,视觉是无缝的,并且没有给出它所依赖的潜在过程的指示。它必须被分解,通过实验或在神经疾病中,以显示组成它的元素。在某些中毒或严重的偏头痛中所经历的闪烁、持续、时间模糊的影像,使人相信意识是由离散的时刻组成的。

不管是什么机制,离散的视觉画面或快照的融合是连续性的先决条件,是流动的、移动的意识。这种动态意识可能最早出现在 2 . 5 亿年前的爬行动物身上。两栖动物似乎不存在这样的意识流。例如,一只青蛙没有积极的注意力,也没有对事件的视觉跟踪。正如我们所知,青蛙没有视觉世界或视觉意识,只有一种纯粹的自动能力,如果有人进入它的视野,它就能识别出一个类似昆虫的物体,并伸出舌头作为回应。它不扫描周围环境,也不寻找猎物。

这本书给了我很多关于如何从机器学习系统设计的角度思考意识的见解,并给了我很多关于构建计算机视觉系统的最佳方式的新想法,这些系统随着时间的推移变得越来越聪明。

下一步:读完这本书后,我拿起了一本《把妻子错当成帽子的男人》,这是一本非常好的读物,尤其是如果你喜欢神经学案例研究的话。无线电实验室已经做了一些关于这些主题的优秀节目,包括许多专门关于萨克斯和他的作品的。还可以看看精彩的一集揭开 Bolero 关于一个患有奇怪疾病的艺术家和关于植物的奇怪意识的聪明植物

2.科里·斯坦普逐字逐句地写道

面向从事以下工作的数据科学家:自然语言理解和对话界面。

阅读:对语言学有更深的理解,并对词典的创建有一个有趣的看法。

关于什么:

词典编纂者 Kory Stamper 向我们展示了在杰出的词典公司之一韦氏词典工作的情况,包括词典的历史以及社交媒体如何改变语言。这本书对斯坦普优雅的文笔特别过瘾;她显然有“语感”。

每一章都通过一个引人入胜的例子来探索词典学的一个新的维度:词的定义是如何被创造和改变的?单词是如何添加到词典中的?单词之间是如何联系的?意义是如何随着时间而变化的?但更广泛地说,斯坦普提出了关于语言本身的问题,比如:我们是如何理解意义的?这些讨论对于在任何处理非结构化语言数据的应用程序中工作的数据科学家来说都是最有用的。

自从读了这篇文章,发现一个新的词义就成了我的一个梦想。目前为止,没有运气。但我充满希望:这本书不仅让我对词义有了更好的理解,对如何解释单词嵌入有了新的视角,而且让我探索如何改进自然语言处理的方法。

PS。“不管不顾”绝对是一个词。

热门引用:

当你一整天都在仔细观察单词时,你会与它们建立起一种非常疏远和不自然的关系。我想象,这很像当医生:一个漂亮的人走进你的办公室,脱去他们所有的衣服,而你则全神贯注地盯着血压计。

一旦你把他们带到办公室,脱掉他们的衣服,所有的单词对词典编纂者来说都是一样的。粗鲁、粗俗、令人尴尬、淫秽或其他令人厌恶的词语被视为临床科学术语和其他普通词汇。需要一些时间来适应。

经验教训:这是我第一次进入语言学领域,鉴于我在自然语言处理方面的工作,它给了我许多关于如何设计我正在构建的系统的新想法。从词典学的角度理解单词非常有用。

下一步:由于路易斯·拉帕姆的世界及时播客,我发现了斯坦普的作品,尽管词典编纂不是播客的常见主题(它通常是政治和历史的同等融合),但这本季刊非常值得一读,尤其是最近的心态期。同样值得注意的是,《文学评论》最近一期的主题是理解。

3.玛丽亚·孔尼科娃的《信心游戏》

数据科学家致力于:预测人类行为。

阅读:深入了解人类行为以及我们在自我认知和决策中的偏见。

内容是:

Maria Konnikova 带我们穿越骗子艺术家的不可思议的世界,将科学研究与臭名昭著的骗子和欺诈以及他们周围的历史事件的丰富故事编织在一起。有些故事绝对令人震惊,比如一个男人扮演了几十种职业,包括在朝鲜战争期间给士兵做手术的海军外科医生。Konnikova 带我们经历了骗局的所有不同部分,如搭建、分解、发送和触摸。每一个都融入了不同的心理学。

我们大多数人都带着嘲弄和怀疑的混合情绪对待这场信任游戏;普遍的情绪类似于“你能相信他们会上当吗?”但在这里,Konnikova 巧妙地用最新的实验研究结果来羞辱我们,痛苦地解释了为什么我们这些认为自己永远不会爱上这种东西的人可能会爱上它。

这本书充满了围绕心理学研究的讨论。这对我们这些构建旨在预测人类行为的机器学习系统的人来说具有重大意义。它挑战了我们对决策的为什么的理解,尤其是当我们表现得不理性的时候。

热门引用:

这是崩溃的核心问题,在这个时刻,骗子艺术家看到了他可以带我们走多远…事情还没有完全崩溃-那将会完全失去我们,游戏将会过早结束。但是裂痕开始显现。我们损失了一些钱。有些事情没有按计划进行。一个事实似乎是错误的。一个图形被错误地标注。一个酒瓶就是“故障”。关键问题是:我们会注意到还是会加倍努力?

经验教训:虽然我们认为被欺骗的人是幼稚、愚蠢或容易受骗的,但 Konnikova 的书很好地证明了这种过度自信正是导致我们首先陷入这些欺骗的原因。毕竟,最好的骗局是目标甚至不知道自己被骗了。考虑到人类推理的缺陷,这本书为我们这些致力于理解和预测人类行为的人提供了很多东西。

下一步: Konnikova 也有一本即将出版的关于扑克的书,但是她开始赢得太多了,以至于她暂停了这个项目。所以,我拿起一本更老的经典,卡尼曼的思考快与慢 关于我们在判断中经常犯的错误,尤其是在概率和预测方面,同时我在等她的新书。

4.凯西·奥尼尔的《摧毁数学的武器》

数据科学家致力于:道德人工智能和透明度,可解释的人工智能,以及人类行为的预测。

阅读:举例说明当我们无法不带偏见地设计系统时会出现什么问题,以及它可能给我们的社会带来的危险。

内容是:

我们刚刚开始意识到有偏见的算法对我们社会的各个部分产生的许多负面影响,数据科学家凯西·奥尼尔的《数学毁灭武器》带我们了解了算法和数据分析产生不幸结果的各种例子。从掠夺性贷款和高不可攀的工作表现评分系统,到加剧不平等的预测性监管,我们许多人都没有意识到这项技术在我们的现代世界中有多普遍。更糟糕的是,这些系统中固有的反馈回路会产生严重的后果。奥尼尔带我们经历了许多人的生活,他们亲身受到这些数学毁灭武器(WMDs)的影响,她讲故事的天赋加强了她为这本书所做的娴熟的分析。

随着偏见成为目前机器学习中最重要的话题之一,并呼吁人工智能系统更加透明,任何正在大规模构建机器学习应用程序的人都会从阅读本书中受益。作为一名数据科学家,许多例子对我来说已经很熟悉了,但将它们集中在一个地方是一种很好的方式,可以从社会的角度看到我们将面临的巨大挑战。

热门引用:

正如许多大规模杀伤性武器(数学毁灭武器)一样,这个问题从一开始就存在,当时管理员建立了这个模型的两个目标。第一是提高效率,让机器处理大量繁重的工作。它会自动从 2000 份申请中筛选出 500 份,届时人类将接管漫长的面试过程。第二个目标是公平。电脑不会因为管理者的情绪或偏见,或者上议院议员和内阁大臣的紧急请求而动摇。在第一次自动筛选中,每个申请人都将按照相同的标准进行评判。

这些标准是什么?这看起来很简单。圣乔治已经有了前几年的大量放映记录。这项工作是教计算机系统如何复制人类一直遵循的相同程序。我相信你能猜到,这些输入是问题所在。计算机从人类那里学会了如何辨别,并以惊人的效率完成了这项工作。

经验教训:在野外释放算法有可能导致重大的社会和社会问题,我们需要做好准备来处理我们社会中的这些问题。数据科学家有责任成为这场对话的重要组成部分,这本书有助于构建我们需要进行的讨论。

下一步:其他几本书最近出版了,详细介绍了我们在一个算法做出重要决定的世界中面临的额外挑战,如萨菲亚·诺布尔的压迫算法维吉纳·欧班克斯的自动化不平等 。Joy Buolamwini 关于面部识别系统偏见的 TED 演讲也很值得一看。

5.尤瓦尔·诺亚·哈拉里的《德乌斯人》

数据科学家研究:初创公司和未来技术。

阅读:人类社会的历史视角,包括超人类主义、政治、技术进步,以及我们人类的未来。

内容是:

当哈拉里在 TED 2018 舞台上全息亮相时,我坐在他右边远处的观众席上。从这个角度,我可以看到薄玻璃屏幕显示哈拉里的数字化身。效果是戏剧性的——我们确实生活在未来。德乌斯人给我留下了类似的敬畏感。在书中,哈拉里向我们展示了一段从一个地方到另一个地方的旅程,讨论了许多有趣的关于智人的历史观点,以及我们是如何走到今天这一步的:人类是如何接管世界的?我们如何在其中找到意义?最重要的是,我们将何去何从?

《德乌斯人》是我在 2018 年读过的最好的书,无论什么主题,我对数据驱动世界的社会变化的理解都要好得多。哈拉里触及技术及其对社会的影响,将许多不同的世界事件、信仰体系、科学突破和历史事件联系起来。这是一个充满可能性的世界,也是一个对未来生命延长、冲突和技术挑战的伟大概述。任何从事前沿研究和人工智能系统部署的人都将从这本书中受益匪浅。

顶级报价:

科幻电影通常认为,为了达到并超越人类的智能,计算机必须发展意识。但是真正的科学讲述了一个不同的故事。可能有几种或替代的方式通向超智能,只是其中一些通过意识的海峡。几百万年来,有机进化一直沿着意识路线缓慢前行。无机计算机的进化可能会完全绕过这些狭窄的海峡,为超级智能开辟一条不同的、更快的道路。

这就提出了一个新颖的问题:智力和意识,两者哪个真正重要?只要它们是齐头并进的,辩论它们的相对价值对哲学家来说只是一种有趣的消遣。但在 21 世纪,这正成为一个紧迫的政治和经济问题。我们清醒地认识到,至少对军队和公司来说,答案很简单:智力是强制性的,但意识是可选的。

经验教训:正如他在他的 TED 演讲中提到的,记住为什么超人类主义中的一些观点很诱人,但也可能很危险,这一点极其重要。

接下来:看完这本书,我拿起他之前的一本书,智人,也是一本同样优秀的读物。哈拉里还有一本新书 21 世纪的 21 课,并在《纽约时报》上接受了一次精彩的采访,他在采访中讨论了人工智能,尤其是人工智能、武器化人工智能和移情作用对失业的影响。

最后的想法

无论你是职业生涯的早期还是行业老手,形成丰富的知识可以带来巨大的新机会。数据科学在我们这个世界的兴起有可能在许多不同的领域释放大量新的机会,只要我们关注这些领域正在发生的事情。

我希望这些选择能帮助你以不同的方式思考你的数据科学项目,并激发新的方法来应对数据科学中的挑战,就像我一样。

关于作者:

Briana Brownell 是一名从数据科学家转型而来的科技企业家、未来学家和创新者。目前,Briana 是 PureStrategy.ai 的创始人兼首席执行官,pure strategy . AI 是一家技术公司,旨在创建人工智能同事并将其部署到企业中,以便员工可以更快地做出数据驱动的决策。作为一名频繁的主题演讲人、专家和作家,她以让非专家也能接触到高度技术性的话题而闻名,同时也领导了一场关于人工智能背后的科学的深思熟虑的技术讨论。

更多请看 这里*这里 这里 *

数据科学家:寻找他们在组织结构图中的位置

原文:https://towardsdatascience.com/data-scientists-seeking-their-place-within-the-organisational-chart-df1c49dd9b?source=collection_archive---------6-----------------------

数据科学家并不是一个从零开始定义的新形象。长期以来,公司一直将深度数据分析作为一种有价值的工具,来帮助实现或超越他们的目标。现在发生变化的是这种分析的维度,因为更大数量的数据需要不同的方法,无论是在程序上还是在分析的目的上。

许多专家强调重新发现数据的想法,或者更确切地说,发现它对公司的价值贡献。过去管理数据、瞄准客户或检测营业额最高的产品的人,显然为公司增加了价值。但是数据科学家的角色远不止于此

数据已经在内部了

没错,数据经理的形象在公司已经存在一段时间了。数据分析已经在电信行业使用了至少 20 年。银行业也已经使用商业智能好几年了,就像所有在各自行业掌舵的大公司一样——更低调一些。然而,数据分析远非跨学科实践,数据分析通常只应用于特定部门,主要是营销、沟通和客户洞察。这是一种分类形式,在一定程度上损害了它在公司优先顺序中的重要性。

没有以数据为中心的企业文化的公司的主要问题是,它们通常以分散和无组织的方式运营。由于这种孤立的管理,每个公司部门都在任何给定的时间做出它认为最合适的技术相关决策

现在是处理数据的时候了,专家们遇到了障碍和不兼容,这极大地复杂化了他们的工作。在拥有庞大历史资料库的机构中,对数据文件进行分组和处理是一项巨大的工作,但一旦这条自学之路完成,这项工作就会转化为内部流程、人员管理和/或客户服务的改进。

与近年来的情况相比,不同之处在于数据分析专家现在拥有更加强大和有效的技术资源,允许他们从信息中提取更大的价值。计算成本更低,数据可用性更高,两者之间的连通性更强,因此这增加了发现模式或潜在案例推理的机会,有助于更新使用数据来改善管理的做法。

在认可数据科学家的地位的过程中,提到他们职业认可的一个根本性进步是至关重要的:他们承担了改善公司业绩的重要责任。他们的任务不再局限于指导或建议其他部门的行动,也不再是处理数据,然后提交给负责决策的经理。数据科学家的工作最终会带来基于数据的全面检查和翻译的新商业机会。

公司准备好倾听数据科学家的意见了吗?

在许多情况下,数据科学家面临着另一场关键的战斗,以确保他们在公司的新地位得到认可:克服变革的阻力。数字惯性正在推动许多公司走向数据文化,但在更传统或更大的组织中,数字本地人往往不是管理的一部分,这可能成为一个长期的昂贵旅程,或短期的创伤。

公司迈向大数据之旅的第一站必须得到高级管理层的坚定支持。涉及的部门非常多(IT、商业智能、电子商务、营销等。),而且数据的流动、共享和合理使用需要如此多的协调,只有从高层提供资源,才有可能发生变化。没有敏捷和合作,就不会有结果。

在倾向于便利或抵制变革的公司里,数据科学家甚至可能被视为不速之客,向专家讲授如何经营企业。很久以前就制定了游戏规则的高管们对数学家很警惕,他似乎在使用一种与公司无关的语言。

这是一个文化问题:数据科学家的建议背后的科学基础必须利用传统的决策过程,基于经验或其他类型的指标,有时就像电子表格一样简单。甚至可能有人会忽略数据科学家的贡献,因为他们可能暗示着对改进结果的承诺:满足新的 KPI 可能是一个痛苦的目标。

这种现象在包括初创公司在内的各种组织中都存在,因为最终每个人都倾向于保护自己的团队和项目。这就是为什么,我们将在后面看到,熵和沟通是数据科学家的两个重要的非技术素质。

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 本文是研究“数据科学家:他们是谁?他们是做什么的?它们是如何工作的?”,很快从叛逆的思维中走出来。

数据搜集:如何利用它为您的电子商务业务?

原文:https://towardsdatascience.com/data-scraping-how-to-leverage-it-for-your-ecommerce-business-7320e8f82358?source=collection_archive---------9-----------------------

在这个残酷竞争的世界里,每个商业企业都在试图超越对方。

“我在哪里可以获得新的线索?”这个问题可能会让其他所有企业家感到担忧。在一个一切都以客户为中心的行业,竞争对手分析不是一种选择,而是一种需要。在本文中,我们将阐明数据收集在竞争对手分析中所扮演的角色。这也是为什么竞争对手分析不仅对于预测未来,而且对于深入研究和加强现在都是必不可少的。

我们可能不需要提供网络上现成可用数据的数量统计,但是,我们会告诉你为什么访问如此多的数据可以在你所属的利基领域提供竞争优势。开始电子商务审计最简单的方法是从电子商务网站或网络抓取中提取数据。网络抓取对于电子商务企业来说正慢慢变得至关重要,它可以帮助企业获得丰富的洞察力,帮助他们制定与竞争对手竞争的策略,并在此过程中节省时间和成本。让我们看看搜集公开可用的数据将如何帮助分析和制定您在市场中的位置。

竞争对手分析和竞争映射

SWOT——优势、劣势、机会、威胁——是每个企业都在学习的东西,但不知何故在实施的时候有点落后。从开发定制的网络抓取解决方案开始,从电子商务网站中提取数据进行 SWOT 分析。它为电子商务商家提供了一个具体和务实的看法,它的立场在其利基。这将有助于提供一个更清晰的市场状况,并提供洞察力,借此你可以减轻你的弱点,并建立你的优势,以制定一个战略,可以把你的业务提升到一个新的水平。

实时跟踪竞争对手的价格

当今的全球电子商务市场由数百万个商店组成,并且随着其他业务的出现,这个数字每天都在增长。在这种情况下,手动跟踪来评估和优化产品价格,w.r.t 竞争对手既不实际也不可行。但是实时提取电子商务网络数据可能吗?绝对的!!使用动态网络抓取构建竞争对手价格跟踪软件或 chrome 扩展,通过提供实时动态定价策略,最大限度地减少监控竞争对手价格的时间。

一旦你开始实时价格跟踪,你可以看到你的竞争对手是如何随着时间的推移改变他们的价格,了解趋势并制定策略,这将导致最佳的价格评估,并让你在你的竞争对手的定价之上。通过投资实时价格跟踪网络抓取解决方案,您还可以了解产品的生命周期、季节性价格变化、折扣和促销策略,并做出准确的决策,从而提高利润、降低成本,同时节省宝贵的时间。

情感分析

“让客户满意是最好的商业策略”。现在,对于一个产品的成功,什么是最重要的?客户接受度和忠诚度。这实际上是一个事实,情感分析实际上可以驱动任何电子商务网站。每天,数百万用户聚集在不同的社交平台上,表达他们对各种产品和服务的看法。这种数据就是我们所说的情绪数据,企业可以利用这种情绪数据来改善他们的电子商务战略。这种随时可用的社交数据可以被收集并用于向电子商务商家提供关于客户痛点、新市场可能性的有价值的信息,以便在它的帮助下采取可操作的决策。这也可以用来迎合失望的顾客,向他们推销自己的产品和服务。

预测分析

你需要大量的数据来建模,以预测未来的电子商务市场将会是什么样子,以及它可能会遵循什么样的特定趋势。预测分析有助于电子商务商家了解客户想要什么以及他们将为此支付多少钱,制定有针对性的建议和促销活动,改善供应链管理,实现货币化并获得更多利润。借助数据搜集,您可以获得数百万的数据,然后使用预测分析来分析过去和现在的趋势,以预测未来的趋势,并利用这一巨大的竞争优势来最大限度地提高销售额。

临别赠言

有一个数据的金矿,可以揭示你的竞争对手到底在做什么;你只需要一头扎进去。借助定制数据收集软件开发,轻松实现整个流程的自动化,以提高您自己的电子商务商店的绩效,并最大限度地提高客户参与度。凭借极具价值的洞察力,您可以轻松跟踪行业的现有趋势并预测未来趋势,通过竞争对手分析解决大多数业务问题,并帮助您在当前水平上竞争。

最初发布于:binary 乡亲

数据叙事:提高洞察力到行动的转换,以产生更大的现实世界影响

原文:https://towardsdatascience.com/data-storytelling-improve-insight-to-action-conversion-for-a-greater-real-world-impact-b94e1827fa01?source=collection_archive---------6-----------------------

Photo by Alex Siale on Unsplash

数据科学结果和现实世界影响之间的差距

数据科学家有两种类型:B 型和 A 型。B 型用于构建,A 型用于分析。对应这两种类型,在数据科学项目中,我最担心两种潜在的结果。第一,模型不能进入生产系统。第二,洞察力不会导致行动。这两个令人沮丧的结果发生在从数据科学到其他领域的过渡中:一个是从数据科学到软件工程,另一个是从数据科学到业务执行。这两个转变是创造现实世界影响的关键途径,因此在这些转变中取得成功的风险很高。在移交过程中,软件工程师可能会说模型不符合他们的工程标准,业务合作伙伴可能会声称洞察很有趣,但没有采取任何行动。这些“因果关系”阻止了数据科学的成果重见天日,并且发生在数据科学家的身上([链接](http://There are two types of data scientists: type A and type B. Type A is for analysis and type B is for building. A Quora answer from Michael Hochster illustrates these two types in details. Whether you are a type A who supports decision makers with data analysis or type B who builds models to make products smarter, you have an inspiration to not only create data science solutions but also to drive results in practice. A result could be a business decision or a code commit into production. The last step in data science project life cycle is ,  I worry about other challenges less. With the right setup, it is more or less straightforward to acquire data, clean data, explore data, learn from data, engineer features, create visualizations, build models and conclude results. These items are well covered by learning materials and are the familiar challenges to data scientists.))。

这两个结果比其他典型的数据科学挑战更令人担忧,因为我们无法控制移交后数据科学结果的命运。尽管我们的控制非常有限,但我们应该采取行动来影响这两种结果。模型部署在不同的组织中有不同的含义,但是人们一致认为编写生产级代码有助于数据科学家进行部署。Trey Causey 在他的博客这里中列出了数据科学家在编写生产级代码时的一些首要任务。简而言之,使你的代码模块化,创建文档,使用版本控制,包括日志记录和设置测试。许多数据科学家采用自顶向下的命令式风格编码;这种风格给与软件工程师合作制造了障碍。为了使部署工作顺利进行,请编写生产级代码。

将洞察转化为行动,就像将“心智代码”部署到“社交机器”中。如果数据科学家可以通过编写生产级代码来改进模型部署,那么数据科学家可以做些什么来改进 insight 的部署呢?强大的数据叙事是一个关键的解决方案。来自数据的引人注目的故事可以给观众留下持久的印象并激励行动。

数据讲故事听起来很棒,但却是一个模糊的概念。为了真正深入了解数据讲故事,最近我回顾了科尔·克纳弗里克的《用数据讲故事的 T2》和内森·尤的《有意义的可视化 T4》。这两本书让我对数据讲故事有了新的认识。基于这两本书和我的经验,我想向你展示优化洞察力到行动转换的策略。

概述:

  1. 将洞察力放在展示层级的顶部
  2. 在视觉层次结构的顶端做出大胆的声明
  3. 争取合理的见解-行动转化率

1.将洞察力放在展示层级的顶部

几个月前,我知道了一种展示数据科学成果的方法。我认为这是最好的方法,因为无数的科学论文选择了这种方法。为了以这种方式展示我的数据科学成果,我会从背景开始,谈论数据源,使用图形和表格来突出数据属性,谈论模型构建,讨论建模结果,最后总结洞察力(在适当的时候呼吁采取行动)。在这个流程中,洞察力排在最后,因为对数据和模型的基本解释为观众对洞察力的真正理解做好了准备。这个流程对我来说很好,直到我开始向业务合作伙伴呈现数据结果,这些业务合作伙伴是业务执行方面的老手,但却是数据科学的局外人(不幸的是,今天的大多数决策者都有这种情况)。

我的商业伙伴对我的数据探索不太感兴趣,也对建模细节不感兴趣。他们对这些见解感兴趣,并建议我将数据细节移到附录中。起初,我对他们对科学推理过程的轻微关注感到惊讶,在我采纳了他们的建议后,我发现我的数据故事更快地引起了他们的共鸣。隐藏定量推理过程受到欢迎。更进一步,我开始回溯任何与我的见解间接相关的东西。现在我讲故事更多的是围绕结论,而不是围绕数据建模过程。Josh Bernoff 在他的书中的一段话很好地总结了这一观察:

你必须颠倒你在学校里所学的推理和写作。你学会了从热身开始,然后进行推理,从基本原则出发,得出结论。商业读者没有时间热身,也缺乏耐心进行深入的推理,除非他们事先知道回报。所以从大胆的陈述和结论开始。然后继续你的推理。这样,那些没有阅读整个文档的读者仍然会从阅读你的结论中受益。

我仍然会和我的技术同事说行话,但是,决策层级越高,我就越需要像 Josh 建议的那样颠倒我的故事流程。另一个职业,顾问,有着支持企业高管决策的悠久历史。看起来顾问们很久以前就已经知道了前置洞察的必要性。我看到一篇由家庭语音银行顾问撰写的研究论文。这篇论文的流程是久经考验的讲故事的方式。

Table of contents in a research paper from an advisory firm

正如您在上面的目录中看到的,顾问将建议放在执行摘要之后,将方法放在最后一节。介于两者之间的所有东西都是带有行动含义的大胆声明。在本文中,智能音箱银行的需求较低,因此顾问建议银行谨慎从事。这种方法在咨询师中很常见。

无论是以写作的形式还是以演讲的形式,紧接在开头之后的位置是表达层次的顶端。为了有助于洞察到行动的对话,洞察应该放在首位,而不是其他。

2.在视觉层级的顶端做出大胆的声明

数据可视化是数据故事的决定性时刻。它们是表格和图表,由视觉提示、坐标系统、比例尺、周围文字等组成。数据可视化既是一种交流信息的伟大方式,“一张图片胜过千言万语”,也是一种伟大的分析方式,“一张图片的最大价值在于它迫使我们注意到我们从未期望看到的东西”,John Tukey 在探索性数据分析中说道。考虑到数据可视化的有用性,我们可以通过更好地使用数据可视化来显著改进数据讲述。

在过去,对我来说,数据可视化优化就是让图形更有表现力。我会浏览我起草的表格和图表,找出有趣的,添加缺失的标题、图例和颜色,最后把它们放到我的演示文稿中。这种方法一直工作得很好,直到最近我的合作者在信息就在他们面前的时候询问信息。我现在意识到,我的图表显示了信息,但没有指示应该看哪里。

用数据讲故事有意义的可视化中,利用预先注意属性创建视觉层次的概念帮助我看到了数据可视化真正令人信服的力量。数据可视化不仅仅是使用正确的格式显示数据,还包括使用隐含的视觉指令来指导受众如何轻松处理给定的信息,并在视觉层次结构的顶部提供洞察力。我将用两个案例来说明。

这是科尔·克纳弗里克的一个案例研究。下面的第一张图是一个典型的意大利面条图。意大利面图在时间序列研究、重复测量研究等等中被大量使用。下图有正确的标题、轴和图例。从技术标准来看,这是一幅好图。然而,读者很难知道它试图说什么。

这个改进的版本使用了预先注意属性。下图用粗体蓝色突出显示了最大的增长趋势。所有其他趋势都用灰色作为背景。读者现在更容易理解这种可视化,因为读者通过更好地定义的视觉层次结构得到指导。

在我采用这种做法后,当我使用预先注意属性来突出我想说的话时,我立即看到了来自我的观众的更快、更强和更积极的反应。视觉层次真的很管用。

在另一个案例研究中,Cole Knaflic 展示了头衔的强大用途。在下图中,标题不是典型的“一段时间内的票据量”,它是描述性的,而是被动的。标题是“请批准雇用 2 名全职员工”,呼吁采取行动。这一行动号召有助于观众从趋势线中发现缺少 2 名员工会导致绩效差距。

我总是以一种描述性的方式使用标题:“X 和 Y 的趋势”,“A 和 B 的分布”等等。现在,我的标题要么是行动呼吁,要么是问题,要么是见解。标题是数据可视化中最重要的不动产,富有表现力的标题确实有助于提升我们的洞察力。

由于科尔和 T2 内森的功劳,我真诚地推荐他们的书,他们有许多其他可能对你有用的技巧。

3.争取合理的见解-行动转化率

数据故事不是一次性表演。你会被要求一遍又一遍地向不同的利益相关者讲述同一个故事,尤其是当你的洞察力成功地引起你最初的听众的共鸣时。这个过程就像一场路演,你推销你的数据故事,以获得尽可能多的认同。有了足够的认同,人们就会采取行动:以不同的方式瞄准销售潜力,调整做法以提高运营效率,关闭不必要的产品功能,推出新流程以防范风险,等等。正如一句中国谚语所说,“牵一发而动全身”,将一个见解转化为一个行动会对本组织的许多部门产生连锁反应,这自然会引起来自许多方面的审视。这些审查压力测试你的故事。

带着适度的怀疑,人们可以质疑你的数据质量、假设和建模方法。如果人们看到基础数据中的错误,就会削弱你的故事。从不同的角度来看,人们可能会问你范围之外的问题,这会导致额外的分析迭代。即使你的数据故事被完全接受,人们可能会要求你的数据,图表和模型进行带回家的分析;人们可能会在其他会议上要你的图表。这些需求驱使你把你的故事记录下来,便于阅读,模块化和互动。如果你通过这些压力测试不断改进你的故事,你的故事会变得更加完美,更接近一个行动。

路演可能会成功,也可能会失败,或者介于两者之间。A 型数据科学家需要对从洞察到行动的对话有一个合理的预期。如今,每个企业领导者都高度评价数据驱动的决策,让数据解决方案成为商业世界中的英雄极光,但这一趋势并不意味着决策将只由数据驱动。决策仍然是科学和艺术的复杂混合体,是数据逻辑和商业逻辑的混合体。在现实世界中,高管们利用多种来源的定性和定量情报来做出决策。一项数据科学分析直接决定一项主要业务活动的想法并没有错,但却有误导性。过去,在这种想法的驱使下,如果分析最终导致了行动,我会认为它是成功的。我看到了这样的成功,但是我看到了更多的案例,在这些案例中,洞察力被接受了,但是没有被转化。随着对复杂商业世界的进一步观察,我现在得出结论,将洞察力转化为行动部分取决于洞察力有多强,A 型数据科学家的成功不应该由他们的分析所促成的商业行动(和商业结果)来判断。放下数据英雄的幻想,承认洞察力的实际局限性,有助于我更好地专注于自己的工作,而不是被超出我控制范围的事情分散注意力。

最后的想法

洞察力是数据科学工作的一个重要成果。我们在数据中寻找洞察力,因为我们希望洞察力能帮助我们让这个世界变得更美好。将洞察力转化为行动是实现有价值的洞察力的方法。因为数据科学家通常会将洞察力交给其他专业人员来采取行动,所以数据科学家应该优化他们的数据叙事,以保持洞察力到行动的成功转换。以合理的洞察力到行动的转化率为目标,数据科学家可以通过将洞察力放在呈现层次的顶部并在视觉层次的顶部做出大胆的陈述来讲述更强有力的数据故事。

一如既往,我欢迎反馈,并且可以联系到我 @yuzhouyz

使用 BigQuery 的数据工作室:2018 年最佳实践

原文:https://towardsdatascience.com/data-studio-with-bigquery-2018s-best-practices-d2824620cb35?source=collection_archive---------12-----------------------

多年来,我一直使用 BigQuery 和公共数据集来发布有趣的文章——现在有了 Data Studio,我可以让它们在媒体上互动。在这里找到我们迄今为止开发的使 BigQuery 和 Data Studio 协同工作的最佳实践。

【2019 重要更新:BigQuery 和 Data Studio 之间要使用 BI 引擎

**[## BigQuery BI 引擎介绍| BI 引擎|谷歌云

测试版该产品或功能处于预发布状态,可能会有变化或支持有限。有关更多信息…

cloud.google.com](https://cloud.google.com/bi-engine/docs/overview)**

谷歌数据工作室完全免费,你也可以使用它。将它与许多不同的来源联系起来真的很容易,包括 BigQuery。这就是我现在所做的:我用 BigQuery 分析数据,我把结果连接到 Data Studio,我让我的仪表板交互,我在媒体上发布它们

Interactive dashboard — click to play with it: World Cup goals

但是也有一些挑战。如您所知,BigQuery 允许您在几秒钟内分析大量数据——并且它只对您运行的每个查询收费。我们甚至有一个免费的月层用于查询,所以你可能最终什么也不用付。但是如果您将 BigQuery 连接到一个流行的仪表板,那么您的用户最终可能会代表您生成大量的查询——这意味着您最终会有一个巨大的 BigQuery 账单。我们不想那样。

在 Google Next 18 上,Data Studio 的开发者代言人— Minhaz Kazi —和我做了一个关于最佳实践的演讲,我们已经开发了这些最佳实践来让我们最喜欢的产品协同工作。

例如,避免将新查询从 Data Studio 推入 BigQuery 的最简单方法是将查询结果具体化到 Data Studio 中。没错,一旦有了想要可视化的 BigQuery 结果或表,就可以使用 extract 按钮来实现,Data Studio 将为您提供一种简单的方法来保存和刷新这些数据的副本。

但目前该功能仍在开发中,它将受到某些限制——所以我们还分享了一些其他选项,以在 Data Studio 和 BigQuery 之间创建一个廉价的层。

例如,你可以使用 Google Apps 脚本安排查询,并将结果推送到 Google 云存储中。csv文件。然后,您可以将 Data Studio 连接到该文件,该文件将根据您的计划进行刷新,您的用户将能够快速浏览结果。

Predicting when will Stack Overflow reply

但这仅在结果达到一定规模时有效。在其他情况下,使用支持按键查找的数据库可能更有意义。一旦您知道您的可视化只需要键查找来检索数据,而不是在 BigQuery 中扫描一个表,您就可以将 Data Studio 连接到一个传统的数据库,只从其中获取单个行。在这种情况下,您可以将 BigQuery 结果导出到托管在云 SQL 上的 MySQL 数据库,添加所需的索引,并快速获得便宜的结果。

Reddit kept getting slower throughout 2018. Source: Crux.

但是有时您可能有更复杂的需求——例如,当您想让一个数据源对许多用户可用,并让他们构建自己的自定义可视化时。在这种情况下,您可以使用 Apps 脚本创建一个 Data Studio 社区连接器,并在其中设计您自己的缓存逻辑。

在完整的演讲中,您可以从 Minhaz 的例子中看到这一点——他创建了一个任何人只需点击几次就可以使用的连接器,他们获得了一个自定义和可定制的可视化——在 BigQuery 中托管了新数据——无需任何编码——SQL 或其他。

总的来说,如果您想连接 BigQuery 和 Data Studio 来创建一个交互式仪表板,并且您想让每个人都可以使用这个仪表板,请记住考虑您想在 BigQuery 和 Data Studio 之间有一个什么样的层。请继续关注,因为在谷歌,我们总是在思考如何让这种联系更加强大和令人敬畏。

重要 2019 更新:BigQuery 和 Data Studio 之间要使用 BI 引擎

数据到业务桥梁模型:提取、应用和跟踪可行的见解,以应对您的业务发展挑战

原文:https://towardsdatascience.com/data-to-business-bridge-model-extract-apply-track-actionable-insights-to-answer-your-business-2fdbfd39ac25?source=collection_archive---------2-----------------------

几个月前, SAP 表示数字化转型强调并关注众多主题&公司面临的挑战:收集所有公司内部信息&整合来自外部来源的数据,这些数据一旦经过处理&分析,就可以改变现有的工作流程。积极使用数据的结果是商业模式的转变&决策。

那是为了理论和预期的大局。现实不幸要复杂得多。我有机会为一家公司工作,该公司多年来在收购和实施多渠道方面支持了 100 多家化工行业的新业务开发组织,其中 90%的公司起点是相同的:这些公司的结构都不能处理&利用其数据——无论这些数据来自传统渠道还是新渠道——包括数字流。

理解这种说法的一个关键是不规则&无组织地使用 CRM 工具。大多数时候,这样的系统被用来存储原始数据,但不经常被利用。销售人员通常认为 CRM 工具是一个存储设备,用来保存他们的电话报告或销售过程中获取的原始信息。这是一个很好的做法,但不够有效——因为他们添加了自己的措辞,或者可能会忘记一些信息。因此,非结构化数据很难分析和提取相关的见解。

但是,销售人员并不是唯一应该受到责备的人。该数据结构必须来自产品&业务开发中涉及的不同部门的具体要求。销售人员应该从其他人那里知道他们需要收集什么类型的数据。而这些部门应该明白如何提取这些信息的价值。如果很好地识别和设计了价值,它会很快转化为洞察力,帮助采取或支持战略决策或改进业务流程。

随着数字化转型和“数据使用”的觉醒在我们身边发生,你可能已经听到过这样的说法。数百篇文章声称需要采用数字结构和自动化数据提取模型,但最终,让我们面对现实吧。采用“随时可用”的解决方案是必须的,但这需要巨额投资和大量时间来唤醒和教育部门意识,在组织中建立解决方案基础设施,并使其在日常工作中发挥作用。此外,一种风险似乎切断了大多数跨部门的互动,而这种互动让你的见解变得有价值,让你的组织有一个持续学习的环境。另一方面,仅仅依靠你的“上帝的感觉”或你的业务开发人员或部门变得越来越不适应这个世界需要来自服务于整个组织的市场的结构化洞察力,作为学习机器(而不仅仅是一个人)和所需业务决策的燃料,例如与弱信号识别或蓝海存在证据相关的有争议的明智之举

今天,我在这里提出的是一个折衷方案,一种从结构化数据集和跨部门交换中提取、证明、应用和跟踪可行见解的方法,而无需投资于众多组织无法实现的全方位解决方案。它是基于我在过去五年中观察到的情况,即化学行业中超过 30 家 NBD 组织应用的解决方案摘要。因此,要实现这一目标并在您的组织内产生相应的收益,您需要构建我所说的“数据到业务的桥梁”。基于四大支柱及其相关关键行动的简单“协调&行动”概念。请在下面找到它的简化结构:

除了这个模型之外,我还在这里提供了一种方法来应用强有力的原则,这些原则每天都在滋养你的组织:生长细胞&“可食用的”燃料人类交互并协作学习&他们可以理解和利用的结构化数据。由于这两者和我提供的 D2B 桥指导,您的组织将能够识别和实施可操作的见解,这些见解将积极影响您的整体业务增长和组织流程。此外,你的组织将自己建造一台学习机器,每个人都将从中受益。由某人的神的感觉运行的行动现在看来是过时的。当然,独自一人,我们走得更快。一起,我们走得更远。

对于可能出现的合理问题——“它背后的具体商业价值是什么?”—这 5 年的经验告诉我,建造这座桥梁来填补空白(并实施正确的思维、方法、流程和工具)的公司受益于以下结果:

将潜在客户转化为销售额的机会更大&销售人员的关注度更高

加快将前景转化为销售额的速度

期房结算营销策略

更深入的市场理解

更快的响应&更高效率的技术支持

潜在客户的项目获得技术成功的几率更高

对市场挑战的技术反应更强

加速&相关应用研究

我建议你下载整篇文章(最后有链接),根据我在过去五年中观察到的情况,共同发展这四个支柱。最后,我建议你做一个简短的练习,来评估你提取和利用数据为你的新业务发展战略服务的能力。

感谢您的关注。我欢迎你的任何评论,也非常欢迎你想和我开始的任何讨论。

马修·里奥特

https://www . slide share . net/mat VOD/data-to business-bridge-model-for-NBD-optimization-mrioult-75237043

非私有互联网中的数据透明

原文:https://towardsdatascience.com/data-transparency-in-an-un-private-internet-8179805f70e7?source=collection_archive---------6-----------------------

信息时代彻底改变了我们互动、交流和被感知的方式。在美国,大约 90%的人口都在互联网上,使用脸书和谷歌来与高中朋友联系并回答他们的问题。谷歌等公司不断收集用户搜索习惯和喜好的数据,以便提供更个性化的结果,并改善他们的公司。

数据收集和出售这些个人数据最近一直是一个有争议的话题,主要是由于脸书和剑桥分析公司的丑闻。在 2017 年的热门科幻电影《圆圈》中,主角梅在一家与谷歌极其相似的公司找到了一份工作,名为“圆圈”。该公司创建了一个类似于脸书的名为“真实的你”的社交网络,并不断创造围绕收集大量数据的新软件和产品,因为“知道是好的;知无不言,言无不尽。”随着电影接近尾声,圈子知道任何人的一切,可以在 20 分钟内追踪到一个人。虽然被大大夸大了,但这显示了不当使用数据可能导致的潜在后果,并引发了一个问题:我们是否应该允许访问人们的私人数据,以改善我们使用的服务的个性化,甚至允许访问政府,以增加国家安全?正确使用数据可以极大地改善产品并使我们的生活更加轻松,但是,作为消费者,我们有权知道我们的信息是如何被收集和使用的。

每次我们注册一个新的网络服务,我们必须接受一个条款和条件合同。这份协议充满了法律术语,对普通消费者来说非常难懂,需要修改以便更容易阅读和理解。在一项由乔纳森·奥巴进行、NPR 报道的研究中,研究人员创建了一个虚拟的社交网站,并为其编写了条款和条件。所有的信息都会被传递给国家安全局,你必须把你的第一个孩子交给公司。500 名参与者中只有 1 人表达了对 NSA 的担忧,近 98%的参与者表示他们甚至没有注意到第一胎条款。实际上,没有人阅读条款和条件(本研究中有 26%的人浏览了文档,其余的人根本没有阅读),这部分是由于它们的长度,根据 Obar 的说法,“普通用户每天需要花费 40 分钟来阅读所有的隐私和服务条款”,但在很大程度上也是由于文本的可读性。事实上, 2014 年的一项调查发现, 52%的互联网用户错误地认为“当公司发布隐私政策时,它确保了公司对其收集的所有用户信息保密”。起初,这是令人惊讶的,但仔细想想,许多条款和条件合同可读性差,导致对公司可以用你的信息做什么的严重误解。为了衡量条款和条件协议有多严格,我计算了苹果合同的 SMOG(一个常用的公式,用来计算理解文本需要什么样的教育水平)分数,该合同的分数为 14 年教育。这意味着你至少需要在大学二年级才能完全理解当你注册苹果产品时你所同意的。孩子们获得第一个移动设备的平均年龄是 12.1 岁,他们不可能接受足够的教育来正确理解他们经常盲目同意的东西。

加拿大等国家和欧盟最近通过了通用数据保护条例(GDPR)立法,正在采取措施改善条款和条件以及数据透明度。加拿大有个人信息保护和电子文档法案 (PIPEDA),该法案侧重于让公司对个人数据使用管理负责,限制收集和使用、准确性以及少数人对个人数据的访问。GDPR 于 2018 年 4 月中旬刚刚颁布成为法律,并将于 2018 年 5 月 25 日适用。这项法律旨在通过要求具体的数据同意和仔细规范公司商品化和出售个人数据,将数据还给消费者。根据《T2 哈佛商业评论》的一篇文章,25%的人不知道公司可以收集他们的位置数据。然而,通过颁布 PIPEDA 和 GDPR 等法律,政府在数据透明度方面迈出了一大步,更加公开他们收集的数据以及他们如何使用这些数据,并允许消费者查看他们收集的数据。最终,诸如此类的法律将允许消费者更加了解他们个人数据的范围。

根据 T4 外交关系委员会的文章,美国大约有 286,942,362 名网民

“美国缺乏单一、全面的联邦法律来规范个人信息的收集和使用。相反,政府通过只监管某些部门来处理隐私和安全问题,这[反过来造成]重叠和矛盾的保护"。

最近的 GDPR 法律是美国迄今为止最全面的数据保护,而且是一部欧洲法律!GDPR 正在改变许多美国公司处理客户数据的方式,因为 Snapchat、脸书和谷歌等公司也在欧洲开展业务。这促使许多公司根据新法律修改条款和条件。事实上,在过去的一周里,我每天至少会收到一封电子邮件,通知我某家公司根据 GDPR 规则在数据透明度和使用方面所做的改变。欧洲法律对美国公司数据标准拥有更多控制权的事实是荒谬的,应该(但很可能不会)促使国会通过一项法律。在一项潜在的法案通过之前,它必须通过公共议程引起注意,在数据透明度问题上,这似乎很难做到。2015 年,几乎的美国人不愿意与企业分享他们的数据,因为他们想维护自己的隐私,并且“93%的成年人表示,控制谁可以获得他们的信息很重要”。然而,人们对消费者数据的收集和使用方式存在严重误解。虽然大多数人认为公司正在收集你的数据,不超过 25%的人知道搜索历史、通信历史和 IP 地址是专门收集的。这是一个挑战,大多数消费者并不知道他们收集的数据实际上有多隐私。例如,在 2015 年年中,85%的美国人表示他们信任信用卡公司的个人数据,然而根据 ID Theft Center 2015 年的报告,2015 年在银行、信贷和金融领域发生了 71 起数据泄露事件。普通美国消费者不知道他们自己的数据有多大,也不知道这些数据是如何被使用的,更不用说这些数据被滥用了。这是一个问题,因为为了恰当地规范大公司对高度敏感的个人数据的使用,数据透明是必要的,然而许多美国人并不认为这是一个问题。例如,在 FCC(监管互联网)的网站上,你可以查看消费者提交的所有投诉,数据隐私甚至没有排在前 5 位,它排在不受欢迎的电话和电话营销之后。显然,这在美国不是一个大问题,这主要是因为消费者不知道该行业的不良做法。

美国数据隐私的现状是极度封闭的,并且将会持续下去,直到大多数消费者对此有所表示。条款和条件协议变得越来越难以理解,尽管它们已经更新以符合新的数据监管法律。总体而言,消费者对他们的数据是如何被收集和使用的一无所知,甚至不知道所收集的关于他们的基本信息类型。随着公司及其软件变得更加侵入性(特别是随着人工智能和机器学习的进步),个人数据隐私将成为一个主要问题。然而,如果没有全国性的行动号召,什么也做不了,这些大公司拥有巨大的游说力量,如果没有明显的反弹,他们将继续不当使用个人数据。

从机器学习的角度看数据类型,并附有示例

原文:https://towardsdatascience.com/data-types-from-a-machine-learning-perspective-with-examples-111ac679e8bc?source=collection_archive---------2-----------------------

几乎任何东西都可以变成数据。建立对不同数据类型的深刻理解是对机器学习模型进行探索性数据分析(EDA)和特征工程的重要前提。您还需要转换一些变量的数据类型,以便在数据可视化和讲故事中为可视编码做出适当的选择。

从机器学习的角度来看,大多数数据可以分为 4 种基本类型:数值数据、分类数据、时间序列数据和文本。

Data Types From A Machine Learning Perspective

数据

数字数据是数据点是精确数字的任何数据。统计学家也可以称数字数据为定量数据。这些数据既可以作为房价等衡量指标,也可以作为统计数据,比如洛杉矶的住宅数量或去年售出的房屋数量。

数字数据可以用连续或离散数据来表征。连续数据可以采用某个范围内的任何值,而离散数据具有不同的值。

Numerical Data

例如,学习 Python 课程的学生人数将是一个离散的数据集。只能有离散的整数值,如 10、25 或 33。一个班级不能有 12.75 名注册学生。一个学生要么去上课,要么不去。另一方面,连续数据是可以落在一个范围内任何地方的数字。比如一个学生的平均分是 88.25,介于 0 到 100 之间。

这里的要点是数字数据没有及时排序。它们只是我们收集的数字。

分类数据

分类数据表示特征,例如曲棍球运动员的位置、球队、家乡。分类数据可以采用数值。例如,也许我们会用 1 代表红色,用 2 代表蓝色。但是这些数字没有数学意义。也就是不能相加,也不能取平均值。

在超级分类的上下文中,分类数据将是类标签。这也类似于一个人是男是女,或者财产是住宅还是商业。

还有一种叫做顺序数据的东西,从某种意义上说,它是数字数据和分类数据的混合。在顺序数据中,数据仍然属于不同的类别,但是这些类别是以某种特定的方式排序的。一个例子是等级难度,比如初级、中级和高级。这三种类型的职业是我们给职业贴标签的一种方式,它们在难度增加时有一个自然的顺序。

另一个例子是,我们只是获取定量数据,并将其分组,因此我们有其他类型数据的箱或类别。

Ordinal Data

出于绘图目的,序数数据的处理方式与分类数据非常相似。但是组通常是从最低到最高排序的,这样我们可以保持这种排序。

时序数据

时间序列数据是在一段时间内定期收集的一系列数字。这非常重要,尤其是在金融这样的特殊领域。时间序列数据附有一个时间值,所以这可能是一个类似日期或时间戳的东西,您可以从中寻找时间趋势。

例如,我们可以测量多年来房屋销售的平均数。时间序列数据和数值数据的区别在于,时间序列数据并不是有一堆没有任何时间顺序的数值,而是有一些隐含的顺序。收集了第一个数据点和最后一个数据点。

CREA

文本

文本数据基本上只是文字。很多时候,你对文本做的第一件事就是用一些有趣的函数把它变成数字,比如单词袋公式。

从机器学习的角度来看,这是四种类型的数据。根据具体的数据类型,这可能会对可用于特征工程和建模的算法类型或可向其提出的问题类型产生一些影响。

如果你有任何问题或意见,请告诉我。以后想写一篇关于基于不同数据类型的特征工程的文章。感谢您的阅读。

报名参加🦞:的 Udemy 课程

具有机器学习和统计的推荐系统

https://www.udemy.com/course/recommender-system-with-machine-learning-and-statistics/?referralCode=178D030EF728F966D62D

统计中的数据类型

原文:https://towardsdatascience.com/data-types-in-statistics-347e152e8bee?source=collection_archive---------0-----------------------

数据类型是统计学的一个重要概念,需要理解这一概念,才能正确地对数据进行统计测量,从而正确地得出关于数据的某些假设。这篇博客文章将向您介绍您需要了解的不同数据类型,以进行适当的探索性数据分析(EDA),这是机器学习项目中最被低估的部分之一。

目录:

  • 数据类型简介
  • 分类数据(名义数据、序数数据)
  • 数字数据(离散、连续、区间、比率)
  • 为什么数据类型很重要?
  • 统计方法
  • 摘要

数据类型简介

很好地理解不同的数据类型(也称为度量尺度)是进行探索性数据分析(EDA)的重要前提,因为您只能对特定的数据类型使用特定的统计度量。

您还需要知道您正在处理的数据类型,以便选择正确的可视化方法。将数据类型视为对不同类型的变量进行分类的一种方式。我们将讨论变量的主要类型,并查看每种类型的示例。我们有时将它们称为测量尺度。

分类数据

分类数据代表特征。因此,它可以代表一个人的性别,语言等。分类数据也可以采用数值(例如:1 代表女性,0 代表男性)。请注意,这些数字没有数学意义。

标称数据

标称值代表离散单位,用于标记没有定量值的变量。就把它们想象成“标签”。请注意没有顺序的名义数据。因此,如果你改变它的值的顺序,它的意义不会改变。您可以在下面看到两个名义特征示例:

描述一个人是否已婚的左侧特征被称为“二分法”,这是一种名义尺度,只包含两个类别。

序数数据

序数值表示离散的和有序的单位。因此,除了排序问题之外,它几乎与名义数据相同。你可以看到下面的例子:

注意,小学和高中的区别不同于高中和大学的区别。这是序数数据的主要局限性,数值之间的差异并不真正为人所知。正因为如此,序数量表通常被用来衡量非数字特征,如快乐、顾客满意度等。

数据

1.离散数据

如果数据的值是不同的和独立的,我们称之为离散数据。换句话说:如果数据只能取某些值,我们称之为离散数据。这类数据无法测量,但可以计算。它基本上代表了可以分类的信息。一个例子是 100 次掷硬币中的人头数。

你可以通过问以下两个问题来检查你是否在处理离散数据:你能统计它吗,它能被分成越来越小的部分吗?

2.连续数据

连续数据代表测量值,因此它们的值无法计算,但可以测量。一个例子是人的身高,你可以用实数线上的区间来描述。

区间数据

间隔值代表具有相同差值的有序单元。因此,当我们有一个包含有序数值的变量,并且我们知道这些值之间的确切差异时,我们称之为区间数据。一个例子是包含给定地点温度的要素,如下所示:

区间值数据的问题在于它们没有“真零”。就我们的例子来说,这意味着没有温度这回事。对于区间数据,我们可以加减,但不能乘、除或计算比值。因为没有真正的零,所以大量的描述性和推断性统计无法应用。

比率数据

比率值也是具有相同差值的有序单位。比率值与区间值相同,不同之处在于它们有一个绝对零点。很好的例子是身高、体重、长度等。

为什么数据类型很重要?

数据类型是一个重要的概念,因为统计方法只能用于特定的数据类型。你必须以不同于分类数据的方式分析连续数据,否则会导致错误的分析。因此,了解你正在处理的数据类型,使你能够选择正确的分析方法。

我们现在将再次检查每种数据类型,但这一次是关于可以应用什么统计方法。为了正确理解我们将要讨论的内容,你必须了解描述统计学的基础知识。如果你不了解他们,可以看看我关于此事的博文(9 分钟阅读):https://towardsdatascience . com/intro-to-descriptive-statistics-252 e 9 c 464 AC 9

统计方法

标称数据

当您处理名义数据时,您通过以下方式收集信息:

频率:频率是某件事情在一段时间内或者在一个数据集中发生的频率。

比例:用频率除以事件总数,可以很容易地计算出比例。(例如,某件事发生的频率除以它可能发生的频率)

百分比。

可视化方法:为了可视化名义数据,你可以使用饼图或条形图。

在数据科学中,您可以使用一种热编码将名义数据转换为数字特征。

序数数据

当您处理序数数据时,您可以使用与处理名义数据相同的方法,但是您还可以使用一些额外的工具。因此,你可以用频率、比例、百分比来总结你的序数数据。你可以用饼状图和柱状图来展示它。此外,您可以使用百分位数、中位数、众数和四分位数范围来总结您的数据。

在数据科学中,您可以使用一种标签编码,将序数数据转换为数字特征。

连续数据

当你在处理连续数据时,你可以用最多的方法来描述你的数据。您可以使用百分位数、中位数、四分位数范围、平均值、众数、标准差和范围来总结您的数据。

可视化方法:

为了显示连续的数据,你可以使用直方图或箱线图。使用直方图,您可以检查分布的集中趋势、可变性、模态和峰度。请注意,直方图无法显示您是否有任何异常值。这就是为什么我们也使用箱线图。

摘要

在这篇文章中,您发现了统计中使用的不同数据类型。您学习了离散数据和连续数据之间的区别,以及什么是名义、顺序、间隔和比率测量尺度。此外,你现在知道你可以在哪个数据类型下使用什么统计测量,以及哪个是正确的可视化方法。您还了解了可以将分类变量转换为数值变量的方法。这使您能够在给定的数据集上创建探索性分析的大部分。

资源

这篇文章最初发表在我的博客上(【https://machinelearning-blog.com】)。

使用 R 可视化 1948 年以来美国航空悲剧的数据

原文:https://towardsdatascience.com/data-visualisations-of-aviation-tragedies-in-the-us-since-1948-4f1d7371b799?source=collection_archive---------7-----------------------

NTSB investigators looking at the fuselage of Asiana Airlines Flight 214 after it crash landed in San Francisco (Wikimedia Commons)

在这篇文章中,我看了一个来自 NTSB 航空事故数据库的数据集,它包含了关于民航事故的信息。在 Kaggle 上也有一个数据集。

这种探索性数据分析 ( EDA )旨在对数据进行初步探索,并初步了解数据集中存在的各种变量之间的关系。

我的目的还在于展示简单理解数据分析争论以及领域知识如何能够更好地理解数据集中变量之间的关系。R Markdown 文件可以在这个 GitHub repo 中找到。

介绍

首先,快速介绍一下我将探索的数据集。该数据集包含与记录的航空事故相关的 31 个变量的 81,013 个观察值。

## [1] 81013 31

变量提供各种主题的信息,包括观察的日期和位置、飞机的型号和类型、乘客和飞机持续受伤的信息以及当时报告的天气情况。

## [1] "Event.Id" "Investigation.Type" 
## [3] "Accident.Number" "Event.Date" 
## [5] "Location" "Country" 
## [7] "Latitude" "Longitude" 
## [9] "Airport.Code" "Airport.Name" 
## [11] "Injury.Severity" "Aircraft.Damage" 
## [13] "Aircraft.Category" "Registration.Number" 
## [15] "Make" "Model" 
## [17] "Amateur.Built" "Number.of.Engines" 
## [19] "Engine.Type" "FAR.Description" 
## [21] "Schedule" "Purpose.of.Flight" 
## [23] "Air.Carrier" "Total.Fatal.Injuries" 
## [25] "Total.Serious.Injuries" "Total.Minor.Injuries" 
## [27] "Total.Uninjured" "Weather.Condition" 
## [29] "Broad.Phase.of.Flight" "Report.Status" 
## [31] "Publication.Date"

数据争论

由于这是来自美国的 NTSB 数据库,该数据库中的大多数事故(超过 94%)是在美国观察到的。因此,在这次分析中,我将重点关注发生在美国的事故。除去国际观测数据后,新的数据框架现在有 76,188 个观测数据。

## [1] 76188 31

当然,一些数据争论是必要的(细节可以在 GitHub repo 中的 R Markdown 文件中找到)。例如,列出的位置名称(城市,州)被分成两个变量:一个用于城市,一个用于州,用于每个观察。

将与观察事件日期相关的变量按日、月和年分解为观察事件日期,以调查一年内事故数量和特定时期之间是否存在任何相关性。更多的数据争论是必要的

此外,显示与给定观测的总死亡人数相关的数据的更好方法是将死亡人数分组。这将使我们能够更好地表示数据集中所有观测数据的死亡率分布。

单变量绘图部分

在这一节中,我将为感兴趣的变量创建单变量图。

按年份、月份和工作日划分的事故

让我们在数据集中绘制事故发生的年份、月份和工作日的频率直方图。数据框架中的大部分观察数据来自 20 世纪 80 年代早期以后。所以我们来生成一个 1980 年到 2017 年的剧情。

事故数量总体上减少了大约。从 1982 年到 2017 年间的约 47%。大约 3400 次观察。1600 次观察。

接下来,让我们看看一年中各月的观测分布。

在给定年份的数据集中,最高数量的事故发生在北半球夏季(6 月-7 月-8 月)。这也可能与暑假期间航班数量增加有关。

最后,让我们看看一周中每天的观察分布。

一周内事故发生频率最高的时间是周末(周六至周日)。同样,这也可能与暑假期间航班数量的增加有关。

致命伤害总数

下一个感兴趣的变量与数据集中每个观察值的致命伤害总数相关。这可以通过每次记录的观察中致命受伤的人数来量化。让我们按照下图所示,对铲斗中的死亡人数进行分组。注意下图中 y 轴使用了 Log10 标度。

大部分记录在案的事故死亡人数为 100 人。

发动机类型

接下来,我查看数据集中记录的飞机发动机型号。我已经缩写了引擎类型名称,以改进 x 轴的标注。注意下图中 y 轴使用了 Log10 标度。

根据上面的图表,报告事故中的大部分发动机类型是商用飞机中流行的往复式发动机类型,特别是在 20 世纪建造的飞机中。最近的飞机,像空客 A380 或波音 787 梦想飞机依靠喷气发动机(例如涡轮风扇发动机、涡轮螺旋桨发动机)。

气象条件

接下来,我查看数据集中记录的天气情况。这里需要熟悉两个关键的航空气象条件: [VMC](http://VMC which stands for visual meteorological conditions and IMC stands for instrument meteorological conditions.) 这意味着条件是飞行员有足够的能见度驾驶飞机,与地形和其他飞机保持目视间隔。 IMC 指天气条件要求飞行员主要参照仪表飞行。

数据集中的大部分事故发生在 VMC 天气条件下,这是飞行的好条件,因为 VMC 比 IMC 需要更大的能见度和云层间隙。

当谈到天气状况和航空事故之间的关系时,我想这将违背大多数人的直觉。飞行员确实训练有素,能够在各种天气条件下飞行,仅仅依靠由他们支配的航空电子仪器。

飞行的大致阶段

接下来,让我们看看数据集中记录的事故的飞行阶段。根据情节,大部分事故发生在着陆或起飞期间。业内众所周知,这些都是高风险的——通常被称为“飞行关键阶段”。

二元地块剖面

让我们来看看变量对之间的关系,它们可能显示出有趣的关系。

发动机类型和致命伤害总数

大部分分布的致命伤害总数在 10 以下,让我们放大这部分数据。R 函数 geom_jitter 用于放大数据点的可视化。

根据该图,10 岁以下死亡人数的大部分数据来自 r 型往复式发动机型。第一个图显示,涡轮风扇发动机比其他发动机有更多的异常值,死亡人数更高。这可能与大型商用飞机上使用的涡轮风扇发动机有关。

天气条件和致命伤害总数

如前所述,天气条件并没有显示出与总致命伤害有特别强的关系。大部分分布与 VMC 的天气条件有关。然而,这可能是因为绝大多数航班都是在 VMC 条件下飞行的。

飞行阶段和致命伤害总数

让我们看看飞行阶段和致命伤害总数之间的关系

这些图表明,起飞和进场与高死亡率的异常值有关。如前所述,由于这个特殊原因,这两个飞行阶段通常被称为“T6”飞行的关键阶段“T7”。

事件月份和工作日以及致命伤害总数

让我们看看事件日期和致命伤害总数之间的关系。我们将关注死亡人数少于 10 人的大部分分布。似乎没有任何特定的月份或工作日显示出特别高的事故频率。

广泛的飞行阶段和天气条件

这些图表明,对于某些天气和飞行阶段的组合,记录的观测频率更高,例如,在飞行的“巡航”或“进场”阶段的 IMC 飞行条件。

飞行和活动月的主要阶段

这些图表明,在着陆和起飞期间,北方夏季月份的记录观测频率更高。在所有月份中,热图还显示起飞和着陆记录了最多的观察数据。

记录事故的经度和纬度

绘制事故发生地的纬度和经度基本上给了我们美国的地图。这些图还表明,与中西部各州和阿拉斯加大部分地区相比,沿海各州受到的影响更大。这可以用往来于美国这些地区的航班数量来解释。然而,一个令人悲伤的图表显示,美国绝大多数州在 1948 年至 2017 年期间遭遇了航空悲剧。

多元图部分

现在我们来看看多元图。

一年中各月观测值的纬度与经度

跨纬度和经度的事故月份分布在整个美国相当广泛,在佛罗里达州等南部各州,冬季的观测数据略高。

天气条件下的经度和纬度

现在让我们来看看纬度与经度的关系,并为天气状况添加图层。

VMC 的天气状况似乎相当稳定,除了中西部某些不连续的地区出现了一些主要的 IMC 状况。

根据天气条件划分的飞行和活动月份的大致阶段

现在让我们来看看飞行的主要阶段与天气条件下的月份之间的关系。我决定留下“未知”天气条件下的观察,因为我认为有不可忽略的观察数量,特别是对于飞行的“巡航”阶段。

当观察飞行的主要阶段与月份和天气条件之间的关系时,我们可以看到事故主要发生在 VMC 天气条件下。然而,对于一年中的某些月份,如 12 月和 1 月,IMC 条件是观测值中不可忽略的一部分,尤其是在飞行的进近和巡航阶段。

致命伤害总数和按天气条件划分的飞行阶段

接下来,让我们看看总致命伤害与天气条件下飞行的主要阶段。我决定把重点放在低于 40 的致命伤害总数上,以突出记录的致命伤害的大部分分布。

IMC 天气条件与飞行“巡航”和“进场”阶段的事故有关,其发生频率高于 VMC 天气条件。

每年致命伤害总数和发动机类型

这个图很有趣,因为它显示了某些引擎是如何在不同时期变得流行的。例如,涡轮喷气发动机和涡轮风扇发动机驱动的飞机在以后的几年中显示出较高的死亡人数,而往复式发动机在早些年中显示出死亡人数的分布,这与现代飞机中越来越多地使用喷气发动机相对应。

结束语

我希望你喜欢这个 EDA,并在这个过程中学到了一些关于航空的东西。我希望这篇文章也展示了用 R 中的 ggplot2 实现简单数据可视化的强大功能。当在数据科学管道的初始阶段探索数据集时,这种技能特别有用。我当然喜欢这个周末做的有趣的小研究。

让您的数据自己说话!少即是多(而且人们不读书)

原文:https://towardsdatascience.com/data-visualization-best-practices-less-is-more-and-people-dont-read-ba41b8f29e7b?source=collection_archive---------0-----------------------

我最近从一家分析公司得到了一些非常可怕的数据可视化的例子,这里就不说了。所以,我开始教育我的员工,好的数据可视化是什么样子,大小、微妙的颜色和位置是传达信息的最佳方式,而不是对他们大喊大叫。如果你仍然在你的图表上使用明亮的背景——看看你,孩子。您需要高数据-油墨比率。这意味着更多的墨水(在大多数情况下,数字墨水)被用来传递数据,而不是任何其他元素。

如果你已经错过了信息过载的时代,只要知道人们不会通读文本——(读者,你还在吗?;你的图表必须坚如磐石。他们必须独立——他们不能接受任何解释。他们不能要求人们阅读附带的文本来理解。它们不应该用大量的亮色和粗体来分散信息——尽量少用这些元素!你不能把认知负担放在用户身上——如果你让理解你的研究变得太难,这肯定不会让他们愿意投资你的公司。你如何向人们传达信息至少和研究本身一样重要!,我内心的科技作家和外在的 UX 自我尖叫道(声明:我是一名科技作家多年:-D)。毕竟,你是想用你的数据赢得人们,而不是迷惑他们!

以下是我将在本文中讨论的一些亮点:

  • 只有在添加信息时才明智地使用不同的颜色
  • 不添加 chartjunk
  • 具有高的数据-墨水比率。彩色背景有损于所传达的信息
  • 使用正确类型的图表来传达信息
  • 理解特定颜色的含义,如红色和绿色,并有节制地使用它们来分别表示问题和成功。
  • 将图表值放在尽可能靠近其详细描述的图形部分。尽可能避免传奇。
  • 使用元素大小、颜色饱和度和位置来传达信息
  • 少即是多!

这里有一些坏数据的例子,更好的是,如何修复它们:

过度使用颜色有损实际数据

颜色应该被明智地使用,只有当使用颜色传达更多的信息。

这张图表有很多问题:

  • 颜色的随意使用和一些类别使用相同的颜色会让人觉得这些类别之间有某种联系。当用户努力寻找例如产品/服务交付速度和移动策略集成之间的联系时,这引入了认知负担。我们想知道,为什么新的商业模式本身是蓝色的?
  • 在图表中,红色通常用于显示错误,橙色用于警告。但在这里,用著名的马克·吐温(我承认我崇拜他)的话来说,最好的做法是,“这条规则被抛下,在上面跳舞”。产品交付的速度用红色表示,但它代表了图表中的最大收益。
  • 明亮的蓝色背景会使用户更加困惑。使用明亮、饱和、引人注目的颜色(尤其是红色、橙色和黄色)会导致眼睛不知道先关注什么。用户最终会跳来跳去,而不是真正接受你想要他们接受的信息。
  • 好像所有的红色还不够,增加了一个红框,进一步分散了用户的注意力,甚至没有任何东西显示为什么红框会在那里。

改版:

在这里,我已经减少到只有蓝色,减少了图形线条的重量,删除了背景(白色背景对大多数用户来说是最可读的),并添加了一个小括号指示器来代替红色框,并配有文本。没有什么留给读者去理解。请记住,读者不会花时间阅读附带的文字,只会快速浏览一下你的图表,看看是否值得进一步研究。你不会再有第一印象的机会了!

重治疗处处招关注——什么重要?!

这是另一个罪魁祸首,整个图表都让你眼前一亮。但是你想传达的关键信息是什么呢?让你困惑的是:

  • 一切都是粗体的——线条、圆圈和数值
  • 图例上的文本看起来很重要,但却被包裹在 4 行中,妨碍了可扫描性
  • 明亮的蓝色背景使整个东西颤动起来
  • 网格线与背景和数据的对比度太高。他们应该被制服,微妙地传递信息,但不是尖叫。

改版:

在这里,一个更饱和的大胆的处理和文字被用来传达重要的部分,和大小被用来立即传达价值的差异。文本被缩短,文本列的长度被加宽,以便更快地扫描。

颜色、文本、箭头——哦,天哪!

有许多事情使下面的图表难以理解。

  • 弹出的是箭头。它们到底是什么意思?我找不到知道的人!49%的内部部门系统流向 36%的客户供应链?什么?
  • 为什么是红色和橙色?!这些本身就引人注目,但在蓝色背景的映衬下,它们似乎在颤动。不是你想要的,除非它是一张迷幻的黑光灯海报,就像我们在大学时代回到斯潘塞(在美国)一样;-D!
  • 不必要的长标签会导致缺乏即时理解。
  • 疯狂长标题!像狄更斯时代一样,这个机构是按角色收费的吗?;-D

一百万年后,你可能也猜不到这些箭头是什么意思——我甚至犹豫是否要告诉你。显然,它们应该是趋势线。嗯……嗯,对我没有,对我问过的其他人也没有。

在这里,在与主要利益相关者交谈后,我简化了——当我们真正想要的是显示外部 API 使用的增加趋势时,显示内部 API 使用的减少趋势有那么重要吗?为了传达这两种价值,把图表弄乱值得吗?在这种情况下,我们决定它不是。

改版:

在这里,将颜色减少到只有两种,都是蓝色的阴影,在这里,外部扩张被显示为更重要,用更饱和的蓝色来吸引注意力。一个简单的花括号指示器被用来代替原始图表上那些神秘的箭头。标题和图例文本被缩短,以便于理解和浏览。

从头开始!

在某个不知名的地方随机出现的图表应该能够解释它们自己,以及它们为什么会出现在那里(是的,马克·吐温的读者,你可能知道我最喜欢的作者的一种说话方式。我是一个博学的人,这意味着我从许多知识流派中汲取知识——我喜欢吐温——如果有一天我发明了时光机,或者你发明了时光机,塞缪尔·克莱门斯是我最想见到的作家!😄)。

除了我们已经详细讨论过的背景和过度饱和、引人注目的颜色之外,这里还有另一个数据 viz 规则——为了有效地传达信息,图表应该从 0 开始。任何其他事情,你试图扭曲数据,以显示其他东西!诚实对待你的数据!

在这里,蛋糕层毫无意义。为什么他们从中间开始?很难比较。相同颜色的条传达了一种不存在的关系。而且横条看起来也不成比例。

改版:

这个超级简单。就像所有优秀的故事讲述者一样,从头开始!我也简化为蓝色主题。正如你将在后面的一些图表中看到的,我也开始使用饱和度来传达意思,但在这里,它们只是不同的蓝色色调:)。

一致地传达信息

如果第一次你使用一种方法来表达一种尺度,不要为了增加更多的颜色而在下一次使用不同的方法!您可能会在前面的示例中认出这个用在折线图上的从低到高的比例,但它变得更加复杂了!

在这里,除了背景和颜色,我已经唠叨够了;-D,红色边框、图例和颜色合并到 x 轴中。网格标记实际上甚至没有必要,因为百分比就在横条上。

改版:

我告诉过你我要开始用饱和度来传达意思,就是这样!耶!通过使用越来越饱和的蓝色,我们传达了意义——低能力到核心能力。投入的时间、精力和金钱由较高的饱和度表示。哦,对了,还有那个花括号来代替上面那个神秘的没有标签的红盒子。图例被简化为仅包含重要信息。

颜色有意义——用它来传达信息!

这里,重要的信息不是“没有计划”部分,而是“是”部分和“没有,但有计划”部分。没有计划是特别不重要的。这表明他们已经想到了这一点,并放弃了这个想法。这里没什么潜力。那么为什么是红色和橙色呢?为什么要用橙色来引起对最不重要部分的注意?

改版:

在这里,我看了颜色的含义——橙色表示没有任何意义的计划,红色表示有任何意义的计划——红色和橙色分别用于错误和警告状态,记得吗?没有计划意味着灯灭了,它是灰色的。我还将标签整合到了细分市场中——我的观众没有眼跳——他们不必在图表和图例之间跳来跳去,这进一步妨碍了理解和浏览。

然后,让我们看看饼状图中的现代性。油炸圈饼的使用范围更广。分隔区段的空间使得比较更加困难。我喜欢甜甜圈的另一点(不,不是吃——我很奇怪,我知道)是潜在的核心圈子。我在这里没有使用任何东西,但是你可以展示一些重要的东西,比如被调查的客户数量,或者甚至一张简单的图片来传达更多的信息。哦,可能性!是的,我爱死 UX 了——这表现出来了吗?;-D

不要让你的读者认为!

哦,这些颜色!它们是什么意思?它们都很亮,但传达不出任何意义!干掉他们,数据可视化蚱蜢!😄

改版:

我不得不在这里做了一点延伸,将不重要的标签移动到段中,但是我觉得这比将标签放在外面的巨大段更好。记住,如果你不能把标签放在片段中,紧挨着它们是下一个最好的选择。例如,如果您必须处理要翻译的设计,这很好。我说的紧挨着,是指毗邻,而不是在传说中。这是我写的另一篇文章,其中我详细讨论了饼图设计和颜色使用,供色盲用户使用,如果你想了解更多信息:https://medium . com/@ Courtney Jordan/design-for-all-users-why-you-should-care-color-blindness-beabd 61943 EB

颜色饱和度和尺寸

哦天哪!我们还能比这更无聊吗?什么重要?一切都是大胆的,意味着什么都不会被关注。什么都不突出,因为什么都突出!

改版:

这可能是我最喜欢的重新设计之一:)。在这里,我用了一种不太饱和的蓝色来显示内部焦点逐渐增加到一种更饱和的蓝色,以部分或完全关注外部客户。我还用大小来传达大多数公司的位置。通过将内部和外部的传说分成两种不同的蓝调,并合计每种的百分比,它减少了蓝调可能造成的认知负担。相信我,我试过了:)。

希望您喜欢学习数据可视化及其在传递信息方面的重要性,尤其是让他们阅读,更重要的是理解它。这不禁让更多人议论起来!好的数据可视化让你的公司好看!什么样的潜在客户会去看一家向他们展示令人困惑的图表的公司?你希望那家公司能够帮助你吗?如果你的答案是肯定的,“我在亚利桑那州有一些海滨房产…”😄

快乐的数据分析和可视化!

数据可视化设计和赏心悦目的命令

原文:https://towardsdatascience.com/data-visualization-design-and-the-eye-candy-imperative-b58afb43f728?source=collection_archive---------4-----------------------

你还记得人们哀叹被称为“信息娱乐”的可怕的新祸害吗?这个词最早出现在 20 世纪 60 年代,但随着 80 年代 MTV 的推出,这个词变得无处不在。如果 MTV 新闻是“信息娱乐”的中心,那么主播库尔特·洛德就是它的代言人。我是看着洛德长大的,我认为他体现了新闻业美好未来的先兆,因为他和 MTV 承认他们的观众对媒体有不同的期望。

事实是,我们需要娱乐(每天都是如此)。但是比这更简单。我们喜欢漂亮的东西。我们喜欢漂亮的人、漂亮的东西和漂亮的想法。如今,即使丑陋也能被遗忘。无论你做什么,不要让我厌烦!

我认为有一种强烈的“赏心悦目的需求”制造美丽的东西不再是一种奢侈。这是强制性的。换句话说,审美很重要。

2016 年我最喜欢的一个项目(现在是一本书)是亲爱的数据。这是两位信息设计师乔治·卢皮和斯蒂芬妮·波萨维克的合作,他们在整整一年的时间里,每周都互相发送个人数据的明信片草图。这个项目在很多层面上都是有趣和鼓舞人心的,尤其是在赏心悦目的背景下。为什么?因为 104 张明信片中没有一张是标准的“图表”

每一个都是某个数据集的独特定制视图。每一个都是赏心悦目的,因为它是数据的美丽而有趣的表达。每个都是“信息娱乐”,因为它是信息(数据)和娱乐(艺术表现)。正如我所说的,它们很好地证实了视觉糖果打动观众的力量。这个项目已经席卷了信息设计界,甚至泄露到了更一般的媒体渠道,比如 Slate 和 Quartz。

视觉糖果在设计中有三个主要的关键目的:

  1. 它让事物在视觉上保持新鲜和有趣
  2. 它能把注意力吸引到重要的东西上
  3. 它可以提醒观众注意功能

反对视觉糖果的一个论点是,“严肃”的人会质疑视觉糖果是否会降低主题的重要性,或者更糟的是,可能会使设计变得不那么有用或不准确。研究证明这不是真的。萨斯喀彻温大学的一项研究调查了“图表垃圾”的概念,这是理解图表信息不必要的修饰,由爱德华·塔夫特创造,至少可以说,他不是一个视觉糖果的粉丝。正如 Tufte 所说,这项研究的目的是确定图表垃圾是否是一个坏主意。

该研究发现,图表垃圾没有任何有害影响——理解的准确性不会因装饰而降低,事实上,与没有添加闪光的图表相比,使用“图表垃圾”视觉效果回忆信息的能力要好得多。

另一项研究研究美学对数据可视化可用性的影响,发现用户更喜欢“漂亮”的图表——最好的例子是旭日图——即使他们通常并不真正理解它们是如何工作的。这项研究还发现,人们会花更多的时间在他们喜欢的图表上,学习它们是如何工作的,他们理解的准确性最终不会受到影响。因此,即使更简单的“更有效的”图表可能适用于您的数据,也有理由使用美观的可视化效果。

换句话说,你应该争取形式和功能最纯粹、最充分的体现。做出好看的,有趣的,动画的,创新的新鲜东西。挑战极限,吸引观众眼球,迫使他们离开舒适区一点。记住要小心——在设计视觉效果时,要非常仔细地考虑可用性和你的最终沟通目标。

要了解更多关于数据故事和信息设计的知识,请加入我的成长社区,在那里我一直在收集关于这个主题的精彩内容。

这篇文章最初发表在信息博客上。

仅使用熊猫的数据可视化和探索:初学者

原文:https://towardsdatascience.com/data-visualization-exploration-using-pandas-only-beginner-a0a52eb723d5?source=collection_archive---------1-----------------------

关于熊猫你需要知道的一切

Pandas 是一个用于 python 编程的开源数据结构和数据分析工具。正如我们从这篇文章中看到的,Python 是 2018 年最受欢迎的数据科学语言。熊猫这个名字来源于 Panel Data 这个词——多维数据的计量经济学。本教程将提供一个初学者指南,如何与熊猫进行数据争论和可视化。

进口熊猫

我们首先导入 pandas,并将其别名化为 pd,以便在分析中使用。

进口熊猫当 pd

加载数据

Pandas 允许您导入各种格式的文件。最流行的格式是 CSV。

第一步是将要加载的文件分配给一个变量,以便能够在以后的分析中操作数据框。数据框基本上是数据集中的行和列的表示

对于 csv 文件

df = PD . read _ CSV(' pathtoyourfile . CSV ')

对于 Excel 文件

df = PD . read _ excel(' pathtofyourfile . xlsx ',sheetname='nameofyoursheet ')

读取在线 HTML 文件

Pandas 还可以使用下面的命令在线读取 HTML 表格

df = PD . read _ html(' linktoonlinehtmlfile ')

您可能需要安装以下软件包才能工作

pip 安装 Beautifulsoup htmllib5 lxml

为了说明你可以对熊猫做的一些事情,我们将使用我在 2017 年收集的来自主要孵化器的推文

为了查看前五项,我们在数据集上调用 head 命令。同样,为了查看数据集中的最后五个元素,我们使用了 tail 函数。检查列的数据类型以及是否有空值通常很重要。这可以使用 info 命令来实现。

从这里我们可以看出,我们的数据集有 24933 个条目,5 列,它们都是非空的。情况不会总是这样。如果有些行是空的,我们必须根据当前的情况适当地处理它们。一种方法是放下它们,另一种方法是填满它们。让我们假设我们的数据集中有一个年龄列,代表发出推文的人的年龄。我们将用如下的平均值来填充它

df['年龄']。fillna(value=df['age']。平均值())

我们也可以决定这样放下它们

df.dropna() 这将删除所有包含空值的列。处理空值非常重要,因为它会影响您从数据中获得的洞察力。

您还可以使用此方法来检查空值

正如我们前面看到的,这个数据集没有空值。

分组通过

我们可能希望按照用户名对所有的推文进行分组,并统计每个组织的推文数量。我们可能也有兴趣看看推文最多的前 10 个组织。

我们使用 Sort_values 按照 tweets 的数量对数据帧进行排序。

总和

因为所有组织都有转发,所以让我们看看哪个组织有最多的转发。我们可以通过按组织的用户名对推文进行分组并对转发进行汇总来实现这一点。

统计数据集中唯一用户名的数量。

我们的数据集中有 26 个独特的组织。

我们可以通过调用列上的 unique 函数得到它们的名字。

统计某一列的项目数

重要的是 value_counts() 不能用于数据帧,它只能用于序列。我们可以通过在 dataframe 上调用它来说明这一点。

对整个数据集应用函数

假设我们想知道每条推文中的字数。我们将创建一个新列来保存该列的长度,然后对其应用len 函数来计算字符数。

您可以通过在上面调用 describe 函数来查看我们刚刚创建的列的描述。

我们可以看到最长的推文有 158 个字符长。我们怎么能看到那条微博呢?

你会注意到我们只能看到推文的一部分。我们可以通过使用 iloc 功能看到完整的 tweet

这意味着我们想要查看位于索引 0 的项目,也就是这种情况下的 tweet。

合并两个数据帧

有时,作为我们数据分析工作的一部分,我们可能需要合并两个数据帧。比方说,我们想找出推文数量和转发数量之间的关系。这意味着我们将有一个包含推文数量的数据帧和另一个包含转发数量的数据帧,然后将它们合并。

有时,您可能还想连接两个数据集。让我们以 Kaggle 竞赛数据集为例。您可能希望加入测试和训练数据集,以便使用完整的数据集。您可以使用 concat 来实现这一点。

使用熊猫进行数据可视化

当你想快速查看你的数据时,用熊猫做可视化是很方便的。让我们用熊猫来绘制推文长度的直方图。

直方图

查看直方图,我们可以看出大多数推文的长度在 120 到 140 之间。

我们现在可以使用相同的概念来绘制散点图,以显示推文数量和转发数量之间的关系。

散点图

这意味着推文数量和转发数量之间存在正相关关系。

区地块

线条图

核密度估计图(KDE

通过从不同的在线课程中学习这一点和更多内容,你可以在 2018 年开始你的职业生涯。

[## Python 中的数据科学训练营

学习 Python 的数据科学,NumPy,Pandas,Matplotlib,Seaborn,Scikit-learn,Dask,LightGBM,XGBoost,CatBoost 等等…

www.udemy.com](https://www.udemy.com/course/data-science-bootcamp-in-python/?referralCode=9F6DFBC3F92C44E8C7F4)

濒危语言的数据可视化

原文:https://towardsdatascience.com/data-visualization-for-extinct-and-language-9cd75fe41da?source=collection_archive---------2-----------------------

作者:明成,徐悦,查维萨拉

GitHub 链接:https://github.com/mc2637/INFO5100Project1.git

我们的项目展示了世界各地灭绝和濒危语言的分布。数据集是从《卫报》发布的 Kaggle 上下载的。它总共包括 14 个变量(即列),但我们只选择了 5 个变量在这个项目中进行可视化:语言的名称、经度、纬度、濒危程度(脆弱、绝对脆弱、严重脆弱、严重濒危或灭绝),以及说话者的数量。

World Map Data Visualization of Extinct and Endangered Language

US Map of Extinct and Endangered Language

我们还为灭绝日期已知的灭绝语言创建了单独的数据集。由于数据集中灭绝的语言较少,我们手动在维基百科上查找每种灭绝语言的灭绝日期。几个灭绝日期是近似的。那些不知道灭绝日期的物种被排除在这个数据之外。我们通过对灭绝年份的排序和分组进一步处理数据,然后随着时间的推移找到累积和。

我们使用 d3-geo-projection 扩展来绘制世界地图(geoNaturalEarth)和美国地图(geoAlbersUSA),使用了教授为课堂练习提供的 JSON 文件。地图描述对于世界地图,我们希望首先展示灭绝和濒危语言的总体分布。我们用圆圈来确定每种语言的位置,并用紫色到黄色的色标来表示相应的濒危程度(灭绝的语言是紫色的,而脆弱的语言是黄色的)。给语言名称贴上标签或显示每种语言的使用者数量会让读者不知所措,导致信息难以辨认,所以我们决定在这张地图上只使用两个变量:位置和濒危程度。

在美国地图中使用了更多的变量,我们添加了一些著名语言的标签和说话者的数量。后者通过改变圆的大小或半径来表示,线性缩放它们。扬声器数量越多,圆圈越大。为了更清楚地查看数据点群,我们决定在左上角创建一个放大的美国西海岸迷你地图。这一次,所有的语言都被贴上了相应的标签,还有不同的圆圈半径(尽管它们中的大多数都有相同的大小,因为它们要么已经灭绝,要么濒临灭绝)。故事当我们在世界地图上绘制了所有数据后,可视化告诉我们世界上所有灭绝和濒危语言的位置。我们注意到一些国家的边境上有许多灭绝的语言,这让我们感到惊讶。例如,在北美西海岸有高度集中的灭绝语言,在中国西部边境也有高度集中的灭绝和濒危语言。此外,灭绝和濒危语言高度集中在南美洲中部和上部、中非和太平洋岛屿。

这是一个非常有趣的发现。我们怀疑在每个国家的边境上有更多的方言,并且有相对较少的人口说这些方言。随着每个国家的官方语言占主导地位,说方言的人数减少了。此外,我们注意到西海岸有许多美洲土著部落语言灭绝或濒临灭绝。我们认为这些语言的灭绝是由于美国历史上土著美国人被置于保留地并被高加索文化和语言所同化。关于美国西海岸灭绝的语言的另一种推测是,西海岸在 20 世纪曾是墨西哥和加拿大的一部分。随着西海岸成为美国的一部分,一些语言灭绝了。

我们希望使用我们的数据可视化来善意地提醒我们的观众,通过拯救某些濒危语言来保护自己的独特遗产。如果越来越多的语言灭绝,那将是极其不幸的,也是世界文化的巨大损失。

使用 Python 进行机器学习和数据科学的数据可视化;

原文:https://towardsdatascience.com/data-visualization-for-machine-learning-and-data-science-a45178970be7?source=collection_archive---------2-----------------------

大家好,

我是萨纳特,目前在 IBM 工作,我基本上是一名数据科学家,喜欢亲自动手处理大量数据。让我在这里缩短我无聊的介绍:P,转到今天的主题“数据可视化”。

注意:写这篇博客时要记住,读者只知道数据可视化的基础知识,有些主题可能太天真。所以请跳过你已经知道的话题,享受剩下的。我欢迎你对博客的所有评论。

众所周知,人们对术语数据议论纷纷,比如大数据、数据科学、数据分析师、数据仓库、数据挖掘等等。其中强调,在当今时代,数据在影响人类的日常活动中起着重要作用。每天我们都会产生超过 2.5 万亿(10 ⁸)字节的数据(链接),从我们的短信、图像、电子邮件,到来自自动驾驶汽车、物联网设备等的数据。手头有如此大量的数据可用,利用这些数据中的有用信息可以帮助每个组织清楚地了解几个领域,如什么可以提高组织的收入,哪个领域需要更多的关注,如何寻求更多的客户关注等。机器学习(ML)、数据科学是人工智能(AI)的一些相关领域,最近这些天从数据中学习的任务在很大程度上已经完成。

通过以上介绍,现在您可能对术语“数据”很感兴趣,并将计划更有效地利用这些可用数据,以获得尽可能多的有用信息。你觉得解读这些收集到的数据很容易吗?可能是没有:()。数据将是原始格式,需要执行几个步骤才能将原始数据转换为有用的信息,就像金匠如何通过对原始黄金进行几个预处理步骤来准备装饰品。这就是数据科学家派上用场的地方,你扔给他/她一份原始数据,他们可以从中为你讲述一个伟大的故事,这对于拥有相同数据的其他人来说并不容易。当这些数据科学家撰写他们的故事(我的意思是使用数据:P)时,将会有几个阶段,如数据获取、数据清洗、数据可视化、建立可用于预测未来信息的模型等。其中一个关键阶段是数据可视化。这是第一步,也是最重要的一步,在这一步中,他们将获得关于数据状况的高级统计概述。以及它的一些属性,如底层分布、异常值的存在以及一些更有用的特性。

“数据是新的石油吗?不,数据是新的土壤。”—大卫·麦坎德斯

为什么要可视化?

你认为在一个表格/数据库文件中给你 100 万个点的数据,并要求你仅仅通过查看表格上的数据来提供你的推论是可行的吗?除非你是一个超人,否则这是不可能的。这就是我们利用数据可视化的时候,其中所有的数据都将被转换成某种形式的图表,并进一步分析。作为一个人,我们比其他人更习惯于从图示中获取大量信息。

孩子们应该从很小的时候就开始学习如何阅读和创建图形。大多数孩子是天生的艺术家,因为我们人类是视觉物种。我们应该利用这一点,因为图形和插图可以成为理解和交流的强大武器——阿尔贝托·开罗

好吧!所以既然说要把枯燥的表格里的数据转换成散点图或者柱状图这样有趣的图示形式,你可能会想,我怎么做呢?我需要为此编写自己的代码吗?没有!实际上,我们可以利用一些流行的编程语言的非常好的包,这些包很容易获得,并且只需要一行代码就可以使工作变得非常简单。这就是现代编程的力量,😄!****

Meme created using imgflip.com

作为一个人,我们可以想象任何二维或三维的东西。但是相信我,你在现实世界中获得的数据绝大多数不会是这样的。作为一名机器学习工程师,处理超过 1000 维的数据是非常常见的。那么在这种数据不止 3D 的情况下,我们能做些什么呢?有一些 降维(DR) 技术,如 PCA TSNELDA等,帮助你将高维数据转换成 2D 或 3D 数据,以便可视化。每种 DR 技术可能会丢失一些信息,但只有它们才能帮助我们在 2d 图上可视化非常高维的数据。TSNE 是用于高维数据可视化的最新 DR 技术之一。

从构建模型的角度来看,通过可视化数据,我们可以发现隐藏的模式,探索数据中是否有任何聚类,我们可以发现它们是否是线性可分的/重叠太多等等。从这个初始分析中,我们可以很容易地排除不适合这种数据的模型,我们将只实现适合的模型,而不会浪费我们宝贵的时间和计算资源。

数据可视化的这一部分是数据科学/ML 领域最初的探索性数据分析(EDA)** 的主要部分。**

我可以使用哪种语言?

Meme created using imgflip.com

我们可以使用多种语言来执行数据可视化,但在数据科学领域使用最广泛的是 Python & R。因此,您的下一个问题可能是, 应该学习哪种语言,哪种语言的范围更广?。答案很简单!纯属你的选择 不过我会推荐 Python;)。r '是一种更具统计性的语言,有几个用于数据科学应用程序的优秀包,而另一方面,Python 被广泛用于通用编程以及数据科学和 ML 相关的应用程序。我对 python 很熟悉,所以我会继续用 python 代码写博客的其余部分,它也有几个很好的包,像 Scikit,Matplotlib,seaborn 等等,对我们帮助很大。特别感谢那些让我们的工作变得简单的开发人员。

使用 Python 绘制数据:

如上所述,Python 有几个很好的包来绘制数据,其中 Matplotlib 是最突出的一个。 Seaborn 也是一个很棒的包,它提供了很多更吸引人的情节,甚至它使用 matplotlib 作为它的基础层。当整个数据存储在 pandas 数据框架中时,Pandas 中也有许多相似类型的绘图,我们也有一个名为 plotly 等的库。在这篇博客中,我们将讨论在开头提到的 2 个包中的不同类型的情节,并让我们详细地探索它们。

Matplotlib 架构:

matplotlib 的体系结构总共有 3 个不同的层,如下所示。

  1. )后端层。
  2. )艺人层。
  3. )脚本层。
  • 后端层:

这是图形的最底层,包含绘图所需的几个功能的实现。后端层 FigureCanvas (将在其上绘制图形的层/表面) Renderer (负责在表面上绘图的类)和 Event (处理鼠标和键盘事件)中有 3 个主要的类。与对应层相比,我们在后端层上做得不多。

  • 艺术家图层:

这是架构中的第二层/最中间层。它主要负责绘制各种函数,比如协调如何在图形画布上使用渲染器的 axis。 简单来说,让我们把纸当做图形画布,把素描笔当做渲染器。那么画师的手就是有一定功能的艺术家图层 ,知道如何素描得到确切的图形。艺术家层有几个可用的类,几个重要的是图形,轴和轴。

Machine learning/Data Science

上面的两张图片解释了艺术家层中不同类之间的层次结构。图形是最上面的一个,一个图形可以包含多个轴,在这些轴上绘图。继续,在每个轴下,我们可以添加多个图。这提供了更多的额外功能来改善地块,这是大多数重型起重工程发生的地方。

  • 脚本层:

这是最上面的一层,我们的大部分代码都将在这一层上运行。对于日常的探索性工作,我们几乎依赖于 matplotlib 的这个脚本层。Pyplot 是脚本层,它提供了与 python 中的 Matlab 几乎相似的功能。脚本层中的方法几乎自动处理其他层,我们需要关心的只是当前状态(图&子图)。因此也被称为 有状态接口

请访问链接进行参考。

Matplotlib 术语:

在这里,让我们看一下使用 Matplotlib 进行数据可视化时的一些常用术语。

页(page 的缩写)学生:无论在哪里。(某函数)被使用,表示我在程序中导入 matplotlib.pyplot 作为 plt 而 sns 表示我导入 seaborn 只是为了方便编码。

**import matplotlib.pyplot as plt
import seaborn as sns**

如果您的系统中还没有安装这些软件包。请安装 Python 3 并在命令提示符下使用下面的代码。

****pip3 install matplotlib
pip3 install seaborn****

斧头:

轴是图中单一地块的整个区域。这个类包含了绘制一个图所需要的几个属性,比如添加标题,给标签,为每个轴上不同类型的图选择 bin 值等等。

我们可以在一个图中有多个轴,这样我们就可以将多个图组合成一个图形。例如:如果我们希望 PDF 和 CDF 曲线在同一个图形中,我们可以创建 2 个轴,并在不同的轴上绘制它们。然后我们可以把它们组合成一个单一的图形。

链接

网格:

当在绘图中启用网格时,将在绘图的背景层添加一组水平线和垂直线。这可以使用 plt.grid()来实现。这对于粗略估计特定坐标的值非常有用,只需查看图即可。

Ref: 链接

图例:

图例只不过是图形中可用的不同图的标记表示。例如,当单个图像中有多个图时(例如:虹膜数据集),图例将帮助我们识别单个图中不同颜色图的正确名称。

参考:链接

支线剧情:

当我们希望在一个图像中有两个或更多的绘图时,我们可以使用 Matplotlib,plt.subplot (xyz)中的 Subplot。xyz 是一个 3 位数整数,其中 x-行数,y =列数,z=该图的索引号。当我们需要比较两个或更多的图而不是将它们放在不同的图像中时,这是最有用的功能之一。

**plt.figure(1,figsize=(30,8))plt.subplot(131)
 #Code for fig1.plt.subplot(132)
#code for fig2plt.subplot(133)
#code for fig3.plt.show()**

Subplots

除了支线剧情之外,尝试使用 gridspec ,这可以帮助我们更有效、更容易地拆分支线剧情中的情节。

参考:链接

标题:

我们可以使用 plt.title()为一个图设置一个标题

xlabel:

plt.xlabel()是设置 x 轴标签的命令

ylabel:

plt.ylabel()是设置 y 轴标签的命令

下图很好地解释了将数据可视化为图形的每个部分。

不同类型的分析:

有不同类型的分析,如下所述。

  1. ****单变量:在单变量分析中,我们将使用单个特征来分析它的几乎所有属性。
  2. ****双变量:当我们比较两个特征之间的数据时,这叫做双变量分析。
  3. ****多变量:比较两个以上的变量称为多变量分析。

在下面的博客中,对于每个图,我将它们标记为(U)、(B)和(M),分别表示为单变量、双变量和多变量图。

讨论的情节:

以下是我将在后续主题中解释的情节列表。

I)散点图(B)

ii)配对图(M)

三)箱线图(U)

iv)小提琴情节(U)

v)分布图(U)

六)联合地块(U)和(B)

七)条形图(B)

八)线形图(B)

一、散点图:

就机器学习/数据科学而言,简单数据可视化最常用的图之一是散点图。该图显示了整个数据集中的每个点相对于任何 2/3 特征(列)的位置。散点图有 2D 版和 3D 版。2D 散点图是重要的/常见的,在这里我们将主要找到数据的模式/聚类和可分性。使用散点图的代码片段如下所示。

**plt.scatter(x,y)**

当我们直接使用 Matplotlib 中的散点图时,我们将得到一个类似于下图的图。我使用虹膜数据集来解释简单的散点图。

**plt.scatter(iris['sepal_length'],iris['sepal_width'])
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.title('Scatter plot on Iris dataset')**

在这里,我们可以看到所有的点都标记在它们相应的位置上,分别对应于它们的 x 和 y 值。让我们调整一下,看看我们是否可以得到不同颜色的点。

**plt.scatter(iris['sepal_length'],iris['sepal_width'],color=['r','b','g'])
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.title('Scatter plot on Iris dataset')**

这个看起来不错!但是颜色是根据它们在数据集中的呈现方式分配给点的。现在,如果我们能根据它们的分类标签给这些点上色,那该有多好。这里的分类标签是 Setosa、Virginica 和 Veriscolor。这就是 Seaborn 出现的地方,它有有效的可视化工具。

**sns.set_style("whitegrid")
sns.FacetGrid(iris, hue="species", size=4) \
   .map(plt.scatter, "sepal_length", "sepal_width") \
   .add_legend()
plt.show()**

万岁!!这个情节现在看起来很酷,只是简单地通过视觉化它,我们可以得出这样的结论,像 setosa 花与其他两个类很好地分开,并且在 virginica 和 versicolor 之间也有一些重叠。facetGrid 中的参数 hue 决定了每个数据点的颜色。这里,我们在色调中使用了物种列(相关要素/类),因此我们以这种方式对该图进行了着色。

这使得 seaborn 在可视化方面比 Matplotlib 更胜一筹。但是不要忘记,我们仍然在 seaborn 的地图函数上使用 Matplotlib 中的 plt.scatter。所以 seaborn 只是让视觉更吸引人。对于 3d 散点图,我们可以使用 plot.ly 来实现。但是有一种方法我们可以尝试,比如在两个变量之间绘制点,并根据第三个变量设置点的大小,我们分析了三个特征。

scatter plot 的文档链接

使用的数据集:虹膜数据集

二。配对图:

我们可以用 Matplotlib 为 2d 使用散点图,甚至为 3D,我们可以从 plot.ly 中使用它。当我们拥有 4d 或更多时,该怎么办?这是当从 seaborn 包的配对情节开始发挥作用。

假设我们在一个数据中有 n 个特征,配对图将为我们创建一个(n x n)图,其中对角线图将是对应于该行的特征的直方图,其余的图是 y 轴中每行的特征和 x 轴中每列的特征的组合。

下面提供了为 Iris 数据集实现的 pair plot 的代码片段。

**sns.set_style("whitegrid");
sns.pairplot(iris, hue="species", size=3);
plt.show()**

通过从 pair plot 获得图的高级概述,我们可以看到哪两个特征可以很好地解释/分离数据,然后我们可以使用这两个特征之间的散点图来进一步探索。从上面的图中,我们可以得出这样的结论,花瓣长度和花瓣宽度是可以很好地分离数据的两个特征。

因为我们将得到 n 个特征的 n×n 图,当我们有更多的特征时,比如 10 个左右,pairplot 可能变得复杂。因此,在这种情况下,最好的办法是使用降维技术将数据映射到 2d 平面,并使用 2d 散点图将其可视化。

pair plots的文档链接。

使用的数据集:虹膜数据集

三。箱线图:

这是一种可用于获取更多数据统计细节的绘图类型。最大值和最小值处的直线也被称为。胡须外的点将被推断为异常值。箱形图给出了第 25、50、75 个四分位数的代表。从箱线图中,我们还可以看到四分位间距(IQR) ,在这里将呈现数据的最大细节。它还让我们清楚地了解数据中的异常点。

Image taken from link

箱线图可在 seaborn 图书馆获得。让我们跳到代码部分。这里 x 是要预测的变量,y 是独立特征。这些箱线图属于单变量分析,这意味着我们仅使用一个变量探索数据,也就是说,我们只是检查特征 axil_nodes 对类生存状态的影响,而不是任何两个独立特征之间的影响。

**sns.boxplot(x='SurvStat',y='axil_nodes',data=hb)**

使用箱线图,如上所述,我们可以看到有多少数据出现在第一个四分位数,有多少点是异常值等。从上述第 1 类的图中,我们可以看到中位数和第 1 个四分位数之间的数据很少/没有。特征 axil_nodes 中的类 1** 也有更多数量的异常点。关于离群值等的这些细节将帮助我们在将数据发送到模型之前做好准备,因为离群值会影响很多机器学习模型。**

箱线图的文档链接

使用的数据集:哈伯曼数据集

四。小提琴情节:

violin 图可以推断为中间的箱线图和数据两侧的分布图(核密度估计)的组合。这可以给我们分布的细节,如分布是否是多模态的,偏斜度等。它也给了我们有用的信息,如 95%的置信区间。下图帮助我们从小提琴的情节中抓住一些重要的部分。

Image taken from Link

小提琴剧情也是来自 seaborn 包。代码很简单,如下所示。

**sns.violinplot(x='SurvStat',y='op_yr',data=hb,size=6)**

从上面的 violin 图中,我们可以推断出两个等级的中位数都在 63 左右,等级 2 的最大人数 op_yr 值为 65,而等级 1 的最大人数 op _ yr 值为 60 左右。第三个四分位数到中位数的点数比第一个四分位数的中位数少,依此类推。

小提琴情节的文档链接

使用的数据集:哈伯曼数据集

动词 (verb 的缩写)分布图:

这是了解数据分布的最佳单变量图之一。在分析单个特征(输入)对因变量(输出)的影响时,我们会大量使用分布图。它也很容易在 seaborn 包中获得。这个图在一个图中给出了 pdf 和直方图的组合。

**sns.FacetGrid(hb,hue='SurvStat',size=5).map(sns.distplot,'age').add_legend()**

从上面的图中,我们可以看到,我们在特征“年龄”(输入特征)上创建了一个分布图,我们使用不同的颜色来表示生存状态(因变量/输出),因为它是要预测的类,我们可以看到它们的 pdf 之间有很大的重叠。尖锐的块状结构是直方图,平滑的曲线称为概率密度函数(PDF)。曲线的 pdf 可以帮助我们识别该特征的基本分布,这是数据可视化/EDA 的一个主要特点。

dist plot的文档链接。

使用的数据集:哈伯曼数据集

不及物动词联合地块:

这是我的最爱之一,联合图的伟大之处在于,在一个图中,我们可以进行单变量和双变量分析。主图将为我们提供双变量分析,而在顶部和右侧,我们将获得所考虑的两个变量的单变量图。有多种选项可供选择,可以使用 seaborn joint plot 函数中的种类参数进行调整。下面显示的是 KDE(核密度估计)的类型,它在等高线图中表示,具有相同边界的所有点将具有相同的值,并且一个点的颜色取决于数据点的数量,即当很少的点具有该值时,它将是浅色的,随着点的增加,它将变得更暗。这就是为什么在这个数据集的中心会更暗,而在两端会更浅/更亮。

我们使用的两个最重要的图是双变量散点图和单变量分布图,因为我们在一个图中得到这两个图,如下所示,这将使我们的工作容易得多。

文档链接

使用的数据集:虹膜数据集

七。条形图:

这是一个广泛使用的图,我们不仅在数据分析中,而且在许多领域的趋势分析中都会多次看到。虽然看起来很简单,但它在分析数据方面很强大,比如每周的销售额、产品收入、一周中每天的网站访问量等等。

代码非常简单,我们将使用 Matplotlib 中的 bar 函数来实现它。下面的代码将给出一个条形图,其中条形的位置用 x 值表示,条形的长度/高度用 y 值表示。

**plt.bar(x,y)**

我将向您展示我在当前工作中创建的一个图表,作为向我的管理层提供回顾性详细信息的主要成员,我需要详细说明之前用简单的表格数据完成的警报趋势分析。然后,通过使用相同的条形图,我的观众会更容易理解。

**a=np.arange(6)
w=0.15fig,ax=plt.subplots(figsize=(12,7),edgecolor='k')
p1=ax.bar(a,d,w,color='b')
p2=ax.bar(a-w,c,w,color='g')
p3=ax.bar(a+w,e,w,color='y')
ax.set_xticks(a)
ax.set_xticklabels(('Apr','May','June','July','Aug','Sep'))
ax.set_title('Alert trend')
ax.legend((p1[0],p2[0],p3[0]),('A','B','C'))
plt.xlabel('Month')
plt.ylabel('No of alerts received')#plt.grid()plt.show()**

这样,我们可以在一个很酷的图表中查看数据,并可以直接向他人传达细节。该图可能简单明了,但在数据科学应用中并不常用。我将在下面提供柱状图的文档,请使用几个参数来得到你想要的图。

柱状图的文档链接

八。线形图:

这是你能在两个变量之间的任何分析的角落里看到的图。线图只是一系列数据点上的值用直线连接起来。这个情节可能看起来非常简单,但它不仅在机器学习中有更多的应用,而且在许多其他领域中也有更多的应用。

代码非常简单,matplotlib 中的绘图函数很好地完成了线图的任务。

**plt.plot(x,y)**

我们称之为在一个图形内绘制多条线,如下所示,其中您需要添加多个 plt.plot()命令,每条线代表一个不同的颜色参数。

从使用 QQplots 进行分布比较,到使用 elbow 方法进行 CV 调整,以及使用 AUC 曲线分析模型性能,都可以使用折线图。

文档链接

到目前为止,我们看到了一些广泛使用的方法,用于从数据中提取有用的信息/洞察力。

我们还可以使用一些可视化工具,将我们最终的信息/推论以剧情的形式传达给观众。让我们看看其中几个常用的。

热图:

热图是一种很好的可视化技术,用于比较任意两个变量/特征的值。seaborn library 的热图将创建一个类似网格的图,并带有一个可选的颜色条。我们为热图的每个元素提供了一个具有特定值的 2D 输入矩阵,它以与输入矩阵相同的形状精确地再现了输出图,并且每个图块根据矩阵的每个元素中提供给其对应图块的值进行着色。

这在矩阵较大的情况下非常有用,我们希望通过简单地查看使用的不同色调来确定哪个值更高、更低等等。不同公司的每周业绩图表可以用热图来绘制

在机器学习应用中,它可以用于表示模型的混淆矩阵,用于超参数调整以绘制 2 个不同超参数之间的误差值等。

seaborn 文档链接

Wordcloud:

Wordcloud 只不过是创建一个图像,其中包含一段/一串中不同大小的所有单词,根据该段中出现的频率而定。如果这个单词在给定的文章中出现的次数更多,它会显得更大更粗。

在你的命令提示符下输入下面一行来安装 wordcloud。

**pip3 install wordcloud**

这是最近在很多地方使用的,通过看到单词 cloud,我们可以像在一个段落中讨论的那样得出结论,而不用读太多。重复次数最多的单词将会比最少出现的单词显得更粗更大。

它可以与文本数据分析一起使用,例如,在执行情感分析和 SEO 优化时,在集群中找到共同的主题等。

文档链接

Graphviz:

决策树算法是流行的非线性模型之一。它构建了一个树,其中每个分裂的条件/特征将基于信息增益或基尼不纯值来选择。

如果你想查看像线性回归这样的线性模型,你可以简单地使用 matplotlib/seaborn,而要可视化树,我们使用一个叫做 Graphviz 的特殊工具。你可以使用下面的命令来安装它,就像我们安装其他 python 包一样。

**pip3 install graphviz**

Sklearn 很好地实现了一个名为 export_graphviz 的函数,它可以帮助我们将决策树模型转换为点格式,这是 graphviz 工具所支持的。

参考: Sklearn 链接

Image taken from Sklearn

树形图:

这是在使用分层聚类技术(如凝聚聚类)时用来可视化所形成的聚类的方法。

这里点之间的每个链/链接,意味着它们属于同一个集群。当数据点的数量很大时,树状结构可能太复杂。

参考:链接到绘制树形图的程序

我认为这对于这篇博客来说已经足够了,这里讨论了各种可视化方法。如果我觉得缺少了什么,如果有必要,我会试着编辑或创建第二部分..

非常感谢你阅读我的博客直到这个结论,如果我占用了你的宝贵时间,我真的很抱歉!!。 发现有用就鼓掌示爱 。如果您还有 2 分钟时间,请给我留下反馈,我可以用它在接下来的日子里提高自己。这是我在互联网上的第一篇博客,如前所述,非常欢迎你的建设性反馈。

“我认为有一个反馈环非常重要,在这个反馈环中,你会不断思考你已经做了什么,以及如何才能做得更好。”
–埃隆马斯克(我的灵感;))

过得愉快,编码快乐:)!!!

- 萨纳特

电子邮件 ID:smartersanat@gmail.com

联系方式:www.linkedin.com/in/sanatmpa

编辑:非常感谢应用人工智能团队从提交的 118 个博客中选择我的博客作为前 20 个特别提到的博客之一。链接

参考资料:

下面这些对我的博客帮助很大,我想通过提供参考来表达我的敬意。

1.)https://dev.to/skotaro/artist-in-matplotlib——某个我想知道的人——花了大量时间在谷歌上搜索“如何做”的问题

2.)https://www.aosabook.org/en/matplotlib.html

3.)https://www . fusioncharts . com/resources/chart-primers/heat-map-chart

4.)Sklearn 库。

5.)应用课程。

6.)维基百科。

7.)Imgflip.com 创造了迷因形象。

数据可视化黑客马拉松风格

原文:https://towardsdatascience.com/data-visualization-hackathon-style-c6dcaabbf626?source=collection_archive---------5-----------------------

我努力将数据从电子表格中解放出来

每个人——公司、政府、个人——都有数据,但很少有人知道如何有效地使用它。数据可以告诉我们如何做出更好的决策,但这些知识往往隐藏在数字中。一个问题是大多数数据看起来像这样:

虽然这里的信息,全球二氧化碳排放量,是“开放数据”,任何人都可以公开下载,但它也可以被锁在电子表格中,这对任何人都有好处。数据科学的核心是将这些毫无意义的数字转化为有用的知识。揭示数字内部洞察力的最有效方式之一是通过数据可视化。

Data from a spreadsheet turned into knowledge

对于在凯斯西储大学举办的黑客马拉松 HackCWRU 2018 ,我想探索公开的二氧化碳数据,并让普通观众可以访问。对于那些没有经验的人来说,一个黑客马拉松是一群充满激情的开发者——程序员、艺术家、硬件专家,偶尔还有数据科学家——在周末聚在一起,连续 24 或 36 个小时为项目工作。有时会有特定的问题需要解决,但在其他情况下,比如使用 HackCWRU,您可以自由选择您的团队和项目。在有限的时间内完成你的目标,睡觉通常是不鼓励的!

HackCWRU 做了各种各样的项目:手机应用、虚拟现实游戏、动作捕捉程序,而我选择做我最喜欢的事情:数据可视化。我单干了,项目名为排放浏览器,坚持在我的所有项目中添加浏览器的习惯(见股票浏览器重量浏览器)。我周末的目标是展示数据可视化如何通过构建一个交互式数据探索网站,将数百万个数字转化为有意义的知识。

整个网站在线可用,代码也可以在 GitHub 上免费获得,供任何人使用或改进。(这个网站在桌面上运行得最好,因为我没有时间让它适应移动设备。这对任何人来说都是一个很好的解决方案!).

在我的过程中,我会在下面展示大部分的结果,但是我强烈推荐任何人访问这个网站来获得完整的体验。

显色法

在我们开始制作视觉效果的有趣部分之前,我们必须找到并清理一些数据。在一个正常的数据科学工作流程中,这要花费一个项目 90%的时间。然而,在有限的时间内工作,我需要干净的数据和快速。我从三个来源收集数据: GapMinder ( 由汤姆·卡登策划)气候数据在线工具世界银行,所有这些都是熟悉的 csv 文件格式。

数据状况良好,但有一些不一致之处,主要与国名有关。我花了很长时间才弄明白,韩国的代码是“Korea,Rep .”而朝鲜的代码是“Korea,Dem”。所有的数据格式化都是用 Python 完成的(在 Jupyter 笔记本中),使用了 Pandas 和 Numpy。数据的最终版本被保存为 json ( Javascript 对象符号),一种机器可读的数据交换格式。

虽然我通常使用 Python 和 R 进行分析和可视化,但数据科学的一部分是了解用于这项工作的正确工具,交互式绘图的最佳选择之一是 D3 . js。D3,数据驱动文档是一个 JavaScript 库,允许您通过一次构建一个元素来控制图表的每个方面。它的学习曲线非常陡峭,但最终结果是值得的!

对于我的第一个图表,我想用地图做些事情,因为我喜欢在地理环境中看到国家之间的比较。我的想法是创建一个世界地图,并在国家上画出与它们排放的二氧化碳量成比例的圆圈。圆圈的颜色将反映该国在排放量方面的排名。由于二氧化碳排放量变化很大,尤其是在过去的几十年里,我加入了一个时间维度,可以选择可视化数据的整个历史(1850 年至 2014 年)和一个选择框,以便用户可以选择特定的年份。最终结果显示在下面的动画中:

You can’t make this in Excel

作为点睛之笔,我添加了工具提示,当你把鼠标放在一个国家上时,它会显示每个国家的确切排放量和该国在给定年份的排名。我喜欢专业制作的图表中像这样的小细节,所以我试着自己做一点!

完成地图后,我想做一个更好的方法来比较随着时间的推移排名靠前的国家。地图动画中隐藏了很多细节,对于可视化随时间变化的轨迹来说不是很好。显示时间序列最常见的方式是简单的线图,我认为没有理由发明不同的解决方案。同样,我在图表中保留了一个交互元素,允许用户选择特定的国家。

制作这个图表最困难的部分是 y 轴上的自动缩放。幸运的是,d3 允许您控制图表的每个方面,所以我能够指定轴的刻度应该更新以匹配排放量最大的国家。我认为这种视觉效果比地图更适合比较排名前 15 位的国家,摆弄它可以揭示出许多真知灼见。例如,中国在 2005 年超过了美国(这不是一个你想成为第一的领域),尽管英国最初是最大的排放国,但到了 2014 年,他们的排放量与工业化国家相比相形见绌。

对我影响最大的数据可视化灵感之一是已故的 GapMinder 创始人汉斯·罗斯林。特别是,在我第一次观看他的演讲后,他展示各国人口统计数据随时间变化的演讲让我记忆犹新,这是任何电子表格都无法做到的。

对于最终的视觉效果,我想尝试重新创建 GapMinder 风格的图表,并在此过程中使用一些额外的社会经济数据。我大量借鉴了迈克·博斯托克的《国家财富与健康图表》( T1 ),制作了自己的动画互动视觉效果。在同一张图上有四个不同的变量,我把它分成如下几个部分

  • x 轴显示的是一个国家的对数人口
  • y 轴显示人均 GDP,衡量一个国家的富裕程度
  • 圆圈的面积与二氧化碳排放量成正比
  • 圆圈的颜色代表国家的等级

最终版本需要一些时间来吸收,因为它提供了相当多的信息!

该图表还允许用户通过将鼠标悬停在标签上来更改年份。当我展示这个的时候,我让很多人将它与汉斯·罗斯林的工作进行比较,这可能是我得到的最高的数据可视化补充!

一旦我把所有的图表放在一起,我就通过复制和粘贴现有的 html/css 模板把一个快速主页和 about page 放在一起。然后,我托管了我的文件,并在亚马逊 S3(一种云存储服务)上创建了一个静态网站。(他的指导很有帮助)。我接受的正规机械工程/数据科学教育并不包括任何网页设计方面的指导,所以整体美感显然还需要一些努力。尽管如此,这三个图表实现了我设定的目标:将这些有价值的公共数据从对任何人都没有好处的电子表格中解放出来!

结论

我确保在所有图表中包含的一个元素是交互性。当我看图表时,我喜欢自己摆弄数据,改变参数以发现所有的细微差别。由于这是一个探索性数据分析(EDA)项目,我想让用户自己得出一些结论。虽然总的信息是二氧化碳的排放量无疑随着时间的推移一直在增加,但人们可以在图表中找到其他有趣的信息。我们认为数据包含客观真理,但即使是数字,不同的个人也会带来自己的解释,影响他们从数据中获得的知识。当然,有些时候我们想用数据来证明一个观点,比如医学试验,但在这种公共数据的情况下,我想让人们更容易使用他们认为合适的数据。

尽管我最终赢得了两个奖项——公民赛道奖和亚马逊网络服务最佳使用奖——但这些奖品并没有从事一个很酷的项目重要。此外,黑客马拉松挑战我学习另一项技能 d3.js,我可以将它添加到我用于数据科学的工具箱中。成功的数据科学家总是愿意学习,不存在你已经掌握一切的阶段。D3.js 可能不值得陡峭的学习曲线——plot . ly 可以在 Python 中使用,并基于 d3 构建,Tableau 允许您非常快速地从干净的数据中制作专业的图表——但我仍然喜欢这个项目。黑客马拉松是获得大量实际问题经验的好方法,我向任何喜欢解决问题/创建独特项目的人推荐它们。虽然我选择采用数据科学的方法,但黑客马拉松欢迎来自各种背景的人,我鼓励任何人尝试一下!

如果有人想改进我的网站,或者有任何其他反馈和建设性的批评,可以通过 Twitter @koehrsen_will 联系我。

Python 中的数据可视化,如 R 的 ggplot2

原文:https://towardsdatascience.com/data-visualization-in-python-like-in-rs-ggplot2-bc62f8debbf5?source=collection_archive---------5-----------------------

教程 PYTHON 数据可视化

一步一步的教程如何创建一个基本的图表到一个出版就绪的 dataviz 图表

Photo by faaiq ackmerd from Pexels

如果你喜欢用 R 的 ggplot2 来绘制数据,但是你必须使用 Python,那么 plotnine 包作为 matplotlib 的替代包是值得研究的。在这篇文章中,我将向你展示如何开始使用 plotnine 进行高效的输出。

如果你想继续,请在 GitHub 上找到完整的脚本:

[## scheithauer/python-plotnine

python 中的数据可视化,就像 R 的 ggplot2 一样

github.com](https://github.com/scheithauer/python-plotnine)

ggplot2

ggplot2 是一个基于图形语法的声明式创建图形的系统。您提供数据,告诉 ggplot2 如何将变量映射到美学,使用什么图形原语,它负责处理细节。资料来源:http://ggplot2.tidyverse.org/

ggplot output; http://ggplot2.tidyverse.org/reference/figures/README-example-1.png

plotnine 作为 python 的 matplotlib 的替代

根据我的经验,ggplot2 的优势是实现了图形的语法

plotnine 是由哈桑·基比瑞吉为 python 编写的图形语法,它给 Python 带来了同样的优势:更少的编码和更容易理解(声明性范例)。

安装绘图仪

# Using pip
$ pip install plotnine         # 1\. should be sufficient for most
$ pip install 'plotnine[all]'  # 2\. includes extra/optional packages

# Or using conda
$ conda install -c conda-forge plotnine

可视化数据

我用的craft-beers-dataset出自 Jean-Nicholas Hould 。它包含了 2410 种美国精酿啤酒的信息。这些信息包括:****

  • abv——酒精的体积含量,0 表示无酒精,1 表示纯酒精
  • 国际苦味单位,描述一种饮料有多苦。
  • 名称 —啤酒的名称。
  • 风格 —啤酒风格(lager、ale、IPA 等。)
  • brewery_id —生产该啤酒的啤酒厂的唯一标识符
  • 盎司 —啤酒的盎司数。

Data set example entries

安装必要的库

**import pandas as pd
import numpy as np
from plotnine import ***

定义有用的常数

**c_remote_data ='[https://raw.githubusercontent.com/nickhould/craft-beers-dataset/master/data/processed/beers.csv'](https://raw.githubusercontent.com/nickhould/craft-beers-dataset/master/data/processed/beers.csv')
c_col = ["#2f4858", "#f6ae2d", "#f26419",
         "#33658a", "#55dde0", "#2f4858",
         "#2f4858", "#f6ae2d", "#f26419",
         "#33658a", "#55dde0", "#2f4858"]**

有用的功能

**def labels(from_, to_, step_):
    return pd.Series(np.arange(from_, to_ + step_, step_)).apply(lambda x: '{:,}'.format(x)).tolist()def breaks(from_, to_, step_):
    return pd.Series(np.arange(from_, to_ + step_, step_)).tolist()**

读取数据并设置索引

**data = pd.read_csv(c_remote_data)data = (
    data.filter([
        'abv',
        'ibu',
        'id',
        'name',
        'style',
        'brewery_id',
        'ounces'
    ]).
    set_index('id')
)**

柱状图

最初的

**fig = (
    ggplot(data.dropna(subset = ['abv'])) +
    geom_histogram(aes(x = 'abv'))
)**

添加颜色

**fig = (
    ggplot(data.dropna(subset = ['abv'])) +
    geom_histogram(
        aes(x = 'abv'),
        **fill = c_col[0], color = 'black'**
    )
)**

添加标签

**fig = (
    ggplot(data.dropna(subset = ['abv'])) +
    geom_histogram(
        aes(x = 'abv'),
        fill = c_col[0], color = 'black'
    ) **+
    labs(
        title ='Distribution of The alcoholic content by volume (abv)',
        x = 'abv - The alcoholic content by volume',
        y = 'Count',
    )**
)**

设置轴缩放比例

**fig = (
    ggplot(data.dropna(subset = ['abv'])) +
    geom_histogram(
        aes(x = 'abv'),
        fill = c_col[0], color = 'black'
    ) +
    labs(
        title ='Distribution of The alcoholic content by volume (abv)',
        x = 'abv - The alcoholic content by volume',
        y = 'Count',
    ) **+
    scale_x_continuous(
        limits = (0, 0.14),
        labels = labels(0, 0.14, 0.02),
        breaks = breaks(0, 0.14, 0.02)
    ) +
    scale_y_continuous(
        limits = (0, 350),
        labels = labels(0, 350, 50),
        breaks = breaks(0, 350, 50)
    )**
)**

应用一个可用的主题

****theme_set(
    theme_538()
)** # one time call**

更改一些主题功能

**theme_set(
    theme_538() **+
    theme(
        figure_size = (8, 4),
        text = element_text(
            size = 8,
            color = 'black',
            family = 'Arial'
        ),
        plot_title = element_text(
            color = 'black',
            family = 'Arial',
            weight = 'bold',
            size = 12
        ),
        axis_title = element_text(
            color = 'black',
            family = 'Arial',
            weight = 'bold',
            size = 6
        ),
    )**
)**

添加一些统计数据

**fig = (
    ggplot(data.dropna(subset = ['abv'])) +
    geom_histogram(
        aes(x = 'abv'),
        fill = c_col[0], color = 'black'
    ) +
    labs(
        title ='Distribution of The alcoholic content by volume (abv)',
        x = 'abv - The alcoholic content by volume (**median = dashed line; mean = solid line)**',
        y = 'Count',
    ) +
    scale_x_continuous(
        limits = (0, 0.14),
        labels = labels(0, 0.14, 0.02),
        breaks = breaks(0, 0.14, 0.02)
    ) +
    scale_y_continuous(
        limits = (0, 350),
        labels = labels(0, 350, 50),
        breaks = breaks(0, 350, 50)
    ) **+
    geom_vline(aes(xintercept = data.abv.mean()), color = 'gray') +
    geom_vline(aes(xintercept = data.abv.median()), linetype = 'dashed', color = 'gray')**
)**

刻面

**fig = (
    ggplot(data.dropna(subset = ['abv', 'style'])[data['style'].dropna().str.contains('American')]) +
    geom_histogram(
        aes(x = 'abv'),
        fill = c_col[0], color = 'black'
    ) +
    labs(
        title ='Distribution of The alcoholic content by volume (abv)',
        x = 'abv - The alcoholic content by volume',
        y = 'Count',
    ) +
    scale_x_continuous(
        limits = (0, 0.14),
        labels = labels(0, 0.14, 0.07),
        breaks = breaks(0, 0.14, 0.07)
    ) +
    scale_y_continuous(
        limits = (0, 300),
        labels = labels(0, 300, 100),
        breaks = breaks(0, 300, 100)
    ) **+
    theme(figure_size = (8, 12)) +
    facet_wrap('~style', ncol = 4)**
)**

散点图

最初的

**fig = (
    ggplot(data.dropna(subset = ['abv'])) +
    geom_point(
        aes(x = 'abv',
            y = 'ibu'),
        fill = c_col[0], color = 'black'
    ) +
    labs(
        title ='Relationship between alcoholic content (abv) and int. bittering untis (ibu)',
        x = 'abv - The alcoholic content by volume',
        y = 'ibu - International bittering units',
    ) +
    scale_x_continuous(
        limits = (0, 0.14),
        labels = labels(0, 0.14, 0.02),
        breaks = breaks(0, 0.14, 0.02)
    )  +
    scale_y_continuous(
        limits = (0, 150),
        labels = labels(0, 150, 30),
        breaks = breaks(0, 150, 30)
    )
)**

将磅值更改为变量

**fig = (
    ggplot(data.dropna(subset = ['abv'])) +
    geom_point(
        aes(x = 'abv',
            y = 'ibu',
            **size = 'ounces'**),
        fill = c_col[0], color = 'black'
    ) +
    labs(
        title ='Relationship between alcoholic content (abv) and int. bittering untis (ibu)',
        x = 'abv - The alcoholic content by volume',
        y = 'ibu - International bittering units',
    ) +
    scale_x_continuous(
        limits = (0, 0.14),
        labels = labels(0, 0.14, 0.02),
        breaks = breaks(0, 0.14, 0.02)
    )  +
    scale_y_continuous(
        limits = (0, 150),
        labels = labels(0, 150, 30),
        breaks = breaks(0, 150, 30)
    )
)**

将点颜色更改为变量

****data['ounces_str'] = data['ounces']
data['ounces_str'] = data['ounces_str'].apply(str)**fig = (
    ggplot(data.dropna(subset = ['abv'])) +
    geom_point(
        aes(x = 'abv',
            y = 'ibu',
            **fill = 'ounces_str'**),
        **alpha = 0.5**,
        color = 'black'
    ) +
    labs(
        title ='Relationship between alcoholic content (abv) and int. bittering untis (ibu)',
        x = 'abv - The alcoholic content by volume',
        y = 'ibu - International bittering units',
    ) +
    scale_fill_manual(
        name = 'Ounces',
        values = c_col) +
    scale_x_continuous(
        limits = (0, 0.14),
        labels = labels(0, 0.14, 0.02),
        breaks = breaks(0, 0.14, 0.02)
    )  +
    scale_y_continuous(
        limits = (0, 150),
        labels = labels(0, 150, 30),
        breaks = breaks(0, 150, 30)
    )
)**

添加线性回归线

**fig = (
    ggplot(data.dropna(subset = ['abv'])) +
    geom_point(
        aes(x = 'abv',
            y = 'ibu',
            fill = 'ounces_str'),
        alpha = 0.5,
        color = 'black'
    ) **+
    geom_smooth(
        aes(x = 'abv',
            y = 'ibu')
    )** +
    labs(
        title ='Relationship between alcoholic content (abv) and int. bittering untis (ibu)',
        x = 'abv - The alcoholic content by volume',
        y = 'ibu - International bittering units',
    ) +
    scale_fill_manual(
        name = 'Ounces',
        values = c_col) +
    scale_x_continuous(
        limits = (0, 0.14),
        labels = labels(0, 0.14, 0.02),
        breaks = breaks(0, 0.14, 0.02)
    )  +
    scale_y_continuous(
        limits = (0, 150),
        labels = labels(0, 150, 30),
        breaks = breaks(0, 150, 30)
    )
)**

刻面

**fig = (
    ggplot(data.dropna(subset = ['abv'])) +
    geom_jitter(
        aes(x = 'abv',
            y = 'ibu',
            fill = 'ounces_str'),
        width = 0.0051,
        height = 5,
        color = 'black'
    ) +
    labs(
        title ='Relationship between alcoholic content (abv) and int. bittering untis (ibu)',
        x = 'abv - The alcoholic content by volume',
        y = 'ibu - International bittering units',
    ) +
    scale_fill_manual(
        guide = False,
        name = 'Ounces',
        values = c_col) +
    scale_x_continuous(
        limits = (0, 0.14),
        labels = labels(0, 0.14, 0.02),
        breaks = breaks(0, 0.14, 0.02)
    )  +
    scale_y_continuous(
        limits = (0, 150),
        labels = labels(0, 150, 30),
        breaks = breaks(0, 150, 30)
    ) **+
    facet_wrap('ounces_str')**
)**

热图

**fig = (
    ggplot(data.dropna(subset = ['abv'])) +
    **geom_bin2d**(
        aes(x = 'abv',
            y = 'ibu')
    ) +
    labs(
        title ='Relationship between alcoholic content (abv) and int. bittering untis (ibu)',
        x = 'abv - The alcoholic content by volume',
        y = 'ibu - International bittering units',
    ) +
    scale_x_continuous(
        limits = (0, 0.14),
        labels = labels(0, 0.14, 0.02),
        breaks = breaks(0, 0.14, 0.02)
    )  +
    scale_y_continuous(
        limits = (0, 150),
        labels = labels(0, 150, 30),
        breaks = breaks(0, 150, 30)
    ) **+
    theme(figure_size = (8, 8))**
)**

箱线图

通用箱线图

**fig = (
    ggplot(data.dropna(subset = ['abv'])) +
    **geom_boxplot**(
        aes(x = 'ounces_str',
            y = 'abv')
    ) +
    labs(
        title ='Distribution of alcoholic content (abv) by size',
        x = 'size in ounces',
        y = 'abv - The alcoholic content by volume',
    ) +
    scale_y_continuous(
        limits = (0, 0.14),
        labels = labels(0, 0.14, 0.02),
        breaks = breaks(0, 0.14, 0.02)
    )
)**

小提琴盒图

**fig = (
    ggplot(data.dropna(subset = ['abv'])) +
    **geom_violin**(
        aes(x = 'ounces_str',
            y = 'abv'),
        fill = c_col[0]
    ) +
    labs(
        title ='Distribution of alcoholic content (abv) by size',
        x = 'size in ounces',
        y = 'abv - The alcoholic content by volume',
    ) +
    scale_y_continuous(
        limits = (0, 0.14),
        labels = labels(0, 0.14, 0.02),
        breaks = breaks(0, 0.14, 0.02)
    )
)**

结论

plotnine 提供了各种不同的可视化,很容易适应定制的输出。如果你有在 R 中使用 ggplot 的经验,那么切换到 plotnine 是毫不费力的。

点击此处查看更多我的文章:

  1. 了解我如何为媒体设计文章
  2. 了解如何使用链接(或管道)在 Python 中编写干净的代码
  3. 学习如何使用 R 分析你的 LinkedIn 数据
  4. 学习如何使用图形语法在 Python 中以描述性的方式创建图表
  5. 了解如何在两分钟内用 python 数据科学代码设置日志

Gregor Scheithauer 是一名顾问、数据科学家和研究员。他专门研究流程挖掘、业务流程管理和分析。你可以在LinkedInTwitter上和他联系,或者在 上这里。谢谢大家!

数据可视化:来自最具创新力的美国城市的 Kickstarter 项目

原文:https://towardsdatascience.com/data-visualization-kickstarter-projects-from-the-most-innovative-us-cities-5da870dcd9b5?source=collection_archive---------0-----------------------

一种结合自然语言处理、t-SNE 和主成分分析的方法

背景

据福布斯报道,2015 年最具创新力的美国城市是:

加利福尼亚州圣何塞
第 1 位;科罗拉多州博尔德
第 2 位;加利福尼亚州旧金山
第 3 位;科瓦利斯
第 4 位;华盛顿州西雅图
第 5 位;科罗拉多州科林斯堡
第 7 位;犹他州普罗沃
第 8 位;德克萨斯州奥斯汀
第 9 位;佛蒙特州伯灵顿
第 10 位;马萨诸塞州波士顿

受到一个精心组织的关于测谎仪的可视化项目的启发,我们很想知道来自上述最具创新性的美国城市的成功 Kickstarter 项目之间是否有任何差异。数据集是 2016 年 11 月在 Kickstarter 上报废所有可用项目得到的。

让我们先来看看上述城市与美国其他城市相比表现如何。

Screenshot of goal amount vs. pledged amount between innovative cities and other cities

事实上,我们可以观察到,来自创新型城市的项目似乎比他们最初的目标承诺了更多的金额,因为可以在灰色线(斜率=1)以上找到更多的项目。

目标

由于测谎仪的帮助,我们已经知道每个城市的哪些类别更受欢迎,我们很想知道创新城市的成功项目名称是否有任何差异。

方法

我们将使用 Google 开发的一种流行的自然语言处理(NLP)算法 word2vec 来执行文本挖掘任务。由于之前我们已经简单的谈过方法论,所以这次我们将重点讨论 word2vec 的实现。但是,建议在继续下一步之前先回顾一下这些概念。

1…将文本语料库作为输入

2…构建一个词汇表

3…学习单词的矢量表示法

4…生成单词向量作为输出

5…将单词向量应用于项目标题

6…创建平均项目标题向量

7…使用 t-SNE 将项目标题矢量转换为 2D 矢量表示

8…可视化美国顶级创新城市的结果

数据准备

1…修复放错位置的数据
由于数据来自于网络剪报,有些行可能放错了位置,需要做一些调整。

2…仅包括创新的美国城市
我们只想从想要的城市中选择项目,因此我们将删除其他城市。

3…清理项目名称
由于项目名称将是我们将要处理的主要变量,我们需要先做一些清理工作,比如去掉标点符号。

模特培训

我们将使用 R 中的 rword2vec 包来演示模型。

1…产生单词向量

虽然大多数分析会删除停用词,因为它们的高频率会在分析中产生噪声,但出于比较目的,我们将保留它们。

library(rword2vec)#Prepare the dataset
train=text$name
train=gsub("[[:punct:]]", "", train)
write(train,"text_data.txt")#Convert phrases to words
word2phrase(train_file = "text_data.txt",output_file = "vec.txt")#Input words to model
model=word2vec(train_file = "vec.txt",output_file = "vec.bin",binary=1)#Convert binary to text format
bin_to_txt("vec.bin","model1text.txt")#Convert .txt to .cvs
model1 <- read.table("model1text.txt",fill=TRUE)
write.csv(model1,"model1.csv")
m1 <- read.csv("model1.csv")

Screenshot of the word vectors produced

我们还可以找到与搜索单词最接近的单词。

distance("vec.bin","new",num=15)
distance("vec.bin","album",num=15)

Screenshot of the top 15 closest words to “new”

Screenshot of the top 15 closest words to “album”

2…将单词向量应用于项目标题(所有单词向量的平均值)

s <- strsplit(data$name, split = " ")
new <- data.frame(V1 = rep(data$id, sapply(s, length)), V2 = unlist(s))colnames(new) <- c("id","word")
colnames(m1)[1] <- "word"
new <- merge(new,m1,by="word")new2 <- aggregate(V2 ~ id, new, mean)
for (i in 4:102){
new3 <- aggregate(new[,i] ~ id, new, mean)
new2 <- merge (new2,new3,by="id")
}colnames(new2)[1] <- "id"
colnames(new2)[2:101] <- paste("V", 1:100, sep="")
new2$id <- as.factor(new2$id)
write.csv(new,"data.csv")

Screenshot of the project title vectors created

3…使用 t-SNE 将项目标题向量转换为 2D(该过程耗时 1 小时)

library(Rtsne)set.seed(1)
tsne <- Rtsne(new2, dims = 2, perplexity=100, verbose=TRUE, max_iter = 500)t = as.data.frame(tsne$Y)
id <- subset(new2,select="id")
t <- merge(id,t,by=0)city <- submydata1[,c(3,28)]final <- merge(city,t,by="id")final$Row.names <- NULL

4…根据城市的 t-SNE 向量绘制 2D 项目标题

library(ggplot2)p <- ggplot(final,
aes(V1, V2, color = final$location1))+
geom_point(alpha=0.7,size=2)
p

Screenshot of the project title vectors with t-SNE

5…使用 PCA 将项目标题向量转换为 2D

pcadata <- new2
pcadata$id <- NULLpr.out=prcomp(pcadata, scale=TRUE)
pr.out$sdev
pr.var=pr.out$sdev ^2
pve=pr.var/sum(pr.var)
pve
plot(pve, xlab="Principal Component", ylab="Proportion of Variance Explained ", ylim=c(0,1),type="b")
plot(cumsum(pve), xlab="Principal Component ", ylab=" Cumulative Proportion of Variance Explained ", ylim=c(0,1), type="b")
pcadata2 <- scale(pcadata, pr.out$center, pr.out$scale) %*% pr.out$rotationid <- subset(new2,select="id")
p <- merge(id,pcadata2,by=0)city <- submydata1[,c(3,28)]pfinal <- merge(city,p,by="id")

Screenshot of the performance of the PCA based on variance explained

6…根据城市的 PCA 向量绘制 2D 项目标题

plot <- ggplot(pfinal,aes(PC1, PC2, color = pfinal$location1))+
geom_point(alpha=0.7,size=0.5)
plot

Screenshot of the project title vectors with PCA

不幸的是,这两种可视化方法都没有对我们最初的理论产生有意义的结果,即在创新的美国城市中,项目名称存在差异。然而,我们从 PCA 中注意到,这些创新城市可能有类似的项目名称,给出了中间的集群。

接下来,我们将检查某些项目标题是否更有可能成功。但是,由于数据量大,我们将取 20%作为样本。

Screenshot of the project titles with PCA by successful and failed status (20% data points as sample)

让我们看看按照创新城市和其他城市来划分项目名称是否会有所帮助。

Screenshot of the project titles with PCA by innovative cities and other cities

最后,无论是失败与成功,还是创新与其他城市,在项目名称上似乎都没有任何有趣的发现。

我们还能做什么?

1…删除停止词以查看性能是否提高
2…我们可以查看项目描述,而不是项目标题

有什么问题、意见或顾虑吗?
jchen6912@gmail.com

优秀游泳运动员比赛成绩的数据可视化(第一部分——数据集)

原文:https://towardsdatascience.com/data-visualization-of-elite-swimmers-competition-results-part-1-datasets-bd09b68154c2?source=collection_archive---------2-----------------------

这篇文章是数据可视化项目《游泳者的历史》制作笔记的第一部分。

[## 游泳运动员的历史

大型游泳比赛中优秀游泳运动员比赛成绩的数据可视化。探索+1500 游泳者的历史…

tany.kim](http://tany.kim/swimmers-history)

游泳是我长期以来的兴趣,我一直想让数据可视化。最近(阅读:一年前:-),我发现一个伟大的网站提供了无数游泳比赛的结果,我试图利用网站上的信息。在这篇文章中,我将讨论我是如何废弃安全的 HTML 页面(用 R) ,提取有用的数据点,最后生成可视化的最佳数据集(用 Python) 。有了数据集,我设计了允许用户选择游泳比赛/事件的可视化,并按游泳者过滤比赛。因此,我在前端包含了用于数据过滤(重新生成数据子集)的 UI 组件设计。为了更好地理解收集到的数据集,我还谈了一下游泳世界。

感兴趣的游泳数据

在 SwimRankings.net 的众多网页中,我关注的是精英游泳运动员渴望参加的国际比赛。目前,自 2007 年以来主要比赛的全部结果都在网站上公开。

五大游泳比赛

从 2007 年到 2016 年,总共报道了 17 场会议。

  • 奥运会:每四年一次——2008 年、2012 年、2016 年
  • 世界锦标赛:每隔奇数年——2007、2009、2011、2013、2015
  • 欧洲锦标赛:每偶数年——2008、2010、2012、2014、2016 年
  • 英联邦运动会:每四年一届非奥运会——2010 年、2014 年
  • 泛太平洋锦标赛:每非奥运四年一届——2010 年、2014 年

奥运项目

游泳项目大体上分为个人和团体两种。在这个项目中,我包括了引入奥运会的项目。例如,较短距离(50 米)仰泳和蛙泳比赛在世界锦标赛中进行,但在奥运会中没有。男女种族之间,没有完美的对称;男子最长自由泳是 1500 米,而女子是 800 米。

该数据集只包括决赛,这使得总共有 544 场比赛(16 场比赛 X 2 个性别 X 17 场比赛)。下面是我使用的数据集中的事件列表。

  • 个人自由泳:50 米、100 米、200 米、400 米、800 米(仅限女子)、1500 米(仅限男子)
  • 个人仰泳:100 米,200 米
  • 个人蛙泳:100 米、200 米
  • 个人蝶泳:100 米,200 米
  • 个人混合泳:200 米,400 米
  • 团体自由泳:4x 100 米、4x 200 米
  • 团体混合泳:4x 100 米

用 R 废弃安全的 HTML 页面

在源网站上,每个事件都在一个单独的页面中提供,该页面在相同的 URL 基础上用参数标识,这些参数包括会议 ID、性别和风格(事件)ID。比如 2016 里约奥运会的(遇见)男子(性别),50 米自由泳项目(风格)页面网址是这样的:

page=meetDetail&meetId=596227&gender=1&styleId=16

为了获得 17 场比赛的 ID,我解析了每场比赛的 meta info 页面(例如,奥运会页面),因为这些页面有到上面 URL 的超链接。获得正确索引值的保证方法是检查源代码。在奥运页面,我关注的部分在这里:

A part that I inspected of the Olympics info page.

A link to a specific meet has the meet ID

代码检查显示每届奥运会的比赛 ID。此外,我从这个来源追踪了主办国和主办城市的名称。

Dropdown menu of styles shows style IDs.

现在我们有了所有的会议 id。样式 ID 是从 meet 页面中的

提取所有 544 场比赛的 R 脚本在这里可用。有了这些脚本,我只想用将整个网页删除并保存为文件,然后用 Python 做更多的数据烹饪。为什么不用 R 或 Python 做所有的事情?我更喜欢 Python 语法的简单性。我尝试用 Python 解析网页,但是用 Python 解析安全页面(https)很棘手。如果你知道一个方法,请让我知道!

用 Python 烹饪数据

下一步是从废弃的网页中只解析有用的部分。

The exact part of resource that I targeted in a webpage

数据解析

与我对 R 所做的类似,我检查了 HTML 标签,并跟踪了比赛信息,包括比赛日期和决赛的结果(例如,里约奥运会 50 米男子自由泳)。

The hyperlink to a swimmer’s info has theathlete ID.

对于每个游泳者,我追踪他们的名字、国家、游泳时间和分数。此外,通过检查源代码,我能够找到每个游泳者的唯一 ID ,它也用作前端上数据过滤/处理的标识符。最后,我得出了总共 869 名男子和 779 名女子游泳运动员的比赛结果。

没有完美的干净数据可以立即满足您的需求。特别是当你想设计独特的和定制的数据可视化,在前端使用数据集之前,优化数据集以满足你的需求是至关重要的。这是因为在客户端使用 Javascript 处理大型数据集需要一些时间,这可能会导致大量的加载时间,并最终导致用户受挫。

格式化用于演示的数据

我想在前端以特定的顺序显示比赛和事件,所以我给每个比赛和比赛名称添加了单个字母。

meet_year_letter = {    
    '2016': 'a',    
    '2015': 'b',
    ...
    '2007': 'j'
}events_name = {    
    '1': ['50m Freestyle', 'a50Fr', '0IND'],    
    '2': ['100m Freestyle', 'b100Fr', '0IND'], 
    ...
    '19': ['400m Medley', 'n400IM', '0IND'],    
    ...
    '40': ['4 X 100m Medley', 'q4X100M', '1TEAM']
}

我分析了所有游泳者的信息。游泳者的信息结构如下:我将记录信息存储为数组。

{
    "id": "4038916",
    "name":"Michael Phelps",
    "country": "United States",
    "records":[
        {
            "place":"2",
            "point":924,
            "race_id":"0OG-a2016--0IND-k100Fly",
            "swimtime":"51.14"
        },
        ....
    ]
}

正如我将在下一篇文章中更详细描述的,我想展示游泳者的网络。使用 Python,我创建了包含任何一对在同一场比赛中一起参赛的游泳运动员的关系信息的数据集。

{
    "source":"4042367",
    "target":"4081509",
    "value":[
        "0OG-a2016--0IND-a50Fr",
        "0OG-e2012--0IND-a50Fr",
        "1WC-d2013--0IND-a50Fr",
        "1WC-d2013--1TEAM-o4X100Fr"
    ]
}

在 Python 脚本的最后,我将它保存为前端的一个 JSON 文件。看 Python 代码这里

前端的数据过滤

考虑到这个项目的真实用例,一次呈现所有游泳者的数据并不是最有用的。人们会有特定的需求,比如“我想看迈克尔·菲尔普斯在奥运会上的所有游泳比赛。”为了支持这一点,我设计了 UI 组件,允许用户选择比赛和事件,并按名称指定游泳者。我假设人们想要比较不同会议上的同一事件或同一会议上的多个事件。这样设计:一旦用户选择会议和事件,所选会议和事件的所有组合都包括在内。此外,她还可以选择游泳运动员,以进一步排除所选游泳运动员没有参加的比赛。

Options for filtering races (Among total 17 meets and 16 events)

例如,选择三届奥运会(2008、2012、2016)和男子所有七项自由泳赛事(50 米、100 米、200 米、400 米、800/1500 米、4 X 100 米接力和 4 X 200 米接力)将返回 21 场比赛(3 X 7)和 166 名游泳运动员。然后,如果通过姓名过滤选项选择了迈克尔·菲尔普斯,则游泳运动员的总数将减少到 140 名。

当该选项面板中的选择被更新时,一个新的数据子集被生成,可视化也被重新创建。React-Redux 很好地管理了这种基于前端的数据处理,我在这里不再进一步讨论。如果你感兴趣,去检查我的 GitHub repo 上的代码。

请继续阅读下一篇关于可视化设计和同一项目构思的帖子。也别忘了查看见解上的帖子。

优秀游泳运动员比赛成绩的数据可视化(第二部分——设计)

原文:https://towardsdatascience.com/data-visualization-of-elite-swimmers-competition-results-part-2-design-dc86d77946b8?source=collection_archive---------5-----------------------

这个帖子是关于一个数据可视化项目游泳运动员的历史。请查看上一篇关于数据集生成的文章

[## 游泳运动员的历史

大型游泳比赛中优秀游泳运动员比赛成绩的数据可视化。探索+1500 游泳者的历史…

tany.kim](http://tany.kim/swimmers-history)

通过利用 SwimRankins.net的数据采集工作,我从 2006 年到 2007 年的 544 场重大赛事中创建了 1648 名游泳运动员的历史数据集。那么如何处理这个数据集呢?在这篇文章中,我描述了三种可视化的构思过程,以及探索数据集的用户交互设计。这篇文章包括了很多在最终决定之前的可视化设计的图片,我希望用它们来帮助其他设计师发展他们自己的想法,避免常见的错误。通过展示同一数据集的各种可视化类型,我还想解释数据集的哪些方面可以根据可视化设计来关注或必须忽略。请注意,下面的可视化示例是用整个数据集的子集制作的;用户可以使用选项面板设置自己的子集。

游泳主题的颜色

首先,让我谈谈你将在可视化中看到的颜色。对于这个游泳主题的项目,我希望主色接近蓝色,强调色比蓝色稍暖一些。我用这三个作为网站设计的通用调色板。由于可视化不是静态图像,我使用这些颜色来突出显示用户交互触发的视觉元素。

在设计可视化效果时,颜色经常被误用,如下所示。

  • 编码不适当的数据维度:在对定量数据进行编码时,颜色不应是首选
  • 冗余:仅出于装饰目的使用颜色会导致数据维度的冗余编码(例如,将颜色渐变应用于条形图,以匹配已经通过条形长度呈现的值)。

因为我已经使用了三种主要颜色来通过鼠标悬停或单击来突出显示视觉元素,所以我尽量减少了其他颜色的使用。然而,通过反复的设计,我加入了三种奖牌颜色,事实证明它们对洞察力的发现非常有效。这是为分类数据(金、银和铜)应用颜色的一个很好的例子。

Examples of using two main, accent colors (top) and medal colors (bottom) in CSS

通过普通比赛的游泳者网络

通常游泳成绩是按比赛和比赛列出的(这正是源网站的组织方式),但我认为可视化可以做得很好的一件事是呈现游泳者之间的关系。为了突出数据的方面,我使用了 D3 中的力定向图形库。

Color-coding medalists also helps users to figure out where to start.

我遵循了网络图的一般设计原则。每个游泳者代表一个圆圈(节点)。当一名游泳运动员参加一场比赛时,他/她可以获得 700+分,位置更高的游泳运动员可以获得更多分。累积的点与节点的大小(面积,而不是直径)成比例。奖牌获得者用每种匹配的奖牌颜色进行颜色编码。我首先没有想到对奖牌颜色进行编码,但事实证明,除了圆圈的大小之外,添加这些颜色有助于区分成绩更好的游泳运动员。

如果游泳运动员在一场或多场比赛中相互竞争,他们就被联系在一起。两个游泳者的连线(边缘)呈现半透明的直线。代表同一个国家在同一个团体项目中一起游泳不被考虑为链接。他们共享的种族越多,线就变得越粗。

下面的四张图片展示了不同的互动状态。

  1. 在正常状态下,我会突出显示金牌、银牌和铜牌获得者。
  2. 选定(单击)的节点用强调色填充。
  3. 对于鼠标悬停效果,使用两种主要颜色来突出显示连接的节点(浅蓝色)和线条(蓝色)。如果链接了以前选择的游泳者,则强调色会被浅蓝色覆盖。
  4. 当选择多个节点时,用户可以突出显示所有连接的圆(用白色)和边(用强调色)。此视图是 2 的替代视图。

Network graph has various states depending on mouse interactions and highlighting options

以种族为中心的可视化

When a rectangle (as an instance of Ledecky’s single result) is selected, other Ledecky’s rectangles are also highlighted in blue.

在实现了上面的网络图之后,我认为如果有另一种方法来表示游泳运动员参加的每一场比赛,那将会很棒,因为比赛信息没有包含在节点-边图中。基本想法是显示比赛中的游泳运动员(如果一个游泳运动员参加了多场比赛,他/她有多个实例),每个游泳运动员在比赛中被显示为一个细矩形。当一个游泳者被悬停或点击时,所选游泳者的所有实例被突出显示。

Iterations of the radial view show its limitation in scaleability (top) and in showing connected swimmers (dots).

直到上面的最终设计,我经历了许多次迭代。首先,我认为在径向视图中显示比赛有点独特,这也将保持网络视图的方形布局。人们在设计可视化时犯的一个常见错误是他们忽略了数据集在缩放时的不同形状。当我想呈现尽可能多的比赛时,我发现在固定大小的画布上很难区分比赛或游泳者。这是我不得不放弃放射状外观的一个原因。

以种族为中心的观点的一个早期想法是通过线条明确地连接同一个游泳者的实例。但是用实际数据实现这个想法并不是很好;游泳运动员并没有参加所有经过筛选的比赛,因此用直线或曲线将它们连接起来会使可视化看起来更加复杂。遗憾的是,我也不得不放弃这个想法,转而接受只用颜色突出显示的想法。

按国家可视化游泳运动员

游泳运动员最重要的比赛是奥运会,我们认为这是国家之间的竞争。人们对了解强大的国家感兴趣,所以我设计了一个视图,通过他们代表的国家来探索游泳运动员。

Early work for the country-based view of swimmers

可视化的第一个想法是在 x 轴上排列国家,并将游泳者列为圆圈,编码他们的总点数(与节点-边图相同)。同样,类似于我上面讨论的径向视图,它的可伸缩性不是很好。我可以垂直列出这些国家,然后如果一个国家有太多的游泳者,它就不适合给定的宽度。为了解决这个问题,我可以把游泳者分成多排,这实际上是个好主意。

但是我想在可视化中显示一个游泳运动员的所有比赛,而不是像网络视图那样;为此,我想了一个方法来呈现游泳运动员在参加的一组比赛。因此,一场比赛是一个正方形,如果一名运动员在多场比赛中游泳,这些正方形被连接起来形成一个宽矩形。矩形可以很宽,因此由这些游泳者组成的国家也会占据很大的空间。

最后,我决定把所有的比赛、游泳者和国家都列在一个方向上,就像我们写文字一样。如果一个游泳者太长而不能适应一条线,它会打断下一条线。这种划分方式可能会令人困惑,因为大多数游泳运动员都在一个完整的矩形中,但我折衷了这一部分,以涵盖一些极端情况(例如,如果您选择男子所有比赛和项目,一些主要的游泳运动员无法在一条线上。)第一名(金牌)、第二名(银牌)和第三名(铜牌)用相应的奖牌颜色填充。我还用这个漂亮的库添加了每个国家的国旗。与其他视图中选择每个游泳者不同,在国家视图中,每个比赛都可以用鼠标悬停,以浅蓝色轮廓突出显示。

The number in the grey circle next to each country name means the number of swimmers.

对游泳运动员比赛成绩的盘问

Swimmers who had the best results a race is highlighted

当用户选择一名游泳者时(通过点击可视化中匹配的可视元素或右边的下拉菜单),该游泳者的比赛结果出现在可视化下方。当选择多个游泳者时,仅显示他们都参加过的比赛(即,比赛的交叉点)。这个额外的表格补充了没有显示详细比赛结果的可视化效果

带有元数据的登录页面

如前所述,用户可以选择将哪些游泳比赛/事件和游泳者包括在可视化中。为了让用户清楚地熟悉这个特性以及数据集的健壮性,我设计了一个入口点来生成相对更有趣的子数据集。

该数据集包括 10 年间的 17 场游泳比赛。我将会议的“元数据”可视化为类似时间轴的视图。我把一条传统的直线时间线修改成了波浪。这样时间线可以区分奇数年和偶数年;大型游泳比赛每隔 2 或 4 年举行一次。此外,我认为海浪符合游泳的主题。对于一个介绍性的可视化,我不想让它太复杂。没有用户交互,但这是一个动画。每年的竞赛名称会随着移动的圆圈到达该年而弹出。我可以添加每次会面的日期,但是过多的文本会使视觉效果更加混乱,所以我省略了它们。****

A subtle variation: the Olympic years are on a higher wave than the non-olympic 4-th years.

感谢阅读!如果你想知道你能从这些可视化图像中学到什么,请看下一篇文章

优秀游泳运动员比赛成绩的数据可视化(第三部分——洞察)

原文:https://towardsdatascience.com/data-visualization-of-elite-swimmers-competition-results-part-3-insights-7ec5862f48a7?source=collection_archive---------7-----------------------

这个帖子是关于游泳运动员的历史。如果你想了解数据处理可视化设计的技术方面,请阅读其他帖子。

[## 游泳运动员的历史

大型游泳比赛中优秀游泳运动员比赛成绩的数据可视化。探索+1500 游泳者的历史…

tany.kim](http://tany.kim/swimmers-history)

即使你对游泳不感兴趣,你也一定听说过一些世界级的游泳运动员,如迈克尔·菲尔普斯或声名狼藉的瑞安·罗切特。如果你是一个游泳爱好者,你可能会对这两位游泳运动员的竞争历史感到好奇。这是一个你可以用游泳运动员的历史来回答的问题。

The Phelps Face

“菲尔普斯脸”是 2016 年里约奥运会期间的一个迷因。人们可能想知道为什么南非游泳运动员惹恼了历史上获得奖牌最多的游泳运动员。嗯,有一个历史,你可以很容易地看到它与游泳运动员的历史!这里我描述几个洞察的例子。

对手的历史

在选项面板中,我选择了所有奥运会和所有个人项目。然后我选择了菲尔普斯和勒克洛斯来比较他们的结果。是的,勒克洛斯在 2012 年以 0.05 秒的优势击败过菲尔普斯一次。

Le Close beat Phelps once in 2012 at 200M butterfly.

It’s something considering there are only 4 Olympic events that Phelps didn’t win.

当我在观看里约奥运会游泳比赛时,可能是 100 米蝶泳或 200 米蝶泳,我听到解说员说匈牙利的拉斯洛·切赫赢得了四枚奥运奖牌,但没有一枚是金牌,每一枚金牌都被菲尔普斯获得。我觉得这太不可思议了,想看看这是不是真的。在过去的 10 年里,两人都参加了蝶泳和个人混合泳比赛。包括另外两次世界锦标赛,Cseh 从未击败过菲尔普斯。他唯一没有输的一次是在他们的最后一场比赛中——他们在里约的 100 米蝶泳比赛中并列获得银牌。我无法想象在自己的大陆上你是最棒的,但不是全世界最棒的。

History of Phelps VS Cseh

At the European Championships, Laszlo Cseh is absolutely dominating in Butterly and Individual Medley.

占优势的游泳运动员

在网络视图中,由于圆圈(节点)的大小代表游泳运动员获得的分数,您可以轻松识别表现更好的游泳运动员。创建一个与迈克尔·菲尔普斯竞争的游泳运动员网络;总共检索到 369 名游泳运动员,你会发现菲尔普斯的圈子明显更大。第二大国家是瑞安·罗切特。

当你选择所有参加过过去三届奥运会的游泳运动员时,你会看到 213 名男子,253 名女子。按性别比较这两个网络,你会发现一个相当大的差异。在男子网中,菲尔普斯是最大的圆心。相比之下,你会看到许多金牌得主的圆圈大小变化不大。

Men (left) and Women (right) Olympian swimmers

游泳运动员的风格分布

Four styles are completed separated in Women’s 2016 Olympics.

游泳运动员参加多种风格的比赛吗?让我们找出答案。转到女子,选择 2016 年里约奥运会,然后是四种泳姿的 100 米和 200 米项目——自由泳、仰泳、蛙泳、蝶泳。有趣的是,你会发现没有一个游泳运动员参加过一种以上的比赛。同样的项目,但对于男子,你会看到勒克洛斯是唯一一个参加多种类型比赛的游泳运动员——他参加了自由泳和蝶泳比赛。

个人游泳运动员

Highlighted swimmer is Paul Bierdermann of Germany.

你也可以调查一个特定的游泳运动员。例如,我想知道德国的保罗·比德尔曼在 2009 年成为世界冠军后的表现。如果你是一个游泳爱好者,你会记得他的记录太好了,因为冠军赛后被禁的高科技泳衣。也许并不奇怪,他的记录被丢弃了;2009 年后,他从未赢得过奥运会或世界冠军,但仍参加了许多决赛。说到德国,我发现了一件令人惊讶的事情——德国男子游泳运动员在过去的三届奥运会上都没有获得任何奖牌。我记得 1988 年奥运会上东德游泳运动员还是个孩子,这很令人惊讶。

Olympic swimmers at final races — no medalists from Germany….

我还看到荷兰也没有任何奖牌获得者(皮尔特·范·登·霍根班德是我最喜欢的游泳运动员之一!)

Swimmers of high points can be selected from the dropdown menu.

在帖子的前面,我讨论过奥运会上没有明显表现突出的女游泳运动员。但是我们仍然可以看到“勤奋”的游泳运动员——《纽约时报》的这篇文章告诉我们来自匈牙利的 Katinka Hosszu 有些“独特”的训练风格。这是我们可以从游泳运动员的历史中发现的。在奥运会、世界锦标赛和欧洲锦标赛上,Hosszu 总共参加了 47 场比赛,这只是最后一场比赛。

我阐明了你可以从主要游泳比赛数据的可视化中发现什么。我在这里写的只是几个见解的例子。如果你发现了什么有趣的东西,请留下你的评论!

连接印度特大城市的列车数据可视化

原文:https://towardsdatascience.com/data-visualization-of-trains-connecting-megacities-of-india-9af691684318?source=collection_archive---------14-----------------------

在过去的十年里,印度经历了前所未有的城市化发展。其中大部分是作为“智能城市任务”的一部分完成的,在该任务中,预计有 98 个城镇具有巨大的潜力,将被转化为智能城市。这些智能城市将配备最新的技术和创新解决方案,帮助市民引领未来。

当我们概述印度的地理环境时,我们看到了这个国家的纵向和横向延伸。这个国家有四个州府大城市。

Plotting megacities of India

这些特大城市位于该国的四个角落,形成一个四边形。

Connecting of the megacities

交通部门连接这些大城市的计划。最近,埃隆·马斯克(Elon Musk)的公司 Hyperloop 计划在全印度建立最快的公共交通网络。详情请查看他们的网站——https://hyperloopindia.in/

这是一个未来的项目,但截至 2017 年,印度公民只依赖印度铁路,因为它是长途运输中最便宜的方式。

Plotting the new upcoming smartcities dotting the paths connecting the megacities

这些特大城市将与散布在连接走廊上的小型智能城市连接在一起。

Abstracting the quadilateral into a circular visual mapping

从图表中我们可以看到,一个圆可以是一个很好的抽象形式,来形象化这些大小城市的地理位置。

Concept : Plotting according to the relative positions

我们需要将所有的点推出圆圈,但仍然基于它们的实际地理位置保持它们在圆圈上的相对位置。

Concept : Chord chart showing the flow from one megacity to the another

我们可以用多种方式来可视化数据流。但是在这种情况下,弦图似乎是最好的方法,因为它直观地告诉你不同站点之间的流量,以及每个站点的总体统计数据。

对于这个项目,我只对大城市进行了研究,而忽略了较小的智能城市。但是在未来,我想把他们也包括在这个可视化中。所以,我们去了加尔各答、钦奈、孟买和新德里,想象了来往的火车数量。

Finding the number of trains departing from megacities to megacities in all days of week

我首先将 irctc.co.in 中的数据手工制表到 excel 表格中(以便于制表)。你可以自由使用任何电子表格。在“irctc”中输入来源和目的地,然后逐一选择一周中的所有日子,并将其列表在电子表格中。在始发地和目的地相同的单元中,列车数量为零,因为我们看到的不是市内列车,而是城际列车

Converting the data from spreadsheet to a matrix format for vizualization

Assign colors to cities for vizualization

和弦图可视化

点击下面的链接,看上面图表的互动版

[## 弦图

编辑描述

www.arkadesignstudio.in](http://www.arkadesignstudio.in/railway/index.html)

理解编码部分

在一个文件夹中,您需要创建以下四个文件:

chord . js——处理可视化(画圆、圆弧等)、排版(CSS)、交互(工具提示信息、鼠标悬停动作等)

index.html—在 html 网页中嵌入不同的部分

matrix.json —包含以矩阵格式可视化的数据库

neighs.csv —包含分配给城市的颜色代码

为了便于设置,你可以将我的项目克隆/分支/下载到你的驱动器上,并上传到网络服务器上(D3 在离线模式下不工作)。

项目链接如下图
https://github.com/arkamajhi/arkamajhi.github.io

请随时回复这篇博文或直接给我回复关于这个研究项目的建议或关于任何有趣项目的信息

读者好
我是 Arka Majhi,IIT 孟买 IDC 设计学科的硕士研究生。作为学术工作的一部分,我做了一个关于数据可视化的练习。这个故事是关于可视化的火车流穿过印度的大城市。

也可以看看我的作品集和资料库

设计作品集:https://www.behance.net/arkamajhi4d63

建筑作品集:http://spadelhi.org/arkamajhi/

工作室网站:http://arkadesignstudio.in/

通过喜欢和张贴你对我的项目的建设性意见来支持我。提前感谢。将等待您的回复。

用于业务影响的数据可视化软件

原文:https://towardsdatascience.com/data-visualization-software-for-business-impact-d869ffba757a?source=collection_archive---------4-----------------------

技术帮助您优化业务运营并创造更多收入。如果不采用技术,就很难保持业务的增长势头。每次你都需要参考你的业务报告,以了解你的业务的确切状况。相反,您可以依靠商业智能工具来了解 KPI 的表现。这种做法会帮助你做出更好更聪明的决定。

使用可视化商业智能软件(仪表盘)会让你的工作轻松很多。它将以图形方式呈现您的业务统计数据——图表、表格和图形——包括业务的所有关键指标。据观察,在商业中更多地采用最新技术会导致更高的投资回报,而较少的采用会导致商业损失。

数据仪表板软件将帮助你专注于业务的关键领域,而无需付出任何额外的努力。您可以根据您的业务模式和公司目标开发仪表板。大多数公司构建仪表板应用程序是为了做出更好的决策,这是商业智能的重要方面。

开发 data dashboard 软件时,您需要考虑以下提示:

  1. 确定关键绩效指标:首先确定将在软件上显示的关键绩效指标,这一点非常重要。很明显,你会看到销售数字,以了解你的业务增长。这是您业务的重要 KPI 之一。销售数字的图表比统计数字更容易理解。明智的做法是在仪表板应用程序中设置大约 3-5 个 KPI。你需要专注于你所寻求的结果的这三到五个方面。
  2. 策划&执行:任何企业的成功都取决于策划及其执行。大多数企业失败的原因是执行不力,这同样适用于为您的企业开发应用程序。您需要关注应用程序的规划和执行。仪表板应用程序应该具有您规划的所有功能,它应该帮助您按照生成的报告执行任务。如果您不清楚自己的操作,仪表板应用程序将会失败。
  3. 需求收集:当您为您的业务计划一个仪表板应用程序时,您需要了解您的团队的需求。与他们讨论应用程序的设计、功能方面和数据要求。一旦收集了需求,就可以开始开发应用程序了。
  4. 反应灵敏:仪表盘软件必须反应灵敏。它应该可以在所有设备上访问,如移动设备、平板电脑、个人电脑,以便您的团队可以从任何地方访问它并更新应用程序。这将是有用的,甚至从你的手机获取重要信息。你需要让它变得移动友好,以便随时与应用程序连接,并且你的团队可以随时轻松访问它。
  5. 最新技术:大数据和机器学习等最新技术可能会给你的业务带来巨大变化。在仪表板应用程序中使用这些技术可以获得最佳效果。

正确使用该软件将有助于您更有效地管理您的业务。如果你打算考虑一个应用程序,那么上面的提示会很有用。

数据可视化状态 2019

原文:https://towardsdatascience.com/data-visualization-state-2018-9cd9adb287e4?source=collection_archive---------11-----------------------

Photo by Lukas Blazek on Unsplash

作为 Sisense 的前端工程师,我需要使用数据可视化库构建多个组件。可视化库的存在是为了帮助我们理解复杂的想法。有大量的库选项可以在网上进行可视化。每一种都有自己的优点和缺点。在我看来,这里有五个最好的可视化库。

首先,我假设您已经知道 React 是什么。如果你对它不熟悉,简短的回答是 React 是一个用于构建用户界面的 JavaScript 库。如果你想要更长的答案,你可以在这里查看更多的。React 由脸书支持,是当今构建 UI 最流行的 Javascript 库。

D3

d3 是一个基于数据操作文档的 javascript 库,这个库使用 web 标准并且是框架不可知的,这意味着 d 3 不关心你是否使用 React、 Vue 或任何其他 javascript 框架,D3 将在任何地方工作,为了证明我所说的,我用不同的库(React、Vue、 Polymer )构建了 3 个应用程序,D3 在所有这些应用程序上都工作得完美无缺。

[## d3React

用 D3 和 React 做的 App。

github.com](https://github.com/leofle/d3app2) [## d3Vue

带有 D3 图形的 Vue 应用程序。

github.com](https://github.com/leofle/d3vue) [## D3 聚合物

聚合物 3.0 应用程序与 D3 图。

github.com](https://github.com/leofle/d3polymer)

D3 使用类似 jQuery 的选择器(对于像我这样的老开发者来说😉)来选择 DOM 元素,通常是 SVG,也可以是 canvas。D3 对 DOM 元素应用操作和事件。

D3 可以操作 DOM 元素,但是因为我们使用 React,React 由于其虚拟 DOM 而在呈现 DOM 方面表现出色,所以我们希望使用 React 来执行该任务。我们将只在计算中使用 D3。

D3 就像所有可视化库之母,不是因为它是最古老的,而是因为许多其他库都是基于 D3 的。这个库继续存在于所有的框架和库中,因为总会有人使用 D3 作为基础创建一个新的库。

D3 graph example

数据可视化的存在是为了帮助我们理解复杂的想法…

对…做出反应

React-vis 是由优步创建的 React 可视化库。有了它你可以轻松地创建常用图表,如****区域条形图饼形图树形图等等。********

React-vis example

GitHub stars:5520

为什么是这个图书馆?

React-vis 库非常容易安装和使用,它有很好的文档,并且由优步支持。事实上,优步是支持数据可视化库的最大公司,这是令人放心的,也是很好的了解。

还有什么可以更好的?

虽然这个库有一个丰富的 API,但是当我们想要添加特定的东西或者扩展它的时候有点困难。(当然可以送个先生!😉).

Photo by Isaac Smith on Unsplash

Chart.js

很棒的库,更好的文档,轻量级,完全响应的图表。7 种图表,包括:条形图、气泡图、圆环图、折线图、极区图、雷达图、散点图。

GitHub stars:43182

为什么是这个图书馆?

尺寸!这个图书馆太小了!!只有 11kb 的 gzipped,在 web 开发规模如此重要的今天,没有比小型库更好的了。

使用原生 API,因此学习曲线很小甚至没有。

还有什么可以更好的?

如果有更多的图表和 svg 选项,这个库会更好。

Chart.js example

VX

这是一个很棒的库,展示了 React 和 D3 的强大功能,快速且轻量级。

GitHub stars:5965

为什么是这个图书馆?

伟大的 API,非常容易制作复杂的图形,vx 在很大程度上是不固执己见的,它提供的开箱即用的图形类型的数量令人难以置信。

VX example

重新 chart

基于 React 组件构建的可组合图表库,包含大量实例的优秀文档。

GitHub stars:11482

为什么是这个图书馆?

小型库,也是可组合的,这意味着您可以在其上构建,并用新组件“组合”不同的图表。

Rechart example

那现在怎么办?

最后,我不得不说,所有这些库都很棒,它们之间的差异很小。它可以是库的大小,或者 API 的不同用法,当然,还有 GitHub 的受欢迎程度。但是最终,在开源世界中,我们知道最受欢迎的库将会更频繁地更新,并且会有一个很棒的社区来添加许多特性。

然而,我也鼓励你们所有人走出去,找到自己的梦想——甚至建造一个!D3 非常强大,允许你用自己的 JS 库包装它。然而,理想的情况是让 D3 进行计算,并让 JS 框架,无论你选择使用哪一个,来进行渲染。这样你就可以制作出令人难以置信的交互式图表。

使用 Matplotlib 实现数据可视化

原文:https://towardsdatascience.com/data-visualization-using-matplotlib-16f1aae5ce70?source=collection_archive---------1-----------------------

数据可视化是商业活动的一个重要部分,因为现在的组织收集了大量的数据。世界各地的传感器都在收集气候数据、用户点击数据、预测方向盘的汽车数据等。所有这些收集到的数据都包含了对企业的关键见解,可视化使这些见解易于解释。

数据只有呈现出来才是好的。

为什么可视化很重要?

可视化是分析和吸收信息最简单的方法。视觉有助于轻松理解复杂的问题。它们有助于识别数据中的模式、关系和异常值。它有助于更好、更快地理解业务问题。它有助于建立一个引人注目的视觉故事。从图像中收集的见解有助于制定企业战略。它也是探索性数据分析(EDA)和机器学习(ML)的许多高级数据分析的先驱。

人类是视觉动物。无数的研究表明,我们的大脑是如何适应视觉的,当它通过眼睛时,处理任何事情都更快。

“即使您的角色不直接涉及数据科学的具体细节,了解数据可视化可以做什么以及它在现实世界中是如何实现的也是很有用的。”

-苎麻雅各布森

python 中的数据可视化可以通过许多包来完成。我们将讨论 matplotlib 包。它可以用于 Python 脚本、Jupyter notebook 和 web 应用服务器。

Matplotlib

Matplotlib 是一个二维绘图库,有助于可视化图形。Matplotlib 模拟 Matlab 的图形和可视化。Matlab 不是免费的,难以扩展,并且作为一种编程语言是乏味的。因此,使用 Python 中的 matplotlib,因为它是一个用于数据可视化的健壮、免费和简单的库。

Matplotlib 图形剖析

Anatomy of Matpotlib

该图包含发生绘图的整个窗口,包含在该图中的是绘制实际图形的位置。每个轴都有一个 x 轴和 y 轴用于绘图。并且包含在轴内的是与每个轴相关联的标题、记号、标签。matplotlib 的一个重要特点是,我们可以在一个图形中包含多个轴,这有助于构建多个图,如下所示。在 matplotlib 中,pyplot 用于创建图形和改变图形的特征。

安装 Matplotlib

在 Jupyter 笔记本中键入!pip install matplotlib,或者如果在 cmd 中不起作用,则键入conda install -c conda-forge matplotlib。这在大多数情况下应该是可行的。

要遵循的东西

Matplotlib 的绘图相当容易。通常,在绘图时,他们在每个绘图中遵循相同的步骤。Matplotlib 有一个名为 pyplot 的模块,可以帮助绘制图形。Jupyter 笔记本用于运行图。我们import matplotlib.pyplot as plt称它为包模块。

  • 使用 Pandas pd.read_csv()导入所需的库和数据集进行绘图
  • 利用熊猫数据帧上的条件提取地块的重要部分。
  • plt.plot()对于绘制折线图,类似地,使用其他功能代替绘图。所有绘图函数都需要数据,数据通过参数在函数中提供。
  • plot.xlabel , plt.ylabel用于分别标注 x 轴和 y 轴。
  • plt.xticksplt.yticks分别用于标注 x 轴和 y 轴观察刻度点。
  • plt.legend()用于表示观察变量。
  • plt.title()用于设置情节的标题。
  • plot.show()用于显示绘图。

柱状图

直方图接受一系列数据,并将这些数据划分为多个条块。然后,它绘制每个箱中的频率数据点(即点的间隔)。这有助于理解数据范围的计数。

何时使用:当我们需要一个图中变量的计数时,应该使用直方图。

商店里出售的特定游戏的数量。

从上面我们可以看到大峡谷游客的直方图。plt.hist()将第一个参数作为水平轴上的数字数据,即 GrandCanyon visitor.bins=10 用于在 GrandCanyon 的游客值之间创建 10 个箱。

从上图中,我们可以看到构成直方图的分量,n 是直方图每个区间中的最大值,即 5、9 等等。

累积属性为我们提供了最终附加值,并帮助我们了解每个仓位的增值。

范围有助于我们理解指定值之间的值分布。

多个直方图有助于理解两个实体变量之间的分布。我们可以看到大峡谷比布莱斯峡谷有更多的游客。

实现 : 直方图

圆形分格统计图表

这是一个圆形图,它被分成几个部分来说明数字比例。饼图的切片是为了显示部分占整体的比例。

何时使用:饼图应该使用很少使用,因为很难比较图表的各个部分。使用柱状图代替,因为比较截面很容易。

电影的市场份额。

注意:饼图不是一个很好的图表来说明信息

上面,plt.pie()将数字数据作为第一个参数,即百分比,将标签显示为第二个参数,即扇区。最终,它显示了数据在饼图中的比例分布。

从上面我们可以看到构成饼图的组件,它返回楔形对象、标签中的文本等等。

饼图可以很容易地定制,并从上面的颜色和标签值格式化。

从上方分解用于从饼图中分离出点。就像切披萨一样。

实现 : 饼状图

时间序列线图

时间序列是一个线形图,它基本上是用一条直线连接数据点。这有助于理解长期趋势。可以用趋势来解释点与点之间的相关性。上升趋势意味着正相关,下降趋势意味着负相关。它主要用于预测、监控模型。

何时使用:当要绘制单个或多个变量随时间的变化时,应使用时间序列。

公司的股票市场分析,天气预报。

首先,将日期转换为 pandas DateTime,以便于绘制数据。

从上面看,fig.add_axes用于绘制画布。检查这个add _ axes 和 add_subplot 有什么区别?了解轴线和支线剧情。plt.plot()将第一个参数作为数字数据,即日期,第二个参数是数字股票数据。AAPL 股票被认为是 ax1,这是外部数字,而在 ax2 上,IBM 股票被认为是用于绘图,这是插图。

在前面的图中,add_axes 用于将轴添加到图形中,而从上面的 add_subplot 将多个 subplot 添加到图形中。无法完成,因为只有 6 个可能的支线剧情。

我们可以看到,科技公司的股票呈上升趋势,显示出交易员投资股票的积极结果。

实施 : 时间序列

箱线图和紫线图

箱线图

箱线图很好地总结了这些数据。这有助于更好地理解我们的分布。

何时使用:当我们需要使用关于数据分布的整体统计信息时应该使用。它可用于检测数据中的异常值。

例如:客户的信用评分。我们可以获得关于标记的最大值、最小值和更多信息。

理解箱线图

Source: How to Read and Use a Box-and-Whisker Plot

在上图中,将方框分成两部分的线代表数据的中位数。方框的末端表示上四分位数(75%),方框的起点表示下四分位数(25%)。上四分位数也称为第三四分位数,同样,下四分位数也称为第一四分位数。下四分位数和上四分位数之间的区域称为四分位数间范围(IQR ),用于估计中间数据的 50%分布(75–25 = 50%)。最大值是数据中的最高值,同样最小值是数据中的最低值,也称为上限。方框外以及最大值和最大值之间的点称为触须,它们显示数据中的值的范围。极值点是数据的异常值。一个常用的规则是,如果一个值小于下四分位数-1.5 * IQR 或大于上四分位数+ 1.5* IQR,则该值为异常值。

bp 包含盒状图组件,如盒、须、中线、帽。Seaborn 是另一个绘图库,它比 matplotlib 更容易构建自定义绘图。patch_artist使定制成为可能。notch让中间看起来更突出。

使用 boxplot 的一个注意事项是观测值中的唯一值没有定义,Seaborn 中的 Jitter Plot 可以克服这个注意事项,或者 Violinplot 也是有用的

小提琴情节

Violin plot 是比 boxplot 更好的图表,因为它对分布有更广泛的理解。它类似于一把小提琴,密集的区域表示更多的数据分布,否则会被箱线图所隐藏

何时使用:它是 boxplot 的扩展。当我们需要更直观地理解数据时,应该使用它。

中间的分数密度似乎更大,因为学生在大多数科目上的得分都接近平均水平。

实现:box plot&violin plot

双轴

双轴有助于可视化绘制相对于 y 轴和同一 x 轴的两个图。

何时使用:当我们需要两个图或同一方向的分组数据时使用。

例:人口,GDP 数据在同一个 x 轴(日期)。

在 y 轴和相同的 x 轴上绘制 2 个图

提取重要细节,即 x 轴的日期、TempAvgF 和不同 y 轴的 WindAvgMPH。

正如我们所知,只有一个轴,twinx()用于缠绕 x 轴,左边的 y 轴用于温度,右边的 y 轴用于风速。

用不同的单位和相同的 x 轴绘制相同的数据

该函数定义为计算不同的数据单位,即从华氏温度转换为摄氏温度。

我们可以看到,左边的 y 轴标绘了华氏温度,右边的 x 轴标绘了摄氏温度。

实现 : 双轴

堆积图和茎图

堆叠图

堆栈图可视化堆栈中的数据,并显示数据随时间的分布。

何时使用:用于检查单个地块中的多个可变面积地块。

这有助于理解多个变量在一段时间内的分布变化。

由于堆叠图需要堆叠,所以使用np.vstack()完成

plt.stackplot接受第一个参数数字数据,即年份,第二个参数垂直堆叠数据,即国家公园。

百分比堆积图

类似于堆栈图,但每个数据都被转换为其所占分布的百分比。

data_prec用于将总体百分比划分为单独的百分比分布。s= np_data.sum(axis=1)沿列计算总和,np_data.divide(s,axis=0)沿行划分数据。

茎图

Stemplot 甚至采用负值,因此差异是从数据中提取的,并随时间绘制。

何时使用:它类似于堆栈图,但区别有助于比较数据点。

diff()用于查找以前的数据和存储在另一个副本中的数据之间的差异。第一个数据点是 NaN(不是数字),因为它不包含任何用于计算差值的先前数据。

(31n)个子情节被创建以容纳图中的 3 行 1 列子情节。plt.stem()将第一个参数作为数字数据,即年份,将第二个参数作为国家公园游客的数字数据。

实现: 栈图&茎图

条形图

条形图显示了数据在几个组中的分布。它通常与直方图相混淆,直方图只采用数字数据进行绘制。它有助于比较多个数值。

何时用:用于多组比较时。

学生在考试中的分数。

plt.bar()将第一个参数作为数字格式的标签,将第二个参数作为它所代表的值的标签。

实现: 柱状图

散点图

散点图有助于可视化 2 个数字变量。它有助于确定数据与每个变量的关系,即相关性或趋势模式。它还有助于检测图中的异常值。

何时使用:用在回归之类的机器学习概念中,其中 x 和 y 是连续变量。它还用于聚类分散点或离群点检测。

plt.scatter()采用 2 个数值参数来分散图中的数据点。它类似于线图,只是没有相连的直线。我们所说的相关性是指 GDP 与预期寿命的相关性,正如我们所看到的,这是正相关的,这意味着随着一个国家 GDP 的增加,预期寿命也会增加。

通过采用 GDP 的对数,我们可以有更好的相关性,因为我们可以更好地拟合点,它将 GDP 转换为对数标度,即 log(1000 美元)=3。

三维散点图

3D 散点图有助于在三维图中显示 3 个数值变量。

它类似于散点图,只是这次我们添加了 3 个数字变量。通过观察该图,我们可以推断,随着年份和 GDP 的增加,预期寿命也会增加。

实现 : 散点图

在这个Github Repo中找到上面的代码。

结论

总之,我们学习了如何使用一个数字变量和多个变量构建数据可视化图。我们现在可以很容易地构建图表,通过可视化直观地理解我们的数据。

使用 Seaborn 的数据可视化

原文:https://towardsdatascience.com/data-visualization-using-seaborn-fc24db95a850?source=collection_archive---------3-----------------------

“turned on flat screen monitor” by Chris Liverani on Unsplash

我回来了,带着 seaborn 教程。上次我们学习了使用 Matplotlib 的数据可视化。

Seaborn 是一个基于 matplotlib 的 Python 数据可视化库。它提供了一个高层次的界面来绘制有吸引力的和信息丰富的统计图形。

关键特征

  • Seaborn 是一个统计绘图库
  • 它有漂亮的默认风格
  • 它还被设计成能很好地处理熊猫数据帧对象。

安装和入门

要安装 seaborn 的最新版本,可以使用 pip:

pip 安装 seaborn

也可以使用 conda 安装发布版本:

康达安装海博

或者,您可以使用 pip 直接从 github 安装开发版本:

pip 安装 git+https://github . com/mwaskom/seaborn . git

另一个选择是克隆 github 库并从您的本地副本安装:

pip 安装。依赖 Python 2.7 或 3.5 以上版本

强制依赖项

numpy(> = 1 . 9 . 3)
scipy(>= 0 . 14 . 0)
matplotlib(>= 1 . 4 . 3)
熊猫(> = 0.15.2)

推荐的依赖项

统计模型(> = 0.5.0)

可选阅读

TestingTesting
要测试 seaborn,在源码发布的根目录下运行 make test。这将运行单元测试套件(使用 pytest,但是许多旧的测试使用 nose asserts)。它还运行函数 docstrings 中的示例代码,对更广泛、更真实的示例用法进行冒烟测试。
全套测试需要一个互联网连接来下载示例数据集(如果它们之前没有被缓存),但是单元测试应该可以离线运行。

bug

请通过 github 问题跟踪器报告您遇到的任何错误。在一个示例数据集(通过 load_dataset()访问)中包含一个可重复的示例将会非常有帮助。如果不知道你正在使用的 seaborn 和 matplotlib 的版本,以及你正在使用什么样的 matplotlib 后端来绘制图形,很难调试任何问题,所以请在你的错误报告中包括这些内容。

注意:本文假设您熟悉 python basic 和数据可视化。尽管如此,面对任何问题,评论或电子邮件给我你的问题。

参考我们的— 使用 Matplotlib 进行数据可视化

[## 红米 6 Pro(金色,3GB 内存,32GB 存储)

Redmi 6 Pro(金色,3GB 内存,32GB 存储空间):亚马逊

www .亚马逊. in](https://www.amazon.in/Redmi-Pro-Gold-32GB-Storage/dp/B07DJHV6S7/ref=as_li_ss_tl?_encoding=UTF8&smid=A23AODI1X2CEAE&pf_rd_m=A1VBAL9TL5WCBF&pf_rd_s=&pf_rd_r=50K466P7CMTN9W8Q780N&pf_rd_t=36701&pf_rd_p=e1fc9d07-6588-4865-b544-7a2a6ae17329&pf_rd_i=desktop&linkCode=ll1&tag=themenyouwant-21&linkId=e7387d6c0ffdd6bd50b46b5d1358036b&language=en_IN) [## 实践机器学习与 Scikit-Learn 和张量流:概念,工具和技术…

用 Scikit-Learn 和张量流实践机器学习:概念、工具和技术来建立…

www .亚马逊. in](https://www.amazon.in/gp/product/9352135210/ref=as_li_ss_tl?ie=UTF8&pd_rd_i=9352135210&pd_rd_r=78c1d00c-dee3-11e8-b353-add13b1583b7&pd_rd_w=1ioa9&pd_rd_wg=ctqpm&pf_rd_m=A1VBAL9TL5WCBF&pf_rd_s=&pf_rd_r=50K466P7CMTN9W8Q780N&pf_rd_t=36701&pf_rd_p=6d72b06e-660a-431b-b792-d8ca3a121c2b&pf_rd_i=desktop&linkCode=ll1&tag=themenyouwant-21&linkId=7f475732e6079a0f7c3455271a79dc17&language=en_IN)

在[1]中:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

在[2]中:

census_data = pd.read_csv('census_data.csv')
census_data.describe()

Out[2]:

Figure 1

在[3]中:

census_data.head()

Out[3]:

Figure 2

在[4]中:

census_data.info()

Out[4]:

Figure 3

可视化统计关系

统计分析是一个了解数据集中的变量如何相互关联以及这些关系如何依赖于其他变量的过程。可视化可以是这一过程的核心组成部分,因为当数据被适当地可视化时,人类视觉系统可以看到指示关系的趋势和模式。

我们今天将讨论大多数的 seaborn 函数-

散点图

散点图是统计可视化的支柱。它使用点云来描述两个变量的联合分布,其中每个点代表数据集中的一个观察值。这种描绘允许眼睛推断关于它们之间是否有任何有意义的关系的大量信息。

在 seaborn 中绘制散点图有几种方法。当两个变量都是数字时,应该使用的最基本的函数是 scatterplot()函数。

在[5]中:

sns.scatterplot(x='capital_loss',y='capital_gain',data=census_data)

Out[5]:

<matplotlib.axes._subplots.AxesSubplot at 0xaafb2b0>

Figure 4

在[6]中:

sns.set(style="darkgrid")
tips = sns.load_dataset("tips")              *#tips is inbuild dataset in seaborn*
sns.relplot(x="total_bill", y="tip", data=tips);

Figure 5

注意:散点图()是 relplot()中的默认种类(也可以通过设置 kind="scatter "来强制):

在[7]中:

*# adding some additional parameters*
sns.scatterplot(x='capital_loss',y='capital_gain',hue='marital_status',data=census_data)*# hue:  Can be either categorical or numeric, although color mapping will*
*#          behave differently in latter case.*

Out[7]:

<matplotlib.axes._subplots.AxesSubplot at 0xac406a0>

Figure 6

在[8]中:

sns.scatterplot(x='capital_loss',y='capital_gain',hue='marital_status',size='age',data=census_data)

Out[8]:

<matplotlib.axes._subplots.AxesSubplot at 0xadc95c0>

Figure 7

在[9]中:

*# As I said above the scatterplot() is the default kind in relplot() (it can also be forced by setting kind="scatter"):*
*# see difference*
sns.relplot(x='capital_loss',y='capital_gain',hue='marital_status',size='age',data=census_data)

Out[9]:

<seaborn.axisgrid.FacetGrid at 0xacdeb70>

Figure 8

线形图

散点图非常有效,但是没有普遍最佳的可视化类型。相反,可视化表示应适应数据集的具体情况以及您试图通过绘图回答的问题。

对于某些数据集,您可能希望了解某个变量随时间的变化,或者类似的连续变量。在这种情况下,一个好的选择是画一个线图。在 Seaborn 中,这可以通过 lineplot()函数直接完成,或者通过设置 kind=" line ":

在[10]中:

df = pd.DataFrame(dict(time=np.arange(500),
                       value=np.random.randn(500).cumsum()))
g = sns.relplot(x="time", y="value", kind="line", data=df)
g.fig.autofmt_xdate()*"""*
*Figure-level interface for drawing relational plots onto a FacetGrid.**This function provides access to several different axes-level functions*
*that show the relationship between two variables with semantic mappings*
*of subsets. The ``kind`` parameter selects the underlying axes-level*
*function to use:**- :func:`scatterplot` (with ``kind="scatter"``; the default)*
*- :func:`lineplot` (with ``kind="line"``)*
*"""*

Out[10]:

Figure 9

在[11]中:

age_vs_hours_per_week = sns.relplot(x="age", y="hours_per_week", kind="line", data=census_data

Out[11]:

Figure 10

在[12]中:

age_vs_hours_per_week = sns.relplot(x="age", y="hours_per_week", kind="line",sort=**False**, data=census_data)

Out[12]:

Figure 11

Lineplot()假设您经常尝试将 y 绘制为 x 的函数,默认行为是在绘制之前按 x 值对数据进行排序。但是,这可以禁用:

显示与方面的多重关系

我们在本教程中强调,虽然这些函数可以一次显示几个语义变量,但这样做并不总是有效。但是当你想了解两个变量之间的关系是如何依赖于一个以上的其他变量的时候呢?

最好的方法可能是制作一个以上的情节。因为 relplot()基于 FacetGrid,所以这很容易做到。要显示附加变量的影响,不要将其分配给图中的语义角色之一,而是使用它来“分面”可视化。这意味着您需要制作多个轴,并在每个轴上绘制数据子集:

在[13]中:

sns.relplot(x='capital_loss',y='capital_gain',hue='marital_status',size='age',col='gender',data=census_data)

Out[13]:

<seaborn.axisgrid.FacetGrid at 0xc8a1240>

Figure 12

在[14]中:

sns.relplot(x='capital_loss',y='capital_gain',hue='marital_status',size='age',col='income_bracket',data=census_data)

Out[14]:

<seaborn.axisgrid.FacetGrid at 0xcdc25c0>

Figure 13

您也可以这样显示影响两个变量:一个通过列上的分面,一个通过行上的分面。当您开始向网格中添加更多变量时,您可能希望减小图形大小。请记住,FacetGrid 的大小由每个面的高度和纵横比来参数化:

在[15]中:

sns.relplot(x='capital_loss',y='capital_gain',hue='marital_status',size='age',col='income_bracket',row='race',height=5,data=census_data)

Out[15]:

<seaborn.axisgrid.FacetGrid at 0xcdc2320>

Figure 14

Figure 15

Figure 16

用分类数据绘图

在关系图教程中,我们看到了如何使用不同的可视化表示来显示数据集中多个变量之间的关系。在示例中,我们关注的是两个数值变量之间的主要关系。如果其中一个主要变量是“分类的”(被分成离散的组),那么使用一种更专业的可视化方法可能会有所帮助。

在 seaborn 中,有几种不同的方法来可视化涉及分类数据的关系。类似于 relplot()与散点图()或线图()之间的关系,有两种方法可以制作这些图。有许多轴级别的函数可以以不同的方式绘制分类数据,还有一个图形级别的接口 catplot(),可以对它们进行统一的高级访问。

将不同的分类图种类看作属于三个不同的家族是有帮助的,我们将在下面详细讨论。它们是:

分类散点图:

strip lot()(with kind = " strip ";
默认)【swarm plot】(with kind = " swarm ")

分类分布图:

box plot()(with kind = " box ")
violin plot()(with kind = " violin ")
boxen plot()(with kind = " boxen ")

分类估计图:

point plot()(with kind = " point ")
bar plot()(with kind = " bar ")
count plot()(with kind = " count ")

这些系列使用不同的粒度级别来表示数据。

catplot()中数据的默认表示使用散点图。在 seaborn 实际上有两个不同的分类散点图。他们采用不同的方法来解决用散点图表示分类数据的主要挑战,即属于一个类别的所有点将落在与分类变量对应的轴上的相同位置。stripplot()使用的方法(catplot()中的默认“种类”)是通过少量随机“抖动”来调整分类轴上的点的位置:

在[16]中:

sns.catplot(x="age",y="marital_status",data=census_data)

Out[16]:

<seaborn.axisgrid.FacetGrid at 0xdb18470>

Figure 17

第二种方法使用防止点重叠的算法沿分类轴调整点。它可以更好地表示观察值的分布,尽管它只适用于相对较小的数据集。这种绘图有时称为“蜂群”,由 swarmplot()在 seaborn 中绘制,它是通过在 catplot()中设置 kind="swarm "来激活的:

在[27]中:

*#sns.catplot(x="age",y="relationship",kind='swarm',data=census_data)*
*#  or*
*#sns.swarmplot(x="relationship",y="age",data=census_data)*
sns.catplot(x="day", y="total_bill", kind="swarm", data=tips);

Out[27]:

Figure 18

与关系图类似,可以通过使用色调语义向分类图添加另一个维度。(分类图目前不支持大小或样式语义)。每个不同的分类绘图函数以不同的方式处理色调语义。对于散点图,只需改变点的颜色:

在[29]中:

sns.catplot(x="day", y="total_bill", hue="sex", kind="swarm", data=tips);

Out[29]:

Figure 19

箱形图

首先是大家熟悉的 boxplot()。这种图显示了分布的三个四分位值以及极值。“触须”延伸到位于上下四分位数 1.5 IQRs 内的点,然后独立显示超出该范围的观察值。这意味着箱线图中的每个值对应于数据中的一个实际观察值。

在[32]中:

sns.catplot(x="age",y="marital_status",kind='box',data=census_data)

Out[32]:

<seaborn.axisgrid.FacetGrid at 0xd411860>

Figure 20

添加色调语义时,语义变量的每个级别的框将沿分类轴移动,这样它们就不会重叠:

在[37]中:

sns.catplot(x="age",y="marital_status",kind='box',hue='gender',data=census_data)

Out[37]:

<seaborn.axisgrid.FacetGrid at 0xde8a8d0>

Figure 21

小提琴情节

另一种方法是 violinplot(),它将箱线图与分布教程中描述的核密度估计过程结合起来:

在[38]中:

sns.catplot(x="age",y="marital_status",kind='violin',data=census_data)

Out[38]:

<seaborn.axisgrid.FacetGrid at 0x184c4080>

Figure 22

这种方法使用核密度估计来提供对值分布的更丰富的描述。此外,箱线图中的四分位数和 whikser 值显示在 violin 内部。缺点是,因为 violinplot 使用了 KDE,所以有一些其他参数可能需要调整,相对于简单的箱线图增加了一些复杂性:

在[41]中:

sns.catplot(x="age",y="marital_status",kind='violin',bw=.15, cut=0,data=census_data)

Out[41]:

<seaborn.axisgrid.FacetGrid at 0xfdea320>

Figure 23

类别内的统计估计

对于其他应用程序,您可能希望显示值的集中趋势的估计值,而不是显示每个类别中的分布。Seaborn 有两种主要方式来显示这些信息。重要的是,这些函数的基本 API 与上面讨论的 API 是相同的。

条形图

实现这一目标的常见绘图样式是条形图。在 seaborn 中,barplot()函数对完整数据集进行操作,并应用一个函数来获得估计值(默认情况下取平均值)。当每个类别中有多个观察值时,它还使用 bootstrapping 来计算估计值周围的置信区间,并使用误差线绘制:

在[46]中:

sns.catplot(x="income_bracket",y="age",kind='bar',data=census_data)

Out[46]:

<seaborn.axisgrid.FacetGrid at 0x160588d0>

Figure 24

在[47]中:

sns.catplot(x="income_bracket",y="age",kind='bar',hue='gender',data=census_data)

Out[47]:

<seaborn.axisgrid.FacetGrid at 0xdf262e8>

Figure 25

条形图的一个特殊情况是,您希望显示每个类别中的观察值数量,而不是计算第二个变量的统计值。这类似于分类变量而非定量变量的直方图。在 seaborn 中,使用 countplot()函数很容易做到这一点:

在[61]:

ax = sns.catplot(x='marital_status',kind='count',data=census_data,orient="h")
ax.fig.autofmt_xdate()

Out[61]:

Figure 26

点图

pointplot()函数提供了可视化相同信息的另一种方式。该函数也用另一个轴上的高度对估计值进行编码,但它不是显示一个完整的条形图,而是绘制点估计值和置信区间。此外,pointplot()连接来自同一色调类别的点。这样就很容易看出主要关系是如何随着色调语义的变化而变化的,因为你的眼睛非常善于捕捉斜率的差异:

在[67]:

ax = sns.catplot(x='marital_status',y='age',hue='relationship',kind='point',data=census_data)
ax.fig.autofmt_xdate()

Out[67]:

Figure 27

显示与方面的多重关系

就像 relplot()一样,catplot()建立在 FacetGrid 上的事实意味着很容易添加分面变量来可视化更高维的关系:

在[78]:

sns.catplot(x="age", y="marital_status", hue="income_bracket",
            col="gender", aspect=.6,
            kind="box", data=census_data);

out[78]:

Figure 28

[## 编写面试问题

在亚马逊上以最优惠的价格在线预定编码面试问题

www .亚马逊. in](https://www.amazon.in/gp/product/8193245202/ref=as_li_ss_tl?ie=UTF8&pd_rd_i=8193245202&pd_rd_r=78c1d00c-dee3-11e8-b353-add13b1583b7&pd_rd_w=1ioa9&pd_rd_wg=ctqpm&pf_rd_m=A1VBAL9TL5WCBF&pf_rd_s=&pf_rd_r=50K466P7CMTN9W8Q780N&pf_rd_t=36701&pf_rd_p=6d72b06e-660a-431b-b792-d8ca3a121c2b&pf_rd_i=desktop&linkCode=ll1&tag=themenyouwant-21&linkId=830d111966f700de39f4da335646e83e&language=en_IN) [## 用 R 动手编程:编写你自己的函数和模拟

Amazon.in - Buy 与 R 一起动手编程:以最优惠的价格在网上编写自己的函数和模拟书籍…

www .亚马逊. in](https://www.amazon.in/gp/product/9351107280/ref=as_li_ss_tl?ie=UTF8&pd_rd_i=9351107280&pd_rd_r=78c1d00c-dee3-11e8-b353-add13b1583b7&pd_rd_w=1ioa9&pd_rd_wg=ctqpm&pf_rd_m=A1VBAL9TL5WCBF&pf_rd_s=&pf_rd_r=50K466P7CMTN9W8Q780N&pf_rd_t=36701&pf_rd_p=6d72b06e-660a-431b-b792-d8ca3a121c2b&pf_rd_i=desktop&linkCode=ll1&tag=themenyouwant-21&linkId=ea6045b0df68ca9a7c6c6176c53817a8&language=en_IN) [## 有效的 Python 1: 59 编写更好的 Python 的具体方法

Amazon.in - Buy 有效的 Python 1: 59 在印度以最优惠的价格编写更好的 Python 书籍的具体方法

www .亚马逊. in](https://www.amazon.in/gp/product/9332552363/ref=as_li_ss_tl?ie=UTF8&pd_rd_i=9332552363&pd_rd_r=78c1d00c-dee3-11e8-b353-add13b1583b7&pd_rd_w=1ioa9&pd_rd_wg=ctqpm&pf_rd_m=A1VBAL9TL5WCBF&pf_rd_s=&pf_rd_r=50K466P7CMTN9W8Q780N&pf_rd_t=36701&pf_rd_p=6d72b06e-660a-431b-b792-d8ca3a121c2b&pf_rd_i=desktop&linkCode=ll1&tag=themenyouwant-21&linkId=bd492e127284082b0be2349a6405e710&language=en_IN)

全文上

要分叉,这个笔记本去 GitHub

如果你喜欢这篇文章,请与他人分享。

谢谢~

使用 Python 中的散景进行数据可视化,第二部分:交互

原文:https://towardsdatascience.com/data-visualization-with-bokeh-in-python-part-ii-interactions-a4cf994e2512?source=collection_archive---------0-----------------------

超越静态图

在本系列的第一部分中,我们在散景中创建了一个基本的直方图,这是一个强大的 Python 可视化库。最终结果显示了 2013 年从纽约市出发的航班的到达延迟分布,如下所示(带有漂亮的工具提示!):

这张图表完成了工作,但它并不是很吸引人!观众可以看到航班延误的分布几乎是正常的(有轻微的正偏差),但他们没有理由花超过几秒钟的时间看这个数字。

如果我们想创建更引人入胜的可视化,我们可以允许用户通过交互自己探索数据。例如,在这个直方图中,一个有价值的特性是能够选择特定的航空公司进行比较,或者可以选择改变条块的宽度,以便更详细地检查数据。幸运的是,这两个功能我们都可以使用散景添加到现有的绘图之上。直方图的最初发展可能看起来涉及到一个简单的绘图,但现在我们看到了使用像散景这样强大的库的好处!

这个系列的所有代码都可以在 GitHub 上获得。我鼓励任何人查看它的所有数据清理细节(数据科学中令人乏味但必要的部分),并对代码进行实验!(对于交互式散景图,我们仍然可以使用 Jupyter 笔记本来显示结果,或者我们可以编写 Python 脚本并运行散景服务器。对于开发,我通常在 Jupyter 笔记本上工作,因为它更容易快速迭代和改变情节,而不必重启服务器。然后我移动到一个服务器来显示最终结果。你可以在 GitHub 上看到独立的脚本和完整的笔记本。)

积极互动

在散景中有两类交互:被动和主动。第一部分介绍的被动交互也被称为检查器,因为它们允许用户更详细地检查图形,但不改变显示的信息。一个例子是当用户将鼠标悬停在数据点上时出现的工具提示:

Tooltip, a passive interactor

第二类交互称为主动交互,因为它改变了图上显示的实际数据。这可以是从选择数据的子集(例如特定的航空公司)到改变多项式回归拟合的程度的任何事情。在 Bokeh 中有多种类型的主动交互,但这里我们将重点放在所谓的“小部件”上,这些部件可以点击,并让用户控制情节的某些方面。

Example of Widgets (dropdown button and radio button group)

当我查看图表时,我喜欢玩主动交互(比如 FlowingData 上的那些),因为它们允许我自己探索数据。我发现自己从数据中发现结论(在设计师的指导下)比从完全静态的图表中发现结论更有洞察力。此外,给用户一些自由,允许他们带着稍微不同的解释离开,这可以产生关于数据集的有益讨论。

互动大纲

一旦我们开始添加主动交互,我们需要超越单行代码,进入封装特定动作的功能。对于散景小部件交互,有三个主要功能需要实现:

  • make_dataset()格式化要显示的具体数据
  • make_plot()用指定的数据绘制图形
  • update() 根据用户选择更新情节

格式化数据

在绘制图表之前,我们需要规划出将要显示的数据。对于我们的交互式直方图,我们将为用户提供三个可控参数:

  1. 显示的航空公司(代码中称为承运人)
  2. 图上的延迟范围,例如:-60 到+120 分钟
  3. 直方图框的宽度,默认为 5 分钟

对于为绘图生成数据集的函数,我们需要允许指定这些参数中的每一个。为了通知我们将如何在我们的make_dataset函数中转换数据,让我们加载所有相关的数据并进行检查。

Data for histogram

在这个数据集中,每一行都是一个单独的航班。arr_delay栏是以分钟为单位的航班到达延迟(负数表示航班提前)。在第一部分中,我们做了一些数据探索,知道有 327,236 个航班的最小延迟为-86 分钟,最大延迟为+1272 分钟。在make_dataset功能中,我们希望根据数据框中的name列选择航空公司,并通过arr_delay列限制航班。

为了生成直方图的数据,我们使用 numpy 函数histogram,它计算每个面元中数据点的数量。在我们的例子中,这是每个指定的延误间隔中的航班数量。对于第一部分,我们为所有航班制作了一个直方图,但现在我们将按每个承运人制作。由于每个承运人的航班数量差异很大,我们可以按比例而不是原始数量显示延误。也就是说,图上的高度对应于特定航空公司的所有航班在相应仓中有延迟的部分。为了从数量到比例,我们将数量除以航空公司的总数量。

下面是创建数据集的完整代码。该函数接收我们想要包含的载波列表、要绘制的最小和最大延迟以及以分钟为单位的指定 bin 宽度。

(我知道这是一个关于散景的帖子,但是没有格式化的数据是无法做出图形的,所以我附上了演示我的方法的代码!)

对所有载体运行该功能的结果如下:

提醒一下,我们使用散景quad字形来制作直方图,所以我们需要提供字形的左、右和顶部(底部固定为 0)。这些分别在leftrightproportion栏中。颜色列为每个载体提供了独特的颜色,而f_列为工具提示提供了格式化的文本。

下一个要实现的功能是make_plot。该函数应接受一个 column data source(Bokeh 中用于绘图的特定类型的对象),并返回绘图对象:

如果我们传入一个包含所有航空公司的源,该代码会给出以下图表:

这个直方图非常混乱,因为在同一张图上有 16 家航空公司!如果我们想比较航空公司,由于信息重叠,这几乎是不可能的。幸运的是,我们可以添加一些小部件来使情节更加清晰,并实现快速比较。

创建小部件交互

一旦我们在散景中创建了一个基本图形,通过小部件添加交互就相对简单了。我们想要的第一个小部件是一个选择框,允许查看者选择要显示的航空公司。这个控件将是一个复选框,允许尽可能多的选择,在 Bokeh 中称为CheckboxGroup.来制作选择工具,我们导入CheckboxGroup类并创建一个带有两个参数的实例,labels:我们希望显示在每个框旁边的值和active:被选中的初始框。下面是为所有运营商创建一个CheckboxGroup的代码。

from bokeh.models.widgets import CheckboxGroup# Create the checkbox selection element, available carriers is a  
# list of all airlines in the data
carrier_selection = CheckboxGroup(labels=available_carriers, 
                                  active = [0, 1])

CheckboxGroup widget

散景复选框中的标签必须是字符串,而有效值是整数。这意味着在图像中,“穿越航空公司”映射到活动值 0,而“阿拉斯加航空公司”映射到活动值 1。当我们想要将选中的复选框与航空公司匹配时,我们需要确保找到与选中的整数有效值相关联的字符串名称。我们可以使用小部件的.labels.active 属性来做到这一点:

# Select the airlines names from the selection values
[carrier_selection.labels[i] for i in carrier_selection.active]**['AirTran Airways Corporation', 'Alaska Airlines Inc.']**

在制作了选择小部件之后,我们现在需要将选中的航空公司复选框链接到图表上显示的信息。这是使用 CheckboxGroup 的.on_change方法和我们定义的update函数来完成的。更新函数总是采用三个参数:attr, old, new并根据选择控件更新绘图。我们改变图表上显示的数据的方法是改变我们传递给make_plot函数中的字形的数据源。这听起来可能有点抽象,所以这里有一个update函数的例子,它改变直方图以显示所选的航空公司:

# Update function takes three default parameters
def update(attr, old, new):
    # Get the list of carriers for the graph
    carriers_to_plot = [carrier_selection.labels[i] for i in 
                        carrier_selection.active] # Make a new dataset based on the selected carriers and the 
    # make_dataset function defined earlier
    new_src = make_dataset(carriers_to_plot,
                           range_start = -60,
                           range_end = 120,
                           bin_width = 5) # Update the source used in the quad glpyhs
    src.data.update(new_src.data)

这里,我们根据从 CheckboxGroup 中选择的航空公司检索要显示的航空公司列表。这个列表被传递给make_dataset函数,该函数返回一个新的列数据源。我们通过调用src.data.update并传递来自新源的数据来更新字形中使用的源的数据。最后,为了将carrier_selection小部件中的更改链接到update函数,我们必须使用.on_change 方法(称为事件处理程序)。

# Link a change in selected buttons to the update function
carrier_selection.on_change('active', update)

每当选择或取消选择一个不同的航线时,这个函数就调用 update 函数。最终结果是,直方图上只绘制了与所选航空公司相对应的图示符,如下所示:

更多控件

现在我们知道了创建控件的基本工作流程,我们可以添加更多的元素。每次,我们创建一个小部件,编写一个更新函数来改变绘图上显示的数据,并用一个事件处理程序将更新函数链接到小部件。我们甚至可以对多个元素使用相同的更新函数,方法是重写该函数,从小部件中提取我们需要的值。为了练习,我们将添加两个额外的控件:一个滑块,用于选择直方图的框宽度;一个 RangeSlider,用于设置要显示的最小和最大延迟。下面是制作这两个小部件和新的更新功能的代码:

标准滑块和范围滑块如下所示:

如果需要,除了使用更新功能显示的数据之外,我们还可以更改绘图的其他方面。例如,要更改标题文本以匹配框的宽度,我们可以:

# Change plot title to match selection
bin_width = binwidth_select.value
p.title.text = 'Delays with %d Minute Bin Width' % bin_width

在散景中还有许多其他类型的交互,但是现在,我们的三个控件允许用户在图表上尽情“玩”!

把所有的放在一起

我们互动剧情的所有元素都已就位。我们有三个必要的函数:make_datasetmake_plotupdate来根据控件和小部件本身改变情节。我们通过定义布局将所有这些元素连接到一个页面上。

from bokeh.layouts import column, row, WidgetBox
from bokeh.models import Panel
from bokeh.models.widgets import Tabs# Put controls in a single element
controls = WidgetBox(carrier_selection, binwidth_select, range_select)

# Create a row layout
layout = row(controls, p)

# Make a tab with the layout 
tab = Panel(child=layout, title = 'Delay Histogram')
tabs = Tabs(tabs=[tab])

我将整个布局放在一个选项卡上,当我们制作一个完整的应用程序时,我们可以将每个图放在一个单独的选项卡上。所有这些工作的最终结果如下:

你可以在 GitHub 上随意查看代码和情节。

下一步措施和结论

本系列的下一部分将着眼于我们如何制作一个包含多个情节的完整应用程序。我们将能够在服务器上显示我们的工作,并在浏览器中访问它,创建一个完整的仪表板来探索数据集。

我们可以看到最后的互动剧情比原著有用多了!现在,我们可以比较航空公司之间的延迟,并改变箱的宽度/范围,以查看分布是如何受到影响的。增加交互性提高了绘图的价值,因为它增加了与数据的接触,并允许用户通过自己的探索得出结论。尽管设置初始情节很复杂,但我们看到了如何轻松地向现有图形添加元素和控制小部件。与 matplotlib 等快速简单的工具相比,使用 Bokeh 等较重的绘图库的好处是绘图和交互的可定制性。不同的可视化库有不同的优势和用例,但是当我们想要增加额外的交互维度时,散景是一个很好的选择。希望在这一点上,你有足够的信心开始开发自己的可视化,并请分享你创造的任何东西!

我欢迎反馈和建设性的批评,可以通过 Twitter @koehrsen_will 联系到我。

使用 Python 中的散景进行数据可视化,第三部分:制作完整的仪表板

原文:https://towardsdatascience.com/data-visualization-with-bokeh-in-python-part-iii-a-complete-dashboard-dc6a86aa6e23?source=collection_archive---------0-----------------------

在散景中创建交互式可视化应用

有时我会学习一种数据科学技术来解决一个特定的问题。其他时候,就像使用散景一样,我尝试一种新工具,因为我在 Twitter 上看到一些很酷的项目,然后想:“看起来很棒。我不确定什么时候会用到它,但它可能会派上用场。”几乎每次我这么说的时候,我最终都会找到这个工具的用途。数据科学需要许多不同技能的知识,您永远不知道您将使用的下一个想法来自哪里!

以散景为例,在试用了几周后,我作为一名数据科学研究人员在工作中发现了一个完美的用例。我的研究项目涉及使用数据科学提高商业建筑的能源效率,并且,对于最近在召开的会议,我们需要一种方式来展示我们应用的许多技术的成果。通常的 powerpoint 建议可以完成工作,但并不突出。当大多数与会者看到他们的第三张幻灯片时,他们已经不再注意了。尽管我还不太了解 Bokeh,但我自愿尝试制作一个与该库交互的应用程序,认为这将允许我扩展我的技能,并创建一种引人入胜的方式来展示我们的项目。我们的团队持怀疑态度,准备了一个备份演示,但在我向他们展示了一些原型后,他们给予了全力支持。最终的交互式仪表盘在会议上非常引人注目,将被我们的团队采用以供将来使用:

Example of Bokeh Dashboard built for my research

虽然不是你在 Twitter 上看到的每个想法都可能对你的职业生涯有所帮助,但我认为可以肯定地说,了解更多的数据科学技术不会有什么坏处。沿着这些思路,我开始了这个系列来分享 Bokeh 的功能,这是 Python 中一个强大的绘图库,允许您制作交互式绘图和仪表板。虽然我不能为我的研究分享仪表板,但我可以使用公开可用的数据集展示在散景中构建可视化的基础。这第三个帖子是我的散景系列的延续,第一部分专注于构建一个简单的图形,第二部分展示了如何向散景图添加交互。在这篇文章中,我们将看到如何建立一个完整的散景应用程序,并运行一个可以在浏览器中访问的本地散景服务器!

本文将关注散景应用程序的结构,而不是情节细节,但所有内容的完整代码都可以在 GitHub 上找到。我们将继续使用 NYCFlights13 数据集,这是 2013 年从纽约 3 个机场起飞的航班的真实信息集合。数据集中有超过 300,000 个航班,对于我们的仪表板,我们将主要关注于探索到达延迟信息。

要自己运行完整的应用程序,确保你已经安装了散景(使用pip install bokeh),从 GitHub 下载 [bokeh_app.zip](https://github.com/WillKoehrsen/Bokeh-Python-Visualization/blob/master/bokeh_app.zip) 文件夹,解压,在目录中打开一个命令窗口,键入bokeh serve --show bokeh_app。这将建立一个本地散景服务器并在你的浏览器中打开应用程序(你也可以在线公开散景图,但现在我们将坚持本地托管)。

最终产品

在我们进入细节之前,让我们看一下我们的目标产品,这样我们就可以看到各个部分是如何组合在一起的。下面是一个短片,展示了我们如何与完整的控制面板进行交互:

Final Bokeh Flights Application

这里我在一个运行在本地服务器上的浏览器(Chrome 的全屏模式)中使用了散景应用程序。在顶部,我们看到许多选项卡,每个选项卡包含应用程序的不同部分。仪表板的想法是,虽然每个选项卡可以独立存在,但我们可以将许多选项卡连接在一起,以实现对数据的完整探索。视频展示了我们可以用散景制作的一系列图表,从直方图和密度图,到可以按列排序的数据表,再到完全交互式的地图。除了我们可以在散景中创建的图形范围之外,使用这个库的另一个好处是交互。每个标签都有一个互动元素,让用户参与数据并做出自己的发现。根据经验,当探索数据集时,人们喜欢自己获得洞察力,我们可以通过让他们通过各种控件选择和过滤数据来实现这一点。

现在我们有了一个仪表板的概念,让我们看看如何创建一个散景应用程序。我强烈推荐下载代码让自己跟着做!

散景应用程序的结构

在编写任何代码之前,为我们的应用程序建立一个框架是很重要的。在任何项目中,很容易迷失在编码中,很快就会迷失在一堆半成品脚本和不合适的数据文件中,因此我们希望预先创建一个结构,以便将所有代码和数据放入其中。这种组织将帮助我们跟踪应用程序中的所有元素,并在不可避免地出错时协助调试。此外,我们可以在未来的项目中重复使用这个框架,这样我们在规划阶段的初始投资将会得到回报。

为了建立一个散景应用程序,我创建了一个父目录来保存所有名为bokeh_app的东西。在这个目录中,我们将有一个数据子目录(称为data),一个脚本子目录(scripts),以及一个main.py脚本来整合所有内容。通常,为了管理所有代码,我发现最好将每个选项卡的代码保存在单独的 Python 脚本中,并从单个主脚本中调用它们。以下是我在散景应用中使用的文件结构,改编自官方文档

bokeh_app
|
+--- data
|   +--- info.csv
|   +--- info2.csv
|
+--- scripts
|   +--- plot.py
|   +--- plot2.py
|
+--- main.py

对于 flights 应用程序,其结构遵循以下一般框架:

Folder structure of flights dashboard

在一个父bokeh_app目录下有三个主要部分:datascriptsmain.py,。当运行服务器时,我们告诉 Bokeh 服务于bokeh_app目录,它将自动搜索并运行main.py 脚本。有了大致的结构,让我们来看看main.py ,我喜欢称之为散景应用程序的执行者(不是一个技术术语)!

main.py

main.py脚本就像一个散景应用程序的执行者。它加载数据,将数据传递给其他脚本,获取结果图,并将它们组织到一个单独的显示中。这将是我完整展示的唯一一个脚本,因为它对应用程序至关重要:

我们从必要的导入开始,包括创建选项卡的函数,每个选项卡都存储在scripts目录中的一个单独的脚本中。如果您查看文件结构,请注意在scripts目录中有一个__init__.py文件。这是一个完全空白的文件,需要放在目录中,以便我们使用相关语句(如from scripts.histogram import histogram_tab)导入适当的函数。我不太确定为什么需要这样做,但它确实有效(下面是我用来解决这个问题的堆栈溢出答案)。

在库和脚本导入之后,我们在 Python [__file__](https://stackoverflow.com/questions/9271464/what-does-the-file-variable-mean-do/9271617) 属性的帮助下读入必要的数据。在这种情况下,我们使用两个熊猫数据帧(flightsmap_data)以及包含在散景中的美国各州数据。一旦数据被读入,脚本就开始委托:它将适当的数据传递给每个函数,每个函数绘制并返回一个选项卡,主脚本将所有这些选项卡组织在一个名为tabs的布局中。作为每个独立选项卡功能的示例,让我们看看绘制map_tab的功能。

该功能接收map_data (航班数据的格式化版本)和美国各州数据,并为选定的航空公司生成飞行路线地图:

Map Tab

我们在本系列的第二部分讨论了交互式的情节,这个情节只是那个想法的一个实现。该功能的总体结构是:

def map_tab(map_data, states):
    ...

    def make_dataset(airline_list):
    ...
       return new_src def make_plot(src):
    ...
       return p def update(attr, old, new):
   ... new_src = make_dataset(airline_list)
      src.data.update(new_src.data) controls = ... tab = Panel(child = layout, title = 'Flight Map')

   return tab

我们看到熟悉的make_datasetmake_plotupdate函数用于绘制带有交互控件的图形。一旦我们建立了情节,最后一行将整个情节返回给主脚本。每个单独的脚本(5 个选项卡有 5 个)遵循相同的模式。

回到主脚本,最后一步是收集选项卡并将它们添加到单个文档中。

# Put all the tabs into one application
tabs = Tabs(tabs = [tab1, tab2, tab3, tab4, tab5])# Put the tabs in the current document for display
curdoc().add_root(tabs)

选项卡出现在应用程序的顶部,就像任何浏览器中的选项卡一样,我们可以轻松地在它们之间切换以浏览数据。

运行散景服务器

在完成了绘制图形所需的所有设置和编码之后,在本地运行散景服务器就非常简单了。我们打开一个命令行界面(我更喜欢 Git Bash,但是任何一个都可以),切换到包含bokeh_app的目录并运行bokeh serve --show bokeh_app。假设一切都编码正确,应用程序将自动在我们的浏览器中打开地址http://localhost:5006/bokeh_app。然后,我们可以访问该应用程序并浏览我们的仪表板!

Final Bokeh Flights Application

在 Jupyter 笔记本中调试

如果出现问题(在我们编写仪表板的最初几次中,毫无疑问会出现这种情况),必须停止服务器,对文件进行更改,然后重启服务器以查看我们的更改是否达到了预期的效果,这可能会令人沮丧。为了快速迭代和解决问题,我通常会在 Jupyter 笔记本上绘制图表。Jupyter 笔记本是一个很好的散景开发环境,因为您可以在笔记本中创建和测试完全交互式的绘图。语法略有不同,但是一旦你有了一个完整的情节,代码只需要稍微修改一下,然后就可以复制并粘贴到一个独立的.py脚本中。要了解这一点,请看一看我用来开发应用程序的 Jupyter 笔记本

结论

完全交互式的散景仪表板使任何数据科学项目脱颖而出。我经常看到我的同事做了大量出色的统计工作,但却没有清晰地传达结果,这意味着所有的工作都没有得到应有的认可。从个人经验来看,我也看到了散景应用在交流结果方面的有效性。虽然制作一个完整的仪表板工作量很大(这个有 600 多行代码!)结果是值得的。此外,一旦我们有了一个应用程序,我们可以使用 GitHub 快速共享它,如果我们聪明地使用我们的结构,我们可以在其他项目中重用这个框架。

从本项目中获得的要点通常适用于许多数据科学项目:

  1. 在开始数据科学任务(散景或任何其他任务)之前,拥有适当的框架/结构至关重要。这样,您就不会发现自己迷失在试图寻找错误的代码森林中。此外,一旦我们开发了一个有效的框架,它就可以用最少的努力被重用,从而带来长期的收益。
  2. 找到一个允许你快速迭代想法的调试周期是至关重要的。Jupyter Notebook 允许的编写代码—查看结果—修复错误循环有助于提高开发周期的效率(至少对于小规模的项目是如此)。
  3. 散景中的交互式应用将提升你的项目并鼓励用户参与。仪表板可以是一个独立的探索性项目,也可以突出显示您已经完成的所有棘手的分析工作!
  4. 你永远不知道你会在哪里找到下一个你将在工作中使用的工具。睁大你的眼睛,不要害怕尝试新的软件和技术!

这就是这篇文章和这个系列的全部内容,尽管我计划在未来发布更多关于散景的独立教程。有了 Bokeh 和 plot.ly 这样的库,制作交互式图形变得越来越容易,拥有一种以令人信服的方式展示数据科学成果的方法至关重要。检查这个 Bokeh GitHub repo 为我所有的工作,并随时分叉,并开始与您自己的项目。现在,我渴望看到其他人能创造什么!

一如既往,我欢迎反馈和建设性的批评。可以通过推特 @koehrsen_will 联系到我。

使用 Python 中的散景进行数据可视化,第一部分:入门

原文:https://towardsdatascience.com/data-visualization-with-bokeh-in-python-part-one-getting-started-a11655a467d4?source=collection_archive---------1-----------------------

提升你的视觉游戏

如果没有交流结果的有效手段,最复杂的统计分析可能是没有意义的。我最近在我的研究项目中的一次经历让我明白了这一点,在这个项目中,我们使用数据科学来提高建筑能效。在过去的几个月里,我的一个团队成员一直在研究一种叫做小波变换的技术,这种技术用于分析时间序列的频率成分。这种方法取得了积极的效果,但她很难在不迷失于技术细节的情况下解释它。

她有些恼怒,问我是否可以制作一个展示这种转变的图像。在几分钟内,我用一个名为gganimate的 R 包制作了一个简单的动画,展示了该方法如何转换一个时间序列。现在,我的团队成员不用费力解释小波,而是可以展示这个剪辑来直观地展示这项技术是如何工作的。我的结论是,我们可以做最严格的分析,但最终,所有人想看到的是一个 gif!虽然这种说法是幽默的,但它也有一定的道理:如果不能清楚地交流,结果将没有什么影响,而且通常呈现分析结果的最佳方式是可视化。

可用于数据科学的资源正在快速发展,这在可视化领域尤为明显,似乎每周都有另一种选择可以尝试。所有这些进步都有一个共同的趋势:互动性增强。人们喜欢在静态图中看到数据,但他们更喜欢摆弄数据,看看变化的参数如何影响结果。就我的研究而言,一份告诉业主通过改变空调时间表可以节省多少电的报告是不错的,但更有效的是给他们一个交互式图表,让他们可以选择不同的时间表,并查看他们的选择如何影响电力消耗。最近,受交互式情节趋势和不断学习新工具的愿望的启发,我一直在与 Python 库 Bokeh 合作。我为自己的研究项目制作的这个仪表板展示了散景互动功能的一个例子:

虽然我不能分享这个项目背后的代码,但我可以通过一个例子来使用公开可用的数据构建一个完全交互式的散景应用程序。这一系列文章将涵盖使用散景创建应用程序的整个过程。在第一篇文章中,我们将介绍散景的基本要素,我们将在后续文章中对此进行阐述。在整个系列中,我们将使用nyflights 13 数据集,它记录了 2013 年以来超过 30 万次航班。我们将首先专注于可视化单个变量,在这种情况下,以分钟为单位的航班到达延迟,我们将从构建基本直方图开始,这是显示一个连续变量的分布和位置的经典方法。《T4》的完整代码可以在 GitHub 上找到,第一个 Jupyter 笔记本可以在这里找到。这篇文章关注的是视觉效果,所以我鼓励任何人查看代码,如果他们想看数据清理和格式化的乏味但必要的步骤!

散景基础

散景的主要概念是一次一层地构建图形。我们首先创建一个图形,然后向图形添加元素,称为字形。(对于那些使用过 ggplot 的人来说,字形的概念本质上与 geomss 的概念是一样的,geom 一次添加一个“层”。)字形可以呈现许多形状,这取决于所需的用途:圆形、线条、补丁、条形、弧形等等。让我们用正方形和圆形制作一个基本图表来说明字形的概念。首先,我们使用figure方法绘制一个图,然后通过调用适当的方法并传入数据,将我们的字形附加到图中。最后,我们展示我们的图表(我正在使用 Jupyter 笔记本,如果您使用output_notebook调用,它可以让您看到代码正下方的图表)。

这就产生了下面这个略显乏味的情节:

虽然我们可以在任何绘图库中轻松地制作这个图表,但我们可以免费获得一些工具,用于右侧的任何散景绘图,包括平移,缩放,选择和绘图保存功能。这些工具是可配置的,当我们想要调查我们的数据时会派上用场。

现在让我们开始显示航班延误数据。在我们直接进入图表之前,我们应该加载数据并对其进行简要检查( bold 是代码输出):

# Read the data from a csv into a dataframe
flights = pd.read_csv('../data/flights.csv', index_col=0)# Summary stats for the column of interest
flights['arr_delay'].describe()**count    327346.000000
mean          6.895377
std          44.633292
min         -86.000000
25%         -17.000000
50%          -5.000000
75%          14.000000
max        1272.000000**

汇总统计数据为我们的绘图决策提供了信息:我们有 327,346 次航班,最小延迟为-86 分钟(意味着航班提前了 86 分钟),最大延迟为 1272 分钟,令人震惊的 21 小时!75%的分位数仅在 14 分钟,因此我们可以假设超过 1000 分钟的数字可能是异常值(这并不意味着它们是不合理的,只是极端)。在柱状图中,我将重点关注-60 分钟到+120 分钟之间的延迟。

直方图是单个变量初始可视化的常见选择,因为它显示了数据的分布。x 位置是分组到称为条柱的间隔中的变量的值,每个条的高度表示每个间隔中数据点的计数(数量)。在我们的例子中,x 位置将代表以分钟为单位的到达延迟,而高度是相应仓中的航班数。散景没有内置的直方图标志符号,但是我们可以使用quad标志符号来创建自己的直方图标志符号,它允许我们指定每个条形的底部、顶部、左侧和右侧边缘。

为了创建条形的数据,我们将使用 numpy [histogram](https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.histogram.html) 函数来计算每个指定条块中的数据点数。我们将使用 5 分钟长度的箱,这意味着该功能将计算每个 5 分钟延迟间隔内的航班数量。生成数据后,我们将它放在一个 pandas 数据帧中,以便将所有数据保存在一个对象中。这里的代码对于理解散景并不重要,但它仍然很有用,因为 numpy 和 pandas 在数据科学中很流行!

"""Bins will be five minutes in width, so the number of bins 
is (length of interval / 5). Limit delays to [-60, +120] minutes using the range."""arr_hist, edges = np.histogram(flights['arr_delay'], 
                               bins = int(180/5), 
                               range = [-60, 120])# Put the information in a dataframe
delays = pd.DataFrame({'arr_delay': arr_hist, 
                       'left': edges[:-1], 
                       'right': edges[1:]})

我们的数据看起来像这样:

flights栏是从leftright的每个延误间隔内的航班数。从这里,我们可以制作一个新的散景图形,并添加一个指定适当参数的四边形 glpyh:

制作这个图表的大部分工作来自数据格式化,这在数据科学中并不罕见!从我们的图中,我们看到到达延迟几乎是正态分布,在右侧有一个轻微的正偏斜或严重的尾部。

在 Python 中有更简单的方法来创建基本的直方图,使用几行[matplotlib](https://en.wikipedia.org/wiki/Matplotlib)就可以得到相同的结果。然而,开发散景图所需的回报来自于工具和与数据交互的方式,我们现在可以轻松地将这些数据添加到图表中。

添加交互性

我们将在本系列中讨论的第一种交互类型是被动交互。查看器可以采取这些操作,但不会改变显示的数据。这些被称为检查员,因为他们允许观众更详细地“调查”数据。一个有用的检查器是当用户将鼠标放在数据点上时出现的工具提示,它在散景中被称为悬停工具。

A basic Hover tooltip

为了添加工具提示,我们需要将数据源从 dataframe 改为 ColumnDataSource,这是散景中的一个关键概念。这是一个专门用于绘图的对象,包括数据以及一些方法和属性。ColumnDataSource 允许我们向图形添加注释和交互性,并且可以从 pandas 数据帧中构造。实际数据本身保存在一个字典中,可通过 ColumnDataSource 的 data 属性进行访问。这里,我们从我们的数据帧创建源,并查看对应于我们的数据帧的列的数据字典的键。

# Import the ColumnDataSource class
from bokeh.models import ColumnDataSource# Convert dataframe to column data source
src = ColumnDataSource(delays)
src.data.keys()**dict_keys(['flights', 'left', 'right', 'index'])**

当我们使用 ColumnDataSource 添加字形时,我们将 ColumnDataSource 作为source参数传入,并使用字符串引用列名:

# Add a quad glyph with source this time
p.quad(source = src, bottom=0, top='flights', 
       left='left', right='right', 
       fill_color='red', line_color='black')

请注意代码是如何引用特定的数据列的,比如“flights”、“left”和“right ”,使用的是单个字符串,而不是以前的df['column']格式。

散景中的悬停工具

一开始,HoverTool 的语法看起来有点复杂,但是通过练习,它们很容易创建。我们向我们的HoverTool实例传递一个tooltips列表作为 Python 元组,其中第一个元素是数据的标签,第二个元素引用我们想要突出显示的特定数据。我们可以引用图形的属性,比如使用' $ '引用 x 或 y 位置,或者使用' @ '引用源中的特定字段。这听起来可能有点令人困惑,所以这里有一个我们两者都做的悬停工具的例子:

# Hover tool referring to our own data field using @ and
# a position on the graph using $
h = HoverTool(tooltips = [('Delay Interval Left ', '[@](http://twitter.com/f_interval)left'),
                          ('(x,y)', '($x, $y)')])

这里,我们使用“@”引用 ColumnDataSource(对应于原始数据帧的“左”列)中的left 数据字段,并使用“$”引用光标的(x,y)位置。结果如下:

Hover tooltip showing different data references

(x,y)位置是鼠标在图上的位置,对我们的直方图没有太大的帮助,因为我们需要找到给定条形中对应于条形顶部的航班数量。为了解决这个问题,我们将修改工具提示实例来引用正确的列。格式化工具提示中显示的数据可能会令人沮丧,所以我通常在 dataframe 中用正确的格式创建另一列。例如,如果我希望工具提示显示给定条形的整个间隔,我会在 dataframe 中创建一个格式化列:

# Add a column showing the extent of each interval
delays['f_interval'] = ['%d to %d minutes' % (left, right) for left, right in zip(delays['left'], delays['right'])]

然后,我将这个数据帧转换成 ColumnDataSource,并在 HoverTool 调用中访问这个列。以下代码使用引用两个格式化列的悬停工具创建绘图,并将该工具添加到绘图中:

在散景风格中,我们通过将元素添加到原始图形中来将它们包含在图表中。注意在p.quad字形调用中,有几个额外的参数,hover_fill_alphahover_fill_color,当我们将鼠标放在工具条上时,它们会改变字形的外观。我还使用一个style 函数添加了样式(代码见笔记本)。美学打字很繁琐,所以我一般会写一个可以适用于任何剧情的函数。当我使用样式时,我保持事情简单,并关注标签的可读性。图表的主要目的是显示数据,只添加不必要的元素会降低图表的有用性!最终的情节如下:

当我们将鼠标悬停在不同的条柱上时,我们会获得该条柱的精确统计数据,显示时间间隔以及该时间间隔内的航班数量。如果我们对我们的绘图感到自豪,我们可以将它保存到 html 文件中进行共享:

# Import savings function
from bokeh.io import output_file# Specify the output file and save
output_file('hist.html')
show(p)

进一步的步骤和结论

我花了不止一个情节来获得散景的基本工作流程,所以如果看起来有很多东西要学,也不用担心。在这个系列的课程中,我们将得到更多的练习!虽然散景看起来工作量很大,但当我们想将视觉效果扩展到简单的静态数字之外时,好处就来了。一旦我们有了一个基本的图表,我们可以通过添加更多的元素来增加视觉效果。例如,如果我们想按航空公司查看到达延迟,我们可以制作一个交互式图表,允许用户选择和比较航空公司。我们将把改变显示数据的主动交互留到下一篇文章中,但我们可以做些什么:

主动交互需要更多的脚本,但是这给了我们一个在 Python 上工作的机会!(如果有人想在下一篇文章之前看看这个情节的代码,这里是。)

在整个系列中,我想强调的是,散景或任何一个库工具都不会是满足你所有绘图需求的一站式工具。散景在允许用户探索图形方面很棒,但对于其他用途,如简单的探索性数据分析,matplotlib这样的轻量级库可能会更有效。本系列旨在展示散景的功能,为您提供另一个必要的绘图工具。您了解的库越多,您就越有能力使用正确的可视化工具来完成任务。

一如既往,我欢迎建设性的批评和反馈。可以在推特上找到我 @koehrsen_will

用 D3.js 和 Dimple 实现数据可视化

原文:https://towardsdatascience.com/data-visualization-with-d3-js-dimple-be001bca3499?source=collection_archive---------7-----------------------

周五开源培训:第 9 卷

这个星期,我决定我需要可以在浏览器上看到的高质量的图表。我还想用最少的代码来完成这一切,我想强迫自己开始挖掘用 D3 呈现浏览器端数据的能力。

这些图表需要满足很多要求。但我最想要的是能够快速部署。学习的时间结束了,现在是交付的时候了。

由于我是一名 D3.js 新手,我需要一种方法在短短几天内制作出一些一流的图形。之前用过 C3.js ,很喜欢。但是我想要看起来和感觉上有点不同的东西。我从不满足于让事情变得简单。

嘿酒窝!😏

我发现这个整洁的图书馆叫做酒窝。在使用它之前,我就爱上了它。医生很棒,而且马上就觉得很有趣。它还兼容最新版本的 D3,这很好,因为我想使用不会被废弃的库

关于 Dimple 的理念,我最喜欢的部分是,它是为了利用 D3 而构建的,而不是在最终用户和底层框架之间创建某种“保护层”。

例如,在写这篇文章之前,我不知道 D3 有自己的 HTTP 请求工具。如果你碰巧运行着一个代理服务器(阅读这篇文章了解你应该运行的原因),这可以完美地工作,D3 可以为你获取各种各样的好东西,而不需要任何其他库的帮助。

潜入水中🏊

我在 Reddit 上找到了一个很酷的美国总统数据集。我将会用它来制作一些非常有用的图表。我从来没有真正考虑过“总统”的位子。这个名字最初是为了让担任这个职位的人看起来没有首相或国王这样的头衔重要。这个想法似乎最终没有按计划实现,因为它让这项工作看起来不那么宏伟。这些小项目的副作用是收集有时有用,有时不那么有用的琐事知识。

代码挑战!

使用上面列出的美国总统数据集,创建显示以下项目的图表:

  • 哪一个政党拥有最多的独特总统?
  • 哪个政党担任总统的任期最长?
  • 哪个政党的连续选举次数最多
  • 哪个政党的连续选举频率最高?

查看我的解套码,查看这个回购

先做什么?1️⃣

我想看看哪个政党有最多的候选人赢得总统选举的柱状图。不是谁任期最多,而是哪个政党有最独特的总统。

Y axis plotted by ‘Title’ which is last name, first name.

有意思!与民主党总统相比,我们多了四位共和党总统。注意:有四位“民主-共和”总统,但我忽略了那个字段,因为我不知道它意味着什么!因为它包含了两个名字,让我们考虑 a 类清洗。

Organized By Term (presidents chronological number)

尽管共和党拥有最独特的头衔持有人,但民主党拥有相同数量的任期!我不会猜到的。但是这里又出现了奇怪的民主-共和分类。在 2017 年,这个概念似乎很陌生。

我快速查了一下维基百科。原来民主共和党(由杰斐逊创建)出现在民主党、共和党甚至辉格党之前!奇怪!

让我们检查一下连续术语

Party victory organized by start of term

民主党和共和党以 7 个连续任期保持了最高的连续胜利数!这是一个单一政党的 28 年。现在我想知道,在如此长的时间里,他们的平均立法是有效还是无效。但是我从这个图表中可以得出的另一个结论是,共和党人连续当选的频率最高。

结论

酒窝很牛逼。尽管它非常简单,但我需要多加练习。最近我喜欢上了 SeabornBokeh 。但是对于我现在正在做的一个项目来说,我需要一个不需要 Django 框架就可以在浏览器中做任何事情的东西。

看来我不能离开你。😍

与熊猫的数据争论

原文:https://towardsdatascience.com/data-wrangling-with-pandas-5b0be151df4e?source=collection_archive---------3-----------------------

“panda eating bamboo” by Jay Wennington on Unsplash

互联网的巨大资源使我进入数据科学的旅程成为可能。《T2 数据科学杂志》将它定义为几乎所有与数据有关的事物。在工作中,这意味着使用数据通过增加价值对组织产生影响。最常见的是使用和应用数据来解决复杂的业务问题。数据科学工作中最常见的步骤之一是数据争论。以下是如何使用熊猫库在 python 中探索、操作和重塑数据的简明指南。

我们将探索一个乳腺癌数据集(鸣谢: UCI ),并使用熊猫来清理、重塑、按摩并给我们一个干净的数据集,所有这些都将有助于大幅提高我们数据的质量。注:数据质量是机器学习算法实现最佳性能的关键

如果你想继续下去,看看 GitHub repo 页面,尝试使用数据集python 代码进行实验。

将涵盖以下熊猫功能:

  1. 数据浏览 —列、列中的唯一值、描述、重复
  2. 处理缺失值 —量化每列缺失值,填充&丢弃缺失值
  3. 重塑数据 —一次热编码、数据透视表、连接、分组和聚合
  4. 过滤数据
  5. 其他——制作描述性列,基于元素的条件运算

数据探索

让我们首先将数据集(csv 文件)读入 pandas,并显示列名及其数据类型。还需要花点时间来查看整个数据集。

import pandas as pdfilename = 'data/breast_cancer_data.csv'
df = pd.read_csv(filename)
df.dtypespatient_id                 int64
clump_thickness          float64
cell_size_uniformity     float64
cell_shape_uniformity      int64
marginal_adhesion          int64
single_ep_cell_size        int64
bare_nuclei               object
bland_chromatin          float64
normal_nucleoli          float64
mitoses                    int64
class                     object
doctor_name               object
dtype: object

在数据中,我们有以下由描述的列—患者 ID: id 号,团块厚度:1–10,细胞大小均匀度:1–10,细胞形状均匀度:1–10,边缘粘附:1–10,单个上皮细胞大小:1–10,裸细胞核:

基于此,我们可以假设patient_id是一个唯一的标识符,class将告诉我们肿瘤是恶性的(癌变的)还是良性的(非癌变的)。除了作为分类特征的doctor_name之外,其余列是肿瘤的数字医学描述。

要记住的事情——如果我们的目标是根据剩余的特征来预测肿瘤是否是癌性的,我们将不得不对分类数据进行编码,并清理数字数据。

从我们的第一个输出中,我们看到bare_nuclei被读取为object数据类型,尽管描述是数字的。因此,我们需要改变这一点。

为了验证我们的数据与源匹配,我们可以使用 pandas 中的描述选项:

*df.describe()*

这简洁地总结了所有数字列的一些统计数据。似乎所有的。对于分类数据,我们可以通过的值组合在一起:

*df.groupby(by =[‘class’, ‘doctor_name’]).size()*

处理缺失值

对于每个数据集,评估缺失值至关重要。有多少?是错误吗?缺少的值太多了吗?缺失的值相对于其上下文有意义吗?

我们可以使用以下公式来合计总缺失值:

*df.isna().sum()*

既然我们已经确定了我们缺少的价值,我们有几个选择。我们可以用某个值(零、平均值/最大值/按列中值、字符串)填充它们,或者按行删除它们。由于几乎没有丢失的值,我们可以删除这些行,以避免在进一步的分析中扭曲数据。

*df = df.dropna(axis = 0, how = 'any')*

这允许我们删除行中的任何缺失值。

检查副本

要查看重复行,我们可以从查看每列中唯一值的数量开始。

*df.nunique()*

我们在这里看到,虽然有 699 行,但只有 645 个唯一的 patient_id。这可能意味着一些患者在数据集中出现不止一次。为了隔离这些患者并查看他们的数据,我们使用后面的:

*df[df.duplicated(subset = 'patient_id', keep =False)].sort_values('patient_id')*

该行按顺序显示所有重复的患者编号。还可以查看患者在数据集中出现的次数。

*repeat_patients = df.groupby(by = 'patient_id').size().sort_values(ascending =False)*

这表明一个患者在数据中出现了 6 次!

过滤数据

如果我们想删除在数据集中出现 2 次以上的患者。

*filtered_patients = repeat_patients[repeat_patients > 2].to_frame().reset_index()filtered_df = df[~df.patient_id.isin(filtered_patients.patient_id)]*

如果我们没有波浪号(“~”),我们将得到重复两次以上的所有个体。通过添加波浪符,熊猫布尔序列被反转,因此得到的数据帧是那些不重复超过两次的数据帧。

重塑数据

数据集在“doctor_name”列中有分类数据的元素。为了将这些数据输入到机器学习管道中,我们需要将其转换为一个 hot 编码列。这可以通过一个科学工具包学习包来完成,但是我们将在熊猫身上做,以演示旋转合并功能。首先用分类数据创建一个新的数据框架。

*categorical_df = df[['patient_id','doctor_name']]
categorical_df['doctor_count'] = 1* 

我们增加了一列,一个额外的列,用来识别病人与哪个医生联系。旋转该表,使单元格中只有数值,列成为医生的姓名。然后用 0 填充空单元格中的

*doctors_one_hot_encoded = pd.pivot_table( categorical_df,
                                  index = categorical_df.index, 
                                  columns = ['doctor_name'], 
                                   values = ['doctor_count'] )doctors_one_hot_encoded = doctors_one_hot_encoded.fillna(0)*

然后删除多索引列:

*doctors_one_hot_encoded.columns = doctors_one_hot_encoded.columns.droplevel()*

“doctors_one_hot_encoded”数据帧如下所示。

我们现在可以将它重新加入我们的主牌桌。熊猫的左连接通常是这样的:

*leftJoin_df = pd.merge(df1, df2, on ='col_name', how='left')*

但是我们是在索引上连接,所以我们传递“left_index”和“right_index”选项来指定连接键是两个表的索引

*combined_df = pd.merge(df, one_hot_encoded, left_index = True,right_index =True, how =’left’)*

生成的左连接如下所示。

我们可以通过下面的方法删除不再需要的列

*combined_df = combined_df.drop(columns=['doctor_name']*

逐行操作

数据争论的另一个关键部分是能够进行行或列操作。这方面的例子有:根据列的值重命名列中的元素,并创建一个新列,该列根据行中的多个属性生成特定的值。

在本例中,我们创建一个新列,根据属性将患者单元分类为正常或异常。我们首先定义我们的功能以及它将执行的操作。

*def celltypelabel(x): if ((x['cell_size_uniformity'] > 5) &      (x['cell_shape_uniformity'] > 5)):

        return('normal') else:
        return('abnormal')*

然后,我们使用 pandas apply 函数在数据帧上运行 celltypelabel(x)函数。

*combined_df['cell_type_label'] = combined_df.apply(lambda x: celltypelabel(x), axis=1)*

结论

虽然其中一些数据操作步骤可以在 SAS 和 excel 中完成。用 python 来做不仅可以让你将数据连接到计算机视觉、机器和深度学习中的大量开源资源,还可以用于 ETL 自动化目的等等。

感谢您的阅读。

穆罕默德·拉扎

邮箱:raza@datalchemy.ai

Data2Vis:使用序列间递归神经网络自动生成数据可视化

原文:https://towardsdatascience.com/data2vis-automatic-generation-of-data-visualizations-using-sequence-to-sequence-recurrent-neural-5da8e9d3e43e?source=collection_archive---------2-----------------------

A collection of random examples generated by the model given datasets from the RDataset collection..

我们将数据可视化公式化为一个序列到序列的翻译问题。

TLDR;我们训练一个模型,该模型可以接受数据集作为输入,并生成一组可信的可视化作为输出。

我们有一份早期的论文草稿,描述了关于 arxiv短视频源代码演示的工作。欢迎反馈、讨论( @vykthur@serravis )和评论!

Demo web app. We provide a web interface where a user can paste data (or load a random dataset) and get set of generated visualizations (using beam search).

想尝试训练一个类似的模型吗?我们已经公布了实验中使用的源代码。

[## 维克托迪亚/数据 2 维斯

Data2Vis:使用序列对序列递归神经网络自动生成数据可视化…

github.com](https://github.com/victordibia/data2vis)

这项工作是与一位同事(Cagatay Demiralp) 共同完成的,从我们在一次论文讨论会后的一次谈话开始。我们读过一些论文,其中使用了各种形式的生成和序列模型来创建各种各样的东西——从生成图像(gan)、音乐、源代码、图像标题到生成关于图像的问题和答案(VQA)等。尽管这些模型有时会有一些怪癖(独眼猫、最终缺乏自然感觉的音乐等),但当它们被大规模训练和部署时,它们都展示了价值的承诺。

因此,我们很好奇将这些深度学习模型中展示的进步应用于创建可视化任务的可能性。这是有价值的,因为可视化创作可能是一个耗时的过程(选择使用什么工具、可视化哪些字段、应用哪些转换以及支持哪些交互)。如果我们能找到一个模型来做这些事情,我们觉得可以改进可视化创作过程。第一个挑战与寻找制定问题的方法有关,这样它就可以服从深度学习。我们如何教会模型理解,然后生成可视化?我们如何管理我们的训练数据集?我们是否收集了可视化+数据对的好图像,并在这些图像上进行训练?

幸运的是,研究人员过去已经考虑过与改进可视化创作相关的类似问题。一项有趣的工作是围绕着创建声明性语言的努力,这些语言简洁地描述了可视化,并在创作可视化时提供了表达性和速度之间的""权衡。有了这些语言或语法,你可以编写一些简洁的文本规范,一些引擎会努力将文本转化为实际的可视化。这种声明性语言的一个很好的例子是由华盛顿大学交互数据实验室的令人敬畏的研究人员创造的 Vega-Lite 。对于我们的实验,我们使用 Vega-Lite 语法规范(JSON)来表示可视化。

A Vega-Lite visualization (left), specified using the Vega-Lite grammar (right).

我们做了什么

如果我们把可视化想象成文本规范,问题就简化成生成一堆这些规范,一些输入数据。因此,我们的下一个任务是探索学习可视化规范格式的空间的模型,也许可以“幻觉”一些新的可视化?我们根据卡帕西的博客中的笔记开始了最初的实验——我们生成了可视化规范(数据+规范),将它们连接起来,并试图训练一个 RNN 来生成看似合理的东西。

从第一次实验中,我们了解了字符 rnn(lstm)在学习嵌套结构(如 Vega-Lite 规范)中包含的数据结构方面的表现。我们发现,虽然基于字符的 rnn 对于该问题工作得很好(与基于单词的 rnn 相比),但是它们在模拟长序列方面的局限性和对长序列的存储要求使得它们难以训练(在几个字符之后的难以理解的记号,即使在数千个步骤之后也有限的学习进度,未经预处理的数百万个参数)。此外,字符 RNNs 没有为训练提供输入和输出对之间的具体映射。这些挑战促使我们思考其他方式来表述问题——学习我们输出空间的结构,并在给定一些输入的情况下生成新数据的方法。本质上是从源数据规范到目标可视化规范的转换。

序列到序列模型

序列对序列模型[1,2,3]能够做到这一点—它们接受一些输入(例如一种语言的文本)并生成一个输出(例如不同语言的相同文本)。它们已经被广泛成功地应用于诸如语言翻译、文本摘要、图像字幕等问题。利用编码器解码器架构的序列到序列模型的变体也已经被探索用于正式编程语言学习领域特定程序和通用程序合成之间的翻译。

We train a sequence to sequence model based on the work of Britz et al 2017. Training data consists of a source token (a single row from a data set) and a target token (a valid Vegalite visualization specification) pair.

数据和培训

首先,我们基于有效的 Vega-Lite 可视化示例组装了一个训练数据集(源和目标对)。基于 11 个不同的数据集和 4300 个 Vega-Lite 示例,总共使用了 215k 对样本。请参见论文了解更多关于数据采样和预处理的详细信息。

我们使用架构Britz 等人 2017 提供的样本代码训练一个序列到序列模型。该模型是一个具有注意机制的编码器-解码器架构(请参见 Britz 论文了解关于该架构的更多细节)。我们还在数据集上执行一些简单的标准化来简化训练。我们在源序列(数据集)中使用一个短符号“str”和“num”来替换字符串和数字字段名。接下来,在目标序列中复制类似的反向转换(后处理),以保持字段名的一致性。这些转换有助于通过减少词汇量来构建学习过程,并防止 LSTM 学习字段名(在训练集中学习字段名对我们的生成问题没有用)。反过来,我们能够减少总的源和目标序列长度,减少训练时间,并减少模型需要收敛的隐藏层的数量。

波束搜索解码

为了探索各种生成的可视化,我们使用波束搜索解码算法。与输出输入序列的最有可能(最高概率)的翻译相反,波束搜索在生成期间扩展所有可能的后续步骤,并保持最有可能的 k ,其中 k 是用户指定的参数,称为 波束宽度 。与传统的语言翻译系统不同,在传统的语言翻译系统中,波束搜索主要用于通过最大化生成序列的条件概率来提高翻译质量,我们还探索波束搜索作为一种通过输出所有并行波束结果来生成一组多样的候选可视化的方式。通过波束搜索,我们观察到模型生成了不同的图,探索了图表类型的组合和多个变量的使用。

早期结果

Examples where the model has learned to generate univariate plots that summarize fields selected from the dataset.

**

Examples of generated visualizations where the model has learned common selection patterns and leverages concepts such as responses (yes, no) and sex (male, female)

为了评估这个模型,我们使用了 Rdataset 存储库(被清理并转换成有效的 JSON 格式),它不包括在我们的培训中。生成的有效单变量和多变量可视化的范围表明该模型捕获了可视化生成过程的各个方面。随着训练的进行,模型逐渐学习有效 Vega-Lite 规范的词汇和语法,学习使用引号、括号、符号和关键字。该模型似乎还学会了在 Vega-Lite 语法中使用正确类型的变量规范(例如,它正确地为文本字段分配了字符串类型,为数值字段分配了数量类型)。

定性结果还建议在适当的字段上使用适当的转换(箱、集合)(例如,在数值字段上执行均值)。该模型还了解可视化中出现的常见数据选择模式,以及它们与其他变量的组合,以创建二元图。例如,当专家创建可视化时,通常按地理(国家、州、性别)、个人特征(公民身份、婚姻状况、性别)等对数据进行分组。早期的结果表明,我们的模型开始学习这些模式,并将其应用于可视化的生成。例如,它学习使用常见的顺序字段(如回答(是/否)、性别(男性/女性)等)对数据进行子集划分,并根据其他字段绘制这些值。最后,在所有情况下,模型都会生成一个 完全有效的 JSON 文件和有效的 Vega-Lite 规范,其中包含一些小的失败案例。

A collection of random examples generated (beam width k = 15) by the model given some test dataset. These examples demonstrate initial results on the model’s capabilities in generating plausible visualizations and its current limitations (cases where the model generates non-existent fields or uses transforms that result in invalid charts).

正如许多深度学习模型所观察到的,有有希望的结果,也有怪癖或失败的案例(例如,5 条腿的狗,3 只眼的猫等)。在我们的例子中,模型有时使用不存在的(幻象变量)生成规范,或者应用在运行时无效的转换,导致空图。见上图(用橙色标记的图)。我们的直觉是,这些挑战可以通过扩大我们相对较小的数据集来解决。

为什么要用深度学习实现可视化自动化?

我们认为可视化的自动生成有趣的原因有几个:

使可视化创作更加容易。

为很少或没有编程经验的用户提供快速创建表达性数据可视化的能力,增强了他们的能力,并将数据可视化带入他们的个人工作流。对于专家来说,像 Data2Vis 这样的模型也有可能“播种”数据可视化过程,减少指定可视化语言语法和支持可视化可能性迭代所花费的时间。这种动机与探索源代码生成和翻译的深度学习方法的其他研究工作产生了共鸣( UCBerkeley微软研究院等)。

规模的承诺

从理论上讲,随着我们收集更多多样和复杂的训练例子(也许还有更好的架构),DataVis 应该学习更复杂的可视化策略,增加它的效用。这有望创造一个模型,有朝一日可能在数据可视化方面达到人类水平(或超人水平),就像我们在图像识别、游戏、医学成像等其他领域观察到的那样。

超越“启发式”

现有的可视化生成方法倾向于基于规则和试探法,这些规则和试探法生成单变量汇总图或基于规则组合的图。在这种情况下, Jeff Dean 发现了使用机器学习(ML)改进这种系统的机会,并鼓励“学习”和“元学习”一切方法。他还强调了启发式的挑战——它们不适应使用模式,并且可能无法考虑有价值的上下文。我们也同意,ML 和 AI 方法通过从现有的训练例子中学习,提供了超越基于规则的方法的机会。

下一步是什么

这个项目仍然是非常进展中的工作-有限制和未来的工作,我们希望解决。除了收集更多的数据和运行实验来改进 Data2Vis,一些未来的工作包括:

扩展 Data2Vis 以生成多种可信的可视化效果

Data2Vis 目前被实现为序列到序列的转换模型,并为给定的数据集输出单个可视化规范。现在,训练一个模型来为给定的数据集生成多个有效的可视化效果不是很棒吗?我们认为会的。

瞄准附加语法

也许训练模型可以将输入数据映射到多种不同的可视化规范语言(例如 Vega-Lite、ggplot2、D3 等。).或者将可视化从一种语言翻译成另一种语言。通过跨语言、平台和系统重用可视化规范,这将有助于使可视化更易访问。

自然语言和可视化规范

Text2Vis 怎么样?-除输入数据外,还使用自然语言文本生成可视化效果的模型。想象一个人在大屏幕前探索数据,并要求基于特定的字段转换交互的可视化?

结论

本文讨论了使用序列对序列模型自动生成可视化的一些想法和早期结果。希望这项工作可以作为未来使用深度学习方法自动生成可视化的基线。请随意阅读论文了解更多详情,也分享你的想法( @vykthur@serravis )!我们希望很快能分享代码和训练好的模型。

确认

这项工作是由许多个人的贡献促成的。感谢 Vega-LiteVoyager 库的作者,感谢他们分享了我们实验中使用的示例数据。非常感谢tensor flowseq 2 seq模型实现和 TensorFlow 库团队的作者——他们的工作使我们能够快速了解序列模型和原型,我们的实验将很少以前的经验。**

参考

[1] Dzmitry Bahdanau、Kyunghyun Cho 和 Yoshua Bengio。2014.通过联合学习对齐和翻译的神经机器翻译。(2014 年 9 月)。

[2] Ilya Sutskever、Oriol Vinyals 和 Quoc V. Le。2014.用神经网络进行序列对序列学习

[3] Denny Britz、Anna Goldie、Thang Luong 和 Quoc Le。2017.神经机器翻译架构的大规模探索

[4]豪尔赫·波科和杰弗里·赫尔。2017.可视化逆向工程:从图表图像中恢复可视编码。计算机图形学论坛。EuroVis) (2017)。

数据库术语:分区

原文:https://towardsdatascience.com/database-terminologies-partitioning-f91683901716?source=collection_archive---------10-----------------------

您的老板告诉您学习分区主题来扩展您的数据库或了解您公司的数据库设计。你搜索互联网,然后你来到这里。欢迎!下面是对数据库表分区关键点的简要介绍:

数据库表分区:

vertical vs horizontal partitioning

首先,我们需要了解数据库(db)通常是如何设计的。数据库由表组成,表有列和行——每个表可以有多个或几个。分区一个数据库(为了方便起见,假设我们的数据库只包含一个大表)是将非常大的表分成多个小表的地方。这样,查询只访问数据的一部分,因此可以运行得更快,因为需要搜索的数据更少。分区的任务是帮助维护大型表,并减少为 SQL 函数读取和加载数据的总体响应时间。

垂直分区与水平分区

垂直分区将表&/或列存储在单独的数据库或表中。

水平分区( 分片 ) 将一个表的行存储在多个数据库簇中。

分片使我们的数据更容易一般化,并允许集群计算(分布式计算)。如果数据集太大,无法存储在一个数据库中,就需要进行分片。最重要的是,分片允许数据库根据数据增长来扩展 T21。它还减小了表的大小(更确切地说是索引的大小),从而提高了搜索性能。

分片(水平分区)的通用规则/指南:

  1. 每个数据库服务器在结构上必须相同。
  2. 数据记录在分片数据库中被合理地划分。
  3. 每个数据记录只存在于一个碎片中(审计表/备份除外)

分区优势:可伸缩性,提高大型数据库的速度

缺点:使编程和操作更加复杂

对数据库进行分区的 SQL 示例

Add Filegroups to partition by month SQL example

Create a Partition function for each month’s records

Create a Partition Scheme to map the partitions of a partitioned table to filegroups

Create the table using the PartitionBymonth partition scheme, and fill it with data

接下来,我们将谈论我们的下一个数据库关键术语:索引

数据库— SQL 和 NoSQL

原文:https://towardsdatascience.com/databases-sql-and-nosql-7bdbab25b6ef?source=collection_archive---------2-----------------------

对 NoSQL 数据库的介绍和对 MongoDB 的一瞥

SQL 在 1970 年与 E. F. Codd 博士的研究论文“大型共享数据库的关系数据模型”一起使用。是啊!!这是 Boyce-Codd 规范化中的 Codd。

SQL/NoSQL: url

NoSQL 在 20 世纪 90 年代后期开始出现。然而,在此之前就已经有这样的数据库了。NoSQL 是带着打破传统事务型数据库瓶颈的动机引入的。一个常见的误解是 NoSQL 数据库不是关系型的,这是不太正确的。关系确实存在于数据中,否则这些数据将毫无用处。让我们看看发生了什么变化以及如何变化。

布鲁尔帽定理和酸性

CAP 定理—与 NoSQL 有关

CAP 定理试图证明 NoSQL 数据库所期望的性质。大多数数据库被设计成以另一个属性为代价来实现这些属性中的两个。

C —一致性
这证明了一旦更新被更新者确认,更新的执行和可用性的保证。简而言之,如果数据库是一致的,更新一旦完成就可用,这在分布式环境中是无法保证的。

A —可用性 这展示了一个数据库的属性,它能够服务于一个请求。如果加载/执行时间较长,大多数 SQL 数据库都会删除查询。通过消除 SQL 数据库中存在的事务属性,NoSQL 数据库的可用性预计会非常高,响应时间预计会非常短。

P —分区容差
数据库能够在节点间因网络问题出现故障时正常运行的属性。例如,一个数据库可能包含几个协同工作的节点(MongoDB 节点)(通过 Mapreduce 之类的机制)。如果在分布式环境中,即使一个或多个节点不可访问,数据库作为一个整体也可以运行,则保留该属性。

ACID — SQL 数据库

ACID 属性是传统关系数据库(如 MySQL、MS SQL 或 Oracle 数据库)中的预期属性。

A —原子性
保证原子操作的性质,要么一组查询可以作为一个整体完成,要么一个都不能。这是交易的关键特征。

C —一致性
数据一旦完全插入或更新,即可使用。

I —隔离
暗示,事务是独立的。因此,数据不会受到发生在同一组数据上的两个事务的负面影响。

D —耐久性
事务或任何其他操作后提交的数据永不丢失。要么插入它们,要么通知失败(失败的事务)。

NoSQL 数据库

NoSQL 数据库保证遵守两个 CAP 属性。这种数据库有几种类型。

  1. 键值存储 哈希表形式的存储{例如- Riak、亚马逊 S3(迪纳摩)、Redis}
  2. 基于文档的 存储— 存储对象,主要是 JSON,它是 web 友好的或支持 ODM(对象文档映射)。{示例- CouchDB、MongoDB}
  3. 基于列的存储— 每个存储块只包含来自一列的数据{示例- HBase,Cassandra}
  4. 基于图形— 关系的图形表示,主要用于社交网络。{示例- Neo4J}

MongoDB

MongoDB 是广泛使用的 文档数据库 之一。它服从 CAP thoerem 中的 CA 。由于其 JSON 友好的 API,MongoDB 大量用于 NodeJS。

MongoDB: url

Mongo 官网有安装说明:https://www.mongodb.com。让我们考虑几个使用 MongoDB CLI 的命令。

进入命令行界面:mongo并按回车键。如果安装成功,您应该会看到以下输出。通常 mongo DB 运行在端口 27017 上。

*# mongoMongoDB shell version v3.4.5connecting to: mongodb://127.0.0.1:27017MongoDB server version: 3.4.5Server has startup warnings:2017-09-15T11:42:04.673+0000 I STORAGE  [initandlisten]2017-09-15T11:42:04.673+0000 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine2017-09-15T11:42:04.673+0000 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem2017-09-15T11:42:05.313+0000 I CONTROL  [initandlisten]2017-09-15T11:42:05.313+0000 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.2017-09-15T11:42:05.313+0000 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.2017-09-15T11:42:05.313+0000 I CONTROL  [initandlisten]
>*

显示数据库:show dbs

启动、选择数据库和执行插入。

插入 回车use mydb会创建一个新的数据库名 mydb 。与 MySQL 中的表不同,Mongo 有集合。文档(JSON)被插入到这样的集合中。让我们创建 集合,并添加一个 名称莫莉重量 50kg。 既然我们选择了 mydb 我们就可以称之为 db 并执行运算。

*db.dogs.insert({name: ‘Molly’, weight:50})*

查看数据 使用 pretty 方法将输出格式化为可读性更强的格式。正如您所看到的,mongo 添加了一个 id 名称_id作为每个文档的索引。

*> db.dogs.find()
{ "_id" : ObjectId("59bbce8288b6c364cefd9de6"), "name" : "Molly", "weight" : 50 }
> db.dogs.find().pretty()
{
    "_id" : ObjectId("59bbce8288b6c364cefd9de6"),
    "name" : "Molly",
    "weight" : 50
}
>*

更新数据 下面的命令更新我们创建的条目,并将名称设置为 Tommy。

*> db.dogs.update({_id: ObjectId('59bbce8288b6c364cefd9de6')},
   {$set: {name:'Tommy'}})*

删除数据 让我们删除我们插入的内容

*> db.dogs.remove({_id:ObjectId('59bbce8288b6c364cefd9de6')})
WriteResult({ "nRemoved" : 1 })
>*

这些是任何数据库的基本操作,或者简称为 CRUD 操作。

C —创建
R —读取
U —更新
D —删除

数据清理战斗机

原文:https://towardsdatascience.com/datacleaning-fighter-jets-687919b10a7e?source=collection_archive---------17-----------------------

当我最终开始着手处理xfiew数据集时,我发现测试集和评估页面被锁定了……这对我的计划来说是一个小小的打击。它可以用作任何卫星图像任务的训练数据,但如果你想看看你的模型在完成的 Kaggle 比赛中排名如何:那现在还不太可能。

所以我回到了 fast.ai 的一个暂停的家庭作业项目:战斗机探测器。这个想法很简单:训练一个飞机分类器,然后把它变成一个探测器。为什么是战斗机?即使我不得不看着它们几个小时,我也不会发疯。

:你可以跟着我用的工作笔记本一起来,这里。

1.获取数据

fighter-jets-datacleaning.ipynb

我在十月份开始这个项目,但是想给它一个新的开始。我已经下载并清理了数据,这是我不想重复的经历。主要的障碍是云机器上缺少一个 GUI。我使用 Jupyter 通过用 matplotlib 显示 16 个一批的图像来解决这个问题。有问题。如果不花时间学习小部件,我就找不到输入的方法,所以我不得不将一个 2 层 for 循环分解成一系列必须按正确顺序运行的单元格。

This is not how you want to do things.

我给文件编号,并输入不属于它的图片的编号。这既耗时又复杂。最糟糕的是,这个过程很难重复或改变。你做了一次就再也不回来了。工作不应该是这样做的。在进行的过程中,我记下了事情可以做得更好的方法,但是已经来不及实施了。

先不说:回顾你在学习期间所做的工作,有趣的是,你似乎一直在寻找完成一项任务最难的方法。我经常听到研究人员在发现一个更简单的算法优于之前更复杂的算法时表示惊讶,比如 OpenAI 的 PPO。但是我觉得复杂性通常是对理想解决方案的不完美近似的结果。

这一次我更有条理地处理事情。我在旧剧本中使用的搜索术语是“龙卷风”。猜猜当你用谷歌图片搜索时会发生什么?这一次我使用了一个 javascript 命令,它可以捕捉到你可以看到的图片的链接,而不是基于 chromedriver命令行脚本。这让我可以优化搜索。

获取数据非常容易。当您看到想要的图像时,可以通过在浏览器控制台中输入 javascript 命令(cmd-alt-i 或-j)来构建 url 文件。然后对它们运行 for 循环,调用 fastai 的download_images函数:

*# download dataset*
*for url_path in urls.ls():*
 *aircraft_type = url_path.name.split('.')[0] # get class name*
 *print(f'downloading: {aircraft_type}')*
 *dest = path/aircraft_type; dest.mkdir(parents=True, exist_ok=True) # set & create class folder*
 *download_images(url_path, dest)*

其中url_path是指向您的 url 文件(.csv 或。txt),假设它们是按类命名的。我在打印一个 python f 串,非常有用。

1.1 跟踪数据

现在当你这样做的时候有一个问题。我在我的 Mac 上这样做的目的是,我可以利用我的操作系统的 GUI 来快速删除我不想要的图像。为了让这个项目对我来说更专业,我不能把所有清理过的图像都复制到我的云机器上。我需要建立一个好的下载链接列表。问题是 fastai 的download_images将文件重命名为连续整数:0000001.jpg00000002.jpg等。有两个解决方案:保存 url 文件名,或者存储文件名和 URL 之间的映射。

我先尝试了前者。我让它工作了,但是它并不漂亮,并且引入了两个新问题:

  1. 编码为 utf8 字节的非拉丁字母
  2. 使用相同文件名的链接

字符编码问题一开始非常混乱,特别是因为 URL 在地址栏中显示为解码后的,并且只有当我复制了整个地址而不是其中的一部分时才显示出来。这是一个简单的解决方案:

第二期不会有任何进展。所以我决定弄清楚如何映射文件名和 URL。我在这里遇到了一系列令人困惑的问题。为了保存 url 文件名,我不得不改变 fastai 保存下载图像的方式。为了做到这一点,我必须编辑由download_images调用的_download_image_inner,全部来自 fastai.vision.data。解码 utf8 字节对此是必要的(转念一想,我不确定它是否是),但从那里开始就很简单了。为了将文件名映射到 URL,我必须更深入一层,编辑由_download_image_inner调用的download_image

我首先尝试在全局范围(任何函数之外)定义一个字典,然后让download_image更新它。但是那没有用。我将字典定义为以下格式:

{class : {filepath : url}}

其中在download_images中指定飞机的当前等级,其值为空dict,在download_image中用filepath:url对填充dict

顶层的 class-key 会被赋值,但是底层的dict都是空的。download_image中没有存储任何内容。我不想花时间去理解 python 的global关键字,我想这是因为我的url_fname_dict的一个副本正在低级函数中被写入。我打印了一份,事实上键:值对分配到了download_image中,但是原来的字典最后仍然是空的。

所以我创建了一个类对象来保存字典,而不必担心范围。经过一些调试后,我让它工作了,并为我的班级感到骄傲。

旁白:这实际上是我第一次真正开始使用面向对象编程的方式。我从来没有真正理解过课堂上发生的事情。在 fastai 和我自己的项目的深度学习中,我遇到了不得不在一堆函数中上下传递数据的难题。你要么必须有大量的参数——这很容易导致混乱并限制了你的工作方式——要么你使用一个附加了你只能访问的数据的类对象。

ImageDownloader class at the end of a debugging session. Downloading is commented out, and I’m testing if anything gets stored in the dictionary

而新的downloader.url_fname_dict …仍然是空的。我在这个问题上花了几个小时,找到了十几种方法来解决这个问题,直到我有了一个想法:

“我过去对使用多个流程的download_images有疑问,对吗?等等,用max_workers=8有 8 个进程试图同时在字典中存储数据 Python 能处理吗?我觉得它只是…不是。”

我对此进行了测试,将max_workers设置为-1、0 和 1(我不知道 0 和-1 是指使用每个核心和很多进程,还是只使用一个,所以我测试了它们)。它非常有效。

堆栈溢出上有一个线程。我不知道本身是否与我的问题有关,但它感觉足够正确,我不想陷入多重处理/线程。所以结果是我根本不需要上课。

399 file-url maps stored when max_workers ≤ 1; 0 stored when > 1

所以这奏效了。又拿了。永远。只有一个过程,记得吗?这意味着如果一个链接花了 10 秒钟下载…你在等待。数据集中大约有 10,500 张图片。然后我意识到一件很棒的事情。

我可以把这该死的东西打印出来。全速前进。

旁白:我在努力磨练做事的方式,为我经营公司做准备。所以问题变成了:在我自己的公司里,我能接受这样做吗?有趣的是:对于强力快速“搞定”类型的交易,答案并不总是否定的。有时你可以通过牺牲一点“优雅”或自动化来获得更多的灵活性。在这种情况下,简单的解决方案要强大得多,因为它可以在命令行上运行并写入磁盘。我被卡在了 Jupyter 笔记本范式里,放手了,收获了很多。

然后复制粘贴到一个文本文件,并运行几个 regex 过滤器来提取文件路径及其对应的 url,然后将它们放入您的字典。

我做了 4 个正则表达式过滤器:

fail_pat = re.compile(r'Error \S+') *# split*
clas_pat = re.compile(r'downloading: \S+') *# split*
save_pat = re.compile(r'data/\S+')
link_pat = re.compile(r'\s-\s\S+') *# split*

那些带有‘split’注释的需要删除部分过滤文本,因为我还不知道如何在 regex 中做到这一点。这些字典仅仅是:

removal_urls = defaultdict(**lambda**:[])
file_mapping = defaultdict(**lambda**:{})

然后构建文件-url 映射,并删除 url 的第一位:

urls that don’t download are the first additions to remove_urls

一切终于准备好打扫了。

2.数据清理

清理该数据集有 3 个部分:

  1. 验证下载(删除损坏/不完整的图像)
  2. 外观检验
  3. 更新 URL 文件

实际上,我做了 2 的一部分。1 之前。,但结果是一样的。FastAI 有一个有用的功能来验证图像是可见的,并且有 3 个颜色通道,还可以让你调整它们的大小。原始数据集约为 2.27GB,调整到最大 500px 后,大小降至 141MB。

旁白:我喜欢你可以在笔记本电脑上完成许多深度学习任务。GPU 仅用于训练密集模型&数据。调整大小和扫描 6-10k 张+2GB 大小的图片只需要一两分钟。

2.1 目视检查

这很有趣,触及了人工智能中一个沉闷而有争议的部分。

我有意见。

很多人使用亚马逊的机械土耳其人(顺便说一下,可能是一个可疑的名字)来批量标记数据。我不喜欢为不动脑筋的工作支付报酬。想象一下约束条件:

你一个人,没有钱。找到一个聪明的方法来做到这一点。

现在,我不能应用资金和资源总是存在的假设来直接解决问题,因为当我看我的银行账户时,这个假设不成立。因此,与其买断这个问题,你必须考虑更多的移动部件,以及它们是如何装配在一起的。如果你是这个系统的的一部分,除了是这个系统的建筑师,你还适合在哪里?

就视觉而言,我们非常善于挑选出特别的一个。其他 fast.ai 学生制作了一个 Jupyter 小工具,让你可以查看、删除或重新分类图像。它会创建一个. csv 文件来反映您的更改,因此数据集不会被更改。我肯定会这么做。一个问题是:该界面是为较小的数据集设计的,如果不使用 PyTorch 数据加载器,就无法关闭训练集的混合:

A step in the right direction; but this just isn’t going to cut if for 10,000+ images.

如果我能有一整屏的图片来复习,如果我能按班级来复习,那将会是最完美的。这可能需要对 ImageCleaner 小部件进行大量的编辑,并学习如何构建 Jupyter 小部件。我不想在那上面花时间。这也可能是不切实际的,因为这很可能是图像清理器的发展方向。

但是通过放弃一点功能,我可以获得很多可用性。

事实证明,在我的操作系统上,我几乎可以得到我需要的东西,以及我想要的方式:

A bit small though. Can we get a balance between ‘batch size’ and visibility?

Perfect.

这就是将文件名映射到 URL 的工作得到回报的地方。我可以删除任何我想要的图像,并记录对数据集的更改。我开始滚动并挑出损坏的图像(没有图片的文件图标)和明显不属于它的图像。对于 27 个班级的 10,241 张图片,这需要 20 分钟。FastAI 的图像验证器只需 1/20 的时间就能处理这个问题。

我想要更好的控制,所以我使用了 macOS 的图库视图来扫描每张图片:

Do I want to recognize silhouettes? I don’t know if this would hurt or help the model so I’ll leave it in. Oh, and I think the artist is Ivan Krpan.

That is definitely an Su-30, not an Su-34.

浏览每张照片花了大约 3 . 15 小时。重要的是,我可以选择我想要的细粒度控制。如果我保持图标视图,我可以在一个小时内浏览整个数据集。

2.2 更新数据集

我使用了一个包含文本文件的文件夹,其中包含了构成我的数据集的图像的 URL。由于之前所做的工作,这很容易更新。

a more efficient way to lookup filenames is to store in a [dict](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) then lookup instead of searching an array. This is O(1) instead of O(n/c)

这主要是重用和修改以前的代码。首先,为每个类文件夹构建一个文件路径列表。然后,对于字典中的每个 filepath 键——对应于当前的类——检查它是否在您的列表中。如果不是:将其 URL 添加到removal_urls字典中。

然后,对于每个类,您打开并读取 URL 文件到一个列表中— 而不是添加存在于您的removal_urls字典中的 URL——然后覆盖该文件。

现在,您有了一组 URL 文件,其中包含指向属于您的数据集中的图像的链接。如果你愿意,你可以选择保存字典。 PyTorch 对这个很有用(如果你定义了一个带有lambda函数defaultdict,你必须把它转换成一个 [dict](https://stackoverflow.com/a/38456371)):

torch.save(dict(file_mapping), path/'file_mapping.pkl')
torch.save(dict(removal_urls), path/'removal_urls.pkl')

仅此而已。你可以使用 github 或其他任何东西将 URL 文件复制到云 GPU 机器,然后在那里下载图像。我运行了最后一次检查,以查看清理后的数据集有多大:

tot = 0
for clas in aircraft_types: tot += len((path/clas).ls())
tot

是 6373。从最初的 10,241。

3.又来了

对于一个 10k 图像数据集的零开始,我估计粗略的视觉检查需要 1 个小时,详细的检查需要 4 个多小时。我在这里展示了很多代码,但那是发现过程。在修改下载代码以打印文件路径和 URL(并获得您的 URL)之后,再做一次,您真正需要的是:一个下载块,

*for url_path in urls.ls():*
 *aircraft_type = url_path.name.split('.')[0] # get class name*
 *print(f'downloading: {aircraft_type}')*
 *dest = path/aircraft_type; dest.mkdir(parents=True, exist_ok=True) # set & create class folder*
 *download_images(url_path, dest)*

(将打印输出保存到文本文件中)。一行用于验证,

**for** c **in** aircraft_types:
    verify_images(path/c, delete=**True**, max_size=500)

(做个目测);然后正则表达式过滤器:

fail_pat = re.compile(r'Error \S+') *# split*
clas_pat = re.compile(r'downloading: \S+') *# split*
save_pat = re.compile(r'data/\S+')
link_pat = re.compile(r'\s-\s\S+') *# split*

这项工作由三个模块完成。一个记录断开的链接(从打印输出):

**with** open(download_printout_path) **as** f:
    **for** line **in** f:
        *# update class*
        aircraft_type = clas_pat.findall(line)
        clas = aircraft_type[0].split()[-1] **if** aircraft_type **else** clas
        *# search download path & url*
        save,link = save_pat.findall(line), link_pat.findall(line)
        **if** save **and** link: 
            link = link[0].split(' - ')[-1]
            file_mapping[clas][save[0]] = link
        *# search failed download url*
        fail_link = fail_pat.findall(line)
        **if** fail_link: removal_urls[clas].append(fail_link[0])

另一个记录清除的文件:

*# lookup urls of missing files in file_mapping & add to removal_urls*
**for** clas **in** aircraft_types:
    flist = (path/clas).ls() *# pull all filepaths in class folder*
    **for** fpath **in** file_mapping[clas].keys():
        **if** Path(fpath) **not** **in** flist:
            removal_urls[clas].append(file_mapping[clas][fpath])

以及更新 url 文件的最后一个块:

**for** aircraft_type **in** removal_urls.keys():
    fpath = path/'fighterjet-urls'/(aircraft_type + '.txt')
 *# open file; read lines*    **with** open(fpath) **as** f: text_file = [line **for** line **in** f]
    **for** i,line **in** enumerate(text_file):
        line = line.rstrip() *# remove trailing /n for searching
        # remove line from text file*
        **if** line **in** removal_urls[aircraft_type]: text_file.pop(i)
    # overwrite url files
    **with** open(fpath, mode='wt') **as** f: 
        **for** line **in** text_file: f.write(line)

整个流程是:下载&打印→验证&检查→记录断链&移除文件→更新 url 文件。

现在你知道了。是时候识别一些战斗机了。

数据不可否认的流通性:增加数据隐私会阻碍社会进步吗?

原文:https://towardsdatascience.com/datas-undeniable-currency-will-increased-data-privacy-stall-society-s-progress-c81add9f995f?source=collection_archive---------10-----------------------

这是我之前的文章 AI,透明度及其与隐私的拉锯战 的后续,在文章发表的时候,我收到了关于矛盾领域的反馈。这篇文章的目的是展示不同的观点:从业务的角度,业务总是可以访问数据,并使用这些信息来获得越来越多的客户洞察力;从消费者的角度来看,世卫组织在很大程度上对收集的数据及其使用情况一无所知。在这篇文章发表期间,剑桥分析公司和脸书之间的数据泄露事件以及用户数据的滥用成为了焦点(今天仍然如此)。消费者比以往任何时候都更加充分地意识到他们在多大程度上被监视、被影响或被操纵。这篇文章讨论了日益增长的按需市场以及数据是如何实现这一点的。它还对企业与其客户之间的关系提出了挑战,并引入了一个更加平衡的数据控制时代,以及不可避免的隐私和安全法规,这些法规将推动符合道德标准的数据使用向前发展。

还记得#Prism2013 吗?爱德华·斯诺登和美国国家安全局的丑闻出现在电视上,就像今天脸书/剑桥分析公司的丑闻一样。正是这种监视行为将讨论从侵犯隐私转移到了人身侵犯,在这一点上,没有留下任何蛛丝马迹。我和我的朋友朱莉当时在 FB 上有过这样的讨论。这件事让我质疑这个行业的诚信以及我在其中扮演的角色。

数据一直是推动洞察力和收入的引擎

大数据的过去十年是一个新时代的开端:由技术、增强的连通性、计算能力和高级数据功能驱动的数据爆炸。这极大地增加了我们对事物和人的理解。现在,环境就是一切,而我们,作为人类,现在是焦点的中心。

对于企业来说,信息是驱动利润的动力。这是所有公司的首要任务。毫无疑问,股东价值取代了客户价值。确定消费者消费的动机、地点、时间和原因是营销人员几十年来试图回答的问题。显而易见,我们对驱动行为的触发因素了解得越多,我们就能卖出越多的产品。无论是 A . C Neilson 还是 Gartner,公司都在消费者研究上投入了数百万美元,不仅是为了了解市场趋势,也是为了了解这种趋势如何转化为个人的欲望和动机。

大约 4 年前,我写了这篇文章:交换:品牌和消费者之间的终极舞蹈。大数据的出现也催生了一场新的社会参与运动。突然之间,这些丰富的数据为企业提供了他们所需的信息,以通过社会背景来增加交易信息,从而定义内容、对话、评论等方面的影响,从而进一步完善对消费者的理解。

在过去 5 年中,情绪和个性(如五大)指标引起了人们的关注,以真正深入研究这些指标如何、何时以及在多大程度上影响购买行为。广告网络已经增加了他们的足迹,将更多的网站纳入他们的覆盖范围,以创建一些关于客户在哪里以及以什么顺序浏览他/她的在线路径来推断消费者倾向的理解的表象。大约在 2006 年,当时我在雅虎!我向亨特·麦德森(Hunter Madsen)汇报,这位大师在行为定向成为“事物”之前就引领了它。了解用户在我们的网络中消费了什么内容,他们搜索了什么,他们如何在我们的平台上互动,并利用位置和人口统计等邻近因素,有助于开发精确的目标配置文件。自然语言处理(NLP)在检测社交帖子中的购买意愿方面也取得了很大进展。技术已经变得如此复杂,以至于今天能够使用过去的行为/提及作为消费者结果的预测器。

凯茜·奥尼尔在她的书《数学毁灭的武器》中写道,

数学家和统计学家正在研究我们的欲望、行为和消费能力。他们预测我们的可信度,计算我们作为学生、工人、恋人和罪犯的潜力……这就是大数据经济,它承诺了惊人的收益。一个计算机程序可以在一两秒钟内快速浏览成千上万份简历或贷款申请,并把它们整理成整齐的列表,最有希望的候选人排在最上面。这不仅节省了时间,而且被宣传为客观公正。

所有这一切的目标是向消费者提供最相关的沟通,这将符合他/她购买该项目的倾向:正确的信息,正确的时间。很简单,对吧?不是这样的,但我们已经越来越接近实现这一点。

如今,来自社交网络和第三方网站的个人数据的可用性增加,这使得个人层面的情境化增加,接近实时。

到 2010 年,Cathy O'Neill 声称数学正以前所未有的方式进入“人类事务,公众很大程度上欢迎它”… 直到现在

数据在很大程度上是社会的救星

在贫困、灾难恢复、医疗保健、教育等领域做出关键决策时,效率和进步的例子数不胜数。

还记得那场让新西兰克赖斯特彻奇成为一片废墟的地震吗?在接下来的几年里,这座城市使用实时信息来帮助重建工作:从摄像头,交通系统,公用事业,水质。随着城市的重建,这些数据点将被分析以衡量经济发展,并指导城市如何重建以最大限度地减少未来的地震影响。

公用事业公司也在使用数据向客户提供更多关于能源消耗的信息,通常会降低成本,并将做出更好的能源使用决策的责任推给客户。

在医疗保健行业,由于行业的分散性以及将大量基于纸张的信息集转换为数据,数据一直是绊脚石。医疗保健社区正在缓慢转型,数据聚合正被用于预测流行病、治疗和预防疾病,以及总体上提高生活质量。重点是尽可能多地了解患者病史,以确定潜在的警告信号,并确定与疾病的相关性。在类似的患者使用案例中大规模地这样做可以使预防变得更加合理。

对于消费者来说,技术让我们的生活变得更简单、更高效。我们的垃圾邮件会被自动标记或从电子邮件中删除。我们的工作日更有条理。在记录我们的健康或健身习惯,或寻找最符合我们要求的工作方面,我们现在有更多的信息可以利用。我们已经习惯于依靠技术为我们想要购买的产品找到最好的交易,我们对按需履行的期望提高了优步美食或网飞钥匙咖啡馆等便利服务。

脸书在实现更具情境性的用户洞察(比任何其他出版或广告平台都多)以推动更个性化的信息方面发挥了重要作用。这创造了一个非常有利可图的广告平台,是脸书成功的支柱。虽然他们一开始是一个社交网络,与志同道合的人一起闲逛和分享想法,但它很快变成了一个赚钱的机会,用户是主要演员,吸引垂涎的广告商。

https://www.theguardian.com/technology/2010/jan/11/facebook-privacy

还记得扎克伯格几年前说过这句话吗?“隐私已死”

早在 2010 年,扎克就认为

“如果人们更多地分享,世界将变得更加开放和互联。一个更加开放、联系更加紧密的世界会更加美好。”

八年后,由于最近剑桥分析公司的事件,这个受人喜爱的社交网络将有助于改变我们分享、分析、再利用或出售数据的方式。消费者默许免费社交访问以换取公司访问和分析个人信息将不再是标准。

尽管数据用于改善社会的例子数不胜数,但也有同样多的例子质疑政府和企业对数据的使用。这个就不在本帖讨论了。我鼓励你阅读凯茜·奥尼尔的《数学毁灭的武器》,因为它包含了对当今存在的数学模型的全面看法,即使有证据表明存在错误,这些模型也是“不受监管和无可争议的”。

媒体对这种数据操纵的曝光将在政策和数据治理的监管方面创造明显的界限……尤其是在人工智能出现之后。

随着人工智能的出现,隐私的增加会阻碍进步吗?

如果消费者愿意放弃便利和随时可获得的信息,去强烈地捍卫本属于他们的东西,这已经不再是一个问题。帮助预测疾病发生的医疗保健进步是否会因为消费者控制的数据而停滞不再是一个问题。

人工智能的真正危险在于,如果反馈回路开始以前所未有的速度从来自其他数据源的数据中发现模式,那么继续进行今天无法无天的狂野西部实践而不考虑潜在的社会影响。没有规则,没有透明度,没有适当的披露,危险在于人工智能失控,放大当前有偏见的模型,并最终影响可能产生有害社会影响的决策。

人工智能的目标应该是提高当前系统的效率,并为人类的整体利益改善决策。如果这是灵丹妙药,那么人类应该有权控制哪些数据可以被使用、分析和转售。他们有权同意使用数据的“环境”,数据是否得到安全处理,数据是否得到完整处理。他们有权质疑是否需要特定的个人身份信息(PII)来实现预期的结果。

根据欧洲通用数据和保护条例 (GDPR),基本信息受到保护。

  • 姓名、地址和身份证号码
  • 位置、IP 地址、cookie 数据和 RFID 标签等网络数据
  • 健康和遗传数据
  • 生物特征数据
  • 种族或民族数据
  • 政治观点
  • 性取向

加拿大前隐私部长 Ann Covoukian 提出了“设计隐私”的概念。这个概念就是隐私,它被构建并编程到任何产品的每一层结构中,旨在创建一个透明的功能系统,该系统被授权使用法律政策定义的公平和道德标准来处理个人身份数据。它将减少当前黑盒人工智能的发生,并且组织将被法律授权在未来使用它。这已经嵌入于 2018 年 5 月 25 日推出的 GDPR。正如我们已经看到的,这种影响将是全球性的。

回答这个问题:隐私不应该阻碍这个人工智能新世界的进步。道德模型不应因个人信息的使用而有所偏差。如果将各种因素和事件综合起来决定预测,真的有必要使用 PII 吗?

我 4 年前在我的交换帖子中写的话今天仍然适用:

这里的平衡在于确保消费者不会陷入困境。另一方面,企业必须从总体和消费者层面了解影响购买周期各个部分的信息...然后双方(企业和消费者)必须达成一个互谅互让的协议。

作为一家企业,我要怎么做才能留住你这个顾客?

作为顾客,我愿意给你什么,让我满意并再次光顾的生意?

从历史的角度来看,我们必须从过去吸取教训,想象我们想要的未来。我们在业务中实现的功能需要从一万英尺的高度来看待。我从一个名为 Writingya 的博客中得到了这个智慧。:

“[脸书首席执行官]]马克·扎克伯格说隐私不再是一种社会规范。当他这么说的时候,我发了微博——我从来不发微博,这就是我的愤怒——这可能与社交网络无关,但它与亲密和民主有关。技术让人变傻。它会让你看不到你的潜在价值是什么,需要什么。我们真的愿意放弃我们努力争取的宪法和公民自由吗?人们为此而流血,而不是生活在一个监视的社会里。我们看着史塔西说,“那不是我们。”而现在我们让苹果做,让谷歌做?为了什么?”~ Writingya

数据集创建和清理:使用 Python 进行 Web 抓取—第 1 部分

原文:https://towardsdatascience.com/dataset-creation-and-cleaning-web-scraping-using-python-part-1-33afbf360b6b?source=collection_archive---------5-----------------------

“world map poster near book and easel” by Nicola Nuttall on Unsplash

在我的上一篇文章中,我讨论了使用应用编程接口(API)和 Python 库生成数据集。API 允许我们以一种简单的方式从网站中获取非常有用的信息。然而,并非所有网站都有 API,这使得收集相关数据变得困难。在这种情况下,我们可以使用网络抓取来访问网站的内容并创建我们的数据集。

网络抓取是一种用于从网站提取大量数据的技术,通过这种技术,数据被提取并以表格(电子表格)格式保存到您计算机中的本地文件或数据库中。— 韦伯维

一般来说,网络搜集包括访问大量网站并从这些网站收集数据。然而,我们可以限制自己从单一来源收集大量信息,并将其用作数据集。在这个特殊的例子中,我们将探索维基百科。我还会解释我们需要的 HTML 基础知识。完整的项目可以在 Github 知识库中使用 Python 进行网络抓取。

这个例子只是为了演示。但是,我们必须始终遵循网站指南,然后才能抓取该网站并出于任何商业目的访问其数据。

这是一篇由两部分组成的文章。在第一部分中,我们将探索如何使用 BeautifulSoup 从网站获取数据,在第二部分中,我们将清理收集的数据集。

确定内容

“man drawing on dry-erase board” by Kaleidico on Unsplash

我们将访问按人口统计的国家和属地列表维基百科网页。该网页包括一个表格,其中列有国名、人口、数据收集日期、占世界人口的百分比和来源。如果我们去任何一个国家的页面,所有关于它的信息都写在页面上,右边有一个标准框。该框包括许多信息,如总面积、含水量、GDP 等。

这里,我们将把这两个网页的数据合并成一个数据集。

  1. 国家列表:在访问第一页时,我们将提取国家列表、其人口和占世界人口的百分比。
  2. 国家:然后我们将访问每个国家的页面,并获得包括总面积、水资源百分比和 GDP(名义)在内的信息。

因此,我们的最终数据集将包括每个国家的信息。

HTML 基础

您在浏览器中浏览的每个网页实际上都是用超文本标记语言(HTML) 构建的。它有两个部分, head 包含标题和任何样式和 JavaScript 的导入, body 包含显示为网页的内容。我们对网页的主体感兴趣。

HTML 由标签组成。标签由开始的<和结束的> 尖括号描述,尖括号内的标签名称作为开始,如果在开始的尖括号后有正斜杠/,则标记结束。比如<div></div><p>Some text</p>等。

Homepage.html as an example

有两种方法可以直接访问网页上的任何元素(标签)。我们可以使用唯一的 id ,或者我们可以使用可以与多个元素关联的。在这里,我们可以看到<div>的属性 idbase,作为对该元素的引用,而所有用td标记的表格单元格都有相同的,称为data

通常有用的标签包括:

  1. 每当你包含某些内容时,你就把它们一起包含在这个单一的实体中。它可以作为许多不同元素的父元素。因此,如果这里应用了一些样式更改,它们也会反映在它的子元素中。
  2. <a>:该标签中描述了链接,其属性href中提到了点击该链接将加载的网页。
  3. <p>:每当一些信息要以文本块的形式显示在网页上时,就使用这个标签。每个这样的标签都作为它自己的段落出现。
  4. <span>:当信息要内联显示时,我们使用这个标签。当两个这样的标签并排放置时,它们会出现在同一行,不像段落标签。
  5. <table>:表格借助该标签在 HTML 中显示,其中数据显示在由行和列交叉形成的单元格中。

导入库

我们首先从导入必要的库开始,即 numpy、pandas、urllib 和 BeautifulSoup。

  1. numpy: 一个非常流行的库,它使得数组操作变得非常简单和快速。
  2. 它帮助我们转换表格结构中的数据,因此我们可以使用已经被高效开发的众多函数来操作数据。
  3. 我们使用这个库来打开我们想要从中提取数据的 url。
  4. BeautifulSoup: 这个库帮助我们获得想要处理的页面的 HTML 结构。然后,我们可以使用它的功能来访问特定的元素并提取相关信息。

Import all libraries

了解数据

最初,我们定义我们只是读取 url,然后从中提取 HTML 的基本功能。我们会在需要的地方引入新的功能。

Function to get HTML of a webpage

getHTMLContent()函数中,我们传入 URL。这里,我们首先使用urlopen方法打开 url。这使我们能够应用 BeautifulSoup 库来使用解析器获取 HTML。虽然有许多可用的解析器,但在这个例子中我们使用了html.parser,它使我们能够解析 HTML 文件。然后,我们简单地返回输出,然后我们可以用它来提取我们的数据。

我们使用这个函数来获取国家列表的维基百科页面的 HTML 内容。我们看到这些国家出现在一张表格中。因此,我们使用find_all()方法来查找页面上的所有表格。我们在这个函数中提供的参数决定了它返回的元素。当我们需要表格时,我们将参数作为table传递,然后遍历所有的表格来确定我们需要的表格。

我们用prettify()函数打印每个表格。该函数使输出更具可读性。现在,我们需要分析输出,看看哪个表有我们要搜索的数据。经过大量的检查,我们可以看到带有类 wikitable sortable 的表中有我们需要的数据。因此,我们的下一步是访问这个表及其数据。为此,我们将使用函数find(),它不仅允许我们指定我们正在寻找的元素,还允许我们指定它的属性,比如类名。

Print all country links

HTML 中的表格由标签<tr></tr>表示的行组成。每一行都有单元格,这些单元格可以是使用<th></th>定义的标题,也可以是使用<td></td>定义的数据。因此,要访问每个国家的网页,我们可以从表格的国家列(第二列)的单元格中获取链接。因此,我们遍历表中的所有行,并读取变量country_link中第二列的数据。对于每一行,我们提取单元格,并在第二列中获得元素a(Python 中的编号从 0 开始,因此第二列意味着cell[1])。最后,我们打印所有的链接。

这些链接不包括基地址,所以每当我们访问这些链接时,我们将附加[https://en.wikipedia.org](https://en.wikipedia.org)作为前缀。

虽然我开发的从每个国家的网页中提取数据的功能可能看起来很小,但在我完成这个功能之前,已经对它进行了多次迭代。让我们一步一步来探索。

每个国家的页面右侧都有一个信息框,包括座右铭、名称、GDP、面积和其他重要特征。所以,首先我们用和以前一样的步骤来识别这个盒子的名称,它是一个类为infobox geography vcard的表。接下来,我们定义变量additional_details来收集我们将从这个页面获得的所有信息,放在一个数组中,然后我们可以将这个数组追加到国家数据集的列表中。

当我们在国家页面进入 Chrome 浏览器的 inspect 模式(右击任意位置并选择Inspect选项)时,我们可以查看表格中每个标题的类别。我们对四个领域感兴趣,面积—总面积、水(%),以及 GDP(名义)—总量、人均

Area — Total Area and Water (%)

GDP (nominal) — Total and Per capita

我们可以很容易地推断出标题AreaGDP (nominal)有类mergedtoprow,而我们想要提取的数据有类mergedrowmergedrowbottom。但是,我们不能直接访问任何数据元素,因为它们发生的顺序会根据每个国家而变化。对于一些国家,特定字段可能缺失,且total areamergedrow可能是第 6 位,而对于一些其他国家,它可能是第 7 位。因此,我们需要首先看到mergedtoprow的文本,如果它与面积或 GDP(名义)匹配,我们应该读取并收集这些数据。

看起来很简单,但是当我尝试的时候,我立刻发现了一个问题,因为有些国家的water (%)超过了 100。这是不可能的,因此,我们一定遗漏了什么。这是我意识到问题所在的时候。你看,如果我们在区域标题后读取两个值,并且缺少水值,我们将错误地读取人口的第一个值,从而给我们错误的数据。因此,我们需要确保当Population标题被识别时,我们停止读取值。

现在,我们可以简单地将我们所有的知识添加到函数getAdditionalDetails()中。我们定义变量read_content来标记是否读取下一个值。除了前面描述的函数之外,我们在这里还使用了三种类型的函数:

  1. get():这使我们不仅能找到,还能得到对特定元素的引用。
  2. get_text():获取元素开始和结束标签中的值。
  3. strip():这将删除文本中可能出现的任何额外的前导和尾随空格。我们还可以指定我们希望删除的任何特定值,例如,在我们的情况下,新的行字符\n

迭代表中的所有行,迭代器检查当前行是否是匹配区域GDP(名义)的标题,并开始读取。在读取模式下,它会检查新元素是总面积还是总面积,如果是,它会读取并继续读取,以便在下一次运行时分别读取水(%)或人均 GDP。

我们使用tryexcept来确保即使我们错过了某些值,我们的整个过程也不会结束。这是我在遍历完整的国家列表时学到的另一个教训。有些国家没有我们需要的所有信息,或者我们可能找不到所需名称的表格。在这种情况下,我们的流程可能会抛出一个错误,我们必须捕获该错误以返回一个空数组,并允许该流程在其他国家继续进行。

创建数据集

最后,我们现在知道我们需要收集哪些信息以及如何收集。

我们首先从国家列表中读取表格的每一行,并收集每个国家的名称、人口和占世界人口的百分比。然后,我们使用该链接获得所有其他详细信息,包括总面积、水(%)、总 GDP 和人均 GDP。但是,如果附加信息少于 4,则该国家的信息缺失,我们不使用该数据。否则,我们将所有的信息添加到data_content数组中,该数组被编译到dataset数据帧中。

接下来,我们阅读表格的标题,并为 4 个额外的列添加标题。这些作为我们的数据集的标题,我们将其导出到一个. CSV 文件中,可以在这里找到。

尽管我们的数据集现在已经准备好了,但它不是最有用的格式。我们需要使用适当的格式、统一的指标并删除不必要的符号和值来清理这个数据集。我们将在本文的第二部分讨论这个问题。

希望你喜欢我的文章。请随时伸出手,分享你的想法。

数据集创建和清理:使用 Python 进行 Web 抓取—第 2 部分

原文:https://towardsdatascience.com/dataset-creation-and-cleaning-web-scraping-using-python-part-2-7dce33cddf66?source=collection_archive---------11-----------------------

“open book lot” by Patrick Tomasso on Unsplash

在这个由两部分组成的系列文章的第一部分中,我们介绍了一种在 BeautifulSoup 和 Python 的帮助下使用网络抓取从维基百科网页中提取数据的方法。仔细观察数据集,我们可以清楚地看到,在收集的数据中存在必须消除的噪声。每当使用网络抓取收集数据时,它通常充满了我们在这里可以看到的噪音。因此,在执行任何分析之前,需要清理收集的数据以创建统一且可用的数据集。

在这里,我们将处理我们在上一部分创建的维基百科数据集,并逐一处理每一列,直到我们有一个相当有用的数据集。

导入库并读取 CSV 文件

我们导入三个库 renumpypandas 。我们已经知道 numpy 和熊猫。第三个库re实际上是用来根据一个正则表达式(通常称为 regex )格式化字符串,它基本上定义了一个搜索模式。我们将在本文中探索它的用法,如何使用它摘自它的文档

首先,我们使用 pandas 函数read_csv()读取数据集文件,并将其存储在dataset变量中。

替换标题

仔细检查后,可以发现标题可以做得更具描述性,因此我们将在必要的地方进行替换。我们将把Country(or dependent territory)改为Country% of worldpopulation改为Percentage of World PopulationTotal Area改为Total Area (km2)

Finalised column headings

现在,我们将使用新确定的列名来访问数据并细化其中的内容。

分析和清理数据集

Dataset.csv

让我们首先来看看数据集的当前状态。我们可以看到,几乎所有的列都有方括号和圆括号内的信息。方括号内的文字通常是指维基百科页面上的进一步链接。在我们的例子中,我们不会访问任何链接,这些链接不会提供有用的信息,所以我们可以删除它们。括号内的数据通常包括关于真实数据的附加信息。例如,在列Total Area中,面积在括号内以其他公制单位定义。我们也不需要这些数据,所以我们也可以删除所有的括号。

此外,我们从列Percentage of World PopulationPercentage Water的所有值中删除“%”符号,因为这从列标题中可以直接看出。

Resultant dataframe

数据现在看起来好多了,但我们还有很多事情要做。

一次处理一列

Country帮助我们识别上下文,现在不需要修改。在我们前面的步骤之后,Percentage of World Population已经是正确的格式了,所以我们也不改变它。

人口和总面积列

Population列中的数字用逗号分隔。这里,我们将使用replace()函数删除逗号。这个函数将第一个参数作为我们想要替换的字符,第二个参数定义我们想要替换的字符。这里,我们什么都不用替换,,因此有了函数replace(',','')

为了访问每个单元格,我们在for循环的帮助下迭代该列,然后使用 Pandas 函数iloc[]读取和更新该列中的特定单元格。

接下来,我们移动到Total Area (km2)列。我们也从删除该列中的逗号开始。接下来,一些列的数据在sq mi中,而其他列的面积在km2中。我们必须将所有的sq mi值乘以 2.58999,转换成km2

为了实现这一点,我们检查单元格在字符串中是否有sq mi,如果有,我们删除除了.之外的所有非数字字符,并将值乘以 2.58999。该值最终被转换回整数。我使用了一个函数repr来获得该列中值的可打印版本。在查看结果时,我看到在可打印的格式中,sq mi实际上被表示为sq\xa0mi,匹配必须针对它进行。这也反映在代码中。如果单位已经在km2中,我们只需删除除.之外的所有非数字字符,并将值转换为整数。为了移除所有这样的字符,我们使用正则表达式[^0-9.]+,这基本上意味着我们移除任何计数中的所有字符(用+标记),除了数字 0 到 9 和.

然而,在做同样的尝试时,我发现一些值在范围内,我们需要首先解决它们。因此,对于所有这些国家,我们读取范围,使用split('-')函数将其分割,并将第一个值作为我们将为该单元格考虑的值。

Modified ‘Population’ and ‘Total Area’ columns

百分比水柱

该列有一些异常值。首先,对于一些含水量很低的国家,如阿尔及利亚阿富汗,此栏数值标有Negligiblenegligible。此外,对于智利来说,最后还有一个额外的b存在。

因此,我们需要用0.0替换Negligiblenegligible,并删除这些单元格中除数字和.之外的任何额外字符。我们使用前面定义的不带和带正则表达式的replace()函数来实现这一点。

对于某些缺失值的情况,记录的值不正确,必须删除。幸运的是,这很容易解决。我们可以简单地删除所有大于 100 的行。这是可行的,因为百分比值不能超过 100。我们首先使用astype(float)将列中的每个字符串转换为 float,然后只保留那些值小于或等于 100 的列。

Modified ‘Percentage Water’ column

名义国内生产总值和人均国内生产总值栏

对于Total Nominal GDP,我们首先去掉美元符号。接下来,我们观察到这一列中的金额被表示为万亿十亿百万的字符串。因此,我们读取每个单元格,识别面额,删除除数字和.之外的所有字符,并将金额乘以面额数值。

对于Per Capita GDP,我们保留数字 0-9 和.,同时删除所有其他字符,包括逗号和美元符号。

Final Dataset

导出最终数据集

最后,我们的数据集现在是干净的,可以导出到外部 CSV 文件中。我们使用熊猫函数to_csv将数据帧导出到文件Final_dataset.csv

结论

在这篇文章中,我们发现虽然网络搜集的第一步即数据收集很重要,但是数据的清理也同样重要。这一步本身也有一些挑战,我们必须先解决这些挑战,然后才能开发合适的数据集进行有用的分析。最终的数据集也存在于 GitHub 存储库中。

希望你喜欢我的作品。请随时伸出手,评论,分享,发表你的看法。

DataViz 战斗入口:分析美国运输安全管理局的航空公司数据

原文:https://towardsdatascience.com/dataviz-battle-entry-analysing-airline-data-from-the-tsa-74bfad9539e4?source=collection_archive---------13-----------------------

这是我关于数据分析的第二篇中型文章。鉴于 Reddit 竞赛的性质,下面的内容更侧重于数据的可视化,而不是探索。

首先,挑战的数据集是这个 TSA 索赔数据,它由一堆 PDF 文档组成。运输安全管理局是美国国土安全部的一个机构,负责美国公众旅行的安全。该数据包含关于在运输过程中丢失和索赔的物品的信息。

我用 Tabula 在线解析 pdf 文件,结果运行良好。我只看了 2016 年的数据。然而,这些行有点分散,这需要我使用 OpenRefine (大喊到 @warrenski 获取提示)。我不能强调 OpenRefine 对我的帮助有多大!然后我用 Python 进行重组和可视化。

这是我第一次使用 Plotly ,它真的创造了奇迹。我错过了散景船,所以作为第一次使用 Plotly 的用户,我需要花很多时间才能跳槽。

下面所有的图形都是交互式的,但是,唉,Medium 不支持这种嵌入。无论如何,以下是我对 DataViz 之战的记录:

奇怪的是,如上所示,批准的项目在接近年底时减少了——这就引出了一个问题,如果这个部门最终耗尽了预算。你会看到曲线在四月、五月和六月上升,之后直线下降,在十二月下降到零。

我决定添加一个考虑 2016 年所有状态的堆积图,如下所示:

正如您所看到的,随着审查数量的增加,批准的项目的总价值下降了。与此同时,那些被认为不充分的申请清楚地表明,预算最终会在年底耗尽。

机场和部门并不总是因为丢失物品或批准何时支付而受到责备,所以我也分析了航班,看看在索赔的物品类型中是否有一些有趣的变化。

This is my new favourite graphic 😃

有趣的是,在查看航班及其对索赔总额的最大贡献时, UAL 偷看狩猎项目,美国航空公司负责索赔的大多数医疗项目。UAL 的总部设在芝加哥,芝加哥因枪支管制而臭名昭著,所以也许有关联。

总的来说,进一步研究物品类别是很有趣的,从它们的总体价值和数量来看。

This graph is best viewed as an interactive element, so please excuse the terrible hover texts

可能不是这种表示的最佳图表,但我想在上面添加一些变化。我也很喜欢泡泡散点图。

上图显示,就申请商品的量而言,服装、其他、行李和电子产品超受欢迎。然而,到目前为止,就物品的价值而言,电子产品胜出。****

气泡的大小由相对于体积的平均物品价值决定——我认为这是相当必要的。正如你将在下面看到的,它有助于揭示即使狩猎物品数量相对较少,它们的价值也比医疗物品或相机要高得多。

A zoomed in version of the above

放大上图中难看的集群,在角落里你会看到狩猎物品气泡相对较大,表明它的低容量但每件物品的高价值。

这篇文章到此为止,感谢你的阅读,希望你觉得有趣。如果你喜欢它的视觉效果,请随意鼓掌或分享。干杯!

DataViz 案例研究:规划大学招生的七种微妙不同的方法

原文:https://towardsdatascience.com/dataviz-case-study-seven-subtly-different-ways-to-plot-college-enrollment-87815e18ccd0?source=collection_archive---------5-----------------------

即使是最简单的数据集也能以一百万种方式呈现。即使我们坚持最基本的方法,用线和点和条,我们也有很多选择。

这些选择微妙地塑造了我们的数据如何被阅读和解释,以及观众会得出什么结论。没有单一的“正确方式”来显示数据,因为每个项目都有编辑意图:要提出的论点、要讲述的故事、要让人难忘的关键见解。数据可视化人员只能通过密切关注他们技术的微妙之处来做到这一点——我想通过一个案例研究来说明这一点。

案例研究:大学招生

最近,我需要帮助一位同事将 2003 年至 2015 年美国学院和大学的学生注册总数数据可视化,这些数据按公立或私立学校分类。她还想强调大衰退可能带来的任何影响。

让我们看看这些数据的七种呈现方式。在每一种情况下,我们都希望关注哪些趋势或事实被揭示,或变得更加明显,以及哪些趋势或事实被隐藏。

#1:基本折线图

我的同事在她的报告草稿中开始了这个明显的选择,我在这里重新做了,而不是让你接受 MS Word 图形:

强调什么

  • 公立和私立学校的总体差异:公立学校招收的学生数量是私立学校的三倍多。
  • 经济衰退期间对公众的提价。其次,随后公众支出放缓,而私人支出小幅但稳步增长。

评估

很难讨厌这种直接的方法,但我觉得效果很弱。公私比较太重要了:这种关系是众所周知的,所以没什么意思。衰退时期的增长需要更多的关注,但它的规模和速度很难判断,因为相比之下图表的规模太大了。在这个数据集和许多数据集中,规模是一个基本的权衡:如果我们显示整体趋势,我们就会掩盖细节;如果我们放大细节,我们就失去了大局。我们必须选择哪个更重要。

接下来的选择探索了如何显示使该数据集的增加更重要。

#2 阶梯折线图

一个小的变化是:不同年份之间的平滑,显示为一条平坦的线(样本每年只记录一次)。

重点的变化

  • 我们可以更容易地看到增长的幅度。在公共场合,我们可能会察觉到经济衰退前和衰退期间的加速增长。
  • 2011 年后,公众经历了一次下降,这一点更加明显。

评估

与基本折线图具有相似的效果。还不够远。

#3 年度变化(增量)

以下是各组的同比变化。虽然这些可以显示为折线图,但我发现这种做法有些欺骗性,因为一个值不会直接影响下一个值。我喜欢箭头,因为它表明我们在应对变化。(但你可以想象不同的造型,以下几点保持不变。)

强调什么

  • 这次公招 人数激增中间。其次,它在衰退前就开始了,在衰退期间加速,然后停止。
  • 经济衰退后,公共部门和私人部门都经历了衰退。

什么被巧妙地编码了

  • 公立学校的变化幅度几乎不可避免地会比私立学校大,因为它们招收了更多的学生。所以总入学人数被巧妙地包括在内,尽管我们并没有真正用图表显示出来。

失去了什么

大的公共线路(几乎是字面上的)盖过了私人线路。而且观众可能会因为大小不同而得出奇怪的结论,这在这张图上并不明显。例如,人们可以推断,对公共机构而言,衰退是一个更加动荡的时期。但是每种类型的相对变化并没有显示出来:即使是很小的入学减速对士兵来说也可能是毁灭性的,但是在这里很难评估。

评估

这让我们聚焦于这些变化,并引起人们对经济衰退期间事件发生方式的关注。这个故事变得更加与公众有关。

#4.相对年度变化

接下来,我将年度变化显示为当前值的百分比。

强调什么

  • 在经济衰退之前和期间,T21 的私人和公众都经历了增长。公众在此期间有了更大的增长。
  • 近年来,所有机构都在从沉寂中复苏;但是士兵们反弹得更快。

隐藏着什么

  • 我们再也看不到,即使是间接的,公共机构总体上招收的学生要多得多。
  • 我们看不到有多少学生受到影响。

评估

这对于真正比较公立和私立学校的兴衰更有用:它们受到相同事件的影响吗?他们可能会做出类似的决定吗?他们往同一个方向走吗?对于所有这些问题,我们现在可以形成部分答案:泡沫和衰退都受到了打击,但它们的反应不同。这也许可以从直线图中看出,但被严重模糊了。

#5 公私比例

一种选择是计算某种比较并直接用图表表示出来,而不是强迫观察者两个组进行比较。这是私立学校占公立学校的比例:

强调什么

  • 我们可以看到学生的总体分布实际上是如何随着时间推移而发生变化的,这可能与经济衰退有关。

什么被遮住了

  • 有多少学生参与其中?
  • 是公众、私人或两者的变化导致了这些变化吗?

评估

有趣的是,第一张图中的观察结果——公立学校招收了 3 倍多的学生——显示出随着时间的推移而变化。私立学校招生人数的早期增长也令人惊讶。这些直接比较在图 1 和图 2 中很难看出,在图 3 和图 4 中看不到。

这些转变可能会引发一些有趣的问题,但不幸的是,这些问题不能仅靠这张图表来回答。例如,是什么导致了私人资本的激增?我们可以回顾过去,看到这两种制度都有所增加;但是士兵相对增加更多。但也存在其他可能性(公共注册人数骤降),我们在这里不会知道。

因此,如果我们可以用多张图来构建一个故事,这一张图可能值得包括在内。如果我们局限于一个图表(就像我一样),它就没有包含足够的信息。

#6 净变化

我们展示了自 2003 年以来的变化,而不是逐年变化。也就是我们把 2003 年定为零点。

强调

  • 入学人数全面上升,但公立学校占据了大部分份额。
  • 这种增长在衰退期间加速,在衰退之后减速——尤其是对公众而言。

隐藏了什么

  • 2003 年的实际值是多少;总共有多少学生?

评价

这张图表在我们所看到的一些东西之间找到了一种有趣的平衡。我们仍然可以间接地看到公共机构的重要性,它们负责招收大多数新生。衰退期间的变化相当明显。人们很容易对私立学校和公立学校进行比较——但不是在相对的基础上,也不是在细节上,尤其是对于私立学校。

我们做出的主要牺牲是将事情固定在某一年。在这种情况下,这一年很大程度上是任意的(基于数据可用性),而不是与一些关键事件相一致。这也会给人一些错误的印象:

  • 入学人数开始时很低
  • 公立学校和私立学校的总注册人数差不多

如果你的观众不熟悉数据的背景,他们更有可能做出这些错误的结论(没有办法自我纠正)。这意味着这种展示依赖于特定类型的观看者——以及一如既往的仔细标注。

#7 相对净变化

同上,但我们采用自 2003 年以来的百分比变化:

强调什么

  • 一种公与私的竞赛;不同时间谁在“赢”;以及 2008 年和 2014 年发生的逆转。
  • 衰退期间公众的快速增长(T2 ),之后趋于平稳。

隐藏着什么

  • 再问一次,我们所说的学生的绝对数量是多少
  • 这两种类型在总注册人数上有何不同,例如,它们从哪里开始

评估

如果百分比增长真的是讨论中的一个关键变量(而不仅仅是一个好的代理),或者两组之间存在某种竞争,那么这个图表提供了一些很好的见解。这些遐想确实将人们的注意力吸引到了衰退和随后的复苏上。

但是这里也有很多潜在的误解。没有背景知识的观众可以很容易地得出结论,这两种类型在入学人数上非常相似,并且确实在激烈争夺学生。但是我们知道公立学校在美国学生总数中所占的比例要大得多,不管我们在这张图表中看到的变化有多大。同样,有人可能会认为私人即将 超过公共,这当然也是不正确的。

与第 6 条相比,这张图表更需要一个见多识广的观众,或者提供大量的背景和教育——当图表经常被浏览时,这是一个很高的要求。

由于我没有特别想强调一个“种族”,我判断这个情节太混乱了。

最后决定

最后,我向我的同事展示了图表 6,净变化。这似乎达到了……的恰当平衡

  • 围绕经济衰退,以合理的细节强调变革
  • 允许公/私之间的比较
  • 仍然表明公立学校的总入学率更高

使用这个图表是可能的,因为我知道我的观众将熟悉高等教育的世界,包括公立和私立机构的典型入学情况。但是我的读者也不精通技术,也不一定擅长仔细阅读图表:我不想把他们和#5 或#7 混淆。

结论

我展示的七张图中的任何一张都可能是正确的选择:这取决于我们的编辑目的,以及我们试图接触的受众。

数据可视化是另一种交流模式,它与写作、漫画和演讲有着共同的问题。做出正确的选择取决于您对不同图形结构影响人类数据感知的方式的理解。这取决于你仔细检查你的选择,并考虑它们的影响。这取决于你了解你的观众。相反地…

不要

  • 不要相信任何虚假的建议,告诉你有一种正确的方法来绘制特定类型的数据(“折线图是用于时间序列的!”).就像生活中的许多事情一样,“视情况而定。”
  • 不要假装你能以某种宇宙的形式中立地呈现数据,这样所有包含在其中的美好智慧就会自然而然地流入读者体内。你需要做出编辑上的选择来帮助你的读者——你不可避免地会这样做,不管你是不是有意的。
  • 不要以为你能拥有一切。为了强调某些事情,你必须淡化其他事情。最花哨的数据可视化也救不了你:随着复杂性的增加,解释会面临新的挑战。你必须做出取舍。

作为一名数据可视化从业者,你的工作就是要擅长于此,并发展出一种什么会起作用的感觉。你不能尝试所有可能的选择;但是可以试几个合理的。希望我在这里列举的七个例子能对你的过程有所帮助。

Tableau 中的日期

原文:https://towardsdatascience.com/dates-in-tableau-6900c9d4d8a3?source=collection_archive---------9-----------------------

这篇文章对那些正在处理财务数据的人或者任何正在追踪与去年数字相比企业表现的人来说都是有用的。

用例

用户希望从宏观和微观层面跟踪上一年的销售情况(YTD,Day YOY)。

  1. 在日期字段之间切换 —当处理财务数据时,用户希望看到订单进来时的销售情况,但也希望跟踪订单何时在会计系统中登记。为用户提供在这两个日期字段之间轻松切换的能力,同时只保留一组报告和图表。
  2. 上下钻取 —当使用日期字段构建时间序列图时,Tableau 包括上下钻取日期部分的能力。但是并不是所有的用户都知道将鼠标悬停在日期轴上来查看-/+,或者您希望限制用户向下或向上钻取的能力。
  3. 日期比较 —相对日期范围过滤器可用于选择 YTD、MTD 和 Today,但不允许同比(YOY)或滚动日期范围比较。构建最常见的日期范围比较,以考虑同比和滚动周期。此外,能够改变结束日期,以跟踪有多远,从去年的销售。

下面的工作簿显示了每个步骤的最终结果,最后一个选项卡“时间序列”将所有内容汇总在一起。我决定展示如何使用连续和离散来构建每个组件,因为根据需求,两者都有用例。

[## 选择日期字段;在字段日期视图之间切换;向上钻取和向下钻取日期比较;年初至今…

选择日期字段;在字段日期视图之间切换;向上钻取和向下钻取日期比较;年初至今,年复一年以及…

public.tableau.com](https://public.tableau.com/views/DateSelector/DateCompare?:embed=y&:display_count=yes)

警告涉及参数(如本工作簿中的参数)的行级计算将增加加载时间。查看这篇互联文章

基于 Carl Slifer 的 Interworks 帖子,日期比较变得容易

在日期字段之间切换

使用参数可以很容易地在两个或多个日期字段之间转换。

第一步。创建一个参数字段,[选择日期字段]。将数据类型设置为整数将有助于提高性能,因为整数和布尔数据类型比日期和字符串数据类型运行得更快。每个值都可以有一个容易识别的名称。

第二步。创建计算[选择日期字段]

CASE [Parameters].[Select Date field]WHEN 1 THEN [Order Date]WHEN 2 THEN [Ship Date]END

第三步。在视图中放置计算并显示参数。

下面我使用[选择日期字段]计算构建了两个图表。请注意,连续图表的线条中没有断点,每个月/年都没有标记,而离散图表的线条中有断点,每个年、季度和月都有标记。

上下钻取

构建一个参数来切换到不同的日期级别。

第一步。创建【日期视图】参数

第二步。创建日期视图计算。请注意,我将使用在上一步中创建的[选择日期字段]。如果您不需要在日期之间切换,则可以使用所需的日期字段。

日期视图 _ 连续

CASE [Parameters].[Date View]WHEN 5 THEN DATE(DATETRUNC('year', [Select Date field]))WHEN 1 THEN DATE(DATETRUNC('quarter', [Select Date field]))WHEN 2 THEN DATE(DATETRUNC('month', [Select Date field]))WHEN 3 THEN DATE(DATETRUNC('week', [Select Date field]))WHEN 4 THEN DATE(DATETRUNC('day', [Select Date field]))END

日期视图 _ 离散

CASE [Parameters].[Date View]WHEN 5 THEN DATENAME('year',[Select Date field])WHEN 1 THEN DATENAME('year',[Select Date field]) + ' Q' + DATENAME('quarter',[Select Date field])WHEN 2 THEN DATENAME('year',[Select Date field]) + '-' + STR(DATEPART('month',[Select Date field]))WHEN 3 THEN DATENAME('year',[Select Date field]) + ' W' + STR(DATEPART('week',[Select Date field]))WHEN 4 THEN DATENAME('year',[Select Date field]) + '-' + STR(DATEPART('month',[Select Date field])) + '-' + STR(DATEPART('day',[Select Date field]))END

第三步。放置在视图上

连续的

在 Mac 上,按住“option”键,选择[日期视图 _ 连续]并放置在列上。将弹出一个新的下拉字段窗口,选择第一个选项“日期视图 _ 连续(连续)”,该选项不会分配静态日期部分,并允许参数正常工作。

分离的

将[Date View_Discrete]移动到列中,默认情况下将不应用日期部分。

让我们比较两个时间序列。现在我们看到离散时间序列不包含间断。我也更喜欢离散标签,因为它根据选择的日期视图来标记日期。在连续时间序列将根据所选的日期视图进行调整的情况下,连续几个月显示的日期可能会误导用户。

年初至今,滚动期间,同比

相对日期允许用户选择 YTD、MTD 和 Day,但不允许进行年度比较或滚动期比较。

为了便于进行年度对比和滚动期对比,我们将创建 2 个参数;第一个[结束日期选择器]将决定结束日期,第二个[日期比较]将告诉您要查看的日期范围类型。下面是我经常听到用户要求的 7 个日期对比。这些比较可以分为三类:年初至今,滚动期,同比。每个结束日期将根据[结束日期选择器]确定。在日期比较仪表盘上,进行选择以查看日期范围如何变化。

年初至今:从日历年的第一天开始

1.年初至今(例如,2018 年 9 月 15 日)

2.一年中的每一天(例如,星期一、星期二)

滚动周期:连续天数

3.年初至今累计

同比:上年同期的当前结果

4.季度至今

5.本月至今

6.日期(例如,2018 年 9 月 15 日)

7.一周中的某一天(例如,星期一、星期二)

构建[结束日期选择器]首先创建参数

然后构建[结束日期选择器]计算。这可以根据数据更新的频率进行调整。大多数时间默认为昨天,因为在许多情况下,提取每天刷新一次。当用户需要跟踪 YTD 和 MTD 发生的事情时,月末选项(例如,当前、上一个月、2 个月、当前年末)很方便。

DATE(Case [Parameters].[End Date Chooser]WHEN 1 THEN TODAY()WHEN 2 THEN DATEADD('day', -1, TODAY())WHEN 3 THEN { MAX([Select Date field]) }WHEN 4 THEN [Custom End Date]WHEN 5 THEN DATEADD('day',-1,DATEADD('month',1,DATETRUNC('month',TODAY())))WHEN 6 THEN DATEADD('day',-1,DATETRUNC('month',TODAY()))WHEN 7 THEN DATEADD('day',-1,DATEADD('month', -1, DATETRUNC('month',TODAY())))WHEN 8 THEN DATEADD('day',-1,DATEADD('month', -2, DATETRUNC('month',TODAY())))WHEN 9 THEN DATEADD('day',-1,DATEADD('month', -3, DATETRUNC('month',TODAY())))WHEN 10 THEN DATEADD('day',-1,DATEADD('month', -4, DATETRUNC('month',TODAY())))WHEN 11 THEN DATEADD('day',-1,DATEADD('month', -5, DATETRUNC('month',TODAY())))WHEN 12 THEN DATEADD('day',-1,DATEADD('month', -6, DATETRUNC('month',TODAY())))WHEN 13 THEN DATEADD('day',-1,DATEADD('month', -7, DATETRUNC('month',TODAY())))WHEN 14 THEN DATEADD('day',-1,DATEADD('month', -8, DATETRUNC('month',TODAY())))WHEN 15 THEN DATEADD('day',-1,DATEADD('month', -9, DATETRUNC('month',TODAY())))WHEN 16 THEN DATEADD('day',-1,DATEADD('month', -10, DATETRUNC('month',TODAY())))WHEN 17 THEN DATEADD('day',-1,DATEADD('year', 1, DATETRUNC('year',TODAY())))END)

接下来创建[日期比较对象]参数。

创建[比较日期]计算

CASE [Parameters].[Date Compare to]//Year To DateWHEN 1 THEN//CurrentIIF( DATEPART('dayofyear',[Select Date field]) <= DATEPART('dayofyear',[End Date Chooser])AND YEAR([Select Date field]) - YEAR([End Date Chooser]) = 0, 0//Previous, IIF( [Select Date field] <=DATEPARSE('MM-dd-yyyy',(STR(MONTH([End Date Chooser]))+'-'+STR(DAY([End Date Chooser]))+'-'+STR(YEAR(DATEADD('year',-1, [End Date Chooser])))))AND YEAR([Select Date field]) - YEAR([End Date Chooser]) = -1, -1, NULL))//Year to WeekdayWHEN 2 THEN//CurrentIIF( DATEPART('dayofyear',[Select Date field]) <= DATEPART('dayofyear',[End Date Chooser])AND YEAR([Select Date field]) - YEAR([End Date Chooser]) = 0, 0//Previous, IIF(  YEAR([Select Date field]) - YEAR([End Date Chooser]) = -1AND DATEPART('week', [Select Date field])*10 + DATEPART('weekday', [Select Date field])<= DATEPART('week', [End Date Chooser])*10 + DATEPART('weekday', [End Date Chooser]), -1, NULL))//Rolling  Year to DateWHEN 3 THEN//The first statement sets the conditions for a date to be considered the “current period.”//It will check every date to the date we've chosen as our starting point.//It must be based on whatever date we’ve chosen and go back a user chosen number of months, weeks, days, etc.//If the difference between these dates is >=0 and < our Period Length, we consider it to be the “current period.”IIF( DATEDIFF('day',[Select Date field],[End Date Chooser]) >=0AND DATEDIFF('day',[Select Date field],[End Date Chooser])< 365, 0//The second statement sets the conditions for a date to be considered the “previous period.”//It will compare every date to the date we've chosen as our starting point.//It will be based on whatever date we've chosen and it will immediately precede the “current period” and be the same length.//If the difference between the dates is > the Period Length but also < two times the length, it will be the “previous period.”, IIF( DATEDIFF('day',[Select Date field],[End Date Chooser]) >= 365AND DATEDIFF('day',[Select Date field],[End Date Chooser]) < 2*365, -1, NULL))//Quarter to DateWHEN 4 THEN//CurrentIIF( [Select Date field] <= [End Date Chooser]AND DATEDIFF('quarter',[Select Date field],[End Date Chooser])= 0, 0//Previous, IIF(  [Select Date field] <=DATEPARSE('MM-dd-yyyy',(STR(MONTH([End Date Chooser]))+'-'+STR(DAY([End Date Chooser]))+'-'+STR(YEAR(DATEADD('year',-1, [End Date Chooser])))))AND DATEDIFF('quarter',[Select Date field],[End Date Chooser]) = 4, -1, NULL))//Month to DateWHEN 5 THEN//CurrentIIF( [Select Date field] <= [End Date Chooser]AND DATEDIFF('month',[Select Date field],[End Date Chooser])= 0, 0//Previous, IIF( DAY([Select Date field]) <= DAY([End Date Chooser])AND DATEDIFF('month',[Select Date field],[End Date Chooser])= 12, -1, NULL))//DateWHEN 6 THEN//CurrentIIF( DATEDIFF('day',[Select Date field],[End Date Chooser])= 0, 0//Previous, IIF( [Select Date field] =DATEPARSE('MM-dd-yyyy',(STR(MONTH([End Date Chooser]))+'-'+STR(DAY([End Date Chooser]))+'-'+STR(YEAR(DATEADD('year',-1, [End Date Chooser]))))), -1, NULL))//WeekdayWHEN 7 THEN//CurrentIIF( DATEDIFF('day',[Select Date field],[End Date Chooser])= 0, 0//Previous, IIF(  YEAR([Select Date field]) - YEAR([End Date Chooser]) = -1AND DATEPART('week', [Select Date field])*10 + DATEPART('weekday', [Select Date field])= DATEPART('week', [End Date Chooser])*10 + DATEPART('weekday', [End Date Chooser]), -1, NULL))END

把所有的放在一起

最后一步,我们将创建一个仅使用当前年份的日期字段,这样我们就可以在月/日匹配的时间序列上显示上一个和当前时间段。

创建计算[日期月/日/年]。这将创建一个匹配月和日的新日期字段,并使用[结束日期选择器']获取当前期间年份。添加了额外的逻辑来考虑闰年,闰年在二月有额外的一天。如果不加上这个,那么 2 月 29 日将在 3 月结束。

DATE(STR(MONTH([Select Date field]))+"/"+IIF(DATEPART('day',[Select Date field]) = 29 AND DATEPART('month',[Select Date field]) = 2,STR(DAY(DATEADD('day', -1, [Select Date field]))),STR(DAY([Select Date field])))+"/"+STR(YEAR([End Date Chooser])))

然后根据上一节中的逻辑创建[日期视图 _ 连续]和[日期视图 _ 离散],将日期切换到[日期月/日/年]。

现在我们有了满足本文开头描述的原始用例的最终视图。最终的工作簿可以在这里查看。

Datmo:用于跟踪和可重复机器学习实验的开源工具

原文:https://towardsdatascience.com/datmo-the-open-source-tool-for-tracking-and-reproducible-machine-learning-experiments-ce1936188e0c?source=collection_archive---------9-----------------------

由于数据科学家在研究生院和工作中经常训练模型,我们在模型构建过程中面临许多挑战。特别是,这些是我们认为最大的问题:

  1. 管理库:我们大多数人都面临着安装运行代码所需的神奇的软件包排列的问题。有时候把 CUDA 升级到 9.2 就是 TensorFlow 1.9 破了。对于其他人来说,这是解决 PyTorch,CuDNN 和 GPU 驱动程序的魔方。用于构建机器学习模型的不断发展的框架和工具越来越多,它们都是独立开发的——简而言之,管理它们的交互是一个巨大的痛苦。
  2. 管理实验:三次运行前测试精度较高,但我忘记了我使用了什么超参数配置,会发生什么情况?或者试图从最近一批运行中记住哪个版本的预处理产生了最好的模型?需要记录实验以及环境、代码和数据,以及其他实验元数据的例子数不胜数,但是它们在现状中是分离的。

这个问题最近在社区中引起了广泛关注,这是谷歌的皮特·沃顿的博客

我们的解决方案:

这些问题让我们头疼了无数次,在和朋友聊过之后,我们知道我们并不孤单。我们想要的东西不仅能在实验过程中跟踪配置和结果,还能让数据科学家通过重新运行来重现任何实验!

我们最初将它构建为一个内部解决方案,用于跟踪我们的实验,使它们具有可重复性,并且易于设置环境。当我们开始扩展它时,我们努力开发一种工具,它有一个开放简单的接口,可以与我们已经在做的机器学习的方式无缝集成;相对于框架来说是通用的,但是功能强大,提供了完全的可复制性。基本上,我们可以给我们的朋友一些东西,这样他们可以在命令行上用几个命令运行他们的实验,并且仍然可靠地重复它们。

在我们自己构建和使用它之后,我们决定将其作为一个名为 datmo 的开源工具提供。

下面是datmo的工作原理!

在初始项目设置之后,只需要一个命令来运行实验,最后再用另一个命令来分析结果!

Running an experiment with datmo

这看起来不错,但是当我们有多个实验时会发生什么呢? datmo 在这里得到了更多的使用,因为我们可以使用它来比较和分析结果,并在稍后的时间点重新运行先前的实验。下面是如何使用 datmo 来实现这一点!

Rerunning a previous experiment with datmo

现在,让我们用这个例子来弄脏我们的手。有了 datmo ,我们消除了复杂性,同时提供了一种快速启动一切的方法。

快速入门:

对于这个例子,我们将展示来自经典 Fisher Iris 数据集的一个简单分类器的训练

0。预先请求:

让我们首先确保我们有 datmo 的先决条件。Docker 是主要的先决条件,所以让我们确保 docker 已经安装(并且正在运行!)才开始。你可以在这里找到基于你的 OS 的说明: MacOSWindowsUbuntu

然后,我们可以使用以下命令从您的终端安装 datmo :

$ pip install datmo

1.克隆这个 GitHub 项目

$ git clone [https://github.com/shabazpatel/quick-start.git](https://github.com/shabazpatel/quick-start.git)

2.在您的项目中,使用 CLI 初始化 datmo 客户端

$ cd quick-start
$ datmo init

然后,响应以下提示:

Enter name: (up to you!)Enter description: (up to you!)

接下来,将询问您是否想要设置您的环境。

选择y并在出现提示时依次选择以下选项:

Please select one of the above environment type: **cpu**Please select one of the above environments: **data-analytics**Please select one of the above environment language: **py27**

3.现在,使用下面的命令运行您的第一个实验,

$ datmo run ‘python script.py’

让我们看看所有运行的列表,

$ datmo ls

4.现在让我们修改新一轮的脚本,

我们将更改script.py文件。让我们取消脚本中下面一行的注释,并删除另一个配置字典,

# config = { "solver": "liblinear", "penalty": "l1" }

5.现在我们已经更新了脚本中的环境和配置,让我们运行另一个实验,

$ datmo run ‘python script.py’

6.一旦完成,我们现在将有两个实验跟踪,能够在任何机器上重新运行

Check for the previous runs with:
$ datmo lsSelect the earlier run-id to rerun the first experiment
$ datmo rerun <run-id>

恭喜你,你已经成功地复制了之前的实验!

以前,这一过程会浪费时间和精力,带来各种故障排除和令人头痛的问题!使用 datmo ,我们运行实验,跟踪它们,并用 4 个命令重新运行它们。现在,您可以使用这个通用标准分享您的实验,而不必担心复制,无论是队友复制您的工作还是尝试将模型部署到生产中。这显然只是一个小样本,但是您可以出去亲自尝试其他流,例如在 2 分钟内旋转 TensorFlow jupyter 笔记本!

GitHub 上查看我们,并在 @datmoAI ✌️给我们反馈

数据形状的 DBSCAN 聚类 k-means 不能很好地处理(在 Python 中)

原文:https://towardsdatascience.com/dbscan-clustering-for-data-shapes-k-means-cant-handle-well-in-python-6be89af4e6ea?source=collection_archive---------0-----------------------

在这篇文章中,我想从 Andreas C. Müller & Sarah Guido 的使用 Python 进行机器学习简介中选取一些内容,并简要阐述其中一个示例,以展示当 k-means 集群似乎不能很好地处理数据形状时 DBSCAN 集群的一些优势。我将直奔主题,所以我鼓励你阅读第三章的全部内容,从 168 页开始,如果你想扩展这个话题的话。当描述算法的工作时,我将引用这本书。

使聚集

  • 它的任务是将数据集划分成组,称为集群
  • 目标是以这样的方式分割数据,使得单个聚类中的点非常相似,而不同聚类中的点不同

k 均值聚类

  • 试图找到代表数据的特定区域的聚类中心
  • 在两个步骤之间交替:将每个数据点分配给最近的聚类中心,然后将每个聚类中心设置为分配给它的数据点的平均值
  • 当实例到集群的分配不再改变时,算法结束

这就是 k-means 在可视化表示中的工作方式:

import mglearnmglearn.plots.plot_kmeans_algorithm()

k-means 聚类的一个问题是,它假设所有方向对于每个聚类都是同等重要的。这通常不是大问题,除非我们遇到一些形状奇怪的数据。

在本例中,我们将人工生成该类型的数据。使用本书作者提供的以下代码(对聚类数做了一些小的修改),我们可以生成一些 k-means 无法正确处理的数据:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans# generate some random cluster data
X, y = make_blobs(random_state=170, n_samples=600, centers = 5)
rng = np.random.RandomState(74)# transform the data to be stretched
transformation = rng.normal(size=(2, 2))
X = np.dot(X, transformation)# plot
plt.scatter(X[:, 0], X[:, 1])
plt.xlabel("Feature 0")
plt.ylabel("Feature 1")
plt.show()

正如你所看到的,我们可以说有 5 个定义好的具有拉伸对角线形状的集群。

让我们应用 k 均值聚类:

# cluster the data into five clusters
kmeans = KMeans(n_clusters=5)
kmeans.fit(X)
y_pred = kmeans.predict(X)# plot the cluster assignments and cluster centers
plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap="plasma")
plt.scatter(kmeans.cluster_centers_[:, 0],   
            kmeans.cluster_centers_[:, 1],
            marker='^', 
            c=[0, 1, 2, 3, 4], 
            s=100, 
            linewidth=2,
            cmap="plasma")plt.xlabel("Feature 0")
plt.ylabel("Feature 1")

我们在这里可以看到, k-means 已经能够正确地检测到中间和底部的集群,而对于顶部的集群则存在问题,这些集群彼此非常接近。作者说:“这些群体向对角线拉伸。由于 k-means 只考虑到最近的聚类中心的距离,它不能处理这类数据”

让我们看看 DBSCAN 聚类如何帮助处理这种形状:

基于密度的噪声应用空间聚类

关于 DBSCAN 集群的一些亮点摘自该书:

  • 代表“基于密度的有噪声应用的空间聚类”
  • 不需要用户预先设置聚类数
  • 可以捕捉复杂形状的集群
  • 可以识别不属于任何聚类的点(作为异常值检测器非常有用)
  • 比凝聚聚类和 k-means 稍慢,但仍可扩展到相对较大的数据集。
  • 工作原理是识别特征空间的拥挤区域中的点,其中许多数据点靠得很近(特征空间中的密集区域)
  • 密集区域内的点称为岩心样本(或岩心点)
  • DBSCAN 中有两个参数:min_sampleseps
  • 如果在到给定数据点的距离eps内至少有min_samples个数据点,则该数据点被分类为岩心样本
  • 通过 DBSCAN 将彼此距离比距离eps更近的核心样本放入同一簇中。

这是聚类如何根据两个参数的选择而变化的示例:

mglearn.plots.plot_dbscan()

In this plot, points that belong to clusters are solid, while the noise points are shown in white. Core samples are shown as large markers, while boundary points are displayed as smaller markers. Increasing eps (going from left to right in the figure) means that more points will be included in a cluster. This makes clusters grow, but might also lead to multiple clusters joining into one. Increasing min_samples (going from top to bottom in the figure) means that fewer points will be core points, and more points will be labeled as noise.

参数eps在某种程度上更重要,因为它决定了点靠近意味着什么。eps设置得很小将意味着没有点是核心样本,并且可能导致所有点被标记为噪声。将eps设置得非常大将导致所有点形成一个单独的簇。

让我们回到我们的例子,看看 DBSCAN 如何处理它:

from sklearn.cluster import DBSCAN
from sklearn.preprocessing import StandardScalerscaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# cluster the data into five clusters
dbscan = DBSCAN(eps=0.123, min_samples = 2)
clusters = dbscan.fit_predict(X_scaled)# plot the cluster assignments
plt.scatter(X[:, 0], X[:, 1], c=clusters, cmap="plasma")
plt.xlabel("Feature 0")
plt.ylabel("Feature 1")

在扭曲epsmin_samples一段时间后,我得到了一些相当一致的集群,仍然包括一些噪声点。

  • 虽然 DBSCAN 不需要显式地设置簇的数量,但是设置eps隐式地控制将找到多少个簇。
  • 缩放数据后,为eps找到一个好的设置有时会更容易,因为使用这些缩放技术将确保所有特征具有相似的范围。

最后,考虑到我们创建了明确定义 5 个聚类的数据点,我们可以使用 adjusted_rand_score 来衡量性能。这种情况并不常见,因为在实际情况中,我们一开始就没有聚类标签(因此我们需要应用聚类技术)。因为在这种情况下,我们有标签,我们可以测量性能:

from sklearn.metrics.cluster import adjusted_rand_score#k-means performance:
print("ARI =", adjusted_rand_score(y, y_pred).round(2))
ARI = 0.76#DBSCAN performance:
print("ARI =", adjusted_rand_score(y, clusters).round(2))
ARI = 0.99

你有它!DBSCAN 得分为 0.99,而 k-means 仅得 0.76

DC:他们都去哪里了?

原文:https://towardsdatascience.com/dc-bikeshare-where-do-they-all-go-41f36baabcd9?source=collection_archive---------3-----------------------

与 R 一起寻找 310 万次骑行的罗盘方位

几周前,我写了一篇关于人们使用 DC 自行车共享服务的文章,我仍然对这些数据感到好奇。热图的结果是显而易见的:在早上和下午的高峰时段,乘车人数激增。写完帖子后,我开始思考每一次旅行的方向,以及这些旅行在一天中的每个小时分手的方向。警告:了解 DC 的地理位置将有助于理解这篇文章。

关于自行车共享数据有无数的事情要做(并且已经被做了),但是我从来没有见过它和我想象的一样。在我的脑海中,我看到了上午前往杜邦公司办公室、法拉古广场和 K 街地区的自行车流,然后在下午前往周围的街区。

在这篇文章中,我想回答两个问题:

  1. 对于一天中的每个小时,自行车共享用户的平均去向是什么?
  2. 对于几个选定的站点,自行车共享用户通常每小时去哪个方向?

数据准备

数据集需要一些调整才能成形。首先,我删除了在同一个车站开始和结束的乘车。有 113,167 个观察被删除,因为我不认为它们是真正的乘坐。接下来,我需要添加每次骑行的起点和终点的 GPS 坐标。最后,我需要计算从起点到终点的方位。

每个自行车共享点的纬度和经度都要感谢区交通局。然后,我总结了这个大型数据集,向我展示了每个小时的平均起点和终点。和往常一样, dplyr 库在这里是个救星。为了最终得到我想要的可视化效果,我需要两个数据集(一个接一个的骑行和一个接一个的小时),就像这篇文章后面解释的那样。

有了两个数据集中的开始和结束 GPS 坐标,通过我从 fossil 包中提取的一个函数,计算每个观测的方位就很简单了。我不是地理空间分析方面的专家,所以这省去了我一些大麻烦。

然而,要找到所有这些乘坐的平均方位,我不能简单地取每个观察方位的平均值。罗盘方位在 0 到 359.9 度之间。想象一个指南针,其北 0 度,东 90 度,南 180 度,西 270 度。例如,假设大多数游乐设施通常是向北行驶的。轴承将是 350 至 360 度和 0 至 10 度的组合。这些乘坐的平均值将是大约 180 度(南方),并给我们准确的错误答案(数学版本:350 度乘坐和 10 度乘坐的平均值将是(350 + 10) / 2 = 180)。因此,我必须找到每小时的平均起点坐标和平均终点坐标,然后计算这条路线的方位。

在这里的一张表格中,无聊地呈现了每小时 DC 自行车共享出行的平均方位。为了美好的事物…

可视化自行车方向

是时候策划了!为了实现我想象的可视化,我需要使用两个数据集,完整的 310 万个观察数据集和逐小时数据集。第一个数据集将显示来自所有单独乘坐的方向喷雾,第二个数据集将显示该小时块中平均乘坐的方位。

在我的脑海中,我看到一个指南针,背景中所有的游乐设施都是透明的,一个箭头根据小时和平均方向从左向右摆动。 ggplot 包有一个 coord_polar 函数将直方图转换成圆形图。在修改了主题之后,我能够让它看起来像一个指南针!

我为每张图表创建了 24 张图片,每张图片代表一天中的一个小时,然后把它们放入 GIF 制作机中,瞧!

gif 上的一些注释:

  • 灰色条代表那个小时在那个方向乘坐的次数。最长长度代表该小时在该方向上的最大乘坐量。因此,您无法比较一个小时与下一个小时的条形高度。我插入了那个小时乘坐的次数来提供一些背景。
  • 这张 GIF 不以任何方式代表每次乘坐的距离。只是方向。

车站 gif

我决定分解上面的 GIF,看看骑行一站一站地走向哪里。我选择它们是基于它们在 DC 的位置(还有一个在芒特普莱森特,因为我曾经住在那里)。

正如你所看到的,根据车站在 DC 的位置,大多数乘坐的方向可能会有很大的不同。同样,这在直觉上是有意义的。如果你从 DC 的东边开始,你可能会向西走,因为那个方向有更多的活动,有更多的车站可以停靠你的自行车。

我还注意到有很多游乐设施直接向西、向东或向南行驶。由于 DC 是一个网格城市,似乎许多自行车骑行开始和结束在同一条街上。这是有道理的。这也是有道理的,某些车站,如联合车站,主要是向西(K 街,杜邦等)的方向。).

我有几个理由来解释为什么正北不是一个常见的方位。首先,我删除了所有在同一个车站开始和结束的乘车。这些飞行会产生 0 度的方位,或者直接指向北方。然而,应该仍然有直接向北行驶的游乐设施,比如说沿第 14 街西北方向。我的理论是,你越往北走,就越容易上坡。作为重型自行车,上坡骑并不流行。

结论和后续步骤

看一下自行车共享站的地图(以及整个 DC 的地图),大多数的站和人都在西北方向。从西北方向去上班,你通常会往南走。要回家,你通常会向北走。

再往深里看,另一个帖子的成因,除了方位,我还想看每一次乘坐距离每一站的距离。这将把我带到 ggmap 包,我刚刚开始修补它。

一如既往,我很想听听你的想法。如果你认为我错过了一个很棒的电视台,给我一声,我很乐意去看看。或者如果你想看看你当地的车站,我也可以帮你!

代码可在我的 GitHub repo 这里(寻找 dc bikeshare 方向。R站承载 gif 功能。R )。

深度卷积生成对抗网络

原文:https://towardsdatascience.com/dcgans-deep-convolutional-generative-adversarial-networks-c7f392c2c8f8?source=collection_archive---------6-----------------------

生成对抗网络最有趣的部分之一是生成网络的设计。生成器网络能够获取随机噪声并将其映射到图像中,使得鉴别器无法辨别哪些图像来自数据集,哪些图像来自生成器。

这是神经网络的一个非常有趣的应用。通常,神经网络将输入映射为二进制输出(1 或 0),可能是回归输出(某个实数值),甚至是多个分类输出(如 MNIST 或 CIFAR-10/100)。

在本文中,我们将看到神经网络如何从随机噪声映射到图像矩阵,以及在生成器网络中使用卷积层如何产生更好的结果。

我们将回顾在 ICLR 展示 DCGANs 的论文,这是一个生成卧室的生成器网络架构,我们将回顾来自 GANs-in-Action 知识库的一些 Python/Keras 代码。

这是 LSUN 场景建模论文中介绍的 DCGAN 生成器。该网络接收一个 100×1 的噪声矢量,表示为 Z,并将其映射到 64×64×3 的 G(Z)输出。

这种架构特别有趣的是第一层扩展随机噪声的方式。网络从 100x1 到 1024x4x4!这一层被称为“项目和整形”。

我们看到,在这一层之后,应用了传统的卷积层,该卷积层使用传统卷积层教导的(N+P — F)/S + 1 等式来重塑网络。在上图中,我们可以看到 N 参数(高度/宽度)从 4 到 8 到 16 到 32,似乎没有任何填充,内核过滤器参数 F 是 5x5,步幅是 2。您可能会发现,这个等式对于设计定制输出大小的卷积层非常有用。

我们看到网络从

100 x 1→1024 x 4 x 4→512 x 8 x 8→256 x 16 x 16→128 x 32 x 32→64 x 64 x 3

以上是论文中给出的网络输出,引用了 5 代训练后的结果。相当令人印象深刻的东西。

现在,让我们看一些 python 代码:

这段代码摘自 Jakub Langr 和 Vladimir Bok 创建的 gans-in-action 知识库,据我所知,这是在 Keras 中实现 gans 的最佳入门代码。我认为这本书还没有发行,但我想象它会很好。

[## 战斗中的甘斯/战斗中的甘斯

行动中的 GANs 的伙伴知识库:具有生成性对抗网络的深度学习…

github.com](https://github.com/GANs-in-Action/gans-in-action/blob/master/chapter-3/Chapter_3_GAN.ipynb)

下面的代码是我如何运行我的第一个 GAN 网络的,(没有实现 DCGANs):

def generator(img_shape, z_dim):
  model = Sequential() # Hidden layer
  model.add(Dense(128, input_dim = z_dim)) # Leaky ReLU
  model.add(LeakyReLU(alpha=0.01)) # Output layer with tanh activation
  model.add(Dense(28*28*1, activation='tanh'))
  model.add(Reshape(img_shape) z = Input(shape=(z_dim,))
  img = model(z) return Model(z, img)

下面的架构并不复杂,实际上在 MNIST 数据集的例子上产生了相当不错的结果。该模型接受噪声矢量并将其映射到密集连接的层,该层映射到输出层,该输出层是被整形为 28×28 MNIST 数字矩阵的平面 784×1 矢量。

现在让我们将其与 gans-in-action 存储库中提供的 DCGAN 代码进行对比:

def generator(img_shape, z_dim):
  model = Sequential()

  # Reshape input into 7x7x256 tensor via a fully connected layer
  model.add(Dense(256*7*7, input_dim = z_dim))
  model.add(Reshape((7,7,256)) # Transposed convolution layer, from 7x7x256 into 14x14x128 tensor
  model.add(Conv2DTranspose(
               128, kernel_size = 3, strides = 2, padding='same')) #Batch normalization
  model.add(BatchNormalization()) #Leaky ReLU
  model.add(LeakyReLU(alpha=0.01)) # Transposed convolution layer, from 14x14x128 to 14x14x64 tensor
  model.add(Conv2DTranspose(
              64, kernel_size=3, strides=1, padding='same')) # Batch normalization
  model.add(BatchNormalization()) # Leaky ReLU
  model.add(LeakyReLU(alpha=0.01)) # Transposed convolution layer, from 14x14x64 to 28x28x1 tensor
  model.add(Conv2DTranspose(
               1, kernel_size = 3, strides = 2, padding='same')) # Tanh activation
  model.add(Activation('tanh')) z = Input(shape=(z_dim,))
  img = model(z) return Model(z, img)

我们看到上面的架构非常类似于 ICLR,LSUN 场景生成器论文中提出的 DCGAN。输入从 100×1 噪声投射到 7x7x256 张量,然后卷积,直到达到 28×28×1 MNIST 数字输出。

同样,我们看到同样的项目和整形,接着是卷积层进入起始代码中图表的输出。

结论

我希望这篇文章能帮助您开始构建自己的 DCGANs。我认为它至少很好地解释了高层架构应该如何工作。剩下的挑战在于为卷积层以及投影和整形层找到正确的参数。

我真的发现这个开源代码库和 ICLR 论文的结合有助于我理解这个概念。我对构建 GANs 并看到他们能做什么感到非常兴奋,请留下您认为真正有帮助的任何其他资源的评论。如果您想了解使用这些 DCGANs 进行数据扩充的进一步研究,请点击此处。

CShorten

Connor Shorten 是佛罗里达大西洋大学计算机科学专业的学生。对计算机视觉、深度学习和软件工程感兴趣。

对随机森林进行解码

原文:https://towardsdatascience.com/de-coding-random-forests-82d4dcbb91a1?source=collection_archive---------7-----------------------

用 Python 从头开始构建你的随机森林,并解释“黑盒”背后的数学原理

动机:随机森林集成广泛用于现实世界的机器学习问题、分类以及回归。它们的受欢迎程度可以归因于这样一个事实,即实践者通常使用随机森林算法获得最佳结果,只需最少的数据清理,并且没有特征缩放。为了更好地掌握基本原理,我决定从头开始编写一个随机森林,并对数据中的不同特征及其在决定最终结果中的作用进行一些可视化。人们普遍认为这是一个黑盒,快速浏览一下这个算法将会证明它实际上是很容易解释的,除了是一种利用“多数票的力量”的强大技术。

简介

随机森林集成是一种分而治之的方法,用于提高单个弱决策树模型的性能。这背后的主要原理是一群“弱学习者”可以走到一起形成一个“强学习者”。每个分类器,单独地,是一个“弱学习者”,而所有的分类器放在一起是一个“强学习者”。

随机森林集合

随机森林概念的核心是对大量决策树的结果进行平均。决策树通常是向不熟悉机器学习的人解释预测背后的直觉的便捷工具。但是解释一个随机森林如何得出一个预测,以及使用哪些特征或独立变量,可能是一项相当艰巨的任务。随机森林经常被误解为“黑盒”或难以理解。

Random Forest Ensemble

用 Python 编码随机森林

下一节将从头开始演示随机森林的编码和优化,并深入了解随机森林的工作方式。我们还着眼于理解在预测结果时,某些特征如何以及为什么比其他特征被赋予更大的权重。

随机森林和决策树类

使用 Python 中面向对象的编程方法,定义了由“决策树”对象组成的类“RandomForest”。随机森林基本上是其决策树执行的每个核心功能的收集器和平均值计算器。

The Random Forest class

The Decision Tree class

  • 构造函数(init)采用样本大小或训练样本的数量来为每棵树考虑,以及为每棵树分割的最大特征,以便在每棵树中灌输随机性并消除预测中的偏差。它还需要随机森林算法中使用的一些其他常见超参数。
  • fit 方法执行使用训练数据构造随机森林的成员树的关键功能。
  • predict 方法执行跨每个成员树平均测试数据预测的功能,以决定测试数据的最终预测结果。

训练模型的逻辑流程

随机森林类中的 fit()方法被调用用于训练模型,该方法调用决策树类中的函数 var_split(),该函数循环调用 find_better_split()。这将构造林中的每个成员决策树,并适合每棵树的定型数据。

var_split() function implementation in Decision Tree

find_better_split() function implementation

在找到在每次分裂时最大化同质性的特征之后,决策树递归地分裂成左和右子树。这是通过双回路逻辑实现的:

  • 第一个循环是遍历树的所有特征,以确定哪个特征对于特定级别的分割是最好的。var_split()函数为每个特性调用 find_better_split(),以确定产生最纯粹叶节点的特性。
  • 在内部循环中,对每个特征调用 find_better_split()函数,以计算该特征的最佳值,在该最佳值处应该对树进行分割。
  • 这是通过对该特性的值进行排序、遍历该特性的所有不同值并跟踪因变量的相应值来实现的。
  • 计算分数,该分数是通过在每个不同的值处为每个特征分割树而获得的信息增益。该分数表示分裂后形成的子树的方差,需要将其最小化。
  • 导致子树中最低方差或最大同质性的特征和特征值的组合被选择用于分割。
  • 在找到最佳特征和最佳分割值后,树被分割成左右子树,并且该类的 leftTree 和 rightTree 成员被填充。
  • 在 leftTree 和 rightTree 成员上递归调用函数 var_split(),以找到要分割的最佳特征以及该特征的最佳值。这一直持续到满足叶节点的条件之一,即达到树的最大深度或达到数据样本的最小量。
  • 分配给该叶的值是包含在其中的训练样本的平均值,或者是共同代表该叶中数据的相应值。

对测试/验证数据集进行预测

predict() function for Random Forest

predict() implementation for a Decision Tree

使用该模型预测结果的代码非常简单明了。

  • 随机森林集合的预测是通过平均每个单独决策树的预测来完成的。

注意:对于随机森林回归器来说,平均预测是一种很好的技术,但是对于随机森林分类器来说,考虑树木预测的频率并选择具有最大频率的预测值才是正确的做法。

  • 在决策树中,对每一行的预测是通过遍历树,将特征值与要在每一层上分割的特征值进行比较,如果特征值较小,则导航到左侧子树,如果特征值较大,则导航到右侧子树来完成的。这一直持续到到达叶节点。
  • 然后,对该行的预测是叶节点中包含的值,该值已在训练阶段预先分配。

解释随机森林模型

我们现在有了自己的随机森林集合库的基本结构。让我们添加功能交互和树解释的超级有用的增强,这是帮助解释随机森林的重要概念。

特征重要性背后的直觉

Calculate feature importances for this model

要了解某个特定特征在决定模型预测时有多大发言权,请遵循以下方法:

  • 记录数据集预测的评估指标(准确性或误差)。
  • 接下来,使用 Numpy 库中的 shuffle()方法对重要性有待确定的特性的值进行随机洗牌。
  • 通过运行模型来预测具有该特定特征列的值的数据集的值,再次计算评估度量。
  • 计算得到的度量和没有打乱特征值的先前度量之间的差异。
  • 如果差异很大,得到的度量要差得多,那么这个特定的特性在决定模型预测时肯定有很大的发言权。

如果随机改变某个特性的值会导致模型性能急剧下降,我们可以说这个特性肯定会在树中相对较高的位置使用,并且很重要。在我的实现中,这种技术已经通过遍历特性而被用于每个特性。

可以为特征及其相应的重要性绘制漂亮的可视化图形,如条形图,以解释我们的随机森林模型赋予不同特征的权重。

Feature Importance Chart

随机森林的部分相关图

部分相关图对于理解结果或目标变量如何随特定特征变化,以及目标和该特征之间的实际关系特别有用。是单调递增/递减还是无规律?

单变量图与部分相关图

如果我们看一个典型的单变量图来寻找一个特征对目标变量的影响,我们很少看到连续的上升/下降曲线或直线。单变量图通常是不规则的。

例如,假设您正在处理一个住房数据集,并希望在给定一组要素(包括房屋建造年份、地点和其他要素)的情况下预测房价。如果你绘制一个价格与建造年份的单变量图,你会看到一条连续上升的曲线,因为房地产价格通常会随着时间的推移而上涨。但是在几年间,这一情节变得越来越糟。这会错误地让你相信这几年是房价下跌的年份。

Univariate Plot for the log of House Prices varying with Year Built

然而,这可能是因为那些年买的大多数房子都在相对便宜的地方,因此曲线下降。

一个部分相关图将解决这个问题,并显示价格和年份之间的真实关系,你会发现它们毕竟是持续增长的。这是因为在部分相关图中,我们只考虑变化的特征,确保所有其他特征保持不变。因此,我们从其他因变量中剔除噪声,并更好地理解每个特征与目标变量之间相互作用的真实性质。

Partial Dependence Plot would show the correct trend of prices against Year Built

部分依赖图的实现

我的部分依赖图的实现方式如下:

Partial Dependence Plot for a particular feature

  • 保持所有其他列(特征值)不变,继续遍历要考虑的要素的所有唯一值,并运行模型来预测该要素的每个唯一值的结果。
  • 绘制结果值,以了解目标变量随特定特征变化的趋势。

保持其他列不变并改变计算依赖的特征,是解决来自外部源的噪声渗入特征和目标之间关系的描述的问题的关键。

随机森林的树解释器

解释随机森林预测流程的一个非常有用的技术是对每个决策树使用树解释器。

Tree Interpreter Class with the predict function

树根处的值(简单地说就是训练数据中所有目标的平均值)被称为“偏差”。

树解释器类中的 predict()函数调用决策树中的 predict_row_for_ti()函数,该函数预测“行”或单个数据样本的结果。

在每次分割时,使用分割成子树后样本平均值的变化量来计算分割中使用的特征的贡献。

特征贡献被存储在一个数组中,直到到达一个叶子,然后结果被返回给树解释器。

在叶节点,返回该数据样本的预测值,以及偏差和“贡献”,即每个特征对最终结果的贡献。

Function inside the Decision Tree, used by the Tree Interpreter

基于树形解释器的瀑布图

使用 python 中最新的“瀑布”包,每个特性对到达叶节点(最终结果)的贡献可以通过瀑布图可视化。

瀑布图是可视化每个特性贡献的最有效方法之一,从树根开始,直到叶节点的最终结果。

Waterfall Chart with the contributing features in X axis and resulting target values in the Y axis

未来的增强功能

需要进一步丰富随机森林库的几个方面如下:

在树解释的基础上,需要对随机森林中的特征的相关性进行工作,通过找到在连续分割中经常使用的特征组,因此可能具有更高的相关性。

这将是探索随机森林中特征相互作用的第二种方法,第一种方法是可以扩展到多个特征的部分相关图。

注意:Python 中的标准机器学习库在速度和效率方面进行了高度优化,因此你从头编写的任何代码都可能需要在cy thon(Python 使用的底层 C 实现)中执行,以获得更快的结果。为此,只需将“%%cython”添加到代码的开头。

最终想法和关键要点

这是从头开始编写机器学习算法的良好起点,也是理解 Python 中几个超级有用的库的良好起点,包括用于快速数学计算的 Numpy 和用于数据可视化的 Matplotlib。

完整的实现可以在我的 Jupyter 笔记本中找到,网址是 https://github . com/SonaliDasgupta/mlandiaalgorithmsfromsscratch,在那里我尝试了使用数据集的想法和可视化。代码必须进一步完善和优化,我正在努力。非常欢迎任何建议或贡献。

这对我来说是一个非常愉快的练习,我希望我已经帮助你在数学上和视觉上更深入地研究了随机森林实现,并且理解它并不像看起来那么复杂或“黑箱”。

参考文献:

  1. http://blog . citizennet . com/blog/2012/11/10/random-forests-ensembles-and-performance-metrics
  2. https://course.fast.ai/ml.html

用于分类的类不平衡数据集的处理。

原文:https://towardsdatascience.com/dealing-with-class-imbalanced-datasets-for-classification-2cc6fad99fd9?source=collection_archive---------7-----------------------

倾斜的数据集并不少见。它们很难处理。当遇到这样的问题时,通常的分类模型和技术经常失败。虽然你的模型甚至可以让你在这种情况下达到 99%的准确率,但是,如果你用一个合理的指标来衡量自己,如 ROC Auc 得分,那么你将面临登上排行榜的麻烦。这是因为如果数据集是倾斜的,例如,阳性与阴性的比例为 10:1,那么通过预测每个样本的阳性而无需任何学习,您就可以获得 90%的准确率!那么,我们如何解决这个问题呢?这篇文章将会强调一些你可以用来做好这些工作的有效技巧。这些技术包括对数据进行不同的采样,巧妙地设置一些超参数,以及使用包含不同版本的常用算法的库,这些算法可以在内部处理不平衡。

  1. 采样

你可以用两种不同的方法做到这一点。

a.欠采样。

比方说,您的数据集中有 40,000 个阳性样本和 2,000 个阴性样本。从今以后,我们将把它作为我们的运行范例。你可以做的只是从 40,000 个样本中随机选取 2,000 个阳性样本,所有 2,000 个阴性样本,然后只在这 4,000 个样本上训练和验证你的模型。这将允许你以通常的方式使用所有的分类算法。这种方法很容易实现,运行速度也很快。然而,一个不利之处是,您可能会丢弃您拥有的 38,000 个阳性样本,并且这些数据将付诸东流。

为了克服这个问题,您可以创建一个模型集合,其中每个模型使用一组不同的 2,000 个阳性样本和所有 2,000 个阴性样本,并分别进行训练和验证。然后在你的测试集上,你对所有这些模型进行多数投票。这使您可以考虑到所有的数据,而不会导致不平衡。此外,你甚至可以对不同的集合使用不同的算法,这样你的集合会更加健壮。然而,这在计算上有点昂贵。

b.过采样

在这个方法中,您生成了少数类的更多样本。为此,您可以先创建创成式模型,然后创建新样本,也可以只选取现有样本进行替换。存在多种过采样技术,如 SMOTE、ADASYN 等。您将不得不看看哪一个最适合您的用例。此外,过采样本身是一个计算量很大的过程。主要的优点是,这允许你的一个模型立刻考虑你的所有数据,并且还帮助你生成新的数据。

2。使用秤重位置重量参数。

如果你使用的是 XGBoost 这样的算法,有一个简单的方法。您可以设置算法的 scale_pos_weight 超参数,以指示您的数据集具有一定比例的正负类,XGBoost 将处理其余部分。因此,在我们运行的 40,000 个阳性样本和 2,000 个阴性样本的例子中,如果我们想在这个数据集上训练我们的 XGBoost 分类器,我们应该将 scale_pos_weight 的值设置为 40,000/2,000 = 20。
这在实践中非常奏效。然而,一个缺点是这限制了您使用 XGBoost 和其他类似的算法,因为不是所有的算法都有这个可调的超参数。

3。使用不平衡学习图书馆。

是的,你猜对了。已经有一个成熟的 python 库专门用于处理这类问题。这个库是 sklearn-contrib 的一部分。但是很容易迷失在图书馆的细节里。对我来说效果最好的是BalancedRandomForestClassifier。通常的随机森林算法在不平衡数据集上表现极差。然而,这个平衡随机森林分类器是 imblearn 包的一部分,工作得非常好。它在内部处理采样问题。您可以获得随机森林所有功能以及熟悉的 sklearn API。该库的其他特性包括内置过采样器、欠采样器以及两者的组合。)和其他专门用于处理倾斜数据集的算法。这里有很多值得探索的地方。

一个月前,当我开始处理一个 20:1 不平衡的数据集时,我找不到关于如何解决这个问题的很好的资源。因此,我决定展示我在试图找到有效处理倾斜数据集的方法时学到的东西。我希望这对你有好处。你可以在我的 GitHub repo 找到代码库中使用的所有这些技术。请随时在评论中提出建议,你可能知道的任何其他方法可以帮助人们在这场不平等的战斗中找到伟大的平等!谢谢你。

处理数据灾难:简单的修复

原文:https://towardsdatascience.com/dealing-with-data-disasters-simple-fixes-6f588f57f993?source=collection_archive---------7-----------------------

您多久收到一次已经准备好用于分析或数据可视化的数据集?不是来自 viz 示例或教程的?我不知道你是怎么想的,但是几乎所有到我手里的数据都需要至少一点点的清理。

大多数修复都相当简单,有些可以很容易地手动完成。然而,有时我会得到一大堆文件,手动修复每个文件会相当耗时。所以我一直在用 python 开发一个小的命令行工具,来加速一些数据清理的苦差事。该工具创建了一个新文件,因此原始数据文件仍然是完整的。

通过命令行使用工具

python cleaner.py -skim

这将删除 csv 文件开头的任何空行或多余行。这个似乎很容易用手修复。只需打开文件并删除有问题的行。很简单。

但是如果它是一组 2000+的文件,并且在每个文件的前两行都有一个徽标,也许还有一个电子邮件地址呢?有些文件下面有一个空行,有些有三个空行。有些还有邮寄地址。

为了处理标题行上面的这些额外的行,标记“-skim”告诉 cleaner.py 脚本将所有数据保存到一个新的 csv 文件中,不包含额外的行。空行很容易。该脚本只是检查这些行中是否有任何内容,然后跳到第一个有内容的行。

empty rows above header row

如果有额外的行,带有徽标或联系信息,事情会变得稍微复杂一些。大多数情况下,文件有几列数据,额外的行只是一列或两列。在这种情况下,脚本会检查第一行的长度是否小于数据行的一半(在此之前会检查数据行的长度)。

extra rows above header row

但是,这种方法在只有几列数据的情况下会失败。还有其他边缘情况,但这是最常见的。

extra row, but too few columns of data → fail to

在这种情况下,最好使用'-rows '标志来指示要保存哪些行。

选择特定行

如果您知道您想要哪些行,您可以使用'-rows '标志来选择它们。

python cleaner.py -rows 1-20

如果你只想跳过前 10 行,你可以只使用你想开始的行号。该脚本假设您需要这之后的所有内容。

python cleaner.py -rows 10

这也可以与“-skim”和“-cols”结合使用

python cleaner.py -skim -rows 10 -cols 2-5

这将删除额外的标题,并保存原始文件中的特定行和列。当我创建测试或样本集时,我经常使用它。

选择特定列

python cleaner.py -cols 2, 5-9, 12
  • 可以按索引在范围内单独选择特定的列
  • 索引从 0 开始。

功能与选择行时略有不同。

  • 如果只给出一个索引->只选择该列。
  • 要选择一个列和后面的所有列,如 8 之后的所有列,请使用“+”
 -cols 8+ 

为什么?

列选择不同于行选择,因为我发现我通常对原始数据集中的特定列感兴趣。有时候,一个数据集有很多问题,我只想一次处理一列(或几列)。对于行,我通常只需要一个小的子集,哪一行并不重要。我可能只想要最后 20 行,但是我可能不需要指定第 9 行和第 21 行。

默认情况下会发生什么?

许多事情会自动完成。

“未命名”标题-移除

将 excel 表转换为 csv 可能会导致第一行的空单元格被填充“未命名:#”,因此这些单元格将从标题行中删除。

移除空列和空行

一些 csv 文件有空的列和行。这些会自动删除。如果一个文件有很多空的列和行,我可能会在做任何事情之前运行清除程序,不带任何标志。

删除多余的表格和总和行:

有些文件在所有实际数据下方有汇总表,或者有一行是列总和。这些都被移除了。

展平标题:

如果有多层标题,它们会被展平成一行。

所以像这样的桌子

会被转换成这样的东西

注意:如果设置了“另存为 json”选项,这个展平功能将被忽略…我们将在另一篇文章中详细讨论 json。

在本系列的下一篇文章中,我们将讨论一些稍微复杂一点的修复…比如从一列的内容中提取一个丢失的标题名。

这个项目的源代码可以在 github 上找到。

处理开发数据管理

原文:https://towardsdatascience.com/dealing-with-development-data-management-e25946ac77f8?source=collection_archive---------5-----------------------

西方世界大多数组织和公司的企业数据让我想起了牧牛。一场人与野兽之间的精心舞蹈,由经验丰富的训练员团队在值得信赖的边境牧羊犬的帮助下,将大量高价值商品从一个地方运送到另一个地方而不损失任何数量,保护牛群免受秃鹫或偷猎者的伤害……就像处理消费者数据一样!

在国际发展领域处理数据更像是一种乡村的放牧心态--山坡上孤独的牧羊人的心态。他的兽群通常只有一根杖,规模要小得多,也没有那么强大。但它的价值丝毫不减——它是他幸福的命脉——而且通常就像狂奔的牛群一样难以驾驭!

谢泼德这种小而装备不足的心态阻碍了开发部门真正利用我们周围正在发生的数据革命(即使是在我们工作的同一个新兴市场的商业部门!).ICT4D 的倡导者多年来一直在推动数字数据收集和基于证据的决策,但技术勒德分子和非早期采用者的使用率并不令人鼓舞。

那么问题是什么呢?为什么追不上大数据用户?

对我建议的 20 个项目进行的非正式调查揭示了阻碍开发专业人员利用快速扩展的现代数据管理产品/应用程序/工具市场的根本问题。

我们不知道外面有什么工具。

我们不知道如何使用它们。

我们买不起。

好消息是:所有这些障碍都是可以克服的。坏消息:另一边有很容易陷入的危险陷阱。

我们不知道有什么工具存在。

这在 5 年前是一个很难克服的重大挑战,除非你是一个网络良好的技术迷,喜欢在空闲时间尝试应用程序。今天,市场上有太多成熟的工具(有时是激进的)向开发专业人员推销。捐助者已经购买了数据管理平台,如 T2 的发展成果,或者与大型软件供应商建立了合作关系,如美国国际开发署的微软。

陷阱: 买错了技术。 随着技术服务提供商扩展到开发市场,组织或项目很容易陷入在技术领域臭名昭著的“闪亮的小玩意”宣传中,而没有尽职调查以了解特定的产品或应用程序是否真的能满足他们的需求。在购买新产品之前,一定要货比三家。社交媒体是一个很好的平台,可以获得对特定工具的公正反馈——使用# YourPotentialProductSolution 的标签搜索 Twitter,看看其他用户在说什么。

我们不知道如何使用这些工具。

Youtube 提供的不仅仅是可爱的动物视频和真人秀的精彩片段。几乎市场上的每一个 ICT 解决方案或数据管理产品都有在线“操作”视频,可以给你一个速成班,让你立刻成为专家。昆西·拉森在自由代码营向他的学生宣讲:阅读-搜索-提问。通读工具开发者提供的任何博客或说明。如果你的阅读材料没有提供解决方案,谷歌是你寻找答案的最好朋友。在大多数情况下,你不是第一个对软件解决方案或应用程序有疑问的人——在互联网上的某个地方,有人问过你的问题,并且(希望)分享了一个解决方案。还是找不到答案?使用 Twitter 上的#ICT4D 标签来寻找专家,他们可能会给你指出正确的资源。

陷阱: 知识刚够就闯祸。为你可能遇到的一个问题找到答案可能相对容易。但是许多实施者发现他们遇到了更大的挑战,他们有限的知识无法解决。这可能会给项目活动带来重大问题——尤其是当您正在进行一项重要的数据收集工作或者明天要交报告的时候!如果您的组织认真对待使用技术进行数据管理,投资培训和能力建设是至关重要的。像所有专业化一样,数据管理是一个很深的领域,需要时间来掌握。但是不要沮丧——像 TechChange 这样的组织提供了大量关于在开发领域使用技术的课程。提前计划,培养你需要的技能,这个陷阱很容易避免。

我们买不起工具。

经济学是我们的朋友,尤其是随着商业数据管理解决方案在发展中市场的出现。只要稍加规划,即使是最小的项目,良好的数据收集、存储、分析和可视化工具也不再遥不可及。免费的开源选项分布很广,但即使是收费的工具也变得负担得起——通过良好的规划,一个完整的数据管理生态系统每年只需 1000 美元即可部署。数据存储领域的知名企业,如 SalesForce 甚至为人道主义组织提供折扣价。全面扩展定价模式使我们这些拥有较小(但仍有价值!)数据集,利用与大公司相同的“大数据”技术产品。

陷阱: 在不需要的技术上花费过多。人们很容易对一种新工具的功能惊叹不已,却没有意识到你所支付的东西在埃塞俄比亚的农村低地或亚马逊的深处是行不通的。更糟糕的是,当我们需要的只是一辆菲亚特时,我们却为一辆凯迪拉克付出了太多。在购买一项技术之前,和你的项目经理坐在一起,想出一个必备特性&功能的清单。当你找到你梦想的工具时,确保你没有把钱浪费在你不会(或没有能力)使用的东西上。

寻找更多关于为开发项目选择数据管理工具的建议?

查看这些资源:
Digital @ DAI ICTworks
ICTs 促进发展

处理学习系统中的脏数据

原文:https://towardsdatascience.com/dealing-with-dirty-data-in-your-learning-systems-81999f199037?source=collection_archive---------6-----------------------

每个伟大的学习系统背后都有数据。你对系统做得越多,产生的数据就越多。你越是合并系统、导入历史记录和篡改数据来解决问题,你生成的数据就越多,数据就越不“干净”。什么是干净数据?什么是脏数据?如何清理脏数据?问题问题。

让我们从如何定义干净数据和脏数据开始。在我的定义中,干净数据是通过直接使用系统生成的数据。在学习系统中,当你创建一个新用户时,当他们完成学习时,当他们变得有能力或在作业中被标记时,就会产生数据。它是通过使用系统工具,由学习者或辅导员的行动直接分配的。很完整也很准确。脏数据不干净!它包含错误或缺少关键字段。脏数据是由许多其他因素引入的。这可能是管理员“调整”学习记录,导入其他地方记录的记录,合并不同系统的记录,引入不完整的数据以及任何涉及直接调整后端数据库的事情。

所以导入和调整数据是有风险的事情。这并不是说你做了一次就自动破坏或污染了你所有的数据,但这肯定意味着你要冒这个风险。如果你的数据杂乱无章,你就有被感染的风险,而且很难清除。如果你想知道我们到底为什么要这么做,答案很简单,现实生活并不像总是让一切都通过你的系统那样简单或清晰。我们知道,有时您会在其他地方生成或保存数据,并且确实需要将它们带过来。所以为了安全起见,你必须采取保护措施。就数据而言,这意味着在让数据进入您和您的系统之前,要对数据进行相当严格的筛选。这也是为什么项目的早期范围界定阶段如此重要的另一个原因。一旦您发现数据是脏的,下一步就是清理它。数据清理可能是一个及时的(因此也是昂贵的)过程,所以你提供的数据越好,清理的痛苦就越少。

我在导入的数据中看到的最大的失败是每一行数据都缺少唯一的标识符。如果没有,清理工作将从为每个用户、每个“对象”、系统中任何地方引用的所有内容分配唯一标识符开始。您可以将唯一标识符的不一致使用算作没有唯一标识符,事实上这更糟糕,因为它使数据在第一次检查时看起来相当干净。数据差距也是常见的问题,在某些情况下,这是可以接受的,在其他情况下,它们是不可接受的;想象一个课程代码为空,但有一个完成日期。你认为一个学习系统如何处理一门课程,而不识别它,只知道它是什么时候完成的(这不是很好)。相似但不相同的数据是另一个痛苦。您和我都知道 St .和 Street 可能是相同的,但是在数据方面它们是不同的(这就是为什么那些唯一的 id 如此重要)。

如何判断您的数据是否是脏的?有一些非常关键的事情将很快决定这一点。差距是最明显的一个,尤其是在必需的 ID 字段中。使用 Excel 等电子表格程序中的工具进行一些分析,可以找到重复的内容。缺少 ID 字段也是一个非常明显的起点!数据的关键是系统化。脏数据通常是由人为错误引起的,在日常使用中不接触数据会增加数据保持干净的机会。当然,具有讽刺意味的是,脏数据通常需要大量的人工干预才能恢复到干净的状态。

最大的危险是,你的系统中有很多数据因为系统而变得非常干净,然后你向其中引入了一点脏数据。突然,您的系统的整个数据集遭到破坏,您的少量脏数据突然产生了大量脏数据。清理由此造成的混乱远比在导入数据之前确保数据是干净的要重要得多。

我的建议是双重的。首先让你的系统来管理你的数据,如果可以的话,不要插手。其次,如果您必须从外部来源引入数据,那么在导入之前,需要花费时间和精力来确保数据是干净的。当然,你可以导入它,然后清理它,但这样你就清理了整个系统,这是非常痛苦的。

如果你打算改变系统或者把你的学习系统和你的人力资源系统联系起来,这是清理你的数据的好时机。请记住,干净数据加上脏数据等于大量脏数据,最好在链接或引入新系统之前完成这项工作。

如果那些肮脏的数据让你觉得肮脏,我道歉!请随意附和您的肮脏数据故事,但不要期望我做所有的清理工作!

机器学习中不平衡类的处理

原文:https://towardsdatascience.com/dealing-with-imbalanced-classes-in-machine-learning-d43d6fa19d2?source=collection_archive---------1-----------------------

介绍

大多数现实世界的分类问题都表现出某种程度的类别不平衡,即每个类别在数据集中所占的比例不同。适当调整你的标准和方法以适应你的目标是很重要的。如果没有做到这一点,您可能会在您的用例环境中为一个无意义的度量进行优化。

例如,假设您有两个类——A 和 B。A 类占您数据集的 90 %, B 类占另外的 10%,但是您最感兴趣的是识别 B 类的实例。通过简单地每次预测 A 类,您可以达到 90%的准确率,但是这对于您的预期用例来说提供了一个无用的分类器。相反,正确校准的方法可能会实现较低的准确性,但会有更高的真实阳性率(或召回率),这确实是您应该优化的指标。这些场景通常发生在检测环境中,例如在线滥用内容或医疗数据中的疾病标记。

我现在将讨论几种可以用来减轻阶级不平衡的技术。一些技术适用于大多数分类问题,而其他技术可能更适合特定的不平衡水平。在本文中,我将从二元分类的角度来讨论这些问题,但是在大多数情况下,多类分类也是如此。我还假设的目标是识别少数类,否则,这些技术并不是真正必要的。

韵律学

一般来说,这个问题处理的是召回(被如此分类的真正肯定的实例的百分比)和精确度(真正肯定的肯定分类的百分比)之间的权衡。在我们想要检测少数类的实例的情况下,我们通常更关心召回率而不是精确度,因为在检测的上下文中,错过一个肯定的实例通常比错误地标记一个否定的实例代价更高。例如,如果我们试图检测滥用内容,让人工审查者发现内容实际上不是滥用的是微不足道的,但是识别从未被标记为滥用的内容要困难得多。因此,在比较不平衡分类问题的方法时,可以考虑使用准确度以外的指标,如召回率、精确度和 AUROC。在参数选择或模型选择期间切换您优化的度量可能足以提供检测少数类的理想性能。

成本敏感学习

在常规学习中,我们平等地对待所有错误分类,这导致不平衡分类问题,因为识别少数类而不是多数类没有额外的奖励。成本敏感学习改变了这一点,并使用函数 C(p,t) (通常表示为矩阵),该函数指定将类 t 的实例错误分类为类 p 的成本。这使得我们对少数阶级的错误分类的惩罚比对多数阶级的错误分类的惩罚更重,希望这能增加真正的阳性率。为此,一个常见的方案是使成本等于该类构成的数据集比例的倒数。随着班级人数的减少,这增加了惩罚。

Sample cost function matrix

抽样

修复不平衡数据集的一个简单方法是简单地平衡它们,或者通过过采样少数类的实例或者欠采样多数类的实例。这只是允许我们创建一个平衡的数据集,从理论上讲,不应该导致分类器偏向一个类或另一个类。然而,在实践中,这些简单的取样方法有缺陷。对少数进行过采样会导致模型过拟合,因为它会引入重复的实例,从已经很小的实例池中提取。类似地,对大多数进行欠采样可能会遗漏提供两个类之间重要差异的重要实例。

除了简单的过采样或欠采样之外,还有更强大的采样方法。最著名的例子是 SMOTE ,它通过形成相邻实例的凸组合来创建少数类的新实例。如下图所示,它可以有效地在特征空间中的少数点之间绘制直线,并沿着这些直线进行采样。这使我们能够平衡数据集,而不会过度拟合,因为我们创建了新的合成示例,而不是使用副本。然而,这并不能防止所有的过度拟合,因为这些仍然是从现有的数据点创建的。

Visualization of SMOTE

异常检测

在更极端的情况下,在异常检测的上下文中考虑分类可能更好。在异常检测中,我们假设存在数据点的“正态”分布,任何充分偏离该分布的都是异常。当我们将分类问题重新构建为异常检测问题时,我们将多数类视为点的“正常”分布,将少数类视为异常。有许多异常检测算法,如聚类方法、单类支持向量机和隔离森林。

Visualization of clustering method for anomaly detection

结论

希望这些方法的某种组合将允许您创建一个更好的分类器。就像我之前说的,这些技术中的一些更适合不同程度的不平衡。例如,简单的采样技术可以让您克服轻微的不平衡,而异常检测方法可能需要极端的不平衡。最终,对于这个问题,没有一个放之四海而皆准的方法,您只需要尝试每种方法,看看它们如何应用于您的特定用例以及成功的衡量标准。

亲爱的数学,我不是你的治疗师,解决你自己的问题。

原文:https://towardsdatascience.com/dear-math-i-am-not-your-therapist-solve-your-own-problems-da835102dacb?source=collection_archive---------14-----------------------

或者实际上,我会建立一个神经网络来为你解决这些问题。

想象一下一个类似私人数学家教的网站。它可以解方程,甚至指导你解方程,这样你就可以自己解下一个方程了。现在想象一下,有一天你想和你的自动导师不仅通过方程进行交互,还可以使用你的自然语言。

好吧,别再想了。这个名为 Simplisico 的网站已经存在。为了让你能够用你的自然语言与它互动,在这个过程中需要发生的一件事是,Simplisico 将自己理解你实际上试图解决的方程。这就是我来的原因。在这篇文章中,我将分享我是如何创建一个 POC 来应对阅读一个文本数学问题并提取潜在方程的挑战的。

Don’t worry, we don’t really have 42 steps to cover, and you have less than 10 min. of reading ahead of you.

让我们做个计划吧!

在我们进入细节之前,让我们考虑一下我们将如何应对这个挑战。

步骤(1)——当面对一个文本数学问题时,确保问题是用我们能读懂的语言写的。我的意思是,如果问题是用巴斯克语写的,而我不会说巴斯克语,我就必须把问题翻译成我能理解的语言,然后才能尝试解决数学问题。

那么,解决数学任务本身的一个办法,就是:
(2) 【隐藏】带参数的题中数字, 【3】了解方程的结构,
【4】将数字插入正确的地方。

在接下来的部分中,我们将看到我们如何使用现有工具执行步骤 (1)-(2) ,以及我们如何构建一个神经网络来实现步骤 (3)-(4)

预处理——教我们的机器阅读

让我们看看如何使用两个现有工具,分两步将问题翻译成机器能够理解的语言:

首先我做了一个叫 记号化 的东西,把问题中的数字换成变量名,把问题分成单词,去掉标点符号。我使用 NLTK 包轻松做到了这一切。

然后,我做了一件叫做 嵌入 的事情,这意味着我将单词“翻译”成高维空间中的向量,以一种保留它们的语义和句法关系的方式。由于 Gensim 包中的 Word2Vec 算法,这也是一个相当简单的步骤。

让我们想一想目前为止我们获得了什么。假设我的机器已经知道如何解决在公园里数树的问题。现在,如果它也知道公园里的树和解决方案中的步骤之间存在类似的关系,那么当我让它计算解决方案中的步骤时,它将有史以来第一次知道应用它已经知道的相同逻辑来计算树。

所以现在,实际上,我们教会了我们的机器阅读。

让我们继续主要部分,在这里我们讨论将提取基础方程的神经网络。

流行语驱动开发

如果你对神经网络有一点了解(如果没有,你可以阅读我写的这个快速介绍,那么我可以直接告诉你,我为这个任务构建的神经网络是一个具有长短期记忆和注意力的序列排列递归神经网络

该死,这是一个口。

让我们一点一点地了解它。

首先,输入是一个文本数学问题,因此是单词的序列。为什么输出会是一个 排列 ?因为我们期望机器在输入问题中看到的每个数字,都会出现在输出等式中。然后,如果我们知道方程的结构是什么,那么我们就可以把问题简化为寻找输入问题中数字的正确排列。

现在, 递归神经网络【RNN】是指网络中包含某种反馈回路的通用架构。在我们的例子中,网络将一次读取每个单词,这是短期记忆部分,但它也将在它被读取的上下文中读取单词。这是长期记忆的部分。另外,假设我在问题的开头加了一句“我想在 Medium 上写一篇博文”。显然这并没有给我想要解的方程增加任何信息,所以我想让网络知道不要给这类句子太多的关注

最后缺失的部分是我们想要重新引入之前放在一边的数字。我们可以通过输入的数字与上一步的输出连接起来,让它们流经另一层神经元。

使用 Keras 包的一些基本功能可以获得网络架构的所有这些方面。

The internet is full of Lego blocks. We just need to learn how to connect them.

这是所有的乡亲

如果你遵循了这些步骤,瞧,你得到了一个可以阅读文本数学问题并提取潜在方程的算法!

更好的是,你现在知道了一种方法来应对涉及文本理解的挑战。

现在你可以想一想——你想解开什么语言之谜?你如何用你在这里学到的知识来解开这个谜?。

现在是探索这个迷人领域的真正激动人心的时刻,越来越复杂的工具变得越来越容易获得,天空不再是你对现有机制有基本了解就能实现的极限。网上到处都是乐高积木。我们只需要学会如何把它们联系起来。

【观看 这个 来了解更多我在这个项目上的冒险经历。】

数字颠覆中的伦理辩论

原文:https://towardsdatascience.com/debating-ethics-in-the-digital-disruption-f1eb1818c636?source=collection_archive---------5-----------------------

我们正处于也许是历史上最大的社会动荡之中。数字化正在改变我们工作、消费、交流、思考和生活的方式。这是在非常短的时间内完成的。18 世纪的工业革命用了大约 80 年。它导致了大规模的城市化和大规模的技术、经济、社会、社会、环境、地缘战略和政治变革。

数字化在许多方面超越了这一点。它的变化不仅更快,还加速了生命本身。它涉及到我们生活的各个方面。它正在革新生产、信息、移动性等等。

自动驾驶汽车,机器人,人工智能,自动化,社交媒体,都是变革性的。他们将定义我们;他们将定义社会。这是硅谷先驱们的梦想。利用数字化的变革力量让社会变得更好。

然而,这种蓝眼睛的理想主义有一些黑暗的缺点。我们意识到我们的社交媒体构建的信息茧和回音室,这导致了更大的社会两极分化和极端主义。我们知道数字化会影响注意力、记忆力、同理心和态度。我们知道这将影响就业市场。但是,我们不知道它将如何做到这一点,以何种速度和深度,以及它将对我们的社会产生何种元影响。

不同的末日场景正在浮现。在机器人和人工智能(AI)的世界里,以色列历史学家尤瓦尔·诺亚·哈拉里已经在谈论即将到来的“无用阶级”。一类人将生活在没有经济目的的后工作世界。微软研究院(Microsoft Research)首席研究员凯特克劳福德(Kate Crawford)警告称,在一个民族主义日益高涨的世界里,人工智能可能是一个“法西斯梦想”,让专制政权拥有前所未有的指挥和控制能力。英国首席科学顾问马克·沃尔波特爵士也警告说,不要在医学和法律等领域不受控制地使用人工智能,因为人工智能不可能是中立的。AI 是基于人类和人类数据的。这意味着人工智能可以接受我们固有的偏见,放大它们,然后采取行动。

在这场数字革命中,各种伦理问题层出不穷。无人驾驶汽车发生事故或机器人手术出错,谁将承担责任?自动驾驶汽车应该使用什么算法——如果它在交通状况下救了你的命,就开车撞死行人,或者撞车撞死自己,救了行人?在不影响言论自由的情况下,社交媒体需要多大程度的监管来打击假新闻和仇恨言论?机器人应该被禁止从事某些工作吗?是否应该规定最终决策仍必须由人类而非人工智能做出?类似于军事规则,即“杀死决定”必须由人类做出。我们如何分配机器人创造的财富?被机器人取代的工人会怎么样?

正如雷茵霍尔德·尼布尔在他的开创性著作《道德的人和不道德的社会》中指出的那样,问题在于“人类日益增长的智慧似乎增长得不够快,不足以解决技术进步造成的社会问题”。现在是时候就道德和数字技术展开公开辩论了。领先的人工智能公司已经在前进。脸书、亚马逊、谷歌 DeepMind、IBM、苹果和微软,这个由竞争对手组成的邪恶联盟,已经在人工智能方面携手合作,旨在引发更多关于人工智能的公共讨论。为什么会这样?因为这是他们的事。失去公众对这些新技术的信任可能会严重影响他们的业务,烧掉投入人工智能的数十亿美元研究预算。

公众讨论不应该由企业来决定。公共当局有领导责任将此列入政治议程,启动这一讨论并让公民参与其中。一些进展正在发生。英国在艾伦图灵研究所(Alan Turing Institute)成立了一个数据伦理小组,欧盟委员会(European Commission)也尤其值得称赞。与来自 19 个欧盟国家的媒体合作伙伴(如《国家报》、《卫报》、《法兰克福汇报》、《Gazeta Wyborcza》等。)它发起了一系列大规模的互联网咨询,让公民参与调查数字世界对就业、隐私、健康、民主、安全等的影响。

我们需要对数字技术进行伦理讨论,以确保我们为模拟世界制定的保护措施也适用于数字世界。数字化正在塑造和定义我们。但是我们需要成为塑造和定义它的人。以便给我们带来最大的好处和最小的坏处。


有意思?退房www.europecallingblog.com

调试一个用 TensorFlow 和 Keras 编写的机器学习模型

原文:https://towardsdatascience.com/debugging-a-machine-learning-model-written-in-tensorflow-and-keras-f514008ce736?source=collection_archive---------3-----------------------

可能出错的事情,以及如果出错如何诊断。

在本文中,在我调试 TensorFlow 模型的过程中,您可以看到我的身后。我做了很多傻事,所以请不要评价。

Cheat sheet. The numbers refer to sections in this article (https://bit.ly/2PXpzRh)

1ML 模型的目标

你可以在 GitHub 上看到最终(工作)模型。我正在建立一个模型来预测 30 分钟后的闪电,并计划在美国气象学会上向展示它。基本思想是在红外和全球闪电测绘仪(GLM) GOES-16 数据的每个像素周围创建 64x64 图像补片,如果照明图像实际上在 30 分钟后出现在像素周围的 16x16 图像补片内,则将像素标记为“has_ltg=1”。

根据当前的红外和 GLM 数据,以这种方式训练的模型可以用于实时预测 30 分钟后的闪电。

1a。输入函数

我写了一个 convnet 模型,大量借鉴了为 TPU 编写的 ResNet 模型的训练循环,并修改了输入函数(读取我的数据,而不是 JPEG)和模型(一个简单的卷积网络,而不是 ResNet)。

将输入转换为张量的代码的关键位:

parsed = tf.parse_single_example(
    example_data, {
        **'ref'**: tf.VarLenFeature(tf.float32),
        **'ltg'**: tf.VarLenFeature(tf.float32),
        **'has_ltg'**: tf.FixedLenFeature([], tf.int64, 1),
    })
parsed[**'ref'**] = _sparse_to_dense(parsed[**'ref'**], height * width)
parsed[**'ltg'**] = _sparse_to_dense(parsed[**'ltg'**], height * width)
label = tf.cast(tf.reshape(parsed[**'has_ltg'**], shape=[]), dtype=tf.int32)

本质上,每个 TensorFlow 记录(由 Apache 射束管道创建)由 ref、ltg 和 has_ltg 字段组成。ref 和 ltg 是可变长度数组,它们被整形为密集的 64x64 矩阵(使用 tf.sparse_tensor_to_dense)。标签只是 0 或 1。

然后,我将两张解析后的图像叠加在一起:

stacked = tf.concat([parsed[**'ref'**], parsed[**'ltg'**]], axis=1)
**img =** tf.reshape(stacked, [height, width, n_channels])

此时,我有一个张量是[?64,64,2],即一批 2 通道图像。make_input_fn 中输入管道的其余部分(列出文件、通过并行交错读取文件、预处理数据、使形状静态化以及预取)本质上只是从 ResNet 代码复制粘贴而来的。

Stacking the two 4096-length arrays into a 3D tensor of shape (64, 64, 2)

1b。运行代码

我通过在本地以小批量运行训练器几个步骤来开发代码:

gcloud ml-engine local train \
    --module-name=trainer.train_cnn --package-path=${PWD}/ltgpred/trainer \
    -- \
    --train_steps=10 --num_eval_records=512 --train_batch_size=16 \
    --job-dir=$OUTDIR --train_data_path=${DATADIR}/train* --eval_data_path=${DATADIR}/eval*

然后,我使用配有更大 GPU 的大型机器在 Cloud ML Engine 上的更大数据集上运行了它:

gcloud ml-engine jobs submit training $JOBNAME \
    --module-name=trainer.train_cnn --package-path=${PWD}/ltgpred/trainer --job-dir=$OUTDIR \
    --region=${REGION} --scale-tier=CUSTOM --config=largemachine.yaml \
    --python-version=3.5 --runtime-version=1.8 \
    -- \
    --train_data_path=${DATADIR}/train* --eval_data_path=${DATADIR}/eval* \
    --train_steps=5000 --train_batch_size=256 \
    --num_eval_records=128000 

这很有用。我的大部分调试和开发都是通过本地运行来完成的。这样,我可以在不连接的情况下工作,不需要在我的机器上安装 GPU。

2 模型不学习

一旦我写好代码并运行它,我发现这个模型很快就产生了令人怀疑的相同损失:

并达到了一个精度指标,这个指标从公元 1000 年开始就一直保持不变:

'rmse': 0.49927762, 'accuracy': 0.6623125,

2a。非常嫌疑犯

当机器学习模型不会学习时,有几个常见的疑点。我试着改变初始化。默认情况下,TensorFlow 使用 zeros _ initializer[编辑:事实证明我不需要这样做— tf.layers.conv2d 继承自 Keras 的 Conv2D ,它使用与 Xavier 相同的 glorot _ uniform。如何使用 Xavier(它使用小的初始值),并为可重复性设置随机种子?

xavier = tf.contrib.layers.xavier_initializer(seed=13)
*c1 = tf.layers.conv2d(
       convout,
       filters=nfilters,
       kernel_size=ksize,* ***kernel_initializer=xavier,*** *strides=1,
       padding='same',
       activation=tf.nn.relu)*

将梯度从复杂的 AdamOptimizer 改为可靠的备用 GradientDescentOptimizer 如何?

把学习率从 0.01 降到 1e-6 怎么样?

这些都没用,但这是我第一次尝试。

2b。TensorFlow 打印

我的输入函数可能每次都返回相同的数据吗?这就解释了为什么模型被卡住了。我如何知道输入函数正在读入什么?

验证输入函数是否正确的一个简单方法是简单地打印出读取的值。然而,你不能只打印一个张量:

print(img)

这将只是打印出张量的元数据,而不是它的值。相反,您需要在程序执行时评估张量的值:

print(img.eval(sess=...))

即使这样也不行,因为 Estimator API 没有给你一个会话句柄。解决办法就是用 tf。打印:

img = tf.Print(img, [img], "image values=")

这样做的目的是在原始 img 节点和新 img 节点之间插入打印节点,以便在再次使用图像节点之前打印值:

tf.Print() allows you to insert a printing node in the TensorFlow graph so that you can print out the values of a Tensor as the program executes.

2c。张量的打印统计

但是,一旦我这样做了,我只得到前 3 或 4 个值(默认情况下,tf。打印不打印整个张量)它们大部分为零。它们是零,是因为卫星图像往往有很多零,还是因为我的输入管道有一个 bug?简单地打印图像并不是一个好主意。所以,我决定打印出输入的统计数据:

numltg = tf.reduce_sum(labels)
ref = tf.slice(img, [0, 0, 0, 0], [-1, -1, -1, 1])
meanref = tf.reduce_mean(ref, [1, 2])
ltg = tf.slice(img, [0, 0, 0, 1], [-1, -1, -1, 1])
meanltg = tf.reduce_mean(ltg, [1, 2])ylogits = tf.Print(ylogits, 
             [numltg, meanref, meanltg, ylogits], "...")

TensorFlow 中的 reduce_*函数允许您沿轴求和。因此,第一个函数 reduce_sum(labels)计算批次中标签的总和。由于标签是 0 或 1,这个总和告诉我该批中照明示例的数量。

我还想打印反射率和闪电输入图像补丁的平均值。为此,我想对高度和宽度求和,但保持每个示例和通道独立——这就是为什么在 reduce_mean 调用中看到[1,2]。第一个 tf.slice 获取第一个通道,第二个 slice 获取第二个通道(-TF . slice 中的 1 告诉 TensorFlow 获取那个维度中的所有元素)。

还要注意,我已经在 ylogits 的位置插入了 Print 节点,可以打印整个张量列表。这很重要——您必须将 Print()放入图中实际使用的节点。如果我做了:

numltg = tf.Print(numltg, 
             [numltg, meanref, meanltg], "...")

整个分支将被优化掉,因为我的模型实际上并没有在任何地方使用 numltg!

一旦我运行代码,我发现每一批都有一个好的(和不同的)闪光点组合,每一批的平均值看起来有点相似,但每一批都不同。

2d。调整洗牌

虽然这不是我们试图解决的问题,但这种批量方式的相似性是很奇怪的。怀着这种好奇心查看代码,我发现我已经硬编码了一个洗牌大小:

dataset = dataset.shuffle(1024)

将此更改为

dataset = dataset.shuffle(batch_size * 50)

解决了批处理问题。

Because successive patches are highly correlated, it is important to shuffle in a large buffer

问题是,因为数据是从滑动窗口创建的,所以连续的例子往往高度相关,所以我需要在足够大的缓冲区内移动,以便从卫星图像的不同部分(或者更好的是,不同的图像)获得例子。在 ResNet 的案例中,每个训练示例都是完全不同的图像,因此这不是他们关心的问题。复制粘贴再次来袭!

2e。ReLu 削波和饱和

但是回到最初的问题。为什么准确度和 RMSE 卡住了?我在这里运气不错。我不得不插入 tf。Print()在某个地方,所以我进入了一个我知道我需要的节点——在我的模型函数(ylogits)的输出节点上。我还碰巧打印出了 ylogits,瞧……每次输入都是不同的值,ylogits 开始是随机的,但很快就变成了零。

为什么 ylogits 为零?仔细查看 ylogits 的计算,我注意到我写了:

ylogits = tf.layers.dense(
  convout, 1, activation=tf.nn.relu, kernel_initializer=xavier)

哎呀!通过在输出密集层上设置 ReLu 激活函数,我确保了 ylogits 永远不会为负。与此同时,闪电比非闪电更罕见,因此优化器将 ylogits 推到了它所能采取的最小可能值。也就是零。因为 ReLu 在零度以下饱和,所以东西有可能卡在那里。

分类网络的倒数第二层类似于回归网络的最后一层。它必须是:

ylogits = tf.layers.dense(
  convout, 1, **activation=None**, kernel_initializer=xavier)

傻,傻,小虫。发现并修复。咻!

3.NaN 损失

现在,当我运行它,我没有得到一个卡住的准确性指标。更糟。我得了……”南在训练中失利如果有什么会让一个 ML 从业者感到恐惧的话,那就是 NaN 的损失。哦,好吧,如果我能解决这个问题,我会写一篇博文。

NaNs are spooky

与不训练的模型一样,NaN 的损失有几个常见的疑点。尝试自己计算交叉熵损失就是其中之一。但我没有那样做。我计算的损失是:

loss = tf.reduce_mean(
    tf.nn.sigmoid_cross_entropy_with_logits(
        logits=tf.reshape(ylogits, [-1]),
        labels=tf.cast(labels, dtype=tf.float32)))

这应该是数值稳定的。另一个问题是学习率太高。我切换回 AdamOptimizer,尝试设置一个较低的学习率(1e-6)。不去。

另一个问题是输入数据本身可能包含 nan。这应该是不可能的—使用 TFRecords 的好处之一是 TFRecordWriter 不会接受 NaN 值。为了确保万无一失,我回到输入管道,将 np.nan_to_num 添加到将数组插入 TFRecord 的代码段中:

**def** _array_feature(value):value = np.nan_to_num(value.flatten())
  **return** tf.train.Feature(float_list=tf.train.FloatList(value=value))

还是不行。

3a。更简单的深度学习模型

也许有太多的重量?我使模型中的层数可配置,并尝试了不同的层数和更小的内核大小:

*convout = img* **for** layer **in** range(nlayers):
  nfilters = (nfil // (layer+1))nfilters = 1 **if** nfilters < 1 **else** nfilters
  *# convolution* c1 = tf.layers.conv2d(
      convout,
      filters=nfilters,
      kernel_size=ksize,
      kernel_initializer=xavier,
      strides=1,
      padding=**'same'**,
      activation=tf.nn.relu)
  *# maxpool* convout = tf.layers.max_pooling2d(c1, pool_size=2, strides=2, padding=**'same'**)
  **print**(**'Shape of output of {}th layer = {} {}'**.format(
      layer + 1, convout.shape, convout))

outlen = convout.shape[1] * convout.shape[2] * convout.shape[3]
p2flat = tf.reshape(convout, [-1, outlen])  *# flattened* **print**(**'Shape of flattened conv layers output = {}'**.format(p2flat.shape))

还是不行。南的损失依然存在。

3b。回到线性

如果我完全去掉深度学习模型会怎么样?还记得我对输入图像的调试统计吗?如果我们试图训练一个模型,仅基于这些工程特征来预测照明,会怎么样?

halfsize = params[**'predsize'**]
qtrsize = halfsize // 2
ref_smbox = tf.slice(img, [0, qtrsize, qtrsize, 0], [-1, halfsize, halfsize, 1])
ltg_smbox = tf.slice(img, [0, qtrsize, qtrsize, 1], [-1, halfsize, halfsize, 1])
ref_bigbox = tf.slice(img, [0, 0, 0, 0], [-1, -1, -1, 1])
ltg_bigbox = tf.slice(img, [0, 0, 0, 1], [-1, -1, -1, 1])
engfeat = tf.concat([
  tf.reduce_max(ref_bigbox, [1, 2]), *# [?, 64, 64, 1] -> [?, 1]* tf.reduce_max(ref_smbox, [1, 2]),
  tf.reduce_mean(ref_bigbox, [1, 2]),
  tf.reduce_mean(ref_smbox, [1, 2]),
  tf.reduce_mean(ltg_bigbox, [1, 2]),
  tf.reduce_mean(ltg_smbox, [1, 2])
], axis=1)ylogits = tf.layers.dense(
  engfeat, 1, activation=None, kernel_initializer=xavier)

我决定创建两组统计数据,一组在 64x64 的盒子中,另一组在 16x16 的盒子中,并用这 6 个输入特征创建一个逻辑回归模型。

不去。还是南。这非常非常奇怪。一个线性模型应该永远不会过时。从数学上来说,这太疯狂了。

但是就在它结束之前,这个模型达到了 75%的准确率。这太有希望了。但是 NaN 的事越来越让人讨厌了。有趣的是,就在它与 loss = NaN“背离”之前,该模型根本没有背离,亏损一直在下降:

3c。验证损失的输入

四处寻找是否有另一种方法来计算损失,我发现现在有一个方便的函数:

loss = tf.losses.sigmoid_cross_entropy(labels,
  tf.reshape(ylogits, [-1]))

当然,这可能不能解决任何问题,但是最好使用这个函数,而不是自己调用 reduce_mean。但是在这里,让我们添加断言来缩小问题的范围:

**with** tf.control_dependencies([
  tf.Assert(tf.is_numeric_tensor(ylogits),[ylogits]),
  tf.assert_non_negative(labels, [labels]),
  tf.assert_less_equal(labels, 1, [labels])
]):
  loss = tf.losses.sigmoid_cross_entropy(labels,
    tf.reshape(ylogits, [-1]))

本质上,我断言 ylogits 是数值型的,每个标签介于 0 和 1 之间。只有满足这些条件,我才能计算损失。否则,程序应该抛出一个错误。

3d。剪辑渐变

断言不会触发,但是程序仍然以 NaN 丢失结束。在这一点上,似乎很清楚问题不在于输入数据(因为我在那里做了一个 nan_to_num)或我们的模型计算(因为断言不会触发)本身。它可能在反向传播中,可能在梯度计算中?

例如,也许一个不寻常(但正确)的例子会导致意想不到的高梯度幅度。让我们通过剪切梯度来限制这种不寻常示例的影响:

optimizer = tf.train.AdamOptimizer(learning_rate=0.001)
optimizer = **tf.contrib.estimator.clip_gradients_by_norm(
  optimizer, 5)**
train_op = optimizer.minimize(loss, tf.train.get_global_step())

那也没用。

3e。L2 损失

如果有许多非常相似的输入,权重本身可能会爆炸。随着时间的推移,一个输入节点可能会产生非常高的正幅度,而下一个输入节点可能会产生非常高的负幅度。使网络避免这种情况的一种方法是通过在损失函数中增加一个额外项来惩罚高幅度权重:

l2loss = tf.add_n(
  [tf.nn.l2_loss(v) **for** v **in** tf.trainable_variables()])
loss = loss + 0.001 * l2loss

这将获得所有可训练变量(权重和偏差),并根据这些可训练变量的值对损失进行惩罚。理想情况下,我们只惩罚体重(而不是偏见),但这只是为了尝试。

3f。亚当·艾司隆

再多逛逛,我意识到 AdamOptimizer 的文档解释默认的ε值 1e-8 可能有问题。本质上,小的ε值会导致不稳定,即使ε的目的是防止被零除。这回避了为什么这是默认值的问题,但是让我们试试推荐的更大的值。

optimizer = tf.train.AdamOptimizer(
    learning_rate=params[**'**learning_rate**'**], **epsilon=0.1)**

这就把 NaN 推得更远了,但还是失败了。

3g。不同的硬件

另一个原因可能是 CUDA 错误之类的。让我们尝试在不同的硬件上进行训练(用 P100 代替特斯拉 K80 ),看看问题是否仍然存在。

trainingInput:
  scaleTier: CUSTOM
  masterType: complex_model_m_p100

还是不行。

4.重写为 Keras

有时,当留下一个难以解决的 bug 时,最好尝试用一种完全不同的方式重写模型。

Let’s start again

所以,我决定用 Keras 重写模型。这也给了我学习 Keras 的机会,这是我一直想做的事情。用柠檬做柠檬汁之类的。

4a。CNN 与 Batchnorm

在 Keras 中,用 batchnorm 创建 CNN(这将有助于保持范围内的渐变)非常容易。(谢谢你,弗朗索瓦)。简单到我到处都放了 batchnorm。

img = keras.Input(shape=[height, width, 2])
cnn = keras.layers.BatchNormalization()(img)
**for** layer **in** range(nlayers):
  nfilters = nfil * (layer + 1)
  cnn = keras.layers.Conv2D(nfilters, (ksize, ksize), padding=**'same'**)(cnn)
  cnn = keras.layers.Activation(**'elu'**)(cnn)
  cnn = keras.layers.BatchNormalization()(cnn)
  cnn = keras.layers.MaxPooling2D(pool_size=(2, 2))(cnn)
  cnn = keras.layers.Dropout(dprob)(cnn)
cnn = keras.layers.Flatten()(cnn)
ltgprob = keras.layers.Dense(10, activation='sigmoid')(cnn)

还要注意,最后一层直接增加了一个 s 形激活。没有必要在逻辑上浪费时间,因为优化为我们解决了数字问题:

optimizer = tf.keras.optimizers.Adam(lr=params[**'learning_rate'**])
model.compile(optimizer=optimizer,
              loss=**'binary_crossentropy'**,
              metrics=[**'accuracy'**, **'mse'**])

不错!

不幸的是(你现在知道了),我还是得了 NaNs!

啊。好吧,回到起点。让我们在喀拉斯做所有在 TensorFlow 做过的事情。

4b。Keras 中的特征工程

第一步是忘掉所有这些深度学习的东西,建立一个线性模型。你是怎么做到的?我有一个图像。我需要做特征工程,送到密集层。在 Keras 中,这意味着我必须编写自己的层来完成功能工程:

**def** create_feateng_model(params):
  *# input is a 2-channel image* height = width = 2 * params[**’predsize’**]
  img = keras.Input(shape=[height, width, 2])

  engfeat = keras.layers.Lambda(
    **lambda** x: engineered_features(x, height//2))(img)

  ltgprob = keras.layers.Dense(1, activation=**’sigmoid’**)(engfeat)

  *# create a model* model = keras.Model(img, ltgprob)

engineered_features 与之前的 TensorFlow 函数完全相同!关键思想是,要将 TensorFlow 函数包装到 Keras 层中,可以使用 Lambda 层并调用 TensorFlow 函数。

4c。打印图层

但是我想打印出图层,以确保流过的数字是正确的。我该怎么做?tf。Print()不行,因为,嗯,我没有张量。我有 Keras 层。

嗯,tf。Print()是一个张量流函数,因此,使用相同的 Lambda 层技巧:

**def** print_layer(layer, message, first_n=3, summarize=1024):
  **return** keras.layers.Lambda((
    **lambda** x: tf.Print(x, [x],
                      message=message,
                      first_n=first_n,
                      summarize=summarize)))(layer)

然后可以调用它作为:

engfeat = print_layer(engfeat, **"engfeat="**)

4d。剪裁渐变

在 Keras 中裁剪渐变?轻松点。每个优化器都支持 clipnorm。

optimizer = tf.keras.optimizers.Adam(lr=params[**'learning_rate'**],
                                     clipnorm=1.)

嘿,我喜欢 Keras 这个东西——它给了我一个漂亮、简单的 API。此外,它与 TensorFlow 很好地互操作,在我需要的时候给我低级别的控制。

NaN is still there, slurping my milkshake

哦,对了。我仍然有南的问题

5.揭露数据

最后一件事,我有点忽略了。NaN 问题也可能由未缩放的数据引起。但是我的反射率和闪电数据都在范围[0,1]内。所以,我根本不需要缩放。

尽管如此,我还是闲着没事。不如我把图像数据归一化(减去均值,除以方差),看看有没有帮助。

Yes, I’m clutching at straws now

为了计算方差,我需要遍历整个数据集,所以这是 Beam 的工作。我可以用张量流变换来做这个,但是现在,让我用 Beam 来破解它。

5a。混洗波束中的训练数据

既然我正在重写我的管道,我也可以一劳永逸地解决洗牌的问题(见第 2d 节)。增加洗牌缓冲区大小是一个黑客。我真的不想按照创建图像补丁的顺序写入数据。让我们随机排列 Apache Beam 中图像补丁的顺序:

*# shuffle the examples so that each small batch doesn't contain
# highly correlated records* examples = (examples
    | **'{}_reshuffleA'**.format(step) >> beam.Map(
        **lambda** t: (random.randint(1, 1000), t))
    | **'{}_reshuffleB'**.format(step) >> beam.GroupByKey()
    | **'{}_reshuffleC'**.format(step) >> beam.FlatMap(**lambda** t: t[1]))

本质上,我给每个记录分配一个随机键(1 到 1000 之间),按随机键分组,删除键并写出记录。现在,连续的图像补片不会一个接一个地跟随。

5b。计算阿帕奇波束的方差

如何计算阿帕奇波束的方差?我像往常一样,在 StackOverflow 上搜索一些我可以复制粘贴的东西。不幸的是,我只找到了一个没有答案的问题。哦,好吧,认真编写一个定制的合并器:

import apache_beam as beam
import numpy as npclass MeanStddev(beam.CombineFn):
  def create_accumulator(self):
    return (0.0, 0.0, 0) # x, x^2, countdef add_input(self, sum_count, input):
    (sum, sumsq, count) = sum_count
    return sum + input, sumsq + input*input, count + 1def merge_accumulators(self, accumulators):
    sums, sumsqs, counts = zip(*accumulators)
    return sum(sums), sum(sumsqs), sum(counts)def extract_output(self, sum_count):
    (sum, sumsq, count) = sum_count
    if count:
      mean = sum / count
      variance = (sumsq / count) - mean*mean
      # -ve value could happen due to rounding
      stddev = np.sqrt(variance) if variance > 0 else 0
      return {
        'mean': mean,
        'variance': variance,
        'stddev': stddev,
        'count': count
      }
    else:
      return {
        'mean': float('NaN'),
        'variance': float('NaN'),
        'stddev': float('NaN'),
        'count': 0
      }

[1.3, 3.0, 4.2] | beam.CombineGlobally(MeanStddev())

请注意这里的工作流程——我可以在一系列数字上快速测试它,以确保它正常工作。

然后,我去给 StackOverflow 添加了答案。也许我需要的只是一些好的因果报应…

5b。写出平均值、方差

然后,我可以转到我的管道代码并添加:

**if** step == **'train'**:
  _ = (examples
    | **'get_values'** >> beam.FlatMap(
        **lambda** x : [(f, x[f]) **for** f **in** [**'ref'**, **'ltg'**]])
    | **'compute_stats'** >> beam.CombinePerKey(MeanStddev())
    | **'write_stats'** >> beam.io.Write(beam.io.WriteToText(
        os.path.join(options[**'outdir'**], **'stats'**), num_shards=1))
  )

本质上,我提取 example['ref']和 example['ltg']并创建元组,然后按键对其进行分组。然后,我可以计算整个数据集上这两幅图像中每个像素的平均值和标准差。

一旦我运行了管道,我就可以打印结果统计数据:

gsutil cat gs://$BUCKET/lightning/preproc/stats*('ltg', {'count': 1028242, 'variance': 0.0770683210620995, 'stddev': 0.2776118172234379, 'mean': 0.08414945119923131})('ref', {'count': 1028242, 'variance': **masked**, 'stddev': 0, 'mean': masked})

蒙面?@#\(@#\)@#是什么意思?原来掩码数组是一个特殊的数字东西。被屏蔽的值不是 NaN,所以如果用 Numpy 处理它们,nan_to_num()不会对它做任何事情。另一方面,它看起来是数值,所以我所有的张量流断言都不成立。带有屏蔽值的数值运算会产生屏蔽值。

Masked? What the @#@$#@ does masked mean?

屏蔽值就像 NaN 一样——它们会从房间的另一端啜饮你的奶昔,但是常规的 numpy 和 TensorFlow 库方法对屏蔽一无所知。

5c。更改屏蔽值

由于屏蔽只发生在反射率网格中(我自己通过积累闪电创建闪电网格),我必须在读取后将屏蔽值转换成一个好的数字

ref = goesio.read_ir_data(ir_blob_path, griddef)
ref = np.ma.filled(ref, 0) *# mask -> 0*

现在,当我重新运行管道时,我得到了合理的值:

('ref', {'count': 1028242, 'variance': 0.07368491739234752, 'stddev': 0.27144965903892293, 'mean': 0.3200035849321707})('ltg', {'count': 1028242, 'variance': 0.0770683210620995, 'stddev': 0.2776118172234379, 'mean': 0.08414945119923131})

这些都是小数字。不应该有任何缩放的理由。因此,让我们在解决掩蔽问题的情况下进行训练。

这一次,没有楠。相反,程序崩溃,日志显示:

Filling up shuffle buffer (this may take a while): 251889 of 1280000
The replica master 0 ran out-of-memory and exited with a non-zero status of 9(SIGKILL)

5d。减小混洗缓冲区大小

副本零是输入管道(读取数据发生在 CPU 上)。为什么它要一次将 1280000 条记录全部读入 shuffle 缓冲区?

现在,输入数据已经被我的光束/数据流很好地混洗了,我甚至不需要那么大的混洗缓冲区(以前是 5000,见 2d 部分):

dataset = dataset.shuffle(batch_size * 50) *# shuffle by a bit*

12 分钟后,训练以 83%的准确率结束。!!).哪儿都没有 NaNs。

吼吼!

5e。连接模型

请记住,我们只做了一个由工程特征组成的线性模型。让我们并行添加回 convnet。想法是连接两个密集层,这样我的模型架构可以包含 CNN 层和特征工程:

A combined model would be great

这是如何在 Keras 中做到这一点的,其中加入了一些 batchnorm 和 dropouts,因为它们很容易添加:

cnn = keras.layers.BatchNormalization()(img)
**for** layer **in** range(nlayers):
  nfilters = nfil * (layer + 1)
  cnn = keras.layers.Conv2D(nfilters, (ksize, ksize), padding=**'same'**)(cnn)
  cnn = keras.layers.Activation(**'elu'**)(cnn)
  cnn = keras.layers.BatchNormalization()(cnn)
  cnn = keras.layers.MaxPooling2D(pool_size=(2, 2))(cnn)
cnn = keras.layers.Flatten()(cnn)
cnn = keras.layers.Dropout(dprob)(cnn)
cnn = keras.layers.Dense(10, activation=**'relu'**)(cnn)

*# feature engineering part of model* engfeat = keras.layers.Lambda(
  **lambda** x: engineered_features(x, height//2))(img)

*# concatenate the two parts* both = keras.layers.concatenate([cnn, engfeat])
ltgprob = keras.layers.Dense(1, activation=**'sigmoid'**)(both)

现在,我有 85%的准确率。这仍然是一个小数据集(只有 60 天的卫星数据),这可能是深度学习路径没有增加那么多价值的原因。所以,我会回去生成更多的数据,训练更长的时间,在 TPU 上训练等等。

但是这些事情可以等。现在,我要去庆祝了。

十二月版

原文:https://towardsdatascience.com/december-edition-80d8992a0fc?source=collection_archive---------15-----------------------

我们今年阅读量最大的帖子

Join us as an Editorial Associate

我们希望你有一个伟大的一年。在 2018 年最后一期月刊中,我们为您带来了本年度从到数据科学的最热门帖子。如果您最近加入了我们的行列,或者已经阅读了我们的文章很长一段时间,我们将为您带来我们最新的编辑精选:

1.帮助您解开关键概念的谜团,了解更多关于数据科学的知识

2.鼓励您与我们一起发布或加入我们的数据科学社区

3.帮助您在工作场所、下一次黑客马拉松或大学中应用数据科学

James Le 发布 2018 年,概述面向初学者的机器学习 10 大算法。2 月 Nicklas Donges 带我们踏上了一段随机森林和决策树的旅程,而 Susan Li 演示了如何使用 Python 中的 SciKit-Learn 库进行多类文本分类。今年 3 月, Jonny Brooks-Bartlett 的讨论了“现实与期望”,提到了为什么这么多数据科学家离职。

Eugenio culrciello在四月为我们带来了递归神经网络的兴衰。5 月,詹姆斯·洛伊用一篇精彩的介绍使用 Python 构建神经网络的文章引起了希拉里·梅森的转发,并且在西蒙·格林曼的文章中比较了最佳人工智能芯片和人工智能平台云解决方案。最近在 7 月, Michael Galarnyk 的关于如何构建一个伟大的数据科学组合的文章激励了我和数据科学界的许多人。

2018 年还剩下四周,我们希望这些文章真的像一瓶香槟一样“流行”,因为无论你在世界的哪个角落,都欢迎你的新年——我们要求你再次或第一次阅读这些文章。一定要把它们收藏起来,以备将来参考,并在朋友和同事之间分享这些文章。分享就是关爱!

Wendy Wong ,TDS 编辑。

这就是这么多数据科学家离职的原因

Jonny Brooks-Bartlett — 8 分钟阅读

是的,我是数据科学家,是的,你确实没看错标题,但总得有人说出来。我们读到了很多关于数据科学是 21 世纪最性感的工作,以及作为数据科学家可以赚到诱人的钱的故事,这似乎是绝对的梦想工作。

机器学习新手的 10 大算法之旅

由詹姆斯·勒 — 11 分钟读完

在机器学习中,有一个叫做“没有免费的午餐”的定理。简而言之,它指出没有一种算法对每个问题都是最好的,并且它特别适用于监督学习(即预测建模)。

数据科学家需要了解的 5 种聚类算法

由乔治·赛义夫 — 11 分钟读完

聚类是一种涉及数据点分组的机器学习技术。给定一组数据点,我们可以使用聚类算法将每个数据点分类到特定的组中。

如何用 Python 从零开始构建自己的神经网络

由詹姆斯·洛伊 — 6 分钟读完

作为我个人更好地理解深度学习之旅的一部分,我决定在没有 TensorFlow 这样的深度学习库的情况下,从头构建一个神经网络。我认为,理解神经网络的内部工作对任何有抱负的数据科学家都很重要。

随机森林算法

尼克拉斯·东格斯 — 8 分钟阅读

随机森林是一种灵活、易于使用的机器学习算法,即使没有超参数调整,在大多数情况下也能产生很好的结果。它也是最常用的算法之一,因为它简单,而且可以用于分类和回归任务。

RNN/LSTM 的陷落

通过Eugenio culrciello—9 分钟阅读

我们爱上了循环神经网络(RNN)、长短期记忆(LSTM)及其所有变体。现在是时候放下它们了!

如何构建数据科学产品组合

由迈克尔·加拉尼克 — 17 分钟读完

数据科学怎么找工作?了解足够的统计学、机器学习、编程等知识以便能够找到工作是很困难的。我最近发现的一件事是,相当多的人可能拥有找工作所需的技能,但没有作品集。

使用 Scikit-Learn 进行多类文本分类

苏珊李 — 11 分钟读完

文本分类在商业领域有很多应用。例如,新闻故事通常是按主题组织的;内容或产品通常按类别进行标记;用户可以根据他们在网上谈论产品或品牌的方式进行分类…

超参数调整 Python 中的随机森林

购买威廉·科尔森 — 12 分钟阅读

因此,我们建立了一个随机森林模型来解决我们的机器学习问题(也许通过遵循这个端到端指南),但我们对结果并不太满意。我们有什么选择?

我们也感谢最近加入我们的所有伟大的新作家,瓦伦蒂诺·康斯坦蒂努杰森·张硕奥斯卡·奈格艾琳娜·尼西奥蒂约翰·布朗林约翰·哈特奎斯特梅兰妮·曾亚当·拉德兹谢夫斯基艾丹·莫里森罗曼·博蒙特 萨拉·沃尔夫潘卡杰·马图尔萨比亚萨奇·萨胡阮·范德梅尔韦伊拉·科恩MJ·巴赫马尼乌里·梅尔哈夫阿米蒂·拉蒂梁兆兵罗伯特·桑多, 我们邀请你看看他们的简介,看看他们的工作。

12 月版:深度学习

原文:https://towardsdatascience.com/december-edition-deep-learning-5aa3d480e49?source=collection_archive---------7-----------------------

9 篇必读文章

人工智能从业者需要应用的 10 种深度学习方法

詹姆斯·勒 — 13 分钟读完。

过去十年,对机器学习的兴趣激增。你几乎每天都能在计算机科学项目、行业会议和《华尔街日报》上看到机器学习。

订阅我们即将推出的作家快讯 !我们的目标是更好地支持我们的作者,让他们能够进一步参与我们出版物的发展。

理解神经网络中的目标函数

Lars Hulstaert — 9 分钟读取。

这篇博文的目标读者是有机器学习经验的人,他们希望对用于训练神经网络的不同目标函数有更好的直觉。

揭开“EM 路由矩阵胶囊”的神秘面纱第 1 部分:概述

通过 Sahaj Garg — 13 分钟读取。

最近,深度学习之父之一杰弗里·辛顿(Geoffrey Hinton)发布了一种革命性的计算机视觉架构:胶囊网络,在机器学习界掀起了波澜。

神经网络的软介绍

舒邦德赛 — 9 分钟读完。

在过去的几年里,神经网络已经成为机器学习的同义词。最近,我们已经能够制造神经网络,它可以产生栩栩如生的面孔,转移动态艺术风格,甚至可以按年“老化”一个人的照片。

应用深度学习 ( 第一部分第二部分第三部分第四部分)

Arden Dertat — 23 分钟读取。

欢迎来到应用深度学习教程系列。我们将从人工神经网络(ANN)开始,特别是前馈神经网络,对几种深度学习技术进行详细分析。

一种新型深度神经网络

通过Eugenio culrciello—7 分钟阅读。

又有新一波深度神经网络来了。它们是前馈模型的发展,我们之前详细分析过。

参加 Deeplearning.ai 课程后的感想

通过 Arvind N — 8 分钟读取。

在全职工作和家里蹒跚学步的孩子之间,我用业余时间学习认知科学和人工智能的思想。偶尔会出现一篇很棒的论文/视频/课程,你会立刻被吸引住。

深度网络架构的直观指南

Joyce Xu — 9 min 阅读。

在过去的几年里,计算机视觉深度学习的许多进展都可以归结为少数几个神经网络架构。

深度学习之美背后的秘密酱:激活功能初学者指南

Mate Labs — 7 分钟读取。

激活功能是获取输入信号并将其转换为输出信号的功能。激活函数将非线性引入网络,这就是为什么我们称之为非线性。

我们也感谢最近加入我们的所有伟大的新作家,萨哈吉·加尔格克里斯·道塞特佩曼·泰伊蒂尔塔杰约蒂·萨卡尔克莱尔·莱萨奇贾斯汀·盖奇鲍里斯·安德亚贾斯帕·麦克切斯尼德瓦尔·沙阿瑞安 安东尼·雷佩托本·韦伯杰卡特琳娜·科卡特朱哈菲利克斯·莫尔乔治·克拉萨达基斯等等很多人。 我们邀请你看看他们的简介,看看他们的工作。

确定 CNN 的最佳核大小

原文:https://towardsdatascience.com/deciding-optimal-filter-size-for-cnns-d6f7b56f9363?source=collection_archive---------2-----------------------

卷积神经网络(CNN)是从像图像这样的数据点中自动提取有用特征(无需手动调整)以解决像图像分类或对象检测这样的给定任务的神经网络。现在您已经了解了它们在您的数据集上的用途,您开始想知道:除了调整您的网络的各种超参数之外,我如何知道什么是适合网络的内核大小?让我们进一步挖掘!

让我们设定一些共同的基本规则,以便在整个讨论过程中保持在同一平台上:

  • 我们将主要研究图像上的 2D 卷积。这些概念也适用于 1D 和三维卷积,但可能不直接相关。
  • 像 3x3 这样的 2D 卷积滤波器在尺寸上将总是具有第三维。第三维等于输入图像的通道数。例如,我们对灰度图像(具有 1 个黑白通道)应用 3x3x1 卷积滤镜,而对彩色图像(具有 3 个通道,红色、蓝色和绿色)应用 3x3x3 卷积滤镜。
  • 在接下来的讨论中,我们假设零填充。

在卷积中,卷积滤波器滑过图像的所有像素,取它们的点积。我们这样做是希望卷积滤波器加权的像素的线性组合能够从图像中提取某种特征。记住这些事情就完成了:

  • 图像中大多数有用的特征通常是局部的,一次取几个局部像素来应用卷积是有意义的。
  • 这些有用的特征中的大多数可以在图像中的不止一个地方找到。因此,在整个图像上滑动单个核是有意义的,希望使用相同的核在图像的不同部分提取该特征。
  • 此外,使用小内核而不是完全连接的网络的额外好处是受益于重量共享和计算成本的降低。简单解释一下这一点,因为我们对图像中的不同像素组使用相同的核,所以当我们对这些像素组进行卷积时,在这些像素组之间共享相同的权重。并且由于权重的数量少于完全连接的层,我们可以反向传播的权重较少。

既然我们已经将卷积滤波器大小作为可供选择的超参数之一,那么就需要在更小或更大的滤波器大小之间做出选择。让我们快速比较两者,选择最佳滤波器尺寸:

Comparing smaller and larger convolutional kernel sizes theoretically.

现在,我们对使用不同尺寸的提取有了一些了解,接下来我们将针对小尺寸(3x3)和大尺寸(5x5)滤波器使用卷积示例:

Comparing smaller and larger convolutional kernel sizes using a 3x3 and a 5x5 example.

基于上面的比较,我们可以得出结论,较小的内核比较大的内核更受欢迎。

此外,您可能会注意到,与 2x2 或 4x4 内核大小相比,奇数内核大小更受青睐。解释如下:

对于奇数大小的过滤器,所有先前层像素将对称地围绕输出像素。如果没有这种对称性,我们将不得不考虑在使用均匀大小的内核时发生的跨层失真。因此,为了提高实现的简单性,甚至大小的内核过滤器也大多被跳过。如果你认为卷积是从给定像素到中心像素的插值,我们不能使用偶数大小的滤波器插值到中心像素。

因此,一般来说,我们希望使用更小的奇数大小的内核过滤器。但是,由于提取的特征是细粒度的和局部的,没有来自相邻像素的信息,因此从候选最佳滤波器尺寸列表中排除了 1x1。此外,它并没有真正做任何有用的特征提取!

因此,3x3 卷积滤波器通常工作正常,并且经常是流行的选择!

原载于 2018 年 8 月 19 日【icecreamlabs.com】

通过数据可视化解读印度:印度教育系统

原文:https://towardsdatascience.com/deciphering-india-through-data-visualization-indian-education-system-f4f50f37bc04?source=collection_archive---------8-----------------------

tldr;我为什么这么做,我发现了什么?

当我开始我的数据科学之旅时,我一直知道我想研究具有社会影响的数据。为了给我的第一个项目寻找主题,我开始阅读大量的研究论文、项目、报纸文章并搜索相关数据。这就是我如何阅读 ASER 教育报告并了解 DISE 出版物的。当我调查这些数据时,各种各样的问题突然出现在我的脑海里,“学习水平如何?”、“有百分之多少的孩子不去上学?”、“私立学校的入学率是多少”、“女孩的入学率如何?”、‘学校基础设施的状况如何?’,‘参数是如何随时间变化的?’、'各州之间相比如何?'等等。所以,我决定用它来进行分析,并通过 4d 可视化来探索数据。为什么是 4d 可视化?因为它实现了多维度的探索和比较。

我的发现总结如下:

如果你觉得这个有趣就继续读下去……

阿塞尔和 DISE 前来救援

年度教育状况报告(ASER)是一项年度调查,自 2005 年以来报告了儿童的学校教育状况以及他们完成基本阅读和算术任务的能力。在非政府组织 Pratham 的协助下,这项调查由来自印度几乎所有农村地区的当地伙伴组织的志愿者进行。

地区教育信息系统(DISE)收集全国所有学校的入学率、基础设施、教师和其他可用设施的信息。该数据库由国立教育规划和管理大学开发和维护。自 2002 年以来,DISE 报告每年出版一次。

准备破译

数据分析参数有哪些?我选择了 2007 年到 2016 年间的 DISE 和 ASER 数据。DISE 提供了有关入学率、基础设施、学生教师比率和学生教室比率的信息。学习水平、学校类型和校外信息来自 ASER。基于与研究的相关性和随时间的一致性来选择参数。与教学语言和教师有关的参数可以在今后的研究中加以考虑。

R,d3 和酒窝太棒了!使用 R 编程语言进行数据探索和准备,R 编程语言是一种用于统计计算和图形的开源软件。用于 4d 可视化的气泡图是使用 d3 和 dimple javascript 库开发的。事实证明,它们与分析非常相关,非常有用

解冻数据到合适的级别: State 这里是分析的单位。汇总函数用于检测异常值和缺失值。认为没有必要进行异常值处理,并且删除具有缺失值的行。ASER 为新成立的特伦甘纳邦和安得拉邦提供综合信息,而 DISE 则提供单独的数据。这两个州的 DISE 数据已经使用平均值合并。

数据结构:在本研究使用的变量中,除总入学人数、家长教师比例和学校教室比例外,所有值均为百分比。每个州的区域是通过将州到区域映射文件与包含 DISE 和激光数据的文件合并而得到的。

可视化效果如何?

为动态 4d 可视化提供了选择下拉框。气泡图中的每个维度都有一个选择下拉框。

更改“选择”下拉列表中的选项会更新相应的轴。x 轴、y 轴和大小下拉框具有与入学、基础设施和学习水平信息相关的相同选项。颜色下拉菜单有两个选项“州”和“地区”。“州”选项为每个州显示不同的颜色,“地区”选项为该州所属的每个地区显示一种颜色。这有助于按州和地区分析信息。故事板设置为“年”。随着一年中的每一个分笔成交点,图表都会更新以显示该年的信息。播放\暂停按钮控制动画。

我发现了什么?

私立学校招生人数大增

尽管大多数儿童(5-16 岁)继续在公立学校接受教育,但近年来私立学校的入学率也在上升,尽管它们的学费很高。即使在像 Uttara Pradesh 这样人口众多且落后的邦,2016 年私立学校的入学率也在 50%左右。这是什么原因呢?是因为设施和老师比官校好吗?

学生教师比率和学生课堂比率正在下降

每名教师的学生人数(PTR)和一个教室的学生人数(SCR)正在下降。这是否意味着学校的数量在增加?私立学校有助于降低比率吗?

厕所、饮水设施等学校基础设施正在改善

大多数州在提供这些设施方面达到了 100%,尽管这些设施的状况可以作为另一项研究的主题。值得注意的是,2009 年生效的《实时教育法》所产生的补助金在改善这些设施方面发挥了作用。

那么,学习水平一点点提高了?

绝对不行!典型的例子是相邻的北方邦和比哈尔邦,这两个地方人口众多,社会经济落后。虽然 Uttara Pradesh 的私立学校入学率接近 50%,但比哈尔邦远远落后,只有 10%左右。但就学习水平而言,两者的表现同样糟糕,2016 年约有 20%的儿童(5-16 岁)无法阅读,类似数量的儿童无法识别数字。那么,影响学习水平的其他因素是什么呢?

自 2012 年以来学习水平急剧下降

自 2012 年以来,大多数州都显示出不能阅读和做数学的儿童(5-16 岁)的比例显著增加。与此同时,能够做除法(最高水平的数学测试)和阅读 std 2 文本(最高水平的阅读测试)的儿童(5-16 岁)的百分比也有所下降。是什么引发了 2012 年以来的这种下跌?

私立学校招生是唯一的地区性趋势

有趣的是,在数据分析参数中没有区域趋势。唯一的例外是私立学校的入学人数。在东部的比哈尔邦、恰尔肯德邦、奥里萨邦和西孟加拉邦,私立学校的入学率很低。私立学校入学率最高的是北部的北方邦、旁遮普邦和哈里亚纳邦。

女孩入学率保持稳定,没有区域障碍

另一个有趣的方面是女孩的入学率自 2007 年以来一直保持稳定。大多数州的女生入学率在总入学率的 45%到 48%之间。一个国家在经济和社会方面的落后并没有影响这个百分比。即使是女生比例较低的邦,如哈里亚纳邦和拉贾斯坦邦,女生入学率也超过了总入学率的 45%。

5%的儿童(5-16 岁)失学

大约 5%的儿童(5-16 岁)没有上学。自 2007 年以来一直保持稳定。他们根本没去上学吗?如果他们以前在学校,是在哪个阶段辍学的?如果不在学校,他们做什么?

结论

我列出了一些我觉得有趣的观察结果。你能找到更多吗?请访问我的 github 页面进行可视化。

总之,学习水平是衡量一个国家教育系统健康状况的最重要的标准。从数据来看,很明显印度做得不是特别好。尽管 2009 年实施了《实时教育法》,中产阶级不断壮大,补助金和其他资源也有所增加。这是什么原因呢?教师的质量影响结果吗?社会经济因素在起作用吗?成人识字和城市化怎么样?

我一定会带着进一步的更新回来..继续检查。

作为随机漫步的决策

原文:https://towardsdatascience.com/decision-making-as-a-random-walk-6ed37e154633?source=collection_archive---------26-----------------------

Monte Carlo Simulation from Numex Exchange.

我做的每一个决定都是正确的吗?大概不会。当我承认自己会做出错误的决定时会发生什么——我如何利用这些知识来提高我的效率?这篇文章是关于决策是一个随机过程意味着什么,以及如何利用这些知识做得更好。

如果你将一枚公平的硬币抛 10000 次,每次它出现时正面你向前迈一步,而反面你后退一步——你预计能走多远?碰巧,不是很远。

但是假设这个硬币是不公平的——它的重量使得它有 65%的机会正面朝上。你希望这次能走多远?概率告诉我们你平均前进了 3000 步。20%上来个头?倒退六千步。

Random walk position simulation with forward p=0.65 with steps=10000; graphic from WolframAlpha.

这和决策有什么关系?嗯,去年我发了 10,487 封邮件。每一封电子邮件都可以被视为抛硬币,目的是推动我的组织向前发展。每封电子邮件也是一个决定:区分特性的优先级,跟踪构建的交付,起草 RFP 回复。

并非所有的决定都是平等的。在这里,我将讨论影响决策的不同因素,并检查它们的影响。然后,我将利用这种影响来展示决策成功不是二元的,并展示我们可以改进决策的不同方式。

首先,我将回顾以下因素:

  • 正确决策的概率
  • 决策速度
  • 决策的规模或范围

正确决策的概率

这相当简单——如果你更频繁地做出正确的决定,你会在随机漫步中走得更远。如果你不经常做出正确的决定,你会变得更不积极,甚至倒退(并且偏离你的公司目标)。

Random walk position simulation with forward p=0.65 (left) and p=0.75 (right) with steps=10000; graphics from WolframAlpha.

然而,差异的大小相当重要。决策成功增加 10 个百分点——从 65%增加到 75% —会导致向前多走 2000 步。在这种情况下,净收益增加了 40%。因此,作为一名经理,专注于改善下属的决策可以带来巨大的回报——尤其是在表现较差的员工中。甚至可以改善决策的专业指导、高管教育和研讨会也可能值得 40%的净投资回报率。

同样,做出更糟糕的决定也同样有害。与最初的 65%相比,55%的决策成功率减少了 2,000 步的净前进步骤,导致总体结果减少了 67%,这相当具有破坏性。

决策速度

现在让我们看看决策的速度。让我们想象一下,我们做决定的速度慢了 10%,所以除了一个不愉快的收件箱,我们最终只做了 9000 个决定,而不是 10000 个。

Random walk position simulation with forward p=0.65 with steps=10000 (left) and steps = 9000 (right); graphics from WolframAlpha.

决策速度下降 10%会导致前进的步伐减少 250 步,或者前进的步伐减少 8.3%。速度没有产生如此显著影响的原因是,你不仅做出的正确决定更少,因此不会走得更远,而且做出的错误决定也更少,因此不会如此显著地阻碍进步。

Accuracy (left) versus precision (right). ThoughtCo.

另一个变化不大的因素是标准偏差——采用 9,000 步而不是 10,000 个导联,预期结果的偏差会小 5%左右。这可以被忽略,因为决策倾向于关注准确性而不是精确性。毕竟,获得精确的、平庸的结果通常不如分散的、积极的结果令人满意。

决策的规模

考察决策规模的最后一个因素是通过影响力来衡量的。为了模拟这一点,我们增加了步长——一个两倍重要的正确决定会让我们前进两步,而不是一步,但一个错误的决定会让我们后退两步。

Random walk position simulation with forward p=0.65 with steps=10000 and step size = 2; graphic edited, original from WolframAlpha.

当步长增加一倍时,我们的预期结果也会增加一倍,在这个场景中,从 3,000 步增加到 6,000 步。然而,如果你的预期结果是负的(比如如果 p=0.45),那么你就是双倍的结果,并且会进一步亏损。

有趣的是,步长的增加使标准差保持不变,所以你改变了结果,而精度没有任何变化。

综合

既然我们已经检查了影响随机漫步的因素,那么关键的要点是什么呢?

  • 做出正确的决定比快速做出决定重要得多。因此,总的来说,花时间仔细考虑事情并做出正确的决定比做出更多的决定更有益。
  • 重大决策会对你的结果产生巨大的影响,但不会牺牲精确性。如果我们认为精确度是风险的代表,那么做出更少、更重要的决定对结果更有利。
  • 综合这些因素,要最大限度地提高性能,最重要的是做出高影响决策,但低影响决策可能可以忽略不计。因此,能够识别哪些决策可能具有最大的影响,从而能够花时间专注于做出正确的决策是有价值的。

我们应该如何利用这些要点来改进我们的决策?

  1. 快速确定哪些决策是最重要的,并专注于这些决策,指派你的最佳决策者。
  2. 可能很快就能做出的小决定是委派的好对象。这为团队成员提供了在迭代过程中实践和决策的机会。随着时间的推移,反馈循环和教育是改善结果的关键。
  3. 需要长时间的小决定应该妥协。举个例子,一个普通的产品经理可能会花费大量低效的时间来回答关于产品调色板的小决定——抛硬币会造成多大的伤害?或者,在你的组织中寻找快速做出这些决定的能力——在这个例子中,让一个 UI 设计师来负责这个决定可能会提高决策的速度,从而提高结果。
  4. 对决策过程进行时间限制,以避免浪费时间对决策结果做出微不足道的改进。最终,花费两倍的时间来提高微小的成功概率会成为一种浪费。

我们可以随机地思考决策吗?我们工作的其他哪些方面可以并且应该重新思考?请在下面的评论中告诉我你的想法!

决策树:一种像人脑一样工作的算法

原文:https://towardsdatascience.com/decision-tree-an-algorithm-that-works-like-the-human-brain-8bc0652f1fc6?source=collection_archive---------5-----------------------

“sun light passing through green leafed tree” by Jeremy Bishop on Unsplash

决策树是机器学习中最常用的算法之一,主要用于分类,也用于回归问题。每当我们在做决定前问自己一个问题时,我们的大脑就像决策树一样工作。比如:外面是阴天吗?如果是的话,我会带一把伞。

当训练一个数据集对一个变量进行分类时,决策树的思想是根据某个特征值将数据划分成更小的数据集,直到目标变量全部归入一个类别。当人脑根据经验(即多云的天空)决定选择“分裂特征”时,计算机根据最大信息增益分裂数据集。让我们定义一个简单的问题,然后进行一些计算,看看这到底意味着什么!

Cats and dogs dataset

假设我们要构建一个决策树,根据体重和身高来确定宠物是猫还是狗。我们可以根据两个特征之一的特定值来划分这些数据点,例如:对于大于 15 磅的体重,我确信该宠物是一只狗,至少根据这个非常简单的数据集是这样的。但是如果权重小于这个值,我的子集将包含两只猫和一只狗,所以我需要再次分割子集,直到只剩下一个类。换句话说,直到我的所有子集都是纯 T4。我实际上为这些数据值画了一个决策树,如下所示:

Decision tree example.

每棵树都从一个根节点开始,即第一次分裂。不需要想太多,我们可以很容易地找到不同类型的根节点来分割数据,并在相同的步骤中找到解决方案。但是计算机如何决定如何定义节点呢?毫无疑问,它将寻找最有效的方式,为了理解这是什么,我们需要引入基尼:“最常用的不平等衡量方法”。这个不等式指的是节点后面每个子集中的目标类。为此,它可以在每次拆分后计算,并且根据不等式在一个节点后如何变化,我们还可以定义“信息增益”。

Definition of Gini

为了计算基尼系数,我们考虑在一个节点后找到每个类的概率,我们对这些值的平方求和,然后从 1 中减去这个值。由于这个原因,当一个子集是纯的(即其中只有一个类)时,Gini 将是 0,因为找到那个类的概率确实是 1!在这种情况下,我们说我们已经到达了一片叶子,因为当我们达到目标时,没有必要再分裂了。但是如果我们看上面的图片,在错误情况下的根节点之后,我们有一个包含 3 个观察值的子集,其中 2 个是猫,1 个是狗。如果我们想计算该子集的基尼系数,我们有:

Gini of the resulting dataset for weight greater or equal to 15 lbs

除了基尼系数,另一个可以用来计算阶层不平等的指标是熵。它们有着相同的目的,但熵的大小略有不同;然而,为此目的,我们将只使用基尼系数。

根据我们选择的分裂策略,我们将为每个子集提供不同的基尼值,并且根据节点后的基尼值,我们可以定义信息增益:

Definition of Information Gain

这被定义为父母的基尼系数和子女基尼系数的加权平均值之差。如果我们参考上面的例子,通过简单地应用定义,知道初始数据集的基尼等于 0.48,我们可以计算根节点之后的信息增益(在 15 磅的权重值处分裂):

Information gain after root node

然后,决策树将考虑所有可能的拆分,并选择具有最高信息增益的拆分。其实我们做点编码,看看什么是按 Python 的决策树!

通过运行下面的代码,我们从零开始构建数据框架,只用几行代码就能适应模型。

注意:在训练模型之前训练/测试 split 是一个很好的做法,可以防止过度拟合,也可以仔细检查这种模型在看不见的数据上的表现。在这种情况下,我跳过了这一步,因为数据帧只包含少量的观察值。

需要指出的是,在实例化DecisionTreeClassifier时,我没有在括号中指定任何参数。当处理非常大的数据集时,为了防止你的树失去控制和过度拟合,查看max_depth来指定你的树的最大分裂级别是非常有用的。此外,设置max_features也很有用,这是一个在搜索最佳分割时限制要查看的预测值数量的参数。此外,如果您希望您的树基于熵而不是基尼进行优化,只需在实例化对象时编写criterion = 'entropy'即可。如果您想进一步了解如何调整模型,请参考决策树文档

太好了,我们造好了模型!但是这到底意味着什么呢?决策树的妙处在于它很容易被解释,所以让我们来绘制它吧!为了运行下面的代码片段,你可能需要先在你的笔记本上运行!pip install pydotplus pydot2

这段代码的输出如下图所示。

很酷,对吧?在上面我“手工制作”的决策树中,我选择了 15 磅的权重作为根节点,算法决定对相同的变量进行分割,但值为 12。这创建了一个只有狗的叶子(事实上,对于大于 12 的重量,基尼= 0)。从根节点后的真实条件生成的子集,已根据值为 8.5 的高度变量进一步分割。这最后一次分裂产生了两个具有零基尼值的纯 T2 子集。

那么,我们为什么应该或不应该使用决策树呢?以下是利弊的简要列表:

优点

  • 它非常容易理解,尤其是当我们需要将我们的发现传达给非技术观众的时候
  • 它能很好地处理有噪声或不完整的数据
  • 它可用于回归和分类问题

缺点

  • 它可能是不稳定的,这意味着数据中的小变化可能会转化为模型中的大变化
  • 它往往会过度拟合,这意味着低偏差但高方差:即,即使训练数据上的分数很高,在看不见的数据上也可能表现不佳

幸运的是,有许多技术可以处理过度拟合,这是决策树的主要缺点。通过使用 baggingboosting 方法,我们可以从决策树概念出发,通过使用[RandomForestClassifier](http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html)[AdaBoostClassifier](http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html)等模型来开发更精确的分析。这些都是集成方法,但是随机森林通过增强捕获生成了许多“新数据集”(即,用替换采样原始数据帧);它为每一个新的数据帧拟合一棵树,并通过对森林中的所有树进行平均来进行预测。相反,Ada Boost 是一个自适应树,它通过调整不正确的分类实例,同时始终使用相同的数据帧来进行自我学习。

在 R 中使用 mlr 进行机器学习:决策树的逐步方法

原文:https://towardsdatascience.com/decision-tree-classification-of-diabetes-among-the-pima-indian-community-in-r-using-mlr-778ae2f87c69?source=collection_archive---------12-----------------------

优化性能的超参数调整。

我个人喜欢使用mlr来执行我的机器学习任务,但是你也可以使用任何你喜欢的其他库。

首先让我们加载相关的库:

  • mlr用于机器学习算法
  • FSelector进行特征选择。(同样,你可以使用任何你想要的特征选择库)
  • rpart.plot因为我想可视化这棵树,所以我将使用rpart决策树算法。
library(mlr) 
library(FSelector) 
library(rpart.plot) glimpse(Diabetes)Observations: 768 Variables: 6 
$ Pregnancies <fct> Yes, Yes, Yes, Yes, No, Yes, Yes... 
$ Glucose <fct> Hyperglycemia, Normal, Hyperglyc... 
$ BMI <fct> Obese, Overweight, Normal, Overw... 
$ DiabetesPedigreeFunction <dbl> 0.627, 0.351, 0.672, 0.167, 2.28... $ Age <int> 50, 31, 32, 21, 33, 30, 26, 29, ... $ Outcome <fct> Positive, Negative, Positive, Ne...

看看我在上一篇文章中处理过的数据集,它显示了我们将要处理的变量。

训练和测试设备

我将使用 80/20 训练/测试数据集。

set.seed(1000) 
train_index <- sample(1:nrow(Diabetes), 0.8 * nrow(Diabetes)) 
test_index <- setdiff(1:nrow(Diabetes), train_index) 
train <- Diabetes[train_index,] test <- Diabetes[test_index,]list( train = summary(train), test = summary(test) )
  • 训练集显示我们的目标变量有 212 个正面结果和 402 个负面结果。
  • 测试集显示我们有 56 个正面结果和 98 个负面结果。

我们的目标变量存在明显的类别不平衡,因为它偏向于“阴性”(无糖尿病),我们将发现更难建立一个“阳性”结果的预测模型。

你可以通过重新平衡类来解决这个问题,这需要重新采样。但是,我将在预测阶段调整概率阈值。我不知道这是否会解决任何潜在的问题,但阈值调整允许你改变预测,以给出一个完全不同的结果。

决策图表

(dt_task <- makeClassifTask(data=train, target="Outcome"))Supervised task: train 
Type: classif 
Target: Outcome 
Observations: 614 
Features: numerics factors ordered functionals 
            2        3        0       0 
Missings: FALSE 
Has weights: FALSE 
Has blocking: FALSE 
Has coordinates: FALSE 
Classes: 2 Positive Negative 
             212      402 
Positive class: Positive

首先,我们必须使用我们的训练集进行分类任务。在这里,我们可以定义我们试图解决的机器学习问题的类型,并定义目标变量。

我们可以看到,OutcomePositive等级已经默认为机器学习任务中的正类。情况并非总是如此。您可以通过指定Positive=x来更改它(其中‘x’是您想要预测的变量的目标级别)。在这种情况下,我们希望预测糖尿病患者(即Outcome变量的Positive水平)。

学习者

(dt_prob <- makeLearner('classif.rpart', predict.type="prob"))Learner classif.rpart from package rpart 
Type: classif 
Name: Decision Tree; Short name: rpart 
Class: classif.rpart 
Properties: twoclass,multiclass,missings,numerics,factors,ordered,prob,weights,featimp 
Predict-Type: prob 
Hyperparameters: xval=0

在创建分类任务后,我们需要创建一个学习器,它将在以后接受我们的任务来学习数据。我选择了 rpart 决策树算法。这是递归分割决策树。

特征选择

为了选择哪些特征提供了预测Positive的最佳机会,generateFilterValuesData给我们每个特征一个分数。这可以用PlotFilterValues来绘制。每个变量的分数取决于您选择的标准。这里我选择信息增益卡方增益比作为我的标准。

generateFilterValuesData(dt_task, method = c("information.gain","chi.squared", "gain.ratio")) %>% plotFilterValues()

generateFeatureImportanceData功能也以类似的方式工作。除了它将根据给定的性能标准向我们显示每个特性的重要性。我选择了真阳性率曲线下面积

generateFeatureImportanceData(task=dt_task, learner = dt_prob,measure = tpr, interaction = FALSE)FeatureImportance: Task: train Interaction: FALSE Learner: classif.rpart Measure: tpr Contrast: function (x, y) x - y Aggregation: function (x, ...) UseMethod("mean") Replace: TRUE Number of Monte-Carlo iterations: 50 Local: FALSE tpr
Pregnancies 0
Glucose -0.1869811
BMI -0.1443396
DiabetesPedigreeFunction -0.06339623
Age -0.06896226generateFeatureImportanceData(task=dt_task, learner = dt_prob,measure = auc, interaction = FALSE)FeatureImportance: Task: train 
Interaction: FALSE 
Learner: classif.rpart 
Measure: auc 
Contrast: function (x, y) x - y 
Aggregation: function (x, ...) 
UseMethod("mean") 
Replace: TRUE 
Number of Monte-Carlo iterations: 50 
Local: FALSE auc
Pregnancies 0
Glucose -0.1336535
BMI -0.07317023
DiabetesPedigreeFunction -0.01907362
Age -0.08251478

从上面的输出中我们可以看到:

  • 信息增益和增益率显示怀孕得分为零或低分。
  • generateFeatureImportanceData将 TPR 和 AUC 作为绩效衡量指标时,显示妊娠得分为零。

纵观所有证据,Pregnancies将是我丢弃的唯一变量。其他变量仍然显示出对某些标准的预测能力。

鉴于我们只剩下 4 个特征,可能存在不符合我的模型的风险。对此的另一个理由是,我首先没有很多行数据要处理。这是关于什么是合适的数据量和特征(维数灾难)的持续讨论。

看下面,我已经把怀孕从我们的训练和测试集中去掉了,并用我们的新训练集做了一个新的分类任务。

set.seed(1000) 
train <- select(train, -Pregnancies) 
test <- select(test, -Pregnancies)list( train = summary(train), test = summary(test) )

另一个问题是,在葡萄糖类别中,“低血糖症”在整个数据集中只有 5 种表现。当我们进行交叉验证时,这将是一个问题,因为几乎可以肯定,这个水平将在任何折叠中缺失。这将不允许模型在以后被适当地训练。因此,我们需要从两个数据集中去除低血糖:

train <- filter(train, Glucose!='Hypoglycemia') %>% droplevels() 
test <- filter(test, Glucose!='Hypoglycemia') %>% droplevels()list( train = summary(train), test = summary(test) )

因为我们现在有了新的数据集,所以我们需要基于新的训练集进行新的分类任务。

(dt_task <- makeClassifTask(data=train, target="Outcome"))Supervised task: train 
Type: classif 
Target: Outcome 
Observations: 609 
Features: numerics factors ordered functionals 
            2        2       0        0 
Missings: FALSE 
Has 
weights: FALSE 
Has blocking: FALSE 
Has coordinates: FALSE 
Classes: 2 
Positive Negative 
 210        399 
Positive class: Positive

超参数调谐

现在,任何机器学习算法都需要我们根据自己的判断来调整超参数。调整超参数是为机器学习参数选择一个值的过程,目标是获得您想要的性能水平。

mlr中调整机器学习算法包括以下步骤:

  • 定义搜索空间。
  • 定义优化算法(又名调优方法)。
  • 定义评估方法(即重新取样策略和性能测量)。

搜索空间

因此,定义搜索空间就是为给定的特征/变量指定参数。因为我们在这篇文章中关注决策树,使用getParamSet(learner)函数,我们可以获得我们想要的算法的超参数。

我们需要rpart学习者的参数。

getParamSet("classif.rpart")

getParamSet(“classif.rpart”)

我们可以看到rpart有 10 个超参数,只有xval是不可调整的(即不能改变)。

以下是对上述参数的解释:

  • minsplit

一个节点中的最小观察数,例程甚至会尝试为其计算一个分裂。默认值为 20。调整这个参数可以节省计算时间,因为较小的节点几乎总是被交叉验证删除。

  • minbucket

终端节点中的最小观察数。默认是 *minspit/3* (虽然不知道这是不是最优选择)。

  • maxcompete

如果设置为 1,这将显示在节点上给出最佳分割的变量。如果设置大于 1,那么它会给你第二,第三等..最好的。它对计算时间没有影响,对使用的内存影响最小。

  • maxdepth

这控制了树可以建多深。

  • cp

这是复杂度参数。它越低,树就会长得越大。一个 *cp=1* 会导致根本没有树。这也有助于修剪树木。无论 *cp* 的值是多少,我们都需要小心不要让树过度生长。更高的复杂性参数会导致过度绘制的树。我个人发现一个非常高的复杂度参数值(在我的例子中超过 0.3)会由于过度运行而导致树的欠拟合,但是这也取决于你拥有的特性的数量。

我以前没有使用过代理变量,所以在这种情况下我将省略它们。我只是不想在没有足够的理解来解释我自己的情况下在这一点上继续下去。

所以现在我们需要把超参数设置成我们想要的。记住没有一个确切的正确答案。我们需要定义空间并运行搜索,以根据我们定义的空间自动找到哪些超参数值将给出最佳结果。这意味着超参数的变化(大或小)可能会影响性能,也可能不会。

所以,如果你时间紧迫,要么跟随你的直觉,要么为超参数定义一个大空间,如果你有一台强大的机器和非凡的耐心,让mlr做繁重的工作。

dt_param <- makeParamSet( 
makeDiscreteParam("minsplit", values=seq(5,10,1)), makeDiscreteParam("minbucket", values=seq(round(5/3,0), round(10/3,0), 1)), 
makeNumericParam("cp", lower = 0.01, upper = 0.05), makeDiscreteParam("maxcompete", values=6), makeDiscreteParam("usesurrogate", values=0), makeDiscreteParam("maxdepth", values=10) )

对于我正在使用的模型,我将设置:

  • minsplit = [5,6,7,8,9,10]
  • minbucket = [5/3,10/3]
  • cp = [0.01,0.05]
  • maxcompete = 6
  • usesurrogate = 0
  • maxdepth = 10

我没有定义大空间的主要原因是我以前定义过,它运行了大约 4 个小时,有 100,000 个超参数组合。对我个人来说,这是太多的时间了,除非我正在做一个能从中受益匪浅的项目。

最优化算法

我们可用的标准但缓慢的算法之一是网格搜索来选择一组适当的参数。

ctrl = makeTuneControlGrid()

这就是我们如何指定我们想要运行网格搜索。有了上面指定的空间,在dt_param的情况下,我们得到了 120 种可能的组合。

使用重采样评估调优

指定上述内容后,我们现在可以进行调优过程了。我们定义一个重采样策略并记录性能。

我们将重采样策略设置为分层采样的三重交叉验证。如果你在目标变量中有阶级不平衡,分层抽样是有用的。它将尝试在每个文件夹中拥有相同数量的类。通常,为了从 k 重交叉验证中获得好的结果,3-5 重交叉验证将会很好。折叠多少次也取决于你有多少数据(即因素/类别的级别数,行数)。

rdesc = makeResampleDesc("CV", iters = 3L, stratify=TRUE)

调谐

我们现在可以使用tuneParams向我们展示我们指定的超参数值的什么组合会给出最佳结果。

measures中,您可以定义想要查看的绩效标准。我还想在交叉验证时从测试集中得到真实阳性率的标准差。这个增加的度量应该给我们一个指示,表明这个度量的每个折叠之间的价差有多大。

set.seed(1000) 
(dt_tuneparam <- tuneParams(learner=dt_prob, 
                 resampling=rdesc, 
                 measures=list(tpr,auc, fnr, mmce, tnr, setAggregation(tpr, test.sd)), 
                 par.set=dt_param, 
                 control=ctrl, 
                 task=dt_task, 
                 show.info = TRUE) )Tune result: Op. pars: minsplit=9; minbucket=2; cp=0.0144; maxcompete=6; usesurrogate=0; maxdepth=10 tpr.test.mean=0.6095238,auc.test.mean=0.7807376,fnr.test.mean=0.3904762,mmce.test.mean=0.2725780,tnr.test.mean=0.7894737,tpr.test.sd=0.0704698

在运行调谐器时,我们看到我们设置的参数有 120 种可能的组合。输出底部的最终结果(即[Tune] Result:...)给出了我们的最佳组合。这将在每次运行时改变。只要您可以看到类似的性能结果,继续使用当前数据集应该没有危险。如果性能结果开始偏离太多,数据可能不充分。

在最优超参数中,测试集中的真阳性率的标准偏差是 0.0704698,这是相对较低的,并且可以给我们稍后在预测时将获得的真阳性率一个概念。如果预测的 TPR 与交叉验证期间获得的 TPR 接近或在 1 个标准偏差之间,则表明我们的模型运行良好(这只是我的观点,其他人可能需要更小的扩散)

注意 *tuneParams* 知道哪个绩效衡量标准最小化和最大化。例如,它知道如何最大化精确度和最小化错误率(mmce)。

另一方面,正如我之前提到的,我定义了一个大的搜索空间,花了大约 4 个小时完成,最终得到了 100,000 个组合。这是结果:

【调】结果:minsplit = 17min bucket = 7;cp = 0.0433max compete = 4;use surrogate = 0;max depth = 7:TPR . test . mean = 0.6904762,auc.test.mean=0.7277720,f1.test.mean=0.6156823,acc.test.mean=0.7283265,mmce.test.mean=0.2716735,timepredict.test.mean=0.000000,tnr.test.mean=0.7460928

虽然 TPR 更高,但我将使用我以前的超参数,因为它的计算成本更低。

最优超参数

list( `Optimal HyperParameters` = dt_tuneparam$x, 
      `Optimal Metrics` = dt_tuneparam$y )$`Optimal HyperParameters` 
$`Optimal HyperParameters`$minsplit [1] 9 
$`Optimal HyperParameters`$minbucket [1] 2 
$`Optimal HyperParameters`$cp [1] 0.01444444 
$`Optimal HyperParameters`$maxcompete [1] 6 
$`Optimal HyperParameters`$usesurrogate [1] 0 
$`Optimal HyperParameters`$maxdepth [1] 10 $`Optimal Metrics` 
tpr.test.mean auc.test.mean fnr.test.mean mmce.test.mean 
0.60952381    0.78073756    0.39047619      0.27257800 
tnr.test.mean tpr.test.sd 
0.78947368     0.07046976

使用dt_tuneparam$x我们可以提取最优值,而dt_tuneparam$y给我们相应的性能指标。

setHyperPars将使用其最佳值调整学习者。

dtree <- setHyperPars(dt_prob, par.vals = dt_tuneparam$x)

模特培训

set.seed(1000) dtree_train <- train(learner=dtree, task=dt_task) getLearnerModel(dtree_train)n= 609 node), split, n, loss, yval, (yprob) * denotes terminal node 1) root 609 210 Negative (0.34482759 0.65517241) 2) Glucose=Hyperglycemia 149 46 Positive (0.69127517 0.30872483) 4) BMI=Obese 117 28 Positive (0.76068376 0.23931624) * 5) BMI=Normal,Overweight 32 14 Negative (0.43750000 0.56250000) * 3) Glucose=Normal 460 107 Negative (0.23260870 0.76739130) 6) Age>=28.5 215 78 Negative (0.36279070 0.63720930) 12) BMI=Underweight,Overweight,Obese 184 77 Negative (0.41847826 0.58152174) 24) DiabetesPedigreeFunction>=0.5275 61 23 Positive (0.62295082 0.37704918) * 25) DiabetesPedigreeFunction< 0.5275 123 39 Negative (0.31707317 0.68292683) * 13) BMI=Normal 31 1 Negative (0.03225806 0.96774194) * 7) Age< 28.5 245 29 Negative (0.11836735 0.88163265) *rpart.plot(dtree_train$learner.model, roundint=FALSE, varlen=3, type = 3, clip.right.labs = FALSE, yesno = 2)

Decision Tree Classification of the Pima Indian Diabetes dataset

rpart.rules(dtree_train$learner.model, roundint = FALSE)Outcome 0.24 when Glucose is Hyperglycemia & BMI is Obese 0.38 when Glucose is Normal & BMI is Underweight or Overweight or Obese & Age >= 29 & DiabetesPedigreeFunction >= 0.53 0.56 when Glucose is Hyperglycemia & BMI is Normal or Overweight

0.68 when Glucose is Normal & BMI is Underweight or Overweight or Obese & Age >= 29 & DiabetesPedigreeFunction < 0.53 0.88 when Glucose is Normal & Age < 29 0.97 when Glucose is Normal & BMI is Normal & Age >= 29

在训练决策树之后,我能够用rpart.plot函数绘制它,并且我可以很容易地用rpart.rules看到树的规则。因为mlr是一个机器学习算法的包装器,我可以根据自己的喜好定制,这只是一个例子。

模型预测(测试)

现在,我们让经过训练的学习者使用我们的测试数据进行预测。

set.seed(1000) 
(dtree_predict <- predict(dtree_train, newdata = test))Prediction: 154 observations predict.type: prob threshold: Positive=0.50,Negative=0.50 time: 0.00 truth prob.Positive prob.Negative response 1 Negative 0.3170732 0.6829268 Negative 2 Positive 0.6229508 0.3770492 Positive 3 Negative 0.4375000 0.5625000 Negative 4 Negative 0.3170732 0.6829268 Negative 5 Positive 0.7606838 0.2393162 Positive 6 Negative 0.1183673 0.8816327 Negative ... (#rows: 154, #cols: 4)

对每一行进行分类的阈值是 50/50。这是默认的,但以后可以更改(我将这样做)。

dtree_predict %>% calculateROCMeasures()

现在我们有了模型的混淆矩阵。我们看到它在预测Negative结果方面表现出色,但在预测Positive结果方面表现不佳。这本质上是由于我们数据集中的类别不平衡。这就是为什么阈值是一个更容易的策略来获得我们的首选模型。当然,如果我们的数据中有平衡的类和更多的观察行会更好,但这并不总是一个选择或现实。

为了更连贯地查看我们模型的性能,我们可以使用我编写的以下代码以一种可展示的方式来查看它。

Performance <- performance(dtree_predict, measures = list(tpr,auc,mmce, acc,tnr)) %>% 
as.data.frame(row.names = c("True Positive","Area Under Curve", "Mean Misclassification Error","Accuracy","True Negative")) Performance %>% kable(caption="Performance of Decision Tree",digits = 2, format = 'html', col.names = "Result")

这些指标相当令人满意。但是我们仍然可以实现更高的 TPR,如下所述。在某些情况下,包括这一点,TPR 将是最重要的,而不是 TNR。但是在我看来,我需要达到一个令人满意的 TNR,因为如果不是这样,我的错误分类率将会很高。

阈值处理

(dtree_threshold <- generateThreshVsPerfData(dtree_predict, measures = list(tpr,auc, mmce,tnr)) %>% plotThreshVsPerf() + geom_point() )

Performance vs Classification Threshold

我个人对这个模型的目标是获得一个可接受的和令人满意的True Positive RateTrue Negative Rate。由于 AUC 在所有阈值上保持不变,我们不需要关心它。通过改变阈值,我故意创建了一个有偏见的模型,但这是一个正常的机器学习问题。*偏差-方差权衡 是如此常见,我们需要学会驾驭它。这是一个完全不同的话题,任何做机器学习的人都需要一些这方面的知识。*

下面您将看到 3 个不同的阈值:

  • TPR 低于 100%的最大阈值。
  • TPR 高于 80%的最低阈值。
  • 两个阈值的平均值。
  • 我们的 TNR 高于 70%的最大阈值。
*list( 
`TPR Threshold for 100%` = tpr_threshold100 <- dtree_threshold$data$threshold[ which.max(dtree_threshold$data$performance[ dtree_threshold$data$measure=="True positive rate"]<1)], `TPR Threshold for 80%` = tpr_threshold80 <- dtree_threshold$data$threshold[ which.min(dtree_threshold$data$performance[ dtree_threshold$data$measure=="True positive rate"]>0.80)], `Average Threshold` = avg_threshold <- mean(c(tpr_threshold100,tpr_threshold80)), `TNR Threshold for 80%` = tnr_threshold80 <- dtree_threshold$data$threshold[ which.max(dtree_threshold$data$performance[ dtree_threshold$data$measure=="True negative rate"]>0.70)] )*

$ TPR Threshold for 100% [1] 0.1212121

$TPR Threshold for 80%[1]0.3232323

$ Average Threshold [1] 0.222222

$ TNR Threshold for 80% [1] 0.3232323

使用avg_threhsold再次预测我们的模型,我们可以获得以下性能指标。然而,从图中的阈值和我在上面定义的阈值来看,我们的真实负利率将受到很大的冲击。

*DecisionTree <- dtree_predict %>% setThreshold(avg_threshold) (dt_performance <- DecisionTree %>% performance(measures = list(tpr,auc, mmce,tnr)) )tpr           auc      mmce     tnr 
0.8214286 0.7693149 0.3376623 0.5714286*

我们的 TPR 现在是 82.14 %。这与 50/50 的门槛有着巨大的差异。我们的 TNR 已经降低到 57.14 %,但这是我们的模型偏向 TPR 的结果。我在下面解释新的混淆矩阵。

*(dt_cm <- DecisionTree %>% calculateROCMeasures() )*

我们注意到以下其他变化:

  • 由于阈值差异,TNR 减少到 57 %。
  • FPR 增加到了 43 %。这意味着该模型具有增加的 1 型错误的可能性,其中当它实际上不存在时,它将检测到糖尿病。为了获得更高的 TPR,这是我们必须做出的牺牲。
  • 准确率降到了 66 %。这是改变门槛的另一个后果。这不是一个值得关注的原因,因为我们的模型做了我想让它做的事情——具有很高的真实阳性率。如果我们只关心对某个结果的准确预测,那么准确性就不是模型性能的充分衡量标准。大多数情况下都是这样,但即使这样,您仍然需要深入研究模型性能。
*Performance_threshold <- performance(DecisionTree, measures = list(tpr,auc, mmce, acc, tnr)) %>% 
as.data.frame(row.names = c("True Positive","Area Under Curve", "Mean Misclassification Error","Accuracy","True Negative")) Performance_threshold %>% kable(caption=paste("Performance of Decision Tree\n\nAfter Thresholding to",(avg_threshold*100) %>% round(0),'%'), digits = 2, format = 'html', col.names = 'RESULT')*

更改分类阈值后,我们可以看到新的性能指标。阈值对于用户和问题的领域来说是非常主观的。有时,根据错误分类的代价,有必要将模型的性能向一个方向倾斜。在这种情况下,对于患者来说会有许多假阳性,但是如果将这些患者错误分类的成本不是太高,那么获得正确诊断的更高可能性(即真阳性)是值得的。

最后,设置阈值是必要的,尤其是当你有一个不平衡的数据集时(例如,不平衡数量的目标水平)。在该数据集中,NegativePositives多得多。如果更加平衡,则可能不需要根据模型对每个目标的分类程度来设定阈值。

如果您有任何问题或顾虑,请发表评论进行讨论,我邀请任何对此感兴趣的人加入。谢谢你

最初发表于 轻松数据科学与 R 和 Python

决策树——数据科学家解决哈姆莱特难题的灵丹妙药

原文:https://towardsdatascience.com/decision-tree-data-scientists-magic-bullet-for-hamletian-dilemma-411e0121ba1e?source=collection_archive---------8-----------------------

source: my sketch book

决策树属于监督机器学习算法家族,被认为是所有数据科学问题的万能药。数据科学家经常会说一些诙谐的话,比如,“每当问题陈述让你陷入哈姆雷特式的困境,而你又想不出任何算法时(不管情况如何),就使用决策树吧!”。

无论是在工业界还是在 kaggle 竞赛中,经常可以看到决策树或者至少是从它演化而来的算法( Bagging,Boosting ensemble )被虔诚地实践着。

决策树是一种通用的机器学习方法,能够执行回归和分类任务。几乎所有现实世界的问题本质上都是非线性的,决策树可以帮助你消除数据中的非线性。这种算法非常直观,易于理解,可以直观地解释——这是每个企业首先想要的。

一个人还能从模特身上得到什么?简单神奇的✨

决策树是倒着画的,意思是根在上面,叶子在下面。决策树主要相信分而治之的规则。

基本术语

让我们看看决策树使用的基本术语:

  1. 根节点:它代表整个群体或样本,并进一步分成两个或多个同类集合。
  2. 拆分:是将一个节点分成两个或两个以上子节点的过程。
  3. 决策节点:当一个子节点分裂成更多的子节点时,则称为决策节点。
  4. 叶/端节点:不再分裂的节点称为叶或端节点。
  5. 剪枝:当我们删除一个决策节点的子节点时,这个过程叫做剪枝。
  6. 分支/子树:整个树的一个子部分称为分支或子树。
  7. 父节点和子节点:被划分为子节点的节点称为子节点的父节点,子节点是父节点的子节点。

直觉

有两种类型决策树:

分类决策树 & B回归决策树

  • 分类树帮助您对数据进行分类,因此它们可以处理分类数据,例如贷款状态(批准/未批准)、垃圾邮件/非垃圾邮件等。
  • 回归树旨在帮助您预测结果,结果可以是一个真实的数字,例如一个人的收入,房子的销售价格等。

source: algobeans.com — Classification Tree illustration

假设我们有两个特征 X 和 Y,在右边的面板中,您可以观察到有几个分散的数据点。绿叶和灰叶是因变量中的两类。所以决策树基本上做的是,在几次迭代中把整个数据集切割成切片。如图所示,在 X = 0.5 处有分裂 1,在 Y =0.5 处有分裂 2,在 X = 0.25 处有分裂 3。

拆分是精心安排的,以最大化每个拆分中特定类别的数量,这意味着决策树试图在每个节点上实现同质分布。从右图中,您可以注意到绿叶类和灰色叶类的分离最终在每个隔间中形成同质结构。

算法背后的数学

决策树采用多种方法来拆分节点。最常用的是基尼系数、熵、卡方等。

基尼指数

  • 根据它,如果我们从一个群体中随机选择两个项目,那么它们必须是同一类,如果群体是纯的,概率是 1。
  • 这是衡量杂质的标准。因此,基尼系数越低,同质性越高。
  • 数学上表示为

基尼指数= 1-[(P) +(1-P) ]

其中 P 是该节点中阳性样本的比例。

  • 基尼指数为“0”表示节点是纯的。因此,这意味着不需要进一步拆分。
  • 涉及的步骤-

使用公式计算子节点的基尼系数。

使用分裂每个节点的加权基尼系数来计算分裂的基尼系数

卡方

  • 这有助于找出子节点和父节点之间差异的统计显著性。
  • 我们通过目标变量的观察频率和预期频率之间的标准化差异的平方和来衡量它。
  • 数学上表示为

卡方=((实际—预期)/预期)/2

  • 这是纯度的衡量标准。因此,卡方值越高,子节点和父节点之间差异的统计显著性越高。
  • 涉及的步骤-

通过计算成功和失败的偏差来计算单个节点的卡方

使用拆分的每个节点的所有成功和失败卡方的总和计算拆分的卡方

  • 它是对正在处理的信息的随机性的一种度量。
  • 熵值越大,就越难从这些信息中得出任何结论。
  • 数学上表示为

熵= -plog(p) - qlog(q)

  • 这里 p 和 q 分别是该节点中成功和失败概率。
  • 测井记录以“2”为基数。
  • 涉及的步骤-

计算父节点的熵

计算 split 中每个单独节点的熵,并计算 split 中所有可用子节点的加权平均值。

方差减少

  • 上面提到的所有方法都属于分类决策树。对于目标变量连续的回归决策树,采用方差缩减法。
  • 它使用标准的方差公式来选择最佳分割。选择具有较低方差的分裂作为分裂群体的标准。
  • 数学上表示为

Where, X -> actual values, X −> mean and N -> number of observations

  • 涉及的步骤-

计算每个节点的方差。

将每个分割的方差计算为每个节点方差的加权平均值。

让我们举一个离散的例子,牢牢抓住这个主题

形象化

如前所述,决策树是可以解释和可视化的。Graphviz 库来拯救正在研究 python 的数据科学家。这里的 是下载 Graphviz 的指南。

我已经尝试使用 IRIS 数据集来可视化决策树和下图。这是通过一段代码实现的,你甚至不需要在你的机器上下载 Graphviz。

Find Hands-On-Code for visualizing decision treeHERE

有什么条件?

嗯,我们的灵丹妙药听起来的确像是生命的救星,但这太好了,令人难以置信,不是吗?!对决策树建模时最大的危险是它们的过度拟合倾向。如果在决策树上没有设置限制,它会给你 100%的训练集的准确性,因为在最坏的情况下,它会为每个观察结果建立 1 个终端节点。

因此,在对决策树进行建模时,防止过度拟合是至关重要的,这可以通过两种方式实现:

A. 对树大小设置约束(超参数调优)&b .树修剪

Illustration of different Hyper-parameters used in Decision Tree

进一步阅读

请参考下面的链接,以便更深入地理解这个概念

  1. 分析 vidhya
  2. Scikit 文档
  3. 堆栈溢出

恭喜你!!关于掌握机器学习中一个古老的算法:)

其他发表的文章:

如果你喜欢我的文章,那就花几分钟看看我的其他博客吧-

  1. 什么是探索性数据分析?
  2. 最后一分钟修改:第一部分——机器学习&统计
  3. 如何使用 Python 从 Excel 创建 PDF 报告

决策树集成——打包和提升

原文:https://towardsdatascience.com/decision-tree-ensembles-bagging-and-boosting-266a8ba60fd9?source=collection_archive---------0-----------------------

随机森林和梯度增强

我们每天都在使用决策树技术来规划我们的生活,我们只是没有给那些决策过程起一个花哨的名字。

企业使用这些有监督的机器学习技术,如决策树,来做出更好的决策,并获得更多利润。决策树已经存在了很长一段时间,而且众所周知也存在偏差和差异。简单的树会有很大的偏差,复杂的树会有很大的变化。

集成方法 ,将几个决策树结合起来,产生比利用单个决策树更好的预测性能。集成模型背后的主要原理是一组弱学习者聚集在一起形成一个强学习者。

让我们讨论几个执行集合决策树的技术:

1.制袋材料

2.助推

装袋 (Bootstrap Aggregation)在我们的目标是降低决策树的方差时使用。这里的想法是从随机选择的训练样本中创建几个数据子集并替换。现在,每个子集数据的集合都被用来训练他们的决策树。结果,我们得到了不同模型的集合。使用来自不同树的所有预测的平均值,这比单个决策树更健壮。

随机森林 是套袋的延伸。这需要一个额外的步骤,除了获取数据的随机子集,还需要随机选择特征,而不是使用所有特征来生成树。当你有很多随机的树时。它叫做随机森林😊

让我们看一下实施随机森林的步骤:

1 。假设训练数据集中有 N 个观测值和 M 个特征。首先,从训练数据集中随机抽取一个样本进行替换。

2 。随机选择 M 个特征的子集,并且使用给出最佳分裂的特征来迭代地分裂节点。

3 。这棵树长到最大。

4 。重复上述步骤,并基于来自 n 棵树的预测的集合给出预测。

使用随机森林技术的优势:

  • 非常好地处理更高维度的数据。
  • 处理缺失值并保持缺失数据的准确性。

使用随机森林技术的缺点:

  • 由于最终预测基于子集树的平均预测,因此它不会为回归模型提供精确的值。

Boosting 是另一种创建预测器集合的集成技术。在这种技术中,学习者是顺序学习的,早期的学习者将简单的模型与数据拟合,然后分析数据的错误。换句话说,我们拟合连续的树(随机样本),并且在每一步,目标都是解决来自先前树的净误差。

当一个输入被一个假设错误分类时,它的权重会增加,以便下一个假设更有可能将其正确分类。通过在最后组合整个集合,将弱学习者转换成表现更好的模型。

梯度增强是对增强方法的扩展。

梯度推进=梯度下降+推进。

它使用梯度下降算法,可以优化任何可微损失函数。一个系综树被一个接一个地构建,并且各个树被顺序地求和。下一个采油树试图恢复损失(实际值和预测值之间的差异)。

使用梯度增强技术的优势:

  • 支持不同的损失函数。
  • 互动良好。

使用梯度增强技术的缺点:

  • 容易过度拟合。
  • 需要仔细调整不同的超参数

决策树拥抱

原文:https://towardsdatascience.com/decision-tree-hugging-b8851f853486?source=collection_archive---------3-----------------------

昨天我了解了决策树以及如何在 python shell 中计算它们。决策树是一个非常酷和强大的决策支持工具,它本质上显示了一个算法。如上面的简单图表所示,我们看到决策树从一个根节点开始,然后分支到不同深度的内部节点。在每一步,您的数据都按照不同的属性进行分类,从而将数据引导到更深的内部节点,或者最终到达决策点,这也称为树叶。

为了应用我新学到的知识,我得到了一个关于大学录取的小数据集。数据集有 4 列:学生是否被录取,学生的 GRE 成绩,学生的 GPA(4.0 分)和学校的声望(4 分)。在通过移除空值来清理数据之后,我面临的任务是在最大深度 1、2、3 和无限深度上构建决策树,以查看我是否能够根据其他 3 个值准确预测某个学生是否被录取。首先,我计算了交叉验证分数,以确定每个深度的准确性,结果按深度顺序分别为 67.50%、70.77%、71.55%和 60.96%。现在得到这些数字是很棒的,然而有趣的部分开始于我制作如下所示的可视化决策树:

Max Depth 1

Max Depth 2

Max Depth 3

Max Depth None

这真的很酷,能够看到到底发生了什么,以获得上述准确性数字。正如我们所看到的,深度 2 和 3 是最准确的,但是我也想运行深度 4 和 5,看看我是否能得到更准确的结果。我们还可以看到,将最大深度设置为“无”会给我们一个很好的过度拟合的例子。

虽然决策树和其他工具一样都是令人惊奇的工具,但是它们有两个最大的缺点:

  • 不稳定性:决策树严重依赖于提供给它们的数据,尽管一棵树可以变得非常精确,但是如果你给它提供额外的数据,整棵树就可能被抛弃。
  • 复杂性:与其他决策模型相比,决策树易于使用,但是一个非常复杂的具有多个分支的决策树在准备和计算上都非常耗时。

所有的决策树都是很好的工具,比如随机森林,它使用一种集合方法(另一个话题)。我肯定会在未来的数据科学职业生涯中使用这些工具,并且很高兴能够更深入地研究其他机器学习应用程序!

机器学习中的决策树

原文:https://towardsdatascience.com/decision-tree-in-machine-learning-e380942a4c96?source=collection_archive---------2-----------------------

Source

决策树是一种类似流程图的结构,其中每个内部节点代表一个特征上的test(例如,硬币是正面还是反面),每个叶节点代表一个class label(计算所有特征后做出的决定),分支代表导致这些类别标签的特征的结合。从根到叶的路径代表classification rules。下图说明了用标签(下雨(是),不下雨(否))进行决策的决策树的基本流程。

Decision Tree for Rain Forecasting

决策树是statisticsdata miningmachine learning中使用的预测建模方法之一。

决策树是通过一种算法方法构建的,这种算法方法可以根据不同的条件识别分割数据集的方法。这是监督学习中最广泛使用和最实用的方法之一。决策树是一种非参数 监督学习方法,用于分类回归任务。

目标变量可以取一组离散值的树模型称为分类树。目标变量可以取连续值(通常是实数)的决策树被称为回归树。分类和回归树(CART)是这个的通称。

在这篇文章中,我将尝试用例子来解释。

数据格式

数据以表格记录的形式出现。

(x,Y)=(x1,x2,x3,....,xk,Y)

因变量 Y 是我们试图理解、分类或概括的目标变量。向量 x 由特征 x1、x2、x3 等组成。,用于该任务。

示例

training_data = [
                  ['Green', 3, 'Apple'],
                  ['Yellow', 3, 'Apple'],
                  ['Red', 1, 'Grape'],
                  ['Red', 1, 'Grape'],
                  ['Yellow', 3, 'Lemon'],
                  ]
 # Header = ["Color", "diameter", "Label"]
 # The last column is the label.
 # The first two columns are features.

决策树的生成方法

在做决策树的时候,在树的每个节点我们会问不同类型的问题。基于所提出的问题,我们将计算与之对应的信息增益。

信息增益

信息增益用于决定在构建树的每一步中分割哪个特征。简单是最好的,所以我们想保持我们的树小。要做到这一点,在每一步我们都应该选择产生最纯净子节点的分裂。一种常用的纯度测量方法叫做信息。对于树的每个节点,信息值测量一个特征给我们多少关于类的信息。具有最高信息增益的分裂将被作为第一分裂,并且该过程将继续,直到所有子节点都是纯的,或者直到信息增益为 0。

提问

class Question:
  """A Question is used to partition a dataset. This class just records a 'column number' (e.g., 0 for Color) and a
  'column value' (e.g., Green). The 'match' method is used to compare
  the feature value in an example to the feature value stored in the
  question. See the demo below.
  """ def __init__(self, column, value):
      self.column = column
      self.value = value def match(self, example):
      # Compare the feature value in an example to the
      # feature value in this question.
      val = example[self.column]
      if is_numeric(val):
          return val >= self.value
      else:
          return val == self.value def __repr__(self):
      # This is just a helper method to print
      # the question in a readable format.
      condition = "=="
      if is_numeric(self.value):
          condition = ">="
      return "Is %s %s %s?" % (
          header[self.column], condition, str(self.value))

让我们尝试查询问题及其输出。

Question(1, 3) ## Is diameter >= 3?
Question(0, "Green") ## Is color == Green?

现在,我们将尝试根据提问的问题对数据集进行分区。在每个步骤中,数据将被分为两类。

def partition(rows, question):
    """Partitions a dataset. For each row in the dataset, check if it matches the question. If
    so, add it to 'true rows', otherwise, add it to 'false rows'.
    """
    true_rows, false_rows = [], []
    for row in rows:
        if question.match(row):
            true_rows.append(row)
        else:
            false_rows.append(row)
    return true_rows, false_rows

   # Let's partition the training data based on whether rows are Red.
   true_rows, false_rows = partition(training_data, Question(0, 'Red'))
   # This will contain all the 'Red' rows.
   true_rows ## [['Red', 1, 'Grape'], ['Red', 1, 'Grape']]
   false_rows ## [['Green', 3, 'Apple'], ['Yellow', 3, 'Apple'], ['Yellow', 3, 'Lemon']]

构建决策树的算法通常是自上而下的,在best分割项目集的每一步选择一个变量。不同的算法使用不同的度量标准来测量best

基尼杂质

首先让我们了解一下不纯的含义。

纯的

纯意味着,在数据集的选定样本中,所有数据都属于同一类(纯)。

肮脏的

不纯意味着,数据是不同类的混合物。

基尼系数的定义

基尼系数是对随机变量新实例不正确分类的可能性的一种度量,前提是该新实例是根据数据集中类别标签的分布随机分类的。

如果我们的数据集是Pure,那么不正确分类的可能性是 0。如果我们的样本是不同类别的混合物,那么不正确分类的可能性将会很高。

计算基尼杂质。

def gini(rows):
    """Calculate the Gini Impurity for a list of rows.

    There are a few different ways to do this, I thought this one was
    the most concise. See:
    https://en.wikipedia.org/wiki/Decision_tree_learning#Gini_impurity
    """
    counts = class_counts(rows)
    impurity = 1
    for lbl in counts:
        prob_of_lbl = counts[lbl] / float(len(rows))
        impurity -= prob_of_lbl**2
    return impurity

示例

# Demo 1:
    # Let's look at some example to understand how Gini Impurity works.
    #
    # First, we'll look at a dataset with no mixing.
    no_mixing = [['Apple'],
                 ['Apple']]
    # this will return 0
    gini(no_mixing) ## output=0

   ## Demo 2:
   # Now, we'll look at dataset with a 50:50 apples:oranges ratio
    some_mixing = [['Apple'],
                   ['Orange']]
    # this will return 0.5 - meaning, there's a 50% chance of misclassifying
    # a random example we draw from the dataset.
    gini(some_mixing) ##output=0.5

    ## Demo 3:
    # Now, we'll look at a dataset with many different labels
    lots_of_mixing = [['Apple'],
                      ['Orange'],
                      ['Grape'],
                      ['Grapefruit'],
                      ['Blueberry']]
    # This will return 0.8
    gini(lots_of_mixing) ##output=0.8
    #######

制作决策树的步骤

  • 获取行(数据集)的列表,这些行被考虑用于生成决策树(在每个节点递归)。
  • 计算我们数据集的uncertanityGini impurity或我们的data is mixed up有多少等等。
  • 生成需要在该节点询问所有问题的列表。
  • 根据每个问题将行划分为True rowsFalse rows
  • 根据基尼系数和上一步数据划分计算信息增益。
  • 根据每个问题更新最高信息增益。
  • 基于信息增益(更高的信息增益)更新最佳问题。
  • 在最佳问题上划分节点。从步骤 1 再次重复,直到我们得到纯节点(叶节点)。

上述步骤的代码

def find_best_split(rows):
    """Find the best question to ask by iterating over every feature / value
    and calculating the information gain."""
    best_gain = 0  # keep track of the best information gain
    best_question = None  # keep train of the feature / value that produced it
    current_uncertainty = gini(rows)
    n_features = len(rows[0]) - 1  # number of columns for col in range(n_features):  # for each feature values = set([row[col] for row in rows])  # unique values in the column for val in values:  # for each value question = Question(col, val) # try splitting the dataset
            true_rows, false_rows = partition(rows, question) # Skip this split if it doesn't divide the
            # dataset.
            if len(true_rows) == 0 or len(false_rows) == 0:
                continue # Calculate the information gain from this split
            gain = info_gain(true_rows, false_rows, current_uncertainty) # You actually can use '>' instead of '>=' here
            # but I wanted the tree to look a certain way for our
            # toy dataset.
            if gain >= best_gain:
                best_gain, best_question = gain, question return best_gain, best_question

    #######
    # Demo:
    # Find the best question to ask first for our toy dataset.
    best_gain, best_question = find_best_split(training_data)
    best_question
    ## output - Is diameter >= 3?

现在,根据上面讨论的步骤,在每个节点递归地构建决策树。

def build_tree(rows):
    """Builds the tree. Rules of recursion: 1) Believe that it works. 2) Start by checking
    for the base case (no further information gain). 3) Prepare for
    giant stack traces.
    """ # Try partitioning the dataset on each of the unique attribute,
    # calculate the information gain,
    # and return the question that produces the highest gain.
    gain, question = find_best_split(rows) # Base case: no further info gain
    # Since we can ask no further questions,
    # we'll return a leaf.
    if gain == 0:
        return Leaf(rows) # If we reach here, we have found a useful feature / value
    # to partition on.
    true_rows, false_rows = partition(rows, question) # Recursively build the true branch.
    true_branch = build_tree(true_rows) # Recursively build the false branch.
    false_branch = build_tree(false_rows) # Return a Question node.
    # This records the best feature / value to ask at this point,
    # as well as the branches to follow
    # dependingo on the answer.
    return Decision_Node(question, true_branch, false_branch)

构建决策树

让我们根据训练数据建立决策树。

training_data = [
                  ['Green', 3, 'Apple'],
                  ['Yellow', 3, 'Apple'],
                  ['Red', 1, 'Grape'],
                  ['Red', 1, 'Grape'],
                  ['Yellow', 3, 'Lemon'],
                  ]
  # Header = ["Color", "diameter", "Label"]
  # The last column is the label.
  # The first two columns are features.

  my_tree = build_tree(training_data)

  print_tree(my_tree)

输出

Is diameter >= 3?
  --> True:
    Is color == Yellow?
    --> True:
        Predict {'Lemon': 1, 'Apple': 1}
    --> False:
        Predict {'Apple': 1}
 --> False:
    Predict {'Grape': 2}

从上面的输出我们可以看到,在每一步,数据被分成TrueFalse行。这个过程一直重复,直到我们到达信息增益为 0 的叶节点,并且由于节点是纯的,所以进一步的数据分割是不可能的。

决策树的优势

  • 易于使用和理解。
  • 可以处理分类数据和数字数据。
  • 抵抗离群值,因此需要很少的数据预处理。

决策树的缺点

  • 容易过度拟合。
  • 需要对他们的表现进行某种衡量。
  • 需要小心调整参数。
  • 如果某些职业占优势,可能会创建有偏见的学习树。

如何避免决策树模型过拟合

过拟合是机器学习中每个模型的主要问题之一。如果模型过度拟合,它将很难推广到新的样本。为了避免决策树过度拟合,我们移除了利用低重要性特征的分支。这种方法被称为修剪或后修剪。这样,我们将降低树的复杂性,并因此通过减少过拟合来提高预测准确性。

修剪应该减少学习树的大小,而不会降低由交叉验证集测量的预测准确性。有两种主要的修剪技术。

  • 最小误差:树被修剪回交叉验证误差最小的点。
  • 最小的树:树被修剪得比最小误差稍远。从技术上讲,修剪创建了交叉验证误差在最小误差的 1 个标准误差内的决策树。

提前停止或预修剪

防止过度拟合的另一种方法是,在生成样本非常少的叶子之前,尝试尽早停止树构建过程。这种试探法被称为提前停止,但有时也被称为预修剪决策树。

在分裂树的每个阶段,我们检查交叉验证错误。如果误差没有显著减小,那么我们停止。过早停止可能会因停止过早而不足。当前的拆分可能没什么好处,但在完成拆分后,后续的拆分会更显著地减少错误。

提前停止和修剪可以一起使用,单独使用,或者根本不使用。后期修剪决策树在数学上更加严格,找到一棵树至少和早期停止一样好。提前停止是一种快速解决的启发式方法。如果与修剪一起使用,尽早停止可以节省时间。毕竟,为什么建造一棵树只是为了再次修剪它?

现实生活中的决策树

  • 选择要旅行的航班

假设您需要为下一次旅行选择航班。我们该如何着手呢?我们先查一下那天的航班是否有空。如果没有,我们会寻找其他日期,但是如果有,我们会寻找航班的持续时间。如果我们只想要直达航班,那么我们会查看该航班的价格是否在您预先定义的预算内。如果太贵的话,我们看看其他的航班,或者我们预订它!

  • 处理深夜的渴望

Source: Google

决策树在现实生活中还有很多应用。更多决策树的应用可以查看这个这个

从这篇文章中,我试图解释决策树的基础知识以及它是如何工作的。您可以在 github 找到本文使用的源代码。

希望你喜欢这篇文章。如果有任何修改或建议,请直接在这篇文章或 LinkedIn 上给我发消息。快乐学习—干杯:)

决策树:完全介绍

原文:https://towardsdatascience.com/decision-trees-60707f06e836?source=collection_archive---------9-----------------------

决策树是许多监督学习算法中的一种,任何人都可以基于一些历史数据对未来事件进行预测,尽管没有一种通用工具对所有问题都是最佳的,但决策树非常受欢迎,并在许多机器学习应用中证明非常有效。

为了理解决策树背后的直觉,考虑这样一个问题:设计一个算法来自动区分苹果和梨( 标签),仅给出它们的宽度和高度测量值(特征)。

苹果往往又矮又胖,而梨通常又高又瘦。基于这些知识,我们可以问一系列的问题,这些问题最终会导致对神秘水果的真实类别的有根据的猜测。例如,为了对一个水果进行分类,我们可能会首先询问宽度是否小于 7.35 厘米,然后我们可以询问高度是否小于 7.4 厘米。如果这两个问题的答案都是,那么我们就可以(非常有把握地)断定这个没有标签的商品是苹果。事实上,我们刚刚描述的过程正是决策树的过程。

A visual representation of a decision tree and how this translates into 2D feature space

当我们看到我们所有的问题或分裂是如何源于一个根问题(根节点)并依次分支以最终到达某个终端决策(叶节点)时,(倒置)树的类比是有意义的。在树的旁边,我们可以确切地看到这是如何转换到二维特征空间的。分割将平面分成多个盒子,每个盒子对应一个观察分类(苹果/梨)。这个非常简单的概念在创建自动水果标签系统方面做得非常好,现代计算机可以很容易地采用这种方法来分类每秒成千上万的观察结果。

到目前为止,我们讨论的内容中还缺少一样东西:我们如何构建一个决策树?随着我们获得越来越复杂的数据,反复试验将成为一项相当艰巨的任务,即使我们采用这种方法,我们也有可能制作大量的树,我们如何设计一个最佳的树呢?下一节讨论从标记数据构建决策树的过程。

构建决策树

给定一组带标签的数据(训练数据),我们希望构建一个决策树,该决策树将对训练数据和任何新的未观察到的数据做出准确的预测。根据所讨论的数据,决策树可能需要比前一个例子更多的分裂,但概念总是相同的:进行一系列良好的分裂,以正确地将观察分类为其真正的类标签。那么,我们如何定义什么是好的分割呢?

嗯,在每次分割时,我们希望找到一个特征,以这样一种方式分割标记的数据,使子节点比它们来自的父节点更加同质。换句话说,随着我们沿着树向下移动,我们希望节点变得更加纯净,我们希望选择我们的分裂来最大化节点纯净度的增加。

从数字上衡量节点纯度有两种流行的选择,但现在我们将关注熵(及其替代物,基尼杂质,稍后讨论)。更具体地说,对于观测值{x₁,x₂,…,xn} ∈ X 其中 P(xᵢ)是观测值的相对频率 i ,那么熵被定义为:

这个等式给出了较纯节点的低值,因此我们希望选择最小化熵的分裂。这似乎有道理,但有一个问题:这种设置可能会被父节点的某些分裂选择所滥用,例如一个大的子节点包含几乎所有的观察值,而第二个小的子节点是纯的。这给树增加了另一个分裂,并没有真正提高整体性能(因为它只占一个极值),同时也给树增加了不必要的深度和复杂性,特别是如果这在同一个树中重复发生的话。

解决办法?信息增益。这是一种流行的信息论方法,该方法将分裂前父节点的熵与分裂后子节点的加权和的熵进行比较,其中权重与每个节点中的观察数量成比例。正如我们所要求的,这有效地惩罚了基于大小的小而纯的节点。更正式地,对于特征 F 和一组观察值 X,信息增益被定义为:

由于信息增益减去子节点的熵,我们选择的分裂将是最大化信息增益的分裂。通过研究上图中显示的示例,并比较我们从同一根节点上的两个不同的建议拆分中获得的信息增益值,这一切变得更加清楚。

注意,第一个提出的分裂仅略微提高了节点纯度,信息增益仅为 0.0213。然而,第二次分裂将根节点分裂成两个完全纯的节点,这通过信息增益分数 1 来反映。显然,更好的分裂选择可以通过选择基于熵值最大化信息增益的分裂来衡量。

现在这个难题只剩下最后一块了,然后我们准备从头开始构建我们自己的决策树,那就是选择在哪里分割连续的特征。连续数据(如高度或宽度)可以拆分为无限个值,而分类数据(如水果颜色或血型)只能拆分有限个值并计算信息增益。考虑以下两个特征:

  • 水果颜色(分类)-{绿色,红色,黄色,其他}
  • 果高(连续)- {5.65,5.78,6.34,6.84,6.86}

对于水果颜色,我们可以很容易地检查所有可能的分裂,并选择一个最大化信息增益,如前所述。当我们尝试用这种方法计算水果高度时,有太多的值可能会被分割。我们可以使用 5.92、5.93 甚至 5.92534……应该使用哪个?显而易见的选择是取两个值之间的中点,在这种情况下,我们将有四个值进行分割,并检查信息增益。不过,这并不能很好地扩展。如果我们在数据集中有 1000 个不同的水果块,我们将有 999 个可能的分裂来检查,这可能会变得相当计算量大。解决方案是应用一种流行的聚类算法,例如 k-means ,将水果高度分成预定义数量的组,这样我们的数据可能如下所示:

现在我们只需要检查更易管理的潜在分裂数量(那些是 6.06 和 6.59,你能看出为什么吗?).我们已经有效地将连续值转换为离散区间,并且在实践中,这通常能够获得最佳的信息增益,而不会浪费时间检查不必要的额外值。

差不多就是这样!这就是我们开始构建决策树所需要的所有理论。我们可以将所有这些放在一个决策树算法中,该算法大致基于最初的 ID3 实现。在下面的伪代码中,S指的是一组数据(如苹果/梨数据),C指的是类别标签(如苹果和梨),A指的是特征(如高度或宽度),而v指的是一个特征可能被分割成的值(如高度< 7.4 厘米)。

**ID3(S):** 
IF all examples in S belong to class C: 
    - return new leaf node and label with class C 
ELSE: 
    - select a feature A based on some feature selection criterion 
    - generate a new tree node with A as the test feature 
    - FOR EACH value v[i] of A: 
        - let S[i] ⊂ S contain all examples with A = v[i] 
        - build subtree by applying ID3(S[i])

下一节将继续探讨一些方法,我们可以通过防止一种常见的机器学习陷阱(称为过拟合)来提高实践中的性能。

过度拟合

我们前面提到过,我们的决策树(事实上,在所有的分类问题中)的一个可取的特征是良好的概括。这意味着,我们希望模型符合标记的训练数据,以做出与新的看不见的观察一样准确的预测。当这种情况没有发生时,通常是由于一种称为过度拟合的现象。在决策树中,当树中的拆分对于训练数据来说定义得过于具体时,就会出现这种情况。下面我们观察一个决策树,该决策树已经添加了三个连续的分裂以便对单个异常值进行分类,实际上这些额外的分裂不会提高新数据的性能,事实上可能会使其恶化。

Adding three new splits to capture a single data point is probably overfitting

有三种方法可以防止决策树过度拟合:

  • 早期停止-构建决策树,同时应用一些标准,在决策树过度适应训练数据之前停止决策树的增长。
  • 修剪-构建决策树并允许它过度适应训练数据,然后将其修剪回去以移除导致过度适应的元素。
  • 数据预处理—在构建树之前对初始数据进行一些更改

我们将在这里讨论前两种方法。

提前停止(或预修剪)是指在决策树过度适应训练数据之前,我们提前停止决策树的增长。这里的想法是在树产生过度的小生境分裂之前停止树的生长,这不能很好地概括,在实践中,这经常被使用。回想一下,在前面的部分中,根节点顺序地添加分裂,直到子节点是纯的,现在我们需要一个替代规则,告诉树在节点是纯的之前停止增长,并根据它们的多数类对新的终端节点进行分类。我们可以设想出大量的潜在停止规则,因此下面是一些流行选择的非穷尽列表:

  • 最大树深度—只需预先定义一个任意的最大深度值(或最大分裂数),一旦树达到该值,生长过程就会终止。
  • 节点中的最小数量-定义出现在任何子节点中的最小观察数量,以使分割有效。
  • 杂质的最小减少量——定义可接受的分流的最小可接受的杂质减少量。
  • 最大特征-严格来说不是停止规则,而是仅考虑要分割的可用特征的子集,这可能会提高最终树的泛化能力。

We wish to find a tree that will generalise well on the population

另一方面,修剪(或后修剪)采用已经过度拟合的树,并进行一些调整以减少/消除观察到的过度拟合。一个好的剪枝规则通常会通过使用独立的测试集来查明没有很好概括的分裂,并将它们从树中移除。同样,有许多不同的方法来实现修剪,但有三种流行的选择:

  • 临界值修剪—根据在树构建阶段完成的计算,回顾性地估计每个节点的强度。没有达到某个临界值的节点将被删除,除非该分支上更远的节点达到了临界值。
  • 错误复杂性修剪—生成一系列树,每个树通过对整个树进行不同程度的修剪来生成,并通过使用独立数据集评估其性能来选择其中一个树。
  • 减少错误修剪—在整个树中运行独立的测试数据,并且对于每个非叶节点,比较来自该节点的子树被保留还是被移除时的错误数量。使用新的测试数据,被修剪的节点通常会比子树产生更少的错误。发现性能差异最大的节点被剪除,并且继续这个过程,直到进一步的剪除将增加误分类率。

当谈到在实践中使用决策树时,对于过度拟合没有一个放之四海而皆准的解决方案。设计最佳决策树通常需要反复试验以及一些领域知识,因此,应该尝试许多上述方法。这是一个称为超参数优化的过程。

进一步的考虑

到目前为止所讨论的内容涵盖了决策树分类器背后的主要理论,这一部分(希望)回答我们可能有的任何剩余问题或考虑。

处理不一致的数据 —在现实世界中,数据集并不总是像我们希望的那样整齐,不一致的数据就是一个例子。当两个相同的观察值具有不同的类别标签时,会出现不一致的数据,在我们的数据中,如果两个水果具有相同的高度和宽度测量值,但由于一个是梨,另一个是苹果而具有不同的标签,则可能会出现这种情况。显然,在这种情况下,最终的叶节点不可能是纯的,因为没有我们可以选择的特征来区分这两种水果。当这种情况发生时,通常的方法是将所讨论的不纯节点的类预测设置为该节点中多数类的预测。换句话说,如果这个节点包含五个苹果和一个梨,决策树将预测这个节点中的新观察结果被标记为苹果。然而,如果节点具有来自多数类的相等观察值,则可能必须随机选择标签。

处理缺失值 —当一个或多个观测特征由于某种原因没有包含在数据中时,就会出现缺失值。如果我们的数据包含一个苹果,宽度值为 7.5 厘米,但没有高度测量,那么这将被认为是一个缺失值。缺失值观察是有问题的,因为任何缺失的特征都不能被考虑用于分割,并且这扰乱了构建决策树的整个过程。在决策树的早期版本中,带有缺失值的观察值被简单地从构建过程中丢弃。然而,最近出现了复杂的方法,允许保留缺失值的信息。

R 的rpart包中使用了一种这样的方法,它确保任何具有因变量和至少一个自变量的值的观察值都将参与建模。使用这一程序,信息增益公式进行了微小的调整,以考虑到在选择分割时包含缺失值的观测值。一旦定义了分割,就引入了替代变量的概念来进行预测。这些可以被认为是在相关特征缺失的情况下使用的备份变量。创建一个备选替代变量的排序列表,如果它们产生的结果比盲目采用多数类更好,则保留它们。这种方法允许我们使用带有缺失值的观察值来构建决策树以及进行预测。

斜分割 —到目前为止,我们只考虑了基于单个特征的分割,但值得注意的是,我们可以扩展这种方法,考虑使用特征的线性组合。在某些适当的情况下,这些非正交或倾斜分割可能更有效。下面是苹果和梨数据集的倾斜分割示例,其中使用高宽比有利于在一次分割中正确分类所有观察值。然而,使用倾斜分割的好处也伴随着一些缺点,这些缺点包括可解释性降低以及缺失值和异常值的影响增加。

同样值得注意的是,上面的决策树也是所谓的决策树桩。决策树桩是一棵决策树,其根节点只有一个单独的分支,所有创建的节点都是终端节点。

基尼系数 —基尼系数是对随机变量新实例不正确分类的可能性的测量,前提是该新实例是根据数据集中类别标签的分布随机分类的。它可以定义为:

在实践中,除了由于使用对数函数而使熵的计算速度略有下降之外,基尼系数和熵的性能实际上没有差别。

回归树——从技术上讲,本博客中讨论的决策树是一种分类树。任务是从有限的可能性集合中识别一个观察值属于哪一类或哪一类(例如苹果或梨)。然而,有时我们的响应变量可以是数字而不是分类变量(例如水果价格),在这种情况下,我们解决的是一个稍微不同的问题。请注意,这仅指响应变量(我们试图预测的)是数字的情况,而不是预测变量(我们用来进行预测的),因为我们已经知道如何处理数字预测变量。在响应变量是数字的情况下,任务变成了回归问题,在这种情况下,我们正在制作所谓的回归树

幸运的是,回归树和分类树没有太大的不同,我们需要做的唯一调整是如何测量杂质。我们现在希望选择使子节点中的误差平方和最小化的分裂,而不是测量节点的杂质。然后,在进行预测时,我们使用观察值所在的任何叶节点的平均值(来自训练数据)。更正式地,对于所有候选分裂,其中是由分裂创建的所有叶的集合,yᵢ是观察值 i 的数值响应值,并且

是给定叶片 c 的平均数值响应值,我们希望选择最小化以下表达式的分割:

R 实施

做得好,一路走到了最后,在 twitter 上关注我以了解未来的帖子。所有观想都是我自己的。

决策树——鸟瞰图和实现

原文:https://towardsdatascience.com/decision-trees-a-birds-eye-view-and-an-implementation-c91754f0dcd0?source=collection_archive---------6-----------------------

本文正被移至我的 子栈发布 。这里 可以免费阅读文章 。这篇文章将于 2022 年 5 月 18 日被删除。

这篇文章的目的是什么?

在该数据集中实现了以下内容

  • 理解决策树的定义

履行

  • 加载数据
  • 使用相关矩阵和配对图可视化数据
  • 构建决策树分类器
  • 使用混淆矩阵确定模型的准确性
  • 将决策树可视化为流程图

什么是决策树?

决策树是一种类似流程图的结构,其中每个内部节点代表对一个属性的“测试”(例如,掷硬币是正面还是反面),每个分支代表测试的结果,每个叶节点代表一个类标签(在计算所有属性后做出的决定)。

(来源:维基百科)

更简单地说,决策树检查一个属性或一组属性是否满足条件,并根据检查结果执行后续检查。该树根据这些检查将数据分成不同的部分。

履行

本文其余部分已移至出版物 机器学习——科学、工程和 Ops 。你可以在这里 免费阅读整篇文章

决策树和随机森林

原文:https://towardsdatascience.com/decision-trees-and-random-forests-df0c3123f991?source=collection_archive---------0-----------------------

决策树是一种用于分类和回归的模型。树回答连续的问题,这些问题把我们沿着给出答案的树的特定路线送下去。该模型以“如果这个比那个”的条件运行,最终产生特定的结果。这一点很容易看出,下图显示了是否要打高尔夫球。

这棵树的流程是从顶部开始向下的。前景有三种选择:晴天、阴天或雨天。如果天气晴朗,我们就去下一层。会有风吗?真的还是假的?如果是真的,我们那天选择不打高尔夫。如果错误,我们选择玩。如果天气转阴,我们将在那里结束比赛。如果天气预报是多雨的,我们将会关注湿度。如果湿度高,我们就不玩,如果湿度正常,我们就玩。

树的深度是一个重要的概念。这表示在我们达到预测的分类之前有多少问题被询问。我们可以看到,在上面的例子中,树的最深处是 2。晴天和雨天的路线都有两个深度。虽然整个树的深度是由它最长的路线来表示的,但是阴路线只有一个深度。因此,这棵树的深度为 2。

使用决策树的优势:

1.易于解释和直观化。

2.内部工作能够被观察到,从而使复制工作成为可能。

3.可以处理数字和分类数据。

4.在大型数据集上表现出色

5.速度极快

决策树的缺点:

1.构建决策树需要能够在每个节点确定最优选择的算法。一种流行的算法是亨特算法。这是一个贪婪模型,这意味着它在每一步都做出最优决策,但没有考虑全局最优。这是什么意思?在每一步,算法都会选择最佳结果。然而,在给定的步骤中选择最佳结果并不能确保当您到达树的最后一个节点(称为叶节点)时,您将沿着通向最佳决策的路线前进。

2.决策树容易过度拟合,尤其是当一棵树特别深的时候。这是由于我们所观察的特异性的数量导致了满足先前假设的事件的较小样本。这个小样本可能导致不可靠的结论。这方面的一个例子是预测波士顿凯尔特人队是否会在今晚的篮球赛中击败迈阿密热火队。该树的第一层可以询问凯尔特人是主场还是客场比赛。第二层可能会问凯尔特人是否比他们的对手,在这种情况下是热火,有更高的胜率。第三关问凯尔特人的头号得分手是否上场?第四关问凯尔特人第二得分手是否上场。第五层询问凯尔特人是否从西海岸连续 3 场或更多的客场比赛回到东海岸。虽然所有这些问题可能都是相关的,但可能只有前两个游戏符合今晚游戏的条件。仅使用两种游戏作为我们分类的基础不足以做出明智的决定。解决这个问题的一个方法是设置最大深度。这将限制我们过度拟合的风险;但与往常一样,这将以偏差导致的误差为代价。因此,如果我们设置最大深度为 3,我们只会问比赛是主场还是客场,凯尔特人是否比他们的对手有更高的胜率,以及他们的头号得分手是否在比赛。这是一个更简单的模型,样本之间的差异更小,但最终不会是一个强预测模型。

理想情况下,我们希望将偏差引起的误差和方差引起的误差都最小化。进入随机森林。随机森林很好地缓解了这个问题。随机森林只是决策树的集合,其结果被聚合成一个最终结果。它们限制过度拟合而不会因偏差而大幅增加误差的能力是它们成为如此强大的模型的原因。

随机森林减少方差的一种方法是对不同的数据样本进行训练。第二种方法是使用随机的特征子集。这意味着如果我们有 30 个特征,随机森林将只在每个模型中使用一定数量的特征,比如 5 个。不幸的是,我们忽略了 25 个可能有用的特性。但是如上所述,随机森林是决策树的集合。因此,在每棵树中,我们可以利用五个随机特征。如果我们在森林中使用许多树木,最终我们的许多或所有特征都将被包括在内。这种包含许多特征的方法将有助于限制由偏差引起的误差和由方差引起的误差。如果特征不是随机选择的,我们森林中的基础树可能会变得高度相关。这是因为一些特征可能是特别具有预测性的,因此,相同的特征将在许多基础树中被选择。如果这些树中有许多包含相同的特征,我们就不会因为差异而产生错误。

也就是说,随机森林是一种强大的建模技术,比单一的决策树更加健壮。他们聚集了许多决策树来限制过度拟合以及由于偏差而产生的错误,从而产生有用的结果。

对于视频格式的教程,请访问我的数据科学课程,网址为https://www.youtube.com/watch?v=v32aJe9Hnag&list = plr CB-x 3137 c 09 bpxjdetzvbygg-hnwz 86&index = 1

用于分类和回归的决策树和随机森林第 1 部分

原文:https://towardsdatascience.com/decision-trees-and-random-forests-for-classification-and-regression-pt-1-dbb65a458df?source=collection_archive---------1-----------------------

A light through a random forest.

亮点:

想要使用更具可解释性的东西,训练速度更快,表现与旧的逻辑回归甚至神经网络一样好的东西吗?你应该考虑用决策树进行分类和回归。这里是关于随机森林的第二部分。

  • 与简单的神经网络相比,训练要快得多,以获得可比的性能(决策树的时间复杂度是[特征数、数据集中的行数]的函数,而对于神经网络,它是[特征数、数据集中的行数、隐藏层数、每个隐藏层中的节点数]的函数)
  • 易于解释的,适用于变量选择
  • 在较小的数据集上相当健壮
  • 决策树和决策树学习很容易理解

链接到我的其他文章:

  1. tensor flow 中的自定义损失函数
  2. Softmax 分类
  3. 气候分析
  4. 曲棍球骚乱和极端值

简介:

决策树及其扩展随机森林是健壮的和易于解释的机器学习算法,用于分类和回归任务。决策树和决策树学习一起构成了一种简单快速的学习函数的方式,该函数将数据 x 映射到输出 y ,其中 x 可以是分类变量和数值变量的混合,而 y 可以是分类变量,也可以是回归变量。像支持向量机、逻辑回归和深度神经网络这样的方法几乎做同样的事情。然而,尽管它们能够处理更大和更复杂的数据集,但它们非常难以解释,并且神经网络在得到好的结果之前可能需要多次迭代和超参数调整。同样,使用决策树和随机森林的最大优势之一是,我们可以根据它们在树中的深度位置,轻松地看到哪些特征或变量对分类或回归有贡献,以及它们的相对重要性。

我们将在本文中查看决策树,并使用从接收方操作特征(ROC)中获得的信息与逻辑回归和简单的神经网络比较它们的分类性能。

决策树:

决策树是一种树(和一种有向无环图),其中的节点代表决策(一个方形框)、随机转换(一个圆形框)或终端节点,而边或分支是二进制的(是/否,真/假),代表从一个节点到另一个节点的可能路径。用于机器学习的特定类型的决策树不包含随机转换。要使用决策树进行分类或回归,可以获取一行数据或一组特征,从根开始,然后通过每个后续决策节点到达终端节点。该过程非常直观且易于解释,这使得经过训练的决策树可用于变量选择,或者更一般地说,特征工程。为了说明这一点,假设你想买一辆新车,沿着一条随机的土路驶入一片随机的森林。您有一个包含三个特征的不同汽车的数据集:汽车行驶类型(分类)、排量(数字)和净空(数字)。下面是一个帮助您做出决策的学习型决策树示例:

I like to go off-roading when I’m not making machines learn.

树的根节点或最顶端节点(只有一个根节点)是使用变量或特征分割数据集的决策节点,该变量或特征导致为分割产生的数据集中的每个子集或类评估的最佳分割度量。决策树通过根据每个决策节点处的分裂度量从根开始递归地向前分裂数据集(以贪婪的、逐节点的方式)来学习。当分裂度量处于全局极值时,到达终端节点。流行的分割指标包括最小化基尼系数杂质(CART 使用)或最大化信息增益(ID3、C4.5 使用)。

举例:

现在我们已经看到了决策树训练是如何工作的,让我们使用 scikit-learn 包(scikit-learn 包含许多漂亮的数据处理、降维、聚类和浅层机器学习工具)并在葡萄酒数据集 (13 个特征/变量和 3 个类)上实现一个简单的分类决策树,然后用 Graphviz 可视化学习的树。

No need to waste money on wine tasting courses.

马上,从学习过的决策树中我们可以看到,特征脯氨酸(葡萄酒中的脯氨酸含量)是基尼杂质值最高的根节点,为 0.658,这意味着三种葡萄酒类别都以此为基础分离。这也意味着,原则上,如果我们在预测模型中仅使用一个特征,脯氨酸含量将允许我们在最多 1-0.658 = 0.342 = 34.2%的时间内正确预测,假设原始学习的决策树预测完美。然后,从根中我们看到,这些类进一步分裂,具有od 280/od 315 _ of _ dilute _ wines特性和 flavinoid 特性。我们还可以看到,大多数 class_1 葡萄酒(81.7%)的酒精含量≤ 13.175,黄素含量≤ 0.795。此外,回想一下,原始数据集中有 13 个特征,但是决策树只选择了 7 个特征的子集进行分类。

我们可以使用该信息来选择一般数据集中的哪些特征/变量对于更高级的模型(如深度神经网络)是重要的(在可能存在无用的、冗余的或有噪声的特征的情况下)。我们将在第 2 部分中看到如何用更健壮的随机森林来实现这一点。通过对一行输入数据进行简单的函数调用,学习到的决策树可用于预测数据。从输入要素预测数值输出值的回归树也可以非常容易地创建:查看这个 scikit-learn 教程

性能:

接收器操作特性(ROC) 是一个曲线图,可用于确定二元或多类分类器的性能和鲁棒性。x 轴是假阳性率(FPR),y 轴是真阳性率(TPR)。ROC 图提供了关于真实阳性/阴性率和假阳性/阴性率的信息,以及分类器预测的每个类别的 C 统计量或 ROC 曲线下面积(AUROC)的信息(分类器预测的每个类别都有一个 ROC)。AUROC 定义为随机选择的阳性样本比随机选择的阴性样本具有更高预测值的概率。引用这篇关于这个主题的文章:

“假设人们对真阳性率和假阳性率之间的特定权衡(即 ROC 曲线上的特定点)不感兴趣,AUC [AUROC]是有用的,因为它汇总了整个权衡范围内的表现。AUC 的解释很简单:AUC 越高越好,0.50 表示随机表现,1.00 表示完美表现。”

不同分类器的 AUROCs 可以相互比较。该指标的替代方法包括使用 scikit-learn 混淆矩阵计算器计算预测结果,并使用结果矩阵得出基本的正/负准确度、F1-分数等。

{0: 0.98076923076923084, 1: 0.97499999999999998, 2: 1.0, 'micro': 0.97916666666666685}

上面的输出是决策树预测的每个类的 AUROC。相比之下,在 scikit-learn 中,我们在一个逻辑回归模型和一个浅层 MLP 神经网络模型上使用 20%的测试集重新运行相同的数据集。逻辑回归模型的性能(使用所有默认参数)如下:

{0: 0.96153846153846156, 1: 0.94999999999999996, 2: 1.0, 'micro': 0.95833333333333326}

对于浅层 MLP 网络:隐藏层= 2,每层节点= 25,优化器= adam,激活=逻辑,迭代= 50000:

{0: 1.0, 1: 1.0, 2: 1.0, 'micro': 1.0}

我们可以看到决策树优于逻辑回归,虽然神经网络打败了它,但它仍然训练快得多,并且具有可解释性的优势。

接下来是什么:

决策树应该总是在熟练的数据科学家和机器学习工程师的工具箱中。有关如何在 scikit-learm 中使用决策树的更详细的用户指南/手册,请参考http://sci kit-learn . org/stable/modules/tree . html # decision-trees

然而,尽管决策树易于使用并且具有明显的能力,但是它们对贪婪学习策略的依赖可能会导致树在每个节点上分割错误的特征,或者导致树过拟合。请继续关注,在下一篇文章中,我将展示集成决策树,或所谓的随机森林和引导聚合,当它们一起使用时,会大大提高对更大和更复杂数据集的预测能力和鲁棒性。我们还将看到如何使用随机森林进行健壮的变量选择。

用于分类和回归的决策树和随机森林第二部分

原文:https://towardsdatascience.com/decision-trees-and-random-forests-for-classification-and-regression-pt-2-2b1fcd03e342?source=collection_archive---------2-----------------------

Forest from the trees, mountains from the dust.

亮点:

在本文中,我们将了解以下内容:

  • 用于鲁棒学习的自举聚合
  • 变量选择的随机森林
  • 随机森林用于快速和稳健的回归、分类和特征选择分析

点击这里链接到第一部分。

链接到 Neptune.ai 关于随机森林算法在哪里会失败的文章:https://Neptune . ai/blog/Random-Forest-regression-when-do-it-fail-and-why

链接到我的其他文章:

  1. tensor flow 中的自定义损失函数
  2. Softmax 分类
  3. 气候分析
  4. 曲棍球骚乱和极端值

简介:

在我的上一篇文章中,我们讨论了决策树以及它们如何用于分类和回归。在这篇文章中,我们将继续我们停止的地方,并介绍集合决策树模型或所谓的随机森林。我们将看到决策树的优势与引导聚合的结合如何使随机森林成为非常健壮而简单的学习模型,与监督学习问题的单一决策树相比,不容易过度拟合。为了感受随机森林的威力,下面我们用它们从公开的飞行路线数据中识别美国政府驾驶的间谍飞机。

引导聚合:

Bootstrap Aggregation 或 bagging 是一种强大的技术,可以减少模型方差(过拟合)并改善有限样本(即少量观察值)或不稳定数据集的学习结果。Bagging 的工作原理是获取原始数据集并创建 M 个子集,每个子集有 n 个样本。从原始数据集中用替换对 n 个个体样本进行均匀采样。下图说明了这一点。

Subsetting for bootstrap aggregation.

在上图中,保留了对应于每个数据点的标签。换句话说,每个数据元组(xy)被采样和子集化,其中每个【xᵢ是输入的向量, Yᵢ 是向量理论上,随着 bootstrap 样本数 M 接近无穷大,bagging 被证明收敛于某个非 bagged 函数估计量的均值,该估计量利用了来自原始数据集的所有可能样本(直观上,这是有意义的)。在随机梯度学习的情况下,例如在神经网络或逻辑回归中,以随机顺序从多个(重复的)数据样本中学习往往会提高学习性能,因为梯度估计往往更多地被“推来推去”,希望克服局部极值。同样,在 Bühlmann 的文章中显示的一个有趣的结果表明,bagging 倾向于将* 偏差添加到 bagged 估计量中,以减少方差为代价。在大多数实际应用中,与方差的减少相比,这种偏差的增加是很小的。一般来说,偏差-方差权衡是统计学习的一个非常重要的方面,在挑选监督学习模型时,这是一个熟练的数据魔术师应该很清楚的事情。*

接下来,为每个 M 引导样本创建 k 个个体学习模型(称为集合)。然后,以某种方式,如投票或简单平均法,对每个单独学习模型的输出进行汇总或平均。下图对此进行了说明。

Bootstrapping and learning ensembles.

一般来说,使用集成模型打包是一种稳健的方法,通过利用引导样本和聚合学习集成的输出(均值、中值、其他更复杂的方法)来减少学习模型的方差和过度拟合。Bagging 和集成是通用的,可以应用于任何监督模型,从神经网络到 SVM 到决策树,以及非监督聚类模型(将在另一篇文章中讨论)。在实践中, M 被选择为至少 50,而 n 是原始数据集大小的 80%。

随机森林:

随机森林是一个由 k 个未训练的决策树(只有一个根节点的树)和 M 个引导样本( kM 不必相同)组成的集合,这些样本使用随机子空间方法或特征打包方法的变体进行训练。注意,训练随机森林的方法不像对一堆单独的决策树应用 bagging,然后简单地聚合输出那样简单。训练随机森林的过程如下:

  1. 在当前节点从可用特征 D 中随机选择 p 特征。特征数量 p 通常远小于特征总数 D
  2. 使用指定的分裂度量(Gini 杂质、信息增益等)计算树 k 的最佳分裂点。)并将当前节点分割成子节点,并从此节点开始减少特征 D 的数量。
  3. 重复步骤 1 到 2,直到达到最大树深度 l 或者分裂度量达到某个极值。
  4. 对森林中的每棵树重复步骤 1 到 3。
  5. 投票或合计森林中每棵树的产量。

与单决策树相比,随机森林通过在每个分裂点选择多个特征变量而不是单个特征变量来分裂。直观地说,决策树的变量选择特性可以通过使用这种特征打包过程得到极大的改善。通常,树的数量 k 很大,对于具有许多特征的大型数据集,数量级为数百到数千。

变量选择:

随机森林的变量选择非常简单。使用 scikit-learn 的 RandomForestClassifier ,让我们加载我们最喜欢的数据集(有高档葡萄酒的数据集),看看我们的随机森林分类器认为葡萄酒分类最重要的特征是什么。滚动 Jupyter 笔记本以查看功能信息图和作为功能数量函数的 F1 平均分数(您可能应该从我的 github 下载 Jupyter 笔记本文件/要点以更好地查看这些图)。

有趣的是,当 n_trees = 1000 时,脯氨酸含量仍然是最具信息量的特征。在我的 Core i7 笔记本电脑上用 1000 棵树进行训练需要几秒钟,这比大多数深度神经网络模型快得多。对于较小的树,颜色强度倾向于出现在顶部。当 n_trees = 1000 时,颜色 _ 强度仍能与脯氨酸含量相当接近。一般来说,您应该扫描超参数 n_trees 并评估诊断图,以更好地了解数据集以及哪些特征是重要的。一旦绘制了每个特征的相对信息/重要性图,高于某个阈值的特征可以用于另一个学习模型,如深度神经网络,低于阈值的特征可以忽略。跨越特征数量的 F1 分数应该在具有有限少数学习者的非常受限的集合模型上完成。笔记本中的 F1 扫描图显示了向模型添加要素或变量的效果,即添加更多输入要素对分类准确性的影响(注意 F1 得分和 AUROCs 仅针对分类问题定义,回归问题需要不同的误差测量,如均方差)。

总而言之:

随机森林可用于稳健分类、回归和特征选择分析。希望你能看到,在你期望得到像样的结果之前,你还需要先运用一些技巧。

关于监督学习问题,对你的简单模型进行基准测试总是一个好主意,比如随机森林与复杂的深度神经网络或概率模型。如果你有任何关于运行代码的问题,或者关于一般生活的奥秘,请不要犹豫问我。

机器学习中的决策树

原文:https://towardsdatascience.com/decision-trees-in-machine-learning-641b9c4e8052?source=collection_archive---------1-----------------------

一棵树在现实生活中有很多类比,事实证明它影响了机器学习的广泛领域,既包括分类,也包括回归。在决策分析中,决策树可用于直观、明确地表示决策和决策制定。顾名思义,它使用树状决策模型。虽然在数据挖掘中它是一个常用的工具,用来导出一个策略以达到一个特定的目标,但它也广泛地用于机器学习,这将是本文的主要焦点。

一个算法如何用树来表示?

为此,让我们考虑一个非常基本的例子,使用泰坦尼克号的数据集来预测一名乘客是否会幸存。以下模型使用数据集中的 3 个特征/属性/列,即性别、年龄和 sibsp(配偶或子女数量)。

Image taken from wikipedia

一棵决策树被倒过来画,它的根在顶部。在左边的图片中,黑色的粗体文本代表一个条件/ 内部节点,基于该条件树分裂成分支/ 。不再分裂的分支的末端是 decision/ leaf ,在本例中,乘客是死是活,分别用红色和绿色文本表示。

虽然,一个真正的数据集将有更多的功能,这只是一个更大的树的一个分支,但你不能忽视这种算法的简单性。特征的重要性是清楚的并且可以容易地查看关系。这种方法通常被称为从数据中学习决策树,上述树被称为分类树因为目标是将乘客分类为幸存或死亡。回归树以同样的方式表示,只是它们预测连续的值,比如房子的价格。一般来说,决策树算法被称为 CART 或分类和回归树。****

那么,后台到底是怎么回事呢?种一棵树包括决定选择哪些特征使用什么条件进行分裂,以及知道何时停止。因为一棵树通常是任意生长的,所以你需要修剪它,让它看起来更漂亮。让我们从一种常用的分割技术开始。

递归二进制分裂

在该程序中,考虑了所有特征,并使用成本函数尝试和测试了不同的分割点。选择具有最佳成本(或最低成本)的分割。

考虑从 titanic 数据集学习的树的早期例子。在第一次分裂或根中,考虑所有属性/特征,并且基于该分裂将训练数据分成组。我们有 3 个特征,所以将有 3 个候选分裂。现在我们将 计算出 准确度 每拆分一次将花费我们多少,使用函数选择成本最低的拆分 ,在我们的例子中是乘客的性别。该 算法本质上是递归的 ,因为形成的组可以使用相同的策略细分。由于这个过程,这个算法也被称为贪婪算法,因为我们有降低成本的过度欲望。这使得根节点成为最佳预测器/分类器。

拆分的成本

让我们仔细看看用于分类和回归的成本函数。在这两种情况下,成本函数试图找到最相似的分支,或者具有相似响应的组的分支。这使得我们可以更确定一个测试数据的输入会遵循一定的路径。

回归:总和(y-预测)

比方说,我们正在预测房价。现在,决策树将通过考虑训练数据中的每个特征来开始分裂。特定组的训练数据输入的响应的平均值被认为是对该组的预测。上述函数应用于所有数据点,并计算所有候选分割的成本。再次选择最低成本的分割。另一个成本函数涉及标准偏差的减少,更多信息可在这里找到。

分类:G =总和(PK *(1-PK))

基尼系数通过分裂产生的群体中反应类别的混合程度,给出了分裂有多好的概念。这里,pk 是特定组中同类输入的比例。当一个组包含来自同一类的所有输入时,出现完美的类纯度,在这种情况下,pk 为 1 或 0,G = 0,其中一个组中具有 50-50 个类的节点具有最差的纯度,因此对于二进制分类,它将具有 pk = 0.5 和 G = 0.5。

什么时候停止分裂?

你可能会问 什么时候停止种一棵树? 作为一个问题通常有一个大的特征集,它导致大量的分裂,进而产生一棵巨大的树。这样的树很复杂,会导致过度拟合。所以,我们需要知道什么时候停止?一种方法是设置在每片叶子上使用的最小数量的训练输入。例如,我们可以使用最少 10 名乘客来做出决定(死亡或幸存),并忽略任何少于 10 名乘客的叶子。另一种方法是设置模型的最大深度。最大深度是指从根到叶子的最长路径的长度。

修剪

一棵树的性能可以通过 修剪 进一步提升。它包括 去除利用低重要性特征的分支 。这样,我们降低了树的复杂性,从而通过减少过度拟合来提高其预测能力。

修剪可以从根部开始,也可以从叶子开始。最简单的修剪方法是从叶子开始,删除叶子中最受欢迎的类的每个节点,如果这种改变不会降低精确度,则保留这种改变。它也被称为减少错误修剪。可以使用更复杂的修剪方法,例如成本复杂性修剪,其中使用学习参数(α)来衡量是否可以基于子树的大小移除节点。这也被称为最弱链接修剪。

手推车的优势

  • 易于理解、解释和形象化。
  • 决策树隐含地执行变量筛选或特征选择。
  • 能处理数字和分类数据吗。也可以处理多输出问题。
  • 决策树需要用户相对较少的努力来准备数据。
  • 参数之间的非线性关系不影响采油树性能。

推车的缺点

  • 决策树学习者可以创建不能很好概括数据的过于复杂的树。这叫做过拟合
  • 决策树可能不稳定,因为数据的微小变化可能导致生成完全不同的树。这就是所谓的 方差 ,需要通过 套袋、 升压 等方法降低
  • 贪婪算法不能保证返回全局最优的决策树。这可以通过训练多个树来减轻,其中特征和样本通过替换被随机采样。
  • 决策树学习者创建偏向 的树如果某些职业支配。因此,建议在拟合决策树之前平衡数据集。

这都是基本的,让你和决策树学习一样。使用提升技术对决策树学习进行了改进。实现这些算法的一个流行库是 Scikit-Learn 。它有一个很棒的 api,只需几行 python 代码就能让你的模型运行起来。

如果你喜欢这篇文章,一定要点击下面的❤推荐它,如果你有任何问题,留下评论,我会尽力回答。

为了更加了解机器学习的世界,跟我来。这是最好的办法,等我多写点这样的文章就知道了。

也可以在 推特直接发邮件给我 或者 在 linkedin 上找我。我很乐意收到你的来信。

乡亲们,祝你们有美好的一天:)

决策树—修剪

原文:https://towardsdatascience.com/decision-trees-pruning-4241cc266fef?source=collection_archive---------7-----------------------

image by Sarah Dorweiler on unsplash.com

我的上一篇博客关注的是决策树的概念,它是随机森林机器学习算法的基础。因为这只是一篇很短的博客(4 分钟阅读),我没有深究细节,但是嵌入了一些(希望)有用的链接。

在这篇文章中,我想更进一步,涵盖:

  • 随机森林如何使用决策树
  • 过度拟合的问题以及如何识别它
  • 修剪决策树以限制过度拟合问题。

正如您将看到的,R 中的机器学习非常简单,通常只需要几行代码就可以让模型运行起来。尽管有用,算法使用的默认设置很少是理想的。

以下代码是准备分类树模型的示例。我使用了“rpart”包,但是“caret”是另一种选择。

Model = rpart(分类器~预测器,data = train_data,method = "class ",control = rpart.control(###))

“分类器”是模型预测的特征,“预测器”是数据集中的独立特征,用于确定分类器结果的概率。

method = "class "语句将确保为分类器(为因子类型变量)做出预测。例如,准备与贷款偿还数据集相关的脚本。分类器是申请人是否“偿还”或“违约”债务,有许多特征(列)可用于预测这一结果。随机森林算法使用许多决策树,这些决策树是使用训练数据的随机段准备的。然后,测试数据集中的每个观察值通过每个树运行,以独立地对分类器的结果进行预测。由最大数量的树预测的分类代表模型的预测。如果大多数树预测贷款将被偿还,那么这就是模型的预测。

测试数据$预测

Once a prediction vector was created, the overall accuracy of the models could be calculated and a confusion matrix produced showing which of the two outcomes (repaid and default) the model was best at predicting.

准确度 =平均值(测试数据\(预测==测试数据\)实际结果)

混淆矩阵 =表格(测试数据\(预测,测试数据\)实际 _ 结果)

在我在 Data Camp 完成的一个活动中,我比测试标准决策树和我修剪过的版本的准确性的要求更进一步。修剪的原因是由基本算法准备的树可能倾向于过度拟合,因为它们变得非常大和复杂。下面我展示了使用不带调整参数的基本算法生成的决策树。不要担心字体太小而无法阅读,我只是简单地强调了在没有添加控制参数的情况下树可以有多复杂。

当我修剪树的时候,我测试了 minsplit(在被‘修剪’之前出现在叶子中的观察数量)和 maxdepth(一个分支中的最大节点数量)的不同值。如果你喜欢快速更新的话,这个术语在我之前的博客中已经全部介绍过了!

我发现一个复杂度显著降低的树实际上提供了一点准确性的提高——我的目标是保持准确性稳定!原始模型在违约和已偿还住房贷款方面产生了类似的准确性水平,而新模型在预测违约贷款方面有了显著改善,其已偿还贷款预测的准确性下降较小。这将是值得探索的,但是复杂性的大幅降低仍然产生了很好的结果。

这是我为标准树和修剪树准备的代码。只有少量的代码,还有很大的改进空间!

# Trees prepared with no pruning
# prepare model
lm <- rpart(outcome ~ ., data = loans_train, method = “class”, control = rpart.control(cp = 0))# prepare predictionloans_test$PredLM <- predict(lm,loans_test, type = “class”)# calculate overall accuracymean(loans_test$PredLM == loans_test$outcome)# prepare confusion matrixtable(loans_test$PredLM,loans_test$outcome)# plot treerpart.plot(lm, type = 3, box.palette = c(“red”, “green”), fallen.leaves = TRUE)# Trees prepared with pruning# prepare modellmp <- rpart(outcome ~ ., data = loans_train, method = “class”, control = rpart.control(cp = 0, minsplit = 250, maxdepth = 6))# prepare predictionloans_test$PredLMP <- predict(lmp,loans_test, type = “class”)# calculate overall accuracymean(loans_test$PredLMP == loans_test$outcome)# prepare confusion matrixtable(loans_test$PredLMP,loans_test$outcome)# plot treerpart.plot(lmp, type = 3,cex = .7, box.palette = c(“red”, “green”), fallen.leaves = TRUE)

决策树——理解可解释的人工智能

原文:https://towardsdatascience.com/decision-trees-understanding-explainable-ai-620fc37e598d?source=collection_archive---------5-----------------------

可解释的人工智能或 XAI 是人工智能的一个子类,与“黑盒”模型相反,模型做出的决定可以被人类解释。随着人工智能从纠正我们的拼写和定向广告转向驾驶我们的汽车和诊断病人,验证和证明得出的结论的需求开始得到优先考虑。

为了开始深入这个领域,让我们看一个简单的 XAI 模型:决策树。决策树很容易阅读,甚至可以通过将选择分成许多小的子选择来模仿人类的决策方法。一个简单的例子是当一个人离开高中时,如何评价当地的大学。假设学生心中有一门课程,一个简单的决策过程可以是:

如果第三方可以访问“模型”和所需的变量,学生如何得出他们的结论可以很容易地得到证明。

这种相同的结构可以应用于监督学习,目标是创建一个最好地描述训练数据的决策树。然后,该模型可用于理解变量之间的关系或用于预测应用。

该算法

决策树的构建是作为一个推理过程来完成的。

  1. 估计哪个变量给出最大的信息增益。信息增益是自变量状态已知时因变量熵的减少。
    那里有很多大词。
    本质上,这衡量了当我们根据因变量的值将自变量分成组时,自变量的组织程度。
  2. 选择在组织中提供最大增加的因变量,并根据该变量分割数据集。
  3. 此时,三个条件之一必须为真:
    -因变量现在只取一个值。在这种情况下,树的这一分支是完整的,我们已经达到了我们的“决定”。
    -因变量取> 1 值。在这里,我们简单地回到第一步,并尝试进一步缩小范围。
    -因变量取值> 1,但我们没有更多的自变量来分割数据。在这里,我们简单地说一下决策可能采取的值,并根据每个选项的相对比例估计每个值的概率。

计算信息增益

首先,我们需要一个组织或熵的公式。为了计算因变量的熵,我们使用:

下图显示了 Y(其中 Y 有两种状态)的熵是如何随着每种状态的概率而变化的。当一个状态的概率为 0 时,熵也为 0,因为这是 Y 最有组织的时候,而当 Y 在两个状态之间平均分配时,熵最大。

扩展这一点以增加已知独立变量 X 对熵的影响:

信息增益现在被定义为我们知道 X 和不知道 X 时的熵之差。

把密码给我!

这里没有包括一些计算熵和创建图形的函数。

def decide(Y, X_dict, previous_node):
    #Calc info gain for each X
    max_IG = 0
    var_to_split = None#Calculate information gain to find out which variable to split on
    for x in X_dict.keys():
        IG = InfoGain(Y, X_dict[x])
        if IG > max_IG:
            max_IG = IG
            var_to_split = x#See if all variables have been used and none are left.
    if var_to_split == None:
        Y_options = list(set(Y))
        tot = float(len(Y))
        count = [0 for _ in range(len(Y_options))]for op in range(len(Y_options)):
            for i in range(len(Y)):
                if Y[i] == op:
                    count[op] += 1
        #Format Node label
        Prob = ""
        for op in range(len(Y_options) - 1):
            Prob += "P("
            Prob += str(Y_options[op]) + ")-> "
            P = float(count[op]) / tot
            Prob += "{0:.2f}".format(P)
        #Make a new node
        nodename = node(Prob, color = "orange")
        edge(previous_node, nodename)
    else:
        print("Splitting on {0}".format(var_to_split))
        X_options = list(set(X_dict[var_to_split]))
        #Make decision variable node
        Var_nodename = node(var_to_split, color = "red")
        edge(previous_node, Var_nodename)
        #Init new data for each new branch of the tree
        for X_option in X_options:
            X_nodename = node(str(X_option))
            edge(Var_nodename, X_nodename)
            New_X_dict = {}
            #get remaining variables
            for key in X_dict.keys():
                if key != var_to_split:
                    New_X_dict[key] = []
            New_Y = []
            #Populate
            for i in range(len(Y)):
                if X_dict[var_to_split][i] == X_option:
                    New_Y.append(Y[i])
                    for key in New_X_dict.keys():
                        New_X_dict[key].append(X_dict[key][i])#Check if this is a terminal node:
            if len(set(New_Y)) == 1:
                nodename = node(str(New_Y[0]), color = "green")
                edge(X_nodename, nodename)
            else:
                #No terminal node, so try again
                decide(New_Y, New_X_dict, X_nodename)Y, X_dict =  import_golf('golf.csv') #import data
root_node = node("root", color = "blue") #Create the first node
decide(Y, X_dict, root_node) #start the tree

对于高尔夫数据集,输出以下树,这是解释决策过程的简单方法。

解码人工智能

原文:https://towardsdatascience.com/decoding-ai-47b3e6840f9d?source=collection_archive---------5-----------------------

无论你走到哪里,人们似乎都在谈论一件事。好吧,我是说除了唐纳德·特朗普和他令人不安的搞笑行为。那就是 AI。有些人抑制不住自己的兴奋(‘哟,人工智能要改变世界了!’)。还有那些不确定的(“我们真的还没有完全理解人工智能会对一切产生的影响”)。最后,那些已经宣布天启降临到我们头上的人(‘人工智能将吞噬人类。准备去死吧!)。事实上,它已经成为一个被滥用的术语,被断章取义地使用,并且经常被错误地用于很多事情。

但是人工智能到底是什么?我相信你也想知道,你是否会向一群批判性的朋友承认这一点,他们会呆呆地看着你,指出你盔甲上的一个裂缝,这是人工智能今天已经成为的鸦片。所以让我们来看看我们是否能把它分解一下。

如果你偶然看到这个页面,你可能已经有了一些基本的知识——AI 代表人工智能——从语义上来说,它很容易理解,因为这两个词本身是不言自明的。然而,你确实需要透过表面去触及它的核心。我们会一个一个来。

人工:

人工的字典含义是‘引起或产生的,与自然存在的’相对。换句话说,它意味着某种被创造、制造、模拟的东西。在人工智能的背景下,人工性来自于进行创造、制造和模拟的机器。

智能:

你可以尝试用许多方法来解释智慧的含义。但最核心的是,在考虑多个参数的同时,做出复杂决策和结论的能力。想一想——这难道不是人类区别于所有其他物种的地方吗?这难道不是他们考虑事实(清晰或模糊)、权衡事实、确定替代方案并最终得出结论的能力吗?这个决定或结论可能很简单,比如“我会看敦刻尔克,因为我想我会喜欢它。”或者更复杂的东西,比如国际象棋中的一步棋。

所以让我们把这两件事放在一起理解 AI。用最简单的方式来说,人工智能是一个让机器能够复制人类智能的概念,即基于现有事实做出决策和得出结论的能力。这些事实可能是二元的或模糊的(这些术语我将在后面的帖子中解释),就像人类决策可用的参数一样。

这就把我们带到了下一个关于人工智能的问题——一个非常现实的问题:为什么?为什么我们需要机器来做人类可以做的决定?AI 的好处是什么?虽然这本身是一个巨大的话题,但我将在用外行人的术语解释人工智能的更广泛尝试的背景下,重点回答这个问题。

让我们回到我们得出的定义——AI 是指机器根据现有事实做出决策。在这方面,机器比人类有一些明显的优势,其中主要有以下四点:

(1)机器没有偏差。人类有。如果我们谈论的是纯粹的、基于逻辑的决策,这些偏见有时会成为障碍。例如,一台机器不会仅仅因为早上与配偶争论该轮到谁倒垃圾而心情不好,从而做出次优决策!

(2) 机器可以拥有高得多的计算能力。因此,他们可以从字面上列举所有不同的排列和相关因素的组合,并计算他们的结果值,以达到最佳决策。虽然人类肯定可以从概念上理解这一点,但他们并不具备在头脑中实际拥有数千甚至数百万行数据并据此打分的能力。这是计算机能够在逻辑驱动的游戏(如国际象棋)中持续击败人类的主要原因之一。当计算机采取行动时,它会考虑你可能采取的所有下一步行动,并据此做出决定。(补充说明:象棋本身是一种有无限可能性的游戏,因此在数据和人工智能的背景下研究象棋是一件非常有趣的事情)。

(3) 机器不会犯‘人为错误’。这是一个术语,通常用于描述无意中发生的错误,因为男人(或女人)不是机器!可能改变结果的小错误,例如,在餐馆手动计算总账单金额时,您无意中漏掉了一项。换句话说,一旦被编程,一台机器将永远(或者至少直到它发生故障、出现错误或需要升级)完全按照预期做事情。

(4) 机器不需要休息。还是睡觉。或者周末。或者假期。或者生病的叶子。你明白我的意思。从生产率的角度来看,这显然是一个非常相关的因素。

人工智能驱动的方法也有明显的缺点,其中几个非常重要,特别是从社会学的角度来看。它最终归结为人工智能被使用的背景。

在我结束之前,简单说一下人工智能的历史。虽然围绕它的讨论最近变得非常激烈,甚至在自动驾驶汽车成为现实的时候辩论也很激烈,但人工智能绝不是最近的现象。这种想法在你能想到的最早的时候就已经存在了。你甚至可以在古希腊神话中找到它的典故。亚里士多德(公元前 4 世纪)被认为发明了第一个演绎逻辑系统(这是人工智能的关键)。第一台从人类手中接管计算的数字机器是计算器,它的原始版本是由帕斯卡在 1642 年发明的。

当然,在过去的几十年里,变化的速度是惊人的,而且只会越来越快。我认为我们现在非常接近哲学需要进入技术领域的地方,以确定人工智能的未来。问题不再是‘我们能让机器做这件事或那件事吗’(你能想到的大多数事情的答案都是肯定的),现在的问题是‘我们想在哪里做这件事?’

使用数据科学解码 BuzzFeed 标题

原文:https://towardsdatascience.com/decoding-buzzfeed-headlines-using-data-science-25198eb25082?source=collection_archive---------6-----------------------

不管你喜欢它还是讨厌它(就我个人而言,对它着迷),Buzzfeed 有其独特的方式来捕捉我们短暂的注意力,他们的魔力很大一部分在于他们如何创建他们的标题。我采用洞察驱动的方法,使用各种机器学习和 NLP 实践来分析 BuzzFeed 最常见的标题。

An overview of my analysis

1.数据收集和清理

使用 newsapi.org 的 BuzzFeed API ,我可以一次从网站上查询多达 50 个头条新闻。我连续一周每天两次抓取 50 个标题,这给了我大约 700 个标题。
完成后,我通过删除非英语句子和无用的 Unicode 字符清理了文本数据。

2.数据告诉我们什么

preliminary plotting of some descriptive stats

互联网上的普遍共识是,标题的理想长度在 50-70 个字符之间。BuzzFeed 标题的平均长度大致在这个范围内。由于这是一个寻找 BuzzFeed 最经常出现的标题结构的任务,我将搜索范围缩小到 11 个单词的标题,并继续进行词性标注,以发现最流行的单词序列。

the most popular sequence followed a CD, NNS, WDT, VBP pattern

我们可以看到 BuzzFeed 喜欢用数字开始标题。以数字开头的标题几乎总是会引出一篇基于列表的文章,比如“30 样 10 美元以下的东西永远有用”。现在我不是列表心理学和它们为什么吸引我们的专家,但是对于任何感兴趣的人来说,有几个来源可以解决这个话题。

下一个词类:名词。很明显,这些标题后面都有名词(单数或复数)。

popular nouns used

这里没有什么太令人惊讶的。这些都是我们所有人在某种感官层面上都可以联系到的名词。显然是为了吸引大众。

真正引起我注意的是序列中使用的第四个词——“威尔”。
举个例子:“如果你是健身房会员,你会明白的 14 件事”。很快,我们可以看到“will”这个词是如何产生预期效果的。不点击标题会有一种看不见但很明显的代价——没有发现的代价。

现在我们有了合适的结构,我们可以看看标题的其他特征,比如情绪:这些常见的标题通常是正面的、负面的还是都不是?

双峰分布确实表明有一些正面倾斜的标题,但总体而言,它们是中性的。然而,这种评估也有局限性。一,BuzzFeed 标题倾向于使用表情符号和相关标点符号(比如!!!')是我在数据收集过程中天真地清理掉的。我还使用了一个基本的情绪分析模型,这个模型可能漏掉了俚语、不寻常的比较和其他情绪信号。尽管有这些担心,当我查看模型归类为“中性”的句子时(如下所示),似乎没有太多的错误分类。我自己不能手动将这些句子分为积极或消极:它们天生没有主见,这与我最初的期望相反。这又回到了我之前的观点,即 BuzzFeed 如何利用预期作为一种工具来激起读者的兴趣。这些中性的标题(占大多数)导致文章旨在传达一些你“需要”拥有的信息。

neutral headlines

3.创建简单的 BuzzFeed 标题生成器

在我继续本节之前,让我们总结一下目前为止我们对 BuzzFeed 标题的了解:

  • 标题简洁,每个大约 7-14 个字。
  • 最常用的标题结构是[CD、NNS、WDT、VBP……],即一个数字后面跟着一个名词(大多是复数),再后面跟着一个 Wh-word 和一个动词(大多是“will”)。
  • 标题透露了文章内容的很多信息。他们不一定是“点击诱饵”:在我看来恰恰相反。它们确切地告诉你你将会得到什么——基于列表的文章揭示了你想要/需要知道的一些信息。
  • 他们在情感上大多是中立的。我不认为“期待”属于“积极”或“消极”的范畴。这些标题的目的是尽可能高效地引发你的好奇心。在大多数情况下,他们不需要借助任何极端情绪来实现这一点。
  • 注意:我不能强调这一点。以上分析仅适用于本文指定的标题的具体结构。BuzzFeed 利用了其他几个有趣且值得研究的标题结构。

好吧,让我们创建一个简单的算法来尝试复制这个结构:

structure I employ

Output

我觉得产量不错。其中一些标题看起来很荒谬(虽然很搞笑),但它们对我们的目的很有用。
为了更进一步,我想看看分类模型是否能够识别这种结构。为此,我需要一个不同来源的标题数据集。

4.测试

我决定从 ABC 新闻中查询大约 500 个标题。我将数据集与 BuzzFeed 数据集相结合,创建了一个训练和目标集,其中包含标题的矢量化版本,目标变量中的“1”表示它是 BuzzFeed 标题。然后,我将一个简单的支持向量分类器模型用于训练集。

该模型在测试集上实现了 83.84 的准确度,具有许多假阳性(低精度、高召回),即,有 13 种情况下,该模型认为 ABC 标题是 BuzzFeed 标题。使用我们的标题生成器生成的 1000 个标题,模型预测所有标题都是 BuzzFeed 的。因此,我们生成的标题的结构确实有点像 BuzzFeed。注意,我用来生成标题的随机名词和动词不是取自 BuzzFeed 语料库(我取自 WordNet 字典)。

结论和附加内容

我写这篇文章的目的不是为了最好地复制 BuzzFeed 标题,而是为了分析它的结构,并了解它们为什么有效。因此,我选择了他们最流行的标题格式,并试图根据提供给我的数据进行推断。你可以在这里访问我使用的的所有代码和数据。

我使用了一个预训练的递归神经网络(RNN) 来根据 BuzzFeed 标题生成文本。下面是我得到的输出示例(4 个时期后):

现在它们看起来并不完全像我们讨论过的标题,但是以某种不可思议的方式,它们确实展现了我们已经详细讨论过的性质。他们以一个数字开头,后面跟着一个复数名词,他们使用将来时来进一步引起你的注意。迷人的东西。

深度学习热潮背后的真正原因

原文:https://towardsdatascience.com/decoding-deep-learning-a-big-lie-or-the-next-big-thing-b924298f26d4?source=collection_archive---------6-----------------------

Photo by Ryoji Iwata on Unsplash

一个简单的英文解释,减去数学,统计和代码

更新:这篇文章可以在 日文 阅读(感谢 Koki Yoshimoto)。

深度学习创造了一个完美的二分法。

一方面,我们有数据科学从业者对此赞不绝口,每个人和他们的同事都投身于学习,并从这种被认为是改变游戏规则的技术中发展出自己的事业。

然后每个人都想知道这是怎么回事。随着众多分析技术被预测为解决商业问题的灵丹妙药,人们想知道这个额外的'酷东西到底是什么。

Photo by Sandro Schuh on Unsplash

对于业务方面的人来说,没有简单的途径来获得简单直观的理解。谷歌搜索让人陷入神经网络的深层,或者被数学符号弄得晕头转向。关于这一主题的在线课程充斥着一大堆统计术语。

一个人最终会屈服,并最终接受所有的炒作。这里有一个尝试,用简单的英语和不到 5 分钟的时间,去神秘化和民主化对深度学习(DL)的理解。我保证不会向你们展示人类大脑的老套图片,或者蜘蛛网:-)

那么,什么是深度学习呢?

先说机器学习(ML)的基本前提。这种尝试是教机器如何在有一些输入的情况下得到想要的结果。比方说,当显示过去 6 个月的股票价格时,预测明天的价值。或者,当看到一张脸时,识别这个人。

机器学习如何做这样的事情,避免每次都需要费力的指令。

深度学习只是机器学习的弟子(或者说,学科),但是智商更高。它做的事情和上面一样,但是以一种更聪明的方式。

还有,它和机器学习有什么不同?

让我用一个简单的人脸检测的例子来解释一下。

Pic: “Jimmy answering questions” by Beatrice Murch derivative work: Sylenius, licensed under CC BY 2.0

使用机器学习的传统人脸识别包括首先手动识别人脸上的明显特征(例如眼睛、眉毛、下巴)。然后,一台机器被训练将每一张已知的脸与这些特定的特征关联起来。现在展示一张新面孔,机器提取这些预设的特征,做一个比较,得到最佳匹配。这个效果一般。

Pic: Machine learning is fun.. by Adam Geitgey

现在,深度学习如何解决同样的问题?过程几乎是一样的,但是记住这个学生更聪明。因此,代替填鸭式的标准面部特征,你让模特创造性地找出该注意什么。它可能决定了人类面部最显著的特征是左脸颊的弯曲,或者前额有多平。或者,也许是更微妙的东西。

Facial features identified by some of the interim layers of DeepFace DL architecture

当看到大量这样的对时,它会默默地找出输入(脸)和输出(名字)之间的联系。然后,当出现一张新面孔时,瞧,它神奇地恢复了正常。与早期的识别技术相比,DL 在准确性和速度上都将球击出了公园。

Icons by hunotika, MGalloway(WMF), Google [CC BY 3.0)] via Wikimedia Commons

但是,为什么他们总是展示人脑的图片?

公平地说,这里有的联系。

让我们回顾一下孩子是如何学习第一课的。你展示带有大象图片的卡片,并大声朗读出来。几次这样的例子之后,当婴儿看到任何类似大象的东西时,她马上就能认出来。不管姿势、颜色或背景如何。我们没有教她象鼻、长牙或耳朵的形状,但她完全学会了。而她正好得到了

Photos by Picsea, Anita Jankovic, Anna Stoffel, Chris Rhoads on Unsplash

正如我们不确定婴儿是如何学会识别大象的组成部分一样,我们也不知道深度学习背后的技术神经网络是如何解决这一问题的。这是人类大脑和神经连接的所有相似之处涌现的地方,但我将在这里停下来,为您省去这些麻烦。

只要知道深度学习在自动识别任何给定数据(面部)中最有区别的信号(特征)方面非常智能就足够了。换句话说,它在特征提取方面是个高手。当给定大量的输入-输出对时,它就能确定学习什么和如何学习。

深度学习在任何呈现的实体中找出最强的模式——一张脸、声音甚至一张数字表。

这对机器学习来说有这么重要吗?

是的,它很大。

尽管机器学习取得了巨大的进步,但这门学科面临的最大挑战是……你猜对了,特征提取。数据科学家度过不眠之夜,发现输入(客户行为的一百个因素)和输出(客户流失)之间的联系。然后机器就可以方便地从中学习。

因此,最高精度和较差结果之间的区别在于最佳特征的识别。现在,由于深度学习,如果机器也能自动完成这种繁重的工作,那岂不是很棒?

模式识别机对商业有什么用?

很多。

深度学习可以应用在任何有机器学习设备的地方。它可以轻松地研究结构化数据问题,这是传统算法占主导地位的领域。基于我们所看到的,它可以破坏学习周期,并将准确性推到令人眩晕的水平。

但对巴克来说,最大的冲击是在 ML 还没有快速起步的领域。以图像、视频、音频或普通旧文本中的深层含义为例。深度学习已经粉碎了这种需要机器识别、分类或预测的数据类型的问题。让我们来看几个。

  • 先进的 人脸识别技术正在现实世界中看到早期应用,图像质量或曝光不再是制约因素。
  • 它不仅使探测动物物种成为可能,还让我们能够给海洋中的每一条鲸鲨命名。向座头鲸威利问好!
  • 自从 DL 接手以来,语音识别技术的进步将错误率降低了 30%。大约两年前,他们在这个领域打败了人类。
  • DL 赋予了机器艺术能力,并且使图像合成和风格转换有趣应用成为可能。
  • 多亏了数字图书馆,才有可能从文本中提取更深层次的含义,并且有初步尝试来解决假新闻的棘手问题。

Object detection using Deep learning on Tensor flow, by Diego Cavalca

这一切都太顺利了,不是有一个陷阱吗?

嗯,深度学习最大的优点真的是它的缺点。人类不需要识别显著特征的事实意味着机器定义了它认为重要的东西。我们人类是理性的动物,我们对任何不符合模式的东西都有困难。

当一个人试图解释机器识别的特征的意义,或者试图透明地解释为什么机器的决定必须被执行时,麻烦就在这个天堂酝酿了。毕竟,一个商业决策者在一个神秘但准确的推荐工具面前赌上数百万,或者更糟的是把人们的生活置于神坛之上,这种感觉有多舒服呢?这个工具是多年前发明的。

深度学习算法的可解释性和结果的可视化解释是一个快速发展的领域,研究正在快速赶上。是的,它需要大量的数据才能开始。因此,是的,在这个领域有一些小问题,但目前来看,恒星和稳定的结果显然大于缺点。

所以,这就是坚果壳里的深度学习。请在下面分享您的反馈。

如果你觉得这很有趣,你会喜欢我写的这些相关文章:

对数据科学充满热情?随时在LinkedIn上加我,订阅我的 简讯

这是这篇文章的 5 分钟视频。

解码基因组变异分析

原文:https://towardsdatascience.com/decoding-gene-set-variation-analysis-8193a0cfda3?source=collection_archive---------6-----------------------

从基因表达数据表征生物途径

基因组变异分析是一种从基因表达数据集中表征途径或特征摘要的技术。GSVA 建立在基因组富集分析的基础上,其中一组基因在样品中定义的两个条件组之间被表征。GSEA(基因集合富集分析)致力于研究两组定义的基因之间的不同表现。你需要了解 GSEA 才能继续吗?绝对不行。你唯一能从 GSEA 那里学到的是,它使用了一个非常基本的概念,叫做“运行总和”,我将在这里解释它。

我为什么需要 GSVA?

原因很简单,因为 GSEA 依赖于表型数据,而样本是以这样一种方式来看待的,即两组样本(它们的表型我已经知道了)必须进行比较。如果我想在不依赖于表型信息的情况下研究我的样品中某一途径的富集,该怎么办?如果我想问,这个途径或基因信号在这个样本中表现如何呢?基因变异分析可以帮我解决这个问题!

让我们开始吧,因为你(可能)更想知道它是如何工作的。我首先通过将 GSVA 应用于胰腺癌的实际数据集来解释它在表面上是如何工作的,然后我们通过查看它对极小的数据集做了什么来深入它。如果你已经对 GSVA 有了大致的了解,你可以跳到后者。

GSVA 的脚步

将数据拟合到模型中

GSVA 的第一步是用模型估计 RNASeq 或微阵列数据。当你有实际的数据时,为什么还要使用模型呢?因为模型是干净的,没有四肢,容易操作。

RNAseq 数据是通过泊松分布建模的,虽然有些人会认为它实际上是负二项式的,他们没有错,但我们现在就认为它是泊松分布。简而言之,想一个实验,你试着从很远的地方往饼干上撒巧克力碎片——落在饼干上的巧克力碎片的数量可以是 0…任何可能的数字。如果你试图估计一块饼干上的巧克力片数量,它遵循泊松分布。以类似的方式,在一个 RNASeq 实验中,你试图得到所有读数中有多少读数属于一个基因的转录本。转录本是你的巧克力片,基因是你的饼干。这就是为什么一个基因的计数遵循泊松过程。

在微阵列数据的情况下,每个基因的强度被建模为高斯或正态分布。注意,在对数转换的 RNA 序列数据或任何其他连续计数的情况下,从高斯分布估计它是好的,并且当数据具有整数值(例如原始计数)时,泊松核应该用于估计它

使用来自上述分布的所有样本来估计每个基因的累积密度函数。简单地说,CDF 值被分配给每个样本中的每个基因。

这是我们的 RNA 表达数据的样子。我们在 183 个样本中有大约 15,000 个基因。

让我们看看一些基因的拟合分布的 CDF。

已经对每个基因的 CDF 进行了估计。下一步是对每个样本的每个基因进行排序。稍后将阐明我们为什么对每个样本中的每个基因进行排序。请注意,这些排名用于计算 GSVA 分数。

定义基因集合

毫不奇怪,我们需要一套基因来做 GSVA。这些基因组可能来自任何地方——你可能感兴趣的途径,你在实验中发现的基因签名,或者你从 10 年前写的论文中发现的签名。假设我们想研究两个签名:-

  1. 1 型干扰素信号——该信号由 25 个基因组成。
  2. 1 型干扰素刺激基因——这一特征由 125 个基因组成

计算 GSVA 分数——K-S 统计和经验分布

既然我们已经有了排序的基因和基因集合,下一步就是计算 GSVA 分数。这是使用 Klimigrov 随机游走统计来完成的。

K-S 统计是一种判断一个经验分布是否与另一个分布相似的方法。在我们的例子中,我们必须定义两种分布,一种是位于基因集中的基因的分布,另一种是不在基因集中的基因的分布。我们的问题很简单:我们基因集中的基因相对于不在基因集中的基因有多大的变化?

什么是经验 CDF?经验 CDF 只是一种从样本中估计总体真实 CDF 的方法,并且通过使用每个观察值的顺序统计或等级来找到经验 CDF。简而言之,对于从未知分布中抽取的观察值样本 x1,x2,x3…xn,在任意点 x 的经验累积分布函数是值小于或等于 x 的观察值的比例。不要将此与我们之前找到的 CDF 混淆。这个 CDF 是针对基因组合的,不同于先前使用全部数据估计的 CDF。

计算特定样品的基因集中的基因和不在基因集中的基因的分布,并且这两种分布的差异是 K-S 统计量。这一切是如何完成的将在后面的例子中展示。

GSVA 为我们的样本评分

现在你有了每个样本的两个签名的 GSVA 分数。这个分数是什么,它是如何计算的,它能告诉我们什么?一个刺激的例子将更好地阐明这一点。

例子

为了我们的理智,让我们考虑一个有 3 个样本和 10 个基因的数据集。

估计每个基因的 CDF 并找出等级

这里跳过这一步,我们假设已经计算了 CDF。这是因为从如此小的数据中计算 CDFs 会给出一个很差的估计,并且会破坏我们通过一个例子来理解 GSVA 的目的。因此,让我们假设我们已经使用高斯核估计了每个基因的分布,并对每个样本的基因进行了排序。这是队伍。

让我们定义由基因 B、E 和 H 组成的基因集合

让我们分别找出每个样本的 GSVA 分数。注意,样本的 GSVA 评分计算仍然依赖于每个样本,因为每个基因的 CDF 是使用所有样本估计的。

样本 1

在这种情况下,随机行走的思想是逐个迭代每个基因,并检查它是否在基因集中。这种迭代的顺序由样本的基因排序来定义。所以基因是从最积极表达的基因到最消极表达的基因重复的。让我们为样本 1 定义此订单:

随机行走和跑步和

随机漫步是关于计算一个运行总和。这是通过迭代每个基因,并检查它是否位于基因集中来完成的。

我们在这里做了两次随机漫步。一个用于位于基因集中的基因,一个用于不在基因集中的基因。对于第一种情况,我们迭代每个基因并检查它是否在基因集中。

  1. 如果是,将该基因的等级添加到运行总和中。
  2. 如果没有,则不做任何事情,保持运行总和不变。

对于位于基因集合之外的基因,通过迭代每个基因来完成。

  1. 如果基因不在基因集中,则在运行总和中加 1
  2. 如果基因位于基因集中,则什么也不做,保持运行总和不变。

请注意,在计算不在基因集合中的基因的运行总和时,我们并不将它们的等级相加,而只是将运行总和加 1。这给了我们一种直觉,我们想要给基因集中的基因赋予权重,我们对此更关心。

基因集中基因的运行总和

这是基因集合中的基因随机行走的样子。

请注意,基因“E”的“上升”幅度更大,而不在基因集合中的基因(基因“B”和“H”)的上升幅度持续下降。这是因为基因‘E’的等级更高。换句话说,我们与一个基因的表达量成正比。

不在基因集中的基因的运行总和

在找到位于基因集中的基因的运行总和后,我们对不在基因集中的基因做类似的练习。注意每次“上升”的量是相等的。

这是不在基因集中的基因的随机漫步。

样品 1 的 GSVA 分数

在我找到这两个随机漫步之后,我需要量化它们有多大的不同。一种方法是取这两者之间的最大偏差。两者之间的偏差可以是正的,也可以是负的。我考虑两个方向上的最大偏差,并将它们的差值作为 GSVA 分数。

GSVA 得分为 0.57。这是高度阳性的,表明与不在基因组中的基因相比,基因中的基因是正向富集的。

样本 2

请注意,B、E 和 H 基因现在都是排名最低的基因

基因集中基因的运行总和

这是基因集中的基因的随机行走。

不在基因集中的基因的运行总和

这就是随机漫步寻找不在基因集中的基因分布的方式。

样品 2 的 GSVA 分数

GSVA 的分数是-0.71。这是高度负的,表明与不在基因集中的基因相比,基因中的基因是负富集的。

样本 3

注意,B 是排序较高的基因之一,而 E 和 H 是排序较低的基因中的基因。你能猜到这种情况下 GSVA 分数会是多少吗?或许,会接近 0?让我们看看。

基因集中基因的运行总和

这是基因集中的基因的随机行走。

不在基因集中的基因的运行总和

这就是随机漫步寻找不在基因集中的基因分布的方式。

样品 3 的 GSVA 分数

分布混合在一起。GSVA 得分为 0.1,非常接近于 0。这意味着与不在基因组中的基因相比,这些基因既没有正富集也没有负富集。因此,如果基因集合中的一些基因位于较高的等级,而一些基因位于较低的等级,则它们的影响被抵消,并且 GSVA 分数接近于 0。

结论

总之,GSVA 是在逐个样品的基础上量化途径和信号的富集的关键方法。它给出了一种非常聪明的方法,该方法基于简单的直觉,即当我们对所有基因进行排序并寻找基因集的基因在排序列表中的位置时,基因集在样本中的富集将取决于基因的位置。

参考

GSVA 文学

posted @ 2024-10-13 15:19  绝不原创的飞龙  阅读(19)  评论(0编辑  收藏  举报