Борьба с переобучением с помощью dropout
Одна из распространённых проблем нейронных сетей — склонность к переобучению на обучающих данных. Это означает, что метрика качества, например R\(^2\) или точность, оказывается высокой на обучающей выборке, но низкой на тестовой и валидационной, — то есть модель подстраивается под шум в данных.
Справиться с переобучением помогает метод прореживания (dropout). Во время обучения он случайным образом отключает часть нейронов, не позволяя сети «запоминать» шум в обучающих данных. В keras для этого предусмотрен слой Dropout. Нужно задать коэффициент прореживания — долю соединений, которые отключаются в процессе обучения. Это десятичное число от 0 до 1, которое передаётся в Dropout().
Для этой модели мы вернёмся к функции потерь среднеквадратической ошибки.
Это упражнение является частью курса
Машинное обучение для финансов на Python
Инструкции к упражнению
- Добавьте слой прореживания (
Dropout()) после первого слоя Dense в модели и задайте коэффициент прореживания 20% (0.2). - При компиляции модели в
.compile()используйте оптимизаторadamи функцию потерьmse. - Обучите модель на
scaled_train_featuresиtrain_targetsв течение 25 эпох.
Интерактивное практическое упражнение
Попробуйте выполнить это упражнение, дополнив этот пример кода.
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()