2014-10-03 3 views
5

Angenommen, ich habe einige Textsätze, die ich mit Kmeans gruppieren möchte.Wie konvertiere ich neue Daten in die PCA-Komponenten meiner Trainingsdaten?

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) 

Jetzt konnte ich vorhersagen, welche der Klassen einen neuen Text fallen würde,

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

jedoch sagen, dass ich PCA gelten 10.000 Funktionen 50.

from sklearn.decomposition import RandomizedPCA 

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

I zu reduzieren kann das gleiche nicht mehr tun, um den Cluster für einen neuen Text vorherzusagen, da die Ergebnisse vom Vektorisierer nicht mehr relevant sind

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

Also, wie verwandle ich meinen neuen Text in den niederdimensionalen Merkmalsraum?

Antwort

4

Sie möchten pca.transform für Ihre neuen Daten verwenden, bevor Sie sie dem Modell zuführen. Dadurch wird die Dimensionsreduzierung mit demselben PCA-Modell durchgeführt, das beim Ausführen Ihrer ursprünglichen Daten mit pca.fit_transform verwendet wurde. Sie können dann Ihr angepasstes Modell verwenden, um auf diesen reduzierten Daten vorherzusagen.

Grundsätzlich kann man sich ein großes Modell vorstellen, das aus drei kleineren Modellen besteht. Zuerst haben Sie ein CountVectorizer Modell, das bestimmt, wie Daten verarbeitet werden. Dann führen Sie ein RandomizedPCA Modell aus, das Dimensionalitätsreduktion durchführt. Und schließlich führen Sie ein KMeans Modell für Clustering. Wenn Sie die Modelle anpassen, gehen Sie den Stapel hinunter und passen Sie jeden an. Und wenn Sie eine Vorhersage machen wollen, müssen Sie auch den Stapel hinunter gehen und jeden einzelnen anwenden.

# 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

Verwenden Sie ein 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) 

(. Zeigte TruncatedSVD weil RandomizedPCA wird die Arbeit an Textfrequenz Matrizen in einer zukünftigen Version stoppen, es tatsächlich eine SVD durchgeführt wird, nicht voll PCA, sowieso)