機略戦記

Maneuver warfare

kaggle初挑戦: タイタニック乗客のプロフィールから生存率をランダムフォレストで予測してみた

この記事はなに?

kaggleというデータサイエンスのコンテストサイトにある、「タイタニック乗客の生存予測」というチュートリアル課題をやってみた記録です。

Rのインストールから初めて、3160チーム中1639位くらいまで行きました。(満足いかねぇ!)

Kaggleってなに

データサイエンスについての新しいWebサービスです。

Kaggleは企業や研究者がデータを投稿し、世界中の統計家やデータ分析家がその最適モデルを競い合う、予測モデリング及び分析手法関連プラットフォーム及びその運営会社である。

Kaggle - Wikipedia

データ分析を依頼したり、その依頼でいかに高い成果を出せるかチーム/個人で競ったりします。 成績上位者には賞金が出たりリクルートが来たりするようです。
また、上位者の分析手法が公開されていたり、フォーラムで課題についての議論がかわされていたりして学習もはかどります。

「タイタニック乗客のプロフィールから生存率を予測」とは

kaggleのチュートリアル課題の一つです。

タイタニック乗客の性別、年齢、名前、チケット番号、支払った運賃、海外に居る子供の数(?)などなどの情報から、その乗客がタイタニック号沈没事故で生き残ったかどうか予想します。

データがおよそ800人分与えられます。
a. 内約400人分には上記のプロフィール情報と共に「生き残ったかどうか」の情報が与えられます。
b. 内約400人分には上記のプロフィール情報だけがあります。「生き残ったかどうか」は不明です。

a.の情報を使って予想モデルを立て、b.の乗客が生き残ったかどうかを予測し、kaggleに送りつけます。するとすぐにスコアリングされて順位がでます。

1日10回まで挑戦する事ができるので試行錯誤しつつ、高い順位を目指していく競技になります。

www.kaggle.com

実際にやったこと

Rのインストール

たぶんデファクトスタンダードであろうRを使って解析する事にします。
Rを使ったことすらないのでまずインストールするところからはじめます。

RとRStudioというのがあるようです。RStudioはRをGUIでラップしたなんか統合開発環境みたいなやつです。

qiita.com

brewとbrew caskで簡単にインストールできました。簡単ですね。 立ち上げると、立ち上がります。

f:id:Shinya_131:20150712142607p:plain

左側がconsoleになっていて、対話的にコードが実行できます。右側はグラフを表示したり、Historyを見たりできます。

とりあえず乱数を入れてサブミットしてみる

Excelで乱数を起こして生存/死亡をランダムに決め、回答としてサブミットしてみました。 これは、分析を行う前に回答のフォーマットを確認したかったからです。

実際回答のフォーマットを勘違いしていた事に気づいたので意味はあったと思います。

さて、結果ですが、約53.1%の正答率で、順位は3160チーム中3148位でした。 悪いですね。当たり前ですね。

f:id:Shinya_131:20150712143000p:plain

人様の実践例を参考にランダムフォレストを使ってみる

このエントリに載っている方法をひと通り試してみました。 やはりランダムフォレストの的中率が一番高いのでこれを使ってみます。

Rの基本的な文法が分からないので、手探りです。

smrmkt.hatenablog.jp

正答率が77.5%まで向上しました。

ランダムフォレストのチューニング

これらのサイトを参考にチューニングを行なっていきます。

smrmkt.hatenablog.jp

shindannin.hatenadiary.com

tjo.hatenablog.com

データを、ランダムフォレストが処理可能な形に変換する

ランダムフォレストがどのようなメカニズムで予測をしているのかはっきり分かっていませんが、「たくさんの決定木を生成して、それらを使って予測をしている」という事は分かりました。

そのことから分かるとおり、ランダムフォレストに与える説明変数は、決定木で処理できるような物でないとダメそうです。
大小関係があるものか、あまり数が多くないカテゴリ(例えば性別のような)じゃないと決定木で処理できません。

例えば、「名前」のような情報は序列も付けられないし、名前そのものはカテゴリでも無いので、説明変数としてランダムフォレストに処理させるのは無理そうです。

しかし、このような情報からも大小関係やカテゴリを取り出してあげれば、ランダムフォレストが処理できるようになります。例えば、名前から「Mr.」「Mrs.」「Don.」などの敬称を取り出せば、カテゴリ変数として使えそうです。

このような説明変数を追加してみました。

  • 敬称

    • 「称号」と言った方が正しいんだろうか。「Mr.」「Mrs.」「Don.」とかそういうやつです。
  • キャビン番号の上3桁

    • キャビン番号の上n桁を取り出すことで、宿泊場所を表すカテゴリ変数として扱う事ができないか試みました。
    • 何桁か試してみたけど3桁が一番良いようです。
    • (ランダムフォレストは各説明変数が目的変数の予測にどれくらい貢献しているか分かる)
  • チケットの番号部分の上2桁

    • データをざーっと眺めていて、上2,3桁に共通する番号を持ったチケットが多い事に気づきました。この部分に、チケットのグレードや、あるいは船内の場所の情報が含まれている事を期待して、追加してみました。
  • チケット番号の重複件数

    • チケット番号はユニークな値では無かった。もしかして、同じ部屋に泊まる人に対して、同じチケット番号が割り当てられているのでは無いだろうか。1人部屋と11人部屋では生存率に違いが出そうなので追加してみた。

書店に行き、Rの参考書を入手

Rの文法がわからなすぎたので、書店にいって参考書をゲットしました。

www.amazon.co.jp

必要なところをつまみ読んでみた感触としては、レビューのこれと大体同意見です。良かった。

.Rを言語として捉えている。統計ツールとして関数だけ紹介する本は少なくないが,入門書で,for文やifelse文,関数の書き方など,いわゆる高級言語としての使い方まで丁寧に解説してあること。

チューニングの結果

  • tuneRFによるランダムフォレストのパラメーターチューニング
  • 説明変数の変換や追加

によって、正答率が78.5%まで上がりました。
…ううう、たったの1%…

上位陣の解析方法を見てみた

  • 正答率80.9%くらいで、成績上位10%に入る。
    • 凄く密集している。きわどい戦いなんだな。
  • 正答率100%の人いるんだけど…
    • なんなの…
  • コード公開してる人は大体どの人もランダムフォレストで解いてる。
  • ファミリーネームを取り出して、重複件数をカウントしている。
    • 同乗している家族の数ということかな? なるほどなー。
  • 未成年者の場合に、親が母親が同伴しているかどうかを推測している人がいた。
    • その発想は無かった。
  • コードがシンプルで読みやすい。意図がよく伝わってくる。

感想

  • 面白い!

得たもの

知らない概念と知識を(「これについて知らない」という情報も含めて)いっぱい得た。単語だけ列挙しておこう。

統計

説明変数、目的変数、訓練データ、次元、ランダムフォレスト、アンサンブル学習、過学習、クロスバリデーション、欠損値、完全に無作為な欠測、無作為な欠測、観測されない説明変数に従属する欠測、MI

政治学方法論 I:欠測値を持つデータと Multiple Imputation

R

package, CRAN, 代入演算子: <-, vector, data.frame, frame$column, merge(), cut(), randomForest(), tuneRF(), factor, character, summary(), vectorとvectorを直接演算できる, write.csv(), NA, NULL, Inf, is.na()