MLflow、MLOps、数据科学
数据是机器学习过程中最关键的组成部分之一。事实上,训练模型时使用的数据质量往往决定了整个项目的成败。虽然算法和模型很重要,但如果没有准确、干净且能代表您要解决的问题的数据,它们就无能为力。无论您处理的是结构化数据、非结构化数据还是大规模数据集,数据的准备和理解都为任何机器学习系统奠定了基础。精心策划的数据集可以为模型有效学习提供必要的信号,而不良或有偏差的数据可能会导致错误的预测、过度拟合,甚至在模型部署到实际应用中时产生有害的社会影响。
随着机器学习工作流程的日益复杂,确保实验的可重复性和可追溯性已成为关键问题。这是哪里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.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.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_predeval_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.评估
探索默认评估器的全部功能。它提供了一系列有价值的指标以及有用的可视化效果。
请注意,如果您正在使用 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 等工具记录数据集,您可以确保实验透明、可重复且稳健,从而帮助建立对机器学习结果的信任。
总之,数据集是机器学习的核心,记录它们对于任何 MLOps 工作流程中的跟踪、可重复性和透明度至关重要。MLflow™毫升流数据
模块提供了必要的工具,以确保捕获、记录数据旅程的每一步并可检索以供将来使用,从而确保一致性并提高机器学习实验的整体可靠性。
这是Github 存储库获取文章中的所有代码!
- 记录数据集
mlflow.log_input()
应用程序编程接口:这用于记录您的训练数据,确保捕获所有相关元数据,以便在实验中实现可追溯性和可重复性。 - 评估时记录数据集
mlflow.evaluate()
应用程序编程接口:这用于评估您的模型并自动记录关键性能指标,帮助您在评估期间跟踪模型的有效性。
请随意在评论中分享您的想法。我喜欢了解数据并反思(撰写)我在实际应用中学到的知识。如果您喜欢这篇文章,请点赞以表示您的支持。您可以通过以下方式联系我领英如果您还有更多要讨论的。另外,请随时在 Medium 上关注我,以获取更多数据科学文章!
快来数据科学游乐场玩吧!