使用 GridSearchCV scikit-learn 在管道中的 KMeans

Posted

技术标签:

【中文标题】使用 GridSearchCV scikit-learn 在管道中的 KMeans【英文标题】:KMeans in pipeline with GridSearchCV scikit-learn 【发布时间】:2018-09-04 09:53:24 【问题描述】:

我想对我的文本数据进行聚类。为了找到最佳的文本预处理参数,我制作了管道并将其放入 GridSearchCV:

text_clf = Pipeline([('vect1', CountVectorizer(analyzer = "word"),
                   ('myfun', MyLemmanization(lemmatize=True,
                                           leave_other_words = True)),
                   ('vect2', CountVectorizer(analyzer = "word",
                                          max_df=0.95, min_df=2,
                                          max_features=2000)),
                   ('tfidf', TfidfTransformer()),
                   ('clust',   KMeans(n_clusters=10, init='k-means++',
                                      max_iter=100, n_init=1, verbose=1))])
parameters = 'myfun__lemmatize': (True, False),
              'myfun__leave_other_words': (True, False)
gs_clf = GridSearchCV(text_clf, parameters, n_jobs=1, scoring=score)
gs_clf = gs_clf.fit(text_data)

在哪里score

score = make_scorer(my_f1, greater_is_better=True)

my_f1 的形式为:

def my_f1(labels_true, labels_pred):
    # fancy stuff goes here

并且是 specially 为集群设计的

所以我的问题是:如何做到这一点?如何通过labels_pred,当作为一个kmeans自然我只能这样做

gs_clf.fit(data)

在分类时有可能:

gs_clf.fit(data, labels_true)

我知道我可以编写自定义函数,就像我对 MyLemmanization 所做的那样:

class MyLemmanization(BaseEstimator, TransformerMixin):

    def __init__(self,  lemmatize=True, leave_other_words=True):
        #some code here
    
    def do_something_to(self, X):
        # some code here
        return articles

    def transform(self, X, y=None):
        return self.do_something_to(X)  # where the actual feature extraction happens

    def fit(self, X, y=None):
        return self  # generally does nothing

但是如何以及必须对 KMeans 或其他聚类算法做些什么呢?

【问题讨论】:

KMeans 不是分类器。它是无监督的,所以你不能只对它使用有监督的逻辑。您正在尝试解决一个不存在的问题:不使用 KMeans 发布现有标签。如果您有标签,请使用监督分类器。 是的,我知道我这里是用聚类方法做分类的。原因是,我对预处理参数进行了研究。我使用聚类,因为与分类不同,它更灵活,可以找到以前未知的主题。而查看哪个参数更好的唯一方法是通过已知标签进行评估。正如我在问题中提到的,为此专门修改了 f1 分数。 你有没有解决过这个@Lukas? 【参考方案1】:

您可以创建自定义 K-means,在其中使用标记数据构建初始质心,然后让 K-means 发挥作用。

您可能还想尝试k-NN,即使它是另一种方法。

更重要的是,您有一个概念问题。您说使用聚类的原因之一是因为它可能会找到以前未知的主题,但您还说您希望通过与已知标签进行比较来评估性能。不过,你不能两者兼得……

【讨论】:

以上是关于使用 GridSearchCV scikit-learn 在管道中的 KMeans的主要内容,如果未能解决你的问题,请参考以下文章

使用 GridSearchCV 时发生值错误

使用 gridSearchCV 调整隔离林参数

使用 GridSearchCV 进行超参数调整

将 OneClassSVM 与 GridSearchCV 结合使用

Gridsearchcv:内部逻辑

使用管道和 GridSearchCV 的多维降维技术