[AI] 테스트 세트 만들기

2026. 2. 3. 21:42·AI/Machine Learning
반응형

들어가며

우리가 설계한 모델이 정말로 잘 작동하는 지 확인하기 위해서는 테스트 세트를 만들어 확인해봐야 한다

테스트 세트는 우리가 데이터를 자세히 들여다 보기 전에 미리 떼어놓아야 한다

만약 데이터를 주의깊게 들여다봤다면 우리가 그 데이터를 머리 속에서 계속 인식하게 되어

유리한 머신러닝 모델을 선택하게 될지도 모르기 때문이다

이를 데이터 스누핑이라 한다

 

우리는 이 데이터 스누핑 편향을 막기 위해 테스트 세트를 떼어놓는 것이다

 

테스트 세트 만들기

테스트 세트를 만드는 것은 매우 간단하다

전체 데이터셋에서 20% 정도 그냥 떼어내면 된다

import numpy as np

def shuffle_and_split_data(data, test_ratio):
    shuffled_indices = np.random.permutation(len(data))
    test_set_size = int(len(data) * test_ratio)
    test_indices = shuffled_indices[:test_set_size]
    train_indices = shuffled_indices[test_set_size:]
    return data.iloc[train_indices], data.iloc[test_indices]

 

데이터가 특정 기준으로 정렬돼있을 수 있으므로 섞어준 다음

파라미터로 받은 테스트 세트 비율을 데이터 길이와 곱해서 테스트 세트 사이즈를 구한 후

리스트 인덱싱을 통해 앞부분을 테스트 세트로 하여 구한다

 

하지만 이렇게 테스트 세트를 구하는 것은 프로그램을 다시 실행할 시 다른 테스트 세트가 나오게되고

여러 번 반복할 경우 전체 데이터셋을 보게되는 셈이된다

 

해결 방법으로는 항상 같은 난수가 생성되도록 난수 발생기의 초깃값을 지정하는 방법이 있다

np.random.seed(42)
 

참고로 난수 초깃값은 주로 42가 자주 사용된다

 

하지만 이 방법도 같은 데이터일 때만 같은 셔플을 보장하므로

데이터셋이 업데이트 될 경우 또 문제가 된다

이 때 샘플들을 구분할 식별자를 사용하여 테스트 세트로 보낼지 말지 결정하는 방법이 있다

이렇게하면 원래 테스트 세트인건 업데이트 되더라도 그대로 테스트 세트이고 새로 들어온건 따로 분리가 되는 것이다

 

from zlib import crc32

def is_id_in_test_set(identifier, test_ratio):
    return crc32(np.int64(identifier)) < test_ratio * 2**32

def split_data_with_id_hash(data, test_ratio, id_column):
    ids = data[id_column]
    in_test_set = ids.apply(lambda id_: is_id_in_test_set(id_, test_ratio))
    return data.loc[~in_test_set], data.loc[in_test_set]

 

is_id_int_test_set 함수는 식별자를 받아서 기준에 따라 true/false로 나누는 함수이다

 

split_data_with_id_hash 함수에서는 id를 담고있는 열을 행단위로 순회하며

true/false로 구분된 데이터 프레임을 받아 테스트세트와 훈련세트를 구분하는 것이다

 

사이킷런 테스트 세트 함수

사이킷런에서 테스트 세트를 간단하게 나눌 수 있는 함수를 제공한다

from sklearn.model_selection import train_test_split

train_set, test_set = train_test_split(housing, test_size=0.2, random_state=42)

 

매개변수로 데이텃세이랑 테스트 세트, 사이즈비율, 난수 초깃값만 지정해주면 알아서

train_set과 test_set이 생성된다

 

마치며

이번 글에서는 테스트 세트를 어떤 식으로 생성하는 지에 대하여 알아보았다

테스트 세트 생성은 프로젝트에서 굉장히 중요한 부분 중 하나이지만 종종 등한시된다고 해서

이렇게 글로 정리를 해보면서 테스트 세트가 생성되는 과정과 함수 파라미터의 의미나

내부적인 코드를 이해해보려고 노력했다

 

 

 

 

반응형

'AI > Machine Learning' 카테고리의 다른 글

[AI] 텍스트 특성 다루기  (1) 2026.02.06
[AI] 데이터 정제하기  (0) 2026.02.04
[AI] 홀드아웃 검증(holdout validation), 교차 검증(cross-validation)  (0) 2026.01.21
[AI] 과대 적합(overfitting), 과소 적합(underfitting)  (1) 2026.01.21
[AI] 사례 기반 학습(instance-based learning), 모델 기반 학습(model-based learning)  (0) 2026.01.20
'AI/Machine Learning' 카테고리의 다른 글
  • [AI] 텍스트 특성 다루기
  • [AI] 데이터 정제하기
  • [AI] 홀드아웃 검증(holdout validation), 교차 검증(cross-validation)
  • [AI] 과대 적합(overfitting), 과소 적합(underfitting)
20puddle
20puddle
20puddle 님의 블로그 입니다.
  • 20puddle
    20puddle 님의 블로그
    20puddle
  • 전체
    오늘
    어제
    • 분류 전체보기 (100)
      • Spring boot (5)
      • git & github (5)
      • algorithm (47)
        • theory (3)
        • 배열 (7)
        • 연결 리스트 (3)
        • 스택 (5)
        • 큐 (3)
        • 덱 (2)
        • 기초 코드 (19)
        • BFS (5)
      • AI (43)
        • Machine Learning (35)
        • Deep Learning (8)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    오프라인 학습
    Aimers
    DL
    Java
    딥러닝
    알고리즘
    인공지능
    AI
    게시판
    github
    백준
    연결리스트
    홀드아웃 검증
    ML
    그레디언트 클리핑
    git
    머신러닝
    list
    주성분변환
    Spring Boot
  • 최근 댓글

  • 최근 글

  • 반응형
  • hELLO· Designed By정상우.v4.10.3
20puddle
[AI] 테스트 세트 만들기
상단으로

티스토리툴바