如何将新数据转换为训练数据的PCA分量?

假设我有一些文本句子,我想使用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 CountVectorizerfrom sklearn.cluster import KMeansvectorizer = CountVectorizer(min_df=1)X = vectorizer.fit_transform(sentences)num_clusters = 2km = KMeans(n_clusters=num_clusters, init='random', n_init=1,verbose=1)km.fit(X)

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

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

然而,假设我应用PCA将10,000个特征减少到50个。

from sklearn.decomposition import RandomizedPCApca = RandomizedPCA(n_components=50,whiten=True)X2 = pca.fit_transform(X)km.fit(X2)

我不能再用同样的方法来预测新文本的聚类,因为vectorizer的结果不再相关

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

那么,我如何将新文本转换到低维特征空间中呢?


回答:

你需要在将新数据输入模型之前,对其使用pca.transform。这将使用你在原始数据上运行pca.fit_transform时拟合的相同PCA模型进行降维。然后,你可以使用你拟合的模型对这些降维后的数据进行预测。

基本上,可以将其视为拟合一个大型模型,该模型由堆叠三个较小的模型组成。首先,你有一个CountVectorizer模型来确定如何处理数据。然后,你运行一个RandomizedPCA模型来进行降维。最后,你运行一个KMeans模型进行聚类。当你拟合模型时,你会沿着堆栈向下拟合每一个模型。而当你想要进行预测时,你也必须沿着堆栈向下应用每一个模型。

# 初始化模型vectorizer = CountVectorizer(min_df=1)pca = RandomizedPCA(n_components=50, whiten=True)km = KMeans(n_clusters=2, init='random', n_init=1, verbose=1)# 拟合模型X = vectorizer.fit_transform(sentences)X2 = pca.fit_transform(X)km.fit(X2)# 使用模型进行预测X_new = vectorizer.transform(["hello world"])X2_new = pca.transform(X_new)km.predict(X2_new)

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注