杰瑞科技汇

Python中如何高效加载数据集?

load_dataset 这个函数最常见、最强大的来源是 Hugging Face datasets,这个库提供了访问数千个数据集的便捷方式,是自然语言处理 领域事实上的标准工具之一。

Python中如何高效加载数据集?-图1
(图片来源网络,侵删)

下面我将分为几个部分来解释:

  1. 核心介绍:Hugging Face datasets
  2. 基本用法:加载数据集
  3. 常用参数和功能
  4. 数据处理和探索
  5. 其他来源的 load_dataset
  6. 总结与最佳实践

核心介绍:Hugging Face datasets

Hugging Face datasets 库是一个快速、易用且功能强大的工具,用于访问和共享数据集,它的主要优点包括:

  • 海量数据集:通过其 Hub,你可以轻松加载超过 10,000 个 NLP 数据集,以及越来越多的计算机视觉、音频等领域的多模态数据集。
  • 高效处理:数据集被设计为“内存映射”文件,即使数据集比你的可用内存大得多,也能高效处理,它还支持流式加载,可以逐条处理数据,而无需一次性加载全部。
  • 标准化 API:所有数据集都提供统一的 API,加载、访问、处理和分批数据的方式都非常一致。
  • 内置功能:自动处理数据清洗、分词、格式转换等繁琐步骤。

基本用法:加载数据集

你需要安装这个库:

pip install datasets

你就可以用一行代码加载数据集了,最简单的用法是只提供数据集的名称。

Python中如何高效加载数据集?-图2
(图片来源网络,侵删)

示例1:加载一个经典的数据集(如 imdb 电影评论情感分析数据集)

from datasets import load_dataset
# 加载数据集
dataset = load_dataset("imdb")
# 查看数据集的结构
print(dataset)

输出:

DatasetDict({
    train: Dataset({
        features: ['text', 'label'],
        num_rows: 25000
    })
    test: Dataset({
        features: ['text', 'label'],
        num_rows: 25000
    })
    unsupervised: Dataset({
        features: ['text', 'label'],
        num_rows: 25000
    })
})

从输出可以看出,load_dataset 返回一个 DatasetDict 对象,它包含多个 Dataset 对象(通常是 train, test, validation 等)。

示例2:访问数据集中的样本

你可以像访问字典一样访问数据集中的数据。

# 访问训练集中的第一个样本
first_sample = dataset['train'][0]
print(first_sample)

输出:

Python中如何高效加载数据集?-图3
(图片来源网络,侵删)
{'text': "I watched this movie for 10 minutes and could not stand it anymore. The plot is just plain bad, the acting is mediocre and the whole thing looks like a cheap TV soap opera. I gave this movie a 1 out of 10 because I am a very forgiving person, but really it deserves a 0. I can't understand why anyone would like this movie. It's just plain bad. I have seen better acting in a kindergarten play. The only good thing I can say about this movie is that it is not as bad as some other movies I have seen, but that's not saying much. Avoid this movie at all costs.", 'label': 0}

常用参数和功能

load_dataset 函数提供了许多有用的参数。

split 参数:指定加载哪个子集

默认情况下,它会加载所有子集,如果你只需要训练集或测试集,可以使用 split 参数。

# 只加载训练集
train_dataset = load_dataset("imdb", split="train")
# 只加载测试集的前1000个样本
small_test_dataset = load_dataset("imdb", split="test[:1000]")
# 只加载验证集的最后500个样本
val_dataset = load_dataset("imdb", split="validation[-500:]")
# 加载训练集和测试集,但不加载unsupervised
train_test_dataset = load_dataset("imdb", split=["train", "test"])
print(type(train_test_dataset)) # <class 'list'>

data_dirdata_files 参数:加载本地文件

如果你有自己的数据文件(如 CSV, JSON, TXT),可以使用这两个参数。

假设你有一个本地目录 my_local_data,结构如下:

my_local_data/
├── train.csv
├── test.csv

Python 代码:

# 使用 data_dir 指定目录
# load_dataset("csv", data_dir="my_local_data")
# 或者使用 data_files 明确指定文件路径
local_dataset = load_dataset("csv", data_files={"train": "my_local_data/train.csv", "test": "my_local_data/test.csv"})
print(local_dataset)

cache_dir 参数:指定缓存路径

datasets 库会自动下载并缓存数据集,以便下次加载时更快,你可以使用 cache_dir 指定缓存位置。

dataset = load_dataset("imdb", cache_dir="./my_cache")

数据处理和探索

加载数据后,通常需要进行一些预处理。

map 方法:应用函数到数据集

map 方法是 datasets 库的核心功能之一,它允许你对数据集中的每个样本应用一个函数。

from datasets import load_dataset
dataset = load_dataset("imdb")
# 定义一个预处理函数,将文本转换为大写
def to_uppercase(example):
    example['text'] = example['text'].upper()
    return example
# 使用 map 函数将这个函数应用到整个训练集
# batched=True 表示函数会批量处理数据,效率更高
dataset = dataset.map(to_uppercase, batched=True)
# 查看处理后的第一个样本
print(dataset['train'][0]['text'][:100] + "...")

set_format 方法:转换为 PyTorch/TensorFlow 张量

如果你想将数据集直接用于 PyTorch 或 TensorFlow,可以设置其格式。

import torch
# 将数据集的格式设置为 PyTorch 张量
# columns 参数指定哪些列需要转换为张量
dataset.set_format(type="torch", columns=["text", "label"])
# 现在可以直接访问张量
sample = dataset['train'][0]
print(sample['text'].shape) # 注意:文本数据通常还不是张量,需要先分词
print(sample['label'])      # label 已经是标量张量

注意:上面的 text 列还不是张量,因为它还是字符串,在实际应用中,你需要使用 Hugging Face 的 Tokenizer 将文本转换为数字 ID。

cast_column 方法:转换列的数据类型

# 将 label 列从 int64 转换为 int32
dataset = dataset.cast_column("label", "int32")

其他来源的 load_dataset

虽然 Hugging Face 的版本是最主流的,但其他库也可能有同名或类似功能的函数。

sklearn.datasets

Scikit-learn 库也有自己的数据加载函数,但通常不叫 load_dataset,而是更具体的名称,如 load_iris, load_digits, load_breast_cancer 等。

from sklearn.datasets import load_iris
# sklearn 的加载方式
iris_data = load_iris()
# 它返回的是一个类似字典的对象,而不是 Hugging Face 的 DatasetDict
print(iris_data.keys())
print(iris_data.data.shape)

torchvision.datasets

PyTorch 的 torchvision 库也提供了许多计算机视觉数据集的加载函数。

from torchvision import datasets
# torchvision 的加载方式
mnist_data = datasets.MNIST(root='./data', train=True, download=True)
# 它返回的是一个 torch.utils.data.Dataset 对象
print(len(mnist_data))
# 一个样本是 (image, label) 的元组
image, label = mnist_data[0]
print(image.size(), label)

重要区别

  • Hugging Face datasets:现代、高效、API 统一,尤其适合大规模数据和 NLP。
  • sklearn / torchvision:更传统,与各自的机器学习框架深度集成,适合中小规模数据和特定领域的经典数据集。

总结与最佳实践

特性 Hugging Face datasets sklearn.datasets / torchvision.datasets
主要用途 NLP, 多模态,大规模数据集 机器学习,计算机视觉,经典小数据集
核心对象 DatasetDict, Dataset 字典, Dataset (PyTorch), Bunch (sklearn)
内存效率 非常高 (内存映射, 流式加载) 较低 (通常全部加载到内存)
API 一致性 非常高 (所有数据集 API 相同) 较低 (不同数据集加载函数不同)
生态系统 transformers, tokenizers 紧密集成 sklearn, torch 模型紧密集成

最佳实践建议:

  1. 优先使用 datasets.load_dataset:特别是当你处理 NLP 任务或需要处理大型数据集时,它是目前最灵活、最高效的选择。
  2. 熟悉 DatasetDictDataset:理解它们是 datasets 库操作的基础。
  3. 善用 mapset_format:这是进行数据预处理和与深度学习框架(PyTorch/TensorFlow)集成的关键。
  4. 查看官方文档:Hugging Face 的文档非常完善,当你遇到问题时,官方文档 是最好的资源。
分享:
扫描分享到社交APP
上一篇
下一篇