原文towardsdatascience.com/track-your-ml-experiments-9d2ea8cbeb02跟踪你的机器学习实验https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/eb7fb6cc7deb97483b020484d161255d.png图片由Alex Kondratiev在Unsplash提供每个数据科学家都熟悉实验。你知道该怎么做。你得到一个数据集将其加载到 Jupyter 笔记本中探索它预处理数据拟合一个或两个基线模型然后训练一个初始的最终模型比如 XGBoost。第一次你可能没有调整超参数包括 20 个特征。然后你检查你的错误指标。它们看起来不错但也许你的模型有点过拟合。所以你决定调整一些正则化参数例如最大深度来降低模型的复杂性然后再次运行它。你看到上一次运行有一点小小的改进但也许你还想做的是添加更多功能执行特征选择并删除一些特征尝试为你的特征使用不同的缩放器调整不同的/更多的超参数随着你想要运行的测试种类越来越多记住哪些“实验”组合实际上产生了最佳结果变得越来越困难。你只能运行笔记本这么多次打印出结果然后复制/粘贴到谷歌文档中在你感到沮丧之前。这就是实验跟踪发挥作用的地方。正如我在关于成为优秀数据科学家的文章中提到的有一个正式的方式来跟踪你的实验将使你的生活变得更加容易你的结果也更加清晰。在这篇文章中我将带你了解如何使用Neptune.ai设置一个实验它允许你免费在一个项目中运行实验并让你熟悉这个过程。市面上有很多其他优秀的实验跟踪工具但由于我最为熟悉 Neptune所以我将基于这个工具来编写这个指南。这并不是任何形式的促销——我只是想展示实验跟踪在 Python 中的样子并选择 Neptune 作为我的工具。开始使用 Neptune在你使用 pip 安装了 Neptune 并设置了 Jupyter 笔记本环境之后你需要将你的笔记本链接到 Neptune 服务器。为了从 Jupyter 笔记本连接到 Neptune 并开始运行实验你需要一个API 令牌。一旦你设置了账户登录并创建了第一个项目点击左下角的用户名然后选择“获取你的 API 令牌”。将此令牌复制并粘贴到以下代码中以开始 Neptune 运行runneptune.init_run(projectyour-project-name,api_tokenyour-token,)这个运行对象将成为您与 Neptune UI 通信的焦点。当您首次登录 Neptune 并创建一个新项目时他们应该会提供类似于上面的代码片段并填写您的凭据。如果没有只需复制并粘贴我的模板。查看 Neptune 的快速入门指南这里以获取更详细的说明和故障排除信息。数据信息我在这个示例中使用的数据集是一个包含温度和风速等附加特征的能量消耗时间序列数据集。我的数据集的具体细节对于这个教程来说并不重要主要要知道的是我使用时间序列数据集进行了一个回归任务而不是分类任务。在加载我的数据集后我最先记录的是与数据集相关的指标例如数据集的平均值、中位数和众数数据集的开始和结束日期如果这是一个时间序列数据集训练集和测试集的大小每行的数量# Train and test sizestrain_sizeint(df.shape[0]*0.8)df_traindf.iloc[0:train_size]df_testdf.iloc[train_size:]test_sizedf_test.shape[0]run[train/train_size]train_size run[test/test_size]test_size# Train and test set start and end datesrun[train/start_date]df_train.index.min()run[train/end_date]df_train.index.max()run[test/start_date]df_test.index.min()run[test/end_date]df_test.index.max()在运行中记录信息时请注意我如何以与在 Python 字典中相同的方式为键分配值。正斜杠/基本上在内部创建一个文件夹其中将包含任何给定数据类型的字段。您可以创建多个嵌套文件夹。这就是 Neptune 实验中的文件夹看起来像什么。当您点击它们时您可以看到您字段的内容。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/49c0a333429ca25687cf9f6be76c8908.png以“MED-10”命名的运行任务的“Neptune”文件夹。截图由作者提供https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/9ad793068f4749030bd5a3c92180a6f3.png在“train”文件夹内。截图由作者提供Scikit learn API 摘要Neptune 提供了与 scikit-learn 模型如随机森林、XGBoost、决策树等的日志信息集成通过他们的scikit-learn 集成 API。要访问此 API 提供的方法您只需进行单独的 pip 安装pip install-U neptune-sklearn这个集成提供的最有用的功能之一是摘要功能。如果您是 Neptune 的新用户并且还不确定在实验中想要跟踪哪些指标以及探索 Neptune 在元数据记录方面的提供摘要是一个很好的开始方式。使用 scikit learn 库Neptune 提供了三种摘要方法create_regressor_summary()create_classifier_summary()create_kmeans_summary()由于我正在训练一个 XGBoost 模型这是一个 scikit learn 回归器我使用了 create_regressor_summary 并将其分配给一个名为“summary”的文件夹。importxgboostasxgbimportneptune.integrations.sklearnasnpt_utils# Define XGB modelbstxgb.XGBRegressor(n_estimators100)# Fit/train XGB model# Assuming I did my train test split already - code not shownbst.fit(X_train,y_train)run[summary]npt_utils.create_regressor_summary(bst,X_train,X_test,y_train,y_test)预测和指标在上述摘要方法中Neptune 自动将测试预测作为 HTML 文件记录在 test/preds 下。要手动这样做不调用摘要方法你可以使用 File 数据类型将 dataframe 转换为 HTML并将其作为 HTML 对象上传到运行中。fromneptune.typesimportFile predicted_testbst.predict(X_test)# Turn predictions into dataframetest_predictions_dfpd.DataFrame(predicted_test,columns[Predictions])# Upload as htmlrun[test/predictions].upload(File.as_html(test_predictions_df))记录指标如 MSE、RMSE 和 R²可以说是实验跟踪最重要的部分之一。如果不跟踪这些指标就无法知道你的模型是否在改进。Neptune 提供了一个 get_scores()方法根据你的模型类型例如回归器或分类器将输出相关的分数。对于单输出回归器此方法将跟踪R²解释方差最大误差均方绝对误差MAE多输出回归器将跟踪R²并且分类器将跟踪精确度召回率F1 分数支持run[scores_train]npt_utils.get_scores(bst,X_train,y_train)run[scores_test]npt_utils.get_scores(bst,X_test,y_test)我通常还想包括 MSE、RMSE 和 MAPE。以下是逐个记录特定指标的方法# Calculate metrics as normalfromsklearn.metricsimportr2_score,mean_squared_error,mean_absolute_percentage_error r2r2_score(y_test.values,predicted_test)msemean_squared_error(y_test.values,predicted_test)rmsemean_squared_error(y_test.values,predicted_test,squaredFalse)mapemean_absolute_percentage_error(y_test.values,predicted_test)run[scores/test/mse]mse run[scores/test/rmse]rmse run[scores/test/r2]r2 run[scores/test/mape]mape视觉和图像Neptune 提供了一些生成信息图表的方法例如create_learning_curve_chartcreate_feature_importance_chartcreate_residuals_chartcreate_prediction_error_chartcreate_cooks_distance_chartcreate_classification_report_chartcreate_confusion_matrix_chartcreate_roc_auc_chartcreate_precision_recall_chart为了我的 XGBoost 模型我真正想看到的是特征重要性图表。虽然当你调用 create_regressor_summary()时它会在summary/diagnostics_charts下创建但你也可以单独创建它。# Create feature importance chartrun[visuals/feature_importances]npt_utils.create_feature_importance_chart(bst,X_train,y_train)你还可以记录自己的自定义图表例如一个展示测试集预测值与实际值对比的 plotly 图形。importplotly.graph_objectsasgo# Create a fig object using plotly gofiggo.Figure([go.Line(xy_test.index,ypredicted_test,namepredicted),go.Line(xy_test.index,yy_test.values,nameactual)])# Log the figurerun[visuals/test_predictions]fig停止运行 查看结果一旦你完成了一个单独的运行/实验确保通过运行以下命令来结束它run.stop()如果你没有这样做任何你为新的运行记录的指标都将覆盖你之前运行的结果。而且如果你尝试初始化一个新的运行你会得到一个错误。一旦你完成了运行并停止它你可以导航到 Neptune UI并在你的运行 ID 下查看结果。除了查看单个运行的指标外Neptune 还允许你并排比较运行。要这样做转到你想要比较的运行的眼睛符号并确保它设置为可见如果不可见眼睛上会有一条横线。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/cf01fe892777051aa52ab5bee1cc7c50.png作者截图接下来转到页面顶部选择“比较运行”。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b1fc054c84fd1c52cadda8a2c8bd2bc1.png作者截图从这里你应该能够根据图像、图表、工件等比较运行。我个人推荐点击“并排”标签它允许你比较所有数值如超参数和指标。总体 更多文档总体来说实验跟踪是数据科学家在构建最有效的机器学习模型时日常工作中不可或缺的一部分。包括 MLFlow、DVC、Neptune.ai 和 ClearML 在内的多种流行平台可供选择。为了本文的目的我选择展示 Neptune因为我曾在工作中使用过它并发现它很容易设置。对于那些试图学习实验跟踪的人来说这是一个很好的起点。Neptune 的主要缺点是在完成第一个项目后它不再是免费的。大多数数据科学家都在多个项目上工作因此作为一个免费解决方案它并不是最佳选择。对于更经济实惠的工具最好寻找开源解决方案如 MLFlow。有时用户界面也可能有点难以导航因为选项太多。这可能会让人感到不知所措并且需要一些时间来习惯一切的位置。要深入了解 Neptune 以及我今天讨论的一些提供的内容请查看官方文档其中更详细地介绍了设置、入门和示例。感谢阅读