2016-01-11 24 views
6

Sto provando una classificazione con python. Sto usando il classificatore MultinomialNB di Naive Bayes per le pagine web (Recupero del modulo di dati web in testo, classificherò successivamente questo testo: classificazione web).è possibile applicare PCA su qualsiasi classificazione di testo?

Ora, sto cercando di applicare PCA su questi dati, ma Python sta dando alcuni errori.

Il mio codice per la classificazione con la 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) 

Questo Bayes classificazione ingenuo dà quella uscita:

>>> 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 

Che cerco di applicare PCA sui miei dati (temizdata):

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

ma questo aumento dopo gli errori:

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.

Converto matrice in matrice densematrix o numpy. Poi ho provato a classificare il nuovo densematrix, ma ho un errore.

Il mio obiettivo principale è quello di test dell'effetto PCA sulla classificazione del testo.

Converti fitta:

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

Infine provare classfy:

classifer.fit(pca_t,y_train) 

di errore per classfy finale:

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

Da una parte i miei dati (temizdata) è messo in Solo Naive Bayes, dall'altra parte temizdata messo in primo luogo in PCA (per rosso uce input) che classificare. __

+0

Non vedo perché questo non dovrebbe funzionare.Come si converte in un array denso e quale errore ottieni allora? – kazemakase

+0

Stai usando una vecchia versione di scikit-learn? Non penso che 'da sklearn import PCA' sia possibile nelle ultime versioni ... – kazemakase

+0

@kazemakase Mi dispiace di aver sbagliato. Posso convertire in dense o numpy ma NaiveBayes non funziona con la nuova matrice densa. Ho aggiunto – zer03

risposta

9

Anziché convertire una matrice sparse-dense (che è sconsigliato), userei scikits-imparare di TruncatedSVD, che è un algoritmo di riduzione dimmensionality PCA-simile (utilizzando di default randomizzato SVD), che lavora su dati sparsi:

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

E, citando dalla documentazione TruncatedSVD:

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).

che è esattamente il vostro caso d'uso.

+0

Questo sembra più utile del mio suggerimento. – kazemakase

+0

Grazie commento. Ma dopo TruncatedSVD, la classificazione naivebayes ha dato lo stesso errore: raise ValueError ("Input X deve essere non-negativo") ValueError: Input X deve essere non negativo – zer03

+1

@ zer03 come l'errore ti dice, non puoi passare a caratteristiche negative al MultinomialNB e gli algoritmi di riduzione della dimensionalità tendono a farlo (inserire i dati nell'intervallo [-1, 1]). Quindi, o scegli un altro algoritmo di allenamento (diverso da NB), oppure non applichi PCA, ma non puoi usarli entrambi insieme. Dalla [documentazione di MultinomialNB] (http://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.MultinomialNB.html): 'La distribuzione multinomiale normalmente richiede conteggi di caratteristiche integer. Tuttavia, in pratica, anche i conteggi frazionari come tf-idf possono funzionare. –

3

Il classificatore NaiveBayes richiede funzionalità a valori discreti, ma la PCA interrompe questa proprietà delle funzionalità. Dovrai usare un classificatore differente se vuoi usare PCA.

Possono esserci altri metodi di riduzione della dimensionalità che funzionano con NB, ma non li conosco. Forse semplice feature selection potrebbe funzionare.

nota a margine: è possibile provare a discretizzare le funzionalità dopo aver applicato il PCA, ma non penso che questa sia una buona idea.

+0

Grazie mille a tutte le risposte @kazemakase. Mi hai aiutato anche tu. per nota a margine, questo metodo può avere un effetto negativo. Ma, anche così ci proverò – zer03