news 2026/6/1 16:21:14

跟踪你的机器学习实验

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
跟踪你的机器学习实验

原文: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 运行:

run=neptune.init_run(project="your-project-name",api_token="your-token",)

这个运行对象将成为您与 Neptune UI 通信的焦点。当您首次登录 Neptune 并创建一个新项目时,他们应该会提供类似于上面的代码片段,并填写您的凭据。如果没有,只需复制并粘贴我的模板。

查看 Neptune 的快速入门指南这里以获取更详细的说明和故障排除信息。

数据信息

我在这个示例中使用的数据集是一个包含温度和风速等附加特征的能量消耗时间序列数据集。我的数据集的具体细节对于这个教程来说并不重要,主要要知道的是,我使用时间序列数据集进行了一个回归任务(而不是分类任务)。

在加载我的数据集后,我最先记录的是与数据集相关的指标,例如:

  • 数据集的平均值、中位数和众数

  • 数据集的开始和结束日期(如果这是一个时间序列数据集)

  • 训练集和测试集的大小(每行的数量)

# Train and test sizestrain_size=int(df.shape[0]*0.8)df_train=df.iloc[0:train_size]df_test=df.iloc[train_size:]test_size=df_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 modelbst=xgb.XGBRegressor(n_estimators=100)# 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_test=bst.predict(X_test)# Turn predictions into dataframetest_predictions_df=pd.DataFrame(predicted_test,columns=['Predictions'])# Upload as htmlrun["test/predictions"].upload(File.as_html(test_predictions_df))

记录指标,如 MSE、RMSE 和 R²,可以说是实验跟踪最重要的部分之一。如果不跟踪这些指标,就无法知道你的模型是否在改进。Neptune 提供了一个 get_scores()方法,根据你的模型类型(例如回归器或分类器)将输出相关的分数。对于单输出回归器,此方法将跟踪:

  • 解释方差

  • 最大误差

  • 均方绝对误差(MAE)

多输出回归器将跟踪:

并且分类器将跟踪:

  • 精确度

  • 召回率

  • 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 r2=r2_score(y_test.values,predicted_test)mse=mean_squared_error(y_test.values,predicted_test)rmse=mean_squared_error(y_test.values,predicted_test,squared=False)mape=mean_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_chart

  • create_feature_importance_chart

  • create_residuals_chart

  • create_prediction_error_chart

  • create_cooks_distance_chart

  • create_classification_report_chart

  • create_confusion_matrix_chart

  • create_roc_auc_chart

  • create_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 gofig=go.Figure([go.Line(x=y_test.index,y=predicted_test,name='predicted'),go.Line(x=y_test.index,y=y_test.values,name='actual')])# 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 以及我今天讨论的一些提供的内容,请查看官方文档,其中更详细地介绍了设置、入门和示例。


感谢阅读!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/1 16:20:20

大一要不要加实验室/工作室?对就业和考研的帮助

加了可能累成狗,不加可能后悔四年。这篇帮你理性决策。👋 你好,我是 Evan,一名计算机专业的学长,也是《大一突围》专栏的作者。大一开学时,学长学姐们纷纷安利各种实验室、工作室:“加了这个&am…

作者头像 李华
网站建设 2026/6/1 16:20:13

DuckDuckGo字体自定义指南:从CSS原理到跨平台设置实战

1. 项目概述:为什么我们需要自定义网页字体?作为一名长期与网页界面打交道的前端开发者,我深知字体对于用户体验的“隐形”影响力。它远不止是屏幕上显示的几个字符那么简单。想象一下,你每天花数小时在搜索引擎上查找资料、阅读信…

作者头像 李华
网站建设 2026/6/1 16:19:51

Forza Painter终极指南:3步实现专业级车辆涂装导入

Forza Painter终极指南:3步实现专业级车辆涂装导入 【免费下载链接】forza-painter Import images into Forza 项目地址: https://gitcode.com/gh_mirrors/fo/forza-painter 想要在《极限竞速:地平线》系列中打造独一无二的车辆外观吗&#xff1f…

作者头像 李华
网站建设 2026/6/1 16:19:09

Python实战:构建棒球FIP计算器,量化投手真实表现

1. 项目概述与FIP统计量解析在棒球数据分析,尤其是评估投手表现时,我们常常会遇到一个难题:如何剥离队友防守水平的影响,去衡量投手自身的“真实”压制力?传统的自责分率(ERA)虽然直观&#xff…

作者头像 李华