我正在创建Radial SVM分类模型,我将对其执行5倍CV并对其进行调整。我已经看到其他人如何here和followed 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正确吗?
答案 0 :(得分:2)
您的代码中有一些小错误:
twoClassSummary
,但是响应变量也应该是二进制的。例如:
train(..., y = factor(ifelse(iris$Species=="setosa", "setosa", "other")), ...)
如果要使用准确性作为度量标准,请使用defaultSummary
代替twoClassSummary
如果您View(tuninggrid)
,您将看到其列名称为Var1和Var2,而它们的列名称应为C和sigma。您可以修改其定义:
tuninggrid <- expand.grid(sigma=sigma,C=C)
对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)
)
}