Scikit Learn - 聚类性能评估

我们可以借助各种函数来评估聚类算法的性能。

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

调整后的随机数指数

随机数指数是一个计算两个聚类之间相似性度量的函数。在此计算中,随机数指数会考虑所有样本对,并统计预测聚类和真实聚类中被分配到相似或不同聚类的样本对。之后,使用以下公式将原始兰德指数得分"根据概率进行调整",得到调整后的兰德指数得分:Ⅹ

$$Adjusted\:RI=\left(RI-Expected_{-}RI ight)/\left(max\left(RI ight)-Expected_{-}RI ight)$$

它包含两个参数,分别为 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 得分

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

数学上:

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

其中,TP = 真阳性 − 表示在真实标签和预测标签中都属于同一聚类的点对数量。

FP = 假阳性 −在真实标签中属于同一聚类但不在预测标签中的点对数量。

FN = 假阴性 − 在预测标签中属于同一聚类但不在真实标签中的点对数量。

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(b-a ight)/max\left(a,b ight)$$

其中,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,一个属于聚类 2。另一方面,第二行显示,在三个真实聚类为"b"的样本中,1 个属于聚类 0,1 个属于聚类 1,1 个属于聚类 2。