我最近试图在python中的一些libSVM数据集上测试一些代码,并且意识到这样做比我最初估计的要困难得多。我首先尝试实际上只是将libSVM酿造到我的Mac上,但后来发现我无法直接访问任何数据集。由于我的工作空间需要与brew安装目录相同,因此我也无法访问该库。然后,我手动下载了文件并将其格式化为.pkl文件,以进行快速加载,但是现在遇到了一个问题,即加载后的前10个数据集在提供的培训和测试数据中具有不同数量的功能。
我在这里关注文档:https://www.csie.ntu.edu.tw/~cjlin/libsvm/ 但是,它对于解决上述问题并不是很有帮助。我知道有很多关于这个确切问题的文章,但是似乎没有一个人解决访问,格式化然后训练这些数据集的简单方法。
这里是我用来加载,格式化和训练这些数据的三个函数。
# convert the .txt file to .pkl files with load_svmlight_file
fname = 'data_sets_pkl/data_set_' + str(i) + '/a' + str(i) + 'a_train'
f = '/Users/me/Desktop/project/python/data_sets_txt/data_set_' + str(i) + '/a' + str(i) + 'a.txt'
data = datasets.load_svmlight_file(f)
pickle.dump(data, open( fname + '.pkl', "wb" ) )
fname = 'data_sets_pkl/data_set_' + str(i) + '/a' + str(i) + 'a_test'
f = '/Users/me/Desktop/project/python/data_sets_txt/data_set_' + str(i) + '/a' + str(i) + 'a.t.txt'
data = datasets.load_svmlight_file(f)
pickle.dump(data, open( fname + '.pkl', "wb" ) )
# Function for loading pickled datasets
def load_sparse_data(data_dir, data_name):
# real data
data = pickle.load(open(data_dir + data_name +'.pkl', 'rb'), encoding = "latin1")
# load real dataset; it's stored as a sparse matrix so you need to cast to a np array.
A = data[0].toarray()
# check if the targets are stored as a sparse matrix
if isinstance(data[1], scipy.sparse.csr.csr_matrix):
y = data[1].toarray().ravel()
else:
y = data[1]
# for binary data only: use {-1,1} targets
y[(np.where(y == np.unique(y)[0]))[0].tolist()] = -1
y[(np.where(y == np.unique(y)[1]))[0].tolist()] = 1
return A, y
# now get the data sets as lists
X, y = load_sparse_data(data_dir, 'a1a_train')
X_test, y_test = load_sparse_data(data_dir, 'a1a_test')
我想正确地加载这些数据集并实际使用它们,但是当我加载它们时,我发现X和X测试数据集没有相同数量的特征。这可能是因为我不得不将其中一个数据集手动粘贴到文本文件(a1a.train)中,而另一个是直接下载链接(a1a.test)。同样,如果有一种更自动化的方法可以完全解释,那也将是一件很棒的事情,因为手动进行非常痛苦。鉴于这是一个被高度引用的数据集,我希望整个过程可以更加简化,例如将虹膜数据集从sklearn库中加载出来。