【问题标题】:Radial SVM Classifcation wtih Cross Validation and Tuning in RR中具有交叉验证和调整的径向SVM分类
【发布时间】:2019-09-28 12:50:29
【问题描述】:

我正在创建径向 SVM 分类模型,我将对其执行 5 倍 CV 并对其进行调整。我已经看到其他人是如何做到的herefollowed these instructions。但是,我的代码不想实现我的调整网格。另外,我不明白为什么在显式训练模型时无法获得准确率或 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 对吗?

【问题讨论】:

  • 乍一看你有没有看过str(mod)和summary(mod)?
  • 另外,我记得这是如何工作的,您要求将 CV 完成 5 次,而不是您创建了 5-fold CV。
  • 哦。那么你会如何解决这个问题呢?
  • 如果您没有得到答案,我稍后会尝试提供更多详细信息。但是,如果您搜索相关术语,您会发现在线存在大量插入符号文档。老实说,为了你自己的熏陶,最好的程序。
  • 我建议您阅读this,您的所有问题都应该得到解答。如果仍有疑问,请发布问题更新。

标签: r svm cross-validation r-caret


【解决方案1】:

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

  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)
    )
}

【讨论】:

  • 您如何同时获得准确度、ROC 和 F1?还是只能做其中之一?
  • 您优化的目标函数应该是一维的。否则,您将如何决定 (Acc=0.81, AUC=0.95, F1=0.87) 和 (Acc=0.95, AUC=0.87, F1=0.81) 之间的最佳选择?所以最好是选择其中一个,如果真的有必要,你仍然可以建立自己的性能指标。
  • 好的。这就说得通了。因此,如果我想最大限度地提高准确性,我不会定义 twoClassSummary 部分。但是我假设必须有办法获得 AUC 和 F1?
  • 现在我更好地理解了您的评论...我已经编辑了答案
  • 跟进,我在 train 中选择的指标是“AUC”,而不是“ROC”,在View(mod$results) 内,我假设我使用的是 AUC 值,而不是它产生的 ROC 值?
猜你喜欢
  • 2012-09-30
  • 2014-04-02
  • 2014-10-02
  • 2020-12-31
  • 2016-09-30
  • 2016-06-23
  • 1970-01-01
  • 2016-03-10
  • 2016-07-01
相关资源
最近更新 更多