String split+numpy.array = 奇怪的行为
String split+numpy.array = weird behaviour
我正在尝试从 .txt 文件中读取二进制 classification 的数据集。
+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 是 class 是我正在使用的框架的 class。这非常适合我的需要,但如果我尝试将这个东西提供给 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,)。对于其他数据集,它按预期工作,但在这里却没有。我回到解析代码并检查了基本上所有内容的类型,就我所见,模式是一个浮点列表列表,它应该是这样的,并且在错误的解析数据集和其他数据集之间没有有意义的区别。我发现函数 "split" 虽然引入了行为。在拆分大字符串之前,我有一个形状为 (768,1) 的数组,在拆分之后,我有一个 (768,) 而不是 (768,8),尽管它仍然是一个列表列表。
好的,找到问题了。数据集中有空值破坏了我的解析。
这是 libsvm / svmlight 格式。
在 scikit-learn 中有一个 reader:sklearn.datasets.load_svmlight_file
我正在尝试从 .txt 文件中读取二进制 classification 的数据集。
+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 是 class 是我正在使用的框架的 class。这非常适合我的需要,但如果我尝试将这个东西提供给 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,)。对于其他数据集,它按预期工作,但在这里却没有。我回到解析代码并检查了基本上所有内容的类型,就我所见,模式是一个浮点列表列表,它应该是这样的,并且在错误的解析数据集和其他数据集之间没有有意义的区别。我发现函数 "split" 虽然引入了行为。在拆分大字符串之前,我有一个形状为 (768,1) 的数组,在拆分之后,我有一个 (768,) 而不是 (768,8),尽管它仍然是一个列表列表。
好的,找到问题了。数据集中有空值破坏了我的解析。
这是 libsvm / svmlight 格式。 在 scikit-learn 中有一个 reader:sklearn.datasets.load_svmlight_file