Como especificar um valor de validação definido para caret

Eu realmente gosto de usar o cursor para pelo menos os estágios iniciais da modelagem, especialmente porque é muito fácil usar métodos de reamostragem. No entanto, estou trabalhando em um modelo em que o conjunto de treinamento tem um número razoável de casos adicionados por meio de auto-treinamento semi-supervisionado e meus resultados de validação cruzada são realmente distorcidos por causa disso. Minha solução para isso é usar um conjunto de validação para medir o desempenho do modelo, mas não consigo ver como usar um conjunto de validação diretamente dentro do caret - estou faltando alguma coisa ou isso simplesmente não é suportado? Eu sei que posso escrever meus próprios invólucros para fazer o que o cursor normalmente faria por mim, mas seria muito bom se houvesse uma solução sem ter que fazer isso.

Aqui está um exemplo trivial do que estou experimentando:

> library(caret)
> set.seed(1)
> 
> #training/validation sets
> i <- sample(150,50)
> train <- iris[-i,]
> valid <- iris[i,]
> 
> #make my model
> tc <- trainControl(method="cv")
> model.rf <- train(Species ~ ., data=train,method="rf",trControl=tc)
> 
> #model parameters are selected using CV results...
> model.rf
100 samples
  4 predictors
  3 classes: 'setosa', 'versicolor', 'virginica' 

No pre-processing
Resampling: Cross-Validation (10 fold) 

Summary of sample sizes: 90, 90, 90, 89, 90, 92, ... 

Resampling results across tuning parameters:

  mtry  Accuracy  Kappa  Accuracy SD  Kappa SD
  2     0.971     0.956  0.0469       0.0717  
  3     0.971     0.956  0.0469       0.0717  
  4     0.971     0.956  0.0469       0.0717  

Accuracy was used to select the optimal model using  the largest value.
The final value used for the model was mtry = 2. 
> 
> #have to manually check validation set
> valid.pred <- predict(model.rf,valid)
> table(valid.pred,valid$Species)

valid.pred   setosa versicolor virginica
  setosa         17          0         0
  versicolor      0         20         1
  virginica       0          2        10
> mean(valid.pred==valid$Species)
[1] 0.94

Eu originalmente pensei que eu poderia fazer isso criando um costumesummaryFunction() paratrainControl() objeto, mas não consigo ver como fazer referência ao meu objeto de modelo para obter previsões do conjunto de validação (a documentação -http://caret.r-forge.r-project.org/training.html - lista apenas "data", "lev" e "model" como possíveis parâmetros). Por exemplo, isso claramente não funcionará:

tc$summaryFunction <- function(data, lev = NULL, model = NULL){
  data.frame(Accuracy=mean(predict(<model object>,valid)==valid$Species))
}

EDIT: Em uma tentativa de chegar a uma correção realmente feia, eu tenho procurado ver se eu posso acessar o objeto de modelo do escopo de outra função, mas eu não estou nem vendo-os modelo armazenado em qualquer lugar. Espero que haja alguma solução elegante que eu nem sequer chegue perto de ver ...

> tc$summaryFunction <- function(data, lev = NULL, model = NULL){
+   browser()
+   data.frame(Accuracy=mean(predict(model,valid)==valid$Species))
+ }
> train(Species ~ ., data=train,method="rf",trControl=tc)
note: only 1 unique complexity parameters in default grid. Truncating the grid to 1 .

Called from: trControl$summaryFunction(testOutput, classLevels, method)
Browse[1]> lapply(sys.frames(),function(x) ls(envi=x))
[[1]]
[1] "x"

[[2]]
 [1] "cons"      "contrasts" "data"      "form"      "m"         "na.action" "subset"   
 [8] "Terms"     "w"         "weights"   "x"         "xint"      "y"        

[[3]]
[1] "x"

[[4]]
 [1] "classLevels" "funcCall"    "maximize"    "method"      "metric"      "modelInfo"  
 [7] "modelType"   "paramCols"   "ppMethods"   "preProcess"  "startTime"   "testOutput" 
[13] "trainData"   "trainInfo"   "trControl"   "tuneGrid"    "tuneLength"  "weights"    
[19] "x"           "y"          

[[5]]
[1] "data"  "lev"   "model"

questionAnswers(2)

yourAnswerToTheQuestion