2016-01-05 11 views
13

Sto raggruppando un campione di circa 100 record (senza etichetta) e provando a utilizzare grid_search per valutare l'algoritmo di clustering con vari hyperparameters. Sto segnando usando silhouette_score che funziona bene.Ricerca griglia per la valutazione dell'iperparametro del clustering in scikit-learn

Il mio problema è che non ho bisogno di usare l'aspetto convalida incrociata del GridSearchCV/RandomizedSearchCV, ma non riesco a trovare una semplice GridSearch/RandomizedSearch. Posso scrivere i miei ma gli oggetti ParameterSampler e ParameterGrid sono molto utili.

Il mio prossimo passo sarà quello di sottoclasse BaseSearchCV e implementare il mio metodo _fit(), ma pensato che fosse la pena chiedere c'è un modo più semplice per fare questo, per esempio passando qualcosa al parametro 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) 
+0

Non fai convalida incrociata (o grid-ricerca) in * data mining senza supervisione *. Calcola le 10 sequenze di k-medie e usa il meglio. –

+1

Ovviamente non si esegue la convalida incrociata, ma perché non eseguire la ricerca della griglia con una metrica di punteggio appropriata come il punteggio della sagoma? –

+0

Inoltre, kmeans è solo un esempio qui. Mi piacerebbe testare un numero di algoritmi diversi e i loro iperparametri. –

risposta

1

Recentemente mi sono imbattuto in un problema simile. Ho definito l'iterabile personalizzato cv_custom che definisce la strategia di divisione ed è un input per il parametro di convalida incrociata cv. Questo iterabile dovrebbe contenere una coppia per ogni piega con campioni identificati dai loro indici, ad es. ([fold1_train_ids], [fold1_test_ids]), ([fold2_train_ids], [fold2_test_ids]), ... Nel nostro caso, abbiamo bisogno di una sola coppia per un solo ovile con gli indici di tutti gli esempi in treno e anche nella parte di prova ([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) 
Problemi correlati