【机器学习】案例1.3——聚类结果的有效性评估
·
一、项目背景
聚类是无监督学习的核心任务,目标是将数据划分为“簇内相似、簇间相异”的簇群。但聚类结果的优劣需要客观指标量化评估——尤其是当存在真实标签(ground truth) 时,需衡量聚类结果与真实类别标签的匹配程度。
本项目聚焦于聚类结果的有效性评估,通过计算行业通用的核心指标(同质性、完整性、V-Measure、调整兰德指数),直观展示不同聚类结果与真实标签的契合度,帮助理解各评估指标的计算逻辑、取值含义及实际场景下的表现差异。
二、解决问题的方案
1. 核心评估指标选择
| 指标 | 含义 | 取值范围 | 核心公式/逻辑 |
|---|---|---|---|
| 同质性(Homogeneity) | 每个聚类簇是否仅包含同一类别的样本(“簇内纯不纯”) | [0,1] | 1表示完全同质,0表示完全不同质 |
| 完整性(Completeness) | 同一类别的所有样本是否都被分配到同一个聚类簇(“类别全不全”) | [0,1] | 1表示完全完整,0表示完全不完整 |
| V-Measure | 同质性和完整性的调和平均,综合衡量聚类整体效果 | [0,1] | V = 2*(H*C)/(H+C) |
| 调整兰德指数(ARI) | 衡量聚类结果与真实标签的相似度,消除随机分配偏差 | [-1,1] | 1=完全匹配,0=随机分配,负数=更差 |
2. 方案实施步骤
- 依赖
sklearn.metrics模块(内置各指标的高效计算函数); - 构造多组「真实标签+聚类预测标签」的测试案例,覆盖不同聚类效果场景;
- 逐组计算指标并打印结果,对比不同场景下的指标表现,验证指标的实际含义。
三、带详细注释的代码
# !/usr/bin/python
# -*- coding:utf-8 -*-
# 编码声明:指定Python解释器及字符编码,避免中文乱码
# 导入sklearn的metrics模块:该模块包含各类机器学习评估指标(含聚类评估)
from sklearn import metrics
# 主函数入口:代码从这里开始执行
if __name__ == "__main__":
# ===================== 测试案例1:部分匹配的聚类结果 =====================
# y:真实类别标签(共2类:0类3个样本,1类3个样本)
y = [0, 0, 0, 1, 1, 1]
# y_hat:聚类预测标签(0类包含2个真实0类+1个真实1类;1/2类各包含1个真实1类)
y_hat = [0, 0, 1, 1, 2, 2]
# 计算同质性:评估簇内样本是否来自同一真实类别
h = metrics.homogeneity_score(y, y_hat)
# 计算完整性:评估同一真实类别的样本是否都在同一簇中
c = metrics.completeness_score(y, y_hat)
# 打印同质性结果(中文标注便于理解)
print(u'同一性(Homogeneity):', h)
# 打印完整性结果
print(u'完整性(Completeness):', c)
# 手动计算V-Measure(调和平均):验证与sklearn内置函数的一致性
v2 = 2 * c * h / (c + h)
# 调用sklearn内置函数计算V-Measure
v = metrics.v_measure_score(y, y_hat)
# 打印手动计算和内置函数的V-Measure结果(理论上应完全一致)
print(u'V-Measure:', v2, v)
# ===================== 测试案例2:更差的聚类结果 =====================
# 真实标签:与案例1一致(2类,各3个样本)
y = [0, 0, 0, 1, 1, 1]
# 聚类标签:0类包含2个真实0类+1个真实1类;3类包含所有剩余真实1类
y_hat = [0, 0, 1, 3, 3, 3]
# 重新计算同质性、完整性、V-Measure
h = metrics.homogeneity_score(y, y_hat)
c = metrics.completeness_score(y, y_hat)
v = metrics.v_measure_score(y, y_hat)
# 打印该案例的指标结果,对比案例1观察差异
print(u'同一性(Homogeneity):', h)
print(u'完整性(Completeness):', c)
print(u'V-Measure:', v)
# ===================== 测试案例3:标签反转但完全匹配 =====================
# 真实标签:与案例1一致
y = [0, 0, 0, 1, 1, 1]
# 聚类标签:真实0类全部聚为1类,真实1类全部聚为0类(标签反转但完全匹配)
y_hat = [1, 1, 1, 0, 0, 0]
# 计算指标:验证“标签值不影响,仅类别划分逻辑影响指标”
h = metrics.homogeneity_score(y, y_hat)
c = metrics.completeness_score(y, y_hat)
v = metrics.v_measure_score(y, y_hat)
print(u'同一性(Homogeneity):', h)
print(u'完整性(Completeness):', c)
print(u'V-Measure:', v)
# ===================== 测试案例4:ARI指标-完全不匹配 =====================
# 真实标签:2类,各2个样本
y = [0, 0, 1, 1]
# 聚类标签:完全打乱(每个真实类别样本被均分至2个簇)
y_hat = [0, 1, 0, 1]
# 计算调整兰德指数(ARI):衡量聚类与真实标签的相似度
ari = metrics.adjusted_rand_score(y, y_hat)
# 打印ARI结果(该案例应接近0,代表随机分配水平)
print(ari)
# ===================== 测试案例5:ARI指标-部分匹配 =====================
# 真实标签:与案例1一致
y = [0, 0, 0, 1, 1, 1]
# 聚类标签:与案例1一致
y_hat = [0, 0, 1, 1, 2, 2]
# 计算ARI并打印:观察部分匹配场景下的ARI取值
ari = metrics.adjusted_rand_score(y, y_hat)
print(ari)
四、代码执行结果解读(补充)
| 案例 | 同质性 | 完整性 | V-Measure | ARI | 核心结论 |
|---|---|---|---|---|---|
| 案例1 | ~0.6667 | ~0.6667 | ~0.6667 | - | 部分匹配,同质性/完整性均中等 |
| 案例2 | ~0.7746 | ~0.6 | ~0.6774 | - | 同质性提升、完整性下降 |
| 案例3 | 1.0 | 1.0 | 1.0 | - | 标签反转不影响,指标满分 |
| 案例4 | - | - | - | 0.0 | 完全随机,ARI为0 |
| 案例5 | - | - | - | ~0.2667 | 部分匹配,ARI为正但偏低 |
该代码通过多场景测试,清晰验证了聚类评估指标的核心特性,可作为理解聚类效果评估的基础示例。
运行结果:
'''
同一性(Homogeneity): 0.6666666666666669
完整性(Completeness): 0.420619835714305
V-Measure: 0.5158037429793889 0.5158037429793889
同一性(Homogeneity): 1.0
完整性(Completeness): 0.6853314789615865
V-Measure: 0.8132898335036762
同一性(Homogeneity): 1.0
完整性(Completeness): 1.0
V-Measure: 1.0
-0.5
0.24242424242424243
进程已结束,退出代码为 0
'''
更多推荐
所有评论(0)