sklearn classifier получает значение ValueError: плохая форма ввода
У меня есть CSV, структура CAT1,CAT2,TITLE,URL,CONTENT
, CAT1, CAT2, заголовок, CONTENT на китайском языке.
Я хочу обучить 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)
Ответы
Ответ 1
Благодаря @meelo я решил эту проблему. Как он сказал: в моем коде data
- это вектор объектов, target
- это целевое значение. Я перепутал две вещи.
Я узнал, что TfidfVectorizer
обрабатывает данные в [data, feature], и все данные должны отображаться только на одну цель.
Если я хочу предсказать две цели типа, мне нужны две разные цели:
-
target_C1
со всем значением C1 -
target_C2
со всем значением C2.
Затем используйте две цели и исходные данные для обучения двух классификаторов для каждой цели.
Ответ 2
Я была такая же проблема.
Поэтому, если вы столкнулись с одной и той же проблемой, вы должны проверить форму параметров clf.fit(X,y)
:
X: Учебный вектор {массив-подобная, разреженная матрица}, форма (n_samples, n_features).
y: целевой вектор относительно X массива, формы (n_samples,).
так как вы можете видеть, что ширина y должна быть 1, чтобы убедиться, что ваш целевой вектор правильно сформирован. try command
y.shape
должен быть (n_samples,)
В моем случае для моего обучающего вектора я конкатенировал 3 отдельных вектора из 3 разных векторизаторов, чтобы использовать все в качестве моего окончательного вектора тренировки. Проблема заключалась в том, что каждый вектор имел столбец ['Label']
поэтому последний обучающий вектор содержал 3 столбца ['Label']
. Затем, когда я использовал final_trainingVect['Label']
качестве моего целевого вектора, он был n_samples, 3).
Ответ 3
import numpy as np
import pandas as pd
f = pd.read_csv('C:\\Users\\Admin\\Desktop\\Iris.csv')
target = ['Species']
train_data = ['SepalLengthCm','SepalWidthCm','PetalLengthCm','PetalWidthCm']
X = f[target]
Y = f[train_data]
for i in range(len(X['Species'])):
if(X['Species'][i] == 'Iris-setosa'):
X['Species'][i] = 1
if(X['Species'][i] == 'Iris-versicolor'):
X['Species'][i] = 2
if(X['Species'][i] == 'Iris-virginica'):
X['Species'][i] = 3
X = np.array(X)
Y = np.array(Y)
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,Y,test_size = 0.4,random_state = 0)
from sklearn import svm
model = svm.SVC(kernel='linear',C=1)
model.fit(X_train,y_train)
print(model.score(X_test,y_test))
Iam get Error Как этот "Плохой вход (90,4)" Может ли кто-нибудь дать мне решение для этого?????
*
Файл "", строка 1, в файле запуска ('C: /Users/Admin/Desktop/iris.py', wdir = 'C: /Users/Admin/Desktop')
Файл "C:\Users\Admin\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", строка 705, в файле execfile (имя файла, пространство имен)
Файл "C:\Users\Admin\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", строка 102, в execfile exec (компиляция (f.read(), имя файла, "exec") Пространство имен)
Файл "C: /Users/Admin/Desktop/iris.py", строка 22, в файле model.fit(X_train, y_train)
Файл "C:\Users\Admin\Anaconda3\lib\site-packages\sklearn\svm\base.py", строка 149, в подгонке X, y = check_X_y (X, y, dtype = np.float64, order = ' C ', accept_sparse =' csr ')
Файл "C:\Users\Admin\Anaconda3\lib\site-packages\sklearn\utils\validation.py", строка 578, в check_X_y y = column_or_1d (y, warn = True)
Файл "C:\Users\Admin\Anaconda3\lib\site-packages\sklearn\utils\validation.py", строка 614, в столбце_or_1d вызывает значение ValueError (форма "плохая входная форма {0}". Format (shape))
ValueError: плохая форма ввода (90, 4)