(あなたの場合のように)真のラベルが事前にわからない場合は、K-Means clustering
エルボー基準またはシルエット係数のいずれかを使用して評価できます。
エルボー基準法:
エルボー法の背後にある考え方は、k の値の範囲 (num_clusters
たとえば、k=1 から 10) に対して、指定されたデータセットで k-means クラスタリングを実行し、k の各値に対して、二乗誤差 (SSE) の合計を計算することです。
その後、k の値ごとに SSE の折れ線グラフをプロットします。折れ線グラフが腕のように見える場合 (下の折れ線グラフの赤い円 (角度のように))、腕の「肘」は最適な k (クラスターの数) の値です。ここでは、SSE を最小限に抑えたいと考えています。SSE は、k を増やすと 0 に向かって減少する傾向があります (k がデータセット内のデータ ポイントの数と等しい場合、SSE は 0 です。これは、各データ ポイントが独自のクラスターであり、データ ポイントとデータの中心との間に誤差がないためです)。そのクラスター)。
したがって、目標は、small value of k
まだ SSE が低い a を選択することです。エルボーは、通常、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()
上記のコードのプロット:

プロットを見ると、3 が虹彩データセットの最適なクラスター数 (赤で囲まれた部分) であり、これは実際に正しいものです。
シルエット係数法:
sklearn のドキュメントから、
より高いシルエット係数スコアは、より適切に定義されたクラスターを持つモデルに関連しています。シルエット係数はサンプルごとに定義され、次の 2 つのスコアで構成されます。
a: サンプルと同じクラス内の他のすべてのポイントとの間の平均距離。
b: サンプルと次に近いクラスター内の他のすべてのポイントとの間の平均距離。
単一のサンプルに対するシルエット係数は、次のように与えられます。
%7D)
k
ここで、 forの最適値を見つけるためにKMeans
、 n_clusters の 1..n をループしKMeans
、各サンプルのシルエット係数を計算します。
シルエット係数が高いほど、オブジェクトがそれ自体のクラスターとよく一致し、隣接するクラスターとの一致が不十分であることを示します。
from sklearn.metrics import silhouette_score
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
X = load_iris().data
y = load_iris().target
for n_cluster in range(2, 11):
kmeans = KMeans(n_clusters=n_cluster).fit(X)
label = kmeans.labels_
sil_coeff = silhouette_score(X, label, metric='euclidean')
print("For n_clusters={}, The Silhouette Coefficient is {}".format(n_cluster, sil_coeff))
出力 -
n_clusters=2 の場合、シルエット係数は 0.680813620271
n_clusters=3 の場合、シルエット係数は 0.552591944521
n_clusters=4 の場合、シルエット係数は 0.496992849949
n_clusters=5 の場合、
シルエット係数は 0.488517550854
n_clusters=7 の場合、シルエット係数は 0.356303270516
n_clusters=8 の場合、シルエット係数は 0.365164535737
n_clusters=9 の場合、シルエット係数は 0.346583642095
n_clusters=10 の場合、シルエット係数は 0.328266088778
ご覧のとおり、n_clusters=2のシルエット係数が最も高くなります。これは、2 が最適なクラスター数であることを意味しますね。
しかし、ここに問題があります。
アイリスのデータセットには 3 種類の花があり、最適なクラスター数の 2 と矛盾しています。したがって、n_clusters=2が最も高いシルエット係数を持っているにもかかわらず、 n_clusters=3を最適なクラスター数と見なします -
- アイリス データセットには 3 つの種があります。(最も重要な)
- n_clusters=2は、シルエット係数の 2 番目に高い値を持ちます。
したがって、n_clusters=3を選択するのが最適な数です。虹彩データセットのクラスターの。
最適な番号を選択します。クラスターの数は、データセットの種類と解決しようとしている問題によって異なります。しかし、ほとんどの場合、最高のシルエット係数を使用すると、最適な数のクラスターが得られます。
それが役に立てば幸い!