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
4

3 回答 3

1

查看源代码,这是引发该错误的行

它是关于.probPlatt使用牛顿法优化函数的方法,在这种情况下是普拉特的缩放比例。如果您检查第 3007 行,您会看到一些与该方法有关的参数。

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

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

于 2016-07-16T21:04:40.957 回答
0

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

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

devtools::install_github('elad663/kernlab')

于 2019-04-06T05:36:12.177 回答
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
}
于 2018-12-19T22:27:23.617 回答