사이킷런(scikit-learn)으로 학습한 모델 저장하기

사이킷런(scikit-learn)으로 학습한 모델 저장하기

2018, Dec 26    

sklearn을 이용하여 model을 학습한 후 학습한 결과를 저장하는 방법에 대하여 알아보겠습니다.

pickle 형태로 모델을 저장할 것이고 저장할 때에는 sklearn의 joblib을 사용할 것입니다. pickle은 파이썬에서 지원하는 serializer 형태의 저장 방식입니다. 참고로 JSON 같은 경우는 언어에 상관없이 범용적으로 사용할 수 있는 seriazlier 형태이지만 pickle은 파이썬에서만 사용가능 하되 지원되는 데이터 타입이 JSON 보다 많이 있습니다.

자 그러면 코드를 통하여 알아보겠습니다. 예제는 iris 데이터를 사용해 보겠습니다.

from sklearn.linear_model import LogisticRegression
from sklearn import datasets
import pickle
from sklearn.externals import joblib


다음으로 데이터를 로드해 보겠습니다.

# Load the iris data
iris = datasets.load_iris()

# Create a matrix, X, of features and a vector, y.
X, y = iris.data, iris.target


다음으로 간단한 Logistric Regression을 적용해 보겠습니다.

clf = LogisticRegression(random_state=0)
clf.fit(X, y)  


여기서, 모델을 저장해 보겠습니다. 여기서는 변수에 먼저 저장하는 방법을 소개하고, 아래에서 파일에 저장하는 방법을 소개해 드리겠습니다.

saved_model = pickle.dumps(clf)


saved_model 을 실행해 보면 이상한 문자열이 나오는데 그것이 serializer 형태로 저장된 것이라고 볼 수 있습니다.

pickle로 저장한 모델을 불러와 보겠습니다.

# Load the pickled model
clf_from_pickle = pickle.loads(saved_model)

# Use the loaded pickled model to make predictions
clf_from_pickle.predict(X)
>> array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1,
       1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])


위에서 해 본 내용은 학습한 모델을 pickle 형태로 변수에 저장한 것이고, 이제 파일에 저장을 해보겠습니다.

joblib.dump(clf, 'filename.pkl') 

>>

['filename.pkl',
 'filename.pkl_01.npy',
 'filename.pkl_02.npy',
 'filename.pkl_03.npy',
 'filename.pkl_04.npy']


이제 저장한 파일을 불러와서 predict 해보겠습니다.

clf_from_joblib = joblib.load('filename.pkl') 
clf_from_joblib.predict(X)

>>> array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1,
       1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])