web-dev-qa-db-fra.com

classificateur sklearn obtenir ValueError: forme d'entrée incorrecte

J'ai un csv, struct est CAT1,CAT2,TITLE,URL,CONTENT, CAT1, CAT2, TITRE, CONTENU sont en chinois.

Je veux former LinearSVC ou MultinomialNB avec X(TITLE) et feature (CAT1, CAT2), les deux l'erreur étant indiquée. ci-dessous est mon code:

PS: j'écris ci-dessous le code suivant cet exemple 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)

erreur:

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

Grâce à @meelo, j'ai résolu ce problème . Comme il le dit, dans mon code, data est un vecteur de fonctions, target est une valeur cible. J'ai confondu deux choses.

J'ai appris les données de processus TfidfVectorizer sur [data, feature], et chaque donnée doit correspondre à une seule cible.

Si je veux prédire deux types de cibles. J'ai besoin de deux cibles distinctes:

  1. target_C1 avec toutes les valeurs C1
  2. target_C2 avec toutes les valeurs C2.

Ensuite, utilisez les deux cibles et les données d'origine pour former deux classifieurs pour chaque cible. 

7
Mithril

J'ai eu le même problème.

Donc, si vous rencontrez le même problème, vous devriez vérifier la forme de clf.fit(X,y)parameters:

X: vecteur d'apprentissage {matrice, matrice éparse}, forme (n_samples, n_features).

y: vecteur cible relatif à la forme, semblable à un tableau X, (n_samples,).

comme vous pouvez le constater, la largeur y doit être 1, pour vous assurer que votre vecteur cible est correctement mis en forme, essayez la commande

y.shape

devrait être (n_ exemples)

Dans mon cas, pour mon vecteur d’entraînement, je concaténais 3 vecteurs distincts de 3 vectoriseurs différents pour tous les utiliser comme mon dernier vecteur d’entraînement .. Le problème était que chaque vecteur contenait la colonne ['Label'], le vecteur d’entraînement final contenait donc 3 ['Label'] colonnes . Ensuite, quand j’ai utilisé final_trainingVect['Label'] comme vecteur cible, sa forme était n_samples, 3).

2
eslam samy