ZenML项目实战:构建你的第一个机器学习流水线
在机器学习项目的开发过程中,如何将数据处理、模型训练和评估等环节组织成可重复、可维护的流程是一个常见挑战。ZenML作为一个开源的机器学习操作(MLOps)框架,提供了构建标准化机器学习流水线的解决方案。本文将带你从零开始,使用ZenML构建完整的机器学习流水线。
准备工作
在开始之前,请确保你已经安装了ZenML及其必要组件:
pip install "zenml[server]"
zenml login --local # 启动本地仪表盘
建议为你的项目创建一个新的目录并初始化ZenML环境:
mkdir my_ml_project
cd my_ml_project
zenml init
理解ZenML核心概念
ZenML的核心概念包括:
- 步骤(Step):代表机器学习工作流中的一个独立单元,如数据加载、预处理或模型训练
- 流水线(Pipeline):将多个步骤连接起来形成完整的工作流
- 工件(Artifact):步骤之间传递的数据对象
构建简单流水线
让我们从一个基础示例开始,了解如何定义步骤和流水线:
from zenml import pipeline, step
@step
def load_data() -> dict:
"""模拟加载训练数据和标签"""
training_data = [[1, 2], [3, 4], [5, 6]]
labels = [0, 1, 0]
return {'features': training_data, 'labels': labels}
@step
def train_model(data: dict) -> None:
"""模拟模型训练过程"""
total_features = sum(map(sum, data['features']))
total_labels = sum(data['labels'])
print(f"使用{len(data['features'])}个数据点训练模型。"
f"特征总和为{total_features}, 标签总和为{total_labels}")
@pipeline
def simple_ml_pipeline():
"""定义连接各步骤的流水线"""
dataset = load_data()
train_model(dataset)
if __name__ == "__main__":
run = simple_ml_pipeline()
将上述代码保存为run.py
并执行:
python run.py
执行后,你可以在本地仪表盘中查看流水线运行的详细信息,包括各步骤的执行状态、耗时以及传递的工件。
构建完整机器学习工作流
现在,让我们扩展这个简单示例,构建一个基于Iris数据集的完整分类模型流水线。
1. 安装必要依赖
pip install matplotlib scikit-learn
zenml integration install sklearn -y
2. 定义数据加载步骤
from typing_extensions import Annotated
from typing import Tuple
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import logging
@step
def training_data_loader() -> Tuple[
Annotated[pd.DataFrame, "X_train"],
Annotated[pd.DataFrame, "X_test"],
Annotated[pd.Series, "y_train"],
Annotated[pd.Series, "y_test"],
]:
"""加载Iris数据集并分割为训练集和测试集"""
logging.info("加载Iris数据集...")
iris = load_iris(as_frame=True)
logging.info("分割训练集和测试集...")
X_train, X_test, y_train, y_test = train_test_split(
iris.data, iris.target, test_size=0.2, shuffle=True, random_state=42
)
return X_train, X_test, y_train, y_test
3. 定义模型训练步骤
from sklearn.base import ClassifierMixin
from sklearn.svm import SVC
@step
def svc_trainer(
X_train: pd.DataFrame,
y_train: pd.Series,
gamma: float = 0.001,
) -> Tuple[
Annotated[ClassifierMixin, "trained_model"],
Annotated[float, "training_acc"],
]:
"""训练SVC分类器"""
model = SVC(gamma=gamma)
model.fit(X_train.to_numpy(), y_train.to_numpy())
train_acc = model.score(X_train.to_numpy(), y_train.to_numpy())
print(f"训练准确率: {train_acc}")
return model, train_acc
4. 组合成完整流水线
@pipeline
def training_pipeline(gamma: float = 0.002):
"""完整的训练流水线"""
X_train, X_test, y_train, y_test = training_data_loader()
svc_trainer(gamma=gamma, X_train=X_train, y_train=y_train)
if __name__ == "__main__":
training_pipeline(gamma=0.0015)
使用YAML配置流水线
在生产环境中,我们通常希望将配置与代码分离。ZenML支持通过YAML文件配置流水线参数:
- 首先生成配置模板:
training_pipeline.write_run_configuration_template(path='configs/pipeline_config.yaml')
- 编辑生成的YAML文件:
parameters:
gamma: 0.01
- 运行配置好的流水线:
training_pipeline = training_pipeline.with_options(
config_path='configs/pipeline_config.yaml'
)
training_pipeline()
最佳实践建议
- 模块化设计:将每个功能单元拆分为独立的步骤,便于复用和维护
- 类型注解:使用Python类型注解明确步骤的输入输出类型
- 日志记录:使用Python标准库的
logging
模块记录步骤执行信息 - 配置分离:将超参数等可变部分提取到配置文件中
- 版本控制:将配置文件和代码一起纳入版本控制
通过ZenML构建的机器学习流水线不仅提高了开发效率,还确保了实验的可重复性和结果的可追溯性。随着项目复杂度的增加,你还可以进一步探索ZenML提供的缓存、版本控制、模型部署等高级功能。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考