web-dev-qa-db-ja.com

sklearn classifier get ValueError:不正な入力形状

私はcsvを持っています、構造体はCAT1,CAT2,TITLE,URL,CONTENT、CAT1、CAT2、TITLE、CONTENTは中国語です。

X(TITLE)およびfeature(CAT1、CAT2)でLinearSVCまたはMultinomialNBをトレーニングしたい、両方ともこのエラーが発生します。以下は私のコードです:

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)
14
Mithril

@meeloのおかげで、私はこの問題を解決しました。彼が言ったように、私のコードでは、dataは特徴ベクトルであり、targetはターゲット値です。私は2つのことを混ぜました。

TfidfVectorizerはデータを[data、feature]に処理し、各データは1つのターゲットのみにマッピングする必要があることを学びました。

2つのタイプのターゲットを予測する場合、2つの異なるターゲットが必要です。

  1. target_C1すべてのC1値
  2. target_C2すべてのC2値。

次に、2つのターゲットと元のデータを使用して、ターゲットごとに2つの分類器をトレーニングします。

8
Mithril

同じ問題がありました。

したがって、同じ問題に直面している場合は、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)でした。

4
eslam samy