使用 MinIO SDK 自动化机器学习数据准备

Automated Data Prep for ML with MinIO's SDK

在机器学习中,高效且自动化的数据准备的重要性怎么强调都不为过,并且经常被概括为熟悉的格言:“垃圾进,垃圾出”。这突显了数据质量在决定机器学习模型成功与否方面起到的关键作用。

随着数据集在规模和复杂性上不断扩大,对稳健的数据管道的需求也变得越来越重要。这些管道对于确保机器学习模型的质量和准确性至关重要。

对于企业来说,一个具有变革意义的方面是能够在边缘开发和部署数据准备管道。这种能力提高了灵活性和可扩展性,使机器学习工程师能够在各种平台上部署管道——从个人硬件到地区或分支机构管理的数据中心,甚至扩展到电信机房。正如本教程中所示,可扩展性允许这些管道从小规模开始,并在任何商用硬件上无缝扩展。

本教程作为使用MinIO(一个高性能、开源的兼容S3-API的对象存储系统)和MinIO的Python SDK构建稳健数据管道的指南。

在当前数据隐私问题日益严重的环境下,建立内部控制措施是不可谈判的。本教程重点强调在整个数据准备过程中保护敏感信息的最佳实践。

跟随本教程,建立您对这些核心原则的基础,我们将一起探讨自动化数据准备、边缘部署和数据隐私考虑因素的复杂性。

先决条件

在开始之前,请确保您的系统上已安装以下先决条件

Docker

Docker Compose

如果您是从头开始,可以使用适合您平台的Docker Desktop安装程序安装这两者。您可以通过运行以下命令检查是否已安装Docker:

docker-compose --version

启动MinIO

要开始,请克隆教程git仓库

在终端窗口中,cd到仓库中的minio-ml-data-prep目录并运行以下命令

docker-compose up minio

执行此命令时,它将启动MinIO服务,使MinIO服务器能够通过docker-compose.yml文件中定义的配置端口和端点访问。

在浏览器中,导航到http://127.0.0.1:9001并使用默认凭据登录MinIO控制台:用户名minioadmin和密码minioadmin

创建桶

在MinIO在一个终端窗口中运行时,打开第二个终端窗口并再次导航到minio-ml-data-prep目录。执行以下命令:

docker-compose up init-minio

此命令执行Python脚本init-minio.py。此脚本使用MinIO Python SDK与MinIO服务器交互,负责创建两个桶rawclean(如果它们不存在)。

以下是脚本执行的操作分解

  • 桶创建函数
    • create_bucket_if_not_exists函数检查指定的桶是否存在。如果桶不存在,它将使用make_bucket创建桶并打印成功消息。如果桶已存在,它将打印一条消息指示桶已存在。
  • 创建raw和clean桶
    • 然后,脚本调用create_bucket_if_not_exists函数两次,一次用于raw桶,一次用于clean桶。这确保了在需要时创建这两个桶。
  • 错误处理
    • 脚本使用try-except块包含错误处理,以捕获并在桶创建期间可能发生的任何S3Error中打印错误。这确保了脚本优雅地处理潜在的问题,例如网络问题或凭据错误。

导航到http://127.0.0.1:9001以检查rawclean桶是否已成功创建。

生成数据并填充桶

接下来,在终端窗口中执行以下命令:

docker-compose up generate-data

此命令执行一个Python脚本generate-and-upload-fake-data.py,该脚本生成包含个人识别信息(PII)的伪造数据,将其本地保存为Parquet文件,然后将这些文件上传到MinIO raw桶,演示了将数据基本导入MinIO对象存储系统的过程。

以下是脚本执行操作的进一步分解

  • 生成伪造数据
    • generate_fake_data函数使用Faker库创建包含各种伪造数据字段的字典。字段包括姓名、电子邮件、地址、电话号码、社会安全号码(SSN)、随机字符串、随机数以及员工详细信息,如职位、部门、薪资和入职日期。
  • 将数据保存为Parquet
    • save_as_parquet函数获取生成的伪造数据并将其保存为Parquet文件。它将数据转换为Pandas DataFrame,然后转换为Pyarrow表,最后将其写入data目录中的Parquet文件。
  • 上传到MinIO
    • upload_to_minio函数将本地Parquet文件上传到MinIO桶。它计算文件大小,以二进制模式打开文件,并使用MinIO客户端将对象上传到指定的桶,并使用给定的对象名称。
  • 生成和上传多个文件
    • generate_and_upload_to_minio函数迭代指定次数(默认为10)以生成伪造数据,将其保存为Parquet文件,并将它们上传到MinIO raw桶。
  • 指定MinIO raw桶
    • 脚本将MinIO raw桶名称指定为raw

导航到http://127.0.0.1:9001以检查raw桶是否已成功填充数据。

转换您的数据

执行以下命令以清理您生成的数据

docker-compose up data-transform

此命令执行一个脚本,该脚本自动执行擦除个人识别信息的过程。它读取存储在raw MinIO桶中的数据,然后将擦除后的数据上传到clean桶。这演示了数据准备工作流程中重要的数据隐私步骤

PII擦除函数

  • scrub_pii函数获取Pandas DataFrame(数据)并删除个人识别信息(PII)字段,例如姓名、电子邮件、地址、电话号码和SSN。

擦除并上传到MinIO

  • scrub_and_upload_to_minio函数迭代指定数量的文件(默认为10)。对于每个文件,它执行以下操作
    • 将Parquet文件从MinIO上的raw桶下载到本地目录。
    • 将Parquet文件读入Pandas DataFrame。
    • 应用scrub_pii函数以从DataFrame中删除PII。
    • 将擦除后的DataFrame转换回Pyarrow表。
    • 将擦除后的表写入本地目录中的新Parquet文件。
    • 将擦除后的Parquet文件上传到MinIO上的clean桶。

查看

如果您想更深入地查看您的文件以确保它们正在正确转换,您可以对从MinIO下载的文件之一运行以下脚本

您可以通过编程方式或通过控制台下载文件。

import pandas as pd
import pyarrow.parquet as pq

def print_parquet(file_path, num_rows=5):
   # Read Parquet file into a pyarrow Table
   table = pq.read_table(file_path)

   # Extract a Pandas DataFrame from the Table
   df = table.to_pandas()

   # Set display options to show all columns without truncation
   pd.set_option('display.max_columns', None)
   pd.set_option('display.expand_frame_repr', False)

   # Print the first few rows of the DataFrame
   print(df.head(num_rows))

# Specify the path to your Parquet file
parquet_file_path = "path/to/your/file.parquet"

# Print the first 5 rows of the Parquet file with tidy column display
print_parquet(parquet_file_path)

当您在clean.parquet文件上运行脚本时,您将在终端中看到如下输出

关闭

当您准备好删除容器、卷和生成的数据时,请运行以下命令

docker-compose down

扩展您构建的内容

本教程引导您逐步了解使用MinIO的SDK进行机器学习自动数据准备的基本方面。

现在,在您构建和探索了这些数据管道之后,请考虑如何在此基础上进行扩展。探索集成其他数据源、实施高级转换或增强现有隐私和安全措施的方法。本教程是一个起点,鼓励您根据机器学习项目的独特需求和挑战进行创新和自定义这些管道。

继续探索 MinIO SDK 和对象存储系统的功能,尝试不同类型的数据,并关注该领域最新的进展。通过在此教程中学到的知识,您将掌握机器学习自动化数据准备的技巧。

如有任何问题或意见,请发送邮件至 hello@min.io 或加入我们的 Slack 频道。编码愉快!