使用R Caret包训练函数和随机分类方法

时间:2015-04-08 09:56:28

标签: r r-caret

据我了解插入符号包中的 train 函数:

model <- train(Class ~ ., data=training, method = "nnet", trControl = train_control)

通过尝试一系列参数值并在训练数据的未见部分评估生成的模型来生成模型。然后将表现最佳的模型作为最终模型返回。

然而,许多分类方法使用随机训练方法;例如用反向传播训练的神经网络。

因此,在训练期间尝试一次参数可能无法很好地表示这些参数的执行情况。

是否可以告诉 train 函数多次尝试每组参数并使用它们的平均性能?如果没有,是否可以使用 train 函数实现此行为?

编辑:我没有使用“repeatedcv”,所以不能简单地设置重复次数。

这是我的train_contol:

train_control <- trainControl(method = "LGOCV", p = .75, number = 1)

2 个答案:

答案 0 :(得分:1)

以下是基于我之前评论的新答案。您可以在index中指定trainControl,这是一个包含每个LGOCV培训样本的索引的列表。默认情况下,未用于培训的索引用于测试。所以,你可以实现你想要的目标:

library(caret)

k <- 25L
indexList <- vector("list", k)
names(indexList) <- paste0("TrainIndexes", 1:k)

trainIdx <- createDataPartition(iris$Species, p = 0.75, list = FALSE)
for (i in 1:k) {
    indexList[[i]] <- as.integer(trainIdx)
}

mod <- train(Species ~ ., 
        data = iris, 
        method = "nnet", 
        trControl = trainControl(method = "LGOCV", index = indexList))
print(mod)

Neural Network 

150 samples
  4 predictors
  3 classes: 'setosa', 'versicolor', 'virginica' 

No pre-processing
Resampling: Repeated Train/Test Splits Estimated (25 reps, 0.75%) 

Summary of sample sizes: 114, 114, 114, 114, 114, 114, ... 

Resampling results across tuning parameters:

  size  decay  Accuracy   Kappa      Accuracy SD  Kappa SD  
  1     0e+00  0.7266667  0.5900000  0.175806490  0.26370973
  1     1e-04  0.8344444  0.7516667  0.177045657  0.26556849
  1     1e-01  0.9722222  0.9583333  0.000000000  0.00000000
  3     0e+00  0.8677778  0.8016667  0.064290205  0.09643531
  3     1e-04  0.8600000  0.7900000  0.044270493  0.06640574
  3     1e-01  0.9166667  0.8750000  0.000000000  0.00000000
  5     0e+00  0.8755556  0.8133333  0.024216105  0.03632416
  5     1e-04  0.8633333  0.7950000  0.007691318  0.01153698
  5     1e-01  0.9166667  0.8750000  0.000000000  0.00000000

也就是说,train将使用indexList中的索引用于每个交叉验证过程,并且由于每个元素都相同,因此将使用相同的数据进行训练。作为测试,您可以将method更改为"rpart"并查看SD值为0(因为它是确定性算法)希望这次是您想要的。

答案 1 :(得分:0)

您可以在number中指定trainControl,这意味着对于每组参数,执行"LGOCV"(离开分组交叉验证)number次。一个例子:

library(caret)

mod <- train(Species ~ ., 
        data = iris, 
        method = "nnet", 
        trControl = trainControl(method = "LGOCV", p = 0.75,
                number = 10))

print(mod)

Neural Network 

150 samples
  4 predictors
  3 classes: 'setosa', 'versicolor', 'virginica' 

No pre-processing
Resampling: Repeated Train/Test Splits Estimated (10 reps, 0.75%) 

Summary of sample sizes: 114, 114, 114, 114, 114, 114, ... 

Resampling results across tuning parameters:

  size  decay  Accuracy   Kappa      Accuracy SD  Kappa SD  
  1     0e+00  0.7888889  0.6833333  0.30037699   0.45056549
  1     1e-04  0.8027778  0.7041667  0.30944494   0.46416741
  1     1e-01  0.9555556  0.9333333  0.01434438   0.02151657
  3     0e+00  0.8388889  0.7583333  0.17411347   0.26117021
  3     1e-04  0.9500000  0.9250000  0.05037582   0.07556373
  3     1e-01  0.9722222  0.9583333  0.03207501   0.04811252
  5     0e+00  0.9166667  0.8750000  0.11785113   0.17677670
  5     1e-04  0.9583333  0.9375000  0.03000343   0.04500514
  5     1e-01  0.9722222  0.9583333  0.03207501   0.04811252

Accuracy was used to select the optimal model using  the largest value.
The final values used for the model were size = 3 and decay = 0.1.