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中。

廣告