入门:指标、图表与参数
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
稍后我们将了解如何 比较和可视化不同的流水线迭代。现在,先来看看如何捕获另一个对比较非常有用的重要信息:参数。
定义阶段参数
数据科学流水线中通常会包含配置文件,用于定义可调节的参数以训练模型、进行预处理等。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_features
和 featurize.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
有关其选项的更多信息,请参阅
dvc plots diff
。
这些命令还支持传入 Git 版本(提交记录、标签、分支名称)来进行比较。