あの日作ったサブの中身を僕はもう覚えていない。

5 min read読了の目安(約5200字

*この記事はNumerai Advent Calendar、12/14分の記事です。

はじめに

それでは聞いてください、Secret Base (2020 Numerai ver.)。

君(Numerai Tournament)と夏の終わり(round 221あたり)♪
将来の夢(専業Numeraier)♪
大きな希望(Numerai rank no.1)、忘れない♪
10年後の8月も、また出会えると信じて(まだNumerai Tournamentあるかな...?)♪
最高の、思い出WO〜♪♪

最高の思い出↓

(100th quantileはまだない...)

あれ、このサブ何したんだっけ...?

Numerai Tournamentは毎週Roundが開催され、都度Tournament dataに対する予測値を提出し、その後1ヶ月間のパフォーマンスによってpayoutが決まります。

自分は比較的新参者なので、毎週のようにモデルのマイナーチェンジをしてしまっています。もちろんPDCAを回していくことは大事なことですが、結果が出るのが1ヶ月後であるため、いざ結果が出たときに、

「おや...これ...なんのモデルのやつだっけ...?」

となり、PDCAのPもDをなんも覚えていないということが自分はよくあります。そのため、その後のAが効果的に実行できず、株式市場の荒波にどんぶらこどんぶらこになって毎roundの結果によくわからないけど一喜一憂する猿になっています。

そんな猿からPDCAを回せる人になるべく、今流行りのMLOpsを導入しましたので、簡単にご紹介します。

MLOpsとは?

機械学習プロジェクトにおける実験管理やパイプライン運用、そして本番環境へのデプロイ等の課題を手助けしてくれるツールです。概観としては以下の記事がよくまとまっているかなと思います。

小さく始めて大きく育てるMLOps2020

これがあれば、Roundごとに、どのモデルを使ったか、どのハイパラを使ったか、どの特徴量を使ったか等々をシステマティックに記録することができるはずです!

MLOpsを導入すれば、PDCAを適切に回すことができるようになり、モデル精度はかつてのビットコインのごとく爆上がり、さすればみなさんがNMR富豪になるのはもはや時間の問題に過ぎないと言っても過言ではないでしょう。すでに富豪の方はNMR分けていただいてもOKです!

どのサービスを使うか?

MLOpsには多くのサービスが存在しており、自分にあったものを選ぶのは優柔不断な猿にはなかなか大変です。一般的な機械学習案件では、とりあえずハイパラ管理にhydra、モデルや特徴量のトラッキングにmlflowを用いるケースが多いのかなとは思いますが、Kedroを使ってNumerai Signals用のパイプライン構築でも書かれているように、kedroも良さそうです。

そんな中、今回使うのはneptune.aiです。

https://neptune.ai/

富豪の方々はローカルで立派なマシンをお持ちで、画像も自然言語処理も何でも来いとぶいぶい言わせていると思いますが、Numeraiの場合、データもテーブル形式でさほど重くなく(重いですが...)、ローカルから提出というよりは、google colabやkaggle notebookといった、無料で使えるインスタンスを利用しサクッと提出される方が多いのかなという印象です。

そのためMLOpsも、そういったwebサービス経由でも利用しやすいものを使おうと思います。あとNeptune.aiのウェブサイトには"The most lightweight..."(もっとも軽い...)などと書いてあり、見るからに簡単そうで私のような猿でも使えそうです!

Neptune.aiを用いてNumerai Tournamentのサブ管理をする手順

手順ですが、いたって簡単です。

  1. ユーザ登録
  2. API key取得
  3. 既存の提出コードに追記

それぞれ見ていきましょう。

1. ユーザ登録

neptune.aiにアクセスし、アカウントを作りましょう。個人だと無料です(神)。

サインインすると、左上にwelcome <username>と表示されるマイページに遷移するので、左上のタブにあるProjectsをクリックします。右の方にNew projectというボタンがあるので、クリックし、新規プロジェクトを作ります。

ここに、任意のProject nameを記入し、右下のApplyを押すとProjectが生成されます。

遷移先のページ上部に、Experiments, Notebooks, Wiki, Settingsのタブが見えると思いますが、今回使うのはExperimentsだけです。ここにいずればばんと実験結果が載る感じですね!

2. API key取得

右上に小さく自分のアイコンがあると思うので、そこをクリックしてGet Your API tokenを選択します。API keyは他に漏れないように保管してください。大人にもなってAPI keyが漏洩したらいくら猿でも恥ずかしいです。

3. 既存の提出コードに追記

今回は.pyではなく、Google Colab等のJupyter Notebookでモデリングと提出を行っている方向けです。MLOpsと聞くと一見ひいいぃぃ怖いとなりますが、コードとして増えるのはほんの数行です。

まず、neptune.aiを利用するためのライブラリをインストールします。以下をnotebookの上の方にでも書いて実行してください。

!pip install neptune-client==0.4.128

執筆当時(2020.12)ではver0.4.128が最新です。
あとは、

import neptune

とライブラリをimportすれば準備完了です。

ここまでできたら、モデリングしてvalidation scoreを計算した後に、トラッキングしたい情報をneptune.aiに送ります。↓のような感じです。

ROUND = 241
	
import neptune
user_name = 'Your Username'
project_name = 'Your Project Name'
token = 'Your API Token'
neptune.init(project_qualified_name=f'{user_name}/{project_name}',
             api_token=token)

with neptune.create_experiment(name=f'neptune-demo-round{ROUND}', params=params):
    neptune.log_metric('ROUND', ROUND)
    neptune.log_metric('score', score)
    neptune.log_artifact('feature_importance.csv')
    neptune.log_artifact('my_awesome_model.pkl')
    
print('sent to neptune!')
	

mockではありますが、高々数行ですね。APIはさきほど取得したやつです。Notebookと一緒に公開しちゃわないように注意してください。

with以降で、今回はneptune.aiに、

  • params [dictionary]: ハイパラ
  • ROUND [int]: 今回のラウンド(いつのものかわかるように)
  • score [float]: 計算したvalidation score
  • feature importance [csv file]: feature importanceを計算した結果が入ったcsv file
  • model.pkl [pkl file]: 訓練済みモデルをjoblib.dump(model, 'my_awesome_model.pkl')と保存したもの

というデータを送っています。neptune.aiではこれ以外にも画像など様々なデータをトラッキングできますので、

https://neptune.ai/features/logging

こちらを参考に自分がトラッキングしたいデータをトラッキングできるようにしましょう。

実行したら、先ほどのneptune.aiの自分のプロジェクトページを見てみましょう。

自分は異なる種類のスコアを計算していて、それぞれ全期間、validのera前半、後半での計算結果があるため、ROUNDのパネルを除き3点データポイントがあります。

はい、ちゃんと送られていますね!(やっぱvalid前半は予測簡単すぎるな...)

csvで保存していたfeature importanceもちゃんと送られているでしょうか?左のタブのArtifactsをクリックします。

ありますね!(dexterity4つええ)

図を描いて画像で送っても良かったのですが、featureが多く見やすい図にならないので、csvで全featureに対するimportanceの値を見れるようにしています。

そしてハイパラですが、左タブのParametersをクリックすると、

こちらもちゃんとありますね!これで仮に毎ラウンドハイパラを変えたとしても、neptune.aiに戻ってくれば過去に何しでかしたかわかります。

終わりに

嬉しくって、楽しくって(earning era)♪
冒険(もしや教師あり学習じゃなく次元削減したものをそのまま出したら強いのでは...?)も色々したね♪

冒険の結果↓

参考文献