🤗Datasets库 Focused Reading 0 Categories / 0 Tags / 2.3k Words
Python Note

🤗Datasets库

Datasets库使用方法

2026.06.29 2.3k Words

🤗Datasets库

HF数据介绍

Splits&&Subsets

机器学习数据集通常按splits进行组织,并且还可能包含subsets也称为configurations.

Splits

每个经过处理和清洗的数据集都包含若干splits,即为不同用途预留的数据部分。最常见的划分包括:

  • train:用于训练模型的数据;这些数据会暴露给模型。
  • validation:用于评估模型并调整模型超参数的数据;这些数据不会暴露给模型。
  • test:仅用于最终评估的数据;这些数据对模型以及我们自己都是完全隐藏的。

其中,validationtest 集尤为重要,它们能够帮助确保模型真正学到了规律,而不是发生overfitting,即仅仅记住了训练数据。

Subsets

subset也称为配置configuration是一种比split更高层次的内部结构,一个子集包含多个划分。子集可以理解为一个大型数据集中的sub-dataset。它是一种非常有用的数据组织方式,可以为数据集增加更多层次的结构。

例如Multilingual LibriSpeech数据集中包含八种不同的语言。虽然可以创建一个同时包含这八种语言的数据集,但更合理的做法是将每种语言分别作为一个子集。这样便可以直接加载自己感兴趣语言对应的数据集,而无需先对整个数据集进行预处理以筛选特定语言的数据。

子集具有很高的灵活性,可以根据任何你希望的目标来组织数据集。例如SceneParse150 数据集就利用子集按照任务类型对数据进行组织。其中一个子集专门用于whole image segmentation,而另一个子集则用于instance segmentation

代码实现

🌟load_dataset

load_datasetdatasets 库中最核心的入口函数。无论是加载官方 Hub 上的海量语料,还是读取本地的数据文件,都需要通过它来完成。

这里介绍load_dataset中几个常用的参数:

1
2
3
4
5
6
7
8
9
10
from datasets import load_dataset

ds = load_dataset(
path,
name=None,
data_dir=None,
data_files=None,
split=None,
token=None,
)
  • path:数据集名称、数据加载脚本名称、本地路径,或通用数据格式名称。常见用法主要有三类:

    • 本地目录:从本地目录加载数据集。🤗 Datasets 会根据目录结构和其中的受支持文件(如 csvjsonparquet等)进行推断。
    • 线上仓库名:从 Hugging Face Hub 上的数据集仓库加载数据集,例如 "cornell-movie-review-data/rotten_tomatoes"。Datasets 会根据仓库中的数据文件、配置和元数据进行解析。
    • 数据格式名:比如 "json""csv""parquet""arrow""text""imagefolder" 等。使用这种方式时,通常需要通过 data_filesdata_dir 指定要读取的数据位置。

    使用 hf://datasets/username/dataset_name 这类路径可以明确表示从 Hugging Face Hub 读取;使用本地绝对路径可以明确表示从本地文件系统读取,从而避免名称歧义。

  • name:用于指定数据集的 configuration,也是上文提到的 subset

  • data_dir:指定数据文件所在的目录。它通常和 path 配合使用,用来告诉某个数据加载器从哪个目录中读取数据。

  • data_files:指定要读取的源数据文件。它比 data_dir 更精确,支持单个文件路径、文件路径列表、通配符,或者按 split 映射的字典。例如可以用 {"train": "train.csv", "test": "test.csv"} 明确指定哪些文件属于训练集和测试集。

  • split要加载的数据划分。如果为 None,通常会返回包含所有数据划分的 DatasetDict。如果指定了某个划分,则返回一个单独的 Dataset

  • token:字符串或布尔值。加载私有数据集,或某些需要认证/授权的数据集时,需要提供具有读取权限的 Hugging Face Access Token。可以直接传入 token 字符串,例如 token="hf_xxx";也可以设为 True,表示使用本机已登录或缓存的 Hugging Face token。默认值为 None,表示不显式传入 token。

下面通过 path 的三种常见写法来理解这些参数如何配合使用:

1. path 是Hugging Face Hub仓库名

如果只需要某一个划分,可以通过 split 参数指定。此时返回的是单个 Dataset,而不是 DatasetDict

1
2
3
4
5
6
7
8
9
10
11
>>> from datasets import load_dataset

>>> dataset = load_dataset(
... "cornell-movie-review-data/rotten_tomatoes",
... split="train",
... )
>>> dataset
Dataset({
features: ['text', 'label'],
num_rows: 8530
})

如果数据集有多个 configuration,也就是多个 subset,可以用 name 指定要加载哪一个:

1
2
3
4
5
6
7
8
9
10
11
12
>>> from datasets import load_dataset

>>> minds_fr = load_dataset(
... "PolyAI/minds14",
... name="fr-FR",
... split="train",
... )
>>> minds_fr
Dataset({
features: ['path', 'audio', 'transcription', 'english_transcription', 'intent_class', 'lang_id'],
num_rows: 539
})

2. path 是本地目录

如果本地目录中已经按 Datasets 支持的方式组织好了数据文件,可以直接把目录路径传给 path

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> from datasets import load_dataset

>>> dataset = load_dataset("D:/data/my_dataset")
>>> dataset
DatasetDict({
train: Dataset({
features: ['text', 'label'],
num_rows: 1000
})
test: Dataset({
features: ['text', 'label'],
num_rows: 200
})
})

这种写法中,path 明确指向本地文件系统中的目录。

3. path 是数据格式名

当你想明确使用某种格式加载器时,可以把 path 写成 "csv""json""parquet" 等格式名,再通过 data_filesdata_dir指定具体文件:

data_filesdata_dir 的区别在于:data_files 更适合精确指定某几个文件,data_dir 更适合把某个目录交给加载器去寻找可读取的数据文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
>>> from datasets import load_dataset

# 精确指定文件
>>> dataset = load_dataset(
... "csv",
... data_files={
... "train": "data/train.csv",
... "test": "data/test.csv",
... },
... )
>>> dataset
DatasetDict({
train: Dataset({
features: ['text', 'label'],
num_rows: 1000
})
test: Dataset({
features: ['text', 'label'],
num_rows: 200
})
})

# 指定目录
>>> dataset = load_dataset(
... "csv",
... data_dir="data/csv_files",
... )
>>> dataset
DatasetDict({
train: Dataset({
features: ['text', 'label'],
num_rows: 1200
})
})

这种写法中,path="csv"path="json" 表示选择对应格式的加载器,data_filesdata_dir 则负责指定实际读取哪些本地文件。

获取DatasetInfo

在花时间下载一个数据集之前,通常先快速了解一下它的基本信息会很有帮助。数据集的信息可能包含数据集描述、features、数据集大小等信息。

使用 load_dataset_builder() 函数加载一个dataset builder,即可在无需下载数据集的情况下查看其相关属性:

1
2
3
4
5
6
7
8
9
10
11
>>> from datasets import load_dataset_builder
>>> ds_builder = load_dataset_builder("cornell-movie-review-data/rotten_tomatoes")

# 查看数据集描述
>>> ds_builder.info.description
Movie Review Dataset. This is a dataset of containing 5,331 positive and 5,331 negative processed sentences from Rotten Tomatoes movie reviews. This data was first used in Bo Pang and Lillian Lee, ``Seeing stars: Exploiting class relationships for sentiment categorization with respect to rating scales.'', Proceedings of the ACL, 2005.

# 查看数据集特征
>>> ds_builder.info.features
{'label': ClassLabel(names=['neg', 'pos']),
'text': Value('string')}

获取Splits

split 是数据集中的一个特定子集,例如 traintest

使用 get_dataset_split_names()函数可以列出数据集包含的所有划分名称:

1
2
3
4
>>> from datasets import get_dataset_split_names

>>> get_dataset_split_names("cornell-movie-review-data/rotten_tomatoes")
['train', 'validation', 'test']

然后,可以通过 split 参数加载指定的划分。加载某个数据集的 split 后,将返回一个 Dataset对象:

1
2
3
4
5
6
7
8
>>> from datasets import load_dataset

>>> dataset = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train")
>>> dataset
Dataset({
features: ['text', 'label'],
num_rows: 8530
})

如果没有指定 split,🤗 Datasets 将返回一个 DatasetDict对象:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> from datasets import load_dataset

>>> dataset = load_dataset("cornell-movie-review-data/rotten_tomatoes")
DatasetDict({
train: Dataset({
features: ['text', 'label'],
num_rows: 8530
})
validation: Dataset({
features: ['text', 'label'],
num_rows: 1066
})
test: Dataset({
features: ['text', 'label'],
num_rows: 1066
})
})

获取Configurations

有些数据集包含多个子数据集。例如MInDS-14数据集包含多个子数据集,每个子数据集都包含一种不同语言的音频数据。

在加载数据集时必须显式指定其中一个。如果没有提供配置名称,🤗 Datasets 将抛出一个 ValueError 异常,并提醒你选择一个配置。

使用 get_dataset_config_names() 函数获取数据集中所有可用配置的列表:

1
2
3
4
5
>>> from datasets import get_dataset_config_names

>>> configs = get_dataset_config_names("PolyAI/minds14")
>>> print(configs)
['cs-CZ', 'de-DE', 'en-AU', 'en-GB', 'en-US', 'es-ES', 'fr-FR', 'it-IT', 'ko-KR', 'nl-NL', 'pl-PL', 'pt-PT', 'ru-RU', 'zh-CN', 'all']

然后加载你需要的配置:

1
2
3
>>> from datasets import load_dataset

>>> mindsFR = load_dataset("PolyAI/minds14", "fr-FR", split="train")