Erilaisten poikkeamien havaitsemistekniikoiden oppiminen

Erilaisten poikkeamien havaitsemistekniikoiden oppiminen

Lähdesolmu: 1867449

Käytimme Standard Scaleria tehdäksemme tiedoistamme normaaleja ja piirtimme hajontakaavion.

Nyt tuomme DBSCANin antaaksemme pisteitä klustereille. Jos se epäonnistuu, se näyttää -1.

Nyt meillä on tulokset, mutta kuinka tarkistamme, mikä arvo on min, max ja onko meillä -1 arvoja? Käytämme arg min -arvoa tarkistaaksemme klusterin pienimmän arvon.

Näemme tuloksesta kuusi arvoa, jotka ovat -1.

Piirretään nyt sirontakaavio.

Yllä olevat menetelmät, joita käytimme, ovat yksimuuttujien poikkeavuuksia.

Monimuuttujien poikkeamien havaitsemiseksi meidän on ymmärrettävä monimuuttujien poikkeamat.

Otamme esimerkiksi auton lukemat. Olemme nähneet kaksi lukumittaria, joista toinen on matkamittarille, joka tallentaa tai mittaa ajoneuvon kulkunopeutta, ja toinen on rpm-lukema, joka tallentaa auton pyörän kierrosten määrän minuutissa.

Oletetaan, että matkamittari näyttää välillä 0-60 mph ja rpm välillä 0-750. Oletamme, että kaikkien tulevien arvojen tulee korreloida toistensa kanssa. Jos matkamittari näyttää 50 nopeutta ja kierrosluku 0 ottoa, lukemat ovat virheellisiä. Jos matkamittari näyttää arvoa, joka on suurempi kuin nolla, se tarkoittaa, että auto oli liikkeessä, joten kierrosluvuilla pitäisi olla korkeammat arvot, mutta meidän tapauksessamme se näyttää 0-arvon. eli monimuuttujat poikkeamat.

C. Mahalanobis Distance Method

DBSCANissa käytimme euklidisia etäisyysmittauksia, mutta tässä tapauksessa puhumme Mahalanobiksen etäisyysmenetelmästä. Voimme myös käyttää Mahalanobis-etäisyyttä DBSCANin kanssa.

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

Miksi Euklidinen ei sovellu toisiinsa korreloiville entiteeteille? Euklidinen etäisyys ei löydä tai antaa vääriä tietoja siitä, kuinka lähellä kaksi pistettä ovat.

Mahalanobis-menetelmä käyttää pisteiden välistä etäisyyttä ja jakaumaa, joka on puhdasta dataa. Euklidinen etäisyys on usein kahden pisteen välillä, ja sen z-piste lasketaan x miinus keskiarvo ja jaetaan keskihajonnalla. Mahalanobiksessa z-pistemäärä on x miinus keskiarvo jaettuna kovarianssimatriisilla.

Mikä on siis kovarianssimatriisilla jakamisen vaikutus? Kovarianssiarvot ovat korkeita, jos tietojoukosi muuttujat korreloivat voimakkaasti.

Vastaavasti, jos kovarianssiarvot ovat pieniä, etäisyys ei pienene merkittävästi, jos tiedot eivät korreloi. Se toimii niin hyvin, että se käsittelee sekä muuttujien mittakaava- että korrelaatioongelmia.

Koodi

Tietojoukko voidaan ottaa Anomaly-/caret.csv osoitteessa main · aster28/Anomaly- (github.com)

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

Määritimme funktion etäisyyden seuraavasti: x = Ei mitään, data = Ei mitään ja Kovarianssi = Ei mitään. Otimme funktion sisällä datan keskiarvon ja käytimme siellä arvon kovarianssiarvoa. Muussa tapauksessa laskemme kovarianssimatriisin. T tarkoittaa transponointia.

Jos taulukon koko on esimerkiksi viisi tai kuusi ja haluat sen olevan kahdessa muuttujassa, meidän on transponoitava matriisi.

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

Käytimme sp.linalg, joka on lineaarinen algebra ja jolla on erilaisia ​​toimintoja suoritettaviksi lineaariselle algebralle. Siinä on inv-funktio matriisin inversiolle. NumPy-piste matriisin kertolaskuvälineenä.

tuo scipy muodossa sp def distance(x=Ei mitään, data=Ei mitään, cov=Ei mitään): x_m = x - np.mean(data) jos ei cov: cov = np.cov(data.values.T) inv_cov = sp. linalg.inv(cov) vasen = np.piste(x_m, inv_cov) m_distance = np.piste(vasen, x_m.T) return m_distance.diagonal() df_g= df[['karaatti', 'syvyys', 'hinta' ]].head(50) df_g['m_distance'] = etäisyys(x=df_g, data=df[['karaatti', 'syvyys', 'hinta']]) df_g.head()

B. Tukeyn menetelmä poikkeamien havaitsemiseen

Tukey-menetelmää kutsutaan usein myös Box and Whisker tai Box plot -menetelmäksi.

Tukey-menetelmä hyödyntää ylä- ja alaaluetta.

Ylempi alue = 75. persentiili -k*IQR

Alempi alue = 25. prosenttipiste + k* IQR

Katsotaanpa Titanic-tietomme ikämuuttujan kanssa käyttämällä laatikkokaaviota.

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

Voimme nähdä kuvassa, että Seabornin luoma laatikkopilkku osoittaa, että monet 55–80-vuotiaiden pisteet ovat poikkeavia arvoja, jotka eivät ole kvartiileissa. Tunnistamme alemman ja ylemmän alueen tekemällä funktion 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-laskenta iqr = kolmas - ensimmäinen #Ylempi alue ja alempi alue alempi = ensimmäinen - (k * iqr) ylempi = kolmas + (k * iqr) paluu alempi, ylempi
outliers_detect(titanic['age'], k = 1.5)
(2.5, 54.5)

D. PyCaretin tunnistus

Käytämme samaa tietojoukkoa PyCaretin havaitsemiseen.

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

Pycaret on avoimen lähdekoodin koneoppiminen, joka käyttää valvomatonta oppimismallia poikkeamien havaitsemiseen. Siinä on get_data-menetelmä datajoukon käyttämiseen itse pycaretissa, set_up esikäsittelytehtävää varten ennen havaitsemista, yleensä ottaa datakehyksen, mutta siinä on myös monia muita ominaisuuksia, kuten ignore_features jne.

Muut menetelmät create_model algoritmin käyttämiseksi. Käytämme ensin Isolation Forestia.

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

Poikkeama 1 osoittaa poikkeavia arvoja, ja poikkeama 0 ei näytä poikkeavuuksia.

Keltainen väri tässä osoittaa poikkeavuuksia.

Katsotaan nyt toinen algoritmi, K Nearest Neighbors (KNN)

knn = luo_malli("knn") plot_model(knn) knn_pred = ennusta_malli(knn, data = df) print(knn_pred) knn_anomaly = knn_pred[knn_pred["Anomalia"] == 1] knn_anomaly.

Nyt käytämme klusterointialgoritmia.

clus = luo_malli("klusteri") plot_model(clus) clus_pred = ennusta_malli(clus, data = df) print(clus_pred) clus_anomaly = clus_predictions[clus_pred["Anomalia"] == 1] print(clus_anomaly.head()) clus. muoto

E. PyOD:n anomalian havaitseminen

PyOD on python-kirjasto monimuuttujatiedon poikkeamien havaitsemiseen. Se sopii sekä ohjattuun että ohjaamattomaan oppimiseen.

osoitteesta pyod.models.iforest tuonti IForest osoitteesta pyod.models.knn tuonti KNN 

Toimme kirjaston ja algoritmin.

osoitteesta pyod.utils.data import generate_data osoitteesta pyod.utils.data tuonti arvioida_tulostus osoitteesta pyod.utils.example tuonti visualisoida juna= 300 testi=100 kontaminate = 0.1 X_train, X_test, y_train, y_test = gener_data(n_train_test=train) , n_features=2,contamination=contaminate,random_state=42)
cname_alg = 'KNN' # algoritmin nimi on K Lähimmät naapurit c = KNN() c.fit(X_train) #Sovita algoritmiin y_trainpred = c.labels_ y_trainscores = c.decision_scores_ y_testpred = c. c.decision_function(X_test) print("Koulutustiedot:") assessment_print(cname_alg, y_train, y_train_scores) print("Testitiedot:") assessment_print(cname_alg, y_test, y_test_scores) visualize(cname_alg, X_train, _, Xytest y_trainpred,y_testpred, show_figure=True, save_figure=True)

Käytämme IForest-algoritmia.

fname_alg = 'IForest' # algoritmin nimi on K Lähimmät naapurit f = IForest() f.fit(X_train) #Sovita algoritmi y_train_pred = c.labels_ y_train_scores = c.decision_scores_ =c_test_scores_ =test_pred_scorey(c_test_score) c.decision_function(X_test) print("Koulutustiedot:") assessment_print(fname_alg, y_train_pred, y_train_scores) print("Testitiedot:") assessment_print(fname_alg, y_test_pred, y_test_scores) visualize(fname_alg,_test_tra_a, Xpre_tra_a, Xpre_tra_a, _test y_train_pred,y_test_pred, show_figure=True, save_figure=True)

F. Profeetan poikkeamien havaitseminen

Käytämme lentomatkustajatietoaineistoa aikasarjoilla prophet/example_air_passengers.csv at main · aster28/prophet (github.com)

tuonti profeetta profeetalta tuonti ennustaja profeetan tuonnista Profeetta m = Profeetta()
data = 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-sarakkeen loki ei salli negatiivista arvoa. Jaoimme tietomme junaksi, testasimme ja tallensimme ennusteen muuttujaennusteeseen.

juna, testi= train_test_split(data, random_state =42) m.fit(train[['ds','y']]) ennuste = m.predict(test) def detect(forecast): forcast = ennuste[['ds ', 'yhat', 'yhat_lower', 'yhat_upper']].copy() forcast['real']= data['y'] forcast['anomaly'] =0 forcast.loc[forcast['todellinen'] > forcast['yhat_upper'], 'anomaly']=1 forcast.loc[forcast['real']< forcast['yhat_lower'], 'anomaly']=-1 forcast['imp']=0 in_range = ennuste ['yhat_upper']-forcast['yhat_lower'] forcast.loc[forcast['anomaly']==1, 'imp'] = forcast['real']-forcast['yhat_upper']/in_range forcast.loc[ ennuste['anomaly']==-1, 'imp']= ennuste['yhat_lower']-forcast['todellinen']/välissä paluuennuste
havaita (ennuste)

Otimme anomaliaksi -1.

Yhteenveto

Poikkeamien löytämistä tietystä tietojoukosta kutsutaan poikkeamien havaitsemiseksi. Outliers ovat tietoobjekteja, jotka erottuvat muista tietojoukon objektiarvoista eivätkä toimi normaalisti.

Poikkeamien havaitsemistehtävät voivat käyttää etäisyyteen ja tiheyteen perustuvia klusterointimenetelmiä tunnistaakseen poikkeamat klusteriksi.

Keskustelemme täällä poikkeamien havaitsemisen eri menetelmistä ja selitämme ne käyttämällä koodia kolmessa tietojoukossa Titanic, Air matkustajat ja Caret.

Avainkohdat

1. Poikkeamat tai poikkeamien havaitseminen voidaan havaita käyttämällä Box-Whisker-menetelmää tai DBSCAN:ia.

2. Euklidisen etäisyyden menetelmää käytetään kohteiden kanssa, jotka eivät korreloi.

3. Mahalanobis-menetelmää käytetään monimuuttujapoikkeamien kanssa.

4. Kaikki arvot tai pisteet eivät ole poikkeavia arvoja. Jotkut ovat ääniä, joiden pitäisi olla roskaa. Poikkeamat ovat kelvollisia tietoja, joita on korjattava.

5. Käytimme PyCaretia poikkeamien havaitsemiseen käyttämällä erilaisia ​​​​algoritmeja, joissa poikkeama on yksi, näytetään keltaisilla väreillä, eikä poikkeamia, joissa poikkeama on 0.

6. Käytimme PyOD:ta, joka on Python Outlier -tunnistuskirjasto. Siinä on yli 40 algoritmia. Sitä käytetään valvotuilla ja valvomattomilla tekniikoilla.

7. Käytimme Prophetta ja määritimme havaitsemisfunktion poikkeamien hahmottamiseksi.

Tässä artikkelissa näkyvä media ei ole Analytics Vidhyan omistuksessa, ja sitä käytetään tekijän harkinnan mukaan.

Aikaleima:

Lisää aiheesta Analyysi Vidhya