u++の備忘録

仮説と可視化から新しい特徴量を作る Kaggleのタイタニックを例に

本記事では、Kaggleのタイタニックを例に、仮説と可視化から新しい特徴量を作る過程についてまとめます。

仮説と可視化から新しい特徴量を作る

予測精度に寄与する新しい特徴量を作成するに当たっては、仮説と可視化を繰り返す過程が大事です。

f:id:upura:20181025151115p:plain

  • 予測精度に寄与しそうな仮説を立てる
  • 可視化を実施する
    • 予測精度に寄与する仮説を見つけるため
    • 仮説が正しいかを検証するため

個々人や問題によって、どちらが起点になるかが変わってきます。

ケース1)ドメイン知識がある場合

例えば自分が詳しい、つまりドメイン知識を持っている分野の問題に取り組む場合、最初から仮説がいくつかあると思います。その場合は仮説を検証するような可視化を実施し、本当に予測精度に寄与するかを確認します。その可視化の結果によっては、改めて仮説を立てることになるかもしれません。

ケース2)ドメイン知識がない場合

ドメイン知識がない場合は、まずは仮説を立てるための探索的なデータ分析を実施することになるでしょう。いろいろな軸でデータを眺め、予測精度に寄与しそうな仮説を立てるのが目的になります。

Kaggleのタイタニックを題材にした具体例

ここではKaggleのタイタニックを題材に、具体例を示します。

コードの全容は、KaggleのKernelで公開しました。
Feature Generation by Genetic Programming | Kaggle

Kaggleのタイタニック

Kaggleのタイタニックとは、Kaggleのチュートリアル的な問題として認知度の高いコンペティションです。タイタニック号の乗客の属性情報(性別・年齢・チケットの種類など)から、生存したか否かを予測します。
Titanic: Machine Learning from Disaster | Kaggle

仮説と可視化

ここでは探索的なデータ分析を実施した結果、ぼんやりと「一緒に乗船した家族の人数が多い方が、生存率が低そうだ」という仮説が得られた状況を考えます。

仮説が得られたので、次はこの仮説を検証するための可視化に移ります。

新しい行「Family_Size」を作り、その大きさごとに生存したか否かを棒グラフにしました。

  • Survived == 0: 死亡
  • Survived == 1: 生存
data['Family_Size'] = data['Parch'] + data['SibSp'] + 1
train['Family_Size'] = data['Family_Size'][:len(train)]
test['Family_Size'] = data['Family_Size'][len(train):]

import matplotlib.pyplot as plt
import seaborn as sns
sns.countplot(x='Family_Size', data = train, hue = 'Survived')

f:id:upura:20181025152803p:plain

ここでFamily_Size >= 5の場合、死亡が生存を上回っており、生存率が低いことが分かります。

「一緒に乗船した家族の人数が多い方が、生存率が低そうだ」という(ぼんやりとした)仮説が、可視化を通じて、「Family_Size >= 5の場合、生存率が低いので、この特徴量は予測精度に寄与しそうだ」という確信を持った仮説に変わりました。

今回の「Family_Size」のように仮説に基づいたいろいろな集計軸で分析をして可視化してみて、予測精度に寄与しそうな集計軸か否かを確認するというのは、有効なアプローチだと思います。

更に今回、可視化を通じて、それまで持っていなかった仮説(情報)を得ることもできました。

「Family_Size == 1」の人が圧倒的に多く、かつ生存率が低いということです。

この「Family_Size == 1」であるという特徴量も予測精度に寄与しそうなので、下記のように新しく「IsAlone」という特徴量を作成しました。

data['IsAlone'] = 0
data.loc[data['Family_Size'] == 1, 'IsAlone'] = 1

train['IsAlone'] = data['IsAlone'][:len(train)]
test['IsAlone'] = data['IsAlone'][len(train):]

予測精度の比較

「Family_Size」と「IsAlone」を加えた場合の方が予測精度が高い結果となりました。(今回乱数を固定していないので、再実行した場合に多少の誤差は発生します)

「Family_Size」と「IsAlone」を加えていない場合

f:id:upura:20181025154109p:plain

「Family_Size」のみを加えた場合

f:id:upura:20181025210424p:plain

「Family_Size」と「IsAlone」を加えた場合

f:id:upura:20181025154119p:plain

「IsAlone」は一見「Family_Size」に包含されているようなので精度向上の効果はないかと思いましたが、今回の場合は多少の影響があるようでした。

(「Family_Size」よりも明示的に生存率が低い場合を示した効果かもしれませんが、詳細な検証はしていません)

おわりに

本記事では、Kaggleのタイタニックを例に、仮説と可視化から新しい特徴量を作る過程についてまとめました。

「どうやってKaggleを進めていけばよいか分からない」という方に、少しでもお役に立てれば幸いです。

[追記 20181025 21:00]
「Family_Size」のみを加えた場合の予測精度を追記しました。