Skip to main content

ML 워크플로우

머신러닝 프로젝트는 단순히 모델을 학습시키는 것이 아닙니다. 문제 정의부터 데이터 수집, 전처리, 모델링, 평가, 배포까지 체계적인 과정을 거칩니다.

학습 목표

  • ML 프로젝트의 전체 워크플로우를 단계별로 설명할 수 있습니다.
  • 각 단계에서 수행해야 할 핵심 작업을 파악할 수 있습니다.
  • 데이터 누수(Data Leakage)를 방지하는 원칙을 이해합니다.
  • 반복적 개선(Iterative Improvement)의 중요성을 인식합니다.

왜 중요한가

대부분의 ML 프로젝트 실패는 모델의 성능이 나빠서가 아니라, 잘못된 문제 정의, 데이터 누수, 부적절한 평가 전략 때문입니다. 체계적인 워크플로우를 따르면 이러한 실수를 사전에 예방할 수 있습니다.

핵심 개념

전체 워크플로우 개요

1단계: 문제 정의

프로젝트의 성공 여부를 결정하는 가장 중요한 단계입니다. 핵심 질문:
  • 비즈니스 문제는 무엇인가? (예: 고객 이탈 예측)
  • ML 문제로 어떻게 변환할 수 있는가? (예: 이진 분류)
  • 성공 기준은 무엇인가? (예: 재현율 90% 이상)
  • 어떤 데이터를 사용할 수 있는가?
ML 문제 유형비즈니스 문제 예시출력 형태
이진 분류스팸 여부 판별0 또는 1
다중 분류뉴스 카테고리 분류N개 클래스 중 하나
회귀주택 가격 예측연속 수치
군집화고객 세분화그룹 할당

2단계: 데이터 수집

모델의 품질은 데이터의 품질에 의존합니다. “Garbage In, Garbage Out”이라는 원칙을 항상 기억해야 합니다.
import pandas as pd

# CSV 파일에서 데이터 로드
df = pd.read_csv("data/customer_data.csv")

# 기본 정보 확인
print(f"데이터 크기: {df.shape}")       # (행 수, 열 수)
print(f"결측치 현황:\n{df.isnull().sum()}")
print(f"데이터 타입:\n{df.dtypes}")
데이터 수집 시 고려사항:
  • 충분한 양: 모델이 패턴을 학습할 수 있는 최소 데이터 양 확보
  • 대표성: 실제 서비스 환경의 데이터 분포를 반영
  • 품질: 오류, 중복, 결측치의 비율 파악
  • 윤리적 고려: 개인정보 보호, 편향 방지

3단계: 탐색적 데이터 분석 (EDA)

데이터의 특성을 파악하고 가설을 수립하는 과정입니다.
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.read_csv("data/housing.csv")

# 수치형 변수 기술통계
print(df.describe())

# 타겟 변수 분포 확인
sns.histplot(df["price"], bins=50, kde=True)
plt.title("주택 가격 분포")
plt.xlabel("가격")
plt.ylabel("빈도")
plt.show()

# 상관관계 히트맵
sns.heatmap(df.corr(numeric_only=True), annot=True, cmap="coolwarm")
plt.title("변수 간 상관관계")
plt.show()
EDA에 대한 상세한 방법론은 탐색적 데이터 분석 문서에서 다룹니다.

4단계: 데이터 전처리

원본 데이터를 모델이 학습할 수 있는 형태로 변환합니다.
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.impute import SimpleImputer

# 학습/테스트 분할 (반드시 전처리 전에!)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

# 결측치 처리 (학습 데이터 기준으로 fit)
imputer = SimpleImputer(strategy="median")
X_train = imputer.fit_transform(X_train)
X_test = imputer.transform(X_test)  # transform만 사용

# 스케일링 (학습 데이터 기준으로 fit)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)   # transform만 사용
데이터 누수(Data Leakage) 주의: 전처리(스케일링, 인코딩 등)는 반드시 학습 데이터에만 fit하고, 테스트 데이터에는 transform만 적용해야 합니다. 전체 데이터에 fit_transform을 적용하면 테스트 데이터의 정보가 학습에 유출됩니다.

5단계: 모델 선택 및 학습

문제 유형과 데이터 특성에 맞는 알고리즘을 선택하고 학습합니다.
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC

# 여러 모델을 후보로 준비
models = {
    "로지스틱 회귀": LogisticRegression(max_iter=1000),
    "랜덤 포레스트": RandomForestClassifier(n_estimators=100, random_state=42),
    "SVM": SVC(kernel="rbf", random_state=42),
}

# 각 모델 학습 및 기본 점수 확인
for name, model in models.items():
    model.fit(X_train, y_train)
    score = model.score(X_test, y_test)
    print(f"{name}: {score:.4f}")
어떤 알고리즘을 선택해야 할지 모르겠다면 알고리즘 선택 가이드를 참고하세요.

6단계: 모델 평가

단일 지표가 아닌 다각적 평가를 수행합니다.
from sklearn.metrics import classification_report, confusion_matrix

# 예측 수행
y_pred = best_model.predict(X_test)

# 분류 보고서 출력
print(classification_report(y_test, y_pred))

# 혼동 행렬
cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt="d", cmap="Blues")
plt.xlabel("예측 라벨")
plt.ylabel("실제 라벨")
plt.title("혼동 행렬")
plt.show()
평가 지표 선택에 대한 상세 가이드는 분류 평가 지표회귀 평가 지표를 참고하세요.

7단계: 모델 배포

검증을 통과한 모델을 실제 서비스에 적용합니다.
import joblib

# 모델 저장
joblib.dump(best_model, "model/classifier_v1.joblib")
joblib.dump(scaler, "model/scaler_v1.joblib")
joblib.dump(imputer, "model/imputer_v1.joblib")

# 모델 로드 및 추론
loaded_model = joblib.load("model/classifier_v1.joblib")
loaded_scaler = joblib.load("model/scaler_v1.joblib")

# 새 데이터에 대한 예측
new_data_scaled = loaded_scaler.transform(new_data)
predictions = loaded_model.predict(new_data_scaled)
모델 저장과 배포에 대한 상세 내용은 모델 저장과 배포를 참고하세요.

8단계: 모니터링 및 재학습

배포된 모델의 성능을 지속적으로 모니터링합니다.
  • 데이터 드리프트(Data Drift): 입력 데이터의 분포가 학습 시점과 달라지는 현상
  • 모델 드리프트(Model Drift): 모델의 예측 성능이 시간이 지남에 따라 저하되는 현상
  • 재학습 트리거: 성능 저하 감지 시 새 데이터로 모델을 재학습

AI/ML에서의 활용

실무에서는 이 워크플로우를 파이프라인으로 자동화하는 것이 일반적입니다. Scikit-learn Pipeline을 사용하면 전처리와 모델 학습을 하나의 객체로 묶을 수 있고, MLflow를 사용하면 실험 관리를 체계적으로 수행할 수 있습니다.
일반적으로 데이터 수집/정제/전처리에 전체 시간의 60-80%를 투자하게 됩니다. 모델 학습 자체는 10-20%에 불과합니다. 좋은 데이터가 좋은 모델을 만든다는 점을 기억하세요.
아닙니다. ML 워크플로우는 반복적(iterative)입니다. EDA 중에 문제 정의를 수정하거나, 모델 평가 결과에 따라 전처리 방법을 변경하는 것은 자연스러운 과정입니다.
학습 목적이라면 6단계(모델 평가)까지만 수행해도 충분합니다. 배포와 모니터링은 실무 프로젝트에서 경험하는 것이 효과적입니다.

체크리스트

  • ML 워크플로우의 8단계를 순서대로 나열할 수 있다
  • 데이터 누수의 개념과 방지 방법을 설명할 수 있다
  • 전처리에서 fit과 transform의 차이를 이해한다
  • 모델 평가와 선택의 기본 원리를 설명할 수 있다

다음 문서