Kaggleの「Open Problems – Multimodal Single-Cell Integration」の振り返り
今回は2022/11/15 (日本時間の2022/11/16の朝)まで行われていた「Open Problems – Multimodal Single-Cell Integration」に参加した際、どうして参加したのかや、参加中にやってよかったこと、課題などを忘れないようにまとめたので、せっかくなので記事にしました。
ちなみに、自分の手法に関してはこちらをご覧ください。
https://www.kaggle.com/competitions/open-problems-multimodal/discussion/366961
目次
Open Problems – Multimodal Single-Cell Integration とは?
コンペのサイトのoverviewに書かれていることをざっくり日本語に訳すと「骨髄幹細胞が血液細胞になるにつれて単一の細胞のDNAとRNA、タンパク質がどのように変化するかを予測するコンペ」ということになります。もう少し専門家の人がわかりやすいように説明すると以下の二つのsingle-cellのデータを使ったモデルを構築するコンペです。
- Chromatin accessibility(peak countをTF-IDFで変換したデータ)からRNAの発現量 (library-sizeでノーマライズされたcountデータ)の予測
- RNAの発現量 (library-sizeでノーマライズされたcountデータ)からsurface protein levels (dsb でノーマライズされたデータ)の予測
そもそもなぜ参加したのか?
参加してがんばろうと思ったきっかけをせっかくなので書いておくと
- Bioチームの同僚がこういうコンペがあるよとslackで教えてくれた (参加したきっかけ)
- 育休に入る前にやっておくべきことは?ということを会社の先輩パパさんに相談したら、「solo gold medalは取っておけ」と言われた (がんばったきっかけ)
ということがあります。特に2つ目は「確かに!」と思いました。なので、今回が初ソロ参加にして、solo gold medalを取る最後のチャンスということで頑張りました。アドバイスをくれた先輩パパさんには感謝しかありません。
やってよかったこと
さて、ここからやってよかったことについて忘れないように書いておきます。
まずはとにかく簡単な方法でいいのでsubmitする
社内のkaggle強い人に前に言われた気がするので、まず意識したことがこれです。やってみて思ったのですが以下のような効果があることを実感しました。
- submitして順位やスコアがでるようになるとモチベーションが上がる。
- 何かベースラインがあると手法開発がしやすい
特に1の効果がすごかった気がします。ちなみに私の場合、KaggleのCodeで公開されてたシンプルな手法をそのままコピペしてsubmitして一番最初のスコアを出しました。シンプルな手法だったため、最初は200位にも入れなかったと記憶していますが、それでもモチベーションはそれまでと比べてすごく上がりました。
毎日決めた数の改良を試す
これはコンペに限らず重要なことだと思いますが、とにかくコンスタントに改良を続けていき、最低限local CV scoreを出すということを意識してました。
今回のコンペでは3,4個の改良を毎日試すことを目標にしてやってました。私の場合、gitの1 branchが1改良になっていて、9/1からがんばり始めて11/15までに最終的には351個branchができていました。なので、通算4から5個くらいの改良を毎日試していたことになります。
このとき改良としてうまくいきそうなものはもちろんですが、思いついたタイミングではあまり筋が良くなさそうだけど他にやることがないというときは、筋が良くないアイディアもダメ元で試すようにしてました。
結果として、やってよかったと感じた理由としては、仮説を立てて試すとうまくいかなかったときの問題への理解度がすごい上がるため、とにかくいろいろ試すことで、そこからいいアイディアをひらめくということが多くあったからです。
今回のコンペで何度か大きくスコアを上げたタイミングがありましたが、総じて何かの失敗から気が付いたアイディアをもとにしたことが多かった印象です。ちなみにどれくらい失敗し続けたのかの体感ですが、1週間スコアが上がらないということがよくあったので、うまくいった改良というのはこれだけ試しても数えるくらいしかなかった印象です。
ensembleはすぐに試さない
これも社内のkaggle強い人に前に言われたことなのですが、ensembleをすぐに試さないというのはやってよかったなと思います。
今回はensembleを試さなくてよかったなと感じた理由としては、ensembleはやれば簡単にスコアが上がるのでいいように感じますが、ensembleは始めるとすごいいろいろ試せることがある一方、おそらくそこまで高いスコア上昇をしていなかったような印象があります。
このためensembleを頑張ることに時間使うよりも1つのモデルのスコアが上がるように頑張るという作戦でいたのですが、結果としてそれが良かった印象です。
最後まで諦めない
最後はこれです。特に今回はsolo gold medalが欲しかったので、一人で出ていたのですが、途中全然順位が上がらず何度ももうやめようかなぁと思うタイミングがありました。結果としてそのときダメもとで試した改良やそこから思いついたアイディアがうまくいってスコアを伸ばすということが何度もあったので諦めなくてよかったです。
課題
次にコンペの参加中、もしくは終わったあと振り返って感じた課題的な部分も列挙しておきます。
モチベーションの維持が大変(特に一人のとき)
「最後まで諦めない」のところに似たようなことを書きましたが、とにかくモチベーション維持が大変でした。今まではチームででていたのと、すごい応援してくれる上司がいてくれたりとこの部分はそこまで問題にならなかった印象でした。
今後一人ででるならこの部分はまだまだどうにかしないと最後まで戦うのは難しい気がしています。
public scoreがどうしても気になってしまう
今回のコンペはデータセットの説明を読んだ段階でpublic scoreとprivate scoreのギャップが激しそうだなぁということを思ってたので、それほどpublic scoreを気にしないほうがいいかも?ということを最初思ってました。ただ、それでも最後はpublic scoreを気にしてモデルの改良をしてしまっていました。
コンペのサイトのデータセットの説明のところに詳しくかかれていますが、今回public scoreは4人中一人の最終日一つ前までのデータを、private scoreは4人全員の最後の日のデータを予測するというものでした。この説明を見ると予測する対象が全然違うことがわかります。実際、public scoreの上位陣が軒並みprivate scoreでは順位を落としていました。なので、後から振り返るとやっぱり最初に思った通りpublic scoreをそれほど気にせずモデルの改良をしていて正解だったと思います。ただ、そうはいっても、public scoreの順位が気になってしまって、結局最後はpublic scoreを気にして最終submittionを決めていました。ただ、ふたを開けたらlocal CVがベストなものがprivate scoreも一番よかったので、public scoreを気にしすぎたなぁと思っていました。
ただ、この部分はふたを開けてみないとわからないところなので、難しいポイントな気がしています。
論文を読んで最新研究をコンペの期間中に試すことが心理的に難しい
期間の前半ならまだましですが、どうしても後半になればなるほど、心理的に追い込まれていきます。なので、試すアイディアがないと思いつつも、自分の全然読んだことない論文の手法を試すということが難しかったです。この結果、特に後半はアイディアが前に試したもののちょっと変更したものばかりになり、結果としてそれほど精度が向上しないということが起きました。ただ、この部分一人でやっていると意識しても難しい部分な気がしています。
このため、日ごろから論文を読んでいろいろ手法を勉強し、できれば実装を動かして感触を確かめておくことが重要かなと思いました。実際、今回のコンペではReactomeのpathwayデータを使ったのですが、これは論文の追試のついでにいろいろ試したことがあったからこそできたことだったと思っています。
ちなみにその時の記事はこちらにあります。
ensembleの準備をせずにいると最後の土壇場で困る
ensembleをすぐに試さないことを意識していた結果、実は今回期間最後のほうでensembleをしようとしたときにいろいろ準備できてないことに気が付いてすごい慌てました。具体的には以下の二つが締め切り1週間前の段階でできていませんでした。
- 予測結果をどのように集計して最終的なファイルを作るか?
- ensembleした結果をどのように評価するか?
結局、1はギリギリできたのですが、2の評価方法はとても間に合いそうになかったのでpublic scoreを見てうまくいっているかいっていないか?を判断していました。ただ、これは評価としては微妙なので、次からはそんなに頑張らないにしても中盤くらいにはensembleの準備はしておこうと思います。
最後に
折角なので個人的な振り返りをblog記事にしました。仕事ではない状態でのkaggle参加は初めてだったのですが、思ったよりも疲れたのと、無事子供がコンペ締め切りの前日に生まれて、これから子育てもあるのででしばらくはコンペにでない気がします。ただ、次出たときに今回のコンペで何を思ったのか忘れないようにしておければと思っていたので、記事にできてよかったです。
これが他の人の参考になれば幸いです。