학습, 설정 선택, 최종 평가를 나눕니다
훈련 자료로 모델의 계수와 전처리 기준을 배우고, 검증 자료로 설정을 고른 뒤, 시험 자료로 최종 성능을 평가합니다. 시험 점수를 보며 설정을 계속 바꾸면 그 자료를 모델 선택에 사용한 셈이므로 독립적인 최종 평가로 보기 어렵습니다.
| 구분 | 사용 목적 | 예시 | 피할 일 |
|---|---|---|---|
| 훈련 | 모델과 전처리 기준 학습 | 평균 계산, 회귀계수 추정 | 검증과 시험 정보를 섞어 학습 |
| 검증 | 후보와 설정 선택 | 나무 깊이 3과 6 비교 | 한 점수만 보고 과도하게 반복 조정 |
| 시험 | 선택이 끝난 절차 평가 | 고정한 모형의 최종 오차 확인 | 시험 점수가 좋아질 때까지 설정 변경 |
70:15:15나 80:20 같은 비율은 상황에 따라 고르는 설계입니다. 자료 수가 적거나 드문 범주가 있으면 각 묶음에 충분한 사례가 남는지도 중요합니다. 비율이 정석처럼 보여도 미래 기록과 과거 기록이 섞이거나 같은 대상의 복제 행이 양쪽에 들어가면 평가 목적을 달성하지 못합니다.
정답을 숨겨도 전처리에서 정보가 샐 수 있습니다
데이터 누수는 예측할 때 사용할 수 없는 정보가 학습이나 모델 선택에 들어가는 문제입니다. 정답 열을 입력에서 빼는 것만으로 끝나지 않습니다. 전체 자료로 평균과 표준편차를 계산한 뒤 훈련과 시험을 나누면 시험 자료의 분포가 이미 학습 기준에 반영됩니다. 결측치 대치, 변수 선택, 주성분분석에서도 같은 문제가 생길 수 있습니다.
평균을 빼는 중심화만으로 확인해 보겠습니다. 훈련 값이 10과 20, 시험 값이 100인 가상 예제입니다. 훈련 평균은 15이므로 바뀐 훈련 값은 −5와 5, 시험 값은 85입니다. 전체 평균 130/3, 약 43.33을 먼저 사용하면 훈련 값은 약 −33.33과 −23.33으로 달라집니다. 시험 값 100이 훈련 데이터를 바꾸는 계산에 끼어든 것입니다.
전체 자료를 사용했다고 모든 예제에서 점수가 꼭 높아지는 것은 아닙니다. 점수가 올랐는지보다 평가 자료가 학습 절차에 영향을 줬다는 사실이 문제입니다. 반대로 시험 자료만의 평균을 다시 구해 따로 중심화하는 것도 같은 입력 처리 규칙이 아닙니다. 새 관측값에도 훈련에서 정한 기준을 적용해야 모델이 학습한 척도를 유지할 수 있습니다.
먼저 자료를 나눈 뒤 훈련 자료에서 전처리 기준을 구합니다. 검증과 시험 자료도 그 기준으로 변환합니다. scikit-learn에서는 보통 훈련에 fit 또는 fit_transform을 쓰고 나머지에는 transform을 적용합니다. Pipeline은 전처리와 모델 학습을 묶어 이 순서를 지키기 쉽게 해 줍니다.
교차검증은 검증 역할을 번갈아 맡깁니다
훈련과 검증에 사용할 자료 12개를 크기가 같은 세 묶음 A, B, C로 나눴다고 합시다. 첫 회차는 B와 C로 학습하고 A로 검증합니다. 다음은 A와 C로 학습하고 B로 검증하며 마지막은 A와 B로 학습하고 C로 검증합니다. 각 회차의 학습용 자료는 8개, 검증용 자료는 4개입니다. 이처럼 역할을 바꾸는 방법이 K겹 교차검증입니다.
| 회차 | 학습에 사용 | 검증에 사용 | 평균절대오차 예 |
|---|---|---|---|
| 1 | B, C | A | 2 |
| 2 | A, C | B | 3 |
| 3 | A, B | C | 4 |
검증 묶음의 크기가 같으므로 이 예의 평균 오차는 (2+3+4)/3=3입니다. 세 점수의 차이도 함께 봐야 특정 묶음에서만 성능이 나쁜지 알 수 있습니다. 교차검증은 매 회차 같은 모델을 이어 학습하는 것이 아니라, 그 회차의 학습 부분만으로 모델을 새로 맞춥니다.
전처리도 회차마다 다시 학습합니다. 12개 전체에서 표준화한 뒤 교차검증하면 검증 역할의 4개가 이미 전처리 기준에 들어가 있습니다. 각 회차의 8개만으로 기준을 구해야 합니다. 설정을 고른 뒤에는 훈련과 검증에 사용했던 자료를 합쳐 최종 모델을 학습할 수 있지만 따로 남긴 시험 자료는 이 단계에도 섞지 않습니다.
무엇이 새로운 자료인지에 맞춰 나눕니다
모든 행이 서로 다른 대상을 비슷한 조건에서 관측한 자료라면 무작위 분할을 검토할 수 있습니다. 범주 비율을 비슷하게 유지하는 층화 분할은 희귀한 범주가 한 묶음에서 사라지는 문제를 줄이는 데 유용합니다. 다만 층화했다고 시간 순서나 같은 사람의 반복 기록 문제까지 해결되는 것은 아닙니다.
새 회원의 행동을 예측하려는데 기존 회원 한 명의 기록 10개를 무작위로 나누면 같은 회원이 훈련과 시험에 함께 들어갈 수 있습니다. 모델이 회원별 특성을 기억해 점수가 좋아지더라도 새 회원에게 같은 결과를 기대하기 어렵습니다. 이 목적이라면 회원 ID를 그룹으로 삼아 같은 회원의 기록이 양쪽에 걸치지 않게 나눕니다. GroupKFold는 이런 그룹 분리의 한 방법입니다.
반대로 기존 회원의 다음 달 행동이 목표라면 회원이 같다는 이유만으로 무조건 제외하기보다, 예측 시점 뒤의 정보를 쓰지 않도록 시간 조건을 먼저 설계해야 합니다. 새 사람을 예측하는 문제와 기존 사람의 미래를 예측하는 문제는 평가해야 할 변화가 다릅니다. 시간과 그룹 조건이 모두 필요하다면 두 조건을 함께 만족하도록 나눕니다.
미래 대여량을 예측할 때는 앞 기간으로 학습하고 뒤 기간으로 검증합니다. 예측 결과가 확정되기까지 일주일이 걸리는 자료라면 경계의 기록에 미래 정보가 겹치지 않는지도 확인해야 합니다.
좋은 점수보다 재현할 수 있는 절차를 남깁니다
분할을 설명할 때는 누구의 언제 기록으로 배우고 누구의 언제 기록을 맞혔는가를 한 문장으로 적어 보세요. 행 번호만 다르게 나눴다고 독립적인 평가 자료가 되는 것은 아닙니다.
최종 기록에는 분할 기준, 각 묶음의 크기와 범주 비율, 전처리를 학습한 범위, 모델 선택에 쓴 지표를 남깁니다. 무작위 시드를 고정하면 같은 분할을 재현하기 쉽지만 누수가 사라지는 것은 아닙니다.
핵심 정리와 실수 점검
핵심 정리
- 훈련은 학습, 검증은 선택, 시험은 선택이 끝난 절차의 최종 평가에 사용합니다.
- 전처리 기준은 훈련 부분에서만 구하며 교차검증의 각 회차에서도 다시 학습합니다.
- 시간과 그룹 구조에 맞춰 분할해야 실제로 만날 새로운 자료의 조건을 평가할 수 있습니다.
놓치기 쉬운 지점
- 정답 열만 제거하면 전체 자료로 표준화해도 누수가 없다고 생각하는 실수
- 시험 점수를 보고 설정을 반복해서 고른 뒤 이를 독립적인 최종 성능이라고 보고하는 실수
확인할 내용
- 예측 시점에 실제로 알 수 있는 입력값인지 확인한다.
- 각 전처리 기준을 계산한 자료 범위를 기록한다.
- 같은 대상이나 미래 정보가 훈련과 평가 양쪽에 섞이는지 점검한다.
이해한 내용 확인하기
직접 작성한 학습용 문항입니다. 공식 기출문제가 아닙니다.
Q1. 훈련 값이 2와 6이고 시험 값이 10입니다. 평균을 빼는 중심화에서 올바른 훈련 평균과 변환된 시험 값은 얼마인가요?
생각한 뒤 해설 보기
훈련 평균은 (2+6)/2=4이고 시험 값은 10−4=6입니다. 시험 값을 포함한 전체 평균 6을 기준으로 쓰지 않습니다.
Q2. 15개를 같은 크기의 5개 묶음으로 나눠 K겹 교차검증을 합니다. 한 회차의 학습 수와 검증 수는 각각 얼마인가요?
생각한 뒤 해설 보기
학습 12개, 검증 3개입니다. 다섯 회차를 진행하면 각 관측값이 한 번 검증 역할을 합니다. 각 회차의 모델과 전처리는 그 회차 학습 부분에서 새로 맞춥니다.
Q3. 양성 비율을 맞춰 층화 분할했지만 동일 회원의 기록이 훈련과 시험에 함께 있습니다. 새 회원 예측을 공정하게 평가했다고 볼 수 있나요?
생각한 뒤 해설 보기
그 사실만으로는 볼 수 없습니다. 층화는 범주 비율을 맞출 뿐 회원 중복을 막지 않습니다. 새 회원이 목표라면 회원 단위 그룹 분할을 검토해야 합니다.
Q4. 학습에 시험 정답을 직접 쓰지는 않았지만 시험 정확도가 좋아질 때까지 나무 깊이를 20번 바꿨습니다. 시험 자료는 어떤 역할을 했나요?
생각한 뒤 해설 보기
모델 선택을 위한 검증 역할을 했습니다. 그 자료에서 고른 최고 점수를 독립적인 최종 성능이라고 보고하기 어렵습니다.
Q5. 매일 수집한 자료를 무작위로 섞고 시드를 고정했습니다. 미래 예측에서 누수가 없다는 근거가 되나요?
생각한 뒤 해설 보기
아닙니다. 시드 고정은 분할을 재현하는 데 도움이 될 뿐입니다. 미래가 과거의 학습에 들어가지 않았는지, 입력값이 예측 시점에 알려져 있었는지 따로 확인해야 합니다.
더 궁금한 점
교차검증을 하면 시험 데이터가 필요 없나요?
설정 선택에 사용한 교차검증 점수는 선택 과정의 영향을 받습니다. 독립된 최종 성능을 확인하려면 별도 시험 자료를 남기거나 중첩 교차검증처럼 선택과 평가를 분리한 설계를 고려합니다.
검증 데이터와 시험 데이터는 프로그램에서 같은 이름으로 불리기도 하나요?
교차검증 도구는 회차별 평가 묶음을 test라고 부르기도 합니다. 이름보다 사용 목적을 보세요. 후보를 비교하는 데 썼다면 그 묶음은 모델 선택을 위한 검증 역할을 한 것입니다.
참고 자료와 확인 범위
- scikit-learn 데이터 누수와 전처리 ↗
자료 분할 후 전처리 학습, fit과 transform의 역할, Pipeline을 사용한 누수 방지 원칙을 확인했습니다.
- scikit-learn 교차검증 ↗
모델 선택과 최종 평가의 구분, K겹, 층화, 시간 분할의 적용 조건을 확인했습니다.
- scikit-learn GroupKFold ↗
같은 그룹이 학습과 평가 양쪽에 겹치지 않게 하는 분할 원리를 확인했습니다.