kaggleをKerasで初めてみる(Titanic)

最初はとりあえずSubmitするのがいいかも。




Kaggleのアカウントを作成する



以下からKaggleのアカウントを作成する。

https://www.kaggle.com/account/login


自分の場合はSign in with Googleから

Username: 任意の名前
DisplayName: Profileなどに表示される名前


利用規約に同意してアカウント作成




Titanicのデータを使用してKerasでSubmitしてみる



概要


入門としてTitanic: Machine Learning from Disasterが良く用いられているらしい
https://www.kaggle.com/c/titanic/overview

ご丁寧にここから始めてくれと書いてある。
ざっくり説明するとcsvデータからタイタニック号の沈没事故での生存率が高い人の特徴を抽出するという課題。
女性、子供、そして上流階級のような人々のグループが、他の人々よりも生き残る可能性があったらしい。


データ


データは以下からダウンロードできる。
https://www.kaggle.com/c/titanic/data

学習データが892行。テストデータが419行目。ヘッダあり。

csvは以下のようになっている。
PassengerId: ただのID。
Survived: 1が生存
Pclass: チケットクラス。
Name: 名前。生存には関係ない(不要なデータ)と思われる。
Sex: 性別。
Age: 年齢。
SibSp: タイタニック号に乗っている兄弟/配偶者の数。
Parch: タイタニック号に乗っている親/子供の数。
Ticket: チケット番号。Pclassがあれば不要か。
Fare: 運賃。
Cabin: キャビン番号。欠損が多い上に扱いにくい。
Embarked: 乗船港。C =シェルブール、Q =クイーンズタウン、S =サザンプトン。あまり関係ない気がするが。

testにはSurvivedがない。

提出するときのフォーマットは下の方にある。


PassengerId: ただのID。
Survived: 1が生存

のカラムを持つcsv形式で提出する。


開発環境


開発環境はJupyter Notebookがおすすめ。
WindowsならAnaconda経由でインストールするのが簡単。

https://www.anaconda.com/


データを読み込む



import pandas as pd
import numpy as np

# https://www.kaggle.com/c/titanic/data より
train = pd.read_csv("./data/titanic/train.csv")
test = pd.read_csv("./data/titanic/test.csv")

np.random.seed(666)

pandas.read_csv でCSVを読み込むことが出来る。
データ読み込みとは直接関係ないが再現性を担保するためseed値を設定している。


データの確認


train.info()
print("----------------------------------
---------")
print(train.isnull().sum())
print("-------------------------------------------")
print(test.isnull().sum())
print("-------------------------------------------")
train.head()

上から順に学習データの概要、欠損データの確認、先頭5行表示。


不要データ削除 欠損値補完


del train['PassengerId']
del train['Name']
del train['Ticket']
del train['Cabin']
del train['Embarked']

del test['PassengerId']
del test['Name']
del test['Ticket']
del test['Cabin']
del test['Embarked']

# 欠損値を中央値で埋める
train.Age = train.Age.fillna(train.Age.median())
# 0, 1に変換
train.Sex = train.Sex.replace(['male', 'female'], [0, 1])
# train.Embarked = train.Embarked.fillna("S")
# train.Embarked = train.Embarked.replace(['C', 'S', 'Q'], [0, 1, 2])

test.Age = test.Age.fillna(test.Age.median())
test.Sex = test.Sex.replace(['male', 'female'], [0, 1])
# 欠損値を中央値で埋める
test.Fare = test.Fare.fillna(test.Fare.median())
# test.Embarked = test.Embarked.replace(['C', 'S', 'Q'], [0, 1, 2])
train.head()

PassengerId, Name, Ticket, Cabinは不要と判断。
Embarked は私のやり方だと有り無しで差異が見られなかった。
'male', 'female' はそのままだと扱えないので0, 1 へ変更。
欠損値は中央値で埋める。

説明変数と目的変数に分割


import keras
from keras.utils.np_utils import to_categorical
# 説明変数と目的変数に分割
y_train = train["Survived"].values

COLUMNS = ["Pclass", "Sex", "Age", "SibSp", "Parch","Fare"]
x_train = train[COLUMNS].values

x_test = test[COLUMNS].values

お約束のようなコード。

モデルの作成


import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout

# モデル作成 正直適当
model = Sequential()
model.add(Dense(32, input_shape=(len(COLUMNS),), activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(16, activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

model.fit(
    x_train, 
    y_train, 
    epochs=30, 
    batch_size=1, 
    verbose=1)

適当に作った最初のコードが一番性能が良かった。


Submission用のデータ出力


predictions = model.predict(x_test)

# テスト値を再読み込みして,SVMでクラス分類したカラムを追加
df_out = pd.read_csv("./data/titanic/test.csv")
df_out["Survived"] = np.round(predictions).astype(np.int)

# outputディレクトリに出力する
df_out[["PassengerId","Survived"]].to_csv("submission.csv",index=False)

作成したモデルを元にSurvivedを検証。


全体のサンプルコード



全体のソースは以下に上げている。
csvファイルは各自ダウンロードすること。

https://github.com/ninomae-makoto/kaggle/blob/master/titanic01.ipynb



Submitしてスコアを確認


作成したcsvをSubmit Predictions からアップロード。

Describe submissionは投稿の説明のこと。
特に書くこともないので空白。

確認時点では0.76076で8933位。
上位だとScore 1.00で占められているががこれはちょっと違うのでは...



参考



Kernels → Most Votes から人気の解説、コードを確認できる。
https://www.kaggle.com/c/titanic/kernels?sortBy=voteCount&group=everyone&pageSize=20&competitionId=3136


http://kaggler-ja-wiki.herokuapp.com/kaggle%E5%88%9D%E5%BF%83%E8%80%85%E3%82%AC%E3%82%A4%E3%83%89#%E3%82%AA%E3%83%AC%E3%82%AA%E3%83%ACKaggle%E5%85%A5%E9%96%80%E6%96%B9%E6%B3%95
https://qiita.com/taka4sato/items/802c494fdebeaa7f43b7
https://qiita.com/upura/items/3c10ff6fed4e7c3d70f0
https://qiita.com/zenonnp/items/9cbb2860505a32059d89
https://www.rco.recruit.co.jp/career/engineer/blog/kaggle_by_novice_engineer/
https://kaggler-ja-wiki.herokuapp.com/kaggle%E5%88%9D%E5%BF%83%E8%80%85%E3%82%AC%E3%82%A4%E3%83%89
https://codezine.jp/article/detail/11066
https://www.codexa.net/kaggle-titanic-beginner/
https://qiita.com/kousuke-t/items/9367060b6deb956f6245
https://lp-tech.net/articles/0QUUd




2019年7月22日月曜日