我在 UTM 坐标中有一个地理数据集“坐标”,我正在对其执行 HDBSCAN,并且希望让 sklearn 的 GridSearchCV 使用 DBCV 验证各种参数。在手动评估 HDBSCAN 的参数时,我得到了以下结果,它比 sklearn 的 GridSearchCV 更好:
clusters = hdbscan.HDBSCAN(min_cluster_size=75, min_samples=60,
cluster_selection_method ='eom', gen_min_span_tree=True,
prediction_data=True).fit(coordinates)
Obtained DBCV Score: 0.2580606238793024
使用 sklearn 的 GridSearchCV 时,它会选择获得较低 DBCV 值的模型参数,即使手动选择的参数在参数字典中也是如此。顺便说一句,在使用 RandomizedSearchCV 时,我能够使用不同范围的参数获得 0.28 的 DBCV 值,但没有写下使用了哪些参数。
*更新:当我运行 RandomizedSearchCV 和 GridSearchCV 时,选择的“最佳”模型是参数网格中的第一项或第一个选择的随机样本。例如,在下面的代码中,它总是选择 min_samples & min_cluster_size 中的第一个条目。我怀疑是因为它遇到了错误。当我添加 error_score="raise" 时,它会引发 TypeError,这可能与它无法与 y 进行比较有关,但这是没有数据标签的无监督聚类。
TypeError: _BaseScorer.call() missing 1 required positional 参数:'y_true'
from sklearn.model_selection import RandomizedSearchCV
from sklearn.model_selection import GridSearchCV
import hdbscan
from sklearn.metrics import make_scorer
import logging # to further silence deprecation warnings
logging.captureWarnings(True)
# ### GridSearch CV Model Tuning ###
logging.captureWarnings(True)
hdb = hdbscan.HDBSCAN(gen_min_span_tree=True).fit(coordinates)
# # specify parameters to sample from
grid = {'min_samples': [50,55,60,65,70,75,80,90,100,110],
'min_cluster_size':[40,45,50,55,60,65,75,80,85,90,95,100],
'cluster_selection_method' : ['eom','leaf'],
'metric' : ['euclidean','manhattan']
}
#validity_scroer = "hdbscan__hdbscan___HDBSCAN__validity_index"
validity_scorer = make_scorer(hdbscan.validity.validity_index,greater_is_better=True)
grid_search = GridSearchCV(hdb
,param_grid=grid
,scoring=validity_scorer)
grid_search.fit(coordinates)
print(f"Best Parameters {grid_search.best_params_}")
print(f"DBCV score :{grid_search.best_estimator_.relative_validity_}")
Best Parameters {'cluster_selection_method': 'eom', 'metric': 'euclidean', 'min_cluster_size': 40, 'min_samples': 50} DBCV score :0.22213170637127946