ここまでの検証作業では採用閾値変えたり、アンダーサンプリング数変えたり、検証データ複数試したり・・・と検証パターンが大量にあるので試行錯誤に結構時間かかってました。最初は1回の学習自体は数十秒でしたが、データ量増やしたあたりから1分以上かかるようにもなり結構な苦痛です。

 

 だんだんやってられなくなって来たし今後もいろいろなパターンで随時検証していくことも考え、学習モデルの保存と読み込みに対応させたいと思います。 (もっと早くやっとけ!今更気づくなよって話ですが)

 

学習モデルの保存・読み込み

 モデルの読み書きをしてくれるモジュールは「pickle」と「joblib」があるようです。「joblib」は保存サイズを圧縮して小さくしてくれるようですが、その分読み込みも遅くなるとのことなので、とりあえず「pickle」を使ってみます。

 

 「pickle」の使い方は、保存したい場合は

pickle.dump(model , open(filename,'wb'))
#model:学習したモデル、filename:保存先のファイル

 

 

 読み込みたい場合は

model = pickle.load(open(filename, 'rb'))
#model:読み込んだモデルを格納する変数、filename:保存先のファイル

 

これでできるようです。'wb'は書き込みモード(writeのw)とバイナリモード(binaryのb)だそうで、読み込みの場合は'rb'(readのr)ですね。

 

 サイズは「350kb」程度でした。学習モデルってこんなに小さいですね。圧縮なんて必要なさそうです。読み込み時間もほぼ瞬殺。検証データのdataframeへの読み込みと前処理に時間は多少かかって数十秒待ちますが、全体時間は体感的にかなり早くなりました。

 

 プログラム自体は、学習・予測はバギングのため10個モデルを作って予測の平均を取るプログラムでしたので、保存も10回、読み込みも10回行ってバギングにも対応させてます。

 

 学習モデル生成して保存するとき

##学習モデル作成 バギングのためのbagging()関数を10回読んでモデルを配列に格納
model=[]
for i in range(10):
    model.append(bagging(i,X,y))
##bagging関数の内容はLightGBMで学習・検証別記事ご参照。

# 構築したモデルの保存
for m in model:
    filename = "ファイル名" +str( m+1) + ".pkl" ## バギング用に複数ファイル作成対応。連番を付けてモデル格納配列分ファイル名が変わるように。0番をなくすため+1してある。
    pickle.dump(m,open(filename,'wb'))

 

 学習モデルを読み込むとき

##学習モデル読み込み。 バギング分10回読んでモデルを配列に格納
model=[]
for i in range(10):
    filename = "ファイル名" + str(i+1) + ".pkl"
    model.append(pickle.load(open(filename, 'rb')))

 

 これで少しストレスから解放されて検証作業ができるようになる・・・かな。