2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

교차검증

2025. 6. 9. 11:47ㆍ개발공부/인공지능
728x90

검증 세트 (Validation Set)

 

왜 필요한가?

  • 테스트 세트 없이는 모델이 과소적합(underfitting) 인지, 과적합(overfitting) 인지 판단하기 어렵습니다.
  • 따라서 훈련 세트(Training Set) 를 다시 검증 세트(Validation Set) 로 나누어 사용합니다.

 

용어 정의
훈련 세트 (Training Set) 모델을 학습시키기 위한 데이터
검증 세트 (Validation Set) 하이퍼파라미터 튜닝 및 성능 평가에 사용되는 데이터 모델이 직접적으로 학습하지 않는 데이터를 기반으로 성능을 평가
테스트 세트 (Test Set) 최종적으로 모델 성능을 확인하기 위해 사용하는 데이터

 


 

1. 모델 훈련 및 튜닝

  • 훈련 세트로 모델을 학습하고,
  • 검증 세트로 모델의 성능을 평가합니다.
  • 이 과정을 통해 튜닝하고 싶은 하이퍼파라미터(예: 학습률, 은닉층 수 등)를 바꾸며 최적 조합을 탐색합니다.

 

2. 최종 모델 재학습

  • 가장 성능이 좋았던 하이퍼파라미터 설정을 선택한 뒤,
  • 훈련 세트 + 검증 세트를 합쳐서 전체 데이터로 모델을 다시 훈련시킵니다.

3. 테스트 세트로 최종 평가

  • 테스트 세트는 오직 최종 성능 평가에만 사용합니다.
  • 이 테스트 점수는 실제 배포 시 모델 성능을 예측하는 신뢰 가능한 지표가 됩니다.

 


 

교차 검증(Cross Validation)

 

정의:

  • 검증 세트를 여러 번 다르게 나누어 반복 평가하는 기법.
  • 모델의 일반화 성능을 더 안정적이고 신뢰성 있게 평가할 수 있음.

 

3-폴드 교차 검증(3-Fold Cross Validation)의 예시

훈련 데이터를 3개의 폴드(Fold)로 나눈 후:

  1. 1번째 폴드 → 검증, 나머지 2개 → 학습
  2. 2번째 폴드 → 검증, 나머지 2개 → 학습
  3. 3번째 폴드 → 검증, 나머지 2개 → 학습

→ 이 과정을 3번 수행하여 각 폴드가 한 번씩 검증 세트가 되도록 함.

 


 

Scikit-learn의 분할기(splitter)를 사용한 교차 검증

 

분할기의 역할

  • 데이터를 폴드(fold)로 나누어 교차 검증을 수행 가능하게 함.
  • split() 메서드를 통해 학습/검증용 인덱스를 생성.

 

주요 분할기 종류와 특징

 

1. KFold

  • 데이터를 순서대로 나눔.
  • 기본값은 섞지 않음.
  • shuffle=True 옵션 사용 시, 데이터를 무작위로 섞은 후 나눔.
from sklearn.model_selection import KFold
kf = KFold(n_splits=5, shuffle=True, random_state=42)

 

2. StratifiedKFold

  • 클래스 비율을 유지한 채 폴드를 나눔 (분류 문제에 적합).
  • 예: 전체 데이터의 클래스 비율이 70:30이면 각 폴드에서도 동일한 비율로 유지.
from sklearn.model_selection import StratifiedKFold
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

 

cross_validate()의 주의점

  • cross_validate()훈련 세트를 섞지 않고 폴드로만 나눔.
  • 즉, 이미 섞인 상태의 데이터를 폴드로 분할하기 때문에 shuffle=True 같은 처리가 필요 없음.
  • cv 인자 생략 시:
    • 분류 문제: StratifiedKFold 기본 사용
    • 회귀 문제: KFold 기본 사용

 

# 기본 사용 예시
from sklearn.model_selection import cross_validate, StratifiedKFold

scores = cross_validate(dt, train_input, train_target, cv=StratifiedKFold())
print(np.mean(scores['test_score']))
  • cv 인자에 StratifiedKFold() 를 전달.
  • 분류 문제에서는 StratifiedKFold가 기본적으로 권장됨.
  • 결과: 약 0.855의 평균 정확도.

 

# 매개변수를 지정하여 사용하고 싶을 때
splitter = StratifiedKFold(n_splits=10, shuffle=True, random_state=42)

scores = cross_validate(dt, train_input, train_target, cv=splitter)
print(np.mean(scores['test_score']))
  • n_splits=10: 10폴드로 나눔.
  • shuffle=True: 데이터를 무작위로 섞은 후 분할.
  • random_state=42: 재현성 보장을 위해 시드 고정.
  • 결과: 약 0.857의 평균 정확도.
728x90

'개발공부 > 인공지능' 카테고리의 다른 글

트리의 앙상블  (0) 2025.06.09
그리드서치와 랜덤서치  (0) 2025.06.09
확률적 경사 하강법  (0) 2025.06.05
일반화 (Generalization)  (0) 2025.06.03
선형 회귀 모델 (Linear Regression Model)  (0) 2025.06.03