Caret ve basic randomForest paketi aracılığıyla randomForest'ten farklı sonuçlar


14

Biraz kafam karıştı: Eğitimli bir modelin şapka ile sonuçları orijinal paketteki modelden nasıl farklı olabilir? Caret paketi ile RandomForest FinalModel kullanarak tahmin öncesi önişlemenin gerekli olup olmadığını okudum ? ama burada herhangi bir ön işleme kullanmıyorum.

Caret paketini kullanarak ve farklı mtry değerleri için ayarlayarak farklı Rastgele Ormanlar yetiştirdim.

> 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

Ben mtry = 15 training_data en iyi parametre olarak bulundu:

> 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. 

Modeli bir ROC Eğrisi ve bir karışıklık matrisi ile değerlendirdim:

##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")

Ortaya çıkan Karışıklık Matrisi ve Doğruluğu:

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

           Accuracy : 0.8984
 ....

Şimdi temel randomForest paketini kullanarak aynı parametreler ve aynı training_data ile Rastgele Rorest eğitimi aldım:

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

Yine yukarıdaki ile aynı test_ verileri için tahminler oluşturdum ve karışıklık matrisini yukarıdaki ile aynı kodla değerlendirdim. Ama şimdi farklı önlemler aldım:

Confusion Matrix and Statistics

      Reference
Prediction   No  Yes
       No  2702  897
       Yes  430 6480

           Accuracy : 0.8737 
           ....

Sebebi nedir? Neyi kaçırıyorum?


3
Her iki model için de rastgele tohum için aynı değeri kullandınız mı?
mmmmmmmmmm

Bence de. Verileri eğitim ve test verilerine ayırırken kodu kodun başlarında ayarladım, daha sonra şapka modelini, sonra "orijinal" rf modelini eğittim. Yani tohum başlangıçta bir kez aynı kalmalı, değil mi?
Malte

Ben "orijinal" rf modeli eğitim önce doğrudan başka bir set.seed eklemek için çalıştı. Maalesef sorunu çözmüyor.
Malte

3
Kullanarak bu test etmelisiniz seedssavınıtrainControl
topepo

Yanıtlar:


4

İlk başta biraz önemsiz ve "programatik" iken soruyu modern İstatistiklerde çok önemli olan iki ana konuya değiniyorum:

  1. sonuçların tekrarlanabilirliği ve
  2. deterministik olmayan algoritmalar.

Farklı sonuçların nedeni, iki prosedürün farklı rastgele tohumlar kullanılarak eğitilmesidir. Rastgele ormanlar, tam veri kümesinin değişkenlerinden rastgele bir altkümeyi, her bir bölmedeki adaylar olarak kullanır (bu mtryargüman ve rastgele altuzay yöntemi ile ilgilidir ) ve modelin varyansını azaltmak için orijinal veri kümesini torbalar (bootstrap toplar) kullanır. Düşünülen bu iki iç rastgele örnekleme prosedürü, algoritmanın farklı çalışmaları arasında belirleyici değildir. Örneklemenin yapıldığı rastgele sıra, kullanılan rastgele tohumlar tarafından kontrol edilir. Aynı tohumlar kullanılsaydı, randomForestrutin denilen her iki durumda da aynı sonuçlar elde edilir ; ikisi de dahili olarakcaret::trainmanuel olarak rastgele bir orman takarken harici olarak. Bunu göstermek için basit bir kod snippet'i ekliyorum. Lütfen ntreeeğitimi hızlı tutmak için çok az sayıda ağaç (argüman :) kullandığımı, genellikle çok daha büyük olması gerektiğini unutmayın.

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) 

Bu noktada, hem caret.trainnesne fitRFcarethem de manuel olarak tanımlanmış randomForestnesne fitRFmanual, aynı veriler kullanılarak, ancak son modellerini takarken önemli ölçüde aynı rastgele tohumları kullanarak eğitilmiştir. Bu nedenle, bu nesneleri kullanmayı tahmin etmeye çalışacağız ve verilerimizde ön işlem yapmadığımız için aynı cevapları alacağız.

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

Sadece bunu daha sonra açıklığa kavuşturmak için: predict(xx$finalModel, testData)ve seçeneği kullanırken bir seçenek predict(xx, testData)belirlerse farklı olacaktır . Öte yandan, doğrudan kullanırken, yerine modelin ( burada) yerine ; önişleme gerçekleşmez. Açıkçası, hiçbir ön işlem yapılmadığı orijinal soruda belirtilen senaryoda , manuel olarak takılan nesne veya nesne kullanılırken sonuçlar aynı olacaktır .preProcesstrainfinalModelpredictpredict.randomForestpredict.trainfinalModelrandomForestcaret.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

Her zaman R, MATLAB veya kullanılan başka bir program tarafından kullanılan rastgele tohumu ayarlamanızı şiddetle tavsiye ederim . Aksi takdirde, sonuçların tekrarlanabilirliğini kontrol edemezsiniz (ki bu tamam, dünyanın sonu olmayabilir) veya bir modelleme prosedürünün performansını etkileyen bir hatayı veya dış faktörü hariç tutamazsınız (evet, bu biraz berbat). Önde gelen ML algoritmalarının birçoğu (örneğin, gradyan artırma, rastgele ormanlar, aşırı sinir ağları), eğitim aşamalarında belirli dahili yeniden örnekleme prosedürlerini uygular ve eğitim aşamalarından önce (hatta bazen içinde) rastgele tohum durumlarını ayarlamak önemli olabilir.


Önemli olan, "tohumlar" argümanını kullanarak "trainControl" de tohum argümanını açıkça ayarlamaktı
Malte

Evet tabi ki. Bunun neden gerekli olduğu konusunun tamamen açıklığa kavuşturulduğundan emin olmak istedim.
usεr11852

trainTam olarak eşdeğer olması için nasıl koşarım randomForest? Denedim method="none"ama tohumun tek bir değere nasıl ayarlanacağından emin değilim. Teşekkürler.
Simon Woodward

Özür ancak herhangi varsa belli değildir preProcessya da ne kadar randomForesteğitimli bunlardan ilki. Genel olarak, varsayarak biz tohum hem sağlamak için gereken hiçbir ön işleme adımlar var ve (burada sadece hyperparameters mtry) kullanılan aynıdır.
usεr11852

0

İle ilgili curClassifiertahminler, curClassifier$finalModel bağlantıdan tahminlerle aynı değildir . Bunu çoğalttınız finalModelve predict.trainnesneyle karşılaştırdınız .


1
Söylediğiniz doğru olsa da, OP tarafından ön işlem yapılmadığı için mevcut ayarda maalesef biraz yanıltıcı. predictOP'nin araştırması durumunda her ikisi de aynı tahminleri yapmalıdır (ve aslında yapmalıdır). Bu noktayı yazımda biraz daha açıklığa kavuşturuyorum.
usεr11852
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.