Scikit Learn GridSearchCV без перекрестной проверки (неконтролируемое обучение)

Можно ли использовать GridSearchCV без перекрестной проверки? Я пытаюсь оптимизировать количество кластеров в кластеризации KMeans с помощью поиска по сетке, и поэтому мне не нужна или не требуется перекрестная проверка.

Документация также смущает меня, потому что в методе fit() есть опция для обучения без учителя (говорит, что для обучения без учителя используется None). Но если вы хотите проводить обучение без контроля, вам нужно сделать это без перекрестной проверки, и, похоже, нет никакой возможности избавиться от перекрестной проверки.

Ответ 1

После долгих поисков мне удалось найти эту ветку. Похоже, что вы можете избавиться от перекрестной проверки в GridSearchCV, если вы используете:

cv=[(slice(None), slice(None))]

Я проверил это по моей собственной кодовой версии поиска по сетке без перекрестной проверки, и я получаю одинаковые результаты от обоих методов. Я отправляю этот ответ на свой вопрос на тот случай, если у других возникнет такая же проблема.

Изменение: чтобы ответить на вопрос JJRR в комментариях, вот пример использования:

from sklearn.metrics import silhouette_score as sc

def cv_silhouette_scorer(estimator, X):
    estimator.fit(X)
    cluster_labels = estimator.labels_
    num_labels = len(set(cluster_labels))
    num_samples = len(X.index)
    if num_labels == 1 or num_labels == num_samples:
        return -1
    else:
        return sc(X, cluster_labels)

cv = [(slice(None), slice(None))]
gs = GridSearchCV(estimator=sklearn.cluster.MeanShift(), param_grid=param_dict, 
                  scoring=cv_silhouette_scorer, cv=cv, n_jobs=-1)
gs.fit(df[cols_of_interest])

Ответ 2

Я собираюсь ответить на ваш вопрос, так как кажется, что он остался без ответа. Используя метод parallelism с циклом for, вы можете использовать модуль multiprocessing.

from multiprocessing.dummy import Pool
from sklearn.cluster import KMeans
import functools

kmeans = KMeans()

# define your custom function for passing into each thread
def find_cluster(n_clusters, kmeans, X):
    from sklearn.metrics import silhouette_score  # you want to import in the scorer in your function

    kmeans.set_params(n_clusters=n_clusters)  # set n_cluster
    labels = kmeans.fit_predict(X)  # fit & predict
    score = silhouette_score(X, labels)  # get the score

    return score

# Now the parallel implementation
clusters = [3, 4, 5]
pool = Pool()
results = pool.map(functools.partial(find_cluster, kmeans=kmeans, X=X), clusters)
pool.close()
pool.join()

# print the results
print(results)  # will print a list of scores that corresponds to the clusters list

Ответ 3

Я думаю, что использование cv = ShuffleSplit (test_size = 0.20, n_splits = 1) с n_splits = 1 является лучшим решением, как этот пост предложил

Ответ 4

Недавно я выпустил следующий пользовательский кросс-валидатор, основанный на этом ответе. Я передал его в GridSearchCV и он правильно отключил перекрестную проверку для меня:

import numpy as np

class DisabledCV:
    def __init__(self):
        self.n_splits = 1

    def split(self, X, y, groups=None):
        yield (np.arange(len(X)), np.arange(len(y)))

    def get_n_splits(self, X, y, groups=None):
        return self.n_splits

Я надеюсь, что это может помочь.