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

4

我是新手,正在学习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个回答

6

我将回答自己的问题。我将数据库中的数据保存在csv文件中,并使用csv2libsvm.py将csv转换为libsvm数据:

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

eg:

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

将CSV格式转换为LIBSVM格式。如果输入文件中没有标签,请指定标签索引= -1。如果输入文件中存在表头,请指定跳过表头= 1。


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]))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接