原文:KDNuggets
每一种复杂 DataFrame 操作,直观地解释与可视化
原文:
www.kdnuggets.com/2020/11/dataframe-manipulation-explained-visualized.html
评论
由 Andre Ye,Critiq 的联合创始人,Medium 的编辑和顶级作者。
我们的前三大课程推荐
1. Google 网络安全证书 - 快速进入网络安全职业生涯。
2. Google 数据分析专业证书 - 提升你的数据分析水平
3. Google IT 支持专业证书 - 支持你所在组织的 IT
Pandas 提供了广泛的 DataFrame 操作,但其中许多操作复杂且不易上手。本文介绍了 8 种基本的 DataFrame 操作方法,涵盖了数据科学家需要了解的几乎所有操作函数。每种方法将包括解释、可视化、代码以及记忆技巧。
Pivot
旋转一个表格会创建一个新的“旋转表”,将现有的数据列投影为新表中的元素,包括索引、列和值。初始 DataFrame 中将成为索引和列的列显示为唯一值,这两个列的组合将显示为值。这意味着旋转不能处理重复值。
代码以旋转名为 df 的 DataFrame 如下:
df.pivot(index='foo', columns='bar', values='baz')
记忆技巧:在数据操作的领域之外,旋转是围绕某种对象进行的转动。在体育中,人们可以通过脚来“旋转”:pandas 中的旋转也是类似的。原始 DataFrame 的状态围绕 DataFrame 的中心元素旋转成一个新的 DataFrame。有些元素非常字面意义上旋转或转换(如列 bar)。
Melt
Melt 可以被视为一种“反旋转”,因为它将基于矩阵的数据(具有两个维度)转换为基于列表的数据(列表示值,行表示唯一数据点),而旋转则相反。考虑一个二维矩阵,其中一个维度为 B 和 C(列名),另一个维度为 a、b 和 c(行索引)。
我们选择一个 ID、一个维度以及一个或多个列来包含值。包含值的列被转换为两列:一列用于变量(值列的名称),另一列用于值(包含的数字)。
结果是 ID 列值(a, b, c)和值列(B, C)的每种组合,以及其对应的值,以列表格式组织。
melt 操作可以这样在 DataFrame df 上执行:
df.melt(id_vars=['A'], value_vars=['B','C'])
记住: 将某物像蜡烛一样融化,是将一个固化的复合物转变为几个更小的独立元素(蜡滴)。融化一个二维 DataFrame 会解开其固化的结构,并将其各部分记录为列表中的独立条目。
爆炸
爆炸是一个有用的方法,可以清除数据中的列表。当某列被爆炸时,列中的所有列表都作为新行列出在相同的索引下(为避免此情况,只需在之后调用 .reset_index())。非列表项如字符串或数字不会受到影响,空列表是 NaN 值(可以使用 .dropna() 清理这些)。
爆炸 DataFrame df 中的列 ‘A’ 非常简单:
df.explode(‘A’)
记住: 爆炸某物会释放其所有内部内容——爆炸一个列表会将其元素分开。
堆叠
堆叠将任何大小的 DataFrame 进行‘堆叠’,将列作为现有索引的子索引。因此,结果 DataFrame 只有一列和两个层级的索引。
对名为 df 的表格进行堆叠非常简单,使用 df.stack()。
为了访问,比如说,狗的身高,只需调用基于索引的检索两次,如 df.loc[‘dog’].loc[‘height’]。
记住: 从视觉上看,stack 将表格的二维性转换为将列堆叠成多层索引。
Unstack
Unstacking 将一个多层索引的 DataFrame 进行“展开”,将指定层级的索引转换为新 DataFrame 的列,并附上其对应的值。对一个表格执行一次 stack 再执行一次 unstack 不会改变它(不考虑存在的‘0’)。
Unstacking 的一个参数是层级。在列表索引中,-1 索引会返回最后一个元素;层级也是如此。层级为 -1 表示将最后一个索引层级(最右边的那个)展开。举个进一步的例子,当层级设置为 0(第一个索引层级)时,它中的值会变成列,而接下来的索引层级(第二个)则会变成变换后 DataFrame 的索引。
Unstacking 的操作方式与 stacking 相同,但需要层级参数:df.unstack(level=-1)。
记住: Unstack 意思是“撤销堆叠”。
合并
合并两个 DataFrame 是在共享的‘键’上将它们按列(水平)组合起来。这个键允许将表格合并,即使它们的顺序不同。完成合并的 DataFrame 将默认在值列上添加后缀 x 和 y。
要合并两个 DataFrames df1 和 df2(其中 df1 包含 leftkey,df2 包含 rightkey),调用:
df1.merge(df2, left_on='leftkey', right_on='rightkey')
合并不是 pandas 的函数,而是附加到 DataFrame 上的。总是假定合并附加到的 DataFrame 是‘左表’,而在函数中作为参数调用的 DataFrame 是‘右表’,并具有对应的键。
合并函数默认执行的是所谓的内连接(inner join):如果每个 DataFrame 中有一个在另一个 DataFrame 中未列出的键,则该键不会包含在合并后的 DataFrame 中。另一方面,如果一个键在同一个 DataFrame 中列出两次,那么所有相同键的值组合都会在合并后的表中列出。例如,如果 df1 中的键 foo 有 3 个值,而 df2 中有 2 个相同键的值,则最终 DataFrame 中会有 6 个条目,其中 leftkey=foo 和 rightkey=foo。
记住:合并 DataFrames 就像在驾驶时合并车道 —— 水平地进行。想象每一列都是高速公路上的一个车道;为了合并,它们必须水平结合。
连接(Join)
连接(Joins)通常比合并(merge)更受青睐,因为它具有更简洁的语法和更广泛的水平合并 DataFrames 的可能性。连接的语法如下:
df1.join(other=df2, on='common_key', how='join_method')
使用连接时,公共键列(类似于合并中的 right_on 和 left_on)必须命名相同。 how 参数是一个字符串,指代 join 可以将两个 DataFrame 组合在一起的四种方法之一:
-
‘left’:包括所有 df1 的元素,仅当 df2 的键是 df1 的键时才附加 df2 的元素。否则,合并后的 DataFrame 中 df2 的缺失部分将标记为 NaN。
-
‘right’:‘left’,但在另一个 DataFrame 上。包括所有 df2 的元素,仅当 df1 的键是 df2 的键时。
-
‘outer’:包括两个 DataFrame 中的所有元素,即使一个键在另一个 DataFrame 中不存在 —— 缺失的元素标记为 NaN。
-
‘inner’:仅包括键在两个 DataFrame 键中都存在的元素(交集)。合并的默认设置。
记住:如果你曾使用 SQL,那么‘join’一词应该立即与你的列级添加关联。如果没有,那么‘join’和‘merge’在定义上非常相似。
连接(Concat)
合并(merges)和连接(joins)是水平操作,而连接(concatenations)或简称为 concats,则是按行(垂直)附加 DataFrames。例如,考虑两个具有相同列名的 DataFrames df1 和 df2,使用 pandas.concat([df1, df2]) 进行连接:
虽然你可以通过将轴参数设置为 1 使用 concat 进行列级连接,但直接使用 join 会更方便。
请注意,concat 是 pandas 的函数,而不是 DataFrame 的函数。因此,它接收一个需要连接的 DataFrame 列表。
如果 DataFrame 有一个不包含在另一个 DataFrame 中的列,默认情况下,该列会被包括在内,缺失值列为 NaN。为了避免这种情况,添加一个额外的参数,join=’inner’,这将只连接两个 DataFrame 共有的列。
记住: 在列表和字符串中,可以追加额外的项目。连接是将额外的元素附加到现有内容中,而不是添加新信息(如按列连接)。由于每个索引/行是一个单独的项,连接会将额外的项添加到 DataFrame 中,可以将其视为行的列表。
Append 是另一种合并两个 DataFrame 的方法,但它执行与 concat 相同的功能,效率和灵活性较低。
有时内置函数不够用。
尽管这些函数覆盖了你可能需要的数据操作范围,但有时所需的数据操作过于复杂,一个或一系列函数无法完成。探索复杂的数据操作方法,如解析函数、迭代投影、高效解析等,更多内容请见这里。
原始文档。经许可转载。
相关:
更多相关话题
数据科学 PoC 的 7 个步骤 – 获取指南
原文:
www.kdnuggets.com/2018/02/dataiku-7-steps-data-science-poc-guidebook.html
|
|
|
|
| |
|
让你的下一个数据科学 PoC 取得成功
|
| 数据科学或分析的 PoC(概念验证)不仅仅是一个概念;它是一个必须产生结果的过程。有关成功运行 PoC 的七个步骤的详细指南,从选择用例到定义交付物及其中的所有内容,免费下载白皮书*《推动成功数据科学 PoC 的 7 个步骤》*。|
| |
| |
|
|
|
|
更多相关内容
实现数据科学生产的检查清单
原文:
www.kdnuggets.com/2017/06/dataiku-checklist-data-science-implemented-production.html
**由 Dataiku 提供。**赞助文章。
构建数据科学项目和训练模型只是第一步。将模型投入生产环境是公司经常失败的地方。
我们的前三个课程推荐
1. 谷歌网络安全证书 - 快速进入网络安全职业生涯。
2. 谷歌数据分析专业证书 - 提升你的数据分析技能
3. 谷歌 IT 支持专业证书 - 支持你的组织的 IT
实际上,将模型实施到现有的数据科学和 IT 堆栈中对许多公司来说非常复杂。原因?设计环境和实际生产环境之间的工具和技术的不一致。
一年多来,我们调查了成千上万家公司涵盖各种行业和数据科学发展,了解他们如何克服这些困难,并分析了结果。以下是你在设计到生产管道中需要牢记的关键事项。
1. 你的打包策略
数据项目是复杂的。它包含大量不同格式的数据存储在不同位置,还有很多代码行和脚本,这些代码和脚本用不同的语言将原始数据转换为预测。如果你不支持在生产过程中对代码或数据进行适当打包,这将会很棘手,尤其是当你处理预测时。
典型的发布流程应包括:
-
设立版本控制工具来管理代码版本。
-
创建打包脚本,将代码和数据打包成 zip 文件。
-
将其部署到生产环境中。
2. 你的模型优化和再训练
小的迭代是长期准确预测的关键,因此建立一个重新训练、验证和部署模型的流程至关重要。实际上,模型需要不断发展,以适应新行为和基础数据的变化。
高效重新训练的关键是将其设置为数据科学生产工作流中的一个独立步骤。换句话说,一个自动命令每周重新训练一个预测模型候选者,对该模型进行评分和验证,并在经过人工操作员简单验证后进行更换。
3. 你的业务团队的参与
在我们的调查中,我们发现公司报告在生产部署中遇到许多困难与业务团队的有限参与之间存在强烈的相关性。
在项目开发过程中,这是至关重要的,以确保最终产品对业务用户是可理解和可用的。一旦数据产品投入生产,它仍然是业务用户评估模型性能的重要成功因素,因为他们的工作基于此。实现这一点有多种方式;最受欢迎的方法是设置实时仪表板以监控并深入了解模型性能。自动发送包含关键指标的电子邮件可能是一个更安全的选择,以确保业务团队随时掌握信息。
4. 你的 IT 环境一致性策略
现代数据科学依赖于多种技术,如 Python、R、Scala、Spark 和 Hadoop,以及开源框架和库。当生产环境依赖于 JAVA、.NET 和 SQL 数据库等技术时,这可能会导致问题,因为可能需要对项目进行完全重编码。
工具的增多也会带来维护生产环境和设计环境的困难,需要保持当前版本和软件包(一个数据科学项目可能依赖于多达 100 个 R 包、40 个 Python 包和数百个 Java/Scala 包)。为了解决这个问题,两种流行的解决方案是维护一个通用包列表或为每个数据项目设置虚拟机环境。
5. 你的回滚策略
在有效的监控到位之后,下一个里程碑是建立回滚策略,以应对性能指标下降的情况。回滚策略基本上是一个保险计划,以防你的生产环境失败。
一个好的回滚策略必须包括数据项目的所有方面,包括数据、数据模式、转换代码和软件依赖关系。它还必须是用户(即使他们不是经过培训的数据工程师)可以访问的过程,以确保在失败时能快速反应。
6. 你的项目和流程的可审计性
能够审计以了解每个输出版本对应哪个代码是至关重要的。追踪数据科学工作流对于追踪任何不当行为、证明没有非法数据使用或隐私侵犯、避免敏感数据泄漏,或展示数据流的质量和维护都非常重要。
控制版本的最常见方法是(毫不意外地)Git 或 SVN。然而,保持有关数据库系统的信息日志(包括表创建、修改和架构更改)也是一种最佳实践。
7. 无论你的用例是否需要实时评分或在线机器学习
实时评分和在线学习在许多用例中越来越受欢迎,包括评分欺诈预测或定价。许多进行评分的公司使用批处理和实时评分的组合,甚至仅使用实时评分。越来越多的公司报告使用在线机器学习。
这些技术在生产环境、回滚和故障转移策略、部署等方面带来了复杂性。然而,它们并不需要为这些技术设置独立的过程和堆栈,只需要监控调整。
8. 你的系统和过程的可扩展性
随着数据科学系统在数据量和数据项目的增加中扩展,保持性能至关重要。这意味着建立一个足够弹性的系统,以应对显著的过渡,不仅是数据的纯量或请求数量,还有复杂性或团队可扩展性。
但可扩展性问题可能会意外出现,例如未清空的垃圾箱、大量日志文件或未使用的数据集。通过制定检查工作流效率或监控作业执行时间的策略来预防这些问题。
如果你想要了解更多关于优化设计到生产过程的最佳实践,可以查看我们的广泛生产调查结果。
更多相关主题
Dataiku 数据科学工作室
原文:
www.kdnuggets.com/2014/08/dataiku-data-science-studio.html
,一个完整的数据科学软件工具,为开发人员和分析师显著缩短了在构建预测应用时耗时的加载、清理、训练、测试和部署周期。我们 Dataiku 通过尝试捕捉数据科学家日常工作的方式构建了这款软件。我们认为统计软件需要适应大数据时代,在这个时代,数据集成和数据管道能力比以往任何时候都更为重要。
加载和准备
首先,DSS 能够直接快速连接到当前最常见的数据源(Hadoop、SQL、Cassandra、MongoDB、S3 等)和格式(CSV、Excel、SAS、JSON、Avro 等)。连接到数据源后,任何严肃的建模工作中的第一步是清理数据。如你所知,这一过程通常占据数据科学家多达 80% 的时间。为了加快这一进程,我们的工作室配备了强大的数据集成功能。首先,DSS 会自动推断数据的智能数据类型(如性别、国家、IP 地址、URL、日期等)。分析师可以利用这些智能数据类型以自动化的方式验证和转换数据(如从 IP 中提取国家、从日期中提取星期几等)。他们还可以在 DSS 的界面上执行更平凡的任务,如替换、分组、拆分、计算等,该界面会即时显示任何操作的可视化反馈。
建模:从列到预测
一旦数据清理完毕且丰富,用户可以训练监督式或非监督式模型。它会自动创建一个可调的特征工程管道,包括缺失值填补、虚拟变量编码、影响编码、特征生成和降维。
然后,它使用流行的 Scikit-Learn 和 H2O 框架中的算法训练不同的模型。用户可以比较模型、分析其性能,并通过 Web UI 调整所有参数。致力于白盒方法,DSS 允许高级用户为整个管道生成完整的 Python 源代码(用 Python 编写),以便他们可以随意修改。
从模型到预测应用
一旦模型建立,用户可以创建强大且可重复的工作流,支持重新训练或评分。这些工作流包括从原始数据到预测的完整数据流程。工作流引擎是增量的(例如,它可以在每小时更新的数据上增量工作)且稳健的(它可以智能地从部分数据暂时不可用的情况中恢复)。这些工作流可以通过 Python、R、SQL 或 Pig 中的自定义代码扩展,支持完全的 Hadoop 基础负载。预测值可以通过 REST API 访问或由 DSS 直接发布到各种目标(例如 ElasticSearch、FTP 服务器、内部数据仓库)。
我们构建了数据科学工作室,以缩短负载-清理-训练-测试周期,而不降低其复杂度;这是一个面向合格数据科学家的工具,同时对技术水平较低的商业智能或营销人员也保持可访问性。
免费社区版可用(限制为 100,000 行和一个用户)。工具的免费试用版也可在 www.dataiku.com/products/trynow/
获取。
简要作者简介:
Florian 是 Dataiku 的首席执行官。他在巴黎的一家搜索引擎技术公司 Exalead 开始了他的技术职业生涯。在那里,他领导了由 50 位才华横溢的数据极客组成的研发团队,直到公司在 2010 年的 1.5 亿美元退出。Florian 随后成为了社交游戏领域的欧洲领军企业 IsCool 的首席技术官。Florian 还曾作为自由职业首席数据科学家在多家公司工作,例如欧洲广告领军者 Criteo。Florian 定期在技术论坛如 Open World Forum 或巴黎 Java 用户组上发表演讲。
相关:
-
GraphLab 会议,图分析和机器学习,旧金山 7 月 21 日
-
KDnuggets 分析、数据挖掘、数据科学软件调查 – 已分析
-
使用 H2O 深度学习,5 月 21 日网络讲座
相关主题
Dataiku DSS 3.1 – 现在支持 5 种机器学习后端和 Scala!
原文:
www.kdnuggets.com/2016/08/dataiku-dss-31-machine-learning-backends-scala.html
![]() | ![]() |
---|---|
![]() | ![]() |
| Dataiku DSS 3.1 现在支持 5 种机器学习后端和 Scala!
Dataiku DSS 3.1 引入了新的视觉机器学习引擎,允许用户在无代码接口中创建强大的预测应用程序。所有技能水平的用户现在都可以直接在 Dataiku DSS 3.1 的视觉分析部分中使用HPE Vertica 机器学习、H2O Sparkling Water、MLlib、Scikit-Learn 和 XGBoost,在数据科学项目中应用强大的机器学习算法,而无需编写一行代码。
视觉无代码和自由形式代码转换的融合是 Dataiku DSS 在数据应用原型制作和生产中的主要优势之一。除了Python、R、SQL、Hive、Impala 和 Pig,Dataiku DSS 3.1 现在还允许 Apache Spark 用户用 Scala 编写转换和交互式笔记本,将 Spark 的原生和最高效的语言的力量带给使用 Dataiku DSS 的数据分析师。
![]() |
---|
![]() |
![]() |
| Dataiku DSS 3.1 的其他功能包括:
-
新的外部数据库:与 IBM Netezza、Hana 和 Big Query 的集成。
-
改进的用户体验:流畅的导航和项目依赖关系,优化用户体验和项目管理。
-
与 Tableau 的无缝集成:用户可以通过为数据集创建自定义导出格式(包括 Tableau .tde 文件)来扩展 Dataiku DSS 的兼容性。这允许与 Tableau 和其他工具更好地集成。
![]() |
---|
www.dataiku.com | 联系我们 |
更多相关主题
自助分析和运营化——为什么你需要两者
原文:
www.kdnuggets.com/2018/11/dataiku-self-service-analytics-operationalization.html
赞助文章。
|
| |
|
|
|
| |
|
|
|
通过运营化 + 自助分析启用 AI 服务
|
|
|
|
许多希望变得更具数据驱动的组织会问:自助分析(SSA)还是数据科学运营化(o16n)——哪一个能让我达到目标?答案是:你需要两者结合。
获取白皮书 以了解今天顶级数据驱动公司如何扩展其高级分析和机器学习工作。
|
|
|
| |
|
|
| |
|
|
|
| |
|
更多相关话题
DataLang:为数据科学家设计的新编程语言……由 ChatGPT 创建?
原文:
www.kdnuggets.com/2023/04/datalang-new-programming-language-data-scientists-chatgpt.html
图片由作者使用 Midjourney 创建
这篇文章将为你提供一个关于我给 ChatGPT 运行的项目概述,即创建一种新的数据科学导向编程语言。详细内容都在下面,但由于一些原因可能会在后续阅读中显现,我想给 ChatGPT 一个机会,以引人入胜的方式介绍这门语言。而且,它确实很棒。所以先阅读这篇文章,然后我们可以在另一端进一步讨论。
数据科学的世界即将经历一次震撼性的变革,随着一种为数据科学家量身定制的开创性编程语言的出现。在今天的文章中,我们将带你深入了解这一革命性语言的构思、开发和实现过程:DataLang。
想象一下,一种语言被精心设计以简化你的数据科学任务,聚焦于可用性、效率和协作。这样一种语言旨在打破障碍,将你的数据驱动洞察推向前所未有的高度。DataLang 是那些渴望更强大工具集的数据科学家和分析师的答案,这些工具集专门为他们独特的需求和挑战量身定制。
在这篇引人入胜的揭秘文章中,我们将探讨 DataLang 的构思及其成为数据科学领域最受欢迎语言的历程。加入我们,揭示独家见解、意外挑战以及关键时刻,这些都是让 DataLang 成为现实的因素,由让这一切成为可能的团队亲自叙述。
但要小心——这不是普通的博客文章。我们将揭示隐藏的宝藏和令人瞠目的功能,这些都将令你着迷、投入,并让你渴望更多。DataLang 的揭示只是开始,相信我们,你不会想错过一行代码。
所以,做好准备,迎接数据科学未来的激动人心的旅程,让 DataLang 引领你的道路。旅程开始吧!
至少我们没有一开始就过度夸张这个概念……
初步设计
最近,我给 ChatGPT-4 任务,让它为数据科学家设计一种新的编程语言,适合他们日常的工作任务。这是设置新任务的初步提示:
你是一位经验丰富的计算机科学家,专注于系统编程。一个数据科学团队找到了你,要求你设计一种新的编程语言,专门为数据导向任务而优化,使其非常适合数据科学家在日常工作中使用。提供这种语言的高级描述;它与其他流行的数据科学语言(如 Python、R 和 SQL)有何不同;这种语言最重要的特性是什么;可能遇到的问题是什么;以及你认为其他重要的内容。请记住,它的标准库和内置功能应提供尽可能多的支持,以满足日常数据科学操作的需求。编写一个简短的程序来演示这种语言的特性、语法和功能。
语言名称:DataLang
高级描述
DataLang 是一种专门为数据导向任务设计的语言,优化了在数据科学应用中的性能和易用性。它结合了 Python、R 和 SQL 的最佳特性,并拥有独特的功能,旨在简化数据科学工作流程。
关键区分特征
原生数据结构:DataLang 将具有内置的数据结构,如数据框和张量,这些结构在数据科学任务中常被使用。这些结构将集成功能以处理缺失值、强制执行模式和数据类型强制转换。
延迟求值:为了提高性能,DataLang 将对数据操作任务使用延迟求值,只有在必要时才执行操作。这可以节省内存和计算时间,特别是在处理大型数据集时。
查询能力:受 SQL 启发,DataLang 将具有内置的查询能力,允许用户在不需要外部库的情况下过滤、排序、连接和聚合数据。
集成可视化:DataLang 将具有内置的可视化库,支持各种图表类型并且易于自定义。可视化功能将与原生数据结构无缝集成。
函数式和并行编程:DataLang 将鼓励函数式编程实践,并支持并行处理,以便在大规模数据任务中获得更好的性能。
广泛的库:DataLang 将拥有广泛的标准库,重点关注统计分析、机器学习、深度学习、自然语言处理和时间序列分析。
互操作性:DataLang 将支持与其他流行语言如 Python 和 R 的互操作性,允许用户利用现有的库和代码库。
可能存在的问题
采用:作为一种新语言,DataLang 可能面临吸引用户和建立强大社区的挑战。
兼容性:确保与现有工具、库和平台的兼容性对 DataLang 的成功至关重要。
性能优化:平衡易用性和性能优化将是一个持续的挑战。
DataOps:5 个你需要了解的关键点
原文:
www.kdnuggets.com/2021/05/dataops-5-things-need-know.html
comments
由 Sigmoid 提供
1. 什么是 DataOps?
我们的 Top 3 课程推荐
1. 谷歌网络安全证书 - 快速进入网络安全职业生涯。
2. 谷歌数据分析专业证书 - 提升你的数据分析技能
3. 谷歌 IT 支持专业证书 - 支持你的组织 IT 工作
简而言之,DataOps 可以定义为一种方法论,它为数据管道提供了速度和敏捷性,从而提升数据质量和交付实践。DataOps 促成 了组织内部的更大协作,并在大规模推动数据项目。借助 自动化,DataOps 改善了数据的可用性、可访问性和集成性。它将人员、流程和技术结合起来,为所有利益相关者提供可靠且高质量的数据。根植于敏捷方法论,DataOps 旨在通过持续交付分析洞察来提供最佳的消费者体验。
2. DataOps 和 DevOps 有何不同?
DataOps 通常被视为应用于数据分析的 DevOps。然而,DataOps 不仅仅是这样。它还结合了数据工程师和数据科学家的关键能力,为数据驱动的企业提供了一个强大的、过程驱动的结构。DevOps 结合了软件开发和 IT 运维,以确保系统开发生命周期中的持续交付。而 DataOps 还带来了数据链中关键参与者——数据开发者、数据分析师、数据科学家和数据工程师的专业能力——以确保数据流开发中的更大协作。此外,在比较 DataOps 和 DevOps 时,值得注意的是,DevOps 关注于转变软件开发团队的交付能力,而 DataOps 则通过数据工程师的帮助,强调分析模型和智能系统的转型。
3. 为什么 DataOps 对数据工程至关重要?
数据工程师在确保数据在整个分析流程中得到妥善管理方面发挥着重要作用。此外,他们还负责数据的最佳使用和安全。DataOps 通过提供工具、数据、代码和组织数据环境的端到端编排,帮助数据工程师促进关键功能领域。它可以促进团队之间的协作和沟通,以适应不断变化的客户需求。简单来说,DataOps 通过提供各数据利益相关者之间更大的协作,帮助数据工程师实现可靠性、可扩展性和灵活性,从而增强他们的能力。
4. DataOps 工程师在实现先进企业分析中扮演什么角色?
现在,DataOps 工程师的角色与数据工程师略有不同。DataOps 工程师仔细定义和管理数据开发的环境。这个角色还包括为数据工程师提供关于工作流的指导和设计支持。至于**先进企业分析**,DataOps 工程师在自动化数据开发和集成方面发挥着重要作用。凭借对软件开发和敏捷方法论的深入了解,DataOps 工程师通过元数据目录跟踪文档来源,并建立指标平台以标准化计算,从而为企业分析做出贡献。DataOps 工程师的一些关键角色包括:
-
测试自动化
-
代码库创建
-
框架编排
-
协作和工作流管理
-
数据溯源和影响分析
-
数据准备和集成
5. DataOps 团队常用的流行技术平台有哪些?
可以公平地说,DataOps 仍然是一个不断发展的学科,数据驱动的组织每天都在不断学习。然而,随着技术创新,许多平台已经在行业中留下了印记,并在不断扩大其影响力。以下是一些 DataOps 团队常用的流行平台。
-
Kubernetes
Kubernetes 是一个开源编排平台,允许公司将多个 docker 容器组合成一个单一的单位。这使得开发过程变得更加快捷和简单。**Kubernetes**可以帮助团队在单个集群中的节点上管理数据调度,简化工作负载,并将容器分类为逻辑单元,以便于发现和管理。
-
ELK(Elasticsearch、Logstash、Kibana)
Elastic 的 ELK Stack 是一个广泛使用的日志管理平台,包含三个不同的开源软件包——Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一个运行在 Lucene 搜索引擎上的 NoSQL 数据库,而 Logstash 是一个接受来自多个来源的数据输入并进行数据转换的日志管道解决方案。Kibana 则本质上是一个在 Elasticsearch 之上操作的可视化层。
-
Docker
Docker 平台通常被认为是最简单明了的工具,可以帮助公司使用容器扩展高端应用,并安全地在云上运行它们。安全性是区别该平台的关键方面之一,因为它提供了一个用于测试和执行的安全环境。
-
**Git **
Git 是一款领先的版本控制应用程序,允许公司有效地管理和存储数据文件中的版本更新。它可以控制和定义特定的数据分析管道,如源代码、算法、HTML、参数文件、配置文件、容器和日志。由于这些数据工件只是源代码,Git 使它们容易被发现和管理。
-
**Jenkins **
Jenkins 是一个开源的基于服务器的应用程序,帮助公司无缝地协调一系列活动,以实现持续自动化集成。该平台支持从开发到部署的应用程序端到端开发生命周期,同时通过自动化测试加速过程。
-
Datadog
Datadog 是一个开源的云监控平台,通过统一的仪表板,帮助公司全面监控应用堆栈中的指标、追踪和日志。该平台提供了约 400 个内置集成和一个预定义的仪表板,简化了流程。
汇总
随着时间的推移,企业 AI 和 ML 应用的复杂性和规模只会增加,从而推动数据管理实践的融合需求。为了满足客户需求并更快地部署应用程序,组织需要调和数据目录和访问功能,同时确保完整性。而这正是 DataOps 实践能够帮助公司创造差异的地方。
简介:Jagan 是一位 Dev Ops 宣导者,领导 Sigmoid 的 Dev Ops 实践。他在维护和支持客户在消费品、零售、广告科技、金融、快餐和高科技垂直行业中的关键数据系统方面发挥了重要作用。
原文。转载已获许可。
相关:
-
在 Databricks 上使用 MLflow 进行模型实验、跟踪和注册
-
数据科学家、数据工程师及其他数据职业解读
-
为什么你应该考虑成为数据工程师而不是数据科学家
了解更多相关话题
如何构建由机器学习驱动的智能仪表板
原文:
www.kdnuggets.com/2018/06/datarobot-build-intelligent-dashboards-powered-machine-learning.html
|
|
| |
| |
| |
|
|
|
| |
| |
| |
| 网络研讨会 - 2018 年 6 月 5 日星期二 1:00 pm ET/ 10:00 am PT - 45 分钟问答环节 |
| |
|
| 注册 |
|
| |
|
|
| |
|
| |
|
| |
|
|
| |
|
在当今数据驱动的激烈竞争时代,获取洞察的速度已成为成功的关键。预测模型的价值很小,除非它们能迅速在您的业务中投入使用。商业分析师通过改善数据洞察和提供具有机器学习功能的主动“智能”仪表板,可以取得巨大进步。
在这次网络研讨会中,分析行业专家 Jen Underwood,Impact Analytix 的创始人,将演示如何使用 Tableau、Qlik、Microsoft Power BI 甚至 Excel 等仪表板工具可视化机器学习结果。只需几次鼠标点击,您就可以切片、切块、最大化,并将机器学习的价值转化为可操作的智能仪表板。
我们的前三大课程推荐
1. 谷歌网络安全证书 - 快速进入网络安全职业生涯。
2. 谷歌数据分析专业证书 - 提升您的数据分析技能
3. 谷歌 IT 支持专业证书 - 支持您组织的 IT 工作
网络研讨会参与者将:
-
学习“智能”仪表板的常见业务用例
-
发现可视化预测模型的最佳方法
-
观看使用 DataRobot 和 Tableau 实时创建智能仪表板
|
| |
|
|
| |
|
| 注册 |
|
| |
|
|
|
|
| |
| DataRobot 公司,国际广场 5 楼,波士顿,MA 02110 |
| |
|
相关话题
异常检测简介
原文:
www.kdnuggets.com/2017/04/datascience-introduction-anomaly-detection.html
由 DataScience.com 提供赞助。
本概述旨在为数据科学和机器学习领域的初学者提供指导。几乎不需要正式的专业经验,但读者应具备一些基本的微积分(特别是积分)、编程语言 Python、函数式编程和机器学习的知识。
简介:异常检测
异常检测是一种用于识别不符合预期行为的异常模式的技术,这些模式被称为离群点。它在商业中有许多应用,从入侵检测(识别可能表示黑客攻击的网络流量中的异常模式)到系统健康监测(在 MRI 扫描中发现恶性肿瘤),以及信用卡交易中的欺诈检测到操作环境中的故障检测。
本概述将涵盖几种检测异常的方法,以及如何使用简单移动平均(SMA)或低通滤波器在 Python 中构建检测器。
图 1. 太阳黑子的异常
什么是异常?
在开始之前,重要的是建立异常的定义边界。异常可以广泛地分类为:
-
点异常: 如果数据的单个实例与其他数据偏差过大,则该实例异常。 业务用例: 基于“消费金额”检测信用卡欺诈。
-
上下文异常: 异常是特定于上下文的。这种类型的异常在时间序列数据中很常见。 业务用例: 在假期期间每天花费 100 美元用于食物是正常的,但其他时候可能会显得异常。
-
集体异常: 一组数据实例集体有助于检测异常。 业务用例: 某人意外地尝试从远程机器复制数据到本地主机,这种异常将被标记为潜在的网络攻击。
异常检测类似于 - 但不完全相同于 - 噪声去除和新颖性检测。 新颖性检测 关注于识别新观察中未包含在训练数据中的未观察到的模式 - 比如圣诞节期间对 YouTube 新频道的突然兴趣。 噪声去除 (NR) 是保护分析免受不必要观察发生的过程;换句话说,就是从原本有意义的信号中去除噪声。
异常检测技术
简单统计方法
识别数据异常的最简单方法是标记那些偏离分布的常见统计属性的数据点,包括均值、中位数、众数和分位数。假设异常数据点的定义是偏离均值一定标准差的数据点。遍历时间序列数据的均值并不完全简单,因为它不是静态的。你需要一个滚动窗口来计算数据点的平均值。从技术上讲,这叫做滚动平均或移动平均,旨在平滑短期波动并突出长期波动。从数学上讲,n 期简单移动平均也可以定义为“低通滤波器”。(卡尔曼滤波器是这种度量的更复杂版本;你可以在这里找到一个非常直观的解释。)
挑战 低通滤波器可以帮助你在简单用例中识别异常,但在某些情况下,这种技术可能不起作用。以下是一些例子:
-
数据中包含的噪声可能类似于异常行为,因为正常行为和异常行为之间的边界通常并不精确。
-
异常或正常的定义可能会频繁变化,因为恶意对手会不断适应。因此,基于移动平均的阈值可能并不总是适用。
-
这种模式基于季节性。这涉及到更复杂的方法,例如将数据分解为多个趋势,以识别季节性的变化。
基于机器学习的方法
下面是流行的基于机器学习的异常检测技术的简要概述。
基于密度的异常检测
基于密度的异常检测基于 k 最近邻算法。
假设: 正常数据点通常位于密集的邻域中,而异常数据点则远离这些邻域。
使用评分评估最近的数据点,这个评分可能是欧氏距离或依赖于数据类型(分类或数值)的类似度量。它们可以大致分为两种算法:
-
k 最近邻:k-NN 是一种简单的非参数懒惰学习技术,用于根据距离度量(如欧氏距离、曼哈顿距离、闵可夫斯基距离或汉明距离)的相似性来分类数据。
-
数据的相对密度:这通常被称为局部离群因子(LOF)。这个概念基于一种叫做可达距离的距离度量。
基于聚类的异常检测
聚类是无监督学习领域中最流行的概念之一。
假设: 相似的数据点往往属于相似的组或簇,这取决于它们与局部中心的距离。
K-means 是一种广泛使用的聚类算法。它创建了‘k’个相似的数据点簇。落在这些组之外的数据实例可能会被标记为异常。
基于支持向量机的异常检测
支持向量机 是另一种有效的异常检测技术。SVM 通常与监督学习相关,但也有扩展(例如OneClassCVM,)可用于将异常检测作为无监督问题(即训练数据未标记)。该算法学习一个软边界,以便使用训练集对正常数据实例进行聚类,然后,通过测试实例调整自身,以识别落在学习区域之外的异常。
根据用例,异常检测器的输出可能是用于过滤特定领域阈值的数值标量值或文本标签(例如二进制/多标签)。
使用低通滤波器构建简单的检测解决方案
在本节中,我们将重点介绍如何使用移动平均构建一个简单的异常检测包,以识别样本数据集中每月太阳黑子数量的异常,该数据集可以通过以下命令在这里下载:
wget -c -b www-personal.umich.edu/~mejn/cp/data/sunspots.txt
该文件包含 3,143 行数据,包含 1749-1984 年间收集的太阳黑子信息。太阳黑子定义为太阳表面上的黑点。研究太阳黑子有助于科学家理解太阳在一段时间内的性质,特别是其磁性特性。
阅读本教程的其余部分,包括DataScience.com 网站上的 Python 代码。
我们的前三大课程推荐
1. 谷歌网络安全证书 - 快速进入网络安全职业生涯。
2. 谷歌数据分析专业证书 - 提升你的数据分析技能
3. 谷歌 IT 支持专业证书 - 支持你的组织 IT
更多相关话题
相关性简介
原文:
www.kdnuggets.com/2017/02/datascience-introduction-correlation.html
由 DataScience.com 赞助。
介绍:什么是相关性,为什么它有用?
相关性是最广泛使用——也最被误解——的统计概念之一。在本概述中,我们提供了几种类型的相关性的定义和直觉,并展示了如何使用 Python pandas
库计算相关性。
我们的三大课程推荐
1. 谷歌网络安全证书 - 快速进入网络安全职业生涯。
2. 谷歌数据分析专业证书 - 提升你的数据分析技能
3. 谷歌 IT 支持专业证书 - 为你的组织提供 IT 支持
“相关性”一词指的是数量之间的相互关系或关联。在几乎任何业务中,以其与其他因素的关系来表达某一数量是有用的。例如,当营销部门增加电视广告支出时,销售可能会增加,或者客户在电子商务网站上的平均购买金额可能取决于与该客户相关的多个因素。通常,相关性是理解这些关系的第一步,随后可以建立更好的业务和统计模型。
那么,为什么相关性是一个有用的指标?
-
相关性可以帮助从一个数量预测另一个数量
-
相关性可以(但通常不会,如下面的一些例子所示)指示因果关系的存在
-
相关性作为许多其他建模技术的基本量和基础
更正式地说,相关性是描述随机变量之间关联的统计度量。计算相关系数的方法有多种,每种方法测量不同类型的关联强度。下面我们总结了三种最常用的方法。
相关性的类型
在深入了解相关性如何计算之前,介绍协方差的概念非常重要。协方差是两个变量X和Y之间关联的统计测量。首先,通过减去均值来中心化每个变量。这些中心化的分数被相乘,以测量一个变量的增加是否与另一个变量的增加有关。最后,计算这些中心化分数乘积的期望值(E)作为关联的总结。直观地,中心化分数的乘积可以被看作是一个矩形的面积,其中每个点与均值的距离描述了矩形的一边:
)
如果两个变量倾向于朝相同的方向移动,我们期望连接每个点(X_i
, Y_i
)到均值(X_bar
, Y_bar
)的“平均”矩形具有一个较大且正向的对角线向量,对应于上面方程中的较大正产品。如果两个变量倾向于朝相反的方向移动,我们期望平均矩形具有一个较大且负向的对角线向量,对应于上面方程中的较大负产品。如果变量之间无关,则这些向量在平均值上应相互抵消——总体对角线向量的大小应接近 0,对应于上面方程中的产品接近 0。
如果你在想“期望值”是什么,它是随机变量的平均值或均值μ的另一种说法。它也被称为“期望”。换句话说,我们可以写出以下方程来用不同的方式表达相同的量:
)
协方差的问题在于它保持变量X和Y的尺度,因此可以取任何值。这使得解释变得困难,也使得比较协方差变得不可能。例如,Cov(X,Y)= 5.2 和Cov(Z,Q)= 3.1 告诉我们这些对是正相关的,但在没有查看这些变量的均值和分布的情况下,很难判断X和Y之间的关系是否强于Z和Q之间的关系。这就是相关性变得有用的地方——通过用数据的某种变异度标准化协方差,它产生了具有直观解释和一致尺度的量。
Pearson 相关系数
Pearson 是最广泛使用的相关系数。Pearson 相关性测量连续变量之间的线性关联。换句话说,这个系数量化了两个变量之间的关系可以用一条线来描述的程度。值得注意的是,虽然相关性可以有多种解释,但 Karl Pearson 在 120 多年前开发的相同公式今天仍然是最广泛使用的。
在这一部分,我们将介绍几种流行的皮尔逊相关系数的表述及其直观解释(简称ρ)。
皮尔逊本人开发的相关系数原始公式使用了原始数据和两个变量X和Y的均值:
)
在这种表述中,原始观察数据通过减去其均值进行中心化,并通过标准差的度量进行重新缩放。
表达相同数量的另一种方式是使用期望值、均值μ[X]、μ[Y]和标准差σ*[X]、σ*[Y]:
请注意,这个分数的分子与上述协方差的定义相同,因为均值和期望可以互换使用。将两个变量之间的协方差除以标准差的乘积,确保了相关系数总是落在-1 和 1 之间。这使得解释相关系数变得更加容易。
下图显示了皮尔逊相关系数的三个例子。ρ 越接近 1,表示一个变量的增加与另一个变量的增加关联越大。另一方面,ρ 越接近-1,表示一个变量的增加会导致另一个变量的减少。请注意,如果X和Y是独立的,则ρ接近 0,但反之则不成立!换句话说,即使两个变量之间存在强关系,皮尔逊相关系数也可能很小。我们将很快看到这种情况如何发生。
那么,我们如何解释皮尔逊相关系数呢?
在 DataScience.com 上阅读其余内容:相关性介绍
更多相关主题
K-means 聚类简介:教程
原文:
www.kdnuggets.com/2016/12/datascience-introduction-k-means-clustering-tutorial.html
由 DataScience 提供。 赞助帖子。
。
Andrea Trevino 博士在本教程中为广泛使用的 K-means 聚类算法提供了初学者入门介绍。
K-means 聚类是一种无监督学习,当数据中的结果类别或组未知时使用。这种算法发现数据中自然存在的组,结果允许用户快速标记新数据。一般来说,聚类是理解数据的关键工具。
这个算法可以用于多个应用,包括行为分割、库存分类、传感器测量排序以及检测机器人或异常等。本教程涵盖了确定聚类的迭代算法,并通过 Python 的配送车队数据示例进行讲解。
相关主题
自然语言处理简介,第一部分:词汇单元
原文:
www.kdnuggets.com/2017/02/datascience-introduction-natural-language-processing-part1.html
由DataScience.com赞助的帖子。
在本系列中,我们将深入探讨与自然语言处理的研究和应用相关的核心概念。下面的第一部分介绍了该领域,并解释了如何识别词汇单元作为数据预处理的一种方法。
自然语言处理简介
自然语言处理是一组允许计算机和人类进行互动的技术。考虑从某些数据生成过程提取信息的过程:一家公司希望预测其网站上的用户流量,以便提供足够的计算资源(服务器硬件)来满足需求。工程师可以定义相关信息为请求的数据量。由于他们控制数据生成过程,他们可以在网站上添加逻辑,将每个数据请求存储为一个变量。然后,他们可以将测量单位定义为请求的数据量,以字节为单位,从而使我们能够将信息表示为整数。有了良好的信息表示,工程师可以将其存储在表格数据库中,以便分析师可以根据这些历史数据进行预测。
自然语言处理是上述步骤的应用——定义信息的表示、从数据生成过程解析信息以及构建、存储和使用存储信息的数据结构——到嵌入自然语言的信息。
使语言成为自然语言的正是使自然语言处理变得困难的原因;自然语言中信息表示的规则是在没有预定的情况下演变而来的。这些规则可以是高层次的和抽象的,例如如何使用讽刺来传达意义;也可以是相当低层次的,例如使用字符“s”来表示名词的复数。自然语言处理涉及识别并利用这些规则,通过代码将非结构化的语言数据转换为具有模式的信息。语言数据可以是正式的文本,例如报纸文章,也可以是非正式的语音,例如电话交谈的录音。来自不同上下文和数据源的语言表达将具有不同的语法、句法和语义规则。在一个环境中有效的提取和表示自然语言信息的策略,在其他环境中往往无效。
商业用途
公司通常可以访问包含有价值信息的自然语言记录。产品评论或甚至 Twitter 上的推文可能包含与产品相关的特定投诉或功能请求,这可以帮助优先排序和评估提案。在线市场可能有可用的商品描述,有助于定义产品分类法。数字报纸可能有在线文章的档案,可用于构建搜索引擎,让用户找到相关内容。代表自然语言的信息也可以用于构建强大的应用程序,如回答问题的机器人或翻译软件。
自然语言处理可以用来从文本中识别特定的投诉。
需要自然语言处理的项目通常涉及这些挑战。解决这些问题通常要求我们将多个子任务串联起来,每个子任务可能有多种解决方案。自然语言处理方法的范围可能会让人望而却步,因为它高度专业化、广泛且缺乏一个总体概念框架。虽然自然语言处理的完整总结超出了本文的范围,但我们将介绍一些在通用自然语言处理工作中常用的概念。我们假设我们可以使用文本数据(而非需要额外语音识别步骤的听觉数据)。
识别词汇单元
由于自然语言通常由单词组成,许多自然语言处理项目的初始步骤是识别某些原始文本中的单词。然而,单词的概念可能过于限制或模糊。字符串“cats”和“cat”是词典中相同条目的不同形式;它们应该被视为等同吗?“Star Wars”在词典中没有条目,虽然它包含一个空格,但我们认为它是一个整体。这些是定义词汇单元时涉及的挑战,词汇单元代表词汇的基本元素。
对于特定任务,研究人员必须定义什么构成合适的词汇单元。单数和复数形式的单词是否应被视为同一个词汇单元?假设我们正在构建一个问答系统,并收到以下查询:
A: “找到离我最近的电影院。”
B: “找到离我最近的电影院。”
在 A 中,用户暗示她想查看多个电影院,而在 B 中,她只是想要一个最近的电影院。忽略单数和复数之间的区别会降低我们应用的质量。
另外,假设我们要总结以下产品评论:
A: “该产品存在一些连接问题。”
B: “该产品存在一个连接问题。”
在这里,“问题”和“问题”之间的区别并不相关。
虽然不完全详尽,但分词和规范化是从自然语言中解析词汇单元的两个常见步骤。分词是将字符序列分割成词素的过程,每个词素代表一个术语的实例。规范化是我们用来将术语压缩成词汇单元的一系列步骤。
分词算法可以很简单且确定性,例如每当字符不是字母数字时将字符分割成词素。非字母数字字符可能是空格、标点符号、井号等。我们可以使用模式匹配来实现这种方法,根据一些规则检查字符或字符序列的存在,其中我们将这些模式定义为正则表达式(通常缩写为“regex”)。例如,我们可以用正则表达式字符串“0-9”或“\d.”来表示所有数字字符的集合。我们可以将带有修饰符的术语组合成复杂的搜索模式。我们可以通过每次匹配查询[^A-Za-z0-9]+
来将字符分割在非字母数字字符上。正则表达式的应用非常广泛,几乎所有现代编程语言中都有相应的实现。
很容易找到这种策略失败的例子(“didn’t ≠ [“didn”, “t”])。在一些应用中,研究人员使用多个复杂的正则表达式查询和特定于形态的规则来捕获这些模式,并通过有限状态机来确定正确的分词。编码一个详尽的规则集可能很困难,并且将取决于应用程序和分析的文本数据类型(尽管已有一些部分规则集被汇编)。为了适应新的语料库,可以通过在手动分词的文本上训练统计模型来构建分词器,尽管由于确定性方法的成功,这种方法在实践中很少使用。这些模型可能会查看字符属性序列,例如是否连续的字母数字字符以大写字母开头,并将分词建模为这些属性的函数。模型学习使用的规则将取决于提供的训练语料库(如 Twitter、医学文章等)。
另一个挑战是多项字符序列可以构成一个词汇单位。这些多项序列可能是像“New York”这样的命名实体,在这种情况下,我们进行命名实体识别或只是常见短语。解决这个问题的一种方法是通过将所有长度为 n 的项集(n-grams)作为标记来允许表示中的一些冗余。如果我们仅限于单个词和二元组,“New York”将被标记为“New”,“York”,“New York”。为了增加一些复杂性,而不是穷尽所有 n-grams,我们可以选择一组术语的最高阶 n-gram 表示,依据某些条件,比如它是否存在于硬编码词典(称为地名词典)中,或在我们的数据集中是否常见。或者,我们可以使用机器学习模型。如果给定单词的概率,p(word[i] | word[i-1]),在前面的单词下足够高,我们可能会将这个序列视为一个二项词汇单位(或者,我们可以使用公式p(word[i] | word[i-1]) = bigram) 使用标记的示例)。虽然平滑可以帮助改善问题,但这些语言模型通常难以泛化,并且需要一定程度的迁移学习、特征工程、确定性或抽象。概率 n-gram 模型需要标记的示例、机器学习算法和特征提取器(后两者包含在斯坦福 NER 软件中)。如果这些模型不值得投资,高质量的预训练模型通常可以在新的数据集上成功使用。
在分词后,我们可能希望对我们的词元进行标准化。 标准化是一组规则,旨在将所有词汇等价类的实例减少到其规范形式。
这可能包括如下过程:
-
复数 -> 单数(例如 cats -> cat)
-
过去时态 -> 现在时态(例如 ran -> run)
-
副词形式 -> 形容词形式(quickly -> quick)
-
连字符 -> 连接
标准化的一种方法是通过一个称为词形还原的过程将单词减少到其词典形式。一个术语的词元具有词典条目中包含的所有元数据:词性、定义(词义)和词干。词形还原传统上需要一个形态学解析器,在这个解析器中,我们根据词语的形态学元素(前缀、后缀等)完全特征化某个未经处理的词语(时态、复数形式、词性等)。为了构建一个解析器,我们创建一个已知词干和词缀的词典(词汇表),并包含有关它们的元数据,如可能的词性,列举规则(形态学语法)以规范词素如何组合在一起(例如复数修饰符“-s”必须跟在名词后面),最后列举规则(正字法规则)以规范在不同形态状态下单词的变化(例如,一个以“-c”结尾的过去时动词必须添加一个“k”,如“picnic -> picnicked”)。这些规则和术语传递给一个有限状态机,该状态机遍历输入,维护一个状态或一组特征值,然后在检查规则和词汇表与文本匹配时更新(类似于正则表达式的工作方式)。
我们如何定义等价类的特异性(哪些形态学元素相关),以及我们使用的标准化程度和提取的形态学元数据,取决于我们的应用。在信息检索中,我们通常只关心文本的一些高层语义。所有的词素或传达意义的元素(除了词干)都可以与所有形态学元数据(如时态)一起丢弃。词干提取算法通常使用替换规则,如:
- 如果给定的词干包含一个元音,我们会从所有包含该词干的词元中移除“-ing”(如“barking”→“bark”,但“string”→“string”)。
Porter 词干提取器可能是最著名的替换类型词干提取算法,尽管还有其他算法。所有这些类型的词干提取器都容易出错,但简单且易于实现,并且是大多数应用工作的良好起点。
最终,构建预处理管道的目标包括:
-
所有相关信息被提取。
-
所有不相关的信息都被丢弃。
-
文本被表示为足够少的等价类。
-
数据应以有用的形式存在,如 ASCII 编码的字符串列表或抽象数据结构,如句子或文档。
相关性、充分性和有用性的定义取决于项目的要求、开发团队的实力以及时间和资源的可用性。此外,在许多情况下,预处理管道的强度可以决定项目的整体成功。因此,在构建管道时需要谨慎。
在将原始文本转换为字符串或词汇单元的分词数组之后,研究人员或开发者可能会采取步骤对其文本数据进行预处理,例如字符串编码、停用词和标点符号去除、拼写校正、词性标注、分块、句子分割和语法分析。下表展示了研究人员在给定任务和一些原始文本时可能使用的一些处理类型的示例:
原始文本 | 处理后 | 步骤 | 任务 | 管道如何适应任务 |
---|---|---|---|---|
She sells seashells by the seashore. | [‘she’,‘sell’,‘seashell’,‘seashore’] | 分词,词形还原,停用词去除,标点去除 | 主题建模 | 我们只关注高级、主题性强和语义丰富的词 |
John is capable. | John/PROPN is/VERB capable/ADJ ./PUNCT | 分词,词性标注 | 命名实体识别 | 我们关注每个词,但希望指明每个词所扮演的角色,以便构建命名实体识别候选列表 |
Who won? I didn’t check the scores. | [u’who’, u’win’], [u’i’,u’do’,u’not’,u’check’,u’score’] | 分词,词形还原,句子分割,标点去除,字符串编码 | 情感分析 | 我们需要所有词,包括否定词,因为它们可以否定积极的陈述,但不关心时态或词形 |
预处理后,我们通常需要采取额外步骤将文本信息以量化形式表示。在本系列的第二部分中,我们将讨论各种抽象和数值文本表示方法。
本文中包含的依赖关系图是使用了令人惊叹的开源库 DisplaCy 构建的。点击这里查看。
想要继续学习吗?下载我们的Forrester 新研究,了解保持公司在数据科学前沿的工具和实践。
原文。
我们的前三个课程推荐
1. 谷歌网络安全证书 - 快速进入网络安全职业生涯。
2. 谷歌数据分析专业证书 - 提升你的数据分析技能
3. 谷歌 IT 支持专业证书 - 支持你的组织进行 IT 工作
更多相关主题
DataScience.com 发布了用于解释预测模型决策过程的 Python 包。
原文:
www.kdnuggets.com/2017/05/datascience-skater-python-package-interpreting-predictive-models.html
赞助文章。
DataScience.com 发布了其新 Python 库 Skater 的测试版,该库用于解释预测模型。Skater 通过结合多种算法来解释数据与模型预测之间的关系,使用户能够评估模型的表现并识别关键特征。
随着机器学习在商业应用中变得越来越受欢迎——例如评估贷款申请者的信用 worthiness、向观众推荐相关内容以及预测在线购物者的消费金额——解释也正成为模型构建过程中的不可或缺的一部分。Skater 提供了一个通用框架,用于描述预测模型,无论构建它们所用的算法是什么,使数据科学从业者可以自由选择所用技术,而不必担心其复杂性。
“在许多情况下,数据科学家会使用简单的建模技术,如线性回归或决策树,因为这些模型容易解释,”DataScience.com 首席战略官威廉·梅尔坎(William Merchan)说。“实际上,他或她是在牺牲性能以换取可解释性;例如,神经网络或集成模型更难以解释,但能产生高度准确的预测。Skater 旨在消除这种妥协。”
Skater 具有模型无关的部分依赖图,这是一种描述预测变量与目标变量之间关系的可视化图表,并且变量重要性衡量了特征对预测的影响程度。它还改进了现有的模型解释方法,如局部可解释模型无关解释(LIME)。Skater 允许将这些方法应用于任何机器学习模型——从集成模型到神经网络——无论是本地可用还是作为 API 部署。
使用 Skater,数据科学从业者可以:
-
评估模型在完整数据集或单个预测上的行为:Skater 通过利用和改进现有技术(包括部分依赖图、相对变量重要性和 LIME),实现了对模型的全局和局部解释。
-
识别潜在的特征交互并建立领域知识:从业者可以使用 Skater 理解特征在特定用例中的相互关系——例如,信用风险模型如何使用银行客户的信用历史、支票账户状态或现有信用额度来批准或拒绝其信用卡申请——然后利用这些信息来指导未来的分析。
-
衡量模型在生产环境中部署后的性能变化:Skater 支持对已部署模型的解释,给从业者提供了衡量特征交互如何在不同模型版本间变化的机会。
“DataScience.com 企业数据科学平台的一个关键特点是能够通过 REST API 部署模型,使其能够立即与仪表板或实时应用程序集成,”Merchan 补充道。“Skater 帮助我们更进一步,使我们能够以数据科学从业者以及最终的非技术利益相关者都能理解的方式,解释部署在我们平台上的复杂模型——无论是在我们的平台上还是其他地方。”
Skater 包可通过 GitHub 获取,并可以通过 pip 从 PyPI 轻松安装。
欲了解更多信息,请访问 www.datascience.com。
我们的前三个课程推荐
1. Google 网络安全证书 - 快速进入网络安全职业轨道。
2. Google 数据分析专业证书 - 提升你的数据分析能力
3. Google IT 支持专业证书 - 支持你的组织的 IT
更多相关话题
Python 中的数据集拆分最佳实践
原文:
www.kdnuggets.com/2020/05/dataset-splitting-best-practices-python.html
评论
因此,你有一个整体数据集,需要将其拆分为训练数据和测试数据。也许你是为了监督学习而这样做,也许你使用 Python 来实现。
这是讨论在拆分数据集时需要考虑的三个具体因素,处理这些因素的方法,以及如何使用 Python 实际实现这些考虑事项。
来源: Adi Bronshtein
我们的前 3 个课程推荐
1. 谷歌网络安全证书 - 快速进入网络安全职业生涯。
2. 谷歌数据分析专业证书 - 提升你的数据分析技能
3. 谷歌 IT 支持专业证书 - 支持你的组织 IT
对于我们的示例,我们将使用 Scikit-learn 的train_test_split
模块,该模块对拆分数据集很有用,无论你是否使用 Scikit-learn 来执行机器学习任务。你可以用其他方式手动进行这些拆分(例如,仅使用 Numpy),但 Scikit-learn 模块包含一些有用的功能,使得这一过程更简单。但请注意;也许你过去使用过这个模块进行数据拆分,但在进行时没有考虑到某些因素。
1. 随机打乱实例
第一个考虑因素是:你的实例是否被打乱?只要没有理由不打乱数据(例如,你的数据是时间序列),我们希望确保我们的实例不会仅仅按顺序分割,因为我们的实例可能以某种方式被添加,从而将一些不必要的偏差引入模型中。
例如,查看 Scikit-learn 中包含的 iris 数据集版本在加载时如何排列实例:
from sklearn.datasets import load_iris
iris = load_iris()
X, y = iris.data, iris.target
print(f"Dataset labels: {iris.target}")
Dataset labels:
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]
如果你将数据集按照 3 个类别的实例数量相等的比例分为 2/3 用于训练和 1/3 用于测试,你的新分离数据集将没有标签交叉。这在学习特征以预测类别标签时显然是个问题。幸运的是,train_test_split
模块默认会先对数据进行洗牌(你可以通过将shuffle
参数设置为False
来覆盖此设置)。
为此,必须将feature
和target
向量(X
和y
)传递给模块。你应该设置一个random_state
以确保可重复性。需要设置train_size
或test_size
中的一个,但两个都不是必需的。如果你明确设置了两个,它们的总和必须等于 1。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y,
train_size=0.67,
random_state=42)
print(f"Train labels:\n{y_train}")
print(f"Test labels:\n{y_test}")
Train labels:
[1 2 1 0 2 1 0 0 0 1 2 0 0 0 1 0 1 2 0 1 2 0 2 2 1 1 2 1 0 1 2 0 0 1 1 0 2
0 0 1 1 2 1 2 2 1 0 0 2 2 0 0 0 1 2 0 2 2 0 1 1 2 1 2 0 2 1 2 1 1 1 0 1 1
0 1 2 2 0 1 2 2 0 2 0 1 2 2 1 2 1 1 2 2 0 1 2 0 1 2]
Test labels:
[1 0 2 1 1 0 1 2 1 1 2 0 0 0 0 1 2 1 1 2 0 2 0 2 2 2 2 2 0 0 0 0 1 0 0 2 1
0 0 0 2 1 1 0 0 1 2 2 1 2]
你可以看到我们现在已经将实例打乱了。
2. 类别分层
下一步需要考虑的是:我们新分离的训练集和测试集的类别计数是否均匀分布?
import numpy as np
print(f"Numbers of train instances by class: {np.bincount(y_train)}")
print(f"Numbers of test instances by class: {np.bincount(y_test)}")
Numbers of train instances by class: [31 35 34]
Numbers of test instances by class: [19 15 16]
这不是一个均匀的划分。这涉及到算法是否有平等的机会学习数据集中每个类别的特征,并随后在每个类别的相同数量的实例上测试其学习成果。在较小的数据集中特别重要,但应始终关注。
我们可以使用train_test_split
的stratify
选项强制训练集和测试集中的类别比例保持一致,注意我们将根据y
中的类别分布进行分层。
X_train, X_test, y_train, y_test = train_test_split(X, y,
train_size=0.67,
random_state=42,
stratify=y)
print(f"Train labels:\n{y_train}")
print(f"Test labels:\n{y_test}")
Train labels:
[2 0 2 1 0 0 0 2 0 0 1 0 1 1 2 2 0 0 2 0 2 0 0 2 0 1 2 1 0 1 0 2 1 2 1 0 2
0 2 0 1 1 0 2 1 1 0 2 1 2 0 1 0 2 1 1 1 1 1 1 2 1 2 2 0 2 1 1 2 0 2 2 2 0
2 0 0 2 2 2 0 1 2 2 0 1 1 1 1 1 0 2 1 2 0 0 1 0 1 0]
Test labels:
[2 1 0 1 2 1 1 0 1 1 0 0 0 0 0 2 2 1 2 1 2 1 0 2 0 2 2 0 0 2 2 2 0 1 0 0 2
1 1 1 1 1 0 0 2 1 2 2 1 2]
print(f"Numbers of train instances by class: {np.bincount(y_train)}")
print(f"Numbers of test instances by class: {np.bincount(y_test)}")
Numbers of train instances by class: [34 33 33]
Numbers of test instances by class: [16 17 17]
现在看起来更好了,原始数据告诉我们这是最优的分层划分。
3. 划分分割
第三个考虑因素与我们的测试数据有关:我们的建模任务内容是否只有一个由之前未见数据组成的测试数据集,还是应该使用两个这样的数据集——一个用于在微调过程中验证我们的模型,可能还有多个模型,另一个作为最终的保留集用于模型比较和选择。
来源: Stack Exchange
如果我们选择两个这样的集合,这意味着会有一个数据集在所有假设测试、所有超参数调优以及所有模型训练到最佳性能之后才会被使用,作为实验的最后一步,这个数据集只会被模型看到一次。关于测试集与验证集的工作有很多,你可以查阅相关资料;我在这里不会进一步探讨其理由和论点。
然而,假设你得出结论你确实想要使用测试集和验证集(你应该得出这个结论),使用train_test_split
来构建它们很简单;我们将整个数据集分一次,分离出训练数据,然后再分一次,将剩余的数据划分为测试集和验证集。
在下面,使用数字数据集,我们将 70%用于训练数据集,并暂时将剩余部分分配给测试集。我们继续执行上述最佳实践。
from sklearn.datasets import load_digits
digits = load_digits()
X, y = digits.data, digits.target
X_train, X_test, y_train, y_test = train_test_split(X, y,
train_size=0.7,
random_state=42,
stratify=y)
print(f"Numbers of train instances by class: {np.bincount(y_train)}")
print(f"Numbers of test instances by class: {np.bincount(y_test)}")
Numbers of train instances by class: [124 127 124 128 127 127 127 125 122 126]
Numbers of test instances by class: [54 55 53 55 54 55 54 54 52 54]
注意训练集和临时测试集中的分层类别。
然后我们以相同的方式重新拆分测试集——这次修改输出变量名称、输入变量名称,并小心更改stratify
类向量引用——使用 50/50 的拆分比例用于测试和验证集。
X_test, X_val, y_test, y_val = train_test_split(X_test, y_test,
train_size=0.5,
random_state=42,
stratify=y_test)
print(f"Numbers of test instances by class: {np.bincount(y_test)}")
print(f"Numbers of validation instances by class: {np.bincount(y_val)}")
Numbers of test instances by class: [27 27 27 27 27 28 27 27 26 27]
Numbers of validation instances by class: [27 28 26 28 27 27 27 27 26 27]
再次注意所有数据集中的类别分层,这样是最优和理想的。
现在你可以根据数据的需要训练、验证和测试尽可能多的机器学习模型。
另一个考虑因素:你可能想要考虑使用交叉验证,而不是简单的训练/测试或训练/验证/测试策略。我们将下一次讨论交叉分层的考虑因素。
相关:
-
Python 中的稀疏矩阵表示
-
Scikit-learn 0.23 中的 5 个伟大新特性
-
处理不平衡数据集的 5 个最有用技巧
更多相关主题
Python 中的日期处理和特征工程
原文:
www.kdnuggets.com/2021/07/date-pre-processing-feature-engineering-python.html
也许像我一样,你在用 Python 处理数据时经常处理日期。也许像我一样,你在处理 Python 中的日期时感到沮丧,并发现你为了重复做相同的事情而过于频繁地查阅文档。
我们的前 3 门课程推荐
1. Google Cybersecurity Certificate - 快速通道进入网络安全职业。
2. Google Data Analytics Professional Certificate - 提升你的数据分析能力
3. Google IT Support Professional Certificate - 支持你的组织 IT
就像任何编程的人一样,当发现自己重复做同样的事情时,我想通过自动化一些常见的日期处理任务以及一些简单而频繁的特征工程来简化生活,从而使得对给定日期的常见日期解析和处理任务可以通过一次函数调用完成。然后我可以在之后选择我感兴趣的特征进行提取。
这个日期处理是通过一个单一的 Python 函数实现的,该函数仅接受一个格式为 ‘YYYY-MM-DD
’ 的日期字符串(因为这是日期的格式),并返回一个包含(当前)18 对键/值特征的字典。其中一些键是非常直接的(例如解析出的四位数年份),而其他的是经过工程处理的(例如日期是否为公共假期)。如果你觉得这段代码有用,你应该能够弄清楚如何修改或扩展它以适应你的需求。有关你可能想要编写的其他日期/时间相关特征的一些想法,请查看这篇文章。
大部分功能是通过 Python datetime
模块实现的,许多功能依赖于 strftime()
方法。然而,真正的好处是有一种标准的、自动化的方法来处理相同的重复查询。
唯一使用的非标准库是 holidays
,它是一个“快速、高效的 Python 库,用于即时生成特定国家、省份和州的假期集合。”虽然该库可以处理各种国家和次国家的假期,但我在这个例子中使用了美国的全国假期。只需快速浏览项目文档和以下代码,你就能很容易确定如何在需要时进行更改。
那么,让我们首先查看 process_date()
函数。评论应该能提供有关发生了什么的见解,如果你需要的话。
import datetime, re, sys, holidays
def process_date(input_str: str) -> {}:
"""Processes and engineers simple features for date strings
Parameters:
input_str (str): Date string of format '2021-07-14'
Returns:
dict: Dictionary of processed date features
"""
# Validate date string input
regex = re.compile(r'\d{4}-\d{2}-\d{2}')
if not re.match(regex, input_str):
print("Invalid date format")
sys.exit(1)
# Process date features
my_date = datetime.datetime.strptime(input_str, '%Y-%m-%d').date()
now = datetime.datetime.now().date()
date_feats = {}
date_feats['date'] = input_str
date_feats['year'] = my_date.strftime('%Y')
date_feats['year_s'] = my_date.strftime('%y')
date_feats['month_num'] = my_date.strftime('%m')
date_feats['month_text_l'] = my_date.strftime('%B')
date_feats['month_text_s'] = my_date.strftime('%b')
date_feats['dom'] = my_date.strftime('%d')
date_feats['doy'] = my_date.strftime('%j')
date_feats['woy'] = my_date.strftime('%W')
# Fixing day of week to start on Mon (1), end on Sun (7)
dow = my_date.strftime('%w')
if dow == '0': dow = 7
date_feats['dow_num'] = dow
if dow == '1':
date_feats['dow_text_l'] = 'Monday'
date_feats['dow_text_s'] = 'Mon'
if dow == '2':
date_feats['dow_text_l'] = 'Tuesday'
date_feats['dow_text_s'] = 'Tue'
if dow == '3':
date_feats['dow_text_l'] = 'Wednesday'
date_feats['dow_text_s'] = 'Wed'
if dow == '4':
date_feats['dow_text_l'] = 'Thursday'
date_feats['dow_text_s'] = 'Thu'
if dow == '5':
date_feats['dow_text_l'] = 'Friday'
date_feats['dow_text_s'] = 'Fri'
if dow == '6':
date_feats['dow_text_l'] = 'Saturday'
date_feats['dow_text_s'] = 'Sat'
if dow == '7':
date_feats['dow_text_l'] = 'Sunday'
date_feats['dow_text_s'] = 'Sun'
if int(dow) > 5:
date_feats['is_weekday'] = False
date_feats['is_weekend'] = True
else:
date_feats['is_weekday'] = True
date_feats['is_weekend'] = False
# Check date in relation to holidays
us_holidays = holidays.UnitedStates()
date_feats['is_holiday'] = input_str in us_holidays
date_feats['is_day_before_holiday'] = my_date + datetime.timedelta(days=1) in us_holidays
date_feats['is_day_after_holiday'] = my_date - datetime.timedelta(days=1) in us_holidays
# Days from today
date_feats['days_from_today'] = (my_date - now).days
return date_feats
有几点需要注意:
-
默认情况下,Python 将一周的天数视为从星期天(0)开始,到星期六(6)结束;对我而言,我的处理方式是一周从星期一开始,到星期天结束——我不需要第 0 天(与将一周从第 1 天开始相对)——所以这需要进行更改。
-
创建一个工作日/周末特征很简单。
-
使用
holidays
库创建假期相关特征很简单,并且可以执行简单的日期加减运算;同样,替换其他国家或次国家假期(或添加到现有假期中)也是很容易做到的。 -
一个
days_from_today
功能是通过一两行简单的日期数学运算创建的;负数表示给定日期在今天之前的天数,而正数则表示从今天到给定日期的天数。
我个人不需要,例如,is_end_of_month
特征,但你应该能看到如何在此时相对轻松地将其添加到上述代码中。自己尝试一些自定义设置吧。
现在让我们测试一下。我们将处理一个日期,并打印返回的内容,即键值特征对的完整字典。
import pprint
my_date = process_date('2021-07-20')
pprint.pprint(my_date)
{'date': '2021-07-20',
'days_from_today': 6,
'dom': '20',
'dow_num': '2',
'dow_text_l': 'Tuesday',
'dow_text_s': 'Tue',
'doy': '201',
'is_day_after_holiday': False,
'is_day_before_holiday': False,
'is_holiday': False,
'is_weekday': True,
'is_weekend': False,
'month_num': '07',
'month_text_l': 'July',
'month_text_s': 'Jul',
'woy': '29',
'year': '2021',
'year_s': '21'}
在这里你可以看到特征键的完整列表以及相应的值。通常情况下,我不需要打印整个字典,而是获取特定键或键集合的值。
我们可以通过下面的代码演示这如何实际工作。我们将创建一个日期列表,然后逐个处理这些日期,最终创建一个 Pandas 数据框,其中包含处理过的日期特征的选择,并将其打印到屏幕上。
import pandas as pd
dates = ['2021-01-01', '2020-04-04', '1993-05-11', '2002-07-19', '2024-11-03', '2050-12-25']
df = pd.DataFrame()
for d in dates:
my_date = process_date(d)
features = [my_date['date'],
my_date['year'],
my_date['month_num'],
my_date['month_text_s'],
my_date['dom'],
my_date['doy'],
my_date['woy'],
my_date['is_weekend'],
my_date['is_holiday'],
my_date['days_from_today']]
ds = pd.Series(features)
df = df.append(ds, ignore_index=True)
df.rename(columns={0: 'date',
1: 'year',
2: 'month_num',
3: 'month',
4: 'day_of_month',
5: 'day_of_year',
6: 'week_of_year',
7: 'is_weekend',
8: 'is_holiday',
9: 'days_from_today'}, inplace=True)
df.set_index('date', inplace=True)
print(df)
year month_num month day_of_month day_of_year week_of_year is_weekend is_holiday days_from_today
date
2021-01-01 2021 01 Jan 01 001 00 0.0 1.0 -194.0
2020-04-04 2020 04 Apr 04 095 13 1.0 0.0 -466.0
1993-05-11 1993 05 May 11 131 19 0.0 0.0 -10291.0
2002-07-19 2002 07 Jul 19 200 28 0.0 0.0 -6935.0
2024-11-03 2024 11 Nov 03 308 44 1.0 0.0 1208.0
2050-12-25 2050 12 Dec 25 359 51 1.0 1.0 10756.0
希望这个数据框能让你更好地了解这种功能在实际应用中的有用性。
祝好运,数据处理愉快。
相关:
-
5 个 Python 数据处理技巧与代码片段
-
数据科学与机器学习中的日期时间变量特征工程
-
使用 SQL 处理时间序列
评论
更多相关话题
数据科学家的日常生活:专家与初学者
原文:
www.kdnuggets.com/2022/09/day-life-data-scientist-expert-beginner.html
图片由 Mikhail Nilov 提供
随着越来越多的人进入科技行业,了解你的日常工作是很有帮助的。我已经礼貌地请求了 Jose Navarro 和 Andrzej Ko?czyk 给我们详细介绍他们的日常工作,希望能帮助他人做好准备。
两者处于数据科学职业的不同阶段,帮助来自不同背景的人们。你不仅会了解专家数据科学家的工作内容,对于那些刚进入这个行业的人,你也会了解初学者数据科学家正在做些什么以成为专家。
那么,让我们更多地了解一下数据科学家的一天。
首先,我们有 Jose Navarro,一位在 Qbiz 工作的数据科学家。他说:
Jose Navarro
Jose Navarro | LinkedIn
我觉得自己非常幸运能成为一名数据科学家。我认为这份工作独一无二,能帮助我们利用统计学和计算机科学的力量解决复杂的行业问题。我将在这里描述我的日常生活,以便你能对其有一个更清晰的了解。
我有时在家工作,有时在办公室工作,因为我认为与同事和团队的面对面互动对于项目和职业的发展都很重要。
这是一个非常灵活的工作,通常允许我根据项目需求安排个人生活。如果工作与生活的平衡对你来说很重要,就像对我一样,那么数据科学的职业选择也不错。
如果我在家工作,我通常在上午 9 点开电脑,之后会有一到两个小时的会议。会议对于项目至关重要,良好的沟通是理解行业问题、明确每个团队成员的期望、达成解决方案或了解结果的关键。数据科学家应该能够利用他们的软技能有效沟通,并向项目的所有利益相关者展示,针对每种情况调整语言。
一天中的下一部分涉及到这份工作的硬技能,应用像 Python、SQL 等技术。根据项目的阶段,这部分内容可能差异很大,从头脑风暴到数据可视化,包括数据收集、数据清洗、标注、统计建模、参数调整等。
大约下午 1 点时,我会停下来吃午饭,时间大约为 30-60 分钟。我确保伸展腿部,并远眺以放松眼睛。没有理由数据科学家不能遵循一些健康习惯。健康和健身将有助于我们的荷尔蒙水平,并带来一些与工作相关的好处,比如提高创造力和集中注意力的能力。
我在下午 6 点左右结束一天的工作,确保留出一些时间用于学习。我通过像 KDNuggets 这样的网站以及 Kaggle、Twitter、LinkedIn 或 Medium 等服务来检查最新趋势和前沿技术。成为数据科学家的最佳事情之一就是学习总是受到鼓励的。在数据、机器学习和人工智能不断变化的环境中,保持更新真的会有回报(此外,这个世界也非常令人兴奋)。
每天都不同,总是有新的事物可以尝试和解决的新问题。让我们一起打造数据驱动的未来。
接下来会有更多关于他们日常生活的信息来自于Andrzej Kończyk,一位立志成为数据科学家的数据分析师。
Andrzej Kończyk
Andrzej Kończyk | LinkedIn
我想在开始时简要介绍一下自己。目前我在担任数据分析师的职位,直到 2021 年 11 月,我对数据科学/数据分析/数据工程没有任何了解。我毕业于一个完全不同的专业,但我一直对数据充满热情。因此,在 2021 年 11 月,我开始了数据科学 Bootcamp,并开始通过额外的在线课程和教程进行学习。在我的 Bootcamp 课程中,我学到了很多关于 SQL、Tableau 和 Python 库的知识,这些知识现在帮助我理解并成长为数据科学领域的新成员。
这个领域现在对我非常有趣,因为我开始基于真实数据构建自己的机器学习模型!我认为数据科学真的代表着未来,当你仍在学习时,你可以度过一些美好的时光。在我看来,这不是最简单的领域——有时候你需要花费很多时间来理解问题和发展你的想法——但这真的很吸引人。当你最终得到一些结果时,可能一开始不是最好,但你知道这是你做的。这是令人兴奋的。
正如我提到的,我仍然是一个初学者,但我希望学到更多,并尽快从数据分析师转变为数据科学家。我需要做些什么才能实现这一目标?我认为这些将是对任何希望加入我们团队的人有用的建议:永远不要放弃,学习、阅读,并通过自己做项目不断进步。这是最重要的。在模型创建过程中,你总是可以发现一些新东西。其他工具,如 Tableau、SQL 等也很重要,但你在做项目时也会使用它们 😃
总结:对我来说,数据科学是一个有趣且令人兴奋的机会,确实对我们世界中的商业产生了影响 😃
总结
我希望这能给你一个更好的概述,了解两个级别的数据科学家所做的工作,包括他们的责任、建议等。
妮莎·阿利亚 是一名数据科学家和自由职业技术作家。她特别关注提供数据科学职业建议或教程,以及围绕数据科学的理论知识。她还希望探索人工智能在延长人类生命方面的不同方式。她是一个热衷学习者,致力于拓宽自己的技术知识和写作技能,同时帮助指导他人。
更多相关主题
数据科学家的一天:第四部分
原文:
www.kdnuggets.com/2018/04/day-life-data-scientist-part-4.html
评论
当然,没有两个数据科学家的角色是相同的,这也是我们进行调查的原因。许多潜在的数据科学家对那些在另一方整天忙碌的工作内容感兴趣,因此我认为让一些连接提供他们的见解可能是一个有用的尝试。
我们的前三个课程推荐
1. 谷歌网络安全证书 - 快速进入网络安全职业轨道。
2. 谷歌数据分析专业证书 - 提升你的数据分析技能
3. 谷歌 IT 支持专业证书 - 支持组织的 IT
接下来是我从那些愿意提供几段关于他们日常专业任务的反馈中收到的一些精彩反馈。短小的日常总结以完整无编辑的形式呈现,让引用自行说明。
如果你对本系列的前三篇文章感兴趣,你可以在这里找到它们:
-
数据科学家的一天(第一部分)
-
数据科学家的一天(第二部分)
-
数据科学家的一天(第三部分)
罗赫利奥·库埃瓦斯 是多伦多 Scotiabank 数据科学与模型创新团队的数据科学家。
作为数据科学家,工作涉及的不仅仅是技术方面。作为数据科学家,我们需要解决复杂的业务问题,并确保我们开发的模型为业务提供价值。为此,了解业务的重中之重并与业务部门保持持续联系以避免我们开发的内容与他们需求之间的偏差是至关重要的。
我不能说工作中有一个典型的一天,但我可以说每天都有三个主要组成部分;唯一的变化是这些组成部分在每天中所占的比例:会议、技术和行政。
会议
我的工作日从上午 9:00 开始,进行 15 分钟的敏捷站会。我与参与我所负责项目的人见面,并提供 3 条信息:
-
我前一天做了什么,
-
我在一天中的工作重点是,
-
任何可能遇到的障碍,以及是否需要其他团队成员的帮助以取得进展。
除了这些会议,还有许多其他会议我需要参加以满足各种需求。其中一些会议的目的是向业务部门和内部客户更新我所取得的发现和进展,请求他们的意见或在未来的任务中确定优先级。
其他会议是为了获得澄清或提供信息,以理解我们当前开发的模型的未来部署,或者确保我们对流程的理解确实正确。
无论会议的具体细节如何,它们都有一个共同的目标:满足业务需求,并确保我们与之完全对齐。
技术
开发满足业务需求的模型是一个迭代过程,涉及
收集和清洗数据,
-
创建一个数据集,以此为基础开发模型,
-
定义一个满足业务需求的目标变量,
-
生成初步模型并提高其准确性,以及
-
将模型的准确性转化为对业务有意义的指标。
我们使用各种工具和算法:
-
使用 SQL 收集和汇总数据到一个数据集中,
-
使用 Python 和 R 进行数据清洗和模型创建,
-
使用 Git 进行代码版本控制,以及
-
使用各种回归和分类算法进行预测。
这些技术任务是协作性的,可以是双向的:我可以创建一个拉取请求并要求我的同事进行审查,也可以充当同事创建的拉取请求的审查者。无论哪种方式,协作都是对我们生成的产品进行增量改进的关键。
鉴于数据科学是一个变化非常快的领域,我们期望学习尽可能多的工具和技术。我们需要灵活并且愿意不断学习。
行政
我还将相当一部分时间用于行政任务,例如
-
预约会议
-
回复电子邮件和进行虚拟电话会议
-
创建报告我们发现的演示文稿
-
生成报告
-
记录我们正在开发的流程和模型
在办公时间之外,我尽量积极参与有趣和相关的 Meetups,与其他数据科学家建立联系,并阅读我遇到的博客、书籍、论文和软件包文档。
这是一个具有挑战性和令人兴奋的角色。我感到非常幸运能够成为一个高度协作并致力于不断学习的团队的一员。
我希望你觉得这份笔记信息丰富,并且能够帮助你了解当今商业世界中的数据科学是什么样的。
Sarah Nooravi 是 Operam, Inc. 的高级数据科学家,驻扎在洛杉矶。
记住,没有两个数据科学职位和没有两个数据科学家是完全相同的,让我带你了解一下我一天的工作!我希望这能帮助你看到数据科学家的工作不仅仅是建模和处理大数据。还有很多学习和沟通的时间。
对我而言,典型的一天从我上车的那一刻开始。手里拿着一杯咖啡,加上两个小时的通勤时间(谢谢你,洛杉矶),我(通常)很兴奋地开始学习和做一些有生产力的事情。我利用这段时间跟进我最喜欢的播客(《成长的力量》、《重解代码》或《数据怀疑论》)、收听有关机器学习/深度学习的 YouTube 视频、为下一节教学课做准备、头脑风暴新的产品创意/方法,或者放一些好音乐来激励自己迎接一天的挑战。
一旦到达工作地点,我会用一杯卡布奇诺和一个 Spotify 播放列表来安顿下来。然后我会利用早晨的时间处理邮件和 Slack 消息。我首先查看的是客户的任何紧急请求。如果没有任何紧急事项,我会阅读每日更新的《商业内幕》新闻。这些更新帮助我跟上趋势和我们所用平台的新产品功能。在做出对活动策略有重大影响的决策时,这些更新是非常有帮助的。
白天可能会发生任何事情!行政请求、临时报告需求、内部会议、客户会议、现有模型的优化、新工具的构建,还有很多我无法在这里完全列举的任务。每一项任务对业务和我的个人发展都起着关键作用。像冲刺规划和招聘挑战这样的行政任务提高了我的时间管理技能和快速决策能力。客户会议挑战并提高了我的沟通技巧和商业头脑。优化和构建新模型挑战并提升了我的技术能力和创造力。作为一名数据科学家,我发现那些允许你全面发展的跨职能角色最令人兴奋和有成就感。
一旦我完成了一整天的工作,我会继续思考和学习数据科学。根据一周中的不同日子,我会安排其他活动,如:教授数据可视化的训练营、参与与其他充满激情的数据科学家一起的“数据科学办公时间”小组讨论、通过女性工程师协会指导女性工程师,或者主持自己的机器学习聚会。如果你还没看出来,我对这个领域爱不释手。
总结一下:我大约在早上 7 点开始一天的工作,并在晚上 10 点到 11 点之间回到家。虽然日子很长,但我热爱我的工作。使每一天成功的关键是幸福。我努力在一天中融入那些带给我快乐并帮助我个人成长和社区发展的事物。
凯特·斯特拉赫尼是位于纽约市德勤的数据显示与报告专家。
不需要闹钟……我的一天从早上 6 点开始。我其中一个孩子肯定会在早上 6 点之前醒来。我已经保持这个早晨时间表接近 4 年了,我很喜欢!我做一杯咖啡,坐下来查看手机(早晨第一件事就是这样做,这让我有些内疚)。在查看了工作和个人信息后,就该开始准备我的大女儿(3 岁)去学校了。我们一起准备她的午餐,挑选她的衣服,然后在 8 点送她上学前,我们会花点时间玩耍。我的日常中最棒的部分是我在家工作(我的工作提供这样的灵活性真是太棒了)。如果天气很好,心情也不错,我会去跑步(大约 2-3 英里)然后再开始工作。
早上 9 点 – 通常我会登录到工作电脑上,查看我当天的日程安排;然后开始工作。我的职责包括处理仪表盘,开发关键绩效指标,确保数据质量,以及最重要的是为领导提供数据透明度。我在这里帮助人们利用数据建立联系。主要通过我最喜欢的数据可视化工具 – Tableau!我非常喜欢这个工具,以至于我有一个 YouTube 频道,提供关于如何使用 Tableau 的教程 – 数据故事。
大约中午 12 点我会吃午餐(通常是我当天准备的食物)。然后继续工作,和我的团队成员联系,确保我们都按计划完成当天/本周的目标。在下午 2 点,我去学校接女儿,把她带回家(步行距离,只需几分钟;但我喜欢这短暂散步后的精力)。下午的剩余时间用来工作和思考如何利用技术自动化一些工作。
与数据打交道一直让我感到着迷;从特别杂乱和非结构化的数据中提取见解的能力使我充满活力。对这个领域更深入了解的好奇心促使我撰写了我的书籍 成为数据科学家之旅,该书提供了与领先数据科学家进行的二十多次访谈,并揭示了有关如何入门数据科学的关键见解。
亚历山大·沃尔夫 是纽约市 Dataiku 的数据科学家。
我首次对数据科学产生兴趣是在达特茅斯大学作为计算机科学本科生参加机器学习和深度学习课程时;我觉得这些材料既引人入胜,又激动人心且新颖。在意识到这个领域的潜力后,我确信这是我想从事的工作。我也知道我想在初创公司工作。
从那时起,我通过在线资源自学了如何正确使用一些数据科学 API。我在学校的课程中已经建立了良好的数学和理论机器学习基础,但仍需学习数据可视化和工程的一些基础知识,例如如何高效地索引 Pandas Dataframes、创建 Sci-Kit Learn 管道、使用 Seaborn/MatPlotlib 可视化数据、通过 lambda 函数正确清洗数据等。(Python 库;R 的等效工具存在)。我发现Datacamp是一个很好的资源。类似地,我认为 Sci-Kit Learn 的文档也是一个很好的资源,可以加深我对每种算法的理解,以及其超参数如何影响每个模型。
在 2017 年初,我在Dataiku找到了一份位于纽约市的工作。Dataiku 是一家高速成长的国际初创公司,专注于数据科学平台;公司成立于巴黎,并在今年九月完成了 2800 万美元的 B 轮融资。从第一天起,我就知道自己在领域和职业道路上做出了正确的决定。Dataiku 不仅拥有出色的公司创业文化,而且每天我也有机会从事一些新鲜而令人兴奋的工作。在这里,每一天都不同,这让我的工作更有趣。
由于我们销售的是数据科学平台,因此整个数据科学团队与公司大多数其他部门紧密集成——从帮助销售/合作伙伴团队在销售过程中提供数据科学专业知识,到帮助市场团队为聚会、我们的博客、第三方活动等创建相关且有时技术性的内容。当我不与公司其他部门合作时,我通常会支持我们的客户,或者通过进行一些自己的数据科学项目来提升我的 Dataiku 平台技能。
当我们为新客户提供服务时,许多客户希望我们在现场待 1-3 天,教他们的数据工程师、分析师和科学家如何利用 Dataiku 实现团队间的协作,轻松地将数据管道/模型投入生产,并教授他们如何使用我们平台提供的更多功能。我通常每月需要进行两到三次这样的服务,同时在全国各地旅行,接触不同的数据科学流程和团队。观察不同行业和公司是如何组织的以及他们如何使用数据,这非常有趣。
许多公司还购买 Dataiku 的专业服务,我有机会与许多不同的公司合作处理他们的数据项目。我接触了各种数据科学工具箱、用例、团队和组织结构。我与客户合作过 NLP 项目、时间序列预测、数据库去重、可视化、深度学习、生产流水线、Spark 流水线等。我最喜欢在 Dataiku 工作的部分之一是,我不受限于在一个行业内工作或使用一个工具栈;每周我都与不同的公司合作,学习新事物,并帮助他们真正最大限度地利用他们的数据。我很幸运能在这样的初创公司工作,并且真的很期待看到它不断改进和成长。
当我不在办公室或出差拜访客户时,我喜欢在空闲时间阅读科技/人工智能新闻、编程、从事数据科学项目、打篮球、头脑风暴创业想法、和朋友聚会,以及阅读最新的深度学习研究论文。我通过浏览我的 LinkedIn 动态来保持对人工智能和数据科学领域新闻/工具的更新;实际上,我比其他任何社交媒体平台更喜欢这个平台。我推荐关注一些很棒的人 - Matthew Mayo, Florian Douetteau, Andriy Burkov, Rudy Agovic, Gregory Renard。我通常在早上 8 点左右起床,然后乘地铁到曼哈顿市中心工作。我大约在晚上 7 点回家。我尽量多锻炼,因为我曾是一名 D1 篮球运动员。
相关:
-
数据科学家的生活日常
-
数据科学家的另一天
-
数据科学家的又一天
更多相关内容
一位数据科学家的一天
评论
几周前,我向我的 LinkedIn 联系人征求反馈意见关于数据科学家典型工作日的内容。反应真的非常大!当然,没有两个数据科学家的角色是相同的,这就是为什么要进行调查的原因。很多潜在的数据科学家都对那些在这个领域忙碌的人都做些什么感兴趣,所以我想让一些联系人提供他们的见解可能会是一项有用的事业。
我们的前三个课程推荐
1. Google Cybersecurity Certificate - 加速职业生涯发展,从事网络安全工作。
2. Google Data Analytics Professional Certificate - 提升你的数据分析能力
3. Google IT Support Professional Certificate - 支持你的 IT 组织
下面是一些来自对我的日常专业任务感兴趣的人通过电子邮件和 LinkedIn 消息提供的很好的反馈。这些简短的日常摘要以完整的形式呈现,没有编辑,让引语本身说话。
Andriy Burkov 是加特纳的全球机器学习团队负责人,位于魁北克市。
我的典型工作日从早上 9 点开始,与我的团队进行为期 15-30 分钟的 Webex 会议:我的团队分布在印度(班加罗尔和钦奈)和加拿大(魁北克市)两地。我们讨论项目的进展并决定如何克服困难。
然后我阅读昨晚收到的电子邮件,必要时做出回应。然后我将工作投入到当前的项目中,目前这个项目是从职位公告提取工资。我需要为我们支持的每个国家语言对创建一个单独的模型对,大约有 30 个国家语言对。该过程包括转储某部分国家-语言的职位公告,对其进行聚类,然后获取训练示例的子集。然后我手动注释这些示例并构建模型。我进行构建/测试/添加数据/重新构建迭代,直到测试误差足够低(~98%)。
下午,我帮助我的团队成员通过在真实数据上测试当前模型,识别假阳性/阴性并创建新的训练示例来改正问题。何时停止改善模型并投入生产取决于项目。对于一些情况,特别是用户端,我们希望假阳性的水平非常低(低于 1%):用户始终会看到从其文本中提取某些元素出错,但并不总是注意到提取的缺失。
一天在下午 5:30 左右结束,我用 30 分钟的时间跟上科技新闻/博客。
Colleen Farrelly 是位于迈阿密的卡普兰公司的一名数据科学家。
这是关于我和我一天的生活的一点背景信息:
在攻读医学博士/博士学位项目后,我转入了数据科学和机器学习,此前我有一门文理交融的本科学位,我的日常项目通常高度跨学科。一些项目包括模拟流行病传播,利用工业心理学创建更好的人力资源模型,并解剖数据以获取低社会经济地位学生的风险群体。我的工作最好的部分是项目的多样性和每天都有新的挑战。
我的一个典型工作日大约在早上 8:00 开始,那时我会浏览与机器学习和数据科学相关的社交媒体帐户。我会在早上 8:30 左右转入工作项目,中午休息后,工作在下午 4:30 至 5:00 左右结束。我的时间中大约有 40%用于研究和开发,主要集中在数学上(尤其是拓扑学),包括从开发和测试新算法到撰写数学证明以简化数据问题。有时,结果是保密的并且仅在公司内部分享(通过公司内部每月的午餐与学习演示);另一些情况下,我被允许在外部会议上发布或展示。
我大约还有 30%的时间用于在我公司的各个部门建立关系并寻找新项目,这些项目通常与运营程序相关的问题、数据捕捉相关的问题,或先前项目之间的连接有关,从而为运营提供更全面的视图。这可能是工作中最关键的一个方面。我遇到的人经常提出他们看到的问题或提到有一个预测模型对销售/学生结果/运营产生了兴趣,我发现这为以后的对话和最佳实践建议敞开了大门。作为一名数据科学家,与一系列利益相关者进行沟通非常重要,这帮助我将我对机器学习算法的解释简化成了一个外行能理解的水平。
我剩下的 30%的时间通常用于数据分析和结果撰写。其中包括预测模型、关键指标的预测模型以及对给定数据集中子群体和趋势的数据挖掘。每个项目都是独特的,我试图让项目及其初步发现引导我下一步的行动。我主要使用 R 和 Tableau 进行项目工作,虽然 Python、Matlab 和 SAS 偶尔在特定的软件包或研发需求中也很有帮助。我通常可以重复使用代码,但是对于数学方面的问题,每个问题都有自己的假设和数据限制。项目通常可以使用拓扑学、实分析和图论中的工具进行简化,从而加快项目进展,并允许使用现有的软件包,而不需要从头开始编码。作为一家大公司唯一的数据科学家,这使我能够处理更多项目,并为我们的内部客户揭示更多的见解。
Marco Michelangeli是 Hopenly 公司的数据科学家,居住在意大利的雷焦艾米利亚。
当马修要求我写几段关于数据科学家“典型”一天的工作的文章时,我开始思考我的日常工作和例行公事,但后来我停下来意识到:“我真的没有一个固定的日常!”这就是作为数据科学家的最好之处!每一天都不同,都会出现新的挑战,一个新的问题悬在那里等待解决。我不仅仅在谈论编码、数学和统计学,还包括业务世界的复杂性:我经常与业务人员和客户讨论,了解他们的真实需求,我帮助营销部门制作产品内容,在会议上讨论新的 ETL 工作流和新产品的架构设计;我甚至发现自己在筛选数据科学家的简历。
成为一名数据科学家意味着要灵活、开放思维、准备解决问题和接受复杂性,但是请别误会:我 80%以上的时间都在清理数据!如果你刚开始从事数据科学的职业,你可能已经看过“10 个掌握 R 和 Python 在数据科学中的技巧”的帖子,或者“最好的深度学习库”,所以我不会给你任何更多的技术建议,我唯一能说的是来自于专业数据科学宣言的内容:“数据科学是关于解决问题,而不是构建模型。”这意味着如果你可以通过一条 SQL 查询来解决客户需求,就这样做!不要因复杂的机器学习模型而感到沮丧:要简单,要有帮助。
Ajay Ohri是位于新德里的 Kogentix Inc.的数据科学家。他还写过两本关于 R 语言的书和一本关于 Python 的书。
我典型的一天从上午 9 点的团队会议开始。我们的项目工作方法是将任务分成两周的目标或者迭代周期。这基本上是敏捷软件开发方法,与 CRISP-DM 或 KDD 方法不同。
需要一点背景知识来解释我们这样做的原因。我目前的角色是东南亚一家银行的数据科学家,负责实施大数据分析。我们的团队中有数据工程师、行政/基础架构人员、数据科学家和当然还有客户经理,满足项目的每个具体需求。我的当前组织是一家名为Kogentix的 AI 初创公司,不仅提供大数据服务,还有一个名为AMP的大数据产品,类似于 PySpark 的 GUI,试图实现大数据的自动化。AMP 相当酷,我很快就会谈到它。这导致我们的初创公司专注于尽可能多地吸引客户,并测试和实施我们的大数据产品。这意味着在客户合作中展示成功-我们的一个客户上个月入围了一个奖项。我听起来是不是太市场导向了-当然是的。数据科学家的工作通常对客户具有战略意义。
我每天都在做什么?可能有很多事情-包括不仅仅是电子邮件和会议。我可能用 Hive 提取数据,用它合并数据(或使用 Impala),我可能用 PySpark(Mllib)制作流失模型或进行 K 均值聚类。我可以用 Excel 文件提取数据来制作摘要,也可以制作数据可视化。有些天我用 R 来制作一些机器学习模型。我还协助测试我们的大数据分析产品 AMP,并与该团队合作增强产品的功能(如果您原谅这个双关语,因为该产品用于功能增强)。当我编写大数据时,我可能使用 Hadoop HUE 的 GUI,也可能使用命令行编程,包括批量提交代码。
在这之前,当我为印度第三大软件公司 Wipro 工作时,我的角色正好相反。我们的客户是印度的财政部(负责税收的部门)。初级数据科学家使用 SQL 从关系数据库管理系统中提取数据(由于历史问题),而我则验证这些结果。报告随后发送给各个客户。我们还在临时基础上使用 SAS Enterprise Miner 来展示印度进出口的时间序列预测作为一个概念测试。在为联邦政府工作与为私营部门工作时,时间表相当缓慢和官僚。我记得一次演示时,负责的官僚对我们执行机器学习感到惊讶,以及为什么政府之前没有使用它。但 SAS/VA(用于仪表盘)、SAS Fraud Analytics(我接受过培训并正在实施中)和 Base SAS(分析工具)都是令人惊叹的软件,我怀疑是否能很快制作出任何类似 SAS 领域专业托包的东西。
在此之前,我经营了十年的 Decisionstats.com。我写博客,销售广告(效果不好),为 Programmable Web、StatisticsViews 写了 3 本数据科学书籍,撰写了大量文章,并进行了一些数据咨询。我甚至为 KDnuggets 写了几篇文章。您可以在这里查看我的个人资料
en.m.wikipedia.org/wiki/Ajay_Ohri
Eric Weber 是位于加利福尼亚州阳光城的 LinkedIn 高级数据科学家。
在 LinkedIn 的一天。好吧,我想说没有“典型”的一天。在阅读时,请记住这一点!
首先,让我简要介绍一下我和我的主要职责。我很幸运能够在 LinkedIn Learning 团队工作,这是组织中最新的数据科学团队。具体而言,我支持 LinkedIn Learning 的企业级销售。这意味着什么呢?想象一下:我们使用数据、模型和分析来决策如何有效销售。当然,我们是如何做到的细节是内部的,但您可以想象我们想要回答的问题,比如:我们要销售给哪些账户?我们努力理解哪些账户与其他账户有所不同。
其次,每天的一个关键方面是沟通。我在 LinkedIn 上详细介绍了这个问题,但我相信与团队成员和业务伙伴进行有效沟通是杰出的数据科学家的一个定义特征。在典型的一天里,这涉及向直属团队成员、经理和高级领导提供关键项目的更新,适时地。我发现工作中这个方面非常有趣的一点是对简洁性的要求。像 LinkedIn 这样的公司内部有大量的沟通正在进行,所以所有发出去的东西必须被淬取成清晰而简洁的结果/对话要点。
最后,每一天都有失败的重要部分。我非常相信,如果你不失败,就不会学到东西。当然,这并不意味着灾难性的失败。这意味着每天我都在努力拓展自己在分析、数据科学和组织本身方面的理解。我从错误中学习,并观察别人是如何比我更高效地做事,或者用不同的方式做事的。每天早晨醒来时,我把失败视为工作的一部分,因为这能让我第二天变得更好。分析和数据科学的快速扩张确实提供了大量这样的机会!
希望这些描述能让你更深入地了解数据科学家日常工作。我收到了很多人的兴趣和回应,所以我会在不久的将来发布更多相关内容。
相关内容:
-
大数据和数据科学的 5 条职业路径,解析
-
7 种数据科学家工作档案
-
必备的 10 个数据科学技能,已更新
关于这个话题的更多信息
机器学习工程师的一天
原文:
www.kdnuggets.com/2022/10/day-life-machine-learning-engineer.html
了解其他人的日常生活是很有帮助的。许多学生更加关注他们需要掌握的技能、课程和知识水平,以确保自己能尽可能优秀。
有时候,你只需要听到第一手资料。如果你从未听说过这个成语,它的意思是如果你直接从知情者那里听到某事,你将获得最真实的信息。
让我们向 易卜拉欣·穆赫吉 学习
介绍
易卜拉欣·穆赫吉 是一名伦敦政治经济学院(LSE)管理学(荣誉)学士毕业生以及数据科学家。在 2008 年毕业后,易卜拉欣加入了石油和天然气行业,担任金融分析师,工作地点包括特立尼达、新加坡、英国(阿伯丁、雷丁、伦敦)、挪威、马来西亚、突尼斯和罗马尼亚。
易卜拉欣·穆赫吉
在此期间,易卜拉欣对行为经济学和神经科学的潜在兴趣,通过阅读丹尼尔·卡尼曼(《思考,快与慢》)和丹·阿里里(《预测性非理性》)的著作,促使他进入了机器学习和人工智能的第二职业生涯。
易卜拉欣对大脑如何从事件中抽象出意义以及人类认知如何与一般的机器学习和模式识别有所不同感兴趣。工作之外,易卜拉欣喜欢阅读科学哲学、宗教心理学、认知神经科学、人类对压力的反应、贝叶斯方法以及编写软件的书籍。
作为机器学习工程师的一天是什么样的?
作为一名机器学习工程师,我将大量时间用于三个主要任务:
-
理解业务需求
-
收集数据
-
基于 1 和 2 提供切实可行的商业问题解决方案
虽然这些任务听起来相对简单,但随着你所在组织的规模扩大,收集的数据复杂性以及生成的结果也会增加。
让我们逐一看看这些任务:
理解业务需求
塞萨尔·希达尔戈在他的书《信息如何增长》中提出了一个非常有趣的观察——当你从上方俯瞰一个城市时,当飞机即将降落时,它看起来与计算机内部的电路板(CPU)非常相似。一个城市是一个计算单元,任何企业也是如此。它可以被抽象为一个算法——有输入,有一些计算来处理这些输入,还有输出。
对于一个企业而言,计算就是企业生产的产品或服务。对于理发师而言,原材料或投入可能是剪刀、理发店的租赁空间、镜子、椅子、隔离栏等,而产品则是一次理发。在这种情况下,金钱是该输出的价值储存。通常情况下,输出的质量和/或数量越高,输出的价值也越高。然而,也有例外,比如内燃机的负外部性(可能会被政府逐渐征税),以及那些产生有效善意的慈善机构。但这仍然是一个普遍的结果。
数据科学家的工作,作为一个专家数据科学家,而不是普通数据科学家,是理解商业提案。输入是什么,输出是什么?
然后,数据科学家将系统地分类工作,以了解业务中的问题。什么可以改善公司的产品,提升公司获得的价格,改善原材料的采购,或改进从输入到公司输出的任何物流方面?
第二点是收集数据
在我深入探讨这一点之前,需要对那些没有经验的数据科学家提个醒,这可以通过二战时期的一个著名警示例子来解释。当盟军在寻求加强轰炸机的装甲时,他们查看了返回的飞机上的子弹孔频率。大多数当时的数据科学家或运筹学专家认为需要加强那些子弹孔较多的飞机区域。
一位出生于匈牙利的数学家亚伯拉罕·瓦尔德有不同的看法。他建议加强那些没有子弹孔的飞机部位。原因是,受损这些部位的飞机往往无法返回,它们已经被击落。
来自维基百科的生存偏差文章中的飞机
因此,数据只是故事的一部分。没有对业务机制的良好理解,数据作用有限。在大企业中,解决方案的规模可能很小,但改进或效率的量可能也不大。在这种情况下,对业务的深刻理解至关重要。
数据收集的形式包括与大量业务利益相关者交谈,了解业务中的数据。数据可能会在业务中的孤岛中隐匿得非常好,而数据科学家的工作是找到一个单一的真实来源,查阅提供的不同数据点,以理解数据并选择最相关和适合的部分进行分析。并非所有数据都是必需的,技能的一部分在于能够辨别重要数据和不重要的数据。将信号与噪音分开。将数据逐步添加到现有分析中总是可能的,删除数据集也是如此。然而,关键是找到数量较少但对解决业务需求至关重要的变量。
这使我们回到了主要的黄金法则。一切都必须增加价值。
企业最终是资本主义框架下的赚钱提案。如果分析不能提供节省钱或赚钱的途径——那就没有价值。那是不被允许的。这一点对数据科学的整个提案至关重要。它应该为管理层和/或利益相关者提供关键行动点或方向,以创造货币价值增值——无论是直接节省成本或赚取更多利润,还是以“软性”方式如市场营销或企业社会责任。
数据科学家还必须是讲故事者。正如 Steve Jobs 所说——“世界上最强大的人是讲故事者”。能够沟通对业务创造的价值是至关重要的。除非利益相关者“看到”价值,否则分析所创造的价值几乎没有意义,因为他们可能无法或不愿付诸实践。
因此,讲述价值主张与创造价值同样重要。数据科学家必须非常擅长传达这些见解。
总结
我想感谢 Ibrahim Mukherjee 花时间向我们解释作为机器学习工程师的一天。了解人们对职业的不同方法及其与自己或其他人的不同,是提升和改善职业生涯的重要因素。
希望这对你有帮助!再次感谢,Ibrahim Mukherjee!
Nisha Arya 是一位数据科学家和自由技术写作人。她特别关注提供数据科学职业建议或教程,以及围绕数据科学的理论知识。她还希望探索人工智能在延长人类寿命方面的不同方式。作为一个热衷学习者,她寻求拓宽自己的技术知识和写作技能,同时帮助指导他人。
我们的前三大课程推荐
1. 谷歌网络安全证书 - 快速进入网络安全职业生涯的捷径。
2. Google 数据分析专业证书 - 提升您的数据分析技能
3. Google IT 支持专业证书 - 支持您的组织在 IT 方面
了解更多相关主题
机器学习中的 DBSCAN 聚类算法
原文:
www.kdnuggets.com/2020/04/dbscan-clustering-algorithm-machine-learning.html
我们的前三个课程推荐
1. 谷歌网络安全证书 - 快速进入网络安全职业生涯。
2. 谷歌数据分析专业证书 - 提升你的数据分析技能
3. 谷歌 IT 支持专业证书 - 支持你的组织的 IT 需求
2014 年,DBSCAN 算法在领先的数据挖掘会议 ACM SIGKDD上获得了“时间考验奖”(颁发给理论和实践中获得大量关注的算法)。
— 维基百科
介绍
聚类分析是一种无监督学习方法,它将数据点分为几个特定的组或群体,使得同一组的数据点具有相似的属性,而不同组的数据点在某种意义上具有不同的属性。
它包括许多不同的方法,基于不同的距离度量。例如,K 均值(点之间的距离)、亲和传播(图距离)、均值漂移(点之间的距离)、DBSCAN(最近点之间的距离)、高斯混合(到中心的马氏距离)、谱聚类(图距离)等。
从本质上讲,所有的聚类方法都使用相同的方法,即首先计算相似性,然后利用这些相似性将数据点聚集成组或批次。这里我们将重点讨论基于密度的噪声应用空间聚类(DBSCAN)聚类方法。
如果你对聚类算法不熟悉,我建议你阅读使用 K 均值聚类进行图像分割的介绍。你也可以阅读关于层次聚类的文章。
为什么我们需要像 DBSCAN 这样的基于密度的聚类算法,而不是已经有 K 均值聚类?
K-均值聚类可能将松散相关的观测值聚集在一起。即使观测值在向量空间中分散得很远,每个观测值最终也会成为某个簇的一部分。由于簇依赖于簇元素的均值,每个数据点在形成簇时都会发挥作用。数据点的轻微变化可能会影响聚类结果。这一问题在 DBSCAN 中由于簇形成方式的不同得到了很大程度的减少。除非我们遇到一些奇特的形状数据,否则这通常不是一个大问题。
另一个挑战是 k-均值算法,你需要指定簇的数量(“k”)才能使用它。很多时候,我们不知道合理的 k 值是什么 a priori。
DBSCAN 的优点是你不需要指定要使用的簇的数量。你只需要一个计算值之间距离的函数和一些关于什么距离被认为是“接近”的指导。DBSCAN 在各种不同的分布中也比 k-均值算法产生更合理的结果。下图说明了这一点:
基于密度的聚类算法
基于密度的聚类 指的是无监督学习方法,通过识别数据中的独特组/簇来进行分类,其基于这样一个理念:数据空间中的簇是高点密度的连续区域,由低点密度的连续区域与其他簇隔开。
基于密度的空间聚类(DBSCAN)是基于密度的聚类的基础算法。它可以从大量数据中发现不同形状和大小的簇,这些数据包含噪声和离群点。
DBSCAN 算法使用两个参数:
-
minPts: 为了使一个区域被认为是密集的,聚集在一起的最小点数(阈值)。
-
eps (ε): 用于定位任何点的邻域内点的距离度量。
如果我们探索两个叫做密度可达性(Density Reachability)和密度连接性(Density Connectivity)的概念,就能理解这些参数。
可达性 从密度的角度来说,建立一个点从另一个点可达的条件是它在该点的特定距离(eps)范围内。
连接性,另一方面,涉及基于传递性的链式方法来确定点是否位于特定簇中。例如,如果 p->r->s->t->q,则 p 和 q 点可以连接,其中 a->b 表示 b 在 a 的邻域内。
DBSCAN 聚类完成后,有三种类型的点:
-
核心点 — 这是一个距离自身不超过 n 的区域内至少有 m 个点的点。
-
边界点 — 这是一个在距离 n 内至少有一个核心点的点。
-
噪声 — 这是一个既不是核心点也不是边界点的点。它在自身距离 n 内的点少于 m 个。
DBSCAN 聚类的算法步骤
-
算法通过任意选择数据集中的一个点(直到所有点都被访问)来进行。
-
如果在半径为‘ε’的范围内有至少‘minPoint’个点,则我们将这些点视为同一簇的一部分。
-
然后,通过递归地重复每个邻近点的邻域计算来扩展簇。
参数估计
每个数据挖掘任务都有参数问题。每个参数都会以特定的方式影响算法。对于 DBSCAN,需要ε和minPts这两个参数。
-
minPts: 作为经验法则,最小minPts可以从数据集中的维度数D推导出来,公式为
***minPts* ≥ *D* + 1**
。低值***minPts* = 1**
是没有意义的,因为那样每个点本身就会形成一个簇。***minPts* ≤ 2**
的结果将与使用单链接度量的hierarchical clustering相同,树状图的剪切高度为ε。因此,minPts至少应选择为 3。然而,对于有噪声的数据集,较大的值通常更好,会产生更显著的簇。作为经验法则,可以使用** *minPts* = 2·*dim***
,但对于非常大的数据集、噪声数据或包含许多重复的数据,可能需要选择更大的值。 -
ε: 可以通过使用一个k-distance 图来选择ε的值,该图绘制了距离到
***k* = *minPts*-1**
最近邻的距离,并按从大到小的顺序排列。好的ε值是在该图上显示“肘部”的位置:如果ε选择得太小,大部分数据将无法被聚类;而ε值过高,则聚类会合并,大多数对象会在同一个簇中。一般来说,小的ε值是更可取的,作为经验法则,只有少量的点应该在彼此的这个距离之内。 -
距离函数: 距离函数的选择与ε的选择密切相关,并对结果有重大影响。通常,在选择参数ε之前,需要首先确定数据集的合理相似度度量。没有此参数的估计,但需要为数据集选择适当的距离函数。
使用 Scikit-learn 的 DBSCAN Python 实现
让我们首先对球形数据应用 DBSCAN 进行聚类。
我们首先生成 750 个球形训练数据点及其对应的标签。之后对训练数据的特征进行标准化,最后应用 sklearn 库中的 DBSCAN。
DBSCAN 对球形数据的聚类
上述结果中的黑色数据点代表离群点。接下来,应用 DBSCAN 对非球形数据进行聚类。
DBSCAN 对非球形数据的聚类
这完全是完美的。如果与 K-means 进行比较,它会给出完全不正确的结果,如下所示:
K-means 聚类结果
DBSCAN 的复杂度
-
最佳情况: 如果使用索引系统存储数据集,以便邻域查询以对数时间执行,则平均运行时间复杂度为
**O(nlogn)**
。 -
最坏情况: 如果没有使用索引结构或在退化数据上(例如所有点在小于ε的距离内),最坏情况下的运行时间复杂度仍为
**O(*n*²)**
。 -
平均情况: 根据数据和算法实现,与最佳/最坏情况相同。
结论
基于密度的聚类算法可以学习任意形状的簇,借助 Level Set Tree 算法,可以在展示广泛密度差异的数据集中学习簇。
但是,我要指出,与像 K-Means 这样的参数化聚类算法相比,这些算法在调整时要复杂一些。比如 DBSCAN 的ε参数或 Level Set Tree 的参数相比于 K-Means 的簇数量参数,直观理解较难,因此为这些算法选择好的初始参数值更具挑战性。
本文到此为止。希望你们阅读愉快,请在评论区分享你的建议/观点/问题。
感谢阅读!
个人简介: Nagesh Singh Chauhan 是 CirrusLabs 的大数据开发工程师。他在电信、分析、销售、数据科学等各个领域拥有超过 4 年的工作经验,专注于各种大数据组件。
原文。经许可转载。
更多相关内容
dbt 数据转换 – 实操教程
原文:
www.kdnuggets.com/2021/07/dbt-data-transformation-tutorial.html
评论
Essi Alizadeh 是一名工程师和高级数据科学家,处于永久测试状态。
我们的前三大课程推荐
1. Google 网络安全证书 - 快速开启网络安全职业生涯。
2. Google 数据分析专业证书 - 提升你的数据分析技能
3. Google IT 支持专业证书 - 支持你的组织的 IT
dbt(数据构建工具)是一个数据转换工具,使用 SQL 选择语句。它允许你创建复杂的模型,使用变量和宏(即函数),运行测试,生成文档等。
dbt 不提取或加载数据,但它在转换已存在于数据库中的数据方面非常强大——dbt 执行 ELT(提取、加载、转换)过程中的T。
在本文章中,你将学习如何:
-
配置 dbt 项目。
-
创建 dbt 模型(SELECT 语句)。
-
使用全局变量和宏构建复杂的 dbt 模型。
-
通过引用其他 dbt 模型来构建复杂的模型。
-
运行测试。
-
生成文档。
先决条件
注册
你可以在getdbt.com注册。免费计划对于小型项目和测试来说是一个很好的选择。
具有填充数据的数据库
你可以查看我关于如何在 Heroku 上部署一个 免费的 PostgreSQL 数据库的文章。该文章提供了逐步的操作说明。你也可以查看数据摄取脚本以及附带的GitHub 仓库。
根据上述内容,我们在 PostgreSQL 数据库中生成了两个表,这些表将在本文章中使用。数据库中有两个表,分别命名为 covid_latest 和 population_prosperity。你可以在本文章的 GitHub 仓库中找到摄取脚本。
dbt CLI 安装
你可以按照以下dbt 文档页面上的说明安装 dbt 命令行界面 (CLI)。
dbt 项目的基础知识
使用 dbt 工具时需要了解三件主要的事情:
-
dbt 项目
-
数据库连接
-
dbt 命令
如何使用 dbt?
一个 dbt 项目是一个包含 .sql 和 .yml 文件的目录。所需的最低文件包括:
-
一个名为dbt_project.yml的项目文件:该文件包含 dbt 项目的配置。
-
模型(.sql文件):dbt 中的模型只是一个包含单个 select 语句的*.sql*文件。
每个 dbt 项目都需要一个dbt_project.yml文件——这是 dbt 识别目录是否为 dbt 项目的方式。它还包含重要的信息,告诉 dbt 如何操作你的项目。
你可以在这里找到更多关于 dbt 项目的信息。
一个dbt 模型基本上是一个*.sql*文件,包含一个SELECT语句。
dbt 命令
dbt 命令以dbt开头,可以通过以下方式之一执行:
-
dbt Cloud(在 dbt Cloud 仪表板底部的命令部分),
-
dbt CLI
一些命令只能在 dbt CLI 中使用,如dbt init。在这篇文章中我们将使用的一些 dbt 命令包括
-
dbt init(仅在 dbt CLI 中)
-
dbt run
-
dbt test
-
dbt docs generate
dbt 项目设置
第一步:使用 dbt CLI 初始化一个 dbt 项目(示例文件)
你可以使用dbt init来生成示例文件/文件夹。特别是,dbt init project_name将创建以下内容:
-
如果还不存在的话,创建一个*~/.dbt/profiles.yml*文件
-
一个名为*[project_name]*的新文件夹
-
必要的目录和示例文件,以便开始使用 dbt
注意:由于dbt init生成一个名为project_name的目录,为避免任何冲突,你应该没有任何具有相同名称的现有文件夹。
dbt init <project_name>
结果是一个包含以下示例文件的目录。
sample_dbt_project
├── README.md
├── analysis
├── data
├── dbt_project.yml
├── macros
├── models
│ └── example
│ ├── my_first_dbt_model.sql
│ ├── my_second_dbt_model.sql
│ └── schema.yml
├── snapshots
└── tests
对于这篇文章,我们只考虑最小文件并去除多余内容。
sample_dbt_project
├── README.md
├── dbt_project.yml
└── models
├── my_first_dbt_model.sql
├── my_second_dbt_model.sql
└── schema.yml
第二步:设置 Git 代码库
你可以使用现有的代码库,如设置过程中所述。你可以通过查看 dbt 文档这里来配置代码库。
或者,如果你想创建一个新的代码库…
你可以在创建的目录内创建一个新的代码库。可以按如下方式进行:
git init
git add .
git commit -m "first commit"
git remote add origing
git push -u origin master
第三步:在 dbt Cloud 仪表板上设置新项目
在前一步中,我们创建了一个包含示例模型和配置的示例 dbt 项目。现在,我们想创建一个新项目,并在 dbt Cloud 仪表板上连接我们的数据库和代码库。
在继续之前,你应该已经拥有
-
数据库中已存在的一些数据,
-
一个包含前一步生成的文件的代码库
你可以按照下面的步骤在 dbt Cloud 中设置一个新项目(请记住,这一步与前一步不同,因为我们仅生成了一些示例文件)。
我们项目的dbt_project.yml文件如下所示(你可以在GitHub repo中找到完整版本)。
name: 'my_new_project'
version: '1.0.0'
config-version: 2
vars:
selected_country: USA
selected_year: 2019
# This setting configures which "profile" dbt uses for this project.
profile: 'default'
# There are other stuff that are generated automatically when you run `dbt init`
dbt_project.yml
dbt 模型和功能
dbt 模型
让我们创建一些简单的 dbt 模型来检索表中的几个列。
select "iso_code", "total_cases", "new_cases" from covid_latest
covid19_latest_stats dbt 模型(models/covid19_latest_stats.sql)
select "code", "year", "continent", "total_population" from population_prosperity
population dbt 模型(models/population.sql)
注意: dbt 模型名称是models目录下 sql 文件的文件名。模型名称可能与数据库中的表名不同。例如,在上述示例中,dbt 模型population是对数据库中population_prosperity表的SELECT语句的结果。
运行模型
你可以通过执行dbt run来运行 dbt 项目中的所有模型。下面显示了一个示例 dbt 运行输出。你可以查看运行所有 dbt 模型的摘要或详细日志。这对于调试查询中的任何问题非常有帮助。例如,你可以看到一个抛出 Postgres 错误的失败模型。
详细记录失败的jinja_and_variable_usage dbt 模型。
Jinja & 宏
dbt 使用了Jinja模板语言,这使得 dbt 项目成为一个理想的 SQL 编程环境。通过 Jinja,你可以进行 SQL 中通常不可能的转换,例如使用环境变量或宏——抽象的 SQL 片段,类似于大多数编程语言中的函数。每当你看到*{{ … }}*时,你实际上是在使用 Jinja。有关 Jinja 及额外定义的 Jinja 风格函数的更多信息,请查看dbt 文档。
在这篇文章的后面,我们将介绍由 dbt 定义的自定义宏。
使用变量
定义变量
你可以在dbt_project.yml中的vars部分定义变量。例如,让我们定义一个名为selected_country的变量,其默认值为USA,以及另一个名为selected_year的变量,其默认值为2019。
name: 'my_new_project'
version: '1.0.0'
config-version: 2
vars:
selected_country: USA
selected_year: 2019
dbt_project.yml
使用变量
你可以通过var() Jinja 函数({{ var(“var_key_name”) }})在 dbt 模型中使用变量。
宏
在dbt_utils中有许多有用的转换和宏可以在你的项目中使用。有关所有可用宏的列表,你可以查看它们的GitHub 仓库。
现在,让我们按照以下步骤将 dbt_utils 添加到我们的项目中并安装:
- 将 dbt_utils 宏添加到你的packages.yml文件中,如下所示:
packages:
- package: dbt-labs/dbt_utils
version: 0.6.6
将dbt_utils包添加到 packages.yml 中。
- 运行dbt deps以安装包。
使用dbt deps安装包。
复杂的 dbt 模型
模型(选择)通常是相互堆叠的。为了构建更复杂的模型,你需要使用 ref() 宏。ref() 是 dbt 中最重要的函数,因为它允许你引用其他模型。例如,你可能有一个模型(即 SELECT 查询),它执行多个操作,但你不希望在其他模型中使用它。如果不使用之前介绍的宏,将很难构建复杂模型。
dbt 模型使用 ref() 和全局变量
我们可以使用前面定义的两个 dbt 模型来构建更复杂的模型。例如,我们可以创建一个新的 dbt 模型,将上述两个表按国家代码连接起来,然后根据选定的国家和年份进行筛选。
select *
from {{ref('population')}}
inner join {{ref('covid19_latest_stats')}}
on {{ref('population')}}.code = {{ref('covid19_latest_stats')}}.iso_code
where code='{{ var("selected_country") }}' AND year='{{ var("selected_year") }}'
jinja_and_variable_usage dbt 模型 (models/jinja_and_variable_usage.sql)。
关于上述查询的几点说明:
-
{{ref(‘dbt_model_name’)}} 用于引用项目中可用的 dbt 模型。
-
你可以从模型中获取一个列,例如*{{ref(‘dbt_model_name’)}}.column_name*。
-
你可以通过*{{var(“variable_name”)}}* 使用在 dbt_project.yml 文件中定义的变量。
上述代码片段将人口和 covid19_latest_stats 模型的数据按国家代码连接起来,并根据 selected_country=USA 和 selected_year=2019 进行筛选。模型的输出如下所示。
- jinja_and_variable_usage dbt 模型的输出。*
你也可以通过点击compile sql按钮查看编译后的 SQL 代码片段。这非常有用,特别是如果你想在 dbt 工具之外运行查询时。
编译后的 SQL 代码用于 jinja_and_variable_usage dbt 模型。
dbt 模型使用 dbt_utils 包和宏
dbt_utils 包含可以在 dbt 项目中使用的宏(即函数)。所有宏的列表可以在 dbt_utils 的 GitHub 页面 上找到。
让我们在 dbt 模型中使用 dbt_utils 的 pivot() 和 get_column_values() 宏,如下所示:
select
continent,
{{ dbt_utils.pivot(
"population.year",
dbt_utils.get_column_values(ref('population'), "year")
) }}
from {{ ref('population') }}
group by continent
using_dbt_utils_macros dbt 模型 (models/using_dbt_utils_macros.sql)。
上述 dbt 模型将在 dbt 中编译为以下 SQL 查询。
select
continent,
sum(case when population.year = '2015' then 1 else 0 end) as "2015",
sum(case when population.year = '2017' then 1 else 0 end) as "2017",
sum(case when population.year = '2017' then 1 else 0 end) as "2016",
sum(case when population.year = '2017' then 1 else 0 end) as "2018",
sum(case when population.year = '2017' then 1 else 0 end) as "2019"
from "d15em1n30ihttu"."dbt_ealizadeh"."population"
group by continent
limit 500
/* limit added automatically by dbt cloud */
编译后的 SQL 查询来自 using_dbt_utils_macros dbt 模型。
在 dbt 中运行测试
使用 dbt 的另一个好处是能够测试你的数据。开箱即用,dbt 提供了以下通用测试:unique,not_null,accepted_values 和 relationships。下方展示了这些测试在模型上的示例:
version: 2
models:
- name: covid19_latest_stats
description: "A model of latest stats for covid19"
columns:
- name: iso_code
description: "The country code"
tests:
- unique
- not_null
schema.yml(dbt 测试)。
你可以通过 dbt test 运行测试。你可以看到下面的输出。
在 dbt Cloud 仪表板上运行 dbt 测试的结果。
了解有关 dbt 测试的更多信息,可以访问 dbt 文档。
在 dbt 中生成文档
你可以通过在命令部分简单地运行 dbt docs generate 来生成你的 dbt 项目的文档,如下所示。
为 dbt 项目生成文档。
你可以通过点击 查看文档 来浏览生成的文档。你可以在下面看到生成的文档概述。
除了 dbt docs generate,dbt docs 还可以提供一个 web 服务器来展示生成的文档。为此,你只需运行 dbt docs serve。有关为你的 dbt 项目生成文档的更多信息,请点击 这里。
其他功能
使用钩子和操作进行数据库管理
有些数据库管理任务需要运行额外的 SQL 查询,例如:
-
创建用户定义的函数
-
授予表的权限
-
以及更多
dbt 有两个接口(钩子和操作)来执行这些任务,并且重要的是对它们进行版本控制。这里简要介绍了钩子和操作。有关更多信息,你可以查看 dbt 文档。
钩子
钩子只是会在不同时间执行的 SQL 片段。钩子在 dbt_project.yml 文件中定义。不同的钩子有:
-
pre-hook: 在模型构建之前执行
-
post-hook: 在模型构建后执行
-
on-run-start: 在 dbt 运行开始时执行
-
on-run-end: 在 dbt 运行结束时执行
操作
操作是一种方便的方式,可以在不运行模型的情况下调用宏。操作是通过 dbt run-operation 命令触发的。请注意,与钩子不同,你需要显式执行 dbt 操作 中的 SQL。
结论
dbt 是一个非常值得尝试的好工具,因为它可能简化你的数据 ELT(或 ETL)管道。在这篇文章中,我们学习了如何设置和使用 dbt 进行数据转换。我向你介绍了这个工具的不同功能。特别是,我提供了一个逐步指南:
-
配置 dbt 项目
-
创建 dbt 模型(SELECT 语句)
-
使用全局变量和宏构建复杂的 dbt 模型
-
通过引用其他 dbt 模型构建复杂模型
-
运行测试
-
生成文档
你可以在下面找到包含所有脚本(包括数据摄取脚本)的 GitHub 仓库。随意克隆本文的源代码。
简介: Essi Alizadeh (@es_alizadeh) 是一名工程师和高级数据科学家,始终保持不断进步。他喜欢写作关于不同的技术、统计学、时间序列和机器学习的文章。
相关内容: