Используя нейронную сеть и метки с горячим кодированием (легитимные, фаззеры, анализ, бэкдоры и т. Д.), Я пытаюсь классифицировать сетевые соединения. Исходный набор данных включает 2 540 047 соединений и их классификацию. Я удалил IP-адреса и порты из исходного набора данных. Данные обучения: 2100000, данные проверки 220000, данные тестирования 220 047
Оригинал:
srcip,sport,dstip,dsport,proto,state,dur,sbytes,dbytes,sttl,dttl,sloss,dloss,service,Sload,Dload,Spkts,Dpkts,swin,dwin,stcpb,dtcpb,smeansz,dmeansz,trans_depth,res_bdy_len,Sjit,Djit,Stime,Ltime,Sintpkt,Dintpkt,tcprtt,synack,ackdat,is_sm_ips_ports,ct_state_ttl,ct_flw_http_mthd,is_ftp_login,ct_ftp_cmd,ct_srv_src,ct_srv_dst,ct_dst_ltm,ct_src_ltm,ct_src_dport_ltm,ct_dst_sport_ltm,ct_dst_src_ltm,attack_cat,Label
59.166.0.0,1390,149.171.126.6,53,udp,CON,0.001055,132,164,31,29,0,0,dns,500473.9375,621800.9375,2,2,0,0,0,0,66,82,0,0,0,0,1421927414,1421927414,0.017,0.013,0,0,0,0,0,0,0,0,3,7,1,3,1,1,1,,0
Обработано (IP-адреса и порты удаляются, любая строка подвергается CRC32 и конвертируется в float) :
proto,state,dur,sbytes,dbytes,sttl,dttl,sloss,dloss,service,Sload,Dload,Spkts,Dpkts,swin,dwin,stcpb,dtcpb,smeansz,dmeansz,trans_depth,res_bdy_len,Sjit,Djit,Stime,Ltime,Sintpkt,Dintpkt,tcprtt,synack,ackdat,is_sm_ips_ports,ct_state_ttl,ct_flw_http_mthd,is_ftp_login,ct_ftp_cmd,ct_srv_src,ct_srv_dst,ct_dst_ltm,ct_src_ltm,ct_src_dport_ltm,ct_dst_sport_ltm,ct_dst_src_ltm,attack_cat,Label
0.9880321151576936,0.4183477065525949,0.001055,132,164,31,29,0,0,0.5114419611636549,500473.9375,621800.9375,2,2,0,0,0,0,66,82,0,0,0,0,1421927414,1421927414,0.017,0.013,0,0,0,0,0,0,0,0,3,7,1,3,1,1,1,,0
train_data[0]:
[9.8803210e-01 4.1834772e-01 1.0550000e-03 1.3200000e+02 1.6400000e+02
3.1000000e+01 2.9000000e+01 0.0000000e+00 0.0000000e+00 5.1144195e-01
5.0047394e+05 6.2180094e+05 2.0000000e+00 2.0000000e+00 0.0000000e+00
0.0000000e+00 0.0000000e+00 0.0000000e+00 6.6000000e+01 8.2000000e+01
0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 1.4219274e+09
1.4219274e+09 1.7000001e-02 1.3000000e-02 0.0000000e+00 0.0000000e+00
0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00
0.0000000e+00 3.0000000e+00 7.0000000e+00 1.0000000e+00 3.0000000e+00
1.0000000e+00 1.0000000e+00 1.0000000e+00]
train_labels[0]:
[1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
Модель, которую я пытаюсь обучить, выглядит так:
model = models.Sequential()
model.add(layers.BatchNormalization())
model.add(layers.Dense(160, activation='relu', input_shape=(len(train_data[0]),)))
model.add(layers.Dropout(0.2))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dropout(0.2))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
model.compile(optimizer=optimizers.Adam(learning_rate=0.01), loss=losses.categorical_crossentropy, metrics=[metrics.accuracy])
history = model.fit(train_data, train_labels, batch_size=256, epochs=100, callbacks=callbacks_list, validation_data=(validation_data, validation_labels))
Однако результат мне кажется странным. Некоторые прогнозы имеют 100% точность. Это прогноз модели после 3-й эпохи - 96,3% на данных тестирования (данные, которые никогда не видели нейронная сеть).
[1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[4.2333316e-02 5.8378032e-03 5.7929559e-03 7.0942775e-03 1.6567650e-01
6.4145941e-01 1.5754247e-02 1.1445084e-01 1.0187953e-03 5.8192987e-04]
[0.29578227 0.4866582 0.0014564 0.00338989 0.02311182 0.09311022
0.0637349 0.02357885 0.00857235 0.0006052 ]
[0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]
[1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
Это лучшая точность, которую я получил до сих пор. Наверняка я что-то не так делаю ...
EDIT1: Ссылка на код обработки