三分类与预测)
人工智能机器学习后端编译器【免费下载链接】sqlflowBrings SQL and AI together.项目地址https://gitcode.com/gh_mirrors/sq/sqlflow点击查看免费下载本文以 SQLFlow 官方教程 doc/tutorial/iris-dnn.md 为骨架结合仓库源码展开介绍如何用一条带扩展语法的 SQL 语句在 Iris 数据集上训练 DNN 分类模型、手动与自动调优并完成预测。读完本文你将掌握 SQLFlow 训练语句的完整写法TO TRAIN/WITH/COLUMN/LABEL/INTO、超参数调优思路以及从数据表到模型的端到端实战能力。SQLFlow 的核心主张是让 SQL 和 AI 走到一起Brings SQL and AI together用户在熟悉的 SQL 语句后追加模型训练子句SQLFlow 就会把整条语句翻译成等价的 Python 程序去执行无需手写训练代码。Iris鸢尾花数据集因为规模小、维度低、类别清晰一直是验证这一能力最典型的入门案例。本教程将用它走完训练 → 调优 → 自动调优 → 预测的完整链路。数据集Iris 的表结构、准备方式与数据预览Iris 数据集包含四个特征表征鸢尾花的植物学形态和一个标签表示鸢尾花的亚种。四个特征均为浮点数标签为整数取值为 0、1、2分别对应山鸢尾Iris setosa、杂色鸢尾Iris versicolor和维吉尼亚鸢尾Iris virginica。列名数据类型描述sepal_lengthfloat花萼长度cm特征sepal_widthfloat花萼宽度cm特征petal_lengthfloat花瓣长度cm特征petal_widthfloat花瓣宽度cm特征classint亚种类别0, 1, 2标签在 SQLFlow 官方镜像中Iris 数据集被预先装载到iris.train和iris.test两张表中分别作为训练集和测试集。你可以在仓库的 doc/datasets/popularize_iris.sql 中看到完整的建表与数据装载 SQL它创建了iris.train约 120 行样本与iris.test10 行样本两张表字段类型与上表完全一致。在 Jupyter Notebook 中%%sqlflow是 SQLFlow 的 magic 指令。运行以下标准 SQL 即可快速查看数据结构与样例数据%%sqlflow describe iris.train;%%sqlflow select * from iris.train limit 5;SELECT子句指定了训练数据来源它完全遵循 ANSI SQL 标准意味着你既可以直接SELECT * FROM iris.train也可以像SELECT * FROM iris.train WHERE class2这样用WHERE过滤样本——这一点在仓库的端到端测试 go/cmd/sqlflowserver/e2e_common_cases.go 中被反复验证。训练编写第一条 SQLFlow 训练语句训练语句的整体结构SQLFlow 的扩展语法把训练过程嵌入标准 SQL 中。完整的训练语句由 select、train、column、label 和 into 五类子句组成语法定义见 doc/language_guide.mdSELECT select_expr [, select_expr ...] FROM table_references [WHERE where_condition] [LIMIT row_count] TO TRAIN model_identifier [WITH model_attr_expr [, model_attr_expr ...] [, train_attr_expr ...]] COLUMN column_expr [, column_expr ...] [LABEL label_expr] INTO table_references;本教程要训练的是一个三分类的DNNClassifier包含两个隐藏层、每层 10 个节点。通过训练子句可以很容易地指定模型结构TO TRAIN DNNClassifier WITH model.n_classes 3, model.hidden_units [10, 10]TO TRAIN DNNClassifier指定模型类型。这里的DNNClassifier是 TensorFlow 预置的 Estimator 模型SQLFlow 在代码生成时会将它直接映射为tensorflow.estimator.DNNClassifier见 go/codegen/tensorflow/template_train.go 中from tensorflow.estimator import (DNNClassifier, ...)的导入逻辑。model.n_classes 3类别总数Iris 是三分类问题。model.hidden_units [10, 10]每个隐藏层的神经元个数[10, 10]表示 2 个隐藏层、每层 10 个神经元。用 COLUMN 与 LABEL 显式指定特征和标签SQLFlow 支持两种特征指定方式显式指定用COLUMN子句列出特征列、LABEL子句指定标签列COLUMN sepal_length, sepal_width, petal_length, petal_width LABEL class自动推断省略COLUMN子句让 SQLFlow 根据数据库字段类型自动推断合适的特征列。根据 doc/language_guide.md如果字段类型是 float就会被自动作为数值型特征列使用如果字段是 CSV 格式的整数数组如1,39,82,29则会被当作 embedding 特征列处理。本教程采用显式方式语义更清晰。值得一提的是SQLFlow 的扩展语法中字段名可能与关键字冲突。例如若表中有名为label的字段需要用双引号包裹LABEL label以规避解析错误。INTO 子句把模型保存到数据库表INTO sqlflow_models.my_dnn_model指定模型保存位置。训练结束后训练好的 DNN 模型会被存入sqlflow_models库中的my_dnn_model表——模型以表的形式落库这也是 SQLFlow模型即表设计思路的体现后续预测时可以直接USING这个表引用模型。完整训练语句把以上片段拼起来就是第一条完整的 SQLFlow 训练语句%%sqlflow SELECT * FROM iris.train TO TRAIN DNNClassifier WITH model.n_classes 3, model.hidden_units [10, 10], train.epoch 10 COLUMN sepal_length, sepal_width, petal_length, petal_width LABEL class INTO sqlflow_models.my_dnn_model;说明第一行的%%sqlflow是 Jupyter Notebook 的 magic 指令如果使用 SQLFlow 命令行或其他客户端则不需要这一行。参数前缀的含义model. / train. / validation. / optimizer.上述WITH子句中的参数并非平铺而是按前缀分组的。从 go/codegen/tensorflow/codegen.go 的CategorizeAttributes函数可以看到SQLFlow 会把参数划分为三类model.*模型结构参数如model.hidden_units、model.n_classes最终传入模型的构造函数train.*训练过程参数如train.epoch、train.batch_size、train.max_stepsvalidation.*验证参数如validation.select指定验证集、validation.metrics、validation.steps。此外还有optimizer.*如optimizer.learning_rate这类优化器参数它们在constructOptimizers函数中被收集并拼装成 Python 优化器对象。下面是常用训练参数及其默认值与含义依据 go/codegen/tensorflow/codegen.go 中commonAttributes的定义参数默认值说明train.batch_size1训练 batch size范围 [1, ∞)train.epoch1训练轮数范围 [1, ∞)train.verbose0训练日志级别可取 0、1、2train.max_steps0最大训练步数0 表示不限制train.save_checkpoints_steps100保存 checkpoint 的间隔步数train.log_every_n_iter10每隔多少轮迭代打印一次日志validation.select验证集 SQL例如SELECT * FROM iris.testvalidation.metricsAccuracy训练与评估时使用的指标如Accuracy,AUCvalidation.steps1验证步数训练输出与首次效果评估上述训练语句通常几分钟内可以跑完SQLFlow 的典型输出如下{accuracy: 0.4, average_loss: 1.0920922, loss: 1.0920922, global_step: 1100}如你所见这条训练语句的平均 loss 并不理想——对 Iris 数据集而言较理想的平均 loss 一般应小于 0.4。这引出了机器学习工作流中最关键也最耗时的一环模型调优。模型调优从网络宽度到学习率在机器学习中超参数hyperparameter是指学习过程开始前就可以设定的参数与之相对其他参数如网络权重是在训练过程中学到的。根据万能近似理论Universal approximation theoremDNNClassifier这类多层前馈网络只要具备足够强的结构就有潜力逼近任意函数。因此第一个优化方向就是增强网络结构。第一轮调优增大 hidden_units前馈网络的宽度对拟合能力影响很大。把每个隐藏层的节点数从 10 提升到 100%%sqlflow SELECT * FROM iris.train TO TRAIN DNNClassifier WITH model.n_classes 3, model.hidden_units [100, 100], train.epoch 10 COLUMN sepal_length, sepal_width, petal_length, petal_width LABEL class INTO sqlflow_models.my_dnn_model;运行后 loss 显著下降缩小了近 50%{accuracy: 0.72, average_loss: 0.5695601, loss: 0.5695601, global_step: 1100}不过 DNN 的表达能力极高对 Iris 这样的小数据集而言还有不少改进空间。第二轮调优调大学习率优化器及其学习率可能是 DNN 中最为关键的超参数。DNNClassifier默认使用 AdaGrad 优化器默认学习率为 0.001。这一默认值在 SQLFlow 的代码生成逻辑中也有对应实现在 go/codegen/tensorflow/codegen.go 的setDefaultOptimizer函数中DNN 模型的默认优化器被硬编码为Adagrad而在 Keras 运行时 python/runtime/tensorflow/train_keras.py 的keras_compile中当用户未在WITH子句指定优化器时默认使用tf.keras.optimizers.Adagrad(lr0.001)。理论上在神经元不死亡dying neuron problem的前提下AdaGrad 的学习率可以尽量调大实践中略微调大 AdaGrad 的学习率往往能带来效果提升。把学习率调到默认值的 10 倍%%sqlflow SELECT * FROM iris.train TO TRAIN DNNClassifier WITH model.n_classes 3, model.hidden_units [100, 100], optimizer.learning_rate0.1, train.epoch 10 COLUMN sepal_length, sepal_width, petal_length, petal_width LABEL class INTO sqlflow_models.my_dnn_model;结果改善明显{accuracy: 0.98, average_loss: 0.10286382, loss: 0.10286382, global_step: 1100}这里optimizer.learning_rate0.1的写法值得展开说明SQLFlow 会把optimizer.*前缀的参数收集起来拼装成 Python 优化器对象的构造代码。在 go/codegen/tensorflow/codegen.go 的constructOptimizers中optimizer.learning_rate会被转换成Adagrad(learning_rate0.1)这样的 Python 代码再通过eval生成优化器实例传入模型见 go/codegen/tensorflow/template_train.go 中model_params_constructed[optimizer_arg] eval(...)的调用。实际上调参在机器学习工作中的重要性非常高通常会占据整条链路中最多的工时。如果你觉得手动调参枯燥费时AutoML 技术可以作为一个替代方案。自动调优用 AutoClassifier 替代手动调参SQLFlow 通过特定 Estimator 提供了基于神经架构搜索NASNeural Architecture Search的自动调优能力。只需把DNNClassifier换成sqlflow_models.AutoClassifier就不需要再手动指定网络结构——hidden_units会在WITH子句中省略因为AutoClassifier会自动搜索合适的网络架构而默认学习率也能应付大部分情况。%%sqlflow SELECT * FROM iris.train TO TRAIN sqlflow_models.AutoClassifier WITH model.n_classes 3, train.epoch 10 COLUMN sepal_length, sepal_width, petal_length, petal_width LABEL class INTO sqlflow_models.my_dnn_model;由于AutoClassifier需要搜索最合适的网络架构运行时间会比之前的语句更久。运行结束后输出类似{accuracy: 0.98, average_loss: 0.08678584, loss: 0.08678584, global_step: 1000}这个结果看起来与手动调优的结果非常接近但因为DNNClassifier和AutoClassifier的训练过程都带有随机性你自己运行得到的结果可能略有差异平均 loss 可能稍大或稍小。从源码可以印证AutoClassifier在 SQLFlow 中的真实地位go/modelzooserver/add_default_model_defs.go 将sqlflow_models.AutoClassifier列为官方模型仓库中的默认模型定义之一go/cmd/sqlflowserver/e2e_common_cases.go 的端到端测试用例中有专门针对它的训练与解释验证TO TRAIN sqlflow_models.AutoClassifier WITH model.n_classes 3训练后还能用TO EXPLAIN sqlflow_models.my_adanet_model对模型做可解释性分析。SQLFlow 项目组计划在未来支持更多的 NAS 模型同时也计划支持自动超参搜索HPO即 automatic hyperparameter tuning等其他 AutoML 技术。预测一行 SQL 完成模型推理SQLFlow 开箱即用地支持预测。和训练语句一样用标准 SQL 语句SELECT * FROM iris.test指定预测数据。如果想用之前训练并存放在sqlflow_models.my_dnn_model的模型预测iris.test中的数据并把预测结果写入iris.predict表的class列完整的预测语句如下%%sqlflow SELECT * FROM iris.test TO PREDICT iris.predict.class USING sqlflow_models.my_dnn_model;这条语句的语义拆解SELECT * FROM iris.test指定预测数据TO PREDICT iris.predict.class指定结果写入目标表iris.predict的目标列classUSING sqlflow_models.my_dnn_model指定使用训练阶段保存的模型。一个必须遵守的约束TO PREDICT前的SELECT语句产生的数据 schema 必须与TO TRAIN前的SELECT一致这样才能保证预测数据的特征与训练时的特征完全对应这一要求同样适用于TO EXPLAIN见 doc/language_guide.md。从底层实现看python/runtime/tensorflow/predict.py 的pred函数预测阶段 SQLFlow 会先根据训练语句恢复模型结构与特征列定义加载已保存的模型权重然后以 batch_size1 逐行推理将结果写回目标表。对于分类模型取各类别概率中最大者argmax作为最终类别输出回归模型则直接输出预测值。预测语句运行结束后可以用标准 SQL 查看预测结果%%sqlflow SELECT * FROM iris.predict LIMIT 5;延伸阅读想要全面了解训练、预测、解释语句的完整语法定义可阅读 doc/language_guide.md想了解 SQLFlow 支持的所有模型及其可配置参数如model.batch_norm、model.dropout、model.optimizer等可查阅 doc/sqlflow.org_cn/models.md想亲手在本地重现本教程的数据集可直接执行 doc/datasets/popularize_iris.sql 完成建表与数据装载想在 MySQL 上运行 SQLFlow 并复现本教程的训练与预测可参考 doc/run_with_mysql.md 与 doc/quick_start.md若想深入了解 SQLFlow 如何把上述 SQL 翻译成 Python 程序可从 go/codegen/tensorflow/codegen.go 与 go/codegen/tensorflow/template_train.go 入手。以上就是用 SQLFlow 完成 Iris 分类任务的完整流程从建表装载数据到编写TO TRAIN训练语句再到通过hidden_units与optimizer.learning_rate手动调优、用AutoClassifier自动调优最后用TO PREDICT完成推理。整个过程不需要手写任何 Python 训练代码这正是 SQLFlow 把 SQL 和 AI 结合在一起的直接体现。赞分享人工智能机器学习后端编译器【免费下载链接】sqlflowBrings SQL and AI together.项目地址https://gitcode.com/gh_mirrors/sq/sqlflow点击查看免费下载相关推荐TensorFlow 1.x 预置 Estimator 实战用 DNNClassifier 完成鸢尾花三分类TensorFlow 1.x 预置 Estimator 实战用 DNNClassifier 完成鸢尾花三分类 本指南以 TensorFlow 1.x本仓库文档开发工具教程SQLFlow 实战用 Titanic 数据集训练 DNNClassifier 并预测乘客生还SQLFlow 实战用 Titanic 数据集训练 DNNClassifier 并预测乘客生还 本篇技术指南以 SQLFlow 仓库中的 Titanic DN人工智能机器学习后端编译器SQLFlow 信用卡欺诈检测实战用 SQL 完成 DNN 分类的完整流程训练 · 预测 · 解释SQLFlow 信用卡欺诈检测实战用 SQL 完成 DNN 分类的完整流程训练 · 预测 · 解释 本篇教程以 Kaggle 信用卡欺诈数据集为例演示如人工智能机器学习后端编译器上一篇如何3步配置Citra模拟器从模糊到高清的游戏体验升级指南下一篇GHelper技术解析华硕笔记本性能调优的轻量级控制解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考