根据排序的cluster_centers _

时间:2016-05-26 01:32:06

标签: python python-3.x pandas scikit-learn k-means

我正在使用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))

感谢您的帮助。

1 个答案:

答案 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)