麦肯锡教给我的 5 条经验将使你成为更好的数据科学家
如何在数据世界中脱颖而出
丹·迪莫克在 Unsplash 上拍摄的照片
数据科学是近年来最热门的领域之一,吸引了大量人才加入顶级公司数据科学团队的竞争。有很多文章教你如何准备 DS 面试以及“从其他面试者中脱颖而出”,但是这个旅程肯定不会止于被录用。获得工作机会仅仅是第一步;然而,没有多少人谈论一旦你通过面试并加入公司,你如何从其他雇佣的数据科学家中脱颖而出。
在麦肯锡工作的几年里,我有幸与麦肯锡和我服务过的顶级公司的无数聪明的数据科学家一起工作,并观察到了那些获得合作伙伴和客户最高评级和赞扬的人的共同特点。可能会让你们中的一些人感到惊讶,表现最好的数据科学家不一定是那些构建最奇特的模型或编写最高效代码的人(当然,他们必须通过相当高的技术技能才能被聘用),而是那些除了分析能力之外还拥有许多重要的**【软技能】**的人。本文将我在麦肯锡工作期间的经验和观察总结为 5 条经验,这将帮助你成为一名更好的数据科学家。
GIF by GIPHY
作为一个热爱精确的数据人,我想指出的是,尽管“数据科学家”这个头衔涵盖了当今行业中的各种工作,但在本文中,我主要关注的是给数据科学家的提示,这些提示会以任何形式影响业务决策(而不是那些更注重研究的“核心数据科学”角色)。
第一课。自上而下的沟通是关键
自上而下的沟通,或称金字塔原则,是由麦肯锡合伙人芭芭拉·明托创造并推广的,被许多人视为商业(甚至个人生活)中最有效的沟通结构。尽管这是战略顾问等一些人的第二天性,但许多数据科学家在这种沟通方面犯了错误。这个想法很简单:当你试图传达一个想法/论点时,如果你以一个关键信息开始,然后是几个主要论点来支持这个关键信息,这是最有效和最容易让观众理解的;如果需要,每个参数后面可以跟有支持数据。
采用自上而下的沟通是有利的,原因如下:
- 关键的要点是放在前面和中间:如果你在一封电子邮件/备忘录的开头看到了 TLDR ,或者在一篇研究论文的开头看到了执行摘要,你就会明白这一点的重要性。提前传达关键信息将确保你的听众得到一个大概的想法,即使他们没有抓住所有的细节。
- 演示/沟通可以很容易地针对不同的受众进行定制:您可以准备一套沟通,并将其保持在“关键信息”的水平上,为 c 级高管提供主要论点,并为同行和其他对杂草感兴趣的分析型受众提供详细信息。
不幸的是,对于数据科学家来说,他们的工作大部分时间都在进行深入的分析,这种沟通结构可能不是自然形成的,可能是违反直觉的。我经常看到数据科学家以深入的细节开始演讲或交流,却没有让观众理解关键信息。
如何实践:实践这一点的一个简单方法是在会前根据这个结构记下你的想法,以便在交流你从分析中得出的关键发现时让自己保持在正确的轨道上。经常后退一步问自己你实际上在试图解决什么问题也是有帮助的;这应该是你传达的关键信息。
作者图片
第二课。自己做“翻译”
- 很难从非分析型的人那里得到“翻译”:麦肯锡确实试图培养一批战略顾问成为不同分析研究的“翻译”;但在我看来,从来没有成功过。原因很简单:为了准确解释复杂分析的关键要点并准确反映警告,你需要一种分析心态和深刻的理解,这是通过几周的分析训练营培训无法实现的。例如,如果你不知道肘方法,你如何解释你为 K-means 选择的聚类数?不知道 SSE 是什么怎么解释肘法?。作为一名 DS,你花在教授这门不太成功的速成课程上的时间,或许更应该花在打造自己的沟通风格和自己翻译上。
- 如果 DS 能够解释他们自己的分析,精确性的损失是可以避免的:我相信大多数人都玩过“电话”游戏或它的变体。信息传递的时间越长,就越难保持其准确性。现在想象同样的过程发生在你的分析工作上;如果你依赖他人来解释/翻译你的工作,当信息到达最终用户时,它可能会偏离现实。
GIF by GIPHY
**如何实践:**与朋友(最好是没有任何分析背景的朋友)一起实践,向他们解释你的模型/分析(当然不要透露任何敏感信息)。这也是在你的方法中发现知识缺口的好方法;就像《大讲解员》理查德·费曼认为的那样,如果你不知道如何用简单的方式解释某件事,很多时候是因为你自己还没有理解好。
第三课。以解决方案为导向是第一法则
这不仅限于数据人才;对于在的人来说,这是一家公司的任何职能/角色所必不可少的。能够发现问题并提出担忧当然非常有价值,但更令人赞赏的是提出潜在解决方案的能力。如果没有一个以解决方案为导向的人在房间里,讨论可能经常会陷入困境,而不是试图找出前进的道路。
在大多数顶级咨询公司,以解决方案为导向是首要原则,在我看来,这种方法也应该适用于技术领域。作为一名数据科学家,当人们由于缺乏分析背景而提出荒谬的数据要求时,您可能会经常遇到令人沮丧的情况。我见过无数的 DS 不知道如何处理这些情况,并且因为总是唱反调而在利益相关者管理方面失败。不要把他们拒之门外,要以解决方案为导向,用你对数据和分析工具的更好理解,帮助他们重新定义问题并限制范围。
面向解决方案并不意味着你永远不能对任何事情说不,或者总是必须有已经起草好的完美解决方案;这意味着在你说的每一个“不”字后面,你都应该有一个“但是……怎么样?”。
**如何实践:**当你遇到问题时,在向你的团队或经理报告之前,花点时间想想你可能解决问题的方法。在解决问题时发挥你的创造力,不要害怕成为提出新解决方案的人。从你的工作流中扩展出来,了解更多关于业务和其他团队的工作也是有帮助的。了解全局通常有助于将点点滴滴联系起来,引导你找到创造性的解决方案。
GIF by GIPHY
第四课。在商业环境中建模时,可解释性胜过精确性
没有人真的想预测客户流失,每个人都在试图理解客户流失
如今,当每一家公司都在建立模型来预测客户流失时,很难退一步问自己为什么我们要在第一时间预测客户流失。公司希望预测客户流失,以便找到可行的解决方案来防止客户流失。因此,如果你的模型告诉首席执行官“网站访问量的立方根是表明客户流失的最重要特征之一”,他能利用这些信息做什么呢?可能没什么…
作为一名数据科学家,像你们中的许多人一样,我过去只关注准确性,作为建模时的成功衡量标准。但是我逐渐意识到,如果不能将其与业务影响联系起来,通过添加不可解释的功能和微调超参数将准确率从 96%提高到 98%对业务毫无意义(同样,这仅适用于面向业务的 DS,对于 ML 的某些领域,这种提高可能意味着全世界)。
如果模型是一个黑箱,也很难从高管那里获得信任。模型是一种在一天结束时指导商业决策的工具,所以它的价值很大程度上基于它的实用性和可解释性也就不足为奇了。
**如何实践:**在构建模型或执行分析时,始终将业务影响牢记在心。在建立模型时,避免将随机的交互特征扔向模型,并希望其中一个能够坚持下来;相反,在开始构建模型之前,应该对特征工程阶段进行充分的考虑。写下来自模型/分析的业务建议也将帮助您重新评估您在构建模型时所做的设计选择。
第五课。确保有一个假设,但不是和一个假设结婚
作者图片
从特性探索到探索性数据分析(EDA),将假设作为大多数分析的起点非常重要。如果没有假设,你就不知道如何为 EDA 分割数据,或者先测试哪些特性。没有假设,甚至没有必要进行 AB 测试(这就是为什么它被称为假设测试)。但我时常观察到,数据科学家在没有明确假设的情况下钻研低头分析阶段,后来迷失在兔子洞里。或者更常见的情况是,数据科学家将假设构建过程完全留给团队成员,而不了解数据,后来意识到没有足够的数据来测试这些假设。在我看来,最好的方法是让数据科学家从一开始就参与这些假设集思广益会议,并使用假设来指导和优先考虑后续分析。
假设固然重要,但它们应该是起点,而不是终点。一次又一次,我看到许多数据科学家(或与数据科学家一起工作的人)坚持一个假设,尽管有相互矛盾的发现。这种对最初假设的“忠诚”会导致数据窥探和篡改数据以符合特定的叙述。如果你熟悉“辛普森悖论”,你就能理解数据在讲述“错误故事”中的力量。优秀的数据科学家应该能够保持数据的完整性,并使叙述符合数据,而不是相反。
如何实践:为了想出好的假设,建立商业理解和敏锐度是很重要的。在探索数据的过程中,请记住这些假设来指导你,但是当数据告诉你一个与你最初的“有根据的猜测”不同的故事时,请虚心接受。拥有良好的商业意识也将有助于你在这个过程中调整你最初的理论,并根据数据调整你的叙述。
当谈到面向业务的角色时,人们往往认为人才可以分为两类:分析型和战略型,好像这两种能力位于光谱的相反两端。好吧,我告诉你一个秘密,最好的分析人才是那些也了解事情的战略/业务方面,并了解如何与业务利益相关者沟通的人,战略角色中最好的人才对分析和数据有一定的理解。
Python 中生成加权随机数的 5 个层次
像技术领导一样赢得算法面试
图片由 Gerd Altmann 从 Pixabay 拍摄
在 Python 中获得一个随机数很简单,因为有一个名为random
的内置模块。但是加权随机数呢?
我们来看一个真实的面试问题:
有一个字典如下:
*my_nums = {'A': 5, 'B': 2, 'C': 2, 'D': 1}*
键是四个字母,值是它们的权重。
请设计一个可以根据权重随机生成字母的函数。
(换句话说,这个函数应该有 50%的概率生成“A”,20%的概率生成“B”,20%的概率生成“C”,10%的概率生成“D”。)
如果你对 Python 非常熟悉,可能知道我们可以用 Python 3.6 引入的一个叫做random.choices()
的方法,或者 Numpy 中类似的方法来解决问题。
但是,技术面试不是为了测试你能不能记住一个特殊的 API。它旨在测试你是否能自己设计并实现一个算法。所以,面试官可能会问你:
“你能自己设计并实现这个方法吗?”
其实这是一个非常好的面试问题。因为不同水平的程序员对它会有不同的想法。所以区分初级和高级 Python 开发人员是很容易的。
本文将深入探讨这个问题的 5 种不同解决方案,从最直观但效率低下的方法到最佳答案。
第一级:最直观但效率低下的方法
如果我们的候选列表包含每个字母的期望数目,这将成为一个简单的问题。
如上所示,最直观的解决方案是生成一个列表,其中包括基于字母权重的每个字母的预期数量,然后从该列表中随机选择。
但是,如果有很多字母,并且它们的权重是更大的数字,这种解决方案显然不是很高效。因为我们会浪费很多时间来生成列表。
级别 2:避免生成大的列表
实际上,前面的解决方案的列表是不必要的。
因为总重量是 10 (5+2+2+1)。我们可以先生成一个 1 到 10 之间的随机整数,然后根据这个数返回一个字母:
上面的代码避免了像前面的解决方案那样生成列表,因此效率更高。
但是我们必须写很多代码,这看起来很难看。
第三级:避免写太多代码
事实上,我们不必将r
与所有范围进行比较。
如下面的例子,我们可以从r
中依次减去一个权重,任何时候结果小于或等于零,我们返回它:
第 4 级:用数学技巧让它更快
很明显,对于前面的解决方案,r
越快达到 0,我们的算法就越有效。
那么,如何才能让 *r*
更快的达到 0 呢?
直观来看,如果r
一直减去当前最大权重,会更快达到 0。所以,在运行weighted_random()
函数之前,我们可以按照权重从大到小对my_nums
进行排序。
如果你知道数学期望,我们可以用它来证明这个想法。
例如,以下是条目顺序不同的my_nums
词典。对于每一个字典,让我们计算它的数学期望,得到一个随机的字母需要多少步。
1.最佳订单
{A:5, B:2, C:2, D:1}
e = 5/10 * 1+2/10 * 2+2/10 * 3+1/10 * 4 = 19/10
2.最差的订单
{B:2, C:2, A:5, D:1}
e = 2/10 * 1+2/10 * 2+5/10 * 3+1/10 * 4 = 25/10
3.最差订单
{ D:1, B:2, C:2, A:5}
e = 1/10 * 1+2/10 * 2+2/10 * 2+5/10 * 5 = 34/10
如上所示,将权重从大到小排序的最佳顺序需要最少的平均步骤才能得到结果。
级别 Python 的应用方式
到目前为止,我们的解决方案已经足够好了。但仍有空间让它变得更好。
事实上,第 4 级解决方案引入了一个新的耗时步骤。因为我们首先要对字典进行排序。当这是一本更大的字典时,它完全不够高效。
在引擎盖下,内置的 Python 函数random.choices()
应用了一个更聪明的想法。它使用累积权重而不是原始权重。由于累积权重是升序排列,我们可以使用二分搜索法更快地找到位置。
基于我们的问题,让我们来实现这个伟大的想法:
现在,这个解决方案应用了 Python 的random.choices()
方法的相同思想。(对了,我们可以在 GitHub 上查看这个内置方法的源代码。)
如果我们能在这个层面设计我们的解决方案,我们肯定会在技术面试中胜出。
结论
要想在技术面试中胜出,仅仅记住一个特殊的内置方法是不够的。你需要知道它是如何在引擎盖下工作的,如果你能自己实现它就太好了。
感谢阅读。如果你喜欢,请关注me,成为 中等会员 享受更多关于编程和技术的精彩文章!
更多有趣的 Python 帖子给你:
https://medium.com/techtofreedom/the-art-of-writing-loops-in-python-68e9869e4ed4 https://medium.com/techtofreedom/5-uses-of-asterisks-in-python-3007911c198f
5 个心智模型有助于提升您的数据科学职业生涯
办公时间
激发超级思维的简单框架
我们成年后 50%或更多的时间花在事业上。我们做出的许多决定都会对我们的职业生涯产生直接或间接的影响。这可能是关于换工作,搬到一个不同的城市,选择一个爱好项目,或学习一个数据科学主题。深思熟虑的决定确保事业成功。我们每个人都会犯一些错误,这是很自然的。但是没有足够的奢侈去做太多错误的决定,因为每个错误的决定都要花费时间和金钱。在这里,我将展示一些简单的工具,您可以采用这些工具来确保在数据科学领域取得成功。
心智模型是一套惊人的框架,有助于清晰的思考。这有助于做出更好的决定。在这篇文章中,我将分享一些心智模型,以及关于拥抱它们。
心智模型如何帮助提升您的数据科学职业生涯?
采用心智模式将有助于训练你的大脑进行批判性思维。这有助于我们更好地理解问题,并提出更好的解决方案。这是数据科学项目成功的秘诀。是的,你对问题的理解比你的技术能力更重要。
心智模型也有助于更好地了解我们自己和我们的目标。它有助于获得重要问题的答案,
- 我应该提高什么技能来增加我的收入潜力?
- 什么数据科学角色更适合我?
- 作为一名数据科学家,我在工作中有足够的机会成长吗?
- 下一份工作应该期待什么?
- 我应该申请什么类型的数据科学职位?
- 我的优点和缺点是什么?
我们将详细了解采用以下 5 种流行的心智模式,
- 第一性原理思维
- 二阶思维
- 倒置
- 地图与区域
- 费曼技术
第一原理思维
这个框架有助于清楚地理解一个问题的基本要素。我是在阅读阿什莉·万斯(Ashlee Vance)的《埃隆·马斯克》(Elon Musk)一书时接触到这个概念的。阿什利解释说,埃隆可以选择以大约 6500 万美元的价格为 SpaceX 购买一枚火箭。但是,他选择使用第一原理思维,以十分之一的成本自己建造它。
要采用基本原则思维,请遵循这个简单的方法
- 尽你所能定义这个问题
- 把问题分解成基本要素
- 尝试改变一个或多个基本面
- 从头开始构建新的解决方案
第一原理思维的另一个流行例子是滚动手提箱的发明。人们总是把重物举过头顶或扛在肩上。大约在公元前 400 年,我们开始用牛车运输重物。但直到 20 世纪 70 年代,轮子才被装在手提箱上,用来装载个人物品
第一原则思维可以方便地解决大多数数据科学问题。它有助于更好地理解问题,并提出可能的最佳解决方案。要了解如何将基本原则思维应用于数据科学问题,请阅读下面的文章
[## 如何用第一性原理思维解决数据科学问题?
towardsdatascience.com](/how-to-use-first-principle-thinking-to-solve-data-science-problems-db94bc5af21)
二阶思维
大多数人试图只解决眼前的问题。没有太多关于后果的思考过程。任何人都能想出解决问题的办法。但是,要想出一个理想的解决方案,还需要考虑后果。
二级思维有助于超越解决方案。看到大多数人看不到的东西,就能取得惊人的成果。不采用其他思维模式没问题,但不采用这种模式可能代价高昂。采纳这一点非常容易,总是问更多的问题,想接下来是什么?
一个著名的不使用二阶思维的失败例子是泰坦尼克号悲剧。没有足够的措施来处理并发症。这艘载有 1500 多人的船只有 16 艘救生艇,只够船上 1/3 的人使用。船员们没有合适的照明设备,也没有望远镜。因此,不使用二阶思维可能会导致非常糟糕的后果。
在数据科学环境中,在向业务团队提供建议时。总是考虑所有可能的结果。有些结果是立竿见影的,有些可能需要更多的时间。但是,应该在考虑结果之后选择最终的解决方案。例如,提高客户保持率的一种方法是向更容易流失的客户提供折扣。不过,最有可能的是,这些客户可能会继续留下来。但我们需要了解后果,比如,它可能会对其他客户产生什么影响?这种折扣在多长时间内有助于留住顾客?是否会导致与竞争对手的价格战?从长远来看,这一战略是否可持续?
反转
这种思维模式可能不会给你带来最佳的解决方案。也许甚至没有接近它,但它将确保你避免问题。我发现这种方法有时很有启发性。
让我们考虑一个更相关的例子,您计划学习一个新的数据科学主题。达到你的目标可能有多种途径。你可以报名参加一门课程,你可以向朋友学习,你可以做一个项目,通过做事情来学习。选择正确的课程可能会令人困惑,比如所有不同的课程是什么?或者,有什么爱好项目可以帮助我学习题目?反转法是指从正常的方式中走出来,开始思考相反的方向。比如,什么会阻止你学习这个话题,什么会让你很快厌烦。因此,逆向思维不仅有助于识别障碍,也有助于消除不太合适的选择。
这种方法适用于任何数据科学问题。例如,假设问题陈述是,增加客户群。我们应该考虑有助于获得新客户的策略。但与此同时,我们应该使用逆向思维来了解可能导致客户流失的触发因素。否则,即使获得了新客户,也可能会有许多现有客户流失。因此,对企业的建议必须包括获取新客户的方向和防止客户流失的策略
地图 vs 领地
这项技术是关于识别地图和区域之间的区别。地图基于某个时间点的快照提供了更高级别的视图。领土显示了真实的现实。
这里我说的地图是指
- 我们根据经验设计的策略
- 案例研究或白皮书中的建议
- 逐步指南
我说的领域是指执行中的现实。一个策略以前的成功并不能保证将来的成功。此外,仅仅因为许多人遵循一步一步的指导并不意味着它会帮助你实现你的目标。
这并不意味着我们需要忽视基于以往经验或书本的策略。关键是我们需要明白,有一种基于现实的定制需求。例如,流行的学习数据科学的分步指南可能不适合你。也许是因为你的个人承诺、目标和专业水平。但是如果你从指南中挑选有用的见解,并把它们应用到你的计划中。成功的机会肯定更大。
以下是一些问题,将帮助您调整地图(战略/指南)与区域(您的现实)战略
- 谁创造了这张地图?为什么呢?
- 这张地图是什么时候制作的?现在用起来是不是太旧了?
- 地图会出什么问题?
- 如何让地图更有用?
- 从地图上应该忽略什么?
- 地图中考虑了哪些假设?
这些问题将帮助您了解我们正在讨论的地图是否仍然可用,或者需要进行哪些更改以使其适应性更强?
在数据科学项目环境中,假设您已经成功降低了在线商品的客户流失率。这并不意味着你可以轻松解决所有商家的客户流失问题。这取决于客户群、他们的概况、接触点和其他模式。来自成功的学习是好的,但是你需要让他们适应新的领域以确保成功
费曼的技术
费曼是历史上最伟大的物理学家之一。他以分解一个复杂的问题并用非常简单的术语解释它而闻名。这种技术可以用来更好地理解任何复杂的主题。
在数据科学职业生涯中,总是有大量的场景可以应用费曼的技术,
- 为了更好地理解您正在学习的新主题
- 达成一个简单的叙述,以便与业务涉众进行讨论
- 为团队中的新成员设计数据科学培训计划
以下是费曼技术中的简单步骤,可以应用到您的场景中,
第一步——你对这个话题了解多少?
- 写下你所知道的关于这个话题的一切。
- 如果这是你第一次学习这个话题,花些时间阅读一下
- 写下你对题目的理解。
第二步——你会如何向一个青少年解释这个话题?
- 保持事情足够简单,以便他们能被一个孩子理解
- 保持你的叙述简短,因为孩子们的注意力持续时间较短。
- 不要使用任何行话,避免使用任何复杂的术语
第 3 步——了解差距
- 基于步骤 2,了解你缺乏理解或需要更多阅读的领域。
- 努力弥补你的差距,直到你能够用简单的术语解释或谈论它们
第 4 步——精炼你的叙述
- 现在是时候把事情按正确的顺序进行,并进行叙述了。
- 如果你没有听众,那就和你的朋友分享,并获得他们的反馈
保持联系
- 如果你喜欢这篇文章,并对类似的文章感兴趣,在 Medium 上关注我
- 我在我的 YouTube 频道上教授和谈论各种数据科学主题。在这里订阅我的频道。
- 在此注册我的电子邮件列表,获取更多数据科学技巧,并与我的工作保持联系
2021 年 Gartner 数据和分析峰会的 5 个“元”要点
关于活动元数据,您应该知道什么,以及如何使用它来构建前瞻性数据堆栈
马克西姆·霍普曼在 Unsplash 上的照片
我很高兴能参加今年 6 月初举行的 Gartner 数据&分析峰会,我参加了 50 多场会议,重点讨论帮助数据和分析领导者满足当今和未来需求的策略和讨论。
在这些会议中,一个反复出现的概念是活动元数据:似乎正在推动 2021 年主要趋势的隐藏力量:增强数据目录、自主数据操作、数据结构和数据网格、数据和分析治理以及数据工具的消费化。
在本文中,我将解开活动元数据的基础,并列出有助于您利用活动元数据构建前瞻性数据堆栈的 5 个要点。
1.扩充数据目录现在是企业必备的东西
我们喜欢将现代数据堆栈视为神奇的解决方案,但即使是拥有现代基础架构的现代数据团队也常常难以找到并记录他们的数据。
今天的数据团队正面临着这些编目挑战:
- 他们对哪些数据存储在哪里知之甚少。
- 他们往往花更多的时间寻找数据,而不是实际分析数据。
- 他们发现很难在业务用户之间跨数据资产共享上下文。
今天的传统数据目录不能很好地解决这些问题。
然而,机器学习-增强数据目录会主动抓取和解释元数据来解决这些问题。它们支持实时数据发现、数据资产的自动编目以及更好的数据环境,所有这些都显著缩短了从问题到洞察的时间。
不确定什么是机器学习数据目录(MLDC)? 在此了解更多 。
图片由 Atlan 提供。
2.活动元数据是自主数据操作的关键
“Gartner 预计,到 2023 年,利用活动元数据、机器学习和数据结构来动态连接和自动化数据管理流程的组织将减少其数据交付时间,并对价值产生 30%的影响。”
—罗伯托·托雷斯、 CIO 潜
传统的数据目录只是被动地包含和组织技术元数据,即关于组织数据的基本信息。然而,主动元数据无处不在地寻找、丰富、编目和使用所有这些类型的元数据,采用传统的“被动”技术,使之真正面向行动。
这有助于组织最大化其数据的价值,并在目录深入研究用户活动、跨数据资产的联系等时找到更深入的见解。因此,激活元数据是建立为组织中不同数据用户工作的数据操作框架的第一步,也是最重要的一步。
3.激活元数据对于启用数据结构至关重要
数据结构是一个统一的环境,由一个架构和运行在该架构之上的数据服务组成,可帮助组织管理其数据。可以把它想象成一个跨越所有不同数据源和端点的“织物”。
“数据结构利用对现有的、可发现的和可推断的元数据资产的持续分析,来支持跨所有环境(包括混合和云计算平台)的集成和可重用数据的设计、部署和利用。”
— Ashutosh Gupta, Gartner
数据结构不是一种现成的工具或技术。相反,它由各种工具、资源和流程组成。数据结构是一个新兴的设计框架,它识别并连接来自不同应用程序的数据,以发现可用数据点之间独特的、与业务相关的关系。
目前,没有任何独立的工具或解决方案能够充当成熟的数据结构体系结构。相反,起点是投资元数据管理解决方案。这些需要支持元数据的摄取、共享、管理、激活和用知识图表示。获取正确的元数据是为数据系统设置可组合数据结构的第一步。
4.元数据管理工具的消费化
现代数据堆栈发展迅速且多样化。很容易在几秒钟内以很少的开销进行扩展,但在为数据带来治理、信任和上下文方面可能会很痛苦,这就是活动元数据在生态系统中不可或缺的地方。
过去,数据目录和管理工具是为像数据工程师和科学家这样的技术用户构建的。但是这些平台正变得越来越消费化,或者意味着每个人都可以在日常工作中使用。
技术含量较低的业务人员现在希望快速访问和使用值得信赖的数据,而不是通过向工程师发送电子邮件,而是通过简单的自助服务工具。
这些用户不是负担,而是提供了一个新的视角,这对于组织了解如何使用和组织他们的数据是一个很大的优势。
随着越来越多的业务用户投入到数据中,企业开始意识到缩短数据发现和准备时间以及提供大量上下文来帮助技术水平较低的用户产生和实施其见解的重要性。这就是为什么传统的数据管理工具开始让位于现代的元数据管理工具(例如我的公司 Atlan ),这些工具专注于出色的最终用户体验,就像我们在 Slack 等现代企业技术产品中看到的一样。
这些现代工具不仅更容易被业务用户使用,而且还极大地提高了数据工程团队的生产力。这符合由 Slack 和 concept 等新工具引领的企业技术消费化的大趋势。
5.数据分析和治理能力正在融合
为了理解和信任数据,数据不能在的筒仓中。当没有人知道谁在寻找特定的数据集以及寻找的原因时,多层次的层次结构和管理会使数据问题变得更糟。
这就是为什么治理数据不仅仅是对数据访问施加限制,还包括使数据民主化,并确保数据在正确的时间到达正确的用户手中。
数据治理的最终目标是支持更顺畅、更快速的决策。
今天,我们看到了一种融合,数据治理正在成为数据分析管道中的一个活跃部分。治理现在不是一个好的奖励,而是现代数据生态系统的必备功能,这些生态系统需要开放,更易于所有人访问,而不损害数据安全性或合规性。
觉得这个内容有帮助?在我的时事通讯《元数据周刊》上,我每周都写关于活动元数据、数据操作、数据文化和我们的学习建设的文章。 在此订阅。
Python 中检查 NaN 值的 5 种方法
python 中如何检查单个值是否为 NaN?有使用库和不使用库的方法。
NaN 代表非数字,是表示数据中缺失值的常用方法之一。它是一个特殊的浮点值,不能转换为除 float 以外的任何其他类型。
NaN 值是数据分析中的主要问题之一。为了得到想要的结果,处理 NaN 是非常必要的。
在数组、系列或数据帧中查找和处理 NaN 很容易。然而,确定一个独立的 NaN 值是很棘手的。在这篇文章中我解释了在 python 中处理 NaN 的五种方法。前三种方法涉及库的内置函数。后两个依赖于 NaN 的属性来寻找 NaN 值 。
方法 1:使用熊猫图书馆
pandas 库中的 isna() 可用于检查值是否为 null/NaN。如果值为 NaN/null,它将返回 True。
import pandas as pd
x = float("nan")
print(f"It's pd.isna : {pd.isna(x)}")**Output**It's pd.isna : True
方法 2:使用 Numpy 库
numpy 库中的 isnan() 可用于检查值是否为 null/NaN。类似于熊猫中的 isna() 。
import numpy as np
x = float("nan")
print(f"It's np.isnan : {np.isnan(x)}")**Output**It's np.isnan : True
方法 3:使用数学库
数学库 提供了内置的数学函数。该库适用于所有实数。 处理复数的话可以用 cmath 库。
数学库内置了函数 isnan() 来检查 null/NaN 值。
import math
x = float("nan")
print(f"It's math.isnan : {math.isnan(x)}")**Output**It's math.isnan : True
方法四:与自身比较
当我开始在一家大型 IT 公司工作时,我必须接受第一个月的培训。培训师在介绍南价值观的概念时提到,他们就像外星人我们一无所知。这些外星人在不断变形,因此我们无法将 NaN 的价值与其自身进行比较。
检查 NaN 值的最常见方法是检查变量是否等于自身。如果不是,那么一定是 NaN 值。
def isNaN(num):
return num!= numx=float("nan")
isNaN(x)**Output**True
方法 5:检查范围
NaN 的另一个可用于检查 NaN 的属性是范围。所有浮点值都在负无穷大到无穷大的范围内。
无穷大<任意数<无穷大
但是,楠的值不在这个范围内。因此,如果值不落在从负无穷大到无穷大的范围内,则可以识别出 NaN 。
这可以通过以下方式实现:
def isNaN(num):
if float('-inf') < float(num) < float('inf'):
return False
else:
return Truex=float("nan")
isNaN(x)**Output**True
希望以上文章对你有所帮助。我确信会有许多其他技术来检查基于各种其他逻辑的 NaN 值。请分享你遇到过的检查 NaN/ Null 值的其他方法。
干杯!
成为会员
我希望你喜欢这篇文章,我强烈推荐 注册中级会员 来阅读更多我写的文章或成千上万其他作者写的各种主题的故事。
你的会员费直接支持我和你看的其他作家。你也可以在媒体上看到所有的故事。
你可能会感兴趣的我的其他文章:
sebastiaan stam 在 Unsplash 上拍摄的照片
熊猫小组 5 分钟指南
使用这个有用的工具开始数据分析
由 Camylla Battani 在 Unsplash 拍摄的照片
数据分析从根本上讲就是用数据寻找问题的答案。当我们对一组数据执行一些计算或统计时,通常在整个数据集上这样做是不够的。相反,我们通常希望将数据分组,进行计算,然后比较不同组的结果。
数据分析从根本上讲就是用数据寻找问题的答案。
假设我们是一个数字营销团队,正在调查最近转化率下降背后的潜在原因。随着时间的推移,将转换率作为一个整体来看不太可能导致我们找到可能的原因。相反,我们希望比较不同营销流、活动、品牌和时间段的转化率,以确定指标的差异。
Pandas 是非常受欢迎的 python 数据分析库,它有一个 GroupBy 函数,提供了一种高效的方法来执行这种数据分析。在下一篇文章中,我将通过代码示例简要介绍 GroupBy 函数,以了解该工具的核心特性。
数据
在本教程中,我将使用 openml.org 网站上的一个名为“credit-g”的数据集。该数据集由许多提出贷款申请的客户的特征和一个表示贷款是否已偿还的目标变量组成。
数据可以在这里下载,或者使用 Scikit-learn API 导入,如下所示。
基本用法
该函数最基本的用法是简单地将GroupBy
添加到整个数据帧中,并指定我们想要进行的计算。这将生成按您选择的段分组的所有数字变量的汇总。这是快速获取整个数据集摘要的有用方法。
在下面的代码中,我按照作业类型对所有东西进行了分组,并计算了所有数值变量的平均值。输出显示在代码下方。
汇总所有数值变量。图片作者。
如果我们想更具体一些,我们可以取数据帧的一个子集,只计算某些列的统计数据。在以下代码中,我只选择了 credit_amount。
按工作类型列出的贷方金额。图片作者。
我们也可以根据多个变量进行分组。在这里,我计算了平均信贷金额的工作和住房类型。
按工作和住房状况列出的平均信贷额。图片作者。
多重聚合
能够为变量计算多个聚合通常非常有用。[DataFrameGroupBy.**agg**](https://pandas.pydata.org/pandas-docs/version/0.23/generated/pandas.core.groupby.DataFrameGroupBy.agg.html)
功能让这一切成为可能。
在下面的代码中,我计算了每个工作组的信用额度的最小值和最大值。
按工作类型列出的最低和最高信用额。图片作者。
也可以对不同的列使用不同的聚合。在这里,我计算了 credit_amount 的最小和最大金额,以及每种工作类型的平均年龄。
按工作类型分列的最低和最高 cedit 金额和平均年龄。图片作者。
命名聚合
[pd.NamedAgg](https://pandas-docs.github.io/pandas-docs-travis/user_guide/groupby.html#groupby-aggregate-named)
函数允许您为多个聚合提供名称,从而提供更清晰的输出。
NamedAgg 函数提供了更清晰的输出。图片作者。
自定义聚合
还可以对 groupby 应用自定义函数来扩展可能的聚合。
例如,如果我们想计算每种工作类型的好贷款和坏贷款的百分比,我们可以使用下面的代码。
按工作类型划分的好贷款和坏贷款的百分比。图片作者。
测绘
我们可以将内置的 pandas 绘图功能添加到 GroupBy 中,以便更好地可视化趋势和模式。
我扩展了在上一节中创建的代码,创建了一个堆叠条形图,以更好地显示每种工作类型的好贷款和坏贷款的分布。
使用 GroupBy 生成堆积条形图。图片作者。
除了使用 GroupBy 在同一个图表中创建比较之外,我们还可以在多个图表中创建比较。
用一行代码生成多重图。图片作者。
pandas GroupBy 函数是一个工具,作为一名数据科学家,我几乎每天都使用它来执行探索性数据分析。这篇文章是关于这个函数的基本用法的一个简短的教程,但是还有许多更强大的方法可以用来分析数据。
pandas 文档包含了对 GroupBy 函数的所有可能特性和用法的更详细的描述。这可以在这个环节找到。
本教程的完整笔记本和代码可以在这个 Github 库中找到。更多有用的 pandas 方法、函数和技巧,请看我以前的文章。
</10-things-you-didnt-know-about-pandas-d20f06d1bf6b>
感谢阅读!
我每月发一份简讯,如果你想加入请通过这个链接注册。期待成为您学习旅程的一部分
5 分钟机器学习
贝叶斯定理和朴素贝叶斯
图片来自 Unsplash.com,作者: @markbertulfo
朴素贝叶斯是一组简单有效的机器学习算法,用于解决各种分类和回归问题。如果你已经有一段时间没有上统计课了,或者看到“贝叶斯”这个词让你感到不安,那么这可能是一个很好的 5 分钟介绍。我将在 5 分钟内用一个健身房新年决心的例子来解释贝叶斯定理和朴素贝叶斯。我还将在我的 GitHub 中包含一些使用 Scikit-learn 的简单 python 代码。我们开始吧!
贝叶斯定理快速介绍
为了解释朴素贝叶斯,我们需要首先解释贝叶斯定理。贝叶斯定理的基础是条件概率(图 1)。事实上,贝叶斯定理(图 1)只是计算条件概率的一种替代或逆向方法。当联合概率、***【P(A∩B)】较难计算或如果逆或贝叶斯概率、【P(B | A)***较容易计算时,则贝叶斯定理可以应用。
图 1 —条件概率和贝叶斯定理
让我们快速定义一下贝叶斯定理中的一些术语:
- 类先验或先验概率: 事件 A 在对事件 b 一无所知之前发生的概率。
- 预测先验或证据: 与类先验相同,但用于事件 b
- 后验概率: 得知事件 b 后事件 A 的概率。
- 可能性: 后验概率的反转。
贝叶斯定理 vs 朴素贝叶斯:区别是什么?
这一切和朴素贝叶斯有什么关系?你需要知道贝叶斯定理和朴素贝叶斯的区别在于,朴素贝叶斯假设条件独立,而贝叶斯定理不假设条件独立。这意味着所有输入要素之间的关系是独立的。也许不是一个伟大的假设,但这就是为什么算法被称为“幼稚”。这也是算法非常快的一个原因。即使算法是“幼稚的”,它仍然可以胜过复杂的模型,所以不要让它的名字阻止你。下面我将展示贝叶斯定理和朴素贝叶斯之间的符号差异。让我们首先为我们在 Globo Gym 的朋友做另一个贝叶斯定理的例子。
应用贝叶斯定理的步骤
这里有一个简单的例子,将与所有的新年决心相关。Globo Gym 想要预测在给定天气条件下会员是否会去健身房***(attend = yes | weather)***。
步骤 1-查看或收集“原始”数据。
我们有这样的数据,其中每一行都代表会员在天气条件下参加 Globo Gym 的情况。所以观察 3 是在外面阴天的时候去健身房的会员。
weather attended
0 sunny yes
1 rainy no
2 snowy no
3 cloudy yes
4 cloudy no
第二步-将长数据转换成频率表
这提供了天气状况下的出席总数。
attended
no yes
weather
cloudy 1 3
rainy 2 1
snowy 3 1
sunny 1 3
第 3 步-行和列求和以获得概率
weather probabilities
cloudy = 4/15 or 0.267
rainy = 3/15 or 0.20
snowy = 4/15 or 0.267
sunny = 4/15 or 0.267attendance probabilities
no = 7/15 or 0.467
yes = 8/15 or 0.533
查看我们的类先验概率(出席概率),平均一个会员有 53%的可能去健身房。仅供参考,这正是大多数健身房的商业模式:希望很多人注册,但很少参加。然而,我们的问题是,在给定的天气条件下,会员去健身房的可能性有多大。
第五步——将频率表中的概率应用于贝叶斯定理
图 2 显示了我们用贝叶斯定理表示法提出的问题。让我们从上面的频率表中给图 2 中的每个概率赋值,然后重写等式,这样就清楚了。
图 2 -假设天气晴朗,出席概率的贝叶斯定理
可能性 : P(晴|是)= 3/8 或 0.375(总晴和是除以总是)
类先验概率 : P(是)= 8/15 或 0.533
预测器先验概率*😗*P(sunny)=*4/15 或 0.267
图 3 -带值的贝叶斯定理
图 3 显示,如果天气晴朗,一个随机成员有 75%的可能去健身房。这高于 53%的整体平均出席率!相反,下雪时去健身房的概率只有 25% (0.125 ⋅ 0.533 / 0.267)。
既然这是一个二元的例子(参加或不参加) P(是|晴天) = 0.75 或 75%,那么反过来 P(否|晴天) 就是 0.25 或 25%,因为概率必须求和为 1 或 100%。
这就是如何使用贝叶斯定理来寻找分类的后验概率。朴素贝叶斯算法与我们接下来要展示的类似。要明确的是,我们的例子中一个明显的问题是,给定天气,我们对所有成员应用相同的概率,这是没有意义的,但这只是一个有趣的例子。现在,让我们讨论额外的功能和使用朴素贝叶斯。
多重特征和使用朴素贝叶斯
几乎在所有情况下,模型中都有许多特征。Globo Gym 的示例特征可以是:年龄箱、会员类型、性别等。让我们展示如何将这些特性融入贝叶斯定理和朴素贝叶斯。
下面的图 4 显示了简化到朴素贝叶斯算法中的贝叶斯定理,该算法结合了多种特征。在贝叶斯定理中,您将计算给定所有特征的单个条件概率(上图)。对于朴素贝叶斯,我们通过计算每个特征的条件概率来简化它,然后将它们相乘。请记住,这就是它被称为“幼稚”的原因,因为所有的特征条件概率都是彼此独立计算的。朴素贝叶斯算法在独立性和去除分母的帮助下得到简化。你可以按照贝叶斯定理的上述步骤来应用这些简单的计算,从而得出贝叶斯定理和朴素贝叶斯之间的关系!
图 4 —简化为朴素贝叶斯的贝叶斯定理
结论
这是对贝叶斯定理和朴素贝叶斯的 5 分钟快速介绍。我们使用了一个有趣的例子,Globo Gym 使用贝叶斯定理预测健身房的出席率。我们解释了贝叶斯定理和朴素贝叶斯之间的区别,展示了简化的符号,并通过独立性假设展示了为什么它是“朴素”的。这里还有很多要补充的,但希望这能让你对贝叶斯定理和朴素贝叶斯算法有所了解。我会在下面的参考文献中添加一些好的读物。我希望你对朴素贝叶斯的好奇心有所增长,并把它融入到你的下一个项目中。
参考
- 这家伙真棒!Jason Brownlee 的文章:机器学习的贝叶斯定理、概率和从零开始开发朴素贝叶斯
- 免费 pdf 的想贝氏书在这里
- 简单代码的 GitHub 回购
- Scikit-learn 朴素贝叶斯文档
解释所有机器学习模型的 5 分钟备忘单
没有时间深入研究流行的机器学习模型?
解释最重要的机器学习模型
马库斯·温克勒在 Unsplash 上的照片
很多时候,恰好你过几天就要面试了,你的日程排得满满的准备。或者可能你正处于修订模式,想看看所有基本的流行机器学习模型。如果是这样的话,你来对地方了。在这篇博客中,我将简要解释一些在采访中最常被问到的机器学习模型。我还将列出与每个模型相关的重要参数,以及找到同一主题的详细解释的来源,因此如果需要,您可以更深入地了解。
由吉菲
机器学习模型可以大致分为监督学习和非监督学习两类。在监督学习中,我们有两大类回归和分类。接下来的几节将对它们进行简要的解释,让您有必要的了解。
分类(按作者分类的图片)
注意:我提供的是模型,我认为这是最常见的模型,应该在接受任何数据科学采访之前准备好。然而,这个列表是主观的。
监督学习
在监督学习中,用于训练模型的数据被“标记”。这意味着每个输入的输出是已知的。例如,如果您的模型试图预测房价,您可能会有一些变量,如房子的大小、楼层数等。当您的数据被标记时,这意味着您还有一个包含房价的变量。
监督学习的例子。作者图片
上面的例子是为了回归。现在让我们仔细看看回归和分类。
分类
在分类中,模型的输出是离散的。例如,考虑狗与猫的图像分类,其中我们预测图像是否包含狗或猫的家庭。类别(这是模型的输出)在这里将是离散的,即狗或猫。现在,我们将浏览常用于分类的模型。
逻辑回归
不要迷茫;名字中有“回归”二字,但用于分类。逻辑回归使用一个方程来创建数据曲线,然后使用该曲线来预测新观察的结果。
逻辑回归(图片由作者提供)
实质上,创建了一个逻辑等式,使得输出值只能在 0 和 1 之间。
详细 解说此处
支持向量机
支持向量机(SVM)在用于分类的数据点之间形成边界。例如,在 2 维的情况下,SVM 将创建一个边界,使得一个类的大部分数据点落在边界的一侧,而另一个类的大部分数据点落在另一侧。
SVM(修改后的图片带 CC 牌照)
所以 SVM 的目标是找到最大化利润的边界(如上图所示)。
重要参数/概念 —内核、C、伽玛、余量
详细解释 此处
决策图表
在决策树中,你基本上是问一些关于你的观察的问题,并沿着树向下直到你得到一个结果,如下所示。
决策树(图片由作者提供)
在上面的例子中,每个正方形被称为一个节点,,这里的节点数量越多,将导致数据集上的模型越过度拟合。
重要参数/概念 —节点、叶节点、熵、信息增益
详细解释 此处
随机森林
它是一种集成学习技术,使用多个决策树来给出最终输出。随机森林基于原始数据集的引导数据集创建多个决策树,并在决策树的每一步随机选择变量的子集。在推理过程中,我们得到所有决策树的输出,最后,我们选择具有最多票数的输出。随机森林通常比决策树更受欢迎,因为它们可以防止过度拟合。
重要参数/概念 —决策树的数量、引导数据的大小、随机森林特征的数量,以及决策树部分提到的所有其他内容。
详细解释 这里的 (也包括其他的合奏方法)
朴素贝叶斯
这个模型需要很强的概率基础。它的工作是基于贝叶斯定理。
作者图片
基本上,我们试图找出“给定一个输入(X),一个特定输出(y)的概率是多少”。我们假设每个输入变量都是相互独立的,所以 P(X|y)可以写成
作者图片
此外,对于所有可能的输出(0,1),P(X)(出现在分母中)将保持不变。所以我们对所有可能的输出计算 P(y|X),概率最高的输出将是模型的最终预测。
详解 此处
神经网络
当今最基本的机器学习模型之一。它被称为神经网络,因为它是模仿我们大脑中神经元的工作方式而设计的。神经网络发现数据集中的模式,有时甚至人类都无法识别。它们非常强大,非常有用,尤其是在处理图像、文本和音频时。
神经网络(图片来自维基百科带 CC 许可)
在上图中,前两个圆圈表示输入图层,中间 5 个圆圈表示隐藏图层,最后一个黄色圆圈表示输出图层。隐藏层中的每个节点代表一个线性函数和一个激活函数。
重要参数/概念— 学习率、损失函数、反向传播、激活函数。
详细解释 此处
回归
在回归中,模型的输出是连续的。例如,考虑房价预测,我们根据房子的大小和层数来预测房子的价格。这个房价将是一个连续的变量,而不是离散的。
线性回归
它类似于逻辑回归。这里我们试图找到一条最符合数据的线。然后,该最佳拟合线用于预测新的数据点。
线性回归(图片来自维基百科
线性回归只不过是直线或平面的方程。该等式包含每个输入变量的系数,反映每个输入变量对输出的敏感度。
重要参数/概念— 回归系数
详解 此处
可用于回归任务的其他重要模型有决策树、随机森林、神经网络等。因为上面我已经讲过了,所以我现在就跳过它们。
无监督学习
在无监督学习中,用于训练模型的数据是“未标记的”。这意味着你只有输入。在无监督学习中,我们试图仅基于输入数据来发现模式。无监督学习中使用的两种主要方法包括聚类和降维。
使聚集
聚类(图片由维基百科提供 CC 许可)
聚类包括基于某些标准对数据点进行分组或聚类。它用于客户细分、欺诈检测、文档分类等。
一些常见的聚类技术包括 k 均值聚类、层次聚类、均值漂移聚类和基于密度的聚类。虽然每种技术在寻找聚类时使用不同的标准,但它们都旨在实现相同的目标。
详解此处
降维
它包括通过寻找/提取一组更重要的变量来减少所考虑的输入变量的数量。有两种方法通过特征消除或特征提取来减少输入特征。
最著名的降维方法之一是基于特征提取的主成分分析(PCA)。
详细解释 此处
结论
我希望这种总结所有重要机器学习模型的尝试对你们所有人都有用。如果你认为有任何改进的余地,或者你想要一个关于任何其他模型的解释,请让我知道。如果你想了解更多关于机器学习的话题,请关注我们的 medium 。
成为 介质会员 解锁并阅读介质上的许多其他故事。
5 分钟数据科学设计模式 I:回访
数据科学设计模式的迷你集合——从回调开始
注意:这些系列是为数据科学家编写的软件设计快速入门,比设计模式圣经更轻量级的东西— 干净代码 我希望在我刚开始学习时就存在。设计模式指的是一些常见问题的可重用解决方案,有些恰好对数据科学有用。很有可能其他人已经解决了你的问题。如果使用得当,它有助于降低代码的复杂性。
由于代码块比较多,这里的是语法高亮的版本。
那么,回调到底是什么?
Callback
function,或 call after,简单来说就是一个函数会在另一个函数之后被调用。它是作为参数传递给另一个函数的一段可执行代码(函数)。【1】
**def** **foo**(x, callback**=None**):
print('foo!')
**if** callback:
callback(x)
**return** **None**>>> foo('123')
foo!>>> foo('123', print)
foo!
123
这里我将函数print
作为回调函数传递,因此字符串123
在foo!
之后被打印。
为什么我需要使用回调?
回调在高级深度学习库中非常常见,很可能你会在训练循环中找到它们。
- fastai — fastai 为 PyTorch 提供高级 API
- Keras—tensor flow 的高级 API
- 点燃 —使用事件&处理程序,这在他们看来提供了更多的灵活性
import numpy **as** np
*# A boring training Loop*
**def** **train**(x):
n_epochs **=** 3
n_batches **=** 2
loss **=** 20
**for** epoch **in** range(n_epochs):
**for** batch **in** range(n_batches):
loss **=** loss **-** 1 *# Pretend we are training the model*
**return** loss>>> x **=** np**.**ones(10)
>>> train(x)
14
因此,假设您现在想要打印一个时期结束时的损失。您可以只添加一行代码。
简单的方法
**def** **train_with_print**(x):
n_epochs **=** 3
n_batches **=** 2
loss **=** 20 **for** epoch **in** range(n_epochs):
**for** batch **in** range(n_batches):
loss **=** loss **-** 1 *# Pretend we are training the model*
print(f'End of Epoch. Epoch: {epoch}, Loss: {loss}')
**return** losstrain_with_print(x)End of Epoch. Epoch: 0, Loss: 18
End of Epoch. Epoch: 1, Loss: 16
End of Epoch. Epoch: 2, Loss: 14
回调方法
或者您调用来添加一个 PrintCallback ,它做同样的事情,但是用了更多的代码。
**class** **Callback**:
**def** **on_epoch_start**(self, x):
**pass** **def** **on_epoch_end**(self, x):
**pass** **def** **on_batch_start**(self, x):
**pass** **def** **on_batch_end**(self, x):
**pass** **class** **PrintCallback**(Callback):
**def** **on_epoch_end**(self, x):
print(f'End of Epoch. Epoch: {epoch}, Loss: {x}')**def** **train_with_callback**(x, callback**=None**):
n_epochs **=** 3
n_batches **=** 2
loss **=** 20 **for** epoch **in** range(n_epochs): callback**.**on_epoch_start(loss) **for** batch **in** range(n_batches):
callback**.**on_batch_start(loss)
loss **=** loss **-** 1 *# Pretend we are training the model*
callback**.**on_batch_end(loss) callback**.**on_epoch_end(loss)
**return** loss>>> train_with_callback(x, callback**=**PrintCallback())End of Epoch. Epoch: 2, Loss: 18
End of Epoch. Epoch: 2, Loss: 16
End of Epoch. Epoch: 2, Loss: 14
通常,一个回调定义了几个特定的事件on_xxx_xxx
,表示函数将根据相应的条件执行。所以所有回调都将继承基类Callback
,并覆盖期望的函数,这里我们只实现了on_epoch_end
方法,因为我们只想在最后显示损失。
为做一件简单的事情而写这么多代码似乎有些笨拙,但是有很好的理由。考虑现在你需要添加更多的功能,你会怎么做?
- 模型检查点
- 提前停止
- 学习率计划程序
你可以只在循环中添加代码,但是它将开始成长为一个真正的大函数。测试这个功能是不可能的,因为它同时做 10 件事。此外,额外的代码甚至可能与训练逻辑无关,它们只是用来保存模型或绘制图表。所以,最好把逻辑分开,一个功能按照单一责任原则应该只做 1 件事。这有助于你降低复杂性,因为你不需要担心你会不小心打碎 10 件东西,一次只考虑一件事情会容易得多。
当使用回调模式时,我可以多实现几个类,而训练循环几乎没有被触及。我不得不改变训练函数一点,因为它应该接受 1 个以上的回调。
包装回调列表的回调类
**class** **Callbacks**:
"""
It is the container for callback
"""
**def** __init__(self, callbacks):
self**.**callbacks **=** callbacks
**def** **on_epoch_start**(self, x):
**for** callback **in** self**.**callbacks:
callback**.**on_epoch_start(x)
**def** **on_epoch_end**(self, x):
**for** callback **in** self**.**callbacks:
callback**.**on_epoch_end(x)
**def** **on_batch_start**(self, x):
**for** callback **in** self**.**callbacks:
callback**.**on_batch_start(x)
**def** **on_batch_end**(self, x):
**for** callback **in** self**.**callbacks:
callback**.**on_batch_end(x)
附加回调的伪实现
**class** **PrintCallback**(Callback):
**def** **on_epoch_end**(self, x):
print(f'[{type(self)**.**__name__}]: End of Epoch. Epoch: {epoch}, Loss: {x}')
**class** **ModelCheckPoint**(Callback):
**def** **on_epoch_end**(self, x):
print(f'[{type(self)**.**__name__}]: Save Model')
**class** **EarlyStoppingCallback**(Callback):
**def** **on_epoch_end**(self, x):
**if** loss **<** 3:
print(f'[{type(self)**.**__name__}]: Early Stopped')
**class** **LearningRateScheduler**(Callback):
**def** **on_batch_end**(self, x):
print(f' [{type(self)**.**__name__}]: Reduce learning rate')
**def** **train_with_callbacks**(x, callbacks**=None**):
n_epochs **=** 3
n_batches **=** 6
loss **=** 20
**for** epoch **in** range(n_epochs):
callbacks**.**on_epoch_start(loss) *# on_epoch_start*
**for** batch **in** range(n_batches):
callbacks**.**on_batch_start(loss) *# on_batch_start*
loss **=** loss **-** 1 *# Pretend we are training the model*
callbacks**.**on_batch_end(loss) *# on_batch_end*
callbacks**.**on_epoch_end(loss) *# on_epoch_end*
**return** loss
这是结果。
>>> callbacks **=** Callbacks([PrintCallback(), ModelCheckPoint(),
EarlyStoppingCallback(), LearningRateScheduler()])
>>> train_with_callbacks(x, callbacks**=**callbacks)[LearningRateScheduler]: Reduce learning rate
[LearningRateScheduler]: Reduce learning rate
[LearningRateScheduler]: Reduce learning rate
[LearningRateScheduler]: Reduce learning rate
[LearningRateScheduler]: Reduce learning rate
[LearningRateScheduler]: Reduce learning rate
[PrintCallback]: End of Epoch. Epoch: 2, Loss: 14
[ModelCheckPoint]: Save Model
[LearningRateScheduler]: Reduce learning rate
[LearningRateScheduler]: Reduce learning rate
[LearningRateScheduler]: Reduce learning rate
[LearningRateScheduler]: Reduce learning rate
[LearningRateScheduler]: Reduce learning rate
[LearningRateScheduler]: Reduce learning rate
[PrintCallback]: End of Epoch. Epoch: 2, Loss: 8
[ModelCheckPoint]: Save Model
[LearningRateScheduler]: Reduce learning rate
[LearningRateScheduler]: Reduce learning rate
[LearningRateScheduler]: Reduce learning rate
[LearningRateScheduler]: Reduce learning rate
[LearningRateScheduler]: Reduce learning rate
[LearningRateScheduler]: Reduce learning rate
[PrintCallback]: End of Epoch. Epoch: 2, Loss: 2
[ModelCheckPoint]: Save Model
希望它能让你相信回调使代码更干净,更容易维护。如果你只是使用简单的if-else
语句,你可能会得到一大块if-else
从句。
参考
我希望在我的数据科学职业生涯中避免的 5 个错误
布鲁斯·马斯在 Unsplash 上的照片
我得到了这些教训,所以你不必这样做
当我第一次从金融转向数据科学时,我觉得自己站在世界之巅——我在我梦想的领域找到了一份工作,我的职业轨道已经确定,我只会低着头努力工作,还有什么可能出错呢?嗯,有几件事…在接下来的一年里,作为一名数据科学家,我很高兴我发现自己在职业生涯早期犯了几个错误;这样,在为时已晚之前,我有时间进行反思和调整。过了一段时间,我意识到这些错误是相当普遍的;事实上,我观察到我周围的很多 DS 仍然在犯这些错误,没有意识到从长远来看它们会伤害他们的数据职业生涯。
如果我的“麦肯锡教给我的能让你成为更好的数据科学家的 5 课”是我从最优秀的人那里学到的,那么这篇文章中的课是我通过艰难的方式学到的,希望我能帮助你避免犯同样的错误。
错误 1:将自己视为步兵而非思想伙伴
在成长过程中,我们总是被基于我们遵守规则和命令的程度来评价,尤其是在学校里。如果你按照课本和练习考试,只要努力学习,你就会成为优等生。很多人似乎把这种“步兵”心态带到了他们的工作环境中。在我看来,正是这种心态阻碍了许多数据科学家最大限度地发挥他们的影响力,并从同行中脱颖而出。我观察到许多 d,尤其是初级 d,认为他们对决策过程没有任何贡献,宁愿退居幕后,被动地执行为他们制定的决策。这就开始了一个恶性循环——你对这些讨论的贡献越少,利益相关者就越不可能让你参与到未来的会议中,你在未来做出贡献的机会也就越少。
我举一个具体的例子,说明在模型开发的情况下,步兵和思想伙伴的区别。在数据收集和功能头脑风暴会议中,以前的我习惯于被动地记录利益相关者的建议,以便我可以在以后“完美地”实施它们。当有人提出一个我知道我们没有数据的功能时,我不会说任何基于假设的话,他们更高级,他们一定知道一些我忽略的东西。但你猜怎么着,他们没有。我后来面临的情况是,我们集体讨论的 50%的功能需要额外的数据收集,这将使我们的项目期限处于危险之中。结果是,我经常发现自己最终处于一个不受欢迎的位置——传达坏消息的信使。努力成为思想伙伴如今,我很早就让自己参与对话,并利用我作为最接近数据的人的独特地位;这样,我可以在早期管理涉众的期望,并提出建议来帮助团队前进。
如何避免这种情况:
- 确保你不要在会议上退缩,在会上你可以从数据的角度贡献一些东西:涉众对度量的定义是否足以满足他们想要度量的东西?数据是否可用于度量该组指标?如果没有,我们能用现有的数据找到代理吗?
- 冒名顶替综合症是真实存在的,尤其是在初级 DS 中;确保你意识到这一点,每当你在质疑是否应该说一些“别人可能已经想到的”或问一个“愚蠢的澄清问题”时,你应该这样做。
- 对其他人正在做的事情保持一定的好奇心。在很多情况下,我发现我可以通过注意到其他人由于对公司数据缺乏了解而可能忽略的差距来增加价值。
错误 2:将自己归入数据科学的特定领域
我想成为数据工程师还是数据科学家?我想处理营销和销售数据,还是做地理空间分析?您可能已经注意到,到目前为止,我在本文中一直将术语 DS 用作许多与数据相关的职业道路的通用术语(例如,数据工程师、数据科学家、数据分析师等)。);这是因为如今在数据世界中,这些头衔之间的界限非常模糊,尤其是在较小的公司中。我观察到许多数据科学家认为自己只是构建模型的数据科学家,不关注任何业务方面,或者只关注数据管道的数据工程师,不想了解公司正在进行的建模。
最好的数据人才是那些能够身兼数职或者至少能够理解其他数据角色的流程的人。如果你想在创业的早期阶段或成长期工作,这就特别方便了,在这种情况下,职能可能还没有专业化,你需要灵活,并承担各种与数据相关的责任。即使你处于一个明确定义的工作岗位,随着时间的推移,你会获得更多的经验,你可能会发现你有兴趣转换到一个不同类型的数据角色;如果你不把你自己和你的技能局限在一个特定的角色上,这个支点会容易得多。
如何避免这种情况:
- 同样,对其他数据角色正在处理的项目保持好奇。安排与同事的定期会议,互相讨论感兴趣的项目,或者让不同的数据团队定期互相分享他们的工作/项目。
- 如果你不能在工作中接触到其他数据角色,那么试着在空闲时间保持/练习你不使用的数据技能。例如,如果您是一名数据分析师,并且已经有一段时间没有接触建模了,那么可以考虑通过像 Kaggle 竞赛这样的外部项目来练习这些技能。
错误 3:没有跟上该领域的发展
自满害死人
每个士兵都知道这一点,每个 DS 也应该知道。对自己的数据技能沾沾自喜,不花时间学习新技能是一个常见的错误。在数据领域这样做比在其他领域更危险,因为数据科学是一个相对较新的领域,仍在经历剧烈的变化和发展;不断有新的算法、新的工具,甚至新的编程语言被引入。
如果你不想成为 2021 年仍然只知道如何使用 STATA 的数据科学家(他存在,我和他一起工作),那么你需要跟上该领域的发展。
不要让这成为你(GIFGIPHY)
如何避免这种情况:
- 报名参加在线课程,学习新概念和新算法,或者温习那些你已经知道但在工作中有一段时间没有用到的知识。学习能力是每个人都应该不断练习的肌肉,成为一个终身学习者可能是你能给自己的最好礼物。
- 注册一份 DS 时事通讯或关注 DS 博客/媒体出版物,养成关注 DS“新闻”的习惯。
错误 4:过度发挥你的分析能力
如果你只有一把锤子,所有的东西看起来都像钉子。不要做那个什么事都想用 ML 的 DS。当我第一次进入数据科学的世界时,我对我在学校学到的所有花哨的模型都非常兴奋,迫不及待地想在现实世界的问题上尝试所有这些模型。但是现实世界不同于学术研究,80/20 法则总是在起作用。
在我之前的一篇关于“麦肯锡教给我的 5 个教训”的文章中,我谈到了业务影响和可解释性有时比你的模型准确性多几个百分点更重要。有时,假设驱动的 excel 模型可能比多层神经网络更有意义。在这些情况下,不要过度使用你的分析能力,使你的方法矫枉过正;取而代之的是,展示你的商业肌肉,做一个有商业头脑的 DS。
如何避免这种情况:
- 在你的军械库中拥有一整套分析技能/工具,从简单的 Excel 到高级的 ML 建模技能,这样你就可以随时评估在这种情况下使用哪种工具是最好的,而不是带着枪去决斗。
- 在深入分析之前理解业务需求。有时利益相关者会要求 ML 模型,因为它是一个流行的概念,他们对 ML 模型能做什么有不切实际的期望;作为一名 DS,你的工作就是管理期望,帮助他们找到更好更简单的方法来实现他们的目标。记得吗?做思想的伙伴,而不是步兵。
错误 5:认为建立数据文化是别人的工作
在我的文章“建立伟大数据文化的 6 个基本步骤”中,我谈到了如果公司没有伟大的数据文化,数据科学家的生活会变得多么糟糕和低效。事实上,我已经听到许多 DS 抱怨无效的特别数据请求,这些请求应该由涉众以自给自足的方式轻松处理(例如,在 Looker 中将聚合从每月一次改为每天一次,实际上只需要两次点击)。不要认为改变那种文化是别人的工作;如果你想看到改变,那就去改变。毕竟,有谁比数据科学家本身更有能力建立数据文化并教育利益相关者关于数据的知识呢?帮助建立公司的数据文化将会让你和你的利益相关者的生活更加轻松。
如何避免这种情况:
- 将为非分析性利益相关者进行培训和开发自助资源作为自己的责任
- 确保你开始实践你所宣扬的;开始将查询链接到幻灯片,将真实的数据源链接到文档,并开始记录您的代码和数据库。你不可能在一夜之间建立起数据文化,所以这肯定需要耐心
我确实想指出,在你的职业生涯中犯错误是没关系的;最重要的是从那些错误中吸取教训,并在将来避免它们。或者更好的是,把它们写下来,以帮助其他人避免犯同样的错误。
初次学习编程时要避免的 5 个错误
一开始的快速进步并不意味着高效的学习过程
我们生活在一个科技的世界里;无论你往哪里看,你都会发现一种使用算法或程序来工作的设备或工具。从我们的手机、智能电视、手表,甚至烤箱和洗衣机,科技已经成为我们生活中不可分割的一部分。随着技术与我们生活的方方面面交织在一起,许多人对这个领域感到好奇,或者了解事物是如何工作的。
技术作为一种职业道路可以非常令人满意,有利可图,令人兴奋。有了技术职业,你就有机会在维护现在的同时参与建设未来。这是吸引我进入这个领域的核心理念之一。每天都有许多人在考虑进入科技领域,而不管具体是哪个分支。无论你是在考虑成为一名网站开发人员、一名应用程序开发人员、一名数据科学家,还是一名研究人员,你需要迈出的第一步是学习编程。
编程是进入数据科学领域及其所有分支的首要基础。在我看来,编程本身就是一项很好的学习技能,不管最终目标是什么应用。学习编程将教会你如何从结构上思考问题,并用简单的语言表达出来,让计算机执行。
</6-best-python-ides-and-text-editors-for-data-science-applications-6986c4522e61> [## 数据科学应用的 6 个最佳 Python IDEs 和文本编辑器
towardsdatascience.com](/6-best-python-ides-and-text-editors-for-data-science-applications-6986c4522e61)
在这篇文章中,我将讲述我的学生在刚开始学习编程时经常犯的 5 个错误。我试图帮助他们避免错误,以便他们能够以正确的方式学习编程,或者,如果我可以说的话,允许他们轻松学习任何编程语言并掌握他们接下来选择追求的任何分支的方式。
№1:跳过头脑风暴
当你第一次面对一个编程问题时,你开始思考解决方案;一旦你这么做了,你可能会停下来开始实施它。这是人们在学习时犯的第一个错误——我一开始也是这样做的。
有效解决任何问题的一个重要步骤是尝试从不同的角度看待问题,并尝试找到该问题的其他答案,然后检查这些答案,将它们缩小到最有效的答案,或者以您当前的技能水平可以快速实现的答案。
所以,下一次你遇到新的编程问题时,花点时间考虑多个答案,记住,最简单的答案并不总是你首先想到的。
№2:跳过旧的时尚纸笔
如果你正试图以正确的方式学习编程,你不应该跳过先用纸笔或白板的方法来解决问题。我知道当一个人有了解决问题的想法时会有一种冲动,以及你会觉得你想开始在你的答案中编码。但是,这样做将占用你学习如何组装算法的时间。
当你心中有一个答案时,我希望你花一些时间,把这个答案作为一组步骤,从输入到回答的逻辑步骤。在这个阶段,避免使用精确的语法,把重点放在使用想法或概念上。这样,你就试着用你的大脑去思考任何一种编程语言,而不是一种特定的语言。
</7-data-science-myths-that-we-should-leave-behind-in-2021-e5984f62d6fd>
№3:记忆语法
这与上面的错误有关,我认为这是初学者犯的最多的错误。“因此,我们经常试图学习新的技能,”编程专家说,“我们选择一种特定的语言开始,例如 Python、C++或 Java。”。
这三种编程语言有一些共同点,但它们的语法肯定不完全相同。所以,我的大多数学生试图坐下来记忆特定编程语言的语法,记忆函数,不同的做事方法,以及可能的库。
他们通过这样做来思考,他们可以有效地解决任何给定的问题,因为他们可以回忆起他们需要的所有工具。但这不是真的,它只是强迫你在一种编程语言的框架内思考。所以千万不要背语法;如果需要的话,你完全可以用谷歌搜索。
№4:没有投入足够的时间学习基本面
编程本质上是寻找一套有效的步骤来解决一个特定的问题。这组动作就是我们所能计算出的算法。学习如何把一个问题清晰地表达成一系列步骤,本质上就是学习编程。花时间解决问题,在考虑编写代码之前,先找到解决各种问题的步骤。
一旦你习惯了写算法,你就可以开始考虑把你的算法写成代码了。在这个阶段,尽可能多地使用伪代码,因为如果你掌握了这一点,你就可以用任何编程语言编写代码。
</6-new-awesome-features-in-python-3-10-a0598e87689f>
№5:匆忙进入应用程序
这就是为什么人们会犯前面 4 个错误的原因。当人们开始学习编程时,你是有目的的。通常,进入任何技术分支并学习如何编码通常是任何分支学习旅程的前 5 步。
所以,当你在学习编程的基础知识时,你会努力以最快的速度学习,这样你就可以进入你所涉足的领域的核心。但是,我在这里的建议是花时间学习编写“为什么”,因为这不仅会在你将来进入该领域的高级部分时节省你的时间,而且还会给你在未来想要的技术领域之间转换的自由。
最后的想法
如果你正在考虑从事数据科学,你首先需要学习如何编程。当开始学习编程时,人们总是有这样的假设,即编程是复杂的,或者它只是达到应用程序构建技能水平的一个繁琐的步骤。
但是,作为一名编程教师,我总是鼓励我的学生先为了学习编程而教编程,然后再学习应用程序。这种心态将允许他们专注于编程,而不是将其视为旅程中的一步。因为一旦他们接受这种心态,他们将能够掌握编程,从而学习他们想要的任何技术分支。
我教孩子、青少年和成人编程已经有 6 年多了,通过这些年,我注意到我所有的学生都倾向于做一种模式,不管他们的年龄如何。本文探讨了初学者在第一次学习编程时经常犯的 5 个常见错误。
这些错误可能有助于你快速学会用特定的编程语言编程,但是它们不会让你有效地理解它。最重要的是,这些错误会妨碍你完全掌握编程的本质,以及写代码的真正意义。
为机器学习学习数学时要避免的 5 个错误
在你的学习方法中要避免哪些陷阱
罗马法师在 Unsplash 上拍摄的照片
如果你喜欢我的内容,并想获得更多关于数据或作为数据科学家的日常生活的深入知识,请考虑在这里订阅我的时事通讯。
作为一名数据科学家,机器学习是我们解决业务问题的主要工具,也是我们受雇于一家公司的一个原因。然而,仅仅使用机器学习而没有机器学习算法背后的任何数学知识就足够了吗?在我看来,你需要学习机器学习背后的数学。
以下是一些支持我观点的论据:
- 数学帮助你选择正确的机器学习算法。理解数学让你深入了解模型如何工作,包括选择正确的模型参数和验证策略。
- 通过产生正确的置信区间和不确定性测量值来估计我们对模型结果的信心需要对数学有所了解。
- 正确的模型会考虑许多方面,如指标、训练时间、模型复杂性、参数数量以及需要数学来理解所有这些方面的特征数量。
- 通过了解机器学习模型的数学,你可以开发一个适合你自己问题的定制模型。
即使我们知道数学有多重要,学习数学的主要问题是学习曲线有多高。根据我的经验,许多人放弃学习数学是因为他们陷入了阻碍他们发展的学习陷阱。
在这篇文章中,我想概述一下你在机器学习中学习数学时应该避免哪些错误。让我们开始吧。
1.不知道机器学习需要什么数学题目
开始学习数学是令人钦佩的,因为开始总是最难的。虽然意图是有的,但问题是在为机器学习而学习数学时,要确定知道哪个数学题目。毕竟,数学是一个广泛的话题。
我经常遇到的错误是,人们开始学习的数学题目没有触及机器学习需求和没有足够研究什么数学题目支持机器学习领域。我有一个经验,我问别人你如何开始为机器学习学习数学——他们的答案是打开他们的高中数学材料;显然,这是一个错误的学习起点。
我的建议是开始学习机器学习的这个基础数学题目:
- 线性代数
- 多元微积分
- 优化方法
为了支持你在这些数学主题上的学习过程,我会在本文末尾分享额外资源的链接。
2.没有寻求帮助
学习的责任在于你自己,但是向别人寻求帮助总是没问题的。当你不懂某些东西,尤其是数学时,这并不是一件可耻的事情。你看到所有的迷因都在那里;数学是你可能遇到的最困难的事情的化身。
我一直处于不理解书中呈现的数学概念的境地。我试图搜索所有的资料、论文和书籍,但不知何故,我就是不感兴趣。最后,我 决定向某人求助。毕竟,没完没了地寻找材料只是浪费时间。我的熟人解释说,机器学习的数学概念比我读过的任何材料都好,我完全理解他的解释,直到现在,它仍然铭刻在我的脑海中。
我真的鼓励每个人如果不明白就去寻求帮助,特别是那些在数据科学领域和机器学习数学领域开始他们旅程的人。你可以开始向社交媒体上你崇拜的人提问,比如 LinkedIn 或 YouTube。Stackexchange 或 Reddit 也是一个开始数学讨论的好地方,尽管这取决于人们是否会回答你的问题。然而,如果你有不明白的地方,试着寻求帮助。
3。不理解机器学习算法概念就跳到学习机器学习数学
你已经知道要学什么数学题目,但它仍然是一个宽泛的东西。请记住,我们希望学习机器学习的数学,而不仅仅是任何数学主题;这就是为什么我们需要把它和机器学习算法联系起来。
这是我早年曾经犯过的一个错误。我知道要成为一名伟大的数据科学家,我需要了解数学,所以我学习了线性代数。然而,我所学的并没有转化为理解机器学习数学,因为我无法将线性代数数学与机器学习数学联系起来。在这种情况下,我试图通过理解机器学习概念作为我的出发点来改变我的方法。
比如我学生时代,通过导入线性回归模型学习机器学习编码。我知道如何使用这个模型,但我不完全明白它是如何工作的。为了理解线性回归的概念,我开始寻找学习资料,并由此向我介绍了许多新的术语,如线性函数。当我开始理解线性回归概念时,我试图通过学习我发现的每个新术语中的数学概念来更深入地研究。用这种方法,我能够更好地理解数学。
4。专注于数据科学的数学,而不是机器学习的数学
虽然数据科学和机器学习是一个相互交织的主题,但它们本质上有不同的数学概念来支持它们。最根本的错误是学习一个专注于数据科学而不是机器学习的数学概念。
数据科学的数学和机器学习的数学有什么区别?这是目的。当我们学习数据科学时,该领域分析我们拥有的数据,并测试假设以验证我们的假设。这就是为什么我们在学习数据科学时经常学习概率和统计,因为我们依靠概率数学来进行假设检验。
但是,机器学习中的数学就不一样了。他们更关注作为我们使用的许多模型的基本过程的线性代数和用于数值优化的多元微积分,这几乎成为我们使用的机器学习算法的支柱。例如,逻辑回归基于线性函数(因此是线性代数)。通过最大似然估计优化系数(因此需要多元微积分)。
我不会说专注于数据科学数学是一个致命的错误,因为它在你的日常数据活动中仍然有用。此外**,在我看来,数据科学数学是你在学习更多机器学习数学之前需要了解的先决条件**。
5.困在“学生时代”的学习方式中
人类是习惯性动物,所以我们喜欢做我们最熟悉的事情。这包括我们的学习方式,我们被教导只使用笔和书来学习——这意味着我们只专注于理论和回答教科书上的问题。如果你打算专门从事机器学习学术界或者研究,这种学习方式没有错。然而,在工业案例中,你需要一种不同的方法。
在商业环境中,数据科学家需要有快节奏的、灵活的、适用的心态。为机器学习学习数学是相似的;你需要更多地关注数学背后的直觉和应用,而不是定理。当前的技术进步如此之大,以至于所有手工解决问题的费力工作都不再重要。依靠计算能力比在纸上写下每个方程更有意义。
此外,您可以使用 NumPy 之类的计算库来支持您的学习过程。这个软件包是为了让你的生活更轻松而开发的,所以你需要的所有方程式都已经在这个软件包里了。
用于机器学习的数学学习资源
如果有错误,肯定有正确的方法。如果你已经学会了在为机器学习而学习数学时要避免的错误,我想和大家分享一些额外的资源。
- 马克·彼得的《机器学习的数学》
- 加勒特·托马斯(2018)的机器学习数学
- 吉姆·赫夫雷昂(2020)的《线性代数》
- 舒尔曼和学院的多元微积分
- 机器学习的微积分 YouTube 视频
- 优化学习 YouTube 视频
- 杰森·布朗利的机器学习基础数学符号
结论
学习机器学习的数学很重要,原因有很多,尽管你可能会遇到一些学习陷阱;这些错误是:
- 我不知道机器学习需要什么数学题目
- 没有求助
- 不理解机器学习算法概念就跳到学习机器学习数学
- 专注于数据科学的数学,而不是机器学习的数学
- 停留在“学生时代”的学习方式
希望有帮助!
如果您没有订阅为中等会员,请考虑通过我的推荐订阅。
Python 编程中最强大的 5 个一行程序
编程;编排
这是您可以使用 Python 在一行中完成的事情
Python 提供了一组独特的特性!
Python 程序员使用它们以更 python 化的方式快速编写代码。
在这里,我正在讨论我在 1 分钟或更短时间内掌握的 5 个最强大的单行代码(当然你也可以)。
我说的 强大的俏皮话是什么意思??
这些单行代码将使你的程序干净、清晰、简短、易于理解和修改。
如果一行程序令人困惑,难以理解,那么它就不是一个 Pythonic 式的方法!所以,谨慎使用这个强大的工具!⚡️
让我们跳进来吧!
对于一行中的循环
根据 for 循环♻️的用途,有两种方法可以将其压缩到一行中。
- 如果 for 循环体只有一条语句,那么只需将所有内容写在一行中。
例如,印刷从 10 到 15 的所有数字的方块可以在一行中实现,
for k in range(10,16): print(k**2)
一行中的 For 循环|作者图片
- 如果使用 for 循环来填充或创建列表,那么使用 list comprehension。
在上面的同一个例子中,所有数字的平方列表可以创建为,
使用列表理解|图片作者
在这份快速阅读材料中,列举的理解,它的优点和缺点都用有趣的例子详细说明了。👇
💔-python-tricks-for-better-code-511c82600ee1>
在一行中分配多个变量
在 Python 中,可以在一行中将多个值赋给多个变量。举个例子,
一行中的多个变量赋值|作者图片
此外,您可以分配不同类型的值,如整数,浮点,字符串。🔸 🔹
例如,
在一行中分配多个变量|作者图片
更进一步,可以将多个值赋给单个变量。举个例子,
为单个变量分配多个值|按作者排序的图像
正如您在上面看到的,分配给单个变量的所有值构成了一个元组。
交换一行中的值
与其他编程语言不同,Python 在交换两个变量的值时消除了临时变量。
因此,两个变量的值可以在一行中交换。举个例子,
交换一行中的变量值|按作者排序的图像
这不仅限于两个变量,而是可以用任意数量的变量来完成。🏆这是一个有三个变量的例子,
交换多个变量值的一行程序|作者图片
关于交换值的更多信息可以在这里找到— 3 省时的 Python 窍门 。
删除一行中的重复项
使用 Python 数据结构💡高效地删除重复️in 单行。
当您有一个重复值的列表时,这里有一个优雅的技巧来删除重复值。简单来说,把列表转换成集合就完成了!
举个例子,
在 Python | Image by Author 中移除一行中的重复项
在一行中导入所有库
这一行代码在我的代码中总是节省了几行。⏳
pyforest 就是解决方案!!
***pyforest***
是一个 python 包,它在一行中导入了所有常用的包。它不是预装的,因此只有第一次使用时,你需要安装它。
pip install pyforest
与其将每个库都导入到你的程序中,不如写在一行下面,这样你就可以避免所有思考和导入所需库的麻烦。
import pyforest
导入pyforest
后,pd.DataFrame()
、np.arange()
、sns.countplot()
、sys.exit()
等常用 Python 包中的所有函数都可以直接使用。
dir(pyforest)
会给你pyforest
导入的 105 包的完整列表。🍀
Pyforest 导入的包列表|图片作者
总结一下,
我发现在使用 Python 进行数据分析以及复杂的自动化任务时,这些一行程序非常方便。其中一些比如pyforest
不管任务是什么都有用(我不建议使用它,因为如果你在协作项目中工作,它会降低代码的可读性),而其他比如for
循环一行程序在某些情况下是好的。
🚩使用一行程序时,你应该记住 PEP-8 关于一行中最大字符数的准则,即 79 个字符。
现在你可以通过 在这里报名 成为媒介会员,阅读我和其他作家发表的所有故事。如果你这样做,我会得到你的费用的一小部分。欢迎加入我的邮件列表来了解我写作的最新进展。
感谢您的阅读和投入时间!!
Python 编程中最可靠的 5 个函数
编程;编排
Python 函数提高了您的生产力,保持您的代码干净、清晰、简短!
照片来自 Pexels
Python 提供了一堆内置函数!
Python 程序员使用它们快速、清晰地以更 python 化的方式编写代码。
在这里,我正在讨论我在 1 分钟或更短时间内掌握的 5 个最强大、最快的内置函数(当然你也可以)。⏳
我在我的项目中经常使用它们来使代码更快,更容易理解。
这些内置函数将使你的程序干净、清晰、简短、易于理解。
让我们跳进来吧!
地图功能
函数对 iterable 中的每一项应用指定的函数。其语法本身是不言自明的。
map(function,iterable)
例如,让我们创建一个函数来返回一个大写的输入单词。然后将这个函数映射到列表中的每一项。
Python | Image 中 map()函数最简单的例子作者
就是这样!函数makeupper()
应用于列表colors
中的每个项目。
在我的上一个项目中,函数map()
比一个for
循环对列表中的每一项应用复杂函数要快 1.5 倍的⚡。
下面是一个简单函数的执行时间比较⏳。
按作者比较 map()函数和循环|图像的执行时间
随着执行速度的加快,map()
函数提高了代码的可读性。
枚举函数
有时,在使用迭代器时,我们还需要计算迭代次数。♻️
enumerate()是解决方法!!
enumerate()函数为 iterable 添加一个计数器,并以枚举对象的形式返回。这个对象可以直接在for
循环中使用,甚至可以转换成元组列表。
下面是它的语法:
enumerate(iterable, start=0)
一个iterable
必须是一个序列或者一些支持迭代的对象。由于 Python 是一种 0 索引语言,迭代计数器默认从 0 开始。当然,您可以更改迭代计数器的起始数。
让我们继续上一个函数中的颜色示例。
colors = ['red', 'yellow', 'green', 'black']
result = enumerate(colors)
在这个例子中,result
是一个枚举对象,可以直接在for
循环中使用,甚至可以转换成一个列表。
作者在 Python | Image 中枚举()函数
Zip 功能
zip()函数用于使用多个容器的相似索引,以便它们可以作为单个实体使用。
语法和定义一样简单:
它从每个容器或 iterable 中产生一个包含一个条目的元组。
让我们举一个两个列表的例子。
colors = ['red', 'yellow', 'green', 'black']
fruits = ['apple', 'pineapple', 'grapes', 'cherry']
在 for 循环中使用 zip()函数,
Python |作者图片中的 zip()函数
zip()常用于假设容器长度相等的情况。但是,如果容器长度不同,当最小的容器用完时,zip()
功能停止。下面是一个例子👇
使用 zip()函数当容器具有不同的大小或长度时,
Python 中的 zip()函数具有不同大小的 iterable | Image by Author
您可以通过zip()
函数传递列表、元组、集合或字典。
过滤功能
通常,我们需要处理一个 iterable 并提取那些满足给定条件的项。
filter()可以节省您的时间和精力!!
filter()
从一个 iterable 中提取元素,比如 list,提取的元素所在的元组是函数返回 true 的元组。
下面是一个语法:
filter(function, iterable)
为了更容易消化,我们举个例子。让我们创建一个函数来检查单词是否大写。然后使用filter()
从 iterable 中提取所有大写的单词。
作者在 Python | Image 中使用 filter()函数
这里是关于 滤镜() 的官方文档。
🚩学习如何使用 三元条件 在单行中定义函数。
λ函数
Lambda 函数用于创建匿名函数,即没有名称的函数。当我们需要创建一个函数来执行单个操作时,它们非常有用,并且可以用一行代码编写。它的语法是:
lambda parameters: expression
🎯Lambda 函数可以有任意数量的参数,但只能有一个表达式。
例如,lambda x: x+2
就是这样!!刚才我创建了一个函数,它有一个输入参数x
并添加了2
。
然而,正如您所看到的,这是一个匿名函数,不能在后面的阶段调用。因此,要在程序中随时调用它,lambda 函数可以像这样赋给一个函数对象,
add2 = lambda x: x+2
调用这个函数与调用用 def 关键字定义的函数完全一样。举个例子,
add2(10) # It will return 12 as output
Lambda 函数在某些情况下可以是一个很好的一行程序,例如 列表理解。
Lambda 函数作为列表理解|作者图片中的一行程序
如上图所示,newlist
是使用 lambda 函数用一行代码生成的。
总结一下,
我发现在使用 Python 进行数据分析以及复杂的自动化任务时,这些内置函数非常方便。其中一些如zip()
、map()
在很多情况下是有用的,而其他如Lambda
函数在某些情况下是最好的一行程序。
🚩5 个最强大的一行程序甚至可以进一步提高你的编码。
</5-most-powerful-one-liners-you-should-know-in-python-programming-c9d49a89b7f3>
现在可以通过 在这里报名成为中会员 阅读我和其他作家发表的所有故事。如果你这样做,我会得到你的费用的一小部分。请随意加入我的电子邮件列表来保持对我写作的更新。
感谢您的阅读和投入时间!!
2021 年必须知道的 5 个人工智能概念
人工智能|解释
这是你不想错过的。
道格拉斯·桑切斯在 Unsplash 上的照片
AI 应该通过复制我们的生物来模仿人类的智能吗?或者我们的心理生物学本质与人工智能无关,就像鸟类生物学与航空航天工程无关一样?
这是该领域的人们自其提出以来一直在思考的问题。我们想要建立智能系统,而我们人类可以说是唯一真正智能的物种。从我们身上寻找灵感难道不符合逻辑吗?然而,因为人工智能的构建模块与生物学的基本部件如此不同,我们难道不应该忘记人类,沿着我们的研究引领我们的道路前进吗?
没有人知道人工智能的未来会怎样。我们知道的是,现在的深度学习越来越接近类人认知。也许人类在智力方面并不特别,但进化给了我们一些独特的特征,我们在创建人工智能系统时最好考虑到这些特征。我们已经在这种环境中进化了几千年,慢慢适应了不变的自然法则。为什么不通过模拟我们的抛光机制来绕过这个过程呢?
在这篇文章中,我将谈论目前处于人工智能研究前沿的五个例子。每一个都至少松散地基于人类认知功能的某些方面。这些概念将是未来几年的核心,所以让我们密切关注它们。
变形金刚——人类的注意力
不久前,基于递归的架构主导了自然语言处理(NLP)。如果你面临一个自然语言处理问题——翻译、语音转文本、生成任务——你要么使用门控循环单元(GRU),要么使用长短期记忆(LSTM)。这两种架构是为处理顺序输入数据而设计的。例如,该系统可以将一个英语句子和每个连续的单词翻译成西班牙语。
这些模型的主要缺点之一是消失梯度问题。因为信息是按顺序处理的,所以当系统要输出第一个法语单词时,第一个英语单词只是被记住了。为了解决这一缺陷,研究人员在 2014 年引入了注意力机制。通过模仿认知注意力,神经网络可以衡量环境的影响。不再有信息丢失。
2017 年,谷歌的 AI 团队发表了开创性的论文 注意力是你所需要的全部 。它说:注意力机制强大到足以解决语言任务。我们不需要递归,也不需要顺序处理。他们发明了著名的变压器架构。变形金刚影响深度学习格局的方式只能与 2012 年辛顿的团队赢得 ImageNet 挑战赛时 CNN 在计算机视觉(CV)中的颠覆相媲美。
转换器的工作原理是并行处理一个句子中的所有单词(记号),并学习它们之间的上下文关系。与 LSTM 相反,变压器不按顺序处理数据。训练时间要短得多。如今,变压器是任何 NLP 任务的首选架构。甚至 CV 的科学家也开始将变形金刚应用于图像和视频问题。即使是卷积也不能幸免于关注。
从 2017 年到 2021 年,研究人员进一步开发了变压器,旨在解决各种缺点,提高性能。transformer-XL更大,允许系统在更大的上下文中学习依赖性。GPT-3——它建立在最初的 transformer 架构上——不能越过它的上下文窗口,这使得它没有记忆。改革者解决令人望而却步的培训费用。它提高了效率,减少了培训时间,同时实现了最先进的性能。
近年来,变形金刚最引人注目的一些应用是多任务人工智能,如谷歌的 BERT ,OpenAI 的 GPT 家族——其中 GPT-3 是毫无争议的明星——悟道 2.0 ,它保持着最大神经网络的记录。变压器也是新一代聊天机器人——Meena、 BlenderBot 2.0 或 LaMDA 背后的核心算法。它甚至涉足了生物学领域。几天前 DeepMind 宣布他们已经发布了 AlphaFold 2 的代码和数据库。一个有助于更深入理解蛋白质折叠的模型。
自我监督培训——人类学习
自 2012 年以来,有监督的深度学习系统一直主导着人工智能领域。这些系统从标记的数据中学习,以将新的实例分类到学习的类别中。我们投入大量资源对训练样本进行分类,以方便学习。然而,这些模式匹配系统不像我们一样学习。
强化学习更像我们学习的方式。这些系统生活在一个受限制的虚拟世界中,在这个世界中,它们可以做一组有限的动作来获得奖励。DeepMind 的研究人员几个月前发表了一篇论文,认为“奖励足以”实现通用人工智能。然而,并不是人们所做的一切都是为了优化奖励,就像增强人工智能所做的那样。更不用说我们世界的复杂性,每时每刻可能的行动数量,或者我们想要或需要的复杂性和细微差别。
出于上述原因,研究人员最近对无监督——或 自我监督——Yann le Cun 喜欢称之为学习——的范式产生了更多的兴趣。他认为我们的学习与这些系统相似(至少与其他范式相比)。人类通过观察和感知世界学到很多东西。这就是自我监督学习的意义。
【自我监督学习】就是在学习一个任务之前,先学习代表世界的思想。这是婴儿和动物做的事情*。[……]*一旦我们对世界有了很好的描述,学习一项任务就需要很少的试验和样本。”
- 监督学习系统学习在数据中寻找模式,而不关心世界。
- 强化学习系统学习优化奖励,而不关心世界。
- 自我监督学习系统需要代表世界来理解事物之间的关系。
这些系统可以从输入的可见部分中学习输入的隐藏部分。例如,如果你向一个自我监督的系统输入半个句子,它可以预测缺失的单词。要做到这一点,他们需要对事物之间的关系有更深入的了解(这并不是说他们理解世界的方式和我们一样,事实并非如此)。
对大量标记数据(监督学习)和不可计数模拟(强化学习)的需求是一个障碍。自我监督学习旨在解决这两个问题。这些系统在没有明确告诉它们必须学习什么的情况下学习。没有课。没有任务。
自我监督学习的一些重要成功都与 transformer 架构有关。例如,伯特或 GPT-3 已被证明在语言生成任务中非常成功。在许多 NLP 领域中,自我监督系统现在是最先进的。这些系统的一个显著缺点是它们不能处理连续的输入,例如图像或音频。
“人工智能的下一场革命将不会受到监督,也不会得到纯粹的强化.”
——扬·勒昆
即时编程——人际交流
低代码和无代码计划出现在几十年前,是对编码领域日益扩大的技能缺口的一种反应。创建好的代码和知道如何在设计-生产管道的不同点处理任务的技术能力是昂贵的。随着软件产品变得越来越复杂,编程语言也越来越复杂。No-code 旨在为非技术业务人员解决这一差距。这是一种绕过编码让任何人都可以访问结果的方法。
几年前,知道如何编码可以说和说英语一样重要。你要么知道要么错过了很多。工作机会、书籍和文章、论文以及其他技术工作…在未来,智能房屋(domotics)的比例将会增加。技术软件技能可能和现在一样重要,比如知道如何修理水管或坏掉的灯。
在无代码计划和人工智能的未来的交叉点上,我们有即时编程。GPT 3 是最著名的使用提示的人工智能系统。OpenAI 去年发布了 API,人们很快就认识到了提示的独特性。这是不同的东西;既不是与人交谈,也不是正式意义上的编程。Gwern 称之为的提示编程(Prompt programming),可以理解为一种新的编程形式。它不像无代码那样肤浅,因为我们用自然语言与系统交流——我们给它编程。它不像用 C 或 Python 编程那样技术性很强。
GPT-3 引起了研究人员和开发人员的注意,许多人被激励去发现它的缺点。一些人发现 GPT 3 号在应该成功的地方失败了。然而,格温证明他们错了。他认为我们应该像用英语编程一样接近 GPT 3 号。我们必须把它做好,不是每件事都顺利。他调整了提示,重复了测试,并成功地教会了 GPT-3 正确地完成任务。他说:
“*【提示】*是使用 DL *【深度学习】*模型的一种相当不同的方式,最好把它看作一种新的编程,其中提示现在是一个“程序”,它对 GPT-3 进行编程以做新的事情。”
GPT-3 激发了用英语编写系统程序的可能性。该系统可以理解我们的意图,并以一种它可以毫无疑问地解释它们的方式将它们翻译给计算机。
一个月前,微软——去年与 OpenAI 合作的微软——发布了 GitHub Copilot。该系统由 GPT-3 的后代 Codex 驱动,是一个强大的代码自动完成系统。微软看到了 GPT-3 在创建代码方面的潜力,以及它如何理解英语并将其转化为编写良好的功能性程序。除了其他功能之外,Copilot 还可以阅读用英语描述某个功能的注释,对其进行解释,并记下该功能。
GPT-3 和 GitHub Copilot 将无代码的承诺和即时编程的潜力结合到一个新时代,这将允许非技术人员进入编码世界。
即时编程的主要优势以及它会成功的原因是,我们人类已经进化到用自然语言交流,而不是用正式语言。英语有一系列我们凭直觉知道的规则。在我们理解我们正在使用的规则之前,我们学习正确地说话。我们不会发明规则,然后遵守规则。我们发现我们已经遵循的规则。
写 Python 或者 C 就不一样了。我们称它们为语言,但它们在很多方面与英语不同。计算机需要明确的、不可解释的命令来知道该做什么。编程语言有严格的语法规则,不能被破坏,否则程序不会运行。这没有捷径可走。在没有提示编程的情况下,如果你想与计算机交流,你必须学习它的语言。甚至像 Python 这样的高级语言也需要相当程度的技术专长,而大多数人都不具备。
即时编程是编码的未来:我们将能够用自然语言编写大多数东西。将会有中间系统来处理我们不精确的、细微的、充满上下文的思想和计算机需要工作的正式指令集之间的转换。
多模态——人类感知
直到最近,深度学习系统还被设计用来解决单峰问题。如果您想在机器翻译方面达到最先进的性能,您可以使用英语-西班牙语文本数据对来训练您的系统。如果你想战胜 ImageNet 挑战,你的系统必须在物体识别方面是最好的,除此之外别无其他。NLP 系统和 CV 系统是截然不同且不可混合的。
现在,研究人员从神经科学中获得灵感,试图模拟我们的感知机制,专注于创建从不同类型的数据中学习的人工智能系统。与其按照专业领域来划分系统,为什么不让它们结合来自视觉和语言来源的数据呢?短信里有信息。图像中有信息。但是在两者的交汇处也有信息。这种多模态系统的新趋势就是谷歌和 BAAI 今年分别用 MUM 和 Wu Dao 2.0 T5 所做的。这是试图让人工系统类似人脑的一个进步。
我们已经进化成了一个多模态的世界。我们周围的事件和物体产生不同种类的信息:电磁的、机械的、化学的……例如,一个苹果有颜色、形状、质地、味道、气味……这就是为什么我们的大脑是多感官的。我们有一套感知系统,可以捕捉世界的多模态性质(其他生物有不同的感知系统,允许它们感知我们在生物学上不知道的模式)。更有趣的是,大脑将来自感知通道的信息整合到现实的单一表征中。
这就是我们可以从给人工智能灌输这种能力中找到效用的地方。如果给一个模型一对文字图像可以让它更准确地表现世界,那么它的预测或行动就会更精确,也能更好地适应环境。这就是今天对智力的定义:“利用遗传能力和学到的知识理解和适应环境的能力。”
一个拥有相当于眼睛、耳朵和手的人工器官以及作为大脑的 GPT-3 的机器人将比任何现有的人工智能都要强大得多。大脑是所有处理发生的地方,但处理的数据也很重要。未来的人工智能系统将拥有传感器、控制器和执行器,它们以一种快速、准确和丰富的信息处理方式相互连接。
焦点仍然在以软件为中心的虚拟系统上,但是一些研究小组已经成功地集成了文本和图像数据。这些网络应该如何结合这两种类型的信息仍然是一个谜(人类也没有完全理解),但目前这些尝试已经成功了。 DALL E , CLIP , MUM , UC ,武道 2.0 就是活生生的证明。
多任务处理和任务转移——人类的多样性
监督和强化的人工智能系统是糟糕的多任务处理系统。即使是像 AlphaZero 这样被设计用来学习不同任务的系统,也必须为每个任务进行遗忘和重新学习。然而,自我监督系统在这方面更胜一筹。原因是他们接受的是任务不可知的训练。因为这些系统没有被明确告知从输入数据中学习什么,所以它们可以应用于不同的任务,而不需要改变参数。GPT 3 号就是这种情况。
GPT-3 最有力的特点之一是它能够用相同的砝码处理不同的任务。该系统不会在内部进行改变,以进行机器翻译、回答问题或生成创意小说。该系统是以无监督的方式从大多数互联网文本数据中训练出来的。但是它不知道如何运用它所学到的东西。在快速编程的帮助下,用户可以调节 GPT-3 来解决给定的任务。根据记录,GPT 3 号在几项未经训练的任务中达到了最先进水平。这就是多任务处理和任务转移的威力。
多任务系统可以将相同的输入应用于不同的任务。例如,如果我把“猫”这个词输入系统,我可以让它找到西班牙语翻译“gato”,我可以让它给我看一只猫的图像,或者我可以让它写一篇关于为什么猫如此怪异的文章。相同输入的不同任务。
这种想法经常与的少投学习结合在一起。有监督的深度学习系统在预先选择的一组类上进行训练和测试。如果一个 CV 系统已经学会了对汽车、飞机和船只图像进行分类,它只会在这三个类别上测试时表现良好。在少量(或零次/一次)学习设置中,系统针对新的类进行测试,而没有权重更新。
一个例子是在测试时向系统显示一辆自行车的三幅图像,然后要求它正常地对汽车、飞机、轮船和自行车图像进行分类。这很简单,因为我们已经在测试时展示了 3 个自行车的例子。一个学会了如何学习的系统(如 GPT-3)应该能够在这些极端情况下表现良好。GPT 3 号证明了这是可能的。而且它的表现也没有被监督系统羡慕的地方。
如果我们结合多任务和少镜头设置,我们可以建立一个系统,能够解决它没有训练过的任务。在这种情况下,我们不是在测试时向系统显示新的类,而是让它执行新的任务。在少数镜头设置的情况下,我们会展示几个任务是如何完成的例子。而且,在没有内部学习任何新东西的情况下,系统现在会被调整来解决新的任务。
例如,让我们以一个在巨大的文本语料库中训练的系统为例。在一次性任务转移设置中,我们可以写:“我爱你-> Te quiero。我讨厌你-> ___”我们通过向系统展示一个例子(一次性设置),隐式地要求系统将一个句子从英语翻译成西班牙语(这是一项未经训练的任务)。
想想看,我们人类是可以做到这一点的。我们是元学习者。我们不只是学会做任务,而是知道如何学会做新的任务。如果我看到有人在打扫房间,我会马上知道怎么做。我明白扫帚的运动必须方向一致才能清洁地板,我会努力协调手和脚,使过渡平稳。我们不仅仅在有人训练我们的时候学习。我们通过观察来学习。几杆任务转移就是这样。人工智能系统开始在这方面做得更好。
订阅我的免费每周简讯明日之心获取更多关于人工智能的内容、新闻、见解和思考!
此外,欢迎在 LinkedIn 或 Twitter 上发表评论和联系!😃
推荐阅读
</5-deep-learning-trends-leading-artificial-intelligence-to-the-next-stage-11f2ef60f97e> [## GPT-3 —全面概述
towardsdatascience.com](/gpt-3-a-complete-overview-190232eb25fd)
为了更好地进行数据分析,5 个必须知道的数据可视化
Altair:Python 的统计可视化库
帕斯卡尔·贝纳登在 Unsplash 上的照片
数据可视化是数据科学不可或缺的一部分。这对于探索和理解数据非常有用。在某些情况下,可视化在传达信息方面也比简单的数字好得多。
使用数据可视化技术可以很容易地发现变量之间的关系、变量的分布以及数据中的底层结构。
在本文中,我们将介绍数据分析中常用的 5 种基本数据可视化类型。我们将使用 Altair 库,它是 Python 的统计可视化库。
如果你喜欢其中一个用于数据可视化任务的库,我以前曾用 Seaborn 和 ggplot2 写过类似的文章。我建议浏览所有内容,因为在同一项任务中比较不同的工具和框架将有助于您更好地学习。
让我们首先创建一个用于示例的样本数据帧。
import numpy as np
import pandas as pddf = pd.DataFrame({
'date':pd.date_range(start='2020-01-10', periods=100, freq='D'),
'cat':pd.Series(['A','B','C']).sample(n=100, replace=True),
'val':(np.random.randn(100) + 10).round(2),
'val2':(np.random.random(100) * 10).round(2),
'val3':np.random.randint(20,50, size=100)
})df = df.reset_index(drop=True)df.head()
(图片由作者提供)
数据帧由 100 行和 5 列组成。它包含日期时间、分类和数值。
1.线形图
线形图显示了两个变量之间的关系。其中之一通常是时间。因此,我们可以看到一个变量是如何随时间变化的。股票价格、每日气温是线图派上用场的一些用例。
下面是如何用 Altair 创建一个简单的线图。
import altair as altalt.Chart(df).mark_line().encode(
x='date', y='val'
)
(图片由作者提供)
我们来详细说明一下语法。我们首先将数据传递给一个顶级图表对象。下一个函数指定了绘图的类型。encode 函数指定在绘图中使用哪些列。因此,我们在编码函数中写的任何东西都必须链接到数据帧。
Altair 提供了更多的函数和参数来生成更多的信息或定制的图。我们将在下面的例子中看到它们。
为了使上面的线图看起来更好,我们可以使用 scale 属性调整 y 轴的数值范围。
alt.Chart(df).mark_line().encode(
alt.X('date'),
alt.Y('val', scale=alt.Scale(zero=False))
)
(图片由作者提供)
为了使用 scale 属性,我们用 X 和 Y 编码指定列名(例如 alt。x)。零参数设置为“假”以防止轴从零开始。
2.散点图
散点图也是关系图。它通常用于可视化两个数值变量的值。我们可以观察它们之间是否有关联。
我们可以创建“val”和“val2”列的散点图,如下所示。
alt.Chart(df).mark_circle(size=40).encode(
alt.X('val', scale=alt.Scale(zero=False)),
alt.Y('val2'),
alt.Color('cat')
)
(图片由作者提供)
我们使用颜色编码来根据“cat”列分隔数据点。mark_circle 函数的 size 参数用于调整散点图中点的大小。
3.柱状图
直方图用于可视化连续变量的分布。它将值范围划分为离散的箱,并计算每个箱中数据点的数量。
让我们创建一个“val3”列的直方图。使用了 mark_bar 函数,但是我们以函数生成直方图的方式指定了 x 和 y 编码。
alt.Chart(df).mark_bar().encode(
alt.X('val3', bin=True),
alt.Y('count()')
).properties(title='Histogram of val3', height=300, width=450)
(图片由作者提供)
我们还使用了 properties 函数来定制大小和添加标题。
4.箱形图
箱形图提供了变量分布的概况。它显示了值是如何通过四分位数和异常值分布的。
我们可以使用 Altair 的 mark_boxplot 函数创建一个盒图,如下所示。
alt.Chart(df).mark_boxplot().encode(
alt.X('cat'),
alt.Y('val2', scale=alt.Scale(zero=False))
).properties(height=200, width=400)
(图片由作者提供)
A 中的值的范围小于其他两个类别。方框内的白线表示中间值。
5.条形图
条形图可用于可视化分类变量。每个类别都用一个条形表示,条形的大小与该类别的值成比例。
例如,我们可以使用条形图来可视化“val3”列的每周总计。让我们首先用熊猫图书馆计算每周总数。
df['week'] = df['date'].dt.isocalendar().weekweekly = df[['week','val3']].groupby('week', as_index=False).sum()weekly.head()
(图片由作者提供)
第一行从日期列中提取周数。第二行按周对“val3”列进行分组,并计算总和。
我们现在可以创建条形图。
alt.Chart(weekly).mark_bar().encode(
x='val3:Q', y='week:O'
)
(图片由作者提供)
结论
我们已经介绍了 5 种基本但非常实用的可视化类型。它们都是探索数据集和揭示变量之间关系的基础。
使用 Altair 可以创建更复杂、信息量更大和定制的可视化效果。它在数据转换和过滤方面也非常高效和强大。
如果你想更详细地学习和练习 Altair,这里是我以前写的 4 篇系列文章。
- 第一部分:牛郎星简介
- 第二部分:过滤和转换数据
- 第三部分:互动情节和动态过滤
- 第 4 部分:定制可视化效果
感谢您的阅读。如果您有任何反馈,请告诉我。
SQL 的 5 个必须知道的日期和时间函数
实例实用指南
SQL 是一种编程语言,关系数据库管理系统(RDBMS)使用它来管理带有标记行和列的表格形式的数据。
我们编写 SQL 查询从关系数据库中检索数据。查询可以像从表中检索所有条目一样简单。然而,这并不是一个理想的场景。
SQL 允许编写高级查询来过滤和转换数据。我们只能以期望的格式检索我们需要的数据。这比检索所有数据然后应用过滤和转换要高效得多。
SQL 还提供了许多函数和方法来执行数据分析,同时从数据库中获取数据。从这个意义上说,SQL 也可以被认为是一种数据分析工具。
在这篇文章中,我们将讨论 5 个用于日期和时间的函数。我将使用 MySQL 作为 RDBMS。尽管大多数 SQL 语法在不同的 RDBMSs 中是通用的,但重要的是可能会有一些小的差异。
我创建了一个 SQL 表,其中包含一些关于美国 YouTube 上热门视频的数据。这是 Kaggle 上可用的数据集的一小部分。该表被称为“趋势”,它包含以下关于 2018 年 1 月趋势视频的数据。
趋势表(作者图片)
1.日期函数
date 函数提取日期时间表达式的日期部分。例如,publish_time 列包含日期和时间部分。
mysql> select publish_time from trending
-> limit 3;+---------------------+
| publish_time |
+---------------------+
| 2018-01-01 15:30:03 |
| 2018-01-01 01:05:59 |
| 2018-01-01 14:21:14 |
+---------------------+
我们可以使用 date 函数提取 publish_time 列的日期部分。
mysql> select date(publish_time) from trending
-> limit 3;+--------------------+
| date(publish_time) |
+--------------------+
| 2018-01-01 |
| 2018-01-01 |
| 2018-01-01 |
+--------------------+
2.时间函数
时间函数类似于日期函数,但它提取时间部分。
mysql> select time(publish_time) from trending
-> limit 3;+--------------------+
| time(publish_time) |
+--------------------+
| 15:30:03 |
| 01:05:59 |
| 14:21:14 |
+--------------------+
3.Datediff 函数
顾名思义,datediff 函数计算两个日期之间的差值。该表包含视频的发布和趋势日期。datediff 函数可用于查找它们之间的差异。
例如,以下查询返回视频发布和成为趋势之间差异的前 3 个值。
mysql> select datediff(trending_date, date(publish_time)) as diff
-> from trending
-> order by diff desc
-> limit 3;+------+
| diff |
+------+
| 28 |
| 27 |
| 26 |
+------+
datediff 函数接受两个日期作为其参数。因为 publish_time 列包含日期和时间,所以我们应用 date 函数来访问它的日期部分。order by 子句按降序对差异进行排序。最后,我们通过将限制设置为 3 来显示前三行。
我们还可以根据发布日期和流行日期之间的差异对视频进行分组。以下查询根据视频数量返回发布日期和趋势日期之间的前 3 个差异。
mysql> select count(*) as qty,
-> datediff(trending_date, date(publish_time)) as diff
-> from trending
-> group by diff
-> order by qty desc
-> limit 3;+-----+------+
| qty | diff |
+-----+------+
| 833 | 3 |
| 823 | 4 |
| 790 | 5 |
+-----+------+
大多数视频在发布后的 3、4 或 5 天内成为热门。
4.Now 和 curdate 函数
它们都是用来访问当前日期的。它们可以方便地计算一个观测值有多长时间了。now 或 curdate 函数可以与 datediff 函数一起使用,如下所示。
mysql> select avg(datediff(now(), date(publish_time)))
-> as avg_time
-> from trending;+-----------+
| avg_time |
+-----------+
| 1110.5513 |
+-----------+
我们计算了这些趋势视频的平均存在时间。在我们的情况下,这不是很有用,因为我们知道表中的所有视频都是在 2018 年 1 月发布的。然而,知道如何使用这些功能是很重要的。
5.工作日
有许多函数可以访问日期或时间的各个部分,如月份名称、星期、工作日、年份等等。我选择 weekday 函数作为例子。
我们可以根据工作日对视频的流行日期进行分组。
mysql> select count(*) as qty, weekday(trending_date) as wday
-> from trending
-> group by wday;+-----+------+
| qty | wday |
+-----+------+
| 780 | 0 |
| 793 | 1 |
| 614 | 2 |
| 634 | 3 |
| 818 | 4 |
| 820 | 5 |
| 816 | 6 |
+-----+------+
weekday 函数返回工作日索引。似乎更多的视频在周末而不是工作日成为热门。
再来做一个例子。顾名思义,weekofday 函数计算日历周。我们可以将它应用于趋势日期,如下所示。
mysql> select count(*) qty, weekofyear(trending_date) as week_of_year
-> from trending
-> group by week_of_year;+------+--------------+
| qty | week_of_year |
+------+--------------+
| 494 | 1 |
| 949 | 2 |
| 1360 | 3 |
| 1352 | 4 |
| 1075 | 5 |
| 45 | 6 |
+------+--------------+
结论
我们已经介绍了 SQL 的基本日期和时间函数。你可以在 MySQL 文档中看到这些函数的完整列表。
这些函数非常重要,因为时间和日期是数据分析和处理的两个关键因素。
感谢您的阅读。如果您有任何反馈,请告诉我。
Python 集合上的 5 个必备操作
集合是 Python 的核心数据结构之一
蒂姆·福斯特在 Unsplash 上的照片
数据结构是 Python 脚本的构建块。它们以特定的方式保存或包含数据,以使脚本更有效地工作。因此,学习如何与数据结构交互是至关重要的。
集合是 Python 中的核心数据结构之一。集合是具有以下特征的对象的集合:
- 集合是无序的
- 集合包含不同的元素
- 集合中的元素必须是不可变的
由于集合是无序的,我们不能在集合上执行像索引和切片这样的操作。我们不能将可变对象(如列表)作为集合中的一个元素。集合的一个常见用例是从集合或序列中删除重复的元素。
在本文中,我们将讨论集合的 5 种常用运算。让我们从创建一个集合开始。我们可以在其他集合上使用 set 构造函数来创建一个集合。
mylist = ['A', 'A', 'B', 'A', 'C', 'B']
myset = set(mylist)print(myset)
{'A', 'B', 'C'}
我们已经基于列表创建了一个集合。该集合仅包括列表中的唯一元素。set 构造函数也可以应用于 numpy 数组。
import numpy as np
a = np.random.randint(0, 5, size=20)
myset = set(a)print(a)
[4 0 4 3 1 1 3 0 0 1 3 4 0 3 2 4 1 4 3 3]print(myset)
{0, 1, 2, 3, 4}
1.添加和删除元素
添加或删除元素是一个简单的操作。分别使用 add 和 remove 方法。
myset.add(5)print(myset)
{0, 1, 2, 3, 4, 5}
如果我们试图添加一个已经在集合中的元素,集合将保持不变,我们不会得到警告或错误。
myset.add(4)print(myset)
{0, 1, 2, 3, 4, 5}
remove 方法的用法是一样的。
myset.remove(4)print(myset)
{0, 1, 2, 3, 5}
2.更新集合
用另一个集合更新一个集合意味着将第二个集合中的元素添加到第一个集合中。考虑以下两组。
myset = set([0, 1, 2, 3, 5])myotherset = set([3, 4, 5, 6, 7])
我们可以用“myotherset”更新“myset ”,如下所示:
myset.update(myotherset)print(myset)
{0, 1, 2, 3, 4, 5, 6, 7}
update 方法非常有用,因为我们不需要担心两个集合中相同和不同的元素。
我们还可以用列表和元组等其他集合来更新集合。
myset = set([0, 1, 2, 3, 5])
mylist = [1, 2, 10,11,12]
myset.update(mylist)print(myset)
{0, 1, 2, 3, 5, 10, 11, 12}
3.组合集合
update 方法就地工作,这意味着它修改原始集合。在某些情况下,我们需要在不更新原始集合的情况下组合多个集合。union 方法返回两个集合的组合,因此我们可以将它赋给一个新变量。
myset = {'A', 'B', 'C'}
newset = {'B', 'C', 'D', 'E'}
newset2 = {1, 2, 3}combinedset = myset.union(newset).union(newset2)print(myset)
{'A', 'B', 'C'}print(combinedset)
{'A', 1, 2, 'D', 'E', 3, 'B', 'C'}
我们得到集合的组合(即并集),但原始集合保持不变。
在上例中,我们还看到了创建集合的不同方式。可以在花括号(" {} ")内传递元素来创建 set。
4.比较集合
两个集合可以根据它们包含的元素进行比较。issuperset 和 issubset 方法可用于比较两个集合。
假设我们有两个集合 A 和 B,如果 A 包含 B 中的所有元素,那么 A 是 B 的超集,在这种情况下,B 是 A 的子集。
A = {1, 2, 3, 4, 5}
B = {1, 4, 5}
C = {1, 4, 6}A.issuperset(B)
TrueB.issubset(A)
TrueA.issuperset(C)
False
集合 C 中的一个元素不在集合 A 中。因此,A 不是 C 的超集。
如果两个集合包含相同的元素,它们可以被认为是彼此的超集和子集。
D = {1, 4, 5}E = {1, 4, 5}D.issuperset(E)
TrueD.issubset(E)
True
5.交集与差异
集合的概念非常类似于数学中的维恩图。
(图片由作者提供)
我们可能对一组中的元素感兴趣,而对另一组中的元素不感兴趣。类似地,我们可能需要找到两个集合中的元素。差分和交集方法可分别用于执行这些操作。
A = {1, 2, 3, 4, 5}
B = {3, 4, 5, 6, 7, 8}A.difference(B)
{1, 2}A.intersection(B)
{3, 4, 5}B.difference(A)
{6, 7, 8}
在寻找交集时,集合的顺序无关紧要。但是,差额是根据订单计算的。A 与 B 的不同之处在于包含了 A 中有而 B 中没有的元素,反之亦然。
结论
我们已经通过例子演示了在集合上执行的 5 种常见操作。有更多的方法可以应用于集合。然而,对于大多数情况,我们在本文中介绍的内容已经足够了。
感谢您的阅读。如果您有任何反馈,请告诉我。
数据科学中熊猫的 5 个必备功能
大多数数据科学项目都在使用熊猫
斯蒂芬·莱昂纳迪在 Unsplash拍摄的照片
每个数据科学项目都是从数据分析开始的。当我们谈到数据分析时,熊猫是最受重视的玩家。Pandas 是一个 python 库,也因面板数据分析而闻名。
在本文中,我将分享一些你必须知道的得心应手的熊猫功能。这些是处理数据集中不同操作的最有用的函数。
我将参考的本文数据集是 Kaggle 的房价预测数据。你可以从这里下载。
先来看看我们的数据。
import pandas as pd
df = pd.read_csv("House data.csv")
资料截图
这是我们数据的样子。由于这是房价预测数据——我们有卧室、浴室、地板和其他因素,可以帮助我们决定任何规格的房子的价格。
现在让我们对这些数据应用一些 pandas 函数。
1.Count()函数
假设您想快速检查表中是否有空值。在这种情况下,count 函数为我们提供了其中有值的单元格的计数。
df.count()
计数功能
好消息是,我们的数据集中没有空值。所以,让我们指定一个空值,看看变化。
df.at[0,'price']= np.nan
分配空值后
现在,如果我检查计数,我会得到下面的结果。
用 null 计数
2.idxmin()和 idxmax()函数
这些函数返回满足所需条件的特定行的索引。
比方说想得到房价最低的房子的详细信息。应用数据子集化方法可以有多种方式。但是,最有效的方法是使用这些函数。
df.loc[df['price'].idxmin()]
通过运行上面的代码,我可以得到房子的详细信息,它的价格是最低的,如下所示。
所以,我们在联邦路市以零价格买了一栋三居室的房子。😁
我知道这是数据错误,因为我们在玩开源虚拟数据。但是,我认为你得到了东西。:)同样我们可以用idxmax()
来得到最高价格的房子。
如果呢?你有不止一个房子的最低或最高价格。在这种情况下,这些函数将返回第一个匹配项。在下一篇文章中,我们将看到如何处理这种情况。😉
3.cut()函数
假设你有一个连续值的变量。但是,根据您的业务理解,这个变量应该被视为分类变量。
cut()函数可以帮助您存储连续变量,方法是对它们进行排序,然后将它们存储在数据范围存储桶中。
在这个数据中,我想做一桶价格数据,因为价格值的范围是从 0 到 26590000。如果我能把它桶起来,那么做决定会容易一点。
pd.cut(df["price"], 4)
分桶数据
您还可以为每个存储桶分配标签,如下所示。
看起来不错!对吗?我们可以用它替换 price 列,也可以创建一个新的列。
4.数据透视表()
每个 excel 的人一定都在他们的数据中使用过这个函数。我们可以对熊猫做同样的事情。
假设我们想根据不同的卧室找到每个城市的平均房价。
**df.pivot_table(index="city" , columns="bedrooms" ,values="price" , aggfunc="mean")**
这里您可以找到空值,因为这是不必要的—每个城市都有两个卧室。这要看数据。
5.nsmallest()和 nlargest()函数
我们已经看到了如何使用 idxmin()和 idxmax()函数来获得最小和最大观察值。
如果呢?你想得到前 3 个最高价格的房子数据。在这种情况下,这些功能可以节省我们的时间。
df.nlargest(3, "price")[["city","price"]]
df.nsmallest(3, "price")[["city","price"]]
开始了。我们现在有三个城市的房价为零。😃
结论
嗯,那些是一些令人惊奇的熊猫功能。这些函数在您的日常数据科学任务中非常方便。
我希望你喜欢这篇文章。更多精彩文章敬请期待!
谢谢你的阅读!
以下是我的一些最佳选择:
https://better programming . pub/10-python-tricks-that-wow-you-de 450921d 96 a
https://towards data science . com/7-amazing-python-one-liners-you-must-know-413 AE 021470 f
走之前……
如果你喜欢这篇文章,并希望关注更多关于 Python &数据科学的精彩文章——请点击这里https://pranjalai.medium.com/membership考虑成为中级会员。
请考虑使用我的推荐链接注册。通过这种方式,会员费的一部分归我,这激励我写更多关于 Python 和数据科学的令人兴奋的东西。
还有,随时订阅我的免费简讯: 普朗加尔的简讯 。
操纵日期的 5 个必备 SQL 函数
SQL 实践教程。
如果你在我找到第一份工作之前问我数据科学家最重要的技能是什么,我的答案肯定是 Python。毫无疑问!
我现在是一名数据科学家,如果你问我同样的问题,我的答案仍然是 Python。然而,我有第二个想法。让我三思的是 SQL。
SQL 是数据科学家的必备技能。它主要用于查询关系数据库,但它能够执行更多。SQL 配备了如此多的功能,使其成为高效的数据分析和操作工具。
在本文中,我们将介绍 5 个用于操作日期的 SQL 函数。当处理涉及基于日期或时间的信息的数据时,它们会派上用场。
注意: SQL 被很多关系数据库管理系统使用,比如 MySQL、SQL Server、PostgreSQL 等等。尽管它们大多采用相同的 SQL 语法,但可能会有一些细微的差别。在本文中,我们将使用 SQL Server。
1.获取日期
顾名思义,getdate 函数给出今天的日期。我们来做一个例子。
DECLARE @mydate Date
SET @mydate = GETDATE()print @mydate
'2021-08-22'
我们创建一个名为“mydate”的变量,并将其值指定为今天的日期。
2.Dateadd
这个函数的名字甚至比前一个函数更容易理解。dateadd 函数用于向日期添加时间或日期间隔。
和往常一样,语法通过例子更容易理解。
DECLARE @mydate Date
SET @mydate = GETDATE()SELECT DATEADD(MONTH, 1, @mydate) AS NextMonthNextMonth
2021-09-22
第一个参数表示间隔,第二个参数是间隔的数量。第三个参数是基值。
DATEADD(interval, number of intervals, date)
我们也可以使用其他间隔。
DECLARE @mydate Date
SET @mydate = GETDATE()SELECT DATEADD(WEEK, -2, @mydate) AS TwoWeeksBeforeTwoWeeksBefore
2021-08-08
如果在间隔数前加一个减号,它会从给定的日期中减去指定的间隔。
可以添加基于时间的间隔,但我们需要使用日期时间变量。
DECLARE @mydate DateTime
SET @mydate = GETDATE()SELECT DATEADD(HOUR, 10, @mydate)
'2021-08-23 00:10:17.287'
3.Datediff
datediff 函数用于根据给定的时间间隔计算两个日期之间的差异。
DECLARE @mydate Date
SET @mydate = '2018-08-08'SELECT DATEDIFF(MONTH, @mydate, GETDATE())
36
mydate 变量保存值“2018–08–08”。在 select 语句中,我们计算这个变量和当前日期之间的差值。
就像 dateadd 函数一样,datediff 函数也接受其他间隔。
DECLARE @mydate Date
SET @mydate = '2021-10-08'SELECT DATEDIFF(DAY, @mydate, GETDATE()) AS DayDifferenceDayDifference
47
4.日期名称
datename 函数可用于提取日期的各个部分。例如,我们可以从日期中获取月和日的名称,如下所示:
DECLARE @mydate Date
SET @mydate = '2021-10-08'SELECT DATENAME(MONTH, @mydate)
OctoberSELECT DATENAME(WEEKDAY, @mydate)
Friday
5.年、月、日
年、月和日是独立的函数,但我认为最好将它们放在一起。
我们已经介绍了 datename 函数,它给出了月份和日期的名称。在某些情况下,我们需要数字形式的信息。年、月和日函数允许分解日期。
让我们做一个例子来演示如何使用它们。
DECLARE @mydate Date
SET @mydate = '2021-10-08'SELECT
Date = @mydate,
Year = YEAR(@mydate),
Month = MONTH(@mydate),
Day = DAY(@mydate)Date Year Month Day
2021-10-08 2021 10 8
我们现在可以访问给定日期的每个部分。
结论
操作日期对于数据分析非常重要,尤其是在处理时间序列数据时。SQL 提供了几个函数来使这个过程简单而高效。
本文中的函数涵盖了您需要对日期进行的大量操作。
感谢您的阅读。如果您有任何反馈,请告诉我。