kaggleコンペに参加してみました(その4)

Keepdata株式会社 kaggle担当 開発Divの瀧田です。

今回もkaggleのコンペに参加した感想です。

その1
その2
その3

今回もモデルを更に改善したお話をさせて頂こうと思います。

これまでやったこと

その1~その3を経てモデル作成までにやったことは次の6つの事です。

  1. 欠損値に対する処理を行う。
    前回は年齢を例に出しましたが、それ以外にも運賃データなども欠損値がある為、
    チケットのクラスの平均値で補間を行なっています。 

  2. 機械学習ライブラリに適用するために、文字列データを数値データに変換する。
    今回利用しているscikit-learnという機械学習用ライブラリでは、
    数値データしか扱うことが出来ない為、文字データを他の数値データに変換しています。

  3. 学習に利用しないデータを削除する。
    学習に利用しなかった列の情報は、学習を行う前に削除しました。

  4. 欠損値の補間方法の変更
    1で行なった年齢の欠損値の補間方法を見直し、
    全体の平均ではなくチケットのクラス毎の平均年齢で補間をしました。

  5. 連続した数値データの離散化によるカテゴリ変数化
    年齢データをそのまま利用するのではなく、年代ごとにカテゴリ変数化しました、

  6. 特徴量の見直し
    特徴量としての重要度が低かった子供や親の人数と、配偶者や兄弟の有無のデータから、
    同乗者が居たかどうかを示す新たな特徴量として利用しました。

今回のやっていくこと

今回は更にモデルの改良をするために次の2つのことを行います。

  1. ダミー変数で置換した乗船した港の情報の利用方法の模索
  2. ランダムフォレストのハイパーパラメータの最適化

1. ダミー変数で置換した乗船した港の情報の利用方法の模索

さて、今まで乗船した港の情報はダミー変数で置換し、
そのまま学習データとして利用していました。
どうにかして乗船した港の情報を利用出来ないか考えるために、
タイタニック号が沈没するまでの歴史的背景を調べて見ます。

タイタニック号は1912年4月10日にイギリスのサウサンプトン(港S)を出航し、
1912年4月10日フランスのシェルブール(港C)に寄港した後、
1912年4月11日にアイルランドのクイーンズタウン(港Q)に寄港しました。
その4日後の1912年4月15日、アメリカのニューヨークへの航海の途中、
氷山にぶつかり沈没します。

ここで、各港毎に生存割合を出してみると以下のようになります。

港C:0.553571
港Q:0.389610
港S:0.336957

港Cが最も生存率が高いことがわかります。
また、乗船した港毎にチケットのクラスを調べてみたところ、
港Cは1等クラスのチケットの乗客が最も多く、
港Qや港Sは3等クラスの乗客が最も多いことがわかりました。
特に、港Qから乗り込んだ乗客は、ニューヨークへ移民する開拓者が多かったようで、
金銭的にあまり余裕のある人たちではなかったようです。

というわけで、乗船した港毎に数値に変換して新たに特徴量として利用しました。
この特徴量を採用して学習したところ、0.76から0.77までスコアが伸びました。

2. ランダムフォレストのハイパーパラメータの最適化

今までランダムフォレストで学習する際に、特にハイパーパラメータは変更せず、
そのままの状態で学習させていました。
ハイパーパラメータを最適化することで、より良いモデルが作成出来ることが
期待できます。そこでハイパーパラメータの最適化によく使われる方法である、
グリッドサーチを行いパラメータの最適化を施します。
グリッドサーチは、自分が決めた各パラメータの範囲の全ての組み合わせを試し、
最も精度が良い組み合わせを採用する方法です。
例えば、学習に利用する特徴量の数や、決定木の数や深さをどこまで作るかなど、
自分でいくつか指定します。
scikit-learnのライブラリのGridSearchCVクラスを使えば簡単に探すことが
出来ますが、パラメータを指定し過ぎると探すのに時間が掛かります。

ハイパーパラメータ最適化をちょっと試した結果、
0.77から0.79までスコアが上がりました。
ハイパーパラメータ最適化をより丁寧に行えばスコアは更に伸びそうです。

まとめ

乗船した港の情報を見直して利用し、更にハイパーパラメータの
最適化をすることで、スコアが0.76から0.79程度まで伸びました。

ちなみに、コンペの順位は今回で6413位から2492位まで上がりました。
なんと順位が4000近くも上がりました。驚きですね。

他の方の分析を見ていると、まだまだ考察が甘い部分も多く、
今後もよりスコアを伸ばす余地がありそうです。
機械学習は単純にデータを眺めるだけでなく、
そのデータに基づく事実や推論を色々立てる必要があり、
調べていくうちに興味深い事実を知ることもあって面白いです。
また、勉強し始めたばかりで間違いもあるかと思いますが、
引き続き勉強して、より良いモデルを作って行きたいです。
とりあえず上位5%を目指します!

以上です。