Kaggle Advent Calendar 2023 「LBを駆け上がる快感は初心者にとって強烈なモチベーション」


はじめに

 機械学習・AIに全く触れたことのない人のスタートのきっかけになればよいと記事を書きます。技術的な項目にはほとんど触れません。全然プログラミングに触れたことのない文系の人でもAIに興味があれば歓迎です。
 そんな人たちで機械学習に興味を持つのか?というごもっともなツッコミもありそうですが、このまま突っ走ります。ChatGPTで言語モデルが盛り上がっている今、簡単なモデルをつくることなら誰にでもできるということを知ってもらいたいです。その入り口にKaggleは最適ではないでしょうか?
 「ちょっとプログラミングしてみようかな?」とか「こんなふうに勉強すればいいのかな?」、「kaggleやってみたい!」と少しでも思ってもらえるような記事にしたいです。
 そしてKaggleにハマれば、機械学習の勉強なんて全然苦じゃないってことを伝えたいと思います。

※ 誰でも真似しやすいように、あえて賛否のありそうな浅い取り組み方をいろいろ紹介します。中級〜超上級者の方々は、くれぐれも怒らないでください。
※※ できるだけ良い記事にしたいので記事の編集を細々と続けようと思っています。「こんなことも知りたい」とか、ご意見くださる方はぜひ気兼ねなくコメントください!

対象読者

- 漠然とでもAIに興味のある方。
- Kaggleでメダルを取ってみたい方。
- Kaggle何それ?って方。
- 数学とか、物理とか、経済とか…ともかく数式を使って来なかった方。私はそんな高尚な話も取り組みもしませんでした。

自己紹介

 YYama という名前でKaggleをやっているものです。
 大学には理系で入ったものの内部ですぐに文転。大卒後はしばらく文系職に従事したのですが、研究職に憧れていたので医学部に再入学しました。今は放射線科医(MRIやCTの画像から病気を見つける仕事)をしながら、機械学習の医学応用研究をしています。
 機械学習を始めたのは医学部時代で、基本的に独学ベースです。いまは研究にも取り組んでいますが、本記事では独学時代の話をメインに展開していきます。
 そしてなぜ独学でも機械学習の勉強を頑張ることができたのか、それは「Kaggleのリーダーボードを駆け上がる快感は初心者にとって機械学習を勉強するための強烈なモチベーションになるから」です。

Kaggle参戦記

 以下、Kaggleでどのように勉強をしてきたのか、実際に参加したコンペティションをベースに説明していきます。

ひろしまQuest2020#stayhome (Signate)

 記憶を整理してみると初めてガチで参戦したのはKaggleではなく、Signateでした。Signateは国内の機械学習コンペティションサイトとしては当時、最も著名なものだったと感じていました。確かこの時期のKaggleのコンペティションは私にとってはタスクが難しいものばかりで参加できなかったような気がしています。
 そんな矢先、ひろしまQuest2020#stayhomeというコンペでは、プロ野球の打席のデータをもとに投球する球種やコースを予測するという単純なテーブルデータのコンペティションでした。たしか機械学習の勉強を始めてから2か月目くらいで出た気がします。

とりあえず色んなモデルを作ってアンサンブルしてみた

 SignateではKaggleと違ってコードがほぼ公開されておらず、機械学習モデルを作るのには、自分で0からコードを書いていく必要があります。これが初心者にはなかなかハードルが高いのですが、Qiitaなどネット上に落ちているコードを頼りに、ほぼコピペと改変で、ベースラインコードを作った記憶があります。
 たしかscikit learnという基本的なライブラリのランダムフォレスト、LightGBM、XGBoostなど基本的なモデルを何種類か作って、なんとか平均くらいの性能が出るモデルを何日間もかけて作れました。
 そして、アンサンブルという複数のモデルの予測値を平均する方法を試しまくりました
 アンサンブルはコンペティションでは非常に重要な要素ではありますが、本来的には基本となるモデルの改善が最重要とされることを承知しつつ、私はアンサンブルを推したい。
 なぜなら初心者のモチベーションはリーダーボードの順位表を付け焼き刃でだって上げることだからです(違う人もいるのは知ってますが、入り口はこういうのでいいじゃないって思います)。
 機械学習に興味のない人にも、これは薦めたい。一気に何十位、何百位と順位を駆け上がり、メダルが貰える圏内まで昇り上がる爽快感を知ってしまえば、もう機械学習コンペを辞められない身体になっているはずです。脳内で報酬系がこれでもかと刺激されます。ただ初心者には、正攻法でスコアを上げることはかなりの無理ゲーです。ただアンサンブルならそれが可能である(ただその状態だと天井が見えているので批判されることもある)。

※ 真面目な話、私は序盤から基本的なモデルのトレーニングに合わせて、どのようなアンサンブルが有効かを検討していくことはとても大事だと思うのですが、どうでしょうか?

結果は銀メダル(球種予測)と銅メダル(コース予測)

 結果としては上位に与えられるメダルを表題のように獲得することができました。これには脳汁がドバドバと出たことを覚えています。
 いま思うと、Kaggleでメダルを取るよりはだいぶ簡単なことなのですが、これを持って「もしかしてKaggleでもメダル取れるかも?」という、やや無謀な自信を身につけることできました。そうして戦いの場をKaggleに移すこととしました。

Kaggleの方が実は初心者におすすめかも

 実はKaggleの方が初心者におすすめかもしれません。それはSignateにはない、コンペティションに関係するコードが大量に公開されるからです。これらは有志により公開されるもので、非常にレベルが高いものもたくさんあります。(公開は英語が原則ですが、今ならChatGPTのおかげで、それも大した壁になりませんね)
 たいていのコンペでは、公開コードの中で一番精度の高いものを少し改善するだけでメダルが取れるほどです(それが難しいけど)。ということで、私は公開コードを使いまくって参加することにしました。

OpenVaccine: COVID-19 mRNA Vaccine Degradation Prediction (Kaggle)

 平たくいうとmRNAワクチンの分解率を予測するものです。この予測のためにRNAの塩基配列や長さなどに関する情報が与えられ、これを元にターゲットを予測し、その精度を競うというコンペティションでした。
 当時の方がドメイン知識があったので、今は何も言えませんが、まあ細かいことは置いておいて、テーブルデータ(表形式)コンペで初心者でも比較的参加しやすいコンペティションでした。このコンペティションに参加した時点で、機械学習の勉強を4ヶ月間くらいしていました。

とりあえず公開コードを使いまくる

 とりあえずメダルが欲しい。初心者でも参加しやすいこのコンペに参加することにしました。
 このコンペティションはいわゆるニューラルネットワークがモデルの主体のコンペティションでした。Signateのコンペティションでは、基本的なベースラインができたら、そのモデルをランダムフォレスト → LightGBMにすげかえる、みたいな簡単な取り組みをしていましたが、そんな単純ではありませんでした。というのも、まず用語が難しかった。
 公開コードでは、GNN、LSTM、GRU、Attentionなど意味不明すぎる用語が並んでいました。これらはいずれもニューラルネットワークにおけるモデルの構造に関わるような用語なのですが、もはや細かい理解はできないと腹を括りました。「俺にできることはアンサンブルだけ、とりあえず色んなモデルを混ぜよう」と安易に考えたのを覚えています。

どうやら単なるアンサンブルではメダルは取れない

 公開されている上位のコードをもとに、その予測をアンサンブルするだけでも簡単にメダル圏内に入れることに気づきました。この時点では、「Kaggleでメダル取るなんて楽勝じゃね?」と不遜にも思いました。が、1ヶ月という短期間コンペだったこともあり、直ぐに競争が苛烈になり、このような単純な取り組みではあっという間にメダル圏外になってしまいました。
 「ただ混ぜるだけでは絶対スコア伸ばすのは無理」という当たり前すぎることに気づきました。ググったりすると、アンサンブルでスコアを伸ばすためにはモデルの多様性が重要であるという、文言を何度も目にしました。
 最初は「意味わからんがな」と思いましたが、この多様性を増すための取り組みが、私にとって非常に重要な機械学習の基礎鍛錬になりました。

モデルの多様性

 モデルの多様性とは、そのままで、いろんな手法のモデルの予測をアンサンブルすることでスコアが伸びるというものでした。ものすごく簡単なことだけでも以下のような例があります。
- モデルの構造: たとえばモデルの層の数や種類が異なるようにする。
- モデルの訓練方法: モデルの学習時のパラメータを変化させるだけでも多様性が増すことがある(たとえば学習率・バッチサイズ・エポック数を変える)。さらにはseed値を変えるだけでも多様性が生まれることがある。
- モデルの入力:モデルにデータを入力する際には、前処理といって全てを数値情報にする必要があります。あるいは数値情報にした後にも正規化など、さまざまな過程を経ます。たとえば入力が多い場合には、それを途中で切ってしまうなどの前処理もあります。これらの条件を増やすことでもモデルの多様性が増します。

 モデルの訓練においてパラメータを変えるだけが(ハイパーパラメータチューニング)、一番簡単にできることですが、多様性もそこまで増えません。
 モデルのアーキテクチャを変えることはけっこう多様性が増しました。これに取り組むために、私はモデルの構造を書き換えてみることにしました。経験がある人には簡単なことかもしれませんが、これが初心者にはとっても難しい
 まずはコードの書き方を勉強する必要がありましたし、層をひとつ増やすだけでも、どこに書き足せばいいのかわかりませんでした。
 またモデルの構造を書き換えると出力の形も変わるために、その整合性を整えるために、この層では出力はどのような形になっている…といったことを細かく把握する必要が出ました。

 これらは非常に基本的なことですが、初心者にとってはとてつもなく難しいことです。寝る間も惜しんで、これに取り組みました。理由は単純明快、「リーダーボードを一気に駆け上がって、自分のアイコンの横にメダルがついているのを見たかった」からです。 
 嬉しい副産物として、これらの実装を通して、ニューラルネットワークの基本が理解できてきたこと。

アンサンブルの限界

 上のように多様なモデルを量産することで、機械学習の基礎を学びつつ、スコアを伸ばしていくことができたのですがついに頭打ちになってきました。1ヶ月間のコンペティションであるのに最終的な参加者は1600人超と順位争いが非常に厳しいコンペティションとなってきたためです。
 金メダル争いをするような人たちは気づいていなかったかもしれませんが、銅圏ボーダー争いも非常に苛烈で、1日で何十位も順位が下がります。
 この状況を打破するために過去のコンペティションのソリューションを調べるとスタッキングなる手法がコンペティションの上位陣では頻用されていることに気づきました。

スタッキングに挑む

 初心者にとって「スタッキング」なんて意味不明すぎる手法でしたが、色々な記事を読んでいると、「複数のモデルの予測値をあわせて、2段階目のモデルの入力として、2段階目のモデルに予測の集約を行わせる」手法であろうことがわかってきました。
 たしかに単純に平均を取ったりするよりも遥かに良さそうな手法であると思いましたが、そんなの初心者の自分には初耳すぎたのでできません。
 しかもKaggleではスタッキングのコードが公開されることは稀であり、自分で0から実装する必要がありそうだなと思いました。
 初心者でない人たちには簡単かもしれませんが、
① 初心者にとっては多数のモデルの出力を一旦保存し、
② これらを集約して次のモデルの入力にして、
③ 最終的な予測を得る。
なんて芸当はそうそうできません。

 が、他の参加者のスコアの伸び方から、試されうる手法は試さない訳にはいかないと感じました。このとき私は医学部6年生の秋で、国家試験の勉強だってしなくてはなりません。「国試の重要な時期に、関係のない勉強をしていることは人生にとって、とんでもないリスクだ」と思いました。でも、睡眠時間を削って、ネットの海から良さそうな実装を集め、自力で実装しました。だって「メダルが取りたいから」。もうなんでメダルが取りたいのかも、よくわからなくなっていましたが、メダルが取りたい。スコアボード駆け上がりたい。これはもはや本能的な衝動で、止まることができませんでした。

そして銀メダル

 結局、数十個のモデルをつくり、これを集約するスタッキングモデルを作り(MLP + LigthGBM)、これらをさらにアンサンブルするというパイプラインで 1636 チーム中 54位と上位3%の成績で銀メダルを獲得することができました。
 これはとんでもなく嬉しかったです。このときの喜びが今でも機械学習を続けている原動力になっているといっても過言ではありません

長々書いてますが、この画面が見たかっただけで1ヶ月頑張り切ったってことです。

 KaggleはあのGoogleが運営しているサイトで、世界中のデータサイエンティストや学生たちと争って、上位に入る(自分にとってはこの順位はとてつもない上位でした)。こんなことが自分にできたなんて信じられませんでした。機械学習への興味はもちろんあったのですが、それ以上に「メダルを取りたい。リーダーボードを駆け上がりたい」という一心だったと思います。
 たぶんネトゲにハマる感覚みたいなものなんじゃないでしょうか?Kaggleのいいところは、さらに機械学習全般の技術を身につけられることです。
 すなわちKaggleの中毒性、リーダーボードを駆け上がる快感は初心者にとって機械学習を勉強するための強烈なモチベーションになるのです。

結語: みんなKaggleやろう

 こればかりは体感しないとわからないと思うのですが、世界中のデータサイエンティストが参加しているとされるKaggleのリーダーボードを駆け上がるのはとんでもない快感です。
 これを知ったら機械学習コンペティションはやめられない、すなわち機械学習について学習し続けることができます。
 みんな、Kaggleやろう。


以下は本筋から外れるけどご参考になるかも?

脱・独学

 独学で学習をスタートするのはいいと思うのですが、研究論文を書くなど専門にしていくのは流石に一人では無理がありました(ちょこちょこ実習させてもらったりはありましたが、基本的には独学ベースのため限界もありました)。特に、私は医学分野に機械学習を応用して研究をしたいというモチベーションがありましたが、論文を書いたりするノウハウを一人で身につけるのはとてつもなく難しいと思います。また研究機関に所属していると英文校正でも予算を出してくださったりと、さまざまなサポートを得られます。また私が研究に使ったデータの中にはそもそもアクセス権を得るのに、所属している機関の別の研究者の推薦がいるなどのケースもありました。流石に一人ではできないかも…
 私の場合は医師なので、臨床をするためには初期臨床研修という2年間の研修を修了する必要がありました。この間に、研究を平行することは難しく(※ 例外あり)、Kaggleに取り組むことにより機械学習の基礎力を身につけることに決めました。
 初期研修終了後は、放射線科医師として働きながら、大学院に所属し念願の機械学習研究をスタートすることができました。

※ 一部の大学では大学院に所属しながら研修を進めることもできますが、私の採用試験時には関心領域で機械学習の研究ができるようなプログラムは見つけられませんでした。

Kaggleは研究の役に立つ

 最近になって本格的に機械学習の医療への応用研究に取り組んでいます。医療への応用研究では、総じて基本的な実装が多く、Kaggleの上位ソリューションなどを読んでいれば理解に困ることはありません。
 最近、初の論文をサブミットすることができましたが、この実装は Kaggleに真剣に取り組んでいる人なら、おそらく数時間もかからないで終わる程度のものです。
 結論: Kaggleは研究の役に立つ。

※ まだジャーナル論文を通したことないので、これは私個人の願望でもあります。

学会コンペ (shared task)

 またコンペ好きに打ってつけなのが、コンピュータサイエンス系(CS系)のカンファレンスで開かれるコンペティションです(いわゆる学会コンペ)。
 私は分野外のため、詳しくはないのですが、CS系カンファレンスはメインカンファレンスとワークショップに大きく分かれ、ワークショップはインパクトはメインよりも小さいものの分野に特化した話題を取り扱っています。
 こうしたワークショップではshared taskとしてコンペティションが開かれており、その解法がワークショップ論文として採択されたり、上位に入るとコンペティションのサマリー論文の共著者に加えてもらえたりします
 ワークショップ論文がどこまで学術的な評価をされるかはわかりませんが、そもそも分野外の場合は論文を出すこと自体が困難であるため、良い経験になると思います(英語論文を書く必要がありますが、ChatGPTを駆使して頑張ってみてください)。
 学会サイトで直接案内があったり、以下のようなサイトで開催されているので、よかったらチェックしてみてください。

  • CodaLab: これまでにNeuRIPS、CVPR、ICCVなどトップカンファレンスに付随するコンペティションが開催されてきているようです。

  • Codabench: CodaLabの姉妹サイトのような位置付けのようです。

  • Grand Challenge: 医学生物学系のshared taskが多く開催されています。

最初の勉強の仕方

始めたきっかけ

 NHKの「NHKスペシャル 天使か悪魔か 羽生善治 人工知能を探る」という番組を見たことがきっかけでした。
 この番組ではかの有名な囲碁AIであるAlphaGoが取り上げられており、これほどのポテンシャルのあるものであれば、どのような分野にも強いインパクトを与えることが容易に想像できました。
 私は文学部を卒業したり、医学部に進学したり、ふらふらと興味が定まらない部分があることを自覚していたのですが、全ての分野に通じるような強烈な技術が登場していることに感銘を受けました。機械学習を身につければ、どのような分野でも研究を進めることができるのではないかと考えたのです。

どうやって勉強した?

 基本的に独学、振り返ってみると独学じゃない部分もあったので、以下に紹介します。
 まず2018年ごろにpython(AI開発のメインになっている言語)の勉強をしてみました。なんといってもpythonを勉強しなければ始まりません
 以下の本で勉強しましたが、古い本なので新しいものを使った方が絶対にいいです。

  • 実践力を身につける Pythonの教科書
     2016年と古いです。新しく勉強したい方にはおすすめしません。わかりやすければなんでもいいので、立ち読みして読みやすそうなの買いましょう。amazonである程度、評価されているものなら、たぶんなんでも大丈夫です。
     カバーできていない範囲があるとか、そんな細かいことはどうでもいいです。とりあえず全体の内容を掴むことが大事です。できるだけ簡単なもの買いましょう。

 オンラインの資料でも良質なものが多くあるので、以下にリンクを貼っておきます。本はお金もかかるので、こういうものから始めることをおすすめします。

  • Pythonプログラミング入門(東京大学)
     いまとなっては簡単な話ばかりなのですが、何も知らない人が触ると難しく感じると思います。そういうときのおすすめは飛ばしちゃうことです。そのとき、わからなくても他のことを勉強しているうちになぜかわかるようになっているものです。つまづいて学習をやめてしまうことが一番怖いことだと思います。
     forループ(繰り返しの処理を行うためのもの)とか、初めての人は基本的なことでもなかなか理解できないかもしれません。「リスト内包表記」なんて、名前からして文系人を寄せ付けない何かがあります。
     この辺の内容はぶっちゃけ全部抑えなきゃいけないのですが、ほっといてもそのうちわかるだろの精神で学び続けることが大事です。
     例えばX月XX日までに、この章まで終わらせるという目標を立てて、難しくて挫折しそうなら、その日にそっと次の章に行ってしまえばいいのです。本当に必要な知識なら、後で調べ直す羽目になるし、そうでないならそれはスルーして良かった内容なんでしょう。
     上の資料ではnumpyやらpandasやらscikit-learnやら何やら難しそうな言葉が出てきますが、こいつらも使いこなせたらいいですが、いまだに知らない関数が山ほどあります。その都度、調べれば良いのです。

他大学での実習

 医学部は必修科目で平日の朝から夕方までほとんど埋まるので、機械学習など他学部の授業を履修することはできません(大学によっては可能かも)。また私の学部には機械学習をしている方はいないと思い込んでいたので(実はいました。後述します)、自己計画実習という自由に病院実習ができる期間に他大学で実習ができないか模索しました(研究もOKだったから)。
 すると先輩に他大学で機械学習の実習をした人がいると聞き、この方に間接的に紹介してもらうことで、医学系大学院の先生に実習受け入れをしてもらえることになりました。
 コロナ禍のためオンサイトは中止となり、リモートで週1回1時間くらいだけ教えてもらえるというものでした。具体的な実装などは独学するように求められましたが、CheXpert (おそらく申請すれば誰でもダウンロード可能)というレントゲン写真のデータセットを用いて、簡単な画像分類モデルをつくりましょうというテーマでした。
 週1回のzoomで進捗を報告し、コメントをもらえるというもので、独学がベースではありましたが、報告をしなければならないというタスクを与えていただいたことで安定して取り組むことができました。

 肝心のコードを書くことが難しいというご意見もあると思います。それはその通りで初心者にはとても難しいです。このため、既に完成しているコードを持ってきて、自分用に少しずつ修正するとかで慣れていくしかないです(最近だとChatGPTに指示すればかなり修正してくれると思いますが…)。
私の場合は、そもそも「ディープラーニングなにそれ?」状態だったのですが、TensorFlowのチュートリアルサイトをコピペして、必要な部分だけ書き換えて臨みました(最初だったので、ほんの数行の変更に何時間もかかった気がします…)。

  • 初心者のための TensorFlow 2.0 入門
     当時より内容が更新されていますが、Image Classification あたりのTensorFlow公式のチュートリアルサイトで勉強しました。大学で実習なんてできねえよ、という方も上のサイトで私が経験したことをほぼそのまま追体験できます。


この記事が気に入ったらサポートをしてみませんか?