将训练数据转换为libsvm格式以传递给libsvm中的grid.py

4 投票
2 回答
6689 浏览
提问于 2025-04-18 09:25

我刚开始学习Python,想用libsvm这个库。我正在尝试用grid.py进行交叉验证。我从数据库获取数据,所以数据不是稀疏格式。有没有办法把它转换成grid.py所需的稀疏格式?文档里说数据集应该是这个格式:

<label> <index1>:<value1> <index2>:<value2> ...

我试着用svm_train,并通过svm_parameter生成了模型。

y,x=[location_list,data_list]
prob=svm_problem(y,x)
param=svm_parameter('-t 2') 
model=svm_train(prob,param)

我的训练数据格式是这样的:

   location_list=[8143L,8163L....]
    data_list=[[ -62L, -72L, -62L, -55L, -75L, -66L, -66L, -56L, -57L, -76L, -75L, -79L, -68L, -74L,
 -59L....],[-62L, -72L, -62L, -55L, -75L, -66L, -66L, -56L, -57L, -76L, -75L, -79L, -68L, -74L,
 -59L....],......]

我试着把prob作为数据集传给grid.py,但它提示找不到数据集,可能是因为需要把它写入文件。或者有没有办法直接把prob变量作为数据集传给grid.py?

我可以把我的训练数据格式整理成上面或下面这样的:

    [8143L, -62L, -72L, -62L, -55L, -75L, -66L, -66L, -56L, -57L, -76L, -75L, -79L, -68L, -74L,
 -59L,...]
    [8163L, -62L, -72L, -62L, -55L, -75L, -66L, -66L, -56L, -57L, -76L, -75L, -79L, -68L, -74L,
 -59L...]
    ...................

其中前面的8143和8163是标签(类别),后面的部分是特征。所以我有几个问题:

1) 我该如何把这个数据集转换成稀疏格式,并保存到文件里,以便传给grid.py?

2) 我可以把prob变量保存到文件里吗?

3) 我能直接把prob变量传给grid.py,而不需要先保存到文件里吗?

2 个回答

2

这是我用来将 sklearn 风格的 numpy 数组转换的代码(也就是说,X 是预测变量,Y 是目标变量):

with open(outpath,'w') as f:
    for j in range(X.shape[0]):
        f.write(" ".join(
                  [str(int(Y[j]))] + ["{}:{}".format(i,X[j][i]) 
                  for i in range(X.shape[1]) if X[j][i] != 0]))
6

我来回答我自己的问题。我把数据库里的数据保存到了一个csv文件中,然后使用了csv2libsvm.py这个工具把csv文件转换成libsvm格式的数据:

csv2libsvm.py <input file> <output file> [<label index = 0>] [<skip headers = 0>]

例如:

 python csv2libsvm.py mydata.csv libsvm.data 0 True

将CSV格式转换为LIBSVM格式。如果输入文件里没有标签,就把标签索引设置为-1。如果输入文件里有表头,就把跳过表头设置为1。

撰写回答