Train/Valid/Test dataset

예갈조·2024년 12월 6일

Tumor Track Project

목록 보기
8/25
  • 딥러닝 신경망 모델에서 필요한 데이터셋 3가지
    • Train set
    • Validation set
    • Test set



Test set


  • 개념
    • 모델이 학습할 때 사용하는 데이터
    • 모델이 데이터를 통해 패턴을 학습하고 가중치를 업데이트할 때 사용
  • 목적
    • 모델이 데이터의 특성을 학습하도록 함
  • 특징
    • 모델의 가중치가 업데이트되는 과정에서 사용
    • 과적합을 방지하기 위해 충분한 양의 데이터가 필요
    • 보통 전체 데이터의 60%를 차지
      • 근데 요즘 트렌드는 99.8%를 사용하는 것이라고 함 (참고링크)



Validation set


  • 개념
    • 모델 성능 평가
    • 하이퍼파라미터 조정하는 데 사용되는 데이터
    • 학습 중에 모델이 validation set을 통해 평가되지만, 직접 학습에는 사용되지 않음
  • 목적
    • 학습 과정에서 모델의 성능을 점검하고 조정
  • 특징
    • 모델 일반화 성능 추정
    • 과적합 여부 모니터링 가능
      • Loss 측면
        • 과적합 시, 나타나는 패턴: Train Loss는 계속 감소하지만, Validation Loss는 감소하다가 증가하기 시작 → 모델이 학습 데이터에 너무 특화되어 Validation 데이터에서 일반화되지 못한다는 신호
        • 해결 방안: Early Stopping
          • Validation Loss가 더 이상 감소하지 않고 일정 횟수 이상 증가하면 학습을 중단
      • Acc 측면
        • 과적합 시, 나타나는 패턴: Train Acc는 계속 증가하지만, Validation Acc는 일정 수준에 머무르거나 감소
        • 해결 방안: 하이퍼파라미터 튜닝, 모델 복잡도 줄이기
    • 학습 중 모델이 validation 데이터로 성능을 확인하여 학습 조기 종료(Early Stopping) 등으로 활용 가능
    • 보통 전체 데이터의 20%를 차지
      • 요즘 트렌드: 0.1% 사용하기


Test set


  • 개념
    • 최종적으로 학습이 완료된 모델의 성능을 독립적으로 평가하기 위해 사용하는 데이터
  • 특징
    • 학습 및 검증 과정에서 전혀 사용되지 않음
    • 모델의 일반화 성능을 정확히 측정하기 위해 별도로 분리
    • 보통 전체 데이터의 20%를 차지
      • 요즘 트렌드: 0.1% 사용하기



기본 코드 구조


import torch
from sklearn.model_selection import train_test_split
from torch.utils.data import DataLoader, TensorDataset

# 1. 데이터 준비
X = torch.randn(1000, 10)  # 1000개의 샘플, 10개의 피처
y = torch.randint(0, 2, (1000,))  # 이진 분류 레이블

# 2. 데이터 분할
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.3, random_state=42)
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)

# 3. Dataset 생성
train_dataset = TensorDataset(X_train, y_train)
val_dataset = TensorDataset(X_val, y_val)
test_dataset = TensorDataset(X_test, y_test)

# 4. DataLoader 생성
batch_size = 32
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=batch_size, shuffle=False)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)

# 5. 모델 학습 루프 (간략화된 구조)
for epoch in range(10):  # 10 epochs
    # Training
    model.train()
    for batch in train_loader:
        X_batch, y_batch = batch
        # Forward pass
        predictions = model(X_batch)
        loss = loss_function(predictions, y_batch)
        # Backward pass
        loss.backward()
        optimizer.step()
        optimizer.zero_grad()

    # Validation
    model.eval()
    val_loss = 0
    with torch.no_grad():
        for batch in val_loader:
            X_batch, y_batch = batch
            predictions = model(X_batch)
            val_loss += loss_function(predictions, y_batch).item()
    
    print(f"Epoch {epoch + 1}, Validation Loss: {val_loss / len(val_loader)}")

# 6. 최종 테스트
model.eval()
test_loss = 0
with torch.no_grad():
    for batch in test_loader:
        X_batch, y_batch = batch
        predictions = model(X_batch)
        test_loss += loss_function(predictions, y_batch).item()

print(f"Test Loss: {test_loss / len(test_loader)}")



코드 설명


# 2. 데이터 분할
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.3, random_state=42)
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)
  • 전체 데이터를 3가지 종류로 나누기 위해 두 번의 데이터 분할 수행

첫 번째 데이터 분할


  • 입력: X - 특징, y - 레이블
    • 레이블: 각 이미지의 정답 레이블
  • 력:
    • X_train, y_train: 학습에 사용할 Train Set (전체 데이터의 70%).
    • X_temp, y_temp: 검증 및 테스트 데이터로 나누기 위해 임시로 저장된 데이터 (전체 데이터의 30%).
  • test_size=0.3:
    • 전체 데이터의 30%를 X_temp, y_temp에 할당.
    • 나머지 70%는 학습 데이터(X_train, y_train)로 사용.
  • random_state=42:
    • 데이터를 무작위로 섞어서 분할하되, 동일한 결과를 재현할 수 있도록 난수 시드를 고정.

두 번째 데이터 분할


  • 입력: 이전 단계에서 분리된 임시 데이터(X_temp, y_temp).
  • 출력:
    • X_val, y_val: 검증에 사용할 Validation Set (전체 데이터의 15%).
    • X_test, y_test: 테스트에 사용할 Test Set (전체 데이터의 15%).
  • test_size=0.5:
    • X_tempy_temp의 절반(50%)을 각각 검증 데이터(X_val, y_val)와 테스트 데이터(X_test, y_test)로 분리.
    • 결과적으로, 전체 데이터의 30% 중에서:
      • 15%는 검증 데이터.
      • 15%는 테스트 데이터.
  • random_state=42:
    • 첫 번째 분할과 마찬가지로 데이터 섞기를 재현 가능하도록 고정.





참고링크

Train / Test / Validation set의 차이

딥러닝 시대의 train, validation, test set에 대한 고찰

0개의 댓글