sklearn classificateur obtenir ValueError: la mauvaise qualité des entrées de la forme
J'ai un fichier csv, struct est
CAT1,CAT2,TITLE,URL,CONTENT
, CAT1, CAT2, le TITRE ,le CONTENU sont en chinois.
Je veux former LinearSVC
ou MultinomialNB
avec X(TITRE) et la fonction(CAT1,CAT2), à la fois que vous obtenez cette erreur. ci-dessous mon code:
PS: j'écris ci-dessous le code à travers 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)
x_train
, Vous n'avez pas d'attribuer de la valeur dans votre code.veuillez rafraîchir la page, je collez code incorrect au premier abord.
Pourquoi
target
a 2 colonnes, il devrait être de 1 la valeur de la cible.n'est-il pas un titre a deux caractéristiques(CAT1,CAT2) ? Je suis nouveau sur sklearn, Si j'ai mal compris, merci de le signaler.
Merci de ne pas mettre
[SOLVED]
dans le titre - StackOverflow n'est pas un forum. Si vous avez trouvé une réponse, vous pouvez répondre à votre propre question et puis accepter votre réponse - qui marque la question comme close.OriginalL'auteur Mithril | 2015-07-09
Vous devez vous connecter pour publier un commentaire.
Grâce à @meelo, j'ai résolu ce problème.
Comme il dit, dans mon code,
data
est fonction de vecteur,target
est la valeur de la cible. Je mélange deux choses.J'ai appris TfidfVectorizer des données de processus à [données, fonction] , et chaque base de données doit correspondre à une seule cible.
Si je veux prévoir deux types de cibles. J'ai besoin de deux cibles distinctes:
target_C1
avec toutes C1 valeurtarget_C2
avec toutes C2 valeur.Ensuite, utilisez les deux cibles et les données d'origine pour former deux classificateur pour chaque cible.
OriginalL'auteur Mithril
J'ai eu le même problème.
Donc, si vous êtes confrontés au même problème que vous devriez vérifier la forme de la
clf.fit(X,y)
paramètres:X : la Formation vecteur {array, sparse matrix}, la forme (n_samples, n_features).
y : vecteur Cible par rapport à X semblable au tableau, la forme (n_samples,).
comme vous pouvez le voir, la y la largeur doit être de 1, assurez-vous que votre cible vecteur est en forme correctement, essayez de commande
devrait être (n_samples,)
Dans mon cas, pour ma formation, vecteur, j'ai été la concaténation de 3 vecteurs distincts de 3 différents vectorizers à utiliser toutes mes finale de la formation de vecteur.
Le problème est que chaque vecteur a la
['Label']
colonne en sorte que le final de la formation de vecteur de contenus 3['Label']
colonnes.Puis, quand j'ai utilisé
final_trainingVect['Label']
que ma Cible vecteur de la forme a été n_samples,3).OriginalL'auteur eslam samy