如何将新数据转换为训练数据的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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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