在机器学习领域,工程师们经常面临一个挑战:即使经过无数次迭代和参数调优,构建了一个表现优异的模型,也可能因为遗漏了一个微小的超参数而无法复现结果。为了避免这种情况,记录实验过程中的每一个细节变得至关重要。
在任何机器学习项目中,达到良好的性能是最困难的部分,这就需要进行多次实验,调整不同的参数,并跟踪每一个实验。谁也不想浪费时间去寻找过去得到的那个好模型——一个包含所有实验的仓库可以让这个过程变得轻松。
一个小小的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进行代码版本控制、笔记本版本控制、数据版本控制和环境版本控制。
当然,网上还有很多类似的库可用于跟踪运行,将在下一篇文章中尝试介绍。