Как выбрать подходящие признаки и визуализировать данные так, чтобы алгоритм k-средних мог их кластеризовать?

Вопрос или проблема

Я пока только знакомлюсь с основами машинного обучения и хочу сравнить результаты контролируемого алгоритма (KNN) и неконтролируемого алгоритма (k-means) в контексте выявления сетевых атак типа DOS. Я застрял на том, как мои данные могут быть представлены в алгоритме k-means. В уроках, которые я видел (например, Долгота/Широта), данные удобно отображаются на графике, где можно легко увидеть, как они группируются. В приведенной ссылке используются долгота и широта как точки на графике.

В моих данных есть временная серия, которая указывает, когда был отправлен пакет, и меня интересуют пакеты TCP и UDP. Когда происходит очень высокая частота пакетов за короткий промежуток времени, это свидетельствует о том, что была атака. Я понимаю, что мне нужно преобразовать различные типы пакетов в числовые данные с помощью какого-либо кодирования, но проблема в том, что когда я представляю график, я вижу, как пакеты TCP и UDP из одного временного интервала группируются вместе – это имеет смысл?

Я включил образец данных ниже. В первой таблице атаки нет, но во второй проводится TCP-флуд. Так что вопрос в том, как выбрать подходящие данные и отобразить их так, чтобы алгоритм k-means мог их сгруппировать? Я думаю, что мне нужны функции “Время” и “Протокол”, так как остальные факторы на самом деле не влияют ни на что.

No. Время Источник Назначение Протокол Длина Информация
1 0 213.163.87.149 192.168.12.100 UDP 693 50019 > 55287 Len=651
2 0.009109 213.163.87.149 192.168.12.100 UDP 178 50019 > 55287 Len=136
3 0.03756 192.168.12.100 213.163.87.149 UDP 86 55287 > 50019 Len=44
4 0.040381 213.163.87.149 192.168.12.100 UDP 180 50019 > 55287 Len=138
5 0.040415 213.163.87.149 192.168.12.100 UDP 148 50019 > 55287 Len=106
6 0.051892 213.163.87.149 192.168.12.100 UDP 177 50019 > 55287 Len=135
7 0.066043 213.163.87.149 192.168.12.100 UDP 151 50019 > 55287 Len=109
8 0.068918 192.168.12.206 34.216.113.46 TCP 66 60588 > 443 [ACK] Seq=1 Ack=1 Win=501 Len=0 TSval=1855484038 TSecr=3288649611
9 0.069256 192.168.12.206 34.216.113.46 TCP 66 60576 > 443 [ACK] Seq=1 Ack=1 Win=501 Len=0 TSval=1855484038 TSecr=3288649618
10 0.06932 192.168.12.206 34.216.113.46 TCP 66 60574 > 443 [ACK] Seq=1 Ack=1 Win=501 Len=0 TSval=1855484038 TSecr=3288649615
11 0.070402 213.163.87.149 192.168.12.100 UDP 185 50019 > 55287 Len=143
12 0.088693 192.168.12.100 213.163.87.149 UDP 86 55287 > 50019 Len=44
13 0.089871 213.163.87.149 192.168.12.100 UDP 180 50019 > 55287 Len=138
14 0.095743 52.114.92.64 192.168.12.100 TLSv1.2 388 Application Data
15 0.099751 213.163.87.149 192.168.12.100 UDP 128 50019 > 55287 Len=86
16 0.116736 213.163.87.149 192.168.12.100 UDP 182 50019 > 55287 Len=140
17 0.130674 213.163.87.149 192.168.12.100 UDP 180 50019 > 55287 Len=138
18 0.140124 192.168.12.100 213.163.87.149 UDP 86 55287 > 50019 Len=44
19 0.142975 213.163.87.149 192.168.12.100 UDP 128 50019 > 55287 Len=86
20 0.145032 192.168.12.100 52.114.92.64 TCP 54 51061 > 443 [ACK] Seq=1 Ack=335 Win=258 Len=0
21 0.153861 213.163.87.149 192.168.12.100 UDP 183 50019 > 55287 Len=141
22 0.167646 213.163.87.149 192.168.12.100 UDP 140 50019 > 55287 Len=98
23 0.172693 213.163.87.149 192.168.12.100 UDP 181 50019 > 55287 Len=139
24 0.18827 192.168.12.100 52.114.92.64 TLSv1.2 235 Application Data
432 3.498621 213.163.87.149 192.168.12.100 UDP 200 50019 > 55287 Len=158
433 3.511119 213.163.87.149 192.168.12.100 UDP 184 50019 > 55287 Len=142
434 3.531878 192.168.12.100 213.163.87.149 UDP 86 55287 > 50019 Len=44
435 3.53436 213.163.87.149 192.168.12.100 UDP 181 50019 > 55287 Len=139
436 3.534412 213.163.87.149 192.168.12.100 UDP 197 50019 > 55287 Len=155
437 3.557786 213.163.87.149 192.168.12.100 UDP 185 50019 > 55287 Len=143
438 3.562951 213.163.87.149 192.168.12.100 UDP 320 50019 > 55287 Len=278
439 3.567072 213.163.87.149 192.168.12.100 UDP 178 50019 > 55287 Len=136
440 3.571375 192.168.12.206 192.168.12.131 TCP 74 37964 > 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=241961609 TSecr=0 WS=128
441 3.571607 192.168.12.206 192.168.12.131 TCP 74 37966 > 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=241961609 TSecr=0 WS=128
442 3.571798 192.168.12.206 192.168.12.131 TCP 74 37968 > 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=241961609 TSecr=0 WS=128
443 3.572238 192.168.12.206 192.168.12.131 TCP 74 37970 > 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=241961610 TSecr=0 WS=128
444 3.572498 192.168.12.206 192.168.12.131 TCP 74 37972 > 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=241961610 TSecr=0 WS=128
445 3.573037 192.168.12.131 192.168.12.206 TCP 54 80 > 37964 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0
446 3.573142 192.168.12.131 192.168.12.206 TCP 54 80 > 37966 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0
447 3.573265 192.168.12.131 192.168.12.206 TCP 54 80 > 37968 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0
448 3.573391 192.168.12.131 192.168.12.206 TCP 54 80 > 37970 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0
449 3.574408 192.168.12.131 192.168.12.206 TCP 54 80 > 37972 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0
450 3.574634 192.168.12.206 192.168.12.131 TCP 74 37974 > 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=241961612 TSecr=0 WS=128
451 3.575003 192.168.12.206 192.168.12.131 TCP 74 37976 > 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=241961612 TSecr=0 WS=128
452 3.575606 192.168.12.206 192.168.12.131 TCP 74 37978 > 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=241961612 TSecr=0 WS=128
453 3.575643 192.168.12.206 192.168.12.131 TCP 74 37980 > 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=241961613 TSecr=0 WS=128
454 3.576023 192.168.12.131 192.168.12.206 TCP 54 80 > 37974 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0
455 3.576138 192.168.12.131 192.168.12.206 TCP 54 80 > 37976 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0
456 3.576495 192.168.12.206 192.168.12.131 TCP 74 37982 > 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=241961613 TSecr=0 WS=128
457 3.57701 192.168.12.131 192.168.12.206 TCP 54 80 > 37978 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0

Вам не нужно сначала строить график данных, чтобы применить кластеризацию k-means. Вы можете применить кластеризацию k-means, а затем решить, строить график или нет.

Кластеризация k-means требует метрики расстояния, обычно евклидова расстояния. Евклидово расстояние требует непрерывных признаков. Похоже, что только “Время” и “Длина” являются непрерывными признаками. Остальные признаки необходимо преобразовать в непрерывные или не использовать.

Кластеризация k-means не выполняет выбор признаков. Выбор признаков потребует наличия отдельного алгоритма.

Ответ или решение

Чтобы использовать алгоритм кластеризации k-средних для анализа данных по сетевым атакам (например, на основе частоты отправленных TCP и UDP пакетов), вам необходимо пройти через несколько этапов, включая предварительную обработку данных, выбор соответствующих признаков и визуализацию результатов.

1. Предварительная обработка данных

Прежде всего, вам нужно заранее подготовить ваши данные. В данном случае можно выделить следующие этапы:

  • Кодирование признаков: Необходимо закодировать категориальные переменные в числовой формат. Для вашего случая это касается признака "Protocol", где TCP и UDP могут быть преобразованы в бинарные (например, 0 для UDP и 1 для TCP).

  • Нормализация/стандартизация данных: Чтобы избежать доминирования признаков, измеряемых в больших диапазонах (например, "Time" и "Length"), стоит нормализовать или стандартизировать ненормированные признаки. Это поможет алгоритму k-средних, так как он основывается на расстояниях. Вы можете использовать StandardScaler или MinMaxScaler из библиотеки sklearn.

2. Выбор признаков

Для использования алгоритма k-средних вам понадобятся числовые, количественные признаки. Исходя из вашего описания данных, наиболее подходящие признаки будут:

  • Time: время отправки пакетов.
  • Length: длина пакетов.

Вы можете также рассмотреть возможность агрегирования данных, например, подсчёт количества пакетов за фиксированный интервал времени (например, за каждую секунду) и построение нового признака – количества пакетов.

3. Подготовка данных для k-средних

После выбора и обработки признаков, создайте матрицу данных, содержащую только выбранные числовые признаки (например, "Time" и "Length"). Этот массив будет передан в алгоритм k-средних.

import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans

# Пример загрузки данных
data = pd.read_csv("your_data.csv")
data['Protocol'] = data['Protocol'].map({'UDP': 0, 'TCP': 1})

# Выбор и нормализация признаков
X = data[['Time', 'Length']]
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# Применение k-средних
kmeans = KMeans(n_clusters=2)  # Задайте количество кластеров (в зависимости от вашей задачи)
kmeans.fit(X_scaled)
data['Cluster'] = kmeans.labels_

4. Визуализация данных и кластеров

Для визуализации данных, можно использовать библиотеку matplotlib или seaborn. Чтобы увидеть, как кластеры распределяются, можно построить график разброса.

import matplotlib.pyplot as plt

# Визуализация кластеров
plt.figure(figsize=(10, 6))
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=data['Cluster'], cmap='viridis')
plt.title('Clustering of Network Packets with k-means')
plt.xlabel('Normalized Time')
plt.ylabel('Normalized Length')
plt.colorbar(label='Cluster')
plt.show()

Выводы

  • Для применения алгоритма k-средних выбранные вами признаки "Time" и "Length" являются подходящими, и их можно нормализовать.
  • Алгоритм k-средних не требует предварительной визуализации данных; визуализация выполняется на этапе анализа результатов.
  • Замечание о том, что k-средние кластеры могут сгруппировать TCP и UDP пакеты: это зависит от определения параметров и их значений в вашей выборке.

Следуя данным шагам, вы сможете эффективно внедрить алгоритм k-средних для кластеризации сетевых данных и выявления возможных атак, таких как DDoS.

Оцените материал
Добавить комментарий

Капча загружается...