knaka Tech-Blog

AI, IoT, DIYエレクトロニクス, データサイエンスについて投稿予定です。

ディープラーニングで、kaggle タイタニック問題に挑戦(2) ネットワーク層数の変更


index:

概要

以前の DL版タイタニック問題の関連となり。
ニュラルネットワークのネットワーク層数を増やして、テストしてみました。

環境

python : 3.5.2
numpy
pandas
keras : 2.1.3

テストは、google colab など

学習データ

kaggle の上記ページから、
前回と同様の
学習データ等を、コピーします。


train.csv
test.csv


・目的変数:
 Survived :生存したかどうか。
testデータは、Survivedが、含まれないので注意です。

・説明変数:
年齢、性別など

コード

・ネットワークの層
隠れ層; 5
入力: 1
出力: 1
=> 7層のネットワーク

ニューロンの数
入力: 5(説明変数 の数)
隠れ層:各 100
出力層:1

import sys, os
sys.path.append(os.pardir)  # 親ディレクトリのファイルをインポートするための設定
import numpy as np
import numpy.random as random
import scipy as sp
from pandas import Series, DataFrame
import pandas as pd
import time

import matplotlib.pyplot as plt
from optimizer import SGD, Adam
from multi_layer_net_extend import MultiLayerNetExtend
from keras.utils import np_utils

#
def get_subData(src ):
    sub=src
    sub["Age"] = src["Age"].fillna( src["Age"].median())
    sub = sub.dropna()
    sub["Embark_flg"] = sub["Embarked"]
    sub["Embark_flg"] = sub["Embark_flg"].map(lambda x: str(x).replace('C', '0') )    
    sub["Embark_flg"] = sub["Embark_flg"].map(lambda x: str(x).replace('Q', '1') )
    sub["Embark_flg"] = sub["Embark_flg"].map(lambda x: str(x).replace('S', '2') )
    sub.groupby("Embark_flg").size()
    # convert, num
    sub = sub.assign( Embark_flg=pd.to_numeric( sub.Embark_flg ))
    sub["Sex_flg"] = sub["Sex"].map(lambda x: 0 if x =='female' else 1)    
    return sub

# 標準化対応、学習。
# 学習データ
train_data = pd.read_csv("train.csv" )
test_data = pd.read_csv("test.csv" )
print( train_data.shape )
#print( train_data.head() )
#
# 前処理 ,欠損データ 中央値で置き換える
train2  = train_data[["PassengerId","Survived","Sex","Age" , "Embarked" ,"SibSp" ,"Parch" ]]
test2   = test_data[ ["PassengerId"           ,"Sex","Age" , "Embarked" ,"SibSp" ,"Parch" ]]
#
age_mid=train2["Age"].median()
#print(age_mid )
print(train2.info() )
print(train2.head(10 ) )
#train2 = train2.dropna()
#train2["Embark_flg"] = train2["Embarked"].map(lambda x: str(x).replace('C', '0') )

train_sub =get_subData(train2 )
test_sub =get_subData(test2 )
print(train_sub.info() )
print(test_sub.info() )
#quit()

# 説明変数と目的変数
x_train= train_sub[["Sex_flg","Age" , "Embark_flg" ,"SibSp" ,"Parch" ]]
y_train= train_sub['Survived']
x_test = test_sub[["Sex_flg","Age" , "Embark_flg" ,"SibSp" ,"Parch" ]]

#conv
num_max_y=10
colmax_x =x_train[ "Age" ].max()
#x_train = x_train / colmax_x
#print(x_train[: 10 ])
#quit()

#print("#check-df")
#col_name="Age"
#print(x_train[ col_name ].max() )
#print(x_train[ col_name ].min() )
#quit()
#np
x_train = np.array(x_train, dtype = np.float32).reshape(len(x_train), 5)
y_train = np.array(y_train, dtype = np.float32).reshape(len(y_train), 1)
#正解ラベルをOne-Hot表現に変換
#y_train = y_train / num_max_y
#x_test  = x_test / num_max_y
y_train=np_utils.to_categorical(y_train, 2)
#
# 学習データとテストデータに分ける
print(x_train.shape, y_train.shape )
print(x_test.shape  )

# train
max_epochs = 50
#train_size = 3000
train_size = x_train.shape[ 0]
batch_size = 100
learning_rate = 0.01
iters_num = 10 * 1000   # 繰り返しの回数を適宜設定する    
#iter_per_epoch = max(train_size / batch_size, 1)
iter_per_epoch = 1000
print(iter_per_epoch )
#weight_init_std="relu"
weight_init_std="sigmoid"
#quit()


# train
global_start_time = time.time()
#
network = MultiLayerNetExtend(input_size=5
                                , hidden_size_list= [100, 100, 100, 100, 100] , output_size=2, 
                                weight_init_std=weight_init_std, use_batchnorm=True)
optimizer = SGD(lr=learning_rate)
#    hidden_size_list=[10, 10, 10, 10, 10 ]
bn_train_acc_list = []    
epoch_cnt = 0

for i in range(iters_num):        
    batch_mask = np.random.choice(train_size, batch_size)
    x_batch = x_train[batch_mask]
    y_batch = y_train[batch_mask]
    #
    grads = network.gradient(x_batch, y_batch)
    optimizer.update( network.params, grads)

    if i % iter_per_epoch == 0:
        bn_train_acc = network.accuracy(x_train, y_train)
        bn_train_acc_list.append(bn_train_acc)
        print("epoch:" + str(epoch_cnt) + " | "  + " acc: " + str(bn_train_acc))
        epoch_cnt += 1
# pred
pred =network.predict(x_train)

考察

学習、繰り返し数を増やすと
train acc(正解率) は、 約89%まで上昇しましたが、
テストデータの、精度は前回より、低下しました。。


f:id:knaka0209:20181230132546p:plain

*)改善方法を、検討したいと思います。