Модель Кераса не предсказывает ожидаемый результат - PullRequest
0 голосов
/ 05 мая 2020

Я строю модель Keras для обнаружения ddos-атак. Я обучил модель иметь коэффициент потерь и точности, как показано ниже, с набором данных с

x_train = [bunch of float values]
# Like below
[6.99757033e-01 5.10532289e-06 7.74600714e-06 ... 2.93996180e-05
  6.57591467e-01 2.34854095e-02]
 [4.99968509e-01 7.93600808e-03 7.93600808e-03 ... 4.99968509e-01
  0.00000000e+00 0.00000000e+00]
 [8.72862575e-01 3.66688893e-06 1.10006668e-05 ... 1.10006668e-05
  2.45681559e-04 2.45681559e-04]
 ...
 [4.99036039e-01 1.37855260e-03 1.37855260e-03 ... 4.99036039e-01
  0.00000000e+00 0.00000000e+00]

y_train = [0 or 1] 1 for ddos, 0 for benign
# Like below:
[[1.]
 [1.]
 [1.]
 ...
 [0.]
 [0.]
 [0.]]
[[1]]

Когда эпоха заканчивается, она дает

2000000/2000000 [==============================] - 22s 11us/step - loss: 0.1930 - accuracy: 0.9381

Однако, когда модель предсказывает входные данные , он должен дать число, близкое к 1, но на самом деле он дает значение, которое почти равно 0. Я не уверен, как он предсказывает неправильные значения, хотя он имеет довольно высокую точность.

Весь мой код выглядит следующим образом:

import numpy as np
import pandas as pd
from sklearn import preprocessing

from keras.models import Sequential

model = Sequential()

from keras.layers import Dense, Dropout
from keras.optimizers import Adam

model.add(Dense(units=64, activation='relu', input_dim=10))  # Input Layer
model.add(Dropout(0.5))

model.add(Dense(units=32, activation='relu'))   # hidden Layer
model.add(Dropout(0.2))

model.add(Dense(units=32, activation='relu'))   # hidden Layer
model.add(Dropout(0.2))

model.add(Dense(units=1, activation='sigmoid'))     # Last Layer for output

model.compile(loss='binary_crossentropy',
              optimizer=Adam(learning_rate=0.001),
              metrics=['accuracy'])

CSV_FILE = "ddos.csv"
df = pd.read_csv(CSV_FILE)
df.loc[(df.Label == "ddos"), "Label"] = 1.
df.loc[(df.Label == "Benign"), "Label"] = 0.
#df=df.dropna(axis="columns", how="any")

# Data set

x_train = np.array(df[["Flow Duration", "Tot Fwd Pkts", "Tot Bwd Pkts", "TotLen Fwd Pkts",
                       "Flow IAT Mean","Flow IAT Std" ,"Flow IAT Max", "Flow IAT Min",
                       "Fwd IAT Tot", "Fwd IAT Mean"]])

x_train = x_train.astype(float)

normalized_x = preprocessing.normalize(x_train)


y_train = np.array(df[["Label"]])
y_train = np.array(y_train, dtype = 'float32')

normalized_y = preprocessing.normalize(y_train)



model.fit(normalized_x, normalized_y, epochs=2, batch_size=128)




x_test = np.array([["3974862.0", "29.0","44.0","86.0" ,"55206.42", "1.954783e+05","1566821.0", "167.0",
                    "3735347", "133405.25"]])  # ddos data

x_test = preprocessing.normalize(x_test)

classes = model.predict(x_test)
threshold_output = np.where(classes > 0.5, 1, 0)
print(threshold_output)

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Ваш набор данных несбалансирован? Возможно, метки ddos ​​в вашем наборе данных редко появляются, и модель этого не узнала. Я думаю, вам следует использовать другие метрики c (например, оценку F1) для оценки и попробовать другую модель машинного обучения, такую ​​как Random Forest, XGboost.

0 голосов
/ 06 мая 2020

Вы можете попробовать выполнить горячую кодировку меток вывода в (0,1) и (1,0) вместо 0 и 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...