Datasets documentation
로드
로드
데이터는 다양한 위치에 저장될 수 있습니다. 로컬 머신의 디스크, Github 저장소, Python 딕셔너리나 Pandas DataFrame과 같은 인메모리 데이터 구조 등이 있습니다. 데이터셋이 어디에 저장되어 있든, 🤗 Datasets를 사용하면 이를 로드할 수 있습니다.
이 가이드에서는 다음에서 데이터셋을 로드하는 방법을 보여줍니다:
- Hugging Face Hub
- 로컬 파일
- 메모리 내 데이터
- 오프라인
- 분할된 데이터의 특정 슬라이스
다른 데이터셋 모달리티를 로드하는 방법에 대한 자세한 내용은 오디오 데이터셋 로드 가이드, 이미지 데이터셋 로드 가이드, 비디오 데이터셋 로드 가이드, 메시 데이터셋 로드 가이드, 텍스트 데이터셋 로드 가이드, 또는 에이전트 평가 작업 로드 가이드를 참고하세요.
Hugging Face Hub
Hub의 모든 데이터셋 저장소에서 데이터셋을 로드할 수도 있습니다. 먼저 데이터셋 저장소를 생성하고 데이터 파일을 업로드하세요. 이제 load_dataset() 함수를 사용하여 데이터셋을 로드할 수 있습니다.
예를 들어, 저장소 네임스페이스와 데이터셋 이름을 제공하여 이 데모 저장소의 파일을 로드해 보세요. 이 데이터셋 저장소에는 CSV 파일이 포함되어 있으며, 아래 코드는 CSV 파일에서 데이터셋을 로드합니다:
>>> from datasets import load_dataset
>>> dataset = load_dataset("lhoestq/demo1")일부 데이터셋은 Git 태그, 브랜치 또는 커밋을 기반으로 여러 버전이 있을 수 있습니다. 로드할 데이터셋 버전을 지정하려면 revision 매개변수를 사용하세요:
>>> dataset = load_dataset(
... "lhoestq/custom_squad",
... revision="main" # tag name, or branch name, or commit hash
... )Hub에 데이터셋 저장소를 만들고 데이터 파일을 업로드하는 방법에 대한 자세한 내용은 Hub에 데이터셋 업로드 튜토리얼을 참고하세요.
데이터셋은 기본적으로 모든 데이터를 train 스플릿에 로드하거나, 데이터 파일 이름에서 언급된 스플릿 이름(예: “train”, “test”, “validation”)을 확인합니다. data_files 매개변수를 사용하여 train, validation, test와 같은 스플릿에 데이터 파일을 매핑하세요:
>>> data_files = {"train": "train.csv", "test": "test.csv"}
>>> dataset = load_dataset("namespace/your_dataset_name", data_files=data_files)사용할 데이터 파일을 지정하지 않으면 load_dataset()는 모든 데이터 파일을 반환합니다. C4와 같이 약 13TB에 달하는 대규모 데이터셋을 로드하는 경우 이 과정에 상당한 시간이 소요될 수 있습니다.
data_files 또는 data_dir 매개변수를 사용하여 파일의 특정 하위 집합만 로드할 수도 있습니다. 이 매개변수들은 데이터셋이 로드되는 위치의 기본 경로에 해당하는 상대 경로를 받을 수 있습니다.
>>> from datasets import load_dataset
# load files that match the grep pattern
>>> c4_subset = load_dataset("allenai/c4", data_files="en/c4-train.0000*-of-01024.json.gz")
# load dataset from the en directory on the Hub
>>> c4_subset = load_dataset("allenai/c4", data_dir="en")split 매개변수는 데이터 파일을 특정 split에 매핑하는 데에도 사용할 수 있습니다:
>>> data_files = {"validation": "en/c4-validation.*.json.gz"}
>>> c4_validation = load_dataset("allenai/c4", data_files=data_files, split="validation")로컬 및 원격 파일
Datasets는 컴퓨터에 저장된 로컬 파일과 원격 파일에서 로드할 수 있습니다. 데이터셋은 대부분 csv, json, txt, parquet 또는 tsfile 파일로 저장됩니다. load_dataset() 함수는 이러한 각 파일 유형을 로드할 수 있습니다.
CSV
🤗 Datasets는 하나 이상의 CSV 파일로 구성된 데이터셋을 읽을 수 있습니다(이 경우 CSV 파일 목록을 전달하세요):
>>> from datasets import load_dataset
>>> dataset = load_dataset("csv", data_files="my_file.csv")자세한 내용은 CSV 파일에서 표 형식 데이터셋 로드하기 가이드를 확인하세요.
JSON
JSON 파일은 아래에 표시된 대로 load_dataset()로 직접 로드됩니다:
>>> from datasets import load_dataset
>>> dataset = load_dataset("json", data_files="my_file.json")JSON 파일은 다양한 형식을 가지고 있지만, 가장 효율적인 형식은 여러 개의 JSON 객체를 사용하는 것입니다. 각 줄은 개별 데이터 행을 나타냅니다. 예를 들어:
{"a": 1, "b": 2.0, "c": "foo", "d": false}
{"a": 4, "b": -5.5, "c": null, "d": true}만날 수 있는 또 다른 JSON 형식은 중첩 필드로, 이 경우 아래에 표시된 것처럼 field 인수를 지정해야 합니다.
{"version": "0.1.0",
"data": [{"a": 1, "b": 2.0, "c": "foo", "d": false},
{"a": 4, "b": -5.5, "c": null, "d": true}]
}
>>> from datasets import load_dataset
>>> dataset = load_dataset("json", data_files="my_file.json", field="data")HTTP를 통해 원격 JSON 파일을 로드하려면 대신 URL을 전달하세요:
>>> base_url = "https://rajpurkar.github.io/SQuAD-explorer/dataset/"
>>> dataset = load_dataset("json", data_files={"train": base_url + "train-v1.1.json", "validation": base_url + "dev-v1.1.json"}, field="data")이것들이 가장 일반적인 JSON 형식이지만, 다른 형식으로 포맷된 데이터셋도 볼 수 있습니다. 🤗 Datasets는 이러한 다른 형식을 인식하고, Python의 JSON 로딩 메서드로 폴백하여 이를 처리합니다.
Parquet
Parquet 파일은 CSV와 같은 행 기반 파일과 달리 열 기반 형식으로 저장됩니다. Parquet 파일은 쿼리 결과를 반환하는 데 더 효율적이고 빠르기 때문에 대규모 데이터셋을 Parquet 파일로 저장할 수 있습니다.
Parquet 파일을 로드하려면:
>>> from datasets import load_dataset
>>> dataset = load_dataset("parquet", data_files={'train': 'train.parquet', 'test': 'test.parquet'})HTTP를 통해 원격 Parquet 파일을 로드하려면 대신 URL을 전달하세요:
>>> base_url = "https://huggingface.co/datasets/wikimedia/wikipedia/resolve/main/20231101.ab/"
>>> data_files = {"train": base_url + "train-00000-of-00001.parquet"}
>>> wiki = load_dataset("parquet", data_files=data_files, split="train")Arrow
Arrow 파일은 CSV와 같은 행 기반 형식이나 Parquet와 같은 압축되지 않은 형식과 달리, 메모리 내 컬럼형 형식으로 저장됩니다.
Arrow 파일을 로드하려면:
>>> from datasets import load_dataset
>>> dataset = load_dataset("arrow", data_files={'train': 'train.arrow', 'test': 'test.arrow'})HTTP를 통해 원격 Arrow 파일을 로드하려면 대신 URL을 전달하세요:
>>> base_url = "https://huggingface.co/datasets/croissantllm/croissant_dataset/resolve/main/english_660B_11/"
>>> data_files = {"train": base_url + "train/data-00000-of-00080.arrow"}
>>> wiki = load_dataset("arrow", data_files=data_files, split="train")Arrow is the file format used by 🤗 Datasets under the hood, therefore you can load a local Arrow file using Dataset.from_file() directly:
>>> from datasets import Dataset
>>> dataset = Dataset.from_file("data.arrow")load_dataset()와 달리, Dataset.from_file()은 캐시에 데이터셋을 준비하지 않고 Arrow 파일을 메모리 매핑하여 디스크 공간을 절약합니다. 이 경우 중간 처리 결과를 저장할 캐시 디렉토리는 해당 Arrow 파일의 디렉토리가 됩니다.
현재 Arrow 스트리밍 형식만 지원됩니다. Arrow IPC 파일 형식(Feather V2로도 알려짐)은 지원되지 않습니다.
Lance
Lance는 AI를 위한 오픈 멀티모달 레이크하우스 테이블 형식입니다. Lance 테이블은 텍스트와 스칼라 값뿐만 아니라 이미지, 오디오, 비디오와 같은 대형 바이너리 객체(blobs)도 테이블 데이터와 함께 네이티브로 저장할 수 있습니다.
>>> from datasets import load_dataset
>>> lance_base_url = "lance-format/laion-1m"로컬 머신으로 데이터셋을 복사하지 않고 스트리밍하려면 streaming=True 매개변수를 지정하세요:
ds = load_dataset(lance_base_url, split="train", streaming=True)
# Take first three rows
for row in ds.take(3):
print(row["caption"], row["image"])이것은 단일 요청으로 이미지 캡션과 이미지 바이트를 반환합니다.
Vortex
Vortex는 압축된 데이터에 대한 빠른 스캔을 위해 설계된 컬럼형 파일 형식입니다. pip install vortex-data로 설치한 후, .vortex 파일을 다른 패키징된 형식과 마찬가지로 로드할 수 있습니다:
>>> from datasets import load_dataset
>>> dataset = load_dataset("vortex", data_files="data.vortex", split="train")컬럼과 필터가 Vortex 스캔으로 push down되므로 요청한 행과 컬럼만 읽힙니다. 스트리밍 중에도 이 동작이 가능하여 Hub의 데이터셋에서 다운로드하지 않아도 되는, 조건에 맞지 않는 부분을 필터링할 수 있습니다:
>>> filters = [("label", "==", 1)]
>>> dataset = load_dataset(vortex_dataset_id, columns=["text", "label"], filters=filters, streaming=True, split="train")Filters는 Parquet 로더와 동일한 disjunctive normal form을 사용합니다: (column, operator, value) 조건 목록은 conjunction을, 그 목록의 목록은 disjunction을 나타냅니다. Null은 SQL 의미를 따르며, null은 어떤 비교도 만족하지 않으므로 필터링된 열이 null인 행은 not in을 포함하여 절대 반환되지 않습니다. 해당 형식으로 표현할 수 없는 경우, Vortex 표현식을 전달하세요:
>>> import vortex.expr as ve
>>> dataset = load_dataset(vortex_dataset_id, filters=ve.column("score") >= 0.5, split="train")Vortex는 fsspec을 통해 파일에 접근하는 대신 자체적으로 파일을 열기 때문에, data_files는 로컬 경로, Hub 데이터셋, 그리고 Vortex가 네이티브로 읽는 원격 위치(HTTP 및 일반적인 객체 스토리지)를 가리킬 수 있습니다. 단, 아카이브 내부(zip://...)나 기타 fsspec 전용 프로토콜은 지원하지 않습니다.
HDF5 파일
HDF5 파일은 과학 계산 및 기계 학습에서 대량의 수치 데이터를 저장하는 데 일반적으로 사용됩니다. 🤗 Datasets로 HDF5 파일을 로드하는 방법은 CSV 파일을 로드하는 것과 유사합니다:
>>> from datasets import load_dataset
>>> dataset = load_dataset("hdf5", data_files="data.h5")HDF5 로더는 파일이 “테이블” 구조, 즉 파일 내 모든 데이터셋이 첫 번째 차원에서 (같은 수의) 행을 가질 것이라고 가정한다는 점에 유의하세요.
TsFile
TsFile는 시계열 데이터를 위해 설계된 컬럼형 파일 형식으로, Apache IoTDB의 네이티브 저장 계층으로 사용됩니다. 타임스탬프, 디바이스 태그, 측정 필드를 네이티브로 표현하며, 효율적인 시간 범위 프루닝을 가능하게 하는 내부 시간 인덱스를 유지합니다.
결과 데이터셋의 각 행은 하나의 device(TAG 열로 식별됨)에 해당하며, time 열과 모든 FIELD 열은 해당 device의 전체 시계열을 시간 오름차순으로 정렬하여 포함하는 리스트 열입니다.
TsFile를 로드하려면:
>>> from datasets import load_dataset
>>> dataset = load_dataset("tsfile", data_files="my_data.tsfile")시간 범위로 필터링 — 경계값은 TsFile의 내부 시간 인덱스로 전달되며 int epoch, datetime, date, ISO-8601 문자열 또는 pyarrow timestamp 스칼라를 지원합니다:
>>> from datetime import datetime
>>> dataset = load_dataset(
... "tsfile",
... data_files="my_data.tsfile",
... start_time=datetime(2023, 11, 14),
... end_time=datetime(2023, 11, 15),
... )자세한 내용은 TsFile 데이터 로드 방법 가이드를 확인하세요.
Harbor
Harbor 데이터셋은 AI 에이전트를 평가하는 데 사용되는 tasks의 모음입니다.
데이터 파일이 아닌 디렉터리로 구성되어 있습니다. 각 task는 task.toml 설정 파일과 instruction.md 파일, 그리고 해당 환경, 검증기, 솔루션을 포함하는 디렉터리입니다.
결과 데이터셋의 각 행은 하나의 작업을 설명하며(해당 작업의 지시문, task.toml, 포함된 파일들), 로딩 시에는 아무것도 실행되지 않습니다:
>>> from datasets import load_dataset
>>> dataset = load_dataset("harborframework/terminal-bench")
>>> dataset["train"][0]["task_id"]
'tasks/atrx-vep-crispr'자세한 내용은 에이전트 평가 작업 로드 방법 가이드를 확인하세요.
PDB
PDB(Protein Data Bank)은 3D 거대 분자 구조를 표현하기 위한 레거시 고정 폭 형식입니다. mmCIF가 현대적인 표준이지만, PDB는 여전히 널리 사용되며 많은 역사적 데이터셋이 이 형식으로 저장되어 있습니다.
각 행은 하나의 구조 파일이며, ImageFolder와 동일한 폴더 레이아웃을 따릅니다. 서브폴더 이름이 라벨이 되고, metadata.csv/metadata.jsonl 파일이 구조별 메타데이터를 추가합니다. structure 열은 format="pdb"를 사용하는 BioStructure를 통해 파일의 모델, 체인, 잔기, 원자를 포함하는 Bio.PDB.Structure.Structure 객체로 디코딩됩니다. 디코딩에는 biopython이 필요하며, 이 라이브러리가 없으면 디코딩된 구조에 접근할 때 ImportError가 발생합니다.
디렉터리에서 PDB 파일을 로드하려면:
>>> from datasets import BioStructure, load_dataset
>>> dataset = load_dataset("pdb", data_dir="path/to/structures")
>>> dataset["train"].features["structure"]
BioStructure(format='pdb', decode=True)디코딩하거나 biopython을 요구하지 않고 {"bytes": ..., "path": ...} 딕셔너리에 직접 접근하려면, 컬럼을 decode=False로 캐스팅합니다:
>>> dataset = dataset.cast_column("structure", BioStructure(format="pdb", decode=False)).pdb 및 .ent 확장자가 지원됩니다.
SQL
데이터베이스 URI를 지정하여 from_sql()로 데이터베이스 내용을 읽을 수 있습니다. 테이블 이름과 쿼리를 모두 읽을 수 있습니다:
>>> from datasets import Dataset
# load entire table
>>> dataset = Dataset.from_sql("data_table_name", con="sqlite:///sqlite_file.db")
# load from query
>>> dataset = Dataset.from_sql("SELECT text FROM table WHERE length(text) > 100 LIMIT 10", con="sqlite:///sqlite_file.db")자세한 내용은 SQL 데이터베이스에서 테이블형 데이터셋 로드하기 가이드를 확인하세요.
WebDataset
WebDataset 형식은 TAR 아카이브를 기반으로 하며 대규모 이미지 데이터셋에 적합합니다.
크기가 크기 때문에 WebDataset은 일반적으로 스트리밍 모드( streaming=True 사용)로 로드됩니다.
WebDataset를 다음과 같이 로드할 수 있습니다:
>>> from datasets import load_dataset
>>>
>>> path = "path/to/train/*.tar"
>>> dataset = load_dataset("webdataset", data_files={"train": path}, split="train", streaming=True)HTTP를 통해 원격 WebDatasets를 로드하려면 대신 URL을 전달하세요:
>>> from datasets import load_dataset
>>>
>>> base_url = "https://huggingface.co/datasets/lhoestq/small-publaynet-wds/resolve/main/publaynet-train-{i:06d}.tar"
>>> urls = [base_url.format(i=i) for i in range(4)]
>>> dataset = load_dataset("webdataset", data_files={"train": urls}, split="train", streaming=True)mmCIF
mmCIF(macromolecular Crystallographic Information File)은 3차원 거대 분자 구조를 표현하는 현대 표준 형식으로, 2014년부터 Protein Data Bank(PDB)에서 사용되고 있습니다.
각 행은 하나의 구조 파일이며, ImageFolder와 동일한 폴더 레이아웃을 따릅니다: 서브폴더 이름이 라벨이 되고, metadata.csv/metadata.jsonl 파일이 구조별 메타데이터를 추가합니다. structure 열은 format="mmcif"를 사용하는 BioStructure를 통해 Bio.PDB.Structure.Structure 객체로 디코딩되며, 이 객체에는 파일의 모델, 체인, 잔기, 원자가 포함됩니다. 디코딩에는 biopython이 필요하며, 이 라이브러리가 없으면 디코딩된 구조에 액세스할 때 ImportError가 발생합니다.
디렉터리에서 mmCIF 파일을 로드하려면:
>>> from datasets import BioStructure, load_dataset
>>> dataset = load_dataset("mmcif", data_dir="path/to/structures")
>>> dataset["train"].features["structure"]
BioStructure(format='mmcif', decode=True)디코딩하거나 biopython을 요구하지 않고 {"bytes": ..., "path": ...} 딕셔너리에 직접 접근하려면, 컬럼을 decode=False로 캐스팅합니다:
>>> dataset = dataset.cast_column("structure", BioStructure(format="mmcif", decode=False)).cif 및 .mmcif 확장자가 지원됩니다.
GenBank
GenBank는 NCBI에서 제공하는 뉴클레오티드 및 단백질 서열과 해당 주석을 함께 다루는 텍스트 기반 형식입니다. 파일은 .gb, .gbk, 또는 .genbank 확장자(선택적으로 압축 가능)를 사용하며, 각 레코드의 FEATURES 섹션은 구조화된 객체로 디코딩됩니다.
가벼운 파싱된 컬럼과 함께, 각 행에는 record 컬럼이 포함되며, 이 컬럼의 타입은 BioSequence(format="genbank")입니다. biopython이 설치된 경우 이 컬럼은 Bio.SeqRecord.SeqRecord로 디코딩됩니다. BioSequence(format="genbank", decode=False)로 이 컬럼을 캐스팅하면 {"bytes": ..., "path": None} 형식으로 원본 레코드 바이트에 접근할 수 있으며, columns=[...]를 사용하여 이 컬럼을 생략하면 biopython 없이 파싱된 컬럼만 사용할 수 있습니다.
GenBank 파일을 로드하려면:
>>> from datasets import load_dataset
>>> dataset = load_dataset("genbank", data_files="*.gb", split="train")실제 NCBI 레코드의 작은 예제 데이터셋으로 시도해 볼 수 있습니다(압축된 파일이 투명하게 로드됨을 보여주기 위해 그중 하나는 gzip으로 압축되어 있습니다):
>>> from datasets import load_dataset
>>> dataset = load_dataset("ermiaazarkhalili/datasets-genbank-test", data_files="*.gb*", split="train")
>>> dataset[0]["locus_name"], dataset[0]["organism"], dataset[0]["length"]FASTQ
FASTQ는 뉴클레오티드 서열과 품질 점수를 함께 저장하는 텍스트 기반 형식으로, 고통량 시퀀싱 데이터에 널리 사용됩니다.
FASTQ 파일을 로드합니다:
>>> from datasets import load_dataset
>>> dataset = load_dataset("fastq", data_files="reads.fq")로더는 다섯 개의 열을 반환합니다:
| 열 | 유형 | 설명 |
|---|---|---|
id | string | 시퀀스 식별자(@ 뒤의 첫 번째 단어) |
description | string | 전체 설명 줄(id 이후의 모든 내용) |
sequence | large_string | 뉴클레오타이드 서열 |
quality | large_string | ASCII 인코딩된 품질 점수 |
record | BioSequence | format="fastq"를 사용하면 각 레코드의 원본 바이트를 저장하고, 접근할 때 Biopython의 SeqRecord로 디코딩합니다. |
파싱된 열을 읽는 데에는 Biopython이 필요하지 않으며, columns에서 record를 제외하거나, datasets에서 가져온 dataset.cast_column("record", BioSequence(decode=False))를 사용하여 디코딩 없이 {"bytes": ..., "path": None} 저장소를 액세스할 수 있습니다.
특정 열만 로드:
>>> dataset = load_dataset("fastq", data_files="reads.fq", columns=["sequence", "quality"])압축 파일(.fq.gz, .fastq.gz, .fq.bz2, .fq.xz)은 자동으로 감지되고 압축이 해제됩니다.
FASTA
FASTA는 뉴클레오티드 서열(DNA/RNA) 또는 펩타이드 서열(단백질)을 표현하기 위한 텍스트 기반 형식으로, 생물정보학에서 널리 사용됩니다.
FASTA 파일을 로드하려면:
>>> from datasets import load_dataset
>>> dataset = load_dataset("fasta", data_files="sequences.fasta")다음과 같은 컬럼을 가진 데이터셋을 반환합니다:
id: 시퀀스 식별자(>뒤의 첫 번째 단어)description: 전체 설명 줄(id 이후의 모든 내용)sequence: 생물학적 서열(DNA/RNA/단백질)record: 각 레코드의 원본 바이트를 저장하고, 접근 시 BiopythonSeqRecord로 디코딩하는format="fasta"를 가진 BioSequence입니다.
파싱된 열을 읽는 데에는 Biopython이 필요하지 않으며, columns에서 record를 제외하거나, datasets에서 가져온 dataset.cast_column("record", BioSequence(decode=False))를 사용하여 디코딩 없이 {"bytes": ..., "path": None} 저장소를 액세스할 수 있습니다.
특정 컬럼만 로드할 수도 있습니다:
>>> dataset = load_dataset("fasta", data_files="sequences.fa", columns=["id", "sequence"])다양한 확장자를 가진 FASTA 파일을 지원합니다: .fa, .fasta, .fna (핵산), .ffn (유전자 영역의 뉴클레오티드), .faa (아미노산), .frn (비암호화 RNA). 압축 파일(gzip, bzip2, xz)은 자동으로 감지되고 압축이 해제됩니다.
원격 파일
csv, json, txt, parquet 또는 기타 지원되는 형식으로 저장된 원격 파일이 있는 경우, 원격 경로를 지정하면 load_dataset() 함수로 로드할 수 있습니다:
- 공개 온라인 파일의
https://URL, 예:data_files=["https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v2.0.json"] - Hugging Face의 Dataset 저장소 또는 Storage Bucket에 있는 파일의
hf://URL, 예:data_files=["hf://datasets/karpathy/tinystories-gpt4-clean/tinystories_gpt4_clean.parquet"]또는data_files=["hf://buckets/julien-c/my-training-bucket/julien/affluence.csv"]
멀티프로세싱
데이터셋이 여러 파일(이를 “shards”라고 부름)로 구성되어 있는 경우, 데이터셋 다운로드 및 준비 단계를 크게 가속화할 수 있습니다.
num_proc를 사용하여 데이터를 병렬로 준비할 때 사용할 프로세스 수를 선택할 수 있습니다.
이 경우 각 프로세스에는 준비할 샤드 하위 집합이 할당됩니다:
from datasets import load_dataset
imagenet = load_dataset("timm/imagenet-1k-wds", num_proc=8)
ml_librispeech_spanish = load_dataset("facebook/multilingual_librispeech", "spanish", num_proc=8)메모리 내 데이터
🤗 Datasets를 사용하면 Python 사전이나 Pandas DataFrame과 같은 메모리 내 데이터 구조에서 Dataset을 직접 생성할 수도 있습니다.
Python 사전
Python 사전(딕셔너리)을 from_dict()로 로드합니다:
>>> from datasets import Dataset
>>> my_dict = {"a": [1, 2, 3]}
>>> dataset = Dataset.from_dict(my_dict)Python 사전 목록
Python 사전 목록을 from_list()로 로드합니다:
>>> from datasets import Dataset
>>> my_list = [{"a": 1}, {"a": 2}, {"a": 3}]
>>> dataset = Dataset.from_list(my_list)Python 생성기
Python 생성기에서 from_generator()를 사용하여 데이터셋을 생성합니다:
>>> from datasets import Dataset
>>> def my_gen():
... for i in range(1, 4):
... yield {"a": i}
...
>>> dataset = Dataset.from_generator(my_gen)이 접근 방식은 사용 가능한 메모리보다 큰 데이터를 로드하는 것을 지원합니다.
gen_kwargs에 리스트를 전달하여 샤드된 데이터셋을 정의할 수도 있습니다:
>>> def gen(shards):
... for shard in shards:
... with open(shard) as f:
... for line in f:
... yield {"line": line}
...
>>> shards = [f"data{i}.txt" for i in range(32)]
>>> ds = IterableDataset.from_generator(gen, gen_kwargs={"shards": shards})
>>> ds = ds.shuffle(seed=42, buffer_size=10_000) # shuffles the shards order + uses a shuffle buffer
>>> from torch.utils.data import DataLoader
>>> dataloader = DataLoader(ds.with_format("torch"), num_workers=4) # give each worker a subset of 32/4=8 shardsPandas DataFrame
from_pandas()로 Pandas DataFrame 로드:
>>> from datasets import Dataset
>>> import pandas as pd
>>> df = pd.DataFrame({"a": [1, 2, 3]})
>>> dataset = Dataset.from_pandas(df)자세한 내용은 Pandas DataFrame에서 표 형식 데이터셋을 로드하는 방법 가이드를 확인하세요.
오프라인
인터넷 연결이 없어도 데이터셋을 로드할 수 있습니다. 이전에 Hub 저장소에서 데이터셋을 다운로드했다면 캐시에 저장되어 있을 것입니다. 즉, 캐시에서 데이터셋을 다시 로드하여 오프라인으로 사용할 수 있습니다.
인터넷 접근이 불가능한 경우를 알고 있다면, 🤗 Datasets를 완전 오프라인 모드로 실행할 수 있습니다. Dataset builder 다운로드가 시간 초과될 때까지 기다리는 대신 🤗 Datasets가 캐시를 직접 조회하므로 시간을 절약할 수 있습니다. 완전 오프라인 모드를 활성화하려면 환경 변수 HF_HUB_OFFLINE을 1로 설정하세요.
Slice 분할
특정 split의 일부만 로드하도록 선택할 수도 있습니다. split을 슬라이스하는 방법에는 두 가지가 있습니다: 문자열 사용 또는 ReadInstruction API 사용. 간단한 경우 문자열이 더 간결하고 가독성이 좋으며, ReadInstruction은 가변 슬라이스 매개변수와 함께 사용할 때 더 편리합니다.
다음과 같이 train과 test 분할을 연결합니다:
>>> train_test_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split="train+test")train 분할의 특정 행을 선택합니다:
>>> train_10_20_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split="train[10:20]")또는 다음을 사용하여 분할의 백분율을 선택합니다:
>>> train_10pct_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split="train[:10%]")각 분할에서 백분율 조합을 선택합니다:
>>> train_10_80pct_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split="train[:10%]+train[-80%:]")마지막으로, 교차 검증(cross-validated) 분할을 만들 수도 있습니다. 아래 예제는 10-fold 교차 검증 분할을 생성합니다. 각 검증 데이터셋은 10% 크기의 청크이며, 학습 데이터셋은 나머지 90%의 보완 청크를 구성합니다:
>>> val_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split=[f"train[{k}%:{k+10}%]" for k in range(0, 100, 10)])
>>> train_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split=[f"train[:{k}%]+train[{k+10}%:]" for k in range(0, 100, 10)])백분율 슬라이싱 및 반올림
기본 동작은 요청된 슬라이스 경계가 100으로 나누어 떨어지지 않는 데이터셋의 경우 경계를 가장 가까운 정수로 반올림하는 것입니다. 아래에 표시된 바와 같이 일부 슬라이스는 다른 슬라이스보다 더 많은 예시를 포함할 수 있습니다. 예를 들어, 다음 train 분할에 999개의 레코드가 포함된 경우:
# 19 records, from 500 (included) to 519 (excluded).
>>> train_50_52_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split="train[50%:52%]")
# 20 records, from 519 (included) to 539 (excluded).
>>> train_52_54_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split="train[52%:54%]")동일한 크기의 분할을 원한다면 pct1_dropremainder 반올림을 대신 사용하세요. 이 방식은 지정된 백분율 경계를 1%의 배수로 취급합니다.
# 18 records, from 450 (included) to 468 (excluded).
>>> train_50_52pct1_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split=datasets.ReadInstruction("train", from_=50, to=52, unit="%", rounding="pct1_dropremainder"))
# 18 records, from 468 (included) to 486 (excluded).
>>> train_52_54pct1_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split=datasets.ReadInstruction("train",from_=52, to=54, unit="%", rounding="pct1_dropremainder"))
# Or equivalently:
>>> train_50_52pct1_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split="train[50%:52%](pct1_dropremainder)")
>>> train_52_54pct1_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split="train[52%:54%](pct1_dropremainder)")
pct1_dropremainder반올림은 데이터셋의 예시 수가 100으로 나누어 떨어지지 않는 경우, 데이터셋의 마지막 예시들을 잘라낼 수 있습니다.
문제 해결
데이터셋을 로드할 때 예상치 못한 결과가 나올 수 있습니다. 가장 흔하게 발생하는 두 가지 문제는 데이터셋을 수동으로 다운로드하는 것과 데이터셋의 features를 지정하는 것입니다.
기능 지정
로컬 파일에서 데이터셋을 생성하면 Features가 Apache Arrow에 의해 자동으로 추론됩니다. 그러나 데이터셋의 features가 항상 기대대로 일치하지 않을 수 있으며, features를 직접 정의하고 싶을 수도 있습니다. 다음 예제는 ClassLabel feature를 사용하여 사용자 정의 라벨을 추가하는 방법을 보여줍니다.
Features 클래스를 사용하여 자체 라벨을 정의하는 것으로 시작합니다:
>>> class_names = ["sadness", "joy", "love", "anger", "fear", "surprise"]
>>> emotion_features = Features({'text': Value('string'), 'label': ClassLabel(names=class_names)})다음으로, 방금 생성한 features를 load_dataset()의 features 매개변수로 지정합니다:
>>> dataset = load_dataset('csv', data_files=file_dict, delimiter=';', column_names=['text', 'label'], features=emotion_features)이제 데이터셋의 특징을 살펴보면, 사용자가 정의한 커스텀 라벨을 사용하고 있음을 확인할 수 있습니다:
>>> dataset['train'].features
{'text': Value('string'),
'label': ClassLabel(names=['sadness', 'joy', 'love', 'anger', 'fear', 'surprise'])}