资讯详情

SQLFlow 实战:用 SQL 训练 DNN 分类器对 Iris 鸢尾花数据集进行分类

📅 2026/10/13 2:42:37 | 华诺云谱 👁 阅读
SQLFlow 实战:用 SQL 训练 DNN 分类器对 Iris 鸢尾花数据集进行分类
人工智能机器学习后端编译器【免费下载链接】sqlflowBrings SQL and AI together.项目地址https://gitcode.com/gh_mirrors/sq/sqlflow点击查看免费下载本文是一篇面向 SQLFlow 初学者的实战教程完整演示如何在 SQLFlow 中借助扩展 SQL 语法对经典的 Iris鸢尾花数据集完成 DNNClassifier 模型的训练、超参数手动调优、基于 NAS 的自动调优以及用训练好的模型对新数据进行预测。读完本文你将掌握 SQLFlow 训练语句的核心子句TO TRAIN、WITH、COLUMN、LABEL、INTO和预测语句TO PREDICT的完整用法并了解这些语句在 SQLFlow 源码中的解析与代码生成原理。数据集简介Iris 数据集是机器学习领域最经典的小型分类数据集之一共包含 150 条样本每条样本对应一株鸢尾花。数据集包含四个特征和一个标签四个特征表示每株鸢尾花的植物学形状每个特征都是浮点数标签表示每株鸢尾花所属的亚种是一个整数取值为 0、1 或 2分别对应山鸢尾Setosa、杂色鸢尾Versicolor和维吉尼卡鸢尾Virginica。列名数据类型描述sepal_lengthfloat花萼长度(cm)特征之一sepal_widthfloat花萼宽度(cm)特征之一petal_lengthfloat花瓣长度(cm)特征之一petal_widthfloat花瓣宽度(cm)特征之一classint亚种类别(0, 1, 2)标签在 SQLFlow 官方镜像中Iris 数据集已预置在iris.train和iris.test两张表中分别作为训练数据和测试数据。这两张表的标准建表与数据导入脚本可在仓库中找到见 popularize_iris.sql其中iris.train共 120 行样本、iris.test共 30 行样本字段结构完全一致Go 测试代码中同样维护了一份等价的 SQL 数据样本iris_sql.go并额外提供了iris.train_dense、iris.test_dense逗号拼接的稠密特征表和iris.iris_empty空表等变体供不同类型的测试用例复用。Iris 是一个非常小的数据集你可以直接运行下面的语句查看数据内容%%sqlflow describe iris.train;%%sqlflow select * from iris.train limit 5;其中第一行的%%sqlflow是 Jupyter notebook 的 magic 指令。如果你使用 SQLFlow 命令行客户端go/cmd/sqlflow或其他工具则不需要键入这一指令。训练 DNNClassifier本节我们训练一个三分类的 DNNClassifier它包含两个隐藏层每层 10 个节点。使用 SQLFlow 扩展语法提供的模型训练子句可以很容易地指定模型结构TO TRAIN DNNClassifier WITH model.n_classes 3, model.hidden_units [10, 10]而通过标准 SQL 语句SELECT * FROM iris.train便可以指定训练数据。SQLFlow 会分析该 SELECT 语句的 schema自动完成数据类型与特征列feature column的推导推导逻辑见 language_guide.md 中的COLUMN field说明当字段类型为 float 时会被自动识别为数值型特征列。如果要显式指定特征和标签对应的数据列则可以通过COLUMN子句来完成COLUMN sepal_length, sepal_width, petal_length, petal_width LABEL class通过INTO sqlflow_models.my_dnn_model子句在训练结束时我们便可将训练好的 DNN 模型存入数据表sqlflow_models.my_dnn_model中。把以上所有片段结合起来我们就得到了一条完整的 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 的完整处理链路参数分类与默认值填充在 codegen.go 的InitializeAttributes中WITH子句里的参数会按前缀被归类为model.*、train.*、validation.*三组对应CategorizeAttributes函数。例如model.n_classes 3进入模型参数train.epoch 10进入训练参数。未指定的参数会填入默认值其中train.batch_size默认 1、train.epoch默认 1、train.verbose默认 0、train.max_steps默认 0、validation.metrics默认Accuracy、validation.select默认空字符串。优化器构造constructOptimizers会把形如optimizer.learning_rate 0.1的参数组装成 Python 优化器对象初始化代码如Adagrad(learning_rate0.1)若未显式指定setDefaultOptimizer会为 DNN 系模型默认填入Adagrad。生成训练代码并执行template_train.go 中的训练模板会渲染出包含feature_column_names、feature_metas、label_meta、model_params、train_params等信息的 Python 脚本最终调用runtime.tensorflow.train.train完成训练并把模型写入INTO指定的表。上述训练语句一般几分钟内可以运行完毕SQLFlow 给出的典型输出如下{accuracy: 0.4, average_loss: 1.0920922, loss: 1.0920922, global_step: 1100}如你所见这条训练语句的平均 loss 并非十分理想因为在 iris 数据集上训练得到的较理想的平均 loss 一般小于 0.4。接下来我们来学习如何改进模型效果。模型调优为了改进模型性能我们可以手动调整模型的超参数。在机器学习中超参数是指学习过程开始前可以指定的参数而其它参数则是在训练过程中学到的。根据万能近似理论Universal approximation theorem为 DNNClassifier 这样的多层前馈网络feed-forward network设计强大的网络结构可使其有潜力模拟任何函数。调整网络宽度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 这样的小数据集来说我们还有不少空间可以改进。关于model.hidden_units与model.n_classes的含义可以参考仓库中的模型参数文档 models.mdhidden_units表示 DNN 模型中每个隐层的神经元个数如[128, 32]表示模型有 2 个隐层神经元个数分别是 128、32n_classes表示模型可分类的类别总数。sqlflow_models.DNNClassifier的 Keras 参考实现见 example.py其__init__接收feature_columns、hidden_units、n_classes并逐层构造Dense隐藏层与 softmax 输出层——这就是hidden_units最终被落实为真实网络结构的地方。调整优化器学习率optimizer.learning_rate我们的第二个效果优化尝试是增大 DNNClassifier 底层数值优化器的学习率learning rate以此来加速学习过程。对 DNN 来说优化器及其学习率可能是最为关键的超参数。DNNClassifier 默认的优化器是 AdaGrad其默认学习率为 0.001。这一默认行为在源码中有两处印证Go 侧 codegen.go 的setDefaultOptimizer对 DNN 模型默认设置AdagradPython 侧 train_keras.py 的keras_compile中当WITH子句未指定优化器时会回退到tf.keras.optimizers.Adagrad(lr0.001)。理论上说在神经元不死参见 dying neuron problem的前提下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}在实际工作中略微调大 AdaGrad 的学习率往往能带来效果上的提升。值得一提的是optimizer.learning_rate 0.1这种写法会被 codegen.go 的constructOptimizers识别为优化器参数并拼接为Adagrad(learning_rate0.1)传入模型构造在 PAI 环境下优化器类名还会被映射为 TensorFlow 1.x 对应的AdagradOptimizer等名称以保证兼容性。关于手动调优本文主要就介绍这些内容。实际上调参在机器学习工作中的重要性非常之高一般会占据整条链路中最多的工时。自动调优如果你觉得为机器学习模型调参实在是枯燥无味也可以考虑借助 AutoML 技术来自动进行调优。SQLFlow 通过特定的 estimator 提供了基于 NASneural architecture search神经架构搜索的自动调优能力。我们可以使用sqlflow_models.AutoClassifier代替DNNClassifier来实现自动调优。一旦使用sqlflow_models.AutoClassifier就不需要再关注网络结构因此不必在WITH子句中指定hidden_units而默认的学习率也能够应付大部分情况%%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都有一定随机性你自己运行得到的结果可能会略有不同。从仓库现状看sqlflow_models.AutoClassifier已作为默认模型定义之一注册在模型仓库服务中见 add_default_model_defs.go并在端到端测试中被完整覆盖在 e2e_common_cases.go 的caseCoverageCustomModel用例中先执行TO TRAIN sqlflow_models.AutoClassifier WITH model.n_classes 3 LABEL class INTO sqlflow_models.my_adanet_model随后用该模型执行TO EXPLAINadanet 的可解释性分析。不过在模型参数文档 models.md 中AutoClassifier一节当前仍标记为 TBD参数表待补充。SQLFlow 项目组计划在未来支持更多的 NAS 模型同时也计划支持 HPOautomatic hyperparameter tuning自动超参数优化等其它 AutoML 技术。预测SQLFlow 提供了非常易用的预测能力。和训练语句一样我们使用SELECT * FROM iris.test这样的标准 SQL 语句来指定预测数据。如果我们想用先前训练的模型sqlflow_models.my_dnn_model来预测上述数据并将结果写到iris.predict表的class这一列则完整的预测语句如下%%sqlflow SELECT * FROM iris.test TO PREDICT iris.predict.class USING sqlflow_models.my_dnn_model;预测语句运行结束后我们就可以通过如下标准 SQL 语句来查看预测结果%%sqlflow SELECT * FROM iris.predict LIMIT 5;从实现上看预测同样走模板代码生成的路径template_pred.go 会复用训练阶段保存的 estimator 名称、feature columns 代码与 label meta包括训练标签train_label_meta与预测结果列result_col_name生成调用runtime.tensorflow.predict.pred的 Python 脚本把模型应用到SELECT指定的数据上并将结果写入ResultTable。SQLFlow 要求预测语句的 SELECT schema 与训练语句保持一致详见 language_guide.md这样才能保证预测数据的特征列与训练时完全对齐。小结通过本文你已经在 SQLFlow 中完成了一个完整的 Iris 分类闭环训练用SELECT ... TO TRAIN DNNClassifier WITH ... COLUMN ... LABEL ... INTO ...一条语句定义模型结构、训练数据、特征列、标签与模型存放位置手动调优通过model.hidden_units调整网络宽度、optimizer.learning_rate调整优化器学习率将平均 loss 从约 1.09 逐步优化到约 0.10准确率从 0.4 提升到 0.98自动调优改用sqlflow_models.AutoClassifier借助 NAS 自动搜索网络架构在无需关心hidden_units的前提下达到相近甚至更好的效果预测用SELECT ... TO PREDICT ... USING ...一条语句完成模型推理并可用标准 SQL 查询预测结果表。Iris 数据集虽然很小但它完整覆盖了 SQLFlow用 SQL 描述机器学习任务的核心语法要素是从零上手 SQLFlow 最合适的第一课。如果想继续深入可以进一步阅读仓库中的 language_guide.md扩展语法完整参考、quick_start.md环境搭建与快速开始以及 Iris 数据集对应的 popularize_iris.sql 数据脚本。赞分享人工智能机器学习后端编译器【免费下载链接】sqlflowBrings SQL and AI together.项目地址https://gitcode.com/gh_mirrors/sq/sqlflow点击查看免费下载相关推荐SQLFlow 实战用 SQL 训练 DNNClassifier 完成鸢尾花Iris三分类与预测SQLFlow 实战用 SQL 训练 DNNClassifier 完成鸢尾花Iris三分类与预测 本文以 SQLFlow 官方教程 doc/tutoria人工智能机器学习后端编译器DeskGap未来展望轻量级桌面应用开发的趋势与机遇DeskGap未来展望轻量级桌面应用开发的趋势与机遇 在当今快速迭代的软件开发领域轻量级桌面应用框架正逐渐成为开发者的新宠。DeskGap作为一款基于Nod如何用Python机器学习实战鸢尾花数据集分类完整指南如何用Python机器学习实战鸢尾花数据集分类完整指南 鸢尾花数据集是机器学习入门的经典案例通过这个项目你将掌握数据加载、可视化分析、模型训练和评估的完整流上一篇DeskcommCRM的event_log事件驱动架构:为什么数据库触发器永远不发HTTP下一篇x64dbg 收藏工具菜单 AddFavouriteTool 命令为 Favourites 菜单添加自定义工具与快捷键创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑