【Kaggle】初心者による初心者のためのコンペ初参加ガイド

# はじめに
プログラミング＆機械学習初心者が[Kaggle](https://www.kaggle.com/)のコンペに初参加した際に感じたことをまとめています。
**「kaggleで強くなるためにはkaggleに取り組むしかない」**と言いますが、具体的な取り組み方の参考となると嬉しいです。
最終的にはコピペだけではなく、自分でいろいろ書けるようになりたいです。そのためにコンペで実践できることについて考えてみました。
今回のコンペでは筆者自身が実践できなかった部分も多々ありますが、「こうしとけばよかったな」という観点で書いています。
メダルや順位にこだわるのも楽しいですが、まずはコンペを通して機械学習を使いこなせるようになりたいと思っています。

最近、筆者の周りでコンペの振り返りがたくさん投稿されました。
どれも学ぶことが多く、今回の記事を書くきっかけとなりました。
多様な視点からコンペ初参加について考えることが出来ると思います。

[Kaggleへ一歩踏み出せないあなたに]
(https://note.com/kou_256/n/n2840bc79145f)
[Kaggle Expertになるまで勉強したことを全て書く](https://qiita.com/Yuki_Kaggler/items/8ffe2ffa6f020e09cfd3)
[Titanic終了後の壁]
(https://qiita.com/shu421/items/ed255c1ad846c92ba448)
[Kaggleの画像コンペに初心者だけでチーム組んで挑んでみたら銅メダル取れた話]
(https://qiita.com/RedBull_132/items/97a1fefc8d00d6d4d520)
[初心者チームでkaggleコンペに参加して銅メダルを取った話]
(https://qiita.com/naccchan/items/f836876d3ed7b4528478)
[【kaggle】初めて参加した自然言語処理コンペの解法と進め方まとめ【CommonLit】]
(https://cpptake.com/archives/855)
[Kaggle参戦記 – CommonLit編📚 – 初コンペと銅メダル🥉]
(https://nishipy.com/archives/1888)
#対象者
・Titanicを終えて、現行コンペに初参加しようとしている方
・とりあえずコンペに参加したけど、何をしたらいいか分からない方
・公開コードとディスカッションの使い方がイマイチぴんとこない方

# 自己紹介
化学系院2020卒、化学メーカーで研究開発をしています。
2021年1月頃からPythonでのプログラミングを勉強し始めました。
それ以前のプログラミング経験はほぼゼロです。(社会人になってからProgateを少しだけやっていた)
kaggleは同2月頃に登録して放置していましたが、5月に開催されたコンペにソロで初参加しました。

お気軽に連絡いただけると喜びます。
Twitter: https://twitter.com/nicephosphorus
Kaggle: https://www.kaggle.com/javasparrowismu
# 目次
* Titanic後の現実
* 初参加したコンペ
* まずはサブミットした。
* 公開コードとディスカッションを読む目的
* 公開コードの活用方法
* ディスカッションの活用方法
* インプットとアウトプットのバランス
* コンペから離れない。
* Twitterを始めよう。
* 初コンペで勉強した教材
* 最後に

#Titanic後の現実
kagglerなら誰もが通るであろうTitanicでサブミットした後に、現行コンペに参加しようと思いました。
しかし・・・

**「テーブルデータのコンペないじゃん！」**

Titanicで写経したLightGBMの出る幕はありませんでした。
ニューラルネットワーク(NN)の使用を前提としたコンペが多かったです。
これではいつまで経ってもコンペ初参加は叶いません。
意を決して一番取り組みやすそうに見えたコンペに参加することにしました。

#初参加したコンペ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/925638/2cb4065d-697c-3e37-9391-5921633de81b.png)
[CommonLit Readability Prize](https://www.kaggle.com/c/commonlitreadabilityprize/overview/description)

与えられた文章の読みやすさを予測するコンペでした。
説明変数がほぼ文章だけだったため、取り組みやすそうだと錯覚しました。
自然言語処理はおろかNNについても理解していない状態でしたが、
とりあえず突っ込む気概だけはありました。


# まずはサブミットした。
Leader Board(LB)に載ることで
「自分でも（ちょっとは）できるぞ！」
という気持ちになれます。
「コンペと闘う」という意識を持つために、ファーストサブはなるべく早く出すべきだと思っています。
なんでもいいので自分でモデルを実装してみましょう。スコアは気にしない。
筆者は文章の単語数を特徴量としてLightGBMに放り込んだ結果をサブミットしました。
ちゃんとサブミット出来ただけですが、結構はしゃいでました。

ここから公開コードとディスカッションに取り組み始めました。

#公開コードとディスカッションを読む目的
ここでは初心者にとっての目的を指します。
**「全ての公開コードとディスカッションを読んで理解する」**が理想ですが、
ハードルが高いと感じるかもしれません。

大切なことは
**「公開コードとディスカッションから何をインプットして、何をアウトプットするか」**
を把握することだと感じました。

コンペに慣れないうちのインプットとアウトプットは以下のようなものだと考えています。

###インプット
・参加者が使っているモデル・ライブラリの理解、使い方を学ぶ。
・定番だと思われる処理方法など、当たり前に行われている「お作法」を身につける。

###アウトプット
・インプットを基にベースラインを書いてみる。
・試されているアイデアを自分で使う。

この視点で公開コードやディスカッションを読んでみると、やるべきことが分かると感じました。

# 公開コードの活用方法
公開コード1つ1つを理解しようと読んでいくとかなりの時間がかかりました。
読みたいものが多すぎてブラウザのタブがひたすら増えてしまい、中途半端な理解になってしまったものもあります。
その反省を踏まえて、以下に示すように公開コードの内容によって取り組み方を工夫したらよいのではないかと考えています。

###EDA(Exploratory Data Analysis)
まずはどんなデータが与えられているのかを解説してくれているものを見つけましょう。
読むだけではなくて、コードを真似して自分でもEDAを行ってみるとデータに慣れてくると思います。
今回のコンペでは自然言語の前処理をこの段階で把握できました。
また、予測に効きそうな特徴量が述べられていたので自分のコードに取り入れることができました。

###初心者向けチュートリアル
1番しっかりと取り組むべきものだと感じました。
理解しながら写経することで、コンペでのスタンダードなベースラインを作ることが出来ると思います。
今回のコンペでは、PyTorchの基礎やBertを使ったモデル実装の流れまで解説しているコードがありました。
クラスや関数がきれいにまとまっていると、内部の処理が理解できない場面がありましたが、
変数の中身や返り値をprint()やtype()で確認することを心がけていました。

###ハイスコアなアンサンブル
メダル獲得を考えるとハイスコアなコードを利用したくなります。筆者もそうでした。
今回のコンペでは、公開コードをアンサンブルしたものをコピーして実行するだけでそれなりの順位になりました。
しかし、自分でモデルを実装せずに、出来たものをアンサンブルすることに注力してしまったことは反省点です。
結果として、中身を理解できないままアンサンブルしたものもあります。
**コピペに頼らず書けるようになりたいのであれば、スコアを気にせずに自分なりのベースラインを作るべきでした。**


# ディスカッションの活用方法
###キーワードを確認した。
ディスカッションを読んでみると、よく出てくる単語があると思います。
今回のコンペだとTransformer, Bert, Robertaなど自然言語処理のスタンダードとなっている言葉です。
ディスカッションをスムーズに読めるように、知らない単語に出会う度に調べていました。
どこまで詳しく調べるかは後述のインプットとアウトプットのバランスによります。

###コンペの課題を把握した。
ディスカッションではそのコンペで克服すべき課題が議論されていることが多いです。
今回のコンペではデータ数が少ないという課題をどのように克服するかが１つの焦点となっていました。
どのような方法が課題解決（スコア向上）に寄与したかも述べられていました。


# インプットとアウトプットのバランス
初心者は知らないことが多い分、インプットしなければならないことが山ほどあると思います。
しかし、インプットだけではコンペで使えるコードは書けないと感じました。
筆者はNNの理論やライブラリの使い方を勉強するのに時間をかけすぎて、
コンペでは自分で実装まで持ち込めませんでした。
書籍やネットで勉強していると分かった気にはなりますが、
公開されているコードを理解しない限りは、kaggleでコードは書けないと感じました。
**「継続的にコーディングやサブミットしながら、分からないところは適宜インプットする」**
というアウトプット中心の方針で今後は取り組みたいです。

最後に心がけたいことについて書きます。

# コンペから離れない。
**これが最も重要です。**
筆者は統計検定受験のために途中３週間程コンペから離れてしまいました。
それまで理解していたコードが読めなくなり、かなりの時間を失いました。
また、上記の「インプットに時間かけ過ぎ問題」により、後半までサブミットが少なかったです。
今回の1番の反省点です。継続的に取り組むことが必須です。

とはいえ、毎日コンペにフルコミットし続けるのは体力的、精神的にもきついと思います。
コンペは3カ月くらい続くため、モチベーションが高いときもあれば低いときもあるでしょう。
やる気が出ないときにコンペから完全に離れずに接点を保っておくことが大切だと感じました。
ディスカッションが投稿された際に通知を受け取るように設定できるので、隙間時間におおまかにでも読むのが良いと思います。

また、話題の[「kaggle日記」](https://zenn.dev/fkubota/articles/3d8afb0e919b555ef068)に取り組まれている方も多いです。
筆者はメモアプリに簡単に記録していたのですが、コンペから長期間離れた際に止めてしまいました。
次回コンペで取り組むことの１つです。

# Twitterを始めよう。
上記のモチベーション維持にも繋がりますが、Twitterでkagglerをフォローしてみてください。
同じコンペに参加されている方が奮闘している姿を見ているとやる気になりました。
強いkagglerが多いですが、初心者にも優しくアドバイスしてくれる文化があります。
また、コンペ終了後のお祭り騒ぎが楽しいです笑
たくさんのメダル獲得や昇格報告を見ると~~少しへこみます~~気合が入ります。

# 初コンペで勉強した教材
現在はNNを使うコンペが多いため、コンペに初参加するときにNNの勉強を始めるケースが多いと思います。
勉強した、もしくは勉強中の教材を紹介します。


[ゼロから作るDeep Learning](https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8BDeep-Learning-%E2%80%95Python%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%A3%85-%E6%96%8E%E8%97%A4-%E5%BA%B7%E6%AF%85/dp/4873117585/ref=pd_bxgy_img_1/355-8545091-5494143?pd_rd_w=eQeKg&pf_rd_p=d8f6e0ab-48ef-4eca-99d5-60d97e927468&pf_rd_r=SWP9KNCX06NAB5H50Y5M&pd_rd_r=05b4a5cb-c5bd-4f7d-86ef-9b11672c9c5a&pd_rd_wg=qsfUe&pd_rd_i=4873117585&psc=1)
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/925638/b485e5ad-ed0b-a366-b8f8-7a20a8c45d69.png">
NNが学習する仕組みを自分でコーディングしていく本です。最初に読んでみて欲しい本です。
学習や推論時に何が行われているのかを理解できます。
ただし、コンペのコードを読んだり書いたり出来るようになる訳ではないため、
まずはそれほど時間をかけずに読み切ってしまうのが良いと思いました。

[ゼロから作るDeep Learning 2 自然言語処理編]
(https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8BDeep-Learning-%E2%80%95Python%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%A3%85-%E6%96%8E%E8%97%A4-%E5%BA%B7%E6%AF%85/dp/4873117585/ref=pd_bxgy_img_1/355-8545091-5494143?pd_rd_w=eQeKg&pf_rd_p=d8f6e0ab-48ef-4eca-99d5-60d97e927468&pf_rd_r=SWP9KNCX06NAB5H50Y5M&pd_rd_r=05b4a5cb-c5bd-4f7d-86ef-9b11672c9c5a&pd_rd_wg=qsfUe&pd_rd_i=4873117585&psc=1)
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/925638/47222308-95da-db68-3c59-4794b5adb286.png">

機械学習における自然言語処理の基礎から説明されています。
現在の主流であるBertなどについてはあまり解説されていないため、
こちらも要点をおさえて、さらっと読んでしまうくらいでいいかなと思いました。

[PyTorch公式チュートリアル]
(https://pytorch.org/tutorials/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/925638/8ece452e-af23-83e0-4eee-45874423215a.png)
公式ドキュメントやチュートリアルは難しいと思っていたのですが、意外と分かりやすかったです。
下手にググってみるよりも、公式の解説を確認する方が解決に繋がることもありました。

[Hugging Face Course]
(https://huggingface.co/course/chapter1)
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/925638/9ca1ab61-c3c9-e2fb-4282-f2bb0cb6d718.png">
自然言語処理のスタンダードとなっているライブラリのチュートリアルです。
初学者はまずこれに目を通してみることをおすすめします。動画解説や理解度確認クイズがあります。


[PyTorch実践入門]
(https://www.amazon.co.jp/PyTorch%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-Eli-Stevens/dp/4839974691/ref=sr_1_5?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=pytorch&qid=1628764586&sr=8-5)
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/925638/51bc25e0-2e83-d7df-9c20-9d9a678b4c0f.png">
コンペ終了後に勉強し始めた本です。現在も学習中ですが、コンペ初期に出会いたかったです。
その名の通り実践的で、kaggleでよく見るNNのコードを詳しく解説しています。
PyTorchを理解して使いこなすためにしっかり取り組みたい本です。


#最後に
今回の内容は、公開コードやディスカッションを使って、なんとか自分で出来ることを増やしていこうとした過程です。
有益な情報を分かりやすく共有してくれるkagglerがいるからこそ、筆者はコンペに参加できています。ありがたいことです。
「初心者なりにkaggleコミュニティに何かしら還元できたら」という思いで記事を書きました。
「もっとこうしたら良いよ！」という点は教えていただけると嬉しいです。
最後まで読んでいただきありがとうございました！