将训练数据更改为libsvm格式以将其传递给libsvm中的grid.py

2024-10-05 12:22:25 发布

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

我是python新手,我正在尝试使用libsvm。我试图在grid.py的帮助下进行交叉验证。我从数据库中获取数据,所以它不是稀疏的。是否有任何方法可以按照grid.py中的数据格式的要求将其转换为稀疏格式。文件中规定数据集应采用以下格式:

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

我尝试使用svm_训练,并借助svm_参数生成模型。

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....],......]

我尝试在grid.py中将prob作为数据集传递,但它说找不到数据集,所以可能应该将其写入文件中。或者有什么方法可以将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)我可以直接在grid.py中传递prob变量而不将其保存到文件中吗?


Tags: 文件数据方法pydataparam格式location
2条回答

我要回答我自己的问题。我将数据库中的数据保存在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格式。如果输入文件中没有标签,请指定label index=-1。如果输入文件中有标题,请指定skip headers=1。

下面是我要从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]))

相关问题 更多 >

    热门问题