KaggleのTitanicをやってみたよ

問題概要

Titanic: Machine Learning from Disaster

Kaggleの入門用として位置づけられているコンテスト?で、タイタニック号に乗っていた客のデータ(名前、年齢、客室の等級etc)が与えられるのでその生死を予測してくださいねというもの。実際の正解まで書いてある訓練用のデータと、正解は伏せられてるテスト用のデータが与えられるので、テスト用のデータに予測値を書き込んで提出してね、その正解率でスコアが出るよ、という感じです。

やったこと

1. ランダムフォレストの実装

これまでこの問題をやろうと思ってやめるを数か月繰り返してきたので、ランダムフォレストなる手法が有効であることはぼんやり把握していた。でググっていると診断人さんのブログにたどり着いた。

アルゴリズムの懇切丁寧な説明とC++の実装例が載っており、とりあえず自分でも実装してみて雰囲気を掴もうという気持ちになった。同じ言語で書いてもコピペになってしまいそうだったので競プロでよく使っているD言語で書いてみたが、まあ立ち位置的には似てるので結局割とコピペ感が強くなってしまった。

2. 欠損値の補完

ランダムフォレストができたので早速データをぶちこもうとすると、データ欠損の壁が立ちふさがる。この問題では一部項目でたまにデータがない部分があり、これをどうにかしないとちゃんとアルゴリズムを回すことができない。こういう欠損値への対処に関しては一般的にこれをやっておけば全部OKというようなやり方はないようで、都度アドホックなやり方でいい感じにデータを補完していく必要があるらしい(要出典)。この問題では特に年齢情報の欠損が多かったが、これはなんか名前にくっついてる敬称である程度推測可能らしい、ということを以下の記事を見て知った。

今回はとにかくさっき実装したランダムフォレストがちゃんと回るかを確かめたかったので、上の記事をそのまま参考に敬称内の平均年齢で欠損を埋めることにする。あとこまごました欠損があるが雰囲気で補った。

3. 提出

これでデータの体裁が整ったので、ランダムフォレストに投入する。データ数の少なさゆえに一瞬で終わった。早速提出してみたところ、スコア0.79904で約9000チーム中1500位くらいになった。

f:id:fluffyowl:20171113195521p:plain

自分で生み出したものが何もないのでどういう感情を持てばいいのか微妙だが、とりあえずランダムフォレストがちゃんと動いてるっぽいと言えそうな結果になったのは嬉しかった。

感想

競プロ志向が強いせいか、ランダムフォレストを実装しているときが一番楽しかった。まあ正直kaggleにおいてその辺の作業はかなりどうでもいい部分ではあると思うので、今後参加するときはもっと順位に効くところをちゃんとやっていければな~という感じです。とはいえ何かほんとにたくさんの情報がKernelに書き込まれていて、一体上位陣の優位性はどこから生まれているんだ…という疑問はある。ていうかまずは統計をちゃんと勉強しようね…

コード

以下に置きました。