使用 python 将 CSV 文件转换为 LIBSVM 兼容的数据文件
Posted
技术标签:
【中文标题】使用 python 将 CSV 文件转换为 LIBSVM 兼容的数据文件【英文标题】:Converting CSV file to LIBSVM compatible data file using python 【发布时间】:2014-06-03 21:49:43 【问题描述】:我正在使用 libsvm 做一个项目,并且我正在准备我的数据以使用该 lib。如何将 CSV 文件转换为 LIBSVM 兼容数据?
CSV 文件: https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/datasets/data/iris.csv
在频率问题中:
如何将其他数据格式转换为 LIBSVM 格式?
这取决于您的数据格式。一种简单的方法是在 libsvm matlab/octave 接口中使用 libsvmwrite。以 UCI 机器学习存储库中的 CSV(逗号分隔值)文件为例。我们下载 SPECTF.train。标签位于第一列。以下步骤生成 libsvm 格式的文件。
matlab> SPECTF = csvread('SPECTF.train'); % read a csv file
matlab> labels = SPECTF(:, 1); % labels from the 1st column
matlab> features = SPECTF(:, 2:end);
matlab> features_sparse = sparse(features); % features must be in a sparse matrix
matlab> libsvmwrite('SPECTFlibsvm.train', labels, features_sparse);
The tranformed data are stored in SPECTFlibsvm.train.
Alternatively, you can use convert.c to convert CSV format to libsvm format.
但我不想使用 matlab,我使用 python。
我也使用JAVA 找到了这个解决方案
谁能推荐解决这个问题的方法?
【问题讨论】:
你打算使用libsvm
可执行文件吗?还是 Python 绑定?
如果libsvm
,则需要将csv
转换为libsvm
数据。如果是Python绑定,则需要将csv
加载到Python中。
我将使用 libsvm 可执行文件。我找到了这个(github.com/seamusabshere/vector_embed),我现在正在弄清楚它是否有帮助。但我想在预测变量和目标(这是列之一)之间进行拆分。这会影响吗?
似乎把第一列为目标。您需要正确修改代码。这是红宝石代码。你需要Python version
吗?
这是与 libsvm 的第一次交互,我只需要知道如何分离预测变量(许多列)和目标(一个特定列)。我会使用这个脚本 (github.com/zygmuntz/phraug/blob/master/csv2libsvm.py) 如果你能解释更多,我会很高兴。
【参考方案1】:
您可以使用csv2libsvm.py 将csv
转换为libsvm data
python csv2libsvm.py iris.csv libsvm.data 4 True
其中 4 表示 target index
,True
表示 csv
有一个标题。
终于可以得到libsvm.data
as
0 1:5.1 2:3.5 3:1.4 4:0.2
0 1:4.9 2:3.0 3:1.4 4:0.2
0 1:4.7 2:3.2 3:1.3 4:0.2
0 1:4.6 2:3.1 3:1.5 4:0.2
...
来自iris.csv
150,4,setosa,versicolor,virginica
5.1,3.5,1.4,0.2,0
4.9,3.0,1.4,0.2,0
4.7,3.2,1.3,0.2,0
4.6,3.1,1.5,0.2,0
...
【讨论】:
我一共得到了 16 个特征,我的第 16 个特征是类属性,我没有标题如何使用上述文件转换 csv2libsvm 我尝试了一个 2 列的 csv 文件,但它不起作用。我运行python3 csv2libsvm.py P0.txt P0.data 2 True
得到Traceback (most recent call last): File "csv2libsvm.py", line 71, in <module> label = line.pop(label_index) IndexError: pop index out of range
【参考方案2】:
csv2libsvm.py不适用于Python3,也不支持标签目标(字符串目标),我稍微修改了一下。现在它应该适用于 Python3 以及标签目标。 我对 Python 很陌生,所以我的代码可能不是最佳实践,但我希望能对某人有所帮助。
#!/usr/bin/env python
"""
Convert CSV file to libsvm format. Works only with numeric variables.
Put -1 as label index (argv[3]) if there are no labels in your file.
Expecting no headers. If present, headers can be skipped with argv[4] == 1.
"""
import sys
import csv
import operator
from collections import defaultdict
def construct_line(label, line, labels_dict):
new_line = []
if label.isnumeric():
if float(label) == 0.0:
label = "0"
else:
if label in labels_dict:
new_line.append(labels_dict.get(label))
else:
label_id = str(len(labels_dict))
labels_dict[label] = label_id
new_line.append(label_id)
for i, item in enumerate(line):
if item == '' or float(item) == 0.0:
continue
elif item=='NaN':
item="0.0"
new_item = "%s:%s" % (i + 1, item)
new_line.append(new_item)
new_line = " ".join(new_line)
new_line += "\n"
return new_line
# ---
input_file = sys.argv[1]
try:
output_file = sys.argv[2]
except IndexError:
output_file = input_file+".out"
try:
label_index = int( sys.argv[3] )
except IndexError:
label_index = 0
try:
skip_headers = sys.argv[4]
except IndexError:
skip_headers = 0
i = open(input_file, 'rt')
o = open(output_file, 'wb')
reader = csv.reader(i)
if skip_headers:
headers = reader.__next__()
labels_dict =
for line in reader:
if label_index == -1:
label = '1'
else:
label = line.pop(label_index)
new_line = construct_line(label, line, labels_dict)
o.write(new_line.encode('utf-8'))
【讨论】:
以上是关于使用 python 将 CSV 文件转换为 LIBSVM 兼容的数据文件的主要内容,如果未能解决你的问题,请参考以下文章