2014-09-02 99 views
3

我在尝试使用scikit-learn将一些文本文档聚类在一起。我试用了DBSCAN和MeanShift,并想要确定哪些超参数(例如针对MeanShift的bandwidth和针对DBSCAN的eps)针对我正在使用的数据类型(新闻文章)的最佳工作方式。GridSearchCV如何用于聚类(MeanShift或DBSCAN)?

我有一些测试数据,其中包含预先标记的簇。我一直在尝试使用scikit-learnGridSearchCV,但不明白在这种情况下应该如何(或者是否可以)应用,因为它需要分割测试数据,但是我想对整个数据集运行评估,并且将结果与预先标记的数据进行比较。

我一直在试图指定一个计分函数,它将估计器的标签与真实标签进行比较,但它当然不起作用,因为只有数据样本被聚集,而不是全部。

这里有什么合适的方法?

回答

1

你有没有考虑自己实施搜索

实现for循环并不是特别困难。即使你想优化两个参数,它仍然很容易。

对于DBSCAN和MeanShift,我都会建议先了解您的相似性度量。基于对测量的理解而不是参数优化来匹配某些标签(其具有过度拟合的高风险)来选择参数更有意义。

换句话说,在哪个距离上有两个物品假设被聚集?

如果这个距离从一个数据点到另一个数据点变化太大,这些算法将会严重失败;你可能需要找到一个规范化的距离函数,使得实际的相似度值再次有意义。 TF-IDF是文本标准,但主要在检索上下文中。它们在集群环境中可能会更糟糕。同样要注意的是,MeanShift(类似于k-means)需要重新计算坐标 - 在文本数据上,这可能会产生不希望的结果;更新后的坐标实际上变差了,而不是更好。

+0

是的,我正在自己实施它的过程中。我只是想知道'scikit-learn'是否支持这个开箱即用的功能,并且我忽略了一些东西。 我的计划是对几个不同的预先标记的数据集进行网格搜索,并深入了解您指出的潜在问题 - 感谢您指出风险! – frnsys 2014-09-03 12:03:13

+0

'sklearn.cross_validation'有各种迭代器,可以产生数据集的分割(交叉验证,随机分割等)。这些应该使这个循环很容易编写。 – 2014-09-03 16:35:59