【发布时间】:2016-09-23 19:50:14
【问题描述】:
我正在使用 KMeans 对基于一列 cards 的数据集中的记录进行聚类,该列是一个 int。但是,返回的集群标签的顺序并不直观(这是意料之中的,因为它是一种无监督算法)。
为了让我的同事更容易理解输出,我想将标签重新映射到 cluster_centers_ 的顺序。
我创建了一个 DataFrame,其中 index 是 KMeans 生成的标签,set_size 是预期的新标签(已在 min 列上排序),但我被困在拼图的最后一站。
如何将 cluster_df['set_size'] 值重新映射到 all_sets_df['set_size'] 其中 all_sets_df['cluster'] == cluster_df['index']?
我已经尝试过使用 dict 对 apply、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 all_sets_df['set_size'] = all_sets_df['cluster'].map(_f)但它返回的集群标签与我开始时相同。
标签: python python-3.x pandas scikit-learn k-means