Nauka różnych technik wykrywania anomalii

Nauka różnych technik wykrywania anomalii

Węzeł źródłowy: 1867449

Użyliśmy standardowego skalera, aby nasze dane były normalne i sporządziliśmy wykres punktowy.

Teraz zaimportujemy DBSCAN, aby przyznać punkty klastrom. Jeśli się nie powiedzie, pokaże -1.

Teraz mamy wyniki, ale jak sprawdzić, która wartość to min, max i czy mamy wartości -1? Użyjemy wartości arg min, aby sprawdzić najmniejszą wartość w klastrze.

Widzimy z wyniku sześć wartości, które są -1.

Sporządźmy teraz wykres rozrzutu.

Powyższe metody, które zastosowaliśmy, dotyczą wartości odstających dla jednej zmiennej.

W przypadku wykrywania wielowymiarowych wartości odstających musimy zrozumieć wielowymiarowe wartości odstające.

Na przykład bierzemy odczyty samochodów. Widzieliśmy dwa liczniki odczytowe, jeden dla licznika kilometrów, który rejestruje lub mierzy prędkość, z jaką porusza się pojazd, a drugi to odczyt prędkości obrotowej, który rejestruje liczbę obrotów wykonanych przez koło samochodu na minutę.

Załóżmy, że licznik kilometrów pokazuje zakres od 0 do 60 mil na godzinę, a obroty od 0 do 750. Zakładamy, że wszystkie wartości, które nadejdą, powinny być ze sobą skorelowane. Jeśli licznik kilometrów wskazuje prędkość 50, a obroty wskazują 0 wlotów, odczyty są nieprawidłowe. Jeśli licznik pokazuje wartość większą od zera, oznacza to, że samochód był w ruchu, więc obroty powinny mieć wyższe wartości, ale w naszym przypadku pokazuje wartość 0. tj. wielowymiarowe wartości odstające.

C. Metoda odległości Mahalanobisa

W DBSCAN użyliśmy euklidesowej metryki odległości, ale w tym przypadku mówimy o metodzie odległości Mahalanobisa. Możemy również użyć odległości Mahalanobisa z DBSCAN.

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

Dlaczego Euklides nie nadaje się do bytów skorelowanych ze sobą? Odległość euklidesowa nie może znaleźć lub da nieprawidłowe dane dotyczące tego, jak blisko siebie znajdują się te dwa punkty.

Metoda Mahalanobisa wykorzystuje odległość między punktami i rozkład, czyli czyste dane. Odległość euklidesowa jest często między dwoma punktami, a jej wynik z jest obliczany jako x minus średnia i dzielony przez odchylenie standardowe. W Mahalanobisie z-score to x minus średnia podzielona przez macierz kowariancji.

Jaki zatem efekt ma dzielenie przez macierz kowariancji? Wartości kowariancji będą wysokie, jeśli zmienne w zbiorze danych są silnie skorelowane.

Podobnie, jeśli wartości kowariancji są niskie, odległość nie zmniejsza się znacząco, jeśli dane nie są skorelowane. Robi to na tyle dobrze, że rozwiązuje zarówno kwestie skali, jak i korelacji zmiennych.

Code

Zbiór danych można pobrać z Anomaly-/caret.csv na stronie głównej · aster28/Anomaly- (github.com)

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

Zdefiniowaliśmy odległość funkcji jako x= Brak, dane= Brak i Kowariancja = Brak. Wewnątrz funkcji wzięliśmy średnią z danych i wykorzystaliśmy wartość kowariancji tamtej wartości. W przeciwnym razie obliczymy macierz kowariancji. T oznacza transpozycję.

Na przykład, jeśli rozmiar tablicy wynosi pięć lub sześć i chcesz, aby zawierała dwie zmienne, musimy transponować macierz.

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]])

Użyliśmy sp.linalg, która jest algebrą liniową i ma różne funkcje do wykonania na algebrze liniowej. Ma funkcję inv do odwracania macierzy. Kropka NumPy jako środki do mnożenia macierzy.

import scipy jako sp def distance(x=None, data=None, cov=None): x_m = x - np.mean(data) if not cov: cov = np.cov(data.values.T) inv_cov = sp. linalg.inv(cov) left = np.dot(x_m, inv_cov) m_odległość = np.kropka(lewo, x_m.T) return m_distance.diagonal() df_g= df[['karat', 'głębokość', 'cena' ]].head(50) df_g['m_odległość'] = odległość(x=df_g, data=df[['karat', 'głębokość', 'cena']]) df_g.head()

Metoda B. Tukeya do wykrywania wartości odstających

Metoda Tukeya jest również często nazywana metodą Box and Whisker lub Box plot.

Metoda Tukey wykorzystuje górny i dolny zakres.

Górny zakres = 75. percentyl -k*IQR

Dolny zakres = 25. percentyl + k* IQR

Zobaczmy nasze dane Titanica ze zmienną wieku za pomocą wykresu pudełkowego.

sns.boxplot(tytaniczny['wiek'].wartości)

Widzimy na obrazie, że plama pudełkowa stworzona przez Seaborna pokazuje, że wiele kropek w wieku od 55 do 80 lat to wartości odstające, które nie mieszczą się w kwartylach. Wykryjemy dolny i górny zakres, tworząc funkcję outliers_detect.

def outliers_detect(x, k = 1.5): x = np.array(x).copy().astype(float) pierwszy = np.kwantyl(x, .25) trzeci = np.kwantyl(x, .75) # Obliczenie IQR iqr = trzeci - pierwszy #Górny zakres i dolny zakres dolny = pierwszy - (k * iqr) górny = trzeci + (k * iqr) powrót dolny, górny
outliers_detect(tytaniczny['wiek'], k = 1.5)
(2.5, 54.5)

D. Wykrywanie przez PyCaret

Będziemy używać tego samego zestawu danych do wykrywania przez PyCaret.

z importu pycaret.anomaly * setup_anomaly_data = setup(df)

Pycaret to uczenie maszynowe typu open source, które wykorzystuje model uczenia bez nadzoru do wykrywania wartości odstających. Ma metodę get_data do korzystania z zestawu danych w samym pycaret, set_up do zadania przetwarzania wstępnego przed wykryciem, zwykle pobiera ramkę danych, ale ma także wiele innych funkcji, takich jak ignore_features itp.

Inne metody create_model do używania algorytmu. Najpierw użyjemy Lasu izolacyjnego.

ifor = create_model("iforest") plot_model(ifor) ifor_predictions = predict_model(ifor, data = df) print(ifor_predictions) ifor_anomaly = ifor_predictions[ifor_predictions["Anomalia"] == 1] print(ifor_anomaly.head()) print( ifor_anomalia.kształt)

Anomalia 1 wskazuje wartości odstające, a anomalia 0 nie pokazuje żadnych wartości odstających.

Żółty kolor oznacza tutaj wartości odstające.

Zobaczmy teraz inny algorytm, K Nearest Neighbors (KNN)

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

Teraz użyjemy algorytmu grupowania.

clus = create_model("cluster") plot_model(clus) clus_pred = predykcja_model(clus, dane = df) print(clus_pred) clus_anomaly = clus_predictions[clus_pred["Anomalia"] == 1] print(clus_anomaly.head()) clus_anomaly. kształt

E. Wykrywanie anomalii przez PyOD

PyOD to biblioteka Pythona do wykrywania wartości odstających w danych wielowymiarowych. Nadaje się zarówno do nauki nadzorowanej, jak i nienadzorowanej.

z pyod.models.iforest import IForest z pyod.models.knn import KNN 

Zaimportowaliśmy bibliotekę i algorytm.

z pyod.utils.data zaimportuj generuj_dane z pyod.utils.data zaimportuj ewaluację_wydrukuj z pyod.utils.example zaimportuj wizualizację train= 300 test=100 contaminate = 0.1 X_pociąg, X_test, y_pociąg, y_test = wygeneruj_dane(n_pociąg=pociąg, n_test=test , n_features=2,contamination=contaminate,random_state=42)
cname_alg = 'KNN' # nazwa algorytmu to K Najbliżsi sąsiedzi c = KNN() c.fit(X_pociąg) #Dopasuj algorytm y_trainpred = c.labels_ y_trainscores = c.decision_scores_ y_testpred = c.predict(X_test) y_testscores = c.decision_function(X_test) print("Dane szkoleniowe:") ewaluacja_print(cname_alg, y_train, y_train_scores) print("Dane testowe:") ewaluacja_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=True, save_figure=True)

Wykorzystamy algorytm IForest.

fname_alg = 'IForest' # nazwa algorytmu to K Najbliższych sąsiadów f = ILas() f.fit(X_pociąg) #Dopasuj algorytm 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("Dane treningowe:") ewaluacja_print(fname_alg, y_train_pred, y_train_scores) print("Dane testowe:") ewaluacja_print(fname_alg, y_test_pred, y_test_scores) wizualizacja(fname_alg, X_train, y_train, X_test, y_test_pred, y_train_pred,y_test_pred, show_figure=True, save_figure=True)

F. Wykrywanie anomalii przez proroka

Wykorzystamy zestaw danych pasażerów linii lotniczych z szeregami czasowymi prorok/example_air_passengers.csv w głównym · aster28/prophet (github.com)

importuj proroka z proroka importuj proroka z proroka importuj Proroka m = Prorok()
dane = pd.read_csv('air_pass.csv') data.head()
dane.kolumny = ['ds', 'y'] dane['y'] = np.where(dane['y'] != 0, np.log(dane['y']), 0)

Dziennik kolumny y nie dopuszcza żadnej wartości ujemnej. Podzieliliśmy nasze dane na pociągi, testy i zapisaliśmy prognozę w zmiennej prognozie.

pociąg, test=pociąg_test_split(dane, losowy_stan =42) m.fit(pociąg[['ds','y']]) prognoza = m.predict(test) def wykryj(prognoza): prognoza = prognoza[['ds ', 'yhat', 'yhat_lower', 'yhat_upper']].copy() forcast['rzeczywiste']= dane['y'] forcast['anomalia'] =0 forcast.loc[forcast['rzeczywiste'] > forcast['yhat_upper'], 'anomaly']=1 forcast.loc[forcast['real']< prognoza['yhat_lower'], 'anomaly']=-1 prognoza['imp']=0 in_range = prognoza ['yhat_upper']-forcast['yhat_lower'] forcast.loc[forcast['anomalia']==1, 'imp'] = forcast['real']-forcast['yhat_upper']/in_range forcast.loc[ forcast['anomalia']==-1, 'imp']= forcast['yhat_lower']-forcast['real']/in_range return prognoza
wykryć (prognoza)

Przyjęliśmy anomalię jako -1.

Wnioski

Proces znajdowania wartości odstających w danym zbiorze danych nazywany jest wykrywaniem anomalii. Wartości odstające to obiekty danych, które wyróżniają się na tle pozostałych wartości obiektów w zbiorze danych i nie zachowują się normalnie.

Zadania wykrywania anomalii mogą wykorzystywać metody grupowania oparte na odległości i gęstości, aby identyfikować wartości odstające jako klastry.

Omówimy tutaj różne metody wykrywania anomalii i wyjaśnimy je za pomocą kodu na trzech zestawach danych Titanica, pasażerów linii lotniczych i Careta, aby

Kluczowe punkty

1. Wykrywanie wartości odstających lub anomalii można wykryć za pomocą metody Box-Whisker lub DBSCAN.

2. Metodę odległości euklidesowej stosuje się do pozycji nieskorelowanych.

3. Metoda Mahalanobisa jest używana z wielowymiarowymi wartościami odstającymi.

4. Wszystkie wartości lub punkty nie są wartościami odstającymi. Niektóre to odgłosy, które powinny być śmieciami. Wartości odstające to prawidłowe dane, które należy skorygować.

5. Użyliśmy PyCaret do wykrywania wartości odstających przy użyciu różnych algorytmów, w których anomalia wynosi jeden, pokazana na żółto, i brak wartości odstających, gdy wartość odstająca wynosi 0.

6. Wykorzystaliśmy PyOD, czyli bibliotekę do wykrywania wartości odstających w Pythonie. Ma ponad 40 algorytmów. Stosuje się techniki nadzorowane i nienadzorowane.

7. Użyliśmy Proroka i zdefiniowaliśmy funkcję wykrywania, aby obrysować wartości odstające.

Media pokazane w tym artykule nie są własnością Analytics Vidhya i są wykorzystywane według uznania Autora.

Znak czasu:

Więcej z Analityka Widhja