R 中具有交叉验证和调整的径向 SVM 分类

Radial SVM Classifcation wtih Cross Validation and Tuning in R

我正在创建径向 SVM 分类 model,我想对其执行 5 折 CV 并对其进行调整。我看过别人是怎么做的here and followed these instructions。但是,我的代码不想实现我的调整网格。另外,我不明白为什么我在显式训练 model 时无法获得准确性或 F1 值。

有 5 倍 CV

library(caret)
set.seed(500)
ctrl <- trainControl(method = "repeatedcv",
                      number = 5,
                      repeats = 3, 
                      classProb=T,
                      summaryFunction = twoClassSummary
                     )
sigma<-c(2^-15,2^-13,2^-11,2^-9,2^-7,2^-5,2^-3,2^-1,2^1,2^2,2^3)
C<-c(2^-5,2^-3,2^-1,2^1,2^2,2^3,2^5,2^7,2^9,2^11,2^13)
tuninggrid<-data.frame(expand.grid(sigma,C))

mod <- train(x = iris[-5], y=iris$Species,
             method = "svmRadial", 
             trControl = ctrl,
             metric=c('ROC'),
             tunegrid=tuninggrid

结果只是 sigma 保持不变。为什么它不使用我的调整网格?

其次,当我将指标从 'ROC' 调整为 'Accuracy' 时,它说准确性不可用。我的理解是因为我在 trainControl. 中的 summaryFunction 如果我删除它,那么我可以获得准确性,但不是 ROC。最终,我想要两者和一个 F1 值,但我找不到这方面的文档。我怎么写东西同时给我两个?

最后,train() 的输出。要获得权重,它只是使用 mod$finalModel@coef 对吗?

您的代码中存在一些小错误:

  1. 如果你想使用ROC下的面积作为度量,你需要像你一样指定twoClassSummary,但你的响应变量也应该是二进制的。例如:
    train(..., y = factor(ifelse(iris$Species=="setosa", "setosa", "other")), ...)
    
  2. 如果要使用准确性作为度量标准,请使用 defaultSummary 而不是 twoClassSummary

  3. 如果你View(tuninggrid)你会看到它的列名是 Var1 和 Var2,而它们应该是 C 和 sigma。你可以修复它的定义:

    tuninggrid <- expand.grid(sigma=sigma,C=C)
    
  4. 调用 train(...) 时有错别字:正确的参数名称是 tuneGrid(R 区分大小写)

解决这些问题将解决您的问题:View(mod$results)

编辑:如果你想优化精度(在 defaultSummary 中计算)但也显示 AUROC(来自 twoClassSummary)and/or F 测量(来自 prSummary ), 你可以定义你自己的度量函数,它结合了所有并在 trainControl 中使用它:

combinedSummary <- function(data, lev = NULL, model = NULL) {
  c(
    defaultSummary(data, lev, model),
    twoClassSummary(data, lev, model), 
    prSummary(data, lev, model)
    )
}