NNI 与 Scikit-learn 集成实战:用 nnictl 自动搜索模型与超参数
NNI 与 Scikit-learn 集成实战用 nnictl 自动搜索模型与超参数【免费下载链接】nniAn open source AutoML toolkit for automate machine learning lifecycle, including feature engineering, neural architecture search, model compression and hyper-parameter tuning.项目地址: https://gitcode.com/gh_mirrors/nn/nniScikit-learn 是数据挖掘与数据分析领域最流行的机器学习工具库之一覆盖 LinearRegression、LogisticRegression、DecisionTree、SVM 等大量经典模型。本指南以 NNINeural Network Intelligence仓库中 examples/trials/sklearn 目录下的完整示例为主线讲解如何用 NNI 的调优算法自动搜索 scikit-learn 的最佳模型与超参数并支持本地机器、远程服务器与云端等多种运行环境。读完本文你将掌握从search_space.json定义搜索空间、到nni.get_next_parameter()获取参数、再到nni.report_final_result()回报指标的三步集成方法并能够直接复制运行仓库中的分类与回归示例。示例概览仓库结构与你将运行的内容本主题对应的完整示例位于仓库的 examples/trials/sklearn 目录共包含两个任务examples/trials/sklearn/ ├── classification/ # 手写数字分类SVC 支持向量机 │ ├── config.yml # 实验配置 │ ├── main.py # trial 训练脚本 │ ├── search_space.json # 搜索空间定义 │ ├── python_api_connect.ipynb │ └── python_api_start.ipynb ├── regression/ # 回归任务多种线性回归模型 │ ├── config.yml │ ├── main.py │ └── search_space.json └── requirements.txt # 系统级依赖安装说明两个任务的代码骨架完全一致加载数据 → 从 NNI 获取一组参数 → 构建模型 → 训练并评测 → 把得分回报给 NNI。后续第 3 节会以代码为准逐行剖析这一流程。一、如何运行示例1.1 环境准备运行前需要先安装 NNI 包并准备好 Python 环境numpy、scipy、sklearn等科学计算依赖。仓库的 examples/trials/sklearn/requirements.txt 给出了 Ubuntu 系统下的依赖安装参考sudo apt-get install libblas-dev liblapack-dev libatlas-base-dev gfortran python3 -m pip install --user numpy scipy sklearnNNI 的完整安装与运行环境准备方法可参考 docs/source/installation.rst。启动实验统一使用命令行工具nnictl。1.2 启动实验安装完成后进入对应的示例目录并执行nnictl create --config ./config.ymlNNI 会根据config.yml中声明的trialCommand启动若干个 trial 进程每个 trial 从搜索空间中采样一组超参数独立训练、评测并把得分回报给调优器以生成下一组参数。下面以分类示例的 examples/trials/sklearn/classification/config.yml 为例说明各字段含义searchSpaceFile: search_space.json # 搜索空间文件JSON trialCommand: python3 main.py # 每个 trial 要执行的命令 trialConcurrency: 1 # 同时并发运行的 trial 数量 maxTrialNumber: 100 # 最多运行的 trial 总数 maxExperimentDuration: 1h # 实验最长运行时间 tuner: name: TPE # 调优算法Tree-structured Parzen Estimator classArgs: optimize_mode: maximize # 优化方向最大化指标如准确率/R² trainingService: # For other platforms, check mnist-pytorch example platform: local # 本地运行平台关键字段说明trialCommand每个 trial 实际执行的命令此处为python3 main.pytuner.name指定调优算法示例使用TPE。NNI 还内置了 Random、Anneal、GridSearch、Hyperband 等大量算法可参考 nni/algorithms/hpo 目录下的实现与 docs/source/hpo/tuners.rstoptimize_mode必须与指标含义一致——本例中分类用准确率、回归用 R²均为“越大越好”故设为maximize若指标是损失loss则应设为minimize回归示例 examples/trials/sklearn/regression/config.yml 的配置结构完全相同区别仅在于maxTrialNumber: 30。实验运行期间可用nnictl提供的 Web 界面实时查看 trial 状态、中间指标与最优参数也可以使用nnictl stop停止实验。二、示例详解分类与回归2.1 分类示例手写数字识别 SVC分类示例使用 sklearn 内置的 digits 数据集由 1797 张 8×8 的手写数字灰度图组成每张图对应一个 09 的数字目标是将图像正确分类到 10 个类别。模型选用支持向量机SVC并对影响其性能的核心超参数进行搜索包括C正则化强度、kernel核函数类型、degree多项式核的阶数、gamma核系数和coef0核函数中的常数项。这些参数的详细说明可参考 sklearn 官方文档sklearn.svm.SVC一节。数据加载与预处理逻辑见 examples/trials/sklearn/classification/main.pydef load_data(): digits load_digits() X_train, X_test, y_train, y_test train_test_split( digits.data, digits.target, random_state99, test_size0.25) ss StandardScaler() X_train ss.fit_transform(X_train) X_test ss.transform(X_test) return X_train, X_test, y_train, y_test注意代码在划分训练/测试集后对特征做了StandardScaler标准化——SVM 这类基于距离/核的模型对特征尺度敏感标准化能显著提升搜索到的超参数质量。训练与评测使用model.score(X_test, y_test)即准确率作为最终指标。2.2 回归示例多种回归模型自动选择回归示例的目标是根据房屋特征预测房价。仓库当前实现使用 sklearn 内置的 diabetes 数据集load_diabetes训练目标与分类示例一致。与分类示例“固定模型、只调参数”不同回归示例把模型本身也放进搜索空间在LinearRegression、Ridge、Lars、ARDRegression四种模型之间自动选择同时对normalize参数是否对数据进行归一化进行搜索。模型映射逻辑见 examples/trials/sklearn/regression/main.pydef get_model(PARAMS): model_dict { LinearRegression: LinearRegression(), Ridge: Ridge(), Lars: Lars(), ARDRegression: ARDRegression() } if not model_dict.get(PARAMS[model_name]): LOG.exception(Not supported model!) exit(1) model model_dict[PARAMS[model_name]] model.normalize bool(PARAMS[normalize]) return model评测指标使用回归问题常用的决定系数 R²r2_scoredef run(X_train, X_test, y_train, y_test, model): model.fit(X_train, y_train) predict_y model.predict(X_test) score r2_score(y_test, predict_y) LOG.debug(r2 score: %s, score) nni.report_final_result(score)通过把model_name放进_type: choiceNNI 的调优器会结合历史 trial 的 R² 表现在四种模型之间做出有依据的取舍——这正是“模型选择 超参数调优”一体化的典型用法。三、三步编写 NNI scikit-learn 代码在 scikit-learn 代码中使用 NNI 非常简单只需三步。第一步准备 search_space.json 定义搜索空间搜索空间文件用 JSON 描述每个待搜索变量的取值范围。如果只想在多个模型间选择可以这样写{ model_name:{_type:choice,_value:[LinearRegression, SVR, KNeighborsRegressor, DecisionTreeRegressor]} }如果想同时搜索模型和参数把变量放进同一个文件即可{ model_name:{_type:choice,_value:[LinearRegression, SVR, KNeighborsRegressor, DecisionTreeRegressor]}, svr_kernel: {_type:choice,_value:[linear, poly, rbf]}, knr_weights: {_type:choice,_value:[uniform, distance]} }搜索空间支持丰富的采样类型详见 docs/source/hpo/search_space.rst。分类示例 examples/trials/sklearn/classification/search_space.json 就综合使用了uniform与choice{ C: {_type:uniform,_value:[0.1, 1]}, kernel: {_type:choice,_value:[linear, rbf, poly, sigmoid]}, degree: {_type:choice,_value:[1, 2, 3, 4]}, gamma: {_type:uniform,_value:[0.01, 0.1]}, coef0: {_type:uniform,_value:[0.01, 0.1]} }常见类型的语义与适用场景类型写法语义choice{_type:choice,_value:[opt1, opt2, ...]}从选项列表中离散选取uniform{_type:uniform,_value:[low, high]}在[low, high]区间内均匀采样quniform{_type:quniform,_value:[low, high, q]}离散化的均匀采样值被约束到q的倍数例如[0, 10, 2.5]只会产生[0, 2.5, 5.0, 7.5, 10.0]loguniform{_type:loguniform,_value:[low, high]}对数均匀采样适合数量级跨度大的连续量如学习率qloguniform{_type:qloguniform,_value:[low, high, q]}loguniform的离散化版本选择类型时有一条实用原则如果参数是越平滑越好的连续量如C、gamma用uniform如果是有明确候选集合的离散项如核函数名、模型名用choice。第二步用 nni.get_next_parameter() 获取参数在 Python 代码开头import nni然后调用nni.get_next_parameter()获取 NNI 调优器为当前 trial 生成的一组参数import nni对应第一步中那个搜索空间某次 trial 可能收到这样一组参数params { C: 1.0, kernel: linear, degree: 3, gamma: 0.01, coef0: 0.01 }拿到 dict 后即可用它构造 scikit-learn 模型。参考仓库代码推荐配合默认参数 增量更新的模式保证即使调优器给出的参数不完整也能正常运行def get_default_parameters(): params { C: 1.0, kernel: linear, degree: 3, gamma: 0.01, coef0: 0.01 } return params def get_model(PARAMS): model SVC() model.C PARAMS.get(C) model.kernel PARAMS.get(kernel) model.degree PARAMS.get(degree) model.gamma PARAMS.get(gamma) model.coef0 PARAMS.get(coef0) return model if __name__ __main__: ... RECEIVED_PARAMS nni.get_next_parameter() PARAMS get_default_parameters() PARAMS.update(RECEIVED_PARAMS) model get_model(PARAMS)从源码看get_next_parameter定义于 nni/trial.py它通过默认的 trial 命令通道接收调优器下发的参数记录并返回其中的parameters字段。需要注意每个 trial 应当且只应当调用一次该函数重复调用属于未定义行为。第三步用 nni.report_final_result() 回报分数训练完成后把模型的评测得分回报给 NNI。NNI 的调优器正是依据这些得分来生成下一组参数的因此这一步是闭环的关键nni.report_final_result(score)如果训练分多个阶段、希望展示中间结果例如每个 epoch 的指标可以使用nni.report_intermediate_result(score)回报中间指标这样 Web 界面可以绘制学习曲线early-stopping 类算法如 Assessor也能据此提前终止劣质 trial。中间指标是可选的但最终结果report_final_result必须回报否则该 trial 无法被正确评估。关于指标格式的约定源码 nni/trial.py 中的文档说明如下metric可以是浮点数也可以是 dict若是 dictmetric[default]必须是浮点数调优器以该值为准其余键值可用于 Web 界面可视化report_final_result发送类型为FINAL的指标记录report_intermediate_result发送类型为PERIODICAL的记录并附带自增的序号。四、底层原理trial 与调优器如何通信整条链路可以概括为调优器Tuner生成参数 → 命令通道下发 → trial 进程接收参数 → 训练评测 → 指标回报 → 调优器更新策略 → 生成下一组参数。在 nni/trial.py 中参数获取与指标回报统一通过get_default_trial_command_channel()完成通道实现在 nni/runtime/trial_command_channel 目录下。report_final_result内部会断言“必须先调用过get_next_parameter()才能回报结果”以保证参数与结果能够正确配对assert _params or trial_env_vars.NNI_PLATFORM is None, \ nni.get_next_parameter() needs to be called before report_intermediate_result而调优器一侧如示例使用的 TPE会根据收到的历史 trial 得分构建参数与指标之间的概率模型进而决定下一次采样偏向哪些区域——这正是“自动搜索”相较于手工网格搜索grid search效率更高的原因。NNI 内置的各类调优算法实现位于 nni/algorithms/hpo含 tuner 与 advisor 两个子包。此外示例代码将import nni、nni.get_next_parameter()、nni.report_final_result()包裹在try/except中并打印异常日志见main.py末尾这是一种值得沿用的防御性写法trial 失败时把完整异常栈留在日志里便于在 Web 界面或nnictl的日志中排查问题。五、扩展更多模型与更大规模本文的两组示例展示了两类最典型的模式固定模型、搜索超参数分类示例适合你已经选定模型、只需微调参数的情况同时搜索模型与参数回归示例适合建模初期在多个候选模型间做选择的情况。将search_space.json中的变量与main.py中的model_dict扩展即可覆盖更多 sklearn 模型如KNeighborsRegressor、DecisionTreeRegressor、集成模型等代码骨架无需改动。同时NNI 的搜索空间语法还支持loguniform、qloguniform、嵌套/条件搜索空间等高级特性配合maxTrialNumber、trialConcurrency、maxExperimentDuration等实验约束即可在本地或分布式环境下对 sklearn 任务进行系统化、可复现的超参数调优。完成上述三步改造后你的 scikit-learn 代码就具备了自动选模型、自动调参数的能力剩下的探索交给 NNI 的调优算法去完成。【免费下载链接】nniAn open source AutoML toolkit for automate machine learning lifecycle, including feature engineering, neural architecture search, model compression and hyper-parameter tuning.项目地址: https://gitcode.com/gh_mirrors/nn/nni创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

SE-0274 简明魔数文件名(Concise magic file names):Swift 中 `file`、`filePath` 与 `fileID` 的设计与演进

SE-0274 简明魔数文件名(Concise magic file names):Swift 中 `file`、`filePath` 与 `fileID` 的设计与演进

SE-0274 简明魔数文件名(Concise magic file names):Swift 中 #file、#filePath 与 #fileID 的设计与演进 【免费下载链接】swift-evolution This maintains proposals for changes and user-visible enhancements to the Swift Programming …

2026/9/23 23:18:45 阅读更多 →
3个坑解决压强公式单位报错,图解原理性能优化实战

3个坑解决压强公式单位报错,图解原理性能优化实战

3个坑解决压强公式单位报错,图解原理性能优化实战 报错一堆看不懂 StackTrace?别慌。很多应届生在处理物理计算模块时,一遇到 UnitMismatchError…

2026/9/24 0:48:28 阅读更多 →
3分钟搞懂office办公软件下载源码解析,告别只会复制粘贴

3分钟搞懂office办公软件下载源码解析,告别只会复制粘贴

3分钟搞懂office办公软件下载源码解析,告别只会复制粘贴 你是不是也遇到过这种情况:看了一堆“手把手教你下载Office”的教程,视频里点两下鼠标就装好了,结果自己一动手,要么找不到靠谱的直链,要么下载了一半断流,要么装完全是广告插件。…

2026/9/24 0:48:35 阅读更多 →

最新新闻

MT管理器核心功能实战:dex编辑、APK修改与签名技巧解析

MT管理器核心功能实战:dex编辑、APK修改与签名技巧解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 1:05:18 阅读更多 →
视频剪辑素材网站全攻略:免费商用素材库推荐与版权避坑指南

视频剪辑素材网站全攻略:免费商用素材库推荐与版权避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 1:05:18 阅读更多 →
十年PLC老手用AI写ST程序:提示词模板与实战避坑指南

十年PLC老手用AI写ST程序:提示词模板与实战避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 1:05:18 阅读更多 →
Elasticsearch 7.15.2安装IK中文分词器:解决中文搜索分词难题

Elasticsearch 7.15.2安装IK中文分词器:解决中文搜索分词难题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 1:05:18 阅读更多 →
STM32寄存器与HAL库双视角开发实战:从点灯到项目进阶

STM32寄存器与HAL库双视角开发实战:从点灯到项目进阶

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 1:05:18 阅读更多 →
M.2接口与Key识别指南:从SSD到无线网卡不再买错

M.2接口与Key识别指南:从SSD到无线网卡不再买错

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 1:04:17 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →