机器学习实验跟踪与Neptune工具使用指南

在机器学习领域,工程师们经常面临一个挑战:即使经过无数次迭代和参数调优,构建了一个表现优异的模型,也可能因为遗漏了一个微小的超参数而无法复现结果。为了避免这种情况,记录实验过程中的每一个细节变得至关重要。

在任何机器学习项目中,达到良好的性能是最困难的部分,这就需要进行多次实验,调整不同的参数,并跟踪每一个实验。谁也不想浪费时间去寻找过去得到的那个好模型——一个包含所有实验的仓库可以让这个过程变得轻松。

一个小小的alpha值变化,模型的准确率就能达到顶峰——捕捉对模型所做的微小变化及其相关的指标,可以节省大量时间。将所有实验汇总到一个平台上,实验跟踪帮助比较所有不同的运行,将所有信息汇总到一个平台上。

否只需要跟踪机器学习模型的参数?答案是不。当运行任何机器学习实验时,理想情况下应该跟踪多个方面,以便于复现实验并得到一个优化的模型:

# 代码:用于运行实验的代码 # 数据:保存用于训练和评估的数据版本 # 环境:保存环境配置文件,如 'Dockerfile', 'requirements.txt' 等 # 参数:保存模型使用的各种超参数 # 指标:记录所有实验运行的训练和验证指标

为什么不使用Excel表格?虽然都喜欢Excel表格,因为它非常方便!但是,当进行有限次数的迭代时,将所有实验信息记录在Excel表格中是可行的。无论是数据科学的新手还是专家,都知道在同时进行多个版本的数据、不同的模型超参数、众多笔记本版本等情况下,构建机器学习模型的过程是多么繁琐,这使得手动记录变得不切实际。

幸运的是,有许多工具可以帮助。Neptune就是这样一个工具,可以帮助在项目中跟踪所有的机器学习实验。让看看它在实际操作中的表现!

要在Python中安装Neptune,可以运行以下命令:

pip install neptune-client

导入Neptune客户端,可以使用以下代码:

import neptune.new as Neptune

是否需要凭证?需要将凭证传递给neptune.init()方法,以便将元数据记录到Neptune中。

run = neptune.init(project='', api_token='')

可以通过登录来创建一个新项目,然后获取项目名称和API令牌。

在Neptune中记录参数,使用iris数据集,并应用随机森林分类器到数据集上。随后使用Neptune记录模型的参数和指标。

from sklearn.datasets import load_iris from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import f1_score from joblib import dump data = load_iris() X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.4, random_state=1234) params = {'n_estimators': 10, 'max_depth': 3, 'min_samples_leaf': 1, 'min_samples_split': 2, 'max_features': 3} clf = RandomForestClassifier(**params) clf.fit(X_train, y_train) y_train_pred = clf.predict_proba(X_train) y_test_pred = clf.predict_proba(X_test) train_f1 = f1_score(y_train, y_train_pred.argmax(axis=1), average='macro') test_f1 = f1_score(y_test, y_test_pred.argmax(axis=1), average='macro')

要记录上述模型的参数,可以使用之前初始化的run对象:

run['parameters'] = params

Neptune还允许在创建run对象时跟踪代码和环境:

run = neptune.init(project='stateasy005/iris', api_token='', source_files=['*.py', 'requirements.txt'])

也可以记录训练和评估指标:

run['train/f1'] = train_f1 run['test/f1'] = test_f1

是否有快捷方式一次性记录所有内容?可以创建一个分类器模型的摘要,它将自动捕获模型的不同参数、诊断图表、包含实际预测的测试文件夹、预测概率以及所有类别的不同分数,如精确度、召回率、支持等。

import neptune.new.integrations.sklearn as npt_utils run["cls_summary "] = npt_utils.create_classifier_summary(clf, X_train, X_test, y_train, y_test)

这将在Neptune UI中创建以下文件夹:

文件夹里面有什么?

‘诊断图表’文件夹非常有用,因为可以用一行代码在分类器摘要上评估实验,使用多个指标。

‘所有参数’文件夹包含模型的不同超参数。这些超参数有助于比较模型在一组值下的表现,并在调整它们后进行比较。跟踪超参数还有助于在需要时回到完全相同的模型(具有相同的超参数值)。

训练好的模型也会以‘.pkl’文件的形式保存,以便以后使用。‘测试’文件夹包含测试数据集上的预测、预测概率和分数。

对于回归和聚类,可以使用Neptune获得类似的摘要:

import neptune.new.integrations.sklearn as npt_utils run['rfr_summary'] = npt_utils.create_regressor_summary(rfr, X_train, X_test, y_train, y_test)

对于聚类,也可以使用以下代码创建摘要:

import neptune.new.integrations.sklearn as npt_utils run['kmeans_summary'] = npt_utils.create_kmeans_summary(km, X, n_clusters=5)

这里,km是k-means模型的名称。

如何将数据上传到Neptune?可以使用以下代码将csv文件记录到运行中,并在Neptune UI上查看它们:

run['test/preds'].upload('path/to/test_preds.csv')

上传到Neptune的工件:使用matplotlib、plotly等库绘制的任何图表也可以记录到Neptune。

import matplotlib.pyplot as plt plt.plot(data) run["dataset/distribution"].log(plt.gcf())

为了以后以编程方式下载相同的文件,可以使用‘run’对象的下载方法:

run['artifacts/images'].download()

最后的想法:本文试图涵盖为什么实验跟踪至关重要,以及Neptune如何帮助促进这一点,从而提高进行不同机器学习实验时的生产力。本文专注于机器学习实验跟踪,但也可以使用Neptune进行代码版本控制、笔记本版本控制、数据版本控制和环境版本控制。

当然,网上还有很多类似的库可用于跟踪运行,将在下一篇文章中尝试介绍。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485