支持R和WEKA上的矢量机

时间:2016-10-14 19:14:30

标签: r machine-learning svm weka

我的数据在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。我试着阅读这些手册,并希望所有参数都相同,但很多参数似乎与我不相上下。

感谢。

1 个答案:

答案 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]