Titanicの生存者予測を通して、Kaggleの流れを体験してみた

Kaggle
Nishipy
Kaggleを本格的に始めてみようと思い、
おなじみのTitanicチュートリアルをやってみました。
実際にやっていたのは数ヶ月前ですが、備忘録として書いておきます。

1. はじめに

1.1. Kaggleとは

Kaggleとは、データ分析コンぺです。Twitterに強い人がたくさんいます。

Kaggleは企業や研究者がデータを投稿し、世界中の統計家やデータ分析家がその最適モデルを競い合う、予測モデリング及び分析手法関連プラットフォーム及びその運営会社である。 モデル作成にクラウドソーシング手法が採用される理由としては、いかなる予測モデリング課題には無数の戦略が適用可能であり、どの分析手法が最も効果的であるか事前に把握することは不可能であることに拠る。 2017年3月8日、GoogleはKaggle社を買収すると発表した。[Wikipedia]

1.2. 今回やること

Kaggle初心者がやるチュートリアルのようなコンペに参加します。
Titanic号の生存者を予測するモデルを作ります。詳細はこちら。

Titanic - Machine Learning from Disaster | Kaggle
Start here! Predict survival on the Titanic and get familiar with ML basics

2. データセットを眺める

2.1. データの概要

では早速、コンペに参加してみます。与えられたデータの変数は、以下の通りです。
survivalを予測するのが目標です。

Variable Definition Key
Survival Survival 0 = No, 1 = Yes
Pclass Ticket class 1 = 1st, 2 = 2nd, 3 = 3rd
Sex Sex
Age Age in years
SibSp # of siblings / spouses aboard the Titanic
Parch # of parents / children aboard the Titanic
Ticket Ticket number
Fare Passenger fare
Cabin Cabin number
Embarked Port of Embarkation C = Cherbourg, Q = Queenstown, S = Southampton

詳しい説明を、以下に抜粋しておきます。

  • Pclass: A proxy for socio-economic status (SES)
    1st = Upper
    2nd = Middle
    3rd = Lower

  • Age: Age is fractional if less than 1. If the age is estimated, is it in the form of xx.5

  • SibSp: The dataset defines family relations in this way…
    Sibling = brother, sister, stepbrother, stepsister
    Spouse = husband, wife (mistresses and fiancés were ignored)

  • Parch: The dataset defines family relations in this way…
    Parent = mother, father
    Child = daughter, son, stepdaughter, stepson
    Some children travelled only with a nanny, therefore parch=0 for them.


2.2. データの確認

モジュールのインポート

使いそうなモジュールはインポートしておきます。

データの読み込み

trainデータセットと、testデータセットを読み込みます。

trainデータセットの確認

trainデータセットについて、さらに確認します。

データの考察

Titanicで生存できたか否かに効きそうなパラメータについて、確認していきます。

例えば、性別ごとの生存率を確認したい場合は、以下のようにしました。
女性の方が助かりやすかったことがわかります。

社会的地位(Pclass)や乗船した港(Embarked)も、生存できたか否かに影響しそうです。


データの基本統計量

DataFrameに対して、describe()すれば、基本統計量を見ることができます。
平均や分散、四分位数などを確認できます。

質的データについては、describe(include=['O'])とします。

データの可視化

以下のように、データを可視化するのが特に有効なようです。
Google先生に聞けば、良い記事がたくさん出てくるので、そちらを参照ください。。


3. データの前処理

予測モデルを構築するために、データの前処理を行います。

3.1. 特徴量を排除する

与えられた特徴量のうち、欠損値が多いものや、扱いにくそうなものを排除します。
今回は、TicketとCabinをdropしました。

3.2. 単純な前処理

Age

欠損値に対する処理を行います。今回は、Medianで置き換えます。

また、グラフでの可視化から、年齢層ごとに生存率がかなり違いそうでした。
そこで、Ageについては、年齢の数値ではなく、年齢層ごとにカテゴリー分けすることにしました。

Sex

いま特徴量Sexには、maleかfemaleが入っています。
それぞれ、’0’と’1’が対応するようにmapし、ダミー変数とします。

Embarked

まず、欠損値に対する処理を行います。
事前に調べたところ、’S’がもっとも多いので、欠損値をこの値で置き換えます。

さらに、Sexと同様にダミー変数とします。


3.3. 少し苦労した前処理

Name

Nameも扱いにくい特徴量のため、dropすることを検討しましたが、
有名なKernelを調べたところ以下のようにカテゴリー分けすると使えそうです。勉強になります。

まず、頭についている敬称(?)により、新たな特徴量Titleを作ります。

次に敬称でカテゴリー分けし、mapしてダミー変数とします。Nameはもう不要なので、dropします。

Fare

まず、欠損値をMedianで埋めます。

最初はこのまま予測モデルを作っていましたが、スコアがよくありませんでした。
そこで、Kernelを参考にして、Fareについてもカテゴリー分けすることにしました。
四分位数を考慮して、Fareをカテゴリ分けします。

3.4. 新たな特徴量’isAlone’の追加

一緒に乗船した家族の有無が、生存率に影響しそうです。
そこで、isAloneという特徴量を追加してみます。

4. モデルの構築と予測データ提出

4.1. データの準備

訓練データとテストデータ

訓練用のデータと正解ラベル、テスト用のデータもを準備します。

スケール変換

スケール変換して、データの範囲を揃えます。
ここでは、sklearn.preprocessing.MinMaxScalerによって、[0,1]区間に入るように変換します。


4.2. 学習と予測

モデル構築と学習

今回は、ランダムフォレストsklearn.ensemble.RandomForestClassifierを用います。

予測

上で学習したモデルを用いて、テストデータの生存可否について予測します。

Submit

csvファイルとして出力した予測データを、Kaggleのwebページから提出します。

これまで説明してきた手順だと、Scoreは0.82くらいだったと思います。
以上で、Kagglerとして押さえておくべき一連の流れを経験できたと思います。

5. 最後に

5.1. 今回できたこと

  • データ取得から予測、提出までを経験しました。
  • Kaggleの入口に立ちました
  • Kernelがよい教材であることがわかりました

5.2. これからやりたいこと

  • 物怖じせず、コンペに参加します

以上

コメント