这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战
在上一篇文章快速入门DVC(五):数据流水线中,讲述了如何完成一个机器学习模型训练流水线,以及如何重现机器学习模型。本文接下来将讲述 DVC 如何进行模型指标跟踪、修改训练参数重新训练以及使用图表可视化模型表现。
收集模型指标
首先,让我们看看获取这些 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 使用这些命令使得跟踪指标、更新参数和使用图表可视化模型表现变得容易。