LibSVM 和 scikit-learn 的不同精度

Posted

技术标签:

【中文标题】LibSVM 和 scikit-learn 的不同精度【英文标题】:Different accuracy for LibSVM and scikit-learn 【发布时间】:2013-02-21 15:37:27 【问题描述】:

对于相同的数据集和参数,我得到 LibSVMscikit-learn 的 SVM 实现的不同精度,即使 scikit-learn also uses LibSVM internally。

我忽略了什么?

LibSVM 命令行版本:

me@my-compyter:~/Libraries/libsvm-3.16$ ./svm-train -c 1 -g 0.07 heart_scale heart_scale.model
optimization finished, #iter = 134
nu = 0.433785
obj = -101.855060, rho = 0.426412
nSV = 130, nBSV = 107
Total nSV = 130
me@my-compyter:~/Libraries/libsvm-3.16$ ./svm-predict heart_scale heart_scale.model heart_scale.result
Accuracy = 86.6667% (234/270) (classification)

Scikit-learn NuSVC 版本:

In [1]: from sklearn.datasets import load_svmlight_file    
In [2]: X_train, y_train = load_svmlight_file('heart_scale')    
In [3]: from sklearn import svm    
In [4]: clf = svm.NuSVC(gamma=0.07,verbose=True)   
In [5]: clf.fit(X_train,y_train)
        [LibSVM]*
        optimization finished, #iter = 118
        C = 0.479830
        obj = 9.722436, rho = -0.224096
        nSV = 145, nBSV = 125
        Total nSV = 145
Out[5]: NuSVC(cache_size=200, coef0=0.0, degree=3, gamma=0.07, kernel='rbf',
        max_iter=-1, nu=0.5, probability=False, shrinking=True, tol=0.001,
        verbose=True)
In [6]: pred = clf.predict(X_train)    
In [7]: from sklearn.metrics import accuracy_score    
In [8]: accuracy_score(y_train, pred)
Out[8]: 0.8481481481481481

Scikit-learn SVC 版本:

In [1]: from sklearn.datasets import load_svmlight_file    
In [2]: X_train, y_train = load_svmlight_file('heart_scale')    
In [3]: from sklearn import svm    
In [4]: clf = svm.SVC(gamma=0.07,C=1, verbose=True)   
In [5]: clf.fit(X_train,y_train)
        [LibSVM]*
        optimization finished, #iter = 153
        obj = -101.855059, rho = -0.426465
        nSV = 130, nBSV = 107
        Total nSV = 130
Out[5]: SVC(C=1, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.07,
        kernel='rbf', max_iter=-1, probability=False, shrinking=True, tol=0.001,
        verbose=True)
In [6]: pred = clf.predict(X_train)    
In [7]: from sklearn.metrics import accuracy_score    
In [8]: accuracy_score(y_train, pred)
Out[8]: 0.8666666666666667

更新

Update1:​​将 scikit-learn 示例从 SVR 更新为 NuSVC,请参阅 ogrisel 的回答

Update2:verbose=True添加了输出

Update3:添加了 scikit-learn SVC 版本

看来我的问题已经解决了。如果我将 SVC 与 C=1 一起使用而不是 NuSVC,我会得到与 libsvm 相​​同的结果,但有人可以解释为什么 NuSVC 和 SVC(C=1) 会给出不同的结果,即使它们应该做同样的事情(参见 ogrisel 的回答)?

【问题讨论】:

【参考方案1】:

SVR 是回归模型,不是分类模型。 svm-train -c 1 是 Nu-SVC 模型,可用作 sklearn.svm.NuSVC 类。

【讨论】:

感谢 (+1) 指出我的不幸。但是我用 NuSVC 重新运行了这个例子,仍然有区别,即使它更小了。 根据您的输出,nu 的值不一样。可能是 svm-train 命令行使用了 NuSVC 类接口中没有的启发式方法。 公差也可能不一样。尝试设置verbose=True以获取更多详细信息。 我添加了 verbose=true 输出。而且我还添加了 C=1 的 SVC 示例。这给出了与 libsvm 相​​同的结果。所以我的问题就解决了,但是你能解释一下为什么 NuSVC 和 SVC(C=1) 会给出其他结果吗? 因为他们使用不同的正则化?你为什么希望他们给同样的东西?

以上是关于LibSVM 和 scikit-learn 的不同精度的主要内容,如果未能解决你的问题,请参考以下文章

在 scikit-learn SVM 中缩放数据

使用 python 将 CSV 文件转换为 LIBSVM 兼容的数据文件

机器学习二十三:scikit-learn 支持向量机算法库总结

libsvm:C++ 与 MATLAB:不同的精度有何不同?

R e1071 预测与 libsvm 不同

为啥 libsvm 在同一数据集上创建不同的结果