使用 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的主要内容,如果未能解决你的问题,请参考以下文章