Skip to main content
학습이 완료된 모델을 저장하고, 나중에 로드하여 새로운 데이터에 대한 예측을 수행하는 방법을 학습합니다.

학습 목표

  • joblib과 pickle을 사용하여 모델을 직렬화할 수 있습니다.
  • ONNX 형식으로 모델을 변환하여 범용 추론에 활용할 수 있습니다.
  • 모델 버전 관리의 기본 원칙을 이해합니다.

모델 저장 실습

1
joblib을 사용한 저장/로드
2
import joblib
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier

# 파이프라인 포함 모델 학습
pipe = Pipeline([
    ("scaler", StandardScaler()),
    ("model", RandomForestClassifier(n_estimators=100, random_state=42))
])
pipe.fit(X_train, y_train)

# 모델 저장 (파이프라인 전체 저장)
joblib.dump(pipe, "model/classifier_pipeline_v1.joblib")

# 모델 로드 및 예측
loaded_pipe = joblib.load("model/classifier_pipeline_v1.joblib")
predictions = loaded_pipe.predict(X_test)
print(f"로드된 모델 정확도: {loaded_pipe.score(X_test, y_test):.4f}")
3
ONNX 변환
4
from skl2onnx import convert_sklearn
from skl2onnx.common.data_types import FloatTensorType

# scikit-learn 모델을 ONNX로 변환
initial_type = [("float_input", FloatTensorType([None, X_train.shape[1]]))]
onnx_model = convert_sklearn(pipe, initial_types=initial_type)

# ONNX 파일 저장
with open("model/classifier_v1.onnx", "wb") as f:
    f.write(onnx_model.SerializeToString())

# ONNX Runtime으로 추론
import onnxruntime as rt
import numpy as np

sess = rt.InferenceSession("model/classifier_v1.onnx")
input_name = sess.get_inputs()[0].name
pred = sess.run(None, {input_name: X_test.astype(np.float32)})[0]
print(f"ONNX 추론 결과: {pred[:5]}")
5
모델 버전 관리
6
import json
from datetime import datetime

# 모델 메타데이터 저장
metadata = {
    "version": "1.0.0",
    "created_at": datetime.now().isoformat(),
    "model_type": "RandomForestClassifier",
    "n_features": X_train.shape[1],
    "training_score": float(pipe.score(X_train, y_train)),
    "test_score": float(pipe.score(X_test, y_test)),
    "hyperparameters": {
        "n_estimators": 100,
        "max_depth": None,
    }
}

with open("model/metadata_v1.json", "w") as f:
    json.dump(metadata, f, indent=2, ensure_ascii=False)

저장 형식 비교

형식장점단점적합한 상황
joblib빠름, NumPy 최적화Python 전용같은 환경에서 재사용
pickle표준 라이브러리보안 위험, 느림간단한 저장
ONNX범용, 프레임워크 독립변환 복잡도프로덕션 서빙
scikit-learn 모델은 joblib을 권장합니다. NumPy 배열이 포함된 객체를 더 효율적으로 저장하고, 큰 모델의 경우 압축 옵션도 제공합니다.
Python 외 환경(C++, Java, JavaScript)에서 추론해야 하거나, 프레임워크에 독립적인 모델 배포가 필요할 때 ONNX를 사용합니다.

체크리스트

  • joblib로 모델을 저장하고 로드할 수 있다
  • 파이프라인 전체를 하나의 파일로 저장할 수 있다
  • ONNX 변환의 목적을 설명할 수 있다
  • 모델 메타데이터를 함께 관리하는 습관을 갖추었다

다음 문서

AutoML

모델 선택과 튜닝을 자동화합니다.

실험 관리

MLflow로 모델 버전을 체계적으로 관리합니다.

언제 쓰나

현재 문제의 목표 지표와 데이터 특성을 먼저 확인한 뒤 적용합니다. 작은 실험셋으로 빠르게 기준 성능을 확인한 뒤, 필요하면 더 복잡한 모델로 확장합니다.

실무 적용 체크리스트

  • 데이터 누수 가능성을 먼저 점검했습니다.
  • 학습/검증/테스트 분할 기준을 고정했습니다.
  • 핵심 지표(예: F1, RMSE, AUC)를 명시했습니다.
  • 베이스라인 대비 개선폭과 비용 변화를 함께 기록했습니다.

자주 나는 실수

  1. 데이터 분할 전에 전처리를 수행해 데이터 누수가 발생합니다.
  2. 단일 지표만 보고 모델을 선택해 운영 성능이 불안정해집니다.
  3. 하이퍼파라미터를 과도하게 조정해 검증셋 과적합이 생깁니다.