Pandas, Numpy, Dataframe을 이용한 데이터 분할 (훈련, 검증, 테스트)
Pandas, Numpy, Dataframe을 이용한 데이터 분할 (훈련, 검증, 테스트)
라이브러리 불러오기
import pandas as pd
import numpy as np
데이터 준비
df = pd.DataFrame({'data': np.random.randn(100)})
데이터 분할 방법 선택
데이터 분할 방법은 여러 가지가 있지만, 여기서는 가장 일반적인 홀드아웃(Holdout) 방법을 사용합니다.
홀드아웃 방법
홀드아웃 방법은 데이터를 훈련, 검증, 테스트 세트로 나누는 방법입니다. 일반적으로 훈련 세트는 60%, 검증 세트는 20%, 테스트 세트는 20%로 분할합니다.
train_size = 0.6
val_size = 0.2
test_size = 0.2
# 데이터프레임 행 번호 섞기
df = df.sample(frac=1, random_state=42)
# 훈련 데이터
train_idx = int(len(df) * train_size)
train_set = df[:train_idx]
# 검증 데이터
val_idx = int(len(df) * (train_size + val_size))
val_set = df[train_idx:val_idx]
# 테스트 데이터
test_set = df[val_idx:]
결과 확인
print("훈련 데이터 크기:", len(train_set))
print("검증 데이터 크기:", len(val_set))
print("테스트 데이터 크기:", len(test_set))
추가 정보
- 교차 검증(Cross Validation): 홀드아웃 방법보다 더 정확한 모델 평가를 위해 사용됩니다.
- stratified sampling: 데이터 분할 시 레이블 비율을 유지하기 위해 사용됩니다.
예제 코드
import pandas as pd
import numpy as np
# 샘플 데이터 생성
df = pd.DataFrame({'data': np.random.randn(100)})
# 데이터 분할 비율 설정
train_size = 0.6
val_size = 0.2
test_size = 0.2
# 데이터프레임 행 번호 섞기
df = df.sample(frac=1, random_state=42)
# 훈련 데이터
train_idx = int(len(df) * train_size)
train_set = df[:train_idx]
# 검증 데이터
val_idx = int(len(df) * (train_size + val_size))
val_set = df[train_idx:val_idx]
# 테스트 데이터
test_set = df[val_idx:]
# 결과 출력
print("훈련 데이터:")
print(train_set)
print("검증 데이터:")
print(val_set)
print("테스트 데이터:")
print(test_set)
- 위 코드는 샘플 코드이며, 실제 데이터 분석에서는 데이터 특성에 맞게 코드를 수정해야 합니다.
- 데이터 분할 비율은 모델 성능에 영향을 미치므로, 여러 비율을 시도해보는 것이 좋습니다.
데이터 분할 대체 방법
교차 검증 (Cross Validation)
홀드아웃 방법보다 더 정확한 모델 평가를 위해 사용됩니다. 데이터를 여러 개의 폴드(fold)로 나누고, 각 폴드를 번갈아 가면서 훈련과 검증에 사용합니다.
Stratified Sampling
데이터 분할 시 레이블 비율을 유지하기 위해 사용됩니다. 레이블 비율이 불균형한 데이터셋에서 특히 유용합니다.
K-Fold Cross Validation
교차 검증의 대표적인 방법입니다. 데이터를 K개의 폴드로 나누고, K-1개의 폴드를 훈련에 사용하고 나머지 1개의 폴드를 검증에 사용합니다. 이 과정을 K번 반복하여 모델 평가를 수행합니다.
Stratified K-Fold Cross Validation
K-Fold Cross Validation에 Stratified Sampling을 적용한 방법입니다. 레이블 비율이 불균형한 데이터셋에서 K-Fold Cross Validation보다 더 정확한 모델 평가를 제공합니다.
Time Series Split
시간 순서대로 데이터를 분할하는 방법입니다. 시간 순서에 따라 데이터 분포가 변하는 경우 유용합니다.
pandas numpy dataframe