使用 K-means 将价格分组
Divide price into groups by using K-means
有一项任务是将产品价格分为 3 组{high, avg, low} 价格组。已尝试使用 sklearn 包通过 K-means 实现它。数据是 pandas float64 类型的 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
可能您的数据分布已经倾斜。 K-means 最小化平方误差;它不关心平衡的集群。
此外,k-means 不会产生 "low" 或 "high" - 您需要自己分配此类语义。您不能假设集群 2 是 "high".
可能值得查看数据的直方图,然后根据您的需要定义 "low" 和 "high" 的阈值。
有一项任务是将产品价格分为 3 组{high, avg, low} 价格组。已尝试使用 sklearn 包通过 K-means 实现它。数据是 pandas float64 类型的 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
可能您的数据分布已经倾斜。 K-means 最小化平方误差;它不关心平衡的集群。
此外,k-means 不会产生 "low" 或 "high" - 您需要自己分配此类语义。您不能假设集群 2 是 "high".
可能值得查看数据的直方图,然后根据您的需要定义 "low" 和 "high" 的阈值。