全文共4873字,预计学习时长13分钟


图源:unsplash


实话说,笔者花在管理和追踪机器学习实验上的时间,比花在开发机器学习模型上的时间要多得多。笔者最开始用Excel工作表标出正在试验的所有参数和指标、用不同颜色来编码、手动输入结果,等等。笔者知道自己需要一次性调整工作流程。


本文首先将介绍追踪实验的重要性,然后将概述MLFlow如何让生活变得简单,最后通过一个常见的代码示例来解释如何自己进行整合。在此之后,保证你可以像个专家一样整合机器学习流(ML flow)和优化工作流!


为什么要追踪实验


不论你是老手还是新手,都不可能一次性开发出性能最好的模型。最佳性能模型的关键是对手头业务的指标优化进行迭代。在数据科学的生命周期中,进行实验只是模型开发环节中一个必要的步骤。


当涉及到产品研发时,实验是数据科学生命周期中最关键的一步。在这类研究任务繁重的问题中,仅仅找到最佳解决方案是不够的,还需要概述如何获得最佳性能解决方案,并确保该解决方案的可复制性。


这一切都是以实验阶段为底线。我们只能建立有效高效的工作流来创建实验、追踪实验、评估结果、存储模型,最后重复这一过程。


用MLflow来摆脱困境


当笔者请教经验丰富的专家时,他们只推荐了寥寥几个工具以供尝试。笔者的基本要求是:


· 几乎不更改对现有代码。

· 开源且免费。

· 不限制平台,可以选择最适合当前问题的平台。


MLflow满足了所有这些要求,并且还要更加强大。


一个用于机器学习生命周期的开源平台。| 图源:MLflow


MLflow是一个管理机器学习生命周期的开源平台,包括实验、可重复性、部署和中央模型注册。没错,它所提供的不仅仅是实验跟踪,而是覆盖了完整的机器学习生命周期。它包含以下功能:


· MLflow 追踪——实验追踪,来记录和比较参数和结果。

· MLflow 项目——以可重用、可复制的形式打包机器学习代码,以便与其他数据科学家共享或用于生产中。

· MLFlow 模型——管理和部署模型,从各种机器学习库到各种模型服务和推理平台。

· MLFlow 模型存储——中央模型存储,协同管理MLflow模型的整个生命周期,包括模型版本控制、阶段转换和注释。


虽然MLflow具有所有这些高级功能,但本文将重点讨论MLflow追踪以及它如何帮助我们有序地追踪机器学习实验。


理解典型工作流


还有什么比通过一个著名的示例进行演练更有助于理解典型工作流的呢?这里将使用著名的安德森鸢尾花数据集,并构建一个分类算法来预测该鸢尾植物的种类。选择这个数据集没有什么特别的原因,只是因为它很容易从scikit-learn库中获得,并且可以立即尝试。


fromsklearn.datasets import load_iris from sklearn import metrics from sklearn.model_selection importtrain_test_split from sklearn.tree importDecisionTreeClassifier def load_iris_data(): data = load_iris() X = data.data y = data.target X_train, X_test, y_train, y_test = train_test_split(X,y, test_size =0.25, random_state = 10) input_data = (X_train, X_test, y_train, y_test) return input_data deftrain_predict_evaluate_dtree(input_data, params): X_train, X_test, y_train, y_test = input_data clf = DecisionTreeClassifier(random_state=42, max_leaf_nodes=params['leaf_nodes'], max_depth=params['max_depth']) clf.fit(X_train, y_train) y_pred = clf.predict(X_test) test_accuracy = metrics.accuracy_score(y_test, y_pred) test_f1_score = metrics.f1_score(y_test, y_pred, average='weighted') test_metrics = (test_accuracy, test_f1_score) return clf, test_metrics input_data = load_iris_data() params = {'leaf_nodes': 3, 'max_depth' :2} model, test_metrics =train_predict_evaluate_dtree(input_data, params)


图源:unsplash


分解该分类问题的简单代码如下:


· 1–4行:导入全部所需库。


· 6–12行: 定义一个函数,加载鸢尾花数据,拆分得到训练集和测试集,然后返回这两个数据集。


· 14–24行:定义一个函数,输入数据和模型参数,建立决策树分类器,预测测试数据,评估准确率和F1得分。这个函数最终返回模型和评估指标。


· 26–28行:设置模型参数,通过调用load_iris_data()函数加载数据,并将数据和参数传递给train_predict_evaluate_dtree()函数。


如果必须运行多个实验来找到性能最好的模型,那就只能让函数循环运行,然后在excel工作表中手动输入这些参数和指标。这是笔者在整个项目时间线上记录所有实验的唯一方法。


即刻整合MLflow


本例仅增加6行代码。这一点让笔者非常惊喜,现在笔者再也不用Excel工作表了。代码如下:


from sklearn.datasets import load_iris from sklearn import metrics from sklearn.model_selection importtrain_test_split from sklearn.tree importDecisionTreeClassifier import mlflow import mlflow.sklearn mlflow.sklearn.autolog() def load_iris_data(): data = load_iris() X = data.data y = data.target X_train, X_test, y_train, y_test = train_test_split(X,y, test_size =0.25, random_state = 10) input_data = (X_train, X_test, y_train, y_test) return input_data deftrain_predict_evaluate_dtree(input_data, params): with mlflow.start_run(run_name = "Decision Tree ClassifierExperiments"): X_train, X_test, y_train, y_test = input_data clf = DecisionTreeClassifier(random_state=42,max_leaf_nodes=params['leaf_nodes'], max_depth=params['max_depth']) clf.fit(X_train, y_train) y_pred = clf.predict(X_test) test_accuracy = metrics.accuracy_score(y_test, y_pred) test_f1_score = metrics.f1_score(y_test, y_pred, average='weighted') test_metrics = (test_accuracy, test_f1_score) mlflow.log_metric('test_accuracy' , test_accuracy) mlflow.log_metric('test_f1_score', test_f1_score) return clf, test_metrics input_data = load_iris_data() params = {'leaf_nodes': 3, 'max_depth' :2} model, test_metrics =train_predict_evaluate_dtree(input_data, params)


改动之处如下:


· 第5行:导入mlflow库


· 第6行:此处还导入了相关的MLFlow.skLearn模块。这完全取决于模型建立在哪个安装包上。也可以用mlflow.tensorflow,mlflow.pytorch,mlflow.xgboost等等。


· 第7行:自动扫描是最近引入的一个实验性能,它减少整合MLflow的麻烦。该函数自动记录所有参数和指标,并将模型构件保存在一起,因此能够重现运行或检索已经训练好的模型文件以备以后使用。


· 第18行:MLflow Tracking围绕运行的概念,后者指的是数据科学代码片段的运行。如果想找到输入分类器模型的最佳参数,可以使用不同的参数创建多个运行,找出哪一个运行给出了最好的结果。因此,这一行实际上是用mlflow.start_run()函数启动一个运行,由此将记录的所有内容与该特定运行相关联。


· 28–29行:autolog()当前记录与训练相关联的指标,如仅记录测试精度。然而,本例希望比较其他测试指标,例如测试精度和测试F1分数。因此,使用log_metric()函数来记录所有自定义指标。


你可以自行决定如何多次运行或实验。你可以选择在需要时多次运行代码,或者一次执行多次运行。笔者通常用想要实验的参数创建一个小循环,并一次运行,代码如下:


for params indifferent_combinations_of_parameters: model,metrics =train_predict_evaluate_dtree(input_data, params)


可以用面板来跟踪机器学习实验吧?当然可以。到目前为止,记录的所有内容都可以通过MLflow UI服务器访问。只需在终端上(从正确的目录)运行mlflow ui,并在浏览器上打开http://localhost:5000/即可。


可以在MLFlow UI服务器中找到有关运行的所有内容。


你可以比较几个运行实例,可视化地分析参数的变化如何改变指标,甚至可以将数据下载为CSV格式文件以备需要作为报告提交。模型文件与YAML环境一起保存为构件,以后也可以利用。


你可能需要花一些时间来了解MLflow概念,以便更多地了解实验、运行、构件、自动日志记录和其他性能,最终一定会掌握诀窍的。


当笔者第一次将它合成到工作流程大概花了5天时间(大部分时间是在研究和探索性能上),但现在笔者只花了几分钟就可以完成。笔者认为这件事再简单不过了,它确实遵循了最佳实践,并节省了很多时间。


本文介绍了追踪实验的重要性,以及如何将MLflow轻松地整合到工作流中,就像示例一样专业且轻松地解决问题。希望它能帮到你。


留言点赞关注

我们一起分享AI学习与发展的干货

如转载,请后台留言,遵守转载规范