votingclassifier sklearn gridsearchcv example bagging python scikit-learn cluster-analysis scoring

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)