2015-07-09 2 views
3

У меня есть csv, struct is CAT1,CAT2,TITLE,URL,CONTENT, CAT1, CAT2, TITLE, CONTENT находятся на китайском языке.sklearn классификатор получить ValueError: плохая форма ввода

Мне нужен поезд LinearSVC или MultinomialNB с X (TITLE) и функцией (CAT1, CAT2), оба получают эту ошибку. Ниже мой код:

PS: я пишу ниже кода через этот пример scikit-learn text_analytics

import numpy as np 
import csv 
from sklearn.feature_extraction.text import TfidfVectorizer 
from sklearn.svm import LinearSVC 
from sklearn.pipeline import Pipeline 

label_list = [] 

def label_map_target(label): 
    ''' map chinese feature name to integer ''' 
    try: 
     idx = label_list.index(label) 
    except ValueError: 
     idx = len(label_list) 
     label_list.append(label) 

    return idx 


c1_list = [] 
c2_list = [] 
title_list = [] 
with open(csv_file, 'r') as f: 
    # row_from_csv is for shorting this example 
    for row in row_from_csv(f): 
     c1_list.append(label_map_target(row[0]) 
     c2_list.append(label_map_target(row[1]) 
     title_list.append(row[2]) 

data = np.array(title_list) 
target = np.array([c1_list, c2_list]) 
print target.shape 
# (2, 4405) 
target = target.reshape(4405,2) 
print target.shape 
# (4405, 2) 

docs_train, docs_test, y_train, y_test = train_test_split(
    data, target, test_size=0.25, random_state=None) 

# vect = TfidfVectorizer(tokenizer=jieba_tokenizer, min_df=3, max_df=0.95) 
# use custom chinese tokenizer get same error 
vect = TfidfVectorizer(min_df=3, max_df=0.95) 
docs_train= vect.fit_transform(docs_train) 

clf = LinearSVC() 
clf.fit(docs_train, y_train) 

ошибка:

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-24-904eb9af02cd> in <module>() 
     1 clf = LinearSVC() 
----> 2 clf.fit(docs_train, y_train) 

C:\Python27\lib\site-packages\sklearn\svm\classes.pyc in fit(self, X, y) 
    198 
    199   X, y = check_X_y(X, y, accept_sparse='csr', 
--> 200       dtype=np.float64, order="C") 
    201   self.classes_ = np.unique(y) 
    202 

C:\Python27\lib\site-packages\sklearn\utils\validation.pyc in check_X_y(X, y, accept_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, multi_output, ensure_min_samples, ensure_min_features, y_numeric) 
    447       dtype=None) 
    448  else: 
--> 449   y = column_or_1d(y, warn=True) 
    450   _assert_all_finite(y) 
    451  if y_numeric and y.dtype.kind == 'O': 

C:\Python27\lib\site-packages\sklearn\utils\validation.pyc in column_or_1d(y, warn) 
    483   return np.ravel(y) 
    484 
--> 485  raise ValueError("bad input shape {0}".format(shape)) 
    486 
    487 

ValueError: bad input shape (3303, 2) 
+0

'x_train', вы не присвоили значение в своем коде. – meelo

+0

@meelo, пожалуйста, обновите страницу, сначала вставьте неправильный код. – Mithril

+0

Почему 'target' имеет 2 столбца, должно быть только одно целевое значение. – meelo

ответ

3

Благодаря @meelo, я решил эту probelm. Как он сказал, в моем коде data - это вектор функции, target - целевое значение. Я перепутал две вещи.

Я узнал данные процесса TfidfVectorizer для [данных, функции], и каждая информация должна отображаться только одной целью.

Если я хочу предсказать цели двух типов. Мне нужно две различные задачи:

  1. target_C1 со всем значением C1
  2. target_C2 со всеми значением C2.

Затем используйте две цели и исходные данные для обучения двух классификаторов для каждой цели.

Смежные вопросы