web-dev-qa-db-ja.com

scikit-learnでのクラスター化のハイパーパラメーター評価のためのグリッド検索

約100レコード(ラベルなし)のサンプルをクラスター化し、grid_searchを使用して、さまざまなハイパーパラメーターでクラスター化アルゴリズムを評価しようとしています。私は_silhouette_score_を使用してスコアリングしていますが、うまくいきます。

ここでの問題は、GridSearchCV/RandomizedSearchCVの相互検証の側面を使用する必要がないことですが、単純なGridSearch/RandomizedSearchが見つかりません。自分で書くこともできますが、ParameterSamplerオブジェクトとParameterGridオブジェクトは非常に便利です。

次のステップは、BaseSearchCVをサブクラス化し、独自の_fit()メソッドを実装することですが、たとえば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)
_
26
Jamie Bull

わかりました、これは古い質問かもしれませんが、私はこの種のコードを使用します:

最初に、可能なすべてのパラメーターの組み合わせを生成します。

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

次に、これからループを作成します。

# 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!

もちろん、きれいな機能に組み合わせることができます。したがって、このソリューションはほとんどが例です。

それが誰かを助けることを願っています!

2
Alexander B.

最近、同様の問題に遭遇しました。カスタム反復可能オブジェクトを定義しましたcv_customこれは分割戦略を定義し、交差検証パラメーターcvの入力です。このイテラブルには、各フォールドに1つのカップルが含まれている必要があり、サンプルはインデックスで識別されます。 ([fold1_train_ids], [fold1_test_ids]), ([fold2_train_ids], [fold2_test_ids]), ...この場合、トレイン内およびテストパーツ内のすべての例のインデックスを使用して、1つのフォールドに1つのカップルが必要です([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)
1
Jakub Macina