Scikit Learn - 集群性能评估


有多种函数可以帮助我们评估聚类算法的性能。

以下是 Scikit-learn 提供的一些重要且最常用的用于评估聚类性能的函数 -

调整后兰德指数

兰德指数是计算两个聚类之间相似性度量的函数。对于此计算,兰特索引考虑了在预测聚类和真实聚类中分配在相似或不同聚类中的所有样本对和计数对。然后,使用以下公式将原始兰德指数得分“根据机会调整”为调整后兰德指数得分 -

$$调整后的RI=\left(RI-预期_{-}RI\right)/\left(max\left(RI\right)-预期_{-}RI\right)$$

它有两个参数,即labels_true(地面实况类标签)和labels_pred(要评估的集群标签)。

例子

from sklearn.metrics.cluster import adjusted_rand_score
   
   labels_true = [0, 0, 1, 1, 1, 1]
   labels_pred = [0, 0, 2, 2, 3, 3]

adjusted_rand_score(labels_true, labels_pred)

输出

0.4444444444444445

完美的标记将得分为 1,不良标记或独立标记将得分为 0 或负数。

基于互信息的评分

互信息是计算两个分配的一致性的函数。它忽略了排列。有以下版本可用 -

标准化互信息 (NMI)

Scikit learn 有sklearn.metrics.normalized_mutual_info_score模块。

例子

from sklearn.metrics.cluster import normalized_mutual_info_score
   
   labels_true = [0, 0, 1, 1, 1, 1]
   labels_pred = [0, 0, 2, 2, 3, 3]

normalized_mutual_info_score (labels_true, labels_pred)

输出

0.7611702597222881

调整互信息 (AMI)

Scikit learn 有sklearn.metrics.adjusted_mutual_info_score模块。

例子

from sklearn.metrics.cluster import adjusted_mutual_info_score

   labels_true = [0, 0, 1, 1, 1, 1]
   labels_pred = [0, 0, 2, 2, 3, 3]

adjusted_mutual_info_score (labels_true, labels_pred)

输出

0.4444444444444448

福克斯-马洛斯评分

Fowlkes-Mallows 函数测量一组点的两个聚类的相似性。它可以被定义为成对精度和召回率的几何平均值。

从数学上来说,

$$FMS=\frac{TP}{\sqrt{\left(TP+FP\right)\left(TP+FN\right)}}$$

这里,TP = True Positive - 真实标签和预测标签中属于同一簇的点对的数量。

FP = 假阳性- 属于真实标签中但不属于预测标签中相同簇的点对数量。

FN = False Negative - 属于预测标签中相同簇但不属于真实标签中的点对的数量。

Scikit learn 有 sklearn.metrics.fowlkes_mallows_score 模块 -

例子

from sklearn.metrics.cluster import fowlkes_mallows_score

   labels_true = [0, 0, 1, 1, 1, 1]
   labels_pred = [0, 0, 2, 2, 3, 3]

fowlkes_mallows__score (labels_true, labels_pred)

输出

0.6546536707079771

轮廓系数

Silhouette 函数将使用每个样本的平均簇内距离和平均最近簇距离来计算所有样本的平均轮廓系数。

从数学上来说,

$$S=\left(ba\right)/max\left(a,b\right)$$

这里,a是簇内距离。

b 是平均最近簇距离。

Scikit learn 有sklearn.metrics.silhouette_score模块 -

例子

from sklearn import metrics.silhouette_score
from sklearn.metrics import pairwise_distances
from sklearn import datasets
import numpy as np
from sklearn.cluster import KMeans
dataset = datasets.load_iris()
X = dataset.data
y = dataset.target

kmeans_model = KMeans(n_clusters = 3, random_state = 1).fit(X)
labels = kmeans_model.labels_
silhouette_score(X, labels, metric = 'euclidean')

输出

0.5528190123564091

应急矩阵

该矩阵将报告每个可信对(真实的,预测的)的交集基数。分类问题的混淆矩阵是一个方列联矩阵。

Scikit learn 有sklearn.metrics.contingency_matrix模块。

例子

from sklearn.metrics.cluster import contingency_matrix
x = ["a", "a", "a", "b", "b", "b"]
y = [1, 1, 2, 0, 1, 2]
contingency_matrix(x, y)

输出

array([
   [0, 2, 1],
   [1, 1, 1]
])

上面输出的第一行显示,在真实簇为“a”的三个样本中,没有一个在 0 中,其中两个在 1 中,1 在 2 中。另一方面,第二行显示在三个样本中,其真实簇为“b”,1在0中,1在1中,1在2中。