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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

有抱负的数据科学家应该阅读的五本书

原文:https://towardsdatascience.com/five-books-that-aspiring-data-scientists-should-read-dd39a56bd3be?source=collection_archive---------23-----------------------

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

金伯利农民在 Unsplash 上拍摄的照片

数据科学不仅仅是数学、统计学和编码。这是关于讲述一个伟大的故事*。*

数据科学不仅仅是数学、统计学和编码。这是关于使用这些工具来产生新的见解,以及关于讲述一个伟大的故事。当数据分析和精彩的故事结合在一起时,它们可以帮助我们理解世界是如何运作的,挑战我们对现实的(错误)概念,并激励我们做得更好。这里有五本这样的通俗易懂的书。

真实性:我们对世界错误的十个原因——以及为什么事情比你想象的要好(2018)

作者:汉斯·罗斯林、安娜·罗斯林·伦隆德和奥拉·罗斯林| 352 页。

以一系列有影响力的 Ted 演讲而闻名,汉斯·罗斯林(1948-2017)和他的合著者们肩负着挑战我们对世界现状的误解的使命。两位作者以惊人的观察开始了他们的书,即我们关于世界进步的想法是全面错误的,无论是贫困、教育还是全球健康。我们一直高估了世界上的苦难程度,低估了我们在过去几十年中取得的进步。

如果我们理性地对待每一个问题,并根据数据做出每一个决定,我们的生活将变得难以掌控

我说“我们”,因为罗斯林等人表明,这些错误观念在所有人中持续存在,无论教育、地理或职业如何。而且,即使面对确凿的事实(如世界银行和联合国的数据),我们似乎也很难更新自己的世界观。作者认为,我们未能根据新数据更新观点是进化的产物:如果我们理性地对待每一个问题,并根据数据而不是直觉做出每一个决定,我们的生活将变得极其困难。我们需要克服和纠正我们的偏见。作者为此提供了一个有效的方法。

事实提供了一个美妙的行动号召,用数据告诉我们的世界观,更重要的是,克服我们大脑固有的进化偏见

真实有时会让读者想要更多。具体来说,当涉及到解释和理解数据,以及更新我们的信念时,我会赞赏关于我们大脑本能的进化性质的更深入和适当来源的讨论。也就是说,这本书既是为了娱乐,也是为了教学,为了通俗易懂,牺牲了一些细节——这是作者有效做到的。

凭借的真实性,罗斯林等人呼吁采取行动,用数据来告知我们的世界观,更重要的是,克服我们大脑固有的进化偏见。

赖以生存的算法:人类决策的计算机科学(2016)

布赖恩基督教和汤姆格里菲斯| 368 页。

在一位同事的推荐下,的《靠生活的算法》成了我最喜欢的书之一。计算机和人类面临着不同但相似的挑战:如何在特定的约束下取得成果。作者在人类决策和计算机科学之间绘制了一系列精彩的相似之处,并展示了算法如何告知和改善我们的日常生活和决策过程。

Algorithms to Live by 对于非专家来说,这是对计算机科学中使用的不同算法的机智而易懂的介绍,对于经验丰富的数据科学家来说,这是一次有趣的再次相遇

在出价之前你应该参观多少公寓?在做出承诺之前,你应该和多少人约会?还有,在录用之前,你应该面试多少候选人?信不信由你,这些问题大多数都有一个“最优”的数学答案,计算机科学可以帮助我们做出最佳选择。

Algorithms to Live by 是对非专家的计算机科学中使用的不同算法的机智而易懂的介绍,也是对经验丰富的数据科学家的一次有趣的再次相遇。

赤裸裸的统计:从数据中剥离恐惧(2014)

查尔斯·惠兰| 304 页。

裸统计是书形式的 STATS-101。这是一本非常容易理解的统计学读物,它使用了大量来自现实世界应用的例子,从网飞的推荐引擎到足球和教育。如果有什么不同的话,你读完这本书后会确信统计学远非抽象,而是处理各种社会问题的最有效的工具之一。

如果你的统计学入门课程不适合你,裸统计学是对你的课程材料的一个很好的有效补充

不要指望看完赤裸裸的统计就能成为统计专家。然而,你回家后会牢牢掌握统计学背后的基本概念(思考:均值、中值、标准差、相关性、回归、中心极限定理等)。).如果你的统计学入门课程不适合你,裸统计是对你的课程材料的一个很好的有效补充。

数学毁灭武器(2016)

凯西·奥尼尔| 272 页。

凭借的数学毁灭武器、*、*凯茜·奥尼尔成功驾驭了一个新术语。奥尼尔阐明了算法如何越来越多地主宰我们的生活,并且是在缺乏监管或透明度的情况下这样做的。教师被解雇的依据是基于考试分数的学生成绩的不确定(和可操纵)模型(“增值”模型)。无辜的人被贴上潜在罪犯的标签,使用预测模型,却没有任何补救手段。而且,保险费是由邮政编码决定的,由不透明的算法设定。

尽管缺乏监管和透明度为模型变成“数学毁灭武器”创造了条件,但这并不是模型或数据本身所固有的

虽然作者为更好的治理提出了令人信服的论点,但我不同意她对大数据“黑暗面”的悲观看法。缺乏监管和透明度为模型变成“数学毁灭武器”创造了条件,但这并不是模型或数据本身所固有的。数据科学家通常很清楚“垃圾在;垃圾出来”的问题和他们的建模选择的后果。最近,对这个话题的认识有所增长,我们看到了对参与式机器学习的呼吁,其目的是让受影响的人群参与到设计阶段。

此外,政府能够为这些工具的使用创造健康的环境,尽管他们应该做得更好。例如,关注欧盟的类似研究会很有趣,在欧盟,个人数据享有更大的法律保护

尽管有缺点,数学毁灭武器给数据科学家上了一堂重要的课:时刻意识到你的工作会对现实生活产生影响,并据此做出决定。

局外人:成功的故事(2008)

作者马尔科姆·格拉德威尔| 336 页。

这本书是这个列表中唯一的一本,而且不是关于数据科学的。事实上,它根本没有采取定量的方法,你们中的一些人可能想知道为什么我在这个概述中加入了离群值。对于数据科学家来说,了解您正在建模的现象的运行环境至关重要。它帮助你建立假设,并告知你的模型选择。

马尔科姆·格拉德威尔的局外人挑战了成功人士成功的主流叙事。他认为,成功需要实践。格拉德威尔在这里借用了 10,000 小时规则的理论,该理论指出,完善一项技能需要 10,000 小时的专门练习(这个概念后来受到了严格审查)。第二,环境起了作用:获得合适的资源,文化背景,在某些情况下,纯粹的好运。

我建议以数据科学的心态阅读这本书,并尝试找出定性方法可能无法提供的定量研究,反之亦然,如果我们采用定量方法,我们将如何回答 Gladwell 提出的问题。

是的,证据是轶事。是的,分析有时过于简单。是的,在格拉德威尔给出的例子中存在抽样偏差。然而,尽管有这些缺点,离群值是一个强有力的提醒,提醒人们机遇和环境的影响,以及结果是多么不稳定。

优秀的数据科学家本身就是故事讲述者

格拉德威尔是讲故事的大师。优秀的数据科学家本身就是故事讲述者:你可能擅长分析数据,但你需要能够提取数据的精华,并有效地传达你的故事,为你的客户、同事或公司创造价值。对于任何数据科学家来说,离群值对上下文重要性的理解以及它对好故事讲述的示范都是重要的经验。

感谢阅读!你喜欢阅读哪些数据科学书籍?请在评论中留下你的建议!

支持我的工作: 如果你喜欢这篇文章,愿意支持我的工作,请考虑 通过我的推荐页面 成为付费媒体会员。如果你通过我的推荐页面 注册 ,订阅的价格是一样的,但是我会收取你每月的部分会员费。

请仔细阅读 本免责声明 中的任何内容后再依托 我的 Medium.com 文章

图形处理的五大挑战

原文:https://towardsdatascience.com/five-challenges-of-graph-processing-94e0a4041431?source=collection_archive---------48-----------------------

图计算从业者必须克服的最相关问题的总结。

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

照片由 Unsplash 上的 israel palacio 拍摄

之前的一篇文章中,我公开了我对缺乏清晰的图形处理平台/解决方案/框架/架构的看法。然而,图形处理必须处理的主要问题是什么?把这几行作为开胃菜送给那些好奇的人。

(除非另有说明,否则图片属于作者所有)。

[## 图形处理:一个没有明确胜利者的问题

你知道最流行的图形处理解决方案吗?没有吗?别担心。现在还没有。

towardsdatascience.com](/graph-processing-a-problem-with-no-clear-victor-3683c483f5dc)

1.图形是非结构化的

图是顶点 V 和连接这些顶点的边 E 的集合。一个图 G=(V,E) 可以是有向的,也可以是无向的。在有向图中,从顶点 u 到顶点 v 的任何边都有方向( uv )。这就是,我们可以从 uv

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

作者图片

如果图是无向的,我们就没有方向。这就是, u 连接到 v 上。

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

作者图片

另外,我们可以有权重为 W(e) 的边。

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

作者图片

和权重为 W(u),W(v)的顶点。

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

作者图片

2.图形表示

图形特别适合于代表绝对任何东西。从社会网络到原子力之间的相互作用。这种程度的自由很难转化成计算机。图的一个非常计算机友好的表示是邻接矩阵 AA 是一个大小为 |V| x |V| 的方阵,其中 A 表示在顶点 ij 之间存在一条边。对于无向图, A 是对称矩阵。例如,对于图表

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

作者图片

我们可以在邻接矩阵中得到它的表示:

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

因为前面的表示是矩阵,所以我们可以使用所有可用的代数运算工具。例如,通过对每一列的值求和,我们得到了针对每个顶点的边的数量。此外,我们可以使用谱图理论计算特征值和特征向量,这些特征值和特征向量可以给我们提供有趣的信息。

3.记忆

但是还有其他方面需要考虑。**内存利用率怎么样?**想想上面的邻接矩阵,对于一个 4 x 4 的矩阵(16 个单元),我们有 10 个空单元(等于 0)。为这个矩阵分配内存时,我们浪费了 62%的分配内存和不相关的信息。对于非常大的稀疏矩阵,这种成本是不可接受的。我们在很多情况下都有稀疏矩阵,想想社交网络。脸书有 26 亿活跃用户,每个档案最多只能有 5000 个好友。此外,一些操作变得很麻烦。例如,知道相邻顶点涉及整个矩阵的操作。

幸运的是,我们有其他更“内存友好”或者至少更适合某些场景的解决方案。一个邻接表是一个列表,其中每一项代表图中的一个顶点。对于每个顶点,我们都存储指向其相邻顶点(邻居)的指针。以上面的例子为例:

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

作者图片

邻接表将存储的信息限制在相邻顶点。顶点 a 可以访问其相邻顶点的引用列表。这有助于实现可以穿过图顶点的遍历操作,并使得存储附加数据增强数据位置成为可能。

从性能的角度来看,这就是图形成为一种非常难以处理的数据结构的地方。假设我们想要访问顶点a(γ(a))的所有邻居。 a 的相邻顶点是:自身、 bd 。这意味着我们必须访问 bd 的内存位置。如果这些内存碎片还没有被缓存,会发生什么?这是一个缓存缺失,这意味着我们必须从主内存中取出图形的一部分。对于具有大量邻居的顶点,缓存缺失将反复重复。这直接影响了图形遍历器的性能。在大多数图形算法中,内存访问缺乏局部性是一个性能限制。

另一个有趣的问题是当图形不适合主存时会发生什么?就性能而言,高速缓存未命中代价高昂,但访问二级存储器的代价要高几个数量级。

4.分布式解决方案

如果我们考虑分布式解决方案,缺乏本地性可能是一个巨大的性能瓶颈。对于跨节点拆分图形的分布式内存解决方案,我们可能有这样的解决方案:

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

作者图片

对于在 nodeA 中运行的操作,对顶点 cd 的任何访问都必须从其他节点检索信息。如果可以修改边权重,复杂性会增加。谁是边缘的主人?顶点呢?像 Metis 这样的解决方案可以跨 n 个库或节点给你最好的图划分。然而,使算法适应分布式分区并不容易。并且计算最佳分区是一个昂贵的操作。

5.平行

并行呢?这取决于要并行化的问题或算法。然而,在诸如广度优先搜索(BFS)或深度优先搜索(DFS)之类的经典迭代器中,利用诸如队列或堆栈之类的并发访问数据结构存在明显的问题。例如,这是 BFS 的伪代码:

1  procedure BFS(G, root) is
2      let Q be a queue
3      label root as discovered
4      Q.enqueue(root)
5      while Q is not empty do
6          v := Q.dequeue()
7          if v is the goal then
8              return v
9          for all edges from v to w in G.adjacentEdges(v) do
10             if w is not labeled as discovered then
11                 label w as discovered
12                 w.parent := v
13                 Q.enqueue(w)

如果我们认为上面的伪代码是并行运行的,我们必须保证自动访问/修改 Q 和 labels 结构。这给多个并行实例带来了巨大的瓶颈,会导致非常差的性能。

摘要

在这篇文章中,我介绍了在设计基于图形的解决方案时,图形带来的一些潜在问题。您可能会发现许多其他问题。不过,我觉得这些是主要的。你会发现还有其他一些特别难以克服的问题。我很想听听。

感谢阅读!

数据科学中的五种认知偏差(以及如何避免它们)

原文:https://towardsdatascience.com/five-cognitive-biases-in-data-science-and-how-to-avoid-them-2bf17459b041?source=collection_archive---------29-----------------------

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

重新训练你的思维。图片由来自皮克斯拜约翰·海恩拍摄

每个人都是扭曲思维的认知偏见的牺牲品,但数据科学家必须防止他们破坏自己的工作。

最近,我在读罗尔夫·多贝尔的清晰思考的艺术,这让我以一种前所未有的方式思考认知偏差。我意识到一些认知偏见是多么根深蒂固。事实上,当我们的思维受到影响时,我们甚至经常没有意识到。对于数据科学家来说,这些偏见真的会改变我们处理数据和做出日常决策的方式,而且通常不会变得更好。

尽管我们处理的所有事实看似客观,但数据科学在其过程中却出人意料地主观。

作为数据科学家,我们的工作是理解事实。在进行这种分析时,我们不得不做出主观决定。因此,即使我们使用确凿的事实和数据,数据科学也有很强的解释成分。

因此,我们数据科学家需要非常小心,因为所有人都非常容易受到认知偏差的影响。我们也不例外。事实上,我见过许多数据科学家最终根据预先存在的信念、有限的数据或不合理的偏好做出决策的例子。

在这篇文章中,我想指出五种最常见的认知偏差。我还将提供一些建议,告诉数据科学家如何避免这些错误,做出更好、更合理的决策。

1.生存偏差

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

来源

第二次世界大战期间,非营利研究组织海军分析中心的研究人员承担了一个问题。他们需要在军队战斗机最薄弱的地方进行增援。为此,他们求助于数据。他们检查了每一架从战斗任务中返回的飞机,并记下了子弹击中飞机的位置。基于这一信息,他们建议飞机在这些精确的位置进行加固。

你认为这种方法有什么问题吗?

当然,问题是他们只看返航的飞机,而不看返航的飞机。当然,来自被击落飞机的数据几乎肯定会更有助于确定飞机的致命损坏可能发生在哪里,因为那些是遭受灾难性损坏的飞机。

研究小组遭受了生存偏差:他们只是看了他们可用的数据,而没有分析更大的情况。这是一种选择偏差,在这种情况下,我们根据一些任意的标准隐式地过滤数据,然后试图从中找出意义,而没有意识到或承认我们正在处理不完整的数据。

让我们想想这可能如何应用到我们的数据科学工作中。假设你开始处理一个数据集。您已经创建了自己的特征,并在建模任务中达到了相当高的精度。但也许你应该问问自己,这是不是你能达到的最好结果。你试过寻找更多的数据吗?也许将天气预报数据添加到您在 ARIMA 模型中使用的常规销售变量中会有助于您更好地预测销售。或者,假期的一些特征可以告诉你的模型,为什么你的购买者在感恩节或圣诞节前后表现得特别时尚。

建议克服: 减轻这种偏见的一种方法是以严谨、科学的方式思考手头的问题,然后集思广益,找出任何有助于解决问题的数据(而不仅仅是从数据开始)。这些方法看似相似,但第二种方法限制了你的视野,因为你不知道你的工作中缺少了什么。通过使用第一种方法,你将知道哪些数据是你无法获得的,并且你最终会将这些因素纳入你的结论中。

2.沉没成本谬论

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

来源: Pixabay

我们都在某个时候看到过沉没成本谬误,不管是因为我们已经付了钱而看完那部糟糕的电影,还是因为我们已经看了一半而看完那本糟糕的书。每个人都遇到过这样的情况,他们最终浪费了更多的时间,因为他们试图挽救他们已经投入的时间。

沉没成本,也称为追溯成本**,**是指已经发生且无法通过任何额外行动收回的成本。沉没成本谬误是指人类倾向于根据他们已经做了多少投资来做决定,这导致了更多的投资,但却没有任何回报。

有时候,尽管很难,最好的办法就是放手。

这在数据科学项目中经常发生。一个项目可能运行了两年多而没有结果,但是一个调查者继续运行它,因为已经投入了如此多的时间、金钱和努力。或者,一名数据科学家可能会全心全意地为她的项目辩护,因为她在项目上投入了太多,没有意识到投入更多的工作从长远来看对她或公司没有帮助,而且最好是放弃这个项目。

建议克服: 把自己从这种认知偏差中拯救出来的一个方法是,关注未来的收益和成本,而不是已经失去的过去的成本。你必须养成忽略先前成本信息的习惯,尽管这很难。当然,对于我们这些数据科学家来说,忽视数据从来都不容易。对我自己来说,我发现有条不紊的方法在这种情况下效果最好。我拿起纸和笔,远离所有的干扰,努力想出做一个项目所需的所有额外成本,以及我未来可能获得的收益。如果任务的成本部分看起来过于重要,那么是时候继续前进了。

3.虚假因果关系

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

来源

作为数据科学家,我们总是在寻找模式。这种趋势意味着,有时我们甚至会发现根本不存在的模式。我们的大脑是如此训练有素,以至于我们甚至可以尽可能地理解混乱。

因为我们的训练让我们寻找模式,所以记住一条简单的格言至关重要,即相关性并不意味着因果关系。这五个字就像数据科学工具箱的锤子,没有它你什么也做不成。仅仅因为两个变量前后移动并不一定意味着一个导致另一个。

这个原则已经被无数的例子生动地证明了。举个例子,

  • 通过查看消防部门的数据,您会注意到,随着越来越多的消防员被派往火灾现场,最终对财产造成的损害也越大。因此,你可能会推断更多的消防员正在造成更大的损失。
  • 在另一个著名的例子中,一位学者在调查 20 世纪 80 年代纽约市的犯罪原因时发现,严重犯罪的数量与街头小贩出售的冰淇淋数量之间有很强的相关性。但是我们就应该得出吃冰淇淋会让人犯罪的结论吗?既然这没有什么意义,我们显然应该怀疑有一个未被观察到的变量导致了这两者。在夏季,犯罪率最高,这也是大多数冰淇淋出售的时候。冰淇淋销售不会导致犯罪,犯罪也不会增加冰淇淋销售。

在这两种情况下,过于肤浅地看数据会导致不正确的假设。

建议克服: 作为数据科学家,我们在提出研究结果时,需要留意这种偏差。通常,看似因果关系的变量可能不会被仔细检查。我们还应该特别注意在创建模型变量时避免这种类型的错误。在这个过程的每一步,重要的是问问我们自己,我们的自变量是否可能只是与因变量相关。

4.可用性偏差

你是否曾经说过这样的话,“我知道[在此插入一个通用语句],因为[插入一个单独的例子]。”例如,有人可能会说,“喝啤酒不会发胖,因为鲍勃喝得很多,而且他很瘦。”如果你有,那么你已经遭受了可用性偏见。你试图用有限的数据来理解这个世界。

人们自然倾向于根据我们已经获得的信息或我们经常听到的事情做出决定,而不去寻找可能有用的替代方案。结果,我们把自己限制在一个非常具体的信息子集。

这在数据科学领域经常发生。数据科学家倾向于获取和处理更容易获得的数据,而不是寻找更难收集但可能更有用的数据。我们用我们理解的模型来凑合,这些模型对我们来说是一个整洁的包,而不是更适合手头的问题但更难得到的东西。

建议克服: 在数据科学中,克服可用性偏差的一个方法就是拓宽我们的视野。致力于终身学习。阅读。很多。关于一切。那就多读一些。认识新的人。在工作中或在线论坛上与其他数据科学家讨论您的工作。更开放地接受你可能需要在方法上做出改变的建议。通过接受新的信息和想法,你可以确保不太可能使用不完整的信息。

5.确认偏差

一个老笑话说,如果你折磨数据足够长的时间,它就会招供。通过足够的工作,你可以扭曲数据,让它说出你想要它说的话。

我们都有一些信仰,这很好。这是人类的一部分。然而,不正常的是,当我们让这些信念不经意地进入我们形成假设的方式。

我们可以在日常生活中看到这种趋势。我们经常以这样一种方式解释新信息,使它与我们自己的信念相一致。我们在网站上阅读最符合我们信仰的新闻。我们和与我们相似并持有相似观点的人交谈。我们不想得到令人不安的证据,因为这可能会导致我们改变我们的世界观,而我们可能害怕这样做。

例如,在项目的成本效益分析阶段,我在数据科学中看到了确认偏差。我见过有人执着于证实他们假设的数据,而忽略所有矛盾的证据。显然,这样做可能会对项目的收益部分产生负面影响。

建议克服: 对抗这种偏见的一个方法是批判性地审视你所有的信念,并试图找到关于你每一个理论的令人不安的证据。我的意思是,通过去你通常不去的地方,和你通常不说话的人交谈,并保持开放的心态,积极地寻找证据。

结论

在我们这个信息过载的时代,我们被如此之多的数据包围着,以至于我们的大脑拼命地去理解这些噪音。

有时候,能够根据有限的信息来理解这个世界是很有用的。事实上,我们在做大多数决定时都没有考虑太多,而是听从自己的直觉。我们大多数日常行为的潜在危害是非常小的。然而,允许我们的偏见影响我们的工作,会让我们陷入不幸的境地。如果我们做了一个重要的决定,结果证明是错误的,我们最终可能会失去金钱或信誉。

了解我们的大脑如何工作将有助于我们避免这些错误。

如果你想了解更多关于数据科学的知识,我想调出吴恩达的这个 精品课程 。这是我开始的原因。一定要去看看。

谢谢你的阅读。将来我也会写更多初学者友好的帖子。在 媒体 关注我或者订阅我的 博客 了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter @mlwhiz 联系。

这个故事最初发表于 此处

你应该知道的比例的五个置信区间

原文:https://towardsdatascience.com/five-confidence-intervals-for-proportions-that-you-should-know-about-7ff5484c024f?source=collection_archive---------2-----------------------

置信区间是统计推断的重要指标。如今,置信区间正受到越来越多的关注(理应如此!)这一点过去常常被忽视,尤其是因为对 p 值的痴迷。在这里,我详细介绍了比例的置信区间和五种不同的统计方法来推导比例的置信区间,特别是如果你在医疗数据科学领域,你应该知道。我还使用现有的 base R 和其他具有完全可复制代码的函数,将这些区间的实现合并到 R 中。

注: 这篇文章是写给那些对置信区间和样本总体推断统计概念至少有一点概念的人的。初学者可能会发现很难坚持完成这篇文章。那些对置信概念非常熟悉的人可以跳过开始部分,直接跳到以 Wald 区间开始的置信区间列表。我也推荐阅读这篇 关于置信区间估计的综述文章

比例和置信区间

在我详述二项式分布的早期文章中,我谈到了二项式分布,即在固定数量的独立试验中成功数量的分布,是如何与比例内在相关的。从临床/流行病学研究的背景来看,在任何研究中几乎总是会遇到比例问题。发病率(特定时期人口中新病例的数量)、患病率(特定时期患病人口的比例)都是比例。通过估计疾病的真实发病率和流行率来估计疾病负担可能是最常进行的流行病学研究。在我之前关于二项分布的文章中,我试图通过引用一项假设的新冠肺炎血清阳性率研究来说明二项分布如何与疾病的患病率内在相关。

为了研究任何事件在任何人群中的比例,从整个人群中获取数据是不切实际的。但是我们能做的是随机选取一个实际可行的更小的人口子集,并计算感兴趣的事件在样本中的比例。现在,我们怎么知道我们从样本中得到的这个比例可以和真实的比例,人口中的比例联系起来呢?这就是置信区间发挥作用的地方。下图说明了从样本数据估计真实比例的推理统计过程。

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

根据从样本数据中得到的点估计值来估计真实比例的过程

从样本数据得到的点估计值构造置信区间通常是通过假设点估计值遵循特定的概率分布来完成的。在我之前关于二项式分布的文章中,我谈到了二项式分布如何类似于正态分布。这意味着我们对从样本概念中得到的比例点估计的概率分布有所了解。这反过来意味着我们可以对真实比例进行一些相当合理的估计。下图说明了二项式分布正态近似背后的直觉。

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

当成功概率§为 0.1 时,不同样本量(n)的二项式分布。您可以看到,随着样本量的增加,分布变得越来越正常。当 p 接近 0.5 时,即使样本量较小,也可以假定分布是正态分布。在这里,我只是想说明一个相当极端的情况,当 p 处于极值时(这里是 0.1),因为实际上这些极值比流行病学研究中接近 0.5 的值更常见

好了,现在我们知道,由于二项式分布的正态近似现象,来自样本数据的比例的点估计可以被假定为遵循正态分布,我们可以使用点估计来构造置信区间。但是这个置信区间到底是什么呢?现在让我们假设一个 95%的置信区间意味着我们 95%确信真实的比例在这个区间内。请注意,这个定义在统计学上是不正确的,纯粹主义者会觉得难以接受。然而,出于实用的目的,我觉得这个定义是好的开始。

在平均值为 0、标准差为 1 的正态分布(也称为标准正态分布)中,95%的值将围绕平均值对称分布,如下图所示。因此,在这个例子中,范围从-1.96 到+1.96 的 X 轴值是 95%的置信区间。

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

标准正态分布。X 轴代表数值,Y 轴代表概率。阴影区域表示构成平均值周围所有值的 95%的值。左侧和右侧的无阴影区域代表相当极端的值,它们不构成 95%的置信区间

上图中 z = 1.96 是一个神奇的数字。这是因为置信区间通常报告为 95%的水平。由于正态分布是对称的,这意味着我们必须排除上图中左侧 2.5%和右侧 2.5%的值。这反过来意味着我们需要找到切割这两个点的阈值,对于 95%的置信区间,该值结果为 1.96。我们可以说,95%的分布值位于这些值(左右)的标准偏差的 1.96 倍之内。在均值为 0,标准差为 1 的标准正态分布的情况下,这个区间恰好是(-1.96,+1.96)。

同样,如果我们假设‘p’是你的比例点估计值,而‘n’是样本量,那么‘p’的置信区间为:

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

这里,p 上面的帽子符号只是用来表示这是样本的点估计值,而不是真实的比例。对于 95%的置信区间,z 为 1.96。这个置信区间通常也称为 Wald 区间。

在 95%置信区间的情况下,如上所述,上述等式中的“z”值仅为 1.96。对于 99%的置信区间,“z”的值将是 2.58。这抓住了一个直觉,如果你想把你的信心从 95%增加到 99%,那么你的区间范围必须增加,这样你才能更有信心。所以直觉上,如果你的置信区间需要从 95%的水平变为 99%的水平,那么在后一种情况下‘z’的值必须更大。类似地,对于 90%的置信区间,“z”的值将小于 1.96,因此您将得到一个更窄的区间。90%的 z 恰好是 1.64。

既然已经详细介绍了置信区间的基础知识,让我们详细讨论一下用于构建比例置信区间的五种不同方法。

1.沃尔德间隔

Wald 区间是比例最基本的置信区间。Wald 区间在很大程度上依赖于二项式分布的正态近似假设,并且没有应用任何修改或修正。这是可以从这个正态近似中构造的最直接的置信区间。

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

沃尔德间隔

然而,它在实际场景中的表现非常差。这种“低性能”的含义是,在许多情况下,95% Wald 区间的覆盖率小于 95%!这可不好。当我们构建置信区间时,我们必须有一个合理的“覆盖范围”。例如,我们预计 95%的置信区间将“覆盖”95%的真实比例,或者至少接近 95%的真实比例。但是如果少了很多,那我们就有麻烦了。Wald interval 因实际场景中的低覆盖率而臭名昭著。这是因为在许多实际情况下,‘p’的值在极端侧(接近 0 或 1)和/或样本大小(n)不是那么大。

我们可以使用 R 对不同的 p 值探索 Wald 区间的覆盖范围。必须注意的是,基础 R 包似乎没有为比例返回 Wald 区间。这可能是因为 Wald 间隔通常被认为不是一个好的间隔,因为它在覆盖范围方面表现很差。所以,我定义了一个简单的函数 R,它以 x 和 n 为参数。x 是 n 次伯努利试验的成功次数。因此,样本比例就是 x 与 n 之比。根据上述公式,使用 Wald 方法返回置信区间的上下界非常简单。

*waldInterval <- function(x, n, conf.level = 0.95){
 p <- x/n
 sd <- sqrt(p*((1-p)/n))
 z <- qnorm(c( (1 — conf.level)/2, 1 — (1-conf.level)/2)) #returns the value of thresholds at which conf.level has to be cut at. for 95% CI, this is -1.96 and +1.96
 ci <- p + z*sd
 return(ci)
 }#example
waldInterval(x = 20, n =40) #this will return 0.345 and 0.655*

好了,现在我们有了一个函数,它将返回 95% Wald 区间的上下界。下一步是模拟随机抽样,估计每个随机样本的置信区间,看看这些样本构建的置信区间是否真正“覆盖”(包括)了真实比例。为此,我们将预先定义一组不同的真实人口比例。最后,对于这些预定义的概率中的每一个,我们看到覆盖率是多少%。理想情况下,对于 95%的置信区间,这个覆盖率应该总是大约在 95%左右。让我们看看沃尔德区间是否成立。所有这些步骤都在下面显示的 R 代码中实现。

*numSamples <- 10000 #number of samples to be drawn from population
numTrials <- 100 #this is the sample size (size of each sample)
probs <- seq(0.001, 0.999, 0.01) #true proportions in prevalence. #for each value in this array, we will construct 95% confidence #intervals
coverage <- as.numeric() #initializing an empty vector to store coverage for each of the probs defined above
for (i in 1:length(probs)) {
 x <- rbinom(n = numSamples, size=numTrials, prob = probs[i]) #taken #n random samples and get the number of successes in each of the n #samples. thus x here will have a length equal to n
 isCovered <- as.numeric() #a boolean vector to denote if the true #population proportion (probs[i]) is covered within the constructed ci
 #since we have n different x here, we will have n different ci for #each of them. 
 for (j in 1:numSamples) {
 ci <- waldInterval(x = x[j], n = numTrials)
 isCovered[j] <- (ci[1] < probs[i]) & (probs[i] < ci[2]) #if the #true proportion (probs[i]) is covered within the constructed CI, #then it returns 1, else 0
 }
 coverage[i] <- mean(isCovered)*100 #captures the coverage for each #of the true proportions. ideally, for a 95% ci, this should be more #or else 95%
}plot(probs, coverage, type=”l”, ylim = c(75,100), col=”blue”, lwd=2, frame.plot = FALSE, yaxt=’n’, main = “Coverage of Wald Interval”,
 xlab = “True Proportion (Population Proportion) “, ylab = “Coverage (%) for 95% CI”)
abline(h = 95, lty=3, col=”maroon”, lwd=2)
axis(side = 2, at=seq(75,100, 5))*

下面是 Wald 区间的覆盖图

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

不同人口比例的 Wald 区间覆盖率

上面的图证明了 Wald 区间表现很差的事实。事实上,只有大约 0.5 的比例才能达到 95%的覆盖率。对于 p 的极值,覆盖率非常低。

2.clopper-Pearson 区间(精确区间)

Clopper-Pearson 区间(也称为精确区间)的目标是使所有 p 和 n 值的覆盖率至少达到 95%。正如“精确”区间的别名所表明的,该区间基于精确的二项式分布,而不是像 Wald 区间那样基于大样本中 p 正态近似。对于那些对数学和原始文章感兴趣的人,请参考 Clopper 和 Pearson 在 1934 年发表的原始文章。这有时被认为是太保守了(在大多数情况下,这个覆盖率可以达到 99%!).在 R 中,流行的“binom.test”返回 Clopper-Pearson 置信区间。这也被称为精确二项式检验。类似于我们对 Wald 区间所做的,我们也可以探索 Clopper-Pearson 区间的覆盖。下面给出了完全可再现的 R 代码。

*numSamples <- 10000 #number of samples to be drawn from population
numTrials <- 100 #this is the sample size (size of each sample)
probs <- seq(0.001, 0.999, 0.01) #true proportions in prevalence. #for each value in this array, we will construct 95% confidence #intervals
coverage <- as.numeric() #initializing an empty vector to store coverage for each of the probs defined above
for (i in 1:length(probs)) {
 x <- rbinom(n = numSamples, size=numTrials, prob = probs[i]) #taken #n random samples and get the number of successes in each of the n #samples. thus x here will have a length equal to n
 isCovered <- as.numeric() #a boolean vector to denote if the true #population proportion (probs[i]) is covered within the constructed ci
 #since we have n different x here, we will have n different ci for #each of them. 
 for (j in 1:numSamples) {
 ci <- binom.test(x = x[j], n = numTrials)$conf
 isCovered[j] <- (ci[1] < probs[i]) & (probs[i] < ci[2]) #if the #true proportion (probs[i]) is covered within the constructed CI, #then it returns 1, else 0
 }
 coverage[i] <- mean(isCovered)*100 #captures the coverage for each #of the true proportions. ideally, for a 95% ci, this should be more #or else 95%
}plot(probs, coverage, type=”l”, ylim = c(75,100), col=”blue”, lwd=2, frame.plot = FALSE, yaxt=’n’, main = “Coverage of Wald Interval”,
 xlab = “True Proportion (Population Proportion) “, ylab = “Coverage (%) for 95% CI”)
abline(h = 95, lty=3, col=”maroon”, lwd=2)
axis(side = 2, at=seq(75,100, 5))*

这是克洛普-皮尔逊区间的覆盖图

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

针对不同人口比例的 Clopper Pearson(精确)区间覆盖率

哇,这看起来像是沃尔德区间报道的完全相反!事实上,在许多场景中,覆盖率甚至达到了几乎 100%,并且覆盖率从未低于 95%。这看起来很有希望,这是正确的。但这也太保守了,因为置信区间可能会更宽。这是克洛普-皮尔逊间隔的一个缺点。

3.威尔逊区间(得分区间)

Wilson 评分区间是正常近似值的扩展,以适应 Wald 区间典型的覆盖范围损失。因此,通过对标准近似公式进行一些变换,可以认为它是对 Wald 区间的直接改进。对数学感兴趣的人可以参考威尔逊的原文。

在 R 中,测试比例的常用“prop.test”函数默认返回 Wilson 分数区间。需要注意的是,可以用两种不同的方式来校正 Wilson 分数区间。一个没有连续性校正,一个有连续性校正。后者被称为 Yate 的连续性校正,并且“prop.test”中的参数“correct”可以被指定为 TRUE 或 FALSE,以分别应用或不应用该校正。如果样本量很小或者 p 值处于极端值(接近 0 或 1),建议使用 Yate 的连续性校正。Yate 的连续性修正被认为有点保守,虽然没有 Clopper-Pearson 区间保守。

下面的 R 代码是完全可再现的代码,用于在有和没有 Yate 的连续性校正的情况下生成 Wilson 分数区间的覆盖图。

*#let's first define a custom function that will make our jobs easiergetCoverages <- function(numSamples = 10000,numTrials = 100, method, correct = FALSE){
 probs <- seq(0.001, 0.999, 0.01) 
 coverage <- as.numeric() 
 for (i in 1:length(probs)) {
 x <- rbinom(n = numSamples, size=numTrials, prob = probs[i]) 
 isCovered <- as.numeric() 
 for (j in 1:numSamples) {
 if (method ==”wilson”){
 if (correct){
 ci <- prop.test(x = x[j], n = numTrials, correct = TRUE)$conf
 }else {
 ci <- prop.test(x = x[j], n = numTrials, correct = FALSE)$conf
 }
 }else if (method==”clopperpearson”){
 ci <- binom.test(x = x[j], n = numTrials)$conf
 }else if(method==”wald”){
 ci <- waldInterval(x = x[j], n = numTrials)
 }else if(method ==”agresticoull”){
 ci <- waldInterval(x = x[j]+2, n = numTrials + 4)
 }
 isCovered[j] <- (ci[1] < probs[i]) & (probs[i] < ci[2])
 }
 coverage[i] <- mean(isCovered)*100 #captures the coverage for each #of the true proportions. ideally, for a 95% ci, this should be more #or else 95%
 }
 return(list(“coverage”= coverage, “probs” = probs))
}*

下面的代码使用上面定义的函数来生成 Wilson 分数覆盖率和相应的两个图,如下所示

*out <- getCoverages(method=”wilson”)out2 <- getCoverages(method=”wilson”, correct = TRUE)plot(out$probs, out$coverage, type=”l”, ylim = c(80,100), col=”blue”, lwd=2, frame.plot = FALSE, yaxt=’n’, 
 main = “Coverage of Wilson Score Interval without continuity correction”,
 xlab = “True Proportion (Population Proportion) “, ylab = “Coverage (%) for 95% CI”)
abline(h = 95, lty=3, col=”maroon”, lwd=2)
axis(side = 2, at=seq(80,100, 5))plot(out2$probs, out2$coverage, type=”l”, ylim = c(80,100), col=”blue”, lwd=2, frame.plot = FALSE, yaxt=’n’, 
 main = “Coverage of Wilson Score interval with continuity correction”,
 xlab = “True Proportion (Population Proportion) “, ylab = “Coverage (%) for 95% CI”)
abline(h = 95, lty=3, col=”maroon”, lwd=2)
axis(side = 2, at=seq(80,100, 5))*

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

具有和不具有连续性校正的 Wilson 分数区间覆盖。Yate 连续性校正的覆盖率(右图)与 Clopper-Pearson 相似,具有非常好的覆盖率,但在极端情况下可能有点过于保守

4.阿格莱斯蒂-库尔区间

Agresti & Coull 一个简单的 solution⁴来提高 Wald 区间的覆盖率。这种简单的解决方案也被认为比 Clopper-Pearson(精确)区间执行得更好,因为该 Agresti-Coull 区间不太保守,同时具有良好的覆盖。解决方案可能看起来非常简单,因为这只是在原始观察结果上增加了两个成功和两个失败!是的,没错。这里,对于 95%的置信区间,x(成功次数)变成 x+2,n(样本大小)变成 n+4。仅此而已。但是这个非常简单的解决方案在实际场景中似乎非常有效。这就是它的美妙之处。通过添加这些伪观测值,p 的分布被拉向 0.5,因此当 p 处于极值时,p 的分布的偏斜被拉向 0.5。因此,在某种程度上,你可以说这也是某种连续性的修正。另一个令人惊讶的事实是,原始论文发表于 1998 年,而不是第二次世界大战前克洛普-皮尔逊和威尔逊的论文。因此,这是一种相对较新的方法。

Agresti-Coull 区间的覆盖范围如下图所示。这

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

Agresti-Coull 区间的覆盖率

Agresti-Coull 区间是一种非常简单的解决方案,可以缓解 Wald 区间的较差性能,但如上所示,这种非常简单的解决方案极大地提高了覆盖范围。下面给出了为 Agresti-Coull 区间生成此覆盖图的 R 代码。请注意,它使用了之前定义的自定义函数“getCoverages”。

*ac <- getCoverages(method =”agresticoull”)plot(ac$probs, ac$coverage, type=”l”, ylim = c(80,100), col=”blue”, lwd=2, frame.plot = FALSE, yaxt=’n’, 
 main = “Coverage of Agresti-Coull Interval without continuity correction”,
 xlab = “True Proportion (Population Proportion) “, ylab = “Coverage (%) for 95% CI”)
abline(h = 95, lty=3, col=”maroon”, lwd=2)
axis(side = 2, at=seq(80,100, 5))*

5.贝叶斯 HPD 区间

贝叶斯 HPD 区间是这个列表中的最后一个,它源于一个完全不同的概念,被称为贝叶斯统计推断。

我们上面讨论的所有四个置信区间都是基于频率统计的概念。频数统计是一个统计领域,通过关注数据的频率,基于样本数据进行人口统计的推断或人口统计的估计。这里的假设是,一个假设是正确的,数据的概率分布假设遵循一些已知的分布,我们从该分布中收集样本。

贝叶斯统计推断是一个完全不同的统计推断学派。这里,参数的推断需要假设数据和观察(采样)数据的先验分布,在给定数据的情况下,使用似然性来创建参数的分布。后验分布是我们真正感兴趣的,也是我们想要估计的。我们从数据中知道可能性,并且通过假设分布我们知道先验分布。使用可能性,我们可以从先验到后验更新我们的结论——也就是说,数据提供了一些信息,使我们能够更新我们现有的(假设的)先验知识。

贝叶斯统计推断在 20 世纪以前非常流行,然后频率主义统计学统治了统计推断世界。贝叶斯推理不受欢迎的原因之一是,很明显,要产生稳健的贝叶斯推理,需要大量的计算能力。然而,在过去的一二十年里,世界已经见证了计算能力的巨大提高,因此贝叶斯统计推断再次获得了广泛的流行。这就是为什么流行的“贝叶斯与频率主义者”的辩论出现在统计文献和社交媒体中。

p 值,置信区间——这些都是频率统计。所以贝叶斯 HPD(最高后验密度)区间实际上根本不是置信区间!这个区间被称为可信区间。

如上所述,我们可以将贝叶斯推理总结为

后验~似然先验*

对于比例, beta 分布通常被认为是先验分布的选择。β分布取决于两个参数α和β。当α=β= 0.5 时,这就是所谓的杰弗里先验。据说 Jeffrey 的先验有一些理论上的好处,这是估计比例可信区间最常用的先验分布。

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

杰弗里的先验

R 中的“binom”包有一个“binom.bayes”函数,用于估计比例的贝叶斯可信区间。最佳可信区间与后验线相交,这些区间被称为最高后验密度(HPD)区间。

让我们看看贝叶斯 HPD 可信区间的覆盖范围

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

贝耶的 HPD 可信区间覆盖与杰弗里的先验

Baye 的 HPD 可信区间的覆盖范围似乎比 Wald 的好,但并不比其他三个频率主义者的置信区间好。不过,使用可信区间的一个优势在于区间的解释。

95%置信区间的频率主义者定义:

如果我们从总体中抽取几个独立的随机样本,并从每个样本数据中构建置信区间,那么 100 个置信区间中有 95 个将包含真实平均值(真实比例,在比例的上下文中)

哎呀,与我们最初对置信区间的想法相比,上面的定义似乎非常复杂,甚至令人困惑。就像我之前说的,我们仍然可以有 95%的把握认为真实比例在置信区间内。

但是说到贝叶斯可信区间,实际的统计定义本身就很直观。

95%可信区间的贝叶斯定义:

真实比例位于 95%可信区间内的概率为 0.95

哇,上面的定义似乎比频率主义者的定义更“可爱”。因此,这是贝叶斯统计推断的一个明显优势,因为从实用的角度来看,这些定义更加直观,而频率参数(如 p 值、置信区间)的实际定义对于人类思维来说是复杂的。

把所有这些放在一起

让我们总结一下我们列出的所有五种不同类型的置信区间。下图将所有的覆盖范围放在一起。

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

简而言之…

  • Clopper-Pearson 区间是迄今为止覆盖最广的置信区间,但它过于保守,尤其是在 p 的极值处
  • Wald 间隔表现非常差,并且在极端情况下,它无论如何都不能提供可接受的覆盖
  • 贝叶斯 HPD 可信区间在大多数情况下都具有可接受的覆盖范围,但在 Jeffrey 的先验下,它不能在 p 的极值处提供良好的覆盖范围。然而,这可能取决于所使用的先验分布,并且可能随着不同的先验而改变。与其他置信区间不同,可信区间的一个优点是直观的统计定义
  • Agresti-Coull 通过对 Wald 公式进行非常简单的修改,提供了良好的覆盖范围。
  • Wilson 的有和没有校正的得分区间也具有非常好的覆盖范围,尽管应用了校正,它往往有点太保守。

下表总结了五个不同置信区间的一些要点

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

Brown、Cai 和 Dasgupta 建议,当样本量小于 40 时,使用带连续性校正的 Wilson 评分,对于更大的样本,建议使用 Agresti-Coull 区间。

参考文献

  1. 劳伦斯·布朗;蔡,托尼;达斯古普塔,阿尼班。二项比例的区间估计。统计学家。Sci。第 16 期(2001 年),第 2 期,第 101-133 页。doi:10.1214/ss/1009213286。https://projecteuclid.org/euclid.ss/1009213286
  2. Clopper,C.J .和 Pearson,E.S.(1934),“二项式情况下说明的置信度或置信限的使用”,《生物计量学》26,404–413。
  3. E.B .威尔逊(1927)。或然推断、继承法和统计推断。美国统计协会杂志,22,209–212。doi: 10.2307/2276774。
  4. 对于二项式比例的区间估计,Agresti A .,Coull B.A .近似比“精确”更好。我是。统计。1998;52:119–126.doi: 10.2307/2685469

五个很酷的 Python 循环技巧

原文:https://towardsdatascience.com/five-cool-python-looping-tips-14f6f44bcfc7?source=collection_archive---------4-----------------------

帮助你掌握 Python 迭代循环技巧的 5 个技巧。

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

(python 标识由http://python.org 提供))

或者循环很可能是一个新的 Python 程序员最先学会的概念之一。这是有充分理由的,因为 for 循环可以对数据做很多事情,而不会变得狡猾。然而,经常很容易让您的思想停留在简单迭代的世界中,而没有利用一些更有效和简洁的迭代方法和技巧来应用于 for 循环。使用这些技巧不仅可以使 for 循环更快,还可以使代码更简洁,为 Python 中潜在的循环机会打开一扇新的大门。

Zip:一次遍历两个列表

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

(python 徽标由 http://python.org 提供)

在我的经验中,我发现一个真正有价值的工具是一次遍历两个数组的能力。这在其他语言中显然要困难得多,而在 Python 中我非常欣赏这种简单性。为了一次遍历两个数组,我们只需使用 zip()方法。

for first,second in zip(array1,array2):
    print(first)
    print(second)

演示这一点的一个很好的例子是用一组偶数和一组奇数进行计数:

odds = [1,3,5,7,9]
evens = [2,4,6,8,10]
for oddnum, evennum in zip(odds,evens):
    print(oddnum)
    print(evennum)

我们的输出会是:

1
2
3
4
5
6
7
8
9
10

在范围内:编写一个 C 风格的循环

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

虽然这看起来很基本,但是你可以用经典的 C 风格的循环做很多有趣的事情。

for i in range(10):
    print(i)
    if i == 3:
        i.update(7)

我们中的 C 爱好者可能认为这不一定是 C 风格的 for 循环,但这是不用编写自己的迭代方法就能得到的最接近的方法。幸运的是,我喜欢浪费时间,所以我决定写一个新的迭代器来尽可能接近经典的 C 循环:

class forrange:

    def __init__(self, startOrStop, stop=None, step=1):
        if step == 0:
            raise ValueError('forrange step argument must not be zero')
        if not isinstance(startOrStop, int):
            raise TypeError('forrange startOrStop argument must be an int')
        if stop is not None and not isinstance(stop, int):
            raise TypeError('forrange stop argument must be an int')

        if stop is None:
            self.start = 0
            self.stop = startOrStop
            self.step = step
        else:
            self.start = startOrStop
            self.stop = stop
            self.step = step

    def __iter__(self):
        return self.foriterator(self.start, self.stop, self.step)

    class foriterator:

        def __init__(self, start, stop, step):
            self.currentValue = None
            self.nextValue = start
            self.stop = stop
            self.step = step

        def __iter__(self): return self

        def next(self):
            if self.step > 0 and self.nextValue >= self.stop:
                raise StopIteration
            if self.step < 0 and self.nextValue <= self.stop:
                raise StopIteration
            self.currentValue = forrange.forvalue(self.nextValue, self)
            self.nextValue += self.step
            return self.currentValue

    class forvalue(int):
        def __new__(cls, value, iterator):
            value = super(forrange.forvalue, cls).__new__(cls, value)
            value.iterator = iterator
            return value

        def update(self, value):
            if not isinstance(self, int):
                raise TypeError('forvalue.update value must be an int')
            if self == self.iterator.currentValue:
                self.iterator.nextValue = value + self.iterator.step

Enumerate():索引您的 dim

Python 中的 enumerate 方法允许 Python 对从数组中出来的列表索引进行编号。为了证明这一点,我将列出一个包含三个元素的列表:

l = [5,10,15]

现在我们可以像这样访问数组索引:

l[1]
10
l[0]
5
l[2]
15

在枚举这些列表的时候,我们会把 dim 的索引位置,连同 dim,一起砸进一个新的变量里。注意新变量的类型。

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

Python 会自动把这些索引放到一个元组里,我觉得很奇怪。我当然更喜欢用一个元素的 Python 字典来接收结果。幸运的是,我们总是可以用 Python 的将我们的枚举转换成 Python 字典

“非常简单”

类型断言!

data = dict(enumerate(l))

这将给我们:

>>> data
{0: 5, 1: 10, 2: 15}

Sorted():在期间而不是之前对数据进行排序。

对于任何处理大量数据的人来说,排序方法都是一种基本方法,数据科学家通常都应该这样做。排序是按照预期的方式工作的,字符串按照从字母 A 到字母 B 的字母顺序排序,整数和双精度从- 升序排序。关于这个函数需要注意的一点是,它不能处理包含字符串、整数或浮点数的列表。

l = [15,6,1,8]
for i in sorted(l):
    print(i)
1
6
8
15

我们也可以通过将 reverse 参数设置为 False 来执行相反的操作:

for i in sorted(l,reverse = True):
    print(i)
15
8
6
1

对于我们可用的最后一个参数,我们可以使用一个键。密钥是应用于给定循环内每个 dim 的函数。为此,我喜欢使用 lambda,它将创建一个匿名但仍可调用的函数。

l.sort(key=lambda s: s[::-1])

Filter():只循环你想要的数据。

在处理大量数据时,一个绝对有助于提高性能的函数是 filter 函数。filter 函数完全按照您的预期工作,在迭代之前过滤掉数据。当您只想对特定范围内的数据产生影响,而不必对其应用条件时,这可能会很有用。

people = [{"name": "John", "id": 1}, {"name": "Mike", "id": 4}, {"name": "Sandra", "id": 2}, {"name": "Jennifer", "id": 3}]for person in filter(lambda i: i["id"] % 2 == 0, people):
...     print(person)
... 
{'name': 'Mike', 'id': 4}
{'name': 'Sandra', 'id': 2}

结论

理想情况下,将这些方法应用到 Python 代码中不仅会使代码更简洁,而且很可能会更快。利用这些方法将会给你迭代的超能力,并使通过迭代处理大量数据变得容易得多,这有时是不可避免的。

解释可解释人工智能的五个关键问题

原文:https://towardsdatascience.com/five-critical-questions-to-explain-explainable-ai-e0c40bdca368?source=collection_archive---------31-----------------------

开始你负责任的人工智能之旅

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

来源:图片来自 John moes Bauan来自 Unsplash

最近在印度举行的一次关于负责任的人工智能促进社会赋权的会议上,讨论的主题是可解释的人工智能。可解释的人工智能是更广泛的负责任的人工智能学科的关键要素。负责任的人工智能涵盖了一系列与人工智能相关的风险和问题的道德、法规和治理,包括偏见、透明度、可解释性、可解释性、健壮性、安全性、安全性和隐私性。

可解释性和可解释性密切相关话题。可解释性是模型级别的,目标是理解整个模型的决策或预测。可解释性是在模型的单个实例中,目的是理解为什么模型会做出特定的决策或预测。当谈到可解释的人工智能时,我们需要考虑五个关键问题——向谁解释?为什么解释?什么时候解释?怎么解释?有什么解释?

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

来源:作者创作

谁来解释?

解释的受众或向谁解释应该是首先要回答的问题。理解听众的动机,听众计划做出什么行动或决定,他们的数学或技术知识和专长都是在阐述解释时应该考虑的重要方面。根据我们的经验,我们提出了四种主要的受众类型-

  • **最终用户:**这些是消费者,他们正在接收由人工智能系统做出的决策、行动或建议的解释。解释本身可以以数字方式(例如,智能手机应用程序或在线应用程序)或通过人(例如,信贷员解释消费者的贷款申请如何被 AI 系统拒绝)来传递。最终用户主要关心的是决策、行动或建议对他们生活的影响。
  • **业务发起人:**这些是业务或职能部门的公司高管,他们使用人工智能系统来做出影响其他业务或职能部门或其客户的决策、行动或建议。业务发起人既关心个别的解释,也关心更广泛的模型可解释性。业务主管主要关心的是治理过程,以确保组织遵从法规,并且客户对解释感到满意。
  • **数据科学家:**这些数据科学家设计、训练、测试、部署和监控人工智能系统做出的决策、行动和建议。该解释可能用于“调试”或测试系统的目的,也可能是增强正在构建的模型的潜在来源。主要关注的是解释在多大程度上反映了模型的推理、法规要求和最终用户的接受程度。
  • **监管者:**这些是监管者,他们可能希望确保人工智能系统不会歧视或伤害任何个人或群体。根据人工智能系统使用的领域和人工智能应用的性质,解释的严格程度可能会有所不同。监管者主要关心的是确保向消费者提供充分的可操作的解释,并且对消费者没有损害。

这四种受众类型的列表绝非详尽无遗,但它确实抓住了不同群体之间的一些关键差异。他们也把我们引向了下一个问题。

为什么解释?

是否需要解释取决于听众或前一个问题的答案。终端用户需要对人工智能系统所建议的决策或行动进行解释,以便执行建议。从最终用户的角度来看,人工智能系统的可操作性和可信度是解释的关键要求。企业用户需要一个解释,以确保公司治理和管理其集团或公司的声誉风险。数据科学家需要解释来验证模型,并在模型的准确性、可解释性、公平性、稳健性和其他性能标准之间进行权衡。监管机构要求做出解释,以确保遵守现有法规,并确保消费者不会受到伤害。

什么时候解释?

解释可以在模型建立之前生成,也称为事前或者先对模型进行训练和测试,然后生成解释,也称为事后 。根据模型的复杂程度、所要求和达到的精度以及所要求的解释水平,技术的选择可能会有所不同。有一些技术,如回归或决策树,本质上比深度学习等其他技术更容易解释。一般来说,在建立模型之前,最好对可解释性的水平有个概念。现在有许多技术可用于事后解释

如何解释?

说到 如何解释 有多种不同的解释模式。视觉或图形解释、表格数据驱动解释、自然语言描述或语音解释是一些现有的解释模式。具体模式取决于听众以及解释的目的。例如,一名销售人员可能对显示销售增长图表以及销售增长是如何实现的解释感到满意。对于一个拥有智能手机的印度农民来说,同样的图形解释可能不足以解释他不断增加的作物销售收入。类似地,与详细的书面解释相比,通过语音界面可以更好地提供对建筑工人的指示以及对为什么给出这些指示的解释。

有什么解释(手法)?

学术文献中描述和评估了许多解释技术。它们属于六大方法,因为它涉及到事后解释。

  • ***特征相关性:*这些解释能力的方法关注于模型的内部功能,并突出了最能解释模型结果的特征。
  • ***模型简化:*这些方法关注于建立一个新的模型,它是一个待解释的更复杂模型的简化。
  • ***局部解释:*这些方法对解决方案空间进行细分,并为不太复杂的较小部分提供解释。
  • ***举例说明:*这些方法提取特定的代表性数据来解释模型的整体行为。
  • ***可视化:*这些方法允许最终用户可视化模型行为,通常是通过降低问题的复杂性。
  • ***文本解释:*这些方法将解释转换成自然语言文本。

这里所说的可视化和文本解释是当我们决定了解释的模式或“如何解释”时要使用的具体技术在前一节中考虑过

总之,在我们开始在企业内部实施任何可解释的人工智能计划之前,我们需要回答这五个问题,以便更清楚地了解我们希望我们的人工智能系统如何是可解释的,以及我们可以利用学术文献中的哪些技术。

数据可视化的五种设计表方法

原文:https://towardsdatascience.com/five-design-sheet-methodology-approach-to-data-visualisation-603d760f2418?source=collection_archive---------6-----------------------

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

作者图片— D3.js 可视化

假设我们应该将我们的发现可视化,并将它们清楚地传达给我们的利益相关者,我们如何决定数据可视化的类型来有效地传递这些见解呢?我们是否只是探索像 Tableau 或微软 Power BI 这样的初学者友好的数据可视化工具来制作图表?或者我们应该花更多的时间使用像 D3.js 或 R shiny library 这样的复杂工具来设计更有创造性的可视化?首先,我们应该先决定工具还是先决定设计?我们头脑中的想法很难在我们熟悉的工具中实现,并且经常以简单而无效的可视化设计而告终,这种可能性是肯定存在的。

引入五张设计单(FDS)方法是为了使草图和低保真度原型正式化,以允许可视化设计师探索他们的想法,而不用担心技术方面。顾名思义,在这个方法中有 5 张纸,这篇文章将触及每张纸是关于什么的,以及它们是如何被用来开发上面截图中的可视化的(在 D3.js 中完成)。

问题陈述

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

阿瑟·埃德尔曼在 Unsplash 上的照片

这一部分并不完全重要,但我认为完整地描述一下我们试图通过 FDS 方法实现的目标会很好。我们正试图从 2011 年 1 月至 2016 年 12 月的数据期间,研究澳大利亚 8 个主要机场,即阿德莱德、布里斯班、堪培拉、黄金海岸、墨尔本、珀斯、悉尼和塔斯马尼亚的降雨量和飞机起降之间可能的相关性。

我希望传达给目标受众的关键信息是,从 2011 年到 2016 年,2 月份的降雨量和飞机起降次数之间存在明显的模式。二月份降雨量减少,飞机起降量也随之减少。

传达这一关键信息的目标受众是澳大利亚政府基础设施、区域发展和城市部。这一政府机构的主要作用包括通过运输支持经济增长和增加运输通道。通过向他们传达关键信息,可能会导致在 2 月份计划更多的航班和航线,当时很明显,2011 年至 2016 年 2 月份的飞机活动明显减少,同时降雨量也有所下降。这与政府数据的责任是一致的,因为这将导致公众获得更多的航班信息,进而通过增加收入来促进经济增长。此外,包含来自同一政府机构的飞机活动量的数据集,通过呈现对其自己的数据集的分析,可能会导致数据的更大可信度,从而加强关键信息的传达。

表格 1 —创意表格

这是最初的头脑风暴表,你只要在一张纸上勾画出你所有的想法,不管它们是否现实或可行。想出至少 10-20 个 想法 ,然后 根据是否有重复或不相关的概念过滤 这些想法。将想法归类在一起,思考是否有遗漏的概念。 提问 设计是否能解决原始问题(即能否有效传达信息),选择 3 个想法,在接下来的 3 张纸上探讨。

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

作者图片— FDS 第 1 页

在“创意部分总共生成了 12 个不同的图表/草图,考虑到关键信息,在“过滤器部分删除了不相关的图表/草图。热图被认为是不相关的,因为该项目的数据集没有覆盖整个澳大利亚,只选择了 8 个机场位置。饼状图也被删除,因为在一个饼状图中表示两个数据因素(降雨量和飞机起降)是不合适的。移除了树形图,关键信息是不要比较最高/最低降雨量/飞机移动。剩余的想法被分为五个主要类别,如“分类部分所示,然后它们被组合成三种可能的设计,即组合条形图和折线图、符号图和气泡图,将在接下来的 3 页中讨论。

在提出叙事视觉化的可能想法,以便能够将关键信息传达给目标受众时,提出并记录了一些问题:

展示地理位置对于传递关键信息是否必要?

按年/月/季度显示数据周期是否更有效

传递关键信息?

用户能否根据数据周期、机场位置进行过滤?

应用过滤后,用户可以查看整体图表吗?

表 2 —替代设计表

第 2 页、第 3 页和第 4 页旨在更深入地探索从第 1 页中选择的 3 种设计,通常包含以下部分:

1. 信息 :标题、作者、数据集等元信息

2. 布局 :设计可视化草图

3. 操作 :列出可视化中可用的功能,以及用户能够用它做什么

4. 焦点 :识别可视化设计的核心部分

5. 讨论 :讨论设计的优点、缺点、可行性

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

作者图片— FDS 第 2 页

正在考虑的第一个设计是气泡图。使用这种可视化,当用户水平拖动数据周期过滤器时,将传达关键信息,这将使气泡图随时间变化。这样,当用户从 1 月拖动到 2 月时,圆圈的位置将会更低,因为与 1 月相比,2 月的降雨量和飞机移动量都更低。这将使用户对降雨如何影响飞机运动有一个大致的了解,并且基于位置的气泡的不同颜色表示,用户也可以在位置过滤器的帮助下容易地识别不同位置的可能趋势。最后,当用户悬停在显示位置、降雨量和飞机总移动量的气泡上时,会显示一个工具提示。

该设计没有被选为最终设计,因为只有两个基于数值的数据因素,即飞机移动和降雨量,没有预先存在的第三个数据因素可以与圆圈的宽度一起显示。因此,需要计算这两个因素之间的比率来表示气泡的宽度,我认为这是不相关的,并且在传达关键信息时提供了很少的上下文。此外,气泡图的轴最好由两个基于值的数据表示,由于我们的数据集和关键信息包括时间数据因素,它只能作为过滤器包含在此可视化中,这使得用户很难在不水平拖动数据周期过滤器的情况下一眼就识别出这些年的关键信息。

表 3—替代设计表

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

作者图片— FDS 第 3 页

正在考虑的第二个设计是条形图和折线图的组合。通过这种可视化,它将允许用户对这两个数据因素(降雨量和飞机活动)随时间的变化有一个总体的了解。并且通过将数据过滤到期望的年份和季度的附加用户交互,用户将更容易集中于数据周期的四分之一,这将因此导致关键消息的更有效的传达。此外,当用户悬停在条形图或折线图上的飞机符号上时,将显示工具提示。地图形式的第三个用户交互过滤器被包括在内,以便用户在 8 个不同位置之间进行过滤,同时在地理上识别关键信息。用降雨量作为背景来表示条形图,用飞机符号来表示折线图,将产生另一种形式的两个数据因素之间的容易识别。

这种可视化的第一个问题是不允许用户同时选择多个位置。位置过滤器将只允许同时选择一个位置,这将阻止用户在两个位置之间进行比较。此外,由于关键信息主要集中在二月的数据期间,所以用 12 个单独的条形表示一年中的 12 个月的单个条形图可能不适合仅集中在二月。一次按月表示整个数据周期将导致在单个条形图中绘制总共 72 个条形图,这对用户来说可能很难理解信息和关键信息。

表 4—替代设计表

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

作者图片— FDS 第 4 页

正在考虑的第三个设计是一个符号地图。飞机的移动将由地图上圆圈的大小来表示,降雨量将由圆圈的颜色饱和度来表示。包括一个过滤器,用户可以通过水平拖动在数据周期之间过滤。当用户访问从 1 月到 2 月的数据周期过滤器时,可以突出显示关键信息,这将看到圆的大小减小,圆的饱和度变浅,因为与 1 月相比,2 月的飞机活动和降雨量减少。将鼠标悬停在每个圆圈上还会显示降雨量和飞机移动量,让用户掌握真实的数据值。这种地理可视化允许用户容易地识别关于每个位置的任何可能的趋势,并且圆圈的大小和颜色饱和度允许用户进一步识别两个数据因素的高点和低点。

然而,由于关键信息主要关注的只是时间因素(即二月),地理代表不应成为重点,因为它可能会使用户偏离关键信息。此外,用户很难在同一地图上一次查看整个数据周期,这可能会使关键信息不太突出。最后,尽管不同地点的降雨量和飞机活动的高低可以很容易地通过圆圈的颜色饱和度和大小来识别,但这不是关键信息的组成部分。

表 5—实现表

这是最终选定的设计,详细说明了可视化中的概念。它包含有关设计、功能和要实现的交互的信息。本表中可以讨论以下组件:

1. 描述 的主要设计模式、算法或数据结构及引用

2.底层 数学 以及布局尺寸等设计中用到的计算

3. 软件 需求、 依赖

4. 费用估算

5.任何 其他 需求或所需资源

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

作者图片— FDS 第 5 页

最终选择的设计是对表 3 的改进——折线图和条形图的组合。数据集将绘制在 6 个不同的图表上,每个图表代表一年(即 2011 年至 2016 年),而不是在单个图表中绘制整个数据集。季度过滤器将有助于关键信息的传达,因为与用户选择的季度相对应的条形将在所有 6 个图表中突出显示,这允许用户只关注那些条形。将包括一个位置过滤器,允许用户在位置之间过滤。最后,当用户将鼠标悬停在蓝色条(对应于降雨量的颜色)和代表飞机活动数据因素的飞机符号上时,将显示工具提示。

选择这种设计的主要原因是,用户只需看一眼就能更容易地查看整个数据集,从而轻松识别关键信息,而不是逐年过滤数据或使用一个包含 72 个条形的图表。第二个原因是,我觉得这是两个数据因素相对于时间因素的最简单和最有效的表示。请记住,目标受众是政府机构,应该实现能够迅速传递信息的可视化。

用户将首先获得整个数据集的总体视图,而不考虑位置,使用季度过滤器突出显示第 1 季度的条形将允许用户在 6 个不同的图表中显示 2011 年至 2016 年 2 月降雨量下降时,看到飞机活动下降的明显模式。这将有效地传达突出二月份的关键信息。并且如果用户有兴趣识别该模式是否在所有 8 个位置都一致或者在任何位置更显著,则可以使用位置过滤器。

摘要

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

作者图片— D3.js 可视化

这是五个设计表方法,帮助我们最终能够在 D3.js 中设计和实现我们的最终可视化设计,如上面的截图所示,并具有表 5 中描述的所有功能。虽然为一个可视化问题想出 5 张纸似乎令人生畏,而且可能没有时间效率,但我觉得这是一个很好的方式,让我可以将我所有的想法结合起来,深入到微小的领域,如果我从一开始就设计可视化设计,我可能会错过这些领域。希望这个演练可以帮助你们成为一个有效的数据可视化设计师!

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

交通数据科学的五项基本技能

原文:https://towardsdatascience.com/five-essential-skills-for-transportation-data-science-8c4bed72c03e?source=collection_archive---------35-----------------------

公共部门交通机构渴望雇佣数据科学家;不需要博士学位

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

宾夕法尼亚州匹兹堡照明道路上的夜间交通(摄影:马克·埃格)

交通几乎每天都与每个人的生活息息相关。建设和运营世界道路、高速公路和其他公共交通网络的公共部门实体渴望聘用具备理解海量数据技能的数据科学家。熟练掌握本文中描述的五项技能将使你能够回答运输机构日常面临的许多问题。加入运输部或大都市规划组织是任何希望应用自己的技能服务于更大利益的新数据科学家的完美切入点。

感兴趣吗?作为一名支持运输机构的数据科学家,以下是你需要掌握的五项基本技能:

  1. 数据管理和转换
  2. 地理信息系统
  3. 决策树
  4. 绘图和测绘
  5. 计数回归模型

本文通过对宾夕法尼亚州道路照明和交通安全之间的关系的应用调查来说明这些技巧的应用。这个例子使用了 R,由于它丰富的用户生态系统和分析包,它为许多运输问题提供了一个极好的工作台。

设置

假设你是宾夕法尼亚州交通部的分析师。该机构正在权衡将其年度道路安全预算的更多支出用于安装公路照明,还是用于护栏等其他安全改进。你的职责是帮助回答这个问题:“街道照明对撞车有什么影响?”我们在下面研究这个问题。

您可以下载代码,并通过从https://github.com/markegge/safety-demo/克隆这个库来跟随自己

数据准备:GIS +数据转换

数据分析几乎总是通过数据准备将源数据转换成适合分析的格式来进行的。这包括派生新属性、连接表、聚合和重塑表等操作。

r 的data.tabledplyr包都是强大和通用的数据转换多工具。在本文中,我使用 R 的data.table包,我更喜欢它的速度和简洁的语法。

安全分析通常使用五年的历史碰撞数据。因此,我们开始从宾夕法尼亚州事故信息交换中心加载五年的事故历史:

因为运输描述了人和货物在空间中的移动,所以运输数据通常是空间的。要处理空间数据,您需要熟悉基本的 GIS 操作,如缓冲、融合和连接,以及在 Web 墨卡托投影、StatePlane 投影和 UTM 投影之间重新投影空间数据。

投影是一种将圆形星球的空间数据映射到平面计算机屏幕上的方式。Web 地图通常使用名为 Web 墨卡托(EPSG:4326)的投影显示以纬度和经度测量的距离数据。由于经度的长度随纬度而变化,因此测量、缓冲和相交操作通常在国家平面或 UTM 投影中执行,这些投影以英尺或米而不是度来测量距离。

在此分析中,我们将使用联邦高速公路管理局提供的宾夕法尼亚州高速公路网的空间表示。每条道路都被分成几段。为了统计每个路段的撞车次数,我们将路段缓冲 50 英尺,然后在空间上将撞车点连接到缓冲线。

在 R 中,sf包为强大的 GDAL 空间库提供了一个接口,允许在 R 中使用您可能已经通过使用 PostGIS 或 Python 而熟悉的相同空间函数。

结果看起来像这样:

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

接下来,我们将把我们的碰撞计数制成表格,并将这些结果连接回我们的空间数据。我们还使用碰撞属性,根据联合碰撞中报告的照明条件,估算给定路段是否被照亮。

决策树

决策树是识别数据中结构关系的有用工具。他们的主要用途是通过导出一个规则集将观察结果分为两类或更多类,但是他们定义规则集的内部算法也是一个有用的探索性数据分析工具,用于确定预测因素和结果变量之间的关系。

在下面的部分中,决策树用于填充没有任何交通事故的路段的“照明”属性,并了解数据集中哪些属性可预测交通事故率。

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

决策树的图形呈现,用于预测崩溃率。每日车辆行驶里程较低的路段(VMT DLY)车祸率较高。

绘图和测绘

数据可视化使人类能够快速处理和发现大量数据的趋势。对于空间数据,这通常意味着制图。例如,我们可以使用 R 的leaflet包(它为流行的传单 JavaScript web 映射库提供了一个 API)来检查我们基于碰撞的道路照明分配是否有意义。

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

对于绘制表格数据,ggplot2是 R 的主要数据可视化库。下面,我们绘制了路段碰撞数与暴露量(车辆行驶里程,定义为路段长度乘以日交通量)的关系图。

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

绘制路段碰撞次数与车辆行驶里程的关系图显示,有照明的路段往往具有较高的碰撞次数和较低的 VMT。

计数回归模型

回归是一种非常有用的统计工具,用于识别数据中的数量关系。普通最小二乘法的线性回归是最常见的回归类型(用于预测具有线性预测关系的连续结果变量),但回归实际上是一系列具有许多不同类型和应用的模型。扩展您的回归库以包括计数模型在运输环境中有许多应用。

全州范围内的交通事故数据通常采用零膨胀负二项式(ZINB)回归模型,该模型考虑了短距离或低交通量路段记录的交通事故为零的概率。我们可以通过在 ZINB 回归模型中将照明作为解释变量来研究道路照明和碰撞之间的关系。

我们的 ZINB 模型根据曝光(VMT)和光照预测撞车。以下是模型输出:

Call:
pscl::zeroinfl(formula = total_crashes ~ lighting + mvmt | mvmt, data = segments)Count model coefficients (poisson with log link):
                Estimate Std. Error z value Pr(>|z|)    
(Intercept)    2.1916955  0.0040869  536.28   <2e-16 ***
lightingunlit -0.3935121  0.0056469  -69.69   <2e-16 ***
mvmt           0.0370332  0.0001227  301.72   <2e-16 ***Zero-inflation model coefficients (binomial with logit link):
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)  0.14028    0.03982   3.523 0.000427 ***
mvmt        -1.97937    0.06055 -32.690  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

该模型估计,没有照明的路段(lighting unlight)比没有照明的路段(其他条件相同)平均少发生 0.4 起车祸。

这一反直觉的发现表明了混杂变量的存在。毕竟,照明不是随意安装的。我们打算调查照明对撞车的影响;我们似乎已经发现了碰撞对照明的影响(即照明似乎安装在固有的危险位置)。

然而,我们的失败为其他可能成功的方法指明了道路。由于照明不是随机安装的,因此更好的方法可能是找到照明条件随时间变化的数据,例如新安装的照明或维护记录显示灯泡烧坏的地方。

实践中的数据科学

数据科学是迭代的。托马斯·爱迪生曾说过一句著名的话,关于他多次制造出能正常工作的灯泡的失败,“我没有失败。我刚刚发现了一万种行不通的方法。”在数据科学的实际应用中,一点谦逊大有帮助;如果一个主题很重要,那么它很可能已经被研究过了。不要指望你的第一次调查会彻底颠覆现有的规范。做好失败比成功更频繁的准备;尝试新的迭代,结合以前迭代中的学习,直到您得到一个可操作的发现(或用完数据,这是经常发生的情况)。

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

照片:马克·艾格

几乎每一个活着的人都与我们的交通系统的质量和效率相互作用并受其影响,无论是通过其成功——流动性和经济机会——还是缺点(全球变暖;仅在美国,每年就有 40,000 多人死于汽车;拥堵;等等。).大多数公共部门交通机构拥有丰富的数据,但缺乏熟练的数据科学家来扩大他们对数据知情决策的使用。

如果你愿意持之以恒,并具备上述五种技能的工作知识,公共部门交通机构是面向影响的数据科学家的好去处。

五个 Excel 函数加快数据分析

原文:https://towardsdatascience.com/five-excel-functions-for-faster-data-analysis-19d88e5395e4?source=collection_archive---------9-----------------------

使用 MS Excel 进行动手数据分析

和专业技巧,快速获得数据驱动的见解

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

图片由 Esa Riutta 来自 Pixabay

“想象一个没有 Excel 的世界。那对我来说是不可能的。”—微软首席执行官塞特亚·纳德拉

Microsoft Excel 是全球电子表格工具,于 1985 年首次发布,用于分析表格形式的数据。它使得数据和数字分析对每个人都是可访问的。它不仅提高了⚡️的生产率,还引发了一种新的商业思维方式。

是的。今天,我要告诉你微软 Excel 的故事。通过这个故事,我将用有趣的例子向您介绍五个 Excel 函数,以加速您的数据分析。

来点外卖怎么样??? 是的!我正在分享一些提高你使用 Excel 效率的专业技巧。所以继续关注这个📌符号通过故事为亲提示。

在过去的十年里,我们都看到了大量的用于数据分析和可视化的创新软件。尽管如此,微软 Excel 仍然是普通专业人士最喜欢的工具。特别是对于管理者来说,它是快速管理、操作和可视化各种数据的最佳工具,而无需付出太多额外的努力。

为了不在简介中浪费更多时间,让我们从 Excel 函数开始。我正在使用这个 Dummy_People 数据集。

用 COUNTIFS()计算值

想要快速轻松地取出不同数值的⚡️计数吗?
那么 COUNTIFS()就是你的朋友。

当你试图 统计 Excel 中一列中某项的出现 或者多列中多个变量的出现,那么你就要使用 COUNTIFS()函数。

例如:从库存数据集中计算特定类别的商品销售数量,或者在新冠肺炎数据集中找出多少 20 岁的男性感染了冠状病毒,或者只是在著名的泰坦尼克号数据集中找出多少 60 岁的头等舱乘客幸存下来。

COUNTIFS()计算符合指定条件的值的数量

🎯该函数接受多个*【范围,标准】对,并返回满足所有【范围,标准】*对的值的个数。

下面是语法:

=COUNTIFS(Range_1, Criteria_1, Range_2, Criteria_2,............)

凡事有例子就好。所以现在来了一个,

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

图片作者:Excel 中的 COUNTIFS()

在这个例子中,我使用 COUNTIFS()作为,

=COUNTIFS($F$2:$F$20,$K6,$G$2:$G$20,L$5)

其中,[$F$2:$F$20,$K6][$G$2:$G$20,L$5]是*【范围,标准】*对。当$K6处的值在范围$F$2:$F$20内并且L$5处的值在范围$G$2:$G$20内时,该公式计算单元格的数量。在公式栏中键入此公式,然后按 enter 键以获取单元格 L6(在图像中的黄色框中)中的计数。只需将光标拖动到整组单元格上,即可获得最终输出,如图中绿色框所示。

🎯COUNTIFS()可以被视为 Excel 中的一个大型函数,因为它接受多达 127 对范围&标准

故事并没有到此结束。看看这些关于 COUNTIFS()的有趣事实。

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

作者图片:Excel COUNTIFS()标准

这些类型的标准意味着什么?— 看看这个片段

=COUNTIFS( G2:G20, "Gloucester", C2:C20, ">30", E2:E20, 165)This will count how many people from "Gloucester" are older than 30 years and height 165

📌 Ctrl + Shift 快速选择

使用这个组合键来更快地选择数据集,而不是使用鼠标单击和拖动光标。只需点击您想要选择的第一个单元格,按住 Ctrl + Shift 并使用向上或向下箭头键分别选择上方或下方列中的所有数据,或者按向左或向右箭头键选择左侧或右侧行中的所有数据。

使用 VLOOKUP()搜索值

不管在哪个领域,函数 VLOOKUP()都是 Excel 中一个流行的、广泛使用的和公认的函数。

VLOOKUP()查找指定范围内的指定值并返回信息

它省去了您在不同的 Excel 表和表格之间来回移动以获得预期值的麻烦。

VLOOKUP()做你的工作需要什么?🎯没有,除了这 4 个输入—

  • 查找值:要搜索或查找的值
  • Range:查找值所在的列或值的范围
  • Column:包含要返回的信息的列号
  • Boolean:如果需要近似匹配,则为 TRUE 如果需要查找值的精确匹配,则为 FALSE。但是,该输入是可选的。

下面是语法和一个例子:

=VLOOKUP(Lookup value, Range, Column, Boolean)

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

图片作者:Excel 中的 VLOOKUP()

在这个例子中,我使用 VLOOKUP()作为,

=VLOOKUP(J4,A2:H20,8,FALSE)

在这里,Excel 将在区域A2:H20中的单元格J4中搜索 First_Name。作为输出,我返回了与 First_Name 匹配的电子邮件地址,它出现在8th列中。使用可选参数FALSE,我返回了与J4中的值完全匹配的结果。

VLOOKUP()的一个限制是,要返回的列或值必须出现在数据集中 Lookup_Value 的右侧。为了克服这一点,Excel 推出了新功能— **XLOOKUP()**。目前,此功能仅适用于 Microsoft 365 订阅者。更多关于其用法的信息可以在这里找到。

📌利用 F4 提高生产率

在数据分析和可视化中,你会遇到一种情况,你需要 多次重复你上一个动作 。你所需要做的就是在你想要重复上一个动作的地方按下 F4 键。
另外,F4 是在 Excel 公式中添加绝对单元格引用 的 快捷键!在任何公式中,当您键入单元格引用时,只需一直按下 F4,然后 Excel 将遍历所有绝对单元格引用的可能性,例如, $A1A$1$A$1

用 SUM()、COUNT()、AVERAGE()聚合值

在几乎所有的领域中,您总是在数据分析中计算一些聚合值,例如加法、最大值、最小值、计算值的数量等等。

对于聚合值,这是三个最常用的函数。顾名思义,函数 SUM()将一组特定单元格中的数字相加,就像我们的示例中的— =SUM(starting_cell : ending_cell)
一样,为了计算年龄列中所有值的总和,我使用了

=SUM(C2:C20)

但是,您可以指定用逗号分隔的单元格编号,如— =SUM(cell_1, cell_2, cell_3, …),或者用逗号分隔您想要添加的实际数字,如=SUM(number_1, number_2, number_3, …),而不是提及单元格的范围

那为什么要使用 SUM()函数
🎯因为这样可以节省您在每次键入单元格数字或要添加的实际数字后键入“ + ”的精力。

类似地,AVERAGE()函数计算一组特定单元格中数字的算术平均值,例如— =AVERAGE(starting_cell : ending_cell)

我计算了 Weight 列中所有值的平均值,

=AVERAGE(D2:D20)

COUNT()函数将给出所提供参数列表中数值 的 计数。因此,如果您以参数列表的形式提供单元格范围,函数 COUNT()将只计算那些有数字的单元格。

但是如果你想计算包含文本或逻辑值的单元格的数量,并且❓

别担心!!!

🎯只需在上面的 COUNT()函数的末尾添加字母" A "即可创建一个新函数 COUNTA(),该函数将计算包含数值和文本值的单元格的数量。所有语法的其余部分保持不变。

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

作者图片:Excel 中的聚合函数

在上图中,在黄色框中,您可以看到我讨论过的所有值聚合函数,在绿色框中,您将找到结果。

📌Ctrl +空格和 Shift +空格

有些情况下,您希望 选择一整行或一列 。这些组合可以让你的方式更容易。只需将光标放在属于您想要选择的列或行的单元格中,然后按
Ctrl + Space 选择整列,Shift + Space 选择整行。同样,您可以组合Ctrl+Shift+Space三个一组来选择数据的巨大块。

用 CONCATENATE()合并文本

这是 Excel 中最常用的文本函数之一。Excel 中的 CONCATENATE()允许您连接多个单元格中的文本数据,例如,连接门牌号、街道名称、城市以形成完整的地址,或者连接产品名称和用途以形成其描述,甚至连接客户 ID、名字和姓氏以形成完整的客户详细信息。

CONCATENATE()合并多个单元格的值

这是语法—

=CONCATENATE(Text_1, Text_2, Text_3, ....)

这是它在我们的数据中的应用,

🎯但是,绝对没有必要为文本提及单元格编号,您可以随时键入您想要组合的文本。只需用双引号将文本括起来,并用逗号分隔,就像这样“Text_1", "Text_2", "Text_3”

看看这个例子——

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

作者图片:Excel 中的 CONCATENATE()

这里,函数=CONCATENATE(A2, “ “, B2)A2中的文本和B2中的文本连接起来,它们之间有一个空格“ “,以获得这个人的全名。

嗯,就像其他函数一样,CONCATENATE()也会抛出一些错误🚩

  1. #姓名?:表示您遗漏了应该包含文本的引号
  2. 结果中的引号:如果您遗漏了分隔两个文本的逗号,那么额外的、不需要的引号将出现在最终结果中

左(),中(),右()

不管您的工作域是什么,有时您希望将一列中的数据拆分为两列,或者希望从单元格中的文本值中仅选择几个文本字符。例如,将客户的姓名拆分为名字和姓氏,或者从整个地址中选择城市名称,或者从整个产品说明中选择产品名称。

简而言之,你要做的是 相反的 串联() 。那么这三个功能为您服务。

LEFT(),MID(),RIGHT()从文本中提取特定数量的字符

顾名思义,🎯函数 LEFT()从左侧或单元格开始处提取指定数量的文本字符,函数 RIGHT()从右侧或单元格结束处提取指定数量的文本字符。您只需提供包含文本值的单元格编号和要提取的字符数。

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

作者图片:Excel 中的左()和右()

🎯函数 MID()从文本中间的任意位置提取指定数量的字符。当您想从选择中省略前几个字符时,可以使用这种方法。这里,您需要再提供 1 个输入。除了你想要的单元格号和字符数,还应该提到 start_number。

语法来了-

=MID(Text, start_number, number_of_characters)

*start_number = 1 + Number of characters you want to omit from start*

为了更清楚地理解下面的例子,

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

作者图片:Excel 中的 MID()

📌用 Ctrl + Shift + L 快速创建过滤器和下拉菜单

您可以使用 Ctrl + Shift + L 快速打开或关闭 Excel 数据集中的下拉菜单和过滤器。只需选择数据集中的任意单元格,然后按下此三键来切换过滤器。这将节省您转到数据选项卡并搜索过滤器按钮的时间。

总结一下,

数据并不总是按照您的需求进行组织,您需要进行一些计算和文本操作,以便为您的分析提供良好的组织📊。在实际的数据分析过程中,您将尝试找到聚合值、统计数据,发现数据集中不同值的一些趋势和出现情况。

无论您是想提供数据驱动的见解,还是想为更高层次的决策做出贡献,或者只是想更快地完成工作,掌握正确的 Excel 函数都将超越⚡️,提高您的工作效率并节省您的时间⏰

掌握 COUNTIFS()、VLOOKUP(),这些聚合和文本函数肯定会让你的数据分析更快⚡️和生活更轻松。请记住,您分析数据的速度越快,您将数据转化为洞察力的速度就越快,并且有更多的时间来做出决策。

有兴趣了解更多关于数据分析的内容吗??

然后看看我的其他文章:

[## 加快数据分析的五种方法

让它在竞争中脱颖而出

towardsdatascience.com](/five-ways-for-faster-data-analysis-801a043bfea9) [## Python 中的标签编码器和 OneHot 编码器

通过示例了解标签编码器、OneHot 编码器和 Pandas 虚拟变量

towardsdatascience.com](/label-encoder-and-onehot-encoder-in-python-83d32288b592) [## 数据争论—从原始到干净的转变

简单的三个字的解释

towardsdatascience.com](/data-wrangling-raw-to-clean-transformation-b30a27bf4b3b)

想找点乐子-n-learn??

这里是一个快速⚡️阅读,使自己的数据集与 现成的 Python 代码。

[## 网页抓取—制作您自己的数据集

从网页中提取数据并将其存储到 excel 中—只需 4 个简单的步骤

towardsdatascience.com](/web-scraping-make-your-own-dataset-cc973a9f0ee5)

继续学习!保持微笑!保持动力!

[## 带着奶酪微笑

一个诗意的故事,面对生活的不确定性,找到保持微笑的方法

medium.com](https://medium.com/@17.rsuraj/to-smile-with-cheese-c43d880cbce4)

感谢您的阅读和宝贵时间!

我用这些技术来加速⚡️我的数据分析。希望对你也有帮助。一如既往,我乐于接受反馈,并想知道你还使用哪些技术来进行更快的数据分析。这里所有示例的数据集都是从虚拟数据集派生出来的。

请随时添加您的反馈,并通过 LinkedIn 与我联系。

构建数据分析平台时要避免的五个错误

原文:https://towardsdatascience.com/five-mistakes-to-avoid-while-building-a-data-platform-48eaae976c37?source=collection_archive---------53-----------------------

为什么强大的基础对于数据平台非常重要?

我已经在数据领域工作了几年,从 21 世纪初的 Oracle 和 SQL Server 等传统数据库到最近的 Hadoop 和使用 Databricks 和 Kafka 的实时分析,我一直在构建端到端的数据管理平台,我意识到,无论在哪里,问题陈述都是相同的,不幸的是,我们在构建数据平台的过程中犯的错误也是相同的。

因此,请继续阅读我认为在构建数据管理平台时我们应该避免的五大错误。请根据您的经验,在评论部分添加更多内容。

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

莎拉·基利安在 Unsplash 上的照片

通用框架?那不酷

有了各种各样新奇的技术,有时我们会忘乎所以地写尽可能多的代码。这确实很有趣,但是可操作场景的重点应该是构建配置,而不是编写复杂的 ETL 代码来获取和转换数据。避免每个配置有多个代码。事实上,为每个步骤创建两到三个通用代码框架,它们可以处理所有的配置。

这些框架的开发最初有时会耗费时间,但逐渐地,它将只是创建配置,从而减少交付时间。

数据质量不是我们的工作,我们只是提供数据…对吗?

是也不是,是的,数据平台最重要的工作就是提供数据。但是相信我,我在过去已经看到了这一点,如果您的系统中没有合适的数据质量,您的数据平台将像一个没有人会使用的垃圾箱一样好。现在,是的,我们不修复数据管理平台中的数据,指导原则应该是在源位置修复数据,但您必须对存储在您平台中的数据质量保持透明。评估数据的质量,使 DQ 问题在仪表板上透明,并建立一个与源的反馈循环来解决问题。是的,拥有它。

元数据管理—那是一只候鸟吗?

这是构建数据管理平台时最糟糕的事情之一——忽略元数据管理。请记住,您的数据将被不像 IT 团队那样了解技术的业务用户使用。所以如果你想让你的计划成为一个成功的故事,元数据是最重要的部分。企业应该能够访问数据目录,该目录不仅会告诉他们您的系统中有什么,还会解释特定项目的含义及其来源。功能和技术元数据应保持最高水平的准确性,以确保您的消费者在决策过程中使用您的数据平台。

咄!!业务会增加什么价值?这是一次 IT 交付

这是我见过的业务和 IT 团队都犯的错误。我们认为建立一个数据管理平台是一件 IT 事情,企业在这个过程中无法理解任何事情。但这是不对的。业务团队应该参与到构建数据平台过程的每一个步骤中,你所构建的一切都应该解决这样或那样的业务问题。为你交付的每样东西赋予商业价值,并确保企业有机会提问。相信我,我个人认为,在这个过程中,有时业务会提出一些问题,这些问题有助于增加平台交付的价值。此外,它有助于在过程的早期解决问题,而不是在用户验收测试中。

数据治理?真的吗?谁在乎呢。

数据治理不是一个人的工作。这不是找到一个人并把治理数据的所有任务交给他的过程。我们正处于一个数据管理的时代,我们需要从被动和孤立的方法转变为更加主动和协作的数据治理方法。在构建数据平台时,请确保已针对数据的重要性、所有权以及数据出现问题时的补救流程对数据进行了定义。数据治理不仅仅是关于数据质量问题和处理这些问题,它还涉及管理信息的各个方面,从而实现拥有端到端数据管理平台的最终目标。就我个人而言,当我处理构建数据管理平台时,我会将 DAMA 数据管理知识手册放在口袋里。看一看,它会值得你的时间和金钱。

结论

为您的数据平台构建强大的基础非常重要,以避免它在五年内成为遗产,并帮助企业使用您的数据平台进行数据驱动和明智的决策,以及信任来源于您平台的数据。元数据和质量应该是任何产品所有者构建数据平台的核心,而不是将这些项目推到待办事项的底部。

关于学习数据分析的五个误区

原文:https://towardsdatascience.com/five-myths-about-learning-data-analytics-37a43473e2bf?source=collection_archive---------35-----------------------

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

图片来源:https://pix abay . com/插图/独角兽-森林-童话-神秘-1981219/

我开始厌恶学校里的数学,最终我在一学期的代数课上得了个“D”。

所以,我最终会从事数据分析似乎有点疯狂,对吗?

真的不应该:认为你不能是因为你在学校不喜欢数学,这是我发现的关于学习分析的五个误区之一。它们都在这里:

误解 1:我需要为此去学校

数据分析是一个高度技术性的领域,所以你可能认为你需要一个学位或文凭。我也是,我的两个硕士学位证明了这一点。根据我在数据教育的学术和训练营/在线学习领域的经验:学习数据分析不需要学位。

事实上,你在传统学术机构接受的培训很可能已经过时了。你将会被那些对行业发展不感兴趣,而是对学术出版的回音室感兴趣的老师们所教导。

有许多经济高效的方法可以让你自己学习数据分析,更好的是,有远见的组织正在为你提供高质量的数据教育,作为他们提升技能计划的一部分(稍后将详细介绍)。虽然高价学位可能有它的用处,但我不建议你从那里开始你的分析学习之旅。

误区二:我不会喜欢,因为我不喜欢数学

我们中的许多人和我一样,在学校里都有过糟糕的数学学习经历。所以,你可能会说你“不喜欢数学”,但你真的不喜欢吗?数学绝对是分析的核心,但计算、技术和商业思维也是如此。

想象一下,在你的工作和生活中,将数学作为一种表达和创造的手段,而不仅仅是解决黑板上冰冷的方程式。这就是数据分析的作用。不要让你所谓的数学恐惧症阻碍你。

误解 3:我的工作不需要它

你可能对成为数据分析师或数据科学家不感兴趣,但你确实需要一些基础数据分析的能力,以保证你的职业生涯不会过时。

举个例子,我们来看看亚马逊的 Upskiling 2025 倡议。在新闻稿中列出的第一个头衔是数据映射专家和数据科学家,以及业务分析师和物流协调员等角色。

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

几乎所有这些角色都使用数据!对于一些人来说,“数据”甚至出现在标题中。对于其他人来说,数据隐含地为角色提供动力:例如物流协调员,预测和跟踪库存,以及流程改进经理,对任务和关系进行建模。

因此,虽然你不必渴望成为一名数据科学家来为未来的劳动力提供价值,但你确实需要一些数据分析方面的安慰。

误解 4:我只在工作中需要它

我希望我在神话 3 中说服了你,不管你的职业规划如何,你都应该学习一点数据分析。让我在这个流言的基础上。

数据分析不仅仅是技术或职业培训:如果做得好,学习数据分析将为你提供另一种接触世界的方式。

“数据素养”是一个流行的术语,但我不知道我们是否给予了它应有的重视:它通常被视为能够在工作中有效使用数据的素质。然而,我认为数据素养,像常规素养一样,始于享受享受数据。

随着您学习分析,您可能会发现自己构建了更多的电子表格来跟踪活动,然后分析这些数据。这可能是你的日常行走,或者你听过的歌曲。也许它们与工作无关,但它们也是有价值的数据分析学习项目。

误解 5:我不是合适的“类型”

计算机科学教授马克·古兹戴尔提到,许多学生觉得他们缺乏“极客基因:“在学习技术方面,要么你懂,要么你不懂……”,我不懂。”

数据分析是一个高度技术化的领域,因此冒名顶替综合症十分猖獗。你不时觉得自己是个毫无头绪的骗子。

想到有多少潜在的数据分析师因为觉得自己没有合适的社会经济、人口统计或教育背景而离开这个领域,我就不寒而栗。

我保证,如果你喜欢与计算机打交道,解决问题和改善业务,数据分析领域就有你的一席之地。作为一个社区,我们有责任通过你们的辛勤工作为你们指明道路。

事实:你可以学习数据分析

在您的数据分析学习之旅中,您克服了哪些误区?你还在面对哪些?如果你对学习感兴趣,你觉得是什么阻碍了你?请在评论中让我知道。

如果我能帮你开启旅程,请联系我。您可以通过注册我的时事通讯和独家免费访问我下面的学习分析资源库来开始。也欢迎您给我写信或在我的联系页面安排免费电话。

我期待重塑你对分析的态度!

原载于 2020 年 9 月 19 日【https://georgejmount.com】

五个漂亮的 Python 特性

原文:https://towardsdatascience.com/five-nifty-python-features-fbe1bc8d7e0b?source=collection_archive---------43-----------------------

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

照片由克莱门特·HUnsplash 上拍摄

除了编写使用最少空间和时间的代码,python 还提供了一些简单的约定,类似于粘滞键快捷方式。使用这些简单的程序证明了我们对语言的熟悉。当我们忙于解决不同的复杂问题时,很可能会错过这些技术。所以让我们来看看五个这样的特性,它们将对你的代码大有帮助。

  1. 连锁比较

我们经常会遇到这样的问题,我们讨论的是一系列的值,而不是一个大于或小于限制因子。虽然在纸上表现这一点很简单(例如一个

Example, boundary checks in DFS

2. 关键字:Yield

处理起来有点棘手,必须确保不要误用 yield 关键字。在编程中,当我们返回一个变量时,我们通常已经完成了对该变量的操作,不需要存储它的局部变量状态。但是,如果我们进一步使用该变量,使用 yield 关键字会很方便。进一步的执行从前面的 yield 语句开始。任何 python 表达式都可以使用 yield 语句转换成生成器。因为执行是从先前的状态恢复的,所以可以有把握地假设我们将有一个节省时间的解决方案。同样,内存分配也受到限制。然而,这些优化会使您的代码变得复杂,并可能使初学者难以理解,所以要小心。

3.基本打印语句的便捷结束参数

令人惊讶的是,我们经常忘记 python 在 print 语句中提供的方便的 end 参数。因为 print 语句添加了一个新行,所以当我们需要打印一个字符串时,我们会在打印之前将 print 语句的值连接成一个字符串。这给代码增加了几行额外的代码,这是我们在 c++中使用 cout 语句时不必担心的。一个巧妙的解决方案是使用 end 参数,该参数允许您精确地指定在打印语句之间选择什么表达式,甚至是空格。

4.关键词:全部和任意

Python 一直以提供灵活且用户友好的解决方案而闻名。因此,当我在 MySql 中遇到“In all”关键字时,我决心在 python 中找到一个对应的关键字。如果 iterable 中的所有项目(或者即使是空的)都为 true,All 关键字返回 True。它可以被认为是一个按顺序进行 AND 运算的表达式序列。这也意味着执行在第一次遇到 False 时停止。这对模拟 OR 操作的 ANY 关键字是有益的。

5.海象操作员

python 3.8 中引入的最显著的变化之一是,walrus 操作符本质上是一个赋值操作符。它有助于缩短代码,因为它允许您为一个甚至在 bool 条件下还不存在的变量赋值。因此,我们可以将这两个步骤压缩成一行,而不是用两个语句将值赋给变量,然后对变量应用条件。这类似于使用’+= '来将加法运算和更新变量按在一起。

与非数据科学家交流时的五个陷阱

原文:https://towardsdatascience.com/five-pitfalls-when-communicating-with-non-data-scientists-4ed4adf17ce3?source=collection_archive---------29-----------------------

与外行人交流你的工作和成果可能是一个挑战——这里有五点需要注意

对于许多数据科学家来说,编码和分析通常是容易的部分。当你必须向非数据科学家传达你的工作成果时,挑战就来了。在许多情况下,这些人是客户或顾客,或者他们在组织中占据优势地位。这意味着正确的沟通很重要。如果他们离开房间或者得出错误的结论,或者只是简单的困惑,你之前的所有工作都将付之东流。

任何关于你的工作或成果的交流都应该有三个目标:

  1. 确保对正在讨论的问题有共同的理解。
  2. 确保清楚理解分析揭示的问题,确保不夸大或过于复杂。
  3. 如果可能,确保对方法和结果的信心。

在我从事企业空间分析的这段时间里,我学到了一些应该避免的事情,以最大化你实现这三个目标的机会。

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

资料来源:unsplash.com

1.不要直接进入分析

通常假设参与讨论的每个人都已经清楚讨论的目的和要解决的问题,但通常这种共识并不存在。参与者通常没有背景,或者忘记了之前的讨论,或者从之前的讨论中得出不同的目的或目标。

在没有确保上下文和目标清晰的情况下直接开始分析可能会在讨论的后期导致各种问题。人们吸收内容的方式与他们如何将内容与目标联系起来密切相关。如果人们对目标或目的的理解不同,那么你分享的任何后续材料很可能会被不同的人以不同的方式吸收,造成混乱,并导致讨论时间的低效使用。

在一个小时的讨论中,我通常会在开始的十分钟左右简单地阐明背景和目标。我们为什么要讨论这个?我们试图解决什么具体问题?如果可能的话,试着用一句话陈述正在解决的问题,确保对此达成一致,如果可能的话,试着将这句话与之前的讨论联系起来,以确保在出现分歧时有可追溯性。通过确保事先澄清这一点,你就有能力在稍后话题偏离时让对话回到正轨。

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

资料来源:unsplash.com

2.不要太纠结于方法论和数据

如果我使用了对我的问题很有效的特定方法或数据源,这通常会让我很兴奋,我也很想告诉别人。但那是因为我是数据科学家。坦率地说,这些东西不太可能让非数据科学家兴奋,当你的观众想知道结果和什么时,不要浪费太多时间沉迷于方法或数据是很重要的。

将关于数据的讨论限制在绝对必要的范围内,以确保对您的方法有信心。对数据源的快速描述,提供一个机会让人们大声说出他们是否关心它,是所有必要的。如果数据存在已知问题,也可以陈述和承认这些问题,特别是如果您需要在以后共享结果时引用这些问题。但是尽可能简洁地做到这一点。一个好办法是在附录中引用更多的细节。就我个人而言,我非常喜欢使用附录。

说到方法论,如果你正在使用一个广为接受的方法,这就是你所需要说的。如果我不得不为这个问题设计一个定制的方法,我通常会更加详细。将描述保持在抽象的层次上,说明方法的核心逻辑,记住只坚持那些绝对必要的东西,以确保对方法的信心。

同样,如果你的方法有已知的弱点或限制,在以后的讨论中承认这些是绝对必要的。充分利用附录或脚注,避免在演示中使用非数据科学家无法理解的公式或代码。一些数据科学家认为展示代码让他们的工作看起来可信,但这是错误的。可信度来自于清晰地传达你的方法的逻辑。

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

资料来源:unsplash.com

3.不要夸大结果

数据科学家在有力的标题中夸大他们的结果是一种极其常见的行为。例如,写一个像“*一个更多元化的销售团队会表现得更好”*这样的标题确实能吸引注意力,让人们对你的结果感到兴奋——但这真的是真的吗?你是否建立了统计显著性并证明了合理的因果关系才能做出这种说法?是否可以更真实地表述为“在我们分析的销售团队中,我们发现表现更好的团队更加多样化”

重要的是不要在标题或总结中夸大你的工作结论。虽然想要在工作中产生兴奋和积极性是很诱人的,但重要的是要记住,标题和摘要是最有可能被你的观众吸收并当作真理带走的部分。你还需要确保你的工作经得起批评。如果对组织中不同部门的销售团队的另一项分析显示与多元化没有关系,如果你让上面的第一个陈述在你的组织中着火,你可能会看起来有点愚蠢。

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

资料来源:unsplash.com

4.不要在结果中给出太多细节

展示大量的统计数据并不一定会帮助你的观众相信你的结果——事实上,这可能会造成更多的混乱。我经常看到数据科学家展示一大张模型统计数据表,然后对它们进行陈述,而外行人根本不清楚这种陈述与所展示的统计数据有什么关系。当这种情况发生时,我听到的最常见的反应之一是*“我到底应该在这里看什么”?*

如果你要表达的观点与一个单一的统计数据或趋势相关,只需显示与该统计数据或趋势直接相关的数据,并尽可能以最直观的图形方式显示出来。这样做的目的是让外行人能够清楚地看到你的标题和页面上显示的内容之间的关系。避免复制粘贴大型数据表,读者必须指向重要的子集。如果你正在使用像 R MarkdownJupyter 这样的集成数据科学文档,一定要注意确保任何输出在显示之前都经过适当的过滤或绘制。

尝试区分对结论和后续行动绝对重要的结果和那些有趣但有点无关紧要的结果。我倾向于过滤掉后者,把它们移到附录中,或者用小字体或脚注引用它们。虽然一个结果可能会引起数据科学家的数学兴趣,但如果它没有实际的*‘那又怎样?’*,在讨论中不太可能有价值。将它放在附录中可以让感兴趣的人看到,而不需要浪费宝贵的讨论时间。

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

资料来源:unsplash.com

5.不要被迫进入一种交流模式

这些年来,我发现你使用的沟通方式对你的结果被吸收和理解有很大的影响。我学到的最大的一个教训是,不要仅仅因为其他人都是这样做的,或者因为这是预期的,就把事情放入幻灯片格式。对数据科学成果进行强有力的交流的一个最重要的方面是,读者可以很容易地跟上你的逻辑流程。将你的材料分成水平的幻灯片通常会使这变得更加困难。

如果你需要在你的交流中建立一个流畅的线性逻辑流程,读者可以很容易地从一个步骤进入下一个步骤,不要害怕垂直交流。有时,这可以像一个盒子笔记或 Word 文档一样简单,但将你的分析和叙述一起建立在一个集成的 R Markdown 文档或 Jupyter 笔记本中通常更有效。

我还发现竖排文档作为预读文档通常更有效。由于幻灯片是围绕演示者计划如何口头交流他们的工作而设计的,因此作为独立的文档阅读可能会效果不佳。通常,在实际讨论中,垂直预读可以非常有效地节省时间。

这些只是我学会要注意的一些事情,它们帮助我更自信地交流数据科学工作。多亏了这些,我现在发现我可以比刚开始从事数据科学时更有效地沟通。如果你有任何其他的技巧或诀窍,请在评论中分享。

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

你(可能)不知道的五个 Python 特性

原文:https://towardsdatascience.com/five-python-features-you-probably-didnt-know-d48faa0b892e?source=collection_archive---------3-----------------------

编写更优雅、更高效代码的简单步骤

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

照片由拉蒙·萨利内罗Unsplash 上拍摄

Python 大有可为。每周,我都会看到以我认为不可能的方式编写的代码。其中一些功能非常出色,我无法理解没有它们我是如何生活的——其他的功能知道了就好了。

本文将介绍其中一些不常用但仍然非常有用的功能,包括:

**Variable Assignments** - with *args and **kwargs (incl. dictionary merging)
**Frozensets** - what they are and why they're useful
**Multiple Conditionals** - cleaner logic
**Check if a Variable Exists** - in both local and global scopes
**Better than Lambdas** - writing Pythonic and functional one liners

变量赋值

就像 function *args 和**kwargs 一样,我们可以在变量赋值中使用相同的语法:

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

合并两本词典

合并字典时,使用 iterable 变量赋值方法特别有用,我们可以使用**kwargs 语法:

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

但是我们需要谨慎。如果两个字典之间有任何公共键,后面的键-值对(来自y)将替换前面的。

随着最新的Python(3.9)即将发布的版本,我们将获得一个全新的语法来解决这个问题——字典合并和更新操作符:

z = **x | y**  # merge - same behavior as above
**x |= y**  # update - in-place dictionary merge

冰冻集

在 Python 中,我们可以使用集合,集合是不同对象的无序集合。这些集合是可变的,这意味着我们可以用add()remove()来改变它们——这也意味着集合是不可改变的(稍后会详细介绍)。

或者,我们可以使用不可变的frozenset()——我们不能改变它的值。但是,因为它是不可变的,所以它是可散列的——当我们试图同时使用setfrozenset作为字典键时,就会显示这一点:

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

好吧,所以使用一个frozenset作为字典键并没有那么有用(如果有人有这样做的理由,请告诉我!).但是frozenset给我们的是更明确的、有意的代码。它警告未来的代码读者—

改变我,一切都会破碎

有读者指出不止一个,而是两个为此在推特上——感谢!

多重条件句

清理那些凌乱的 if 语句。而不是:

*if 0 <= x and x <= 1:
     print('value is %')*

我们可以写:

*if (0 <= x <= 1):
    print('value is %')*

更进一步,我们可以添加更多的条件语句,并用按位运算符将它们连接在一起,如下所示:

*if (0 <= x < 1) | (7 <= x < 8) | (x == 10):
    print('passed')*

检查变量是否存在

需要检查变量是否存在?

*if "var_name" in globals():
    print("var_name exists!")elif "var_name" in locals():
    print("var_name exists locally!")else:
    print("var_name does not exist.")*

我们可以分别使用globals()locals()来检查全局和局部范围内的变量。

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

检查变量 test1test2 是否存在于全局或局部范围内。

两个作用域函数globalslocals都返回字典——所以我们也实现了上面的字典合并语法{**x, **y}。然后我们的代码在这个合并的范围字典中检查test1test2

比兰姆达斯好

将 lambdas 用于快速简单的一行程序非常常见,但我很少看到它用于构建多参数函数。我们通常看到的是这样的:

*do_something = lambda x: x**2 / (1 - x)*

但是它们可以用来创建优雅的一行程序函数:

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

使用 lambda 函数创建一个包含 Cochran 公式的单行样本量计算器。

在我们开始到处编写 lambdas 之前,请注意这可能是 Python 中最讨厌的语法用法之一——所以让我们快速回顾一下。

PEP 8—Python 的风格指南—强烈反对使用 lambda 作为命名函数*。***

与此同时,单行函数,尤其是数学公式,可能看起来很神奇。

因此,我们不使用lambda,而是编写一行def语句,如下所示:

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

使用单行 def 语句创建带有 Cochran 公式的样本大小计算器。

你用哪种方法由你决定。如果你想让愤怒的暴徒拿着干草叉呼喊你的名字,使用lambda——否则,使用def

这是我们五个非常有用的 Python 特性—

*****Variable Assignments**
**Frozensets**
**Multiple Conditionals**
**Check if a Variable Exists**
**Better than Lambdas*****

我希望其中一些对你来说是新的,对你和对我一样有帮助。如果你想了解更多内容,我在 YouTube 上发布了 Python 视频!或者,如果你有任何问题,请随时通过 Twitter 或在下面的评论中联系我们。

感谢阅读!

有兴趣了解更多关于 Python 的知识吗?

关于 Python 中的 API,你需要知道的一切,或者 Python 中的高级正则表达式,怎么样?

*** [## 用 Python 升级你的正则表达式游戏

Python 中使用正则表达式的高级文本操作

towardsdatascience.com](/step-up-your-regex-game-in-python-1ec20c5d65f)***

五个 Python 陷阱!

原文:https://towardsdatascience.com/five-python-gotchas-3073145fe083?source=collection_archive---------54-----------------------

当你最不期待的时候会期待什么!

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

照片由像素

许多贴子都列出了 Python 和/或其最流行的包的“陷阱”。这篇博客是该系列的又一篇文章,但有一点不同:我自己实际上也确实犯过这些错误(其中一些错误的发生频率令人尴尬)。然而,只要知道每个经典 Python 对象的定义和类型,就可以帮助您在工作中避免大多数(如果不是全部)这样的错误!

事不宜迟,我们开始吧。

1.Truthy 还是 Falsy: NumPy.nan 和 Pandas.nan

您可能知道,要检查一个对象的值是真还是假,您可以像下面这样做:

lst = [1, 2, 3]
a = None# rather than this ...
if len(lst) > 0 or a is not None: print('success')# you can simply do this ...
if lst or not a: print('success')

这是因为空列表(以及所有其他空序列/集合)、FalseNone、0(任何数值类型)的计算结果都为 False。这组对象和值因此被称为“ falsy ”。

考虑下面的例子:您有一个项目及其成本的字典,您用它来构建一些分析的数据框架。

import pandas as pdd1 = {'item': ['foo', 'bar', 'baz'], 'cost': [100, None, 20]}
df = pd.DataFrame(d1)
# lots of analysis here ...# if an item has a cost, print the item and its cost
for i, r in df.iterrows():
    if r['cost']:
        print(f"item = {r['item']} and cost = {r['cost']}")

您期望:

item = foo, cost = 100.0
item = baz, cost = 20.0

但是你会得到:

item = foo, cost = 100.0
item = bar, cost = nan
item = baz, cost = 20.0

原因是熊猫认为None失踪或不在,因此用nan代表。由于nan不是虚假的,它流过。

乍一看,这似乎违反直觉,但是nan s 是丢失的值,如果丢失了什么,您并不真正知道它是什么。例如,数字列中给定的nan可以代表 100(真)或 0(假)吗?如果是字符串,是’ hello’ (truthy)还是空字符串(你猜对了,是 falsy)?熊猫不确定,所以它不会假设是假的。

小心避免考虑nan falsy。

2.是 NaN == NaN?

考虑下面的例子:

>>> s1 = {True, 1, 1.0}
>>> s1
{True}

这是意料之中的,因为我们知道1==1.0==True的计算结果为真。

现在来看看这个案例:

>>> s2 = {float('nan'), float('nan'), float('nan')}
>>> s2
{nan, nan, nan}

考虑前面例子中的逻辑:因为nan是一个缺失值,所以不可能知道三个缺失值是否相同。因此,nan == nan的计算结果始终为 False。(如果您想了解更多相关信息,请务必查看 PEP 754 — IEEE 754 浮点特殊值。)

3.所有和任何

我认为anyall的工作方式如下:如果你有一个可迭代的,如果可迭代的任何元素为真,那么any将返回真。如果 iterable 的所有元素都为真,那么all将返回真。

所以,让我们来看看。第一,any:

>>> any([0, None, False])  # expected False
False
>>> any([0, None, False, 'False'])  # expected True
True
>>> any([float('nan'), 0])  # expected True
True
>>> any([])  # expected False
False

到目前为止,一切顺利!让我们检查一下all:

>>> all((1, 0, 0))  # expected False
False
>>> all([float('nan'), 1])  # expected True
True
>>> all([])  # expected False
True

我认为所有的元素都应该是真的,空的列表显然是假的。那么为什么all([])评估为真呢?

答案在 Python 文档(我的强调是附加的):

**all** ( 可迭代 )

如果 iterable 的所有元素都为真(或者 iterable 为空),则返回True

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

但这是为什么呢?嗯,长话短说,是因为空洞的真相。“如果我有七英尺高,我也是万亿超级英雄”对我来说永远是真的。我还差大约 6 英寸(忽略我同事的任何相反的证词),所以不管逗号后面是什么,该语句都是真的。这是一个永远不会错的说法因为我没有七英尺高,因此不可能评价我的万亿富翁超级英雄身份。

除了更仔细地阅读文档之外,记住all()这种行为的最好方法是不要认为它是“如果 iterable 的所有元素都为真”,而是“如果 iterable 中没有 false 元素”当 iterable 为空时,其中不能有 false 元素,这意味着all([])的计算结果为 True。

4.可变默认参数

我认为这是目前为止最常见的 Python“gotcha”。我们开始吧。

考虑以下函数:

def foo(a, a_list=[]):
    a_list.append(a)
    return a_list

让我们使用这个函数foo来创建两个单独的列表:

>>> my_list = foo(10)
>>> print(my_list)  # expected [10]
[10]>>> another_list = foo(20)
>>> print(another_list)  # expected [20][10, 20]

您可能希望每个函数调用都创建一个新的列表,但是在第一次调用foo时创建的列表会在每个后续调用中使用。

发生这种情况是因为,在 Python 中,只有当函数被定义时,默认参数才会被计算,而不是每次函数被调用时(你可以在 Python 的文档中了解更多)。如果我们使用一个可变的默认参数(比如foo中的a_list=[])并在函数中改变它,那么每当调用函数时,这个对象就会发生变化。****

避免这种混乱的最好方法是在函数中使用不可变的默认参数。下面是foo的相应更新版本:

def foo_v2(a, a_list=None):
    if a_list is None:
        a_list = []
    a_list.append(a)
    return a_list

这个foo的定义假设每次调用都有一个新的列表是可取的。但是,在某些情况下,您可能希望有意传递一个可变对象。一种这样的情况是在编写递归函数时,这需要从一个调用到下一个调用保存对象的状态。深度优先搜索(DFS) 算法的以下实现是这种情况的一个例子:

def dfs(graph, node):
    """dfs from a given node"""
    return _dfs(graph, node, [])def _dfs(graph, node, path)
    """interior utility function"""
    path += [node]
    for neighbor in graph[node]:
        if neighbor not in path:
            path = _dfs(graph, neighbor, path)
    return path>>> graph = {'A': ['B', 'C'], 'B': ['D', 'E'], 'C': ['G'], 
         'D': ['F'], 'E': [], 'F': [], 'G': []}
>>> print(dfs(graph, 'A'))  # give the path starting from node 'A'
['A', 'B', 'D', 'F', 'E', 'C', 'G']

5.迭代时修改列表

我已经在我的小食谱帖子中讨论了这最后一个“陷阱”,但是因为我亲眼看到一些人落入这个陷阱,所以我也在这里提一下。

假设您想从列表中删除所有小于 5 的数字。

**错误实现:迭代时移除元素!

nums = [1, 2, 3, 5, 6, 7, 0, 1]
for ind, n in enumerate(nums):
    if n < 5:
        del(nums[ind])# expected: nums = [5, 6, 7]
>>> nums
[2, 5, 6, 7, 1]

正确实施:

使用列表理解创建一个新列表,只包含您想要的元素:

>>> id(nums)  # before modification 
2090656472968
>>> nums = [n for n in nums if n >= 5]
>>> nums
[5, 6, 7]
>>> id(nums)  # after modification
2090656444296

上面可以看到[id](https://docs.python.org/3/library/functions.html#id)(nums)是前后勾选的,说明其实两个列表是不一样的。因此,如果在其他地方使用该列表,并且改变现有列表很重要,而不是创建一个同名的新列表,则将它分配给切片:

>>> nums = [1, 2, 3, 5, 6, 7, 0, 1]
>>> id(nums)  # before modification 
2090656472008
>>> nums[:] = [n for n in nums if n >= 5]
>>> id(nums)  # after modification
2090656472008

我希望这篇博客对你有用。我可以在TwitterLinkedIn上联系到我,我欢迎任何反馈。

数据库内数据挖掘的五个理由

原文:https://towardsdatascience.com/five-reasons-for-in-database-data-mining-84e9cf8e084a?source=collection_archive---------22-----------------------

Db2 仓库数据挖掘

利用关系数据库引擎实现集成的模式发现和预测建模解决方案

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

亚历山大·佩罗托Unsplash 上拍摄的照片

数据挖掘可以定义为一套方法、流程和技术,用于发现相关信息(通常隐藏在大量数据中),并将其应用和集成到业务运营中,以提高绩效和支持决策制定。

本文的目的是将关系数据库系统作为部署数据挖掘工作负载的合适平台,包括建模和评分操作。由于其在信息管理、可伸缩性、可扩展性和性能方面的独特能力,关系数据库提供了一个集成的环境,在这个环境中,数据和算法为了业务的利益而共存。

数据挖掘上下文

上面的数据挖掘定义由三部分组成,必须正确限定。

首先,相关信息的非平凡发现意味着模式、趋势和相关性的检测,这些模式、趋势和相关性不能通过传统的查询技术暴露,或者因为这些事实上是不适当的,或者对于问题的复杂性是非常低效的。相比之下,数据挖掘提供了来自人工智能(机器学习)和多元分析等学科的方法来解决这类问题。这些方法基于统计上稳健的算法,可以对结构化和半结构化数据集中的复杂关系进行建模,涉及不同的变量类型、高分散水平,并且不需要对底层数据分布进行假设。数据挖掘建模方法通常分为监督学习(分类、回归、时间序列预测)和非监督学习(聚类、关联规则检测、序列模式发现)。

其次,信息发现需要方法论。为了定义必须解决的问题、业务环境和所需的分析框架,它是必需的。该框架涵盖了将被纳入分析的变量或特征,以及准备步骤和建模任务的顺序,直至找到并应用有效的解决方案( 1)。这种方法被转化为一套流程,包括数据集的初始鉴定和准备,一个或多个知识提取模型的开发、组装和验证,以及最后,也是最重要的,将准备-建模流部署到生产中,并对其进行持续监控和重新校准。与在其他环境中一样,这些流程是使用执行它们的几个底层 IT 服务来实现的。

最后但同样重要的是,提取信息的主要目标是提高业务绩效。首先,展示新的知识和见解,以支持战略计划和战术决策。然后,通过应用分析模型并将结果集成到信息和事务流程中,将这些知识部署到业务运营中。

业务焦点、方法论和面向服务的实现使数据挖掘成为核心业务分析专业化,而不仅仅是一堆数学技术和算法。

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

图 1 —数据挖掘解决方案工作流程

数据挖掘的技术方法:历史回顾

在过去的十年中,数据挖掘的应用领域和潜在用户的数量已经大大增加。过去被认为是高技能统计从业人员的受限领域,现在已经发展成为业务应用的一部分,涉及数据工程师、开发人员和最终用户。这一步在一定程度上是可能的,因为技术的发展促进了建模技术的使用和应用,并使之自动化。方法的形式化和标准化也有所贡献,但不如技术增强了嵌入数据挖掘的新一代分析应用程序那样决定性,使商业用户能够解决复杂的问题并利用新的机会。

从工具的角度来看,直到 90 年代中期,数据挖掘建模主要是通过编程语言在逐个案例的基础上开发的,尽管一些统计软件包和专用库的存在有助于促进这项工作。然后,市场上出现了一套配备有复杂的终端用户图形界面的数据挖掘工作台。SAS Enterprise Miner、IBM Intelligent Miner、Angoss KnowledgeStudio 或 ISL 克莱曼婷(后来被 SPSS 收购,现在是 SPSS Modeler,IBM Analytics 组合的一部分)等解决方案提供了数据挖掘可视化设计方法,具有数据库连接、数据准备、脚本扩展和模型可视化的扩展功能。尽管这些应用程序大多以独立模式运行,但供应商通常提供客户机-服务器架构来提高可伸缩性、并发性和性能。从某种意义上说,很大一部分新的数据挖掘实践者再次接受了纯编码方法,而没有考虑专用建模环境在易用性、生产率和可维护性方面可以提供的好处,这确实令人惊讶。

虽然基于工作台的方法包括数据转换、模型训练、测试和重新校准的能力,但它仍然需要建模概念的深厚知识,因此需要专业人员。此外,模型管理在许多解决方案中都是特定于供应商的,因此是专有的。将数据挖掘功能集成到业务应用层非常具有挑战性,这主要是由于缺乏灵活、标准化和易于使用的模型格式和编程接口。尽管与生产者无关的评分平台的出现有助于模型推理和部署,但完全集成的数据挖掘解决方案的开发对于这类应用程序来说仍然是一个问题,特别是对于与模型创建和内省有关的一切。模型生命周期管理中缺乏自动化功能是当前广泛使用编程库的原因,这些编程库大多基于 Python 或 Scala,通常由 Apache Spark 或 Hadoop 等分布式计算框架支持。

另一方面,在 21 世纪中期,以数据为中心的数据挖掘方法进入了市场。与其他数据库内分析产品一样,我们的想法是将数据挖掘工作尽可能集中到核心数据所在的位置。

数据库内分析计划起源于 90 年代中期,当时 Sybase、IBM、Oracle 或 Teradata 等提供商为他们的关系数据库系统配备了面向对象的扩展。这些扩展允许创建用户定义的类型和方法,因此数据库引擎中复杂数据结构的定义和操作成为可能。此外,在存储过程和函数中包含 C 语言以及后来的 Java 例程的能力扩展了 SQL 过程语言的能力,因此在数据库中实现丰富的业务逻辑不再是一种限制。此时,地理空间、图像、音频或内容管理扩展开始成为后续数据库版本的一部分。

数据库内数据挖掘基于这个数据库扩展范围。其思想是利用数据库平台的功能和资源来支持和公开数据挖掘功能,最重要的是,使业务应用程序能够嵌入数据挖掘,使其更容易被开发人员访问,并最终被业务用户访问。

目前,为了实现具有模式发现和预测建模能力的集成解决方案,数据库内数据挖掘是一条成熟的途径。像 Vertica(Vertica Analytics Platform)[1]、Teradata (Teradata Vantage) [2]、Pivotal (Greenplum Database) [3]、Oracle (Oracle Data Mining) [4]或 IBM (IBM Db2 Warehouse) [5]这样的数据仓库供应商多年来一直在发布他们的数据库内数据挖掘扩展,无论是以软件平台、设备还是公共或私有云平台上的数据仓库即服务产品(DWaaS)的形式。

在当前环境中,基于解耦微服务的软件架构决定了开发最佳实践,混合云环境在编排不断变化的组件时需要更大的灵活性,在数据库中放置数据挖掘功能的真正好处是什么?与其他方法相比,数据库内数据挖掘的关键点是什么?

这里列出了当数据库被认为是实现企业数据挖掘计划的目标环境时,给予数据库竞争优势的五个原因。列表是有编号的,但排序不代表相关性;这只是一种将每个主题暴露在它的前辈之上的正式方式。

1.将算法和计算引入数据,提高性能和可扩展性

几十年来,关系数据库系统一直是业务系统的核心,随着业务系统的发展,技术也在发展。它们已被证明是 OLTP ( 在线事务处理)应用程序的最佳选择,在这些应用程序中,数据可用性和一致性是必需的;对于 OLAP ( 在线分析处理)场景,复杂和动态聚合的可伸缩性和查询性能是关键因素。此外,关系数据库为 CRM ( 客户关系管理)和 MDM ( 主数据管理)解决方案提供了主要的持久性选项。这意味着大多数客户行为和社会人口统计数据——业务分析应用程序的燃料——本地驻留在关系存储库中。

但是关系数据库不仅仅是强大的数据存储。这是一个可以部署数据密集型应用程序的环境,这些应用程序是批处理、实时或事件驱动的。当然,数据挖掘是一个数据密集型过程。

在数据库中实现应用程序的机制是通过例程。数据库例程是封装了可以使用 SQL 调用的编程逻辑的对象。与其他编程方法一样,例程简化了代码重用、标准化和维护。例程可以是内置的,因此它们随数据库一起提供,用于各种支持任务,或者由用户创建以扩展 SQL 语言。除了封装访问控制等其他好处之外,数据库例程还提高了应用程序性能和 SQL 执行。这在构建具有大型训练集的数据挖掘模型时尤其重要。

建模意味着大量的数据库交互,因为数据必须在每个训练时期重复提取。如果数据挖掘算法作为数据库客户端运行,此过程将涉及多个远程 SQL 语句,进而会创建许多发送和接收网络操作。这导致了高水平的网络流量以及相关的增加的处理器成本。如果训练算法过程被实现为在数据库中执行的例程,则所有这些 SQL 语句,包括那些写入结果表的语句,都被封装到单个发送和接收操作中。因此,最小化了网络流量,提高了训练性能。

此外,例程中的 SQL 语句通常比从客户端应用程序发出的语句提供更好的性能。这是因为例程在与数据库相同的进程中执行,利用共享内存进行通信。如果例程实现静态 SQL(在数据挖掘任务中会接触预定义表中的数据),则访问计划将在预编译时生成,从而不会产生运行时开销,性能也会更好。

从功能的角度来看,数据库例程可以分为存储过程、函数和方法。存储过程是可以通过执行 CALL 或 EXEC 语句来调用的编译程序。它可以有输入、输出和输入输出参数,还可以执行各种 SQL 语句和程序逻辑。存储过程也可以返回多个结果集。函数提供了一种扩展和定制 SQL 功能的方法。与存储过程不同,函数是在 SQL 语句中调用的,例如 SELECT 或 VALUES 表达式或 FROM 子句。根据结果类型的不同,函数可以是标量(返回单个值)、列(聚合一组输入值的标量结果)、行(返回单个行)或表(将表返回到在 FROM 子句中引用它的 SELECT 语句)。最后,使用方法来定义用户定义类型的行为,这与其他面向对象的方法非常相似。

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

表 1 —不同数据库提供商的建模能力

从实现的角度来看,数据库例程逻辑可以完全由 SQL 语句组成,也可以由外部编程语言代码组成。在前一种情况下,使用 SQL 过程语言扩展来实现例程逻辑,这些扩展通常因提供者而异(Sybase Transact-SQL、IBM SQL PL、Oracle PL/SQL、PostgreSQL PL/pgSQL 等)。).这些扩展带来了变量和条件处理程序声明、控制结构、错误管理等语句。

外部例程可以用许多编程语言编写,如 C/C++、Java、.NET 或者 Python。在任何情况下,代码都驻留在数据库之外,但是在同一个服务器中。在执行时,这些例程可以在与数据库管理器相同的进程中运行,从而提供很好的性能。它们极大地扩展了可以在 SQL 例程中实现的逻辑复杂性。例如,它们可以与文件系统交互,执行 HTTP 请求或发送电子邮件通知。虽然 SQL 例程在性能、安全性和可伸缩性方面提供了最好的选择,但是 C/C++例程通常是可比较的,此外还提供了更丰富的编程能力。

外部例程通常是在数据库中实现建模算法的最佳选择。特别是,外部存储过程最适合培训操作,因为它们的执行和调用方式(对程序的调用语句)是模型构建任务中所期望的。此外,模型构建通常涉及创建新的数据结构和插入或修改现有数据;函数中既不期望也不支持这种操作,它总是 SELECT 或其他数据操作语句的一部分。从这个意义上说,存储过程也比函数为 SQL 过程元素提供了更广泛的支持。相反,函数通常是评分操作的首选,因为这些函数自然适合 SELECT 语句。

用于建模操作的外部存储过程的好处可以总结如下:

  • 训练封装。模型训练逻辑由几个数据库查询、中间计算处理以及结果持久化和返回组成,非常适合存储过程;繁重的 SQL 处理在数据库内部执行,只有最终结果返回给调用者。
  • 复杂逻辑实现。支持嵌套和递归过程调用。开发人员可以利用面向对象或函数式编程范式,用他们觉得舒服的语言编写代码。存储过程、函数、类型和变量可以以实现建模和评分功能的模块形式打包在一起。
  • 外部动作支持。这在几个场景中特别有用,比如外部评分平台中自动模型部署的 API 调用,或者相反,从文件系统中的模型导入操作。
  • 集成持久化。外部存储过程支持几乎所有的 SQL 语句。不仅允许数据操作和修改操作,还允许静态和动态 SQL 形式的数据定义语句。例如,可以通过存储过程算法创建和删除持久表或临时表,以便进行中间计算。
  • 逻辑专门化。如果训练运行中涉及的查询的数量和复杂性非常高,可以拆分实现逻辑以提高性能。SQL 和外部例程可以互操作。繁重的准备查询可以转移到 SQL 例程中,这对于这些任务更有效,因为它是由数据库服务器本机执行的。外部过程实现了建模逻辑,编排了可以交换结果集或通过临时表进行通信的其余组件。
  • 便携性。作为外部例程实现的建模任务在不同操作系统上的数据库环境之间高度可移植,甚至在不同的提供者之间也是如此;由于编程逻辑存储在一个编译过的库中,它可以很容易地被共享,并适合在另一个引擎中工作。

为了实现这些功能,可以在内部开发例程,或者通过利用来自数据库提供商的专用内置数据挖掘模块来实现例程。当然,混合方法是可能的,也是推荐的,因此开箱即用的功能是定制的,并适应自己的环境。表 1 总结了不同数据库内数据挖掘提供者的主要建模能力;这个想法并不是要详述所有提供的算法,而是要表明所有这些算法都很好地支持不同的描述、转换和建模任务。不幸的是,但并不奇怪的是,在数据库内建模和评分活动的标准化方面没有统一的产品;几乎所有的提供商都采用专有的、因而是供应商锁定的方法。然而,这并不意味着缺乏这方面的努力。

总标题为信息技术—数据库语言— SQL 多媒体和应用程序包(SQL/MM) 的 ISO/IEC 13249 是一个国际标准,它定义了一组特定于应用程序的数据类型、表结构和相关例程的模块。这一规范背后的动机是支持在数据库中存储和操作多种内容类型,如图像、文本和空间数据,为 ANSI SQL 标准提供扩展。在这个方向上,并于 2002 年首次发布,SQL/MM Part 6:Data Mining[6]涵盖了数据挖掘用户定义类型及其相关例程。它以 SQL API 的形式为数据挖掘算法定义了一个标准化的接口,该接口可以放在关系数据库的顶层。目标是基于物理和逻辑规范、数据挖掘模型、挖掘运行设置和模型结果等元素来存储、管理和检索信息。

尽管该规范在功能和支持的模型方面非常丰富,但是这种规范的成功显然是有限的。在商业或开源产品中实现这些接口的惟一提供商是 IBM,它拥有 Db2 Intelligent Miner 建模和评分扩展器。但是,IBM 在 Db2 11.1 中反对这一功能,转而在 Db2 Warehouse 11.5 中采用专有方法。

在模型表示上已经达成了更多的共识,至少最初是这样。目前在版本 4.4 (2019)中,预测模型标记语言(PMML) [7]是统计和数据挖掘模型定义的事实上的标准。基于 XML,PMML 支持生产者和消费者应用程序之间的模型传输。数据挖掘集团(DMG),开发标准的联盟,声称它得到了大约 30 个提供商的支持。尽管不同的编程框架以包和库的形式提供了扩展,但事实上,PMML 在过去几年里已经失去了一些吸引力。这是由于新算法和扩展的定义缺乏灵活性,因此模型生产者和评分引擎之间的互操作性有时会受到限制。

为了解决这些限制,DMG 在 2015 年发布了可移植分析格式(PFA) [8],这是一种补充的基于 JSON 的格式,更类似于编程语言。PFA 通过组合基于类型系统、控制结构和大量原始函数库的构建块来定义模型。通过这种方式,可以很容易地组装新的算法流水线,而不需要像 PMML 那样被任何规范所接受。PFA 还很年轻,但正在获得关注。它非常适合通用应用,尤其是与更专注的开放标准(如 MLeap、ONNX 或 NNEF)相比。

在当前的数据库环境中,所有的提供者都实现了模型定义的专有格式。此外,只有 Greenplum、Oracle 和 IBM 提供了某种内置支持来导出或导入 PMML 模型,但在最近的版本中,它们正在失去模型幅度。任何数据库提供商都不支持 PFA。

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

图 2—IBM Db2 仓库中的集群管道和相关数据对象

作为内置数据挖掘扩展如何在数据库中工作的一个例子,图 2 展示了一个构建在 IBM Db2 仓库中的建模管道。在这个实现中,数据挖掘框架由一个模块(SYIBMADM)组成。IDAX),它包含一组变量、条件、函数和分析存储过程。这些例程由一组四个存储模型元数据的目录表支持。

这些建模步骤基于葡萄酒数据集[9]部署了一个简单的聚类场景,这是化学计量学领域的一个众所周知的例子,经常用于机器学习以测试和展示不同的算法。该数据集包含属于三个不同品种的几种葡萄酒中存在的 13 种成分的化学分析结果。除了建立模型,pipeline 还有一个评分(预测)步骤:目标是分析聚类和品种之间的映射。

清单 1 根据所使用的存储过程、其功能和所需的参数详细描述了流程的每个步骤(步骤 2 是虚构的,只是为了完整起见:葡萄酒数据集不包含缺失值)。

清单 1 —在 IBM Db2 仓库中使用分析存储过程实现集群管道

一旦构建了模型(步骤 6 ),它就被注册到目录表中。这些表包含不同的元数据,涵盖模型定义、超参数、特征属性和相关组件。这些组件是作为训练运行的结果而构建的表,它们取决于生成的模型的类型。在 K-means 聚类模型的情况下,创建并填充以下表:

  • 型号。一个单行表,包含有关聚类模型的信息,如模型类、比较类型或比较度量。
  • 集群。模型中存在的每个分类对应一行,提供分类的名称和说明(此字段可以编辑)、大小或同质性等信息。
  • 。提供关于模型签名的详细信息,每个输入要素占一行。它可以包含模型内部衍生的特征的附加行。
  • 栏目统计。每个分类和特征一行:模式、均值、方差、最小值、最大值、重要性等。
  • 栏目分布。每个要素边界的频率和附加测量值以及每个聚类中的值。

简而言之,模型洞察可以通过查询和报告工具或交互式仪表板以关系格式使用。最后,最后一步以 PMML 格式导出模型,以便在数据库内部或外部进一步利用。

2.利用内置的数据库引擎功能完成数据挖掘任务

从模型构建的角度来看,数据挖掘不仅仅是基于复杂的算法执行训练运行。组织、访问和操作数据的方式是确保良好性能和可伸缩性的关键,尤其是在处理数十亿条记录时。

以下是对关系数据库系统的一些功能的快速回顾,尤其是那些涉及如何优化训练数据的访问和检索,以及如何构建和管理数据挖掘模型的功能。

数据分区和表组织策略

数据库无共享架构已经存在多年,通过提供更高的处理能力和存储资源来确保系统的性能和容量。向外扩展是通过向现有集群添加新的逻辑或物理分区来实现的。在多分区数据库中,一个表可以放在多个分区中,因此它的行沿着集群的成员分布。这样,每个分区都由自己的资源、数据、索引、配置文件等组成。

通过分散表行,分区数据库提供了扩展的并行能力,尤其是对于数据检索。除了分区内并行(单个 SQL 查询被细分为多个部分,可以在单个分区内并行运行)之外,分区间并行还意味着将一个查询分解到多个分区,并行度由现有数据库分区的数量决定。可以同时透明地使用分区内和分区间并行,从而大幅提高查询的处理速度。在处理星型模式形式的大数据集时,这一点尤为突出,在星型模式中,事实表通常有数十亿行,并且有许多维度表,因此有大量的连接操作。

图 3 显示了一个呼叫详细记录(CDR)事实表,该表以三级模式组织。在第一级中,使用调用 ID 将行分布在三个数据库分区中。在这种情况下,这个分布键确保记录在所有三个分区中平均分配,因此在数据访问期间没有人会空闲。然后,在每个数据库分区中,表已经按定义的范围进行了分区,在本例中使用的是 call month。每个范围位于不同的存储对象中,一旦有了新数据,就可以很容易地分离和附加新的范围。最后,表数据沿着一个或多个维度被组织成块(在这个例子中是 call hour)。从全球来看,这种组织模式支持展现出高水平可伸缩性和性能的数据库设计。在任何情况下,重要的是要认识到跨多个分区和节点处理数据会带来一些开销,因此必须在数据量和性能之间进行权衡。

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

图 3 —三级数据组织

此外,一些数据库引擎支持按列组织的表。在这种情况下,表数据页包含压缩的列数据而不是行数据,因此 I/O 只在作为查询一部分的列上执行。基于这种表的分析工作负载速度快了几个数量级,节省了存储空间,并且不再需要索引、物化视图、范围分区和耗时的数据库调优。

从数据挖掘的角度来看,这些表分区和组织策略意味着在数据访问和计算时间方面训练任务的加速。实现充分利用这些特性的算法的例程是基于分割-应用-组合策略的。它们运行一个主进程,发出几个并行请求,每个请求读取一部分训练数据,并计算各自的统计聚合和度量。在下一次训练迭代之前,所有这些部分结果最终被全局地收集和聚集。此外,几个例程总是可以利用查询间的并行性,并且可以同时执行。

分区功能还支持大容量、高速、并行的数据评分,为实时和批处理操作提供更好的并发支持。

联盟

基本上,联邦系统提供了数据虚拟化功能。这意味着单个 SQL 语句(读和写)可以收集分布在几个数据源中的数据,每个数据源来自不同的供应商。例如,通过一次选择,可以连接 Informix 表、MySQL 表、HDFS 拼花文件和 Excel 表中的数据,就像数据存储在本地的单个数据库中一样。从数据挖掘的角度来看,这可以简化建模和评分的数据访问,避免可能代价高昂的整合任务。它还促进了对不同和异构数据技术的组合访问,为关系和非关系数据源提供了连接器(包装器)。这使得在组装不同的数据片段以构建训练集和验证集时更容易。

提供这些功能的数据库引擎维护一个联邦系统目录,其中包含联邦数据库中的对象和统计信息。当提交一个查询时,SQL 编译器使用这个信息来开发一个最佳的访问计划,将查询分解成片段,然后下推到每个数据源。因此,每个片段都可以本地运行,并且结果可以被组合和呈现。此外,大多数联邦系统支持带有远程对象的缓存和物化查询表,从而提高了查询的性能并封装了一部分逻辑。远程数据源的联邦存储过程通常也受支持。

联邦数据库的好处不仅对数据库内数据挖掘部署可见,而且对任何利用数据库作为存储库的方法都可见,尤其是那些实现 SQL 推回的方法。

工作量管理

在数据库环境中,工作负载管理指的是监视和控制系统中活动工作的能力。这意味着可以将不同的工作负载分成不同的类别,使数据库服务器适应同一系统上不同的用户和应用程序需求。管理活动通常从定义不同的执行组和子组开始,在这些执行组和子组中可以分配数据库资源,以及确定如何允许工作在其上运行的阈值。这些资源包括 CPU 限制、最大执行时间、内存访问优先级、并发控制或运行活动的最大并行度。执行组定义通常还指定将为统计事件监视器收集的数据种类。

第二步是将数据库活动分类为工作负载,然后将工作负载映射到执行组。可以根据连接属性(如用户 ID、用户角色或应用程序名称)或活动类型属性来定义工作负载。例如,可以将不同子组中的数据定义和操作活动分开,将特定的密集只读查询与其他查询分开,或者隔离某些存储过程调用。图 4 展示了如何在数据仓库环境中处理和监控不同的工作负载类型。

工作负载管理是运营企业业务分析环境的关键要素。将数据库中的数据挖掘工作负载分配给特定的执行子组有几个好处。例如:

  • **区分开发和测试环境。**可以基于不同的模式在同一个数据库上放置几个沙箱。然后,每个模式中的活动可以关联到一个单独的执行组。
  • 隔离建模相关活动。例程的执行可以与所有其他针对数据库的读写活动区别对待。此外,繁重的培训任务可能需要特定的专用资源。
  • 在模型训练期间控制和监控资源。将不同工作负载中的请求集分开的原因之一是为了控制和监视,即使每个工作负载最终都指向同一个执行组。此外,还可以管理在特定地址空间中可以运行多少个并发训练任务,从而限制每个任务的执行时间。
  • 对特定应用的评分请求进行优先级排序。可以调整专用执行组的规模,以满足来自事务性应用程序的实时评分请求,并根据内存和并发限制提供特定资源。
  • 基于历史数据捕获的容量规划。数据混合和建模活动中的资源消耗的工作负载趋势可以在很长一段时间内建立。然后,可以根据这种分析预测未来的需求并确定数据库容量的大小。

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

图 4 —数据仓库环境中基于独立子组的工作负载管理

备份和恢复

数据库备份背后的想法很简单:通过制作当前数据的副本并将其存储在不同的介质中来预测数据库可能出现的故障,以便在系统启动并再次运行时可以恢复它。备份通常可以在数据库、数据库分区或表空间级别完成,在后一种情况下只覆盖特定的表。此外,无论数据库在线还是离线,都可以进行备份。该过程也可以自动化,因此数据库管理员可以根据不同的方法来确定是否需要执行备份。

从数据挖掘的角度来看,数据库备份意味着处理模型目录表。这些表可以放在一个专用的表空间中(这是推荐的),因此可以使用特定的策略单独维护它们。在任何情况下,它们都将是系统计划的一部分,可能有不同的时间表,因此不需要为数据挖掘模型提供单独的备份和恢复机制。

除了全球灾难恢复策略,包括 HADR ( 高可用性&灾难恢复),一些有趣的场景可以通过简单的备份功能来实现。其中之一是带有版本恢复的快照控制。在这种情况下,可以使用以前通过备份操作创建的映像将表空间恢复到以前的版本。如果一组模型是以循环和计划模式生成的,并且需要恢复以前的版本(例如,出于审计或质量控制的目的),那么可以将它们放在专用表空间中的单独的表中,在生成新的一批模型之前进行备份和恢复操作。

访问控制

身份验证和授权是两种常见的数据库操作。第一种通常委托给外部设备,比如操作系统或 LDAP 服务器,但是授权是数据库管理器固有的。授权包括检查哪些数据库操作可以被执行,哪些对象可以被经过身份验证的用户访问。对于与数据挖掘相关的操作,在用户或组级别定义授权权限在以下情况下会很有用:

  • 限制访问训练和评分数据。可以在表和视图级别授予读取权限,以及其他数据操作权限。该权限通常不仅包括 SQL SELECT 语句,还包括从数据库导出数据的实用程序。管理员可以控制可以挖掘的数据。
  • 授权谁可以训练、测试和应用模型。执行权限涉及对数据库例程的操作,包括函数、方法和存储过程。由于培训、测试和评分操作是通过例程实现的,因此管理员可以定义能够启动这些任务的建模人员和开发人员组。这种限制能力不仅在安全性方面很重要,而且对于保持对数据库工作负载的控制也很重要。
  • 控制谁可以操纵现有的模型。模型目录表也可以保护。这包括谁可以导出和导入模型,以及谁可以删除、更新和读取模型。结合执行特权,可以实现不同的安全场景。例如,一组用户可能有查询目录进行模型自检的权限,但没有执行评分操作的权限。

一流的数据库系统提供行和列访问控制(RCAC),这是对表特权模型的补充。在数据保护方面,RCAC 提供了两个可以结合在一起的优势。首先,可以根据一些预定义的条件,限制用户只能访问记录的一个子集。这意味着不满足这种条件的记录在数据检索中会被忽略。第二,可以在列级别屏蔽数据。除非得到允许,否则列掩码会隐藏返回给用户或应用程序的数据。因此,不仅可以限制谁可以访问指定的列,还可以限制通过哪些例程进行访问。RCAC 促进了复杂业务规则的实施,定义了哪些特定数据集可以被访问、由谁访问以及使用哪些建模和评分例程。它还支持对模型目录的细粒度访问控制的定义。

还可以列举其他功能。例如,可以使用开箱即用的功能以及基于统一数据库日志记录子系统的审计任务来实施培训和评分运行的日常活动监控和执行计划。同样重要的是,所有这些都可以使用一个通用统一的 SQL 管理界面以编程方式进行管理。

3.利用混合数据管理功能进行数据访问和模型自省

一个现代的关系数据库系统应该遵循 NoSQL 模型,但是 NoSQL 站在这里不仅仅是为了 SQL。这意味着该系统为多语言持久性提供了一个混合的单一环境,结合了表格关系模型和其他灵活的模式方法,如键值、文档、列或图形存储。这包括管理除 SQL 之外的其他查询语言,还包括扩展它以支持 XML (SQL:2006 修订版)、JSON (SQL:2016 修订版)或 RDF 三元组等数据类型。

提供 XML 和 JSON 原生数据类型的第一个优势是能够使用半结构化数据源进行数据挖掘模型开发和评分。

存储在 XML 列中的数据可以通过使用 XQuery、SQL 或两者的组合来检索。SQL/XML 提供了发布功能,使 XQuery 表达式能够在 SQL 上下文中执行,因此需要数据关系视图的过程和应用程序可以在 XML 文档中进行查询。同样,XML 数据可以被分组或聚合,XML 文档可以与其他文档或关系数据连接,支持在它们之上定义视图。存储在 XML 列中的 XML 文档的特定部分可以被索引,从而提高查询的性能和效率。此外,SQL 优化器可以利用在 XML 数据和索引上收集的统计信息,在评估针对 XML 和关系数据嵌入 XQuery 的 SQL、XQuery 和 SQL/XML 函数时,生成高效的执行计划。

清单 2 —结合了关系数据和 JSON 数据的 SQL 视图(下图)

作为一种轻量级的数据交换格式,JSON 与语言无关且可移植,是 XML 的替代物,用于半结构化数据。它消除了对预定模式设计的需要,不那么冗长,并且减少了对数据转换的需要。与 XML 一样,数据库可以提供 NoSQL(基于面向 JSON 的查询语言)和 SQL 方法。对于 SQL 访问,JSON 文档通常可以以原始格式或二进制编码格式(BSON)存储在列中,这提供了更快的文档遍历。SQL/JSON 路径表达式可以用来定义对 JSON 文档元素的访问,并发布它们,例如,以 SQL 视图的形式(清单 2 )。此外,可以创建基于表达式的索引来帮助查询更好地执行。

除了支持半结构化数据的处理,这些数据类型的支持还为模型分析和内省提供了出色的能力。当使用基于 SQL 的可视化和报告工具来展示 PMML 模型中存在的洞察力时(清单 3 ),或者当作为数据提取和转换工作的一部分,将它的内容分解到关系表的列中时(例如,一个集群模型的不同分区的统计数据),这尤其有用。

从这个意义上说,创建或导入到数据库中的 PMML 模型可以直接存储在 XML 中或作为 BLOB 数据类型存储。在第一种情况下,模型以其固有的层次结构格式存储在一个表中,通常与其他关系数据放在一起。根据数据库引擎和模型的大小,如果模型很小(通常小于 32 KB),它可以直接驻留在基表行中,也可以驻留在单独的存储对象中。如果模型适合表页的大小,读写语句的性能通常会提高,因为需要的 I/O 操作更少。在这两种情况下,如果数据库提供数据行压缩,启用它将提高 I/O 效率并减少存储空间需求。

在 BLOB 的情况下,由于模型压缩,二进制格式也提供了减小的大小。它也是独立于代码页的,因此可以将模型转移到用不同代码集定义的数据库中。然而,PMML 模型是序列化存储的,所以推荐这种方法主要用于模型归档。在任何情况下,总是可以通过在查询时解析二进制对象来检索 PMML 内容。

清单 3 — SQL SELECT 从 PMML 模型中提取关联规则

以类似的方式,可以利用数据库的 JSON 功能来存储和查询 PFA 模型。一个有趣的特性是模型格式转换。提供原生 XML 类型的关系数据库引擎通常提供 XLST 支持,因此可以在 PMML 模型上实现和自动化转换,包括发布到其他格式,如 JSON 或 HTML。由于 PFA 通过组合函数库中的原语来定义模型,所以任何 PMML 模型都可以转换成 PFA(反过来并不总是可能的,尤其是对于那些还不是 PMML 标准一部分的模型类型)。在这种情况下,通过在单个 SELECT 语句中应用 XLS 样式表,可以将 PMML 模型转换为 PFA。

关于 RDF 数据集的最后一句话。一些数据库引擎有能力在关系表之上支持它们,包含关于 RDF 存储的数据和元数据:三元组、图、谓词、统计数据等。以三元组的形式建模关系使得由节点和边组成的复杂图形能够存储在数据库中,并使用 RDF 查询语言(如 SPARQL)进行检索。这种表示和 SPARQL 提供的全套分析查询操作使 RDF 成为一种有趣的格式,可以存储和分析由数据挖掘模型提取的关联规则和序列模式。

4.部署多个独家评分方案

一旦对数据挖掘模型进行了训练和测试,下一步也是最重要的一步就是将它部署到生产环境中,这样就可以通过对新的业务数据进行评分来应用它。值得注意的是,评分环境和支持数据库可以不同于建模环境。它也可以是分析性的、操作性的,甚至是混合工作负载。事实上,预测模型有望支持和增强持续的业务运营,因此 OLTP 应用程序环境将是最常见的环境。OLAP 解决方案还将受益于评分操作的自动化,因此结果可以直接集成到报告和仪表板中。

清单 4—Oracle 数据库中的 SQL 触发器,用于在客户资料发生变化时对记录进行评分

操作数据挖掘模型需要一些重要的考虑因素:

  • 模型格式标准化。生产环境必须支持不同类型的模型和来自不同供应商的模型。应建立统一且独立于供应商的评分机制。PMML 和 PFA 应该是当前标准化的选择。
  • 管道脱钩。模型所应用的数据在开发和生产中可能是不同的。这不仅适用于数据记录属性的位置和格式,也适用于在输入模型之前对这些记录进行的转换。即使对于生产环境,也必须支持不同的记录格式,因此必须有一个适配器来调整数据。
  • 不同的分数内容。在一个或另一个场景中,评分有效载荷也可以不同。例如,当在开发环境中应用集群模型时,用户可能对获得不同集群 id 的质量和置信度感兴趣。但是,在生产中,唯一关心的可能是最佳集群 ID。有效负载的持久性需求(如果需要的话)可能也会不同。
  • 封装。模型的重新校准,以及模型的替换,应该从开发到生产都是透明的,至少当模型的签名没有改变时是这样,即使底层的算法改变了。这意味着调用模型的语句不需要修改。

在数据库中部署数据挖掘模型提供了几种评分方案。这两者之间的选择将基于应用的实时要求,但也基于数据的易失性,因此,应该多长时间重新计算一次分数。

  1. 持续批量评分。该模型应用于表的全部或部分记录。INSERT INTO SELECT 语句用于将评分有效负载(或其一部分)存储在结果表中,以供进一步处理和分析。当必须对大量记录进行评分,并在以后连续访问结果时,这种场景非常有趣。批量评分可以按需执行,也可以以脚本的形式部署到数据库调度程序,因此可以定期运行。
  2. 带视图批量评分。在这种情况下,创建的视图在其定义中包含评分函数。每次对视图执行 SELECT 语句时,都会重新计算得分,但只针对那些属于查询一部分的记录。除了优雅之外,这种方法非常有效,因为一旦模型的数据发生变化,检索到的分数总是最新的。
  3. 持续触发得分。触发器定义了一组响应特定表上的 SQL 操作(如插入、更新或删除)而执行的操作。此外,触发器定义有一个激活时间,它指定触发器应该在 SQL 操作之前还是之后激活。触发器可以包含 SQL 过程语言语句,包括存储过程调用,以及类似插入或更新其他表的辅助操作。它们是在数据库中放置和实施业务逻辑的元素。例如,可以在 INSERT 或 UPDATE 触发器的定义中调用模型,因此每次在表中插入或更新记录时,都会重新计算分数(或者分数,如果应用了多个模型),并保存在结果表中(清单 4 )。这也是一个非常有效的场景,因为一旦底层记录发生变化,分数就会自动更新。由于评分规则和逻辑现在都在数据库中,因此不需要在每个业务应用程序中对评分过程进行编程。这种基于触发的方法能够实现例如相对便宜的营销活动,因为不需要专门的软件,所以总拥有成本很低。图 5 是一个例子:每次注册一个新客户,或者当一个现有的客户信息改变时,customer 表中的一个触发器将被触发,根据倾向模型对客户档案进行评分。结果得分存储在一个表中,另一个触发器将检查购买倾向是否高于预定义的或动态的阈值。如果是这种情况,数据库程序将向客户发送一封带有特殊报价的电子邮件,并通知客户代表。
  4. 实时评分。要评分的记录尚未永久保存在数据库中。它是由外部应用程序生成的,必须实时将分数返回给 It 部门,以支持业务决策(例如,根据当前购物篮数据和倾向模型提供或不提供折扣券)。在这种情况下,scoring 函数将像往常一样通过 SELECT 语句调用,但是它应该接受作为参数传递的记录值,而不是从数据库表中读取它们。

一些数据库引擎提供了保留的内存缓存,模型可以在其中更快地存储和执行:一旦模型在缓存中,加载和解析阶段就已经完成,并且可以在任何后续的评分任务中跳过。这对于提高实时评分场景的性能特别有用,在实时评分场景中,多个模型实例可以服务于不同的并发评分请求。

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

图 5 —基于触发的营销

场景 1 和 2 在 OLAP 环境中更常见,而场景 3 和 4 在 OLTP 应用中更常见。在第二种情况下,必须特别采取一些预防措施。OLTP 应用程序通常至关重要,因为它们支持业务运营。基于触发的评分会影响数据库系统的性能和吞吐量。触发器是 SQL 事务的一部分,这意味着当触发器触发时,事务尚未完成,数据库锁仍然存在。此外,如果触发器由于任何原因失败,将回滚整个事务。触发过载事务;必须考虑这种影响,并通过工作负载管理保护数据库资源。

5.将数据挖掘操作与数据供应和多维分析结合起来

数据挖掘操作化不仅包括推理任务,其中经验证的模型被部署到生产环境中进行评分和持续监控。它应该处理完整的装配线,正如它在图 1 中的工作流程所示。尽管操作化不一定意味着自动化,但是模型工厂中的干预越少,与公司信息交付过程的集成就越多。

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

图 6—ELT 管道中的数据挖掘建模任务

事实上,自动化在一些涉及监督学习算法的场景中是可行的,但在一些非监督模型中也是可行的。描述性技术,如关联规则或序列模式发现,非常适合可以在数据操作作业中集成和调度的循环任务的思想。但是对于某些特定的聚类模型模板来说也是如此,其中的重点是描述而不是发现。

零售行业,特别是杂货店,提供了这种数据挖掘建模集成的好例子。图 6 表示 ELT ( 提取、加载和转换)场景,具有三个规范部分:源系统、数据暂存区和表示层(数据集市)。这里的目标是在三个级别上集成细分&产品相似性模式。挑战不仅仅是通过对日常基础数据流建模来提取和发布新信息,而是要将这些洞察反馈到该流中,并丰富现有的业务维度。其工作原理如下:

  1. 数据提取。数据从公司和外部来源提取,并放入暂存区(为简单起见,未显示中间存储对象)。这些来源包括交易数据库、运营 CRM 系统、社会人口统计面板,甚至来自社交网络和呼叫中心中的交互的用户满意度数据。所有这些信息都在数据库一级进行处理和转换;符合的维度和事实根据现有的业务维护策略进行更新。
  2. 数据聚合。从这些一致的结构中派生出三个数据聚合:购物篮、客户和商店。该等合计乃于特定日期期间计算。它们总结了表示销售相关信息的不同指标,如每个部分或另一个产品层次结构级别中的相对支出和规范化的相对支出。图 7 表示初始星型模式和三个派生聚合。
  3. 聚类。对于每个聚集级别,建立分割模型以便检测感兴趣的集群。我们的目标不是寻找小的利基市场,而是寻找具有一定时间稳定性和一致性的更广泛的群体。同样,重点是描述不同类型的行为,以及客户和商店如何在它们之间跳跃;特定的业务发现分段可以并行发生。为了提高自动化程度并加快流程,另一种方法可能包括以更低的频率重新校准集群模型。在这种情况下,将进行评分操作,而不是在每个聚合期间结束时构建模型。
  4. 尺寸富集。集群映射信息被反馈到相应的一致结构中。“客户”和“商店”维度现在将有一个额外的层次结构,支持通过群集标识符进行明细导航。普通维度数据刷新和集群分配将具有不同的时间范围。因此,集群属性将使用某种类型的 SCD ( 缓慢变化的维度)策略进行管理。
  5. 产品亲和力。同时,对于每个聚集级别中的每个聚类,建立关联规则模型以提取产品相似性。产品分类可用于检测跨级别关联。对于客户级别,也可以实现顺序模式模型。这里的动机是提供一个分析框架,在这个框架中,可以在不同的业务级别上检测亲缘关系。此外,通过利用适当的数据分层来避免可能的辛普森悖论副作用。
  6. 数据展示。一旦更新了维度,交易销售数据集市(以及所有其他覆盖不同业务流程的数据集市)就会发布更新后的数据,供最终用户使用。
  7. 篮子分析模型。类似地,来自关联规则建模的发现也被转移到呈现区域。在这种情况下,实现了一个市场篮分析数据集市。它将共享大部分相同的维度,但有一些必要的专门化:为了正确地分析规则,角色扮演项目集维度将取代 Product。此外,为了适应不同层次的分析,应该有几个事实表。除了货币权重信息,这些事实表将主要包含绝对频率计数,因此其他指标,如支持度、信心、提升等。,可以通过聚合导出。

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

图 7 —零售销售星形模式(左),具有三个聚合级别,用于进一步细分(右)

这个例子可以很容易地扩展到包括额外的技术。例如,可以实施时间序列建模来增强产品相似性分析,并提供支持、信心和提升预测。

这个案例很好地展示了 ELT、数据挖掘和多维建模如何集成到同一个场景中。此外,它说明了高级建模技术如何完全嵌入到常规数据流中:只是它们的结果以成员属性和业务度量的形式直接暴露给最终用户。

这种集成的基础是关系数据库。通过利用 SQL API 进行数据挖掘操作,可以自动执行 ELT 管道中的所有相关任务,而不依赖于外部系统,并具有数据库服务器在可伸缩性、可靠性和数据管理能力方面提供的所有优势。

结论

应该有另外的第六个原因来完成这个论述,这很简单:关系数据库系统是分析师工具箱中构建和集成数据挖掘操作的宝贵资源。在许多业务场景中,应该始终考虑这一选项。这是一个将算法带到企业数据所在位置的问题。

在当今时代,人们痴迷于用超过五年的时间重新命名和改造每一项技术和学科,很快就会有人说这是边缘计算。我们会看到的。

一般参考

[1] Vertica Systems,用于预测分析的机器学习,Vertica Analytics Platform Version 版文档

[2] Teradata 公司,机器学习引擎解析函数参考,Teradata Vantage 文档发布号 1.1,8.10

[3] Pivotal Software,Inc .使用 MADlib 的机器学习和深度学习,Greenplum Database 版文档

[4]甲骨文公司,甲骨文数据挖掘用户指南,甲骨文数据库 19c 帮助中心

[5] IBM 公司,分析存储过程,Db2 仓库 11.5 知识中心

[6] ISO/IEC JTC 1/SC 32 数据管理和交换,ISO/IEC 13249–6:2006 信息技术|数据库语言| SQL 多媒体和应用程序包|第 6 部分:数据挖掘,国际标准化组织

[7]数据挖掘组, PMML 4.4 通用结构,PMML 标准

[8]数据挖掘组, PFA 0.8.1 规范,用于分析的可移植格式

[9] Forina,m .等人,葡萄酒数据集,UCI 机器学习知识库

你的 DNA 分析可能不准确的五个原因

原文:https://towardsdatascience.com/five-reasons-to-be-skeptical-of-genetic-tests-621ea4bbad4a?source=collection_archive---------25-----------------------

基因测试结果现在可以在你的智能手机上获得。你应该相信他们吗?

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

在本年度最具戏剧性的科学故事中,一名中国科学家因违反道德准则而遭到公开的严厉批评。他一直在编辑三个未出生胚胎的基因,以消除它们感染艾滋病毒的风险。由于担心与“设计婴儿”的联系,科学界迅速谴责实验,科学家最终被判入狱。

然而,实验并没有在开始前就停止,孩子们最终在真实的人类家庭中完成了第一次人工基因复制和粘贴。仅在过去一年,遗传学的发展吸引了生物技术的数十亿美元,随着数百个应用程序将复杂的基因科学转化为令人愉悦的信息图表,智能手机领域取得了进展。今年,超过 25 个美国人中就有一个进行了 DNA 分析,科学家们现在可以预测 10,000 多种疾病的遗传风险,并启动了第一批编辑人类 DNA 以改善“精确健康”的项目。

虽然消费者似乎对发送他们的 DNA 以窥视他们的遗传祖先没有任何问题,但新的遗传产品系列已经迅速超越了从派对噱头到科幻小说困境的界限。面对根据我们的“改进”理念改变基因的真实能力,许多人担心富人和有权势的人会自己囤积基因进步,而其他人则推动车库科学家可以获得的“基因黑客”的地下文化。如果有机会,美国人更愿意忽略这种令人不安的可能性,当有趣的“发现你自己”伪科学可以帮助弥合差距时,这尤其容易做到。今年推出了数千种产品,向提供关于顾客内心活动的独特预测,只需支付几百美元并永久保存他们的 DNA。应用程序的推出是为了预测你的智力、力量和“超级英雄”潜力,帮助你找到合适的室友、护肤品和理想的饮食(包括哪种大麻),甚至优先考虑你未出生的孩子应该考虑哪些运动。

许多科学家认为,通过这些应用程序做出的预测和建议是基于糟糕的科学捷径,受到涌入该行业的数十亿美元的刺激。但同样真实的是,即使在一个越来越以 STEM 术语来看待的世界,我们也不知道基因到底是如何控制人类发展的。以下是你应该对下一份 DNA 报告持怀疑态度的五大理由:

DNA 数据库不完整且不准确

关于人类健康的声明只有在数据支持下才有效。大多数对人类的科学建议来自相关性而不是因果关系,这严重限制了人们对未来健康的预测能力。目前,主要的 DNA 数据库缺乏必要的规模,人类样本的多样性,以及产生一致结论的纵向范围。目前,每个消费者基因公司会对一个人的祖先、某些疾病的风险和特征预测给出稍微不同的预测。例如,通过将一个人的 DNA 与“纯英国人”的历史线索进行比较,血统分析不起作用——“英国人”的 DNA 是从那些在特定地区生活了好几代的人身上估算出来的。

作为一个恰当的例子,即使在美国也是最广泛使用的基因组数据库之一,英国生物库,包含来自欧洲血统的 95%的样本,使得由此产生的测试和研究对于亚洲、非洲裔美国人、中东和拉丁美洲人口来说明显不太准确。随着医生在做出相应的健康建议时越来越依赖这些“风险评分”,数据库必须得到改善。

DNA 不是编程代码

医学科学家和消费者遗传学家都使用已发表的研究,将某些基因与身体的生物发展相关联。术语“多基因风险评分”被引入来表示我们根据大量基因的存在而发展出某种特征的可能性,从心脏病到智力。这种方法依赖于将人类发展的问题简化为电线和计算机编程的问题,最大限度地减少必须在体内“开启”行动的生物开关的神秘组合。DNA 不是特征和行为的主动原因,而是生物体潜力的来源——在被系统的其余部分激活之前,它本身什么也不做。

一个简化的“风险分数”掩盖了几个必要的行为,包括许多无关基因的产物,使行为成为可能。不管遗传密码是怎么写的,一个微小的改变都会破坏正常的过程。正如科学作家肯·理查森写的,“基因当然是至关重要的,但是几乎所有的基因变异都是以你可以改变你从 A 到 B 的旅程的方式来处理的:通过构建替代路线。”

风险分数依赖于对环境的低估

人类的特征和行为,包括那些导致一些人痴迷于监测不断扩大的健康指标仪表板的特征和行为,是由遗传潜力和环境反馈的微妙结合形成的。例如,工业革命带来的环境变化比基因变化更快地刺激了整个人口的变化。荷兰男性现在是世界上最高的人,在过去的 150 年里,他们的平均身高增加了大约 8 英寸。虽然对于个子较高的荷兰人来说,似乎确实有一些自然选择的影响,但环境因素,如 T2 的饮食和生活方式在更大程度上起了作用。在许多情况下,环境变化对健康结果的影响要比遗传潜力大得多,这使得教育或身高的“风险分数”成为一种昂贵的误导。

数百万个数据点确保错误的发现

随着数以百万计的数据点在统计操作下被分析,存在数以百万计的假阳性机会,这是一个困扰严重依赖“大数据”方法的领域的问题。大型数据库可能包含许多无意义的相关性,而无效的假设可能会夸大统计意义。

最臭名昭著的例子之一来自一项寻找大脑活动各种变化的神经科学实验。这一惊人之举是,科学家们决定包括一条 4 磅重的大西洋鲑鱼,在扫描时,这条鲑鱼“T8”已经死亡最终,在过期三文鱼的 8000 个测试点中,有 16 个报告了具有统计显著性的反应。随着带有黑盒统计脚本的超级计算机越来越多地进行自动计算,在造成一连串的误用之前,这样的错误将更难发现。

人类特征太复杂,难以定义

坚实的医学科学很好地定义和描绘了许多人类特征和疾病。众所周知,安吉丽娜·朱莉在发现她的 DNA 与乳腺癌风险增加有关后,接受了预防性乳房切除术。其中一些疾病,如癌症或精神分裂症,有明确可靠的生物标记,但成千上万的其他疾病的起源仍然是神秘的。例如,虽然身高被认为是高度由基因决定的,但目前只有 20%的身高可以由基因预测。更复杂的特征,比如同性恋,甚至社会孤立范围从到只有 1-11%的可预测性。

被誉为基因预测胜利的成果之一是一项旨在预测一个人未来教育成就水平的分析。为什么受过高等教育的家族执着于复制他们自己的遗传物质仍然是一个永恒的循环。然而,虽然基因图谱被发现是未来成功的一部分,但许多基因得分高的人从高中辍学,许多得分低的人继续获得博士学位,表明,实际上,这些预测几乎不比随机猜测好多少。

显而易见的风险是,我们依赖这些光滑的基因仪表板,最终根据劣质的相关性科学对我们的基因进行评级。当然,动物王国遭受了人类科技进步的第一波冲击。当老鼠在实验室里接受实验的时候,养牛业已经应用前沿知识很多年了。随着积极的基因选择到位,与标准育种技术相比,农民们最终将牛奶产量提高了一倍。然而,在这些产奶皇后中,“脱靶效应”已经开始以其他方式破坏健康:它们的生育能力更低,免疫系统更弱。想象一下,当他们被告知他们不会生病时,他们会是什么感觉——他们是超级奶牛种族的一部分,由人类承担,没有自然的限制。

学习项目监控 R 的五个理由

原文:https://towardsdatascience.com/five-reasons-to-learn-r-for-project-monitoring-95991e3efb55?source=collection_archive---------53-----------------------

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

杰夫·谢尔登在 Unsplash 上的照片

监控是项目成功的重要组成部分。它包括查看所收集数据的质量,确定数据收集中的差距,并创建月度报告以显示计划的状况。对于任何监督数据管理组件的人来说,总是存在使用什么软件的问题。难题在于选择一个机构负担得起的、多功能的(统计分析与可视化)工具,并且需要较少的技术知识/编码来操作。事实上,找到一个满足所有这些要求的软件并不容易。

在我的实践中,我观察了各种工具,我发现 R 对项目监控非常有帮助。它可以完美地处理数据管理领域的常规任务,例如合并数据集、控制数据质量、更新缺失数据、根据项目需求对数据进行切片/子集化,以及创建月度报告。本文后面提供了一个具体的仪表板示例。

当然,您可以使用 R 做其他高级的事情,包括交互式仪表板、全面的统计分析以及开发您自己的功能或程序。然而,事实是你不需要每天都使用这种技能。你知道如何做的简单事情可以让你在工作中更有效率——最终,简单的事情会让我们的生活变得轻松愉快。

合并数据集

r 支持各种类型的数据格式,如 spss、sas、txt、excel 和 csv。许多机构正在使用 google sheets 进行数据存储和收集。google sheets 中的数据可以在几秒钟内加载到 R 环境中。

这里有一个具体的例子:

一个项目有四个不同的项目:教育、健康、职业培训和家庭倡导。每个项目都收集受益人案例、日期和所提供服务的详细信息。受益人可以同时参加几个项目。每个受益人收到他或她自己的唯一 ID。在加入特定项目之前,有一个独立的单位完成接收(人口统计)并决定申请人加入的项目。由于数据来自不同的地方,您的任务是将它们组合成一个数据集。数据是用谷歌工作表存储的。

下面是如何使用 r 来实现它。

首先,转到工作表中的文件部分,单击发布并复制链接。这个链接会用来上传数据到 r,需要注意的是,你要把这个链接保密,不要和任何人分享;否则,数据可能会被第三方访问。

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

将数据加载到 R 环境后,返回到 sheets,并单击 stop publishing。这将使链接无效。我的 R 代码有四个链接,因为我有四个不同的源代码要合并成一个。我使用 rbind 函数将项目数据组合成一个数据集,因为它们具有相同的列(ID、Case、Program、Date、ServiceID)。完成这一步后,我可以将其与受益人的人口统计数据合并。在您决定合并文件之前,请仔细研究您的数据结构,并决定哪种方法是最好的。r 还允许完全连接、左连接或右连接。

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

合并文件要采取的步骤:

数据质量控制

好的数据有助于我们做出正确的决定。因此,对作为项目一部分收集的数据进行定期检查非常重要。由于数据收集是一个涉及多方的复杂过程,最常见的错误发生在数据输入阶段。通常,您必须处理缺失或不准确的数据。幸运的是,你总是可以接触到目标群体,并且总是有机会获得正确的数据并更新你的记录。

这是另一个例子:

对于大多数项目,您总是可以找到方法来识别数据集中的可疑内容。该计划可适用于一定年龄、收入和住房状况的人。在这种情况下,你可以寻找数据或筛选年龄小于 18 岁且收入高的受益人。记住这一点,我将使用它来查找数据集中不符合这些标准的案例。我还将检查其他变量是否有缺失数据。该代码将包含以下变量:性别、种族、收入、家庭人数和年龄。任务是识别受益人身上缺失或可疑的价值。下面是用 r 写的代码。

这让我得到了有缺失/可疑数据的受益人名单:

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

更新缺失数据

在识别丢失的值之后,下一步是更新。上面的 R 代码帮助我找到了有问题的案例,现在我可以修复这个问题了。种族的缺失值是亚洲人,因为性别是男性,年龄 9 必须替换为 19,收入 77723 应该是 17723,家庭 0 和 11 必须替换为 1。下面的代码说明了处理这些问题的步骤。

这是我的输出:

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

切片/分组数据

监控中的另一个常见任务是使用频率或交叉表对数据进行分组。您可能希望深入了解正在收集的数据,并以稍微不同的方式对其进行分组。根据收入情况,许多社区服务机构都有资格成为项目受益人。要了解谁有资格享受哪种类型的服务,你需要查看联邦贫困指导方针(T2 和 FPG)。为此,你需要有三条信息:收入、家庭人数和 FPG 表。在 R 的帮助下将数据分组后,您可以使用 crosstab 函数生成一个漂亮的表格,显示您的程序家庭所处的位置。下面提供了一个示例和代码。还可以补充。csv 函数在这段代码的末尾。这将把您的表格保存为 csv 文件,可以很容易地与团队的其他成员共享。

这是我的输出:

月度监控报告

月度报告对于理解项目的整体发展是非常有用的。如果您监督您的项目管理团队的每月更新,您应该考虑开发一个报告项目进展的 statics 仪表板。在我的例子中,我使用了四个图表:

  1. 登记的受益人人数
  2. 性别代表性
  3. 提供的服务
  4. 按天数提供的服务数量

现在,让我们把一切联系起来。一旦你找到了加载、清理和创建图表的方法,你就可以在你的月度报告中使用相同的代码。唯一需要改变的是代码中的日期。需要几个小时完成的工作将变成 15 分钟的工作。下面是一个可以用 r 生成的仪表板的例子。

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

下面的代码显示了如何用 ggpolt2 制作圆环图:

下面是使用 ggplot2 创建堆积条形图的代码:

这就是如何用 ggplot2 创建棒棒糖图:

这是使用 ggplot2 创建日历的方法:

现在,将这四个图表合并到一个仪表板中。

简而言之,R 可以成为非常有用的项目监控软件。上面的例子演示了您可以尝试完成各种任务的方法。由于每个项目本质上都是独一无二的,您可以进一步试验 R 来研究它在处理任何与数据相关的任务时是如何有用的。

数据科学训练营不会教的五项技能(这会让你被录用!)

原文:https://towardsdatascience.com/five-skills-they-dont-teach-at-data-science-bootcamp-that-will-get-you-hired-9023e5428b8e?source=collection_archive---------64-----------------------

获得第一份工作的缺失环节是什么?

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

蒂姆·高在 Unsplash 上拍摄的照片

众所周知,训练营不能让你为数据科学领域的工作做好充分准备。我在 Udacity、Udemy、Coursera、EdX 和 General Assembly 上分享了我的数据科学课程/训练营/mooc,我可以证明,没有面试官说过,“我在你的简历上看到你参加了数据科学训练营,你被录用了。”事实上,我的面试官从来没有提到过我的在线课程和训练营的教育背景。

事实是,数据科学训练营并不是你在数据科学领域获得第一份工作的灵丹妙药。它们通常被宣传为一种神奇的解决方案,如果你花 4 个月的时间参加这个项目,你会学到获得第一份工作所需的一切。事实上,训练营更像是发射台。他们是向数据科学职业过渡的良好开端。

根据我作为数据科学家的个人经验,并询问我在行业中的同事,我们看到大多数申请人在申请他们的第一份数据科学工作时缺乏的五项技能。

中间 SQL

您可能会指出,您已经从课程中了解了 SQL。这就是为什么我说中级 SQL。所有的数据科学课程都会涉及 SQL,但他们不会花时间去深入研究 SQL。记住你 80%的时间会花在数据争论上。SQL 是那 80%的一部分,知道如何写好 SQL 会节省你很多时间。

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

图片来自 Pixabay

SQL 为什么这么重要?在您的课程中,您的数据以 csv 文件的形式提供给您。在生产中,您的数据存在于数据库中。了解如何针对多个表编写高效的 SQL 查询将允许您提取自己的数据。

“从表格中选择”是你缺乏经验的信号。

使用生产数据库时,表可能有数十亿行和数百列。SELECT *是一种锁定数据库资源的快速方法。如果您绝对需要做 SELECT *,请包含一个 limit 子句,以便可以实际检索和显示结果。

您还应该知道如何以及何时使用窗口函数、自连接和交叉连接。在处理十亿行数据库时,了解它们将决定代码的成败。

导航云

在数据科学训练营中,你可以在本地笔记本电脑上做任何事情。在野外,一切都托管在云中。在 AWS、微软 Azure 和谷歌云上浏览公司的云基础设施是你在任何技术工作中首先要做的事情之一。

但是了解云技术如何让我被雇佣呢?职位描述有时不会明确地说 AWS。相反,他们引用云上的服务和技术,如“EMR”和“SageMaker”。

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

数据科学家职位描述

在上面的职位描述中,我们看到他们招聘 BigQuery 经验丰富的员工。BigQuery 是 Google Cloud 的无服务器数据仓库(没错,你用 SQL 查询)。由此,你可能会认为他们的服务是托管在谷歌云上的,你在这方面的任何经验都会自动让你比下一个候选人更有竞争力。

野外的数据科学

在我们的一次面试中,我们问候选人,“这是一个很好的解决方案,但是你从哪里得到数据呢?”

回应:“哦,我们可以做 pd.read_csv()。”

“数据从哪里来”的答案。不是 pd.read_csv()

作为一名工作中的数据科学家,我的桌面上没有一个文件夹是我为 csv 文件中的数据单击打开的。我通常使用托管在云桶中的 parquet 和 gzip 文件,或者查询数据库来检索我的数据。例如,为了获得必要的数据来回答一个业务问题,我可能需要与几个工程师合作,以了解流程的不同部分,从数据是如何生成的,到如何有效地将所有数据提取到一个中心位置进行分析。

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

迪伦·吉利斯在 Unsplash 上的照片

实际上,数据科学要混乱得多。像随机梯度下降一样,我们正在迭代寻找一个解决方案,但通常没有好的指标。一些看似简单的事情,比如回答“上个月的销售额是多少?”往往会变得更加复杂,因为数据可能存在于多个数据库和一个同事的 excel 表格中。你会惊讶有多少数据是电子邮件链中的 excel 表格附件。

要获得一些数据科学的实际经验,请加入黑客马拉松,启动自己的数据项目,生成自己的数据,参加社区数据活动和小组。

战略性思考

数据科学家通常是数据问题的中间人。例如,我们在生成数据的工程师和希望用数据回答一些问题的产品经理之间工作。换句话说,我们与多个利益相关方和资源合作来解决与数据相关的问题。

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

图片由 200 度来自 Pixabay

要想成功,你需要知道如何在大局中定义自己的角色。例如,假设您受雇创建一个需求预测仪表板。这里有一组要问的问题:

  1. 谁将使用该控制面板,哪些功能很重要?
  2. 如何使用这个仪表板?它需要多久更新一次?
  3. 用户将如何访问仪表板?仪表板将在哪里托管?
  4. 数据从哪里来?谁负责保证、部署和维护基础架构?

在新兵训练营,我们会得到有明确目标的问题集,知道什么是正确的。在工作上,成功往往是没有定义的,顶多不断变化。这就是为什么从更广的角度看待问题并理解实际需求是很重要的。

敏捷/灵活

我们不是在寻找完美的答案。我们正在寻找能够按时部署的最佳答案。在训练营,我们的任务是提高模型的准确性。在工作中,准确性只是我们努力实现的众多指标之一。其他的包括可维护性、可部署性、可伸缩性、可再现性,我们能在有限的时间内做到这些吗?

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

照片由费伦茨·霍瓦特Unsplash 上拍摄

我们需要对不断变化的请求和数据保持敏捷和灵活。您在冲刺开始时试图解决的问题可能会在冲刺中期发生变化。例证:最近的疫情改变了许多业务运营,包括数据科学团队的业务运营。

数据可能会改变或损坏。要知道你建立的解决方案和模型都是有限的。比方说,您上个月构建的需求预测仪表板可能已经过时/损坏,因为以前可用的一些数据已经改变了格式或不再可用。

最后

训练营更像是数据科学领域的发射台。它们绝不是一个包罗万象的项目,你必须通过这个项目才能成为数据科学家。我和我的同事经常发现数据科学申请者缺乏的五项技能是:

  1. 中间 SQL
  2. 导航云
  3. 野外的数据科学
  4. 战略性思考
  5. 敏捷/灵活

作为额外的奖励,请确保在您的数据科学之旅中包括继续教育。这个领域每年都在快速发展,所以你需要继续学习最新的技术和技巧。我认识的所有数据科学家都有一些业余项目或爱好,他们正在追求提高他们的数据科学技能。

至此,我真诚地希望我对你获得第一份数据科学工作有所帮助。如果您有任何问题,以及哪些资源会对您有所帮助,请告诉我。我可以通过 LinkedIn 上的 jasonwithcoffee 联系到。

使用 AWS Athena 设置数据源的五个步骤

原文:https://towardsdatascience.com/five-steps-to-set-up-a-data-source-using-aws-athena-62d89d0a9051?source=collection_archive---------65-----------------------

为可视化准备德克萨斯州健康事实数据

A thena 是 AWS 中的一项无服务器服务,它提供了对存储在亚马逊简单存储服务(S3)中的数据执行查询的机会。在本文中,我将描述在 AWS Athena 中准备好数据源以创建有洞察力的仪表板的五个步骤。

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

克里斯托弗·高尔Unsplash 上拍摄的照片

德克萨斯州健康服务部每年维护健康事实档案数据。我获得了两个 excel 文件,分别包含 2012 年、2013 年、2014 年和 2015 年结构化格式的健康事实数据。

我编写 Python 代码来检查和更新数据的质量,使其整洁,并创建一个 CSV 文件。

CSV 文件随后被存储在 AWS S3 存储桶中,下面是在 AWS Athena 中设置数据源的步骤。

Amazon Athena 是一个交互式查询服务,允许您从 Amazon S3 查询数据,而不需要集群或数据仓库。

第一步。在 AWS 控制台中,通过在搜索栏中键入或从分析类别中选择 Athena。

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

第二步。点击【开始使用】

现在,您可以选择连接到数据源。我将使用默认的 AwsDataCatalog

您可以手动创建数据库和表,也可以使用 AWS Glue。我用了 AWS 胶水。

第三步。启动 AWS Glue 并添加爬虫

爬虫信息 :我把爬虫命名为“mytxhealthfacts”。我跳过了可选条目。

爬虫源类型 :我选择了“数据存储”作为爬虫源类型

数据仓库 :我选择了 S3 作为数据仓库。我在 AWS S3 中输入 csv 文件的位置作为包含路径。您也可以通过导航到该文件,然后选择复制路径将其放在剪贴板上来获得它。

我跳过了添加另一个数据存储的选项。

IAM 角色 :我选择了一个现有的 IAM 角色。

日程 :我选择了频率选项“按需运行”

输出 :我选择了添加名为“txhealthfacts”的数据库的选项,跳过了所有可选条目。

最后,我回顾了前面添加爬虫的所有步骤,并单击“Finish”。

步骤四。运行爬虫

这花了几秒钟,我看到状态从“开始”到“停止”再到“就绪”。

爬虫准备好之后,我回到雅典娜。

第五步。启动 Athena 并点击“查询编辑器”

我确认已经创建了数据库,并且还创建了包含来自 csv 文件的正确元数据的表。我还运行了一个查询来确认记录的数量。

现在,我在 AWS Athena 中有可用的数据源。我现在可以从 Quicksight 或 Tableau 等可视化工具连接到它,并创建一个有洞察力的仪表板。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值