見出し画像

Kaggleへ一歩踏み出せないあなたに

対象読者

Kaggleとは何かは知っている
Kaggleをやってみたいと思うが、なんとなく始められない
ある凡人の体験談を聞いてくださる方

この記事でお話すること

2021年5月、
Indoor Location & Navigationコンペでチーム銀を獲得し、
Kaggle Competitions Masterの称号を得ることができました。
2020年5月頃からKaggleを開始したので、およそ1年で取得することができました。

画像1

良い区切りだと思いましたので、このタイミングで、私がどうやってKaggleをする感覚を身に着けたかを記したいと思います。

私は他のKaggle Masterの方々と比べると、明らかに理論面が弱いです。
Twitterでみんなのお話を見ていると、みんな本当にすごいなぁという感じです。それでも私なりにこの1年Kaggleに向き合い、結果につなげることができました。
この記事では、私のように

Kagglerのみなさん、お話のレベルが高くてついていけない・・・
数学わからない・・・
でもKaggleはやってみたい!

という、Kaggleを始めてみたいとは思うものの、なかなかその一歩が踏み出せない、どう初めていいかわからない、という方に向けて書きました。

この記事を読んでいただいた後、
 よし、始めてみよう!
 同じ土俵で競ってみたい!
 天才じゃなくてもKaggleは始められる!
と思ってくださる方が1人でも増えれば嬉しいと思っています。
そして、共にKaggleで対戦する、はたまた一緒にチームを組んでくださる方が出てくることを願っています。

この記事の結論

本当に基礎的なところを勉強したら、すぐにコンペに参加しましょう
コンペを走りながらできることを増やしていけば、いつの間にかできることがびっくりするほど増えています。

私が考える、基礎的なことがなにか、については、記事の中で触れていきます。

私が行ってきた勉強

機械学習をはじめようと思った私が、どういう順序で勉強していったかを記していきたいと思います。当時私の頭の中にあったのは、とにかく「わからない」です。ではどうするか。

こういうとき私が頼るのは、その分野における初心者向けの本です。

※今回ここに書いた以上に勉強はしているのですが、わからずに挫折したものがたくさんあります。これについてはこの記事には書きません。そもそも初心者向けのソレが何なのか、それすら最初はわからないですよね。
※Titanicくらいならもうやったよ、という方は、2. までSkipしてください。

1. 基礎の勉強

Kaggleをやってみよう!という思いはあっても、さすがに本当に何も知らない、では何をどうしたらいいやら全くわからないため、基礎的なところをおさえるところから始めました。

1.1. 入門書で勉強開始 ~ Titanic

画像2

日本Kaggler界では言わずと知れた、u++さん、カレーちゃんさん共著の名著、Pythonではじめる Kaggleスタートブックです。
Kaggleについて興味のある方であれば聞いたことであるであろう、チュートリアルタスクである「Titanic」を題材に、機械学習における基礎的な内容を非常に分かりやすく解説しています。

画像8

Titanicコンペは、乗客及び乗組員の各種属性(性別や年齢)から、例の事故後、その人が生存するか否かを予測するという、「分類問題」です。つまり生存か死亡か、どちらかに分類するということですね。

私はこの本を端から読み、コードを実行しました。この本を読むことで、以下基礎的な事項がわかるようになります。

・Kaggleの取り組み方、仕組み
・特徴量エンジニアリング
・可視化
・sklearnやLGBM等の重要なライブラリ
・パラメーター調整
・Cross Validationの方法
・アンサンブル

上記、まだ聞いたこともないという言葉がたくさんあるかもしれませんが大丈夫です。一度Kaggleスタートブックを読めばアイデアはわかるようになります。これで、とりあえずKaggleで戦うための最低限の武器を与えてくれます。

AIってなんだかすごそ~ 程度の頭だった私には、この本を通して実際にTitanic”予測ができたという事実”は、何とも言えず感慨深いものでした。

これで一応本当に基礎的なところはわかったかな?というところだったのですが、この時、Titanicの知識で挑戦できそうだな、と思えるコンペがありませんでした。当時、テーブルデータのコンペというのがありませんでした。画像系についてはノータッチだったので、できる気がしなかったというのが正直なところです。
そんなわけで、Kaggleにはもう1つ、代表的なチュートリアルタスクがあることを知った私は、次にそちらに挑戦することにしました。

1.2. House Prices で回帰問題にも挑戦

Titanicは「分類問題」でした。
Kaggleにはもう1つ代表的なチュートリアルタスク、House Prices - Advanced Regression Techniques があります。ネットサーフィンをする中でこのチュートリアルタスクの存在を知った私は、これにチャレンジすることにしました。
House Pricesは、中古物件の各種属性(販売年、プール有無等)から販売価格を予測するという、「回帰問題」です。販売価格は金額なので、連続値ですよね。0か1かではなく、1000万円だったり2500万円だったり、1億円だったりします。こういった連続値を予測するのが、回帰問題です。
「分類」と「回帰」ができれば大まかに機械学習できるようになったと言えるかな?という思いがあり、挑戦しました。

当然私は回帰問題の解き方など知りませんので、Code(当時はNotebookでした)タブから、参考になりそうなNotebookをいくつか探しました。

画像3

Codeを見るにしても、本当にたくさんのコードが投稿されています。そんな中から、私は以下の2つの視点で参考にするコードを探しました。

・EDA (Exploratory Data Analysis) = データを理解するために不可欠なデータの分析を行ってくれているCode
・AIモデルを構築して予測を実施しているCode

Kaggleスタートブックとはまた違った視点からの可視化、モデル構築について学ぶことができました。

2. コンペ参加

ここまで、実際にコンペに参加したいとは思っていました。しかし前述のとおり、画像系については全く学んでいなかったため、当時はチャレンジしようとすら思えませんでした。
そんな時ちょうどよいタイミングで、ちょうどよさそうなテーブルデータのコンペが始まりました。この記事の本題はここからかなという感じです。
私がどのようにコンペを走りながら、Kaggleに慣れていったか書いていきたいと思います。

2.1. MoA コンペ参加

画像4

2020年9月、MoA Prediction コンペが開始されます。
私が参加したい(参加できる)と思っていたコンペは、テーブルデータのコンペでした。当時なかなかテーブルデータのコンペがなく、本当にちょうどよいタイミングで開催されました。

先にこのコンペの結果を申し上げておくと、本当に運よくなんですが、金メダルを取れました。この金のおかげで、Masterになれたという形です。

話を戻しまして、このコンペで参加者が挑戦するのは、「遺伝子発現データや細胞生存率データなどの様々なインプットを与えられた異なるサンプルの作用機序(MoA)応答の複数のターゲットを予測する」
・・・という、門外漢にとっては全くわからないお題でした。

しかし待ちに待ったテーブルデータコンペ。これはやるしかない!ということで参加を決めました。

とはいえ、どのようにモデルを作っていけばいいかという点については、
まだまだわかりませんでした。MoAは分類問題であり、Titanicと同じです。しかし問題はその目的変数(予測したい変数)がTitanicでは1個であるのに対し、MoAでは206個もあることでした。当時の私はこの時点でパニックです。やり方が全然わからないんです。

画像5

ではどうするか、そうです。公開Codeです。
出来る方々が公開してくださっているCodeをコピーして、いじってみるところから始めました。この時点で私が知っている学習機はLightGBMくらい。まずはLightGBMを利用しているCodeを参考にしました。

しかしコンペが進んでいくうち、CodeやDiscussionを見ていると、どうやらこのコンペではLightGBM等の学習機よりも、ニューラルネット系のほうが良い精度が出そうだ、ということになってきました。

しかしニューラルネットなんてやったことがありません。Codeを参考にしていると、どうやらPyTorchやKerasというライブラリがあることがわかります。私の目にはKerasのほうが圧倒的に容易に扱えそうに見えたため、こちらでやってみようと決めます。Codeで雰囲気を掴むことはできるものの、なかなか体系だった知識は得られません。

ではどうするか。私の場合はを探します。

2.2. Kerasを学ぶ

画像6

Kerasを理解するのによさそうな本がありました。
PythonとKerasによるディープラーニング です。
実際これが私には大当たりで、Kerasを使う基礎的な部分を理解することができました。
私がKerasについて素晴らしいと思うのは、ニューラルネットのコアである、誤差逆伝播といった話を理解せずとも使い始められることです。
プログラマーである私から見れば、難しい部分をうまく隠して抽象化された、素晴らしいライブラリであると言えると思います。AIやるなら行列、微分は必須とよく言われますが、とりあえずKerasでそれなりのネットワークを組むのであれば、知らなくともできるようになります。
Kerasに出会ったことで、ニューラルネットの層をブロックのように積み上げるだけで、それなりのネットワークが組めるようになりました。

より高度なモデルを構築し、しっかり理解した上でチューニングしていく上で各種理論、知識は必要だと思います。ただしこの記事の主眼は、まずはKaggleをはじめてみる、というところです。
多くの人が感じている、AIの構築は難しくてスタートラインにすら立てないという課題を、Kerasが大幅にハードルを下げてくれていると言っていいと思います。

2.3. ハイパラ芸人

こうなると、ハイパーパラメーター(ニューラルネットの層の組み方や、細かいパラメーター)の色々な組み合わせを試行錯誤できるようになります。私はその裏にある理論を理解しているわけではないので、どうしても行き当たりばったりの試行錯誤になります。

ここのパラメーターをちょっと大きくしたらどうなるかな?小さくしたら?
ここにこんな層を増やしたらどうなるかな?

といった具合です。
しかしながらこの3か月という長いコンペの中で色々と試していくうちに、ニューラルネットの気持ちのようなものがぼんやりつかめてきました。ここをこうすれば、(理屈はよくわからないけれど)だいたいこうなるんじゃないか?といった感じです。で、これがなんとなく当たるようになってきます。

これが一部で言われる「ハイパーパラメーター芸人」というやつで、どちらかというと悪い意味で使われる言葉だと理解しています。データの分析やモデルの再構築をせず、パラメーターだけをいじって改善を目指している状態を指します。
しかしながら、私としては最初はこれでいいんじゃないかと思っています。精度が上がれば楽しいし、なんだかんだいって、いろいろいじっていると、こうしたらこうなるんじゃないか?という感覚が少しずつでてくるんです。結果として、無駄にはならないと今でも感じています。

私はとにかく楽しむことが大事だと思っています。まずは自分自身で見つけたハイパーパラメーターでスコアアップを経験して、この楽しさを経験してほしいと思います。

2.4. Discussionは全部読む

実はこの段階で意外と悪くない位置につくことができていました。大きな要因として

Discussionを全部読む
重要そうな公開Codeを追う

というのを日常的に行っていました。その中で発見した重要そうな情報は、
自分のモデルにどんどん組み込み、日々改善をしました。

Discussionをすべて読む方法については、Discussionの全トピックをFollowする機能があるので、ONにしておけば、何かしら投稿があるとメールが来るようになります。

画像7

こうしておくと見逃すことなく、すべてに目を通すことができます。Codeにはこういった機能はありませんが、時折Filterの Recently Run でソートして見るなどすると、重要なCodeを見逃さずに済みます。

せっかく順位があがってきたことで、初心者であるにも関わらず、もっとスコアをあげたいというが出てきました。コンペで勝ちたいのであれば、人と違うことをしなければ・・・という思いがあり、初心者なりに工夫した結果、その後一気に金圏までスコアが伸びました。

2.5. 抜きんでるためには、人と違うことが必要

私のソリューションの中で一番効いたのは、Stackingの結果を更にStacking元の予測結果とアンサンブルしたことでした。(興味のある方、コードはこちらです)

Stackingとは、複数のモデルによるそれぞれの予測結果を、また別のモデルに入力して新たに予測を行う方法です。またアンサンブルは、平易に言えば、複数のモデルの予測結果をすべて足して割るようなものです。

このStackingによって得られた予測結果を、Stackingに投入した値と、更にアンサンブルしたんです。
直感的に効くはずもないとは思ったんですが、これでスコアが大幅に伸び、結果、これがこのまま金メダルに強烈に貢献しました。

画像9

Stacking結果のアンサンブルは、実は自分の中で不安で仕方なかったです。調べてもそんなことしている記事は見つけられないし、初心者がこんなにスコアがあげられるはずがないと思ったからです。
つまり、オーバーフィットした状態だと思っていました。あまりに不安になったので、discussionに投稿もしました。

オーバーフィットとは、あるモデルが学習用のデータセットのことはよく理解しているけれど、本来予測したいテスト用のデータセットとなると予測があたらない、という状態をいいます。

今考えてみれば、Stackingの結果をアンサンブルが効いたのは、MoAは目的変数が206もあったことが要因だと思っています。例えば3モデルStackingしただけでも、618の説明変数を与えることになります。これらの相互作用がStackingにおいてより独自の結果を生み出し、アンサンブルに寄与したのかもしれません。

結論

コンペの波にもまれることで、様々な情報がガンガン入ってくるようになります。決して容易ではありませんが、必死に食らいついていくことで、自分自身ができることが増えていっていることが、日々実感できるはずです。
是非、コンペに参加してみてください!

最後に

現時点の私はまだまだ足りないところがたくさんあります。

理論面がまだまだ弱い
可視化が思ったようにできない
PyTorchでかけない

などなど。あげだしたらキリがありません。
例えばPyTorchでTensorをゴリゴリまわしているようなCodeを見てもよくわかりません。しかしコンペで上位に来る方はたいていこのような感じであり、Kerasおまかせで大勝利!と、そうは問屋が卸さないという話です。

この記事を読んでくださっている方の中には、似たようなことを感じておられる方もいらっしゃるのではないでしょうか?
あれが足りない、これが足りない。Kaggleはなんだかハードル高そう、そもそも数学、英語できないし・・・時点時点で自分が感じる自分自身の課題は変わっていくものだと思います。

私のように、あれもできないこれもできないと思っている方でも、まずはやってみると良いよ!と言いたいです。Kaggleは暖かいコミュニティーであり、CodeやDiscussionを見ながら進めば、できないものではありません。まずはコンペに参加し、自分に課題を感じた時、自分の課題に向き合い、次に進んでいけば良いのだと思います。
共にがんばっていきましょう!

おまけ 英語が苦手だと思っている方へ

大丈夫です。全部テキストなので、自動翻訳でいけます。そもそもKaggleに参加している方の大半はネイティブではありません。なので、英語がカタコトでも、みんな理解しようとしてくれます。完璧な英語なんか必要ありません。使ってしまえばへっちゃらです!

おまけ2

ここまで読んでいただいてありがとうございます。色々と自分なりの思いを書きました。文章は得意なほうではないので、よくわからない部分もあったかと思います。何か質問などあれば、Twitterのほうに、お気軽にDMください。
※どうやらFF外の方からDMが受け取れない状態になっていました。設定を変えたので、これでいつでも受け付けられるはずです。

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