बेतरतीब से विभिन्न परिणाम कैरेट और बेसिक randomForest पैकेज के माध्यम से


14

मैं थोड़ा उलझन में हूं: कैरेट के माध्यम से प्रशिक्षित मॉडल के परिणाम मूल पैकेज में मॉडल से कैसे भिन्न हो सकते हैं? मैंने पढ़ा कि क्या कैरेट पैकेज के साथ रैंडमफॉरस्ट के फाइनलमॉडल का उपयोग करने से पहले प्रीप्रोसेसिंग की आवश्यकता है? लेकिन मैं यहां किसी भी प्रीप्रोसेसिंग का उपयोग नहीं करता हूं।

मैंने अलग-अलग रैंडम फ़ॉरेस्ट को प्रशिक्षित किया, कैरेट पैकेज का उपयोग करके और अलग-अलग mtry मूल्यों के लिए ट्यूनिंग।

> cvCtrl = trainControl(method = "repeatedcv",number = 10, repeats = 3, classProbs = TRUE, summaryFunction = twoClassSummary)
> newGrid = expand.grid(mtry = c(2,4,8,15))
> classifierRandomForest = train(case_success ~ ., data = train_data, trControl = cvCtrl, method = "rf", metric="ROC", tuneGrid = newGrid)
> curClassifier = classifierRandomForest

मुझे प्रशिक्षण_दाता पर सबसे अच्छा पैरामीटर होने के लिए mtry = 15 मिला:

> curClassifier
 ...
Resampling results across tuning parameters:

mtry  ROC    Sens   Spec   ROC SD   Sens SD  Spec SD
 4    0.950  0.768  0.957  0.00413  0.0170   0.00285
 5    0.951  0.778  0.957  0.00364  0.0148   0.00306
 8    0.953  0.792  0.956  0.00395  0.0152   0.00389
10    0.954  0.797  0.955  0.00384  0.0146   0.00369
15    0.956  0.803  0.951  0.00369  0.0155   0.00472

ROC was used to select the optimal model using  the largest value.
The final value used for the model was mtry = 15. 

मैंने मॉडल का मूल्यांकन एक ROC वक्र और एक भ्रम मैट्रिक्स के साथ किया:

##ROC-Curve
predRoc = predict(curClassifier, test_data, type = "prob")
myroc = pROC::roc(test_data$case_success, as.vector(predRoc[,2]))
plot(myroc, print.thres = "best")

##adjust optimal cut-off threshold for class probabilities
threshold = coords(myroc,x="best",best.method = "closest.topleft")[[1]] #get optimal cutoff threshold
predCut = factor( ifelse(predRoc[, "Yes"] > threshold, "Yes", "No") )


##Confusion Matrix (Accuracy, Spec, Sens etc.)
curConfusionMatrix = confusionMatrix(predCut, test_data$case_success, positive = "Yes")

परिणामी भ्रम मैट्रिक्स और सटीकता:

Confusion Matrix and Statistics
      Reference
Prediction   No  Yes
   No  2757  693
   Yes  375 6684

           Accuracy : 0.8984
 ....

अब मैंने एक ही पैरामीटर और उसी ट्रेनिंग_डाटा के साथ बेसिक रैंडम पैकेज का उपयोग करके एक रैंडम रोरेस्ट का प्रशिक्षण दिया:

randomForestManual <- randomForest(case_success ~ ., data=train_data, mtry = 15, ntree=500,keep.forest=TRUE)
curClassifier = randomForestManual

फिर से मैंने ऊपर के समान ही test_data के लिए भविष्यवाणियाँ बनाईं और ऊपर के समान कोड वाले भ्रम मैट्रिक्स का आकलन किया। लेकिन अब मुझे अलग उपाय मिले:

Confusion Matrix and Statistics

      Reference
Prediction   No  Yes
       No  2702  897
       Yes  430 6480

           Accuracy : 0.8737 
           ....

क्या कारण है? मुझे किसकी याद आ रही है?


3
क्या आपने दोनों मॉडलों के लिए यादृच्छिक बीज के लिए समान मूल्य का उपयोग किया था?
mmmmmmmmmm

मुझे ऐसा लगता है। मैंने बीज को पहले कोड में सेट किया जब डेटा सेट को प्रशिक्षण और परीक्षण डेटा के लिए विभाजित किया, फिर कैरेट मॉडल को प्रशिक्षित किया, फिर "मूल" आरएफ-मॉडल को प्रशिक्षित किया। तो बीज को शुरुआत में एक बार सेट होना चाहिए, क्या ऐसा नहीं होना चाहिए?
माल्टे

मैंने "मूल" आरएफ-मॉडल को प्रशिक्षित करने से पहले सीधे एक और सेट डालने का प्रयास किया। दुर्भाग्य से, समस्या का समाधान नहीं है।
Malte

3
आपको इसका परीक्षण seedstrainControl
20-20

जवाबों:


4

मुझे लगता है कि पहले पढ़ा हुआ प्रश्न कुछ तुच्छ और "प्रोग्रामेटिक" दो मुख्य मुद्दों पर स्पर्श करता है जो आधुनिक सांख्यिकी में बहुत महत्वपूर्ण हैं:

  1. परिणामों की प्रतिलिपि प्रस्तुत करने योग्यता और
  2. गैर-नियतात्मक एल्गोरिदम।

अलग-अलग परिणामों का कारण यह है कि दो प्रक्रियाओं को अलग-अलग यादृच्छिक बीजों का उपयोग करके प्रशिक्षित किया जाता है। रैंडम जंगलों प्रत्येक विभाजन में उम्मीदवार के रूप में पूर्ण डाटासेट के चर से एक यादृच्छिक सबसेट (है कि का उपयोग करता है mtryतर्क और से संबंधित है यादृच्छिक उपस्पेस विधि ) और साथ ही के रूप में बैग (बूटस्ट्रैप समुच्चय) मॉडल के विचरण कम करने के लिए मूल डाटासेट। इन दो आंतरिक यादृच्छिक नमूनाकरण प्रक्रियाएं एल्गोरिदम के विभिन्न रनों के बीच नियतात्मक नहीं हैं। रैंडम ऑर्डर जो नमूना किया जाता है उसका उपयोग यादृच्छिक बीजों द्वारा नियंत्रित किया जाता है। यदि एक ही बीज का उपयोग किया गया था, तो दोनों मामलों में सटीक परिणाम प्राप्त होगा जहां randomForestदिनचर्या कहा जाता है; दोनों में आंतरिक रूप सेcaret::trainमैन्युअल रूप से एक यादृच्छिक वन फिटिंग करते समय बाहरी रूप से भी। मैं इसे दिखाने-दिखाने के लिए एक साधारण कोड स्निपेट संलग्न करता हूं। कृपया ध्यान दें कि मैं बहुत कम संख्या में पेड़ों का उपयोग करता हूं (तर्क ntree:) प्रशिक्षण को तेज रखने के लिए, यह आम तौर पर बहुत बड़ा होना चाहिए।

library(caret)

set.seed(321)
trainData <- twoClassSim(5000, linearVars = 3, noiseVars = 9)
testData  <- twoClassSim(5000, linearVars = 3, noiseVars = 9)

set.seed(432)
mySeeds <- sapply(simplify = FALSE, 1:26, function(u) sample(10^4, 3))
cvCtrl = trainControl(method = "repeatedcv", number = 5, repeats = 5, 
                      classProbs = TRUE, summaryFunction = twoClassSummary, 
                      seeds = mySeeds)

fitRFcaret = train(Class ~ ., data = trainData, trControl = cvCtrl, 
                   ntree = 33, method = "rf", metric="ROC")

set.seed( unlist(tail(mySeeds,1))[1])
fitRFmanual <- randomForest(Class ~ ., data=trainData, 
                            mtry = fitRFcaret$bestTune$mtry, ntree=33) 

इस बिंदु पर दोनों caret.trainऑब्जेक्ट के fitRFcaretसाथ-साथ मैन्युअल रूप से परिभाषित randomForestऑब्जेक्ट fitRFmanualको एक ही डेटा का उपयोग करके प्रशिक्षित किया गया है, लेकिन महत्वपूर्ण रूप से एक ही यादृच्छिक बीज का उपयोग करते समय अपने अंतिम मॉडल को फिटिंग करते हैं। जैसे कि जब हम इन वस्तुओं का उपयोग करने की भविष्यवाणी करने की कोशिश करेंगे और क्योंकि हम अपने डेटा का कोई पूर्वप्रकरण नहीं करते हैं तो हमें वही सटीक उत्तर मिलेंगे।

all.equal(current =  as.vector(predict(fitRFcaret, testData)), 
          target = as.vector(predict(fitRFmanual, testData)))
# TRUE

बस इसे स्पष्ट करने के लिए बाद में थोड़ा और इंगित करें: predict(xx$finalModel, testData)और predict(xx, testData)यदि preProcessउपयोग करते समय कोई विकल्प सेट करता है तो यह अलग होगा train। दूसरी ओर, finalModelसीधे उपयोग करते समय यह इसके बजाय predictफिट किए गए मॉडल ( predict.randomForestयहां) से फ़ंक्शन का उपयोग करने के बराबर है predict.train; कोई पूर्व-प्रक्रिया नहीं होती है। स्पष्ट रूप से मूल प्रश्न में उल्लिखित परिदृश्य में जहां कोई पूर्व प्रसंस्करण नहीं किया जाता है, परिणाम finalModelमैन्युअल रूप से फिट की गई randomForestवस्तु या वस्तु का उपयोग करते समय समान होंगे caret.train

all.equal(current =  as.vector(predict(fitRFcaret$finalModel, testData)), 
          target = as.vector(predict(fitRFmanual, testData)))
 # TRUE

all.equal(current =  as.vector(predict(fitRFcaret$finalModel, testData)),
          target = as.vector(predict(fitRFcaret, testData)))
# TRUE

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


महत्वपूर्ण हिस्सा बीज तर्क स्पष्ट रूप से "trainControl" में तर्क "बीज" का उपयोग कर स्थापित करने के लिए था
Malte

हां बिल्कुल। मैं यह सुनिश्चित करना चाहता था कि इस मुद्दे को इस तरह की आवश्यकता क्यों है, पूरी तरह से स्पष्ट किया गया था।
us --r11852

मैं कैसे भागूं trainताकि यह बिल्कुल बराबर हो randomForest? मैंने कोशिश की, method="none"लेकिन यह सुनिश्चित नहीं किया कि बीज को एकल मूल्य पर कैसे सेट किया जाए। धन्यवाद।
साइमन वुडवर्ड

माफी लेकिन यह स्पष्ट नहीं है कि आपके पास कोई है preProcessया कैसे randomForestशुरू करने के लिए प्रशिक्षित है। सामान्य तौर पर, यह मानते हुए कि हमारे पास कोई पूर्व-प्रसंस्करण कदम नहीं है, हमें यह सुनिश्चित करने की आवश्यकता है कि बीज और हाइपरपरमेटर्स (यहां बस mtry) दोनों का उपयोग समान है।
us --r11852 का कहना है कि

0

से curClassifierभविष्यवाणियां curClassifier$finalModel लिंक से भविष्यवाणियों के समान नहीं हैं । आपने पुन: पेश किया है finalModelऔर इसकी तुलना predict.trainवस्तु से कर रहे हैं ।


1
जबकि आप जो कहते हैं वह सच है, यह दुर्भाग्य से वर्तमान सेटिंग में थोड़ा सा भ्रामक है क्योंकि ओपी द्वारा कोई पूर्व-प्रसंस्करण नहीं किया जाता है। predictओपी की खोज के मामले में दोनों को (और वास्तव में) एक ही पूर्वानुमान देना चाहिए। मैं अपनी पोस्ट में इस बिंदु को थोड़ा और स्पष्ट करता हूं।
us --r11852
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.