不同的准确度交叉验证libsvm和sklearn

时间:2015-04-02 14:26:28

标签: python scikit-learn libsvm cross-validation

我有一个预先计算的Gram矩阵,用于由自定义内核创建的数据集。 Gram矩阵以libsvm格式存储。

我想使用SVC分类器计算10倍交叉验证给出的平均准确度,C = 10.

从命令行使用libsvm:

svm-train -t 4 -v 10 -c 10 gram.libsvm

我收到了这个输出

Cross Validation Accuracy = 79.0869%

现在,我想使用sklearn库在Python中复制相同的值。我知道sklearn应该在libsvm上实现,所以我期待相同的结果。

在Python中,我有以下代码:

#gram1 is the Gram matrix of my custom kernel and y are the labels

clf = svm.SVC(C=10,kernel='precomputed')
scores = cross_validation.cross_val_score(clf, gram1, y, cv=10, scoring='accuracy')

print scores.mean()

结果是

0.788786616898

我该如何解决这个问题?

更新1.0 我继续在sklearn和libsvm之间有不同的cv准确度值。我查了两个版本之间的数据是一样的。我决定将我的数据放在网上。这是gram matrix,这是gram matrix in libsvm format,这些是labels

在libsvm上我运行了这个命令:

svm-train -t 4 -v 10 -c 10 gram.libsvm

我得到了这个输出:

Cross Validation Accuracy = 79.2553%

在Python sklearn上我运行以下代码:

from sklearn.datasets import load_svmlight_file
yl=load_target("labels.target",'file')
gram1=np.loadtxt("gram.mtx")
print gram1.mean()
x, y = load_svmlight_file("gram.libsvm")
print x.shape
print x[0,:]
x=x.todense()[:,1:]
print np.array_equal(gram1,x)

print gram1[0,:]

print np.array_equal(y, yl)

clf = svm.SVC(C=10,kernel='precomputed')

scores = cross_validation.cross_val_score(clf, gram1, y, cv=10, scoring='accuracy')
print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))
print scores.mean()

我的准确度为0.788538011696。

与其他人相比,这是一个小小的差距,有时我会在libsvm和sklearn的结果之间得到8分的差距。

我使用的是sklearn和libsvm-tools 3.12-1的0.16版本。

0 个答案:

没有答案