根据排序 cluster_centers_ 重新映射 kmeans labels_

Remap kmeans labels_ based on sorted cluster_centers_

我正在使用 KMeans 基于一列 cards 对数据集中的记录进行聚类,这是一个整数。但是,返回的集群标签的顺序不直观(这是预期的,因为它是一种无监督算法)。

为了让我的同事更容易理解输出,我想将标签重新映射到 cluster_centers_ 的顺序。

我创建了一个 DataFrame,其中 index 是 KMeans 生成的标签,set_size 是预期的新标签(已在 min 列排序),但我卡住了在拼图的最后一站。

如何将 cluster_df['set_size'] 值重新映射到 all_sets_df['set_size'],其中 all_sets_df['cluster'] == cluster_df['index']

我尝试了应用、lambda、map 的变体,使用字典,但出于某种原因,我在 2/3 的结果中得到了 np.nan(如果它有效的话)。我觉得这很明显,但出于某种原因我无法让它发挥作用。

# Assign optimal clusters to all_sets_df.set_size column

print('Assigning sets to clusters...', end='')
X = all_sets_df.cards.reshape(-1, 1)

n_clusters = 3

km = KMeans(n_clusters=n_clusters, init='k-means++', n_init=10)

all_sets_df['cluster'] = km.fit_predict(X)

cluster_df = pd.DataFrame.from_dict(
    {_i: {'set_size': _i, 
          'min': all_sets_df.cards[all_sets_df.cluster == _i].min(), 
          'max': all_sets_df.cards[all_sets_df.cluster == _i].max()}
    for _i in range(n_clusters)}, 
    orient='index').sort_values(by='min').reset_index()

cluster_df['set_size'] = range(len(cluster_df.set_size))

print('done.\n')

print(cluster_df.ix[:, ['index', 'set_size', 'min', 'max']].to_string(index=False))

输出:

Assigning sets to clusters...done.

index  set_size  min  max
    2         0    1  100
    0         1  113  230
    1         2  244  449

感谢您的帮助。

我需要换行

_f = lambda x: cluster_df['set_size'][cluster_df.index == x].values

_f = lambda x: cluster_df['set_size'][cluster_df['index'] == x].values[0]

因为它使用的是实际数据帧索引,当映射来自 cluster_df table 的值时,该索引与集群标签相同。此外,lambda 函数返回的值是长度为 1 的列表,因此需要将 [0] 添加到函数的末尾。

这是对我有用的最终代码块。

_f = lambda x: cluster_df['set_size'][cluster_df['index'] == x].values[0]
all_sets_df['set_size'] = all_sets_df['cluster'].map(_f)
all_sets_df = all_sets_df.drop('cluster', axis=1)