2014-10-03 18 views
5

Supponiamo di avere alcune frasi di testo che voglio raggruppare usando kmea.Come posso convertire nuovi dati nei componenti PCA dei miei dati di allenamento?

sentences = [ 
    "fix grammatical or spelling errors", 
    "clarify meaning without changing it", 
    "correct minor mistakes", 
    "add related resources or links", 
    "always respect the original author" 
] 

from sklearn.feature_extraction.text import CountVectorizer 
from sklearn.cluster import KMeans 

vectorizer = CountVectorizer(min_df=1) 
X = vectorizer.fit_transform(sentences) 
num_clusters = 2 
km = KMeans(n_clusters=num_clusters, init='random', n_init=1,verbose=1) 
km.fit(X) 

Ora potevo prevedere quale delle classi un nuovo testo cadrebbe in,

new_text = "hello world" 
vec = vectorizer.transform([new_text]) 
print km.predict(vec)[0] 

Tuttavia, dicono applico PCA di ridurre di 10.000 funzioni per 50.

from sklearn.decomposition import RandomizedPCA 

pca = RandomizedPCA(n_components=50,whiten=True) 
X2 = pca.fit_transform(X) 
km.fit(X2) 

I non posso più fare la stessa cosa per predire il cluster per un nuovo testo perché i risultati del vectorizer non sono più rilevanti

new_text = "hello world" 
vec = vectorizer.transform([new_text]) ## 
print km.predict(vec)[0] 
ValueError: Incorrect number of features. Got 10000 features, expected 50 

Quindi, come posso trasformare il mio nuovo testo nello spazio di funzionalità della dimensione inferiore?

risposta

4

Si desidera utilizzare pca.transform sui nuovi dati prima di inviarli al modello. Questo eseguirà la riduzione della dimensionalità usando lo stesso modello PCA che è stato montato quando hai eseguito pca.fit_transform sui dati originali. È quindi possibile utilizzare il modello adattato per prevedere su questi dati ridotti.

Fondamentalmente, pensatelo come un modello di grandi dimensioni, che consiste nel sovrapporre tre modelli più piccoli. Innanzitutto hai un modello CountVectorizer che determina come elaborare i dati. Quindi si esegue un modello RandomizedPCA che esegue la riduzione della dimensione. E infine si esegue un modello KMeans per il clustering. Quando si adattano i modelli, si scende in pila e si adattano a ciascuno di essi. E quando vuoi fare una previsione, devi anche andare in cima allo stack e applicarne ognuno.

# Initialize models 
vectorizer = CountVectorizer(min_df=1) 
pca = RandomizedPCA(n_components=50, whiten=True) 
km = KMeans(n_clusters=2, init='random', n_init=1, verbose=1) 

# Fit models 
X = vectorizer.fit_transform(sentences) 
X2 = pca.fit_transform(X) 
km.fit(X2) 

# Predict with models 
X_new = vectorizer.transform(["hello world"]) 
X2_new = pca.transform(X_new) 
km.predict(X2_new) 
3

Utilizzare un Pipeline:

>>> from sklearn.cluster import KMeans 
>>> from sklearn.decomposition import RandomizedPCA 
>>> from sklearn.decomposition import TruncatedSVD 
>>> from sklearn.feature_extraction.text import CountVectorizer 
>>> from sklearn.pipeline import make_pipeline 
>>> sentences = [ 
...  "fix grammatical or spelling errors", 
...  "clarify meaning without changing it", 
...  "correct minor mistakes", 
...  "add related resources or links", 
...  "always respect the original author" 
... ] 
>>> vectorizer = CountVectorizer(min_df=1) 
>>> svd = TruncatedSVD(n_components=5) 
>>> km = KMeans(n_clusters=2, init='random', n_init=1) 
>>> pipe = make_pipeline(vectorizer, svd, km) 
>>> pipe.fit(sentences) 
Pipeline(steps=[('countvectorizer', CountVectorizer(analyzer=u'word', binary=False, decode_error=u'strict', 
     dtype=<type 'numpy.int64'>, encoding=u'utf-8', input=u'content', 
     lowercase=True, max_df=1.0, max_features=None, min_df=1, 
     ngram_range=(1, 1), preprocessor=None, stop_words=None,...n_init=1, 
    n_jobs=1, precompute_distances='auto', random_state=None, tol=0.0001, 
    verbose=1))]) 
>>> pipe.predict(["hello, world"]) 
array([0], dtype=int32) 

(. Mostrare TruncatedSVD perché RandomizedPCA smetterà di funzionare su matrici di frequenza testo in una prossima release, ma in realtà effettuato una SVD, non pieno PCA, comunque)

Problemi correlati