web-dev-qa-db-ja.com

Scikit K-meansクラスタリングパフォーマンス測定

K平均法でクラスタリングを行おうとしていますが、クラスタリングのパフォーマンスを測定したいと思います。私は専門家ではありませんが、クラスタリングについてもっと学びたいと思っています。

ここに私のコードがあります:

import pandas as pd
from sklearn import datasets

#loading the dataset
iris = datasets.load_iris()
df = pd.DataFrame(iris.data)

#K-Means
from sklearn import cluster
k_means = cluster.KMeans(n_clusters=3)
k_means.fit(df) #K-means training
y_pred = k_means.predict(df)

#We store the K-means results in a dataframe
pred = pd.DataFrame(y_pred)
pred.columns = ['Species']

#we merge this dataframe with df
prediction = pd.concat([df,pred], axis = 1)

#We store the clusters
clus0 = prediction.loc[prediction.Species == 0]
clus1 = prediction.loc[prediction.Species == 1]
clus2 = prediction.loc[prediction.Species == 2]
k_list = [clus0.values, clus1.values,clus2.values]

KMeansと3つのクラスターが保存されたので、 Dunn Index を使用してクラスタリングのパフォーマンスを測定しようとしています(より大きなインデックスを探します)そのためにjqm_cvi package(利用可能 ここ

from jqmcvi import base
base.dunn(k_list)

私の質問は次のとおりです。ScikitLearnにはクラスタリング内部評価が既に存在しますか(silhouette_scoreを除く)。または、別の有名なライブラリにありますか?

お時間をありがとう

13

通常、クラスタリングは監視なしの方法と見なされるため、優れたパフォーマンスメトリックを確立することは困難です(以前のコメントでも提案されています)。

それでも、これらのアルゴリズムから多くの有用な情報を推定することができます(例:k-means)。問題は、各クラスターにセマンティクスを割り当て、アルゴリズムの「パフォーマンス」を測定する方法です。多くの場合、続行する良い方法は、クラスターを視覚化することです。明らかに、多くの場合に起こるように、データに高次元の特徴がある場合、視覚化はそれほど簡単ではありません。 k-meansと別のクラスタリングアルゴリズムを使用して、2つの方法を提案します。

  • K-mean:この場合、たとえば [〜#〜] pca [〜 #〜] 。このようなアルゴリズムを使用すると、2Dプロットでデータをプロットし、クラスターを視覚化できます。ただし、このプロットに表示されるのはデータの2D空間への投影なので、あまり正確ではない場合がありますが、クラスターがどのように分布しているかはわかります。

  • 自己組織化マップこれは、ニューラルネットワークに基づいたクラスタリングアルゴリズムであり、マップと呼ばれるトレーニングサンプルの入力空間の離散化された表現を作成します。したがって、次元削減を行う方法です( [〜#〜] som [〜#〜] )。このアルゴリズムを実装し、結果を視覚化する簡単な方法を持っている somocl という非常に素晴らしいpythonパッケージを見つけることができます。このアルゴリズムはクラスタリングにも非常に適していますクラスターの数をアプリオリに選択する必要はありません(kの意味では、kを選択する必要があります。

2
Andrea Madotto

シルエットスコアとは別に、エルボー基準を使用してK平均クラスタリングを評価できます。 Scikit-Learnの関数/メソッドとしては使用できません。 Elbow Criterionを使用してK-Meansクラスタリングを評価するには、SSEを計算する必要があります。

エルボ基準法の考え方は、SSEが急激に減少するk(クラスタなし)を選択することです。SSEはクラスターの各メンバーとその重心間の距離の2乗の合計として定義されます。

kの各値の2乗誤差(SSE)の合計を計算します。ここで、kno. of clusterであり、折れ線グラフをプロットします。 SSEは、kを増やすと0に向かって減少する傾向があります(kがデータセット内のデータポイントの数に等しい場合、各データポイントは独自のクラスターであるため、クラスターの中心との間にエラーはありません)。

そのため、目標は、まだlow SSEを保持しているkの小さな値を選択することであり、通常、エルボーは、kを増やすことでリターンが減少し始める場所を表します。

虹彩データセットの例:

import pandas as pd
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

iris = load_iris()
X = pd.DataFrame(iris.data, columns=iris['feature_names'])
#print(X)
data = X[['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)']]

sse = {}
for k in range(1, 10):
    kmeans = KMeans(n_clusters=k, max_iter=1000).fit(data)
    data["clusters"] = kmeans.labels_
    #print(data["clusters"])
    sse[k] = kmeans.inertia_ # Inertia: Sum of distances of samples to their closest cluster center
plt.figure()
plt.plot(list(sse.keys()), list(sse.values()))
plt.xlabel("Number of cluster")
plt.ylabel("SSE")
plt.show()

enter image description here

折れ線グラフが腕のように見える場合-折れ線グラフの上の赤い円(角度など)、腕の「肘」はoptimal k(クラスターの数)の値です。折れ線グラフの上記の肘によると、最適なクラスターの数は3です。

注:肘基準は本質的にヒューリスティックであり、データセットに対して機能しない場合があります。データセットと解決しようとしている問題に応じて直感に従ってください。

それが役に立てば幸い!

1
Om Prakash

あなたが言ったように、scikit-learnにはSilhouette CoefficientとCalinski-Harabaz Indexのみが存在します。 Dunnインデックスの場合、 this または this リンク。

0
Hadij