训练ksvm prob.model时,线性搜索失败

15

继续《在R中使用ksvm训练大型支持向量机的无效概率模型》的话题:

我正在使用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

你解决了这个问题吗? - Vishal Belsare
4
不,我确实发现它也会出现在较小的数据集中,但我还没有找到一个一致的解释。通常减少或增加观察数量可以解决这个问题,这增加了它的不规则性质... - roelandvanbeek
@roelandvanbeek,我在尝试为我的数据集绘制学习曲线时遇到了问题,但是当我仅运行某些拆分(例如70/30)时,它并没有显示出这个问题?这就是您所说的减少或增加观察次数吗? - E B
3个回答

1
看源代码,这是抛出错误的那一行
在方法.probPlatt中使用牛顿法来优化函数,在这种情况下是 Platt 的缩放。如果你检查第3007行,你会看到一些与该方法有关的参数。
其中一个参数是minstep,基本上是方法应该保持尝试优化函数的最小数值步长。你看,这正是在第3090行出现错误的条件:if (stepsize < minstep)。所以,基本上,即使达到最小步长,函数也无法收敛。
你可以尝试将minstep更改为较低的值来规避它。Alexandros甚至评论说这些参数可能应该在界面中。

你是在说我们需要改变代码并重新编译吗? - E B
@EB 是的,关于更改代码,重新编译不是必需的。 - catastrophic-failure
@catastrophic-failure,我不理解优化器的行为。如果达到了最大迭代次数,那么没有问题。但是,如果步长小于min_step,则会调用.SigmoidPredict,它不会返回A和B。我认为解决方案不是减小min_step,而是不要调用.SigmoidPredict。你有什么想法吗? - Elad663

0

我不理解优化器的行为。如果达到了最大迭代次数,那就没有问题。但是如果步长小于min_step,它会调用 .SigmoidPredict,这个函数不会返回 AB。我认为解决方案不是减小 min_step,而是不要调用 .SigmoidPredict,所以我将其注释掉了。顺便说一下,我不明白为什么他们不使用 glm 来估计 A 和 B。

这里有一个基于 cran 的最新源代码的存储库,其中对 SigmoidPredict 的调用被注释掉了。

devtools::install_github('elad663/kernlab')


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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接