在 R 中调整线性 SVM 模型时,负 epsilon 是否有意义?
Does it make sense to have negative epsilon when tuning a linear-SVM model in R?
我正在使用以下调整代码来为我的 svn 模型找到最佳情况和 epsilon。
tuneResult <- tune(
svm,
labels ~ .,
data = dataset,
ranges = list(epsilon = seq(-5.0, 5, 0.1), cost = 2^(0:3)))
但令人惊讶的是它建议 cost = 4
和 epsilon = -5
!
然后我使用这些参数训练模型并使用 confusionMatrix
进行测试。不幸的是,该模型不如没有这些参数的模型准确。
model1 <- svm(labels ~ ., data = dataset, kernel = "linear", cost = 4 , epsilon = -5)
model2 <- svm(labels ~ ., data = dataset, kernel = "linear")
我是不是遗漏了什么?
tldr;
问题出在您的 tuneResult
命令中,您允许 epsilon
在 [-5, +5]
范围内变化,这没有意义,因为 epsilon
是为值定义的>=0
。 tuneResult
returns epsilon = -5
这一事实表明在尝试找到一组最佳(超)参数时收敛 failure/issue。不幸的是,如果没有(样本)数据,就很难感受到分类模型中的任何(潜在)计算挑战。
epsilon
role/interpretation
简单回顾一下:在 SVM 中,epsilon
描述了容差范围("insensitivity zone"),在该范围内分类错误不会受到惩罚(您应该查看 ?e1071::svm
以找到关于 epsilon
的默认值)。在 epsilon
从右边接近零的限制中, 所有 分类错误都会受到惩罚,从而产生最大数量的支持向量(作为 epsilon
的函数) .参见例如here 有关各种 SVM(超)参数的 interpretation/definition 的更多详细信息。
超参数优化与收敛
让我们return回答为什么优化收敛失败的问题:我认为问题出在尝试同时优化cost
和 epsilon
参数。随着 epsilon
变得越来越小,你对错误分类的惩罚越来越多(减少支持向量的数量); 同时,通过允许越来越大的 cost
参数,您允许包含越来越多的支持向量以抵消来自小 epsilon
的错误分类秒。在交叉验证期间,这实质上会驱使模型变得越来越小 epsilon
和越来越大 cost
超参数。
一个例子
我们可以使用一些针对 SVM 分类问题的模拟数据重现此行为。
让我们生成一些示例数据
# Sample data
set.seed(1)
x <- rbind(matrix(rnorm(10 * 2, mean = 0), ncol = 2),
matrix(rnorm(10 * 2, mean = 2), ncol = 2))
y <- c(rep(-1, 10), rep(1, 10))
df <- data.frame(x = x, y = as.factor(y))
让我们同时调整 epsilon 和成本超参数。我们使用与您的原始 post 中相同的范围,包括无意义的(即负的)epsilon 值。
# tune epsilon and cost hyper-parameters
library(caret)
tuneResult <- tune(
svm,
y ~ .,
data = df,
ranges = list(epsilon = seq(-5, 5, 0.01), cost = 2^(0:3))
)
#
#Parameter tuning of ‘svm’:
#
#- sampling method: 10-fold cross validation
#
#- best parameters:
# epsilon cost
# -5 4
#
#- best performance: 0.1
您可以看到 epsilon
和 cost
参数如何趋向于各自的 minimal/maximal 极端。
我正在使用以下调整代码来为我的 svn 模型找到最佳情况和 epsilon。
tuneResult <- tune(
svm,
labels ~ .,
data = dataset,
ranges = list(epsilon = seq(-5.0, 5, 0.1), cost = 2^(0:3)))
但令人惊讶的是它建议 cost = 4
和 epsilon = -5
!
然后我使用这些参数训练模型并使用 confusionMatrix
进行测试。不幸的是,该模型不如没有这些参数的模型准确。
model1 <- svm(labels ~ ., data = dataset, kernel = "linear", cost = 4 , epsilon = -5)
model2 <- svm(labels ~ ., data = dataset, kernel = "linear")
我是不是遗漏了什么?
tldr;
问题出在您的 tuneResult
命令中,您允许 epsilon
在 [-5, +5]
范围内变化,这没有意义,因为 epsilon
是为值定义的>=0
。 tuneResult
returns epsilon = -5
这一事实表明在尝试找到一组最佳(超)参数时收敛 failure/issue。不幸的是,如果没有(样本)数据,就很难感受到分类模型中的任何(潜在)计算挑战。
epsilon
role/interpretation
简单回顾一下:在 SVM 中,epsilon
描述了容差范围("insensitivity zone"),在该范围内分类错误不会受到惩罚(您应该查看 ?e1071::svm
以找到关于 epsilon
的默认值)。在 epsilon
从右边接近零的限制中, 所有 分类错误都会受到惩罚,从而产生最大数量的支持向量(作为 epsilon
的函数) .参见例如here 有关各种 SVM(超)参数的 interpretation/definition 的更多详细信息。
超参数优化与收敛
让我们return回答为什么优化收敛失败的问题:我认为问题出在尝试同时优化cost
和 epsilon
参数。随着 epsilon
变得越来越小,你对错误分类的惩罚越来越多(减少支持向量的数量); 同时,通过允许越来越大的 cost
参数,您允许包含越来越多的支持向量以抵消来自小 epsilon
的错误分类秒。在交叉验证期间,这实质上会驱使模型变得越来越小 epsilon
和越来越大 cost
超参数。
一个例子
我们可以使用一些针对 SVM 分类问题的模拟数据重现此行为。
让我们生成一些示例数据
# Sample data set.seed(1) x <- rbind(matrix(rnorm(10 * 2, mean = 0), ncol = 2), matrix(rnorm(10 * 2, mean = 2), ncol = 2)) y <- c(rep(-1, 10), rep(1, 10)) df <- data.frame(x = x, y = as.factor(y))
让我们同时调整 epsilon 和成本超参数。我们使用与您的原始 post 中相同的范围,包括无意义的(即负的)epsilon 值。
# tune epsilon and cost hyper-parameters library(caret) tuneResult <- tune( svm, y ~ ., data = df, ranges = list(epsilon = seq(-5, 5, 0.01), cost = 2^(0:3)) ) # #Parameter tuning of ‘svm’: # #- sampling method: 10-fold cross validation # #- best parameters: # epsilon cost # -5 4 # #- best performance: 0.1
您可以看到
epsilon
和cost
参数如何趋向于各自的 minimal/maximal 极端。