Kaggle/Titanicにおける、努力ごとの寄与比較


モチベーション

ネットでKaggle/Titanicで調べると、色々な人が色々な手法/操作を公開してくれている(感謝)。けれども、それらがどれくらいらの効果を発揮してくれるのかがいまいち分からなかった。そういうわけで、調べました。

結論

まず結論から。

  • 前処理系だと、Nameから派生する特徴量は効果が高いように見える
  • 機械学習手法系だと、XGBoostが強い
  • でも、アンサンブルはもっと強い

今回試した手法/操作による精度への寄与は下記の通り。ちなみに、下記のものを全て適応/Submitすると、スコアは0.80861で960位(/10584位-20181216現在)でした。

前処理系

  • 既存特徴量の削除
    • PassengerId: +3.4pt
    • Ticket: +4.2pt
  • 新規特徴量の追加
    • Title: +5.8pt
    • Family_Name: +5.1pt
    • Is_Alone: +2.6pt
    • Family_Size: +3.5pt
  • (参考)
    • 上記全部乗せ: +7.1pt

手法系

  • ランダムフォレスト: 0.0pt(基準値)
    • グリッドサーチ(n_estimatorsのみ): +6.6pt
  • SVM: -1.3pt
    • グリッドサーチ: 未実施
  • XGBoost: +5.7pt
    • グリッドサーチ(n_estimatorsのみ): +6.1pt
  • NN: +2.5pt
    • グリッドサーチ(hidden_layer_sizesのみ): +4.5pt
  • アンサンブル(SVM除く上記3つの多数決): +4.6pt
    • グリッドサーチ: +6.3pt

考察

①頭を使わずに機械学習手法を変えるだけで、あるいは②グリッドサーチを用いてパラメータを変えるだけで精度が大きく向上したように見える。そのため、EDAや前処理は後回しでも良いと考えられる。もちろん、前処理による精度向上も馬鹿にはならないけれども、時間効率からすると上記①②の方が優れている。
機会学習の理想として、「特に何も考えずにデータをブチ込めば、それっぽい結果が返ってくる」というものがあると思っている。前述の方針は、この考え方とも整合性が取れている。

付録

前提条件

  • データを読み込みランダムフォレストに突っ込むだけのシンプルな機械学習を基本とし、そこから条件を1つ1つ変えていった際の値の変化を寄与と定義する。
    • ここでの値とは、3分割交差検証の平均値とする。
    • 複数条件を変えての確認は行わず、あくまで基本の形から1手法/1操作のみを変更し、それらを比較するものとする(組合せを全部調べるのはしんどいので)。
    • ただしここで、Cabinの値だけは事前に処理を加えて置くこととする(そうしないと、計算量が多くなりすぎ、時間がかかるので)。
    • RandomForest等のrandom_stateは1固定
  • 新規特徴量を追加した際には、作成元となった特徴量は操作から除外することとする。
    • Title, Famili_Name: Nameを除外
    • IsAlone, Family_Number: SibSp, Parchを除外
  • 欠損値は下記の方法で事前に埋めておくこととする(項目名後の括弧内は欠損値の数)。
    • Fare(1): 平均値(欠損値が少ない(全データの0.08%)のでテキトー)
    • Embarked(2): 最頻値(欠損値が少ない(全データの0.2%)のでテキトー)
    • Age(263): ランダムフォレストを用いて他の特徴料から穴埋め
    • Cabin(1014): ランダムフォレストを用いて他の特徴料から穴埋め
  • Kaggle上のNotebook利用を前提とする
  • メモ:SibSpはSiblings(兄弟姉妹)/Spouses(夫婦)の意味(つまりほぼ同年代)、ParchはParents/Childrenの意味(つまりそこそこ歳が離れている)。なぜParChでないのかは謎。

TODO

  • もっと色々な機械学習手法・グリッドサーチを試す
  • 前処理が後工程の機械学習に与える影響の大きさを確かめる
  • 精度を上げることに関して、前処理・機械学習手法以外に他の要素がないかを探す
  • LightGBMを使えるようになる
  • Jupyter NotebookがOneNote的な使い方をできるように頑張る
  • (優先度低) EDA・前処理についてお勉強する