我正在使用KMeans在基于一列cards
的数据集中聚集记录,这是一个int。但是,返回的群集标签是以非直观的顺序(由于它是无监督的算法,因此是预期的。)
为了让我的同事更容易理解输出,我想将标签重新映射到cluster_centers_
的顺序。
我创建了一个DataFrame,其中index
是KMeans生成的标签,set_size
是预期的新标签(已经在min
列上排序),但我被困在这个难题的最后一站。
如何将cluster_df['set_size']
值重新映射到all_sets_df['set_size']
的{{1}}?
我尝试过应用,lambda,map,使用dict的变体,但由于某种原因,我得到np.nan的2/3结果(如果它可以工作)。我觉得这很明显,但由于某种原因,我无法让它发挥作用。
all_sets_df['cluster'] == cluster_df['index']
输出:
# 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))
感谢您的帮助。
答案 0 :(得分:1)
我需要更改行
_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表中的值时使用的实际数据帧索引与群集标签相同。此外,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)