我在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]