ドロップアウトによる過学習への対処
ニューラルネットワークでよく見られる問題のひとつが、訓練データへの過学習です。過学習とは、R\(^2\) や正解率などの評価指標が訓練データでは高いにもかかわらず、テストデータや検証データでは低くなる現象で、モデルが訓練データのノイズに過剰に適合してしまっている状態を指します。
この過学習を防ぐ手法のひとつがドロップアウトです。訓練中にランダムにニューロンを無効化することで、モデルがノイズに適合しにくくなります。keras には、この処理を実現する Dropout 層が用意されています。ドロップアウト率(訓練中に切断される接続の割合)を設定する必要があり、Dropout() 層に0から1の間の小数で指定します。
このモデルでは、損失関数として平均二乗誤差(MSE)を使用します。
この演習はコースの一部です
Python による金融のための Machine Learning
演習の手順
- モデルの最初の Dense 層の後にドロップアウト層(
Dropout())を追加し、ドロップアウト率を20%(0.2)に設定しましょう。 .compile()でモデルをコンパイルする際、オプティマイザーにadam、損失関数にmseを指定しましょう。- 25エポックを使って、
scaled_train_featuresとtrain_targetsにモデルを適合させましょう。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
from keras.layers import Dropout
# Create model with dropout
model_3 = Sequential()
model_3.add(Dense(100, input_dim=scaled_train_features.shape[1], activation='relu'))
model_3.add(____)
model_3.add(Dense(20, activation='relu'))
model_3.add(Dense(1, activation='linear'))
# Fit model with mean squared error loss function
model_3.compile(optimizer=____, loss=____)
history = model_3.fit(____, ____, epochs=____)
plt.plot(history.history['loss'])
plt.title('loss:' + str(round(history.history['loss'][-1], 6)))
plt.show()