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)
我将回答你的问题,因为它似乎仍然没有得到答复.使用带有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)
小智 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)
我希望它能有所帮助。