ZenML项目实战:构建你的第一个机器学习流水线

ZenML项目实战:构建你的第一个机器学习流水线

zenml ZenML 🙏: Build portable, production-ready MLOps pipelines. https://zenml.io. zenml 项目地址: https://gitcode.com/gh_mirrors/ze/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的核心概念包括:

  1. 步骤(Step):代表机器学习工作流中的一个独立单元,如数据加载、预处理或模型训练
  2. 流水线(Pipeline):将多个步骤连接起来形成完整的工作流
  3. 工件(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文件配置流水线参数:

  1. 首先生成配置模板:
training_pipeline.write_run_configuration_template(path='configs/pipeline_config.yaml')
  1. 编辑生成的YAML文件:
parameters:
    gamma: 0.01
  1. 运行配置好的流水线:
training_pipeline = training_pipeline.with_options(
    config_path='configs/pipeline_config.yaml'
)
training_pipeline()

最佳实践建议

  1. 模块化设计:将每个功能单元拆分为独立的步骤,便于复用和维护
  2. 类型注解:使用Python类型注解明确步骤的输入输出类型
  3. 日志记录:使用Python标准库的logging模块记录步骤执行信息
  4. 配置分离:将超参数等可变部分提取到配置文件中
  5. 版本控制:将配置文件和代码一起纳入版本控制

通过ZenML构建的机器学习流水线不仅提高了开发效率,还确保了实验的可重复性和结果的可追溯性。随着项目复杂度的增加,你还可以进一步探索ZenML提供的缓存、版本控制、模型部署等高级功能。

zenml ZenML 🙏: Build portable, production-ready MLOps pipelines. https://zenml.io. zenml 项目地址: https://gitcode.com/gh_mirrors/ze/zenml

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郎轶诺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值