Проблема недообучения в двоичной классификации с использованием многослойного персептрона

В настоящее время я разрабатываю контролируемое обнаружение аномалий с помощью многослойного персептрона (MLP), цель которого состоит в том, чтобы классифицировать безопасный и вредоносный трафик. Я использовал набор данных CTU-13, образец набора данных выглядит следующим образом: Пример набора данных. Набор данных содержит 169032 безопасных трафика и 143828 вредоносных. Код для моей модели MLP выглядит следующим образом:

def MLP_model():
model = Sequential()
model.add(Dense(1024,input_dim=15, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(256,activation='relu'))
model.add(Dense(256,activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(128,activation='relu'))
model.add(Dense(128,activation='relu'))
model.add(Dense(1, activation='sigmoid'))

adam = optimizers.Adam(lr=0.0001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)

model.compile(optimizer = adam, loss='binary_crossentropy', metrics=['accuracy'])
return model    

model = MLP_model()

#With Callbacks
callbacks = [EarlyStopping('val_loss', patience=5)]
hist = model.fit(Xtrain, Ytrain, epochs=50, batch_size=50, validation_split=0.20, callbacks=callbacks, verbose=1)

Результаты, которые я получил, следующие:

Accuracy: 0.923045
Precision: 0.999158
Recall: 0.833308
F1 score: 0.908728

Однако, судя по кривой обучения, я подозреваю, что модель не соответствует требованиям (на основе эта статья): Кривая обучения модели

Я попытался увеличить нейроны и количество слоев (как было предложено здесь), но та же проблема все еще возникает. Я ценю любую помощь в решении этой проблемы.


person benynugraha    schedule 19.06.2020    source источник
comment
можете поделиться подробностями? ваша проблема кажется более переоснащенной, потому что ваша потеря проверки намного выше, чем потеря поезда. поэтому я бы фактически уменьшил количество нейронов в 4 раза. Кроме того, вы масштабировали свой ввод между 0 и 1?   -  person Nicolas Gervais    schedule 19.06.2020


Ответы (2)


Прежде всего, я почти уверен, что ваша модель на самом деле переоснащает, а не недообучает. Постройте только потери при обучении, и вы должны увидеть, что потери близки к 0. Но, как вы можете видеть на вашем графике, потери при проверке все еще довольно высоки по сравнению с потерями при обучении. Это происходит потому, что ваша модель имеет слишком много параметров по сравнению с количеством точек данных, которые есть в вашем наборе обучающих данных.

Я бы порекомендовал уменьшить размеры плотного слоя до двузначных/трехзначных цифр.

person Priyatham    schedule 19.06.2020
comment
Привет, я пытался уменьшить размер плотного слоя до 16-64, но потери при проверке все еще высоки, и да, я согласен с вами, это переоснащение. Я пытался также использовать ранний обратный вызов, но значение отзыва все еще ниже 90%. - person benynugraha; 23.06.2020

Попробуйте уменьшить отсев до диапазона от 0,1 до 0,3, это должно помочь этой неустойчивой кривой. Кроме того, тренируйтесь еще несколько эпох, эта гладкая кривая обычно получается, когда вы тренируетесь в течение большего количества эпох.

person Abhishek Verma    schedule 19.06.2020
comment
Здравствуйте, попробовал уменьшить отсев до 0,1-0,3, но кривая похожая, и при увеличении эпохи увеличивается потеря валидации (да, это переобучение). - person benynugraha; 23.06.2020