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번째 폴드 → 검증, 나머지 2개 → 학습
- 2번째 폴드 → 검증, 나머지 2개 → 학습
- 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 |