🤗Datasets库
HF数据介绍
Splits&&Subsets
机器学习数据集通常按splits进行组织,并且还可能包含subsets也称为configurations.
Splits
每个经过处理和清洗的数据集都包含若干splits,即为不同用途预留的数据部分。最常见的划分包括:
train:用于训练模型的数据;这些数据会暴露给模型。validation:用于评估模型并调整模型超参数的数据;这些数据不会暴露给模型。test:仅用于最终评估的数据;这些数据对模型以及我们自己都是完全隐藏的。
其中,validation 和 test 集尤为重要,它们能够帮助确保模型真正学到了规律,而不是发生overfitting,即仅仅记住了训练数据。
Subsets
subset也称为配置configuration是一种比split更高层次的内部结构,一个子集包含多个划分。子集可以理解为一个大型数据集中的sub-dataset。它是一种非常有用的数据组织方式,可以为数据集增加更多层次的结构。
例如Multilingual LibriSpeech数据集中包含八种不同的语言。虽然可以创建一个同时包含这八种语言的数据集,但更合理的做法是将每种语言分别作为一个子集。这样便可以直接加载自己感兴趣语言对应的数据集,而无需先对整个数据集进行预处理以筛选特定语言的数据。
子集具有很高的灵活性,可以根据任何你希望的目标来组织数据集。例如SceneParse150 数据集就利用子集按照任务类型对数据进行组织。其中一个子集专门用于whole image segmentation,而另一个子集则用于instance segmentation。
代码实现
🌟load_dataset
load_dataset 是 datasets 库中最核心的入口函数。无论是加载官方 Hub 上的海量语料,还是读取本地的数据文件,都需要通过它来完成。
这里介绍load_dataset中几个常用的参数:
1 | from datasets import load_dataset |
-
path:数据集名称、数据加载脚本名称、本地路径,或通用数据格式名称。常见用法主要有三类:- 本地目录:从本地目录加载数据集。🤗 Datasets 会根据目录结构和其中的受支持文件(如
csv、json、parquet等)进行推断。 - 线上仓库名:从 Hugging Face Hub 上的数据集仓库加载数据集,例如
"cornell-movie-review-data/rotten_tomatoes"。Datasets 会根据仓库中的数据文件、配置和元数据进行解析。 - 数据格式名:比如
"json"、"csv"、"parquet"、"arrow"、"text"、"imagefolder"等。使用这种方式时,通常需要通过data_files或data_dir指定要读取的数据位置。
使用
hf://datasets/username/dataset_name这类路径可以明确表示从 Hugging Face Hub 读取;使用本地绝对路径可以明确表示从本地文件系统读取,从而避免名称歧义。 - 本地目录:从本地目录加载数据集。🤗 Datasets 会根据目录结构和其中的受支持文件(如
-
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 | from datasets import load_dataset |
如果数据集有多个 configuration,也就是多个 subset,可以用 name 指定要加载哪一个:
1 | from datasets import load_dataset |
2. path 是本地目录
如果本地目录中已经按 Datasets 支持的方式组织好了数据文件,可以直接把目录路径传给 path:
1 | from datasets import load_dataset |
这种写法中,path 明确指向本地文件系统中的目录。
3. path 是数据格式名
当你想明确使用某种格式加载器时,可以把 path 写成 "csv"、"json"、"parquet" 等格式名,再通过 data_files 或data_dir指定具体文件:
data_files 和 data_dir 的区别在于:data_files 更适合精确指定某几个文件,data_dir 更适合把某个目录交给加载器去寻找可读取的数据文件。
1 | from datasets import load_dataset |
这种写法中,path="csv" 或 path="json" 表示选择对应格式的加载器,data_files 和 data_dir 则负责指定实际读取哪些本地文件。
获取DatasetInfo
在花时间下载一个数据集之前,通常先快速了解一下它的基本信息会很有帮助。数据集的信息可能包含数据集描述、features、数据集大小等信息。
使用 load_dataset_builder() 函数加载一个dataset builder,即可在无需下载数据集的情况下查看其相关属性:
1 | from datasets import load_dataset_builder |
获取Splits
split 是数据集中的一个特定子集,例如 train和 test。
使用 get_dataset_split_names()函数可以列出数据集包含的所有划分名称:
1 | from datasets import get_dataset_split_names |
然后,可以通过 split 参数加载指定的划分。加载某个数据集的 split 后,将返回一个 Dataset对象:
1 | from datasets import load_dataset |
如果没有指定 split,🤗 Datasets 将返回一个 DatasetDict对象:
1 | from datasets import load_dataset |
获取Configurations
有些数据集包含多个子数据集。例如MInDS-14数据集包含多个子数据集,每个子数据集都包含一种不同语言的音频数据。
在加载数据集时必须显式指定其中一个。如果没有提供配置名称,🤗 Datasets 将抛出一个 ValueError 异常,并提醒你选择一个配置。
使用 get_dataset_config_names() 函数获取数据集中所有可用配置的列表:
1 | from datasets import get_dataset_config_names |
然后加载你需要的配置:
1 | from datasets import load_dataset |