我希望得到一些关于我为什么会得到的建议:
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中请求的交叉验证有关
答案 0 :(得分:1)
您的问题是caret
程序包的特殊性之一。
使用caret
调用的kernlab svm方法导致预测失败有两个潜在原因:
caret::train
函数无法使用的predict
对象。解决方案:只需替换为公式界面即可。
train(form = Emotion ~ . , data = modelTrain, ...
解决方案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参数。一旦我这样做,一切都有效。我猜它与引擎盖下的交叉验证有什么关系,但我不确定。