libsvm官网提供了一些好的数据集可以用于机器学习,但这些数据集是libsvm格式的(不明白这种格式的自行百度/谷歌)。有时候我们需要用这些libsvm格式的数据集,但目前没有找到能使用的工具提供读取或转换。因此根据自己的理解写了一个简单的python程序,提供读取和转换两个功能。
文件说明
在同一目录下建立三个文件夹code,input,ouput
code |
代码文件夹,内含主程序 |
input |
输入:libsvm格式的数据集 |
output |
输出:转换成csv格式的数据集 |
功能介绍
- read_libsvm:读取libsvm格式的数据集,返回SVM(python sklearn)所需的训练参数x和y。即可以直接读取libsvm格式的数据集进行训练。
- tansfrom_libsvm:将libsvm格式的数据集转换成csv格式的数据集
Python代码
import csv
import numpy as np
from sklearn.svm import SVC
def read_libsvm(input_file, max_feature):
"""
读取libsvm格式的数据集
:param input_file: 数据集文件名
:param max_feature: 数据集最大维
:return: SVM的训练参数x,y
"""
count = 0#样本个数
y=[]
x=[]
path="../input/"
with open(path+input_file, 'r', newline='') as f:
reader = csv.reader(f, delimiter=" ")
# 每一行
for line in reader:
if(line[-1]==''):
line.pop(-1)#去掉末尾""空字符
# 获取y
y_line=line.pop(0)
y.append(int(y_line))
temp=0
temp_x=[]
# 获取x
try:
for str in line:
index = int(str.split(":")[0])
value=float(str.split(":")[1])
# 没列出的列全部为0
for j in range(temp,index):
if j<(index-1):
temp_x.append(0)
else:
temp_x.append(value)
temp=index
break
x.append(temp_x)
count += 1
except KeyError:
continue
# 补全每一行最后一维到最大维度的0值
for i in range(count):
for j in range(len(x[i]),max_feature):
x[i].append(0)
y=np.array(y)
x=np.array(x).reshape(count,max_feature)
return x,y
def transform_libsvm(inputfile,max_feature):
"""
将libsvm格式转换成csv格式,保留原数据集
:param inputfile: libsvm格式的数据集
:param max_feature: 要转换的数据集的最大维
:return: 输出csv格式的数据集
"""
path="../input/"
x,y=read_libsvm(path+inputfile,max_feature)
rows=x.shape[0]
columns=x.shape[1]
file=open("../output/"+inputfile+".csv","w+")
for r in range(rows):
r_line=""
for c in range(columns):
temp=str(x[r,c])+","
r_line+=temp
r_line+=str(y[r])
file.write(r_line+"\n")
file.close()
# if __name__ == '__main__':
# x,y=read_libsvm("a1a",123)
# transform_libsvm("a1a",123)
使用说明
- read_libsvm:
(1)参数与返回值:
(2)示例:读取123维的数据集a1a
x,y=read_libsvm(“a1a”,123)
(3)调用方式:
直接在该程序中调用read_libsvm函数或在其他程序中通过from … import … 导入该函数后再调用
- transform_libsvm:
(1)参数与返回值:
(2)示例:将a1a转换成a1a.csv
transform_libsvm(“a1a”,123)
(3)调用方式:
直接在该程序调用transform_libsvm函数或在其他程序中通过from … import … 导入该函数后再调用
ps.由于需要指定最大维,目前不支持批量转换