R和WEKA上的支持向量机

Yan*_*Yan 1 r machine-learning svm weka

我的数据使用e1071包中的svm在s上产生了奇怪的结果,所以我试图检查R svm是否可以生成与WEKA(或python)相同的结果,因为我过去一直在使用WEKA.

我搜索了一个问题,发现一个与我完全相同的混淆,但没有答案.这是个问题.

所以我希望我能在这里得到答案.

为了方便起见,我还使用虹膜数据集,并使用整个虹膜数据训练模型(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"
Run Code Online (Sandbox Code Playgroud)

除了默认情况,我将内核更改为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
Run Code Online (Sandbox Code Playgroud)

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)]) 
Run Code Online (Sandbox Code Playgroud)

结果是:

            true
pred         setosa versicolor virginica
  setosa         50          0         0
  versicolor      0         48         2
  virginica       0          2        48
Run Code Online (Sandbox Code Playgroud)

我不是机器学习者,所以我猜这两种方法的默认参数非常不同.例如,e1071默认为0.01 epsilon,WEKA为1.0E-12.我试着阅读手册并想让所有参数都相同,但很多参数似乎与我不相上下.

谢谢.

San*_*Dey 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
Run Code Online (Sandbox Code Playgroud)

另请参阅:[ https://stats.stackexchange.com/questions/130293/svm-and-smo-main-differences] [1 ]和[ https://www.quora.com/Whats-the-差之间-LIBSVM和- LibLinear] [1]