Scikit Learn - Deteksi Anomali
Di sini, kita akan mempelajari tentang apa itu deteksi anomali di Sklearn dan bagaimana penggunaannya dalam identifikasi titik data.
Deteksi anomali adalah teknik yang digunakan untuk mengidentifikasi titik data dalam dataset yang tidak cocok dengan data lainnya. Ini memiliki banyak aplikasi dalam bisnis seperti deteksi penipuan, deteksi intrusi, pemantauan kesehatan sistem, pengawasan, dan pemeliharaan prediktif. Anomali, yang juga disebut pencilan, dapat dibagi menjadi tiga kategori berikut -
Point anomalies - Ini terjadi ketika contoh data individu dianggap sebagai anomali terhadap sisa data.
Contextual anomalies- Jenis anomali semacam itu adalah spesifik konteks. Ini terjadi jika contoh data anomali dalam konteks tertentu.
Collective anomalies - Ini terjadi ketika kumpulan contoh data terkait adalah seluruh kumpulan data anomali daripada nilai individual.
Metode
Dua metode yaitu outlier detection dan novelty detectiondapat digunakan untuk deteksi anomali. Penting untuk melihat perbedaan di antara mereka.
Deteksi pencilan
Data pelatihan berisi pencilan yang jauh dari data lainnya. Pencilan seperti itu didefinisikan sebagai observasi. Itulah alasannya, penduga pendeteksi pencilan selalu berusaha menyesuaikan dengan wilayah yang memiliki data pelatihan paling terkonsentrasi sambil mengabaikan pengamatan yang menyimpang. Ini juga dikenal sebagai deteksi anomali tanpa pengawasan.
Deteksi baru
Ini berkaitan dengan pendeteksian pola yang tidak teramati dalam pengamatan baru yang tidak termasuk dalam data pelatihan. Di sini, data pelatihan tidak tercemar oleh pencilan. Ini juga dikenal sebagai deteksi anomali semi-supervised.
Ada sekumpulan alat ML, yang disediakan oleh scikit-learn, yang bisa digunakan untuk deteksi pencilan serta deteksi kebaruan. Alat-alat ini pertama kali mengimplementasikan pembelajaran objek dari data secara tanpa pengawasan dengan menggunakan metode fit () sebagai berikut:
estimator.fit(X_train)
Sekarang, pengamatan baru akan diurutkan sebagai inliers (labeled 1) atau outliers (labeled -1) dengan menggunakan metode predict () sebagai berikut -
estimator.fit(X_test)
Estimator akan terlebih dahulu menghitung fungsi penilaian mentah dan kemudian metode prediksi akan menggunakan nilai ambang pada fungsi penilaian mentah tersebut. Kita dapat mengakses fungsi penilaian mentah ini dengan bantuanscore_sample metode dan dapat mengontrol ambang dengan contamination parameter.
Kami juga bisa mendefinisikan decision_function metode yang mendefinisikan pencilan sebagai nilai negatif dan inlier sebagai nilai non-negatif.
estimator.decision_function(X_test)
Algoritme Sklearn untuk Deteksi Pencilan
Mari kita mulai dengan memahami apa itu amplop elips.
Pas dengan amplop elips
Algoritma ini mengasumsikan bahwa data reguler berasal dari distribusi yang diketahui seperti distribusi Gaussian. Untuk deteksi outlier, Scikit-learn menyediakan sebuah objek bernamacovariance.EllipticEnvelop.
Objek ini cocok dengan perkiraan kovarian yang kuat untuk data, dan dengan demikian, cocok dengan elips ke titik data pusat. Ini mengabaikan titik-titik di luar mode pusat.
Parameter
Tabel berikut berisi parameter yang digunakan oleh sklearn. covariance.EllipticEnvelop metode -
Sr Tidak | Parameter & Deskripsi |
---|---|
1 | store_precision - Boolean, opsional, default = True Kami dapat menentukannya jika perkiraan presisi disimpan. |
2 | assume_centered - Boolean, opsional, default = False Jika kita menetapkannya False, itu akan menghitung lokasi dan kovarian yang kuat secara langsung dengan bantuan algoritma FastMCD. Di sisi lain, jika disetel ke True, itu akan menghitung dukungan lokasi yang kuat dan covarian. |
3 | support_fraction - float in (0., 1.), opsional, default = Tidak ada Parameter ini memberitahu metode berapa banyak proporsi poin yang akan disertakan dalam mendukung perkiraan MCD mentah. |
4 | contamination - float in (0., 1.), opsional, default = 0.1 Ini memberikan proporsi pencilan dalam kumpulan data. |
5 | random_state - int, instance RandomState atau Tidak Ada, opsional, default = tidak ada Parameter ini mewakili seed dari bilangan acak semu yang dihasilkan yang digunakan saat mengacak data. Berikut adalah pilihannya -
|
Atribut
Tabel berikut berisi atribut yang digunakan oleh sklearn. covariance.EllipticEnvelop metode -
Sr Tidak | Atribut & Deskripsi |
---|---|
1 | support_ - seperti larik, bentuk (n_sampel,) Ini mewakili topeng pengamatan yang digunakan untuk menghitung perkiraan lokasi dan bentuk yang kuat. |
2 | location_ - seperti larik, bentuk (n_features) Ini mengembalikan perkiraan lokasi kuat. |
3 | covariance_ - seperti larik, bentuk (n_features, n_features) Ini mengembalikan matriks kovarians yang diperkirakan kuat. |
4 | precision_ - seperti larik, bentuk (n_features, n_features) Ini mengembalikan matriks invers semu yang diperkirakan. |
5 | offset_ - mengapung Ini digunakan untuk menentukan fungsi keputusan dari skor mentah. decision_function = score_samples -offset_ |
Implementation Example
import numpy as np^M
from sklearn.covariance import EllipticEnvelope^M
true_cov = np.array([[.5, .6],[.6, .4]])
X = np.random.RandomState(0).multivariate_normal(mean = [0, 0], cov=true_cov,size=500)
cov = EllipticEnvelope(random_state = 0).fit(X)^M
# Now we can use predict method. It will return 1 for an inlier and -1 for an outlier.
cov.predict([[0, 0],[2, 2]])
Output
array([ 1, -1])
Hutan Isolasi
Dalam kasus set data berdimensi tinggi, satu cara efisien untuk deteksi pencilan adalah dengan menggunakan forest acak. Scikit-learn menyediakanensemble.IsolationForestmetode yang mengisolasi pengamatan dengan memilih fitur secara acak. Setelah itu, secara acak memilih nilai antara nilai maksimum dan minimum dari fitur yang dipilih.
Di sini, jumlah pemisahan yang diperlukan untuk mengisolasi sampel setara dengan panjang jalur dari simpul akar ke simpul akhir.
Parameter
Tabel berikut berisi parameter yang digunakan oleh sklearn. ensemble.IsolationForest metode -
Sr Tidak | Parameter & Deskripsi |
---|---|
1 | n_estimators - int, opsional, default = 100 Ini mewakili jumlah penduga dasar dalam ansambel. |
2 | max_samples - int atau float, opsional, default = "auto" Ini mewakili jumlah sampel yang akan diambil dari X untuk melatih setiap penduga dasar. Jika kita memilih int sebagai nilainya, itu akan menarik sampel max_samples. Jika kita memilih float sebagai nilainya, itu akan menarik sampel max_samples ∗ .shape [0]. Dan, jika kita memilih auto sebagai nilainya, itu akan menarik max_samples = min (256, n_samples). |
3 | support_fraction - float in (0., 1.), opsional, default = Tidak ada Parameter ini memberitahu metode berapa banyak proporsi poin yang akan disertakan dalam mendukung perkiraan MCD mentah. |
4 | contamination - auto atau float, opsional, default = auto Ini memberikan proporsi pencilan dalam kumpulan data. Jika kita set default yaitu auto, maka akan menentukan threshold seperti pada kertas aslinya. Jika diatur ke float, kisaran kontaminasi akan berada dalam kisaran [0,0.5]. |
5 | random_state - int, instance RandomState atau Tidak Ada, opsional, default = tidak ada Parameter ini mewakili seed dari bilangan acak semu yang dihasilkan yang digunakan saat mengacak data. Berikut adalah pilihannya -
|
6 | max_features - int atau float, opsional (default = 1.0) Ini mewakili jumlah fitur yang akan diambil dari X untuk melatih setiap penduga dasar. Jika kita memilih int sebagai nilainya, itu akan menarik fitur max_features. Jika kita memilih float sebagai nilainya, itu akan menarik sampel max_features * X.shape []. |
7 | bootstrap - Boolean, opsional (default = False) Opsi defaultnya adalah False yang berarti pengambilan sampel akan dilakukan tanpa penggantian. Dan di sisi lain, jika disetel ke True, berarti setiap pohon cocok di subset acak dari data pelatihan yang diambil sampelnya dengan penggantian. |
8 | n_jobs - int atau None, opsional (default = None) Ini mewakili jumlah pekerjaan yang akan dijalankan secara paralel fit() dan predict() metode keduanya. |
9 | verbose - int, opsional (default = 0) Parameter ini mengontrol verbositas proses pembangunan pohon. |
10 | warm_start - Bool, opsional (default = False) Jika warm_start = true, kita dapat menggunakan kembali solusi panggilan sebelumnya agar sesuai dan dapat menambahkan lebih banyak estimator ke ensembel. Tapi jika disetel ke false, kita perlu menyesuaikan dengan hutan baru. |
Atribut
Tabel berikut berisi atribut yang digunakan oleh sklearn. ensemble.IsolationForest metode -
Sr Tidak | Atribut & Deskripsi |
---|---|
1 | estimators_ - daftar DecisionTreeClassifier Menyediakan koleksi dari semua sub-estimator yang dipasang. |
2 | max_samples_ - integer Ini memberikan jumlah sebenarnya dari sampel yang digunakan. |
3 | offset_ - mengapung Ini digunakan untuk menentukan fungsi keputusan dari skor mentah. decision_function = score_samples -offset_ |
Implementation Example
Skrip Python di bawah ini akan digunakan sklearn. ensemble.IsolationForest metode untuk menyesuaikan 10 pohon pada data yang diberikan
from sklearn.ensemble import IsolationForest
import numpy as np
X = np.array([[-1, -2], [-3, -3], [-3, -4], [0, 0], [-50, 60]])
OUTDClf = IsolationForest(n_estimators = 10)
OUTDclf.fit(X)
Output
IsolationForest(
behaviour = 'old', bootstrap = False, contamination='legacy',
max_features = 1.0, max_samples = 'auto', n_estimators = 10, n_jobs=None,
random_state = None, verbose = 0
)
Faktor Pencilan Lokal
Algoritma Local Outlier Factor (LOF) adalah algoritma lain yang efisien untuk melakukan deteksi outlier pada data berdimensi tinggi. Scikit-learn menyediakanneighbors.LocalOutlierFactormetode yang menghitung skor, disebut faktor pencilan lokal, yang mencerminkan derajat anomitas pengamatan. Logika utama dari algoritma ini adalah untuk mendeteksi sampel yang memiliki kepadatan yang jauh lebih rendah daripada tetangganya. Itulah mengapa ini mengukur deviasi kepadatan lokal dari titik data yang diberikan dengan tetangganya.
Parameter
Tabel berikut berisi parameter yang digunakan oleh sklearn. neighbors.LocalOutlierFactor metode
Sr Tidak | Parameter & Deskripsi |
---|---|
1 | n_neighbors - int, opsional, default = 20 Ini mewakili jumlah tetangga yang digunakan secara default untuk kueri kneighbours. Semua sampel akan digunakan jika. |
2 | algorithm - opsional Algoritme mana yang akan digunakan untuk menghitung tetangga terdekat.
|
3 | leaf_size - int, opsional, default = 30 Nilai parameter ini dapat mempengaruhi kecepatan konstruksi dan permintaan. Ini juga mempengaruhi memori yang dibutuhkan untuk menyimpan pohon. Parameter ini diteruskan ke algoritma BallTree atau KdTree. |
4 | contamination - auto atau float, opsional, default = auto Ini memberikan proporsi pencilan dalam kumpulan data. Jika kita set default yaitu auto, maka akan menentukan threshold seperti pada kertas aslinya. Jika diatur ke float, kisaran kontaminasi akan berada dalam kisaran [0,0.5]. |
5 | metric - string atau callable, default Ini mewakili metrik yang digunakan untuk perhitungan jarak. |
6 | P - int, opsional (default = 2) Ini adalah parameter untuk metrik Minkowski. P = 1 ekivalen dengan menggunakan jarak_ manhattan yaitu L1, sedangkan P = 2 ekivalen dengan menggunakan jarak_ euclidean yaitu L2. |
7 | novelty - Boolean, (default = False) Secara default, algoritme LOF digunakan untuk deteksi outlier tetapi dapat digunakan untuk deteksi kebaruan jika kita menetapkan novelty = true. |
8 | n_jobs - int atau None, opsional (default = None) Ini mewakili jumlah pekerjaan yang akan dijalankan secara paralel untuk metode fit () dan predict () keduanya. |
Atribut
Tabel berikut berisi atribut yang digunakan oleh sklearn.neighbors.LocalOutlierFactor metode -
Sr Tidak | Atribut & Deskripsi |
---|---|
1 | negative_outlier_factor_ - larik numpy, bentuk (n_sampel,) Memberikan LOF yang berlawanan dari sampel pelatihan. |
2 | n_neighbors_ - integer Ini memberikan jumlah sebenarnya dari tetangga yang digunakan untuk kueri tetangga. |
3 | offset_ - mengapung Ini digunakan untuk menentukan label biner dari skor mentah. |
Implementation Example
Skrip Python yang diberikan di bawah ini akan digunakan sklearn.neighbors.LocalOutlierFactor metode untuk membangun kelas NeighboursClassifier dari array apa pun yang sesuai dengan kumpulan data kami
from sklearn.neighbors import NearestNeighbors
samples = [[0., 0., 0.], [0., .5, 0.], [1., 1., .5]]
LOFneigh = NearestNeighbors(n_neighbors = 1, algorithm = "ball_tree",p=1)
LOFneigh.fit(samples)
Output
NearestNeighbors(
algorithm = 'ball_tree', leaf_size = 30, metric='minkowski',
metric_params = None, n_jobs = None, n_neighbors = 1, p = 1, radius = 1.0
)
Example
Sekarang, kita bisa bertanya dari pengklasifikasi yang dibangun ini adalah titik lemari ke [0.5, 1., 1.5] dengan menggunakan skrip python berikut -
print(neigh.kneighbors([[.5, 1., 1.5]])
Output
(array([[1.7]]), array([[1]], dtype = int64))
SVM Satu Kelas
SVM Satu-Kelas, yang diperkenalkan oleh Schölkopf et al., Adalah Deteksi Outlier tanpa pengawasan. Ini juga sangat efisien dalam data dimensi tinggi dan memperkirakan dukungan dari distribusi dimensi tinggi. Ini diterapkan diSupport Vector Machines modul di Sklearn.svm.OneClassSVMobyek. Untuk menentukan frontier, diperlukan kernel (yang paling banyak digunakan adalah RBF) dan parameter skalar.
Untuk pemahaman yang lebih baik, mari menyesuaikan data kita dengan svm.OneClassSVM objek -
Contoh
from sklearn.svm import OneClassSVM
X = [[0], [0.89], [0.90], [0.91], [1]]
OSVMclf = OneClassSVM(gamma = 'scale').fit(X)
Sekarang, kita bisa mendapatkan score_samples untuk input data sebagai berikut -
OSVMclf.score_samples(X)
Keluaran
array([1.12218594, 1.58645126, 1.58673086, 1.58645127, 1.55713767])