通过R中的交叉验证和调整进行径向SVM分类

时间:2019-05-10 15:19:41

标签: r svm cross-validation r-caret

我正在创建Radial SVM分类模型,我将对其执行5倍CV并对其进行调整。我已经看到其他人如何herefollowed these instructions这样做。但是,我的代码不想实现我的调整网格。另外,我不明白为什么在明确训练模型时为何无法获得Accuracy或F1值。

5倍简历

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导致的,如果删除它,则可以得到Accuracy,但不能得到ROC。最终,我希望同时获得一个F1值,但是我找不到与此相关的文档。我该如何写一些东西同时给我两个人?

最后,来自train()的输出。为了获得权重,它只是使用mod $ finalModel @ coef正确吗?

1 个答案:

答案 0 :(得分:2)

您的代码中有一些小错误:

  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)和/或F度量值(来自prSummary),则可以定义自己的度量标准函数,将其全部结合起来并在trainControl中使用:

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