Kaggleでのソースコード管理の手助け
はじめに
「Gitでコード管理しているのに、KaggleのNotebook提出用に別のコードを用意するのが面倒だ」。この不満、心当たりがある方が多いのではないでしょうか。
今回書く記事はその不満を解消する方法を発見しましたので共有し、その方法について解説するというのが趣旨になります。
また記事内容ですが主にこちらのKaggle Kernel - lopuhin/imet-2019-submissionの内容を参考に書いております。
前置きのために記事ではCode Competition
とはから説明していますが本題から読みたい方は#Git等で管理しているファイル構造をそのまま使うから読んで下さい。
Code Competitionとは
冒頭で触れたCode Competition
について説明します。
Kaggleのドキュメントで説明されている内容を引用しますとこのようになっています。
Some competitions are code competitions. In these competitions all submissions are made from inside of a Kaggle Notebook, and it is not possible to upload submissions to the Competition directly.
下記は意訳です。
CSVなどのファイルを直接アップロードするのではなく、Notebookを利用してそこにファイル提出するまでのソースコードを書きそれを提出するという形式のコンペを指します。
開催中(2019/12/25現在)のコンペ8種の内(Featured/Researchのみカウント)6種類がCode Competition
であるのでおそらく参加されている方も多いと思います。
[参考] Code Competition 例
赤枠で囲ったCode Competition
というタグが付けられたコンペがCode Competition
になります。
Code Competitionでの提出方法
Kaggle内でコードを書こうとするとScripts
とNotebooks
という2種類の記述する手段があり、Code Competition
では2つの形式のどちらかに提出ファイルを生成するまでのコードを書きそれを提出する形になります。
Code Competitionの不満点
Kaggleに提出するソースコードはデバッグやテストのしやすさを考えると、こんな感じで処理毎にモジュール(ファイル)で分けたいという思いがあると思います。(タイタニックコンペに取り組んだ際の一例です)
titanic_sample
│ dataset.py
│ model.text
│ predict.py
│ train.py
│ utils.py
│ __init__.py
│
├─resources
gender_submission.csv
test.csv
train.csv
上記のファイル構造で提出できればよいのですが、ScriptsかもしくはNotebooksにほぼ提出専用のコードを書くのがCode Competiton
のルール上通る道であり現状のCode Competiton
の不満点の一つです。
Git等で管理しているファイル構造をそのまま使う!
パッケージとしてインストールしてしまおう
遅くなりましたが、本題に入ります。
Gitで管理しているコード郡をNotebook
環境下でそのまま使えれば、KaggleのNotebook提出用に別のコードを用意する必要なんてないわけです。というわけでNotebook
環境下にそれらのコードを用意してしまうというのが今回説明する解決方法になります。
概要
KaggleのNotebookにGitで管理しているコードをアップロードして、それらをパッケージとしてインストールしSubmitまでの書かれたコードをコマンドライン上から実行するというのが以降で説明する手順になります。
Submitするまでの手順説明
説明をわかりやすくするためにタイタニックのデータを使って説明します。
また、前処理、モデルの学習等のコードはこちらを参考にさせていただきました。
Kaggle Kernel - sishihara/upura-kaggle-tutorial-04-lightgbm
手順①「GithubTemplateをForkする」
Github - lopuhin/kaggle-script-templateをForkします。
手順②「GithubTemplateをTemplateリポジトリに設定する」
ForkしたリポジトリをTemplateリポジトリにする。この作業は色々なコンペでこのTemplateリポジトリを使い回すためにやっています。
参考に私が作成したTemplateリポジトリのURLを貼っておきます。
Github - wakamezake/kaggle-script-template
手順③ 「作業用リポジトリの作成」
手順②で作成したTemplateリポジトリを使って、コンペ用のリポジトリを作成する。
Github - wakamezake/Titanic_submit_script
手順④ 「自環境用に定数や変数名の修正」
easy_goldディレクトリ(Github - wakamezake/Titanic_submit_scriptだとtitanic_sampleにrenameしてます)にいつもどおりコードを書く。注意点として以下のように最終的にsubmission.csv
が出力されるようにコードを書いてください。
def run(command):
os.system('export PYTHONPATH=${PYTHONPATH}:/kaggle/working && ' + command)
run('python setup.py develop --install-dir /kaggle/working')
run('python titanic_sample/train.py model.text --test_size 0.3')
run('python titanic_sample/predict.py model.text submission.csv')
最終的には以下のようなフォルダ構成になると思います。
.
│ .gitignore
│ build.py
│ README.rst
│ script_template.py
│ setup.py
│
├─build
│ .keep
│ script.py
│
├─titanic_sample
│ dataset.py
│ model.text
│ predict.py
│ train.py
│ utils.py
│ __init__.py
│
├─resources
gender_submission.csv
test.csv
train.csv
手順⑤「Kaggleへサブミット!」
build.py
を実行します。実行後build/script.py
が生成されているのでそれをNotebooks
に貼り付けます。その後はCommitボタンを押してsubmitするといういつもの流れです。
貼り付けた例としてこちらのカーネルを用意しました。Kaggle Kernel - wakamezake/titanic-submission-sample
Submitするまでの手順説明は以上になります。
各手順の解説
手順の中で実行したbuild.py
について。
まずすべてのコードをbase64でエンコードして文字列に変換します、その際エンコードしたコードのファイルパスをkeyにエンコードして文字列をvalueにした辞書を作ります。そしてscript_template.py
というscript.py
を作るためのテンプレートのfile_data
部分に辞書の内容を置換します。
script.py
をNotebooks
に貼り付けたあとエンコードされたコードをデコードして元のファイル構造を保った状態に戻します。そしてpython setup.py develop --install-dir /kaggle/working
を実行してNotebooks
の環境にデコードしたコードをパッケージとしてインストールします。
解説は以上です。
おわりに
今回はKaggleの開催形式であるCode Competition
の問題点とそれを解消する方法を紹介しました。Code Competition
の問題点の解決方法と言いつつ、TitanicコンペというCode Competition
ではない例を用いて検証してしまいました。
次回、機会がありましたもう少しアップデートした記事をお届けしたいと考えております。
以上です、最後まで読んで頂きありがとうございます。
Discussion