聚类问题的 5 种评估手段,总有一种你不知道的!附代码实现

聚类问题的 5 种评估手段,总有一种你不知道的!附代码实现_第1张图片关注+星标,听说他有点东西聚类问题的 5 种评估手段,总有一种你不知道的!附代码实现_第2张图片

全文共 2142 ,阅读全文需 11 分钟

大家好,我是小一f0ca1467e2cee59c5cf5a1ba6ab47b69.png

模型评估前面已经介绍了两种,分别对应分类问题:分类问题的 8 种评估方法 和回归问题:回归问题的3个评估深坑。

今天介绍最后一种:聚类模型。“人以类聚,物以群分”,想必大家对于聚类模型都不陌生吧。

举个简单的例子:在中国的乡村有这样一个现象,一个村子的姓氏大多相同,不同村子有不同的姓氏。

那如果现在把王家村、李家村、赵家村的所有人都聚集在一起,前提是不知道他们是哪个村子的,如何对他们进行分类?

  • 特性①:姓名,通过姓氏进行聚类,最终成三类:王+李+赵+其它

  • 特性②:性别,通过性别进行聚类,最终成两类:男+女

  • 特性③:年龄,通过年龄进行聚类,最终成三类:儿童+青年+老年

  • 特性④:价值,通过价值进行聚类,最终成三类:高收入+中收入+低收入

  • 特性⑤:属性,通过属性进行聚类,最终成三类:村领导+村干部+村民

  • ......

上面的姓氏、性别、年龄、价值和属性等都是村民的内在性质(人物特征),这样的内在性质有很多,也就决定了聚类的标准并不唯一。

在聚类算法中,有这样一个经常问的问题:

问:如何衡量聚类算法的效果?

答:聚类模型的标准不是某种标签输出,根据特征选取的不同聚类的结果也会发生变化,并没有一个永远标准的的答案。


有样本聚类标签的评估

上面我们提到,无法评估聚类效果是因为没有可供参考的真实结果,那如果有呢?

如果有的话,其实完全可以当作分类问题去看待,因为你有样本数据,有样本标签,更适合做分类36dba65846e121a0dd0ab86d24fc8080.png

如果我偏要用这个数据做聚类呢?怎么评估聚类效果?

当我们 有样本真实聚类情况的数据,我们可以对于聚类算法的结果和真实结果来衡量聚类的效果。一般有以下三种方法:

以下了解即可,不常用

▶1 . 调整兰德指数

调整兰德指数:Adjusted Rand Index 简称 ARI,是兰德系数 RI 的优化,解决了 RI 不能很好的描述随机分配簇类标记向量的相似度问题,而 RI 反映两种划分的重叠程度

ARI 的取值在 (-1,1) 之间,负值象征着簇内的点差异巨大,正值则表示预测值和真实值差别较小

即,ARI 越接近 1 越好。

在 sklearn 中,可以通过调用 metrics 模块下的方法计算 ARI,代码如下:

from sklearn.metrics import adjusted_rand_score

# 计算 ARI
adjusted_rand_score([0,0,0,1,1,1], [0,0,1,1,2,2])

# 输出
0.24242424242424246

▶2. 调整互信息分

调整互信息分:Adjusted mutual info score 简称 AMI,是互信息分 MI 的优化,MI 随着分配簇的个数增加而增加。

AMI 是基于预测簇向量与真实簇向量的互信息分数来衡量其相似度的,AMI 越大相似度越高,AMI 接近于0 表示簇向量是随机分配的。

即,AMI 越接近 1 越好。

同样,在 sklearn 中,可以通过调用 metrics 模块下的方法计算,代码如下:

from sklearn.metrics import adjusted_mutual_info_score

# 计算 AMI
adjusted_mutual_info_score([0,0,0,1,1,1], [0,0,1,1,2,2])

# 输出
0.29879245817089006

▶3. 同质性、完整性和 V-measure

同质性和完整性是 基于条件熵 的互信息分数来衡量簇向量间的相似度,V-meansure 是同质性和完整性的调和平均。

同质性:homogeneity,指的是每个簇只包含单个类成员。其实也可以认为就是正确率,表示每个聚类簇中正确分类的样本数占该聚类簇总样本数的比例和;

完整性:completeness,给定类的所有成员分配给同一类簇,也就是每个聚类簇中正确分类的样本数占类型的总样本数比例的和。

V-measure 是结合同质性和完整性两个因素来评价簇向量间的相似度,V-measure 越接近 1 越好。

同样的,给代码:

from sklearn.metrics import homogeneity_score

# 计算 V-measure
homogeneity_score([0,0,0,1,1,1], [0,0,1,1,2,2])

# 输出
0.6666666666666669

无样本聚类标签的评估

上面说的三种评估方法对应的都是真实标签已知的情况,实际项目中需要聚类的样本数据 99% 都是没有真实标签的

那么,对于真实标签未知的情况,应该怎么去评估预测的性能呢?

▶1. 轮廓系数

轮廓系数是最常用的聚类算法的评价指标,它可以通过计算:

  • 样本与其自身所在簇中的其他样本的相似度 a

  • 样本与其他簇中的样本的相似度 b

其中,样本与同一簇中所有其他点之间的平均距离=a,样本与下一个最近的簇中的所有点之间的平均距离=b

通过以下公式计算轮廓系数:

轮廓系数

我们知道,聚类的标准是:簇内差异小,簇间差异大。而轮廓系数 s 越接近 1,表示样本与自己所在簇中的样本很相似,并且与其他簇中的样本不相似,即聚类效果越好;负数则表示聚类效果非常差

需要注意,轮廓系数范围是(-1,1)

在 sklearn 中,通过使用模块 metrics 中的 silhouette_score 来计算轮廓系数,代码如下:

from sklearn.metrics import silhouette_score

# 计算轮廓系数
silhouette_score(X, y_pred)

代码中的 X 表示样本数据,pre_labels 表示聚类之后的预测。最终返回的是一个数据集中,所有样本的轮廓系数的均值。


▶2. CHI

CHI 全称 Calinski-Harabaz Index,译为卡林斯基-哈拉巴斯指数,最终的得分定义为 组间分散度与组内分散度的比值

CHI 的计算公式如下:

轮廓系数

其中 m 为训练集样本数,k为聚簇个数。Bk 为簇间的协方差矩阵,Wk 为簇内的协方差矩阵,tr 为矩阵的迹。

综上,当簇间差异越大,簇内差异越小,即聚类效果越好的时候,轮廓系数越大。

即:轮廓系数越高表示聚类效果越好

使用代码如下:

from sklearn.metrics import calinski_harabaz_score

# 计算 CHI
calinski_harabaz_score(X, y_pred)

因为计算方式的原因,CHI 的计算比轮廓系数快了一倍多,所以在选择评价标准的时候可以优先选择 CHI。


总结一下

常见的模型评估方法就算是介绍完了,总算松了一口气,赶紧总结一下:

▶1. 分类模型

在分类模型中,有直接结果的输出,而且对于结果我们有明确的定义:是or否,所以我们可以使用预测的 准确度、召回率、混淆矩阵、roc 曲线 等指标来进行评估。

▶2. 回归模型

在回归模型中,同样也有直接结果的输出,对于预测结果和真实结果的误差可以用 平均均方误差、平均绝对误差、r2 score 等指标进行评估。

▶3. 聚类模型

在聚类模型中,当有样本真实标签时可通过 兰德系数、互信息分 等指标评估,但大多数情况下聚类样本是没有标签的,此时可以通过 轮廓系数、CHI 等指标进行评估。

另外,分类模型评估比较常见,而且在金融风控领域对于 ROC 使用的比较多,后面抽空再分享一下 ROC 的评估过程。

往期文章

公众号文章标题的内卷化?

部门小姐姐:你能用Python帮我做一个“抽奖程序”吗?

今天的心路历程很特别!

深漂三年,我还是我,我也不再是我!

坚持向暮光所走的人,终将成为耀眼的存在!

1 2 3 连支持下?我们下节见

你可能感兴趣的:(聚类,python,机器学习,人工智能,算法)