Je regroupe un échantillon d'environ 100 enregistrements (non étiqueté) et j'essaie d'utiliser grid_search pour évaluer l'algorithme de regroupement avec divers hyperparamètres. Je marque en utilisant silhouette_score
qui fonctionne bien.
Mon problème ici est que je n'ai pas besoin d'utiliser l'aspect de validation croisée de GridSearchCV
name __/RandomizedSearchCV
name__, mais je ne trouve pas un simple GridSearch
name __/RandomizedSearch
name__. Je peux écrire le mien, mais les objets ParameterSampler
et ParameterGrid
sont très utiles.
Ma prochaine étape consistera à sous-classer BaseSearchCV
et à implémenter ma propre méthode _fit()
, mais je pensais qu'il valait la peine de demander s'il existe un moyen plus simple de le faire, par exemple, en passant quelque chose au paramètre cv
name__.
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)
Récemment, j'ai rencontré un problème similaire. J'ai défini le cv_custom
personnalisable personnalisé, qui définit la stratégie de fractionnement et constitue une entrée pour le paramètre de validation croisée cv
. Cet itérable doit contenir un couple pour chaque pli avec des échantillons identifiés par leurs indices, par ex. ([fold1_train_ids], [fold1_test_ids]), ([fold2_train_ids], [fold2_test_ids]), ...
Dans notre cas, nous avons besoin d'un seul couple pour un pli avec des index de tous les exemples dans le train et également dans la partie test ([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)