在没有交叉验证的情况下可以使用GridSearchCV吗?我试图通过网格搜索来优化KMeans集群中的集群数量,因此我不需要或不希望交叉验证。
文档也让我感到困惑,因为在fit()方法下,它有一个无监督学习的选项(比如使用None进行无监督学习)。但是,如果你想做无监督的学习,你需要在没有交叉验证的情况下去做,而且似乎没有办法摆脱交叉验证。
发布于 2017-06-21 17:10:55
经过多次搜索,我找到了这条线。如果您使用: 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])
发布于 2017-06-20 19:07:36
我要回答你的问题,因为它似乎还没有得到回答。使用并行方法和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
发布于 2018-05-30 16:48:58
我认为将cv=ShuffleSplit(test_size=0.20,n_splits=1)与n_splits=1一起使用是一个更好的解决方案,帖子建议
https://stackoverflow.com/questions/44636370
复制相似问题