Matlabではsave/loadコマンドでmatファイルを作るみたいなことをpythonでもやりたい。
#pickle or joblib
Matlabのsaveでやるようなシリアライズをするのには、よくpickleというモジュールが使われるようだ。
(ちなみに複数形はpickles,つまりピクルスだ。酢漬けにして保存しとくイメージなのか)
pickleはかなりメジャーなモジュールのようだが、最近ではjoblibというのも使われているらしい。
joblibはそもそもは並列処理用のモジュールらしく、なぜそれがシリアライズにも使えるのかは知らないが
オプションを指定するだけでいい感じに圧縮できて、そこそこ速いっぽいので、joblibを使ってみる。
#書き込み joblib.dump()
まずは処理をしてファイルに書き込む
例は何でも良かったのだけれど、巷で噂(?)のUMAP。
import os
import joblib
import umap
from sklearn.datasets import load_digits
digits = load_digits()
reducer3d = umap.UMAP()
reducer3d.n_components = 3
reducer2d.fit(digits.data)
reducer3d.fit(digits.data)
joblib.dump((reducer2d, reducer3d), os.path.expanduser('~/Desktop/umap.joblib'), compress=True)
複数のインスタンスもタプルにして渡せばOKっぽい。
compressに1~9またはTrueを渡すと圧縮してくれる。(Trueはcompress=3と同じらしい)
数字は大きいほど高圧縮。
#読み込み joblib.load()
import os
import numpy as np
import joblib
red = joblib.load(os.path.expanduser('~/Desktop/uMap.joblib'))
(reducer2d, reducer3d) = red
読み込むときは(当然ながら)タプルに入っているので、読み出してから切り出す。
どの変数を何番目に入れたか覚えているなら、最初からアンパックして読み出してもOK
(reducer2d, reducer3d) = joblib.load(os.path.expanduser('~/Desktop/uMap.joblib'))
いたってシンプル。
#おまけ
せっかくなので可視化しとく
from sklearn.datasets import load_digits
import matplotlib.pyplot as plt
digits = load_digits()
embedding2d = reducer2d.transform(digits.data)
embedding3d = reducer3d.transform(digits.data)
fig = plt.figure(figsize=(12, 5), dpi=72)
ax = fig.add_subplot(1, 2, 1, title='n_components = 2')
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
sc = ax.scatter(embedding2d[:, 0], embedding2d[:, 1], c=digits.target, cmap='Spectral', s=5)
cb = fig.colorbar(sc, boundaries=np.arange(11) - 0.5, shrink=0.6)
cb.set_ticks(np.arange(10))
ax = fig.add_subplot(1, 2, 2, projection='3d', title='n_components = 3')
sc = ax.scatter(embedding3d[:, 0], embedding3d[:, 1], embedding3d[:, 2], c=digits.target, cmap='Spectral', s=5)
cb = fig.colorbar(sc, boundaries=np.arange(11) - 0.5, shrink=0.6)
cb.set_ticks(np.arange(10))
plt.show()
結果