DISTRICT 37

なにか

機械学習の結果を保存する

学習させたモデルを保存しておきたい!

学習結果の保存

要はオブジェクトをシリアライズさせておけばいい。概念としてはオブジェクトを名前を付けてファイルに保存して、使う際にはそのファイルを開いてオブジェクトとして使うというイメージ。

この処理を応用したら、ディープラーニングとかで大量の餌を食わしていく過程で「今日の学習はここまで。明日はその続きを」なんてことが可能になるかもしれない。

ということでpythonには標準でpickle(漬物:特にピクルス)というモジュールが用意されており、これを使えばシリアライズができる。

  • pickle

12.1. pickle — Python オブジェクトの直列化 — Python 3.6.3 ドキュメント

import pickle
target = [1, 2, 3, 4, 5]
fname = 'test.pickle'

print(target)
# [1, 2, 3, 4, 5]

# リストオブジェクトをpickleを使ってダンプ
with open(fname, 'wb') as f:
  pickle.dump(target, f)

# pickleを使ってリストオブジェクトをロード
with open(fname, 'rb') as f:
  target2 = pickle.load(f)

print(target2)
# [1, 2, 3, 4, 5]

 

機械学習ライブラリであるsklearnには、joblibというモジュールが最初から用意してあった。まぁ学習結果の保存はやりたいですよね。ということで方法2

  • joblib

3.4. Model persistence — scikit-learn 0.19.1 documentation

import sklearn.externals import joblib

clf.fit(X_train, Y_train) # clfは何らかの学習モデル
pre1 = clf.predict(X_test)

fname = 'test.joblib'

# joblibを使ってオブジェクトをダンプ
joblib.dump(clf, fname)

# joblibを使ってオブジェクトをロード
clf2 = joblib.load(fname)
pre2 = clf2.predict(X_test)

# pre1とpre2は同じ結果が出るはず(X_trainが同じ値なら)

コード

jupyterによるコードはコチラ。IRISを学習させ、結果を保持しておく。オブジェクトを復元させて同じ結果が出ることが確認できる。