【问题标题】:Divide price into groups by using K-means使用 K-means 将价格分组
【发布时间】:2018-12-26 07:51:26
【问题描述】:

有一项任务是将产品价格分成 3 组 {high, avg, low} 价格组。尝试使用 sklearn 包通过 K-means 实现它。数据为float64类型的pandas Dataframe格式

dfcl
Out[173]:
                price
product_option_id   
    10012|0 372.15
    10048|0 11.30
    10049|0 12.26
    10050|0 6.20
    10051|0 5.90
    10052|0 9.00
    10053|0 11.10
    10054|0 9.30
    10055|0 4.20
    10056|0 5.60


# Convert DataFrame to matrix
mat = dfcl.as_matrix()
# Using sklearn
km = sklearn.cluster.KMeans(n_clusters=3)
km.fit(mat)
# Get cluster assignment labels
labels = km.labels_
# Format results as a DataFrame
results = pd.DataFrame(data=labels, columns=['cluster'], index=dfcl.index)

已经得到结果,但组之间似乎很不平衡

print('Total features -', len(results))
print('Cluster 0 -',len(results.loc[results['cluster'] == 0]))
print('Cluster 1 -',len(results.loc[results['cluster'] == 1]))
print('Cluster 2 -',len(results.loc[results['cluster'] == 2]))

Total features - 5222
Cluster 0 - 4470
Cluster 1 - 733
Cluster 2 - 19

顺便说一下,当我重新计算拟合数据时,有时会发生数据在集群之间高度交换的情况。有没有办法解决组之间数据如此不平衡的问题,并使集群名称保持静态以重新计算算法?我也尝试过使用preprocessing.MinMaxScaler() 规范化数据,但没有帮助。 也许有一些集群算法可以帮助我做我想做的事或任何其他黑客?

Total features - 5222
Cluster 0 - 733
Cluster 1 - 4470
Cluster 2 - 19

【问题讨论】:

  • 这里显示的第一个和第二个拟合的输出是相同的。与以前一样制作相同的集群。只是集群的标签发生了变化。集群的标签是什么并不重要,因为集群是一项无监督的任务。重要的是相同的点应该在这些集群中。因此,您可以检查第一次拟合中集群 0 中的 4470 个点与第二次拟合中集群 1 中的 4470 个点相同。
  • 是的,有相同的点。产品 10012|0 372.15 没有进入高集群,即使价格如此巨大。即使它们与聚类中心的距离不远,我如何调整算法以注意到这些异常值?
  • 您是否检查过每个集群中积分的最高和最低价格?你观察到了什么。手动为集群分配范围不是更好吗?

标签: python-3.x pandas scikit-learn cluster-analysis


【解决方案1】:

您的数据分布可能已经出现偏差。 K-means 最小化平方误差;它不关心平衡集群。

此外,k-means 不会产生“低”或“高”——您需要自己分配这样的语义。您不能假设集群 2 是“高”。

可能值得查看数据的直方图,然后根据您的需要定义“低”和“高”的阈值。

【讨论】:

    猜你喜欢
    • 2021-09-14
    • 2017-05-17
    • 2017-05-29
    • 2018-02-27
    • 1970-01-01
    • 2011-06-10
    • 2017-01-29
    • 2021-11-25
    • 1970-01-01
    相关资源
    最近更新 更多