Python Scikit学习GridSearchCV,无交叉验证(无监督学习)
是否可以在没有交叉验证的情况下使用GridSearchCV?我试图通过网格搜索优化KMeans集群中的集群数量,因此我不需要或不希望交叉验证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
这个方法也让我感到困惑,因为在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'。你知道怎么修吗?