Cómo especificar una retención de validación configurada para caret

Realmente me gusta usar caret para al menos las primeras etapas del modelado, especialmente porque es realmente fácil de usar métodos de remuestreo. Sin embargo, estoy trabajando en un modelo en el que el conjunto de entrenamiento tiene un buen número de casos agregados a través de autoformación semi-supervisada y mis resultados de validación cruzada están realmente sesgados por eso. Mi solución a esto es usar un conjunto de validación para medir el rendimiento del modelo, pero no puedo ver una forma de usar un conjunto de validación directamente dentro de caret. ¿Me falta algo o esto simplemente no es compatible? Sé que puedo escribir mis propios envoltorios para hacer lo que normalmente haría caret para m, pero sería muy bueno si hubiera una solución alternativa sin tener que hacerlo.

Aquí hay un ejemplo trivial de lo que estoy 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

Originalmente pensé que podía hacer esto creando una costumbre.summaryFunction() paratrainControl() objeto pero no puedo ver cómo hacer referencia a mi objeto modelo para obtener predicciones del conjunto de validación (la documentación -http://caret.r-forge.r-project.org/training.html - enumera solo "datos", "lev" y "modelo" como posibles parámetros). Por ejemplo, esto claramente no funcionará:

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

EDITAR: En un intento de encontrar una solución realmente fea, he estado viendo si puedo acceder al objeto modelo desde el alcance de otra función, pero ni siquiera estoy viendo el modelo almacenado en ninguna parte. Esperemos que haya alguna solución elegante que ni siquiera me esté acercando a 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"

Respuestas a la pregunta(2)

Su respuesta a la pregunta