在 5 分钟内建立面罩检测模型
使用可教机器
A 你难道不厌倦人们告诉你,如果你想成为一名数据科学家,你需要非常擅长数学吗?然后你看到你认识的一个数学/统计不如你的人在 Linkedin 上吹嘘他的机器学习技能。
你可以学习机器学习上的所有初学者项目,但当你想自己做一些事情时,你无法实现它,因为没有训练数据或你没有带 GPU?然后最终你对这个领域失去了兴趣,因为你体内的火因为缺乏动力而失去了它的力量。
我们都经历过。
被困住了太糟糕了。我明白了。你需要燃料来提升你的动力水平。
当你向世界展示你自己抽象想法的最终产品时,没有什么比这更令人兴奋的了。这里的意图不是给你另一个初学者教程“如何制作这个和那个令人敬畏的机器学习模型”,而是让你体验成功的滋味。
我向您保证,您可以在不到 5 分钟的时间内构建面具检测模型,而无需一行代码。归功于谷歌的可教机器。但是编码不是必须被称为机器学习工程师或者数据科学家吗?
不,更多的是关于你如何使用数据。它被称为“数据科学”而不是“编码科学”是有原因的。
究竟什么是可教机器?
Teachable Machine 是一个基于网络的工具,使得创建 machine 学习模型变得快速、简单,并且每个人都可以访问。- 可示教机器
可教机器允许任何人基于以下内容构建模型:
- 形象
- 声音的
- 姿势
图片由作者在 Canva 制作
为什么只有可教的?你就不能用训练前的模型吗?
绝对的!预先训练的模型从一开始就是好的和有效的。这就是为什么 Teachable 使用由谷歌支持的预训练模型来训练你的模型。
但更特别的是训练数据。Teachable 使您能够使用网络摄像头为图像和姿势模型创建自己的数据,并使用外部麦克风为音频模型创建数据。就这样?
绝对不是。它是由 GPU 计算支持的训练,你也可以通过点击一个按钮轻松地看到现场训练的表现。培训结束后,您可以同样顺利地导出模型,这样您就可以用它来做一些事情。
建立人脸面具检测模型的先决条件:
占用你 5 分钟时间。
循序渐进指南:
作者在 Canva 制作的图像
第 1 步-开始:
请转到可示教机器并点击get started
当你试图在人脸上建立面具检测时,很明显模型需要图像作为训练数据。因此,让我们继续操作并选择图像项目。
满足你的好奇心——你可以尝试使用 pose project,看看模型与 image project 相比表现如何。所涉及的步骤基本相同,所以你可以按照这里的指南。
点击图像项目,为下一步做好准备
步骤 2-生成训练样本:
建立模型最重要的是训练数据。如前所述,如果你想用 Teachable 建立一个模型,你不必太担心训练数据。
您可以从本地磁盘或 Google Drive** 上传**数据,如果您已经有了本地磁盘或 Google Drive,或者您也可以使用网络摄像头自己创建数据。
我完全推荐在这个项目中使用你的网络摄像头,因为你会体验到这样做的便利。
点击添加类别,您可以创建任意数量的标签。
对于这个项目,我们需要两个类
- 面具
- 没有面具
按作者生成培训数据
点击类名来改变它们。
接下来,点击网络摄像头按钮并按住录制生成图像。生成每个类大约 110 个图像,这应该足够这个项目。
戴上面具,左右移动头部,使其能够识别来自不同方向的图像,为面具类生成图像。
取下掩膜,对无掩膜类进行拍照。
就这样,你得到了带标签的训练数据。
第三步——培训模式:
只需点击Training
即可开始模型的训练。
你可以在参数 Epochs,批量大小,学习率上做些调整。
Teachable 的一个很酷的功能是你可以通过点击引擎盖下的来查看你的模型是如何被训练的。
使用默认设置和每个类别的 110 幅图像,模型通常只需不到一分钟就可以完成训练。
作者的培训模型图像
第 4 步—检查结果:
作者的模型输出检查
恭喜你!用于在不到 5 分钟的时间内训练一个令人敬畏的复杂机器学习模型。
是时候享受模型的乐趣并检查结果如何了。
您可以从模型输出 Gif 中看到,这两个类都产生了非常令人满意的结果。
模型能够识别我脸上的面具,当我把面具放在我的额头上时,它像预期的那样识别为无面具。
如果需要,您现在可以导出模型并在教学平台之外使用它。
结论:
如果像人工智能、机器学习、高级统计学这些高保真词汇吓到你了?不要担心,你所要做的就是从小处着手,选择像这样的项目,因为它们有点燃火花的力量,给你肾上腺素,让你继续前进,达到最终目标。
试一试,让我知道你是否用它做了什么有趣的项目。
你可以在不知道所有事情的情况下找到一份数据科学的工作
你可能很容易陷入一个陷阱,即你对数据科学的了解不足以找到一份工作,但通常这只是一个表象。
数据科学可能是一个非常模糊和令人生畏的话题。如果你在谷歌或 Reddit 论坛上搜索,你可能会很快被存在的大量信息淹没。其中一部分原因是因为从“商业分析师”到“机器学习科学家”的大量角色都属于这一范畴。它也是该领域相对较新且不断变化的进步的产物。对于那些即将毕业或希望开始数据科学职业生涯的人来说,这可能是势不可挡的,在许多情况下,甚至是失败的。
虽然看起来许多公司都在要求入门级职位的所有技能和能力,但事实上,不知道所有事情也可以开始工作。
作为 A 型的人,我总是追求完美,结果往往是“失败”。当我开始学习“数据科学”时,我想知道每个主题的一切,这通常使我很难深入任何主题。我不断问自己“有更好的选择吗?”当我开始一个项目或一个在线课程时。作为一名年轻的、有抱负的数据科学家,我想做最好的选择,这样公司才会注意到我。这不仅事与愿违,还浪费了我本可以用来学习新技能的大量时间。
所以我给任何进入这个领域的人的第一条建议是选择一个起点,并坚持下去。有更好的地方吗?也许吧。但是你最好开始一条路线,而不是不断地试图选择一条。
回到我的背景。在我大学期间,我换了 4-5 次专业,实际上直到最后一年我才接触到数据科学。我开始专注于计算机科学,最终转型,因为我发现数据科学是数学和编程之间的一个很好的平衡。进入大四时,我名下的数据科学实习、工作经验和项目都为零。我花了一年时间专注于我的课程,并试图从每个项目中获得最大收益,而不是把我自己的个人项目堆在上面。一遍又一遍地重复做简单的项目帮助我熟悉了探索性分析、数据可视化和将结果转化为实际意义的基本步骤。
对于我的顶点项目,我选择将重点放在使用神经网络进行基因组分析上。设置相对简单,但提供了对一种机器学习技术的大量接触,而不是试图同时学习所有技术。当然,最终我会继续学习决策树、支持向量机和随机森林,但是花更多的时间学习一种方法的来龙去脉让我对神经网络如何工作以及如何将它们应用到实际问题中有了更深刻的理解。
因此,我的第二条建议是选择一个主题作为重点,而不是试图在简历中塞满流行词汇。花一两天的时间研究一个主题可能会让你对很多东西都知之甚少,而不是对少数几个有深刻的理解。
最后是实际申请工作的过程。提醒一下,我仍然没有数据科学方面的工作经验,但现在有几个基本项目要谈。我发出了很多申请(我怎么强调“很多”都不为过),并有幸获得了几次面试机会。最终,我在塔吉特百货公司做了一名数据分析师。
自从开始我的角色,我已经能够应用我在大学里获得的许多技能,同时也学习了一大堆新的技能。很多时候,我学习一项技能是因为在工作中遇到了问题,而不是简单地寻找“下一个伟大的数据科学主题”。大多数时候,我仍然觉得自己知之甚少。Reddit 和数据科学博客的世界仍然让人觉得每个人都知道一切(显然这不是真的)。
所以对于那些觉得自己不够资格或者知道得不够多的人来说…
- 你可能知道很多。
- 你将在工作中学到比在学校更多的东西。
- 没有人知道一切,如果他们说他们知道,他们在撒谎。
有趣的是,这里有一堆我简历上没有的技能,这些技能似乎成为了很多职位的必备条件:
- SQL(说真的)
- Hadoop
- 火花
- 云计算
- 数据管道
- Postgres,MongoDB,MySQL 等等…
- 任何训练营或在线课程的认证
- 码头工人
你可以通过这些 YouTube 视频了解 GPT 3 号
GPT-3,作者图片
回顾
通过这些 YouTube 视频,在不到 3 分钟的时间里了解 GPT 3 号
GPT 3 是当前人工智能行业的热门话题。社区对其解决基于文本的任务的潜力和应用感到惊讶;而其他人则认为这只是典型的媒体驱动的人工智能炒作。
无论你支持哪一个阵营,至少对 GPT 协议-3 有一个基本的了解是至关重要的。
为了获得一些信息,我通读了一些总结 GPT-3 主要方面的文章。现在,我浏览了 YouTube 上的几个视频,这些视频很好地展示了 GPT-3,足以在最初的三分钟内理解语言模型。
下面是四个 YouTube 视频,我相信会让你对 GPT 3 有基本到中等程度的了解,并在这个过程中,学习一两件关于语言建模和变形金刚的事情。
GPT-3——用通俗的语言解释。
难度:容易
时长:4 分 57 秒
回顾
主持人提供了 GPT-3 的简要说明,并对 GPT-3 中的参数数量与其他语言模型参数(包括旧版本的 GPT)进行了比较。
我欣赏使用可视化图表来传达关键信息,并补充短片中的要点。
更不用说,视频中还有 GPT-3 生成的文本和应用程序的示例。
该频道主持人避免使用技术术语来解释 GPT-3,这使得这个简短的视频容易为普通观众所理解。
你可能不需要有机器学习的经验或任何技术背景,就可以获得一些关于 GPT-3 及其早期应用的坚实基础知识。
该视频不仅提到了 GPT-3 的优点。有一个关于 GPT-3 语言模型缺点的陈述,并提供了一个例子。
OpenAI 的新语言生成器:GPT-3 |这个 AI 从单词中生成代码、网站、歌曲&
难度:容易
时长:6 分钟
回顾
这段视频非常简洁,但演示者确实提供了 GPT 3 号的简要背景。
我之所以包括这个视频,是因为它增加了几个应用程序,显示了如何利用 GPT-3 来完成各种任务。视频的一半只是展示了用 GPT-3 构建的应用程序。
OpenAI 的新语言生成器:GPT-3 |这个 AI 从单词中生成代码、网站、歌曲&
GPT3:一个更大的语言模型——计算机爱好者
难度:中等
时长:26 分钟
回顾
该视频中的主持人详细介绍了新 GPT 协议和语言模型的其他方面,如培训方法、未来潜力、改进等。
我很欣赏演示者后退一步谈论 GPT-2 的事实。这样做是为了让观众了解 GPT-3 给人工智能社区带来的进步和改进的水平。
还有一个关于 OpenAI 构建一个健壮语言模型的策略的一般观点的论述,该策略是利用一个具有大量权重参数的模型架构,并在空前数量的文本上进行训练。
这个视频可能不适合所有人,因为主持人使用了技术术语,这些术语在整个视频中没有解释。这个特定的 GPT 3 视频的观众可能是具有自然语言处理和语言建模基本背景的人。
此外,还包含一些短片,介绍了通过实施和培训新 GPT 协议而实现的潜在改进空间。
主持人的对话确实让观众了解了语言建模研究工作开始采取的总体策略,即“越大越好”。
我发现有用的一个关键点是,它包含了对 GPT-3 研究论文的浏览,对论文中包含的人因准确性评估报告的结果进行了总结和解释。这一点很重要,因为它向观众提供了 GPT 3 号性能的背景。
主持人对观众进行了一项实验,观众必须猜测哪首诗是 GPT 3 号创作的,哪首是人类创作的。视频最后给出了答案。
一般来说,视频的前半部分涵盖了 GPT 3 号所需的基本信息,后半部分探索了其他领域,如应用、计算机资源、创造力、潜力和未来用途。
GPT-3:语言模型是一次性学习者(论文解释)
难度:中等难度
时长:1 小时 4 分钟
回顾
Yannic Kilcher 的这段精彩视频用一个小时解释了 GPT 3 号研究论文中的内容。
没有多少 YouTuber 花了大量时间来深入解释 GPT-3 和提出迄今为止最大的语言模型的研究论文。
对 GPT-3 的具体技术内容感兴趣的机器学习从业者会发现这个视频很有用。
视频中介绍的论文中使用的技术术语有简要的解释,但这个视频不适合胆小的人。
对于那些不熟悉机器学习方法来解决语言建模的人来说,你可能会发现自己在一些外部资源之间来回穿梭,解释视频和研究论文中使用的技术术语。
Yannic 的 GPT-3 视频详细介绍了与 GPT-3 和语言建模相关的主题,如培训和评估方法、使用的数据集、变压器架构、上下文学习、GPT-3 模型的大小变化、一次性学习、少量学习等。
这个视频信息丰富,在整个视频过程中,你可能需要一支笔和纸。
增强你对最新炒作的人工智能模型:GPT 3 的了解
towardsdatascience.com](/articles-that-will-help-you-understand-gpt-3-610dedc37859) [## 根据吴恩达的观点,如何在机器学习的职业生涯中导航
了解如何在机器学习领域取得成功
towardsdatascience.com](/how-to-navigate-a-career-in-machine-learning-according-to-andrew-ng-stanford-lectures-9e10f09047f0)
深度学习的 SAR 去斑不需要清晰的图像
Speckle2Void 是如何学会停止担忧,爱上噪音的
来自 TerraSAR-X 的噪声 SAR 图像。
当想到卫星图像时,我们大多数人都会想到光学图像,即传感器捕捉地球反射的太阳光线形成的图片。但是光学图像并不是故事的全部!
合成孔径雷达(SAR)是一种基于主动照明的替代成像技术。基本上,卫星发送一束电磁波,并监听它从地面的反射。巧妙的处理技术将发射的波形与接收到的波形进行比较,可以生成一幅图像,显示地面是如何反射波的。合成孔径雷达必须被视为光学仪器的补充,因为它提供了光学仪器所不具备的能力。例如,合成孔径雷达可以看穿云层,因为它工作在电磁波谱的微波范围内,所以它不能被恶劣的天气所阻止。
然而,SAR 图像比它们的光学对应物呈现出更多的噪声,而且这不是普通的噪声。这种特殊的噪声称为 散斑 ,是 SAR 等所有相干成像系统所共有的。一个常用的模型认为散斑是一种倍增扰动,与真实地面反射率无关。
由于斑点是一种非常严重的干扰,并且限制了诸如目标检测或土地覆盖分类等任务的性能,因此去斑点算法已经被研究了将近 40 年。今天,深度学习承诺了新一代算法,可以利用卷积神经网络(CNN)强大的表示能力,以更忠实的方式恢复底层地面反射率。
我的地面真理在哪里?
CNN 的监督训练已被证明在解决包括去噪在内的各种问题方面非常强大,但它从根本上受到对地面真实数据的需求的限制。这对于我们的 SAR 去斑目标来说是一个关键问题,因为干净的 SAR 图像根本不存在。
早期的方法通过在光学图像或广泛用于图像识别的数据集(例如 ImageNet)上模拟散斑来绕过这个问题。这允许具有图像的噪声版本和相应的地面真相。
然而,这不是最佳的,因为 SAR 图像的特征可能与常规图像的特征显著不同。这在训练中使用的数据和将应用该算法的真实数据之间产生了一个域间隙*,并且它导致了降低去斑点图像质量的伪像。下图显示了一个简单的 CNN 在合成数据上以这种监督方式训练的例子。我们可以看到一些区域过于平滑,而其他区域则呈现出卡通般的特征。*
**
左:嘈杂的图像,右:监督 CNN 去噪。请注意由于使用合成斑点数据进行训练而产生的伪像。来自 https://arxiv.org/abs/2007.02075的数字。
斑点状 2
在过去的一年里,深度学习社区在无监督的情况下解决去噪问题方面取得了重大进展。像 Noise2Noise 、 Noise2Void 、 Noise2Self 等方法设计了不需要清晰图像的自我监督方法。一些方法,如 Noise2Noise(及其对 SAR 图像的扩展)需要同一场景的多种实现,这可能很难获取、注册和适应变化。另一方面 Laine 等人设计了一个贝叶斯框架,允许从单个噪声图像进行自我监督训练。 Speckle2Void 将该框架引入遥感领域,解决了 SAR 去斑时出现的一些问题。
建筑
Speckle2Void 架构。图来自https://arxiv.org/abs/2007.02075。
Speckle2Void 依赖于盲点 CNN,即特殊类型的 CNN,在与我们当前想要去噪的像素相对应的感受野中有一个洞。想法是网络应该从感受野预测干净像素的值。这是因为如果噪声是空间不相关的,就不可能预测像素的噪声分量。感受域中的洞是需要的,以确保像素本身被排除在这一操作之外,否则,它将平凡地复制自己的值。这是通过合适的架构实现的,如图所示,该架构使用标准卷积层,但对图像的旋转版本进行移位,以将感受野的扩展限制在一个方向。
训练和去噪
训练和去噪程序。图来自https://arxiv.org/abs/2007.02075。
在解释训练和去噪如何工作之前,我们必须介绍用于描述噪声和给定感受野的干净图像像素的条件分布的贝叶斯模型。实际上,训练的整个目标是让 CNN 学会如何处理感受野,以返回最适合噪声观察的干净像素分布的参数值。
噪声是倍增的,并且遵循伽马分布;给定感受野的图像像素遵循逆伽马分布,其参数由 CNN 估计。最后,这意味着观察到的噪声数据遵循称为 G0 的著名分布,该分布被认为是异质 SAR 图像的良好模型。
在训练期间,p(y)的对数被最小化,以让 CNN 学习如何使用感受野来产生最适合噪声数据的干净图像分布的参数。在测试期间,使用贝叶斯后验分布的平均值计算去噪图像,即:
你的斑点真的不相关吗?
虽然许多 SAR 图像模型通常假设散斑在空间上不相关,但在现实生活中这通常是不正确的,因为 SAR 聚焦系统的传递函数引入了一些相关性。这对于 Speckle2Void 是不利的,因为 CNN 可以找到一种方法来利用噪声中的相关性来复制它,从而降低去噪性能。这个问题可以用两种方法来解决:
1。通过使用诸如 Argenti 等人的技术去相关散斑;2
。用更大的盲点!盲点的宽度应该被调制以匹配散斑过程的自相关宽度。
结果
我们可以看到 Speckle2Void 是如何在保留图像细节的同时强烈抑制斑点噪声的。关键的是,它没有引入监督训练中观察到的那种伪影,因为它学习了如何直接从真实的 SAR 图像中提取相关特征。
**
左:有噪声的图像,右:用斑点 2 去噪。数字来自https://arxiv.org/abs/2007.02075。
结论
对于自监督方法来说,这是一个激动人心的时刻,越来越多的应用开始受益于直接使用真实数据,即使在没有监督信号的情况下。Speckle2Void 证明了即使无法观察到清晰的图像,也可以学习一种有效的 SAR 图像去斑算法。
你不需要总是在熊猫的行列中循环!
计算机编程语言
用向量化解决方案看一下“for 循环”的替代方案。
由@ siscadraws 创建(Instagram 句柄)
我用熊猫已经有一段时间了,但我并不总是正确地使用它。我执行计算或编辑数据的直观方法倾向于从这个问题开始:
我如何循环遍历(迭代)我的数据帧来做 INSERT_ANY_TASK_HERE ?
迭代数据帧中的行可能有效。事实上,我写了一整篇关于如何逐行编辑你在熊猫中的数据。
我这样做的原因是因为我有一个多层计算,对于我来说,我无法解决如何不循环。我有多个条件,其中一个条件涉及获取一个列值,该列值具有数据帧中另一个列的名称,该列将用于计算。
迭代数据帧是我能想到的解决这个问题的唯一方法。但是这不应该是你在和熊猫一起工作时总是采用的方法。
事实上,Pandas 甚至有一个红色的警告告诉你不应该迭代数据帧。
遍历 pandas 对象一般都是慢。在许多情况下,不需要手动迭代这些行,并且可以通过矢量化解决方案来避免:许多操作可以使用内置方法或 NumPy 函数、(布尔)索引来执行。
大多数时候,您可以使用一个矢量化解决方案来执行您的熊猫操作。矢量化不是使用“for 循环”类型的操作,即一次遍历一组数据中的一个值,而是实现一个解决方案,一次遍历一组值。在 Pandas 中,这意味着不是逐行计算,而是在整个数据帧上执行操作。
这里的重点不仅仅是代码在非循环解决方案下运行的速度,而是创建可读的代码,最大程度地利用 Pandas。
现在,让我们通过几个例子来帮助重新构建最初的思考过程,从“我如何循环通过一个数据帧?”真正的问题是“我如何用熊猫的工具进行计算?”。
我们将要使用的数据来自于 Kaggle 的一个动物穿越用户回顾数据集。我们将导入数据并创建两个数据帧,一个称为“旧”,另一个称为“新”。然后,为了开始了解 for 循环的替代解决方案的基础,我们将使用 for 循环和矢量化解决方案执行一些操作,并比较代码。(要理解下面 for 循环代码背后的逻辑,请查看我之前的一篇文章,因为它已经对这个主题有了深入的解释。)
import pandas as pdold = pd.read_csv('user_reviews.csv')
new = pd.read_csv('user_reviews.csv')
熊猫矢量化解决方案介绍
实现“如果-那么-否则”
让我们创建一个名为“qualitative _ rating”的新列。这样,我们可以创建一些宽泛的类别,将每个用户评论标记为“差”、“好”和“好”。“坏”评论是指“等级”低于 5 的评论。一篇好的评论将会是任何“等级”大于 5 的评论。任何“等级”等于 5 的评论都将是“好的”。
要使用 for 循环实现这一点,代码如下所示:
# if then elif else (old)# create new column
old['qualitative_rating'] = ''# assign 'qualitative_rating' based on 'grade' with loop
for index in old.index:
if old.loc[index, 'grade'] < 5:
old.loc[index, 'qualitative_rating'] = 'bad'
elif old.loc[index, 'grade'] == 5:
old.loc[index, 'qualitative_rating'] = 'ok'
elif old.loc[index, 'grade'] > 5:
old.loc[index, 'qualitative_rating'] = 'good'
代码很容易阅读,但是花了 7 行 2.26 秒完成了 3000 行。
相反,更好的解决方案应该是这样的:
# if then elif else (new)# create new column
new['qualitative_rating'] = ''# assign 'qualitative_rating' based on 'grade' with .loc
new.loc[new.grade < 5, 'qualitative_rating'] = 'bad'
new.loc[new.grade == 5, 'qualitative_rating'] = 'ok'
new.loc[new.grade > 5, 'qualitative_rating'] = 'good'
这一次,添加定性评级的代码仅由 3 行代码组成,仅用了 68 毫秒。“我也用过了。loc”data frame 函数,但这一次,我“恰当地”使用了它。我的意思是,我没有使用循环的“如果-否则”解决方案,而是直接从“如果-否则”中分配“坏”、“好”和“好”的定性评级。loc”选择。
计算列值的长度
我们的下一个新列“len_text”将显示每个评论的字符数,因此我们可以比较数据集中不同评论的长度。
要使用 for 循环实现这一点,代码如下所示:
# create column based on other column (old)# create new column
old['len_text'] = ''# calculate length of column value with loop
for index in old.index:
old.loc[index, 'len_text'] = len(old.loc[index, 'text'])
同样,2 行 2.23 秒对于这个计算来说并不算长。但是,我们可以使用只需要一行的解决方案,而不是遍历每一行来查找长度:
# create column based on other column (new)# create new column
new['len_text'] = ''# calculate length of column value by converting to str
new['len_text'] = new['text'].str.len()
这里,我们获取一个现有列的值,将它们转换成字符串,然后使用“.len()"来获取每个字符串中的字符数。这个解决方案只花了 40 毫秒运行。
基于多个条件和现有列值创建新列
现在让我们创建一个名为“super_category”的新列。在这里,我们将确定人们是否有资格成为“超级审阅者”,或者在这种情况下,他们的审阅长度是否大于 1000 个字符。如果评论“等级”大于或等于 9,我们还会将超级评论者标记为“超级粉丝”,如果评论“等级”小于或等于 1,则标记为“超级讨厌者”。其他人都将被归类为“正常”。
用 for 循环实现这一点将如下所示:
# new column based on multiple conditions (old)# create new column
old['super_category'] = ''# set multiple conditions and assign reviewer category with loop
for index in old.index:
if old.loc[index, 'grade'] >= 9 and old.loc[index, 'len_text'] >= 1000:
old.loc[index, 'super_category'] = 'super fan'
elif old.loc[index, 'grade'] <= 1 and old.loc[index, 'len_text'] >= 1000:
old.loc[index, 'super_category'] = 'super hater'
else:
old.loc[index, 'super_category'] = 'normal'
这是可行的,但是让我们把它分成两半:
# new column based on multiple conditions (new)# create new column
new['super_category'] = 'normal'# set multiple conditions and assign reviewer category with .loc
new.loc[(new['grade'] == 10) & (new['len_text'] >= 1000), 'super_category'] = 'super fan'
new.loc[(new['grade'] <= 1) & (new['len_text'] >= 1000), 'super_category'] = 'super hater'
这里,我们在我们的内部使用了“&”操作符。loc "函数来同时实现这两个条件。矢量化解决方案在 63 毫秒内完成,这再次明显快于循环方法,后者需要 2.23 秒。
这些是一些基本的操作,用来扩展现有的数据和一些我们自己定制的分析。是的,我们可以用循环做任何事情,你甚至可以看到相同的结构应用于许多不同的操作。但是 Pandas 自带了很多内置方法,专门用于我们经常需要执行的操作。
经历这些帮助我重新训练我的大脑,不要总是将 for 循环作为寻找更好的方法来完成各种操作的解决方案。
我希望它能帮助你做同样的事情!
你不必赢得一场 Kaggle 比赛来展示你的数据科学能力!
(图片由作者提供)
我曾经坚持认为只有 Kaggle 比赛的获胜者才能展示他们的背景,现在我发现 Kaggle 的每个新人都可以在没有像样的排行榜的情况下展示他们的努力!
我们可以用我们的作品在 Kaggle 比赛中做什么?获得一个体面的排名,并可能获得大量奖励,这个答案对一些天才来说可能听起来不错。但是你不够聪明怎么办?这场比赛会完全没有意义吗?肯定没有! Kaggle 作为数据科学家和机器学习爱好者的最大社区,不仅是为了排名和金钱,也是一个提高我们数据科学/建模技术的完美平台。
在文章的其余部分,我将介绍一种方法来展示你在 Kaggle 比赛中所做的事情,这是一个非常有用的组合,尤其是当你未能在排行榜上排名第一时,更重要的是给你的面试官留下深刻印象!
我要讲的是哪个比赛?
我最近参加了由萨斯喀彻温大学主办的 全球小麦检测 ,该项目旨在帮助农民在他们的田地里做出管理决策时评估健康和成熟度。该竞赛鼓励候选人尽可能提高图像中小麦籽粒的检测精度。直到编辑完这篇文章,本次比赛的№1 候选队伍已经取得了 0.7772 的成绩,这是比赛开展前的巨大飞跃,因为首发笔记本的成绩只有 0.66 左右。其截止日期为 2020 年 8 月 4 日。所以,如果你对计算机视觉感兴趣或者想赢得一些钱(一等奖 8000 美元!),你绝对没有理由错过!
全球小麦检测竞赛主页(图片由作者提供)
开始之前
如果你没有耐心通读整页(跟我一样:),现在就可以通过,直接去我的 GitHub repo:
https://github . com/MemphisMeng/global-wheat-detection-we B- app。
现在让我们来谈谈这个项目所需的依赖关系:
如果您不熟悉以上任何一个,请随意点击超链接并参考它们各自的文档。
最后一件值得注意的事情是,我将要建立的是一个面向 JPG 图像的麦穗检测器。换句话说,我会让模型告诉你一个图像中有多少个麦穗,它们位于哪里,只要你在应用中上传一个。
我们来编码吧!
首先,为了利用我在上一节中提到的所有库,需要做的就是简单地导入它们中的每一个:
**import** numpy **as** np
**import** pandas **as** pd
**import** re
**from** PIL **import** Image
**import** albumentations **as** A
**from** albumentations.pytorch.transforms **import** ToTensorV2
**import** torch
**import** torchvision
**from** torchvision.models.detection.faster_rcnn **import** FastRCNNPredictor
**import** streamlit **as** st
**from** torch.utils.data **import** DataLoader, Dataset
**from** matplotlib **import** pyplot **as** plt
**import** cv2
为了处理每一张上传的图片,我把它看作一个数据集,方便以后涉及 PyTorch 的操作。
**class** WheatTestDataset(Dataset):
**def** __init__(self, image, transforms=**None**):
super().__init__()
self.transforms = transforms
self.image = [image]
**def** __getitem__(self, index):
image = cv2.cvtColor(np.asarray(self.image[index]), cv2.COLOR_BGR2RGB).astype(np.float32)
*# st.write('image', image)
# image = np.asarray(self.image[index]).astype(np.float32)* image /= 255.0
**if** self.transforms:
sample = {
**'image'**: image,
}
sample = self.transforms(**sample)
image = sample[**'image'**]
**return** np.asarray(image)
**def** __len__(self) -> int:
**return** len(self.image)*# Albumentations* **def** get_test_transform():
**return** A.Compose([
*# A.Resize(512, 512),* ToTensorV2(p=1.0)
])
**def** collate_fn(batch):
**return** tuple(zip(*batch))
因此,我们可以这样加载图像:
test_dataset = WheatTestDataset(image, get_test_transform())
test_data_loader = DataLoader(
test_dataset,
batch_size=1,
shuffle=**False**,
num_workers=4,
drop_last=**False**,
collate_fn=collate_fn
)
之后,我还需要加载或配置神经网络模型。为了方便起见,我只是加载了基于 FasterRCNN 的预训练模型,你也可以在这里下载。因此,建模部分看起来像:
WEIGHTS_FILE = **'fasterrcnn_resnet50_fpn_best.pth' # downloaded weights** *# load a model; pre-trained on COCO* model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=**False**, pretrained_backbone=**False**)
device = torch.device(**'cuda'**) **if** torch.cuda.is_available() **else** torch.device(**'cpu'**)
num_classes = 2 *# 1 class (wheat) + background
# get number of input features for the classifier* in_features = model.roi_heads.box_predictor.cls_score.in_features
*# replace the pre-trained head with a new one* model.roi_heads.box_predictor = FastRCNNPredictor(in_features, num_classes)
*# Load the trained weights* model.load_state_dict(torch.load(WEIGHTS_FILE, map_location=device))
model.eval()
接下来,应该在网页上添加一些必要的元素:
st.header(**"""
WELCOME TO GLOBAL WHEAT HEAD CHALLENGE!
"""**)
st.subheader(**'Please open this website with Google Chrome.'**)
uploaded_file = st.file_uploader(**"Choose an image... (jpg only)"**, type=**"jpg"**)
confidence_threshold = st.number_input(**'Please specify the confidence of a wheat head'**)
button = st.button(**'Confirm'**)
最后,我们可以直接使用我们的模型来检测项目:
detection_threshold = confidence_threshold **or** 0.5
results = []
outputs = **None** images = **None
if** button **and** uploaded_file **is not None**:
image = Image.open(uploaded_file)
st.image(image, caption=**'Uploaded Image'**, use_column_width=**True**)
st.write(**""**)
st.write(**"Detecting..."**)
test_dataset = WheatTestDataset(image, get_test_transform())
test_data_loader = DataLoader(
test_dataset,
batch_size=1,
shuffle=**False**,
num_workers=4,
drop_last=**False**,
collate_fn=collate_fn
)
**for** images **in** test_data_loader:
images = torch.Tensor([images[0][0], images[1][0], images[2][0]])
images = torch.reshape(images, (3, 1024, 1024))
images = (images,)
images = list(image.to(device) **for** image **in** images)
outputs = model(images)
**for** i, image **in** enumerate(images):
boxes = outputs[i][**'boxes'**].data.cpu().numpy()
scores = outputs[i][**'scores'**].data.cpu().numpy()
boxes = boxes[scores >= detection_threshold].astype(np.int32)
scores = scores[scores >= detection_threshold]
boxes[:, 2] = boxes[:, 2] - boxes[:, 0]
boxes[:, 3] = boxes[:, 3] - boxes[:, 1]
**for** j **in** zip(boxes, scores):
result = {
**'Detected Boxes'**: **"{} {} {} {}"**.format(j[0][0], j[0][1], j[0][2], j[0][3]),
**'Confidence%'**: j[1]
}
results.append(result)
**if** len(results) != 0:
*# print out results* sample = images[0].permute(1, 2, 0).cpu().numpy()
boxes = outputs[0][**'boxes'**].data.cpu().numpy()
scores = outputs[0][**'scores'**].data.cpu().numpy()
boxes = boxes[scores >= detection_threshold].astype(np.int32)
fig, ax = plt.subplots(1, 1, figsize=(32, 16))
**for** box **in** boxes:
x1, y1, x2, y2 = box
sample = cv2.rectangle(img=sample,
pt1=(x1, y1),
pt2=(x2, y2),
color=(0, 0, 255), thickness=3)
ax.set_axis_off()
st.image(cv2.UMat.get(sample), clamp=**True**)
st.write(**"# Results"**)
st.dataframe(pd.DataFrame(results))
**else**:
st.write(**""**)
st.write(**"""
No wheat heads detected in the image!
"""**)
所以现在这个 web app 是在本地端完成的,所以当你在终端输入streamlit run app.py
的时候,你就可以在本地主机上访问和测试程序。
下一步是什么?
既然我们已经开发了这个检测工具,如果我们能与任何需要它的人分享它,那将是完美的。因此,将其部署为任何人都可以随时查看的 web 应用程序绝对是一个不错的选择。各种企业开发的 web 服务有一堆,现在我就以 Google 云平台为例。谷歌云平台( GCP )是谷歌提供的一套网络服务,包括一套管理工具和一系列模块化云服务。这一次,我们主要需要使用它的容器化和 GPU 服务。
我实现这一部分的策略与 Moez Ali 发表的这篇帖子中的任务 4 基本相同。需要注意的是,由于我们的项目使用 PyTorch 作为框架来配置神经网络模型,因此从 docker hub 导入已建立的 docker 映像总是更好,而不是要求主机在 requirements.txt 中安装。该选项的最大好处是它有效地节省了机器的内存空间。因此,完整的 docker 文件如下所示:
FROM pytorch/pytorch:1.4-cuda10.1-cudnn7-runtime
RUN pip install virtualenv
ENV VIRTUAL_ENV=/venv
RUN virtualenv venv -p python3
ENV PATH="VIRTUAL_ENV/bin:$PATH"WORKDIR /app
ADD . /app# Install dependencies
RUN apt update
RUN apt-get install -y libglib2.0-0 libsm6 libxrender1 libxext6
RUN pip install -r requirements.txt# copying all files over
COPY . /app# Expose port
ENV PORT 8501# cmd to launch app when container is run
CMD streamlit run app.py# streamlit-specific commands for config
ENV LC_ALL=C.UTF-8
ENV LANG=C.UTF-8
RUN mkdir -p /root/.streamlit
RUN bash -c 'echo -e "\
[general]\n\
email = \"\"\n\
" > /root/.streamlit/credentials.toml'RUN bash -c 'echo -e "\
[server]\n\
enableCORS = false\n\
" > /root/.streamlit/config.toml'
干得好!
现在我们已经成功地将该项目部署到 GCP,然后任何对你的工作感兴趣的人都可以从中得到乐趣。
网络应用网址:http://35.188.98.72/(图片由作者提供)
思想
我写这篇文章是因为我最近受到一个人的启发,他问我这个行业可以用我的 Kaggle 项目做什么。我曾经陷入这样一个陷阱:除非你在 Kaggle 上有一个像样的个人资料,否则你将无法找到一份数据科学的工作。这并没有错,虽然没有人可以定义你的体面。而那个人的话让我更多的为行业考虑,这应该是一个有志的数据科学家找工作应该具备的“体面”。
所以我努力发展自己的方式来展示我在 Kaggle 上所做的事情,试图让每个人都理解我的项目,并说服他们我的项目对他们的业务有价值,即使他们没有 IT 背景。把一个项目包装成一个网络应用程序,让每个人都能享受其中的乐趣,这是我现在最好的选择。
这是我的第一篇关于媒介的文章,如果你喜欢,请给我一个掌声,因为这将是你对我最大的鼓励。未来,我将发表更多文章,分享我的数据科学之路。所以有兴趣的请跟我来!
参考文献:
[1] Moez Ali ,在 Google Kubernetes 引擎上部署使用 Streamlit 和 PyCaret 构建的机器学习应用
[2]https://www . ka ggle . com/pesti peti/py torch-starter-fasterr CNN-推论
你不知道你不知道什么
这是对年轻且快速发展的数据挖掘领域(也称为从数据中发现知识,或简称为 KDD)的介绍。它侧重于从各种应用程序的数据中发现有趣模式的基本数据挖掘概念和技术。
来源: Pixabay
我们今天看到的世界拥有自动化的数据收集工具、数据库系统、万维网和计算机化的社会。这导致了数据的爆炸式增长,从百万兆字节增长到百万兆字节。
我们淹没在数据的海洋中,却渴望知识。
我们的新时代为我们提供了巨大的速度、数量和各种各样的数据。我们有更便宜的技术,移动计算,社交网络,云计算引发了这场数据风暴。
这些就是传统方法逐渐消失的原因,我们需要一些像数据挖掘这样的新方法来处理新时代的数据。
什么是数据挖掘?
数据挖掘是从海量数据源中发现新颖、有效、有用和可理解的模式和模型的迭代和交互过程。
打破数据挖掘的定义。
什么是知识发现?
从海量数据库中产生知识的整个过程称为 KD。这是一个比数据挖掘更复杂的过程。数据挖掘是知识发现的一个步骤,它处理数据中模式的识别。
让我们来分解一下 KD 的过程。
第一步。学习应用领域
我们应该预先了解我们将要发现知识的应用领域。据观察,具有先验知识有助于从数据中更好地产生洞察力。
第二步。数据清理
一旦我们从仓库中获得了数据,我们就需要去除噪声和不一致的数据。在知识发现过程中,可能要花费高达 60%的精力。
第三步。数据选择
我们创建一个数据集,从数据库中检索与分析任务相关的数据。
第四步。数据简化和转换
在这里,我们通过执行汇总或聚合操作,将数据转换并整合成适合挖掘的形式。我们找到有用的特征,进行维数或变量缩减,并使用不变表示。
第五步。数据挖掘技术
这是一个应用智能方法提取数据模式的重要过程。方法可以是总结、分类、回归、关联或聚类。
第六步。模式评估
我们基于兴趣度来识别和分离代表知识的真正有趣的模式。
第七步。知识展示
可视化和知识表示技术用于向用户或利益相关者呈现挖掘出的知识。
KD 和 DM 中涉及的步骤是 KD 的步骤之一(来源:elsevier.com)
可以挖掘哪些类型的数据?
数据挖掘可以应用于任何类型的数据,只要这些数据对目标应用程序有意义。挖掘应用最基本的数据形式是数据库数据、数据仓库数据、和事务数据。
数据库数据
数据库系统,也称为数据库管理系统( DBMS ),由一组相互关联的数据组成,称为数据库。
关系数据库是表的集合,每个表都被赋予一个惟一的名称。每个表都由一组包含大型元组集的属性组成。关系表中的每个元组代表一个由唯一键标识并由一组属性值描述的对象。
一个关于电子技术的关系数据库(来源:elsevier.com
数据仓库
假设一家成功的国际公司在世界各地都有分支机构。每个分支机构都有自己的一套数据库。公司总裁要求您提供一份公司第三季度每个分公司每个产品类型的销售分析。
为了便于决策,数据仓库中的数据是围绕主要主题组织的。
数据仓库的框架(来源:elsevier.com)
交易数据
通常,事务数据库中的每个记录都捕获一个事务,例如客户的购买、机票预订或用户对网页的点击。交易通常包括唯一的交易标识号( trans ID )和组成交易的物品列表,例如在交易中购买的物品。
使用的技术?
作为一个高度应用驱动的领域,数据挖掘结合了许多来自其他领域的技术,例如
KD 流程中使用的技术(来源:elsevier.com)
统计数字
统计学研究数据的收集、分析、解释和表达,与数据挖掘有着内在的联系。它包括对描述统计学、推断统计学或预测统计学以及统计假设检验的研究。
机器学习
机器学习研究计算机如何基于数据进行学习(或提高性能)。众所周知,它包括有监督学习、无监督学习、强化学习。
DM 中的重大问题?
数据挖掘是一个动态和快速发展的领域,具有很大的优势。这些问题中的许多在最近的数据挖掘研究和开发中已经得到了一定程度的解决,现在被认为是数据挖掘的需求,其他的仍处于研究阶段。
采矿方法
数据挖掘和知识发现涉及在多维空间中挖掘各种新的知识,处理数据的噪声、不确定性和不完整性。这似乎是一个两行的问题,但比我们能想到的更复杂。因此它们仍处于发展阶段。
此外,数据挖掘是一项跨学科的工作,因此我们需要许多领域的先验知识来解决问题。
用户交互
用户在数据挖掘过程中扮演着重要的角色。有趣的研究领域包括如何与数据挖掘系统交互,如何在挖掘中结合用户的背景知识,以及如何可视化和理解数据挖掘结果。
这还包括对挖掘数据的生动和灵活的表示,以便发现的知识可以被人类容易地理解和直接使用。
效率和可扩展性
在比较数据挖掘算法时,总是要考虑效率和可伸缩性。随着数据量的持续增长,这两个因素变得尤为重要。
让我们来欣赏…
数据挖掘和知识发现是理解数据和生成可供人类使用的模式的广泛方式。这也是一个反复的过程。我们需要多次思考、应用、评估,才能知道自己不知道的东西。
你不需要工作来获得数据科学经验
把硬币翻转过来
鉴于我目前的情况——最近被裁员了——我一直在考虑我是否真的想要另一个永久的角色,但这一次是作为一名数据科学家而不是机器学习工程师,或者我是否有能力独自成为一名自由职业者/承包商。
然而,重要的是我要不断发展我的技能,我知道在讨论个人发展时,现实世界的经验有多重要。
人们经常问的问题是“我如何在没有经验的情况下找到一份数据科学的工作?”然而,我想如果我能把这个问题反过来,我不仅可以发展我的技能,接触真实世界的数据科学,我还可以在这个过程中让自己更容易被雇佣。因此,这个问题的反过来应该是:
“没有工作,我如何获得数据科学家的经验?”
自愿参军
我知道这很难,但志愿者的职位比实习职位更容易获得,而且这是一种提高你就业能力的万全之策,尤其是如果你没有经验的话。当然,如果你有更重要的事情要做,比如要供养家庭、抵押贷款等,那么你可能需要做些兼职来补充,以确保你履行自己的职责。
成为一名志愿数据科学家也凸显了你性格中极其重要的技能,如承诺、主动性和强烈的职业道德——在一天结束时,你不会从别人可能赚取 6 位数收入的角色中获得任何经济上的满足——这些都是对潜在雇主有吸引力的非常宝贵的特质。
此外,从我整个八月份的志愿服务经历来看,我认为志愿服务有助于培养很多可转移的技能,例如团队合作、自信、时间管理、适应性、沟通和组织能力。
建立你的关系网
我觉得我好像在每篇帖子里都喋喋不休地说要建立一个社交网络,但是说实话,这真的很重要。
当你缺乏经验时,你认识的人和你知道的东西一样重要。
我一次又一次地提到,我通过我的关系网获得了我的第一份技术工作,我通过我的关系网获得了我的第一个志愿者角色,不管我下一步决定做什么,我确信我的关系网将发挥重要作用。我的关系网一直是推动我在这个领域前进的动力,因此我个人非常重视建立它。
如果你不确定如何在数据科学领域建立自己的关系网,你可能想要阅读关于最重要的数据科学项目的。
每个数据科学家都必须做的项目
towardsdatascience.com](/the-most-important-data-science-project-458d016ef8a6)
如果你在上大学,在毕业前充分利用你的人脉。如果你已经被雇佣了,问问他们是否知道有人需要帮忙处理他们的数据,因为你想在休息时间提高你的技能。
社交媒体使得建立和维护专业网络变得极其容易。你所要做的就是始终在场——无论是为开源做贡献,还是仅仅参与他人的帖子,或者两者兼而有之。在场!
强调你拥有的技能
我认为 LinkedIn 上做得非常好的人有阿布舍克·塔库尔、凯特·斯特拉赫尼和苏珊·沃什。
专注于你拥有的技能,这并不是说你不应该发展其他技能,但你会觉得你好像一直在追求,因为数据科学是一个很大的领域,总会有你不知道的东西。
使用职位描述作为对比来确定你所拥有的使你可以被雇佣的技能是一个好主意。
最近,我与一位在数据科学领域有丰富经验的非常有用的招聘人员交谈,他问我“你是哪种类型的数据科学家?”。起初,我被难住了,所以他给出了足球中不同类型前锋的比喻;在足球中,有些前锋喜欢持球带球,有些前锋喜欢跑在防守队员后面,有些前锋喜欢把两者结合起来,等等。
了解你是哪种类型的数据科学家,或者你愿意帮助强调你所拥有的技能!
你是一个强调机器学习的数据科学家吗?
你是强调深度学习的数据科学家吗?
你是一个强调数据清理的数据科学家吗?
你关注 NLP 吗?
你是一名强调数据可视化的数据科学家吗?
在我看来,拥有一项你可以强调的技能会让你从其他数据科学中脱颖而出,但这并不是不了解其他领域的理由——从事 NLP 的人可能会从学习计算机视觉中受益。
包裹
工作显然是积累经验的最佳方式,尤其是如果你周围有经验丰富的数据科学家。决定独自出去积累经验绝对是一个更艰难的选择,因此我不建议那些不愿意努力走这条路的人这么做。另一方面,我相信主动获取自己的经验从长远来看会产生更好的回报——如果做得正确的话——这绝对是愿意为自己的发展投入精力的人应该做的。
让我们在 LinkedIn 上继续这个对话…
[## Kurtis Pykes -人工智能作家-走向数据科学| LinkedIn
在世界上最大的职业社区 LinkedIn 上查看 Kurtis Pykes 的个人资料。Kurtis 有一个工作列在他们的…
www.linkedin.com](https://www.linkedin.com/in/kurtispykes/)
你不需要钱来创造一个深度学习环境
也不需要任何硬件,这一切都归功于“云”
介绍
如果你想直接开始训练复杂的模型,并成为一名认真的深度学习实践者,你将需要一件东西: 硬件 。具体来说,一个强大的 GPU ( 图形处理单元)就是你想要的 。相信我,我从未见过头脑简单的人只用一个 CPU 训练一个相当复杂的程序。然而,除非你口袋里有很多现金,否则访问哪怕一个 GPU 都不容易,也不便宜,更不用说有足够计算能力或内存来满足你的需求的 GPU 了。让我们严肃点,我们都希望拥有世界上所有的钱来生产多台 RTX 2080 Ti 以满足我们自己的需求。
预算紧张但又想追求深度学习怎么办?见鬼,如果你现在没有现金,你会怎么办?不要担心:有些地方可以免费开始,在那里你可以开始模型实验,并获得(尽管有限)一个完全成熟的 GPU。如果你的口袋空空如也,却不知道从哪里开始,这里有一些选项供你选择,所有这些都将为你提供一个 Jupyter(笔记本或实验室)环境来开始创建你的项目。
它将如何工作? 一些提供商会将您的定制环境的副本存储到他们的服务器中(也称为 云 )。其他人总是在每次启动时加载一个“通用”的环境,同时非常方便地安装额外的软件包。
在我们开始之前,这里有一些值得注意的趋势,你一定要记住:
- 你肯定需要一个互联网连接(废话!)
- 大多数(如果不是全部)选项通过每周更新配额和/或在长时间单次运行后自动关闭来限制您的 GPU 使用
- 其中一些将允许您“升级”您的云硬件。
话不多说,这里有一些 GPU 实例的最佳免费选项,可以启动您的深度学习实验!
注意 : 由于下面的所有选择都提供了一个相当不错的 GPU 开始,我将更多地关注每个提供的功能,而不是 GPU 的性能和统计。
图纸空间梯度
**提供的 GPU:**Nvidia Quadro p 5000、Nvidia Quadro M4000
最大运行时间(每次运行): 6 小时
**显著特性:**持久存储、基本容器、部署&项目定制/选项、出色的用户体验
在我个人看来, Gradient 的产品似乎是我尝试过的其他产品中最完美的。事实上, Gradient 直到 2019 年 10 月才向其用户提供免费层/选项,当时他们宣布了该服务。考虑到这一点,为什么前一点是这样的就不是巧合了。
Gradient 提供的一些更受欢迎的“基本容器”,每个容器都带有不同的预装物品或配置。
渐变提供了许多独特的功能。首先,它允许用户选择一个预先制作的环境设置(名为“基本容器”),该环境设置预装了一个特定的深度学习框架。比手动安装必要的包或者一开始就处理太多要好得多。
你通过 Paperspace 控制台访问你的笔记本( Paperspace 有除 Gradient 之外的服务),它最近获得了 40% 的性能提升。因此,浏览用户界面和笔记本(一旦加载)是一种非常愉快的体验。有了它的自由层,你一次只能运行一个笔记本,你运行的每个笔记本都有它自己的磁盘空间量,在多次运行后保持不变(尽管不清楚你被限制了多少空间)。此外,您只能在每台笔记本电脑之间共享最多 5 GB 的数据集、模型参数、输出等数据。,称为持久存储。
另一个需要注意的细节: 与其替代品不同,Gradient 的基本容器 中的大部分(如果不是全部的话)没有添加 Jupyter 笔记本或 lab 的自己的“味道”,这意味着您将有一个可以说是 更干净和更快的体验 在 Paperspace 控制台上工作。
以下是在 Paperspace 控制台下运行笔记本的样子。
Gradient 还允许你上传自己的模型进行训练,以及通过他们的 CLI 或 GitHub repo 打造新的深度学习项目。
如果你决定升级,Gradient 提供了大量不同价格的云 GPU 供你选择。此外,您还可以使用其他功能,例如取消 6 小时自动关机限制、增加永久存储空间,或者取消 1 台笔记本电脑的限制。
我对在自由层上运行 Gradient 的唯一不满是启动一个笔记本实例需要很长时间,尽管 Paperspace 声称性能有所提高。有时候,渐变告诉我,在打开笔记本之前,我必须等待。我相信这些是强加的限制,把免费用户和升级用户区分开来;尽管如此,对于许多开始尝试深度学习的人来说, Paperspace Gradient 是最好的免费选项之一。
谷歌联合实验室
提供的 GPU:英伟达特斯拉 K80,英伟达特斯拉 T4,英伟达特斯拉 P100 (:如果你很)**
最大运行时间(每次运行): 12 小时
显著特点: Google Drive & GitHub 集成,易于使用&运行,(优越)摩纳哥编辑/Intellisense
在我使用 Paperspace Gradient 之前,Colaboratory 是我在云 GPU 上制作和运行 Jupyter 笔记本的首选。Colab 由谷歌开发,一直是机器/深度学习爱好者和初学者的免费资源。最近他们在今年早些时候发布了 Colab Pro,这给了它的购买者一些便利的额外津贴,我们将在后面讨论。
Colab 比其他公司有更多的优势。例如,在 GPU 上制作笔记本和运行模型非常容易上手。如果你曾经使用过谷歌的工具套件(比如谷歌文档、工作表和幻灯片),那么制作和编辑 Colab 笔记本也有类似的感觉。另一个小但令人惊讶的细节是在笔记本单元中整合了摩纳哥编辑器智能感知。基本上,它与 Visual Studio 代码中使用的编辑器/intellisense 是相同的,我也经常使用和喜欢它(这可能是我偏爱 Colab 的原因)😛).
Colab 和摩纳哥智能感知在行动!
Colab 与 Google Drive 的深度集成,在我看来是一把双刃剑。一方面,你可以把一个数据集放到你的硬盘上,并且可以在你所有的 Colab 笔记本上访问,这很好。然而,这要求没有任何持久存储*,这意味着每次运行笔记本的新实例时,你都必须用代码片段从驱动器加载数据和/或文件。此外,事实上,Colab 通常依赖硬盘来永久存储数据,这意味着您正在为您的设置增加一层复杂性;简单地升级到 Colab Pro 并不意味着你会获得额外的存储空间,反之亦然。*
另一个小的,但值得注意的不便是 Colab 实际上重新映射了几乎所有的标准 Jupyter 键盘布局,似乎没有任何理由。😵
*Colab Pro 声称给用户 优先访问 更高端的 GPU,如 T4 和 P100。**优先接入不一定是接入。*你可以最终支付价格标签,只获得“普通”K80 GPU,或者你可以成为一名免费用户,幸运地获得一个笔记本电脑实例的更好设备。 无论如何,Colab 本身就是一个坚实的选择,可以通过免费的云 GPU 开始实践深度学习。
Kaggle 笔记本
***GPU 提供:*英伟达特斯拉 P100
最大运行时间(每次运行/每周): 9 小时/ 30 小时
***显著特点:*庞大的数据集目录,轻松导入 Kaggle 数据集,强大的社区支持&
Kaggle 字面上无需介绍。Kaggle 本身拥有大量数据集,你可以在那里的笔记本上轻松浏览和使用。Kaggle 成立于 2010 年,目前是谷歌的子公司。与列表中的其他人不同,Kaggle 没有需要付费的更高等级;每个使用 Kaggle 的人都是免费的。
Kaggle 的数据集目录,有一个投票系统。
Kaggle 最引人注目的特征之一是其庞大的数据集目录。它们涉及许多主题,从视频游戏到新冠肺炎数据。更好的是:将这些数据导入 Kaggle 上的笔记本非常快速简单。此外,Kaggle 非常适合满足您的竞争优势,因为它允许举办正式的数据科学竞赛,以获得疯狂的奖项——这是一种将深度学习应用于现实世界场景的好方法。
每个使用 Kaggle 笔记本的人都可以使用特斯拉 P100 作为他们的 GPU 。笔记本界面是 Jupyter 笔记本的一种高度定制的风格,以适应 Kaggle 的主题。你可以将你的笔记本分享给 Kaggle 社区*,有趣的是,Kaggle 中的大多数实体都有笔记本投票系统。谈到社区,从我的经验来看,这里的人们即使在比赛期间也非常乐于助人。见鬼,Kaggle 本身也提供编程和数据科学教程,称为“课程”。*
Kaggle 笔记本的标准界面。请注意,黑暗模式是可用的。如果你对标题感兴趣,看这里!
然而,我发现 Kaggle 最大的问题是笔记本界面。正如我所说的,Kaggle 给他们的笔记本添加了味道(或主题),以适应他们浅蓝色的材料配色方案。这对我来说是一个问题,因为它导致笔记本变得非常笨重,从长远来看处理起来很痛苦。且不说它破坏了 Jupyter 的一些功能: Shift+Tab 键盘快捷键,调出函数参数和文档,甚至不能正常工作!Kaggle 笔记本也有一个提交“功能”,这比不提交更令人头疼。如果你重新加载你的页面,有可能你所有的工作都回到起点。最后,根据我使用 Kaggle 笔记本的经验,与 Colab 或 Gradient 相比,让笔记本保持运行是不可靠的。
尽管有这些不便,如果你开始修补机器/深度学习模型,并希望有一个好的社区,Kaggle 仍然是一个显而易见的好选择。
结论
如果你现金不足,或者不愿意提前支付开始追求深度学习,有一些选项可以让你获得一个像样的 GPU 来增强你的模型训练等等。如果你本能地跳到这里,这里有一些选择:
- 图纸空间梯度
- 谷歌联合实验室
- Kaggle 笔记本
每一种都有各自的优缺点,但最终,我推荐从 Gradient 开始,因为它的整体抛光,巨大的部署定制,以及一旦需要更好的 GPU 时平滑的升级过程。从那里,我会推荐 Colab 的简单性和智能感知,或者 Kaggle 的社区和数据集。无论你选择哪家提供商,祝你的深度学习&数据科学事业好运!
掌握量子计算不需要成为数学家
作为程序员,你会做得很好
本文是本书的一部分: 用 Python 实践量子机器学习
关于量子计算的科学论文和教科书充满了数学公式。甚至关于量子计算的博客帖子也充斥着数学术语。它从你遇到的第一个概念开始。量子叠加:
作为一个非数学家,这个公式可能已经太多了。如果你不熟悉使用的狄拉克-符号(|ψ⟩),或者如果你不习惯使用向量,那么这样一个公式就像埃及象形文字一样好:
作者弗兰克·齐克特的图片
不要误解我。数学是描述技术概念的好方法。数学是一种简洁而精确的语言。相比之下,我们的自然语言,比如英语,既冗长又不精确。解释一小群数学公式需要一整本书的自然语言。
但是我们大多数人理解自然语言的能力远远强于数学。我们从小就学习母语,并且每天都在练习。我们甚至用我们的自然语言做梦。不过,我不知道有些人是否会做数学梦。对我们大多数人来说,数学充其量是一门外语。
当我们要学习新的东西时,如果我们使用母语,会更容易。理解这个新概念的含义已经够难的了。如果我们用外语学习,那就更难了。如果不是不可能的话。
当然,数学是量子力学和量子计算的母语,如果你愿意的话。但是为什么我们要只用量子计算自己的语言来教它呢?难道我们不应该试着用一种学习者更容易理解的方式来解释它吗?我会说“绝对”!
用学习者的语言教学并不意味着我们不应该看数学。我们应该!但是,当数学的精确性有助于我们解释事物如何运作时,我们就使用数学。
事实上,数学并不是我们唯一的精确语言。我们有像数学公式一样精确的语言。如今,这些语言对许多人来说几乎是自然而然的了。这些语言是编程语言。
我不是指特定编程语言的语法。相反,我指的是几乎所有编程语言共有的一种思维方式。从 Python 到 Java,从 Javascript 到 Ruby,甚至从 C 到 Cobol。所有这些语言都建立在布尔逻辑的基础上。不管使用什么编程语言,程序员都会大量使用布尔逻辑。
最突出的是布尔逻辑出现在条件语句:if then else
。
如果在 Python 中是 else
条件语句的if
部分是纯布尔逻辑。通常,它包含基本的布尔操作符not
、and
和or
。
如果某个陈述是True
,那么它的否定就是False
。反之,如果一个语句是False
,那么它的否定就是True
。如果一个语句由两部分P
和Q
组成,那么如果P
是True
而Q
是True
,那么P and Q
只是True
。但是如果P
或Q
是True
则P or Q
是True
。
下面是 Python 中布尔逻辑的三个例子。
Python 中的布尔逻辑
not P is False
P and Q is False
P or Q is True
P and not Q is True
虽然 Python 使用这些确切的关键字,但在数学中,符号代表这些运算符:
- 是指
not
- ∧表示
and
- ∨表示
or
如果你不是数学家,这些符号和你在量子机器学习过程中遇到的所有其他符号可能看起来很神秘。但是,虽然用 Python 或 math 描述概念时,概念的表示可能不同,但概念本身是相同的。
理解布尔逻辑不需要成为数学家。实际上,你也不需要成为一名程序员,因为我们甚至可以通过真值表来描述布尔逻辑。
我们有两个变量,P
和Q
。每个变量要么为真(T
),要么为假(F
)。根据它们的值的组合,我们可以推导出任何布尔语句的值。下图描述了P
、Q
、not P
、not Q
、not P and not Q
、not (not P and not Q)
和P or Q
的真值表。
作者弗兰克·齐克特的图片
这个真值表揭示了P or Q
等同于not (not P and not Q)
。这种逻辑等价告诉我们,我们甚至不需要运算符or
。我们可以用not (not P and not Q)
来代替它。
但是P or Q
简明易懂。
“如果我们的编程语言中没有 *or*
运算符会怎样?
精明的程序员会编写自己的操作符。
或的重新实现
P | Q | P or Q
--------------
T | T | True
T | F | True
F | T | True
F | F | False
这就是编程的意义所在。程序员编写产生某种行为的函数。他们使用并组合这些函数来创建更多的函数,表现出更复杂的行为。他们编写的整个程序可以归结为一组巧妙组合的函数。程序员用他们的编译器(或解释器)将高级函数翻译成非常基本的布尔逻辑。并且这种基本的布尔逻辑可以使用电气开关来执行。开关和它们的组合被称为门。当我们连接门时,它们形成一个电路。
在不连续的时间间隔内,计算机通过电路发送一个电脉冲。如果我们在适当的时间接收到一个电脉冲,我们将其解释为1
(真)。如果我们没有接收到脉冲,我们将其解释为0
(假)。
尽管有这个名字,电路并不是循环的。它们是线性的,从左向右读取。让我们来看一个例子,它对应于我们之前看到的布尔函数
下图描绘了not (not P and not Q)
的电路图。该电路从左侧接收输入,并将其输出到右侧。
作者弗兰克·齐克特的图片
这种门和电路是任何现代计算机的组成部分。这包括量子计算机。虽然量子力学的世界不同,但量子计算的世界惊人地相似。
不要让你自己被所有的数学公式弄得眼花缭乱。它们是概念的代表。不多也不少。
让我们回到我们的介绍性公式:
这是量子态|ψ⟩(“psi”)的数学符号。虽然经典比特的状态是布尔型的(或者0
表示假,或者1
表示真),但是量子比特(量子比特)的状态是由α和β加权的量子态|0⟩和|1⟩的叠加。
在这种叠加态下,量子系统既不是0
也不是1
,除非你去测量。只有当你测量量子位时,状态才会坍缩到0
或1
。两个权重(α2)和(β2)的平方表示测量0
或1
的概率。α越大,测量到0
的概率越高。相应地,β越大,测量到1
的概率越高。
这个公式说明了更多的东西。它说量子态是两个重量[α β]的矢量。
矢量是一个有大小和方向的地理对象。如果在坐标系中绘制,向量从中心开始,到向量中数字指定的点结束。
作者弗兰克·齐克特的图片
在 Python 中,向量是一个数组。因此,一个量子位的状态就是数组[alpha, beta]
。并且,alpha
和beta
是数值变量。量子态是两个数的数组。
但是由两个数字组成的数组是比布尔值更复杂的数据类型。布尔值为True
或False
。您可以用简单的运算符转换布尔值,例如not
、and
和or
。您可以推理真值表中布尔值的转换。
但是你如何转换两个数字的数组呢?你如何解释这种转变?
显而易见的答案是数学。但这不是唯一可能的答案。让我们用 Python 来做吧。
反转量子位状态
----------- Reversed states: ----------
psi: [0.50, 0.87] result: [0.87, 0.50]
|0>: [1.00, 0.00] result: [0.00, 1.00]
|1>: [0.00, 1.00] result: [1.00, 0.00]
我们从三个状态的初始化开始。每个状态都是由两个数字组成的数组。状态psi
的值为 1/2 和√3/2(第 4 行)。在这种状态下测量0
的概率是(1/2)2=1/4=0.25.测量的概率`1`是(√3/2)2=3/4=0.75.
状态always_0
具有值1
和0
。在这种状态下测量0
的概率是 1^2=1(第 5 行)。测量的概率1
是 0^2=0.当我们在这种状态下测量一个量子比特时,我们总是测量为0
。状态always_1
是各自的对立面。我们一直测量为1
(第 6 行)。
接下来,我们创建一个便利函数transform
(第 8-9 行)。我告诉过你编写函数使事情变得简单是编程的全部内容吗?这是一个例子。该函数采用量子态的名称(要显示的任意字符串)、state
和函数f
。transform
将初始状态和应用f
功能后的状态打印到控制台。
最后,我们创建一个函数reverse_state
,我们可以将它输入到transform
(第 11-12 行)。reverse_state
调用 Python 默认的reversed
函数,以相反的顺序返回相同长度的数组。
在输出中,我们可以看到状态数组中的数字交换了位置。这样,测量0
或1
的概率分别切换。反转的psi
有0.75
机会测量0
和0.25
机会测量1
。反转后的always_0
与原来的always_1
相似。
这只是三种可能的状态。在一种真值表中列出所有可能的状态是不可能的。但是我认为reverse_state
函数的行为非常清楚。这是量子计算中 X 门的行为。这是量子态的基本变换之一。
让我们在实践中看看这个门。我们用的是 IBM 的量子计算 SDK Qiskit 。
测量的量子位
作者弗兰克·齐克特的图片
Qiskit 的基本单元是量子电路。量子电路是量子计算的模型。这个项目,如果你愿意的话。我们的电路由一个量子位组成(第 5 行)。
我们用状态psi
(第 8 行)初始化我们的量子位,并对其应用 X-gate(第 11 行)。
Qiskit 提供了Aer
包(我们在第 1 行导入的包)。它为模拟量子电路提供了不同的后端。最常见的后端是statevector_simulator
(第 14 行)。
execute
-函数(也是我们在第 1 行导入的)以指定的backend
运行我们的量子电路(qc
)。它返回一个job
-对象,该对象有一个有用的方法job.result()
(第 17 行)。一旦我们的程序完成它,就会返回result
对象。
Qiskit 使用 Matplotlib 来提供有用的可视化。简单的直方图就可以了。result
对象提供了get_counts
方法来获取被执行电路的直方图数据(第 18 行)。
方法plot_histogram
返回一个 Jupyter 自动绘制的 Matplotlib 图形(第 19 行)。
我们看到我们有 75%的机会观察到值0
,有 25%的机会观察到值1
。与初始状态完全相反。
你可以用不同的初始状态运行电路来更好的感受这个门。
一般来说,量子电路与经典电路并无不同。我们可以用图表来表示它们。 Qiskit 的QuantumCircuit
类为我们提供了完成这项工作的draw
方法。
qc.draw('mpl')
作者弗兰克·齐克特的图片
我们可以看到我们唯一的量子位(q
),它与数组[0.5, 0.866]
的初始化,以及应用的 X 门。
即使不是数学家,你也已经完成了掌握量子计算的第一步。从概念上理解量子门是经典电路门的量子对等物并不依赖于数学。简单英语和一点点 Python 的结合非常合适。对许多人来说,这种结合更容易实现。
但是,数学仍然是量子计算的重中之重。如果你想对概念有更深的理解,你迟早会遇到数学公式。正如我所说,数学是描述技术概念的一个很好的方式。
让我们来看看 X-gate 的底层数学。别担心,我不指望你成为数学家。尽管如此,对代数(即对数学符号和操作它们的规则的研究)的一点喜爱并没有坏处。
到目前为止,我们使用的是 Python 的内置函数reversed
。虽然这很方便,但我们看不出它在内部是如何工作的。让我们使用另一个函数。一个自制函数。
自制反向功能
reversed psi: [0.87, 0.50]
我们定义一个函数adjust_weight
(第 1 行)。它需要一个量子state
和weights
。两者都是包含两项的数组。它将位置0
处的值和位置1
处的值相乘。它返回这两个乘积的和(第 2 行)。
我们可以用这个功能来反转psi
。对于返回单个数字的adjust_weight
,我们调用它两次来获得两个项目的数组(第 5 行和第 6 行)。在本例中,我们没有显式创建数组,而是直接将这些值打印到控制台(第 4 行)。
在这两个调用中,我们提供原始的psi
作为state
参数。在第一次调用中,其结果是反向 psi 的第一个数字,我们提供[0,1]
作为weights
。这意味着,我们得到了0
乘以第一个数字psi
和1
乘以第二个数字psi
的和。这个和是原psi
的第二个数。
在第二个调用中,其结果是反向 psi 的第二个数字,我们提供[1,0]
作为weights
。这是第一个数字psi
的1
倍和第二个数字psi
的0
倍。这等于原psi
的第一个数字。
有了这些权重,我们有效地交换了psi
的数字位置。
在数学中,这是一个矩阵乘法。矩阵 M 和向量 υ 相乘的一般公式为:
a 和 b 是我们用来计算结果向量第一个数的权重。 c 和 d 分别是第二个数字的权重。
数学上,X 门量子算符是矩阵:
让我们将该操作符应用于我们的三个示例性状态:
逆转|0⟩在|1⟩:的结果
逆转|1⟩在|0⟩:的结果
并且,在|ψ⟩应用矩阵也会导致它的反转:
在经典计算中,我们有一小组布尔运算符,它们的行为可以很容易地用真值表来表示。但是在量子计算中,矩阵表示称为门的操作符。我们可以应用无数种可能的矩阵。数学是描述这些运算符的简洁而精确的方法。但是你不需要成为数学家来使用这些运算。
当然,在应用时,最好能理解门的基本数学原理。但更重要的是,你需要了解大门是做什么的。如果你知道 X-gate 是做什么的,你就不需要一直应付数学。
本帖是本书的一部分: 用 Python 动手做量子机器学习 。
在这里免费获得前三章。
在人工智能领域工作,你不需要成为一名数据科学家
我经常被问到这个问题,我如何进入人工智能?
这里有一种方法。
许多人希望从事人工智能工作,大多数人在开始他们的旅程时都渴望成为一名数据科学家。显然是本世纪最性感的工作。他们做的第一件事是参加 Coursera 课程,然后开始参加 Kaggle 竞赛,接着试图找到一份数据科学家的工作。如果这是你,你就是众多中的一个,很难鹤立鸡群。
由 Ashkan Forouzani 在 Unsplash 上拍摄
虽然通过 Coursera 课程了解人工智能并不是一个坏主意——你需要自学并成为懂人工智能的人——数据科学只是工作的 5%,许多其他角色已经存在或在未来将变得存在。
所以你还能做什么?
调查你自己的工作或部门
闯入 AI 的一个方法是看你自己的工作。也许你的全部或部分工作可以被人工智能增强或取代。您是否在处理数据,这些数据是否用于决策?甚至像对新客户进行分类这样的小决策也可以通过机器学习来增强。确定这些决策点,并在您的公司内启动一个人工智能项目。你将成为数据科学团队理想的业务利益相关者。
假设你从事营销工作。你可以开始考虑你收集的不同客户的数据。你是如何决定何时联系谁的?你已经在收集谁对你的营销努力有反应的数据了吗?您可以开始构建数据和业务案例的基础。
调查你所在的行业或领域
看看那些已经从事 AI 工作,需要你的技能或行业专业知识的公司。行业和领域知识是人工智能项目成功的关键。在商业方面,人工智能素养有很大的差距,当你在基础知识方面自学完,并能为公司带来所需的领域或行业技能时,你将是一笔巨大的财富。
让我们假设你在能源行业工作。太好了,人工智能在能源领域的应用潜力很大。如果不是现在,许多公司将在未来几年内开始研究人工智能。收集能源领域、预测性维护、能源交易等不同的潜在使用案例。努力理解这些用例,你将成为你自己或竞争对手公司的一笔巨大财富!
这个故事的关键是,坚持你知道的和擅长的,从你擅长的地方增长你的技能。
从业务方面搭建桥梁,这是你成功的地方。
如果你想学习理解机器学习,请这样做。但是没必要逼自己成为数据科学家。事实上,我真的相信在更长远的未来,人工智能中的许多角色将是非数据科学角色。也许这只是需要一些耐心来转换到正确的角色,但这并不意味着现在是开始为此做准备的好时机。
关于我:我是一名分析顾问,也是当地一所商学院“人工智能管理”研究的主任。我的使命是帮助组织利用人工智能创造商业价值,并创造一个数据科学家可以茁壮成长的环境。 在这里报名我的快讯。
你知道 Excel。该学 SQL 了。
奥琳卡·谢尔坚科摄于佩克斯
9 个核心 excel 功能转化为 SQL
随着世界变得越来越由数据驱动,越来越多的专业人士正在更密切地与数据打交道。
在许多情况下,对这个领域的第一次介绍来自 Microsoft Excel 的永恒形式。Vlookups、数据透视表、sumifs 也许给喜欢冒险的人来点 VBA。
但是,就像初露头角的数据分析师、爱好者和探索者开始了解 excel 的神奇和优点一样,他们也开始努力克服它的局限性。
如果你遇到过类似*“正在计算:(4 个处理器))”*的消息,你可能知道我的意思。对于大型数据集,Excel 会变得相当慢。
Excel 还带来了难以避免的再现性问题,即使对于最细心的用户来说也是如此。这个过程听起来可能很熟悉:接收数据→做一些操作(vlookup、filter、pivot 等。)→接收需要相同处理的更新数据。冲洗,重复。多痛苦啊。
数据库技术有助于减轻这些缺点,因为它将数据从查询和操作中分离出来:
作者创建的图像。由像素完美制作的图标来自www.flaticon.com
SQL 是用于与数据库通信的主要语言,在熟悉 excel 之后学习它是一项很好的技能。
在这篇文章中,我将把一些主要的 excel 用例及函数翻译成 SQL,以帮助学习过程变得更加容易和有形。
1.挑选
**在 excel 中:**如前所述,数据存储和操作发生在 Excel 的同一个地方。因此,选择数据就像突出显示我们想要的单元格一样简单。
**在 SQL 中:**我们编写一个查询来从数据库表中“选择”数据。每个表格就像 excel 中的一个数据块,它包含行、列和数据单元格。
对于一个基本的 select 查询,我们需要指定要查询的表的名称和要从该表返回的列的名称。
在 SQL 中,星号表示“所有列”所以我们也可以运行:
select * from mytable;
如果我们大声读出来,我们会说“从我的表中选择恒星”。
2.过滤器
在 Excel 中:我们可以通过选择数据功能区中的过滤器图标,然后使用每列旁边的下拉菜单来过滤数据中的行。
在 SQL: 中,我们在查询中添加了一个“where 子句”,并指定了一个我们想要应用的条件:
与 excel 类似,我们有几个过滤条件选项:
过滤到特定值:
select * from mytable where **column1 = 10**;
用算术运算符过滤:
select * from mytable where **column1 < 10**;
用“in”运算符过滤:
select * from mytable where **column1 in (1,2,3)**;
多条件过滤:
select * from mytable where **column1 > 2 or column2 = "APPROVED";**
我们还可以使用“与/或”逻辑将多个条件嵌套在一起。我们只需要确保遵循操作符优先级并在必要的地方使用括号。
3.分类
**在 Excel 中:**我们使用数据功能区中的排序图标来应用排序条件。
**在 SQL 中:**我们在查询中添加了一个“order by”子句,以便按照我们期望的排序顺序返回数据:
请注意,我们可以按照提供的顺序对多个列进行排序。
默认情况下,列按升序排序(最小值优先)。为了改变这一点,我们可以在想要降序排序的每一列后面添加“desc”关键字。
4.条件句(If 语句)
***在 Excel 中:*我们使用一个“if 语句”。如果我们需要一组以上的条件,我们使用“嵌套 If 语句”
在 SQL 中:我们使用一个“case when”语句。
下面是基本语法:
每个“when/then”对指定一个条件和一个条件为真时返回的值。然后我们添加一个可选的“else”语句来捕捉任何遗漏的条件。最后,我们将结果列命名为。
这比 Excel 可读性强得多,Excel 需要大量的嵌套括号来创建复杂的条件。
5.删除重复项
***在 Excel 中:*我们选择数据功能区下的“删除重复”选项。然后从工作表中删除重复的值。
***在 SQL 中:*我们在 select 语句中使用“distinct”关键字:
*select distinct column1, column2 from mytable;*
上面的查询将返回 column1 和 column2 的所有唯一组合,而不更改基础数据。
6.Vlookup /索引匹配
在 Excel 中: Vlookup 和 Index + Match 是将一个数据表中的数据合并到另一个数据表中的两种方法。
***在 SQL 中:*我们利用了所谓的“连接”——一种基于公共数据点将两个表中的数据组合起来的方法。
下面是基本语法:
该连接有三个主要部分。
首先,我们指定要从每个表中返回哪些列。为了表明我们希望每一列来自哪个表,我们使用以下约定:表名+句点+列名。
第二个,我们指定想要使用的两个表和连接类型。我不会详细介绍不同类型的连接,但如果您想了解更多信息,我建议查看我的连接数据指南(如下)。
***第三,*我们指出我们想要“连接”的列(两个表之间有共性的数据点)。这就像你传递给 Vlookup 的第一个参数。
左接合。内部联接。外部联接。啊?
towardsdatascience.com](/a-beginners-guide-to-joining-data-935c8e579fb7)
7.聚合(总和、计数、平均值等。)
**在 Excel 中:**我们将函数添加到一个空单元格中,然后传入我们想要聚合的单元格范围。
在 SQL 中:我们拥有与 excel 相似的聚合函数。我们将列名传递给这些函数,并在 select 子句中调用它们:
select sum(column1), count(column2), avg(column3) from mytable;
有多种功能可供我们执行,其中许多功能与 excel 重叠。
8.条件聚合(sumif、countif、averageif)
**在 Excel 中:**像“sumif”这样的条件聚合函数允许我们仅对指定条件为真的行执行聚合。
**在 SQL 中:**我们可以在聚合函数中嵌套一个“case when”。
例如:
select sum(case when column1 > 10 then column2 else 0 end)
from mytable1;
在这段代码中,首先执行“case when ”,只有当 column1 大于 10 时才返回 column2。然后我们对结果值求和。如果列 1 > 10,这与对列 2 求和是一样的。
也有一些 SQL 版本允许以下语法:
select sum(column2) filter (where column1 > 10)
from mytable1;
9.数据透视表
在 Excel 中:我们可以使用透视表进行多维度的聚合。
在 SQL 中:我们使用一个“groupby”语句。
“groupby”将我们的数据分成不同的组,然后对每个组进行聚合。
例如:
这与将“列 1”和“列 2”添加到数据透视表的行部分,然后对不包含任何缺失值的列进行计数是一样的。
Excel 数据透视表也有一个“列”部分。为了在 SQL 中复制这一点,我们可以在 groupby 中使用条件聚合:
select column1,
count(case when column2 = “group1” then column2 end) as group1count,
count(case when column2 = “group2” then column2 end) as group2count
from mytable1
group by 1;
结束语
一开始,从电子表格应用程序过渡到“编写代码”会让人感到畏惧。但是如果你有处理数据的经验,那么 SQL 实际上并不比 excel 难,只是有一点不同。
最好的学习方法是获取一些数据并开始练习。编码快乐!
P.S. →如果你想了解更多关于 SQL、Python、数据科学的知识,订阅我的 免费邮件列表 !*
你可能不需要气流…然而
TL;DR:气流强劲而灵活,但是很复杂。如果您刚刚开始计划数据任务,您可能希望尝试更定制的解决方案:
- 将数据移入仓库:缝合
- 仓库内的数据转换: DBT
- 调度 Python 脚本:数据块
- 批量评分 ML 车型: Booklet.ai
使用 4 种不同的服务怎么可能比只使用一种更容易?
Apache Airflow 是数据团队最流行的工作流管理工具之一。全世界有数百家公司用它来安排各种工作。这是一个完全免费的开源项目,通过 python 构建的基础设施提供了惊人的灵活性。
我使用过(有时设置过)各种规模的 Airflow 实例:从优步定制的基于 Airflow 的 Piper 到侧面项目的小型实例,有一个共同的主题:项目变得复杂、快速!Airflow 需要以一种稳定的和生产就绪的方式部署,所有任务都是在 Python 中自定义的,并且在构建任务时有许多注意事项要记住。对于一个不太懂技术的用户来说,仅仅是为了安排一些简单的任务,Airflow 就可能是一个压倒性的系统。
尽管使用一个工具来满足所有不同的计划需求可能很诱人,但这并不总是您的最佳选择。每次出现新的用例时,您最终都会构建定制的解决方案。相反,你应该为你要完成的工作使用最好的工具。在每个用例的设置和维护过程中节省的时间非常值得为您的数据堆栈添加一些工具。
在这篇文章中,我将概述气流的几个用例以及每个用例的替代方案。
声明:本人是booklet . ai创始人之一。
从源提取原始数据到数据仓库
数据团队需要一些东西来完成他们的工作…数据!很多时候,这些不同来源的数据有多个不同的内部和外部来源。要将所有这些数据集中到一个地方,团队需要从所有这些来源提取这些数据,并将它们插入一个位置。这通常是某种数据仓库。
缝合
对于这一步,全球有许多可靠的工具正在使用。他们定期从一组给定的系统中提取数据,并将结果直接发送到数据仓库。这些系统处理大多数错误,并保持事情顺利运行。管理多个复杂的集成可能会成为维护的噩梦,因此这些工具可以节省大量时间。幸运的是,有一个避免噩梦的选择:
Stitch coins 将自己定位为“一个云优先、开源的快速移动数据平台。”您可以快速连接到数据库和第三方工具,并将数据发送到多个不同的数据仓库。最好的部分:前 500 万行是免费的!Stitch 也可以用几个开源框架来扩展。
在数据仓库中转换数据
一旦数据被加载到数据仓库中,它通常是一团乱麻!每个数据源都有不同的结构,每个数据集都可能用不同的标识符以不同的方式编制索引。为了理解这种混乱,团队需要将所有这些数据转换和连接成一种更好、更简洁、更易于使用的形式。大多数逻辑将直接发生在数据仓库中。
DBT
将所有这些数据集组合成一种企业可以实际使用的形式的过程可能是一项单调乏味的任务。它已经成为一个如此复杂的领域,以至于分析工程师的特殊角色已经从中脱颖而出。这些是整个行业中常见的一系列问题,现在已经出现了一种工具来专门解决这些问题:
DBT 认为自己是“你的整个分析工程工作流程”,我同意。只需了解 SQL,您就可以快速构建将被完全管理的多个复杂的数据转换作业层。版本控制、测试、文档等等都是为你管理的!云托管版本免费使用。
在数据仓库之外转换数据
有时团队还需要在数据仓库之外转换数据。转换逻辑不能完全在 SQL 内操作怎么办?如果团队需要训练一个机器学习模型怎么办?这些任务可能直接从数据仓库中提取数据,但是实际的任务需要在不同的系统中运行,比如 python。
数据块
大多数基于 python 的定制脚本通常从 Jupyter 笔记本开始。您导入一些包,导入或提取数据,运行一些函数,最后将数据推到其他地方。有时需要更复杂的生产规模的流程,但这种情况很少见。如果您只需要一种简单的方式来运行和安排 python 笔记本,有一个很好的选择:
Databricks 由 Spark 最初的创始人创建。它的主要出名之处是非常容易地旋转火花簇,但它也有很好的笔记本功能。他们提供易于使用的 Python 笔记本,你可以像谷歌文档一样在笔记本中进行协作。一旦开发出适合您的脚本,您就可以安排该笔记本完全在平台内运行。这是一个很好的方法,不用担心代码在哪里运行,并且有一个简单的方法来调度这些任务。他们有一个免费的社区版。
批量评分机器学习模型
如果团队已经建立了一个机器学习模型,该模型的结果应该被发送到一个可以实际帮助业务的地方。这些任务通常涉及连接到现有的机器学习模型,然后将该模型的结果发送到另一个工具,如销售或营销工具。要让一个系统启动并运行,并在正确的时间推出正确的模型结果,这可能是一项极其乏味的任务。
建立一个机器学习模型已经够难的了,不应该再花 2 个月的时间来定制编码,以将该模型连接到企业可以从中发现价值的地方。这项工作通常需要与第三方系统进行痛苦的集成,更不用说所需的生产级基础设施工作了!幸运的是,有一个解决方案可以为您处理这些任务:
Booklet.ai 连接到现有的 ML 模型,然后允许您快速设置一些东西:一个与非技术用户共享模型的演示,一个简单的 API 端点连接,以及一组连接输入和输出的集成。您可以轻松地从数据仓库设置一个输入查询来对模型进行评分,然后将这些结果发送到您的业务伙伴可能会使用的各种工具。您可以查看将结果发送到对讲机 的 领先评分模型的演示。 您可以请求访问 Booklet.ai beta ,在那里您的第一个模型将是免费的。
数据战略在数字化转型过程中的作用
丹尼尔·泽维尔摄于佩克斯
数据驱动的组织获得新客户的可能性是其他组织的 23 倍
我住在镇中心,这意味着周六晚上不是很安静(是的,过去式)。所以,上周末我们讨论了我们是多么想念那些喧嚣——来自俱乐部的嗡嗡声,人们在酒吧里跳来跳去,唱歌(或尖叫)和跳舞——人们玩得开心的声音。这让我想知道世界各地的俱乐部是如何适应这些变化的?我的研究让我找到了中国一家名为JD.com的电子商务公司,一些酒类品牌与该公司接洽,他们与一家名为太合音乐集团的音乐公司合作,提供虚拟的夜店体验。他们把音乐直接传到客厅,在网上卖酒并送货上门。
其中一个酒类品牌报告称,与前一天相比,进口白酒销量增长了 70%,威士忌销量增长了 8 倍。即使在中国解除封锁后,这些利润也激励 JD.com 继续经营虚拟娱乐。他们拥有巨大的电子商务基础设施,吸引了酒类品牌与他们合作,他们一起创造了一个新的业务,在这样的低迷时期赚钱。
故事的关键是——为了快速适应变化,创造新的商业模式,在吸引新客户的同时为现有客户提供价值,你需要数字化装备。数字化转型不再是从线下转移到线上或只是升级技术。它是关于利用现代技术平台建立一个灵活、高效、安全和知情的业务,与客户相连,不局限于一个价值链,可以随着时代的变化快速发展。在这个信息时代,仅仅升级产品或工具是不够的。您的数字化转型应该以强大的数据战略为后盾。那么,为什么数据战略在数字化转型中至关重要?让我解释一下。
您需要数据来改善客户体验
数据有助于您了解客户行为,以及他们喜欢如何使用您的产品或服务。它让你更接近你的客户,帮助你调整你的产品以适应他们的需求,并对变化做出更快的反应(像新冠肺炎一样)。如果你仍然依靠直觉来了解客户的脉搏,你注定会在竞争中失败,就像《T2》大片《T3》一样。
你需要数据来照顾你的人
未来的员工不在办公室,远程工作已经成为主流。在某些行业,它提高了员工的满意度和生产率。它让你可以灵活地从世界各地招聘人才,利用全球人才库。当你的员工不在办公室时,能够管理他们可能是一个挑战,因为互动变得虚拟、短暂和稀薄。数据可以帮助你了解你的员工,就像它帮助你了解你的客户一样。它可以帮助你创造一个更好的工作文化,为个人量身定制发展计划,还可以在你的组织内发现未来的领导者。
您需要数据来优化业务流程
数据可以让您了解流程的表现如何,是否随着时间的推移有所改进,是否足够强大,能够在不可预见的情况下生存。数据可以将流程与人员联系起来,确定影响变革的关键因素,并将见解转化为行动。
你需要数据来发现新的价值链
当你了解客户行为时,它会打开新的机会渠道。预测您的客户需求可以帮助您创造新的价值主张,发现潜在客户并创造额外收入。随着时间的推移,对数据进行管理会产生数据储备,这些数据储备可以被货币化,从而增加新的收入来源。
你需要数据来推动创新
人工智能、增强现实和数字孪生等技术为所有行业的创新提供了巨大的机会。然而,如果你不收集和探索与你的业务甚至其他行业相关的数据,你将无法发现可能引领你走向下一个重大机遇的微弱信号。
“世界上大多数人会通过猜测或凭直觉来做决定。他们要么幸运,要么错误。”——苏海尔多什
转变为数据驱动型组织需要什么?
首先,您需要一个与您的业务流程、人员和技术相一致的战略。其次,你的员工必须意识到数据治理的重要性,然后才能跳到 AI 这样的冷端。我的同事 Brian Poore 在本文中解释了原因:数据知识:数据驱动型组织的基础。您需要采用能够提供现代数据平台的正确技术,这些平台应该与您现有的技术体系很好地集成。阅读更多关于为什么你的组织应该更新其数据平台的信息。
如果配备了正确的数据战略,以强大的数据治理为指导,并通过可扩展、安全和一致的技术平台来帮助您监控流程、跟踪成本并最大化投资回报,数据驱动的数字化转型将会成功。
最后的想法
数据在您的组织中无处不在,它将人与流程联系起来,如果管理有效,它将把您的业务与新的机会联系起来。数据驱动的组织更有可能成功,因为它实现了高运营效率,能够快速适应变化,并更快地满足客户需求。因此,如果你正在投资数字化转型,请确保你有一个数据战略来支持它。
现在你可能会说(指的是 JD.com 的故事),如果我们没有基线数据,70%的销售额增长不是一个好的指标。你是对的,但关键是,当不确定性袭来时,酒类品牌没有联系大俱乐部来运作这场秀,他们去了一家电子商务公司,这家公司有数字能力,有数据来支持这样的价值链。
告诉我,你认为虚拟俱乐部是个好主意吗?你会选择虚拟的夜总会,为自己省下拥挤的舞池、长长的队伍和穿错鞋不准入内的保镖吗?
点击阅读更多关于京东的故事。
玩电脑视觉永远不会无聊
…以及如何让 Dino 独立运行而不考虑平台
在本文中,您将学习如何使用 Python 和 MSS 以合适的帧速率录制屏幕。如何用 OpenCV 进行模板匹配和边缘检测?如果你愿意,你可以让你的机器玩游戏。
来源:作者
介绍
我喜欢自动化,有一次我读了由马库斯·雷内·Pae写的关于另一个 python 库 PyAutoGUI 的评论。这个库允许你通过操作系统输入来操作,比如发出鼠标或键盘事件。Markus 提出的挑战之一是自动化 Google Dino 游戏。我很好奇 PyAutoGUI 是否允许我实时捕捉监视器,找到恐龙,并在需要时进行跳跃?我决定尝试一下,不要拘泥于浏览器实现,所以 Dino 应该运行,不管它是浏览器还是独立的应用程序。在本文的后面,您将发现 PyAutoGUI 在哪些任务中工作得很好,在哪些任务中最好使用其他技术。
我最后用了哪些库来让 Dino 单独运行
- PyAutoGUI
- OpenCV
- Python MSS (多个截图)
- 当然还有 NumPy 、 Matplotlib 和 Jupyter
简而言之什么是 CV(计算机视觉)和 OpenCV
如今,计算机视觉是一个非常热门的话题。它被用在许多地方,在这些地方,图像或视频应该被处理以备将来使用。例如 Face ID:在了解这是你之前,首先它试图检测一张脸,然后处理图片并要求 ML(机器学习)模型来分类这是不是你。*可能是其他人正在尝试解锁您的手机。*目前最流行的 CV 库之一是 OpenCV 。根据官方网站:该库拥有超过 2500 种优化算法,其中包括一套全面的经典和最先进的计算机视觉和机器学习算法。OpenCV 是用 C++写的,可以在所有平台上使用,使用 C++、Python 等写的 API。如果你有一个遵循 CUDA 或 OpenCL 标准的 GPU,它会加速你的 GPU 上的计算。
我用 PyAutoGUI 实现游戏自动化的尝试
没有互联网连接的 Chrome 浏览器截图
首先,我实现了一个游戏循环,并试图只使用 PyAutoGUI 来捕捉屏幕,匹配一个模板(在我的情况下,它是一个恐龙),从技术上来说,这是可行的,但是……PyAutoGUI 中的截图并不是为了实时捕捉。所以我得到了两帧之间大约一秒的延迟。因为 Dino 运行速度超过每秒 400 像素,所以太多了。当我的程序按下“跳转”键时,游戏就结束了。我决定指定每次捕获哪个区域来减少延迟,得到的延迟大约是 0.4 秒。更好,但仍然不够。我明白我需要一些别的东西来执行物体检测,所有的计算都应该以至少 30 帧/秒的速度进行。这意味着我需要在 0.03 秒内完成我的计算和所有的副作用。
MSS 跳入游戏
一、什么是 MSS?
根据 docs MSS 是*一个使用 ctypes 的纯 python 中的超快速跨平台多截图模块。*该 API 易于使用,已经集成了 Numpy 和 OpenCV。我为什么选择 MSS?基本上,如果你想捕捉整个屏幕,MSS 会做得很快,比其他库快得多。如果你需要把你的屏幕投射到某个地方,我会选择这个库。
在尝试了不同的可以提供截图功能的库之后,我了解到它们中的大多数都使用了相同的方法。每次抓取屏幕时,都会重新建立与屏幕资源的“连接”。到目前为止,我没有深入研究这一部分,我只能说我们在重建上花了太多时间。同时,MSS 针对任何操作系统进行了优化。当你抓取一个屏幕时,它使用 XGetImage 方法从已经创建的“连接”到你的屏幕资源*。*这意味着,你可以用with
语句初始化 MSS 实例,让你的游戏在那里循环,你会得到更好的性能。
with mss.mss() as sct:
while True:
screen = sct.grab(monitor)
process_image(screen)
if trigger_to_leave:
break
是的,就这么简单。这样你抓取一个屏幕的速度可以提高几百倍。在这里,我实现了以 100 帧/秒的速度获取截图,我甚至添加了一个睡眠来减少多余的计算。接下来,我们需要处理图像,分析所有块,并在需要时“跳转”。
我把这个分成两部分:
- 在屏幕上找到一只恐龙,并探测一个有“障碍物”的区域
- 使用上一步得到的区域,循环抓取,计算到障碍物的距离,并计算速度。
让我们回顾一下这些步骤。
在屏幕上找到一只恐龙,并探测一个有“障碍物”的区域
这一部分在我的 GitHub 上的一个 Jupyter 笔记本中进行了可视化的呈现:https://GitHub . com/dper Yel/run-dino-run/blob/master/search . ipynb
此时我广泛使用 OpenCV 进行图像处理、模板匹配、边缘检测。首先,我消除了图像中的颜色通道,并且通过用cv2.cvtColot(img, cv2.COLOR_BRG2GRAY)
变换图像只使用了一个通道。然后我需要消除白天和黑夜的区别。
白天从左边,夜晚从右边
对此我们能做些什么?事实上,有许多方法可以接近,我决定使用一个 Canny 算法来检测边缘,并使用最大和最小阈值的极值。它让我在白天和晚上都能得到几乎相同的画面。
白天从左边,夜晚从右边
当然,如果一幅图像有很多噪声,我需要先模糊它,但在这种特殊情况下,只需找到边缘就足够了。而且我擅长用模板匹配来找迪诺。唯一的事情是模板不会在比赛中缩放。我们的恐龙模板应该取自游戏将要运行的屏幕。或者您可以扩展此功能,并使用模板缩放来执行模板匹配。
通过使用cv2.matchTemplate
我得到了匹配的位置。最初你会得到一堆位置,因为当 OpenCV 在源图像上滑动模板时,它会比较这个区域,然后你会得到一个匹配的值。匹配值表示像素匹配的精确程度。在我的例子中,我只寻找 1 个恐龙,这意味着我可以取最高值,并使用映射到该值的位置。
match_res = cv2.matchTemplate(canny_night, dino_bordered_template, cv2.TM_CCOEFF_NORMED)
_, max_val, _, max_loc = cv2.minMaxLoc(match_res)
我的 max_val 平均为 0.81,这意味着我的模板在图像上的匹配率为 81%。好到可以继续。
知道了恐龙的位置,我们就可以突出显示障碍物出现的区域。我选择没有其他噪音只有障碍物可见的部分。需要对仙人掌和鸟类等障碍物进行分组。
蓝色矩形代表我需要在每一帧上查看的区域
需要关注的区域。用边缘检测对图像进行后处理。
要进行分组并不太难,因为本质上,我有一个矩阵(图像),其中每个单元有两个值0
或255
,有点不规范的二进制矩阵。我需要从左边找到至少有一个像素值为255
的组的位置。为此,我通过 X 轴在画布上迭代,步长定义了“障碍物”之间的最小距离。每个组代表一个元组,该元组具有距组左侧的位置和宽度。当我找到所有组时,我从左边修剪结果以知道“障碍”的确切边缘。这是简化光流的未来部分所需要的。还值得一提的是,因为步长值是常数,这种方法的复杂性是线性的O(n+k)
,其中n
是画布的宽度,k
是“障碍”的数量。这还不算太糟糕,因为我需要对每一帧进行计算,并且关心这里的性能。下面你可以看到分组是如何工作的。
“障碍”如何分组的可视化表示。来源:作者
现在我有一切可以切换到下一步。
通过速度计算使恐龙奔跑和跳跃
找到恐龙并开始游戏循环的运行脚本位于下一个文件:https://github.com/dperyel/run-dino-run/blob/master/run.py
好的,我要说最复杂的部分已经在第一部分完成了。现在我们至少知道了到第一个“障碍”的距离,如果“危险”物体太近,可以使用pyautogui.press('space')
。问题是游戏改变了速度。迪诺越跑越快。我的第一个想法是使用光流和 Lucas-Kanade 算法来比较前一帧和当前帧。当我得到像素偏差时,我可以计算速度。它会工作,唯一的事情是我已经有我需要的一切。我的“障碍”组代表了我需要注意的特征,我可以存储前一帧的状态以找到我需要的偏差。 当我避免使用复杂的算法时,我总是感到轻松,并通过做几个“加和减” (-:
通过知道一个速度,找到一个依赖关系是一个数学(或时间)问题,这个依赖关系是你需要从一个“障碍”的距离来触发一个“跳跃”。这是一个结果。
结果,迪诺没日没夜地跑,如果有仙人掌或鸟靠近,它就会跳起来。来源:作者
结论
计算机视觉是许多自动化过程的重要组成部分。正如你在这个小例子中看到的,你甚至可以通过让一台机器找到敏感部分来对一个游戏进行完整的端到端测试。
尝试不同的库来比较性能是一个好主意。在我的例子中,当 PyAutoGUI 仍然用于其他副作用时,MSS 在屏幕捕捉方面是绝对的赢家。
**附言:**所有源码都放在我的 GitHub 上https://github.com/dperyel/run-dino-run
回购使用 git LFS 存储所有二进制文件。为了让脚本工作,你需要从你的显示器上截取一个assets/dino_crop.png
的截图,或者做一个模板缩放(-;
代码可能包含 bug,因为它主要是像概念验证一样完成的。
欢迎在下面评论或提问。
从仪表板到洞察力
改变你看待过程改进仪表板的方式并促进其使用的五个原则。
你还记得你打开准将 64 的时候吗?你必须连接所有的设备(除非你很幸运有一台专用于此的电视),然后通过磁带阅读器加载游戏,然后等待。等等。等等。等到屏幕上出现什么东西时,才意识到这是一个错误的游戏。
这个故事让我想起了当我看到一些仪表板时的感觉。在这篇文章中,我特别关注过程改进仪表板,这样的仪表板可以用来比较设施、工厂、部门或组织的元素。
我将分享一个好的流程仪表板的五个关键原则。作为仪表板的消费者和生产者,我对它们都进行了测试,到目前为止,它们运行得相当好。
- 从 KPI 转移到评分。
对许多人来说,仪表板意味着关键绩效指标(KPI)。您可以自己决定,也可以从竞争对手那里借用用于基准测试的外部资源。
在我看来,更有价值的是**将所有的 KPI 连接在一起,**即使用平衡计分卡的方法,创建一个评分机制。
就像问一个人"你还记得上学期的所有分数或者你拿到学位时的最终成绩吗?”。他/她可能会回答第二个问题。
因此,**关键信息变成了分数,**这一过程得到了多少,即从 1 到 10。通过显示分数的来源,用户可以了解所有维度之间的关系,以及应该使用哪个杠杆来提高总分数。
在我们最近创建的仪表板中,我们根据成本效率、团队效率和 ERP 效率来评估部门的效率。如果你有一个适当设置的 ERP,你可以承受一个效率较低的团队;如果你有一个效率较低的 ERP,你必须用你的团队效率来补偿(例如,管理更多的发票、日志条目等)。)但是为了确保您的成本不会增长到最高,您可能还需要考虑如何抵消这种额外的工作(即利用远程位置或外部化以防万一)。
与许多 KPI 相比,分数更容易被人们记住:这是一种简单的方法,只需给出一个数字就可以记住并在几个月内进行比较。如果需要进一步的详细信息,您可以转到详细的 KPI。
2。建造耻辱墙/名誉墙。
人类喜欢人类。和数据之类的数据。如果你在仪表板上显示一些绝对值,用户如何理解什么是好的,什么是坏的?
在我看来,关键是要清楚地了解什么是好什么是坏,并使之在整个组织中透明。出乎意料的是,并不是每个人都喜欢透明。
通过透明地展示表现最好和最差的员工,你将获得一个没有借口的环境。这将产生一个健康的竞争环境,用户可以比较来自不同单位的数据,相互学习,自主地努力达到下一个水平。
我经常使用“耻辱墙/名声墙”这种表达方式,因为它就是这样:你不加过滤地展示了好与坏。
3。让用户玩它
给用户决定看什么的权力。启用尽可能多的视图和尽可能多的过滤器。当数据变成信息时,它的美妙之处在于每个人都以不同的方式看待它们。
让用户决定并享受他们的观点。
停止仪表板的扩散,让人们可以自定义他们感兴趣的值。
这在仪表板中建立了更强的信任(因为是用户选择他/她想看的内容),同时也增加了参与度。
简而言之,从推式转向拉式仪表板:让他们可用,让人们玩。就像在 Commodore 64 上,可能只是快一点点:)
马库斯·斯皮斯克在 Unsplash 上的照片
4.将算法民主化。
老年人常说“知识就是力量”。我的回答是“真的吗?”。
除非你创造了一个神奇的算法来拯救世界,否则我很遗憾地告诉你,有很多聪明人可以得到你开发的相同甚至更好的算法。
通过与用户共享仪表盘背后的算法,信任度显著提高。
你给他们一个分数,但你如何达到这个分数,以及你如何转换、汇总和评估数据,都必须是透明的。它的副作用是,你可能会受到用户的挑战:关键是在你上线之前要进行多次测试和重新测试,但这也可能是你改进算法甚至达到更好阶段的机会。
5。让它更容易被使用。
用回形针的时候有没有请示过?那你为什么要为仪表板这么做呢?
如果的目的是绘制数据并向用户提供即时结果,则不需要任何指令。我记得当我还是一名计算机程序员时,我们总是玩虚拟游戏:即使你没有参与第一次编码,你也应该能够改变一个程序。这是我们的主要 KPI,看看它是否对用户友好。
试着让它更简单,使用过滤器,颜色编码和空间的明智使用来获得眼睛的焦点。当你有了仪表盘的第一张草图后,去喝杯咖啡。然后用更少的项目重新设计相同的仪表板。尽量浓缩,视觉化。这将比成千上万的直方图更能吸引眼球,并在大脑中留下深刻印象。
这些是我迄今为止用于过程改进仪表板的五个关键原则。值得一试。
“我们相信上帝。所有其他人都必须带数据。”爱德华·戴明,
Luca Condosta(博士)是一名金融专业人士,拥有跨国企业的全球经验。对数据、领导力、战略和人充满热情。两本书的作者(可持续发展报告和纳图齐——意大利和声制作人)喜欢寻找和分享故事。
你应该知道这些(常见的)深度学习术语和术语
由 Raphael Schaller 在 Unsplash 拍摄的照片
术语
作为深度/机器学习实践者,你一定会经常遇到的术语词汇表
介绍
我最近浏览了 Juptyter notebook 中展示的一组基于机器学习的项目,并注意到在我参与或审阅的所有笔记本和基于机器学习的项目中,都有一组重复出现的术语和术语。
你可以把这篇文章看作是在机器学习和深度学习中消除一些噪音的一种方式。期望找到你在大多数基于深度学习的项目中必然会遇到的术语和术语的描述和解释。
我涵盖了机器学习项目中与以下主题领域相关的术语和术语的定义:
- 数据集
- 卷积神经网络架构
- 技巧
- 超参数
1.数据集
训练数据集:这是我们用来直接训练神经网络的一组数据集。训练数据是指在训练期间暴露给神经网络的数据集分区。
验证数据集:这组数据集在训练中被用来评估网络在不同迭代中的性能。
测试数据集:数据集的这个分区在训练阶段完成后评估我们网络的性能。
2.卷积神经网络
照片由 Alina Grubnyak 在 Unsplash 上拍摄
卷积层:卷积是一个数学术语,描述两组元素之间的点积相乘。在深度学习中,卷积运算作用于卷积层中的过滤器/内核和图像数据阵列。因此,卷积层仅包含滤波器和通过卷积神经网络传递的图像之间的卷积运算。
批量标准化层 :批量标准化是一种技术,通过引入对来自前一层的输入执行操作的附加层来减轻神经网络内不稳定梯度的影响。这些操作对输入值进行标准化和规范化,然后通过缩放和移位操作转换输入值。
下面的 max-pooling 操作有一个 2x2 的窗口,并滑过输入数据,输出内核感受域内像素的平均值。
展平图层:取一个输入图形,将输入图像数据展平成一维数组。
密集层:密集层中嵌入了任意数量的单元/神经元。每个神经元都是一个感知器。
3.技术
马库斯·斯皮斯克在 Unsplash 上拍摄的照片
激活函数%2C%20depending%20on%20input.) :将神经元的结果或信号转化为归一化输出的数学运算。作为神经网络组件的激活函数的目的是在网络中引入非线性。包含激活函数使神经网络具有更大的表示能力和解决复杂的函数。
整流线性单元激活函数(ReLU) :一种对神经元的值结果进行转换的激活函数。ReLU 对来自神经元的值施加的变换由公式 y=max(0,x) 表示。ReLU 激活函数将来自神经元的任何负值钳制为 0,而正值保持不变。这种数学变换的结果被用作当前层的输出,并被用作神经网络内的连续层的输入。
Softmax 激活函数:一种激活函数,用于导出输入向量中一组数字的概率分布。softmax 激活函数的输出是一个向量,其中它的一组值表示一个类或事件发生的概率。向量中的值加起来都是 1。
漏失 : 漏失技术通过随机减少神经网络内互连神经元的数量来工作。在每一个训练步骤中,每个神经元都有可能被遗漏,或者更确切地说,被排除在连接神经元的整理贡献之外。
4.超参数
马尔科·布拉舍维奇在 Unsplash 上拍摄的照片
损失函数:一种量化机器学习模型表现好坏的方法。量化是基于一组输入的输出(成本),这些输入被称为参数值。参数值用于估计预测,而“损失”是预测值和实际值之间的差异。
优化算法:神经网络内的优化器是一种算法实现,它通过最小化损失函数提供的损失值来促进神经网络内的梯度下降过程。为了减少损失,适当地选择网络内的权重值是至关重要的。
学习率:神经网络实现细节的一个组成部分,因为它是一个因子值,决定了网络权值的更新水平。学习率是一种超参数。
Epoch: 这是一个数值,表示网络暴露于训练数据集中所有数据点的次数。
结论
显然,在你从事和完成机器学习项目的过程中,你肯定会遇到更多的术语和术语。
在以后的文章中,我可能会扩展机器学习中经常出现的更复杂的概念。
请随意保存这篇文章或与刚开始学习旅程或职业生涯的机器学习从业者分享。
我希望这篇文章对你有用。
要联系我或找到更多类似本文的内容,请执行以下操作:
* [## 2020 年(及以后)机器学习从业者创收的 5 种方式
了解如何利用机器学习技能增加收入或创造新的收入来源
towardsdatascience.com](/5-ways-a-machine-learning-practioner-can-generate-income-in-2020-and-beyond-2f541db5f25f) [## 辅助项目在机器学习中的重要性
你和马克·扎克伯格有什么共同点?在这篇文章中找出,以及其他几个原因,为什么…
towardsdatascience.com](/the-importance-of-side-projects-in-machine-learning-edf9836bc93a)*
你不应该仅仅在迭代中使用 purrr
Tidyverse 包中的 3 个函数改进了 R
purrr 包是 Tidyverse 的主要支柱之一,在实用性和通用性方面与 dplyr 和管道操作器不相上下。其主要目的之一是将循环的意图与其语法对齐。在编写 for 循环时,不涉及一堆乏味的样板文件——它很少告诉读者循环做了什么——purrr map 可以像简单的英语一样阅读,并且可以整齐地放入管道连接的操作组中。
但这并不是 purrr 所能提供的全部。最长的一段时间,我只用了map
、walk
,以及它们的变体。从那以后,我发现了这个包的其他实用程序,它们使处理列表变得轻而易举。
因为这些函数一点也不隐藏,就在文档页面中的显眼位置,我觉得没有早点使用它们有点愚蠢。但是对于程序员来说,太容易陷入相同的例行程序,无意识地遵循“如果它没有坏”的思维模式。因此,为了激起您对 purrr 提供的鲜为人知的工具的兴趣,我选择了几个我最喜欢的工具来分享。我希望这样做会改进您的工作流,让您更加好奇这个 R 包还能提供什么。
避免用“set_names”反斜杠或替换函数
现在,一个实际上是从 rlang 包重新导出的函数,它本身在 base R 中有一个对应的可用版本,这看起来似乎是一个奇怪的起点。但是set_names
非常符合 purrr 的基本理念,我认为它是合适的。
在 R 中,从语法上来说,有四种类型的函数。分别是前缀(do_something(argument)
)中缀 ( +
、-
、%>%
)替换(setter(x) <- “eggs"
)特殊(类似if
的关键词)。
事实是,大多数阅读代码的人都非常熟悉前缀和中缀形式,尤其是来自其他语言的形式。虽然任何函数都可以通过使用反斜线以前缀形式编写,但这是 R 的另一个怪癖,在使代码更具可读性方面并没有起到很好的作用。
假设我们有一个字符向量,我们需要它们的字符长度。为了举例,我将使用像这样的简单操作,可能不需要使用列表和 purrr——如果这让您感到困扰,那么想象一下我们正在做一些输出异构数据类型的更复杂的任务。
如果我们希望输出列表的名称是原始字符,我们可以这样做:
注意这个函数是如何很好地适应管道的。这里我利用了这样一个事实,即set_names
将默认给一个向量它自己的参数值作为名称。比手工创建一个命名的向量要快得多,也比在单独的一行上使用names(animal_nchars) <- animals
漂亮得多。
用“cross”避免嵌套循环
假设我们有两个不同长度的字符向量,我们希望将它们中的元素粘贴到一起,作为另一个字符向量返回。我们可以这样使用嵌套地图:
请注意,这种方法很难阅读,并且需要一些额外的工作来获得一个字符向量。虽然像 map2 和 pmap 这样的工具可以很好地处理相同长度的输入,但是在条件不太整洁的情况下它们就不起作用了。此外,内循环返回长度大于 1 的向量的事实阻止了我们在外循环中使用map_chr
。
请考虑这种方法:
好多了,你不觉得吗?对于更复杂的函数,如果使用公式的话,我喜欢手动解包.
或.x
,只是为了让内容更具可读性。在决定是利用特定语言的速记来节省自己的时间,还是使用更冗长的速记来方便其他人时,总会有一点权衡。
使用“保持”和“压缩”进行过滤
在我的工作场所,我处理大量的空间数据。当跨地理区域迭代时,过程经常因为简单的数据覆盖原因而失败。我发现 compact 函数对于在探索阶段过滤掉这些故障非常有用。
对于更持久的代码,最好明确要丢弃哪些元素,因此使用keep
可能是更好的选择,因为它让您指定一个谓词。
r 有多个内置数据集。假设我们想要列出它们的列名,但前提是它们必须以 dataframes 的形式存储。这是可以做到的:
由于内置数据集是 base R 的一个怪癖,以编程方式访问它们有点奇怪,因此使用了get
。关于上面的片段,需要注意一些事情:
- 因为不是所有列出的数据集都被成功检索,所以我使用
possibly
和compact
来过滤掉这些失败。 - “仅当它们作为数据帧存储时”部分由管道的第 4 行中的
keep
完成。 - 注意
set_names
是如何再次派上用场的,这样在过滤完成后,我们就知道每组列名与哪个数据集相关联。
我在这里仅仅触及了表面,我的例子不可否认地有点做作,但是我希望我至少已经说服了你自己去探究除了使迭代更可读之外,purrr 还能为你做些什么。
当然,伴随着所有伟大的锤子而来的是责任,不要把一切都看成钉子。R 中的列表通常不是保存数据的最佳数据结构选择。如果您可以将事情存储在数据帧中,并使用 dplyr 而不是 purrr 来实现您的目的,那么您应该这样做!
但是对于处理列表的时候,purrr 是一个很好的工具,但是经常没有被充分利用。祝你好运!
你应该成为一名数据科学家。原因如下。
意见
在不断变化的市场中成为数据科学家的理由
照片由 ThisisEngineering RAEng 在un splash【1】上拍摄。
目录
- 介绍
- 数据科学家
- 论证
- 摘要
- 参考
介绍
在过去的 10 年里,数据科学已经成为就业市场的领跑者。尽管一些文章旨在将数据科学视为不再投资的职业,但我在这里告诉你相反的情况。数据科学不仅最近采取了许多形式,而且它也被证明是一份满意度很高的工作。此外,这一领域可以相当有利可图,平均基本工资为107,801 美元【2】。这个数字不包括奖金、股票或其他激励措施,这些都会增加本已很高的基本工资。总而言之,数据科学有着很高的基本工资中位数、巨大的工作满意度和无数的工作机会,确实是一个值得投资和追求的职业和领域。下面,我将详细阐述其中的原因,并提供一些有益的见解。
数据科学家
作者的随机森林数据科学模型中使用的 Python 代码。作者截图[3]。
在我们进行更详细的推理之前,让我们先定义一下职业。根据经验,数据科学家是用自动化统计和算法解决业务问题的人。典型数据科学家的一般工作流程可以概括为:
- 业务问题陈述制定*(与利益相关者会面)*
- 数据集开发 (SQL 拉数据和数据清洗)
- 探索性数据分析*(缺失值、正态性、标记)*
- 基础模型构建*(非监督/监督、回归/分类)*
- 模型创建*(例如带有超参数调整的随机森林)*
- 结果解释*(向利益相关者解释结果)*
- 模型部署*(通常交给机器学习工程师)*
虽然不同公司之间的工作流程和具体步骤可能会有所不同,但数据科学家的工作描述和日常工作通常都遵循这种格式。既然我们知道了数据科学家通常从事的工作类型,我们现在将给出为什么要成为数据科学家的理由。
论证
蒂姆·莫斯霍尔德在Unsplash【4】上拍摄的照片。
成为数据科学家有很多好处,不成为数据科学家也有一些好处(将在本文后面详述)。主要原因可以归纳为工作满意度、职位空缺、薪资以及所学工具和技能:
工作满意度 —一个著名的来源 Glassdoor 提出了“【2020 年美国最好的工作”[2],其中数据科学家的排名是第三位。然而,工作分层实际上是这个列表中第二高的职位,仅次于战略经理职位。这一评级范围为 1.0 至 5.0,得分为 4.0,数据科学家可以期待在日常工作中获得快乐。
职位空缺 —虽然职位空缺并不是列表中最高的,但仍有相当数量的 6542 个[2]。与软件工程师等职位空缺较高的其他职业相比,你可以获得的数据科学学位数量有限,因此你获得数据科学家职位的可能性仍然很高。
薪资 —在美国十大工作中,只有两个职位的数据科学家底薪最高。有了在线学习,这份高薪完全值得投资。为了更多地了解如何在线成为一名数据科学家,我写了一篇不同的文章,强调在线学习背后的推理[5]:
在线学习的专业数据科学家指导您在家开始数据科学生涯
towardsdatascience.com](/yes-you-can-become-a-data-scientist-online-heres-how-dc73c7faae0f)
如果你学习成为一名数据科学家,但没有在数据科学领域找到工作,会发生什么?
学到的工具和技能——这就是推理的这个方面变得重要的地方。学习数据科学时,你会精通与其他领域重叠的技能。其中许多还被列入了十大最佳工作名单。那些相似的职位和他们各自的排名包括[2]:
- 产品经理— 4 名
- DevOps 工程师— 5
- 数据工程师— 6
- 软件工程师— 7 名
- 战略经理— 9
- 业务发展经理— 10
或许成为数据科学家学到的最有价值的技能是解决问题。因此,如果你碰巧很难找到一个适合你的数据科学职位,有大量类似于数据科学的职位可以从你已经学到的技能中获得。重叠技能包括但不限于 SQL 、 Python 、产品管理、和商业智能。其他可能被追求的职位有,其中一些,在美国新闻&世界报道【6】的“ 100 个最好的工作*”*中有所概述:
- Machine Learning Engineer- Statistician- Mathematician- Data Analyst
虽然其中一些立场是相似的,但也有重要的差异,我在另一篇文章[7]中也强调了这一点:
数据科学家和机器学习工程师的主要区别和相同点是什么?阅读以下内容,了解…
towardsdatascience.com](/data-science-vs-machine-learning-heres-the-difference-530883d6de3a)
摘要
It can be scary investing time and money into a career, data science should not be one of them.
正如本文所解释的,有很多理由可以说明你为什么应该成为一名数据科学家。无论您是在寻找下一个重大的职业发展,还是想知道数据科学热潮背后的炒作,我希望这篇文章对您来说既有趣又有价值。感谢您的阅读!
参考
[1]照片由this engineering RAEng在Unsplash(2020)上拍摄
[2] Glassdoor 团队,2020 年美国最好的工作,(2020)
[3] M.Przybyla,截屏,(2020 年)
[4]蒂姆·莫斯霍尔德在 Unsplash 上拍摄的照片,(2018)
[5] M.Przybyla,是的,你可以在网上成为一名数据科学家。以下是方法。(2020 年)
[6]《美国新闻与世界报道》, 100 份最佳工作,(2020 年)
[7] M.Przybyla,数据科学 vs 机器学习。区别就在这里。(2020 年)
引导和打包 101
参数和统计数据应该属于分布,而不是单值!
照片来自免费 pixabay 上的照片
Bootstrapping 方法用于了解统计数据的概率分布,而不是从表面上看。自举的基本原理依赖于使用替换对数据集进行重采样。在这里,我们将看看为什么它的数学工作,以及如何可以用来估计模型参数的情况下,一个简单的线性回归模型。
一些数学
想象一下,我们有一个数据集,它看起来像是x
和y
之间的线性关系,但是当我们观察y
的值时,我们这样做是添加了噪声。
y = ax + b + ε
其中ε 取自随机分布 N(0,σ)。
使用最大似然估计,我们可以解析地找到对a
和b
的估计,让我们称这些估计为â
和b̂
。我们不仅可以找到数值的形式,还可以计算估计量的方差。
估计量的方差始终是一个重要的问题,因为它提供了点估计的置信度。在像这样的高斯噪声回归模型的情况下,我们发现估计值â
和b̂
的分布也是高斯分布。这种分布完全由其均值和方差来定义。
在这个简单的线性回归模型中,a
的方差是σ /(nσ_x)其中σ_x 是x
的方差。
那么我们为什么需要自举呢?
自举的目的也是为参数或统计数据创建置信区间。这是通过假设观察到的数据是真实的数据分布来创建多个新数据集来实现的。这意味着我们可以用该分布中的替换样本来创建新的数据集。这可用于训练模型或计算统计数据,方式与我们通常所做的相同,但不同之处在于,我们会多次重复这一操作,每次都使用新的重采样数据集。
这样做的好处是不需要分析计算参数或统计数据的分布,您可以使用用于拟合模型的不同采样数据集,根据经验简单地计算出分布。
自举起作用有两个主要原因,首先是弱大数定律 (WLLN)和概率收敛。
首先,从分布X
中抽取的随机变量X_i
的 WLLN 状态,随着n
趋于无穷大,X_i
的n
样本的经验均值将收敛于X
( E(X)
)的例外。更正式地说:
X̄ = 1/n (X_1 + ... X_n)
X̄ → E(X) as n → ∞
但是,WLLN 假设每个估计都是独立同分布的(iid ),如果使用替换抽样,这一假设将不再成立。如果您有无限量的数据,细分为更小的部分,并使用每个细分来计算参数值,这将是正确的。然而,在极限情况下,随着数据集的大小变大,这两种情况变得等同——根据经验,我们知道它也适用于较小的数据集。
其次,概率的收敛是指样本的经验方差收敛于分布方差(这里很好的展示了)。
这在实践中是如何运作的?
让我们来看一个将最佳拟合的线性线拟合到基本数据集的基本示例。
import numpy as np
import pandas as pd
from scipy import statsx = np.arange(-10,10,0.25)
y = x*2 - 10 + 10*np.random.randn(len(x))
data = np.concatenate((x[:,np.newaxis],y[:,np.newaxis]), axis=1)
不是我们建立我们的引导函数:
def bootstrap(data,n_trials=1000):
index = np.arange(data.shape[0])
bootstrap_index = np.random.choice(index,
size=data.shape[0]*n_trials,
replace=True)
bootstrap_data = np.reshape(data[bootstrap_index,:],
(n_trials,*data.shape))
return bootstrap_data
这个简单的函数假设第一维是与数据点数量相关的维度,即(M x F ),其中 F 是特征的数量。然后,它随机选择 M x n_trials 索引,并返回原始数据的经过整形的采样版本。现在它的形状是 n_trials x M x F。
现在,让我们将最佳拟合的线性线拟合到数据的每个引导版本:
a_hats = []
b_hats = []
sigma_hats = []
for d in bootstrap_data:
a_hat, b_hat = stats.linregress(d[:,0],d[:,1])[:2]
a_hats.append(a_hat)
b_hats.append(b_hat) sigma_hats.append(np.std(d[:,0]*a_hat + b_hat - d[:,1]))
a_hats = np.array(a_hats)
b_hats = np.array(b_hats)
sigma_hats = np.array(sigma_hats)
现在我们有了模型ŷ = âx + b̂ + N(0,σ_hat)
的α和β参数的分布
本例中â, b̂, σ_hat
的平均值分别为 2.15、-9.28 和 9.58,相比之下,数据是用值 2、-10 和 10 生成的,因此我们得到了很好的估计,但我们是否在置信区间内呢?每个参数都有 0.20,1.11 和 0.69 的标准偏差,所以我们在平均值的一个标准偏差内!
我们还可以查看参数的分布以及均值和标准差等点统计数据。
â
和b̂
的分布
记得在我们计算出â
的理论方差之前,对于这个数据,与我们估计的方差 0.041 相比,这将产生 0.037 的值,考虑到我们不必做任何分析,这还不错!
我们还可以使用â
和b̂
的每个值来进行预测。在预测点中,我们也可以取第 95 和第 5 百分位,并为每个x
值绘制它们。
median = np.percentile(predict, 50, axis=0)
upper = np.percentile(predict, 99, axis=0)
lower = np.percentile(predict, 1, axis=0)
df = pd.DataFrame({"y":y},index=x)
ax = pd.DataFrame({"median": median,
"upper":upper,
"lower":lower}
,index=x).plot()
ax = plt.scatter(x=df.index, y=df.y)
所以现在我们可以做出 90%置信区间的预测。如果我们只对â
和b̂
进行单一预测,我们就无法做到这一点。
制袋材料
Bagging 是一个与 bootstrapping 非常相关的概念,它涉及相同的重采样方法来训练多个模型。
bagging 最常见的应用是应用于决策树分类器/回归器。浅层决策树有一个方差问题,因为它们高度依赖于训练它们所用的数据(特征空间中的分裂是在特征之间进行的,并且您进行 spits 的顺序可以极大地改变分类器)。
那么我们该如何应对呢?如果我们用重新采样的数据集训练大量的树,并进行平均预测,那么得到的分类器的总方差会减少。
来自维基百科的随机森林分类器
为了演示这一点,我们可以用 sklearn 训练一个森林和一棵树,并查看结果。
from sklearn.ensemble import RandomForestRegressor
from sklearn.tree import DecisionTreeRegressorforest = RandomForestRegressor(n_estimators=100)
tree = DecisionTreeRegressor()forest.fit(x[:,np.newaxis],y)tree.fit(x[:,np.newaxis],y)x_test = np.arange(-10,10,0.25)
y_test = x*2 - 10 + 10*np.random.randn(len(x))
如果我们在测试集上用一棵树和一个森林进行预测,我们会得到:
我们可以看到,预测的方差如我们所预测的那样大大减少了。
关于打包和引导的精彩讲座,我推荐康奈尔大学的这个讲座。
我们学到了什么?
我们看一下引导的基本概念,以及为什么它是任何数据科学家必备的有用技能。我们希望了解它是如何工作的,我们如何在 Numpy 中实现它,以及我们如何使用它来建模参数的分布,而不是将它们建模为单个值。我们还介绍了 bagging 的概念,以及如何应用它来提高存在方差问题的分类器的性能。
你真的应该学习一下图形数据库。原因如下。
苹果 | 谷歌 | SPOTIFY | 其他
丹尼斯·戈斯内尔和马蒂亚斯·布罗意切勒在 TDS 播客
编者按:迈向数据科学播客的“攀登数据科学阶梯”系列由 Jeremie Harris 主持。Jeremie 帮助运营一家名为sharpes minds的数据科学导师初创公司。可以听下面的播客:
在职业生涯中取得成功的一个很好的方法是,对哪些技术在未来会变得重要下好赌注,并投入时间学习它们。如果这听起来像是您想做的事情,那么您肯定应该关注图形数据库。
图形数据库并不是全新的,但随着图形数据(描述事物的互联网络的数据)变得比以往任何时候都更容易获得,它们变得越来越重要。社交媒体、供应链、移动设备跟踪、经济学和许多其他领域正在产生比以往任何时候都多的图表数据,这些数据集中埋藏着许多最大问题的潜在解决方案。
这就是为什么我如此兴奋地与 Denise Gosnell 和 Matthias Broecheler 交谈,他们分别是 DataStax 的首席数据官和首席技术官,DataStax 是一家专门为企业解决数据工程问题的公司。除了他们在 DataStax 使用图形数据库的丰富经验,Denise 和 Matthias 最近还写了一本名为图形数据从业者指南的书,并在本期“走向数据科学”播客中抽出时间讨论了数据工程和图形数据的基础知识。
以下是我最喜欢的外卖:
- 图形数据的一个奇怪之处在于,在您可以分析它之前,您需要决定您想要使用什么视角来查看它。你是否有兴趣探索单个节点的行为(例如,“我想知道我能否根据给定的人在 LinkedIn 上的联系预测 X”),或者探索整个网络的行为(例如,“LinkedIn 上的一些联系比其他联系更重要吗?”?答案将改变你询问数据的方式,以及你对数据集的看法。Denis 和 Mattias 在他们的书中确定了图表数据的四种不同观点,并在播客中讨论了它们。
- 您可以对图表数据使用的机器学习算法取决于您对数据集采用的上述四个视角中的哪一个。如果您选择以突出显示特定节点的方式来表示数据,而不是以突出显示节点聚类的方式来表示数据,则不同的预测模型和无监督模型可能适用,也可能不适用。
- 谈到数据工程,不同的工具在不同的规模下变得有用(并且最终是必要的)。不同工具之间的决策面很难解释,但我们在播客中讨论了这一点。何时使用 SQL vs noSQL,何时应用 Spark 或 Cassandra 等工具取决于您正在处理的数据集的复杂性和大小。
- 我向 Denise 和 Matthias 询问了一些资源,像我这样的图形数据库新手可以使用这些资源来了解这个主题,他们推荐了 NetworkX ,并使用了来自 Kaggle 的链接预测挑战的数据。
你可以点击这里在 Twitter 上关注丹尼斯,点击这里在 Twitter 上关注马蒂亚斯。另外,你可以在这里找到他们书的 GitHub。
你可以在 Twitter 上关注我。
订阅《走向数据科学》的 月刊 直接在你的邮箱✨里接收我们最好的文章、视频和播客
您应该现在就开始使用 FastAPI
如果您还没有尝试过 FastAPI,现在是时候了
得益于 Flask、Django、Falcon 等优秀的框架,Python 一直是开发轻量级 web 应用程序的热门选择。由于 Python 是机器学习的头号语言,所以它特别方便将模型打包并作为服务公开。
多年来,Flask 一直是这项工作的首选工具,但是如果你还没有听说的话,现在有了一个新的挑战者。 FastAPI 是 Python 的一个相对较新的 web 框架,从它的前辈那里获得灵感,完善它们并修复它们的许多缺陷。它建立在 Starlette 之上,为桌面带来了大量令人敬畏的功能。
最近,它获得了巨大的吸引力,在过去的 8 个月里,我每天都与它一起工作,我可以自信地说,炒作是合理的。如果你还没有尝试过,我想给你五个尝试的理由。
简单而出色的界面
所有的 web 框架都需要在功能和给开发者自由之间取得平衡。姜戈很强大,但非常固执己见。另一方面,Flask 级别很低,足以提供很大的自由度,但是还有很多事情留给用户去做。FastAPI 更像是一个瓶子,但它设法达到了更健康的平衡。
为了给你一个例子,让我们看看如何在 FastAPI 中定义端点。
为了定义模式,它使用 Pydantic,这是另一个很棒的 Python 库,用于数据验证。这在这里很容易做到,但是后台发生了很多事情。验证输入的责任委托给了 FastAPI。如果请求不正确,例如email
字段包含一个 int,将返回一个适当的错误代码,而不是应用程序因可怕的内部服务器错误(500)而崩溃。而且几乎是免费的。
这个简单的示例应用程序可以与 uvicorn 一起提供:
uvicorn main:app
现在,应用程序可以接受请求了。在这种情况下,请求应该是这样的
curl -X POST "[http://localhost:8000/login](http://localhost:8000/login)" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"email\":\"string\",\"password\":\"string\"}"
锦上添花的是,它使用交互式 Swagger UI 根据 OpenAPI 自动生成文档。
FastAPI 应用程序的 Swagger UI
异步ˌ非同步(asynchronous)
与 Node.js 或 Go 中的框架相比,Python WSGI web 框架的最大缺点之一是无法异步处理请求。自从引入 ASGI 以来,这不再是一个问题,FastAPI 正在充分利用这一点。您所要做的只是用关键字async
声明端点,就像这样:
依赖注入
FastAPI 有一个非常酷的方法来管理依赖关系。尽管开发人员没有被强制这样做,但是强烈建议使用内置的注入系统来处理端点中的依赖关系。
举个例子,让我们写一个端点,用户可以在这里对某些文章发表评论。
当端点被调用时,FastAPI 会在运行时自动评估get_database
函数,因此您可以根据需要使用返回值。这(至少)有两个很好的理由。
- 您可以通过修改
app.dependency_overrides
字典来全局覆盖依赖关系。这可以使测试变得轻而易举,因为您可以很容易地模仿对象。 - 依赖关系(在我们的例子中是
get_database
)可以执行更复杂的检查,允许您将它们从业务逻辑中分离出来。这大大简化了事情。例如,用户认证可以通过这个轻松实现。
易于与数据库集成
SQL、MongoDB、Redis 或您选择的任何东西,FastAPI 都不会强迫您围绕它们构建应用程序。如果您曾经尝试过使用 Django 处理 MongoDB,您就会知道这有多痛苦。有了 FastAPI,您不需要做额外的工作,将数据库添加到您的堆栈中是尽可能简单的。(或者更准确地说,要完成的工作量将由您选择的数据库决定,而不是由 web 框架增加的复杂性决定。)
但说真的,看看这美景。
瞧啊。我能看见你在打字
pip install fastapi
已经传到你的终端了。
GraphQL 支持
当您处理一个复杂的数据模型时,REST 可能是一个严重的障碍。当前端的微小变化需要更新端点的模式时,这绝对不是好玩的。GraphQL 在这些情况下大放异彩。尽管 GraphQL 支持并不是 Python web 框架中唯一的,但 Graphene 和 FastAPI 可以无缝地协同工作。不需要为 Django 安装任何类似graphene_django
的扩展,它本身就可以工作。
+1:优秀的文档
当然,如果没有同样优秀的文档,一个优秀的框架不可能真正闪耀光芒。Django,Flask 和所有其他人在这方面都很出色,但 FastAPI 与他们不相上下。当然,由于它年轻得多,目前还没有关于它的书籍,但这只是时间问题。
如果你想看看 FastAPI 的实际应用,我正好有一个完美的指南给你!我写了一个详细的教程,你可以用 Docker,Docker Compose 和 GitHub Actions 来部署你的机器学习模型!
FastAPI、Docker 和 GitHub 操作实用指南
towardsdatascience.com](/how-to-properly-ship-and-deploy-your-machine-learning-model-8a8664b763c4)
总而言之,无论你是在寻找一个快速轻量级的框架来服务于你的深度学习模型还是更复杂的东西,FastAPI 都能提供。如果您还没有尝试过,我强烈建议您尝试一下。我很确定你会坚持下去。