预测拟合插入符号SVM模型时的预测警告

时间:2018-05-18 21:30:50

标签: r svm r-caret

我希望得到一些关于我为什么会得到的建议:

Warning message: In method$predict(modelFit = modelFit, newdata =
newdata, submodels = param) :   kernlab class prediction calculations
failed; returning NAs

当我打印预测时:

svmRadial_Predict
  [1] <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>....

我为执行SVM拟合而编写的代码:

    #10-fold cross validation in 3 repetitions 
    control = trainControl(seeds = s, method="repeatedcv", number=10,
repeats=3, savePredictions = TRUE, classProbs =  TRUE)

拟合的SVM模型如下:

svmRadial_model = train(y=modelTrain$Emotion,
                        x=modelTrain[c(2:4)],
                        method ='svmRadial',
                        trControl = control,
                        data=modelTrain,
                        tuneLength = 3
                        )

我编写的用于执行预测的代码如下所示:

    svmRadial_Predict <- predict(svmRadial_model, 
newdata = modelTest[c(2:4)], probability = TRUE )

我检查了数据,并且训练或测试集中没有NA值。 y值是一个因子,如果产生差异,x值是数值?任何调试此技巧的提示都将非常感谢!

模型训练我可以看到这样的警告:

line search fails -1.407938 -0.1710936 2.039448e-05

我假设只是模型无法适应数据中特定观察的超平面。我正在使用svmRadial内核 我试图拟合的数据已经使用R scale()函数居中并缩放。

进一步的工作让我相信它与之相关 classProbs = TRUE标志。如果我将其遗漏,则不会打印任何警告。 我已经启动了另一段代码,SVM似乎需要花费很长时间才能完成此任务,但我会在完成后立即报告结果。

作为最终编辑,模型拟合没有错误地完成,我可以使用该模型来预测/计算混淆矩阵等。我不明白为什么包括classProbs = TRUE打破它,但也许它& #39; s与交叉验证的组合有关,与我在trainControl中请求的交叉验证有关

2 个答案:

答案 0 :(得分:1)

您的问题是caret程序包的特殊性之一。

使用caret调用的kernlab svm方法导致预测失败有两个潜在原因:

  1. x,y接口返回caret::train函数无法使用的predict对象。

解决方案:只需替换为公式界面即可。

train(form = Emotion ~ . , data = modelTrain, ...


  1. 支持向量机算法中的迭代搜索不收敛。

解决方案2a)

train()调用之前设置不同的种子,直到调用为止     收敛。

set.seed(xxx)
train(form = Emotion ~ . , data = modelTrain, ...)

解决方案2b)

按照@ catastrophic-failure here的建议减少参数minstep。对于此解决方案,ksvm函数中没有参数,因此您需要将第2982行中的源代码:minstep <- 1e-10更改为较低的值。然后自己编译源代码。不能保证会有所帮助。

首先尝试解决方案1,因为它最有可能!

答案 1 :(得分:0)

我的解决办法就是省略trainControl函数的classProbs = TRUE参数。一旦我这样做,一切都有效。我猜它与引擎盖下的交叉验证有什么关系,但我不确定。