2014-11-11 1 views
2

Я пытаюсь классифицировать товарные позиции, чтобы предсказать их категорию в зависимости от названия продукта и его базовой цены.Объединить числовые и текстовые функции для классификации категорий

Пример (название продукта, цена, категория):

['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]) 

Я пытаюсь объединить типов данных с sparse.hstack, но я получаю следующее сообщение об ошибке:

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

Я думаю, что проблема лежит в X_train_price (список цен), но я не знаю, как отформатировать его для разреженной функции успешно Работа.

Эти формы обоих массивов:

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

взглянуть на мой ответ здесь для связанного с этим вопроса http://stackoverflow.com/ вопросы/26712080/питон-решение-дерево-классификация-оф-комплексообразователей объектов –

ответ

3

Он смотрит на меня, как это должно быть так просто, как складывать массивы. Если 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 

Reshape b иметь правильные размеры - отметив, что 1-d массив формы (5,) является полностью отличается от 2-й массива формы (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]]) 
Смежные вопросы