Изучение различных методов обнаружения аномалий

Изучение различных методов обнаружения аномалий

Исходный узел: 1867449

Мы использовали Standard Scaler, чтобы сделать наши данные нормальными, и построили график разброса.

Теперь мы импортируем DBSCAN, чтобы дать баллы кластерам. Если это не удается, он покажет -1.

Теперь у нас есть результаты, но как нам проверить, какое значение является min, max и есть ли у нас значения -1? Мы будем использовать значение arg min для проверки наименьшего значения в кластере.

Мы видим из результата шесть значений, которые равны -1.

Давайте теперь построим график рассеяния.

Вышеупомянутые методы, которые мы применили, относятся к одномерным выбросам.

Для обнаружения многовариантных выбросов нам необходимо понимать многовариантные выбросы.

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

Допустим, одометр показывает в диапазоне 0-60 миль в час и оборотов в диапазоне 0-750. Мы предполагаем, что все приходящие значения должны коррелировать друг с другом. Если одометр показывает скорость 50, а обороты показывают 0 впусков, показания неверны. Если одометр показывает значение больше нуля, это означает, что автомобиль двигался, поэтому обороты должны иметь более высокие значения, но в нашем случае он показывает значение 0. т. е. многомерные выбросы.

C. Метод расстояния Махаланобиса

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

DBSCAN(eps=0.5, min_samples=3, metric='mahalanobis', metric_params={'V':np.cov(X)}, algorithm='brute', leaf_size=30, n_jobs=-1)

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

Метод Махаланобиса использует расстояние между точками и распределение, которое является чистыми данными. Евклидово расстояние часто находится между двумя точками, и его z-оценка рассчитывается как x минус среднее и делится на стандартное отклонение. В Mahalanobis z-показатель равен x минус среднее значение, деленное на ковариационную матрицу.

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

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

Code

Набор данных можно взять из Anomaly-/caret.csv на главной · aster28/Anomaly- (github.com)

df = pd.read_csv('caret.csv').iloc[:, [0,4,6]] df.head()

Мы определили расстояние функции как x = None, data = None и Covariance = None. Внутри функции мы взяли среднее значение данных и использовали значение ковариации значения там. В противном случае мы вычислим ковариационную матрицу. T означает транспонирование.

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

np.random.multivariate_normal(mean, cov, size = 5)
array([[ 0.0509196, 0.536808 ], [ 0.1081547, 0.9308906], [ 0.4545248, 1.4000731], [ 0.9803848, 0.9660610], [ 0.8079491 , 0.9687909]])
np.random.multivariate_normal(mean, cov, size = 5).T
array([[ 0.0586423, 0.8538419, 0.2910855, 5.3047358, 0.5449706], [ 0.6819089, 0.8020285, 0.7109037, 0.9969768, -0.7155739]])

Мы использовали sp.linalg, который представляет собой линейную алгебру и имеет различные функции, выполняемые на линейной алгебре. Он имеет функцию inv для обращения матрицы. Точка NumPy как средство умножения матрицы.

импортировать scipy как sp def Distance(x=None, data=None, cov=None): x_m = x - np.mean(data), если не cov: cov = np.cov(data.values.T) inv_cov = sp. linalg.inv(cov) left = np.dot(x_m, inv_cov) m_distance = np.dot(left, x_m.T) return m_distance.diagonal() df_g= df[['карат', 'глубина', 'цена' ]].head(50) df_g['m_distance'] = расстояние(x=df_g, данные=df[['карат', 'глубина', 'цена']]) df_g.head()

B. Метод Тьюки для обнаружения выбросов

Метод Тьюки также часто называют методом Box and Whisker или Box plot.

Метод Тьюки использует верхний и нижний диапазоны.

Верхний диапазон = 75-й процентиль -k*IQR

Нижний диапазон = 25-й процентиль + k* IQR

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

sns.boxplot (титанический ['возраст']. значения)

На изображении мы видим, что квадратное пятно, созданное Seaborn, показывает, что многие точки в возрасте от 55 до 80 лет являются выбросами, не входящими в квартиль. Мы обнаружим нижний и верхний диапазон, создав функцию outliers_detect.

def outliers_detect(x, k = 1.5): x = np.array(x).copy().astype(float) first = np.quantile(x, .25) Third = np.quantile(x, .75) # Расчет IQR iqr = третий - первый # Верхний диапазон и нижний диапазон нижний = первый - (k * iqr) верхний = третий + (k * iqr) возврат нижний, верхний
outliers_detect (титанический ['возраст'], k = 1.5)
(2.5, 54.5)

D. Обнаружение с помощью PyCaret

Мы будем использовать тот же набор данных для обнаружения с помощью PyCaret.

из pycaret.anomaly import * setup_anomaly_data = setup(df)

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

Другие методы create_model для использования алгоритма. Сначала мы будем использовать изолированный лес.

ifor = create_model("iforest") plot_model(ifor) ifor_predictions = Predict_Model(ifor, data = df) print(ifor_predictions) ifor_anomaly = ifor_predictions[ifor_predictions["Аномалия"] == 1] print(ifor_anomaly.head()) print( ifor_anomaly.shape)

Аномалия 1 указывает на выбросы, а аномалия 0 не показывает выбросов.

Желтый цвет здесь указывает на выбросы.

Теперь давайте посмотрим на другой алгоритм, K ближайших соседей (KNN).

knn = create_model("knn") plot_model(knn) knn_pred = predict_model(knn, data = df) print(knn_pred) knn_anomaly = knn_pred[knn_pred["Аномалия"] == 1] knn_anomaly.head() knn_anomaly.shape

Теперь воспользуемся алгоритмом кластеризации.

clus = create_model("кластер") plot_model(clus) clus_pred = Predict_Model(clus, data = df) print(clus_pred) clus_anomaly = clus_predictions[clus_pred["Аномалия"] == 1] print(clus_anomaly.head()) clus_anomaly. форма

E. Обнаружение аномалий с помощью PyOD

PyOD — это библиотека Python для обнаружения выбросов в многомерных данных. Это хорошо как для обучения с учителем, так и для обучения без учителя.

из pyod.models.iforest импортировать IForest из pyod.models.knn импортировать KNN 

Мы импортировали библиотеку и алгоритм.

из pyod.utils.data import generate_data из pyod.utils.data import Assessment_print из pyod.utils.example import visualize train= 300 test=100 контаминировать = 0.1 X_train, X_test, y_train, y_test = generate_data(n_train=train, n_test=test , n_features=2,загрязнение=загрязнение,random_state=42)
cname_alg = 'KNN' # имя алгоритма K ближайших соседей c = KNN() c.fit(X_train) #Соответствие алгоритму y_trainpred = c.labels_ y_trainscores = c.decision_scores_ y_testpred = c.predict(X_test) y_testscores = c.decision_function(X_test) print("Обучающие данные:") Assessment_print(cname_alg, y_train, y_train_scores) print("Тестовые данные:") y_trainpred, y_testpred, show_figure = Истина, save_figure = Истина)

Мы будем использовать алгоритм IForest.

fname_alg = 'IForest' # имя алгоритма K ближайших соседей f = IForest() f.fit(X_train) #Подбор алгоритма y_train_pred = c.labels_ y_train_scores = c.decision_scores_ y_test_pred = c.predict(X_test) y_test_scores = c.decision_function(X_test) print("Обучающие данные:") Assessment_print(fname_alg, y_train_pred, y_train_scores) print("Тестовые данные:") y_train_pred, y_test_pred, show_figure = Истина, save_figure = Истина)

F. Обнаружение аномалий Пророком

Мы будем использовать набор данных авиапассажиров с временными рядами. Prophet/example_air_passengers.csv на главной · aster28/prophet (github.com)

импортировать пророка из пророка импортировать прогнозиста из пророка импортировать пророка m = Prophet()
данные = pd.read_csv('air_pass.csv') data.head()
data.columns = ['ds', 'y'] данные ['y'] = np.where (данные ['y']! = 0, np.log (данные ['y']), 0)

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

поезд, тест = train_test_split (данные, random_state = 42) m.fit (поезд [['ds', 'y']]) прогноз = m.predict (тест) определение определения (прогноз): forcast = прогноз [['ds ', 'yhat', 'yhat_lower', 'yhat_upper']].copy() forcast['real']= data['y'] forcast['аномалия'] =0 forcast.loc[forcast['real'] > forcast['yhat_upper'], 'аномалия']=1 forcast.loc[forcast['real']< forcast['yhat_lower'], 'аномалия']=-1 forcast['imp']=0 in_range = forcast ['yhat_upper']-forcast['yhat_lower'] forcast.loc[forcast['аномалия']==1, 'imp'] = forcast['real']-forcast['yhat_upper']/in_range forcast.loc[ forcast['аномалия']==-1, 'imp']= forcast['yhat_lower']-forcast['real']/in_range возвращает прогноз
обнаружить (прогноз)

Мы приняли аномалию за -1.

Заключение

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

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

Здесь мы обсуждаем различные методы обнаружения аномалий и объясняем их, используя код для трех наборов данных о Титанике, пассажирах Air и Caret to.

Ключевые моменты

1. Выбросы или обнаружение аномалий можно обнаружить с помощью метода Box-Whisker или DBSCAN.

2. Метод евклидова расстояния используется с некоррелированными элементами.

3. Метод Махаланобиса используется с многомерными выбросами.

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

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

6. Мы использовали PyOD, библиотеку обнаружения выбросов Python. Он имеет более 40 алгоритмов. Используются контролируемые и неконтролируемые методы.

7. Мы использовали Prophet и определили функцию обнаружения, чтобы выделить выбросы.

Материалы, показанные в этой статье, не принадлежат Analytics Vidhya и используются по усмотрению Автора.

Отметка времени:

Больше от Аналитика Видхья