데이터 샘플링

minsoo kim·2024년 12월 29일

데이터 분할 방법 정리

모델을 학습시키기 위해 데이터를 어떻게 나눌지에 대한 여러 방법이 있습니다. 각 방법은 데이터의 특성에 따라 다르게 적용할 수 있습니다. 아래는 주요 데이터 분할 방법에 대한 설명입니다.


1. 랜덤 샘플링 (Random Sampling)

랜덤 샘플링은 데이터를 무작위로 섞어서 훈련 데이터와 테스트 데이터를 나누는 방법입니다.

  • 장점: 간단하고 빠르게 데이터를 분리할 수 있음
  • 단점: 시계열 데이터의 경우 시간 순서가 무시되어 예측에 적합하지 않음

예시 코드

from sklearn.model_selection import train_test_split

# 데이터 예시 (X: 특성, y: 타겟)
X = [[i] for i in range(100)] # 0~99
y = [i for i in range(100)]

# 훈련 데이터와 테스트 데이터 나누기 (80% 훈련, 20% 테스트)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

print("훈련 데이터:", X_train)
print("테스트 데이터:", X_test)

2. K-겹 교차 검증 (K-Fold Cross-Validation)

K-겹 교차 검증은 데이터를 K개의 폴드로 나누고, 각 폴드가 한 번씩 테스트 데이터로 사용되도록 학습하는 방법입니다.

  • 장점: 모델을 여러 번 학습시키므로 더 안정적인 성능 평가를 할 수 있음
  • 단점: 여러 번 학습을 반복해야 하므로 시간이 더 걸림

예시 코드

from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier

# 모델 생성
model = RandomForestClassifier()

# 5-겹 교차 검증
scores = cross_val_score(model, X, y, cv=5)
print("교차 검증 점수:", scores)

3. 계층화 샘플링 (Stratified Sampling)

계층화 샘플링은 클래스 비율을 유지하며 데이터를 나누는 방법으로, 불균형한 데이터셋에서 유용합니다.

  • 장점: 불균형한 데이터에서도 모델 성능이 제대로 평가됨
  • 단점: 데이터셋의 클래스 비율을 유지하려면 더 많은 데이터가 필요할 수 있음

예시 코드

from sklearn.model_selection import train_test_split

# 클래스 비율을 유지하며 훈련 데이터와 테스트 데이터 나누기
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y, random_state=42)

print("훈련 데이터:", X_train)
print("테스트 데이터:", X_test)

4. 시간 순서대로 나누기 (Time-based Split)

시간 순서대로 나누기는 시계열 데이터에서 시간 순서를 고려하여 훈련 데이터와 테스트 데이터를 나누는 방법입니다.

  • 장점: 시계열 데이터에서 시간의 흐름을 유지하여 모델을 평가할 수 있음
  • 단점: 시계열 데이터를 나누기 위해 더 많은 주의가 필요함

예시 코드

# 시간 순서대로 데이터를 나누기
X_train, X_test, y_train, y_test = X[:80], X[80:], y[:80], y[80:]

print("훈련 데이터:", X_train)
print("테스트 데이터:", X_test)

5. 슬라이딩 윈도우 (Sliding Window)

슬라이딩 윈도우는 시계열 데이터에서 훈련 데이터의 크기를 일정하게 유지하고, 테스트 데이터를 계속해서 이동시키며 예측하는 방법입니다.

  • 장점: 과거 데이터를 점진적으로 학습하며 예측을 수행
  • 단점: 여러 번 학습해야 하므로 시간이 오래 걸릴 수 있음

예시 코드

# 슬라이딩 윈도우로 학습/테스트 데이터 분리
window_size = 30
horizon = 5

for start in range(0, len(X) - window_size - horizon + 1, window_size):
    # window_size만큼 늘어
    end = start + window_size
    
    # 훈련 데이터와 테스트 데이터 생성
    X_train = X[start:end]
    y_train = y[start:end]
    X_test = X[end:end + horizon]
    y_test = y[end:end + horizon]
    
    # 학습과 테스트 데이터 확인
    print("훈련 데이터:", X_train, y_train)
    print("테스트 데이터:", X_test, y_test)

6. Time Series Split (시간 기반 교차 검증)

Time Series Split은 시계열 데이터를 점진적으로 훈련 데이터에 추가하면서, 점차적으로 테스트 데이터를 이동시켜 모델을 평가하는 방법입니다.

  • 장점: 시간 순서대로 학습 및 평가가 가능
  • 단점: 여러 번 학습을 반복해야 하므로 시간이 더 걸릴 수 있음

예시 코드

from sklearn.model_selection import TimeSeriesSplit

# 시간 기반 교차 검증
tscv = TimeSeriesSplit(n_splits=5)

for train_index, test_index in tscv.split(X):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    
    print("훈련 데이터:", X_train, y_train)
    print("테스트 데이터:", X_test, y_test)

결론

데이터를 분할할 때는 데이터의 특성에 맞는 방법을 선택하는 것이 중요합니다. 시계열 데이터의 경우 시간 순서를 고려해야 하고, 불균형한 클래스에서는 계층화 샘플링을 사용하는 것이 좋습니다. 각 방법을 적절히 사용하여 모델을 학습하고 평가하는 것이 성능을 높이는 데 도움을 줍니다.

0개의 댓글