1.如何衡量聚类算法的效果?
- 聚类算法的结果不是某种标签输出,并且聚类的结果是不确定的,其优劣有业务的需求或者算法需求来决定,并没有正确答案
2.簇内平方和的缺点
-
首先,它不是有界的,只知道
inertia
越小越好,是0最好。但是我们不知道,一个较小的inertia
有没有达到模型的极限,能否继续提高 -
计算容易受到特征的数目影响,数据维度很大时,
interia
的计算量会爆炸,不适合用来一次次评估模型 -
会受到超参数k的影响,随着k越大,
interia
会越来越小,但不代表模型的效果越来越好 -
使用
inertia
作为指标,会让聚类算法在一些细长簇,环形簇,或者不规则形状的聚类时,效果不佳:
3.使用轮廓系数评价聚类算法
- 轮廓系数【轮廓系数是最常用的聚类算法的评价指标】
- 一般情况下,是对没有真实标签的数据进行探索,即不知道真正答案的数据进行聚类。这种聚类,是完全依赖于评价簇内的稠密程度(
簇内差异小
)和簇间的离散程度(簇外差异大
)来评估聚类效果。 - 轮廓系数是最常用的聚类算法的评价指标
- 能够衡量样本与其自身所在的簇中的其他样本的相似度a【簇内相似度】,等于样本与同一簇中所有其他点之间的平均距离
- 能够衡量样本与其他簇中的样本的相似度b【簇间相似度】,等于样本与下一个最近的簇中的所有点之间的平均距离
- 根据聚类要求"",希望b永远大于a,并且越大越好
- 轮廓系数计算公式【取值范围是(-1,1)】
- 值越接近1表示样本与自己所在的簇中的样本很相似,并且与其它簇中的样本不相似。当样本与簇外的样本更相似时,轮廓系数为负。
- 当轮廓系数为0时,代表两个簇中的样本相似度一致,两个簇应该是一个簇。
- 一般情况下,是对没有真实标签的数据进行探索,即不知道真正答案的数据进行聚类。这种聚类,是完全依赖于评价簇内的稠密程度(
- 总结:
-
轮廓系数越接近于1越好,负数则表示聚类效果非常差
-
如果一个簇中的大多数样本具有较高的轮廓系数,则簇会有较高的总轮廓系数,则整个数据集的平均轮廓系数越高,即聚类效果最好
-
如果许多样本点具有低轮廓系数甚至负数,则聚类效果不好,聚类的超参数k可能设定的太大或太小
-
4. 轮廓系数计算代码实现
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn.metrics import silhouette_score
from sklearn.metrics import silhouette_samples
X,y=make_blobs(n_samples=500,n_features=2,centers=4,random_state=1)
n_clusters=3
cluster=KMeans(n_clusters=n_clusters,random_state=0).fit(X)
y_pred=cluster.labels_
silhouette_score(X,y_pred) #0.5882004012129721
silhouette_samples(X,y_pred)