Novelty detection mungkin lebih jarang terdengar dibandingkan dengan outlier detection. Jika outlier detection bertujuan menemukan anomali atau data yang sangat berbeda dalam dataset, novelty detection bertujuan untuk menentukan apakah data baru atau data tidak dikenal merupakan outlier atau bukan.
Novelty detection adalah semi-supervised analysis karena kita melatih data yang tidak terkontaminasi oleh outlier, dan kita tertarik untuk mendeteksi apakah data baru adalah outlier dengan menggunakan mod
el yang telah dilatih. Dalam konteks ini, outlier juga disebut novelty.
Dalam artikel ini, saya akan menjelaskan cara melakukan novelty detection menggunakan Local Outlier Factor (LOF). Namun, jika Anda ingin melewatkan semua teori dan langsung ke bagian pemrograman, lewati saja bagian berikut ini.
Local Outlier Factor (LOF)
Local Outlier Factor atau LOF adalah algoritma yang diusulkan oleh Breunig et al. (2000). Konsepnya sederhana; algoritma ini mencoba menemukan titik data anomali dengan cara mengukur deviasi lokal dari titik data tertentu terhadap tetangganya. Dalam algoritma ini, LOF akan menghasilkan skor yang menunjukkan apakah data kita outlier atau tidak.
LOF(k) ~ =1 berarti kepadatan yang mirip dengan tetangga.
LOF(k) < 1 berarti kepadatan lebih tinggi daripada tetangga (Inlier/tidak termasuk outlier).
LOF(k) > 1 berarti kepadatan lebih rendah daripada tetangga (Outlier).
Dalam persamaan di atas, saya memperkenalkan parameter k. Dalam algoritma LOF, Locality diberikan oleh k-nearest neighbors, yang jaraknya digunakan untuk memperkirakan kepadatan lokal. Jarak ini kemudian digunakan untuk mengukur deviasi lokal dan menentukan anomali.
Parameter k adalah parameter yang kita atur untuk mendapatkan k-distance. K-distance adalah jarak dari sebuah titik ke tetangga ke-k. Jika k=4, k-distance adalah jarak dari sebuah titik ke titik terdekat keempat. Jarak itu sendiri adalah metrik perhitungan jarak yang bisa kita pilih. Seringkali itu adalah ‘Euclidean,’ tetapi Anda bisa memilih jarak lain.
Setiap titik data dalam dataset kita akan diukur untuk k-distance dalam rangka mengukur langkah berikutnya.
Jarak ini sekarang digunakan untuk mendefinisikan apa yang kita sebut reachability distance. Pengukuran jarak ini bisa berupa jarak maksimum dari dua titik atau jarak-k dari titik kedua. Secara formal, reachability distance diukur dengan persamaan di bawah ini.
reachability-distance k(A,B) = max{k-distance(B), d(A,B)}
Di mana A dan B adalah titik data, dan reachability distance antara A dan B adalah jarak maksimum dari k-distance B atau jarak antara A dan B. jika titik A berada dalam k-neighbors dari titik B, maka reachability-distance k(A, B) adalah k-distance dari B. Jika tidak, itu adalah jarak antara A dan B.
Selanjutnya, kita akan mengukur local reachability density (lrd) dengan menggunakan reachability distance. Persamaan untuk mengukur lrd adalah sebagai berikut.
lrd(A) = 1/(sum(reacheable-distance(A,i))/k)
Di mana i adalah neighbors dari titik A (titik di mana A dapat “dicapai” dari tetangganya), untuk mendapatkan lrd untuk titik A, kita menghitung jumlah reachability distance A ke semua tetangga terdekat ke-nya dan mengambil rata-ratanya. lrd kemudian adalah kebalikan dari rata-rata tersebut. Konsep LOF adalah tentang kepadatan, dan oleh karena itu jika jarak ke tetangga berikutnya lebih panjang, titik tertentu berada di area yang lebih jarang. Maka, semakin jarang — semakin kecil kerapatannya.
Di sini, lrd menunjukkan seberapa jauh titik tersebut harus bergerak untuk mencapai titik atau kelompok titik berikutnya. Semakin rendah lrd berarti semakin jauh titik tersebut harus bergerak, dan semakin jarang kelompok tersebut.
Local reachability densities kemudian dibandingkan dengan tetangga lain dengan persamaan berikut.
Lrd setiap titik dibandingkan dengan lrd tetangga mereka. LOF adalah rasio rata-rata dari lrd tetangga A terhadap lrd A. Jika rasio lebih besar dari 1, kerapatan titik A lebih kecil dari kerapatan tetangganya. Artinya, dari titik A, perlu menempuh jarak yang lebih panjang untuk mencapai titik atau kelompok berikutnya daripada dari tetangga A ke tetangga mereka berikutnya.
LOF menunjukkan kerapatan titik dibandingkan dengan kerapatan tetangganya. Jika kerapatan suatu titik lebih kecil daripada kerapatan tetangganya (LOF > 1), maka dianggap sebagai outlier karena titik tersebut lebih jauh dari area yang padat.
Keunggulan dari algoritma LOF adalah kemampuannya untuk bekerja dengan baik bahkan pada kumpulan data di mana sampel abnormal memiliki kepadatan dasar yang berbeda. Hal ini dikarenakan LOF tidak hanya melihat seberapa terisolasinya suatu sampel, tetapi seberapa terisolasinya sampel tersebut dibandingkan dengan lingkungan sekitarnya.
Novelty Detection via LOF
Kita akan menggunakan LOF yang disediakan oleh scikit-learn untuk melatih model kita.
#import modul
import pandas as pd
import seaborn as sns
from sklearn.neighbors import LocalOutlierFactor
#import dataset, disini saya menggunakan dataset mpg
mpg = sns.load_dataset('mpg')
Sebagai pengenalan, mari coba menggunakan LOF sebagai model Outlier Detection sebelum menggunakan model tersebut untuk Novelty Detection.
#Menyiapkan model. K diatur dengan meneruskan parameter n_neighbors dengan bilangan bulat. 20 sering kali dianggap sudah baik untuk mendeteksi outlier. Secara default, metrik jarak adalah jarak Euclidean.
lof = LocalOutlierFactor(n_neighbors = 20)
#Melatih model, saya menghapus beberapa kolom yang bukan merupakan variabel kontinu
mpg['lof'] = lof.fit_predict(mpg.drop(['cylinders', 'model_year', 'origin', 'name'], axis = 1))
#Menentukan skor LOF negatif
mpg['negative_outlier_factor'] = lof.negative_outlier_factor_
mpg
Berikut adalah hasilnya, di mana kita mendapatkan klasifikasi LOF dan skor LOF negatif. Jika LOF sama dengan 1, maka dianggap sebagai inlier (bukan outlier); jika -1, maka itu adalah outlier. Mari kita coba mendapatkan semua data outlier.
g[mpg['lof'] == -1]
Outlier bergantung pada skor LOF. Secara default, jika skor negative_outlier_score kurang dari -1,5, maka dianggap sebagai outlier.
Sekarang, mari kita coba menggunakan model untuk Novelty Detection. Kita perlu melatih model sekali lagi karena ada parameter tambahan yang perlu kita berikan.
#Untuk novelty detection, kita perlu menentukan novelty parameter = True
lof = LocalOutlierFactor(n_neighbors = 20, novelty = True)
lof.fit(mpg.drop(['cylinders', 'model_year', 'origin', 'name'], axis = 1))
Kita hanya melatih modelnya, dan kita tidak akan menggunakan data training sama sekali untuk memprediksi data. Di sini kita akan mencoba memprediksi data baru yang belum terlihat.
#Prediksi data acak baru yang tidak terlihat, dimensinya harus sesuai dengan data pelatihan
lof.predict(np.array([109, 310, 190, 3411, 15]).reshape(1,-1))
Out: array([1])
Hasilnya akan berupa 1 atau -1, tergantung apakah itu outlier atau bukan. Jika Anda ingin mendapatkan skor LOF negatif, kita juga bisa melakukannya dengan kode berikut.
lof.score_samples(np.array([109, 310, 190, 3411, 15]).reshape(1,-1))
Out: array([-1.34887042])
Hasilnya akan berupa skor dalam bentuk array. Saya telah menunjukkan cara melakukan novelty detection sederhana dengan LOF.
Kesimpulan
Novelty Detection adalah kegiatan untuk mendeteksi apakah data baru yang belum terlihat adalah outlier atau bukan. Local Outlier Factor adalah algoritma yang digunakan untuk Outlier Detection dan Novelty Detection. Itu tergantung pada parameter k yang kita berikan. Seringkali menggunakan k = 20 , tetapi jika Anda merasa data memiliki jumlah outlier yang lebih tinggi, Anda bisa meningkatkan angkanya.
Semoga bermanfaat.
Comments