这个实践练习将引导你配置一个基础的机器学习训练脚本,使用 MLflow Python API 来记录参数、指标和模型工件。它说明了 MLflow 追踪的应用。一个来自 scikit-learn 的常见示例有助于将重心保持在追踪过程上。请确保你已安装 MLflow 和 scikit-learn (pip install mlflow scikit-learn)。1. 基准训练脚本首先,我们来看看一个在 Iris 数据集上训练逻辑回归模型,但没有使用 MLflow 追踪的简单脚本。这作为我们的起点。# baseline_train.py import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score # 加载数据 iris = load_iris() X, y = iris.data, iris.target # 划分数据 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 定义模型参数(这些是我们将来会追踪的) solver = 'liblinear' C = 1.0 # 正则化强度的倒数 random_state = 42 # 训练模型 model = LogisticRegression(solver=solver, C=C, random_state=random_state) model.fit(X_train, y_train) # 进行预测 y_pred = model.predict(X_test) # 评估模型 accuracy = accuracy_score(y_test, y_pred) print(f"Parameters:") print(f" solver: {solver}") print(f" C: {C}") print(f" random_state: {random_state}") print(f"Metrics:") print(f" Accuracy: {accuracy:.4f}") # 在实际情况中,你可能会在此处保存模型 # joblib.dump(model, 'model.joblib')运行这个脚本 (python baseline_train.py) 只是将参数和最终准确率打印到控制台。如果你用不同的参数再次运行它,除非你手动记录它们,否则之前的结果会丢失。这正是 MLflow 要解决的问题。2. 使用 MLflow 配置脚本现在,我们来修改脚本以使用 MLflow 追踪。导入 MLflow: 在开头添加 import mlflow 和 import mlflow.sklearn。开始一个 MLflow 运行: 使用 with mlflow.start_run(): 块来封装训练和评估逻辑。在此块中记录的所有内容都将属于一个 MLflow 运行。记录参数: 使用 mlflow.log_param() 来记录此次特定运行所用的超参数(例如 solver、C、random_state)。记录指标: 使用 mlflow.log_metric() 来记录评估结果(例如 accuracy)。记录模型: 使用 mlflow.sklearn.log_model() 将训练好的 scikit-learn 模型保存为与该运行相关的工件。此函数处理序列化并保存必要的元数据。以下是修改后的脚本:# mlflow_train.py import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score # 导入 MLflow import mlflow import mlflow.sklearn # 可选:设置实验名称。如果不存在,则会创建。 # 如果不设置,运行将进入“默认”实验。 mlflow.set_experiment("Iris Classification") # 加载数据 iris = load_iris() X, y = iris.data, iris.target # 划分数据 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 定义模型参数 solver = 'liblinear' C = 1.0 random_state = 42 # 开始一个 MLflow 运行 with mlflow.start_run(): print("开始 MLflow 运行...") # 记录参数 mlflow.log_param("solver", solver) mlflow.log_param("C", C) mlflow.log_param("random_state", random_state) print(f" 已记录参数:solver={solver}, C={C}, random_state={random_state}") # 训练模型 model = LogisticRegression(solver=solver, C=C, random_state=random_state) model.fit(X_train, y_train) # 进行预测 y_pred = model.predict(X_test) # 评估模型 accuracy = accuracy_score(y_test, y_pred) # 记录指标 mlflow.log_metric("accuracy", accuracy) print(f" 已记录指标:accuracy={accuracy:.4f}") # 记录训练好的模型工件 # 'model' 是运行工件存储中的目录名称 # 'iris_logistic_regression' 是注册模型的名称(可选,用于模型注册表) mlflow.sklearn.log_model(model, "model", registered_model_name="iris_logistic_regression") print(" 已记录模型工件") print("MLflow 运行完成。") print("脚本执行完成。")3. 运行追踪的脚本现在,从终端执行配置好的脚本:python mlflow_train.py你将看到与基准脚本相似的输出,但会附带额外的消息,表明 MLflow 正在记录。请注意,默认情况下,MLflow 会在你运行脚本的同一位置创建一个本地 mlruns 目录。这个目录保存了你运行的元数据和工件。4. 在 MLflow UI 中查看结果为了直观地查看和比较你的运行,启动 MLflow 追踪 UI。在终端中进入包含 mlruns 文件夹的目录,然后运行:mlflow ui这个命令会启动一个本地 Web 服务器,通常在 http://127.0.0.1:5000。在你的 Web 浏览器中打开此 URL。在 UI 中,你应该看到:实验: 在左侧面板中,找到“Iris Classification”实验(如果你跳过了 mlflow.set_experiment,则为“Default”)。运行: 选择实验会显示一个列出所有运行的表格。由于你只运行过一次脚本,因此会有一条记录。运行详情: 点击运行的开始时间以查看其详情。参数: 你将看到你记录的 solver、C 和 random_state 值。指标: accuracy 分数将显示出来。如果你记录了随时间变化的指标(例如,每个周期的损失),你还可以查看图表。工件: 你将看到“model”工件。点击它会显示 MLflow 为你的 scikit-learn 模型保存的文件(包括 model.pkl、conda.yaml、python_env.yaml 和 MLmodel)。5. 进一步实验追踪多次运行会带来真正的益处。尝试修改 mlflow_train.py 脚本:修改 C 的值(例如 C = 0.5)。修改 solver(例如 solver = 'saga',但请注意,你可能需要更多的 max_iter 才能收敛)。每次更改后再次运行脚本。然后,刷新 MLflow UI。你将看到表格中列出了新的运行。你现在可以:排序运行: 点击列标题(如“accuracy”)来找到表现最佳的运行。筛选运行: 使用搜索框根据参数或指标筛选运行(例如 params.C = "0.5" 或 metrics.accuracy > 0.95)。比较运行: 使用复选框选择多个运行,然后点击“比较”按钮。这会提供它们的参数、指标和图表的并行视图,从而更容易地查看哪些发生了变化以及它如何影响了结果。这个实践练习展示了 MLflow 追踪的核心流程:配置你的训练代码以记录参数、指标和工件,然后使用 UI 来查看和比较你的实验。采纳这种做法,你就能创建了一个系统化的模型工作记录,显著提高了可复现性,并让有效地迭代模型变得更简单。