根据排序 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)
我正在使用 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)