Как можно генерировать аномалии в наборе данных?

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

Я создаю модель TensorFlow для выявления аномалий в данных смарт-метра электроэнергии и использую набор данных UK-DALE. Как я могу ввести аномалии в данные, чтобы протестировать модель?

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

Генерация 10 случайных чисел:

import random
randomlist = []
for i in range(0,10):
    n = random.randint(1,30)
    randomlist.append(n)
print(randomlist)

Сгенерируйте 10 случайных чисел в рамках некоторого временного ряда:

np.random.seed(2019)
N = 10
rng = pd.date_range('2019-01-01', freq='MS', periods=N)
df = pd.DataFrame(np.random.rand(N, 1), columns=  ['readings'], index=rng)

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

Для генерации аномалий в наборе данных, особенно с учетом приложения к данным о потреблении электроэнергии из UK-DALE, можно использовать несколько стратегий. Аномалии должны быть такими, чтобы они нарушали нормальные закономерности в данных, что позволит вашей модели эффективно их выявлять. Вот несколько подходов, которые вы можете использовать для создания аномалий в вашем наборе данных:

1. Путем добавления случайных значений

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

import pandas as pd
import numpy as np
import random

# Загрузка ваших данных (предполагается, что данные загружены в DataFrame df)
# df = pd.read_csv('path_to_your_dataset.csv')

# Установим случайное начальное значение для воспроизводимости
np.random.seed(2023)

# Генерация случайных аномалий
def generate_anomalies(df, num_anomalies, anomaly_range):
    anomaly_indices = random.sample(range(len(df)), num_anomalies)  # Случайные индексы для аномалий
    for idx in anomaly_indices:
        df.iloc[idx]['readings'] = np.random.randint(anomaly_range[0], anomaly_range[1])
    return df

# Пример использования
anomaly_range = (1000, 5000)  # Укажите диапазон аномальных значений
df_with_anomalies = generate_anomalies(df.copy(), 10, anomaly_range)

2. Введение выбросов

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

def introduce_outliers(df, num_outliers):
    for _ in range(num_outliers):
        index = random.randint(0, len(df) - 1)
        outlier_value = df['readings'].mean() + random.randint(10, 30) * df['readings'].std()
        df.at[index, 'readings'] = outlier_value
    return df

# Пример использования
df_with_outliers = introduce_outliers(df.copy(), 5)

3. Изменение существующих значений

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

def perturb_data(df, perturbation_factor):
    perturbation = np.random.normal(0, perturbation_factor, size=len(df))
    df['readings'] += perturbation
    return df

# Пример использования
df_perturbed = perturb_data(df.copy(), 50)  # Дисперсия 50

4. Создание временных аномалий

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

def introduce_time_based_anomalies(df, start_date, duration, anomaly_value):
    df.loc[start_date:start_date + pd.Timedelta(days=duration), 'readings'] = anomaly_value
    return df

# Пример использования
df_time_based_anomalies = introduce_time_based_anomalies(df.copy(), '2019-02-01', 10, 3500)

Заключение

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

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

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