对集群使用不同的扩展策略的影响

数据挖掘 Python scikit-学习 k-均值
2021-10-07 02:53:22

我目前正在学习集群。为了练习聚类,我使用了这个数据集

在对 k 的多个值运行 K-means 聚类并绘制结果之后,我可以看到缩放正在影响结果(在集群 SSE 内),我想用这篇文章来确认我对为什么会这样的直觉。

我不认为这是集群内 SSE 的有意义的减少,因为数值距离对比例很敏感,而且我认为这对模型的准确性没有任何影响。这种直觉正确吗?

我只是没想到标准化和规范化之间的减少会如此剧烈。

代码和结果

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('customers.csv')
X = df.iloc[:, [3, 4]].to_numpy()

from sklearn.preprocessing import StandardScaler, MinMaxScaler
ssc, mmsc = StandardScaler(), MinMaxScaler()
X_ssc = ssc.fit_transform(X)
X_mmsc = mmsc.fit_transform(X)

from sklearn.cluster import KMeans
# Unscaled
k_vals = list(range(2, 21))
WCSSE = []
for k in k_vals:
    kmeans = KMeans(n_clusters=k)
    model = kmeans.fit(X)
    WCSSE.append(model.inertia_)
plt.plot(WCSSE, marker='o', markersize=10)

# Standard Scaler
k_vals = list(range(2, 21))
WCSSE = []
for k in k_vals:
    kmeans = KMeans(n_clusters=k)
    model = kmeans.fit(X_ssc)
    WCSSE.append(model.inertia_)
plt.plot(WCSSE, marker='o', markersize=10)

# MinMax scaler
k_vals = list(range(2, 21))
WCSSE = []
for k in k_vals:
    kmeans = KMeans(n_clusters=k)
    model = kmeans.fit(X_mmsc)
    WCSSE.append(model.inertia_)
plt.plot(WCSSE, marker='o', markersize=10)

在此处输入图像描述

2个回答

欢迎来到社区!

可能有帮助的几点:

  • 聚类作为一项无监督任务,无法评估,通常使用一些外部标准来找到最佳聚类。
  • 根据上述观点,最好尽可能直接地做出这些假设。从 EDA 开始(检查直方图、绘制箱线图等)可为您提供更好的分析初始点。试图直接从 WSCC 的减少中理解数据的底层结构对我来说似乎非常间接,因此更加困难。例如,一个简单的 EDA 会告诉您数据是否需要紧急扩展。特别是在您的数据中,范围并没有“显着”不同,但是如果您看到直方图,您可能会看到,例如,需要对数变换而不是缩放的指数特征。
  • 最后但并非最不重要的一点是,集群数量越多,WCSS 就越小。你在情节中看到它。所以问题是这三个缩放是否在 WCSS 的下降点上显示出显着差异,而他们没有,并且增强了缩放不是这里最大帮助的想法。否则你的代码是非常正确的(并且写得很好;))

我希望它可以在一定程度上有所帮助。

这种直觉是否正确


集群质量没有改善。这三个都是一样的,应该是这样的
我们可以很容易地观察到所有 3 个集群都在 2.5 处形成肘部。甚至 3 个地块的所有其他方面都完全相同。

聚类内平方和 (WCSS)测量聚类内所有点到聚类中心的平方平均距离。它是聚类内每个点到质心的平均距离。该指标不涉及比率(即消除规模的影响),因此它肯定取决于空间大小以及集群的数量。
将您的空间成像为地球大小,然后将其标准化以使其具有足球大小,然后将其变得更小,即使用标准化的高尔夫球。

我只是没想到标准化和规范化之间的减少会如此剧烈。

显然,在标准化的情况下,平均距离将减少标准偏差的比例,而在标准化的情况下,“最大值”的比例会降低。有大的异常值会产生更大的影响。

使用相同的逻辑,我们可以看到指标也随着集群的数量而减少。更多的集群意味着每个集群更接近其 Centrod,因此 SSE 更小。这就是为什么它不是一个很好的指标。

您可以尝试计算 轮廓分数,它结合了 3 个案例的凝聚力和分离度

from sklearn.metrics import silhouette_score
silhouette_score(X, kmeans.labels_)

参考