Sklearn Pipeline: 如何为kmeans构建文本聚类管道?

我有如下所示的文本:

 list1 = ["My name is xyz", "My name is pqr", "I work in abc"]

以上将作为使用kmeans进行文本聚类的训练集。

list2 = ["My name is xyz", "I work in abc"]

以上是我的测试集。

我已经构建了一个向量化器和模型,如下所示:

vectorizer = TfidfVectorizer(min_df = 0, max_df=0.5, stop_words = "english", charset_error = "ignore", ngram_range = (1,3))vectorized = vectorizer.fit_transform(list1)km=KMeans(n_clusters=2, init='k-means++', n_init=10, max_iter=1000, tol=0.0001, precompute_distances=True, verbose=0, random_state=None, copy_x=True, n_jobs=1)km.fit(vectorized)

如果我尝试预测我的测试集”list2″的聚类结果:

km.predict(list2)

我会得到以下错误:

ValueError: Incorrect number of features. Got 2 features, expected 5

我被告知使用Pipeline来解决这个问题。所以我编写了以下代码:

pipe = Pipeline([('vect', vectorizer), ('vectorized', vectorized), ('kmeans',km )])

但我得到了以下错误:

TypeError                                 Traceback (most recent call last)/mnt/folder/Text_Mining/<ipython-input-14-321cabc3bf35> in <module>()----> 1 pipe = Pipeline([('vect', vectorizer), ('vectorized', vectorized), ('kmeans',km )])/usr/local/lib/python2.7/dist-packages/scikit_learn-0.13-py2.7-linux-x86_64.egg/sklearn/pipeline.pyc in __init__(self, steps)     87                 raise TypeError("All intermediate steps a the chain should "     88                                 "be transforms and implement fit and transform"---> 89                                 "'%s' (type %s) doesn't)" % (t, type(t)))     90     91         if not hasattr(estimator, "fit"):TypeError: All intermediate steps a the chain should be transforms and implement fit and transform'  (0, 2)     1.0(1, 4)        0.57735026919(1, 3)        0.57735026919(1, 1)        0.57735026919(2, 0)        1.0' (type <class 'scipy.sparse.csr.csr_matrix'>) doesn't)

我认为可能是vectorized的输出没有实现fit和transform方法,但在这种特定情况下我该如何做呢?我是机器学习的新手。另外,如何从kmeans模型中获取标签?当我运行kmeans时,我可以通过使用km.labels_来访问聚类标签。如何在Pipeline中做类似的事情?


回答:

你已经非常接近了!跳过中间的显式vectorizer.fit()步骤,在管道中完成所有操作:

list1 = ["My name is xyz", "My name is pqr", "I work in abc"]list2 = ["My name is xyz", "I work in abc"]vectorizer = TfidfVectorizer(min_df = 0, max_df=0.5, stop_words = "english", ngram_range = (1,3))km = KMeans(n_clusters=2, init='k-means++', n_init=10, max_iter=1000, tol=0.0001, precompute_distances=True, verbose=0, random_state=None, copy_x=True, n_jobs=1)pipe = Pipeline([('vect', vectorizer), ('kmeans', km)])pipe.fit(list1)pipe.transform(list2)

结果:

array([[0.70710678, 1.41421356],[0.70710678, 1.41421356]])

  • 注意:为了在我的当前版本的sklearn(0.22.1)上运行,我调整了一些参数…已经过去几年了 🙂

Related Posts

L1-L2正则化的不同系数

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

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

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

f1_score metric in lightgbm

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

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

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

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

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

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

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

发表回复

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