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

End-to-End Workflow

~28 min · workflow, end-to-end

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

끝까지 이어진 한 경로를 먼저 만들어

기계학습 프로젝트는 문제 계약, 자료 수집, 감사, 분할, 전처리 파이프라인, 기준선, 모델 비교, 평가, 확률 보정, 문턱 선택, 결과물 저장, 배포, 감시로 이어져. 첫 반복에서는 각 단계를 작게 만들더라도 원시 자료 한 건이 최종 예측과 기록까지 통과하게 해야 해. 중간 정확도만 높고 끝 경로가 끊겨 있으면 제품이 아니라 실험 조각이야.

문제 계약이 모든 단계의 기준이야

무엇을 어느 시점에 예측하고 누가 어떤 행동에 쓰는지, 합법적으로 사용할 수 있는 입력과 목표값, 주 지표, 기준선, 오류 비용을 먼저 적어. 이 계약이 없으면 자료팀은 다른 시점의 열을 만들고 모델팀은 운영과 무관한 지표를 최적화할 수 있어. 계약 변경은 코드와 자료 버전, 재평가를 함께 요구해.

자료를 받은 즉시 감사하고 얼려

원본 자료를 읽기 전용으로 보존하고 행 수, 식별자, 자료형, 결측, 범주, 시간 범위를 자동 보고해. 누출 가능 열과 중복 집단을 찾은 뒤 학습·검증·시험 분할의 행 식별자를 저장해. 이후 전처리와 모델 비교는 같은 분할에서 해야 차이를 모델 변화로 돌릴 수 있어.

전처리와 모델을 한 파이프라인으로

결측 대치, 스케일링, 인코딩, 특성 선택을 노트북 셀에 흩뜨리지 말고 추정기와 묶어. 교차검증의 각 학습 폴드에서만 변환기를 맞추고, 제공 때도 원시 행에 같은 파이프라인을 적용해. 기준선부터 복잡한 후보까지 가능한 한 같은 입력 계약과 평가 코드를 공유해야 복붙된 경로가 갈라지지 않아.

작은 기준선 뒤에만 튜닝을 붙여

회귀의 평균 예측, 분류의 범주 비율이나 로지스틱 회귀처럼 단순한 기준선을 먼저 기록해. 후보 모델은 교차검증 평균과 흔들림, 운영 지표, 응답 시간으로 비교해. 초매개변수 탐색은 계산 예산과 중단 조건을 정하고, 모든 선택이 끝날 때까지 얼린 시험 자료를 열지 마.

확률에서 행동까지 분리해

분류라면 순위 성능뿐 아니라 확률 보정을 확인하고 실제 비용과 처리 능력으로 문턱을 골라. 모델 점수, 문턱, 최종 결정은 서로 다른 책임이야. 결과물에는 파이프라인과 입력 스키마, 모델 버전, 문턱, 평가 수치, 자료 해시를 함께 묶어야 해.

규모가 커져도 읽히는 폴더

ml_project/
├── data/{raw,interim,processed}
├── notebooks/
├── src/
│   ├── contract.py
│   ├── features.py
│   ├── train.py
│   ├── eval.py
│   └── predict.py
├── tests/
├── artifacts/
└── README.md

노트북은 탐색과 그림에 쓰고 반복 가능한 학습과 평가는 src/의 명령으로 옮겨. 결과물과 실행 기록은 코드에서 분리하되 어떤 실행이 무엇을 만들었는지 식별자로 연결해.

재현은 같은 명령으로 확인해

의존성 버전을 고정하고 Python, NumPy, 모델 라이브러리의 모든 무작위 씨앗을 기록해. 자료 해시, 코드 커밋, 설정, 지표, 결과물 해시를 한 실험 기록에 남겨. 새 프로세스나 깨끗한 환경에서 한 명령으로 같은 허용 오차의 지표와 예측을 만들 수 있어야 해. 팀원이 10분 안에 재실행하지 못하면 아직 재현 가능한 프로젝트가 아니야.

Code

처음부터 끝까지 실행되는 학습 스크립트·python
import joblib
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
from src.contract import load_contract
from src.features import build_preprocessor
from src.eval import evaluate

def main():
    contract = load_contract("contracts/churn.yaml")
    df = load_data(contract)
    X, y = df[contract.features], df[contract.target]
    pipe = Pipeline([("pre", build_preprocessor(contract)), ("clf", LogisticRegression(max_iter=1000))])
    pipe.fit(X, y)
    evaluate(pipe, X, y, contract)
    joblib.dump(pipe, contract.artifact_path)

if __name__ == "__main__":
    main()
결과물에 영향을 주는 모든 값 고정하기·yaml
experiment:
  id: churn_2026_05_03_a
  data_hash: a8f1d8e9
  git_commit: 4f7c2e1
  random_seed: 7
  python: 3.12.4
  packages:
    scikit-learn: 1.5.0
    lightgbm: 4.5.0
  metrics:
    pr_auc: 0.317
    recall_at_p70: 0.62

External links

Exercise

최근 노트북을 src/ 모듈로 옮겨 python -m src.train --config contracts/your_problem.yaml로 실행 가능하게 해. 새 프로세스에서 같은 자료 해시, 허용 오차의 지표, 동일한 결과물 스키마가 나오는지 검증해.

Progress

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

댓글 0

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

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