で SVM パラメータを調整すると、非常に奇妙な動作が見られましたcaret
。チューニングを行わずに 1 つのモデルをトレーニングする場合、放射基底カーネルを使用する SVM は、線形カーネルを使用する SVM よりも時間がかかりますが、これは予想されることです。ただし、同じペナルティ グリッド上で両方のカーネルを使用して SVM を調整する場合、線形カーネルを使用した SVM は、放射基底カーネルを使用した SVM よりも大幅に時間がかかります。caret
この動作は、R 3.2 および6.0-47を使用する Windows と Linux の両方で簡単に再現できます。線形 SVM の調整が放射基底カーネル SVM よりもはるかに時間がかかる理由を知っている人はいますか?
SVM linear
user system elapsed
0.51 0.00 0.52
SVM radial
user system elapsed
0.85 0.00 0.84
SVM linear tuning
user system elapsed
129.98 0.02 130.08
SVM radial tuning
user system elapsed
2.44 0.05 2.48
おもちゃのサンプル コードは次のとおりです。
library(data.table)
library(kernlab)
library(caret)
n <- 1000
p <- 10
dat <- data.table(y = as.factor(sample(c('p', 'n'), n, replace = T)))
dat[, (paste0('x', 1:p)) := lapply(1:p, function(x) rnorm(n, 0, 1))]
dat <- as.data.frame(dat)
sigmas <- sigest(as.matrix(dat[, -1]), na.action = na.omit, scaled = TRUE)
sigma <- mean(as.vector(sigmas[-2]))
cat('\nSVM linear\n')
print(system.time(fit1 <- train(y ~ ., data = dat, method = 'svmLinear', tuneLength = 1,
trControl = trainControl(method = 'cv', number = 3))))
cat('\nSVM radial\n')
print(system.time(fit2 <- train(y ~ ., data = dat, method = 'svmRadial', tuneLength = 1,
trControl = trainControl(method = 'cv', number = 3))))
cat('\nSVM linear tuning\n')
print(system.time(fit3 <- train(y ~ ., data = dat, method = 'svmLinear',
tuneGrid = expand.grid(C = 2 ^ seq(-5, 15, 5)),
trControl = trainControl(method = 'cv', number = 3))))
cat('\nSVM radial tuning\n')
print(system.time(fit4 <- train(y ~ ., data = dat, method = 'svmRadial',
tuneGrid = expand.grid(C = 2 ^ seq(-5, 15, 5), sigma = sigma),
trControl = trainControl(method = 'cv', number = 3))))