将训练数据转换为libsvm格式以传递给libsvm中的grid.py
我刚开始学习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。