sklearn分类器出现ValueError错误:输入形状不正确。

15

我有一个csv文件,结构是CAT1,CAT2,TITLE,URL,CONTENT,其中CAT1、CAT2、TITLE和CONTENT均为中文。

我想使用X(TITLE)和feature(CAT1,CAT2)训练LinearSVCMultinomialNB,但两者都报错了。以下是我的代码:

PS:我通过scikit-learn文本分析教程exercise_02_sentiment.py的例子编写了下面的代码。

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)

x_train,你的代码中没有赋值。 - meelo
@meelo请刷新页面,我一开始粘贴了错误的代码。 - Mithril
1
为什么 target 有两列,应该只有一个目标值。 - meelo
1
@meelo,难道一个标题有两个特征(CAT1,CAT2)?我对sklearn还不熟悉,如果我理解错了,请指出来。 - Mithril
4
请不要在标题中加入[SOLVED],StackOverflow不是一个论坛。如果你找到了答案,你可以回答自己的问题并接受你的答案,这将标记该问题已关闭。 - Burhan Khalid
显示剩余5条评论
2个回答

9
感谢@meelo,我解决了这个问题。正如他所说:在我的代码中,data是一个特征向量,target是目标值。我混淆了两件事。
我了解到TfidfVectorizer处理数据以[data,feature]的形式,并且每个数据应该映射到一个目标。
如果我想预测两种类型的目标,我需要两个不同的目标:
  1. target_C1具有所有C1值
  2. target_C2具有所有C2值。
然后使用这两个目标和原始数据为每个目标训练两个分类器。

7

我曾经遇到过相同的问题。

所以如果你也面临着同样的问题,你应该检查 clf.fit(X,y) 参数的形状:

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)。


正如@eslam samy所说,您需要一个编码器来确保目标变量的形状为(行,)。如果使用MultinomialNB,则可以使用以下labelEncoder: 从sklearn.preprocessing导入LabelEncoder le = LabelEncoder() y_train_array = le.fit_transform(ytrain) - Nachiket

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接