머신러닝

머신러닝 모델 저장 및 로딩 방법

move84 2025. 4. 14. 07:50
반응형

머신러닝 모델을 학습한 후에는 이를 저장하고 불러오는 과정이 필수적이다. 저장된 모델은 재학습 없이 새로운 데이터에 대한 예측을 수행하거나, 다른 환경에서 재사용될 수 있다. 본 포스트에서는 머신러닝 모델을 저장하고 로딩하는 다양한 방법에 대해 알아보고, 실제 코드 예제를 통해 쉽게 이해할 수 있도록 설명한다.

---

🤖 **모델 저장의 중요성**  
모델 저장은 여러 가지 중요한 이유를 가진다. 첫째, 학습된 모델을 저장함으로써 시간과 자원을 절약할 수 있다. 모델을 매번 재학습시키는 대신, 저장된 모델을 불러와 즉시 사용할 수 있다. 둘째, 모델의 재사용성을 높일 수 있다. 저장된 모델은 다른 프로젝트나 환경에서 쉽게 활용될 수 있으며, 협업 시 모델 공유를 용이하게 한다. 셋째, 모델의 버전 관리를 통해 일관성을 유지할 수 있다. 다양한 실험을 통해 얻은 모델들을 저장하고 관리함으로써, 최적의 성능을 보이는 모델을 선택하고 유지할 수 있다.

---

💾 **`pickle` 모듈을 이용한 저장 및 로딩**  
`pickle`은 파이썬 객체를 직렬화(serialization)하여 파일로 저장하고, 다시 역직렬화(deserialization)하여 객체로 복원하는 데 사용되는 모듈이다. 간단한 모델을 저장하고 불러오는 데 유용하다.

```python
import pickle
from sklearn.linear_model import LinearRegression

# 모델 학습
model = LinearRegression()
X = [[1], [2], [3]]
y = [1, 2, 3]
model.fit(X, y)

# 모델 저장
filename = 'linear_regression_model.pkl'
pickle.dump(model, open(filename, 'wb'))

# 모델 로딩
loaded_model = pickle.load(open(filename, 'rb'))

# 로딩된 모델 사용
print(loaded_model.predict([[4]]))
```

위 코드에서 `pickle.dump()` 함수는 모델 객체를 파일에 저장하고, `pickle.load()` 함수는 파일에서 모델 객체를 불러온다. `wb`는 write binary, `rb`는 read binary 모드를 의미한다.

---

📚 **`joblib` 라이브러리를 이용한 저장 및 로딩**  
`joblib`은 파이썬 객체를 효율적으로 저장하고 불러오는 데 특화된 라이브러리이다. 특히 NumPy 배열과 같이 큰 데이터를 다루는 데 `pickle`보다 빠르고 효율적이다. `scikit-learn` 모델을 저장하고 불러오는 데 자주 사용된다.

```python
import joblib
from sklearn.ensemble import RandomForestClassifier

# 모델 학습
model = RandomForestClassifier()
X = [[1, 2], [3, 4], [5, 6]]
y = [0, 1, 0]
model.fit(X, y)

# 모델 저장
filename = 'random_forest_model.joblib'
joblib.dump(model, filename)

# 모델 로딩
loaded_model = joblib.load(filename)

# 로딩된 모델 사용
print(loaded_model.predict([[7, 8]]))
```

`joblib.dump()` 함수는 모델 객체를 파일에 저장하고, `joblib.load()` 함수는 파일에서 모델 객체를 불러온다. `joblib`은 큰 데이터에 대한 최적화를 제공하므로, 대규모 모델을 저장하고 불러오는 데 유용하다.

---

🧠 **`HDF5` 파일을 이용한 저장 및 로딩 (Keras)**  
 `HDF5` (Hierarchical Data Format version 5)는 대용량의 수치 데이터를 저장하기 위한 파일 형식이다. 주로 딥러닝 프레임워크인 `Keras`에서 모델을 저장하고 불러오는 데 사용된다. `HDF5` 파일은 데이터를 계층적으로 저장할 수 있어, 복잡한 모델 구조를 효율적으로 관리할 수 있다.

```python
import tensorflow as tf
from tensorflow import keras
import numpy as np

# 모델 생성
model = keras.Sequential([
    keras.layers.Dense(10, activation='relu', input_shape=(10,)),
    keras.layers.Dense(1, activation='sigmoid')
])

model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])

# 학습 데이터 생성
X = np.random.rand(100, 10)
y = np.random.randint(0, 2, 100)

# 모델 학습
model.fit(X, y, epochs=10)

# 모델 저장
filename = 'keras_model.h5'
model.save(filename)

# 모델 로딩
loaded_model = keras.models.load_model(filename)

# 로딩된 모델 사용
test_data = np.random.rand(1, 10)
print(loaded_model.predict(test_data))
```

`model.save()` 함수는 모델을 `HDF5` 파일로 저장하고, `keras.models.load_model()` 함수는 `HDF5` 파일에서 모델을 불러온다. `Keras`는 모델의 구조와 가중치를 함께 저장하므로, 모델을 완전히 복원할 수 있다.

---

🔥 **모델 저장 시 주의사항**  
모델을 저장하고 불러올 때 몇 가지 주의사항이 있다. 첫째, 모델을 저장할 때 사용한 라이브러리와 버전을 동일하게 유지해야 한다. 버전이 다르면 모델이 제대로 로딩되지 않거나 오류가 발생할 수 있다. 둘째, 모델을 저장할 때 사용한 환경과 동일한 환경에서 모델을 불러와야 한다. 필요한 라이브러리가 설치되어 있지 않으면 모델을 로딩할 수 없다. 셋째, 보안에 유의해야 한다. 신뢰할 수 없는 출처의 모델을 로딩하는 것은 보안 위험을 초래할 수 있으므로, 주의해야 한다.

---

✅ **요약**  
머신러닝 모델을 저장하고 로딩하는 것은 모델의 재사용성, 효율성, 버전 관리를 위해 필수적인 과정이다. `pickle`, `joblib`, `HDF5` 등 다양한 방법을 통해 모델을 저장하고 불러올 수 있으며, 각 방법은 장단점을 가지고 있다. 모델을 저장하고 불러올 때는 라이브러리 버전, 환경, 보안 등 여러 요소를 고려해야 한다.

---

**핵심 용어**
* 직렬화 (Serialization): 객체를 파일에 저장하기 위해 바이트 스트림으로 변환하는 과정
* 역직렬화 (Deserialization): 파일에서 바이트 스트림을 읽어 객체로 복원하는 과정
* HDF5 (Hierarchical Data Format version 5): 대용량의 수치 데이터를 저장하기 위한 파일 형식
* Pickle: 파이썬 객체 직렬화 모듈
* Joblib: 파이썬 객체 효율적 저장 라이브러리
* Keras: 딥러닝 프레임워크
반응형