在 GitHub 上编辑

入门:指标、图表与参数

DVC 可以轻松跟踪 指标,使用 图表 可视化性能,并更新 参数。以下将介绍这些概念。

上述所有内容都可以组合成 实验,用于运行并比较你的机器学习项目的多个迭代版本。

收集指标与图表

首先,我们来看一下捕获这些机器学习属性值的机制。为我们的 早期流水线 添加一个最终的评估阶段:

$ dvc stage add -n evaluate \
  -d src/evaluate.py -d model.pkl -d data/features \
  -o eval \
  python src/evaluate.py model.pkl data/features

dvc stage add 会将这个新阶段写入 dvc.yaml 文件中:

evaluate:
  cmd: python src/evaluate.py model.pkl data/features
  deps:
    - data/features
    - model.pkl
    - src/evaluate.py
  outs:
    - eval

我们通过将 eval 目录设置为一个阶段输出,使用 DVC 缓存你的指标和图表文件,这与之前阶段添加输出的方式相同。这是最简单的方法,即使文件数量和大小不断增加,也不会影响你的 Git 历史记录。或者,你也可以更细粒度地配置,将某些指标文件或图表直接纳入 Git 跟踪,而其他文件仍由 DVC 管理。

evaluate.py 使用 DVCLive 将标量指标值(例如 AUC)和图表数据(例如 ROC 曲线)写入 eval 目录中的文件,DVC 可解析这些文件以在不同迭代间进行比较和可视化。默认情况下,DVCLive 会为你在 dvc.yaml 中配置指标和图表,但在本例中,我们通过编辑 dvc.yaml 来自定义配置,合并训练和测试图表。

为了合并训练和测试数据,并设置标题等其他自定义属性,首先需要在 src/evaluate.py 中禁用 DVCLive 的默认配置:找到 with Live(EVAL_PATH) as live:,并修改为 with Live(EVAL_PATH, dvcyaml=False) as live:。然后将以下自定义配置添加到 dvc.yaml 中:

metrics:
- eval/metrics.json
plots:
- ROC:
    template: simple
    x: fpr
    y:
      eval/plots/sklearn/roc/train.json: tpr
      eval/plots/sklearn/roc/test.json: tpr
- Confusion-Matrix:
    template: confusion
    x: actual
    y:
      eval/plots/sklearn/cm/train.json: predicted
      eval/plots/sklearn/cm/test.json: predicted
- Precision-Recall:
    template: simple
    x: recall
    y:
      eval/plots/sklearn/prc/train.json: precision
      eval/plots/sklearn/prc/test.json: precision
- eval/plots/images/importance.png

这种灵活定义自己的指标和图表配置的能力意味着,你甚至可以不使用 DVCLive,而是 自行生成 指标和图表数据!

让我们运行并保存这些更改:

$ dvc repro
$ git add .gitignore dvc.yaml dvc.lock eval
$ git commit -a -m "Create evaluation stage"

查看指标与图表

你可以通过命令行查看指标和图表,也可以在 VS Code 中加载项目,并使用 DVC 扩展 查看指标、图表等内容。

你可以使用 dvc metrics show 查看被跟踪的指标:

$ dvc metrics show
Path                    avg_prec.test    avg_prec.train    roc_auc.test    roc_auc.train
eval/metrics.json  0.94496          0.97723           0.96191         0.98737

你可以使用 dvc plots show(如下所示)查看图表,该命令会生成一个可在浏览器中打开的 HTML 文件。

$ dvc plots show
file:///Users/dvc/example-get-started/dvc_plots/index.html

plots importance get started show

稍后我们将了解如何 比较和可视化不同的流水线迭代。现在,先来看看如何捕获另一个对比较非常有用的重要信息:参数。

定义阶段参数

数据科学流水线中通常会包含配置文件,用于定义可调节的参数以训练模型、进行预处理等。DVC 提供了一种机制,使各个阶段能够依赖于此类配置文件(支持 YAML、JSON、TOML 和 Python 格式)中特定部分的值。

幸运的是,我们的 dvc.yaml 中应该已经有一个带有参数的阶段:

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

featurize 阶段是通过这个 dvc stage add 命令创建的。请注意传递给 -p 选项(即 --params 的缩写)的参数:

$ dvc stage add -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

params 部分定义了 featurize 阶段对参数的依赖关系。默认情况下,DVC 会从 params.yaml 文件中读取这些值(featurize.max_featuresfeaturize.ngrams)。但与指标和图表一样,参数文件的名称和结构也可以由用户根据具体情况进行自定义。

以下是我们的 params.yaml 文件内容:

prepare:
  split: 0.20
  seed: 20170428

featurize:
  max_features: 100
  ngrams: 1

train:
  seed: 20170428
  n_est: 50
  min_split: 2

更新参数并迭代

我们显然对目前得到的 AUC 值不满意!让我们编辑 params.yaml 文件,改用二元语法(bigrams),并增加特征数量:

 featurize:
-  max_features: 100
-  ngrams: 1
+  max_features: 200
+  ngrams: 2

dvc.yaml 的优势在于,你现在只需运行以下命令即可:

$ dvc repro

它将分析变更,利用 运行缓存 中已有的结果,仅执行生成新结果(模型、指标、图表)所需的命令。

同样的逻辑适用于其他可能的调整——修改源代码、更新数据集——你完成更改后,只需使用 dvc repro,DVC 就会自动运行必要的步骤。

比较不同迭代

最后,让我们看看这些更新如何提升了性能。DVC 提供了一些命令来查看和可视化指标、参数及图表的变化。这些命令可以针对单次或多次流水线迭代进行操作。现在我们来比较当前的“bigrams”运行与上次提交的“baseline”迭代:

$ dvc params diff
Path         Param                   HEAD  workspace
params.yaml  featurize.max_features  100   200
params.yaml  featurize.ngrams        1     2

dvc params diff 可显示工作区中的参数与上次提交之间的差异。

dvc metrics diff 对指标执行类似的操作:

$ dvc metrics diff
Path               Metric          HEAD     workspace    Change
eval/metrics.json  avg_prec.test   0.9014   0.925        0.0236
eval/metrics.json  avg_prec.train  0.95704  0.97437      0.01733
eval/metrics.json  roc_auc.test    0.93196  0.94602      0.01406
eval/metrics.json  roc_auc.train   0.97743  0.98667      0.00924

最后,我们可以用一条命令比较所有图表(为简化起见,此处仅展示其中一部分):

$ dvc plots diff
file:///Users/dvc/example-get-started/plots.html

plots importance get started diff

有关其选项的更多信息,请参阅 dvc plots diff

这些命令还支持传入 Git 版本(提交记录、标签、分支名称)来进行比较。

内容

🐛 发现问题?告诉我们!或者修复它:

在 GitHub 上编辑

有疑问?加入我们的聊天,我们会为您提供帮助:

Discord 聊天