支持向量机训练caret错误:kernlab类概率计算失败;返回NAs

8
我有一些数据,其中Y变量是一个因子——好或坏。我正在使用'caret'包的'train'方法构建支持向量机。使用'train'函数,我能够确定各种调整参数的值,并得到最终的支持向量机。对于测试数据,我可以预测'class'。但是当我尝试预测测试数据的概率时,我会得到以下错误(例如,我的模型告诉我测试数据中的第一个数据点有y='good',但我想知道获得'good'的概率是多少...通常情况下,在支持向量机中,模型将计算预测的概率...如果Y变量有两个结果,则模型将预测每个结果的概率。具有最大概率的结果被认为是最终解决方案)。
**Warning message:  
In probFunction(method, modelFit, ppUnk) :  
  kernlab class probability calculations failed; returning NAs**

以下是示例代码:
library(caret)
trainset <- data.frame( 
     class=factor(c("Good",    "Bad",   "Good", "Good", "Bad",  "Good", "Good", "Good", "Good", "Bad",  "Bad",  "Bad")),
     age=c(67,  22, 49, 45, 53, 35, 53, 35, 61, 28, 25, 24))

testset <- data.frame( 
     class=factor(c("Good",    "Bad",   "Good"  )),
    age=c(64,   23, 50))



library(kernlab)
set.seed(231)

### finding optimal value of a tuning parameter
sigDist <- sigest(class ~ ., data = trainset, frac = 1)
### creating a grid of two tuning parameters, .sigma comes from the earlier line. we are trying to find best value of .C
svmTuneGrid <- data.frame(.sigma = sigDist[1], .C = 2^(-2:7))

set.seed(1056)
svmFit <- train(class ~ .,
                data = trainset,
                method = "svmRadial",
                preProc = c("center", "scale"),
                tuneGrid = svmTuneGrid,
                trControl = trainControl(method = "repeatedcv", repeats = 5))

### svmFit finds the optimal values of tuning parameters and builds the model using the best parameters

### to predict class of test data
predictedClasses <- predict(svmFit, testset )
str(predictedClasses)


### predict probablities but i get an error
predictedProbs <- predict(svmFit, newdata = testset , type = "prob")
head(predictedProbs)

根据以下输出,有9个支持向量。如何识别这12个训练数据点中的哪些是这9个?
svmFit$finalModel

支持向量机对象属于"ksvm"类

支持向量类型:C-svc(分类) 参数:成本C = 1

高斯径向基核函数。 超参数:sigma = 0.72640759446315

支持向量数:9

目标函数值:-5.6994 训练误差:0.083333


这是“caret”包和“train”函数。不包括构建测试用例的代码。如果您想引起注意,应重新考虑使问题可重现(可以使用caret包中的数据集或使用dput(head( your_data, 30))),并在适当时更频繁地使用大写键,而在不适当时则少用。 - IRTFM
同意您的输入,我已经添加了示例代码...并尝试修改了我的大写字母。 - user2543622
我已经编辑了我的答案来回答你的额外问题。由于某种原因,该模型仅提取了8个支持向量。 - user666993
1个回答

14

在火车控制语句中,您需要指定是否希望返回类概率classProbs = TRUE


svmFit <- train(class ~ .,
    data = trainset,
    method = "svmRadial",
    preProc = c("center", "scale"),
    tuneGrid = svmTuneGrid,
    trControl = trainControl(method = "repeatedcv", repeats = 5, 
classProbs =  TRUE))

predictedClasses <- predict(svmFit, testset )
predictedProbs <- predict(svmFit, newdata = testset , type = "prob")

在测试数据集中,将给出处于“坏”或“好”类别的概率:

print(predictedProbs)
    Bad      Good
1 0.2302979 0.7697021
2 0.7135050 0.2864950
3 0.2230889 0.7769111

编辑

为了回答你的新问题,你可以使用 alphaindex(svmFit$finalModel) 来访问支持向量在原始数据集中的位置,并使用系数coef(svmFit$finalModel)


如果我输入'svmFit$finalModel',则返回支持向量机对象,类别为“ksvm”。SV类型:C-svc(分类) 参数:成本C = 1高斯径向基核函数。 超参数:sigma = 0.72640759446315支持向量数:9 目标函数值:-5.6994 训练误差:0.083333 - user2543622
如果可能,请回答我的问题。我已在原始问题中的“下划线下方有新问题”一行中添加了我的问题。 - user2543622
还有一件事,svmFit$finalModel命令输出显示“SV type: C-svc (classification) parameter : cost C = 1”。这是否意味着任何支持向量所具有的最大权重为1?我在我们的数据上进行了测试,并没有看到任何权重>1,但是我想得到您的确认。 - user2543622
那个PDF非常好,谢谢……还有一个问题:关于神经网络。我已经在相同的数据上构建了一个神经网络模型,并且想找出每个隐藏节点内部使用的权重。根据网页http://www.inside-r.org/r-doc/nnet/nnet,我尝试了neuralnetobject$finalModel$wts和wts(neuralnetobject$finalModel),但是没有得到任何权重:( - user2543622
@user2543622:你最好在Crossvalidated上发布一个新问题,因为我对神经网络并不是非常熟悉,而且很有可能你会得到更好的回答。 - user666993
显示剩余5条评论

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