ScikitLearn-クラスタリングパフォーマンス評価

クラスタリングアルゴリズムのパフォーマンスを評価できるさまざまな関数があります。

以下は、クラスタリングのパフォーマンスを評価するためにScikit-learnによって提供されるいくつかの重要で主に使用される関数です。

調整されたランドインデックス

ランドインデックスは、2つのクラスタリング間の類似度を計算する関数です。この計算では、rand indexは、予測された真のクラスタリングの類似または異なるクラスターに割り当てられたサンプルのすべてのペアとカウントペアを考慮します。その後、生のランドインデックススコアは、次の式を使用して、調整済みランドインデックススコアに「偶然に調整」されます。

$$ Adjusted \:RI = \ left(RI-Expected _ {-} RI \ right)/ \ left(max \ left(RI \ right)-Expected _ {-} RI \ right)$$

つまり、2つのパラメータがあります 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または負のスコアが付けられます。

相互情報量ベースのスコア

相互情報量は、2つの割り当ての一致を計算する関数です。順列は無視されます。以下のバージョンが利用可能です-

正規化された相互情報量(NMI)

Scikitは持っていることを学ぶ 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は持っていることを学ぶ 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関数は、点のセットの2つのクラスタリングの類似性を測定します。これは、ペアワイズ適合率と再現率の幾何平均として定義できます。

数学的には、

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

ここに、 TP = True Positive −真のラベルと予測されたラベルの両方で同じクラスターに属するポイントのペアの数。

FP = False Positive −真のラベルにはあるが、予測されたラベルにはない同じクラスターに属するポイントのペアの数。

FN = False Negative −予測されたラベルでは同じクラスターに属しているが、実際のラベルには属していないポイントのペアの数。

Scikitlearnには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

シルエット係数

シルエット関数は、各サンプルの平均クラスター内距離と平均最も近いクラスター距離を使用して、すべてのサンプルの平均シルエット係数を計算します。

数学的には、

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

ここで、aはクラスター内距離です。

また、bはクラスターに最も近い平均距離です。

Scikitは持っていることを学ぶ 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は持っていることを学ぶ 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」である3つのサンプルのうち、いずれも0になく、2つが1にあり、1が2にあることを示しています。一方、2番目の行は、3つのサンプルのうちその真のクラスターは「b」、1は0、1は1、1は2です。