能否在无需交叉验证的情况下使用Scikit Learn GridSearchCV(无监督学习)
0 836
1

我正在尝试通过网格搜索优化KMeans聚类中的聚类数量,因此我不需要交叉验证。但在fit()方法下,它有一个用于非监督学习的选项(例如,将None用于非监督学习)。如果想进行无监督学习,则需要在没有交叉验证的情况下进行学习,而且似乎没有摆脱交叉验证的选择。

收藏
2021-02-02 17:00 更新 正直的烤面包 •  4004
共 1 个回答
高赞 时间
0

如果使用以下方法,似乎可以摆脱GridSearchCV中的交叉验证:

cv=[(slice(None), slice(None))]

我已经对自己的编码的网格搜索(没有交叉验证)进行了测试,并且两种方法都得到了相同的结果。

在这种情况下通过scikit-learn的estimator的方式可见如下示例:

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])

收藏
2021-02-02 17:26 更新 阿托 •  17069