आइसोलेशन फ़ॉरेस्ट गाइड: अवधारणा और Python इम्प्लीमेंटेशन
आइसोलेशन फ़ॉरेस्ट एक अनसुपरवाइज़्ड मशीन लर्निंग एल्गोरिदम है जो डिसीज़न ट्री के समूह में रैंडम पार्टिशनिंग की प्रक्रिया से आउट्लायर को अलग करके एनॉमली की पहचान करता है।
“हमने आपके कार्ड पर होल्ड लगा दिया है। [amount] की [vendor] पर हुई ट्रांज़ैक्शन क्या आपकी है?”
खुशकिस्मती से, वह तो बस मैं ही था जो अजीब घंटे में ऑनलाइन शॉपिंग कर रहा था, लेकिन मेरे मन में सवाल उठा… बैंक दिनभर में प्रोसेस होने वाली लाखों ट्रांज़ैक्शनों में संदिग्ध ट्रांज़ैक्शन को कैसे फ़्लैग करता है?
धोखाधड़ी की पहचान मशीन लर्निंग (ML) की एक व्यापक समस्या का विशेष मामला है, जिसे एनॉमली डिटेक्शन कहा जाता है। इस समस्या को हल करने के कई तरीके हैं, लेकिन इस ब्लॉग में हम एक लोकप्रिय विधि पर ध्यान देंगे: आइसोलेशन फ़ॉरेस्ट।
व्यवहार में एनॉमली डिटेक्शन
धोखाधड़ी से लड़ना, नेटवर्क की रक्षा करना, आउट्लायर ढूंढना, और ख़राब उपकरणों को फ़्लैग करना—ये सभी अलग समस्याएँ लग सकती हैं। पर इनमें एक साझा चुनौती है—यह स्पष्ट नहीं कि एनॉमली किसे कहें। कई बार, एनॉमलियाँ दुर्लभ और सूक्ष्म होती हैं, जिससे सामान्य डेटा के विशाल प्रवाह में उनकी पहचान मुश्किल हो जाती है।
एनॉमली डिटेक्शन सिस्टम विकसित करने का एक तरीका प्रीडिक्टिव ML का उपयोग करना है। उदाहरण के लिए, हम धोखाधड़ी वाली ट्रांज़ैक्शन इकट्ठा कर सकते हैं। फिर, ट्रांज़ैक्शन राशि, समय, स्थान और व्यापारी के प्रकार जैसी विशेषताओं का उपयोग करके, हम एक मॉडल बना सकते हैं जो इन्हें सामान्य ट्रांज़ैक्शनों से अलग करे। समस्या यह है कि यह तरीका केवल उन्हीं तरह की धोखाधड़ियों का पता लगा पाएगा जो हमने पहले देखी हैं।
धोखेबाज़ अक्सर अपनी रणनीतियाँ बदलते रहते हैं और धोखाधड़ी के नए तरीके आज़माते हैं। इनमें से कई रणनीतियाँ पूरी तरह अप्रत्याशित होती हैं। यही कारण है कि अनसुपरवाइज़्ड विधियाँ अक्सर एनॉमलियों का पता लगाने में काम आती हैं। ये सभी ट्रांज़ैक्शनों की तुलना करके उन ट्रांज़ैक्शनों की पहचान करती हैं जिनकी फीचर वैल्यू असामान्य है। महत्वपूर्ण यह है कि इस तरीके में हमें पहले से किसी ट्रांज़ैक्शन को लेबल करने की आवश्यकता नहीं होती।
केवल धोखाधड़ी ही वर्गीकृत करना कठिन व्यवहार नहीं है। मैन्युफैक्चरिंग में मशीनें किसी भी समय कई अप्रत्याशित तरीकों से फेल हो सकती हैं। साइबर सुरक्षा में नए-नए हमले लगातार सामने आते हैं और पैच किए जाते हैं। चिकित्सा में दुर्लभ स्वास्थ्य समस्याएँ कई टेस्ट नतीजों में छिपी हो सकती हैं। अनुप्रयोग अनगिनत हैं, तो आइए देखें कि ऐसी एनॉमलियों का पता लगाने का एक अनसुपरवाइज़्ड तरीका कैसे काम करता है।
आइसोलेशन फ़ॉरेस्ट क्या है?
नाम से ही स्पष्ट है, आइसोलेशन फ़ॉरेस्ट एक ट्री-आधारित विधि है। ये रैंडम फ़ॉरेस्ट के समान हैं, लेकिन इनके मूल बिल्डिंग ब्लॉक्स अलग होते हैं।
रैंडम फ़ॉरेस्ट में गिनी इम्प्योरिटी आधारित स्प्लिट से बनाए गए डिसीज़न ट्री होते हैं। इसमें एक टार्गेट वेरिएबल चाहिए होता है, जबकि आइसोलेशन फ़ॉरेस्ट में आइसोलेशन ट्री उपयोग होते हैं। कई ट्री का संग्रह लेकर यह विधि हर इंस्टेंस के लिए एनॉमली स्कोर निकालती है।
आइसोलेशन ट्री
एनॉमली स्कोर निकालने से पहले, इस मूल बिल्डिंग ब्लॉक को समझ लेना उपयोगी है। मान लें हम धोखाधड़ी वाली ट्रांज़ैक्शन की पहचान करना चाहते हैं। सरलता के लिए, हम 1000 ट्रांज़ैक्शन (इंस्टेंस) का आंकलन करेंगे और अपने डेटासेट से दो वेरिएबल देखेंगे: राशि (x1) और दिन का समय (x2)।
आइसोलेशन ट्री बनाने के लिए, हम रूट नोड में सभी या किसी सैंपल के इंस्टेंस से शुरू करते हैं। नीचे चित्र 1 में आप देख सकते हैं कि हमारे पास 256 इंस्टेंस का सैंपल है (इस संख्या पर आगे बात करेंगे)।
चित्र 1: रेकर्सिव रैंडम स्प्लिट्स से बना आइसोलेशन ट्री। हर नोड में इंस्टेंस की संख्या दी गई है।
इसके बाद हम:
किसी एक फीचर को रैंडमली चुनते हैं (या तो x1 या x2)।
करंट नोड में मौजूद इंस्टेंस के लिए चुने गए फीचर की रेंज के भीतर एक रैंडम स्प्लिट वैल्यू चुनते हैं।
उस स्प्लिट वैल्यू के आधार पर डेटा को दो चाइल्ड नोड में बाँटते हैं।
प्रत्येक चाइल्ड नोड पर इस प्रक्रिया को रेकर्सिव रूप से तब तक दोहराते हैं जब तक कि निम्न में से कोई शर्त पूरी न हो जाए:
हर लीफ नोड में केवल एक इंस्टेंस रह जाए।
पूर्वनिर्धारित अधिकतम गहराई पर पहुँचा जाए।
ध्यान दें कि हर स्टेप पर फीचर की रेंज बदलती है। यानी, हम नोड के इंस्टेंस के लिए उस फीचर के न्यूनतम और अधिकतम मान का उपयोग करते हैं। यह डायनेमिक समायोजन सुनिश्चित करता है कि स्प्लिट सार्थक हों और किसी नोड में शून्य इंस्टेंस न रह जाएं।
चित्र 2 हमें यह समझने में मदद करता है कि यह प्रक्रिया आउट्लायर को कैसे अलग करती है। इंस्टेंस A, B, और C अन्य ट्रांज़ैक्शनों से अलग दिखते हैं।
चित्र 2: ट्रांज़ैक्शनों का स्कैटर प्लॉट
B संभवतः सबसे पहले अलग हो जाएगा क्योंकि इसे किसी भी फीचर पर एक ही स्प्लिट से अन्य ट्रांज़ैक्शनों से अलग किया जा सकता है।
A को x2 पर एक स्प्लिट लगेगा।
C में ज़्यादा समय लग सकता है क्योंकि इसे अलग करने के लिए दोनों फीचर्स पर स्प्लिट चाहिए। यानी, C की राशि और समय दोनों सामान्य हैं, लेकिन उस समय के लिए राशि सामान्य नहीं है।
हम पहली कोशिश में ही इनमें से किसी इंस्टेंस को अलग कर सकते हैं—यह किस्मत होगी। अधिक संभावना है कि कुछ कोशिशें लगें। महत्वपूर्ण बात यह है कि औसतन,B में A से कम स्प्लिट लगेंगे, A में C से कम, और इन तीनों पॉइंट्स में बाकी ट्रांज़ैक्शनों की तुलना में कम स्प्लिट लगेंगे। लेकिन हम इस औसत व्यवहार को कैसे कैप्चर करें?
एनॉमली स्कोर की गणना
किसी एनॉमली को अलग करने के लिए जितने स्प्लिट चाहिए, वे उस इंस्टेंस के लीफ नोड तक का पाथ लेंथ तय करते हैं। जब आइसोलेशन ट्री का एक फ़ॉरेस्ट कुछ सैंपल्स के लिए लगातार छोटे पाथ लेंथ देता है, तो वे सैंपल संभवतः एनॉमली होते हैं। इस औसत व्यवहार को हम सभी ट्री के पाथ लेंथ एकत्रित करके कैप्चर करते हैं—इसे एनॉमली स्कोर निकालना कहा जाता है।
किसी इंस्टेंस x के लिए एनॉमली स्कोर निकालने हेतु पहले कुछ मान परिभाषित करने होंगे:
पाथ लेंथ,h(x), वह एजेज़ (स्प्लिट) की संख्या है जिन्हें पार कर इंस्टेंस के लीफ नोड तक पहुँचना पड़ता है। सीधा औसत E[h(x)] लेना दिक्कत दे सकता है, क्योंकि बड़े ट्री (ज्यादा इंस्टेंस वाले) में पाथ लेंथ सामान्यतः बड़ा होगा—एनॉमली के लिए भी। इसे ध्यान में रखते हुए हमें सैंपल साइज़ n पर आधारित एक नॉर्मलाइज़ेशन वैल्यू चाहिए:
यह मान बाइनरी सर्च ट्री (BST) के सिद्धांत से आता है। यह BST में असफल सर्चेज़ के औसत पाथ लेंथ को देता है। चूँकि आइसोलेशन ट्री की संरचना BST के समतुल्य होती है, हम c(n) को किसी इंस्टेंस (चाहे एनॉमली हो या न हो) के अपेक्षित पाथ लेंथ के रूप में लेते हैं। ध्यान दें, यदि हम ट्री की अधिकतम गहराई तय करें, तो इस मान को समायोजित करना होगा।
अंततः, हम अपना एनॉमली स्कोर s(x,n) निकाल सकते हैं:
स्कोर 0 और 1 के बीच होता है, और इसकी व्याख्या करते समय तीन परिदृश्यों पर ध्यान दें:
यदि पॉइंट एनॉमली है तो E[h(x)] < c(n) और s → 1
यदि पॉइंट एनॉमली नहीं है तो E[h(x)] > c(n) और s → 0
यदि E[h(x)] = c(n) तो s = 0.5
दूसरे शब्दों में, जब किसी इंस्टेंस का औसत पाथ लेंथ अपेक्षित औसत पाथ लेंथ से छोटा होता है, तो एनॉमली स्कोर 1 के करीब होगा। हालांकि, जैसा कि हम इम्प्लीमेंटेशन में देखेंगे, Scikit-learn पैकेज स्कोर में कुछ और समायोजन करता है।
Python और Scikit-learn के साथ आइसोलेशन फ़ॉरेस्ट इम्प्लीमेंटेशन
आइए इम्प्लीमेंटेशन को चरणबद्ध तरीके से समझते हैं और इम्पोर्ट्स से शुरू करते हैं।
इम्पोर्ट्स
हमारे पास डेटा हैंडलिंग और विज़ुअलाइज़ेशन के लिए स्टैंडर्ड Python पैकेज हैं (पंक्ति 2-5)। हम Scikit-learn के आइसोलेशन फ़ॉरेस्ट इम्प्लीमेंटेशन का उपयोग कर रहे हैं (पंक्ति 7) और अंतिम पैकेज हमारे डेटासेट को इम्पोर्ट करने के लिए है (पंक्ति 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_ucirepoसंचालित द्वारा
डेटासेट
हम अपना डेटा सीधे UCI मशीन लर्निंग रिपॉज़िटरी से लोड करते हैं। हम Air Quality डेटासेट (CC BY 4.0) का उपयोग कर रहे हैं, जिसमें एक इतालवी शहर के एक सेंसर से वायु गुणवत्ता माप के 9,358 इंस्टेंस हैं। इस डेटासेट के संदर्भ में, कोई ऐसा सेंसर रीडिंग जो असामान्य रूप से उच्च प्रदूषण स्तर दर्शाए, एनॉमली माना जा सकता है।
# Fetch dataset from UCI repository
air_quality = fetch_ucirepo(id=360)संचालित द्वारा
डेटा क्लीनिंग
मॉडल लगाने से पहले हम थोड़ा डेटा क्लीनिंग करेंगे। हम पहले डेटासेट से सभी फीचर्स चुनते हैं (पंक्ति 2) और फिर 4 फीचर्स का सबसेट लेते हैं (पंक्ति 5)। ये सभी हवा में विभिन्न मेटल ऑक्साइड रसायनों (यानी प्रदूषकों) के माप हैं। फिर हम मिसिंग वैल्यू वाली पंक्तियाँ हटाते हैं (पंक्ति 8-9)। अंत में हमारे पास 6,941 इंस्टेंस रह जाते हैं और नीचे फीचर सेट की एक झलक देख सकते हैं।
# 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()संचालित द्वारा
ट्रेनिंग पैरामीटर परिभाषित करें
अब आखिरी काम है आइसोलेशन फ़ॉरेस्ट को ट्रेन करने के लिए पैरामीटर तय करना। इस मामले में हम नीचे दिए तीन मानों का उपयोग करेंगे:
n_estimators एन्सेम्बल में उपयोग किए गए आइसोलेशन ट्री की संख्या है। 100 का मान आइसोलेशन फ़ॉरेस्ट पेपर में इस्तेमाल हुआ है। शोधकर्ताओं ने प्रयोगों से पाया कि यह विभिन्न डेटासेट पर अच्छे नतीजे देता है।
contamination वह प्रतिशत है जितने डेटा पॉइंट्स के एनॉमली होने की हमें उम्मीद है।
sample_size हर आइसोलेशन ट्री को ट्रेन करने के लिए उपयोग किए गए इंस्टेंस की संख्या है। 256 का मान आमतौर पर लिया जाता है ताकि हमें अधिकतम ट्री साइज़ की स्टॉपिंग क्राइटेरिया नहीं रखनी पड़े। ऐसा इसलिए कि हम अधिकतम ट्री साइज़ लगभग log(256) = 8 की उम्मीद कर सकते हैं।
contamination का मान अन्य मानों की तरह ठोस औचित्य नहीं रखता। यह पिछले अनुभव से आ सकता है। मान लें पिछली एनालिसिस में हमें 1% रीडिंग उच्च प्रदूषण दर्शाती मिलीं। यह संसाधन सीमाओं से भी आ सकता है। जैसे, धोखाधड़ी ट्रांज़ैक्शन का विश्लेषण करते समय आपके पास कुल ट्रांज़ैक्शन में से केवल 5% को और गहराई से देखने का समय हो। जब हम एनॉमली स्कोर विज़ुअलाइज़ करेंगे, तो देखेंगे कि इन्हें इस contamination मान से कैसे समायोजित किया जाता है।
# Parameters
n_estimators =100# Number of trees
contamination =0.01# Expected proportion of anomalies
sample_size =256# Number of samples used to train each treeसंचालित द्वारा
आइसोलेशन फ़ॉरेस्ट को ट्रेन करें
अंततः, हम आइसोलेशन फ़ॉरेस्ट को ट्रेन कर सकते हैं। यदि आप Sklearn से परिचित हैं, तो यह प्रक्रिया जानी-पहचानी लगेगी। हम ऊपर तय किए गए पैरामीटर से मॉडल इनिशियलाइज़ करते हैं (पंक्ति 2-5)। फिर अपने फीचर सेट पर मॉडल को ट्रेन करते हैं (पंक्ति 6)।
decision_function सिद्धांत वाले सेक्शन में चर्चा के समान तरीके से एनॉमली स्कोर की गणना करेगा।
predictcontamination मान के आधार पर बाइनरी लेबल देगा। हमारे मामले में, सबसे खराब एनॉमली स्कोर वाले 1% इंस्टेंस को -1 वैल्यू दी जाएगी। बाकी इंस्टेंस को 1।
हम इन फ़ंक्शन के आउटपुट को अपने डेटासेट में जोड़ते हैं (पंक्ति 2-4)। जब हम एनॉमली वैल्यू गिनते हैं (पंक्ति 6) तो दिखता है कि 70 इंस्टेंस को एनॉमली लेबल किया गया है।
# 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()संचालित द्वारा
हम आगे बढ़कर सभी एनॉमली स्कोर को विज़ुअलाइज़ कर सकते हैं। इसके लिए नीचे दिया कोड इस्तेमाल करें:
# 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()संचालित द्वारा
सबसे कम एनॉमली स्कोर वाले 70 इंस्टेंस नारंगी रंग में दिखाए गए हैं। ये हमारे संभावित एनॉमली हैं और अगला कदम इन्हें और विस्तार से जांचना है।
इस बिंदु पर आप थोड़े उलझ सकते हैं। क्या हमने नहीं कहा था कि 1 के करीब स्कोर संभावित एनॉमली दर्शाते हैं?
ऊपर के स्कैटर प्लॉट में दिखे स्कोर समायोजित किए गए हैं। ऐसा करने के लिए, पैकेज पहले एक ऑफ़सेट निकालता है—जो contamination मान के आधार पर एनॉमली स्कोर का पर्सेंटाइल है। हमारे मामले में, ऑफ़सेट 0.99 पर्सेंटाइल होगा। अंतिम स्कोर फिर offset - score से दिए जाते हैं। इसका मतलब है कि 0 से नीचे के सभी स्कोर संभावित एनॉमली का संकेत देते हैं।
आगे की विश्लेषण
ऊपर के स्कैटर प्लॉट से हम संभावित एनॉमली पहचान सकते हैं। पर यह नहीं बताता कि इन्हें एनॉमली क्यों वर्गीकृत किया गया। यह जानने के लिए हमें आगे विश्लेषण करना होगा।
उदाहरण के लिए, नीचे दिए कोड में हम सभी इंस्टेंस का स्कैटर प्लॉट बनाते हैं, जिसमें CO(GT) मान को NO2(GT) मान के विरुद्ध प्लॉट करते हैं। हम पॉइंट्स को इस आधार पर रंगते हैं कि उन्हें एनॉमली वर्गीकृत किया गया है या नहीं।
# 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()संचालित द्वारा
इस प्लॉट से दिखता है कि CO(GT) प्रदूषक माप विशेष रूप से महत्वपूर्ण है। ध्यान दें कि कई एनॉमली में इस फीचर का मान 6 से अधिक है। हालांकि, यह सभी एनॉमलियों की व्याख्या नहीं करता। कुछ में दोनों फीचर्स के मान उच्च हैं और कुछ इस प्लॉट के किसी भी फीचर के कारण एनॉमली नहीं लगते। यह सुझाता है कि अन्य प्रदूषकों ने भी वर्गीकरण में योगदान दिया है।
आइसोलेशन फ़ॉरेस्ट के फायदे
यहीं से आइसोलेशन फ़ॉरेस्ट के अन्य एनॉमली डिटेक्शन तरीकों पर मुख्य फायदे सामने आते हैं। पहला, ये हाई-डायमेंशनल डेटा संभाल सकती हैं। जैसा हमने देखा, सभी फीचर्स का उपयोग कर इंस्टेंस को एनॉमली फ़्लैग किया जा सकता है, और यह विधि चार से कहीं अधिक फीचर्स के साथ भी अच्छी तरह काम करती है। एक और बड़ा फायदा है कि यह विभिन्न प्रकार की एनॉमलियों को ढूंढ सकती है।
तुलना के लिए, एक सरल एनॉमली डिटेक्शन तरीका z-score है। व्यक्तिगत फीचर्स पर, यह फीचर वैल्यू के उनके औसत से दूरी के आधार पर एनॉमली तय करता है। लेकिन यह केवल एक प्रकार की एनॉमली है। यह तरीका यह भी मानता है कि फीचर्स नार्मल डिस्ट्रीब्यूशन का पालन करते हैं और हमें अपने डेटासेट के हर फीचर के z-scores का आकलन करना पड़ता है।
आइसोलेशन फ़ॉरेस्ट में हम किसी फीचर के डिस्ट्रीब्यूशन के बारे में मान्यताएँ नहीं बनाते। नतीजा यह कि हम ऐसे इंस्टेंस ढूँढ सकते हैं जो औसत से दूर होने के अलावा अन्य कारणों से एनॉमली हों। जैसा कि देखा, हम सभी फीचर्स को साथ लेकर वर्गीकरण कर सकते हैं। बड़े डेटासेट में यह हमारी एनालिसिस को काफ़ी सरल बना देता है।
अन्य बातों में यह भी शामिल है कि आइसोलेशन फ़ॉरेस्ट की टाइम कॉम्प्लेक्सिटी रैखिक (लीनियर) होती है और यह अनसुपरवाइज़्ड है। इससे यह बड़े डेटासेट में बिना पूर्वज्ञान के एनॉमली खोजने की आदर्श विधि बनती है—जैसा कि वास्तविक दुनिया के अनुप्रयोगों में होता है, जैसे फ्रॉड डिटेक्शन, जहाँ सामान्य ट्रांज़ैक्शनों के सागर में नए प्रकार की धोखाधड़ी उभरती रहती है।
आइसोलेशन फ़ॉरेस्ट की सीमाएँ
आइसोलेशन फ़ॉरेस्ट की एक प्रमुख सीमा यह है कि छोटे डेटासेट पर इसका प्रदर्शन अच्छा न हो सके। इसका संबंध आइसोलेशन ट्री बनाने की रैंडम प्रक्रिया से है। हमेशा संभावना रहती है कि सामान्य इंस्टेंस के पाथ छोटे पड़ जाएँ या उल्टा, एनॉमली के पाथ लंबे हो जाएँ। छोटे डेटासेट में ऐसा होने की संभावना अधिक होती है। यानी, आइसोलेशन फ़ॉरेस्ट को अच्छे से काम करने के लिए पर्याप्त डेटा चाहिए ताकि रैंडमनेस औसतन संतुलित हो जाए।
एक और सीमा, जैसा हमने देखा, यह है कि आइसोलेशन फ़ॉरेस्ट केवल संभावित एनॉमली की पहचान कर सकता है। यह नहीं बताता कि कुछ इंस्टेंस एनॉमली क्यों हैं। इसके लिए आगे विश्लेषण करना पड़ता है। अब, जटिल एनॉमली की पहचान का यही फायदा एक चुनौती बनता है। अंततः, किसी एनॉमली की पूरी व्याख्या करने में बहुत काम और डोमेन ज्ञान लग सकता है।
निष्कर्ष
हमने विभिन्न डोमेन में एनॉमली डिटेक्शन के लिए एक शक्तिशाली टूल—आइसोलेशन फ़ॉरेस्ट—का अध्ययन किया। देखा कि इसका अनोखा दृष्टिकोण—रैंडम पार्टिशनिंग के ज़रिए एनॉमली को अलग करना—पारंपरिक तरीकों पर बढ़त देता है: हाई-डायमेंशनल डेटा हैंडल करना, जटिल एनॉमली पैटर्न पहचानना, और स्केलेबिलिटी।
Python और Scikit-learn के व्यावहारिक उदाहरण ने इसके उपयोग में आसानी को दर्शाया।
हालाँकि आइसोलेशन फ़ॉरेस्ट पूर्वज्ञान के बिना संभावित एनॉमली प्रभावी रूप से खोज सकता है, इसकी सीमाएँ भी हैं—खासकर छोटे डेटासेट के साथ काम करते समय और इस बात की व्याख्या न कर पाने में कि कुछ इंस्टेंस एनॉमली क्यों हैं।
कॉनर तटीय मॉनिटरिंग के लिए मशीन लर्निंग पर पीएचडी कर रहे हैं। उनके पास बैंकिंग और सेमीकंडक्टर मैन्युफैक्चरिंग उद्योग में डेटा साइंटिस्ट के रूप में काम करने का अनुभव भी है।
मुझे हाल ही में मेरे बैंक से एक संदेश आया:
“हमने आपके कार्ड पर होल्ड लगा दिया है। [amount] की [vendor] पर हुई ट्रांज़ैक्शन क्या आपकी है?”
खुशकिस्मती से, वह तो बस मैं ही था जो अजीब घंटे में ऑनलाइन शॉपिंग कर रहा था, लेकिन मेरे मन में सवाल उठा… बैंक दिनभर में प्रोसेस होने वाली लाखों ट्रांज़ैक्शनों में संदिग्ध ट्रांज़ैक्शन को कैसे फ़्लैग करता है?
धोखाधड़ी की पहचान मशीन लर्निंग (ML) की एक व्यापक समस्या का विशेष मामला है, जिसे एनॉमली डिटेक्शन कहा जाता है। इस समस्या को हल करने के कई तरीके हैं, लेकिन इस ब्लॉग में हम एक लोकप्रिय विधि पर ध्यान देंगे: आइसोलेशन फ़ॉरेस्ट।
व्यवहार में एनॉमली डिटेक्शन
धोखाधड़ी से लड़ना, नेटवर्क की रक्षा करना, आउट्लायर ढूंढना, और ख़राब उपकरणों को फ़्लैग करना—ये सभी अलग समस्याएँ लग सकती हैं। पर इनमें एक साझा चुनौती है—यह स्पष्ट नहीं कि एनॉमली किसे कहें। कई बार, एनॉमलियाँ दुर्लभ और सूक्ष्म होती हैं, जिससे सामान्य डेटा के विशाल प्रवाह में उनकी पहचान मुश्किल हो जाती है।
एनॉमली डिटेक्शन सिस्टम विकसित करने का एक तरीका प्रीडिक्टिव ML का उपयोग करना है। उदाहरण के लिए, हम धोखाधड़ी वाली ट्रांज़ैक्शन इकट्ठा कर सकते हैं। फिर, ट्रांज़ैक्शन राशि, समय, स्थान और व्यापारी के प्रकार जैसी विशेषताओं का उपयोग करके, हम एक मॉडल बना सकते हैं जो इन्हें सामान्य ट्रांज़ैक्शनों से अलग करे। समस्या यह है कि यह तरीका केवल उन्हीं तरह की धोखाधड़ियों का पता लगा पाएगा जो हमने पहले देखी हैं।
धोखेबाज़ अक्सर अपनी रणनीतियाँ बदलते रहते हैं और धोखाधड़ी के नए तरीके आज़माते हैं। इनमें से कई रणनीतियाँ पूरी तरह अप्रत्याशित होती हैं। यही कारण है कि अनसुपरवाइज़्ड विधियाँ अक्सर एनॉमलियों का पता लगाने में काम आती हैं। ये सभी ट्रांज़ैक्शनों की तुलना करके उन ट्रांज़ैक्शनों की पहचान करती हैं जिनकी फीचर वैल्यू असामान्य है। महत्वपूर्ण यह है कि इस तरीके में हमें पहले से किसी ट्रांज़ैक्शन को लेबल करने की आवश्यकता नहीं होती।
केवल धोखाधड़ी ही वर्गीकृत करना कठिन व्यवहार नहीं है। मैन्युफैक्चरिंग में मशीनें किसी भी समय कई अप्रत्याशित तरीकों से फेल हो सकती हैं। साइबर सुरक्षा में नए-नए हमले लगातार सामने आते हैं और पैच किए जाते हैं। चिकित्सा में दुर्लभ स्वास्थ्य समस्याएँ कई टेस्ट नतीजों में छिपी हो सकती हैं। अनुप्रयोग अनगिनत हैं, तो आइए देखें कि ऐसी एनॉमलियों का पता लगाने का एक अनसुपरवाइज़्ड तरीका कैसे काम करता है।
आइसोलेशन फ़ॉरेस्ट क्या है?
नाम से ही स्पष्ट है, आइसोलेशन फ़ॉरेस्ट एक ट्री-आधारित विधि है। ये रैंडम फ़ॉरेस्ट के समान हैं, लेकिन इनके मूल बिल्डिंग ब्लॉक्स अलग होते हैं।
रैंडम फ़ॉरेस्ट में गिनी इम्प्योरिटी आधारित स्प्लिट से बनाए गए डिसीज़न ट्री होते हैं। इसमें एक टार्गेट वेरिएबल चाहिए होता है, जबकि आइसोलेशन फ़ॉरेस्ट में आइसोलेशन ट्री उपयोग होते हैं। कई ट्री का संग्रह लेकर यह विधि हर इंस्टेंस के लिए एनॉमली स्कोर निकालती है।
आइसोलेशन ट्री
एनॉमली स्कोर निकालने से पहले, इस मूल बिल्डिंग ब्लॉक को समझ लेना उपयोगी है। मान लें हम धोखाधड़ी वाली ट्रांज़ैक्शन की पहचान करना चाहते हैं। सरलता के लिए, हम 1000 ट्रांज़ैक्शन (इंस्टेंस) का आंकलन करेंगे और अपने डेटासेट से दो वेरिएबल देखेंगे: राशि (x1) और दिन का समय (x2)।
आइसोलेशन ट्री बनाने के लिए, हम रूट नोड में सभी या किसी सैंपल के इंस्टेंस से शुरू करते हैं। नीचे चित्र 1 में आप देख सकते हैं कि हमारे पास 256 इंस्टेंस का सैंपल है (इस संख्या पर आगे बात करेंगे)।
चित्र 1: रेकर्सिव रैंडम स्प्लिट्स से बना आइसोलेशन ट्री। हर नोड में इंस्टेंस की संख्या दी गई है।
इसके बाद हम:
ध्यान दें कि हर स्टेप पर फीचर की रेंज बदलती है। यानी, हम नोड के इंस्टेंस के लिए उस फीचर के न्यूनतम और अधिकतम मान का उपयोग करते हैं। यह डायनेमिक समायोजन सुनिश्चित करता है कि स्प्लिट सार्थक हों और किसी नोड में शून्य इंस्टेंस न रह जाएं।
चित्र 2 हमें यह समझने में मदद करता है कि यह प्रक्रिया आउट्लायर को कैसे अलग करती है। इंस्टेंस A, B, और C अन्य ट्रांज़ैक्शनों से अलग दिखते हैं।
चित्र 2: ट्रांज़ैक्शनों का स्कैटर प्लॉट
B संभवतः सबसे पहले अलग हो जाएगा क्योंकि इसे किसी भी फीचर पर एक ही स्प्लिट से अन्य ट्रांज़ैक्शनों से अलग किया जा सकता है।
A को x2 पर एक स्प्लिट लगेगा।
C में ज़्यादा समय लग सकता है क्योंकि इसे अलग करने के लिए दोनों फीचर्स पर स्प्लिट चाहिए। यानी, C की राशि और समय दोनों सामान्य हैं, लेकिन उस समय के लिए राशि सामान्य नहीं है।
हम पहली कोशिश में ही इनमें से किसी इंस्टेंस को अलग कर सकते हैं—यह किस्मत होगी। अधिक संभावना है कि कुछ कोशिशें लगें। महत्वपूर्ण बात यह है कि औसतन, B में A से कम स्प्लिट लगेंगे, A में C से कम, और इन तीनों पॉइंट्स में बाकी ट्रांज़ैक्शनों की तुलना में कम स्प्लिट लगेंगे। लेकिन हम इस औसत व्यवहार को कैसे कैप्चर करें?
एनॉमली स्कोर की गणना
किसी एनॉमली को अलग करने के लिए जितने स्प्लिट चाहिए, वे उस इंस्टेंस के लीफ नोड तक का पाथ लेंथ तय करते हैं। जब आइसोलेशन ट्री का एक फ़ॉरेस्ट कुछ सैंपल्स के लिए लगातार छोटे पाथ लेंथ देता है, तो वे सैंपल संभवतः एनॉमली होते हैं। इस औसत व्यवहार को हम सभी ट्री के पाथ लेंथ एकत्रित करके कैप्चर करते हैं—इसे एनॉमली स्कोर निकालना कहा जाता है।
किसी इंस्टेंस x के लिए एनॉमली स्कोर निकालने हेतु पहले कुछ मान परिभाषित करने होंगे:
पाथ लेंथ, h(x), वह एजेज़ (स्प्लिट) की संख्या है जिन्हें पार कर इंस्टेंस के लीफ नोड तक पहुँचना पड़ता है। सीधा औसत E[h(x)] लेना दिक्कत दे सकता है, क्योंकि बड़े ट्री (ज्यादा इंस्टेंस वाले) में पाथ लेंथ सामान्यतः बड़ा होगा—एनॉमली के लिए भी। इसे ध्यान में रखते हुए हमें सैंपल साइज़ n पर आधारित एक नॉर्मलाइज़ेशन वैल्यू चाहिए:
यह मान बाइनरी सर्च ट्री (BST) के सिद्धांत से आता है। यह BST में असफल सर्चेज़ के औसत पाथ लेंथ को देता है। चूँकि आइसोलेशन ट्री की संरचना BST के समतुल्य होती है, हम c(n) को किसी इंस्टेंस (चाहे एनॉमली हो या न हो) के अपेक्षित पाथ लेंथ के रूप में लेते हैं। ध्यान दें, यदि हम ट्री की अधिकतम गहराई तय करें, तो इस मान को समायोजित करना होगा।
अंततः, हम अपना एनॉमली स्कोर s(x,n) निकाल सकते हैं:
दूसरे शब्दों में, जब किसी इंस्टेंस का औसत पाथ लेंथ अपेक्षित औसत पाथ लेंथ से छोटा होता है, तो एनॉमली स्कोर 1 के करीब होगा। हालांकि, जैसा कि हम इम्प्लीमेंटेशन में देखेंगे, Scikit-learn पैकेज स्कोर में कुछ और समायोजन करता है।
Python और Scikit-learn के साथ आइसोलेशन फ़ॉरेस्ट इम्प्लीमेंटेशन
आइए इम्प्लीमेंटेशन को चरणबद्ध तरीके से समझते हैं और इम्पोर्ट्स से शुरू करते हैं।
इम्पोर्ट्स
हमारे पास डेटा हैंडलिंग और विज़ुअलाइज़ेशन के लिए स्टैंडर्ड Python पैकेज हैं (पंक्ति 2-5)। हम Scikit-learn के आइसोलेशन फ़ॉरेस्ट इम्प्लीमेंटेशन का उपयोग कर रहे हैं (पंक्ति 7) और अंतिम पैकेज हमारे डेटासेट को इम्पोर्ट करने के लिए है (पंक्ति 8)।
डेटासेट
हम अपना डेटा सीधे UCI मशीन लर्निंग रिपॉज़िटरी से लोड करते हैं। हम Air Quality डेटासेट (CC BY 4.0) का उपयोग कर रहे हैं, जिसमें एक इतालवी शहर के एक सेंसर से वायु गुणवत्ता माप के 9,358 इंस्टेंस हैं। इस डेटासेट के संदर्भ में, कोई ऐसा सेंसर रीडिंग जो असामान्य रूप से उच्च प्रदूषण स्तर दर्शाए, एनॉमली माना जा सकता है।
डेटा क्लीनिंग
मॉडल लगाने से पहले हम थोड़ा डेटा क्लीनिंग करेंगे। हम पहले डेटासेट से सभी फीचर्स चुनते हैं (पंक्ति 2) और फिर 4 फीचर्स का सबसेट लेते हैं (पंक्ति 5)। ये सभी हवा में विभिन्न मेटल ऑक्साइड रसायनों (यानी प्रदूषकों) के माप हैं। फिर हम मिसिंग वैल्यू वाली पंक्तियाँ हटाते हैं (पंक्ति 8-9)। अंत में हमारे पास 6,941 इंस्टेंस रह जाते हैं और नीचे फीचर सेट की एक झलक देख सकते हैं।
ट्रेनिंग पैरामीटर परिभाषित करें
अब आखिरी काम है आइसोलेशन फ़ॉरेस्ट को ट्रेन करने के लिए पैरामीटर तय करना। इस मामले में हम नीचे दिए तीन मानों का उपयोग करेंगे:
n_estimatorsएन्सेम्बल में उपयोग किए गए आइसोलेशन ट्री की संख्या है।100का मान आइसोलेशन फ़ॉरेस्ट पेपर में इस्तेमाल हुआ है। शोधकर्ताओं ने प्रयोगों से पाया कि यह विभिन्न डेटासेट पर अच्छे नतीजे देता है।contaminationवह प्रतिशत है जितने डेटा पॉइंट्स के एनॉमली होने की हमें उम्मीद है।sample_sizeहर आइसोलेशन ट्री को ट्रेन करने के लिए उपयोग किए गए इंस्टेंस की संख्या है।256का मान आमतौर पर लिया जाता है ताकि हमें अधिकतम ट्री साइज़ की स्टॉपिंग क्राइटेरिया नहीं रखनी पड़े। ऐसा इसलिए कि हम अधिकतम ट्री साइज़ लगभग log(256) = 8 की उम्मीद कर सकते हैं।contamination का मान अन्य मानों की तरह ठोस औचित्य नहीं रखता। यह पिछले अनुभव से आ सकता है। मान लें पिछली एनालिसिस में हमें 1% रीडिंग उच्च प्रदूषण दर्शाती मिलीं। यह संसाधन सीमाओं से भी आ सकता है। जैसे, धोखाधड़ी ट्रांज़ैक्शन का विश्लेषण करते समय आपके पास कुल ट्रांज़ैक्शन में से केवल 5% को और गहराई से देखने का समय हो। जब हम एनॉमली स्कोर विज़ुअलाइज़ करेंगे, तो देखेंगे कि इन्हें इस contamination मान से कैसे समायोजित किया जाता है।
आइसोलेशन फ़ॉरेस्ट को ट्रेन करें
अंततः, हम आइसोलेशन फ़ॉरेस्ट को ट्रेन कर सकते हैं। यदि आप Sklearn से परिचित हैं, तो यह प्रक्रिया जानी-पहचानी लगेगी। हम ऊपर तय किए गए पैरामीटर से मॉडल इनिशियलाइज़ करते हैं (पंक्ति 2-5)। फिर अपने फीचर सेट पर मॉडल को ट्रेन करते हैं (पंक्ति 6)।
एनॉमली स्कोर निकालें
ट्रेन किया गया मॉडल दो उपयोगी फ़ंक्शन देता है:
decision_functionसिद्धांत वाले सेक्शन में चर्चा के समान तरीके से एनॉमली स्कोर की गणना करेगा।predictcontamination मान के आधार पर बाइनरी लेबल देगा। हमारे मामले में, सबसे खराब एनॉमली स्कोर वाले 1% इंस्टेंस को -1 वैल्यू दी जाएगी। बाकी इंस्टेंस को 1।हम इन फ़ंक्शन के आउटपुट को अपने डेटासेट में जोड़ते हैं (पंक्ति 2-4)। जब हम एनॉमली वैल्यू गिनते हैं (पंक्ति 6) तो दिखता है कि 70 इंस्टेंस को एनॉमली लेबल किया गया है।
हम आगे बढ़कर सभी एनॉमली स्कोर को विज़ुअलाइज़ कर सकते हैं। इसके लिए नीचे दिया कोड इस्तेमाल करें:
सबसे कम एनॉमली स्कोर वाले 70 इंस्टेंस नारंगी रंग में दिखाए गए हैं। ये हमारे संभावित एनॉमली हैं और अगला कदम इन्हें और विस्तार से जांचना है।
इस बिंदु पर आप थोड़े उलझ सकते हैं। क्या हमने नहीं कहा था कि 1 के करीब स्कोर संभावित एनॉमली दर्शाते हैं?
ऊपर के स्कैटर प्लॉट में दिखे स्कोर समायोजित किए गए हैं। ऐसा करने के लिए, पैकेज पहले एक ऑफ़सेट निकालता है—जो contamination मान के आधार पर एनॉमली स्कोर का पर्सेंटाइल है। हमारे मामले में, ऑफ़सेट 0.99 पर्सेंटाइल होगा। अंतिम स्कोर फिर offset - score से दिए जाते हैं। इसका मतलब है कि 0 से नीचे के सभी स्कोर संभावित एनॉमली का संकेत देते हैं।
आगे की विश्लेषण
ऊपर के स्कैटर प्लॉट से हम संभावित एनॉमली पहचान सकते हैं। पर यह नहीं बताता कि इन्हें एनॉमली क्यों वर्गीकृत किया गया। यह जानने के लिए हमें आगे विश्लेषण करना होगा।
उदाहरण के लिए, नीचे दिए कोड में हम सभी इंस्टेंस का स्कैटर प्लॉट बनाते हैं, जिसमें CO(GT) मान को NO2(GT) मान के विरुद्ध प्लॉट करते हैं। हम पॉइंट्स को इस आधार पर रंगते हैं कि उन्हें एनॉमली वर्गीकृत किया गया है या नहीं।
इस प्लॉट से दिखता है कि CO(GT) प्रदूषक माप विशेष रूप से महत्वपूर्ण है। ध्यान दें कि कई एनॉमली में इस फीचर का मान 6 से अधिक है। हालांकि, यह सभी एनॉमलियों की व्याख्या नहीं करता। कुछ में दोनों फीचर्स के मान उच्च हैं और कुछ इस प्लॉट के किसी भी फीचर के कारण एनॉमली नहीं लगते। यह सुझाता है कि अन्य प्रदूषकों ने भी वर्गीकरण में योगदान दिया है।
आइसोलेशन फ़ॉरेस्ट के फायदे
यहीं से आइसोलेशन फ़ॉरेस्ट के अन्य एनॉमली डिटेक्शन तरीकों पर मुख्य फायदे सामने आते हैं। पहला, ये हाई-डायमेंशनल डेटा संभाल सकती हैं। जैसा हमने देखा, सभी फीचर्स का उपयोग कर इंस्टेंस को एनॉमली फ़्लैग किया जा सकता है, और यह विधि चार से कहीं अधिक फीचर्स के साथ भी अच्छी तरह काम करती है। एक और बड़ा फायदा है कि यह विभिन्न प्रकार की एनॉमलियों को ढूंढ सकती है।
तुलना के लिए, एक सरल एनॉमली डिटेक्शन तरीका z-score है। व्यक्तिगत फीचर्स पर, यह फीचर वैल्यू के उनके औसत से दूरी के आधार पर एनॉमली तय करता है। लेकिन यह केवल एक प्रकार की एनॉमली है। यह तरीका यह भी मानता है कि फीचर्स नार्मल डिस्ट्रीब्यूशन का पालन करते हैं और हमें अपने डेटासेट के हर फीचर के z-scores का आकलन करना पड़ता है।
आइसोलेशन फ़ॉरेस्ट में हम किसी फीचर के डिस्ट्रीब्यूशन के बारे में मान्यताएँ नहीं बनाते। नतीजा यह कि हम ऐसे इंस्टेंस ढूँढ सकते हैं जो औसत से दूर होने के अलावा अन्य कारणों से एनॉमली हों। जैसा कि देखा, हम सभी फीचर्स को साथ लेकर वर्गीकरण कर सकते हैं। बड़े डेटासेट में यह हमारी एनालिसिस को काफ़ी सरल बना देता है।
अन्य बातों में यह भी शामिल है कि आइसोलेशन फ़ॉरेस्ट की टाइम कॉम्प्लेक्सिटी रैखिक (लीनियर) होती है और यह अनसुपरवाइज़्ड है। इससे यह बड़े डेटासेट में बिना पूर्वज्ञान के एनॉमली खोजने की आदर्श विधि बनती है—जैसा कि वास्तविक दुनिया के अनुप्रयोगों में होता है, जैसे फ्रॉड डिटेक्शन, जहाँ सामान्य ट्रांज़ैक्शनों के सागर में नए प्रकार की धोखाधड़ी उभरती रहती है।
आइसोलेशन फ़ॉरेस्ट की सीमाएँ
आइसोलेशन फ़ॉरेस्ट की एक प्रमुख सीमा यह है कि छोटे डेटासेट पर इसका प्रदर्शन अच्छा न हो सके। इसका संबंध आइसोलेशन ट्री बनाने की रैंडम प्रक्रिया से है। हमेशा संभावना रहती है कि सामान्य इंस्टेंस के पाथ छोटे पड़ जाएँ या उल्टा, एनॉमली के पाथ लंबे हो जाएँ। छोटे डेटासेट में ऐसा होने की संभावना अधिक होती है। यानी, आइसोलेशन फ़ॉरेस्ट को अच्छे से काम करने के लिए पर्याप्त डेटा चाहिए ताकि रैंडमनेस औसतन संतुलित हो जाए।
एक और सीमा, जैसा हमने देखा, यह है कि आइसोलेशन फ़ॉरेस्ट केवल संभावित एनॉमली की पहचान कर सकता है। यह नहीं बताता कि कुछ इंस्टेंस एनॉमली क्यों हैं। इसके लिए आगे विश्लेषण करना पड़ता है। अब, जटिल एनॉमली की पहचान का यही फायदा एक चुनौती बनता है। अंततः, किसी एनॉमली की पूरी व्याख्या करने में बहुत काम और डोमेन ज्ञान लग सकता है।
निष्कर्ष
हमने विभिन्न डोमेन में एनॉमली डिटेक्शन के लिए एक शक्तिशाली टूल—आइसोलेशन फ़ॉरेस्ट—का अध्ययन किया। देखा कि इसका अनोखा दृष्टिकोण—रैंडम पार्टिशनिंग के ज़रिए एनॉमली को अलग करना—पारंपरिक तरीकों पर बढ़त देता है: हाई-डायमेंशनल डेटा हैंडल करना, जटिल एनॉमली पैटर्न पहचानना, और स्केलेबिलिटी।
Python और Scikit-learn के व्यावहारिक उदाहरण ने इसके उपयोग में आसानी को दर्शाया।
हालाँकि आइसोलेशन फ़ॉरेस्ट पूर्वज्ञान के बिना संभावित एनॉमली प्रभावी रूप से खोज सकता है, इसकी सीमाएँ भी हैं—खासकर छोटे डेटासेट के साथ काम करते समय और इस बात की व्याख्या न कर पाने में कि कुछ इंस्टेंस एनॉमली क्यों हैं।