首页 文章

训练ksvm prob.model中的行搜索失败

提问于
浏览
14

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

我正在使用k中的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) 的结果值是所有概率的向量,而不是拟合在这些概率上的S形函数的预期参数 . 导致此错误的原因是什么?如何防止它?搜索错误消息没有产生任何结果 .

可重复的例子:

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

3 回答

  • 0

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

    它是在方法 .probPlatt 上使用牛顿方法来优化函数,在这种情况下是Platt的缩放 . 如果你检查line 3007虽然你会看到一些与该方法有关的参数 .

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

    您可以尝试将 minstep 更改为较低值以绕过它 . Alexandros甚至评论说这些参数可能应该在界面中 .

  • 1

    在我看来,问题是随机发生的 . 因此,我通过多次拟合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
    }
    
  • 0

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

    这是一个基于最新源代码的存储库,其中对SigmoidPredict的调用已经注释掉了 .

    devtools::install_github('elad663/kernlab')

相关问题