我正在尝试使用scikit-learn
聚类一些文本文档。我正在尝试DBSCAN和MeanShift,并希望确定哪些超参数(例如:bandwidth
用于MeanShift,eps
用于DBSCAN)最适合我正在使用的数据类型(新闻文章)。
我有一些测试数据,其中包括预先标记的集群。我一直在尝试使用scikit-learn
的GridSearchCV
,但不明白如何(或是否可以)在这种情况下应用,因为它需要分割测试数据,但我想在整个数据集上运行评估,并将结果与预先标记的数据进行比较。
我一直在尝试指定一个评分函数,用于比较估计器的标签和真实标签,但当然它不起作用,因为只有一个样本的数据被聚类,而不是全部。
什么是合适的方法呢?
3条答案
按热度按时间z9ju0rcb1#
以下DBSCAN函数可能会有所帮助。我编写它是为了迭代超参数eps和min_samples,并包含了min和max集群的可选参数。由于DBSCAN是无监督的,所以我没有包括评估参数。
3bygqnnd2#
你是否考虑过**自己执行搜索?
实现for循环并不是特别困难。即使你想优化两个参数,它仍然相当容易。
不过,对于DBSCAN和MeanShift,我建议首先了解你的相似性度量。更有意义的是,基于对度量的理解来选择参数,而不是参数优化来匹配某些标签(过度拟合的风险很高)。
换句话说,两个文章 * 应该 * 聚集在一起的距离是多少?
如果这个距离从一个数据点到另一个数据点变化太大,这些算法就会严重失败;并且您可能需要找到一个归一化的距离函数,使得实际的相似性值再次有意义。TF-IDF在文本上是标准的,但主要是在 * 检索 * 上下文中。它们在集群环境中可能会更糟糕。
还要注意MeanShift(类似于k-means)需要重新计算坐标-在文本数据上,这可能会产生不希望的结果;更新后的坐标实际上变得更糟,而不是更好。
ej83mcc03#
您可以将
GridSearchCV
的cv
参数指定为“An iterable yielding(train,test)splits as arrays of indices”(引用自the doc)。特别是对于
DBSCAN
,还有一个问题--没有predict
方法。我使用this answer的解决方案。下面是示例代码。
但当然它不起作用,因为只有一个样本数据被聚类,而不是所有数据。
如果你不想在trainset上安装并在与trainset不同的测试集上进行评估(当然这与DBSCAN不起作用),上面的解决方案也可以:只需修改
cv = ...
行代码。