快速入门DVC(六):指标跟踪、更新训练参数以及可视化模型表现

1,340 阅读1分钟

这是我参与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 rundvc.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.jsonprc.jsonroc.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

image.png image.png

我们保存这个迭代,以便稍后进行比较:

 $ 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_featuresfeaturize.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

image.png image.png

总结

本文讲述了dvc metricsdvc plots等命令,DVC 使用这些命令使得跟踪指标、更新参数和使用图表可视化模型表现变得容易。