我的数据在e1071包中使用svm生成奇怪的结果,所以我试图检查R svm是否可以生成与WEKA(或python)相同的结果,因为我过去一直在使用WEKA。
我搜索了一个问题,发现一个与我完全相同的混淆,但没有回答。 This is the question
所以我希望我能在这里得到答案。
为了方便起见,我还使用虹膜数据集,并使用整个虹膜数据训练模型(WEKA中的SMO和来自R包e1071的svm),并自行测试。
WEKA参数:
weka.classifiers.functions.SMO -C 1.0 -L 0.001 -P 1.0E-12 -N 0 -V 10 -W 1 -K "weka.classifiers.functions.supportVector.RBFKernel -G 0.01 -C 250007"
除了默认情况,我将内核更改为RBFKernel以使其与R fucntion一致。
结果是:
a b c <-- classified as
50 0 0 | a = Iris-setosa
0 46 4 | b = Iris-versicolor
0 7 43 | c = Iris-virginica
R脚本:
library(e1071)
model <- svm(iris[,-5], iris[,5], kernel="radial", epsilon=1.0E-12)
res <- predict(model, iris[,-5])
table(pred = res, true = iris[,ncol(iris)])
结果是:
true
pred setosa versicolor virginica
setosa 50 0 0
versicolor 0 48 2
virginica 0 2 48
我不是机器学习者,所以我猜这两种方法的默认参数非常不同。例如,e1071默认值为epsilon
,WEKA为1.0E-12。我试着阅读这些手册,并希望所有参数都相同,但很多参数似乎与我不相上下。
感谢。
答案 0 :(得分:5)
有关SMO的RWeka参数,请参阅http://weka.sourceforge.net/doc.dev/weka/classifiers/functions/SMO.html并使用?svm查找e1071 svm实现的相应参数。
根据?svm,R e1071 svm是libsvm的接口,似乎使用标准的QP求解器。
对于k级的多类分类,k> 2,libsvm使用 “一对一”方法,其中k(k-1)/ 2个二元分类器 培训;通过投票方案找到合适的班级。 libsvm在内部使用稀疏数据表示,SparseM包也支持高级数据。
相反?在RWeka的SMO
实现了John C. Platt的顺序最小优化算法 用于使用多项式或RBF训练支持向量分类器 内核。使用成对解决多类问题 分类
因此,这两种实现通常是不同的(因此结果可能会略有不同)。如果我们选择相应的超参数相同,那么混淆矩阵几乎是相同的:
library(RWeka)
model.smo <- SMO(Species ~ ., data = iris,
control = Weka_control(K = list("RBFKernel", G=2), C=1.0, L=0.001, P=1.0E-12, N=0, V=10, W=1234))
res.smo <- predict(model.smo, iris[,-5])
table(pred = res.smo, true = iris[,ncol(iris)])
true
pred setosa versicolor virginica
setosa 50 0 0
versicolor 0 47 1
virginica 0 3 49
library(e1071)
set.seed(1234)
model.svm <- svm(iris[,-5], iris[,5], kernel="radial", cost=1.0, tolerance=0.001, epsilon=1.0E-12, scale=TRUE, cross=10)
res.svm <- predict(model.svm, iris[,-5])
table(pred = res.svm, true = iris[,ncol(iris)])
true
pred setosa versicolor virginica
setosa 50 0 0
versicolor 0 49 1
virginica 0 1 49
另请参阅:{https://stats.stackexchange.com/questions/130293/svm-and-smo-main-differences][1]和此[https://www.quora.com/Whats-the-difference-between-LibSVM-and-LibLinear][1]