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をグラフに表すとこちらの通りになりました。
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で実行してみます。
結果はこちら
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ですと、先ほどのコードを実行するだけで数分かかってしまいます。
よりデータが複雑になるともっと時間がかかってしまいます。。。
その点では他の学習方法の方がよさそうですね。