콘텐츠로 이동

Chapter 9: 2차시 마무리 - 내 분류기 완성하기

한 줄 요약: 학습된 모델을 저장하고, 전체 머신러닝 워크플로우를 복습하며, 나만의 프로젝트를 준비해요!


🎯 이 장에서 배우는 것

  • [ ] 학습된 모델을 파일로 저장할 수 있다
  • [ ] 저장된 모델을 불러와서 예측에 사용할 수 있다
  • [ ] 데이터 준비 → 분할 → 학습 → 예측 → 평가 워크플로우를 설명할 수 있다
  • [ ] 다른 데이터셋에 같은 방법을 적용할 자신감을 갖는다

💡 왜 이걸 배우나요?

모델 저장이 왜 필요할까?

상상해봐. 3시간 동안 모델을 학습시켰어. 그런데 컴퓨터를 끄면... 다 사라져! 😱

[3시간 학습 완료!]
     ↓
[컴퓨터 종료]
     ↓
[내일 다시 켜면... 처음부터 다시?!]

모델을 저장하면: - 나중에 바로 사용: 학습 안 해도 예측 가능 - 다른 사람과 공유: 친구에게 모델 파일만 보내면 됨 - 앱으로 만들기: 웹사이트나 앱에서 사용 가능

복습이 왜 필요할까?

2차시에서 많은 걸 배웠어. 하나하나는 이해했는데, 전체 그림이 안 그려질 수 있어.

"데이터 분할은 알겠는데... 전체 순서가 뭐였지?"
"train_test_split은 언제 쓰는 거지?"
"fit이랑 predict 순서가...?"

이번 장에서 전체 퍼즐을 맞춰볼 거야!


📚 핵심 개념

개념 1: 모델 저장과 불러오기

비유로 시작: 모델 저장은 마치 게임 세이브와 같아요. 레벨 50까지 키운 캐릭터를 저장해두면, 나중에 불러와서 바로 플레이할 수 있죠.

정확히 말하면: 학습된 모델의 상태(가중치, 파라미터 등)를 파일로 저장하는 것입니다. Python에서는 주로 joblib이나 pickle 라이브러리를 사용합니다.

예시로 확인:

import joblib

# 저장 (게임 세이브)
joblib.dump(model, 'my_model.pkl')

# 불러오기 (게임 로드)
loaded_model = joblib.load('my_model.pkl')

쉽게 말하면: 학습된 모델을 파일로 저장해서 나중에 다시 쓸 수 있어!


개념 2: 머신러닝 워크플로우

비유로 시작: 머신러닝 워크플로우는 마치 요리 레시피와 같아요. 재료 준비 → 손질 → 조리 → 맛보기 → 완성, 이 순서를 지켜야 맛있는 요리가 나오죠.

정확히 말하면: 머신러닝 프로젝트를 진행하는 표준화된 단계입니다.

┌─────────────────────────────────────────────────────────────┐
│                   머신러닝 워크플로우                         │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   1️⃣ 데이터     2️⃣ 데이터     3️⃣ 모델      4️⃣ 예측     5️⃣ 평가   │
│      준비    →    분할    →    학습   →          →         │
│                                                             │
│   [CSV 파일]   [train/test]  [fit()]   [predict()]  [점수]   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

예시로 확인: | 단계 | 요리 비유 | 머신러닝 | |------|----------|----------| | 1. 데이터 준비 | 재료 사오기 | CSV 파일 로드 | | 2. 데이터 분할 | 맛보기용 따로 | train_test_split | | 3. 모델 학습 | 요리하기 | model.fit() | | 4. 예측 | 완성된 요리 | model.predict() | | 5. 평가 | 맛 평가 | accuracy_score() |

쉽게 말하면: 데이터 → 분할 → 학습 → 예측 → 평가, 이 5단계만 기억하면 돼!


개념 3: 파일 확장자 .pkl

비유로 시작: .pkl 파일은 마치 진공 포장과 같아요. 음식을 진공 포장하면 신선하게 보관할 수 있듯이, 모델을 .pkl로 저장하면 나중에 그대로 사용할 수 있어요.

정확히 말하면: pickle(피클)은 Python 객체를 바이트 형태로 변환해서 파일로 저장하는 방식입니다. .pkl은 그 파일의 확장자예요.

예시로 확인:

model (Python 객체)
     ↓ joblib.dump()
my_model.pkl (파일)
     ↓ joblib.load()
loaded_model (Python 객체)

쉽게 말하면: .pkl은 Python 객체를 저장하는 파일 형식이야!


🔨 따라하기

Step 1: 이전 장에서 만든 모델 다시 만들기

목표: 저장할 모델을 먼저 만들어보자!

📦 데이터셋 선택지 - Iris (붓꽃) 데이터셋 - sklearn 내장 - 와인 품질 데이터셋 - sklearn 내장 - 직접 준비한 분류 데이터셋

어떤 걸 써도 이 장의 내용은 동일하게 적용됩니다.

코드:

# === WHAT: 분류 모델 만들기 (복습) ===
# 이전 장에서 배운 내용을 한 번에 실행!

# --- WHY: 저장할 모델이 필요하니까 ---

# 필요한 라이브러리 불러오기
from sklearn.datasets import load_iris  # 데이터셋
from sklearn.model_selection import train_test_split  # 분할
from sklearn.tree import DecisionTreeClassifier  # 모델
from sklearn.metrics import accuracy_score  # 평가

# 1단계: 데이터 준비
print("=" * 50)
print("1단계: 데이터 준비")
print("=" * 50)
iris = load_iris()  # 붓꽃 데이터 로드
X = iris.data       # 특성 (꽃잎/꽃받침 크기)
y = iris.target     # 정답 (품종)
print(f"전체 데이터: {len(X)}개")
print(f"특성 개수: {X.shape[1]}개")
print(f"품종 종류: {len(set(y))}개")

# 2단계: 데이터 분할
print("\n" + "=" * 50)
print("2단계: 데이터 분할")
print("=" * 50)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, 
    test_size=0.2,      # 20%는 테스트용
    random_state=42     # 재현 가능하게
)
print(f"훈련 데이터: {len(X_train)}개")
print(f"테스트 데이터: {len(X_test)}개")

# 3단계: 모델 학습
print("\n" + "=" * 50)
print("3단계: 모델 학습")
print("=" * 50)
model = DecisionTreeClassifier(random_state=42)  # 모델 생성
model.fit(X_train, y_train)  # 학습!
print("학습 완료! ✅")

# 4단계: 예측
print("\n" + "=" * 50)
print("4단계: 예측")
print("=" * 50)
y_pred = model.predict(X_test)  # 테스트 데이터로 예측
print(f"예측 결과 (처음 5개): {y_pred[:5]}")
print(f"실제 정답 (처음 5개): {y_test[:5]}")

# 5단계: 평가
print("\n" + "=" * 50)
print("5단계: 평가")
print("=" * 50)
accuracy = accuracy_score(y_test, y_pred)
print(f"정확도: {accuracy:.2%}")
print("🎉 모델 완성!")

실행 결과:

==================================================
1단계: 데이터 준비
==================================================
전체 데이터: 150개
특성 개수: 4개
품종 종류: 3개

==================================================
2단계: 데이터 분할
==================================================
훈련 데이터: 120개
테스트 데이터: 30개

==================================================
3단계: 모델 학습
==================================================
학습 완료! ✅

==================================================
4단계: 예측
==================================================
예측 결과 (처음 5개): [1 0 2 1 1]
실제 정답 (처음 5개): [1 0 2 1 1]

==================================================
5단계: 평가
==================================================
정확도: 100.00%
🎉 모델 완성!

여기서 잠깐! 🤔

5단계 워크플로우가 한눈에 보이지? 이 순서는 모든 머신러닝 프로젝트에서 똑같아!


Step 2: 모델 저장하기

목표: 학습된 모델을 파일로 저장하자!

코드:

# === WHAT: 모델을 파일로 저장하기 ===
# 게임 세이브처럼 모델을 저장!

# --- WHY: 나중에 다시 쓰려고 ---

import joblib  # 모델 저장/불러오기 라이브러리

# 모델 저장
# joblib.dump(저장할_객체, '파일이름.pkl')
joblib.dump(model, 'my_classifier.pkl')

print("✅ 모델이 'my_classifier.pkl' 파일로 저장되었습니다!")
print("\n저장된 정보:")
print(f"  - 모델 종류: {type(model).__name__}")
print(f"  - 학습한 데이터 수: {len(X_train)}개")
print(f"  - 정확도: {accuracy:.2%}")

실행 결과:

✅ 모델이 'my_classifier.pkl' 파일로 저장되었습니다!

저장된 정보:
  - 모델 종류: DecisionTreeClassifier
  - 학습한 데이터 수: 120개
  - 정확도: 100.00%

여기서 잠깐! 🤔

joblib.dump()는 딱 두 가지만 넣으면 돼: 1. 저장할 모델 (학습이 끝난 모델) 2. 파일 이름 (.pkl 확장자 권장)


Step 3: 저장된 모델 불러오기

목표: 저장한 모델을 다시 불러와서 사용해보자!

코드:

# === WHAT: 저장된 모델 불러오기 ===
# 게임 로드처럼 모델을 불러오기!

# --- WHY: 학습 없이 바로 예측하려고 ---

# 기존 모델 삭제 (테스트를 위해)
del model
print("기존 모델 삭제됨 (테스트용)")

# 저장된 모델 불러오기
# joblib.load('파일이름.pkl')
loaded_model = joblib.load('my_classifier.pkl')

print("\n✅ 모델을 'my_classifier.pkl'에서 불러왔습니다!")
print(f"불러온 모델 종류: {type(loaded_model).__name__}")

# 불러온 모델로 예측해보기
print("\n--- 불러온 모델로 예측 테스트 ---")
new_prediction = loaded_model.predict(X_test)
new_accuracy = accuracy_score(y_test, new_prediction)
print(f"예측 정확도: {new_accuracy:.2%}")
print("✨ 학습 없이 바로 예측 성공!")

실행 결과: ``` 기존 모델 삭제됨 (테스트용)

✅ 모델을 'my_classifier.pkl'에서 불러왔습니다! 불러온 모델 종류: DecisionTreeClassifier

--- 불러온 모델로 예측 테스트 ---