Scikit学习GridSearchCV而无需交叉验证(无监督学习)

Dat*_*Man 15 python optimization cluster-analysis machine-learning scikit-learn

是否可以在没有交叉验证的情况下使用GridSearchCV?我试图通过网格搜索优化KMeans集群中的集群数量,因此我不需要或不需要交叉验证.

文件还困惑我因为根据拟合()方法,它有监督学习的一个选项(说,使用无,无监督学习).但是如果你想进行无监督学习,你需要在没有交叉验证的情况下进行,并且似乎没有选择去除交叉验证.

Dat*_*Man 15

经过多次搜索,我找到了这个帖子.如果您使用以下内容,您可以在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])
Run Code Online (Sandbox Code Playgroud)

  • 我得到错误的''slice'对象是不可迭代的' (4认同)
  • 我收到错误:`AttributeError:'slice'对象没有属性'flags'。Python 3.6,sklearn 0.20.3 (3认同)

Scr*_*urr 6

我将回答你的问题,因为它似乎仍然没有得到答复.使用带有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's 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
Run Code Online (Sandbox Code Playgroud)


ihe*_*heb 6

我认为使用 cv=ShuffleSplit(test_size=0.20, n_splits=1) 和 n_splits=1 是一个更好的解决方案,就像这篇文章建议的那样


小智 5

我最近根据这个答案提出了以下自定义交叉验证器。我将它传递给它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
Run Code Online (Sandbox Code Playgroud)

我希望它能有所帮助。