我正在尝试对产品进行分类,以便根据产品标题和基本价格预测其类别。
例如(产品名称、价格、类别):
['notebook sony vaio vgn-z770td dockstation', 3000.0, u'MLA54559']
以前我只在预测任务中使用产品标题,但我想包括价格,看看准确性是否提高。
我的代码的问题是我无法合并文本/数字功能,我在SO中读到了一些问题,这是我的代码摘录:
#extracting features from text
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform([e[0] for e in training_set])
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
#extracting numerical features
X_train_price = np.array([e[1] for e in training_set])
X = sparse.hstack([X_train_tfidf, X_train_price]) #this is where the problem begins
clf = svm.LinearSVC().fit(X, [e[2] for e in training_set])
我试图将数据类型与spare.hstack合并,但我得到了以下错误:
ValueError: blocks[0,:] has incompatible row dimensions
我想问题出在X_train_price(价格列表)上,但我不知道如何格式化它,使稀疏函数成功工作。
这是两个阵列的形状:
>>> X_train_tfidf.shape
(65845, 23136)
>>>X_train_price.shape
(65845,)
在我看来,这应该像堆叠数组一样简单。如果scikit learn遵循我熟悉的惯例,那么X_train_tfidf
中的每一行都是一个训练数据点,总共有65845个点。所以你只需要做一个hstack
——就像你说的那样。
但是,您需要确保尺寸是兼容的!在普通numpy
中,否则会出现以下错误:
>>> a = numpy.arange(15).reshape(5, 3)
>>> b = numpy.arange(15, 20)
>>> numpy.hstack((a, b))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/
Extras/lib/python/numpy/core/shape_base.py", line 270, in hstack
return _nx.concatenate(map(atleast_1d,tup),1)
ValueError: arrays must have same number of dimensions
重塑b
的形状以具有正确的尺寸——注意形状(5,)
的一维阵列与形状(5, 1)
的二维阵列完全不同。
>>> b
array([15, 16, 17, 18, 19])
>>> b.reshape(5, 1)
array([[15],
[16],
[17],
[18],
[19]])
>>> numpy.hstack((a, b.reshape(5, 1)))
array([[ 0, 1, 2, 15],
[ 3, 4, 5, 16],
[ 6, 7, 8, 17],
[ 9, 10, 11, 18],
[12, 13, 14, 19]])
因此,在您的情况下,您想要一个形状为(65845, 1)
而不是(65845,)
的数组。我可能遗漏了一些内容,因为您使用的是稀疏数组。尽管如此,原则应该是一样的。基于上面的代码,我不知道你使用的是什么稀疏格式,所以我只选择了一个进行测试:
>>> a = scipy.sparse.lil_matrix(numpy.arange(15).reshape(5, 3))
>>> scipy.sparse.hstack((a, b.reshape(5, 1))).toarray()
array([[ 0, 1, 2, 15],
[ 3, 4, 5, 16],
[ 6, 7, 8, 17],
[ 9, 10, 11, 18],
[12, 13, 14, 19]])