LIBSVM的python绑定和预计算内核交叉验证

2024-04-27 20:24:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用libsvm,通过它与预计算的gram矩阵(numpy数组)的Python绑定。我用10倍交叉验证来计算精度。由于某些原因,计算的精确度与文献中的不符。在

注意:这不是C参数的问题。此外,我不使用sklearn是因为以下问题[1]。在

有什么想法吗?在

import numpy as np
from sklearn import cross_validation

from svmutil import *

def compute_accuracy(gram_matrix, data, k=10):

kv = cross_validation.KFold(len(gram_matrix), n_folds=k, shuffle=True)
s = 0.0

for train_index, test_index in kv:

    gm_train = gram_matrix[train_index, :]
    gm_train = gm_train[:, train_index]
    data_train = data[train_index]

    gm_test = gram_matrix[test_index, :]
    gm_test = gm_test[:, test_index]
    data_test = data[test_index]

    # Have to use libsvm directly here, because of a bug in sklearn with precomputed gram matrices
    x = []
    for i in range(len(gm_train)):
        l = gm_train[i].tolist()
        l.insert(0, i + 1)
        x.append(l)

    prob = svm_problem(data_train.tolist(), x, isKernel=True)
    param = svm_parameter('-t 4 -c 10 -q')
    m = svm_train(prob, param)

    xx = []
    for i in range(len(gm_test)):
        t = gm_test[i].tolist()
        t.insert(0, i + 1)
        xx.append(t)

    p_label, p_acc, p_val = svm_predict(data_test.tolist(), xx, m)

    ACC, MSE, SCC = evaluations(p_label, data_test.tolist())
    print ACC
    s += ACC

return s / k

[1]Nested cross-validation in grid search for precomputed kernels in scikit-learn


Tags: intestimportfordataindextrainsklearn