表題の内容について 勉強/実装 しました。
経緯など
諸事情で Go 言語をまっさらな状態から学ぶ必要があり、公式 tutorial を進めていく中でもう少し踏み込んだ実装をしたいと思いました.
巷では 機械学習API のバックエンドが Python ではなく Go やら Scala やらで動いているらしいということを聞き知っていたので、Python で学習させた model を Go で読み込んで Predict するようなコードを mac 上の docker コンテナ内で動かすというタスクは 一先ず tutorial の次の Step としては適当だろう (自分の目的にもまあ合致していそう) ということで実装しました。
ソースコードは以下の 2種類です。
いずれも README の通りに実行すれば 0からでも動くように書いたつもりなので変だ、うまくいかないみたいなことがありましたら @kaeru_nantoka まで優しく教えていただけると嬉しいです。
以下は実装した感想や気をつけたことなど書いていきます。
GoDockerEnv
Dockerfile
docker-compose.yml
README に書いているように順番に実行してもらえれば go が実行できる環境に入れます.
GoTitanic
本題の python で学習した LightGBM を Go で呼び出して predict するコードです.
Go LightGBM と雑にググって出てきた
https://github.com/dmitryikh/leaves
というライブラリを使用しています.documentation がスーパー豪華で、こちらにあるサンプルコードを ↑ の環境で動かした(だけ) という仕上がりになっています.
名前が titanic となっていて実際に使用しているのは乳がんデータセットと違うのですが、サンプルコード見つける前に漠然と titanic でやろうと思っていてすぐ後にサンプルコードを見つけ上記の目的であれば一旦乳がんデータセットで動かせばよかろうということで違っています
Next action で 簡単な特徴量エンジニアリング (性別の Encoding など) も Go で記述してその前処理後の X_test を model に渡すような実装もやってみるつもりです.
さて、ここで Python で学習した LightGBM model をこの docker 環境内に用意しなければならないことに気づいた私ですが、
ということで、python と pip だけ入れて kaggle-api で自分の dataset から必要な学習済みモデルと サンプルコードを動かして作成した中間ファイルたちを持ってくることにしました(便利!) ついでに今まで温かみのあるコピペで kaggle.json などの setup をしていたのを .sh にまとめました.
echo '{"username":"hogehuga","key":"piyopiyo"}' >> ~/.kaggle/kaggle.json
のところは各自の kaggle.json に記述されている内容に読み替えてくださいあとは
predict_breast_cancer_model.go
で予測してくれます。python コードとの比較はないですが、なかなか早いのではと思いました。
Future Work
テストコードを書く
train 時に X_train にやった feature engineering を X_test に対して Go 言語を使って行う
XGBoost の IF もあるみたいなのでこちらも触る
感想/まとめ
kaggle-api は超便利
現場だとデータサイエンティストが作った model を API 実装者との間でどのようにやりとりしているのか (テストデータの特徴量エンジニアリングはサーバーサイドエンジニアがやっているのか?) などの疑問点が整理できてよかった
以上です。ありがとうございました。