約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)
_
わかりました、これは古い質問かもしれませんが、私はこの種のコードを使用します:
最初に、可能なすべてのパラメーターの組み合わせを生成します。
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!
もちろん、きれいな機能に組み合わせることができます。したがって、このソリューションはほとんどが例です。
それが誰かを助けることを願っています!
最近、同様の問題に遭遇しました。カスタム反復可能オブジェクトを定義しました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)