데이터 분할·특징·전처리
관련 기초 개념
개요
평가셋 정보가 학습에 새지 않는 파이프라인을 설계한다.
먼저 결측·이상·중복·데이터 권리, 성능 지표와 데이터 누출 입문의 핵심 개념을 확인하세요.
핵심 개요
학습·검증·시험 자료를 나누는 이유는 선택에 사용한 자료와 최종 성능을 측정하는 자료를 분리하기 위해서입니다. 시간 예측은 미래를 과거에 섞지 않고, 같은 사용자·문서의 유사 항목이 양쪽에 퍼지지 않도록 분할합니다.
결측 대체·스케일링·특징 선택은 학습 자료에만 맞춥니다. 이후 검증·시험 자료에는 이미 정한 변환을 적용합니다. 파이프라인으로 변환과 모델을 묶으면 이 순서를 유지하기 쉽습니다.
필요한 용어
- Fit: 학습 자료에서 변환이나 모델의 매개변수를 정하는 작업
- Transform: 이미 정한 변환을 자료에 적용하는 작업
작동 과정
- 예측 시점·사용자·중복 조건에 맞춰 분할합니다.
- 학습 자료에서만 전처리와 모델을 맞춥니다.
- 검증으로 선택하고 마지막 시험 자료는 평가에만 사용합니다.
풀이 예제
아래 입력과 기록은 직접 만든 교육용 가상 자료입니다.
입력·조건
학습 값은 10·20이고 시험 값은 100입니다. 전체 평균으로 빈칸을 채우자는 제안이 있습니다.
판단·결과
학습에서 얻은 평균 15를 사용해야 합니다. 전체 평균 약 43.33은 시험 정보를 포함합니다.
이렇게 판단한 이유
전처리에도 평가 정보가 들어가면 모델 이전 단계에서 이미 누출이 일어납니다.
로컬 실행 예제
검증 환경: Python 3.12.14, numpy 2.3.5, pandas 2.2.3, scikit-learn 1.8.0. pip install numpy==2.3.5 pandas==2.2.3 scikit-learn==1.8.0 후 python ml_pipeline.py. 운영 자료는 포함하지 않습니다.
python -m pip install numpy==2.3.5 pandas==2.2.3 scikit-learn==1.8.0
python ml_pipeline.py"""Synthetic classification workflow; assertions verify behavior, not real-world quality."""
import numpy as np
import pandas as pd
import sklearn
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix, precision_recall_fscore_support
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder, StandardScaler
x = pd.DataFrame({'age':[20,25,30,np.nan,45,50,55,60,22,27,32,37,42,47,52,57],
'city':['Seoul','Busan']*8})
y = np.array([0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1])
train, test = train_test_split(np.arange(len(y)), test_size=0.25, random_state=7, stratify=y)
preprocess = ColumnTransformer([
('number', Pipeline([('impute', SimpleImputer(strategy='median')), ('scale', StandardScaler())]), ['age']),
('category', Pipeline([('impute', SimpleImputer(strategy='most_frequent')), ('encode', OneHotEncoder(handle_unknown='ignore'))]), ['city'])])
model = Pipeline([('prepare', preprocess), ('classify', LogisticRegression(random_state=7))])
model.fit(x.iloc[train], y[train])
actual_median = model.named_steps['prepare'].named_transformers_['number'].named_steps['impute'].statistics_[0]
assert actual_median == np.nanmedian(x.iloc[train]['age'])
prediction = model.predict(x.iloc[test])
assert prediction.shape == (4,)
assert confusion_matrix(y[test], prediction, labels=[0,1]).sum() == 4
p,r,f,_ = precision_recall_fscore_support(y[test], prediction, average='binary', zero_division=0)
unknown = pd.DataFrame({'age':[np.nan], 'city':['Daejeon']})
assert model.predict(unknown).shape == (1,)
try:
model.predict(unknown.drop(columns='age'))
except ValueError:
pass
else:
raise AssertionError('missing required column was accepted')
print(f'PASS: train-only preprocessing, unseen category, missing-column rejection; sklearn {sklearn.__version__}')
print(f'Synthetic held-out n=4: precision={p:.3f}, recall={r:.3f}, F1={f:.3f}; not a deployment score')기대 결과: 학습 자료만 전처리 학습·새 범주 처리·필수 열 누락 거절
2026-10-21 로컬 환경에서 실행했습니다. 가상 자료·소형 CPU 예제의 동작 검사이며 실제 업무 모델의 품질·클라우드·GPU·Office 제품 연동 검증은 아닙니다.
흔한 실패와 복구
전체 자료를 정규화한 뒤 분할하지 않습니다. 분할을 먼저 하고 학습 파이프라인 안에서 전처리합니다.
확인 문제
전처리 매개변수를 정할 자료는?
- 학습 자료만
- 시험 자료를 포함한 전체 자료
- 가장 성능이 잘 나온 시험 행만
풀이 기록 기능을 불러오는 중…
해설 보기
정답: A. 학습 자료만
학습 자료만 전체 자료를 정규화한 뒤 분할하지 않습니다. 분할을 먼저 하고 학습 파이프라인 안에서 전처리합니다.
참고 자료
- scikit-learn: Common pitfalls — 분할 전후 전처리와 데이터 누출.
- scikit-learn: Model evaluation — 분류·회귀의 평가 지표.
자료 확인: 2026-10-21. 사례·문항·실습은 자체 제작했습니다. 외부 서비스 호출과 실제 모델 품질 측정은 학습자가 별도 환경에서 수행합니다.
직접 적용하기
교육용 가상 상황
동일 고객의 매월 거래 자료로 다음 달 이탈을 예측합니다. 분할·결측 처리·평가 절차를 정하세요.
평가셋 정보가 학습에 새지 않는 파이프라인을 설계한다. 판단 근거와 검증할 결과를 적으세요.
답안 저장 기능을 불러오는 중…
검증 기준과 해설 보기
- 미래를 학습에 섞지 않는다
- 고객 중복이 평가 목적과 맞는지 검토한다
- 전처리를 학습 자료에서만 fit한다
예측 기준일 이후 자료를 시험 구간으로 두고 사후 해지 정보는 입력에서 제외합니다. 신규 고객 일반화가 목표라면 고객 단위 분리도 적용합니다. 결측 대체·스케일링은 학습 자료에서만 맞추고 같은 변환을 시험에 적용합니다.
복습하기
- Fit과 transform은 어떻게 다른가요?
- 시간 자료를 무작위 분할해도 되나요?
- 시험셋은 언제 쓰나요?
답변 확인 기준
- Fit과 transform은 어떻게 다른가요?
값을 정하는 단계와 정한 값을 적용하는 단계입니다.
- 시간 자료를 무작위 분할해도 되나요?
예측 목적과 미래 정보 누출을 먼저 검토해야 합니다.
- 시험셋은 언제 쓰나요?
선택이 끝난 뒤 최종 비교에 사용합니다.