假设我有一些文本句子,我想使用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)