분할기(Splitter)

calico·2025년 11월 25일

Artificial Intelligence

목록 보기
113/143

1. 데이터 분석 / 머신러닝에서의 분할기(Splitter)


  • 데이터셋을 학습용(train), 검증용(validation), 테스트용(test)으로 나누는 도구 또는 알고리즘입니다.

  • 올바른 분할은 모델 성능의 신뢰도와 일반화 능력 평가에 매우 중요합니다.

  • 대표 예

    • train_test_split

    • KFold, StratifiedKFold

    • GroupKFold

    • TimeSeriesSplit (시계열)



2. 활용법


  • 모델 성능 검증

    • 과적합을 방지하고 일반화 성능을 판단하기 위해 데이터 나누기 필수.
  • 하이퍼파라미터 튜닝 결합

    • GridSearchCV, RandomizedSearchCV 등은 내부적으로 Splitter를 활용합니다.
  • 클래스 불균형 해결

    • Stratified 옵션을 적용하면 적은 클래스가 과소표본되는 문제를 완화할 수 있음.
  • 시계열 예측

    • 데이터가 시간 순서 의존적이므로 무작위 분할이 아닌 TimeSeriesSplit을 사용해야 함.



3. Splitter 종류별 특징 비교


A. 기본 분할기


  • train_test_split

    • 가장 널리 사용되는 기본 분할기

    • 무작위 샘플링으로 단순하고 빠름

    • 옵션: test_size, train_size, random_state, stratify



B. K-Fold 계열


  • KFold

    • 데이터를 K개의 폴드로 나누고 번갈아 테스트셋으로 사용

    • 단점: 클래스 불균형 환경에서 성능 왜곡 가능

  • StratifiedKFold

    • K-Fold에 계층화(stratify) 개념이 추가된 형태

    • 분류 문제에서 가장 널리 사용



C. 그룹 기반 분할기


  • GroupKFold

    • 하나의 그룹이 train과 test에 동시에 들어가는 것을 방지

    • 예: 한 사용자의 데이터가 두 세트로 나뉘면 안 되는 경우



D. 시계열 기반 분할기


  • TimeSeriesSplit

    • 시간 순서를 보존하면서 학습/검증 데이터 생성

    • 미래 정보가 과거로 새어 들어가는 data leakage 방지



4. 주의사항


  • 무작위 분할로 인한 데이터 편향

  • 특히 소수 클래스가 있는 분류 문제 → stratify=y 필수

  • 데이터 누수(Data Leakage) 방지

    • 스케일링, 인코딩 같은 전처리는 반드시 학습용 데이터로만 fit, 테스트에는 transform 해야 함.

    • Pipeline 사용 권장.

  • 시계열 데이터는 절대 random split 금지

    • 예측 성능이 인위적으로 높아짐 → 현업에서 가장 흔한 실수
  • 그룹 데이터 주의 (한 고객·한 환자)

    • 고객 단위로 분리해야 데이터 누수 방지 가능

    • 예: 고객 1의 구매 이력 일부가 train, 일부가 test → 안 됨



5. 일반 분할(train_test_split) + stratify 적용 예시 설명


코드 요약


  • train_test_split 함수로 데이터를 무작위로 분할

  • stratify=y 옵션으로 클래스 비율을 유지

  • random_state=42로 결과를 재현 가능하게 설정



어떤 상황에서 사용?


  • 분류(Classification) 문제에서 클래스 비율이 중요한 경우

  • 무작위 분할(random split)이 허용되는 일반적인 머신러닝 상황

  • 이미지, 탭울러 데이터, 텍스트 등 대부분의 정형 데이터



코드 상세 설명



from sklearn.model_selection import train_test_split

X = [[1], [2], [3], [4], [5], [6]]
y = [0, 1, 0, 1, 0, 1]
  • X: 특징(feature)

  • y: 레이블(label)

  • 0과 1 클래스가 번갈아 나오므로 불균형 문제는 없지만, stratify 테스트 목적에 적합한 데이터



X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    test_size=0.33,
    random_state=42,
    stratify=y
)
  • test_size=0.33: 전체의 33%를 테스트셋으로 사용

  • stratify=y

    • y의 0과 1 비율을 train과 test에 동일하게 유지

    • 예: 전체에서 0:3, 1:3 이라면 train과 test에서도 동일한 비율로 분배

  • random_state=42: 결과가 재현 가능하도록 난수 시드 고정



print("Train:", X_train, y_train)
print("Test:", X_test, y_test)
  • 어떤 샘플이 train/test로 나뉘었는지 확인



실무에서 중요 포인트


  • 분류(Classification) 문제에서는 반드시 stratify 사용하는 것이 안정적으로 일반적인 성능 측정 가능

  • train/test에 클래스 비율이 다르면 모델 성능이 왜곡될 수 있음

  • random_state를 고정하면 협업/배포 환경에서 재현성 확보됨



6. 시계열(TimeSeriesSplit) 분할 예시 설명


코드 요약


  • TimeSeriesSplit은 데이터를 시간 순서대로 증가시키며 분할

  • 과거 데이터로 학습하고 미래 데이터로 테스트하는 구조

  • 시계열 예측에서 반드시 사용해야 하는 split 방식



어떤 상황에서 사용?


  • 시간 흐름이 중요한 시계열 데이터(Time Series)

  • 예: 매출 예측, 주가 예측, 센서 데이터, 사용자 로그 데이터

  • 미래 정보를 과거 모델 학습에 사용하면 안 되는 경우 → 데이터 누수 방지



코드 상세 설명



from sklearn.model_selection import TimeSeriesSplit
import numpy as np

tscv = TimeSeriesSplit(n_splits=3)
data = np.arange(10)
  • n_splits=3: 학습/검증을 3번 반복

  • data = np.arange(10) → 시계열 데이터를 0~9의 숫자로 가정



for문에서 수행되는 split 구조


for train_index, test_index in tscv.split(data):
    print("Train:", train_index, " Test:", test_index)

출력 구조는 예를 들어 다음과 같습니다:

1번째 split  
Train: [0,1]  
Test:  [2]

2번째 split  
Train: [0,1,2,3]  
Test:  [4]

3번째 split  
Train: [0,1,2,3,4,5]  
Test:  [6]

(데이터 길이에 따라 달라질 수 있음)



핵심 특징


  • 항상 과거 데이터 → 미래 데이터 순서

  • train이 점점 커지는 expanding window 방식

  • 무작위가 아니라 시간순으로 고정된 split



실무에서 중요 포인트

  • 시계열 예측에서는 절대 train_test_split(random) 사용 금지

    → 미래 데이터가 훈련 데이터에 섞여 성능이 거짓으로 높아지는 데이터 누수 발생

  • TimeSeriesSplit은 모델의 미래 예측 능력을 실제처럼 평가할 수 있음



7. 정리: 두 코드의 핵심 차이


방식목적특징사용 사례
train_test_split + stratify일반 ML 분류무작위 분할, 클래스 비율 유지이미지, 탭울러, 일반 데이터
TimeSeriesSplit시계열 ML시간 순서 유지, expanding 검증매출 예측, 경제지표, IoT 센서



profile
https://velog.io/@corone_hi/posts

0개의 댓글