Dataset类

        Dataset类是Hugging Face datasets库中的核心类,用于高效加载、处理和存储大规模数据集。它提供类似pandas的易用接口,同时支持内存映射和流式加载,特别适合处理超大规模数据。

1、核心特性

(1)内存优化:自动使用内存映射(Arrow格式),处理远超内存大小的数据

(2)流式加载:支持逐步读取数据,无需完整下载

(3)类Pandas API:提供数据的map、filter、select等方法

(4)版本控制:与git集成,支持数据集版本管理

(5)跨框架兼容:可直接转换为pytorch/tensorflow的Dataset格式

2、简单使用

(1)创建dataset

from datasets import Dataset
import pandas as pd

# 从字典创建
data = {"text": ["Hello", "World"], "label": [0, 1]}
dataset = Dataset.from_dict(data)

# 从Pandas创建
df = pd.DataFrame(data)
dataset = Dataset.from_pandas(df)

# 从文件创建(支持JSON/CSV/Parquet等)
dataset = Dataset.from_json("data.json")

(2)数据操作

# 查看样例
print(dataset[0])  # 输出: {"text": "Hello", "label": 0}

# 添加列
dataset = dataset.add_column("length", [len(t) for t in dataset["text"]])

# 过滤数据
dataset = dataset.filter(lambda x: x["label"] == 1)

# 映射处理
def preprocess(example):
    example["text"] = example["text"].lower()
    return example
dataset = dataset.map(preprocess)

(3)保存与加载

# 保存为本地文件
dataset.save_to_disk("my_dataset")  # 保存为Arrow格式
dataset.to_csv("data.csv")         # 导出为CSV

# 从磁盘加载
reloaded_dataset = Dataset.load_from_disk("my_dataset")

3、进阶处理

(1)流式处理

from datasets import load_dataset

# 流式加载超大数据集
dataset = load_dataset("imdb", streaming=True)  # 数据逐步读取
for example in dataset["train"]:  # 不会一次性加载到内存
    print(example)

(2)与Transformer无缝集成

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")

# 批量分词
def tokenize_fn(examples):
    return tokenizer(examples["text"], truncation=True)

dataset = dataset.map(tokenize_fn, batched=True)  # 自动处理批次

(3)性能优化技巧

# 启用多进程处理(加速map操作)
dataset = dataset.map(preprocess, num_proc=4)

# 内存映射缓存
dataset = dataset.map(..., cache_file_name="cache.arrow")

# 数据洗牌
dataset = dataset.shuffle(seed=42)

注:

(1)内存映射缓存:操作系统将磁盘文件直接映射到进程的虚拟内存地址空间,程序通过内存指针访问文件内容,无需手动加载整个文件到物理内存。内存映射缓存通过“磁盘即内存”的设计,实现了大数据的低内存处理,而智能缓存机制平衡了速度与资源的消耗。这是dataset库能高效处理海量数据的核心秘密。 

(2)数据洗牌:数据洗牌是指训练机器学习模型前,将数据集的样本数据随机打乱,以避免数据中存在潜在的顺序偏差(如按类别、时间排序),从而让模型更均衡的学习数据特征。

4、数据格式转换

目标框架 转换方法
PyTorch dataset.set_format('torch')
Tensorflow dataset.to_tf_dataset(...)
Pandas dataset.to_pandas()
NumPy dataset.to_numpy()

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐