如何将新数据转换为我的训练数据的PCA组件?

yay*_*ayu 7 python machine-learning pca scikit-learn

假设我有一些文本句子,我想用kmeans进行聚类.

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)
Run Code Online (Sandbox Code Playgroud)

现在我可以预测新文本会落入哪个类,

new_text = "hello world"
vec = vectorizer.transform([new_text])
print km.predict(vec)[0]
Run Code Online (Sandbox Code Playgroud)

但是,我说应用PCA将10,000个功能减少到50个.

from sklearn.decomposition import RandomizedPCA

pca = RandomizedPCA(n_components=50,whiten=True)
X2 = pca.fit_transform(X)
km.fit(X2)
Run Code Online (Sandbox Code Playgroud)

我不能再做同样的事情来预测新文本的集群,因为矢量化器的结果不再相关

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

那么如何将我的新文本转换为低维特征空间?

Rog*_*Fan 7

您希望pca.transform在将新数据提供给模型之前使用它.这将使用您pca.fit_transform在原始数据上运行时安装的相同PCA模型执行降维.然后,您可以使用拟合模型来预测此减少的数据.

基本上,将其视为适合一个大型模型,其中包括堆叠三个较小的模型.首先,您有一个CountVectorizer确定如何处理数据的模型.然后运行一个RandomizedPCA执行降维的模型.最后,您运行了一个KMeans聚类模型.当您适合模型时,您可以沿着堆栈向下移动每个模型.当你想做预测时,你也必须下去并应用每一个.

# 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)
Run Code Online (Sandbox Code Playgroud)