이 가이드에서 배우게 될 내용:
- 배치의 정의
- 데이터셋을 배치로 처리해야 하는 이유
- Python에서 데이터셋을 배치로 분할하는 방법
- 데이터셋
map()의배치 처리옵션 활용법
자, 시작해 보겠습니다!
배치란 무엇인가?
머신러닝 및 데이터 처리 분야에서 배치란 데이터 세트의 하위 집합에 불과합니다. 배치는 일반적으로 대량의 데이터를 효율적으로 처리하기 위해 사용됩니다. 전체 데이터 세트를 한 번에 처리하는 대신, 데이터를 더 작은 조각( 배치라고도 함)으로 분할합니다. 각 배치는 독립적으로 처리될 수 있어 메모리 사용량을 줄이고 계산 효율성을 높이는 데 도움이 됩니다.
예를 들어, CSV 형식의 샘플 데이터가 있다고 가정해 보겠습니다:
id,name,age,score
1,John,28,85
2,Jane,34,90
3,Bob,25,72
4,Alice,30,88
5,Charlie,29,91
6,David,35,79
7,Eve,22,95
8,Frank,31,82
9,Grace,27,86
10,Hannah,26,80
위의 데이터셋 중 일부는 다음과 같습니다:
6,David,35,79
7,Eve,22,95
8,Frank,31,82
9,Grace,27,86
10,Hannah,26,80
이 배치는 원본 데이터셋의 5행부터 10행까지를 추출합니다.
배치를 통한 데이터셋 처리의 이점
데이터 수집 기법을 사용하여 생성한 데이터셋이 있다고 가정해 보겠습니다. 해당 과정에 익숙하지 않다면 데이터셋 생성 방법에 대한 가이드를 참고하세요.
그렇다면 왜 이 데이터셋을 배치로 처리해야 할까요? 다음과 같은 이점이 있기 때문입니다:
- 메모리 효율성: 전체 데이터셋을 메모리에 로드하는 대신, 한 번에 더 작고 관리하기 쉬운 부분으로 작업합니다.
- 더 빠른 처리: 배치 처리는 병렬화 가능하여 대규모 데이터셋 처리 시간을 단축합니다.
- ML 모델 훈련 개선: 가중치를 점진적으로 업데이트하여 머신러닝 모델 훈련을 지원하며, 이는 더 안정적이고 빠른 수렴을 가져올 수 있습니다.
- 확장성 향상: 메모리에 한 번에 들어가지 않을 수 있는 대규모 데이터셋으로의 처리 확장성을 용이하게 합니다.
데이터셋을 배치로 분할하는 방법: 상위 5가지 접근법
데이터셋을 배치로 분할하는 최적의 Python 방법을 살펴보기 전에, 이러한 접근법을 평가할 기준을 먼저 정립해야 합니다. 고려해야 할 의미 있는 요소 목록은 다음과 같습니다:
- 구현: 간단한 예시를 통해 접근법을 사용하는 방법을 보여주는 코드 스니펫.
- 시나리오: 데이터셋 분할 접근법이 적용 가능한 실제 상황.
- 입력: 분할 전략이 지원하는 데이터셋 파일 유형 및 데이터 구조.
- 장점: 해당 접근법이 제공하는 이점.
- 단점: 방법의 한계 또는 단점.
이제 하나씩 분석해 볼 시간입니다!
접근법 #1: 배열 슬라이싱
배열 슬라이싱은 데이터셋을 더 작고 관리하기 쉬운 배치로 분할하는 간단한 방법입니다. 데이터셋(리스트, 배열 또는 기타 시퀀스로 표현됨)을 슬라이싱하여 조각으로 나누는 개념입니다.
👨💻 구현:
def create_batches(data, batch_size):
return [data[i:i + batch_size] for i in range(0, len(data), batch_size)]
# 사용 예시
data = list(range(1, 51)) # 샘플 데이터셋
batches = create_batches(data, batch_size=5)
print(batches)
# 출력: [[1, 2, 3, 4, 5], ..., [46, 47, 48, 49, 50]]
🎯 시나리오:
- 메모리 제약이 최소인 데이터 전처리 작업
- 관리 가능한 메모리 내 청크가 필요한 병렬 데이터 처리 작업
- 데이터 파이프라인에서의 간단한 배치 처리
🔠 입력:
- Python의 리스트, 배열, 튜플
- Numpy 배열
- CSV 데이터(메모리에 행 목록으로 로드됨)
- 리스트나 배열로 변환된 판다스 데이터프레임
👍 장점:
- 간단하고 구현이 용이함
- 외부 라이브러리 불필요
- 배치 크기 직접 제어 가능
👎 단점:
- 사용 가능한 메모리에 제한됨
- 매우 큰 데이터셋이나 복잡한 데이터 구조를 지원하지 않음
- 데이터 셔플링을 위한 사용자 정의 로직 필요
접근법 #2: 제너레이터
파이썬 제너레이터를 사용하면 데이터셋을 배치 단위로 분할하여 한 번에 하나의 배치만 반환할 수 있습니다. 제너레이터가 익숙하지 않다면, 이는 반복자처럼 동작하는 특수한 유형의 함수입니다. 데이터를 직접 반환하는 대신 yield 키워드를 사용하여 반복자 객체를 생성합니다. 이를 통해 for 루프나 next() 함수를 사용하여 배치에 순차적으로 접근할 수 있습니다.
👨💻 구현:
def data_generator(data, batch_size):
for i in range(0, len(data), batch_size):
yield data[i:i + batch_size]
# 사용 예시
data = list(range(1, 51)) # 샘플 데이터셋
for batch in data_generator(data, batch_size=5):
print(batch)
# 출력:
# [1, 2, 3, 4, 5]
# ...
# [46, 47, 48, 49, 50]
🎯 시나리오:
- 데이터 파이프라인에서의 배치 처리
- 대규모 데이터 전처리 및 증강 작업
- 데이터 파이프라인에서 간단한 배치 처리부터 복잡한 배치 처리까지
🔠 입력:
- 리스트, 배열, 튜플
- NumPy 배열
- 디스크에서 각 배치 로딩이 가능한 파일 기반 데이터셋
👍 장점:
- 메모리에 전체 로드하지 않고도 대규모 데이터셋 처리 가능
- 설정이 최소화되고 구현이 용이함
- 제어 가능한 주문형 데이터 로딩 지원
👎 단점:
- 추가 셔플링 구현 없이는 데이터 순서에 제한됨
- 동적 또는 가변 배치 크기에는 효과적이지 않음
- 병렬 처리, 특히 멀티스레드 작업에 최적의 솔루션이 아닐 수 있음
접근법 #3: PyTorch DataLoader
PyTorch의 DataLoader 클래스는 데이터셋을 관리 가능한 배치로 효율적으로 분할하는 데 도움을 줍니다. 데이터셋 처리를 위한 특수화된 데이터 구조로서, 셔플링 및 병렬 데이터 로딩과 같은 유용한 기능도 제공합니다.
DataLoader는 데이터셋을 표현하기 위한 또 다른 PyTorch 데이터 구조인 TensorDataset과 함께 작동합니다. 구체적으로 TensorDataset은 두 개의 인수를 받습니다:
inps: 입력 데이터로, 일반적으로텐서형태입니다.tgts: 입력 데이터에 대응하는 레이블 또는 목표값으로, 일반적으로 텐서 형태입니다.
TensorDataset은 데이터 와 타깃을 짝지어 DataLoader 가 배치 처리 및 훈련을 위해 로드할 수 있도록 합니다.
👨💻 구현:
from torch.utils.data import DataLoader, TensorDataset
import torch
# 간단한 데이터셋 정의용 데이터
inputs = torch.arange(1, 51).float().reshape(-1, 1) # 1차원 텐서 데이터셋 (입력)
targets = inputs ** 2 # 입력값의 제곱 (회귀 작업 시뮬레이션)
# TensorDataset 및 DataLoader 생성
dataset = TensorDataset(inputs, targets)
dataloader = DataLoader(dataset, batch_size=5, shuffle=True)
# DataLoader 반복 처리
for batch in dataloader:
print(batch)
# 샘플 출력:
# [tensor([[46.],
# [42.],
# [25.],
# [10.],
# [34.]]), tensor([[2116.],
# [1764.],
# [ 625.],
# [ 100.],
# [1156.]])]
# ...
# [tensor([[21.],
# [ 9.],
# [ 2.],
# [38.],
# [44.]]), tensor([[ 441.],
# [ 81.],
# [ 4.],
# [1444.],
# [1936.]])]
🎯 시나리오:
- PyTorch에서 머신러닝 모델 훈련 및 테스트
- 편향 없는 훈련 배치용 데이터 셔플링
- 딥 러닝 작업을 위한 대규모 데이터 처리
🔠 입력:
- PyTorch
TensorDatasets에 로드된 사용자 정의 데이터셋 Tensor형식의 표 형식 데이터 및 수치 배열
👍 장점:
- 배칭 및 셔플링을 통한 대규모 데이터셋 최적화
- 병렬 데이터 로딩 지원으로 배치 검색 속도 향상
- PyTorch 모델 및 훈련 루프와 원활하게 연동
- GPU 처리 호환
👎 단점:
- PyTorch 필요
- 데이터를 텐서로 변환해야 함
- 비-ML 배치 처리 작업에는 적합하지 않음
접근법 #4: TensorFlow batch() 메서드
데이터셋을 배치로 분할하는 TensorFlow Dataset의 batch() 메서드입니다. 이 메서드는 데이터셋을 더 작은 청크로 나누며, 병렬화, 처리 순서 제어, 명명 등의 기능을 제공합니다.
머신러닝 라이브러리인 TensorFlow는 셔플링, 반복, 프리페칭과 같은 추가 기능도 제공합니다.
👨💻 구현:
import tensorflow as tf
# 샘플 데이터셋 생성
inputs = tf.range(1, 51, dtype=tf.float32) # 1차원 텐서 데이터셋 (입력값)
targets = inputs ** 2 # 입력값의 제곱값 (회귀 작업 시뮬레이션)
# 입력값과 목표값을 tf.data.Dataset으로 변환
inputs_dataset = tf.data.Dataset.from_tensor_slices(inputs)
targets_dataset = tf.data.Dataset.from_tensor_slices(targets)
# 입력값과 목표값을 함께 압축하여 데이터셋 생성
dataset = tf.data.Dataset.zip((inputs_dataset, targets_dataset))
# 배치된 데이터셋 생성
batched_dataset = dataset.batch(batch_size=5)
for batch in batched_dataset:
print(batch)
# 출력:
# (<tf.Tensor: shape=(5,), dtype=float32, numpy=array([1., 2., 3., 4., 5.], dtype=float32)>, <tf.Tensor: shape=(5,), dtype=float32, numpy=array([ 1., 4., 9., 16., 25.], dtype=float32)>)
# ...
# (<tf.Tensor: shape=(5,), dtype=float32, numpy=array([46., 47., 48., 49., 50.], dtype=float32)>, <tf.Tensor: shape=(5,), dtype=float32, numpy=array([2116., 2209., 2304., 2401., 2500.], dtype=float32)>)
🎯 시나리오:
- PyTorch에서 머신러닝 모델 훈련 및 테스트
- 편향 없는 훈련 배치용 데이터 셔플링
- 딥 러닝 작업을 위한 대규모 데이터 처리
🔠 입력:
- TensorFlow
tf.data.Dataset객체 - NumPy 배열 (
Dataset으로 변환 가능) - TFRecord 파일(TensorFlow에서 대규모 데이터셋 저장에 흔히 사용되는 특수 이진 파일 형식)
👍 장점:
- 효율적인 메모리 사용을 위해 최적화됨
- 모델 훈련 및 평가를 위한 TensorFlow 생태계와 원활하게 통합
- 셔플링, 프리페칭 및 기타 유용한 기능 지원
- 이미지, 텍스트, 구조화된 데이터를 포함한 다양한 데이터 형식 지원
👎 단점:
- TensorFlow 필요
- 복잡한 데이터셋의 경우 데이터 형식 지정 및 전처리를 위해 추가 설정이 필요할 수 있음
- 소규모 데이터셋 배치 시 오버헤드 발생 가능성
접근법 #5: HDF5 형식
HDF5는 대규모 데이터셋 관리, 특히 계층적 데이터 구조를 다룰 때 널리 채택된 데이터 형식입니다. 대규모 데이터셋을 쪼개 효율적으로 저장하는 기능을 지원합니다.
h5py Python 라이브러리는 HDF5 파일 작업 및 NumPy 데이터 구조로 로드하는 도구를 제공합니다. 이를 통해 필요에 따라 데이터의 특정 슬라이스나 세그먼트에 접근하여 데이터셋의 배치 처리가 가능해집니다.
👨💻 구현:
import h5py
import numpy as np
# HDF5 파일에서 데이터를 로드하고 배치 처리
def load_data_in_batches(batch_size=10):
# HDF5 파일 열기
with h5py.File("dataset.h5", "r") as f:
inputs = f["input"]
targets = f["target"]
# 디스크에서 이터레이터로 데이터 배치 처리
for i in range(0, len(data), batch_size):
yield inputs[i:i+batch_size], targets[i:i+batch_size]
# 배치 단위로 반복
for batch_data, batch_target in load_data_in_batches():
print("입력 배치:", batch_input)
print("목표 배치:", batch_target)
# 출력:
# 입력 배치: [[ 1]
# [ 2]
# [ 3]
# [ 4]
# [ 5]
# [ 6]
# [ 7]
# [ 8]
# [ 9]
# [10]]
# Target Batch: [[ 1]
# [ 4]
# [ 9]
# [ 16]
# [ 25]
# [ 36]
# [ 49]
# [ 64]
# [ 81]
# [100]]
# ...
# 입력 배치: [[41]
# [42]
# [43]
# [44]
# [45]
# [46]
# [47]
# [48]
# [49]
# [50]]
# 대상 배치: [[1681]
# [1764]
# [1849]
# [1936]
# [2026]
# [2116]
# [2209]
# [2304]
# [2401]
# [2500]]
🎯 시나리오:
- 메모리에 완전히 로드할 수 없는 매우 큰 데이터 세트에 이상적
- 다차원 데이터 작업 시 유용함
- 머신러닝 작업을 위해 디스크에서 데이터를 효율적이고 압축된 형식으로 저장 및 검색하는 데 적합
🔠 입력:
- HDF5 파일
👍 장점:
- HDF5는 데이터 압축 및 청킹을 지원하여 대규모 데이터 세트의 저장 공간 요구 사항을 줄입니다
- 전체 데이터를 메모리에 로드하지 않고도 대규모 데이터 세트의 일부에 효율적으로 임의 접근 가능
- 단일 파일에 여러 데이터셋을 저장할 수 있어 복잡한 데이터셋에 적합합니다.
- NumPy, TensorFlow, PyTorch 등 많은 과학 라이브러리에서 지원됩니다
👎 단점:
- HDF5 형식에 대한 추가 설정 및 지식이 필요합니다
- HDF5 파일을 처리하기 위한 완전한 API는
h5py라이브러리에 의존합니다 - 모든 데이터셋이 HDF5 형식으로 제공되는 것은 아님
다른 솔루션
위에서 제시한 방법들이 데이터셋을 배치로 분할하는 가장 좋은 방법 중 하나이지만, 다른 실행 가능한 솔루션도 존재합니다.
또 다른 가능한 해결책은 Hugging Face 데이터셋 라이브러리를 사용하는 것입니다. 이 라이브러리는 전체 데이터셋에 변환을 적용하면서 배치 처리하는 데 필요한 모든 기능을 제공합니다. batched=True를 설정하면 아래 예시처럼 데이터셋을 수동으로 분할하지 않고도 배치 수준 변환을 정의할 수 있습니다:
from datasets import load_dataset
# 샘플 데이터셋 로드
dataset = load_dataset("imdb", split="train")
# 배치 처리 함수 정의
def process_batch(batch):
# 간단한 토큰화 작업
return {"tokens": [text.split() for text in batch["text"]]}
# 배치 처리 적용
batched_dataset = dataset.map(process_batch, batched=True, batch_size=32)
데이터셋 map() 의 batched=True 옵션은 토큰화 같은 변환 작업을 배치 단위로 적용해야 할 때 이상적입니다.
map(batched=True) 사용은 메모리 사용량을 최소화하고 변환 워크플로우를 가속화하므로 배치 처리에 매우 효율적입니다. 이 방법은 특히 NLP 및 머신러닝 작업에서 텍스트 및 표 형식 데이터를 처리할 때 유용합니다.
결론
데이터셋을 배치로 분할하는 방법에 대한 이 가이드에서는 Python에서 데이터를 분할하는 최적의 접근법, 라이브러리 및 솔루션을 살펴보았습니다. 목표는 대규모 데이터셋을 더 관리하기 쉬운 부분으로 나누어 데이터 처리를 단순화하고 가속화하는 것입니다.
어떤 접근법을 선택하든, 위의 모든 솔루션은 관심 있는 데이터가 포함된 데이터셋에 대한 접근이 전제됩니다. 일부 데이터셋은 과학적 연구를 위해 무료로 제공되지만, 항상 그런 것은 아닙니다.
금융부터 영화 데이터에 이르기까지 다양한 범주의 데이터 세트가 필요하다면 Bright Data의 데이터 세트 마켓플레이스를 살펴보세요. 인기 사이트의 수백 가지 데이터 세트를 다음과 같이 분류하여 제공합니다:
- 비즈니스 데이터셋: LinkedIn, CrunchBase, Owler, Indeed 등 주요 출처의 데이터.
- 이커머스 데이터셋: Amazon, Walmart, Target, Zara, Zalando, Asos 등 다양한 사이트의 데이터.
- 부동산 데이터셋: Zillow, MLS 등 웹사이트의 데이터.
- 소셜 미디어 데이터셋: Facebook, Instagram, YouTube, Reddit 데이터.
- 금융 데이터셋: 야후 파이낸스, 마켓워치, 인베스토피디아 등에서 수집한 데이터.
이러한 사전 제작된 옵션이 귀하의 요구를 충족하지 못하는 경우, 당사의맞춤형 데이터 수집 서비스를 고려해 보십시오.
또한 Bright Data는 웹 스크레이퍼 API 및 스크레이핑 브라우저를 비롯한 다양한 강력한 스크레이핑 도구를 제공합니다.
이러한 데이터 세트를 탐색하기 위해 Bright Data 계정을 무료로 생성하세요!