使用 Snowflake 和 Dask 构建机器学习管道
在这篇文章中,我想分享一些我最近一直在探索的工具,并向您展示我如何使用它们以及它们如何帮助提高我的工作流程效率。 我将特别谈论的两个是 Snowflake 和 Dask。 两种截然不同的工具,但它们可以很好地互补,尤其是作为机器学习生命周期的一部分。
By 丹尼尔·佛利,数据科学家
介绍
最近,我一直在努力寻找更好的方法来改进我作为数据科学家的工作流程。 我倾向于在我的工作中花费大量时间建模和构建 ETL。 这意味着我越来越需要依赖工具来可靠有效地处理大型数据集。 我很快意识到使用 Pandas 来处理这些数据集并不总是一个好方法,这促使我寻找其他替代方案。
在这篇文章中,我想分享一些我最近一直在探索的工具,并向您展示我如何使用它们以及它们如何帮助提高我的工作流程效率。 我将特别谈论的两个是 Snowflake 和 Dask。 两种截然不同的工具,但它们可以很好地互补,尤其是作为机器学习生命周期的一部分。 我希望在阅读这篇文章后,您将很好地了解 Snowflake 和 Dask 是什么,如何有效地使用它们以及如何启动并运行您自己的用例。
更具体地说,我想向您展示如何使用 Snowflake 和 Python 构建 ETL 管道来为机器学习任务生成训练数据。 然后我想介绍 Dask 和 土星云 并向您展示如何利用云中的并行处理来真正加快 ML 训练过程,从而提高数据科学家的工作效率。
用 Snowflake 和 Python 构建 ETL
在我们开始编码之前,我最好简要解释一下雪花是什么。 这是我最近在我的团队决定开始使用它时提出的一个问题。 在较高的层面上,它是云中的数据仓库。 玩了一段时间后,我意识到它有多么强大。 我认为对我来说,最有用的功能之一是您可以使用的虚拟仓库。 虚拟仓库可让您访问相同的数据,但完全独立于其他虚拟仓库,因此计算资源不会跨团队共享。 这已被证明非常有用,因为它消除了由其他用户全天执行查询引起的任何潜在性能问题。 这减少了等待运行查询的挫败感和浪费的时间。
由于我们将使用 Snowflake,我将简要概述如何设置它并开始自己尝试。 我们需要做以下事情:
- 设置雪花帐户
- 将我们的数据导入 Snowflake
- 使用 SQL 和 Snowflake UI 编写和测试我们的查询
- 编写一个 Python 类,该类可以执行我们的查询以生成最终的建模数据集
设置帐户就像在他们的网站上注册免费试用一样简单 官网. 完成后,您可以下载 snowsql CLI 相关信息. 这将使向 Snowflake 添加数据变得简单。 按照这些步骤操作后,我们可以尝试使用我们的凭据和命令行连接到 Snowflake。
snowsql -a <account_name> -u <user_name>
您可以在登录 Snowflake UI 时在 URL 中找到您的帐户名。 它应该看起来像这样:xxxxx.europe-west2.gcp。 好的,让我们进入下一步,将我们的数据放入 Snowflake。 我们需要遵循以下几个步骤:
- 创建我们的虚拟仓库
- 建立资料库
- 定义和创建我们的表
- 为我们的 CSV 文件创建一个临时表
- 将数据复制到我们的表中
幸运的是,这并不太难,我们可以完全使用 snowsql CLI 来完成。 对于这个项目,我将使用比我想要的更小的数据集,但不幸的是,我不能使用我公司的任何数据,而且很难在网上找到合适的大型数据集。 然而,我确实从 Dunnhumby 找到了一些交易数据,这些数据可以在 Kaggle. 尽管我使用这些数据创建了一个更大的合成数据集来测试与 sklearn 相比 Dask 处理挑战的能力,但只是为了踢球。
首先,我们需要在 Snowflake UI 中使用以下命令设置虚拟仓库和数据库。
创建信息图 or 更换 仓库分析_wh
仓库尺寸=“X-小”
自动挂起=180
auto_resume=真
初始暂停=真;
创建信息图 or 更换 数据库 笨拙的;
我们的数据由 6 个 CSV 组成,我们将其转换为 6 个表格。 我不会花太多时间研究数据集,因为这篇文章更多的是关于使用 Snowflake 和 Dask 而不是解释数据。
以下是我们可以用来创建表的命令。 您需要提前知道的是您将使用哪些列和数据类型。
create or replace table campaign_desc ( description string, campaign number,
start_day number,
end_day number ); create or replace table campaign_table ( description string, Household_key number, campaign number ); create or replace table coupon ( COUPON_UPC number, product_id number, campaign number ); create or replace table coupon_redempt ( household_key number, day number, coupon_upc number, campaign number ); create or replace table transactions ( household_key number, BASKET_ID number, day number, product_id number, quantity number, sales_value number, store_id number, retail_disc decimal, trans_time number, week_no number, coupon_disc decimal, coupon_match_disc decimal ); create or replace table demographic_data ( age_dec string, marital_status_code string, income_desc string, homeowner_desc string, hh_comp_desc string, household_size_desc string, kid_category_desc string, Household_key number);
现在我们已经创建了我们的表,我们可以开始考虑如何将数据放入其中。 为此,我们需要暂存我们的 CSV 文件。 这基本上只是一个中间步骤,因此 Snowflake 可以直接将文件从我们的舞台加载到我们的表中。 我们可以使用 PUT 命令将本地文件放入我们的舞台,然后 复制到 命令来指示 Snowflake 将这些数据放在哪里。
use database dunnhumby; create or replace stage dunnhumby_stage; PUT file://campaigns_table.csv @dunnhumby.public.dunnhumby_stage; PUT file://campaigns_desc.csv @dunnhumby.public.dunnhumby_stage; PUT file://coupon.csv @dunnhumby.public.dunnhumby_stage; PUT file://coupon_d=redempt.csv @dunnhumby.public.dunnhumby_stage; PUT file://transaction_data.csv @dunnhumby.public.dunnhumby_stage; PUT file://demographics.csv @dunnhumby.public.dunnhumby_stage;
作为快速检查,您可以运行此命令来检查暂存区中的内容。
ls @dunnhumby.public.dunnhumby_stage;
现在我们只需要使用下面的查询将数据复制到我们的表中。 登录 Snowflake 后,您可以在 Snowflake UI 或命令行中执行这些操作。
copy into campaign_table from @dunnhumby.public.dunnhumby_stage/campaigns_table.csv.gz file_format = ( type = csv
skip_header=1 error_on_column_count_mismatch = false field_optionally_enclosed_by=’”’); copy into campaign_desc from @dunnhumby.public.dunnhumby_stage/campaign_desc.csv.gz file_format = ( type = csv
skip_header=1 error_on_column_count_mismatch = false field_optionally_enclosed_by=’”’); copy into coupon from @dunnhumby.public.dunnhumby_stage/coupon.csv.gz file_format = ( type = csv
skip_header=1 error_on_column_count_mismatch = false field_optionally_enclosed_by=’”’); copy into coupon_redempt from @dunnhumby.public.dunnhumby_stage/coupon_redempt.csv.gz file_format = ( type = csv
skip_header=1 error_on_column_count_mismatch = false field_optionally_enclosed_by=’”’); copy into transactions from @dunnhumby.public.dunnhumby_stage/transaction_data.csv.gz file_format = ( type = csv
skip_header=1 error_on_column_count_mismatch = false field_optionally_enclosed_by=’”’); copy into demographic_data from @dunnhumby.public.dunnhumby_stage/demographics.csv.gz file_format = ( type = csv skip_header=1 error_on_column_count_mismatch = false field_optionally_enclosed_by=’”’);
好吧,运气好的话,我们首先尝试将数据放在我们的表中。 哦,要是这么简单就好了,整个过程花了我几次尝试才正确(注意拼写错误)。 希望你能跟上这一点,并且一切顺利。 我们越来越接近有趣的东西,但上述步骤是该过程的重要组成部分,因此请确保您了解这些步骤中的每一个。
用 SQL 编写我们的管道
在下一步中,我们将编写查询以生成我们的目标、我们的特征,然后最终生成一个训练数据集。 创建用于建模的数据集的一种方法是将这些数据读入内存并使用 Pandas 创建新特征并将所有数据框连接在一起。 这通常是您在 Kaggle 和其他在线教程中看到的方法。 这样做的问题是效率不高,尤其是当您使用任何合理大小的数据集时。 出于这个原因,将繁重的工作外包给像 Snowflake 这样的东西是一个更好的主意,它可以非常好地处理大量数据集,并且可能会为您节省大量时间。 我不会在这里花太多时间深入研究我们数据集的细节,因为它对我想要展示的内容并不重要。 但是,一般而言,在开始建模之前,您需要花费大量时间探索和理解数据。 这些查询的目标是预处理数据并创建一些我们稍后可以在我们的模型中使用的简单特征。
目标定义
显然,监督机器学习的一个重要组成部分是定义一个合适的预测目标。 对于我们的用例,我们将通过计算用户是否在截止周后的两周内再次访问来预测流失。 2 周的选择非常随意,取决于我们试图解决的具体问题,但让我们假设它适合这个项目。 通常,您需要仔细分析您的客户以了解访问之间的差距分布,从而得出合适的流失定义。
这里的主要思想是,对于每个表,我们希望每个 home_key 都有一行包含我们每个特征的值。
活动特点
交易特点
下面我们根据汇总统计数据创建一些简单的指标,例如平均值、最大值和标准偏差。
人口统计特征
这个数据集有很多缺失的数据,所以我决定在这里使用插补。 从删除丢失数据到高级插补方法,有很多用于丢失数据的技术。 我刚刚让自己在这里的生活变得轻松,并用模式替换了缺失值。 我不一定建议一般采用这种方法,因为理解为什么会丢失这些数据对于决定如何处理它非常重要,但就本示例而言,我将继续采用简单的方法。 我们首先计算每个特征的模式,然后如果数据丢失,则使用合并用模式替换每一行。
训练数据
最后,我们通过将我们的主表连接在一起来为我们的训练数据构建一个查询,并最终得到一个包含我们的目标、我们的活动、交易和人口统计特征的表,我们可以用它来构建模型。
顺便说一句,对于那些有兴趣了解更多有关 Snowflake 功能和细微差别的人,我会推荐以下书: 雪花食谱. 我开始阅读这本书,它充满了关于如何使用 Snowflake 的非常有用的信息,并且比我在这里做的详细得多。
ETL 的 Python 代码
这个 ETL 需要的最后一部分是编写一个脚本来执行它。 现在,只有在您计划定期运行这样的 ETL 时才真正需要这样做,但这是一种很好的做法,并且可以在需要时更轻松地运行 ETL。
让我们简要讨论一下 EtlTraining 类的主要组件。 我们的班级接受一项输入,即截止周。 这是由于数据在我们的数据集中定义的方式,但通常,这将采用与我们要选择生成训练数据的截止日期相对应的日期格式。
我们初始化了一个查询列表,以便我们可以轻松地遍历这些查询并执行它们。 我们还创建了一个字典,其中包含我们传递给 Snowflake 连接的参数。 这里我们使用我们在 Saturn Cloud 中设置的环境变量。 这里 是有关如何执行此操作的指南。 连接到 Snowflake 并不太难,我们需要做的就是使用 Snowflake 连接器并传入我们的凭据字典。 我们在 Snowflake connect 方法中实现这一点,并将此连接作为属性返回。
为了使这些查询更容易运行,我将每个查询保存为 ml_query_pipeline.py 文件中的 python 字符串变量。 execute_etl 方法完全按照它在罐头上所说的做。 我们循环遍历每个查询,对其进行格式化、执行并通过关闭 Snowflake 连接完成。
要运行此 ETL,我们只需在终端中键入以下命令即可。 (其中 ml_pipeline 是上面脚本的名称。)
python -m ml_pipeline -w 102 -j ‘train’
顺便说一句,您可能希望定期运行这样的 ETL。 例如,如果您想进行每日预测,那么您需要每天生成这样的数据集以传递给您的模型,以便您确定哪些客户可能会流失。 我不会在这里详细介绍,但在我的工作中,我们使用 Airflow 来编排我们的 ETL,因此如果您有兴趣,我建议您查看一下。 事实上,我最近买了一本书'使用 Apache Airflow 的数据管道' 我认为这很棒,并且确实提供了一些关于如何使用气流的可靠示例和建议。
Dask和建模
现在我们已经建立了我们的数据管道,我们可以开始考虑建模。 我在这篇文章中的另一个主要目标是强调使用 Dask 作为 ML 开发过程的一部分的优势,并向你们展示它的易用性。
对于项目的这一部分,我还使用了 土星云 这是我最近遇到的一个非常好的工具,它使我们能够在云中的一组计算机上利用 Dask 的强大功能。 对我而言,使用 Saturn 的主要优势在于,分享您的工作真的很容易,在需要时扩展您的计算非常简单,并且它有一个免费层选项。 总的来说,模型开发对于 Dask 来说是一个非常好的用例,因为我们通常想训练一堆不同的模型,看看哪种模型效果最好。 我们做得越快越好,因为我们有更多时间专注于模型开发的其他重要方面。 类似于 Snowflake 你只需要注册 相关信息 并且您可以非常快速地启动 Jupyter 实验室的一个实例并开始自己进行试验。
现在,我意识到此时我已经多次提到 Dask,但从未真正解释过它是什么。 所以让我花点时间给你一个非常高层次的 Dask 概述,以及为什么我认为它很棒。 很简单,Dask 是一个 Python 库,它利用并行计算来允许您对非常大的数据集进行处理和执行操作。 而且,最好的部分是,如果您已经熟悉 Python,那么 Dask 应该非常简单,因为语法非常相似。
下图突出显示了 Dask 的主要组件。
Sumber: Dask 文档
集合允许我们创建一个任务图,然后可以在多台计算机上执行。 其中一些数据结构可能听起来很熟悉,例如数组和数据框,它们与您在 python 中发现的相似,但有一些重要的区别。 例如,您可以将 Dask 数据框视为一堆以允许我们并行执行操作的方式构建的 Pandas 数据框。
从集合开始,我们有了调度程序。 一旦我们创建了任务图,调度程序就会为我们处理剩下的事情。 它管理工作流并将这些任务发送到单个机器或将它们分布在集群中。 希望这能让您非常简要地了解 Dask 的工作原理。 有关更多信息,我建议查看 文件 或本 书. 两者都是深入研究该主题的非常好的资源。
用于建模的 Python 代码
在建模时,我倾向于使用少量的首选算法,我将始终首先尝试这些算法。 这通常会让我很好地了解什么可能适合我遇到的特定问题。 这些模型是 Logistic 回归、随机森林和 GradientBoosting。 根据我的经验,当处理表格数据时,这些算法通常会给你很好的结果。 下面我们使用这 3 个模型构建 sklearn 建模管道。 我们在这里使用的确切模型并不重要,因为管道应该适用于任何 sklearn 分类模型,这只是我的偏好。
事不宜迟,让我们深入研究代码。 幸运的是,我们将大部分预处理工作外包给了 Snowflake,因此我们不必在这里过多地处理我们的训练数据,但我们将使用 sklearn 管道添加一些额外的步骤。
下面的第一个代码片段显示了使用 sklearn 时的管道。 注意我们的数据集是一个普通的旧熊猫数据框,我们的预处理步骤都是使用 sklearn 方法进行的。 这里没有什么特别不寻常的事情。 我们正在从我们的 Snowflake ETL 生成的表中读取数据,并将其传递到 sklearn 管道中。 通常的建模步骤适用于此。 我们将数据集拆分为训练和测试并进行一些预处理,即使用中位数估算缺失值、缩放数据并对我们的分类数据进行单热编码。 我是 sklearn 管道的忠实粉丝,现在我开发模型时基本上都会使用它们,它们确实有助于代码简洁明了。
这个管道在大约 2 万行的数据集上表现如何? 好吧,在没有任何超参数调整的情况下运行这个模型大约需要 34 分钟。 哦,有点慢。 您可以想象如果我们想要进行任何类型的超参数调整,这需要多长时间。 好的,所以并不理想,但让我们看看 Dask 如何应对挑战。
Dask ML Python 代码
我们的目标是看看我们是否可以击败上面的 sklearn 管道,剧透警报,我们绝对可以。 Dask 很酷的一点是,当您已经熟悉 Python 时,入门门槛非常低。 我们只需进行一些更改即可在 Dask 中启动并运行此管道。
您可能会注意到的第一个变化是我们有一些不同的导入。 此管道与前一个管道之间的主要区别之一是我们将使用 Dask 数据框而不是 Pandas 数据框来训练我们的模型。 您可以将 Dask 数据框视为一堆 Pandas 数据框,我们可以在其中同时对每个数据框执行计算。 这是 Dask 并行性的核心,并且将减少此管道的训练时间。
注意我们使用 @dask.delayed 作为我们的装饰者 加载训练数据 功能。 这指示 Dask 为我们并行化这个函数。
我们还将从 Dask 导入一些预处理和管道方法,最重要的是,我们需要导入 SaturnCluster,这将允许我们创建一个集群来训练我们的模型。 与此代码的另一个主要区别是我们使用 dask.坚持 在我们的火车测试拆分之后。 在此之前,由于 Dask 的惰性求值,我们的任何函数实际上都没有被计算过。 一旦我们使用了 persist 方法,尽管我们告诉 Dask 将我们的数据发送给工作人员并执行我们在此之前创建的任务并将这些对象留在集群上。
最后,我们使用延迟方法训练我们的模型。 同样,这使我们能够以一种懒惰的方式创建我们的管道。 在我们到达以下代码之前不会执行管道:
fit_pipelines = dask.compute(*pipelines_)
这次我们只花了大约 10 分钟就在完全相同的数据集上运行这个管道。 这是一个 3.4 倍的加速,不算太糟糕。 现在,如果我们愿意,我们可以通过在 Saturn 中按一下按钮来扩展我们的计算资源来进一步加快速度。
部署我们的管道
我之前提到过,您可能希望使用气流之类的东西定期运行这样的管道。 碰巧的是,如果您不想为气流设置一切的初始麻烦,Saturn Cloud 为乔布斯提供了一个简单的替代方案。 作业允许我们打包我们的代码并定期或根据需要运行它。 您需要做的就是转到现有项目并单击创建作业。 一旦我们这样做了,它应该如下所示:
Sumber: 土星
从这里,我们需要做的就是确保我们上面的python文件在图像的目录中,我们可以在上面输入我们的python命令
python -m ml_pipeline -w 102 -j 'train'
如果我们愿意,我们还可以使用 cron 语法设置时间表来每天运行 ETL。 对于有兴趣的人,这里有一个 教程 这涉及所有细节。
结论和要点
好了,到此为止,我们的项目已经结束了。 现在显然我已经遗漏了 ML 开发周期的一些关键部分,例如超参数调整和部署我们的模型,但也许我会留一天。 我认为你应该尝试 Dask 吗? 无论如何,我都不是专家,但从我目前所见,它确实似乎非常有用,我非常兴奋能对其进行更多实验,并找到更多机会将其纳入我作为数据科学家的日常工作中。 希望您发现这很有用,并且您也可以看到 Snowflake 和 Dask 的一些优点,并且您将开始自己试验它们。
资源
我的一些其他帖子你可能会觉得有趣
注意:这篇文章中的一些链接是附属链接。
简介: 丹尼尔·佛利 是前经济学家转为数据科学家,在移动游戏行业工作。
原版。 经许可重新发布。
相关新闻:
来源:https://www.kdnuggets.com/2021/07/building-machine-learning-pipelines-snowflake-dask.html
- "
- &
- 102
- 2021
- ACCESS
- 账号管理
- 额外
- 优点
- 忠告
- 联盟
- 算法
- 所有类型
- Amazon
- 阿帕奇
- 国家 / 地区
- 围绕
- 汽车
- 最佳
- 位
- 建立
- 建筑物
- 束
- 营销活动
- 例
- 造成
- 挑战
- 更改
- 检查
- 分类
- 接近
- 云端技术
- 码
- 编码
- 元件
- 计算
- 电脑
- 计算
- Coursera
- 创造
- 资历
- 合作伙伴
- data
- 数据科学
- 数据科学家
- 数据集
- 数据仓库
- 数据库
- 天
- 处理
- 深入学习
- 人口统计学
- 细节
- 开发
- 研发支持
- DID
- 副总经理
- 效率
- 工程师
- 环境
- 实验
- 特征
- 终于
- 结束
- (名字)
- 专注焦点
- 遵循
- 格式
- 自由的
- ,
- 功能
- 赌博
- 游戏行业
- 其他咨询
- 非常好
- 图形处理器
- 大
- 指南
- 相关信息
- 高
- 近期亮点
- 创新中心
- How To
- HTTPS
- 巨大
- 主意
- 鉴定
- 图片
- 增加
- 行业中的应用:
- info
- 信息
- 问题
- IT
- 工作
- 工作机会
- 加入
- 跳
- 键
- 大
- 学习用品
- 学习
- Level
- 自学资料库
- Line
- 清单
- 加载
- 本地
- 长
- 机器学习
- 指标
- 百万
- ML
- 联络号码
- 手机游戏
- 模型
- 移动
- 亦即
- 新功能
- 优惠精选
- 在线
- 运营
- 附加选项
- 其他名称
- 性能
- 大量
- 帖子
- 功率
- 预测
- 生成
- 生产率
- 项目
- 国家
- 蟒蛇
- 阅读
- 减少
- 回归
- 资源
- REST的
- 成果
- 运行
- 运行
- 鳞片
- 缩放
- 科学
- 科学家
- 系列
- 集
- 设置
- Share
- 共用的,
- 简易
- 小
- So
- 解决
- 速度
- 花
- 花费
- 纺
- 分裂
- SQL
- 阶段
- 开始
- 开始
- 统计
- 故事
- 流
- 目标
- test
- 思维
- 次
- 最佳
- 触摸
- 产品培训
- 交易
- 交易
- 试用
- 教程
- ui
- us
- 用户
- 在线会议
- 仓库保管
- 周
- 什么是
- 中
- 工作
- 工人
- 工作流程
- 合作
- 写作
- X
- 年