[Deep Learning] 데이터셋 분할의 정석: Train, Validation, Test를 나누는 진짜 이유

nomadicsoul·2026년 3월 24일

deeplearning

목록 보기
11/20

Training vs. Validation vs. Test

구분Training Set (학습용)Validation Set (검증용)Test Set (평가용)
목적모델의 가중치(ww) 학습하이퍼파라미터 튜닝 및 과적합 방지모델의 최종 성능 객관적 검증
비유교과서 및 연습문제중간고사 / 모의고사실전 수능 시험
Loss/MetricLoss 필수, Metric 선택Loss/Metric 모두 필수Metric 필수, Loss 지양
데이터 비중전체의 60% ~ 80%전체의 10% ~ 20%전체의 10% ~ 20%
업데이트가중치(ww)가 직접 업데이트됨학습률, 레이어 수 등 구조 수정절대 수정 금지 (Read-only)

① Loss와 Metric의 관점

  • Training: 컴퓨터가 Loss를 최소화하기 위해 미친 듯이 미분하고 가중치를 깎는 과정입니다.
  • Validation: 사람이 MetricLoss를 동시에 봅니다. Training Loss는 주는데 Validation Loss가 올라가면 과적합(Overfitting)이므로 학습을 멈춰야 합니다.
  • Test: 오직 Metric만 중요합니다. "이 모델이 세상에 나갔을 때 정확도가 몇 %인가?"라는 최종 결과만 봅니다.

② 데이터 크기의 차이

  • 과거에는 8:1:1이나 7:1.5:1.5를 많이 썼습니다.
  • 빅데이터 시대(데이터가 수백만 건 이상): 굳이 10%나 뗄 필요가 없습니다. 검증과 평가에 충분한 양(예: 각 1만 개)만 확보되면 되므로 98:1:1처럼 비율이 극단적으로 변하기도 합니다.
  • 학술적/엄격한 검증 (5:5 분할): 특정 기준이 없거나 논문 실험 등에서 모델의 일반화 능력(Generalization)을 매우 엄격하게 증명해야 할 때 50:50 비율을 사용하기도 합니다.
    • 일반화 성능의 극대화: "모델이 학습하지 않은 데이터셋(Unseen Data)에 대해서도 강건한(Robust) 성능을 보이는지 확인하기 위해 테스트셋 비중을 높게 설정했다."
    • 데이터의 신뢰성: "충분한 양의 고품질 데이터를 확보했기에, 전체의 50%만으로도 학습이 충분히 가능함을 전제로 했다."

"교과서(Train)만 외운 학생이 모의고사(Validation)를 통해 공부 방향을 잡고, 생전 처음 보는 수능 문제(Test)에서 실력을 발휘하게 하기 위해서입니다."


데이터 분할 시 반드시 유의할 점 (Data Scientist's Checklist)

유의 사항세부 내용 및 실행 전략주의 사항 및 예외
Shuffle (무작위 섞기)데이터가 수집 순서대로 정렬되어 특정 패턴이 생기는 것을 막기 위해, 나누기 전 반드시 랜덤하게 섞어야 함 예외 (Time-series / Text): 시계열이나 문맥이 중요한 데이터는 섞지 않고 시간 순서대로 잘라야 함 (Data Leakage 방지)
Test Set 성역화테스트 세트를 보고 모델 구조를 바꾸거나 파라미터를 수정하는 순간, 그 데이터는 더 이상 '테스트'가 아닌 '검증(Validation)' 데이터가 됨테스트 세트는 학습 및 튜닝 과정에서 절대 관여 금지 (Strict Isolation)
Stratified Split분류 문제에서 특정 클래스가 한쪽 세트에만 몰리지 않도록 원본 데이터의 클래스 비율을 유지하며 분할데이터 불균형(Imbalance)이 심할 때 필수적으로 적용해야 함
Data Leakage 방지학습 데이터에 테스트 데이터의 미래 정보나 정답 정보가 미리 포함되지 않도록 데이터 오염을 상시 체크시계열 데이터에서 '미래 데이터'로 '과거'를 학습하는 실수를 특히 경계해야 함

Shuffle (무작위 섞기):
데이터가 수집된 순서대로 정렬되어 있을 수 있으므로, 나누기 전에 반드시 랜덤하게 섞어야 합니다.
Test Set은 절대 학습에 관여 금지:
테스트 세트를 보고 모델 구조를 바꾸거나 파라미터를 수정하는 순간, 그 데이터는 더 이상 '테스트'가 아닌 '검증(Validation)' 데이터가 되어버립니다.
Stratified Split (층화 추출):
분류 문제에서 특정 클래스가 한쪽 세트에 몰리지 않도록 클래스 비율을 유지하며 나눠야 합니다. (예: 암 환자 데이터가 Test 세트에만 몰려있으면 제대로 된 평가 불가)
Data Leakage (데이터 누수) 방지:
학습 데이터에 있는 내용이 테스트 데이터에 섞여 들어가면 안 됩니다. (예: 시계열 데이터에서 미래 데이터를 학습에 쓰고 과거 데이터를 테스트에 쓰는 실수)

왜 Text와 Time-series는 랜덤 셔플을 피해야 할까?

  • 섞어도 되는 경우: 각 데이터 포인트(Row)가 서로 완전히 독립적일 때 (예: 개/고양이 사진 분류, 고객별 단발성 구매 여부)
  • 섞으면 안 되는 경우: 데이터 간의 '순서'나 '인과관계'가 성능에 영향을 미칠 때 (예: 날씨 예측, 주가 분석, 문장 생성)

1. 시계열 데이터 (Time-series)

시계열 데이터의 핵심 가정은 "과거의 데이터를 보고 미래를 예측한다"는 것입니다.

  • 문제점: 만약 랜덤하게 섞으면, 2026년의 주가 데이터를 보고 2024년의 주가를 예측하는 상황이 벌어집니다. 이는 현실에서 불가능한 '컨닝'을 하는 것과 같습니다.
  • 해결책: 특정 시점을 기준으로 앞부분은 Training, 뒷부분은 Test로 나누는 'Hold-out' 방식을 사용해야 합니다.

2. 텍스트 데이터 (Text/NLP)

텍스트 데이터, 특히 긴 글이나 대화 데이터(Chat log)는 문맥의 흐름이 중요합니다.

  • 문제점: 한 소설의 문장들을 랜덤하게 섞어서 학습셋과 테스트셋에 넣으면, 모델은 앞뒤 문장의 단서를 통해 정답을 맞히게 됩니다. 이는 모델의 언어 이해 능력을 평가하는 것이 아니라 단순히 '기억력'을 테스트하는 꼴이 됩니다.
  • 해결책: 문서 단위로 나누거나, 대화의 경우 세션(Session) 단위로 통째로 분리하여 문맥이 찢어지지 않게 해야 합니다.

학습을 구성하는 3대 요소: 정의와 관계

딥러닝 모델은 데이터를 한꺼번에 소화할 수 없기 때문에 이를 쪼개서 학습합니다. 이때 사용하는 세 가지 단위의 관계는 다음과 같습니다.

단위정의비유 (문제집 풀기)
Batch Size한 번의 연산(Update)에 사용되는 데이터 묶음의 크기한 번에 풀고 채점할 문제의 양 (예: 10문제)
Iteration전체 데이터를 배치 단위로 나누어 학습(가중치 업데이트)한 횟수문제집 한 권을 끝내기 위해 채점한 횟수
Epoch전체 데이터셋이 모델을 한 번 완전히 통과한 상태문제집 한 권을 통째로 다 푼 횟수

수학적 관계식

Iteration (횟수)=전체 데이터 수 (Total Data Size)배치 사이즈 (Batch Size)\text{Iteration (횟수)} = \frac{\text{전체 데이터 수 (Total Data Size)}}{\text{배치 사이즈 (Batch Size)}}

  • 예: 데이터가 1,000개이고 Batch Size가 100이면, 10번의 Iteration이 돌아야 1 Epoch가 완성됩니다.

데이터셋 분할과 학습 단위의 연결 (어디에 속하나?)

가장 중요한 포인트입니다. Epoch, Batch, Iteration은 오직 'Training Set' 안에서만 일어나는 역동적인 과정입니다.

① Training Set (학습의 본체)

  • 속성
    • Epoch, Batch, Iteration이 모두 적용됩니다 (모델은 설정된 Batch Size만큼 데이터를 가져와 Iteration마다 가중치를 업데이트하며, 이 과정을 반복해 여러 Epoch 동안 학습합니다.)
    • Iteration이 일어나는 유일한 장소입니다.
  • 작동:
    • loss.backward()optimizer.step()을 통해 가중치(ww)가 실시간으로 변합니다. 설정한 Epoch만큼 이 과정을 반복합니다.

② Validation Set (중간 점검)

  • 속성: 보통 Batch 단위로 나누어 검증하지만, 가중치 업데이트(Iteration)는 일어나지 않습니다.
  • 시점: 일반적으로 1 Epoch가 끝날 때마다 전체 Validation Set에 대한 성능(Metric)을 측정합니다. 이를 통해 현재 학습이 잘 되고 있는지, 과적합은 없는지 판단합니다.
  • 작동
    • 데이터를 Batch로 나누어 통과시키지만, 절대 backward()를 하지 않습니다. (가중치 고정)
    • 이때 나온 Metric을 보고 "더 학습할지(Next Epoch)" 아니면 "멈출지(Early Stopping)" 결정합니다.

③ Test Set (최종 결과)

  • 속성: 학습 과정(Epoch/Iteration)과는 완전히 독립적입니다.
  • 시점: 모든 학습이 완전히 종료된 후, 단 한 번 모델의 최종 성능을 확인하기 위해 투입됩니다.
학습 단위적용 대상 (Dataset)가중치 업데이트 (ww)주요 역할
Batch SizeTraining, Validation, Test-연산 시 메모리에 올리는 데이터 묶음의 크기
IterationOnly TrainingYes (매회)모델이 오답 노트를 쓰고 실제로 똑똑해지는 단계
EpochTraining, Validation-전체 학습 데이터를 한 번 다 훑은 반복 횟수

딥러닝 학습 프로세스

블로그에 아래와 같은 구조로 설명글을 넣으시면 독자들이 흐름을 잡기 좋습니다.

  1. 데이터 분할: 전체 데이터를 Train(80%) / Val(10%) / Test(10%)로 나눔.
  2. 루프 시작 (Epoch 1):
    • Train 데이터Batch Size로 쪼개어 여러 번의 Iteration 수행 (모델이 똑똑해지는 단계).
    • Iteration마다 loss.backward()optimizer.step()이 일어남.
  3. 중간 평가 (Validation):
    • Epoch 1이 끝나면 Val 데이터로 성능 측정 (학습 방향 수정 및 Early Stopping 결정).
  4. 반복: 위 과정을 설정한 Total Epoch만큼 반복.
  5. 최종 검증 (Test):
    • 가장 성능이 좋았던 모델을 꺼내 Test 데이터로 최종 성적표 산출.
# 전체 데이터셋을 8:1:1 또는 5:5로 나눈 후 시작
for epoch in range(total_epochs):  # [에포크]: 전체 문제집을 N번 반복
    
    # 1. Training Phase (학습 단계)
    model.train()
    for batch_idx, (data, target) in enumerate(train_loader): # [이터레이션]: 배치 단위로 학습
        optimizer.zero_grad()    # 칠판 지우기 (initialize)
        output = model(data)     # Forward: 문제 풀기
        loss = criterion(output, target) # Loss: 채점
        loss.backward()          # Backward: 오답 분석 (기울기 계산)
        optimizer.step()         # Step: 지식 업데이트 (가중치 수정)
        
        # 여기서 'batch_idx'가 올라가는 횟수가 곧 'Iteration'입니다.

    # 2. Validation Phase (검증 단계)
    model.eval()
    with torch.no_grad():        # 중요: 가중치 업데이트 안 함! (성역)
        for data, target in val_loader:
            output = model(data)
            # Metric(정확도 등) 계산하여 현재 모델의 실력 점검
            
# 3. Test Phase (최종 평가)
# 모든 Epoch가 끝난 후, 단 한 번 가장 좋았던 모델로 실행

요약

학습·검증·테스트 비교표

구분가중치(WW) 업데이트에폭(Epoch) 반복목적
TrainingO (Backward 있음)O (수백~수천 번)모델의 '뇌(지능)'를 만드는 과정
ValidationX (Backward 없음)O (학습 에폭마다 수행)'최적의 설정(pp, LR 등)'을 찾는 과정
TestX (Backward 없음)X (단 1번만 수행)'최종 성적'을 산출하는 과정

1. Training (학습): "지능의 형성"

  • 가중치 업데이트: 매 배치마다 오차를 계산하고 역전파(Backward)를 통해 가중치를 수정합니다.
  • 에폭 반복: 모델이 데이터의 패턴을 충분히 익힐 때까지 데이터를 수천 번 반복해서 보여줍니다.

2. Validation (검증): "최적의 조건 찾기"

  • 가중치 업데이트: 절대 안 합니다. 모델의 지능은 고정된 상태입니다.
  • 에폭 반복: 보통 학습 1에폭이 끝날 때마다 검증을 한 번씩 수행합니다. (예: 100에폭 학습이면 검증도 100번 함)
  • 왜 하나요? * "지금 학습이 잘 되고 있나?" 확인하기 위해.
    • "드롭아웃 비율(pp)을 0.5로 할까 0.3으로 할까?" 결정하기 위해.
    • 중요: 검증 점수가 가장 높았던 시점의 모델을 '최종 모델'로 선택합니다.

3. Test (테스트): "최종 수능 시험"

  • 가중치 업데이트: 당연히 안 합니다.
  • 에폭 반복: 안 합니다. 딱 한 번만 데이터를 통과시켜서 최종 점수를 내고 끝냅니다.
  • 왜 하나요? 학습과 검증에 전혀 관여하지 않은 '생판 남'인 데이터로 모델의 진짜 실력을 확인하기 위해서입니다.
profile
꾸준히

0개의 댓글