[AI-004][기초] 학습·검증·테스트를 나눠 과적합 찾기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[AI-004][기초] 학습·검증·테스트를 나눠 과적합 찾기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 215회 작성일 26-08-31 13:34

본문

[이번 수업]
모델이 본 문제를 외워 높은 점수를 받아도 새 데이터에서는 틀릴 수 있습니다. 이번에는 학습·검증·테스트 데이터의 역할을 나누고, 순수 Python으로 암기 모델과 단순 규칙을 비교해 과적합을 확인합니다. 외부 모델이나 GPU는 필요 없습니다.

[선수지식]
AI-001~003의 머신러닝·지도학습·특징·레이블 기초와 Python 함수·리스트를 알면 됩니다. 정확도는 전체 예측 중 맞힌 비율입니다.

[학습목표]
1. 학습·검증·테스트 세 집합의 역할을 설명한다.
2. 학습 점수와 검증 점수 차이로 과적합을 찾는다.
3. 테스트 데이터를 모델 선택과 분리한다.

[핵심개념]
학습 세트는 모델의 파라미터를 맞추는 데이터입니다. 검증 세트는 모델 종류, 복잡도, 하이퍼파라미터(학습 전에 정하는 설정)를 선택하는 데 씁니다. 테스트 세트는 선택이 끝난 모델의 일반화 성능, 즉 보지 못한 데이터에서의 성능을 마지막에 한 번 평가합니다.

과적합은 학습 데이터에는 매우 잘 맞지만 새 데이터에는 약한 상태입니다. 모델이 지나치게 복잡하거나 데이터가 적고 잡음이 많을 때 생기기 쉽습니다. 반대로 과소적합은 모델이 너무 단순해 학습·검증 점수가 모두 낮은 상태입니다. 학습 점수만으로 두 문제를 구분할 수 없으므로 검증 결과를 함께 봐야 합니다.

테스트 점수를 보며 모델을 계속 고치면 테스트 정보가 선택 과정에 새어 들어가는 데이터 누수(leakage)가 됩니다. 그러면 테스트가 더 이상 공정한 최종 평가가 아닙니다. 전처리의 평균·표준편차나 특징 선택도 학습 데이터에서만 계산해 검증·테스트에 적용해야 합니다. 데이터가 적으면 학습 부분을 여러 조각으로 번갈아 검증하는 교차 검증을 쓰되, 최종 테스트는 별도로 남깁니다. 시간 데이터와 같은 사람의 반복 측정은 무작위 분할 대신 시간·그룹 구조도 고려합니다.

[따라하기]
아래를 split_demo.py로 저장합니다. memorizer는 학습에서 본 x만 기억하고 처음 보는 값은 0으로 답합니다. simple_rule은 x가 5 이상인지 판단합니다. 이 작은 예제는 모델 선택 원리만 보여줍니다.

```python
train = [(0, 0), (1, 0), (2, 0), (3, 0), (4, 0),
        (5, 1), (6, 1), (7, 1)]
validation = [(-2, 0), (8, 1), (9, 1), (10, 1)]
test = [(-3, 0), (11, 1)]
memory = dict(train)

def memorizer(x):
    return memory.get(x, 0)

def simple_rule(x):
    return int(x >= 5)

def accuracy(model, data):
    correct = sum(model(x) == label for x, label in data)
    return correct / len(data)

candidates = {"memorizer": memorizer, "simple_rule": simple_rule}
for name, model in candidates.items():
    print(f"{name} train={accuracy(model, train):.2f} "
          f"validation={accuracy(model, validation):.2f}")

selected_name = max(
    candidates, key=lambda name: accuracy(candidates[name], validation)
)
selected = candidates[selected_name]
print("selected:", selected_name)
print(f"test={accuracy(selected, test):.2f}")
```

macOS/Linux는 `python3 split_demo.py`, Windows는 `py split_demo.py`를 실행합니다. memorizer는 train 1.00, validation 0.25이고 simple_rule은 둘 다 1.00입니다. 선택 결과는 simple_rule, 마지막 test는 1.00입니다.

[흔한 실수]
학습 정확도만 보고 모델을 확정하거나, 테스트 세트로 하이퍼파라미터를 고르지 마세요. 분할 전에 전체 데이터로 정규화하면 누수가 생길 수 있습니다. 분류에서는 각 집합의 레이블 비율도 확인하고, 작은 검증 점수 차이를 절대적인 우열로 해석하지 마세요.

[보안 주의]
예제처럼 합성 데이터만 사용하세요. 실제 데이터에는 개인정보·민감 속성이 있을 수 있으므로 목적, 접근 권한, 보존 기간을 정하고 분할 파일도 보호합니다. 로그에 원본 행을 남기지 말고 데이터 출처와 동의 범위를 확인하세요. 인터넷에서 받은 모델·데이터 파일을 신뢰하지 말고 격리 환경에서 형식과 무결성을 검사합니다.

[직접 해볼 과제]
1. validation에 `(4, 0)`을 추가하고 두 점수를 다시 계산하세요.
2. 항상 1을 답하는 모델을 추가해 과소적합 여부를 설명하세요.
3. 시간순 데이터라면 세 집합을 어떤 순서로 나눌지 그림으로 적으세요.

[확인문제]
1. 검증 세트와 테스트 세트의 역할은 어떻게 다른가요?
2. 학습 점수는 높고 검증 점수는 낮은 상태를 무엇이라 하나요?
3. 테스트 결과를 보며 모델을 반복 수정하면 왜 문제가 되나요?

[다음 학습]
다음 순환은 DATA-004 SQL로 집계하고 분석하기입니다. AI 트랙은 AI-005 특성공학과 전처리 파이프라인으로 이어집니다.

[공식 참고 자료]
https://scikit-learn.org/stable/modules/cross_validation.html
https://scikit-learn.org/stable/auto_examples/model_selection/plot_underfitting_overfitting.html
https://scikit-learn.org/stable/common_pitfalls.html#data-leakage

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
5,077
어제
6,862
최대
16,772
전체
771,028
Copyright © 소유하신 도메인. All rights reserved.