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)
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:
target_C1
avec toutes les valeurs C1target_C2
avec toutes les valeurs C2.Ensuite, utilisez les deux cibles et les données d'origine pour former deux classifieurs pour chaque cible.
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).