MLflow 可以把每次训练保存成一个独立 Run:参数记录“这次怎么训练”,指标记录“在什么数据上表现如何”,模型文件则让你以后能重新加载。下面用两组逻辑回归参数做本地实验,最后核对保存前后的预测是否一致。
适合已经能运行 Python、开始积累多个模型版本的人。这里使用 sklearn 自带的 Iris 教学数据,不是线上效果评测,也没有涉及生产部署或模型审批。

先把实验、Run 和文件分清
- Experiment:同一任务的实验集合,示例名称是
iris-parameter-check。 - Run:一次有明确参数和数据划分的训练,示例分别为 C=0.1 和 C=1.0。
- Metric:数值结果。本例用验证集准确率和宏平均 F1,名称里保留 validation,避免与训练集或正式测试集混淆。
- Artifact:需要保留的文件,例如数据划分清单。模型通过
log_model保存,后续使用返回的 model_uri 加载。
接口依据是 MLflow Tracking 官方快速入门与 sklearn 集成文档。本文手动记录参数和指标,读者可以明确看到每项结果来自哪里。
建立独立环境与固定工作目录
在空目录建立虚拟环境。本文代码在 Windows、Python 3.11.15、MLflow 3.16.1、scikit-learn 1.9.1、pandas 3.0.6、NumPy 2.4.6 下运行核验。保存脚本、执行脚本与启动界面时都留在同一个目录。
python -m venv .venv
# Windows PowerShell
.\.venv\Scripts\Activate.ps1
python -m pip install "mlflow==3.16.1" "scikit-learn==1.9.1" "pandas==3.0.6" "numpy==2.4.6"
macOS/Linux 激活命令为 source .venv/bin/activate。如果 PowerShell 限制脚本执行,可直接用 .\.venv\Scripts\python.exe 替代后续的 python,不必改变系统的长期执行策略。
代码显式使用 sqlite:///mlflow.db。这是当前工作目录里的 SQLite 数据库;模型和附件还有自己的存储文件。官方自托管说明指出,从 MLflow 3.7.0 开始,新环境的默认后端改为 SQLite,本文仍显式指定路径以免误读其他项目的记录。
保存为 train_tracking.py,记录两次训练
缩放器只在训练集拟合,两个 Run 共用同一组训练与验证索引。数据内容哈希帮助发现数据变更,split_manifest.json 则保留具体索引;仅记录随机种子不能解释后续数据顺序变化。
from pathlib import Path
import hashlib
import json
from importlib.metadata import version
import numpy as np
import pandas as pd
import mlflow
import mlflow.sklearn
from mlflow.models import infer_signature
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, f1_score
# 在同一个工作目录运行脚本和后续 MLflow 界面命令。
mlflow.set_tracking_uri("sqlite:///mlflow.db")
mlflow.set_experiment("iris-parameter-check")
data = load_iris(as_frame=True)
X, y = data.data, data.target
train_idx, val_idx = train_test_split(
np.arange(len(y)), test_size=0.3, random_state=42, stratify=y)
split = {"dataset": "sklearn.load_iris", "seed": 42,
"train_indices": train_idx.tolist(), "validation_indices": val_idx.tolist()}
Path("split_manifest.json").write_text(
json.dumps(split, indent=2), encoding="utf-8")
data_sha = hashlib.sha256(data.frame.to_csv(index=False).encode()).hexdigest()
records = []
for C in (0.1, 1.0):
with mlflow.start_run(run_name=f"C-{C}") as run:
mlflow.log_params({"C": C, "max_iter": 1000,
"split_seed": 42, "train_rows": len(train_idx)})
mlflow.set_tags({"dataset": "iris", "dataset_sha256": data_sha,
"purpose": "tutorial-validation"})
model = make_pipeline(StandardScaler(), LogisticRegression(C=C, max_iter=1000))
model.fit(X.iloc[train_idx], y.iloc[train_idx])
pred = model.predict(X.iloc[val_idx])
metrics = {
"validation_accuracy": accuracy_score(y.iloc[val_idx], pred),
"validation_macro_f1": f1_score(y.iloc[val_idx], pred, average="macro")}
mlflow.log_metrics(metrics)
mlflow.log_artifact("split_manifest.json")
info = mlflow.sklearn.log_model(
model, name="iris_pipeline",
signature=infer_signature(X.iloc[train_idx], model.predict(X.iloc[train_idx])),
input_example=X.iloc[train_idx[:3]],
pip_requirements=[f"{p}=={version(p)}" for p in
("scikit-learn", "skops", "numpy", "pandas")])
restored = mlflow.sklearn.load_model(info.model_uri)
np.testing.assert_array_equal(pred, restored.predict(X.iloc[val_idx]))
records.append({"run_id": run.info.run_id, "C": C,
"model_uri": info.model_uri, **metrics,
"reload_matches": True})
print(json.dumps(records[-1], ensure_ascii=False))
Path("run_results.json").write_text(json.dumps(records, indent=2), encoding="utf-8")
python train_tracking.py
每个 Run 会打印 run_id、C、验证指标和 model_uri。最后生成 run_results.json。reload_matches: true 来自保存模型重新加载后对同一验证输入的标签逐项比较;这证明本次保存与回读通过,不等于换机器、升级依赖后仍能直接复现。
本次教学运行中,C=0.1 的验证准确率约为 84.4%、宏平均 F1 约为 0.8443;C=1.0 分别约为 91.1% 和 0.9107。两组保存回读后的标签都一致。这些值只适用于此数据和划分,不能据此给真实任务选择 C。
重复运行脚本会创建新的 Run,不会覆盖原记录;run_name 可以相同,定位某次结果时使用唯一的 run_id。模型文件同时记录本例显式传入的依赖版本。
在界面中比较参数与结果
训练完成后,在同一目录、同一环境启动本地界面:
mlflow server --backend-store-uri sqlite:///mlflow.db --host 127.0.0.1 --port 5000
- 打开终端提示的本地地址,进入 Experiments,选择
iris-parameter-check。 - 对照两个 Run 的 C、validation_accuracy 和 validation_macro_f1。按相同指标比较,不把不同数据集的数字混在一起排名。
- 打开 Run 详情,确认 Parameters 和 Metrics 与 run_results.json 一致,Artifacts 中可以找到 split_manifest.json。
- 查看该 Run 关联的模型,核对输入签名和输入示例。复制脚本打印的 model_uri,用
mlflow.sklearn.load_model(model_uri)读取,避免手工猜存储位置。
如果看不到实验,先检查服务与脚本的工作目录及数据库路径是否一致;如果 5000 端口已占用,改为 5001,并访问对应地址。需要恢复全部结果时,应备份数据库和模型/附件存储,不能只复制 mlflow.db。
这套记录怎样用于自己的项目
把 Iris 输入换成自己的表格时,至少再记录数据版本、特征列表、标签定义、划分规则与代码版本。指标必须指明评估集,数据文件若含敏感内容,可以记录批准后的版本引用或摘要,而不是直接上传全部原始数据。
示例只用验证集比较两次训练。选定配置后仍需独立测试集做最终评估;若反复根据同一验证集挑配置,结果会越来越乐观。MLflow 负责保存实验记录,不会自动消除数据泄漏,也不代替模型质量判断。
本地示例未验证多人协作、身份权限、远程存储或部署兼容性。界面入口按官方流程说明;本文的实测范围是参数与指标写入、模型保存、重新加载及预测一致性。文档核验日期:2026-10-01。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30448.html