libsvm是一种机器学习中常见的数据保存格式,它有如下特征:
[label] [index1]:[value1] [index2]:[value2] … [label] [index1]:[value1] [index2]:[value2] …
label 目标值,就是说class(属于哪一类),就是你要分类的种类,通常是一些整数。
index 是有顺序的索引,通常是连续的整数。就是指特征编号,必须按照升序排列
value 就是特征值,用来train的数据,通常是一堆实数组成。
即:
目标值 第一维特征编号:第一维特征值 第二维特征编号:第二维特征值 … 目标值 第一维特征编号:第一维特征值 第二维特征编号:第二维特征值 … …… 目标值 第一维特征编号:第一维特征值 第二维特征编号:第二维特征值 …
python中使用sklearn包很容易就能读取到libsvm格式的数据
需要导入下面的包(如果没有安装sklearn的包要先自己安装):
from sklearn.datasets import load_svmlight_file
def load_data(filename):
data = load_svmlight_file(filename)
return data
data = load_data('yourpath/housing_scale.txt')
print(type(data))
#<class 'tuple'>
print(type(data[0]))
print(data[0][0])
#<class 'scipy.sparse.csr.csr_matrix'>
# (0, 0) -1.0
# (0, 1) -0.64
# (0, 2) -0.86437
# (0, 3) -1.0
# (0, 4) -0.37037
# (0, 5) 0.155011
# (0, 6) 0.283213
# (0, 7) -0.461594
# (0, 8) -1.0
# (0, 9) -0.583969
# (0, 10) -0.425532
# (0, 11) 1.0
# (0, 12) -0.82064
# 发现tuple中data[0]是csr_matrix类型
load_svmlight_file(f, n_features=None, ...) --> 返回 <class 'tuple'>
由于libsvm格式存储的数据不保证每一行的每一列都有数据(即有数据缺省),所以返回的tuple的data[0]是一个稀疏矩阵.
如果我们想要numpy库去操纵该矩阵,需要调用:
X = data[0].toarray()
#或者
X = data[0].todense()
#或者
X = data[0].A