【问题标题】:Line search fails in training ksvm prob.model线搜索在训练 ksvm prob.model 时失败
【发布时间】:2013-03-31 12:38:03
【问题描述】:

Invalid probability model for large support vector machines using ksvm in R跟进:

我正在使用 R 中的 kernlab 包中的 ksvm 训练 SVM。我想使用概率模型,但在 sigmoid 拟合期间我收到以下错误消息:

line search fails -1.833726 0.5772808 5.844462e-05 5.839508e-05 -1.795008e-08 
-1.794263e-08 -2.096847e-12

发生这种情况时,prob.model(m) 的结果值是所有概率的向量,而不是拟合在这些概率上的 sigmoid 函数的预期参数。是什么导致了这个错误,我该如何防止它?搜索错误消息没有结果。

可重现的例子:

load(url('http://roelandvanbeek.nl/files/df.rdata'))
ksvm(label~value,df[1:1000],C=10,prob.model=TRUE)->m 
prob.model(m) # works as it should, prints a list containing one named list

# the below, non-working problem, unfortunately takes an hour due to the large
# sample size
ksvm(label~value,df,C=10,prob.model=TRUE)->m # line search fails  
prob.model(m) # just a vector of values

【问题讨论】:

  • 你解决了吗?
  • 没有。我确实发现它也发生在较小的数据集上,但还没有找到一致的解释。通常,减少或增加观察次数可以解决问题,这会增加其性质的不规则性......
  • @roelandvanbeek,当我尝试为我的数据集绘制学习曲线时,我看到了问题,但是当我仅针对某些拆分 70/30 运行时,它没有显示问题?这就是你所说的减少或增加观察的意思吗?

标签: r svm kernlab


【解决方案1】:

查看源代码,this is the line that throws that error

.probPlatt 方法上使用牛顿法优化函数,在本例中为普拉特缩放。如果您检查line 3007,尽管您会看到一些与该方法有关的参数。

其中一个参数是minstep,基本上是该方法应该不断尝试优化函数的最小数值步骤。你看,这正是第 3090 行错误的情况:if (stepsize < minstep)。因此,基本上,即使达到最小步长,函数也不会收敛。

您可以尝试将minstep 更改为较低的值来规避它。 Alexandros 甚至评论说这些参数可能应该在界面中。

【讨论】:

  • 你是说我们应该改变代码并重新编译它吗?
  • @EB 是的关于更改代码,但重新编译不是严格要求。
  • @catastrophic-failure 我不了解优化器的行为。如果达到最大迭代,没问题。但是如果 step 低于 min_step 它会调用.SigmoidPredict,它不会返回 A 和 B。我认为解决方案不是减少 min_step,而是调用 .SigmoidPredict。想法?
【解决方案2】:

在我看来,问题是随机发生的。因此,我通过多次拟合 ksvm 模型直到它起作用来绕过这个问题。

stop.crit = 1
while (stop.crit <= 10) {
    stop.crit = stop.crit + 1
    MOD = ksvm(...)
    tryCatch(PRED = predict(...), error = function(e) e)
    if (exists("PRED") == TRUE) stop.crit = 11
}

【讨论】:

    【解决方案3】:

    我不了解优化器的行为。如果达到最大迭代,没问题。但是如果 step 低于 min_step 它会调用.SigmoidPredict,它不会返回AB。我不认为解决办法是减少min_step,而不是调用.SigmoidPredict,所以我把它注释掉了。顺便说一句,我不明白他们为什么不使用 glm 来估计 A 和 B。

    这是一个基于 cran 的最新源代码的存储库,对 SigmoidPredict 的调用已被注释掉。

    devtools::install_github('elad663/kernlab')

    【讨论】:

      猜你喜欢
      • 2015-08-29
      • 2016-12-23
      • 2020-06-19
      • 1970-01-01
      • 1970-01-01
      • 2018-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多