🐼

【15日目】pickleで学習モデルを保存する【2021アドベントカレンダー】

2021/12/15に公開

2021年1人アドベントカレンダー(機械学習)、15日目の記事になります。

https://qiita.com/advent-calendar/2021/solo_advent_calendar

テーマは pickle を使った学習モデルの保存 になります。

Colab のコードはこちら Open In Colab

基本形は以下になります。

モデルの保存

pickle.dump(model, open(f"model.pkl", 'wb')) 

モデルの読み込み

loaded_model = pickle.load(open(f"model.pkl", 'rb'))

https://www.sairablog.com/article/pickle-trained-model-save-read.html

GroupKFold の Fold ごとのベストモデルをpickleに保存したものを読み込んで推論

詳細はColabに譲って割愛しますが、 Optuna + LightGMB の学習・推論と、保存したベストモデルを読み込んで学習を省略し、推論に使う場合の処理速度を比較してみます。

start_loaded = time.time()

cv_result_loaded = []

for i, (train_index, test_index) in enumerate(gkf.split(X_train_ce, y_train, groups)):
    X_train_gkf, X_test_gkf = X_train_ce.iloc[train_index], X_train_ce.iloc[test_index]
    y_train_gkf, y_test_gkf = y_train.iloc[train_index], y_train.iloc[test_index]

    loaded_model = pickle.load(open(f"model_fold_{i}.pkl", 'rb'))
    y_pred = loaded_model.predict(X_test_gkf)

    rmse = mean_squared_error(y_test_gkf, y_pred, squared=False)
    cv_result_loaded.append(rmse)

print("RMSE:", cv_result_loaded)
print("RMSE:", np.mean(cv_result_loaded))

elasped_time_loaded = round((time.time() - start_loaded), 1)
print("RMSE:", np.mean(cv_result))
print(f"経過時間:{elasped_time}")

print("pickle読込 RMSE:", np.mean(cv_result_loaded))
print(f"pickle読込 経過時間:{elasped_time_loaded}")

当たり前ですが精度は一緒ですが、圧倒的に時間のかかる推論を省略できるので短時間で済みました。

似たデータから推論するのであれば学習モデルを保存して使いまわしたいですね。

項目 RMSE 処理速度
Optuna + LightGBM で学習・推論 0.180 203.7秒
pickle読込・推論 0.180 0.3秒

15日目は以上になります、最後までお読みいただきありがとうございました。

Discussion