TowardsDataScience 博客中文翻译 2016~2018(二百八十七)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

这是合同风险管理的个性化指南

原文:https://towardsdatascience.com/this-is-contranalyst-your-personalized-guide-to-contract-risk-management-a77573b80f66?source=collection_archive---------2-----------------------

使用黑客马拉松从 legal JOIN tech 选择合同、风险、大数据;

势不可挡。如果有人问我,我会用这个词来形容柏林法律科技黑客马拉松。进一步的描述也适用,但是让我们暂时忘记它,从头开始。

大数据如何帮助合法用户?哪里有适合培训 IT 系统的充足数据?我们能满足更广泛受众的哪些需求?这些都是我们小组开始活动时提出的问题。

这基本上带来了我们小组在实际黑客会议开始时试图匹配的两种观点:

  1. 客户需要什么?换句话说,从问题和需求导向的角度来看待它。
  2. 什么是容易实现和利用的?也就是说,从可能的解决方案和可行性的角度来看一看。

请注意,在订购透视图时,我们坚持“客户至上”的方法。解决了一个需求,一个业务很可能会随之而来。

在这样的讨论中,我们专业知识和背景的多样性派上了用场。随着所有这些力量的投入,很快,我们预期产品的图像实现了:
contra analyst,用户的“个人”合同分析师,显示特定合同的风险以及总体风险敞口的概述(例如,有多少份合同有潜在的无效条款)。

既然大局已定,就让黑客攻击开始吧…

这个过程是反复进行的,小组全体成员轮流讨论,专题专家轮流准备,小组成员轮流讨论。首先,从时间的角度来看,这被证明是最有效的。另一方面,随着定期锐化迭代,理解很快增加,学习很容易。

在第一轮,马可创造了第一个模型;Xavier 从仪表板设计开始,Idan 负责图表设计,律师们解释了合同的重点,并开始提供合同示例作为输入。将工作并行化,并为了一个共同的目标朝着同一个方向努力。由于黑客马拉松期间的主动联系,我们还获得了免费使用 OCR(光学字符识别)解决方案的机会,该解决方案能够解决 PDF 文档到文本的转换,并简化文本识别过程。很快就看到了第一批成果,已经开始显示什么是可能的。出乎意料的是,我们将要完成我们的项目。

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

An impression of a single contract within ContrAnalyst

然而,很快,第一个障碍出现了:在将第一个合同输入到模型中进行训练之后,我们慢慢地有了一个更好的图像,与很难实现的事情相比,什么是立即可行的,并且需要合理的努力。我们最初测试子句有效性的任务对于一天半的黑客马拉松来说有点太大了。对于小组的大部分成员来说,这有助于我们了解必要的工作以及学习模型的合适输入。

现在,重新聚焦时间。作为开始,我们决定在合同中使用更标准、更容易访问的信息:剩余期限。我们只有很少的训练集(大约 40 份不同的合同),即使这样也很困难;机器学习可以提供惊人的解决方案,但总是以足够多的可用数据为代价;因此,我们提出了进一步降低复杂性的想法,并手动创建了关于术语的不同子句,涵盖了最重要的变体,但大多数都具有某种程度上相似的结构。

最后,通过共同努力,我们从不同的角度和角度研究了这个主题,并在演示中自豪地展示了一个可视化原型,展示了一个仪表板和一个可能的工具结构。我们对结果很满意,柏林法律技术黑客马拉松的评审团也很喜欢,我们很高兴获得了第三名。

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

The dashboard overview in the tool.

感谢评审团、活动的赞助商和价格,更感谢组织者以令人难以置信的动力和精神举办了这场伟大的活动!

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

The final autors: Marco, Idan, Xavier, Nuri and Baltasar

团队(您可以通过媒体联系我们或在 LinkedIn 上找到我们):

  • 我们的设计师 Idan Nesher 能够让几乎所有东西看起来都很吸引人
  • Marco Scaravelli,意大利人,我们的 IT 和机器学习专家
  • Xavier Lavayssière,法国人,也是我们当中最关注顾客的人
  • 努里·卡德姆,律师,非常喜欢
  • 巴尔塔萨·塞韦茨,前 IT 业人士,后成为律师
  • 大卫,另一位律师,不幸地在演讲前离开了

该团队的方法与硅谷最受欢迎的一句名言完美契合:

“试过了。曾经失败过。没关系。再试一次。再次失败。失败得更好。”
(塞缪尔·巴克特在沃斯沃德何)

这就是你谈论酒的方式

原文:https://towardsdatascience.com/this-is-how-you-talk-about-wine-2a41d6844587?source=collection_archive---------15-----------------------

数据科学有助于揭开语言的神秘面纱

喝酒是一回事,理解专家们在谈论葡萄酒时使用的充满形容词的语言是另一回事。如果你和我一样,你已经被比较味道的描述逗乐了,困惑了(赞许!)到“湿花岗岩”或讨论“鼻子”暗示“石墨和铅笔屑”。加上单宁、酸度和余味等术语,偶尔喝葡萄酒的人会想知道这些描述告诉了他们什么。

我们能从所有的描述性术语中解读出什么吗?我们能在葡萄酒评论中找到一些简单的东西来提醒我们什么是我们喜欢的,什么是我们不能接受的吗?

我对 Kaggle 数据集进行了分析,该数据集包含来自葡萄酒爱好者杂志的超过 13 万篇葡萄酒评论,旨在了解专家们用来描述葡萄酒的词汇能告诉我们关于葡萄酒的质量、价格和美味的信息。

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

Fig 1: Pinot word descriptions compared to all wines

我的第一步是比较所有评论中描述性词语的平均使用情况,以及 20 种不同葡萄酒中相同词语的使用情况。任何显著的差异都应该指出是什么让这种葡萄酒变得如此重要。在左边(图 1)你可以看到,如果你喜欢樱桃或覆盆子口味和浅红色,那么黑皮诺可能是你想要的。

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

Fig 2: Sauvignon Blanc descriptions

如果你不是浆果迷,那么长相思值得一试。绝对不能与浆果相提并论,但有很多关于柑橘、苹果和清淡松脆的谈论(图 2)。

看到红葡萄酒和白葡萄酒之间的这种对比并不意外,但是不同类型的红葡萄酒之间的语言有什么不同呢?

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

Fig 3: Syrah descriptions

对于西拉(图 3),你将享受黑色,成熟的浆果味道和一些胡椒味。不像上面的皮诺,你会尝到黑莓而不是樱桃。如果你喜欢这些口味,那么你可能会想继续喝内比奥罗(图 4 ),它能给你更多的浓度和辣味。“坚实”这个词的重要意义在于表达了你品尝的东西的各个组成部分是如何协调工作的。

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

Fig 4: Nebbiolo descriptions

现在你知道了这些区别,你可以试着自己品尝,并在向朋友描述葡萄酒时使用这些术语。总的来说,红葡萄酒是关于浆果、单宁和香料的,而白葡萄酒是关于柑橘、酸和松脆的味道。

你描述的特定浆果或柑橘及其强度取决于你的味蕾。

最后,我将葡萄酒评论中唯一使用的词按照得分(0-100)和价格分类,制成词云。高价酒和高分酒有什么共同点?荣誉:

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

Fig 5: Unique words for wines costing over $200

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

Fig 6: Unique words for wines scoring more than 97 points

有几个描述性的词偷偷放在里面,但没有多少能告诉你酒是什么味道。但是,这是一个很好的赌注,无论是高价葡萄酒还是高分葡萄酒都很好喝。

同样的关系不适用于低成本葡萄酒和低评分葡萄酒:

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

Fig 7. Unique words for wines priced less than $10

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

Fig 8. Unique words for wines scoring less than 82 points

便宜的葡萄酒(图 7)被认为是容易、简单和清淡的。正如我们在第一节中了解到的,苹果、绿色和清洁这些词的出现表明许多廉价的葡萄酒是白葡萄酒。

低分葡萄酒(图 8)没有什么可推荐的。植物性的、乏味的、苦涩的、刺耳的:这些词除了低评分评论外,在任何地方都找不到。

所以,你可以找到一种又好又便宜的酒,但是不要指望用低分的酒就能开心。

我们发现了描述葡萄酒最常用的词,以及它们的用法如何随着葡萄酒的类型和质量而变化。要听起来像专家,有 3 个简单的步骤:

  1. 学会区分酸度和单宁,并描述你品尝时的酸度和单宁含量。
  2. 形容红葡萄酒带有浆果、香料和成熟的味道。用柑橘类水果、苹果和松脆来形容白葡萄酒。
  3. 当其他方法都失败时,就照我做的去做,然后说,“这很好。我会喝了它"

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

这是我作为数据科学家真正做的事情

原文:https://towardsdatascience.com/this-is-what-i-really-do-as-a-data-scientist-d637ed747ef9?source=collection_archive---------4-----------------------

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

source:Pixabay

数据科学越来越受欢迎,许多人正试图加入这一潮流,这很好。但许多人认为,数据科学、机器学习(在这里插入任何其他时髦词汇)是将数据插入一些 Sckit-Learn 库。实际工作是这样的。

为了让您了解上下文,在收集数据后,会发生以下情况。不要误会,我不认为这应该被认为是一个简单的步骤,但我想重点谈谈数据预处理和规范化。

问题是

如果你关注我的博客,你可能会意识到我在机器 2 机器领域做了很多工作。最近在工作中,我试图根据机器的行为,也就是它们的数据消耗,将它们聚集在一起。

这些功能可报告特定服务类别(如社交媒体、音频等)的下载和上传使用情况。为此,让我们假设我们正在查看一个计数器,该计数器查看与 AWS (Amazon Web Services)建立了多少连接。

如果我们按原样获取数据,并决定从中提取聚类,我们会得到如下结果:

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

注意,这是数据的一个 LDA 2 轴表示。LDA 作为 90%的代表因素。即使它不是完美的,聚类也几乎是无用的。在这一点上,一些我建议使用这种或那种算法,并调整超参数,这正是最糟糕的想法。

臭名昭著的数据

现在,让我们开始工作。数据是什么样的。建议你在输入一些来自 sklearn.cluster import KMeans 的*之前要花很多时间。*我们将看一下这个例子的一个具体特征,但请记住,大多数特征都是相似的。

这是 AWS 计数器(不是真的,但我们会假装)。

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

所有的数据看起来都是 0,但如果你仔细看,有价值上升到 3e+7。你怎么能指望用这个创造出任何有意义的距离。即使您将其缩放到 0 和 1 之间,大多数数据也将介于 0 和 0.0000005 之间或类似的值,因此距离不会变得更好。

如果我们观察所有非零数据,我们会发现一些更有趣的东西:

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

数据处理

这开始看起来像一个对数正态分布。现在我们如何使它正常化?至少有一点。所以我的一个同事,Tanguy 有一个非常聪明的主意,关于如何转换对数正态分布。盒考克斯变换。这种转换试图尽可能“正常化”不同的分布,包括对数正态分布。

这个变换试图最小化这个公式中的 lamda 值(图片来自维基百科):

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

在我们的例子中,有太多的零,lamda 会更低,大约是这样:(注意:你只需要得到正值,所以所有的值都加 1)

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

在这张图片中,您可以看到 9 点左右的小凸起,它包含了大部分非零数据。在这一点上,我们已经有了更好的东西,在距离方面好了几个数量级,但仍然可以改进。

我们再把这个数据的来龙去脉带回来。我们正试图对机器行为进行分类。在机器对机器的世界里,这里面隐藏着大量的信息。机器可以使用 AWS。这听起来很可笑,但在这里非常重要。这些机器通常被编程来完成非常特殊的任务,例如报告天气、表演节目等等。他们的任务通常是硬编码的,他们不会随机开始脸书之类的。仅仅是他们可以使用服务(比如 AWS)这一事实就包含了大量信息。因此,我的计划是,我将把 0 保留为 0,然后为其余的数据指定 0.5 到 1 的范围。现在剩下的数据怎么表达… Box Cox 变换。我将在唯一的非零设备上进行转换。

这是它的样子。在左侧,您可以看到所有数据都进行了转换,就像在 0–1 空间中解释的那样。在右边,你有一个在 0.5 和 1 之间的部分的缩放图形。

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

即使左边的图看起来没有那么好,我可以向你保证,对于算法来说,这是一个不同的世界。

结果

因此,在对数据进行预处理后,我们对其运行聚类算法,并且在没有任何定制的情况下,我们得到了结果。

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

结论

我发现人们对算法有点“触发式快乐”,太快地跳到了模型构建上。有人说你甚至不需要理解背后的数学,我不同意,你至少需要理解算法的基础。至少足以理解如何为它准备数据。作为例子,在 K-意味着这是所有关于点之间的距离,当你有这种类型的范围(10e7)你不能指望算法找到字幕模式,它将被范围蒙蔽。

所以拜托,一遍又一遍的看你的数据。到了你觉得可以用手分离它的程度,然后让花哨的算法来完成剩下的工作。

原载于 2018 年 4 月 27 日coffeeanddata . ca

神经网络揭秘 1:分类问题

原文:https://towardsdatascience.com/this-series-is-an-attempt-to-make-neural-networks-understandable-for-people-who-know-nothing-more-df6695b6cd39?source=collection_archive---------1-----------------------

他的系列文章试图让只懂高中数学的人理解神经网络。没有比看着冗长的数学公式和一长串代码却不知道如何使用它们更可怕的了。带走了所有的乐趣!

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

所以事不宜迟,让我们从理解一个简单的分类问题开始,它将温和地介绍神经网络背后的概念。

假设你是一家公司的招聘经理,该公司正在招聘大学生进行暑期实习。你可能会收到一个学生的简历,他的平均绩点是 3.0,并且完成了 10 个个人项目,你决定雇佣这个学生。另一份简历可能有 1.0 的 GPA 和 2 个个人项目,你拒绝了这份申请。现在你需要决定另一份有 2.7 GPA 和 8 个个人项目的简历是否被录取?

为了找到答案,让我们先把现有的数据绘制成图表,x 轴是平均绩点,y 轴是项目数量。

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

蓝点代表被录取的学生,橙点代表被拒绝的学生,灰点代表我们需要决定的学生。现在让我们把过去几年中可能发生的所有接受和拒绝的数据加到我们的图表中。

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

注意蓝点和橙点之间的分隔线,它清楚地告诉你,绩点 2.7 和项目 8 的学生应该被录取。这条线在人工智能/神经网络/ML 行话中被称为“模型”(每当我听到这个术语时,我总是会抓狂,但它真的没有那么糟糕,对吗?).对于我们人类来说,画这条线很容易,但它涉及到仔细绘制每个数据点,然后找到最佳拟合线的平凡任务。好消息,电脑的发明是为了让我们远离这些无聊的工作,这样我们就可以专注于更重要的任务。那么我们如何让计算机为我们找到模型呢?

让我们从一些基本的数学开始,我们将用变量 x1 标注对应于 GPA 的横轴,用变量 x2 标注对应于项目数量的纵轴。因此,蓝色和橙色点的分界线将有一个线性方程:

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

Approximate equation without real numbers

这个等式真正代表的是学生的分数,可以写成以下格式:

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

现在,每当我们想知道一个新学生是否合格时,我们在这个等式中输入每个值,如果分数是正的,那么我们接受这个学生,否则不接受。让我们把 2.7 作为平均绩点,8 作为项目数量。我们得到 3.9 分。学生合格!

在更一般的形式中,我们将有一个用于该模型的方程:

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

或者以矢量形式表示为:

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

在哪里

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

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

我们只取两个向量的乘积。按照惯例,我们将 W 称为权重,x 称为输入,b 称为偏差。我们可以将正面分数标注为 1(蓝点),负面分数标注为 0(橙点)。

最后,我们模型的预测是:

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

这意味着如果分数大于 0,我们的算法将尝试预测 1,如果分数小于 0,则预测 0。我们的算法对数据已有的标签做出的预测越接近,它的表现就越好,这就相当于将蓝点和橙点分开的最佳拟合线。

F 对于这篇文章,我将在这里停下来,我希望到现在为止,对分类问题,它们如何工作以及算法如何试图找到预测已经有了一些了解。这是一些简单的背景,我想在我们深入神经网络的神奇世界之前介绍一下。下次见,再见!

欢迎提出改进意见:)

这会让你知道你有多需要用 Airbnb 旅行

原文:https://towardsdatascience.com/this-will-make-you-know-how-much-you-need-to-travel-with-airbnb-442abd51c8c4?source=collection_archive---------25-----------------------

基于西雅图、波士顿 Airbnb 数据集

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

Photo by Zhifei Zhou on Unsplash

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

Photo by Lance Anderson on Unsplash

这些图片促使你去赶飞机吗?如果你的答案是肯定的,你和我一样是一个“嗜 Hodophile”。暂时远离现实,成为一名观察者是一种充满敬畏的感觉——它让你感激你所拥有的,你所能做的,你的朋友和家人。旅行让你再次成为自己 —万岁!老实说,我最喜欢的回忆之一是在保加利亚坐在长椅上喝着啤酒看着人们走过(那里还好,至少没人说什么)。

我不知道你有多富裕,但作为一名学生,预算一直是一个问题,让我不敢坐飞机。我已经使用 Airbnb 很长时间了,因为我喜欢使用 Airbnb 比使用酒店或其他住宿更自由,此外,我碰巧找到了价格更低的家一样的地方。 然而,在走访不同城市时,我观察到 Airbnb 的价格各不相同。 我早就该走进数据世界了。

数据集由来自 Kaggle 的关于西雅图波士顿 Airbnb 的信息组成,每个数据集有 3818 和 3585 行。我的目标很明确: 【了解 Airbnb 价格】 。为此,我有一些问题,我很乐意与你分享我的答案。

1.两个城市实际上存在价格差异吗?

给你答案,是的有区别。看看我是怎么得出这个答案的。由于单价是 1000 美元,并且由于一些异常值(非常昂贵的 Airbnb ),很难区分两个城市之间的差异。

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

Figure 1: price distributions of Seattle and Boston

经过价格的对数变换后,我可以更清楚地看到这种区别。

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

Figure 2: log-price distributions of Seattle and Boston

我们观察到波士顿 Airbnb 的价格普遍较高,而且更加分散。西雅图对数价格分布显示出更加对称的方面,而波士顿对数价格分布似乎稍微偏左,这意味着波士顿租金价格形成较高。从技术上讲,西雅图和波士顿的对数价格均值分别为 4.68 和 4.94,标准差分别为 0.57 和 0.65。

根据 Trulia ,这对应的是每月租金中位数。平均而言,波士顿的月租金中位数约为 2900 美元,而西雅图的月租金中位数约为 2700 美元。因此,这个结果并不奇怪。然而,有趣的是两个城市的销售价格中位数显示出相反的趋势:西雅图的房地产销售价格中位数平均为 69 万美元,波士顿为 61 万美元。使用价格与租金比率的概念,我们得出波士顿为 17.53,西雅图为 21.30。根据一般经验,如果该比率从 16 到 20,那么购买房产是有风险的,如果是 21+,那么租房比买房好得多。因此,波士顿似乎是一个更有希望买房的地方。

2.同一个主机拥有多少 Airbnb 房产?

自从我确认存在价格差异,我想找到更多的为什么。我的第一个兴趣是少数“超级”主机是否决定了市场价格。是这样吗?

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

Figure 3: Average property numbers owned by a host

波士顿的房东平均拥有更多 Airbnb 房产。这可能意味着,决定 Airbnb 房产价格的主机数量减少了。但是我们现在还不能确定任何事情,所以让我们继续深入研究。

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

Figure 4: Distribution of number of properties in Seattle

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

Figure 5: Distribution of number of properties in Boston

查看单个分布,我们可以确认在波士顿有更多的“超级”主机。因此,我们可以假设这些“超级”主机将波士顿的 Airbnb 价格定得更高。但我没说他们真的有。有了预测模型,我就能知道这个预测器排在哪里了。

3.价格如何基于位置传播——均匀还是不均匀?

我的下一个问题是,位置是否会影响两个城市的 Airbnb 价格,因为繁忙的位置价格较高似乎是很自然的。我使用邮政编码作为位置信息的代理。

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

Figure 6: Seattle location distribution by zip code

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

Figure 7: Boston location distribution by zip code

就扩散程度而言,根据标准差,两个城市的位置分布没有显示出太大差异。然而,我们注意到一个模式,它不是均匀分布的。当我们将分布与来自 Trulia 的租金地图(西雅图波士顿)进行比较时,高比例位置对应于高租金区域;因此对价格分配有更大的影响。

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

Figure 8. Seattle and Boston rent heatmaps

毕竟,大多数 Airbnb 房产都拥挤在城市的热点地区。

4.我的模型能很好地预测价格吗?

嗯,没有什么是完美的——至少在数据科学领域是这样。然而,我对我的预测模型的性能非常满意。在表 1 中,预测价格与实际价格相差不远。

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

Table 1: True price values and predicted price values

*【*我知道这可能让人望而生畏。这只针对好奇的乡亲们 :

我采用了臭名昭著的 极限梯度推进(又名 XGBoost)回归器 作为框架,并结合了穷举 网格搜索交叉验证。 在每次迭代中,用 5 重交叉验证对模型进行评估,并找到给出最佳性能的最佳参数。

与交叉验证 RMSE 相比,测试 RMSE(均方根误差)有所降低,约为每 1,000 美元 78.0201,这是有希望的——这意味着 该模型在野外的表现优于实践中的 !】

如需了解更多详情,请访问我的Github

5.价格最重要的预测因素是什么?

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

Figure 9. Top 10 important features for Airbnb price

现在,我们获得了十大重要功能列表,内容如下:

  • zip_has:邮编所在位置的 Airbnb 房产数量。位置繁忙程度的指示器。
  • 浴室:浴室数量。
  • host _ days:host 托管 Airbnb 房产的天数。
  • 卧室:卧室数量。
  • minimum_nights:您需要预订的最低住宿天数。
  • extra_people:比主人多的客人额外收费。
  • 床位:床位数
  • guests _ included:Airbnb 酒店可以容纳的客人数量。
  • availability_365:一年中可用的天数。
  • 评论数量:评论的数量。

如果你看到上面的列表,它们在预测价格中扮演重要角色似乎是很自然的。第一,如果这个地方是一个旅游景点等繁忙的地方,对住宿的需求应该更多;从而提高了价格。 **浴室、卧室、床的数量反映了舒适度的高低。没有人愿意在洗手间前排队等候或睡在沙发上。如果你已经经营 Airbnb 房产很长时间了,你应该知道市场是如何波动的。从数据科学的角度来看,你更可预测,因为你比一个新主持人更有可能引领市场趋势。**最少住宿、额外客人费用和最多客人人数是由主办方设定的规则,并直接计入价格计算中。所以这三个因素排名靠前是有说服力的。最后,一年中可用的天数和评论的数量反映了 Airbnb 房产的受欢迎程度。自然,高需求导致更高的价格。

我们没有看到“host_has”(一个主人拥有的财产数量)排在前 10 名(实际上排在第 13 名)——这里的一个要点是,我们的本能在某些情况下不是最好的工具,这个世界需要数据科学家!(哈哈)

结论

在这个项目中,我们深入研究了西雅图和波士顿的 Airbnb 数据集,发现了一些有趣的模式:

  1. 波士顿是使用 Airbnb 旅行比西雅图更贵的城市。这一现象符合目前两个城市每月租金中位数的趋势——波士顿的房租更贵。
  2. 波士顿的房东平均拥有更多 Airbnb 房产,也有更多“超级”房东。因此,这可能意味着几个超级主持人可以左右城市的平均价格。
  3. 高比例位置对应于西雅图和波士顿的高租金区域。因此,我们可以假设租金、位置和 Airbnb 价格密切相关。
  4. 根据重要特征,我们知道受欢迎程度、位置、舒适度和物业规则会影响 Airbnb 的价格。

这个项目提出了一些问题,如两个城市的价格是否存在差异,价格如何基于位置传播,以及最重要的预测因素是什么。希望这个项目回答了这些问题,并为你提供了什么可以影响 Airbnb 价格的见解。 我相信这种预测模型可以为顾客提供有关旅行预算和计划的信息,并为主人为他们的房产定价提供参考。

尽管如此,仍有很大的改进空间。我张开双臂欢迎任何反馈和建议 —最后,我们数据科学家分享!做这个项目时,我渴望去旅行,我也想去。无论您在哪里旅行,无论是环游世界还是数据世界。我祝你旅途好运。一路顺风!

与作者联系

你可以在 LinkedIn 上和他联系

如需了解更多详情,请访问他的 Github

参加 Deeplearning.ai 课程后的想法

原文:https://towardsdatascience.com/thoughts-after-taking-the-deeplearning-ai-courses-8568f132153?source=collection_archive---------1-----------------------

更新时间:2018 年 2 月 2 日:当我写这篇博文的时候,只有 3 门课程已经发布。 本专精的 5 门课程现在全部出 。我很快会有后续博文。 ]

简介:

在全职工作和家里蹒跚学步的孩子之间,我用业余时间学习认知科学和人工智能的思想。偶尔会出现一篇很棒的论文/视频/课程,你会立刻被吸引住。

吴恩达新推出的 deeplearning.ai 课程就像那部让人向往的什恩·卡鲁斯拉吉尼坎塔电影

很自然地,课程一在 coursera 上发布,我就注册了,并花了 4 个晚上的时间疯狂地观看课程,完成测验和编程作业。

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

DL 实践者和 ML 工程师通常花大部分时间在抽象的 Keras 或 TensorFlow 级别上工作。但偶尔休息一下,认真学习算法的具体细节,并实际手动进行反向传播也是不错的。它既有趣又非常有用

本课程的内容是:

吴恩达的新 ad venture 是一种自下而上的方法来教授神经网络——强大的非线性学习算法,在初级到中级水平。

在经典的 Ng 风格中,该课程通过精心选择的课程、整齐定时的视频和精确定位的信息块来讲授。Andrew 从他的经典 ML 课程停止的地方开始,介绍了使用单个神经元(逻辑回归)并慢慢增加复杂性(更多神经元和层)的神经网络的想法。在 4 周(课程 1)结束时,学生将了解构建密集神经网络所需的所有核心思想,如成本/损失函数,使用梯度下降和矢量化并行 python(numpy)实现进行迭代学习。

Andrew 耐心地解释了必要的数学和编程概念,以精心规划的顺序和良好的节奏,适合可能对数学/编码生疏的学习者。

课程材料和工具:

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

video lecture

讲座使用演示幻灯片,Andrew 使用数字笔在幻灯片上书写。这似乎是让听众集中注意力的有效方法。我觉得以 1.25 倍或 1.5 倍的速度观看视频很舒服。

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

quiz tool

测验放在每堂课的最后,是多项选择题的形式。如果你看一遍视频,你应该能很快回答所有的问题。您可以尝试多次测验,系统旨在保持您的最高分。

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

Jupyter notebook programming assignment

编程作业通过 J upyter 笔记本完成——强大的基于浏览器的应用程序。

作业有一个很好的引导顺序结构,你不需要在每个部分写超过 2-3 行的代码。如果您直观地理解了像矢量化这样的概念,那么您只需一行代码就可以完成大多数编程部分!

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

作业编码后,只需点击一次按钮,即可将您的代码提交给自动评分系统,该系统会在几分钟内返回您的分数。有些作业有时间限制——比如说,在 8 小时内尝试三次等等。

Jupyter 笔记本设计精良,使用起来没有任何问题。说明书很精确,感觉像是打磨过的产品。

本课程面向谁:

任何有兴趣了解什么是神经网络,它们如何工作,如何建立它们,以及将你的想法变为现实的可用工具的人。

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

如果你的数学生疏了,也没必要担心——安德鲁解释了所有需要的微积分,并在每个场合提供了导数,这样你就可以专注于构建网络,专注于用代码实现你的想法。

如果你的编程生疏了,有一个很好的编码作业教你 numpy。但是我建议先在 codecademy 上学习 python。

这个 DL 课程与杰瑞米·霍华德的 Fast.ai 课程有何不同:

让我用一个类比来解释这个:假设你正在努力学习如何驾驶汽车。

杰里米的速度很快。人工智能课程从一开始就把你放在驾驶员的位置上。他教你移动方向盘,踩刹车,油门等。然后他慢慢地解释了更多关于汽车如何工作的细节——为什么转动轮子会让汽车转弯,为什么踩刹车踏板会让你减速和停车等等。他不断深入汽车的内部工作原理,到课程结束时,你会知道内燃机是如何工作的,油箱是如何设计的等等。这门课程的目标是让你学会驾驶。在你能相当好地驾驶之后,你可以选择在任何时候停下来——没有必要学习如何制造/修理汽车。

安德鲁的 DL 课程做了所有这些,但是在完全相反的顺序。他先教你内燃机!他不断添加抽象的,到课程结束时,你就能像 F1 赛车手一样驾驶了!

快速人工智能课程主要教你驾驶的艺术,而安德鲁的课程主要教你汽车背后的工程。

如何学习本课程:

如果你在此之前没有做过任何机器学习,先不要上这门课。最好的起点是 Andrew 在 coursera 上原创的 ML 课程。

完成该课程后,请尝试完成杰瑞米·霍华德优秀的深度学习课程的第一部分。杰里米教授深度学习自上而下,这对于绝对的初学者来说是必不可少的。

一旦你对创建深度神经网络感到舒适,那么参加这个新的 deeplearning.ai 课程专业化是有意义的,它可以填补你对底层细节和概念的理解中的任何空白。

本课程中我喜欢的内容:

  1. 事实基本上是明明白白的——所有的不确定性和模糊性都会被定期消除

2.Andrew 强调深度学习的工程方面,并提供了大量节省时间和金钱的实用技巧——DL 专业化的第三门课程对我作为领导工程团队的架构师的角色来说非常有用。

3.行话处理得好。安德鲁解释说,一个经验过程=试验&错误——他非常诚实地面对设计和训练深度网络的现实。在某种程度上,我觉得他可能只是称深度学习为美化的曲线拟合

4.粉碎所有关于 DL 和 AI 的炒作——Andrew 对主流媒体中 AI 炒作的扩散进行了克制、谨慎的评论,在课程结束时,很明显 DL 一点也不像终结者。

5.开箱即用的精彩样板代码!

6.课程结构优秀。

7.漂亮、一致且有用的符号。安德鲁努力为神经网络建立一个新的命名法,我觉得他在这方面会相当成功。

8.这种教学风格是安德鲁所独有的,并且是从曼梯·里传承下来的——我能感受到 2013 年我参加他最初的曼梯·里课程时的那种兴奋。

9.对深度学习英雄的采访令人耳目一新——听到个人故事和轶事既激励又有趣。

我发现缺少的东西:

我希望他能更具体地说“”!

一路上我学到了一些额外的东西:

  1. DL 不容易。随着时间的推移,需要一些艰苦的工作来“理解”这些概念,并使它们很好地工作。 Andrew 不久前写了一篇 quora 回答,引起了我的深深共鸣。

2.好的工具很重要,会帮助你加快学习的步伐。在看到安德鲁用一支数码笔教学后,我买了一支。它帮助我更有效地工作。

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

Black ink is Andrew’s and colors are mine

3.我之所以推荐 Fast.ai 课程,是有心理原因的。一旦你找到了你的激情,你就可以学习无拘无束。

4.每当你得满分时,你就会产生多巴胺的冲动:

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

hell yeah!

5.不要被 DL 行话吓倒( hyperparameters = settings,architecture/topology=style 等)。)或数学符号。如果你有信心并且注意听课,安德鲁展示了为什么符号和记号实际上是非常有用的。它们将很快成为你的首选工具,你将会很有型地使用它们

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

some scary looking symbols which will begin to make sense when you watch the lecture videos

结束语(可选阅读):

  1. 每个人都是从这个领域的初学者开始的。如果你是 DL 领域的新手,自然会对所有的术语和概念感到害怕。请不要放弃。你可能被吸引到这个领域,希望找到你的职业。相信你的直觉,保持专注,你会比你意识到的更快成功!甚至吴恩达在过去的某个时候也不得不学习线性代数——他并不是天生就有这方面的知识。
  2. 虽然这是一个令人难以置信的资源,但这并不是世界上唯一的数字图书馆课程。许多慷慨的老师像萨尔曼·可汗、杰瑞米·霍华德、巴斯蒂安·特龙、杰夫·辛顿都像吴恩达一样在网上免费分享他们的知识。我不够幸运,无法继续攻读硕士或博士学位,因为我必须参加工作,养家糊口——但这并不意味着学习必须停止。由于知识的民主化,我有机会定制自己的学习计划。我可以选择向我最崇拜的人学习:编程(Gerald Sussman)、线性代数(Gilbert Strang)、人工智能(马文·明斯基)、哲学(丹尼尔·丹尼特)、心理学(让·皮亚杰)、物理学(汉斯·贝特)…
  3. 大部分应用数字逻辑实际上是训练有素的工程——Ng 教授在课程 3 中提供了精彩的汇编(我迄今为止发布的 3 门课程中最喜欢的)。让 DL 为您的问题工作所需的心态与处理任何其他困难的工程问题所需的心态没有什么不同。你需要知道的一切都已经被克劳德·香农在几十年前清晰地记录下来了。

感谢阅读并致以最美好的祝愿!

更新:感谢压倒性的积极回应!许多人要求我解释梯度下降和微分学。 希望这对 有所帮助!

关于对抗性歧视性领域适应的思考

原文:https://towardsdatascience.com/thoughts-on-adversarial-discriminative-domain-adaptation-f48e3938d518?source=collection_archive---------8-----------------------

我偶然浏览了一下这篇论文讨论了当测试图像属于不同于训练集的域时的图像分类。

当我们有模型训练的情况时,例如动物的 2D 图片,并且面临需要对动物的 3D 图像进行分类的情况时,领域适应就发挥作用了。虽然它们属于同一个类(马),但模型很困惑,因为它们看起来不同于它从中学习特征的马的图像。

本文主要介绍了一种称为对抗鉴别域自适应的技术,它采用了 GAN 的思想,通过使用鉴别器来区分来自源域和目标域的图像。

由于图像可以属于不同的域,我们首先学习到一个公共特征空间的映射,以便我们可以将一个域不变向量馈送给我们的鉴别器。我们在这里使用一个判别模型,并试图通过一个编码器(足够接近一个生成器,但不完全是一个)来学习映射。鉴别器接收来自两个域的映射,并判断图像是否属于源域。

ADDA 为其鉴别器使用损失函数,使其完全依赖于其目标分布。优化损失函数基本上试图标记目标分布图像,就好像它们属于源域一样。对于映射,我们对源域和目标域使用联合权重,仅仅是因为由于不同的域,在一个域中学习的特征不需要在另一个域中相同。

建筑:

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

Architecture for ADDA. (Source: https://arxiv.org/pdf/1702.05464.pdf)

我们使用两种不同的 CNN 来学习映射。我们首先使用典型的图像分类技术训练源 CNN 和源分类器。在这一步之后,我们修复了源 CNN 和分类器。

然后,在领域适应步骤中,我们通过标准的广告过程训练鉴别器和目标 CNN。我们在这个阶段维护源映射并学习目标映射。

最后,在测试阶段,我们使用目标映射对测试图像进行编码,并在其上运行分类器。

感谢阅读!

关于人工智能的想法,只是为了好玩。

原文:https://towardsdatascience.com/thoughts-on-artificial-intelligence-just-for-fun-e80167dd319a?source=collection_archive---------4-----------------------

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

electric Paul Klee, 1983, by Malcolm P. Dickson, Private collection

"艾已经半个多世纪了,背上了太多的包袱."卡洛斯·佩雷斯

人脑中大约有 千亿个神经元

100,000,000,000

这就需要在带有神经网络的计算机中模拟大量的神经元——也许是为了达到通常意义上的“智能”。稍后会有更多关于智力和一千亿个神经元的内容。

卡洛斯·佩雷兹(Carlos E. Perez)最近发表了一份关于人工智能现状的最精彩的概述,人工智能景观的不同领域,在其历史背景下,“人工智能的许多部落”。写得很好,推荐给任何对当前人工智能领域感兴趣的人。

本着透明的精神,我的激情属于卡洛斯·e·佩雷斯(Carlos E. Perez)所描述的“生物灵感主义者”一类,“创造更接近神经元在生物学中出现的模型的人”支持小说此外,更重要的是,考虑改善成瘾行为对人类状况的影响。也就是说,知道该做什么,如何影响成瘾背后的神经元。我认为,这些神经元 DNA 的计算机模型是一个好地方,可以开始为这些神经元生成一个影响因素和结果行为的详尽列表,有可能支持改善成瘾的方法。这只是个人猜测。正如我在这篇文章的结尾所指出的,我只是一个观察者和提问者,边走边学。

这种方法的理由是什么?漫长的游戏。

“智力有许多不同的定义,包括一个人的逻辑理解自我意识学习情感知识计划创造力解决问题。它可以更概括地描述为感知信息,并将其作为知识(T21)应用于环境或背景中的适应性行为的能力维基百科“情报”

因此,尽管机器学习和深度学习为当前人类的追求增加了巨大的价值,但将术语“智能”应用于这些努力似乎并不正确,因为这个术语是如何被他人使用和解释为具有特定含义的——特别是自我意识的能力。

漫长的游戏

考虑一下自我意识意味着什么,思考,然后在某种程度上或多或少地利用逻辑感来处理输入,理解输入。考虑一下理解意味着什么。

如果你是有自我意识的,知道并理解关于一个物体、一个实体、它的行为、它相对于它的背景的目的、关于它的一切的一切,那么关于缺乏对那个物体、那个实体的理解的摩擦会在哪里?从定义上来说,不会有任何摩擦——事实上,你会知道这个物体和它所在的系统的一切。我们每个人都有特定的心智能力,而他们所处的系统是一个额外的限制因素。随着智能系统的增长超过人类的智能能力,那么也许这些人工智能系统在理论上能够更多地了解我们以及我们如何与我们的环境互动,甚至可能有助于指导我们改善互利的结果。

继续关于人工智能的长期博弈。让我们考虑一下云架构为神经网络提供了什么——高级别的云接口,是硬件和软件之间的抽象层——神经网络和软件所驻留的实际处理器、内存、存储和网络。价值—基于需求的透明硬件可扩展性。回到开篇——人脑中有多少神经元?一千亿。暂且不考虑在神经网络架构内的计算机上模拟人脑神经元及其所有 DNA 复杂性(对某个基因的 DNA 链的影响,例如, Tet3,蛋白质编码基因)之间的比较,仅一千亿个神经元所需的计算机能力就取决于模型的设计水平。作为点的一千亿个神经元的模型网络,不包括神经元的内部网络,将比每个神经元及其内部组成部分的模型需要更少的计算机资源,仅 DNA 就需要大量的计算机资源。Bitesize Bio上的 Yevgeniy Grigoryev 估计,大约需要 1.5 千兆字节来表示 1 个 DNA 序列(以字节计的整个二倍体人类基因组)。

1.5 千兆字节 x 100 亿个神经元= 1500 亿千兆字节或 150 x 10 的 9 次方

十亿千兆字节= 1 艾字节,因此我们需要 150 艾字节。

那有多大?

据说 5 艾字节相当于人类说过的所有单词

我们继续前进。

卡耐基梅隆大学计算机科学教授齐夫·巴尔-约瑟夫说:“神经科学中有很多关于计算模型的工作,这些计算模型不仅考虑了抑制性神经元的更多细节,还考虑了驱动这些神经元的蛋白质等等。”Larry Hardesty,2017 年 1 月 9 日,模型阐明了抑制性神经元的目的

有趣的是,是的,我知道这是一个延伸,几乎令人恐惧,因为我们有能力创建这个基本的测试 作为今天的神经网络计算机模型,神经科学有一个可测试的模型来确定新生儿的“意识”——理论上可以应用于基于计算机的意识模型,一旦有了,作为一个测试。

“……Filippetti 和她的同事测试了 40 名出生 12 小时至 4 天的新生儿。婴儿坐在屏幕前实验者的腿上。在屏幕上,一段视频显示一个婴儿的脸被画笔抚摸。研究人员要么在屏幕上显示抚摸的同时用刷子抚摸婴儿的脸,要么将抚摸延迟五秒钟。

接下来,婴儿们看了同样的视频,但是颠倒了。同样,研究人员在颠倒图像的同时抚摸婴儿的脸,或者将抚摸延迟三秒钟。

Filippetti 告诉 LiveScience,和这么小的婴儿一起工作是一个挑战。

“就婴儿完全清醒和有反应的实际时间而言,这是具有挑战性的,”她说。

为了确定婴儿是否像在橡胶手错觉中一样,将他们在屏幕上看到的面部抚摸与他们自己的身体联系起来,研究人员测量了婴儿在每种情况下看屏幕的时间。注视时间是婴儿研究中使用的标准测量方法,因为婴儿不能回答问题或口头表明他们的兴趣。

研究人员发现,当抚摸与婴儿在自己脸上的感觉相符时,婴儿看屏幕的时间最长。这只适用于正面朝上的图像;婴儿似乎没有把翻转的面孔和他们自己的联系起来。

这些发现表明,婴儿生来就具有建立身体意识所需的基本机制……”婴儿生来就有一些自我意识,《生活科学》,2013 年 11 月 21 日

“长期游戏”的要点是,首先,在创造真正的人工智能方面,我们比我们想象的更近和更远,使用我们通常所说的智能作为基线。我们比我们想象的更接近了,因为我们正在学习人类神经元如何支持人类意识,以及如何使用计算机模型来复制这些过程。也许,我们比我们想象的还要遥远,因为支持这样一个模型所需要的纯粹的计算机能力。也就是说,我们创建新计算模式的速度正在加快,例如云、容器和无服务器计算。

最后,当我们调查人工智能的当前状态时,这些系统被用作支持人类活动的工具。想想人类使用工具的历史。随着时间的推移,我们的历史一直是关于人和工具的协同关系。电脑只是工具。带起搏器,人工肺,假肢等。我们已经走上了将技术融入我们生活的道路,可以说几乎一直都是如此。然而,尽管我们使用工具,我们仍将是独一无二的人类。

关于我们所走道路的总结:

”布林评论说,尽管离谷歌大脑的杰夫·迪恩(Jeff Dean)只有几个纸夹的距离,但他没有看到深度学习的到来。**如果创建谷歌的布林本人都无法预测深度学习的进步,那么我们对来自其他竞争人工智能部落的许多其他从业者又能说些什么呢?**那是既得利益者?总之,不要相信你的常驻人工智能专家,他可能属于不同的部落。”卡洛斯·佩雷斯

你可能会说你对你写的东西一无所知!我咯咯地笑着回应道,“千真万确”,因此有了参考文献。既然我们同意这一点,让我们讨论一下参考文献的有效性。干杯。

参考资料:

《人工智能的众多部落》https://medium . com/intuition machine/The-Many-Tribes-problem-of-Artificial-Intelligence-ai-1300 faba 5b 60 # . gmpi 7 uvx 2

支持 DNA 研究的神经网络:预测 DNA-蛋白质结合的卷积神经网络架构,2016,https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4908339/#!po=31.1594

“儿童神经科学”https://faculty.washington.edu/chudler/what.html

“生物神经网络和人工神经网络有什么区别?"http://cog sci . stack exchange . com/questions/7880/什么是生物和人工神经网络的区别

维基百科,“情报”https://en.wikipedia.org/wiki/Intelligence

哈佛科学家认为他们已经找到了意识的物理来源

婴儿生来就有一些自我意识http://www.livescience.com/41398-baby-awareness.html

厄尔·米勒因在认知神经科学方面的杰出成就而获得戈德曼-拉基奇奖,这位神经科学家因其在模拟大脑回路引起认知方面的作用而获得认可。http://news . MIT . edu/2016/earl-miller-receives-Goldman-rakic-prize-in-cognitive-neuroscience-1101

脑细胞的 DNA 不同https://www . science news . org/article/brain-cells % E2 % 80% 99-DNA 不同

单个人类神经元的体细胞突变追踪发育和转录历史http://science.sciencemag.org/content/350/6256/94

神经元不断改写自己的 DNAhttp://www . Hopkins medicine . org/news/media/releases/neurons _ Constantly _ Rewrite _ Their _ DNA

模型揭示了抑制性神经元的目的

维基百科,心灵上传,https://en . Wikipedia . org/wiki/Mind _ uploading # Computational _ complexity

维基百科,神经计算模型【https://en.wikipedia.org/wiki/Models_of_neural_computation

人类基因组中储存了多少信息?http://bitesizebio . com/8378/人类基因组储存了多少信息/

自我浮现在脑海中:构建意识大脑

兆字节、千兆字节、兆兆字节……它们是什么?http://www.whatsabyte.com/

谁是汉克·m·格林?

“我就是我说过的我,一个讲故事的人。但是,你可能会问,我从哪里来,要到哪里去?十是我去哪里的钥匙,它决定了我从哪里来。”

读一读汉克·m·格林@https://sites.google.com/view/time-a-trilogy/写的《第一册:十》的草稿

推特@hankmgreene 或https://twitter.com/hankmgreene

https://www.facebook.com/hankmgreene

Flipboard: HankMGreene

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

建立卓越的数据科学中心来管理整个模型生命周期

原文:https://towardsdatascience.com/thoughts-on-data-organization-strategy-783dbd2b8ec9?source=collection_archive---------8-----------------------

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

他的数据技术革命浪潮依然强劲,各种规模的公司都在积极建立/扩大他们的数据科学团队。在寻找组织数据科学人才的最佳方式的过程中,由一个中央平台数据科学团队和嵌入业务部门的多个专业团队组成的混合组织模式已成为最佳策略和成熟策略。下面这篇发表在《走向数据科学》上的文章很好地解释了混合模型。

[## 数据组织的阶段

towardsdatascience.com](/the-stages-of-the-data-organization-b3f4f0589716)

虽然还没有标准名称,但 one central platform 数据科学团队可以称为卓越中心,因为他们传播良好实践并为数据基础架构做出贡献。尽管这种混合模式已经使许多公司在数据科学方面获得了巨大的投资回报,但我们还有更大的潜力将这种组织模式推向更高的水平。

我认为一个潜在的领域是授予卓越中心“评审者”的角色,让他们不仅仅是推动者。从模型穷到模型富,许多新的模型每天都在不同的组织团队中被创建和使用,有时低质量的模型会被发送出去并导致不良后果。我们现在需要一个值得信赖的地方,比如卓越中心,来仔细研究我们周围的模型,尤其是关键任务模型。

所有的模型都是错的

在我的一个工作项目中,我正在评估一个由我的同事创建的模型。我发现一个输入变量对我们的预测几乎没有贡献。我比较了有和没有输入变量的预测结果,始终得到几乎相同的结果。因为这个输入变量是那个项目中计算开销最大的特性,为了良好的建模/工程实践,我建议删除这个变量。我的同事建议保留这个变量,因为我们团队的一位高级领导构思了这个特性。保留它在政治上是有利的。最终保留了特色。

包含一个非信息变量可能没什么大不了的,但是,偏离追求卓越是不好的。当部署有缺陷的模型时,当根据错误的数据做出决策时,我们可能会面临严重的后果。乔治·博克斯有句名言,“所有的模型都是错的,有些是有用的。”模型有优点和缺点,需要仔细评估;在当今漫长而复杂的模型生命周期中,错误很可能会发生。

来自可信评审者的话语和评论可以帮助我们更好地评估模型的状态:如果数据质量是可接受的,如果模型假设和选择是有效的,如果性能度量被彻底测试,如果一切都被记录并可再现,如果业务解释与公式一致。当办公室政治生效时,评论者的角色变得更有价值。下面这篇 HBR 的文章说,“太深入业务职能的分析师往往偏向于现状。”

[## 3 件事阻碍了你的分析,而技术不是其中之一

许多公司继续与商业分析作斗争。这和技术无关…

hbr.org](https://hbr.org/2017/06/3-things-are-holding-back-your-analytics-and-technology-isnt-one-of-them)

卓越中心

一天,一位合作者告诉我,他建立了一个表现非常好的模型。知道他的发展是复杂的,几乎不可复制的,我发现自己很难相信他的说法。如果他从第三方评论者那里得到一个大拇指,我会立刻知道一些伟大的东西真的被创造出来了。在软件开发中,有人开发,有人测试。数据科学社区还缺乏这样的实践(如果我错了,请告诉我)。

将评审员角色赋予卓越中心是有方向性的,如何在现实世界中操作评审取决于团队、领导和文化。也许多个团队应该一起承担这个角色:数据人员、领域专家和工程师。尽管如此,我认为我们希望将高数据科学标准制度化,以便最大限度地发挥数据科学的影响,并防止不良后果。这一步将使当前的混合模式更加互联和治理。

更进一步,模型生命周期管理现在是一个开放的空间。如何注册、监控和淘汰数据科学工件(作为一个模型、一个特性、一个包、一个提取)需要深思熟虑的策略、强有力的领导和社区支持。上面讨论的审阅者角色只是模型生命周期管理的一个方面。卓越中心应该在这一开放领域发挥作用。

关于数据、科学和认识论的思考

原文:https://towardsdatascience.com/thoughts-on-data-science-and-epistemology-d816b3019743?source=collection_archive---------5-----------------------

这是我很久以来一直想以某种形式写的一篇文章,但是乔安娜·马尔瓦尼昨天提出的一个问题让我的想法变得清晰了一些,所以我在这里尝试阐述一下。

让我首先指出,在我的内心深处,我是一个“数据怀疑论者”,这并不意味着我不相信数据告诉我们的东西,而只是我怀疑我们是否能从数据中学到我们愿意相信的东西,不管我们可能会提出什么样的算法。“科学”是一个两步走的过程,其中数据分析是关键部分,但不是全部。

在我看来,构成“科学”的两个步骤是确定“正常”的范围,然后是观察到的现象是否代表了对正常状态(而不是高斯变化)的足够有趣的偏离。)如何建立“正态性”的范围可以是演绎的(即“公理化的”,遵循“逻辑”原则)或归纳的(即以数据为中心,没有任何先验偏见。)从本质上说,这是“理论”阶段,在这个阶段,假说形成了。从这个意义上来说,这只不过是人们从传统的“研究设计”课程中学到的东西,至少在理论上是如此。我的观点可能与教科书描述略有不同的地方是,可接受的常态范围并不普遍。人们来自不同的背景、需求和兴趣。他们每个人所认为的“正常”(推而广之,对正常的足够“有趣”的偏离)不一定是相同的。对于已经熟悉萤火虫的捕食习惯的昆虫学家来说,如果他们的先验知识被转化为假设,他们应该彼此等距分布,这正是人们通常应该期待的——即使他们自己不一定采取这一步骤。对于不知道萤火虫会互相吞食的外行人来说,它们的分布不是随机的才是有趣的部分——前提是他们能理解遍布于给定空间实际上不是随机的。

一个潜在的严重问题来自于数据消费者之间关于“通常”应该从数据中得到什么的错误沟通——一种“黑天鹅”问题。卡尼曼和特沃斯基对行为经济学的一个重要贡献是,人们对罕见事件的期望过高或过低,这取决于环境。一些人,甚至很多人,以有意义的概率期望赢得彩票,战胜股市,成为职业运动员。与此同时,人们忽略了为数不多但数量可观的人可能同时投票给奥巴马(2012 年也是如此)和特朗普的可能性,也忽略了这一“罕见”事件可能带来的后果。数据分析可以帮助实现的是精确确定正常预期的范围-整个分布,而不仅仅是平均值-以便所有受众都能就基线达成一致。请注意,这不需要用数学术语。数据可能总是为 0,除了 1-2%的情况下为 1(据我所知,这是大多数现实生活数据的典型情况——问题、投诉、评论等)。是罕见的事件。)所以正常的范围可以简单地描述为 98–99%的时间为 0,1–2%的时间为 1。如果我们不能认同手头的数据,再加上我们可能有的任何演绎洞见,那 1——2%是由什么构成的,这就是我们所能说的。请注意,这与“预测性”分析略有不同:我们期望 0,但如果我们得到 1,我们不应该太惊讶,而不是“如果 X,答案是 0,如果 y,答案是 1。”归根结底,我们处理统计数据是因为我们不知道真实世界的全貌,因此,我们不仅需要精确了解我们“知道”的事情,还需要精确了解我们不知道的事情。在这种情况下,即使我们确实知道更多关于 X 和 Y 的信息,如果 X,那么“预测”应该是答案可能是 0,但有 1 的小概率(有希望量化“小概率”,有置信区间);如果 Y,答案可能是 1,但也有可能是 0。即使“预测”没有明确说明,这些说明也应该是数据消费者所期望的,并且应该被要求提供。(这对于理解 2016 年选举中发生的事情很重要,回想起来,2012 年也是如此:大多数人投票是可预见的,但有些人没有,在一些不寻常的情况下,试图将“通常”应用于不寻常的时期是科学的弊端。)

不过,一般来说,数据分析人员似乎在确定什么是“正常”方面做得很好。似乎很少被关注的重要部分是第二阶段:识别偏离常态的情况,并评估它们对手头目标的意义。为了实现这一点,需要重新思考数据科学中的一个常见实践:将样本划分为训练集和测试集,并使用后者来验证前者中发现的模式。作为第一步的一部分,这是一个很好的实践,因为它有助于将健壮的模式从脆弱的模式中分离出来——但前提是要小心使用,我将在下面详述。它对识别显著偏离常态没有任何作用,事实上,过于盲目地投入交叉验证实际上会抑制有趣模式的发现。

正如我所建议的,发现有趣偏差的方法颠倒了交叉验证逻辑。在交叉验证的逻辑中,敌人是过度拟合:我们希望确保模型在训练集和测试集之间产生一致的预测。如果模型为训练集预测了测试集中没有出现的东西,那么模型可能是坏的。或者,也许模型实际上是好的,甚至比我们想象的更好——我们无法说出这一点,因为我们对数据以及训练集和测试集在某种程度上的差异了解不够,这可能对我们来说并不明显。我们应该询问数据中训练集和测试集之间的偏差出现在哪里,并检查偏差来自哪里。我们应该知道足够多的概率理论来评估偏差,以样本中出现偏差的子集为条件,是否可以用随机性来解释,或者是否有更有意义的东西。也许基于小的子样本邻域排列的重采样方法可以用来评估偏差的统计显著性(这几乎不是一个革命性的建议:匹配是一种足够流行的统计技术,它只是一个相对简单的编程工作——遗憾的是,我并不特别擅长匹配大数据的小片段)。

一个常见的问题是,随着数据变得越来越大,越来越多的数据来自显而易见的、容易的、简单的和平庸的,这往往会强化刻板印象和传统智慧。有趣的潜在发现潜伏在不寻常的、奇怪的、最重要的、罕见的数据子集里,这些子集变得越来越容易被忽略,特别是当在一个由通常和可预测性主导的样本中接受稳健性检查时。与产生可靠预测的绝大多数“容易”数据点相比,样本中不寻常但有趣的子集也不那么容易预测,这并没有什么帮助,因为它们太少了,无法成为统计上有用的样本。套用托尔斯泰关于幸福家庭与不幸福家庭的名言,预测什么使家庭幸福是非常容易的,而不幸福家庭的最佳预测者是他们不幸福。如果目标是理解不幸的家庭,这是有问题的。

这值得吗?如果 99%的家庭是幸福的,或者 99%需要翻译的文件遵循可预测的模式,或者 99%的选民在 99%的时间里表现可预测,那么当模式打破时,在 1%的人身上花费大量时间是否值得呢?我觉得要看那 1%在哪里,什么时候。事实上,大多数日常琐事可能是简单的、常规的、可预测的,但那 1%可能会导致足够重大的事件——比如金融崩溃或选举失败。也许并不是所有奇怪的 1%的数据都值得严格审查,但一个好的分析师应该睁大眼睛,看看从这些不正常的小片段中可以学到什么,并尽他/她所能从中学习。

杰哈和托普对 JAMA《适应人工智能》的思考

原文:https://towardsdatascience.com/thoughts-on-jamas-adapting-to-artificial-intelligence-by-jha-and-topol-9965d6f6c25d?source=collection_archive---------3-----------------------

当记者写下人工智能在医疗保健领域的颠覆性力量时,他们往往会专注于放射学和病理学,这是有充分理由的。这两项交易都涉及从可量化的图像数据中解读模式——在从面部识别到热狗分类的几项研究和商业应用中,人工智能已经证明了这一点。

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

在每篇文章中,房间里的大象是放射科医生和病理学家的未来?

我今天了解到,这个问题去年在《美国医学会杂志》的一篇题为“适应人工智能,放射科医生和病理学家成为信息专家”的文章中得到了正面回答

标题足够有趣。然后我看到两位作者是索拉博·贾(放射学家)和埃里克·托普,我知道我必须从防火墙后面偷偷拿出一份拷贝。大多数关注医疗保健的人都知道托普。他是一个书籍作者,医学博士,见解深刻,固执己见,但专业如此。我读过 Jha 在医疗保健博客上的帖子在 Twitter 上关注他(值得)。他聪明、直言不讳、与众不同。一半的乐趣是看着他在传统的医疗文化中一往无前,而且做得很好。我想这些人在这件事上花了不少时间。以下是他们不得不说的话:

人工智能将取代放射学家和病理学家今天所做的许多工作。

Jha 博士和托普博士粉碎了任何认为人工智能将无法做大多数放射学家和病理学家今天所做的事情的想法。他们引用了创业公司和大公司已经被证明比人类更有效的例子。他们用了 2 页文章的一半来阐述这个明白无误且令人信服的观点——不管你喜不喜欢,这都在发生。句号。现在是适应这一新现实的时候了。

“为了避免被计算机取代,放射学家必须允许自己被计算机取代.”

在第 2 页中,为真正的测试做好了准备。贾和托普博士将如何处理“人类的下一步是什么”这一部分?

随之而来的是引人入胜。我重读了三遍。这是一部接一部的戏剧:

放射科医生和病理科医生到底是什么?

用贾和托普博士的话说:

“放射科医生的主要目的是提供医疗信息;图像只是获取信息的一种手段。放射科医生更适合被认为是专门从事医学成像的“信息专家”。

这类似于病理学家,他们也是信息专家。病理学家和放射科医生在本质上是相似的,因为他们都从图像中提取医学信息。"

值得概括一下:

  • 放射科医生和病理学家是一样的,因为他们的主要工作是解释图像。
  • 如果不是信息专业,图像解释和结果交付是什么?
  • 图像是达到目的的手段——你们真的是信息专家。

那是一些元的东西。但是放射科医生和病理科医生会如何看待重新定义他们的价值主张呢?在多年学习阅读非常具体的图像以获得非常具体的模式后,他们认为自己是信息专家吗?就此而言,对于仅仅是信息专家的初级保健医生来说,诊断考试是不是达到目的的手段?

现在,谁在乎。这是一个大胆的开场白。如此大胆,以至于作者继续加倍强调需要大胆的笔触。

你的两个领域早已拥抱科技。在你做的许多更复杂的任务上,人工智能比你做得更好。受过训练的鸽子可以做你的工作。

在你指责我胡编乱造之前,以下是他们的原话:

“病理学家已经接受了机器和技术……人工智能可以执行病理学家更复杂的任务,在某些情况下,具有更高的准确性……尽管此类研究需要对更多样化的组织类型进行大规模验证,但在放射学和病理学领域,人工智能显然可以处理许多任务。为了强调放射学和病理学之间的共性,研究人员使用操作性条件反射训练鸽子在乳房 x 光片上发现异常钙化,并在组织学上检测乳腺癌。

舞台已经搭好(以我的鸽子比你的优等生聪明为例),贾博士和托普提出了我确信会被许多人视为异端的观点:

你的两个学科应该合并成一个单一的实体,称为信息专家。

那是巨大的。你们两个的职位都不需要再存在了。它们应该被合并。忘记图像,坚持附加值:解释更难的图像(尽管前一段认为这项任务的时间不多了),建议进一步的测试,并指导临床医生。你仍将是“医生的医生”你不会得到你的头衔,也不会做你被训练去做的事。

我知道这些家伙不会让人失望的。

人工智能+人类=对于那些跨越人机界限的人来说,生产力和影响力更大

杰哈和托普认为,“一个信息专家,在人工智能的帮助下,有可能管理整个非洲城镇的筛查工作。”

当然是真的。那些学会跨越人/机器世界的人会面临新的机会和影响。然而,我更希望使用这种观点的人承认这种新的供需现实的负面影响。

我想当蒸汽动力针织机来到取代它们的时候,这是对针织者的鼓励。养马的人可能确信亨利·福特的努力会在某种程度上改善他们的生活。几代人之后,在底特律制造业经济崩溃前不久,他的经理们可能向他们的工厂工人推销了同样的小说。

请再告诉我一次,当一个人可以做成千上万我们曾称之为放射科医生的工作时,我们真正需要多少“信息专家”?

既然这样,我们就放他们一马吧。毕竟,他们只是提议烧毁两个学科。

信息专家应该接受不同方面的培训。

“受训者只需掌握足够的医学物理学知识,就能提高医学图像的次优质量。信息专家应该学习贝叶斯逻辑、统计学和数据科学,并了解基因组学和生物统计学等其他信息来源,因为他们可以将不同来源的数据与患者的临床状况相结合。”

除了“你不应该再以任何可识别的方式被训练成放射科医生或病理学家”之外,我不知道该如何解释这个问题。如果我的解释是合理的,它回避了一个问题:这真的是放射学和病理学特定的进化所需要的吗?或者这是放射科医生和病理学家应该考虑申请的新的和需要的子学科的情况吗?那么现有的被 AMA 认可的医学分支学科医学信息学呢?另一次…

合并两个不同的医学专业可能会遇到阻力,每个专业都有独特的教学、传统、认证和报销

我会带爆米花。

“联合起来,放射学家和病理学家可以随着人工智能的兴起而繁荣发展。”

嗯嗯好吧。只要我们不再是放射学家和病理学家,对吗…?

“工作岗位不丢;相反,角色被重新定义;人类被迫从事需要人类元素的任务。”

告诉那些被解雇的放射科医生吧。

鉴于他们传达的信息的严重性(和诚实性),他们的结束语令人惊讶地乐观。他们也不仅仅是有点矛盾。我猜他们在这个问题上有过激烈的争论——也许是和 JAMA 的编辑们,也许是彼此。

总之,这篇文章非常有趣。这是我在同行评审的医学杂志上见过的最大胆的文章,它不带任何歉意地提出了一个有争议的、充满政治意味的话题。支持变革必要性的证据令人信服。在我看来,要求开设新专业是正确的。我不确定这种需求代表了放射科医生和病理科医生的自然进化,而不是他们的下坡路。无论哪种方式,放射科医生,病理学家,临床医生和管理人员在阅读这篇文章后会有很多要考虑的。向杰哈博士和托普博士致敬。

关于公制设计的思考

原文:https://towardsdatascience.com/thoughts-on-metric-design-51a4c3b773a0?source=collection_archive---------11-----------------------

我注意到,当我在硅谷提起“指标”这个话题时,人们似乎要么爱我,要么恨我。跟踪并尽可能采取一些你认为能抓住你的业务或产品的重要方面的措施,对一些人来说是提高生产力的灵丹妙药,对另一些人来说则是短视的创造力杀手。不管你对定义和跟踪指标的好处有多强烈的感觉,如果你决定这样做,花时间去思考指标设计的原因和方法是值得的。我们最近在 Wealthfront 做了一些这样的事情,我想我应该分享一下我从这个过程中学到的东西。

关于度量的资源

有无数的书籍和的 TED 演讲(甚至的公司)致力于度量的主题。不同的人使用不同的名字和缩写,他们以稍微不同的方式定义和使用度量,但是他们最终得到了相同的点。我不会总结所有的细节,我会列出我在 Wealthfront 定义业务和产品指标的过程中参考过的资源。

度量的用途是什么

指标可用于前瞻性和回顾性。

未来的

我所说的前瞻性是指使用一个指标作为评估决策潜在影响的框架。这种度量的使用有助于解决的一个问题是团队之间对于他们试图优化什么的分歧。就度量标准达成一致使团队能够就不同项目的相对优先级进行富有成效的讨论。没有度量标准,关于团队应该做什么的争论可能会脱轨,因为对每个人的工作目标没有共同的理解。例如,我选择“实验运行次数”作为数据科学团队的内部指标,这有助于我对我们纠正到达率偏差的工作进行优先排序。预期使用指标的一个额外步骤是设定移动指标的目标,尽管这不是必需的,也不意味着指标与绩效评估相关。

回顾的

一旦团队前瞻性地使用度量标准,他们就可以考虑回顾性地使用它们。这意味着将度量的变化作为评估项目或团队的机制。这是反对度量的人容易有问题的用例,尤其是当度量被用作个人或团队认可和晋升的基础时。当一个团队对他们的度量没有高度的控制时,或者如果影响他们的度量的外部因素不能被适当地考虑时,这个用例可能是具有挑战性的。Wealthfront 的一个例子可能是依赖于市场的指标,如管理下的资产变化(AUM)。

这是一个多么好的衡量标准

一个有用的指标应该是有意义的、可测量的和可移动的。

有意义的

首先,指标应该捕捉对业务直接或间接重要的东西。对于 Wealthfront 来说,一个直接重要的指标可能是净存款或新客户资金账户的数量。间接重要的指标可能是那些更高级别的指标中的一个。例如,在其他条件不变的情况下,减少客户流失意味着更少的客户取钱,这将增加净存款。虽然这似乎是显而易见的,但它通常是团队最难达成一致的部分。

可测量的

如果一个指标不能被测量,那么它就不能被追溯使用。如果不清楚该指标是否可以或应该移动,那么在前瞻性地使用时也会很有挑战性。例如,众所周知,口碑很难准确衡量或评估。如果结果是你的客户已经在谈论你的产品了,那么试图增加这个指标可能是徒劳的。有些指标无法直接测量,但仍有潜在价值。例如,客户终身价值是估算的,而不是测量的(至少在有用的时间范围内)。然而,这可能是一种健康的方式来组织关于优先考虑哪些产品和功能的讨论。

动产

最后,一个好的度量标准需要是可移动的,至少在理论上是如此。如果一个团队不能影响它,一个度量标准在未来和过去都是无用的。例如,税前、费用前回报对 Wealthfront 来说是一个糟糕的指标,因为我们无法控制全球投资市场,我们也无法改变它们。然而,保留将是一个有效的指标,因为我们可以通过改变我们的产品来取悦我们的客户并解决他们的问题,从而使他们留下来。即使一个指标是估计的而不是测量的,它仍然是可移动的,就像 CLV 的情况一样。

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

The price of VTI (“the market”) would make a poor metric because it is not moveable (unless you control Donald Trump’s Twitter account)

衡量标准有局限性

度量不需要做所有的事情。

平衡力

我在 Wealthfront 工作过的许多团队遇到的一个挑战是担心他们提出的指标有一些盲点或弱点。例如,我们的财务规划团队希望有一个衡量指标来捕捉路径的参与度。但是,他们担心这一指标可能会被过度优化,以至于客户登录的频率超过了对他们有益的程度。当我指出他们的另一个面积指标有效地衡量了我们客户的财务成果的质量时,我们同意这将对冲过度指数化参与的风险。 Keith Rabois 将衡量制衡指标的实践称为“配对指标”。

文化

降低指标盲点风险的另一个因素是使用它们的文化。例如,我们 Wealthfront 的公司价值观和产品原则分别概述了我们的行为方式和我们如何制造产品。这些工件和它们所代表的文化使得一个团队不太可能做一些对我们的客户或我们的业务不利的事情,因为这是优化他们的一个度量的简单方法。例如,我们或许可以通过使在我们这里销户变得极其困难来减少提款(像美国银行、大通银行、富国银行和其他大银行那样做),但这将与我们的原则和价值观产生强烈的矛盾,因此永远不会发生。

衡量行动,而不是言语

选择捕捉行为而非情绪的指标。

接近度

度量是你所重视的东西的代理。如果你想一想你真正想用你的标准捕捉什么,你会发现有些人比其他人更接近这个理想。例如,客户的推荐可能比他们的会议时间长短更能衡量他们的快乐程度。这是因为推荐是一时高兴的结果,这两个事件在事件的因果图中紧密相连。不难想象,一个更长的会议可能是由无数与快乐完全无关的因素驱动的。从这个意义上说,推荐比会话长度更“接近”愉悦。接近度可以是一个有用的维度,用于在两个指标之间进行选择,或者问自己是否有更好的东西可以抓住你真正想要衡量的东西(或者,如果你真的迷失了,你开始重视什么)[参见上面“有意义的”一节。])

“从不衡量用户的快乐”——凯西·科济尔科夫

阿尼玛斯

都说行动胜于言语。我持更严厉的观点,认为语言是无声的。你的客户告诉你的话是在转移注意力,除非这与他们的所作所为有强烈且持续的关联(我还没有在野外遇到过这种情况。)例如,如果你在入职流程结束后对用户进行调查,平均评分为 4.9,但只有不到 10%的人转化为付费客户,那么你就是一个使用 NPS 的傻瓜。客户有很多理由对你和他们自己撒谎,这些样本中的选择偏差足以让它们变得毫无用处。此外,听取社交媒体上抱怨最大声的少数(可能)用户的声音是加倍愚蠢的。无论你是否将它作为一个明确的衡量标准,放弃决策权以感知 Twitter 情绪是对职责的放弃。唯一重要的是你的客户做什么。

简单地说

无论您计划前瞻性地还是回顾性地使用指标,请记住确保它们是有意义的、可测量的和可移动的。不要担心你的度量标准之间是否有差距,只要它们相互平衡,并且你在你相信的文化和价值观的背景下使用它们。无论你做什么,请衡量行动而不是语言。

对网络、通信、区块链和太空时代互联网的思考

原文:https://towardsdatascience.com/thoughts-on-networks-communications-blockchains-and-a-space-age-internet-42a0cdf62a7d?source=collection_archive---------11-----------------------

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

网络是可视化和量化对象及其与其他对象的关系的重要方式。互相交换光子的粒子构成了一个网络。拥有发送和存储由卡车、轮船和飞机运输的货物的仓库的公司也构成了一个网络。有许多有趣的例子,包括电视广播、食物链、消费者零售和电网。

可以通过考虑描述业务运作的网络来理解业务。例如,油井位于某些自然发生的地方,但石油或其衍生物无处不在(汽油和塑料,举几个主要的例子)。例如,将石油从油井直接输送到人们的汽车上,效率会非常低。如果你画一个地理网络,其中节点是地图上的位置,边是位置之间的距离,这一点很容易看出来。然后你可以在上面画另一个图,新的边表示石油管道和它们的容量或距离。通过将这些边的“权重”相加,你可以很好地了解建设管道网络的成本。

但是一对多的网络结构很好地描述了电视。它是一种广播媒体,有效地获取单一来源,并在同一时间将其直接分发给观众。如今,电台广播和社交媒体上的任何直播视频也是如此。

对比这两者,我们看到有时一个非常简单的图形视角可以告诉你很多关于企业的本质。我们可以看出,由于地质条件的限制,石油公司面临着一个巨大的分配问题,以及为什么可再生能源可以在地球上更大的地理区域内更有效。我们可以看到传统电视如何面临明显的个性化危机,或者我们可以看到个性化如何成为内容创作爆炸的驱动因素。

描绘网络时,立即可以看到的是规模问题。一个简单的问题是边的数量相对于节点的数量是如何增长的。例如,在电话网络中,人们需要相互交谈,但是随着节点(人)数量的增加,边的数量也成平方增加。对于 100 万电话服务客户来说,这意味着 1 万亿条电话线。对于 3000 万客户来说,就是 900 万亿!另一种看待它的方式是看你在二维(或者三维,如果你喜欢,洞察力是关于节点之间的边密度)中组织图形的能力。如果你能以一种有组织和合理的方式画出图表,而没有很多边相互交叉,这意味着你正在处理一个可分解的问题。所有这一切的教训是层次:如果你有它,你知道你可以缩放你正在看的任何东西到第一近似值。

请注意,在我们的例子中,我们是如何以两种方式使用网络图的,这在一开始可能会有点混乱。在石油开采和分配的例子中,我们考虑了实物是如何在空间中移动的。在电视示例中,我们当然也可以考虑电视信号的物理传输,并展示它与石油分配的相似之处。相反,我们专注于客户对服务的看法,这揭示了其明显的局限性。考虑一下图是如何被其他图限制的,比如地理图或基础设施图,这是一些常见的图,可以给图添加一个新的维度。或者想象一个更微妙的例子,个性化如何创建一个社交群体之间连通性更有限的图表。这导致了回音室的出现和假新闻被用于大规模的政治影响。

因此,网络图是一种强有力的心理工具,有助于揭示系统的结构。对企业来说,它有助于澄清企业如何运作,如何继续运作,以及何时停止运作。

通信行业的网络

过去,美国的邮件传递通过纽约市的一个办公室,然后分发到当地的邮局(概念上是一个基本的星形图,或轴辐式模型)。但是邮件的物理移动被限制在公路和铁路的运输图上。这不是一个特别令人惊讶的事实,这只是一个最基本的事实。人们想要交流他们在哪里。电报是第一个能够传输电脉冲来交流信息的设备。它们首先出现在火车站,然后迅速转移到邮局。

电报主要被火车站、邮局、其他重要的政府机关和大公司使用。对于一般人来说,维护硬件和记录他们之间的消息需要太多的工作。电话的发明完全改变了这一点,因为人们可以听到声音,并几乎在瞬间传送自己的声音。

考虑一下当我们从几个重要的组织相互交流转变为中产阶级家庭中的每个人相互交流时,网络会发生怎样的变化。图形变得更加密集,解决潜在的电话线路爆炸的自然方法是建立路由集线器。交换机正是建立这样一个电话网络所必需的发明。

但是回想一下我们之前电话网络稠密图中的数字。所需的通信带宽并没有减少,我们只是将这一负担转移到了更少的“更粗”的管道上,这些管道构成了我们今天拥有的更稀疏、更高效的网络的主干。请注意,更粗的管道意味着在“垂直”缩放方面的更大投资,而“水平”缩放将只是添加更多的线,正如我们之前所考虑的那样。曾几何时,农民在农村地区使用廉价的绝缘铜线架设电话网络,甚至采用已经穿过牲畜围栏的带刺铁丝网!对他们来说,水平扩展确实有效,但是垂直扩展带来了只有专注的大公司才能获得的技术进步。在抽象图形视图中,某些边在视觉上可能看起来更粗,权重更大,以描述它们所服务的流量的容量和体积。

从电话线路到光纤的过渡严重依赖于先前的基础设施。它也显示了进一步的纵向扩展,这是电信公司保持其控制的机制。他们是技术的受益者,这些技术强加了严格的物理和地理限制,使得建设全新的网络极其昂贵。

不提及这种权力如今正受到怎样的挑战是不公平的。电信公司喜欢成为客户生活的中心。虽然从技术上来说这仍然是事实,但沟通已经从电话交谈发展到视频聊天、短信、博客、推特、喜欢和公开评论。作为消费者,人们的注意力现在分散在许多概念媒介上。电信公司现在是烦人的公用事业公司,似乎只是碍手碍脚。人们关注的是像脸书和推特这样的交流促进者。

对于新技术公司来说,电信是一个巨大的威胁。只要互联网还在物理电缆上运行,电信公司就会统治。没有什么比过去几年的互联网中立之战更能说明这一点了。

但是有一种技术可以完全改变这种情况。

无线和空间

突然间,SpaceX 和脸书以全新的方式打造互联网基础设施的努力变得有意义了。推翻电信业的唯一方法是让它们目前的基础设施变得无关紧要。如今,电信公司确实拥有一些无线技术,但它还不够成熟,不足以在很大程度上取代物理电缆。事实上,它们甚至还不够成熟,互联网服务提供商(ISP)无法在它们和客户之间使用。尽管移动服务提供商在这方面做得越来越好,但只要物理电缆仍然是骨干提供商,这种局面就不会改变。

对脸书来说,投资 moonshot 通信项目对其持续繁荣至关重要。如果其中一家成功了,他们将成为有史以来最强大的通信公司(就像贝尔系统之前一样)。对于 SpaceX 来说,回报甚至更令人震惊:他们将拥有太空运输以及行星内部甚至可能是行星之间的通信。这将使他们成为有史以来最强大的公司之一。

想象一下,通过一项真正成熟的无线技术,地球内部的通信格局会发生怎样的变化。如果无线信号可以通过卫星传播到整个地球,以前基础设施的负担就不复存在了。电信公司的地面基础设施是其业务不可或缺的一部分,它们会发现自己的影响力受到了严重限制。它们是会下降,还是只是继续处于下降状态,还有待讨论,但很明显,权力格局将会发生重大变化。

消除对重型地面基础设施的需求的非常有趣的含义是,它消除了新的 ISP 公司进入的巨大资本壁垒。发射卫星网络、重组卫星网络或让卫星退役,将比在难以到达的地方(比如海底)铺设数百万英里的新电缆容易得多,也更划算。一个斗志昂扬的新贵,拥有超越当今无线电或光学的新技术,可以将它打包到几颗卫星上,部署到整个地球。理论上,消费者转换的障碍可以忽略不计。

假设无线技术超越了太空运输技术,很明显,通信领域的能源前景看起来要平坦得多。最终我们将殖民足够多的星球,让星际通讯变得重要。那么部署这些网络的基础设施将再次成为新进入者无法逾越的障碍。

如此循环往复。

事情的另一方面

关于系统网络的讨论,如果不讨论集中与分散,就永远不会完整。某件事是集中还是分散取决于你的观点。但是,如果您选择一个视图并查看代表它的图表,集中化很容易发现:您会看到少数元素(节点、边或两者)具有高价值,而许多元素价值较低。例如,从计算机网络硬件的角度来看,人们拥有的计算机(笔记本电脑、电话等。)都是低值。高价值计算机的价格高达数十万美元,构成了这些通信网络的主干。

一个分散的系统有一个图,图中的价值分布更加均匀。例如,互联网的逻辑图是一个将简单的计算机连接到其他计算机的网络,其节点的价值相当均衡。换句话说,人们日常使用的电脑彼此没有太大的不同,它们大多做相似的事情。

一个更有趣的例子是欧盟之前的西欧。它们是一些国家的集合,一些比另一些更强大,以分散的方式相互作用。好处是显而易见的:完全的自主权和来自监管机构的自由,该机构可能会为这些国家做出次优的决定。缺点也相当明显:在许多维度上协调性、一致性和速度都降低了。正如欧盟的形成所表明的,出于多种原因,人们对中央集权有着强烈的兴趣。

可能去中心化最有趣的例子是比特币,它建立在一种叫做区块链的东西上。比特币网络的分布也非常均匀,就像互联网一样。分散式系统付出了更高的开销,作为回报,它消除了集中式系统的缺点。就金钱而言,如果权力下放从无能或恶意的政府手中夺走了权力,那么它的间接成本可能是可以接受的。

但是比特币的成本还没有被完全理解。截至目前,区块链总体上面临着规模扩大危机。从网络上不难看出这一点:所需的资源量随着需要服务的节点数量的增加而增加。比特币的一个核心限制是每秒钟允许的交易次数,大约是三四次。这里有许多旋钮可以转动,但基本的限制是,在将事务添加到区块链之前,需要在所有或至少大多数节点之间达成共识。

一个有用的类比是民主与独裁:民主需要公民达成共识,这严重阻碍了行动的速度。这就是为什么罗马人在危机时刻会临时任命独裁者。这也是为什么许多民主政府在某些情况下赋予其领导人某些权力,以中断民主统治。这突出了集中式和分散式系统之间的基本权衡,以及它们必须如何扩展。

中断的约束违反

通过从图表和约束条件的角度来看上个世纪电信业的历史,我们可以讨论新进入者可能会如何产生影响。地理网络对其物理基础设施网络的限制揭示了一个可能的中断区域。卫星通信只是一种技术,但其颠覆力量背后的基本原理是改变或违反对现状的限制。想到也许一些自主飞行器可以使用自动跟踪激光跨越海洋发射信号是很有趣的。在这种情况下,连接世界的整个电信主干网将被一家拥有一点先进技术的小型航空航天公司取代。

当然,也完全有可能这样的技术没有被发现。然后,我们让政府去遏制一个不受控制的行业巨兽(就像他们过去所做的那样)。但是,技术发展掌握在少数人手中的可能性极小,因为这是一个极其密集的过程,并不总是在强大组织的严格控制下蓬勃发展。真正改变范式的技术也不太可能只让当权者受益。想一想一项技术会以多少种其他可能的方式影响社会,很明显这是真的。区块链是一个很好的例子,互联网也是。有人可能会说,赞助者会随着时间的推移而改变,但大众和少数人之间的控制权之争是一个基本事实。想想比特币的采用如何超过了没有资源监管它的第三世界政府。对这些国家的公民来说,他们正在或很快会发现自己拥有更大的控制权。

这也可以解释为一个网络。很明显,当前的技术掌握在冷酷无情的人手中,对其他人来说可能是一笔糟糕的交易。但无休止的权力整合揭示了一种根本无法扩展的结构。它表明,即使个体本身是无效的,甚至是无组织的,但数量仍然有很大的影响力。这是罗马帝国衰落的主要原因之一。

技术可能会提高一个小团体控制一个大团体的能力,但这不可能无限扩大。我们知道物理空间、时间以及速度等衍生概念是有限的,而且永远都是有限的。技术可以使我们的环境和环境得到指数级的改善,但是每一次我们只是指数级地扩张我们的环境并恢复我们熟悉的力量平衡。

对于这样一个简单的工具,网络视角提供了对我们世界惊人的洞察力。

本文中对网络的处理是非常基本的,但是通过将事物视为图形(网络的基本数学对象),我们可以做各种各样不可思议的事情。很多关于图的实际问题,从根本上来说都是网络科学领域研究的难题。解决这些问题的方法是将互联网数据包从你的电脑路由到脸书的基础,从你收到亚马逊包裹的速度,到网飞将相同内容同时传输给数百万用户的能力。网络图还有许多其他用途,其中一个重要的用途是本体(或知识图)。将这些系统严格定义为图形,可以使用非常有趣的数学工具。我希望在某个时候,在一篇更技术性的文章中涵盖其中的一些内容。

我在这里写的笔记主要是受我最近开始读的三本书的启发。第一本讲述了在物理世界中,网络是如何以极其相似的结构出现的,书名为 好主意来自 *。*第二个是关于电报以来的通讯史,也就是所谓的 总开关 。我只读过这两本书的第一章,但是一点点白日梦产生了一些有趣的想法,我想记下来。我想它们会随着我的深入而改变。最后一本书在我看来不太新,但对技术如何影响社会有着深刻的见解,书名是《文化帝国》,作者是我最喜欢的作者之一彼得·欣延斯。他对成本重心格局变化以及技术如何在其中发挥关键作用的观点是我们这个时代最有趣的观点之一。他还编写了 ZeroMQ 及其非常有趣的文档。让软件文档变得有趣是一个不可思议的壮举,证明了 Hintjens 作为作家的天赋,所以希望这是一个足够有说服力的理由来看看他的作品。

关于招聘与技术的思考

原文:https://towardsdatascience.com/thoughts-on-recruiting-and-technology-5bae04b933e?source=collection_archive---------0-----------------------

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

由于我即将进入大学四年级,最重要的是毕业后找份工作。我敢肯定,对于全国的每一个大学毕业生来说,这都是一件压力很大的事情。为了剖析求职过程,我试着把它看作一条双行道:招聘者和求职者。招聘者希望找到人才加入他们的公司,而求职者希望找到最好的工作地点。作为一个求职者,我认为从招聘者的角度来看会非常有趣。如何找到合适的候选人?如何评价一个人对另一个人?如何确保一个强有力的候选人不会对公司失去兴趣?

上周,我参加了一个在 Hired 的聚会活动,这是一个职业市场,它将求职者和想要雇佣他们的公司联系在一起。他们就技术和招聘的交叉进行了小组讨论。在旧金山这样一个高度创新和以技术为导向的地方,软件侵入了公司的每个职能部门,甚至在销售(Salesforce)、用户研究(UserTesting)、集客营销(HubSpot)等非技术岗位……招聘也不例外,推出了 Jobvite、Workable、ApplicantStack 等产品……在这次讨论中,小组讨论了用于招聘和雇用顶级人才的创新工具,以及技术如何改变公司获取人才的各个方面。小组成员是:

安德鲁·哈布斯 —温室产品总监

Vivek Reddy—Entelo 前人才主管**

艾琳·勒纳——联合创始人兼首席执行官接受采访**

Gemmy Tsai—产品负责人。

艾莉森·巴瓦泽-佩德罗——育碧美人力资源经理

按照我通常的写作风格,我会概括讨论中的问题和答案,并对每个问题补充一些我的想法。

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

为什么大多数科技公司目前的招聘流程被打破了?

来自小组成员的大多数反应的共同点是,那里有太多的噪音;因此,很难对你的工作申请进行优先排序。从求职者的角度来看,如何放大信号?(如何发现合适的机会去争取?).双方也有很大的差异:公司找不到合适的候选人,求职者不知道他们想要什么。Aline 举了一个软件工程招聘的例子——它应该是完全精英化的(基于候选人的编程技能),但许多公司转而追求血统(基于他们去的大学或之前工作的公司的名称)。

在我看来,至少最后一部分是真的,硅谷的许多科技公司更看重应聘者的学历。如果你在斯坦福或常春藤盟校学习,你的机会会比其他申请人多得多。在一所文理学院学习,我真的需要主动想出策略来吸引招聘者的注意:个人网络、会议和聚会、社交媒体参与……等等。

技术如何改善现有的破碎流程?

像“雇佣”和“T2 温室”这样的产品确实让公司和候选人更容易互动,更了解对方。从小组成员对这个问题的回答中,我发现了 3 件有趣的重要事情:

技术改变了候选人和公司之间的权力动态。传统上,公司可以等待候选人申请空缺职位。现在,这些公司不得不将自己标榜为一个有市场、值得工作的地方,因为有许多其他选择可供候选人从雇佣或温室等平台中选择。

招聘人员的角色转变为品牌大使。这是非常直观的:如果公司需要树立自己的品牌,招聘人员的工作就是与候选人交谈,展示质量、福利以及任何关于工作机会的积极方面。

****公司需要采用其他职能领域的技术来培养候选人。这又回到了我在第一段提出的观点——销售、营销、人力资源都需要利用技术来培训新员工,让他们熟悉工作文化。

Aline 提出了另一个很好的解决方案,那就是使用技术来评估面试表现。她的公司intervaling . io,本质上是为软件工程候选人提供样本技术面试问题,然后使用评分算法对其进行排名。

然而,最有趣的答案来自 Gemmy,Hired 的产品负责人——应用机器学习和大数据来帮助采购和招聘过程。他提到,Hired 的产品团队正在使用机器学习算法,根据候选人个人资料和公司职位描述的数据,将候选人与他们最有可能感兴趣的工作进行匹配。我认为这完全改变了游戏规则,因为它将使招聘过程完全民主化。

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

求职者找到合适工作的主要挑战是什么?

专家小组的回答更倾向于候选人如何最好地表现自己。他们在这里:

确保你的简历整洁有序。

在整个求职和面试过程中保持诚实和真实。

少即是多:关注你过去最自豪的成就,而不是罗列一大堆东西。

期待这个过程是双向的。

最后,公司方面应该有更好、更详细的职位描述,以便应聘者知道应该期待什么和准备什么。

你是那种随时都在为找工作而感到压力的人吗?或者你是一名招聘人员,想要寻找最优秀的人才在你的公司工作?我很想听听你对这篇文章的看法!

解释线程和并发概念

原文:https://towardsdatascience.com/threads-and-concurrency-concepts-explained-2b0aa3b49b5a?source=collection_archive---------10-----------------------

我目前的工作要求我编写代码,如果代码是按顺序编写的,可能会花很多时间来执行。一个示例任务是将几个视频剪辑提取到帧中,以便用于训练我的深度学习模型。对于总持续时间为 4 小时的 96 个剪辑,序列代码将花费 1 小时用于帧提取。具有讽刺意味的是,我的电脑只有一个核心工作,而其余的闲置。这就是线程和并行处理可以介入并产生影响的地方!

不久前我在计算机系统课程中获得的关于线程和并行处理的知识现在已经帮助我显著地改进了我的代码。不用说,一旦代码被重写,运行同样的任务会快几倍。具体来说,在上面的例子中,现在只需要大约 11 分钟,因此在我的 CPU 上大约快了 5-6 倍(6 个内核/ 12 个逻辑处理器)。

那么什么是并行处理呢?粗略地说,并行处理是指你有一个很长的任务,可以分解成独立的子任务(也就是说有些任务不能分解,例如子任务可能是依赖的,因此为这些任务并行编写代码是没有用的)。然后,子任务被分布在本地计算机或网络上的处理器上,以最小化总执行时间。子任务可以是应用于相同数据的不同函数,或者是应用于数据分布的相同函数。

穿线呢?我想和你分享我在计算机系统课程中写的最后一个 zine 项目。希望这将为您提供线程和并发的概述。如果你不知道 zine 项目,请查看 wiki、这个链接中的 zines 简史,以及如何在这个链接中制作 zine。此外,因为我教授是小猫的忠实粉丝,她有时会在讲座幻灯片中与我们分享令人敬畏的图片,所以如果你在我的杂志项目中到处看到一些,不要感到惊讶:)

请找到下面的项目!

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

我希望你喜欢这篇文章。希望它也能启发你改进你的代码。在我的下一篇文章中,我将与您分享一些示例用例。和往常一样,请随时在下面给我反馈!

干杯,

回溯测试历史数据的 3 种方法

原文:https://towardsdatascience.com/three-approaches-for-backtesting-historical-data-aee7783b9e64?source=collection_archive---------6-----------------------

读取和处理数据,用于交易中的统计和定量分析

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

任何对金融市场的统计分析感兴趣的人都需要处理历史数据。需要历史数据来进行回溯测试或训练:

  • 量化交易。
  • 统计交易。
  • 价格行动回放/演练。

每种需求都来自不同的目标。

3 个关于为什么需要回溯测试和统计分析的例子

将回溯测试和统计分析结合到交易中有很多原因,它们可能来自非常不同的交易风格和方法:

  1. 日内交易者可能对收集关于在交易时段期间开仓缺口被平仓的概率的统计信息感兴趣。
  2. 价格行为自主交易者可能想要重放历史数据用于训练目的,或者简单地浏览过去的交易日。
  3. 一个定量/算法交易者可能想要运行模拟和回测她的算法。

虽然每种市场方法都不尽相同,但对可用数据进行计算的需求却是所有方法的共同点。

如何做到这一点的 3 种方法

有三种主要的不同方法来处理历史数据分析:

  1. 可以使用像 MetatraderPro Real Time 这样的交易平台——仅举两个在散户中很有名的软件包为例。它们提供编程和回溯测试功能,并且具有与实际下单工具相同的优势。
  2. 一个特定的回溯测试软件(比如 Amibroker - 仅仅是提到一个负担得起的软件)可以用来执行所有的数据分析和回溯测试。它们通常比常规的股票图表软件更擅长回溯测试和分析,因此可以被认为是更严格的方法。
  3. 可以开发定制软件,最常用的两种语言是 RPython 。就资源和时间而言,这是昂贵的,但也是最灵活的方法,因为它对分析数据的内容和方式没有任何限制。使用编程语言还可以提供你可能需要的所有数学库,它可以让你校准性能,如果你需要的话。

你可以找到关于哪种方法是最好的方法的强烈意见。但是,就像科技和商业中的任何事情一样,权衡是存在的,环境会推动一种解决方案优于其他解决方案。

如果你正在做算法交易,你的计划是坚持价格和标准指标,利用软件图表交易工具,如 Metatrader 可能是最好的选择,它的好处是以后更容易将实际的算法策略投入市场。

更全面的回测方法是使用特定的回测软件。这带来了额外的好处,因为您可以利用该工具的扩展分析和功能。学习曲线可能与交易/图表软件相似,你将有额外的步骤来弄清楚如何将分析转化为可操作的东西。虽然有负担得起的选择,但这也将带来额外的成本。

如果您正在进行不常见的分析,定制软件可能会节省时间和痛苦,因为现有的工具和框架将迫使您遵循某些分析/策略。

在这种情况下,编程语言的选择也是相关的。这可能是最严肃和最灵活的方法,但也是对资源和时间要求最高的方法。如果你不打算分配必要的承诺、技能、时间或资源,这肯定是一个糟糕的选择。

您也可以将它们混合使用,因为这些选项并不相互排斥。您可以使用回溯测试平台进行更常见的分析和概要分析,并使用定制软件进行非常具体的分析,这在现有框架中可能很难实现。

关于使用 Metatrader 的一些问题

由于是免费的,并且是我使用的差价合约的制图和交易软件,我认真考虑过使用 Metatrader

作为一个商业框架,它带来了这类产品的常见弱点:

  • 学习曲线并不像供应商和产品爱好者所说的那么容易。
  • 它们的初始设置通常不那么简单。获取我们的第一个直方图有时可能很有挑战性。
  • 当你做标准的事情时,它们可以节省时间,但是当你受到限制时,打破常规通常要困难得多。
  • 它们通常存在性能问题,因为它们被构造为模块化和分层的软件,以应对各种资产和场景。
  • 存在盲点,该工具要么太复杂而无法使用,要么根本不可能实现您想要的。
  • 你必须学习很多东西,但你实际上只使用了其中的一些能力。

主要的优势是你通常可以很快得到富有成效的结果,并且通常更容易得到社区的支持。

使用 Metatrader

当我对统计分析感兴趣时,我有机会和一个交易者交谈,他把这作为他工作的一部分。他对为什么使用 Metatrader 提出了很好的观点,但是他的一个评论让我想到:

Metatrader 可能是最好的方法,因为您可以实际看到数据,并且所有指标都已经在那里了。尽管如此,我一点也不喜欢它。

当有人花了足够的时间来掌握一个软件工具,但不是 100%满意时,这应该触发一个危险信号。

这位同事已经成功通过了 *Metatrader 要求的学习曲线。*他设法克服了商业框架的所有限制,并且他明智地利用了他过去的努力和 Metatrader 的实际优势和能力(一旦你处理了最初的学习曲线,这些都是相关的)。

我还意识到,这个人可能不愿意开发定制工具,最终目标是得到一个可以工作的交易机器人。在这种情况下, Metatrader 可能是最好的选择。

在这次谈话之后,我浏览了一下 Metatrader 的文档,并试图找出如何获得基本的统计输出。我无法理解如何轻松地进行基本和简单的分析,并且我发现没有针对数据的实际数据模型。我只是不喜欢我所看到的-这显然是基于我以前在技术框架方面的经验的个人意见。我认为,任何回溯测试工具都应该能够轻松地导入数据,并提供基本的统计数据,而只需一个忠诚的用户付出最少的努力。

我觉得 Metatrader 不适合我,因此我决定继续寻找和评估定制软件选项。虽然不是我选择的选项,但是值得一提的是 Metatrader 可能是最快最安全的快速见效的方法。

使用 Amibroker

来自 quantitative rader 的简·福克斯(Jane Fox)对定量方法很认真。她除了统计支持的算法之外不使用任何其他东西,当我在一次采访中听她讲话时,我发现她正在使用 Amibroker,并对软件包本身和使用特定回溯测试软件包的抽象概念产生了兴趣。

作为一个纯粹的量化交易者,一个特定的回溯测试软件方法可能最适合这个任务。回溯测试是她的策略的 DNA。同样相关的是,Jane 似乎交易股票的摇摆头寸,并且可能不需要处理分钟蜡烛线或进行开箱即用的分析。

在这种情况下,能够轻松地将所有相关的指标和工具整合到回溯测试中可以节省时间和金钱。

在 Metatrader 的案例中,我确信学习使用它们并不像供应商和爱好者宣传的那样简单。

开发你自己的定制软件

在本文的开头,我使用了打开缺口作为例子。我是故意提到这一点的,因为我是在参加何塞·科迪纳的一次研讨会时,对金融市场的统计分析产生了兴趣。

何塞·科迪纳是西班牙著名的交易者,他在过去的 20 年里一直使用统计分析。这个研讨会是关于 DAX 开盘缺口的,它是一个关于如何分析市场特定方面的杰出介绍。分析非常具体,以至于他使用的是定制平台(如果我没猜错的话,他使用的是定制的 C# 软件)。我对分析的速度(包括分析 DAX 期货数年的 1 分钟蜡烛线)和用于解决问题的整体分析过程感到惊讶。

我最后的想法

我主要对日内操作感兴趣,特别是短期价格行为和市场统计性质之间的相关性。如此具体,我最终决定定制软件将是我的出路。

它不会很快给你结果,但它允许你建立一个定制的和熟悉的框架来满足你的需求。如果您对可用性不挑剔(编写商业软件是一个不同的历史,但这不是我的目标),并且如果您使用 UNIX/Linux 环境,您可以利用现有的软件包,那么像图形功能和用户界面这样的几个方面可以很容易地解决。

的确,我们需要投入更多的时间和资源,但商业工具也同样需要一个严格的环境,并且有自己的学习曲线。使用标准编程语言不会带来任何挑战,因为商业工具没有适当的文档,因为程序是众所周知和理解的,问题可以随着时间的推移而得到解决,而不会出现任何戏剧性的情况。

无论如何,在三个不同的选项中,我认为特定的回溯测试工具可能是一个好的选择,我计划在不久的将来广泛地测试一个。

免责声明:帖子中提到的产品和人物绝不是作者认可的,也不代表作者的观点。仅在出于教育或说明目的的公共专业活动/相关性的背景下提及他们。

公司级仪表板的三个常见错误

原文:https://towardsdatascience.com/three-common-mistakes-with-company-level-dashboards-88d636f1bf5d?source=collection_archive---------5-----------------------

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

公司级仪表板很特殊。他们掌握着所有部门和业务领域最重要的关键绩效指标(KPI)。

从首席执行官到最新的团队成员,组织中的每个人都被吸引到公司级仪表板。这使得它们不仅是一个报告工具,也是一个聚焦工具。因此,需要多加小心。

在这篇短文中,我概述了公司级仪表板的三个常见错误。

1。没有一致的设计美学

公司仪表板应该是组织数据可视化的黄金标准。这意味着:标准化的图表、一致的调色板和结构良好的布局。

然而,这很少实现。通常,我发现每个部门的仪表板都有非常不同的外观和感觉——逐步上升到不一致的公司级仪表板。

这通常是由于不同的分析师以他们自己的方式为仪表板做出贡献,并且没有一个总体的团队/个人关注用户体验。

不一致的设计意味着用户必须更加努力地提取他们需要的信息。导致混乱和误读数据。

一个设计良好的公司级仪表板在所有图表中具有一致的外观和感觉。例如,轴在标度和数字格式上都是标准化的。图表以一致的网格模式对齐。每个仪表板和每个图表的过滤器按钮都在同一个位置。标题和描述在位置和字体上都是一致的。颜色从同一个调色板标准化,允许用户轻松地从一个图表移动到下一个图表。

2.太复杂了

就在上周,我看到了一个公司级的仪表板,向用户展示了 24 个不同的指标。用户还可以选择通过原始数字或比率进行切换,有效地给了他们 48 种不同的指标来消化。这么多的信息造成了混乱。

仪表板上太多的复杂性会麻痹查看者,导致用户要么完全忽略信息,要么只关注熟悉的指标。研究告诉我们,管理者在做商业决策时会偏向于熟悉的标准和数据。

需要设计公司级别的仪表板,以便只显示关键的 KPI。深入和复杂的分析不应出现在公司层面的仪表板上。相反,它们应该只存在于部门或项目级别的仪表板中。

我见过的最好的公司级仪表板有一个顶级仪表板,上面有收入或新用户增长等 uber KPIs,每个部门还有一个仪表板,显示他们的前 6 个(或更少)KPI。

如前所述,公司级仪表板既是一种报告工具,也是一种聚焦工具,因此应该尽可能保持其简单性。

3。优化所有格式的用户体验

决策的节奏越来越快,人们期望企业领导可以在需要时通过他们的所有设备获得信息。

然而,我很少看到针对移动优化的仪表板。相反,我们仍然希望用户从桌面访问数据。这对一些人来说可能没问题,但我很少看到高层领导坐在办公桌前。他们经常从一个会议跑到另一个会议,只带着一个 iPad 或手机。

为了满足数据用户的需求,公司级仪表板需要对所有用户可用——这意味着在所有设备上;手机、台式机或 iPad。

我曾在几次与高层领导的会议中被抓到,他们有自己的 iPad,想看一些数据,但看不清楚仪表盘。这是我早期学到的一课,它教会我确保我构建的每个新仪表板都是移动友好的。


公司级仪表板为组织设定了数据可视化的标准。如果它们设计得很差,那么其他仪表板和报告也会设计得很差,增加了数据被错误读取或者更糟,根本不被使用的可能性。

然而,一个设计良好的公司级仪表板可以为清晰明了的报告创造条件。它通过提供一组简单、易于理解的 KPI 来帮助用户,这些 KPI 可以帮助部门集中精力并与共同的目标保持一致。它还可以通过设置预期标准来提升整个组织的数据可视化。清晰明了的报告对于用户体验和鼓励用户在决策中正确使用数据都很重要。

商业领袖应该问苹果新机器学习套件的三个问题

原文:https://towardsdatascience.com/three-questions-business-leaders-should-be-asking-about-apples-new-machine-learning-kit-6c3a6d889ec4?source=collection_archive---------10-----------------------

这家科技巨头的开源工具包可以帮助你的企业利用人工智能的最新发展

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

2017 年底,苹果发布了 Turi Create,这是一个开源包,可以让开发者更容易地将机器学习的力量融入他们的应用程序,从而在机器学习领域引起了轰动。该公司的声明声称,Turi Create 将允许用户“专注于任务,而不是算法。”让我们面对现实吧:对于时间和资源有限的商业领袖来说,这简直是天籁之音!

现在,世界各地的数据科学家和软件开发人员已经有了一些时间来吸收这一消息,并开始与 Turi Create 合作,让我们来分析一下它如何成为您企业的游戏规则改变者——即使您的企业仍在跟上人工智能的最新发展。

1。那么图里到底在创造什么?

Turi Create (TC)是一个机器学习工具包,让你通过插入几行代码来为你的应用程序实现定制的机器学习模型。它的优势,以及它与其他套件的区别,是它的速度,效率和独特的功能(如 GPU 加速),这些功能要么不存在,要么处于竞争包的早期阶段。

到目前为止,TC 的主要用途分为以下几类:

  • 推荐:了解用户偏好并推荐可能感兴趣的产品
  • 图像分类:按类别标记图像
  • 图像相似性:学习图像之间的共同模式
  • 对象检测:标记图像和视频中的对象“是什么”和“在哪里”
  • 活动分类:通过身体传感器和活动追踪器了解锻炼、健康和习惯
  • 文本分类:将未标记的单词和文章映射到类型和主题

这仅仅是开始。展望未来,我们可以期待 TC 开发人员探索主题建模(从文档中总结和提取主题和主题)和自然语言处理(阅读和理解语言),开辟一个全新的可能性领域。

2。好了,我了解了基本情况。那么苹果究竟在用 TC 做什么呢?

苹果收购 Turi,一年后发布 Turi Create,表明该公司正在认真建设其机器学习能力。当然,它在这个领域并不孤单,因为从谷歌这样的巨头到小型初创公司都在“大数据”领域竞争。

然而,与其他一些科技公司不同,苹果以尊重客户的数据隐私为荣,因此它的重点仍然是改善总体用户体验。以下是库比蒂诺团队目前在其产品和服务中使用 TC 的一些方式:

  • 增强 Siri 预测您需求的能力
  • 升级 Apple Music 以更好地为您匹配出色的新艺术家
  • 为拨打您 iPhone 的新号码改进来电显示
  • 预测你的卡路里消耗和一般活动
  • 差分隐私允许您在不牺牲隐私或数据机密性的情况下利用人工智能

随着 Apple 继续扩大其对 TC 的使用,您将希望了解最新的应用程序,以便可以集思广益,如何为您自己的业务挑战开发类似的解决方案。最好的方法之一就是关注苹果公司定期更新的机器学习博客。

3。这些都是非常有趣的应用,但是我如何开始考虑使用 TC 来使我在 T4 的业务受益呢?

这里有一个好消息:因为 Turi Create 为你做了很多工作,你不需要开发先进的机器学习技能来利用它的前沿技术。此外,因为 TC 是开源的,所以您很可能能够找到由第三方开发人员创建的现有模型来帮助您解决业务问题。

您的任务在于创造性地将 TC 及其开源模型应用于您独特的数据集。例如,如果您的企业销售订阅服务或许可软件,TC 的广泛分类模型套件可能会确定哪些客户更有可能流失或“流失”。然后,您可以激励这些客户续订,或者确定另一种产品是否符合他们的需求。

另一个用例:如果你的公司提供许多产品或服务——并且你有关于你的客户群的数据——你可以实施 TC 的推荐系统来量化客户的兴趣,并优先考虑你营销或提供的新产品。目前,这些模型驱动着亚马逊和易贝的“推荐给你”列表、Spotify 的音乐播放列表管理和 GrubHub 的供应商聚光灯。

最后,如果您经营一家使用身体传感器收集心脏、大脑或活动指标的医疗企业,您可以使用 TC 的活动分类器从陀螺仪、恒温器等设备获取数据。该模型将预测可能发生的锻炼、慢性疾病或医疗紧急情况。除了医学领域,您还可以将模型应用于网络安全、工程和任何可以从嘈杂的数据中推断出模式的领域。

思考这些例子,您可能开始理解如何以类似的方式使用您自己的数据。既然你已经开始询问*(1)Turi Create 的基础知识,(2)苹果如何使用该平台,以及(3)你如何将它创造性地应用到你的工作中*,你就离搞清楚 TC 如何为你的业务打开一个新的可能性世界更近了三步。

关于我:我是 Metis 的高级数据科学家,该公司提供全职沉浸式训练营、兼职职业发展课程、在线学习和企业计划,以加速数据科学家的职业生涯。

你应该问任何人的三个问题——人工智能或机器学习

原文:https://towardsdatascience.com/three-questions-to-ask-artificial-intelligence-ai-machine-learning-6402c23ecf89?source=collection_archive---------8-----------------------

人工智能和机器学习看起来像黑匣子吗?这里有一些基本的问题,可以打开他们的盖子,以更批判性的方式接近他们。

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

Key take-away from Momin M. Malik: All the hyped names distract from the substance that it is just statistics.

你可能很难想到一家大型企业不谈论使用人工智能来解决他们目前面临的至少一些问题。似乎无处不在。

但这是什么呢?记者们如何报道它而不求助于 AI 将军的好莱坞图片:一台可以做任何事情的机器,从熨烫你的衬衫到奴役人类?

幸运的是,哈佛大学伯克曼克莱恩中心的数据科学博士后 Momin M. Malik 对于当你遇到一家公司或政府机构销售“由人工智能驱动”的东西时应该问什么样的关键问题有一些想法。

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

Momin M. Malik is a data science postdoctoral fellow at the Berkman Klein Center for Internet & Society at Harvard University,

1.型号是什么?

根据 Malik 的说法,人工智能、机器学习、预测分析和神经网络只是用来描述自 50 年代以来一直在研究的同一事物的一些名称。

但是创造一个无所不能的人工智能的想法已经被普遍抛弃,除了在好莱坞。电脑里并没有藏着有感知能力的人造生物。

听到 AI,ML 等的时候。今天它要窄得多。这只是数学。许多名字偏离了现实,这只是统计模型,每个模型都有自己的用途。

具体来说,你应该问这是不是一个决策树

如果是的话,你可能是幸运的,因为这些可以被普通人理解。其他像“神经网络”或“随机森林”这样的模型对人们来说太复杂了,难以理解。另一方面,决策树可能非常简单,它背后的数据科学家可以带你穿过它的分支。

2.预测精度如何(以及基于什么)?

机器学习基本基于两组数据:训练数据测试数据。你把第一组数据输入机器,教会它数据集中的相互关系,并把它放入一个模型。

假设你用了泰坦尼克号一半的乘客名单。该列表将包括乘客的年龄、性别、机票类型和票价,以及他们是死是活。那是你的训练数据*。*

这些数据允许你建立一个模型,如果你知道新乘客的年龄、性别、机票类型和价格,这个模型可以估计新乘客存活的可能性。

乘客名单的另一部分可用于通过查看模型预测正确结果(活着还是死了)的频率来计算模型的准确性。那将是你的测试数据。

销售“人工智能驱动”软件的人可能会吹嘘自己的预测准确率接近 100%。但是像这样的数字可以用很多方法计算,你可以" 过度拟合 "一个模型,它在你的测试数据上工作得很好,但是在现实世界中就不那么好了。

麻省理工学院媒体实验室的研究员 Joy Buolamwini 最近的一项有趣的发现正好证明了这一点。

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

Joy Buolamwini is also the founder of the Algorithmic Justice League. Photo by Niccolò Caranti (CC)

当她使用面部识别模型时,她发现该软件可以在她朋友和同事的脸上工作,但不能在她自己的脸上工作。直到她戴上白色面具,人工智能才注意到她。).

从那以后,她记录了多少商业面部识别算法在识别黑人女性方面如此糟糕,以至于他们还不如抛硬币来决定他们的性别,尽管他们在主要是白人(男性)的脸上测试时可能工作得很好。

具体的准确性数字可能不是非常重要,但询问它所依据的测试数据可能会揭示模型中的漏洞或通常对少数群体打击最大的固有偏见。

根据 Momin M. Malik 的说法,另一个危险信号是,如果模型使用的追溯数据只关注过去发生的事情。

模型的最佳测试是在模型建立后收集的数据。但是这种类型的测试通常不会进行。

在许多情况下,这可能是好的,但由于显而易见的原因,泰坦尼克号模型不应该被用来预测现代邮轮上的生存变化。

3.模型的目标是什么?训练数据与此相关吗?

最终,人工智能试图根据大量数据预测结果。所以你喂它什么很重要。有些可能只是噪音,隐含着不存在的意思。

泰坦尼克号乘客的头发颜色或他们名字中的字母数量可能不应该出现在存活率的模型中。

当你把所有东西都扔进模型而没有任何理论或思想支持时,这被称为“数据挖掘”。

另一个更复杂的问题是:尽管泰坦尼克号甲板上的男性溺水率比女性高得多,但这并不是因为他们的性别。这是因为规则,分配妇女和儿童的救生艇第一。但是模型不能告诉你,因为它不在数据中。

“机器学习的很多问题都是关于因果关系的。我们必须记住,预测是唯一的相关性,”这是 Momin M. Malik 的观点之一。

他在哈佛法学院的一次周四活动上展示了这些照片。你可以发电子邮件给伯克曼·克莱恩的研究员詹恩·海伦了解更多活动信息。如果你想更多地了解计算机擅长什么以及它们非常非常不擅长什么,莫明·m·马利克推荐梅雷迪思·布鲁萨德的《人工智能》。它现在在我的阅读清单上。

拉托亚·彼得森也写过“为什么记者需要了解人工智能”:

“…为了让我们真正让公众了解人工智能革命的全部潜力,我们需要在更强大的知识库上工作。”

尽管像我这样的记者应该更好地向销售或使用人工智能的人提出关键问题,但一些人呼吁对算法进行实际审计。哈佛商学院的这篇文章“为什么我们需要审计算法”说得好:

“为了金融市场和其他利益相关者的利益,公司长期以来一直被要求发布经审计的财务报表。这是因为——就像算法一样——公司的内部运作对外部的人来说就像“黑箱”一样(……)难道我们不应该让具有社会影响力的“黑箱”算法接受类似的审查吗?"

哈佛科学家建议提出以下问题:

  1. 我如何最佳地建模和使用这些数据中的模式?
  2. 这个数据样本能恰当地代表潜在的现实吗?
  3. 基于当今现实的分布是合适的吗?

麻省理工学院媒体实验室的图灵盒项目是另一件值得关注的事情。2019 年,他们计划发布审计算法软件。

如果你已经走了这么远,感谢你的阅读。今年我在麻省理工学院做我的骑士科学新闻奖学金,在那里我花时间研究技术和新闻的关系。任何想法或想法都非常欢迎

[## 为什么我现在在剑桥

探索开发者和记者之间的关系…

medium.com](https://medium.com/@magnusbjerg/the-journalist-developer-relationship-or-why-im-in-cambridge-right-now-318f3300bad1)

不应该使用深度学习的三个理由

原文:https://towardsdatascience.com/three-reasons-that-you-should-not-use-deep-learning-15bec517b622?source=collection_archive---------4-----------------------

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

Tweaking neural network hyperparamters can be tricky business. Even Peter Griffin has trouble with it!

我为学习者写了一份名为《强大的知识》的时事通讯。每一期都包含链接和最佳内容的关键课程,包括引文、书籍、文章、播客和视频。每一个人都是为了学习如何过上更明智、更快乐、更充实的生活而被挑选出来的。 在这里报名

深度学习在过去几年里一直是人工智能领域最热门的事情。事实上,这真的激发了科学家、政府、大公司和几乎所有人对人工智能的兴趣!这确实是一门非常酷的科学,具有潜在的巨大的实际和积极的应用价值。它被用于金融、工程、娱乐以及消费产品和服务。

但是我们真的应该到处使用它吗?每当我们做出新的东西时,我们应该自动进行深度学习吗?

有一些情况下,它真的不适合使用深度学习,以及一些为什么你会选择走另一条路的原因。让我们探索它们…

(1)它对小数据不太适用

为了实现高性能,深度网络需要非常大的数据集。我们拥有的标签 数据越多,我们的模型表现就越好。获得良好注释的数据既昂贵又耗时。雇人手动收集图像并贴上标签根本没有效率。在深度学习时代,数据无疑是你最有价值的资源。

在最新研究中取得高性能的网络,往往是在几十万甚至 几百万 样本上训练出来的。对于许多应用程序来说,这样的大型数据集并不容易获得,而且获取起来既昂贵又耗时。对于较小的数据集,回归、随机森林和 SVM 等经典 ML 算法通常优于深度网络。

(2)实践中的深度学习既困难又昂贵

深度学习仍然是一项非常前沿的技术。你肯定可以像很多人一样得到一个快速简单的解决方案,特别是使用广泛可用的 API,如 Clarifai 和谷歌的 AutoML 。但如果你想做一些相当定制的东西,这样的服务不会削减它。除非你愿意把钱花在研究上,否则你会有点局限于做一些至少和其他人做的事情稍微相似的事情…

这也很昂贵,不仅因为获取数据和计算能力所需的资源,还因为雇佣研究人员。深度学习研究现在非常热门,所以这三项费用都非常高。你最终还会有很高的开销,因为当做一些定制的事情时,你会花很多时间去尝试和破坏。

(3)深层网络不容易解释

深层网络是非常“黑箱”的,因为即使现在研究人员也没有完全理解深层网络的“内部”。他们有很高的预测能力,但解释能力较低。由于缺乏理论基础,超参数和网络设计也是一个相当大的挑战。

最近有很多工具,比如显著图和激活差异,它们对某些领域非常有效,类似于下图所示的工具。但不幸的是,它们并不能完全适用于所有应用。这些工具经过精心设计,主要是为了确保您不会使网络过度适应数据集或专注于虚假的特定要素。仍然很难解释每个特征对深度网络的整体决策的重要性。

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

Visualizations of features in a deep convolutional neural network

另一方面,经典的最大似然算法,如回归或随机森林,由于涉及直接的特征工程,很容易解释和理解。此外,调整超参数和改变模型设计更加简单,因为我们对数据和底层算法有了更透彻的理解。当网络的结果必须被翻译并交付给公众或非技术受众时,这些尤为重要。我们不能只说“我们卖了那支股票”或“我们在那个病人身上用了这种药”因为我们的深层网络这么说。我们需要知道原因。不幸的是,到目前为止,我们所有关于深度学习的证据都是经验性的。

喜欢学习?

在 twitter 上关注我,我会在这里发布所有最新最棒的人工智能、技术和科学!也在 LinkedIn 上和我联系吧!

对人工智能重新品牌化三思的三个理由

原文:https://towardsdatascience.com/three-reasons-to-think-twice-about-ai-re-branding-d0c8e7c11e5d?source=collection_archive---------6-----------------------

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

(Image details are given in footnotes)

“当我使用一个词时,”汉仆·邓普蒂用相当轻蔑的语气说,“它的意思就是我选择它的意思——不多也不少。’

“问题是,”爱丽丝说,“你能不能让单词有这么多不同的意思。” —刘易斯·卡罗尔,透过镜子

“人工智能”或简称“AI”是一个不透明的术语,没有公认的定义,范围也有争议。它通常被用来代表一种或多种不同的技术,这些技术有能力给整个世界带来实质性的、变革性的和破坏性的变化。由于它所代表的技术的影响力越来越大,它在新闻报道中的出现频率越来越高。许多组织都在争先恐后地将其纳入营销材料,并将其融入内部流程。鉴于目前围绕这个词的热议,肯定“跟上这个项目”并利用这种高水平的兴趣是有意义的吗?为什么你不想让人们看到你的公司时马上想到“人工智能”?

在科学和技术社区内,使用人工智能作为标签,几十年来一直被视为有问题的。在机器学习、数据科学、图像分析和自然语言处理等研究领域,这个术语很少被提及。也许现在是我们这些在这些领域工作的人或者对该领域的历史有更深理解的人思考我们如何与我们的雇主和利益相关者接触的时候了:特别是,我们如何围绕这些新兴技术进行有效的沟通,同时将所有这些技术聚集在一个过度宣传的品牌下的固有风险降至最低。下面,我提出了人工智能标签在科学界不受欢迎的三个相互关联的原因,并通过一个论点扩展了每个原因,即我们为什么要对这个术语在工业中的过度采用保持谨慎。

1。历史论证

不记得过去的人注定要重蹈覆辙。——乔治·桑塔亚纳

我们现在已经看到两个 AI winters 了。当这些发生时,研究资金枯竭,项目被封存,工作岗位流失,科学进步受到限制。人工智能历史上的下一个重大故障将会不同,它将不会是一个冬天,而会有更多的反弹。现在这似乎是必然的了;剩下的问题更多的是反弹会有多大。如果目前关于自动化对就业市场的影响的预测成为现实,这可能是相当大的一笔。在这种情况下,预计会看到与禽流感相关的负面宣传越来越多,就像前两个禽流感冬天一样,个人和组织会争相通过明显(1)远离这个术语来实现损害限制。如果余波达到政治层面,学术研究活动可能会受到深刻影响。面对公众压力,政治层面的反应可能会引发下意识的、而非深思熟虑的监管反应。

2.“教育公众”的论点

“任何足够先进的技术都和魔法没什么区别。”
——亚瑟·C·克拉克

对于大多数在可能被视为人工智能的领域工作的人来说,存在着精确、准确和有意义的标签。让我们使用它们。如果我们从事数据科学,就这么说吧(2)。如果我们正在开发增强现实硬件,就这么说吧。如果我们专注于自然语言处理,那么让我们明确这一点。如果我们在机器人技术中结合机器学习方法,那么让我们用那种精确度来描述它。将这些不同的技术融合在一个抽象的标签下,给原本清晰明了的技术蒙上了一层不必要的神秘面纱。如果我们希望更广泛的公众对将影响他们的发展有一个明智的理解,让我们尽可能使用准确和有意义的术语来帮助创造这种理解。

如果人工智能将成为许多人认为的巨大、包罗万象、改变生活的范式转变、引发奇点的“东西”,那么它将影响科学的每个领域和地球上每个人的生活。因此,这个术语将变得比现在更加模糊不清……包含了几乎所有的东西,意味着几乎所有的东西。会比现在更不具体,更有问题。如果大多数普通人认为人工智能是有效的“魔法”,那么科学和技术社区将在他们所面临的最重要的教育挑战中失败。

3.“语义”论点

" 机器能否思考的问题……和潜艇能否游泳的问题一样重要。 —埃德格·w·迪杰斯特拉

我们用了一个词——智力——几个世纪以来,人们一直在争论这个词的含义,我们把它纳入了一个用来定义一门科学学科的术语。因此,结果是我们创造了一个本身也无法定义的表达。由此产生的关于人工智能现在意味着什么的广泛观点(不幸的是,对许多人来说是“天网”)经常会破坏有价值的讨论或辩论。关于某种形式的机器学习方法与特定挑战的相关性的技术对话,可能会立即被类似“什么是智能?”这样的感叹词边缘化,“机器真的能变得有意识吗?”或者“机器会接管吗?”以这种方式“离题”的对话通常是无法恢复的(3)。

值得强调的是,事实上,数据科学(个人数据、隐私权)和自动化(围绕无人驾驶汽车的问题、对就业的影响)领域出现了许多至关重要的哲学和伦理问题,需要紧急考虑。这并不是说这样的讨论是不相关的,而是在某个特定领域的背景下产生或正在进行的讨论需要某种程度的关注,才能有任何价值或取得任何成果。由于人工智能不是一个特定的领域,围绕这个术语的任何对话都很合理地向任何人开放,基于他们对人工智能对他们个人代表什么的看法。因此,这一术语已成为滋生混乱和误解的温床,并经常成为不同学科和利益之间分歧的爆发点。

反论点

一旦新技术碾过你,如果你不是压路机的一部分,你就是道路的一部分。”—斯图尔特·布兰德

当然,有一种观点认为人工智能是“瓶子里的精灵”:它现在实际上是一种不可阻挡的力量,有巨大的经济动力推动它;这意味着无论我们选择什么术语,它都会对我们产生影响。所有这些毫无疑问都是真的,这些都不能使上面的论点无效。然而,“人工智能”的发展如果不承认或不参与上面提到的一些问题,可能会产生令人不安的社会后果,对未来的发展产生不利影响:

艾很清楚现在是瓶子里的妖怪。这种表达一直伴随着我们。当它是正确的表达方式时,让我们使用它。如果不是这样,鉴于我们手边有大量定义明确、普遍接受、准确且有意义的术语,让我们尽可能有效地与受众沟通。

脚注:

(1)历史上,一些人工智能研究项目通过研究人员重新命名他们的工作,或者使用现有的术语,新的标签或者两者的结合(统计学,机器学习,统计学习),度过了人工智能的冬天。)

(2)经常有人声称或观察到数据科学是一个不可定义或模糊的术语。这正日益成为一小部分个人或组织的自私论点,并且严重夸大了事实。数据科学领域的大多数人都非常清楚自己在做什么。然而,数据科学目前是一个热门术语,因此它很容易被滥用,例如在寻求项目资金时,或被寻求就业的个人滥用。它可以服务于那些在数据科学边缘工作或超越数据科学边缘的人的利益,尝试扩展该术语的含义,以便他们自己的活动适合它。

(3)希望我已经阐明,这不是一个反对广泛辩论的论点,也不是反对我们当前科学发展背景下的一般哲学问题的论点。也不是反对讨论智力或意识的意义。

图片(从左到右):
-两个反对增加机械化的人看到机器弄坏了一台提花织机——维基百科。
——“总督”郁金香,在 1637 年“郁金香狂热”崩溃的高峰期,其球茎售价约为普通房屋价格的五倍——维基百科。
-用注射器注射西红柿的图像是一种常见的图形,用于表示对转基因生物的担忧——exposingtruth.com。

展示数据洞察力的顶级技巧

原文:https://towardsdatascience.com/three-tips-for-persuading-with-data-52d1e51f45ed?source=collection_archive---------9-----------------------

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

更有效、更容易理解

对于数据分析师来说,没有什么比揭示真实公司问题的数据更令人兴奋的了。然而,向管理层提出见解却一事无成是完全令人泄气的。

你必须考虑它是我的信息,我的语言,还是我的技术。这里有一些解决这个问题的方法。

不要用你的才华让他们过于耀眼

一位营销副总裁透露,在他明白如何与面前的观众交谈之前,他没有说服力。这位主管有统计学博士学位,所以可以说他了解数据分析。

在他的第一份工作中,他在向管理人员展示他的分析时并不成功。最后,另一位经理透露,这些演示具有如此先进的分析能力;他觉得自己很蠢!他经常不理解正在展示的内容,并且害怕在别人面前提问。

陈述让听众觉得自己很蠢——你认为他之后听了多少?**哎哟!在他努力用这些精彩的见解使人眼花缭乱的时候,他没有考虑到观众。**向企业领导演示时,考虑需要多少分析来证明你的观点。也许谈论标准差和 t 检验是过多的细节或错误层次的细节。这取决于公司文化。

很多时候,经理想要更高层次的细节。他们相信你已经做了功课。如果您担心房间里的一些专家需要详细的分析,那么请预测他们的问题!如果有帮助的话,添加一些备份幻灯片。

技巧 1:利用数据洞察力进行说服的能力必须与你的受众的需求和数据悟性相匹配。

人们想帮助别人

在最近的一次会议上,一名与会者在吃早餐时评论说,他知道他的学校可以从第三名上升到全州第一名。不一会儿,他就快速地说出了 15 个统计数据,这让我确信这个目标是可以实现的。

当想到这个目标所涉及的所有工作时,我觉得这是一个巨大的挑战。在试图吃一天前的丹麦面包时,我没有一个简单的答案。

他无法让他的同事听他的。我怀疑他遇到了与上一个故事中的绅士相似的问题。他告诉老师们,如果他们能提高一个标准差,一切都会变得完美。

一个标准差之外…这难道不是数据怪胎的话吗?

在讨论了这个问题后,我建议他考虑将人加入到数据中,因为观众可能更倾向于帮助单个学生变得比整个学区更好。人们喜欢帮助别人,教育者也想帮助学生,对吗?我得意洋洋地走开了,享受着新鲜的咖啡。

技巧 2:了解你的受众!一些观众更容易被情感上的原因所说服,而不是被看似无用的崇高管理目标所说服。

较小的问题更容易解决

后来,当我与另一位与会者交谈时,他提供了一些额外的见解。有时学校排名第一的位置可能接近 50 名学生的进步。这一想法缩小了问题的规模。

而不是“我们如何让整个学区成为第一?”可以是“如何帮助 50 名学生在学术生涯中脱颖而出?”然后达到我们的目标?

你可以举出这些学生的具体例子,了解每种情况下需要什么。这 50 个学生里面可能有一个模式!也许该团队能够找到经济高效的解决方案,推动学区向前发展。管理人员达到了他们的目标,教育者做着他们喜欢的事情——教学生。

当你和更少的观众一起工作时,你会发现更容易和他们联系,激发他们的热情,从而带来组织需要的改变。许多专家强调从小项目开始并取得成功的重要性。这自然会吸引更多人关注你的工作,包括你的管理层。

技巧三:成就是否比你想象的更近?较小的问题解决起来更自然,需要的帮助也更少。更容易获得认同!

应对机器崛起的三种方式

原文:https://towardsdatascience.com/three-ways-to-react-to-the-rise-of-the-machines-fd43db7b2c85?source=collection_archive---------7-----------------------

该系统于 1997 年 8 月 4 日上线。战略防御中不包括人类决策。天网开始以几何速度学习。它在东部时间 8 月 29 日凌晨 2 点 14 分有了自我意识。在恐慌中,他们试图拔掉插头。”

科幻迷可能会记得这句话来自终结者 2:审判日。作为一个孩子,它描绘的场景完全吓坏了我。这不是第一部机器变得有自我意识的电影。斯坦利·库布里克的 2001:太空漫游以哈尔 9000 平静、单调但令人毛骨悚然的话语而闻名:“对不起戴夫,恐怕我做不到”。

20 世纪 70-90 年代的电影和小说不乏描述数字化、计算机化技术转化为人类意识状态的场景。直到不久前,人工智能还被视为计算机化学习的快速发展,这将导致向智能生命形式的突然转变。一项技术能够自我意识并不是一个不现实的终结游戏。例如,这个视频表明,技术能够通过一种自我意识的“国王的智者”测试。

从今天的镜头来看,我们应该是既欣慰又担忧的。我们应该松一口气,因为《T4》中的天网事件并没有发生。我们仍然没有达到真正取代人脑复杂性的人工智能水平。毫无疑问,人工智能已经走了很长的路,但它目前只能可靠地取代人类做出的最简单、最可预测的决定。即使机器能够在 Jeopardy 或 Go 中获胜,也是因为它们可以在任何给定的时间点处理比人类更复杂的场景,但只能在定义的可能性宇宙内。最初的想法仍然是机器人无法企及的。

不过,我们应该感到担心,因为它正以比任何人预测的更普遍的方式发展。人工智能并不像几十年前预期的那样是政府或军事组织的专有财产。它属于我们所有人。它正在世界各个角落成长和发展。它受制于我们改进技术的本能冲动,这可能会使它势不可挡。没有单个芯片需要销毁,就像《终结者》中的那样。在这种民主化和无孔不入的形式下,也许没有什么能阻止 AI 的成长。许多人会说,也没有什么能控制它。

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

我们为什么要担心 AI?

虽然 Alexa 变得有自我意识并订购大量由汤姆·塞立克主演的电影的可能性很小(我听说她是一个粉丝),但我们应该出于非常不同的原因担心人工智能——经济原因。历史上曾有一段时期,普通工人确实在技术发展中失败了,而我们可能正处于这样一个时期的开端——而且是一个漫长的时期。

历史上只有一个时期能与我们自上世纪 70 年代以来经历的技术发展的大规模增长相媲美:工业革命,尤其是在英国和美国。工业革命推动了巨大的社会和经济变革,导致手工工作被机器取代,人口大规模流动,人口财富分配的中断,以及全球贸易的永久性变化。

NYU 大学的鲍勃·艾伦教授是一位专家经济学家,他经常从历史对比中寻找对当今问题的见解。在我参加的 Bob 最近的一次演讲中,他展示了一些非常详细的分析结果,这些分析是他对工业革命和过去 30-40 年间的生产率和工资进行的。回顾英国 1770 年至 1890 年的工业变革时期,鲍勃研究了其对生产率增长和实际工资增长(即基于收入的基本商品的可负担性)的影响。这张图表总结了他的发现:

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

模式很明显。在工业革命的前 60 年,投资者以牺牲工人为代价获得了利益。只是从 1830 年开始(鲍勃认为,所有主要的机械化变革都已完成),工资才开始随着生产率的增长而变动。鲍勃的分析也显示了美国类似的结果。

从今天的情况来看,两者有很强的相似性。自 20 世纪 70 年代以来,我们一直处于一个类似的时期,工人们正在失去他们从技术发展中获得的那份好处。下图显示了美国长期趋势的发展:

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

从 1980 年到今天这段时间尤其令人担忧。我们是否应该像工业革命那样,期待工资水平很快会赶上来?鲍勃·艾伦对此持悲观态度,我能理解为什么。我们才刚刚处于人工智能革命的开端,迄今为止只有一小部分工作受到了影响,这种破坏还要持续几十年。普通工人可能需要蹲下来做长期工作。

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

我们的三个选择

我们没有一个带着奥地利-美国口音的机器人可以及时送回去解决这种破坏正在造成的新的不平等,但我们能做些什么来控制它吗?我不想在这里假装有任何答案,但我经常听到关于这个问题的三种观点:

  1. 干预主义:要求政策干预的呼声越来越高。在我最近参加的一次演讲中,著名经济学家罗伯特斯基德尔斯基勋爵(Lord Robert Skidelsky)的一句话让我记忆犹新:“现在,即使是技术乌托邦主义者也不得不相信政策干预”。如果我们认为它对人们的福祉有害或需要工作,是否有可能减缓甚至停止 AI?这需要什么样的政策或国际机构才能有效?
  2. 自由放任:我敢说,我听到的大多数观点都属于这一类。让我们乘风破浪,期待最好的结果。这是由什么驱动的?一种我们无法实际控制或预测将会发生什么的感觉?人们对人工智能的兴趣如此之深,以至于愿意拿自己的经济福祉冒险,看看它最终会走向何方?一种信念,即使不是在我们的有生之年,事情最终总会在经济上达到平衡?
  3. **用人工智能对抗人工智能:**也许这个领域最有趣的工作是试图预测一些威胁人们经济福祉的可能发展,以及使用人工智能方法来应对这些威胁的可能性。麦肯锡全球研究所的研究帮助我们更好地理解不同的工作是如何“自动化”的,而像 Doyne Farmer 这样的学术工作有望更好地揭示当机器人抢走他们的工作时,某些人类技能集将如何“可移植”。

与此同时,当我们下定决心的时候,在世界的某个地方,另一种技术正在被迭代,这种技术将在未来几年里或好或坏地改变我们的生活。

时间不多了。你会选择哪个选项?

参见 此处 了解鲍勃·艾伦研究的更多细节。

最初我是一名纯粹的数学家,后来我成为了一名心理计量学家和数据科学家。我热衷于将所有这些学科的严谨性应用到复杂的人的问题上。我也是一个编码极客和日本 RPG 的超级粉丝。在LinkedInTwitter上找我。

收拾熊猫

原文:https://towardsdatascience.com/tidying-up-pandas-4572bfa38776?source=collection_archive---------4-----------------------

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

对于那些使用熊猫模块的人来说,你会很快意识到的第一件事是,做任何事情都有不止一种方法。

本文的目的是展示我们如何通过从 R 的dplyrtidyverse库汲取灵感来限制这种情况。

由于来自学术界,R 通常是我周围人的通用语言(计算生物学/生物信息学或统计学)。和他们一样,我迷上了著名的tidyverse元包,它包括dplyr(之前的plyr、ply(e)r)、lubridate(时间序列)和tidyr

PS。在我写这篇文章的时候,我意识到这不仅仅是 *tidyverse* ,而是整个 R 生态系统,我已经开始喜欢上它了,同时也喜欢上了宏基因组学和计算生物学。

为了方便从 R 起步的人,pandas是 python 的 dataframe 模块。像 H2Oai 的数据表这样的其他包是存在的,它在很大程度上受到 R 自己的数据表库的启发。

在他的演讲中,Hadley Wickham(dplyr 包的创建者)他提到我们真正需要的表格操作只是一些函数:

  • 过滤器
  • 挑选
  • 安排
  • 使突变
  • group_by
  • 概括
  • 合并

然而,我认为你需要比以上更多的东西。

比如知道 R 的apply函数族,会有很大帮助。或者像summarystr这样的汇总统计函数,尽管现在我大多使用skimr::skim进行汇总。

skim(iris) 
## Skim summary statistics 
## n obs: 150  
## n variables: 5  
##  
## ── Variable type:factor ────────────────────────────────────────────────────────────────────────────────────────────────── 
## variable missing complete n n_unique top_counts ordered 
## Species 0 150 150 3 set: 50, ver: 50, vir: 50, NA: 0 FALSE 
##  
*## ── Variable type:numeric ─────────────────────────────────────────────────────────────────────────────────────────────────*
*##      variable missing complete   n mean   sd  p0 p25  p50 p75 p100     hist*
*##  Petal.Length       0      150 150 3.76 1.77 1   1.6 4.35 5.1  6.9 ▇▁▁▂▅▅▃▁*
*##   Petal.Width       0      150 150 1.2  0.76 0.1 0.3 1.3  1.8  2.5 ▇▁▁▅▃▃▂▂*
*##  Sepal.Length       0      150 150 5.84 0.83 4.3 5.1 5.8  6.4  7.9 ▂▇▅▇▆▅▂▂*
*##   Sepal.Width       0      150 150 3.06 0.44 2   2.8 3    3.3  4.4 ▁▂▅▇▃▂▁▁*

事实上,skimr 的输出看起来真的很像 Google 的 Facets。正如您所看到的,打印基本的分布统计和直方图。

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

因此,在这篇文章中,我将尽力演示tidyverse词汇表与pandas DataFrame 方法的一对一映射。

为了演示,我们将使用著名的鸢尾花数据集

# python 
import seaborn as sns 
iris = sns.load_data("iris")

我选择使用 seaborn 导入 iris 数据集,而不是使用 sklearn 的datasets.load_iris,这是因为后者将数据集导入为 numpy 数组,而不是 pandas DataFrames。

在导入一个表之后,我做的第一件事就是在 data.frame 上运行str函数(不完全等同于pd.DataFrame.info()方法)并检查是否有 NAs。

# R
str(iris)
> 'data.frame':   150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...# python 
iris.info(null_counts=True)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150 entries, 0 to 149
Data columns (total 5 columns):
sepal_length    150 non-null float64
sepal_width     150 non-null float64
petal_length    150 non-null float64
petal_width     150 non-null float64
species         150 non-null object
dtypes: float64(4), object(1)
memory usage: 5.9+ KB

过滤器

现在,进入下一个功能。与 R 的filter最接近的方法是pd.query方法。在下面的例子中,截止值已经被定义为一个变量。

# R
iris %>% filter(sepal.width > cutoff)# python
## Method 1: 
iris[iris.sepal_width > cutoff]## Method 2:
iris.query("sepal_width > @cutoff”)

在 python 中有两种方法可以做到这一点。

方法 1 可能是你会发现大多数 python 爱好者使用的方法。

不过在我看来,pd.DataFrame.query()dplyr::filter()的映射更为紧密。

使用 query 的一个缺点是…遵循 *pep8* 约定的 linters,比如 *flake8* ,会抱怨 *cutoff* 变量没有被使用,尽管它已经被声明: *sepal_width > @cutoff* 。这是因为 linter 无法识别在查询的引用参数中使用的 *cutoff* 变量。

注意:令人惊讶的是,filter 在 pySpark 中有所回报。😃

# python (pyspark)type(flights) 
pyspark.sql.dataframe.DataFrame# filters flights which are > 1000 miles long flights.filter('distance > 1000')

挑选

这让人想起 SQL 的select关键字,它允许您选择列。

# R 
iris %>% select(sepal.width, sepal.length)# Python 
iris.loc[:, [["sepal_width", "sepal_length"]]]

最初,我认为下面的df[[’col1’, 'col2’]]模式会是一个很好的地图。但是我很快意识到我不能做类似于select的柱状切片。

# R 
iris %>% select(Sepal.Length:Petal.Width)# Python  
iris.loc[:, "sepal_length":"petal_width"]

关于loc方法需要注意的一点是,当选择只有一行时,它可能返回一个序列而不是一个数据帧。因此,您必须对感兴趣的行进行切片,以便输出返回一个数据帧。

# Pythoniris.loc[1, :]  # returns a Series 
iris.loc[[1],:] # slicing returns a dataframe

但是select真正令人惊叹的是,它能够让取消选择列,这是loc方法中所没有的。

你必须使用.drop()方法。

# R
df %>>% select(-col1) # Python
df.drop(columns=["col1"])

注意我必须添加参数 *columns* ,因为 drop 不仅可以用于删除列,该方法还可以基于它们的索引删除行。

filter一样,select也用在 pySpark 上!

# python (pySpark)# shows the column xyz of the spark dataframe.
df.select("xyz").show()# alternative  
df.select(df.xyz)

安排

通过 arrange 函数,可以按照特定的列对表格进行排序。

# R 
df %>% arrange(desc(col1))# Python 
df.sort_values(by="col1", ascending=False) 
# everything is reversed in python fml.

使突变

dplyrmutate实际上是 R 的apply的升级版。

注意 : R 的许多其他应用如 *mapply* *lapply* 但是可以在很大程度上被 purrr 库中的新函数所取代。

# R 
df %>% mutate(new = something / col2, newcol = col+1 )# Python 
iris.assign(new = iris.sepal_width / iris.sepal, 
newcol = lambda x: x["col"] + 1 )

默认情况下,tidyversemutate函数获取整列并对其进行矢量化操作。如果你想逐行应用这个函数,你必须将rowwisemutate连接起来。

# R
# my_function() does not take vectorised input of the entire column 
# this will failiris %>% 
    rowwise %>% 
    mutate(new_column = my_function(sepal.width, sepal.length))

为了使用.assign方法达到同样的效果,您应该在函数中嵌套一个apply

# Pythondef do_something(col): 
    #set_trace() 
    if re.search(r".*(osa)$", col): 
        value = "is_setosa" 
    else: value = "not_setosa" 
        return value iris = iris.assign( 
    transformed_species = lambda df: df.species.apply(do_something) 
)

如果你很懒,你可以把两个匿名函数链接在一起。

# Pythoniris = iris.assign( transformed_species = lambda df: df.species.apply(do_something_string))

绕道:申请

来自 R 的apply帮助文档:

apply(X, MARGIN, FUN, ...)

其中MARGIN的值对于(行、列)取12,即。如果您想应用于每一行,您可以将轴设置为0

然而,在 pandas axis 中,什么值(索引 I 或列 j)将用于应用函数输入参数的索引。

be 使用的0是指数据帧的索引,轴1是指列。

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

因此,如果你想进行行操作,你可以设置轴为 0。

# Rdf %>% apply(0, function(row){ ... do some compute ... })

自从 *plyr* 和后来的 *dplyr.*之后就很少这样做了

然而在熊猫身上没有plyr。因此,如果您想要进行逐行操作,我们必须返回使用 apply,但是,轴现在是 1 而不是 0。我最初发现这非常令人困惑。原因是因为row实际上只是一个pandas.Series,它的索引是父 p 和 as。DataFame 的列。因此,在本例中,轴指的是将哪个轴设置为索引。

# pythoniris.apply(lambda row: do_something(row), axis=1)

有趣的是,我在 R 中没有使用的模式是在列上使用 apply,在这个例子中是pandas.Series对象。

# pythoniris.sepal_width.apply(lambda x: x**2) # if you want a fancy progress bar, you could use the tqdm functioniris.sepal_width.apply_progress(lambda x: x**2) # If u need parallel apply # this works with dask underneath  import swifteriris.sepal_width.swifter.apply(lambda x : x**2)

在 R 中,有一个常见的习惯用法,我经常在groupby的平行版本中使用,如下所示:

# Runique_list %>% 
lapply(function(x){ 
    ... 
    df %>% filter(col == x) %>% do_something() # do something to the subset 
    ... 
}) %>% do.call(rbind,.)

如果你想要一个平行版本,你只需要把lapply改成mclapply

此外,还有来自 r 的parallel / snow图书馆的mclapply

# Rncores = 10 # the number of cores 
unique_list %>% 
    mclapply(function(x){ 
    ... 
    df %>% filter(col == x) %>% do_something() # do something to the subset 
    ... 
}, mc.cores=ncores) %>% 
do.call(rbind,.)

另外,在 PySpark 中,您可以将整个表分成几个分区,并行地进行操作。

# Python (pySpark)(
    dd.from_pandas(my_df,npartitions=nCores)
        .map_partitions(lambda df : df.apply( lambda x : nearest_street(x.lat,x.lon),axis=1))
        .compute(get=get) # imports at the end)

为了达到同样的目的,我们可以使用dask,或者使用swiftapply模块的更高级别的包装器。

# Python# you can easily vectorise the example using by adding the `swift` method before `.apply` 
series.swift.apply()

分组依据

pandas 中的.groupby方法相当于 R 函数dplyr::group_by返回一个DataFrameGroupBy对象。

tidy verse 中有 *ungroup* 函数对分组后的数据帧进行解组,为了达到同样的效果,不存在一对一的映射函数。

一种方式是完成*groupby*->-*apply*(两步法)和送料应用同一个功能 *apply(lambda x: x)* 。这是一个身份函数。

概括

在熊猫中,summarise功能的对等物是aggregate,缩写为agg功能。你必须把这个和groupby结合起来,所以这又是一个类似的两步groupby - > agg转换。

# R r_mt = mtcars %>% 
    mutate(model = rownames(mtcars)) %>% 
    select(cyl, model, hp, drat) %>% 
    filter(cyl < 8) %>% 
    group_by(cyl) %>% 
    summarise( 
        hp_mean = mean(hp),
        drat_mean = mean(drat), 
        drat_std = sd(drat), 
        diff = max(drat) - min(drat) 
    ) %>% 
    arrange(drat_mean) %>% 
    as.data.frame

用 Python 编写的相同系列的转换如下:

# Python def transform1(x): 
    return max(x)-min(x) def transform2(x): 
    return max(x)+5 
    py_mt = ( 
        mtcars
            .loc[:,["cyl", "model", "hp", "drat"]] #select      
            .query("cyl < 8") #filter 
            .groupby("cyl") #group_by 
            .agg({ #summarise, agg is an abbreviation of aggregation     
                    'hp':'mean', 
                    'drat':[
                        'mean', 
                        'std', 
                        transform1, 
                        transform2] # hmmmmmm
            })
            .sort_values(by=[("drat", "mean")]) 
# multindex sort (unique to pandas) ) py_mt

合并

R 本身支持merge函数,类似地,熊猫也有pd.merge函数。

# R df1 %>% merge(df2, by="common_column")# Pythondf1.merge(df2, how="inner", on="common_column")

除了merge功能,还有join功能。dplyr 中还存在其他连接,例如left_joinright_joininner_joinanti_join.

原地

在 R 中有一个复合赋值管道操作符%<>%,它类似于一些 pandas 函数中的inplace=True参数,但不是所有的。:(很明显,熊猫将会完全取代……

排除故障

在 R 中,我们有browser()函数。

请注意,这不适用于 Jupyter 的 IRKernel。

# R 
unique(iris$species) %>% 
    lapply(function(s){ 
        browser() 
        iris %>% filter(species == s) 
        ....
     })

它会让你进入功能,如果你想做一些调试,这是非常有用的。

在 Python 中,有set_trace函数。

# Pythonfrom IPython.core.debugger import set_trace(
    iris
        .groupby("species") 
        .apply(lambda groupedDF: set_trace())
) 

最后但同样重要的是,如果你真的需要使用一些 R 函数,你总是可以依赖于rpy2包。对我来说,我主要用这个来绘图。ggplot2 ftw!抱歉 matplotlib 和 seaborn

%load_ext rpy2.ipython

有时使用 r 安装 r 包会有问题。你可以运行

conda install -r r r-tidyverse r-ggplot

此后,您可以在同一个 Jupyter 笔记本中交替使用 R 和 Python。

%%R -i python_df -o transformed_dftransformed_df = python_df %>% 
    select(-some_columns) %>% 
    mutate(newcol = somecol * 2)

注: *%%R* 是细胞魔法, *%R* 是线条魔法。这意味着如果你有一个多行 r 函数/代码,使用前者。

如果你需要输出像一个正常的熊猫数据帧打印,你可以使用百分之一魔术

%R some_dataFrame %>% skim

迂回:省略

在 R 中,您可以做的一个巧妙的技巧是将参数传递给内部函数,而不必在外部函数的函数签名中定义它们。

# R 
#' Simple function which takes two parameters `one` and `two` and elipisis `...`,somefunction = function(one, two, ...){ 
     three = one + two 
     sometwo = function(x, four){ 
         x + four 
     } 
     sometwo(three, ...) # four exists within the elipisis  
} 
# because of the elipisis, we can pass as many parameters as we we want. the extras will be stored in the elipisissomefunction(one=2, two=3, four=5, name="wesley")

在 python 中,**kwargs代替了...。下面是对其工作原理的解释。

说明

首先,双星号**被称为解包操作符(它被放在函数签名之前,例如kwargs,所以合起来看起来像**kwargs)。

约定是将该变量命名为 *kwargs* (代表keyworded arguments)但它可以被命名为任何名称。

大多数描述 unpack 操作符的文章都会以这个解释开始:字典被用来传递函数的参数。

# Pythonadictionary = { 'first' : 1, 'second': 2 } 
def some_function(first, second): 
    return first + second 
some_function(**adictionary) # which gives 3

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

但是你也可以改变这一点,将**kwargs设置为一个函数签名。这样做可以让您在调用函数时键入任意数量的函数签名。

签名-值对被包装到一个名为kwargs的字典中,该字典可以在函数内部访问。

# Python 
# dummy function which prints `kwargs`def some_function (**kwargs): 
    print(kwargs) 
some_function(first=1, second=2)

前两种情况并不排斥,你实际上可以*它们混合在一起。即。有署名的还有一个**kwargs。*

*# Python 
adictionary = { 
    'first' : 1,
    'second': 2,
    'useless_value' : "wesley"
} def some_function(first, second, **kwargs): 
    print(kwargs) return first + secondsome_function(**adictionary)*

输出将是:{'useless_value': 'wesley'}

它允许 python 函数接受您提供的任意多的函数签名。将直接使用在函数声明期间已经定义的那些。没有出现在其中的可以从 kwargs 中访问。

通过将**kwargs作为内部函数中的一个参数,您基本上是将字典展开到函数 params 中。

*# Pythondef somefunction(one, two, **kwargs): 
    print(f"outer function:\n\t{kwargs}") 
    three = one + two 
def sometwo(x, four): 
    print(f"inner function: \n\t{kwargs}") 
    return x + four returnsometwo(three, **kwargs) 
somefunction(one=2, two=3, four=5, name=“wesley”)*

外部功能:{“four":5, “name":"wesley"}

里面里面夸尔格斯:{“name":"jw"}.

现在让我们将它与原始的 R 省略号进行比较:

*# R #' Simple function which takes two parameters `one` and `two` and elipisis `...`,somefunction = function(one, two, ...){ 
    three = one + two 
    sometwo = function(x, four){ 
        x + four 
    } 
    sometwo(three, ...) # four exists within the elipisis  
} 
# because of the elipisis, we can pass as many parameters as we we want. the extras will be stored in the elipisissomefunction(one=2, two=3, four=5, name="wesley")*

结论

虽然在熊猫身上做同样的事情有很多方法,比 dplyr (tidyverse)规定的方法更多。我希望内部 R 用户在用 pandas 编码时标准化代码库,提高代码可读性。

此外,来到 Honestbee 后,让我措手不及的是所需的 SQL 数量。

这一点我感觉是来到工业界对学术界最大的偏离。公司中的数据以数据库/数据湖(不太常见)和数据流的形式有序存储。不再有一个大的平面数据文件。

虽然有 dbplyr 包,但我强烈建议您花点时间熟悉一下 SQL,尤其是查询 RDS 和 Redshift 的 postgreSQL。

更新:

Sparklyr 对 rstudio 的人们竖起了大拇指

我们已经完成了将tidyverse动词映射到熊猫的尝试,希望你发现这是有益的!回头见!

原载于 2018 年 12 月 16 日ethe Leon . github . io*。*

剩余寿命——使用 Flask 和 PythonAnywhere 在 Web 上模拟预期寿命并制作原型

原文:https://towardsdatascience.com/time-left-to-live-modeling-life-expectancy-and-prototyping-it-on-the-web-with-flask-and-68e3a8fa0fe4?source=collection_archive---------9-----------------------

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

Source: Lucas Amunategui

对预期寿命建模显然属于统计学领域,但当你以互动和教育的形式将它扩展到互联网时,它就变成了应用数据科学。在本演练中,我们将把一个简单的线性回归模型与 Flask web 应用程序联系起来,实质上是将一个等式转换成一个交互式工具,整个世界都可以从中进行游戏和学习。

让我们谈谈预期寿命。虽然我认为这个话题是一个重要的认知工具,但我先向那些觉得它令人沮丧的人道歉。它和那些互动银行工具一起提醒你,你还没有多少钱可以退休。

我们将使用 PythonAnywhere.com 的来安装这个模型,这是一个易于使用的免费实验网络服务平台。我们还将使用有趣的图形和简单的语言,以确保它切中要点,引人入胜。你可以在 TimeLeftToLive.com查看完成版。

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

Traditional output versus fun & Interactive

这是一个令人惊讶的简单模型,使用顶级统计学家收集的可靠数据来构建。两个最重要的消息来源是世界卫生组织(世卫组织)和中央情报局。这里我们将使用世界卫生组织(世卫组织)全球健康观察站的数据

死亡率数据

我们将使用“出生时的预期寿命(岁)”和“60 岁时的预期寿命(岁)”的综合数据集。这将为我们的线性回归提供两个点,我们可以很容易地从中提取任何其他年龄。还是那句话,对此不能全信!这些只是平均水平,预期寿命每天都在提高!从世卫组织网站:

简单线性回归和预测预期寿命

线性回归模型试图用直线来解释两个或多个变量之间的关系。 ReliaSoft 的实验设计和分析参考

我们将使用 scipy.stats 包进行线性回归。让我们看一个简单的例子来说明如何使用线性回归进行预测。我们创建了两个预期寿命的虚拟数据集,一个是新生儿的,另一个是 60 岁的:

**import pandas as pd
import matplotlib.pyplot as plt# create fictitious data set 
simple_life_dataset = pd.DataFrame({'Age':[0, 60], 'Life Expectancy':[90, 30]})
simple_life_dataset.head()**

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

Life expectancy at 0 and 60 years old

现在我们将这些数据输入到stats . Lin regressive函数中。我们将只使用它的两个输出,斜率和截距。这两个值和 y = mx+b 的直线方程,将为我们提供估算任何年龄预期寿命所需的一切。

**import numpy as np
from scipy import stats
slope, intercept, r_value, p_value, std_err = stats.linregress(simple_life_dataset['Age'],simple_life_dataset['Life Expectancy'])
print('intercept: ', intercept)
print('slope: ', slope)('intercept: ', 90.0)
('slope: ', -1.0)**

那么,根据我们虚构的数据,一个 20 岁的人还能活多少年?我们将 stats . Lin regressive 的输出应用于 y = mx+b 线方程:

预期寿命估计值=斜率年龄+截距*

**np.ceil(slope * 20 + intercept)70.0**

我们还有 70 年的寿命。如果我们把虚构的数据集和新的估计值一起画出来:

**fig, axes = plt.subplots(figsize=(5,5))
x = [0,20,60]
y = [90, 70, 30]
axes.plot(x,y, color='blue', linestyle='--', marker='o')
fig.suptitle('Life Expectancy')
axes.set_xlabel('age')
axes.set_xlim([-5,100])
axes.set_ylabel('life_expectancy')
axes.set_ylim([0,100])
plt.show()**

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

The linear relationship between age and life expectancy according to our fictitious data

世卫组织死亡率数据

我们下载真实数据保存到本地吧。然后,让我们进行与上面完全相同的练习:

**# load WHO longevity data
# http://apps.who.int/gho/data/node.main.688
who_list = pd.read_csv('http://apps.who.int/gho/athena/data/GHO/WHOSIS_000001,WHOSIS_000015?filter=COUNTRY:*&x-sideaxis=COUNTRY;YEAR&x-topaxis=GHO;SEX&profile=verbose&format=csv')# save a local copy of the data set for our Flask prototype later on
who_list.to_csv('WHOSIS_000001,WHOSIS_000015.csv')

# Keep only useful features fix case display of country text
who_list = who_list[['GHO (DISPLAY)', 'YEAR (CODE)' , 'COUNTRY (DISPLAY)', 'SEX (DISPLAY)', 'Numeric']]
who_list['COUNTRY (DISPLAY)'] = [ctry.title() for ctry in who_list['COUNTRY (DISPLAY)'].values]# print a few rows
who_list[who_list['COUNTRY (DISPLAY)']=='France'].head(10)**

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

WHO longevity data for France

我是一个 49 岁的美国人,让我们预测一下我还能活多少年(yikes!).首先让我们看看数据,这真的很有趣。根据最新数据,美国新生儿男性的预期寿命是 77 岁,而根据最新数据,美国 60 岁男性的预期寿命是 22 岁,总共是 82 岁,给出了什么?这是统计学的复杂性之一,对一个 60 岁的人取平均值意味着这个人已经活了 60 年,这被称为生存偏差。这对于我们来说意味着,这个模型对于接近于 0 的人来说有点悲观,对于接近于 60 的人来说有点乐观。

**country = 'United States Of America'
sex = 'Male'# pull latest entries for birth and 60 years for a country and gender
sub_set = who_list[who_list['COUNTRY (DISPLAY)'].str.startswith(country, na=False)]
sub_set = sub_set[sub_set['SEX (DISPLAY)'] == sex]# sort by year in descending order to work with the latest read
sub_set = sub_set.sort_values('YEAR (CODE)', ascending=False)
sub_set_birth = sub_set[sub_set['GHO (DISPLAY)'] == 'Life expectancy at birth (years)'] 
sub_set_60 = sub_set[sub_set['GHO (DISPLAY)'] == 'Life expectancy at age 60 (years)'] print('sub_set_birth:')
print(sub_set_birth.head(5))
print('sub_set_60:')
print(sub_set_60.head(5))sub_set_birth: GHO (DISPLAY)  YEAR (CODE)  \
16046  Life expectancy at birth (years)         2015   
17532  Life expectancy at birth (years)         2014   
15326  Life expectancy at birth (years)         2013   
12318  Life expectancy at birth (years)         2012   
17531  Life expectancy at birth (years)         2011COUNTRY (DISPLAY) SEX (DISPLAY)   Numeric  
16046  United States Of America          Male  76.93852  
17532  United States Of America          Male  76.76836  
15326  United States Of America          Male  76.45519  
12318  United States Of America          Male  76.43168  
17531  United States Of America          Male  76.29261 sub_set_60: GHO (DISPLAY)  YEAR (CODE)  \
7481   Life expectancy at age 60 (years)         2015   
7900   Life expectancy at age 60 (years)         2014   
9935   Life expectancy at age 60 (years)         2013   
16044  Life expectancy at age 60 (years)         2012   
16211  Life expectancy at age 60 (years)         2011              COUNTRY (DISPLAY) SEX (DISPLAY)   Numeric  
7481   United States Of America          Male  22.07029  
7900   United States Of America          Male  21.95811  
9935   United States Of America          Male  21.72074  
16044  United States Of America          Male  21.72548  
16211  United States Of America          Male  21.61596**

让我们从世卫组织数据集中提取两个最新的数据点,并绘制出来:

**# create data set with both points as shown in first example
lf_at_birth = sub_set_birth['Numeric'].values[0]
lf_at_60 = sub_set_60['Numeric'].values[0]# let's organize our data and plot
age = [0,60]
life_expectancy = [lf_at_birth, lf_at_60]fig, axes = plt.subplots(figsize=(5,5))
x = age
y = life_expectancy
axes.plot(x,y, color='blue', linestyle='--', marker='o')
fig.suptitle('Life Expectancy')
axes.set_xlabel('age')
axes.set_xlim([-5,100])
axes.set_ylabel('life expectancy')
axes.set_ylim([0,100])
plt.show()**

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

现在,让我们估计一下我的预期寿命:

**# model 
slope, intercept, r_value, p_value, std_err = stats.linregress(age, life_expectancy)
print('intercept: ', intercept)
print('slope: ', slope)

# predict life expectancy for an 49-year-old male in the USA:
np.ceil(slope * 49 + intercept)('intercept: ', 76.938519999999997)
('slope: ', -0.91447049999999985)
33.0**

还有 33 年,最好让它们有价值!现在,让我们将上述所有代码封装到一个函数中,这样我们就可以很容易地用其他参数预测其他年龄(当我们将其移植到 Flask 时,这将使我们的生活变得容易得多)。

**def get_life_expectancy(age, country, sex):
    # pull latest entries for birth and 60 years
    sub_set = who_list[who_list['COUNTRY (DISPLAY)'].str.startswith(country, na=False)]
    sub_set = sub_set[sub_set['SEX (DISPLAY)'] == sex]
    sub_set = sub_set.sort_values('YEAR (CODE)', ascending=False)
    sub_set_birth = sub_set[sub_set['GHO (DISPLAY)'] == 'Life expectancy at birth (years)'] 
    sub_set_60 = sub_set[sub_set['GHO (DISPLAY)'] == 'Life expectancy at age 60 (years)'] 

    # not all combinations exsits so check that we have data for both
    if len(sub_set_birth['Numeric']) > 0 and len(sub_set_60['Numeric']) > 0:
        # create data set with both points as shown in first example
        lf_at_birth = sub_set_birth['Numeric'].values[0]
        lf_at_60 = sub_set_60['Numeric'].values[0]

        # model 
        slope, intercept, r_value, p_value, std_err = stats.linregress([0,60],[lf_at_birth, lf_at_60])

        # predict for the age variable
        return(np.ceil(slope * age + intercept))
    else:
        return None**

让我们做一个快速测试:

**# test the function out using a 22-year-old Japanese female:
get_life_expectancy(22, 'Japan', 'Female')66.0**

66 岁的生活听起来是对的。

使用 Flask 和 Pythonanywhere 构建我们的模型原型

PythonAnywhere.com是一个在互联网上快速原型化你的 Python 交互式想法和模型的好方法。在 PythonAnywhere.com注册一个免费账户——你需要一个有效的电子邮件地址。

设置 Flask Web 框架

接下来,让我们用 Flask web 服务平台在 PythonAnywhere 上创建一个 web 服务器。这是非常容易做到的。在’ Web 选项卡下,点击’添加新的 web app 蓝色按钮。并接受默认设置,直到您到达“选择一个 Python Web 框架”并点击“ Flask ”,然后是最新的 Python 框架。

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

您将进入登录配置页面,点击绿色的“重新加载您的 account.pythonanywhere.com”按钮,并使用您的新 URL 进行一次旋转:

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

****您应该看到一个简单但真实的网页,带有来自 Flask 的’ Hello!消息:

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

上传预期寿命网页代码

现在我们需要用我们的预期寿命代码替换 Flask 通用框架代码。点击“文件选项卡,在您的 root 帐户下创建一个名为“life _ expectations的新文件夹。在该文件夹中,上传我们之前下载并保存的’ WHOSIS_000001,WHOSIS_000015.csv ‘数据。创建一个名为’ flask_app.py 的 Python 文件,并在下面粘贴’ flask_app.py '代码。

**from flask import Flask, render_template, request, url_for
import pandas as pd
import numpy as np
from scipy import stats
import logging
import datetime
import os.path
from flask import Markupapp = Flask(__name__)
app.config["DEBUG"] = True# constructor - load once (otherwise setup a local csv copy to save on bandwidth usage)
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
app.logger.error(BASE_DIR)
src = os.path.join(BASE_DIR, 'WHOSIS_000001,WHOSIS_000015.csv')
who_list = pd.read_csv(src)
who_list = who_list[['GHO (DISPLAY)', 'YEAR (CODE)' , 'COUNTRY (DISPLAY)', 'SEX (DISPLAY)', 'Numeric']]
who_list['COUNTRY (DISPLAY)'] = [ctry.title() for ctry in who_list['COUNTRY (DISPLAY)'].values]
country_list = sorted(set(who_list['COUNTRY (DISPLAY)'].values))def get_life_expectancy(age, country, sex):
    # pull latest entries for birth and 60 years
    sub_set = who_list[who_list['COUNTRY (DISPLAY)'].str.startswith(country, na=False)]
    sub_set = sub_set[sub_set['SEX (DISPLAY)'] == sex]
    sub_set = sub_set.sort_values('YEAR (CODE)', ascending=False)
    sub_set_birth = sub_set[sub_set['GHO (DISPLAY)'] == 'Life expectancy at birth (years)']
    sub_set_60 = sub_set[sub_set['GHO (DISPLAY)'] == 'Life expectancy at age 60 (years)'] # not all combinations exsits so check that we have data for both
    if len(sub_set_birth['Numeric']) > 0 and len(sub_set_birth['Numeric']) > 0:
        # create data set with both points as shown in first example
        lf_at_birth = sub_set_birth['Numeric'].values[0]
        lf_at_60 = sub_set_60['Numeric'].values[0] # model 
        slope, intercept, r_value, p_value, std_err = stats.linregress([0,60],[lf_at_birth, lf_at_60]) # predict for the age variable
        return(np.ceil(islope * age + intercept))
    else:
        return None@app.route('/', methods=['POST', 'GET'])
def interact_life_expectancy():
    # select box defaults
    default_age = 'Select Age'
    selected_age = default_age
    default_sex = 'Select Gender'
    selected_sex = default_sex
    default_country = 'Select Country'
    selected_country = default_country # data carriers
    string_to_print = ''
    healthy_image_list = [] if request.method == 'POST':
        # clean up age field
        selected_age = request.form["age"]
        if (selected_age == default_age):
            selected_age = int(29)
        else:
            selected_age = selected_age # clean up sex field
        selected_sex = request.form["sex"]
        if (selected_sex == default_sex):
            selected_sex = 'Both sexes' # clean up country field
        selected_country = request.form["country"]
        if (selected_country == default_country):
            selected_country = 'United States Of America' # estimate lifespan
        current_time_left = get_life_expectancy(age=int(selected_age), country=selected_country, sex=selected_sex)

        if (current_time_left is not None):
            # create output string
            string_to_print = Markup("You have <font size='+10'>" + str(int(np.ceil(current_time_left))) + "</font> healthy years left to live!")
        else:
            string_to_print = Markup("Error! No data found for selected parameters")
            current_time_left = 1 # healthy years
        healthy_image_list = []
        # squat.png, stretch.png, jog.png
        healthy_years_left = int(np.ceil(current_time_left))
        image_switch=0
        if (healthy_years_left > 0):
            for y in range(healthy_years_left):
                if image_switch == 0:
                    healthy_image_list.append('static/images/Cycling.png')
                elif image_switch == 1:
                    healthy_image_list.append('static/images/Jogging.png')
                elif image_switch == 2:
                    healthy_image_list.append('static/images/JumpingJack.png')
                elif image_switch == 3:
                    healthy_image_list.append('static/images/Stretching.png')
                elif image_switch == 4:
                    healthy_image_list.append('static/images/WeightLifting.png')
                else:
                    healthy_image_list.append('static/images/Yoga.png')
                    image_switch = -1
                image_switch += 1 return render_template('main_page.html',
                            country_list = country_list,
                            default_country = selected_country,
                            default_age=selected_age,
                            default_sex=selected_sex,
                            string_to_print = string_to_print,
                            healthy_image_list = healthy_image_list)**

您的’life _ expectation’文件夹应该如下所示:

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

仍然在’life _ expectations下创建另一个名为’ static 的文件夹,并在其下创建另一个名为’ images 的文件夹,并上传以下六个运动图标(不幸的是,您一次只能上传一个):

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

您的“图像”文件夹应该如下所示:

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

返回到’life _ expectations文件夹,创建’模板文件夹。Templates 文件夹将存储我们的 HTML 模板,Flask 将使用这些模板动态显示我们的内容。在“模板文件夹下,创建一个名为“ main_page.html 的文件,粘贴以下动态 html 代码:

**<!DOCTYPE html>
<HTML lang="en">
<HEAD>
  <TITLE>TimeLeftToLive.com</TITLE>
  <META charset="utf-8">
  <META name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</HEAD>
<BODY>
<DIV class="container">
  <DIV class="row">
    <H2><a href='http://www.TimeLeftToLive.com' target='_blank'>TimeLeftToLive.com</a></H2>
    <H4>More Data Science and Machine Learning Articles at <a href='http://amunategui.github.io' target='_blank'>amunategui.github.io</a></H4><BR> <FORM id='submit_params' method="POST" action=""> <SELECT class="selectpicker" name="sex">
          <option value="" selected></option>
          <option>Both sexes</option>
          <option>Female</option>
          <option>Male</option>
      </SELECT><SELECT class="selectpicker" name="age">
                    <option value="{{default_age}}" selected>{{default_age}}</option>
                   {% for age in range(1,100) %}
                       <option value="{{age}}">{{age}}</option>
                   {% endfor %}
                  </SELECT><SELECT class="selectpicker"  name="country">
            <option value="{{default_country}}" selected>{{default_country}}</option>
            {% for country in country_list %}
              <option value="{{country}}">{{country}}</option>
            {% endfor %}
          </SELECT> <button type="submit" class="btn btn-primary">Show me</button>
       <button type="button" class="btn btn-primary" onclick="location.href='/';" value="Reset">Reset</button></FORM>
<BR>
<H2>{{string_to_print}}</H2>
<BR>
<TABLE>
<TR>
{% for imag in healthy_image_list %}
  {% if loop.index == 21 or loop.index == 41 or loop.index == 61 or loop.index == 81 %}
    </TR><TR>
  {% endif %}
  <td><img src={{imag}} width="40" height="40"></td>{% endfor %}</TR>
</TABLE>
</BODY>
</HTML>**

您的’模板’文件夹应该如下所示:

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

虚拟文件刷新

返回到’ Web 选项卡,将’源代码从:

**/home/manuelamunategui/mysite/**

**/home/manuelamunategui/life_expectancy/**

点击下面几行的’/var/www/manuelamnategui _ python anywhere _ com _ wsgi . py’链接,编辑下面一行代码:

**project_home = u'/home/manuelamunategui/mysite'**

**project_home = u'/home/manuelamunategui/life_expectancy'**

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

点击绿色的“重新加载你的 account.pythonanywhere.com”按钮,带着你的新网址和交互式网络应用去兜风吧!

恭喜你!

在那里!恭喜那些走到这一步的人!并利用这些简单的工具和技术来展示您的 Python 想法!

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

感谢阅读!

曼努埃尔·阿穆纳特吉

免费电子书《成为数据科学家——赞美你的技术研究的基本技巧》的作者

amunategui.github.io 获取更多信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值