TypeError: sparse matrix longueur est ambiguë; utilisation getnnz() ou de la forme[0] lors de l'utilisation RF classificateur?

Je suis en train d'apprendre sur les forêts aléatoires dans scikit learn et à titre d'exemple, je voudrais profiter de la forêt au Hasard classificateur pour la classification de textes, avec mon propre jeu de données. Alors d'abord j'ai vectorisé le texte avec tfidf et pour la classification:

from sklearn.ensemble import RandomForestClassifier
classifier=RandomForestClassifier(n_estimators=10) 
classifier.fit(X_train, y_train)           
prediction = classifier.predict(X_test)

Quand je lance le classement j'ai obtenu ceci:

TypeError: A sparse matrix was passed, but dense data is required. Use X.toarray() to convert to a dense numpy array.

ensuite, j'ai utilisé le .toarray() pour X_train et j'ai eu la suivante:

TypeError: sparse matrix length is ambiguous; use getnnz() or shape[0]

À partir d'une précédente question ce que j'ai compris j'ai besoin afin de réduire la dimensionnalité du tableau numpy alors je fais le même:

from sklearn.decomposition.truncated_svd import TruncatedSVD        
pca = TruncatedSVD(n_components=300)                                
X_reduced_train = pca.fit_transform(X_train)               

from sklearn.ensemble import RandomForestClassifier                 
classifier=RandomForestClassifier(n_estimators=10)                  
classifier.fit(X_reduced_train, y_train)                            
prediction = classifier.predict(X_testing) 

Puis j'ai eu cette exception:

  File "/usr/local/lib/python2.7/site-packages/sklearn/ensemble/forest.py", line 419, in predict
    n_samples = len(X)
  File "/usr/local/lib/python2.7/site-packages/scipy/sparse/base.py", line 192, in __len__
    raise TypeError("sparse matrix length is ambiguous; use getnnz()"
TypeError: sparse matrix length is ambiguous; use getnnz() or shape[0]

La j'ai essayé le suivant:

prediction = classifier.predict(X_train.getnnz()) 

Et obtenu ceci:

  File "/usr/local/lib/python2.7/site-packages/sklearn/ensemble/forest.py", line 419, in predict
    n_samples = len(X)
TypeError: object of type 'int' has no len()

Deux questions ont été soulevées à partir de celui-ci: Comment puis-je utiliser les forêts Aléatoires pour classer correctement? et ce qui se passe avec X_train?.

Ensuite, j'ai essayé le suivant:

df = pd.read_csv('/path/file.csv',
header=0, sep=',', names=['id', 'text', 'label'])



X = tfidf_vect.fit_transform(df['text'].values)
y = df['label'].values



from sklearn.decomposition.truncated_svd import TruncatedSVD
pca = TruncatedSVD(n_components=2)
X = pca.fit_transform(X)

a_train, a_test, b_train, b_test = train_test_split(X, y, test_size=0.33, random_state=42)

from sklearn.ensemble import RandomForestClassifier

classifier=RandomForestClassifier(n_estimators=10)
classifier.fit(a_train, b_train)
prediction = classifier.predict(a_test)

from sklearn.metrics.metrics import precision_score, recall_score, confusion_matrix, classification_report
print '\nscore:', classifier.score(a_train, b_test)
print '\nprecision:', precision_score(b_test, prediction)
print '\nrecall:', recall_score(b_test, prediction)
print '\n confussion matrix:\n',confusion_matrix(b_test, prediction)
print '\n clasification report:\n', classification_report(b_test, prediction)
  • ajouté reproductibles code de ma réponse
  • il n'est pas nécessaire d'appeler le vectorizer sur les étiquettes de classe. X_test_r = tfidf_vect.transform(df['Label']). Ce devrait juste être un tableau des étiquettes. Vous avez aussi besoin de transmettre la classe etiquettes en tant que second paramètre à train_test_split
InformationsquelleAutor tumbleweed | 2015-02-04