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 对吗?
您的代码中存在一些小错误:
- 如果你想使用ROC下的面积作为度量,你需要像你一样指定
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
)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)
)
}
我正在创建径向 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 对吗?
您的代码中存在一些小错误:
- 如果你想使用ROC下的面积作为度量,你需要像你一样指定
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
)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)
)
}