Python Scikit学习GridSearchCV,无交叉验证(无监督学习)

Python Scikit学习GridSearchCV,无交叉验证(无监督学习),python,optimization,machine-learning,scikit-learn,cluster-analysis,Python,Optimization,Machine Learning,Scikit Learn,Cluster Analysis,是否可以在没有交叉验证的情况下使用GridSearchCV?我试图通过网格搜索优化KMeans集群中的集群数量,因此我不需要或不希望交叉验证 这个方法也让我感到困惑,因为在fit()方法下,它有一个用于无监督学习的选项(表示在无监督学习中使用None)。但是如果你想进行无监督学习,你需要在没有交叉验证的情况下进行,而且似乎没有摆脱交叉验证的选择。我将回答你的问题,因为它似乎仍然没有得到回答。通过使用for循环的并行方法,可以使用多处理模块 from multiprocessing.dummy i

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


这个方法也让我感到困惑,因为在fit()方法下,它有一个用于无监督学习的选项(表示在无监督学习中使用None)。但是如果你想进行无监督学习,你需要在没有交叉验证的情况下进行,而且似乎没有摆脱交叉验证的选择。

我将回答你的问题,因为它似乎仍然没有得到回答。通过使用
for
循环的并行方法,可以使用
多处理
模块

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

经过多次搜索,我终于找到了。如果使用以下选项,则可以在GridSearchCV中消除交叉验证:

cv=[(切片(无),切片(无))]

我在没有交叉验证的情况下,用我自己的编码版本的网格搜索进行了测试,从两种方法中得到了相同的结果。我把这个答案贴在我自己的问题上,以防其他人也有同样的问题

编辑:为了回答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])

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

我最近基于。我将其传递给了
GridSearchCV
,它正确地为我禁用了交叉验证:

将numpy导入为np
类禁用DCV:
定义初始化(自):
self.n_splits=1
def拆分(自、X、y、组=无):
产量(n.arange(len(X)),n.arange(len(y)))
def get_n_分割(自、X、y、组=无):
返回self.n_分割

我希望它能有所帮助。

您如何确定KMeans的最佳集群数量?我现在使用的是轮廓评分,我计划稍后再使用其他评分方法。好的,在这种情况下,您应该避免使用GridSearchCV,因为顾名思义,它将使用CV。我建议将您的KMeans包装在
for
循环中,然后在每次迭代中评估轮廓度量。不确定您是否看到了这一点,但它应该对您有所帮助。:)您可以实现一个自定义cv,该cv将把所有数据放入训练和测试中。您仍然可以与
for
循环并行运行参数扫描。你可以在《谢谢你的DIY解决方案》一书中读到。我想我可能已经找到了一种不用交叉验证就能使用GridSearchCV的方法,我会很快发布我的答案。太棒了!请分享!刚刚分享,如果你有任何反馈,请告诉我。这是一个非常有趣的解决方案!隐马尔可夫模型。。。也许源代码中有什么地方变了?几个月前我就没试过了。谢谢@DataMan,好主意——我有一个更基本的问题:在这种情况下,如何传递估计值?(剪影)–谢谢,我收到错误:
AttributeError:'slice'对象没有属性“flags”
。Python 3.6,sklearn 0.20.3AttributeError:'slice'对象没有属性'flags',在测试您的解决方案时,我遇到了以下错误:“return self.n_splits AttributeError:'numpy.ndarray'对象没有属性'n_splits'。你知道怎么修吗?