Вопрос или проблема
Я ищу подход для генерации синтетических данных для обнаружения аномалий. У нас есть реальные данные, но мы хотим внедрить аномалии, чтобы протестировать модель в условиях боевых происшествий (реальных данных слишком мало для вероятных будущих аномалий).
Я хотел бы имитировать статистические свойства реальных данных, такие как среднее, мода, стандартное отклонение и т.д., чтобы создать синтетические данные, затем внедрить аномалии на основе разумных экстремальных значений (если мы знаем статистические свойства каждого столбца в реальных данных, то мы можем вывести, каким может быть экстремальное значение для этого столбца).
Существуют ли какие-либо пакеты на Python, которые генерируют синтетические данные на основе известных статистических свойств в реальных данных. Я предполагаю, что это похоже на дифференциальную приватность, но мы не делаем это для защиты конфиденциальности и нам не нужен избыточный метод.
scikit-learn может генерировать синтетические данные, но, похоже, у него нет метода для основывания на существующих статистических свойствах реальных данных.
Я могу сделать что-то простое, например:
res = {}
for column in df:
nrows = len(df[column].index)
mean = df[column].mean()
std = df[column].std()
mu, sigma = mean, std # среднее и стандартное отклонение
synthetic_data = np.random.normal(mu, sigma, nrows)
res[column] = synthetic_data
…что просто обнаруживает средние значения и стандартное отклонение каждого столбца, а затем воссоздает его с использованием numpy для выборки из нормального распределения (большое допущение), но, очевидно, это плохо имитирует данные:
Реальные данные
Синтетические данные
Почему бы не работать в частотной области? Сделайте преобразование Фурье ваших реальных данных, а затем независимо измените полученные отдельные синусоиды, увеличив/уменьшив амплитуды на небольшое значение, и, аналогично, слегка увеличив/уменьшив частоты, а затем объедините их, чтобы получить аналогичные синтетические данные.
Одним из вариантов является Python-пакет imblearn, который содержит алгоритм SMOTE. SMOTE генерирует синтетические образцы из реального набора данных, интерполируя вероятные новые точки данных на основе наблюдаемых данных.
.
Ответ или решение
Генерация синтетических данных на основе существующих реальных данных является важной задачей, особенно в контексте таких приложений, как обнаружение аномалий. Основная цель заключается в создании синтетических наборов данных, которые сохраняют статистические свойства оригинальных данных (например, среднее значение, мода, стандартное отклонение) и в которые можно искусственно встраивать аномалии для тестирования и повышения устойчивости алгоритмов машинного обучения.
Теория
Генерация синтетических данных осуществляет несколько задач:
-
Сохранение статистических свойств: Генерируемые данные должны отражать реальные наборы данных в терминах их статистических свойств, чтобы обеспечить реальное тестирование моделей.
-
Разнообразие данных: Такие синтетические данные могут состоять из типичных образцов и потенциальных редких событий или аномалий, которые могут возникнуть в будущем.
-
Эффективность и простота реализации: Решение должно быть достаточно ясным в плане применения и эксплуатации.
Пример
В Python существует несколько библиотек и подходов для создания синтетических данных. Ваш пример с использованием numpy
для генерации данных, основанных на нормальном распределении, хоть и иллюстрирует основную идею, может быть недостаточно точным, если ваши реальные данные не соответствуют нормальному распределению.
-
Использование
scikit-learn
: Хотяscikit-learn
предоставляет функции для генерации синтетических данных, такие какmake_blobs
илиmake_classification
, они более подходят для создания искусственных наборов данных с нуля и не базируются на реальных данных. -
Работа в частотной области: При помощи преобразования Фурье можно изначально проанализировать данные в частотном домене. Это позволяет подчеркнуть фундаментальные частотные компоненты данных и аналогично менять амплитуды и частоты для получения синтетических данных.
-
SMOTE алгоритм из библиотеки
imbalanced-learn
: Этот алгоритм больше подходит для задачи ресэмплинга данных, когда требуется создать дополнительную кластеризацию выборки в задачах с несбалансированными данными. SMOTE создает новые образцы путем интерполяции между существующими наблюдениями.
Применение
Для реализации генерации синтетических данных с учётом статистических свойств и возможностью внедрения аномалий можно предложить следующий подход:
-
Анализ данных: Начните с анализа данных, определяющего распределение каждой из переменных. Это может потребовать использования инструментов визуализации и функций уровня распределения, таких как графики распределения и вычисление параметров распределений.
-
Моделирование распределений: Используйте библиотеки, такие как
scipy.stats
, чтобы подогнать данные к их вероятным распределениям (нормальное, биномиальное, экспоненциальное и т.д.) и извлечь необходимые параметры для дальнейшего использования в воспроизведении подобных схем распределения в данных. -
Генерация синтетических данных: На основе полученных распределений используйте
numpy
илиscipy
для создания новых данных. Например, для нормального распределения достаточно будет воспользоваться функциейnumpy.random.normal
. -
Внедрение аномалий: Создайте функции, которые получат "экстремальные" значения на основе предоставленных или расчетных параметров распределения. Эти значения должны отклоняться от нормального диапазона, чтобы быть уверенными, что модель распознает их как аномалии.
-
Оценка и тестирование: После интеграции синтетических данных важно протестировать модель обучения, чтобы проверить, как она справляется с обнаружением истинных и поддельных аномалий. Это послужит индикатором того, насколько надежен созданный синтетический набор данных.
Таким образом, исходя из вашего вопроса и существующих библиотек Python, можно сказать, что существует множество инструментов и алгоритмов, способных помочь в моделировании синтетических данных на основе реальных. Важно понимать статистические свойства данных и использовать их для адекватной генерации синтетических экземпляров, которые можно интегрировать в обучающие и тестовые наборы для моделей машинного обучения.