Проблема, с которой мы имеем дело, называется переоснащением.
Прежде всего, убедитесь, что ваши входные данные правильно очищены. Один из принципов машинного обучения: «Мусор на входе, мусор на выходе». Затем необходимо сбалансировать сбор данных, например, на 400 тыс. Положительных и 400 тыс. Отрицательных записей. По порядку набор данных должен быть разделен на набор обучения, тестирования и проверки (60%: 20%: 20%), например, с использованием библиотеки scikit-learn, как в следующем примере:
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.2)
Тогда я бы использовал другую архитектуру нейронной сети и попытался бы оптимизировать параметры.
Лично я бы предложил использовать двухслойную нейронную сеть LSTM или комбинацию сверточной и рекуррентной нейронной сети (более быстрые и читающие статьи, которые дают лучшие результаты).
1) 2-х слойный LSTM:
model = Sequential()
model.add(emb_layer)
model.add(LSTM(64, dropout=0.5, recurrent_dropout=0.5, return_sequences=True)
model.add(LSTM(64, dropout=0.5, recurrent_dropout=0.5))
model.add(Dense(2))
model.add(Activation(‘sigmoid’))
Вы можете попробовать использовать 2 слоя с 64 скрытыми нейронами, добавив параметр recurrent_dropout.
Основная причина, по которой мы используем сигмовидную функцию, заключается в том, что она существует между (от 0 до 1). Поэтому он особенно используется для моделей, в которых мы должны предсказать вероятность как выходной сигнал. Поскольку вероятность чего-либо существует только в диапазоне от 0 до 1, сигмоид является правильным выбором.
2) CNN + LSTM
model = Sequential()
model.add(emb_layer)
model.add(Convolution1D(32, 3, padding=’same’))
model.add(Activation(‘relu’))
model.add(MaxPool1D(pool_size=2))
model.add(Dropout(0.5))
model.add(LSTM(32, dropout(0.5, recurrent_dropout=0.5, return_sequences=True))
model.add(LSTM(64, dropout(0.5, recurrent_dropout=0.5))
model.add(Dense(2))
model.add(Activation(‘sigmoid’))
Вы можете попробовать использовать комбинацию CNN и RNN. В этой архитектуре модель учится быстрее (до 5 раз быстрее).
Тогда в обоих случаях вам нужно применить оптимизацию, функцию потерь.
Хорошим оптимизатором для обоих случаев является оптимизатор "Адам".
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
На последнем шаге мы проверяем нашу сеть на наборе проверки.
Кроме того, мы используем обратный вызов, который остановит процесс обучения в сети, если, например, в течение еще 3 итераций не произойдет изменений в точности классификации.
from keras.callbacks import EarlyStopping
early_stopping = EarlyStopping(patience=3)
model.fit(X_train, y_train, epochs=100, batch_size=32, validation_data=(X_val, y_val), callbacks=[early_stopping])
Мы также можем контролировать переоснащение с помощью графиков. Если вы хотите узнать, как это сделать, отметьте здесь .
Если вам нужна дополнительная помощь, дайте мне знать в комментарии.