Поиск аномалий в данных с Python

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

Большое количество аномалий не только пагубно влияет на многие бизнес-модели, но еще может затруднить машинное обучение или вовсе исказить его результаты. Вот почему их важно обнаруживать и работать с ними.

В этой статье я расскажу о методах и инструментах для поиска аномалий в данных с использованием Python. Мы рассмотрим различные подходы, включая статистические методы, машинное обучение и глубокое обучение.

Что такое аномалии в данных?

Аномалии в данных — это значения, которые значительно отклоняются от нормального порядка вещей. Если это трафик сайта, то это неестественные скачки вверх и вниз, если это банковские транзакции, то снятие крупных сумм клиентом, который никогда так не делал.

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

Типы аномалий

Существует несколько типов аномалий, которые можно обнаружить в данных:

  • Точечные аномалии: Это отдельные точки данных, которые значительно отличаются от остальных. Например, если средняя температура в городе составляет 20°C, а один из замеров показывает 40°C, это может быть точечной аномалией;
  • Контекстуальные аномалии: Это аномалии, которые зависят от контекста. Например, температура 25°C может быть нормальной летом, но аномальной зимой;
  • Коллективные аномалии: Это аномалии, которые проявляются в группе данных. Например, если в течение нескольких дней подряд температура резко падает, это может быть коллективной аномалией.

Основные методы поиска аномалий

Ознакомившись с терминологией аномалий, давайте рассмотрим некоторые из основных методов их обнаружения.

Метод Z-оценки

Одним из самых простых методов поиска аномалий является метод Z-оценки. Этот метод основан на предположении, что собранные данные имеют обычное, нормальное (колоколобразное) распределение.

Z-оценка показывает, на сколько стандартных отклонений точка данных отклоняется от среднего значения. Если Z-оценка точки данных превышает определенный порог (обычно 3 или -3), эту точку можно считать аномалией.

Формула для расчета Z-оценки выглядит следующим образом:

Z = (X − μ) / σ

где:

  • X — значение данных;
  • μ — среднее значение;
  • σ — стандартное отклонение.

Вот как можно выявить аномалии таким способом используя Python:

import numpy as np

data = np.array([10, 12, 14, 16, 18, 20, 22, 24, 26, 28])
mean = np.mean(data)
std_dev = np.std(data)

z_scores = (data - mean) / std_dev
print(z_scores)

Метод IQR (Interquartile Range)

Другой простой метод — это метод IQR (межквартильный размах). Этот метод также основан на закономерностях распределении данных и часто используется для обнаружения выбросов.

IQR — это разница между 75-м и 25-м процентилями данных. Точки данных, которые лежат за пределами интервала [Q1 – 1.5 * IQR, Q3 + 1.5 * IQR], считаются аномалиями.

Формула для расчета IQR выглядит следующим образом:

IQR = Q3 − Q1

где:

  • Q1 — первый квартиль;
  • Q3 — третий квартиль.

Вот как можно обнаружить аномалии с помощью IQR:

import numpy as np

data = np.array([10, 12, 14, 16, 18, 20, 22, 24, 26, 28])
Q1 = np.percentile(data, 25)
Q3 = np.percentile(data, 75)
IQR = Q3 - Q1

lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

anomalies = [x for x in data if x < lower_bound or x > upper_bound]
print(anomalies)

Машинное обучение для поиска аномалий

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

Метод Isolation Forest

Isolation Forest — это алгоритм, который использует деревья решений для выявления аномалий. Он основан на идее, что аномалии легче изолировать, чем нормальные значения.

Читайте также:  Анализ акций Tesla с помощью Python

Пример кода на Python:

from sklearn.ensemble import IsolationForest
import numpy as np

data = np.array([[10, 12], [14, 16], [18, 20], [22, 24], [26, 28], [30, 32], [34, 36], [38, 40], [42, 44], [46, 48]])

model = IsolationForest(contamination=0.1)
model.fit(data)

predictions = model.predict(data)
anomalies = data[predictions == -1]
print(anomalies)

Метод One-Class SVM

One-Class SVM — это метод, который использует поддерживающие векторы для выявления аномалий. Он строит модель, которая описывает нормальные данные, и затем ищет значения, которые не соответствуют этой модели.

Пример кода на Python:

from sklearn import svm
import numpy as np

data = np.array([[10, 12], [14, 16], [18, 20], [22, 24], [26, 28], [30, 32], [34, 36], [38, 40], [42, 44], [46, 48]])

model = svm.OneClassSVM(nu=0.1, kernel="rbf", gamma=0.1)
model.fit(data)

predictions = model.predict(data)
anomalies = data[predictions == -1]
print(anomalies)

Метод DBSCAN

DBSCAN (Density-Based Spatial Clustering of Applications with Noise) – это алгоритм кластеризации, который также может использоваться для поиска аномалий. Он основан на плотности данных и может обнаруживать аномалии, которые изолированы от основных кластеров.

DBSCAN работает, определяя точки данных, которые находятся в области с низкой плотностью, как и аномалии. Вот как это работает:

from sklearn.cluster import DBSCAN
import numpy as np

# Пример данных
data = np.array([[10, 12], [12, 12], [13, 12], [12, 11], [14, 13], [13, 15], [10, 10], [1000, 1000]])

# Применение DBSCAN
db = DBSCAN(eps=3, min_samples=2).fit(data)

# Поиск аномалий
anomalies = data[db.labels_ == -1]

print("Аномалии:", anomalies)

Глубокое обучение для поиска аномалий

Технологии deep learning предоставляют еще более мощные инструменты для поиска аномальных данных. Эти методы машинного обучения могут учитывать сложные зависимости и структуры в данных, а также работать с большими объемами данных.

Автоэнкодеры

Автоэнкодеры — это нейронные сети, которые используются для сжатия и восстановления данных. Они работают сжимая данные в низкоразмерное представление и затем восстанавливают их. Аномалии обычно имеют более высокую ошибку восстановления, что позволяет их легко идентифицировать от нормальных, естественных значений.

Вот как можно обнаружить аномалии с помощью автоэнкодеров на Python:

import numpy as np
from keras.models import Model, Sequential
from keras.layers import Input, Dense

data = np.array([[10, 12], [14, 16], [18, 20], [22, 24], [26, 28], [30, 32], [34, 36], [38, 40], [42, 44], [46, 48]])

input_dim = data.shape[1]
encoding_dim = 2

input_layer = Input(shape=(input_dim,))
encoder = Dense(encoding_dim, activation='relu')(input_layer)
decoder = Dense(input_dim, activation='sigmoid')(encoder)

autoencoder = Model(inputs=input_layer, outputs=decoder)
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')

autoencoder.fit(data, data, epochs=50, batch_size=1, shuffle=True)

predictions = autoencoder.predict(data)
reconstruction_error = np.mean(np.abs(predictions - data), axis=1)
threshold = np.mean(reconstruction_error) + np.std(reconstruction_error)

anomalies = data[reconstruction_error > threshold]
print(anomalies)

Рекуррентные нейронные сети (RNN)

RNN сети хорошо работают с анализом последовательностей и могут быть эффективно использованы для выявления аномалий в временных рядах. Такие сети обычно хорошо улавливают временные зависимости и структуры в данных.

Вот как можно реализовать подвид RNN сети – LSTM для обнаружения аномалий:

import numpy as np
from keras.models import Sequential
from keras.layers import LSTM, Dense

data = np.array([[10, 12], [14, 16], [18, 20], [22, 24], [26, 28], [30, 32], [34, 36], [38, 40], [42, 44], [46, 48]])

model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(data.shape[1], 1)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')

model.fit(data, data, epochs=50, batch_size=1, shuffle=True)

predictions = model.predict(data)
reconstruction_error = np.mean(np.abs(predictions - data), axis=1)
threshold = np.mean(reconstruction_error) + np.std(reconstruction_error)

anomalies = data[reconstruction_error > threshold]
print(anomalies)

Эффект от обнаружения аномалий для разных сфер бизнеса

Теперь, когда мы рассмотрели различные методы поиска аномалий, давайте обсудим, как эти методы могут быть применены в реальном мире.

Финансовый мониторинг

В финансовом секторе аномалии могут указывать на мошеннические транзакции. Например, если клиент внезапно начинает совершать транзакции на большие суммы в разных странах, это может быть признаком мошенничества.

Используя методы, описанные выше, банки могут автоматически обнаруживать такие аномалии и принимать меры.

Медицинская диагностика

В медицине аномалии могут указывать на заболевания. Например, аномалии в электрокардиограмме могут указывать на сердечные заболевания.

Используя методы машинного обучения, врачи могут автоматически обнаруживать такие аномалии и принимать более быстрые решения о лечении.

Читайте также:  Прогнозирование временных рядов с помощью N-HITS, N-BEATS

Производство

В производстве аномалии могут указывать на проблемы с оборудованием. Например, если датчики температуры внезапно начинают показывать аномальные значения, это может указывать на неисправность оборудования.

Используя методы поиска аномалий, инженеры могут быстро обнаруживать такие проблемы и предотвращать поломки.

Кибербезопасность

Тут самый частый пример – обнаружение аномальных сетевых активностей, которые могут указывать на атаки на сайты и приложения. Своевременное обнаружение таких аномалий позволит защитить сервер и работоспособность организации в онлайн.

Примеры кода обнаружения аномалий

Пример №1: Поиск аномалий в финансах: Снятие нетипично больших сумм денег клиентом

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

Шаг 1: Подготовка данных

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

import pandas as pd
import numpy as np

# Пример данных
data = {
'client_id': [1, 1, 1, 2, 2, 2, 3, 3, 3],
'amount': [100, 150, 200, 50, 100, 150, 5000, 100, 150],
'date': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-01', '2023-01-02', '2023-01-03', '2023-01-01', '2023-01-02', '2023-01-03']
}

df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'])

print(df)

Шаг 2: Анализ данных

Прежде чем применять методы машинного обучения, давайте проанализируем данные, чтобы понять, какие транзакции могут быть аномальными. Мы можем начать с расчета средней суммы снятия для каждого клиента.

# Расчет средней суммы снятия для каждого клиента
average_amounts = df.groupby('client_id')['amount'].mean().reset_index()
average_amounts.rename(columns={'amount': 'average_amount'}, inplace=True)

# Объединение данных
df = df.merge(average_amounts, on='client_id')

print(df)

Шаг 3: Определение аномалий

Теперь, когда у нас есть средняя сумма снятия для каждого клиента, мы можем определить аномалии. Мы будем считать транзакцию аномальной, если сумма снятия превышает среднюю сумму более чем в три раза.

# Определение аномалий
df['is_anomaly'] = df['amount'] > 3 * df['average_amount']

print(df)

Шаг 4: Визуализация аномалий

Для лучшего понимания, давайте визуализируем аномалии на графике.

import matplotlib.pyplot as plt
import seaborn as sns

# Визуализация данных
plt.figure(figsize=(10, 6))
sns.scatterplot(x='date', y='amount', hue='is_anomaly', data=df, palette='viridis')
plt.title('Снятие денег клиентами')
plt.xlabel('Дата')
plt.ylabel('Сумма снятия')
plt.show()

Шаг 5: Использование Isolation Forest для обнаружения аномалий

Теперь давайте применим более продвинутый метод — Isolation Forest, чтобы обнаружить аномалии. Isolation Forest работает, изолируя аномалии, которые редки и отличаются от остальных данных.

from sklearn.ensemble import IsolationForest

# Подготовка данных для Isolation Forest
X = df[['amount']]

# Применение Isolation Forest
model = IsolationForest(contamination=0.1)
model.fit(X)

# Предсказание аномалий
df['isolation_anomaly'] = model.predict(X)
df['isolation_anomaly'] = df['isolation_anomaly'].apply(lambda x: 'Anomaly' if x == -1 else 'Normal')

print(df)

Шаг 6: Визуализация результатов Isolation Forest

Давайте также визуализируем результаты.

# Визуализация данных с Isolation Forest
plt.figure(figsize=(10, 6))
sns.scatterplot(x='date', y='amount', hue='isolation_anomaly', data=df, palette='viridis')
plt.title('Снятие денег клиентами с использованием Isolation Forest')
plt.xlabel('Дата')
plt.ylabel('Сумма снятия')
plt.show()

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

Пример №2: Поиск аномалий в сетевом трафике сервера

Аномалии в сетевом трафике могут указывать на потенциальные атаки, такие как DDoS-атаки, вторжения или другие нетипичные активности. Давайте рассмотрим пример, как можно использовать методы машинного обучения для обнаружения таких аномалий с помощью Python.

Шаг 1: Подготовка данных

Для начала, нам нужно подготовить данные. Предположим, у нас есть набор данных, содержащий информацию о сетевом трафике, включая IP-адреса источника и назначения, тип протокола, размер пакета и время.

import pandas as pd
import numpy as np

# Пример данных
data = {
'src_ip': ['192.168.1.1', '192.168.1.2', '192.168.1.3', '192.168.1.4', '192.168.1.5', '192.168.1.6', '192.168.1.7', '192.168.1.8', '192.168.1.9'],
'dst_ip': ['192.168.1.10', '192.168.1.10', '192.168.1.10', '192.168.1.10', '192.168.1.10', '192.168.1.10', '192.168.1.10', '192.168.1.10', '192.168.1.10'],
'protocol': ['TCP', 'TCP', 'UDP', 'TCP', 'UDP', 'TCP', 'UDP', 'TCP', 'UDP'],
'packet_size': [100, 150, 200, 50, 100, 150, 5000, 100, 150],
'time': ['2023-01-01 10:00', '2023-01-01 10:01', '2023-01-01 10:02', '2023-01-01 10:03', '2023-01-01 10:04', '2023-01-01 10:05', '2023-01-01 10:06', '2023-01-01 10:07', '2023-01-01 10:08']
}

df = pd.DataFrame(data)
df['time'] = pd.to_datetime(df['time'])

print(df)

Шаг 2: Анализ данных

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

# Расчет среднего размера пакета
average_packet_size = df['packet_size'].mean()

print(f"Средний размер пакета: {average_packet_size}")

Шаг 3: Определение аномалий

Теперь, когда у нас есть средний размер пакета, мы можем определить аномалии. Мы будем считать пакет аномальным, если его размер превышает средний размер более чем в три раза.

# Определение аномалий
df['is_anomaly'] = df['packet_size'] > 3 * average_packet_size

print(df)

Шаг 4: Визуализация аномалий

Для лучшего понимания, давайте визуализируем аномалии на графике.

import matplotlib.pyplot as plt
import seaborn as sns

# Визуализация данных
plt.figure(figsize=(10, 6))
sns.scatterplot(x='time', y='packet_size', hue='is_anomaly', data=df, palette='viridis')
plt.title('Сетевой трафик сервера')
plt.xlabel('Время')
plt.ylabel('Размер пакета')
plt.show()

Шаг 5: Использование Isolation Forest для обнаружения аномалий

Теперь давайте применим более продвинутый метод — Isolation Forest, чтобы обнаружить аномалии. Данный метод машинного обучения изолирует аномалии, которые встречаются редко и отличаются от остальных данных.

from sklearn.ensemble import IsolationForest

# Подготовка данных для Isolation Forest
X = df[['packet_size']]

# Применение Isolation Forest
model = IsolationForest(contamination=0.1)
model.fit(X)

# Предсказание аномалий
df['isolation_anomaly'] = model.predict(X)
df['isolation_anomaly'] = df['isolation_anomaly'].apply(lambda x: 'Anomaly' if x == -1 else 'Normal')

print(df)

Шаг 6: Визуализация результатов Isolation Forest

Давайте также визуализируем результаты.

# Визуализация данных с Isolation Forest
plt.figure(figsize=(10, 6))
sns.scatterplot(x='time', y='packet_size', hue='isolation_anomaly', data=df, palette='viridis')
plt.title('Сетевой трафик сервера с использованием Isolation Forest')
plt.xlabel('Время')
plt.ylabel('Размер пакета')
plt.show()

Шаг 7: Использование Autoencoders для обнаружения аномалий

Еще один мощный метод для обнаружения аномалий — это использование автоэнкодеров. Автоэнкодеры сжимают данные в низкоразмерное представление и затем восстанавливают их. Аномальные данные обычно имеют более высокую ошибку восстановления и таким образом выделяются на фоне остальных значений.

import tensorflow as tf
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Dense

# Подготовка данных для Autoencoder
X = df[['packet_size']]

# Создание автоэнкодера
input_dim = X.shape[1]
encoding_dim = 1

input_layer = Input(shape=(input_dim,))
encoder = Dense(encoding_dim, activation="relu")(input_layer)
decoder = Dense(input_dim, activation="sigmoid")(encoder)

autoencoder = Model(input_layer, decoder)
autoencoder.compile(optimizer='adam', loss='mean_squared_error')

# Обучение автоэнкодера
autoencoder.fit(X, X, epochs=50, batch_size=1, shuffle=True)

# Предсказание аномалий
predictions = autoencoder.predict(X)
mse = np.mean(np.power(X - predictions, 2), axis=1)

# Определение порога
threshold = np.percentile(mse, 95)

# Поиск аномалий
df['autoencoder_anomaly'] = mse > threshold
df['autoencoder_anomaly'] = df['autoencoder_anomaly'].apply(lambda x: 'Anomaly' if x else 'Normal')

print(df)

Шаг 8: Визуализация результатов Autoencoder

Давайте также визуализируем результаты этого метода машинного обучения.

# Визуализация данных с Autoencoder
plt.figure(figsize=(10, 6))
sns.scatterplot(x='time', y='packet_size', hue='autoencoder_anomaly', data=df, palette='viridis')
plt.title('Сетевой трафик сервера с использованием Autoencoder')
plt.xlabel('Время')
plt.ylabel('Размер пакета')
plt.show()

В этом примере мы рассмотрели, как можно использовать Python для обнаружения аномалий в сетевом трафике сервера. Мы начали с простого анализа данных и определения аномалий на основе среднего размера пакета, а затем перешли к более продвинутым методам — Isolation Forest и Autoencoder.

Читайте также:  Сглаживание временных рядов и шума в данных с помощью Kalman Filter

Использование таких методов позволяет автоматизировать процесс обнаружения аномалий и быстро реагировать на потенциальные угрозы безопасности. Это может значительно улучшить безопасность сетевых операций и снизить риски для бизнеса.

Заключение

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

В этой статье мы рассмотрели различные методы и инструменты для поиска аномалий с использованием Python, включая статистические методы, машинное обучение и глубокое обучение. Мы также рассмотрели примеры кода и применения этих методов в бизнесе. Надеюсь что данная информация была для вас полезной и вы теперь будете с легкостью обнаруживать аномальные данные в своих исследованиях.