我有一个预先计算的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版本。