【发布时间】:2016-04-09 05:45:02
【问题描述】:
我正在对大约 100 条记录(未标记)的样本进行聚类,并尝试使用 grid_search 来评估具有各种超参数的聚类算法。我正在使用 silhouette_score 进行评分,效果很好。
我这里的问题是我不需要使用GridSearchCV/RandomizedSearchCV的交叉验证方面,但是我找不到简单的GridSearch/RandomizedSearch。我可以自己编写,但 ParameterSampler 和 ParameterGrid 对象非常有用。
我的下一步是继承BaseSearchCV 并实现我自己的_fit() 方法,但我认为有必要问一下是否有更简单的方法可以做到这一点,例如通过传递一些东西给cv 参数?
def silhouette_score(estimator, X):
clusters = estimator.fit_predict(X)
score = metrics.silhouette_score(distance_matrix, clusters, metric='precomputed')
return score
ca = KMeans()
param_grid = {"n_clusters": range(2, 11)}
# run randomized search
search = GridSearchCV(
ca,
param_distributions=param_dist,
n_iter=n_iter_search,
scoring=silhouette_score,
cv= # can I pass something here to only use a single fold?
)
search.fit(distance_matrix)
【问题讨论】:
-
您不会在 无监督 数据挖掘中进行交叉验证(或网格搜索)。只需计算 10 次 k-means 运行,然后使用最好的。
-
显然你不做交叉验证,但为什么不做网格搜索给定适当的评分指标,如轮廓分数?
-
另外,kmeans 在这里只是一个例子。我想测试一些不同的算法及其超参数。
-
你还不如直接优化轮廓。不要指望聚类结果会以这种方式真正改善。最后,您只需看看哪些参数与 Silhouette 最吻合。这只是 SSE 之外的另一个标准。
-
啊,我明白了。不过,我可能想在评分方法中添加额外的东西(簇的首选大小、簇大小的相似性等),所以我真的在寻找一种类似于网格搜索的方法。不过感谢您的建议。
标签: python scikit-learn cluster-analysis scoring