Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

Kerasでkaggleの問題を解いてみた

先日、Kerasについてまとめてみました。
elsammit-beginnerblg.hatenablog.com

今回はKerasを用いてkaggleで掲載されている問題を解いてみたいと思います!!
解いていく問題ですが、
 ・Titanic - Machine Learning from Disaster
 ・Otto Group Product Classification
の2種類です。



■Titanic - Machine Learning from Disasterを解いてみる

まずはTitanic - Machine Learning from Disasterです。
学習のためのデータ準備ですが、以前記載したこちらの方法を流用しています。
elsammit-beginnerblg.hatenablog.com


コードはこちら。

from keras import models
from keras import layers
import tensorflow as tf
from sklearn import datasets
from keras.models import Sequential
from keras.layers import Dense, Activation
from matplotlib import pyplot

#訓練データとテストデータの分割
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(features_two, target, test_size=0.2)

#モデルの定義
model = models.Sequential()
model.add(layers.Dense(64, activation="relu", input_shape=(7, )))
model.add(layers.Dropout(0.2))
model.add(layers.Dense(64, activation="relu"))
model.add(layers.Dropout(0.2))
model.add(layers.Dense(1, activation="sigmoid"))

#モデルの構築
model.compile(loss='binary_crossentropy',optimizer='rmsprop',metrics=['accuracy'])

#学習の実行
history = model.fit(X_train.astype(np.float32),y_train,epochs=200)

#エポック毎のaccuracy結果グラフ化
pyplot.plot(history.history['accuracy'])
pyplot.title('model accuracy')
pyplot.ylabel('accuracy')
pyplot.xlabel('epoch')
pyplot.legend(['train', 'test'], loc='upper left')
pyplot.show()

#評価の実行
score = model.evaluate(X_test.astype(np.float32),y_test,batch_size=1)
print(score[0])
print(score[1])

基本的には前回記載したように入力層-隠れ層(中間層)-出力層の順番にモデルを作成し、
学習を行っていく流れになります。

ただし今回は、dropoutを導入しより精度の高い評価を目指してみました。

dropoutとは、、、
隠れ層(中間層)のノードを一定の割合で不活性化することを言います。
不活性化は、教師データを用いて学習する際、中間層の一部ノードを以降の学習に使用しないことを言います。
dropoutを用いることで、機械学習の推定精度の向上が見込めるといわれております。

理由はこちらに詳しくまとめられておりますが、
dropoutさせるノードはランダムに決められるため、それぞれ少しづつ異なる教師データを使用して学習します。
これにより疑似的にはなりますが、ディープラーニングを作り出せるため、精度が高くなるということです。
https://aizine.ai/keras-dropout0706/#toc1

エポック数は200とし、実際に先ほどのコードを実行してみました。
結果、各エポック毎のaccuracyをグラフに表すとこちらの通りになりました。
f:id:Elsammit:20210406221729p:plain

200エポックでaccuracyが0.8250になりました。
こちらの学習結果からテストデータで評価を実行した結果、

loss:0.4950
accuracy:0.8156

となりました。
こちらの学習結果を用いて、Submitしてみた結果、、、
スコアは0.775!!
前回も解いたのですがその時の成績は、自分で頑張って0.53、他者のコードを流用して0.73でした。
この時と比較すると改善しております!!
Good!!

■Otto Group Product Classification

こちらもデータの準備は以前記載した方法で準備しました。
elsammit-beginnerblg.hatenablog.com

Kerasを用いたコードはこちら。

import keras
from keras import models
from keras import layers
import tensorflow as tf
from sklearn import datasets
from keras.models import Sequential
from keras.layers import Dense, Activation
from matplotlib import pyplot
 
#モデルの定義
model = Sequential()
model.add(Dense(186,input_dim=93))
model.add(Activation('relu'))
model.add(layers.Dropout(0.5))
model.add(Dense(units=186))
model.add(Activation('relu'))
model.add(layers.Dropout(0.5))
model.add(Dense(units=186))
model.add(Activation('relu'))
model.add(layers.Dropout(0.5))
model.add(Dense(units=9))
model.add(Activation('softmax'))

#モデルの構築
model.compile(loss='sparse_categorical_crossentropy',optimizer='sgd',metrics=['accuracy'])
 
#学習の実行
history = model.fit(X_train, y_train,epochs=100)
 
pyplot.plot(history.history['accuracy'])
pyplot.title('model accuracy')
pyplot.ylabel('accuracy')
pyplot.xlabel('epoch')
pyplot.legend(['train', 'test'], loc='upper left')
pyplot.show()
    
#評価の実行
score = model.evaluate(X_test,y_test,batch_size=1)
print(score[0])
print(score[1])

こちらも先ほどのTitanicと同様に、dropoutを用いて精度を上げております。
また、隠れ層を3層ほど組み合わせてモデルを作成してみました。

ではエポック数100で実行してみます。
結果はこちら
f:id:Elsammit:20210406221650p:plain
accuracyが0.7947で0.8にかなり近づいています。

ではテストデータを用いて評価を行ってみます。
結果は、

loss:0.5220
accuracy:0.7957

でした。
以前記載した方法ですと、
RandomForestですとlossは0.604、
xgboostでlossが0.481
でした。
RandomForestよりは精度高いですが、xgboostより精度が低い結果になりました。

エポック数やdropout率を変えればもう少し精度上がるかもしれないですが、、、
試しに動かしただけにしてはまぁまぁな結果。

■最後に

Kerasで動かしてみましたが結構良い結果が得られて満足。
しかしながら、時間が掛かりますね。
Otto Group Product Classificationですと、先ほどのコードを実行するだけで数分かかってしまいます。
よりデータが複雑になるともっと時間がかかってしまいます。。。
その点では他の学習方法の方がよさそうですね。