聚类是无监督机器学习方法的一部分。与监督方法相反,在无监督方法中,没有一种直接的方法可以确定在特定数据集上训练的一组模型中的“最佳”模型。
尽管如此,还是有一些定量措施。其中大多数基于“某个簇中的点之间的相似度比不同簇中的点之间的相似度有多少?”的概念。我建议你看一下 scikit-learn 文档聚类评价。看看所有不需要的技术labels_true
(即所有无监督技术)。
一旦您对某个聚类的“优点”有了定量测量,您通常会观察该量在改变聚类数量时如何演变;这种方法称为弯头法.
下面是一些代码,它使用 K-Means 算法处理从 2 到 30 的所有可能的 K 值,计算每个 K 值的各种分数,并将所有分数存储在 DataFrame 中。
seed_random = 1
fitted_kmeans = {}
labels_kmeans = {}
df_scores = []
k_values_to_try = np.arange(2, 31)
for n_clusters in k_values_to_try:
#Perform clustering.
kmeans = KMeans(n_clusters=n_clusters,
random_state=seed_random,
)
labels_clusters = kmeans.fit_predict(X)
#Insert fitted model and calculated cluster labels in dictionaries,
#for further reference.
fitted_kmeans[n_clusters] = kmeans
labels_kmeans[n_clusters] = labels_clusters
#Calculate various scores, and save them for further reference.
silhouette = silhouette_score(X, labels_clusters)
ch = calinski_harabasz_score(X, labels_clusters)
db = davies_bouldin_score(X, labels_clusters)
tmp_scores = {"n_clusters": n_clusters,
"silhouette_score": silhouette,
"calinski_harabasz_score": ch,
"davies_bouldin_score": db,
}
df_scores.append(tmp_scores)
#Create a DataFrame of clustering scores, using `n_clusters` as index, for easier plotting.
df_scores = pd.DataFrame(df_scores)
df_scores.set_index("n_clusters", inplace=True)
此代码假设所有数字特征都在 DataFrame 中X
。
所有集群性能指标都存储在df_scores
数据框。
您可以通过绘制列来轻松使用肘法df_scores
;例如,如果您想查看 Silhouette Score 的肘部图,您可以使用df_scores["silhouette_score"].plot()
.