फ़ीचर्स की संख्या के लिहाज से उच्च-आयामी डेटा आजकल मशीन लर्निंग समस्याओं में तेजी से आम हो गया है। इस बड़े डेटा से उपयोगी जानकारी निकालने के लिए आपको सांख्यिकीय तकनीकों का इस्तेमाल कर शोर या अनावश्यक डेटा को घटाना होता है। ऐसा इसलिए क्योंकि अक्सर आपको मॉडल को प्रशिक्षित करने के लिए हर फ़ीचर का उपयोग करने की ज़रूरत नहीं होती। आप केवल उन्हीं फ़ीचर्स को देकर अपने मॉडल को बेहतर बना सकते हैं जो असह-संबद्ध और गैर-अनावश्यक हों। यहीं पर फ़ीचर चयन महत्वपूर्ण भूमिका निभाता है। यह न केवल आपके मॉडल को तेज़ी से प्रशिक्षित करने में मदद करता है, बल्कि मॉडल की जटिलता भी घटाता है, उसे समझना आसान बनाता है और सटीकता, प्रिसिशन या रिकॉल—जो भी प्रदर्शन मीट्रिक हो—में सुधार करता है।
इस ट्यूटोरियल में, आप निम्नलिखित अवधारणाओं पर काम करेंगे:
सबसे पहले, आप फ़ीचर चयन के बारे में और जानेंगे: आप देखेंगे कि इसे कब इस्तेमाल कर सकते हैं, और अपने मॉडल के लिए सबसे महत्वपूर्ण फ़ीचर्स चुनने के लिए आपके पास कौन से तरीक़े उपलब्ध हैं!
फिर, आपको Boruta एल्गोरिद्म से परिचय कराया जाएगा। आप देखेंगे कि मूल विशेषताओं के महत्व की तुलना उनके क्रम-विकृत प्रतियों से यादृच्छिक रूप से संभव महत्व से करके प्रासंगिक फ़ीचर्स के लिए टॉप-डाउन खोज कैसे की जाती है, और क्रमशः अप्रासंगिक फ़ीचर्स को कैसे हटाया जाता है।
अंत में, आप Boruta पैकेज के बारे में और जानेंगे, जिसका उपयोग आप एल्गोरिद्म चलाने के लिए कर सकते हैं।
Feature Selection
आम तौर पर, जब भी आप डेटा की विमीयता (dimensionality) घटाना चाहते हैं तो आपको Principal Component Analysis, Singular Value Decomposition आदि जैसी विधियाँ मिलती हैं। तो यह पूछना स्वाभाविक है कि आपको अन्य फ़ीचर चयन विधियों की ज़रूरत क्यों है। बात यह है कि ये तकनीकें अनदेखी (unsupervised) फ़ीचर चयन के तरीके हैं: उदाहरण के लिए PCA, जो डेटा में वैरिएंस का उपयोग करके कंपोनेंट्स ढूँढता है। ये तकनीकें फ़ीचर मानों और लक्ष्य वर्ग या मानों के बीच की जानकारी को ध्यान में नहीं रखतीं। साथ ही, ऐसी विधियों से जुड़े कुछ अनुमानों, जैसे सामान्यता (normality), के कारण उन्हें लागू करने से पहले कुछ रूपांतरणों की आवश्यकता होती है। ये बाध्यताएँ हर तरह के डेटा पर लागू नहीं होतीं।
सामान्यतः फ़ीचर चयन विधियाँ तीन प्रकार की होती हैं:
फ़िल्टर विधियाँ: फ़िल्टर विधियाँ आम तौर पर प्रीप्रोसेसिंग चरण के रूप में उपयोग होती हैं। फ़ीचर्स का चयन किसी भी मशीन लर्निंग एल्गोरिद्म से स्वतंत्र होता है। इसके बजाय, फ़ीचर्स को परिणाम चर के साथ उनके सहसंबंध के लिए विभिन्न सांख्यिकीय परीक्षणों में उनके स्कोर के आधार पर चुना जाता है। कुछ सामान्य फ़िल्टर विधियाँ हैं Correlation मेट्रिक्स (Pearson, Spearman, Distance), Chi-Squared test, ANOVA, Fisher's Score आदि।
रैपर विधियाँ: रैपर विधियों में, आप फ़ीचर्स के एक सबसेट का उपयोग करने की कोशिश करते हैं और उन पर मॉडल प्रशिक्षित करते हैं। पिछले मॉडल से निकले निष्कर्षों के आधार पर, आप सबसेट में फ़ीचर्स जोड़ने या हटाने का निर्णय लेते हैं। Forward Selection, Backward Elimination रैपर विधियों के कुछ उदाहरण हैं।
एम्बेडेड विधियाँ: ये ऐसे एल्गोरिद्म हैं जिनमें अपने अंतर्निहित फ़ीचर चयन तरीके होते हैं। LASSO रिग्रेशन इसका एक उदाहरण है।
इस ट्यूटोरियल में आप रैपर विधियों में से एक का उपयोग करेंगे जो R में Boruta नामक पैकेज के माध्यम से आसानी से उपलब्ध है।
The Boruta Algorithm
Boruta एल्गोरिद्म, random forest वर्गीकरण एल्गोरिद्म के इर्द-गिर्द बना एक रैपर है। यह आपके डेटासेट में आउटपुट वेरिएबल के संदर्भ में मौजूद सभी महत्वपूर्ण और दिलचस्प फ़ीचर्स को पकड़ने की कोशिश करता है।
सबसे पहले, यह डेटासेट की प्रतिलिपि बनाता है और प्रत्येक कॉलम के मानों को शफ़ल करता है। इन मानों को shadow features कहा जाता है। * फिर, यह डेटासेट पर एक क्लासिफायर, जैसे Random Forest Classifier, प्रशिक्षित करता है। ऐसा करने से आपको अपने डेटा सेट के प्रत्येक फ़ीचर के लिए महत्व का अंदाज़ा मिलता है—Mean Decrease Accuracy या Mean Decrease Impurity के माध्यम से। स्कोर जितना अधिक, फ़ीचर उतना बेहतर या अधिक महत्वपूर्ण।
इसके बाद, एल्गोरिद्म आपके प्रत्येक वास्तविक फ़ीचर के लिए जाँचता है कि क्या उनका महत्व अधिक है। यानी, क्या उस फ़ीचर का Z-score उसकी shadow विशेषताओं के अधिकतम Z-score से—सबसे अच्छे shadow फ़ीचर से—अधिक है। यदि हाँ, तो वह इसे एक वेक्टर में दर्ज करता है। इन्हें hits कहा जाता है। फिर, यह एक और iteration के साथ जारी रहेगा। पूर्वनिर्धारित iterations के बाद, आपके पास इन hits की एक तालिका होगी। ध्यान दें: Z-score बताता है कि कोई डेटा बिंदु औसत से कितने मानक विचलन दूर है; अधिक जानकारी के लिए यहाँ क्लिक करें।
हर iteration पर, एल्गोरिद्म फ़ीचर्स की शफ़ल की गई प्रतियों और मूल फ़ीचर्स के Z-scores की तुलना करता है ताकि देखा जा सके कि क्या बाद वाले ने पहले वालों से बेहतर प्रदर्शन किया। यदि ऐसा होता है, तो एल्गोरिद्म उस फ़ीचर को महत्वपूर्ण चिह्नित कर देता है। सार में, एल्गोरिद्म यादृच्छिक शफ़ल प्रतियों से तुलना करके फ़ीचर के महत्व का सत्यापन करने की कोशिश कर रहा है, जो मज़बूती बढ़ाता है। यह बस बाइनोमियल वितरण का उपयोग करके यह तुलना कर करता है कि किसी फ़ीचर ने shadow फ़ीचर्स की तुलना में कितनी बार बेहतर किया।
यदि कोई फ़ीचर, मान लीजिए 15 iterations में, एक भी hit के रूप में दर्ज नहीं हुआ है, तो आप उसे अस्वीकार कर देते हैं और मूल मैट्रिक्स से हटा देते हैं। तयशुदा iterations के बाद—या यदि सभी फ़ीचर्स की पुष्टि या अस्वीकृति हो चुकी है—आप रुक जाते हैं।
R में Boruta एल्गोरिद्म
आइए Boruta एल्गोरिद्म को सबसे आम उपलब्ध डेटासेट्स में से एक पर लागू करें: Bank Marketing डेटा। यह डेटा पुर्तगाली बैंकिंग संस्थान के डायरेक्ट मार्केटिंग अभियानों (फोन कॉल्स) का प्रतिनिधित्व करता है। वर्गीकरण का लक्ष्य यह भविष्यवाणी करना है कि क्लाइंट टर्म डिपॉज़िट सब्सक्राइब करेगा या नहीं।
सुझाव: विभिन्न फ़ीचर्स का विस्तृत विवरण यहाँ ज़रूर देखें।
आइए summary() फ़ंक्शन का उपयोग करके आपके डेटासेट में विभिन्न फ़ीचर्स के सामान्य वर्णनात्मक आँकड़ों का सार लें।
summary(read_file)## age job marital education ## Min. :19.00 Length:4521 Length:4521 Length:4521 ## 1st Qu.:33.00 Class :character Class :character Class :character ## Median :39.00 Mode :character Mode :character Mode :character ## Mean :41.17 ## 3rd Qu.:49.00 ## Max. :87.00 ## default balance housing loan ## Length:4521 Min. :-3313 Length:4521 Length:4521 ## Class :character 1st Qu.: 69 Class :character Class :character ## Mode :character Median : 444 Mode :character Mode :character ## Mean : 1423 ## 3rd Qu.: 1480 ## Max. :71188 ## contact day month duration ## Length:4521 Min. : 1.00 Length:4521 Min. : 4 ## Class :character 1st Qu.: 9.00 Class :character 1st Qu.: 104 ## Mode :character Median :16.00 Mode :character Median : 185 ## Mean :15.92 Mean : 264 ## 3rd Qu.:21.00 3rd Qu.: 329 ## Max. :31.00 Max. :3025 ## campaign pdays previous poutcome ## Min. : 1.000 Min. : -1.00 Min. : 0.0000 Length:4521 ## 1st Qu.: 1.000 1st Qu.: -1.00 1st Qu.: 0.0000 Class :character ## Median : 2.000 Median : -1.00 Median : 0.0000 Mode :character ## Mean : 2.794 Mean : 39.77 Mean : 0.5426 ## 3rd Qu.: 3.000 3rd Qu.: -1.00 3rd Qu.: 0.0000 ## Max. :50.000 Max. :871.00 Max. :25.0000 ## y ## Length:4521 ## Class :character ## Mode :character ## ## ## संचालित द्वारा
summary() फ़ंक्शन निरंतर फ़ीचर्स के लिए केन्द्रीय प्रवृत्ति के माप, जैसे mean, median, quantiles आदि देता है। यदि आपके डेटा सेट में कोई श्रेणीय (categorical) फ़ीचर्स हैं, तो आपको उनके Class और Mode भी दिखेंगे।
अब श्रेणीय फ़ीचर्स को factor डेटा प्रकार में बदलते हैं:
क्योंकि shadow फ़ीचर्स बनाने के लिए डेटा बिंदुओं को शफ़ल किया जाता है और उनके लिए Z-score निकाला जाता है, इसलिए boruta पैकेज उपयोग करने से पहले मिसिंग या खाली मानों का उपचार करना महत्वपूर्ण है, वरना यह त्रुटि देता है।
(अ)भाग्यवश, इस डेटासेट में दोनों में से कोई नहीं है। फिर भी, शैक्षिक उद्देश्य से, आप डेटा में कुछ NA जोड़ेंगे।
आइए prodNA() फ़ंक्शन का उपयोग करके अपने डेटा सेट में मिसिंग वैल्यूज़ डालें। आप यह फ़ंक्शन missForest पैकेज इंस्टॉल कर एक्सेस कर सकते हैं।
याद रखें कि आवश्यकता होने पर आप install.packages() से मिसिंग पैकेज इंस्टॉल कर सकते हैं!
library(missForest)# Generate 5% missing values at random
bank.mis <- prodNA(read_file, noNA =0.05)संचालित द्वारा
आप अपने नए डेटा फ़्रेम पर फिर से summary() फ़ंक्शन कॉल करके इम्प्यूट किए गए NA की संख्या पा सकते हैं, लेकिन चलिए थोड़े और रचनात्मक बनते हैं!
निम्नलिखित ggplot2 कोड का उपयोग करके डेटा में मिसिंगनेस को विज़ुअलाइज़ करें:
library(reshape2)
library(ggplot2)
library(dplyr)
ggplot_missing <-function(x){
x %>%
is.na %>%
melt %>%
ggplot(data = .,
aes(x = Var2,
y = Var1))+
geom_raster(aes(fill = value))+
scale_fill_grey(name ="",
labels = c("Present","Missing"))+
theme_minimal()+
theme(axis.text.x = element_text(angle=45, vjust=0.5))+
labs(x ="Variables in Dataset",
y ="Rows / observations")}
ggplot_missing(bank.mis)संचालित द्वारा
प्लॉट में सफेद रेखाएँ आपको दृश्य रूप से दिखाती हैं कि आपने हर फ़ीचर में मिसिंग वैल्यूज़ डाली हैं, लेकिन आपने देखा कि वह ggplot_missing फ़ंक्शन लिखने में कितनी मेहनत लगी? खैर, R में Amelia पैकेज, जिसका आप अगले खंड में उपयोग करेंगे, इसी तरह का चित्र बनाने के लिए एक पंक्ति का विकल्प देता है:
अब आप कई तरीकों से मिसिंग वैल्यूज़ इम्प्यूट कर सकते हैं, जैसे mean, median या mode (श्रेणीय फ़ीचर्स के लिए) से इम्प्यूट करना, पर चलिए मिसिंग वैल्यूज़ इम्प्यूट करने के लिए एक और शक्तिशाली पैकेज Amelia का उपयोग करते हैं।
Amelia m बूटस्ट्रैप सैंपल लेता है और प्रत्येक सैंपल पर EMB (expectation-maximization with bootstrapping) एल्गोरिद्म लागू करता है। mean और variance के m आकलन अलग-अलग होंगे। अंततः, पहले अनुमान सेट का उपयोग रिग्रेशन से पहली मिसिंग वैल्यूज़ सेट को इम्प्यूट करने के लिए किया जाता है, फिर दूसरे अनुमान सेट का उपयोग दूसरी सेट के लिए, और इसी तरह। बहु-इम्प्यूटेशन पक्षपात घटाने और दक्षता बढ़ाने में सहायक होता है। साथ ही, यह मल्टीकोर CPU का उपयोग करके पैरेलल इम्प्यूटेशन को सक्षम करता है।
इसके 3 महत्वपूर्ण पैरामीटर हैं:
m: बनाए जाने वाले इम्प्यूटेड डेटासेट्स की संख्या।
idvars: सभी ID वेरिएबल्स और वे अन्य वेरिएबल्स रखें जिन्हें आप इम्प्यूट नहीं करना चाहते।
इम्प्यूटेड डेटासेट को csv फ़ाइलों में निर्यात करने के लिए उपयोग करें:
write.amelia(amelia_bank, file.stem ="imputed_bank_data_set")संचालित द्वारा
Boruta R पैकेज
अब किसी एक इम्प्यूटेड डेटासेट पर Boruta एल्गोरिद्म का उपयोग करें। आप इसके लिए Boruta पैकेज का उपयोग कर सकते हैं:
library(Boruta)
set.seed(111)
boruta.bank_train <- Boruta(y~., data = amelia_bank$imputations[[1]], doTrace =2)
print(boruta.bank_train)## Boruta performed 99 iterations in 18.97234 mins.## 10 attributes confirmed important: age, contact, day, duration,## housing and 5 more;## 3 attributes confirmed unimportant: education, job, marital;## 3 tentative attributes left: balance, campaign, default;संचालित द्वारा
Boruta किसी डेटा सेट में फ़ीचर्स की महत्व-परकता पर निर्णय देता है। कई पहले से ही महत्वपूर्ण और गैर-महत्वपूर्ण के रूप में वर्गीकृत हो चुके हैं, लेकिन आप देखते हैं कि कुछ को tentative श्रेणी में रखा गया है।
लेकिन इसका मतलब क्या है?
Tentative फ़ीचर्स का महत्व उनके सर्वश्रेष्ठ shadow फ़ीचर्स के इतना क़रीब होता है कि डिफ़ॉल्ट संख्या की Random Forest रन में Boruta वांछित विश्वसनीयता के साथ निर्णय नहीं ले पाता।
फिर आप इसके बारे में क्या करते हैं?
यदि tentative फ़ीचर्स रह जाते हैं तो आप maxRuns पैरामीटर बढ़ाने पर विचार कर सकते हैं। हालाँकि, ध्यान दें कि आप mtry और ntree पैरामीटरों के मान भी दे सकते हैं, जो randomForest() फ़ंक्शन को पास होंगी। पहला आपको यह निर्दिष्ट करने देता है कि प्रत्येक split पर उम्मीदवारों के रूप में यादृच्छिक रूप से कितने वेरिएबल्स सैंपल किए जाएँ, जबकि दूसरा यह बताने के लिए है कि आप कितने पेड़ उगाना चाहते हैं। इन आर्ग्युमेंट्स के साथ, Random Forest क्लासिफायर out-of-bag त्रुटि के न्यूनतम मान पर अभिसरण प्राप्त करेगा।
याद रखें कि out-of-bag त्रुटि उन क्लासिफायर्स की भविष्यवाणी त्रुटि को मापने का एक अनुमान है जो प्रशिक्षण में डेटा सैंपल्स को सब-सैंपल करने के लिए बूटस्ट्रैप एग्रीगेशन का उपयोग करते हैं। यह प्रत्येक प्रशिक्षण सैंपल X पर केवल उन पेड़ों का उपयोग करके औसत भविष्यवाणी त्रुटि है जिनके बूटस्ट्रैप सैंपल में X शामिल नहीं था।
वैकल्पिक रूप से, आप प्रक्रिया की प्रगति की रिपोर्ट पाने के लिए doTrace आर्ग्युमेंट को 1 या 2 पर सेट कर सकते हैं।
boruta पैकेज में TentativeRoughFix() फ़ंक्शन भी होता है, जिसका उपयोग median फ़ीचर Z-score की तुलना सबसे महत्वपूर्ण shadow फ़ीचर के median Z-score से करके मिसिंग निर्णयों को भरने के लिए किया जा सकता है:
#take a call on tentative features
boruta.bank <- TentativeRoughFix(boruta.bank_train)
print(boruta.bank)## Boruta performed 99 iterations in 18.97234 mins.## Tentatives roughfixed over the last 99 iterations.## 12 attributes confirmed important: age, campaign, contact, day,## default and 7 more;## 4 attributes confirmed unimportant: balance, education, job,## marital;संचालित द्वारा
अब Boruta ने अपना काम कर दिया है: इसने प्रत्येक फ़ीचर को महत्वपूर्ण या गैर-महत्वपूर्ण के रूप में सफलतापूर्वक वर्गीकृत कर दिया है।
आप plot(boruta.bank) कॉल करके boruta वेरिएबल इम्पॉर्टेंस चार्ट प्लॉट कर सकते हैं। हालाँकि, x अक्ष के लेबल क्षैतिज होंगे। यह बहुत सुथरा नहीं लगेगा।
इसीलिए आप निम्नलिखित कोड खंड की तरह x अक्ष पर फ़ीचर लेबल्स को लंबवत जोड़ेंगे:
y अक्ष का लेबल Importance शफ़ल किए गए डेटासेट में हर फ़ीचर के Z स्कोर का प्रतिनिधित्व करता है।
नीले बॉक्सप्लॉट्स किसी shadow फ़ीचर के न्यूनतम, औसत और अधिकतम Z स्कोर को दर्शाते हैं, जबकि लाल और हरे बॉक्सप्लॉट क्रमशः अस्वीकृत और पुष्टि किए गए फ़ीचर्स के Z स्कोर दर्शाते हैं। जैसा कि आप देख सकते हैं, लाल बॉक्सप्लॉट्स का Z स्कोर shadow फ़ीचर के अधिकतम Z स्कोर से कम है, जो ठीक वही कारण है कि उन्हें गैर-महत्वपूर्ण श्रेणी में रखा गया।
आप निम्न लिखकर फ़ीचर्स के महत्व की पुष्टि कर सकते हैं:
आप परिणाम को आसानी से मान्य कर सकते हैं क्योंकि duration फ़ीचर को सबसे अधिक महत्व दिया गया है, जो डेटा विवरण में पहले से उल्लिखित है (ध्यान से पढ़ें तो यहाँ देखें)!
निष्कर्ष
वाह! आपने कुछ पंक्तियों का कोड लिखकर ही अपने डेटासेट से सबसे महत्वपूर्ण फ़ीचर्स फ़िल्टर कर लिए हैं। इसके साथ आपने अपने डेटा से शोर घटा दिया है, जो किसी भी क्लासिफायर के लिए किसी ऑब्ज़र्वेशन को लेबल असाइन करने में वास्तव में लाभकारी होगा। इन महत्वपूर्ण फ़ीचर्स पर मॉडल प्रशिक्षित करने से आपके मॉडल का प्रदर्शन निश्चित रूप से बेहतर होगा—जो कि शुरुआत में फ़ीचर चयन करने का उद्देश्य था!
यदि आप उन संसाधनों को देखना चाहते हैं जिनका उपयोग इस ट्यूटोरियल को बनाने में किया गया है, तो निम्न देखें:
PACKAGE AMELIA : A Program for Missing Data; James Honaker, Gary King, and Matthew Blackwell
Feature Selection with the Boruta Package; Miron B. Kursa, Witold R. Rudnicki
फ़ीचर्स की संख्या के लिहाज से उच्च-आयामी डेटा आजकल मशीन लर्निंग समस्याओं में तेजी से आम हो गया है। इस बड़े डेटा से उपयोगी जानकारी निकालने के लिए आपको सांख्यिकीय तकनीकों का इस्तेमाल कर शोर या अनावश्यक डेटा को घटाना होता है। ऐसा इसलिए क्योंकि अक्सर आपको मॉडल को प्रशिक्षित करने के लिए हर फ़ीचर का उपयोग करने की ज़रूरत नहीं होती। आप केवल उन्हीं फ़ीचर्स को देकर अपने मॉडल को बेहतर बना सकते हैं जो असह-संबद्ध और गैर-अनावश्यक हों। यहीं पर फ़ीचर चयन महत्वपूर्ण भूमिका निभाता है। यह न केवल आपके मॉडल को तेज़ी से प्रशिक्षित करने में मदद करता है, बल्कि मॉडल की जटिलता भी घटाता है, उसे समझना आसान बनाता है और सटीकता, प्रिसिशन या रिकॉल—जो भी प्रदर्शन मीट्रिक हो—में सुधार करता है।
इस ट्यूटोरियल में, आप निम्नलिखित अवधारणाओं पर काम करेंगे:
सबसे पहले, आप फ़ीचर चयन के बारे में और जानेंगे: आप देखेंगे कि इसे कब इस्तेमाल कर सकते हैं, और अपने मॉडल के लिए सबसे महत्वपूर्ण फ़ीचर्स चुनने के लिए आपके पास कौन से तरीक़े उपलब्ध हैं!
फिर, आपको Boruta एल्गोरिद्म से परिचय कराया जाएगा। आप देखेंगे कि मूल विशेषताओं के महत्व की तुलना उनके क्रम-विकृत प्रतियों से यादृच्छिक रूप से संभव महत्व से करके प्रासंगिक फ़ीचर्स के लिए टॉप-डाउन खोज कैसे की जाती है, और क्रमशः अप्रासंगिक फ़ीचर्स को कैसे हटाया जाता है।
आप उस डेटासेट पर भी संक्षिप्त नज़र डालेंगे, जिस पर आप फ़ीचर चयन करेंगे। आप देखेंगे कि
Ameliaपैकेज की मदद से मिसिंग वैल्यूज़ को कैसे इम्प्यूट किया जा सकता है।अंत में, आप
Borutaपैकेज के बारे में और जानेंगे, जिसका उपयोग आप एल्गोरिद्म चलाने के लिए कर सकते हैं।Feature Selection
आम तौर पर, जब भी आप डेटा की विमीयता (dimensionality) घटाना चाहते हैं तो आपको Principal Component Analysis, Singular Value Decomposition आदि जैसी विधियाँ मिलती हैं। तो यह पूछना स्वाभाविक है कि आपको अन्य फ़ीचर चयन विधियों की ज़रूरत क्यों है। बात यह है कि ये तकनीकें अनदेखी (unsupervised) फ़ीचर चयन के तरीके हैं: उदाहरण के लिए PCA, जो डेटा में वैरिएंस का उपयोग करके कंपोनेंट्स ढूँढता है। ये तकनीकें फ़ीचर मानों और लक्ष्य वर्ग या मानों के बीच की जानकारी को ध्यान में नहीं रखतीं। साथ ही, ऐसी विधियों से जुड़े कुछ अनुमानों, जैसे सामान्यता (normality), के कारण उन्हें लागू करने से पहले कुछ रूपांतरणों की आवश्यकता होती है। ये बाध्यताएँ हर तरह के डेटा पर लागू नहीं होतीं।
सामान्यतः फ़ीचर चयन विधियाँ तीन प्रकार की होती हैं:
फ़िल्टर विधियाँ: फ़िल्टर विधियाँ आम तौर पर प्रीप्रोसेसिंग चरण के रूप में उपयोग होती हैं। फ़ीचर्स का चयन किसी भी मशीन लर्निंग एल्गोरिद्म से स्वतंत्र होता है। इसके बजाय, फ़ीचर्स को परिणाम चर के साथ उनके सहसंबंध के लिए विभिन्न सांख्यिकीय परीक्षणों में उनके स्कोर के आधार पर चुना जाता है। कुछ सामान्य फ़िल्टर विधियाँ हैं Correlation मेट्रिक्स (Pearson, Spearman, Distance), Chi-Squared test, ANOVA, Fisher's Score आदि।
रैपर विधियाँ: रैपर विधियों में, आप फ़ीचर्स के एक सबसेट का उपयोग करने की कोशिश करते हैं और उन पर मॉडल प्रशिक्षित करते हैं। पिछले मॉडल से निकले निष्कर्षों के आधार पर, आप सबसेट में फ़ीचर्स जोड़ने या हटाने का निर्णय लेते हैं। Forward Selection, Backward Elimination रैपर विधियों के कुछ उदाहरण हैं।
एम्बेडेड विधियाँ: ये ऐसे एल्गोरिद्म हैं जिनमें अपने अंतर्निहित फ़ीचर चयन तरीके होते हैं। LASSO रिग्रेशन इसका एक उदाहरण है।
इस ट्यूटोरियल में आप रैपर विधियों में से एक का उपयोग करेंगे जो R में
Borutaनामक पैकेज के माध्यम से आसानी से उपलब्ध है।The Boruta Algorithm
Boruta एल्गोरिद्म, random forest वर्गीकरण एल्गोरिद्म के इर्द-गिर्द बना एक रैपर है। यह आपके डेटासेट में आउटपुट वेरिएबल के संदर्भ में मौजूद सभी महत्वपूर्ण और दिलचस्प फ़ीचर्स को पकड़ने की कोशिश करता है।
R में Boruta एल्गोरिद्म
आइए Boruta एल्गोरिद्म को सबसे आम उपलब्ध डेटासेट्स में से एक पर लागू करें: Bank Marketing डेटा। यह डेटा पुर्तगाली बैंकिंग संस्थान के डायरेक्ट मार्केटिंग अभियानों (फोन कॉल्स) का प्रतिनिधित्व करता है। वर्गीकरण का लक्ष्य यह भविष्यवाणी करना है कि क्लाइंट टर्म डिपॉज़िट सब्सक्राइब करेगा या नहीं।
सुझाव: विभिन्न फ़ीचर्स का विस्तृत विवरण यहाँ ज़रूर देखें।
आइए
summary()फ़ंक्शन का उपयोग करके आपके डेटासेट में विभिन्न फ़ीचर्स के सामान्य वर्णनात्मक आँकड़ों का सार लें।summary()फ़ंक्शन निरंतर फ़ीचर्स के लिए केन्द्रीय प्रवृत्ति के माप, जैसे mean, median, quantiles आदि देता है। यदि आपके डेटा सेट में कोई श्रेणीय (categorical) फ़ीचर्स हैं, तो आपको उनके Class और Mode भी दिखेंगे।अब श्रेणीय फ़ीचर्स को factor डेटा प्रकार में बदलते हैं:
क्योंकि shadow फ़ीचर्स बनाने के लिए डेटा बिंदुओं को शफ़ल किया जाता है और उनके लिए Z-score निकाला जाता है, इसलिए
borutaपैकेज उपयोग करने से पहले मिसिंग या खाली मानों का उपचार करना महत्वपूर्ण है, वरना यह त्रुटि देता है।(अ)भाग्यवश, इस डेटासेट में दोनों में से कोई नहीं है। फिर भी, शैक्षिक उद्देश्य से, आप डेटा में कुछ
NAजोड़ेंगे।आइए
prodNA()फ़ंक्शन का उपयोग करके अपने डेटा सेट में मिसिंग वैल्यूज़ डालें। आप यह फ़ंक्शनmissForestपैकेज इंस्टॉल कर एक्सेस कर सकते हैं।याद रखें कि आवश्यकता होने पर आप
install.packages()से मिसिंग पैकेज इंस्टॉल कर सकते हैं!आप अपने नए डेटा फ़्रेम पर फिर से
summary()फ़ंक्शन कॉल करके इम्प्यूट किए गएNAकी संख्या पा सकते हैं, लेकिन चलिए थोड़े और रचनात्मक बनते हैं!निम्नलिखित
ggplot2कोड का उपयोग करके डेटा में मिसिंगनेस को विज़ुअलाइज़ करें:प्लॉट में सफेद रेखाएँ आपको दृश्य रूप से दिखाती हैं कि आपने हर फ़ीचर में मिसिंग वैल्यूज़ डाली हैं, लेकिन आपने देखा कि वह
ggplot_missingफ़ंक्शन लिखने में कितनी मेहनत लगी? खैर,RमेंAmeliaपैकेज, जिसका आप अगले खंड में उपयोग करेंगे, इसी तरह का चित्र बनाने के लिए एक पंक्ति का विकल्प देता है:इसे ख़ुद आज़माएँ!
Ameliaके साथ मिसिंग वैल्यूज़ इम्प्यूट करनाअब आप कई तरीकों से मिसिंग वैल्यूज़ इम्प्यूट कर सकते हैं, जैसे mean, median या mode (श्रेणीय फ़ीचर्स के लिए) से इम्प्यूट करना, पर चलिए मिसिंग वैल्यूज़ इम्प्यूट करने के लिए एक और शक्तिशाली पैकेज Amelia का उपयोग करते हैं।
Amelia
mबूटस्ट्रैप सैंपल लेता है और प्रत्येक सैंपल परEMB(expectation-maximization with bootstrapping) एल्गोरिद्म लागू करता है। mean और variance केmआकलन अलग-अलग होंगे। अंततः, पहले अनुमान सेट का उपयोग रिग्रेशन से पहली मिसिंग वैल्यूज़ सेट को इम्प्यूट करने के लिए किया जाता है, फिर दूसरे अनुमान सेट का उपयोग दूसरी सेट के लिए, और इसी तरह। बहु-इम्प्यूटेशन पक्षपात घटाने और दक्षता बढ़ाने में सहायक होता है। साथ ही, यह मल्टीकोर CPU का उपयोग करके पैरेलल इम्प्यूटेशन को सक्षम करता है।इसके 3 महत्वपूर्ण पैरामीटर हैं:
m: बनाए जाने वाले इम्प्यूटेड डेटासेट्स की संख्या।idvars: सभी ID वेरिएबल्स और वे अन्य वेरिएबल्स रखें जिन्हें आप इम्प्यूट नहीं करना चाहते।noms: नाममात्र (nominal) वेरिएबल्स यहाँ दें।इम्प्यूटेड डेटा फ़्रेम्स तक पहुँचने के लिए, आप निम्नलिखित सबसेटिंग का उपयोग कर सकते हैं:
इम्प्यूटेड डेटासेट को
csvफ़ाइलों में निर्यात करने के लिए उपयोग करें:BorutaR पैकेजअब किसी एक इम्प्यूटेड डेटासेट पर Boruta एल्गोरिद्म का उपयोग करें। आप इसके लिए Boruta पैकेज का उपयोग कर सकते हैं:
Boruta किसी डेटा सेट में फ़ीचर्स की महत्व-परकता पर निर्णय देता है। कई पहले से ही महत्वपूर्ण और गैर-महत्वपूर्ण के रूप में वर्गीकृत हो चुके हैं, लेकिन आप देखते हैं कि कुछ को tentative श्रेणी में रखा गया है।
लेकिन इसका मतलब क्या है?
Tentative फ़ीचर्स का महत्व उनके सर्वश्रेष्ठ shadow फ़ीचर्स के इतना क़रीब होता है कि डिफ़ॉल्ट संख्या की Random Forest रन में Boruta वांछित विश्वसनीयता के साथ निर्णय नहीं ले पाता।
फिर आप इसके बारे में क्या करते हैं?
यदि tentative फ़ीचर्स रह जाते हैं तो आप
maxRunsपैरामीटर बढ़ाने पर विचार कर सकते हैं। हालाँकि, ध्यान दें कि आपmtryऔरntreeपैरामीटरों के मान भी दे सकते हैं, जोrandomForest()फ़ंक्शन को पास होंगी। पहला आपको यह निर्दिष्ट करने देता है कि प्रत्येक split पर उम्मीदवारों के रूप में यादृच्छिक रूप से कितने वेरिएबल्स सैंपल किए जाएँ, जबकि दूसरा यह बताने के लिए है कि आप कितने पेड़ उगाना चाहते हैं। इन आर्ग्युमेंट्स के साथ, Random Forest क्लासिफायर out-of-bag त्रुटि के न्यूनतम मान पर अभिसरण प्राप्त करेगा।याद रखें कि out-of-bag त्रुटि उन क्लासिफायर्स की भविष्यवाणी त्रुटि को मापने का एक अनुमान है जो प्रशिक्षण में डेटा सैंपल्स को सब-सैंपल करने के लिए बूटस्ट्रैप एग्रीगेशन का उपयोग करते हैं। यह प्रत्येक प्रशिक्षण सैंपल X पर केवल उन पेड़ों का उपयोग करके औसत भविष्यवाणी त्रुटि है जिनके बूटस्ट्रैप सैंपल में X शामिल नहीं था।
वैकल्पिक रूप से, आप प्रक्रिया की प्रगति की रिपोर्ट पाने के लिए
doTraceआर्ग्युमेंट को1या2पर सेट कर सकते हैं।borutaपैकेज मेंTentativeRoughFix()फ़ंक्शन भी होता है, जिसका उपयोग median फ़ीचर Z-score की तुलना सबसे महत्वपूर्ण shadow फ़ीचर के median Z-score से करके मिसिंग निर्णयों को भरने के लिए किया जा सकता है:अब
Borutaने अपना काम कर दिया है: इसने प्रत्येक फ़ीचर को महत्वपूर्ण या गैर-महत्वपूर्ण के रूप में सफलतापूर्वक वर्गीकृत कर दिया है।आप
plot(boruta.bank)कॉल करके boruta वेरिएबल इम्पॉर्टेंस चार्ट प्लॉट कर सकते हैं। हालाँकि,xअक्ष के लेबल क्षैतिज होंगे। यह बहुत सुथरा नहीं लगेगा।इसीलिए आप निम्नलिखित कोड खंड की तरह
xअक्ष पर फ़ीचर लेबल्स को लंबवत जोड़ेंगे:yअक्ष का लेबलImportanceशफ़ल किए गए डेटासेट में हर फ़ीचर केZस्कोर का प्रतिनिधित्व करता है।नीले बॉक्सप्लॉट्स किसी shadow फ़ीचर के न्यूनतम, औसत और अधिकतम Z स्कोर को दर्शाते हैं, जबकि लाल और हरे बॉक्सप्लॉट क्रमशः अस्वीकृत और पुष्टि किए गए फ़ीचर्स के Z स्कोर दर्शाते हैं। जैसा कि आप देख सकते हैं, लाल बॉक्सप्लॉट्स का
Zस्कोर shadow फ़ीचर के अधिकतमZस्कोर से कम है, जो ठीक वही कारण है कि उन्हें गैर-महत्वपूर्ण श्रेणी में रखा गया।आप निम्न लिखकर फ़ीचर्स के महत्व की पुष्टि कर सकते हैं:
आप परिणाम को आसानी से मान्य कर सकते हैं क्योंकि
durationफ़ीचर को सबसे अधिक महत्व दिया गया है, जो डेटा विवरण में पहले से उल्लिखित है (ध्यान से पढ़ें तो यहाँ देखें)!निष्कर्ष
वाह! आपने कुछ पंक्तियों का कोड लिखकर ही अपने डेटासेट से सबसे महत्वपूर्ण फ़ीचर्स फ़िल्टर कर लिए हैं। इसके साथ आपने अपने डेटा से शोर घटा दिया है, जो किसी भी क्लासिफायर के लिए किसी ऑब्ज़र्वेशन को लेबल असाइन करने में वास्तव में लाभकारी होगा। इन महत्वपूर्ण फ़ीचर्स पर मॉडल प्रशिक्षित करने से आपके मॉडल का प्रदर्शन निश्चित रूप से बेहतर होगा—जो कि शुरुआत में फ़ीचर चयन करने का उद्देश्य था!
यदि आप उन संसाधनों को देखना चाहते हैं जिनका उपयोग इस ट्यूटोरियल को बनाने में किया गया है, तो निम्न देखें: