Разница между прогнозом (модель) и прогнозом (модель $ finalModel) с использованием символа вставки для классификации в R

Какая разница между

predict(rf, newdata=testSet)

а также

predict(rf$finalModel, newdata=testSet) 

я тренирую модель с preProcess=c("center", "scale")

tc <- trainControl("repeatedcv", number=10, repeats=10, classProbs=TRUE, savePred=T)
rf <- train(y~., data=trainingSet, method="rf", trControl=tc, preProc=c("center", "scale"))

и я получаю 0 истинных положительных результатов, когда запускаю его на центрированном и масштабируемом testSet

testSetCS <- testSet
xTrans <- preProcess(testSetCS)
testSetCS<- predict(xTrans, testSet)
testSet$Prediction <- predict(rf, newdata=testSet)
testSetCS$Prediction <- predict(rf, newdata=testSetCS)

но получаю несколько истинных положительных результатов, когда запускаю его на немасштабированном testSet. Мне нужно использовать rf $ finalModel для получения некоторых истинных положительных результатов на центрированном и масштабированном testSet и rf-объекте на немасштабированном ... что мне не хватает?


редактировать

тесты:

tc <- trainControl("repeatedcv", number=10, repeats=10, classProbs=TRUE, savePred=T)
RF <-  train(Y~., data= trainingSet, method="rf", trControl=tc) #normal trainingData
RF.CS <- train(Y~., data= trainingSet, method="rf", trControl=tc, preProc=c("center", "scale")) #scaled and centered trainingData

на нормальном тесте

RF predicts reasonable              (Sensitivity= 0.33, Specificity=0.97)
RF$finalModel predicts bad       (Sensitivity= 0.74, Specificity=0.36)
RF.CS predicts reasonable           (Sensitivity= 0.31, Specificity=0.97)
RF.CS$finalModel same results like RF.CS    (Sensitivity= 0.31, Specificity=0.97)

на центрированном и масштабированном testSetCS:

RF predicts very bad                (Sensitivity= 0.00, Specificity=1.00)
RF$finalModel predicts reasonable       (Sensitivity= 0.33, Specificity=0.98)
RF.CS predicts like RF              (Sensitivity= 0.00, Specificity=1.00)
RF.CS$finalModel predicts like RF       (Sensitivity= 0.00, Specificity=1.00)

поэтому кажется, что $ finalModel нуждается в одном и том же формате trainingSet и testSet, тогда как обученный объект принимает только нецентрированные и немасштабированные данные, независимо от выбранного параметра preProcess?

код предсказания (где testSet - это нормальные данные, а testSetCS центрируется и масштабируется):

testSet$Prediction <- predict(RF, newdata=testSet)
testSet$PredictionFM <- predict(RF$finalModel, newdata=testSet)
testSet$PredictionCS <- predict(RF.CS, newdata=testSet)
testSet$PredictionCSFM <- predict(RF.CS$finalModel, newdata=testSet)

testSetCS$Prediction <- predict(RF, newdata=testSetCS)
testSetCS$PredictionFM <- predict(RF$finalModel, newdata=testSetCS)
testSetCS$PredictionCS <- predict(RF.CS, newdata=testSetCS)
testSetCS$PredictionCSFM <- predict(RF.CS$finalModel, newdata=testSetCS)

person Frank    schedule 13.01.2014    source источник
comment
не могли бы вы опубликовать код прогноза для ваших последних железнодорожных объектов, например RF, RF.CS?   -  person doctorate    schedule 14.01.2014


Ответы (1)


Откровенный,

Это действительно похоже на ваш другой вопрос на Перекрестная проверка.

Тебе действительно нужно

1) покажите свой точный код прогноза для каждого результата

2) дайте нам воспроизводимый пример.

С обычными testSet, RF.CS и RF.CS$finalModel не должны давать одинаковые результаты, и мы должны иметь возможность воспроизвести это. Кроме того, в вашем коде есть синтаксические ошибки, поэтому он не может быть именно тем, что вы выполнили.

Наконец, я не совсем уверен, зачем вам вообще нужен объект finalModel. Смысл train состоит в том, чтобы обрабатывать детали и делать что-то таким образом (что является вашим вариантом), обходя полный набор кода, который обычно применяется.

Вот воспроизводимый пример:

 library(mlbench)
 data(Sonar)

 set.seed(1)
 inTrain <- createDataPartition(Sonar$Class)
 training <- Sonar[inTrain[[1]], ]
 testing <- Sonar[-inTrain[[1]], ]

 pp <- preProcess(training[,-ncol(Sonar)])
 training2 <- predict(pp, training[,-ncol(Sonar)])
 training2$Class <- training$Class
 testing2 <- predict(pp, testing[,-ncol(Sonar)])
 testing2$Class <- testing2$Class

 tc <- trainControl("repeatedcv", 
                    number=10, 
                    repeats=10, 
                    classProbs=TRUE, 
                    savePred=T)
 set.seed(2)
 RF <-  train(Class~., data= training, 
              method="rf", 
              trControl=tc)
 #normal trainingData
 set.seed(2)
 RF.CS <- train(Class~., data= training, 
                method="rf", 
                trControl=tc, 
                preProc=c("center", "scale")) 
 #scaled and centered trainingData

Вот некоторые результаты:

 > ## These should not be the same
 > all.equal(predict(RF, testing,  type = "prob")[,1],
 +           predict(RF, testing2, type = "prob")[,1])
 [1] "Mean relative difference: 0.4067554"
 > 
 > ## Nor should these
 > all.equal(predict(RF.CS, testing,  type = "prob")[,1],
 +           predict(RF.CS, testing2, type = "prob")[,1])
 [1] "Mean relative difference: 0.3924037"
 > 
 > all.equal(predict(RF.CS,            testing, type = "prob")[,1],
 +           predict(RF.CS$finalModel, testing, type = "prob")[,1])
 [1] "names for current but not for target"
 [2] "Mean relative difference: 0.7452435" 
 >
 > ## These should be and are close (just based on the 
 > ## random sampling used in the final RF fits)
 > all.equal(predict(RF,    testing, type = "prob")[,1],
 +           predict(RF.CS, testing, type = "prob")[,1])
 [1] "Mean relative difference: 0.04198887"

Максимум

person topepo    schedule 14.01.2014
comment
Я использовал объект $ finalModel, потому что думал, что он содержит окончательное (лучшее) дерево и, следовательно, может вычислять прогнозы и вероятности для новых наборов данных. - person Frank; 15.01.2014
comment
Он работает, и это то, что predict.train использует. Однако он может кое-что сделать с промежуточными данными. - person topepo; 15.01.2014
comment
Возможно, вы могли бы прояснить различия между testing и testing2 из-за preProcess, а также из-за того, что вызов predict.train действительно использует preProcess внутри, а predict(xx$finalModel) - нет. В противном случае в сообщении читается немного о чём-то вуду, так как роль preProcess никогда не проясняется. (Хотя очевидно +1.) - person usεr11852; 29.12.2016
comment
Разве последний пример не должен сравнивать RF + testing2 с RF.CS + testing? - person jiggunjer; 02.05.2020