【问题标题】:Remap kmeans labels_ based on sorted cluster_centers_基于排序的 cluster_centers_ 重新映射 kmeans labels_
【发布时间】: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


【解决方案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)

【讨论】:

    猜你喜欢
    • 2012-06-10
    • 2020-06-17
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多