Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >明月机器学习系列025:机器学习建模实验的最佳实践

明月机器学习系列025:机器学习建模实验的最佳实践

作者头像
明月AI
发布于 2021-10-28 02:36:14
发布于 2021-10-28 02:36:14
97800
代码可运行
举报
文章被收录于专栏:野生AI架构师野生AI架构师
运行总次数:0
代码可运行

我们平时使用scikit-learn做机器学习建模,主要是实验环境是notebook(jupyter),有些问题就像牛皮癣一样,很难去除,例如:

1.很难跟踪实验

机器学习算法有几十个可配置参数,无论您是单独工作还是团队工作,都很难跟踪哪些参数,代码和数据进入每个实验以生成模型。

2.很难重现结果

如果没有详细的跟踪,团队往往难以获得相同的代码再次工作。无论您是要回想自己之前的工作,还是需要向客户展示你的工作,都是一个麻烦事情。

3. 管理混乱

无论是参数,还是模型,过段时间就会忘记哪个跟哪个对应了。别的同事如果想接手你的工作,也很难理解你的工作。

这些问题如果完全使用在线的可视化建模工具其实可以解决,但是可视化的建模工具又有一个大麻烦,就是很不灵活,如果我们在建模的过程中使用了别的算法包怎么办,另外数据清洗也很难集成。其实我们需要一个能方便进行参数和指标管理的工具,而数据清洗和训练过程又依然是能自由进行的工具。

没错,我们需要的是Mlflow,而且是和Notebook结合使用。

启动Mlflow跟踪界面


我们先安装Mlflow,先新建一个Notebook文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 安装mlflow
!pip install mlflow

成功之后,我们就可以启动一个跟踪界面了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 只是本机访问
!mlflow ui

# 需要给其他人访问
!mlflow ui --host 0.0.0.0

是否需要增加host参数,就看自己的需要,启动之后,默认的端口是5000。这样你就能通过浏览器进行访问:http://localhost:5000/

你看到的界面大概如下:

第一次进来是空白的,当你训练模型时进行记录之后,刷新页面才能看到数据。

新建实验


一次实验你可以理解为一个待建模解决的问题等,创建很简单,只需要一个名字:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import mlflow

mlflow.create_experiment('Boston_Housing_Price')

注意:如果该实验名字已经存在,则会报错,不过并不会影响。

执行完之后,在当前目录下会自动创建一个目录“mlruns”。

训练模型


我们新建一个Notebook文件来做模型训练。

每训练一次模型对应一个Mlflow中的一次run(运行),而在run的过程中,我们就能根据需要记录相应的环境参数或者训练参数等,训练完成之后,再将模型指标记录起来,以后跟踪就简单了。

一个简单的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sklearn.linear_model import LinearRegression as lr
from sklearn.metrics import mean_squared_error

# 开始一次运行
with mlflow.start_run():
    # 训练模型
    mlflow.log_param("algo", 'lr')        # 使用的算法
    mlflow.log_param("normalize", True)   # 训练参数

    model = lr(normalize=True)
    model.fit(train_x, train_y)
    
    pred_y = model.predict(train_x)
    print("训练误差:", mean_squared_error(train_y, pred_y))
    mlflow.log_metric("train_mse", mean_squared_error(train_y, pred_y))

    pred_y = model.predict(test_x)
    print("测试误差:", mean_squared_error(test_y, pred_y))
    mlflow.log_metric("test_mse", mean_squared_error(test_y, pred_y))

注意:上面的代码省略了数据清洗和划分的步骤。

上面将算法名称也作为一个参数进行记录,这样方便以后对比不同算法的效果。用于记录的函数就两个:

  • log_param: 记录需要追踪的参数
  • log_metric: 记录需要追踪的指标

而使用不同的参数和算法,只需要不断重复上面的步骤即可,mlflow会自动帮我们追踪对应的参数和指标。只要刷新mlflow的追踪界面:

我们可以看到,每一次训练时所使用的参数和相应的指标,妈妈再也不用担心你会忘记了,和数据清洗及建模过程几乎无痛对接。而且还能对指标进行排序,能根据参数值进行筛选,非常的人性化。

保存与加载模型


在一次run的过程中,调用接口保存模型即可,如果是sklearn可以如此:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import mlflow.sklearn

# 第二个参数是相对路径:models
# 实际存储路径类似这样的:./mlruns/1/dfb212c414fc487d886803d84b1f1ba8/artifacts/models/model.pkl
mlflow.sklearn.log_model(model, "models")

模型保存了之后,在需要的时候,加载出来即可,不过加载模型需要先找到运行ID:

上面红色圈住的即是运行ID。有ID即可加载模型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# API:https://mlflow.org/docs/latest/python_api/mlflow.sklearn.html#mlflow.sklearn.load_model
# runs:/<mlflow_run_id>/run-relative/path/to/model
model = mlflow.sklearn.load_model('runs:/429083d2e8b34b0585b2e2fff30be28d/models')

uri的语法,可以看接口文档,有比较详细的说明。

团队MLflow


在一个团队中实践MLflow,其实也是很简单,先在服务器端启动mlflow ui,如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 对应的Dockerfile:
# https://github.com/IBBD/dockerfile-python/blob/master/python3/mlflow.Dockerfile
mlflow ui --host 0.0.0.0

然后只需要在开始创建或者设置实验之前,执行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mlflow.set_tracking_uri("http://192.168.0.5:5000/")

后面的就一样了,不过保存模型的时候,只会保存在本地,而不会保存到服务器上。

基于MLflow的最佳实践流程


把上面梳理一下,整理成一个流程:

在模型指标能满足客户的需求,这时应该将实验的过程数据下载下来,并最优的模型交付给客户,我们自然也是需要做好备份的。

我们将MLflow作为团队公共的机器学习实验的参数与指标的追踪与管理平台,方便追踪和重现实验结果。而基于统一的平台,也方便大家进行交流。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 野生AI架构师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C++ Trick:什么时候需要前置声明?
通常来说,你都不需要主动去写class A这种前置声明。include能编译通过的时候都不要去写前置声明,应该仅当出现了头文件循环依赖导致编译失败的时候,才去考虑去写前置声明!
果冻虾仁
2021/12/13
1.9K0
真没想到nullptr和NULL得区别,大了去了
//禁止内建型别之间进行隐式型别转换,如果大括号内的表达式无法保证能够采用进行初始化的对象来表达,则代码不能通过编译
用户9831583
2022/12/04
1.8K0
第 16 章 模板与泛型编程
第 16 章 模板与泛型编程 标签: C++Primer 学习记录 模板 泛型编程 ---- 第 16 章 模板与泛型编程 16.1 定义模板 16.2 模板实参推断 16.3 重载与模板 16.4 可变参数模板 16.5 模板特例化 在做这一章的笔记时,因为有很多内容也是在看 C++ Primer这本书时第一次接触到,所以需要记录大段文字。挨个字敲,又太累,所以就想有没有什么高效的输入手段。后面想到了语音输入,对比了搜狗输入法和讯飞输入法,发现讯飞输入法对于专业术语也能翻译的很好。这样一来,遇到整段文字
用户1653704
2018/06/07
1.4K0
C++ 03 - 前置声明
所谓前置声明(forward declaration)是类, 函数和模板的纯粹声明, 没伴随着其定义.
Reck Zhang
2021/08/11
1.4K0
[Effective Modern C++(11&14)]Chapter 3: Moving to Modern C++
1. Distinguish between () and {} when creating objects C++11中,初始化值的指定方式有三种:括号初始化,等号初始化和花括号初始化;其中花括号初始化是为了解决C++98的表达能力而引入的一种统一初始化思想的实例。 等号初始化和花括号初始化可以用于非静态成员变量的初始化 class Widget { ... private: int x {0}; // ok int y = 0; // ok int z(0);
昊楠Hacking
2018/05/26
1.8K0
C++20:从0到1学懂concept
对于Foo来说,是不支持加法的,于此同时也是不可以直接std::cout << ,因此在编译时报一大堆错误,包含operator<<与operator+,但这并不是我们期望的错误信息,我们比较期望的是编译器给我们最直观的错误信息,即:这个结构体能不能相加。
公众号guangcity
2024/01/10
2890
C++20:从0到1学懂concept
C++:20---类模板(template)
一、类模板与模板类 类模板:一个模板(是模板) 模板类:调用类模板生成的类对象(是类实体),也称为类模板的实例化 类模板的定义: 与函数模板的定义是一样的 template <typename T>class Blob{public:Blob();Blob(std::initializer_list<T> i);}; 模板类的使用: 在定义类时,使用到类名的地方都需要显示的给出模板类的类型,格式为<> int main(){Blob<int> ia;Blob<int> ia2 = { 1,2,3 };Bl
用户3479834
2021/02/03
1.3K0
C++20新特性个人总结
concept乃重头戏之一,用于模板库的开发。功能类似于C#的泛型约束,但是比C#泛型约束更为强大。
用户7886150
2021/02/04
2K0
跟Google学写代码--Chromium工程中用到的C++11特性
Ttile 跟Google学写代码--Chromium工程中用到的C++11特性 Chromium是一个伟大的、庞大的开源工程,很多值得我们学习的地方。 《跟Google学写代码–Chromium/base–stl_util源码学习及应用》 《跟Google学写代码–Chromium/base–windows_version源码学习及应用》 《跟Google学写代码–Chromium/base–cpu源码学习及应用》 今天就与大家一起分享一下Chromium中所用到的C++11特性,有的是之前博客没介绍过
程序员的酒和故事
2018/03/12
1.4K0
C++知识点
还没有整理过的笔记,有点乱 C++ 程序设计 II 兼谈对象模型 Conversion function - 转换函数 operator type() // this type -> other type class Fraction { // 分数类,分数可以被看成 double public: Fraction(int num, int den = 1) : m_numerator(num), m_denominator(den) {} operator double() co
yhlin
2023/02/13
8880
C++知识点
C++11新特性学习笔记
C++11标准为C++编程语言的第三个官方标准,正式名叫ISO/IEC 14882:2011 - Information technology – Programming languages – C++。在正式标准发布前,原名C++0x。它将取代C++标准第二版ISO/IEC 14882:2003 - Programming languages – C++成为C++语言新标准。
CtrlX
2023/03/13
2.3K0
C++11新特性学习笔记
【笔记】《深入理解C++11》(上)
本篇是看完《深入理解C++11:C++11新特性解析与应用》后做的笔记的上半部分. 这本书可以看作是《C++Primer》的进阶版, 主要是更加详细地介绍了C++11的一些常用设计和标准库设施, 很多知识点都在面试中会遇到, 值得一读.
ZifengHuang
2022/11/18
2K0
【笔记】《深入理解C++11》(上)
现代C++之SFINAE
介绍c++的SFINAE概念:类成员的编译时内省 0.导语1.C++自省?2.老式的C++98方式2.1重载决议2.2 SFINAE2.3 sizeof运算符2.4 结合一切2.5 实现我们的想法2.
公众号guangcity
2020/02/13
3K0
现代C++之SFINAE
终极 C++避坑指南
作者:boreholehu,腾讯 WXG 后台开发工程师 前言 C++是一门古老的语言,但仍然在不间断更新中,不断引用新特性。但与此同时 C++又甩不掉巨大的历史包袱,并且 C++的设计初衷和理念造成了 C++异常复杂,还出现了很多不合理的“缺陷”。 本文主要有 3 个目的: 总结一些 C++晦涩难懂的语法现象,解释其背后原因,作为防踩坑之用; 和一些其他的编程语言进行比较,列举它们的优劣; 发表一些我自己作为 C++程序员的看法和感受。 来自 C 语言的历史包袱 C++有一个很大的历史包袱,就是 C 语言
腾讯技术工程官方号
2022/09/08
2.4K0
终极 C++避坑指南
C++ 学习笔记
作者:readywang(王玉龙) template 是 c++ 相当重要的组成部分,堪称 c++语言的一大利器。在大大小小的 c++ 程序中,模板无处不在。c++ templates 作为模板学习的经典书籍,历来被无数 c++学习者所推崇。第二版书籍覆盖了 c++ 11 14 和 17 标准,值得程序猿们精读学习,特此整理学习笔记,将每一部分自认为较为重要的部分逐条陈列,并对少数错误代码进行修改 一、函数模板 1.1 函数模板初探 1.模板实例化时,模板实参必须支持模板中类型对应的所有运算符操作。 te
腾讯技术工程官方号
2022/03/03
6.8K0
再议 C++ 11 Lambda表达式
C++ 11 标准发布,各大编译器都开始支持里面的各种新特性,其中一项比较有意思的就是lambda表达式。
owent
2018/08/01
4120
【C++】类和对象(下)
1.之前我们实现构造函数时,初始化成员变量主要使⽤函数体内赋值,构造函数初始化还有⼀种⽅ 式,就是初始化列表,初始化列表的使⽤⽅式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成 员列表,每个"成员变量"后⾯跟⼀个放在括号中的初始值或表达式。
用户11375356
2024/11/22
320
【C++】类和对象(下)
C++11常用新特性快速一览
在某种意义上来说,传统 C++ 会把 NULL、0 视为同一种东西,这取决于编译器如何定义 NULL,有些编译器会将 NULL 定义为 ((void*)0),有些则会直接将其定义为 0。
f_zyj
2019/05/27
2.6K0
万字避坑指南!C++的缺陷与思考(上)
点个关注👆跟腾讯工程师学技术 导语 | 本文主要总结了本人在C++开发过程中对一些奇怪、复杂的语法的理解和思考,同时作为C++开发的避坑指南。 前言 C++是一门古老的语言,但仍然在不间断更新中,不断引用新特性。但与此同时C++又甩不掉巨大的历史包袱,并且C++的设计初衷和理念造成了C++异常复杂,还出现了很多不合理的“缺陷”。本文主要有3个目的: 总结一些C++晦涩难懂的语法现象,解释其背后原因,作为防踩坑之用。 和一些其他的编程语言进行比较,列举它们的优劣。 发表一些我自己作为C++程序员的看法和
腾讯云开发者
2022/11/07
1.7K0
万字避坑指南!C++的缺陷与思考(上)
《Effective Modern C++》读书笔记
Note:为避免各种侵权问题,本文并没有复制原书任意文字(代码除外,作者已经声明代码可以被使用)。需要原书完整中文翻译的读者请等待官方译本的发布。
bear_fish
2018/09/19
1.9K0
相关推荐
C++ Trick:什么时候需要前置声明?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验