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
Vous devez vous connecter pour publier un commentaire.
C'est un peu difficile de savoir si vous êtes de passage à la même structure de données (type et de la forme) à la
fit
méthode etpredict
méthode du classificateur. Forêts aléatoires va prendre un certain temps pour fonctionner avec un grand nombre de fonctions, d'où la suggestion de réduire la dimensionnalité dans le post que vous liez.Vous devez appliquer la SVD à la fois de la formation et des données de test de sorte que le classificateur à une formation sur la même forme d'entrée que les données que vous souhaitez à prédire. Vérifier l'entrée de l'ajustement, et l'entrée de l'prédire méthode ont le même nombre de fonctionnalités, et sont à la fois des tableaux plutôt que des matrices creuses.
mis à jour avec exemple:
mis à jour pour utiliser dataframe
Note la SVD qui se passe avant la scission dans la formation et les ensembles de test, de sorte que le tableau passé à la prédicteur a la même
n
comme le tableau de lafit
méthode est appelée sur.X=df['string_coloumn'].values
et de la transmettre à la vectorizerJe ne sais pas beaucoup sur
sklearn
, même si j'ai vaguement rappeler quelques antérieur déclenchée par un commutateur à l'aide de éparses matricies. En interne, certaines des matrices a dû remplacé parm.toarray()
oum.todense()
.Mais pour vous donner une idée de ce que le message d'erreur était sur, considérez
len()
est généralement utilisé en Python pour compter le nombre de 1er niveau des termes d'une liste. Lorsqu'il est appliqué à un tableau 2d, c'est le nombre de lignes. MaisA.shape[0]
est une meilleure façon de compter les lignes. EtM.shape[0]
est le même. Dans ce cas, vous ne sont pas intéressés dans.getnnz
, qui est le nombre de non-nulle termes d'une matrice creuse.A
ne dispose pas de cette méthode, même si elle peut être dérivée à partir deA.nonzero()
.