【Kaggle】HMSコンペ反省

HMSコンペ反省サムネ Kaggle

KaggleのHMSコンペが終わったので個人的な反省記事を書きます。
色々書いて長文にしようと思うので、暇な方はどこかの記述が参考になれば幸いです。
コンペの具体的な内容をどこまで書いて良いのか分からないため、あまりコンペの内容については触れないことにします。

参加するコンペの選び方について

いくつかコンペに出てきて、何となく参加するコンペの自分なりの選び方が確立してきたので共有します。

まずCompetitionsの画面で上の画像のようにリスト表示にし、Closing Soonでソートします。
個人的には、残り時間の少ないコンペに参加して焦りたく無いので、私は2ヶ月〜3ヶ月の残り時間があるコンペに参加します。その方がゆったりと腰を据えて勉強できると思っている。

Closing Soonでソートしたら上からコンペを見ていき(見るのは 〜 days to goの部分)、十分な時間が残されているコンペがまず参加する候補になります。

その候補のコンペの詳細ページに行き、次はディスクリプションを熟読します。
熟読して自分が興味のあるコンペやタスクだった場合、参加すれば良いと思います。

さらに前段階の話

私は最初何も分からなかったので、コンペに参加する以前に、「興味のあるコンペを速く選別できるようにする」ことを目標にしました。

英語が苦手なので、コンペに参加して1週間くらい試行錯誤しないと、自分の参加しているコンペがどのようなものなのか理解できないことがありました。なので、まずは主にコンペのディスクリプションやルールの英文を解読して勉強し、開催されているコンペの概要がどのようなものなのか、素早く理解できるようになることを最初の目標にしました。

そして、いくつかのコンペのディスクリプションやルールを読んでいて、何となく面白そうだと思った今回のHMSに参加した感じです。

※ ルールを読むのは大事です

少しずつレベルアップ

英語力、コーディング力、コード読解力など低かったので、とにかくコンペのディスカッションなどの英語を読みまくり、英単語を調べまくって勉強しました。もちろんグーグル翻訳などは使うのですが、私個人の主義としてGoogle翻訳の日本語訳を参考にしたとしても、原文の英語を自分の頭で理解したいと思っているので、ディスカッションを読みつつ英語の勉強をしました。

これについてですが、英語学習はコンペに参加して読む必要に迫られた英文を使って勉強した方が効率が良いと思います。Kaggleから離れてTOEICなどで勉強しても良いかもしれませんが、英語は分野や媒体(例えばドラマor小説orニュース)によって使われる単語の種類がかなり異なります。

なので、Kaggleをやる上では英語に難があってもKaggleのサイト上にある英語を使って勉強した方が良いと思います。ただし、とてつもなく基礎がないと自覚している場合を除く。

コーディング力やコード読解力も低かったので、公開されているコードを読んでも頭に入ってこない・・・

そこで、とにかく良質なコード(voteの多いものや、有名なKagglerが書いたものなど)をフォークして一行ずつ実行して理解していく作業をしました。

ここが重要なのですが、他人のコードを少しずつ実行して理解していく作業と同時に、自分のコードを自分なりに記述してみるのも重要です。そして自分のコードに他人の実装を組み込んだりしてスコアを上げていきます

メダルなどを目標にする前に、設定すると良さそうな目標として「ディスカッションの英語を理解できる」や「公開コードを理解することができる」などを設定しても良さそうです。

最近のコンペの傾向とオススメの参考書

昔のことは良くわかりませんが、最近のKaggleの傾向としてテーブルコンペは減りつつあり、ディープラーニングを使うものが多い気がします。

今回のHMSコンペもディープラーニングを使いました。Kaggleでディープラーニングを使うときに参考になるベストな本として次の本を紹介しておきます。

ディープラーニング系のコンペでは、この本のコードをベースに自分なりにコーディングすると良いと思います。

コンペの情報収集の仕方

ディスカッションを追うのは大事ですが、個人的にはどこに重要な情報が転がっているのか分からないので、ディスカッションはもちろん、コード、OverviewタブやDataタブにも情報が載っているので幅広く、情報ソースを一本に絞らないことが重要だと思います。

ただ、これが重要なのですが、ディスカッションをずっと眺めていても、ディスカッションで話題になっているアイデアや手法を自分でコーディングして動かしてみないと、ただディスカッションの上を目がスベッているだけだったりします。

ディスカッションなどでの情報収集と実際にコーディングして動かすのをバランスよくやると良いと思います。

公開高スコアカーネルに注意

HMSの前に参加したコンペで、コンペ期間の早い段階で公開高スコアカーネル(ノート)をフォークして提出してそれなりのリーダーボード順位を得たことがあるが、自分で作成したコードがその公開カーネルをなかなか越えられず、順位が少しずつ上がっていく快感を得られなかった。

今回のコンペでは、公開高スコアカーネルをフォークして提出することはせず、自分のコードを提出して少しずつLBスコアと順位を上げていったので、モチベーションが高い期間をそこそこ長くできたと思う。

最初のうちは自分のコードを少し修正するだけで順位が上がるので気持ちが良いし、モチベも維持できる。前回参加したコンペでは、早い段階で公開カーネルを提出してしまったため、いくら自分で改善してもそのスコアを更新できずフラストレーションが溜まっていた。

なるべく自分のコードを提出して、改善とともに順位を駆け上がっていく方が楽しいと思う。

ただし、コンペ後半になると、コードを改善したらスコアも上がる頻度が落ちてきて、5個のアイデアを試したうちの1つがスコアを上げるみたいに、困難になってくる。

他の記事で見たが、最上位になると100個試行錯誤したうちの1つが当たる、みたいな世界になるらしい。

HMSコンペの結果と今後について

結果は2768チーム中1194位でした。

正直、自分なりにかなり時間を掛けたと思っているので、順位が振るわなかったことはショックです。
(メダルを獲得してエキスパートになる腹積りだった・・)

どこかのブログでメダルを目標にすると取れなかった時のショックがデカいみたいなことが書いてあった気がするけど、まさにその通りだ。

メダルを取れたか取れなかったか、よりも自分が成長できたかできなかったかに注目した方が良いのかも。

今回のコンペでは、初めて自分なりのアンサンブルを実装できたし、Mixupも実装したし、英語力も上がったし、ローカルの環境に新しいグラボを整備してパワーアップもした。色々成長できたはずだ。

せっかくグラボをいい奴にしたのだから、それを次のコンペで活かしたい。

ただ、ちょっと休憩もしたい気分なので、すぐに次のコンペに切り替えられない。
それはしょうがない事で、無理にすぐ次のコンペに切り替えるよりブランクを作ることも致し方ないと思っている。

コメント

タイトルとURLをコピーしました