Вивчення різних методів виявлення аномалій

Вивчення різних методів виявлення аномалій

Вихідний вузол: 1867449

Ми використали Standard Scaler, щоб зробити наші дані нормальними, і побудували графік розсіювання.

Тепер ми імпортуємо DBSCAN, щоб надати бали кластерам. Якщо це не вдається, буде показано -1.

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

Ми бачимо з результату шість значень, які дорівнюють -1.

Тепер побудуємо графік розсіювання.

Наведені вище методи, які ми застосували, стосуються однофакторних викидів.

Для виявлення багатоваріантних викидів нам потрібно розуміти багатовимірні викиди.

Наприклад, ми беремо показання автомобіля. Ми бачили два лічильники, один для одометра, який записує або вимірює швидкість, з якою рухається транспортний засіб, а другий є показанням обертів, який фіксує кількість обертів колеса автомобіля за хвилину.

Припустимо, що одометр показує в діапазоні 0-60 миль/год, а обороти в хвилину 0-750. Ми припускаємо, що всі значення, які надходять, повинні співвідноситися між собою. Якщо одометр показує швидкість 50, а оберти на хвилину показують 0 впусків, показання неправильні. Якщо одометр показує значення більше нуля, це означає, що автомобіль рухався, тому оберти повинні мати більші значення, але в нашому випадку він показує значення 0. тобто багатоваріантні викиди.

Метод відстані К. Махаланобіса

У 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 мінус середнє значення та ділиться на стандартне відхилення. У Махаланобіса z-оцінка дорівнює х мінус середнє, поділене на коваріаційну матрицю.

Отже, який ефект має ділення на коваріаційну матрицю? Значення коваріації будуть високими, якщо змінні у вашому наборі даних сильно корельовані.

Подібним чином, якщо значення коваріації низькі, відстань суттєво не зменшується, якщо дані не корельовані. Це настільки добре, що вирішує питання як масштабу, так і співвідношення змінних.

код

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

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

Ми визначили функцію відстань як x=Немає, дані=Немає та Коваріація=Немає. Усередині функції ми взяли середнє значення даних і використали значення коваріації значення. В іншому випадку ми розрахуємо коваріаційну матрицю. 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[['carat', 'depth', 'price' ]].head(50) df_g['m_distance'] = distance(x=df_g, data=df[['carat', 'depth', 'price']]) df_g.head()

B. Метод Тьюкі для виявлення викидів

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

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

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

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

Давайте подивимося на наші дані з Титаніка зі змінною віку за допомогою прямокутної діаграми.

sns.boxplot(titanic['age'].values)

На зображенні ми бачимо, що квадратна пляма, створена Сіборном, показує, що багато точок у віці від 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(titanic['age'], 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 для використання алгоритму. Спочатку ми використаємо Isolation Forest.

ifor = create_model("iforest") plot_model(ifor) ifor_predictions = predict_model(ifor, data = df) print(ifor_predictions) ifor_anomaly = ifor_predictions[ifor_predictions["Anomaly"] == 1] print(ifor_anomaly.head()) print( ifor_anomaly.shape)

Аномалія 1 вказує на викиди, а аномалія 0 не показує викидів.

Жовтий колір тут позначає викиди.

Тепер давайте подивимося інший алгоритм, K Nearest Neighbors (KNN)

knn = create_model("knn") plot_model(knn) knn_pred = predict_model(knn, data = df) print(knn_pred) knn_anomaly = knn_pred[knn_pred["Anomaly"] == 1] knn_anomaly.head() knn_anomaly.shape

Тепер ми скористаємося алгоритмом кластеризації.

clus = create_model("cluster") plot_model(clus) clus_pred = predict_model(clus, data = df) print(clus_pred) clus_anomaly = clus_predictions[clus_pred["Anomaly"] == 1] print(clus_anomaly.head()) clus_anomaly. форму

E. Виявлення аномалії за допомогою PyOD

PyOD — це бібліотека Python для виявлення викидів у багатовимірних даних. Це добре як для навчання під наглядом, так і без нього.

з pyod.models.iforest імпорт IForest з pyod.models.knn імпорт KNN 

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

from pyod.utils.data import generate_data from pyod.utils.data import evaluate_print from pyod.utils.example import visualize train= 300 test=100 contaminate = 0.1 X_train, X_test, y_train, y_test = generate_data(n_train=train, n_test=test , n_features=2,contamination=забруднити,random_state=42)
cname_alg = 'KNN' # ім'я алгоритму K Nearest Neighbors 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("Навчальні дані:") evaluate_print(cname_alg, y_train, y_train_scores) print("Тестові дані:") evaluate_print(cname_alg, y_test, y_test_scores) visualize(cname_alg, X_train, y_train, X_test, y_test, y_trainpred,y_testpred, show_figure=Правда, save_figure=Правда)

Ми будемо використовувати алгоритм IForest.

fname_alg = 'IForest' # ім'я алгоритму K Nearest Neighbors 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("Тренувальні дані:") evaluate_print(fname_alg, y_train_pred, y_train_scores) print("Тестові дані:") evaluate_print(fname_alg, y_test_pred, y_test_scores) visualize(fname_alg, X_train, y_train, X_test, y_test_pred, y_train_pred,y_test_pred, show_figure=Правда, save_figure=Правда)

F. Виявлення аномалії за допомогою Prophet

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

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

Журнал стовпця y не дає від’ємного значення. Ми розділили наші дані на навчання, тестування та зберегли прогноз у змінній прогнозу.

train, test= train_test_split(data, random_state =42) m.fit(train[['ds','y']]) forecast = m.predict(test) def detect(forecast): прогноз = прогноз[['ds ', 'yhat', 'yhat_lower', 'yhat_upper']].copy() forcast['real']= data['y'] forcast['anomaly'] =0 forcast.loc[forcast['real'] > forcast['yhat_upper'], 'anomaly']=1 forcast.loc[forcast['real']< forcast['yhat_lower'], 'anomaly']=-1 forcast['imp']=0 in_range = прогноз ['yhat_upper']-forcast['yhat_lower'] forcast.loc[forcast['anomaly']==1, 'imp'] = forcast['real']-forcast['yhat_upper']/in_range forcast.loc[ forcast['anomaly']==-1, 'imp']= forcast['yhat_lower']-forcast['real']/in_range повернення прогнозу
виявити (прогноз)

Ми прийняли аномалію як -1.

Висновок

Процес пошуку викидів у заданому наборі даних називається виявленням аномалій. Викиди – це об’єкти даних, які виділяються серед решти значень об’єктів у наборі даних і не поводяться належним чином.

Завдання виявлення аномалій можуть використовувати методи кластеризації на основі відстані та щільності, щоб ідентифікувати викиди як кластер.

Тут ми обговорюємо різні методи виявлення аномалій і пояснюємо їх за допомогою коду трьох наборів даних Titanic, Air пассажирів і Caret, щоб

Ключові моменти

1. Виявлення викидів або аномалій можна виявити за допомогою методу Box-Whisker або за допомогою DBSCAN.

2. Метод евклідової відстані використовується з елементами, які не корельовані.

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

4. Усі значення або бали не є викидами. Деякі шуми мають бути сміттям. Викиди – це дійсні дані, які потрібно скоригувати.

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

6. Ми використовували PyOD, яка є бібліотекою виявлення викидів Python. Має понад 40 алгоритмів. Використовуються контрольовані та неконтрольовані методи.

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

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

Часова мітка:

Більше від Аналітика Vidhya