首页 > 解决方案 > 将 KMeans 集群中心映射到原始数据帧

问题描述

我从 SKL 的 KMeans 算法中理解 cluster_centers_ 属性的方式是,这些本质上是由算法计算的数据点,以便它最小化分配给同一集群的所有其他数据点的距离总和。

现在,在我的例子中 cluster_centers_ 返回一个 4x13 数组。到目前为止,一切都很好。

In [102]: k_means.cluster_centers_

Out[102]: array([[ 4.78931977e-01,  4.90762118e-01,  4.45716436e-01,
     4.06958828e-01,  1.75669885e-01,  7.20500999e-01,
     1.00000000e+00,  4.67334062e-01,  7.62096965e-01,
     3.26627062e-01,  1.11299030e-01,  1.00000000e+00,
     3.38983051e-03],
   [ 2.56178744e-01,  6.31538163e-01,  6.35222200e-01,
     5.50653164e-01,  1.95449906e-01,  8.42033556e-01,
    -8.28226376e-14,  4.86866204e-01,  7.88197801e-01,
     4.63464418e-01,  1.07503725e-01,  9.65338920e-14,
     8.80867977e-03],
   [ 3.00150863e-01,  6.07788520e-01,  6.05935644e-01,
     4.35146301e-01,  1.95530922e-01,  8.38422087e-01,
     1.00000000e+00,  4.89682837e-01,  7.78838601e-01,
     4.75986892e-01,  1.07519045e-01, -3.79418719e-14,
     9.14063961e-03],
   [ 4.27285065e-01,  5.13167435e-01,  5.00494859e-01,
     5.48965002e-01,  1.86222531e-01,  7.40201080e-01,
    -8.29336599e-14,  4.71366946e-01,  7.67300469e-01,
     3.33472857e-01,  1.12865093e-01,  1.00000000e+00,
     1.87793427e-03]])

作为下一步,我想将正确的列名分配给集群中心值,因为仅数组并不能告诉我太多。

但是,当我尝试使用以下代码创建一个新数据框并根据原始数据框分配列名时,我可以清楚地看到列与 cluster_centers_ 数组中的值不匹配(我与原始数据框)。

centers = pd.DataFrame(k_means.cluster_centers_)
df_centers = pd.DataFrame(centers, columns= df.columns)

看起来 cluster_centers_ 返回的数组与原始数据帧的特征顺序不同。

知道如何从 cluster_centers_ 映射数组,使其与用于聚类的原始数据帧的顺序/结构相匹配吗?

PS:我在这个过程中做了一些标准化,但也把它倒过来了,所以这不应该是问题。

按照评论中的要求发布拟合/预测部分

k_means.fit(df)
y_pred = k_means.predict(df)

编辑:我搞砸了

在我的笔记本中进行了一些挖掘后,我发现了问题:

所以我的机器学习过程是这样的

因此,当我执行 MinMaxScaler 的 inverse_transform 方法时,它仍在使用旧的特征顺序(在我将它与我的二值化事物搞砸之前)。

标签: pythonscikit-learnk-means

解决方案


您确定它正在反转功能的顺序吗?

由于您没有提供最小的工作示例,因此无法检查您的代码,但我只是尝试了这个:

from sklearn.cluster import KMeans
import numpy as np
X = np.array([[0, 1], [2, 3]])
for i in range(100):
    kmeans = KMeans(n_clusters=2, random_state=i).fit(X)
    print(kmeans.cluster_centers_)

并且每次都保留了特征的顺序。


推荐阅读