Scikit Learn - 聚类性能评估



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

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

调整后的兰德指数 (Adjusted Rand Index)

兰德指数是一个计算两个聚类之间相似性度量的函数。此计算考虑所有样本对,并计算在预测聚类和真实聚类中分配到相似或不同聚类的样本对数量。之后,使用以下公式将原始兰德指数分数“调整为机会”转换为调整后的兰德指数分数:

$$调整后的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 得分

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

数学上,

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

这里,`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 Coefficient)

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

数学上,

$$S=\left(b-a\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

列联表 (Contingency Matrix)

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

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”的三个样本中,一个在0中,一个在1中,一个在2中。

广告