【菜菜的sklearn课堂笔记】聚类算法Kmeans-聚类算法的模型评估指标

news2024/12/23 5:25:11

视频作者:菜菜TsaiTsai
链接:【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili

可以只看轮廓系数和卡林斯基-哈拉巴斯指数

不同于分类模型和回归,聚类算法的模型评估不是一件简单的事。在分类中,有直接结果(标签)的输出,并且分类的结果有正误之分,所以我们使用预测的准确度等指标来进行评估,但无论如何评估,都是在”模型找到正确答案“的能力。回归的评估也类似分类,都是基于标签的评估。但这些衡量指标都不能够使用于聚类。

那么如何衡量聚类算法的效果?

记得我们说过,KMeans的目标是确保“簇内差异小,簇外差异大”,我们就可以通过衡量簇内差异来衡量聚类的效果。我们刚才说过,Inertia是用距离来衡量簇内差异的指标,因此,我们可以使用Inertia来作为聚类的衡量指标,但是这个指标的缺点和极限太大。

  1. 它没有上界。我们只知道,Inertia是越小越好,是0最好,但我们不知道,一个较小的Inertia究竟有没有达到模型的极限,能否继续提高。我们也无法说一个数字对于当前模型到底是大还是小
  2. 它的计算太容易受到特征数目的影响,数据维度很大的时候,Inertia的计算量会陷入维度诅咒之中,计算量会爆炸,不适合用来一次次评估模型。
  3. 它会受到超参数K的影响,在我们之前的尝试中已经发现,随着K越大,Inertia注定会越来越小,但这并不代表模型的效果越来越好了
  4. Inertia对数据的分布有假设,它假设数据满足凸分布(即数据在二维平面图像上看起来是一个凸函数的样子),并且它假设数据是各向同性的(isotropic),即是说数据的属性在不同方向上代表着相同的含义。但是现实中的数据往往不是这样。所以使用Inertia作为评估指标,会让聚类算法在一些细长簇,环形簇,或者不规则形状的流形时表现不佳:

![[附件/Pasted image 20221115213451.png|550]]

那我们可以使用什么指标呢?分两种情况来看。

当真实标签已知的时候

在现实中,拥有真实标签的情况非常少见(几乎是不可能的)。如果拥有真实标签,我们更倾向于使用分类算法。但不排除我们依然可能使用聚类算法的可能性。如果我们有样本真实聚类情况的数据,我们可以对于聚类算法的结果和真实结果来衡量聚类的效果。常用的有以下三种方法:

模型评估指标说明
互信息分

普通互信息分
metrics.adjusted_mutual_info_score (y_pred, y_true) 调整的互信息分
metrics.mutual_info_score (y_pred, y_true)
标准化互信息分
metrics.normalized_mutual_info_score (y_pred, y_true)
取值范围在(0,1)之中
越接近1,聚类效果越好
在随机均匀聚类下产生0分
V-measure:基于条件上分析的一系列直观度量

同质性:是否每个簇仅包含单个类的样本
metrics.homogeneity_score(y_true, y_pred)
完整性:是否给定类的所有样本都被分配给同一个簇中
metrics.completeness_score(y_true, y_pred)
同质性和完整性的调和平均,叫做V-measure
metrics.v_measure_score(labels_true, labels_pred)
三者可以被一次性计算出来
metrics.homogeneity_completeness_v_measure(labels_true, labels_pred)
取值范围在(0,1)之中
越接近1,聚类效果越好
由于分为同质性和完整性两种度量,可以更仔细地研究,模型到底哪个任务做得不够好
对样本分布没有假设,在任何分布上都可以有不错的表现
在随机均匀聚类下不会产生0分
调整兰德系数
metrics.adjusted_rand_score(y_true, y_pred)
取值在(-1,1)之间,负值象征着簇内的点差异巨大,甚至相互独立,正类的兰德系数比较优秀,越接近1越好
对样本分布没有假设,在任何分布上都可以有不错的表现,尤其是在具有"折叠"形状的数据上表现优秀
在随机均匀聚类下产生0分

当真实标签未知的时候:轮廓系数

在99%的情况下,我们是对没有真实标签的数据进行探索,也就是对不知道真正答案的数据进行聚类。这样的聚类,是完全依赖于评价簇内的稠密程度(簇内差异小)和簇间的离散程度(簇外差异大)来评估聚类的效果。
轮廓系数是最常用的聚类算法的评价指标。它是对每个样本来定义的,它能够同时衡量:

  • 样本与其自身所在的簇中的其他样本的相似度a,等于样本与同一簇中所有其他点之间的平均距离
  • 样本与其他簇中的样本的相似度b,等于样本与下一个最近的簇中的所有点之间的平均距离

根据聚类的要求”簇内差异小,簇外差异大“,我们希望b永远大于a,并且大得越多越好。
单个样本的轮廓系数计算为:
s = b − a max ⁡ ( a , b ) s=\frac{b-a}{\max (a,b)} s=max(a,b)ba
这个公式可以被解析为:
s = { 1 − a b a < b 0 a = b b a − 1 a > b s=\left\{\begin{aligned}&1- \frac{a}{b}&a<b\\&0&a=b\\& \frac{b}{a}-1&a>b\end{aligned}\right. s=1ba0ab1a<ba=ba>b
很容易理解轮廓系数范围是(-1,1),其中值越接近1表示样本与自己所在的簇中的样本很相似,并且与其他簇中的样本不相似,当样本点与簇外的样本更相似的时候,轮廓系数就为负。当轮廓系数为0时,则代表两个簇中的样本相似度一致,两个簇本应该是一个簇。可以总结为轮廓系数越接近于1越好,负数则表示聚类效果非常差
如果许多样本点具有低轮廓系数甚至负值,则聚类是不合适的,聚类的超参数K可能设定得太大或者太小。

在sklearn中,我们使用模块metrics中的类silhouette_score来计算轮廓系数,它返回的是一个数据集中,所有样本的轮廓系数的均值。但我们还有同在metrics模块中的silhouette_sample,它的参数与轮廓系数一致,但返回的是数据集中每个样本自己的轮廓系数。

from sklearn.metrics import silhouette_score
from sklearn.metrics import silhouette_samples

silhouette_score(X,y_pred)
---
0.5882004012129721

silhouette_samples(X,y_pred)
---
array([ 0.62982017,  0.5034877 ,  0.56148795,  0.84881844,  0.56034142,
        0.78740319,  0.39254042,  0.4424015 ,  0.48582704,  0.41586457,
……

silhouette_samples(X,y_pred).shape
---
(500,)

silhouette_samples(X,y_pred).mean()
---
0.5882004012129721

silhouette_score(X,cluster_.labels_) # n_cluster = 4
---
0.6505186632729437

silhouette_score(X,cluster_.labels_) # n_cluster = 5
---
0.5737098048695828

silhouette_score(X,cluster_.labels_) # n_cluster = 6
---
0.4532882033128697

轮廓系数有很多优点,它在有限空间中取值,使得我们对模型的聚类效果有一个“参考”。并且,轮廓系数对数据的分布没有假设,因此在很多数据集上都表现良好。但它在每个簇的分割比较清晰时表现最好。
但轮廓系数也有缺陷,它在凸型的类上表现会虚高,比如基于密度进行的聚类,或通过DBSCAN获得的聚类结果,如果使用轮廓系数来衡量,则会表现出比真实聚类效果更高的分数。

当真实标签未知的时候:卡林斯基-哈拉巴斯指数

除了轮廓系数是最常用的,我们还有卡林斯基-哈拉巴斯指数(Calinski-Harabaz Index,简称CHI,也被称为方差比标准),戴维斯-布尔丁指数(Davies-Bouldin)以及权变矩阵(Contingency Matrix)可以使用。

标签未知时的评估指标
卡林斯基-哈拉巴斯指数
sklearn.metrics.calinski_harabaz_score (X,y_pred)
戴维斯-布尔丁指数
sklearn.metrics.davies_bouldin_score (X, y_pred)
权变矩阵
sklearn.metrics.cluster.contingency_matrix (X, y_pred)

在这里我们重点来了解一下卡林斯基-哈拉巴斯指数。Calinski-Harabaz指数越高越好。对于有k个簇的聚类而言, Calinski-Harabaz指数s(k)写作如下公式:
s ( k ) = T r ( B k ) T r ( W k ) ⋅ N − k k − 1 s(k)=\frac{Tr(B_{k})}{Tr(W_{k})}\cdot \frac{N-k}{k-1} s(k)=Tr(Wk)Tr(Bk)k1Nk
其中N为数据集中的样本量,k为簇的个数(即类别的个数), B k B_{k} Bk是组间离散矩阵,即不同簇之间的协方差矩阵, W k W_{k} Wk是簇内离散矩阵,即一个簇内数据的协方差矩阵,而 T r Tr Tr表示矩阵的迹。
数据之间的离散程度越高,协方差矩阵的迹就会越大。组内离散程度低,协方差的迹就会越小, T r ( W k ) Tr(W_{k}) Tr(Wk)也就越小,同时,组间离散程度大,协方差的的迹也会越大, T r ( B k ) Tr(B_{k}) Tr(Bk)就越大,这正是我们希望的,因此Calinski-harabaz指数越高越好。

from sklearn.metrics import calinski_harabasz_score

calinski_harabasz_score(X,y_pred)
---
1809.991966958033

虽然calinski-Harabaz指数没有界,在凸型的数据上的聚类也会表现虚高。但是比起轮廓系数,它有一个巨大的优点,就是计算非常快速。

from time import time

t0 = time()
calinski_harabasz_score(X,y_pred)
time() - t0
---
0.0010504722595214844

t0 = time()
silhouette_score(X,y_pred)
time() - t0
---
0.01594376564025879

稍微说说卡林斯基-哈拉巴斯指数,因为实在是看着那个公式不解释一下感觉太怪了
B k B_{k} Bk为类间方差
B k = ∑ q = 1 k n q ( c q − c E ) ( c q − c E ) T B_{k}=\sum\limits_{q=1}^{k}n_{q}(c_{q}-c_{E})(c_{q}-c_{E})^{T} Bk=q=1knq(cqcE)(cqcE)T
k k k表示聚类结果的数量, c q c_{q} cq是类 q q q的质点, c E c_{E} cE是所有数据的中心点, n q n_{q} nq是类 q q q数据点的总数
W k W_{k} Wk为类内方差
W k = ∑ q = 1 k ∑ x ∈ C q ( x − c q ) ( x − c q ) T W_{k}=\sum\limits_{q=1}^{k}\sum\limits_{x \in C_{q}}^{}(x-c_{q})(x-c_{q})^{T} Wk=q=1kxCq(xcq)(xcq)T
C q C_{q} Cq是类 q q q的质点
Calinski-Harbasz Score衡量分类情况和理想分类情况(类之间方差最大,类内方差最小)之间的区别,归一化因子 N − k k − 1 \frac{N-k}{k-1} k1Nk随着类别数k的增加而减少,使得该方法更偏向于选择类别少的分类结果。这导致了在实验中K=2,往往得到很高的分数,但是这不是我们想要的结果。这时,我们需要去找另一个局部最优的K。即使找到的K不是真正的分数最高,但是只要它们对应的得分显著高,我们都可以接受这样的值,如同梯度一样,我们有的时候并不能找到全局最优,但是局部最优的结果仍可以接受。

链接:Calinski-Harbasz Score 详解_chloe_au_yeung的博客-CSDN博客_calinski_harabasz_score

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/59172.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【尚硅谷】Java数据结构与算法笔记02 - 队列

文章目录一、使用场景二、队列介绍三、数组模拟队列3.1 思路分析3.2 Java代码实现3.3 问题分析与优化四、数组模拟环形队列4.1 思路分析4.2 Java代码实现一、使用场景 银行排队&#xff0c;先到先得测核酸&#xff0c;先到先测 二、队列介绍 队列是一个有序列表, 可以用数组…

硬盘压缩将C盘拓展成D盘和E盘

硬盘压缩将C盘拓展成D盘和E盘1. 现状2. 硬盘压缩2.1 进入计算机管理2.2 磁盘管理压缩卷3. 分配新盘符3.1 查看盘符是否被占用3.2 新建D盘刚安装好系统的电脑有可能只有一个C盘&#xff0c;我们工作学习的时候远远不够&#xff0c;那怎么拓展其他盘符呢&#xff1f; 接下来让我们…

PyQt5基础练习1

0. 本文学习地址 1. PyQt5是由一系列Python模块组成 超过620个类&#xff0c;6000函数和方法。能在诸如Unix、Windows和Mac OS等主流操作系统上运行。 1.1 PyQt5有两种证书 GPL商业证书 2. 实验1 实现简单的窗体 2.1 完整代码 #!/usr/bin/python3 # -*- coding: utf-8 -*…

专业尖端远心光学,高精度视觉检测解决者

随着机器视觉系统在精密检测领域的广泛应用&#xff0c;在精密光学测量系统中&#xff0c;由于普通光学镜头会存在一定的制约因素&#xff0c;如影像的变形、视角选择而造成的误差、不适当光源干扰下造成边界的不确定性等问题&#xff0c;进而影响测量的精度。为弥补普通镜头应…

155. RESTframe的请求和响应

1.请求和响应 REST framework引入了2个新的对象&#xff1a;Request和Response 1.1 Request 包结构&#xff1a;rest_framework.request.Request 该对象扩展了常规的HttpRequest &#xff0c;增加了对REST框架灵活的请求解析和请求认证的支持 主要属性&#xff1a; data 这个…

基于PHP+MySQL毕业生档案管理系统

毕业生档案管理系统是信息时代的产物&#xff0c;它是学校档案管理部门的一个好帮手。有了它不再需要繁重的纸质登记&#xff0c;有了它档案管理员不在需要繁重的工作&#xff0c;一些成绩信息和奖惩等基本信息可以由管理人员及时的对信息进行查询、更新、修改和删除&#xff0…

SpringBoot_启动原理分析

一共分为三部分来解析: 一 依赖导入原理 二 springboot 包扫描原理三 springboot自动配置原理一 依赖导入原理 父项目进行版本控制 ctrl 点击spring-boot-starter-parent 进入 继续点击,进入spring-boot-dependencies 这里管理着springboot中所有依赖的版本,版本…

38 | Linux 磁盘空间异常爆满

1 场景 收到告警 找到对应的服务器&#xff1a;df -hl 要找到导致磁盘空间满的目录或文件。 2 找占用空间大的目录或文件 2.1方式一 在根目录下&#xff0c;通过du -hs命令&#xff0c;列出各目录所占空间大小 命令&#xff1a;du -hs * 之后再用同样的方法继续到对应目…

[附源码]计算机毕业设计springboot医学图像管理平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

EXSI-NFS实验

A-EXSI-NFS实验 2022年3月25日 8:20 iptables -F iptables-save systemctl stop firewalld #setenforce [0|1]命令修改SELinux当前的运行模式&#xff08;0为禁用&#xff0c;1为启用&#xff09; getenforce Enforcing setenforce 0 getenforce Permissive NFS 两台CentOS 7即…

【车载开发系列】UDS诊断---读取内存($0x23)

【车载开发系列】UDS诊断—读取内存&#xff08;$0x23&#xff09; UDS诊断---读取内存&#xff08;$0x23&#xff09;【车载开发系列】UDS诊断---读取内存&#xff08;$0x23&#xff09;一.概念定义二.注意事项三.报文格式1&#xff09;报文请求2&#xff09;肯定响应3&#x…

一、Node.js 环境安装 (详)

1. 下载Node.js 首先进入node.js官网&#xff0c;选择下载这一项&#xff0c;此时映入眼帘的可以看到有两项LTS(长期维护版本)和Current(最新的版本)&#xff0c;一般在开发会选择左边进行下载安装&#xff0c;具稳定性以及有长期维护。那么下面演示的是64位的Windows操作系统&…

PCI bar 解析

只要是接入系统的 pci 设备就需要和系统软件进行交互&#xff0c;设备和系统之间的交流主要包含以下两部分&#xff1a; 1&#xff0c;系统要能访问到设备的寄存器 用于控制设备行为&#xff0c;包括DMA&#xff0c;数据收发等&#xff1b;设备通过寄存器报告自身的状态&…

Nginx部署vue项目和配置代理

Nginx部署vue项目和配置代理目录概述需求&#xff1a;实现思路分析1.一般前后端分离的项目需要进行跨域2.微服务代理3.vuenginx实现服务端跨域4.网页解析器参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&am…

【问题解决】Android JDK版本不匹配导致崩溃踩坑记录

【问题解决】Android JDK版本不匹配导致崩溃踩坑记录部分机型反馈崩溃问题谷歌回复与解决方案Android打包脱糖操作对比与排查总结前几天同事遇到一个非常诡异的报错&#xff0c;紧急处理后&#xff0c;趁着周末仔细研究了一下原因&#xff0c;觉得还挺有意思的&#xff0c;所以…

制作一个谷歌浏览器插件,实现网页数据爬虫

一、什么是浏览器插件 浏览器插件&#xff0c;基于浏览器的原有功能&#xff0c;另外增加新功能的工具&#xff0c;是可定制浏览体验的小型软件程序&#xff0c;让用户可以根据个人需要或偏好来定制浏览器。 如拦截网页中的广告、划词翻译、倍速视频等等。 Chrome、edge等浏…

WEB前端网页设计 网页代码参数(背景、图片)类

目录 设置圆角 旋转属性&#xff1a; box-sizing属性&#xff1a; 设置背景图像固定background-attachment 设置多重背景图像 鼠标光标形状&#xff1a;cursor ”图片背景“ background-size 背景图片的大小 背景图像的位置 px 无序列表 &#xff1a; 标签 项目符…

解决cocos2d-x-4.0 Android Demo构建遇到的问题

环境 硬件&#xff1a;macbook pro 四核Intel Core i7系统&#xff1a;macOS Big Sur 11.4.2、 xcode Version 13.1 、cmake 3.20.5软件&#xff1a;iterm2 Build 3.4.8、zsh 5.8、Android Studio Dolphin | 2021.3.1cocos2d-x v4 &#xff1a; 官方下载压缩包 http://cocos2d…

讲点登录业务

1.单点Session 通过判断用户是否有服务器赋予的session_id&#xff0c;点对点服务器的用户信息&#xff0c;确认用户身份 缺点&#xff1a; 单点性能压力大无法扩展&#xff0c;如果是分布式的话&#xff0c;其他的服务怎么进行认证呢&#xff1f; 2.Redis解决共享问题 我们…

JavaWeb(四)

前言 在学习JSP之前&#xff0c;首先咱们要了解的是&#xff0c;学这个语言有什么用&#xff0c;这个语言用在哪里呢&#xff1f; 这就要从咱们的MVC框架开始讲起 MVC模式是一种软件架构模式&#xff0c;对于我这种软件工程专业的人来说&#xff0c;真的是逃离不了学这个东西。…