Panduan Isolation Forest: Penjelasan dan Implementasi Python
Isolation Forest adalah algoritma machine learning unsupervised yang mengidentifikasi anomali atau outlier dalam data dengan mengisolasinya melalui proses pemartisian acak dalam sekumpulan pohon keputusan.
“Kami menahan kartu Anda. Apakah transaksi sebesar [amount] di [vendor] milik Anda?”
Untungnya, itu memang saya yang berbelanja online di jam yang tidak masuk akal, tetapi hal itu membuat saya berpikir… bagaimana bank menandai transaksi mencurigakan di antara ratusan ribu transaksi yang mereka proses setiap hari?
Mengidentifikasi penipuan adalah kasus khusus dari masalah yang lebih luas dalam machine learning (ML) yang disebut deteksi anomali. Meskipun ada banyak metode untuk menyelesaikan masalah ini, dalam blog ini kita akan berfokus pada salah satu yang paling populer: Isolation Forest.
Deteksi Anomali dalam Praktik
Memerangi penipuan, mempertahankan jaringan, menemukan outlier, dan menandai peralatan yang bermasalah mungkin tampak seperti masalah yang berbeda. Namun, semuanya memiliki satu kesamaan—tidak ada label atau definisi yang jelas tentang apa yang merupakan anomali. Dalam banyak kasus, anomali itu langka dan halus, sehingga sulit diidentifikasi di tengah sejumlah besar data normal.
Salah satu cara mengembangkan sistem deteksi anomali adalah dengan menggunakan ML prediktif. Misalnya, kita dapat mengumpulkan transaksi penipuan. Lalu, menggunakan fitur seperti jumlah transaksi, waktu, lokasi, dan jenis merchant, kita dapat membangun model yang membedakan ini dari transaksi normal. Masalahnya, pendekatan ini hanya memungkinkan kita mendeteksi kasus penipuan yang serupa dengan yang pernah kita lihat sebelumnya.
Pelaku penipuan sering mengubah strategi mereka dan mencoba cara baru untuk melakukan penipuan. Banyak dari strategi ini benar-benar tidak terduga. Inilah sebabnya mengapa metode unsupervised sering digunakan untuk mendeteksi anomali. Mereka bekerja dengan membandingkan semua transaksi dan mengidentifikasi yang memiliki nilai fitur tidak biasa. Pentingnya, ini berarti kita tidak perlu memberi label pada transaksi mana pun sebelumnya.
Penipuan bukan satu-satunya perilaku yang sulit diklasifikasikan. Dalam manufaktur, mesin dapat gagal kapan saja dengan berbagai cara yang tidak terduga. Dalam keamanan siber, serangan baru terus ditemukan dan ditambal. Dalam kedokteran, masalah kesehatan langka dapat tersembunyi di antara banyak hasil tes. Penerapannya tak terhitung, jadi mari kita lihat bagaimana salah satu pendekatan unsupervised untuk mendeteksi anomali ini bekerja.
Apa Itu Isolation Forest?
Jika Anda belum menebaknya dari namanya, Isolation Forest adalah metode berbasis pohon. Metode ini mirip dengan Random Forest. Namun, blok bangun dasarnya berbeda.
Random Forest menggunakan pohon keputusan yang dibuat dengan pemisahan berdasarkan gini impurity. Ini membutuhkan variabel target sehingga, sebagai gantinya, Isolation Forest menggunakan Isolation Tree. Metode ini menggunakan kumpulan pohon tersebut untuk menghitung skor anomali bagi setiap instance.
Isolation Tree
Ada baiknya memahami bagaimana blok bangun dasar ini bekerja sebelum kita menghitung skor anomali. Misalkan kita mencoba mendeteksi transaksi penipuan. Untuk menyederhanakan, kita akan menilai 1000 transaksi (instance) dan mempertimbangkan dua variabel dari dataset kita: jumlah (x1) dan waktu transaksi (x2).
Untuk membuat sebuah Isolation Tree, kita mulai dengan semua atau sampel instance di node akar. Pada Gambar 1 di bawah, Anda dapat melihat kita memiliki sampel 256 instance (lebih lanjut tentang angka itu nanti).
Gambar 1: Isolation Tree dibuat menggunakan pemisahan acak rekursif. Jumlah instance di setiap node ditampilkan.
Kita lalu:
Memilih fitur secara acak (baik x1 atau x2).
Memilih nilai split secara acak dalam rentang fitur terpilih untuk instance yang saat ini berada di node.
Membagi data menjadi dua child node berdasarkan nilai split.
Mengulangi proses ini secara rekursif untuk setiap child node hingga salah satu kondisi berikut terpenuhi:
Setiap leaf node hanya memiliki satu instance.
Kedalaman maksimum yang telah ditentukan tercapaid.
Perhatikan bahwa rentang fitur akan berubah pada setiap langkah. Artinya, kita menggunakan nilai minimum dan maksimum fitur untuk instance pada node tersebut. Penyesuaian dinamis ini memastikan pemisahan bermakna dan node tidak berakhir tanpa instance.
Gambar 2 di bawah memberi kita intuisi mengapa proses ini mengisolasi outlier. Instance A, B, dan C tampak berbeda dari transaksi lainnya.
Gambar 2: Scatter plot transaksi
B kemungkinan besar akan terisolasi terlebih dahulu karena dapat dipisahkan dari transaksi lain menggunakan satu pemisahan dari salah satu fitur.
A akan membutuhkan satu pemisahan darix2.
C mungkin membutuhkan waktu lebih lama karena Anda perlu mengisolasinya menggunakan kedua fitur. Artinya, C memiliki jumlah dan waktu yang normal tetapi bukan jumlah yang normal untuk waktu tersebut.
Kita mungkin beruntung dan mengisolasi salah satu instance ini pada percobaan pertama. Kemungkinan besar, ini akan membutuhkan beberapa percobaan. Poin pentingnya adalah, rata-rata,B akan membutuhkan lebih sedikit pemisahan dibanding A, A lebih sedikit pemisahan dibanding C, dan ketiga titik akan membutuhkan lebih sedikit pemisahan dibanding transaksi lainnya. Tetapi bagaimana kita menangkap perilaku rata-rata ini?
Menghitung skor anomali
Jumlah pemisahan yang diperlukan untuk mengisolasi anomali menentukan panjang lintasan ke leaf node instance. Ketika hutan Isolation Tree secara konsisten menghasilkan panjang lintasan yang lebih pendek untuk sampel tertentu, sampel tersebut kemungkinan merupakan anomali. Kita menangkap perilaku rata-rata ini dengan mengagregasikan panjang lintasan di semua pohon, sebuah proses yang dikenal sebagai menghitung skor anomali.
Untuk menghitung skor anomali bagi sebuah instance x, kita terlebih dahulu perlu mendefinisikan beberapa nilai:
Panjang lintasan,h(x), adalah jumlah edge (pemisahan) yang harus dilalui untuk mencapai leaf node dari instance tersebut. Jika kita sekadar mengambil rata-rata, E[h(x)], akan menimbulkan masalah. Ini karena pohon yang lebih besar dengan lebih banyak instance akan cenderung memiliki panjang lintasan yang lebih besar. Ini benar bahkan untuk anomali. Untuk mengatasinya, kita memerlukan nilai normalisasi berdasarkan ukuran sampel n:
Nilai ini berasal dari teori Binary Search Tree (BST). Ini memberikan rata-rata panjang lintasan dari pencarian yang tidak berhasil di BST. Karena Isolation Tree memiliki struktur yang setara dengan BST, kita mengambil c(n) sebagai ekspektasi panjang lintasan untuk sebuah instance (anomali atau bukan). Perhatikan nilai ini perlu disesuaikan jika kita menetapkan kedalaman maksimum pohon.
Akhirnya, kita dapat menghitung skor anomali s(x,n):
Skor berada di antara 0 dan 1, dan saat menafsirkan, kita perlu mempertimbangkan tiga skenario:
Jika sebuah titik adalah anomali maka E[h(x)] < c(n) dan s → 1
Jika sebuah titik bukan anomali maka E[h(x)] > c(n) dan s → 0
Jika E[h(x)] = c(n) maka s = 0,5
Dengan kata lain, ketika rata-rata panjang lintasan sebuah instance lebih pendek daripada ekspektasi panjang lintasan rata-rata, skor anomali akan lebih mendekati 1. Namun, seperti yang akan kita lihat saat mengimplementasikan metode ini, paket Scikit-learn melakukan penyesuaian lebih lanjut pada skor.
Implementasi Isolation Forest dengan Python dan Scikit-learn
Mari kita lakukan implementasi selangkah demi selangkah dan mulai dengan impor.
Impor
Kita menggunakan paket Python standar untuk penanganan data dan visualisasi (baris 2-5). Kita juga menggunakan implementasi Isolation Forest dari Scikit-learn (baris 7) dan paket terakhir digunakan untuk mengimpor dataset kita (baris 8).
# Importsimport pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.ensemble import IsolationForest
from ucimlrepo import fetch_ucirepoDidukung oleh
Dataset
Kita memuat data langsung dari UCI machine learning repository. Kita menggunakan dataset Air Quality (CC BY 4.0), yang berisi 9.358 instance pengukuran kualitas udara dari sebuah sensor di sebuah kota Italia. Dalam konteks dataset ini, anomali dapat dianggap sebagai pembacaan sensor yang menunjukkan tingkat polusi yang sangat tinggi.
# Fetch dataset from UCI repository
air_quality = fetch_ucirepo(id=360)Didukung oleh
Pembersihan data
Kita melakukan sedikit pembersihan data sebelum menerapkan model. Kita mulai dengan memilih semua fitur dari dataset (baris 2) lalu memilih subset 4 fitur (baris 5). Ini semua merupakan ukuran berbagai bahan kimia logam oksida di udara (yaitu polutan). Kita kemudian menghapus baris yang memiliki nilai hilang (baris 8-9). Pada akhirnya, kita memiliki 6.941 instance dan Anda dapat melihat cuplikan himpunan fitur di bawah.
# Convert to DataFrame
data = air_quality.data.features
# Select features
features = data[['CO(GT)','C6H6(GT)','NOx(GT)','NO2(GT)']]# Drop rows with missing values (-200)
features = features.replace(-200, np.nan)
features = features.dropna()print(features.shape)
features.head()Didukung oleh
Menetapkan parameter pelatihan
Hal terakhir yang perlu dilakukan adalah menetapkan parameter yang digunakan untuk melatih Isolation Forest. Dalam kasus ini, kita akan menggunakan tiga nilai di bawah:
n_estimators adalah jumlah Isolation Tree yang digunakan dalam ensemble. Nilai 100 digunakan dalam makalah Isolation Forest. Melalui eksperimen, para peneliti menemukan nilai ini menghasilkan hasil yang baik pada berbagai dataset.
contamination adalah persentase titik data yang kita perkirakan merupakan anomali.
sample_size adalah jumlah instance yang digunakan untuk melatih setiap Isolation Tree. Nilai 256 umum digunakan karena memungkinkan kita menghindari penggunaan kriteria penghentian ukuran pohon maksimum. Ini karena kita dapat memperkirakan ukuran pohon maksimum yang wajar sebesar log(256) = 8.
Nilai contamination tidak memiliki justifikasi yang kuat seperti nilai lainnya. Nilai ini bisa berasal dari pengalaman sebelumnya. Misalkan dalam analisis sebelumnya kita menemukan 1% pembacaan menunjukkan tingkat polusi tinggi. Ini juga bisa berasal dari keterbatasan sumber daya. Misalnya, saat menganalisis transaksi penipuan Anda mungkin hanya memiliki cukup waktu untuk menganalisis lebih lanjut 5% dari semua transaksi. Saat kita memvisualisasikan skor anomali, kita akan melihat bagaimana skor disesuaikan menggunakan nilai contamination ini.
# Parameters
n_estimators =100# Number of trees
contamination =0.01# Expected proportion of anomalies
sample_size =256# Number of samples used to train each treeDidukung oleh
Melatih Isolation Forest
Akhirnya, kita dapat melatih Isolation Forest. Jika Anda familier dengan Sklearn, maka proses ini seharusnya terlihat familier. Kita menginisialisasi model menggunakan parameter yang dibahas di atas (baris 2-5). Lalu kita melatih model pada himpunan fitur kita (baris 6).
decision_function akan menghitung skor anomali dengan cara yang mirip dengan yang kita bahas di bagian teori.
predictakan memberikan label biner berdasarkan nilai contamination. Dalam kasus kita, 1% instance dengan skor anomali terburuk akan diberi nilai -1. Instance lainnya diberi nilai 1.
Kita menambahkan keluaran dari fungsi-fungsi ini ke dataset kita (baris 2-4). Saat kita menghitung nilai anomali (baris 6) kita melihat bahwa 70 instance diberi label sebagai anomali.
# Calculate anomaly scores and classify anomalies
data = data.loc[features.index].copy()
data['anomaly_score']= iso_forest.decision_function(features)
data['anomaly']= iso_forest.predict(features)
data['anomaly'].value_counts()Didukung oleh
Kita dapat melangkah lebih jauh dan memvisualisasikan semua skor anomali. Kita lakukan ini menggunakan kode di bawah:
# Visualization of the results
plt.figure(figsize=(10,5))# Plot normal instances
normal = data[data['anomaly']==1]
plt.scatter(normal.index, normal['anomaly_score'], label='Normal')# Plot anomalies
anomalies = data[data['anomaly']==-1]
plt.scatter(anomalies.index, anomalies['anomaly_score'], label='Anomaly')
plt.xlabel("Instance")
plt.ylabel("Anomaly Score")
plt.legend()
plt.show()Didukung oleh
Sebanyak 70 instance dengan skor anomali terendah ditampilkan dalam warna oranye. Ini adalah anomali potensial kita dan langkah berikutnya adalah menyelidikinya lebih lanjut.
Pada titik ini, Anda mungkin sedikit bingung. Bukankah kita mengatakan bahwa skor yang mendekati 1 menunjukkan potensi anomali?
Skor yang Anda lihat pada scatter plot di atas telah disesuaikan. Untuk melakukannya, paket terlebih dahulu menghitung sebuah offset. Ini adalah persentil skor anomali berdasarkan nilai contamination. Dalam kasus kita, offset akan menjadi persentil 0,99. Skor akhir kemudian diberikan oleh offset - score. Dengan demikian, semua skor di bawah 0 menyiratkan potensi anomali.
Analisis lebih lanjut
Dengan menggunakan scatter plot di atas, kita dapat mengidentifikasi anomali potensial. Namun, ini tidak memberi tahu kita mengapa data tersebut diklasifikasikan sebagai anomali. Untuk itu kita perlu melakukan analisis lebih lanjut.
Sebagai contoh, pada kode di bawah kita membuat scatter plot dari semua instance dengan memplot nilai CO(GT) mereka vs. nilai NO2(GT) mereka. Kita juga memberi warna pada titik berdasarkan apakah mereka diklasifikasikan sebagai anomali.
# Visualization of the results
plt.figure(figsize=(5,5))# Plot non-anomalies then anomalies
plt.scatter(normal['CO(GT)'], normal['NO2(GT)'], label='Normal')
plt.scatter(anomalies['CO(GT)'], anomalies['NO2(GT)'], label='Anomaly')
plt.xlabel("CO(GT)")
plt.ylabel("NO2(GT)")
plt.legend()
plt.show()Didukung oleh
Dengan menggunakan plot ini, kita dapat melihat bahwa pengukuran polutan CO(GT) sangat penting. Perhatikan bahwa banyak anomali memiliki nilai lebih besar dari 6 untuk fitur ini. Namun, ini tidak menjelaskan semua anomali. Beberapa memiliki nilai tinggi untuk kedua fitur dan yang lain tampaknya bukan anomali karena salah satu fitur dalam plot ini. Ini menunjukkan bahwa polutan lain juga berkontribusi pada klasifikasi.
Kelebihan Isolation Forest
Ini membawa kita ke kelebihan utama Isolation Forest dibanding metode deteksi anomali lain. Pertama, metode ini mampu menangani data berdimensi tinggi. Seperti yang kita lihat di atas, instance dapat ditandai sebagai anomali menggunakan semua fitur, dan metode ini dapat bekerja dengan baik pada jauh lebih dari empat fitur. Kelebihan kunci lainnya adalah dapat menemukan anomali dari berbagai tipe.
Sebagai perbandingan, metode deteksi anomali sederhana adalah z-score. Menggunakan fitur individual, metode ini akan mengklasifikasikan anomali berdasarkan seberapa jauh nilai fitur dari rata-ratanya. Namun, ini hanya satu tipe anomali. Pendekatan ini juga mengasumsikan fitur memiliki distribusi normal dan mengharuskan kita menilai z-score untuk setiap fitur dalam dataset kita.
Dengan Isolation Forest, kita tidak membuat asumsi tentang distribusi fitur. Hasilnya, kita dapat menemukan instance yang menjadi anomali karena alasan lain selain jauh dari rata-rata. Seperti yang kita lihat, kita juga dapat melakukan klasifikasi menggunakan semua fitur secara bersamaan. Ini dapat sangat menyederhanakan analisis kita, terutama dengan dataset besar.
Pertimbangan lainnya adalah Isolation Forest memiliki kompleksitas waktu linear dan bersifat unsupervised. Ini menjadikannya metode ideal untuk mendeteksi anomali tanpa pengetahuan awal pada dataset besar. Hal ini sering terjadi dalam aplikasi dunia nyata seperti deteksi penipuan, di mana tipe penipuan baru terus bermunculan di tengah lautan transaksi normal.
Keterbatasan Isolation Forest
Salah satu keterbatasan Isolation Forest yang patut dicatat adalah mungkin tidak berkinerja baik pada dataset kecil. Ini terkait dengan proses acak dalam pembuatan Isolation Tree. Selalu ada kemungkinan instance normal memiliki lintasan pendek atau, sebaliknya, anomali memiliki lintasan lebih panjang. Dengan dataset kecil, hal ini lebih mungkin terjadi. Dengan kata lain, agar Isolation Forest bekerja, kita memerlukan data yang cukup untuk merata-ratakan keacakan.
Keterbatasan lainnya, seperti yang telah kita lihat, adalah Isolation Forest hanya dapat mengidentifikasi potensi anomali. Metode ini tidak memberi tahu kita mengapa instance tertentu dianggap anomali. Untuk itu, kita perlu melakukan analisis lebih lanjut. Kini, kelebihan dalam mengidentifikasi anomali kompleks akan menjadi tantangan. Pada akhirnya, dibutuhkan banyak pekerjaan dan pengetahuan domain untuk sepenuhnya menjelaskan sebuah anomali.
Kesimpulan
Kita telah mengeksplorasi Isolation Forest, alat yang kuat untuk deteksi anomali di berbagai domain. Kita telah melihat bagaimana pendekatan uniknya—mengisolasi anomali melalui pemartisian acak—memberikan kelebihan dibanding metode tradisional: menangani data berdimensi tinggi, mengidentifikasi pola anomali yang kompleks, dan memastikan skalabilitas.
Contoh praktis menggunakan Python dan Scikit-learn menunjukkan kemudahan penggunaannya.
Meskipun Isolation Forest dapat secara efektif mengidentifikasi anomali potensial tanpa pengetahuan awal, metode ini juga memiliki keterbatasan, khususnya saat berhadapan dengan dataset yang lebih kecil dan ketidakmampuannya menjelaskan mengapa instance tertentu dianggap anomali.
Conor sedang menempuh studi PhD di bidang machine learning untuk pemantauan pesisir. Ia juga memiliki pengalaman bekerja sebagai data scientist di industri perbankan dan manufaktur semikonduktor.
Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Baru-baru ini saya menerima pesan dari bank saya:
“Kami menahan kartu Anda. Apakah transaksi sebesar [amount] di [vendor] milik Anda?”
Untungnya, itu memang saya yang berbelanja online di jam yang tidak masuk akal, tetapi hal itu membuat saya berpikir… bagaimana bank menandai transaksi mencurigakan di antara ratusan ribu transaksi yang mereka proses setiap hari?
Mengidentifikasi penipuan adalah kasus khusus dari masalah yang lebih luas dalam machine learning (ML) yang disebut deteksi anomali. Meskipun ada banyak metode untuk menyelesaikan masalah ini, dalam blog ini kita akan berfokus pada salah satu yang paling populer: Isolation Forest.
Deteksi Anomali dalam Praktik
Memerangi penipuan, mempertahankan jaringan, menemukan outlier, dan menandai peralatan yang bermasalah mungkin tampak seperti masalah yang berbeda. Namun, semuanya memiliki satu kesamaan—tidak ada label atau definisi yang jelas tentang apa yang merupakan anomali. Dalam banyak kasus, anomali itu langka dan halus, sehingga sulit diidentifikasi di tengah sejumlah besar data normal.
Salah satu cara mengembangkan sistem deteksi anomali adalah dengan menggunakan ML prediktif . Misalnya, kita dapat mengumpulkan transaksi penipuan. Lalu, menggunakan fitur seperti jumlah transaksi, waktu, lokasi, dan jenis merchant, kita dapat membangun model yang membedakan ini dari transaksi normal. Masalahnya, pendekatan ini hanya memungkinkan kita mendeteksi kasus penipuan yang serupa dengan yang pernah kita lihat sebelumnya.
Pelaku penipuan sering mengubah strategi mereka dan mencoba cara baru untuk melakukan penipuan. Banyak dari strategi ini benar-benar tidak terduga. Inilah sebabnya mengapa metode unsupervised sering digunakan untuk mendeteksi anomali. Mereka bekerja dengan membandingkan semua transaksi dan mengidentifikasi yang memiliki nilai fitur tidak biasa. Pentingnya, ini berarti kita tidak perlu memberi label pada transaksi mana pun sebelumnya.
Penipuan bukan satu-satunya perilaku yang sulit diklasifikasikan. Dalam manufaktur, mesin dapat gagal kapan saja dengan berbagai cara yang tidak terduga. Dalam keamanan siber, serangan baru terus ditemukan dan ditambal. Dalam kedokteran, masalah kesehatan langka dapat tersembunyi di antara banyak hasil tes. Penerapannya tak terhitung, jadi mari kita lihat bagaimana salah satu pendekatan unsupervised untuk mendeteksi anomali ini bekerja.
Apa Itu Isolation Forest?
Jika Anda belum menebaknya dari namanya, Isolation Forest adalah metode berbasis pohon. Metode ini mirip dengan Random Forest. Namun, blok bangun dasarnya berbeda.
Random Forest menggunakan pohon keputusan yang dibuat dengan pemisahan berdasarkan gini impurity. Ini membutuhkan variabel target sehingga, sebagai gantinya, Isolation Forest menggunakan Isolation Tree. Metode ini menggunakan kumpulan pohon tersebut untuk menghitung skor anomali bagi setiap instance.
Isolation Tree
Ada baiknya memahami bagaimana blok bangun dasar ini bekerja sebelum kita menghitung skor anomali. Misalkan kita mencoba mendeteksi transaksi penipuan. Untuk menyederhanakan, kita akan menilai 1000 transaksi (instance) dan mempertimbangkan dua variabel dari dataset kita: jumlah (x1) dan waktu transaksi (x2).
Untuk membuat sebuah Isolation Tree, kita mulai dengan semua atau sampel instance di node akar. Pada Gambar 1 di bawah, Anda dapat melihat kita memiliki sampel 256 instance (lebih lanjut tentang angka itu nanti).
Gambar 1: Isolation Tree dibuat menggunakan pemisahan acak rekursif. Jumlah instance di setiap node ditampilkan.
Kita lalu:
Perhatikan bahwa rentang fitur akan berubah pada setiap langkah. Artinya, kita menggunakan nilai minimum dan maksimum fitur untuk instance pada node tersebut. Penyesuaian dinamis ini memastikan pemisahan bermakna dan node tidak berakhir tanpa instance.
Gambar 2 di bawah memberi kita intuisi mengapa proses ini mengisolasi outlier. Instance A, B, dan C tampak berbeda dari transaksi lainnya.
Gambar 2: Scatter plot transaksi
B kemungkinan besar akan terisolasi terlebih dahulu karena dapat dipisahkan dari transaksi lain menggunakan satu pemisahan dari salah satu fitur.
A akan membutuhkan satu pemisahan dari x2.
C mungkin membutuhkan waktu lebih lama karena Anda perlu mengisolasinya menggunakan kedua fitur. Artinya, C memiliki jumlah dan waktu yang normal tetapi bukan jumlah yang normal untuk waktu tersebut.
Kita mungkin beruntung dan mengisolasi salah satu instance ini pada percobaan pertama. Kemungkinan besar, ini akan membutuhkan beberapa percobaan. Poin pentingnya adalah, rata-rata, B akan membutuhkan lebih sedikit pemisahan dibanding A, A lebih sedikit pemisahan dibanding C, dan ketiga titik akan membutuhkan lebih sedikit pemisahan dibanding transaksi lainnya. Tetapi bagaimana kita menangkap perilaku rata-rata ini?
Menghitung skor anomali
Jumlah pemisahan yang diperlukan untuk mengisolasi anomali menentukan panjang lintasan ke leaf node instance. Ketika hutan Isolation Tree secara konsisten menghasilkan panjang lintasan yang lebih pendek untuk sampel tertentu, sampel tersebut kemungkinan merupakan anomali. Kita menangkap perilaku rata-rata ini dengan mengagregasikan panjang lintasan di semua pohon, sebuah proses yang dikenal sebagai menghitung skor anomali.
Untuk menghitung skor anomali bagi sebuah instance x, kita terlebih dahulu perlu mendefinisikan beberapa nilai:
Panjang lintasan, h(x), adalah jumlah edge (pemisahan) yang harus dilalui untuk mencapai leaf node dari instance tersebut. Jika kita sekadar mengambil rata-rata, E[h(x)], akan menimbulkan masalah. Ini karena pohon yang lebih besar dengan lebih banyak instance akan cenderung memiliki panjang lintasan yang lebih besar. Ini benar bahkan untuk anomali. Untuk mengatasinya, kita memerlukan nilai normalisasi berdasarkan ukuran sampel n:
Nilai ini berasal dari teori Binary Search Tree (BST). Ini memberikan rata-rata panjang lintasan dari pencarian yang tidak berhasil di BST. Karena Isolation Tree memiliki struktur yang setara dengan BST, kita mengambil c(n) sebagai ekspektasi panjang lintasan untuk sebuah instance (anomali atau bukan). Perhatikan nilai ini perlu disesuaikan jika kita menetapkan kedalaman maksimum pohon.
Akhirnya, kita dapat menghitung skor anomali s(x,n):
Dengan kata lain, ketika rata-rata panjang lintasan sebuah instance lebih pendek daripada ekspektasi panjang lintasan rata-rata, skor anomali akan lebih mendekati 1. Namun, seperti yang akan kita lihat saat mengimplementasikan metode ini, paket Scikit-learn melakukan penyesuaian lebih lanjut pada skor.
Implementasi Isolation Forest dengan Python dan Scikit-learn
Mari kita lakukan implementasi selangkah demi selangkah dan mulai dengan impor.
Impor
Kita menggunakan paket Python standar untuk penanganan data dan visualisasi (baris 2-5). Kita juga menggunakan implementasi Isolation Forest dari Scikit-learn (baris 7) dan paket terakhir digunakan untuk mengimpor dataset kita (baris 8).
Dataset
Kita memuat data langsung dari UCI machine learning repository. Kita menggunakan dataset Air Quality (CC BY 4.0), yang berisi 9.358 instance pengukuran kualitas udara dari sebuah sensor di sebuah kota Italia. Dalam konteks dataset ini, anomali dapat dianggap sebagai pembacaan sensor yang menunjukkan tingkat polusi yang sangat tinggi.
Pembersihan data
Kita melakukan sedikit pembersihan data sebelum menerapkan model. Kita mulai dengan memilih semua fitur dari dataset (baris 2) lalu memilih subset 4 fitur (baris 5). Ini semua merupakan ukuran berbagai bahan kimia logam oksida di udara (yaitu polutan). Kita kemudian menghapus baris yang memiliki nilai hilang (baris 8-9). Pada akhirnya, kita memiliki 6.941 instance dan Anda dapat melihat cuplikan himpunan fitur di bawah.
Menetapkan parameter pelatihan
Hal terakhir yang perlu dilakukan adalah menetapkan parameter yang digunakan untuk melatih Isolation Forest. Dalam kasus ini, kita akan menggunakan tiga nilai di bawah:
n_estimatorsadalah jumlah Isolation Tree yang digunakan dalam ensemble. Nilai100digunakan dalam makalah Isolation Forest. Melalui eksperimen, para peneliti menemukan nilai ini menghasilkan hasil yang baik pada berbagai dataset.contaminationadalah persentase titik data yang kita perkirakan merupakan anomali.sample_sizeadalah jumlah instance yang digunakan untuk melatih setiap Isolation Tree. Nilai256umum digunakan karena memungkinkan kita menghindari penggunaan kriteria penghentian ukuran pohon maksimum. Ini karena kita dapat memperkirakan ukuran pohon maksimum yang wajar sebesar log(256) = 8.Nilai contamination tidak memiliki justifikasi yang kuat seperti nilai lainnya. Nilai ini bisa berasal dari pengalaman sebelumnya. Misalkan dalam analisis sebelumnya kita menemukan 1% pembacaan menunjukkan tingkat polusi tinggi. Ini juga bisa berasal dari keterbatasan sumber daya. Misalnya, saat menganalisis transaksi penipuan Anda mungkin hanya memiliki cukup waktu untuk menganalisis lebih lanjut 5% dari semua transaksi. Saat kita memvisualisasikan skor anomali, kita akan melihat bagaimana skor disesuaikan menggunakan nilai contamination ini.
Melatih Isolation Forest
Akhirnya, kita dapat melatih Isolation Forest. Jika Anda familier dengan Sklearn, maka proses ini seharusnya terlihat familier. Kita menginisialisasi model menggunakan parameter yang dibahas di atas (baris 2-5). Lalu kita melatih model pada himpunan fitur kita (baris 6).
Menghitung skor anomali
Model terlatih memiliki dua fungsi yang berguna:
decision_functionakan menghitung skor anomali dengan cara yang mirip dengan yang kita bahas di bagian teori.predictakan memberikan label biner berdasarkan nilai contamination. Dalam kasus kita, 1% instance dengan skor anomali terburuk akan diberi nilai -1. Instance lainnya diberi nilai 1.Kita menambahkan keluaran dari fungsi-fungsi ini ke dataset kita (baris 2-4). Saat kita menghitung nilai anomali (baris 6) kita melihat bahwa 70 instance diberi label sebagai anomali.
Kita dapat melangkah lebih jauh dan memvisualisasikan semua skor anomali. Kita lakukan ini menggunakan kode di bawah:
Sebanyak 70 instance dengan skor anomali terendah ditampilkan dalam warna oranye. Ini adalah anomali potensial kita dan langkah berikutnya adalah menyelidikinya lebih lanjut.
Pada titik ini, Anda mungkin sedikit bingung. Bukankah kita mengatakan bahwa skor yang mendekati 1 menunjukkan potensi anomali?
Skor yang Anda lihat pada scatter plot di atas telah disesuaikan. Untuk melakukannya, paket terlebih dahulu menghitung sebuah offset. Ini adalah persentil skor anomali berdasarkan nilai contamination. Dalam kasus kita, offset akan menjadi persentil 0,99. Skor akhir kemudian diberikan oleh offset - score. Dengan demikian, semua skor di bawah 0 menyiratkan potensi anomali.
Analisis lebih lanjut
Dengan menggunakan scatter plot di atas, kita dapat mengidentifikasi anomali potensial. Namun, ini tidak memberi tahu kita mengapa data tersebut diklasifikasikan sebagai anomali. Untuk itu kita perlu melakukan analisis lebih lanjut.
Sebagai contoh, pada kode di bawah kita membuat scatter plot dari semua instance dengan memplot nilai CO(GT) mereka vs. nilai NO2(GT) mereka. Kita juga memberi warna pada titik berdasarkan apakah mereka diklasifikasikan sebagai anomali.
Dengan menggunakan plot ini, kita dapat melihat bahwa pengukuran polutan CO(GT) sangat penting. Perhatikan bahwa banyak anomali memiliki nilai lebih besar dari 6 untuk fitur ini. Namun, ini tidak menjelaskan semua anomali. Beberapa memiliki nilai tinggi untuk kedua fitur dan yang lain tampaknya bukan anomali karena salah satu fitur dalam plot ini. Ini menunjukkan bahwa polutan lain juga berkontribusi pada klasifikasi.
Kelebihan Isolation Forest
Ini membawa kita ke kelebihan utama Isolation Forest dibanding metode deteksi anomali lain. Pertama, metode ini mampu menangani data berdimensi tinggi. Seperti yang kita lihat di atas, instance dapat ditandai sebagai anomali menggunakan semua fitur, dan metode ini dapat bekerja dengan baik pada jauh lebih dari empat fitur. Kelebihan kunci lainnya adalah dapat menemukan anomali dari berbagai tipe.
Sebagai perbandingan, metode deteksi anomali sederhana adalah z-score. Menggunakan fitur individual, metode ini akan mengklasifikasikan anomali berdasarkan seberapa jauh nilai fitur dari rata-ratanya. Namun, ini hanya satu tipe anomali. Pendekatan ini juga mengasumsikan fitur memiliki distribusi normal dan mengharuskan kita menilai z-score untuk setiap fitur dalam dataset kita.
Dengan Isolation Forest, kita tidak membuat asumsi tentang distribusi fitur. Hasilnya, kita dapat menemukan instance yang menjadi anomali karena alasan lain selain jauh dari rata-rata. Seperti yang kita lihat, kita juga dapat melakukan klasifikasi menggunakan semua fitur secara bersamaan. Ini dapat sangat menyederhanakan analisis kita, terutama dengan dataset besar.
Pertimbangan lainnya adalah Isolation Forest memiliki kompleksitas waktu linear dan bersifat unsupervised. Ini menjadikannya metode ideal untuk mendeteksi anomali tanpa pengetahuan awal pada dataset besar. Hal ini sering terjadi dalam aplikasi dunia nyata seperti deteksi penipuan, di mana tipe penipuan baru terus bermunculan di tengah lautan transaksi normal.
Keterbatasan Isolation Forest
Salah satu keterbatasan Isolation Forest yang patut dicatat adalah mungkin tidak berkinerja baik pada dataset kecil. Ini terkait dengan proses acak dalam pembuatan Isolation Tree. Selalu ada kemungkinan instance normal memiliki lintasan pendek atau, sebaliknya, anomali memiliki lintasan lebih panjang. Dengan dataset kecil, hal ini lebih mungkin terjadi. Dengan kata lain, agar Isolation Forest bekerja, kita memerlukan data yang cukup untuk merata-ratakan keacakan.
Keterbatasan lainnya, seperti yang telah kita lihat, adalah Isolation Forest hanya dapat mengidentifikasi potensi anomali. Metode ini tidak memberi tahu kita mengapa instance tertentu dianggap anomali. Untuk itu, kita perlu melakukan analisis lebih lanjut. Kini, kelebihan dalam mengidentifikasi anomali kompleks akan menjadi tantangan. Pada akhirnya, dibutuhkan banyak pekerjaan dan pengetahuan domain untuk sepenuhnya menjelaskan sebuah anomali.
Kesimpulan
Kita telah mengeksplorasi Isolation Forest, alat yang kuat untuk deteksi anomali di berbagai domain. Kita telah melihat bagaimana pendekatan uniknya—mengisolasi anomali melalui pemartisian acak—memberikan kelebihan dibanding metode tradisional: menangani data berdimensi tinggi, mengidentifikasi pola anomali yang kompleks, dan memastikan skalabilitas.
Contoh praktis menggunakan Python dan Scikit-learn menunjukkan kemudahan penggunaannya.
Meskipun Isolation Forest dapat secara efektif mengidentifikasi anomali potensial tanpa pengetahuan awal, metode ini juga memiliki keterbatasan, khususnya saat berhadapan dengan dataset yang lebih kecil dan ketidakmampuannya menjelaskan mengapa instance tertentu dianggap anomali.