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-competitionn.PNG

Code Competitionでの提出方法

Kaggle内でコードを書こうとするとScriptsNotebooksという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.pyNotebooksに貼り付けたあとエンコードされたコードをデコードして元のファイル構造を保った状態に戻します。そしてpython setup.py develop --install-dir /kaggle/workingを実行してNotebooksの環境にデコードしたコードをパッケージとしてインストールします。

解説は以上です。

おわりに

今回はKaggleの開催形式であるCode Competitionの問題点とそれを解消する方法を紹介しました。Code Competitionの問題点の解決方法と言いつつ、TitanicコンペというCode Competitionではない例を用いて検証してしまいました。

次回、機会がありましたもう少しアップデートした記事をお届けしたいと考えております。

以上です、最後まで読んで頂きありがとうございます。

参考