Подтвердить что ты не робот

Сетка поиска гиперпараметрической оценки кластеризации в scikit-learn

Я группирую образец из примерно 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)
4b9b3361

Ответ 1

Недавно я столкнулся с подобной проблемой. Я определил пользовательский итеративный cv_custom, который определяет стратегию разделения и представляет собой вход для параметра перекрестной проверки cv. Этот итеративный должен содержать одну пару для каждой складки с образцами, идентифицированными их индексами, например. ([fold1_train_ids], [fold1_test_ids]), ([fold2_train_ids], [fold2_test_ids]), ... В нашем случае нам нужна только одна пара за одну складку с индексами всех примеров в поезде, а также в тестовой части ([train_ids], [test_ids])

N = len(distance_matrix)
cv_custom = [(range(0,N), range(0,N))]
scores = cross_val_score(clf, X, y, cv=cv_custom)