前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >为什么特征工程要用 SQL 而不是 Python

为什么特征工程要用 SQL 而不是 Python

作者头像
用户2936994
发布于 2022-05-18 00:18:50
发布于 2022-05-18 00:18:50
83900
代码可运行
举报
文章被收录于专栏:祝威廉祝威廉
运行总次数:0
代码可运行

我们常说机器学习是一门实验科学。所以相比较传统工程而言,机器学习分成两个大的阶段:

  1. 实验结果
  2. 工程化阶段

实验阶段通常需要一个好的 Notebook 帮助机器学习的同学快速验证模型的可行性,这包括获取数据,处理数据,训练模型,这几个过程每个都需要反复进行。在实验阶段其实机器学习的同学已经解决了几个核心问题:

  1. 在哪里获取哪些数据对我们这个要解决的问题有价值
  2. 这些获得数据要经过怎样的处理才能对要解决的问题有价值
  3. 哪个模型对解决我们的问题最有价值

第二个阶段就是工程化,工程化也分成两个部分:

  1. 离线或者实时进行模型构建
  2. 模型的多场景部署,比如 流,批,API或者边缘部署(比如 iOS/Android等)

考虑到数据决定模型,所以模型需要数据更新才能延长寿命,所以这两个 Pipeline 需要有如下的基本要求:

  1. 模型需要可持续构建
  2. 模型更新也应该是日常工作

看着比较简单,实际上,以模型构建阶段为例,他需要一整套大数据系统来支撑数据的获取和特征处理,需要整套 Modern Data Stack 。多模型场景部署也是非常困难的事情,每个部署场景甚至都有可能需要有单独的团队去做。

每个阶段都有很大的Gap,比如实验阶段的代码和逻辑是很难面向大规模数据集,很难自动化运行的,他需要工程阶段的同学进行翻译。这种翻译又引出了另外一个问题:

逻辑一致性校验

这里的逻辑一致性校验又分成两个部分:

  1. 模型构建特征处理的逻辑一致性
  2. 预测时特征和离线时的逻辑一致性

每个阶段可能都需要极大人力成本消耗。

所以从上面我们看到,一套能够很好运转的机器学习系统需要有:

  1. 较好的 Infra
  2. 算法,研发,和运维 体系的支持
  3. 研发和算法的高 overhead 协作

而实际上,在现实生活中,这套体系会面临三个大问题:

  1. 开发周期太长,从开发到上线,需要以月计算。
  2. 硬件,人员成本可能远高于落地的算法的收益
  3. 就算愿意投钱,也很难招聘到满足需求的研发和算法

而这三个问题直接导致了在中小企业,AI 难以落地。

先姑且不论 实验阶段到工程阶段的翻译和一致性校验成本,单单模型构建和模型预测里的特征工程导致的开发成本就差不多要整整8人月, OpenMLDB 就给了一个很好的统计:

那如何降低成本呢?关键是要解决如下几个问题:

  1. 要有一套好的基础 Infra
  2. 实验阶段和工程化阶段要实现代码尽可能复用,避免完全重写,同时减轻的复杂逻辑校验过程。
  3. 特征在离线阶段和推理阶段特征处理代码也要尽可能复用,减少重写和减轻复杂的逻辑校验过程。

现在,我们来看看2,3 两个核心痛点是怎么产生的,方便我们理解问题。

首先是实验阶段和工程化阶段模型构建代码复用的问题:

  1. 实验阶段算法工程师可能会大量 hard-code 诸如路径地址,保存大量临时磁盘文件,甚至只处理部分数据。这显然是无法直接应用到生产环境里的。
  2. 工具能力不对等。今天 Python 是大部分数据科学家的首选工具;相反,工程化团队一般会首先尝试使用 SQL/Java/Scala等语言去翻译 Python 脚本 从而满足大数据量的吞吐,以及数据访问能力。因此两个工具在表达能力上并不对等。当然这里本质原因是,两个不同阶段的需求不一样,导致工具和能力上的不对等。
  3. 需求沟通的认知差。数据科学家以及工程化团队对于数据的定义和处理方式的认知可能会不一致,并且互相对对方的背景也很难获得共同。比如让研发工程师去理解算法工程师的一些思路是很困难的,意味他们不懂机器学习,甚至难以校验自己做的是不是对的。以美国的一家线上银行 Varo Bank 描述了一个他们在没有合适工具情况下,实时特征上线时碰到的一个不一致场景(具体可以参照他们工程化团队的博客 Feature Store: Challenges and Considerations)。在上线环境中,工程化团队很自然的认为“账户余额”的定义应该就是实时的账户里的余额;但是对于数据科学家来说,通过离线的数据去构建“实时账户余额”其实是一件相当复杂的事情,因此数据科学家使用了一个更加简单的定义,即昨天结束的时候的账户的余额。很明显,两者对于账户余额的认知差,直接造成了线上线下计算逻辑的不一致性。 当然,这里的本质是协作带来的 Overhead

接着我们来看看模型构建和模型推理中特征工程的代码复用问题。为什么这里也有特征代码复用的问题呢?首先推理阶段也是有 end-2-end需求的,也就是光有一个模型没有用,模型只接受向量或者张量,你也需要把数据先通过特征工程才能喂给模型,模型吐出来的结果,你可能还需要加工一下才能再给出去。其次,推理阶段有非常高的单次请求延迟要求,如果是用Python代码做特征处理的话,可能是没法满足响应延迟的。

我们举几个例子:

  1. 以实时特征,最近一小时用户的消费总额。算法同学如果是自己用 Python 写的一个逻辑,你就很难直接把用到线上预测中,基本上你肯定要用SQL、Java/C++ 改写下。
  2. 还有比如实现了一个 tf/idf 的特征算法,如果他没有写预测逻辑,那么研发是要自己写的。其次就算算法同学已经提供了一个预测的逻辑,但是这个逻辑也没办法保证性能。

那怎么解决这些痛点呢? 我这边给出几个大的指导原则,然后后续我们再看下 Byzer 和 OpenMLDB 是如何落地这几个指导原则的。

大的原则是:

  1. 使用 SQL 而不是 Python 去完成特征工程
  2. 尽可能减少 Python 的使用,Python 应该尽可能仅仅用于模型部分

先说这个原则带来的好处,再说说现在这个原则以前为什么没落地,最后我们再探讨我们现在是如何解决落地问题的。

先说说好处:

  1. SQL易于理解,不会像 Python 不同的人写出来的可读性完全不一样
  2. SQL 可以通过工程手段保证在实验阶段和工程阶段可移植,翻译的成本大幅度下降
  3. 从实验阶段到工程阶段能保证性能和吞吐
  4. 无需逻辑校验成本

说说落地的困难:

  1. SQL 可能无法完成非常复杂的特征处理逻辑
  2. Python 在某些时候在可视化亦或是特征处理上是不可避免的

这里值得注意的是,我们不是拒绝 Python 做特征工程,而是尽可能减少使用 Python 做特征工程,从而减少前面探讨的成本。

所以实际上解决方案也比较简单:

  1. SQL 应该是易于扩展的,从而满足越来越复杂的特征工程需求
  2. SQL 和 Python 可以应该可以做很好的融合,数据可以在 SQL 和 Python中自由流动

现在,我们来看看 Byzer + OpenMLDB 是怎么解决用 SQL 帮助用户解决特征工程落地问题的。

首先我们来看看 SQL 的表达力问题, Byzer 很大程度上提升了 SQL 的表达力,并且非常易于扩展。

下面使用 Byzer 做一个文本分类的工作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- load data
load parquet.`${rawDataPath}` as orginal_text_corpus;

-- select only columns we care
select feature,label from orginal_text_corpus as orginal_text_corpus;

-- feature enginere moduel
train zhuml_orginal_text_corpus  as TfIdfInPlace.`${tfidfFeaturePath}` 
where inputCol="content" 
and `dic.paths`="/data/dict_word.txt" 
and stopWordPath="/data/stop_words"
and nGrams="2";

-- use RandomForest
train zhuml_orginal_text_corpus as RandomForest.`/tmp/model` where
keepVersion="true" 
and evaluateTable="mock_data_validate"

and `fitParam.0.labelCol`="label"
and `fitParam.0.featuresCol`="features"
and `fitParam.0.maxDepth`="2"

and `fitParam.1.featuresCol`="features"
and `fitParam.1.labelCol`="label"
and `fitParam.1.maxDepth`="10"
;

这段小脚本脚本完成了数据加载,特征工程,最后的训练。其中所有

  1. 以train开头的,都是模块 ,用户可以自己扩展,从而提升 SQL的表达能力。
  2. 以select 开头的都是标准 SQL 处理逻辑
  3. 以load开头的则是各种数据源的加载

上边是模型训练阶段的代码,现在看看预测代码应该怎样的。在预测服务里执行如下两个代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
register TfIdfInPlace.`${tfidfFeaturePath}`  as tfidf;
register RandomForest.`/tmp/model` as model_predict;

此时,我们可以实现一个端到端的预测了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -XPOST 'http://127.0.0.1:9004/model/predict' -d 'dataType=row&sql=select vec_argmax(model_predict(vec_dense(tfidf(doc))))&data=[{"doc":"Byzer is cool"}]';

从上面的实力代码,我们可以看到

  1. 用户实验阶段在 Byzer Notebook 中编写的代码可以几乎毫无更改的迁移到生产环境里。
  2. 训练时的特征工程也可以几乎毫无更改的转化为 SQL 函数应用于 预测阶段

我们很完美的解决了前面提到的诸多问题,无需工程师翻译,无需算法和工程师进行复杂的逻辑校验,算法几乎可以自己走完完整路径。

此外, Byzer 支持实时书写 UDF 函数,比如执行如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
register ScriptUDF.`` as arrayLast 
where lang="scala"
and code='''def apply(a:Seq[String])={
      a.last
}'''
and udfType="udf";

马上就可以分别在模型训练和推理中使用这个函数,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select arrayLast(array("a","b")) as lastChar as output;

这意味着,很多无法使用原生SQL实现的一些特征工程,用户既可以将其包装成类似

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
TfIdfInPlace

这种模块,该模块会自动产生一个SQL UDF 供后续的预测推理使用,也可以自己编写一个 SQL UDF 函数,然后函数就可以在各个场景里使用了。

从这里看到,为了复用训练时的SQL代码, Byzer 的预测变成了组装一堆的SQL UDF 函数,无论是特征工程还是模型预测,都可以转化为一个个UDF 函数,而整个 Pipeline 则是通过 SQL 语句组装这些 UDF, 从而实现了非常好的复用。

而且这些 SQL 函数可以很方便的应用于批,流,API 等场景,参看这篇文章: 祝威廉:如何将Python算法模型注册成Spark UDF函数实现全景模型部署

当然,这里大家也发现了一个问题,如果我的特征是需要从实时数据中实时计算的怎么办?比如一条数据过来了后,我们还要获取一个额外的特征比如最近一小时的用户消费额,此时这个逻辑是可能无法通过一个事先定义好的亦或是来源于某个模块的 UDF 函数来完成的,此外 Byzer 可能在这种实时大规模计算上无法保证毫秒级的响应时间,这个时候就可以引入 OpenMLDB了,我们可以封装一个 UDF 函数调用 OpenMLDB 接口来完成特征的获取,而不是通过 Byzer 自身来完成计算,这样就能很好的覆盖大部分场景了。

接着我们来看和Python的融合,比如在做特征探索的时候,我们会使用Python做数据可视化,这个是SQL 不容易做到的,Python有非常多的可视化库。此外,我们前面也说了,模型我们还是需要使用 Python来做的,所以SQL处理的数据也要很好的能够和 Python 衔接。Byzer 也很好的解决了这个问题。

首先,Byzer 提供了多种形态的 Notebook,而且是以SQL为中心的,帮助算法同学高效率使用 SQL。

  1. Byzer Notebook (Web 版本)
  2. Byzer Desktop (桌面版本)
  3. Byzer Shell (命令行版本)

先来看可视化的问题,在 Byzer Notebook 中,我通过SQL 获取到了一张表 day_pv_uv:

接着我希望对这个 day_pv_uv 进行一个可视化,那我直接在下一个 Cell 里直接操作这个表的数据:

我们用用一行代码将SQL中的数据转化为 Pandas,然后使用 matplotlib 绘制,下面是绘制结果:

所以是非常方便的。

我们可以用相同的方式来获得数据去做算法模型(Byzer-python里支持分布式获取数据,诸如使用 pandas on dask等)。通过 Python 训练好的模型可以直接保存到数据湖

然后加载这个数据湖的模型,然后将模型注册成UDF 函数:

接着就可以在 SQL 中使用这个函数了:

最后我们来个总结, Byzer 事实上解决了使用 SQL 做特征工程的能力,这个能力不仅仅是完成,而是实现了实验阶段到工程阶段的无缝迁移,离线的特征到在线推理的特征的无缝衔接(当然,实际上 Byzer 也解决了机器学习模型的问题)。而能够使用 SQL 做特征工程,则可以很好的解决前面我们提到的种种问题,人天可能从10天缩短到一天,极大提升了AI落地的效率。配合 OpenMLDB, 可以很好的覆盖在线推理过程中实时大规模计算的特征生成问题。

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
大数据平台和AI平台应该如何整合
大数据和AI两者最核心的部分都是数据。大数据的主要工作是对数据进行各种转换和存储。而AI的主要工作是学习数据并且得出模型。 AI天然需要大数据的基础,因为AI需要各种形态的数据,而我们得到这些形态的数据,必然离不开大数据。就此而言,他们两个合在一起,才是一个完整的工作流。
用户2936994
2022/07/21
1.2K0
大数据平台和AI平台应该如何整合
[AI学习笔记]DeepSeek 在金融风控中的特征工程实践
在金融行业中,风险控制是保障业务稳健发展的核心环节。无论是信用卡审批、贷款发放,还是投资组合管理,精准的风险评估都依赖于高质量的数据特征。DeepSeek 作为一款强大的 AI 驱动平台,通过创新的特征工程实践,为金融风控提供了全新的解决方案。
数字扫地僧
2025/04/01
1750
[AI学习笔记]DeepSeek 在金融风控中的特征工程实践
想搞机器学习,不会特征工程?
引言 在之前学习机器学习技术中,很少关注特征工程(Feature Engineering),然而,单纯学习机器学习的算法流程,可能仍然不会使用这些算法,尤其是应用到实际问题的时候,常常不知道怎么提取特征来建模。 特征是机器学习系统的原材料,对最终模型的影响是毋庸置疑的。 特征工程的重要意义 数据特征会直接影响你使用的预测模型和实现的预测结果。准备和选择的特征越好,则实现的结果越好。 影响预测结果好坏的因素:模型的选择、可用的数据、特征的提取。 优质的特征往往描述了数据的固有结构。 大多数模型都可以通过数据中
用户1332428
2018/03/08
6920
想搞机器学习,不会特征工程?
Byzer + OpenMLDB, SQL Boy 也能玩好工业级机器学习
其实,原先 Byzer 就已经可以通过几乎不需要编程就能完成整个机器学习的Pipeline,从数据加载,清洗,特征工程,模型训练对外提供端到端的 API 服务。具体的能力可以参考这篇文章: Byzer 机器学习最简教程(无需Python!) 当然这个系列还有特征工程,深度学习等等介绍,感兴趣看看。
用户2936994
2022/07/21
5600
Byzer + OpenMLDB, SQL Boy 也能玩好工业级机器学习
MLSQL解决了什么问题
1、项目难以重现,可阅读性和环境要求导致能把另外一个同事写的python项目运行起来不得不靠运气
用户1332428
2018/07/30
8170
MLSQL解决了什么问题
在谈MLSQL解决了什么问题之前,我们先提一个“数据中台”的概念。什么是数据中台呢?数据中台至少应该具备如下三个特点:
用户2936994
2018/12/28
9240
算法训练和模型部署如何避免多次重写数据预处理代码
前段时间,我们对接算法的工程师哭丧的和我说,模型生成后一般都要部署成API的形态对外提供服务,但是算法工程师并没有提供如何将一条数据转化特征向量的方法,他能拿到的是代码逻辑以及一些“中间元数据”。数据预处理本来就复杂,翻译也是一件极其困难的事情。我解释了这件事情难以解决的原因,但是显然他还是有些失望。
用户1332428
2018/07/30
7720
实时特征计算平台架构方法论和实践
作者 | 卢冕,第四范式开源机器学习数据库 OpenMLDB PMC core member
深度学习与Python
2022/06/11
1.1K0
实时特征计算平台架构方法论和实践
MLSQL解决了什么问题
在谈MLSQL解决了什么问题之前,我们先提一个“数据中台”的概念。什么是数据中台呢?数据中台至少应该具备如下三个特点:
木东居士
2020/04/26
7640
MLSQL解决了什么问题
开源机器学习数据库OpenMLDB:线上线下一致的高可用特征平台
本文整理自SACC 2022中国系统架构师大会的演讲,分享嘉宾是第四范式 资深体系架构科学家张浩,他本次的演讲中介绍了OpenMLDB的应用场景、产品特点、技术架构。重点会介绍OpenMLDB如何通过高性能的内存索引数据结构、多副本机制,以及分布式处理能力,为机器学习高效供给数据。
用户6543014
2023/03/02
7940
开源机器学习数据库OpenMLDB:线上线下一致的高可用特征平台
如何基于 Byzer 使用深度学习快速开发一个图片分类应用
基于 Byzer, 算法工程师可以完全自己一个人就能快速制作和发布一个基于AI模型的应用。整个流程会包括:
用户2936994
2022/10/06
3650
如何基于 Byzer  使用深度学习快速开发一个图片分类应用
Byzer + OpenMLDB 实现端到端的,基于实时特征计算的机器学习流程
本文示范如何使用OpenMLDB和 Byzer-lang 联合完成一个完整的机器学习应用。Byzer-lang 作为面向大数据和AI的一门语言,通过 Byzer-Notebook 和用户进行交互,用户可以轻松完成数据的抽取,ETL,特征/模型训练,保存,部署到最后预测等整个端到端的机器学习流程。OpenMLDB在本例中接收Byzer发送的指令和数据,完成数据的实时特征计算,并经特征工程处理后的数据集返回Byzer,供其进行后续的机器学习训练和预测。
用户2936994
2022/10/27
1.1K0
风控领域特征工程
在金融行业,风险控制(风控)是核心环节,它关乎资产安全、合规性以及机构的长期稳健发展。随着大数据时代的到来,金融机构面临着前所未有的数据量和复杂性。在这样的背景下,风控领域特征工程应运而生,成为连接原始数据与精准风险评估的桥梁。
用户3578099
2024/08/20
4250
风控领域特征工程
《SQL赋能人工智能:解锁特征工程的隐秘力量》
在当今的科技发展进程中,人工智能(AI)已经成为推动各领域变革的核心驱动力。而在人工智能的庞大体系里,特征工程占据着举足轻重的地位,它是将原始数据转化为能够让模型有效学习的特征的关键环节。鲜有人深入探讨的是,结构化查询语言(SQL)作为一种强大的数据处理工具,在人工智能的特征工程中发挥着独特且关键的作用。本文将深入挖掘SQL在人工智能特征工程中的应用技巧,带您领略这一技术融合的奇妙之处。
程序员阿伟
2025/04/05
1200
《SQL赋能人工智能:解锁特征工程的隐秘力量》
Meta(Facebook) 第三代 Notebook Daiquery 与 Byzer Notebook 对比
今天无意看到一篇文章,叫做SQL Notebooks: Combining the power of Jupyter and SQL editors for data analytics,在这篇文章里, Meta 介绍了自己的第三代 notebook 产品 Daiquery, 正如标题大家看到的,它的核心理念从一个以 Python 为主的 Notebook 转化成了一个以 SQL 为主, Python 为辅的 Notebook。 我觉得这是一个正确的进化路线。
用户2936994
2022/05/08
8100
Meta(Facebook) 第三代 Notebook Daiquery 与 Byzer Notebook 对比
【转载】什么是特征工程?
  有这么一句话在业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。那特征工程到底是什么呢?顾名思义,其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用。通过总结和归纳,人们认为特征工程包括以下方面:
marsggbo
2019/02/14
9340
【转载】什么是特征工程?
干货|谷歌大规模机器学习:模型训练、特征工程和算法选择
关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第二 【Python】:排名第三 【算法】:排名第四 谷歌机器学习:实际应用技巧 什么是机器学习(ML)? 从概念上讲:给定(训练
昱良
2018/04/08
3.1K0
干货|谷歌大规模机器学习:模型训练、特征工程和算法选择
特征工程之数据预处理(上)
分别介绍了确定项目终极目标、选择损失函数、获取数据以及构建测试集,接下来在进入选择算法和训练模型之前,一个很重要的步骤就是特征工程,它包括了对数据的预处理、特征提取、特征分析以及特征构建等几个步骤,可以说能否训练一个好的模型,除了选择合适的算法,准备好数据也是非常关键的!
kbsc13
2019/08/16
7840
基于Spark的大规模推荐系统特征工程
导读:特征工程在推荐系统中有着举足轻重的作用,大规模特征工程处理的效率极大的影响了推荐系统线上的性能。第四范式作为国际领先的机器学习和人工智能技术与平台服务提供商,面向大规模特征工程问题开发了下一代离线在线一致性特征抽取引擎FESQL,针对AI场景支持SQL接口,兼容Spark 3.0同时提供高性能的Native执行引擎。本次分享题目为基于Spark的大规模推荐系统特征工程及优化,主要内容包括:
Spark学习技巧
2020/09/08
1.1K0
基于Spark的大规模推荐系统特征工程
基于Spark的大规模推荐系统特征工程
导读:特征工程在推荐系统中有着举足轻重的作用,大规模特征工程处理的效率极大的影响了推荐系统线上的性能。第四范式作为国际领先的机器学习和人工智能技术与平台服务提供商,面向大规模特征工程问题开发了下一代离线在线一致性特征抽取引擎FESQL,针对AI场景支持SQL接口,兼容Spark 3.0同时提供高性能的Native执行引擎。本次分享题目为基于Spark的大规模推荐系统特征工程及优化,主要内容包括:
石晓文
2020/09/07
1.3K0
基于Spark的大规模推荐系统特征工程
推荐阅读
相关推荐
大数据平台和AI平台应该如何整合
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验