【问题标题】:Does it make sense to have negative epsilon when tuning a linear-SVM model in R?在 R 中调整线性 SVM 模型时,负 epsilon 是否有意义?
【发布时间】:2019-01-21 21:47:57
【问题描述】:

我正在使用以下调优代码为我的 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")

我错过了什么吗?

【问题讨论】:

    标签: r machine-learning svm


    【解决方案1】:

    tldr;

    问题出在您的tuneResult 命令中,您允许epsilon[-5, +5] 范围内变化,这是没有意义的,因为epsilon 是为值&gt;=0 定义的。 tuneResult 返回epsilon = -5 的事实表明在尝试找到一组最佳(超)参数时会出现收敛失败/问题。不幸的是,没有(样本)数据,很难对分类模型中的任何(潜在)计算挑战有感觉。


    epsilon的作用/解读

    回顾一下:在 SVM 中,epsilon 描述了分类错误不会受到惩罚的容差范围(“不敏感区域”)(您应该查看 ?e1071::svm 以了解 @ 的默认值987654332@)。在epsilon 从右侧接近零的限制中,所有 分类错误都会受到惩罚,从而产生最大数量的支持向量(作为epsilon 的函数)。参见例如here 了解有关各种 SVM(超)参数的解释/定义的更多详细信息。

    超参数优化与收敛

    让我们回到为什么优化收敛失败的问题:我认为问题出在尝试同时优化costepsilon 参数。随着epsilon 越来越小,你对错误分类的惩罚越来越多(减少支持向量的数量); 同时,通过允许越来越大的cost 参数,您可以包含越来越多的支持向量,以抵消来自小的epsilons 的错误分类。在交叉验证期间,这实质上将模型驱动到越来越小的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 和 cost 超参数。我们使用与您原始帖子中相同的范围,包括无意义(即负)的 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 参数如何趋向于它们各自的最小/最大极端。

    【讨论】:

    • @S.Think PS。更传统地,您可能会通过网格搜索优化两个超参数 gammacost(假设您使用的是非线性内核)。也许这就是你想要做的?
    • 不是真的!我的目标是线性内核。这就是为什么我对负 epsilon 感到惊讶的原因。检查您的答案后,我更改了代码,发现成本 = 0.19 和 epsilon = 0 是最佳值。然后我训练了我的模型并使用混淆矩阵获得了最佳精度。再次非常感谢您的帮助。
    猜你喜欢
    • 2014-11-28
    • 2018-10-01
    • 2010-12-26
    • 2017-08-18
    • 2016-03-09
    • 2015-08-03
    • 2014-05-18
    • 1970-01-01
    • 2013-08-12
    相关资源
    最近更新 更多