Вопрос или проблема
Я создаю модель 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)
Заключение
После добавления аномалий в ваш набор данных важно проанализировать и визуализировать эти изменения, чтобы удостовериться в адекватности введенных аномалий. Это поможет подтвердить, что ваша модель будет протестирована на правдоподобных сценариях. Не забудьте генерировать и сохранять исходные и аномальные данные, чтобы иметь возможность оценить производительность вашей модели.