AttributeError: 'numpy.ndarray' objet n'a pas d'attribut "toarray'
Je suis l'extraction de caractéristiques d'un corpus de textes, et je suis en utilisant un td-fidf vectorizer et tronquée de la décomposition en valeurs singulières de scikit-learn pour y parvenir. Cependant, puisque l'algorithme que je veux essayer nécessite des matrices denses et les vectorizer retourne matrices creuses j'ai besoin de convertir ces matrices de réseaux denses. Mais, à chaque fois que j'essaie de convertir ces tableaux, j'obtiens une erreur me disant que mon tableau numpy objet n'a pas d'attribut "toarray". Ce que je fais mal?
La fonction:
def feature_extraction(train,train_test,test_set):
vectorizer = TfidfVectorizer(min_df = 3,strip_accents = "unicode",analyzer = "word",token_pattern = r'\w{1,}',ngram_range = (1,2))
print("fitting Vectorizer")
vectorizer.fit(train)
print("transforming text")
train = vectorizer.transform(train)
train_test = vectorizer.transform(train_test)
test_set = vectorizer.transform(test_set)
print("Dimensionality reduction")
svd = TruncatedSVD(n_components = 100)
svd.fit(train)
train = svd.transform(train)
train_test = svd.transform(train_test)
test_set = svd.transform(test_set)
print("convert to dense array")
train = train.toarray()
test_set = test_set.toarray()
train_test = train_test.toarray()
print(train.shape)
return train,train_test,test_set
traceback:
Traceback (most recent call last):
File "C:\Users\Anonymous\workspace\final_submission\src\linearSVM.py", line 24, in <module>
x_train,x_test,test_set = feature_extraction(x_train,x_test,test_set)
File "C:\Users\Anonymous\workspace\final_submission\src\Preprocessing.py", line 57, in feature_extraction
train = train.toarray()
AttributeError: 'numpy.ndarray' object has no attribute 'toarray'
Mise à jour:
Willy a souligné que mon hypothèse de la matrice étant éparses peut être faux. J'ai donc essayé de nourrir mes données sur mon algorithme de réduction de dimensionnalité et elle a effectivement travaillé, sans aucune conversion, cependant lorsque je l'ai exclu de réduction de dimensionnalité, qui m'a donné environ 53k fonctionnalités que j'obtiens l'erreur suivante:
Traceback (most recent call last):
File "C:\Users\Anonymous\workspace\final_submission\src\linearSVM.py", line 28, in <module>
result = bayesian_ridge(x_train,x_test,y_train,y_test,test_set)
File "C:\Users\Anonymous\workspace\final_submission\src\Algorithms.py", line 84, in bayesian_ridge
algo = algo.fit(x_train,y_train[:,i])
File "C:\Python27\lib\site-packages\sklearn\linear_model\bayes.py", line 136, in fit
dtype=np.float)
File "C:\Python27\lib\site-packages\sklearn\utils\validation.py", line 220, in check_arrays
raise TypeError('A sparse matrix was passed, but dense '
TypeError: A sparse matrix was passed, but dense data is required. Use X.toarray() to convert to a dense numpy array.
Quelqu'un peut-il m'expliquer cela?
Update2
Comme demandé, je vais vous donner tout le code impliqués. Depuis, elle est diffusée sur les différents fichiers que je vais poster dans les étapes. Pour plus de clarté, je vais laisser tout le module importations.
C'est comment je prétraiter mon code:
def regexp(data):
for row in range(len(data)):
data[row] = re.sub(r'[\W_]+'," ",data[row])
return data
def clean_the_text(data):
alist = []
data = nltk.word_tokenize(data)
for j in data:
j = j.lower()
alist.append(j.rstrip('\n'))
alist = " ".join(alist)
return alist
def loop_data(data):
for i in range(len(data)):
data[i] = clean_the_text(data[i])
return data
if __name__ == "__main__":
print("loading train")
train_text = porter_stemmer(loop_data(regexp(list(np.array(p.read_csv(os.path.join(dir,"train.csv")))[:,1]))))
print("loading test_set")
test_set = porter_stemmer(loop_data(regexp(list(np.array(p.read_csv(os.path.join(dir,"test.csv")))[:,1]))))
Après la séparation de mes train_set dans un x_train et un x_test pour cross_validation je transforme mes données à l'aide de la feature_extraction fonction ci-dessus.
x_train,x_test,test_set = feature_extraction(x_train,x_test,test_set)
Enfin je les nourris dans mon algorithme
def bayesian_ridge(x_train,x_test,y_train,y_test,test_set):
algo = linear_model.BayesianRidge()
algo = algo.fit(x_train,y_train)
pred = algo.predict(x_test)
error = pred - y_test
result.append(algo.predict(test_set))
print("Bayes_error: ",cross_val(error))
return result
train
est déjà un ndarray, votre hypothèse quant à elle de retour d'une matrice creuse est incorrect.Vous avez peut-être raison, permettez-moi de vérifier.
Il a vérifié. Allons ajouter une modification à ma question maintenant.
vous devez inclure tous le code, pas seulement aux messages.
ndarray
est dense, par définition, les matrices creuses sont représentés dans différents objets, il est donc plutôt une erreur dans votre code (que vous n'avez pas à les joindre)Ok, je vais ajouter tout le code impliqués.
OriginalL'auteur Learner | 2013-11-22
Vous devez vous connecter pour publier un commentaire.
TruncatedSVD.transform
retourne un tableau, pas une matrice creuse. En fait, dans la version actuelle de scikit-learn, seul le vectorizers retour matrices creuses.OriginalL'auteur Fred Foo