帮助在R?中使用kernlab的SVM的predict()?

mest 发布于 2019-11-10 kernlab 最后更新 2019-11-10 12:09 196 浏览

我正在尝试使用kernlab R软件包来执行支持向量机(SVM)。举个简单的例子,我有两个训练数据。 A和B. (A和B的类型为matrix - 它们是图的邻接矩阵。) 所以我写了一个函数,它需要A + B并生成一个核心矩阵。

> km
         [,1]     [,2]
[1,] 14.33333 18.47368
[2,] 18.47368 38.96053
现在我使用kernlabksvm函数来生成我的预测模型。现在,我只是想让这件事情起作用 - 我并不担心训练错误等。 所以,问题1:我是否正确生成我的模型?合理?
# y are my classes. In this case, A is in class "1" and B is in class "-1"
> y
[1]  1 -1
> model2 =  ksvm(km, y, type="C-svc", kernel = "matrix");
> model2
Support Vector Machine object of class "ksvm"
SV type: C-svc  (classification) 
 parameter : cost C = 1
[1] " Kernel matrix used as input."
Number of Support Vectors : 2
Objective Function Value : -0.1224 
Training error : 0 
到现在为止还挺好。我们创建了自定义内核矩阵,然后使用该矩阵创建了一个ksvm模型。我们的训练数据标记为“1”和“-1”。 现在预测:
> A
     [,1] [,2] [,3]
[1,]    0    1    1
[2,]    1    0    1
[3,]    0    0    0
> predict(model2, A)
Error in as.matrix(Z) : object 'Z' not found
嗯,哦。这没关系。有点期待,真的。 “预测”需要某种矢量,而不是矩阵。 所以让我们尝试一些事情:
> predict(model2, c(1))
Error in as.matrix(Z) : object 'Z' not found
> predict(model2, c(1,1))
Error in as.matrix(Z) : object 'Z' not found
> predict(model2, c(1,1,1))
Error in as.matrix(Z) : object 'Z' not found
> predict(model2, c(1,1,1,1))
Error in as.matrix(Z) : object 'Z' not found
> predict(model2, km)
Error in as.matrix(Z) : object 'Z' not found
上述一些测试是无意义的,但这是我的观点:无论我做什么,我都无法预测()看我的数据并做出预测。标量不起作用,矢量不起作用。 2x2矩阵不起作用,3x3矩阵也不起作用。 我在这里做错了什么? (一旦我知道ksvm需要什么,那么我可以确保我的测试数据能够以一种合理/合理/数学上合理的方式符合该格式。)
已邀请:

zamet

赞同来自:

Steve Lianoglou是对的。 在kernlab中,它有点连线,并且在预测时需要每个测试示例和支持向量之间的输入内核矩阵。你需要自己找到这个矩阵。 例如,测试矩阵[n×m],其中n是测试样本的数量,m是学习模型中的支持向量的数量(按SVindex(模型)的顺序排序)。 示例代码

trmat <- as.kernelMatrix(kernels[trainidx,trainidx])
tsmat <- as.kernelMatrix(kernels[testidx,trainidx])
#training
model = ksvm(x=trmat, y=trlabels, type = "C-svc", C = 1)
#testing
thistsmat = as.kernelMatrix(tsmat[,SVindex(model)])
tsprediction = predict(model, thistsmat, type = "decision")
kernels是输入内核矩阵。 trainidx和testidx是用于训练和测试的ID。

wsint

赞同来自:

首先,我没有多少使用kernlab。但只是查看文档,我确实看到了predict.ksvm()方法的工作示例。复制和粘贴,并省略打印到屏幕:

 ## example using the promotergene data set
 data(promotergene)
## create test and training set
 ind <- sample(1:dim(promotergene)[1],20)
 genetrain <- promotergene[-ind, ]
 genetest <- promotergene[ind, ]
## train a support vector machine
 gene <-  ksvm(Class~.,data=genetrain,kernel="rbfdot",\
               kpar=list(sigma=0.015),C=70,cross=4,prob.model=TRUE)
## predict gene type probabilities on the test set
 genetype <- predict(gene,genetest,type="probabilities")
这看起来非常简单:使用随机采样生成训练集genetrain及其补充genetest,然后通过ksvm进行拟合,并使用匹配格式的拟合和新数据调用predict()方法。这是非常标准的。 您可能会发现Max Kuhn的caret包非常有用。它为各种回归,分类和机器学习方法和包提供了一般评估和测试框架,包括kernlab,并包含几个小插图和一个JSS paper

iipsa

赞同来自:

内容太长未翻译

et_qui

赞同来自:

自己根据解决方案的元素构建标签。使用此替代预测方法,该方法采用ksvm模型(m)和原始训练格式的数据(d)

predict.alt <- function(m, d){
  sign(d[, m@SVindex] %*% m@coef[[1]] - m@b)
}
K是kernelMatrix用于培训。为了验证,如果在训练数据上运行predict.alt,您会注意到备用预测器方法将值与ksvm返回的拟合值一起切换。本机预测器以意想不到的方式运行:
aux <- data.frame(fit=kout@fitted, native=predict(kout, K), alt=predict.alt(m=kout, d=as.matrix(K))) 
sample_n(aux, 10)
    fit  native alt
1     0       0  -1
100   1       0   1
218   1       0   1
200   1       0   1
182   1       0   1
87    0       0  -1
183   1       0   1
174   1       0   1
94    1       0   1
165   1       0   1