Mempelajari Berbagai Teknik Deteksi Anomali

Mempelajari Berbagai Teknik Deteksi Anomali

Node Sumber: 1867449

Kami menggunakan Standard Scaler untuk membuat data kami normal dan memplot grafik pencar.

Sekarang kita akan mengimpor DBSCAN untuk memberikan poin ke cluster. Jika gagal, itu akan menunjukkan -1.

Sekarang kami memiliki hasilnya, tetapi bagaimana kami memeriksa nilai min, maks dan apakah kami memiliki nilai -1? Kami akan menggunakan nilai arg min untuk memeriksa nilai terkecil di cluster.

Kita dapat melihat dari hasil enam nilai yaitu -1.

Sekarang mari kita plot grafik pencar.

Metode di atas yang kami terapkan adalah pada uni-variate outlier.

Untuk pendeteksian outlier multi-variasi, kita perlu memahami outlier multi-variasi.

Misalnya, kami mengambil bacaan Mobil. Kita telah melihat dua pembacaan meter, satu untuk odometer, yang mencatat atau mengukur kecepatan kendaraan bergerak, dan yang kedua adalah pembacaan rpm yang mencatat jumlah putaran yang dilakukan oleh roda mobil per menit.

Misalkan odometer menunjukkan pada kisaran 0-60 mph dan rpm pada 0-750. Kami berasumsi bahwa semua nilai yang datang harus berkorelasi satu sama lain. Jika odometer menunjukkan kecepatan 50 dan rpm menunjukkan asupan 0, pembacaan salah. Jika odometer menunjukkan nilai lebih dari nol, itu artinya mobil sedang melaju, jadi seharusnya rpm memiliki nilai yang lebih tinggi, tetapi dalam kasus kami, ini menunjukkan nilai 0. yaitu, Outlier multi-variasi.

C. Metode Jarak Mahalanobis

Di DBSCAN, kami menggunakan metrik jarak euclidean, tetapi dalam kasus ini, kami berbicara tentang metode jarak Mahalanobis. Kita juga bisa menggunakan jarak Mahalanobis dengan DBSCAN.

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

Mengapa Euclidean tidak cocok untuk entitas yang saling terkait satu sama lain? Jarak Euclidean tidak dapat menemukan atau akan memberikan data yang salah tentang seberapa dekat kedua titik tersebut.

Metode Mahalanobis menggunakan jarak antar titik dan distribusi yang bersifat clean data. Jarak Euclidean seringkali berada di antara dua titik, dan skor-znya dihitung dengan rata-rata x minus dan dibagi dengan standar deviasi. Di Mahalanobis, z-score adalah x minus rata-rata dibagi dengan matriks kovarians.

Oleh karena itu, apa pengaruh pembagian dengan matriks kovarians? Nilai kovarian akan tinggi jika variabel dalam kumpulan data Anda sangat berkorelasi.

Demikian pula, jika nilai kovarian rendah, jarak tidak berkurang secara signifikan jika data tidak dikorelasikan. Itu bekerja dengan sangat baik sehingga membahas skala dan korelasi dari masalah variabel.

Kode

Dataset dapat diambil dari Anomali-/caret.csv di main ยท aster28/Anomali- (github.com)

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

Kami mendefinisikan jarak fungsi sebagai x = Tidak ada, data = Tidak ada, dan Kovarian = Tidak ada. Di dalam fungsi, kami mengambil rata-rata data dan menggunakan nilai kovarian dari nilai di sana. Jika tidak, kami akan menghitung matriks kovarians. T adalah singkatan dari transpose.

Misalnya, jika ukuran array adalah lima atau enam dan Anda menginginkannya dalam dua variabel, maka kita perlu mentranspos matriks.

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

Kami menggunakan sp.linalg, yang merupakan aljabar linier dan memiliki fungsi yang berbeda untuk dilakukan pada aljabar linier. Ini memiliki fungsi inv untuk inversi matriks. NumPy dot sebagai sarana untuk perkalian matriks.

impor scipy sebagai sp def distance(x=None, data=None, cov=None): x_m = x - np.mean(data) jika tidak cov: cov = np.cov(data.values.T) inv_cov = sp. linalg.inv(cov) kiri = np.dot(x_m, inv_cov) m_distance = np.dot(kiri, x_m.T) return m_distance.diagonal() df_g= df[['carat', 'depth', 'price' ]].head(50) df_g['m_distance'] = jarak(x=df_g, data=df[['karat', 'kedalaman', 'harga']]) df_g.head()

B. Metode Tukey untuk deteksi outlier

Metode Tukey juga sering disebut dengan metode Box and Whisker atau Box plot.

Metode Tukey menggunakan rentang Atas dan bawah.

Rentang atas = Persentil ke-75 -k*IQR

Kisaran bawah = Persentil ke-25 + k* IQR

Mari kita lihat data Titanic kita dengan variabel umur menggunakan plot kotak.

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

Kita dapat melihat pada gambar kotak bercak yang dibuat oleh Seaborn menunjukkan banyak titik antara usia 55 dan 80 adalah outlier yang tidak berada dalam kuartil. Kami akan mendeteksi rentang bawah dan atas dengan membuat fungsi 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) # Perhitungan IQR iqr = ketiga - pertama #Kisaran atas dan rentang bawah lebih rendah = pertama - (k * iqr) atas = ketiga + (k * iqr) kembali lebih rendah, atas
outliers_detect(titanic['usia'], k = 1.5)
(2.5, 54.5)

D. Deteksi oleh PyCaret

Kami akan menggunakan kumpulan data yang sama untuk deteksi oleh PyCaret.

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

Pycaret adalah pembelajaran mesin sumber terbuka yang menggunakan model pembelajaran tanpa pengawasan untuk mendeteksi outlier. Ini memiliki metode get_data untuk menggunakan dataset di pycaret itu sendiri, set_up untuk tugas preprocessing sebelum deteksi, biasanya mengambil bingkai data tetapi juga memiliki banyak fitur lain seperti fitur-ignore, dll.

Metode lain create_model untuk menggunakan algoritme. Pertama-tama kita akan menggunakan Hutan Isolasi.

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

Anomali 1 menunjukkan outlier, dan Anomali 0 tidak menunjukkan adanya outlier.

Warna kuning di sini menunjukkan outlier.

Sekarang mari kita lihat algoritma lain, 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["Anomali"] == 1] knn_anomaly.head() knn_anomaly.shape

Sekarang kita akan menggunakan algoritma clustering.

clus = create_model("cluster") plot_model(clus) clus_pred = predict_model(clus, data = df) print(clus_pred) clus_anomaly = clus_predictions[clus_pred["Anomali"] == 1] print(clus_anomaly.head()) clus_anomaly. membentuk

E. Deteksi Anomali oleh PyOD

PyOD adalah pustaka python untuk mendeteksi outlier dalam data multivariat. Ini bagus untuk pembelajaran yang diawasi dan tidak diawasi.

dari pyod.models.iforest impor IForest dari pyod.models.knn impor KNN 

Kami mengimpor perpustakaan dan algoritme.

dari pyod.utils.data impor generate_data dari pyod.utils.data impor evaluasi_print dari pyod.utils.example impor visualisasi kereta= 300 uji=100 kontaminasi = 0.1 X_train, X_test, y_train, y_test = generate_data(n_train=train, n_test=test , n_features=2,kontaminasi=kontaminasi,random_state=42)
cname_alg = 'KNN' # nama algoritmanya adalah K Tetangga Terdekat c = KNN() c.fit(X_train) #Sesuaikan dengan algoritma y_trainpred = c.labels_ y_trainscores = c.decision_scores_ y_testpred = c.predict(X_test) y_testscores = c.decision_function(X_test) print("Data Latihan:") evaluasi_cetak(cname_alg, y_train, y_train_scores) print("Data Ujian:") evaluasi_cetak(cname_alg, y_test, y_test_scores) visualisasikan(cname_alg, X_train, y_train, X_test, y_test, y_trainpred,y_testpred, show_figure=Benar, save_figure=Benar)

Kami akan menggunakan algoritma IForest.

fname_alg = 'IForest' # nama algoritmanya adalah K Tetangga Terdekat f = IForest() f.fit(X_train) #Sesuai dengan algoritma 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("Data Latihan:") evaluasi_cetak(fname_alg, y_train_pred, y_train_scores) print("Data Ujian:") evaluasi_print(fname_alg, y_test_pred, y_test_scores) visualisasikan(fname_alg, X_train, y_train, X_test, y_test_pred, y_train_pred,y_test_pred, show_figure=Benar, save_figure=Benar)

F. Deteksi Anomali oleh Nabi

Kami akan menggunakan dataset penumpang udara dengan time series nabi/contoh_air_penumpang.csv di utama ยท aster28/nabi (github.com)

impor nabi dari nabi impor peramal dari nabi impor Nabi m = Nabi ()
data = pd.read_csv('air_pass.csv') data.head()
data.kolom = ['ds', 'y'] data['y'] = np.where(data['y'] != 0, np.log(data['y']), 0)

Log kolom y tidak memungkinkan nilai negatif. Kami membagi data kami menjadi pelatihan, pengujian, dan menyimpan prediksi dalam perkiraan variabel.

kereta, uji= kereta_tes_split(data, kondisi_acak =42) m.fit(kereta[['ds','y']]) perkiraan = m.prediksi(tes) def deteksi(perkiraan): perkiraan = perkiraan[['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 = forcast ['yhat_upper']-forcast['yhat_lower'] forcast.loc[forcast['anomaly']==1, 'imp'] = forcast['nyata']-forcast['yhat_upper']/dalam_rentang forcast.loc[ forcast['anomaly']==-1, 'imp']= forcast['yhat_lower']-forcast['real']/in_range return forcast
mendeteksi (perkiraan)

Kami mengambil anomali sebagai -1.

Kesimpulan

Proses menemukan outlier dalam dataset tertentu disebut deteksi anomali. Outlier adalah objek data yang menonjol dari nilai objek lainnya dalam kumpulan data dan tidak berperilaku normal.

Tugas deteksi anomali dapat menggunakan metode pengelompokan berbasis jarak dan berbasis kepadatan untuk mengidentifikasi outlier sebagai sebuah cluster.

Kami di sini membahas berbagai metode deteksi anomali dan menjelaskannya menggunakan kode pada tiga dataset Titanic, Penumpang udara, dan Caret untuk

Poin kunci

1. Deteksi outlier atau anomali dapat dideteksi dengan menggunakan metode Box-Whisker atau dengan DBSCAN.

2. Metode Euclidean distance digunakan dengan butir-butir yang tidak berkorelasi.

3. Metode Mahalanobis digunakan dengan outlier Multivariat.

4. Semua nilai atau poin bukan outlier. Beberapa adalah suara yang seharusnya menjadi sampah. Outliers adalah data valid yang perlu disesuaikan.

5. Kami menggunakan PyCaret untuk deteksi outlier dengan menggunakan algoritme berbeda di mana anomalinya adalah satu, ditunjukkan dengan warna kuning, dan tidak ada outlier di mana outliernya adalah 0.

6. Kami menggunakan PyOD, yang merupakan pustaka deteksi Python Outlier. Ini memiliki lebih dari 40 algoritma. Teknik yang diawasi dan tidak diawasi digunakan.

7. Kami menggunakan Nabi dan mendefinisikan fungsi deteksi untuk menguraikan outlier.

Media yang ditampilkan dalam artikel ini bukan milik Analytics Vidhya dan digunakan atas kebijaksanaan Penulis.

Stempel Waktu:

Lebih dari Analisis Vidhya