ここまでの検証作業では採用閾値変えたり、アンダーサンプリング数変えたり、検証データ複数試したり・・・と検証パターンが大量にあるので試行錯誤に結構時間かかってました。最初は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')))
これで少しストレスから解放されて検証作業ができるようになる・・・かな。