본문 바로가기
C.W.K.
Stream
Lesson 08 of 08 · published

scikit-learn으로 짠 데이터 Pipeline

~30 min · pipelines, sklearn, reproducibility

Level 0Scout
0 XP0/48 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

원시 행에서 예측까지 길은 하나여야 해

scikit-learn의 Pipeline은 전처리 단계와 추정기를 맞추기, 예측하기, 저장하기가 가능한 하나의 객체로 묶어. 핵심은 편리한 문법이 아니라 경로의 단일성이야. 학습에서는 노트북 셀로 결측을 채우고 서비스에서는 다른 함수로 처리하면 두 구현이 언젠가 갈라져. 원시 DataFrame을 넣어 예측을 받는 유일한 길이 파이프라인이어야 해.

파이프라인은 누출을 구조적으로 막아

교차검증에 파이프라인 전체를 넘기면 각 폴드의 학습 부분에서 대치기, 스케일러, 인코더, 특성 선택기와 모델이 차례로 맞춰져. 검증 부분은 이미 맞춰진 변환만 통과하므로 전체 자료 통계가 새어 들어갈 틈이 줄어. GridSearchCV로 전처리 선택과 모델 초매개변수를 함께 비교해도 같은 경계가 유지돼.

열별 경로를 명시해

ColumnTransformer를 파이프라인 첫 단계에 두고 수치 열, 범주 열, 통과 열을 이름으로 지정해. 열 선택을 위치 번호에 기대면 원천 표의 순서가 바뀌었을 때 조용히 다른 값을 처리할 수 있어. 필요한 열, 허용 자료형, 처음 보는 열과 빠진 열의 동작도 입력 스키마 검사로 분리해 두는 게 좋아.

직렬화는 코드와 환경까지 묶는 계약이야

joblib으로 저장한 파이프라인은 같은 변환과 모델을 한 파일로 옮길 수 있지만 영구히 호환되는 형식은 아니야. 학습 코드 버전, Python과 라이브러리 버전, 입력 스키마, 자료 버전, 평가 결과를 결과물 옆에 기록해. 신뢰하지 못하는 pickle이나 joblib 파일은 코드를 실행할 수 있으므로 외부에서 받은 파일을 그대로 열어서도 안 돼.

새 프로세스에서 왕복 시험해

학습이 끝나면 파이프라인을 저장하고 현재 메모리를 비운 새 프로세스에서 다시 불러. 실제 제공 요청과 같은 원시 행을 넣어 predict와 필요하면 predict_proba가 동작하는지 확인해. 저장 전후 출력이 허용 오차 안에서 같은지, 열 순서가 바뀌거나 선택 열이 빠졌을 때 분명한 오류를 내는지도 시험해.

학습과 제공 사이 경계를 닫아

파이프라인만으로 해결되지 않는 검증, 문턱 적용, 결과 형식 변환은 별도 제공 계약에 명시해. 그래도 특성 계산을 파이프라인 밖의 숨은 노트북 셀에 남겨서는 안 돼. pipeline.predict(raw_row)로 결과를 재현하지 못한다면 배포할 결과물이 아직 완성되지 않은 거야. 단일 경로는 복붙을 줄이는 규칙이 아니라 같은 입력이 같은 의미를 갖게 하는 안전장치야.

Code

교차검증을 포함한 전체 파이프라인·python
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score

pre = ColumnTransformer([
    ("num", Pipeline([("impute", SimpleImputer(strategy="median")), ("scale", StandardScaler())]), numeric_cols),
    ("cat", OneHotEncoder(handle_unknown="ignore"), categorical_cols),
])
pipe = Pipeline([("pre", pre), ("clf", LogisticRegression(max_iter=500))])
scores = cross_val_score(pipe, X, y, cv=5, scoring="average_precision")
print("PR-AUC:", scores.mean(), "+/-", scores.std())
파이프라인을 단일 결과물로 저장하고 불러오기·python
import joblib

pipe.fit(X_train, y_train)
joblib.dump(pipe, "artifacts/churn_v1.joblib")

loaded = joblib.load("artifacts/churn_v1.joblib")
loaded.predict(X_new_raw_rows)  # transforms + predicts in one call

External links

Exercise

학습 노트북을 고쳐 원시 DataFrame에서 예측까지의 유일한 길이 joblib에 저장된 하나의 fitted Pipeline이 되게 해. 새 프로세스에서 불러 실제 형태의 원시 행으로 pipe.predict(raw_row)를 실행하고 저장 전후 결과와 오류 동작을 검증해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.