Устранение непредсказуемости при обнаружении аномалий Пусть гистограммы устанавливают порог

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

Быстрый погружение с использованием кода Python

Фото Рэнди Фат на Unsplash. Фигурка разноцветного пешки, представляющая выбросы цветов.

В области обнаружения аномалий поиск скрытых несоответствий подобен поиску скрытых сокровищ в огромном массиве данных. Тем не менее, даже при наличии самых продвинутых алгоритмов и методов обнаружения аномалий, существует критическое решение: где провести границу между аномалией и нормой?

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

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

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

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

Обнаружение порога на гистограмме (HCTT)

Обычно, когда вы настраиваете систему обнаружения аномалий, вам нужно решить, является ли точка данных аномалией, присваивая ей оценку 0 или 1. Но что, если вы не уверены?

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

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

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

Этот метод прост, как только вы отрегулируете свою соответствующую модель для соответствующих данных, у вас всегда будет метод для определения оценки аномалии. Для гауссового распределения это может быть логарифм вероятностей, для K-средних – расстояние до центроида и т.д. Но вот подвох: теперь у вас есть оценка, которая определяет, имеет ли такое значение смысл, основываясь на всей группе, и именно на этом мы собираемся работать. Для этого мы разделим график распределения на 100 бинов, ожидая, что эта гистограмма отразит изменение каждые 1% накопленных данных, и именно здесь мы выберем соответствующий порог.

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

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

График, представляющий сравнение выбросов в сравнении с процентным отклонением и накопленным распределением данных. Изображение автора.

Процентное отклонение: Это разница в накопленной доле между одной гистограммой и следующей. Обратите внимание, что порядок может варьироваться в зависимости от использования алгоритма. Например, если вы используете смесь Гауссовых и используете логарифмическую вероятность, то «разрезание» бинов должно выполняться справа налево. С другой стороны, если вы используете Kmeans и измеряете расстояние до центроида, то бины должны обрабатываться слева направо, при этом слева считается отрицательными значениями, а справа — положительными. Значение от 3-6% обычно дает стабильные результаты. Это момент, когда добавление новых данных не существенно изменяет ранее накопленное распределение, поэтому мы можем решить выполнить разрезание. Любые данные, сопоставленные после этой точки, не будут соответствовать основной массе.

Накопленное распределение данных (дополнительно): Этот параметр в основном основан на интуитивном выборе тревоги. Его можно установить как верхний предел доли аномалий, которые вы позволяете алгоритму обнаруживать. Например, если вам не хочется, чтобы более 20% данных были помечены как выбросы, это может служить в качестве дополнительной защиты.

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

Давайте попробуем и посмотрим, насколько хорошо это работает!

Действие!

Пример 1: Смесь Гауссовых

Давайте начнем с работы с моделью смеси Гауссовых. Мы создадим аномальные наблюдения с использованием библиотеки PyOD. Изначально мы сгенерируем данные, где процент выбросов составляет 15%. Эта пропорция — то, что мы пытаемся определить с помощью предложенного алгоритма.

import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom pyod.utils.data import generate_datafrom sklearn.mixture import GaussianMixturecontamination = 0.15 # процент выбросовn_train = 1000      # количество точек для обученияn_test = 100        # количество точек для тестированияn_features = 6      # количество характеристикX_train, X_test, y_train, y_test = generate_data(    n_train=n_train,     n_test=n_test,     n_features= n_features,     contamination=contamination,     random_state=123)X_train_pd = pd.DataFrame(X_train)X_train_pd.head()

Из данных мы уже знаем, какие являются аномалией(y=1), а какие нет (y=0). С этим мы собираемся проверить, работает ли это. Сначала мы подгоняем смесь Гауссовых к модели.

df_model = X_train_pdgm = GaussianMixture(n_components = 1, covariance_type = 'full', random_state=0)gm.fit(df_model)df_model['log'] = gm.score_samples(df_model)

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

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

perc_dif = 0.0005cum_perc = 0.8df_histogram_change = df_model['log'].value_counts(bins=100).sort_index(ascending=False)df_histogram_change = pd.DataFrame(df_histogram_change)df_histogram_change['cumsum'] = df_histogram_change['log'].cumsum()df_histogram_change['index'] = range(len(df_histogram_change))df_histogram_change['cumsum_diff'] = df_histogram_change['cumsum'].pct_change()df_histogram_change['interval'] = df_histogram_change.indexdf_histogram_change['cum_pct'] = df_histogram_change['cumsum']/sum(df_histogram_change['log'])df_histogram_changefilter_df = df_histogram_change[(df_histogram_change['cumsum_diff']<perc_dif) & (df_histogram_change['cum_pct']>cum_perc)]index = filter_df.iloc[0]['index']tresh = df_histogram_change.index[index].leftdf_model = df_model.copy()df_model['outlier'] = np.where(df_model ['log']<tresh,1,0)

Соответствующий датафрейм гистограммы, который содержит переменные, которые нас интересуют

Обратите внимание, что “cumsum” представляет собой кумулятивную сумму справа налево на гистограмме. “cumsum_diff” относится к разнице между бинами, а “cum_pct” представляет процент значений от общего количества значений.

Теперь мы хотим определить с помощью этого метода, что порог, определенный методом, составляет 0,15 (15%)

df_cases = df_model['outlier'].value_counts()df_cases[1]/sum(df_cases)#0.15

Мы видим, что разница между оцененными и реальными значениями равна 0.

Пример 2: Кластеризация K-средних на временных рядах

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

from sklearn.cluster import KMeansfrom numpy import sqrt, random, array, argsortfrom sklearn.preprocessing import scaleimport matplotlib.pyplot as plt

Сгенерируем соответствующие данные

random.seed(123)def makeData(N):  x = []  for i in range(N):      a = i/1000 + random.uniform(-3, 2)      r = random.uniform(-5, 10)      if(r >= 9.9):            r = r + 10      elif(r<(-4.8)):          r = r +(- 10)                   x.append([a + r])       return array(x)x = makeData(500)

Построим график

x_ax = range(500)plt.title("Time Series")plt.xlabel('Time')plt.ylabel('Value')plt.plot(x_ax, x)plt.show()

Применяем модель K-средних и масштабируем набор данных для работы с этим методом

x = scale(x)kmeans = KMeans(n_clusters = 1).fit(x)center = kmeans.cluster_centers_distance = sqrt((x - center)**2)df = pd.DataFrame(x)df['distance'] = distance

Построим соответствующую гистограмму оценок

import seaborn as snsplt.figure(    figsize=(10, 6),  # Задаем размер фигуры    dpi=100,  # Задаем dpi (или разрешение) здесь)sns.histplot(data=df, x="distance", bins=100)# Задаем подзаголовокplt.title(    "Histogram of Log",  # Текст подзаголовка    fontsize=14,  # Задаем размер шрифта)

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

df_histogram_change = df['distance'].value_counts(bins=100).sort_index(ascending=True)df_histogram_change = pd.DataFrame(df_histogram_change)df_histogram_change['cumsum'] = df_histogram_change['distance'].cumsum()df_histogram_change['index'] = range(len(df_histogram_change))df_histogram_change['cumsum_diff'] = df_histogram_change['cumsum'].pct_change()df_histogram_change['interval'] = df_histogram_change.indexdf_histogram_change['cum_pct'] = df_histogram_change['cumsum']/sum(df_histogram_change['distance'])df_histogram_changefilter_df = df_histogram_change[(df_histogram_change['cumsum_diff']<0.0005) & (df_histogram_change['cum_pct']>0.8)]index = filter_df.iloc[0]['index']tresh = df_histogram_change.index[index].leftdf = df.copy()df['outlier'] = np.where(df['distance']>tresh,1,0)#tresh 1.99

Порог составляет 1.99, после чего все будет считаться выбросом

indexes = df[df['outlier']==1].indexvalues = df.loc[indexes,0]

Теперь мы строим графики выбросов и вуаля! Работает, как чарм

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

Признавая вызовы, связанные с выбором правильного порога, блог представляет метод обнаружения аномалий с помощью гистограммы (Histogram Cut Detection, HCT) в качестве переломного решения. HCT упрощает процесс установки порогов, используя распределение оценок в гистограмме, предлагая более доступный и точный подход к необучаемому обнаружению аномалий.

Метод, продемонстрированный на примерах таких моделей, как смесь гауссовых и K-средних, включает разделение графика распределения на 100 ячеек, каждая из которых отражает изменение на 1% суммарных данных. Этот тонко настроенный анализ позволяет интуитивно выбирать пороги на основе заметного отключения ячеек с оценками.

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

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

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