代码组织与重构

DVC 数据版本管理入门

Ravi Bhadauria

Machine Learning Engineer

原型代码 vs 生产代码

  • 原型代码便于快速迭代
  • 但不适合生产环境
    • 未测试,易出错
    • 非模块化,重复代码多
    • 难以复现
DVC 数据版本管理入门

优质生产代码的特性

  • 复现性:可在不同环境与时间重得相同输出

  • 模块化:由独立、可测试的模块组成

  • 一致性:参数单一可信来源

    • 使用配置/参数文件

展示生产代码三大特性的示意图

DVC 数据版本管理入门

配置文件与 YAML

  • 文件须为受支持格式

    • YAML、JSON、TOML、Python
    • 默认为 params.yaml
  • 我们将使用 YAML

    • YAML 即 "YAML Ain't Markup Language"
    • 用于在语言/应用间传递数据的标准格式
    • 简洁清晰
    • 扩展名:.yaml.yml
1 https://dvc.org/doc/command-reference/params#description
DVC 数据版本管理入门

YAML 语法

  • 用字典指定参数

    • 键和值用 : 分隔
  • 注释以 # 开头

  • 数据类型:

    • 整数、浮点、字符串
  • 数据结构:

    • 数组
    • 嵌套字典
  • 缩进很重要

# 键值对
a: 1
b: 1.2
c: "String value"
# 数组
a: [1, 2.2, 3, 4.8]
b:
  - 5
  - "String value"
# 嵌套字典
a:
  b: "Some value"
  c: "Some other value"
DVC 数据版本管理入门

示例配置文件

# 数据预处理参数
preprocess:
  ...
  target_column: RainTomorrow
  categorical_features:
    - Location
    - WindGustDir
    - ...

# 模型训练/评估参数 train_and_evaluate: rfc_params: n_estimators: 2 ...
DVC 数据版本管理入门

模块化函数示例

# 在 model.py 中
def evaluate_model(model, X_test, y_test):
    """在测试集上评估模型并返回指标。"""
    y_pred = model.predict(X_test)
    precision = precision_score(y_test, y_pred)
    ...
    return { "accuracy": accuracy, "precision": precision,
        "recall": recall, "f1_score": f1 }
# 在入口代码(train_and_evaluate.py)中
from model import evaluate_model
metrics = evaluate_model(model, X_test, y_test)
DVC 数据版本管理入门

示例项目代码结构

机器学习仓库中的代码布局示意图

DVC 数据版本管理入门

Passons à la pratique !

DVC 数据版本管理入门

Preparing Video For Download...