Εκμάθηση Διαφορετικών Τεχνικών Ανίχνευσης Ανωμαλιών

Εκμάθηση Διαφορετικών Τεχνικών Ανίχνευσης Ανωμαλιών

Κόμβος πηγής: 1867449

Χρησιμοποιήσαμε το Standard Scaler για να κάνουμε τα δεδομένα μας κανονικά και σχεδιάσαμε ένα γράφημα διασποράς.

Τώρα θα εισάγουμε το DBSCAN για να δώσουμε πόντους στα συμπλέγματα. Εάν αποτύχει, θα δείξει -1.

Τώρα έχουμε τα αποτελέσματα, αλλά πώς ελέγχουμε ποια τιμή είναι min, max και αν έχουμε -1 τιμές; Θα χρησιμοποιήσουμε την τιμή arg min για να ελέγξουμε τη μικρότερη τιμή στο σύμπλεγμα.

Μπορούμε να δούμε από το αποτέλεσμα έξι τιμές που είναι -1.

Ας σχεδιάσουμε τώρα ένα γράφημα διασποράς.

Οι παραπάνω μέθοδοι που εφαρμόσαμε είναι σε μονομεταβλητές ακραίες τιμές.

Για ανιχνεύσεις ακραίων σημείων πολλαπλών μεταβλητών, πρέπει να κατανοήσουμε τις ακραίες τιμές πολλαπλών μεταβλητών.

Για παράδειγμα, παίρνουμε αναγνώσεις αυτοκινήτου. Έχουμε δει δύο μετρητές ανάγνωσης, το ένα για το χιλιομετρητή, το οποίο καταγράφει ή μετρά την ταχύτητα με την οποία κινείται το όχημα, και το δεύτερο είναι η ένδειξη στροφών που καταγράφει τον αριθμό των περιστροφών που κάνει ο τροχός του αυτοκινήτου ανά λεπτό.

Ας υποθέσουμε ότι το οδόμετρο δείχνει στην περιοχή 0-60 mph και rpm σε 0-750. Υποθέτουμε ότι όλες οι αξίες που έρχονται θα πρέπει να συσχετίζονται μεταξύ τους. Εάν το χιλιομετρητή δείχνει ταχύτητα 50 και οι στροφές ανά λεπτό 0 εισαγωγές, οι ενδείξεις είναι λανθασμένες. Εάν το χιλιομετρητή δείχνει μια τιμή μεγαλύτερη από το μηδέν, αυτό σημαίνει ότι το αυτοκίνητο κινούνταν, επομένως οι στροφές ανά λεπτό θα πρέπει να έχουν υψηλότερες τιμές, αλλά στην περίπτωσή μας, δείχνει μια τιμή 0. δηλ. ακραίες τιμές πολλαπλών μεταβλητών.

Μέθοδος απόστασης C. Mahalanobis

Στο DBSCAN, χρησιμοποιήσαμε ευκλείδειες μετρήσεις απόστασης, αλλά σε αυτή την περίπτωση, μιλάμε για τη μέθοδο της απόστασης Mahalanobis. Μπορούμε επίσης να χρησιμοποιήσουμε την απόσταση Mahalanobis με το DBSCAN.

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

Γιατί το Ευκλείδειο είναι ακατάλληλο για οντότητες που σχετίζονται μεταξύ τους; Η Ευκλείδεια απόσταση δεν μπορεί να βρει ή θα δώσει λανθασμένα δεδομένα για το πόσο κοντά είναι τα δύο σημεία.

Η μέθοδος Mahalanobis χρησιμοποιεί την απόσταση μεταξύ σημείων και κατανομής που είναι καθαρά δεδομένα. Η Ευκλείδεια απόσταση είναι συχνά μεταξύ δύο σημείων και η βαθμολογία z υπολογίζεται με x μείον τη μέση τιμή και διαιρείται με την τυπική απόκλιση. Στο Mahalanobis, το z-score είναι x μείον τον μέσο όρο διαιρούμενο με τον πίνακα συνδιακύμανσης.

Επομένως, τι αποτέλεσμα έχει η διαίρεση με τον πίνακα συνδιακύμανσης; Οι τιμές συνδιακύμανσης θα είναι υψηλές εάν οι μεταβλητές στο σύνολο δεδομένων σας έχουν υψηλή συσχέτιση.

Ομοίως, εάν οι τιμές συνδιακύμανσης είναι χαμηλές, η απόσταση δεν μειώνεται σημαντικά εάν τα δεδομένα δεν συσχετίζονται. Τα καταφέρνει τόσο καλά που αντιμετωπίζει ζητήματα τόσο της κλίμακας όσο και της συσχέτισης των μεταβλητών.

Κώδικας

Το σύνολο δεδομένων μπορεί να ληφθεί από Anomaly-/caret.csv στο main · 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(αριστερά, x_m.T) return m_distance.diagonal() df_g= df[['carat', 'depth', 'price' ]].head(50) df_g['m_distance'] = απόσταση(x=df_g, data=df[['καράτια', 'βάθος', 'τιμή']]) df_g.head()

Β. Μέθοδος Tukey για ανίχνευση ακραίων τιμών

Η μέθοδος Tukey ονομάζεται επίσης μέθοδος Box and Whisker ή Box plot.

Η μέθοδος Tukey χρησιμοποιεί το ανώτερο και το κατώτερο εύρος.

Ανώτερο εύρος = 75ο εκατοστημόριο -k*IQR

Κατώτερο εύρος = 25ο εκατοστημόριο + k* IQR

Ας δούμε τα δεδομένα μας για τον Τιτανικό με μεταβλητή ηλικία χρησιμοποιώντας μια γραφική παράσταση πλαισίου.

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

Μπορούμε να δούμε στην εικόνα η κηλίδα πλαισίου που δημιουργήθηκε από τον Seaborn δείχνει ότι πολλές κουκκίδες μεταξύ 55 και 80 ετών είναι ακραίες τιμές που δεν βρίσκονται εντός των τεταρτημορίων. Θα εντοπίσουμε το χαμηλότερο και το ανώτερο εύρος δημιουργώντας μια συνάρτηση outliers_detect.

def outliers_detect(x, k = 1.5): x = np.array(x).copy().atype(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)

Δ. Ανίχνευση από την 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. 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] knheadannoma.nomaly.

Τώρα θα χρησιμοποιήσουμε έναν αλγόριθμο ομαδοποίησης.

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._ανωμαλία). σχήμα

Ε. Ανίχνευση ανωμαλιών από PyOD

Το PyOD είναι μια βιβλιοθήκη python για τον εντοπισμό ακραίων τιμών σε δεδομένα πολλαπλών μεταβλητών. Είναι καλό τόσο για μάθηση με επίβλεψη όσο και χωρίς επίβλεψη.

από pyod.models.iforest εισαγωγή IForest από pyod.models.knn εισαγωγή KNN 

Εισαγάγαμε τη βιβλιοθήκη και τον αλγόριθμο.

από pyod.utils.data import generate_data from pyod.utils.data import value_print from pyod.utils.example import visualize train= 300 test=100 contaminate = 0.1 X_train, X_test, y_train, y_test =genere_data(n_traintest=tra , n_features=2,contamination=contaminate,random_state=42)
cname_alg = 'KNN' # το όνομα του αλγορίθμου είναι K Πλησιέστεροι γείτονες c = KNN() c.fit(X_train) #Fit the algorithm y_trainpred = c.labels_ y_trainscores = c.decision_scores_ y_testpred = c.predicty_stest c.decision_function(X_test) print("Training Data:") value_print(cname_alg, y_train, y_train_scores) print("Test Data:") value_print(cname_alg, y_test, y_test_scores) visualize(cname_alg, X_train, X_train y_trainpred,y_testpred, show_figure=True, save_figure=True)

Θα χρησιμοποιήσουμε τον αλγόριθμο IForest.

fname_alg = 'IFforest' # το όνομα του αλγορίθμου είναι K Κοντινότεροι γείτονες f = IForest() f.fit(X_train) #Προσαρμόστε τον αλγόριθμο y_train_pred = c.labels_ y_train_scores = c.decision_scores_ y_predict_pred_stest =c. c.decision_function(X_test) print("Training Data:") value_print(fname_alg, y_train_pred, y_train_scores) print("Test Data:") value_print(fname_alg, y_test_pred, y_test_scores) visualize (fname_alg, y_train_pred, y_train_scores) y_train_pred,y_test_pred, show_figure=True, save_figure=True)

ΣΤ. Ανίχνευση ανωμαλιών από τον Προφήτη

Θα χρησιμοποιήσουμε το σύνολο δεδομένων επιβατών αεροπορικών μεταφορών με χρονοσειρές prophet/example_air_passengers.csv στο κύριο · aster28/prophet (github.com)

εισαγωγή προφήτη από προφήτη εισαγωγική πρόβλεψη από προφήτη εισαγωγή Προφήτης m = Προφήτης()
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 δεν επιτρέπει καμία αρνητική τιμή. Διαχωρίσαμε τα δεδομένα μας σε τρένο, δοκιμάσαμε και αποθηκεύσαμε την πρόβλεψη στη μεταβλητή πρόβλεψη.

train, test= train_test_split(data, random_state =42) m.fit(train[['ds','y']]) forecast = m.predict(test) def detect(forecast): forcast = 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. Η μέθοδος Mahalanobis χρησιμοποιείται με Πολυμεταβλητές ακραίες τιμές.

4. Όλες οι τιμές ή τα σημεία δεν είναι ακραίες τιμές. Μερικοί είναι θόρυβοι που θα έπρεπε να είναι σκουπίδια. Οι ακραίες τιμές είναι έγκυρα δεδομένα που πρέπει να προσαρμοστούν.

5. Χρησιμοποιήσαμε το PyCaret για ανίχνευση ακραίων σημείων χρησιμοποιώντας διαφορετικούς αλγόριθμους όπου η ανωμαλία είναι μία, εμφανίζεται με κίτρινα χρώματα και όχι ακραία σημεία όπου η ακραία τιμή είναι 0.

6. Χρησιμοποιήσαμε το PyOD, που είναι η βιβλιοθήκη ανίχνευσης Python Outlier. Διαθέτει περισσότερους από 40 αλγόριθμους. Χρησιμοποιούνται εποπτευόμενες και μη εποπτευόμενες τεχνικές.

7. Χρησιμοποιήσαμε το Prophet και ορίσαμε τη συνάρτηση ανίχνευση για να περιγράψουμε τα ακραία σημεία.

Τα μέσα που εμφανίζονται σε αυτό το άρθρο δεν ανήκουν στο Analytics Vidhya και χρησιμοποιούνται κατά την κρίση του συγγραφέα.

Σφραγίδα ώρας:

Περισσότερα από Ανάλυση Vidhya