合并数字和文本功能以进行类别分类

时间:2014-11-11 01:37:27

标签: python machine-learning scipy scikit-learn

我正在尝试对产品进行分类,以便根据产品名称和基本价格预测产品类别。

示例(产品标题,价格,类别):

['notebook sony vaio vgn-z770td dockstation', 3000.0, u'MLA54559']

以前我只使用产品标题进行预测任务,但我想要包含价格以确定准确性是否有所改善。

我的代码的问题是我无法合并文本/数字功能,我一直在这里阅读一些问题,这是我的代码摘录:

#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])

我尝试将数据类型与sparse.hstack合并,但是我收到以下错误:

ValueError: blocks[0,:] has incompatible row dimensions

我想问题出在X_train_price(价格列表)中,但我不知道如何格式化它以使稀疏函数成功运行。

这两个阵列的形状都是:

>>> X_train_tfidf.shape
(65845, 23136)
>>>X_train_price.shape
(65845,)

1 个答案:

答案 0 :(得分:3)

在我看来,这应该像堆叠数组一样简单。如果scikit-learn遵循我熟悉的惯例,那么X_train_tfidf中的每一行都是一个训练数据点,总共有65845个点。所以你只需做一个hstack - 正如你所说的那样。

但是,您需要确保尺寸兼容!在vanilla 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,)的1-d数组完全不同来自2-d形状的数组{{ 1}}。

(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,)