ディープラーニング実践メモ(Kaggle-Titanic編)

公開日:2018-10-25
最終更新:2018-11-01

自分用のメモとしての役割をメインに、ディープラーニングをやってみたことを書いていきます。

題材

KaggleのTitanicデータをディープラーニングで学習させる

KaggleのTitanicデータは、タイタニックの乗客情報を元に、ある乗客が生きるか死ぬかを判別させるやつです

学習データのcsvはこんな感じ


PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
1,0,3,"Braund, Mr. Owen Harris",male,22,1,0,A/5 21171,7.25,,S
2,1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)",female,38,1,0,PC 
17599,71.2833,C85,C
3,1,3,"Heikkinen, Miss. Laina",female,26,0,0,STON/O2. 3101282,7.925,,S 
4,1,1,"Futrelle, Mrs. Jacques Heath (Lily May Peel)",female,35,1,0,113803,53.1,C123,S

環境

  • Python3
  • TensorFlow
  • Keras

学習データを変えた場合の変化を見てみる

モデル

とりあえず適当に組みました。

   def build_model():
            model = models.Sequential()
            model.add(layers.Dense(8,activation ='relu', input_shape=(2,)))
            model.add(layers.Dense(1,activation='sigmoid'))
            model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['accuracy'])
            return model

学習・評価

k分割交差検証(k=4)で評価

train_targets = df['Survived'].values

k = 4
num_val_samples = len(train_data) // k
num_epochs = 20
all_histories = []
for i in range(k):
    print("Processing fold #",i)
    min_index = i*num_val_samples
    max_index = (i+1)*num_val_samples
    val_data = train_data[min_index:max_index]
    val_targets = train_targets[min_index:max_index]

    partial_train_data = np.concatenate([train_data[:min_index],train_data[max_index:]],axis = 0)
    partial_train_targets = np.concatenate([train_targets[:min_index],train_targets[max_index:]],axis = 0)

    model = build_model()
    history = model.fit(partial_train_data,partial_train_targets,validation_data=(val_data,val_targets),epochs=num_epochs,batch_size=1,verbose=0)
    all_histories.append(history)

性別と年齢データで学習させる

なんとなく相関がありそうな性別と年齢から学習させてみます。

データ処理

年齢はデータに欠けがあったので、平均で埋める その後正規化する 性別はcsvだと文字列なので、0,1に変換

df = pd.read_csv('data/train.csv')
df = df.fillna(df.mean())

train_data = pd.DataFrame(index=[], columns=[])
train_data['Sex'] = df['Sex'].map({'female': 0, 'male': 1})

train_data['Age'] = (df['Age'] - df['Age'].mean()) / df['Age'].std()

       Sex     Age
0      1 -0.592148
1      0  0.638430
2      0 -0.284503
3      0  0.407697
4      1  0.407697

結果

val_scores
[0.8063063063063063, 0.7972972972972973, 0.7522522522522522, 0.7972972972972973]
val_scores_mean
0.7882882882882883

性別と年齢とPclassで学習

データ処理

df = df.fillna(df.mean())
train_data = pd.DataFrame(index=[], columns=[])
train_data['Sex'] = df['Sex'].map({'female': 0, 'male': 1})
train_data['Age'] = (df['Age'] - df['Age'].mean()) / df['Age'].std()
train_data['Pclass'] = df['Pclass']

結果

※modelは下記の部分だけ変更しています model.add(layers.Dense(8,activation ='relu', input_shape=(3,)))

val_scores
[0.8153153153153153, 0.8063063063063063, 0.7567567567567568, 0.8153153153153153]
val_scores_mean
0.7984234234234233

性別,年齢,Pclass,料金で学習

データ処理

df = df.fillna(df.mean())
train_data = pd.DataFrame(index=[], columns=[])
train_data['Sex'] = df['Sex'].map({'female': 0, 'male': 1})
train_data['Age'] = (df['Age'] - df['Age'].mean()) / df['Age'].std()
train_data['Pclass'] = df['Pclass']
train_data['Fare'] = (df['Fare'] - df['Fare'].mean()) / df['Fare'].std()

結果

val_scores
[0.7837837837837838, 0.7927927927927928, 0.7432432432432432, 0.8108108108108109]
val_scores_mean
0.7826576576576577

上がらなくなってきた

参考にさせていただいたリンク

KaggleチュートリアルTitanicで上位3%以内に入るには。(0.82297) - IMACEL Academy -人工知能・画像解析の技術応用に向けて-|LPixel(エルピクセル)

記事が少しでもいいなと思ったらクラップを送ってみよう!
18
+1
@yJbzwnt15phgIOfiの技術ブログ

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする