String split + numpy.array =奇怪的行为

时间:2015-03-25 15:24:56

标签: python arrays numpy types scikit-learn

我正在尝试从.txt文件中读取二进制分类的数据集。

  

+1 1:-0.882353 2:-0.0653266 3:0.147541 4:-0.373737 5:-1 6:-0.0938897 7:-0.797609 8:-0.933333

这是一个示例行。

这是我用来解析文件的代码。

    reader=csv.reader(f)
    res=[row[0].split(" ")[:-1] for row in reader]
    labels=[int(r[0]) for r in res]
    patterns=[[float(p[2:]) for p in r[1:]] for r in res]
    res=[LabeledExample(p,l) for p,l in zip(patterns,labels)]

LabeledExample是一个类,是我正在使用的框架类。这完全符合我的需要,但如果我尝试将这个东西喂给scikit,我需要这样做。

 X=[ example.pattern for example in training_set]
 Y=[ example.label for example in training_set]

其中training_set是LabeledExample的列表。这通常适用于其他数据集,但这次,如果我尝试使用此数据集拟合模型,则会引发此错误:

 File "/home/chobeat/git/yaplf/yaplf/testsandbox/ensembleexperiment.py", line 29, in ensembletreeexp
    clf.fit(X,Y)
  File "/usr/local/lib/python2.7/dist-packages/sklearn/ensemble/forest.py", line 257, in fit
    check_ccontiguous=True)
  File "/usr/local/lib/python2.7/dist-packages/sklearn/utils/validation.py", line 230, in check_arrays
    array = np.ascontiguousarray(array, dtype=dtype)
  File "/usr/local/lib/python2.7/dist-packages/numpy/core/numeric.py", line 548, in ascontiguousarray
    return array(a, dtype, copy=False, order='C', ndmin=1)
ValueError: setting an array element with a sequence.

尝试调试它我去检查X数组的形状,它不是它应该是什么。

它应该是(768,8),但它是(768,)。对于其他数据集,它按预期工作,但在这里它没有。我回到解析代码并检查基本上所有的类型,并且我可以看到,模式是浮动列表的列表,因为它应该是并且在错误解析的数据集和其他数据集之间没有有意义的差异。我发现函数“拆分”虽然引入了行为。在分割大字符串之前,我有一个形状数组(768,1),在分割后,而不是(768,8)我有一个(768,),尽管事实上它仍然是一个列表列表。

2 个答案:

答案 0 :(得分:1)

这是libsvm / svmlight格式。 在scikit-learn中有一个读者:sklearn.datasets.load_svmlight_file

答案 1 :(得分:0)

好的,发现了问题。数据集中有空值会破坏我的解析。