簡體   English   中英

ValueError: Number of labels is 1. 有效值為 2 到 n_samples - 1 (inclusive) 當使用剪影_score

[英]ValueError: Number of labels is 1. Valid values are 2 to n_samples - 1 (inclusive) when using silhouette_score

我正在嘗試計算silhouette score因為我找到了要創建的最佳聚類數,但收到一條錯誤消息:

ValueError: Number of labels is 1. Valid values are 2 to n_samples - 1 (inclusive)

我無法理解這樣做的原因。 這是我用來聚類和計算silhouette score

我閱讀了包含要聚類的文本的 csv,並對n聚類值運行K-Means 我收到此錯誤的原因可能是什么?

  #Create cluster using K-Means
#Only creates graph
import matplotlib
#matplotlib.use('Agg')
import re
import os
import nltk, math, codecs
import csv
from nltk.corpus import stopwords
from gensim.models import Doc2Vec
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.metrics import silhouette_score

model_name = checkpoint_save_path
loaded_model = Doc2Vec.load(model_name)

#Load the test csv file
data = pd.read_csv(test_filename)
overview = data['overview'].astype('str').tolist()
overview = filter(bool, overview)
vectors = []

def split_words(text):
  return ''.join([x if x.isalnum() or x.isspace() else " " for x in text ]).split()

def preprocess_document(text):
  sp_words = split_words(text)
  return sp_words

for i, t in enumerate(overview):
  vectors.append(loaded_model.infer_vector(preprocess_document(t)))

sse = {}
silhouette = {}


for k in range(1,15):
  km = KMeans(n_clusters=k, max_iter=1000, verbose = 0).fit(vectors)
  sse[k] = km.inertia_
  #FOLLOWING LINE CAUSES ERROR
  silhouette[k] = silhouette_score(vectors, km.labels_, metric='euclidean')

best_cluster_size = 1
min_error = float("inf")

for cluster_size in sse:
    if sse[cluster_size] < min_error:
        min_error = sse[cluster_size]
        best_cluster_size = cluster_size

print(sse)
print("====")
print(silhouette)

產生錯誤是因為您有不同數量的集群n的循環。 在第一次迭代期間, n_clusters1這導致all(km.labels_ == 0)True

換句話說,您只有一個標簽為 0 的集群(因此, np.unique(km.labels_)打印array([0], dtype=int32) )。


silhouette_score需要 1 個以上的簇標簽 這會導致錯誤。 錯誤信息很清楚。


例子:

from sklearn import datasets
from sklearn.cluster import KMeans
import numpy as np

iris = datasets.load_iris()
X = iris.data
y = iris.target

km = KMeans(n_clusters=3)
km.fit(X,y)

# check how many unique labels do you have
np.unique(km.labels_)
#array([0, 1, 2], dtype=int32)

我們有 3 個不同的集群/集群標簽。

silhouette_score(X, km.labels_, metric='euclidean')
0.38788915189699597

該功能工作正常。


現在,讓我們導致錯誤:

km2 = KMeans(n_clusters=1)
km2.fit(X,y)

silhouette_score(X, km2.labels_, metric='euclidean')
 ValueError: Number of labels is 1. Valid values are 2 to n_samples - 1 (inclusive)

從文檔中,

請注意,僅當標簽數量為 2 <= n_labels <= n_samples - 1 時才定義輪廓系數

因此,解決此問題的一種方法是不要使用for k in range(1,15) ,而是嘗試從 k = 2 開始迭代,即for k in range(2,15) 這對我行得通。

嘗試更改 min_samples 以及算法和指標。

用於有效的指標和算法列表。 sklearn.neighbors.VALID_METRICS

嘗試增加您的 eps 值。 我也遇到了同樣的錯誤,但是當我選擇更高的 eps 值時,錯誤消失了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM