Классификатор sklearn получает ValueError: неверная форма ввода

У меня есть csv, структура CAT1,CAT2,TITLE,URL,CONTENT, CAT1, CAT2, TITLE, CONTENT на китайском языке.

Я хочу обучить LinearSVC или MultinomialNB с X(TITLE) и feature(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)

person Mithril    schedule 09.07.2015    source источник
comment
x_train, Вы не присвоили значение в своем коде.   -  person meelo    schedule 09.07.2015
comment
@meelo, пожалуйста, обновите страницу, я сначала вставил неверный код.   -  person Mithril    schedule 09.07.2015
comment
Почему target имеет 2 столбца, должно быть только 1 целевое значение.   -  person meelo    schedule 09.07.2015
comment
@meelo, разве у одного названия нет двух функций (CAT1, CAT2)? Я новичок в sklearn, если я неправильно понимаю, укажите это.   -  person Mithril    schedule 09.07.2015
comment
В вашем коде data — вектор признаков, target — целевое значение. Я думаю, вы смешиваете две вещи   -  person meelo    schedule 09.07.2015
comment
@meelo Спасибо за совет, я понял. TfidfVectorizer обрабатывать данные в [data, feature] , и каждые данные должны сопоставляться только с одной целью (C1 или C2). Если я хочу предсказать цели двух типов, мне нужны два классификатора. Верно?   -  person Mithril    schedule 09.07.2015
comment
Если у вас есть две разные цели, вам нужно два классификатора, но обычно у нас есть только одна цель.   -  person meelo    schedule 09.07.2015
comment
Пожалуйста, не ставьте [SOLVED] в заголовке — StackOverflow — это не форум. Если вы нашли ответ, вы можете ответить на свой вопрос, а затем принять свой ответ, что помечает вопрос как закрытый.   -  person Burhan Khalid    schedule 03.08.2015
comment
@ Бурхан Халид моя проблема была решена благодаря комментарию Мило. Сегодня я думаю, что должен отметить это, поэтому я поставил [решено]. И что я должен делать?   -  person Mithril    schedule 03.08.2015
comment
Вы можете ответить на него сами; (просто напишите ответ), и вы можете обратиться к комментарию @melo и к тому, как вы его интегрировали. Затем, через некоторое время, вы сможете щелкнуть пустую галочку рядом с вашим ответом, чтобы принять его. Таким образом, другие будут знать, что вопрос решен.   -  person Burhan Khalid    schedule 03.08.2015


Ответы (2)


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

Я узнал, что TfidfVectorizer обрабатывает данные в [data, feature], и ​​каждые данные должны сопоставляться только с одной целью.

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

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

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

person Mithril    schedule 03.08.2015

Я была такая же проблема.

Поэтому, если вы столкнулись с той же проблемой, вам следует проверить форму clf.fit(X,y)parameters:

X : Обучающий вектор {массив, разреженная матрица}, форма (n_samples, n_features).

y : Целевой вектор относительно массива X, форма (n_samples,).

как вы можете видеть, ширина y должна быть равна 1, чтобы убедиться, что ваш целевой вектор имеет правильную форму, попробуйте команду

y.shape

должно быть (n_samples,)

В моем случае для моего тренировочного вектора я объединял 3 отдельных вектора из 3 разных векторизаторов, чтобы использовать все в качестве моего окончательного тренировочного вектора. Проблема заключалась в том, что в каждом векторе было ['Label'] столбца, поэтому окончательный обучающий вектор содержал 3 ['Label'] столбца. Затем, когда я использовал final_trainingVect['Label'] в качестве целевого вектора, его форма была n_samples, 3).

person eslam samy    schedule 21.05.2018
comment
Как правильно сказал @eslam samy, вам нужен кодировщик, который будет следить за тем, чтобы форма цели оценивалась как (строка). Для этого (при использовании MultinomialNB) используйте labelEncoder следующим образом: from sklearn.preprocessing import LabelEncoder le=LabelEncoder() y_train_array=le.fit_transform(ytrain) - person Nachiket; 22.06.2020