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