pickle と joblib で 機械学習モデルを保存&読み込む(Python)

pickle と joblib で 機械学習モデルを保存&読み込む(Python)

scikit-learnなどで構築した機械学習モデル(オブジェクト)を、どのようにファイルに保存し、それを読み込み使うのか。

よくあるのが以下の2つです。

  • pickle:保存&読み込むスピードがjoblibより早い
  • joblib:保存されるファイルサイズがpickleより小さい

違いは、スピードかサイズか、ということになります。

今回は、「pickle と joblib で 機械学習モデルを保存&読み込む(Python)」というお話しと言うか、実行例です。

今回の流れ

今回の流れです。

  1. ライブラリー読み込み
  2. サンプルデータ生成(回帰問題)
  3. データ分割(学習データとテストデータ)
  4. 学習データを使ってモデル生成(ランダムフォレスト)
  5. pickleを使ったモデル保存・読み込み・予測
  6. joblibを使ったモデル保存・読み込み・予測

最後の2つのところで、以下の計測をします。

  • 保存スピード
  • 保存ファイルのサイズ
  • 読み込みスピード
  • テストデータの予測精度(R2)

最後の予測精度(R2)ですが、pickle joblib とも同じモデルを保存した後に読み込んでいるので、同じ値になります。

 

ライブラリー読み込みからモデル生成まで

以下、コードです。

# 1. ライブラリー読み込み
import pandas as pd
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import r2_score
import pickle
import joblib
import os
import time

# 2. サンプルデータ生成(回帰問題)
X, y = make_regression(n_samples=10000,   #サンプルの数
                       n_features=1000,   #特徴量の数
                       noise=10,          #ノイズの標準偏差
                       bias=0,            #バイアス(切片)
                       random_state=12)

X = pd.DataFrame(X) #説明変数(特徴量)
y = pd.DataFrame(y) #目的変数

# 3. データ分割(学習データとテストデータ)
X_train, X_test, y_train, y_test = train_test_split(X,
                                                    y,
                                                    train_size=0.7,
                                                    test_size=0.3,
                                                    random_state=42)

# 4. 学習データを使ってモデル生成(ランダムフォレスト)
model =RandomForestRegressor(n_jobs=-1).fit(X_train,y_train)

 

今回は、回帰問題用のサンプルデータを生成した後に、このサンプルデータをモデル構築用の学習データと構築したモデルを検証するテストデータに分割し、学習データを使いランダムフォレストで回帰モデルを構築しました。

 

pickleを使ったモデル保存・読み込み・予測

先ず、pickleで構築したモデルを保存します。

以下、コードです。

%%time
# 構築したモデルの保存
filename = 'model.pkl'
pickle.dump(model,open(filename,'wb'))

 

以下、実行結果です。

 

保存するのに、60.2 ms(ミリ秒)かかっていることが分かります。

この保存したファイルのサイズを確かめてみます。

以下、コードです。

# 保存したモデルのサイズ
print(round(os.path.getsize(filename)/1024/1024,1),'Mb')

 

以下、実行結果です。

 

ファイルサイズは、54.1 Mbです。

 

次に、今保存したファイルを読み込みます。

以下、コードです。

%%time
# 保存したモデルの読み込み
loaded_rf_model = pickle.load(open(filename, 'rb'))

 

以下、実行結果です。

 

読み込むのに、71.1 ms(ミリ秒)かかっていることが分かります。

この読み込んだファイル(予測モデル)で、テストデータを使い予測し精度評価(R2)します。

以下、コードです。

# テストデータによる精度検証(R2)
y_pred = loaded_rf_model.predict(X_test)
r2_score(y_test, y_pred)

 

以下、実行結果です。

 

R2(決定係数)は、84.54%です。

 

joblibを使ったモデル保存・読み込み・予測

先ず、joblibで構築したモデルを保存します。

以下、コードです。

%%time
# 構築したモデルの保存
filename = 'model.pkl2'
joblib.dump(model,filename, compress=3)

 

以下、実行結果です。

 

保存するのに、783 ms(ミリ秒)かかっていることが分かります。

pickleに比べると、倍以上時間が掛かっています。これは主にファイル圧縮の処理が入っているためです。

この保存したファイルのサイズを確かめてみます。

以下、コードです。

# 保存したモデルのサイズ
print(round(os.path.getsize(filename)/1024/1024,1),'Mb')

 

以下、実行結果です。

 

ファイルサイズは、17.6 Mbです。

pickleに比べると、ファイルサイズが半分以下になっていることが分かります。

 

次に、今保存したファイルを読み込みます。

以下、コードです。

%%time
# 保存したモデルの読み込み
loaded_rf_model = joblib.load(filename)

 

以下、実行結果です。

 

読み込むのに、271 ms(ミリ秒)かかっていることが分かります。

この読み込んだファイル(予測モデル)で、テストデータを使い予測し精度評価(R2)します。

以下、コードです。

# テストデータによる精度検証(R2)
y_pred = loaded_rf_model.predict(X_test)
r2_score(y_test, y_pred)

 

以下、実行結果です。

 

R2(決定係数)は、84.54%です。

 

まとめ

今回は、今回は、「pickle と joblib で 機械学習モデルを保存&読み込む(Python)」というお話しと言うか、実行例を示しました。

この2つの主な違いは、保存&読み込むスピードと、保存されたファイルサイズにあります。

  • pickle:保存&読み込むスピードがjoblibより早い
  • joblib:保存されるファイルサイズがpickleより小さい

参考にして頂ければと思います。