python - gridsearchcv - sklearn
Búsqueda en grilla para la evaluación hiperparámetro de agrupamiento en scikit-learn (2)
Estoy agrupando una muestra de alrededor de 100 registros (sin etiquetar) y tratando de usar grid_search para evaluar el algoritmo de agrupación con varios hiperparámetros. Estoy anotando usando silhouette_score
que funciona bien.
Mi problema aquí es que no necesito usar el aspecto de validación cruzada de GridSearchCV
/ RandomizedSearchCV
, pero no puedo encontrar un GridSearch
/ RandomizedSearch
simple. Puedo escribir mis propios objetos, pero los objetos ParameterSampler
y ParameterGrid
son muy útiles.
Mi próximo paso será subclasificar BaseSearchCV
e implementar mi propio método _fit()
, pero pensé que valía la pena preguntar ¿hay alguna forma más sencilla de hacerlo, por ejemplo, pasando algo al parámetro 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)
Ok, esto podría ser una vieja pregunta pero uso este tipo de código:
Primero, queremos generar todas las combinaciones posibles de parámetros:
def make_generator(parameters):
if not parameters:
yield dict()
else:
key_to_iterate = list(parameters.keys())[0]
next_round_parameters = {p : parameters[p]
for p in parameters if p != key_to_iterate}
for val in parameters[key_to_iterate]:
for pars in make_generator(next_round_parameters):
temp_res = pars
temp_res[key_to_iterate] = val
yield temp_res
Luego crea un bucle fuera de esto:
# add fix parameters - here - it''s just a random one
fixed_params = {"max_iter":300 }
param_grid = {"n_clusters": range(2, 11)}
for params in make_generator(param_grid):
params.update(fixed_params)
ca = KMeans( **params )
ca.fit(_data)
labels = ca.labels_
# Estimate your clustering labels and
# make decision to save or discard it!
Por supuesto, se puede combinar en una bonita función. Así que esta solución es principalmente un ejemplo.
Espero que ayude a alguien!
Recientemente me encontré con un problema similar. cv_custom
el cv_custom
personalizado iterable que define la estrategia de división y es una entrada para el parámetro de validación cruzada cv
. Este iterable debe contener una pareja para cada pliegue con muestras identificadas por sus índices, por ejemplo ([fold1_train_ids], [fold1_test_ids]), ([fold2_train_ids], [fold2_test_ids]), ...
En nuestro caso, solo necesitamos una pareja para un pliegue con índices de todos los ejemplos en el tren y también en la parte de prueba ([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)