我想对文本数据执行群集。为了找到最佳的文本预处理参数,我创建了管道并将其放在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):
#fansy 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或其他聚类算法做些什么?
答案 0 :(得分:0)
您可以创建一个自定义的K-means,使用标记的数据构建初始质心,然后让K-means发挥作用。
您可能还想尝试k-NN,即使这是另一种方法。
更重要的是,您有一个概念上的问题。您说使用集群的原因之一是因为它可能找到以前未知的主题,但是您也说要通过与已知标签进行比较来评估性能。但是,您不能真正拥有两者。