
人工智能机器学习后端编译器【免费下载链接】sqlflowBrings SQL and AI together.项目地址https://gitcode.com/gh_mirrors/sq/sqlflow点击查看免费下载RNNBasedTimeSeriesModel 是 SQLFlow 模型库sqlflow_models中基于 RNN 结构实现的神经网络模型专门用于时间序列场景的数据预测给定过去 N 天的历史数据预测未来 N 天的变化趋势。本文将以 APP 流量PV/UV预测和 GEFCom2014 电力负荷预测两个场景为主线完整讲解该模型的输入数据格式、滑动窗口预处理 SQL、全部可调参数含业务参数与效果调优参数、验证集配置以及从训练到预测的端到端 SQLFlow 语句并结合仓库源码说明参数在运行时的解析与校验机制。模型概述RNNBasedTimeSeriesModel 采用循环神经网络Recurrent Neural NetworkRNN结构实现其模型定义位于 sqlflow_models 包的sqlflow_models/rnn_based_time_series.py中。它适用于根据过去一段时间的多个特征预测未来一段时间的数值趋势这一典型的回归任务例如APP 流量预测根据历史 PV/UV 数据预测未来几天的 PV电力负荷预测根据历史小时级负荷数据预测未来多个时间步的负荷。从 模型列表 的定位来看该模型属于数值预测类别可以基于过去一段时间的数据预测未来一段时间内的趋势用来预测一组基于时间序列的数值。同时该列表也给出了一些特性参考RNNBasedTimeSeriesModel 训练速度较慢且暂不支持图形化模型解释与大规模数据场景——这与 RNN 序列建模的计算特性相符选择模型时需要结合实际数据规模权衡。输入数据格式从原始时序表到滑动窗口原始数据时间序列场景的数据通常会存储在数据库系统中。下面是某 APP 的历史流量数据包含date_str日期、uv独立访客数、pv页面浏览量三个列| date_str | uv | pv | | -- | -- | -- | | 20200101 | 1 | 11 | | 20200102 | 2 | 12 | | 20200103 | 3 | 13 | | 20200104 | 4 | 14 | | 20200105 | 5 | 15 | | 20200106 | 6 | 16 | | 20200107 | 7 | 17 |滑动窗口转换RNN 模型需要按历史窗口 → 未来目标的样本结构进行学习因此原始逐日数据无法直接送入模型在开始训练/预测之前必须将上述原始数据处理为按行存储的滑动窗口数据。举例来说我们希望根据历史 3 天的 PV、UV 数据预测未来 2 天的 PV 数据预处理后的数据如下所示uv1/pv1表示第 1 天uv2/pv2表示第 2 天uv3/pv3表示第 3 天target为目标值| date_str | uv1 | pv1 | uv2 | pv2 | uv3 | pv3 | target | | -- | -- | -- | -- | -- | -- | -- | -- | | 20200101 | 1 | 11 | 2 | 12 | 3 | 13 | 14,15 | | 20200102 | 2 | 12 | 3 | 13 | 4 | 14 | 15,16 | | 20200103 | 3 | 13 | 4 | 14 | 5 | 15 | 16,17 |需要注意两个要点窗口参数与模型参数对应上例中历史 3 天对应模型参数model.n_in3预测未来 2 天对应model.n_out2使用的特征uv、pv个数对应model.n_features2。预处理时选择的窗口长度必须与训练、预测时设置的n_in/n_out保持一致。多输出目标需要拼接当n_out 1时目标列是未来多个时间步的数值需要把多个目标值拼接进同一列如上例中的14,15这是因为 SQL 的表结构是二维的一个样本的一行只能对应一个标量 label 列当n_out1时则不需要拼接。滑动窗口预处理的 SQL 程序见下文 数据预处理滑动窗口的 SQL 实现 一节。模型参数详解RNNBasedTimeSeriesModel 的参数按用途可以分为业务相关效果相关和模型验证三类全部通过 SQLFlow 扩展语法中的WITH子句传入形如model.n_in10。业务相关参数下列参数与业务场景密切相关需要密切关注| 参数 | 取值约束 | 含义 | | -- | -- | -- | |model.n_inN|N 1| 使用的 N 天历史数据即滑动窗口长度 | |model.n_outN|N 1| 预测未来 N 天的趋势 | |model.n_featuresN|N 1| 使用的特征个数。在上述 PV/UV 例子中因为使用了 PV、UV 两个特征所以此值为 2 |这三个参数决定了模型的输入输出维度每个样本输入形状为(n_in, n_features)输出为n_out个时间步的预测值。在 LSTMBasedTimeSeriesModel 参数说明 中也给出了同类的语义model.n_in输入的时间点个数、model.n_out输出的时间点个数。效果相关参数下列参数在调优效果时一般会用到| 参数 | 默认值 | 含义与调优建议 | | -- | -- | -- | |model.stack_units[128,256]|[128, 256]| 神经网络中隐层神经元的数量。通常增加神经元数量会使效果有所提升同时训练速度降低 | |train.epochsN|10| 完整数据集在神经网络中传递 N 次N 1。可以观察每个 epoch 的训练效果如果损失跨度较大可以调大此参数增加数据在神经网络中传递的次数直至效果收敛 | |train.batch_sizeN|8| 完整数据集如果不能一次性地通过整个网络时需要将其切成几个小的 batch每个 batch 包含 N 个样本N 1 |补充说明两点关于 epoch 参数的写法本文所依据的模型文档写作train.epochs而 GEFCom2014 能量预测教程 及运行时实现中实际使用的键名为train.epoch单数。从源码 python/runtime/step/tensorflow/train.py 可以看到运行时通过train_params.get(epoch, 1)提取该参数train_params.get(batch_size, 1)提取 batch sizetrain_params.get(verbose, 1)提取日志级别。写 SQL 时建议统一使用教程与源码中的train.epoch写法。隐层结构参数同样可以在训练语句中覆盖例如能量预测案例中使用了model.stack_units [500, 500]。模型验证参数| 参数 | 含义 | | -- | -- | |train.validationSELECT ...| 通过SELECT子句选取验证集。注意和训练集的列名、字段类型要保持一致 | |train.metricsMeanAbsoluteError, MeanAbsolutePercentageError, MeanSquaredError| 验证模型时使用的口径多个指标用逗号分隔 |三个指标的标准含义如下MeanAbsoluteError平均绝对误差MAE衡量预测值与真实值绝对偏差的平均水平MeanAbsolutePercentageError平均绝对百分比误差MAPE以百分比形式度量相对偏差MeanSquaredError均方误差MSE衡量预测值与真实值平方偏差的平均水平对大误差更敏感。从源码看验证指标在运行时会被解析为列表并传给 Keras 模型validation_metrics validation_params.get(metrics, Accuracy)随后按逗号切分并去空白见 python/runtime/step/tensorflow/train.py在 python/runtime/tensorflow/train_keras.py 中如果模型类定义了eval_metrics_fn会优先使用模型自带的评估函数否则使用WITH子句中指定的指标。训练结束后验证集上的指标会被写入model_meta[evaluation]见 python/runtime/tensorflow/train_keras.py供训练完成后的结果查看使用。命名约定的重要提示本文档使用train.validation/train.metrics作为参数前缀而能量预测教程与运行时源码实际采用的是validation.select/validation.metrics前缀如validation.select SELECT ... FROM energy.val、validation.metrics MeanAbsoluteError,MeanSquaredError。从参数校验机制下文参数解析与校验来看SQLFlow 对model.*、train.*、validation.*三类前缀都做了通配支持因此在实际使用中请以validation.select与validation.metrics为准并保持与训练语句中列名、字段类型一致。源码视角参数如何被解析与校验SQLFlow 服务端在生成训练任务时会把WITH子句中的键值对解析为属性字典再做校验。关键实现在 go/attribute/attribute.goValidate方法遍历属性字典如果某个键未在模型的参数文档中显式定义会尝试将键按.拆成两部分并匹配model.*、train.*、validation.*这类通配符定义从而允许用户在model、train、validation三个命名空间下自由扩展参数若仍匹配不到则报不支持的属性错误。数值型参数还可以挂接范围校验器见 go/attribute/checker.go如IntRangeChecker、IntLowerBoundChecker用来约束n_in 1这类取值条件。整个链路可以概括为WITH子句 →generateAttributeIR生成属性 IRgo/ir/ir_generator.go→ 服务端校验 → 生成训练 step → Python 运行时按前缀提取model_params/train_params/validation_params并交给 Keras 执行python/runtime/step/tensorflow/train.py。数据预处理滑动窗口的 SQL 实现基于 LEAD 窗口函数的滑动窗口使用LEAD窗口函数是生成滑动窗口最直观的方式。以历史 3 天预测未来 2 天为例将原始表app_traffic转换为训练表tmp_trainCREATE TABLE tmp_train AS SELECT date_str, uv AS uv1, pv AS pv1, LEAD(uv, 1) OVER (ORDER BY date_str) AS uv2, LEAD(pv, 1) OVER (ORDER BY date_str) AS pv2, LEAD(uv, 2) OVER (ORDER BY date_str) AS uv3, LEAD(pv, 2) OVER (ORDER BY date_str) AS pv3, CONCAT_WS(,, LEAD(pv, 3) OVER (ORDER BY date_str), LEAD(pv, 4) OVER (ORDER BY date_str)) AS target FROM app_traffic;其中LEAD(col, k) OVER (ORDER BY date_str)取当前行之后第 k 行的列值LEAD(uv, 1)即下一天的 uv以此类推目标列target用CONCAT_WS(,)将未来第 3 天、第 4 天的pv拼接为逗号分隔的字符串对应n_out2的多步输出由LEAD的特性可知最后几行会因窗口越界产生NULL训练前需要按实际需求过滤。MySQL 用户变量实现滞后列MySQL 早期版本对窗口函数支持有限能量预测教程 中给出了一种用用户变量模拟 Lag 函数的实现通过 13 个中间变量lagfield0到lagfield13逐列错位传递上一行的值从而构造长度为 14n_in10输入 n_out4输出的序列行最后用where k.col_1 is not null过滤掉头部窗口不完整的行。具体语句如下drop table if exists energy.con_all; create table energy.con_all as select * from( select t.dt, lagfield0: lagfield1 as col_1, lagfield1: lagfield2 as col_2, lagfield2: lagfield3 as col_3, lagfield3: lagfield4 as col_4, lagfield4: lagfield5 as col_5, lagfield5: lagfield6 as col_6, lagfield6: lagfield7 as col_7, lagfield7: lagfield8 as col_8, lagfield8: lagfield9 as col_9, lagfield9: lagfield10 as col_10, lagfield10: lagfield11 as col_11, lagfield11: lagfield12 as col_12, lagfield12: lagfield13 as col_13, lagfield13: energy as energy from energy.normalized t,( select lagfield0: null, lagfield1: null, lagfield2: null, lagfield3: null, lagfield4: null, lagfield5: null, lagfield6: null, lagfield7: null, lagfield8: null, lagfield9: null, lagfield10: null, lagfield11: null, lagfield12: null, lagfield13: null ) init ) k where k.col_1 is not null;教程还提醒重构出的序列列需要统一转换为float类型alter table ... modify column col_1 float;以避免后续训练阶段出现类型错误。数据缩放与数据集切分RNN 对输入数值范围敏感教程在重构序列之前先对原始负荷数据做了min-max 归一化将数据缩放到 (0, 1) 区间create table energy.normalized as select dt, (energy - (select min(ta.energy) from energy.raw as ta)) / ((select max(ta.energy) from energy.raw as ta) - (select min(ta.energy) from energy.raw as ta)) as energy from energy.raw;注意归一化必须在重构序列数据之前完成否则窗口内数值会失真预测完成后还需反归一化还原到原始量纲见下文预测部分。归一化、重构完成之后将数据集按 7:2:1 的比例切分为训练集、验证集和测试集本教程中分别为 0~1537、1537~1976、1976~2196 行drop table if exists energy.train; create table energy.train as select * from energy.con_all limit 0, 1537; drop table if exists energy.val; create table energy.val as select * from energy.con_all limit 1537, 1976; drop table if exists energy.test; create table energy.test as select * from energy.con_all limit 1976, 2196;训练集用于拟合模型验证集用于每个 epoch 之后评估模型、防止过拟合测试集用于模型训练完成后的最终预测。完整训练语句将上述数据准备工作做完后即可用 SQLFlow 扩展语法发起训练。以能量预测案例n_in10、n_out4为例完整的训练语句如下SELECT col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_10, concat(col_11, ,, col_12, ,, col_13, ,, energy) as class FROM energy.train TO TRAIN sqlflow_models.RNNBasedTimeSeriesModel WITH model.n_in10, model.stack_units [500, 500], model.n_out4, model.model_typelstm, validation.select SELECT col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_10, concat(col_11, ,, col_12, ,, col_13, ,, energy) as class FROM energy.val, train.batch_size10, train.verbose1, train.epoch30, validation.metrics MeanAbsoluteError,MeanSquaredError LABEL class INTO sqlflow_models.my_lstmts_model;逐段解读SELECT 部分取出 10 个历史输入列col_1~col_10并用concat(col_11, ,, col_12, ,, col_13, ,, energy)把未来 4 个时间步的目标值拼接成一个 label 列class。因为该任务是多输出回归必须做此拼接若n_out1则直接取目标列即可无需拼接。TO TRAIN 子句指定模型sqlflow_models.RNNBasedTimeSeriesModel。WITH 子句设置业务参数model.n_in、model.n_out、模型结构model.stack_units [500, 500]、model.model_typelstm指定使用 LSTM 单元、验证集validation.select其列名与类型必须和训练集一致以及训练超参train.batch_size、train.verbose、train.epoch和验证指标validation.metrics。LABEL 子句显式声明class列为标签列。INTO 子句指定保存训练后模型的名称sqlflow_models.my_lstmts_model。预测流程发起预测模型训练完成后用TO PREDICTUSING对测试集做预测。预测数据的 SELECT 部分必须与训练时保持相同的列结构与拼接方式SELECT col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_10, concat(col_11, ,, col_12, ,, col_13, ,, energy) as class FROM energy.test TO PREDICT energy.predict_lstmts_test.class USING sqlflow_models.my_lstmts_model;其中TO PREDICT energy.predict_lstmts_test.class声明预测结果写入energy.predict_lstmts_test表的class列USING指定训练好的模型。从源码 python/runtime/tensorflow/predict.py 可以看到多输出预测结果会被flatten()后以逗号拼接成字符串写入结果列——这与训练阶段用concat拼接 label 的方式是前后呼应的。拆分多输出列预测结果表的class列是一列包含多段数据的逗号分隔字符串。为了还原成每个时间步单独的列可以用SUBSTRING_INDEX拆分drop table if exists energy.predict_lstmts_split; create table energy.predict_lstmts_split as SELECT SUBSTRING_INDEX(class, ,, 1) as y_pred1 , SUBSTRING_INDEX(SUBSTRING_INDEX(class, ,, 2), ,, -1) as y_pred2 , SUBSTRING_INDEX(SUBSTRING_INDEX(class, ,, 3), ,, -1) as y_pred3 , SUBSTRING_INDEX(SUBSTRING_INDEX(class, ,, 4), ,, -1) as y_pred4 from energy.predict_lstmts_test;反归一化还原量纲由于训练前数据被缩放到 (0, 1) 区间预测结果也处于该区间。要得到与原始数据同一量纲的预测值需要利用训练时记录的min/max做反归一化select y_pred1 * ((select max(energy) from energy.raw) - (select min(energy) from energy.raw)) (select min(energy) from energy.raw) as y_pred1_raw , y_pred2 * ((select max(energy) from energy.raw) - (select min(energy) from energy.raw)) (select min(energy) from energy.raw) as y_pred2_raw , y_pred3 * ((select max(energy) from energy.raw) - (select min(energy) from energy.raw)) (select min(energy) from energy.raw) as y_pred3_raw , y_pred4 * ((select max(energy) from energy.raw) - (select min(energy) from energy.raw)) (select min(energy) from energy.raw) as y_pred4_raw from energy.predict_lstmts_split limit 100;应用案例GEFCom2014 电力负荷预测完整的端到端示例参见 GEFCom2014 Energy Forecasting 教程。该教程使用 GEFCom2014 全球能源预测竞赛的电力负荷数据2014-10-01 至 2014-12-31 的逐小时负荷完整演示了用标准 SQL 预览数据与统计行数 → min-max 归一化 → 用 MySQL 用户变量重构 14 步序列 → 列类型转换 → 7:2:1 切分数据集 → 用RNNBasedTimeSeriesModelLSTM 单元n_in10、n_out4、stack_units[500,500]训练 → 对测试集预测 → 拆分多输出列 → 反归一化还原负荷量纲的全流程。如果希望进一步了解同类 LSTM 时间序列模型在 SQLFlow 中的参数定义可参考 models.md 中 LSTMBasedTimeSeriesModel 一节。使用建议与注意事项窗口与参数对齐滑动窗口预处理时选择的n_in/n_out必须与训练、预测语句中model.n_in/model.n_out完全一致否则输入张量形状不匹配会直接报错。列一致性验证集validation.select与预测集的 SELECT 列名、字段类型必须和训练集保持一致预处理后的序列列建议统一转为float类型。参数命名运行时以validation.select、validation.metrics、train.epoch等键名为准详见 train.py 参数提取历史文档中的train.validation、train.epochs写法在新版本中请按教程统一。归一化时机数据缩放必须在滑动窗口重构之前完成预测后必须用同一组 min/max 反归一化才能得到可解释的原始量纲结果。能力边界根据 模型列表该模型训练速度较慢且不支持图形化模型解释、不适合大规模数据场景调优时优先关注stack_units、epoch、batch_size与验证指标的组合观察每个 epoch 的收敛情况再决定是否加大训练轮数。赞分享人工智能机器学习后端编译器【免费下载链接】sqlflowBrings SQL and AI together.项目地址https://gitcode.com/gh_mirrors/sq/sqlflow点击查看免费下载相关推荐mybatis-generator-gui-extension 命名管理最佳实践表前缀去除、对象重命名与后缀定制指南mybatis generator gui extension 命名管理最佳实践表前缀去除、对象重命名与后缀定制指南 mybatis generator guEFAK-AI社区贡献指南如何参与这个优秀的开源项目EFAK AI社区贡献指南如何参与这个优秀的开源项目 EFAK AI Eagle For Apache Kafka AI Enhanced是一款开源的Ka后端运维大模型PatchTST基于Transformer的长期时间序列预测模型PatchTST基于Transformer的长期时间序列预测模型 PatchTSTPatch Time Series Transformer是一种创新的时人工智能深度学习机器学习预训练微调上一篇Cilium 的 Slim Kubernetes 结构pkg/k8s/slim 精简客户端的设计原理、更新方法与维护陷阱下一篇LitGPT 权重转换实战将微调后的 LitGPT 模型导出为 Hugging Face Transformers 格式创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考