2016-01-11 12 views
6

Ich versuche eine Klassifizierung mit Python. Ich benutze Naive Bayes MultinomialNB Klassifizierer für die Webseiten (Abrufen von Daten von Web zu Text, später klassifiziere ich diesen Text: Web-Klassifizierung).ist es möglich, PCA auf jede Textklassifikation anzuwenden?

Jetzt versuche ich, PCA auf diese Daten anzuwenden, aber Python gibt einige Fehler.

Mein Code für die Klassifizierung mit Naive Bayes:

from sklearn import PCA 
from sklearn import RandomizedPCA 
from sklearn.feature_extraction.text import CountVectorizer 
from sklearn.naive_bayes import MultinomialNB 
vectorizer = CountVectorizer() 
classifer = MultinomialNB(alpha=.01) 

x_train = vectorizer.fit_transform(temizdata) 
classifer.fit(x_train, y_train) 

Diese naive Bayes-Klassifizierung ergibt, dass die Ausgabe:

>>> x_train 
<43x4429 sparse matrix of type '<class 'numpy.int64'>' 
    with 6302 stored elements in Compressed Sparse Row format> 

>>> print(x_train) 
(0, 2966) 1 
(0, 1974) 1 
(0, 3296) 1 
.. 
.. 
(42, 1629) 1 
(42, 2833) 1 
(42, 876) 1 

als ich versuche, PCA auf meine Daten anzuwenden (temizdata):

>>> v_temizdata = vectorizer.fit_transform(temizdata) 
>>> pca_t = PCA.fit_transform(v_temizdata) 
>>> pca_t = PCA().fit_transform(v_temizdata) 

, aber diese Erhöhung folgenden Fehler:

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.

Ich konvertiere Matrix in dichter Matrix oder numpy Array. Dann habe ich versucht neue dichte Matrix zu klassifizieren, aber ich habe Fehler.

Mein Hauptziel ist, dass Test PCA-Effekt auf Klassifizierung auf Text.

zu dichten Array konvertieren:

v_temizdatatodense = v_temizdata.todense() 
pca_t = PCA().fit_transform(v_temizdatatodense) 

Schließlich versuchen classfy:

classifer.fit(pca_t,y_train) 

Fehler für die endgültige classfy:

raise ValueError("Input X must be non-negative") ValueError: Input X must be non-negative

Auf der einen Seite meine Daten (temizdata) in gesetzt wird Naive Bayes nur, auf der anderen Seite temizdata zuerst in PCA (für rot Inputs) als klassifizieren. __

+0

Ich sehe nicht, warum das nicht funktionieren sollte.Wie konvertierst du in ein dichtes Array und welchen Fehler bekommst du dann? – kazemakase

+0

Verwenden Sie eine alte Version von scikit-learn? Ich glaube nicht, dass 'slearn Import-PCA' in den letzten Versionen möglich ist ... – kazemakase

+0

@kazemakase Es tut mir leid, ich schreibe falsch. Ich kann in dichte oder numpige konvertieren, aber NaiveBayes nicht mit neuen dichten Matrix arbeiten. Ich habe hinzugefügt – zer03

Antwort

9

Anstatt eine sparse Matrix dense Umwandlung (die entmutigt wird), würde ich verwenden scikits erlern der TruncatedSVD, die eine PCA-ähnliche dimmensionality Reduktionsalgorithmus (unter Verwendung von Standard-Randomized SVD), die auf spärliche Daten arbeitet, ist:

svd = TruncatedSVD(n_components=5, random_state=42) 
data = svd.fit_transform(data) 

Und unter Berufung auf von der TruncatedSVD Dokumentation:

In particular, truncated SVD works on term count/tf-idf matrices as returned by the vectorizers in sklearn.feature_extraction.text. In that context, it is known as latent semantic analysis (LSA).

die genau Fall Ihre Verwendung ist.

+0

Dies scheint nützlicher als mein Vorschlag. – kazemakase

+0

Danke kommentieren. Aber nach TruncatedSVD, gab naivayes Klassifizierung gleichen Fehler: erhöhen ValueError ("Eingang X muss nicht negativ sein") ValueError: Eingang X muss nicht negativ sein – zer03

+1

@ zer03, wie der Fehler sagt, können Sie keine negativen Funktionen übergeben zu den MultinomialNB, und Dimensionalitätsreduktionsalgorithmen neigen dazu, dies zu tun (legen Sie die Daten in den [-1, 1] -Bereich). Entweder wählen Sie einen anderen Trainingsalgorithmus (anders als NB), oder Sie wenden PCA nicht an, aber Sie können beide nicht zusammen verwenden. Aus der [Dokumentation von MultinomialNB] (http://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.MultinomialNB.html): 'Die multinomiale Verteilung erfordert normalerweise Integer-Feature-Zählungen. In der Praxis können jedoch auch Bruchzahlen wie tf-idf funktionieren. " –

3

Der Klassifikator NaiveBayes benötigt diskrete Funktionen, aber die PCA bricht diese Eigenschaft der Features. Sie müssen einen anderen Klassifikator verwenden, wenn Sie PCA verwenden möchten.

Es kann andere Dimensionalitätsreduktionsmethoden geben, die mit NB funktionieren, aber ich weiß nichts darüber. Vielleicht könnte einfach feature selection funktionieren.

Randnotiz: Sie könnten versuchen, die Funktionen nach der Anwendung der PCA zu diskretisieren, aber ich denke nicht, dass dies eine gute Idee ist.

+0

Vielen Dank alle Antworten @ kazemakase. Du hast mir auch geholfen. für Randnotiz, kann diese Methode möglicherweise schlecht zu Ergebnis führen. Aber trotzdem werde ich es versuchen – zer03