收集模型指标
首先,让我们看看获取这些 ML 属性值的机制是什么。 我们在之前的流水线中最后再添加一个评估 Stage:
$ dvc run -n evaluate \ -d src/evaluate.py -d model.pkl -d data/features \ -M scores.json \ --plots-no-cache prc.json \ --plots-no-cache roc.json \ python src/evaluate.py model.pkl \ data/features scores.json prc.json roc.json 复制代码
其中,-M
参数指定了一个指标文件,而 --plots-no-cache
参数指定了一个不会被 DVC 缓存的图表文件(由这个 Stage 生成)。 dvc run
在 dvc.yaml
文件中生成了一个新的 Stage:
evaluate: cmd: python src/evaluate.py model.pkl data/features ... deps: - data/features - model.pkl - src/evaluate.py metrics: - scores.json: cache: false plots: - prc.json: cache: false - roc.json: cache: false 复制代码
这个 Stage 与我们流水线中前几个 Stage 的最大区别在于两个新的部分:指标和图表。 这些指标和图表用于标记某些包含 机器学习“遥测”数据(ML "telemetry") 的文件。 指标文件包含标量值(例如:AUC)和图表文件包含用于可视化和比较的矩阵和一系列数据(例如: ROC 曲线或模型损失图)。
当这些参数使用 cache: false
,DVC 跳过缓存进行输出,因为我们希望 score.json
、prc.json
和 roc.json
由 Git 进行版本控制。
evaluate.py
Python 文件将模型的 ROC-AUC 和平均精度(AP)写入 score.json
文件,然后,使用 -M
将其标记为指标文件。 其内容如下:
{ "avg_prec": 0.5204838673030754, "roc_auc": 0.9032012604172255 } 复制代码
同时,evaluate.py
Python 文件还将精度、召回率和阈值数组(使用 sklearn 的precision_recall_curve
函数获得)写入图表文件 prc.json
:
{ "prc": [ { "precision": 0.021473008227975116, "recall": 1.0, "threshold": 0.0 }, ..., { "precision": 1.0, "recall": 0.009345794392523364, "threshold": 0.6 } ] } 复制代码
类似地,它将 sklearn 的 roc_curve
函数生成的的数组写入 roc.json
以获得额外的图表。
DVC 不强制您使用任何特定的文件名,也不强制使用指标或图表文件的格式或结构。 它完全由用户根据具体使用场景定义。
您可以使用 DVC 查看跟踪的指标和图表。
首先,我们查看生成的指标:
$ dvc metrics show Path avg_prec roc_auc scores.json 0.52048 0.9032 复制代码
接下来,我们查看图表:
查看图表之前,需要指定用作坐标轴的数组。我们只需要这样操作一次,DVC 将保存我们的图表配置。
$ dvc plots modify prc.json -x recall -y precision Modifying stage 'evaluate' in 'dvc.yaml' $ dvc plots modify roc.json -x fpr -y tpr Modifying stage 'evaluate' in 'dvc.yaml' 复制代码
现在,我们来查看图表:
$ dvc plots show file:///Users/dvc/example-get-started/plots.html 复制代码
我们保存这个迭代,以便稍后进行比较:
$ git add scores.json prc.json roc.json $ git commit -a -m "Create evaluation stage" 复制代码
稍后我们将看到如何比较和可视化不同的流水线迭代。
现在,我们来看看如何获取另一个对比较非常有用的重要信息:参数。
定义流水线 Stage 的参数
数据科学流水线包含定义可以修改的参数(以训练模型、进行预处理等操作)的配置文件是很常见的。
DVC 为 Stage 提供了一种机制,以依赖于此类配置文件(YAML、JSON、TOML 和 Python 格式均支持)的特定部分的值 。
幸运的是,我们已经在 dvc.yaml
中有一个带有参数的 Stage :
featurize: cmd: python src/featurization.py data/prepared data/features deps: - data/prepared - src/featurization.py params: - featurize.max_features - featurize.ngrams outs: - data/features 复制代码
我们来回忆一下这个 Stage 是如何生成的?
featurize
Stage 是使用下面的 dvc run
命令创建的:
dvc run -n featurize \ -p featurize.max_features,featurize.ngrams \ -d src/featurization.py -d data/prepared \ -o data/features \ python src/featurization.py data/prepared data/features 复制代码
注意: 指定 -p
参数(--params
的缩写),params
部分定义了 featurize
Stage 的参数依赖关系。 默认情况下,DVC 从 params.yaml
文件中读取这些值(featurize.max_features
和 featurize.ngrams
)。 但是,与指标和图表一样,参数文件名和结构也可以由用户根据使用场景自定义。
下面是我们的 params.yaml
文件的内容:
prepare: split: 0.20 seed: 20170428 featurize: max_features: 500 ngrams: 1 train: seed: 20170428 n_est: 50 min_split: 2 复制代码
更新 Stage 参数并进行流水线迭代
我们对目前获得的 AUC 指标值绝对不满意!
让我们编辑 params.yaml
文件以使用bigrams
并增加特征数量:
featurize: - max_features: 500 - ngrams: 1 + max_features: 1500 + ngrams: 2 复制代码
dvc.yaml 的美妙之处在于您现在需要做的就是运行dvc repro
命令:
dvc repro 复制代码
它将分析更改的部分,使用运行缓存中现有的结果,执行所需的命令并生成新结果(模型、指标、图)。
相同的逻辑适用于其他可能的调整(编辑源代码、更新数据集),您进行更改之后、使用 dvc repro
命令,然后 DVC 运行需要的内容。
比较流水线进行两次迭代的结果
最后,让我们看看更新操作是否提高模型的表现。
DVC 有一些命令可以查看指标、参数和图表的变化并使其可视化。 这些命令可以用于一个或多个流水线的迭代。 让我们将当前的"bigrams"运行结果与上次提交的"baseline"迭代结果进行比较:
dvc params diff
可以显示工作区中的参数与上次提交的差异。
$ dvc params diff Path Param HEAD workspace params.yaml featurize.max_features 500 1500 params.yaml featurize.ngrams 1 2 复制代码
dvc metrics diff
对指标执行相同的操作,显示工作区中的指标与上次提交的差异:
dvc metrics diff Path Metric HEAD workspace Change scores.json avg_prec 0.52048 0.55259 0.03211 scores.json roc_auc 0.9032 0.91536 0.01216 复制代码
最后,我们可以用一个命令比较PR曲线和ROC曲线!
$ dvc plots diff file:///Users/dvc/example-get-started/plots.html 复制代码
总结
本文讲述了dvc metrics
与dvc plots
等命令,DVC 使用这些命令使得跟踪指标、更新参数和使用图表可视化模型表现变得容易。