2016-01-05 13 views
13

Ich gruppiere ein Beispiel von etwa 100 Datensätze (unmarkiert) und versucht, Grid_search zu verwenden, um den Cluster-Algorithmus mit verschiedenen Hyperparametern auszuwerten. Ich bewerte mit silhouette_score, die gut funktioniert.Grid-Suche für Hyperparameter-Evaluierung von Clustering in scikit-learn

Mein Problem hier ist, dass ich nicht die Kreuzvalidierung Aspekt der GridSearchCV/RandomizedSearchCV zu verwenden, aber ich kann nicht ein einfaches GridSearch/RandomizedSearch finden. Ich kann meine eigenen schreiben, aber die ParameterSampler und ParameterGrid Objekte sind sehr nützlich.

Mein nächster Schritt sein wird BaseSearchCV Unterklasse und meine eigene _fit() Methode zu implementieren, aber dachte, es wert war zu fragen ist es ein einfacherer Weg, dies zu tun, zum Beispiel durch etwas zum cv Parameter übergeben?

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

Sie Kreuzvalidierung nicht tun (oder Raster-Suche) in * unüberwacht * Data Mining. Berechnen Sie einfach die 10 Läufe von k-means und verwenden Sie die besten. –

+1

Offensichtlich führen Sie keine Kreuzvalidierung durch, aber warum wird die Gitternetzsuche nicht mit einem geeigneten Bewertungsmaß wie dem Silhouettenwert verglichen? –

+0

Auch hier ist Kmeans nur ein Beispiel. Ich möchte eine Reihe verschiedener Algorithmen und deren Hyperparameter testen. –

Antwort

1

Kürzlich lief ich in ähnliches Problem. Ich definierte benutzerdefinierte iterierbare cv_custom, die Splitting-Strategie definiert und ist eine Eingabe für Kreuzvalidierung Parameter cv. Dieses iterable sollte ein Paar für jede Falte mit Proben enthalten, die durch ihre Indizes identifiziert werden, z. ([fold1_train_ids], [fold1_test_ids]), ([fold2_train_ids], [fold2_test_ids]), ... In unserem Fall müssen wir nur noch ein paar für eine Falte mit den Indizes aller Beispiele in den Zug und auch im Testteil ([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)