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

时间:2017-06-19 17:15:57

标签: python optimization machine-learning scikit-learn cluster-analysis

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

documentation也让我感到困惑,因为在fit()方法下,它有一个无监督学习的选项(说无人监督学习使用None)。但是如果你想进行无监督学习,你需要在没有交叉验证的情况下进行,并且似乎没有选择去除交叉验证。

4 个答案:

答案 0 :(得分:14)

经过多次搜索,我找到了this thread。如果你使用:

,似乎你可以在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])

答案 1 :(得分:6)

我会回答你的问题,因为它似乎仍未得到答复。使用带有selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: //input[@value='Advanced'] 循环的并行方法,您可以使用for模块。

multiprocessing

答案 2 :(得分:1)

我认为使用cv = ShuffleSplit(test_size = 0.20,n_splits = 1)和n_splits = 1是一个更好的解决方案,如post建议

答案 3 :(得分:0)

我最近基于this answer提出了以下自定义交叉验证器。我将其传递给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

我希望它能提供帮助。