Coding - Deep Learning - Kaggle - Software

Kaggleコンペで初心者がつまずくこと

 先日、初めてのKaggle Competitionに参加してきました。Deep Learning自体よりもKaggle独特の手続きやコードの書き方にコツがあり苦しんだので、共有します。

1. Kaggleでの手順の大きな流れ

 Kaggleでは、Kaggleが公開するWebブラウザベースのipynb上に実行コードを書いて、それをKaggleのシステムで動かし、結果として生成されるsubmission.csvという出力結果が記載されたCSVファイルをKaggleに渡すという手順で行われます。なお、submission.csvをKaggleに1日に提出できる回数にも上限があるので、この回数を無駄にしないよう、開発初期からsubmission.csvを試しに提出して、締め切り直前に手続きで困らないようにしておきましょう。使用できる言語は現時点でPythonかRのみ。実行させるプロセッサはCPU(使用時間無制限)かGPUまたはTPU(月当たりの上限あり)。Kaggleのコード実行環境(kernelと呼びます)はDockerの仮想環境で動くJupyter Notebookなので、自分のローカル環境でJupyter Notebookを使って開発したコードはipynb形式データとして容易にインポートできますし互換性もあります。

2. コンペのルールと評価式をよく読む

 各コンペティションにはルールが定められており、自分が提出したコードが生成するsubmission.csvを評価する評価式も定められています。2019年末に、コード実行中に外部データにアクセスして不正な処理をした人物が永久追放処分を受け、これを受けて外部データへのアクセスが非常に制限されることになりました。自分のsubmission.csvをサブミットするプロセスではコードの実行をインターネットから遮断した状態でしなくてはなりません。

 評価式ですが、自身のローカル環境で開発する際に、そのコードの十分さを大まかに知りながらコードを書くことは非常に重要ですので、評価式が何を意味するのかを理解してから開発に取り組みましょう。

3. Kaggleのコード実行環境で何かのコードを実行してみる

 Jupyter Notebookであるとは理解していても、画面の右側にあるメニューや見た目の違いで戸惑うこともあります。まずは、どんなコードでも良いので、ネットからコピペでも構わないので何かのコードを動かしてみて感触を掴みましょう。

4. 適当な値でsubmission.csvをサブミットしてみる

 ここまできたら、下記のコードをコピペして修正し、何もコードができていない状態でもsubmission.csvを提出してみましょう。

import pandas as pd

# ここを自分のコンペ用に編集して適切なデータを持ったdictを作りましょう(下記はサンプル記述)。
result = {
    filename_1: 0,
    filename_2: 1,
    filename_3: 0.5,
    :
    filename_399: 0.5,
    filename_400: 1
}

# kaggleから与えられた作業ディレクトリのひとつ上位階層に「input」というディレクトリがあり、その下に各コンペ用の必要なデータが入ったディレクトリが用意されています。ここにあるsubmission.csvのテンプレートを使って、自分がサブミットするsubmission.csvを生成します。
sample_submission = pd.read_csv('../input/competition_name/sample_submission.csv')

for c in sample_submission.columns[sample_submission.columns == 'label']:
    
    try:
        sample_submission[c] = result.values()
    except:
        # resultの中に該当するデータがない場合
        sample_submission[c] = 0.5

#submission.csvが生成されているのに処理がエラー扱いになると、下記のオプションが間違っている(不足や過剰)のではという議論が必ず湧いてきます。しかし、桁数指定に関しては「float_format='%.16f'」や「float_format='%.32f'」はあっても無くてもエラーには関係なかったです。
sample_submission.to_csv('submission.csv', index=False)

 画面右上の「submit」をクリックすると、Kaggle側で自動でそのkernelを実行します。実行の結果、submission.csvが正常に生成された場合は、画面上にsubmission.csvの最初の数行が表示され、その右に「このsubmission.csvを提出する」という旨のボタンが押せるようになります。なお、1日の提出上限回数を超えた場合はイギリス標準時(UTC)で翌日になるまでボタンが押せなくなります。日本時間の朝9時ということです。

 提出ボタンが押されると、Kaggle側が公開されていないデータを使ってそのkernelを実行します(裏実行と呼ばせてもらいます)。ここが非常に肝で、例えば、公開されているテストデータ(これに対して目の前のkernelでsubmission.csvを生成しました)が400件のビデオファイルだとしても、この裏実行では4,000件のデータで処理を行わせるようなことが行われます。つまり、公開されているテストデータで処理が正常にされたとしても、裏実行では正常に処理が行われずに「不合格(エラー終了や低評価)」になるケースがあるのです。これを避けるために気をつけるべきことは別の記事で言及します。

5. ざっくりとした処理手順を決める

 次は自分が開発するコードがどのような処理を行うか、ざっくりと決めましょう。つまり、

ステップ1: 動画からフレーム画像を切り出して保存する
ステップ2: 切り出した画像から人の顔部分を検出して切り出す
ステップ3: 上記で切り出した顔画像群をDeep Learningのトレーニングデータにする
ステップ4: 学習済みモデルを取り込み、上記データで転移学習させる
ステップ5: テスト画像を上記モデルで評価(predict)し、submission.csvを生成する

のような大まかな段取りのことです。

6. 処理手順に使うライブラリ等を決める

 上記の段取りが決まったら、具体的にどのようなコードで実装するかを決めましょう。つまり、上記のステップ1である「動画からフレーム画像を切り出して保存する」はffmpegでもOpenCVでも実装できます。しかし、「Kaggleの環境で使用可能なのか」であるとか「処理速度やメモリー消費はどうなのか」によって実装方法を決めることになります。

 なお、Kaggleには「公開データ」というものがあり、ユーザーが自分で集めたデータをKaggle上で公開してKaggleのオフライン環境でも使える状態にすることができます。少しややこしいのですが、このようにKaggle上で公開できるのはデータだけでは無くコードも公開されています。例えば、ffmpegですがアンアーカイブするだけでKaggleのプラットホーム(実体はDebianの仮想マシン)でそのまま使える実行形式のバイナリも置いてあります。pydubといった標準ではKaggleカーネルにインストールされていないPythonパッケージもあります。自分が選択肢として想定するものがKaggleで公開されているかチェックしながら実装を決めていきましょう。

7. Kaggleに無ければ自分でデータ公開する

 もし、自分が使いたいデータやバイナリがKaggleで公開されていない場合は、自分でアップロードして公開することができます。なお、よく出るエラーの原因として、ネットから一度自分のPCにダウンロードしたコードをKaggleにアップロードするとエラーが出ます。これは(エラーの内容が十分に公開されないので推測ですが)、見た目は一般的なデータであるものの中にチートコードを紛れ込ませることを警戒しているのかと思います。ですので、一般的に公開されているデータやバイナリを新規に登録したい場合は、URLから直接取得させるようにしましょう。

8. 評価式をローカル開発コードに加える

 上で「評価式」について触れました。評価式が公開されている以上、自身がローカル環境で開発するコードにもsubmission.csv生成とそれに対する評価のロジックを入れておくべきです。これがあることで、開発しているコードが十分な歩幅で改良されているのが、それとも全く見込み違いのアルゴリズムをしているのか、ざっくりと見定めることができます。

 コードを書き始めると、コード自体が正常に効率よく動作するかに意識を奪われがちです。しかし、開発の目的が評価関数で良いスコアを出すことである以上、常に意識しておくべきです。

9. コードをローカル開発する

 さぁ、ここまできたら、ひとまずコードを書くことになります。コードの書き方で注意しておくべき事項は別の記事で記載しますので、そちらを参照ください。


 でわでわ。

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments