जैसे-जैसे पुनरावृत्तियों की संख्या बढ़ती है, धीरे-धीरे बूस्टिंग मशीन की सटीकता कम होती जाती है


15

मैं caretआर में पैकेज के माध्यम से ढाल बूस्टिंग मशीन एल्गोरिदम का प्रयोग कर रहा हूं ।

एक छोटे से कॉलेज प्रवेश डेटासेट का उपयोग करते हुए, मैंने निम्नलिखित कोड चलाया:

library(caret)

### Load admissions dataset. ###
mydata <- read.csv("http://www.ats.ucla.edu/stat/data/binary.csv")

### Create yes/no levels for admission. ### 
mydata$admit_factor[mydata$admit==0] <- "no"
mydata$admit_factor[mydata$admit==1] <- "yes"             

### Gradient boosting machine algorithm. ###
set.seed(123)
fitControl <- trainControl(method = 'cv', number = 5, summaryFunction=defaultSummary)
grid <- expand.grid(n.trees = seq(5000,1000000,5000), interaction.depth = 2, shrinkage = .001, n.minobsinnode = 20)
fit.gbm <- train(as.factor(admit_factor) ~ . - admit, data=mydata, method = 'gbm', trControl=fitControl, tuneGrid=grid, metric='Accuracy')
plot(fit.gbm)

और मेरे आश्चर्य का विषय है कि मॉडल की क्रॉस-सत्यापन सटीकता में वृद्धि के बजाय कमी हुई क्योंकि पुनरावृत्तियों की संख्या में वृद्धि हुई, न्यूनतम सटीकता तक पहुँचने के बारे में .59 ~ 450,000 पुनरावृत्तियों पर पहुंच गया।

यहाँ छवि विवरण दर्ज करें

क्या मैंने GBM एल्गोरिथ्म को गलत तरीके से लागू किया था?

संपादित करें: अंडरमिनेर के सुझाव के बाद, मैंने उपरोक्त caretकोड पुनः प्राप्त किया है लेकिन 100 से 5,000 तक चलने वाले पुनरावृत्तियों पर ध्यान केंद्रित किया है:

set.seed(123)
fitControl <- trainControl(method = 'cv', number = 5, summaryFunction=defaultSummary)
grid <- expand.grid(n.trees = seq(100,5000,100), interaction.depth = 2, shrinkage = .001, n.minobsinnode = 20)
fit.gbm <- train(as.factor(admit_factor) ~ . - admit, data=mydata, method = 'gbm', trControl=fitControl, tuneGrid=grid, metric='Accuracy')
plot(fit.gbm)

परिणामी साजिश से पता चलता है कि सटीकता वास्तव में ~ 1,800 पुनरावृत्तियों पर लगभग .705 पर चोटियों पर है:

यहाँ छवि विवरण दर्ज करें

क्या उत्सुक है कि सटीकता ~ .70 पर पठार नहीं था, बल्कि 5,000 पुनरावृत्तियों के बाद गिरावट आई।

जवाबों:


14

सामान्य तौर पर, बूस्टर एरर की संख्या के साथ बूस्टिंग एरर बढ़ सकता है, खासकर जब डेटा शोर हो (उदाहरण के लिए मिसबेल्ड केस)। यह आपका मुद्दा हो सकता है, लेकिन मैं आपके डेटा के बारे में अधिक जानकारी के बिना नहीं कह पाऊंगा

मूल रूप से, गलत जानकारी वाले मामलों की सही भविष्यवाणी करने पर 'फोकस' को बढ़ावा देने और इस प्रक्रिया में, अन्य मामलों पर औसत प्रदर्शन बिगड़ सकता है जो अधिक प्रबल हैं।

यह लिंक ( Boosting and Noise ) इस मुद्दे को प्रदान करने की तुलना में बेहतर विवरण दिखाता है।

लॉन्ग और सेविडियो द्वारा यह पेपर ( रैंडम क्लासिफिकेशन नॉइज़ ) मुद्दे की अधिक तकनीकी जानकारी प्रदान करता है।


16

आपने जो दिखाया है, वह ओवरफिटिंग का एक उत्कृष्ट उदाहरण है। त्रुटि में छोटी-सी गड़बड़ी आपके क्रॉस-वैरिफाइड डेटा सेट के सत्यापन हिस्से पर खराब प्रदर्शन से आती है। अधिक पुनरावृत्तियों को लगभग हमेशा प्रशिक्षण सेट पर त्रुटि में सुधार करना चाहिए, लेकिन सत्यापन / परीक्षण सेट के लिए विपरीत सच है।


तो ग्रेडिएंट बूस्टिंग ओवरफिट्स # बूस्टरिंग बूस्ट के आधार पर? दिलचस्प। मैंने सोचा कि सटीकता को इसके पुनरावृत्तियों के # हिट होने के बाद बदले में दिया गया होगा।
रॉबर्टएफ

4
यह सही है। क्रमिक बूस्टिंग में, प्रत्येक बाद के पेड़ को पिछले पेड़ों के अवशेषों से दूर बनाया गया है, इसलिए जीबीएम सत्यापन / परीक्षण सेटों को सामान्य करने में सक्षम होने की कीमत पर भी प्रशिक्षण डेटा सेट पर शेष त्रुटि को दूर करने का प्रयास करना जारी रखेगा। यही कारण है कि आप क्रॉस सत्यापन करते हैं - क्योंकि फिटिंग एल्गोरिथ्म मूल रूप से पता नहीं है कि कब रोकना है
रयान ज़ोटी

1
ग्रैडिएंट बूस्टिंग एडबाओस्ट से प्रेरित है। AdaBoost बहुत कम ही ओवरफिट करता है और जब ऐसा होता है, तो यह केवल थोड़ा और कई के बाद होता है, कई पुनरावृत्तियों। मुझे लगता है कि इस टिप्पणी की तुलना में @Underminer स्पष्टीकरण के प्रतिनिधि होने की अधिक संभावना है, विशेष रूप से इस टिप्पणी में कोई संदर्भ नहीं है।
रिकार्डो क्रूज़

2
@RicardoCruz मुझे लगता है कि यह दिलचस्प है कि आपने शायद ही कभी ढाल को बढ़ाने के लिए देखा है। चार या इतने वर्षों में जो मैं इसका उपयोग कर रहा हूं, मैंने इसके विपरीत देखा है - बहुत सारे पेड़ ओवरफिटिंग की ओर जाते हैं। मुझे एक बार एक सहयोगी के समान कुछ साबित करना था और मैं प्रशिक्षण सेट पर त्रुटि को लगभग शून्य तक कम करने में सक्षम था, लेकिन सत्यापन त्रुटि गैर ओवरफिट जीबीएम की तुलना में काफी अधिक हो गई। मुझे अब भी लगता है कि ग्रेडिएंट बूस्टिंग एक बेहतरीन एल्गोरिथम है। यह आमतौर पर पहला एल्गोरिथ्म है जो मैं उपयोग करता हूं - आपको बस बहुत सारे पेड़ों के बारे में सावधान रहना होगा, जिन्हें आप क्रॉस सत्यापन के माध्यम से ट्रैक कर सकते हैं
रयान ज़ोटी

2
@RyanZotti मैं सही तो खड़ा है। मैंने शेपायर एट अल से AdaBoost पर कागजात का एक गुच्छा पढ़ा है क्योंकि मैं इसके सुंदर मजबूत सैद्धांतिक आधार का आनंद लेता हूं। लेखकों का तर्क है कि बूस्ट ओवरफिटिंग का खतरा है, लेकिन यह बेहद मुश्किल है। मेरे पास इसका उपयोग करने का अधिक अनुभव नहीं है, और उनके पास इस पर बहस करने का कोई ठोस सैद्धांतिक आधार नहीं है, और निश्चित रूप से, लेखक लेखक होने के नाते, वे स्वाभाविक रूप से अपने आविष्कार से ईर्ष्या करते हैं, इसलिए यदि आपके पास इसके विपरीत अनुभव है , मुझे सही साबित होना है।
रिकार्डो क्रूज़

4

ग्रिड खोज के बिना, एक समान परिणाम को पुन: पेश करने के लिए कोड,

mod = gbm(admit ~ .,
      data = mydata[,-5],
      n.trees=100000,
      shrinkage=0.001,
      interaction.depth=2,
      n.minobsinnode=10,
      cv.folds=5,
      verbose=TRUE,
      n.cores=2)

best.iter <- gbm.perf(mod, method="OOB", plot.it=TRUE, oobag.curve=TRUE, overlay=TRUE)
print(best.iter)
[1] 1487
pred = as.integer(predict(mod, newdata=mydata[,-5], n.trees=best.iter) > 0)
y = mydata[,1]
sum(pred == y)/length(y)
[1] 0.7225

3

Gbm पैकेज में पुनरावृत्तियों के इष्टतम # (पेड़ों के #, या # आधार कार्यों के) का अनुमान लगाने के लिए एक फ़ंक्शन है।

gbm.perf(mod, method="OOB", plot.it=TRUE, oobag=TRUE, overlay=TRUE)

उसके लिए आपको कैरेट की ट्रेन की आवश्यकता नहीं है।


मैं नहीं जानता कि अगर मैं इस मुद्दे को हल कर रहा हूं - तो यह प्रतीत होता है कि पुनरावृत्तियों का इष्टतम # मेरे मामले में 5,000 है जहां सटीकता इसके उच्चतम पर है, 0.70 के करीब है (मेरे प्लॉट में पहला डेटा बिंदु)। लेकिन यह गलत लगता है। अधिक पुनरावृत्तियों को उच्च सटीकता की ओर ले जाना चाहिए, कम नहीं, सही?
रॉबर्टएफ

1
@RobertF सबसे पहले, मुझे लगता है कि आपको एक कारक में प्रवेश करने की आवश्यकता नहीं है। यह बस के रूप में अच्छी तरह से काम करता है: mod = gbm (स्वीकार करते हैं।, डेटा = mydata [, - 5], n। पेड़ = 100000, संकोचन = 0.001, इंटरैक्शन.डिप = 2, n.minobsinnode = 10, cv.folds = 5 , क्रिया = TRUE, n.cores = 2)। आप देख सकते हैं कि gbm किस स्थान पर इष्टतम पुनरावृति चुनता है: best.iter <- gbm.perf (mod, method = "OOB", plot.it = TRUE, oobag.curve = TRUE, ओवरले - TRUE)। यही है, जब भक्ति में परिवर्तन नकारात्मक हो जाता है (इस से उत्पन्न साजिश देखें)।
18

1
@RobertF एक और बात। Gbm कॉल में n.trees = (एक मिलियन) को निर्दिष्ट करके, आपने 1 से 1,000,000 तक सभी पुनरावृत्तियों को चलाया होगा। इसलिए आपको आपके लिए ऐसा करने की आवश्यकता नहीं है।
रात्रि

1
@RobertF अधिक अनुवर्ती। मैं सिर्फ 100k पेड़ / पुनरावृत्तियों भाग गया। Gbm.perf के साथ सबसे अच्छा पुनरावृत्ति चुनकर मुझे जो सटीकता मिली है, वह 0.7225 है, जो पुनरावृत्तियों की एक पूरी ग्रिड चलाने के लिए आपके बहुत करीब है।
राशियाँ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.