读取libsvm格式的数据集或将其转换成csv格式

  • Post author:
  • Post category:其他


libsvm官网提供了一些好的数据集可以用于机器学习,但这些数据集是libsvm格式的(不明白这种格式的自行百度/谷歌)。有时候我们需要用这些libsvm格式的数据集,但目前没有找到能使用的工具提供读取或转换。因此根据自己的理解写了一个简单的python程序,提供读取和转换两个功能。

文件说明

在同一目录下建立三个文件夹code,input,ouput

code

代码文件夹,内含主程序

load_libsvm.py

input

输入:libsvm格式的数据集

output

输出:转换成csv格式的数据集

功能介绍

  1. read_libsvm:读取libsvm格式的数据集,返回SVM(python sklearn)所需的训练参数x和y。即可以直接读取libsvm格式的数据集进行训练。
  2. 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.由于需要指定最大维,目前不支持批量转换



版权声明:本文为qq_33187136原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。