Kaggle 奮闘の備忘録

2021年7月から本格的にkaggleのコンペに取り組み始めましたが、さっぱり分からず...
もっと勉強していかないなとアウトプットのためにまずは自分の取り組みを備忘録として残し、他記事で掘り下げて解説とかできればいいなと思っています。
とにかく記録として、本記事そのものは大雑把なメモ程度でいいかなと思ってます。
(書式だけでも見やすい形を考え中...マークダウン突っ込んで理解して少しずついい記事にします)

kaggleへの取り組み姿勢は、コンペに応じて勉強が必要にはなると思いますが、そこそこ勉強はしてきたと思うのでできるだけ自分が理解してきた知識をどう応用するかということを大切に進めていきたいです。なんか知らないけど公開されていたカーネル動かしたらいいスコアでた！とかはしないように取り組んでいきたいですね。

# スペック
社会人3年目のフリーランスエンジニアです。
2年ほどデータサイエンスの勉強をしていますが本業のWebエンジニアの勉強も必要で、隙間隙間でちょっとずつ積み重ねてきました。機械学習そのものの概要を掴んで、勾配ブースティング決定木の理論部分もなんとなく理解できる程度になったのでkaggleで実践を積み重ねようと思った次第です。2年位前からkaggleは登録していますが、まったくついていけなくて理論を頑張って固める方向で勉強していました。

もはや愛読書になった『Kaggleで勝つデータ分析の技術』を崇拝していますので、コンペで悩んだら目次パラ見して使えそうなものを活かしてみる形をとっています。
https://www.amazon.co.jp/Kaggle%E3%81%A7%E5%8B%9D%E3%81%A4%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%AE%E6%8A%80%E8%A1%93-%E9%96%80%E8%84%87-%E5%A4%A7%E8%BC%94/dp/4297108437

# 2021年7月
なんでも良いからやってみるかと上のほうにあったコンペを直感的に選択。
また、kaggleの合間にsignateに課金して機械学習の復習をガンガンしています。
https://www.kaggle.com/c/commonlitreadabilityprize

上記コンペは自然言語処理が必要なものでした。
1からモデルを作る力はなかったのでCodeを公開している方の中でMost Vote(一番いいねが来てるやつ)
を選んでじっくりとコンペの理解及びベースのモデルを作成しました。
https://www.kaggle.com/ruchi798/commonlit-readability-prize-eda-baseline

EDA(探索的データ分析)などが非常に参考になりましたが、実際やっていることはデータの前処理、
言語のベクトル化、train_test_splitをLiniar Regression(オーソドックスな回帰モデル)に当て込んだ極単純なものでした。
(単純な機械学習モデルと言ってもちゃんと解説したいですね)
前処理の記事: https://qiita.com/fumifumitaro/items/c613d033ebc94c5e608d

自分が学んだということもあり勾配ブースティング決定木を使いたいなぁと、LightGBMを利用。
また、バリデーションとしてクロスバリデーションを選択しました。
ここら辺は人のコードを参考にというよりも自分の使える知識を少しでも適応させたいなぁといった感じです。

自然言語処理はあまりしたことがなかったので当初のモデルで採用されていたWord2Vecから、
勉強がてらBERTに変更してこちらのモデルでベクトル変換を行いました。

ここまでして、順位は大体 2060 / 2960とかです。
こっからは特徴量を入れ込むため、思いつくものはガンガン相関係数など取るなりしてモデルに適応させたいと思っています。
また、追加した後はモデルのチューニングが必要だと感じているのでハイパーパラメータの最適化をしたいです。
余裕があればランダムフォレストあたりを使ってアンサンブルまでもっていきたいですかね。

とりあえず、bag of wordsで単語表みたいなのを作成しました。
特徴量に活かす方法がわからずテキトーに全てモデルに投入してみました笑
あんまりRMSE(正解からどのくらい外れているかを表す指標)が下がらないので、ここから単語の重みをとったり、1単語ではなくかたまりで単語を取るのがいいのかもしれません。

bag of wordsからTFIDFに変更しましたが、あまりいい成果が出ませんでした。
BERTの処理部分の見直しや、他に思いついた特徴量をガンガン詰め込んでちまちまとRMSE
RMSEを下げている段階です。

初コンペ参加から2週間ほど試行錯誤して気づいたのですが、現時点での知識でいじくり回してもスコアは変わりませんね。
分からないところを浮き彫りにして掘り下げて勉強して、落とし込んでいくように丁寧に丁寧に進めていくのがベストな気がしてきました。
なにより自分が一番興味がある深層学習および強化学習の勉強をガツガツしたいモチベになりました。

急ぎでBERTの勉強を行いました。
コンペは期限があるので短い時間で濃密なインプット行おうと必死になりますね！
ファインチューニングを行うとRMSEが下がるものの、オーバーフィッティングしてしまいリーダーボード上のスコアは低くなるという機械学習の難しさを知ります。。。

初歩的なミスでRMSEが可笑しくなっていたことが判明、この手直しと頑張って描いたBERTのファインチューニングを見直してなんとかRMSE0.52まで減らすことに成功しました！
ただ、上位の方々は0.46あたりなのでせめて0.4台まで下げたいのですが勉強不足を痛感している状況です。なんとなく上位の方のコードなど理解は及ぶものの、自分のコードと比較して何が違うから差がつくのかという部分を明確にできるまで落とし込めません。このコンペは焦らずここら辺で切り上げて終了後にトップ数人のを参考により深い理解をしていきたい気持ちです。
それからタイミングよくSignateで自然言語の分類コンペが始まったのでそちらを並行して来なそうかと思っています。今回学んだことを復習しつつ、今より納得いくモデル構築を行なっていきたい所存です。

初コンペが終わり、順位は2095/3682でした。https://www.kaggle.com/c/commonlitreadabilityprize/overview

半分くらいは行きたいなと思っていたので、まだまだ努力不足ですね。
当分は上位50％程度を目標に努力して、その程度のスコアを出して色々なコンペに切り替えていきたいと思います。

# 2021年8月
色々勉強が足りなかったのでコンペにのめりこまずに基礎から勉強しなおしていました。
一応軽くコンペやってみたりしましたが、うまくモデル作れなかったりコンペで競うという前段階で躓くことが多かったです。
当分は初コンペと同じ自然言語の分野で頑張ろうと思いました。

# 2021年9 ~ 10月
コンペに挑戦したりしているのですが、全然まともなモデルが作れずに挫折しかけてモチベ低下中という感じです。
ディープラーニングを詳しく理解しようと参考書を買って心がおれないようにじっくりじっくり進めています。
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%95%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E7%B7%A8-%E6%96%8E%E8%97%A4-%E5%BA%B7%E6%AF%85/dp/4873119065/ref=sr_1_20?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%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%82%BC%E3%83%AD&qid=1633864989&sr=8-20