SQLFlow|让AI造福金融,支付宝端到端AI系统SQLFlow实践( 四 )


SQLFlow 为快速构建AI任务提供了足够的模型弹药库 。 使用 ModelZoo 框架 , 算法开发可以将模型贡献成公开的模型 , 让更多的 SQLFlow 用户享受便利 , 也可以定向地分享给部分用户 , 保证模型的安全使用不泄密 。 基于模型库 , 业务同学可以直接使用 SQL 语句引用模型库中的模型 , 探索业务应用 , 发布业务应用;算法同学可以更加专注于提升模型效果、开发、更新模型的工作上面 。 这样不仅可以减少沟通成本 , 也可以提升工作成果的复用能力 。
另外 , Model Zoo 平台的代码也是完全开源的 。 用户完全可以在公司内部搭建自己的 Model Zoo 并且只在公司内分享模型 。 同时 , 用户可以连接到公开 Model Zoo 获取或者贡献新的模型 。 这样不便于对外公布的 , 和业务场景强绑定的一些模型 , 就可以在公司内逐步沉淀 , 构建公司自己的核心算法库 。
应用 SQLFlow 的场景案例 下面 , 我们结合一些蚂蚁的实际场景 , 解释SQLFlow 在实际业务应用中的使用方法 。
第一个例子是资金流入流出预测 。 我们这里展示的是使用天池的公开数据集 , 其实蚂蚁内部的业务也在使用相同的方法 。 这个数据集包含了资金的申购 , 赎回在一段时间内的详情(脱敏) , 我们需要预测未来时间内资金申购、赎回的量 。

SELECT time, purchase FROM fund.train
TO TRAIN sqlflow_models.ARIMAWithSTLDecomposition
WITH model.order=[7, 0, 2],
model.period=[7, 30],
model.date_format="%[2]s",
model.forecast_start='2014-09-01',
model.forecast_end='2014-09-30'
LABEL purchase
INTO purchase_predict_model;
在示例SQL语句中 , 我们使用了模型 sqlflow_models.ARIMAWithSTLDecomposition 应对此类场景 。 ARIMAWithSTLDecomposition 模型在金融领域有较为广泛的应用 , 该模型将输入的时间序列数据自动的提取不同时间窗口的周期性特征构建模可以获得比较好的结果 。 另外 , SQLFlow也提供了基于LSTM的深度学习模型用于训练时间序列模型 。
因为此数据集数据量不大 , 这个训练任务可以在一台机器上完成训练 。 此模型训练之后可以达到MAPE 5%的表现 。
第二个例子是较为复杂的场景 , 使用SQLFlow构建点击率预估模型 。 我们以kaggle的一个开源数据集 (https://www.kaggle.com/c/criteo-display-ad-challenge/data) 为例 , 蚂蚁在类似的场景中 , 也会使用同样的方法构建模型 。 这个数据集中 , 列 l1~l13 是脱敏之后的连续值特征 , c1~c26列是离散类别特征 , 离散类别特征存储为hash string 。
SELECT label,COALESCE(NULLIF(l1, ''),0) AS ll1,COALESCE(NULLIF(l2, ''),0) AS ll2,
COALESCE(NULLIF(l3, ''),0) AS ll3,COALESCE(NULLIF(l4, ''),0) AS ll4,COALESCE(NULLIF(l5, ''),0) AS ll5,
COALESCE(NULLIF(l6, ''),0) AS ll6,COALESCE(NULLIF(l7, ''),0) AS ll7,COALESCE(NULLIF(l8, ''),0) AS ll8,
COALESCE(NULLIF(l9, ''),0) AS ll9,COALESCE(NULLIF(l10, ''),0) AS ll10,COALESCE(NULLIF(l11, ''),0) AS ll11,
COALESCE(NULLIF(l12, ''),0) AS ll12,COALESCE(NULLIF(l13, ''),0) AS ll13,C*
FROM alifin_jtest_dev.sqlflow_ctr_train_raw
TO TRAIN DNNLinearCombinedClassifier
WITH model.dnn_hidden_units=[64,32], train.batch_size=32, validation.throttle_secs=300
COLUMN NUMERIC(“^ll[0-9]+$”, 1) FOR linear_feature_columns
COLUMN EMBEDDING(CATEGORY_HASH(“^C[0-9]+$”, 100), 8, "sum") FOR dnn_feature_columns
LABEL 'label'
INTO my_ctr_model;
我们可以使用以上的 SQL 语句描述训练一个「Deep and Wide」模型 , 将l1~l13列作为模型的线性部分的输入 , 将c1~c26特征作为模型的dnn部分输入 。 其中 COLUMN 语句分别可以使用正则表达式指定哪些些列作为模型哪部分的输入 。 我们将离散特征通过 HASH 分桶 , 然后增加 embedding 层的方法 , 将原始字符串特征输入传递给模型 。 注意这条 SQL 语句同时也可以包含部分预处理功能 , 使用COALESCE 函数填充l1~l13列中的缺失值 。
在蚂蚁点击率预估实际任务中 , 我们通常会有很多的预处理SQL语句 , 获得这张训练数据表 , 然后将训练数据再切分成训练集和验证集 , 再使用SQLFlow进行训练 。 这些步骤在蚂蚁都是使用MaxCompute 的 SQL 语句编写的 。 所以整个点击率预估应用 , 从预处理到训练只需要编写一段 SQL 语句即可 。 不同于其他图形化平台 , SQL 程序也可以存入代码仓库 , 方便code review 。


推荐阅读