前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Byzer + OpenMLDB, SQL Boy 也能玩好工业级机器学习

Byzer + OpenMLDB, SQL Boy 也能玩好工业级机器学习

作者头像
用户2936994
发布2022-07-21 14:14:27
5160
发布2022-07-21 14:14:27
举报
文章被收录于专栏:祝威廉祝威廉

背景

其实,原先 Byzer 就已经可以通过几乎不需要编程就能完成整个机器学习的Pipeline,从数据加载,清洗,特征工程,模型训练对外提供端到端的 API 服务。具体的能力可以参考这篇文章: Byzer 机器学习最简教程(无需Python!) 当然这个系列还有特征工程,深度学习等等介绍,感兴趣看看。

但是,特征工程,尤其实时在线特征计算这块, Byzer 目前还有软肋。所谓实时特征工程是指什么呢?比如我在做预测的时候,需要的一个特征值是现算最近五个小时数据的平均值,这个特征需要对海量规模的数据进行一个实时特征计算,并且要低延时(毫秒级)。另外,实时特征计算对SQL 窗口计算的能力要求也比较高,而且我们还希望特征能够离线和在线共用一段SQL逻辑,避免复杂的逻辑校验流程。关于特征计算这块,推荐大家看一篇我写的文章:祝威廉:为什么特征工程要用 SQL 而不是 Python

正当Byzer 挠脑壳的时候, OpenMLDB 过来和 Byzer 打了个招呼,于是这些问题迎刃而解了。

OK, 不 BB了,Show You The Code。

出租车行程时间预测

本文我们将以Kaggle上的出租车行车时间预测问题为例,示范如何使用OpenMLDBByzer 联合来打造一个完整的机器学习应用。本文全程使用 Byzer Notebook 来演示。想了解 Byzer Notebook 可以看这篇文章: 祝威廉:Meta(Facebook) 第三代 Notebook Daiquery 与 Byzer Notebook 对比

本文假设用户已经部署了 OpenMLDB 和 Byzer 引擎。他们都是独立部署的分布式服务。

为了完成整个机器学习流程,同时为了简单起见,我们只会涵盖下面三部分的内容:

  1. 训练
  2. 部署
  3. 预测API

训练阶段

假设我们数据在数据湖里(当然也可以在数据库,数仓或者任意地方, Byzer 可以加载市面主流数据源),所以我们第一步是加载训练数据,然后把数据写入到对象存储上,然后导入到 FeatureStore(OpenMLDB) 中进行特征计算。

我们通过 load 语法加载数据湖里的数据:

用户可以继续使用 Byzer 对这些数据进行探索,包括绘制可视化图表,不过这里我们略过这些步骤。我们直接把数据写入到对象存储:

然后,加载到 FeatureStore(OpenMLDB) 中:

这里,我们通过 Byzer extension 的 FeatureStoreExt 来完成数据的导入。 在执行这个扩展中,我们可以指定 OpenMLDB 的地址,然后指定多条指令让 OpenMLDB 执行。

其中 ${HOME} 是Byzer 一个私有变量,他和当前的登录用户有关。每个用户可以通过 Byzer Notebook 侧边栏看到对象存储里的目录。

这样,OpenMLDB 可以顺利的加载到 Byzer 产生的数据。

通常在设计特征前,用户需要根据机器学习的目标对数据进行分析,然后根据分析设计和调研特征。机器学习的数据分析和特征研究不是本文讨论的范畴,我们将不作展开。本文假定用户具备机器学习的基本理论知识,有解决机器学习问题的能力,能够理解SQL语法,并能够使用SQL语法构建特征。

针对本案例,用户经过分析和调研设计了若干特征:

现在,我们可以进行相关的特征计算了:

计算完成后,我们可以看到侧边目录已经有我们产生的特征数据集了:

可以加载这个特征数据集,并且看看表结构之类的:

没什么问题,我们可以用这些特征数据进行模型训练。在模型训练前,我们还需要将其转化为向量。第一步是将所有int 类型字段都转化为 double:

接着把所有字段合并成一个向量:

现在,我们采用线性回归算法来进行模型训练:

这里,这里我们对 trainning_table 表进行训练,结果保存在 /model/tax-trip 目录中。然后通过一些参数配置,比如最大迭代次数30次等。

到这里,我们已经产生一个机器学习模型了。

部署

模型训练好以后,我们希望把特征计算逻辑和模型都部署到线上,然后可以对外提供 API 服务能力。整个部署也是全部在 Byzer Notebook 中进行。这里要分成两个步骤,第一个步骤是部署特征计算逻辑:

这里我们看到,我们只要把之前的特征计算SQL 代码拷贝过来,就可以部署过来。部署完成后,我们就可以利用这个逻辑对实时的大规模数据进行毫秒级的特征计算了。这里我们灌入一些数据到OpenMLDB中的实时数据表中(这个表生产环境中应该是有新数据不断地流入):

这样,特征工程就部署好了,同时我们也导入了一些实时数据进到特征表里。此时,如果你要计算对特征表里的数据进行特征计算,可以通过 API http://192.168.3.14:9080/dbs/demo_db/deployments/demo 来进行。

部署好特征后,我们来部署模型:

这里,我们通过注释,把我们的模型部署到一个 Rest 服务中。此时,如果你给定一个特征集合,就可以通过 tax_trip_model_predict 这个函数来进行计算,从而算出预测值。

Rest 预测服务

前面,我们部署好了特征计算以及模型。现在我们给出一条数据,来预测行驶时间。 Byzer Notebook 也支持使用 curl:

我们看到,预测值是 423。

我们来简单看下这个 Rest 接口。 这个接口最核心的是这么参数:

代码语言:javascript
复制
sql=select tax_trip_model_predict(
vec_dense(
    slice(
       from_json(
           get_json_object(
                 string(
                     rest_request("http://192.168.3.14:9080/dbs/demo_db/deployments/demo","POST", 
                     map("body","{\"input\":[[\"id0376262\",1,1467302350000,1467304896000,2,-73.873093,40.774097,-73.926704,40.856739,\"N\",1]]}"),
                     map("Content-Type" , "application/json"),map())),"$.data.data[0]"),"array<double>"),2,12)
)) as tax_duration

我们给定了一条行车记录:

代码语言:javascript
复制
[\"id0376262\",1,1467302350000,1467304896000,2,-73.873093,40.774097,-73.926704,40.856739,\"N\",1]

接着通过 rest_request 函数把这条记录提交给 FeatureStore(OpenMLDB), 他会返回特征计算后的结果,接着对这个Json格式的结果做一些处理,比如去掉第一个待预测的值,然后得到一个数组,接着把这个数组转化成向量,最后把这个向量传递给我们的模型预测函数tax_trip_model_predict。最后计算出结果,实现一个端到端的预测。

总结

从这篇文章我们可以看到,我们全程使用 Byzer 语言,完成了从数据加载,清洗,然后接着在 Byzer 中直接调用 OpenMLDB 进行特征计算,然后使用 Byzer 内置的算法完成模型训练。接着我们只要通过两个指令即可把特征以及模型都部署成 API 服务。最后我们通过 Curl 发起一个请求,对我们的预测服务进行了验证。全程几乎仅需要使用类SQL的语言就搞定了所有流程!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 出租车行程时间预测
  • 训练阶段
  • 部署
  • Rest 预测服务
  • 总结
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档