R和WEKA上的支持向量机

我在R中使用e1071包的svm对数据进行处理时,产生了奇怪的结果,于是我想检查R中的svm是否能生成与WEKA(或Python)相同的结果,因为我过去一直在使用WEKA。

我在谷歌上搜索这个问题,发现了一个与我有同样困惑但没有答案的问题。这是那个问题

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

为了简化问题,我也在使用iris数据集,并使用整个iris数据训练模型(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函数保持一致。

结果是:

  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)]) 

结果是:

            truepred         setosa versicolor virginica  setosa         50          0         0  versicolor      0         48         2  virginica       0          2        48

我不是机器学习专家,所以我猜这两个方法的默认参数非常不同。例如,e1071的默认epsilon是0.01,而WEKA是1.0E-12。我试图阅读手册并希望使所有参数一致,但很多参数似乎对我来说无法比较。

谢谢。


回答:

关于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)])              truepred         setosa versicolor virginica  setosa         50          0         0  versicolor      0         47         1  virginica       0          3        49library(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)])             truepred         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]

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注