Učenje različnih tehnik odkrivanja anomalij

Učenje različnih tehnik odkrivanja anomalij

Izvorno vozlišče: 1867449

Uporabili smo Standard Scaler, da bi naše podatke naredili normalne, in narisali raztreseni graf.

Zdaj bomo uvozili DBSCAN, da bomo dali točke grozdom. Če ne uspe, bo prikazano -1.

Zdaj imamo rezultate, toda kako preverimo, katera vrednost je min, max in ali imamo vrednosti -1? Za preverjanje najmanjše vrednosti v gruči bomo uporabili vrednost arg min.

Iz rezultata lahko vidimo šest vrednosti, ki so -1.

Narišimo zdaj raztreseni graf.

Zgornje metode, ki smo jih uporabili, se nanašajo na enosmerne izstopajoče vrednosti.

Za zaznavanje večvariantnih izstopajočih vrednosti moramo razumeti večvariatne izstopajoče vrednosti.

Na primer, vzamemo odčitke avtomobila. Videli smo dva števca za odčitavanje, enega za števec prevoženih kilometrov, ki beleži ali meri hitrost, s katero se premika vozilo, drugega pa za odčitek vrtljajev, ki beleži število vrtljajev avtomobilskega kolesa na minuto.

Recimo, da števec kilometrov kaže v območju 0-60 mph in število vrtljajev na minuto 0-750. Predvidevamo, da bi morale vse vrednosti, ki prihajajo, med seboj korelirati. Če števec kilometrov kaže hitrost 50 in vrtljaji na minuto kažejo 0 dovodov, so odčitki napačni. Če števec kilometrov kaže vrednost večjo od nič, to pomeni, da se je avto premikal, zato bi morali imeti vrtljaji višje vrednosti, vendar v našem primeru kaže vrednost 0. tj. večvariatne izstopajoče vrednosti.

C. Mahalanobisova metoda razdalje

V DBSCAN smo uporabili metriko evklidske razdalje, v tem primeru pa govorimo o Mahalanobisovi metodi razdalje. Z DBSCAN lahko uporabimo tudi Mahalanobisovo razdaljo.

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

Zakaj je Evklid neprimeren za entitete, ki so med seboj povezane? Evklidska razdalja ne more najti ali bo dala napačne podatke o tem, kako blizu sta si točki.

Mahalanobisova metoda uporablja razdaljo med točkami in distribucijo, ki je čisti podatek. Evklidska razdalja je pogosto med dvema točkama, njen rezultat z pa se izračuna z x minus povprečje in deli s standardnim odklonom. Pri Mahalanobisu je z-rezultat x minus povprečje, deljeno s kovariančno matriko.

Kakšen učinek ima torej deljenje s kovariančno matriko? Vrednosti kovariance bodo visoke, če so spremenljivke v vašem naboru podatkov visoko korelirane.

Podobno, če so vrednosti kovariance nizke, se razdalja ne zmanjša bistveno, če podatki niso korelirani. Deluje tako dobro, da obravnava vprašanja obsega in korelacije spremenljivk.

Koda

Nabor podatkov je mogoče vzeti iz Anomaly-/caret.csv na glavnem mestu · aster28/Anomaly- (github.com)

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

Funkcijsko razdaljo smo definirali kot x= nič, podatki= nič in kovarianca = nič. Znotraj funkcije smo vzeli povprečje podatkov in uporabili vrednost kovariance tamkajšnje vrednosti. V nasprotnem primeru bomo izračunali kovariančno matriko. T pomeni transponiranje.

Na primer, če je velikost matrike pet ali šest in želite, da je v dveh spremenljivkah, potem moramo prenesti matriko.

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

Uporabili smo sp.linalg, ki je linearna algebra in ima različne funkcije, ki se izvajajo na linearni algebri. Ima funkcijo inv za inverzijo matrike. NumPy pika kot sredstvo za množenje matrike.

uvozi scipy kot sp def distance(x=None, data=None, cov=None): x_m = x - np.mean(data) če ni cov: cov = np.cov(data.values.T) inv_cov = sp. linalg.inv(cov) levo = np.dot(x_m, inv_cov) m_distance = np.dot(levo, 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. Tukeyjeva metoda za odkrivanje izstopajočih vrednosti

Metoda Tukey se pogosto imenuje tudi metoda Box and Whisker ali Box plot metoda.

Tukeyjeva metoda uporablja zgornji in spodnji obseg.

Zgornje območje = 75. percentil -k*IQR

Nižje območje = 25. percentil + k* IQR

Oglejmo si podatke o Titaniku s spremenljivko starosti z uporabo škatlastega grafa.

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

Na sliki lahko vidimo škatlasti madež, ki ga je ustvaril Seaborn, in kaže, da je veliko pik med 55. in 80. letom starosti izstopajočih, ki niso znotraj kvartilov. Spodnji in zgornji obseg bomo zaznali s funkcijo 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) # Izračun IQR iqr = tretji - prvi #Zgornji obseg in spodnji obseg spodnji = prvi - (k * iqr) zgornji = tretji + (k * iqr) povratni spodnji, zgornji
outliers_detect(titanic['starost'], k = 1.5)
(2.5, 54.5)

D. Odkrivanje s PyCaretom

Za odkrivanje s PyCaretom bomo uporabili isti nabor podatkov.

iz pycaret.anomaly import * setup_anomaly_data = setup(df)

Pycaret je odprtokodno strojno učenje, ki uporablja model nenadzorovanega učenja za odkrivanje odstopanj. Ima metodo get_data za uporabo nabora podatkov v samem pycaretu, set_up za opravilo predprocesiranja pred odkrivanjem, običajno zavzame podatkovni okvir, ima pa tudi številne druge funkcije, kot je ignore_features itd.

Druge metode create_model za uporabo algoritma. Najprej bomo uporabili 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)

Anomalija 1 označuje izstopajoče vrednosti, anomalija 0 pa ne kaže nobenih izstopajočih vrednosti.

Rumena barva tukaj označuje odstopanja.

Zdaj pa poglejmo še en algoritem, K najbližjih sosedov (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

Zdaj bomo uporabili algoritem združevanja v gruče.

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. oblika

E. Odkrivanje nepravilnosti s PyOD

PyOD je knjižnica python za odkrivanje izstopajočih vrednosti v večvariantnih podatkih. Dober je tako za nadzorovano kot tudi nenadzorovano učenje.

iz pyod.models.iforest uvoz IForest iz pyod.models.knn uvoz KNN 

Uvozili smo knjižnico in algoritem.

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=contaminate,random_state=42)
cname_alg = 'KNN' # ime algoritma je K Najbližji sosedje c = KNN() c.fit(X_train) #Prilagodi algoritem y_trainpred = c.labels_ y_trainscores = c.decision_scores_ y_testpred = c.predict(X_test) y_testscores = c.decision_function(X_test) print("Podatki o usposabljanju:") evaluate_print(cname_alg, y_train, y_train_scores) print("Test Data:") 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=True, save_figure=True)

Uporabili bomo algoritem IForest.

fname_alg = 'IForest' # ime algoritma je K Nearest Neighbors f = IForest() f.fit(X_train) #Prilagodi algoritmu 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("Training Data:") evaluate_print(fname_alg, y_train_pred, y_train_scores) print("Test Data:") 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=True, save_figure=True)

F. Odkrivanje nepravilnosti s strani Prophet

Uporabili bomo nabor podatkov o letalskih potnikih s časovnimi serijami prophet/example_air_passengers.csv na glavnem · aster28/prophet (github.com)

uvozi prerok iz preroka uvozi napovedovalec iz preroka uvozi prerok m = prerok()
podatki = pd.read_csv('air_pass.csv') data.head()
data.columns = ['ds', 'y'] data['y'] = np.where(data['y'] != 0, np.log(data['y']), 0)

Dnevnik stolpca y ne omogoča nobene negativne vrednosti. Naše podatke smo razdelili na usposabljanje, testiranje in shranili napoved v spremenljivo napoved.

train, test= train_test_split(data, random_state =42) m.fit(train[['ds','y']]) prediction = m.predict(test) def detect(forecast): napoved = napoved[['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 = napoved ['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 vrni napoved
zaznati (napoved)

Anomalijo smo vzeli kot -1.

zaključek

Postopek iskanja izstopajočih vrednosti v danem nizu podatkov se imenuje zaznavanje anomalij. Izstopajoči podatki so podatkovni objekti, ki izstopajo od preostalih vrednosti objektov v naboru podatkov in se ne obnašajo normalno.

Naloge za odkrivanje anomalij lahko uporabljajo metode združevanja v gruče, ki temeljijo na razdalji in gostoti, da prepoznajo izstopajoče vrednosti kot gručo.

Tukaj razpravljamo o različnih metodah odkrivanja anomalij in jih razlagamo z uporabo kode treh podatkovnih nizov Titanika, letalskih potnikov in Careta, da

Ključne točke

1. Odkrivanje odstopanj ali anomalij je mogoče zaznati z metodo Box-Whisker ali z DBSCAN.

2. Metoda evklidske razdalje se uporablja z elementi, ki niso korelirani.

3. Mahalanobisova metoda se uporablja z multivariatnimi izstopajočimi vrednostmi.

4. Vse vrednosti ali točke niso izstopajoči. Nekateri so zvoki, ki bi morali biti smeti. Izstopajoči podatki so veljavni podatki, ki jih je treba prilagoditi.

5. Uporabili smo PyCaret za odkrivanje izstopajočih vrednosti z uporabo različnih algoritmov, kjer je anomalija ena, prikazana v rumenih barvah, in brez izstopajočih vrednosti, kjer je izstopajoča vrednost 0.

6. Uporabili smo PyOD, ki je Python knjižnica za odkrivanje odstopanj. Ima več kot 40 algoritmov. Uporabljajo se nadzorovane in nenadzorovane tehnike.

7. Uporabili smo Prophet in definirali funkcijo zaznavanja, da bi opisali odstopanja.

Mediji, prikazani v tem članku, niso v lasti Analytics Vidhya in se uporabljajo po lastni presoji avtorja.

Časovni žig:

Več od Analitika Vidhya