【问题标题】:support vector machine train caret error kernlab class probability calculations failed; returning NAs支持向量机训练插入符号错误内核实验室类概率计算失败;返回 NA
【发布时间】:2013-07-24 16:02:11
【问题描述】:

我有一些数据,Y 变量是一个因素 - 好或坏。我正在使用“caret”包中的“train”方法构建支持向量机。使用“训练”功能,我能够最终确定各种调整参数的值并获得最终的支持向量机。对于测试数据,我可以预测“类”。但是当我尝试预测测试数据的概率时,我得到低于错误(例如我的模型告诉我测试数据中的第一个数据点有 y='good',但我想知道获得'good'的概率是多少...通常在支持向量机的情况下,模型将计算预测概率..如果 Y 变量有 2 个结果,则模型将预测每个结果的概率。具有最大概率的结果被认为是最终解决方案)

**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”类的支持向量机对象

SV类型:C-svc(分类) 参数:成本 C = 1

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

支持向量数:9

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

【问题讨论】:

  • 这是“caret”包和“train”函数。不包含构建测试用例的代码。如果您想关注这个问题,您应该重新考虑使问题可重现(通过使用 caret-package 中的数据集或使用 dput(head( your_data, 30)) ,您可能会考虑在适当的情况下更频繁地使用 caps-key 而在不是。
  • 同意您的输入,我已经添加了示例代码...并尝试修改我的大小写
  • 我已编辑我的答案以解决您的其他问题。由于某种原因,该模型仅提取了 8 个 SV。

标签: r testing r-caret


【解决方案1】:

在列车控制语句中,您必须指定是否要返回类概率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) 访问原始数据集中支持向量的位置。

【讨论】:

  • 如果我输入“ksvm”类的“svmFit$finalModel”支持向量机对象 SV 类型:C-svc(分类)参数:成本 C = 1 高斯径向基核函数。超参数:sigma = 0.72640759446315 支持向量数:9 目标函数值:-5.6994 训练误差:0.083333
  • 如果可能,请回答我的问题。我在我原来的问题中添加了我的问题在“此行下的新问题”行下
  • 谢谢...我厌倦了这些命令...它们是否返回数据点的 alpha/权重?我发现了另外一个命令 alphaindex(svmFit$finalModel)..我猜它返回支持向量的数据点的位置,我正确吗?
  • 你是对的 - alphaindex 返回用作支持向量的数据点的位置,coef 返回带符号的权重,其中符号为 sv 属于第一组的正数和负数属于第二组。
  • 另一件事 svmFit$finalModel 命令输出显示“SV 类型:C-svc(分类)参数:成本 C = 1”。这是否意味着任何支持向量的最大权重为 1?我在我们的数据上对其进行了测试,我没有看到任何体重 >1,但希望得到你的点头..
猜你喜欢
  • 2014-07-07
  • 2019-06-07
  • 2018-02-21
  • 2017-09-19
  • 2017-05-07
  • 1970-01-01
  • 2016-02-20
  • 2013-07-14
  • 2021-04-10
相关资源
最近更新 更多