英语轻松读发新版了,欢迎下载、更新

如何使用 MLflow 记录数据

2025-01-19 17:04:43 英文原文

作者:Jack Chang

MLflow、MLOps、数据科学

掌握 MLOps 中 AI 工作流程的数据记录

Jack Chang

Towards Data Science

摄影:克里斯·利维拉尼未飞溅

数据是机器学习过程中最关键的组成部分之一。事实上,训练模型时使用的数据质量往往决定了整个项目的成败。虽然算法和模型很重要,但如果没有准确、干净且能代表您要解决的问题的数据,它们就无能为力。无论您处理的是结构化数据、非结构化数据还是大规模数据集,数据的准备和理解都为任何机器学习系统奠定了基础。精心策划的数据集可以为模型有效学习提供必要的信号,而不良或有偏差的数据可能会导致错误的预测、过度拟合,甚至在模型部署到实际应用中时产生有害的社会影响。

随着机器学习工作流程的日益复杂,确保实验的可重复性和可追溯性已成为关键问题。这是哪里MLOps(机器学习操作)开始发挥作用。MLOps 是将数据科学和操作结合起来以自动化和简化机器学习工作流程的实践。MLOps 的一个关键方面是在机器学习项目的整个生命周期中跟踪数据集。跟踪不仅仅是捕获模型的参数和指标;记录流程每个阶段使用的数据集同样重要。这确保了在重新评估或重新训练模型时,可以引用、测试或重用相同的数据集。它可以更好地比较结果、理解变化,最重要的是,确保结果可以被其他人重现。作为现代机器学习系统的最佳实践,我建议世界各地的所有机器学习从业者在训练期间记录他们的数据。

昨天的数据与今天的数据?

在此背景下,ML流通过提供一套有助于简化这些 MLOps 实践的工具,发挥着关键作用。MLflow 的关键组件之一是毫升流数据模块,它提供了记录数据集作为机器学习实验的一部分的能力。毫升流数据模块确保数据集得到正确记录,跟踪其元数据,并且可以在将来的运行中检索和重用它们。这有助于防止“数据漂移”等常见问题,即模型由于底层数据的细微变化而开始表现变差。MLflow 能够跟踪数据集以及模型和参数,确保任何新实验都可以使用完全相同的数据可靠地将结果与之前的运行进行比较,从而提供透明度和清晰度。

摄影:布赖恩·麦高恩未飞溅

本文将以加州住房数据集为例,指导您完成在 MLflow 中记录数据集的最佳实践。我们将探索毫升流数据界面并演示如何在 ML 实验期间跟踪和管理数据集。

想象一下,您是一名数据科学家,正在从事一个项目,根据收入中位数、人口和位置等各种特征来预测加利福尼亚州的房价。您花费了数小时从多个来源整理数据集、清理数据并确保其准备好进行训练。现在您已准备好运行机器学习实验。在此阶段记录数据集至关重要,因为它充当此特定训练运行中使用的确切数据的快照。如果您需要在几个月后重新访问实验(可能是为了改进模型、调整超参数或审核结果),您需要确保使用相同的数据集来保持一致性和可比性。如果不记录数据集,很容易丢失所使用的数据版本,尤其是当数据随着时间的推移而更新或更改时。

话不多说,让我们开始吧!

在本地设置 MLflow 服务器非常简单。使用以下命令:

mlflow 服务器 --主机 127.0.0.1 --端口 8080

然后设置跟踪 URI。

mlflow.set_tracking_uri("http://127.0.0.1:8080")

更高级的配置可以参考MLflow 文档

摄影:罗伯特·拜伊未飞溅

在本文中,我们使用加州住房数据集(CC BY 许可证)。但是,您可以应用相同的原则来记录和跟踪您选择的任何数据集。

有关加州住房数据集的更多信息,请参阅这个文档

mlflow.data.dataset.数据集

在深入研究数据集记录、评估和检索之前,了解 MLflow 中数据集的概念非常重要。MLflow 提供mlflow.data.dataset.数据集对象,表示 MLflow Tracking 中使用的数据集。

类 mlflow.data.dataset.Dataset(源:mlflow.data.dataset_source.DatasetSource,名称:可选[str] = None,摘要:Optional[str] = None)

该对象具有关键属性:

  • 一个必需的参数,来源(数据集的数据源为mlflow.data.dataset_source.DatasetSource目的)
  • 消化(数据集的指纹)和姓名(数据集的名称),可以通过参数设置。
  • 图式轮廓描述数据集的结构和统计属性。
  • 有关数据集的信息来源,例如其存储位置。

您可以使用以下命令轻松地将数据集转换为字典to_dict()或使用 JSON 字符串to_json()

支持流行的数据集格式

MLflow 通过扩展核心的专用类,可以轻松处理各种类型的数据集mlflow.data.dataset.数据集。在撰写本文时,以下是 MLflow 支持的一些著名数据集类:

  • 熊猫:mlflow.data.pandas_dataset.PandasDataset
  • 数值模拟:mlflow.data.numpy_dataset.NumpyDataset
  • 火花:mlflow.data.spark_dataset.SparkDataset
  • 抱脸:mlflow.data.huggingface_dataset.HuggingFaceDataset
  • TensorFlow:mlflow.data.tensorflow_dataset.TensorFlowDataset
  • 评估数据集:mlflow.data.evaluation_dataset.EvaluationDataset

所有这些课程都配有方便的mlflow.data.from_*用于将数据集直接加载到 MLflow 中的 API。这使得构建和管理数据集变得很容易,无论其底层格式如何。

mlflow.data.dataset_source.DatasetSource

mlflow.data.dataset.DatasetSource类用于表示 MLflow 中数据集的来源。当创建一个mlflow.data.dataset.数据集对象,即来源参数可以指定为字符串(例如文件路径或 URL)或指定为mlflow.data.dataset.DatasetSource班级。

类 mlflow.data.dataset_source.DatasetSource

如果提供一个字符串作为来源,MLflow内部调用解析数据集源功能。该函数迭代预定义的数据源列表并数据集源类来确定最合适的源类型。然而,MLflow 准确解析数据集来源的能力是有限的,尤其是当候选人来源参数(潜在来源列表)设置为没有任何,这是默认值。

如果数据集源类无法解析原始源,会引发 MLflow 异常。为了获得最佳实践,我建议显式创建并使用mlflow.data.dataset.DatasetSource定义数据集来源时的类。班级

  • HTTP数据集源(数据集来源)班级
  • Delta数据源(数据集来源)班级
  • 文件系统数据集源(数据集来源)班级
  • HuggingFace数据集源(数据集来源)班级
  • Spark数据集源(数据集来源)摄影:
克劳迪奥·施瓦茨未飞溅在 MLflow 中记录数据集的最直接方法之一是通过

mlflow.log_input()API。这允许您以与以下兼容的任何格式记录数据集mlflow.data.dataset.数据集,这在管理大规模实验时非常有帮助。

分步指南

首先,我们获取加州住房数据集并将其转换为pandas.DataFrame以便于操作。在这里,我们创建一个结合了特征数据的数据框(加利福尼亚数据)和目标数据(加利福尼亚_目标)。

加州住房 = fetch_加州住房()
california_data: pd.DataFrame = pd.DataFrame(california_housing.data, columns=california_housing.feature_names)
california_target: pd.DataFrame = pd.DataFrame(california_housing.target, columns=['目标'])

california_housing_df: pd.DataFrame = pd.concat([california_data, california_target], axis=1)

为了使用有意义的元数据记录数据集,我们定义了一些参数,例如数据源 URL、数据集名称和目标列。这些将为稍后检索数据集时提供有用的上下文。

如果我们更深入地观察fetch_california_housing 源代码,我们可以看到数据来源于https://www.dcc.fc.up.pt/~ltorgo/Regression/cal_housing.tgz。dataset_source_url: str = 'https://www.dcc.fc.up.pt/~ltorgo/Regression/cal_housing.tgz'

dataset_source: DatasetSource = HTTPDatasetSource(url=dataset_source_url)
dataset_name: str = '加州住房数据集'
数据集_目标:str = '目标'
数据集_标签 = {
“描述”:california_housing.DESCR,
}
一旦定义了数据和元数据,我们就可以将

pandas.DataFrame进入一个mlflow.data.数据集目的。数据集:PandasDataset = mlflow.data.from_pandas(

df=california_housing_df、源=数据集_源、目标=数据集_目标、名称=数据集_名称

print(f'数据集名称: {dataset.name}')

print(f'数据集摘要:{dataset.digest}')
print(f'数据集源:{dataset.source}')
print(f'数据集架构:{dataset.schema}')
print(f'数据集配置文件:{dataset.profile}')
print(f'数据集目标:{dataset.targets}')
print(f'数据集预测:{dataset.predictions}')
打印(数据集.df.head())
示例输出:

数据集名称:加州住房数据集

数据集摘要:55270605
数据集源:<mlflow.data.http_dataset_source.HTTPDatasetSource 对象位于 0x101153a90>
数据集模式:['MedInc':double(必需),'HouseAge':double(必需),'AveRooms':double(必需),'AveBedrms':double(必需),'Population':double(必需),'
AveOccup': double (必填), '纬度': double (必填), '经度': double (必填),‘目标’:双(必填)]
数据集配置文件:{'num_rows':20640,'num_elements':185760}
数据集目标:目标
数据集预测:无
MedInc HouseAge AveRooms AveBedrms 人口 AveOccup 纬度 经度 目标
0 8.3252 41.0 6.984127 1.023810 322.0 2.555556 37.88 -122.23 4.526
1 8.3014 21.0 6.238137 0.971880 2401.0 2.109842 37.86 -122.22 3.585
2 7.2574 52.0 8.288136 1.073446 496.0 2.802260 37.85 -122.24 3.521
3 5.6431 52.0 5.817352 1.073059 558.0 2.547945 37.85 -122.25 3.413
4 3.8462 52.0 6.281853 1.081081 565.0 2.181467 37.85 -122.25 3.422

请注意,您甚至可以将数据集转换为字典以访问其他属性,例如源类型:

对于 dataset.to_dict().items() 中的 k,v:
打印(f“{k}:{v}”)
名称:加州住房数据集
摘要:55270605
来源:{“url”:“https://www.dcc.fc.up.pt/~ltorgo/Regression/cal_housing.tgz”}
源类型:http
模式:{“mlflow_colspec”:[{“类型”:“双”,“名称”:“MedInc”,“必需”:true},{“类型”:“双”,“名称”:“HouseAge”,“必需": true}, {"type": "double", "name": "AveRooms", "required": true}, {"type": "double", "name":"AveBedrms", "required": true}, {"type": "double", "name": "人口", "required": true}, {"type": "double", "name": "AveOccup", "required": true}, {"type": "double", "name": "纬度", "required": true}, {"type": "double", "name": "经度","required": true}, {"type": "double", "name": "Target", "required": true}]}
配置文件:{“num_rows”:20640,“num_elements”:185760}

现在我们已经准备好了数据集,是时候将其记录到 MLflow 运行中了。这使我们能够捕获数据集的元数据,使其成为实验的一部分以供将来参考。

使用 mlflow.start_run():
mlflow.log_input(数据集=数据集,上下文='训练',标签=dataset_tags)
查看运行 sassy-jay-279:http://127.0.0.1:8080/#/experiments/0/runs/5ef16e2e81bf40068c68ce536121538c
查看实验:http://127.0.0.1:8080/#/experiments/0

让我们探索 MLflow UI () 中的数据集。您会发现默认实验下列出了您的数据集。在使用的数据集部分,您可以查看数据集的上下文,在本例中被标记为用于训练。此外,还将显示数据集的所有相关字段和属性。

MLflow UI 中的训练数据集;来源:我

恭喜!您已经记录了您的第一个数据集!

摄影:迪诺·赖希穆斯未飞溅

让我们继续我们的旅程,探索如何使用mlflow.evaluate()API。该功能将数据集与 MLflow 的评估框架集成在一起,于ML流2.8.0。MLflow 早期版本的用户将无法使用此功能。

分步指南

首先,让我们对加州住房数据进行训练测试分割:

X_train, X_test, y_train, y_test = train_test_split(california_data, california_target, test_size=0.25, random_state=42)

对于这一部分,我们将使用类似的元数据来创建训练数据集,但请注意,训练数据集和评估数据集具有不同的名称。

Training_dataset_name: str = '加州住房培训数据集'
训练数据集目标:str = '目标'
eval_dataset_name: str = '加州住房评估数据集'
eval_dataset_target: str = '目标'
eval_dataset_prediction: str = '预测'

对于建模,让我们拟合随机森林回归模型。

模型 = RandomForestRegressor(random_state=42)
model.fit(X_train, y_train.to_numpy().flatten())

模型训练完成后,我们需要准备评估数据集。这mlflow.data.from_pandas()函数将用于创建此数据集,该数据集将传递给mlflow.evaluate()模型评估函数。请注意,预测此处指定参数以指示包含模型预测输出的列。

y_test_pred: pd.Series = model.predict(X=X_test)
eval_df: pd.DataFrame = X_test.copy()
eval_df[eval_dataset_target] = y_test.to_numpy().flatten()
eval_df[eval_dataset_prediction] = y_test_pred

eval_dataset: PandasDataset = mlflow.data.from_pandas(
df=eval_df、目标=eval_dataset_target、名称=eval_dataset_name、预测=eval_dataset_prediction

准备好训练和评估数据集后,就可以使用 MLflow 记录模型并评估其性能了。

mlflow.sklearn.autolog()
使用 mlflow.start_run():
mlflow.log_input(dataset=training_dataset, context='training')

mlflow.sklearn.log_model(模型,artifact_path='rf',input_example=X_test)

结果 = mlflow.evaluate(
数据=评估数据集,
预测=无,
model_type='回归器',

print(f'指标: {结果.指标}')

默认评估器此处使用,它会自动记录几个重要指标:

example_count、mean_absolute_error、mean_squared_error、root_mean_squared_error、sum_on_target、mean_on_target、r2_score、max_error、mean_absolute_percentage_error

这些指标可以在 MLflow UI 中运行的实验的指标部分找到。我建议使用不同的模型类型进行试验mlflow.评估探索默认评估器的全部功能。它提供了一系列有价值的指标以及有用的可视化效果。

使用 mlflow.evaluate 进行回归指标;来源:我

请注意,如果您正在使用 MLflowPandas数据集,您必须使用以下命令指定包含模型预测输出的列预测中的参数mlflow.data.from_pandas()功能。打电话时mlflow.evaluate(), 放预测 = 无因为预测列已经包含在数据集中。这确保了正确的集成和评估。

示例输出:

2025/01/16 15:11:36 信息 mlflow.models.evaluation.default_evaluator:测试第一行的指标...
2025/01/16 15:11:37 INFO mlflow.models.evaluation.evaluators.shap:使用形状解释器 ExactExplainer。
指标:{'example_count':5160,'mean_absolute_error':np.float64(0.32909333102713195),'mean_squared_error':np.float64(0.2545599452819612),'root_mean_squared_error':np.float64(0.5045393396772557),'sum_on_target':np.float64(10646.03931999994),'mean_on_target':np.float64(2.0631859147286704),'r2_score':0.8076205696273513,'max_error':np.float64(3.626845299999994),'mean_absolute_percentage_error':np.float64(0.1909308987066793)}
查看运行 bouncy-fox-193:http://127.0.0.1:8080/#/experiments/0/runs/65b25856e28142fd85c54b38db4f2b3d
查看实验:http://127.0.0.1:8080/#/experiments/0

让我们前往 MLflow UI 查看结果。您将看到我们的评估数据集已在与训练相同的运行中成功记录。因此,运行现在包含训练数据集和评估数据集。

MLflow UI 中的评估数据集;来源:我

记录数据集不仅对于可重复性至关重要,而且对于问责制也至关重要。例如,如果您在医疗保健或金融等受监管行业工作,则必须证明用于训练模型的数据符合特定标准,并且在没有适当跟踪的情况下不会被更改。在协作项目中,能够共享数据集日志还有助于更有效地协作和共享结果。通过使用 MLflow 等工具记录数据集,您可以确保实验透明、可重复且稳健,从而帮助建立对机器学习结果的信任。

总之,数据集是机器学习的核心,记录它们对于任何 MLOps 工作流程中的跟踪、可重复性和透明度至关重要。MLflow™毫升流数据模块提供了必要的工具,以确保捕获、记录数据旅程的每一步并可检索以供将来使用,从而确保一致性并提高机器学习实验的整体可靠性。

这是Github 存储库获取文章中的所有代码!

摄影:乔丹·科马克未飞溅
  • 记录数据集mlflow.log_input()应用程序编程接口:这用于记录您的训练数据,确保捕获所有相关元数据,以便在实验中实现可追溯性和可重复性。
  • 评估时记录数据集mlflow.evaluate()应用程序编程接口:这用于评估您的模型并自动记录关键性能指标,帮助您在评估期间跟踪模型的有效性。

请随意在评论中分享您的想法。我喜欢了解数据并反思(撰写)我在实际应用中学到的知识。如果您喜欢这篇文章,请点赞以表示您的支持。您可以通过以下方式联系我领英如果您还有更多要讨论的。另外,请随时在 Medium 上关注我,以获取更多数据科学文章!

快来数据科学游乐场玩吧!

关于《如何使用 MLflow 记录数据》的评论


暂无评论

发表评论

摘要

记录数据集是任何机器学习项目中的关键步骤,因为它可以确保实验的透明度、可重复性和可追溯性。在本文中,我们将探讨如何使用 MLflow 的“mlflow.data”模块来记录训练和评估数据集。我们将涵盖两个主要方面:1. **使用 `mlflow.log_input()` API 记录训练数据集**2. **使用“mlflow.evaluate()”评估模型时记录评估数据集**让我们深入了解细节。### 1. 使用 `mlflow.log_input()` 记录训练数据集要记录训练数据集,您可以使用“mlflow.data”模块创建数据集对象,然后使用“mlflow.log_input”记录它。这是一个例子:````蟒蛇导入流量# 将数据定义为 pandas DataFrametrain_data = pd.DataFrame({'feature_1': [0.1, 0.2, 0.3],“标签”:[1,0,1]})# 使用mlflow.data创建数据集对象数据集 = mlflow.data.from_pandas(train_data)# 使用 MLflow 记录数据集使用 mlflow.start_run() 运行:mlflow.log_input(数据集,上下文=“训练”)````这会记录训练数据及其元数据。记录的数据集将显示在相应实验下的 MLflow UI 中。### 2. 使用“mlflow.evaluate()”评估模型时记录评估数据集要记录评估数据集并在模型评估期间自动获取性能指标,您可以使用“mlflow.evaluate”。这是一个例子:````蟒蛇导入流量从 sklearn.datasets 导入 load_breast_cancer从 sklearn.model_selection 导入 train_test_split从 sklearn.ensemble 导入 RandomForestClassifier# 加载乳腺癌数据集数据 = load_breast_cancer()X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2, random_state=42)# 训练模型(随机森林分类器)模型 = RandomForestClassifier(random_state=42)model.fit(X_train, y_train)# 创建评估数据集eval_data = pd.DataFrame(X_test, columns=data.feature_names)eval_labels = pd.Series(y_test)# 使用 mlflow.data.from_pandas 记录评估数据集使用 mlflow.start_run() 运行:eval_dataset = mlflow.data.from_pandas(eval_data)mlflow.log_input(eval_dataset,上下文=“评估”)# 评估模型和日志指标结果 = mlflow.evaluate(型号=型号,数据=评估数据集,目标=评估标签,评估者=[“默认”])````在这个例子中:- 我们加载乳腺癌数据集并将其分为训练集和评估集。- 我们训练一个“RandomForestClassifier”。- 我们使用“mlflow.data.from_pandas”为评估数据创建一个 MLflow PandasDataset。- 我们使用“mlflow.log_input”记录评估数据集,然后评估模型。### 默认评估器记录的重要指标当您在“mlflow.evaluate”中使用“default”评估器时,会自动记录几个重要指标:- **example_count**:用于评估的示例数量。- **均值绝对误差**、**均方误差**、**均方根误差**- **目标总和**,**目标平均值**- **r2_分数**- **最大错误**- **平均绝对百分比误差**这些指标提供了模型性能的全面概述。### 输出示例当您运行评估时,MLflow 会记录以下指标:````蟒蛇指标={“示例计数”:5160,'mean_absolute_error': np.float64(0.32909333102713195),'mean_squared_error': np.float64(0.2545599452819612),'root_mean_squared_error': np.float64(0.5045393396772557),'sum_on_target': np.float64(10646.03931999994),'mean_on_target': np.float64(2.0631859147286704),'r2_score':0.8076205696273513,'最大错误': np.float64(3.626845299999994),'mean_absolute_percentage_error': np.float64(0.1909308987066793)}````### 记录数据集的好处- **可重复性**:您可以轻松地重复您的实验。- **问责制**:跟踪用于培训和评估的数据。- **审计跟踪**:跟踪数据集随时间的变化。通过记录训练和评估数据集,您可以确保您的 ML 项目透明、可重现且记录齐全。这对于维持机器学习工作流程的高质量和可靠性标准至关重要。### 结论使用 MLflow 的“mlflow.data”模块来记录数据集,为跟踪数据沿袭和全面评估模型提供了一个强大的框架。通过利用“mlflow.log_input()”和“mlflow.evaluate()”,您可以确保您的实验有详细记录、可重复且可靠。当您继续处理您的项目时,请随意探索 MLflow 的更多高级功能!如果您有任何疑问或需要进一步帮助,请访问社区论坛或文档。快乐编码!🚀````蟒蛇# 示例:使用 `mlflow.log_input()` 通过 MLflow 记录数据集导入流量从 sklearn.datasets 导入 load_boston从 sklearn.model_selection 导入 train_test_split从 sklearn. Linear_model 导入 LinearRegression将 pandas 导入为 pd# 加载波士顿住房数据集并将其分为训练集和评估集波士顿数据 = load_boston()X_train, X_val, y_train, y_val = train_test_split(boston_data.data, boston_data.target, test_size=0.2)# 训练线性回归模型模型=线性回归()model.fit(X_train, y_train)# 将评估数据转换为pandas DataFrameeval_data = pd.DataFrame(X_val, columns=boston_data.feature_names)eval_labels = pd.Series(y_val)# 记录训练数据集使用 mlflow.start_run() 运行:train_dataset = mlflow.data.from_pandas(pd.DataFrame(X_train, columns=boston_data.feature_names))mlflow.log_input(train_dataset, context="training")# 评估模型和日志指标eval_result = mlflow.evaluate(型号=型号,数据=评估数据,目标=评估标签,评估者=[“默认”])# 显示记录的指标打印(评估结果.指标)````此示例演示如何训练线性回归模型、将数据集拆分为训练集和评估集、使用 MLflow 记录两个数据集以及评估模型的性能。然后显示评估的指标。有关更高级的用例和其他功能,请参阅 [MLflow 文档](https://mlflow.org/docs/latest/index.html)。愉快地尝试 MLflow!🚀🚀🚀