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

时间:2013-04-09 07:30:09

标签: r svm kernlab

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 :(得分:1)

查看源代码enter image description here

方法.probPlatt使用牛顿方法优化函数,在这种情况下是Platt的缩放。如果你检查this is the line that throws that error,你会看到一些与该方法有关的参数。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我不了解优化程序的行为。如果达到最大迭代次数,则没有问题。但是如果step低于min_step,它将调用.SigmoidPredict,它不会返回AB。我认为解决方案不是减少min_step,而不是打电话给.SigmoidPredict,因此我将其注释掉。顺便说一句,我不明白为什么他们不使用glm来估算A和B。

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

devtools::install_github('elad663/kernlab')