在 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 = 4epsilon = -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 是为值定义的>=0tuneResult returns epsilon = -5 这一事实表明在尝试找到一组最佳(超)参数时收敛 failure/issue。不幸的是,如果没有(样本)数据,就很难感受到分类模型中的任何(潜在)计算挑战。


epsilonrole/interpretation

简单回顾一下:在 SVM 中,epsilon 描述了容差范围("insensitivity zone"),在该范围内分类错误不会受到惩罚(您应该查看 ?e1071::svm 以找到关于 epsilon 的默认值)。在 epsilon 从右边接近零的限制中, 所有 分类错误都会受到惩罚,从而产生最大数量的支持向量(作为 epsilon 的函数) .参见例如here 有关各种 SVM(超)参数的 interpretation/definition 的更多详细信息。

超参数优化与收敛

让我们return回答为什么优化收敛失败的问题:我认为问题出在尝试同时优化costepsilon 参数。随着 epsilon 变得越来越小,你对错误分类的惩罚越来越多(减少支持向量的数量); 同时,通过允许越来越大的 cost 参数,您允许包含越来越多的支持向量以抵消来自小 epsilon 的错误分类秒。在交叉验证期间,这实质上会驱使模型变得越来越小 epsilon 和越来越大 cost 超参数。

一个例子

我们可以使用一些针对 SVM 分类问题的模拟数据重现此行为。

  1. 让我们生成一些示例数据

    # 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))
    
  2. 让我们同时调整 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
    

    您可以看到 epsiloncost 参数如何趋向于各自的 minimal/maximal 极端。