Sklearn Pipeline:如何构建 kmeans、聚类文本?

use*_*759 5 python machine-learning k-means scikit-learn scikit-learn-pipeline

我的文字如图所示:

 list1 = ["My name is xyz", "My name is pqr", "I work in abc"]
Run Code Online (Sandbox Code Playgroud)

以上将是使用 kmeans 聚类文本的训练集。

list2 = ["My name is xyz", "I work in abc"]
Run Code Online (Sandbox Code Playgroud)

以上是我的测试集。

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

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

如果我尝试预测“list2”测试集的集群:

km.predict(list2)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

ValueError: Incorrect number of features. Got 2 features, expected 5
Run Code Online (Sandbox Code Playgroud)

有人告诉我用它Pipeline来解决这个问题。所以我写了下面的代码:

pipe = Pipeline([('vect', vectorizer), ('vectorized', vectorized), ('kmeans',km )])
Run Code Online (Sandbox Code Playgroud)

但我收到错误:

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

我认为也许 的输出vectorized没有实现拟合和转换,但是在这种特殊情况下我该如何做到这一点?我是机器学习的新手。另外,如何从 kmeans 模型中获取标签?当我运行 kmeans 时,我可以使用 访问集群标签km.labels_。如何在管道中做类似的事情?

G__*_*G__ 2

你们非常接近!跳过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)
Run Code Online (Sandbox Code Playgroud)

结果:

数组([[0.70710678, 1.41421356], [0.70710678, 1.41421356]])

  • 注意:调整了几个参数,以便它可以在我当前版本的 sklearn (0.22.1) 上运行......已经有几年了:-)